From accc88b0fed0f2481cf00eeca34316a3ee1cae56 Mon Sep 17 00:00:00 2001 From: yurygoru Date: Fri, 18 Oct 2019 13:24:09 +0000 Subject: [PATCH 001/188] add video stream feature --- .vscode/settings.json | 2 +- cvat-core/src/frames.js | 144 +- cvat-core/src/server-proxy.js | 8 +- cvat-core/src/session.js | 59 +- cvat-data/.eslintignore | 1 + cvat-data/.eslintrc.js | 36 + cvat-data/README.md | 7 + cvat-data/package-lock.json | 10561 ++++++++ cvat-data/package.json | 37 + cvat-data/src/js/3rdparty/README.md | 42 + cvat-data/src/js/3rdparty/buffer.js | 198 + cvat-data/src/js/3rdparty/decoder.js | 112 + cvat-data/src/js/3rdparty/jsmpeg.js | 93 + cvat-data/src/js/3rdparty/mpeg1.js | 1689 ++ cvat-data/src/js/3rdparty/ts.js | 230 + cvat-data/src/js/3rdparty_patch.diff | 361 + cvat-data/src/js/cvat-data.js | 152 + cvat-data/src/js/decode_video.js | 107 + cvat-data/src/js/jsmpeg.js | 16 + cvat-data/src/js/pttjpeg.js | 1408 ++ cvat-data/src/js/unzip_imgs.js | 41 + cvat-data/webpack.config.js | 73 + cvat/apps/engine/annotation.py | 47 +- cvat/apps/engine/frame_provider.py | 40 + cvat/apps/engine/media_extractors.py | 273 +- .../migrations/0020_remove_task_flipped.py | 45 +- .../migrations/0022_auto_20191004_0817.py | 38 - .../migrations/0022_task_data_chunk_size.py | 18 + cvat/apps/engine/models.py | 36 +- cvat/apps/engine/serializers.py | 34 +- .../engine/static/engine/js/annotationUI.js | 5 +- .../engine/static/engine/js/cvat-core.min.js | 19823 +++++++++++++++- .../engine/static/engine/js/cvat-data.min.js | 834 + .../engine/static/engine/js/decode_video.js | 965 + cvat/apps/engine/static/engine/js/player.js | 268 +- .../engine/static/engine/js/unzip_imgs.js | 1319 + cvat/apps/engine/static/engine/stylesheet.css | 7 + cvat/apps/engine/task.py | 140 +- .../engine/templates/engine/annotation.html | 2 + cvat/apps/engine/urls.py | 1 - cvat/apps/engine/views.py | 169 +- 41 files changed, 38763 insertions(+), 678 deletions(-) create mode 100644 cvat-data/.eslintignore create mode 100644 cvat-data/.eslintrc.js create mode 100644 cvat-data/README.md create mode 100644 cvat-data/package-lock.json create mode 100644 cvat-data/package.json create mode 100644 cvat-data/src/js/3rdparty/README.md create mode 100644 cvat-data/src/js/3rdparty/buffer.js create mode 100644 cvat-data/src/js/3rdparty/decoder.js create mode 100644 cvat-data/src/js/3rdparty/jsmpeg.js create mode 100644 cvat-data/src/js/3rdparty/mpeg1.js create mode 100644 cvat-data/src/js/3rdparty/ts.js create mode 100644 cvat-data/src/js/3rdparty_patch.diff create mode 100755 cvat-data/src/js/cvat-data.js create mode 100644 cvat-data/src/js/decode_video.js create mode 100644 cvat-data/src/js/jsmpeg.js create mode 100644 cvat-data/src/js/pttjpeg.js create mode 100644 cvat-data/src/js/unzip_imgs.js create mode 100644 cvat-data/webpack.config.js create mode 100644 cvat/apps/engine/frame_provider.py delete mode 100644 cvat/apps/engine/migrations/0022_auto_20191004_0817.py create mode 100644 cvat/apps/engine/migrations/0022_task_data_chunk_size.py create mode 100644 cvat/apps/engine/static/engine/js/cvat-data.min.js create mode 100644 cvat/apps/engine/static/engine/js/decode_video.js create mode 100644 cvat/apps/engine/static/engine/js/unzip_imgs.js diff --git a/.vscode/settings.json b/.vscode/settings.json index 971c0a063eec..dd65369074e8 100644 --- a/.vscode/settings.json +++ b/.vscode/settings.json @@ -1,5 +1,5 @@ { - "python.pythonPath": ".env/bin/python", + "python.pythonPath": "/usr/bin/python3.6", "eslint.enable": true, "eslint.validate": [ "javascript", diff --git a/cvat-core/src/frames.js b/cvat-core/src/frames.js index 7778077e5b22..0c78be6bf2ea 100644 --- a/cvat-core/src/frames.js +++ b/cvat-core/src/frames.js @@ -9,14 +9,18 @@ */ (() => { + const cvatData = require('../../cvat-data'); const PluginRegistry = require('./plugins'); const serverProxy = require('./server-proxy'); - const { ArgumentError } = require('./exceptions'); - const { isBrowser, isNode } = require('browser-or-node'); + const { + Exception, + ArgumentError, + } = require('./exceptions'); // This is the frames storage const frameDataCache = {}; const frameCache = {}; + let nextChunk = null; /** * Class provides meta information about specific frame and frame itself @@ -79,87 +83,101 @@ } FrameData.prototype.data.implementation = async function (onServerRequest) { - return new Promise(async (resolve, reject) => { + async function getFrameData(resolve, reject) { + function onDecode(provider, frameNumber) { + if (frameNumber === this.number) { + resolve(provider.frame(frameNumber)); + } + } + try { - if (this.number in frameCache[this.tid]) { - resolve(frameCache[this.tid][this.number]); + const { provider } = frameDataCache[this.tid]; + const { chunkSize } = frameDataCache[this.tid]; + const frame = provider.frame(this.number); + if (frame === null || frame === 'loading') { + onServerRequest(); + const start = parseInt(this.number / chunkSize, 10) * chunkSize; + const stop = (parseInt(this.number / chunkSize, 10) + 1) * chunkSize - 1; + const chunkNumber = Math.floor(this.number / chunkSize); + let chunk = null; + if (frame === null) { + chunk = await serverProxy.frames.getData(this.tid, chunkNumber); + + } + // if status is loading, a chunk has already been loaded + // and it is being decoded now + + try { + provider.startDecode(chunk, start, stop, onDecode.bind(this, provider)); + } catch (error) { + if (error.donePromise) { + try { + await error.donePromise; + provider.startDecode(chunk, start, + stop, onDecode.bind(this, provider)); + } catch (_) { + reject(this.number); + } + } + } } else { - onServerRequest(); - const frame = await serverProxy.frames.getData(this.tid, this.number); - - if (isNode) { - frameCache[this.tid][this.number] = global.Buffer.from(frame, 'binary').toString('base64'); - resolve(frameCache[this.tid][this.number]); - } else if (isBrowser) { - const reader = new FileReader(); - reader.onload = () => { - frameCache[this.tid][this.number] = reader.result; - resolve(frameCache[this.tid][this.number]); - }; - reader.readAsDataURL(frame); + if (this.number % chunkSize > 1){ + if (!provider.isNextChunkExists(this.number)){ + const nextChunkNumber = Math.floor(this.number / chunkSize) + 1; + provider.setReadyToLoading(nextChunkNumber); + serverProxy.frames.getData(this.tid, nextChunkNumber).then(nextChunk =>{ + provider.startDecode(nextChunk, (nextChunkNumber) * chunkSize, (nextChunkNumber + 1) * chunkSize - 1, function(){}); + }); + } } + resolve(frame); } } catch (exception) { - reject(exception); - } - }); - }; - - async function getPreview(taskID) { - return new Promise(async (resolve, reject) => { - try { - // Just go to server and get preview (no any cache) - const result = await serverProxy.frames.getPreview(taskID); - if (isNode) { - resolve(global.Buffer.from(result, 'binary').toString('base64')); - } else if (isBrowser) { - const reader = new FileReader(); - reader.onload = () => { - resolve(reader.result); - }; - reader.readAsDataURL(result); + if (exception instanceof Exception) { + reject(exception); + } else { + reject(new Exception(exception.message)); } - } catch (error) { - reject(error); } - }); - } + } + + return new Promise(getFrameData.bind(this)); + }; - async function getFrame(taskID, mode, frame) { + async function getFrame(taskID, chunkSize, mode, frame) { if (!(taskID in frameDataCache)) { - frameDataCache[taskID] = {}; - frameDataCache[taskID].meta = await serverProxy.frames.getMeta(taskID); + const blockType = mode === 'interpolation' ? cvatData.BlockType.TSVIDEO + : cvatData.BlockType.ARCHIVE; + + const value = { + meta: await serverProxy.frames.getMeta(taskID), + chunkSize, + provider: new cvatData.FrameProvider(3, blockType, chunkSize), + }; frameCache[taskID] = {}; + frameDataCache[taskID] = value; } - if (!(frame in frameDataCache[taskID])) { - let size = null; - if (mode === 'interpolation') { - [size] = frameDataCache[taskID].meta; - } else if (mode === 'annotation') { - if (frame >= frameDataCache[taskID].meta.length) { - throw new ArgumentError( - `Meta information about frame ${frame} can't be received from the server`, - ); - } else { - size = frameDataCache[taskID].meta[frame]; - } - } else { - throw new ArgumentError( - `Invalid mode is specified ${mode}`, - ); - } + let size = null; + [size] = frameDataCache[taskID].meta; + frameDataCache[taskID].provider.setRenderSize(size.width, size.height); + + return new FrameData(size.width, size.height, taskID, frame); + } - frameDataCache[taskID][frame] = new FrameData(size.width, size.height, taskID, frame); + function getRanges(taskID) { + if (!(taskID in frameDataCache)) { + return []; } - return frameDataCache[taskID][frame]; + return frameDataCache[taskID].provider.cachedFrames; } + module.exports = { FrameData, getFrame, - getPreview, + getRanges, }; })(); diff --git a/cvat-core/src/server-proxy.js b/cvat-core/src/server-proxy.js index 143cb8e16592..c20231d831d2 100644 --- a/cvat-core/src/server-proxy.js +++ b/cvat-core/src/server-proxy.js @@ -399,19 +399,19 @@ return response.data; } - async function getData(tid, frame) { + async function getData(tid, chunk) { const { backendAPI } = config; let response = null; try { - response = await Axios.get(`${backendAPI}/tasks/${tid}/frames/${frame}`, { + response = await Axios.get(`${backendAPI}/tasks/${tid}/frames/chunk/${chunk}`, { proxy: config.proxy, - responseType: 'blob', + responseType: 'arraybuffer', }); } catch (errorData) { throw generateError( errorData, - `Could not get frame ${frame} for the task ${tid} from the server`, + `Could not get chunk ${chunk} for the task ${tid} from the server`, ); } diff --git a/cvat-core/src/session.js b/cvat-core/src/session.js index 0245ead56371..fc343bc7376e 100644 --- a/cvat-core/src/session.js +++ b/cvat-core/src/session.js @@ -10,7 +10,7 @@ (() => { const PluginRegistry = require('./plugins'); const serverProxy = require('./server-proxy'); - const { getFrame, getPreview } = require('./frames'); + const { getFrame, getRanges} = require('./frames'); const { ArgumentError } = require('./exceptions'); const { TaskStatus } = require('./enums'); const { Label } = require('./labels'); @@ -109,9 +109,9 @@ .apiWrapper.call(this, prototype.frames.get, frame); return result; }, - async preview() { + async ranges() { const result = await PluginRegistry - .apiWrapper.call(this, prototype.frames.preview); + .apiWrapper.call(this, prototype.frames.ranges); return result; }, }, @@ -386,10 +386,10 @@ * @throws {module:API.cvat.exceptions.ArgumentError} */ /** - * Get the first frame of a task for preview - * @method preview + * Returns the ranges of cached frames + * @method ranges * @memberof Session.frames - * @returns {string} - jpeg encoded image + * @returns {module:API.cvat.classes.FrameData} * @instance * @async * @throws {module:API.cvat.exceptions.PluginError} @@ -635,7 +635,7 @@ this.frames = { get: Object.getPrototypeOf(this).frames.get.bind(this), - preview: Object.getPrototypeOf(this).frames.preview.bind(this), + ranges: Object.getPrototypeOf(this).frames.ranges.bind(this), }; } @@ -694,6 +694,7 @@ start_frame: undefined, stop_frame: undefined, frame_filter: undefined, + data_chunk_size: undefined, }; for (const property in data) { @@ -1116,6 +1117,18 @@ data.frame_filter = filter; }, }, + dataChunkSize: { + get: () => data.data_chunk_size, + set: (chunkSize) => { + if (typeof (chunkSize) !== 'number' || chunkSize < 1) { + throw new ArgumentError( + `Chink size value must be a positive number. But value ${chunkSize} has been got.`, + ); + } + + data.data_chunk_size = chunkSize; + }, + }, })); // When we call a function, for example: task.annotations.get() @@ -1139,7 +1152,7 @@ this.frames = { get: Object.getPrototypeOf(this).frames.get.bind(this), - preview: Object.getPrototypeOf(this).frames.preview.bind(this), + ranges: Object.getPrototypeOf(this).frames.ranges.bind(this), }; } @@ -1232,13 +1245,20 @@ ); } - const frameData = await getFrame(this.task.id, this.task.mode, frame); + const frameData = await getFrame( + this.task.id, + this.task.dataChunkSize, + this.task.mode, + frame, + ); return frameData; }; - Job.prototype.frames.preview.implementation = async function () { - const frameData = await getPreview(this.task.id); - return frameData; + Job.prototype.frames.ranges.implementation = async function () { + const rangesData = await getRanges( + this.task.id, + ); + return rangesData; }; // TODO: Check filter for annotations @@ -1377,13 +1397,20 @@ ); } - const result = await getFrame(this.id, this.mode, frame); + const result = await getFrame( + this.id, + this.dataChunkSize, + this.mode, + frame, + ); return result; }; - Task.prototype.frames.preview.implementation = async function () { - const frameData = await getPreview(this.id); - return frameData; + Task.prototype.frames.ranges.implementation = async function () { + const rangesData = await getRanges( + this.id, + ); + return rangesData; }; // TODO: Check filter for annotations diff --git a/cvat-data/.eslintignore b/cvat-data/.eslintignore new file mode 100644 index 000000000000..dbec63908d1f --- /dev/null +++ b/cvat-data/.eslintignore @@ -0,0 +1 @@ +**/3rdparty/*.js diff --git a/cvat-data/.eslintrc.js b/cvat-data/.eslintrc.js new file mode 100644 index 000000000000..0d4eb4408ca3 --- /dev/null +++ b/cvat-data/.eslintrc.js @@ -0,0 +1,36 @@ +/* +* Copyright (C) 2018 Intel Corporation +* +* SPDX-License-Identifier: MIT +*/ + +module.exports = { + "env": { + "node": false, + "browser": true, + "es6": true, + }, + "parserOptions": { + "parser": "babel-eslint", + "sourceType": "module", + "ecmaVersion": 2018, + }, + "plugins": [ + "security", + "no-unsanitized", + "no-unsafe-innerhtml", + ], + "extends": [ + "eslint:recommended", + "plugin:security/recommended", + "plugin:no-unsanitized/DOM", + "airbnb-base", + ], + "rules": { + "indent": ["warn", 4], + "no-underscore-dangle": ["error", { "allowAfterThis": true }], + "no-plusplus": [0], + "no-bitwise": [0], + "security/detect-object-injection": [0], + }, +}; diff --git a/cvat-data/README.md b/cvat-data/README.md new file mode 100644 index 000000000000..7a18298cdee4 --- /dev/null +++ b/cvat-data/README.md @@ -0,0 +1,7 @@ +# cvat-data module + +``` +npm run build # build with minification +npm run build -- --mode=development # build without minification +npm run server # run debug server +``` diff --git a/cvat-data/package-lock.json b/cvat-data/package-lock.json new file mode 100644 index 000000000000..166913d183ed --- /dev/null +++ b/cvat-data/package-lock.json @@ -0,0 +1,10561 @@ +{ + "name": "cvat-data", + "version": "0.1.0", + "lockfileVersion": 1, + "requires": true, + "dependencies": { + "@babel/cli": { + "version": "7.6.0", + "resolved": "https://registry.npmjs.org/@babel/cli/-/cli-7.6.0.tgz", + "integrity": "sha512-1CTDyGUjQqW3Mz4gfKZ04KGOckyyaNmKneAMlABPS+ZyuxWv3FrVEVz7Ag08kNIztVx8VaJ8YgvYLSNlMKAT5Q==", + "dev": true, + "requires": { + "chokidar": "^2.1.8", + "commander": "^2.8.1", + "convert-source-map": "^1.1.0", + "fs-readdir-recursive": "^1.1.0", + "glob": "^7.0.0", + "lodash": "^4.17.13", + "mkdirp": "^0.5.1", + "output-file-sync": "^2.0.0", + "slash": "^2.0.0", + "source-map": "^0.5.0" + } + }, + "@babel/code-frame": { + "version": "7.5.5", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.5.5.tgz", + "integrity": "sha512-27d4lZoomVyo51VegxI20xZPuSHusqbQag/ztrBC7wegWoQ1nLREPVSKSW8byhTlzTKyNE4ifaTA6lCp7JjpFw==", + "dev": true, + "requires": { + "@babel/highlight": "^7.0.0" + } + }, + "@babel/core": { + "version": "7.6.0", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.6.0.tgz", + "integrity": "sha512-FuRhDRtsd6IptKpHXAa+4WPZYY2ZzgowkbLBecEDDSje1X/apG7jQM33or3NdOmjXBKWGOg4JmSiRfUfuTtHXw==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.5.5", + "@babel/generator": "^7.6.0", + "@babel/helpers": "^7.6.0", + "@babel/parser": "^7.6.0", + "@babel/template": "^7.6.0", + "@babel/traverse": "^7.6.0", + "@babel/types": "^7.6.0", + "convert-source-map": "^1.1.0", + "debug": "^4.1.0", + "json5": "^2.1.0", + "lodash": "^4.17.13", + "resolve": "^1.3.2", + "semver": "^5.4.1", + "source-map": "^0.5.0" + }, + "dependencies": { + "debug": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", + "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", + "dev": true, + "requires": { + "ms": "^2.1.1" + } + }, + "ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "dev": true + } + } + }, + "@babel/generator": { + "version": "7.6.0", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.6.0.tgz", + "integrity": "sha512-Ms8Mo7YBdMMn1BYuNtKuP/z0TgEIhbcyB8HVR6PPNYp4P61lMsABiS4A3VG1qznjXVCf3r+fVHhm4efTYVsySA==", + "dev": true, + "requires": { + "@babel/types": "^7.6.0", + "jsesc": "^2.5.1", + "lodash": "^4.17.13", + "source-map": "^0.5.0", + "trim-right": "^1.0.1" + } + }, + "@babel/helper-annotate-as-pure": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.0.0.tgz", + "integrity": "sha512-3UYcJUj9kvSLbLbUIfQTqzcy5VX7GRZ/CCDrnOaZorFFM01aXp1+GJwuFGV4NDDoAS+mOUyHcO6UD/RfqOks3Q==", + "dev": true, + "requires": { + "@babel/types": "^7.0.0" + } + }, + "@babel/helper-builder-binary-assignment-operator-visitor": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.1.0.tgz", + "integrity": "sha512-qNSR4jrmJ8M1VMM9tibvyRAHXQs2PmaksQF7c1CGJNipfe3D8p+wgNwgso/P2A2r2mdgBWAXljNWR0QRZAMW8w==", + "dev": true, + "requires": { + "@babel/helper-explode-assignable-expression": "^7.1.0", + "@babel/types": "^7.0.0" + } + }, + "@babel/helper-call-delegate": { + "version": "7.4.4", + "resolved": "https://registry.npmjs.org/@babel/helper-call-delegate/-/helper-call-delegate-7.4.4.tgz", + "integrity": "sha512-l79boDFJ8S1c5hvQvG+rc+wHw6IuH7YldmRKsYtpbawsxURu/paVy57FZMomGK22/JckepaikOkY0MoAmdyOlQ==", + "dev": true, + "requires": { + "@babel/helper-hoist-variables": "^7.4.4", + "@babel/traverse": "^7.4.4", + "@babel/types": "^7.4.4" + } + }, + "@babel/helper-define-map": { + "version": "7.5.5", + "resolved": "https://registry.npmjs.org/@babel/helper-define-map/-/helper-define-map-7.5.5.tgz", + "integrity": "sha512-fTfxx7i0B5NJqvUOBBGREnrqbTxRh7zinBANpZXAVDlsZxYdclDp467G1sQ8VZYMnAURY3RpBUAgOYT9GfzHBg==", + "dev": true, + "requires": { + "@babel/helper-function-name": "^7.1.0", + "@babel/types": "^7.5.5", + "lodash": "^4.17.13" + } + }, + "@babel/helper-explode-assignable-expression": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/@babel/helper-explode-assignable-expression/-/helper-explode-assignable-expression-7.1.0.tgz", + "integrity": "sha512-NRQpfHrJ1msCHtKjbzs9YcMmJZOg6mQMmGRB+hbamEdG5PNpaSm95275VD92DvJKuyl0s2sFiDmMZ+EnnvufqA==", + "dev": true, + "requires": { + "@babel/traverse": "^7.1.0", + "@babel/types": "^7.0.0" + } + }, + "@babel/helper-function-name": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.1.0.tgz", + "integrity": "sha512-A95XEoCpb3TO+KZzJ4S/5uW5fNe26DjBGqf1o9ucyLyCmi1dXq/B3c8iaWTfBk3VvetUxl16e8tIrd5teOCfGw==", + "dev": true, + "requires": { + "@babel/helper-get-function-arity": "^7.0.0", + "@babel/template": "^7.1.0", + "@babel/types": "^7.0.0" + } + }, + "@babel/helper-get-function-arity": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.0.0.tgz", + "integrity": "sha512-r2DbJeg4svYvt3HOS74U4eWKsUAMRH01Z1ds1zx8KNTPtpTL5JAsdFv8BNyOpVqdFhHkkRDIg5B4AsxmkjAlmQ==", + "dev": true, + "requires": { + "@babel/types": "^7.0.0" + } + }, + "@babel/helper-hoist-variables": { + "version": "7.4.4", + "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.4.4.tgz", + "integrity": "sha512-VYk2/H/BnYbZDDg39hr3t2kKyifAm1W6zHRfhx8jGjIHpQEBv9dry7oQ2f3+J703TLu69nYdxsovl0XYfcnK4w==", + "dev": true, + "requires": { + "@babel/types": "^7.4.4" + } + }, + "@babel/helper-member-expression-to-functions": { + "version": "7.5.5", + "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.5.5.tgz", + "integrity": "sha512-5qZ3D1uMclSNqYcXqiHoA0meVdv+xUEex9em2fqMnrk/scphGlGgg66zjMrPJESPwrFJ6sbfFQYUSa0Mz7FabA==", + "dev": true, + "requires": { + "@babel/types": "^7.5.5" + } + }, + "@babel/helper-module-imports": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.0.0.tgz", + "integrity": "sha512-aP/hlLq01DWNEiDg4Jn23i+CXxW/owM4WpDLFUbpjxe4NS3BhLVZQ5i7E0ZrxuQ/vwekIeciyamgB1UIYxxM6A==", + "dev": true, + "requires": { + "@babel/types": "^7.0.0" + } + }, + "@babel/helper-module-transforms": { + "version": "7.5.5", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.5.5.tgz", + "integrity": "sha512-jBeCvETKuJqeiaCdyaheF40aXnnU1+wkSiUs/IQg3tB85up1LyL8x77ClY8qJpuRJUcXQo+ZtdNESmZl4j56Pw==", + "dev": true, + "requires": { + "@babel/helper-module-imports": "^7.0.0", + "@babel/helper-simple-access": "^7.1.0", + "@babel/helper-split-export-declaration": "^7.4.4", + "@babel/template": "^7.4.4", + "@babel/types": "^7.5.5", + "lodash": "^4.17.13" + } + }, + "@babel/helper-optimise-call-expression": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.0.0.tgz", + "integrity": "sha512-u8nd9NQePYNQV8iPWu/pLLYBqZBa4ZaY1YWRFMuxrid94wKI1QNt67NEZ7GAe5Kc/0LLScbim05xZFWkAdrj9g==", + "dev": true, + "requires": { + "@babel/types": "^7.0.0" + } + }, + "@babel/helper-plugin-utils": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.0.0.tgz", + "integrity": "sha512-CYAOUCARwExnEixLdB6sDm2dIJ/YgEAKDM1MOeMeZu9Ld/bDgVo8aiWrXwcY7OBh+1Ea2uUcVRcxKk0GJvW7QA==", + "dev": true + }, + "@babel/helper-regex": { + "version": "7.5.5", + "resolved": "https://registry.npmjs.org/@babel/helper-regex/-/helper-regex-7.5.5.tgz", + "integrity": "sha512-CkCYQLkfkiugbRDO8eZn6lRuR8kzZoGXCg3149iTk5se7g6qykSpy3+hELSwquhu+TgHn8nkLiBwHvNX8Hofcw==", + "dev": true, + "requires": { + "lodash": "^4.17.13" + } + }, + "@babel/helper-remap-async-to-generator": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.1.0.tgz", + "integrity": "sha512-3fOK0L+Fdlg8S5al8u/hWE6vhufGSn0bN09xm2LXMy//REAF8kDCrYoOBKYmA8m5Nom+sV9LyLCwrFynA8/slg==", + "dev": true, + "requires": { + "@babel/helper-annotate-as-pure": "^7.0.0", + "@babel/helper-wrap-function": "^7.1.0", + "@babel/template": "^7.1.0", + "@babel/traverse": "^7.1.0", + "@babel/types": "^7.0.0" + } + }, + "@babel/helper-replace-supers": { + "version": "7.5.5", + "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.5.5.tgz", + "integrity": "sha512-XvRFWrNnlsow2u7jXDuH4jDDctkxbS7gXssrP4q2nUD606ukXHRvydj346wmNg+zAgpFx4MWf4+usfC93bElJg==", + "dev": true, + "requires": { + "@babel/helper-member-expression-to-functions": "^7.5.5", + "@babel/helper-optimise-call-expression": "^7.0.0", + "@babel/traverse": "^7.5.5", + "@babel/types": "^7.5.5" + } + }, + "@babel/helper-simple-access": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.1.0.tgz", + "integrity": "sha512-Vk+78hNjRbsiu49zAPALxTb+JUQCz1aolpd8osOF16BGnLtseD21nbHgLPGUwrXEurZgiCOUmvs3ExTu4F5x6w==", + "dev": true, + "requires": { + "@babel/template": "^7.1.0", + "@babel/types": "^7.0.0" + } + }, + "@babel/helper-split-export-declaration": { + "version": "7.4.4", + "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.4.4.tgz", + "integrity": "sha512-Ro/XkzLf3JFITkW6b+hNxzZ1n5OQ80NvIUdmHspih1XAhtN3vPTuUFT4eQnela+2MaZ5ulH+iyP513KJrxbN7Q==", + "dev": true, + "requires": { + "@babel/types": "^7.4.4" + } + }, + "@babel/helper-wrap-function": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/@babel/helper-wrap-function/-/helper-wrap-function-7.2.0.tgz", + "integrity": "sha512-o9fP1BZLLSrYlxYEYyl2aS+Flun5gtjTIG8iln+XuEzQTs0PLagAGSXUcqruJwD5fM48jzIEggCKpIfWTcR7pQ==", + "dev": true, + "requires": { + "@babel/helper-function-name": "^7.1.0", + "@babel/template": "^7.1.0", + "@babel/traverse": "^7.1.0", + "@babel/types": "^7.2.0" + } + }, + "@babel/helpers": { + "version": "7.6.0", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.6.0.tgz", + "integrity": "sha512-W9kao7OBleOjfXtFGgArGRX6eCP0UEcA2ZWEWNkJdRZnHhW4eEbeswbG3EwaRsnQUAEGWYgMq1HsIXuNNNy2eQ==", + "dev": true, + "requires": { + "@babel/template": "^7.6.0", + "@babel/traverse": "^7.6.0", + "@babel/types": "^7.6.0" + } + }, + "@babel/highlight": { + "version": "7.5.0", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.5.0.tgz", + "integrity": "sha512-7dV4eu9gBxoM0dAnj/BCFDW9LFU0zvTrkq0ugM7pnHEgguOEeOz1so2ZghEdzviYzQEED0r4EAgpsBChKy1TRQ==", + "dev": true, + "requires": { + "chalk": "^2.0.0", + "esutils": "^2.0.2", + "js-tokens": "^4.0.0" + } + }, + "@babel/parser": { + "version": "7.6.0", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.6.0.tgz", + "integrity": "sha512-+o2q111WEx4srBs7L9eJmcwi655eD8sXniLqMB93TBK9GrNzGrxDWSjiqz2hLU0Ha8MTXFIP0yd9fNdP+m43ZQ==", + "dev": true + }, + "@babel/plugin-proposal-async-generator-functions": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-async-generator-functions/-/plugin-proposal-async-generator-functions-7.2.0.tgz", + "integrity": "sha512-+Dfo/SCQqrwx48ptLVGLdE39YtWRuKc/Y9I5Fy0P1DDBB9lsAHpjcEJQt+4IifuSOSTLBKJObJqMvaO1pIE8LQ==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.0.0", + "@babel/helper-remap-async-to-generator": "^7.1.0", + "@babel/plugin-syntax-async-generators": "^7.2.0" + } + }, + "@babel/plugin-proposal-dynamic-import": { + "version": "7.5.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-dynamic-import/-/plugin-proposal-dynamic-import-7.5.0.tgz", + "integrity": "sha512-x/iMjggsKTFHYC6g11PL7Qy58IK8H5zqfm9e6hu4z1iH2IRyAp9u9dL80zA6R76yFovETFLKz2VJIC2iIPBuFw==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.0.0", + "@babel/plugin-syntax-dynamic-import": "^7.2.0" + } + }, + "@babel/plugin-proposal-json-strings": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-json-strings/-/plugin-proposal-json-strings-7.2.0.tgz", + "integrity": "sha512-MAFV1CA/YVmYwZG0fBQyXhmj0BHCB5egZHCKWIFVv/XCxAeVGIHfos3SwDck4LvCllENIAg7xMKOG5kH0dzyUg==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.0.0", + "@babel/plugin-syntax-json-strings": "^7.2.0" + } + }, + "@babel/plugin-proposal-object-rest-spread": { + "version": "7.5.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.5.5.tgz", + "integrity": "sha512-F2DxJJSQ7f64FyTVl5cw/9MWn6naXGdk3Q3UhDbFEEHv+EilCPoeRD3Zh/Utx1CJz4uyKlQ4uH+bJPbEhMV7Zw==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.0.0", + "@babel/plugin-syntax-object-rest-spread": "^7.2.0" + } + }, + "@babel/plugin-proposal-optional-catch-binding": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-optional-catch-binding/-/plugin-proposal-optional-catch-binding-7.2.0.tgz", + "integrity": "sha512-mgYj3jCcxug6KUcX4OBoOJz3CMrwRfQELPQ5560F70YQUBZB7uac9fqaWamKR1iWUzGiK2t0ygzjTScZnVz75g==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.0.0", + "@babel/plugin-syntax-optional-catch-binding": "^7.2.0" + } + }, + "@babel/plugin-proposal-unicode-property-regex": { + "version": "7.4.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-unicode-property-regex/-/plugin-proposal-unicode-property-regex-7.4.4.tgz", + "integrity": "sha512-j1NwnOqMG9mFUOH58JTFsA/+ZYzQLUZ/drqWUqxCYLGeu2JFZL8YrNC9hBxKmWtAuOCHPcRpgv7fhap09Fb4kA==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.0.0", + "@babel/helper-regex": "^7.4.4", + "regexpu-core": "^4.5.4" + } + }, + "@babel/plugin-syntax-async-generators": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-async-generators/-/plugin-syntax-async-generators-7.2.0.tgz", + "integrity": "sha512-1ZrIRBv2t0GSlcwVoQ6VgSLpLgiN/FVQUzt9znxo7v2Ov4jJrs8RY8tv0wvDmFN3qIdMKWrmMMW6yZ0G19MfGg==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.0.0" + } + }, + "@babel/plugin-syntax-dynamic-import": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-dynamic-import/-/plugin-syntax-dynamic-import-7.2.0.tgz", + "integrity": "sha512-mVxuJ0YroI/h/tbFTPGZR8cv6ai+STMKNBq0f8hFxsxWjl94qqhsb+wXbpNMDPU3cfR1TIsVFzU3nXyZMqyK4w==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.0.0" + } + }, + "@babel/plugin-syntax-json-strings": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-json-strings/-/plugin-syntax-json-strings-7.2.0.tgz", + "integrity": "sha512-5UGYnMSLRE1dqqZwug+1LISpA403HzlSfsg6P9VXU6TBjcSHeNlw4DxDx7LgpF+iKZoOG/+uzqoRHTdcUpiZNg==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.0.0" + } + }, + "@babel/plugin-syntax-object-rest-spread": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.2.0.tgz", + "integrity": "sha512-t0JKGgqk2We+9may3t0xDdmneaXmyxq0xieYcKHxIsrJO64n1OiMWNUtc5gQK1PA0NpdCRrtZp4z+IUaKugrSA==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.0.0" + } + }, + "@babel/plugin-syntax-optional-catch-binding": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-catch-binding/-/plugin-syntax-optional-catch-binding-7.2.0.tgz", + "integrity": "sha512-bDe4xKNhb0LI7IvZHiA13kff0KEfaGX/Hv4lMA9+7TEc63hMNvfKo6ZFpXhKuEp+II/q35Gc4NoMeDZyaUbj9w==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.0.0" + } + }, + "@babel/plugin-transform-arrow-functions": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.2.0.tgz", + "integrity": "sha512-ER77Cax1+8/8jCB9fo4Ud161OZzWN5qawi4GusDuRLcDbDG+bIGYY20zb2dfAFdTRGzrfq2xZPvF0R64EHnimg==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.0.0" + } + }, + "@babel/plugin-transform-async-to-generator": { + "version": "7.5.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.5.0.tgz", + "integrity": "sha512-mqvkzwIGkq0bEF1zLRRiTdjfomZJDV33AH3oQzHVGkI2VzEmXLpKKOBvEVaFZBJdN0XTyH38s9j/Kiqr68dggg==", + "dev": true, + "requires": { + "@babel/helper-module-imports": "^7.0.0", + "@babel/helper-plugin-utils": "^7.0.0", + "@babel/helper-remap-async-to-generator": "^7.1.0" + } + }, + "@babel/plugin-transform-block-scoped-functions": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.2.0.tgz", + "integrity": "sha512-ntQPR6q1/NKuphly49+QiQiTN0O63uOwjdD6dhIjSWBI5xlrbUFh720TIpzBhpnrLfv2tNH/BXvLIab1+BAI0w==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.0.0" + } + }, + "@babel/plugin-transform-block-scoping": { + "version": "7.6.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.6.0.tgz", + "integrity": "sha512-tIt4E23+kw6TgL/edACZwP1OUKrjOTyMrFMLoT5IOFrfMRabCgekjqFd5o6PaAMildBu46oFkekIdMuGkkPEpA==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.0.0", + "lodash": "^4.17.13" + } + }, + "@babel/plugin-transform-classes": { + "version": "7.5.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.5.5.tgz", + "integrity": "sha512-U2htCNK/6e9K7jGyJ++1p5XRU+LJjrwtoiVn9SzRlDT2KubcZ11OOwy3s24TjHxPgxNwonCYP7U2K51uVYCMDg==", + "dev": true, + "requires": { + "@babel/helper-annotate-as-pure": "^7.0.0", + "@babel/helper-define-map": "^7.5.5", + "@babel/helper-function-name": "^7.1.0", + "@babel/helper-optimise-call-expression": "^7.0.0", + "@babel/helper-plugin-utils": "^7.0.0", + "@babel/helper-replace-supers": "^7.5.5", + "@babel/helper-split-export-declaration": "^7.4.4", + "globals": "^11.1.0" + } + }, + "@babel/plugin-transform-computed-properties": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.2.0.tgz", + "integrity": "sha512-kP/drqTxY6Xt3NNpKiMomfgkNn4o7+vKxK2DDKcBG9sHj51vHqMBGy8wbDS/J4lMxnqs153/T3+DmCEAkC5cpA==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.0.0" + } + }, + "@babel/plugin-transform-destructuring": { + "version": "7.6.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.6.0.tgz", + "integrity": "sha512-2bGIS5P1v4+sWTCnKNDZDxbGvEqi0ijeqM/YqHtVGrvG2y0ySgnEEhXErvE9dA0bnIzY9bIzdFK0jFA46ASIIQ==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.0.0" + } + }, + "@babel/plugin-transform-dotall-regex": { + "version": "7.4.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.4.4.tgz", + "integrity": "sha512-P05YEhRc2h53lZDjRPk/OektxCVevFzZs2Gfjd545Wde3k+yFDbXORgl2e0xpbq8mLcKJ7Idss4fAg0zORN/zg==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.0.0", + "@babel/helper-regex": "^7.4.4", + "regexpu-core": "^4.5.4" + } + }, + "@babel/plugin-transform-duplicate-keys": { + "version": "7.5.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.5.0.tgz", + "integrity": "sha512-igcziksHizyQPlX9gfSjHkE2wmoCH3evvD2qR5w29/Dk0SMKE/eOI7f1HhBdNhR/zxJDqrgpoDTq5YSLH/XMsQ==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.0.0" + } + }, + "@babel/plugin-transform-exponentiation-operator": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.2.0.tgz", + "integrity": "sha512-umh4hR6N7mu4Elq9GG8TOu9M0bakvlsREEC+ialrQN6ABS4oDQ69qJv1VtR3uxlKMCQMCvzk7vr17RHKcjx68A==", + "dev": true, + "requires": { + "@babel/helper-builder-binary-assignment-operator-visitor": "^7.1.0", + "@babel/helper-plugin-utils": "^7.0.0" + } + }, + "@babel/plugin-transform-for-of": { + "version": "7.4.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.4.4.tgz", + "integrity": "sha512-9T/5Dlr14Z9TIEXLXkt8T1DU7F24cbhwhMNUziN3hB1AXoZcdzPcTiKGRn/6iOymDqtTKWnr/BtRKN9JwbKtdQ==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.0.0" + } + }, + "@babel/plugin-transform-function-name": { + "version": "7.4.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.4.4.tgz", + "integrity": "sha512-iU9pv7U+2jC9ANQkKeNF6DrPy4GBa4NWQtl6dHB4Pb3izX2JOEvDTFarlNsBj/63ZEzNNIAMs3Qw4fNCcSOXJA==", + "dev": true, + "requires": { + "@babel/helper-function-name": "^7.1.0", + "@babel/helper-plugin-utils": "^7.0.0" + } + }, + "@babel/plugin-transform-literals": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-literals/-/plugin-transform-literals-7.2.0.tgz", + "integrity": "sha512-2ThDhm4lI4oV7fVQ6pNNK+sx+c/GM5/SaML0w/r4ZB7sAneD/piDJtwdKlNckXeyGK7wlwg2E2w33C/Hh+VFCg==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.0.0" + } + }, + "@babel/plugin-transform-member-expression-literals": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.2.0.tgz", + "integrity": "sha512-HiU3zKkSU6scTidmnFJ0bMX8hz5ixC93b4MHMiYebmk2lUVNGOboPsqQvx5LzooihijUoLR/v7Nc1rbBtnc7FA==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.0.0" + } + }, + "@babel/plugin-transform-modules-amd": { + "version": "7.5.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.5.0.tgz", + "integrity": "sha512-n20UsQMKnWrltocZZm24cRURxQnWIvsABPJlw/fvoy9c6AgHZzoelAIzajDHAQrDpuKFFPPcFGd7ChsYuIUMpg==", + "dev": true, + "requires": { + "@babel/helper-module-transforms": "^7.1.0", + "@babel/helper-plugin-utils": "^7.0.0", + "babel-plugin-dynamic-import-node": "^2.3.0" + } + }, + "@babel/plugin-transform-modules-commonjs": { + "version": "7.6.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.6.0.tgz", + "integrity": "sha512-Ma93Ix95PNSEngqomy5LSBMAQvYKVe3dy+JlVJSHEXZR5ASL9lQBedMiCyVtmTLraIDVRE3ZjTZvmXXD2Ozw3g==", + "dev": true, + "requires": { + "@babel/helper-module-transforms": "^7.4.4", + "@babel/helper-plugin-utils": "^7.0.0", + "@babel/helper-simple-access": "^7.1.0", + "babel-plugin-dynamic-import-node": "^2.3.0" + } + }, + "@babel/plugin-transform-modules-systemjs": { + "version": "7.5.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.5.0.tgz", + "integrity": "sha512-Q2m56tyoQWmuNGxEtUyeEkm6qJYFqs4c+XyXH5RAuYxObRNz9Zgj/1g2GMnjYp2EUyEy7YTrxliGCXzecl/vJg==", + "dev": true, + "requires": { + "@babel/helper-hoist-variables": "^7.4.4", + "@babel/helper-plugin-utils": "^7.0.0", + "babel-plugin-dynamic-import-node": "^2.3.0" + } + }, + "@babel/plugin-transform-modules-umd": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.2.0.tgz", + "integrity": "sha512-BV3bw6MyUH1iIsGhXlOK6sXhmSarZjtJ/vMiD9dNmpY8QXFFQTj+6v92pcfy1iqa8DeAfJFwoxcrS/TUZda6sw==", + "dev": true, + "requires": { + "@babel/helper-module-transforms": "^7.1.0", + "@babel/helper-plugin-utils": "^7.0.0" + } + }, + "@babel/plugin-transform-named-capturing-groups-regex": { + "version": "7.6.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.6.0.tgz", + "integrity": "sha512-jem7uytlmrRl3iCAuQyw8BpB4c4LWvSpvIeXKpMb+7j84lkx4m4mYr5ErAcmN5KM7B6BqrAvRGjBIbbzqCczew==", + "dev": true, + "requires": { + "regexp-tree": "^0.1.13" + } + }, + "@babel/plugin-transform-new-target": { + "version": "7.4.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.4.4.tgz", + "integrity": "sha512-r1z3T2DNGQwwe2vPGZMBNjioT2scgWzK9BCnDEh+46z8EEwXBq24uRzd65I7pjtugzPSj921aM15RpESgzsSuA==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.0.0" + } + }, + "@babel/plugin-transform-object-super": { + "version": "7.5.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.5.5.tgz", + "integrity": "sha512-un1zJQAhSosGFBduPgN/YFNvWVpRuHKU7IHBglLoLZsGmruJPOo6pbInneflUdmq7YvSVqhpPs5zdBvLnteltQ==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.0.0", + "@babel/helper-replace-supers": "^7.5.5" + } + }, + "@babel/plugin-transform-parameters": { + "version": "7.4.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.4.4.tgz", + "integrity": "sha512-oMh5DUO1V63nZcu/ZVLQFqiihBGo4OpxJxR1otF50GMeCLiRx5nUdtokd+u9SuVJrvvuIh9OosRFPP4pIPnwmw==", + "dev": true, + "requires": { + "@babel/helper-call-delegate": "^7.4.4", + "@babel/helper-get-function-arity": "^7.0.0", + "@babel/helper-plugin-utils": "^7.0.0" + } + }, + "@babel/plugin-transform-property-literals": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.2.0.tgz", + "integrity": "sha512-9q7Dbk4RhgcLp8ebduOpCbtjh7C0itoLYHXd9ueASKAG/is5PQtMR5VJGka9NKqGhYEGn5ITahd4h9QeBMylWQ==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.0.0" + } + }, + "@babel/plugin-transform-regenerator": { + "version": "7.4.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.4.5.tgz", + "integrity": "sha512-gBKRh5qAaCWntnd09S8QC7r3auLCqq5DI6O0DlfoyDjslSBVqBibrMdsqO+Uhmx3+BlOmE/Kw1HFxmGbv0N9dA==", + "dev": true, + "requires": { + "regenerator-transform": "^0.14.0" + } + }, + "@babel/plugin-transform-reserved-words": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.2.0.tgz", + "integrity": "sha512-fz43fqW8E1tAB3DKF19/vxbpib1fuyCwSPE418ge5ZxILnBhWyhtPgz8eh1RCGGJlwvksHkyxMxh0eenFi+kFw==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.0.0" + } + }, + "@babel/plugin-transform-shorthand-properties": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.2.0.tgz", + "integrity": "sha512-QP4eUM83ha9zmYtpbnyjTLAGKQritA5XW/iG9cjtuOI8s1RuL/3V6a3DeSHfKutJQ+ayUfeZJPcnCYEQzaPQqg==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.0.0" + } + }, + "@babel/plugin-transform-spread": { + "version": "7.2.2", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-spread/-/plugin-transform-spread-7.2.2.tgz", + "integrity": "sha512-KWfky/58vubwtS0hLqEnrWJjsMGaOeSBn90Ezn5Jeg9Z8KKHmELbP1yGylMlm5N6TPKeY9A2+UaSYLdxahg01w==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.0.0" + } + }, + "@babel/plugin-transform-sticky-regex": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.2.0.tgz", + "integrity": "sha512-KKYCoGaRAf+ckH8gEL3JHUaFVyNHKe3ASNsZ+AlktgHevvxGigoIttrEJb8iKN03Q7Eazlv1s6cx2B2cQ3Jabw==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.0.0", + "@babel/helper-regex": "^7.0.0" + } + }, + "@babel/plugin-transform-template-literals": { + "version": "7.4.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.4.4.tgz", + "integrity": "sha512-mQrEC4TWkhLN0z8ygIvEL9ZEToPhG5K7KDW3pzGqOfIGZ28Jb0POUkeWcoz8HnHvhFy6dwAT1j8OzqN8s804+g==", + "dev": true, + "requires": { + "@babel/helper-annotate-as-pure": "^7.0.0", + "@babel/helper-plugin-utils": "^7.0.0" + } + }, + "@babel/plugin-transform-typeof-symbol": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.2.0.tgz", + "integrity": "sha512-2LNhETWYxiYysBtrBTqL8+La0jIoQQnIScUJc74OYvUGRmkskNY4EzLCnjHBzdmb38wqtTaixpo1NctEcvMDZw==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.0.0" + } + }, + "@babel/plugin-transform-unicode-regex": { + "version": "7.4.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.4.4.tgz", + "integrity": "sha512-il+/XdNw01i93+M9J9u4T7/e/Ue/vWfNZE4IRUQjplu2Mqb/AFTDimkw2tdEdSH50wuQXZAbXSql0UphQke+vA==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.0.0", + "@babel/helper-regex": "^7.4.4", + "regexpu-core": "^4.5.4" + } + }, + "@babel/preset-env": { + "version": "7.6.0", + "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.6.0.tgz", + "integrity": "sha512-1efzxFv/TcPsNXlRhMzRnkBFMeIqBBgzwmZwlFDw5Ubj0AGLeufxugirwZmkkX/ayi3owsSqoQ4fw8LkfK9SYg==", + "dev": true, + "requires": { + "@babel/helper-module-imports": "^7.0.0", + "@babel/helper-plugin-utils": "^7.0.0", + "@babel/plugin-proposal-async-generator-functions": "^7.2.0", + "@babel/plugin-proposal-dynamic-import": "^7.5.0", + "@babel/plugin-proposal-json-strings": "^7.2.0", + "@babel/plugin-proposal-object-rest-spread": "^7.5.5", + "@babel/plugin-proposal-optional-catch-binding": "^7.2.0", + "@babel/plugin-proposal-unicode-property-regex": "^7.4.4", + "@babel/plugin-syntax-async-generators": "^7.2.0", + "@babel/plugin-syntax-dynamic-import": "^7.2.0", + "@babel/plugin-syntax-json-strings": "^7.2.0", + "@babel/plugin-syntax-object-rest-spread": "^7.2.0", + "@babel/plugin-syntax-optional-catch-binding": "^7.2.0", + "@babel/plugin-transform-arrow-functions": "^7.2.0", + "@babel/plugin-transform-async-to-generator": "^7.5.0", + "@babel/plugin-transform-block-scoped-functions": "^7.2.0", + "@babel/plugin-transform-block-scoping": "^7.6.0", + "@babel/plugin-transform-classes": "^7.5.5", + "@babel/plugin-transform-computed-properties": "^7.2.0", + "@babel/plugin-transform-destructuring": "^7.6.0", + "@babel/plugin-transform-dotall-regex": "^7.4.4", + "@babel/plugin-transform-duplicate-keys": "^7.5.0", + "@babel/plugin-transform-exponentiation-operator": "^7.2.0", + "@babel/plugin-transform-for-of": "^7.4.4", + "@babel/plugin-transform-function-name": "^7.4.4", + "@babel/plugin-transform-literals": "^7.2.0", + "@babel/plugin-transform-member-expression-literals": "^7.2.0", + "@babel/plugin-transform-modules-amd": "^7.5.0", + "@babel/plugin-transform-modules-commonjs": "^7.6.0", + "@babel/plugin-transform-modules-systemjs": "^7.5.0", + "@babel/plugin-transform-modules-umd": "^7.2.0", + "@babel/plugin-transform-named-capturing-groups-regex": "^7.6.0", + "@babel/plugin-transform-new-target": "^7.4.4", + "@babel/plugin-transform-object-super": "^7.5.5", + "@babel/plugin-transform-parameters": "^7.4.4", + "@babel/plugin-transform-property-literals": "^7.2.0", + "@babel/plugin-transform-regenerator": "^7.4.5", + "@babel/plugin-transform-reserved-words": "^7.2.0", + "@babel/plugin-transform-shorthand-properties": "^7.2.0", + "@babel/plugin-transform-spread": "^7.2.0", + "@babel/plugin-transform-sticky-regex": "^7.2.0", + "@babel/plugin-transform-template-literals": "^7.4.4", + "@babel/plugin-transform-typeof-symbol": "^7.2.0", + "@babel/plugin-transform-unicode-regex": "^7.4.4", + "@babel/types": "^7.6.0", + "browserslist": "^4.6.0", + "core-js-compat": "^3.1.1", + "invariant": "^2.2.2", + "js-levenshtein": "^1.1.3", + "semver": "^5.5.0" + } + }, + "@babel/template": { + "version": "7.6.0", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.6.0.tgz", + "integrity": "sha512-5AEH2EXD8euCk446b7edmgFdub/qfH1SN6Nii3+fyXP807QRx9Q73A2N5hNwRRslC2H9sNzaFhsPubkS4L8oNQ==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.0.0", + "@babel/parser": "^7.6.0", + "@babel/types": "^7.6.0" + } + }, + "@babel/traverse": { + "version": "7.6.0", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.6.0.tgz", + "integrity": "sha512-93t52SaOBgml/xY74lsmt7xOR4ufYvhb5c5qiM6lu4J/dWGMAfAh6eKw4PjLes6DI6nQgearoxnFJk60YchpvQ==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.5.5", + "@babel/generator": "^7.6.0", + "@babel/helper-function-name": "^7.1.0", + "@babel/helper-split-export-declaration": "^7.4.4", + "@babel/parser": "^7.6.0", + "@babel/types": "^7.6.0", + "debug": "^4.1.0", + "globals": "^11.1.0", + "lodash": "^4.17.13" + }, + "dependencies": { + "debug": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", + "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", + "dev": true, + "requires": { + "ms": "^2.1.1" + } + }, + "ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "dev": true + } + } + }, + "@babel/types": { + "version": "7.6.1", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.6.1.tgz", + "integrity": "sha512-X7gdiuaCmA0uRjCmRtYJNAVCc/q+5xSgsfKJHqMN4iNLILX39677fJE1O40arPMh0TTtS9ItH67yre6c7k6t0g==", + "dev": true, + "requires": { + "esutils": "^2.0.2", + "lodash": "^4.17.13", + "to-fast-properties": "^2.0.0" + } + }, + "@types/events": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@types/events/-/events-3.0.0.tgz", + "integrity": "sha512-EaObqwIvayI5a8dCzhFrjKzVwKLxjoG9T6Ppd5CEo07LRKfQ8Yokw54r5+Wq7FaBQ+yXRvQAYPrHwya1/UFt9g==", + "dev": true + }, + "@types/glob": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/@types/glob/-/glob-7.1.1.tgz", + "integrity": "sha512-1Bh06cbWJUHMC97acuD6UMG29nMt0Aqz1vF3guLfG+kHHJhy3AyohZFFxYk2f7Q1SQIrNwvncxAE0N/9s70F2w==", + "dev": true, + "requires": { + "@types/events": "*", + "@types/minimatch": "*", + "@types/node": "*" + } + }, + "@types/minimatch": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/@types/minimatch/-/minimatch-3.0.3.tgz", + "integrity": "sha512-tHq6qdbT9U1IRSGf14CL0pUlULksvY9OZ+5eEgl1N7t+OA3tGvNpxJCzuKQlsNgCVwbAs670L1vcVQi8j9HjnA==", + "dev": true + }, + "@types/node": { + "version": "12.7.4", + "resolved": "https://registry.npmjs.org/@types/node/-/node-12.7.4.tgz", + "integrity": "sha512-W0+n1Y+gK/8G2P/piTkBBN38Qc5Q1ZSO6B5H3QmPCUewaiXOo2GCAWZ4ElZCcNhjJuBSUSLGFUJnmlCn5+nxOQ==", + "dev": true + }, + "@webassemblyjs/ast": { + "version": "1.8.5", + "resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.8.5.tgz", + "integrity": "sha512-aJMfngIZ65+t71C3y2nBBg5FFG0Okt9m0XEgWZ7Ywgn1oMAT8cNwx00Uv1cQyHtidq0Xn94R4TAywO+LCQ+ZAQ==", + "dev": true, + "requires": { + "@webassemblyjs/helper-module-context": "1.8.5", + "@webassemblyjs/helper-wasm-bytecode": "1.8.5", + "@webassemblyjs/wast-parser": "1.8.5" + } + }, + "@webassemblyjs/floating-point-hex-parser": { + "version": "1.8.5", + "resolved": "https://registry.npmjs.org/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.8.5.tgz", + "integrity": "sha512-9p+79WHru1oqBh9ewP9zW95E3XAo+90oth7S5Re3eQnECGq59ly1Ri5tsIipKGpiStHsUYmY3zMLqtk3gTcOtQ==", + "dev": true + }, + "@webassemblyjs/helper-api-error": { + "version": "1.8.5", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-api-error/-/helper-api-error-1.8.5.tgz", + "integrity": "sha512-Za/tnzsvnqdaSPOUXHyKJ2XI7PDX64kWtURyGiJJZKVEdFOsdKUCPTNEVFZq3zJ2R0G5wc2PZ5gvdTRFgm81zA==", + "dev": true + }, + "@webassemblyjs/helper-buffer": { + "version": "1.8.5", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-buffer/-/helper-buffer-1.8.5.tgz", + "integrity": "sha512-Ri2R8nOS0U6G49Q86goFIPNgjyl6+oE1abW1pS84BuhP1Qcr5JqMwRFT3Ah3ADDDYGEgGs1iyb1DGX+kAi/c/Q==", + "dev": true + }, + "@webassemblyjs/helper-code-frame": { + "version": "1.8.5", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-code-frame/-/helper-code-frame-1.8.5.tgz", + "integrity": "sha512-VQAadSubZIhNpH46IR3yWO4kZZjMxN1opDrzePLdVKAZ+DFjkGD/rf4v1jap744uPVU6yjL/smZbRIIJTOUnKQ==", + "dev": true, + "requires": { + "@webassemblyjs/wast-printer": "1.8.5" + } + }, + "@webassemblyjs/helper-fsm": { + "version": "1.8.5", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-fsm/-/helper-fsm-1.8.5.tgz", + "integrity": "sha512-kRuX/saORcg8se/ft6Q2UbRpZwP4y7YrWsLXPbbmtepKr22i8Z4O3V5QE9DbZK908dh5Xya4Un57SDIKwB9eow==", + "dev": true + }, + "@webassemblyjs/helper-module-context": { + "version": "1.8.5", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-module-context/-/helper-module-context-1.8.5.tgz", + "integrity": "sha512-/O1B236mN7UNEU4t9X7Pj38i4VoU8CcMHyy3l2cV/kIF4U5KoHXDVqcDuOs1ltkac90IM4vZdHc52t1x8Yfs3g==", + "dev": true, + "requires": { + "@webassemblyjs/ast": "1.8.5", + "mamacro": "^0.0.3" + } + }, + "@webassemblyjs/helper-wasm-bytecode": { + "version": "1.8.5", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.8.5.tgz", + "integrity": "sha512-Cu4YMYG3Ddl72CbmpjU/wbP6SACcOPVbHN1dI4VJNJVgFwaKf1ppeFJrwydOG3NDHxVGuCfPlLZNyEdIYlQ6QQ==", + "dev": true + }, + "@webassemblyjs/helper-wasm-section": { + "version": "1.8.5", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.8.5.tgz", + "integrity": "sha512-VV083zwR+VTrIWWtgIUpqfvVdK4ff38loRmrdDBgBT8ADXYsEZ5mPQ4Nde90N3UYatHdYoDIFb7oHzMncI02tA==", + "dev": true, + "requires": { + "@webassemblyjs/ast": "1.8.5", + "@webassemblyjs/helper-buffer": "1.8.5", + "@webassemblyjs/helper-wasm-bytecode": "1.8.5", + "@webassemblyjs/wasm-gen": "1.8.5" + } + }, + "@webassemblyjs/ieee754": { + "version": "1.8.5", + "resolved": "https://registry.npmjs.org/@webassemblyjs/ieee754/-/ieee754-1.8.5.tgz", + "integrity": "sha512-aaCvQYrvKbY/n6wKHb/ylAJr27GglahUO89CcGXMItrOBqRarUMxWLJgxm9PJNuKULwN5n1csT9bYoMeZOGF3g==", + "dev": true, + "requires": { + "@xtuc/ieee754": "^1.2.0" + } + }, + "@webassemblyjs/leb128": { + "version": "1.8.5", + "resolved": "https://registry.npmjs.org/@webassemblyjs/leb128/-/leb128-1.8.5.tgz", + "integrity": "sha512-plYUuUwleLIziknvlP8VpTgO4kqNaH57Y3JnNa6DLpu/sGcP6hbVdfdX5aHAV716pQBKrfuU26BJK29qY37J7A==", + "dev": true, + "requires": { + "@xtuc/long": "4.2.2" + } + }, + "@webassemblyjs/utf8": { + "version": "1.8.5", + "resolved": "https://registry.npmjs.org/@webassemblyjs/utf8/-/utf8-1.8.5.tgz", + "integrity": "sha512-U7zgftmQriw37tfD934UNInokz6yTmn29inT2cAetAsaU9YeVCveWEwhKL1Mg4yS7q//NGdzy79nlXh3bT8Kjw==", + "dev": true + }, + "@webassemblyjs/wasm-edit": { + "version": "1.8.5", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-edit/-/wasm-edit-1.8.5.tgz", + "integrity": "sha512-A41EMy8MWw5yvqj7MQzkDjU29K7UJq1VrX2vWLzfpRHt3ISftOXqrtojn7nlPsZ9Ijhp5NwuODuycSvfAO/26Q==", + "dev": true, + "requires": { + "@webassemblyjs/ast": "1.8.5", + "@webassemblyjs/helper-buffer": "1.8.5", + "@webassemblyjs/helper-wasm-bytecode": "1.8.5", + "@webassemblyjs/helper-wasm-section": "1.8.5", + "@webassemblyjs/wasm-gen": "1.8.5", + "@webassemblyjs/wasm-opt": "1.8.5", + "@webassemblyjs/wasm-parser": "1.8.5", + "@webassemblyjs/wast-printer": "1.8.5" + } + }, + "@webassemblyjs/wasm-gen": { + "version": "1.8.5", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-gen/-/wasm-gen-1.8.5.tgz", + "integrity": "sha512-BCZBT0LURC0CXDzj5FXSc2FPTsxwp3nWcqXQdOZE4U7h7i8FqtFK5Egia6f9raQLpEKT1VL7zr4r3+QX6zArWg==", + "dev": true, + "requires": { + "@webassemblyjs/ast": "1.8.5", + "@webassemblyjs/helper-wasm-bytecode": "1.8.5", + "@webassemblyjs/ieee754": "1.8.5", + "@webassemblyjs/leb128": "1.8.5", + "@webassemblyjs/utf8": "1.8.5" + } + }, + "@webassemblyjs/wasm-opt": { + "version": "1.8.5", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-opt/-/wasm-opt-1.8.5.tgz", + "integrity": "sha512-HKo2mO/Uh9A6ojzu7cjslGaHaUU14LdLbGEKqTR7PBKwT6LdPtLLh9fPY33rmr5wcOMrsWDbbdCHq4hQUdd37Q==", + "dev": true, + "requires": { + "@webassemblyjs/ast": "1.8.5", + "@webassemblyjs/helper-buffer": "1.8.5", + "@webassemblyjs/wasm-gen": "1.8.5", + "@webassemblyjs/wasm-parser": "1.8.5" + } + }, + "@webassemblyjs/wasm-parser": { + "version": "1.8.5", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-parser/-/wasm-parser-1.8.5.tgz", + "integrity": "sha512-pi0SYE9T6tfcMkthwcgCpL0cM9nRYr6/6fjgDtL6q/ZqKHdMWvxitRi5JcZ7RI4SNJJYnYNaWy5UUrHQy998lw==", + "dev": true, + "requires": { + "@webassemblyjs/ast": "1.8.5", + "@webassemblyjs/helper-api-error": "1.8.5", + "@webassemblyjs/helper-wasm-bytecode": "1.8.5", + "@webassemblyjs/ieee754": "1.8.5", + "@webassemblyjs/leb128": "1.8.5", + "@webassemblyjs/utf8": "1.8.5" + } + }, + "@webassemblyjs/wast-parser": { + "version": "1.8.5", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-parser/-/wast-parser-1.8.5.tgz", + "integrity": "sha512-daXC1FyKWHF1i11obK086QRlsMsY4+tIOKgBqI1lxAnkp9xe9YMcgOxm9kLe+ttjs5aWV2KKE1TWJCN57/Btsg==", + "dev": true, + "requires": { + "@webassemblyjs/ast": "1.8.5", + "@webassemblyjs/floating-point-hex-parser": "1.8.5", + "@webassemblyjs/helper-api-error": "1.8.5", + "@webassemblyjs/helper-code-frame": "1.8.5", + "@webassemblyjs/helper-fsm": "1.8.5", + "@xtuc/long": "4.2.2" + } + }, + "@webassemblyjs/wast-printer": { + "version": "1.8.5", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-printer/-/wast-printer-1.8.5.tgz", + "integrity": "sha512-w0U0pD4EhlnvRyeJzBqaVSJAo9w/ce7/WPogeXLzGkO6hzhr4GnQIZ4W4uUt5b9ooAaXPtnXlj0gzsXEOUNYMg==", + "dev": true, + "requires": { + "@webassemblyjs/ast": "1.8.5", + "@webassemblyjs/wast-parser": "1.8.5", + "@xtuc/long": "4.2.2" + } + }, + "@xtuc/ieee754": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@xtuc/ieee754/-/ieee754-1.2.0.tgz", + "integrity": "sha512-DX8nKgqcGwsc0eJSqYt5lwP4DH5FlHnmuWWBRy7X0NcaGR0ZtuyeESgMwTYVEtxmsNGY+qit4QYT/MIYTOTPeA==", + "dev": true + }, + "@xtuc/long": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/@xtuc/long/-/long-4.2.2.tgz", + "integrity": "sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ==", + "dev": true + }, + "abbrev": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz", + "integrity": "sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==", + "dev": true + }, + "accepts": { + "version": "1.3.7", + "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.7.tgz", + "integrity": "sha512-Il80Qs2WjYlJIBNzNkK6KYqlVMTbZLXgHx2oT0pU/fjRHyEp+PEfEPY0R3WCwAGVOtauxh1hOxNgIf5bv7dQpA==", + "dev": true, + "requires": { + "mime-types": "~2.1.24", + "negotiator": "0.6.2" + } + }, + "acorn": { + "version": "5.7.3", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-5.7.3.tgz", + "integrity": "sha512-T/zvzYRfbVojPWahDsE5evJdHb3oJoQfFbsrKM7w5Zcs++Tr257tia3BmMP8XYVjp1S9RZXQMh7gao96BlqZOw==", + "dev": true + }, + "acorn-jsx": { + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.0.2.tgz", + "integrity": "sha512-tiNTrP1MP0QrChmD2DdupCr6HWSFeKVw5d/dHTu4Y7rkAkRhU/Dt7dphAfIUyxtHpl/eBVip5uTNSpQJHylpAw==", + "dev": true + }, + "ajv": { + "version": "6.10.2", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.10.2.tgz", + "integrity": "sha512-TXtUUEYHuaTEbLZWIKUr5pmBuhDLy+8KYtPYdcV8qC+pOZL+NKqYwvWSRrVXHn+ZmRRAu8vJTAznH7Oag6RVRw==", + "dev": true, + "requires": { + "fast-deep-equal": "^2.0.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + } + }, + "ajv-errors": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/ajv-errors/-/ajv-errors-1.0.1.tgz", + "integrity": "sha512-DCRfO/4nQ+89p/RK43i8Ezd41EqdGIU4ld7nGF8OQ14oc/we5rEntLCUa7+jrn3nn83BosfwZA0wb4pon2o8iQ==", + "dev": true + }, + "ajv-keywords": { + "version": "3.4.1", + "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.4.1.tgz", + "integrity": "sha512-RO1ibKvd27e6FEShVFfPALuHI3WjSVNeK5FIsmme/LYRNxjKuNj+Dt7bucLa6NdSv3JcVTyMlm9kGR84z1XpaQ==", + "dev": true + }, + "align-text": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/align-text/-/align-text-0.1.4.tgz", + "integrity": "sha1-DNkKVhCT810KmSVsIrcGlDP60Rc=", + "dev": true, + "requires": { + "kind-of": "^3.0.2", + "longest": "^1.0.1", + "repeat-string": "^1.5.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "alter": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/alter/-/alter-0.2.0.tgz", + "integrity": "sha1-x1iICGF1cgNKrmJICvJrHU0cs80=", + "dev": true, + "requires": { + "stable": "~0.1.3" + } + }, + "amdefine": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/amdefine/-/amdefine-1.0.1.tgz", + "integrity": "sha1-SlKCrBZHKek2Gbz9OtFR+BfOkfU=", + "dev": true + }, + "ansi-align": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ansi-align/-/ansi-align-2.0.0.tgz", + "integrity": "sha1-w2rsy6VjuJzrVW82kPCx2eNUf38=", + "dev": true, + "requires": { + "string-width": "^2.0.0" + } + }, + "ansi-colors": { + "version": "3.2.4", + "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-3.2.4.tgz", + "integrity": "sha512-hHUXGagefjN2iRrID63xckIvotOXOojhQKWIPUZ4mNUZ9nLZW+7FMNoE1lOkEhNWYsx/7ysGIuJYCiMAA9FnrA==", + "dev": true + }, + "ansi-escapes": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-3.2.0.tgz", + "integrity": "sha512-cBhpre4ma+U0T1oM5fXg7Dy1Jw7zzwv7lt/GoCpr+hDQJoYnKVPLL4dCvSEFMmQurOQvSrwT7SL/DAlhBI97RQ==", + "dev": true + }, + "ansi-html": { + "version": "0.0.7", + "resolved": "https://registry.npmjs.org/ansi-html/-/ansi-html-0.0.7.tgz", + "integrity": "sha1-gTWEAhliqenm/QOflA0S9WynhZ4=", + "dev": true + }, + "ansi-regex": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", + "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", + "dev": true + }, + "ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dev": true, + "requires": { + "color-convert": "^1.9.0" + } + }, + "anymatch": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-2.0.0.tgz", + "integrity": "sha512-5teOsQWABXHHBFP9y3skS5P3d/WfWXpv3FUpy+LorMrNYaT9pI4oLMQX7jzQ2KklNpGpWHzdCXTDT2Y3XGlZBw==", + "dev": true, + "requires": { + "micromatch": "^3.1.4", + "normalize-path": "^2.1.1" + }, + "dependencies": { + "normalize-path": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-2.1.1.tgz", + "integrity": "sha1-GrKLVW4Zg2Oowab35vogE3/mrtk=", + "dev": true, + "requires": { + "remove-trailing-separator": "^1.0.1" + } + } + } + }, + "aproba": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/aproba/-/aproba-1.2.0.tgz", + "integrity": "sha512-Y9J6ZjXtoYh8RnXVCMOU/ttDmk1aBjunq9vO0ta5x85WDQiQfUF9sIPBITdbiiIVcBo03Hi3jMxigBtsddlXRw==", + "dev": true + }, + "argparse": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", + "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", + "dev": true, + "requires": { + "sprintf-js": "~1.0.2" + } + }, + "arr-diff": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-4.0.0.tgz", + "integrity": "sha1-1kYQdP6/7HHn4VI1dhoyml3HxSA=", + "dev": true + }, + "arr-flatten": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/arr-flatten/-/arr-flatten-1.1.0.tgz", + "integrity": "sha512-L3hKV5R/p5o81R7O02IGnwpDmkp6E982XhtbuwSe3O4qOtMMMtodicASA1Cny2U+aCXcNpml+m4dPsvsJ3jatg==", + "dev": true + }, + "arr-union": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/arr-union/-/arr-union-3.1.0.tgz", + "integrity": "sha1-45sJrqne+Gao8gbiiK9jkZuuOcQ=", + "dev": true + }, + "array-flatten": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-2.1.2.tgz", + "integrity": "sha512-hNfzcOV8W4NdualtqBFPyVO+54DSJuZGY9qT4pRroB6S9e3iiido2ISIC5h9R2sPJ8H3FHCIiEnsv1lPXO3KtQ==", + "dev": true + }, + "array-includes": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/array-includes/-/array-includes-3.0.3.tgz", + "integrity": "sha1-GEtI9i2S10UrsxsyMWXH+L0CJm0=", + "dev": true, + "requires": { + "define-properties": "^1.1.2", + "es-abstract": "^1.7.0" + } + }, + "array-union": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/array-union/-/array-union-1.0.2.tgz", + "integrity": "sha1-mjRBDk9OPaI96jdb5b5w8kd47Dk=", + "dev": true, + "requires": { + "array-uniq": "^1.0.1" + } + }, + "array-uniq": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/array-uniq/-/array-uniq-1.0.3.tgz", + "integrity": "sha1-r2rId6Jcx/dOBYiUdThY39sk/bY=", + "dev": true + }, + "array-unique": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.3.2.tgz", + "integrity": "sha1-qJS3XUvE9s1nnvMkSp/Y9Gri1Cg=", + "dev": true + }, + "asn1.js": { + "version": "4.10.1", + "resolved": "https://registry.npmjs.org/asn1.js/-/asn1.js-4.10.1.tgz", + "integrity": "sha512-p32cOF5q0Zqs9uBiONKYLm6BClCoBCM5O9JfeUSlnQLBTxYdTK+pW+nXflm8UkKd2UYlEbYz5qEi0JuZR9ckSw==", + "dev": true, + "requires": { + "bn.js": "^4.0.0", + "inherits": "^2.0.1", + "minimalistic-assert": "^1.0.0" + } + }, + "assert": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/assert/-/assert-1.5.0.tgz", + "integrity": "sha512-EDsgawzwoun2CZkCgtxJbv392v4nbk9XDD06zI+kQYoBM/3RBWLlEyJARDOmhAAosBjWACEkKL6S+lIZtcAubA==", + "dev": true, + "requires": { + "object-assign": "^4.1.1", + "util": "0.10.3" + }, + "dependencies": { + "inherits": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.1.tgz", + "integrity": "sha1-sX0I0ya0Qj5Wjv9xn5GwscvfafE=", + "dev": true + }, + "util": { + "version": "0.10.3", + "resolved": "https://registry.npmjs.org/util/-/util-0.10.3.tgz", + "integrity": "sha1-evsa/lCAUkZInj23/g7TeTNqwPk=", + "dev": true, + "requires": { + "inherits": "2.0.1" + } + } + } + }, + "assign-symbols": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/assign-symbols/-/assign-symbols-1.0.0.tgz", + "integrity": "sha1-WWZ/QfrdTyDMvCu5a41Pf3jsA2c=", + "dev": true + }, + "ast-traverse": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/ast-traverse/-/ast-traverse-0.1.1.tgz", + "integrity": "sha1-ac8rg4bxnc2hux4F1o/jWdiJfeY=", + "dev": true + }, + "ast-types": { + "version": "0.9.6", + "resolved": "https://registry.npmjs.org/ast-types/-/ast-types-0.9.6.tgz", + "integrity": "sha1-ECyenpAF0+fjgpvwxPok7oYu6bk=", + "dev": true + }, + "astral-regex": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/astral-regex/-/astral-regex-1.0.0.tgz", + "integrity": "sha512-+Ryf6g3BKoRc7jfp7ad8tM4TtMiaWvbF/1/sQcZPkkS7ag3D5nMBCe2UfOTONtAkaG0tO0ij3C5Lwmf1EiyjHg==", + "dev": true + }, + "async": { + "version": "1.5.2", + "resolved": "https://registry.npmjs.org/async/-/async-1.5.2.tgz", + "integrity": "sha1-7GphrlZIDAw8skHJVhjiCJL5Zyo=", + "dev": true + }, + "async-each": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/async-each/-/async-each-1.0.3.tgz", + "integrity": "sha512-z/WhQ5FPySLdvREByI2vZiTWwCnF0moMJ1hK9YQwDTHKh6I7/uSckMetoRGb5UBZPC1z0jlw+n/XCgjeH7y1AQ==", + "dev": true + }, + "async-limiter": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/async-limiter/-/async-limiter-1.0.1.tgz", + "integrity": "sha512-csOlWGAcRFJaI6m+F2WKdnMKr4HhdhFVBk0H/QbJFMCr+uO2kwohwXQPxw/9OCxp05r5ghVBFSyioixx3gfkNQ==", + "dev": true + }, + "atob": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/atob/-/atob-2.1.2.tgz", + "integrity": "sha512-Wm6ukoaOGJi/73p/cl2GvLjTI5JM1k/O14isD73YML8StrH/7/lRFgmg8nICZgD3bZZvjwCGxtMOD3wWNAu8cg==", + "dev": true + }, + "babel": { + "version": "5.8.38", + "resolved": "https://registry.npmjs.org/babel/-/babel-5.8.38.tgz", + "integrity": "sha1-37CHwiiUkXxXb7Z86c8yjUWGKfs=", + "dev": true, + "requires": { + "babel-core": "^5.6.21", + "chokidar": "^1.0.0", + "commander": "^2.6.0", + "convert-source-map": "^1.1.0", + "fs-readdir-recursive": "^0.1.0", + "glob": "^5.0.5", + "lodash": "^3.2.0", + "output-file-sync": "^1.1.0", + "path-exists": "^1.0.0", + "path-is-absolute": "^1.0.0", + "slash": "^1.0.0", + "source-map": "^0.5.0" + }, + "dependencies": { + "ansi-styles": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", + "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=", + "dev": true + }, + "anymatch": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-1.3.2.tgz", + "integrity": "sha512-0XNayC8lTHQ2OI8aljNCN3sSx6hsr/1+rlcDAotXJR7C1oZZHCNsfpbKwMjRA3Uqb5tF1Rae2oloTr4xpq+WjA==", + "dev": true, + "requires": { + "micromatch": "^2.1.5", + "normalize-path": "^2.0.0" + } + }, + "arr-diff": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-2.0.0.tgz", + "integrity": "sha1-jzuCf5Vai9ZpaX5KQlasPOrjVs8=", + "dev": true, + "requires": { + "arr-flatten": "^1.0.1" + } + }, + "array-unique": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.2.1.tgz", + "integrity": "sha1-odl8yvy8JiXMcPrc6zalDFiwGlM=", + "dev": true + }, + "babel-core": { + "version": "5.8.38", + "resolved": "https://registry.npmjs.org/babel-core/-/babel-core-5.8.38.tgz", + "integrity": "sha1-H8ruedfmG3ULALjlT238nQr4ZVg=", + "dev": true, + "requires": { + "babel-plugin-constant-folding": "^1.0.1", + "babel-plugin-dead-code-elimination": "^1.0.2", + "babel-plugin-eval": "^1.0.1", + "babel-plugin-inline-environment-variables": "^1.0.1", + "babel-plugin-jscript": "^1.0.4", + "babel-plugin-member-expression-literals": "^1.0.1", + "babel-plugin-property-literals": "^1.0.1", + "babel-plugin-proto-to-assign": "^1.0.3", + "babel-plugin-react-constant-elements": "^1.0.3", + "babel-plugin-react-display-name": "^1.0.3", + "babel-plugin-remove-console": "^1.0.1", + "babel-plugin-remove-debugger": "^1.0.1", + "babel-plugin-runtime": "^1.0.7", + "babel-plugin-undeclared-variables-check": "^1.0.2", + "babel-plugin-undefined-to-void": "^1.1.6", + "babylon": "^5.8.38", + "bluebird": "^2.9.33", + "chalk": "^1.0.0", + "convert-source-map": "^1.1.0", + "core-js": "^1.0.0", + "debug": "^2.1.1", + "detect-indent": "^3.0.0", + "esutils": "^2.0.0", + "fs-readdir-recursive": "^0.1.0", + "globals": "^6.4.0", + "home-or-tmp": "^1.0.0", + "is-integer": "^1.0.4", + "js-tokens": "1.0.1", + "json5": "^0.4.0", + "lodash": "^3.10.0", + "minimatch": "^2.0.3", + "output-file-sync": "^1.1.0", + "path-exists": "^1.0.0", + "path-is-absolute": "^1.0.0", + "private": "^0.1.6", + "regenerator": "0.8.40", + "regexpu": "^1.3.0", + "repeating": "^1.1.2", + "resolve": "^1.1.6", + "shebang-regex": "^1.0.0", + "slash": "^1.0.0", + "source-map": "^0.5.0", + "source-map-support": "^0.2.10", + "to-fast-properties": "^1.0.0", + "trim-right": "^1.0.0", + "try-resolve": "^1.0.0" + }, + "dependencies": { + "minimatch": { + "version": "2.0.10", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-2.0.10.tgz", + "integrity": "sha1-jQh8OcazjAAbl/ynzm0OHoCvusc=", + "dev": true, + "requires": { + "brace-expansion": "^1.0.0" + } + } + } + }, + "babylon": { + "version": "5.8.38", + "resolved": "https://registry.npmjs.org/babylon/-/babylon-5.8.38.tgz", + "integrity": "sha1-7JsSCxG/bM1Bc6GL8hfmC3mFn/0=", + "dev": true + }, + "braces": { + "version": "1.8.5", + "resolved": "https://registry.npmjs.org/braces/-/braces-1.8.5.tgz", + "integrity": "sha1-uneWLhLf+WnWt2cR6RS3N4V79qc=", + "dev": true, + "requires": { + "expand-range": "^1.8.1", + "preserve": "^0.2.0", + "repeat-element": "^1.1.2" + } + }, + "chalk": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", + "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", + "dev": true, + "requires": { + "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" + } + }, + "chokidar": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-1.7.0.tgz", + "integrity": "sha1-eY5ol3gVHIB2tLNg5e3SjNortGg=", + "dev": true, + "requires": { + "anymatch": "^1.3.0", + "async-each": "^1.0.0", + "fsevents": "^1.0.0", + "glob-parent": "^2.0.0", + "inherits": "^2.0.1", + "is-binary-path": "^1.0.0", + "is-glob": "^2.0.0", + "path-is-absolute": "^1.0.0", + "readdirp": "^2.0.0" + } + }, + "core-js": { + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/core-js/-/core-js-1.2.7.tgz", + "integrity": "sha1-ZSKUwUZR2yj6k70tX/KYOk8IxjY=", + "dev": true + }, + "detect-indent": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/detect-indent/-/detect-indent-3.0.1.tgz", + "integrity": "sha1-ncXl3bzu+DJXZLlFGwK8bVQIT3U=", + "dev": true, + "requires": { + "get-stdin": "^4.0.1", + "minimist": "^1.1.0", + "repeating": "^1.1.0" + } + }, + "expand-brackets": { + "version": "0.1.5", + "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-0.1.5.tgz", + "integrity": "sha1-3wcoTjQqgHzXM6xa9yQR5YHRF3s=", + "dev": true, + "requires": { + "is-posix-bracket": "^0.1.0" + } + }, + "extglob": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/extglob/-/extglob-0.3.2.tgz", + "integrity": "sha1-Lhj/PS9JqydlzskCPwEdqo2DSaE=", + "dev": true, + "requires": { + "is-extglob": "^1.0.0" + } + }, + "fs-readdir-recursive": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/fs-readdir-recursive/-/fs-readdir-recursive-0.1.2.tgz", + "integrity": "sha1-MVtPuMHKW4xH3v7zGdBz2tNWgFk=", + "dev": true + }, + "glob": { + "version": "5.0.15", + "resolved": "https://registry.npmjs.org/glob/-/glob-5.0.15.tgz", + "integrity": "sha1-G8k2ueAvSmA/zCIuz3Yz0wuLk7E=", + "dev": true, + "requires": { + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "2 || 3", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + } + }, + "glob-parent": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-2.0.0.tgz", + "integrity": "sha1-gTg9ctsFT8zPUzbaqQLxgvbtuyg=", + "dev": true, + "requires": { + "is-glob": "^2.0.0" + } + }, + "globals": { + "version": "6.4.1", + "resolved": "https://registry.npmjs.org/globals/-/globals-6.4.1.tgz", + "integrity": "sha1-hJgDKzttHMge68X3lpDY/in6v08=", + "dev": true + }, + "home-or-tmp": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/home-or-tmp/-/home-or-tmp-1.0.0.tgz", + "integrity": "sha1-S58eQIAMPlDGwn94FnavzOcfOYU=", + "dev": true, + "requires": { + "os-tmpdir": "^1.0.1", + "user-home": "^1.1.1" + } + }, + "is-extglob": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-1.0.0.tgz", + "integrity": "sha1-rEaBd8SUNAWgkvyPKXYMb/xiBsA=", + "dev": true + }, + "is-glob": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-2.0.1.tgz", + "integrity": "sha1-0Jb5JqPe1WAPP9/ZEZjLCIjC2GM=", + "dev": true, + "requires": { + "is-extglob": "^1.0.0" + } + }, + "js-tokens": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-1.0.1.tgz", + "integrity": "sha1-zENaXIuUrRWst5gxQPyAGCyJrq4=", + "dev": true + }, + "json5": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/json5/-/json5-0.4.0.tgz", + "integrity": "sha1-BUNS5MTIDIbAkjh31EneF2pzLI0=", + "dev": true + }, + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + }, + "lodash": { + "version": "3.10.1", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-3.10.1.tgz", + "integrity": "sha1-W/Rejkm6QYnhfUgnid/RW9FAt7Y=", + "dev": true + }, + "micromatch": { + "version": "2.3.11", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-2.3.11.tgz", + "integrity": "sha1-hmd8l9FyCzY0MdBNDRUpO9OMFWU=", + "dev": true, + "requires": { + "arr-diff": "^2.0.0", + "array-unique": "^0.2.1", + "braces": "^1.8.2", + "expand-brackets": "^0.1.4", + "extglob": "^0.3.1", + "filename-regex": "^2.0.0", + "is-extglob": "^1.0.0", + "is-glob": "^2.0.1", + "kind-of": "^3.0.2", + "normalize-path": "^2.0.1", + "object.omit": "^2.0.0", + "parse-glob": "^3.0.4", + "regex-cache": "^0.4.2" + } + }, + "minimist": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", + "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=", + "dev": true + }, + "normalize-path": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-2.1.1.tgz", + "integrity": "sha1-GrKLVW4Zg2Oowab35vogE3/mrtk=", + "dev": true, + "requires": { + "remove-trailing-separator": "^1.0.1" + } + }, + "output-file-sync": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/output-file-sync/-/output-file-sync-1.1.2.tgz", + "integrity": "sha1-0KM+7+YaIF+suQCS6CZZjVJFznY=", + "dev": true, + "requires": { + "graceful-fs": "^4.1.4", + "mkdirp": "^0.5.1", + "object-assign": "^4.1.0" + } + }, + "repeating": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/repeating/-/repeating-1.1.3.tgz", + "integrity": "sha1-PUEUIYh3U3SU+X93+Xhfq4EPpKw=", + "dev": true, + "requires": { + "is-finite": "^1.0.0" + } + }, + "slash": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-1.0.0.tgz", + "integrity": "sha1-xB8vbDn8FtHNF61LXYlhFK5HDVU=", + "dev": true + }, + "source-map-support": { + "version": "0.2.10", + "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.2.10.tgz", + "integrity": "sha1-6lo5AKHByyUJagrozFwrSxDe09w=", + "dev": true, + "requires": { + "source-map": "0.1.32" + }, + "dependencies": { + "source-map": { + "version": "0.1.32", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.1.32.tgz", + "integrity": "sha1-yLbBZ3l7pHQKjqMyUhYv8IWRsmY=", + "dev": true, + "requires": { + "amdefine": ">=0.0.4" + } + } + } + }, + "supports-color": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", + "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=", + "dev": true + }, + "to-fast-properties": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-1.0.3.tgz", + "integrity": "sha1-uDVx+k2MJbguIxsG46MFXeTKGkc=", + "dev": true + } + } + }, + "babel-code-frame": { + "version": "6.26.0", + "resolved": "https://registry.npmjs.org/babel-code-frame/-/babel-code-frame-6.26.0.tgz", + "integrity": "sha1-Y/1D99weO7fONZR9uP42mj9Yx0s=", + "dev": true, + "requires": { + "chalk": "^1.1.3", + "esutils": "^2.0.2", + "js-tokens": "^3.0.2" + }, + "dependencies": { + "ansi-styles": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", + "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=", + "dev": true + }, + "chalk": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", + "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", + "dev": true, + "requires": { + "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" + } + }, + "js-tokens": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-3.0.2.tgz", + "integrity": "sha1-mGbfOVECEw449/mWvOtlRDIJwls=", + "dev": true + }, + "supports-color": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", + "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=", + "dev": true + } + } + }, + "babel-core": { + "version": "6.26.3", + "resolved": "https://registry.npmjs.org/babel-core/-/babel-core-6.26.3.tgz", + "integrity": "sha512-6jyFLuDmeidKmUEb3NM+/yawG0M2bDZ9Z1qbZP59cyHLz8kYGKYwpJP0UwUKKUiTRNvxfLesJnTedqczP7cTDA==", + "dev": true, + "requires": { + "babel-code-frame": "^6.26.0", + "babel-generator": "^6.26.0", + "babel-helpers": "^6.24.1", + "babel-messages": "^6.23.0", + "babel-register": "^6.26.0", + "babel-runtime": "^6.26.0", + "babel-template": "^6.26.0", + "babel-traverse": "^6.26.0", + "babel-types": "^6.26.0", + "babylon": "^6.18.0", + "convert-source-map": "^1.5.1", + "debug": "^2.6.9", + "json5": "^0.5.1", + "lodash": "^4.17.4", + "minimatch": "^3.0.4", + "path-is-absolute": "^1.0.1", + "private": "^0.1.8", + "slash": "^1.0.0", + "source-map": "^0.5.7" + }, + "dependencies": { + "json5": { + "version": "0.5.1", + "resolved": "https://registry.npmjs.org/json5/-/json5-0.5.1.tgz", + "integrity": "sha1-Hq3nrMASA0rYTiOWdn6tn6VJWCE=", + "dev": true + }, + "slash": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-1.0.0.tgz", + "integrity": "sha1-xB8vbDn8FtHNF61LXYlhFK5HDVU=", + "dev": true + } + } + }, + "babel-generator": { + "version": "6.26.1", + "resolved": "https://registry.npmjs.org/babel-generator/-/babel-generator-6.26.1.tgz", + "integrity": "sha512-HyfwY6ApZj7BYTcJURpM5tznulaBvyio7/0d4zFOeMPUmfxkCjHocCuoLa2SAGzBI8AREcH3eP3758F672DppA==", + "dev": true, + "requires": { + "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" + }, + "dependencies": { + "jsesc": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-1.3.0.tgz", + "integrity": "sha1-RsP+yMGJKxKwgz25vHYiF226s0s=", + "dev": true + } + } + }, + "babel-helpers": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-helpers/-/babel-helpers-6.24.1.tgz", + "integrity": "sha1-NHHenK7DiOXIUOWX5Yom3fN2ArI=", + "dev": true, + "requires": { + "babel-runtime": "^6.22.0", + "babel-template": "^6.24.1" + } + }, + "babel-loader": { + "version": "8.0.6", + "resolved": "https://registry.npmjs.org/babel-loader/-/babel-loader-8.0.6.tgz", + "integrity": "sha512-4BmWKtBOBm13uoUwd08UwjZlaw3O9GWf456R9j+5YykFZ6LUIjIKLc0zEZf+hauxPOJs96C8k6FvYD09vWzhYw==", + "dev": true, + "requires": { + "find-cache-dir": "^2.0.0", + "loader-utils": "^1.0.2", + "mkdirp": "^0.5.1", + "pify": "^4.0.1" + } + }, + "babel-messages": { + "version": "6.23.0", + "resolved": "https://registry.npmjs.org/babel-messages/-/babel-messages-6.23.0.tgz", + "integrity": "sha1-8830cDhYA1sqKVHG7F7fbGLyYw4=", + "dev": true, + "requires": { + "babel-runtime": "^6.22.0" + } + }, + "babel-plugin-constant-folding": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/babel-plugin-constant-folding/-/babel-plugin-constant-folding-1.0.1.tgz", + "integrity": "sha1-g2HTZMmORJw2kr26Ue/whEKQqo4=", + "dev": true + }, + "babel-plugin-dead-code-elimination": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/babel-plugin-dead-code-elimination/-/babel-plugin-dead-code-elimination-1.0.2.tgz", + "integrity": "sha1-X3xFEnTc18zNv7s+C4XdKBIfD2U=", + "dev": true + }, + "babel-plugin-dynamic-import-node": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/babel-plugin-dynamic-import-node/-/babel-plugin-dynamic-import-node-2.3.0.tgz", + "integrity": "sha512-o6qFkpeQEBxcqt0XYlWzAVxNCSCZdUgcR8IRlhD/8DylxjjO4foPcvTW0GGKa/cVt3rvxZ7o5ippJ+/0nvLhlQ==", + "dev": true, + "requires": { + "object.assign": "^4.1.0" + } + }, + "babel-plugin-eval": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/babel-plugin-eval/-/babel-plugin-eval-1.0.1.tgz", + "integrity": "sha1-ovrtJc5r5preS/7CY/cBaRlZUNo=", + "dev": true + }, + "babel-plugin-inline-environment-variables": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/babel-plugin-inline-environment-variables/-/babel-plugin-inline-environment-variables-1.0.1.tgz", + "integrity": "sha1-H1jOkSB61qgmqL9kX6/mj/X+P/4=", + "dev": true + }, + "babel-plugin-jscript": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/babel-plugin-jscript/-/babel-plugin-jscript-1.0.4.tgz", + "integrity": "sha1-jzQsOCduh6R9X6CovT1etsytj8w=", + "dev": true + }, + "babel-plugin-member-expression-literals": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/babel-plugin-member-expression-literals/-/babel-plugin-member-expression-literals-1.0.1.tgz", + "integrity": "sha1-zF7bD6qNyScXDnTW0cAkQAIWJNM=", + "dev": true + }, + "babel-plugin-property-literals": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/babel-plugin-property-literals/-/babel-plugin-property-literals-1.0.1.tgz", + "integrity": "sha1-AlIwGQAZKYCxwRjv6kjOk6q4MzY=", + "dev": true + }, + "babel-plugin-proto-to-assign": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/babel-plugin-proto-to-assign/-/babel-plugin-proto-to-assign-1.0.4.tgz", + "integrity": "sha1-xJ56/QL1d7xNoF6i3wAiUM980SM=", + "dev": true, + "requires": { + "lodash": "^3.9.3" + }, + "dependencies": { + "lodash": { + "version": "3.10.1", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-3.10.1.tgz", + "integrity": "sha1-W/Rejkm6QYnhfUgnid/RW9FAt7Y=", + "dev": true + } + } + }, + "babel-plugin-react-constant-elements": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/babel-plugin-react-constant-elements/-/babel-plugin-react-constant-elements-1.0.3.tgz", + "integrity": "sha1-lGc26DeEKcvDSdz/YvUcFDs041o=", + "dev": true + }, + "babel-plugin-react-display-name": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/babel-plugin-react-display-name/-/babel-plugin-react-display-name-1.0.3.tgz", + "integrity": "sha1-dU/jiSboQkpOexWrbqYTne4FFPw=", + "dev": true + }, + "babel-plugin-remove-console": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/babel-plugin-remove-console/-/babel-plugin-remove-console-1.0.1.tgz", + "integrity": "sha1-2PJFVsOgUAXUKqqv0neH9T/wE6c=", + "dev": true + }, + "babel-plugin-remove-debugger": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/babel-plugin-remove-debugger/-/babel-plugin-remove-debugger-1.0.1.tgz", + "integrity": "sha1-/S6jzWGkKK0fO5yJiC/0KT6MFMc=", + "dev": true + }, + "babel-plugin-runtime": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/babel-plugin-runtime/-/babel-plugin-runtime-1.0.7.tgz", + "integrity": "sha1-v3x9lm3Vbs1cF/ocslPJrLflSq8=", + "dev": true + }, + "babel-plugin-undeclared-variables-check": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/babel-plugin-undeclared-variables-check/-/babel-plugin-undeclared-variables-check-1.0.2.tgz", + "integrity": "sha1-XPGqU52BP/ZOmWQSkK9iCWX2Xe4=", + "dev": true, + "requires": { + "leven": "^1.0.2" + } + }, + "babel-plugin-undefined-to-void": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/babel-plugin-undefined-to-void/-/babel-plugin-undefined-to-void-1.1.6.tgz", + "integrity": "sha1-f1eO+LeN+uYAM4XYQXph7aBuL4E=", + "dev": true + }, + "babel-register": { + "version": "6.26.0", + "resolved": "https://registry.npmjs.org/babel-register/-/babel-register-6.26.0.tgz", + "integrity": "sha1-btAhFz4vy0htestFxgCahW9kcHE=", + "dev": true, + "requires": { + "babel-core": "^6.26.0", + "babel-runtime": "^6.26.0", + "core-js": "^2.5.0", + "home-or-tmp": "^2.0.0", + "lodash": "^4.17.4", + "mkdirp": "^0.5.1", + "source-map-support": "^0.4.15" + }, + "dependencies": { + "core-js": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/core-js/-/core-js-2.6.9.tgz", + "integrity": "sha512-HOpZf6eXmnl7la+cUdMnLvUxKNqLUzJvgIziQ0DiF3JwSImNphIqdGqzj6hIKyX04MmV0poclQ7+wjWvxQyR2A==", + "dev": true + } + } + }, + "babel-runtime": { + "version": "6.26.0", + "resolved": "https://registry.npmjs.org/babel-runtime/-/babel-runtime-6.26.0.tgz", + "integrity": "sha1-llxwWGaOgrVde/4E/yM3vItWR/4=", + "dev": true, + "requires": { + "core-js": "^2.4.0", + "regenerator-runtime": "^0.11.0" + }, + "dependencies": { + "core-js": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/core-js/-/core-js-2.6.9.tgz", + "integrity": "sha512-HOpZf6eXmnl7la+cUdMnLvUxKNqLUzJvgIziQ0DiF3JwSImNphIqdGqzj6hIKyX04MmV0poclQ7+wjWvxQyR2A==", + "dev": true + } + } + }, + "babel-template": { + "version": "6.26.0", + "resolved": "https://registry.npmjs.org/babel-template/-/babel-template-6.26.0.tgz", + "integrity": "sha1-3gPi0WOWsGn0bdn/+FIfsaDjXgI=", + "dev": true, + "requires": { + "babel-runtime": "^6.26.0", + "babel-traverse": "^6.26.0", + "babel-types": "^6.26.0", + "babylon": "^6.18.0", + "lodash": "^4.17.4" + } + }, + "babel-traverse": { + "version": "6.26.0", + "resolved": "https://registry.npmjs.org/babel-traverse/-/babel-traverse-6.26.0.tgz", + "integrity": "sha1-RqnL1+3MYsjlwGTi0tjQ9ANXZu4=", + "dev": true, + "requires": { + "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" + }, + "dependencies": { + "globals": { + "version": "9.18.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-9.18.0.tgz", + "integrity": "sha512-S0nG3CLEQiY/ILxqtztTWH/3iRRdyBLw6KMDxnKMchrtbj2OFmehVh0WUCfW3DUrIgx/qFrJPICrq4Z4sTR9UQ==", + "dev": true + } + } + }, + "babel-types": { + "version": "6.26.0", + "resolved": "https://registry.npmjs.org/babel-types/-/babel-types-6.26.0.tgz", + "integrity": "sha1-o7Bz+Uq0nrb6Vc1lInozQ4BjJJc=", + "dev": true, + "requires": { + "babel-runtime": "^6.26.0", + "esutils": "^2.0.2", + "lodash": "^4.17.4", + "to-fast-properties": "^1.0.3" + }, + "dependencies": { + "to-fast-properties": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-1.0.3.tgz", + "integrity": "sha1-uDVx+k2MJbguIxsG46MFXeTKGkc=", + "dev": true + } + } + }, + "babylon": { + "version": "6.18.0", + "resolved": "https://registry.npmjs.org/babylon/-/babylon-6.18.0.tgz", + "integrity": "sha512-q/UEjfGJ2Cm3oKV71DJz9d25TPnq5rhBVL2Q4fA5wcC3jcrdn7+SssEybFIxwAvvP+YCsCYNKughoF33GxgycQ==", + "dev": true + }, + "balanced-match": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz", + "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=", + "dev": true + }, + "base": { + "version": "0.11.2", + "resolved": "https://registry.npmjs.org/base/-/base-0.11.2.tgz", + "integrity": "sha512-5T6P4xPgpp0YDFvSWwEZ4NoE3aM4QBQXDzmVbraCkFj8zHM+mba8SyqB5DbZWyR7mYHo6Y7BdQo3MoA4m0TeQg==", + "dev": true, + "requires": { + "cache-base": "^1.0.1", + "class-utils": "^0.3.5", + "component-emitter": "^1.2.1", + "define-property": "^1.0.0", + "isobject": "^3.0.1", + "mixin-deep": "^1.2.0", + "pascalcase": "^0.1.1" + }, + "dependencies": { + "define-property": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", + "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", + "dev": true, + "requires": { + "is-descriptor": "^1.0.0" + } + }, + "is-accessor-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", + "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", + "dev": true, + "requires": { + "kind-of": "^6.0.0" + } + }, + "is-data-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", + "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", + "dev": true, + "requires": { + "kind-of": "^6.0.0" + } + }, + "is-descriptor": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", + "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", + "dev": true, + "requires": { + "is-accessor-descriptor": "^1.0.0", + "is-data-descriptor": "^1.0.0", + "kind-of": "^6.0.2" + } + } + } + }, + "base64-js": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.3.1.tgz", + "integrity": "sha512-mLQ4i2QO1ytvGWFWmcngKO//JXAQueZvwEKtjgQFM4jIK0kU+ytMfplL8j+n5mspOfjHwoAg+9yhb7BwAHm36g==", + "dev": true + }, + "batch": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/batch/-/batch-0.6.1.tgz", + "integrity": "sha1-3DQxT05nkxgJP8dgJyUl+UvyXBY=", + "dev": true + }, + "big.js": { + "version": "5.2.2", + "resolved": "https://registry.npmjs.org/big.js/-/big.js-5.2.2.tgz", + "integrity": "sha512-vyL2OymJxmarO8gxMr0mhChsO9QGwhynfuu4+MHTAW6czfq9humCB7rKpUjDd9YUiDPU4mzpyupFSvOClAwbmQ==", + "dev": true + }, + "binary-extensions": { + "version": "1.13.1", + "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-1.13.1.tgz", + "integrity": "sha512-Un7MIEDdUC5gNpcGDV97op1Ywk748MpHcFTHoYs6qnj1Z3j7I53VG3nwZhKzoBZmbdRNnb6WRdFlwl7tSDuZGw==", + "dev": true + }, + "bluebird": { + "version": "2.11.0", + "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-2.11.0.tgz", + "integrity": "sha1-U0uQM8AiyVecVro7Plpcqvu2UOE=", + "dev": true + }, + "bn.js": { + "version": "4.11.8", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.11.8.tgz", + "integrity": "sha512-ItfYfPLkWHUjckQCk8xC+LwxgK8NYcXywGigJgSwOP8Y2iyWT4f2vsZnoOXTTbo+o5yXmIUJ4gn5538SO5S3gA==", + "dev": true + }, + "body-parser": { + "version": "1.19.0", + "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.19.0.tgz", + "integrity": "sha512-dhEPs72UPbDnAQJ9ZKMNTP6ptJaionhP5cBb541nXPlW60Jepo9RV/a4fX4XWW9CuFNK22krhrj1+rgzifNCsw==", + "dev": true, + "requires": { + "bytes": "3.1.0", + "content-type": "~1.0.4", + "debug": "2.6.9", + "depd": "~1.1.2", + "http-errors": "1.7.2", + "iconv-lite": "0.4.24", + "on-finished": "~2.3.0", + "qs": "6.7.0", + "raw-body": "2.4.0", + "type-is": "~1.6.17" + }, + "dependencies": { + "bytes": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.0.tgz", + "integrity": "sha512-zauLjrfCG+xvoyaqLoV8bLVXXNGC4JqlxFCutSDWA6fJrTo2ZuvLYTqZ7aHBLZSMOopbzwv8f+wZcVzfVTI2Dg==", + "dev": true + } + } + }, + "bonjour": { + "version": "3.5.0", + "resolved": "https://registry.npmjs.org/bonjour/-/bonjour-3.5.0.tgz", + "integrity": "sha1-jokKGD2O6aI5OzhExpGkK897yfU=", + "dev": true, + "requires": { + "array-flatten": "^2.1.0", + "deep-equal": "^1.0.1", + "dns-equal": "^1.0.0", + "dns-txt": "^2.0.2", + "multicast-dns": "^6.0.1", + "multicast-dns-service-types": "^1.1.0" + } + }, + "boxen": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/boxen/-/boxen-1.3.0.tgz", + "integrity": "sha512-TNPjfTr432qx7yOjQyaXm3dSR0MH9vXp7eT1BFSl/C51g+EFnOR9hTg1IreahGBmDNCehscshe45f+C1TBZbLw==", + "dev": true, + "requires": { + "ansi-align": "^2.0.0", + "camelcase": "^4.0.0", + "chalk": "^2.0.1", + "cli-boxes": "^1.0.0", + "string-width": "^2.0.0", + "term-size": "^1.2.0", + "widest-line": "^2.0.0" + }, + "dependencies": { + "camelcase": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-4.1.0.tgz", + "integrity": "sha1-1UVjW+HjPFQmScaRc+Xeas+uNN0=", + "dev": true + } + } + }, + "brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dev": true, + "requires": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "braces": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.2.tgz", + "integrity": "sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==", + "dev": true, + "requires": { + "arr-flatten": "^1.1.0", + "array-unique": "^0.3.2", + "extend-shallow": "^2.0.1", + "fill-range": "^4.0.0", + "isobject": "^3.0.1", + "repeat-element": "^1.1.2", + "snapdragon": "^0.8.1", + "snapdragon-node": "^2.0.1", + "split-string": "^3.0.2", + "to-regex": "^3.0.1" + }, + "dependencies": { + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "requires": { + "is-extendable": "^0.1.0" + } + } + } + }, + "breakable": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/breakable/-/breakable-1.0.0.tgz", + "integrity": "sha1-eEp5eRWjjq0nutRWtVcstLuqeME=", + "dev": true + }, + "brorand": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/brorand/-/brorand-1.1.0.tgz", + "integrity": "sha1-EsJe/kCkXjwyPrhnWgoM5XsiNx8=", + "dev": true + }, + "browserify-aes": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/browserify-aes/-/browserify-aes-1.2.0.tgz", + "integrity": "sha512-+7CHXqGuspUn/Sl5aO7Ea0xWGAtETPXNSAjHo48JfLdPWcMng33Xe4znFvQweqc/uzk5zSOI3H52CYnjCfb5hA==", + "dev": true, + "requires": { + "buffer-xor": "^1.0.3", + "cipher-base": "^1.0.0", + "create-hash": "^1.1.0", + "evp_bytestokey": "^1.0.3", + "inherits": "^2.0.1", + "safe-buffer": "^5.0.1" + } + }, + "browserify-cipher": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/browserify-cipher/-/browserify-cipher-1.0.1.tgz", + "integrity": "sha512-sPhkz0ARKbf4rRQt2hTpAHqn47X3llLkUGn+xEJzLjwY8LRs2p0v7ljvI5EyoRO/mexrNunNECisZs+gw2zz1w==", + "dev": true, + "requires": { + "browserify-aes": "^1.0.4", + "browserify-des": "^1.0.0", + "evp_bytestokey": "^1.0.0" + } + }, + "browserify-des": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/browserify-des/-/browserify-des-1.0.2.tgz", + "integrity": "sha512-BioO1xf3hFwz4kc6iBhI3ieDFompMhrMlnDFC4/0/vd5MokpuAc3R+LYbwTA9A5Yc9pq9UYPqffKpW2ObuwX5A==", + "dev": true, + "requires": { + "cipher-base": "^1.0.1", + "des.js": "^1.0.0", + "inherits": "^2.0.1", + "safe-buffer": "^5.1.2" + } + }, + "browserify-rsa": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/browserify-rsa/-/browserify-rsa-4.0.1.tgz", + "integrity": "sha1-IeCr+vbyApzy+vsTNWenAdQTVSQ=", + "dev": true, + "requires": { + "bn.js": "^4.1.0", + "randombytes": "^2.0.1" + } + }, + "browserify-sign": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/browserify-sign/-/browserify-sign-4.0.4.tgz", + "integrity": "sha1-qk62jl17ZYuqa/alfmMMvXqT0pg=", + "dev": true, + "requires": { + "bn.js": "^4.1.1", + "browserify-rsa": "^4.0.0", + "create-hash": "^1.1.0", + "create-hmac": "^1.1.2", + "elliptic": "^6.0.0", + "inherits": "^2.0.1", + "parse-asn1": "^5.0.0" + } + }, + "browserify-zlib": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/browserify-zlib/-/browserify-zlib-0.2.0.tgz", + "integrity": "sha512-Z942RysHXmJrhqk88FmKBVq/v5tqmSkDz7p54G/MGyjMnCFFnC79XWNbg+Vta8W6Wb2qtSZTSxIGkJrRpCFEiA==", + "dev": true, + "requires": { + "pako": "~1.0.5" + } + }, + "browserslist": { + "version": "4.7.0", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.7.0.tgz", + "integrity": "sha512-9rGNDtnj+HaahxiVV38Gn8n8Lr8REKsel68v1sPFfIGEK6uSXTY3h9acgiT1dZVtOOUtifo/Dn8daDQ5dUgVsA==", + "dev": true, + "requires": { + "caniuse-lite": "^1.0.30000989", + "electron-to-chromium": "^1.3.247", + "node-releases": "^1.1.29" + } + }, + "buffer": { + "version": "4.9.1", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-4.9.1.tgz", + "integrity": "sha1-bRu2AbB6TvztlwlBMgkwJ8lbwpg=", + "dev": true, + "requires": { + "base64-js": "^1.0.2", + "ieee754": "^1.1.4", + "isarray": "^1.0.0" + } + }, + "buffer-from": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.1.tgz", + "integrity": "sha512-MQcXEUbCKtEo7bhqEs6560Hyd4XaovZlO/k9V3hjVUF/zwW7KBVdSK4gIt/bzwS9MbR5qob+F5jusZsb0YQK2A==", + "dev": true + }, + "buffer-indexof": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/buffer-indexof/-/buffer-indexof-1.1.1.tgz", + "integrity": "sha512-4/rOEg86jivtPTeOUUT61jJO1Ya1TrR/OkqCSZDyq84WJh3LuuiphBYJN+fm5xufIk4XAFcEwte/8WzC8If/1g==", + "dev": true + }, + "buffer-xor": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/buffer-xor/-/buffer-xor-1.0.3.tgz", + "integrity": "sha1-JuYe0UIvtw3ULm42cp7VHYVf6Nk=", + "dev": true + }, + "builtin-status-codes": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/builtin-status-codes/-/builtin-status-codes-3.0.0.tgz", + "integrity": "sha1-hZgoeOIbmOHGZCXgPQF0eI9Wnug=", + "dev": true + }, + "bytes": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.0.0.tgz", + "integrity": "sha1-0ygVQE1olpn4Wk6k+odV3ROpYEg=", + "dev": true + }, + "cacache": { + "version": "12.0.3", + "resolved": "https://registry.npmjs.org/cacache/-/cacache-12.0.3.tgz", + "integrity": "sha512-kqdmfXEGFepesTuROHMs3MpFLWrPkSSpRqOw80RCflZXy/khxaArvFrQ7uJxSUduzAufc6G0g1VUCOZXxWavPw==", + "dev": true, + "requires": { + "bluebird": "^3.5.5", + "chownr": "^1.1.1", + "figgy-pudding": "^3.5.1", + "glob": "^7.1.4", + "graceful-fs": "^4.1.15", + "infer-owner": "^1.0.3", + "lru-cache": "^5.1.1", + "mississippi": "^3.0.0", + "mkdirp": "^0.5.1", + "move-concurrently": "^1.0.1", + "promise-inflight": "^1.0.1", + "rimraf": "^2.6.3", + "ssri": "^6.0.1", + "unique-filename": "^1.1.1", + "y18n": "^4.0.0" + }, + "dependencies": { + "bluebird": { + "version": "3.5.5", + "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.5.5.tgz", + "integrity": "sha512-5am6HnnfN+urzt4yfg7IgTbotDjIT/u8AJpEt0sIU9FtXfVeezXAPKswrG+xKUCOYAINpSdgZVDU6QFh+cuH3w==", + "dev": true + }, + "lru-cache": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", + "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", + "dev": true, + "requires": { + "yallist": "^3.0.2" + } + }, + "y18n": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-4.0.0.tgz", + "integrity": "sha512-r9S/ZyXu/Xu9q1tYlpsLIsa3EeLXXk0VwlxqTcFRfg9EhMW+17kbt9G0NrgCmhGb5vT2hyhJZLfDGx+7+5Uj/w==", + "dev": true + }, + "yallist": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.0.3.tgz", + "integrity": "sha512-S+Zk8DEWE6oKpV+vI3qWkaK+jSbIK86pCwe2IF/xwIpQ8jEuxpw9NyaGjmp9+BoJv5FV2piqCDcoCtStppiq2A==", + "dev": true + } + } + }, + "cache-base": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/cache-base/-/cache-base-1.0.1.tgz", + "integrity": "sha512-AKcdTnFSWATd5/GCPRxr2ChwIJ85CeyrEyjRHlKxQ56d4XJMGym0uAiKn0xbLOGOl3+yRpOTi484dVCEc5AUzQ==", + "dev": true, + "requires": { + "collection-visit": "^1.0.0", + "component-emitter": "^1.2.1", + "get-value": "^2.0.6", + "has-value": "^1.0.0", + "isobject": "^3.0.1", + "set-value": "^2.0.0", + "to-object-path": "^0.3.0", + "union-value": "^1.0.0", + "unset-value": "^1.0.0" + } + }, + "caller-path": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/caller-path/-/caller-path-0.1.0.tgz", + "integrity": "sha1-lAhe9jWB7NPaqSREqP6U6CV3dR8=", + "dev": true, + "requires": { + "callsites": "^0.2.0" + }, + "dependencies": { + "callsites": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/callsites/-/callsites-0.2.0.tgz", + "integrity": "sha1-r6uWJikQp/M8GaV3WCXGnzTjUMo=", + "dev": true + } + } + }, + "callsites": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", + "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", + "dev": true + }, + "camelcase": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-1.2.1.tgz", + "integrity": "sha1-m7UwTS4LVmmLLHWLCKPqqdqlijk=", + "dev": true + }, + "caniuse-lite": { + "version": "1.0.30000989", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30000989.tgz", + "integrity": "sha512-vrMcvSuMz16YY6GSVZ0dWDTJP8jqk3iFQ/Aq5iqblPwxSVVZI+zxDyTX0VPqtQsDnfdrBDcsmhgTEOh5R8Lbpw==", + "dev": true + }, + "capture-stack-trace": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/capture-stack-trace/-/capture-stack-trace-1.0.1.tgz", + "integrity": "sha512-mYQLZnx5Qt1JgB1WEiMCf2647plpGeQ2NMR/5L0HNZzGQo4fuSPnK+wjfPnKZV0aiJDgzmWqqkV/g7JD+DW0qw==", + "dev": true + }, + "center-align": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/center-align/-/center-align-0.1.3.tgz", + "integrity": "sha1-qg0yYptu6XIgBBHL1EYckHvCt60=", + "dev": true, + "requires": { + "align-text": "^0.1.3", + "lazy-cache": "^1.0.3" + } + }, + "chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "dev": true, + "requires": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + } + }, + "chardet": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/chardet/-/chardet-0.7.0.tgz", + "integrity": "sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA==", + "dev": true + }, + "chokidar": { + "version": "2.1.8", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-2.1.8.tgz", + "integrity": "sha512-ZmZUazfOzf0Nve7duiCKD23PFSCs4JPoYyccjUFF3aQkQadqBhfzhjkwBH2mNOG9cTBwhamM37EIsIkZw3nRgg==", + "dev": true, + "requires": { + "anymatch": "^2.0.0", + "async-each": "^1.0.1", + "braces": "^2.3.2", + "fsevents": "^1.2.7", + "glob-parent": "^3.1.0", + "inherits": "^2.0.3", + "is-binary-path": "^1.0.0", + "is-glob": "^4.0.0", + "normalize-path": "^3.0.0", + "path-is-absolute": "^1.0.0", + "readdirp": "^2.2.1", + "upath": "^1.1.1" + } + }, + "chownr": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/chownr/-/chownr-1.1.2.tgz", + "integrity": "sha512-GkfeAQh+QNy3wquu9oIZr6SS5x7wGdSgNQvD10X3r+AZr1Oys22HW8kAmDMvNg2+Dm0TeGaEuO8gFwdBXxwO8A==", + "dev": true + }, + "chrome-trace-event": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/chrome-trace-event/-/chrome-trace-event-1.0.2.tgz", + "integrity": "sha512-9e/zx1jw7B4CO+c/RXoCsfg/x1AfUBioy4owYH0bJprEYAx5hRFLRhWBqHAG57D0ZM4H7vxbP7bPe0VwhQRYDQ==", + "dev": true, + "requires": { + "tslib": "^1.9.0" + } + }, + "ci-info": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-1.6.0.tgz", + "integrity": "sha512-vsGdkwSCDpWmP80ncATX7iea5DWQemg1UgCW5J8tqjU3lYw4FBYuj89J0CTVomA7BEfvSZd84GmHko+MxFQU2A==", + "dev": true + }, + "cipher-base": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/cipher-base/-/cipher-base-1.0.4.tgz", + "integrity": "sha512-Kkht5ye6ZGmwv40uUDZztayT2ThLQGfnj/T71N/XzeZeo3nf8foyW7zGTsPYkEya3m5f3cAypH+qe7YOrM1U2Q==", + "dev": true, + "requires": { + "inherits": "^2.0.1", + "safe-buffer": "^5.0.1" + } + }, + "circular-json": { + "version": "0.3.3", + "resolved": "https://registry.npmjs.org/circular-json/-/circular-json-0.3.3.tgz", + "integrity": "sha512-UZK3NBx2Mca+b5LsG7bY183pHWt5Y1xts4P3Pz7ENTwGVnJOUWbRb3ocjvX7hx9tq/yTAdclXm9sZ38gNuem4A==", + "dev": true + }, + "class-utils": { + "version": "0.3.6", + "resolved": "https://registry.npmjs.org/class-utils/-/class-utils-0.3.6.tgz", + "integrity": "sha512-qOhPa/Fj7s6TY8H8esGu5QNpMMQxz79h+urzrNYN6mn+9BnxlDGf5QZ+XeCDsxSjPqsSR56XOZOJmpeurnLMeg==", + "dev": true, + "requires": { + "arr-union": "^3.1.0", + "define-property": "^0.2.5", + "isobject": "^3.0.0", + "static-extend": "^0.1.1" + }, + "dependencies": { + "define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", + "dev": true, + "requires": { + "is-descriptor": "^0.1.0" + } + } + } + }, + "cli-boxes": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/cli-boxes/-/cli-boxes-1.0.0.tgz", + "integrity": "sha1-T6kXw+WclKAEzWH47lCdplFocUM=", + "dev": true + }, + "cli-cursor": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-2.1.0.tgz", + "integrity": "sha1-s12sN2R5+sw+lHR9QdDQ9SOP/LU=", + "dev": true, + "requires": { + "restore-cursor": "^2.0.0" + } + }, + "cli-width": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/cli-width/-/cli-width-2.2.0.tgz", + "integrity": "sha1-/xnt6Kml5XkyQUewwR8PvLq+1jk=", + "dev": true + }, + "cliui": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-2.1.0.tgz", + "integrity": "sha1-S0dXYP+AJkx2LDoXGQMukcf+oNE=", + "dev": true, + "requires": { + "center-align": "^0.1.1", + "right-align": "^0.1.1", + "wordwrap": "0.0.2" + } + }, + "co": { + "version": "4.6.0", + "resolved": "https://registry.npmjs.org/co/-/co-4.6.0.tgz", + "integrity": "sha1-bqa989hTrlTMuOR7+gvz+QMfsYQ=", + "dev": true + }, + "code-point-at": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/code-point-at/-/code-point-at-1.1.0.tgz", + "integrity": "sha1-DQcLTQQ6W+ozovGkDi7bPZpMz3c=", + "dev": true + }, + "collection-visit": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/collection-visit/-/collection-visit-1.0.0.tgz", + "integrity": "sha1-S8A3PBZLwykbTTaMgpzxqApZ3KA=", + "dev": true, + "requires": { + "map-visit": "^1.0.0", + "object-visit": "^1.0.0" + } + }, + "color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "dev": true, + "requires": { + "color-name": "1.1.3" + } + }, + "color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=", + "dev": true + }, + "commander": { + "version": "2.20.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.0.tgz", + "integrity": "sha512-7j2y+40w61zy6YC2iRNpUe/NwhNyoXrYpHMrSunaMG64nRnaf96zO/KMQR4OyN/UnE5KLyEBnKHd4aG3rskjpQ==", + "dev": true + }, + "commondir": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/commondir/-/commondir-1.0.1.tgz", + "integrity": "sha1-3dgA2gxmEnOTzKWVDqloo6rxJTs=", + "dev": true + }, + "commoner": { + "version": "0.10.8", + "resolved": "https://registry.npmjs.org/commoner/-/commoner-0.10.8.tgz", + "integrity": "sha1-NPw2cs0kOT6LtH5wyqApOBH08sU=", + "dev": true, + "requires": { + "commander": "^2.5.0", + "detective": "^4.3.1", + "glob": "^5.0.15", + "graceful-fs": "^4.1.2", + "iconv-lite": "^0.4.5", + "mkdirp": "^0.5.0", + "private": "^0.1.6", + "q": "^1.1.2", + "recast": "^0.11.17" + }, + "dependencies": { + "esprima": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/esprima/-/esprima-3.1.3.tgz", + "integrity": "sha1-/cpRzuYTOJXjyI1TXOSdv/YqRjM=", + "dev": true + }, + "glob": { + "version": "5.0.15", + "resolved": "https://registry.npmjs.org/glob/-/glob-5.0.15.tgz", + "integrity": "sha1-G8k2ueAvSmA/zCIuz3Yz0wuLk7E=", + "dev": true, + "requires": { + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "2 || 3", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + } + }, + "recast": { + "version": "0.11.23", + "resolved": "https://registry.npmjs.org/recast/-/recast-0.11.23.tgz", + "integrity": "sha1-RR/TAEqx5N+bTktmN2sqIZEkYtM=", + "dev": true, + "requires": { + "ast-types": "0.9.6", + "esprima": "~3.1.0", + "private": "~0.1.5", + "source-map": "~0.5.0" + } + } + } + }, + "component-emitter": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.3.0.tgz", + "integrity": "sha512-Rd3se6QB+sO1TwqZjscQrurpEPIfO0/yYnSin6Q/rD3mOutHvUrCAhJub3r90uNb+SESBuE0QYoB90YdfatsRg==", + "dev": true + }, + "compressible": { + "version": "2.0.17", + "resolved": "https://registry.npmjs.org/compressible/-/compressible-2.0.17.tgz", + "integrity": "sha512-BGHeLCK1GV7j1bSmQQAi26X+GgWcTjLr/0tzSvMCl3LH1w1IJ4PFSPoV5316b30cneTziC+B1a+3OjoSUcQYmw==", + "dev": true, + "requires": { + "mime-db": ">= 1.40.0 < 2" + } + }, + "compression": { + "version": "1.7.4", + "resolved": "https://registry.npmjs.org/compression/-/compression-1.7.4.tgz", + "integrity": "sha512-jaSIDzP9pZVS4ZfQ+TzvtiWhdpFhE2RDHz8QJkpX9SIpLq88VueF5jJw6t+6CUQcAoA6t+x89MLrWAqpfDE8iQ==", + "dev": true, + "requires": { + "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": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=", + "dev": true + }, + "concat-stream": { + "version": "1.6.2", + "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-1.6.2.tgz", + "integrity": "sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw==", + "dev": true, + "requires": { + "buffer-from": "^1.0.0", + "inherits": "^2.0.3", + "readable-stream": "^2.2.2", + "typedarray": "^0.0.6" + } + }, + "configstore": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/configstore/-/configstore-3.1.2.tgz", + "integrity": "sha512-vtv5HtGjcYUgFrXc6Kx747B83MRRVS5R1VTEQoXvuP+kMI+if6uywV0nDGoiydJRy4yk7h9od5Og0kxx4zUXmw==", + "dev": true, + "requires": { + "dot-prop": "^4.1.0", + "graceful-fs": "^4.1.2", + "make-dir": "^1.0.0", + "unique-string": "^1.0.0", + "write-file-atomic": "^2.0.0", + "xdg-basedir": "^3.0.0" + }, + "dependencies": { + "make-dir": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-1.3.0.tgz", + "integrity": "sha512-2w31R7SJtieJJnQtGc7RVL2StM2vGYVfqUOvUDxH6bC6aJTxPxTF0GnIgCyu7tjockiUWAYQRbxa7vKn34s5sQ==", + "dev": true, + "requires": { + "pify": "^3.0.0" + } + }, + "pify": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", + "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=", + "dev": true + } + } + }, + "confusing-browser-globals": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/confusing-browser-globals/-/confusing-browser-globals-1.0.8.tgz", + "integrity": "sha512-lI7asCibVJ6Qd3FGU7mu4sfG4try4LX3+GVS+Gv8UlrEf2AeW57piecapnog2UHZSbcX/P/1UDWVaTsblowlZg==", + "dev": true + }, + "connect-history-api-fallback": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/connect-history-api-fallback/-/connect-history-api-fallback-1.6.0.tgz", + "integrity": "sha512-e54B99q/OUoH64zYYRf3HBP5z24G38h5D3qXu23JGRoigpX5Ss4r9ZnDk3g0Z8uQC2x2lPaJ+UlWBc1ZWBWdLg==", + "dev": true + }, + "console-browserify": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/console-browserify/-/console-browserify-1.1.0.tgz", + "integrity": "sha1-8CQcRXMKn8YyOyBtvzjtx0HQuxA=", + "dev": true, + "requires": { + "date-now": "^0.1.4" + } + }, + "constants-browserify": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/constants-browserify/-/constants-browserify-1.0.0.tgz", + "integrity": "sha1-wguW2MYXdIqvHBYCF2DNJ/y4y3U=", + "dev": true + }, + "contains-path": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/contains-path/-/contains-path-0.1.0.tgz", + "integrity": "sha1-/ozxhP9mcLa67wGp1IYaXL7EEgo=", + "dev": true + }, + "content-disposition": { + "version": "0.5.3", + "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.3.tgz", + "integrity": "sha512-ExO0774ikEObIAEV9kDo50o+79VCUdEB6n6lzKgGwupcVeRlhrj3qGAfwq8G6uBJjkqLrhT0qEYFcWng8z1z0g==", + "dev": true, + "requires": { + "safe-buffer": "5.1.2" + } + }, + "content-type": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.4.tgz", + "integrity": "sha512-hIP3EEPs8tB9AT1L+NUqtwOAps4mk2Zob89MWXMHjHWg9milF/j4osnnQLXBCBFBk/tvIG/tUc9mOUJiPBhPXA==", + "dev": true + }, + "convert-source-map": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.6.0.tgz", + "integrity": "sha512-eFu7XigvxdZ1ETfbgPBohgyQ/Z++C0eEhTor0qRwBw9unw+L0/6V8wkSuGgzdThkiS5lSpdptOQPD8Ak40a+7A==", + "dev": true, + "requires": { + "safe-buffer": "~5.1.1" + } + }, + "cookie": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.4.0.tgz", + "integrity": "sha512-+Hp8fLp57wnUSt0tY0tHEXh4voZRDnoIrZPqlo3DPiI4y9lwg/jqx+1Om94/W6ZaPDOUbnjOt/99w66zk+l1Xg==", + "dev": true + }, + "cookie-signature": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz", + "integrity": "sha1-4wOogrNCzD7oylE6eZmXNNqzriw=", + "dev": true + }, + "copy-concurrently": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/copy-concurrently/-/copy-concurrently-1.0.5.tgz", + "integrity": "sha512-f2domd9fsVDFtaFcbaRZuYXwtdmnzqbADSwhSWYxYB/Q8zsdUUFMXVRwXGDMWmbEzAn1kdRrtI1T/KTFOL4X2A==", + "dev": true, + "requires": { + "aproba": "^1.1.1", + "fs-write-stream-atomic": "^1.0.8", + "iferr": "^0.1.5", + "mkdirp": "^0.5.1", + "rimraf": "^2.5.4", + "run-queue": "^1.0.0" + } + }, + "copy-descriptor": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/copy-descriptor/-/copy-descriptor-0.1.1.tgz", + "integrity": "sha1-Z29us8OZl8LuGsOpJP1hJHSPV40=", + "dev": true + }, + "core-js": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/core-js/-/core-js-3.2.1.tgz", + "integrity": "sha512-Qa5XSVefSVPRxy2XfUC13WbvqkxhkwB3ve+pgCQveNgYzbM/UxZeu1dcOX/xr4UmfUd+muuvsaxilQzCyUurMw==", + "dev": true + }, + "core-js-compat": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.2.1.tgz", + "integrity": "sha512-MwPZle5CF9dEaMYdDeWm73ao/IflDH+FjeJCWEADcEgFSE9TLimFKwJsfmkwzI8eC0Aj0mgvMDjeQjrElkz4/A==", + "dev": true, + "requires": { + "browserslist": "^4.6.6", + "semver": "^6.3.0" + }, + "dependencies": { + "semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "dev": true + } + } + }, + "core-util-is": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", + "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=" + }, + "create-ecdh": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/create-ecdh/-/create-ecdh-4.0.3.tgz", + "integrity": "sha512-GbEHQPMOswGpKXM9kCWVrremUcBmjteUaQ01T9rkKCPDXfUHX0IoP9LpHYo2NPFampa4e+/pFDc3jQdxrxQLaw==", + "dev": true, + "requires": { + "bn.js": "^4.1.0", + "elliptic": "^6.0.0" + } + }, + "create-error-class": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/create-error-class/-/create-error-class-3.0.2.tgz", + "integrity": "sha1-Br56vvlHo/FKMP1hBnHUAbyot7Y=", + "dev": true, + "requires": { + "capture-stack-trace": "^1.0.0" + } + }, + "create-hash": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/create-hash/-/create-hash-1.2.0.tgz", + "integrity": "sha512-z00bCGNHDG8mHAkP7CtT1qVu+bFQUPjYq/4Iv3C3kWjTFV10zIjfSoeqXo9Asws8gwSHDGj/hl2u4OGIjapeCg==", + "dev": true, + "requires": { + "cipher-base": "^1.0.1", + "inherits": "^2.0.1", + "md5.js": "^1.3.4", + "ripemd160": "^2.0.1", + "sha.js": "^2.4.0" + } + }, + "create-hmac": { + "version": "1.1.7", + "resolved": "https://registry.npmjs.org/create-hmac/-/create-hmac-1.1.7.tgz", + "integrity": "sha512-MJG9liiZ+ogc4TzUwuvbER1JRdgvUFSB5+VR/g5h82fGaIRWMWddtKBHi7/sVhfjQZ6SehlyhvQYrcYkaUIpLg==", + "dev": true, + "requires": { + "cipher-base": "^1.0.3", + "create-hash": "^1.1.0", + "inherits": "^2.0.1", + "ripemd160": "^2.0.0", + "safe-buffer": "^5.0.1", + "sha.js": "^2.4.8" + } + }, + "cross-spawn": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-5.1.0.tgz", + "integrity": "sha1-6L0O/uWPz/b4+UUQoKVUu/ojVEk=", + "dev": true, + "requires": { + "lru-cache": "^4.0.1", + "shebang-command": "^1.2.0", + "which": "^1.2.9" + } + }, + "crypto-browserify": { + "version": "3.12.0", + "resolved": "https://registry.npmjs.org/crypto-browserify/-/crypto-browserify-3.12.0.tgz", + "integrity": "sha512-fz4spIh+znjO2VjL+IdhEpRJ3YN6sMzITSBijk6FK2UvTqruSQW+/cCZTSNsMiZNvUeq0CqurF+dAbyiGOY6Wg==", + "dev": true, + "requires": { + "browserify-cipher": "^1.0.0", + "browserify-sign": "^4.0.0", + "create-ecdh": "^4.0.0", + "create-hash": "^1.1.0", + "create-hmac": "^1.1.0", + "diffie-hellman": "^5.0.0", + "inherits": "^2.0.1", + "pbkdf2": "^3.0.3", + "public-encrypt": "^4.0.0", + "randombytes": "^2.0.0", + "randomfill": "^1.0.3" + } + }, + "crypto-random-string": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/crypto-random-string/-/crypto-random-string-1.0.0.tgz", + "integrity": "sha1-ojD2T1aDEOFJgAmUB5DsmVRbyn4=", + "dev": true + }, + "cyclist": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/cyclist/-/cyclist-1.0.1.tgz", + "integrity": "sha1-WW6WmP0MgOEgOMK4LW6xs1tiJNk=", + "dev": true + }, + "d": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/d/-/d-1.0.1.tgz", + "integrity": "sha512-m62ShEObQ39CfralilEQRjH6oAMtNCV1xJyEx5LpRYUVN+EviphDgUc/F3hnYbADmkiNs67Y+3ylmlG7Lnu+FA==", + "dev": true, + "requires": { + "es5-ext": "^0.10.50", + "type": "^1.0.1" + } + }, + "date-now": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/date-now/-/date-now-0.1.4.tgz", + "integrity": "sha1-6vQ5/U1ISK105cx9vvIAZyueNFs=", + "dev": true + }, + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "requires": { + "ms": "2.0.0" + } + }, + "decamelize": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", + "integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=", + "dev": true + }, + "decode-uri-component": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/decode-uri-component/-/decode-uri-component-0.2.0.tgz", + "integrity": "sha1-6zkTMzRYd1y4TNGh+uBiEGu4dUU=", + "dev": true + }, + "deep-equal": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/deep-equal/-/deep-equal-1.1.0.tgz", + "integrity": "sha512-ZbfWJq/wN1Z273o7mUSjILYqehAktR2NVoSrOukDkU9kg2v/Uv89yU4Cvz8seJeAmtN5oqiefKq8FPuXOboqLw==", + "dev": true, + "requires": { + "is-arguments": "^1.0.4", + "is-date-object": "^1.0.1", + "is-regex": "^1.0.4", + "object-is": "^1.0.1", + "object-keys": "^1.1.1", + "regexp.prototype.flags": "^1.2.0" + } + }, + "deep-extend": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.6.0.tgz", + "integrity": "sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==", + "dev": true + }, + "deep-is": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.3.tgz", + "integrity": "sha1-s2nW+128E+7PUk+RsHD+7cNXzzQ=", + "dev": true + }, + "default-gateway": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/default-gateway/-/default-gateway-4.2.0.tgz", + "integrity": "sha512-h6sMrVB1VMWVrW13mSc6ia/DwYYw5MN6+exNu1OaJeFac5aSAvwM7lZ0NVfTABuSkQelr4h5oebg3KB1XPdjgA==", + "dev": true, + "requires": { + "execa": "^1.0.0", + "ip-regex": "^2.1.0" + }, + "dependencies": { + "cross-spawn": { + "version": "6.0.5", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-6.0.5.tgz", + "integrity": "sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ==", + "dev": true, + "requires": { + "nice-try": "^1.0.4", + "path-key": "^2.0.1", + "semver": "^5.5.0", + "shebang-command": "^1.2.0", + "which": "^1.2.9" + } + }, + "execa": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/execa/-/execa-1.0.0.tgz", + "integrity": "sha512-adbxcyWV46qiHyvSp50TKt05tB4tK3HcmF7/nxfAdhnox83seTDbwnaqKO4sXRy7roHAIFqJP/Rw/AuEbX61LA==", + "dev": true, + "requires": { + "cross-spawn": "^6.0.0", + "get-stream": "^4.0.0", + "is-stream": "^1.1.0", + "npm-run-path": "^2.0.0", + "p-finally": "^1.0.0", + "signal-exit": "^3.0.0", + "strip-eof": "^1.0.0" + } + }, + "get-stream": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-4.1.0.tgz", + "integrity": "sha512-GMat4EJ5161kIy2HevLlr4luNjBgvmj413KaQA7jt4V8B4RDsfpHk7WQ9GVqfYyyx8OS/L66Kox+rJRNklLK7w==", + "dev": true, + "requires": { + "pump": "^3.0.0" + } + } + } + }, + "define-properties": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.3.tgz", + "integrity": "sha512-3MqfYKj2lLzdMSf8ZIZE/V+Zuy+BgD6f164e8K2w7dgnpKArBDerGYpM46IYYcjnkdPNMjPk9A6VFB8+3SKlXQ==", + "dev": true, + "requires": { + "object-keys": "^1.0.12" + } + }, + "define-property": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-2.0.2.tgz", + "integrity": "sha512-jwK2UV4cnPpbcG7+VRARKTZPUWowwXA8bzH5NP6ud0oeAxyYPuGZUAC7hMugpCdz4BeSZl2Dl9k66CHJ/46ZYQ==", + "dev": true, + "requires": { + "is-descriptor": "^1.0.2", + "isobject": "^3.0.1" + }, + "dependencies": { + "is-accessor-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", + "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", + "dev": true, + "requires": { + "kind-of": "^6.0.0" + } + }, + "is-data-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", + "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", + "dev": true, + "requires": { + "kind-of": "^6.0.0" + } + }, + "is-descriptor": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", + "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", + "dev": true, + "requires": { + "is-accessor-descriptor": "^1.0.0", + "is-data-descriptor": "^1.0.0", + "kind-of": "^6.0.2" + } + } + } + }, + "defined": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/defined/-/defined-1.0.0.tgz", + "integrity": "sha1-yY2bzvdWdBiOEQlpFRGZ45sfppM=", + "dev": true + }, + "defs": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/defs/-/defs-1.1.1.tgz", + "integrity": "sha1-siYJ8sehG6ej2xFoBcE5scr/qdI=", + "dev": true, + "requires": { + "alter": "~0.2.0", + "ast-traverse": "~0.1.1", + "breakable": "~1.0.0", + "esprima-fb": "~15001.1001.0-dev-harmony-fb", + "simple-fmt": "~0.1.0", + "simple-is": "~0.2.0", + "stringmap": "~0.2.2", + "stringset": "~0.2.1", + "tryor": "~0.1.2", + "yargs": "~3.27.0" + } + }, + "del": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/del/-/del-4.1.1.tgz", + "integrity": "sha512-QwGuEUouP2kVwQenAsOof5Fv8K9t3D8Ca8NxcXKrIpEHjTXK5J2nXLdP+ALI1cgv8wj7KuwBhTwBkOZSJKM5XQ==", + "dev": true, + "requires": { + "@types/glob": "^7.1.1", + "globby": "^6.1.0", + "is-path-cwd": "^2.0.0", + "is-path-in-cwd": "^2.0.0", + "p-map": "^2.0.0", + "pify": "^4.0.1", + "rimraf": "^2.6.3" + } + }, + "depd": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz", + "integrity": "sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak=", + "dev": true + }, + "des.js": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/des.js/-/des.js-1.0.0.tgz", + "integrity": "sha1-wHTS4qpqipoH29YfmhXCzYPsjsw=", + "dev": true, + "requires": { + "inherits": "^2.0.1", + "minimalistic-assert": "^1.0.0" + } + }, + "destroy": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.0.4.tgz", + "integrity": "sha1-l4hXRCxEdJ5CBmE+N5RiBYJqvYA=", + "dev": true + }, + "detect-file": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/detect-file/-/detect-file-1.0.0.tgz", + "integrity": "sha1-8NZtA2cqglyxtzvbP+YjEMjlUrc=", + "dev": true + }, + "detect-indent": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/detect-indent/-/detect-indent-4.0.0.tgz", + "integrity": "sha1-920GQ1LN9Docts5hnE7jqUdd4gg=", + "dev": true, + "requires": { + "repeating": "^2.0.0" + } + }, + "detect-node": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/detect-node/-/detect-node-2.0.4.tgz", + "integrity": "sha512-ZIzRpLJrOj7jjP2miAtgqIfmzbxa4ZOr5jJc601zklsfEx9oTzmmj2nVpIPRpNlRTIh8lc1kyViIY7BWSGNmKw==", + "dev": true + }, + "detective": { + "version": "4.7.1", + "resolved": "https://registry.npmjs.org/detective/-/detective-4.7.1.tgz", + "integrity": "sha512-H6PmeeUcZloWtdt4DAkFyzFL94arpHr3NOwwmVILFiy+9Qd4JTxxXrzfyGk/lmct2qVGBwTSwSXagqu2BxmWig==", + "dev": true, + "requires": { + "acorn": "^5.2.1", + "defined": "^1.0.0" + } + }, + "diffie-hellman": { + "version": "5.0.3", + "resolved": "https://registry.npmjs.org/diffie-hellman/-/diffie-hellman-5.0.3.tgz", + "integrity": "sha512-kqag/Nl+f3GwyK25fhUMYj81BUOrZ9IuJsjIcDE5icNM9FJHAVm3VcUDxdLPoQtTuUylWm6ZIknYJwwaPxsUzg==", + "dev": true, + "requires": { + "bn.js": "^4.1.0", + "miller-rabin": "^4.0.0", + "randombytes": "^2.0.0" + } + }, + "dns-equal": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/dns-equal/-/dns-equal-1.0.0.tgz", + "integrity": "sha1-s55/HabrCnW6nBcySzR1PEfgZU0=", + "dev": true + }, + "dns-packet": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/dns-packet/-/dns-packet-1.3.1.tgz", + "integrity": "sha512-0UxfQkMhYAUaZI+xrNZOz/as5KgDU0M/fQ9b6SpkyLbk3GEswDi6PADJVaYJradtRVsRIlF1zLyOodbcTCDzUg==", + "dev": true, + "requires": { + "ip": "^1.1.0", + "safe-buffer": "^5.0.1" + } + }, + "dns-txt": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/dns-txt/-/dns-txt-2.0.2.tgz", + "integrity": "sha1-uR2Ab10nGI5Ks+fRB9iBocxGQrY=", + "dev": true, + "requires": { + "buffer-indexof": "^1.0.0" + } + }, + "doctrine": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz", + "integrity": "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==", + "dev": true, + "requires": { + "esutils": "^2.0.2" + } + }, + "domain-browser": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/domain-browser/-/domain-browser-1.2.0.tgz", + "integrity": "sha512-jnjyiM6eRyZl2H+W8Q/zLMA481hzi0eszAaBUzIVnmYVDBbnLxVNnfu1HgEBvCbL+71FrxMl3E6lpKH7Ge3OXA==", + "dev": true + }, + "dot-prop": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/dot-prop/-/dot-prop-4.2.0.tgz", + "integrity": "sha512-tUMXrxlExSW6U2EXiiKGSBVdYgtV8qlHL+C10TsW4PURY/ic+eaysnSkwB4kA/mBlCyy/IKDJ+Lc3wbWeaXtuQ==", + "dev": true, + "requires": { + "is-obj": "^1.0.0" + } + }, + "duplexer3": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/duplexer3/-/duplexer3-0.1.4.tgz", + "integrity": "sha1-7gHdHKwO08vH/b6jfcCo8c4ALOI=", + "dev": true + }, + "duplexify": { + "version": "3.7.1", + "resolved": "https://registry.npmjs.org/duplexify/-/duplexify-3.7.1.tgz", + "integrity": "sha512-07z8uv2wMyS51kKhD1KsdXJg5WQ6t93RneqRxUHnskXVtlYYkLqM0gqStQZ3pj073g687jPCHrqNfCzawLYh5g==", + "dev": true, + "requires": { + "end-of-stream": "^1.0.0", + "inherits": "^2.0.1", + "readable-stream": "^2.0.0", + "stream-shift": "^1.0.0" + } + }, + "ee-first": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", + "integrity": "sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0=", + "dev": true + }, + "electron-to-chromium": { + "version": "1.3.254", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.254.tgz", + "integrity": "sha512-7I5/OkgR6JKy6RFLJeru0kc0RMmmMu1UnkHBKInFKRrg1/4EQKIqOaUqITSww/SZ1LqWwp1qc/LLoIGy449eYw==", + "dev": true + }, + "elliptic": { + "version": "6.5.1", + "resolved": "https://registry.npmjs.org/elliptic/-/elliptic-6.5.1.tgz", + "integrity": "sha512-xvJINNLbTeWQjrl6X+7eQCrIy/YPv5XCpKW6kB5mKvtnGILoLDcySuwomfdzt0BMdLNVnuRNTuzKNHj0bva1Cg==", + "dev": true, + "requires": { + "bn.js": "^4.4.0", + "brorand": "^1.0.1", + "hash.js": "^1.0.0", + "hmac-drbg": "^1.0.0", + "inherits": "^2.0.1", + "minimalistic-assert": "^1.0.0", + "minimalistic-crypto-utils": "^1.0.0" + } + }, + "emoji-regex": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-7.0.3.tgz", + "integrity": "sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA==", + "dev": true + }, + "emojis-list": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/emojis-list/-/emojis-list-2.1.0.tgz", + "integrity": "sha1-TapNnbAPmBmIDHn6RXrlsJof04k=", + "dev": true + }, + "encodeurl": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", + "integrity": "sha1-rT/0yG7C0CkyL1oCw6mmBslbP1k=", + "dev": true + }, + "end-of-stream": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.1.tgz", + "integrity": "sha512-1MkrZNvWTKCaigbn+W15elq2BB/L22nqrSY5DKlo3X6+vclJm8Bb5djXJBmEX6fS3+zCh/F4VBK5Z2KxJt4s2Q==", + "dev": true, + "requires": { + "once": "^1.4.0" + } + }, + "enhanced-resolve": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-4.1.0.tgz", + "integrity": "sha512-F/7vkyTtyc/llOIn8oWclcB25KdRaiPBpZYDgJHgh/UHtpgT2p2eldQgtQnLtUvfMKPKxbRaQM/hHkvLHt1Vng==", + "dev": true, + "requires": { + "graceful-fs": "^4.1.2", + "memory-fs": "^0.4.0", + "tapable": "^1.0.0" + } + }, + "errno": { + "version": "0.1.7", + "resolved": "https://registry.npmjs.org/errno/-/errno-0.1.7.tgz", + "integrity": "sha512-MfrRBDWzIWifgq6tJj60gkAwtLNb6sQPlcFrSOflcP1aFmmruKQ2wRnze/8V6kgyz7H3FF8Npzv78mZ7XLLflg==", + "dev": true, + "requires": { + "prr": "~1.0.1" + } + }, + "error-ex": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz", + "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==", + "dev": true, + "requires": { + "is-arrayish": "^0.2.1" + } + }, + "es-abstract": { + "version": "1.14.2", + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.14.2.tgz", + "integrity": "sha512-DgoQmbpFNOofkjJtKwr87Ma5EW4Dc8fWhD0R+ndq7Oc456ivUfGOOP6oAZTTKl5/CcNMP+EN+e3/iUzgE0veZg==", + "dev": true, + "requires": { + "es-to-primitive": "^1.2.0", + "function-bind": "^1.1.1", + "has": "^1.0.3", + "has-symbols": "^1.0.0", + "is-callable": "^1.1.4", + "is-regex": "^1.0.4", + "object-inspect": "^1.6.0", + "object-keys": "^1.1.1", + "string.prototype.trimleft": "^2.0.0", + "string.prototype.trimright": "^2.0.0" + } + }, + "es-to-primitive": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.0.tgz", + "integrity": "sha512-qZryBOJjV//LaxLTV6UC//WewneB3LcXOL9NP++ozKVXsIIIpm/2c13UDiD9Jp2eThsecw9m3jPqDwTyobcdbg==", + "dev": true, + "requires": { + "is-callable": "^1.1.4", + "is-date-object": "^1.0.1", + "is-symbol": "^1.0.2" + } + }, + "es5-ext": { + "version": "0.10.51", + "resolved": "https://registry.npmjs.org/es5-ext/-/es5-ext-0.10.51.tgz", + "integrity": "sha512-oRpWzM2WcLHVKpnrcyB7OW8j/s67Ba04JCm0WnNv3RiABSvs7mrQlutB8DBv793gKcp0XENR8Il8WxGTlZ73gQ==", + "dev": true, + "requires": { + "es6-iterator": "~2.0.3", + "es6-symbol": "~3.1.1", + "next-tick": "^1.0.0" + } + }, + "es6-iterator": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/es6-iterator/-/es6-iterator-2.0.3.tgz", + "integrity": "sha1-p96IkUGgWpSwhUQDstCg+/qY87c=", + "dev": true, + "requires": { + "d": "1", + "es5-ext": "^0.10.35", + "es6-symbol": "^3.1.1" + } + }, + "es6-map": { + "version": "0.1.5", + "resolved": "https://registry.npmjs.org/es6-map/-/es6-map-0.1.5.tgz", + "integrity": "sha1-kTbgUD3MBqMBaQ8LsU/042TpSfA=", + "dev": true, + "requires": { + "d": "1", + "es5-ext": "~0.10.14", + "es6-iterator": "~2.0.1", + "es6-set": "~0.1.5", + "es6-symbol": "~3.1.1", + "event-emitter": "~0.3.5" + } + }, + "es6-promise": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/es6-promise/-/es6-promise-3.0.2.tgz", + "integrity": "sha1-AQ1YWEI6XxGJeWZfRkhqlcbuK7Y=" + }, + "es6-set": { + "version": "0.1.5", + "resolved": "https://registry.npmjs.org/es6-set/-/es6-set-0.1.5.tgz", + "integrity": "sha1-0rPsXU2ADO2BjbU40ol02wpzzLE=", + "dev": true, + "requires": { + "d": "1", + "es5-ext": "~0.10.14", + "es6-iterator": "~2.0.1", + "es6-symbol": "3.1.1", + "event-emitter": "~0.3.5" + }, + "dependencies": { + "es6-symbol": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/es6-symbol/-/es6-symbol-3.1.1.tgz", + "integrity": "sha1-vwDvT9q2uhtG7Le2KbTH7VcVzHc=", + "dev": true, + "requires": { + "d": "1", + "es5-ext": "~0.10.14" + } + } + } + }, + "es6-symbol": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/es6-symbol/-/es6-symbol-3.1.2.tgz", + "integrity": "sha512-/ZypxQsArlv+KHpGvng52/Iz8by3EQPxhmbuz8yFG89N/caTFBSbcXONDw0aMjy827gQg26XAjP4uXFvnfINmQ==", + "dev": true, + "requires": { + "d": "^1.0.1", + "es5-ext": "^0.10.51" + } + }, + "es6-weak-map": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/es6-weak-map/-/es6-weak-map-2.0.3.tgz", + "integrity": "sha512-p5um32HOTO1kP+w7PRnB+5lQ43Z6muuMuIMffvDN8ZB4GcnjLBV6zGStpbASIMk4DCAvEaamhe2zhyCb/QXXsA==", + "dev": true, + "requires": { + "d": "1", + "es5-ext": "^0.10.46", + "es6-iterator": "^2.0.3", + "es6-symbol": "^3.1.1" + } + }, + "escape-html": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", + "integrity": "sha1-Aljq5NPQwJdN4cFpGI7wBR0dGYg=", + "dev": true + }, + "escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=", + "dev": true + }, + "escope": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/escope/-/escope-3.6.0.tgz", + "integrity": "sha1-4Bl16BJ4GhY6ba392AOY3GTIicM=", + "dev": true, + "requires": { + "es6-map": "^0.1.3", + "es6-weak-map": "^2.0.1", + "esrecurse": "^4.1.0", + "estraverse": "^4.1.1" + } + }, + "eslint": { + "version": "6.4.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-6.4.0.tgz", + "integrity": "sha512-WTVEzK3lSFoXUovDHEbkJqCVPEPwbhCq4trDktNI6ygs7aO41d4cDT0JFAT5MivzZeVLWlg7vHL+bgrQv/t3vA==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.0.0", + "ajv": "^6.10.0", + "chalk": "^2.1.0", + "cross-spawn": "^6.0.5", + "debug": "^4.0.1", + "doctrine": "^3.0.0", + "eslint-scope": "^5.0.0", + "eslint-utils": "^1.4.2", + "eslint-visitor-keys": "^1.1.0", + "espree": "^6.1.1", + "esquery": "^1.0.1", + "esutils": "^2.0.2", + "file-entry-cache": "^5.0.1", + "functional-red-black-tree": "^1.0.1", + "glob-parent": "^5.0.0", + "globals": "^11.7.0", + "ignore": "^4.0.6", + "import-fresh": "^3.0.0", + "imurmurhash": "^0.1.4", + "inquirer": "^6.4.1", + "is-glob": "^4.0.0", + "js-yaml": "^3.13.1", + "json-stable-stringify-without-jsonify": "^1.0.1", + "levn": "^0.3.0", + "lodash": "^4.17.14", + "minimatch": "^3.0.4", + "mkdirp": "^0.5.1", + "natural-compare": "^1.4.0", + "optionator": "^0.8.2", + "progress": "^2.0.0", + "regexpp": "^2.0.1", + "semver": "^6.1.2", + "strip-ansi": "^5.2.0", + "strip-json-comments": "^3.0.1", + "table": "^5.2.3", + "text-table": "^0.2.0", + "v8-compile-cache": "^2.0.3" + }, + "dependencies": { + "ansi-regex": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", + "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==", + "dev": true + }, + "cross-spawn": { + "version": "6.0.5", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-6.0.5.tgz", + "integrity": "sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ==", + "dev": true, + "requires": { + "nice-try": "^1.0.4", + "path-key": "^2.0.1", + "semver": "^5.5.0", + "shebang-command": "^1.2.0", + "which": "^1.2.9" + }, + "dependencies": { + "semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", + "dev": true + } + } + }, + "debug": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", + "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", + "dev": true, + "requires": { + "ms": "^2.1.1" + } + }, + "eslint-scope": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.0.0.tgz", + "integrity": "sha512-oYrhJW7S0bxAFDvWqzvMPRm6pcgcnWc4QnofCAqRTRfQC0JcwenzGglTtsLyIuuWFfkqDG9vz67cnttSd53djw==", + "dev": true, + "requires": { + "esrecurse": "^4.1.0", + "estraverse": "^4.1.1" + } + }, + "glob-parent": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.0.0.tgz", + "integrity": "sha512-Z2RwiujPRGluePM6j699ktJYxmPpJKCfpGA13jz2hmFZC7gKetzrWvg5KN3+OsIFmydGyZ1AVwERCq1w/ZZwRg==", + "dev": true, + "requires": { + "is-glob": "^4.0.1" + } + }, + "ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "dev": true + }, + "semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "dev": true + }, + "strip-ansi": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", + "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", + "dev": true, + "requires": { + "ansi-regex": "^4.1.0" + } + }, + "strip-json-comments": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.0.1.tgz", + "integrity": "sha512-VTyMAUfdm047mwKl+u79WIdrZxtFtn+nBxHeb844XBQ9uMNTuTHdx2hc5RiAJYqwTj3wc/xe5HLSdJSkJ+WfZw==", + "dev": true + } + } + }, + "eslint-config-airbnb-base": { + "version": "14.0.0", + "resolved": "https://registry.npmjs.org/eslint-config-airbnb-base/-/eslint-config-airbnb-base-14.0.0.tgz", + "integrity": "sha512-2IDHobw97upExLmsebhtfoD3NAKhV4H0CJWP3Uprd/uk+cHuWYOczPVxQ8PxLFUAw7o3Th1RAU8u1DoUpr+cMA==", + "dev": true, + "requires": { + "confusing-browser-globals": "^1.0.7", + "object.assign": "^4.1.0", + "object.entries": "^1.1.0" + } + }, + "eslint-import-resolver-node": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.2.tgz", + "integrity": "sha512-sfmTqJfPSizWu4aymbPr4Iidp5yKm8yDkHp+Ir3YiTHiiDfxh69mOUsmiqW6RZ9zRXFaF64GtYmN7e+8GHBv6Q==", + "dev": true, + "requires": { + "debug": "^2.6.9", + "resolve": "^1.5.0" + } + }, + "eslint-module-utils": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/eslint-module-utils/-/eslint-module-utils-2.4.1.tgz", + "integrity": "sha512-H6DOj+ejw7Tesdgbfs4jeS4YMFrT8uI8xwd1gtQqXssaR0EQ26L+2O/w6wkYFy2MymON0fTwHmXBvvfLNZVZEw==", + "dev": true, + "requires": { + "debug": "^2.6.8", + "pkg-dir": "^2.0.0" + }, + "dependencies": { + "find-up": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-2.1.0.tgz", + "integrity": "sha1-RdG35QbHF93UgndaK3eSCjwMV6c=", + "dev": true, + "requires": { + "locate-path": "^2.0.0" + } + }, + "locate-path": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-2.0.0.tgz", + "integrity": "sha1-K1aLJl7slExtnA3pw9u7ygNUzY4=", + "dev": true, + "requires": { + "p-locate": "^2.0.0", + "path-exists": "^3.0.0" + } + }, + "p-limit": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-1.3.0.tgz", + "integrity": "sha512-vvcXsLAJ9Dr5rQOPk7toZQZJApBl2K4J6dANSsEuh6QI41JYcsS/qhTGa9ErIUUgK3WNQoJYvylxvjqmiqEA9Q==", + "dev": true, + "requires": { + "p-try": "^1.0.0" + } + }, + "p-locate": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-2.0.0.tgz", + "integrity": "sha1-IKAQOyIqcMj9OcwuWAaA893l7EM=", + "dev": true, + "requires": { + "p-limit": "^1.1.0" + } + }, + "p-try": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/p-try/-/p-try-1.0.0.tgz", + "integrity": "sha1-y8ec26+P1CKOE/Yh8rGiN8GyB7M=", + "dev": true + }, + "path-exists": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", + "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=", + "dev": true + }, + "pkg-dir": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-2.0.0.tgz", + "integrity": "sha1-9tXREJ4Z1j7fQo4L1X4Sd3YVM0s=", + "dev": true, + "requires": { + "find-up": "^2.1.0" + } + } + } + }, + "eslint-plugin-import": { + "version": "2.18.2", + "resolved": "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.18.2.tgz", + "integrity": "sha512-5ohpsHAiUBRNaBWAF08izwUGlbrJoJJ+W9/TBwsGoR1MnlgfwMIKrFeSjWbt6moabiXW9xNvtFz+97KHRfI4HQ==", + "dev": true, + "requires": { + "array-includes": "^3.0.3", + "contains-path": "^0.1.0", + "debug": "^2.6.9", + "doctrine": "1.5.0", + "eslint-import-resolver-node": "^0.3.2", + "eslint-module-utils": "^2.4.0", + "has": "^1.0.3", + "minimatch": "^3.0.4", + "object.values": "^1.1.0", + "read-pkg-up": "^2.0.0", + "resolve": "^1.11.0" + }, + "dependencies": { + "doctrine": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-1.5.0.tgz", + "integrity": "sha1-N53Ocw9hZvds76TmcHoVmwLFpvo=", + "dev": true, + "requires": { + "esutils": "^2.0.2", + "isarray": "^1.0.0" + } + } + } + }, + "eslint-plugin-no-unsafe-innerhtml": { + "version": "1.0.16", + "resolved": "https://registry.npmjs.org/eslint-plugin-no-unsafe-innerhtml/-/eslint-plugin-no-unsafe-innerhtml-1.0.16.tgz", + "integrity": "sha1-fQKHjI6b95FriINtWsEitC8VGTI=", + "dev": true, + "requires": { + "eslint": "^3.7.1" + }, + "dependencies": { + "acorn-jsx": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-3.0.1.tgz", + "integrity": "sha1-r9+UiPsezvyDSPb7IvRk4ypYs2s=", + "dev": true, + "requires": { + "acorn": "^3.0.4" + }, + "dependencies": { + "acorn": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-3.3.0.tgz", + "integrity": "sha1-ReN/s56No/JbruP/U2niu18iAXo=", + "dev": true + } + } + }, + "ajv": { + "version": "4.11.8", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-4.11.8.tgz", + "integrity": "sha1-gv+wKynmYq5TvcIK8VlHcGc5xTY=", + "dev": true, + "requires": { + "co": "^4.6.0", + "json-stable-stringify": "^1.0.1" + } + }, + "ajv-keywords": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-1.5.1.tgz", + "integrity": "sha1-MU3QpLM2j609/NxU7eYXG4htrzw=", + "dev": true + }, + "ansi-escapes": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-1.4.0.tgz", + "integrity": "sha1-06ioOzGapneTZisT52HHkRQiMG4=", + "dev": true + }, + "ansi-styles": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", + "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=", + "dev": true + }, + "chalk": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", + "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", + "dev": true, + "requires": { + "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" + } + }, + "cli-cursor": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-1.0.2.tgz", + "integrity": "sha1-ZNo/fValRBLll5S9Ytw1KV6PKYc=", + "dev": true, + "requires": { + "restore-cursor": "^1.0.1" + } + }, + "doctrine": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-2.1.0.tgz", + "integrity": "sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==", + "dev": true, + "requires": { + "esutils": "^2.0.2" + } + }, + "eslint": { + "version": "3.19.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-3.19.0.tgz", + "integrity": "sha1-yPxiAcf0DdCJQbh8CFdnOGpnmsw=", + "dev": true, + "requires": { + "babel-code-frame": "^6.16.0", + "chalk": "^1.1.3", + "concat-stream": "^1.5.2", + "debug": "^2.1.1", + "doctrine": "^2.0.0", + "escope": "^3.6.0", + "espree": "^3.4.0", + "esquery": "^1.0.0", + "estraverse": "^4.2.0", + "esutils": "^2.0.2", + "file-entry-cache": "^2.0.0", + "glob": "^7.0.3", + "globals": "^9.14.0", + "ignore": "^3.2.0", + "imurmurhash": "^0.1.4", + "inquirer": "^0.12.0", + "is-my-json-valid": "^2.10.0", + "is-resolvable": "^1.0.0", + "js-yaml": "^3.5.1", + "json-stable-stringify": "^1.0.0", + "levn": "^0.3.0", + "lodash": "^4.0.0", + "mkdirp": "^0.5.0", + "natural-compare": "^1.4.0", + "optionator": "^0.8.2", + "path-is-inside": "^1.0.1", + "pluralize": "^1.2.1", + "progress": "^1.1.8", + "require-uncached": "^1.0.2", + "shelljs": "^0.7.5", + "strip-bom": "^3.0.0", + "strip-json-comments": "~2.0.1", + "table": "^3.7.8", + "text-table": "~0.2.0", + "user-home": "^2.0.0" + } + }, + "espree": { + "version": "3.5.4", + "resolved": "https://registry.npmjs.org/espree/-/espree-3.5.4.tgz", + "integrity": "sha512-yAcIQxtmMiB/jL32dzEp2enBeidsB7xWPLNiw3IIkpVds1P+h7qF9YwJq1yUNzp2OKXgAprs4F61ih66UsoD1A==", + "dev": true, + "requires": { + "acorn": "^5.5.0", + "acorn-jsx": "^3.0.0" + } + }, + "figures": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/figures/-/figures-1.7.0.tgz", + "integrity": "sha1-y+Hjr/zxzUS4DK3+0o3Hk6lwHS4=", + "dev": true, + "requires": { + "escape-string-regexp": "^1.0.5", + "object-assign": "^4.1.0" + } + }, + "file-entry-cache": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-2.0.0.tgz", + "integrity": "sha1-w5KZDD5oR4PYOLjISkXYoEhFg2E=", + "dev": true, + "requires": { + "flat-cache": "^1.2.1", + "object-assign": "^4.0.1" + } + }, + "flat-cache": { + "version": "1.3.4", + "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-1.3.4.tgz", + "integrity": "sha512-VwyB3Lkgacfik2vhqR4uv2rvebqmDvFu4jlN/C1RzWoJEo8I7z4Q404oiqYCkq41mni8EzQnm95emU9seckwtg==", + "dev": true, + "requires": { + "circular-json": "^0.3.1", + "graceful-fs": "^4.1.2", + "rimraf": "~2.6.2", + "write": "^0.2.1" + } + }, + "globals": { + "version": "9.18.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-9.18.0.tgz", + "integrity": "sha512-S0nG3CLEQiY/ILxqtztTWH/3iRRdyBLw6KMDxnKMchrtbj2OFmehVh0WUCfW3DUrIgx/qFrJPICrq4Z4sTR9UQ==", + "dev": true + }, + "ignore": { + "version": "3.3.10", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-3.3.10.tgz", + "integrity": "sha512-Pgs951kaMm5GXP7MOvxERINe3gsaVjUWFm+UZPSq9xYriQAksyhg0csnS0KXSNRD5NmNdapXEpjxG49+AKh/ug==", + "dev": true + }, + "inquirer": { + "version": "0.12.0", + "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-0.12.0.tgz", + "integrity": "sha1-HvK/1jUE3wvHV4X/+MLEHfEvB34=", + "dev": true, + "requires": { + "ansi-escapes": "^1.1.0", + "ansi-regex": "^2.0.0", + "chalk": "^1.0.0", + "cli-cursor": "^1.0.1", + "cli-width": "^2.0.0", + "figures": "^1.3.5", + "lodash": "^4.3.0", + "readline2": "^1.0.1", + "run-async": "^0.1.0", + "rx-lite": "^3.1.2", + "string-width": "^1.0.1", + "strip-ansi": "^3.0.0", + "through": "^2.3.6" + } + }, + "is-fullwidth-code-point": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz", + "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=", + "dev": true, + "requires": { + "number-is-nan": "^1.0.0" + } + }, + "onetime": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-1.1.0.tgz", + "integrity": "sha1-ofeDj4MUxRbwXs78vEzP4EtO14k=", + "dev": true + }, + "progress": { + "version": "1.1.8", + "resolved": "https://registry.npmjs.org/progress/-/progress-1.1.8.tgz", + "integrity": "sha1-4mDHj2Fhzdmw5WzD4Khd4Xx6V74=", + "dev": true + }, + "restore-cursor": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-1.0.1.tgz", + "integrity": "sha1-NGYfRohjJ/7SmRR5FSJS35LapUE=", + "dev": true, + "requires": { + "exit-hook": "^1.0.0", + "onetime": "^1.0.0" + } + }, + "rimraf": { + "version": "2.6.3", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.6.3.tgz", + "integrity": "sha512-mwqeW5XsA2qAejG46gYdENaxXjx9onRNCfn7L0duuP4hCuTIi/QO7PDK07KJfp1d+izWPrzEJDcSqBa0OZQriA==", + "dev": true, + "requires": { + "glob": "^7.1.3" + } + }, + "run-async": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/run-async/-/run-async-0.1.0.tgz", + "integrity": "sha1-yK1KXhEGYeQCp9IbUw4AnyX444k=", + "dev": true, + "requires": { + "once": "^1.3.0" + } + }, + "slice-ansi": { + "version": "0.0.4", + "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-0.0.4.tgz", + "integrity": "sha1-7b+JA/ZvfOL46v1s7tZeJkyDGzU=", + "dev": true + }, + "string-width": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", + "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=", + "dev": true, + "requires": { + "code-point-at": "^1.0.0", + "is-fullwidth-code-point": "^1.0.0", + "strip-ansi": "^3.0.0" + } + }, + "supports-color": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", + "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=", + "dev": true + }, + "table": { + "version": "3.8.3", + "resolved": "https://registry.npmjs.org/table/-/table-3.8.3.tgz", + "integrity": "sha1-K7xULw/amGGnVdOUf+/Ys/UThV8=", + "dev": true, + "requires": { + "ajv": "^4.7.0", + "ajv-keywords": "^1.0.0", + "chalk": "^1.1.1", + "lodash": "^4.0.0", + "slice-ansi": "0.0.4", + "string-width": "^2.0.0" + }, + "dependencies": { + "ansi-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", + "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=", + "dev": true + }, + "is-fullwidth-code-point": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", + "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=", + "dev": true + }, + "string-width": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz", + "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==", + "dev": true, + "requires": { + "is-fullwidth-code-point": "^2.0.0", + "strip-ansi": "^4.0.0" + } + }, + "strip-ansi": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", + "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", + "dev": true, + "requires": { + "ansi-regex": "^3.0.0" + } + } + } + }, + "user-home": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/user-home/-/user-home-2.0.0.tgz", + "integrity": "sha1-nHC/2Babwdy/SGBODwS4tJzenp8=", + "dev": true, + "requires": { + "os-homedir": "^1.0.0" + } + }, + "write": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/write/-/write-0.2.1.tgz", + "integrity": "sha1-X8A4KOJkzqP+kUVUdvejxWbLB1c=", + "dev": true, + "requires": { + "mkdirp": "^0.5.1" + } + } + } + }, + "eslint-plugin-no-unsanitized": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/eslint-plugin-no-unsanitized/-/eslint-plugin-no-unsanitized-3.0.2.tgz", + "integrity": "sha512-JnwpoH8Sv4QOjrTDutENBHzSnyYtspdjtglYtqUtAHe6f6LLKqykJle+UwFPg23GGwt5hI3amS9CRDezW8GAww==", + "dev": true + }, + "eslint-plugin-security": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-security/-/eslint-plugin-security-1.4.0.tgz", + "integrity": "sha512-xlS7P2PLMXeqfhyf3NpqbvbnW04kN8M9NtmhpR3XGyOvt/vNKS7XPXT5EDbwKW9vCjWH4PpfQvgD/+JgN0VJKA==", + "dev": true, + "requires": { + "safe-regex": "^1.1.0" + } + }, + "eslint-scope": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-4.0.3.tgz", + "integrity": "sha512-p7VutNr1O/QrxysMo3E45FjYDTeXBy0iTltPFNSqKAIfjDSXC+4dj+qfyuD8bfAXrW/y6lW3O76VaYNPKfpKrg==", + "dev": true, + "requires": { + "esrecurse": "^4.1.0", + "estraverse": "^4.1.1" + } + }, + "eslint-utils": { + "version": "1.4.2", + "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-1.4.2.tgz", + "integrity": "sha512-eAZS2sEUMlIeCjBeubdj45dmBHQwPHWyBcT1VSYB7o9x9WRRqKxyUoiXlRjyAwzN7YEzHJlYg0NmzDRWx6GP4Q==", + "dev": true, + "requires": { + "eslint-visitor-keys": "^1.0.0" + } + }, + "eslint-visitor-keys": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.1.0.tgz", + "integrity": "sha512-8y9YjtM1JBJU/A9Kc+SbaOV4y29sSWckBwMHa+FGtVj5gN/sbnKDf6xJUl+8g7FAij9LVaP8C24DUiH/f/2Z9A==", + "dev": true + }, + "espree": { + "version": "6.1.1", + "resolved": "https://registry.npmjs.org/espree/-/espree-6.1.1.tgz", + "integrity": "sha512-EYbr8XZUhWbYCqQRW0duU5LxzL5bETN6AjKBGy1302qqzPaCH10QbRg3Wvco79Z8x9WbiE8HYB4e75xl6qUYvQ==", + "dev": true, + "requires": { + "acorn": "^7.0.0", + "acorn-jsx": "^5.0.2", + "eslint-visitor-keys": "^1.1.0" + }, + "dependencies": { + "acorn": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-7.0.0.tgz", + "integrity": "sha512-PaF/MduxijYYt7unVGRuds1vBC9bFxbNf+VWqhOClfdgy7RlVkQqt610ig1/yxTgsDIfW1cWDel5EBbOy3jdtQ==", + "dev": true + } + } + }, + "esprima-fb": { + "version": "15001.1001.0-dev-harmony-fb", + "resolved": "https://registry.npmjs.org/esprima-fb/-/esprima-fb-15001.1001.0-dev-harmony-fb.tgz", + "integrity": "sha1-Q761fsJujPI3092LM+QlM1d/Jlk=", + "dev": true + }, + "esquery": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.0.1.tgz", + "integrity": "sha512-SmiyZ5zIWH9VM+SRUReLS5Q8a7GxtRdxEBVZpm98rJM7Sb+A9DVCndXfkeFUd3byderg+EbDkfnevfCwynWaNA==", + "dev": true, + "requires": { + "estraverse": "^4.0.0" + } + }, + "esrecurse": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.2.1.tgz", + "integrity": "sha512-64RBB++fIOAXPw3P9cy89qfMlvZEXZkqqJkjqqXIvzP5ezRZjW+lPWjw35UX/3EhUPFYbg5ER4JYgDw4007/DQ==", + "dev": true, + "requires": { + "estraverse": "^4.1.0" + } + }, + "estraverse": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", + "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", + "dev": true + }, + "esutils": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", + "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", + "dev": true + }, + "etag": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", + "integrity": "sha1-Qa4u62XvpiJorr/qg6x9eSmbCIc=", + "dev": true + }, + "event-emitter": { + "version": "0.3.5", + "resolved": "https://registry.npmjs.org/event-emitter/-/event-emitter-0.3.5.tgz", + "integrity": "sha1-34xp7vFkeSPHFXuc6DhAYQsCzDk=", + "dev": true, + "requires": { + "d": "1", + "es5-ext": "~0.10.14" + } + }, + "eventemitter3": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-3.1.2.tgz", + "integrity": "sha512-tvtQIeLVHjDkJYnzf2dgVMxfuSGJeM/7UCG17TT4EumTfNtF+0nebF/4zWOIkCreAbtNqhGEboB6BWrwqNaw4Q==", + "dev": true + }, + "events": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/events/-/events-3.0.0.tgz", + "integrity": "sha512-Dc381HFWJzEOhQ+d8pkNon++bk9h6cdAoAj4iE6Q4y6xgTzySWXlKn05/TVNpjnfRqi/X0EpJEJohPjNI3zpVA==", + "dev": true + }, + "eventsource": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/eventsource/-/eventsource-1.0.7.tgz", + "integrity": "sha512-4Ln17+vVT0k8aWq+t/bF5arcS3EpT9gYtW66EPacdj/mAFevznsnyoHLPy2BA8gbIQeIHoPsvwmfBftfcG//BQ==", + "dev": true, + "requires": { + "original": "^1.0.0" + } + }, + "evp_bytestokey": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/evp_bytestokey/-/evp_bytestokey-1.0.3.tgz", + "integrity": "sha512-/f2Go4TognH/KvCISP7OUsHn85hT9nUkxxA9BEWxFn+Oj9o8ZNLm/40hdlgSLyuOimsrTKLUMEorQexp/aPQeA==", + "dev": true, + "requires": { + "md5.js": "^1.3.4", + "safe-buffer": "^5.1.1" + } + }, + "execa": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/execa/-/execa-0.7.0.tgz", + "integrity": "sha1-lEvs00zEHuMqY6n68nrVpl/Fl3c=", + "dev": true, + "requires": { + "cross-spawn": "^5.0.1", + "get-stream": "^3.0.0", + "is-stream": "^1.1.0", + "npm-run-path": "^2.0.0", + "p-finally": "^1.0.0", + "signal-exit": "^3.0.0", + "strip-eof": "^1.0.0" + } + }, + "exit-hook": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/exit-hook/-/exit-hook-1.1.1.tgz", + "integrity": "sha1-8FyiM7SMBdVP/wd2XfhQfpXAL/g=", + "dev": true + }, + "expand-brackets": { + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-2.1.4.tgz", + "integrity": "sha1-t3c14xXOMPa27/D4OwQVGiJEliI=", + "dev": true, + "requires": { + "debug": "^2.3.3", + "define-property": "^0.2.5", + "extend-shallow": "^2.0.1", + "posix-character-classes": "^0.1.0", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.1" + }, + "dependencies": { + "define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", + "dev": true, + "requires": { + "is-descriptor": "^0.1.0" + } + }, + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "requires": { + "is-extendable": "^0.1.0" + } + } + } + }, + "expand-range": { + "version": "1.8.2", + "resolved": "https://registry.npmjs.org/expand-range/-/expand-range-1.8.2.tgz", + "integrity": "sha1-opnv/TNf4nIeuujiV+x5ZE/IUzc=", + "dev": true, + "requires": { + "fill-range": "^2.1.0" + }, + "dependencies": { + "fill-range": { + "version": "2.2.4", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-2.2.4.tgz", + "integrity": "sha512-cnrcCbj01+j2gTG921VZPnHbjmdAf8oQV/iGeV2kZxGSyfYjjTyY79ErsK1WJWMpw6DaApEX72binqJE+/d+5Q==", + "dev": true, + "requires": { + "is-number": "^2.1.0", + "isobject": "^2.0.0", + "randomatic": "^3.0.0", + "repeat-element": "^1.1.2", + "repeat-string": "^1.5.2" + } + }, + "is-number": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-2.1.0.tgz", + "integrity": "sha1-Afy7s5NGOlSPL0ZszhbezknbkI8=", + "dev": true, + "requires": { + "kind-of": "^3.0.2" + } + }, + "isobject": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-2.1.0.tgz", + "integrity": "sha1-8GVWEJaj8dou9GJy+BXIQNh+DIk=", + "dev": true, + "requires": { + "isarray": "1.0.0" + } + }, + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "expand-tilde": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/expand-tilde/-/expand-tilde-2.0.2.tgz", + "integrity": "sha1-l+gBqgUt8CRU3kawK/YhZCzchQI=", + "dev": true, + "requires": { + "homedir-polyfill": "^1.0.1" + } + }, + "express": { + "version": "4.17.1", + "resolved": "https://registry.npmjs.org/express/-/express-4.17.1.tgz", + "integrity": "sha512-mHJ9O79RqluphRrcw2X/GTh3k9tVv8YcoyY4Kkh4WDMUYKRZUq0h1o0w2rrrxBqM7VoeUVqgb27xlEMXTnYt4g==", + "dev": true, + "requires": { + "accepts": "~1.3.7", + "array-flatten": "1.1.1", + "body-parser": "1.19.0", + "content-disposition": "0.5.3", + "content-type": "~1.0.4", + "cookie": "0.4.0", + "cookie-signature": "1.0.6", + "debug": "2.6.9", + "depd": "~1.1.2", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "etag": "~1.8.1", + "finalhandler": "~1.1.2", + "fresh": "0.5.2", + "merge-descriptors": "1.0.1", + "methods": "~1.1.2", + "on-finished": "~2.3.0", + "parseurl": "~1.3.3", + "path-to-regexp": "0.1.7", + "proxy-addr": "~2.0.5", + "qs": "6.7.0", + "range-parser": "~1.2.1", + "safe-buffer": "5.1.2", + "send": "0.17.1", + "serve-static": "1.14.1", + "setprototypeof": "1.1.1", + "statuses": "~1.5.0", + "type-is": "~1.6.18", + "utils-merge": "1.0.1", + "vary": "~1.1.2" + }, + "dependencies": { + "array-flatten": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", + "integrity": "sha1-ml9pkFGx5wczKPKgCJaLZOopVdI=", + "dev": true + } + } + }, + "extend-shallow": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-3.0.2.tgz", + "integrity": "sha1-Jqcarwc7OfshJxcnRhMcJwQCjbg=", + "dev": true, + "requires": { + "assign-symbols": "^1.0.0", + "is-extendable": "^1.0.1" + }, + "dependencies": { + "is-extendable": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", + "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", + "dev": true, + "requires": { + "is-plain-object": "^2.0.4" + } + } + } + }, + "external-editor": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/external-editor/-/external-editor-3.1.0.tgz", + "integrity": "sha512-hMQ4CX1p1izmuLYyZqLMO/qGNw10wSv9QDCPfzXfyFrOaCSSoRfqE1Kf1s5an66J5JZC62NewG+mK49jOCtQew==", + "dev": true, + "requires": { + "chardet": "^0.7.0", + "iconv-lite": "^0.4.24", + "tmp": "^0.0.33" + } + }, + "extglob": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/extglob/-/extglob-2.0.4.tgz", + "integrity": "sha512-Nmb6QXkELsuBr24CJSkilo6UHHgbekK5UiZgfE6UHD3Eb27YC6oD+bhcT+tJ6cl8dmsgdQxnWlcry8ksBIBLpw==", + "dev": true, + "requires": { + "array-unique": "^0.3.2", + "define-property": "^1.0.0", + "expand-brackets": "^2.1.4", + "extend-shallow": "^2.0.1", + "fragment-cache": "^0.2.1", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.1" + }, + "dependencies": { + "define-property": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", + "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", + "dev": true, + "requires": { + "is-descriptor": "^1.0.0" + } + }, + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "requires": { + "is-extendable": "^0.1.0" + } + }, + "is-accessor-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", + "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", + "dev": true, + "requires": { + "kind-of": "^6.0.0" + } + }, + "is-data-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", + "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", + "dev": true, + "requires": { + "kind-of": "^6.0.0" + } + }, + "is-descriptor": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", + "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", + "dev": true, + "requires": { + "is-accessor-descriptor": "^1.0.0", + "is-data-descriptor": "^1.0.0", + "kind-of": "^6.0.2" + } + } + } + }, + "fast-deep-equal": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-2.0.1.tgz", + "integrity": "sha1-ewUhjd+WZ79/Nwv3/bLLFf3Qqkk=", + "dev": true + }, + "fast-json-stable-stringify": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.0.0.tgz", + "integrity": "sha1-1RQsDK7msRifh9OnYREGT4bIu/I=", + "dev": true + }, + "fast-levenshtein": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", + "integrity": "sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc=", + "dev": true + }, + "faye-websocket": { + "version": "0.10.0", + "resolved": "https://registry.npmjs.org/faye-websocket/-/faye-websocket-0.10.0.tgz", + "integrity": "sha1-TkkvjQTftviQA1B/btvy1QHnxvQ=", + "dev": true, + "requires": { + "websocket-driver": ">=0.5.1" + } + }, + "figgy-pudding": { + "version": "3.5.1", + "resolved": "https://registry.npmjs.org/figgy-pudding/-/figgy-pudding-3.5.1.tgz", + "integrity": "sha512-vNKxJHTEKNThjfrdJwHc7brvM6eVevuO5nTj6ez8ZQ1qbXTvGthucRF7S4vf2cr71QVnT70V34v0S1DyQsti0w==", + "dev": true + }, + "figures": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/figures/-/figures-2.0.0.tgz", + "integrity": "sha1-OrGi0qYsi/tDGgyUy3l6L84nyWI=", + "dev": true, + "requires": { + "escape-string-regexp": "^1.0.5" + } + }, + "file-entry-cache": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-5.0.1.tgz", + "integrity": "sha512-bCg29ictuBaKUwwArK4ouCaqDgLZcysCFLmM/Yn/FDoqndh/9vNuQfXRDvTuXKLxfD/JtZQGKFT8MGcJBK644g==", + "dev": true, + "requires": { + "flat-cache": "^2.0.1" + } + }, + "filename-regex": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/filename-regex/-/filename-regex-2.0.1.tgz", + "integrity": "sha1-wcS5vuPglyXdsQa3XB4wH+LxiyY=", + "dev": true + }, + "fill-range": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz", + "integrity": "sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc=", + "dev": true, + "requires": { + "extend-shallow": "^2.0.1", + "is-number": "^3.0.0", + "repeat-string": "^1.6.1", + "to-regex-range": "^2.1.0" + }, + "dependencies": { + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "requires": { + "is-extendable": "^0.1.0" + } + } + } + }, + "finalhandler": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.1.2.tgz", + "integrity": "sha512-aAWcW57uxVNrQZqFXjITpW3sIUQmHGG3qSb9mUah9MgMC4NeWhNOlNjXEYq3HjRAvL6arUviZGGJsBg6z0zsWA==", + "dev": true, + "requires": { + "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" + } + }, + "find-cache-dir": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-2.1.0.tgz", + "integrity": "sha512-Tq6PixE0w/VMFfCgbONnkiQIVol/JJL7nRMi20fqzA4NRs9AfeqMGeRdPi3wIhYkxjeBaWh2rxwapn5Tu3IqOQ==", + "dev": true, + "requires": { + "commondir": "^1.0.1", + "make-dir": "^2.0.0", + "pkg-dir": "^3.0.0" + } + }, + "find-up": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz", + "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==", + "dev": true, + "requires": { + "locate-path": "^3.0.0" + } + }, + "findup-sync": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/findup-sync/-/findup-sync-3.0.0.tgz", + "integrity": "sha512-YbffarhcicEhOrm4CtrwdKBdCuz576RLdhJDsIfvNtxUuhdRet1qZcsMjqbePtAseKdAnDyM/IyXbu7PRPRLYg==", + "dev": true, + "requires": { + "detect-file": "^1.0.0", + "is-glob": "^4.0.0", + "micromatch": "^3.0.4", + "resolve-dir": "^1.0.1" + } + }, + "flat-cache": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-2.0.1.tgz", + "integrity": "sha512-LoQe6yDuUMDzQAEH8sgmh4Md6oZnc/7PjtwjNFSzveXqSHt6ka9fPBuso7IGf9Rz4uqnSnWiFH2B/zj24a5ReA==", + "dev": true, + "requires": { + "flatted": "^2.0.0", + "rimraf": "2.6.3", + "write": "1.0.3" + }, + "dependencies": { + "rimraf": { + "version": "2.6.3", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.6.3.tgz", + "integrity": "sha512-mwqeW5XsA2qAejG46gYdENaxXjx9onRNCfn7L0duuP4hCuTIi/QO7PDK07KJfp1d+izWPrzEJDcSqBa0OZQriA==", + "dev": true, + "requires": { + "glob": "^7.1.3" + } + } + } + }, + "flatted": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/flatted/-/flatted-2.0.1.tgz", + "integrity": "sha512-a1hQMktqW9Nmqr5aktAux3JMNqaucxGcjtjWnZLHX7yyPCmlSV3M54nGYbqT8K+0GhF3NBgmJCc3ma+WOgX8Jg==", + "dev": true + }, + "flush-write-stream": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/flush-write-stream/-/flush-write-stream-1.1.1.tgz", + "integrity": "sha512-3Z4XhFZ3992uIq0XOqb9AreonueSYphE6oYbpt5+3u06JWklbsPkNv3ZKkP9Bz/r+1MWCaMoSQ28P85+1Yc77w==", + "dev": true, + "requires": { + "inherits": "^2.0.3", + "readable-stream": "^2.3.6" + } + }, + "follow-redirects": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.9.0.tgz", + "integrity": "sha512-CRcPzsSIbXyVDl0QI01muNDu69S8trU4jArW9LpOt2WtC6LyUJetcIrmfHsRBx7/Jb6GHJUiuqyYxPooFfNt6A==", + "dev": true, + "requires": { + "debug": "^3.0.0" + }, + "dependencies": { + "debug": { + "version": "3.2.6", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.6.tgz", + "integrity": "sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ==", + "dev": true, + "requires": { + "ms": "^2.1.1" + } + }, + "ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "dev": true + } + } + }, + "for-in": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/for-in/-/for-in-1.0.2.tgz", + "integrity": "sha1-gQaNKVqBQuwKxybG4iAMMPttXoA=", + "dev": true + }, + "for-own": { + "version": "0.1.5", + "resolved": "https://registry.npmjs.org/for-own/-/for-own-0.1.5.tgz", + "integrity": "sha1-UmXGgaTylNq78XyVCbZ2OqhFEM4=", + "dev": true, + "requires": { + "for-in": "^1.0.1" + } + }, + "forwarded": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.1.2.tgz", + "integrity": "sha1-mMI9qxF1ZXuMBXPozszZGw/xjIQ=", + "dev": true + }, + "fragment-cache": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/fragment-cache/-/fragment-cache-0.2.1.tgz", + "integrity": "sha1-QpD60n8T6Jvn8zeZxrxaCr//DRk=", + "dev": true, + "requires": { + "map-cache": "^0.2.2" + } + }, + "fresh": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", + "integrity": "sha1-PYyt2Q2XZWn6g1qx+OSyOhBWBac=", + "dev": true + }, + "from2": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/from2/-/from2-2.3.0.tgz", + "integrity": "sha1-i/tVAr3kpNNs/e6gB/zKIdfjgq8=", + "dev": true, + "requires": { + "inherits": "^2.0.1", + "readable-stream": "^2.0.0" + } + }, + "fs-readdir-recursive": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/fs-readdir-recursive/-/fs-readdir-recursive-1.1.0.tgz", + "integrity": "sha512-GNanXlVr2pf02+sPN40XN8HG+ePaNcvM0q5mZBd668Obwb0yD5GiUbZOFgwn8kGMY6I3mdyDJzieUy3PTYyTRA==", + "dev": true + }, + "fs-write-stream-atomic": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/fs-write-stream-atomic/-/fs-write-stream-atomic-1.0.10.tgz", + "integrity": "sha1-tH31NJPvkR33VzHnCp3tAYnbQMk=", + "dev": true, + "requires": { + "graceful-fs": "^4.1.2", + "iferr": "^0.1.5", + "imurmurhash": "^0.1.4", + "readable-stream": "1 || 2" + } + }, + "fs.realpath": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=", + "dev": true + }, + "fsevents": { + "version": "1.2.9", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-1.2.9.tgz", + "integrity": "sha512-oeyj2H3EjjonWcFjD5NvZNE9Rqe4UW+nQBU2HNeKw0koVLEFIhtyETyAakeAM3de7Z/SW5kcA+fZUait9EApnw==", + "dev": true, + "optional": true, + "requires": { + "nan": "^2.12.1", + "node-pre-gyp": "^0.12.0" + }, + "dependencies": { + "abbrev": { + "version": "1.1.1", + "bundled": true, + "dev": true, + "optional": true + }, + "ansi-regex": { + "version": "2.1.1", + "bundled": true, + "dev": true, + "optional": true + }, + "aproba": { + "version": "1.2.0", + "bundled": true, + "dev": true, + "optional": true + }, + "are-we-there-yet": { + "version": "1.1.5", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "delegates": "^1.0.0", + "readable-stream": "^2.0.6" + } + }, + "balanced-match": { + "version": "1.0.0", + "bundled": true, + "dev": true, + "optional": true + }, + "brace-expansion": { + "version": "1.1.11", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "chownr": { + "version": "1.1.1", + "bundled": true, + "dev": true, + "optional": true + }, + "code-point-at": { + "version": "1.1.0", + "bundled": true, + "dev": true, + "optional": true + }, + "concat-map": { + "version": "0.0.1", + "bundled": true, + "dev": true, + "optional": true + }, + "console-control-strings": { + "version": "1.1.0", + "bundled": true, + "dev": true, + "optional": true + }, + "core-util-is": { + "version": "1.0.2", + "bundled": true, + "dev": true, + "optional": true + }, + "debug": { + "version": "4.1.1", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "ms": "^2.1.1" + } + }, + "deep-extend": { + "version": "0.6.0", + "bundled": true, + "dev": true, + "optional": true + }, + "delegates": { + "version": "1.0.0", + "bundled": true, + "dev": true, + "optional": true + }, + "detect-libc": { + "version": "1.0.3", + "bundled": true, + "dev": true, + "optional": true + }, + "fs-minipass": { + "version": "1.2.5", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "minipass": "^2.2.1" + } + }, + "fs.realpath": { + "version": "1.0.0", + "bundled": true, + "dev": true, + "optional": true + }, + "gauge": { + "version": "2.7.4", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "aproba": "^1.0.3", + "console-control-strings": "^1.0.0", + "has-unicode": "^2.0.0", + "object-assign": "^4.1.0", + "signal-exit": "^3.0.0", + "string-width": "^1.0.1", + "strip-ansi": "^3.0.1", + "wide-align": "^1.1.0" + } + }, + "glob": { + "version": "7.1.3", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.0.4", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + } + }, + "has-unicode": { + "version": "2.0.1", + "bundled": true, + "dev": true, + "optional": true + }, + "iconv-lite": { + "version": "0.4.24", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "safer-buffer": ">= 2.1.2 < 3" + } + }, + "ignore-walk": { + "version": "3.0.1", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "minimatch": "^3.0.4" + } + }, + "inflight": { + "version": "1.0.6", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "once": "^1.3.0", + "wrappy": "1" + } + }, + "inherits": { + "version": "2.0.3", + "bundled": true, + "dev": true, + "optional": true + }, + "ini": { + "version": "1.3.5", + "bundled": true, + "dev": true, + "optional": true + }, + "is-fullwidth-code-point": { + "version": "1.0.0", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "number-is-nan": "^1.0.0" + } + }, + "isarray": { + "version": "1.0.0", + "bundled": true, + "dev": true, + "optional": true + }, + "minimatch": { + "version": "3.0.4", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "brace-expansion": "^1.1.7" + } + }, + "minimist": { + "version": "0.0.8", + "bundled": true, + "dev": true, + "optional": true + }, + "minipass": { + "version": "2.3.5", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "safe-buffer": "^5.1.2", + "yallist": "^3.0.0" + } + }, + "minizlib": { + "version": "1.2.1", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "minipass": "^2.2.1" + } + }, + "mkdirp": { + "version": "0.5.1", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "minimist": "0.0.8" + } + }, + "ms": { + "version": "2.1.1", + "bundled": true, + "dev": true, + "optional": true + }, + "needle": { + "version": "2.3.0", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "debug": "^4.1.0", + "iconv-lite": "^0.4.4", + "sax": "^1.2.4" + } + }, + "node-pre-gyp": { + "version": "0.12.0", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "detect-libc": "^1.0.2", + "mkdirp": "^0.5.1", + "needle": "^2.2.1", + "nopt": "^4.0.1", + "npm-packlist": "^1.1.6", + "npmlog": "^4.0.2", + "rc": "^1.2.7", + "rimraf": "^2.6.1", + "semver": "^5.3.0", + "tar": "^4" + } + }, + "nopt": { + "version": "4.0.1", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "abbrev": "1", + "osenv": "^0.1.4" + } + }, + "npm-bundled": { + "version": "1.0.6", + "bundled": true, + "dev": true, + "optional": true + }, + "npm-packlist": { + "version": "1.4.1", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "ignore-walk": "^3.0.1", + "npm-bundled": "^1.0.1" + } + }, + "npmlog": { + "version": "4.1.2", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "are-we-there-yet": "~1.1.2", + "console-control-strings": "~1.1.0", + "gauge": "~2.7.3", + "set-blocking": "~2.0.0" + } + }, + "number-is-nan": { + "version": "1.0.1", + "bundled": true, + "dev": true, + "optional": true + }, + "object-assign": { + "version": "4.1.1", + "bundled": true, + "dev": true, + "optional": true + }, + "once": { + "version": "1.4.0", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "wrappy": "1" + } + }, + "os-homedir": { + "version": "1.0.2", + "bundled": true, + "dev": true, + "optional": true + }, + "os-tmpdir": { + "version": "1.0.2", + "bundled": true, + "dev": true, + "optional": true + }, + "osenv": { + "version": "0.1.5", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "os-homedir": "^1.0.0", + "os-tmpdir": "^1.0.0" + } + }, + "path-is-absolute": { + "version": "1.0.1", + "bundled": true, + "dev": true, + "optional": true + }, + "process-nextick-args": { + "version": "2.0.0", + "bundled": true, + "dev": true, + "optional": true + }, + "rc": { + "version": "1.2.8", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "deep-extend": "^0.6.0", + "ini": "~1.3.0", + "minimist": "^1.2.0", + "strip-json-comments": "~2.0.1" + }, + "dependencies": { + "minimist": { + "version": "1.2.0", + "bundled": true, + "dev": true, + "optional": true + } + } + }, + "readable-stream": { + "version": "2.3.6", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "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" + } + }, + "rimraf": { + "version": "2.6.3", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "glob": "^7.1.3" + } + }, + "safe-buffer": { + "version": "5.1.2", + "bundled": true, + "dev": true, + "optional": true + }, + "safer-buffer": { + "version": "2.1.2", + "bundled": true, + "dev": true, + "optional": true + }, + "sax": { + "version": "1.2.4", + "bundled": true, + "dev": true, + "optional": true + }, + "semver": { + "version": "5.7.0", + "bundled": true, + "dev": true, + "optional": true + }, + "set-blocking": { + "version": "2.0.0", + "bundled": true, + "dev": true, + "optional": true + }, + "signal-exit": { + "version": "3.0.2", + "bundled": true, + "dev": true, + "optional": true + }, + "string-width": { + "version": "1.0.2", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "code-point-at": "^1.0.0", + "is-fullwidth-code-point": "^1.0.0", + "strip-ansi": "^3.0.0" + } + }, + "string_decoder": { + "version": "1.1.1", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "safe-buffer": "~5.1.0" + } + }, + "strip-ansi": { + "version": "3.0.1", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "ansi-regex": "^2.0.0" + } + }, + "strip-json-comments": { + "version": "2.0.1", + "bundled": true, + "dev": true, + "optional": true + }, + "tar": { + "version": "4.4.8", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "chownr": "^1.1.1", + "fs-minipass": "^1.2.5", + "minipass": "^2.3.4", + "minizlib": "^1.1.1", + "mkdirp": "^0.5.0", + "safe-buffer": "^5.1.2", + "yallist": "^3.0.2" + } + }, + "util-deprecate": { + "version": "1.0.2", + "bundled": true, + "dev": true, + "optional": true + }, + "wide-align": { + "version": "1.1.3", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "string-width": "^1.0.2 || 2" + } + }, + "wrappy": { + "version": "1.0.2", + "bundled": true, + "dev": true, + "optional": true + }, + "yallist": { + "version": "3.0.3", + "bundled": true, + "dev": true, + "optional": true + } + } + }, + "function-bind": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", + "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==", + "dev": true + }, + "functional-red-black-tree": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz", + "integrity": "sha1-GwqzvVU7Kg1jmdKcDj6gslIHgyc=", + "dev": true + }, + "generate-function": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/generate-function/-/generate-function-2.3.1.tgz", + "integrity": "sha512-eeB5GfMNeevm/GRYq20ShmsaGcmI81kIX2K9XQx5miC8KdHaC6Jm0qQ8ZNeGOi7wYB8OsdxKs+Y2oVuTFuVwKQ==", + "dev": true, + "requires": { + "is-property": "^1.0.2" + } + }, + "generate-object-property": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/generate-object-property/-/generate-object-property-1.2.0.tgz", + "integrity": "sha1-nA4cQDCM6AT0eDYYuTf6iPmdUNA=", + "dev": true, + "requires": { + "is-property": "^1.0.0" + } + }, + "get-caller-file": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", + "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", + "dev": true + }, + "get-stdin": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/get-stdin/-/get-stdin-4.0.1.tgz", + "integrity": "sha1-uWjGsKBDhDJJAui/Gl3zJXmkUP4=", + "dev": true + }, + "get-stream": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-3.0.0.tgz", + "integrity": "sha1-jpQ9E1jcN1VQVOy+LtsFqhdO3hQ=", + "dev": true + }, + "get-value": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/get-value/-/get-value-2.0.6.tgz", + "integrity": "sha1-3BXKHGcjh8p2vTesCjlbogQqLCg=", + "dev": true + }, + "glob": { + "version": "7.1.4", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.4.tgz", + "integrity": "sha512-hkLPepehmnKk41pUGm3sYxoFs/umurYfYJCerbXEyFIWcAzvpipAgVkBqqT9RBKMGjnq6kMuyYwha6csxbiM1A==", + "dev": true, + "requires": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.0.4", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + } + }, + "glob-base": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/glob-base/-/glob-base-0.3.0.tgz", + "integrity": "sha1-27Fk9iIbHAscz4Kuoyi0l98Oo8Q=", + "dev": true, + "requires": { + "glob-parent": "^2.0.0", + "is-glob": "^2.0.0" + }, + "dependencies": { + "glob-parent": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-2.0.0.tgz", + "integrity": "sha1-gTg9ctsFT8zPUzbaqQLxgvbtuyg=", + "dev": true, + "requires": { + "is-glob": "^2.0.0" + } + }, + "is-extglob": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-1.0.0.tgz", + "integrity": "sha1-rEaBd8SUNAWgkvyPKXYMb/xiBsA=", + "dev": true + }, + "is-glob": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-2.0.1.tgz", + "integrity": "sha1-0Jb5JqPe1WAPP9/ZEZjLCIjC2GM=", + "dev": true, + "requires": { + "is-extglob": "^1.0.0" + } + } + } + }, + "glob-parent": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-3.1.0.tgz", + "integrity": "sha1-nmr2KZ2NO9K9QEMIMr0RPfkGxa4=", + "dev": true, + "requires": { + "is-glob": "^3.1.0", + "path-dirname": "^1.0.0" + }, + "dependencies": { + "is-glob": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-3.1.0.tgz", + "integrity": "sha1-e6WuJCF4BKxwcHuWkiVnSGzD6Eo=", + "dev": true, + "requires": { + "is-extglob": "^2.1.0" + } + } + } + }, + "global-dirs": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/global-dirs/-/global-dirs-0.1.1.tgz", + "integrity": "sha1-sxnA3UYH81PzvpzKTHL8FIxJ9EU=", + "dev": true, + "requires": { + "ini": "^1.3.4" + } + }, + "global-modules": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/global-modules/-/global-modules-2.0.0.tgz", + "integrity": "sha512-NGbfmJBp9x8IxyJSd1P+otYK8vonoJactOogrVfFRIAEY1ukil8RSKDz2Yo7wh1oihl51l/r6W4epkeKJHqL8A==", + "dev": true, + "requires": { + "global-prefix": "^3.0.0" + }, + "dependencies": { + "global-prefix": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/global-prefix/-/global-prefix-3.0.0.tgz", + "integrity": "sha512-awConJSVCHVGND6x3tmMaKcQvwXLhjdkmomy2W+Goaui8YPgYgXJZewhg3fWC+DlfqqQuWg8AwqjGTD2nAPVWg==", + "dev": true, + "requires": { + "ini": "^1.3.5", + "kind-of": "^6.0.2", + "which": "^1.3.1" + } + } + } + }, + "global-prefix": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/global-prefix/-/global-prefix-1.0.2.tgz", + "integrity": "sha1-2/dDxsFJklk8ZVVoy2btMsASLr4=", + "dev": true, + "requires": { + "expand-tilde": "^2.0.2", + "homedir-polyfill": "^1.0.1", + "ini": "^1.3.4", + "is-windows": "^1.0.1", + "which": "^1.2.14" + } + }, + "globals": { + "version": "11.12.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", + "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==", + "dev": true + }, + "globby": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/globby/-/globby-6.1.0.tgz", + "integrity": "sha1-9abXDoOV4hyFj7BInWTfAkJNUGw=", + "dev": true, + "requires": { + "array-union": "^1.0.1", + "glob": "^7.0.3", + "object-assign": "^4.0.1", + "pify": "^2.0.0", + "pinkie-promise": "^2.0.0" + }, + "dependencies": { + "pify": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", + "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=", + "dev": true + } + } + }, + "got": { + "version": "6.7.1", + "resolved": "https://registry.npmjs.org/got/-/got-6.7.1.tgz", + "integrity": "sha1-JAzQV4WpoY5WHcG0S0HHY+8ejbA=", + "dev": true, + "requires": { + "create-error-class": "^3.0.0", + "duplexer3": "^0.1.4", + "get-stream": "^3.0.0", + "is-redirect": "^1.0.0", + "is-retry-allowed": "^1.0.0", + "is-stream": "^1.0.0", + "lowercase-keys": "^1.0.0", + "safe-buffer": "^5.0.1", + "timed-out": "^4.0.0", + "unzip-response": "^2.0.1", + "url-parse-lax": "^1.0.0" + } + }, + "graceful-fs": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.2.tgz", + "integrity": "sha512-IItsdsea19BoLC7ELy13q1iJFNmd7ofZH5+X/pJr90/nRoPEX0DJo1dHDbgtYWOhJhcCgMDTOw84RZ72q6lB+Q==", + "dev": true + }, + "handle-thing": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/handle-thing/-/handle-thing-2.0.0.tgz", + "integrity": "sha512-d4sze1JNC454Wdo2fkuyzCr6aHcbL6PGGuFAz0Li/NcOm1tCHGnWDRmJP85dh9IhQErTc2svWFEX5xHIOo//kQ==", + "dev": true + }, + "has": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", + "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", + "dev": true, + "requires": { + "function-bind": "^1.1.1" + } + }, + "has-ansi": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/has-ansi/-/has-ansi-2.0.0.tgz", + "integrity": "sha1-NPUEnOHs3ysGSa8+8k5F7TVBbZE=", + "dev": true, + "requires": { + "ansi-regex": "^2.0.0" + } + }, + "has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", + "dev": true + }, + "has-symbols": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.0.tgz", + "integrity": "sha1-uhqPGvKg/DllD1yFA2dwQSIGO0Q=", + "dev": true + }, + "has-value": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-value/-/has-value-1.0.0.tgz", + "integrity": "sha1-GLKB2lhbHFxR3vJMkw7SmgvmsXc=", + "dev": true, + "requires": { + "get-value": "^2.0.6", + "has-values": "^1.0.0", + "isobject": "^3.0.0" + } + }, + "has-values": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-values/-/has-values-1.0.0.tgz", + "integrity": "sha1-lbC2P+whRmGab+V/51Yo1aOe/k8=", + "dev": true, + "requires": { + "is-number": "^3.0.0", + "kind-of": "^4.0.0" + }, + "dependencies": { + "kind-of": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-4.0.0.tgz", + "integrity": "sha1-IIE989cSkosgc3hpGkUGb65y3Vc=", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "hash-base": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/hash-base/-/hash-base-3.0.4.tgz", + "integrity": "sha1-X8hoaEfs1zSZQDMZprCj8/auSRg=", + "dev": true, + "requires": { + "inherits": "^2.0.1", + "safe-buffer": "^5.0.1" + } + }, + "hash.js": { + "version": "1.1.7", + "resolved": "https://registry.npmjs.org/hash.js/-/hash.js-1.1.7.tgz", + "integrity": "sha512-taOaskGt4z4SOANNseOviYDvjEJinIkRgmp7LbKP2YTTmVxWBl87s/uzK9r+44BclBSp2X7K1hqeNfz9JbBeXA==", + "dev": true, + "requires": { + "inherits": "^2.0.3", + "minimalistic-assert": "^1.0.1" + } + }, + "hmac-drbg": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/hmac-drbg/-/hmac-drbg-1.0.1.tgz", + "integrity": "sha1-0nRXAQJabHdabFRXk+1QL8DGSaE=", + "dev": true, + "requires": { + "hash.js": "^1.0.3", + "minimalistic-assert": "^1.0.0", + "minimalistic-crypto-utils": "^1.0.1" + } + }, + "home-or-tmp": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/home-or-tmp/-/home-or-tmp-2.0.0.tgz", + "integrity": "sha1-42w/LSyufXRqhX440Y1fMqeILbg=", + "dev": true, + "requires": { + "os-homedir": "^1.0.0", + "os-tmpdir": "^1.0.1" + } + }, + "homedir-polyfill": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/homedir-polyfill/-/homedir-polyfill-1.0.3.tgz", + "integrity": "sha512-eSmmWE5bZTK2Nou4g0AI3zZ9rswp7GRKoKXS1BLUkvPviOqs4YTN1djQIqrXy9k5gEtdLPy86JjRwsNM9tnDcA==", + "dev": true, + "requires": { + "parse-passwd": "^1.0.0" + } + }, + "hosted-git-info": { + "version": "2.8.4", + "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.8.4.tgz", + "integrity": "sha512-pzXIvANXEFrc5oFFXRMkbLPQ2rXRoDERwDLyrcUxGhaZhgP54BBSl9Oheh7Vv0T090cszWBxPjkQQ5Sq1PbBRQ==", + "dev": true + }, + "hpack.js": { + "version": "2.1.6", + "resolved": "https://registry.npmjs.org/hpack.js/-/hpack.js-2.1.6.tgz", + "integrity": "sha1-h3dMCUnlE/QuhFdbPEVoH63ioLI=", + "dev": true, + "requires": { + "inherits": "^2.0.1", + "obuf": "^1.0.0", + "readable-stream": "^2.0.1", + "wbuf": "^1.1.0" + } + }, + "html-entities": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/html-entities/-/html-entities-1.2.1.tgz", + "integrity": "sha1-DfKTUfByEWNRXfueVUPl9u7VFi8=", + "dev": true + }, + "http-deceiver": { + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/http-deceiver/-/http-deceiver-1.2.7.tgz", + "integrity": "sha1-+nFolEq5pRnTN8sL7HKE3D5yPYc=", + "dev": true + }, + "http-errors": { + "version": "1.7.2", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.7.2.tgz", + "integrity": "sha512-uUQBt3H/cSIVfch6i1EuPNy/YsRSOUBXTVfZ+yR7Zjez3qjBz6i9+i4zjNaoqcoFVI4lQJ5plg63TvGfRSDCRg==", + "dev": true, + "requires": { + "depd": "~1.1.2", + "inherits": "2.0.3", + "setprototypeof": "1.1.1", + "statuses": ">= 1.5.0 < 2", + "toidentifier": "1.0.0" + }, + "dependencies": { + "inherits": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", + "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=", + "dev": true + } + } + }, + "http-parser-js": { + "version": "0.4.10", + "resolved": "https://registry.npmjs.org/http-parser-js/-/http-parser-js-0.4.10.tgz", + "integrity": "sha1-ksnBN0w1CF912zWexWzCV8u5P6Q=", + "dev": true + }, + "http-proxy": { + "version": "1.17.0", + "resolved": "https://registry.npmjs.org/http-proxy/-/http-proxy-1.17.0.tgz", + "integrity": "sha512-Taqn+3nNvYRfJ3bGvKfBSRwy1v6eePlm3oc/aWVxZp57DQr5Eq3xhKJi7Z4hZpS8PC3H4qI+Yly5EmFacGuA/g==", + "dev": true, + "requires": { + "eventemitter3": "^3.0.0", + "follow-redirects": "^1.0.0", + "requires-port": "^1.0.0" + } + }, + "http-proxy-middleware": { + "version": "0.19.1", + "resolved": "https://registry.npmjs.org/http-proxy-middleware/-/http-proxy-middleware-0.19.1.tgz", + "integrity": "sha512-yHYTgWMQO8VvwNS22eLLloAkvungsKdKTLO8AJlftYIKNfJr3GK3zK0ZCfzDDGUBttdGc8xFy1mCitvNKQtC3Q==", + "dev": true, + "requires": { + "http-proxy": "^1.17.0", + "is-glob": "^4.0.0", + "lodash": "^4.17.11", + "micromatch": "^3.1.10" + } + }, + "https-browserify": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/https-browserify/-/https-browserify-1.0.0.tgz", + "integrity": "sha1-7AbBDgo0wPL68Zn3/X/Hj//QPHM=", + "dev": true + }, + "iconv-lite": { + "version": "0.4.24", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", + "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", + "dev": true, + "requires": { + "safer-buffer": ">= 2.1.2 < 3" + } + }, + "ieee754": { + "version": "1.1.13", + "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.1.13.tgz", + "integrity": "sha512-4vf7I2LYV/HaWerSo3XmlMkp5eZ83i+/CDluXi/IGTs/O1sejBNhTtnxzmRZfvOUqj7lZjqHkeTvpgSFDlWZTg==", + "dev": true + }, + "iferr": { + "version": "0.1.5", + "resolved": "https://registry.npmjs.org/iferr/-/iferr-0.1.5.tgz", + "integrity": "sha1-xg7taebY/bazEEofy8ocGS3FtQE=", + "dev": true + }, + "ignore": { + "version": "4.0.6", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-4.0.6.tgz", + "integrity": "sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg==", + "dev": true + }, + "ignore-by-default": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/ignore-by-default/-/ignore-by-default-1.0.1.tgz", + "integrity": "sha1-SMptcvbGo68Aqa1K5odr44ieKwk=", + "dev": true + }, + "immediate": { + "version": "3.0.6", + "resolved": "https://registry.npmjs.org/immediate/-/immediate-3.0.6.tgz", + "integrity": "sha1-nbHb0Pr43m++D13V5Wu2BigN5ps=" + }, + "import-fresh": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.1.0.tgz", + "integrity": "sha512-PpuksHKGt8rXfWEr9m9EHIpgyyaltBy8+eF6GJM0QCAxMgxCfucMF3mjecK2QsJr0amJW7gTqh5/wht0z2UhEQ==", + "dev": true, + "requires": { + "parent-module": "^1.0.0", + "resolve-from": "^4.0.0" + }, + "dependencies": { + "resolve-from": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", + "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", + "dev": true + } + } + }, + "import-lazy": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/import-lazy/-/import-lazy-2.1.0.tgz", + "integrity": "sha1-BWmOPUXIjo1+nZLLBYTnfwlvPkM=", + "dev": true + }, + "import-local": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/import-local/-/import-local-2.0.0.tgz", + "integrity": "sha512-b6s04m3O+s3CGSbqDIyP4R6aAwAeYlVq9+WUWep6iHa8ETRf9yei1U48C5MmfJmV9AiLYYBKPMq/W+/WRpQmCQ==", + "dev": true, + "requires": { + "pkg-dir": "^3.0.0", + "resolve-cwd": "^2.0.0" + } + }, + "imurmurhash": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", + "integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o=", + "dev": true + }, + "infer-owner": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/infer-owner/-/infer-owner-1.0.4.tgz", + "integrity": "sha512-IClj+Xz94+d7irH5qRyfJonOdfTzuDaifE6ZPWfx0N0+/ATZCbuTPq2prFl526urkQd90WyUKIh1DfBQ2hMz9A==", + "dev": true + }, + "inflight": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", + "dev": true, + "requires": { + "once": "^1.3.0", + "wrappy": "1" + } + }, + "inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" + }, + "ini": { + "version": "1.3.5", + "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.5.tgz", + "integrity": "sha512-RZY5huIKCMRWDUqZlEi72f/lmXKMvuszcMBduliQ3nnWbx9X/ZBQO7DijMEYS9EhHBb2qacRUMtC7svLwe0lcw==", + "dev": true + }, + "inquirer": { + "version": "6.5.2", + "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-6.5.2.tgz", + "integrity": "sha512-cntlB5ghuB0iuO65Ovoi8ogLHiWGs/5yNrtUcKjFhSSiVeAIVpD7koaSU9RM8mpXw5YDi9RdYXGQMaOURB7ycQ==", + "dev": true, + "requires": { + "ansi-escapes": "^3.2.0", + "chalk": "^2.4.2", + "cli-cursor": "^2.1.0", + "cli-width": "^2.0.0", + "external-editor": "^3.0.3", + "figures": "^2.0.0", + "lodash": "^4.17.12", + "mute-stream": "0.0.7", + "run-async": "^2.2.0", + "rxjs": "^6.4.0", + "string-width": "^2.1.0", + "strip-ansi": "^5.1.0", + "through": "^2.3.6" + }, + "dependencies": { + "ansi-regex": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", + "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==", + "dev": true + }, + "strip-ansi": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", + "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", + "dev": true, + "requires": { + "ansi-regex": "^4.1.0" + } + } + } + }, + "internal-ip": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/internal-ip/-/internal-ip-4.3.0.tgz", + "integrity": "sha512-S1zBo1D6zcsyuC6PMmY5+55YMILQ9av8lotMx447Bq6SAgo/sDK6y6uUKmuYhW7eacnIhFfsPmCNYdDzsnnDCg==", + "dev": true, + "requires": { + "default-gateway": "^4.2.0", + "ipaddr.js": "^1.9.0" + } + }, + "interpret": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/interpret/-/interpret-1.2.0.tgz", + "integrity": "sha512-mT34yGKMNceBQUoVn7iCDKDntA7SC6gycMAWzGx1z/CMCTV7b2AAtXlo3nRyHZ1FelRkQbQjprHSYGwzLtkVbw==", + "dev": true + }, + "invariant": { + "version": "2.2.4", + "resolved": "https://registry.npmjs.org/invariant/-/invariant-2.2.4.tgz", + "integrity": "sha512-phJfQVBuaJM5raOpJjSfkiD6BpbCE4Ns//LaXl6wGYtUBY83nWS6Rf9tXm2e8VaK60JEjYldbPif/A2B1C2gNA==", + "dev": true, + "requires": { + "loose-envify": "^1.0.0" + } + }, + "invert-kv": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/invert-kv/-/invert-kv-1.0.0.tgz", + "integrity": "sha1-EEqOSqym09jNFXqO+L+rLXo//bY=", + "dev": true + }, + "ip": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/ip/-/ip-1.1.5.tgz", + "integrity": "sha1-vd7XARQpCCjAoDnnLvJfWq7ENUo=", + "dev": true + }, + "ip-regex": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/ip-regex/-/ip-regex-2.1.0.tgz", + "integrity": "sha1-+ni/XS5pE8kRzp+BnuUUa7bYROk=", + "dev": true + }, + "ipaddr.js": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.0.tgz", + "integrity": "sha512-M4Sjn6N/+O6/IXSJseKqHoFc+5FdGJ22sXqnjTpdZweHK64MzEPAyQZyEU3R/KRv2GLoa7nNtg/C2Ev6m7z+eA==", + "dev": true + }, + "is-absolute-url": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/is-absolute-url/-/is-absolute-url-3.0.1.tgz", + "integrity": "sha512-c2QjUwuMxLsld90sj3xYzpFYWJtuxkIn1f5ua9RTEYJt/vV2IsM+Py00/6qjV7qExgifUvt7qfyBGBBKm+2iBg==", + "dev": true + }, + "is-accessor-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", + "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=", + "dev": true, + "requires": { + "kind-of": "^3.0.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "is-arguments": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/is-arguments/-/is-arguments-1.0.4.tgz", + "integrity": "sha512-xPh0Rmt8NE65sNzvyUmWgI1tz3mKq74lGA0mL8LYZcoIzKOzDh6HmrYm3d18k60nHerC8A9Km8kYu87zfSFnLA==", + "dev": true + }, + "is-arrayish": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", + "integrity": "sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0=", + "dev": true + }, + "is-binary-path": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-1.0.1.tgz", + "integrity": "sha1-dfFmQrSA8YenEcgUFh/TpKdlWJg=", + "dev": true, + "requires": { + "binary-extensions": "^1.0.0" + } + }, + "is-buffer": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz", + "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==", + "dev": true + }, + "is-callable": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.1.4.tgz", + "integrity": "sha512-r5p9sxJjYnArLjObpjA4xu5EKI3CuKHkJXMhT7kwbpUyIFD1n5PMAsoPvWnvtZiNz7LjkYDRZhd7FlI0eMijEA==", + "dev": true + }, + "is-ci": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/is-ci/-/is-ci-1.2.1.tgz", + "integrity": "sha512-s6tfsaQaQi3JNciBH6shVqEDvhGut0SUXr31ag8Pd8BBbVVlcGfWhpPmEOoM6RJ5TFhbypvf5yyRw/VXW1IiWg==", + "dev": true, + "requires": { + "ci-info": "^1.5.0" + } + }, + "is-data-descriptor": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", + "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=", + "dev": true, + "requires": { + "kind-of": "^3.0.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "is-date-object": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.1.tgz", + "integrity": "sha1-mqIOtq7rv/d/vTPnTKAbM1gdOhY=", + "dev": true + }, + "is-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", + "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==", + "dev": true, + "requires": { + "is-accessor-descriptor": "^0.1.6", + "is-data-descriptor": "^0.1.4", + "kind-of": "^5.0.0" + }, + "dependencies": { + "kind-of": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", + "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==", + "dev": true + } + } + }, + "is-dotfile": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/is-dotfile/-/is-dotfile-1.0.3.tgz", + "integrity": "sha1-pqLzL/0t+wT1yiXs0Pa4PPeYoeE=", + "dev": true + }, + "is-equal-shallow": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/is-equal-shallow/-/is-equal-shallow-0.1.3.tgz", + "integrity": "sha1-IjgJj8Ih3gvPpdnqxMRdY4qhxTQ=", + "dev": true, + "requires": { + "is-primitive": "^2.0.0" + } + }, + "is-extendable": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", + "integrity": "sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik=", + "dev": true + }, + "is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=", + "dev": true + }, + "is-finite": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-finite/-/is-finite-1.0.2.tgz", + "integrity": "sha1-zGZ3aVYCvlUO8R6LSqYwU0K20Ko=", + "dev": true, + "requires": { + "number-is-nan": "^1.0.0" + } + }, + "is-fullwidth-code-point": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", + "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=", + "dev": true + }, + "is-glob": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.1.tgz", + "integrity": "sha512-5G0tKtBTFImOqDnLB2hG6Bp2qcKEFduo4tZu9MT/H6NQv/ghhy30o55ufafxJ/LdH79LLs2Kfrn85TLKyA7BUg==", + "dev": true, + "requires": { + "is-extglob": "^2.1.1" + } + }, + "is-installed-globally": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/is-installed-globally/-/is-installed-globally-0.1.0.tgz", + "integrity": "sha1-Df2Y9akRFxbdU13aZJL2e/PSWoA=", + "dev": true, + "requires": { + "global-dirs": "^0.1.0", + "is-path-inside": "^1.0.0" + } + }, + "is-integer": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/is-integer/-/is-integer-1.0.7.tgz", + "integrity": "sha1-a96Bqs3feLZZtmKdYpytxRqIbVw=", + "dev": true, + "requires": { + "is-finite": "^1.0.0" + } + }, + "is-my-ip-valid": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-my-ip-valid/-/is-my-ip-valid-1.0.0.tgz", + "integrity": "sha512-gmh/eWXROncUzRnIa1Ubrt5b8ep/MGSnfAUI3aRp+sqTCs1tv1Isl8d8F6JmkN3dXKc3ehZMrtiPN9eL03NuaQ==", + "dev": true + }, + "is-my-json-valid": { + "version": "2.20.0", + "resolved": "https://registry.npmjs.org/is-my-json-valid/-/is-my-json-valid-2.20.0.tgz", + "integrity": "sha512-XTHBZSIIxNsIsZXg7XB5l8z/OBFosl1Wao4tXLpeC7eKU4Vm/kdop2azkPqULwnfGQjmeDIyey9g7afMMtdWAA==", + "dev": true, + "requires": { + "generate-function": "^2.0.0", + "generate-object-property": "^1.1.0", + "is-my-ip-valid": "^1.0.0", + "jsonpointer": "^4.0.0", + "xtend": "^4.0.0" + } + }, + "is-npm": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-npm/-/is-npm-1.0.0.tgz", + "integrity": "sha1-8vtjpl5JBbQGyGBydloaTceTufQ=", + "dev": true + }, + "is-number": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", + "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", + "dev": true, + "requires": { + "kind-of": "^3.0.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "is-obj": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-obj/-/is-obj-1.0.1.tgz", + "integrity": "sha1-PkcprB9f3gJc19g6iW2rn09n2w8=", + "dev": true + }, + "is-path-cwd": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/is-path-cwd/-/is-path-cwd-2.2.0.tgz", + "integrity": "sha512-w942bTcih8fdJPJmQHFzkS76NEP8Kzzvmw92cXsazb8intwLqPibPPdXf4ANdKV3rYMuuQYGIWtvz9JilB3NFQ==", + "dev": true + }, + "is-path-in-cwd": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-path-in-cwd/-/is-path-in-cwd-2.1.0.tgz", + "integrity": "sha512-rNocXHgipO+rvnP6dk3zI20RpOtrAM/kzbB258Uw5BWr3TpXi861yzjo16Dn4hUox07iw5AyeMLHWsujkjzvRQ==", + "dev": true, + "requires": { + "is-path-inside": "^2.1.0" + }, + "dependencies": { + "is-path-inside": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-2.1.0.tgz", + "integrity": "sha512-wiyhTzfDWsvwAW53OBWF5zuvaOGlZ6PwYxAbPVDhpm+gM09xKQGjBq/8uYN12aDvMxnAnq3dxTyoSoRNmg5YFg==", + "dev": true, + "requires": { + "path-is-inside": "^1.0.2" + } + } + } + }, + "is-path-inside": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-1.0.1.tgz", + "integrity": "sha1-jvW33lBDej/cprToZe96pVy0gDY=", + "dev": true, + "requires": { + "path-is-inside": "^1.0.1" + } + }, + "is-plain-obj": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-1.1.0.tgz", + "integrity": "sha1-caUMhCnfync8kqOQpKA7OfzVHT4=", + "dev": true + }, + "is-plain-object": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz", + "integrity": "sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==", + "dev": true, + "requires": { + "isobject": "^3.0.1" + } + }, + "is-posix-bracket": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/is-posix-bracket/-/is-posix-bracket-0.1.1.tgz", + "integrity": "sha1-MzTceXdDaOkvAW5vvAqI9c1ua8Q=", + "dev": true + }, + "is-primitive": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-primitive/-/is-primitive-2.0.0.tgz", + "integrity": "sha1-IHurkWOEmcB7Kt8kCkGochADRXU=", + "dev": true + }, + "is-promise": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-promise/-/is-promise-2.1.0.tgz", + "integrity": "sha1-eaKp7OfwlugPNtKy87wWwf9L8/o=", + "dev": true + }, + "is-property": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-property/-/is-property-1.0.2.tgz", + "integrity": "sha1-V/4cTkhHTt1lsJkR8msc1Ald2oQ=", + "dev": true + }, + "is-redirect": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-redirect/-/is-redirect-1.0.0.tgz", + "integrity": "sha1-HQPd7VO9jbDzDCbk+V02/HyH3CQ=", + "dev": true + }, + "is-regex": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.0.4.tgz", + "integrity": "sha1-VRdIm1RwkbCTDglWVM7SXul+lJE=", + "dev": true, + "requires": { + "has": "^1.0.1" + } + }, + "is-resolvable": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-resolvable/-/is-resolvable-1.1.0.tgz", + "integrity": "sha512-qgDYXFSR5WvEfuS5dMj6oTMEbrrSaM0CrFk2Yiq/gXnBvD9pMa2jGXxyhGLfvhZpuMZe18CJpFxAt3CRs42NMg==", + "dev": true + }, + "is-retry-allowed": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/is-retry-allowed/-/is-retry-allowed-1.2.0.tgz", + "integrity": "sha512-RUbUeKwvm3XG2VYamhJL1xFktgjvPzL0Hq8C+6yrWIswDy3BIXGqCxhxkc30N9jqK311gVU137K8Ei55/zVJRg==", + "dev": true + }, + "is-stream": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz", + "integrity": "sha1-EtSj3U5o4Lec6428hBc66A2RykQ=", + "dev": true + }, + "is-symbol": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.2.tgz", + "integrity": "sha512-HS8bZ9ox60yCJLH9snBpIwv9pYUAkcuLhSA1oero1UB5y9aiQpRA8y2ex945AOtCZL1lJDeIk3G5LthswI46Lw==", + "dev": true, + "requires": { + "has-symbols": "^1.0.0" + } + }, + "is-windows": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-windows/-/is-windows-1.0.2.tgz", + "integrity": "sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA==", + "dev": true + }, + "is-wsl": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-1.1.0.tgz", + "integrity": "sha1-HxbkqiKwTRM2tmGIpmrzxgDDpm0=", + "dev": true + }, + "isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=" + }, + "isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=", + "dev": true + }, + "isobject": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", + "dev": true + }, + "jpeg-js": { + "version": "0.3.6", + "resolved": "https://registry.npmjs.org/jpeg-js/-/jpeg-js-0.3.6.tgz", + "integrity": "sha512-MUj2XlMB8kpe+8DJUGH/3UJm4XpI8XEgZQ+CiHDeyrGoKPdW/8FJv6ku+3UiYm5Fz3CWaL+iXmD8Q4Ap6aC1Jw==" + }, + "js-base64": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/js-base64/-/js-base64-2.5.1.tgz", + "integrity": "sha512-M7kLczedRMYX4L8Mdh4MzyAMM9O5osx+4FcOQuTvr3A9F2D9S5JXheN0ewNbrvK2UatkTRhL5ejGmGSjNMiZuw==" + }, + "js-levenshtein": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/js-levenshtein/-/js-levenshtein-1.1.6.tgz", + "integrity": "sha512-X2BB11YZtrRqY4EnQcLX5Rh373zbK4alC1FW7D7MBhL2gtcC17cTnr6DmfHZeS0s2rTHjUTMMHfG7gO8SSdw+g==", + "dev": true + }, + "js-tokens": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", + "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", + "dev": true + }, + "js-yaml": { + "version": "3.13.1", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.13.1.tgz", + "integrity": "sha512-YfbcO7jXDdyj0DGxYVSlSeQNHbD7XPWvrVWeVUujrQEoZzWJIRrCPoyk6kL6IAjAG2IolMK4T0hNUe0HOUs5Jw==", + "dev": true, + "requires": { + "argparse": "^1.0.7", + "esprima": "^4.0.0" + }, + "dependencies": { + "esprima": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", + "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", + "dev": true + } + } + }, + "jsesc": { + "version": "2.5.2", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz", + "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==", + "dev": true + }, + "json-parse-better-errors": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/json-parse-better-errors/-/json-parse-better-errors-1.0.2.tgz", + "integrity": "sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw==", + "dev": true + }, + "json-schema-traverse": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", + "dev": true + }, + "json-stable-stringify": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/json-stable-stringify/-/json-stable-stringify-1.0.1.tgz", + "integrity": "sha1-mnWdOcXy/1A/1TAGRu1EX4jE+a8=", + "dev": true, + "requires": { + "jsonify": "~0.0.0" + } + }, + "json-stable-stringify-without-jsonify": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", + "integrity": "sha1-nbe1lJatPzz+8wp1FC0tkwrXJlE=", + "dev": true + }, + "json3": { + "version": "3.3.3", + "resolved": "https://registry.npmjs.org/json3/-/json3-3.3.3.tgz", + "integrity": "sha512-c7/8mbUsKigAbLkD5B010BK4D9LZm7A1pNItkEwiUZRpIN66exu/e7YQWysGun+TRKaJp8MhemM+VkfWv42aCA==", + "dev": true + }, + "json5": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/json5/-/json5-2.1.0.tgz", + "integrity": "sha512-8Mh9h6xViijj36g7Dxi+Y4S6hNGV96vcJZr/SrlHh1LR/pEn/8j/+qIBbs44YKl69Lrfctp4QD+AdWLTMqEZAQ==", + "dev": true, + "requires": { + "minimist": "^1.2.0" + }, + "dependencies": { + "minimist": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", + "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=", + "dev": true + } + } + }, + "jsonify": { + "version": "0.0.0", + "resolved": "https://registry.npmjs.org/jsonify/-/jsonify-0.0.0.tgz", + "integrity": "sha1-LHS27kHZPKUbe1qu6PUDYx0lKnM=", + "dev": true + }, + "jsonpointer": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/jsonpointer/-/jsonpointer-4.0.1.tgz", + "integrity": "sha1-T9kss04OnbPInIYi7PUfm5eMbLk=", + "dev": true + }, + "jszip": { + "version": "3.1.5", + "resolved": "https://registry.npmjs.org/jszip/-/jszip-3.1.5.tgz", + "integrity": "sha512-5W8NUaFRFRqTOL7ZDDrx5qWHJyBXy6velVudIzQUSoqAAYqzSh2Z7/m0Rf1QbmQJccegD0r+YZxBjzqoBiEeJQ==", + "requires": { + "core-js": "~2.3.0", + "es6-promise": "~3.0.2", + "lie": "~3.1.0", + "pako": "~1.0.2", + "readable-stream": "~2.0.6" + }, + "dependencies": { + "core-js": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/core-js/-/core-js-2.3.0.tgz", + "integrity": "sha1-+rg/uwstjchfpjbEudNMdUIMbWU=" + }, + "process-nextick-args": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-1.0.7.tgz", + "integrity": "sha1-FQ4gt1ZZCtP5EJPyWk8q2L/zC6M=" + }, + "readable-stream": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.0.6.tgz", + "integrity": "sha1-j5A0HmilPMySh4jaz80Rs265t44=", + "requires": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.1", + "isarray": "~1.0.0", + "process-nextick-args": "~1.0.6", + "string_decoder": "~0.10.x", + "util-deprecate": "~1.0.1" + } + }, + "string_decoder": { + "version": "0.10.31", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", + "integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ=" + } + } + }, + "killable": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/killable/-/killable-1.0.1.tgz", + "integrity": "sha512-LzqtLKlUwirEUyl/nicirVmNiPvYs7l5n8wOPP7fyJVpUPkvCnW/vuiXGpylGUlnPDnB7311rARzAt3Mhswpjg==", + "dev": true + }, + "kind-of": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.2.tgz", + "integrity": "sha512-s5kLOcnH0XqDO+FvuaLX8DDjZ18CGFk7VygH40QoKPUQhW4e2rvM0rwUq0t8IQDOwYSeLK01U90OjzBTme2QqA==", + "dev": true + }, + "latest-version": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/latest-version/-/latest-version-3.1.0.tgz", + "integrity": "sha1-ogU4P+oyKzO1rjsYq+4NwvNW7hU=", + "dev": true, + "requires": { + "package-json": "^4.0.0" + } + }, + "lazy-cache": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/lazy-cache/-/lazy-cache-1.0.4.tgz", + "integrity": "sha1-odePw6UEdMuAhF07O24dpJpEbo4=", + "dev": true + }, + "lcid": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/lcid/-/lcid-1.0.0.tgz", + "integrity": "sha1-MIrMr6C8SDo4Z7S28rlQYlHRuDU=", + "dev": true, + "requires": { + "invert-kv": "^1.0.0" + } + }, + "leven": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/leven/-/leven-1.0.2.tgz", + "integrity": "sha1-kUS27ryl8dBoAWnxpncNzqYLdcM=", + "dev": true + }, + "levn": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/levn/-/levn-0.3.0.tgz", + "integrity": "sha1-OwmSTt+fCDwEkP3UwLxEIeBHZO4=", + "dev": true, + "requires": { + "prelude-ls": "~1.1.2", + "type-check": "~0.3.2" + } + }, + "lie": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/lie/-/lie-3.1.1.tgz", + "integrity": "sha1-mkNrLMd0bKWd56QfpGmz77dr2H4=", + "requires": { + "immediate": "~3.0.5" + } + }, + "load-json-file": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-2.0.0.tgz", + "integrity": "sha1-eUfkIUmvgNaWy/eXvKq8/h/inKg=", + "dev": true, + "requires": { + "graceful-fs": "^4.1.2", + "parse-json": "^2.2.0", + "pify": "^2.0.0", + "strip-bom": "^3.0.0" + }, + "dependencies": { + "pify": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", + "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=", + "dev": true + } + } + }, + "loader-runner": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/loader-runner/-/loader-runner-2.4.0.tgz", + "integrity": "sha512-Jsmr89RcXGIwivFY21FcRrisYZfvLMTWx5kOLc+JTxtpBOG6xML0vzbc6SEQG2FO9/4Fc3wW4LVcB5DmGflaRw==", + "dev": true + }, + "loader-utils": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-1.2.3.tgz", + "integrity": "sha512-fkpz8ejdnEMG3s37wGL07iSBDg99O9D5yflE9RGNH3hRdx9SOwYfnGYdZOUIZitN8E+E2vkq3MUMYMvPYl5ZZA==", + "dev": true, + "requires": { + "big.js": "^5.2.2", + "emojis-list": "^2.0.0", + "json5": "^1.0.1" + }, + "dependencies": { + "json5": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.1.tgz", + "integrity": "sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow==", + "dev": true, + "requires": { + "minimist": "^1.2.0" + } + }, + "minimist": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", + "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=", + "dev": true + } + } + }, + "locate-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz", + "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==", + "dev": true, + "requires": { + "p-locate": "^3.0.0", + "path-exists": "^3.0.0" + }, + "dependencies": { + "path-exists": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", + "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=", + "dev": true + } + } + }, + "lodash": { + "version": "4.17.15", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.15.tgz", + "integrity": "sha512-8xOcRHvCjnocdS5cpwXQXVzmmh5e5+saE2QGoeQmbKmRS6J3VQppPOIt0MnmE+4xlZoumy0GPG0D0MVIQbNA1A==", + "dev": true + }, + "loglevel": { + "version": "1.6.4", + "resolved": "https://registry.npmjs.org/loglevel/-/loglevel-1.6.4.tgz", + "integrity": "sha512-p0b6mOGKcGa+7nnmKbpzR6qloPbrgLcnio++E+14Vo/XffOGwZtRpUhr8dTH/x2oCMmEoIU0Zwm3ZauhvYD17g==", + "dev": true + }, + "longest": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/longest/-/longest-1.0.1.tgz", + "integrity": "sha1-MKCy2jj3N3DoKUoNIuZiXtd9AJc=", + "dev": true + }, + "loose-envify": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz", + "integrity": "sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==", + "dev": true, + "requires": { + "js-tokens": "^3.0.0 || ^4.0.0" + } + }, + "lowercase-keys": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-1.0.1.tgz", + "integrity": "sha512-G2Lj61tXDnVFFOi8VZds+SoQjtQC3dgokKdDG2mTm1tx4m50NUHBOZSBwQQHyy0V12A0JTG4icfZQH+xPyh8VA==", + "dev": true + }, + "lru-cache": { + "version": "4.1.5", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-4.1.5.tgz", + "integrity": "sha512-sWZlbEP2OsHNkXrMl5GYk/jKk70MBng6UU4YI/qGDYbgf6YbP4EvmqISbXCoJiRKs+1bSpFHVgQxvJ17F2li5g==", + "dev": true, + "requires": { + "pseudomap": "^1.0.2", + "yallist": "^2.1.2" + } + }, + "make-dir": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-2.1.0.tgz", + "integrity": "sha512-LS9X+dc8KLxXCb8dni79fLIIUA5VyZoyjSMCwTluaXA0o27cCK0bhXkpgw+sTXVpPy/lSO57ilRixqk0vDmtRA==", + "dev": true, + "requires": { + "pify": "^4.0.1", + "semver": "^5.6.0" + } + }, + "mamacro": { + "version": "0.0.3", + "resolved": "https://registry.npmjs.org/mamacro/-/mamacro-0.0.3.tgz", + "integrity": "sha512-qMEwh+UujcQ+kbz3T6V+wAmO2U8veoq2w+3wY8MquqwVA3jChfwY+Tk52GZKDfACEPjuZ7r2oJLejwpt8jtwTA==", + "dev": true + }, + "map-age-cleaner": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/map-age-cleaner/-/map-age-cleaner-0.1.3.tgz", + "integrity": "sha512-bJzx6nMoP6PDLPBFmg7+xRKeFZvFboMrGlxmNj9ClvX53KrmvM5bXFXEWjbz4cz1AFn+jWJ9z/DJSz7hrs0w3w==", + "dev": true, + "requires": { + "p-defer": "^1.0.0" + } + }, + "map-cache": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/map-cache/-/map-cache-0.2.2.tgz", + "integrity": "sha1-wyq9C9ZSXZsFFkW7TyasXcmKDb8=", + "dev": true + }, + "map-visit": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/map-visit/-/map-visit-1.0.0.tgz", + "integrity": "sha1-7Nyo8TFE5mDxtb1B8S80edmN+48=", + "dev": true, + "requires": { + "object-visit": "^1.0.0" + } + }, + "math-random": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/math-random/-/math-random-1.0.4.tgz", + "integrity": "sha512-rUxjysqif/BZQH2yhd5Aaq7vXMSx9NdEsQcyA07uEzIvxgI7zIr33gGsh+RU0/XjmQpCW7RsVof1vlkvQVCK5A==", + "dev": true + }, + "md5.js": { + "version": "1.3.5", + "resolved": "https://registry.npmjs.org/md5.js/-/md5.js-1.3.5.tgz", + "integrity": "sha512-xitP+WxNPcTTOgnTJcrhM0xvdPepipPSf3I8EIpGKeFLjt3PlJLIDG3u8EX53ZIubkb+5U2+3rELYpEhHhzdkg==", + "dev": true, + "requires": { + "hash-base": "^3.0.0", + "inherits": "^2.0.1", + "safe-buffer": "^5.1.2" + } + }, + "media-typer": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", + "integrity": "sha1-hxDXrwqmJvj/+hzgAWhUUmMlV0g=", + "dev": true + }, + "mem": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/mem/-/mem-4.3.0.tgz", + "integrity": "sha512-qX2bG48pTqYRVmDB37rn/6PT7LcR8T7oAX3bf99u1Tt1nzxYfxkgqDwUwolPlXweM0XzBOBFzSx4kfp7KP1s/w==", + "dev": true, + "requires": { + "map-age-cleaner": "^0.1.1", + "mimic-fn": "^2.0.0", + "p-is-promise": "^2.0.0" + } + }, + "memory-fs": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/memory-fs/-/memory-fs-0.4.1.tgz", + "integrity": "sha1-OpoguEYlI+RHz7x+i7gO1me/xVI=", + "dev": true, + "requires": { + "errno": "^0.1.3", + "readable-stream": "^2.0.1" + } + }, + "merge-descriptors": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz", + "integrity": "sha1-sAqqVW3YtEVoFQ7J0blT8/kMu2E=", + "dev": true + }, + "methods": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", + "integrity": "sha1-VSmk1nZUE07cxSZmVoNbD4Ua/O4=", + "dev": true + }, + "micromatch": { + "version": "3.1.10", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz", + "integrity": "sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==", + "dev": true, + "requires": { + "arr-diff": "^4.0.0", + "array-unique": "^0.3.2", + "braces": "^2.3.1", + "define-property": "^2.0.2", + "extend-shallow": "^3.0.2", + "extglob": "^2.0.4", + "fragment-cache": "^0.2.1", + "kind-of": "^6.0.2", + "nanomatch": "^1.2.9", + "object.pick": "^1.3.0", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.2" + } + }, + "miller-rabin": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/miller-rabin/-/miller-rabin-4.0.1.tgz", + "integrity": "sha512-115fLhvZVqWwHPbClyntxEVfVDfl9DLLTuJvq3g2O/Oxi8AiNouAHvDSzHS0viUJc+V5vm3eq91Xwqn9dp4jRA==", + "dev": true, + "requires": { + "bn.js": "^4.0.0", + "brorand": "^1.0.1" + } + }, + "mime": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", + "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==", + "dev": true + }, + "mime-db": { + "version": "1.40.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.40.0.tgz", + "integrity": "sha512-jYdeOMPy9vnxEqFRRo6ZvTZ8d9oPb+k18PKoYNYUe2stVEBPPwsln/qWzdbmaIvnhZ9v2P+CuecK+fpUfsV2mA==", + "dev": true + }, + "mime-types": { + "version": "2.1.24", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.24.tgz", + "integrity": "sha512-WaFHS3MCl5fapm3oLxU4eYDw77IQM2ACcxQ9RIxfaC3ooc6PFuBMGZZsYpvoXS5D5QTWPieo1jjLdAm3TBP3cQ==", + "dev": true, + "requires": { + "mime-db": "1.40.0" + } + }, + "mimic-fn": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", + "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", + "dev": true + }, + "minimalistic-assert": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz", + "integrity": "sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A==", + "dev": true + }, + "minimalistic-crypto-utils": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/minimalistic-crypto-utils/-/minimalistic-crypto-utils-1.0.1.tgz", + "integrity": "sha1-9sAMHAsIIkblxNmd+4x8CDsrWCo=", + "dev": true + }, + "minimatch": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", + "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", + "dev": true, + "requires": { + "brace-expansion": "^1.1.7" + } + }, + "minimist": { + "version": "0.0.8", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz", + "integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0=", + "dev": true + }, + "mississippi": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/mississippi/-/mississippi-3.0.0.tgz", + "integrity": "sha512-x471SsVjUtBRtcvd4BzKE9kFC+/2TeWgKCgw0bZcw1b9l2X3QX5vCWgF+KaZaYm87Ss//rHnWryupDrgLvmSkA==", + "dev": true, + "requires": { + "concat-stream": "^1.5.0", + "duplexify": "^3.4.2", + "end-of-stream": "^1.1.0", + "flush-write-stream": "^1.0.0", + "from2": "^2.1.0", + "parallel-transform": "^1.1.0", + "pump": "^3.0.0", + "pumpify": "^1.3.3", + "stream-each": "^1.1.0", + "through2": "^2.0.0" + } + }, + "mixin-deep": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/mixin-deep/-/mixin-deep-1.3.2.tgz", + "integrity": "sha512-WRoDn//mXBiJ1H40rqa3vH0toePwSsGb45iInWlTySa+Uu4k3tYUSxa2v1KqAiLtvlrSzaExqS1gtk96A9zvEA==", + "dev": true, + "requires": { + "for-in": "^1.0.2", + "is-extendable": "^1.0.1" + }, + "dependencies": { + "is-extendable": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", + "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", + "dev": true, + "requires": { + "is-plain-object": "^2.0.4" + } + } + } + }, + "mkdirp": { + "version": "0.5.1", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz", + "integrity": "sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM=", + "dev": true, + "requires": { + "minimist": "0.0.8" + } + }, + "move-concurrently": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/move-concurrently/-/move-concurrently-1.0.1.tgz", + "integrity": "sha1-viwAX9oy4LKa8fBdfEszIUxwH5I=", + "dev": true, + "requires": { + "aproba": "^1.1.1", + "copy-concurrently": "^1.0.0", + "fs-write-stream-atomic": "^1.0.8", + "mkdirp": "^0.5.1", + "rimraf": "^2.5.4", + "run-queue": "^1.0.3" + } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "dev": true + }, + "multicast-dns": { + "version": "6.2.3", + "resolved": "https://registry.npmjs.org/multicast-dns/-/multicast-dns-6.2.3.tgz", + "integrity": "sha512-ji6J5enbMyGRHIAkAOu3WdV8nggqviKCEKtXcOqfphZZtQrmHKycfynJ2V7eVPUA4NhJ6V7Wf4TmGbTwKE9B6g==", + "dev": true, + "requires": { + "dns-packet": "^1.3.1", + "thunky": "^1.0.2" + } + }, + "multicast-dns-service-types": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/multicast-dns-service-types/-/multicast-dns-service-types-1.1.0.tgz", + "integrity": "sha1-iZ8R2WhuXgXLkbNdXw5jt3PPyQE=", + "dev": true + }, + "mute-stream": { + "version": "0.0.7", + "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-0.0.7.tgz", + "integrity": "sha1-MHXOk7whuPq0PhvE2n6BFe0ee6s=", + "dev": true + }, + "nan": { + "version": "2.14.0", + "resolved": "https://registry.npmjs.org/nan/-/nan-2.14.0.tgz", + "integrity": "sha512-INOFj37C7k3AfaNTtX8RhsTw7qRy7eLET14cROi9+5HAVbbHuIWUHEauBv5qT4Av2tWasiTY1Jw6puUNqRJXQg==", + "dev": true, + "optional": true + }, + "nanomatch": { + "version": "1.2.13", + "resolved": "https://registry.npmjs.org/nanomatch/-/nanomatch-1.2.13.tgz", + "integrity": "sha512-fpoe2T0RbHwBTBUOftAfBPaDEi06ufaUai0mE6Yn1kacc3SnTErfb/h+X94VXzI64rKFHYImXSvdwGGCmwOqCA==", + "dev": true, + "requires": { + "arr-diff": "^4.0.0", + "array-unique": "^0.3.2", + "define-property": "^2.0.2", + "extend-shallow": "^3.0.2", + "fragment-cache": "^0.2.1", + "is-windows": "^1.0.2", + "kind-of": "^6.0.2", + "object.pick": "^1.3.0", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.1" + } + }, + "natural-compare": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", + "integrity": "sha1-Sr6/7tdUHywnrPspvbvRXI1bpPc=", + "dev": true + }, + "negotiator": { + "version": "0.6.2", + "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.2.tgz", + "integrity": "sha512-hZXc7K2e+PgeI1eDBe/10Ard4ekbfrrqG8Ep+8Jmf4JID2bNg7NvCPOZN+kfF574pFQI7mum2AUqDidoKqcTOw==", + "dev": true + }, + "neo-async": { + "version": "2.6.1", + "resolved": "https://registry.npmjs.org/neo-async/-/neo-async-2.6.1.tgz", + "integrity": "sha512-iyam8fBuCUpWeKPGpaNMetEocMt364qkCsfL9JuhjXX6dRnguRVOfk2GZaDpPjcOKiiXCPINZC1GczQ7iTq3Zw==", + "dev": true + }, + "next-tick": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/next-tick/-/next-tick-1.0.0.tgz", + "integrity": "sha1-yobR/ogoFpsBICCOPchCS524NCw=", + "dev": true + }, + "nice-try": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/nice-try/-/nice-try-1.0.5.tgz", + "integrity": "sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ==", + "dev": true + }, + "node-forge": { + "version": "0.8.2", + "resolved": "https://registry.npmjs.org/node-forge/-/node-forge-0.8.2.tgz", + "integrity": "sha512-mXQ9GBq1N3uDCyV1pdSzgIguwgtVpM7f5/5J4ipz12PKWElmPpVWLDuWl8iXmhysr21+WmX/OJ5UKx82wjomgg==", + "dev": true + }, + "node-libs-browser": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/node-libs-browser/-/node-libs-browser-2.2.1.tgz", + "integrity": "sha512-h/zcD8H9kaDZ9ALUWwlBUDo6TKF8a7qBSCSEGfjTVIYeqsioSKaAX+BN7NgiMGp6iSIXZ3PxgCu8KS3b71YK5Q==", + "dev": true, + "requires": { + "assert": "^1.1.1", + "browserify-zlib": "^0.2.0", + "buffer": "^4.3.0", + "console-browserify": "^1.1.0", + "constants-browserify": "^1.0.0", + "crypto-browserify": "^3.11.0", + "domain-browser": "^1.1.1", + "events": "^3.0.0", + "https-browserify": "^1.0.0", + "os-browserify": "^0.3.0", + "path-browserify": "0.0.1", + "process": "^0.11.10", + "punycode": "^1.2.4", + "querystring-es3": "^0.2.0", + "readable-stream": "^2.3.3", + "stream-browserify": "^2.0.1", + "stream-http": "^2.7.2", + "string_decoder": "^1.0.0", + "timers-browserify": "^2.0.4", + "tty-browserify": "0.0.0", + "url": "^0.11.0", + "util": "^0.11.0", + "vm-browserify": "^1.0.1" + }, + "dependencies": { + "punycode": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz", + "integrity": "sha1-wNWmOycYgArY4esPpSachN1BhF4=", + "dev": true + } + } + }, + "node-releases": { + "version": "1.1.30", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-1.1.30.tgz", + "integrity": "sha512-BHcr1g6NeUH12IL+X3Flvs4IOnl1TL0JczUhEZjDE+FXXPQcVCNr8NEPb01zqGxzhTpdyJL5GXemaCW7aw6Khw==", + "dev": true, + "requires": { + "semver": "^5.3.0" + } + }, + "nodemon": { + "version": "1.19.2", + "resolved": "https://registry.npmjs.org/nodemon/-/nodemon-1.19.2.tgz", + "integrity": "sha512-hRLYaw5Ihyw9zK7NF+9EUzVyS6Cvgc14yh8CAYr38tPxJa6UrOxwAQ351GwrgoanHCF0FalQFn6w5eoX/LGdJw==", + "dev": true, + "requires": { + "chokidar": "^2.1.5", + "debug": "^3.1.0", + "ignore-by-default": "^1.0.1", + "minimatch": "^3.0.4", + "pstree.remy": "^1.1.6", + "semver": "^5.5.0", + "supports-color": "^5.2.0", + "touch": "^3.1.0", + "undefsafe": "^2.0.2", + "update-notifier": "^2.5.0" + }, + "dependencies": { + "debug": { + "version": "3.2.6", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.6.tgz", + "integrity": "sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ==", + "dev": true, + "requires": { + "ms": "^2.1.1" + } + }, + "ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "dev": true + } + } + }, + "nopt": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/nopt/-/nopt-1.0.10.tgz", + "integrity": "sha1-bd0hvSoxQXuScn3Vhfim83YI6+4=", + "dev": true, + "requires": { + "abbrev": "1" + } + }, + "normalize-package-data": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.5.0.tgz", + "integrity": "sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==", + "dev": true, + "requires": { + "hosted-git-info": "^2.1.4", + "resolve": "^1.10.0", + "semver": "2 || 3 || 4 || 5", + "validate-npm-package-license": "^3.0.1" + } + }, + "normalize-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", + "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", + "dev": true + }, + "npm-run-path": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-2.0.2.tgz", + "integrity": "sha1-NakjLfo11wZ7TLLd8jV7GHFTbF8=", + "dev": true, + "requires": { + "path-key": "^2.0.0" + } + }, + "number-is-nan": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/number-is-nan/-/number-is-nan-1.0.1.tgz", + "integrity": "sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0=", + "dev": true + }, + "object-assign": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", + "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=", + "dev": true + }, + "object-copy": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/object-copy/-/object-copy-0.1.0.tgz", + "integrity": "sha1-fn2Fi3gb18mRpBupde04EnVOmYw=", + "dev": true, + "requires": { + "copy-descriptor": "^0.1.0", + "define-property": "^0.2.5", + "kind-of": "^3.0.3" + }, + "dependencies": { + "define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", + "dev": true, + "requires": { + "is-descriptor": "^0.1.0" + } + }, + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "object-inspect": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.6.0.tgz", + "integrity": "sha512-GJzfBZ6DgDAmnuaM3104jR4s1Myxr3Y3zfIyN4z3UdqN69oSRacNK8UhnobDdC+7J2AHCjGwxQubNJfE70SXXQ==", + "dev": true + }, + "object-is": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/object-is/-/object-is-1.0.1.tgz", + "integrity": "sha1-CqYOyZiaCz7Xlc9NBvYs8a1lObY=", + "dev": true + }, + "object-keys": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", + "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==", + "dev": true + }, + "object-visit": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/object-visit/-/object-visit-1.0.1.tgz", + "integrity": "sha1-95xEk68MU3e1n+OdOV5BBC3QRbs=", + "dev": true, + "requires": { + "isobject": "^3.0.0" + } + }, + "object.assign": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.0.tgz", + "integrity": "sha512-exHJeq6kBKj58mqGyTQ9DFvrZC/eR6OwxzoM9YRoGBqrXYonaFyGiFMuc9VZrXf7DarreEwMpurG3dd+CNyW5w==", + "dev": true, + "requires": { + "define-properties": "^1.1.2", + "function-bind": "^1.1.1", + "has-symbols": "^1.0.0", + "object-keys": "^1.0.11" + } + }, + "object.entries": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/object.entries/-/object.entries-1.1.0.tgz", + "integrity": "sha512-l+H6EQ8qzGRxbkHOd5I/aHRhHDKoQXQ8g0BYt4uSweQU1/J6dZUOyWh9a2Vky35YCKjzmgxOzta2hH6kf9HuXA==", + "dev": true, + "requires": { + "define-properties": "^1.1.3", + "es-abstract": "^1.12.0", + "function-bind": "^1.1.1", + "has": "^1.0.3" + } + }, + "object.omit": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/object.omit/-/object.omit-2.0.1.tgz", + "integrity": "sha1-Gpx0SCnznbuFjHbKNXmuKlTr0fo=", + "dev": true, + "requires": { + "for-own": "^0.1.4", + "is-extendable": "^0.1.1" + } + }, + "object.pick": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/object.pick/-/object.pick-1.3.0.tgz", + "integrity": "sha1-h6EKxMFpS9Lhy/U1kaZhQftd10c=", + "dev": true, + "requires": { + "isobject": "^3.0.1" + } + }, + "object.values": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/object.values/-/object.values-1.1.0.tgz", + "integrity": "sha512-8mf0nKLAoFX6VlNVdhGj31SVYpaNFtUnuoOXWyFEstsWRgU837AK+JYM0iAxwkSzGRbwn8cbFmgbyxj1j4VbXg==", + "dev": true, + "requires": { + "define-properties": "^1.1.3", + "es-abstract": "^1.12.0", + "function-bind": "^1.1.1", + "has": "^1.0.3" + } + }, + "obuf": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/obuf/-/obuf-1.1.2.tgz", + "integrity": "sha512-PX1wu0AmAdPqOL1mWhqmlOd8kOIZQwGZw6rh7uby9fTc5lhaOWFLX3I6R1hrF9k3zUY40e6igsLGkDXK92LJNg==", + "dev": true + }, + "on-finished": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.3.0.tgz", + "integrity": "sha1-IPEzZIGwg811M3mSoWlxqi2QaUc=", + "dev": true, + "requires": { + "ee-first": "1.1.1" + } + }, + "on-headers": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/on-headers/-/on-headers-1.0.2.tgz", + "integrity": "sha512-pZAE+FJLoyITytdqK0U5s+FIpjN0JP3OzFi/u8Rx+EV5/W+JTWGXG8xFzevE7AjBfDqHv/8vL8qQsIhHnqRkrA==", + "dev": true + }, + "once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", + "dev": true, + "requires": { + "wrappy": "1" + } + }, + "onetime": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-2.0.1.tgz", + "integrity": "sha1-BnQoIw/WdEOyeUsiu6UotoZ5YtQ=", + "dev": true, + "requires": { + "mimic-fn": "^1.0.0" + }, + "dependencies": { + "mimic-fn": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-1.2.0.tgz", + "integrity": "sha512-jf84uxzwiuiIVKiOLpfYk7N46TSy8ubTonmneY9vrpHNAnp0QBt2BxWV9dO3/j+BoVAb+a5G6YDPW3M5HOdMWQ==", + "dev": true + } + } + }, + "opn": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/opn/-/opn-5.5.0.tgz", + "integrity": "sha512-PqHpggC9bLV0VeWcdKhkpxY+3JTzetLSqTCWL/z/tFIbI6G8JCjondXklT1JinczLz2Xib62sSp0T/gKT4KksA==", + "dev": true, + "requires": { + "is-wsl": "^1.1.0" + } + }, + "optionator": { + "version": "0.8.2", + "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.8.2.tgz", + "integrity": "sha1-NkxeQJ0/TWMB1sC0wFu6UBgK62Q=", + "dev": true, + "requires": { + "deep-is": "~0.1.3", + "fast-levenshtein": "~2.0.4", + "levn": "~0.3.0", + "prelude-ls": "~1.1.2", + "type-check": "~0.3.2", + "wordwrap": "~1.0.0" + }, + "dependencies": { + "wordwrap": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-1.0.0.tgz", + "integrity": "sha1-J1hIEIkUVqQXHI0CJkQa3pDLyus=", + "dev": true + } + } + }, + "original": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/original/-/original-1.0.2.tgz", + "integrity": "sha512-hyBVl6iqqUOJ8FqRe+l/gS8H+kKYjrEndd5Pm1MfBtsEKA038HkkdbAl/72EAXGyonD/PFsvmVG+EvcIpliMBg==", + "dev": true, + "requires": { + "url-parse": "^1.4.3" + } + }, + "os-browserify": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/os-browserify/-/os-browserify-0.3.0.tgz", + "integrity": "sha1-hUNzx/XCMVkU/Jv8a9gjj92h7Cc=", + "dev": true + }, + "os-homedir": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/os-homedir/-/os-homedir-1.0.2.tgz", + "integrity": "sha1-/7xJiDNuDoM94MFox+8VISGqf7M=", + "dev": true + }, + "os-locale": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/os-locale/-/os-locale-1.4.0.tgz", + "integrity": "sha1-IPnxeuKe00XoveWDsT0gCYA8FNk=", + "dev": true, + "requires": { + "lcid": "^1.0.0" + } + }, + "os-tmpdir": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz", + "integrity": "sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ=", + "dev": true + }, + "output-file-sync": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/output-file-sync/-/output-file-sync-2.0.1.tgz", + "integrity": "sha512-mDho4qm7WgIXIGf4eYU1RHN2UU5tPfVYVSRwDJw0uTmj35DQUt/eNp19N7v6T3SrR0ESTEf2up2CGO73qI35zQ==", + "dev": true, + "requires": { + "graceful-fs": "^4.1.11", + "is-plain-obj": "^1.1.0", + "mkdirp": "^0.5.1" + } + }, + "p-defer": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/p-defer/-/p-defer-1.0.0.tgz", + "integrity": "sha1-n26xgvbJqozXQwBKfU+WsZaw+ww=", + "dev": true + }, + "p-finally": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/p-finally/-/p-finally-1.0.0.tgz", + "integrity": "sha1-P7z7FbiZpEEjs0ttzBi3JDNqLK4=", + "dev": true + }, + "p-is-promise": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/p-is-promise/-/p-is-promise-2.1.0.tgz", + "integrity": "sha512-Y3W0wlRPK8ZMRbNq97l4M5otioeA5lm1z7bkNkxCka8HSPjR0xRWmpCmc9utiaLP9Jb1eD8BgeIxTW4AIF45Pg==", + "dev": true + }, + "p-limit": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.2.1.tgz", + "integrity": "sha512-85Tk+90UCVWvbDavCLKPOLC9vvY8OwEX/RtKF+/1OADJMVlFfEHOiMTPVyxg7mk/dKa+ipdHm0OUkTvCpMTuwg==", + "dev": true, + "requires": { + "p-try": "^2.0.0" + } + }, + "p-locate": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz", + "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==", + "dev": true, + "requires": { + "p-limit": "^2.0.0" + } + }, + "p-map": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/p-map/-/p-map-2.1.0.tgz", + "integrity": "sha512-y3b8Kpd8OAN444hxfBbFfj1FY/RjtTd8tzYwhUqNYXx0fXx2iX4maP4Qr6qhIKbQXI02wTLAda4fYUbDagTUFw==", + "dev": true + }, + "p-retry": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/p-retry/-/p-retry-3.0.1.tgz", + "integrity": "sha512-XE6G4+YTTkT2a0UWb2kjZe8xNwf8bIbnqpc/IS/idOBVhyves0mK5OJgeocjx7q5pvX/6m23xuzVPYT1uGM73w==", + "dev": true, + "requires": { + "retry": "^0.12.0" + } + }, + "p-try": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", + "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", + "dev": true + }, + "package-json": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/package-json/-/package-json-4.0.1.tgz", + "integrity": "sha1-iGmgQBJTZhxMTKPabCEh7VVfXu0=", + "dev": true, + "requires": { + "got": "^6.7.1", + "registry-auth-token": "^3.0.1", + "registry-url": "^3.0.3", + "semver": "^5.1.0" + } + }, + "pako": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/pako/-/pako-1.0.10.tgz", + "integrity": "sha512-0DTvPVU3ed8+HNXOu5Bs+o//Mbdj9VNQMUOe9oKCwh8l0GNwpTDMKCWbRjgtD291AWnkAgkqA/LOnQS8AmS1tw==" + }, + "parallel-transform": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/parallel-transform/-/parallel-transform-1.2.0.tgz", + "integrity": "sha512-P2vSmIu38uIlvdcU7fDkyrxj33gTUy/ABO5ZUbGowxNCopBq/OoD42bP4UmMrJoPyk4Uqf0mu3mtWBhHCZD8yg==", + "dev": true, + "requires": { + "cyclist": "^1.0.1", + "inherits": "^2.0.3", + "readable-stream": "^2.1.5" + } + }, + "parent-module": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", + "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", + "dev": true, + "requires": { + "callsites": "^3.0.0" + } + }, + "parse-asn1": { + "version": "5.1.4", + "resolved": "https://registry.npmjs.org/parse-asn1/-/parse-asn1-5.1.4.tgz", + "integrity": "sha512-Qs5duJcuvNExRfFZ99HDD3z4mAi3r9Wl/FOjEOijlxwCZs7E7mW2vjTpgQ4J8LpTF8x5v+1Vn5UQFejmWT11aw==", + "dev": true, + "requires": { + "asn1.js": "^4.0.0", + "browserify-aes": "^1.0.0", + "create-hash": "^1.1.0", + "evp_bytestokey": "^1.0.0", + "pbkdf2": "^3.0.3", + "safe-buffer": "^5.1.1" + } + }, + "parse-glob": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/parse-glob/-/parse-glob-3.0.4.tgz", + "integrity": "sha1-ssN2z7EfNVE7rdFz7wu246OIORw=", + "dev": true, + "requires": { + "glob-base": "^0.3.0", + "is-dotfile": "^1.0.0", + "is-extglob": "^1.0.0", + "is-glob": "^2.0.0" + }, + "dependencies": { + "is-extglob": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-1.0.0.tgz", + "integrity": "sha1-rEaBd8SUNAWgkvyPKXYMb/xiBsA=", + "dev": true + }, + "is-glob": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-2.0.1.tgz", + "integrity": "sha1-0Jb5JqPe1WAPP9/ZEZjLCIjC2GM=", + "dev": true, + "requires": { + "is-extglob": "^1.0.0" + } + } + } + }, + "parse-json": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-2.2.0.tgz", + "integrity": "sha1-9ID0BDTvgHQfhGkJn43qGPVaTck=", + "dev": true, + "requires": { + "error-ex": "^1.2.0" + } + }, + "parse-passwd": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/parse-passwd/-/parse-passwd-1.0.0.tgz", + "integrity": "sha1-bVuTSkVpk7I9N/QKOC1vFmao5cY=", + "dev": true + }, + "parseurl": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", + "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==", + "dev": true + }, + "pascalcase": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/pascalcase/-/pascalcase-0.1.1.tgz", + "integrity": "sha1-s2PlXoAGym/iF4TS2yK9FdeRfxQ=", + "dev": true + }, + "path-browserify": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/path-browserify/-/path-browserify-0.0.1.tgz", + "integrity": "sha512-BapA40NHICOS+USX9SN4tyhq+A2RrN/Ws5F0Z5aMHDp98Fl86lX8Oti8B7uN93L4Ifv4fHOEA+pQw87gmMO/lQ==", + "dev": true + }, + "path-dirname": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/path-dirname/-/path-dirname-1.0.2.tgz", + "integrity": "sha1-zDPSTVJeCZpTiMAzbG4yuRYGCeA=", + "dev": true + }, + "path-exists": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-1.0.0.tgz", + "integrity": "sha1-1aiZjrce83p0w06w2eum6HjuoIE=", + "dev": true + }, + "path-is-absolute": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", + "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=", + "dev": true + }, + "path-is-inside": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/path-is-inside/-/path-is-inside-1.0.2.tgz", + "integrity": "sha1-NlQX3t5EQw0cEa9hAn+s8HS9/FM=", + "dev": true + }, + "path-key": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz", + "integrity": "sha1-QRyttXTFoUDTpLGRDUDYDMn0C0A=", + "dev": true + }, + "path-parse": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.6.tgz", + "integrity": "sha512-GSmOT2EbHrINBf9SR7CDELwlJ8AENk3Qn7OikK4nFYAu3Ote2+JYNVvkpAEQm3/TLNEJFD/xZJjzyxg3KBWOzw==", + "dev": true + }, + "path-to-regexp": { + "version": "0.1.7", + "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz", + "integrity": "sha1-32BBeABfUi8V60SQ5yR6G/qmf4w=", + "dev": true + }, + "path-type": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-2.0.0.tgz", + "integrity": "sha1-8BLMuEFbcJb8LaoQVMPXI4lZTHM=", + "dev": true, + "requires": { + "pify": "^2.0.0" + }, + "dependencies": { + "pify": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", + "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=", + "dev": true + } + } + }, + "pbkdf2": { + "version": "3.0.17", + "resolved": "https://registry.npmjs.org/pbkdf2/-/pbkdf2-3.0.17.tgz", + "integrity": "sha512-U/il5MsrZp7mGg3mSQfn742na2T+1/vHDCG5/iTI3X9MKUuYUZVLQhyRsg06mCgDBTd57TxzgZt7P+fYfjRLtA==", + "dev": true, + "requires": { + "create-hash": "^1.1.2", + "create-hmac": "^1.1.4", + "ripemd160": "^2.0.1", + "safe-buffer": "^5.0.1", + "sha.js": "^2.4.8" + } + }, + "pify": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/pify/-/pify-4.0.1.tgz", + "integrity": "sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==", + "dev": true + }, + "pinkie": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/pinkie/-/pinkie-2.0.4.tgz", + "integrity": "sha1-clVrgM+g1IqXToDnckjoDtT3+HA=", + "dev": true + }, + "pinkie-promise": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/pinkie-promise/-/pinkie-promise-2.0.1.tgz", + "integrity": "sha1-ITXW36ejWMBprJsXh3YogihFD/o=", + "dev": true, + "requires": { + "pinkie": "^2.0.0" + } + }, + "pkg-dir": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-3.0.0.tgz", + "integrity": "sha512-/E57AYkoeQ25qkxMj5PBOVgF8Kiu/h7cYS30Z5+R7WaiCCBfLq58ZI/dSeaEKb9WVJV5n/03QwrN3IeWIFllvw==", + "dev": true, + "requires": { + "find-up": "^3.0.0" + } + }, + "pluralize": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/pluralize/-/pluralize-1.2.1.tgz", + "integrity": "sha1-0aIUg/0iu0HlihL6NCGCMUCJfEU=", + "dev": true + }, + "portfinder": { + "version": "1.0.24", + "resolved": "https://registry.npmjs.org/portfinder/-/portfinder-1.0.24.tgz", + "integrity": "sha512-ekRl7zD2qxYndYflwiryJwMioBI7LI7rVXg3EnLK3sjkouT5eOuhS3gS255XxBksa30VG8UPZYZCdgfGOfkSUg==", + "dev": true, + "requires": { + "async": "^1.5.2", + "debug": "^2.2.0", + "mkdirp": "0.5.x" + } + }, + "posix-character-classes": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/posix-character-classes/-/posix-character-classes-0.1.1.tgz", + "integrity": "sha1-AerA/jta9xoqbAL+q7jB/vfgDqs=", + "dev": true + }, + "prelude-ls": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.1.2.tgz", + "integrity": "sha1-IZMqVJ9eUv/ZqCf1cOBL5iqX2lQ=", + "dev": true + }, + "prepend-http": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/prepend-http/-/prepend-http-1.0.4.tgz", + "integrity": "sha1-1PRWKwzjaW5BrFLQ4ALlemNdxtw=", + "dev": true + }, + "preserve": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/preserve/-/preserve-0.2.0.tgz", + "integrity": "sha1-gV7R9uvGWSb4ZbMQwHE7yzMVzks=", + "dev": true + }, + "private": { + "version": "0.1.8", + "resolved": "https://registry.npmjs.org/private/-/private-0.1.8.tgz", + "integrity": "sha512-VvivMrbvd2nKkiG38qjULzlc+4Vx4wm/whI9pQD35YrARNnhxeiRktSOhSukRLFNlzg6Br/cJPet5J/u19r/mg==", + "dev": true + }, + "process": { + "version": "0.11.10", + "resolved": "https://registry.npmjs.org/process/-/process-0.11.10.tgz", + "integrity": "sha1-czIwDoQBYb2j5podHZGn1LwW8YI=", + "dev": true + }, + "process-nextick-args": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", + "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==", + "dev": true + }, + "progress": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/progress/-/progress-2.0.3.tgz", + "integrity": "sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==", + "dev": true + }, + "promise-inflight": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/promise-inflight/-/promise-inflight-1.0.1.tgz", + "integrity": "sha1-mEcocL8igTL8vdhoEputEsPAKeM=", + "dev": true + }, + "proxy-addr": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.5.tgz", + "integrity": "sha512-t/7RxHXPH6cJtP0pRG6smSr9QJidhB+3kXu0KgXnbGYMgzEnUxRQ4/LDdfOwZEMyIh3/xHb8PX3t+lfL9z+YVQ==", + "dev": true, + "requires": { + "forwarded": "~0.1.2", + "ipaddr.js": "1.9.0" + } + }, + "prr": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/prr/-/prr-1.0.1.tgz", + "integrity": "sha1-0/wRS6BplaRexok/SEzrHXj19HY=", + "dev": true + }, + "pseudomap": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/pseudomap/-/pseudomap-1.0.2.tgz", + "integrity": "sha1-8FKijacOYYkX7wqKw0wa5aaChrM=", + "dev": true + }, + "pstree.remy": { + "version": "1.1.7", + "resolved": "https://registry.npmjs.org/pstree.remy/-/pstree.remy-1.1.7.tgz", + "integrity": "sha512-xsMgrUwRpuGskEzBFkH8NmTimbZ5PcPup0LA8JJkHIm2IMUbQcpo3yeLNWVrufEYjh8YwtSVh0xz6UeWc5Oh5A==", + "dev": true + }, + "public-encrypt": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/public-encrypt/-/public-encrypt-4.0.3.tgz", + "integrity": "sha512-zVpa8oKZSz5bTMTFClc1fQOnyyEzpl5ozpi1B5YcvBrdohMjH2rfsBtyXcuNuwjsDIXmBYlF2N5FlJYhR29t8Q==", + "dev": true, + "requires": { + "bn.js": "^4.1.0", + "browserify-rsa": "^4.0.0", + "create-hash": "^1.1.0", + "parse-asn1": "^5.0.0", + "randombytes": "^2.0.1", + "safe-buffer": "^5.1.2" + } + }, + "pump": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz", + "integrity": "sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==", + "dev": true, + "requires": { + "end-of-stream": "^1.1.0", + "once": "^1.3.1" + } + }, + "pumpify": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/pumpify/-/pumpify-1.5.1.tgz", + "integrity": "sha512-oClZI37HvuUJJxSKKrC17bZ9Cu0ZYhEAGPsPUy9KlMUmv9dKX2o77RUmq7f3XjIxbwyGwYzbzQ1L2Ks8sIradQ==", + "dev": true, + "requires": { + "duplexify": "^3.6.0", + "inherits": "^2.0.3", + "pump": "^2.0.0" + }, + "dependencies": { + "pump": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/pump/-/pump-2.0.1.tgz", + "integrity": "sha512-ruPMNRkN3MHP1cWJc9OWr+T/xDP0jhXYCLfJcBuX54hhfIBnaQmAUMfDcG4DM5UMWByBbJY69QSphm3jtDKIkA==", + "dev": true, + "requires": { + "end-of-stream": "^1.1.0", + "once": "^1.3.1" + } + } + } + }, + "punycode": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz", + "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==", + "dev": true + }, + "q": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/q/-/q-1.5.1.tgz", + "integrity": "sha1-fjL3W0E4EpHQRhHxvxQQmsAGUdc=", + "dev": true + }, + "qs": { + "version": "6.7.0", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.7.0.tgz", + "integrity": "sha512-VCdBRNFTX1fyE7Nb6FYoURo/SPe62QCaAyzJvUjwRaIsc+NePBEniHlvxFmmX56+HZphIGtV0XeCirBtpDrTyQ==", + "dev": true + }, + "querystring": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/querystring/-/querystring-0.2.0.tgz", + "integrity": "sha1-sgmEkgO7Jd+CDadW50cAWHhSFiA=", + "dev": true + }, + "querystring-es3": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/querystring-es3/-/querystring-es3-0.2.1.tgz", + "integrity": "sha1-nsYfeQSYdXB9aUFFlv2Qek1xHnM=", + "dev": true + }, + "querystringify": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/querystringify/-/querystringify-2.1.1.tgz", + "integrity": "sha512-w7fLxIRCRT7U8Qu53jQnJyPkYZIaR4n5151KMfcJlO/A9397Wxb1amJvROTK6TOnp7PfoAmg/qXiNHI+08jRfA==", + "dev": true + }, + "randomatic": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/randomatic/-/randomatic-3.1.1.tgz", + "integrity": "sha512-TuDE5KxZ0J461RVjrJZCJc+J+zCkTb1MbH9AQUq68sMhOMcy9jLcb3BrZKgp9q9Ncltdg4QVqWrH02W2EFFVYw==", + "dev": true, + "requires": { + "is-number": "^4.0.0", + "kind-of": "^6.0.0", + "math-random": "^1.0.1" + }, + "dependencies": { + "is-number": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-4.0.0.tgz", + "integrity": "sha512-rSklcAIlf1OmFdyAqbnWTLVelsQ58uvZ66S/ZyawjWqIviTWCjg2PzVGw8WUA+nNuPTqb4wgA+NszrJ+08LlgQ==", + "dev": true + } + } + }, + "randombytes": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz", + "integrity": "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==", + "dev": true, + "requires": { + "safe-buffer": "^5.1.0" + } + }, + "randomfill": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/randomfill/-/randomfill-1.0.4.tgz", + "integrity": "sha512-87lcbR8+MhcWcUiQ+9e+Rwx8MyR2P7qnt15ynUlbm3TU/fjbgz4GsvfSUDTemtCCtVCqb4ZcEFlyPNTh9bBTLw==", + "dev": true, + "requires": { + "randombytes": "^2.0.5", + "safe-buffer": "^5.1.0" + } + }, + "range-parser": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", + "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==", + "dev": true + }, + "raw-body": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.4.0.tgz", + "integrity": "sha512-4Oz8DUIwdvoa5qMJelxipzi/iJIi40O5cGV1wNYp5hvZP8ZN0T+jiNkL0QepXs+EsQ9XJ8ipEDoiH70ySUJP3Q==", + "dev": true, + "requires": { + "bytes": "3.1.0", + "http-errors": "1.7.2", + "iconv-lite": "0.4.24", + "unpipe": "1.0.0" + }, + "dependencies": { + "bytes": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.0.tgz", + "integrity": "sha512-zauLjrfCG+xvoyaqLoV8bLVXXNGC4JqlxFCutSDWA6fJrTo2ZuvLYTqZ7aHBLZSMOopbzwv8f+wZcVzfVTI2Dg==", + "dev": true + } + } + }, + "rc": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/rc/-/rc-1.2.8.tgz", + "integrity": "sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==", + "dev": true, + "requires": { + "deep-extend": "^0.6.0", + "ini": "~1.3.0", + "minimist": "^1.2.0", + "strip-json-comments": "~2.0.1" + }, + "dependencies": { + "minimist": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", + "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=", + "dev": true + } + } + }, + "read-pkg": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-2.0.0.tgz", + "integrity": "sha1-jvHAYjxqbbDcZxPEv6xGMysjaPg=", + "dev": true, + "requires": { + "load-json-file": "^2.0.0", + "normalize-package-data": "^2.3.2", + "path-type": "^2.0.0" + } + }, + "read-pkg-up": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-2.0.0.tgz", + "integrity": "sha1-a3KoBImE4MQeeVEP1en6mbO1Sb4=", + "dev": true, + "requires": { + "find-up": "^2.0.0", + "read-pkg": "^2.0.0" + }, + "dependencies": { + "find-up": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-2.1.0.tgz", + "integrity": "sha1-RdG35QbHF93UgndaK3eSCjwMV6c=", + "dev": true, + "requires": { + "locate-path": "^2.0.0" + } + }, + "locate-path": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-2.0.0.tgz", + "integrity": "sha1-K1aLJl7slExtnA3pw9u7ygNUzY4=", + "dev": true, + "requires": { + "p-locate": "^2.0.0", + "path-exists": "^3.0.0" + } + }, + "p-limit": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-1.3.0.tgz", + "integrity": "sha512-vvcXsLAJ9Dr5rQOPk7toZQZJApBl2K4J6dANSsEuh6QI41JYcsS/qhTGa9ErIUUgK3WNQoJYvylxvjqmiqEA9Q==", + "dev": true, + "requires": { + "p-try": "^1.0.0" + } + }, + "p-locate": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-2.0.0.tgz", + "integrity": "sha1-IKAQOyIqcMj9OcwuWAaA893l7EM=", + "dev": true, + "requires": { + "p-limit": "^1.1.0" + } + }, + "p-try": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/p-try/-/p-try-1.0.0.tgz", + "integrity": "sha1-y8ec26+P1CKOE/Yh8rGiN8GyB7M=", + "dev": true + }, + "path-exists": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", + "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=", + "dev": true + } + } + }, + "readable-stream": { + "version": "2.3.6", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", + "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==", + "dev": true, + "requires": { + "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" + } + }, + "readdirp": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-2.2.1.tgz", + "integrity": "sha512-1JU/8q+VgFZyxwrJ+SVIOsh+KywWGpds3NTqikiKpDMZWScmAYyKIgqkO+ARvNWJfXeXR1zxz7aHF4u4CyH6vQ==", + "dev": true, + "requires": { + "graceful-fs": "^4.1.11", + "micromatch": "^3.1.10", + "readable-stream": "^2.0.2" + } + }, + "readline2": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/readline2/-/readline2-1.0.1.tgz", + "integrity": "sha1-QQWWCP/BVHV7cV2ZidGZ/783LjU=", + "dev": true, + "requires": { + "code-point-at": "^1.0.0", + "is-fullwidth-code-point": "^1.0.0", + "mute-stream": "0.0.5" + }, + "dependencies": { + "is-fullwidth-code-point": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz", + "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=", + "dev": true, + "requires": { + "number-is-nan": "^1.0.0" + } + }, + "mute-stream": { + "version": "0.0.5", + "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-0.0.5.tgz", + "integrity": "sha1-j7+rsKmKJT0xhDMfno3rc3L6xsA=", + "dev": true + } + } + }, + "recast": { + "version": "0.10.33", + "resolved": "https://registry.npmjs.org/recast/-/recast-0.10.33.tgz", + "integrity": "sha1-lCgI96oBbx+nFCxGHX5XBKqo1pc=", + "dev": true, + "requires": { + "ast-types": "0.8.12", + "esprima-fb": "~15001.1001.0-dev-harmony-fb", + "private": "~0.1.5", + "source-map": "~0.5.0" + }, + "dependencies": { + "ast-types": { + "version": "0.8.12", + "resolved": "https://registry.npmjs.org/ast-types/-/ast-types-0.8.12.tgz", + "integrity": "sha1-oNkOQ1G7iHcWyD/WN+v4GK9K38w=", + "dev": true + } + } + }, + "rechoir": { + "version": "0.6.2", + "resolved": "https://registry.npmjs.org/rechoir/-/rechoir-0.6.2.tgz", + "integrity": "sha1-hSBLVNuoLVdC4oyWdW70OvUOM4Q=", + "dev": true, + "requires": { + "resolve": "^1.1.6" + } + }, + "regenerate": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/regenerate/-/regenerate-1.4.0.tgz", + "integrity": "sha512-1G6jJVDWrt0rK99kBjvEtziZNCICAuvIPkSiUFIQxVP06RCVpq3dmDo2oi6ABpYaDYaTRr67BEhL8r1wgEZZKg==", + "dev": true + }, + "regenerate-unicode-properties": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/regenerate-unicode-properties/-/regenerate-unicode-properties-8.1.0.tgz", + "integrity": "sha512-LGZzkgtLY79GeXLm8Dp0BVLdQlWICzBnJz/ipWUgo59qBaZ+BHtq51P2q1uVZlppMuUAT37SDk39qUbjTWB7bA==", + "dev": true, + "requires": { + "regenerate": "^1.4.0" + } + }, + "regenerator": { + "version": "0.8.40", + "resolved": "https://registry.npmjs.org/regenerator/-/regenerator-0.8.40.tgz", + "integrity": "sha1-oORXxY69uuV1yfjNdRJ+k3VkNdg=", + "dev": true, + "requires": { + "commoner": "~0.10.3", + "defs": "~1.1.0", + "esprima-fb": "~15001.1001.0-dev-harmony-fb", + "private": "~0.1.5", + "recast": "0.10.33", + "through": "~2.3.8" + } + }, + "regenerator-runtime": { + "version": "0.11.1", + "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.11.1.tgz", + "integrity": "sha512-MguG95oij0fC3QV3URf4V2SDYGJhJnJGqvIIgdECeODCT98wSWDAJ94SSuVpYQUoTcGUIL6L4yNB7j1DFFHSBg==", + "dev": true + }, + "regenerator-transform": { + "version": "0.14.1", + "resolved": "https://registry.npmjs.org/regenerator-transform/-/regenerator-transform-0.14.1.tgz", + "integrity": "sha512-flVuee02C3FKRISbxhXl9mGzdbWUVHubl1SMaknjxkFB1/iqpJhArQUvRxOOPEc/9tAiX0BaQ28FJH10E4isSQ==", + "dev": true, + "requires": { + "private": "^0.1.6" + } + }, + "regex-cache": { + "version": "0.4.4", + "resolved": "https://registry.npmjs.org/regex-cache/-/regex-cache-0.4.4.tgz", + "integrity": "sha512-nVIZwtCjkC9YgvWkpM55B5rBhBYRZhAaJbgcFYXXsHnbZ9UZI9nnVWYZpBlCqv9ho2eZryPnWrZGsOdPwVWXWQ==", + "dev": true, + "requires": { + "is-equal-shallow": "^0.1.3" + } + }, + "regex-not": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/regex-not/-/regex-not-1.0.2.tgz", + "integrity": "sha512-J6SDjUgDxQj5NusnOtdFxDwN/+HWykR8GELwctJ7mdqhcyy1xEc4SRFHUXvxTp661YaVKAjfRLZ9cCqS6tn32A==", + "dev": true, + "requires": { + "extend-shallow": "^3.0.2", + "safe-regex": "^1.1.0" + } + }, + "regexp-tree": { + "version": "0.1.13", + "resolved": "https://registry.npmjs.org/regexp-tree/-/regexp-tree-0.1.13.tgz", + "integrity": "sha512-hwdV/GQY5F8ReLZWO+W1SRoN5YfpOKY6852+tBFcma72DKBIcHjPRIlIvQN35bCOljuAfP2G2iB0FC/w236mUw==", + "dev": true + }, + "regexp.prototype.flags": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.2.0.tgz", + "integrity": "sha512-ztaw4M1VqgMwl9HlPpOuiYgItcHlunW0He2fE6eNfT6E/CF2FtYi9ofOYe4mKntstYk0Fyh/rDRBdS3AnxjlrA==", + "dev": true, + "requires": { + "define-properties": "^1.1.2" + } + }, + "regexpp": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/regexpp/-/regexpp-2.0.1.tgz", + "integrity": "sha512-lv0M6+TkDVniA3aD1Eg0DVpfU/booSu7Eev3TDO/mZKHBfVjgCGTV4t4buppESEYDtkArYFOxTJWv6S5C+iaNw==", + "dev": true + }, + "regexpu": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/regexpu/-/regexpu-1.3.0.tgz", + "integrity": "sha1-5TTcmRqeWEYFDJjebX3UpVyeoW0=", + "dev": true, + "requires": { + "esprima": "^2.6.0", + "recast": "^0.10.10", + "regenerate": "^1.2.1", + "regjsgen": "^0.2.0", + "regjsparser": "^0.1.4" + }, + "dependencies": { + "esprima": { + "version": "2.7.3", + "resolved": "https://registry.npmjs.org/esprima/-/esprima-2.7.3.tgz", + "integrity": "sha1-luO3DVd59q1JzQMmc9HDEnZ7pYE=", + "dev": true + }, + "jsesc": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-0.5.0.tgz", + "integrity": "sha1-597mbjXW/Bb3EP6R1c9p9w8IkR0=", + "dev": true + }, + "regjsgen": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/regjsgen/-/regjsgen-0.2.0.tgz", + "integrity": "sha1-bAFq3qxVT3WCP+N6wFuS1aTtsfc=", + "dev": true + }, + "regjsparser": { + "version": "0.1.5", + "resolved": "https://registry.npmjs.org/regjsparser/-/regjsparser-0.1.5.tgz", + "integrity": "sha1-fuj4Tcb6eS0/0K4ijSS9lJ6tIFw=", + "dev": true, + "requires": { + "jsesc": "~0.5.0" + } + } + } + }, + "regexpu-core": { + "version": "4.5.5", + "resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-4.5.5.tgz", + "integrity": "sha512-FpI67+ky9J+cDizQUJlIlNZFKual/lUkFr1AG6zOCpwZ9cLrg8UUVakyUQJD7fCDIe9Z2nwTQJNPyonatNmDFQ==", + "dev": true, + "requires": { + "regenerate": "^1.4.0", + "regenerate-unicode-properties": "^8.1.0", + "regjsgen": "^0.5.0", + "regjsparser": "^0.6.0", + "unicode-match-property-ecmascript": "^1.0.4", + "unicode-match-property-value-ecmascript": "^1.1.0" + } + }, + "registry-auth-token": { + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/registry-auth-token/-/registry-auth-token-3.4.0.tgz", + "integrity": "sha512-4LM6Fw8eBQdwMYcES4yTnn2TqIasbXuwDx3um+QRs7S55aMKCBKBxvPXl2RiUjHwuJLTyYfxSpmfSAjQpcuP+A==", + "dev": true, + "requires": { + "rc": "^1.1.6", + "safe-buffer": "^5.0.1" + } + }, + "registry-url": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/registry-url/-/registry-url-3.1.0.tgz", + "integrity": "sha1-PU74cPc93h138M+aOBQyRE4XSUI=", + "dev": true, + "requires": { + "rc": "^1.0.1" + } + }, + "regjsgen": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/regjsgen/-/regjsgen-0.5.0.tgz", + "integrity": "sha512-RnIrLhrXCX5ow/E5/Mh2O4e/oa1/jW0eaBKTSy3LaCj+M3Bqvm97GWDp2yUtzIs4LEn65zR2yiYGFqb2ApnzDA==", + "dev": true + }, + "regjsparser": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/regjsparser/-/regjsparser-0.6.0.tgz", + "integrity": "sha512-RQ7YyokLiQBomUJuUG8iGVvkgOLxwyZM8k6d3q5SAXpg4r5TZJZigKFvC6PpD+qQ98bCDC5YelPeA3EucDoNeQ==", + "dev": true, + "requires": { + "jsesc": "~0.5.0" + }, + "dependencies": { + "jsesc": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-0.5.0.tgz", + "integrity": "sha1-597mbjXW/Bb3EP6R1c9p9w8IkR0=", + "dev": true + } + } + }, + "remove-trailing-separator": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/remove-trailing-separator/-/remove-trailing-separator-1.1.0.tgz", + "integrity": "sha1-wkvOKig62tW8P1jg1IJJuSN52O8=", + "dev": true + }, + "repeat-element": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/repeat-element/-/repeat-element-1.1.3.tgz", + "integrity": "sha512-ahGq0ZnV5m5XtZLMb+vP76kcAM5nkLqk0lpqAuojSKGgQtn4eRi4ZZGm2olo2zKFH+sMsWaqOCW1dqAnOru72g==", + "dev": true + }, + "repeat-string": { + "version": "1.6.1", + "resolved": "https://registry.npmjs.org/repeat-string/-/repeat-string-1.6.1.tgz", + "integrity": "sha1-jcrkcOHIirwtYA//Sndihtp15jc=", + "dev": true + }, + "repeating": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/repeating/-/repeating-2.0.1.tgz", + "integrity": "sha1-UhTFOpJtNVJwdSf7q0FdvAjQbdo=", + "dev": true, + "requires": { + "is-finite": "^1.0.0" + } + }, + "require-directory": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", + "integrity": "sha1-jGStX9MNqxyXbiNE/+f3kqam30I=", + "dev": true + }, + "require-main-filename": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-2.0.0.tgz", + "integrity": "sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg==", + "dev": true + }, + "require-uncached": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/require-uncached/-/require-uncached-1.0.3.tgz", + "integrity": "sha1-Tg1W1slmL9MeQwEcS5WqSZVUIdM=", + "dev": true, + "requires": { + "caller-path": "^0.1.0", + "resolve-from": "^1.0.0" + }, + "dependencies": { + "resolve-from": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-1.0.1.tgz", + "integrity": "sha1-Jsv+k10a7uq7Kbw/5a6wHpPUQiY=", + "dev": true + } + } + }, + "requires-port": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/requires-port/-/requires-port-1.0.0.tgz", + "integrity": "sha1-kl0mAdOaxIXgkc8NpcbmlNw9yv8=", + "dev": true + }, + "resolve": { + "version": "1.12.0", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.12.0.tgz", + "integrity": "sha512-B/dOmuoAik5bKcD6s6nXDCjzUKnaDvdkRyAk6rsmsKLipWj4797iothd7jmmUhWTfinVMU+wc56rYKsit2Qy4w==", + "dev": true, + "requires": { + "path-parse": "^1.0.6" + } + }, + "resolve-cwd": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/resolve-cwd/-/resolve-cwd-2.0.0.tgz", + "integrity": "sha1-AKn3OHVW4nA46uIyyqNypqWbZlo=", + "dev": true, + "requires": { + "resolve-from": "^3.0.0" + } + }, + "resolve-dir": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/resolve-dir/-/resolve-dir-1.0.1.tgz", + "integrity": "sha1-eaQGRMNivoLybv/nOcm7U4IEb0M=", + "dev": true, + "requires": { + "expand-tilde": "^2.0.0", + "global-modules": "^1.0.0" + }, + "dependencies": { + "global-modules": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/global-modules/-/global-modules-1.0.0.tgz", + "integrity": "sha512-sKzpEkf11GpOFuw0Zzjzmt4B4UZwjOcG757PPvrfhxcLFbq0wpsgpOqxpxtxFiCG4DtG93M6XRVbF2oGdev7bg==", + "dev": true, + "requires": { + "global-prefix": "^1.0.1", + "is-windows": "^1.0.1", + "resolve-dir": "^1.0.0" + } + } + } + }, + "resolve-from": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-3.0.0.tgz", + "integrity": "sha1-six699nWiBvItuZTM17rywoYh0g=", + "dev": true + }, + "resolve-url": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/resolve-url/-/resolve-url-0.2.1.tgz", + "integrity": "sha1-LGN/53yJOv0qZj/iGqkIAGjiBSo=", + "dev": true + }, + "restore-cursor": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-2.0.0.tgz", + "integrity": "sha1-n37ih/gv0ybU/RYpI9YhKe7g368=", + "dev": true, + "requires": { + "onetime": "^2.0.0", + "signal-exit": "^3.0.2" + } + }, + "ret": { + "version": "0.1.15", + "resolved": "https://registry.npmjs.org/ret/-/ret-0.1.15.tgz", + "integrity": "sha512-TTlYpa+OL+vMMNG24xSlQGEJ3B/RzEfUlLct7b5G/ytav+wPrplCpVMFuwzXbkecJrb6IYo1iFb0S9v37754mg==", + "dev": true + }, + "retry": { + "version": "0.12.0", + "resolved": "https://registry.npmjs.org/retry/-/retry-0.12.0.tgz", + "integrity": "sha1-G0KmJmoh8HQh0bC1S33BZ7AcATs=", + "dev": true + }, + "right-align": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/right-align/-/right-align-0.1.3.tgz", + "integrity": "sha1-YTObci/mo1FWiSENJOFMlhSGE+8=", + "dev": true, + "requires": { + "align-text": "^0.1.1" + } + }, + "rimraf": { + "version": "2.7.1", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz", + "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==", + "dev": true, + "requires": { + "glob": "^7.1.3" + } + }, + "ripemd160": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/ripemd160/-/ripemd160-2.0.2.tgz", + "integrity": "sha512-ii4iagi25WusVoiC4B4lq7pbXfAp3D9v5CwfkY33vffw2+pkDjY1D8GaN7spsxvCSx8dkPqOZCEZyfxcmJG2IA==", + "dev": true, + "requires": { + "hash-base": "^3.0.0", + "inherits": "^2.0.1" + } + }, + "run-async": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/run-async/-/run-async-2.3.0.tgz", + "integrity": "sha1-A3GrSuC91yDUFm19/aZP96RFpsA=", + "dev": true, + "requires": { + "is-promise": "^2.1.0" + } + }, + "run-queue": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/run-queue/-/run-queue-1.0.3.tgz", + "integrity": "sha1-6Eg5bwV9Ij8kOGkkYY4laUFh7Ec=", + "dev": true, + "requires": { + "aproba": "^1.1.1" + } + }, + "rx-lite": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/rx-lite/-/rx-lite-3.1.2.tgz", + "integrity": "sha1-Gc5QLKVyZl87ZHsQk5+X/RYV8QI=", + "dev": true + }, + "rxjs": { + "version": "6.5.3", + "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.5.3.tgz", + "integrity": "sha512-wuYsAYYFdWTAnAaPoKGNhfpWwKZbJW+HgAJ+mImp+Epl7BG8oNWBCTyRM8gba9k4lk8BgWdoYm21Mo/RYhhbgA==", + "dev": true, + "requires": { + "tslib": "^1.9.0" + } + }, + "safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", + "dev": true + }, + "safe-regex": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/safe-regex/-/safe-regex-1.1.0.tgz", + "integrity": "sha1-QKNmnzsHfR6UPURinhV91IAjvy4=", + "dev": true, + "requires": { + "ret": "~0.1.10" + } + }, + "safer-buffer": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", + "dev": true + }, + "schema-utils": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-1.0.0.tgz", + "integrity": "sha512-i27Mic4KovM/lnGsy8whRCHhc7VicJajAjTrYg11K9zfZXnYIt4k5F+kZkwjnrhKzLic/HLU4j11mjsz2G/75g==", + "dev": true, + "requires": { + "ajv": "^6.1.0", + "ajv-errors": "^1.0.0", + "ajv-keywords": "^3.1.0" + } + }, + "select-hose": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/select-hose/-/select-hose-2.0.0.tgz", + "integrity": "sha1-Yl2GWPhlr0Psliv8N2o3NZpJlMo=", + "dev": true + }, + "selfsigned": { + "version": "1.10.6", + "resolved": "https://registry.npmjs.org/selfsigned/-/selfsigned-1.10.6.tgz", + "integrity": "sha512-i3+CeqxL7DpAazgVpAGdKMwHuL63B5nhJMh9NQ7xmChGkA3jNFflq6Jyo1LLJYcr3idWiNOPWHCrm4zMayLG4w==", + "dev": true, + "requires": { + "node-forge": "0.8.2" + } + }, + "semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", + "dev": true + }, + "semver-diff": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/semver-diff/-/semver-diff-2.1.0.tgz", + "integrity": "sha1-S7uEN8jTfksM8aaP1ybsbWRdbTY=", + "dev": true, + "requires": { + "semver": "^5.0.3" + } + }, + "send": { + "version": "0.17.1", + "resolved": "https://registry.npmjs.org/send/-/send-0.17.1.tgz", + "integrity": "sha512-BsVKsiGcQMFwT8UxypobUKyv7irCNRHk1T0G680vk88yf6LBByGcZJOTJCrTP2xVN6yI+XjPJcNuE3V4fT9sAg==", + "dev": true, + "requires": { + "debug": "2.6.9", + "depd": "~1.1.2", + "destroy": "~1.0.4", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "etag": "~1.8.1", + "fresh": "0.5.2", + "http-errors": "~1.7.2", + "mime": "1.6.0", + "ms": "2.1.1", + "on-finished": "~2.3.0", + "range-parser": "~1.2.1", + "statuses": "~1.5.0" + }, + "dependencies": { + "ms": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.1.tgz", + "integrity": "sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg==", + "dev": true + } + } + }, + "serialize-javascript": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-1.9.1.tgz", + "integrity": "sha512-0Vb/54WJ6k5v8sSWN09S0ora+Hnr+cX40r9F170nT+mSkaxltoE/7R3OrIdBSUv1OoiobH1QoWQbCnAO+e8J1A==", + "dev": true + }, + "serve-index": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/serve-index/-/serve-index-1.9.1.tgz", + "integrity": "sha1-03aNabHn2C5c4FD/9bRTvqEqkjk=", + "dev": true, + "requires": { + "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" + }, + "dependencies": { + "http-errors": { + "version": "1.6.3", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.6.3.tgz", + "integrity": "sha1-i1VoC7S+KDoLW/TqLjhYC+HZMg0=", + "dev": true, + "requires": { + "depd": "~1.1.2", + "inherits": "2.0.3", + "setprototypeof": "1.1.0", + "statuses": ">= 1.4.0 < 2" + } + }, + "inherits": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", + "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=", + "dev": true + }, + "setprototypeof": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.0.tgz", + "integrity": "sha512-BvE/TwpZX4FXExxOxZyRGQQv651MSwmWKZGqvmPcRIjDqWub67kTKuIMx43cZZrS/cBBzwBcNDWoFxt2XEFIpQ==", + "dev": true + } + } + }, + "serve-static": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.14.1.tgz", + "integrity": "sha512-JMrvUwE54emCYWlTI+hGrGv5I8dEwmco/00EvkzIIsR7MqrHonbD9pO2MOfFnpFntl7ecpZs+3mW+XbQZu9QCg==", + "dev": true, + "requires": { + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "parseurl": "~1.3.3", + "send": "0.17.1" + } + }, + "set-blocking": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", + "integrity": "sha1-BF+XgtARrppoA93TgrJDkrPYkPc=", + "dev": true + }, + "set-value": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/set-value/-/set-value-2.0.1.tgz", + "integrity": "sha512-JxHc1weCN68wRY0fhCoXpyK55m/XPHafOmK4UWD7m2CI14GMcFypt4w/0+NV5f/ZMby2F6S2wwA7fgynh9gWSw==", + "dev": true, + "requires": { + "extend-shallow": "^2.0.1", + "is-extendable": "^0.1.1", + "is-plain-object": "^2.0.3", + "split-string": "^3.0.1" + }, + "dependencies": { + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "requires": { + "is-extendable": "^0.1.0" + } + } + } + }, + "setimmediate": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/setimmediate/-/setimmediate-1.0.5.tgz", + "integrity": "sha1-KQy7Iy4waULX1+qbg3Mqt4VvgoU=", + "dev": true + }, + "setprototypeof": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.1.tgz", + "integrity": "sha512-JvdAWfbXeIGaZ9cILp38HntZSFSo3mWg6xGcJJsd+d4aRMOqauag1C63dJfDw7OaMYwEbHMOxEZ1lqVRYP2OAw==", + "dev": true + }, + "sha.js": { + "version": "2.4.11", + "resolved": "https://registry.npmjs.org/sha.js/-/sha.js-2.4.11.tgz", + "integrity": "sha512-QMEp5B7cftE7APOjk5Y6xgrbWu+WkLVQwk8JNjZ8nKRciZaByEW6MubieAiToS7+dwvrjGhH8jRXz3MVd0AYqQ==", + "dev": true, + "requires": { + "inherits": "^2.0.1", + "safe-buffer": "^5.0.1" + } + }, + "shebang-command": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz", + "integrity": "sha1-RKrGW2lbAzmJaMOfNj/uXer98eo=", + "dev": true, + "requires": { + "shebang-regex": "^1.0.0" + } + }, + "shebang-regex": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-1.0.0.tgz", + "integrity": "sha1-2kL0l0DAtC2yypcoVxyxkMmO/qM=", + "dev": true + }, + "shelljs": { + "version": "0.7.8", + "resolved": "https://registry.npmjs.org/shelljs/-/shelljs-0.7.8.tgz", + "integrity": "sha1-3svPh0sNHl+3LhSxZKloMEjprLM=", + "dev": true, + "requires": { + "glob": "^7.0.0", + "interpret": "^1.0.0", + "rechoir": "^0.6.2" + } + }, + "signal-exit": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.2.tgz", + "integrity": "sha1-tf3AjxKH6hF4Yo5BXiUTK3NkbG0=", + "dev": true + }, + "simple-fmt": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/simple-fmt/-/simple-fmt-0.1.0.tgz", + "integrity": "sha1-GRv1ZqWeZTBILLJatTtKjchcOms=", + "dev": true + }, + "simple-is": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/simple-is/-/simple-is-0.2.0.tgz", + "integrity": "sha1-Krt1qt453rXMgVzhDmGRFkhQuvA=", + "dev": true + }, + "slash": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-2.0.0.tgz", + "integrity": "sha512-ZYKh3Wh2z1PpEXWr0MpSBZ0V6mZHAQfYevttO11c51CaWjGTaadiKZ+wVt1PbMlDV5qhMFslpZCemhwOK7C89A==", + "dev": true + }, + "slice-ansi": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-2.1.0.tgz", + "integrity": "sha512-Qu+VC3EwYLldKa1fCxuuvULvSJOKEgk9pi8dZeCVK7TqBfUNTH4sFkk4joj8afVSfAYgJoSOetjx9QWOJ5mYoQ==", + "dev": true, + "requires": { + "ansi-styles": "^3.2.0", + "astral-regex": "^1.0.0", + "is-fullwidth-code-point": "^2.0.0" + } + }, + "snapdragon": { + "version": "0.8.2", + "resolved": "https://registry.npmjs.org/snapdragon/-/snapdragon-0.8.2.tgz", + "integrity": "sha512-FtyOnWN/wCHTVXOMwvSv26d+ko5vWlIDD6zoUJ7LW8vh+ZBC8QdljveRP+crNrtBwioEUWy/4dMtbBjA4ioNlg==", + "dev": true, + "requires": { + "base": "^0.11.1", + "debug": "^2.2.0", + "define-property": "^0.2.5", + "extend-shallow": "^2.0.1", + "map-cache": "^0.2.2", + "source-map": "^0.5.6", + "source-map-resolve": "^0.5.0", + "use": "^3.1.0" + }, + "dependencies": { + "define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", + "dev": true, + "requires": { + "is-descriptor": "^0.1.0" + } + }, + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "requires": { + "is-extendable": "^0.1.0" + } + } + } + }, + "snapdragon-node": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/snapdragon-node/-/snapdragon-node-2.1.1.tgz", + "integrity": "sha512-O27l4xaMYt/RSQ5TR3vpWCAB5Kb/czIcqUFOM/C4fYcLnbZUc1PkjTAMjof2pBWaSTwOUd6qUHcFGVGj7aIwnw==", + "dev": true, + "requires": { + "define-property": "^1.0.0", + "isobject": "^3.0.0", + "snapdragon-util": "^3.0.1" + }, + "dependencies": { + "define-property": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", + "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", + "dev": true, + "requires": { + "is-descriptor": "^1.0.0" + } + }, + "is-accessor-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", + "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", + "dev": true, + "requires": { + "kind-of": "^6.0.0" + } + }, + "is-data-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", + "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", + "dev": true, + "requires": { + "kind-of": "^6.0.0" + } + }, + "is-descriptor": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", + "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", + "dev": true, + "requires": { + "is-accessor-descriptor": "^1.0.0", + "is-data-descriptor": "^1.0.0", + "kind-of": "^6.0.2" + } + } + } + }, + "snapdragon-util": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/snapdragon-util/-/snapdragon-util-3.0.1.tgz", + "integrity": "sha512-mbKkMdQKsjX4BAL4bRYTj21edOf8cN7XHdYUJEe+Zn99hVEYcMvKPct1IqNe7+AZPirn8BCDOQBHQZknqmKlZQ==", + "dev": true, + "requires": { + "kind-of": "^3.2.0" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "sockjs": { + "version": "0.3.19", + "resolved": "https://registry.npmjs.org/sockjs/-/sockjs-0.3.19.tgz", + "integrity": "sha512-V48klKZl8T6MzatbLlzzRNhMepEys9Y4oGFpypBFFn1gLI/QQ9HtLLyWJNbPlwGLelOVOEijUbTTJeLLI59jLw==", + "dev": true, + "requires": { + "faye-websocket": "^0.10.0", + "uuid": "^3.0.1" + } + }, + "sockjs-client": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/sockjs-client/-/sockjs-client-1.3.0.tgz", + "integrity": "sha512-R9jxEzhnnrdxLCNln0xg5uGHqMnkhPSTzUZH2eXcR03S/On9Yvoq2wyUZILRUhZCNVu2PmwWVoyuiPz8th8zbg==", + "dev": true, + "requires": { + "debug": "^3.2.5", + "eventsource": "^1.0.7", + "faye-websocket": "~0.11.1", + "inherits": "^2.0.3", + "json3": "^3.3.2", + "url-parse": "^1.4.3" + }, + "dependencies": { + "debug": { + "version": "3.2.6", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.6.tgz", + "integrity": "sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ==", + "dev": true, + "requires": { + "ms": "^2.1.1" + } + }, + "faye-websocket": { + "version": "0.11.3", + "resolved": "https://registry.npmjs.org/faye-websocket/-/faye-websocket-0.11.3.tgz", + "integrity": "sha512-D2y4bovYpzziGgbHYtGCMjlJM36vAl/y+xUyn1C+FVx8szd1E+86KwVw6XvYSzOP8iMpm1X0I4xJD+QtUb36OA==", + "dev": true, + "requires": { + "websocket-driver": ">=0.5.1" + } + }, + "ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "dev": true + } + } + }, + "source-list-map": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/source-list-map/-/source-list-map-2.0.1.tgz", + "integrity": "sha512-qnQ7gVMxGNxsiL4lEuJwe/To8UnK7fAnmbGEEH8RpLouuKbeEm0lhbQVFIrNSuB+G7tVrAlVsZgETT5nljf+Iw==", + "dev": true + }, + "source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", + "dev": true + }, + "source-map-resolve": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/source-map-resolve/-/source-map-resolve-0.5.2.tgz", + "integrity": "sha512-MjqsvNwyz1s0k81Goz/9vRBe9SZdB09Bdw+/zYyO+3CuPk6fouTaxscHkgtE8jKvf01kVfl8riHzERQ/kefaSA==", + "dev": true, + "requires": { + "atob": "^2.1.1", + "decode-uri-component": "^0.2.0", + "resolve-url": "^0.2.1", + "source-map-url": "^0.4.0", + "urix": "^0.1.0" + } + }, + "source-map-support": { + "version": "0.4.18", + "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.4.18.tgz", + "integrity": "sha512-try0/JqxPLF9nOjvSta7tVondkP5dwgyLDjVoyMDlmjugT2lRZ1OfsrYTkCd2hkDnJTKRbO/Rl3orm8vlsUzbA==", + "dev": true, + "requires": { + "source-map": "^0.5.6" + } + }, + "source-map-url": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/source-map-url/-/source-map-url-0.4.0.tgz", + "integrity": "sha1-PpNdfd1zYxuXZZlW1VEo6HtQhKM=", + "dev": true + }, + "spdx-correct": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.1.0.tgz", + "integrity": "sha512-lr2EZCctC2BNR7j7WzJ2FpDznxky1sjfxvvYEyzxNyb6lZXHODmEoJeFu4JupYlkfha1KZpJyoqiJ7pgA1qq8Q==", + "dev": true, + "requires": { + "spdx-expression-parse": "^3.0.0", + "spdx-license-ids": "^3.0.0" + } + }, + "spdx-exceptions": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.2.0.tgz", + "integrity": "sha512-2XQACfElKi9SlVb1CYadKDXvoajPgBVPn/gOQLrTvHdElaVhr7ZEbqJaRnJLVNeaI4cMEAgVCeBMKF6MWRDCRA==", + "dev": true + }, + "spdx-expression-parse": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-3.0.0.tgz", + "integrity": "sha512-Yg6D3XpRD4kkOmTpdgbUiEJFKghJH03fiC1OPll5h/0sO6neh2jqRDVHOQ4o/LMea0tgCkbMgea5ip/e+MkWyg==", + "dev": true, + "requires": { + "spdx-exceptions": "^2.1.0", + "spdx-license-ids": "^3.0.0" + } + }, + "spdx-license-ids": { + "version": "3.0.5", + "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.5.tgz", + "integrity": "sha512-J+FWzZoynJEXGphVIS+XEh3kFSjZX/1i9gFBaWQcB+/tmpe2qUsSBABpcxqxnAxFdiUFEgAX1bjYGQvIZmoz9Q==", + "dev": true + }, + "spdy": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/spdy/-/spdy-4.0.1.tgz", + "integrity": "sha512-HeZS3PBdMA+sZSu0qwpCxl3DeALD5ASx8pAX0jZdKXSpPWbQ6SYGnlg3BBmYLx5LtiZrmkAZfErCm2oECBcioA==", + "dev": true, + "requires": { + "debug": "^4.1.0", + "handle-thing": "^2.0.0", + "http-deceiver": "^1.2.7", + "select-hose": "^2.0.0", + "spdy-transport": "^3.0.0" + }, + "dependencies": { + "debug": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", + "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", + "dev": true, + "requires": { + "ms": "^2.1.1" + } + }, + "ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "dev": true + } + } + }, + "spdy-transport": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/spdy-transport/-/spdy-transport-3.0.0.tgz", + "integrity": "sha512-hsLVFE5SjA6TCisWeJXFKniGGOpBgMLmerfO2aCyCU5s7nJ/rpAepqmFifv/GCbSbueEeAJJnmSQ2rKC/g8Fcw==", + "dev": true, + "requires": { + "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" + }, + "dependencies": { + "debug": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", + "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", + "dev": true, + "requires": { + "ms": "^2.1.1" + } + }, + "ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "dev": true + }, + "readable-stream": { + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.4.0.tgz", + "integrity": "sha512-jItXPLmrSR8jmTRmRWJXCnGJsfy85mB3Wd/uINMXA65yrnFo0cPClFIUWzo2najVNSl+mx7/4W8ttlLWJe99pQ==", + "dev": true, + "requires": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + } + } + } + }, + "split-string": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/split-string/-/split-string-3.1.0.tgz", + "integrity": "sha512-NzNVhJDYpwceVVii8/Hu6DKfD2G+NrQHlS/V/qgv763EYudVwEcMQNxd2lh+0VrUByXN/oJkl5grOhYWvQUYiw==", + "dev": true, + "requires": { + "extend-shallow": "^3.0.0" + } + }, + "sprintf-js": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", + "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=", + "dev": true + }, + "ssri": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/ssri/-/ssri-6.0.1.tgz", + "integrity": "sha512-3Wge10hNcT1Kur4PDFwEieXSCMCJs/7WvSACcrMYrNp+b8kDL1/0wJch5Ni2WrtwEa2IO8OsVfeKIciKCDx/QA==", + "dev": true, + "requires": { + "figgy-pudding": "^3.5.1" + } + }, + "stable": { + "version": "0.1.8", + "resolved": "https://registry.npmjs.org/stable/-/stable-0.1.8.tgz", + "integrity": "sha512-ji9qxRnOVfcuLDySj9qzhGSEFVobyt1kIOSkj1qZzYLzq7Tos/oUUWvotUPQLlrsidqsK6tBH89Bc9kL5zHA6w==", + "dev": true + }, + "static-extend": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/static-extend/-/static-extend-0.1.2.tgz", + "integrity": "sha1-YICcOcv/VTNyJv1eC1IPNB8ftcY=", + "dev": true, + "requires": { + "define-property": "^0.2.5", + "object-copy": "^0.1.0" + }, + "dependencies": { + "define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", + "dev": true, + "requires": { + "is-descriptor": "^0.1.0" + } + } + } + }, + "statuses": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz", + "integrity": "sha1-Fhx9rBd2Wf2YEfQ3cfqZOBR4Yow=", + "dev": true + }, + "stream-browserify": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/stream-browserify/-/stream-browserify-2.0.2.tgz", + "integrity": "sha512-nX6hmklHs/gr2FuxYDltq8fJA1GDlxKQCz8O/IM4atRqBH8OORmBNgfvW5gG10GT/qQ9u0CzIvr2X5Pkt6ntqg==", + "dev": true, + "requires": { + "inherits": "~2.0.1", + "readable-stream": "^2.0.2" + } + }, + "stream-each": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/stream-each/-/stream-each-1.2.3.tgz", + "integrity": "sha512-vlMC2f8I2u/bZGqkdfLQW/13Zihpej/7PmSiMQsbYddxuTsJp8vRe2x2FvVExZg7FaOds43ROAuFJwPR4MTZLw==", + "dev": true, + "requires": { + "end-of-stream": "^1.1.0", + "stream-shift": "^1.0.0" + } + }, + "stream-http": { + "version": "2.8.3", + "resolved": "https://registry.npmjs.org/stream-http/-/stream-http-2.8.3.tgz", + "integrity": "sha512-+TSkfINHDo4J+ZobQLWiMouQYB+UVYFttRA94FpEzzJ7ZdqcL4uUUQ7WkdkI4DSozGmgBUE/a47L+38PenXhUw==", + "dev": true, + "requires": { + "builtin-status-codes": "^3.0.0", + "inherits": "^2.0.1", + "readable-stream": "^2.3.6", + "to-arraybuffer": "^1.0.0", + "xtend": "^4.0.0" + } + }, + "stream-shift": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/stream-shift/-/stream-shift-1.0.0.tgz", + "integrity": "sha1-1cdSgl5TZ+eG944Y5EXqIjoVWVI=", + "dev": true + }, + "string-width": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz", + "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==", + "dev": true, + "requires": { + "is-fullwidth-code-point": "^2.0.0", + "strip-ansi": "^4.0.0" + }, + "dependencies": { + "ansi-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", + "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=", + "dev": true + }, + "strip-ansi": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", + "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", + "dev": true, + "requires": { + "ansi-regex": "^3.0.0" + } + } + } + }, + "string.prototype.trimleft": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/string.prototype.trimleft/-/string.prototype.trimleft-2.1.0.tgz", + "integrity": "sha512-FJ6b7EgdKxxbDxc79cOlok6Afd++TTs5szo+zJTUyow3ycrRfJVE2pq3vcN53XexvKZu/DJMDfeI/qMiZTrjTw==", + "dev": true, + "requires": { + "define-properties": "^1.1.3", + "function-bind": "^1.1.1" + } + }, + "string.prototype.trimright": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/string.prototype.trimright/-/string.prototype.trimright-2.1.0.tgz", + "integrity": "sha512-fXZTSV55dNBwv16uw+hh5jkghxSnc5oHq+5K/gXgizHwAvMetdAJlHqqoFC1FSDVPYWLkAKl2cxpUT41sV7nSg==", + "dev": true, + "requires": { + "define-properties": "^1.1.3", + "function-bind": "^1.1.1" + } + }, + "string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "dev": true, + "requires": { + "safe-buffer": "~5.1.0" + } + }, + "stringmap": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/stringmap/-/stringmap-0.2.2.tgz", + "integrity": "sha1-VWwTeyWPlCuHdvWy71gqoGnX0bE=", + "dev": true + }, + "stringset": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/stringset/-/stringset-0.2.1.tgz", + "integrity": "sha1-7yWcTjSTRDd/zRyRPdLoSMnAQrU=", + "dev": true + }, + "strip-ansi": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", + "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", + "dev": true, + "requires": { + "ansi-regex": "^2.0.0" + } + }, + "strip-bom": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", + "integrity": "sha1-IzTBjpx1n3vdVv3vfprj1YjmjtM=", + "dev": true + }, + "strip-eof": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/strip-eof/-/strip-eof-1.0.0.tgz", + "integrity": "sha1-u0P/VZim6wXYm1n80SnJgzE2Br8=", + "dev": true + }, + "strip-json-comments": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz", + "integrity": "sha1-PFMZQukIwml8DsNEhYwobHygpgo=", + "dev": true + }, + "supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dev": true, + "requires": { + "has-flag": "^3.0.0" + } + }, + "table": { + "version": "5.4.6", + "resolved": "https://registry.npmjs.org/table/-/table-5.4.6.tgz", + "integrity": "sha512-wmEc8m4fjnob4gt5riFRtTu/6+4rSe12TpAELNSqHMfF3IqnA+CH37USM6/YR3qRZv7e56kAEAtd6nKZaxe0Ug==", + "dev": true, + "requires": { + "ajv": "^6.10.2", + "lodash": "^4.17.14", + "slice-ansi": "^2.1.0", + "string-width": "^3.0.0" + }, + "dependencies": { + "ansi-regex": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", + "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==", + "dev": true + }, + "string-width": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz", + "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==", + "dev": true, + "requires": { + "emoji-regex": "^7.0.1", + "is-fullwidth-code-point": "^2.0.0", + "strip-ansi": "^5.1.0" + } + }, + "strip-ansi": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", + "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", + "dev": true, + "requires": { + "ansi-regex": "^4.1.0" + } + } + } + }, + "tapable": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/tapable/-/tapable-1.1.3.tgz", + "integrity": "sha512-4WK/bYZmj8xLr+HUCODHGF1ZFzsYffasLUgEiMBY4fgtltdO6B4WJtlSbPaDTLpYTcGVwM2qLnFTICEcNxs3kA==", + "dev": true + }, + "term-size": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/term-size/-/term-size-1.2.0.tgz", + "integrity": "sha1-RYuDiH8oj8Vtb/+/rSYuJmOO+mk=", + "dev": true, + "requires": { + "execa": "^0.7.0" + } + }, + "terser": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/terser/-/terser-4.3.1.tgz", + "integrity": "sha512-pnzH6dnFEsR2aa2SJaKb1uSCl3QmIsJ8dEkj0Fky+2AwMMcC9doMqLOQIH6wVTEKaVfKVvLSk5qxPBEZT9mywg==", + "dev": true, + "requires": { + "commander": "^2.20.0", + "source-map": "~0.6.1", + "source-map-support": "~0.5.12" + }, + "dependencies": { + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true + }, + "source-map-support": { + "version": "0.5.13", + "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.13.tgz", + "integrity": "sha512-SHSKFHadjVA5oR4PPqhtAVdcBWwRYVd6g6cAXnIbRiIwc2EhPrTuKUBdSLvlEKyIP3GCf89fltvcZiP9MMFA1w==", + "dev": true, + "requires": { + "buffer-from": "^1.0.0", + "source-map": "^0.6.0" + } + } + } + }, + "terser-webpack-plugin": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-1.4.1.tgz", + "integrity": "sha512-ZXmmfiwtCLfz8WKZyYUuuHf3dMYEjg8NrjHMb0JqHVHVOSkzp3cW2/XG1fP3tRhqEqSzMwzzRQGtAPbs4Cncxg==", + "dev": true, + "requires": { + "cacache": "^12.0.2", + "find-cache-dir": "^2.1.0", + "is-wsl": "^1.1.0", + "schema-utils": "^1.0.0", + "serialize-javascript": "^1.7.0", + "source-map": "^0.6.1", + "terser": "^4.1.2", + "webpack-sources": "^1.4.0", + "worker-farm": "^1.7.0" + }, + "dependencies": { + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true + } + } + }, + "text-table": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", + "integrity": "sha1-f17oI66AUgfACvLfSoTsP8+lcLQ=", + "dev": true + }, + "through": { + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz", + "integrity": "sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU=", + "dev": true + }, + "through2": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/through2/-/through2-2.0.5.tgz", + "integrity": "sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ==", + "dev": true, + "requires": { + "readable-stream": "~2.3.6", + "xtend": "~4.0.1" + } + }, + "thunky": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/thunky/-/thunky-1.0.3.tgz", + "integrity": "sha512-YwT8pjmNcAXBZqrubu22P4FYsh2D4dxRmnWBOL8Jk8bUcRUtc5326kx32tuTmFDAZtLOGEVNl8POAR8j896Iow==", + "dev": true + }, + "timed-out": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/timed-out/-/timed-out-4.0.1.tgz", + "integrity": "sha1-8y6srFoXW+ol1/q1Zas+2HQe9W8=", + "dev": true + }, + "timers-browserify": { + "version": "2.0.11", + "resolved": "https://registry.npmjs.org/timers-browserify/-/timers-browserify-2.0.11.tgz", + "integrity": "sha512-60aV6sgJ5YEbzUdn9c8kYGIqOubPoUdqQCul3SBAsRCZ40s6Y5cMcrW4dt3/k/EsbLVJNl9n6Vz3fTc+k2GeKQ==", + "dev": true, + "requires": { + "setimmediate": "^1.0.4" + } + }, + "tmp": { + "version": "0.0.33", + "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.0.33.tgz", + "integrity": "sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==", + "dev": true, + "requires": { + "os-tmpdir": "~1.0.2" + } + }, + "to-arraybuffer": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/to-arraybuffer/-/to-arraybuffer-1.0.1.tgz", + "integrity": "sha1-fSKbH8xjfkZsoIEYCDanqr/4P0M=", + "dev": true + }, + "to-fast-properties": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", + "integrity": "sha1-3F5pjL0HkmW8c+A3doGk5Og/YW4=", + "dev": true + }, + "to-object-path": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/to-object-path/-/to-object-path-0.3.0.tgz", + "integrity": "sha1-KXWIt7Dn4KwI4E5nL4XB9JmeF68=", + "dev": true, + "requires": { + "kind-of": "^3.0.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "to-regex": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/to-regex/-/to-regex-3.0.2.tgz", + "integrity": "sha512-FWtleNAtZ/Ki2qtqej2CXTOayOH9bHDQF+Q48VpWyDXjbYxA4Yz8iDB31zXOBUlOHHKidDbqGVrTUvQMPmBGBw==", + "dev": true, + "requires": { + "define-property": "^2.0.2", + "extend-shallow": "^3.0.2", + "regex-not": "^1.0.2", + "safe-regex": "^1.1.0" + } + }, + "to-regex-range": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-2.1.1.tgz", + "integrity": "sha1-fIDBe53+vlmeJzZ+DU3VWQFB2zg=", + "dev": true, + "requires": { + "is-number": "^3.0.0", + "repeat-string": "^1.6.1" + } + }, + "toidentifier": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.0.tgz", + "integrity": "sha512-yaOH/Pk/VEhBWWTlhI+qXxDFXlejDGcQipMlyxda9nthulaxLZUNcUqFxokp0vcYnvteJln5FNQDRrxj3YcbVw==", + "dev": true + }, + "touch": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/touch/-/touch-3.1.0.tgz", + "integrity": "sha512-WBx8Uy5TLtOSRtIq+M03/sKDrXCLHxwDcquSP2c43Le03/9serjQBIztjRz6FkJez9D/hleyAXTBGLwwZUw9lA==", + "dev": true, + "requires": { + "nopt": "~1.0.10" + } + }, + "trim-right": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/trim-right/-/trim-right-1.0.1.tgz", + "integrity": "sha1-yy4SAwZ+DI3h9hQJS5/kVwTqYAM=", + "dev": true + }, + "try-resolve": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/try-resolve/-/try-resolve-1.0.1.tgz", + "integrity": "sha1-z95vq9ctY+V5fPqrhzq76OcA6RI=", + "dev": true + }, + "tryor": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/tryor/-/tryor-0.1.2.tgz", + "integrity": "sha1-gUXkynyv9ArN48z5Rui4u3W0Fys=", + "dev": true + }, + "tslib": { + "version": "1.10.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.10.0.tgz", + "integrity": "sha512-qOebF53frne81cf0S9B41ByenJ3/IuH8yJKngAX35CmiZySA0khhkovshKK+jGCaMnVomla7gVlIcc3EvKPbTQ==", + "dev": true + }, + "tty-browserify": { + "version": "0.0.0", + "resolved": "https://registry.npmjs.org/tty-browserify/-/tty-browserify-0.0.0.tgz", + "integrity": "sha1-oVe6QC2iTpv5V/mqadUk7tQpAaY=", + "dev": true + }, + "type": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/type/-/type-1.0.3.tgz", + "integrity": "sha512-51IMtNfVcee8+9GJvj0spSuFcZHe9vSib6Xtgsny1Km9ugyz2mbS08I3rsUIRYgJohFRFU1160sgRodYz378Hg==", + "dev": true + }, + "type-check": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.3.2.tgz", + "integrity": "sha1-WITKtRLPHTVeP7eE8wgEsrUg23I=", + "dev": true, + "requires": { + "prelude-ls": "~1.1.2" + } + }, + "type-is": { + "version": "1.6.18", + "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz", + "integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==", + "dev": true, + "requires": { + "media-typer": "0.3.0", + "mime-types": "~2.1.24" + } + }, + "typedarray": { + "version": "0.0.6", + "resolved": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz", + "integrity": "sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c=", + "dev": true + }, + "undefsafe": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/undefsafe/-/undefsafe-2.0.2.tgz", + "integrity": "sha1-Il9rngM3Zj4Njnz9aG/Cg2zKznY=", + "dev": true, + "requires": { + "debug": "^2.2.0" + } + }, + "unicode-canonical-property-names-ecmascript": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/unicode-canonical-property-names-ecmascript/-/unicode-canonical-property-names-ecmascript-1.0.4.tgz", + "integrity": "sha512-jDrNnXWHd4oHiTZnx/ZG7gtUTVp+gCcTTKr8L0HjlwphROEW3+Him+IpvC+xcJEFegapiMZyZe02CyuOnRmbnQ==", + "dev": true + }, + "unicode-match-property-ecmascript": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/unicode-match-property-ecmascript/-/unicode-match-property-ecmascript-1.0.4.tgz", + "integrity": "sha512-L4Qoh15vTfntsn4P1zqnHulG0LdXgjSO035fEpdtp6YxXhMT51Q6vgM5lYdG/5X3MjS+k/Y9Xw4SFCY9IkR0rg==", + "dev": true, + "requires": { + "unicode-canonical-property-names-ecmascript": "^1.0.4", + "unicode-property-aliases-ecmascript": "^1.0.4" + } + }, + "unicode-match-property-value-ecmascript": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/unicode-match-property-value-ecmascript/-/unicode-match-property-value-ecmascript-1.1.0.tgz", + "integrity": "sha512-hDTHvaBk3RmFzvSl0UVrUmC3PuW9wKVnpoUDYH0JDkSIovzw+J5viQmeYHxVSBptubnr7PbH2e0fnpDRQnQl5g==", + "dev": true + }, + "unicode-property-aliases-ecmascript": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/unicode-property-aliases-ecmascript/-/unicode-property-aliases-ecmascript-1.0.5.tgz", + "integrity": "sha512-L5RAqCfXqAwR3RriF8pM0lU0w4Ryf/GgzONwi6KnL1taJQa7x1TCxdJnILX59WIGOwR57IVxn7Nej0fz1Ny6fw==", + "dev": true + }, + "union-value": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/union-value/-/union-value-1.0.1.tgz", + "integrity": "sha512-tJfXmxMeWYnczCVs7XAEvIV7ieppALdyepWMkHkwciRpZraG/xwT+s2JN8+pr1+8jCRf80FFzvr+MpQeeoF4Xg==", + "dev": true, + "requires": { + "arr-union": "^3.1.0", + "get-value": "^2.0.6", + "is-extendable": "^0.1.1", + "set-value": "^2.0.1" + } + }, + "unique-filename": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/unique-filename/-/unique-filename-1.1.1.tgz", + "integrity": "sha512-Vmp0jIp2ln35UTXuryvjzkjGdRyf9b2lTXuSYUiPmzRcl3FDtYqAwOnTJkAngD9SWhnoJzDbTKwaOrZ+STtxNQ==", + "dev": true, + "requires": { + "unique-slug": "^2.0.0" + } + }, + "unique-slug": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/unique-slug/-/unique-slug-2.0.2.tgz", + "integrity": "sha512-zoWr9ObaxALD3DOPfjPSqxt4fnZiWblxHIgeWqW8x7UqDzEtHEQLzji2cuJYQFCU6KmoJikOYAZlrTHHebjx2w==", + "dev": true, + "requires": { + "imurmurhash": "^0.1.4" + } + }, + "unique-string": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/unique-string/-/unique-string-1.0.0.tgz", + "integrity": "sha1-nhBXzKhRq7kzmPizOuGHuZyuwRo=", + "dev": true, + "requires": { + "crypto-random-string": "^1.0.0" + } + }, + "unpipe": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", + "integrity": "sha1-sr9O6FFKrmFltIF4KdIbLvSZBOw=", + "dev": true + }, + "unset-value": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/unset-value/-/unset-value-1.0.0.tgz", + "integrity": "sha1-g3aHP30jNRef+x5vw6jtDfyKtVk=", + "dev": true, + "requires": { + "has-value": "^0.3.1", + "isobject": "^3.0.0" + }, + "dependencies": { + "has-value": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/has-value/-/has-value-0.3.1.tgz", + "integrity": "sha1-ex9YutpiyoJ+wKIHgCVlSEWZXh8=", + "dev": true, + "requires": { + "get-value": "^2.0.3", + "has-values": "^0.1.4", + "isobject": "^2.0.0" + }, + "dependencies": { + "isobject": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-2.1.0.tgz", + "integrity": "sha1-8GVWEJaj8dou9GJy+BXIQNh+DIk=", + "dev": true, + "requires": { + "isarray": "1.0.0" + } + } + } + }, + "has-values": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/has-values/-/has-values-0.1.4.tgz", + "integrity": "sha1-bWHeldkd/Km5oCCJrThL/49it3E=", + "dev": true + } + } + }, + "unzip-response": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/unzip-response/-/unzip-response-2.0.1.tgz", + "integrity": "sha1-0vD3N9FrBhXnKmk17QQhRXLVb5c=", + "dev": true + }, + "upath": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/upath/-/upath-1.2.0.tgz", + "integrity": "sha512-aZwGpamFO61g3OlfT7OQCHqhGnW43ieH9WZeP7QxN/G/jS4jfqUkZxoryvJgVPEcrl5NL/ggHsSmLMHuH64Lhg==", + "dev": true + }, + "update-notifier": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/update-notifier/-/update-notifier-2.5.0.tgz", + "integrity": "sha512-gwMdhgJHGuj/+wHJJs9e6PcCszpxR1b236igrOkUofGhqJuG+amlIKwApH1IW1WWl7ovZxsX49lMBWLxSdm5Dw==", + "dev": true, + "requires": { + "boxen": "^1.2.1", + "chalk": "^2.0.1", + "configstore": "^3.0.0", + "import-lazy": "^2.1.0", + "is-ci": "^1.0.10", + "is-installed-globally": "^0.1.0", + "is-npm": "^1.0.0", + "latest-version": "^3.0.0", + "semver-diff": "^2.0.0", + "xdg-basedir": "^3.0.0" + } + }, + "uri-js": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.2.2.tgz", + "integrity": "sha512-KY9Frmirql91X2Qgjry0Wd4Y+YTdrdZheS8TFwvkbLWf/G5KNJDCh6pKL5OZctEW4+0Baa5idK2ZQuELRwPznQ==", + "dev": true, + "requires": { + "punycode": "^2.1.0" + } + }, + "urix": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/urix/-/urix-0.1.0.tgz", + "integrity": "sha1-2pN/emLiH+wf0Y1Js1wpNQZ6bHI=", + "dev": true + }, + "url": { + "version": "0.11.0", + "resolved": "https://registry.npmjs.org/url/-/url-0.11.0.tgz", + "integrity": "sha1-ODjpfPxgUh63PFJajlW/3Z4uKPE=", + "dev": true, + "requires": { + "punycode": "1.3.2", + "querystring": "0.2.0" + }, + "dependencies": { + "punycode": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.3.2.tgz", + "integrity": "sha1-llOgNvt8HuQjQvIyXM7v6jkmxI0=", + "dev": true + } + } + }, + "url-parse": { + "version": "1.4.7", + "resolved": "https://registry.npmjs.org/url-parse/-/url-parse-1.4.7.tgz", + "integrity": "sha512-d3uaVyzDB9tQoSXFvuSUNFibTd9zxd2bkVrDRvF5TmvWWQwqE4lgYJ5m+x1DbecWkw+LK4RNl2CU1hHuOKPVlg==", + "dev": true, + "requires": { + "querystringify": "^2.1.1", + "requires-port": "^1.0.0" + } + }, + "url-parse-lax": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/url-parse-lax/-/url-parse-lax-1.0.0.tgz", + "integrity": "sha1-evjzA2Rem9eaJy56FKxovAYJ2nM=", + "dev": true, + "requires": { + "prepend-http": "^1.0.1" + } + }, + "use": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/use/-/use-3.1.1.tgz", + "integrity": "sha512-cwESVXlO3url9YWlFW/TA9cshCEhtu7IKJ/p5soJ/gGpj7vbvFrAY/eIioQ6Dw23KjZhYgiIo8HOs1nQ2vr/oQ==", + "dev": true + }, + "user-home": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/user-home/-/user-home-1.1.1.tgz", + "integrity": "sha1-K1viOjK2Onyd640PKNSFcko98ZA=", + "dev": true + }, + "util": { + "version": "0.11.1", + "resolved": "https://registry.npmjs.org/util/-/util-0.11.1.tgz", + "integrity": "sha512-HShAsny+zS2TZfaXxD9tYj4HQGlBezXZMZuM/S5PKLLoZkShZiGk9o5CzukI1LVHZvjdvZ2Sj1aW/Ndn2NB/HQ==", + "dev": true, + "requires": { + "inherits": "2.0.3" + }, + "dependencies": { + "inherits": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", + "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=", + "dev": true + } + } + }, + "util-deprecate": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=" + }, + "utils-merge": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz", + "integrity": "sha1-n5VxD1CiZ5R7LMwSR0HBAoQn5xM=", + "dev": true + }, + "uuid": { + "version": "3.3.3", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.3.3.tgz", + "integrity": "sha512-pW0No1RGHgzlpHJO1nsVrHKpOEIxkGg1xB+v0ZmdNH5OAeAwzAVrCnI2/6Mtx+Uys6iaylxa+D3g4j63IKKjSQ==", + "dev": true + }, + "v8-compile-cache": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/v8-compile-cache/-/v8-compile-cache-2.0.3.tgz", + "integrity": "sha512-CNmdbwQMBjwr9Gsmohvm0pbL954tJrNzf6gWL3K+QMQf00PF7ERGrEiLgjuU3mKreLC2MeGhUsNV9ybTbLgd3w==", + "dev": true + }, + "validate-npm-package-license": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz", + "integrity": "sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==", + "dev": true, + "requires": { + "spdx-correct": "^3.0.0", + "spdx-expression-parse": "^3.0.0" + } + }, + "vary": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", + "integrity": "sha1-IpnwLG3tMNSllhsLn3RSShj2NPw=", + "dev": true + }, + "vm-browserify": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/vm-browserify/-/vm-browserify-1.1.0.tgz", + "integrity": "sha512-iq+S7vZJE60yejDYM0ek6zg308+UZsdtPExWP9VZoCFCz1zkJoXFnAX7aZfd/ZwrkidzdUZL0C/ryW+JwAiIGw==", + "dev": true + }, + "watchpack": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-1.6.0.tgz", + "integrity": "sha512-i6dHe3EyLjMmDlU1/bGQpEw25XSjkJULPuAVKCbNRefQVq48yXKUpwg538F7AZTf9kyr57zj++pQFltUa5H7yA==", + "dev": true, + "requires": { + "chokidar": "^2.0.2", + "graceful-fs": "^4.1.2", + "neo-async": "^2.5.0" + } + }, + "wbuf": { + "version": "1.7.3", + "resolved": "https://registry.npmjs.org/wbuf/-/wbuf-1.7.3.tgz", + "integrity": "sha512-O84QOnr0icsbFGLS0O3bI5FswxzRr8/gHwWkDlQFskhSPryQXvrTMxjxGP4+iWYoauLoBvfDpkrOauZ+0iZpDA==", + "dev": true, + "requires": { + "minimalistic-assert": "^1.0.0" + } + }, + "webpack": { + "version": "4.39.3", + "resolved": "https://registry.npmjs.org/webpack/-/webpack-4.39.3.tgz", + "integrity": "sha512-BXSI9M211JyCVc3JxHWDpze85CvjC842EvpRsVTc/d15YJGlox7GIDd38kJgWrb3ZluyvIjgenbLDMBQPDcxYQ==", + "dev": true, + "requires": { + "@webassemblyjs/ast": "1.8.5", + "@webassemblyjs/helper-module-context": "1.8.5", + "@webassemblyjs/wasm-edit": "1.8.5", + "@webassemblyjs/wasm-parser": "1.8.5", + "acorn": "^6.2.1", + "ajv": "^6.10.2", + "ajv-keywords": "^3.4.1", + "chrome-trace-event": "^1.0.2", + "enhanced-resolve": "^4.1.0", + "eslint-scope": "^4.0.3", + "json-parse-better-errors": "^1.0.2", + "loader-runner": "^2.4.0", + "loader-utils": "^1.2.3", + "memory-fs": "^0.4.1", + "micromatch": "^3.1.10", + "mkdirp": "^0.5.1", + "neo-async": "^2.6.1", + "node-libs-browser": "^2.2.1", + "schema-utils": "^1.0.0", + "tapable": "^1.1.3", + "terser-webpack-plugin": "^1.4.1", + "watchpack": "^1.6.0", + "webpack-sources": "^1.4.1" + }, + "dependencies": { + "acorn": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-6.3.0.tgz", + "integrity": "sha512-/czfa8BwS88b9gWQVhc8eknunSA2DoJpJyTQkhheIf5E48u1N0R4q/YxxsAeqRrmK9TQ/uYfgLDfZo91UlANIA==", + "dev": true + } + } + }, + "webpack-cli": { + "version": "3.3.8", + "resolved": "https://registry.npmjs.org/webpack-cli/-/webpack-cli-3.3.8.tgz", + "integrity": "sha512-RANYSXwikSWINjHMd/mtesblNSpjpDLoYTBtP99n1RhXqVI/wxN40Auqy42I7y4xrbmRBoA5Zy5E0JSBD5XRhw==", + "dev": true, + "requires": { + "chalk": "2.4.2", + "cross-spawn": "6.0.5", + "enhanced-resolve": "4.1.0", + "findup-sync": "3.0.0", + "global-modules": "2.0.0", + "import-local": "2.0.0", + "interpret": "1.2.0", + "loader-utils": "1.2.3", + "supports-color": "6.1.0", + "v8-compile-cache": "2.0.3", + "yargs": "13.2.4" + }, + "dependencies": { + "ansi-regex": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", + "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==", + "dev": true + }, + "cliui": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-5.0.0.tgz", + "integrity": "sha512-PYeGSEmmHM6zvoef2w8TPzlrnNpXIjTipYK780YswmIP9vjxmd6Y2a3CB2Ks6/AU8NHjZugXvo8w3oWM2qnwXA==", + "dev": true, + "requires": { + "string-width": "^3.1.0", + "strip-ansi": "^5.2.0", + "wrap-ansi": "^5.1.0" + } + }, + "cross-spawn": { + "version": "6.0.5", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-6.0.5.tgz", + "integrity": "sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ==", + "dev": true, + "requires": { + "nice-try": "^1.0.4", + "path-key": "^2.0.1", + "semver": "^5.5.0", + "shebang-command": "^1.2.0", + "which": "^1.2.9" + } + }, + "execa": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/execa/-/execa-1.0.0.tgz", + "integrity": "sha512-adbxcyWV46qiHyvSp50TKt05tB4tK3HcmF7/nxfAdhnox83seTDbwnaqKO4sXRy7roHAIFqJP/Rw/AuEbX61LA==", + "dev": true, + "requires": { + "cross-spawn": "^6.0.0", + "get-stream": "^4.0.0", + "is-stream": "^1.1.0", + "npm-run-path": "^2.0.0", + "p-finally": "^1.0.0", + "signal-exit": "^3.0.0", + "strip-eof": "^1.0.0" + } + }, + "get-stream": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-4.1.0.tgz", + "integrity": "sha512-GMat4EJ5161kIy2HevLlr4luNjBgvmj413KaQA7jt4V8B4RDsfpHk7WQ9GVqfYyyx8OS/L66Kox+rJRNklLK7w==", + "dev": true, + "requires": { + "pump": "^3.0.0" + } + }, + "invert-kv": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/invert-kv/-/invert-kv-2.0.0.tgz", + "integrity": "sha512-wPVv/y/QQ/Uiirj/vh3oP+1Ww+AWehmi1g5fFWGPF6IpCBCDVrhgHRMvrLfdYcwDh3QJbGXDW4JAuzxElLSqKA==", + "dev": true + }, + "lcid": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/lcid/-/lcid-2.0.0.tgz", + "integrity": "sha512-avPEb8P8EGnwXKClwsNUgryVjllcRqtMYa49NTsbQagYuT1DcXnl1915oxWjoyGrXR6zH/Y0Zc96xWsPcoDKeA==", + "dev": true, + "requires": { + "invert-kv": "^2.0.0" + } + }, + "os-locale": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/os-locale/-/os-locale-3.1.0.tgz", + "integrity": "sha512-Z8l3R4wYWM40/52Z+S265okfFj8Kt2cC2MKY+xNi3kFs+XGI7WXu/I309QQQYbRW4ijiZ+yxs9pqEhJh0DqW3Q==", + "dev": true, + "requires": { + "execa": "^1.0.0", + "lcid": "^2.0.0", + "mem": "^4.0.0" + } + }, + "string-width": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz", + "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==", + "dev": true, + "requires": { + "emoji-regex": "^7.0.1", + "is-fullwidth-code-point": "^2.0.0", + "strip-ansi": "^5.1.0" + } + }, + "strip-ansi": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", + "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", + "dev": true, + "requires": { + "ansi-regex": "^4.1.0" + } + }, + "supports-color": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", + "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", + "dev": true, + "requires": { + "has-flag": "^3.0.0" + } + }, + "y18n": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-4.0.0.tgz", + "integrity": "sha512-r9S/ZyXu/Xu9q1tYlpsLIsa3EeLXXk0VwlxqTcFRfg9EhMW+17kbt9G0NrgCmhGb5vT2hyhJZLfDGx+7+5Uj/w==", + "dev": true + }, + "yargs": { + "version": "13.2.4", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-13.2.4.tgz", + "integrity": "sha512-HG/DWAJa1PAnHT9JAhNa8AbAv3FPaiLzioSjCcmuXXhP8MlpHO5vwls4g4j6n30Z74GVQj8Xa62dWVx1QCGklg==", + "dev": true, + "requires": { + "cliui": "^5.0.0", + "find-up": "^3.0.0", + "get-caller-file": "^2.0.1", + "os-locale": "^3.1.0", + "require-directory": "^2.1.1", + "require-main-filename": "^2.0.0", + "set-blocking": "^2.0.0", + "string-width": "^3.0.0", + "which-module": "^2.0.0", + "y18n": "^4.0.0", + "yargs-parser": "^13.1.0" + } + } + } + }, + "webpack-dev-middleware": { + "version": "3.7.1", + "resolved": "https://registry.npmjs.org/webpack-dev-middleware/-/webpack-dev-middleware-3.7.1.tgz", + "integrity": "sha512-5MWu9SH1z3hY7oHOV6Kbkz5x7hXbxK56mGHNqHTe6d+ewxOwKUxoUJBs7QIaJb33lPjl9bJZ3X0vCoooUzC36A==", + "dev": true, + "requires": { + "memory-fs": "^0.4.1", + "mime": "^2.4.4", + "mkdirp": "^0.5.1", + "range-parser": "^1.2.1", + "webpack-log": "^2.0.0" + }, + "dependencies": { + "mime": { + "version": "2.4.4", + "resolved": "https://registry.npmjs.org/mime/-/mime-2.4.4.tgz", + "integrity": "sha512-LRxmNwziLPT828z+4YkNzloCFC2YM4wrB99k+AV5ZbEyfGNWfG8SO1FUXLmLDBSo89NrJZ4DIWeLjy1CHGhMGA==", + "dev": true + } + } + }, + "webpack-dev-server": { + "version": "3.8.0", + "resolved": "https://registry.npmjs.org/webpack-dev-server/-/webpack-dev-server-3.8.0.tgz", + "integrity": "sha512-Hs8K9yI6pyMvGkaPTeTonhD6JXVsigXDApYk9JLW4M7viVBspQvb1WdAcWxqtmttxNW4zf2UFLsLNe0y87pIGQ==", + "dev": true, + "requires": { + "ansi-html": "0.0.7", + "bonjour": "^3.5.0", + "chokidar": "^2.1.6", + "compression": "^1.7.4", + "connect-history-api-fallback": "^1.6.0", + "debug": "^4.1.1", + "del": "^4.1.1", + "express": "^4.17.1", + "html-entities": "^1.2.1", + "http-proxy-middleware": "^0.19.1", + "import-local": "^2.0.0", + "internal-ip": "^4.3.0", + "ip": "^1.1.5", + "is-absolute-url": "^3.0.0", + "killable": "^1.0.1", + "loglevel": "^1.6.3", + "opn": "^5.5.0", + "p-retry": "^3.0.1", + "portfinder": "^1.0.21", + "schema-utils": "^1.0.0", + "selfsigned": "^1.10.4", + "semver": "^6.3.0", + "serve-index": "^1.9.1", + "sockjs": "0.3.19", + "sockjs-client": "1.3.0", + "spdy": "^4.0.1", + "strip-ansi": "^3.0.1", + "supports-color": "^6.1.0", + "url": "^0.11.0", + "webpack-dev-middleware": "^3.7.0", + "webpack-log": "^2.0.0", + "ws": "^6.2.1", + "yargs": "12.0.5" + }, + "dependencies": { + "ansi-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", + "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=", + "dev": true + }, + "camelcase": { + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", + "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", + "dev": true + }, + "cliui": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-4.1.0.tgz", + "integrity": "sha512-4FG+RSG9DL7uEwRUZXZn3SS34DiDPfzP0VOiEwtUWlE+AR2EIg+hSyvrIgUUfhdgR/UkAeW2QHgeP+hWrXs7jQ==", + "dev": true, + "requires": { + "string-width": "^2.1.1", + "strip-ansi": "^4.0.0", + "wrap-ansi": "^2.0.0" + }, + "dependencies": { + "strip-ansi": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", + "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", + "dev": true, + "requires": { + "ansi-regex": "^3.0.0" + } + } + } + }, + "cross-spawn": { + "version": "6.0.5", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-6.0.5.tgz", + "integrity": "sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ==", + "dev": true, + "requires": { + "nice-try": "^1.0.4", + "path-key": "^2.0.1", + "semver": "^5.5.0", + "shebang-command": "^1.2.0", + "which": "^1.2.9" + }, + "dependencies": { + "semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", + "dev": true + } + } + }, + "debug": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", + "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", + "dev": true, + "requires": { + "ms": "^2.1.1" + } + }, + "execa": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/execa/-/execa-1.0.0.tgz", + "integrity": "sha512-adbxcyWV46qiHyvSp50TKt05tB4tK3HcmF7/nxfAdhnox83seTDbwnaqKO4sXRy7roHAIFqJP/Rw/AuEbX61LA==", + "dev": true, + "requires": { + "cross-spawn": "^6.0.0", + "get-stream": "^4.0.0", + "is-stream": "^1.1.0", + "npm-run-path": "^2.0.0", + "p-finally": "^1.0.0", + "signal-exit": "^3.0.0", + "strip-eof": "^1.0.0" + } + }, + "get-caller-file": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-1.0.3.tgz", + "integrity": "sha512-3t6rVToeoZfYSGd8YoLFR2DJkiQrIiUrGcjvFX2mDw3bn6k2OtwHN0TNCLbBO+w8qTvimhDkv+LSscbJY1vE6w==", + "dev": true + }, + "get-stream": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-4.1.0.tgz", + "integrity": "sha512-GMat4EJ5161kIy2HevLlr4luNjBgvmj413KaQA7jt4V8B4RDsfpHk7WQ9GVqfYyyx8OS/L66Kox+rJRNklLK7w==", + "dev": true, + "requires": { + "pump": "^3.0.0" + } + }, + "invert-kv": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/invert-kv/-/invert-kv-2.0.0.tgz", + "integrity": "sha512-wPVv/y/QQ/Uiirj/vh3oP+1Ww+AWehmi1g5fFWGPF6IpCBCDVrhgHRMvrLfdYcwDh3QJbGXDW4JAuzxElLSqKA==", + "dev": true + }, + "is-fullwidth-code-point": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz", + "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=", + "dev": true, + "requires": { + "number-is-nan": "^1.0.0" + } + }, + "lcid": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/lcid/-/lcid-2.0.0.tgz", + "integrity": "sha512-avPEb8P8EGnwXKClwsNUgryVjllcRqtMYa49NTsbQagYuT1DcXnl1915oxWjoyGrXR6zH/Y0Zc96xWsPcoDKeA==", + "dev": true, + "requires": { + "invert-kv": "^2.0.0" + } + }, + "ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "dev": true + }, + "os-locale": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/os-locale/-/os-locale-3.1.0.tgz", + "integrity": "sha512-Z8l3R4wYWM40/52Z+S265okfFj8Kt2cC2MKY+xNi3kFs+XGI7WXu/I309QQQYbRW4ijiZ+yxs9pqEhJh0DqW3Q==", + "dev": true, + "requires": { + "execa": "^1.0.0", + "lcid": "^2.0.0", + "mem": "^4.0.0" + } + }, + "require-main-filename": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-1.0.1.tgz", + "integrity": "sha1-l/cXtp1IeE9fUmpsWqj/3aBVpNE=", + "dev": true + }, + "semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "dev": true + }, + "supports-color": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", + "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", + "dev": true, + "requires": { + "has-flag": "^3.0.0" + } + }, + "wrap-ansi": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-2.1.0.tgz", + "integrity": "sha1-2Pw9KE3QV5T+hJc8rs3Rz4JP3YU=", + "dev": true, + "requires": { + "string-width": "^1.0.1", + "strip-ansi": "^3.0.1" + }, + "dependencies": { + "string-width": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", + "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=", + "dev": true, + "requires": { + "code-point-at": "^1.0.0", + "is-fullwidth-code-point": "^1.0.0", + "strip-ansi": "^3.0.0" + } + } + } + }, + "yargs": { + "version": "12.0.5", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-12.0.5.tgz", + "integrity": "sha512-Lhz8TLaYnxq/2ObqHDql8dX8CJi97oHxrjUcYtzKbbykPtVW9WB+poxI+NM2UIzsMgNCZTIf0AQwsjK5yMAqZw==", + "dev": true, + "requires": { + "cliui": "^4.0.0", + "decamelize": "^1.2.0", + "find-up": "^3.0.0", + "get-caller-file": "^1.0.1", + "os-locale": "^3.0.0", + "require-directory": "^2.1.1", + "require-main-filename": "^1.0.1", + "set-blocking": "^2.0.0", + "string-width": "^2.0.0", + "which-module": "^2.0.0", + "y18n": "^3.2.1 || ^4.0.0", + "yargs-parser": "^11.1.1" + } + }, + "yargs-parser": { + "version": "11.1.1", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-11.1.1.tgz", + "integrity": "sha512-C6kB/WJDiaxONLJQnF8ccx9SEeoTTLek8RVbaOIsrAUS8VrBEXfmeSnCZxygc+XC2sNMBIwOOnfcxiynjHsVSQ==", + "dev": true, + "requires": { + "camelcase": "^5.0.0", + "decamelize": "^1.2.0" + } + } + } + }, + "webpack-log": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/webpack-log/-/webpack-log-2.0.0.tgz", + "integrity": "sha512-cX8G2vR/85UYG59FgkoMamwHUIkSSlV3bBMRsbxVXVUk2j6NleCKjQ/WE9eYg9WY4w25O9w8wKP4rzNZFmUcUg==", + "dev": true, + "requires": { + "ansi-colors": "^3.0.0", + "uuid": "^3.3.2" + } + }, + "webpack-sources": { + "version": "1.4.3", + "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-1.4.3.tgz", + "integrity": "sha512-lgTS3Xhv1lCOKo7SA5TjKXMjpSM4sBjNV5+q2bqesbSPs5FjGmU6jjtBSkX9b4qW87vDIsCIlUPOEhbZrMdjeQ==", + "dev": true, + "requires": { + "source-list-map": "^2.0.0", + "source-map": "~0.6.1" + }, + "dependencies": { + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true + } + } + }, + "websocket-driver": { + "version": "0.7.3", + "resolved": "https://registry.npmjs.org/websocket-driver/-/websocket-driver-0.7.3.tgz", + "integrity": "sha512-bpxWlvbbB459Mlipc5GBzzZwhoZgGEZLuqPaR0INBGnPAY1vdBX6hPnoFXiw+3yWxDuHyQjO2oXTMyS8A5haFg==", + "dev": true, + "requires": { + "http-parser-js": ">=0.4.0 <0.4.11", + "safe-buffer": ">=5.1.0", + "websocket-extensions": ">=0.1.1" + } + }, + "websocket-extensions": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/websocket-extensions/-/websocket-extensions-0.1.3.tgz", + "integrity": "sha512-nqHUnMXmBzT0w570r2JpJxfiSD1IzoI+HGVdd3aZ0yNi3ngvQ4jv1dtHt5VGxfI2yj5yqImPhOK4vmIh2xMbGg==", + "dev": true + }, + "which": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", + "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", + "dev": true, + "requires": { + "isexe": "^2.0.0" + } + }, + "which-module": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/which-module/-/which-module-2.0.0.tgz", + "integrity": "sha1-2e8H3Od7mQK4o6j6SzHD4/fm6Ho=", + "dev": true + }, + "widest-line": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/widest-line/-/widest-line-2.0.1.tgz", + "integrity": "sha512-Ba5m9/Fa4Xt9eb2ELXt77JxVDV8w7qQrH0zS/TWSJdLyAwQjWoOzpzj5lwVftDz6n/EOu3tNACS84v509qwnJA==", + "dev": true, + "requires": { + "string-width": "^2.1.1" + } + }, + "window-size": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/window-size/-/window-size-0.1.4.tgz", + "integrity": "sha1-+OGqHuWlPsW/FR/6CXQqatdpeHY=", + "dev": true + }, + "wordwrap": { + "version": "0.0.2", + "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-0.0.2.tgz", + "integrity": "sha1-t5Zpu0LstAn4PVg8rVLKF+qhZD8=", + "dev": true + }, + "worker-farm": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/worker-farm/-/worker-farm-1.7.0.tgz", + "integrity": "sha512-rvw3QTZc8lAxyVrqcSGVm5yP/IJ2UcB3U0graE3LCFoZ0Yn2x4EoVSqJKdB/T5M+FLcRPjz4TDacRf3OCfNUzw==", + "dev": true, + "requires": { + "errno": "~0.1.7" + } + }, + "wrap-ansi": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-5.1.0.tgz", + "integrity": "sha512-QC1/iN/2/RPVJ5jYK8BGttj5z83LmSKmvbvrXPNCLZSEb32KKVDJDl/MOt2N01qU2H/FkzEa9PKto1BqDjtd7Q==", + "dev": true, + "requires": { + "ansi-styles": "^3.2.0", + "string-width": "^3.0.0", + "strip-ansi": "^5.0.0" + }, + "dependencies": { + "ansi-regex": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", + "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==", + "dev": true + }, + "string-width": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz", + "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==", + "dev": true, + "requires": { + "emoji-regex": "^7.0.1", + "is-fullwidth-code-point": "^2.0.0", + "strip-ansi": "^5.1.0" + } + }, + "strip-ansi": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", + "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", + "dev": true, + "requires": { + "ansi-regex": "^4.1.0" + } + } + } + }, + "wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=", + "dev": true + }, + "write": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/write/-/write-1.0.3.tgz", + "integrity": "sha512-/lg70HAjtkUgWPVZhZcm+T4hkL8Zbtp1nFNOn3lRrxnlv50SRBv7cR7RqR+GMsd3hUXy9hWBo4CHTbFTcOYwig==", + "dev": true, + "requires": { + "mkdirp": "^0.5.1" + } + }, + "write-file-atomic": { + "version": "2.4.3", + "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-2.4.3.tgz", + "integrity": "sha512-GaETH5wwsX+GcnzhPgKcKjJ6M2Cq3/iZp1WyY/X1CSqrW+jVNM9Y7D8EC2sM4ZG/V8wZlSniJnCKWPmBYAucRQ==", + "dev": true, + "requires": { + "graceful-fs": "^4.1.11", + "imurmurhash": "^0.1.4", + "signal-exit": "^3.0.2" + } + }, + "ws": { + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/ws/-/ws-6.2.1.tgz", + "integrity": "sha512-GIyAXC2cB7LjvpgMt9EKS2ldqr0MTrORaleiOno6TweZ6r3TKtoFQWay/2PceJ3RuBasOHzXNn5Lrw1X0bEjqA==", + "dev": true, + "requires": { + "async-limiter": "~1.0.0" + } + }, + "xdg-basedir": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/xdg-basedir/-/xdg-basedir-3.0.0.tgz", + "integrity": "sha1-SWsswQnsqNus/i3HK2A8F8WHCtQ=", + "dev": true + }, + "xtend": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz", + "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==", + "dev": true + }, + "y18n": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-3.2.1.tgz", + "integrity": "sha1-bRX7qITAhnnA136I53WegR4H+kE=", + "dev": true + }, + "yallist": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-2.1.2.tgz", + "integrity": "sha1-HBH5IY8HYImkfdUS+TxmmaaoHVI=", + "dev": true + }, + "yargs": { + "version": "3.27.0", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-3.27.0.tgz", + "integrity": "sha1-ISBUaTFuk5Ex1Z8toMbX+YIh6kA=", + "dev": true, + "requires": { + "camelcase": "^1.2.1", + "cliui": "^2.1.0", + "decamelize": "^1.0.0", + "os-locale": "^1.4.0", + "window-size": "^0.1.2", + "y18n": "^3.2.0" + } + }, + "yargs-parser": { + "version": "13.1.1", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-13.1.1.tgz", + "integrity": "sha512-oVAVsHz6uFrg3XQheFII8ESO2ssAf9luWuAd6Wexsu4F3OtIW0o8IribPXYrD4WC24LWtPrJlGy87y5udK+dxQ==", + "dev": true, + "requires": { + "camelcase": "^5.0.0", + "decamelize": "^1.2.0" + }, + "dependencies": { + "camelcase": { + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", + "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", + "dev": true + } + } + } + } +} diff --git a/cvat-data/package.json b/cvat-data/package.json new file mode 100644 index 000000000000..8f84e8a45d16 --- /dev/null +++ b/cvat-data/package.json @@ -0,0 +1,37 @@ +{ + "name": "cvat-data", + "version": "0.1.0", + "description": "", + "main": "src/js/cvat-data.js", + "devDependencies": { + "@babel/cli": "^7.4.4", + "@babel/core": "^7.4.4", + "@babel/preset-env": "^7.4.4", + "babel": "^5.8.23", + "babel-core": "^6.26.3", + "babel-loader": "^8.0.6", + "core-js": "^3.2.1", + "eslint": "^6.4.0", + "eslint-config-airbnb-base": "^14.0.0", + "eslint-plugin-import": "^2.18.2", + "eslint-plugin-no-unsafe-innerhtml": "^1.0.16", + "eslint-plugin-no-unsanitized": "^3.0.2", + "eslint-plugin-security": "^1.4.0", + "nodemon": "^1.19.2", + "webpack": "^4.39.3", + "webpack-cli": "^3.3.7", + "webpack-dev-server": "^3.8.0" + }, + "dependencies": { + "jszip": "3.1.5", + "jpeg-js": "0.3.6", + "js-base64": "2.5.1" + }, + "scripts": { + "patch": "cd src/js && patch --dry-run --forward -p0 < 3rdparty_patch.diff >> /dev/null && patch -p0 < 3rdparty_patch.diff; true", + "build": "npm run patch; webpack --config ./webpack.config.js", + "server": "npm run patch; nodemon --watch config --exec 'webpack-dev-server --config ./webpack.config.js --mode=development --open'" + }, + "author": "Intel", + "license": "MIT" +} diff --git a/cvat-data/src/js/3rdparty/README.md b/cvat-data/src/js/3rdparty/README.md new file mode 100644 index 000000000000..88568b8c3a77 --- /dev/null +++ b/cvat-data/src/js/3rdparty/README.md @@ -0,0 +1,42 @@ +## 3rdparty components + +These files are from the [JSMpeg](https://github.com/phoboslab/jsmpeg) repository: +- buffer.js +- decoder.js +- jsmpeg.js +- mpeg1.js +- ts.js + +### Why do we store them here? + +Authors don't provide an npm package, so we need to store these components in our repository. +We use this dependency to decode video chunks from a server and split them to frames on client side. + +We need to run this package in node environent (for example for debug, or for running unit tests). +But there aren't any ways to do that (even with syntetic environment, provided for example by the package ``browser-env``). +For example there are issues with canvas using (webpack doesn't work with binary canvas package for node-js) and others. +So, we have solved to write patch file for this library. +It modifies source code a little to support our scenario of using. + +### How work with a patch file +```bash + # from cvat-data/src/js + cp -r 3rdparty 3rdparty_edited + # change 3rdparty edited as we need + diff -u 3rdparty 3rdparty_edited/ > 3rdparty_patch.diff + patch -p0 < 3rdparty_patch.diff # apply patch from cvat-data/src/js +``` + +Also these files have been added to ignore for git in all future revisions: +```bash + # from cvat-data dir + git update-index --skip-worktree src/js/3rdparty/*.js +``` + +This behaviour can be reset with: +```bash + # from cvat-data dir + git update-index --no-skip-worktree src/js/3rdparty/*.js +``` + +[Stackoverflow issue](https://stackoverflow.com/questions/4348590/how-can-i-make-git-ignore-future-revisions-to-a-file) diff --git a/cvat-data/src/js/3rdparty/buffer.js b/cvat-data/src/js/3rdparty/buffer.js new file mode 100644 index 000000000000..0984272d628b --- /dev/null +++ b/cvat-data/src/js/3rdparty/buffer.js @@ -0,0 +1,198 @@ +module.exports = (function(){ "use strict"; + +var BitBuffer = function(bufferOrLength, mode) { + if (typeof(bufferOrLength) === 'object') { + this.bytes = (bufferOrLength instanceof Uint8Array) + ? bufferOrLength + : new Uint8Array(bufferOrLength); + + this.byteLength = this.bytes.length; + } + else { + this.bytes = new Uint8Array(bufferOrLength || 1024*1024); + this.byteLength = 0; + } + + this.mode = mode || BitBuffer.MODE.EXPAND; + this.index = 0; +}; + +BitBuffer.prototype.resize = function(size) { + var newBytes = new Uint8Array(size); + if (this.byteLength !== 0) { + this.byteLength = Math.min(this.byteLength, size); + newBytes.set(this.bytes, 0, this.byteLength); + } + this.bytes = newBytes; + this.index = Math.min(this.index, this.byteLength << 3); +}; + +BitBuffer.prototype.evict = function(sizeNeeded) { + var bytePos = this.index >> 3, + available = this.bytes.length - this.byteLength; + + // If the current index is the write position, we can simply reset both + // to 0. Also reset (and throw away yet unread data) if we won't be able + // to fit the new data in even after a normal eviction. + if ( + this.index === this.byteLength << 3 || + sizeNeeded > available + bytePos // emergency evac + ) { + this.byteLength = 0; + this.index = 0; + return; + } + else if (bytePos === 0) { + // Nothing read yet - we can't evict anything + return; + } + + // Some browsers don't support copyWithin() yet - we may have to do + // it manually using set and a subarray + if (this.bytes.copyWithin) { + this.bytes.copyWithin(0, bytePos, this.byteLength); + } + else { + this.bytes.set(this.bytes.subarray(bytePos, this.byteLength)); + } + + this.byteLength = this.byteLength - bytePos; + this.index -= bytePos << 3; + return; +}; + +BitBuffer.prototype.write = function(buffers) { + var isArrayOfBuffers = (typeof(buffers[0]) === 'object'), + totalLength = 0, + available = this.bytes.length - this.byteLength; + + // Calculate total byte length + if (isArrayOfBuffers) { + var totalLength = 0; + for (var i = 0; i < buffers.length; i++) { + totalLength += buffers[i].byteLength; + } + } + else { + totalLength = buffers.byteLength; + } + + // Do we need to resize or evict? + if (totalLength > available) { + if (this.mode === BitBuffer.MODE.EXPAND) { + var newSize = Math.max( + this.bytes.length * 2, + totalLength - available + ); + this.resize(newSize) + } + else { + this.evict(totalLength); + } + } + + if (isArrayOfBuffers) { + for (var i = 0; i < buffers.length; i++) { + this.appendSingleBuffer(buffers[i]); + } + } + else { + this.appendSingleBuffer(buffers); + } + + return totalLength; +}; + +BitBuffer.prototype.appendSingleBuffer = function(buffer) { + buffer = buffer instanceof Uint8Array + ? buffer + : new Uint8Array(buffer); + + this.bytes.set(buffer, this.byteLength); + this.byteLength += buffer.length; +}; + +BitBuffer.prototype.findNextStartCode = function() { + for (var i = (this.index+7 >> 3); i < this.byteLength; i++) { + if( + this.bytes[i] == 0x00 && + this.bytes[i+1] == 0x00 && + this.bytes[i+2] == 0x01 + ) { + this.index = (i+4) << 3; + return this.bytes[i+3]; + } + } + this.index = (this.byteLength << 3); + return -1; +}; + +BitBuffer.prototype.findStartCode = function(code) { + var current = 0; + while (true) { + current = this.findNextStartCode(); + if (current === code || current === -1) { + return current; + } + } + return -1; +}; + +BitBuffer.prototype.nextBytesAreStartCode = function() { + var i = (this.index+7 >> 3); + return ( + i >= this.byteLength || ( + this.bytes[i] == 0x00 && + this.bytes[i+1] == 0x00 && + this.bytes[i+2] == 0x01 + ) + ); +}; + +BitBuffer.prototype.peek = function(count) { + var offset = this.index; + var value = 0; + while (count) { + var currentByte = this.bytes[offset >> 3], + remaining = 8 - (offset & 7), // remaining bits in byte + read = remaining < count ? remaining : count, // bits in this run + shift = remaining - read, + mask = (0xff >> (8-read)); + + value = (value << read) | ((currentByte & (mask << shift)) >> shift); + + offset += read; + count -= read; + } + + return value; +} + +BitBuffer.prototype.read = function(count) { + var value = this.peek(count); + this.index += count; + return value; +}; + +BitBuffer.prototype.skip = function(count) { + return (this.index += count); +}; + +BitBuffer.prototype.rewind = function(count) { + this.index = Math.max(this.index - count, 0); +}; + +BitBuffer.prototype.has = function(count) { + return ((this.byteLength << 3) - this.index) >= count; +}; + +BitBuffer.MODE = { + EVICT: 1, + EXPAND: 2 +}; + +return BitBuffer; + +})(); + + diff --git a/cvat-data/src/js/3rdparty/decoder.js b/cvat-data/src/js/3rdparty/decoder.js new file mode 100644 index 000000000000..e0e369372322 --- /dev/null +++ b/cvat-data/src/js/3rdparty/decoder.js @@ -0,0 +1,112 @@ +module.exports = (function(){ "use strict"; + +var BaseDecoder = function(options) { + this.destination = null; + this.canPlay = false; + + this.collectTimestamps = !options.streaming; + this.bytesWritten = 0; + this.timestamps = []; + this.timestampIndex = 0; + + this.startTime = 0; + this.decodedTime = 0; + + Object.defineProperty(this, 'currentTime', {get: this.getCurrentTime}); +}; + +BaseDecoder.prototype.destroy = function() {}; + +BaseDecoder.prototype.connect = function(destination) { + this.destination = destination; +}; + +BaseDecoder.prototype.bufferGetIndex = function() { + return this.bits.index; +}; + +BaseDecoder.prototype.bufferSetIndex = function(index) { + this.bits.index = index; +}; + +BaseDecoder.prototype.bufferWrite = function(buffers) { + return this.bits.write(buffers); +}; + +BaseDecoder.prototype.write = function(pts, buffers) { + if (this.collectTimestamps) { + if (this.timestamps.length === 0) { + this.startTime = pts; + this.decodedTime = pts; + } + this.timestamps.push({index: this.bytesWritten << 3, time: pts}); + } + + this.bytesWritten += this.bufferWrite(buffers); + this.canPlay = true; +}; + +BaseDecoder.prototype.seek = function(time) { + if (!this.collectTimestamps) { + return; + } + + this.timestampIndex = 0; + for (var i = 0; i < this.timestamps.length; i++) { + if (this.timestamps[i].time > time) { + break; + } + this.timestampIndex = i; + } + + var ts = this.timestamps[this.timestampIndex]; + if (ts) { + this.bufferSetIndex(ts.index); + this.decodedTime = ts.time; + } + else { + this.bufferSetIndex(0); + this.decodedTime = this.startTime; + } +}; + +BaseDecoder.prototype.decode = function() { + this.advanceDecodedTime(0); +}; + +BaseDecoder.prototype.advanceDecodedTime = function(seconds) { + if (this.collectTimestamps) { + var newTimestampIndex = -1; + var currentIndex = this.bufferGetIndex(); + for (var i = this.timestampIndex; i < this.timestamps.length; i++) { + if (this.timestamps[i].index > currentIndex) { + break; + } + newTimestampIndex = i; + } + + // Did we find a new PTS, different from the last? If so, we don't have + // to advance the decoded time manually and can instead sync it exactly + // to the PTS. + if ( + newTimestampIndex !== -1 && + newTimestampIndex !== this.timestampIndex + ) { + this.timestampIndex = newTimestampIndex; + this.decodedTime = this.timestamps[this.timestampIndex].time; + return; + } + } + + this.decodedTime += seconds; +}; + +BaseDecoder.prototype.getCurrentTime = function() { + return this.decodedTime; +}; + +return BaseDecoder; + +})(); + + diff --git a/cvat-data/src/js/3rdparty/jsmpeg.js b/cvat-data/src/js/3rdparty/jsmpeg.js new file mode 100644 index 000000000000..9bd84d5979ac --- /dev/null +++ b/cvat-data/src/js/3rdparty/jsmpeg.js @@ -0,0 +1,93 @@ +/*! jsmpeg v1.0 | (c) Dominic Szablewski | MIT license */ + + +// This sets up the JSMpeg "Namespace". The object is empty apart from the Now() +// utility function and the automatic CreateVideoElements() after DOMReady. +module.exports = { + + // The Player sets up the connections between source, demuxer, decoders, + // renderer and audio output. It ties everything together, is responsible + // of scheduling decoding and provides some convenience methods for + // external users. + Player: null, + + // A Video Element wraps the Player, shows HTML controls to start/pause + // the video and handles Audio unlocking on iOS. VideoElements can be + // created directly in HTML using the
tag. + VideoElement: null, + + // The BitBuffer wraps a Uint8Array and allows reading an arbitrary number + // of bits at a time. On writing, the BitBuffer either expands its + // internal buffer (for static files) or deletes old data (for streaming). + BitBuffer: null, + + // A Source provides raw data from HTTP, a WebSocket connection or any + // other mean. Sources must support the following API: + // .connect(destinationNode) + // .write(buffer) + // .start() - start reading + // .resume(headroom) - continue reading; headroom to play pos in seconds + // .established - boolean, true after connection is established + // .completed - boolean, true if the source is completely loaded + // .progress - float 0-1 + Source: {}, + + // A Demuxer may sit between a Source and a Decoder. It separates the + // incoming raw data into Video, Audio and other Streams. API: + // .connect(streamId, destinationNode) + // .write(buffer) + // .currentTime – float, in seconds + // .startTime - float, in seconds + Demuxer: {}, + + // A Decoder accepts an incoming Stream of raw Audio or Video data, buffers + // it and upon `.decode()` decodes a single frame of data. Video decoders + // call `destinationNode.render(Y, Cr, CB)` with the decoded pixel data; + // Audio decoders call `destinationNode.play(left, right)` with the decoded + // PCM data. API: + // .connect(destinationNode) + // .write(pts, buffer) + // .decode() + // .seek(time) + // .currentTime - float, in seconds + // .startTime - float, in seconds + Decoder: {}, + + // A Renderer accepts raw YCrCb data in 3 separate buffers via the render() + // method. Renderers typically convert the data into the RGBA color space + // and draw it on a Canvas, but other output - such as writing PNGs - would + // be conceivable. API: + // .render(y, cr, cb) - pixel data as Uint8Arrays + // .enabled - wether the renderer does anything upon receiving data + Renderer: {}, + + // Audio Outputs accept raw Stero PCM data in 2 separate buffers via the + // play() method. Outputs typically play the audio on the user's device. + // API: + // .play(sampleRate, left, right) - rate in herz; PCM data as Uint8Arrays + // .stop() + // .enqueuedTime - float, in seconds + // .enabled - wether the output does anything upon receiving data + AudioOutput: {}, + + Now: function() { + return Date.now() / 1000; + }, + + Fill: function(array, value) { + if (array.fill) { + array.fill(value); + } + else { + for (var i = 0; i < array.length; i++) { + array[i] = value; + } + } + }, + + // The build process may append `JSMpeg.WASM_BINARY_INLINED = base64data;` + // to the minified source. + // If this property is present, jsmpeg will use the inlined binary data + // instead of trying to load a jsmpeg.wasm file via Ajax. + WASM_BINARY_INLINED: null +}; diff --git a/cvat-data/src/js/3rdparty/mpeg1.js b/cvat-data/src/js/3rdparty/mpeg1.js new file mode 100644 index 000000000000..e0005c564189 --- /dev/null +++ b/cvat-data/src/js/3rdparty/mpeg1.js @@ -0,0 +1,1689 @@ +const BaseDecoder = require('./decoder'); +const BitBuffer = require('./buffer'); +const now = require('./jsmpeg').Now; +const fill = require('./jsmpeg').Fill; + +module.exports = (function(){ "use strict"; + +// Inspired by Java MPEG-1 Video Decoder and Player by Zoltan Korandi +// https://sourceforge.net/projects/javampeg1video/ + +var MPEG1 = function(options) { + BaseDecoder.call(this, options); + + this.onDecodeCallback = options.onVideoDecode; + + var bufferSize = options.videoBufferSize || 8*1024*1024; + var bufferMode = BitBuffer.MODE.EXPAND; + + this.bits = new BitBuffer(bufferSize, bufferMode); + + this.customIntraQuantMatrix = new Uint8Array(64); + this.customNonIntraQuantMatrix = new Uint8Array(64); + this.blockData = new Int32Array(64); + + this.currentFrame = 0; + this.decodeFirstFrame = options.decodeFirstFrame !== false; +}; + +MPEG1.prototype = Object.create(BaseDecoder.prototype); +MPEG1.prototype.constructor = MPEG1; + +MPEG1.prototype.write = function(pts, buffers) { + BaseDecoder.prototype.write.call(this, pts, buffers); + + if (!this.hasSequenceHeader) { + if (this.bits.findStartCode(MPEG1.START.SEQUENCE) === -1) { + return false; + } + this.decodeSequenceHeader(); + + if (this.decodeFirstFrame) { + console.log("decodeFirstFrame"); + this.decode(); + } + } +}; + +MPEG1.prototype.decode = function() { + var startTime = now(); + + if (!this.hasSequenceHeader) { + return false; + } + + if (this.bits.findStartCode(MPEG1.START.PICTURE) === -1) { + var bufferedBytes = this.bits.byteLength - (this.bits.index >> 3); + return false; + } + + const result = this.decodePicture(); + // this.advanceDecodedTime(1/this.frameRate); + + // var elapsedTime = now() - startTime; + // if (this.onDecodeCallback) { + // this.onDecodeCallback(this, elapsedTime); + // } + + return result; +}; + +MPEG1.prototype.readHuffman = function(codeTable) { + var state = 0; + do { + state = codeTable[state + this.bits.read(1)]; + } while (state >= 0 && codeTable[state] !== 0); + return codeTable[state+2]; +}; + + +// Sequence Layer + +MPEG1.prototype.frameRate = 29.97; +MPEG1.prototype.decodeSequenceHeader = function() { + var newWidth = this.bits.read(12), + newHeight = this.bits.read(12); + + // skip pixel aspect ratio + this.bits.skip(4); + + this.frameRate = MPEG1.PICTURE_RATE[this.bits.read(4)]; + + // skip bitRate, marker, bufferSize and constrained bit + this.bits.skip(18 + 1 + 10 + 1); + + if (newWidth !== this.width || newHeight !== this.height) { + this.width = newWidth; + this.height = newHeight; + + this.initBuffers(); + + if (this.destination) { + this.destination.resize(newWidth, newHeight); + } + } + + if (this.bits.read(1)) { // load custom intra quant matrix? + for (var i = 0; i < 64; i++) { + this.customIntraQuantMatrix[MPEG1.ZIG_ZAG[i]] = this.bits.read(8); + } + this.intraQuantMatrix = this.customIntraQuantMatrix; + } + + if (this.bits.read(1)) { // load custom non intra quant matrix? + for (var i = 0; i < 64; i++) { + var idx = MPEG1.ZIG_ZAG[i]; + this.customNonIntraQuantMatrix[idx] = this.bits.read(8); + } + this.nonIntraQuantMatrix = this.customNonIntraQuantMatrix; + } + + this.hasSequenceHeader = true; +}; + +MPEG1.prototype.initBuffers = function() { + this.intraQuantMatrix = MPEG1.DEFAULT_INTRA_QUANT_MATRIX; + this.nonIntraQuantMatrix = MPEG1.DEFAULT_NON_INTRA_QUANT_MATRIX; + + this.mbWidth = (this.width + 15) >> 4; + this.mbHeight = (this.height + 15) >> 4; + this.mbSize = this.mbWidth * this.mbHeight; + + this.codedWidth = this.mbWidth << 4; + this.codedHeight = this.mbHeight << 4; + this.codedSize = this.codedWidth * this.codedHeight; + + this.halfWidth = this.mbWidth << 3; + this.halfHeight = this.mbHeight << 3; + + // Allocated buffers and resize the canvas + this.currentY = new Uint8ClampedArray(this.codedSize); + this.currentY32 = new Uint32Array(this.currentY.buffer); + + this.currentCr = new Uint8ClampedArray(this.codedSize >> 2); + this.currentCr32 = new Uint32Array(this.currentCr.buffer); + + this.currentCb = new Uint8ClampedArray(this.codedSize >> 2); + this.currentCb32 = new Uint32Array(this.currentCb.buffer); + + + this.forwardY = new Uint8ClampedArray(this.codedSize); + this.forwardY32 = new Uint32Array(this.forwardY.buffer); + + this.forwardCr = new Uint8ClampedArray(this.codedSize >> 2); + this.forwardCr32 = new Uint32Array(this.forwardCr.buffer); + + this.forwardCb = new Uint8ClampedArray(this.codedSize >> 2); + this.forwardCb32 = new Uint32Array(this.forwardCb.buffer); +}; + + +// Picture Layer + +MPEG1.prototype.currentY = null; +MPEG1.prototype.currentCr = null; +MPEG1.prototype.currentCb = null; + +MPEG1.prototype.pictureType = 0; + +// Buffers for motion compensation +MPEG1.prototype.forwardY = null; +MPEG1.prototype.forwardCr = null; +MPEG1.prototype.forwardCb = null; + +MPEG1.prototype.fullPelForward = false; +MPEG1.prototype.forwardFCode = 0; +MPEG1.prototype.forwardRSize = 0; +MPEG1.prototype.forwardF = 0; + +MPEG1.prototype.decodePicture = function(skipOutput) { + this.currentFrame++; + + this.bits.skip(10); // skip temporalReference + this.pictureType = this.bits.read(3); + this.bits.skip(16); // skip vbv_delay + + // Skip B and D frames or unknown coding type + if (this.pictureType <= 0 || this.pictureType >= MPEG1.PICTURE_TYPE.B) { + return; + } + + // full_pel_forward, forward_f_code + if (this.pictureType === MPEG1.PICTURE_TYPE.PREDICTIVE) { + this.fullPelForward = this.bits.read(1); + this.forwardFCode = this.bits.read(3); + if (this.forwardFCode === 0) { + // Ignore picture with zero forward_f_code + return; + } + this.forwardRSize = this.forwardFCode - 1; + this.forwardF = 1 << this.forwardRSize; + } + + var code = 0; + do { + code = this.bits.findNextStartCode(); + } while (code === MPEG1.START.EXTENSION || code === MPEG1.START.USER_DATA ); + + + while (code >= MPEG1.START.SLICE_FIRST && code <= MPEG1.START.SLICE_LAST) { + this.decodeSlice(code & 0x000000FF); + code = this.bits.findNextStartCode(); + } + + if (code !== -1) { + // We found the next start code; rewind 32bits and let the main loop + // handle it. + this.bits.rewind(32); + } + + let curY = this.currentY; + let curCr = this.currentCr; + let curCb = this.currentCb; + + // If this is a reference picutre then rotate the prediction pointers + if ( + this.pictureType === MPEG1.PICTURE_TYPE.INTRA || + this.pictureType === MPEG1.PICTURE_TYPE.PREDICTIVE + ) { + var + tmpY = this.forwardY, + tmpY32 = this.forwardY32, + tmpCr = this.forwardCr, + tmpCr32 = this.forwardCr32, + tmpCb = this.forwardCb, + tmpCb32 = this.forwardCb32; + + this.forwardY = this.currentY; + this.forwardY32 = this.currentY32; + this.forwardCr = this.currentCr; + this.forwardCr32 = this.currentCr32; + this.forwardCb = this.currentCb; + this.forwardCb32 = this.currentCb32; + + this.currentY = tmpY; + this.currentY32 = tmpY32; + this.currentCr = tmpCr; + this.currentCr32 = tmpCr32; + this.currentCb = tmpCb; + this.currentCb32 = tmpCb32; + } + + return [curY, curCr, curCb]; +}; + + +// Slice Layer + +MPEG1.prototype.quantizerScale = 0; +MPEG1.prototype.sliceBegin = false; + +MPEG1.prototype.decodeSlice = function(slice) { + this.sliceBegin = true; + this.macroblockAddress = (slice - 1) * this.mbWidth - 1; + + // Reset motion vectors and DC predictors + this.motionFwH = this.motionFwHPrev = 0; + this.motionFwV = this.motionFwVPrev = 0; + this.dcPredictorY = 128; + this.dcPredictorCr = 128; + this.dcPredictorCb = 128; + + this.quantizerScale = this.bits.read(5); + + // skip extra bits + while (this.bits.read(1)) { + this.bits.skip(8); + } + + do { + this.decodeMacroblock(); + } while (!this.bits.nextBytesAreStartCode()); +}; + + +// Macroblock Layer + +MPEG1.prototype.macroblockAddress = 0; +MPEG1.prototype.mbRow = 0; +MPEG1.prototype.mbCol = 0; + +MPEG1.prototype.macroblockType = 0; +MPEG1.prototype.macroblockIntra = false; +MPEG1.prototype.macroblockMotFw = false; + +MPEG1.prototype.motionFwH = 0; +MPEG1.prototype.motionFwV = 0; +MPEG1.prototype.motionFwHPrev = 0; +MPEG1.prototype.motionFwVPrev = 0; + +MPEG1.prototype.decodeMacroblock = function() { + // Decode macroblock_address_increment + var + increment = 0, + t = this.readHuffman(MPEG1.MACROBLOCK_ADDRESS_INCREMENT); + + while (t === 34) { + // macroblock_stuffing + t = this.readHuffman(MPEG1.MACROBLOCK_ADDRESS_INCREMENT); + } + while (t === 35) { + // macroblock_escape + increment += 33; + t = this.readHuffman(MPEG1.MACROBLOCK_ADDRESS_INCREMENT); + } + increment += t; + + // Process any skipped macroblocks + if (this.sliceBegin) { + // The first macroblock_address_increment of each slice is relative + // to beginning of the preverious row, not the preverious macroblock + this.sliceBegin = false; + this.macroblockAddress += increment; + } + else { + if (this.macroblockAddress + increment >= this.mbSize) { + // Illegal (too large) macroblock_address_increment + return; + } + if (increment > 1) { + // Skipped macroblocks reset DC predictors + this.dcPredictorY = 128; + this.dcPredictorCr = 128; + this.dcPredictorCb = 128; + + // Skipped macroblocks in P-pictures reset motion vectors + if (this.pictureType === MPEG1.PICTURE_TYPE.PREDICTIVE) { + this.motionFwH = this.motionFwHPrev = 0; + this.motionFwV = this.motionFwVPrev = 0; + } + } + + // Predict skipped macroblocks + while (increment > 1) { + this.macroblockAddress++; + this.mbRow = (this.macroblockAddress / this.mbWidth)|0; + this.mbCol = this.macroblockAddress % this.mbWidth; + this.copyMacroblock( + this.motionFwH, this.motionFwV, + this.forwardY, this.forwardCr, this.forwardCb + ); + increment--; + } + this.macroblockAddress++; + } + this.mbRow = (this.macroblockAddress / this.mbWidth)|0; + this.mbCol = this.macroblockAddress % this.mbWidth; + + // Process the current macroblock + var mbTable = MPEG1.MACROBLOCK_TYPE[this.pictureType]; + this.macroblockType = this.readHuffman(mbTable); + this.macroblockIntra = (this.macroblockType & 0x01); + this.macroblockMotFw = (this.macroblockType & 0x08); + + // Quantizer scale + if ((this.macroblockType & 0x10) !== 0) { + this.quantizerScale = this.bits.read(5); + } + + if (this.macroblockIntra) { + // Intra-coded macroblocks reset motion vectors + this.motionFwH = this.motionFwHPrev = 0; + this.motionFwV = this.motionFwVPrev = 0; + } + else { + // Non-intra macroblocks reset DC predictors + this.dcPredictorY = 128; + this.dcPredictorCr = 128; + this.dcPredictorCb = 128; + + this.decodeMotionVectors(); + this.copyMacroblock( + this.motionFwH, this.motionFwV, + this.forwardY, this.forwardCr, this.forwardCb + ); + } + + // Decode blocks + var cbp = ((this.macroblockType & 0x02) !== 0) + ? this.readHuffman(MPEG1.CODE_BLOCK_PATTERN) + : (this.macroblockIntra ? 0x3f : 0); + + for (var block = 0, mask = 0x20; block < 6; block++) { + if ((cbp & mask) !== 0) { + this.decodeBlock(block); + } + mask >>= 1; + } +}; + + +MPEG1.prototype.decodeMotionVectors = function() { + var code, d, r = 0; + + // Forward + if (this.macroblockMotFw) { + // Horizontal forward + code = this.readHuffman(MPEG1.MOTION); + if ((code !== 0) && (this.forwardF !== 1)) { + r = this.bits.read(this.forwardRSize); + d = ((Math.abs(code) - 1) << this.forwardRSize) + r + 1; + if (code < 0) { + d = -d; + } + } + else { + d = code; + } + + this.motionFwHPrev += d; + if (this.motionFwHPrev > (this.forwardF << 4) - 1) { + this.motionFwHPrev -= this.forwardF << 5; + } + else if (this.motionFwHPrev < ((-this.forwardF) << 4)) { + this.motionFwHPrev += this.forwardF << 5; + } + + this.motionFwH = this.motionFwHPrev; + if (this.fullPelForward) { + this.motionFwH <<= 1; + } + + // Vertical forward + code = this.readHuffman(MPEG1.MOTION); + if ((code !== 0) && (this.forwardF !== 1)) { + r = this.bits.read(this.forwardRSize); + d = ((Math.abs(code) - 1) << this.forwardRSize) + r + 1; + if (code < 0) { + d = -d; + } + } + else { + d = code; + } + + this.motionFwVPrev += d; + if (this.motionFwVPrev > (this.forwardF << 4) - 1) { + this.motionFwVPrev -= this.forwardF << 5; + } + else if (this.motionFwVPrev < ((-this.forwardF) << 4)) { + this.motionFwVPrev += this.forwardF << 5; + } + + this.motionFwV = this.motionFwVPrev; + if (this.fullPelForward) { + this.motionFwV <<= 1; + } + } + else if (this.pictureType === MPEG1.PICTURE_TYPE.PREDICTIVE) { + // No motion information in P-picture, reset vectors + this.motionFwH = this.motionFwHPrev = 0; + this.motionFwV = this.motionFwVPrev = 0; + } +}; + +MPEG1.prototype.copyMacroblock = function(motionH, motionV, sY, sCr, sCb) { + var + width, scan, + H, V, oddH, oddV, + src, dest, last; + + // We use 32bit writes here + var dY = this.currentY32, + dCb = this.currentCb32, + dCr = this.currentCr32; + + // Luminance + width = this.codedWidth; + scan = width - 16; + + H = motionH >> 1; + V = motionV >> 1; + oddH = (motionH & 1) === 1; + oddV = (motionV & 1) === 1; + + src = ((this.mbRow << 4) + V) * width + (this.mbCol << 4) + H; + dest = (this.mbRow * width + this.mbCol) << 2; + last = dest + (width << 2); + + var x, y1, y2, y; + if (oddH) { + if (oddV) { + while (dest < last) { + y1 = sY[src] + sY[src+width]; src++; + for (x = 0; x < 4; x++) { + y2 = sY[src] + sY[src+width]; src++; + y = (((y1 + y2 + 2) >> 2) & 0xff); + + y1 = sY[src] + sY[src+width]; src++; + y |= (((y1 + y2 + 2) << 6) & 0xff00); + + y2 = sY[src] + sY[src+width]; src++; + y |= (((y1 + y2 + 2) << 14) & 0xff0000); + + y1 = sY[src] + sY[src+width]; src++; + y |= (((y1 + y2 + 2) << 22) & 0xff000000); + + dY[dest++] = y; + } + dest += scan >> 2; src += scan-1; + } + } + else { + while (dest < last) { + y1 = sY[src++]; + for (x = 0; x < 4; x++) { + y2 = sY[src++]; + y = (((y1 + y2 + 1) >> 1) & 0xff); + + y1 = sY[src++]; + y |= (((y1 + y2 + 1) << 7) & 0xff00); + + y2 = sY[src++]; + y |= (((y1 + y2 + 1) << 15) & 0xff0000); + + y1 = sY[src++]; + y |= (((y1 + y2 + 1) << 23) & 0xff000000); + + dY[dest++] = y; + } + dest += scan >> 2; src += scan-1; + } + } + } + else { + if (oddV) { + while (dest < last) { + for (x = 0; x < 4; x++) { + y = (((sY[src] + sY[src+width] + 1) >> 1) & 0xff); src++; + y |= (((sY[src] + sY[src+width] + 1) << 7) & 0xff00); src++; + y |= (((sY[src] + sY[src+width] + 1) << 15) & 0xff0000); src++; + y |= (((sY[src] + sY[src+width] + 1) << 23) & 0xff000000); src++; + + dY[dest++] = y; + } + dest += scan >> 2; src += scan; + } + } + else { + while (dest < last) { + for (x = 0; x < 4; x++) { + y = sY[src]; src++; + y |= sY[src] << 8; src++; + y |= sY[src] << 16; src++; + y |= sY[src] << 24; src++; + + dY[dest++] = y; + } + dest += scan >> 2; src += scan; + } + } + } + + // Chrominance + + width = this.halfWidth; + scan = width - 8; + + H = (motionH/2) >> 1; + V = (motionV/2) >> 1; + oddH = ((motionH/2) & 1) === 1; + oddV = ((motionV/2) & 1) === 1; + + src = ((this.mbRow << 3) + V) * width + (this.mbCol << 3) + H; + dest = (this.mbRow * width + this.mbCol) << 1; + last = dest + (width << 1); + + var cr1, cr2, cr, + cb1, cb2, cb; + if (oddH) { + if (oddV) { + while (dest < last) { + cr1 = sCr[src] + sCr[src+width]; + cb1 = sCb[src] + sCb[src+width]; + src++; + for (x = 0; x < 2; x++) { + cr2 = sCr[src] + sCr[src+width]; + cb2 = sCb[src] + sCb[src+width]; src++; + cr = (((cr1 + cr2 + 2) >> 2) & 0xff); + cb = (((cb1 + cb2 + 2) >> 2) & 0xff); + + cr1 = sCr[src] + sCr[src+width]; + cb1 = sCb[src] + sCb[src+width]; src++; + cr |= (((cr1 + cr2 + 2) << 6) & 0xff00); + cb |= (((cb1 + cb2 + 2) << 6) & 0xff00); + + cr2 = sCr[src] + sCr[src+width]; + cb2 = sCb[src] + sCb[src+width]; src++; + cr |= (((cr1 + cr2 + 2) << 14) & 0xff0000); + cb |= (((cb1 + cb2 + 2) << 14) & 0xff0000); + + cr1 = sCr[src] + sCr[src+width]; + cb1 = sCb[src] + sCb[src+width]; src++; + cr |= (((cr1 + cr2 + 2) << 22) & 0xff000000); + cb |= (((cb1 + cb2 + 2) << 22) & 0xff000000); + + dCr[dest] = cr; + dCb[dest] = cb; + dest++; + } + dest += scan >> 2; src += scan-1; + } + } + else { + while (dest < last) { + cr1 = sCr[src]; + cb1 = sCb[src]; + src++; + for (x = 0; x < 2; x++) { + cr2 = sCr[src]; + cb2 = sCb[src++]; + cr = (((cr1 + cr2 + 1) >> 1) & 0xff); + cb = (((cb1 + cb2 + 1) >> 1) & 0xff); + + cr1 = sCr[src]; + cb1 = sCb[src++]; + cr |= (((cr1 + cr2 + 1) << 7) & 0xff00); + cb |= (((cb1 + cb2 + 1) << 7) & 0xff00); + + cr2 = sCr[src]; + cb2 = sCb[src++]; + cr |= (((cr1 + cr2 + 1) << 15) & 0xff0000); + cb |= (((cb1 + cb2 + 1) << 15) & 0xff0000); + + cr1 = sCr[src]; + cb1 = sCb[src++]; + cr |= (((cr1 + cr2 + 1) << 23) & 0xff000000); + cb |= (((cb1 + cb2 + 1) << 23) & 0xff000000); + + dCr[dest] = cr; + dCb[dest] = cb; + dest++; + } + dest += scan >> 2; src += scan-1; + } + } + } + else { + if (oddV) { + while (dest < last) { + for (x = 0; x < 2; x++) { + cr = (((sCr[src] + sCr[src+width] + 1) >> 1) & 0xff); + cb = (((sCb[src] + sCb[src+width] + 1) >> 1) & 0xff); src++; + + cr |= (((sCr[src] + sCr[src+width] + 1) << 7) & 0xff00); + cb |= (((sCb[src] + sCb[src+width] + 1) << 7) & 0xff00); src++; + + cr |= (((sCr[src] + sCr[src+width] + 1) << 15) & 0xff0000); + cb |= (((sCb[src] + sCb[src+width] + 1) << 15) & 0xff0000); src++; + + cr |= (((sCr[src] + sCr[src+width] + 1) << 23) & 0xff000000); + cb |= (((sCb[src] + sCb[src+width] + 1) << 23) & 0xff000000); src++; + + dCr[dest] = cr; + dCb[dest] = cb; + dest++; + } + dest += scan >> 2; src += scan; + } + } + else { + while (dest < last) { + for (x = 0; x < 2; x++) { + cr = sCr[src]; + cb = sCb[src]; src++; + + cr |= sCr[src] << 8; + cb |= sCb[src] << 8; src++; + + cr |= sCr[src] << 16; + cb |= sCb[src] << 16; src++; + + cr |= sCr[src] << 24; + cb |= sCb[src] << 24; src++; + + dCr[dest] = cr; + dCb[dest] = cb; + dest++; + } + dest += scan >> 2; src += scan; + } + } + } +}; + + +// Block layer + +MPEG1.prototype.dcPredictorY = 0; +MPEG1.prototype.dcPredictorCr = 0; +MPEG1.prototype.dcPredictorCb = 0; + +MPEG1.prototype.blockData = null; + +MPEG1.prototype.decodeBlock = function(block) { + + var + n = 0, + quantMatrix; + + // Decode DC coefficient of intra-coded blocks + if (this.macroblockIntra) { + var + predictor, + dctSize; + + // DC prediction + + if (block < 4) { + predictor = this.dcPredictorY; + dctSize = this.readHuffman(MPEG1.DCT_DC_SIZE_LUMINANCE); + } + else { + predictor = (block === 4 ? this.dcPredictorCr : this.dcPredictorCb); + dctSize = this.readHuffman(MPEG1.DCT_DC_SIZE_CHROMINANCE); + } + + // Read DC coeff + if (dctSize > 0) { + var differential = this.bits.read(dctSize); + if ((differential & (1 << (dctSize - 1))) !== 0) { + this.blockData[0] = predictor + differential; + } + else { + this.blockData[0] = predictor + ((-1 << dctSize)|(differential+1)); + } + } + else { + this.blockData[0] = predictor; + } + + // Save predictor value + if (block < 4) { + this.dcPredictorY = this.blockData[0]; + } + else if (block === 4) { + this.dcPredictorCr = this.blockData[0]; + } + else { + this.dcPredictorCb = this.blockData[0]; + } + + // Dequantize + premultiply + this.blockData[0] <<= (3 + 5); + + quantMatrix = this.intraQuantMatrix; + n = 1; + } + else { + quantMatrix = this.nonIntraQuantMatrix; + } + + // Decode AC coefficients (+DC for non-intra) + var level = 0; + while (true) { + var + run = 0, + coeff = this.readHuffman(MPEG1.DCT_COEFF); + + if ((coeff === 0x0001) && (n > 0) && (this.bits.read(1) === 0)) { + // end_of_block + break; + } + if (coeff === 0xffff) { + // escape + run = this.bits.read(6); + level = this.bits.read(8); + if (level === 0) { + level = this.bits.read(8); + } + else if (level === 128) { + level = this.bits.read(8) - 256; + } + else if (level > 128) { + level = level - 256; + } + } + else { + run = coeff >> 8; + level = coeff & 0xff; + if (this.bits.read(1)) { + level = -level; + } + } + + n += run; + var dezigZagged = MPEG1.ZIG_ZAG[n]; + n++; + + // Dequantize, oddify, clip + level <<= 1; + if (!this.macroblockIntra) { + level += (level < 0 ? -1 : 1); + } + level = (level * this.quantizerScale * quantMatrix[dezigZagged]) >> 4; + if ((level & 1) === 0) { + level -= level > 0 ? 1 : -1; + } + if (level > 2047) { + level = 2047; + } + else if (level < -2048) { + level = -2048; + } + + // Save premultiplied coefficient + this.blockData[dezigZagged] = level * MPEG1.PREMULTIPLIER_MATRIX[dezigZagged]; + } + + // Move block to its place + var + destArray, + destIndex, + scan; + + if (block < 4) { + destArray = this.currentY; + scan = this.codedWidth - 8; + destIndex = (this.mbRow * this.codedWidth + this.mbCol) << 4; + if ((block & 1) !== 0) { + destIndex += 8; + } + if ((block & 2) !== 0) { + destIndex += this.codedWidth << 3; + } + } + else { + destArray = (block === 4) ? this.currentCb : this.currentCr; + scan = (this.codedWidth >> 1) - 8; + destIndex = ((this.mbRow * this.codedWidth) << 2) + (this.mbCol << 3); + } + + if (this.macroblockIntra) { + // Overwrite (no prediction) + if (n === 1) { + MPEG1.CopyValueToDestination((this.blockData[0] + 128) >> 8, destArray, destIndex, scan); + this.blockData[0] = 0; + } + else { + MPEG1.IDCT(this.blockData); + MPEG1.CopyBlockToDestination(this.blockData, destArray, destIndex, scan); + fill(this.blockData, 0); + } + } + else { + // Add data to the predicted macroblock + if (n === 1) { + MPEG1.AddValueToDestination((this.blockData[0] + 128) >> 8, destArray, destIndex, scan); + this.blockData[0] = 0; + } + else { + MPEG1.IDCT(this.blockData); + MPEG1.AddBlockToDestination(this.blockData, destArray, destIndex, scan); + fill(this.blockData, 0); + } + } + + n = 0; +}; + +MPEG1.CopyBlockToDestination = function(block, dest, index, scan) { + for (var n = 0; n < 64; n += 8, index += scan+8) { + dest[index+0] = block[n+0]; + dest[index+1] = block[n+1]; + dest[index+2] = block[n+2]; + dest[index+3] = block[n+3]; + dest[index+4] = block[n+4]; + dest[index+5] = block[n+5]; + dest[index+6] = block[n+6]; + dest[index+7] = block[n+7]; + } +}; + +MPEG1.AddBlockToDestination = function(block, dest, index, scan) { + for (var n = 0; n < 64; n += 8, index += scan+8) { + dest[index+0] += block[n+0]; + dest[index+1] += block[n+1]; + dest[index+2] += block[n+2]; + dest[index+3] += block[n+3]; + dest[index+4] += block[n+4]; + dest[index+5] += block[n+5]; + dest[index+6] += block[n+6]; + dest[index+7] += block[n+7]; + } +}; + +MPEG1.CopyValueToDestination = function(value, dest, index, scan) { + for (var n = 0; n < 64; n += 8, index += scan+8) { + dest[index+0] = value; + dest[index+1] = value; + dest[index+2] = value; + dest[index+3] = value; + dest[index+4] = value; + dest[index+5] = value; + dest[index+6] = value; + dest[index+7] = value; + } +}; + +MPEG1.AddValueToDestination = function(value, dest, index, scan) { + for (var n = 0; n < 64; n += 8, index += scan+8) { + dest[index+0] += value; + dest[index+1] += value; + dest[index+2] += value; + dest[index+3] += value; + dest[index+4] += value; + dest[index+5] += value; + dest[index+6] += value; + dest[index+7] += value; + } +}; + +MPEG1.IDCT = function(block) { + // See http://vsr.informatik.tu-chemnitz.de/~jan/MPEG/HTML/IDCT.html + // for more info. + + var + b1, b3, b4, b6, b7, tmp1, tmp2, m0, + x0, x1, x2, x3, x4, y3, y4, y5, y6, y7; + + // Transform columns + for (var i = 0; i < 8; ++i) { + b1 = block[4*8+i]; + b3 = block[2*8+i] + block[6*8+i]; + b4 = block[5*8+i] - block[3*8+i]; + tmp1 = block[1*8+i] + block[7*8+i]; + tmp2 = block[3*8+i] + block[5*8+i]; + b6 = block[1*8+i] - block[7*8+i]; + b7 = tmp1 + tmp2; + m0 = block[0*8+i]; + x4 = ((b6*473 - b4*196 + 128) >> 8) - b7; + x0 = x4 - (((tmp1 - tmp2)*362 + 128) >> 8); + x1 = m0 - b1; + x2 = (((block[2*8+i] - block[6*8+i])*362 + 128) >> 8) - b3; + x3 = m0 + b1; + y3 = x1 + x2; + y4 = x3 + b3; + y5 = x1 - x2; + y6 = x3 - b3; + y7 = -x0 - ((b4*473 + b6*196 + 128) >> 8); + block[0*8+i] = b7 + y4; + block[1*8+i] = x4 + y3; + block[2*8+i] = y5 - x0; + block[3*8+i] = y6 - y7; + block[4*8+i] = y6 + y7; + block[5*8+i] = x0 + y5; + block[6*8+i] = y3 - x4; + block[7*8+i] = y4 - b7; + } + + // Transform rows + for (var i = 0; i < 64; i += 8) { + b1 = block[4+i]; + b3 = block[2+i] + block[6+i]; + b4 = block[5+i] - block[3+i]; + tmp1 = block[1+i] + block[7+i]; + tmp2 = block[3+i] + block[5+i]; + b6 = block[1+i] - block[7+i]; + b7 = tmp1 + tmp2; + m0 = block[0+i]; + x4 = ((b6*473 - b4*196 + 128) >> 8) - b7; + x0 = x4 - (((tmp1 - tmp2)*362 + 128) >> 8); + x1 = m0 - b1; + x2 = (((block[2+i] - block[6+i])*362 + 128) >> 8) - b3; + x3 = m0 + b1; + y3 = x1 + x2; + y4 = x3 + b3; + y5 = x1 - x2; + y6 = x3 - b3; + y7 = -x0 - ((b4*473 + b6*196 + 128) >> 8); + block[0+i] = (b7 + y4 + 128) >> 8; + block[1+i] = (x4 + y3 + 128) >> 8; + block[2+i] = (y5 - x0 + 128) >> 8; + block[3+i] = (y6 - y7 + 128) >> 8; + block[4+i] = (y6 + y7 + 128) >> 8; + block[5+i] = (x0 + y5 + 128) >> 8; + block[6+i] = (y3 - x4 + 128) >> 8; + block[7+i] = (y4 - b7 + 128) >> 8; + } +}; + + +// VLC Tables and Constants + +MPEG1.PICTURE_RATE = [ + 0.000, 23.976, 24.000, 25.000, 29.970, 30.000, 50.000, 59.940, + 60.000, 0.000, 0.000, 0.000, 0.000, 0.000, 0.000, 0.000 +]; + +MPEG1.ZIG_ZAG = new Uint8Array([ + 0, 1, 8, 16, 9, 2, 3, 10, + 17, 24, 32, 25, 18, 11, 4, 5, + 12, 19, 26, 33, 40, 48, 41, 34, + 27, 20, 13, 6, 7, 14, 21, 28, + 35, 42, 49, 56, 57, 50, 43, 36, + 29, 22, 15, 23, 30, 37, 44, 51, + 58, 59, 52, 45, 38, 31, 39, 46, + 53, 60, 61, 54, 47, 55, 62, 63 +]); + +MPEG1.DEFAULT_INTRA_QUANT_MATRIX = new Uint8Array([ + 8, 16, 19, 22, 26, 27, 29, 34, + 16, 16, 22, 24, 27, 29, 34, 37, + 19, 22, 26, 27, 29, 34, 34, 38, + 22, 22, 26, 27, 29, 34, 37, 40, + 22, 26, 27, 29, 32, 35, 40, 48, + 26, 27, 29, 32, 35, 40, 48, 58, + 26, 27, 29, 34, 38, 46, 56, 69, + 27, 29, 35, 38, 46, 56, 69, 83 +]); + +MPEG1.DEFAULT_NON_INTRA_QUANT_MATRIX = new Uint8Array([ + 16, 16, 16, 16, 16, 16, 16, 16, + 16, 16, 16, 16, 16, 16, 16, 16, + 16, 16, 16, 16, 16, 16, 16, 16, + 16, 16, 16, 16, 16, 16, 16, 16, + 16, 16, 16, 16, 16, 16, 16, 16, + 16, 16, 16, 16, 16, 16, 16, 16, + 16, 16, 16, 16, 16, 16, 16, 16, + 16, 16, 16, 16, 16, 16, 16, 16 +]); + +MPEG1.PREMULTIPLIER_MATRIX = new Uint8Array([ + 32, 44, 42, 38, 32, 25, 17, 9, + 44, 62, 58, 52, 44, 35, 24, 12, + 42, 58, 55, 49, 42, 33, 23, 12, + 38, 52, 49, 44, 38, 30, 20, 10, + 32, 44, 42, 38, 32, 25, 17, 9, + 25, 35, 33, 30, 25, 20, 14, 7, + 17, 24, 23, 20, 17, 14, 9, 5, + 9, 12, 12, 10, 9, 7, 5, 2 +]); + +// MPEG-1 VLC + +// macroblock_stuffing decodes as 34. +// macroblock_escape decodes as 35. + +MPEG1.MACROBLOCK_ADDRESS_INCREMENT = new Int16Array([ + 1*3, 2*3, 0, // 0 + 3*3, 4*3, 0, // 1 0 + 0, 0, 1, // 2 1. + 5*3, 6*3, 0, // 3 00 + 7*3, 8*3, 0, // 4 01 + 9*3, 10*3, 0, // 5 000 + 11*3, 12*3, 0, // 6 001 + 0, 0, 3, // 7 010. + 0, 0, 2, // 8 011. + 13*3, 14*3, 0, // 9 0000 + 15*3, 16*3, 0, // 10 0001 + 0, 0, 5, // 11 0010. + 0, 0, 4, // 12 0011. + 17*3, 18*3, 0, // 13 0000 0 + 19*3, 20*3, 0, // 14 0000 1 + 0, 0, 7, // 15 0001 0. + 0, 0, 6, // 16 0001 1. + 21*3, 22*3, 0, // 17 0000 00 + 23*3, 24*3, 0, // 18 0000 01 + 25*3, 26*3, 0, // 19 0000 10 + 27*3, 28*3, 0, // 20 0000 11 + -1, 29*3, 0, // 21 0000 000 + -1, 30*3, 0, // 22 0000 001 + 31*3, 32*3, 0, // 23 0000 010 + 33*3, 34*3, 0, // 24 0000 011 + 35*3, 36*3, 0, // 25 0000 100 + 37*3, 38*3, 0, // 26 0000 101 + 0, 0, 9, // 27 0000 110. + 0, 0, 8, // 28 0000 111. + 39*3, 40*3, 0, // 29 0000 0001 + 41*3, 42*3, 0, // 30 0000 0011 + 43*3, 44*3, 0, // 31 0000 0100 + 45*3, 46*3, 0, // 32 0000 0101 + 0, 0, 15, // 33 0000 0110. + 0, 0, 14, // 34 0000 0111. + 0, 0, 13, // 35 0000 1000. + 0, 0, 12, // 36 0000 1001. + 0, 0, 11, // 37 0000 1010. + 0, 0, 10, // 38 0000 1011. + 47*3, -1, 0, // 39 0000 0001 0 + -1, 48*3, 0, // 40 0000 0001 1 + 49*3, 50*3, 0, // 41 0000 0011 0 + 51*3, 52*3, 0, // 42 0000 0011 1 + 53*3, 54*3, 0, // 43 0000 0100 0 + 55*3, 56*3, 0, // 44 0000 0100 1 + 57*3, 58*3, 0, // 45 0000 0101 0 + 59*3, 60*3, 0, // 46 0000 0101 1 + 61*3, -1, 0, // 47 0000 0001 00 + -1, 62*3, 0, // 48 0000 0001 11 + 63*3, 64*3, 0, // 49 0000 0011 00 + 65*3, 66*3, 0, // 50 0000 0011 01 + 67*3, 68*3, 0, // 51 0000 0011 10 + 69*3, 70*3, 0, // 52 0000 0011 11 + 71*3, 72*3, 0, // 53 0000 0100 00 + 73*3, 74*3, 0, // 54 0000 0100 01 + 0, 0, 21, // 55 0000 0100 10. + 0, 0, 20, // 56 0000 0100 11. + 0, 0, 19, // 57 0000 0101 00. + 0, 0, 18, // 58 0000 0101 01. + 0, 0, 17, // 59 0000 0101 10. + 0, 0, 16, // 60 0000 0101 11. + 0, 0, 35, // 61 0000 0001 000. -- macroblock_escape + 0, 0, 34, // 62 0000 0001 111. -- macroblock_stuffing + 0, 0, 33, // 63 0000 0011 000. + 0, 0, 32, // 64 0000 0011 001. + 0, 0, 31, // 65 0000 0011 010. + 0, 0, 30, // 66 0000 0011 011. + 0, 0, 29, // 67 0000 0011 100. + 0, 0, 28, // 68 0000 0011 101. + 0, 0, 27, // 69 0000 0011 110. + 0, 0, 26, // 70 0000 0011 111. + 0, 0, 25, // 71 0000 0100 000. + 0, 0, 24, // 72 0000 0100 001. + 0, 0, 23, // 73 0000 0100 010. + 0, 0, 22 // 74 0000 0100 011. +]); + +// macroblock_type bitmap: +// 0x10 macroblock_quant +// 0x08 macroblock_motion_forward +// 0x04 macroblock_motion_backward +// 0x02 macrobkock_pattern +// 0x01 macroblock_intra +// + +MPEG1.MACROBLOCK_TYPE_INTRA = new Int8Array([ + 1*3, 2*3, 0, // 0 + -1, 3*3, 0, // 1 0 + 0, 0, 0x01, // 2 1. + 0, 0, 0x11 // 3 01. +]); + +MPEG1.MACROBLOCK_TYPE_PREDICTIVE = new Int8Array([ + 1*3, 2*3, 0, // 0 + 3*3, 4*3, 0, // 1 0 + 0, 0, 0x0a, // 2 1. + 5*3, 6*3, 0, // 3 00 + 0, 0, 0x02, // 4 01. + 7*3, 8*3, 0, // 5 000 + 0, 0, 0x08, // 6 001. + 9*3, 10*3, 0, // 7 0000 + 11*3, 12*3, 0, // 8 0001 + -1, 13*3, 0, // 9 00000 + 0, 0, 0x12, // 10 00001. + 0, 0, 0x1a, // 11 00010. + 0, 0, 0x01, // 12 00011. + 0, 0, 0x11 // 13 000001. +]); + +MPEG1.MACROBLOCK_TYPE_B = new Int8Array([ + 1*3, 2*3, 0, // 0 + 3*3, 5*3, 0, // 1 0 + 4*3, 6*3, 0, // 2 1 + 8*3, 7*3, 0, // 3 00 + 0, 0, 0x0c, // 4 10. + 9*3, 10*3, 0, // 5 01 + 0, 0, 0x0e, // 6 11. + 13*3, 14*3, 0, // 7 001 + 12*3, 11*3, 0, // 8 000 + 0, 0, 0x04, // 9 010. + 0, 0, 0x06, // 10 011. + 18*3, 16*3, 0, // 11 0001 + 15*3, 17*3, 0, // 12 0000 + 0, 0, 0x08, // 13 0010. + 0, 0, 0x0a, // 14 0011. + -1, 19*3, 0, // 15 00000 + 0, 0, 0x01, // 16 00011. + 20*3, 21*3, 0, // 17 00001 + 0, 0, 0x1e, // 18 00010. + 0, 0, 0x11, // 19 000001. + 0, 0, 0x16, // 20 000010. + 0, 0, 0x1a // 21 000011. +]); + +MPEG1.MACROBLOCK_TYPE = [ + null, + MPEG1.MACROBLOCK_TYPE_INTRA, + MPEG1.MACROBLOCK_TYPE_PREDICTIVE, + MPEG1.MACROBLOCK_TYPE_B +]; + +MPEG1.CODE_BLOCK_PATTERN = new Int16Array([ + 2*3, 1*3, 0, // 0 + 3*3, 6*3, 0, // 1 1 + 4*3, 5*3, 0, // 2 0 + 8*3, 11*3, 0, // 3 10 + 12*3, 13*3, 0, // 4 00 + 9*3, 7*3, 0, // 5 01 + 10*3, 14*3, 0, // 6 11 + 20*3, 19*3, 0, // 7 011 + 18*3, 16*3, 0, // 8 100 + 23*3, 17*3, 0, // 9 010 + 27*3, 25*3, 0, // 10 110 + 21*3, 28*3, 0, // 11 101 + 15*3, 22*3, 0, // 12 000 + 24*3, 26*3, 0, // 13 001 + 0, 0, 60, // 14 111. + 35*3, 40*3, 0, // 15 0000 + 44*3, 48*3, 0, // 16 1001 + 38*3, 36*3, 0, // 17 0101 + 42*3, 47*3, 0, // 18 1000 + 29*3, 31*3, 0, // 19 0111 + 39*3, 32*3, 0, // 20 0110 + 0, 0, 32, // 21 1010. + 45*3, 46*3, 0, // 22 0001 + 33*3, 41*3, 0, // 23 0100 + 43*3, 34*3, 0, // 24 0010 + 0, 0, 4, // 25 1101. + 30*3, 37*3, 0, // 26 0011 + 0, 0, 8, // 27 1100. + 0, 0, 16, // 28 1011. + 0, 0, 44, // 29 0111 0. + 50*3, 56*3, 0, // 30 0011 0 + 0, 0, 28, // 31 0111 1. + 0, 0, 52, // 32 0110 1. + 0, 0, 62, // 33 0100 0. + 61*3, 59*3, 0, // 34 0010 1 + 52*3, 60*3, 0, // 35 0000 0 + 0, 0, 1, // 36 0101 1. + 55*3, 54*3, 0, // 37 0011 1 + 0, 0, 61, // 38 0101 0. + 0, 0, 56, // 39 0110 0. + 57*3, 58*3, 0, // 40 0000 1 + 0, 0, 2, // 41 0100 1. + 0, 0, 40, // 42 1000 0. + 51*3, 62*3, 0, // 43 0010 0 + 0, 0, 48, // 44 1001 0. + 64*3, 63*3, 0, // 45 0001 0 + 49*3, 53*3, 0, // 46 0001 1 + 0, 0, 20, // 47 1000 1. + 0, 0, 12, // 48 1001 1. + 80*3, 83*3, 0, // 49 0001 10 + 0, 0, 63, // 50 0011 00. + 77*3, 75*3, 0, // 51 0010 00 + 65*3, 73*3, 0, // 52 0000 00 + 84*3, 66*3, 0, // 53 0001 11 + 0, 0, 24, // 54 0011 11. + 0, 0, 36, // 55 0011 10. + 0, 0, 3, // 56 0011 01. + 69*3, 87*3, 0, // 57 0000 10 + 81*3, 79*3, 0, // 58 0000 11 + 68*3, 71*3, 0, // 59 0010 11 + 70*3, 78*3, 0, // 60 0000 01 + 67*3, 76*3, 0, // 61 0010 10 + 72*3, 74*3, 0, // 62 0010 01 + 86*3, 85*3, 0, // 63 0001 01 + 88*3, 82*3, 0, // 64 0001 00 + -1, 94*3, 0, // 65 0000 000 + 95*3, 97*3, 0, // 66 0001 111 + 0, 0, 33, // 67 0010 100. + 0, 0, 9, // 68 0010 110. + 106*3, 110*3, 0, // 69 0000 100 + 102*3, 116*3, 0, // 70 0000 010 + 0, 0, 5, // 71 0010 111. + 0, 0, 10, // 72 0010 010. + 93*3, 89*3, 0, // 73 0000 001 + 0, 0, 6, // 74 0010 011. + 0, 0, 18, // 75 0010 001. + 0, 0, 17, // 76 0010 101. + 0, 0, 34, // 77 0010 000. + 113*3, 119*3, 0, // 78 0000 011 + 103*3, 104*3, 0, // 79 0000 111 + 90*3, 92*3, 0, // 80 0001 100 + 109*3, 107*3, 0, // 81 0000 110 + 117*3, 118*3, 0, // 82 0001 001 + 101*3, 99*3, 0, // 83 0001 101 + 98*3, 96*3, 0, // 84 0001 110 + 100*3, 91*3, 0, // 85 0001 011 + 114*3, 115*3, 0, // 86 0001 010 + 105*3, 108*3, 0, // 87 0000 101 + 112*3, 111*3, 0, // 88 0001 000 + 121*3, 125*3, 0, // 89 0000 0011 + 0, 0, 41, // 90 0001 1000. + 0, 0, 14, // 91 0001 0111. + 0, 0, 21, // 92 0001 1001. + 124*3, 122*3, 0, // 93 0000 0010 + 120*3, 123*3, 0, // 94 0000 0001 + 0, 0, 11, // 95 0001 1110. + 0, 0, 19, // 96 0001 1101. + 0, 0, 7, // 97 0001 1111. + 0, 0, 35, // 98 0001 1100. + 0, 0, 13, // 99 0001 1011. + 0, 0, 50, // 100 0001 0110. + 0, 0, 49, // 101 0001 1010. + 0, 0, 58, // 102 0000 0100. + 0, 0, 37, // 103 0000 1110. + 0, 0, 25, // 104 0000 1111. + 0, 0, 45, // 105 0000 1010. + 0, 0, 57, // 106 0000 1000. + 0, 0, 26, // 107 0000 1101. + 0, 0, 29, // 108 0000 1011. + 0, 0, 38, // 109 0000 1100. + 0, 0, 53, // 110 0000 1001. + 0, 0, 23, // 111 0001 0001. + 0, 0, 43, // 112 0001 0000. + 0, 0, 46, // 113 0000 0110. + 0, 0, 42, // 114 0001 0100. + 0, 0, 22, // 115 0001 0101. + 0, 0, 54, // 116 0000 0101. + 0, 0, 51, // 117 0001 0010. + 0, 0, 15, // 118 0001 0011. + 0, 0, 30, // 119 0000 0111. + 0, 0, 39, // 120 0000 0001 0. + 0, 0, 47, // 121 0000 0011 0. + 0, 0, 55, // 122 0000 0010 1. + 0, 0, 27, // 123 0000 0001 1. + 0, 0, 59, // 124 0000 0010 0. + 0, 0, 31 // 125 0000 0011 1. +]); + +MPEG1.MOTION = new Int16Array([ + 1*3, 2*3, 0, // 0 + 4*3, 3*3, 0, // 1 0 + 0, 0, 0, // 2 1. + 6*3, 5*3, 0, // 3 01 + 8*3, 7*3, 0, // 4 00 + 0, 0, -1, // 5 011. + 0, 0, 1, // 6 010. + 9*3, 10*3, 0, // 7 001 + 12*3, 11*3, 0, // 8 000 + 0, 0, 2, // 9 0010. + 0, 0, -2, // 10 0011. + 14*3, 15*3, 0, // 11 0001 + 16*3, 13*3, 0, // 12 0000 + 20*3, 18*3, 0, // 13 0000 1 + 0, 0, 3, // 14 0001 0. + 0, 0, -3, // 15 0001 1. + 17*3, 19*3, 0, // 16 0000 0 + -1, 23*3, 0, // 17 0000 00 + 27*3, 25*3, 0, // 18 0000 11 + 26*3, 21*3, 0, // 19 0000 01 + 24*3, 22*3, 0, // 20 0000 10 + 32*3, 28*3, 0, // 21 0000 011 + 29*3, 31*3, 0, // 22 0000 101 + -1, 33*3, 0, // 23 0000 001 + 36*3, 35*3, 0, // 24 0000 100 + 0, 0, -4, // 25 0000 111. + 30*3, 34*3, 0, // 26 0000 010 + 0, 0, 4, // 27 0000 110. + 0, 0, -7, // 28 0000 0111. + 0, 0, 5, // 29 0000 1010. + 37*3, 41*3, 0, // 30 0000 0100 + 0, 0, -5, // 31 0000 1011. + 0, 0, 7, // 32 0000 0110. + 38*3, 40*3, 0, // 33 0000 0011 + 42*3, 39*3, 0, // 34 0000 0101 + 0, 0, -6, // 35 0000 1001. + 0, 0, 6, // 36 0000 1000. + 51*3, 54*3, 0, // 37 0000 0100 0 + 50*3, 49*3, 0, // 38 0000 0011 0 + 45*3, 46*3, 0, // 39 0000 0101 1 + 52*3, 47*3, 0, // 40 0000 0011 1 + 43*3, 53*3, 0, // 41 0000 0100 1 + 44*3, 48*3, 0, // 42 0000 0101 0 + 0, 0, 10, // 43 0000 0100 10. + 0, 0, 9, // 44 0000 0101 00. + 0, 0, 8, // 45 0000 0101 10. + 0, 0, -8, // 46 0000 0101 11. + 57*3, 66*3, 0, // 47 0000 0011 11 + 0, 0, -9, // 48 0000 0101 01. + 60*3, 64*3, 0, // 49 0000 0011 01 + 56*3, 61*3, 0, // 50 0000 0011 00 + 55*3, 62*3, 0, // 51 0000 0100 00 + 58*3, 63*3, 0, // 52 0000 0011 10 + 0, 0, -10, // 53 0000 0100 11. + 59*3, 65*3, 0, // 54 0000 0100 01 + 0, 0, 12, // 55 0000 0100 000. + 0, 0, 16, // 56 0000 0011 000. + 0, 0, 13, // 57 0000 0011 110. + 0, 0, 14, // 58 0000 0011 100. + 0, 0, 11, // 59 0000 0100 010. + 0, 0, 15, // 60 0000 0011 010. + 0, 0, -16, // 61 0000 0011 001. + 0, 0, -12, // 62 0000 0100 001. + 0, 0, -14, // 63 0000 0011 101. + 0, 0, -15, // 64 0000 0011 011. + 0, 0, -11, // 65 0000 0100 011. + 0, 0, -13 // 66 0000 0011 111. +]); + +MPEG1.DCT_DC_SIZE_LUMINANCE = new Int8Array([ + 2*3, 1*3, 0, // 0 + 6*3, 5*3, 0, // 1 1 + 3*3, 4*3, 0, // 2 0 + 0, 0, 1, // 3 00. + 0, 0, 2, // 4 01. + 9*3, 8*3, 0, // 5 11 + 7*3, 10*3, 0, // 6 10 + 0, 0, 0, // 7 100. + 12*3, 11*3, 0, // 8 111 + 0, 0, 4, // 9 110. + 0, 0, 3, // 10 101. + 13*3, 14*3, 0, // 11 1111 + 0, 0, 5, // 12 1110. + 0, 0, 6, // 13 1111 0. + 16*3, 15*3, 0, // 14 1111 1 + 17*3, -1, 0, // 15 1111 11 + 0, 0, 7, // 16 1111 10. + 0, 0, 8 // 17 1111 110. +]); + +MPEG1.DCT_DC_SIZE_CHROMINANCE = new Int8Array([ + 2*3, 1*3, 0, // 0 + 4*3, 3*3, 0, // 1 1 + 6*3, 5*3, 0, // 2 0 + 8*3, 7*3, 0, // 3 11 + 0, 0, 2, // 4 10. + 0, 0, 1, // 5 01. + 0, 0, 0, // 6 00. + 10*3, 9*3, 0, // 7 111 + 0, 0, 3, // 8 110. + 12*3, 11*3, 0, // 9 1111 + 0, 0, 4, // 10 1110. + 14*3, 13*3, 0, // 11 1111 1 + 0, 0, 5, // 12 1111 0. + 16*3, 15*3, 0, // 13 1111 11 + 0, 0, 6, // 14 1111 10. + 17*3, -1, 0, // 15 1111 111 + 0, 0, 7, // 16 1111 110. + 0, 0, 8 // 17 1111 1110. +]); + +// dct_coeff bitmap: +// 0xff00 run +// 0x00ff level + +// Decoded values are unsigned. Sign bit follows in the stream. + +// Interpretation of the value 0x0001 +// for dc_coeff_first: run=0, level=1 +// for dc_coeff_next: If the next bit is 1: run=0, level=1 +// If the next bit is 0: end_of_block + +// escape decodes as 0xffff. + +MPEG1.DCT_COEFF = new Int32Array([ + 1*3, 2*3, 0, // 0 + 4*3, 3*3, 0, // 1 0 + 0, 0, 0x0001, // 2 1. + 7*3, 8*3, 0, // 3 01 + 6*3, 5*3, 0, // 4 00 + 13*3, 9*3, 0, // 5 001 + 11*3, 10*3, 0, // 6 000 + 14*3, 12*3, 0, // 7 010 + 0, 0, 0x0101, // 8 011. + 20*3, 22*3, 0, // 9 0011 + 18*3, 21*3, 0, // 10 0001 + 16*3, 19*3, 0, // 11 0000 + 0, 0, 0x0201, // 12 0101. + 17*3, 15*3, 0, // 13 0010 + 0, 0, 0x0002, // 14 0100. + 0, 0, 0x0003, // 15 0010 1. + 27*3, 25*3, 0, // 16 0000 0 + 29*3, 31*3, 0, // 17 0010 0 + 24*3, 26*3, 0, // 18 0001 0 + 32*3, 30*3, 0, // 19 0000 1 + 0, 0, 0x0401, // 20 0011 0. + 23*3, 28*3, 0, // 21 0001 1 + 0, 0, 0x0301, // 22 0011 1. + 0, 0, 0x0102, // 23 0001 10. + 0, 0, 0x0701, // 24 0001 00. + 0, 0, 0xffff, // 25 0000 01. -- escape + 0, 0, 0x0601, // 26 0001 01. + 37*3, 36*3, 0, // 27 0000 00 + 0, 0, 0x0501, // 28 0001 11. + 35*3, 34*3, 0, // 29 0010 00 + 39*3, 38*3, 0, // 30 0000 11 + 33*3, 42*3, 0, // 31 0010 01 + 40*3, 41*3, 0, // 32 0000 10 + 52*3, 50*3, 0, // 33 0010 010 + 54*3, 53*3, 0, // 34 0010 001 + 48*3, 49*3, 0, // 35 0010 000 + 43*3, 45*3, 0, // 36 0000 001 + 46*3, 44*3, 0, // 37 0000 000 + 0, 0, 0x0801, // 38 0000 111. + 0, 0, 0x0004, // 39 0000 110. + 0, 0, 0x0202, // 40 0000 100. + 0, 0, 0x0901, // 41 0000 101. + 51*3, 47*3, 0, // 42 0010 011 + 55*3, 57*3, 0, // 43 0000 0010 + 60*3, 56*3, 0, // 44 0000 0001 + 59*3, 58*3, 0, // 45 0000 0011 + 61*3, 62*3, 0, // 46 0000 0000 + 0, 0, 0x0a01, // 47 0010 0111. + 0, 0, 0x0d01, // 48 0010 0000. + 0, 0, 0x0006, // 49 0010 0001. + 0, 0, 0x0103, // 50 0010 0101. + 0, 0, 0x0005, // 51 0010 0110. + 0, 0, 0x0302, // 52 0010 0100. + 0, 0, 0x0b01, // 53 0010 0011. + 0, 0, 0x0c01, // 54 0010 0010. + 76*3, 75*3, 0, // 55 0000 0010 0 + 67*3, 70*3, 0, // 56 0000 0001 1 + 73*3, 71*3, 0, // 57 0000 0010 1 + 78*3, 74*3, 0, // 58 0000 0011 1 + 72*3, 77*3, 0, // 59 0000 0011 0 + 69*3, 64*3, 0, // 60 0000 0001 0 + 68*3, 63*3, 0, // 61 0000 0000 0 + 66*3, 65*3, 0, // 62 0000 0000 1 + 81*3, 87*3, 0, // 63 0000 0000 01 + 91*3, 80*3, 0, // 64 0000 0001 01 + 82*3, 79*3, 0, // 65 0000 0000 11 + 83*3, 86*3, 0, // 66 0000 0000 10 + 93*3, 92*3, 0, // 67 0000 0001 10 + 84*3, 85*3, 0, // 68 0000 0000 00 + 90*3, 94*3, 0, // 69 0000 0001 00 + 88*3, 89*3, 0, // 70 0000 0001 11 + 0, 0, 0x0203, // 71 0000 0010 11. + 0, 0, 0x0104, // 72 0000 0011 00. + 0, 0, 0x0007, // 73 0000 0010 10. + 0, 0, 0x0402, // 74 0000 0011 11. + 0, 0, 0x0502, // 75 0000 0010 01. + 0, 0, 0x1001, // 76 0000 0010 00. + 0, 0, 0x0f01, // 77 0000 0011 01. + 0, 0, 0x0e01, // 78 0000 0011 10. + 105*3, 107*3, 0, // 79 0000 0000 111 + 111*3, 114*3, 0, // 80 0000 0001 011 + 104*3, 97*3, 0, // 81 0000 0000 010 + 125*3, 119*3, 0, // 82 0000 0000 110 + 96*3, 98*3, 0, // 83 0000 0000 100 + -1, 123*3, 0, // 84 0000 0000 000 + 95*3, 101*3, 0, // 85 0000 0000 001 + 106*3, 121*3, 0, // 86 0000 0000 101 + 99*3, 102*3, 0, // 87 0000 0000 011 + 113*3, 103*3, 0, // 88 0000 0001 110 + 112*3, 116*3, 0, // 89 0000 0001 111 + 110*3, 100*3, 0, // 90 0000 0001 000 + 124*3, 115*3, 0, // 91 0000 0001 010 + 117*3, 122*3, 0, // 92 0000 0001 101 + 109*3, 118*3, 0, // 93 0000 0001 100 + 120*3, 108*3, 0, // 94 0000 0001 001 + 127*3, 136*3, 0, // 95 0000 0000 0010 + 139*3, 140*3, 0, // 96 0000 0000 1000 + 130*3, 126*3, 0, // 97 0000 0000 0101 + 145*3, 146*3, 0, // 98 0000 0000 1001 + 128*3, 129*3, 0, // 99 0000 0000 0110 + 0, 0, 0x0802, // 100 0000 0001 0001. + 132*3, 134*3, 0, // 101 0000 0000 0011 + 155*3, 154*3, 0, // 102 0000 0000 0111 + 0, 0, 0x0008, // 103 0000 0001 1101. + 137*3, 133*3, 0, // 104 0000 0000 0100 + 143*3, 144*3, 0, // 105 0000 0000 1110 + 151*3, 138*3, 0, // 106 0000 0000 1010 + 142*3, 141*3, 0, // 107 0000 0000 1111 + 0, 0, 0x000a, // 108 0000 0001 0011. + 0, 0, 0x0009, // 109 0000 0001 1000. + 0, 0, 0x000b, // 110 0000 0001 0000. + 0, 0, 0x1501, // 111 0000 0001 0110. + 0, 0, 0x0602, // 112 0000 0001 1110. + 0, 0, 0x0303, // 113 0000 0001 1100. + 0, 0, 0x1401, // 114 0000 0001 0111. + 0, 0, 0x0702, // 115 0000 0001 0101. + 0, 0, 0x1101, // 116 0000 0001 1111. + 0, 0, 0x1201, // 117 0000 0001 1010. + 0, 0, 0x1301, // 118 0000 0001 1001. + 148*3, 152*3, 0, // 119 0000 0000 1101 + 0, 0, 0x0403, // 120 0000 0001 0010. + 153*3, 150*3, 0, // 121 0000 0000 1011 + 0, 0, 0x0105, // 122 0000 0001 1011. + 131*3, 135*3, 0, // 123 0000 0000 0001 + 0, 0, 0x0204, // 124 0000 0001 0100. + 149*3, 147*3, 0, // 125 0000 0000 1100 + 172*3, 173*3, 0, // 126 0000 0000 0101 1 + 162*3, 158*3, 0, // 127 0000 0000 0010 0 + 170*3, 161*3, 0, // 128 0000 0000 0110 0 + 168*3, 166*3, 0, // 129 0000 0000 0110 1 + 157*3, 179*3, 0, // 130 0000 0000 0101 0 + 169*3, 167*3, 0, // 131 0000 0000 0001 0 + 174*3, 171*3, 0, // 132 0000 0000 0011 0 + 178*3, 177*3, 0, // 133 0000 0000 0100 1 + 156*3, 159*3, 0, // 134 0000 0000 0011 1 + 164*3, 165*3, 0, // 135 0000 0000 0001 1 + 183*3, 182*3, 0, // 136 0000 0000 0010 1 + 175*3, 176*3, 0, // 137 0000 0000 0100 0 + 0, 0, 0x0107, // 138 0000 0000 1010 1. + 0, 0, 0x0a02, // 139 0000 0000 1000 0. + 0, 0, 0x0902, // 140 0000 0000 1000 1. + 0, 0, 0x1601, // 141 0000 0000 1111 1. + 0, 0, 0x1701, // 142 0000 0000 1111 0. + 0, 0, 0x1901, // 143 0000 0000 1110 0. + 0, 0, 0x1801, // 144 0000 0000 1110 1. + 0, 0, 0x0503, // 145 0000 0000 1001 0. + 0, 0, 0x0304, // 146 0000 0000 1001 1. + 0, 0, 0x000d, // 147 0000 0000 1100 1. + 0, 0, 0x000c, // 148 0000 0000 1101 0. + 0, 0, 0x000e, // 149 0000 0000 1100 0. + 0, 0, 0x000f, // 150 0000 0000 1011 1. + 0, 0, 0x0205, // 151 0000 0000 1010 0. + 0, 0, 0x1a01, // 152 0000 0000 1101 1. + 0, 0, 0x0106, // 153 0000 0000 1011 0. + 180*3, 181*3, 0, // 154 0000 0000 0111 1 + 160*3, 163*3, 0, // 155 0000 0000 0111 0 + 196*3, 199*3, 0, // 156 0000 0000 0011 10 + 0, 0, 0x001b, // 157 0000 0000 0101 00. + 203*3, 185*3, 0, // 158 0000 0000 0010 01 + 202*3, 201*3, 0, // 159 0000 0000 0011 11 + 0, 0, 0x0013, // 160 0000 0000 0111 00. + 0, 0, 0x0016, // 161 0000 0000 0110 01. + 197*3, 207*3, 0, // 162 0000 0000 0010 00 + 0, 0, 0x0012, // 163 0000 0000 0111 01. + 191*3, 192*3, 0, // 164 0000 0000 0001 10 + 188*3, 190*3, 0, // 165 0000 0000 0001 11 + 0, 0, 0x0014, // 166 0000 0000 0110 11. + 184*3, 194*3, 0, // 167 0000 0000 0001 01 + 0, 0, 0x0015, // 168 0000 0000 0110 10. + 186*3, 193*3, 0, // 169 0000 0000 0001 00 + 0, 0, 0x0017, // 170 0000 0000 0110 00. + 204*3, 198*3, 0, // 171 0000 0000 0011 01 + 0, 0, 0x0019, // 172 0000 0000 0101 10. + 0, 0, 0x0018, // 173 0000 0000 0101 11. + 200*3, 205*3, 0, // 174 0000 0000 0011 00 + 0, 0, 0x001f, // 175 0000 0000 0100 00. + 0, 0, 0x001e, // 176 0000 0000 0100 01. + 0, 0, 0x001c, // 177 0000 0000 0100 11. + 0, 0, 0x001d, // 178 0000 0000 0100 10. + 0, 0, 0x001a, // 179 0000 0000 0101 01. + 0, 0, 0x0011, // 180 0000 0000 0111 10. + 0, 0, 0x0010, // 181 0000 0000 0111 11. + 189*3, 206*3, 0, // 182 0000 0000 0010 11 + 187*3, 195*3, 0, // 183 0000 0000 0010 10 + 218*3, 211*3, 0, // 184 0000 0000 0001 010 + 0, 0, 0x0025, // 185 0000 0000 0010 011. + 215*3, 216*3, 0, // 186 0000 0000 0001 000 + 0, 0, 0x0024, // 187 0000 0000 0010 100. + 210*3, 212*3, 0, // 188 0000 0000 0001 110 + 0, 0, 0x0022, // 189 0000 0000 0010 110. + 213*3, 209*3, 0, // 190 0000 0000 0001 111 + 221*3, 222*3, 0, // 191 0000 0000 0001 100 + 219*3, 208*3, 0, // 192 0000 0000 0001 101 + 217*3, 214*3, 0, // 193 0000 0000 0001 001 + 223*3, 220*3, 0, // 194 0000 0000 0001 011 + 0, 0, 0x0023, // 195 0000 0000 0010 101. + 0, 0, 0x010b, // 196 0000 0000 0011 100. + 0, 0, 0x0028, // 197 0000 0000 0010 000. + 0, 0, 0x010c, // 198 0000 0000 0011 011. + 0, 0, 0x010a, // 199 0000 0000 0011 101. + 0, 0, 0x0020, // 200 0000 0000 0011 000. + 0, 0, 0x0108, // 201 0000 0000 0011 111. + 0, 0, 0x0109, // 202 0000 0000 0011 110. + 0, 0, 0x0026, // 203 0000 0000 0010 010. + 0, 0, 0x010d, // 204 0000 0000 0011 010. + 0, 0, 0x010e, // 205 0000 0000 0011 001. + 0, 0, 0x0021, // 206 0000 0000 0010 111. + 0, 0, 0x0027, // 207 0000 0000 0010 001. + 0, 0, 0x1f01, // 208 0000 0000 0001 1011. + 0, 0, 0x1b01, // 209 0000 0000 0001 1111. + 0, 0, 0x1e01, // 210 0000 0000 0001 1100. + 0, 0, 0x1002, // 211 0000 0000 0001 0101. + 0, 0, 0x1d01, // 212 0000 0000 0001 1101. + 0, 0, 0x1c01, // 213 0000 0000 0001 1110. + 0, 0, 0x010f, // 214 0000 0000 0001 0011. + 0, 0, 0x0112, // 215 0000 0000 0001 0000. + 0, 0, 0x0111, // 216 0000 0000 0001 0001. + 0, 0, 0x0110, // 217 0000 0000 0001 0010. + 0, 0, 0x0603, // 218 0000 0000 0001 0100. + 0, 0, 0x0b02, // 219 0000 0000 0001 1010. + 0, 0, 0x0e02, // 220 0000 0000 0001 0111. + 0, 0, 0x0d02, // 221 0000 0000 0001 1000. + 0, 0, 0x0c02, // 222 0000 0000 0001 1001. + 0, 0, 0x0f02 // 223 0000 0000 0001 0110. +]); + +MPEG1.PICTURE_TYPE = { + INTRA: 1, + PREDICTIVE: 2, + B: 3 +}; + +MPEG1.START = { + SEQUENCE: 0xB3, + SLICE_FIRST: 0x01, + SLICE_LAST: 0xAF, + PICTURE: 0x00, + EXTENSION: 0xB5, + USER_DATA: 0xB2 +}; + +return MPEG1; + +})(); + diff --git a/cvat-data/src/js/3rdparty/ts.js b/cvat-data/src/js/3rdparty/ts.js new file mode 100644 index 000000000000..0b83f2ec8b0f --- /dev/null +++ b/cvat-data/src/js/3rdparty/ts.js @@ -0,0 +1,230 @@ +const BitBuffer = require('./buffer'); + +module.exports = (function(){ "use strict"; + +var TS = function(options) { + this.bits = null; + this.leftoverBytes = null; + + this.guessVideoFrameEnd = true; + this.pidsToStreamIds = {}; + + this.pesPacketInfo = {}; + this.startTime = 0; + this.currentTime = 0; +}; + +TS.prototype.connect = function(streamId, destination) { + this.pesPacketInfo[streamId] = { + destination: destination, + currentLength: 0, + totalLength: 0, + pts: 0, + buffers: [] + }; +}; + +TS.prototype.write = function(buffer) { + if (this.leftoverBytes) { + var totalLength = buffer.byteLength + this.leftoverBytes.byteLength; + this.bits = new BitBuffer(totalLength); + this.bits.write([this.leftoverBytes, buffer]); + } + else { + this.bits = new BitBuffer(buffer); + } + + while (this.bits.has(188 << 3) && this.parsePacket()) {} + + var leftoverCount = this.bits.byteLength - (this.bits.index >> 3); + this.leftoverBytes = leftoverCount > 0 + ? this.bits.bytes.subarray(this.bits.index >> 3) + : null; +}; + +TS.prototype.parsePacket = function() { + // Check if we're in sync with packet boundaries; attempt to resync if not. + if (this.bits.read(8) !== 0x47) { + if (!this.resync()) { + // Couldn't resync; maybe next time... + return false; + } + } + + var end = (this.bits.index >> 3) + 187; + var transportError = this.bits.read(1), + payloadStart = this.bits.read(1), + transportPriority = this.bits.read(1), + pid = this.bits.read(13), + transportScrambling = this.bits.read(2), + adaptationField = this.bits.read(2), + continuityCounter = this.bits.read(4); + + + // If this is the start of a new payload; signal the end of the previous + // frame, if we didn't do so already. + var streamId = this.pidsToStreamIds[pid]; + if (payloadStart && streamId) { + var pi = this.pesPacketInfo[streamId]; + if (pi && pi.currentLength) { + this.packetComplete(pi); + } + } + + // Extract current payload + if (adaptationField & 0x1) { + if ((adaptationField & 0x2)) { + var adaptationFieldLength = this.bits.read(8); + this.bits.skip(adaptationFieldLength << 3); + } + + if (payloadStart && this.bits.nextBytesAreStartCode()) { + this.bits.skip(24); + streamId = this.bits.read(8); + this.pidsToStreamIds[pid] = streamId; + + var packetLength = this.bits.read(16) + this.bits.skip(8); + var ptsDtsFlag = this.bits.read(2); + this.bits.skip(6); + var headerLength = this.bits.read(8); + var payloadBeginIndex = this.bits.index + (headerLength << 3); + + var pi = this.pesPacketInfo[streamId]; + if (pi) { + var pts = 0; + if (ptsDtsFlag & 0x2) { + // The Presentation Timestamp is encoded as 33(!) bit + // integer, but has a "marker bit" inserted at weird places + // in between, making the whole thing 5 bytes in size. + // You can't make this shit up... + this.bits.skip(4); + var p32_30 = this.bits.read(3); + this.bits.skip(1); + var p29_15 = this.bits.read(15); + this.bits.skip(1); + var p14_0 = this.bits.read(15); + this.bits.skip(1); + + // Can't use bit shifts here; we need 33 bits of precision, + // so we're using JavaScript's double number type. Also + // divide by the 90khz clock to get the pts in seconds. + pts = (p32_30 * 1073741824 + p29_15 * 32768 + p14_0)/90000; + + this.currentTime = pts; + if (this.startTime === -1) { + this.startTime = pts; + } + } + + var payloadLength = packetLength + ? packetLength - headerLength - 3 + : 0; + this.packetStart(pi, pts, payloadLength); + } + + // Skip the rest of the header without parsing it + this.bits.index = payloadBeginIndex; + } + + if (streamId) { + // Attempt to detect if the PES packet is complete. For Audio (and + // other) packets, we received a total packet length with the PES + // header, so we can check the current length. + + // For Video packets, we have to guess the end by detecting if this + // TS packet was padded - there's no good reason to pad a TS packet + // in between, but it might just fit exactly. If this fails, we can + // only wait for the next PES header for that stream. + + var pi = this.pesPacketInfo[streamId]; + if (pi) { + var start = this.bits.index >> 3; + var complete = this.packetAddData(pi, start, end); + + var hasPadding = !payloadStart && (adaptationField & 0x2); + if (complete || (this.guessVideoFrameEnd && hasPadding)) { + this.packetComplete(pi); + } + } + } + } + + this.bits.index = end << 3; + return true; +}; + +TS.prototype.resync = function() { + // Check if we have enough data to attempt a resync. We need 5 full packets. + if (!this.bits.has((188 * 6) << 3)) { + return false; + } + + var byteIndex = this.bits.index >> 3; + + // Look for the first sync token in the first 187 bytes + for (var i = 0; i < 187; i++) { + if (this.bits.bytes[byteIndex + i] === 0x47) { + + // Look for 4 more sync tokens, each 188 bytes appart + var foundSync = true; + for (var j = 1; j < 5; j++) { + if (this.bits.bytes[byteIndex + i + 188 * j] !== 0x47) { + foundSync = false; + break; + } + } + + if (foundSync) { + this.bits.index = (byteIndex + i + 1) << 3; + return true; + } + } + } + + // In theory, we shouldn't arrive here. If we do, we had enough data but + // still didn't find sync - this can only happen if we were fed garbage + // data. Check your source! + console.warn('JSMpeg: Possible garbage data. Skipping.'); + this.bits.skip(187 << 3); + return false; +}; + +TS.prototype.packetStart = function(pi, pts, payloadLength) { + pi.totalLength = payloadLength; + pi.currentLength = 0; + pi.pts = pts; +}; + +TS.prototype.packetAddData = function(pi, start, end) { + pi.buffers.push(this.bits.bytes.subarray(start, end)); + pi.currentLength += end - start; + + var complete = (pi.totalLength !== 0 && pi.currentLength >= pi.totalLength); + return complete; +}; + +TS.prototype.packetComplete = function(pi) { + pi.destination.write(pi.pts, pi.buffers); + pi.totalLength = 0; + pi.currentLength = 0; + pi.buffers = []; +}; + +TS.STREAM = { + PACK_HEADER: 0xBA, + SYSTEM_HEADER: 0xBB, + PROGRAM_MAP: 0xBC, + PRIVATE_1: 0xBD, + PADDING: 0xBE, + PRIVATE_2: 0xBF, + AUDIO_1: 0xC0, + VIDEO_1: 0xE0, + DIRECTORY: 0xFF +}; + +return TS; + +})(); + + diff --git a/cvat-data/src/js/3rdparty_patch.diff b/cvat-data/src/js/3rdparty_patch.diff new file mode 100644 index 000000000000..a88930a52ee0 --- /dev/null +++ b/cvat-data/src/js/3rdparty_patch.diff @@ -0,0 +1,361 @@ +diff -u 3rdparty/buffer.js 3rdparty_edited/buffer.js +--- 3rdparty/buffer.js 2019-09-16 13:40:39.797780000 +0300 ++++ 3rdparty_edited/buffer.js 2019-09-16 14:06:11.377803000 +0300 +@@ -1,15 +1,15 @@ +-JSMpeg.BitBuffer = (function(){ "use strict"; ++module.exports = (function(){ "use strict"; + + var BitBuffer = function(bufferOrLength, mode) { + if (typeof(bufferOrLength) === 'object') { + this.bytes = (bufferOrLength instanceof Uint8Array) +- ? bufferOrLength ++ ? bufferOrLength + : new Uint8Array(bufferOrLength); + + this.byteLength = this.bytes.length; + } + else { +- this.bytes = new Uint8Array(bufferOrLength || 1024*1024); ++ this.bytes = new Uint8Array(bufferOrLength || 1024*1024); + this.byteLength = 0; + } + +@@ -30,7 +30,7 @@ + BitBuffer.prototype.evict = function(sizeNeeded) { + var bytePos = this.index >> 3, + available = this.bytes.length - this.byteLength; +- ++ + // If the current index is the write position, we can simply reset both + // to 0. Also reset (and throw away yet unread data) if we won't be able + // to fit the new data in even after a normal eviction. +@@ -46,8 +46,8 @@ + // Nothing read yet - we can't evict anything + return; + } +- +- // Some browsers don't support copyWithin() yet - we may have to do ++ ++ // Some browsers don't support copyWithin() yet - we may have to do + // it manually using set and a subarray + if (this.bytes.copyWithin) { + this.bytes.copyWithin(0, bytePos, this.byteLength); +@@ -105,14 +105,14 @@ + + BitBuffer.prototype.appendSingleBuffer = function(buffer) { + buffer = buffer instanceof Uint8Array +- ? buffer ++ ? buffer + : new Uint8Array(buffer); +- ++ + this.bytes.set(buffer, this.byteLength); + this.byteLength += buffer.length; + }; + +-BitBuffer.prototype.findNextStartCode = function() { ++BitBuffer.prototype.findNextStartCode = function() { + for (var i = (this.index+7 >> 3); i < this.byteLength; i++) { + if( + this.bytes[i] == 0x00 && +@@ -142,7 +142,7 @@ + var i = (this.index+7 >> 3); + return ( + i >= this.byteLength || ( +- this.bytes[i] == 0x00 && ++ this.bytes[i] == 0x00 && + this.bytes[i+1] == 0x00 && + this.bytes[i+2] == 0x01 + ) +diff -u 3rdparty/decoder.js 3rdparty_edited/decoder.js +--- 3rdparty/decoder.js 2019-09-16 13:40:52.813780000 +0300 ++++ 3rdparty_edited/decoder.js 2019-09-16 14:13:43.357810000 +0300 +@@ -1,4 +1,4 @@ +-JSMpeg.Decoder.Base = (function(){ "use strict"; ++module.exports = (function(){ "use strict"; + + var BaseDecoder = function(options) { + this.destination = null; +@@ -89,7 +89,7 @@ + // to advance the decoded time manually and can instead sync it exactly + // to the PTS. + if ( +- newTimestampIndex !== -1 && ++ newTimestampIndex !== -1 && + newTimestampIndex !== this.timestampIndex + ) { + this.timestampIndex = newTimestampIndex; +diff -u 3rdparty/jsmpeg.js 3rdparty_edited/jsmpeg.js +--- 3rdparty/jsmpeg.js 2019-09-16 13:40:58.645781000 +0300 ++++ 3rdparty_edited/jsmpeg.js 2019-09-16 14:07:41.681805000 +0300 +@@ -3,7 +3,7 @@ + + // This sets up the JSMpeg "Namespace". The object is empty apart from the Now() + // utility function and the automatic CreateVideoElements() after DOMReady. +-var JSMpeg = { ++module.exports = { + + // The Player sets up the connections between source, demuxer, decoders, + // renderer and audio output. It ties everything together, is responsible +@@ -15,7 +15,7 @@ + // the video and handles Audio unlocking on iOS. VideoElements can be + // created directly in HTML using the
tag. + VideoElement: null, +- ++ + // The BitBuffer wraps a Uint8Array and allows reading an arbitrary number + // of bits at a time. On writing, the BitBuffer either expands its + // internal buffer (for static files) or deletes old data (for streaming). +@@ -30,7 +30,7 @@ + // .established - boolean, true after connection is established + // .completed - boolean, true if the source is completely loaded + // .progress - float 0-1 +- Source: {}, ++ Source: {}, + + // A Demuxer may sit between a Source and a Decoder. It separates the + // incoming raw data into Video, Audio and other Streams. API: +@@ -68,19 +68,10 @@ + // .stop() + // .enqueuedTime - float, in seconds + // .enabled - wether the output does anything upon receiving data +- AudioOutput: {}, ++ AudioOutput: {}, + + Now: function() { +- return window.performance +- ? window.performance.now() / 1000 +- : Date.now() / 1000; +- }, +- +- CreateVideoElements: function() { +- var elements = document.querySelectorAll('.jsmpeg'); +- for (var i = 0; i < elements.length; i++) { +- new JSMpeg.VideoElement(elements[i]); +- } ++ return Date.now() / 1000; + }, + + Fill: function(array, value) { +@@ -94,29 +85,9 @@ + } + }, + +- Base64ToArrayBuffer: function(base64) { +- var binary = window.atob(base64); +- var length = binary.length; +- var bytes = new Uint8Array(length); +- for (var i = 0; i < length; i++) { +- bytes[i] = binary.charCodeAt(i); +- } +- return bytes.buffer; +- }, +- +- // The build process may append `JSMpeg.WASM_BINARY_INLINED = base64data;` ++ // The build process may append `JSMpeg.WASM_BINARY_INLINED = base64data;` + // to the minified source. + // If this property is present, jsmpeg will use the inlined binary data + // instead of trying to load a jsmpeg.wasm file via Ajax. + WASM_BINARY_INLINED: null + }; +- +-// Automatically create players for all found
elements. +-if (document.readyState === 'complete') { +- JSMpeg.CreateVideoElements(); +-} +-else { +- document.addEventListener('DOMContentLoaded', JSMpeg.CreateVideoElements); +-} +- +- +diff -u 3rdparty/mpeg1.js 3rdparty_edited/mpeg1.js +--- 3rdparty/mpeg1.js 2019-09-16 13:41:04.889781000 +0300 ++++ 3rdparty_edited/mpeg1.js 2019-09-18 13:09:34.921018429 +0300 +@@ -1,19 +1,24 @@ +-JSMpeg.Decoder.MPEG1Video = (function(){ "use strict"; ++const BaseDecoder = require('./decoder'); ++const BitBuffer = require('./buffer'); ++const now = require('./jsmpeg').Now; ++const fill = require('./jsmpeg').Now; + +-// Inspired by Java MPEG-1 Video Decoder and Player by Zoltan Korandi ++module.exports = (function(){ "use strict"; ++ ++// Inspired by Java MPEG-1 Video Decoder and Player by Zoltan Korandi + // https://sourceforge.net/projects/javampeg1video/ + + var MPEG1 = function(options) { +- JSMpeg.Decoder.Base.call(this, options); ++ BaseDecoder.call(this, options); + + this.onDecodeCallback = options.onVideoDecode; + + var bufferSize = options.videoBufferSize || 512*1024; + var bufferMode = options.streaming +- ? JSMpeg.BitBuffer.MODE.EVICT +- : JSMpeg.BitBuffer.MODE.EXPAND; ++ ? BitBuffer.MODE.EVICT ++ : BitBuffer.MODE.EXPAND; + +- this.bits = new JSMpeg.BitBuffer(bufferSize, bufferMode); ++ this.bits = new BitBuffer(bufferSize, bufferMode); + + this.customIntraQuantMatrix = new Uint8Array(64); + this.customNonIntraQuantMatrix = new Uint8Array(64); +@@ -23,11 +28,11 @@ + this.decodeFirstFrame = options.decodeFirstFrame !== false; + }; + +-MPEG1.prototype = Object.create(JSMpeg.Decoder.Base.prototype); ++MPEG1.prototype = Object.create(BaseDecoder.prototype); + MPEG1.prototype.constructor = MPEG1; + + MPEG1.prototype.write = function(pts, buffers) { +- JSMpeg.Decoder.Base.prototype.write.call(this, pts, buffers); ++ BaseDecoder.prototype.write.call(this, pts, buffers); + + if (!this.hasSequenceHeader) { + if (this.bits.findStartCode(MPEG1.START.SEQUENCE) === -1) { +@@ -42,8 +47,8 @@ + }; + + MPEG1.prototype.decode = function() { +- var startTime = JSMpeg.Now(); +- ++ var startTime = now(); ++ + if (!this.hasSequenceHeader) { + return false; + } +@@ -53,14 +58,15 @@ + return false; + } + +- this.decodePicture(); ++ const result = this.decodePicture(); + this.advanceDecodedTime(1/this.frameRate); + +- var elapsedTime = JSMpeg.Now() - startTime; ++ var elapsedTime = now() - startTime; + if (this.onDecodeCallback) { + this.onDecodeCallback(this, elapsedTime); + } +- return true; ++ ++ return result; + }; + + MPEG1.prototype.readHuffman = function(codeTable) { +@@ -212,11 +218,6 @@ + this.bits.rewind(32); + } + +- // Invoke decode callbacks +- if (this.destination) { +- this.destination.render(this.currentY, this.currentCr, this.currentCb, true); +- } +- + // If this is a reference picutre then rotate the prediction pointers + if ( + this.pictureType === MPEG1.PICTURE_TYPE.INTRA || +@@ -244,6 +245,8 @@ + this.currentCb = tmpCb; + this.currentCb32 = tmpCb32; + } ++ ++ return [this.currentY, this.currentCr, this.currentCb, this.codedWidth, this.codedHeight]; + }; + + +@@ -842,7 +845,7 @@ + else { + MPEG1.IDCT(this.blockData); + MPEG1.CopyBlockToDestination(this.blockData, destArray, destIndex, scan); +- JSMpeg.Fill(this.blockData, 0); ++ fill(this.blockData, 0); + } + } + else { +@@ -854,7 +857,7 @@ + else { + MPEG1.IDCT(this.blockData); + MPEG1.AddBlockToDestination(this.blockData, destArray, destIndex, scan); +- JSMpeg.Fill(this.blockData, 0); ++ fill(this.blockData, 0); + } + } + +diff -u 3rdparty/ts.js 3rdparty_edited/ts.js +--- 3rdparty/ts.js 2019-09-10 11:58:32.265852000 +0300 ++++ 3rdparty_edited/ts.js 2019-09-16 14:19:38.941816000 +0300 +@@ -1,4 +1,6 @@ +-JSMpeg.Demuxer.TS = (function(){ "use strict"; ++const BitBuffer = require('./buffer'); ++ ++module.exports = (function(){ "use strict"; + + var TS = function(options) { + this.bits = null; +@@ -25,11 +27,11 @@ + TS.prototype.write = function(buffer) { + if (this.leftoverBytes) { + var totalLength = buffer.byteLength + this.leftoverBytes.byteLength; +- this.bits = new JSMpeg.BitBuffer(totalLength); ++ this.bits = new BitBuffer(totalLength); + this.bits.write([this.leftoverBytes, buffer]); + } + else { +- this.bits = new JSMpeg.BitBuffer(buffer); ++ this.bits = new BitBuffer(buffer); + } + + while (this.bits.has(188 << 3) && this.parsePacket()) {} +@@ -87,7 +89,7 @@ + this.bits.skip(6); + var headerLength = this.bits.read(8); + var payloadBeginIndex = this.bits.index + (headerLength << 3); +- ++ + var pi = this.pesPacketInfo[streamId]; + if (pi) { + var pts = 0; +@@ -108,14 +110,14 @@ + // so we're using JavaScript's double number type. Also + // divide by the 90khz clock to get the pts in seconds. + pts = (p32_30 * 1073741824 + p29_15 * 32768 + p14_0)/90000; +- ++ + this.currentTime = pts; + if (this.startTime === -1) { + this.startTime = pts; + } + } + +- var payloadLength = packetLength ++ var payloadLength = packetLength + ? packetLength - headerLength - 3 + : 0; + this.packetStart(pi, pts, payloadLength); +@@ -127,11 +129,11 @@ + + if (streamId) { + // Attempt to detect if the PES packet is complete. For Audio (and +- // other) packets, we received a total packet length with the PES ++ // other) packets, we received a total packet length with the PES + // header, so we can check the current length. + + // For Video packets, we have to guess the end by detecting if this +- // TS packet was padded - there's no good reason to pad a TS packet ++ // TS packet was padded - there's no good reason to pad a TS packet + // in between, but it might just fit exactly. If this fails, we can + // only wait for the next PES header for that stream. + +@@ -142,7 +144,7 @@ + + var hasPadding = !payloadStart && (adaptationField & 0x2); + if (complete || (this.guessVideoFrameEnd && hasPadding)) { +- this.packetComplete(pi); ++ this.packetComplete(pi); + } + } + } diff --git a/cvat-data/src/js/cvat-data.js b/cvat-data/src/js/cvat-data.js new file mode 100755 index 000000000000..7f3624ccbc51 --- /dev/null +++ b/cvat-data/src/js/cvat-data.js @@ -0,0 +1,152 @@ +/* +* Copyright (C) 2019 Intel Corporation +* SPDX-License-Identifier: MIT +*/ + +/* global + require:true +*/ +// require("./decode_video") +const BlockType = Object.freeze({ + TSVIDEO: 'tsvideo', + ARCHIVE: 'archive', +}); + +class FrameProvider { + constructor(memory, blockType, blockSize) { + this._frames = {}; + this._memory = Math.max(1, memory); // number of stored blocks + this._blocks_ranges = []; + this._blocks = {}; + this._blockSize = blockSize; + this._running = false; + this._blockType = blockType; + this._currFrame = -1; + this._width = null; + this._height = null; + } + + /* This method removes extra data from a cache when memory overflow */ + _cleanup() { + if (this._blocks_ranges.length > this._memory) { + const shifted = this._blocks_ranges.shift(); // get the oldest block + const [start, end] = shifted.split(':').map((el) => +el); + delete this._blocks[start / this._blockSize]; + } + + // remove frames from pre-previose blocks + if (this._blocks_ranges.length > 1) + { + const secondFromEnd = this._blocks_ranges[this._blocks_ranges.length - 2]; + const [start, end] = secondFromEnd.split(':').map((el) => +el); + for (let i = start; i <= end; i++) { + delete this._frames[i]; + } + } + } + + setRenderSize(width, height){ + this._width = width; + this._height = height; + } + + /* Method returns frame from collection. Else method returns 0 */ + frame(frameNumber) { + if (frameNumber in this._frames) { + return this._frames[frameNumber]; + } + return null; + } + + isNextChunkExists(frameNumber) { + const nextChunkNum = Math.floor(frameNumber / this._blockSize) + 1; + if (this._blocks[nextChunkNum] === "loading"){ + return true; + } + else + return nextChunkNum in this._blocks; + } + + /* + Method start asynchronic decode a block of data + + @param block - is a data from a server as is (ts file or archive) + @param start {number} - is the first frame of a block + @param end {number} - is the last frame of a block + 1 + @param callback - callback) + + */ + + setReadyToLoading(chunkNumber) { + this._blocks[chunkNumber] = "loading"; + } + + startDecode(block, start, end, callback) + { + if (this._blockType === BlockType.TSVIDEO){ + if (this._running) { + throw new Error('Decoding has already running'); + } + + for (let i = start; i < end; i++){ + this._frames[i] = 'loading'; + } + + this._blocks[Math.floor((start+1)/ this._blockSize)] = block; + this._blocks_ranges.push(`${start}:${end}`); + this._cleanup(); + + const worker = new Worker('/static/engine/js/decode_video.js'); + + worker.onerror = (function (e) { + console.log(['ERROR: Line ', e.lineno, ' in ', e.filename, ': ', e.message].join('')); + }); + + worker.postMessage({block : block, + start : start, + end : end, + width : this._width, + height : this._height}); + + + worker.onmessage = (function (event){ + this._frames[event.data.index] = event.data.data; + callback(event.data.index); + }).bind(this); + + } else { + const worker = new Worker('/static/engine/js/unzip_imgs.js'); + + worker.onerror = (function (e) { + console.log(['ERROR: Line ', e.lineno, ' in ', e.filename, ': ', e.message].join('')); + }); + + worker.postMessage({block : block, + start : start, + end : end }); + + + worker.onmessage = (function (event){ + this._frames[event.data.index] = event.data.data; + callback(event.data.index); + + }).bind(this); + } + } + + + /* + Method returns a list of cached ranges + Is an array of strings like "start:end" + */ + get cachedFrames() { + return [...this._blocks_ranges].sort( + (a, b) => a.split(':')[0] - b.split(':')[0], + ); + } +} + +module.exports = { + FrameProvider, + BlockType, +}; diff --git a/cvat-data/src/js/decode_video.js b/cvat-data/src/js/decode_video.js new file mode 100644 index 000000000000..6ffcc1cf5136 --- /dev/null +++ b/cvat-data/src/js/decode_video.js @@ -0,0 +1,107 @@ +const JSMpeg = require('./jsmpeg'); +const jpeg = require('./pttjpeg') +const jsjpeg = require('jpeg-js') +const Base64 = require('js-base64').Base64; + +/* This function is a modified version of function from jsmpeg + which converts an image from YCbCr space to RGBA space +*/ +function YCbCrToRGBA(y, cb, cr, width, height) { + const rgba = new Uint8ClampedArray(width * height * 4).fill(255); + const w = ((width + 15) >> 4) << 4; + const w2 = w >> 1; + + let yIndex1 = 0; + let yIndex2 = w; + const yNext2Lines = w + (w - width); + + let cIndex = 0; + const cNextLine = w2 - (width >> 1); + + let rgbaIndex1 = 0; + let rgbaIndex2 = width * 4; + const rgbaNext2Lines = width * 4; + + const cols = width >> 1; + const rows = height >> 1; + + let ccb = 0; + let ccr = 0; + let r = 0; + let g = 0; + let b = 0; + + for (let row = 0; row < rows; row++) { + for (let col = 0; col < cols; col++) { + ccb = cb[cIndex]; + ccr = cr[cIndex]; + cIndex++; + + r = (ccb + ((ccb * 103) >> 8)) - 179; + g = ((ccr * 88) >> 8) - 44 + ((ccb * 183) >> 8) - 91; + b = (ccr + ((ccr * 198) >> 8)) - 227; + + // Line 1 + const y1 = y[yIndex1++]; + const y2 = y[yIndex1++]; + rgba[rgbaIndex1] = y1 + r; + rgba[rgbaIndex1 + 1] = y1 - g; + rgba[rgbaIndex1 + 2] = y1 + b; + rgba[rgbaIndex1 + 4] = y2 + r; + rgba[rgbaIndex1 + 5] = y2 - g; + rgba[rgbaIndex1 + 6] = y2 + b; + rgbaIndex1 += 8; + + // Line 2 + const y3 = y[yIndex2++]; + const y4 = y[yIndex2++]; + rgba[rgbaIndex2] = y3 + r; + rgba[rgbaIndex2 + 1] = y3 - g; + rgba[rgbaIndex2 + 2] = y3 + b; + rgba[rgbaIndex2 + 4] = y4 + r; + rgba[rgbaIndex2 + 5] = y4 - g; + rgba[rgbaIndex2 + 6] = y4 + b; + rgbaIndex2 += 8; + } + + yIndex1 += yNext2Lines; + yIndex2 += yNext2Lines; + rgbaIndex1 += rgbaNext2Lines; + rgbaIndex2 += rgbaNext2Lines; + cIndex += cNextLine; + } + + return rgba; +} + +self.onmessage = function (e) { + + const block = e.data.block; + const start = e.data.start; + const end = e.data.end; + + videoDecoder = new JSMpeg.Decoder.MPEG1Video({decodeFirstFrame : false}); + demuxer = new JSMpeg.Demuxer.TS({}); + demuxer.connect(JSMpeg.Demuxer.TS.STREAM.VIDEO_1, videoDecoder); + demuxer.write(block); + + for (let i = start; i <= end; i++){ + var t0 = performance.now(); + + + const result = videoDecoder.decode(); + var t_decode = performance.now(); + console.log("decode " + i + " frame took " + (t_decode - t0) + " milliseconds."); + if (!Array.isArray(result)) { + const message = 'Result must be an array.' + + `Got ${result}. Possible reasons: ` + + 'bad video file, unpached jsmpeg'; + throw Error(message); + } + + + postMessage({fileName : null, index : i, data : YCbCrToRGBA(...result, e.data.width, e.data.height)}); + } + + self.close(); +} diff --git a/cvat-data/src/js/jsmpeg.js b/cvat-data/src/js/jsmpeg.js new file mode 100644 index 000000000000..8d2a4f64eb63 --- /dev/null +++ b/cvat-data/src/js/jsmpeg.js @@ -0,0 +1,16 @@ +/* +* Copyright (C) 2019 Intel Corporation +* SPDX-License-Identifier: MIT +*/ + +/* global + require:true +*/ + +const JSMpeg = require('./3rdparty/jsmpeg'); +JSMpeg.BitBuffer = require('./3rdparty/buffer'); +JSMpeg.Decoder.Base = require('./3rdparty/decoder'); +JSMpeg.Decoder.MPEG1Video = require('./3rdparty/mpeg1'); +JSMpeg.Demuxer.TS = require('./3rdparty/ts.js'); + +module.exports = JSMpeg; diff --git a/cvat-data/src/js/pttjpeg.js b/cvat-data/src/js/pttjpeg.js new file mode 100644 index 000000000000..6a4a0dfe41b6 --- /dev/null +++ b/cvat-data/src/js/pttjpeg.js @@ -0,0 +1,1408 @@ +/* @@-- + * Copyright (C) 2014 Alberto Vigata + * All rights reserved + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met + * + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * * Neither the name of the University of California, Berkeley nor the + * names of its contributors may be used to endorse or promote products + * derived from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND ANY + * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE REGENTS AND CONTRIBUTORS BE LIABLE FOR ANY + * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +(function namespace() { + + //------------------------------------------------------------------------------------------- + // Debugging support + //------------------------------------------------------------------------------------------- + + /*! sprintf.js + * + * Copyright (c) 2007-2014, Alexandru Marasteanu + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * * Neither the name of this software nor the names of its contributors may be + * used to endorse or promote products derived from this software without + * specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * usage: + * + * string sprintf(string format , [mixed arg1 [, mixed arg2 [ ,...]]]); + * + */ + var ct = {}; // This is a modification to the embedded sprintf.js logic so that it + // will attach itself to this object only. This is so that the embedded + // version of sprintf.js does not get exported out into the global / + // application environment. + + (function(ctx) { + var sprintf = function() { + if (!sprintf.cache.hasOwnProperty(arguments[0])) { + sprintf.cache[arguments[0]] = sprintf.parse(arguments[0]); + } + return sprintf.format.call(null, sprintf.cache[arguments[0]], arguments); + }; + + sprintf.format = function(parse_tree, argv) { + var cursor = 1, tree_length = parse_tree.length, node_type = '', arg, output = [], i, k, match, pad, pad_character, pad_length; + for (i = 0; i < tree_length; i++) { + node_type = get_type(parse_tree[i]); + if (node_type === 'string') { + output.push(parse_tree[i]); + } + else if (node_type === 'array') { + match = parse_tree[i]; // convenience purposes only + if (match[2]) { // keyword argument + arg = argv[cursor]; + for (k = 0; k < match[2].length; k++) { + if (!arg.hasOwnProperty(match[2][k])) { + throw(sprintf('[sprintf] property "%s" does not exist', match[2][k])); + } + arg = arg[match[2][k]]; + } + } + else if (match[1]) { // positional argument (explicit) + arg = argv[match[1]]; + } + else { // positional argument (implicit) + arg = argv[cursor++]; + } + + if (/[^s]/.test(match[8]) && (get_type(arg) != 'number')) { + throw(sprintf('[sprintf] expecting number but found %s', get_type(arg))); + } + switch (match[8]) { + case 'b': arg = arg.toString(2); break; + case 'c': arg = String.fromCharCode(arg); break; + case 'd': arg = parseInt(arg, 10); break; + case 'e': arg = match[7] ? arg.toExponential(match[7]) : arg.toExponential(); break; + case 'f': arg = match[7] ? parseFloat(arg).toFixed(match[7]) : parseFloat(arg); break; + case 'o': arg = arg.toString(8); break; + case 's': arg = ((arg = String(arg)) && match[7] ? arg.substring(0, match[7]) : arg); break; + case 'u': arg = arg >>> 0; break; + case 'x': arg = arg.toString(16); break; + case 'X': arg = arg.toString(16).toUpperCase(); break; + } + arg = (/[def]/.test(match[8]) && match[3] && arg >= 0 ? '+'+ arg : arg); + pad_character = match[4] ? match[4] == '0' ? '0' : match[4].charAt(1) : ' '; + pad_length = match[6] - String(arg).length; + pad = match[6] ? str_repeat(pad_character, pad_length) : ''; + output.push(match[5] ? arg + pad : pad + arg); + } + } + return output.join(''); + }; + + sprintf.cache = {}; + + sprintf.parse = function(fmt) { + var _fmt = fmt, match = [], parse_tree = [], arg_names = 0; + while (_fmt) { + if ((match = /^[^\x25]+/.exec(_fmt)) !== null) { + parse_tree.push(match[0]); + } + else if ((match = /^\x25{2}/.exec(_fmt)) !== null) { + parse_tree.push('%'); + } + else if ((match = /^\x25(?:([1-9]\d*)\$|\(([^\)]+)\))?(\+)?(0|'[^$])?(-)?(\d+)?(?:\.(\d+))?([b-fosuxX])/.exec(_fmt)) !== null) { + if (match[2]) { + arg_names |= 1; + var field_list = [], replacement_field = match[2], field_match = []; + if ((field_match = /^([a-z_][a-z_\d]*)/i.exec(replacement_field)) !== null) { + field_list.push(field_match[1]); + while ((replacement_field = replacement_field.substring(field_match[0].length)) !== '') { + if ((field_match = /^\.([a-z_][a-z_\d]*)/i.exec(replacement_field)) !== null) { + field_list.push(field_match[1]); + } + else if ((field_match = /^\[(\d+)\]/.exec(replacement_field)) !== null) { + field_list.push(field_match[1]); + } + else { + throw('[sprintf] huh?'); + } + } + } + else { + throw('[sprintf] huh?'); + } + match[2] = field_list; + } + else { + arg_names |= 2; + } + if (arg_names === 3) { + throw('[sprintf] mixing positional and named placeholders is not (yet) supported'); + } + parse_tree.push(match); + } + else { + throw('[sprintf] huh?'); + } + _fmt = _fmt.substring(match[0].length); + } + return parse_tree; + }; + + var vsprintf = function(fmt, argv, _argv) { + _argv = argv.slice(0); + _argv.splice(0, 0, fmt); + return sprintf.apply(null, _argv); + }; + + /** + * helpers + */ + function get_type(variable) { + return Object.prototype.toString.call(variable).slice(8, -1).toLowerCase(); + } + + function str_repeat(input, multiplier) { + for (var output = []; multiplier > 0; output[--multiplier] = input) {/* do nothing */} + return output.join(''); + } + + /** + * export to either browser or node.js + */ + ctx.sprintf = sprintf; + ctx.vsprintf = vsprintf; + })(ct); + var sprintf = ct.sprintf; + + var flagQuiet = false; + + function DEBUGMSG(x) { + if (flagQuiet) return; + + if( typeof importScripts != 'undefined' ) { + var m = { + 'log' : x, + 'reason' : 'log' + }; + postMessage(m); + } else if( typeof console != 'undefined' ) { + console.log(x); + } + } + + + //------------------------------------------------------------------------------------------- + // petitoJPEG routines + //------------------------------------------------------------------------------------------- + + /** + * BitWriter class + * + * A class to write bits to a random output + * + * Provide a byte sink by providing an object like ByteWriter with the setByteWriter method + * + */ + function BitWriter() { + var _this = this; + var bufsize = 1024; + var buf = new Uint8Array(bufsize); + var bufptr = 0; + var bitcount = 0; + var bitcache = 0; + var byteswritten = 0; + + // private methods + function reset_writer() { + byteswritten = 0; + bufptr = 0; + bitcount = 0; + }; + + function output_buffer() { + if(bw) { + bw.write(buf, 0, bufptr); + } + byteswritten += bufptr; + bufptr = 0; + }; + + function emptybitbuffer(){ + do { /* Check if we need to dump buffer*/ + if( bufptr >= bufsize ) { + output_buffer(); + } + var b = (bitcache >> 24)&0xff; + + if( b == 0xff ) { /*Add 0x00 stuffing*/ + bitcache &= 0x00ffffff; + buf[bufptr++] = 0xff; + continue; + } + + buf[bufptr++] = b; + + bitcache <<= 8;/* remove bits from bitcache*/ + bitcount -= 8; + + } while( bitcount >= 8 ); + } + + // This ensures there is at least 16 free bits in the buffer + function emptybitbuffer_16(pbs) { + /* the following loop always adds two bytes at least. to the bitcache*/ + if( bitcount >16 ){ + emptybitbuffer(); + } + } + + function shovebits( val, bits) { + bitcache |= (val & ((1<<(bits))-1)) << (32 - bitcount - bits ); + bitcount+= bits; + } + + + + var flush_buffers = function() { + align8(); + if(bitcount>=8) { + emptybitbuffer(); + output_buffer(); + } + } + + var align8 = function () { + _this.putbits( 0xff, ((32 - bitcount)&0x7) ); + } + + + /** + * Public API + */ + var bw; + this.getWrittenBytes = function () { + return byteswritten; + } + + this.end = function() { + output_buffer(); + } + + this.putbits = function (val, bits) { + emptybitbuffer_16(); + shovebits(val, bits); + } + + this.align = function() { + align8(); + } + + this.setByteWriter = function( bww ) { + bw = bww; + }; + + this.putshort = function(s) { + flush_buffers(); + buf[bufptr++]=((s)&0xffff)>>>8; + buf[bufptr++]=s&0xff; + } + + this.putbyte = function(b) { + flush_buffers(); + buf[bufptr++]=b; + }; + } + + //------------------------------------------------------------------------------------------- + // encoding tables + //------------------------------------------------------------------------------------------- + var std_dc_luminance_nrcodes = new Uint32Array([0,0,1,5,1,1,1,1,1,1,0,0,0,0,0,0,0]); + var std_dc_luminance_values = new Uint32Array([0,1,2,3,4,5,6,7,8,9,10,11]); + var std_ac_luminance_nrcodes = new Uint32Array([0,0,2,1,3,3,2,4,3,5,5,4,4,0,0,1,0x7d]); + var std_ac_luminance_values = new Uint32Array([0x01,0x02,0x03,0x00,0x04,0x11,0x05,0x12, + 0x21,0x31,0x41,0x06,0x13,0x51,0x61,0x07, + 0x22,0x71,0x14,0x32,0x81,0x91,0xa1,0x08, + 0x23,0x42,0xb1,0xc1,0x15,0x52,0xd1,0xf0, + 0x24,0x33,0x62,0x72,0x82,0x09,0x0a,0x16, + 0x17,0x18,0x19,0x1a,0x25,0x26,0x27,0x28, + 0x29,0x2a,0x34,0x35,0x36,0x37,0x38,0x39, + 0x3a,0x43,0x44,0x45,0x46,0x47,0x48,0x49, + 0x4a,0x53,0x54,0x55,0x56,0x57,0x58,0x59, + 0x5a,0x63,0x64,0x65,0x66,0x67,0x68,0x69, + 0x6a,0x73,0x74,0x75,0x76,0x77,0x78,0x79, + 0x7a,0x83,0x84,0x85,0x86,0x87,0x88,0x89, + 0x8a,0x92,0x93,0x94,0x95,0x96,0x97,0x98, + 0x99,0x9a,0xa2,0xa3,0xa4,0xa5,0xa6,0xa7, + 0xa8,0xa9,0xaa,0xb2,0xb3,0xb4,0xb5,0xb6, + 0xb7,0xb8,0xb9,0xba,0xc2,0xc3,0xc4,0xc5, + 0xc6,0xc7,0xc8,0xc9,0xca,0xd2,0xd3,0xd4, + 0xd5,0xd6,0xd7,0xd8,0xd9,0xda,0xe1,0xe2, + 0xe3,0xe4,0xe5,0xe6,0xe7,0xe8,0xe9,0xea, + 0xf1,0xf2,0xf3,0xf4,0xf5,0xf6,0xf7,0xf8, + 0xf9,0xfa]); + + var std_dc_chrominance_nrcodes = new Uint32Array([0,0,3,1,1,1,1,1,1,1,1,1,0,0,0,0,0]); + var std_dc_chrominance_values = new Uint32Array([0,1,2,3,4,5,6,7,8,9,10,11]); + var std_ac_chrominance_nrcodes = new Uint32Array([0,0,2,1,2,4,4,3,4,7,5,4,4,0,1,2,0x77]); + var std_ac_chrominance_values = new Uint32Array([0x00,0x01,0x02,0x03,0x11,0x04,0x05,0x21, + 0x31,0x06,0x12,0x41,0x51,0x07,0x61,0x71, + 0x13,0x22,0x32,0x81,0x08,0x14,0x42,0x91, + 0xa1,0xb1,0xc1,0x09,0x23,0x33,0x52,0xf0, + 0x15,0x62,0x72,0xd1,0x0a,0x16,0x24,0x34, + 0xe1,0x25,0xf1,0x17,0x18,0x19,0x1a,0x26, + 0x27,0x28,0x29,0x2a,0x35,0x36,0x37,0x38, + 0x39,0x3a,0x43,0x44,0x45,0x46,0x47,0x48, + 0x49,0x4a,0x53,0x54,0x55,0x56,0x57,0x58, + 0x59,0x5a,0x63,0x64,0x65,0x66,0x67,0x68, + 0x69,0x6a,0x73,0x74,0x75,0x76,0x77,0x78, + 0x79,0x7a,0x82,0x83,0x84,0x85,0x86,0x87, + 0x88,0x89,0x8a,0x92,0x93,0x94,0x95,0x96, + 0x97,0x98,0x99,0x9a,0xa2,0xa3,0xa4,0xa5, + 0xa6,0xa7,0xa8,0xa9,0xaa,0xb2,0xb3,0xb4, + 0xb5,0xb6,0xb7,0xb8,0xb9,0xba,0xc2,0xc3, + 0xc4,0xc5,0xc6,0xc7,0xc8,0xc9,0xca,0xd2, + 0xd3,0xd4,0xd5,0xd6,0xd7,0xd8,0xd9,0xda, + 0xe2,0xe3,0xe4,0xe5,0xe6,0xe7,0xe8,0xe9, + 0xea,0xf2,0xf3,0xf4,0xf5,0xf6,0xf7,0xf8, + 0xf9,0xfa + ]); + + var jpeg_natural_order = new Uint32Array([ + 0, 1, 8, 16, 9, 2, 3, 10, + 17, 24, 32, 25, 18, 11, 4, 5, + 12, 19, 26, 33, 40, 48, 41, 34, + 27, 20, 13, 6, 7, 14, 21, 28, + 35, 42, 49, 56, 57, 50, 43, 36, + 29, 22, 15, 23, 30, 37, 44, 51, + 58, 59, 52, 45, 38, 31, 39, 46, + 53, 60, 61, 54, 47, 55, 62, 63, + 63, 63, 63, 63, 63, 63, 63, 63, /* extra entries for safety in decoder */ + 63, 63, 63, 63, 63, 63, 63, 63 + ]); + + /* zig zag scan table */ + var zz = new Uint32Array([ + 0, 1, 5, 6,14,15,27,28, + 2, 4, 7,13,16,26,29,42, + 3, 8,12,17,25,30,41,43, + 9,11,18,24,31,40,44,53, + 10,19,23,32,39,45,52,54, + 20,22,33,38,46,51,55,60, + 21,34,37,47,50,56,59,61, + 35,36,48,49,57,58,62,63 + ]); + + /* aan dct scale factors */ + var aasf = new Float64Array([ + 1.0, 1.387039845, 1.306562965, 1.175875602, + 1.0, 0.785694958, 0.541196100, 0.275899379 + ]); + + /* default quantization tables */ + var YQT = new Uint32Array([ + 16, 11, 10, 16, 24, 40, 51, 61, + 12, 12, 14, 19, 26, 58, 60, 55, + 14, 13, 16, 24, 40, 57, 69, 56, + 14, 17, 22, 29, 51, 87, 80, 62, + 18, 22, 37, 56, 68,109,103, 77, + 24, 35, 55, 64, 81,104,113, 92, + 49, 64, 78, 87,103,121,120,101, + 72, 92, 95, 98,112,100,103, 99 + ]); + + var UVQT = new Uint32Array([ + 17, 18, 24, 47, 99, 99, 99, 99, + 18, 21, 26, 66, 99, 99, 99, 99, + 24, 26, 56, 99, 99, 99, 99, 99, + 47, 66, 99, 99, 99, 99, 99, 99, + 99, 99, 99, 99, 99, 99, 99, 99, + 99, 99, 99, 99, 99, 99, 99, 99, + 99, 99, 99, 99, 99, 99, 99, 99, + 99, 99, 99, 99, 99, 99, 99, 99 + ]); + + //------------------------------------------------------------------------------------------- + // PTTJPEG object + //------------------------------------------------------------------------------------------- + function PTTJPEG() { + + /* private context variables */ + var fdtbl_Y = new Float64Array(64); + var fdtbl_UV = new Float64Array(64); + var YDU = new Float64Array(64); + var YDU2 = new Float64Array(64); // filled in 420 mode + var YDU3 = new Float64Array(64); // filled in 420 mode + var YDU4 = new Float64Array(64); // filled in 420 mode + + var UDU = new Float64Array(64); + var UDU1 = new Float64Array(64); + var UDU2 = new Float64Array(64); + var UDU3 = new Float64Array(64); + var UDU4 = new Float64Array(64); + + var VDU = new Float64Array(64); + var VDU1 = new Float64Array(64); + var VDU2 = new Float64Array(64); + var VDU3 = new Float64Array(64); + var VDU4 = new Float64Array(64); + + var DU = new Int32Array(64); + var YTable = new Int32Array(64); + var UVTable = new Int32Array(64); + var outputfDCTQuant = new Int32Array(64); + + var sf = 1; // int. the scale factor + + var inputImage; + + + /** + * BitString class + */ + function BitString() { + this.val = 0; + this.len = 0; + }; + + var YDC_HT = new Array(256); + var UVDC_HT= new Array(256); + var YAC_HT = new Array(256); + var UVAC_HT= new Array(256); + + + + + + /** + * var quality:int + * + */ + var init_quality_settings = function (quality) { + if (quality <= 0) + quality = 1; + + if (quality > 100) + quality = 100; + + sf = quality < 50 ? (5000 / quality)|0 : (200 - (quality<<1))|0; + + /* init quantization tables */ + init_quant_tables(sf); + }; + + /** + * var sf:int: the scale factor + * @returns + */ + var init_quant_tables = function (sff) { + var i; + var I64 = 64; + var I8 = 8; + + for (i = 0; i < I64; ++i) + { + var t = ((YQT[i]*sff+50)*0.01)|0; + if (t < 1) { + t = 1; + } else if (t > 255) { + t = 255; + } + YTable[zz[i]] = t; + } + + for (i = 0; i < I64; i++) + { + var u = ((UVQT[i]*sff+50)*0.01)|0; + if (u < 1) { + u = 1; + } else if (u > 255) { + u = 255; + } + UVTable[zz[i]] = u; + } + i = 0; + var row; + var col; + for (row = 0; row < I8; ++row) + { + for (col = 0; col < I8; ++col) + { + fdtbl_Y[i] = (1 / (YTable [zz[i]] * aasf[row] * aasf[col] * I8)); + fdtbl_UV[i] = (1 / (UVTable[zz[i]] * aasf[row] * aasf[col] * I8)); + i++; + } + } + }; + + /** + * const int nrcodes[] + * const int std_table[] + * BitString HT, Array(BitsString) + * + */ + var computeHuffmanTbl = function (nrcodes, std_table, HT) + { + var codevalue = 0; //int + var pos_in_table = 0; //int + var k,j; //int + var bs; //BitString object + + // initialize table + for( k=0; k<256; k++ ) { + bs = new BitString(); + bs.val = 0; + bs.len = 0; + HT[k] = bs; + } + + for (k=1; k<=16; ++k) + { + for (j=1; j<=nrcodes[k]; ++j) + { + var bs = new BitString(); + bs.val = codevalue; + bs.len = k; + HT[std_table[pos_in_table]] = bs; + pos_in_table++; + codevalue++; + } + codevalue<<=1; + } + } + + + /** + * Initialize huffman tables + */ + var init_huffman_tables = function() + { + computeHuffmanTbl(std_dc_luminance_nrcodes,std_dc_luminance_values,YDC_HT); + computeHuffmanTbl(std_dc_chrominance_nrcodes,std_dc_chrominance_values, UVDC_HT); + computeHuffmanTbl(std_ac_luminance_nrcodes,std_ac_luminance_values, YAC_HT); + computeHuffmanTbl(std_ac_chrominance_nrcodes,std_ac_chrominance_values, UVAC_HT); + } + + /** + * + * DCT and quantization core + * + * double data[] + * double fdtbl[] + * + * returns quantized coefficients + * + */ + function fDCTQuant( data, fdtbl) { + /* Pass 1: process rows. */ + var dataOff=0; + var d0,d1,d2,d3,d4,d5,d6,d7; + var i; + var I8 = 8; + var I64 = 64; + + for (i=0; i 0.0) ? (fDCTQuant + 0.5)|0 : (fDCTQuant - 0.5)|0; + } + return outputfDCTQuant; + } + + //------------------------------------------------------------------------------------------- + // chunk writing routines + function writeAPP0() + { + bitwriter.putshort( 0xFFE0); // marker + bitwriter.putshort( 16); // length + bitwriter.putbyte( 0x4A); // J + bitwriter.putbyte( 0x46); // F + bitwriter.putbyte( 0x49); // I + bitwriter.putbyte( 0x46); // F + bitwriter.putbyte( 0); // = "JFIF"'\0' + bitwriter.putbyte( 1); // versionhi + bitwriter.putbyte( 1); // versionlo + bitwriter.putbyte( 0); // xyunits + bitwriter.putshort( 1); // xdensity + bitwriter.putshort( 1); // ydensity + bitwriter.putbyte( 0); // thumbnwidth + bitwriter.putbyte( 0); // thumbnheight + } + + + // width:int, height:int + function writeSOF0( width, height, _444 ) + { + bitwriter.putshort(0xFFC0); // marker + bitwriter.putshort(17); // length, truecolor YUV JPG + bitwriter.putbyte(8); // precision + bitwriter.putshort(height); + bitwriter.putshort(width); + bitwriter.putbyte(3); // nrofcomponents + + bitwriter.putbyte(1); // IdY. id of Y + bitwriter.putbyte(_444 ? 0x11 : 0x22); // HVY. sampling factor horizontal Y | sampling factor vertical Y + bitwriter.putbyte(0); // QTY. quantization table table + + bitwriter.putbyte(2); // IdU + bitwriter.putbyte(_444 ? 0x11 : 0x11); // HVU sampling factor horizontal U | sampling factor vertical U. 0x11 -> 4:4:4, 0x22 -> 4:2:0 + bitwriter.putbyte(1); // QTU + + bitwriter.putbyte(3); // IdV + bitwriter.putbyte(_444 ? 0x11 : 0x11); // HVV sampling factor horizontal V | sampling factor vertical V. 0x11 -> 4:4:4, 0x22 -> 4:2:0 + bitwriter.putbyte(1); // QTV + } + + function writeDQT() + { + bitwriter.putshort(0xFFDB); // marker + bitwriter.putshort(132); // length + bitwriter.putbyte(0); + + var i; + var I64=64; + for (i=0; i>=1; res++; } return res; } + function abs(x) { return ((x)>0?(x):(-(x)))} + + /** + * double CDU[] + * double fdtbl[] + * double DC + * BitString HTDC[] + * BitString HTAC[] + * + * Returns double + */ + function processDU( CDU, fdtbl, DC, HTDC, HTAC ) + { + + var DU_DCT = fDCTQuant( CDU, fdtbl); + + var dc_diff; //int + var last_dc; // double + + // output + // DC Bits + dc_diff = DU_DCT[0] - DC|0; + last_dc = DU_DCT[0]; + /////////////////////// + //DC CODING + + // DC Size + var dc_size = 0, diffabs = abs(dc_diff); + dc_size = log2(diffabs, dc_size); + + bitwriter.putbits(HTDC[dc_size].val, HTDC[dc_size].len ); + + // DC Bits + if( dc_size ) + { + dc_diff = huffman_compact(dc_diff, dc_size); + bitwriter.putbits( dc_diff, dc_size ); + } + + //////////////////// + // AC CODING + var run; + var accoeff; //int16 + var lastcoeff_pos = 0; //ui32 + var maxcoeff = 64; // int + + var i = 0; + while( 1 ) + { + // find next coefficient to code + i++; + for( run=0 ;(accoeff = DU_DCT[ jpeg_natural_order[i] ])== 0 && i= maxcoeff ) + break; + + // Code runs greater than 16 + while( run>= 16 ) + { + // Write value + bitwriter.putbits(HTAC[0xf0].val, HTAC[0xf0].len ); + run -= 16; + } + // AC Size + var acsize = 0; + var acabs = abs(accoeff); + acsize = log2(acabs, acsize); + + // Write value + var hv = (run << 4) | acsize; + bitwriter.putbits(HTAC[hv].val, HTAC[hv].len ); + + // AC Bits + if( acsize ) + { + accoeff = huffman_compact(accoeff, acsize); + bitwriter.putbits(accoeff, acsize ); + } + + // Keep position of last encoded coefficient + lastcoeff_pos = i; + } + + // Write EOB + if( lastcoeff_pos != 63 ) + bitwriter.putbits(HTAC[0].val, HTAC[0].len ); + + + return last_dc; + } + + + /** + * xpos:int + * ypos:int + * + * This functions calls the getpixels() object to obtain an McuImg object that contains + * an Uint8Array() buffer with pixel data in RGBA byte order. McuImg includes an offset + * to the beginning of the requested area as well as the stride in bytes. + * + * The method converts the RGB pixels into YUV ready for further processing. The destination + * pixels are written to the local private PTTJPEG fields YDU,UDU,VDU + * + */ + function rgb2yuv_444( xpos, ypos, YDU, UDU, VDU ) + { + // RGBA format in unpacked bytes + var mcuimg = inputImage.getPixels( xpos, ypos, 8, 8); + + // DEBUGMSG(sprintf("getpixels() xpos:%d ypos:%d retw:%d reth:%d", xpos, ypos, mcuimg.w, mcuimg.h )); + + var buf = mcuimg.buf; + var pel; + var P=0; + var x,y,off,off_1=0,R,G,B; + + if( mcuimg.w==8 && mcuimg.h==8 ) { + /* block is 8x8 */ + for ( y=0; y<8; y++) { + for (x=0; x<8; x++) { + off = mcuimg.offset + y*mcuimg.stride + x*4; + + R = buf[off]; + G = buf[off+1]; + B = buf[off+2]; + + YDU[off_1] =((( 0.29900)*R+( 0.58700)*G+( 0.11400)*B))-0x80; + UDU[off_1] =(((-0.16874)*R+(-0.33126)*G+( 0.50000)*B)); + VDU[off_1++] =((( 0.50000)*R+(-0.41869)*G+(-0.08131)*B)); + } + } + } else { + /* we separate the borderline conditions to avoid having to branch out + * on every mcu */ + for( y=0; y<8; y++ ) { + for( x=0; x<8; x++ ) { + var xx=x, yy=y; + if( x >= mcuimg.w ) { + xx = mcuimg.w-1; + } + + if( y >= mcuimg.h ) { + yy = mcuimg.h-1; + } + + + off = mcuimg.offset + yy*mcuimg.stride + xx*4; + + R = buf[off]; + G = buf[off+1]; + B = buf[off+2]; + + YDU[off_1] =((( 0.29900)*R+( 0.58700)*G+( 0.11400)*B))-0x80; + UDU[off_1] =(((-0.16874)*R+(-0.33126)*G+( 0.50000)*B)); + VDU[off_1++] =((( 0.50000)*R+(-0.41869)*G+(-0.08131)*B)); + } + } + } + } + + + // takes 4 DU units and downsamples them 2:1 using simple averaging + + function downsample_8_line(DU, outoff, DU1, DU2, inoff) { + DU[outoff + 0] = (DU1[inoff + 00] + DU1[inoff + 01] + DU1[inoff + 08] + DU1[inoff + 09] + 2)>>2; + DU[outoff + 1] = (DU1[inoff + 02] + DU1[inoff + 03] + DU1[inoff + 10] + DU1[inoff + 11] + 2)>>2; + DU[outoff + 2] = (DU1[inoff + 04] + DU1[inoff + 05] + DU1[inoff + 12] + DU1[inoff + 13] + 2)>>2; + DU[outoff + 3] = (DU1[inoff + 06] + DU1[inoff + 07] + DU1[inoff + 14] + DU1[inoff + 15] + 2)>>2; + + DU[outoff + 4] = (DU2[inoff + 00] + DU2[inoff + 01] + DU2[inoff + 08] + DU2[inoff + 09] + 2)>>2; + DU[outoff + 5] = (DU2[inoff + 02] + DU2[inoff + 03] + DU2[inoff + 10] + DU2[inoff + 11] + 2)>>2; + DU[outoff + 6] = (DU2[inoff + 04] + DU2[inoff + 05] + DU2[inoff + 12] + DU2[inoff + 13] + 2)>>2; + DU[outoff + 7] = (DU2[inoff + 06] + DU2[inoff + 07] + DU2[inoff + 14] + DU2[inoff + 15] + 2)>>2; + } + + function downsample_DU(DU, DU1, DU2, DU3, DU4) { + downsample_8_line( DU, 0, DU1, DU2, 0 ); + downsample_8_line( DU, 8, DU1, DU2, 16 ); + downsample_8_line( DU, 16, DU1, DU2, 32 ); + downsample_8_line( DU, 24, DU1, DU2, 48 ); + + downsample_8_line( DU, 32, DU3, DU4, 0 ); + downsample_8_line( DU, 40, DU3, DU4, 16 ); + downsample_8_line( DU, 48, DU3, DU4, 32 ); + downsample_8_line( DU, 56, DU3, DU4, 48 ); + } + + + + /** + * xpos:int + * ypos:int + * + * This functions calls the getpixels() object to obtain an McuImg object that contains + * an Uint8Array() buffer with pixel data in RGBA byte order. McuImg includes an offset + * to the beginning of the requested area as well as the stride in bytes. + * + * The method converts the RGB pixels into YUV ready for further processing. The destination + * pixels are written to the local private PTTJPEG fields YDU[2,3,4],UDU,VDU + * + * + * output: for luma blocks. YDU, YDU2, YDU3, YDU4 + * 2 chroma blocks, UDU, VDU + * + */ + function rgb2yuv_420( xpos, ypos) + { + rgb2yuv_444( xpos, ypos, YDU, UDU1, VDU1 ); + rgb2yuv_444( xpos+8, ypos, YDU2, UDU2, VDU2 ); + rgb2yuv_444( xpos, ypos+8, YDU3, UDU3, VDU3 ); + rgb2yuv_444( xpos+8, ypos+8, YDU4, UDU4, VDU4 ); + + downsample_DU( UDU, UDU1, UDU2, UDU3, UDU4 ); + downsample_DU( VDU, VDU1, VDU2, VDU3, VDU4 ); + + } + + + + //-------------------------------------------------------------------- + // exported functions + this.version = function() { return "petitóJPEG 0.4"; }; + + this.setVerbosity = function(flagVerbose) { + flagQuiet = !flagVerbose; + } + + this.ByteWriter = function() { + var bufsize = 1024*1024*10; + var buf = new Uint8Array(bufsize); + var bufptr = 0; + + /** + * Base64 encoding. + * input:Uint8Array + * output:String + */ + var base64EncodeFromUint8Array = function(input) { + var _keyStr = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/="; + + var output = ""; + var chr1, chr2, chr3, enc1, enc2, enc3, enc4; + var i = 0; + + while (i < input.length) { + + chr1 = input[i++]; + chr2 = i>> 2; + enc2 = ((chr1 & 3) << 4) | (chr2 >>> 4); + enc3 = ((chr2 & 15) << 2) | (chr3 >>> 6); + enc4 = chr3 & 63; + + if(i>= input.length) { + var mod = input.length%3; + + + if(mod==2) { + enc4 = 64; + } + + if(mod==1) { + enc3 = enc4 = 64; + } + } + + + output = output + + _keyStr.charAt(enc1) + _keyStr.charAt(enc2) + + _keyStr.charAt(enc3) + _keyStr.charAt(enc4); + + } + + return output; + }; + // writes count bytes starting at start position from array + // array is Uint8Array() + this.write = function( array, start, count ){ + for( var i=0; i width ? width-xpos : w; + ret.h = ypos + h > height ? height-ypos : h; + + return ret; + + } + } + + var encodetime=0; + this.getEncodeTime = function() { + return encodetime; + } + + /** + * The encode function stub + * + * quality:int 0-100 + * img: pttJPEGImage object. The image object to encode + * bw: byteWriter object. The object that will be used to write the compressed data + * + * uses auto for chroma sampling + * + */ + this.encode = function (quality, img, bw) { + this.encode_ext(quality, img, bw, "auto"); + } + + + /** + * The encode function + * + * quality:int 0-100 + * img: pttJPEGImage object. The image object to encode + * bw: byteWriter object. The object that will be used to write the compressed data + * sr: "444" for 4:4:4 chroma sampling "420" for 4:2:0 chroma sampling, "auto" for auto + * + * + */ + this.encode_ext = function (quality, img, bw, sr) + { + if(!img) + DEBUGMSG("input image not provided. aborting encode"); + + if(!bw) + DEBUGMSG("byte writer not provided. aborting encode"); + + var _444 = true; + if(sr=="auto") { + if(quality>50) { + _444 = true; + } else { + _444 = false; + } + } + + // DEBUGMSG(sprintf("pttjpeg_encode qual:%d, %dx%d, %s:%s", quality ,img.width,img.height, sr, _444 ? "4:4:4": "4:2:0" )); + var start = new Date().getTime(); + + init_quality_settings(quality); + + + + /* start the bitwriter */ + bitwriter = new BitWriter(); + bitwriter.setByteWriter(bw); + + /* save copy of input image */ + inputImage = img; + + /* write headers out */ + bitwriter.putshort( 0xFFD8); // SOI + writeAPP0(); + writeDQT(); + writeSOF0( img.width, img.height, _444 ); + writeDHT(); + writeSOS(); + + DEBUGMSG("wrote headers"); + + /* MCU(minimum coding units) are 8x8 blocks for now*/ + var DCU=0, DCY=0, DCV=0; + + var width=img.width; + var height=img.height; + var ypos,xpos; + var mcucount = 0; + + + if(_444) { + // 4:4:4 + for (ypos=0; ypos { + fileMapping = {}; + let index = start; + _zip.forEach((relativePath) => { + + fileMapping[relativePath] = index++; + }); + index = start; + let inverseUnzippedFilesCount = end; + _zip.forEach((relativePath) => { + const fileIndex = index++; + + _zip.file(relativePath).async('blob').then((fileData) => { + const reader = new FileReader(); + reader.onload = (function(i, event){ + postMessage({fileName : relativePath, index : fileIndex, data: reader.result}); + inverseUnzippedFilesCount --; + if (inverseUnzippedFilesCount < start){ + self.close(); + } + }).bind(fileIndex, relativePath); + + reader.readAsDataURL(fileData); + }); + }); + }); + +} \ No newline at end of file diff --git a/cvat-data/webpack.config.js b/cvat-data/webpack.config.js new file mode 100644 index 000000000000..922caee82cd6 --- /dev/null +++ b/cvat-data/webpack.config.js @@ -0,0 +1,73 @@ +const path = require('path'); + + +const _module = { + rules: [{ + test: /.js?$/, + exclude: /node_modules/, + use: { + loader: 'babel-loader', + options: { + presets: [ + ['@babel/preset-env', { + targets: { + chrome: 58, + }, + useBuiltIns: 'usage', + corejs: 3, + loose: false, + spec: false, + debug: false, + include: [], + exclude: [], + }], + ], + sourceType: 'unambiguous', + }, + }, + }], + } + +const cvatData = { + target: 'web', + mode: 'production', + entry: './src/js/cvat-data.js', + output: { + path: path.resolve(__dirname, 'dist'), + filename: 'cvat-data.min.js', + library: 'cvatData', + libraryTarget: 'window', + }, + devServer: { + contentBase: path.join(__dirname, 'dist'), + compress: false, + inline: true, + port: 3001, + }, + module: _module +}; + + +const workerImg = { + target: 'web', + mode: 'production', + entry: './src/js/unzip_imgs.js', + output: { + path: path.resolve(__dirname, 'dist'), + filename: 'unzip_imgs.js', + }, + module: _module +} + +const workerVideo = { + target: 'web', + mode: 'production', + entry: './src/js/decode_video.js', + output: { + path: path.resolve(__dirname, 'dist'), + filename: 'decode_video.js', + }, + module: _module +} + +module.exports = [cvatData, workerImg, workerVideo] \ No newline at end of file diff --git a/cvat/apps/engine/annotation.py b/cvat/apps/engine/annotation.py index acb9a6d5e349..fb152076b87f 100644 --- a/cvat/apps/engine/annotation.py +++ b/cvat/apps/engine/annotation.py @@ -21,14 +21,6 @@ from .log import slogger from . import serializers -"""dot.notation access to dictionary attributes""" -class dotdict(OrderedDict): - __getattr__ = OrderedDict.get - __setattr__ = OrderedDict.__setitem__ - __delattr__ = OrderedDict.__delitem__ - __eq__ = lambda self, other: self.id == other.id - __hash__ = lambda self: self.id - class PatchAction(str, Enum): CREATE = "create" UPDATE = "update" @@ -150,6 +142,15 @@ def bulk_create(db_model, objects, flt_param): return [] def _merge_table_rows(rows, keys_for_merge, field_id): + """dot.notation access to dictionary attributes""" + from collections import OrderedDict + class dotdict(OrderedDict): + __getattr__ = OrderedDict.get + __setattr__ = OrderedDict.__setitem__ + __delattr__ = OrderedDict.__delitem__ + __eq__ = lambda self, other: self.id == other.id + __hash__ = lambda self: self.id + # It is necessary to keep a stable order of original rows # (e.g. for tracked boxes). Otherwise prev_box.frame can be bigger # than next_box.frame. @@ -201,16 +202,12 @@ def __init__(self, pk, user): "all": OrderedDict(), } for db_attr in db_label.attributespec_set.all(): - default_value = dotdict([ - ('spec_id', db_attr.id), - ('value', db_attr.default_value), - ]) if db_attr.mutable: - self.db_attributes[db_label.id]["mutable"][db_attr.id] = default_value + self.db_attributes[db_label.id]["mutable"][db_attr.id] = db_attr else: - self.db_attributes[db_label.id]["immutable"][db_attr.id] = default_value + self.db_attributes[db_label.id]["immutable"][db_attr.id] = db_attr - self.db_attributes[db_label.id]["all"][db_attr.id] = default_value + self.db_attributes[db_label.id]["all"][db_attr.id] = db_attr def reset(self): self.ir_data.reset() @@ -461,13 +458,13 @@ def delete(self, data=None): self._commit() @staticmethod - def _extend_attributes(attributeval_set, default_attribute_values): + def _extend_attributes(attributeval_set, attribute_specs): shape_attribute_specs_set = set(attr.spec_id for attr in attributeval_set) - for db_attr in default_attribute_values: - if db_attr.spec_id not in shape_attribute_specs_set: - attributeval_set.append(dotdict([ - ('spec_id', db_attr.spec_id), - ('value', db_attr.value), + for db_attr_spec in attribute_specs: + if db_attr_spec.id not in shape_attribute_specs_set: + attributeval_set.append(OrderedDict([ + ('spec_id', db_attr_spec.id), + ('value', db_attr_spec.default_value), ])) def _init_tags_from_db(self): @@ -603,16 +600,12 @@ def _init_tracks_from_db(self): self._extend_attributes(db_track.labeledtrackattributeval_set, self.db_attributes[db_track.label_id]["immutable"].values()) - default_attribute_values = self.db_attributes[db_track.label_id]["mutable"].values() for db_shape in db_track["trackedshape_set"]: db_shape["trackedshapeattributeval_set"] = list( set(db_shape["trackedshapeattributeval_set"]) ) - # in case of trackedshapes need to interpolate attriute values and extend it - # by previous shape attribute values (not default values) - self._extend_attributes(db_shape["trackedshapeattributeval_set"], default_attribute_values) - default_attribute_values = db_shape["trackedshapeattributeval_set"] - + self._extend_attributes(db_shape["trackedshapeattributeval_set"], + self.db_attributes[db_track.label_id]["mutable"].values()) serializer = serializers.LabeledTrackSerializer(db_tracks, many=True) self.ir_data.tracks = serializer.data diff --git a/cvat/apps/engine/frame_provider.py b/cvat/apps/engine/frame_provider.py new file mode 100644 index 000000000000..de45a93fc05d --- /dev/null +++ b/cvat/apps/engine/frame_provider.py @@ -0,0 +1,40 @@ +import os +from enum import Enum +from cvat.apps.engine.media_extractors import ArchiveExtractor, VideoExtractor + +class FrameProvider(): + class ChunkType(Enum): + IMAGE = 0 + VIDEO = 1 + + def __init__(self, db_task): + self._db_task = db_task + self._chunk_type = self.ChunkType.VIDEO if db_task.mode == 'interpolation' else self.ChunkType.IMAGE + self._chunk_extractor_class = ArchiveExtractor if self._chunk_type == self.ChunkType.IMAGE else VideoExtractor + self._extracted_chunk = None + self._chunk_extractor = None + + def __iter__(self): + for i in range(self._db_task.size): + yield self.get_frame(i) + + def __len__(self): + return self._db_task.size + + def get_frame(self, frame_number): + if frame_number < 0 or frame_number >= self._db_task.size: + raise Exception('Incorrect requested frame number: {}'.format(frame_number)) + chunk_number = frame_number // self._db_task.data_chunk_size + frame_offset = frame_number % self._db_task.data_chunk_size + chunk_path = self.get_chunk(chunk_number) + if chunk_number != self._extracted_chunk: + self._extracted_chunk = chunk_number + self._chunk_extractor = self._chunk_extractor_class([chunk_path], 95) + + return self._chunk_extractor[frame_offset] + + def get_chunk(self, chunk_number): + return self._db_task.get_chunk_path(chunk_number) + + def get_preview(self): + return os.path.join(self._db_task.get_data_dirname(), 'preview.jpg') diff --git a/cvat/apps/engine/media_extractors.py b/cvat/apps/engine/media_extractors.py index 018671e1b173..41052493c954 100644 --- a/cvat/apps/engine/media_extractors.py +++ b/cvat/apps/engine/media_extractors.py @@ -2,11 +2,15 @@ import tempfile import shutil import numpy as np +import tarfile +import math +from io import BytesIO from ffmpy import FFmpeg from pyunpack import Archive from PIL import Image +from cvat.apps.engine.log import slogger import mimetypes _SCRIPT_DIR = os.path.realpath(os.path.dirname(__file__)) MEDIA_MIMETYPES_FILES = [ @@ -22,25 +26,35 @@ def get_mime(name): return 'unknown' class MediaExtractor: - def __init__(self, source_path, dest_path, image_quality, step, start, stop): - self._source_path = source_path - self._dest_path = dest_path + def __init__(self, source_path, image_quality, step, start, stop): + self._source_path = sorted(source_path) self._image_quality = image_quality self._step = step self._start = start self._stop = stop - def get_source_name(self): - return self._source_path + @staticmethod + def create_tmp_dir(): + return tempfile.mkdtemp(prefix='cvat-', suffix='.data') + + @staticmethod + def delete_tmp_dir(tmp_dir): + if tmp_dir: + shutil.rmtree(tmp_dir) + + @staticmethod + def prepare_dirs(file_path): + dirname = os.path.dirname(file_path) + if not os.path.exists(dirname): + os.makedirs(dirname) #Note step, start, stop have no affect class ImageListExtractor(MediaExtractor): - def __init__(self, source_path, dest_path, image_quality, step=1, start=0, stop=0): + def __init__(self, source_path, image_quality, step=1, start=0, stop=0): if not source_path: raise Exception('No image found') super().__init__( - source_path=sorted(source_path), - dest_path=dest_path, + source_path=source_path, image_quality=image_quality, step=1, start=0, @@ -53,11 +67,8 @@ def __iter__(self): def __getitem__(self, k): return self._source_path[k] - def __len__(self): - return len(self._source_path) - - def save_image(self, k, dest_path): - image = Image.open(self[k]) + def compress_image(self, image_path): + image = Image.open(image_path) # Ensure image data fits into 8bit per pixel before RGB conversion as PIL clips values on conversion if image.mode == "I": # Image mode is 32bit integer pixels. @@ -65,66 +76,53 @@ def save_image(self, k, dest_path): im_data = np.array(image) im_data = im_data * (2**8 / im_data.max()) image = Image.fromarray(im_data.astype(np.int32)) - image = image.convert('RGB') - image.save(dest_path, quality=self._image_quality, optimize=True) - height = image.height - width = image.width + converted_image = image.convert('RGB') image.close() - return width, height - -class PDFExtractor(MediaExtractor): - def __init__(self, source_path, dest_path, image_quality, step=1, start=0, stop=0): - if not source_path: - raise Exception('No PDF found') - - from pdf2image import convert_from_path - self._temp_directory = tempfile.mkdtemp(prefix='cvat-') - super().__init__( - source_path=source_path[0], - dest_path=dest_path, - image_quality=image_quality, - step=1, - start=0, - stop=0, - ) - - self._dimensions = [] - file_ = convert_from_path(self._source_path) - self._basename = os.path.splitext(os.path.basename(self._source_path))[0] - for page_num, page in enumerate(file_): - output = os.path.join(self._temp_directory, self._basename + str(page_num) + '.jpg') - self._dimensions.append(page.size) - page.save(output, 'JPEG') - - self._length = len(os.listdir(self._temp_directory)) - - def _get_imagepath(self, k): - img_path = os.path.join(self._temp_directory, self._basename + str(k) + '.jpg') - return img_path - - def __iter__(self): - i = 0 - while os.path.exists(self._get_imagepath(i)): - yield self._get_imagepath(i) - i += 1 - - def __del__(self): - if self._temp_directory: - shutil.rmtree(self._temp_directory) - - def __getitem__(self, k): - return self._get_imagepath(k) - - def __len__(self): - return self._length + buf = BytesIO() + converted_image.save(buf, format='JPEG', quality=self._image_quality, optimize=True) + buf.seek(0) + width, height = converted_image.size + converted_image.close() + return width, height, buf def save_image(self, k, dest_path): - shutil.copyfile(self[k], dest_path) - return self._dimensions[k] + w, h, compressed_image = self.compress_image(self[k]) + with open(dest_path, 'wb') as f: + f.write(compressed_image.getvalue()) + return w, h + + def save_as_chunks(self, chunk_size, task, progress_callback=None): + counter = 0 + media_meta = [] + total_length = len(self._source_path) + for i in range(0, total_length, chunk_size): + chunk_data = self._source_path[i:i + chunk_size] + tarname = task.get_chunk_path(counter) + self.prepare_dirs(tarname) + with tarfile.open(tarname, 'x:') as tar_chunk: + for idx, image_file in enumerate(chunk_data): + w, h, image_buf = self.compress_image(image_file) + media_meta.append({ + 'name': image_file, + 'size': (w, h), + }) + tarinfo = tarfile.TarInfo(name='{:06d}.jpeg'.format(idx)) + tarinfo.size = len(image_buf.getbuffer()) + tar_chunk.addfile( + tarinfo=tarinfo, + fileobj=image_buf, + ) + counter += 1 + if progress_callback: + progress_callback(i / total_length) + return media_meta, total_length + + def save_preview(self, preview_path): + shutil.copyfile(self._source_path[0], preview_path) #Note step, start, stop have no affect class DirectoryExtractor(ImageListExtractor): - def __init__(self, source_path, dest_path, image_quality, step=1, start=0, stop=0): + def __init__(self, source_path, image_quality, step=1, start=0, stop=0): image_paths = [] for source in source_path: for root, _, files in os.walk(source): @@ -132,8 +130,7 @@ def __init__(self, source_path, dest_path, image_quality, step=1, start=0, stop= paths = filter(lambda x: get_mime(x) == 'image', paths) image_paths.extend(paths) super().__init__( - source_path=sorted(image_paths), - dest_path=dest_path, + source_path=image_paths, image_quality=image_quality, step=1, start=0, @@ -142,74 +139,128 @@ def __init__(self, source_path, dest_path, image_quality, step=1, start=0, stop= #Note step, start, stop have no affect class ArchiveExtractor(DirectoryExtractor): - def __init__(self, source_path, dest_path, image_quality, step=1, start=0, stop=0): - Archive(source_path[0]).extractall(dest_path) + def __init__(self, source_path, image_quality, step=1, start=0, stop=0): + self._tmp_dir = self.create_tmp_dir() + Archive(source_path[0]).extractall(self._tmp_dir) super().__init__( - source_path=[dest_path], - dest_path=dest_path, + source_path=[self._tmp_dir], image_quality=image_quality, step=1, start=0, stop=0, ) -class VideoExtractor(MediaExtractor): - def __init__(self, source_path, dest_path, image_quality, step=1, start=0, stop=0): - from cvat.apps.engine.log import slogger - _dest_path = tempfile.mkdtemp(prefix='cvat-', suffix='.data') + def __del__(self): + self.delete_tmp_dir(self._tmp_dir) + +#Note step, start, stop have no affect +class PDFExtractor(DirectoryExtractor): + def __init__(self, source_path, image_quality, step=1, start=0, stop=0): + if not source_path: + raise Exception('No PDF found') + + from pdf2image import convert_from_path + file_ = convert_from_path(source_path) + self._tmp_dir = self.create_tmp_dir() + basename = os.path.splitext(os.path.basename(source_path))[0] + for page_num, page in enumerate(file_): + output = os.path.join(self._tmp_dir, '{}{:09d}.jpeg'.format(basename, page_num)) + page.save(output, 'JPEG') + super().__init__( - source_path=source_path[0], - dest_path=_dest_path, + source_path=[self._tmp_storage], image_quality=image_quality, + step=1, + start=0, + stop=0, + ) + + def __del__(self): + self.delete_tmp_dir(self._tmp_dir) + +class VideoExtractor(DirectoryExtractor): + def __init__(self, source_path, image_quality, step=1, start=0, stop=0): + self._tmp_dir = self.create_tmp_dir() + self._video_source = source_path[0] + self._imagename_pattern = '%09d.jpeg' + self.extract_video( + video_source=self._video_source, + output_dir=self._tmp_dir, + quality=image_quality, step=step, start=start, stop=stop, - ) + imagename_pattern=self._imagename_pattern, + ) + + super().__init__( + source_path=[self._tmp_dir], + image_quality=image_quality, + step=step, + start=start, + stop=stop, + ) + + @staticmethod + def extract_video(video_source, output_dir, quality, step=1, start=0, stop=0, imagename_pattern='%09d.jpeg'): # translate inversed range 1:95 to 2:32 - translated_quality = 96 - self._image_quality + translated_quality = 96 - quality translated_quality = round((((translated_quality - 1) * (31 - 2)) / (95 - 1)) + 2) - self._tmp_output = tempfile.mkdtemp(prefix='cvat-', suffix='.data') - target_path = os.path.join(self._tmp_output, '%d.jpg') - output_opts = '-start_number 0 -b:v 10000k -vsync 0 -an -y -q:v ' + str(translated_quality) + target_path = os.path.join(output_dir, imagename_pattern) + output_opts = '-start_number 0 -b:v 10000k -vsync 0 -an -y -q:v {}'.format(translated_quality) filters = '' - if self._stop > 0: - filters = 'between(n,' + str(self._start) + ',' + str(self._stop) + ')' - elif self._start > 0: - filters = 'gte(n,' + str(self._start) + ')' - if self._step > 1: - filters += ('*' if filters else '') + 'not(mod(n-' + str(self._start) + ',' + str(self._step) + '))' + if stop > 0: + filters = 'between(n,' + str(start) + ',' + str(stop) + ')' + elif start > 0: + filters = 'gte(n,' + str(start) + ')' + + if step > 1: + filters += ('*' if filters else '') + 'not(mod(n-' + str(start) + ',' + str(step) + '))' + if filters: output_opts += " -vf select=\"'" + filters + "'\"" ff = FFmpeg( - inputs = {self._source_path: None}, - outputs = {target_path: output_opts}) + inputs = {video_source: None}, + outputs = {target_path: output_opts}, + ) slogger.glob.info("FFMpeg cmd: {} ".format(ff.cmd)) ff.run() - def _getframepath(self, k): - return "{0}/{1}.jpg".format(self._tmp_output, k) - - def __iter__(self): - i = 0 - while os.path.exists(self._getframepath(i)): - yield self._getframepath(i) - i += 1 - def __del__(self): - if self._tmp_output: - shutil.rmtree(self._tmp_output) - - def __getitem__(self, k): - return self._getframepath(k) - - def __len__(self): - return len(os.listdir(self._tmp_output)) + self.delete_tmp_dir(self._tmp_dir) def save_image(self, k, dest_path): shutil.copyfile(self[k], dest_path) + def save_as_chunks(self, chunk_size, task, progress_callback=None): + chunk_size = 36 + if not self._source_path: + raise Exception('No data to compress') + + for i in range(math.ceil(len(self._source_path) / chunk_size)): + start_frame = i * chunk_size + input_images = os.path.join(self._tmp_dir, self._imagename_pattern) + input_options = '-f image2 -framerate 25 -start_number {}'.format(start_frame) + output_chunk = task.get_chunk_path(i) + self.prepare_dirs(output_chunk) + output_options = '-vframes {} -codec:v mpeg1video -q:v 0'.format(chunk_size) + + ff = FFmpeg( + inputs = {input_images: input_options}, + outputs = {output_chunk: output_options}, + ) + + slogger.glob.info("FFMpeg cmd: {} ".format(ff.cmd)) + ff.run() + if progress_callback: + progress_callback(i / len(self._source_path)) + image = Image.open(self[0]) + width, height = image.size + image.close() + return [{'name': self._video_source, 'size': (width, height)}], len(self._source_path) + def _is_archive(path): mime = mimetypes.guess_type(path) mime_type = mime[0] @@ -225,9 +276,7 @@ def _is_video(path): def _is_image(path): mime = mimetypes.guess_type(path) - # Exclude vector graphic images because Pillow cannot work with them - return mime[0] is not None and mime[0].startswith('image') and \ - not mime[0].startswith('image/svg') + return mime[0] is not None and mime[0].startswith('image') def _is_dir(path): return os.path.isdir(path) diff --git a/cvat/apps/engine/migrations/0020_remove_task_flipped.py b/cvat/apps/engine/migrations/0020_remove_task_flipped.py index 1c09cea2fa84..7ca57e880417 100644 --- a/cvat/apps/engine/migrations/0020_remove_task_flipped.py +++ b/cvat/apps/engine/migrations/0020_remove_task_flipped.py @@ -3,13 +3,54 @@ from django.db import migrations from django.conf import settings -from cvat.apps.engine.task import get_image_meta_cache from cvat.apps.engine.models import Job, ShapeType +from cvat.apps.engine.media_extractors import get_mime from PIL import Image - +from ast import literal_eval import os +def make_image_meta_cache(db_task): + with open(db_task.get_image_meta_cache_path(), 'w') as meta_file: + cache = { + 'original_size': [] + } + + if db_task.mode == 'interpolation': + image = Image.open(db_task.get_frame_path(0)) + cache['original_size'].append({ + 'width': image.size[0], + 'height': image.size[1] + }) + image.close() + else: + filenames = [] + for root, _, files in os.walk(db_task.get_upload_dirname()): + fullnames = map(lambda f: os.path.join(root, f), files) + images = filter(lambda x: get_mime(x) == 'image', fullnames) + filenames.extend(images) + filenames.sort() + + for image_path in filenames: + image = Image.open(image_path) + cache['original_size'].append({ + 'width': image.size[0], + 'height': image.size[1] + }) + image.close() + + meta_file.write(str(cache)) + + +def get_image_meta_cache(db_task): + try: + with open(db_task.get_image_meta_cache_path()) as meta_cache_file: + return literal_eval(meta_cache_file.read()) + except Exception: + make_image_meta_cache(db_task) + with open(db_task.get_image_meta_cache_path()) as meta_cache_file: + return literal_eval(meta_cache_file.read()) + def _flip_shape(shape, size): if shape.type == ShapeType.RECTANGLE: diff --git a/cvat/apps/engine/migrations/0022_auto_20191004_0817.py b/cvat/apps/engine/migrations/0022_auto_20191004_0817.py deleted file mode 100644 index d6701bf1167d..000000000000 --- a/cvat/apps/engine/migrations/0022_auto_20191004_0817.py +++ /dev/null @@ -1,38 +0,0 @@ -# Generated by Django 2.2.3 on 2019-10-04 08:17 - -import cvat.apps.engine.models -from django.conf import settings -from django.db import migrations, models -import django.db.models.deletion - - -class Migration(migrations.Migration): - - dependencies = [ - migrations.swappable_dependency(settings.AUTH_USER_MODEL), - ('engine', '0021_auto_20190826_1827'), - ] - - operations = [ - migrations.CreateModel( - name='Project', - fields=[ - ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), - ('name', cvat.apps.engine.models.SafeCharField(max_length=256)), - ('bug_tracker', models.CharField(blank=True, default='', max_length=2000)), - ('created_date', models.DateTimeField(auto_now_add=True)), - ('updated_date', models.DateTimeField(auto_now_add=True)), - ('status', models.CharField(choices=[('annotation', 'ANNOTATION'), ('validation', 'VALIDATION'), ('completed', 'COMPLETED')], default=cvat.apps.engine.models.StatusChoice('annotation'), max_length=32)), - ('assignee', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='+', to=settings.AUTH_USER_MODEL)), - ('owner', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='+', to=settings.AUTH_USER_MODEL)), - ], - options={ - 'default_permissions': (), - }, - ), - migrations.AddField( - model_name='task', - name='project', - field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='tasks', related_query_name='task', to='engine.Project'), - ), - ] diff --git a/cvat/apps/engine/migrations/0022_task_data_chunk_size.py b/cvat/apps/engine/migrations/0022_task_data_chunk_size.py new file mode 100644 index 000000000000..1b367d96f3b8 --- /dev/null +++ b/cvat/apps/engine/migrations/0022_task_data_chunk_size.py @@ -0,0 +1,18 @@ +# Generated by Django 2.2.4 on 2019-08-28 13:24 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('engine', '0021_auto_20190826_1827'), + ] + + operations = [ + migrations.AddField( + model_name='task', + name='data_chunk_size', + field=models.PositiveIntegerField(default=300), + ), + ] diff --git a/cvat/apps/engine/models.py b/cvat/apps/engine/models.py index e55dcd24f215..4e06455cee5c 100644 --- a/cvat/apps/engine/models.py +++ b/cvat/apps/engine/models.py @@ -33,26 +33,7 @@ def choices(self): def __str__(self): return self.value -class Project(models.Model): - name = SafeCharField(max_length=256) - owner = models.ForeignKey(User, null=True, blank=True, - on_delete=models.SET_NULL, related_name="+") - assignee = models.ForeignKey(User, null=True, blank=True, - on_delete=models.SET_NULL, related_name="+") - bug_tracker = models.CharField(max_length=2000, blank=True, default="") - created_date = models.DateTimeField(auto_now_add=True) - updated_date = models.DateTimeField(auto_now_add=True) - status = models.CharField(max_length=32, choices=StatusChoice.choices(), - default=StatusChoice.ANNOTATION) - - # Extend default permission model - class Meta: - default_permissions = () - class Task(models.Model): - project = models.ForeignKey(Project, on_delete=models.CASCADE, - null=True, blank=True, related_name="tasks", - related_query_name="task") name = SafeCharField(max_length=256) size = models.PositiveIntegerField() mode = models.CharField(max_length=32) @@ -73,19 +54,29 @@ class Task(models.Model): frame_filter = models.CharField(max_length=256, default="", blank=True) status = models.CharField(max_length=32, choices=StatusChoice.choices(), default=StatusChoice.ANNOTATION) + data_chunk_size = models.PositiveIntegerField(default=300) # Extend default permission model class Meta: default_permissions = () + @staticmethod + def _get_dest_dir(index): + return str(int(index) // 10000), str(int(index) // 100) + def get_frame_path(self, frame): - d1 = str(int(frame) // 10000) - d2 = str(int(frame) // 100) + d1, d2 = self._get_dest_dir(frame) path = os.path.join(self.get_data_dirname(), d1, d2, str(frame) + '.jpg') return path + def get_chunk_path(self, chunk): + ext = 'ts' if self.mode == 'interpolation' else 'tar' + path = os.path.join(self.get_data_dirname(), + '{}.{}'.format(chunk, ext)) + return path + def get_frame_step(self): match = re.search("step\s*=\s*([1-9]\d*)", self.frame_filter) return int(match.group(1)) if match else 1 @@ -102,9 +93,6 @@ def get_log_path(self): def get_client_log_path(self): return os.path.join(self.get_task_dirname(), "client.log") - def get_image_meta_cache_path(self): - return os.path.join(self.get_task_dirname(), "image_meta.cache") - def get_task_dirname(self): return os.path.join(settings.DATA_ROOT, str(self.id)) diff --git a/cvat/apps/engine/serializers.py b/cvat/apps/engine/serializers.py index 53729a0615b7..471bf9d4a217 100644 --- a/cvat/apps/engine/serializers.py +++ b/cvat/apps/engine/serializers.py @@ -197,7 +197,7 @@ class Meta: 'bug_tracker', 'created_date', 'updated_date', 'overlap', 'segment_size', 'z_order', 'status', 'labels', 'segments', 'image_quality', 'start_frame', 'stop_frame', 'frame_filter', - 'project') + 'data_chunk_size') read_only_fields = ('size', 'mode', 'created_date', 'updated_date', 'status') write_once_fields = ('overlap', 'segment_size', 'image_quality') @@ -230,6 +230,7 @@ def create(self, validated_data): os.makedirs(upload_dir) output_dir = db_task.get_data_dirname() os.makedirs(output_dir) + db_task.save() return db_task @@ -246,7 +247,7 @@ def update(self, instance, validated_data): instance.start_frame = validated_data.get('start_frame', instance.start_frame) instance.stop_frame = validated_data.get('stop_frame', instance.stop_frame) instance.frame_filter = validated_data.get('frame_filter', instance.frame_filter) - instance.project = validated_data.get('project', instance.project) + instance.data_chunk_size = validated_data.get('data_chunk_size', instance.data_chunk_size) labels = validated_data.get('label_set', []) for label in labels: attributes = label.pop('attributespec_set', []) @@ -275,35 +276,8 @@ def update(self, instance, validated_data): db_attr.values = attr.get('values', db_attr.values) db_attr.save() - instance.save() return instance -class ProjectSerializer(serializers.ModelSerializer): - class Meta: - model = models.Project - fields = ('url', 'id', 'name', 'owner', 'assignee', 'bug_tracker', - 'created_date', 'updated_date', 'status') - read_only_fields = ('created_date', 'updated_date', 'status') - ordering = ['-id'] - -class BasicUserSerializer(serializers.ModelSerializer): - def validate(self, data): - if hasattr(self, 'initial_data'): - unknown_keys = set(self.initial_data.keys()) - set(self.fields.keys()) - if unknown_keys: - if set(['is_staff', 'is_superuser', 'groups']) & unknown_keys: - message = 'You do not have permissions to access some of' + \ - ' these fields: {}'.format(unknown_keys) - else: - message = 'Got unknown fields: {}'.format(unknown_keys) - raise serializers.ValidationError(message) - return data - - class Meta: - model = User - fields = ('url', 'id', 'username', 'first_name', 'last_name', 'email') - ordering = ['-id'] - class UserSerializer(serializers.ModelSerializer): groups = serializers.SlugRelatedField(many=True, slug_field='name', queryset=Group.objects.all()) @@ -312,7 +286,7 @@ class Meta: model = User fields = ('url', 'id', 'username', 'first_name', 'last_name', 'email', 'groups', 'is_staff', 'is_superuser', 'is_active', 'last_login', - 'date_joined') + 'date_joined', 'groups') read_only_fields = ('last_login', 'date_joined') write_only_fields = ('password', ) ordering = ['-id'] diff --git a/cvat/apps/engine/static/engine/js/annotationUI.js b/cvat/apps/engine/static/engine/js/annotationUI.js index 7148e412b50e..84a6f5addd8d 100644 --- a/cvat/apps/engine/static/engine/js/annotationUI.js +++ b/cvat/apps/engine/static/engine/js/annotationUI.js @@ -1,5 +1,5 @@ /* - * Copyright (C) 2018 Intel Corporation + * Copyright (C) 2018-2019 Intel Corporation * * SPDX-License-Identifier: MIT */ @@ -700,7 +700,8 @@ function callAnnotationUI(jid) { $.get('/api/v1/server/annotation/formats'), ).then((taskData, imageMetaData, annotationData, annotationFormats) => { $('#loadingOverlay').remove(); - setTimeout(() => { + setTimeout(async () => { + [window.cvatTask] = (await window.cvat.tasks.get({ id: taskData[0].id })); buildAnnotationUI(jobData, taskData[0], imageMetaData[0], annotationData[0], annotationFormats[0], loadJobEvent); }); diff --git a/cvat/apps/engine/static/engine/js/cvat-core.min.js b/cvat/apps/engine/static/engine/js/cvat-core.min.js index bf2b456991de..d2483acfcf08 100644 --- a/cvat/apps/engine/static/engine/js/cvat-core.min.js +++ b/cvat/apps/engine/static/engine/js/cvat-core.min.js @@ -1,15 +1,19822 @@ -window.cvat=function(t){var e={};function n(r){if(e[r])return e[r].exports;var o=e[r]={i:r,l:!1,exports:{}};return t[r].call(o.exports,o,o.exports,n),o.l=!0,o.exports}return n.m=t,n.c=e,n.d=function(t,e,r){n.o(t,e)||Object.defineProperty(t,e,{enumerable:!0,get:r})},n.r=function(t){"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(t,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(t,"__esModule",{value:!0})},n.t=function(t,e){if(1&e&&(t=n(t)),8&e)return t;if(4&e&&"object"==typeof t&&t&&t.__esModule)return t;var r=Object.create(null);if(n.r(r),Object.defineProperty(r,"default",{enumerable:!0,value:t}),2&e&&"string"!=typeof t)for(var o in t)n.d(r,o,function(e){return t[e]}.bind(null,o));return r},n.n=function(t){var e=t&&t.__esModule?function(){return t.default}:function(){return t};return n.d(e,"a",e),e},n.o=function(t,e){return Object.prototype.hasOwnProperty.call(t,e)},n.p="",n(n.s=90)}([function(t,e,n){(function(e){var n="object",r=function(t){return t&&t.Math==Math&&t};t.exports=r(typeof globalThis==n&&globalThis)||r(typeof window==n&&window)||r(typeof self==n&&self)||r(typeof e==n&&e)||Function("return this")()}).call(this,n(28))},function(t,e,n){var r=n(0),o=n(31),i=n(57),s=n(96),a=r.Symbol,c=o("wks");t.exports=function(t){return c[t]||(c[t]=s&&a[t]||(s?a:i)("Symbol."+t))}},function(t,e){t.exports=function(t){try{return!!t()}catch(t){return!0}}},function(t,e,n){var r=n(11);t.exports=function(t){if(!r(t))throw TypeError(String(t)+" is not an object");return t}},function(t,e,n){"use strict";var r=n(30),o=n(107),i=n(25),s=n(17),a=n(73),c=s.set,u=s.getterFor("Array Iterator");t.exports=a(Array,"Array",function(t,e){c(this,{type:"Array Iterator",target:r(t),index:0,kind:e})},function(){var t=u(this),e=t.target,n=t.kind,r=t.index++;return!e||r>=e.length?(t.target=void 0,{value:void 0,done:!0}):"keys"==n?{value:r,done:!1}:"values"==n?{value:e[r],done:!1}:{value:[r,e[r]],done:!1}},"values"),i.Arguments=i.Array,o("keys"),o("values"),o("entries")},function(t,e,n){n(9),(()=>{const e=n(112),r=n(114),o=n(48);class i extends Error{constructor(t){super(t);const n=(new Date).toISOString(),i=e.os.toString(),s=`${e.name} ${e.version}`,a=r.parse(this)[0],c=`${a.fileName}`,u=a.lineNumber,l=a.columnNumber,{jobID:f,taskID:p,clientID:h}=o;Object.defineProperties(this,Object.freeze({system:{get:()=>i},client:{get:()=>s},time:{get:()=>n},jobID:{get:()=>f},taskID:{get:()=>p},projID:{get:()=>void 0},clientID:{get:()=>h},filename:{get:()=>c},line:{get:()=>u},column:{get:()=>l}}))}async save(){const t={system:this.system,client:this.client,time:this.time,job_id:this.jobID,task_id:this.taskID,proj_id:this.projID,client_id:this.clientID,message:this.message,filename:this.filename,line:this.line,column:this.column,stack:this.stack};try{const e=n(18);await e.server.exception(t)}catch(t){}}}t.exports={Exception:i,ArgumentError:class extends i{constructor(t){super(t)}},DataError:class extends i{constructor(t){super(t)}},ScriptingError:class extends i{constructor(t){super(t)}},PluginError:class extends i{constructor(t){super(t)}},ServerError:class extends i{constructor(t,e){super(t),Object.defineProperties(this,Object.freeze({code:{get:()=>e}}))}}}})()},function(t,e,n){"use strict";var r=n(78),o=n(135),i=Object.prototype.toString;function s(t){return"[object Array]"===i.call(t)}function a(t){return null!==t&&"object"==typeof t}function c(t){return"[object Function]"===i.call(t)}function u(t,e){if(null!=t)if("object"!=typeof t&&(t=[t]),s(t))for(var n=0,r=t.length;ns;){var a,c,u,l=r[s++],f=i?l.ok:l.fail,p=l.resolve,h=l.reject,d=l.domain;try{f?(i||(2===e.rejection&&Y(t,e),e.rejection=1),!0===f?a=o:(d&&d.enter(),a=f(o),d&&(d.exit(),u=!0)),a===l.promise?h($("Promise-chain cycle")):(c=V(a))?c.call(a,p,h):p(a)):h(o)}catch(t){d&&!u&&d.exit(),h(t)}}e.reactions=[],e.notified=!1,n&&!e.rejection&&K(t,e)})}},H=function(t,e,n){var r,o;W?((r=M.createEvent("Event")).promise=e,r.reason=n,r.initEvent(t,!1,!0),c.dispatchEvent(r)):r={promise:e,reason:n},(o=c["on"+t])?o(r):"unhandledrejection"===t&&j("Unhandled promise rejection",n)},K=function(t,e){w.call(c,function(){var n,r=e.value;if(Z(e)&&(n=S(function(){G?R.emit("unhandledRejection",r,t):H("unhandledrejection",t,r)}),e.rejection=G||Z(e)?2:1,n.error))throw n.value})},Z=function(t){return 1!==t.rejection&&!t.parent},Y=function(t,e){w.call(c,function(){G?R.emit("rejectionHandled",t):H("rejectionhandled",t,e.value)})},Q=function(t,e,n,r){return function(o){t(e,n,o,r)}},tt=function(t,e,n,r){e.done||(e.done=!0,r&&(e=r),e.value=n,e.state=2,X(t,e,!0))},et=function(t,e,n,r){if(!e.done){e.done=!0,r&&(e=r);try{if(t===n)throw $("Promise can't be resolved itself");var o=V(n);o?O(function(){var r={done:!1};try{o.call(n,Q(et,t,r,e),Q(tt,t,r,e))}catch(n){tt(t,r,n,e)}}):(e.value=n,e.state=1,X(t,e,!1))}catch(n){tt(t,{done:!1},n,e)}}};J&&(N=function(t){b(this,N,_),d(t),r.call(this);var e=I(this);try{t(Q(et,this,e),Q(tt,this,e))}catch(t){tt(this,e,t)}},(r=function(t){F(this,{type:_,done:!1,notified:!1,parent:!1,reactions:[],rejection:!1,state:0,value:void 0})}).prototype=l(N.prototype,{then:function(t,e){var n=C(this),r=B(v(this,N));return r.ok="function"!=typeof t||t,r.fail="function"==typeof e&&e,r.domain=G?R.domain:void 0,n.parent=!0,n.reactions.push(r),0!=n.state&&X(this,n,!1),r.promise},catch:function(t){return this.then(void 0,t)}}),o=function(){var t=new r,e=I(t);this.promise=t,this.resolve=Q(et,t,e),this.reject=Q(tt,t,e)},k.f=B=function(t){return t===N||t===i?new o(t):U(t)},a||"function"!=typeof D||s({global:!0,enumerable:!0,forced:!0},{fetch:function(t){return x(N,D.apply(c,arguments))}})),s({global:!0,wrap:!0,forced:J},{Promise:N}),f(N,_,!1,!0),p(_),i=u.Promise,s({target:_,stat:!0,forced:J},{reject:function(t){var e=B(this);return e.reject.call(void 0,t),e.promise}}),s({target:_,stat:!0,forced:a||J},{resolve:function(t){return x(a&&this===i?N:this,t)}}),s({target:_,stat:!0,forced:q},{all:function(t){var e=this,n=B(e),r=n.resolve,o=n.reject,i=S(function(){var n=d(e.resolve),i=[],s=0,a=1;m(t,function(t){var c=s++,u=!1;i.push(void 0),a++,n.call(e,t).then(function(t){u||(u=!0,i[c]=t,--a||r(i))},o)}),--a||r(i)});return i.error&&o(i.value),n.promise},race:function(t){var e=this,n=B(e),r=n.reject,o=S(function(){var o=d(e.resolve);m(t,function(t){o.call(e,t).then(n.resolve,r)})});return o.error&&r(o.value),n.promise}})},function(t,e,n){var r=n(2);t.exports=!r(function(){return 7!=Object.defineProperty({},"a",{get:function(){return 7}}).a})},function(t,e){t.exports=function(t){return"object"==typeof t?null!==t:"function"==typeof t}},function(t,e,n){var r=n(10),o=n(14),i=n(29);t.exports=r?function(t,e,n){return o.f(t,e,i(1,n))}:function(t,e,n){return t[e]=n,t}},function(t,e,n){var r=n(0),o=n(40).f,i=n(12),s=n(16),a=n(43),c=n(58),u=n(62);t.exports=function(t,e){var n,l,f,p,h,d=t.target,b=t.global,g=t.stat;if(n=b?r:g?r[d]||a(d,{}):(r[d]||{}).prototype)for(l in e){if(p=e[l],f=t.noTargetGet?(h=o(n,l))&&h.value:n[l],!u(b?l:d+(g?".":"#")+l,t.forced)&&void 0!==f){if(typeof p==typeof f)continue;c(p,f)}(t.sham||f&&f.sham)&&i(p,"sham",!0),s(n,l,p,t)}}},function(t,e,n){var r=n(10),o=n(55),i=n(3),s=n(41),a=Object.defineProperty;e.f=r?a:function(t,e,n){if(i(t),e=s(e,!0),i(n),o)try{return a(t,e,n)}catch(t){}if("get"in n||"set"in n)throw TypeError("Accessors not supported");return"value"in n&&(t[e]=n.value),t}},function(t,e){var n={}.toString;t.exports=function(t){return n.call(t).slice(8,-1)}},function(t,e,n){var r=n(0),o=n(31),i=n(12),s=n(7),a=n(43),c=n(56),u=n(17),l=u.get,f=u.enforce,p=String(c).split("toString");o("inspectSource",function(t){return c.call(t)}),(t.exports=function(t,e,n,o){var c=!!o&&!!o.unsafe,u=!!o&&!!o.enumerable,l=!!o&&!!o.noTargetGet;"function"==typeof n&&("string"!=typeof e||s(n,"name")||i(n,"name",e),f(n).source=p.join("string"==typeof e?e:"")),t!==r?(c?!l&&t[e]&&(u=!0):delete t[e],u?t[e]=n:i(t,e,n)):u?t[e]=n:a(e,n)})(Function.prototype,"toString",function(){return"function"==typeof this&&l(this).source||c.call(this)})},function(t,e,n){var r,o,i,s=n(91),a=n(0),c=n(11),u=n(12),l=n(7),f=n(44),p=n(45),h=a.WeakMap;if(s){var d=new h,b=d.get,g=d.has,m=d.set;r=function(t,e){return m.call(d,t,e),e},o=function(t){return b.call(d,t)||{}},i=function(t){return g.call(d,t)}}else{var y=f("state");p[y]=!0,r=function(t,e){return u(t,y,e),e},o=function(t){return l(t,y)?t[y]:{}},i=function(t){return l(t,y)}}t.exports={set:r,get:o,has:i,enforce:function(t){return i(t)?o(t):r(t,{})},getterFor:function(t){return function(e){var n;if(!c(e)||(n=o(e)).type!==t)throw TypeError("Incompatible receiver, "+t+" required");return n}}}},function(t,e,n){n(9),n(116),(()=>{const e=n(121),{ServerError:r}=n(5),o=n(122),i=n(48);function s(t,e){if(t.response){const n=`${e}. `+`${t.message}. ${JSON.stringify(t.response.data)||""}.`;return new r(n,t.response.status)}const n=`${e}. `+`${t.message}.`;return new r(n,0)}const a=new class{constructor(){const a=n(133);a.defaults.withCredentials=!0,a.defaults.xsrfHeaderName="X-CSRFTOKEN",a.defaults.xsrfCookieName="csrftoken";let c=o.get("token");async function u(t=""){const{backendAPI:e}=i;let n=null;try{n=await a.get(`${e}/tasks?${t}`,{proxy:i.proxy})}catch(t){throw s(t,"Could not get tasks from a server")}return n.data.results.count=n.data.count,n.data.results}async function l(t){const{backendAPI:e}=i;try{await a.delete(`${e}/tasks/${t}`)}catch(t){throw s(t,"Could not delete the task from the server")}}c&&(a.defaults.headers.common.Authorization=`Token ${c}`),Object.defineProperties(this,Object.freeze({server:{value:Object.freeze({about:async function(){const{backendAPI:t}=i;let e=null;try{e=await a.get(`${t}/server/about`,{proxy:i.proxy})}catch(t){throw s(t,'Could not get "about" information from the server')}return e.data},share:async function(t){const{backendAPI:e}=i;t=encodeURIComponent(t);let n=null;try{n=await a.get(`${e}/server/share?directory=${t}`,{proxy:i.proxy})}catch(t){throw s(t,'Could not get "share" information from the server')}return n.data},formats:async function(){const{backendAPI:t}=i;let e=null;try{e=await a.get(`${t}/server/annotation/formats`,{proxy:i.proxy})}catch(t){throw s(t,"Could not get annotation formats from the server")}return e.data},exception:async function(t){const{backendAPI:e}=i;try{await a.post(`${e}/server/exception`,JSON.stringify(t),{proxy:i.proxy,headers:{"Content-Type":"application/json"}})}catch(t){throw s(t,"Could not send an exception to the server")}},login:async function(t,e){const n=[`${encodeURIComponent("username")}=${encodeURIComponent(t)}`,`${encodeURIComponent("password")}=${encodeURIComponent(e)}`].join("&").replace(/%20/g,"+");let r=null;try{r=await a.post(`${i.backendAPI}/auth/login`,n,{proxy:i.proxy})}catch(t){throw s(t,"Could not login on a server")}if(r.headers["set-cookie"]){const t=r.headers["set-cookie"].join(";");a.defaults.headers.common.Cookie=t}c=r.data.key,o.set("token",c),a.defaults.headers.common.Authorization=`Token ${c}`},logout:async function(){try{await a.post(`${i.backendAPI}/auth/logout`,{proxy:i.proxy})}catch(t){throw s(t,"Could not logout from the server")}o.remove("token"),a.defaults.headers.common.Authorization=""},authorized:async function(){try{await t.exports.users.getSelf()}catch(t){if(401===t.code)return!1;throw t}return!0},register:async function(t,e,n,r,o,c){let u=null;try{const l=JSON.stringify({username:t,first_name:e,last_name:n,email:r,password1:o,password2:c});u=await a.post(`${i.backendAPI}/auth/register`,l,{proxy:i.proxy,headers:{"Content-Type":"application/json"}})}catch(e){throw s(e,`Could not register '${t}' user on the server`)}return u.data}}),writable:!1},tasks:{value:Object.freeze({getTasks:u,saveTask:async function(t,e){const{backendAPI:n}=i;try{await a.patch(`${n}/tasks/${t}`,JSON.stringify(e),{proxy:i.proxy,headers:{"Content-Type":"application/json"}})}catch(t){throw s(t,"Could not save the task on the server")}},createTask:async function(t,n,o){const{backendAPI:c}=i,f=new e;for(const t in n)if(Object.prototype.hasOwnProperty.call(n,t))for(let e=0;e{setTimeout(async function i(){try{const u=await a.get(`${c}/tasks/${t}/status`);if(["Queued","Started"].includes(u.data.state))""!==u.data.message&&o(u.data.message),setTimeout(i,1e3);else if("Finished"===u.data.state)e();else if("Failed"===u.data.state){const t="Could not create the task on the server. "+`${u.data.message}.`;n(new r(t,400))}else n(new r(`Unknown task state has been received: ${u.data.state}`,500))}catch(t){n(s(t,"Could not put task to the server"))}},1e3)})}(p.data.id)}catch(t){throw await l(p.data.id),t}return(await u(`?id=${p.id}`))[0]},deleteTask:l}),writable:!1},jobs:{value:Object.freeze({getJob:async function(t){const{backendAPI:e}=i;let n=null;try{n=await a.get(`${e}/jobs/${t}`,{proxy:i.proxy})}catch(t){throw s(t,"Could not get jobs from a server")}return n.data},saveJob:async function(t,e){const{backendAPI:n}=i;try{await a.patch(`${n}/jobs/${t}`,JSON.stringify(e),{proxy:i.proxy,headers:{"Content-Type":"application/json"}})}catch(t){throw s(t,"Could not save the job on the server")}}}),writable:!1},users:{value:Object.freeze({getUsers:async function(){const{backendAPI:t}=i;let e=null;try{e=await a.get(`${t}/users`,{proxy:i.proxy})}catch(t){throw s(t,"Could not get users from the server")}return e.data.results},getSelf:async function(){const{backendAPI:t}=i;let e=null;try{e=await a.get(`${t}/users/self`,{proxy:i.proxy})}catch(t){throw s(t,"Could not get user data from the server")}return e.data}}),writable:!1},frames:{value:Object.freeze({getData:async function(t,e){const{backendAPI:n}=i;let r=null;try{r=await a.get(`${n}/tasks/${t}/frames/${e}`,{proxy:i.proxy,responseType:"blob"})}catch(n){throw s(n,`Could not get frame ${e} for the task ${t} from the server`)}return r.data},getMeta:async function(t){const{backendAPI:e}=i;let n=null;try{n=await a.get(`${e}/tasks/${t}/frames/meta`,{proxy:i.proxy})}catch(e){throw s(e,`Could not get frame meta info for the task ${t} from the server`)}return n.data}}),writable:!1},annotations:{value:Object.freeze({updateAnnotations:async function(t,e,n,r){const{backendAPI:o}=i;let c=null,u=null;"PUT"===r.toUpperCase()?(c=a.put.bind(a),u=`${o}/${t}s/${e}/annotations`):(c=a.patch.bind(a),u=`${o}/${t}s/${e}/annotations?action=${r}`);let l=null;try{l=await c(u,JSON.stringify(n),{proxy:i.proxy,headers:{"Content-Type":"application/json"}})}catch(n){throw s(n,`Could not ${r} annotations for the ${t} ${e} on the server`)}return l.data},getAnnotations:async function(t,e){const{backendAPI:n}=i;let r=null;try{r=await a.get(`${n}/${t}s/${e}/annotations`,{proxy:i.proxy})}catch(n){throw s(n,`Could not get annotations for the ${t} ${e} from the server`)}return r.data},dumpAnnotations:async function(t,e,n){const{backendAPI:r}=i,o=e.replace(/\//g,"_");let c=`${r}/tasks/${t}/annotations/${o}?format=${n}`;return new Promise((e,n)=>{setTimeout(async function r(){try{202===(await a.get(`${c}`,{proxy:i.proxy})).status?setTimeout(r,3e3):e(c=`${c}&action=download`)}catch(e){n(s(e,`Could not dump annotations for the task ${t} from the server`))}})})},uploadAnnotations:async function(t,n,r,o){const{backendAPI:c}=i;let u=new e;return u.append("annotation_file",r),new Promise((r,l)=>{setTimeout(async function f(){try{202===(await a.put(`${c}/${t}s/${n}/annotations?format=${o}`,u,{proxy:i.proxy})).status?(u=new e,setTimeout(f,3e3)):r()}catch(e){l(s(e,`Could not upload annotations for the ${t} ${n}`))}})})}}),writable:!1}}))}};t.exports=a})()},function(t,e,n){(function(e){var n=Object.assign?Object.assign:function(t,e,n,r){for(var o=1;o{const e=Object.freeze({DIR:"DIR",REG:"REG"}),n=Object.freeze({ANNOTATION:"annotation",VALIDATION:"validation",COMPLETED:"completed"}),r=Object.freeze({ANNOTATION:"annotation",INTERPOLATION:"interpolation"}),o=Object.freeze({CHECKBOX:"checkbox",RADIO:"radio",SELECT:"select",NUMBER:"number",TEXT:"text"}),i=Object.freeze({TAG:"tag",SHAPE:"shape",TRACK:"track"}),s=Object.freeze({RECTANGLE:"rectangle",POLYGON:"polygon",POLYLINE:"polyline",POINTS:"points"}),a=Object.freeze({ALL:"all",SHAPE:"shape",NONE:"none"});t.exports={ShareFileType:e,TaskStatus:n,TaskMode:r,AttributeType:o,ObjectType:i,ObjectShape:s,VisibleState:a,LogType:{pasteObject:0,changeAttribute:1,dragObject:2,deleteObject:3,pressShortcut:4,resizeObject:5,sendLogs:6,saveJob:7,jumpFrame:8,drawObject:9,changeLabel:10,sendTaskInfo:11,loadJob:12,moveImage:13,zoomImage:14,lockObject:15,mergeObjects:16,copyObject:17,propagateObject:18,undoAction:19,redoAction:20,sendUserActivity:21,sendException:22,changeFrame:23,debugInfo:24,fitImage:25,rotateImage:26}}})()},function(t,e){t.exports=function(t){if(null==t)throw TypeError("Can't call method on "+t);return t}},function(t,e){t.exports=!1},function(t,e,n){var r=n(14).f,o=n(7),i=n(1)("toStringTag");t.exports=function(t,e,n){t&&!o(t=n?t:t.prototype,i)&&r(t,i,{configurable:!0,value:e})}},function(t,e){t.exports=function(t){if("function"!=typeof t)throw TypeError(String(t)+" is not a function");return t}},function(t,e){t.exports={}},function(t,e,n){n(106),n(4),n(9),n(8),(()=>{const{PluginError:e}=n(5),r=[];class o{static async apiWrapper(t,...n){const r=await o.list();for(const o of r){const r=o.functions.filter(e=>e.callback===t)[0];if(r&&r.enter)try{await r.enter.call(this,o,...n)}catch(t){throw t instanceof e?t:new e(`Exception in plugin ${o.name}: ${t.toString()}`)}}let i=await t.implementation.call(this,...n);for(const o of r){const r=o.functions.filter(e=>e.callback===t)[0];if(r&&r.leave)try{i=await r.leave.call(this,o,i,...n)}catch(t){throw t instanceof e?t:new e(`Exception in plugin ${o.name}: ${t.toString()}`)}}return i}static async register(t){const n=[];if("object"!=typeof t)throw new e(`Plugin should be an object, but got "${typeof t}"`);if(!("name"in t)||"string"!=typeof t.name)throw new e('Plugin must contain a "name" field and it must be a string');if(!("description"in t)||"string"!=typeof t.description)throw new e('Plugin must contain a "description" field and it must be a string');if("functions"in t)throw new e('Plugin must not contain a "functions" field');!function t(e,r){const o={};for(const n in e)Object.prototype.hasOwnProperty.call(e,n)&&("object"==typeof e[n]?Object.prototype.hasOwnProperty.call(r,n)&&t(e[n],r[n]):["enter","leave"].includes(n)&&"function"==typeof r&&(e[n],1)&&(o.callback=r,o[n]=e[n]));Object.keys(o).length&&n.push(o)}(t,{cvat:this}),Object.defineProperty(t,"functions",{value:n,writable:!1}),r.push(t)}static async list(){return r}}t.exports=o})()},function(t,e,n){var r=n(21);t.exports=function(t){return Object(r(t))}},function(t,e){var n;n=function(){return this}();try{n=n||new Function("return this")()}catch(t){"object"==typeof window&&(n=window)}t.exports=n},function(t,e){t.exports=function(t,e){return{enumerable:!(1&t),configurable:!(2&t),writable:!(4&t),value:e}}},function(t,e,n){var r=n(54),o=n(21);t.exports=function(t){return r(o(t))}},function(t,e,n){var r=n(0),o=n(43),i=n(22),s=r["__core-js_shared__"]||o("__core-js_shared__",{});(t.exports=function(t,e){return s[t]||(s[t]=void 0!==e?e:{})})("versions",[]).push({version:"3.1.3",mode:i?"pure":"global",copyright:"© 2019 Denis Pushkarev (zloirock.ru)"})},function(t,e,n){var r=n(59),o=n(0),i=function(t){return"function"==typeof t?t:void 0};t.exports=function(t,e){return arguments.length<2?i(r[t])||i(o[t]):r[t]&&r[t][e]||o[t]&&o[t][e]}},function(t,e,n){var r=n(34),o=Math.min;t.exports=function(t){return t>0?o(r(t),9007199254740991):0}},function(t,e){var n=Math.ceil,r=Math.floor;t.exports=function(t){return isNaN(t=+t)?0:(t>0?r:n)(t)}},function(t,e,n){var r=n(24);t.exports=function(t,e,n){if(r(t),void 0===e)return t;switch(n){case 0:return function(){return t.call(e)};case 1:return function(n){return t.call(e,n)};case 2:return function(n,r){return t.call(e,n,r)};case 3:return function(n,r,o){return t.call(e,n,r,o)}}return function(){return t.apply(e,arguments)}}},function(t,e,n){var r=n(99),o=n(25),i=n(1)("iterator");t.exports=function(t){if(null!=t)return t[i]||t["@@iterator"]||o[r(t)]}},function(t,e,n){n(4),n(9),n(151),n(8),n(52),(()=>{const e=n(26),r=n(18),{getFrame:o}=n(154),{ArgumentError:i}=n(5),{TaskStatus:s}=n(20),{Label:a}=n(38);function c(t){Object.defineProperties(t,{annotations:Object.freeze({value:{async upload(n,r){return await e.apiWrapper.call(this,t.annotations.upload,n,r)},async save(){return await e.apiWrapper.call(this,t.annotations.save)},async clear(n=!1){return await e.apiWrapper.call(this,t.annotations.clear,n)},async dump(n,r){return await e.apiWrapper.call(this,t.annotations.dump,n,r)},async statistics(){return await e.apiWrapper.call(this,t.annotations.statistics)},async put(n=[]){return await e.apiWrapper.call(this,t.annotations.put,n)},async get(n,r={}){return await e.apiWrapper.call(this,t.annotations.get,n,r)},async search(n,r,o){return await e.apiWrapper.call(this,t.annotations.search,n,r,o)},async select(n,r,o){return await e.apiWrapper.call(this,t.annotations.select,n,r,o)},async hasUnsavedChanges(){return await e.apiWrapper.call(this,t.annotations.hasUnsavedChanges)},async merge(n){return await e.apiWrapper.call(this,t.annotations.merge,n)},async split(n,r){return await e.apiWrapper.call(this,t.annotations.split,n,r)},async group(n,r=!1){return await e.apiWrapper.call(this,t.annotations.group,n,r)}},writable:!0}),frames:Object.freeze({value:{async get(n){return await e.apiWrapper.call(this,t.frames.get,n)}},writable:!0}),logs:Object.freeze({value:{async put(n,r){return await e.apiWrapper.call(this,t.logs.put,n,r)},async save(n){return await e.apiWrapper.call(this,t.logs.save,n)}},writable:!0}),actions:Object.freeze({value:{async undo(n){return await e.apiWrapper.call(this,t.actions.undo,n)},async redo(n){return await e.apiWrapper.call(this,t.actions.redo,n)},async clear(){return await e.apiWrapper.call(this,t.actions.clear)}},writable:!0}),events:Object.freeze({value:{async subscribe(n,r){return await e.apiWrapper.call(this,t.events.subscribe,n,r)},async unsubscribe(n,r=null){return await e.apiWrapper.call(this,t.events.unsubscribe,n,r)}},writable:!0})})}class u{constructor(){}}class l extends u{constructor(t){super();const e={id:void 0,assignee:void 0,status:void 0,start_frame:void 0,stop_frame:void 0,task:void 0};for(const n in e)if(Object.prototype.hasOwnProperty.call(e,n)&&(n in t&&(e[n]=t[n]),void 0===e[n]))throw new i(`Job field "${n}" was not initialized`);Object.defineProperties(this,Object.freeze({id:{get:()=>e.id},assignee:{get:()=>e.assignee,set:()=>t=>{if(!Number.isInteger(t)||t<0)throw new i("Value must be a non negative integer");e.assignee=t}},status:{get:()=>e.status,set:t=>{const n=s;let r=!1;for(const e in n)if(n[e]===t){r=!0;break}if(!r)throw new i("Value must be a value from the enumeration cvat.enums.TaskStatus");e.status=t}},startFrame:{get:()=>e.start_frame},stopFrame:{get:()=>e.stop_frame},task:{get:()=>e.task}})),this.annotations={get:Object.getPrototypeOf(this).annotations.get.bind(this),put:Object.getPrototypeOf(this).annotations.put.bind(this),save:Object.getPrototypeOf(this).annotations.save.bind(this),dump:Object.getPrototypeOf(this).annotations.dump.bind(this),merge:Object.getPrototypeOf(this).annotations.merge.bind(this),split:Object.getPrototypeOf(this).annotations.split.bind(this),group:Object.getPrototypeOf(this).annotations.group.bind(this),clear:Object.getPrototypeOf(this).annotations.clear.bind(this),upload:Object.getPrototypeOf(this).annotations.upload.bind(this),select:Object.getPrototypeOf(this).annotations.select.bind(this),statistics:Object.getPrototypeOf(this).annotations.statistics.bind(this),hasUnsavedChanges:Object.getPrototypeOf(this).annotations.hasUnsavedChanges.bind(this)},this.frames={get:Object.getPrototypeOf(this).frames.get.bind(this)}}async save(){return await e.apiWrapper.call(this,l.prototype.save)}}class f extends u{constructor(t){super();const e={id:void 0,name:void 0,status:void 0,size:void 0,mode:void 0,owner:void 0,assignee:void 0,created_date:void 0,updated_date:void 0,bug_tracker:void 0,overlap:void 0,segment_size:void 0,z_order:void 0,image_quality:void 0,start_frame:void 0,stop_frame:void 0,frame_filter:void 0};for(const n in e)Object.prototype.hasOwnProperty.call(e,n)&&n in t&&(e[n]=t[n]);if(e.labels=[],e.jobs=[],e.files=Object.freeze({server_files:[],client_files:[],remote_files:[]}),Array.isArray(t.segments))for(const n of t.segments)if(Array.isArray(n.jobs))for(const t of n.jobs){const r=new l({url:t.url,id:t.id,assignee:t.assignee,status:t.status,start_frame:n.start_frame,stop_frame:n.stop_frame,task:this});e.jobs.push(r)}if(Array.isArray(t.labels))for(const n of t.labels){const t=new a(n);e.labels.push(t)}Object.defineProperties(this,Object.freeze({id:{get:()=>e.id},name:{get:()=>e.name,set:t=>{if(!t.trim().length)throw new i("Value must not be empty");e.name=t}},status:{get:()=>e.status},size:{get:()=>e.size},mode:{get:()=>e.mode},owner:{get:()=>e.owner},assignee:{get:()=>e.assignee,set:()=>t=>{if(!Number.isInteger(t)||t<0)throw new i("Value must be a non negative integer");e.assignee=t}},createdDate:{get:()=>e.created_date},updatedDate:{get:()=>e.updated_date},bugTracker:{get:()=>e.bug_tracker,set:t=>{e.bug_tracker=t}},overlap:{get:()=>e.overlap,set:t=>{if(!Number.isInteger(t)||t<0)throw new i("Value must be a non negative integer");e.overlap=t}},segmentSize:{get:()=>e.segment_size,set:t=>{if(!Number.isInteger(t)||t<0)throw new i("Value must be a positive integer");e.segment_size=t}},zOrder:{get:()=>e.z_order,set:t=>{if("boolean"!=typeof t)throw new i("Value must be a boolean");e.z_order=t}},imageQuality:{get:()=>e.image_quality,set:t=>{if(!Number.isInteger(t)||t<0)throw new i("Value must be a positive integer");e.image_quality=t}},labels:{get:()=>[...e.labels],set:t=>{if(!Array.isArray(t))throw new i("Value must be an array of Labels");for(const e of t)if(!(e instanceof a))throw new i("Each array value must be an instance of Label. "+`${typeof e} was found`);void 0===e.id?e.labels=[...t]:e.labels=e.labels.concat([...t])}},jobs:{get:()=>[...e.jobs]},serverFiles:{get:()=>[...e.files.server_files],set:t=>{if(!Array.isArray(t))throw new i(`Value must be an array. But ${typeof t} has been got.`);for(const e of t)if("string"!=typeof e)throw new i(`Array values must be a string. But ${typeof e} has been got.`);Array.prototype.push.apply(e.files.server_files,t)}},clientFiles:{get:()=>[...e.files.client_files],set:t=>{if(!Array.isArray(t))throw new i(`Value must be an array. But ${typeof t} has been got.`);for(const e of t)if(!(e instanceof File))throw new i(`Array values must be a File. But ${e.constructor.name} has been got.`);Array.prototype.push.apply(e.files.client_files,t)}},remoteFiles:{get:()=>[...e.files.remote_files],set:t=>{if(!Array.isArray(t))throw new i(`Value must be an array. But ${typeof t} has been got.`);for(const e of t)if("string"!=typeof e)throw new i(`Array values must be a string. But ${typeof e} has been got.`);Array.prototype.push.apply(e.files.remote_files,t)}},startFrame:{get:()=>e.start_frame,set:t=>{if(!Number.isInteger(t)||t<0)throw new i("Value must be a not negative integer");e.start_frame=t}},stopFrame:{get:()=>e.stop_frame,set:t=>{if(!Number.isInteger(t)||t<0)throw new i("Value must be a not negative integer");e.stop_frame=t}},frameFilter:{get:()=>e.frame_filter,set:t=>{if("string"!=typeof t)throw new i(`Filter value must be a string. But ${typeof t} has been got.`);e.frame_filter=t}}})),this.annotations={get:Object.getPrototypeOf(this).annotations.get.bind(this),put:Object.getPrototypeOf(this).annotations.put.bind(this),save:Object.getPrototypeOf(this).annotations.save.bind(this),dump:Object.getPrototypeOf(this).annotations.dump.bind(this),merge:Object.getPrototypeOf(this).annotations.merge.bind(this),split:Object.getPrototypeOf(this).annotations.split.bind(this),group:Object.getPrototypeOf(this).annotations.group.bind(this),clear:Object.getPrototypeOf(this).annotations.clear.bind(this),upload:Object.getPrototypeOf(this).annotations.upload.bind(this),select:Object.getPrototypeOf(this).annotations.select.bind(this),statistics:Object.getPrototypeOf(this).annotations.statistics.bind(this),hasUnsavedChanges:Object.getPrototypeOf(this).annotations.hasUnsavedChanges.bind(this)},this.frames={get:Object.getPrototypeOf(this).frames.get.bind(this)}}async save(t=(()=>{})){return await e.apiWrapper.call(this,f.prototype.save,t)}async delete(){return await e.apiWrapper.call(this,f.prototype.delete)}}t.exports={Job:l,Task:f};const{getAnnotations:p,putAnnotations:h,saveAnnotations:d,hasUnsavedChanges:b,mergeAnnotations:g,splitAnnotations:m,groupAnnotations:y,clearAnnotations:v,selectObject:w,annotationsStatistics:O,uploadAnnotations:x,dumpAnnotations:j}=n(156);c(l.prototype),c(f.prototype),l.prototype.save.implementation=async function(){if(this.id){const t={status:this.status};return await r.jobs.saveJob(this.id,t),this}throw new i("Can not save job without and id")},l.prototype.frames.get.implementation=async function(t){if(!Number.isInteger(t)||t<0)throw new i(`Frame must be a positive integer. Got: "${t}"`);if(tthis.stopFrame)throw new i(`The frame with number ${t} is out of the job`);return await o(this.task.id,this.task.mode,t)},l.prototype.annotations.get.implementation=async function(t,e){if(tthis.stopFrame)throw new i(`Frame ${t} does not exist in the job`);return await p(this,t,e)},l.prototype.annotations.save.implementation=async function(t){return await d(this,t)},l.prototype.annotations.merge.implementation=async function(t){return await g(this,t)},l.prototype.annotations.split.implementation=async function(t,e){return await m(this,t,e)},l.prototype.annotations.group.implementation=async function(t,e){return await y(this,t,e)},l.prototype.annotations.hasUnsavedChanges.implementation=function(){return b(this)},l.prototype.annotations.clear.implementation=async function(t){return await v(this,t)},l.prototype.annotations.select.implementation=function(t,e,n){return w(this,t,e,n)},l.prototype.annotations.statistics.implementation=function(){return O(this)},l.prototype.annotations.put.implementation=function(t){return h(this,t)},l.prototype.annotations.upload.implementation=async function(t,e){return await x(this,t,e)},l.prototype.annotations.dump.implementation=async function(t,e){return await j(this,t,e)},f.prototype.save.implementation=async function(t){if(void 0!==this.id){const t={name:this.name,bug_tracker:this.bugTracker,z_order:this.zOrder,labels:[...this.labels.map(t=>t.toJSON())]};return await r.tasks.saveTask(this.id,t),this}const e={name:this.name,labels:this.labels.map(t=>t.toJSON()),image_quality:this.imageQuality,z_order:Boolean(this.zOrder)};void 0!==this.bugTracker&&(e.bug_tracker=this.bugTracker),void 0!==this.segmentSize&&(e.segment_size=this.segmentSize),void 0!==this.overlap&&(e.overlap=this.overlap),void 0!==this.startFrame&&(e.start_frame=this.startFrame),void 0!==this.stopFrame&&(e.stop_frame=this.stopFrame),void 0!==this.frameFilter&&(e.frame_filter=this.frameFilter);const n={client_files:this.clientFiles,server_files:this.serverFiles,remote_files:this.remoteFiles},o=await r.tasks.createTask(e,n,t);return new f(o)},f.prototype.delete.implementation=async function(){return await r.tasks.deleteTask(this.id)},f.prototype.frames.get.implementation=async function(t){if(!Number.isInteger(t)||t<0)throw new i(`Frame must be a positive integer. Got: "${t}"`);if(t>=this.size)throw new i(`The frame with number ${t} is out of the task`);return await o(this.id,this.mode,t)},f.prototype.annotations.get.implementation=async function(t,e){if(!Number.isInteger(t)||t<0)throw new i(`Frame must be a positive integer. Got: "${t}"`);if(t>=this.size)throw new i(`Frame ${t} does not exist in the task`);return await p(this,t,e)},f.prototype.annotations.save.implementation=async function(t){return await d(this,t)},f.prototype.annotations.merge.implementation=async function(t){return await g(this,t)},f.prototype.annotations.split.implementation=async function(t,e){return await m(this,t,e)},f.prototype.annotations.group.implementation=async function(t,e){return await y(this,t,e)},f.prototype.annotations.hasUnsavedChanges.implementation=function(){return b(this)},f.prototype.annotations.clear.implementation=async function(t){return await v(this,t)},f.prototype.annotations.select.implementation=function(t,e,n){return w(this,t,e,n)},f.prototype.annotations.statistics.implementation=function(){return O(this)},f.prototype.annotations.put.implementation=function(t){return h(this,t)},f.prototype.annotations.upload.implementation=async function(t,e){return await x(this,t,e)},f.prototype.annotations.dump.implementation=async function(t,e){return await j(this,t,e)}})()},function(t,e,n){n(4),n(8),n(52),(()=>{const{AttributeType:e}=n(20),{ArgumentError:r}=n(5);class o{constructor(t){const n={id:void 0,default_value:void 0,input_type:void 0,mutable:void 0,name:void 0,values:void 0};for(const e in n)Object.prototype.hasOwnProperty.call(n,e)&&Object.prototype.hasOwnProperty.call(t,e)&&(Array.isArray(t[e])?n[e]=[...t[e]]:n[e]=t[e]);if(!Object.values(e).includes(n.input_type))throw new r(`Got invalid attribute type ${n.input_type}`);Object.defineProperties(this,Object.freeze({id:{get:()=>n.id},defaultValue:{get:()=>n.default_value},inputType:{get:()=>n.input_type},mutable:{get:()=>n.mutable},name:{get:()=>n.name},values:{get:()=>[...n.values]}}))}toJSON(){const t={name:this.name,mutable:this.mutable,input_type:this.inputType,default_value:this.defaultValue,values:this.values};return void 0!==this.id&&(t.id=this.id),t}}t.exports={Attribute:o,Label:class{constructor(t){const e={id:void 0,name:void 0};for(const n in e)Object.prototype.hasOwnProperty.call(e,n)&&Object.prototype.hasOwnProperty.call(t,n)&&(e[n]=t[n]);if(e.attributes=[],Object.prototype.hasOwnProperty.call(t,"attributes")&&Array.isArray(t.attributes))for(const n of t.attributes)e.attributes.push(new o(n));Object.defineProperties(this,Object.freeze({id:{get:()=>e.id},name:{get:()=>e.name},attributes:{get:()=>[...e.attributes]}}))}toJSON(){const t={name:this.name,attributes:[...this.attributes.map(t=>t.toJSON())]};return void 0!==this.id&&(t.id=this.id),t}}}})()},function(t,e,n){(()=>{const{ArgumentError:e}=n(5);t.exports={isBoolean:function(t){return"boolean"==typeof t},isInteger:function(t){return"number"==typeof t&&Number.isInteger(t)},isEnum:function(t){for(const e in this)if(Object.prototype.hasOwnProperty.call(this,e)&&this[e]===t)return!0;return!1},isString:function(t){return"string"==typeof t},checkFilter:function(t,n){for(const r in t)if(Object.prototype.hasOwnProperty.call(t,r)){if(!(r in n))throw new e(`Unsupported filter property has been recieved: "${r}"`);if(!n[r](t[r]))throw new e(`Received filter property "${r}" is not satisfied for checker`)}},checkObjectType:function(t,n,r,o){if(r){if(typeof n!==r){if("integer"===r&&Number.isInteger(n))return;throw new e(`"${t}" is expected to be "${r}", but "${typeof n}" has been got.`)}}else if(o&&!(n instanceof o)){if(void 0!==n)throw new e(`"${t}" is expected to be ${o.name}, but `+`"${n.constructor.name}" has been got`);throw new e(`"${t}" is expected to be ${o.name}, but "undefined" has been got.`)}}}})()},function(t,e,n){var r=n(10),o=n(53),i=n(29),s=n(30),a=n(41),c=n(7),u=n(55),l=Object.getOwnPropertyDescriptor;e.f=r?l:function(t,e){if(t=s(t),e=a(e,!0),u)try{return l(t,e)}catch(t){}if(c(t,e))return i(!o.f.call(t,e),t[e])}},function(t,e,n){var r=n(11);t.exports=function(t,e){if(!r(t))return t;var n,o;if(e&&"function"==typeof(n=t.toString)&&!r(o=n.call(t)))return o;if("function"==typeof(n=t.valueOf)&&!r(o=n.call(t)))return o;if(!e&&"function"==typeof(n=t.toString)&&!r(o=n.call(t)))return o;throw TypeError("Can't convert object to primitive value")}},function(t,e,n){var r=n(0),o=n(11),i=r.document,s=o(i)&&o(i.createElement);t.exports=function(t){return s?i.createElement(t):{}}},function(t,e,n){var r=n(0),o=n(12);t.exports=function(t,e){try{o(r,t,e)}catch(n){r[t]=e}return e}},function(t,e,n){var r=n(31),o=n(57),i=r("keys");t.exports=function(t){return i[t]||(i[t]=o(t))}},function(t,e){t.exports={}},function(t,e){t.exports=["constructor","hasOwnProperty","isPrototypeOf","propertyIsEnumerable","toLocaleString","toString","valueOf"]},function(t,e){t.exports=function(t,e,n){if(!(t instanceof e))throw TypeError("Incorrect "+(n?n+" ":"")+"invocation");return t}},function(t,e){t.exports={backendAPI:"http://localhost:7000/api/v1",proxy:!1,taskID:void 0,jobID:void 0,clientID:+Date.now().toString().substr(-6)}},function(t,e,n){var r=n(34),o=n(21),i=function(t){return function(e,n){var i,s,a=String(o(e)),c=r(n),u=a.length;return c<0||c>=u?t?"":void 0:(i=a.charCodeAt(c))<55296||i>56319||c+1===u||(s=a.charCodeAt(c+1))<56320||s>57343?t?a.charAt(c):i:t?a.slice(c,c+2):s-56320+(i-55296<<10)+65536}};t.exports={codeAt:i(!1),charAt:i(!0)}},function(t,e,n){"use strict";(function(e){var r=n(6),o=n(137),i={"Content-Type":"application/x-www-form-urlencoded"};function s(t,e){!r.isUndefined(t)&&r.isUndefined(t["Content-Type"])&&(t["Content-Type"]=e)}var a,c={adapter:("undefined"!=typeof XMLHttpRequest?a=n(80):void 0!==e&&(a=n(80)),a),transformRequest:[function(t,e){return o(e,"Content-Type"),r.isFormData(t)||r.isArrayBuffer(t)||r.isBuffer(t)||r.isStream(t)||r.isFile(t)||r.isBlob(t)?t:r.isArrayBufferView(t)?t.buffer:r.isURLSearchParams(t)?(s(e,"application/x-www-form-urlencoded;charset=utf-8"),t.toString()):r.isObject(t)?(s(e,"application/json;charset=utf-8"),JSON.stringify(t)):t}],transformResponse:[function(t){if("string"==typeof t)try{t=JSON.parse(t)}catch(t){}return t}],timeout:0,xsrfCookieName:"XSRF-TOKEN",xsrfHeaderName:"X-XSRF-TOKEN",maxContentLength:-1,validateStatus:function(t){return t>=200&&t<300}};c.headers={common:{Accept:"application/json, text/plain, */*"}},r.forEach(["delete","get","head"],function(t){c.headers[t]={}}),r.forEach(["post","put","patch"],function(t){c.headers[t]=r.merge(i)}),t.exports=c}).call(this,n(79))},function(t,e,n){n(4),n(9),n(8),(()=>{const e=n(26),{ArgumentError:r}=n(5);class o{constructor(t){const e={label:null,attributes:{},points:null,outside:null,occluded:null,keyframe:null,group:null,zOrder:null,lock:null,color:null,visibility:null,clientID:t.clientID,serverID:t.serverID,frame:t.frame,objectType:t.objectType,shapeType:t.shapeType,updateFlags:{}};Object.defineProperty(e.updateFlags,"reset",{value:function(){this.label=!1,this.attributes=!1,this.points=!1,this.outside=!1,this.occluded=!1,this.keyframe=!1,this.group=!1,this.zOrder=!1,this.lock=!1,this.color=!1,this.visibility=!1},writable:!1}),Object.defineProperties(this,Object.freeze({updateFlags:{get:()=>e.updateFlags},frame:{get:()=>e.frame},objectType:{get:()=>e.objectType},shapeType:{get:()=>e.shapeType},clientID:{get:()=>e.clientID},serverID:{get:()=>e.serverID},label:{get:()=>e.label,set:t=>{e.updateFlags.label=!0,e.label=t}},color:{get:()=>e.color,set:t=>{e.updateFlags.color=!0,e.color=t}},visibility:{get:()=>e.visibility,set:t=>{e.updateFlags.visibility=!0,e.visibility=t}},points:{get:()=>e.points,set:t=>{if(!Array.isArray(t))throw new r("Points are expected to be an array "+`but got ${"object"==typeof t?t.constructor.name:typeof t}`);e.updateFlags.points=!0,e.points=[...t]}},group:{get:()=>e.group,set:t=>{e.updateFlags.group=!0,e.group=t}},zOrder:{get:()=>e.zOrder,set:t=>{e.updateFlags.zOrder=!0,e.zOrder=t}},outside:{get:()=>e.outside,set:t=>{e.updateFlags.outside=!0,e.outside=t}},keyframe:{get:()=>e.keyframe,set:t=>{e.updateFlags.keyframe=!0,e.keyframe=t}},occluded:{get:()=>e.occluded,set:t=>{e.updateFlags.occluded=!0,e.occluded=t}},lock:{get:()=>e.lock,set:t=>{e.updateFlags.lock=!0,e.lock=t}},attributes:{get:()=>e.attributes,set:t=>{if("object"!=typeof t)throw new r("Attributes are expected to be an object "+`but got ${"object"==typeof t?t.constructor.name:typeof t}`);for(const n of Object.keys(t))e.updateFlags.attributes=!0,e.attributes[n]=t[n]}}})),this.label=t.label,this.group=t.group,this.zOrder=t.zOrder,this.outside=t.outside,this.keyframe=t.keyframe,this.occluded=t.occluded,this.color=t.color,this.lock=t.lock,this.visibility=t.visibility,void 0!==t.points&&(this.points=t.points),void 0!==t.attributes&&(this.attributes=t.attributes),e.updateFlags.reset()}async save(){return await e.apiWrapper.call(this,o.prototype.save)}async delete(t=!1){return await e.apiWrapper.call(this,o.prototype.delete,t)}async up(){return await e.apiWrapper.call(this,o.prototype.up)}async down(){return await e.apiWrapper.call(this,o.prototype.down)}}o.prototype.save.implementation=async function(){return this.hidden&&this.hidden.save?this.hidden.save():this},o.prototype.delete.implementation=async function(t){return!(!this.hidden||!this.hidden.delete)&&this.hidden.delete(t)},o.prototype.up.implementation=async function(){return!(!this.hidden||!this.hidden.up)&&this.hidden.up()},o.prototype.down.implementation=async function(){return!(!this.hidden||!this.hidden.down)&&this.hidden.down()},t.exports=o})()},function(t,e,n){"use strict";n(13)({target:"URL",proto:!0,enumerable:!0},{toJSON:function(){return URL.prototype.toString.call(this)}})},function(t,e,n){"use strict";var r={}.propertyIsEnumerable,o=Object.getOwnPropertyDescriptor,i=o&&!r.call({1:2},1);e.f=i?function(t){var e=o(this,t);return!!e&&e.enumerable}:r},function(t,e,n){var r=n(2),o=n(15),i="".split;t.exports=r(function(){return!Object("z").propertyIsEnumerable(0)})?function(t){return"String"==o(t)?i.call(t,""):Object(t)}:Object},function(t,e,n){var r=n(10),o=n(2),i=n(42);t.exports=!r&&!o(function(){return 7!=Object.defineProperty(i("div"),"a",{get:function(){return 7}}).a})},function(t,e,n){var r=n(31);t.exports=r("native-function-to-string",Function.toString)},function(t,e){var n=0,r=Math.random();t.exports=function(t){return"Symbol("+String(void 0===t?"":t)+")_"+(++n+r).toString(36)}},function(t,e,n){var r=n(7),o=n(92),i=n(40),s=n(14);t.exports=function(t,e){for(var n=o(e),a=s.f,c=i.f,u=0;uc;)r(a,n=e[c++])&&(~i(u,n)||u.push(n));return u}},function(t,e){e.f=Object.getOwnPropertySymbols},function(t,e,n){var r=n(2),o=/#|\.prototype\./,i=function(t,e){var n=a[s(t)];return n==u||n!=c&&("function"==typeof e?r(e):!!e)},s=i.normalize=function(t){return String(t).replace(o,".").toLowerCase()},a=i.data={},c=i.NATIVE="N",u=i.POLYFILL="P";t.exports=i},function(t,e,n){var r=n(16);t.exports=function(t,e,n){for(var o in e)r(t,o,e[o],n);return t}},function(t,e,n){var r=n(1),o=n(25),i=r("iterator"),s=Array.prototype;t.exports=function(t){return void 0!==t&&(o.Array===t||s[i]===t)}},function(t,e,n){var r=n(3);t.exports=function(t,e,n,o){try{return o?e(r(n)[0],n[1]):e(n)}catch(e){var i=t.return;throw void 0!==i&&r(i.call(t)),e}}},function(t,e,n){var r,o,i,s=n(0),a=n(2),c=n(15),u=n(35),l=n(67),f=n(42),p=s.location,h=s.setImmediate,d=s.clearImmediate,b=s.process,g=s.MessageChannel,m=s.Dispatch,y=0,v={},w=function(t){if(v.hasOwnProperty(t)){var e=v[t];delete v[t],e()}},O=function(t){return function(){w(t)}},x=function(t){w(t.data)},j=function(t){s.postMessage(t+"",p.protocol+"//"+p.host)};h&&d||(h=function(t){for(var e=[],n=1;arguments.length>n;)e.push(arguments[n++]);return v[++y]=function(){("function"==typeof t?t:Function(t)).apply(void 0,e)},r(y),y},d=function(t){delete v[t]},"process"==c(b)?r=function(t){b.nextTick(O(t))}:m&&m.now?r=function(t){m.now(O(t))}:g?(i=(o=new g).port2,o.port1.onmessage=x,r=u(i.postMessage,i,1)):!s.addEventListener||"function"!=typeof postMessage||s.importScripts||a(j)?r="onreadystatechange"in f("script")?function(t){l.appendChild(f("script")).onreadystatechange=function(){l.removeChild(this),w(t)}}:function(t){setTimeout(O(t),0)}:(r=j,s.addEventListener("message",x,!1))),t.exports={set:h,clear:d}},function(t,e,n){var r=n(32);t.exports=r("document","documentElement")},function(t,e,n){var r=n(32);t.exports=r("navigator","userAgent")||""},function(t,e,n){"use strict";var r=n(24),o=function(t){var e,n;this.promise=new t(function(t,r){if(void 0!==e||void 0!==n)throw TypeError("Bad Promise constructor");e=t,n=r}),this.resolve=r(e),this.reject=r(n)};t.exports.f=function(t){return new o(t)}},function(t,e,n){var r=n(3),o=n(71),i=n(46),s=n(45),a=n(67),c=n(42),u=n(44)("IE_PROTO"),l=function(){},f=function(){var t,e=c("iframe"),n=i.length;for(e.style.display="none",a.appendChild(e),e.src=String("javascript:"),(t=e.contentWindow.document).open(),t.write(" + {% for js_file in js_3rdparty %} {% endfor %} @@ -74,6 +75,7 @@ + diff --git a/cvat/apps/engine/urls.py b/cvat/apps/engine/urls.py index 3abde35ff06c..534d72b7b5e4 100644 --- a/cvat/apps/engine/urls.py +++ b/cvat/apps/engine/urls.py @@ -24,7 +24,6 @@ ) router = routers.DefaultRouter(trailing_slash=False) -router.register('projects', views.ProjectViewSet) router.register('tasks', views.TaskViewSet) router.register('jobs', views.JobViewSet) router.register('users', views.UserViewSet) diff --git a/cvat/apps/engine/views.py b/cvat/apps/engine/views.py index b7c8d621e4c1..196b0eb408e7 100644 --- a/cvat/apps/engine/views.py +++ b/cvat/apps/engine/views.py @@ -7,8 +7,9 @@ import traceback from ast import literal_eval import shutil +import tarfile from datetime import datetime -from tempfile import mkstemp +from tempfile import mkstemp, NamedTemporaryFile from django.http import HttpResponseBadRequest from django.shortcuts import redirect, render @@ -36,8 +37,7 @@ from cvat.apps.engine.serializers import (TaskSerializer, UserSerializer, ExceptionSerializer, AboutSerializer, JobSerializer, ImageMetaSerializer, RqStatusSerializer, TaskDataSerializer, LabeledDataSerializer, - PluginSerializer, FileInfoSerializer, LogEventSerializer, - ProjectSerializer, BasicUserSerializer) + PluginSerializer, FileInfoSerializer, LogEventSerializer) from cvat.apps.annotation.serializers import AnnotationFileSerializer from django.contrib.auth.models import User from django.core.exceptions import ObjectDoesNotExist @@ -45,6 +45,7 @@ from rest_framework.permissions import SAFE_METHODS from cvat.apps.annotation.models import AnnotationDumper, AnnotationLoader from cvat.apps.annotation.format import get_annotation_formats +from cvat.apps.engine.frame_provider import FrameProvider # Server REST API @login_required @@ -159,65 +160,7 @@ def formats(request): data = get_annotation_formats() return Response(data) -class ProjectFilter(filters.FilterSet): - name = filters.CharFilter(field_name="name", lookup_expr="icontains") - owner = filters.CharFilter(field_name="owner__username", lookup_expr="icontains") - status = filters.CharFilter(field_name="status", lookup_expr="icontains") - assignee = filters.CharFilter(field_name="assignee__username", lookup_expr="icontains") - - class Meta: - model = models.Project - fields = ("id", "name", "owner", "status", "assignee") - -class ProjectViewSet(auth.ProjectGetQuerySetMixin, viewsets.ModelViewSet): - queryset = models.Project.objects.all().order_by('-id') - serializer_class = ProjectSerializer - search_fields = ("name", "owner__username", "assignee__username", "status") - filterset_class = ProjectFilter - ordering_fields = ("id", "name", "owner", "status", "assignee") - http_method_names = ['get', 'post', 'head', 'patch', 'delete'] - - def get_permissions(self): - http_method = self.request.method - permissions = [IsAuthenticated] - - if http_method in SAFE_METHODS: - permissions.append(auth.ProjectAccessPermission) - elif http_method in ["POST"]: - permissions.append(auth.ProjectCreatePermission) - elif http_method in ["PATCH"]: - permissions.append(auth.ProjectChangePermission) - elif http_method in ["DELETE"]: - permissions.append(auth.ProjectDeletePermission) - else: - permissions.append(auth.AdminRolePermission) - - return [perm() for perm in permissions] - - def perform_create(self, serializer): - if self.request.data.get('owner', None): - serializer.save() - else: - serializer.save(owner=self.request.user) - - @action(detail=True, methods=['GET'], serializer_class=TaskSerializer) - def tasks(self, request, pk): - self.get_object() # force to call check_object_permissions - queryset = Task.objects.filter(project_id=pk).order_by('-id') - queryset = auth.filter_task_queryset(queryset, request.user) - - page = self.paginate_queryset(queryset) - if page is not None: - serializer = self.get_serializer(page, many=True, - context={"request": request}) - return self.get_paginated_response(serializer.data) - - serializer = self.get_serializer(queryset, many=True, - context={"request": request}) - return Response(serializer.data) - class TaskFilter(filters.FilterSet): - project = filters.CharFilter(field_name="project__name", lookup_expr="icontains") name = filters.CharFilter(field_name="name", lookup_expr="icontains") owner = filters.CharFilter(field_name="owner__username", lookup_expr="icontains") mode = filters.CharFilter(field_name="mode", lookup_expr="icontains") @@ -226,8 +169,7 @@ class TaskFilter(filters.FilterSet): class Meta: model = Task - fields = ("id", "project_id", "project", "name", "owner", "mode", "status", - "assignee") + fields = ("id", "name", "owner", "mode", "status", "assignee") class TaskViewSet(auth.TaskGetQuerySetMixin, viewsets.ModelViewSet): queryset = Task.objects.all().prefetch_related( @@ -247,7 +189,7 @@ def get_permissions(self): permissions.append(auth.TaskAccessPermission) elif http_method in ["POST"]: permissions.append(auth.TaskCreatePermission) - elif self.action == 'annotations' or http_method in ["PATCH", "PUT"]: + elif http_method in ["PATCH", "PUT"]: permissions.append(auth.TaskChangePermission) elif http_method in ["DELETE"]: permissions.append(auth.TaskDeletePermission) @@ -267,9 +209,9 @@ def perform_destroy(self, instance): super().perform_destroy(instance) shutil.rmtree(task_dirname, ignore_errors=True) + @staticmethod @action(detail=True, methods=['GET'], serializer_class=JobSerializer) - def jobs(self, request, pk): - self.get_object() # force to call check_object_permissions + def jobs(request, pk): queryset = Job.objects.filter(segment__task_id=pk) serializer = JobSerializer(queryset, many=True, context={"request": request}) @@ -278,7 +220,7 @@ def jobs(self, request, pk): @action(detail=True, methods=['POST'], serializer_class=TaskDataSerializer) def data(self, request, pk): - db_task = self.get_object() # call check_object_permissions as well + db_task = self.get_object() serializer = TaskDataSerializer(db_task, data=request.data) if serializer.is_valid(raise_exception=True): serializer.save() @@ -288,7 +230,6 @@ def data(self, request, pk): @action(detail=True, methods=['GET', 'DELETE', 'PUT', 'PATCH'], serializer_class=LabeledDataSerializer) def annotations(self, request, pk): - self.get_object() # force to call check_object_permissions if request.method == 'GET': data = annotation.get_task_data(pk, request.user) serializer = LabeledDataSerializer(data=data) @@ -328,7 +269,7 @@ def annotations(self, request, pk): def dump(self, request, pk, filename): filename = re.sub(r'[\\/*?:"<>|]', '_', filename) username = request.user.username - db_task = self.get_object() # call check_object_permissions as well + db_task = self.get_object() timestamp = datetime.now().strftime("%Y_%m_%d_%H_%M_%S") action = request.query_params.get("action") if action not in [None, "download"]: @@ -386,7 +327,6 @@ def dump(self, request, pk, filename): @action(detail=True, methods=['GET'], serializer_class=RqStatusSerializer) def status(self, request, pk): - self.get_object() # force to call check_object_permissions response = self._get_rq_response(queue="default", job_id="/api/{}/tasks/{}".format(request.version, pk)) serializer = RqStatusSerializer(data=response) @@ -412,35 +352,63 @@ def _get_rq_response(queue, job_id): return response + @staticmethod @action(detail=True, methods=['GET'], serializer_class=ImageMetaSerializer, url_path='frames/meta') - def data_info(self, request, pk): - try: - db_task = self.get_object() # call check_object_permissions as well - meta_cache_file = open(db_task.get_image_meta_cache_path()) - except OSError: - task.make_image_meta_cache(db_task) - meta_cache_file = open(db_task.get_image_meta_cache_path()) + def data_info(request, pk): + data = { + 'original_size': [], + } + + db_task = models.Task.objects.prefetch_related('image_set').select_related('video').get(pk=pk) + + if db_task.mode == 'interpolation': + media = [db_task.video] + else: + media = list(db_task.image_set.order_by('frame')) + + for item in media: + data['original_size'].append({ + 'width': item.width, + 'height': item.height, + }) - data = literal_eval(meta_cache_file.read()) serializer = ImageMetaSerializer(many=True, data=data['original_size']) if serializer.is_valid(raise_exception=True): return Response(serializer.data) @action(detail=True, methods=['GET'], serializer_class=None, - url_path='frames/(?P
').css({ - 'background-image': `url("/api/v1/tasks/${this._task.id}/frames/0")`, + 'background-image': `url("/api/v1/tasks/${this._task.id}/frames/preview")`, }), ); From be75b7e6c0e4812eef002f382885466c9d096acf Mon Sep 17 00:00:00 2001 From: yurygoru Date: Tue, 22 Oct 2019 10:50:57 +0000 Subject: [PATCH 016/188] fix deleting old frames, update files to min version --- cvat-core/src/frames.js | 7 +- cvat-data/src/js/cvat-data.js | 28 +- cvat-data/src/js/decode_video.js | 4 +- .../engine/static/engine/js/cvat-core.min.js | 19823 +--------------- .../engine/static/engine/js/decode_video.js | 968 +- .../engine/static/engine/js/unzip_imgs.js | 1327 +- 6 files changed, 43 insertions(+), 22114 deletions(-) diff --git a/cvat-core/src/frames.js b/cvat-core/src/frames.js index 78b8338148ca..476ebc3de101 100644 --- a/cvat-core/src/frames.js +++ b/cvat-core/src/frames.js @@ -140,12 +140,9 @@ reject(new Exception(exception.message)); } } - - return new Promise(getFrameData.bind(this)); } - - } + return new Promise(getFrameData.bind(this)); }; @@ -177,7 +174,7 @@ const value = { meta: await serverProxy.frames.getMeta(taskID), chunkSize, - provider: new cvatData.FrameProvider(3, blockType, chunkSize), + provider: new cvatData.FrameProvider(9, blockType, chunkSize), }; frameCache[taskID] = {}; diff --git a/cvat-data/src/js/cvat-data.js b/cvat-data/src/js/cvat-data.js index 7f3624ccbc51..9ea7623804b2 100755 --- a/cvat-data/src/js/cvat-data.js +++ b/cvat-data/src/js/cvat-data.js @@ -34,25 +34,39 @@ class FrameProvider { delete this._blocks[start / this._blockSize]; } - // remove frames from pre-previose blocks - if (this._blocks_ranges.length > 1) + + // delete frames whose are not in areas of current frame + for (let i = 0; i < this._blocks_ranges.length; i++) { - const secondFromEnd = this._blocks_ranges[this._blocks_ranges.length - 2]; - const [start, end] = secondFromEnd.split(':').map((el) => +el); - for (let i = start; i <= end; i++) { - delete this._frames[i]; + const [start, end] = this._blocks_ranges[i].split(':').map((el) => +el); + + let tmp_v = this._currFrame - 2 * this._blockSize; + if (this._currFrame - 2 * this._blockSize < end && + this._currFrame - 2 * this._blockSize > start){ + for (let j = start; j <= end; j++) { + delete this._frames[j]; + } + } + + tmp_v = this._currFrame + 2 * this._blockSize; + if (this._currFrame + 2 * this._blockSize > start && + this._currFrame + 2 * this._blockSize < end){ + for (let j = start; j <= end; j++) { + delete this._frames[j]; + } } } } setRenderSize(width, height){ - this._width = width; + this._width = width this._height = height; } /* Method returns frame from collection. Else method returns 0 */ frame(frameNumber) { if (frameNumber in this._frames) { + this._currFrame = frameNumber; return this._frames[frameNumber]; } return null; diff --git a/cvat-data/src/js/decode_video.js b/cvat-data/src/js/decode_video.js index f2390cef52a8..9bcbfec2bbd4 100644 --- a/cvat-data/src/js/decode_video.js +++ b/cvat-data/src/js/decode_video.js @@ -84,11 +84,9 @@ self.onmessage = function (e) { for (let i = start; i <= end; i++){ var t0 = performance.now(); - - const result = videoDecoder.decode(); var t_decode = performance.now(); - console.log("decode " + i + " frame took " + (t_decode - t0) + " milliseconds."); + // console.log("decode " + i + " frame took " + (t_decode - t0) + " milliseconds."); if (!Array.isArray(result)) { const message = 'Result must be an array.' + `Got ${result}. Possible reasons: ` diff --git a/cvat/apps/engine/static/engine/js/cvat-core.min.js b/cvat/apps/engine/static/engine/js/cvat-core.min.js index d2483acfcf08..34489b1fd084 100644 --- a/cvat/apps/engine/static/engine/js/cvat-core.min.js +++ b/cvat/apps/engine/static/engine/js/cvat-core.min.js @@ -1,19822 +1,15 @@ -window["cvat"] = -/******/ (function(modules) { // webpackBootstrap -/******/ // The module cache -/******/ var installedModules = {}; -/******/ -/******/ // The require function -/******/ function __webpack_require__(moduleId) { -/******/ -/******/ // Check if module is in cache -/******/ if(installedModules[moduleId]) { -/******/ return installedModules[moduleId].exports; -/******/ } -/******/ // Create a new module (and put it into the cache) -/******/ var module = installedModules[moduleId] = { -/******/ i: moduleId, -/******/ l: false, -/******/ exports: {} -/******/ }; -/******/ -/******/ // Execute the module function -/******/ modules[moduleId].call(module.exports, module, module.exports, __webpack_require__); -/******/ -/******/ // Flag the module as loaded -/******/ module.l = true; -/******/ -/******/ // Return the exports of the module -/******/ return module.exports; -/******/ } -/******/ -/******/ -/******/ // expose the modules object (__webpack_modules__) -/******/ __webpack_require__.m = modules; -/******/ -/******/ // expose the module cache -/******/ __webpack_require__.c = installedModules; -/******/ -/******/ // define getter function for harmony exports -/******/ __webpack_require__.d = function(exports, name, getter) { -/******/ if(!__webpack_require__.o(exports, name)) { -/******/ Object.defineProperty(exports, name, { enumerable: true, get: getter }); -/******/ } -/******/ }; -/******/ -/******/ // define __esModule on exports -/******/ __webpack_require__.r = function(exports) { -/******/ if(typeof Symbol !== 'undefined' && Symbol.toStringTag) { -/******/ Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' }); -/******/ } -/******/ Object.defineProperty(exports, '__esModule', { value: true }); -/******/ }; -/******/ -/******/ // create a fake namespace object -/******/ // mode & 1: value is a module id, require it -/******/ // mode & 2: merge all properties of value into the ns -/******/ // mode & 4: return value when already ns object -/******/ // mode & 8|1: behave like require -/******/ __webpack_require__.t = function(value, mode) { -/******/ if(mode & 1) value = __webpack_require__(value); -/******/ if(mode & 8) return value; -/******/ if((mode & 4) && typeof value === 'object' && value && value.__esModule) return value; -/******/ var ns = Object.create(null); -/******/ __webpack_require__.r(ns); -/******/ Object.defineProperty(ns, 'default', { enumerable: true, value: value }); -/******/ if(mode & 2 && typeof value != 'string') for(var key in value) __webpack_require__.d(ns, key, function(key) { return value[key]; }.bind(null, key)); -/******/ return ns; -/******/ }; -/******/ -/******/ // getDefaultExport function for compatibility with non-harmony modules -/******/ __webpack_require__.n = function(module) { -/******/ var getter = module && module.__esModule ? -/******/ function getDefault() { return module['default']; } : -/******/ function getModuleExports() { return module; }; -/******/ __webpack_require__.d(getter, 'a', getter); -/******/ return getter; -/******/ }; -/******/ -/******/ // Object.prototype.hasOwnProperty.call -/******/ __webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); }; -/******/ -/******/ // __webpack_public_path__ -/******/ __webpack_require__.p = ""; -/******/ -/******/ -/******/ // Load entry module and return exports -/******/ return __webpack_require__(__webpack_require__.s = "./src/api.js"); -/******/ }) -/************************************************************************/ -/******/ ({ - -/***/ "../cvat-data/node_modules/core-js/internals/a-function.js": -/*!*****************************************************************!*\ - !*** ../cvat-data/node_modules/core-js/internals/a-function.js ***! - \*****************************************************************/ -/*! no static exports found */ -/***/ (function(module, exports) { - -module.exports = function (it) { - if (typeof it != 'function') { - throw TypeError(String(it) + ' is not a function'); - } return it; -}; - - -/***/ }), - -/***/ "../cvat-data/node_modules/core-js/internals/a-possible-prototype.js": -/*!***************************************************************************!*\ - !*** ../cvat-data/node_modules/core-js/internals/a-possible-prototype.js ***! - \***************************************************************************/ -/*! no static exports found */ -/***/ (function(module, exports, __webpack_require__) { - -var isObject = __webpack_require__(/*! ../internals/is-object */ "../cvat-data/node_modules/core-js/internals/is-object.js"); - -module.exports = function (it) { - if (!isObject(it) && it !== null) { - throw TypeError("Can't set " + String(it) + ' as a prototype'); - } return it; -}; - - -/***/ }), - -/***/ "../cvat-data/node_modules/core-js/internals/add-to-unscopables.js": -/*!*************************************************************************!*\ - !*** ../cvat-data/node_modules/core-js/internals/add-to-unscopables.js ***! - \*************************************************************************/ -/*! no static exports found */ -/***/ (function(module, exports, __webpack_require__) { - -var wellKnownSymbol = __webpack_require__(/*! ../internals/well-known-symbol */ "../cvat-data/node_modules/core-js/internals/well-known-symbol.js"); -var create = __webpack_require__(/*! ../internals/object-create */ "../cvat-data/node_modules/core-js/internals/object-create.js"); -var hide = __webpack_require__(/*! ../internals/hide */ "../cvat-data/node_modules/core-js/internals/hide.js"); - -var UNSCOPABLES = wellKnownSymbol('unscopables'); -var ArrayPrototype = Array.prototype; - -// Array.prototype[@@unscopables] -// https://tc39.github.io/ecma262/#sec-array.prototype-@@unscopables -if (ArrayPrototype[UNSCOPABLES] == undefined) { - hide(ArrayPrototype, UNSCOPABLES, create(null)); -} - -// add a key to Array.prototype[@@unscopables] -module.exports = function (key) { - ArrayPrototype[UNSCOPABLES][key] = true; -}; - - -/***/ }), - -/***/ "../cvat-data/node_modules/core-js/internals/an-object.js": -/*!****************************************************************!*\ - !*** ../cvat-data/node_modules/core-js/internals/an-object.js ***! - \****************************************************************/ -/*! no static exports found */ -/***/ (function(module, exports, __webpack_require__) { - -var isObject = __webpack_require__(/*! ../internals/is-object */ "../cvat-data/node_modules/core-js/internals/is-object.js"); - -module.exports = function (it) { - if (!isObject(it)) { - throw TypeError(String(it) + ' is not an object'); - } return it; -}; - - -/***/ }), - -/***/ "../cvat-data/node_modules/core-js/internals/array-includes.js": -/*!*********************************************************************!*\ - !*** ../cvat-data/node_modules/core-js/internals/array-includes.js ***! - \*********************************************************************/ -/*! no static exports found */ -/***/ (function(module, exports, __webpack_require__) { - -var toIndexedObject = __webpack_require__(/*! ../internals/to-indexed-object */ "../cvat-data/node_modules/core-js/internals/to-indexed-object.js"); -var toLength = __webpack_require__(/*! ../internals/to-length */ "../cvat-data/node_modules/core-js/internals/to-length.js"); -var toAbsoluteIndex = __webpack_require__(/*! ../internals/to-absolute-index */ "../cvat-data/node_modules/core-js/internals/to-absolute-index.js"); - -// `Array.prototype.{ indexOf, includes }` methods implementation -var createMethod = function (IS_INCLUDES) { - return function ($this, el, fromIndex) { - var O = toIndexedObject($this); - var length = toLength(O.length); - var index = toAbsoluteIndex(fromIndex, length); - var value; - // Array#includes uses SameValueZero equality algorithm - // eslint-disable-next-line no-self-compare - if (IS_INCLUDES && el != el) while (length > index) { - value = O[index++]; - // eslint-disable-next-line no-self-compare - if (value != value) return true; - // Array#indexOf ignores holes, Array#includes - not - } else for (;length > index; index++) { - if ((IS_INCLUDES || index in O) && O[index] === el) return IS_INCLUDES || index || 0; - } return !IS_INCLUDES && -1; - }; -}; - -module.exports = { - // `Array.prototype.includes` method - // https://tc39.github.io/ecma262/#sec-array.prototype.includes - includes: createMethod(true), - // `Array.prototype.indexOf` method - // https://tc39.github.io/ecma262/#sec-array.prototype.indexof - indexOf: createMethod(false) -}; - - -/***/ }), - -/***/ "../cvat-data/node_modules/core-js/internals/classof-raw.js": -/*!******************************************************************!*\ - !*** ../cvat-data/node_modules/core-js/internals/classof-raw.js ***! - \******************************************************************/ -/*! no static exports found */ -/***/ (function(module, exports) { - -var toString = {}.toString; - -module.exports = function (it) { - return toString.call(it).slice(8, -1); -}; - - -/***/ }), - -/***/ "../cvat-data/node_modules/core-js/internals/copy-constructor-properties.js": -/*!**********************************************************************************!*\ - !*** ../cvat-data/node_modules/core-js/internals/copy-constructor-properties.js ***! - \**********************************************************************************/ -/*! no static exports found */ -/***/ (function(module, exports, __webpack_require__) { - -var has = __webpack_require__(/*! ../internals/has */ "../cvat-data/node_modules/core-js/internals/has.js"); -var ownKeys = __webpack_require__(/*! ../internals/own-keys */ "../cvat-data/node_modules/core-js/internals/own-keys.js"); -var getOwnPropertyDescriptorModule = __webpack_require__(/*! ../internals/object-get-own-property-descriptor */ "../cvat-data/node_modules/core-js/internals/object-get-own-property-descriptor.js"); -var definePropertyModule = __webpack_require__(/*! ../internals/object-define-property */ "../cvat-data/node_modules/core-js/internals/object-define-property.js"); - -module.exports = function (target, source) { - var keys = ownKeys(source); - var defineProperty = definePropertyModule.f; - var getOwnPropertyDescriptor = getOwnPropertyDescriptorModule.f; - for (var i = 0; i < keys.length; i++) { - var key = keys[i]; - if (!has(target, key)) defineProperty(target, key, getOwnPropertyDescriptor(source, key)); - } -}; - - -/***/ }), - -/***/ "../cvat-data/node_modules/core-js/internals/correct-prototype-getter.js": -/*!*******************************************************************************!*\ - !*** ../cvat-data/node_modules/core-js/internals/correct-prototype-getter.js ***! - \*******************************************************************************/ -/*! no static exports found */ -/***/ (function(module, exports, __webpack_require__) { - -var fails = __webpack_require__(/*! ../internals/fails */ "../cvat-data/node_modules/core-js/internals/fails.js"); - -module.exports = !fails(function () { - function F() { /* empty */ } - F.prototype.constructor = null; - return Object.getPrototypeOf(new F()) !== F.prototype; -}); - - -/***/ }), - -/***/ "../cvat-data/node_modules/core-js/internals/create-iterator-constructor.js": -/*!**********************************************************************************!*\ - !*** ../cvat-data/node_modules/core-js/internals/create-iterator-constructor.js ***! - \**********************************************************************************/ -/*! no static exports found */ -/***/ (function(module, exports, __webpack_require__) { - -"use strict"; - -var IteratorPrototype = __webpack_require__(/*! ../internals/iterators-core */ "../cvat-data/node_modules/core-js/internals/iterators-core.js").IteratorPrototype; -var create = __webpack_require__(/*! ../internals/object-create */ "../cvat-data/node_modules/core-js/internals/object-create.js"); -var createPropertyDescriptor = __webpack_require__(/*! ../internals/create-property-descriptor */ "../cvat-data/node_modules/core-js/internals/create-property-descriptor.js"); -var setToStringTag = __webpack_require__(/*! ../internals/set-to-string-tag */ "../cvat-data/node_modules/core-js/internals/set-to-string-tag.js"); -var Iterators = __webpack_require__(/*! ../internals/iterators */ "../cvat-data/node_modules/core-js/internals/iterators.js"); - -var returnThis = function () { return this; }; - -module.exports = function (IteratorConstructor, NAME, next) { - var TO_STRING_TAG = NAME + ' Iterator'; - IteratorConstructor.prototype = create(IteratorPrototype, { next: createPropertyDescriptor(1, next) }); - setToStringTag(IteratorConstructor, TO_STRING_TAG, false, true); - Iterators[TO_STRING_TAG] = returnThis; - return IteratorConstructor; -}; - - -/***/ }), - -/***/ "../cvat-data/node_modules/core-js/internals/create-property-descriptor.js": -/*!*********************************************************************************!*\ - !*** ../cvat-data/node_modules/core-js/internals/create-property-descriptor.js ***! - \*********************************************************************************/ -/*! no static exports found */ -/***/ (function(module, exports) { - -module.exports = function (bitmap, value) { - return { - enumerable: !(bitmap & 1), - configurable: !(bitmap & 2), - writable: !(bitmap & 4), - value: value - }; -}; - - -/***/ }), - -/***/ "../cvat-data/node_modules/core-js/internals/define-iterator.js": -/*!**********************************************************************!*\ - !*** ../cvat-data/node_modules/core-js/internals/define-iterator.js ***! - \**********************************************************************/ -/*! no static exports found */ -/***/ (function(module, exports, __webpack_require__) { - -"use strict"; - -var $ = __webpack_require__(/*! ../internals/export */ "../cvat-data/node_modules/core-js/internals/export.js"); -var createIteratorConstructor = __webpack_require__(/*! ../internals/create-iterator-constructor */ "../cvat-data/node_modules/core-js/internals/create-iterator-constructor.js"); -var getPrototypeOf = __webpack_require__(/*! ../internals/object-get-prototype-of */ "../cvat-data/node_modules/core-js/internals/object-get-prototype-of.js"); -var setPrototypeOf = __webpack_require__(/*! ../internals/object-set-prototype-of */ "../cvat-data/node_modules/core-js/internals/object-set-prototype-of.js"); -var setToStringTag = __webpack_require__(/*! ../internals/set-to-string-tag */ "../cvat-data/node_modules/core-js/internals/set-to-string-tag.js"); -var hide = __webpack_require__(/*! ../internals/hide */ "../cvat-data/node_modules/core-js/internals/hide.js"); -var redefine = __webpack_require__(/*! ../internals/redefine */ "../cvat-data/node_modules/core-js/internals/redefine.js"); -var wellKnownSymbol = __webpack_require__(/*! ../internals/well-known-symbol */ "../cvat-data/node_modules/core-js/internals/well-known-symbol.js"); -var IS_PURE = __webpack_require__(/*! ../internals/is-pure */ "../cvat-data/node_modules/core-js/internals/is-pure.js"); -var Iterators = __webpack_require__(/*! ../internals/iterators */ "../cvat-data/node_modules/core-js/internals/iterators.js"); -var IteratorsCore = __webpack_require__(/*! ../internals/iterators-core */ "../cvat-data/node_modules/core-js/internals/iterators-core.js"); - -var IteratorPrototype = IteratorsCore.IteratorPrototype; -var BUGGY_SAFARI_ITERATORS = IteratorsCore.BUGGY_SAFARI_ITERATORS; -var ITERATOR = wellKnownSymbol('iterator'); -var KEYS = 'keys'; -var VALUES = 'values'; -var ENTRIES = 'entries'; - -var returnThis = function () { return this; }; - -module.exports = function (Iterable, NAME, IteratorConstructor, next, DEFAULT, IS_SET, FORCED) { - createIteratorConstructor(IteratorConstructor, NAME, next); - - var getIterationMethod = function (KIND) { - if (KIND === DEFAULT && defaultIterator) return defaultIterator; - if (!BUGGY_SAFARI_ITERATORS && KIND in IterablePrototype) return IterablePrototype[KIND]; - switch (KIND) { - case KEYS: return function keys() { return new IteratorConstructor(this, KIND); }; - case VALUES: return function values() { return new IteratorConstructor(this, KIND); }; - case ENTRIES: return function entries() { return new IteratorConstructor(this, KIND); }; - } return function () { return new IteratorConstructor(this); }; - }; - - var TO_STRING_TAG = NAME + ' Iterator'; - var INCORRECT_VALUES_NAME = false; - var IterablePrototype = Iterable.prototype; - var nativeIterator = IterablePrototype[ITERATOR] - || IterablePrototype['@@iterator'] - || DEFAULT && IterablePrototype[DEFAULT]; - var defaultIterator = !BUGGY_SAFARI_ITERATORS && nativeIterator || getIterationMethod(DEFAULT); - var anyNativeIterator = NAME == 'Array' ? IterablePrototype.entries || nativeIterator : nativeIterator; - var CurrentIteratorPrototype, methods, KEY; - - // fix native - if (anyNativeIterator) { - CurrentIteratorPrototype = getPrototypeOf(anyNativeIterator.call(new Iterable())); - if (IteratorPrototype !== Object.prototype && CurrentIteratorPrototype.next) { - if (!IS_PURE && getPrototypeOf(CurrentIteratorPrototype) !== IteratorPrototype) { - if (setPrototypeOf) { - setPrototypeOf(CurrentIteratorPrototype, IteratorPrototype); - } else if (typeof CurrentIteratorPrototype[ITERATOR] != 'function') { - hide(CurrentIteratorPrototype, ITERATOR, returnThis); - } - } - // Set @@toStringTag to native iterators - setToStringTag(CurrentIteratorPrototype, TO_STRING_TAG, true, true); - if (IS_PURE) Iterators[TO_STRING_TAG] = returnThis; - } - } - - // fix Array#{values, @@iterator}.name in V8 / FF - if (DEFAULT == VALUES && nativeIterator && nativeIterator.name !== VALUES) { - INCORRECT_VALUES_NAME = true; - defaultIterator = function values() { return nativeIterator.call(this); }; - } - - // define iterator - if ((!IS_PURE || FORCED) && IterablePrototype[ITERATOR] !== defaultIterator) { - hide(IterablePrototype, ITERATOR, defaultIterator); - } - Iterators[NAME] = defaultIterator; - - // export additional methods - if (DEFAULT) { - methods = { - values: getIterationMethod(VALUES), - keys: IS_SET ? defaultIterator : getIterationMethod(KEYS), - entries: getIterationMethod(ENTRIES) - }; - if (FORCED) for (KEY in methods) { - if (BUGGY_SAFARI_ITERATORS || INCORRECT_VALUES_NAME || !(KEY in IterablePrototype)) { - redefine(IterablePrototype, KEY, methods[KEY]); - } - } else $({ target: NAME, proto: true, forced: BUGGY_SAFARI_ITERATORS || INCORRECT_VALUES_NAME }, methods); - } - - return methods; -}; - - -/***/ }), - -/***/ "../cvat-data/node_modules/core-js/internals/descriptors.js": -/*!******************************************************************!*\ - !*** ../cvat-data/node_modules/core-js/internals/descriptors.js ***! - \******************************************************************/ -/*! no static exports found */ -/***/ (function(module, exports, __webpack_require__) { - -var fails = __webpack_require__(/*! ../internals/fails */ "../cvat-data/node_modules/core-js/internals/fails.js"); - -// Thank's IE8 for his funny defineProperty -module.exports = !fails(function () { - return Object.defineProperty({}, 'a', { get: function () { return 7; } }).a != 7; -}); - - -/***/ }), - -/***/ "../cvat-data/node_modules/core-js/internals/document-create-element.js": -/*!******************************************************************************!*\ - !*** ../cvat-data/node_modules/core-js/internals/document-create-element.js ***! - \******************************************************************************/ -/*! no static exports found */ -/***/ (function(module, exports, __webpack_require__) { - -var global = __webpack_require__(/*! ../internals/global */ "../cvat-data/node_modules/core-js/internals/global.js"); -var isObject = __webpack_require__(/*! ../internals/is-object */ "../cvat-data/node_modules/core-js/internals/is-object.js"); - -var document = global.document; -// typeof document.createElement is 'object' in old IE -var EXISTS = isObject(document) && isObject(document.createElement); - -module.exports = function (it) { - return EXISTS ? document.createElement(it) : {}; -}; - - -/***/ }), - -/***/ "../cvat-data/node_modules/core-js/internals/dom-iterables.js": -/*!********************************************************************!*\ - !*** ../cvat-data/node_modules/core-js/internals/dom-iterables.js ***! - \********************************************************************/ -/*! no static exports found */ -/***/ (function(module, exports) { - -// iterable DOM collections -// flag - `iterable` interface - 'entries', 'keys', 'values', 'forEach' methods -module.exports = { - CSSRuleList: 0, - CSSStyleDeclaration: 0, - CSSValueList: 0, - ClientRectList: 0, - DOMRectList: 0, - DOMStringList: 0, - DOMTokenList: 1, - DataTransferItemList: 0, - FileList: 0, - HTMLAllCollection: 0, - HTMLCollection: 0, - HTMLFormElement: 0, - HTMLSelectElement: 0, - MediaList: 0, - MimeTypeArray: 0, - NamedNodeMap: 0, - NodeList: 1, - PaintRequestList: 0, - Plugin: 0, - PluginArray: 0, - SVGLengthList: 0, - SVGNumberList: 0, - SVGPathSegList: 0, - SVGPointList: 0, - SVGStringList: 0, - SVGTransformList: 0, - SourceBufferList: 0, - StyleSheetList: 0, - TextTrackCueList: 0, - TextTrackList: 0, - TouchList: 0 -}; - - -/***/ }), - -/***/ "../cvat-data/node_modules/core-js/internals/enum-bug-keys.js": -/*!********************************************************************!*\ - !*** ../cvat-data/node_modules/core-js/internals/enum-bug-keys.js ***! - \********************************************************************/ -/*! no static exports found */ -/***/ (function(module, exports) { - -// IE8- don't enum bug keys -module.exports = [ - 'constructor', - 'hasOwnProperty', - 'isPrototypeOf', - 'propertyIsEnumerable', - 'toLocaleString', - 'toString', - 'valueOf' -]; - - -/***/ }), - -/***/ "../cvat-data/node_modules/core-js/internals/export.js": -/*!*************************************************************!*\ - !*** ../cvat-data/node_modules/core-js/internals/export.js ***! - \*************************************************************/ -/*! no static exports found */ -/***/ (function(module, exports, __webpack_require__) { - -var global = __webpack_require__(/*! ../internals/global */ "../cvat-data/node_modules/core-js/internals/global.js"); -var getOwnPropertyDescriptor = __webpack_require__(/*! ../internals/object-get-own-property-descriptor */ "../cvat-data/node_modules/core-js/internals/object-get-own-property-descriptor.js").f; -var hide = __webpack_require__(/*! ../internals/hide */ "../cvat-data/node_modules/core-js/internals/hide.js"); -var redefine = __webpack_require__(/*! ../internals/redefine */ "../cvat-data/node_modules/core-js/internals/redefine.js"); -var setGlobal = __webpack_require__(/*! ../internals/set-global */ "../cvat-data/node_modules/core-js/internals/set-global.js"); -var copyConstructorProperties = __webpack_require__(/*! ../internals/copy-constructor-properties */ "../cvat-data/node_modules/core-js/internals/copy-constructor-properties.js"); -var isForced = __webpack_require__(/*! ../internals/is-forced */ "../cvat-data/node_modules/core-js/internals/is-forced.js"); - -/* - options.target - name of the target object - options.global - target is the global object - options.stat - export as static methods of target - options.proto - export as prototype methods of target - options.real - real prototype method for the `pure` version - options.forced - export even if the native feature is available - options.bind - bind methods to the target, required for the `pure` version - options.wrap - wrap constructors to preventing global pollution, required for the `pure` version - options.unsafe - use the simple assignment of property instead of delete + defineProperty - options.sham - add a flag to not completely full polyfills - options.enumerable - export as enumerable property - options.noTargetGet - prevent calling a getter on target -*/ -module.exports = function (options, source) { - var TARGET = options.target; - var GLOBAL = options.global; - var STATIC = options.stat; - var FORCED, target, key, targetProperty, sourceProperty, descriptor; - if (GLOBAL) { - target = global; - } else if (STATIC) { - target = global[TARGET] || setGlobal(TARGET, {}); - } else { - target = (global[TARGET] || {}).prototype; - } - if (target) for (key in source) { - sourceProperty = source[key]; - if (options.noTargetGet) { - descriptor = getOwnPropertyDescriptor(target, key); - targetProperty = descriptor && descriptor.value; - } else targetProperty = target[key]; - FORCED = isForced(GLOBAL ? key : TARGET + (STATIC ? '.' : '#') + key, options.forced); - // contained in target - if (!FORCED && targetProperty !== undefined) { - if (typeof sourceProperty === typeof targetProperty) continue; - copyConstructorProperties(sourceProperty, targetProperty); - } - // add a flag to not completely full polyfills - if (options.sham || (targetProperty && targetProperty.sham)) { - hide(sourceProperty, 'sham', true); - } - // extend global - redefine(target, key, sourceProperty, options); - } -}; - - -/***/ }), - -/***/ "../cvat-data/node_modules/core-js/internals/fails.js": -/*!************************************************************!*\ - !*** ../cvat-data/node_modules/core-js/internals/fails.js ***! - \************************************************************/ -/*! no static exports found */ -/***/ (function(module, exports) { - -module.exports = function (exec) { - try { - return !!exec(); - } catch (error) { - return true; - } -}; - - -/***/ }), - -/***/ "../cvat-data/node_modules/core-js/internals/function-to-string.js": -/*!*************************************************************************!*\ - !*** ../cvat-data/node_modules/core-js/internals/function-to-string.js ***! - \*************************************************************************/ -/*! no static exports found */ -/***/ (function(module, exports, __webpack_require__) { - -var shared = __webpack_require__(/*! ../internals/shared */ "../cvat-data/node_modules/core-js/internals/shared.js"); - -module.exports = shared('native-function-to-string', Function.toString); - - -/***/ }), - -/***/ "../cvat-data/node_modules/core-js/internals/get-built-in.js": -/*!*******************************************************************!*\ - !*** ../cvat-data/node_modules/core-js/internals/get-built-in.js ***! - \*******************************************************************/ -/*! no static exports found */ -/***/ (function(module, exports, __webpack_require__) { - -var path = __webpack_require__(/*! ../internals/path */ "../cvat-data/node_modules/core-js/internals/path.js"); -var global = __webpack_require__(/*! ../internals/global */ "../cvat-data/node_modules/core-js/internals/global.js"); - -var aFunction = function (variable) { - return typeof variable == 'function' ? variable : undefined; -}; - -module.exports = function (namespace, method) { - return arguments.length < 2 ? aFunction(path[namespace]) || aFunction(global[namespace]) - : path[namespace] && path[namespace][method] || global[namespace] && global[namespace][method]; -}; - - -/***/ }), - -/***/ "../cvat-data/node_modules/core-js/internals/global.js": -/*!*************************************************************!*\ - !*** ../cvat-data/node_modules/core-js/internals/global.js ***! - \*************************************************************/ -/*! no static exports found */ -/***/ (function(module, exports, __webpack_require__) { - -/* WEBPACK VAR INJECTION */(function(global) {var O = 'object'; -var check = function (it) { - return it && it.Math == Math && it; -}; - -// https://github.com/zloirock/core-js/issues/86#issuecomment-115759028 -module.exports = - // eslint-disable-next-line no-undef - check(typeof globalThis == O && globalThis) || - check(typeof window == O && window) || - check(typeof self == O && self) || - check(typeof global == O && global) || - // eslint-disable-next-line no-new-func - Function('return this')(); - -/* WEBPACK VAR INJECTION */}.call(this, __webpack_require__(/*! ./../../../../cvat-core/node_modules/webpack/buildin/global.js */ "./node_modules/webpack/buildin/global.js"))) - -/***/ }), - -/***/ "../cvat-data/node_modules/core-js/internals/has.js": -/*!**********************************************************!*\ - !*** ../cvat-data/node_modules/core-js/internals/has.js ***! - \**********************************************************/ -/*! no static exports found */ -/***/ (function(module, exports) { - -var hasOwnProperty = {}.hasOwnProperty; - -module.exports = function (it, key) { - return hasOwnProperty.call(it, key); -}; - - -/***/ }), - -/***/ "../cvat-data/node_modules/core-js/internals/hidden-keys.js": -/*!******************************************************************!*\ - !*** ../cvat-data/node_modules/core-js/internals/hidden-keys.js ***! - \******************************************************************/ -/*! no static exports found */ -/***/ (function(module, exports) { - -module.exports = {}; - - -/***/ }), - -/***/ "../cvat-data/node_modules/core-js/internals/hide.js": -/*!***********************************************************!*\ - !*** ../cvat-data/node_modules/core-js/internals/hide.js ***! - \***********************************************************/ -/*! no static exports found */ -/***/ (function(module, exports, __webpack_require__) { - -var DESCRIPTORS = __webpack_require__(/*! ../internals/descriptors */ "../cvat-data/node_modules/core-js/internals/descriptors.js"); -var definePropertyModule = __webpack_require__(/*! ../internals/object-define-property */ "../cvat-data/node_modules/core-js/internals/object-define-property.js"); -var createPropertyDescriptor = __webpack_require__(/*! ../internals/create-property-descriptor */ "../cvat-data/node_modules/core-js/internals/create-property-descriptor.js"); - -module.exports = DESCRIPTORS ? function (object, key, value) { - return definePropertyModule.f(object, key, createPropertyDescriptor(1, value)); -} : function (object, key, value) { - object[key] = value; - return object; -}; - - -/***/ }), - -/***/ "../cvat-data/node_modules/core-js/internals/html.js": -/*!***********************************************************!*\ - !*** ../cvat-data/node_modules/core-js/internals/html.js ***! - \***********************************************************/ -/*! no static exports found */ -/***/ (function(module, exports, __webpack_require__) { - -var getBuiltIn = __webpack_require__(/*! ../internals/get-built-in */ "../cvat-data/node_modules/core-js/internals/get-built-in.js"); - -module.exports = getBuiltIn('document', 'documentElement'); - - -/***/ }), - -/***/ "../cvat-data/node_modules/core-js/internals/ie8-dom-define.js": -/*!*********************************************************************!*\ - !*** ../cvat-data/node_modules/core-js/internals/ie8-dom-define.js ***! - \*********************************************************************/ -/*! no static exports found */ -/***/ (function(module, exports, __webpack_require__) { - -var DESCRIPTORS = __webpack_require__(/*! ../internals/descriptors */ "../cvat-data/node_modules/core-js/internals/descriptors.js"); -var fails = __webpack_require__(/*! ../internals/fails */ "../cvat-data/node_modules/core-js/internals/fails.js"); -var createElement = __webpack_require__(/*! ../internals/document-create-element */ "../cvat-data/node_modules/core-js/internals/document-create-element.js"); - -// Thank's IE8 for his funny defineProperty -module.exports = !DESCRIPTORS && !fails(function () { - return Object.defineProperty(createElement('div'), 'a', { - get: function () { return 7; } - }).a != 7; -}); - - -/***/ }), - -/***/ "../cvat-data/node_modules/core-js/internals/indexed-object.js": -/*!*********************************************************************!*\ - !*** ../cvat-data/node_modules/core-js/internals/indexed-object.js ***! - \*********************************************************************/ -/*! no static exports found */ -/***/ (function(module, exports, __webpack_require__) { - -var fails = __webpack_require__(/*! ../internals/fails */ "../cvat-data/node_modules/core-js/internals/fails.js"); -var classof = __webpack_require__(/*! ../internals/classof-raw */ "../cvat-data/node_modules/core-js/internals/classof-raw.js"); - -var split = ''.split; - -// fallback for non-array-like ES3 and non-enumerable old V8 strings -module.exports = fails(function () { - // throws an error in rhino, see https://github.com/mozilla/rhino/issues/346 - // eslint-disable-next-line no-prototype-builtins - return !Object('z').propertyIsEnumerable(0); -}) ? function (it) { - return classof(it) == 'String' ? split.call(it, '') : Object(it); -} : Object; - - -/***/ }), - -/***/ "../cvat-data/node_modules/core-js/internals/internal-state.js": -/*!*********************************************************************!*\ - !*** ../cvat-data/node_modules/core-js/internals/internal-state.js ***! - \*********************************************************************/ -/*! no static exports found */ -/***/ (function(module, exports, __webpack_require__) { - -var NATIVE_WEAK_MAP = __webpack_require__(/*! ../internals/native-weak-map */ "../cvat-data/node_modules/core-js/internals/native-weak-map.js"); -var global = __webpack_require__(/*! ../internals/global */ "../cvat-data/node_modules/core-js/internals/global.js"); -var isObject = __webpack_require__(/*! ../internals/is-object */ "../cvat-data/node_modules/core-js/internals/is-object.js"); -var hide = __webpack_require__(/*! ../internals/hide */ "../cvat-data/node_modules/core-js/internals/hide.js"); -var objectHas = __webpack_require__(/*! ../internals/has */ "../cvat-data/node_modules/core-js/internals/has.js"); -var sharedKey = __webpack_require__(/*! ../internals/shared-key */ "../cvat-data/node_modules/core-js/internals/shared-key.js"); -var hiddenKeys = __webpack_require__(/*! ../internals/hidden-keys */ "../cvat-data/node_modules/core-js/internals/hidden-keys.js"); - -var WeakMap = global.WeakMap; -var set, get, has; - -var enforce = function (it) { - return has(it) ? get(it) : set(it, {}); -}; - -var getterFor = function (TYPE) { - return function (it) { - var state; - if (!isObject(it) || (state = get(it)).type !== TYPE) { - throw TypeError('Incompatible receiver, ' + TYPE + ' required'); - } return state; - }; -}; - -if (NATIVE_WEAK_MAP) { - var store = new WeakMap(); - var wmget = store.get; - var wmhas = store.has; - var wmset = store.set; - set = function (it, metadata) { - wmset.call(store, it, metadata); - return metadata; - }; - get = function (it) { - return wmget.call(store, it) || {}; - }; - has = function (it) { - return wmhas.call(store, it); - }; -} else { - var STATE = sharedKey('state'); - hiddenKeys[STATE] = true; - set = function (it, metadata) { - hide(it, STATE, metadata); - return metadata; - }; - get = function (it) { - return objectHas(it, STATE) ? it[STATE] : {}; - }; - has = function (it) { - return objectHas(it, STATE); - }; -} - -module.exports = { - set: set, - get: get, - has: has, - enforce: enforce, - getterFor: getterFor -}; - - -/***/ }), - -/***/ "../cvat-data/node_modules/core-js/internals/is-forced.js": -/*!****************************************************************!*\ - !*** ../cvat-data/node_modules/core-js/internals/is-forced.js ***! - \****************************************************************/ -/*! no static exports found */ -/***/ (function(module, exports, __webpack_require__) { - -var fails = __webpack_require__(/*! ../internals/fails */ "../cvat-data/node_modules/core-js/internals/fails.js"); - -var replacement = /#|\.prototype\./; - -var isForced = function (feature, detection) { - var value = data[normalize(feature)]; - return value == POLYFILL ? true - : value == NATIVE ? false - : typeof detection == 'function' ? fails(detection) - : !!detection; -}; - -var normalize = isForced.normalize = function (string) { - return String(string).replace(replacement, '.').toLowerCase(); -}; - -var data = isForced.data = {}; -var NATIVE = isForced.NATIVE = 'N'; -var POLYFILL = isForced.POLYFILL = 'P'; - -module.exports = isForced; - - -/***/ }), - -/***/ "../cvat-data/node_modules/core-js/internals/is-object.js": -/*!****************************************************************!*\ - !*** ../cvat-data/node_modules/core-js/internals/is-object.js ***! - \****************************************************************/ -/*! no static exports found */ -/***/ (function(module, exports) { - -module.exports = function (it) { - return typeof it === 'object' ? it !== null : typeof it === 'function'; -}; - - -/***/ }), - -/***/ "../cvat-data/node_modules/core-js/internals/is-pure.js": -/*!**************************************************************!*\ - !*** ../cvat-data/node_modules/core-js/internals/is-pure.js ***! - \**************************************************************/ -/*! no static exports found */ -/***/ (function(module, exports) { - -module.exports = false; - - -/***/ }), - -/***/ "../cvat-data/node_modules/core-js/internals/iterators-core.js": -/*!*********************************************************************!*\ - !*** ../cvat-data/node_modules/core-js/internals/iterators-core.js ***! - \*********************************************************************/ -/*! no static exports found */ -/***/ (function(module, exports, __webpack_require__) { - -"use strict"; - -var getPrototypeOf = __webpack_require__(/*! ../internals/object-get-prototype-of */ "../cvat-data/node_modules/core-js/internals/object-get-prototype-of.js"); -var hide = __webpack_require__(/*! ../internals/hide */ "../cvat-data/node_modules/core-js/internals/hide.js"); -var has = __webpack_require__(/*! ../internals/has */ "../cvat-data/node_modules/core-js/internals/has.js"); -var wellKnownSymbol = __webpack_require__(/*! ../internals/well-known-symbol */ "../cvat-data/node_modules/core-js/internals/well-known-symbol.js"); -var IS_PURE = __webpack_require__(/*! ../internals/is-pure */ "../cvat-data/node_modules/core-js/internals/is-pure.js"); - -var ITERATOR = wellKnownSymbol('iterator'); -var BUGGY_SAFARI_ITERATORS = false; - -var returnThis = function () { return this; }; - -// `%IteratorPrototype%` object -// https://tc39.github.io/ecma262/#sec-%iteratorprototype%-object -var IteratorPrototype, PrototypeOfArrayIteratorPrototype, arrayIterator; - -if ([].keys) { - arrayIterator = [].keys(); - // Safari 8 has buggy iterators w/o `next` - if (!('next' in arrayIterator)) BUGGY_SAFARI_ITERATORS = true; - else { - PrototypeOfArrayIteratorPrototype = getPrototypeOf(getPrototypeOf(arrayIterator)); - if (PrototypeOfArrayIteratorPrototype !== Object.prototype) IteratorPrototype = PrototypeOfArrayIteratorPrototype; - } -} - -if (IteratorPrototype == undefined) IteratorPrototype = {}; - -// 25.1.2.1.1 %IteratorPrototype%[@@iterator]() -if (!IS_PURE && !has(IteratorPrototype, ITERATOR)) hide(IteratorPrototype, ITERATOR, returnThis); - -module.exports = { - IteratorPrototype: IteratorPrototype, - BUGGY_SAFARI_ITERATORS: BUGGY_SAFARI_ITERATORS -}; - - -/***/ }), - -/***/ "../cvat-data/node_modules/core-js/internals/iterators.js": -/*!****************************************************************!*\ - !*** ../cvat-data/node_modules/core-js/internals/iterators.js ***! - \****************************************************************/ -/*! no static exports found */ -/***/ (function(module, exports) { - -module.exports = {}; - - -/***/ }), - -/***/ "../cvat-data/node_modules/core-js/internals/native-symbol.js": -/*!********************************************************************!*\ - !*** ../cvat-data/node_modules/core-js/internals/native-symbol.js ***! - \********************************************************************/ -/*! no static exports found */ -/***/ (function(module, exports, __webpack_require__) { - -var fails = __webpack_require__(/*! ../internals/fails */ "../cvat-data/node_modules/core-js/internals/fails.js"); - -module.exports = !!Object.getOwnPropertySymbols && !fails(function () { - // Chrome 38 Symbol has incorrect toString conversion - // eslint-disable-next-line no-undef - return !String(Symbol()); -}); - - -/***/ }), - -/***/ "../cvat-data/node_modules/core-js/internals/native-weak-map.js": -/*!**********************************************************************!*\ - !*** ../cvat-data/node_modules/core-js/internals/native-weak-map.js ***! - \**********************************************************************/ -/*! no static exports found */ -/***/ (function(module, exports, __webpack_require__) { - -var global = __webpack_require__(/*! ../internals/global */ "../cvat-data/node_modules/core-js/internals/global.js"); -var nativeFunctionToString = __webpack_require__(/*! ../internals/function-to-string */ "../cvat-data/node_modules/core-js/internals/function-to-string.js"); - -var WeakMap = global.WeakMap; - -module.exports = typeof WeakMap === 'function' && /native code/.test(nativeFunctionToString.call(WeakMap)); - - -/***/ }), - -/***/ "../cvat-data/node_modules/core-js/internals/object-create.js": -/*!********************************************************************!*\ - !*** ../cvat-data/node_modules/core-js/internals/object-create.js ***! - \********************************************************************/ -/*! no static exports found */ -/***/ (function(module, exports, __webpack_require__) { - -var anObject = __webpack_require__(/*! ../internals/an-object */ "../cvat-data/node_modules/core-js/internals/an-object.js"); -var defineProperties = __webpack_require__(/*! ../internals/object-define-properties */ "../cvat-data/node_modules/core-js/internals/object-define-properties.js"); -var enumBugKeys = __webpack_require__(/*! ../internals/enum-bug-keys */ "../cvat-data/node_modules/core-js/internals/enum-bug-keys.js"); -var hiddenKeys = __webpack_require__(/*! ../internals/hidden-keys */ "../cvat-data/node_modules/core-js/internals/hidden-keys.js"); -var html = __webpack_require__(/*! ../internals/html */ "../cvat-data/node_modules/core-js/internals/html.js"); -var documentCreateElement = __webpack_require__(/*! ../internals/document-create-element */ "../cvat-data/node_modules/core-js/internals/document-create-element.js"); -var sharedKey = __webpack_require__(/*! ../internals/shared-key */ "../cvat-data/node_modules/core-js/internals/shared-key.js"); -var IE_PROTO = sharedKey('IE_PROTO'); - -var PROTOTYPE = 'prototype'; -var Empty = function () { /* empty */ }; - -// Create object with fake `null` prototype: use iframe Object with cleared prototype -var createDict = function () { - // Thrash, waste and sodomy: IE GC bug - var iframe = documentCreateElement('iframe'); - var length = enumBugKeys.length; - var lt = '<'; - var script = 'script'; - var gt = '>'; - var js = 'java' + script + ':'; - var iframeDocument; - iframe.style.display = 'none'; - html.appendChild(iframe); - iframe.src = String(js); - iframeDocument = iframe.contentWindow.document; - iframeDocument.open(); - iframeDocument.write(lt + script + gt + 'document.F=Object' + lt + '/' + script + gt); - iframeDocument.close(); - createDict = iframeDocument.F; - while (length--) delete createDict[PROTOTYPE][enumBugKeys[length]]; - return createDict(); -}; - -// `Object.create` method -// https://tc39.github.io/ecma262/#sec-object.create -module.exports = Object.create || function create(O, Properties) { - var result; - if (O !== null) { - Empty[PROTOTYPE] = anObject(O); - result = new Empty(); - Empty[PROTOTYPE] = null; - // add "__proto__" for Object.getPrototypeOf polyfill - result[IE_PROTO] = O; - } else result = createDict(); - return Properties === undefined ? result : defineProperties(result, Properties); -}; - -hiddenKeys[IE_PROTO] = true; - - -/***/ }), - -/***/ "../cvat-data/node_modules/core-js/internals/object-define-properties.js": -/*!*******************************************************************************!*\ - !*** ../cvat-data/node_modules/core-js/internals/object-define-properties.js ***! - \*******************************************************************************/ -/*! no static exports found */ -/***/ (function(module, exports, __webpack_require__) { - -var DESCRIPTORS = __webpack_require__(/*! ../internals/descriptors */ "../cvat-data/node_modules/core-js/internals/descriptors.js"); -var definePropertyModule = __webpack_require__(/*! ../internals/object-define-property */ "../cvat-data/node_modules/core-js/internals/object-define-property.js"); -var anObject = __webpack_require__(/*! ../internals/an-object */ "../cvat-data/node_modules/core-js/internals/an-object.js"); -var objectKeys = __webpack_require__(/*! ../internals/object-keys */ "../cvat-data/node_modules/core-js/internals/object-keys.js"); - -// `Object.defineProperties` method -// https://tc39.github.io/ecma262/#sec-object.defineproperties -module.exports = DESCRIPTORS ? Object.defineProperties : function defineProperties(O, Properties) { - anObject(O); - var keys = objectKeys(Properties); - var length = keys.length; - var index = 0; - var key; - while (length > index) definePropertyModule.f(O, key = keys[index++], Properties[key]); - return O; -}; - - -/***/ }), - -/***/ "../cvat-data/node_modules/core-js/internals/object-define-property.js": -/*!*****************************************************************************!*\ - !*** ../cvat-data/node_modules/core-js/internals/object-define-property.js ***! - \*****************************************************************************/ -/*! no static exports found */ -/***/ (function(module, exports, __webpack_require__) { - -var DESCRIPTORS = __webpack_require__(/*! ../internals/descriptors */ "../cvat-data/node_modules/core-js/internals/descriptors.js"); -var IE8_DOM_DEFINE = __webpack_require__(/*! ../internals/ie8-dom-define */ "../cvat-data/node_modules/core-js/internals/ie8-dom-define.js"); -var anObject = __webpack_require__(/*! ../internals/an-object */ "../cvat-data/node_modules/core-js/internals/an-object.js"); -var toPrimitive = __webpack_require__(/*! ../internals/to-primitive */ "../cvat-data/node_modules/core-js/internals/to-primitive.js"); - -var nativeDefineProperty = Object.defineProperty; - -// `Object.defineProperty` method -// https://tc39.github.io/ecma262/#sec-object.defineproperty -exports.f = DESCRIPTORS ? nativeDefineProperty : function defineProperty(O, P, Attributes) { - anObject(O); - P = toPrimitive(P, true); - anObject(Attributes); - if (IE8_DOM_DEFINE) try { - return nativeDefineProperty(O, P, Attributes); - } catch (error) { /* empty */ } - if ('get' in Attributes || 'set' in Attributes) throw TypeError('Accessors not supported'); - if ('value' in Attributes) O[P] = Attributes.value; - return O; -}; - - -/***/ }), - -/***/ "../cvat-data/node_modules/core-js/internals/object-get-own-property-descriptor.js": -/*!*****************************************************************************************!*\ - !*** ../cvat-data/node_modules/core-js/internals/object-get-own-property-descriptor.js ***! - \*****************************************************************************************/ -/*! no static exports found */ -/***/ (function(module, exports, __webpack_require__) { - -var DESCRIPTORS = __webpack_require__(/*! ../internals/descriptors */ "../cvat-data/node_modules/core-js/internals/descriptors.js"); -var propertyIsEnumerableModule = __webpack_require__(/*! ../internals/object-property-is-enumerable */ "../cvat-data/node_modules/core-js/internals/object-property-is-enumerable.js"); -var createPropertyDescriptor = __webpack_require__(/*! ../internals/create-property-descriptor */ "../cvat-data/node_modules/core-js/internals/create-property-descriptor.js"); -var toIndexedObject = __webpack_require__(/*! ../internals/to-indexed-object */ "../cvat-data/node_modules/core-js/internals/to-indexed-object.js"); -var toPrimitive = __webpack_require__(/*! ../internals/to-primitive */ "../cvat-data/node_modules/core-js/internals/to-primitive.js"); -var has = __webpack_require__(/*! ../internals/has */ "../cvat-data/node_modules/core-js/internals/has.js"); -var IE8_DOM_DEFINE = __webpack_require__(/*! ../internals/ie8-dom-define */ "../cvat-data/node_modules/core-js/internals/ie8-dom-define.js"); - -var nativeGetOwnPropertyDescriptor = Object.getOwnPropertyDescriptor; - -// `Object.getOwnPropertyDescriptor` method -// https://tc39.github.io/ecma262/#sec-object.getownpropertydescriptor -exports.f = DESCRIPTORS ? nativeGetOwnPropertyDescriptor : function getOwnPropertyDescriptor(O, P) { - O = toIndexedObject(O); - P = toPrimitive(P, true); - if (IE8_DOM_DEFINE) try { - return nativeGetOwnPropertyDescriptor(O, P); - } catch (error) { /* empty */ } - if (has(O, P)) return createPropertyDescriptor(!propertyIsEnumerableModule.f.call(O, P), O[P]); -}; - - -/***/ }), - -/***/ "../cvat-data/node_modules/core-js/internals/object-get-own-property-names.js": -/*!************************************************************************************!*\ - !*** ../cvat-data/node_modules/core-js/internals/object-get-own-property-names.js ***! - \************************************************************************************/ -/*! no static exports found */ -/***/ (function(module, exports, __webpack_require__) { - -var internalObjectKeys = __webpack_require__(/*! ../internals/object-keys-internal */ "../cvat-data/node_modules/core-js/internals/object-keys-internal.js"); -var enumBugKeys = __webpack_require__(/*! ../internals/enum-bug-keys */ "../cvat-data/node_modules/core-js/internals/enum-bug-keys.js"); - -var hiddenKeys = enumBugKeys.concat('length', 'prototype'); - -// `Object.getOwnPropertyNames` method -// https://tc39.github.io/ecma262/#sec-object.getownpropertynames -exports.f = Object.getOwnPropertyNames || function getOwnPropertyNames(O) { - return internalObjectKeys(O, hiddenKeys); -}; - - -/***/ }), - -/***/ "../cvat-data/node_modules/core-js/internals/object-get-own-property-symbols.js": -/*!**************************************************************************************!*\ - !*** ../cvat-data/node_modules/core-js/internals/object-get-own-property-symbols.js ***! - \**************************************************************************************/ -/*! no static exports found */ -/***/ (function(module, exports) { - -exports.f = Object.getOwnPropertySymbols; - - -/***/ }), - -/***/ "../cvat-data/node_modules/core-js/internals/object-get-prototype-of.js": -/*!******************************************************************************!*\ - !*** ../cvat-data/node_modules/core-js/internals/object-get-prototype-of.js ***! - \******************************************************************************/ -/*! no static exports found */ -/***/ (function(module, exports, __webpack_require__) { - -var has = __webpack_require__(/*! ../internals/has */ "../cvat-data/node_modules/core-js/internals/has.js"); -var toObject = __webpack_require__(/*! ../internals/to-object */ "../cvat-data/node_modules/core-js/internals/to-object.js"); -var sharedKey = __webpack_require__(/*! ../internals/shared-key */ "../cvat-data/node_modules/core-js/internals/shared-key.js"); -var CORRECT_PROTOTYPE_GETTER = __webpack_require__(/*! ../internals/correct-prototype-getter */ "../cvat-data/node_modules/core-js/internals/correct-prototype-getter.js"); - -var IE_PROTO = sharedKey('IE_PROTO'); -var ObjectPrototype = Object.prototype; - -// `Object.getPrototypeOf` method -// https://tc39.github.io/ecma262/#sec-object.getprototypeof -module.exports = CORRECT_PROTOTYPE_GETTER ? Object.getPrototypeOf : function (O) { - O = toObject(O); - if (has(O, IE_PROTO)) return O[IE_PROTO]; - if (typeof O.constructor == 'function' && O instanceof O.constructor) { - return O.constructor.prototype; - } return O instanceof Object ? ObjectPrototype : null; -}; - - -/***/ }), - -/***/ "../cvat-data/node_modules/core-js/internals/object-keys-internal.js": -/*!***************************************************************************!*\ - !*** ../cvat-data/node_modules/core-js/internals/object-keys-internal.js ***! - \***************************************************************************/ -/*! no static exports found */ -/***/ (function(module, exports, __webpack_require__) { - -var has = __webpack_require__(/*! ../internals/has */ "../cvat-data/node_modules/core-js/internals/has.js"); -var toIndexedObject = __webpack_require__(/*! ../internals/to-indexed-object */ "../cvat-data/node_modules/core-js/internals/to-indexed-object.js"); -var indexOf = __webpack_require__(/*! ../internals/array-includes */ "../cvat-data/node_modules/core-js/internals/array-includes.js").indexOf; -var hiddenKeys = __webpack_require__(/*! ../internals/hidden-keys */ "../cvat-data/node_modules/core-js/internals/hidden-keys.js"); - -module.exports = function (object, names) { - var O = toIndexedObject(object); - var i = 0; - var result = []; - var key; - for (key in O) !has(hiddenKeys, key) && has(O, key) && result.push(key); - // Don't enum bug & hidden keys - while (names.length > i) if (has(O, key = names[i++])) { - ~indexOf(result, key) || result.push(key); - } - return result; -}; - - -/***/ }), - -/***/ "../cvat-data/node_modules/core-js/internals/object-keys.js": -/*!******************************************************************!*\ - !*** ../cvat-data/node_modules/core-js/internals/object-keys.js ***! - \******************************************************************/ -/*! no static exports found */ -/***/ (function(module, exports, __webpack_require__) { - -var internalObjectKeys = __webpack_require__(/*! ../internals/object-keys-internal */ "../cvat-data/node_modules/core-js/internals/object-keys-internal.js"); -var enumBugKeys = __webpack_require__(/*! ../internals/enum-bug-keys */ "../cvat-data/node_modules/core-js/internals/enum-bug-keys.js"); - -// `Object.keys` method -// https://tc39.github.io/ecma262/#sec-object.keys -module.exports = Object.keys || function keys(O) { - return internalObjectKeys(O, enumBugKeys); -}; - - -/***/ }), - -/***/ "../cvat-data/node_modules/core-js/internals/object-property-is-enumerable.js": -/*!************************************************************************************!*\ - !*** ../cvat-data/node_modules/core-js/internals/object-property-is-enumerable.js ***! - \************************************************************************************/ -/*! no static exports found */ -/***/ (function(module, exports, __webpack_require__) { - -"use strict"; - -var nativePropertyIsEnumerable = {}.propertyIsEnumerable; -var getOwnPropertyDescriptor = Object.getOwnPropertyDescriptor; - -// Nashorn ~ JDK8 bug -var NASHORN_BUG = getOwnPropertyDescriptor && !nativePropertyIsEnumerable.call({ 1: 2 }, 1); - -// `Object.prototype.propertyIsEnumerable` method implementation -// https://tc39.github.io/ecma262/#sec-object.prototype.propertyisenumerable -exports.f = NASHORN_BUG ? function propertyIsEnumerable(V) { - var descriptor = getOwnPropertyDescriptor(this, V); - return !!descriptor && descriptor.enumerable; -} : nativePropertyIsEnumerable; - - -/***/ }), - -/***/ "../cvat-data/node_modules/core-js/internals/object-set-prototype-of.js": -/*!******************************************************************************!*\ - !*** ../cvat-data/node_modules/core-js/internals/object-set-prototype-of.js ***! - \******************************************************************************/ -/*! no static exports found */ -/***/ (function(module, exports, __webpack_require__) { - -var anObject = __webpack_require__(/*! ../internals/an-object */ "../cvat-data/node_modules/core-js/internals/an-object.js"); -var aPossiblePrototype = __webpack_require__(/*! ../internals/a-possible-prototype */ "../cvat-data/node_modules/core-js/internals/a-possible-prototype.js"); - -// `Object.setPrototypeOf` method -// https://tc39.github.io/ecma262/#sec-object.setprototypeof -// Works with __proto__ only. Old v8 can't work with null proto objects. -/* eslint-disable no-proto */ -module.exports = Object.setPrototypeOf || ('__proto__' in {} ? function () { - var CORRECT_SETTER = false; - var test = {}; - var setter; - try { - setter = Object.getOwnPropertyDescriptor(Object.prototype, '__proto__').set; - setter.call(test, []); - CORRECT_SETTER = test instanceof Array; - } catch (error) { /* empty */ } - return function setPrototypeOf(O, proto) { - anObject(O); - aPossiblePrototype(proto); - if (CORRECT_SETTER) setter.call(O, proto); - else O.__proto__ = proto; - return O; - }; -}() : undefined); - - -/***/ }), - -/***/ "../cvat-data/node_modules/core-js/internals/own-keys.js": -/*!***************************************************************!*\ - !*** ../cvat-data/node_modules/core-js/internals/own-keys.js ***! - \***************************************************************/ -/*! no static exports found */ -/***/ (function(module, exports, __webpack_require__) { - -var getBuiltIn = __webpack_require__(/*! ../internals/get-built-in */ "../cvat-data/node_modules/core-js/internals/get-built-in.js"); -var getOwnPropertyNamesModule = __webpack_require__(/*! ../internals/object-get-own-property-names */ "../cvat-data/node_modules/core-js/internals/object-get-own-property-names.js"); -var getOwnPropertySymbolsModule = __webpack_require__(/*! ../internals/object-get-own-property-symbols */ "../cvat-data/node_modules/core-js/internals/object-get-own-property-symbols.js"); -var anObject = __webpack_require__(/*! ../internals/an-object */ "../cvat-data/node_modules/core-js/internals/an-object.js"); - -// all object keys, includes non-enumerable and symbols -module.exports = getBuiltIn('Reflect', 'ownKeys') || function ownKeys(it) { - var keys = getOwnPropertyNamesModule.f(anObject(it)); - var getOwnPropertySymbols = getOwnPropertySymbolsModule.f; - return getOwnPropertySymbols ? keys.concat(getOwnPropertySymbols(it)) : keys; -}; - - -/***/ }), - -/***/ "../cvat-data/node_modules/core-js/internals/path.js": -/*!***********************************************************!*\ - !*** ../cvat-data/node_modules/core-js/internals/path.js ***! - \***********************************************************/ -/*! no static exports found */ -/***/ (function(module, exports, __webpack_require__) { - -module.exports = __webpack_require__(/*! ../internals/global */ "../cvat-data/node_modules/core-js/internals/global.js"); - - -/***/ }), - -/***/ "../cvat-data/node_modules/core-js/internals/redefine.js": -/*!***************************************************************!*\ - !*** ../cvat-data/node_modules/core-js/internals/redefine.js ***! - \***************************************************************/ -/*! no static exports found */ -/***/ (function(module, exports, __webpack_require__) { - -var global = __webpack_require__(/*! ../internals/global */ "../cvat-data/node_modules/core-js/internals/global.js"); -var shared = __webpack_require__(/*! ../internals/shared */ "../cvat-data/node_modules/core-js/internals/shared.js"); -var hide = __webpack_require__(/*! ../internals/hide */ "../cvat-data/node_modules/core-js/internals/hide.js"); -var has = __webpack_require__(/*! ../internals/has */ "../cvat-data/node_modules/core-js/internals/has.js"); -var setGlobal = __webpack_require__(/*! ../internals/set-global */ "../cvat-data/node_modules/core-js/internals/set-global.js"); -var nativeFunctionToString = __webpack_require__(/*! ../internals/function-to-string */ "../cvat-data/node_modules/core-js/internals/function-to-string.js"); -var InternalStateModule = __webpack_require__(/*! ../internals/internal-state */ "../cvat-data/node_modules/core-js/internals/internal-state.js"); - -var getInternalState = InternalStateModule.get; -var enforceInternalState = InternalStateModule.enforce; -var TEMPLATE = String(nativeFunctionToString).split('toString'); - -shared('inspectSource', function (it) { - return nativeFunctionToString.call(it); -}); - -(module.exports = function (O, key, value, options) { - var unsafe = options ? !!options.unsafe : false; - var simple = options ? !!options.enumerable : false; - var noTargetGet = options ? !!options.noTargetGet : false; - if (typeof value == 'function') { - if (typeof key == 'string' && !has(value, 'name')) hide(value, 'name', key); - enforceInternalState(value).source = TEMPLATE.join(typeof key == 'string' ? key : ''); - } - if (O === global) { - if (simple) O[key] = value; - else setGlobal(key, value); - return; - } else if (!unsafe) { - delete O[key]; - } else if (!noTargetGet && O[key]) { - simple = true; - } - if (simple) O[key] = value; - else hide(O, key, value); -// add fake Function#toString for correct work wrapped methods / constructors with methods like LoDash isNative -})(Function.prototype, 'toString', function toString() { - return typeof this == 'function' && getInternalState(this).source || nativeFunctionToString.call(this); -}); - - -/***/ }), - -/***/ "../cvat-data/node_modules/core-js/internals/require-object-coercible.js": -/*!*******************************************************************************!*\ - !*** ../cvat-data/node_modules/core-js/internals/require-object-coercible.js ***! - \*******************************************************************************/ -/*! no static exports found */ -/***/ (function(module, exports) { - -// `RequireObjectCoercible` abstract operation -// https://tc39.github.io/ecma262/#sec-requireobjectcoercible -module.exports = function (it) { - if (it == undefined) throw TypeError("Can't call method on " + it); - return it; -}; - - -/***/ }), - -/***/ "../cvat-data/node_modules/core-js/internals/set-global.js": -/*!*****************************************************************!*\ - !*** ../cvat-data/node_modules/core-js/internals/set-global.js ***! - \*****************************************************************/ -/*! no static exports found */ -/***/ (function(module, exports, __webpack_require__) { - -var global = __webpack_require__(/*! ../internals/global */ "../cvat-data/node_modules/core-js/internals/global.js"); -var hide = __webpack_require__(/*! ../internals/hide */ "../cvat-data/node_modules/core-js/internals/hide.js"); - -module.exports = function (key, value) { - try { - hide(global, key, value); - } catch (error) { - global[key] = value; - } return value; -}; - - -/***/ }), - -/***/ "../cvat-data/node_modules/core-js/internals/set-to-string-tag.js": -/*!************************************************************************!*\ - !*** ../cvat-data/node_modules/core-js/internals/set-to-string-tag.js ***! - \************************************************************************/ -/*! no static exports found */ -/***/ (function(module, exports, __webpack_require__) { - -var defineProperty = __webpack_require__(/*! ../internals/object-define-property */ "../cvat-data/node_modules/core-js/internals/object-define-property.js").f; -var has = __webpack_require__(/*! ../internals/has */ "../cvat-data/node_modules/core-js/internals/has.js"); -var wellKnownSymbol = __webpack_require__(/*! ../internals/well-known-symbol */ "../cvat-data/node_modules/core-js/internals/well-known-symbol.js"); - -var TO_STRING_TAG = wellKnownSymbol('toStringTag'); - -module.exports = function (it, TAG, STATIC) { - if (it && !has(it = STATIC ? it : it.prototype, TO_STRING_TAG)) { - defineProperty(it, TO_STRING_TAG, { configurable: true, value: TAG }); - } -}; - - -/***/ }), - -/***/ "../cvat-data/node_modules/core-js/internals/shared-key.js": -/*!*****************************************************************!*\ - !*** ../cvat-data/node_modules/core-js/internals/shared-key.js ***! - \*****************************************************************/ -/*! no static exports found */ -/***/ (function(module, exports, __webpack_require__) { - -var shared = __webpack_require__(/*! ../internals/shared */ "../cvat-data/node_modules/core-js/internals/shared.js"); -var uid = __webpack_require__(/*! ../internals/uid */ "../cvat-data/node_modules/core-js/internals/uid.js"); - -var keys = shared('keys'); - -module.exports = function (key) { - return keys[key] || (keys[key] = uid(key)); -}; - - -/***/ }), - -/***/ "../cvat-data/node_modules/core-js/internals/shared.js": -/*!*************************************************************!*\ - !*** ../cvat-data/node_modules/core-js/internals/shared.js ***! - \*************************************************************/ -/*! no static exports found */ -/***/ (function(module, exports, __webpack_require__) { - -var global = __webpack_require__(/*! ../internals/global */ "../cvat-data/node_modules/core-js/internals/global.js"); -var setGlobal = __webpack_require__(/*! ../internals/set-global */ "../cvat-data/node_modules/core-js/internals/set-global.js"); -var IS_PURE = __webpack_require__(/*! ../internals/is-pure */ "../cvat-data/node_modules/core-js/internals/is-pure.js"); - -var SHARED = '__core-js_shared__'; -var store = global[SHARED] || setGlobal(SHARED, {}); - -(module.exports = function (key, value) { - return store[key] || (store[key] = value !== undefined ? value : {}); -})('versions', []).push({ - version: '3.2.1', - mode: IS_PURE ? 'pure' : 'global', - copyright: '© 2019 Denis Pushkarev (zloirock.ru)' -}); - - -/***/ }), - -/***/ "../cvat-data/node_modules/core-js/internals/sloppy-array-method.js": -/*!**************************************************************************!*\ - !*** ../cvat-data/node_modules/core-js/internals/sloppy-array-method.js ***! - \**************************************************************************/ -/*! no static exports found */ -/***/ (function(module, exports, __webpack_require__) { - -"use strict"; - -var fails = __webpack_require__(/*! ../internals/fails */ "../cvat-data/node_modules/core-js/internals/fails.js"); - -module.exports = function (METHOD_NAME, argument) { - var method = [][METHOD_NAME]; - return !method || !fails(function () { - // eslint-disable-next-line no-useless-call,no-throw-literal - method.call(null, argument || function () { throw 1; }, 1); - }); -}; - - -/***/ }), - -/***/ "../cvat-data/node_modules/core-js/internals/to-absolute-index.js": -/*!************************************************************************!*\ - !*** ../cvat-data/node_modules/core-js/internals/to-absolute-index.js ***! - \************************************************************************/ -/*! no static exports found */ -/***/ (function(module, exports, __webpack_require__) { - -var toInteger = __webpack_require__(/*! ../internals/to-integer */ "../cvat-data/node_modules/core-js/internals/to-integer.js"); - -var max = Math.max; -var min = Math.min; - -// Helper for a popular repeating case of the spec: -// Let integer be ? ToInteger(index). -// If integer < 0, let result be max((length + integer), 0); else let result be min(length, length). -module.exports = function (index, length) { - var integer = toInteger(index); - return integer < 0 ? max(integer + length, 0) : min(integer, length); -}; - - -/***/ }), - -/***/ "../cvat-data/node_modules/core-js/internals/to-indexed-object.js": -/*!************************************************************************!*\ - !*** ../cvat-data/node_modules/core-js/internals/to-indexed-object.js ***! - \************************************************************************/ -/*! no static exports found */ -/***/ (function(module, exports, __webpack_require__) { - -// toObject with fallback for non-array-like ES3 strings -var IndexedObject = __webpack_require__(/*! ../internals/indexed-object */ "../cvat-data/node_modules/core-js/internals/indexed-object.js"); -var requireObjectCoercible = __webpack_require__(/*! ../internals/require-object-coercible */ "../cvat-data/node_modules/core-js/internals/require-object-coercible.js"); - -module.exports = function (it) { - return IndexedObject(requireObjectCoercible(it)); -}; - - -/***/ }), - -/***/ "../cvat-data/node_modules/core-js/internals/to-integer.js": -/*!*****************************************************************!*\ - !*** ../cvat-data/node_modules/core-js/internals/to-integer.js ***! - \*****************************************************************/ -/*! no static exports found */ -/***/ (function(module, exports) { - -var ceil = Math.ceil; -var floor = Math.floor; - -// `ToInteger` abstract operation -// https://tc39.github.io/ecma262/#sec-tointeger -module.exports = function (argument) { - return isNaN(argument = +argument) ? 0 : (argument > 0 ? floor : ceil)(argument); -}; - - -/***/ }), - -/***/ "../cvat-data/node_modules/core-js/internals/to-length.js": -/*!****************************************************************!*\ - !*** ../cvat-data/node_modules/core-js/internals/to-length.js ***! - \****************************************************************/ -/*! no static exports found */ -/***/ (function(module, exports, __webpack_require__) { - -var toInteger = __webpack_require__(/*! ../internals/to-integer */ "../cvat-data/node_modules/core-js/internals/to-integer.js"); - -var min = Math.min; - -// `ToLength` abstract operation -// https://tc39.github.io/ecma262/#sec-tolength -module.exports = function (argument) { - return argument > 0 ? min(toInteger(argument), 0x1FFFFFFFFFFFFF) : 0; // 2 ** 53 - 1 == 9007199254740991 -}; - - -/***/ }), - -/***/ "../cvat-data/node_modules/core-js/internals/to-object.js": -/*!****************************************************************!*\ - !*** ../cvat-data/node_modules/core-js/internals/to-object.js ***! - \****************************************************************/ -/*! no static exports found */ -/***/ (function(module, exports, __webpack_require__) { - -var requireObjectCoercible = __webpack_require__(/*! ../internals/require-object-coercible */ "../cvat-data/node_modules/core-js/internals/require-object-coercible.js"); - -// `ToObject` abstract operation -// https://tc39.github.io/ecma262/#sec-toobject -module.exports = function (argument) { - return Object(requireObjectCoercible(argument)); -}; - - -/***/ }), - -/***/ "../cvat-data/node_modules/core-js/internals/to-primitive.js": -/*!*******************************************************************!*\ - !*** ../cvat-data/node_modules/core-js/internals/to-primitive.js ***! - \*******************************************************************/ -/*! no static exports found */ -/***/ (function(module, exports, __webpack_require__) { - -var isObject = __webpack_require__(/*! ../internals/is-object */ "../cvat-data/node_modules/core-js/internals/is-object.js"); - -// `ToPrimitive` abstract operation -// https://tc39.github.io/ecma262/#sec-toprimitive -// instead of the ES6 spec version, we didn't implement @@toPrimitive case -// and the second argument - flag - preferred type is a string -module.exports = function (input, PREFERRED_STRING) { - if (!isObject(input)) return input; - var fn, val; - if (PREFERRED_STRING && typeof (fn = input.toString) == 'function' && !isObject(val = fn.call(input))) return val; - if (typeof (fn = input.valueOf) == 'function' && !isObject(val = fn.call(input))) return val; - if (!PREFERRED_STRING && typeof (fn = input.toString) == 'function' && !isObject(val = fn.call(input))) return val; - throw TypeError("Can't convert object to primitive value"); -}; - - -/***/ }), - -/***/ "../cvat-data/node_modules/core-js/internals/uid.js": -/*!**********************************************************!*\ - !*** ../cvat-data/node_modules/core-js/internals/uid.js ***! - \**********************************************************/ -/*! no static exports found */ -/***/ (function(module, exports) { - -var id = 0; -var postfix = Math.random(); - -module.exports = function (key) { - return 'Symbol(' + String(key === undefined ? '' : key) + ')_' + (++id + postfix).toString(36); -}; - - -/***/ }), - -/***/ "../cvat-data/node_modules/core-js/internals/well-known-symbol.js": -/*!************************************************************************!*\ - !*** ../cvat-data/node_modules/core-js/internals/well-known-symbol.js ***! - \************************************************************************/ -/*! no static exports found */ -/***/ (function(module, exports, __webpack_require__) { - -var global = __webpack_require__(/*! ../internals/global */ "../cvat-data/node_modules/core-js/internals/global.js"); -var shared = __webpack_require__(/*! ../internals/shared */ "../cvat-data/node_modules/core-js/internals/shared.js"); -var uid = __webpack_require__(/*! ../internals/uid */ "../cvat-data/node_modules/core-js/internals/uid.js"); -var NATIVE_SYMBOL = __webpack_require__(/*! ../internals/native-symbol */ "../cvat-data/node_modules/core-js/internals/native-symbol.js"); - -var Symbol = global.Symbol; -var store = shared('wks'); - -module.exports = function (name) { - return store[name] || (store[name] = NATIVE_SYMBOL && Symbol[name] - || (NATIVE_SYMBOL ? Symbol : uid)('Symbol.' + name)); -}; - - -/***/ }), - -/***/ "../cvat-data/node_modules/core-js/modules/es.array.iterator.js": -/*!**********************************************************************!*\ - !*** ../cvat-data/node_modules/core-js/modules/es.array.iterator.js ***! - \**********************************************************************/ -/*! no static exports found */ -/***/ (function(module, exports, __webpack_require__) { - -"use strict"; - -var toIndexedObject = __webpack_require__(/*! ../internals/to-indexed-object */ "../cvat-data/node_modules/core-js/internals/to-indexed-object.js"); -var addToUnscopables = __webpack_require__(/*! ../internals/add-to-unscopables */ "../cvat-data/node_modules/core-js/internals/add-to-unscopables.js"); -var Iterators = __webpack_require__(/*! ../internals/iterators */ "../cvat-data/node_modules/core-js/internals/iterators.js"); -var InternalStateModule = __webpack_require__(/*! ../internals/internal-state */ "../cvat-data/node_modules/core-js/internals/internal-state.js"); -var defineIterator = __webpack_require__(/*! ../internals/define-iterator */ "../cvat-data/node_modules/core-js/internals/define-iterator.js"); - -var ARRAY_ITERATOR = 'Array Iterator'; -var setInternalState = InternalStateModule.set; -var getInternalState = InternalStateModule.getterFor(ARRAY_ITERATOR); - -// `Array.prototype.entries` method -// https://tc39.github.io/ecma262/#sec-array.prototype.entries -// `Array.prototype.keys` method -// https://tc39.github.io/ecma262/#sec-array.prototype.keys -// `Array.prototype.values` method -// https://tc39.github.io/ecma262/#sec-array.prototype.values -// `Array.prototype[@@iterator]` method -// https://tc39.github.io/ecma262/#sec-array.prototype-@@iterator -// `CreateArrayIterator` internal method -// https://tc39.github.io/ecma262/#sec-createarrayiterator -module.exports = defineIterator(Array, 'Array', function (iterated, kind) { - setInternalState(this, { - type: ARRAY_ITERATOR, - target: toIndexedObject(iterated), // target - index: 0, // next index - kind: kind // kind - }); -// `%ArrayIteratorPrototype%.next` method -// https://tc39.github.io/ecma262/#sec-%arrayiteratorprototype%.next -}, function () { - var state = getInternalState(this); - var target = state.target; - var kind = state.kind; - var index = state.index++; - if (!target || index >= target.length) { - state.target = undefined; - return { value: undefined, done: true }; - } - if (kind == 'keys') return { value: index, done: false }; - if (kind == 'values') return { value: target[index], done: false }; - return { value: [index, target[index]], done: false }; -}, 'values'); - -// argumentsList[@@iterator] is %ArrayProto_values% -// https://tc39.github.io/ecma262/#sec-createunmappedargumentsobject -// https://tc39.github.io/ecma262/#sec-createmappedargumentsobject -Iterators.Arguments = Iterators.Array; - -// https://tc39.github.io/ecma262/#sec-array.prototype-@@unscopables -addToUnscopables('keys'); -addToUnscopables('values'); -addToUnscopables('entries'); - - -/***/ }), - -/***/ "../cvat-data/node_modules/core-js/modules/es.array.sort.js": -/*!******************************************************************!*\ - !*** ../cvat-data/node_modules/core-js/modules/es.array.sort.js ***! - \******************************************************************/ -/*! no static exports found */ -/***/ (function(module, exports, __webpack_require__) { - -"use strict"; - -var $ = __webpack_require__(/*! ../internals/export */ "../cvat-data/node_modules/core-js/internals/export.js"); -var aFunction = __webpack_require__(/*! ../internals/a-function */ "../cvat-data/node_modules/core-js/internals/a-function.js"); -var toObject = __webpack_require__(/*! ../internals/to-object */ "../cvat-data/node_modules/core-js/internals/to-object.js"); -var fails = __webpack_require__(/*! ../internals/fails */ "../cvat-data/node_modules/core-js/internals/fails.js"); -var sloppyArrayMethod = __webpack_require__(/*! ../internals/sloppy-array-method */ "../cvat-data/node_modules/core-js/internals/sloppy-array-method.js"); - -var nativeSort = [].sort; -var test = [1, 2, 3]; - -// IE8- -var FAILS_ON_UNDEFINED = fails(function () { - test.sort(undefined); -}); -// V8 bug -var FAILS_ON_NULL = fails(function () { - test.sort(null); -}); -// Old WebKit -var SLOPPY_METHOD = sloppyArrayMethod('sort'); - -var FORCED = FAILS_ON_UNDEFINED || !FAILS_ON_NULL || SLOPPY_METHOD; - -// `Array.prototype.sort` method -// https://tc39.github.io/ecma262/#sec-array.prototype.sort -$({ target: 'Array', proto: true, forced: FORCED }, { - sort: function sort(comparefn) { - return comparefn === undefined - ? nativeSort.call(toObject(this)) - : nativeSort.call(toObject(this), aFunction(comparefn)); - } -}); - - -/***/ }), - -/***/ "../cvat-data/node_modules/core-js/modules/web.dom-collections.iterator.js": -/*!*********************************************************************************!*\ - !*** ../cvat-data/node_modules/core-js/modules/web.dom-collections.iterator.js ***! - \*********************************************************************************/ -/*! no static exports found */ -/***/ (function(module, exports, __webpack_require__) { - -var global = __webpack_require__(/*! ../internals/global */ "../cvat-data/node_modules/core-js/internals/global.js"); -var DOMIterables = __webpack_require__(/*! ../internals/dom-iterables */ "../cvat-data/node_modules/core-js/internals/dom-iterables.js"); -var ArrayIteratorMethods = __webpack_require__(/*! ../modules/es.array.iterator */ "../cvat-data/node_modules/core-js/modules/es.array.iterator.js"); -var hide = __webpack_require__(/*! ../internals/hide */ "../cvat-data/node_modules/core-js/internals/hide.js"); -var wellKnownSymbol = __webpack_require__(/*! ../internals/well-known-symbol */ "../cvat-data/node_modules/core-js/internals/well-known-symbol.js"); - -var ITERATOR = wellKnownSymbol('iterator'); -var TO_STRING_TAG = wellKnownSymbol('toStringTag'); -var ArrayValues = ArrayIteratorMethods.values; - -for (var COLLECTION_NAME in DOMIterables) { - var Collection = global[COLLECTION_NAME]; - var CollectionPrototype = Collection && Collection.prototype; - if (CollectionPrototype) { - // some Chrome versions have non-configurable methods on DOMTokenList - if (CollectionPrototype[ITERATOR] !== ArrayValues) try { - hide(CollectionPrototype, ITERATOR, ArrayValues); - } catch (error) { - CollectionPrototype[ITERATOR] = ArrayValues; - } - if (!CollectionPrototype[TO_STRING_TAG]) hide(CollectionPrototype, TO_STRING_TAG, COLLECTION_NAME); - if (DOMIterables[COLLECTION_NAME]) for (var METHOD_NAME in ArrayIteratorMethods) { - // some Chrome versions have non-configurable methods on DOMTokenList - if (CollectionPrototype[METHOD_NAME] !== ArrayIteratorMethods[METHOD_NAME]) try { - hide(CollectionPrototype, METHOD_NAME, ArrayIteratorMethods[METHOD_NAME]); - } catch (error) { - CollectionPrototype[METHOD_NAME] = ArrayIteratorMethods[METHOD_NAME]; - } - } - } -} - - -/***/ }), - -/***/ "../cvat-data/src/js/cvat-data.js": -/*!****************************************!*\ - !*** ../cvat-data/src/js/cvat-data.js ***! - \****************************************/ -/*! no static exports found */ -/***/ (function(module, exports, __webpack_require__) { - -__webpack_require__(/*! core-js/modules/es.array.iterator */ "../cvat-data/node_modules/core-js/modules/es.array.iterator.js"); - -__webpack_require__(/*! core-js/modules/es.array.sort */ "../cvat-data/node_modules/core-js/modules/es.array.sort.js"); - -__webpack_require__(/*! core-js/modules/web.dom-collections.iterator */ "../cvat-data/node_modules/core-js/modules/web.dom-collections.iterator.js"); - -/* -* Copyright (C) 2019 Intel Corporation -* SPDX-License-Identifier: MIT -*/ - -/* global - require:true -*/ -// require("./decode_video") -const BlockType = Object.freeze({ - TSVIDEO: 'tsvideo', - ARCHIVE: 'archive' -}); - -class FrameProvider { - constructor(memory, blockType, blockSize) { - this._frames = {}; - this._memory = Math.max(1, memory); // number of stored blocks - - this._blocks_ranges = []; - this._blocks = {}; - this._blockSize = blockSize; - this._running = false; - this._blockType = blockType; - this._currFrame = -1; - this._width = null; - this._height = null; - } - /* This method removes extra data from a cache when memory overflow */ - - - _cleanup() { - if (this._blocks_ranges.length > this._memory) { - const shifted = this._blocks_ranges.shift(); // get the oldest block - - - const [start, end] = shifted.split(':').map(el => +el); - delete this._blocks[start / this._blockSize]; // remove all frames within this block - - for (let i = start; i <= end; i++) { - delete this._frames[i]; - } - } - } - - setRenderSize(width, height) { - this._width = width; - this._height = height; - } - /* Method returns frame from collection. Else method returns 0 */ - - - frame(frameNumber) { - if (frameNumber in this._frames) { - return this._frames[frameNumber]; - } - - return null; - } - - isNextChunkExists(frameNumber) { - const nextChunkNum = Math.floor(frameNumber / this._blockSize) + 1; - - if (this._blocks[nextChunkNum] === "loading") { - return true; - } else return nextChunkNum in this._blocks; - } - /* - Method start asynchronic decode a block of data - @param block - is a data from a server as is (ts file or archive) - @param start {number} - is the first frame of a block - @param end {number} - is the last frame of a block + 1 - @param callback - callback) - */ - - - setReadyToLoading(chunkNumber) { - this._blocks[chunkNumber] = "loading"; - } - - startDecode(block, start, end, callback) { - if (this._blockType === BlockType.TSVIDEO) { - if (this._running) { - throw new Error('Decoding has already running'); - } - - for (let i = start; i < end; i++) { - this._frames[i] = 'loading'; - } - - this._blocks[Math.floor((start + 1) / this._blockSize)] = block; - - this._blocks_ranges.push(`${start}:${end}`); - - this._cleanup(); - - const worker = new Worker('/static/engine/js/decode_video.js'); - - worker.onerror = function (e) { - console.log(['ERROR: Line ', e.lineno, ' in ', e.filename, ': ', e.message].join('')); - }; - - worker.postMessage({ - block: block, - start: start, - end: end, - width: this._width, - height: this._height - }); - - worker.onmessage = function (event) { - this._frames[event.data.index] = event.data.data; - callback(event.data.index); - }.bind(this); - } else { - const worker = new Worker('/static/engine/js/unzip_imgs.js'); - - worker.onerror = function (e) { - console.log(['ERROR: Line ', e.lineno, ' in ', e.filename, ': ', e.message].join('')); - }; - - worker.postMessage({ - block: block, - start: start, - end: end - }); - - worker.onmessage = function (event) { - this._frames[event.data.index] = event.data.data; - callback(event.data.index); - }.bind(this); - } - } - /* - Method returns a list of cached ranges - Is an array of strings like "start:end" - */ - - - get cachedFrames() { - return [...this._blocks_ranges].sort((a, b) => a.split(':')[0] - b.split(':')[0]); - } - -} - -module.exports = { - FrameProvider, - BlockType -}; - -/***/ }), - -/***/ "./node_modules/axios/index.js": -/*!*************************************!*\ - !*** ./node_modules/axios/index.js ***! - \*************************************/ -/*! no static exports found */ -/***/ (function(module, exports, __webpack_require__) { - -module.exports = __webpack_require__(/*! ./lib/axios */ "./node_modules/axios/lib/axios.js"); - -/***/ }), - -/***/ "./node_modules/axios/lib/adapters/xhr.js": -/*!************************************************!*\ - !*** ./node_modules/axios/lib/adapters/xhr.js ***! - \************************************************/ -/*! no static exports found */ -/***/ (function(module, exports, __webpack_require__) { - -"use strict"; - - -var utils = __webpack_require__(/*! ./../utils */ "./node_modules/axios/lib/utils.js"); -var settle = __webpack_require__(/*! ./../core/settle */ "./node_modules/axios/lib/core/settle.js"); -var buildURL = __webpack_require__(/*! ./../helpers/buildURL */ "./node_modules/axios/lib/helpers/buildURL.js"); -var parseHeaders = __webpack_require__(/*! ./../helpers/parseHeaders */ "./node_modules/axios/lib/helpers/parseHeaders.js"); -var isURLSameOrigin = __webpack_require__(/*! ./../helpers/isURLSameOrigin */ "./node_modules/axios/lib/helpers/isURLSameOrigin.js"); -var createError = __webpack_require__(/*! ../core/createError */ "./node_modules/axios/lib/core/createError.js"); - -module.exports = function xhrAdapter(config) { - return new Promise(function dispatchXhrRequest(resolve, reject) { - var requestData = config.data; - var requestHeaders = config.headers; - - if (utils.isFormData(requestData)) { - delete requestHeaders['Content-Type']; // Let the browser set it - } - - var request = new XMLHttpRequest(); - - // HTTP basic authentication - if (config.auth) { - var username = config.auth.username || ''; - var password = config.auth.password || ''; - requestHeaders.Authorization = 'Basic ' + btoa(username + ':' + password); - } - - request.open(config.method.toUpperCase(), buildURL(config.url, config.params, config.paramsSerializer), true); - - // Set the request timeout in MS - request.timeout = config.timeout; - - // Listen for ready state - request.onreadystatechange = function handleLoad() { - if (!request || request.readyState !== 4) { - return; - } - - // The request errored out and we didn't get a response, this will be - // handled by onerror instead - // With one exception: request that using file: protocol, most browsers - // will return status as 0 even though it's a successful request - if (request.status === 0 && !(request.responseURL && request.responseURL.indexOf('file:') === 0)) { - return; - } - - // Prepare the response - var responseHeaders = 'getAllResponseHeaders' in request ? parseHeaders(request.getAllResponseHeaders()) : null; - var responseData = !config.responseType || config.responseType === 'text' ? request.responseText : request.response; - var response = { - data: responseData, - status: request.status, - statusText: request.statusText, - headers: responseHeaders, - config: config, - request: request - }; - - settle(resolve, reject, response); - - // Clean up request - request = null; - }; - - // Handle low level network errors - request.onerror = function handleError() { - // Real errors are hidden from us by the browser - // onerror should only fire if it's a network error - reject(createError('Network Error', config, null, request)); - - // Clean up request - request = null; - }; - - // Handle timeout - request.ontimeout = function handleTimeout() { - reject(createError('timeout of ' + config.timeout + 'ms exceeded', config, 'ECONNABORTED', - request)); - - // Clean up request - request = null; - }; - - // Add xsrf header - // This is only done if running in a standard browser environment. - // Specifically not if we're in a web worker, or react-native. - if (utils.isStandardBrowserEnv()) { - var cookies = __webpack_require__(/*! ./../helpers/cookies */ "./node_modules/axios/lib/helpers/cookies.js"); - - // Add xsrf header - var xsrfValue = (config.withCredentials || isURLSameOrigin(config.url)) && config.xsrfCookieName ? - cookies.read(config.xsrfCookieName) : - undefined; - - if (xsrfValue) { - requestHeaders[config.xsrfHeaderName] = xsrfValue; - } - } - - // Add headers to the request - if ('setRequestHeader' in request) { - utils.forEach(requestHeaders, function setRequestHeader(val, key) { - if (typeof requestData === 'undefined' && key.toLowerCase() === 'content-type') { - // Remove Content-Type if data is undefined - delete requestHeaders[key]; - } else { - // Otherwise add header to the request - request.setRequestHeader(key, val); - } - }); - } - - // Add withCredentials to request if needed - if (config.withCredentials) { - request.withCredentials = true; - } - - // Add responseType to request if needed - if (config.responseType) { - try { - request.responseType = config.responseType; - } catch (e) { - // Expected DOMException thrown by browsers not compatible XMLHttpRequest Level 2. - // But, this can be suppressed for 'json' type as it can be parsed by default 'transformResponse' function. - if (config.responseType !== 'json') { - throw e; - } - } - } - - // Handle progress if needed - if (typeof config.onDownloadProgress === 'function') { - request.addEventListener('progress', config.onDownloadProgress); - } - - // Not all browsers support upload events - if (typeof config.onUploadProgress === 'function' && request.upload) { - request.upload.addEventListener('progress', config.onUploadProgress); - } - - if (config.cancelToken) { - // Handle cancellation - config.cancelToken.promise.then(function onCanceled(cancel) { - if (!request) { - return; - } - - request.abort(); - reject(cancel); - // Clean up request - request = null; - }); - } - - if (requestData === undefined) { - requestData = null; - } - - // Send the request - request.send(requestData); - }); -}; - - -/***/ }), - -/***/ "./node_modules/axios/lib/axios.js": -/*!*****************************************!*\ - !*** ./node_modules/axios/lib/axios.js ***! - \*****************************************/ -/*! no static exports found */ -/***/ (function(module, exports, __webpack_require__) { - -"use strict"; - - -var utils = __webpack_require__(/*! ./utils */ "./node_modules/axios/lib/utils.js"); -var bind = __webpack_require__(/*! ./helpers/bind */ "./node_modules/axios/lib/helpers/bind.js"); -var Axios = __webpack_require__(/*! ./core/Axios */ "./node_modules/axios/lib/core/Axios.js"); -var defaults = __webpack_require__(/*! ./defaults */ "./node_modules/axios/lib/defaults.js"); - -/** - * Create an instance of Axios - * - * @param {Object} defaultConfig The default config for the instance - * @return {Axios} A new instance of Axios - */ -function createInstance(defaultConfig) { - var context = new Axios(defaultConfig); - var instance = bind(Axios.prototype.request, context); - - // Copy axios.prototype to instance - utils.extend(instance, Axios.prototype, context); - - // Copy context to instance - utils.extend(instance, context); - - return instance; -} - -// Create the default instance to be exported -var axios = createInstance(defaults); - -// Expose Axios class to allow class inheritance -axios.Axios = Axios; - -// Factory for creating new instances -axios.create = function create(instanceConfig) { - return createInstance(utils.merge(defaults, instanceConfig)); -}; - -// Expose Cancel & CancelToken -axios.Cancel = __webpack_require__(/*! ./cancel/Cancel */ "./node_modules/axios/lib/cancel/Cancel.js"); -axios.CancelToken = __webpack_require__(/*! ./cancel/CancelToken */ "./node_modules/axios/lib/cancel/CancelToken.js"); -axios.isCancel = __webpack_require__(/*! ./cancel/isCancel */ "./node_modules/axios/lib/cancel/isCancel.js"); - -// Expose all/spread -axios.all = function all(promises) { - return Promise.all(promises); -}; -axios.spread = __webpack_require__(/*! ./helpers/spread */ "./node_modules/axios/lib/helpers/spread.js"); - -module.exports = axios; - -// Allow use of default import syntax in TypeScript -module.exports.default = axios; - - -/***/ }), - -/***/ "./node_modules/axios/lib/cancel/Cancel.js": -/*!*************************************************!*\ - !*** ./node_modules/axios/lib/cancel/Cancel.js ***! - \*************************************************/ -/*! no static exports found */ -/***/ (function(module, exports, __webpack_require__) { - -"use strict"; - - -/** - * A `Cancel` is an object that is thrown when an operation is canceled. - * - * @class - * @param {string=} message The message. - */ -function Cancel(message) { - this.message = message; -} - -Cancel.prototype.toString = function toString() { - return 'Cancel' + (this.message ? ': ' + this.message : ''); -}; - -Cancel.prototype.__CANCEL__ = true; - -module.exports = Cancel; - - -/***/ }), - -/***/ "./node_modules/axios/lib/cancel/CancelToken.js": -/*!******************************************************!*\ - !*** ./node_modules/axios/lib/cancel/CancelToken.js ***! - \******************************************************/ -/*! no static exports found */ -/***/ (function(module, exports, __webpack_require__) { - -"use strict"; - - -var Cancel = __webpack_require__(/*! ./Cancel */ "./node_modules/axios/lib/cancel/Cancel.js"); - -/** - * A `CancelToken` is an object that can be used to request cancellation of an operation. - * - * @class - * @param {Function} executor The executor function. - */ -function CancelToken(executor) { - if (typeof executor !== 'function') { - throw new TypeError('executor must be a function.'); - } - - var resolvePromise; - this.promise = new Promise(function promiseExecutor(resolve) { - resolvePromise = resolve; - }); - - var token = this; - executor(function cancel(message) { - if (token.reason) { - // Cancellation has already been requested - return; - } - - token.reason = new Cancel(message); - resolvePromise(token.reason); - }); -} - -/** - * Throws a `Cancel` if cancellation has been requested. - */ -CancelToken.prototype.throwIfRequested = function throwIfRequested() { - if (this.reason) { - throw this.reason; - } -}; - -/** - * Returns an object that contains a new `CancelToken` and a function that, when called, - * cancels the `CancelToken`. - */ -CancelToken.source = function source() { - var cancel; - var token = new CancelToken(function executor(c) { - cancel = c; - }); - return { - token: token, - cancel: cancel - }; -}; - -module.exports = CancelToken; - - -/***/ }), - -/***/ "./node_modules/axios/lib/cancel/isCancel.js": -/*!***************************************************!*\ - !*** ./node_modules/axios/lib/cancel/isCancel.js ***! - \***************************************************/ -/*! no static exports found */ -/***/ (function(module, exports, __webpack_require__) { - -"use strict"; - - -module.exports = function isCancel(value) { - return !!(value && value.__CANCEL__); -}; - - -/***/ }), - -/***/ "./node_modules/axios/lib/core/Axios.js": -/*!**********************************************!*\ - !*** ./node_modules/axios/lib/core/Axios.js ***! - \**********************************************/ -/*! no static exports found */ -/***/ (function(module, exports, __webpack_require__) { - -"use strict"; - - -var defaults = __webpack_require__(/*! ./../defaults */ "./node_modules/axios/lib/defaults.js"); -var utils = __webpack_require__(/*! ./../utils */ "./node_modules/axios/lib/utils.js"); -var InterceptorManager = __webpack_require__(/*! ./InterceptorManager */ "./node_modules/axios/lib/core/InterceptorManager.js"); -var dispatchRequest = __webpack_require__(/*! ./dispatchRequest */ "./node_modules/axios/lib/core/dispatchRequest.js"); - -/** - * Create a new instance of Axios - * - * @param {Object} instanceConfig The default config for the instance - */ -function Axios(instanceConfig) { - this.defaults = instanceConfig; - this.interceptors = { - request: new InterceptorManager(), - response: new InterceptorManager() - }; -} - -/** - * Dispatch a request - * - * @param {Object} config The config specific for this request (merged with this.defaults) - */ -Axios.prototype.request = function request(config) { - /*eslint no-param-reassign:0*/ - // Allow for axios('example/url'[, config]) a la fetch API - if (typeof config === 'string') { - config = utils.merge({ - url: arguments[0] - }, arguments[1]); - } - - config = utils.merge(defaults, {method: 'get'}, this.defaults, config); - config.method = config.method.toLowerCase(); - - // Hook up interceptors middleware - var chain = [dispatchRequest, undefined]; - var promise = Promise.resolve(config); - - this.interceptors.request.forEach(function unshiftRequestInterceptors(interceptor) { - chain.unshift(interceptor.fulfilled, interceptor.rejected); - }); - - this.interceptors.response.forEach(function pushResponseInterceptors(interceptor) { - chain.push(interceptor.fulfilled, interceptor.rejected); - }); - - while (chain.length) { - promise = promise.then(chain.shift(), chain.shift()); - } - - return promise; -}; - -// Provide aliases for supported request methods -utils.forEach(['delete', 'get', 'head', 'options'], function forEachMethodNoData(method) { - /*eslint func-names:0*/ - Axios.prototype[method] = function(url, config) { - return this.request(utils.merge(config || {}, { - method: method, - url: url - })); - }; -}); - -utils.forEach(['post', 'put', 'patch'], function forEachMethodWithData(method) { - /*eslint func-names:0*/ - Axios.prototype[method] = function(url, data, config) { - return this.request(utils.merge(config || {}, { - method: method, - url: url, - data: data - })); - }; -}); - -module.exports = Axios; - - -/***/ }), - -/***/ "./node_modules/axios/lib/core/InterceptorManager.js": -/*!***********************************************************!*\ - !*** ./node_modules/axios/lib/core/InterceptorManager.js ***! - \***********************************************************/ -/*! no static exports found */ -/***/ (function(module, exports, __webpack_require__) { - -"use strict"; - - -var utils = __webpack_require__(/*! ./../utils */ "./node_modules/axios/lib/utils.js"); - -function InterceptorManager() { - this.handlers = []; -} - -/** - * Add a new interceptor to the stack - * - * @param {Function} fulfilled The function to handle `then` for a `Promise` - * @param {Function} rejected The function to handle `reject` for a `Promise` - * - * @return {Number} An ID used to remove interceptor later - */ -InterceptorManager.prototype.use = function use(fulfilled, rejected) { - this.handlers.push({ - fulfilled: fulfilled, - rejected: rejected - }); - return this.handlers.length - 1; -}; - -/** - * Remove an interceptor from the stack - * - * @param {Number} id The ID that was returned by `use` - */ -InterceptorManager.prototype.eject = function eject(id) { - if (this.handlers[id]) { - this.handlers[id] = null; - } -}; - -/** - * Iterate over all the registered interceptors - * - * This method is particularly useful for skipping over any - * interceptors that may have become `null` calling `eject`. - * - * @param {Function} fn The function to call for each interceptor - */ -InterceptorManager.prototype.forEach = function forEach(fn) { - utils.forEach(this.handlers, function forEachHandler(h) { - if (h !== null) { - fn(h); - } - }); -}; - -module.exports = InterceptorManager; - - -/***/ }), - -/***/ "./node_modules/axios/lib/core/createError.js": -/*!****************************************************!*\ - !*** ./node_modules/axios/lib/core/createError.js ***! - \****************************************************/ -/*! no static exports found */ -/***/ (function(module, exports, __webpack_require__) { - -"use strict"; - - -var enhanceError = __webpack_require__(/*! ./enhanceError */ "./node_modules/axios/lib/core/enhanceError.js"); - -/** - * Create an Error with the specified message, config, error code, request and response. - * - * @param {string} message The error message. - * @param {Object} config The config. - * @param {string} [code] The error code (for example, 'ECONNABORTED'). - * @param {Object} [request] The request. - * @param {Object} [response] The response. - * @returns {Error} The created error. - */ -module.exports = function createError(message, config, code, request, response) { - var error = new Error(message); - return enhanceError(error, config, code, request, response); -}; - - -/***/ }), - -/***/ "./node_modules/axios/lib/core/dispatchRequest.js": -/*!********************************************************!*\ - !*** ./node_modules/axios/lib/core/dispatchRequest.js ***! - \********************************************************/ -/*! no static exports found */ -/***/ (function(module, exports, __webpack_require__) { - -"use strict"; - - -var utils = __webpack_require__(/*! ./../utils */ "./node_modules/axios/lib/utils.js"); -var transformData = __webpack_require__(/*! ./transformData */ "./node_modules/axios/lib/core/transformData.js"); -var isCancel = __webpack_require__(/*! ../cancel/isCancel */ "./node_modules/axios/lib/cancel/isCancel.js"); -var defaults = __webpack_require__(/*! ../defaults */ "./node_modules/axios/lib/defaults.js"); -var isAbsoluteURL = __webpack_require__(/*! ./../helpers/isAbsoluteURL */ "./node_modules/axios/lib/helpers/isAbsoluteURL.js"); -var combineURLs = __webpack_require__(/*! ./../helpers/combineURLs */ "./node_modules/axios/lib/helpers/combineURLs.js"); - -/** - * Throws a `Cancel` if cancellation has been requested. - */ -function throwIfCancellationRequested(config) { - if (config.cancelToken) { - config.cancelToken.throwIfRequested(); - } -} - -/** - * Dispatch a request to the server using the configured adapter. - * - * @param {object} config The config that is to be used for the request - * @returns {Promise} The Promise to be fulfilled - */ -module.exports = function dispatchRequest(config) { - throwIfCancellationRequested(config); - - // Support baseURL config - if (config.baseURL && !isAbsoluteURL(config.url)) { - config.url = combineURLs(config.baseURL, config.url); - } - - // Ensure headers exist - config.headers = config.headers || {}; - - // Transform request data - config.data = transformData( - config.data, - config.headers, - config.transformRequest - ); - - // Flatten headers - config.headers = utils.merge( - config.headers.common || {}, - config.headers[config.method] || {}, - config.headers || {} - ); - - utils.forEach( - ['delete', 'get', 'head', 'post', 'put', 'patch', 'common'], - function cleanHeaderConfig(method) { - delete config.headers[method]; - } - ); - - var adapter = config.adapter || defaults.adapter; - - return adapter(config).then(function onAdapterResolution(response) { - throwIfCancellationRequested(config); - - // Transform response data - response.data = transformData( - response.data, - response.headers, - config.transformResponse - ); - - return response; - }, function onAdapterRejection(reason) { - if (!isCancel(reason)) { - throwIfCancellationRequested(config); - - // Transform response data - if (reason && reason.response) { - reason.response.data = transformData( - reason.response.data, - reason.response.headers, - config.transformResponse - ); - } - } - - return Promise.reject(reason); - }); -}; - - -/***/ }), - -/***/ "./node_modules/axios/lib/core/enhanceError.js": -/*!*****************************************************!*\ - !*** ./node_modules/axios/lib/core/enhanceError.js ***! - \*****************************************************/ -/*! no static exports found */ -/***/ (function(module, exports, __webpack_require__) { - -"use strict"; - - -/** - * Update an Error with the specified config, error code, and response. - * - * @param {Error} error The error to update. - * @param {Object} config The config. - * @param {string} [code] The error code (for example, 'ECONNABORTED'). - * @param {Object} [request] The request. - * @param {Object} [response] The response. - * @returns {Error} The error. - */ -module.exports = function enhanceError(error, config, code, request, response) { - error.config = config; - if (code) { - error.code = code; - } - error.request = request; - error.response = response; - return error; -}; - - -/***/ }), - -/***/ "./node_modules/axios/lib/core/settle.js": -/*!***********************************************!*\ - !*** ./node_modules/axios/lib/core/settle.js ***! - \***********************************************/ -/*! no static exports found */ -/***/ (function(module, exports, __webpack_require__) { - -"use strict"; - - -var createError = __webpack_require__(/*! ./createError */ "./node_modules/axios/lib/core/createError.js"); - -/** - * Resolve or reject a Promise based on response status. - * - * @param {Function} resolve A function that resolves the promise. - * @param {Function} reject A function that rejects the promise. - * @param {object} response The response. - */ -module.exports = function settle(resolve, reject, response) { - var validateStatus = response.config.validateStatus; - // Note: status is not exposed by XDomainRequest - if (!response.status || !validateStatus || validateStatus(response.status)) { - resolve(response); - } else { - reject(createError( - 'Request failed with status code ' + response.status, - response.config, - null, - response.request, - response - )); - } -}; - - -/***/ }), - -/***/ "./node_modules/axios/lib/core/transformData.js": -/*!******************************************************!*\ - !*** ./node_modules/axios/lib/core/transformData.js ***! - \******************************************************/ -/*! no static exports found */ -/***/ (function(module, exports, __webpack_require__) { - -"use strict"; - - -var utils = __webpack_require__(/*! ./../utils */ "./node_modules/axios/lib/utils.js"); - -/** - * Transform the data for a request or a response - * - * @param {Object|String} data The data to be transformed - * @param {Array} headers The headers for the request or response - * @param {Array|Function} fns A single function or Array of functions - * @returns {*} The resulting transformed data - */ -module.exports = function transformData(data, headers, fns) { - /*eslint no-param-reassign:0*/ - utils.forEach(fns, function transform(fn) { - data = fn(data, headers); - }); - - return data; -}; - - -/***/ }), - -/***/ "./node_modules/axios/lib/defaults.js": -/*!********************************************!*\ - !*** ./node_modules/axios/lib/defaults.js ***! - \********************************************/ -/*! no static exports found */ -/***/ (function(module, exports, __webpack_require__) { - -"use strict"; -/* WEBPACK VAR INJECTION */(function(process) { - -var utils = __webpack_require__(/*! ./utils */ "./node_modules/axios/lib/utils.js"); -var normalizeHeaderName = __webpack_require__(/*! ./helpers/normalizeHeaderName */ "./node_modules/axios/lib/helpers/normalizeHeaderName.js"); - -var DEFAULT_CONTENT_TYPE = { - 'Content-Type': 'application/x-www-form-urlencoded' -}; - -function setContentTypeIfUnset(headers, value) { - if (!utils.isUndefined(headers) && utils.isUndefined(headers['Content-Type'])) { - headers['Content-Type'] = value; - } -} - -function getDefaultAdapter() { - var adapter; - if (typeof XMLHttpRequest !== 'undefined') { - // For browsers use XHR adapter - adapter = __webpack_require__(/*! ./adapters/xhr */ "./node_modules/axios/lib/adapters/xhr.js"); - } else if (typeof process !== 'undefined') { - // For node use HTTP adapter - adapter = __webpack_require__(/*! ./adapters/http */ "./node_modules/axios/lib/adapters/xhr.js"); - } - return adapter; -} - -var defaults = { - adapter: getDefaultAdapter(), - - transformRequest: [function transformRequest(data, headers) { - normalizeHeaderName(headers, 'Content-Type'); - if (utils.isFormData(data) || - utils.isArrayBuffer(data) || - utils.isBuffer(data) || - utils.isStream(data) || - utils.isFile(data) || - utils.isBlob(data) - ) { - return data; - } - if (utils.isArrayBufferView(data)) { - return data.buffer; - } - if (utils.isURLSearchParams(data)) { - setContentTypeIfUnset(headers, 'application/x-www-form-urlencoded;charset=utf-8'); - return data.toString(); - } - if (utils.isObject(data)) { - setContentTypeIfUnset(headers, 'application/json;charset=utf-8'); - return JSON.stringify(data); - } - return data; - }], - - transformResponse: [function transformResponse(data) { - /*eslint no-param-reassign:0*/ - if (typeof data === 'string') { - try { - data = JSON.parse(data); - } catch (e) { /* Ignore */ } - } - return data; - }], - - /** - * A timeout in milliseconds to abort a request. If set to 0 (default) a - * timeout is not created. - */ - timeout: 0, - - xsrfCookieName: 'XSRF-TOKEN', - xsrfHeaderName: 'X-XSRF-TOKEN', - - maxContentLength: -1, - - validateStatus: function validateStatus(status) { - return status >= 200 && status < 300; - } -}; - -defaults.headers = { - common: { - 'Accept': 'application/json, text/plain, */*' - } -}; - -utils.forEach(['delete', 'get', 'head'], function forEachMethodNoData(method) { - defaults.headers[method] = {}; -}); - -utils.forEach(['post', 'put', 'patch'], function forEachMethodWithData(method) { - defaults.headers[method] = utils.merge(DEFAULT_CONTENT_TYPE); -}); - -module.exports = defaults; - -/* WEBPACK VAR INJECTION */}.call(this, __webpack_require__(/*! ./../../process/browser.js */ "./node_modules/process/browser.js"))) - -/***/ }), - -/***/ "./node_modules/axios/lib/helpers/bind.js": -/*!************************************************!*\ - !*** ./node_modules/axios/lib/helpers/bind.js ***! - \************************************************/ -/*! no static exports found */ -/***/ (function(module, exports, __webpack_require__) { - -"use strict"; - - -module.exports = function bind(fn, thisArg) { - return function wrap() { - var args = new Array(arguments.length); - for (var i = 0; i < args.length; i++) { - args[i] = arguments[i]; - } - return fn.apply(thisArg, args); - }; -}; - - -/***/ }), - -/***/ "./node_modules/axios/lib/helpers/buildURL.js": -/*!****************************************************!*\ - !*** ./node_modules/axios/lib/helpers/buildURL.js ***! - \****************************************************/ -/*! no static exports found */ -/***/ (function(module, exports, __webpack_require__) { - -"use strict"; - - -var utils = __webpack_require__(/*! ./../utils */ "./node_modules/axios/lib/utils.js"); - -function encode(val) { - return encodeURIComponent(val). - replace(/%40/gi, '@'). - replace(/%3A/gi, ':'). - replace(/%24/g, '$'). - replace(/%2C/gi, ','). - replace(/%20/g, '+'). - replace(/%5B/gi, '['). - replace(/%5D/gi, ']'); -} - -/** - * Build a URL by appending params to the end - * - * @param {string} url The base of the url (e.g., http://www.google.com) - * @param {object} [params] The params to be appended - * @returns {string} The formatted url - */ -module.exports = function buildURL(url, params, paramsSerializer) { - /*eslint no-param-reassign:0*/ - if (!params) { - return url; - } - - var serializedParams; - if (paramsSerializer) { - serializedParams = paramsSerializer(params); - } else if (utils.isURLSearchParams(params)) { - serializedParams = params.toString(); - } else { - var parts = []; - - utils.forEach(params, function serialize(val, key) { - if (val === null || typeof val === 'undefined') { - return; - } - - if (utils.isArray(val)) { - key = key + '[]'; - } else { - val = [val]; - } - - utils.forEach(val, function parseValue(v) { - if (utils.isDate(v)) { - v = v.toISOString(); - } else if (utils.isObject(v)) { - v = JSON.stringify(v); - } - parts.push(encode(key) + '=' + encode(v)); - }); - }); - - serializedParams = parts.join('&'); - } - - if (serializedParams) { - url += (url.indexOf('?') === -1 ? '?' : '&') + serializedParams; - } - - return url; -}; - - -/***/ }), - -/***/ "./node_modules/axios/lib/helpers/combineURLs.js": -/*!*******************************************************!*\ - !*** ./node_modules/axios/lib/helpers/combineURLs.js ***! - \*******************************************************/ -/*! no static exports found */ -/***/ (function(module, exports, __webpack_require__) { - -"use strict"; - - -/** - * Creates a new URL by combining the specified URLs - * - * @param {string} baseURL The base URL - * @param {string} relativeURL The relative URL - * @returns {string} The combined URL - */ -module.exports = function combineURLs(baseURL, relativeURL) { - return relativeURL - ? baseURL.replace(/\/+$/, '') + '/' + relativeURL.replace(/^\/+/, '') - : baseURL; -}; - - -/***/ }), - -/***/ "./node_modules/axios/lib/helpers/cookies.js": -/*!***************************************************!*\ - !*** ./node_modules/axios/lib/helpers/cookies.js ***! - \***************************************************/ -/*! no static exports found */ -/***/ (function(module, exports, __webpack_require__) { - -"use strict"; - - -var utils = __webpack_require__(/*! ./../utils */ "./node_modules/axios/lib/utils.js"); - -module.exports = ( - utils.isStandardBrowserEnv() ? - - // Standard browser envs support document.cookie - (function standardBrowserEnv() { - return { - write: function write(name, value, expires, path, domain, secure) { - var cookie = []; - cookie.push(name + '=' + encodeURIComponent(value)); - - if (utils.isNumber(expires)) { - cookie.push('expires=' + new Date(expires).toGMTString()); - } - - if (utils.isString(path)) { - cookie.push('path=' + path); - } - - if (utils.isString(domain)) { - cookie.push('domain=' + domain); - } - - if (secure === true) { - cookie.push('secure'); - } - - document.cookie = cookie.join('; '); - }, - - read: function read(name) { - var match = document.cookie.match(new RegExp('(^|;\\s*)(' + name + ')=([^;]*)')); - return (match ? decodeURIComponent(match[3]) : null); - }, - - remove: function remove(name) { - this.write(name, '', Date.now() - 86400000); - } - }; - })() : - - // Non standard browser env (web workers, react-native) lack needed support. - (function nonStandardBrowserEnv() { - return { - write: function write() {}, - read: function read() { return null; }, - remove: function remove() {} - }; - })() -); - - -/***/ }), - -/***/ "./node_modules/axios/lib/helpers/isAbsoluteURL.js": -/*!*********************************************************!*\ - !*** ./node_modules/axios/lib/helpers/isAbsoluteURL.js ***! - \*********************************************************/ -/*! no static exports found */ -/***/ (function(module, exports, __webpack_require__) { - -"use strict"; - - -/** - * Determines whether the specified URL is absolute - * - * @param {string} url The URL to test - * @returns {boolean} True if the specified URL is absolute, otherwise false - */ -module.exports = function isAbsoluteURL(url) { - // A URL is considered absolute if it begins with "://" or "//" (protocol-relative URL). - // RFC 3986 defines scheme name as a sequence of characters beginning with a letter and followed - // by any combination of letters, digits, plus, period, or hyphen. - return /^([a-z][a-z\d\+\-\.]*:)?\/\//i.test(url); -}; - - -/***/ }), - -/***/ "./node_modules/axios/lib/helpers/isURLSameOrigin.js": -/*!***********************************************************!*\ - !*** ./node_modules/axios/lib/helpers/isURLSameOrigin.js ***! - \***********************************************************/ -/*! no static exports found */ -/***/ (function(module, exports, __webpack_require__) { - -"use strict"; - - -var utils = __webpack_require__(/*! ./../utils */ "./node_modules/axios/lib/utils.js"); - -module.exports = ( - utils.isStandardBrowserEnv() ? - - // Standard browser envs have full support of the APIs needed to test - // whether the request URL is of the same origin as current location. - (function standardBrowserEnv() { - var msie = /(msie|trident)/i.test(navigator.userAgent); - var urlParsingNode = document.createElement('a'); - var originURL; - - /** - * Parse a URL to discover it's components - * - * @param {String} url The URL to be parsed - * @returns {Object} - */ - function resolveURL(url) { - var href = url; - - if (msie) { - // IE needs attribute set twice to normalize properties - urlParsingNode.setAttribute('href', href); - href = urlParsingNode.href; - } - - urlParsingNode.setAttribute('href', href); - - // urlParsingNode provides the UrlUtils interface - http://url.spec.whatwg.org/#urlutils - return { - href: urlParsingNode.href, - protocol: urlParsingNode.protocol ? urlParsingNode.protocol.replace(/:$/, '') : '', - host: urlParsingNode.host, - search: urlParsingNode.search ? urlParsingNode.search.replace(/^\?/, '') : '', - hash: urlParsingNode.hash ? urlParsingNode.hash.replace(/^#/, '') : '', - hostname: urlParsingNode.hostname, - port: urlParsingNode.port, - pathname: (urlParsingNode.pathname.charAt(0) === '/') ? - urlParsingNode.pathname : - '/' + urlParsingNode.pathname - }; - } - - originURL = resolveURL(window.location.href); - - /** - * Determine if a URL shares the same origin as the current location - * - * @param {String} requestURL The URL to test - * @returns {boolean} True if URL shares the same origin, otherwise false - */ - return function isURLSameOrigin(requestURL) { - var parsed = (utils.isString(requestURL)) ? resolveURL(requestURL) : requestURL; - return (parsed.protocol === originURL.protocol && - parsed.host === originURL.host); - }; - })() : - - // Non standard browser envs (web workers, react-native) lack needed support. - (function nonStandardBrowserEnv() { - return function isURLSameOrigin() { - return true; - }; - })() -); - - -/***/ }), - -/***/ "./node_modules/axios/lib/helpers/normalizeHeaderName.js": -/*!***************************************************************!*\ - !*** ./node_modules/axios/lib/helpers/normalizeHeaderName.js ***! - \***************************************************************/ -/*! no static exports found */ -/***/ (function(module, exports, __webpack_require__) { - -"use strict"; - - -var utils = __webpack_require__(/*! ../utils */ "./node_modules/axios/lib/utils.js"); - -module.exports = function normalizeHeaderName(headers, normalizedName) { - utils.forEach(headers, function processHeader(value, name) { - if (name !== normalizedName && name.toUpperCase() === normalizedName.toUpperCase()) { - headers[normalizedName] = value; - delete headers[name]; - } - }); -}; - - -/***/ }), - -/***/ "./node_modules/axios/lib/helpers/parseHeaders.js": -/*!********************************************************!*\ - !*** ./node_modules/axios/lib/helpers/parseHeaders.js ***! - \********************************************************/ -/*! no static exports found */ -/***/ (function(module, exports, __webpack_require__) { - -"use strict"; - - -var utils = __webpack_require__(/*! ./../utils */ "./node_modules/axios/lib/utils.js"); - -// Headers whose duplicates are ignored by node -// c.f. https://nodejs.org/api/http.html#http_message_headers -var ignoreDuplicateOf = [ - 'age', 'authorization', 'content-length', 'content-type', 'etag', - 'expires', 'from', 'host', 'if-modified-since', 'if-unmodified-since', - 'last-modified', 'location', 'max-forwards', 'proxy-authorization', - 'referer', 'retry-after', 'user-agent' -]; - -/** - * Parse headers into an object - * - * ``` - * Date: Wed, 27 Aug 2014 08:58:49 GMT - * Content-Type: application/json - * Connection: keep-alive - * Transfer-Encoding: chunked - * ``` - * - * @param {String} headers Headers needing to be parsed - * @returns {Object} Headers parsed into an object - */ -module.exports = function parseHeaders(headers) { - var parsed = {}; - var key; - var val; - var i; - - if (!headers) { return parsed; } - - utils.forEach(headers.split('\n'), function parser(line) { - i = line.indexOf(':'); - key = utils.trim(line.substr(0, i)).toLowerCase(); - val = utils.trim(line.substr(i + 1)); - - if (key) { - if (parsed[key] && ignoreDuplicateOf.indexOf(key) >= 0) { - return; - } - if (key === 'set-cookie') { - parsed[key] = (parsed[key] ? parsed[key] : []).concat([val]); - } else { - parsed[key] = parsed[key] ? parsed[key] + ', ' + val : val; - } - } - }); - - return parsed; -}; - - -/***/ }), - -/***/ "./node_modules/axios/lib/helpers/spread.js": -/*!**************************************************!*\ - !*** ./node_modules/axios/lib/helpers/spread.js ***! - \**************************************************/ -/*! no static exports found */ -/***/ (function(module, exports, __webpack_require__) { - -"use strict"; - - -/** - * Syntactic sugar for invoking a function and expanding an array for arguments. - * - * Common use case would be to use `Function.prototype.apply`. - * - * ```js - * function f(x, y, z) {} - * var args = [1, 2, 3]; - * f.apply(null, args); - * ``` - * - * With `spread` this example can be re-written. - * - * ```js - * spread(function(x, y, z) {})([1, 2, 3]); - * ``` - * - * @param {Function} callback - * @returns {Function} - */ -module.exports = function spread(callback) { - return function wrap(arr) { - return callback.apply(null, arr); - }; -}; - - -/***/ }), - -/***/ "./node_modules/axios/lib/utils.js": -/*!*****************************************!*\ - !*** ./node_modules/axios/lib/utils.js ***! - \*****************************************/ -/*! no static exports found */ -/***/ (function(module, exports, __webpack_require__) { - -"use strict"; - - -var bind = __webpack_require__(/*! ./helpers/bind */ "./node_modules/axios/lib/helpers/bind.js"); -var isBuffer = __webpack_require__(/*! is-buffer */ "./node_modules/is-buffer/index.js"); - -/*global toString:true*/ - -// utils is a library of generic helper functions non-specific to axios - -var toString = Object.prototype.toString; - -/** - * Determine if a value is an Array - * - * @param {Object} val The value to test - * @returns {boolean} True if value is an Array, otherwise false - */ -function isArray(val) { - return toString.call(val) === '[object Array]'; -} - -/** - * Determine if a value is an ArrayBuffer - * - * @param {Object} val The value to test - * @returns {boolean} True if value is an ArrayBuffer, otherwise false - */ -function isArrayBuffer(val) { - return toString.call(val) === '[object ArrayBuffer]'; -} - -/** - * Determine if a value is a FormData - * - * @param {Object} val The value to test - * @returns {boolean} True if value is an FormData, otherwise false - */ -function isFormData(val) { - return (typeof FormData !== 'undefined') && (val instanceof FormData); -} - -/** - * Determine if a value is a view on an ArrayBuffer - * - * @param {Object} val The value to test - * @returns {boolean} True if value is a view on an ArrayBuffer, otherwise false - */ -function isArrayBufferView(val) { - var result; - if ((typeof ArrayBuffer !== 'undefined') && (ArrayBuffer.isView)) { - result = ArrayBuffer.isView(val); - } else { - result = (val) && (val.buffer) && (val.buffer instanceof ArrayBuffer); - } - return result; -} - -/** - * Determine if a value is a String - * - * @param {Object} val The value to test - * @returns {boolean} True if value is a String, otherwise false - */ -function isString(val) { - return typeof val === 'string'; -} - -/** - * Determine if a value is a Number - * - * @param {Object} val The value to test - * @returns {boolean} True if value is a Number, otherwise false - */ -function isNumber(val) { - return typeof val === 'number'; -} - -/** - * Determine if a value is undefined - * - * @param {Object} val The value to test - * @returns {boolean} True if the value is undefined, otherwise false - */ -function isUndefined(val) { - return typeof val === 'undefined'; -} - -/** - * Determine if a value is an Object - * - * @param {Object} val The value to test - * @returns {boolean} True if value is an Object, otherwise false - */ -function isObject(val) { - return val !== null && typeof val === 'object'; -} - -/** - * Determine if a value is a Date - * - * @param {Object} val The value to test - * @returns {boolean} True if value is a Date, otherwise false - */ -function isDate(val) { - return toString.call(val) === '[object Date]'; -} - -/** - * Determine if a value is a File - * - * @param {Object} val The value to test - * @returns {boolean} True if value is a File, otherwise false - */ -function isFile(val) { - return toString.call(val) === '[object File]'; -} - -/** - * Determine if a value is a Blob - * - * @param {Object} val The value to test - * @returns {boolean} True if value is a Blob, otherwise false - */ -function isBlob(val) { - return toString.call(val) === '[object Blob]'; -} - -/** - * Determine if a value is a Function - * - * @param {Object} val The value to test - * @returns {boolean} True if value is a Function, otherwise false - */ -function isFunction(val) { - return toString.call(val) === '[object Function]'; -} - -/** - * Determine if a value is a Stream - * - * @param {Object} val The value to test - * @returns {boolean} True if value is a Stream, otherwise false - */ -function isStream(val) { - return isObject(val) && isFunction(val.pipe); -} - -/** - * Determine if a value is a URLSearchParams object - * - * @param {Object} val The value to test - * @returns {boolean} True if value is a URLSearchParams object, otherwise false - */ -function isURLSearchParams(val) { - return typeof URLSearchParams !== 'undefined' && val instanceof URLSearchParams; -} - -/** - * Trim excess whitespace off the beginning and end of a string - * - * @param {String} str The String to trim - * @returns {String} The String freed of excess whitespace - */ -function trim(str) { - return str.replace(/^\s*/, '').replace(/\s*$/, ''); -} - -/** - * Determine if we're running in a standard browser environment - * - * This allows axios to run in a web worker, and react-native. - * Both environments support XMLHttpRequest, but not fully standard globals. - * - * web workers: - * typeof window -> undefined - * typeof document -> undefined - * - * react-native: - * navigator.product -> 'ReactNative' - */ -function isStandardBrowserEnv() { - if (typeof navigator !== 'undefined' && navigator.product === 'ReactNative') { - return false; - } - return ( - typeof window !== 'undefined' && - typeof document !== 'undefined' - ); -} - -/** - * Iterate over an Array or an Object invoking a function for each item. - * - * If `obj` is an Array callback will be called passing - * the value, index, and complete array for each item. - * - * If 'obj' is an Object callback will be called passing - * the value, key, and complete object for each property. - * - * @param {Object|Array} obj The object to iterate - * @param {Function} fn The callback to invoke for each item - */ -function forEach(obj, fn) { - // Don't bother if no value provided - if (obj === null || typeof obj === 'undefined') { - return; - } - - // Force an array if not already something iterable - if (typeof obj !== 'object') { - /*eslint no-param-reassign:0*/ - obj = [obj]; - } - - if (isArray(obj)) { - // Iterate over array values - for (var i = 0, l = obj.length; i < l; i++) { - fn.call(null, obj[i], i, obj); - } - } else { - // Iterate over object keys - for (var key in obj) { - if (Object.prototype.hasOwnProperty.call(obj, key)) { - fn.call(null, obj[key], key, obj); - } - } - } -} - -/** - * Accepts varargs expecting each argument to be an object, then - * immutably merges the properties of each object and returns result. - * - * When multiple objects contain the same key the later object in - * the arguments list will take precedence. - * - * Example: - * - * ```js - * var result = merge({foo: 123}, {foo: 456}); - * console.log(result.foo); // outputs 456 - * ``` - * - * @param {Object} obj1 Object to merge - * @returns {Object} Result of all merge properties - */ -function merge(/* obj1, obj2, obj3, ... */) { - var result = {}; - function assignValue(val, key) { - if (typeof result[key] === 'object' && typeof val === 'object') { - result[key] = merge(result[key], val); - } else { - result[key] = val; - } - } - - for (var i = 0, l = arguments.length; i < l; i++) { - forEach(arguments[i], assignValue); - } - return result; -} - -/** - * Extends object a by mutably adding to it the properties of object b. - * - * @param {Object} a The object to be extended - * @param {Object} b The object to copy properties from - * @param {Object} thisArg The object to bind function to - * @return {Object} The resulting value of object a - */ -function extend(a, b, thisArg) { - forEach(b, function assignValue(val, key) { - if (thisArg && typeof val === 'function') { - a[key] = bind(val, thisArg); - } else { - a[key] = val; - } - }); - return a; -} - -module.exports = { - isArray: isArray, - isArrayBuffer: isArrayBuffer, - isBuffer: isBuffer, - isFormData: isFormData, - isArrayBufferView: isArrayBufferView, - isString: isString, - isNumber: isNumber, - isObject: isObject, - isUndefined: isUndefined, - isDate: isDate, - isFile: isFile, - isBlob: isBlob, - isFunction: isFunction, - isStream: isStream, - isURLSearchParams: isURLSearchParams, - isStandardBrowserEnv: isStandardBrowserEnv, - forEach: forEach, - merge: merge, - extend: extend, - trim: trim -}; - - -/***/ }), - -/***/ "./node_modules/core-js/internals/a-function.js": -/*!******************************************************!*\ - !*** ./node_modules/core-js/internals/a-function.js ***! - \******************************************************/ -/*! no static exports found */ -/***/ (function(module, exports) { - -module.exports = function (it) { - if (typeof it != 'function') { - throw TypeError(String(it) + ' is not a function'); - } return it; -}; - - -/***/ }), - -/***/ "./node_modules/core-js/internals/a-possible-prototype.js": -/*!****************************************************************!*\ - !*** ./node_modules/core-js/internals/a-possible-prototype.js ***! - \****************************************************************/ -/*! no static exports found */ -/***/ (function(module, exports, __webpack_require__) { - -var isObject = __webpack_require__(/*! ../internals/is-object */ "./node_modules/core-js/internals/is-object.js"); - -module.exports = function (it) { - if (!isObject(it) && it !== null) { - throw TypeError("Can't set " + String(it) + ' as a prototype'); - } return it; -}; - - -/***/ }), - -/***/ "./node_modules/core-js/internals/add-to-unscopables.js": -/*!**************************************************************!*\ - !*** ./node_modules/core-js/internals/add-to-unscopables.js ***! - \**************************************************************/ -/*! no static exports found */ -/***/ (function(module, exports, __webpack_require__) { - -var wellKnownSymbol = __webpack_require__(/*! ../internals/well-known-symbol */ "./node_modules/core-js/internals/well-known-symbol.js"); -var create = __webpack_require__(/*! ../internals/object-create */ "./node_modules/core-js/internals/object-create.js"); -var createNonEnumerableProperty = __webpack_require__(/*! ../internals/create-non-enumerable-property */ "./node_modules/core-js/internals/create-non-enumerable-property.js"); - -var UNSCOPABLES = wellKnownSymbol('unscopables'); -var ArrayPrototype = Array.prototype; - -// Array.prototype[@@unscopables] -// https://tc39.github.io/ecma262/#sec-array.prototype-@@unscopables -if (ArrayPrototype[UNSCOPABLES] == undefined) { - createNonEnumerableProperty(ArrayPrototype, UNSCOPABLES, create(null)); -} - -// add a key to Array.prototype[@@unscopables] -module.exports = function (key) { - ArrayPrototype[UNSCOPABLES][key] = true; -}; - - -/***/ }), - -/***/ "./node_modules/core-js/internals/advance-string-index.js": -/*!****************************************************************!*\ - !*** ./node_modules/core-js/internals/advance-string-index.js ***! - \****************************************************************/ -/*! no static exports found */ -/***/ (function(module, exports, __webpack_require__) { - -"use strict"; - -var charAt = __webpack_require__(/*! ../internals/string-multibyte */ "./node_modules/core-js/internals/string-multibyte.js").charAt; - -// `AdvanceStringIndex` abstract operation -// https://tc39.github.io/ecma262/#sec-advancestringindex -module.exports = function (S, index, unicode) { - return index + (unicode ? charAt(S, index).length : 1); -}; - - -/***/ }), - -/***/ "./node_modules/core-js/internals/an-instance.js": -/*!*******************************************************!*\ - !*** ./node_modules/core-js/internals/an-instance.js ***! - \*******************************************************/ -/*! no static exports found */ -/***/ (function(module, exports) { - -module.exports = function (it, Constructor, name) { - if (!(it instanceof Constructor)) { - throw TypeError('Incorrect ' + (name ? name + ' ' : '') + 'invocation'); - } return it; -}; - - -/***/ }), - -/***/ "./node_modules/core-js/internals/an-object.js": -/*!*****************************************************!*\ - !*** ./node_modules/core-js/internals/an-object.js ***! - \*****************************************************/ -/*! no static exports found */ -/***/ (function(module, exports, __webpack_require__) { - -var isObject = __webpack_require__(/*! ../internals/is-object */ "./node_modules/core-js/internals/is-object.js"); - -module.exports = function (it) { - if (!isObject(it)) { - throw TypeError(String(it) + ' is not an object'); - } return it; -}; - - -/***/ }), - -/***/ "./node_modules/core-js/internals/array-from.js": -/*!******************************************************!*\ - !*** ./node_modules/core-js/internals/array-from.js ***! - \******************************************************/ -/*! no static exports found */ -/***/ (function(module, exports, __webpack_require__) { - -"use strict"; - -var bind = __webpack_require__(/*! ../internals/bind-context */ "./node_modules/core-js/internals/bind-context.js"); -var toObject = __webpack_require__(/*! ../internals/to-object */ "./node_modules/core-js/internals/to-object.js"); -var callWithSafeIterationClosing = __webpack_require__(/*! ../internals/call-with-safe-iteration-closing */ "./node_modules/core-js/internals/call-with-safe-iteration-closing.js"); -var isArrayIteratorMethod = __webpack_require__(/*! ../internals/is-array-iterator-method */ "./node_modules/core-js/internals/is-array-iterator-method.js"); -var toLength = __webpack_require__(/*! ../internals/to-length */ "./node_modules/core-js/internals/to-length.js"); -var createProperty = __webpack_require__(/*! ../internals/create-property */ "./node_modules/core-js/internals/create-property.js"); -var getIteratorMethod = __webpack_require__(/*! ../internals/get-iterator-method */ "./node_modules/core-js/internals/get-iterator-method.js"); - -// `Array.from` method implementation -// https://tc39.github.io/ecma262/#sec-array.from -module.exports = function from(arrayLike /* , mapfn = undefined, thisArg = undefined */) { - var O = toObject(arrayLike); - var C = typeof this == 'function' ? this : Array; - var argumentsLength = arguments.length; - var mapfn = argumentsLength > 1 ? arguments[1] : undefined; - var mapping = mapfn !== undefined; - var index = 0; - var iteratorMethod = getIteratorMethod(O); - var length, result, step, iterator, next; - if (mapping) mapfn = bind(mapfn, argumentsLength > 2 ? arguments[2] : undefined, 2); - // if the target is not iterable or it's an array with the default iterator - use a simple case - if (iteratorMethod != undefined && !(C == Array && isArrayIteratorMethod(iteratorMethod))) { - iterator = iteratorMethod.call(O); - next = iterator.next; - result = new C(); - for (;!(step = next.call(iterator)).done; index++) { - createProperty(result, index, mapping - ? callWithSafeIterationClosing(iterator, mapfn, [step.value, index], true) - : step.value - ); - } - } else { - length = toLength(O.length); - result = new C(length); - for (;length > index; index++) { - createProperty(result, index, mapping ? mapfn(O[index], index) : O[index]); - } - } - result.length = index; - return result; -}; - - -/***/ }), - -/***/ "./node_modules/core-js/internals/array-includes.js": -/*!**********************************************************!*\ - !*** ./node_modules/core-js/internals/array-includes.js ***! - \**********************************************************/ -/*! no static exports found */ -/***/ (function(module, exports, __webpack_require__) { - -var toIndexedObject = __webpack_require__(/*! ../internals/to-indexed-object */ "./node_modules/core-js/internals/to-indexed-object.js"); -var toLength = __webpack_require__(/*! ../internals/to-length */ "./node_modules/core-js/internals/to-length.js"); -var toAbsoluteIndex = __webpack_require__(/*! ../internals/to-absolute-index */ "./node_modules/core-js/internals/to-absolute-index.js"); - -// `Array.prototype.{ indexOf, includes }` methods implementation -var createMethod = function (IS_INCLUDES) { - return function ($this, el, fromIndex) { - var O = toIndexedObject($this); - var length = toLength(O.length); - var index = toAbsoluteIndex(fromIndex, length); - var value; - // Array#includes uses SameValueZero equality algorithm - // eslint-disable-next-line no-self-compare - if (IS_INCLUDES && el != el) while (length > index) { - value = O[index++]; - // eslint-disable-next-line no-self-compare - if (value != value) return true; - // Array#indexOf ignores holes, Array#includes - not - } else for (;length > index; index++) { - if ((IS_INCLUDES || index in O) && O[index] === el) return IS_INCLUDES || index || 0; - } return !IS_INCLUDES && -1; - }; -}; - -module.exports = { - // `Array.prototype.includes` method - // https://tc39.github.io/ecma262/#sec-array.prototype.includes - includes: createMethod(true), - // `Array.prototype.indexOf` method - // https://tc39.github.io/ecma262/#sec-array.prototype.indexof - indexOf: createMethod(false) -}; - - -/***/ }), - -/***/ "./node_modules/core-js/internals/bind-context.js": -/*!********************************************************!*\ - !*** ./node_modules/core-js/internals/bind-context.js ***! - \********************************************************/ -/*! no static exports found */ -/***/ (function(module, exports, __webpack_require__) { - -var aFunction = __webpack_require__(/*! ../internals/a-function */ "./node_modules/core-js/internals/a-function.js"); - -// optional / simple context binding -module.exports = function (fn, that, length) { - aFunction(fn); - if (that === undefined) return fn; - switch (length) { - case 0: return function () { - return fn.call(that); - }; - case 1: return function (a) { - return fn.call(that, a); - }; - case 2: return function (a, b) { - return fn.call(that, a, b); - }; - case 3: return function (a, b, c) { - return fn.call(that, a, b, c); - }; - } - return function (/* ...args */) { - return fn.apply(that, arguments); - }; -}; - - -/***/ }), - -/***/ "./node_modules/core-js/internals/call-with-safe-iteration-closing.js": -/*!****************************************************************************!*\ - !*** ./node_modules/core-js/internals/call-with-safe-iteration-closing.js ***! - \****************************************************************************/ -/*! no static exports found */ -/***/ (function(module, exports, __webpack_require__) { - -var anObject = __webpack_require__(/*! ../internals/an-object */ "./node_modules/core-js/internals/an-object.js"); - -// call something on iterator step with safe closing on error -module.exports = function (iterator, fn, value, ENTRIES) { - try { - return ENTRIES ? fn(anObject(value)[0], value[1]) : fn(value); - // 7.4.6 IteratorClose(iterator, completion) - } catch (error) { - var returnMethod = iterator['return']; - if (returnMethod !== undefined) anObject(returnMethod.call(iterator)); - throw error; - } -}; - - -/***/ }), - -/***/ "./node_modules/core-js/internals/check-correctness-of-iteration.js": -/*!**************************************************************************!*\ - !*** ./node_modules/core-js/internals/check-correctness-of-iteration.js ***! - \**************************************************************************/ -/*! no static exports found */ -/***/ (function(module, exports, __webpack_require__) { - -var wellKnownSymbol = __webpack_require__(/*! ../internals/well-known-symbol */ "./node_modules/core-js/internals/well-known-symbol.js"); - -var ITERATOR = wellKnownSymbol('iterator'); -var SAFE_CLOSING = false; - -try { - var called = 0; - var iteratorWithReturn = { - next: function () { - return { done: !!called++ }; - }, - 'return': function () { - SAFE_CLOSING = true; - } - }; - iteratorWithReturn[ITERATOR] = function () { - return this; - }; - // eslint-disable-next-line no-throw-literal - Array.from(iteratorWithReturn, function () { throw 2; }); -} catch (error) { /* empty */ } - -module.exports = function (exec, SKIP_CLOSING) { - if (!SKIP_CLOSING && !SAFE_CLOSING) return false; - var ITERATION_SUPPORT = false; - try { - var object = {}; - object[ITERATOR] = function () { - return { - next: function () { - return { done: ITERATION_SUPPORT = true }; - } - }; - }; - exec(object); - } catch (error) { /* empty */ } - return ITERATION_SUPPORT; -}; - - -/***/ }), - -/***/ "./node_modules/core-js/internals/classof-raw.js": -/*!*******************************************************!*\ - !*** ./node_modules/core-js/internals/classof-raw.js ***! - \*******************************************************/ -/*! no static exports found */ -/***/ (function(module, exports) { - -var toString = {}.toString; - -module.exports = function (it) { - return toString.call(it).slice(8, -1); -}; - - -/***/ }), - -/***/ "./node_modules/core-js/internals/classof.js": -/*!***************************************************!*\ - !*** ./node_modules/core-js/internals/classof.js ***! - \***************************************************/ -/*! no static exports found */ -/***/ (function(module, exports, __webpack_require__) { - -var classofRaw = __webpack_require__(/*! ../internals/classof-raw */ "./node_modules/core-js/internals/classof-raw.js"); -var wellKnownSymbol = __webpack_require__(/*! ../internals/well-known-symbol */ "./node_modules/core-js/internals/well-known-symbol.js"); - -var TO_STRING_TAG = wellKnownSymbol('toStringTag'); -// ES3 wrong here -var CORRECT_ARGUMENTS = classofRaw(function () { return arguments; }()) == 'Arguments'; - -// fallback for IE11 Script Access Denied error -var tryGet = function (it, key) { - try { - return it[key]; - } catch (error) { /* empty */ } -}; - -// getting tag from ES6+ `Object.prototype.toString` -module.exports = function (it) { - var O, tag, result; - return it === undefined ? 'Undefined' : it === null ? 'Null' - // @@toStringTag case - : typeof (tag = tryGet(O = Object(it), TO_STRING_TAG)) == 'string' ? tag - // builtinTag case - : CORRECT_ARGUMENTS ? classofRaw(O) - // ES3 arguments fallback - : (result = classofRaw(O)) == 'Object' && typeof O.callee == 'function' ? 'Arguments' : result; -}; - - -/***/ }), - -/***/ "./node_modules/core-js/internals/copy-constructor-properties.js": -/*!***********************************************************************!*\ - !*** ./node_modules/core-js/internals/copy-constructor-properties.js ***! - \***********************************************************************/ -/*! no static exports found */ -/***/ (function(module, exports, __webpack_require__) { - -var has = __webpack_require__(/*! ../internals/has */ "./node_modules/core-js/internals/has.js"); -var ownKeys = __webpack_require__(/*! ../internals/own-keys */ "./node_modules/core-js/internals/own-keys.js"); -var getOwnPropertyDescriptorModule = __webpack_require__(/*! ../internals/object-get-own-property-descriptor */ "./node_modules/core-js/internals/object-get-own-property-descriptor.js"); -var definePropertyModule = __webpack_require__(/*! ../internals/object-define-property */ "./node_modules/core-js/internals/object-define-property.js"); - -module.exports = function (target, source) { - var keys = ownKeys(source); - var defineProperty = definePropertyModule.f; - var getOwnPropertyDescriptor = getOwnPropertyDescriptorModule.f; - for (var i = 0; i < keys.length; i++) { - var key = keys[i]; - if (!has(target, key)) defineProperty(target, key, getOwnPropertyDescriptor(source, key)); - } -}; - - -/***/ }), - -/***/ "./node_modules/core-js/internals/correct-prototype-getter.js": -/*!********************************************************************!*\ - !*** ./node_modules/core-js/internals/correct-prototype-getter.js ***! - \********************************************************************/ -/*! no static exports found */ -/***/ (function(module, exports, __webpack_require__) { - -var fails = __webpack_require__(/*! ../internals/fails */ "./node_modules/core-js/internals/fails.js"); - -module.exports = !fails(function () { - function F() { /* empty */ } - F.prototype.constructor = null; - return Object.getPrototypeOf(new F()) !== F.prototype; -}); - - -/***/ }), - -/***/ "./node_modules/core-js/internals/create-iterator-constructor.js": -/*!***********************************************************************!*\ - !*** ./node_modules/core-js/internals/create-iterator-constructor.js ***! - \***********************************************************************/ -/*! no static exports found */ -/***/ (function(module, exports, __webpack_require__) { - -"use strict"; - -var IteratorPrototype = __webpack_require__(/*! ../internals/iterators-core */ "./node_modules/core-js/internals/iterators-core.js").IteratorPrototype; -var create = __webpack_require__(/*! ../internals/object-create */ "./node_modules/core-js/internals/object-create.js"); -var createPropertyDescriptor = __webpack_require__(/*! ../internals/create-property-descriptor */ "./node_modules/core-js/internals/create-property-descriptor.js"); -var setToStringTag = __webpack_require__(/*! ../internals/set-to-string-tag */ "./node_modules/core-js/internals/set-to-string-tag.js"); -var Iterators = __webpack_require__(/*! ../internals/iterators */ "./node_modules/core-js/internals/iterators.js"); - -var returnThis = function () { return this; }; - -module.exports = function (IteratorConstructor, NAME, next) { - var TO_STRING_TAG = NAME + ' Iterator'; - IteratorConstructor.prototype = create(IteratorPrototype, { next: createPropertyDescriptor(1, next) }); - setToStringTag(IteratorConstructor, TO_STRING_TAG, false, true); - Iterators[TO_STRING_TAG] = returnThis; - return IteratorConstructor; -}; - - -/***/ }), - -/***/ "./node_modules/core-js/internals/create-non-enumerable-property.js": -/*!**************************************************************************!*\ - !*** ./node_modules/core-js/internals/create-non-enumerable-property.js ***! - \**************************************************************************/ -/*! no static exports found */ -/***/ (function(module, exports, __webpack_require__) { - -var DESCRIPTORS = __webpack_require__(/*! ../internals/descriptors */ "./node_modules/core-js/internals/descriptors.js"); -var definePropertyModule = __webpack_require__(/*! ../internals/object-define-property */ "./node_modules/core-js/internals/object-define-property.js"); -var createPropertyDescriptor = __webpack_require__(/*! ../internals/create-property-descriptor */ "./node_modules/core-js/internals/create-property-descriptor.js"); - -module.exports = DESCRIPTORS ? function (object, key, value) { - return definePropertyModule.f(object, key, createPropertyDescriptor(1, value)); -} : function (object, key, value) { - object[key] = value; - return object; -}; - - -/***/ }), - -/***/ "./node_modules/core-js/internals/create-property-descriptor.js": -/*!**********************************************************************!*\ - !*** ./node_modules/core-js/internals/create-property-descriptor.js ***! - \**********************************************************************/ -/*! no static exports found */ -/***/ (function(module, exports) { - -module.exports = function (bitmap, value) { - return { - enumerable: !(bitmap & 1), - configurable: !(bitmap & 2), - writable: !(bitmap & 4), - value: value - }; -}; - - -/***/ }), - -/***/ "./node_modules/core-js/internals/create-property.js": -/*!***********************************************************!*\ - !*** ./node_modules/core-js/internals/create-property.js ***! - \***********************************************************/ -/*! no static exports found */ -/***/ (function(module, exports, __webpack_require__) { - -"use strict"; - -var toPrimitive = __webpack_require__(/*! ../internals/to-primitive */ "./node_modules/core-js/internals/to-primitive.js"); -var definePropertyModule = __webpack_require__(/*! ../internals/object-define-property */ "./node_modules/core-js/internals/object-define-property.js"); -var createPropertyDescriptor = __webpack_require__(/*! ../internals/create-property-descriptor */ "./node_modules/core-js/internals/create-property-descriptor.js"); - -module.exports = function (object, key, value) { - var propertyKey = toPrimitive(key); - if (propertyKey in object) definePropertyModule.f(object, propertyKey, createPropertyDescriptor(0, value)); - else object[propertyKey] = value; -}; - - -/***/ }), - -/***/ "./node_modules/core-js/internals/define-iterator.js": -/*!***********************************************************!*\ - !*** ./node_modules/core-js/internals/define-iterator.js ***! - \***********************************************************/ -/*! no static exports found */ -/***/ (function(module, exports, __webpack_require__) { - -"use strict"; - -var $ = __webpack_require__(/*! ../internals/export */ "./node_modules/core-js/internals/export.js"); -var createIteratorConstructor = __webpack_require__(/*! ../internals/create-iterator-constructor */ "./node_modules/core-js/internals/create-iterator-constructor.js"); -var getPrototypeOf = __webpack_require__(/*! ../internals/object-get-prototype-of */ "./node_modules/core-js/internals/object-get-prototype-of.js"); -var setPrototypeOf = __webpack_require__(/*! ../internals/object-set-prototype-of */ "./node_modules/core-js/internals/object-set-prototype-of.js"); -var setToStringTag = __webpack_require__(/*! ../internals/set-to-string-tag */ "./node_modules/core-js/internals/set-to-string-tag.js"); -var createNonEnumerableProperty = __webpack_require__(/*! ../internals/create-non-enumerable-property */ "./node_modules/core-js/internals/create-non-enumerable-property.js"); -var redefine = __webpack_require__(/*! ../internals/redefine */ "./node_modules/core-js/internals/redefine.js"); -var wellKnownSymbol = __webpack_require__(/*! ../internals/well-known-symbol */ "./node_modules/core-js/internals/well-known-symbol.js"); -var IS_PURE = __webpack_require__(/*! ../internals/is-pure */ "./node_modules/core-js/internals/is-pure.js"); -var Iterators = __webpack_require__(/*! ../internals/iterators */ "./node_modules/core-js/internals/iterators.js"); -var IteratorsCore = __webpack_require__(/*! ../internals/iterators-core */ "./node_modules/core-js/internals/iterators-core.js"); - -var IteratorPrototype = IteratorsCore.IteratorPrototype; -var BUGGY_SAFARI_ITERATORS = IteratorsCore.BUGGY_SAFARI_ITERATORS; -var ITERATOR = wellKnownSymbol('iterator'); -var KEYS = 'keys'; -var VALUES = 'values'; -var ENTRIES = 'entries'; - -var returnThis = function () { return this; }; - -module.exports = function (Iterable, NAME, IteratorConstructor, next, DEFAULT, IS_SET, FORCED) { - createIteratorConstructor(IteratorConstructor, NAME, next); - - var getIterationMethod = function (KIND) { - if (KIND === DEFAULT && defaultIterator) return defaultIterator; - if (!BUGGY_SAFARI_ITERATORS && KIND in IterablePrototype) return IterablePrototype[KIND]; - switch (KIND) { - case KEYS: return function keys() { return new IteratorConstructor(this, KIND); }; - case VALUES: return function values() { return new IteratorConstructor(this, KIND); }; - case ENTRIES: return function entries() { return new IteratorConstructor(this, KIND); }; - } return function () { return new IteratorConstructor(this); }; - }; - - var TO_STRING_TAG = NAME + ' Iterator'; - var INCORRECT_VALUES_NAME = false; - var IterablePrototype = Iterable.prototype; - var nativeIterator = IterablePrototype[ITERATOR] - || IterablePrototype['@@iterator'] - || DEFAULT && IterablePrototype[DEFAULT]; - var defaultIterator = !BUGGY_SAFARI_ITERATORS && nativeIterator || getIterationMethod(DEFAULT); - var anyNativeIterator = NAME == 'Array' ? IterablePrototype.entries || nativeIterator : nativeIterator; - var CurrentIteratorPrototype, methods, KEY; - - // fix native - if (anyNativeIterator) { - CurrentIteratorPrototype = getPrototypeOf(anyNativeIterator.call(new Iterable())); - if (IteratorPrototype !== Object.prototype && CurrentIteratorPrototype.next) { - if (!IS_PURE && getPrototypeOf(CurrentIteratorPrototype) !== IteratorPrototype) { - if (setPrototypeOf) { - setPrototypeOf(CurrentIteratorPrototype, IteratorPrototype); - } else if (typeof CurrentIteratorPrototype[ITERATOR] != 'function') { - createNonEnumerableProperty(CurrentIteratorPrototype, ITERATOR, returnThis); - } - } - // Set @@toStringTag to native iterators - setToStringTag(CurrentIteratorPrototype, TO_STRING_TAG, true, true); - if (IS_PURE) Iterators[TO_STRING_TAG] = returnThis; - } - } - - // fix Array#{values, @@iterator}.name in V8 / FF - if (DEFAULT == VALUES && nativeIterator && nativeIterator.name !== VALUES) { - INCORRECT_VALUES_NAME = true; - defaultIterator = function values() { return nativeIterator.call(this); }; - } - - // define iterator - if ((!IS_PURE || FORCED) && IterablePrototype[ITERATOR] !== defaultIterator) { - createNonEnumerableProperty(IterablePrototype, ITERATOR, defaultIterator); - } - Iterators[NAME] = defaultIterator; - - // export additional methods - if (DEFAULT) { - methods = { - values: getIterationMethod(VALUES), - keys: IS_SET ? defaultIterator : getIterationMethod(KEYS), - entries: getIterationMethod(ENTRIES) - }; - if (FORCED) for (KEY in methods) { - if (BUGGY_SAFARI_ITERATORS || INCORRECT_VALUES_NAME || !(KEY in IterablePrototype)) { - redefine(IterablePrototype, KEY, methods[KEY]); - } - } else $({ target: NAME, proto: true, forced: BUGGY_SAFARI_ITERATORS || INCORRECT_VALUES_NAME }, methods); - } - - return methods; -}; - - -/***/ }), - -/***/ "./node_modules/core-js/internals/descriptors.js": -/*!*******************************************************!*\ - !*** ./node_modules/core-js/internals/descriptors.js ***! - \*******************************************************/ -/*! no static exports found */ -/***/ (function(module, exports, __webpack_require__) { - -var fails = __webpack_require__(/*! ../internals/fails */ "./node_modules/core-js/internals/fails.js"); - -// Thank's IE8 for his funny defineProperty -module.exports = !fails(function () { - return Object.defineProperty({}, 'a', { get: function () { return 7; } }).a != 7; -}); - - -/***/ }), - -/***/ "./node_modules/core-js/internals/document-create-element.js": -/*!*******************************************************************!*\ - !*** ./node_modules/core-js/internals/document-create-element.js ***! - \*******************************************************************/ -/*! no static exports found */ -/***/ (function(module, exports, __webpack_require__) { - -var global = __webpack_require__(/*! ../internals/global */ "./node_modules/core-js/internals/global.js"); -var isObject = __webpack_require__(/*! ../internals/is-object */ "./node_modules/core-js/internals/is-object.js"); - -var document = global.document; -// typeof document.createElement is 'object' in old IE -var EXISTS = isObject(document) && isObject(document.createElement); - -module.exports = function (it) { - return EXISTS ? document.createElement(it) : {}; -}; - - -/***/ }), - -/***/ "./node_modules/core-js/internals/dom-iterables.js": -/*!*********************************************************!*\ - !*** ./node_modules/core-js/internals/dom-iterables.js ***! - \*********************************************************/ -/*! no static exports found */ -/***/ (function(module, exports) { - -// iterable DOM collections -// flag - `iterable` interface - 'entries', 'keys', 'values', 'forEach' methods -module.exports = { - CSSRuleList: 0, - CSSStyleDeclaration: 0, - CSSValueList: 0, - ClientRectList: 0, - DOMRectList: 0, - DOMStringList: 0, - DOMTokenList: 1, - DataTransferItemList: 0, - FileList: 0, - HTMLAllCollection: 0, - HTMLCollection: 0, - HTMLFormElement: 0, - HTMLSelectElement: 0, - MediaList: 0, - MimeTypeArray: 0, - NamedNodeMap: 0, - NodeList: 1, - PaintRequestList: 0, - Plugin: 0, - PluginArray: 0, - SVGLengthList: 0, - SVGNumberList: 0, - SVGPathSegList: 0, - SVGPointList: 0, - SVGStringList: 0, - SVGTransformList: 0, - SourceBufferList: 0, - StyleSheetList: 0, - TextTrackCueList: 0, - TextTrackList: 0, - TouchList: 0 -}; - - -/***/ }), - -/***/ "./node_modules/core-js/internals/enum-bug-keys.js": -/*!*********************************************************!*\ - !*** ./node_modules/core-js/internals/enum-bug-keys.js ***! - \*********************************************************/ -/*! no static exports found */ -/***/ (function(module, exports) { - -// IE8- don't enum bug keys -module.exports = [ - 'constructor', - 'hasOwnProperty', - 'isPrototypeOf', - 'propertyIsEnumerable', - 'toLocaleString', - 'toString', - 'valueOf' -]; - - -/***/ }), - -/***/ "./node_modules/core-js/internals/export.js": -/*!**************************************************!*\ - !*** ./node_modules/core-js/internals/export.js ***! - \**************************************************/ -/*! no static exports found */ -/***/ (function(module, exports, __webpack_require__) { - -var global = __webpack_require__(/*! ../internals/global */ "./node_modules/core-js/internals/global.js"); -var getOwnPropertyDescriptor = __webpack_require__(/*! ../internals/object-get-own-property-descriptor */ "./node_modules/core-js/internals/object-get-own-property-descriptor.js").f; -var createNonEnumerableProperty = __webpack_require__(/*! ../internals/create-non-enumerable-property */ "./node_modules/core-js/internals/create-non-enumerable-property.js"); -var redefine = __webpack_require__(/*! ../internals/redefine */ "./node_modules/core-js/internals/redefine.js"); -var setGlobal = __webpack_require__(/*! ../internals/set-global */ "./node_modules/core-js/internals/set-global.js"); -var copyConstructorProperties = __webpack_require__(/*! ../internals/copy-constructor-properties */ "./node_modules/core-js/internals/copy-constructor-properties.js"); -var isForced = __webpack_require__(/*! ../internals/is-forced */ "./node_modules/core-js/internals/is-forced.js"); - -/* - options.target - name of the target object - options.global - target is the global object - options.stat - export as static methods of target - options.proto - export as prototype methods of target - options.real - real prototype method for the `pure` version - options.forced - export even if the native feature is available - options.bind - bind methods to the target, required for the `pure` version - options.wrap - wrap constructors to preventing global pollution, required for the `pure` version - options.unsafe - use the simple assignment of property instead of delete + defineProperty - options.sham - add a flag to not completely full polyfills - options.enumerable - export as enumerable property - options.noTargetGet - prevent calling a getter on target -*/ -module.exports = function (options, source) { - var TARGET = options.target; - var GLOBAL = options.global; - var STATIC = options.stat; - var FORCED, target, key, targetProperty, sourceProperty, descriptor; - if (GLOBAL) { - target = global; - } else if (STATIC) { - target = global[TARGET] || setGlobal(TARGET, {}); - } else { - target = (global[TARGET] || {}).prototype; - } - if (target) for (key in source) { - sourceProperty = source[key]; - if (options.noTargetGet) { - descriptor = getOwnPropertyDescriptor(target, key); - targetProperty = descriptor && descriptor.value; - } else targetProperty = target[key]; - FORCED = isForced(GLOBAL ? key : TARGET + (STATIC ? '.' : '#') + key, options.forced); - // contained in target - if (!FORCED && targetProperty !== undefined) { - if (typeof sourceProperty === typeof targetProperty) continue; - copyConstructorProperties(sourceProperty, targetProperty); - } - // add a flag to not completely full polyfills - if (options.sham || (targetProperty && targetProperty.sham)) { - createNonEnumerableProperty(sourceProperty, 'sham', true); - } - // extend global - redefine(target, key, sourceProperty, options); - } -}; - - -/***/ }), - -/***/ "./node_modules/core-js/internals/fails.js": -/*!*************************************************!*\ - !*** ./node_modules/core-js/internals/fails.js ***! - \*************************************************/ -/*! no static exports found */ -/***/ (function(module, exports) { - -module.exports = function (exec) { - try { - return !!exec(); - } catch (error) { - return true; - } -}; - - -/***/ }), - -/***/ "./node_modules/core-js/internals/fix-regexp-well-known-symbol-logic.js": -/*!******************************************************************************!*\ - !*** ./node_modules/core-js/internals/fix-regexp-well-known-symbol-logic.js ***! - \******************************************************************************/ -/*! no static exports found */ -/***/ (function(module, exports, __webpack_require__) { - -"use strict"; - -var createNonEnumerableProperty = __webpack_require__(/*! ../internals/create-non-enumerable-property */ "./node_modules/core-js/internals/create-non-enumerable-property.js"); -var redefine = __webpack_require__(/*! ../internals/redefine */ "./node_modules/core-js/internals/redefine.js"); -var fails = __webpack_require__(/*! ../internals/fails */ "./node_modules/core-js/internals/fails.js"); -var wellKnownSymbol = __webpack_require__(/*! ../internals/well-known-symbol */ "./node_modules/core-js/internals/well-known-symbol.js"); -var regexpExec = __webpack_require__(/*! ../internals/regexp-exec */ "./node_modules/core-js/internals/regexp-exec.js"); - -var SPECIES = wellKnownSymbol('species'); - -var REPLACE_SUPPORTS_NAMED_GROUPS = !fails(function () { - // #replace needs built-in support for named groups. - // #match works fine because it just return the exec results, even if it has - // a "grops" property. - var re = /./; - re.exec = function () { - var result = []; - result.groups = { a: '7' }; - return result; - }; - return ''.replace(re, '$') !== '7'; -}); - -// Chrome 51 has a buggy "split" implementation when RegExp#exec !== nativeExec -// Weex JS has frozen built-in prototypes, so use try / catch wrapper -var SPLIT_WORKS_WITH_OVERWRITTEN_EXEC = !fails(function () { - var re = /(?:)/; - var originalExec = re.exec; - re.exec = function () { return originalExec.apply(this, arguments); }; - var result = 'ab'.split(re); - return result.length !== 2 || result[0] !== 'a' || result[1] !== 'b'; -}); - -module.exports = function (KEY, length, exec, sham) { - var SYMBOL = wellKnownSymbol(KEY); - - var DELEGATES_TO_SYMBOL = !fails(function () { - // String methods call symbol-named RegEp methods - var O = {}; - O[SYMBOL] = function () { return 7; }; - return ''[KEY](O) != 7; - }); - - var DELEGATES_TO_EXEC = DELEGATES_TO_SYMBOL && !fails(function () { - // Symbol-named RegExp methods call .exec - var execCalled = false; - var re = /a/; - re.exec = function () { execCalled = true; return null; }; - - if (KEY === 'split') { - // RegExp[@@split] doesn't call the regex's exec method, but first creates - // a new one. We need to return the patched regex when creating the new one. - re.constructor = {}; - re.constructor[SPECIES] = function () { return re; }; - } - - re[SYMBOL](''); - return !execCalled; - }); - - if ( - !DELEGATES_TO_SYMBOL || - !DELEGATES_TO_EXEC || - (KEY === 'replace' && !REPLACE_SUPPORTS_NAMED_GROUPS) || - (KEY === 'split' && !SPLIT_WORKS_WITH_OVERWRITTEN_EXEC) - ) { - var nativeRegExpMethod = /./[SYMBOL]; - var methods = exec(SYMBOL, ''[KEY], function (nativeMethod, regexp, str, arg2, forceStringMethod) { - if (regexp.exec === regexpExec) { - if (DELEGATES_TO_SYMBOL && !forceStringMethod) { - // The native String method already delegates to @@method (this - // polyfilled function), leasing to infinite recursion. - // We avoid it by directly calling the native @@method method. - return { done: true, value: nativeRegExpMethod.call(regexp, str, arg2) }; - } - return { done: true, value: nativeMethod.call(str, regexp, arg2) }; - } - return { done: false }; - }); - var stringMethod = methods[0]; - var regexMethod = methods[1]; - - redefine(String.prototype, KEY, stringMethod); - redefine(RegExp.prototype, SYMBOL, length == 2 - // 21.2.5.8 RegExp.prototype[@@replace](string, replaceValue) - // 21.2.5.11 RegExp.prototype[@@split](string, limit) - ? function (string, arg) { return regexMethod.call(string, this, arg); } - // 21.2.5.6 RegExp.prototype[@@match](string) - // 21.2.5.9 RegExp.prototype[@@search](string) - : function (string) { return regexMethod.call(string, this); } - ); - if (sham) createNonEnumerableProperty(RegExp.prototype[SYMBOL], 'sham', true); - } -}; - - -/***/ }), - -/***/ "./node_modules/core-js/internals/forced-string-trim-method.js": -/*!*********************************************************************!*\ - !*** ./node_modules/core-js/internals/forced-string-trim-method.js ***! - \*********************************************************************/ -/*! no static exports found */ -/***/ (function(module, exports, __webpack_require__) { - -var fails = __webpack_require__(/*! ../internals/fails */ "./node_modules/core-js/internals/fails.js"); -var whitespaces = __webpack_require__(/*! ../internals/whitespaces */ "./node_modules/core-js/internals/whitespaces.js"); - -var non = '\u200B\u0085\u180E'; - -// check that a method works with the correct list -// of whitespaces and has a correct name -module.exports = function (METHOD_NAME) { - return fails(function () { - return !!whitespaces[METHOD_NAME]() || non[METHOD_NAME]() != non || whitespaces[METHOD_NAME].name !== METHOD_NAME; - }); -}; - - -/***/ }), - -/***/ "./node_modules/core-js/internals/function-to-string.js": -/*!**************************************************************!*\ - !*** ./node_modules/core-js/internals/function-to-string.js ***! - \**************************************************************/ -/*! no static exports found */ -/***/ (function(module, exports, __webpack_require__) { - -var shared = __webpack_require__(/*! ../internals/shared */ "./node_modules/core-js/internals/shared.js"); - -module.exports = shared('native-function-to-string', Function.toString); - - -/***/ }), - -/***/ "./node_modules/core-js/internals/get-built-in.js": -/*!********************************************************!*\ - !*** ./node_modules/core-js/internals/get-built-in.js ***! - \********************************************************/ -/*! no static exports found */ -/***/ (function(module, exports, __webpack_require__) { - -var path = __webpack_require__(/*! ../internals/path */ "./node_modules/core-js/internals/path.js"); -var global = __webpack_require__(/*! ../internals/global */ "./node_modules/core-js/internals/global.js"); - -var aFunction = function (variable) { - return typeof variable == 'function' ? variable : undefined; -}; - -module.exports = function (namespace, method) { - return arguments.length < 2 ? aFunction(path[namespace]) || aFunction(global[namespace]) - : path[namespace] && path[namespace][method] || global[namespace] && global[namespace][method]; -}; - - -/***/ }), - -/***/ "./node_modules/core-js/internals/get-iterator-method.js": -/*!***************************************************************!*\ - !*** ./node_modules/core-js/internals/get-iterator-method.js ***! - \***************************************************************/ -/*! no static exports found */ -/***/ (function(module, exports, __webpack_require__) { - -var classof = __webpack_require__(/*! ../internals/classof */ "./node_modules/core-js/internals/classof.js"); -var Iterators = __webpack_require__(/*! ../internals/iterators */ "./node_modules/core-js/internals/iterators.js"); -var wellKnownSymbol = __webpack_require__(/*! ../internals/well-known-symbol */ "./node_modules/core-js/internals/well-known-symbol.js"); - -var ITERATOR = wellKnownSymbol('iterator'); - -module.exports = function (it) { - if (it != undefined) return it[ITERATOR] - || it['@@iterator'] - || Iterators[classof(it)]; -}; - - -/***/ }), - -/***/ "./node_modules/core-js/internals/get-iterator.js": -/*!********************************************************!*\ - !*** ./node_modules/core-js/internals/get-iterator.js ***! - \********************************************************/ -/*! no static exports found */ -/***/ (function(module, exports, __webpack_require__) { - -var anObject = __webpack_require__(/*! ../internals/an-object */ "./node_modules/core-js/internals/an-object.js"); -var getIteratorMethod = __webpack_require__(/*! ../internals/get-iterator-method */ "./node_modules/core-js/internals/get-iterator-method.js"); - -module.exports = function (it) { - var iteratorMethod = getIteratorMethod(it); - if (typeof iteratorMethod != 'function') { - throw TypeError(String(it) + ' is not iterable'); - } return anObject(iteratorMethod.call(it)); -}; - - -/***/ }), - -/***/ "./node_modules/core-js/internals/global.js": -/*!**************************************************!*\ - !*** ./node_modules/core-js/internals/global.js ***! - \**************************************************/ -/*! no static exports found */ -/***/ (function(module, exports, __webpack_require__) { - -/* WEBPACK VAR INJECTION */(function(global) {var check = function (it) { - return it && it.Math == Math && it; -}; - -// https://github.com/zloirock/core-js/issues/86#issuecomment-115759028 -module.exports = - // eslint-disable-next-line no-undef - check(typeof globalThis == 'object' && globalThis) || - check(typeof window == 'object' && window) || - check(typeof self == 'object' && self) || - check(typeof global == 'object' && global) || - // eslint-disable-next-line no-new-func - Function('return this')(); - -/* WEBPACK VAR INJECTION */}.call(this, __webpack_require__(/*! ./../../webpack/buildin/global.js */ "./node_modules/webpack/buildin/global.js"))) - -/***/ }), - -/***/ "./node_modules/core-js/internals/has.js": -/*!***********************************************!*\ - !*** ./node_modules/core-js/internals/has.js ***! - \***********************************************/ -/*! no static exports found */ -/***/ (function(module, exports) { - -var hasOwnProperty = {}.hasOwnProperty; - -module.exports = function (it, key) { - return hasOwnProperty.call(it, key); -}; - - -/***/ }), - -/***/ "./node_modules/core-js/internals/hidden-keys.js": -/*!*******************************************************!*\ - !*** ./node_modules/core-js/internals/hidden-keys.js ***! - \*******************************************************/ -/*! no static exports found */ -/***/ (function(module, exports) { - -module.exports = {}; - - -/***/ }), - -/***/ "./node_modules/core-js/internals/host-report-errors.js": -/*!**************************************************************!*\ - !*** ./node_modules/core-js/internals/host-report-errors.js ***! - \**************************************************************/ -/*! no static exports found */ -/***/ (function(module, exports, __webpack_require__) { - -var global = __webpack_require__(/*! ../internals/global */ "./node_modules/core-js/internals/global.js"); - -module.exports = function (a, b) { - var console = global.console; - if (console && console.error) { - arguments.length === 1 ? console.error(a) : console.error(a, b); - } -}; - - -/***/ }), - -/***/ "./node_modules/core-js/internals/html.js": -/*!************************************************!*\ - !*** ./node_modules/core-js/internals/html.js ***! - \************************************************/ -/*! no static exports found */ -/***/ (function(module, exports, __webpack_require__) { - -var getBuiltIn = __webpack_require__(/*! ../internals/get-built-in */ "./node_modules/core-js/internals/get-built-in.js"); - -module.exports = getBuiltIn('document', 'documentElement'); - - -/***/ }), - -/***/ "./node_modules/core-js/internals/ie8-dom-define.js": -/*!**********************************************************!*\ - !*** ./node_modules/core-js/internals/ie8-dom-define.js ***! - \**********************************************************/ -/*! no static exports found */ -/***/ (function(module, exports, __webpack_require__) { - -var DESCRIPTORS = __webpack_require__(/*! ../internals/descriptors */ "./node_modules/core-js/internals/descriptors.js"); -var fails = __webpack_require__(/*! ../internals/fails */ "./node_modules/core-js/internals/fails.js"); -var createElement = __webpack_require__(/*! ../internals/document-create-element */ "./node_modules/core-js/internals/document-create-element.js"); - -// Thank's IE8 for his funny defineProperty -module.exports = !DESCRIPTORS && !fails(function () { - return Object.defineProperty(createElement('div'), 'a', { - get: function () { return 7; } - }).a != 7; -}); - - -/***/ }), - -/***/ "./node_modules/core-js/internals/indexed-object.js": -/*!**********************************************************!*\ - !*** ./node_modules/core-js/internals/indexed-object.js ***! - \**********************************************************/ -/*! no static exports found */ -/***/ (function(module, exports, __webpack_require__) { - -var fails = __webpack_require__(/*! ../internals/fails */ "./node_modules/core-js/internals/fails.js"); -var classof = __webpack_require__(/*! ../internals/classof-raw */ "./node_modules/core-js/internals/classof-raw.js"); - -var split = ''.split; - -// fallback for non-array-like ES3 and non-enumerable old V8 strings -module.exports = fails(function () { - // throws an error in rhino, see https://github.com/mozilla/rhino/issues/346 - // eslint-disable-next-line no-prototype-builtins - return !Object('z').propertyIsEnumerable(0); -}) ? function (it) { - return classof(it) == 'String' ? split.call(it, '') : Object(it); -} : Object; - - -/***/ }), - -/***/ "./node_modules/core-js/internals/internal-state.js": -/*!**********************************************************!*\ - !*** ./node_modules/core-js/internals/internal-state.js ***! - \**********************************************************/ -/*! no static exports found */ -/***/ (function(module, exports, __webpack_require__) { - -var NATIVE_WEAK_MAP = __webpack_require__(/*! ../internals/native-weak-map */ "./node_modules/core-js/internals/native-weak-map.js"); -var global = __webpack_require__(/*! ../internals/global */ "./node_modules/core-js/internals/global.js"); -var isObject = __webpack_require__(/*! ../internals/is-object */ "./node_modules/core-js/internals/is-object.js"); -var createNonEnumerableProperty = __webpack_require__(/*! ../internals/create-non-enumerable-property */ "./node_modules/core-js/internals/create-non-enumerable-property.js"); -var objectHas = __webpack_require__(/*! ../internals/has */ "./node_modules/core-js/internals/has.js"); -var sharedKey = __webpack_require__(/*! ../internals/shared-key */ "./node_modules/core-js/internals/shared-key.js"); -var hiddenKeys = __webpack_require__(/*! ../internals/hidden-keys */ "./node_modules/core-js/internals/hidden-keys.js"); - -var WeakMap = global.WeakMap; -var set, get, has; - -var enforce = function (it) { - return has(it) ? get(it) : set(it, {}); -}; - -var getterFor = function (TYPE) { - return function (it) { - var state; - if (!isObject(it) || (state = get(it)).type !== TYPE) { - throw TypeError('Incompatible receiver, ' + TYPE + ' required'); - } return state; - }; -}; - -if (NATIVE_WEAK_MAP) { - var store = new WeakMap(); - var wmget = store.get; - var wmhas = store.has; - var wmset = store.set; - set = function (it, metadata) { - wmset.call(store, it, metadata); - return metadata; - }; - get = function (it) { - return wmget.call(store, it) || {}; - }; - has = function (it) { - return wmhas.call(store, it); - }; -} else { - var STATE = sharedKey('state'); - hiddenKeys[STATE] = true; - set = function (it, metadata) { - createNonEnumerableProperty(it, STATE, metadata); - return metadata; - }; - get = function (it) { - return objectHas(it, STATE) ? it[STATE] : {}; - }; - has = function (it) { - return objectHas(it, STATE); - }; -} - -module.exports = { - set: set, - get: get, - has: has, - enforce: enforce, - getterFor: getterFor -}; - - -/***/ }), - -/***/ "./node_modules/core-js/internals/is-array-iterator-method.js": -/*!********************************************************************!*\ - !*** ./node_modules/core-js/internals/is-array-iterator-method.js ***! - \********************************************************************/ -/*! no static exports found */ -/***/ (function(module, exports, __webpack_require__) { - -var wellKnownSymbol = __webpack_require__(/*! ../internals/well-known-symbol */ "./node_modules/core-js/internals/well-known-symbol.js"); -var Iterators = __webpack_require__(/*! ../internals/iterators */ "./node_modules/core-js/internals/iterators.js"); - -var ITERATOR = wellKnownSymbol('iterator'); -var ArrayPrototype = Array.prototype; - -// check on default Array iterator -module.exports = function (it) { - return it !== undefined && (Iterators.Array === it || ArrayPrototype[ITERATOR] === it); -}; - - -/***/ }), - -/***/ "./node_modules/core-js/internals/is-forced.js": -/*!*****************************************************!*\ - !*** ./node_modules/core-js/internals/is-forced.js ***! - \*****************************************************/ -/*! no static exports found */ -/***/ (function(module, exports, __webpack_require__) { - -var fails = __webpack_require__(/*! ../internals/fails */ "./node_modules/core-js/internals/fails.js"); - -var replacement = /#|\.prototype\./; - -var isForced = function (feature, detection) { - var value = data[normalize(feature)]; - return value == POLYFILL ? true - : value == NATIVE ? false - : typeof detection == 'function' ? fails(detection) - : !!detection; -}; - -var normalize = isForced.normalize = function (string) { - return String(string).replace(replacement, '.').toLowerCase(); -}; - -var data = isForced.data = {}; -var NATIVE = isForced.NATIVE = 'N'; -var POLYFILL = isForced.POLYFILL = 'P'; - -module.exports = isForced; - - -/***/ }), - -/***/ "./node_modules/core-js/internals/is-object.js": -/*!*****************************************************!*\ - !*** ./node_modules/core-js/internals/is-object.js ***! - \*****************************************************/ -/*! no static exports found */ -/***/ (function(module, exports) { - -module.exports = function (it) { - return typeof it === 'object' ? it !== null : typeof it === 'function'; -}; - - -/***/ }), - -/***/ "./node_modules/core-js/internals/is-pure.js": -/*!***************************************************!*\ - !*** ./node_modules/core-js/internals/is-pure.js ***! - \***************************************************/ -/*! no static exports found */ -/***/ (function(module, exports) { - -module.exports = false; - - -/***/ }), - -/***/ "./node_modules/core-js/internals/iterate.js": -/*!***************************************************!*\ - !*** ./node_modules/core-js/internals/iterate.js ***! - \***************************************************/ -/*! no static exports found */ -/***/ (function(module, exports, __webpack_require__) { - -var anObject = __webpack_require__(/*! ../internals/an-object */ "./node_modules/core-js/internals/an-object.js"); -var isArrayIteratorMethod = __webpack_require__(/*! ../internals/is-array-iterator-method */ "./node_modules/core-js/internals/is-array-iterator-method.js"); -var toLength = __webpack_require__(/*! ../internals/to-length */ "./node_modules/core-js/internals/to-length.js"); -var bind = __webpack_require__(/*! ../internals/bind-context */ "./node_modules/core-js/internals/bind-context.js"); -var getIteratorMethod = __webpack_require__(/*! ../internals/get-iterator-method */ "./node_modules/core-js/internals/get-iterator-method.js"); -var callWithSafeIterationClosing = __webpack_require__(/*! ../internals/call-with-safe-iteration-closing */ "./node_modules/core-js/internals/call-with-safe-iteration-closing.js"); - -var Result = function (stopped, result) { - this.stopped = stopped; - this.result = result; -}; - -var iterate = module.exports = function (iterable, fn, that, AS_ENTRIES, IS_ITERATOR) { - var boundFunction = bind(fn, that, AS_ENTRIES ? 2 : 1); - var iterator, iterFn, index, length, result, next, step; - - if (IS_ITERATOR) { - iterator = iterable; - } else { - iterFn = getIteratorMethod(iterable); - if (typeof iterFn != 'function') throw TypeError('Target is not iterable'); - // optimisation for array iterators - if (isArrayIteratorMethod(iterFn)) { - for (index = 0, length = toLength(iterable.length); length > index; index++) { - result = AS_ENTRIES - ? boundFunction(anObject(step = iterable[index])[0], step[1]) - : boundFunction(iterable[index]); - if (result && result instanceof Result) return result; - } return new Result(false); - } - iterator = iterFn.call(iterable); - } - - next = iterator.next; - while (!(step = next.call(iterator)).done) { - result = callWithSafeIterationClosing(iterator, boundFunction, step.value, AS_ENTRIES); - if (typeof result == 'object' && result && result instanceof Result) return result; - } return new Result(false); -}; - -iterate.stop = function (result) { - return new Result(true, result); -}; - - -/***/ }), - -/***/ "./node_modules/core-js/internals/iterators-core.js": -/*!**********************************************************!*\ - !*** ./node_modules/core-js/internals/iterators-core.js ***! - \**********************************************************/ -/*! no static exports found */ -/***/ (function(module, exports, __webpack_require__) { - -"use strict"; - -var getPrototypeOf = __webpack_require__(/*! ../internals/object-get-prototype-of */ "./node_modules/core-js/internals/object-get-prototype-of.js"); -var createNonEnumerableProperty = __webpack_require__(/*! ../internals/create-non-enumerable-property */ "./node_modules/core-js/internals/create-non-enumerable-property.js"); -var has = __webpack_require__(/*! ../internals/has */ "./node_modules/core-js/internals/has.js"); -var wellKnownSymbol = __webpack_require__(/*! ../internals/well-known-symbol */ "./node_modules/core-js/internals/well-known-symbol.js"); -var IS_PURE = __webpack_require__(/*! ../internals/is-pure */ "./node_modules/core-js/internals/is-pure.js"); - -var ITERATOR = wellKnownSymbol('iterator'); -var BUGGY_SAFARI_ITERATORS = false; - -var returnThis = function () { return this; }; - -// `%IteratorPrototype%` object -// https://tc39.github.io/ecma262/#sec-%iteratorprototype%-object -var IteratorPrototype, PrototypeOfArrayIteratorPrototype, arrayIterator; - -if ([].keys) { - arrayIterator = [].keys(); - // Safari 8 has buggy iterators w/o `next` - if (!('next' in arrayIterator)) BUGGY_SAFARI_ITERATORS = true; - else { - PrototypeOfArrayIteratorPrototype = getPrototypeOf(getPrototypeOf(arrayIterator)); - if (PrototypeOfArrayIteratorPrototype !== Object.prototype) IteratorPrototype = PrototypeOfArrayIteratorPrototype; - } -} - -if (IteratorPrototype == undefined) IteratorPrototype = {}; - -// 25.1.2.1.1 %IteratorPrototype%[@@iterator]() -if (!IS_PURE && !has(IteratorPrototype, ITERATOR)) { - createNonEnumerableProperty(IteratorPrototype, ITERATOR, returnThis); -} - -module.exports = { - IteratorPrototype: IteratorPrototype, - BUGGY_SAFARI_ITERATORS: BUGGY_SAFARI_ITERATORS -}; - - -/***/ }), - -/***/ "./node_modules/core-js/internals/iterators.js": -/*!*****************************************************!*\ - !*** ./node_modules/core-js/internals/iterators.js ***! - \*****************************************************/ -/*! no static exports found */ -/***/ (function(module, exports) { - -module.exports = {}; - - -/***/ }), - -/***/ "./node_modules/core-js/internals/microtask.js": -/*!*****************************************************!*\ - !*** ./node_modules/core-js/internals/microtask.js ***! - \*****************************************************/ -/*! no static exports found */ -/***/ (function(module, exports, __webpack_require__) { - -var global = __webpack_require__(/*! ../internals/global */ "./node_modules/core-js/internals/global.js"); -var getOwnPropertyDescriptor = __webpack_require__(/*! ../internals/object-get-own-property-descriptor */ "./node_modules/core-js/internals/object-get-own-property-descriptor.js").f; -var classof = __webpack_require__(/*! ../internals/classof-raw */ "./node_modules/core-js/internals/classof-raw.js"); -var macrotask = __webpack_require__(/*! ../internals/task */ "./node_modules/core-js/internals/task.js").set; -var userAgent = __webpack_require__(/*! ../internals/user-agent */ "./node_modules/core-js/internals/user-agent.js"); - -var MutationObserver = global.MutationObserver || global.WebKitMutationObserver; -var process = global.process; -var Promise = global.Promise; -var IS_NODE = classof(process) == 'process'; -// Node.js 11 shows ExperimentalWarning on getting `queueMicrotask` -var queueMicrotaskDescriptor = getOwnPropertyDescriptor(global, 'queueMicrotask'); -var queueMicrotask = queueMicrotaskDescriptor && queueMicrotaskDescriptor.value; - -var flush, head, last, notify, toggle, node, promise, then; - -// modern engines have queueMicrotask method -if (!queueMicrotask) { - flush = function () { - var parent, fn; - if (IS_NODE && (parent = process.domain)) parent.exit(); - while (head) { - fn = head.fn; - head = head.next; - try { - fn(); - } catch (error) { - if (head) notify(); - else last = undefined; - throw error; - } - } last = undefined; - if (parent) parent.enter(); - }; - - // Node.js - if (IS_NODE) { - notify = function () { - process.nextTick(flush); - }; - // browsers with MutationObserver, except iOS - https://github.com/zloirock/core-js/issues/339 - } else if (MutationObserver && !/(iphone|ipod|ipad).*applewebkit/i.test(userAgent)) { - toggle = true; - node = document.createTextNode(''); - new MutationObserver(flush).observe(node, { characterData: true }); - notify = function () { - node.data = toggle = !toggle; - }; - // environments with maybe non-completely correct, but existent Promise - } else if (Promise && Promise.resolve) { - // Promise.resolve without an argument throws an error in LG WebOS 2 - promise = Promise.resolve(undefined); - then = promise.then; - notify = function () { - then.call(promise, flush); - }; - // for other environments - macrotask based on: - // - setImmediate - // - MessageChannel - // - window.postMessag - // - onreadystatechange - // - setTimeout - } else { - notify = function () { - // strange IE + webpack dev server bug - use .call(global) - macrotask.call(global, flush); - }; - } -} - -module.exports = queueMicrotask || function (fn) { - var task = { fn: fn, next: undefined }; - if (last) last.next = task; - if (!head) { - head = task; - notify(); - } last = task; -}; - - -/***/ }), - -/***/ "./node_modules/core-js/internals/native-promise-constructor.js": -/*!**********************************************************************!*\ - !*** ./node_modules/core-js/internals/native-promise-constructor.js ***! - \**********************************************************************/ -/*! no static exports found */ -/***/ (function(module, exports, __webpack_require__) { - -var global = __webpack_require__(/*! ../internals/global */ "./node_modules/core-js/internals/global.js"); - -module.exports = global.Promise; - - -/***/ }), - -/***/ "./node_modules/core-js/internals/native-symbol.js": -/*!*********************************************************!*\ - !*** ./node_modules/core-js/internals/native-symbol.js ***! - \*********************************************************/ -/*! no static exports found */ -/***/ (function(module, exports, __webpack_require__) { - -var fails = __webpack_require__(/*! ../internals/fails */ "./node_modules/core-js/internals/fails.js"); - -module.exports = !!Object.getOwnPropertySymbols && !fails(function () { - // Chrome 38 Symbol has incorrect toString conversion - // eslint-disable-next-line no-undef - return !String(Symbol()); -}); - - -/***/ }), - -/***/ "./node_modules/core-js/internals/native-url.js": -/*!******************************************************!*\ - !*** ./node_modules/core-js/internals/native-url.js ***! - \******************************************************/ -/*! no static exports found */ -/***/ (function(module, exports, __webpack_require__) { - -var fails = __webpack_require__(/*! ../internals/fails */ "./node_modules/core-js/internals/fails.js"); -var wellKnownSymbol = __webpack_require__(/*! ../internals/well-known-symbol */ "./node_modules/core-js/internals/well-known-symbol.js"); -var IS_PURE = __webpack_require__(/*! ../internals/is-pure */ "./node_modules/core-js/internals/is-pure.js"); - -var ITERATOR = wellKnownSymbol('iterator'); - -module.exports = !fails(function () { - var url = new URL('b?a=1&b=2&c=3', 'http://a'); - var searchParams = url.searchParams; - var result = ''; - url.pathname = 'c%20d'; - searchParams.forEach(function (value, key) { - searchParams['delete']('b'); - result += key + value; - }); - return (IS_PURE && !url.toJSON) - || !searchParams.sort - || url.href !== 'http://a/c%20d?a=1&c=3' - || searchParams.get('c') !== '3' - || String(new URLSearchParams('?a=1')) !== 'a=1' - || !searchParams[ITERATOR] - // throws in Edge - || new URL('https://a@b').username !== 'a' - || new URLSearchParams(new URLSearchParams('a=b')).get('a') !== 'b' - // not punycoded in Edge - || new URL('http://тест').host !== 'xn--e1aybc' - // not escaped in Chrome 62- - || new URL('http://a#б').hash !== '#%D0%B1' - // fails in Chrome 66- - || result !== 'a1c3' - // throws in Safari - || new URL('http://x', undefined).host !== 'x'; -}); - - -/***/ }), - -/***/ "./node_modules/core-js/internals/native-weak-map.js": -/*!***********************************************************!*\ - !*** ./node_modules/core-js/internals/native-weak-map.js ***! - \***********************************************************/ -/*! no static exports found */ -/***/ (function(module, exports, __webpack_require__) { - -var global = __webpack_require__(/*! ../internals/global */ "./node_modules/core-js/internals/global.js"); -var nativeFunctionToString = __webpack_require__(/*! ../internals/function-to-string */ "./node_modules/core-js/internals/function-to-string.js"); - -var WeakMap = global.WeakMap; - -module.exports = typeof WeakMap === 'function' && /native code/.test(nativeFunctionToString.call(WeakMap)); - - -/***/ }), - -/***/ "./node_modules/core-js/internals/new-promise-capability.js": -/*!******************************************************************!*\ - !*** ./node_modules/core-js/internals/new-promise-capability.js ***! - \******************************************************************/ -/*! no static exports found */ -/***/ (function(module, exports, __webpack_require__) { - -"use strict"; - -var aFunction = __webpack_require__(/*! ../internals/a-function */ "./node_modules/core-js/internals/a-function.js"); - -var PromiseCapability = function (C) { - var resolve, reject; - this.promise = new C(function ($$resolve, $$reject) { - if (resolve !== undefined || reject !== undefined) throw TypeError('Bad Promise constructor'); - resolve = $$resolve; - reject = $$reject; - }); - this.resolve = aFunction(resolve); - this.reject = aFunction(reject); -}; - -// 25.4.1.5 NewPromiseCapability(C) -module.exports.f = function (C) { - return new PromiseCapability(C); -}; - - -/***/ }), - -/***/ "./node_modules/core-js/internals/object-assign.js": -/*!*********************************************************!*\ - !*** ./node_modules/core-js/internals/object-assign.js ***! - \*********************************************************/ -/*! no static exports found */ -/***/ (function(module, exports, __webpack_require__) { - -"use strict"; - -var DESCRIPTORS = __webpack_require__(/*! ../internals/descriptors */ "./node_modules/core-js/internals/descriptors.js"); -var fails = __webpack_require__(/*! ../internals/fails */ "./node_modules/core-js/internals/fails.js"); -var objectKeys = __webpack_require__(/*! ../internals/object-keys */ "./node_modules/core-js/internals/object-keys.js"); -var getOwnPropertySymbolsModule = __webpack_require__(/*! ../internals/object-get-own-property-symbols */ "./node_modules/core-js/internals/object-get-own-property-symbols.js"); -var propertyIsEnumerableModule = __webpack_require__(/*! ../internals/object-property-is-enumerable */ "./node_modules/core-js/internals/object-property-is-enumerable.js"); -var toObject = __webpack_require__(/*! ../internals/to-object */ "./node_modules/core-js/internals/to-object.js"); -var IndexedObject = __webpack_require__(/*! ../internals/indexed-object */ "./node_modules/core-js/internals/indexed-object.js"); - -var nativeAssign = Object.assign; - -// `Object.assign` method -// https://tc39.github.io/ecma262/#sec-object.assign -// should work with symbols and should have deterministic property order (V8 bug) -module.exports = !nativeAssign || fails(function () { - var A = {}; - var B = {}; - // eslint-disable-next-line no-undef - var symbol = Symbol(); - var alphabet = 'abcdefghijklmnopqrst'; - A[symbol] = 7; - alphabet.split('').forEach(function (chr) { B[chr] = chr; }); - return nativeAssign({}, A)[symbol] != 7 || objectKeys(nativeAssign({}, B)).join('') != alphabet; -}) ? function assign(target, source) { // eslint-disable-line no-unused-vars - var T = toObject(target); - var argumentsLength = arguments.length; - var index = 1; - var getOwnPropertySymbols = getOwnPropertySymbolsModule.f; - var propertyIsEnumerable = propertyIsEnumerableModule.f; - while (argumentsLength > index) { - var S = IndexedObject(arguments[index++]); - var keys = getOwnPropertySymbols ? objectKeys(S).concat(getOwnPropertySymbols(S)) : objectKeys(S); - var length = keys.length; - var j = 0; - var key; - while (length > j) { - key = keys[j++]; - if (!DESCRIPTORS || propertyIsEnumerable.call(S, key)) T[key] = S[key]; - } - } return T; -} : nativeAssign; - - -/***/ }), - -/***/ "./node_modules/core-js/internals/object-create.js": -/*!*********************************************************!*\ - !*** ./node_modules/core-js/internals/object-create.js ***! - \*********************************************************/ -/*! no static exports found */ -/***/ (function(module, exports, __webpack_require__) { - -var anObject = __webpack_require__(/*! ../internals/an-object */ "./node_modules/core-js/internals/an-object.js"); -var defineProperties = __webpack_require__(/*! ../internals/object-define-properties */ "./node_modules/core-js/internals/object-define-properties.js"); -var enumBugKeys = __webpack_require__(/*! ../internals/enum-bug-keys */ "./node_modules/core-js/internals/enum-bug-keys.js"); -var hiddenKeys = __webpack_require__(/*! ../internals/hidden-keys */ "./node_modules/core-js/internals/hidden-keys.js"); -var html = __webpack_require__(/*! ../internals/html */ "./node_modules/core-js/internals/html.js"); -var documentCreateElement = __webpack_require__(/*! ../internals/document-create-element */ "./node_modules/core-js/internals/document-create-element.js"); -var sharedKey = __webpack_require__(/*! ../internals/shared-key */ "./node_modules/core-js/internals/shared-key.js"); -var IE_PROTO = sharedKey('IE_PROTO'); - -var PROTOTYPE = 'prototype'; -var Empty = function () { /* empty */ }; - -// Create object with fake `null` prototype: use iframe Object with cleared prototype -var createDict = function () { - // Thrash, waste and sodomy: IE GC bug - var iframe = documentCreateElement('iframe'); - var length = enumBugKeys.length; - var lt = '<'; - var script = 'script'; - var gt = '>'; - var js = 'java' + script + ':'; - var iframeDocument; - iframe.style.display = 'none'; - html.appendChild(iframe); - iframe.src = String(js); - iframeDocument = iframe.contentWindow.document; - iframeDocument.open(); - iframeDocument.write(lt + script + gt + 'document.F=Object' + lt + '/' + script + gt); - iframeDocument.close(); - createDict = iframeDocument.F; - while (length--) delete createDict[PROTOTYPE][enumBugKeys[length]]; - return createDict(); -}; - -// `Object.create` method -// https://tc39.github.io/ecma262/#sec-object.create -module.exports = Object.create || function create(O, Properties) { - var result; - if (O !== null) { - Empty[PROTOTYPE] = anObject(O); - result = new Empty(); - Empty[PROTOTYPE] = null; - // add "__proto__" for Object.getPrototypeOf polyfill - result[IE_PROTO] = O; - } else result = createDict(); - return Properties === undefined ? result : defineProperties(result, Properties); -}; - -hiddenKeys[IE_PROTO] = true; - - -/***/ }), - -/***/ "./node_modules/core-js/internals/object-define-properties.js": -/*!********************************************************************!*\ - !*** ./node_modules/core-js/internals/object-define-properties.js ***! - \********************************************************************/ -/*! no static exports found */ -/***/ (function(module, exports, __webpack_require__) { - -var DESCRIPTORS = __webpack_require__(/*! ../internals/descriptors */ "./node_modules/core-js/internals/descriptors.js"); -var definePropertyModule = __webpack_require__(/*! ../internals/object-define-property */ "./node_modules/core-js/internals/object-define-property.js"); -var anObject = __webpack_require__(/*! ../internals/an-object */ "./node_modules/core-js/internals/an-object.js"); -var objectKeys = __webpack_require__(/*! ../internals/object-keys */ "./node_modules/core-js/internals/object-keys.js"); - -// `Object.defineProperties` method -// https://tc39.github.io/ecma262/#sec-object.defineproperties -module.exports = DESCRIPTORS ? Object.defineProperties : function defineProperties(O, Properties) { - anObject(O); - var keys = objectKeys(Properties); - var length = keys.length; - var index = 0; - var key; - while (length > index) definePropertyModule.f(O, key = keys[index++], Properties[key]); - return O; -}; - - -/***/ }), - -/***/ "./node_modules/core-js/internals/object-define-property.js": -/*!******************************************************************!*\ - !*** ./node_modules/core-js/internals/object-define-property.js ***! - \******************************************************************/ -/*! no static exports found */ -/***/ (function(module, exports, __webpack_require__) { - -var DESCRIPTORS = __webpack_require__(/*! ../internals/descriptors */ "./node_modules/core-js/internals/descriptors.js"); -var IE8_DOM_DEFINE = __webpack_require__(/*! ../internals/ie8-dom-define */ "./node_modules/core-js/internals/ie8-dom-define.js"); -var anObject = __webpack_require__(/*! ../internals/an-object */ "./node_modules/core-js/internals/an-object.js"); -var toPrimitive = __webpack_require__(/*! ../internals/to-primitive */ "./node_modules/core-js/internals/to-primitive.js"); - -var nativeDefineProperty = Object.defineProperty; - -// `Object.defineProperty` method -// https://tc39.github.io/ecma262/#sec-object.defineproperty -exports.f = DESCRIPTORS ? nativeDefineProperty : function defineProperty(O, P, Attributes) { - anObject(O); - P = toPrimitive(P, true); - anObject(Attributes); - if (IE8_DOM_DEFINE) try { - return nativeDefineProperty(O, P, Attributes); - } catch (error) { /* empty */ } - if ('get' in Attributes || 'set' in Attributes) throw TypeError('Accessors not supported'); - if ('value' in Attributes) O[P] = Attributes.value; - return O; -}; - - -/***/ }), - -/***/ "./node_modules/core-js/internals/object-get-own-property-descriptor.js": -/*!******************************************************************************!*\ - !*** ./node_modules/core-js/internals/object-get-own-property-descriptor.js ***! - \******************************************************************************/ -/*! no static exports found */ -/***/ (function(module, exports, __webpack_require__) { - -var DESCRIPTORS = __webpack_require__(/*! ../internals/descriptors */ "./node_modules/core-js/internals/descriptors.js"); -var propertyIsEnumerableModule = __webpack_require__(/*! ../internals/object-property-is-enumerable */ "./node_modules/core-js/internals/object-property-is-enumerable.js"); -var createPropertyDescriptor = __webpack_require__(/*! ../internals/create-property-descriptor */ "./node_modules/core-js/internals/create-property-descriptor.js"); -var toIndexedObject = __webpack_require__(/*! ../internals/to-indexed-object */ "./node_modules/core-js/internals/to-indexed-object.js"); -var toPrimitive = __webpack_require__(/*! ../internals/to-primitive */ "./node_modules/core-js/internals/to-primitive.js"); -var has = __webpack_require__(/*! ../internals/has */ "./node_modules/core-js/internals/has.js"); -var IE8_DOM_DEFINE = __webpack_require__(/*! ../internals/ie8-dom-define */ "./node_modules/core-js/internals/ie8-dom-define.js"); - -var nativeGetOwnPropertyDescriptor = Object.getOwnPropertyDescriptor; - -// `Object.getOwnPropertyDescriptor` method -// https://tc39.github.io/ecma262/#sec-object.getownpropertydescriptor -exports.f = DESCRIPTORS ? nativeGetOwnPropertyDescriptor : function getOwnPropertyDescriptor(O, P) { - O = toIndexedObject(O); - P = toPrimitive(P, true); - if (IE8_DOM_DEFINE) try { - return nativeGetOwnPropertyDescriptor(O, P); - } catch (error) { /* empty */ } - if (has(O, P)) return createPropertyDescriptor(!propertyIsEnumerableModule.f.call(O, P), O[P]); -}; - - -/***/ }), - -/***/ "./node_modules/core-js/internals/object-get-own-property-names.js": -/*!*************************************************************************!*\ - !*** ./node_modules/core-js/internals/object-get-own-property-names.js ***! - \*************************************************************************/ -/*! no static exports found */ -/***/ (function(module, exports, __webpack_require__) { - -var internalObjectKeys = __webpack_require__(/*! ../internals/object-keys-internal */ "./node_modules/core-js/internals/object-keys-internal.js"); -var enumBugKeys = __webpack_require__(/*! ../internals/enum-bug-keys */ "./node_modules/core-js/internals/enum-bug-keys.js"); - -var hiddenKeys = enumBugKeys.concat('length', 'prototype'); - -// `Object.getOwnPropertyNames` method -// https://tc39.github.io/ecma262/#sec-object.getownpropertynames -exports.f = Object.getOwnPropertyNames || function getOwnPropertyNames(O) { - return internalObjectKeys(O, hiddenKeys); -}; - - -/***/ }), - -/***/ "./node_modules/core-js/internals/object-get-own-property-symbols.js": -/*!***************************************************************************!*\ - !*** ./node_modules/core-js/internals/object-get-own-property-symbols.js ***! - \***************************************************************************/ -/*! no static exports found */ -/***/ (function(module, exports) { - -exports.f = Object.getOwnPropertySymbols; - - -/***/ }), - -/***/ "./node_modules/core-js/internals/object-get-prototype-of.js": -/*!*******************************************************************!*\ - !*** ./node_modules/core-js/internals/object-get-prototype-of.js ***! - \*******************************************************************/ -/*! no static exports found */ -/***/ (function(module, exports, __webpack_require__) { - -var has = __webpack_require__(/*! ../internals/has */ "./node_modules/core-js/internals/has.js"); -var toObject = __webpack_require__(/*! ../internals/to-object */ "./node_modules/core-js/internals/to-object.js"); -var sharedKey = __webpack_require__(/*! ../internals/shared-key */ "./node_modules/core-js/internals/shared-key.js"); -var CORRECT_PROTOTYPE_GETTER = __webpack_require__(/*! ../internals/correct-prototype-getter */ "./node_modules/core-js/internals/correct-prototype-getter.js"); - -var IE_PROTO = sharedKey('IE_PROTO'); -var ObjectPrototype = Object.prototype; - -// `Object.getPrototypeOf` method -// https://tc39.github.io/ecma262/#sec-object.getprototypeof -module.exports = CORRECT_PROTOTYPE_GETTER ? Object.getPrototypeOf : function (O) { - O = toObject(O); - if (has(O, IE_PROTO)) return O[IE_PROTO]; - if (typeof O.constructor == 'function' && O instanceof O.constructor) { - return O.constructor.prototype; - } return O instanceof Object ? ObjectPrototype : null; -}; - - -/***/ }), - -/***/ "./node_modules/core-js/internals/object-keys-internal.js": -/*!****************************************************************!*\ - !*** ./node_modules/core-js/internals/object-keys-internal.js ***! - \****************************************************************/ -/*! no static exports found */ -/***/ (function(module, exports, __webpack_require__) { - -var has = __webpack_require__(/*! ../internals/has */ "./node_modules/core-js/internals/has.js"); -var toIndexedObject = __webpack_require__(/*! ../internals/to-indexed-object */ "./node_modules/core-js/internals/to-indexed-object.js"); -var indexOf = __webpack_require__(/*! ../internals/array-includes */ "./node_modules/core-js/internals/array-includes.js").indexOf; -var hiddenKeys = __webpack_require__(/*! ../internals/hidden-keys */ "./node_modules/core-js/internals/hidden-keys.js"); - -module.exports = function (object, names) { - var O = toIndexedObject(object); - var i = 0; - var result = []; - var key; - for (key in O) !has(hiddenKeys, key) && has(O, key) && result.push(key); - // Don't enum bug & hidden keys - while (names.length > i) if (has(O, key = names[i++])) { - ~indexOf(result, key) || result.push(key); - } - return result; -}; - - -/***/ }), - -/***/ "./node_modules/core-js/internals/object-keys.js": -/*!*******************************************************!*\ - !*** ./node_modules/core-js/internals/object-keys.js ***! - \*******************************************************/ -/*! no static exports found */ -/***/ (function(module, exports, __webpack_require__) { - -var internalObjectKeys = __webpack_require__(/*! ../internals/object-keys-internal */ "./node_modules/core-js/internals/object-keys-internal.js"); -var enumBugKeys = __webpack_require__(/*! ../internals/enum-bug-keys */ "./node_modules/core-js/internals/enum-bug-keys.js"); - -// `Object.keys` method -// https://tc39.github.io/ecma262/#sec-object.keys -module.exports = Object.keys || function keys(O) { - return internalObjectKeys(O, enumBugKeys); -}; - - -/***/ }), - -/***/ "./node_modules/core-js/internals/object-property-is-enumerable.js": -/*!*************************************************************************!*\ - !*** ./node_modules/core-js/internals/object-property-is-enumerable.js ***! - \*************************************************************************/ -/*! no static exports found */ -/***/ (function(module, exports, __webpack_require__) { - -"use strict"; - -var nativePropertyIsEnumerable = {}.propertyIsEnumerable; -var getOwnPropertyDescriptor = Object.getOwnPropertyDescriptor; - -// Nashorn ~ JDK8 bug -var NASHORN_BUG = getOwnPropertyDescriptor && !nativePropertyIsEnumerable.call({ 1: 2 }, 1); - -// `Object.prototype.propertyIsEnumerable` method implementation -// https://tc39.github.io/ecma262/#sec-object.prototype.propertyisenumerable -exports.f = NASHORN_BUG ? function propertyIsEnumerable(V) { - var descriptor = getOwnPropertyDescriptor(this, V); - return !!descriptor && descriptor.enumerable; -} : nativePropertyIsEnumerable; - - -/***/ }), - -/***/ "./node_modules/core-js/internals/object-set-prototype-of.js": -/*!*******************************************************************!*\ - !*** ./node_modules/core-js/internals/object-set-prototype-of.js ***! - \*******************************************************************/ -/*! no static exports found */ -/***/ (function(module, exports, __webpack_require__) { - -var anObject = __webpack_require__(/*! ../internals/an-object */ "./node_modules/core-js/internals/an-object.js"); -var aPossiblePrototype = __webpack_require__(/*! ../internals/a-possible-prototype */ "./node_modules/core-js/internals/a-possible-prototype.js"); - -// `Object.setPrototypeOf` method -// https://tc39.github.io/ecma262/#sec-object.setprototypeof -// Works with __proto__ only. Old v8 can't work with null proto objects. -/* eslint-disable no-proto */ -module.exports = Object.setPrototypeOf || ('__proto__' in {} ? function () { - var CORRECT_SETTER = false; - var test = {}; - var setter; - try { - setter = Object.getOwnPropertyDescriptor(Object.prototype, '__proto__').set; - setter.call(test, []); - CORRECT_SETTER = test instanceof Array; - } catch (error) { /* empty */ } - return function setPrototypeOf(O, proto) { - anObject(O); - aPossiblePrototype(proto); - if (CORRECT_SETTER) setter.call(O, proto); - else O.__proto__ = proto; - return O; - }; -}() : undefined); - - -/***/ }), - -/***/ "./node_modules/core-js/internals/own-keys.js": -/*!****************************************************!*\ - !*** ./node_modules/core-js/internals/own-keys.js ***! - \****************************************************/ -/*! no static exports found */ -/***/ (function(module, exports, __webpack_require__) { - -var getBuiltIn = __webpack_require__(/*! ../internals/get-built-in */ "./node_modules/core-js/internals/get-built-in.js"); -var getOwnPropertyNamesModule = __webpack_require__(/*! ../internals/object-get-own-property-names */ "./node_modules/core-js/internals/object-get-own-property-names.js"); -var getOwnPropertySymbolsModule = __webpack_require__(/*! ../internals/object-get-own-property-symbols */ "./node_modules/core-js/internals/object-get-own-property-symbols.js"); -var anObject = __webpack_require__(/*! ../internals/an-object */ "./node_modules/core-js/internals/an-object.js"); - -// all object keys, includes non-enumerable and symbols -module.exports = getBuiltIn('Reflect', 'ownKeys') || function ownKeys(it) { - var keys = getOwnPropertyNamesModule.f(anObject(it)); - var getOwnPropertySymbols = getOwnPropertySymbolsModule.f; - return getOwnPropertySymbols ? keys.concat(getOwnPropertySymbols(it)) : keys; -}; - - -/***/ }), - -/***/ "./node_modules/core-js/internals/path.js": -/*!************************************************!*\ - !*** ./node_modules/core-js/internals/path.js ***! - \************************************************/ -/*! no static exports found */ -/***/ (function(module, exports, __webpack_require__) { - -module.exports = __webpack_require__(/*! ../internals/global */ "./node_modules/core-js/internals/global.js"); - - -/***/ }), - -/***/ "./node_modules/core-js/internals/perform.js": -/*!***************************************************!*\ - !*** ./node_modules/core-js/internals/perform.js ***! - \***************************************************/ -/*! no static exports found */ -/***/ (function(module, exports) { - -module.exports = function (exec) { - try { - return { error: false, value: exec() }; - } catch (error) { - return { error: true, value: error }; - } -}; - - -/***/ }), - -/***/ "./node_modules/core-js/internals/promise-resolve.js": -/*!***********************************************************!*\ - !*** ./node_modules/core-js/internals/promise-resolve.js ***! - \***********************************************************/ -/*! no static exports found */ -/***/ (function(module, exports, __webpack_require__) { - -var anObject = __webpack_require__(/*! ../internals/an-object */ "./node_modules/core-js/internals/an-object.js"); -var isObject = __webpack_require__(/*! ../internals/is-object */ "./node_modules/core-js/internals/is-object.js"); -var newPromiseCapability = __webpack_require__(/*! ../internals/new-promise-capability */ "./node_modules/core-js/internals/new-promise-capability.js"); - -module.exports = function (C, x) { - anObject(C); - if (isObject(x) && x.constructor === C) return x; - var promiseCapability = newPromiseCapability.f(C); - var resolve = promiseCapability.resolve; - resolve(x); - return promiseCapability.promise; -}; - - -/***/ }), - -/***/ "./node_modules/core-js/internals/punycode-to-ascii.js": -/*!*************************************************************!*\ - !*** ./node_modules/core-js/internals/punycode-to-ascii.js ***! - \*************************************************************/ -/*! no static exports found */ -/***/ (function(module, exports, __webpack_require__) { - -"use strict"; - -// based on https://github.com/bestiejs/punycode.js/blob/master/punycode.js -var maxInt = 2147483647; // aka. 0x7FFFFFFF or 2^31-1 -var base = 36; -var tMin = 1; -var tMax = 26; -var skew = 38; -var damp = 700; -var initialBias = 72; -var initialN = 128; // 0x80 -var delimiter = '-'; // '\x2D' -var regexNonASCII = /[^\0-\u007E]/; // non-ASCII chars -var regexSeparators = /[.\u3002\uFF0E\uFF61]/g; // RFC 3490 separators -var OVERFLOW_ERROR = 'Overflow: input needs wider integers to process'; -var baseMinusTMin = base - tMin; -var floor = Math.floor; -var stringFromCharCode = String.fromCharCode; - -/** - * Creates an array containing the numeric code points of each Unicode - * character in the string. While JavaScript uses UCS-2 internally, - * this function will convert a pair of surrogate halves (each of which - * UCS-2 exposes as separate characters) into a single code point, - * matching UTF-16. - */ -var ucs2decode = function (string) { - var output = []; - var counter = 0; - var length = string.length; - while (counter < length) { - var value = string.charCodeAt(counter++); - if (value >= 0xD800 && value <= 0xDBFF && counter < length) { - // It's a high surrogate, and there is a next character. - var extra = string.charCodeAt(counter++); - if ((extra & 0xFC00) == 0xDC00) { // Low surrogate. - output.push(((value & 0x3FF) << 10) + (extra & 0x3FF) + 0x10000); - } else { - // It's an unmatched surrogate; only append this code unit, in case the - // next code unit is the high surrogate of a surrogate pair. - output.push(value); - counter--; - } - } else { - output.push(value); - } - } - return output; -}; - -/** - * Converts a digit/integer into a basic code point. - */ -var digitToBasic = function (digit) { - // 0..25 map to ASCII a..z or A..Z - // 26..35 map to ASCII 0..9 - return digit + 22 + 75 * (digit < 26); -}; - -/** - * Bias adaptation function as per section 3.4 of RFC 3492. - * https://tools.ietf.org/html/rfc3492#section-3.4 - */ -var adapt = function (delta, numPoints, firstTime) { - var k = 0; - delta = firstTime ? floor(delta / damp) : delta >> 1; - delta += floor(delta / numPoints); - for (; delta > baseMinusTMin * tMax >> 1; k += base) { - delta = floor(delta / baseMinusTMin); - } - return floor(k + (baseMinusTMin + 1) * delta / (delta + skew)); -}; - -/** - * Converts a string of Unicode symbols (e.g. a domain name label) to a - * Punycode string of ASCII-only symbols. - */ -// eslint-disable-next-line max-statements -var encode = function (input) { - var output = []; - - // Convert the input in UCS-2 to an array of Unicode code points. - input = ucs2decode(input); - - // Cache the length. - var inputLength = input.length; - - // Initialize the state. - var n = initialN; - var delta = 0; - var bias = initialBias; - var i, currentValue; - - // Handle the basic code points. - for (i = 0; i < input.length; i++) { - currentValue = input[i]; - if (currentValue < 0x80) { - output.push(stringFromCharCode(currentValue)); - } - } - - var basicLength = output.length; // number of basic code points. - var handledCPCount = basicLength; // number of code points that have been handled; - - // Finish the basic string with a delimiter unless it's empty. - if (basicLength) { - output.push(delimiter); - } - - // Main encoding loop: - while (handledCPCount < inputLength) { - // All non-basic code points < n have been handled already. Find the next larger one: - var m = maxInt; - for (i = 0; i < input.length; i++) { - currentValue = input[i]; - if (currentValue >= n && currentValue < m) { - m = currentValue; - } - } - - // Increase `delta` enough to advance the decoder's state to , but guard against overflow. - var handledCPCountPlusOne = handledCPCount + 1; - if (m - n > floor((maxInt - delta) / handledCPCountPlusOne)) { - throw RangeError(OVERFLOW_ERROR); - } - - delta += (m - n) * handledCPCountPlusOne; - n = m; - - for (i = 0; i < input.length; i++) { - currentValue = input[i]; - if (currentValue < n && ++delta > maxInt) { - throw RangeError(OVERFLOW_ERROR); - } - if (currentValue == n) { - // Represent delta as a generalized variable-length integer. - var q = delta; - for (var k = base; /* no condition */; k += base) { - var t = k <= bias ? tMin : (k >= bias + tMax ? tMax : k - bias); - if (q < t) break; - var qMinusT = q - t; - var baseMinusT = base - t; - output.push(stringFromCharCode(digitToBasic(t + qMinusT % baseMinusT))); - q = floor(qMinusT / baseMinusT); - } - - output.push(stringFromCharCode(digitToBasic(q))); - bias = adapt(delta, handledCPCountPlusOne, handledCPCount == basicLength); - delta = 0; - ++handledCPCount; - } - } - - ++delta; - ++n; - } - return output.join(''); -}; - -module.exports = function (input) { - var encoded = []; - var labels = input.toLowerCase().replace(regexSeparators, '\u002E').split('.'); - var i, label; - for (i = 0; i < labels.length; i++) { - label = labels[i]; - encoded.push(regexNonASCII.test(label) ? 'xn--' + encode(label) : label); - } - return encoded.join('.'); -}; - - -/***/ }), - -/***/ "./node_modules/core-js/internals/redefine-all.js": -/*!********************************************************!*\ - !*** ./node_modules/core-js/internals/redefine-all.js ***! - \********************************************************/ -/*! no static exports found */ -/***/ (function(module, exports, __webpack_require__) { - -var redefine = __webpack_require__(/*! ../internals/redefine */ "./node_modules/core-js/internals/redefine.js"); - -module.exports = function (target, src, options) { - for (var key in src) redefine(target, key, src[key], options); - return target; -}; - - -/***/ }), - -/***/ "./node_modules/core-js/internals/redefine.js": -/*!****************************************************!*\ - !*** ./node_modules/core-js/internals/redefine.js ***! - \****************************************************/ -/*! no static exports found */ -/***/ (function(module, exports, __webpack_require__) { - -var global = __webpack_require__(/*! ../internals/global */ "./node_modules/core-js/internals/global.js"); -var shared = __webpack_require__(/*! ../internals/shared */ "./node_modules/core-js/internals/shared.js"); -var createNonEnumerableProperty = __webpack_require__(/*! ../internals/create-non-enumerable-property */ "./node_modules/core-js/internals/create-non-enumerable-property.js"); -var has = __webpack_require__(/*! ../internals/has */ "./node_modules/core-js/internals/has.js"); -var setGlobal = __webpack_require__(/*! ../internals/set-global */ "./node_modules/core-js/internals/set-global.js"); -var nativeFunctionToString = __webpack_require__(/*! ../internals/function-to-string */ "./node_modules/core-js/internals/function-to-string.js"); -var InternalStateModule = __webpack_require__(/*! ../internals/internal-state */ "./node_modules/core-js/internals/internal-state.js"); - -var getInternalState = InternalStateModule.get; -var enforceInternalState = InternalStateModule.enforce; -var TEMPLATE = String(nativeFunctionToString).split('toString'); - -shared('inspectSource', function (it) { - return nativeFunctionToString.call(it); -}); - -(module.exports = function (O, key, value, options) { - var unsafe = options ? !!options.unsafe : false; - var simple = options ? !!options.enumerable : false; - var noTargetGet = options ? !!options.noTargetGet : false; - if (typeof value == 'function') { - if (typeof key == 'string' && !has(value, 'name')) createNonEnumerableProperty(value, 'name', key); - enforceInternalState(value).source = TEMPLATE.join(typeof key == 'string' ? key : ''); - } - if (O === global) { - if (simple) O[key] = value; - else setGlobal(key, value); - return; - } else if (!unsafe) { - delete O[key]; - } else if (!noTargetGet && O[key]) { - simple = true; - } - if (simple) O[key] = value; - else createNonEnumerableProperty(O, key, value); -// add fake Function#toString for correct work wrapped methods / constructors with methods like LoDash isNative -})(Function.prototype, 'toString', function toString() { - return typeof this == 'function' && getInternalState(this).source || nativeFunctionToString.call(this); -}); - - -/***/ }), - -/***/ "./node_modules/core-js/internals/regexp-exec-abstract.js": -/*!****************************************************************!*\ - !*** ./node_modules/core-js/internals/regexp-exec-abstract.js ***! - \****************************************************************/ -/*! no static exports found */ -/***/ (function(module, exports, __webpack_require__) { - -var classof = __webpack_require__(/*! ./classof-raw */ "./node_modules/core-js/internals/classof-raw.js"); -var regexpExec = __webpack_require__(/*! ./regexp-exec */ "./node_modules/core-js/internals/regexp-exec.js"); - -// `RegExpExec` abstract operation -// https://tc39.github.io/ecma262/#sec-regexpexec -module.exports = function (R, S) { - var exec = R.exec; - if (typeof exec === 'function') { - var result = exec.call(R, S); - if (typeof result !== 'object') { - throw TypeError('RegExp exec method returned something other than an Object or null'); - } - return result; - } - - if (classof(R) !== 'RegExp') { - throw TypeError('RegExp#exec called on incompatible receiver'); - } - - return regexpExec.call(R, S); -}; - - - -/***/ }), - -/***/ "./node_modules/core-js/internals/regexp-exec.js": -/*!*******************************************************!*\ - !*** ./node_modules/core-js/internals/regexp-exec.js ***! - \*******************************************************/ -/*! no static exports found */ -/***/ (function(module, exports, __webpack_require__) { - -"use strict"; - -var regexpFlags = __webpack_require__(/*! ./regexp-flags */ "./node_modules/core-js/internals/regexp-flags.js"); - -var nativeExec = RegExp.prototype.exec; -// This always refers to the native implementation, because the -// String#replace polyfill uses ./fix-regexp-well-known-symbol-logic.js, -// which loads this file before patching the method. -var nativeReplace = String.prototype.replace; - -var patchedExec = nativeExec; - -var UPDATES_LAST_INDEX_WRONG = (function () { - var re1 = /a/; - var re2 = /b*/g; - nativeExec.call(re1, 'a'); - nativeExec.call(re2, 'a'); - return re1.lastIndex !== 0 || re2.lastIndex !== 0; -})(); - -// nonparticipating capturing group, copied from es5-shim's String#split patch. -var NPCG_INCLUDED = /()??/.exec('')[1] !== undefined; - -var PATCH = UPDATES_LAST_INDEX_WRONG || NPCG_INCLUDED; - -if (PATCH) { - patchedExec = function exec(str) { - var re = this; - var lastIndex, reCopy, match, i; - - if (NPCG_INCLUDED) { - reCopy = new RegExp('^' + re.source + '$(?!\\s)', regexpFlags.call(re)); - } - if (UPDATES_LAST_INDEX_WRONG) lastIndex = re.lastIndex; - - match = nativeExec.call(re, str); - - if (UPDATES_LAST_INDEX_WRONG && match) { - re.lastIndex = re.global ? match.index + match[0].length : lastIndex; - } - if (NPCG_INCLUDED && match && match.length > 1) { - // Fix browsers whose `exec` methods don't consistently return `undefined` - // for NPCG, like IE8. NOTE: This doesn' work for /(.?)?/ - nativeReplace.call(match[0], reCopy, function () { - for (i = 1; i < arguments.length - 2; i++) { - if (arguments[i] === undefined) match[i] = undefined; - } - }); - } - - return match; - }; -} - -module.exports = patchedExec; - - -/***/ }), - -/***/ "./node_modules/core-js/internals/regexp-flags.js": -/*!********************************************************!*\ - !*** ./node_modules/core-js/internals/regexp-flags.js ***! - \********************************************************/ -/*! no static exports found */ -/***/ (function(module, exports, __webpack_require__) { - -"use strict"; - -var anObject = __webpack_require__(/*! ../internals/an-object */ "./node_modules/core-js/internals/an-object.js"); - -// `RegExp.prototype.flags` getter implementation -// https://tc39.github.io/ecma262/#sec-get-regexp.prototype.flags -module.exports = function () { - var that = anObject(this); - var result = ''; - if (that.global) result += 'g'; - if (that.ignoreCase) result += 'i'; - if (that.multiline) result += 'm'; - if (that.dotAll) result += 's'; - if (that.unicode) result += 'u'; - if (that.sticky) result += 'y'; - return result; -}; - - -/***/ }), - -/***/ "./node_modules/core-js/internals/require-object-coercible.js": -/*!********************************************************************!*\ - !*** ./node_modules/core-js/internals/require-object-coercible.js ***! - \********************************************************************/ -/*! no static exports found */ -/***/ (function(module, exports) { - -// `RequireObjectCoercible` abstract operation -// https://tc39.github.io/ecma262/#sec-requireobjectcoercible -module.exports = function (it) { - if (it == undefined) throw TypeError("Can't call method on " + it); - return it; -}; - - -/***/ }), - -/***/ "./node_modules/core-js/internals/set-global.js": -/*!******************************************************!*\ - !*** ./node_modules/core-js/internals/set-global.js ***! - \******************************************************/ -/*! no static exports found */ -/***/ (function(module, exports, __webpack_require__) { - -var global = __webpack_require__(/*! ../internals/global */ "./node_modules/core-js/internals/global.js"); -var createNonEnumerableProperty = __webpack_require__(/*! ../internals/create-non-enumerable-property */ "./node_modules/core-js/internals/create-non-enumerable-property.js"); - -module.exports = function (key, value) { - try { - createNonEnumerableProperty(global, key, value); - } catch (error) { - global[key] = value; - } return value; -}; - - -/***/ }), - -/***/ "./node_modules/core-js/internals/set-species.js": -/*!*******************************************************!*\ - !*** ./node_modules/core-js/internals/set-species.js ***! - \*******************************************************/ -/*! no static exports found */ -/***/ (function(module, exports, __webpack_require__) { - -"use strict"; - -var getBuiltIn = __webpack_require__(/*! ../internals/get-built-in */ "./node_modules/core-js/internals/get-built-in.js"); -var definePropertyModule = __webpack_require__(/*! ../internals/object-define-property */ "./node_modules/core-js/internals/object-define-property.js"); -var wellKnownSymbol = __webpack_require__(/*! ../internals/well-known-symbol */ "./node_modules/core-js/internals/well-known-symbol.js"); -var DESCRIPTORS = __webpack_require__(/*! ../internals/descriptors */ "./node_modules/core-js/internals/descriptors.js"); - -var SPECIES = wellKnownSymbol('species'); - -module.exports = function (CONSTRUCTOR_NAME) { - var Constructor = getBuiltIn(CONSTRUCTOR_NAME); - var defineProperty = definePropertyModule.f; - - if (DESCRIPTORS && Constructor && !Constructor[SPECIES]) { - defineProperty(Constructor, SPECIES, { - configurable: true, - get: function () { return this; } - }); - } -}; - - -/***/ }), - -/***/ "./node_modules/core-js/internals/set-to-string-tag.js": -/*!*************************************************************!*\ - !*** ./node_modules/core-js/internals/set-to-string-tag.js ***! - \*************************************************************/ -/*! no static exports found */ -/***/ (function(module, exports, __webpack_require__) { - -var defineProperty = __webpack_require__(/*! ../internals/object-define-property */ "./node_modules/core-js/internals/object-define-property.js").f; -var has = __webpack_require__(/*! ../internals/has */ "./node_modules/core-js/internals/has.js"); -var wellKnownSymbol = __webpack_require__(/*! ../internals/well-known-symbol */ "./node_modules/core-js/internals/well-known-symbol.js"); - -var TO_STRING_TAG = wellKnownSymbol('toStringTag'); - -module.exports = function (it, TAG, STATIC) { - if (it && !has(it = STATIC ? it : it.prototype, TO_STRING_TAG)) { - defineProperty(it, TO_STRING_TAG, { configurable: true, value: TAG }); - } -}; - - -/***/ }), - -/***/ "./node_modules/core-js/internals/shared-key.js": -/*!******************************************************!*\ - !*** ./node_modules/core-js/internals/shared-key.js ***! - \******************************************************/ -/*! no static exports found */ -/***/ (function(module, exports, __webpack_require__) { - -var shared = __webpack_require__(/*! ../internals/shared */ "./node_modules/core-js/internals/shared.js"); -var uid = __webpack_require__(/*! ../internals/uid */ "./node_modules/core-js/internals/uid.js"); - -var keys = shared('keys'); - -module.exports = function (key) { - return keys[key] || (keys[key] = uid(key)); -}; - - -/***/ }), - -/***/ "./node_modules/core-js/internals/shared-store.js": -/*!********************************************************!*\ - !*** ./node_modules/core-js/internals/shared-store.js ***! - \********************************************************/ -/*! no static exports found */ -/***/ (function(module, exports, __webpack_require__) { - -var global = __webpack_require__(/*! ../internals/global */ "./node_modules/core-js/internals/global.js"); -var setGlobal = __webpack_require__(/*! ../internals/set-global */ "./node_modules/core-js/internals/set-global.js"); - -var SHARED = '__core-js_shared__'; -var store = global[SHARED] || setGlobal(SHARED, {}); - -module.exports = store; - - -/***/ }), - -/***/ "./node_modules/core-js/internals/shared.js": -/*!**************************************************!*\ - !*** ./node_modules/core-js/internals/shared.js ***! - \**************************************************/ -/*! no static exports found */ -/***/ (function(module, exports, __webpack_require__) { - -var IS_PURE = __webpack_require__(/*! ../internals/is-pure */ "./node_modules/core-js/internals/is-pure.js"); -var store = __webpack_require__(/*! ../internals/shared-store */ "./node_modules/core-js/internals/shared-store.js"); - -(module.exports = function (key, value) { - return store[key] || (store[key] = value !== undefined ? value : {}); -})('versions', []).push({ - version: '3.3.2', - mode: IS_PURE ? 'pure' : 'global', - copyright: '© 2019 Denis Pushkarev (zloirock.ru)' -}); - - -/***/ }), - -/***/ "./node_modules/core-js/internals/sloppy-array-method.js": -/*!***************************************************************!*\ - !*** ./node_modules/core-js/internals/sloppy-array-method.js ***! - \***************************************************************/ -/*! no static exports found */ -/***/ (function(module, exports, __webpack_require__) { - -"use strict"; - -var fails = __webpack_require__(/*! ../internals/fails */ "./node_modules/core-js/internals/fails.js"); - -module.exports = function (METHOD_NAME, argument) { - var method = [][METHOD_NAME]; - return !method || !fails(function () { - // eslint-disable-next-line no-useless-call,no-throw-literal - method.call(null, argument || function () { throw 1; }, 1); - }); -}; - - -/***/ }), - -/***/ "./node_modules/core-js/internals/species-constructor.js": -/*!***************************************************************!*\ - !*** ./node_modules/core-js/internals/species-constructor.js ***! - \***************************************************************/ -/*! no static exports found */ -/***/ (function(module, exports, __webpack_require__) { - -var anObject = __webpack_require__(/*! ../internals/an-object */ "./node_modules/core-js/internals/an-object.js"); -var aFunction = __webpack_require__(/*! ../internals/a-function */ "./node_modules/core-js/internals/a-function.js"); -var wellKnownSymbol = __webpack_require__(/*! ../internals/well-known-symbol */ "./node_modules/core-js/internals/well-known-symbol.js"); - -var SPECIES = wellKnownSymbol('species'); - -// `SpeciesConstructor` abstract operation -// https://tc39.github.io/ecma262/#sec-speciesconstructor -module.exports = function (O, defaultConstructor) { - var C = anObject(O).constructor; - var S; - return C === undefined || (S = anObject(C)[SPECIES]) == undefined ? defaultConstructor : aFunction(S); -}; - - -/***/ }), - -/***/ "./node_modules/core-js/internals/string-multibyte.js": -/*!************************************************************!*\ - !*** ./node_modules/core-js/internals/string-multibyte.js ***! - \************************************************************/ -/*! no static exports found */ -/***/ (function(module, exports, __webpack_require__) { - -var toInteger = __webpack_require__(/*! ../internals/to-integer */ "./node_modules/core-js/internals/to-integer.js"); -var requireObjectCoercible = __webpack_require__(/*! ../internals/require-object-coercible */ "./node_modules/core-js/internals/require-object-coercible.js"); - -// `String.prototype.{ codePointAt, at }` methods implementation -var createMethod = function (CONVERT_TO_STRING) { - return function ($this, pos) { - var S = String(requireObjectCoercible($this)); - var position = toInteger(pos); - var size = S.length; - var first, second; - if (position < 0 || position >= size) return CONVERT_TO_STRING ? '' : undefined; - first = S.charCodeAt(position); - return first < 0xD800 || first > 0xDBFF || position + 1 === size - || (second = S.charCodeAt(position + 1)) < 0xDC00 || second > 0xDFFF - ? CONVERT_TO_STRING ? S.charAt(position) : first - : CONVERT_TO_STRING ? S.slice(position, position + 2) : (first - 0xD800 << 10) + (second - 0xDC00) + 0x10000; - }; -}; - -module.exports = { - // `String.prototype.codePointAt` method - // https://tc39.github.io/ecma262/#sec-string.prototype.codepointat - codeAt: createMethod(false), - // `String.prototype.at` method - // https://github.com/mathiasbynens/String.prototype.at - charAt: createMethod(true) -}; - - -/***/ }), - -/***/ "./node_modules/core-js/internals/string-trim.js": -/*!*******************************************************!*\ - !*** ./node_modules/core-js/internals/string-trim.js ***! - \*******************************************************/ -/*! no static exports found */ -/***/ (function(module, exports, __webpack_require__) { - -var requireObjectCoercible = __webpack_require__(/*! ../internals/require-object-coercible */ "./node_modules/core-js/internals/require-object-coercible.js"); -var whitespaces = __webpack_require__(/*! ../internals/whitespaces */ "./node_modules/core-js/internals/whitespaces.js"); - -var whitespace = '[' + whitespaces + ']'; -var ltrim = RegExp('^' + whitespace + whitespace + '*'); -var rtrim = RegExp(whitespace + whitespace + '*$'); - -// `String.prototype.{ trim, trimStart, trimEnd, trimLeft, trimRight }` methods implementation -var createMethod = function (TYPE) { - return function ($this) { - var string = String(requireObjectCoercible($this)); - if (TYPE & 1) string = string.replace(ltrim, ''); - if (TYPE & 2) string = string.replace(rtrim, ''); - return string; - }; -}; - -module.exports = { - // `String.prototype.{ trimLeft, trimStart }` methods - // https://tc39.github.io/ecma262/#sec-string.prototype.trimstart - start: createMethod(1), - // `String.prototype.{ trimRight, trimEnd }` methods - // https://tc39.github.io/ecma262/#sec-string.prototype.trimend - end: createMethod(2), - // `String.prototype.trim` method - // https://tc39.github.io/ecma262/#sec-string.prototype.trim - trim: createMethod(3) -}; - - -/***/ }), - -/***/ "./node_modules/core-js/internals/task.js": -/*!************************************************!*\ - !*** ./node_modules/core-js/internals/task.js ***! - \************************************************/ -/*! no static exports found */ -/***/ (function(module, exports, __webpack_require__) { - -var global = __webpack_require__(/*! ../internals/global */ "./node_modules/core-js/internals/global.js"); -var fails = __webpack_require__(/*! ../internals/fails */ "./node_modules/core-js/internals/fails.js"); -var classof = __webpack_require__(/*! ../internals/classof-raw */ "./node_modules/core-js/internals/classof-raw.js"); -var bind = __webpack_require__(/*! ../internals/bind-context */ "./node_modules/core-js/internals/bind-context.js"); -var html = __webpack_require__(/*! ../internals/html */ "./node_modules/core-js/internals/html.js"); -var createElement = __webpack_require__(/*! ../internals/document-create-element */ "./node_modules/core-js/internals/document-create-element.js"); -var userAgent = __webpack_require__(/*! ../internals/user-agent */ "./node_modules/core-js/internals/user-agent.js"); - -var location = global.location; -var set = global.setImmediate; -var clear = global.clearImmediate; -var process = global.process; -var MessageChannel = global.MessageChannel; -var Dispatch = global.Dispatch; -var counter = 0; -var queue = {}; -var ONREADYSTATECHANGE = 'onreadystatechange'; -var defer, channel, port; - -var run = function (id) { - // eslint-disable-next-line no-prototype-builtins - if (queue.hasOwnProperty(id)) { - var fn = queue[id]; - delete queue[id]; - fn(); - } -}; - -var runner = function (id) { - return function () { - run(id); - }; -}; - -var listener = function (event) { - run(event.data); -}; - -var post = function (id) { - // old engines have not location.origin - global.postMessage(id + '', location.protocol + '//' + location.host); -}; - -// Node.js 0.9+ & IE10+ has setImmediate, otherwise: -if (!set || !clear) { - set = function setImmediate(fn) { - var args = []; - var i = 1; - while (arguments.length > i) args.push(arguments[i++]); - queue[++counter] = function () { - // eslint-disable-next-line no-new-func - (typeof fn == 'function' ? fn : Function(fn)).apply(undefined, args); - }; - defer(counter); - return counter; - }; - clear = function clearImmediate(id) { - delete queue[id]; - }; - // Node.js 0.8- - if (classof(process) == 'process') { - defer = function (id) { - process.nextTick(runner(id)); - }; - // Sphere (JS game engine) Dispatch API - } else if (Dispatch && Dispatch.now) { - defer = function (id) { - Dispatch.now(runner(id)); - }; - // Browsers with MessageChannel, includes WebWorkers - // except iOS - https://github.com/zloirock/core-js/issues/624 - } else if (MessageChannel && !/(iphone|ipod|ipad).*applewebkit/i.test(userAgent)) { - channel = new MessageChannel(); - port = channel.port2; - channel.port1.onmessage = listener; - defer = bind(port.postMessage, port, 1); - // Browsers with postMessage, skip WebWorkers - // IE8 has postMessage, but it's sync & typeof its postMessage is 'object' - } else if (global.addEventListener && typeof postMessage == 'function' && !global.importScripts && !fails(post)) { - defer = post; - global.addEventListener('message', listener, false); - // IE8- - } else if (ONREADYSTATECHANGE in createElement('script')) { - defer = function (id) { - html.appendChild(createElement('script'))[ONREADYSTATECHANGE] = function () { - html.removeChild(this); - run(id); - }; - }; - // Rest old browsers - } else { - defer = function (id) { - setTimeout(runner(id), 0); - }; - } -} - -module.exports = { - set: set, - clear: clear -}; - - -/***/ }), - -/***/ "./node_modules/core-js/internals/to-absolute-index.js": -/*!*************************************************************!*\ - !*** ./node_modules/core-js/internals/to-absolute-index.js ***! - \*************************************************************/ -/*! no static exports found */ -/***/ (function(module, exports, __webpack_require__) { - -var toInteger = __webpack_require__(/*! ../internals/to-integer */ "./node_modules/core-js/internals/to-integer.js"); - -var max = Math.max; -var min = Math.min; - -// Helper for a popular repeating case of the spec: -// Let integer be ? ToInteger(index). -// If integer < 0, let result be max((length + integer), 0); else let result be min(length, length). -module.exports = function (index, length) { - var integer = toInteger(index); - return integer < 0 ? max(integer + length, 0) : min(integer, length); -}; - - -/***/ }), - -/***/ "./node_modules/core-js/internals/to-indexed-object.js": -/*!*************************************************************!*\ - !*** ./node_modules/core-js/internals/to-indexed-object.js ***! - \*************************************************************/ -/*! no static exports found */ -/***/ (function(module, exports, __webpack_require__) { - -// toObject with fallback for non-array-like ES3 strings -var IndexedObject = __webpack_require__(/*! ../internals/indexed-object */ "./node_modules/core-js/internals/indexed-object.js"); -var requireObjectCoercible = __webpack_require__(/*! ../internals/require-object-coercible */ "./node_modules/core-js/internals/require-object-coercible.js"); - -module.exports = function (it) { - return IndexedObject(requireObjectCoercible(it)); -}; - - -/***/ }), - -/***/ "./node_modules/core-js/internals/to-integer.js": -/*!******************************************************!*\ - !*** ./node_modules/core-js/internals/to-integer.js ***! - \******************************************************/ -/*! no static exports found */ -/***/ (function(module, exports) { - -var ceil = Math.ceil; -var floor = Math.floor; - -// `ToInteger` abstract operation -// https://tc39.github.io/ecma262/#sec-tointeger -module.exports = function (argument) { - return isNaN(argument = +argument) ? 0 : (argument > 0 ? floor : ceil)(argument); -}; - - -/***/ }), - -/***/ "./node_modules/core-js/internals/to-length.js": -/*!*****************************************************!*\ - !*** ./node_modules/core-js/internals/to-length.js ***! - \*****************************************************/ -/*! no static exports found */ -/***/ (function(module, exports, __webpack_require__) { - -var toInteger = __webpack_require__(/*! ../internals/to-integer */ "./node_modules/core-js/internals/to-integer.js"); - -var min = Math.min; - -// `ToLength` abstract operation -// https://tc39.github.io/ecma262/#sec-tolength -module.exports = function (argument) { - return argument > 0 ? min(toInteger(argument), 0x1FFFFFFFFFFFFF) : 0; // 2 ** 53 - 1 == 9007199254740991 -}; - - -/***/ }), - -/***/ "./node_modules/core-js/internals/to-object.js": -/*!*****************************************************!*\ - !*** ./node_modules/core-js/internals/to-object.js ***! - \*****************************************************/ -/*! no static exports found */ -/***/ (function(module, exports, __webpack_require__) { - -var requireObjectCoercible = __webpack_require__(/*! ../internals/require-object-coercible */ "./node_modules/core-js/internals/require-object-coercible.js"); - -// `ToObject` abstract operation -// https://tc39.github.io/ecma262/#sec-toobject -module.exports = function (argument) { - return Object(requireObjectCoercible(argument)); -}; - - -/***/ }), - -/***/ "./node_modules/core-js/internals/to-primitive.js": -/*!********************************************************!*\ - !*** ./node_modules/core-js/internals/to-primitive.js ***! - \********************************************************/ -/*! no static exports found */ -/***/ (function(module, exports, __webpack_require__) { - -var isObject = __webpack_require__(/*! ../internals/is-object */ "./node_modules/core-js/internals/is-object.js"); - -// `ToPrimitive` abstract operation -// https://tc39.github.io/ecma262/#sec-toprimitive -// instead of the ES6 spec version, we didn't implement @@toPrimitive case -// and the second argument - flag - preferred type is a string -module.exports = function (input, PREFERRED_STRING) { - if (!isObject(input)) return input; - var fn, val; - if (PREFERRED_STRING && typeof (fn = input.toString) == 'function' && !isObject(val = fn.call(input))) return val; - if (typeof (fn = input.valueOf) == 'function' && !isObject(val = fn.call(input))) return val; - if (!PREFERRED_STRING && typeof (fn = input.toString) == 'function' && !isObject(val = fn.call(input))) return val; - throw TypeError("Can't convert object to primitive value"); -}; - - -/***/ }), - -/***/ "./node_modules/core-js/internals/uid.js": -/*!***********************************************!*\ - !*** ./node_modules/core-js/internals/uid.js ***! - \***********************************************/ -/*! no static exports found */ -/***/ (function(module, exports) { - -var id = 0; -var postfix = Math.random(); - -module.exports = function (key) { - return 'Symbol(' + String(key === undefined ? '' : key) + ')_' + (++id + postfix).toString(36); -}; - - -/***/ }), - -/***/ "./node_modules/core-js/internals/user-agent.js": -/*!******************************************************!*\ - !*** ./node_modules/core-js/internals/user-agent.js ***! - \******************************************************/ -/*! no static exports found */ -/***/ (function(module, exports, __webpack_require__) { - -var getBuiltIn = __webpack_require__(/*! ../internals/get-built-in */ "./node_modules/core-js/internals/get-built-in.js"); - -module.exports = getBuiltIn('navigator', 'userAgent') || ''; - - -/***/ }), - -/***/ "./node_modules/core-js/internals/well-known-symbol.js": -/*!*************************************************************!*\ - !*** ./node_modules/core-js/internals/well-known-symbol.js ***! - \*************************************************************/ -/*! no static exports found */ -/***/ (function(module, exports, __webpack_require__) { - -var global = __webpack_require__(/*! ../internals/global */ "./node_modules/core-js/internals/global.js"); -var shared = __webpack_require__(/*! ../internals/shared */ "./node_modules/core-js/internals/shared.js"); -var uid = __webpack_require__(/*! ../internals/uid */ "./node_modules/core-js/internals/uid.js"); -var NATIVE_SYMBOL = __webpack_require__(/*! ../internals/native-symbol */ "./node_modules/core-js/internals/native-symbol.js"); - -var Symbol = global.Symbol; -var store = shared('wks'); - -module.exports = function (name) { - return store[name] || (store[name] = NATIVE_SYMBOL && Symbol[name] - || (NATIVE_SYMBOL ? Symbol : uid)('Symbol.' + name)); -}; - - -/***/ }), - -/***/ "./node_modules/core-js/internals/whitespaces.js": -/*!*******************************************************!*\ - !*** ./node_modules/core-js/internals/whitespaces.js ***! - \*******************************************************/ -/*! no static exports found */ -/***/ (function(module, exports) { - -// a string of all valid unicode whitespaces -// eslint-disable-next-line max-len -module.exports = '\u0009\u000A\u000B\u000C\u000D\u0020\u00A0\u1680\u2000\u2001\u2002\u2003\u2004\u2005\u2006\u2007\u2008\u2009\u200A\u202F\u205F\u3000\u2028\u2029\uFEFF'; - - -/***/ }), - -/***/ "./node_modules/core-js/modules/es.array.iterator.js": -/*!***********************************************************!*\ - !*** ./node_modules/core-js/modules/es.array.iterator.js ***! - \***********************************************************/ -/*! no static exports found */ -/***/ (function(module, exports, __webpack_require__) { - -"use strict"; - -var toIndexedObject = __webpack_require__(/*! ../internals/to-indexed-object */ "./node_modules/core-js/internals/to-indexed-object.js"); -var addToUnscopables = __webpack_require__(/*! ../internals/add-to-unscopables */ "./node_modules/core-js/internals/add-to-unscopables.js"); -var Iterators = __webpack_require__(/*! ../internals/iterators */ "./node_modules/core-js/internals/iterators.js"); -var InternalStateModule = __webpack_require__(/*! ../internals/internal-state */ "./node_modules/core-js/internals/internal-state.js"); -var defineIterator = __webpack_require__(/*! ../internals/define-iterator */ "./node_modules/core-js/internals/define-iterator.js"); - -var ARRAY_ITERATOR = 'Array Iterator'; -var setInternalState = InternalStateModule.set; -var getInternalState = InternalStateModule.getterFor(ARRAY_ITERATOR); - -// `Array.prototype.entries` method -// https://tc39.github.io/ecma262/#sec-array.prototype.entries -// `Array.prototype.keys` method -// https://tc39.github.io/ecma262/#sec-array.prototype.keys -// `Array.prototype.values` method -// https://tc39.github.io/ecma262/#sec-array.prototype.values -// `Array.prototype[@@iterator]` method -// https://tc39.github.io/ecma262/#sec-array.prototype-@@iterator -// `CreateArrayIterator` internal method -// https://tc39.github.io/ecma262/#sec-createarrayiterator -module.exports = defineIterator(Array, 'Array', function (iterated, kind) { - setInternalState(this, { - type: ARRAY_ITERATOR, - target: toIndexedObject(iterated), // target - index: 0, // next index - kind: kind // kind - }); -// `%ArrayIteratorPrototype%.next` method -// https://tc39.github.io/ecma262/#sec-%arrayiteratorprototype%.next -}, function () { - var state = getInternalState(this); - var target = state.target; - var kind = state.kind; - var index = state.index++; - if (!target || index >= target.length) { - state.target = undefined; - return { value: undefined, done: true }; - } - if (kind == 'keys') return { value: index, done: false }; - if (kind == 'values') return { value: target[index], done: false }; - return { value: [index, target[index]], done: false }; -}, 'values'); - -// argumentsList[@@iterator] is %ArrayProto_values% -// https://tc39.github.io/ecma262/#sec-createunmappedargumentsobject -// https://tc39.github.io/ecma262/#sec-createmappedargumentsobject -Iterators.Arguments = Iterators.Array; - -// https://tc39.github.io/ecma262/#sec-array.prototype-@@unscopables -addToUnscopables('keys'); -addToUnscopables('values'); -addToUnscopables('entries'); - - -/***/ }), - -/***/ "./node_modules/core-js/modules/es.array.sort.js": -/*!*******************************************************!*\ - !*** ./node_modules/core-js/modules/es.array.sort.js ***! - \*******************************************************/ -/*! no static exports found */ -/***/ (function(module, exports, __webpack_require__) { - -"use strict"; - -var $ = __webpack_require__(/*! ../internals/export */ "./node_modules/core-js/internals/export.js"); -var aFunction = __webpack_require__(/*! ../internals/a-function */ "./node_modules/core-js/internals/a-function.js"); -var toObject = __webpack_require__(/*! ../internals/to-object */ "./node_modules/core-js/internals/to-object.js"); -var fails = __webpack_require__(/*! ../internals/fails */ "./node_modules/core-js/internals/fails.js"); -var sloppyArrayMethod = __webpack_require__(/*! ../internals/sloppy-array-method */ "./node_modules/core-js/internals/sloppy-array-method.js"); - -var nativeSort = [].sort; -var test = [1, 2, 3]; - -// IE8- -var FAILS_ON_UNDEFINED = fails(function () { - test.sort(undefined); -}); -// V8 bug -var FAILS_ON_NULL = fails(function () { - test.sort(null); -}); -// Old WebKit -var SLOPPY_METHOD = sloppyArrayMethod('sort'); - -var FORCED = FAILS_ON_UNDEFINED || !FAILS_ON_NULL || SLOPPY_METHOD; - -// `Array.prototype.sort` method -// https://tc39.github.io/ecma262/#sec-array.prototype.sort -$({ target: 'Array', proto: true, forced: FORCED }, { - sort: function sort(comparefn) { - return comparefn === undefined - ? nativeSort.call(toObject(this)) - : nativeSort.call(toObject(this), aFunction(comparefn)); - } -}); - - -/***/ }), - -/***/ "./node_modules/core-js/modules/es.promise.js": -/*!****************************************************!*\ - !*** ./node_modules/core-js/modules/es.promise.js ***! - \****************************************************/ -/*! no static exports found */ -/***/ (function(module, exports, __webpack_require__) { - -"use strict"; - -var $ = __webpack_require__(/*! ../internals/export */ "./node_modules/core-js/internals/export.js"); -var IS_PURE = __webpack_require__(/*! ../internals/is-pure */ "./node_modules/core-js/internals/is-pure.js"); -var global = __webpack_require__(/*! ../internals/global */ "./node_modules/core-js/internals/global.js"); -var path = __webpack_require__(/*! ../internals/path */ "./node_modules/core-js/internals/path.js"); -var NativePromise = __webpack_require__(/*! ../internals/native-promise-constructor */ "./node_modules/core-js/internals/native-promise-constructor.js"); -var redefine = __webpack_require__(/*! ../internals/redefine */ "./node_modules/core-js/internals/redefine.js"); -var redefineAll = __webpack_require__(/*! ../internals/redefine-all */ "./node_modules/core-js/internals/redefine-all.js"); -var setToStringTag = __webpack_require__(/*! ../internals/set-to-string-tag */ "./node_modules/core-js/internals/set-to-string-tag.js"); -var setSpecies = __webpack_require__(/*! ../internals/set-species */ "./node_modules/core-js/internals/set-species.js"); -var isObject = __webpack_require__(/*! ../internals/is-object */ "./node_modules/core-js/internals/is-object.js"); -var aFunction = __webpack_require__(/*! ../internals/a-function */ "./node_modules/core-js/internals/a-function.js"); -var anInstance = __webpack_require__(/*! ../internals/an-instance */ "./node_modules/core-js/internals/an-instance.js"); -var classof = __webpack_require__(/*! ../internals/classof-raw */ "./node_modules/core-js/internals/classof-raw.js"); -var iterate = __webpack_require__(/*! ../internals/iterate */ "./node_modules/core-js/internals/iterate.js"); -var checkCorrectnessOfIteration = __webpack_require__(/*! ../internals/check-correctness-of-iteration */ "./node_modules/core-js/internals/check-correctness-of-iteration.js"); -var speciesConstructor = __webpack_require__(/*! ../internals/species-constructor */ "./node_modules/core-js/internals/species-constructor.js"); -var task = __webpack_require__(/*! ../internals/task */ "./node_modules/core-js/internals/task.js").set; -var microtask = __webpack_require__(/*! ../internals/microtask */ "./node_modules/core-js/internals/microtask.js"); -var promiseResolve = __webpack_require__(/*! ../internals/promise-resolve */ "./node_modules/core-js/internals/promise-resolve.js"); -var hostReportErrors = __webpack_require__(/*! ../internals/host-report-errors */ "./node_modules/core-js/internals/host-report-errors.js"); -var newPromiseCapabilityModule = __webpack_require__(/*! ../internals/new-promise-capability */ "./node_modules/core-js/internals/new-promise-capability.js"); -var perform = __webpack_require__(/*! ../internals/perform */ "./node_modules/core-js/internals/perform.js"); -var userAgent = __webpack_require__(/*! ../internals/user-agent */ "./node_modules/core-js/internals/user-agent.js"); -var InternalStateModule = __webpack_require__(/*! ../internals/internal-state */ "./node_modules/core-js/internals/internal-state.js"); -var isForced = __webpack_require__(/*! ../internals/is-forced */ "./node_modules/core-js/internals/is-forced.js"); -var wellKnownSymbol = __webpack_require__(/*! ../internals/well-known-symbol */ "./node_modules/core-js/internals/well-known-symbol.js"); - -var SPECIES = wellKnownSymbol('species'); -var PROMISE = 'Promise'; -var getInternalState = InternalStateModule.get; -var setInternalState = InternalStateModule.set; -var getInternalPromiseState = InternalStateModule.getterFor(PROMISE); -var PromiseConstructor = NativePromise; -var TypeError = global.TypeError; -var document = global.document; -var process = global.process; -var $fetch = global.fetch; -var versions = process && process.versions; -var v8 = versions && versions.v8 || ''; -var newPromiseCapability = newPromiseCapabilityModule.f; -var newGenericPromiseCapability = newPromiseCapability; -var IS_NODE = classof(process) == 'process'; -var DISPATCH_EVENT = !!(document && document.createEvent && global.dispatchEvent); -var UNHANDLED_REJECTION = 'unhandledrejection'; -var REJECTION_HANDLED = 'rejectionhandled'; -var PENDING = 0; -var FULFILLED = 1; -var REJECTED = 2; -var HANDLED = 1; -var UNHANDLED = 2; -var Internal, OwnPromiseCapability, PromiseWrapper, nativeThen; - -var FORCED = isForced(PROMISE, function () { - // correct subclassing with @@species support - var promise = PromiseConstructor.resolve(1); - var empty = function () { /* empty */ }; - var FakePromise = (promise.constructor = {})[SPECIES] = function (exec) { - exec(empty, empty); - }; - // unhandled rejections tracking support, NodeJS Promise without it fails @@species test - return !((IS_NODE || typeof PromiseRejectionEvent == 'function') - && (!IS_PURE || promise['finally']) - && promise.then(empty) instanceof FakePromise - // v8 6.6 (Node 10 and Chrome 66) have a bug with resolving custom thenables - // https://bugs.chromium.org/p/chromium/issues/detail?id=830565 - // we can't detect it synchronously, so just check versions - && v8.indexOf('6.6') !== 0 - && userAgent.indexOf('Chrome/66') === -1); -}); - -var INCORRECT_ITERATION = FORCED || !checkCorrectnessOfIteration(function (iterable) { - PromiseConstructor.all(iterable)['catch'](function () { /* empty */ }); -}); - -// helpers -var isThenable = function (it) { - var then; - return isObject(it) && typeof (then = it.then) == 'function' ? then : false; -}; - -var notify = function (promise, state, isReject) { - if (state.notified) return; - state.notified = true; - var chain = state.reactions; - microtask(function () { - var value = state.value; - var ok = state.state == FULFILLED; - var index = 0; - // variable length - can't use forEach - while (chain.length > index) { - var reaction = chain[index++]; - var handler = ok ? reaction.ok : reaction.fail; - var resolve = reaction.resolve; - var reject = reaction.reject; - var domain = reaction.domain; - var result, then, exited; - try { - if (handler) { - if (!ok) { - if (state.rejection === UNHANDLED) onHandleUnhandled(promise, state); - state.rejection = HANDLED; - } - if (handler === true) result = value; - else { - if (domain) domain.enter(); - result = handler(value); // can throw - if (domain) { - domain.exit(); - exited = true; - } - } - if (result === reaction.promise) { - reject(TypeError('Promise-chain cycle')); - } else if (then = isThenable(result)) { - then.call(result, resolve, reject); - } else resolve(result); - } else reject(value); - } catch (error) { - if (domain && !exited) domain.exit(); - reject(error); - } - } - state.reactions = []; - state.notified = false; - if (isReject && !state.rejection) onUnhandled(promise, state); - }); -}; - -var dispatchEvent = function (name, promise, reason) { - var event, handler; - if (DISPATCH_EVENT) { - event = document.createEvent('Event'); - event.promise = promise; - event.reason = reason; - event.initEvent(name, false, true); - global.dispatchEvent(event); - } else event = { promise: promise, reason: reason }; - if (handler = global['on' + name]) handler(event); - else if (name === UNHANDLED_REJECTION) hostReportErrors('Unhandled promise rejection', reason); -}; - -var onUnhandled = function (promise, state) { - task.call(global, function () { - var value = state.value; - var IS_UNHANDLED = isUnhandled(state); - var result; - if (IS_UNHANDLED) { - result = perform(function () { - if (IS_NODE) { - process.emit('unhandledRejection', value, promise); - } else dispatchEvent(UNHANDLED_REJECTION, promise, value); - }); - // Browsers should not trigger `rejectionHandled` event if it was handled here, NodeJS - should - state.rejection = IS_NODE || isUnhandled(state) ? UNHANDLED : HANDLED; - if (result.error) throw result.value; - } - }); -}; - -var isUnhandled = function (state) { - return state.rejection !== HANDLED && !state.parent; -}; - -var onHandleUnhandled = function (promise, state) { - task.call(global, function () { - if (IS_NODE) { - process.emit('rejectionHandled', promise); - } else dispatchEvent(REJECTION_HANDLED, promise, state.value); - }); -}; - -var bind = function (fn, promise, state, unwrap) { - return function (value) { - fn(promise, state, value, unwrap); - }; -}; - -var internalReject = function (promise, state, value, unwrap) { - if (state.done) return; - state.done = true; - if (unwrap) state = unwrap; - state.value = value; - state.state = REJECTED; - notify(promise, state, true); -}; - -var internalResolve = function (promise, state, value, unwrap) { - if (state.done) return; - state.done = true; - if (unwrap) state = unwrap; - try { - if (promise === value) throw TypeError("Promise can't be resolved itself"); - var then = isThenable(value); - if (then) { - microtask(function () { - var wrapper = { done: false }; - try { - then.call(value, - bind(internalResolve, promise, wrapper, state), - bind(internalReject, promise, wrapper, state) - ); - } catch (error) { - internalReject(promise, wrapper, error, state); - } - }); - } else { - state.value = value; - state.state = FULFILLED; - notify(promise, state, false); - } - } catch (error) { - internalReject(promise, { done: false }, error, state); - } -}; - -// constructor polyfill -if (FORCED) { - // 25.4.3.1 Promise(executor) - PromiseConstructor = function Promise(executor) { - anInstance(this, PromiseConstructor, PROMISE); - aFunction(executor); - Internal.call(this); - var state = getInternalState(this); - try { - executor(bind(internalResolve, this, state), bind(internalReject, this, state)); - } catch (error) { - internalReject(this, state, error); - } - }; - // eslint-disable-next-line no-unused-vars - Internal = function Promise(executor) { - setInternalState(this, { - type: PROMISE, - done: false, - notified: false, - parent: false, - reactions: [], - rejection: false, - state: PENDING, - value: undefined - }); - }; - Internal.prototype = redefineAll(PromiseConstructor.prototype, { - // `Promise.prototype.then` method - // https://tc39.github.io/ecma262/#sec-promise.prototype.then - then: function then(onFulfilled, onRejected) { - var state = getInternalPromiseState(this); - var reaction = newPromiseCapability(speciesConstructor(this, PromiseConstructor)); - reaction.ok = typeof onFulfilled == 'function' ? onFulfilled : true; - reaction.fail = typeof onRejected == 'function' && onRejected; - reaction.domain = IS_NODE ? process.domain : undefined; - state.parent = true; - state.reactions.push(reaction); - if (state.state != PENDING) notify(this, state, false); - return reaction.promise; - }, - // `Promise.prototype.catch` method - // https://tc39.github.io/ecma262/#sec-promise.prototype.catch - 'catch': function (onRejected) { - return this.then(undefined, onRejected); - } - }); - OwnPromiseCapability = function () { - var promise = new Internal(); - var state = getInternalState(promise); - this.promise = promise; - this.resolve = bind(internalResolve, promise, state); - this.reject = bind(internalReject, promise, state); - }; - newPromiseCapabilityModule.f = newPromiseCapability = function (C) { - return C === PromiseConstructor || C === PromiseWrapper - ? new OwnPromiseCapability(C) - : newGenericPromiseCapability(C); - }; - - if (!IS_PURE && typeof NativePromise == 'function') { - nativeThen = NativePromise.prototype.then; - - // wrap native Promise#then for native async functions - redefine(NativePromise.prototype, 'then', function then(onFulfilled, onRejected) { - var that = this; - return new PromiseConstructor(function (resolve, reject) { - nativeThen.call(that, resolve, reject); - }).then(onFulfilled, onRejected); - // https://github.com/zloirock/core-js/issues/640 - }, { unsafe: true }); - - // wrap fetch result - if (typeof $fetch == 'function') $({ global: true, enumerable: true, forced: true }, { - // eslint-disable-next-line no-unused-vars - fetch: function fetch(input) { - return promiseResolve(PromiseConstructor, $fetch.apply(global, arguments)); - } - }); - } -} - -$({ global: true, wrap: true, forced: FORCED }, { - Promise: PromiseConstructor -}); - -setToStringTag(PromiseConstructor, PROMISE, false, true); -setSpecies(PROMISE); - -PromiseWrapper = path[PROMISE]; - -// statics -$({ target: PROMISE, stat: true, forced: FORCED }, { - // `Promise.reject` method - // https://tc39.github.io/ecma262/#sec-promise.reject - reject: function reject(r) { - var capability = newPromiseCapability(this); - capability.reject.call(undefined, r); - return capability.promise; - } -}); - -$({ target: PROMISE, stat: true, forced: IS_PURE || FORCED }, { - // `Promise.resolve` method - // https://tc39.github.io/ecma262/#sec-promise.resolve - resolve: function resolve(x) { - return promiseResolve(IS_PURE && this === PromiseWrapper ? PromiseConstructor : this, x); - } -}); - -$({ target: PROMISE, stat: true, forced: INCORRECT_ITERATION }, { - // `Promise.all` method - // https://tc39.github.io/ecma262/#sec-promise.all - all: function all(iterable) { - var C = this; - var capability = newPromiseCapability(C); - var resolve = capability.resolve; - var reject = capability.reject; - var result = perform(function () { - var $promiseResolve = aFunction(C.resolve); - var values = []; - var counter = 0; - var remaining = 1; - iterate(iterable, function (promise) { - var index = counter++; - var alreadyCalled = false; - values.push(undefined); - remaining++; - $promiseResolve.call(C, promise).then(function (value) { - if (alreadyCalled) return; - alreadyCalled = true; - values[index] = value; - --remaining || resolve(values); - }, reject); - }); - --remaining || resolve(values); - }); - if (result.error) reject(result.value); - return capability.promise; - }, - // `Promise.race` method - // https://tc39.github.io/ecma262/#sec-promise.race - race: function race(iterable) { - var C = this; - var capability = newPromiseCapability(C); - var reject = capability.reject; - var result = perform(function () { - var $promiseResolve = aFunction(C.resolve); - iterate(iterable, function (promise) { - $promiseResolve.call(C, promise).then(capability.resolve, reject); - }); - }); - if (result.error) reject(result.value); - return capability.promise; - } -}); - - -/***/ }), - -/***/ "./node_modules/core-js/modules/es.string.iterator.js": -/*!************************************************************!*\ - !*** ./node_modules/core-js/modules/es.string.iterator.js ***! - \************************************************************/ -/*! no static exports found */ -/***/ (function(module, exports, __webpack_require__) { - -"use strict"; - -var charAt = __webpack_require__(/*! ../internals/string-multibyte */ "./node_modules/core-js/internals/string-multibyte.js").charAt; -var InternalStateModule = __webpack_require__(/*! ../internals/internal-state */ "./node_modules/core-js/internals/internal-state.js"); -var defineIterator = __webpack_require__(/*! ../internals/define-iterator */ "./node_modules/core-js/internals/define-iterator.js"); - -var STRING_ITERATOR = 'String Iterator'; -var setInternalState = InternalStateModule.set; -var getInternalState = InternalStateModule.getterFor(STRING_ITERATOR); - -// `String.prototype[@@iterator]` method -// https://tc39.github.io/ecma262/#sec-string.prototype-@@iterator -defineIterator(String, 'String', function (iterated) { - setInternalState(this, { - type: STRING_ITERATOR, - string: String(iterated), - index: 0 - }); -// `%StringIteratorPrototype%.next` method -// https://tc39.github.io/ecma262/#sec-%stringiteratorprototype%.next -}, function next() { - var state = getInternalState(this); - var string = state.string; - var index = state.index; - var point; - if (index >= string.length) return { value: undefined, done: true }; - point = charAt(string, index); - state.index += point.length; - return { value: point, done: false }; -}); - - -/***/ }), - -/***/ "./node_modules/core-js/modules/es.string.replace.js": -/*!***********************************************************!*\ - !*** ./node_modules/core-js/modules/es.string.replace.js ***! - \***********************************************************/ -/*! no static exports found */ -/***/ (function(module, exports, __webpack_require__) { - -"use strict"; - -var fixRegExpWellKnownSymbolLogic = __webpack_require__(/*! ../internals/fix-regexp-well-known-symbol-logic */ "./node_modules/core-js/internals/fix-regexp-well-known-symbol-logic.js"); -var anObject = __webpack_require__(/*! ../internals/an-object */ "./node_modules/core-js/internals/an-object.js"); -var toObject = __webpack_require__(/*! ../internals/to-object */ "./node_modules/core-js/internals/to-object.js"); -var toLength = __webpack_require__(/*! ../internals/to-length */ "./node_modules/core-js/internals/to-length.js"); -var toInteger = __webpack_require__(/*! ../internals/to-integer */ "./node_modules/core-js/internals/to-integer.js"); -var requireObjectCoercible = __webpack_require__(/*! ../internals/require-object-coercible */ "./node_modules/core-js/internals/require-object-coercible.js"); -var advanceStringIndex = __webpack_require__(/*! ../internals/advance-string-index */ "./node_modules/core-js/internals/advance-string-index.js"); -var regExpExec = __webpack_require__(/*! ../internals/regexp-exec-abstract */ "./node_modules/core-js/internals/regexp-exec-abstract.js"); - -var max = Math.max; -var min = Math.min; -var floor = Math.floor; -var SUBSTITUTION_SYMBOLS = /\$([$&'`]|\d\d?|<[^>]*>)/g; -var SUBSTITUTION_SYMBOLS_NO_NAMED = /\$([$&'`]|\d\d?)/g; - -var maybeToString = function (it) { - return it === undefined ? it : String(it); -}; - -// @@replace logic -fixRegExpWellKnownSymbolLogic('replace', 2, function (REPLACE, nativeReplace, maybeCallNative) { - return [ - // `String.prototype.replace` method - // https://tc39.github.io/ecma262/#sec-string.prototype.replace - function replace(searchValue, replaceValue) { - var O = requireObjectCoercible(this); - var replacer = searchValue == undefined ? undefined : searchValue[REPLACE]; - return replacer !== undefined - ? replacer.call(searchValue, O, replaceValue) - : nativeReplace.call(String(O), searchValue, replaceValue); - }, - // `RegExp.prototype[@@replace]` method - // https://tc39.github.io/ecma262/#sec-regexp.prototype-@@replace - function (regexp, replaceValue) { - var res = maybeCallNative(nativeReplace, regexp, this, replaceValue); - if (res.done) return res.value; - - var rx = anObject(regexp); - var S = String(this); - - var functionalReplace = typeof replaceValue === 'function'; - if (!functionalReplace) replaceValue = String(replaceValue); - - var global = rx.global; - if (global) { - var fullUnicode = rx.unicode; - rx.lastIndex = 0; - } - var results = []; - while (true) { - var result = regExpExec(rx, S); - if (result === null) break; - - results.push(result); - if (!global) break; - - var matchStr = String(result[0]); - if (matchStr === '') rx.lastIndex = advanceStringIndex(S, toLength(rx.lastIndex), fullUnicode); - } - - var accumulatedResult = ''; - var nextSourcePosition = 0; - for (var i = 0; i < results.length; i++) { - result = results[i]; - - var matched = String(result[0]); - var position = max(min(toInteger(result.index), S.length), 0); - var captures = []; - // NOTE: This is equivalent to - // captures = result.slice(1).map(maybeToString) - // but for some reason `nativeSlice.call(result, 1, result.length)` (called in - // the slice polyfill when slicing native arrays) "doesn't work" in safari 9 and - // causes a crash (https://pastebin.com/N21QzeQA) when trying to debug it. - for (var j = 1; j < result.length; j++) captures.push(maybeToString(result[j])); - var namedCaptures = result.groups; - if (functionalReplace) { - var replacerArgs = [matched].concat(captures, position, S); - if (namedCaptures !== undefined) replacerArgs.push(namedCaptures); - var replacement = String(replaceValue.apply(undefined, replacerArgs)); - } else { - replacement = getSubstitution(matched, S, position, captures, namedCaptures, replaceValue); - } - if (position >= nextSourcePosition) { - accumulatedResult += S.slice(nextSourcePosition, position) + replacement; - nextSourcePosition = position + matched.length; - } - } - return accumulatedResult + S.slice(nextSourcePosition); - } - ]; - - // https://tc39.github.io/ecma262/#sec-getsubstitution - function getSubstitution(matched, str, position, captures, namedCaptures, replacement) { - var tailPos = position + matched.length; - var m = captures.length; - var symbols = SUBSTITUTION_SYMBOLS_NO_NAMED; - if (namedCaptures !== undefined) { - namedCaptures = toObject(namedCaptures); - symbols = SUBSTITUTION_SYMBOLS; - } - return nativeReplace.call(replacement, symbols, function (match, ch) { - var capture; - switch (ch.charAt(0)) { - case '$': return '$'; - case '&': return matched; - case '`': return str.slice(0, position); - case "'": return str.slice(tailPos); - case '<': - capture = namedCaptures[ch.slice(1, -1)]; - break; - default: // \d\d? - var n = +ch; - if (n === 0) return match; - if (n > m) { - var f = floor(n / 10); - if (f === 0) return match; - if (f <= m) return captures[f - 1] === undefined ? ch.charAt(1) : captures[f - 1] + ch.charAt(1); - return match; - } - capture = captures[n - 1]; - } - return capture === undefined ? '' : capture; - }); - } -}); - - -/***/ }), - -/***/ "./node_modules/core-js/modules/es.string.trim.js": -/*!********************************************************!*\ - !*** ./node_modules/core-js/modules/es.string.trim.js ***! - \********************************************************/ -/*! no static exports found */ -/***/ (function(module, exports, __webpack_require__) { - -"use strict"; - -var $ = __webpack_require__(/*! ../internals/export */ "./node_modules/core-js/internals/export.js"); -var $trim = __webpack_require__(/*! ../internals/string-trim */ "./node_modules/core-js/internals/string-trim.js").trim; -var forcedStringTrimMethod = __webpack_require__(/*! ../internals/forced-string-trim-method */ "./node_modules/core-js/internals/forced-string-trim-method.js"); - -// `String.prototype.trim` method -// https://tc39.github.io/ecma262/#sec-string.prototype.trim -$({ target: 'String', proto: true, forced: forcedStringTrimMethod('trim') }, { - trim: function trim() { - return $trim(this); - } -}); - - -/***/ }), - -/***/ "./node_modules/core-js/modules/es.symbol.description.js": -/*!***************************************************************!*\ - !*** ./node_modules/core-js/modules/es.symbol.description.js ***! - \***************************************************************/ -/*! no static exports found */ -/***/ (function(module, exports, __webpack_require__) { - -"use strict"; -// `Symbol.prototype.description` getter -// https://tc39.github.io/ecma262/#sec-symbol.prototype.description - -var $ = __webpack_require__(/*! ../internals/export */ "./node_modules/core-js/internals/export.js"); -var DESCRIPTORS = __webpack_require__(/*! ../internals/descriptors */ "./node_modules/core-js/internals/descriptors.js"); -var global = __webpack_require__(/*! ../internals/global */ "./node_modules/core-js/internals/global.js"); -var has = __webpack_require__(/*! ../internals/has */ "./node_modules/core-js/internals/has.js"); -var isObject = __webpack_require__(/*! ../internals/is-object */ "./node_modules/core-js/internals/is-object.js"); -var defineProperty = __webpack_require__(/*! ../internals/object-define-property */ "./node_modules/core-js/internals/object-define-property.js").f; -var copyConstructorProperties = __webpack_require__(/*! ../internals/copy-constructor-properties */ "./node_modules/core-js/internals/copy-constructor-properties.js"); - -var NativeSymbol = global.Symbol; - -if (DESCRIPTORS && typeof NativeSymbol == 'function' && (!('description' in NativeSymbol.prototype) || - // Safari 12 bug - NativeSymbol().description !== undefined -)) { - var EmptyStringDescriptionStore = {}; - // wrap Symbol constructor for correct work with undefined description - var SymbolWrapper = function Symbol() { - var description = arguments.length < 1 || arguments[0] === undefined ? undefined : String(arguments[0]); - var result = this instanceof SymbolWrapper - ? new NativeSymbol(description) - // in Edge 13, String(Symbol(undefined)) === 'Symbol(undefined)' - : description === undefined ? NativeSymbol() : NativeSymbol(description); - if (description === '') EmptyStringDescriptionStore[result] = true; - return result; - }; - copyConstructorProperties(SymbolWrapper, NativeSymbol); - var symbolPrototype = SymbolWrapper.prototype = NativeSymbol.prototype; - symbolPrototype.constructor = SymbolWrapper; - - var symbolToString = symbolPrototype.toString; - var native = String(NativeSymbol('test')) == 'Symbol(test)'; - var regexp = /^Symbol\((.*)\)[^)]+$/; - defineProperty(symbolPrototype, 'description', { - configurable: true, - get: function description() { - var symbol = isObject(this) ? this.valueOf() : this; - var string = symbolToString.call(symbol); - if (has(EmptyStringDescriptionStore, symbol)) return ''; - var desc = native ? string.slice(7, -1) : string.replace(regexp, '$1'); - return desc === '' ? undefined : desc; - } - }); - - $({ global: true, forced: true }, { - Symbol: SymbolWrapper - }); -} - - -/***/ }), - -/***/ "./node_modules/core-js/modules/web.dom-collections.iterator.js": -/*!**********************************************************************!*\ - !*** ./node_modules/core-js/modules/web.dom-collections.iterator.js ***! - \**********************************************************************/ -/*! no static exports found */ -/***/ (function(module, exports, __webpack_require__) { - -var global = __webpack_require__(/*! ../internals/global */ "./node_modules/core-js/internals/global.js"); -var DOMIterables = __webpack_require__(/*! ../internals/dom-iterables */ "./node_modules/core-js/internals/dom-iterables.js"); -var ArrayIteratorMethods = __webpack_require__(/*! ../modules/es.array.iterator */ "./node_modules/core-js/modules/es.array.iterator.js"); -var createNonEnumerableProperty = __webpack_require__(/*! ../internals/create-non-enumerable-property */ "./node_modules/core-js/internals/create-non-enumerable-property.js"); -var wellKnownSymbol = __webpack_require__(/*! ../internals/well-known-symbol */ "./node_modules/core-js/internals/well-known-symbol.js"); - -var ITERATOR = wellKnownSymbol('iterator'); -var TO_STRING_TAG = wellKnownSymbol('toStringTag'); -var ArrayValues = ArrayIteratorMethods.values; - -for (var COLLECTION_NAME in DOMIterables) { - var Collection = global[COLLECTION_NAME]; - var CollectionPrototype = Collection && Collection.prototype; - if (CollectionPrototype) { - // some Chrome versions have non-configurable methods on DOMTokenList - if (CollectionPrototype[ITERATOR] !== ArrayValues) try { - createNonEnumerableProperty(CollectionPrototype, ITERATOR, ArrayValues); - } catch (error) { - CollectionPrototype[ITERATOR] = ArrayValues; - } - if (!CollectionPrototype[TO_STRING_TAG]) { - createNonEnumerableProperty(CollectionPrototype, TO_STRING_TAG, COLLECTION_NAME); - } - if (DOMIterables[COLLECTION_NAME]) for (var METHOD_NAME in ArrayIteratorMethods) { - // some Chrome versions have non-configurable methods on DOMTokenList - if (CollectionPrototype[METHOD_NAME] !== ArrayIteratorMethods[METHOD_NAME]) try { - createNonEnumerableProperty(CollectionPrototype, METHOD_NAME, ArrayIteratorMethods[METHOD_NAME]); - } catch (error) { - CollectionPrototype[METHOD_NAME] = ArrayIteratorMethods[METHOD_NAME]; - } - } - } -} - - -/***/ }), - -/***/ "./node_modules/core-js/modules/web.url-search-params.js": -/*!***************************************************************!*\ - !*** ./node_modules/core-js/modules/web.url-search-params.js ***! - \***************************************************************/ -/*! no static exports found */ -/***/ (function(module, exports, __webpack_require__) { - -"use strict"; - -// TODO: in core-js@4, move /modules/ dependencies to public entries for better optimization by tools like `preset-env` -__webpack_require__(/*! ../modules/es.array.iterator */ "./node_modules/core-js/modules/es.array.iterator.js"); -var $ = __webpack_require__(/*! ../internals/export */ "./node_modules/core-js/internals/export.js"); -var USE_NATIVE_URL = __webpack_require__(/*! ../internals/native-url */ "./node_modules/core-js/internals/native-url.js"); -var redefine = __webpack_require__(/*! ../internals/redefine */ "./node_modules/core-js/internals/redefine.js"); -var redefineAll = __webpack_require__(/*! ../internals/redefine-all */ "./node_modules/core-js/internals/redefine-all.js"); -var setToStringTag = __webpack_require__(/*! ../internals/set-to-string-tag */ "./node_modules/core-js/internals/set-to-string-tag.js"); -var createIteratorConstructor = __webpack_require__(/*! ../internals/create-iterator-constructor */ "./node_modules/core-js/internals/create-iterator-constructor.js"); -var InternalStateModule = __webpack_require__(/*! ../internals/internal-state */ "./node_modules/core-js/internals/internal-state.js"); -var anInstance = __webpack_require__(/*! ../internals/an-instance */ "./node_modules/core-js/internals/an-instance.js"); -var hasOwn = __webpack_require__(/*! ../internals/has */ "./node_modules/core-js/internals/has.js"); -var bind = __webpack_require__(/*! ../internals/bind-context */ "./node_modules/core-js/internals/bind-context.js"); -var anObject = __webpack_require__(/*! ../internals/an-object */ "./node_modules/core-js/internals/an-object.js"); -var isObject = __webpack_require__(/*! ../internals/is-object */ "./node_modules/core-js/internals/is-object.js"); -var getIterator = __webpack_require__(/*! ../internals/get-iterator */ "./node_modules/core-js/internals/get-iterator.js"); -var getIteratorMethod = __webpack_require__(/*! ../internals/get-iterator-method */ "./node_modules/core-js/internals/get-iterator-method.js"); -var wellKnownSymbol = __webpack_require__(/*! ../internals/well-known-symbol */ "./node_modules/core-js/internals/well-known-symbol.js"); - -var ITERATOR = wellKnownSymbol('iterator'); -var URL_SEARCH_PARAMS = 'URLSearchParams'; -var URL_SEARCH_PARAMS_ITERATOR = URL_SEARCH_PARAMS + 'Iterator'; -var setInternalState = InternalStateModule.set; -var getInternalParamsState = InternalStateModule.getterFor(URL_SEARCH_PARAMS); -var getInternalIteratorState = InternalStateModule.getterFor(URL_SEARCH_PARAMS_ITERATOR); - -var plus = /\+/g; -var sequences = Array(4); - -var percentSequence = function (bytes) { - return sequences[bytes - 1] || (sequences[bytes - 1] = RegExp('((?:%[\\da-f]{2}){' + bytes + '})', 'gi')); -}; - -var percentDecode = function (sequence) { - try { - return decodeURIComponent(sequence); - } catch (error) { - return sequence; - } -}; - -var deserialize = function (it) { - var result = it.replace(plus, ' '); - var bytes = 4; - try { - return decodeURIComponent(result); - } catch (error) { - while (bytes) { - result = result.replace(percentSequence(bytes--), percentDecode); - } - return result; - } -}; - -var find = /[!'()~]|%20/g; - -var replace = { - '!': '%21', - "'": '%27', - '(': '%28', - ')': '%29', - '~': '%7E', - '%20': '+' -}; - -var replacer = function (match) { - return replace[match]; -}; - -var serialize = function (it) { - return encodeURIComponent(it).replace(find, replacer); -}; - -var parseSearchParams = function (result, query) { - if (query) { - var attributes = query.split('&'); - var index = 0; - var attribute, entry; - while (index < attributes.length) { - attribute = attributes[index++]; - if (attribute.length) { - entry = attribute.split('='); - result.push({ - key: deserialize(entry.shift()), - value: deserialize(entry.join('=')) - }); - } - } - } -}; - -var updateSearchParams = function (query) { - this.entries.length = 0; - parseSearchParams(this.entries, query); -}; - -var validateArgumentsLength = function (passed, required) { - if (passed < required) throw TypeError('Not enough arguments'); -}; - -var URLSearchParamsIterator = createIteratorConstructor(function Iterator(params, kind) { - setInternalState(this, { - type: URL_SEARCH_PARAMS_ITERATOR, - iterator: getIterator(getInternalParamsState(params).entries), - kind: kind - }); -}, 'Iterator', function next() { - var state = getInternalIteratorState(this); - var kind = state.kind; - var step = state.iterator.next(); - var entry = step.value; - if (!step.done) { - step.value = kind === 'keys' ? entry.key : kind === 'values' ? entry.value : [entry.key, entry.value]; - } return step; -}); - -// `URLSearchParams` constructor -// https://url.spec.whatwg.org/#interface-urlsearchparams -var URLSearchParamsConstructor = function URLSearchParams(/* init */) { - anInstance(this, URLSearchParamsConstructor, URL_SEARCH_PARAMS); - var init = arguments.length > 0 ? arguments[0] : undefined; - var that = this; - var entries = []; - var iteratorMethod, iterator, next, step, entryIterator, entryNext, first, second, key; - - setInternalState(that, { - type: URL_SEARCH_PARAMS, - entries: entries, - updateURL: function () { /* empty */ }, - updateSearchParams: updateSearchParams - }); - - if (init !== undefined) { - if (isObject(init)) { - iteratorMethod = getIteratorMethod(init); - if (typeof iteratorMethod === 'function') { - iterator = iteratorMethod.call(init); - next = iterator.next; - while (!(step = next.call(iterator)).done) { - entryIterator = getIterator(anObject(step.value)); - entryNext = entryIterator.next; - if ( - (first = entryNext.call(entryIterator)).done || - (second = entryNext.call(entryIterator)).done || - !entryNext.call(entryIterator).done - ) throw TypeError('Expected sequence with length 2'); - entries.push({ key: first.value + '', value: second.value + '' }); - } - } else for (key in init) if (hasOwn(init, key)) entries.push({ key: key, value: init[key] + '' }); - } else { - parseSearchParams(entries, typeof init === 'string' ? init.charAt(0) === '?' ? init.slice(1) : init : init + ''); - } - } -}; - -var URLSearchParamsPrototype = URLSearchParamsConstructor.prototype; - -redefineAll(URLSearchParamsPrototype, { - // `URLSearchParams.prototype.appent` method - // https://url.spec.whatwg.org/#dom-urlsearchparams-append - append: function append(name, value) { - validateArgumentsLength(arguments.length, 2); - var state = getInternalParamsState(this); - state.entries.push({ key: name + '', value: value + '' }); - state.updateURL(); - }, - // `URLSearchParams.prototype.delete` method - // https://url.spec.whatwg.org/#dom-urlsearchparams-delete - 'delete': function (name) { - validateArgumentsLength(arguments.length, 1); - var state = getInternalParamsState(this); - var entries = state.entries; - var key = name + ''; - var index = 0; - while (index < entries.length) { - if (entries[index].key === key) entries.splice(index, 1); - else index++; - } - state.updateURL(); - }, - // `URLSearchParams.prototype.get` method - // https://url.spec.whatwg.org/#dom-urlsearchparams-get - get: function get(name) { - validateArgumentsLength(arguments.length, 1); - var entries = getInternalParamsState(this).entries; - var key = name + ''; - var index = 0; - for (; index < entries.length; index++) { - if (entries[index].key === key) return entries[index].value; - } - return null; - }, - // `URLSearchParams.prototype.getAll` method - // https://url.spec.whatwg.org/#dom-urlsearchparams-getall - getAll: function getAll(name) { - validateArgumentsLength(arguments.length, 1); - var entries = getInternalParamsState(this).entries; - var key = name + ''; - var result = []; - var index = 0; - for (; index < entries.length; index++) { - if (entries[index].key === key) result.push(entries[index].value); - } - return result; - }, - // `URLSearchParams.prototype.has` method - // https://url.spec.whatwg.org/#dom-urlsearchparams-has - has: function has(name) { - validateArgumentsLength(arguments.length, 1); - var entries = getInternalParamsState(this).entries; - var key = name + ''; - var index = 0; - while (index < entries.length) { - if (entries[index++].key === key) return true; - } - return false; - }, - // `URLSearchParams.prototype.set` method - // https://url.spec.whatwg.org/#dom-urlsearchparams-set - set: function set(name, value) { - validateArgumentsLength(arguments.length, 1); - var state = getInternalParamsState(this); - var entries = state.entries; - var found = false; - var key = name + ''; - var val = value + ''; - var index = 0; - var entry; - for (; index < entries.length; index++) { - entry = entries[index]; - if (entry.key === key) { - if (found) entries.splice(index--, 1); - else { - found = true; - entry.value = val; - } - } - } - if (!found) entries.push({ key: key, value: val }); - state.updateURL(); - }, - // `URLSearchParams.prototype.sort` method - // https://url.spec.whatwg.org/#dom-urlsearchparams-sort - sort: function sort() { - var state = getInternalParamsState(this); - var entries = state.entries; - // Array#sort is not stable in some engines - var slice = entries.slice(); - var entry, entriesIndex, sliceIndex; - entries.length = 0; - for (sliceIndex = 0; sliceIndex < slice.length; sliceIndex++) { - entry = slice[sliceIndex]; - for (entriesIndex = 0; entriesIndex < sliceIndex; entriesIndex++) { - if (entries[entriesIndex].key > entry.key) { - entries.splice(entriesIndex, 0, entry); - break; - } - } - if (entriesIndex === sliceIndex) entries.push(entry); - } - state.updateURL(); - }, - // `URLSearchParams.prototype.forEach` method - forEach: function forEach(callback /* , thisArg */) { - var entries = getInternalParamsState(this).entries; - var boundFunction = bind(callback, arguments.length > 1 ? arguments[1] : undefined, 3); - var index = 0; - var entry; - while (index < entries.length) { - entry = entries[index++]; - boundFunction(entry.value, entry.key, this); - } - }, - // `URLSearchParams.prototype.keys` method - keys: function keys() { - return new URLSearchParamsIterator(this, 'keys'); - }, - // `URLSearchParams.prototype.values` method - values: function values() { - return new URLSearchParamsIterator(this, 'values'); - }, - // `URLSearchParams.prototype.entries` method - entries: function entries() { - return new URLSearchParamsIterator(this, 'entries'); - } -}, { enumerable: true }); - -// `URLSearchParams.prototype[@@iterator]` method -redefine(URLSearchParamsPrototype, ITERATOR, URLSearchParamsPrototype.entries); - -// `URLSearchParams.prototype.toString` method -// https://url.spec.whatwg.org/#urlsearchparams-stringification-behavior -redefine(URLSearchParamsPrototype, 'toString', function toString() { - var entries = getInternalParamsState(this).entries; - var result = []; - var index = 0; - var entry; - while (index < entries.length) { - entry = entries[index++]; - result.push(serialize(entry.key) + '=' + serialize(entry.value)); - } return result.join('&'); -}, { enumerable: true }); - -setToStringTag(URLSearchParamsConstructor, URL_SEARCH_PARAMS); - -$({ global: true, forced: !USE_NATIVE_URL }, { - URLSearchParams: URLSearchParamsConstructor -}); - -module.exports = { - URLSearchParams: URLSearchParamsConstructor, - getState: getInternalParamsState -}; - - -/***/ }), - -/***/ "./node_modules/core-js/modules/web.url.js": -/*!*************************************************!*\ - !*** ./node_modules/core-js/modules/web.url.js ***! - \*************************************************/ -/*! no static exports found */ -/***/ (function(module, exports, __webpack_require__) { - -"use strict"; - -// TODO: in core-js@4, move /modules/ dependencies to public entries for better optimization by tools like `preset-env` -__webpack_require__(/*! ../modules/es.string.iterator */ "./node_modules/core-js/modules/es.string.iterator.js"); -var $ = __webpack_require__(/*! ../internals/export */ "./node_modules/core-js/internals/export.js"); -var DESCRIPTORS = __webpack_require__(/*! ../internals/descriptors */ "./node_modules/core-js/internals/descriptors.js"); -var USE_NATIVE_URL = __webpack_require__(/*! ../internals/native-url */ "./node_modules/core-js/internals/native-url.js"); -var global = __webpack_require__(/*! ../internals/global */ "./node_modules/core-js/internals/global.js"); -var defineProperties = __webpack_require__(/*! ../internals/object-define-properties */ "./node_modules/core-js/internals/object-define-properties.js"); -var redefine = __webpack_require__(/*! ../internals/redefine */ "./node_modules/core-js/internals/redefine.js"); -var anInstance = __webpack_require__(/*! ../internals/an-instance */ "./node_modules/core-js/internals/an-instance.js"); -var has = __webpack_require__(/*! ../internals/has */ "./node_modules/core-js/internals/has.js"); -var assign = __webpack_require__(/*! ../internals/object-assign */ "./node_modules/core-js/internals/object-assign.js"); -var arrayFrom = __webpack_require__(/*! ../internals/array-from */ "./node_modules/core-js/internals/array-from.js"); -var codeAt = __webpack_require__(/*! ../internals/string-multibyte */ "./node_modules/core-js/internals/string-multibyte.js").codeAt; -var toASCII = __webpack_require__(/*! ../internals/punycode-to-ascii */ "./node_modules/core-js/internals/punycode-to-ascii.js"); -var setToStringTag = __webpack_require__(/*! ../internals/set-to-string-tag */ "./node_modules/core-js/internals/set-to-string-tag.js"); -var URLSearchParamsModule = __webpack_require__(/*! ../modules/web.url-search-params */ "./node_modules/core-js/modules/web.url-search-params.js"); -var InternalStateModule = __webpack_require__(/*! ../internals/internal-state */ "./node_modules/core-js/internals/internal-state.js"); - -var NativeURL = global.URL; -var URLSearchParams = URLSearchParamsModule.URLSearchParams; -var getInternalSearchParamsState = URLSearchParamsModule.getState; -var setInternalState = InternalStateModule.set; -var getInternalURLState = InternalStateModule.getterFor('URL'); -var floor = Math.floor; -var pow = Math.pow; - -var INVALID_AUTHORITY = 'Invalid authority'; -var INVALID_SCHEME = 'Invalid scheme'; -var INVALID_HOST = 'Invalid host'; -var INVALID_PORT = 'Invalid port'; - -var ALPHA = /[A-Za-z]/; -var ALPHANUMERIC = /[\d+\-.A-Za-z]/; -var DIGIT = /\d/; -var HEX_START = /^(0x|0X)/; -var OCT = /^[0-7]+$/; -var DEC = /^\d+$/; -var HEX = /^[\dA-Fa-f]+$/; -// eslint-disable-next-line no-control-regex -var FORBIDDEN_HOST_CODE_POINT = /[\u0000\u0009\u000A\u000D #%/:?@[\\]]/; -// eslint-disable-next-line no-control-regex -var FORBIDDEN_HOST_CODE_POINT_EXCLUDING_PERCENT = /[\u0000\u0009\u000A\u000D #/:?@[\\]]/; -// eslint-disable-next-line no-control-regex -var LEADING_AND_TRAILING_C0_CONTROL_OR_SPACE = /^[\u0000-\u001F ]+|[\u0000-\u001F ]+$/g; -// eslint-disable-next-line no-control-regex -var TAB_AND_NEW_LINE = /[\u0009\u000A\u000D]/g; -var EOF; - -var parseHost = function (url, input) { - var result, codePoints, index; - if (input.charAt(0) == '[') { - if (input.charAt(input.length - 1) != ']') return INVALID_HOST; - result = parseIPv6(input.slice(1, -1)); - if (!result) return INVALID_HOST; - url.host = result; - // opaque host - } else if (!isSpecial(url)) { - if (FORBIDDEN_HOST_CODE_POINT_EXCLUDING_PERCENT.test(input)) return INVALID_HOST; - result = ''; - codePoints = arrayFrom(input); - for (index = 0; index < codePoints.length; index++) { - result += percentEncode(codePoints[index], C0ControlPercentEncodeSet); - } - url.host = result; - } else { - input = toASCII(input); - if (FORBIDDEN_HOST_CODE_POINT.test(input)) return INVALID_HOST; - result = parseIPv4(input); - if (result === null) return INVALID_HOST; - url.host = result; - } -}; - -var parseIPv4 = function (input) { - var parts = input.split('.'); - var partsLength, numbers, index, part, radix, number, ipv4; - if (parts.length && parts[parts.length - 1] == '') { - parts.pop(); - } - partsLength = parts.length; - if (partsLength > 4) return input; - numbers = []; - for (index = 0; index < partsLength; index++) { - part = parts[index]; - if (part == '') return input; - radix = 10; - if (part.length > 1 && part.charAt(0) == '0') { - radix = HEX_START.test(part) ? 16 : 8; - part = part.slice(radix == 8 ? 1 : 2); - } - if (part === '') { - number = 0; - } else { - if (!(radix == 10 ? DEC : radix == 8 ? OCT : HEX).test(part)) return input; - number = parseInt(part, radix); - } - numbers.push(number); - } - for (index = 0; index < partsLength; index++) { - number = numbers[index]; - if (index == partsLength - 1) { - if (number >= pow(256, 5 - partsLength)) return null; - } else if (number > 255) return null; - } - ipv4 = numbers.pop(); - for (index = 0; index < numbers.length; index++) { - ipv4 += numbers[index] * pow(256, 3 - index); - } - return ipv4; -}; - -// eslint-disable-next-line max-statements -var parseIPv6 = function (input) { - var address = [0, 0, 0, 0, 0, 0, 0, 0]; - var pieceIndex = 0; - var compress = null; - var pointer = 0; - var value, length, numbersSeen, ipv4Piece, number, swaps, swap; - - var char = function () { - return input.charAt(pointer); - }; - - if (char() == ':') { - if (input.charAt(1) != ':') return; - pointer += 2; - pieceIndex++; - compress = pieceIndex; - } - while (char()) { - if (pieceIndex == 8) return; - if (char() == ':') { - if (compress !== null) return; - pointer++; - pieceIndex++; - compress = pieceIndex; - continue; - } - value = length = 0; - while (length < 4 && HEX.test(char())) { - value = value * 16 + parseInt(char(), 16); - pointer++; - length++; - } - if (char() == '.') { - if (length == 0) return; - pointer -= length; - if (pieceIndex > 6) return; - numbersSeen = 0; - while (char()) { - ipv4Piece = null; - if (numbersSeen > 0) { - if (char() == '.' && numbersSeen < 4) pointer++; - else return; - } - if (!DIGIT.test(char())) return; - while (DIGIT.test(char())) { - number = parseInt(char(), 10); - if (ipv4Piece === null) ipv4Piece = number; - else if (ipv4Piece == 0) return; - else ipv4Piece = ipv4Piece * 10 + number; - if (ipv4Piece > 255) return; - pointer++; - } - address[pieceIndex] = address[pieceIndex] * 256 + ipv4Piece; - numbersSeen++; - if (numbersSeen == 2 || numbersSeen == 4) pieceIndex++; - } - if (numbersSeen != 4) return; - break; - } else if (char() == ':') { - pointer++; - if (!char()) return; - } else if (char()) return; - address[pieceIndex++] = value; - } - if (compress !== null) { - swaps = pieceIndex - compress; - pieceIndex = 7; - while (pieceIndex != 0 && swaps > 0) { - swap = address[pieceIndex]; - address[pieceIndex--] = address[compress + swaps - 1]; - address[compress + --swaps] = swap; - } - } else if (pieceIndex != 8) return; - return address; -}; - -var findLongestZeroSequence = function (ipv6) { - var maxIndex = null; - var maxLength = 1; - var currStart = null; - var currLength = 0; - var index = 0; - for (; index < 8; index++) { - if (ipv6[index] !== 0) { - if (currLength > maxLength) { - maxIndex = currStart; - maxLength = currLength; - } - currStart = null; - currLength = 0; - } else { - if (currStart === null) currStart = index; - ++currLength; - } - } - if (currLength > maxLength) { - maxIndex = currStart; - maxLength = currLength; - } - return maxIndex; -}; - -var serializeHost = function (host) { - var result, index, compress, ignore0; - // ipv4 - if (typeof host == 'number') { - result = []; - for (index = 0; index < 4; index++) { - result.unshift(host % 256); - host = floor(host / 256); - } return result.join('.'); - // ipv6 - } else if (typeof host == 'object') { - result = ''; - compress = findLongestZeroSequence(host); - for (index = 0; index < 8; index++) { - if (ignore0 && host[index] === 0) continue; - if (ignore0) ignore0 = false; - if (compress === index) { - result += index ? ':' : '::'; - ignore0 = true; - } else { - result += host[index].toString(16); - if (index < 7) result += ':'; - } - } - return '[' + result + ']'; - } return host; -}; - -var C0ControlPercentEncodeSet = {}; -var fragmentPercentEncodeSet = assign({}, C0ControlPercentEncodeSet, { - ' ': 1, '"': 1, '<': 1, '>': 1, '`': 1 -}); -var pathPercentEncodeSet = assign({}, fragmentPercentEncodeSet, { - '#': 1, '?': 1, '{': 1, '}': 1 -}); -var userinfoPercentEncodeSet = assign({}, pathPercentEncodeSet, { - '/': 1, ':': 1, ';': 1, '=': 1, '@': 1, '[': 1, '\\': 1, ']': 1, '^': 1, '|': 1 -}); - -var percentEncode = function (char, set) { - var code = codeAt(char, 0); - return code > 0x20 && code < 0x7F && !has(set, char) ? char : encodeURIComponent(char); -}; - -var specialSchemes = { - ftp: 21, - file: null, - gopher: 70, - http: 80, - https: 443, - ws: 80, - wss: 443 -}; - -var isSpecial = function (url) { - return has(specialSchemes, url.scheme); -}; - -var includesCredentials = function (url) { - return url.username != '' || url.password != ''; -}; - -var cannotHaveUsernamePasswordPort = function (url) { - return !url.host || url.cannotBeABaseURL || url.scheme == 'file'; -}; - -var isWindowsDriveLetter = function (string, normalized) { - var second; - return string.length == 2 && ALPHA.test(string.charAt(0)) - && ((second = string.charAt(1)) == ':' || (!normalized && second == '|')); -}; - -var startsWithWindowsDriveLetter = function (string) { - var third; - return string.length > 1 && isWindowsDriveLetter(string.slice(0, 2)) && ( - string.length == 2 || - ((third = string.charAt(2)) === '/' || third === '\\' || third === '?' || third === '#') - ); -}; - -var shortenURLsPath = function (url) { - var path = url.path; - var pathSize = path.length; - if (pathSize && (url.scheme != 'file' || pathSize != 1 || !isWindowsDriveLetter(path[0], true))) { - path.pop(); - } -}; - -var isSingleDot = function (segment) { - return segment === '.' || segment.toLowerCase() === '%2e'; -}; - -var isDoubleDot = function (segment) { - segment = segment.toLowerCase(); - return segment === '..' || segment === '%2e.' || segment === '.%2e' || segment === '%2e%2e'; -}; - -// States: -var SCHEME_START = {}; -var SCHEME = {}; -var NO_SCHEME = {}; -var SPECIAL_RELATIVE_OR_AUTHORITY = {}; -var PATH_OR_AUTHORITY = {}; -var RELATIVE = {}; -var RELATIVE_SLASH = {}; -var SPECIAL_AUTHORITY_SLASHES = {}; -var SPECIAL_AUTHORITY_IGNORE_SLASHES = {}; -var AUTHORITY = {}; -var HOST = {}; -var HOSTNAME = {}; -var PORT = {}; -var FILE = {}; -var FILE_SLASH = {}; -var FILE_HOST = {}; -var PATH_START = {}; -var PATH = {}; -var CANNOT_BE_A_BASE_URL_PATH = {}; -var QUERY = {}; -var FRAGMENT = {}; - -// eslint-disable-next-line max-statements -var parseURL = function (url, input, stateOverride, base) { - var state = stateOverride || SCHEME_START; - var pointer = 0; - var buffer = ''; - var seenAt = false; - var seenBracket = false; - var seenPasswordToken = false; - var codePoints, char, bufferCodePoints, failure; - - if (!stateOverride) { - url.scheme = ''; - url.username = ''; - url.password = ''; - url.host = null; - url.port = null; - url.path = []; - url.query = null; - url.fragment = null; - url.cannotBeABaseURL = false; - input = input.replace(LEADING_AND_TRAILING_C0_CONTROL_OR_SPACE, ''); - } - - input = input.replace(TAB_AND_NEW_LINE, ''); - - codePoints = arrayFrom(input); - - while (pointer <= codePoints.length) { - char = codePoints[pointer]; - switch (state) { - case SCHEME_START: - if (char && ALPHA.test(char)) { - buffer += char.toLowerCase(); - state = SCHEME; - } else if (!stateOverride) { - state = NO_SCHEME; - continue; - } else return INVALID_SCHEME; - break; - - case SCHEME: - if (char && (ALPHANUMERIC.test(char) || char == '+' || char == '-' || char == '.')) { - buffer += char.toLowerCase(); - } else if (char == ':') { - if (stateOverride && ( - (isSpecial(url) != has(specialSchemes, buffer)) || - (buffer == 'file' && (includesCredentials(url) || url.port !== null)) || - (url.scheme == 'file' && !url.host) - )) return; - url.scheme = buffer; - if (stateOverride) { - if (isSpecial(url) && specialSchemes[url.scheme] == url.port) url.port = null; - return; - } - buffer = ''; - if (url.scheme == 'file') { - state = FILE; - } else if (isSpecial(url) && base && base.scheme == url.scheme) { - state = SPECIAL_RELATIVE_OR_AUTHORITY; - } else if (isSpecial(url)) { - state = SPECIAL_AUTHORITY_SLASHES; - } else if (codePoints[pointer + 1] == '/') { - state = PATH_OR_AUTHORITY; - pointer++; - } else { - url.cannotBeABaseURL = true; - url.path.push(''); - state = CANNOT_BE_A_BASE_URL_PATH; - } - } else if (!stateOverride) { - buffer = ''; - state = NO_SCHEME; - pointer = 0; - continue; - } else return INVALID_SCHEME; - break; - - case NO_SCHEME: - if (!base || (base.cannotBeABaseURL && char != '#')) return INVALID_SCHEME; - if (base.cannotBeABaseURL && char == '#') { - url.scheme = base.scheme; - url.path = base.path.slice(); - url.query = base.query; - url.fragment = ''; - url.cannotBeABaseURL = true; - state = FRAGMENT; - break; - } - state = base.scheme == 'file' ? FILE : RELATIVE; - continue; - - case SPECIAL_RELATIVE_OR_AUTHORITY: - if (char == '/' && codePoints[pointer + 1] == '/') { - state = SPECIAL_AUTHORITY_IGNORE_SLASHES; - pointer++; - } else { - state = RELATIVE; - continue; - } break; - - case PATH_OR_AUTHORITY: - if (char == '/') { - state = AUTHORITY; - break; - } else { - state = PATH; - continue; - } - - case RELATIVE: - url.scheme = base.scheme; - if (char == EOF) { - url.username = base.username; - url.password = base.password; - url.host = base.host; - url.port = base.port; - url.path = base.path.slice(); - url.query = base.query; - } else if (char == '/' || (char == '\\' && isSpecial(url))) { - state = RELATIVE_SLASH; - } else if (char == '?') { - url.username = base.username; - url.password = base.password; - url.host = base.host; - url.port = base.port; - url.path = base.path.slice(); - url.query = ''; - state = QUERY; - } else if (char == '#') { - url.username = base.username; - url.password = base.password; - url.host = base.host; - url.port = base.port; - url.path = base.path.slice(); - url.query = base.query; - url.fragment = ''; - state = FRAGMENT; - } else { - url.username = base.username; - url.password = base.password; - url.host = base.host; - url.port = base.port; - url.path = base.path.slice(); - url.path.pop(); - state = PATH; - continue; - } break; - - case RELATIVE_SLASH: - if (isSpecial(url) && (char == '/' || char == '\\')) { - state = SPECIAL_AUTHORITY_IGNORE_SLASHES; - } else if (char == '/') { - state = AUTHORITY; - } else { - url.username = base.username; - url.password = base.password; - url.host = base.host; - url.port = base.port; - state = PATH; - continue; - } break; - - case SPECIAL_AUTHORITY_SLASHES: - state = SPECIAL_AUTHORITY_IGNORE_SLASHES; - if (char != '/' || buffer.charAt(pointer + 1) != '/') continue; - pointer++; - break; - - case SPECIAL_AUTHORITY_IGNORE_SLASHES: - if (char != '/' && char != '\\') { - state = AUTHORITY; - continue; - } break; - - case AUTHORITY: - if (char == '@') { - if (seenAt) buffer = '%40' + buffer; - seenAt = true; - bufferCodePoints = arrayFrom(buffer); - for (var i = 0; i < bufferCodePoints.length; i++) { - var codePoint = bufferCodePoints[i]; - if (codePoint == ':' && !seenPasswordToken) { - seenPasswordToken = true; - continue; - } - var encodedCodePoints = percentEncode(codePoint, userinfoPercentEncodeSet); - if (seenPasswordToken) url.password += encodedCodePoints; - else url.username += encodedCodePoints; - } - buffer = ''; - } else if ( - char == EOF || char == '/' || char == '?' || char == '#' || - (char == '\\' && isSpecial(url)) - ) { - if (seenAt && buffer == '') return INVALID_AUTHORITY; - pointer -= arrayFrom(buffer).length + 1; - buffer = ''; - state = HOST; - } else buffer += char; - break; - - case HOST: - case HOSTNAME: - if (stateOverride && url.scheme == 'file') { - state = FILE_HOST; - continue; - } else if (char == ':' && !seenBracket) { - if (buffer == '') return INVALID_HOST; - failure = parseHost(url, buffer); - if (failure) return failure; - buffer = ''; - state = PORT; - if (stateOverride == HOSTNAME) return; - } else if ( - char == EOF || char == '/' || char == '?' || char == '#' || - (char == '\\' && isSpecial(url)) - ) { - if (isSpecial(url) && buffer == '') return INVALID_HOST; - if (stateOverride && buffer == '' && (includesCredentials(url) || url.port !== null)) return; - failure = parseHost(url, buffer); - if (failure) return failure; - buffer = ''; - state = PATH_START; - if (stateOverride) return; - continue; - } else { - if (char == '[') seenBracket = true; - else if (char == ']') seenBracket = false; - buffer += char; - } break; - - case PORT: - if (DIGIT.test(char)) { - buffer += char; - } else if ( - char == EOF || char == '/' || char == '?' || char == '#' || - (char == '\\' && isSpecial(url)) || - stateOverride - ) { - if (buffer != '') { - var port = parseInt(buffer, 10); - if (port > 0xFFFF) return INVALID_PORT; - url.port = (isSpecial(url) && port === specialSchemes[url.scheme]) ? null : port; - buffer = ''; - } - if (stateOverride) return; - state = PATH_START; - continue; - } else return INVALID_PORT; - break; - - case FILE: - url.scheme = 'file'; - if (char == '/' || char == '\\') state = FILE_SLASH; - else if (base && base.scheme == 'file') { - if (char == EOF) { - url.host = base.host; - url.path = base.path.slice(); - url.query = base.query; - } else if (char == '?') { - url.host = base.host; - url.path = base.path.slice(); - url.query = ''; - state = QUERY; - } else if (char == '#') { - url.host = base.host; - url.path = base.path.slice(); - url.query = base.query; - url.fragment = ''; - state = FRAGMENT; - } else { - if (!startsWithWindowsDriveLetter(codePoints.slice(pointer).join(''))) { - url.host = base.host; - url.path = base.path.slice(); - shortenURLsPath(url); - } - state = PATH; - continue; - } - } else { - state = PATH; - continue; - } break; - - case FILE_SLASH: - if (char == '/' || char == '\\') { - state = FILE_HOST; - break; - } - if (base && base.scheme == 'file' && !startsWithWindowsDriveLetter(codePoints.slice(pointer).join(''))) { - if (isWindowsDriveLetter(base.path[0], true)) url.path.push(base.path[0]); - else url.host = base.host; - } - state = PATH; - continue; - - case FILE_HOST: - if (char == EOF || char == '/' || char == '\\' || char == '?' || char == '#') { - if (!stateOverride && isWindowsDriveLetter(buffer)) { - state = PATH; - } else if (buffer == '') { - url.host = ''; - if (stateOverride) return; - state = PATH_START; - } else { - failure = parseHost(url, buffer); - if (failure) return failure; - if (url.host == 'localhost') url.host = ''; - if (stateOverride) return; - buffer = ''; - state = PATH_START; - } continue; - } else buffer += char; - break; - - case PATH_START: - if (isSpecial(url)) { - state = PATH; - if (char != '/' && char != '\\') continue; - } else if (!stateOverride && char == '?') { - url.query = ''; - state = QUERY; - } else if (!stateOverride && char == '#') { - url.fragment = ''; - state = FRAGMENT; - } else if (char != EOF) { - state = PATH; - if (char != '/') continue; - } break; - - case PATH: - if ( - char == EOF || char == '/' || - (char == '\\' && isSpecial(url)) || - (!stateOverride && (char == '?' || char == '#')) - ) { - if (isDoubleDot(buffer)) { - shortenURLsPath(url); - if (char != '/' && !(char == '\\' && isSpecial(url))) { - url.path.push(''); - } - } else if (isSingleDot(buffer)) { - if (char != '/' && !(char == '\\' && isSpecial(url))) { - url.path.push(''); - } - } else { - if (url.scheme == 'file' && !url.path.length && isWindowsDriveLetter(buffer)) { - if (url.host) url.host = ''; - buffer = buffer.charAt(0) + ':'; // normalize windows drive letter - } - url.path.push(buffer); - } - buffer = ''; - if (url.scheme == 'file' && (char == EOF || char == '?' || char == '#')) { - while (url.path.length > 1 && url.path[0] === '') { - url.path.shift(); - } - } - if (char == '?') { - url.query = ''; - state = QUERY; - } else if (char == '#') { - url.fragment = ''; - state = FRAGMENT; - } - } else { - buffer += percentEncode(char, pathPercentEncodeSet); - } break; - - case CANNOT_BE_A_BASE_URL_PATH: - if (char == '?') { - url.query = ''; - state = QUERY; - } else if (char == '#') { - url.fragment = ''; - state = FRAGMENT; - } else if (char != EOF) { - url.path[0] += percentEncode(char, C0ControlPercentEncodeSet); - } break; - - case QUERY: - if (!stateOverride && char == '#') { - url.fragment = ''; - state = FRAGMENT; - } else if (char != EOF) { - if (char == "'" && isSpecial(url)) url.query += '%27'; - else if (char == '#') url.query += '%23'; - else url.query += percentEncode(char, C0ControlPercentEncodeSet); - } break; - - case FRAGMENT: - if (char != EOF) url.fragment += percentEncode(char, fragmentPercentEncodeSet); - break; - } - - pointer++; - } -}; - -// `URL` constructor -// https://url.spec.whatwg.org/#url-class -var URLConstructor = function URL(url /* , base */) { - var that = anInstance(this, URLConstructor, 'URL'); - var base = arguments.length > 1 ? arguments[1] : undefined; - var urlString = String(url); - var state = setInternalState(that, { type: 'URL' }); - var baseState, failure; - if (base !== undefined) { - if (base instanceof URLConstructor) baseState = getInternalURLState(base); - else { - failure = parseURL(baseState = {}, String(base)); - if (failure) throw TypeError(failure); - } - } - failure = parseURL(state, urlString, null, baseState); - if (failure) throw TypeError(failure); - var searchParams = state.searchParams = new URLSearchParams(); - var searchParamsState = getInternalSearchParamsState(searchParams); - searchParamsState.updateSearchParams(state.query); - searchParamsState.updateURL = function () { - state.query = String(searchParams) || null; - }; - if (!DESCRIPTORS) { - that.href = serializeURL.call(that); - that.origin = getOrigin.call(that); - that.protocol = getProtocol.call(that); - that.username = getUsername.call(that); - that.password = getPassword.call(that); - that.host = getHost.call(that); - that.hostname = getHostname.call(that); - that.port = getPort.call(that); - that.pathname = getPathname.call(that); - that.search = getSearch.call(that); - that.searchParams = getSearchParams.call(that); - that.hash = getHash.call(that); - } -}; - -var URLPrototype = URLConstructor.prototype; - -var serializeURL = function () { - var url = getInternalURLState(this); - var scheme = url.scheme; - var username = url.username; - var password = url.password; - var host = url.host; - var port = url.port; - var path = url.path; - var query = url.query; - var fragment = url.fragment; - var output = scheme + ':'; - if (host !== null) { - output += '//'; - if (includesCredentials(url)) { - output += username + (password ? ':' + password : '') + '@'; - } - output += serializeHost(host); - if (port !== null) output += ':' + port; - } else if (scheme == 'file') output += '//'; - output += url.cannotBeABaseURL ? path[0] : path.length ? '/' + path.join('/') : ''; - if (query !== null) output += '?' + query; - if (fragment !== null) output += '#' + fragment; - return output; -}; - -var getOrigin = function () { - var url = getInternalURLState(this); - var scheme = url.scheme; - var port = url.port; - if (scheme == 'blob') try { - return new URL(scheme.path[0]).origin; - } catch (error) { - return 'null'; - } - if (scheme == 'file' || !isSpecial(url)) return 'null'; - return scheme + '://' + serializeHost(url.host) + (port !== null ? ':' + port : ''); -}; - -var getProtocol = function () { - return getInternalURLState(this).scheme + ':'; -}; - -var getUsername = function () { - return getInternalURLState(this).username; -}; - -var getPassword = function () { - return getInternalURLState(this).password; -}; - -var getHost = function () { - var url = getInternalURLState(this); - var host = url.host; - var port = url.port; - return host === null ? '' - : port === null ? serializeHost(host) - : serializeHost(host) + ':' + port; -}; - -var getHostname = function () { - var host = getInternalURLState(this).host; - return host === null ? '' : serializeHost(host); -}; - -var getPort = function () { - var port = getInternalURLState(this).port; - return port === null ? '' : String(port); -}; - -var getPathname = function () { - var url = getInternalURLState(this); - var path = url.path; - return url.cannotBeABaseURL ? path[0] : path.length ? '/' + path.join('/') : ''; -}; - -var getSearch = function () { - var query = getInternalURLState(this).query; - return query ? '?' + query : ''; -}; - -var getSearchParams = function () { - return getInternalURLState(this).searchParams; -}; - -var getHash = function () { - var fragment = getInternalURLState(this).fragment; - return fragment ? '#' + fragment : ''; -}; - -var accessorDescriptor = function (getter, setter) { - return { get: getter, set: setter, configurable: true, enumerable: true }; -}; - -if (DESCRIPTORS) { - defineProperties(URLPrototype, { - // `URL.prototype.href` accessors pair - // https://url.spec.whatwg.org/#dom-url-href - href: accessorDescriptor(serializeURL, function (href) { - var url = getInternalURLState(this); - var urlString = String(href); - var failure = parseURL(url, urlString); - if (failure) throw TypeError(failure); - getInternalSearchParamsState(url.searchParams).updateSearchParams(url.query); - }), - // `URL.prototype.origin` getter - // https://url.spec.whatwg.org/#dom-url-origin - origin: accessorDescriptor(getOrigin), - // `URL.prototype.protocol` accessors pair - // https://url.spec.whatwg.org/#dom-url-protocol - protocol: accessorDescriptor(getProtocol, function (protocol) { - var url = getInternalURLState(this); - parseURL(url, String(protocol) + ':', SCHEME_START); - }), - // `URL.prototype.username` accessors pair - // https://url.spec.whatwg.org/#dom-url-username - username: accessorDescriptor(getUsername, function (username) { - var url = getInternalURLState(this); - var codePoints = arrayFrom(String(username)); - if (cannotHaveUsernamePasswordPort(url)) return; - url.username = ''; - for (var i = 0; i < codePoints.length; i++) { - url.username += percentEncode(codePoints[i], userinfoPercentEncodeSet); - } - }), - // `URL.prototype.password` accessors pair - // https://url.spec.whatwg.org/#dom-url-password - password: accessorDescriptor(getPassword, function (password) { - var url = getInternalURLState(this); - var codePoints = arrayFrom(String(password)); - if (cannotHaveUsernamePasswordPort(url)) return; - url.password = ''; - for (var i = 0; i < codePoints.length; i++) { - url.password += percentEncode(codePoints[i], userinfoPercentEncodeSet); - } - }), - // `URL.prototype.host` accessors pair - // https://url.spec.whatwg.org/#dom-url-host - host: accessorDescriptor(getHost, function (host) { - var url = getInternalURLState(this); - if (url.cannotBeABaseURL) return; - parseURL(url, String(host), HOST); - }), - // `URL.prototype.hostname` accessors pair - // https://url.spec.whatwg.org/#dom-url-hostname - hostname: accessorDescriptor(getHostname, function (hostname) { - var url = getInternalURLState(this); - if (url.cannotBeABaseURL) return; - parseURL(url, String(hostname), HOSTNAME); - }), - // `URL.prototype.port` accessors pair - // https://url.spec.whatwg.org/#dom-url-port - port: accessorDescriptor(getPort, function (port) { - var url = getInternalURLState(this); - if (cannotHaveUsernamePasswordPort(url)) return; - port = String(port); - if (port == '') url.port = null; - else parseURL(url, port, PORT); - }), - // `URL.prototype.pathname` accessors pair - // https://url.spec.whatwg.org/#dom-url-pathname - pathname: accessorDescriptor(getPathname, function (pathname) { - var url = getInternalURLState(this); - if (url.cannotBeABaseURL) return; - url.path = []; - parseURL(url, pathname + '', PATH_START); - }), - // `URL.prototype.search` accessors pair - // https://url.spec.whatwg.org/#dom-url-search - search: accessorDescriptor(getSearch, function (search) { - var url = getInternalURLState(this); - search = String(search); - if (search == '') { - url.query = null; - } else { - if ('?' == search.charAt(0)) search = search.slice(1); - url.query = ''; - parseURL(url, search, QUERY); - } - getInternalSearchParamsState(url.searchParams).updateSearchParams(url.query); - }), - // `URL.prototype.searchParams` getter - // https://url.spec.whatwg.org/#dom-url-searchparams - searchParams: accessorDescriptor(getSearchParams), - // `URL.prototype.hash` accessors pair - // https://url.spec.whatwg.org/#dom-url-hash - hash: accessorDescriptor(getHash, function (hash) { - var url = getInternalURLState(this); - hash = String(hash); - if (hash == '') { - url.fragment = null; - return; - } - if ('#' == hash.charAt(0)) hash = hash.slice(1); - url.fragment = ''; - parseURL(url, hash, FRAGMENT); - }) - }); -} - -// `URL.prototype.toJSON` method -// https://url.spec.whatwg.org/#dom-url-tojson -redefine(URLPrototype, 'toJSON', function toJSON() { - return serializeURL.call(this); -}, { enumerable: true }); - -// `URL.prototype.toString` method -// https://url.spec.whatwg.org/#URL-stringification-behavior -redefine(URLPrototype, 'toString', function toString() { - return serializeURL.call(this); -}, { enumerable: true }); - -if (NativeURL) { - var nativeCreateObjectURL = NativeURL.createObjectURL; - var nativeRevokeObjectURL = NativeURL.revokeObjectURL; - // `URL.createObjectURL` method - // https://developer.mozilla.org/en-US/docs/Web/API/URL/createObjectURL - // eslint-disable-next-line no-unused-vars - if (nativeCreateObjectURL) redefine(URLConstructor, 'createObjectURL', function createObjectURL(blob) { - return nativeCreateObjectURL.apply(NativeURL, arguments); - }); - // `URL.revokeObjectURL` method - // https://developer.mozilla.org/en-US/docs/Web/API/URL/revokeObjectURL - // eslint-disable-next-line no-unused-vars - if (nativeRevokeObjectURL) redefine(URLConstructor, 'revokeObjectURL', function revokeObjectURL(url) { - return nativeRevokeObjectURL.apply(NativeURL, arguments); - }); -} - -setToStringTag(URLConstructor, 'URL'); - -$({ global: true, forced: !USE_NATIVE_URL, sham: !DESCRIPTORS }, { - URL: URLConstructor -}); - - -/***/ }), - -/***/ "./node_modules/core-js/modules/web.url.to-json.js": -/*!*********************************************************!*\ - !*** ./node_modules/core-js/modules/web.url.to-json.js ***! - \*********************************************************/ -/*! no static exports found */ -/***/ (function(module, exports, __webpack_require__) { - -"use strict"; - -var $ = __webpack_require__(/*! ../internals/export */ "./node_modules/core-js/internals/export.js"); - -// `URL.prototype.toJSON` method -// https://url.spec.whatwg.org/#dom-url-tojson -$({ target: 'URL', proto: true, enumerable: true }, { - toJSON: function toJSON() { - return URL.prototype.toString.call(this); - } -}); - - -/***/ }), - -/***/ "./node_modules/error-stack-parser/error-stack-parser.js": -/*!***************************************************************!*\ - !*** ./node_modules/error-stack-parser/error-stack-parser.js ***! - \***************************************************************/ -/*! no static exports found */ -/***/ (function(module, exports, __webpack_require__) { - -var __WEBPACK_AMD_DEFINE_FACTORY__, __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;(function(root, factory) { - 'use strict'; - // Universal Module Definition (UMD) to support AMD, CommonJS/Node.js, Rhino, and browsers. - - /* istanbul ignore next */ - if (true) { - !(__WEBPACK_AMD_DEFINE_ARRAY__ = [__webpack_require__(/*! stackframe */ "./node_modules/stackframe/stackframe.js")], __WEBPACK_AMD_DEFINE_FACTORY__ = (factory), - __WEBPACK_AMD_DEFINE_RESULT__ = (typeof __WEBPACK_AMD_DEFINE_FACTORY__ === 'function' ? - (__WEBPACK_AMD_DEFINE_FACTORY__.apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__)) : __WEBPACK_AMD_DEFINE_FACTORY__), - __WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__)); - } else {} -}(this, function ErrorStackParser(StackFrame) { - 'use strict'; - - var FIREFOX_SAFARI_STACK_REGEXP = /(^|@)\S+\:\d+/; - var CHROME_IE_STACK_REGEXP = /^\s*at .*(\S+\:\d+|\(native\))/m; - var SAFARI_NATIVE_CODE_REGEXP = /^(eval@)?(\[native code\])?$/; - - return { - /** - * Given an Error object, extract the most information from it. - * - * @param {Error} error object - * @return {Array} of StackFrames - */ - parse: function ErrorStackParser$$parse(error) { - if (typeof error.stacktrace !== 'undefined' || typeof error['opera#sourceloc'] !== 'undefined') { - return this.parseOpera(error); - } else if (error.stack && error.stack.match(CHROME_IE_STACK_REGEXP)) { - return this.parseV8OrIE(error); - } else if (error.stack) { - return this.parseFFOrSafari(error); - } else { - throw new Error('Cannot parse given Error object'); - } - }, - - // Separate line and column numbers from a string of the form: (URI:Line:Column) - extractLocation: function ErrorStackParser$$extractLocation(urlLike) { - // Fail-fast but return locations like "(native)" - if (urlLike.indexOf(':') === -1) { - return [urlLike]; - } - - var regExp = /(.+?)(?:\:(\d+))?(?:\:(\d+))?$/; - var parts = regExp.exec(urlLike.replace(/[\(\)]/g, '')); - return [parts[1], parts[2] || undefined, parts[3] || undefined]; - }, - - parseV8OrIE: function ErrorStackParser$$parseV8OrIE(error) { - var filtered = error.stack.split('\n').filter(function(line) { - return !!line.match(CHROME_IE_STACK_REGEXP); - }, this); - - return filtered.map(function(line) { - if (line.indexOf('(eval ') > -1) { - // Throw away eval information until we implement stacktrace.js/stackframe#8 - line = line.replace(/eval code/g, 'eval').replace(/(\(eval at [^\()]*)|(\)\,.*$)/g, ''); - } - var sanitizedLine = line.replace(/^\s+/, '').replace(/\(eval code/g, '('); - - // capture and preseve the parenthesized location "(/foo/my bar.js:12:87)" in - // case it has spaces in it, as the string is split on \s+ later on - var location = sanitizedLine.match(/ (\((.+):(\d+):(\d+)\)$)/); - - // remove the parenthesized location from the line, if it was matched - sanitizedLine = location ? sanitizedLine.replace(location[0], '') : sanitizedLine; - - var tokens = sanitizedLine.split(/\s+/).slice(1); - // if a location was matched, pass it to extractLocation() otherwise pop the last token - var locationParts = this.extractLocation(location ? location[1] : tokens.pop()); - var functionName = tokens.join(' ') || undefined; - var fileName = ['eval', ''].indexOf(locationParts[0]) > -1 ? undefined : locationParts[0]; - - return new StackFrame({ - functionName: functionName, - fileName: fileName, - lineNumber: locationParts[1], - columnNumber: locationParts[2], - source: line - }); - }, this); - }, - - parseFFOrSafari: function ErrorStackParser$$parseFFOrSafari(error) { - var filtered = error.stack.split('\n').filter(function(line) { - return !line.match(SAFARI_NATIVE_CODE_REGEXP); - }, this); - - return filtered.map(function(line) { - // Throw away eval information until we implement stacktrace.js/stackframe#8 - if (line.indexOf(' > eval') > -1) { - line = line.replace(/ line (\d+)(?: > eval line \d+)* > eval\:\d+\:\d+/g, ':$1'); - } - - if (line.indexOf('@') === -1 && line.indexOf(':') === -1) { - // Safari eval frames only have function names and nothing else - return new StackFrame({ - functionName: line - }); - } else { - var functionNameRegex = /((.*".+"[^@]*)?[^@]*)(?:@)/; - var matches = line.match(functionNameRegex); - var functionName = matches && matches[1] ? matches[1] : undefined; - var locationParts = this.extractLocation(line.replace(functionNameRegex, '')); - - return new StackFrame({ - functionName: functionName, - fileName: locationParts[0], - lineNumber: locationParts[1], - columnNumber: locationParts[2], - source: line - }); - } - }, this); - }, - - parseOpera: function ErrorStackParser$$parseOpera(e) { - if (!e.stacktrace || (e.message.indexOf('\n') > -1 && - e.message.split('\n').length > e.stacktrace.split('\n').length)) { - return this.parseOpera9(e); - } else if (!e.stack) { - return this.parseOpera10(e); - } else { - return this.parseOpera11(e); - } - }, - - parseOpera9: function ErrorStackParser$$parseOpera9(e) { - var lineRE = /Line (\d+).*script (?:in )?(\S+)/i; - var lines = e.message.split('\n'); - var result = []; - - for (var i = 2, len = lines.length; i < len; i += 2) { - var match = lineRE.exec(lines[i]); - if (match) { - result.push(new StackFrame({ - fileName: match[2], - lineNumber: match[1], - source: lines[i] - })); - } - } - - return result; - }, - - parseOpera10: function ErrorStackParser$$parseOpera10(e) { - var lineRE = /Line (\d+).*script (?:in )?(\S+)(?:: In function (\S+))?$/i; - var lines = e.stacktrace.split('\n'); - var result = []; - - for (var i = 0, len = lines.length; i < len; i += 2) { - var match = lineRE.exec(lines[i]); - if (match) { - result.push( - new StackFrame({ - functionName: match[3] || undefined, - fileName: match[2], - lineNumber: match[1], - source: lines[i] - }) - ); - } - } - - return result; - }, - - // Opera 10.65+ Error.stack very similar to FF/Safari - parseOpera11: function ErrorStackParser$$parseOpera11(error) { - var filtered = error.stack.split('\n').filter(function(line) { - return !!line.match(FIREFOX_SAFARI_STACK_REGEXP) && !line.match(/^Error created at/); - }, this); - - return filtered.map(function(line) { - var tokens = line.split('@'); - var locationParts = this.extractLocation(tokens.pop()); - var functionCall = (tokens.shift() || ''); - var functionName = functionCall - .replace(//, '$2') - .replace(/\([^\)]*\)/g, '') || undefined; - var argsRaw; - if (functionCall.match(/\(([^\)]*)\)/)) { - argsRaw = functionCall.replace(/^[^\(]+\(([^\)]*)\)$/, '$1'); - } - var args = (argsRaw === undefined || argsRaw === '[arguments not available]') ? - undefined : argsRaw.split(','); - - return new StackFrame({ - functionName: functionName, - args: args, - fileName: locationParts[0], - lineNumber: locationParts[1], - columnNumber: locationParts[2], - source: line - }); - }, this); - } - }; -})); - - -/***/ }), - -/***/ "./node_modules/form-data/lib/browser.js": -/*!***********************************************!*\ - !*** ./node_modules/form-data/lib/browser.js ***! - \***********************************************/ -/*! no static exports found */ -/***/ (function(module, exports) { - -/* eslint-env browser */ -module.exports = typeof self == 'object' ? self.FormData : window.FormData; - - -/***/ }), - -/***/ "./node_modules/is-buffer/index.js": -/*!*****************************************!*\ - !*** ./node_modules/is-buffer/index.js ***! - \*****************************************/ -/*! no static exports found */ -/***/ (function(module, exports) { - +window.cvat=function(t){var e={};function n(r){if(e[r])return e[r].exports;var o=e[r]={i:r,l:!1,exports:{}};return t[r].call(o.exports,o,o.exports,n),o.l=!0,o.exports}return n.m=t,n.c=e,n.d=function(t,e,r){n.o(t,e)||Object.defineProperty(t,e,{enumerable:!0,get:r})},n.r=function(t){"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(t,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(t,"__esModule",{value:!0})},n.t=function(t,e){if(1&e&&(t=n(t)),8&e)return t;if(4&e&&"object"==typeof t&&t&&t.__esModule)return t;var r=Object.create(null);if(n.r(r),Object.defineProperty(r,"default",{enumerable:!0,value:t}),2&e&&"string"!=typeof t)for(var o in t)n.d(r,o,function(e){return t[e]}.bind(null,o));return r},n.n=function(t){var e=t&&t.__esModule?function(){return t.default}:function(){return t};return n.d(e,"a",e),e},n.o=function(t,e){return Object.prototype.hasOwnProperty.call(t,e)},n.p="",n(n.s=127)}([function(t,e,n){(function(e){var n=function(t){return t&&t.Math==Math&&t};t.exports=n("object"==typeof globalThis&&globalThis)||n("object"==typeof window&&window)||n("object"==typeof self&&self)||n("object"==typeof e&&e)||Function("return this")()}).call(this,n(25))},function(t,e,n){var r=n(0),o=n(39),i=n(76),s=n(135),a=r.Symbol,c=o("wks");t.exports=function(t){return c[t]||(c[t]=s&&a[t]||(s?a:i)("Symbol."+t))}},function(t,e){t.exports=function(t){try{return!!t()}catch(t){return!0}}},function(t,e,n){var r=n(12);t.exports=function(t){if(!r(t))throw TypeError(String(t)+" is not an object");return t}},function(t,e,n){"use strict";var r=n(38),o=n(146),i=n(30),s=n(21),a=n(91),c=s.set,u=s.getterFor("Array Iterator");t.exports=a(Array,"Array",(function(t,e){c(this,{type:"Array Iterator",target:r(t),index:0,kind:e})}),(function(){var t=u(this),e=t.target,n=t.kind,r=t.index++;return!e||r>=e.length?(t.target=void 0,{value:void 0,done:!0}):"keys"==n?{value:r,done:!1}:"values"==n?{value:e[r],done:!1}:{value:[r,e[r]],done:!1}}),"values"),i.Arguments=i.Array,o("keys"),o("values"),o("entries")},function(t,e,n){n(10),(()=>{const e=n(151),r=n(153),o=n(60);class i extends Error{constructor(t){super(t);const n=(new Date).toISOString(),i=e.os.toString(),s=`${e.name} ${e.version}`,a=r.parse(this)[0],c=`${a.fileName}`,u=a.lineNumber,l=a.columnNumber,{jobID:f,taskID:p,clientID:h}=o;Object.defineProperties(this,Object.freeze({system:{get:()=>i},client:{get:()=>s},time:{get:()=>n},jobID:{get:()=>f},taskID:{get:()=>p},projID:{get:()=>void 0},clientID:{get:()=>h},filename:{get:()=>c},line:{get:()=>u},column:{get:()=>l}}))}async save(){const t={system:this.system,client:this.client,time:this.time,job_id:this.jobID,task_id:this.taskID,proj_id:this.projID,client_id:this.clientID,message:this.message,filename:this.filename,line:this.line,column:this.column,stack:this.stack};try{const e=n(22);await e.server.exception(t)}catch(t){}}}t.exports={Exception:i,ArgumentError:class extends i{constructor(t){super(t)}},DataError:class extends i{constructor(t){super(t)}},ScriptingError:class extends i{constructor(t){super(t)}},PluginError:class extends i{constructor(t){super(t)}},ServerError:class extends i{constructor(t,e){super(t),Object.defineProperties(this,Object.freeze({code:{get:()=>e}}))}}}})()},function(t,e,n){"use strict";var r=n(96),o=n(174),i=Object.prototype.toString;function s(t){return"[object Array]"===i.call(t)}function a(t){return null!==t&&"object"==typeof t}function c(t){return"[object Function]"===i.call(t)}function u(t,e){if(null!=t)if("object"!=typeof t&&(t=[t]),s(t))for(var n=0,r=t.length;ns;){var a,c,u,l=r[s++],f=i?l.ok:l.fail,p=l.resolve,h=l.reject,d=l.domain;try{f?(i||(2===e.rejection&&et(t,e),e.rejection=1),!0===f?a=o:(d&&d.enter(),a=f(o),d&&(d.exit(),u=!0)),a===l.promise?h(L("Promise-chain cycle")):(c=K(a))?c.call(a,p,h):p(a)):h(o)}catch(t){d&&!u&&d.exit(),h(t)}}e.reactions=[],e.notified=!1,n&&!e.rejection&&Q(t,e)}))}},Y=function(t,e,n){var r,o;V?((r=D.createEvent("Event")).promise=e,r.reason=n,r.initEvent(t,!1,!0),u.dispatchEvent(r)):r={promise:e,reason:n},(o=u["on"+t])?o(r):"unhandledrejection"===t&&A("Unhandled promise rejection",n)},Q=function(t,e){j.call(u,(function(){var n,r=e.value;if(tt(e)&&(n=E((function(){q?z.emit("unhandledRejection",r,t):Y("unhandledrejection",t,r)})),e.rejection=q||tt(e)?2:1,n.error))throw n.value}))},tt=function(t){return 1!==t.rejection&&!t.parent},et=function(t,e){j.call(u,(function(){q?z.emit("rejectionHandled",t):Y("rejectionhandled",t,e.value)}))},nt=function(t,e,n,r){return function(o){t(e,n,o,r)}},rt=function(t,e,n,r){e.done||(e.done=!0,r&&(e=r),e.value=n,e.state=2,Z(t,e,!0))},ot=function(t,e,n,r){if(!e.done){e.done=!0,r&&(e=r);try{if(t===n)throw L("Promise can't be resolved itself");var o=K(n);o?k((function(){var r={done:!1};try{o.call(n,nt(ot,t,r,e),nt(rt,t,r,e))}catch(n){rt(t,r,n,e)}})):(e.value=n,e.state=1,Z(t,e,!1))}catch(n){rt(t,{done:!1},n,e)}}};X&&(R=function(t){y(this,R,C),m(t),r.call(this);var e=N(this);try{t(nt(ot,this,e),nt(rt,this,e))}catch(t){rt(this,e,t)}},(r=function(t){M(this,{type:C,done:!1,notified:!1,parent:!1,reactions:[],rejection:!1,state:0,value:void 0})}).prototype=h(R.prototype,{then:function(t,e){var n=$(this),r=W(x(this,R));return r.ok="function"!=typeof t||t,r.fail="function"==typeof e&&e,r.domain=q?z.domain:void 0,n.parent=!0,n.reactions.push(r),0!=n.state&&Z(this,n,!1),r.promise},catch:function(t){return this.then(void 0,t)}}),o=function(){var t=new r,e=N(t);this.promise=t,this.resolve=nt(ot,t,e),this.reject=nt(rt,t,e)},_.f=W=function(t){return t===R||t===i?new o(t):J(t)},c||"function"!=typeof f||(s=f.prototype.then,p(f.prototype,"then",(function(t,e){var n=this;return new R((function(t,e){s.call(n,t,e)})).then(t,e)}),{unsafe:!0}),"function"==typeof B&&a({global:!0,enumerable:!0,forced:!0},{fetch:function(t){return S(R,B.apply(u,arguments))}}))),a({global:!0,wrap:!0,forced:X},{Promise:R}),d(R,C,!1,!0),b(C),i=l.Promise,a({target:C,stat:!0,forced:X},{reject:function(t){var e=W(this);return e.reject.call(void 0,t),e.promise}}),a({target:C,stat:!0,forced:c||X},{resolve:function(t){return S(c&&this===i?R:this,t)}}),a({target:C,stat:!0,forced:H},{all:function(t){var e=this,n=W(e),r=n.resolve,o=n.reject,i=E((function(){var n=m(e.resolve),i=[],s=0,a=1;w(t,(function(t){var c=s++,u=!1;i.push(void 0),a++,n.call(e,t).then((function(t){u||(u=!0,i[c]=t,--a||r(i))}),o)})),--a||r(i)}));return i.error&&o(i.value),n.promise},race:function(t){var e=this,n=W(e),r=n.reject,o=E((function(){var o=m(e.resolve);w(t,(function(t){o.call(e,t).then(n.resolve,r)}))}));return o.error&&r(o.value),n.promise}})},function(t,e,n){var r=n(2);t.exports=!r((function(){return 7!=Object.defineProperty({},"a",{get:function(){return 7}}).a}))},function(t,e){t.exports=function(t){return"object"==typeof t?null!==t:"function"==typeof t}},function(t,e,n){var r=n(11),o=n(18),i=n(37);t.exports=r?function(t,e,n){return o.f(t,e,i(1,n))}:function(t,e,n){return t[e]=n,t}},function(t,e,n){var r=n(0),o=n(51).f,i=n(13),s=n(19),a=n(54),c=n(77),u=n(81);t.exports=function(t,e){var n,l,f,p,h,d=t.target,b=t.global,g=t.stat;if(n=b?r:g?r[d]||a(d,{}):(r[d]||{}).prototype)for(l in e){if(p=e[l],f=t.noTargetGet?(h=o(n,l))&&h.value:n[l],!u(b?l:d+(g?".":"#")+l,t.forced)&&void 0!==f){if(typeof p==typeof f)continue;c(p,f)}(t.sham||f&&f.sham)&&i(p,"sham",!0),s(n,l,p,t)}}},function(t,e){t.exports=function(t){try{return!!t()}catch(t){return!0}}},function(t,e,n){var r=n(34),o=n(48),i=n(67);t.exports=r?function(t,e,n){return o.f(t,e,i(1,n))}:function(t,e,n){return t[e]=n,t}},function(t,e){var n={}.hasOwnProperty;t.exports=function(t,e){return n.call(t,e)}},function(t,e,n){var r=n(11),o=n(74),i=n(3),s=n(52),a=Object.defineProperty;e.f=r?a:function(t,e,n){if(i(t),e=s(e,!0),i(n),o)try{return a(t,e,n)}catch(t){}if("get"in n||"set"in n)throw TypeError("Accessors not supported");return"value"in n&&(t[e]=n.value),t}},function(t,e,n){var r=n(0),o=n(39),i=n(13),s=n(7),a=n(54),c=n(75),u=n(21),l=u.get,f=u.enforce,p=String(c).split("toString");o("inspectSource",(function(t){return c.call(t)})),(t.exports=function(t,e,n,o){var c=!!o&&!!o.unsafe,u=!!o&&!!o.enumerable,l=!!o&&!!o.noTargetGet;"function"==typeof n&&("string"!=typeof e||s(n,"name")||i(n,"name",e),f(n).source=p.join("string"==typeof e?e:"")),t!==r?(c?!l&&t[e]&&(u=!0):delete t[e],u?t[e]=n:i(t,e,n)):u?t[e]=n:a(e,n)})(Function.prototype,"toString",(function(){return"function"==typeof this&&l(this).source||c.call(this)}))},function(t,e){var n={}.toString;t.exports=function(t){return n.call(t).slice(8,-1)}},function(t,e,n){var r,o,i,s=n(129),a=n(0),c=n(12),u=n(13),l=n(7),f=n(55),p=n(56),h=a.WeakMap;if(s){var d=new h,b=d.get,g=d.has,m=d.set;r=function(t,e){return m.call(d,t,e),e},o=function(t){return b.call(d,t)||{}},i=function(t){return g.call(d,t)}}else{var y=f("state");p[y]=!0,r=function(t,e){return u(t,y,e),e},o=function(t){return l(t,y)?t[y]:{}},i=function(t){return l(t,y)}}t.exports={set:r,get:o,has:i,enforce:function(t){return i(t)?o(t):r(t,{})},getterFor:function(t){return function(e){var n;if(!c(e)||(n=o(e)).type!==t)throw TypeError("Incompatible receiver, "+t+" required");return n}}}},function(t,e,n){n(10),n(155),(()=>{const e=n(160),{ServerError:r}=n(5),o=n(161),i=n(60);function s(t,e){if(t.response){const n=`${e}. `+`${t.message}. ${JSON.stringify(t.response.data)||""}.`;return new r(n,t.response.status)}const n=`${e}. `+`${t.message}.`;return new r(n,0)}const a=new class{constructor(){const a=n(172);a.defaults.withCredentials=!0,a.defaults.xsrfHeaderName="X-CSRFTOKEN",a.defaults.xsrfCookieName="csrftoken";let c=o.get("token");async function u(t=""){const{backendAPI:e}=i;let n=null;try{n=await a.get(`${e}/tasks?${t}`,{proxy:i.proxy})}catch(t){throw s(t,"Could not get tasks from a server")}return n.data.results.count=n.data.count,n.data.results}async function l(t){const{backendAPI:e}=i;try{await a.delete(`${e}/tasks/${t}`)}catch(t){throw s(t,"Could not delete the task from the server")}}c&&(a.defaults.headers.common.Authorization=`Token ${c}`),Object.defineProperties(this,Object.freeze({server:{value:Object.freeze({about:async function(){const{backendAPI:t}=i;let e=null;try{e=await a.get(`${t}/server/about`,{proxy:i.proxy})}catch(t){throw s(t,'Could not get "about" information from the server')}return e.data},share:async function(t){const{backendAPI:e}=i;t=encodeURIComponent(t);let n=null;try{n=await a.get(`${e}/server/share?directory=${t}`,{proxy:i.proxy})}catch(t){throw s(t,'Could not get "share" information from the server')}return n.data},formats:async function(){const{backendAPI:t}=i;let e=null;try{e=await a.get(`${t}/server/annotation/formats`,{proxy:i.proxy})}catch(t){throw s(t,"Could not get annotation formats from the server")}return e.data},exception:async function(t){const{backendAPI:e}=i;try{await a.post(`${e}/server/exception`,JSON.stringify(t),{proxy:i.proxy,headers:{"Content-Type":"application/json"}})}catch(t){throw s(t,"Could not send an exception to the server")}},login:async function(t,e){const n=[`${encodeURIComponent("username")}=${encodeURIComponent(t)}`,`${encodeURIComponent("password")}=${encodeURIComponent(e)}`].join("&").replace(/%20/g,"+");let r=null;try{r=await a.post(`${i.backendAPI}/auth/login`,n,{proxy:i.proxy})}catch(t){throw s(t,"Could not login on a server")}if(r.headers["set-cookie"]){const t=r.headers["set-cookie"].join(";");a.defaults.headers.common.Cookie=t}c=r.data.key,o.set("token",c),a.defaults.headers.common.Authorization=`Token ${c}`},logout:async function(){try{await a.post(`${i.backendAPI}/auth/logout`,{proxy:i.proxy})}catch(t){throw s(t,"Could not logout from the server")}o.remove("token"),a.defaults.headers.common.Authorization=""},authorized:async function(){try{await t.exports.users.getSelf()}catch(t){if(401===t.code)return!1;throw t}return!0},register:async function(t,e,n,r,o,c){let u=null;try{const s=JSON.stringify({username:t,first_name:e,last_name:n,email:r,password1:o,password2:c});u=await a.post(`${i.backendAPI}/auth/register`,s,{proxy:i.proxy,headers:{"Content-Type":"application/json"}})}catch(e){throw s(e,`Could not register '${t}' user on the server`)}return u.data}}),writable:!1},tasks:{value:Object.freeze({getTasks:u,saveTask:async function(t,e){const{backendAPI:n}=i;try{await a.patch(`${n}/tasks/${t}`,JSON.stringify(e),{proxy:i.proxy,headers:{"Content-Type":"application/json"}})}catch(t){throw s(t,"Could not save the task on the server")}},createTask:async function(t,n,o){const{backendAPI:c}=i,f=new e;for(const t in n)if(Object.prototype.hasOwnProperty.call(n,t))for(let e=0;e{setTimeout((async function i(){try{const s=await a.get(`${c}/tasks/${t}/status`);if(["Queued","Started"].includes(s.data.state))""!==s.data.message&&o(s.data.message),setTimeout(i,1e3);else if("Finished"===s.data.state)e();else if("Failed"===s.data.state){const t="Could not create the task on the server. "+`${s.data.message}.`;n(new r(t,400))}else n(new r(`Unknown task state has been received: ${s.data.state}`,500))}catch(t){n(s(t,"Could not put task to the server"))}}),1e3)})}(p.data.id)}catch(t){throw await l(p.data.id),t}return(await u(`?id=${p.id}`))[0]},deleteTask:l}),writable:!1},jobs:{value:Object.freeze({getJob:async function(t){const{backendAPI:e}=i;let n=null;try{n=await a.get(`${e}/jobs/${t}`,{proxy:i.proxy})}catch(t){throw s(t,"Could not get jobs from a server")}return n.data},saveJob:async function(t,e){const{backendAPI:n}=i;try{await a.patch(`${n}/jobs/${t}`,JSON.stringify(e),{proxy:i.proxy,headers:{"Content-Type":"application/json"}})}catch(t){throw s(t,"Could not save the job on the server")}}}),writable:!1},users:{value:Object.freeze({getUsers:async function(t=null){const{backendAPI:e}=i;let n=null;try{n=null===t?await a.get(`${e}/users`,{proxy:i.proxy}):await a.get(`${e}/users/${t}`,{proxy:i.proxy})}catch(t){throw s(t,"Could not get users from the server")}return n.data.results},getSelf:async function(){const{backendAPI:t}=i;let e=null;try{e=await a.get(`${t}/users/self`,{proxy:i.proxy})}catch(t){throw s(t,"Could not get user data from the server")}return e.data}}),writable:!1},frames:{value:Object.freeze({getData:async function(t,e){const{backendAPI:n}=i;let r=null;try{r=await a.get(`${n}/tasks/${t}/frames/chunk/${e}`,{proxy:i.proxy,responseType:"arraybuffer"})}catch(n){throw s(n,`Could not get chunk ${e} for the task ${t} from the server`)}return r.data},getMeta:async function(t){const{backendAPI:e}=i;let n=null;try{n=await a.get(`${e}/tasks/${t}/frames/meta`,{proxy:i.proxy})}catch(e){throw s(e,`Could not get frame meta info for the task ${t} from the server`)}return n.data},getPreview:async function(t){const{backendAPI:e}=i;let n=null;try{n=await a.get(`${e}/tasks/${t}/frames/0`,{proxy:i.proxy,responseType:"blob"})}catch(e){const n=e.response?e.response.status:e.code;throw new r(`Could not get preview frame for the task ${t} from the server`,n)}return n.data}}),writable:!1},annotations:{value:Object.freeze({updateAnnotations:async function(t,e,n,r){const{backendAPI:o}=i;let c=null,u=null;"PUT"===r.toUpperCase()?(c=a.put.bind(a),u=`${o}/${t}s/${e}/annotations`):(c=a.patch.bind(a),u=`${o}/${t}s/${e}/annotations?action=${r}`);let l=null;try{l=await c(u,JSON.stringify(n),{proxy:i.proxy,headers:{"Content-Type":"application/json"}})}catch(n){throw s(n,`Could not ${r} annotations for the ${t} ${e} on the server`)}return l.data},getAnnotations:async function(t,e){const{backendAPI:n}=i;let r=null;try{r=await a.get(`${n}/${t}s/${e}/annotations`,{proxy:i.proxy})}catch(n){throw s(n,`Could not get annotations for the ${t} ${e} from the server`)}return r.data},dumpAnnotations:async function(t,e,n){const{backendAPI:r}=i,o=e.replace(/\//g,"_");let c=`${r}/tasks/${t}/annotations/${o}?format=${n}`;return new Promise((e,n)=>{setTimeout((async function r(){try{202===(await a.get(`${c}`,{proxy:i.proxy})).status?setTimeout(r,3e3):e(c=`${c}&action=download`)}catch(e){n(s(e,`Could not dump annotations for the task ${t} from the server`))}}))})},uploadAnnotations:async function(t,n,r,o){const{backendAPI:c}=i;let u=new e;return u.append("annotation_file",r),new Promise((r,l)=>{setTimeout((async function f(){try{202===(await a.put(`${c}/${t}s/${n}/annotations?format=${o}`,u,{proxy:i.proxy})).status?(u=new e,setTimeout(f,3e3)):r()}catch(e){l(s(e,`Could not upload annotations for the ${t} ${n}`))}}))})}}),writable:!1}}))}};t.exports=a})()},function(t,e,n){(function(e){var n=Object.assign?Object.assign:function(t,e,n,r){for(var o=1;o{const e=Object.freeze({DIR:"DIR",REG:"REG"}),n=Object.freeze({ANNOTATION:"annotation",VALIDATION:"validation",COMPLETED:"completed"}),r=Object.freeze({ANNOTATION:"annotation",INTERPOLATION:"interpolation"}),o=Object.freeze({CHECKBOX:"checkbox",RADIO:"radio",SELECT:"select",NUMBER:"number",TEXT:"text"}),i=Object.freeze({TAG:"tag",SHAPE:"shape",TRACK:"track"}),s=Object.freeze({RECTANGLE:"rectangle",POLYGON:"polygon",POLYLINE:"polyline",POINTS:"points"}),a=Object.freeze({ALL:"all",SHAPE:"shape",NONE:"none"});t.exports={ShareFileType:e,TaskStatus:n,TaskMode:r,AttributeType:o,ObjectType:i,ObjectShape:s,VisibleState:a,LogType:{pasteObject:0,changeAttribute:1,dragObject:2,deleteObject:3,pressShortcut:4,resizeObject:5,sendLogs:6,saveJob:7,jumpFrame:8,drawObject:9,changeLabel:10,sendTaskInfo:11,loadJob:12,moveImage:13,zoomImage:14,lockObject:15,mergeObjects:16,copyObject:17,propagateObject:18,undoAction:19,redoAction:20,sendUserActivity:21,sendException:22,changeFrame:23,debugInfo:24,fitImage:25,rotateImage:26}}})()},function(t,e){var n;n=function(){return this}();try{n=n||new Function("return this")()}catch(t){"object"==typeof window&&(n=window)}t.exports=n},function(t,e){t.exports=function(t){if(null==t)throw TypeError("Can't call method on "+t);return t}},function(t,e){t.exports=!1},function(t,e,n){var r=n(18).f,o=n(7),i=n(1)("toStringTag");t.exports=function(t,e,n){t&&!o(t=n?t:t.prototype,i)&&r(t,i,{configurable:!0,value:e})}},function(t,e){t.exports=function(t){if("function"!=typeof t)throw TypeError(String(t)+" is not a function");return t}},function(t,e){t.exports={}},function(t,e,n){n(145),n(4),n(10),n(8),(()=>{const{PluginError:e}=n(5),r=[];class o{static async apiWrapper(t,...n){const r=await o.list();for(const o of r){const r=o.functions.filter(e=>e.callback===t)[0];if(r&&r.enter)try{await r.enter.call(this,o,...n)}catch(t){throw t instanceof e?t:new e(`Exception in plugin ${o.name}: ${t.toString()}`)}}let i=await t.implementation.call(this,...n);for(const o of r){const r=o.functions.filter(e=>e.callback===t)[0];if(r&&r.leave)try{i=await r.leave.call(this,o,i,...n)}catch(t){throw t instanceof e?t:new e(`Exception in plugin ${o.name}: ${t.toString()}`)}}return i}static async register(t){const n=[];if("object"!=typeof t)throw new e(`Plugin should be an object, but got "${typeof t}"`);if(!("name"in t)||"string"!=typeof t.name)throw new e('Plugin must contain a "name" field and it must be a string');if(!("description"in t)||"string"!=typeof t.description)throw new e('Plugin must contain a "description" field and it must be a string');if("functions"in t)throw new e('Plugin must not contain a "functions" field');!function t(e,r){const o={};for(const n in e)Object.prototype.hasOwnProperty.call(e,n)&&("object"==typeof e[n]?Object.prototype.hasOwnProperty.call(r,n)&&t(e[n],r[n]):["enter","leave"].includes(n)&&"function"==typeof r&&(e[n],1)&&(o.callback=r,o[n]=e[n]));Object.keys(o).length&&n.push(o)}(t,{cvat:this}),Object.defineProperty(t,"functions",{value:n,writable:!1}),r.push(t)}static async list(){return r}}t.exports=o})()},function(t,e,n){var r=n(26);t.exports=function(t){return Object(r(t))}},function(t,e,n){var r=n(9),o=n(47),i=n(110),s=n(199),a=r.Symbol,c=o("wks");t.exports=function(t){return c[t]||(c[t]=s&&a[t]||(s?a:i)("Symbol."+t))}},function(t,e,n){var r=n(15);t.exports=!r((function(){return 7!=Object.defineProperty({},"a",{get:function(){return 7}}).a}))},function(t,e){t.exports=function(t){return"object"==typeof t?null!==t:"function"==typeof t}},function(t,e,n){var r=n(35);t.exports=function(t){if(!r(t))throw TypeError(String(t)+" is not an object");return t}},function(t,e){t.exports=function(t,e){return{enumerable:!(1&t),configurable:!(2&t),writable:!(4&t),value:e}}},function(t,e,n){var r=n(73),o=n(26);t.exports=function(t){return r(o(t))}},function(t,e,n){var r=n(27),o=n(128);(t.exports=function(t,e){return o[t]||(o[t]=void 0!==e?e:{})})("versions",[]).push({version:"3.3.2",mode:r?"pure":"global",copyright:"© 2019 Denis Pushkarev (zloirock.ru)"})},function(t,e,n){var r=n(78),o=n(0),i=function(t){return"function"==typeof t?t:void 0};t.exports=function(t,e){return arguments.length<2?i(r[t])||i(o[t]):r[t]&&r[t][e]||o[t]&&o[t][e]}},function(t,e,n){var r=n(42),o=Math.min;t.exports=function(t){return t>0?o(r(t),9007199254740991):0}},function(t,e){var n=Math.ceil,r=Math.floor;t.exports=function(t){return isNaN(t=+t)?0:(t>0?r:n)(t)}},function(t,e,n){var r=n(29);t.exports=function(t,e,n){if(r(t),void 0===e)return t;switch(n){case 0:return function(){return t.call(e)};case 1:return function(n){return t.call(e,n)};case 2:return function(n,r){return t.call(e,n,r)};case 3:return function(n,r,o){return t.call(e,n,r,o)}}return function(){return t.apply(e,arguments)}}},function(t,e,n){var r=n(138),o=n(30),i=n(1)("iterator");t.exports=function(t){if(null!=t)return t[i]||t["@@iterator"]||o[r(t)]}},function(t,e,n){n(4),n(10),n(190),n(8),n(64),(()=>{const e=n(31),r=n(22),{getFrame:o,getRanges:i,getPreview:s}=n(193),{ArgumentError:a}=n(5),{TaskStatus:c}=n(24),{Label:u}=n(49);function l(t){Object.defineProperties(t,{annotations:Object.freeze({value:{async upload(n,r){return await e.apiWrapper.call(this,t.annotations.upload,n,r)},async save(){return await e.apiWrapper.call(this,t.annotations.save)},async clear(n=!1){return await e.apiWrapper.call(this,t.annotations.clear,n)},async dump(n,r){return await e.apiWrapper.call(this,t.annotations.dump,n,r)},async statistics(){return await e.apiWrapper.call(this,t.annotations.statistics)},async put(n=[]){return await e.apiWrapper.call(this,t.annotations.put,n)},async get(n,r={}){return await e.apiWrapper.call(this,t.annotations.get,n,r)},async search(n,r,o){return await e.apiWrapper.call(this,t.annotations.search,n,r,o)},async select(n,r,o){return await e.apiWrapper.call(this,t.annotations.select,n,r,o)},async hasUnsavedChanges(){return await e.apiWrapper.call(this,t.annotations.hasUnsavedChanges)},async merge(n){return await e.apiWrapper.call(this,t.annotations.merge,n)},async split(n,r){return await e.apiWrapper.call(this,t.annotations.split,n,r)},async group(n,r=!1){return await e.apiWrapper.call(this,t.annotations.group,n,r)}},writable:!0}),frames:Object.freeze({value:{async get(n){return await e.apiWrapper.call(this,t.frames.get,n)},async ranges(){return await e.apiWrapper.call(this,t.frames.ranges)},async preview(){return await e.apiWrapper.call(this,t.frames.preview)}},writable:!0}),logs:Object.freeze({value:{async put(n,r){return await e.apiWrapper.call(this,t.logs.put,n,r)},async save(n){return await e.apiWrapper.call(this,t.logs.save,n)}},writable:!0}),actions:Object.freeze({value:{async undo(n){return await e.apiWrapper.call(this,t.actions.undo,n)},async redo(n){return await e.apiWrapper.call(this,t.actions.redo,n)},async clear(){return await e.apiWrapper.call(this,t.actions.clear)}},writable:!0}),events:Object.freeze({value:{async subscribe(n,r){return await e.apiWrapper.call(this,t.events.subscribe,n,r)},async unsubscribe(n,r=null){return await e.apiWrapper.call(this,t.events.unsubscribe,n,r)}},writable:!0})})}class f{constructor(){}}class p extends f{constructor(t){super();const e={id:void 0,assignee:void 0,status:void 0,start_frame:void 0,stop_frame:void 0,task:void 0};for(const n in e)if(Object.prototype.hasOwnProperty.call(e,n)&&(n in t&&(e[n]=t[n]),void 0===e[n]))throw new a(`Job field "${n}" was not initialized`);Object.defineProperties(this,Object.freeze({id:{get:()=>e.id},assignee:{get:()=>e.assignee,set:()=>t=>{if(!Number.isInteger(t)||t<0)throw new a("Value must be a non negative integer");e.assignee=t}},status:{get:()=>e.status,set:t=>{const n=c;let r=!1;for(const e in n)if(n[e]===t){r=!0;break}if(!r)throw new a("Value must be a value from the enumeration cvat.enums.TaskStatus");e.status=t}},startFrame:{get:()=>e.start_frame},stopFrame:{get:()=>e.stop_frame},task:{get:()=>e.task}})),this.annotations={get:Object.getPrototypeOf(this).annotations.get.bind(this),put:Object.getPrototypeOf(this).annotations.put.bind(this),save:Object.getPrototypeOf(this).annotations.save.bind(this),dump:Object.getPrototypeOf(this).annotations.dump.bind(this),merge:Object.getPrototypeOf(this).annotations.merge.bind(this),split:Object.getPrototypeOf(this).annotations.split.bind(this),group:Object.getPrototypeOf(this).annotations.group.bind(this),clear:Object.getPrototypeOf(this).annotations.clear.bind(this),upload:Object.getPrototypeOf(this).annotations.upload.bind(this),select:Object.getPrototypeOf(this).annotations.select.bind(this),statistics:Object.getPrototypeOf(this).annotations.statistics.bind(this),hasUnsavedChanges:Object.getPrototypeOf(this).annotations.hasUnsavedChanges.bind(this)},this.frames={get:Object.getPrototypeOf(this).frames.get.bind(this),ranges:Object.getPrototypeOf(this).frames.ranges.bind(this),preview:Object.getPrototypeOf(this).frames.preview.bind(this)}}async save(){return await e.apiWrapper.call(this,p.prototype.save)}}class h extends f{constructor(t){super();const e={id:void 0,name:void 0,status:void 0,size:void 0,mode:void 0,owner:void 0,assignee:void 0,created_date:void 0,updated_date:void 0,bug_tracker:void 0,overlap:void 0,segment_size:void 0,z_order:void 0,image_quality:void 0,start_frame:void 0,stop_frame:void 0,frame_filter:void 0,data_chunk_size:void 0};for(const n in e)Object.prototype.hasOwnProperty.call(e,n)&&n in t&&(e[n]=t[n]);if(e.labels=[],e.jobs=[],e.files=Object.freeze({server_files:[],client_files:[],remote_files:[]}),Array.isArray(t.segments))for(const n of t.segments)if(Array.isArray(n.jobs))for(const t of n.jobs){const r=new p({url:t.url,id:t.id,assignee:t.assignee,status:t.status,start_frame:n.start_frame,stop_frame:n.stop_frame,task:this});e.jobs.push(r)}if(Array.isArray(t.labels))for(const n of t.labels){const t=new u(n);e.labels.push(t)}Object.defineProperties(this,Object.freeze({id:{get:()=>e.id},name:{get:()=>e.name,set:t=>{if(!t.trim().length)throw new a("Value must not be empty");e.name=t}},status:{get:()=>e.status},size:{get:()=>e.size},mode:{get:()=>e.mode},owner:{get:()=>e.owner},assignee:{get:()=>e.assignee,set:()=>t=>{if(!Number.isInteger(t)||t<0)throw new a("Value must be a non negative integer");e.assignee=t}},createdDate:{get:()=>e.created_date},updatedDate:{get:()=>e.updated_date},bugTracker:{get:()=>e.bug_tracker,set:t=>{e.bug_tracker=t}},overlap:{get:()=>e.overlap,set:t=>{if(!Number.isInteger(t)||t<0)throw new a("Value must be a non negative integer");e.overlap=t}},segmentSize:{get:()=>e.segment_size,set:t=>{if(!Number.isInteger(t)||t<0)throw new a("Value must be a positive integer");e.segment_size=t}},zOrder:{get:()=>e.z_order,set:t=>{if("boolean"!=typeof t)throw new a("Value must be a boolean");e.z_order=t}},imageQuality:{get:()=>e.image_quality,set:t=>{if(!Number.isInteger(t)||t<0)throw new a("Value must be a positive integer");e.image_quality=t}},labels:{get:()=>[...e.labels],set:t=>{if(!Array.isArray(t))throw new a("Value must be an array of Labels");for(const e of t)if(!(e instanceof u))throw new a("Each array value must be an instance of Label. "+`${typeof e} was found`);void 0===e.id?e.labels=[...t]:e.labels=e.labels.concat([...t])}},jobs:{get:()=>[...e.jobs]},serverFiles:{get:()=>[...e.files.server_files],set:t=>{if(!Array.isArray(t))throw new a(`Value must be an array. But ${typeof t} has been got.`);for(const e of t)if("string"!=typeof e)throw new a(`Array values must be a string. But ${typeof e} has been got.`);Array.prototype.push.apply(e.files.server_files,t)}},clientFiles:{get:()=>[...e.files.client_files],set:t=>{if(!Array.isArray(t))throw new a(`Value must be an array. But ${typeof t} has been got.`);for(const e of t)if(!(e instanceof File))throw new a(`Array values must be a File. But ${e.constructor.name} has been got.`);Array.prototype.push.apply(e.files.client_files,t)}},remoteFiles:{get:()=>[...e.files.remote_files],set:t=>{if(!Array.isArray(t))throw new a(`Value must be an array. But ${typeof t} has been got.`);for(const e of t)if("string"!=typeof e)throw new a(`Array values must be a string. But ${typeof e} has been got.`);Array.prototype.push.apply(e.files.remote_files,t)}},startFrame:{get:()=>e.start_frame,set:t=>{if(!Number.isInteger(t)||t<0)throw new a("Value must be a not negative integer");e.start_frame=t}},stopFrame:{get:()=>e.stop_frame,set:t=>{if(!Number.isInteger(t)||t<0)throw new a("Value must be a not negative integer");e.stop_frame=t}},frameFilter:{get:()=>e.frame_filter,set:t=>{if("string"!=typeof t)throw new a(`Filter value must be a string. But ${typeof t} has been got.`);e.frame_filter=t}},dataChunkSize:{get:()=>e.data_chunk_size,set:t=>{if("number"!=typeof t||t<1)throw new a(`Chink size value must be a positive number. But value ${t} has been got.`);e.data_chunk_size=t}}})),this.annotations={get:Object.getPrototypeOf(this).annotations.get.bind(this),put:Object.getPrototypeOf(this).annotations.put.bind(this),save:Object.getPrototypeOf(this).annotations.save.bind(this),dump:Object.getPrototypeOf(this).annotations.dump.bind(this),merge:Object.getPrototypeOf(this).annotations.merge.bind(this),split:Object.getPrototypeOf(this).annotations.split.bind(this),group:Object.getPrototypeOf(this).annotations.group.bind(this),clear:Object.getPrototypeOf(this).annotations.clear.bind(this),upload:Object.getPrototypeOf(this).annotations.upload.bind(this),select:Object.getPrototypeOf(this).annotations.select.bind(this),statistics:Object.getPrototypeOf(this).annotations.statistics.bind(this),hasUnsavedChanges:Object.getPrototypeOf(this).annotations.hasUnsavedChanges.bind(this)},this.frames={get:Object.getPrototypeOf(this).frames.get.bind(this),ranges:Object.getPrototypeOf(this).frames.ranges.bind(this),preview:Object.getPrototypeOf(this).frames.preview.bind(this)}}async save(t=(()=>{})){return await e.apiWrapper.call(this,h.prototype.save,t)}async delete(){return await e.apiWrapper.call(this,h.prototype.delete)}}t.exports={Job:p,Task:h};const{getAnnotations:d,putAnnotations:b,saveAnnotations:g,hasUnsavedChanges:m,mergeAnnotations:y,splitAnnotations:v,groupAnnotations:w,clearAnnotations:O,selectObject:x,annotationsStatistics:j,uploadAnnotations:k,dumpAnnotations:S}=n(225);l(p.prototype),l(h.prototype),p.prototype.save.implementation=async function(){if(this.id){const t={status:this.status};return await r.jobs.saveJob(this.id,t),this}throw new a("Can not save job without and id")},p.prototype.frames.get.implementation=async function(t){if(!Number.isInteger(t)||t<0)throw new a(`Frame must be a positive integer. Got: "${t}"`);if(tthis.stopFrame)throw new a(`The frame with number ${t} is out of the job`);return await o(this.task.id,this.task.dataChunkSize,this.task.mode,t)},p.prototype.frames.ranges.implementation=async function(){return await i(this.task.id)},p.prototype.annotations.get.implementation=async function(t,e){if(tthis.stopFrame)throw new a(`Frame ${t} does not exist in the job`);return await d(this,t,e)},p.prototype.annotations.save.implementation=async function(t){return await g(this,t)},p.prototype.annotations.merge.implementation=async function(t){return await y(this,t)},p.prototype.annotations.split.implementation=async function(t,e){return await v(this,t,e)},p.prototype.annotations.group.implementation=async function(t,e){return await w(this,t,e)},p.prototype.annotations.hasUnsavedChanges.implementation=function(){return m(this)},p.prototype.annotations.clear.implementation=async function(t){return await O(this,t)},p.prototype.annotations.select.implementation=function(t,e,n){return x(this,t,e,n)},p.prototype.annotations.statistics.implementation=function(){return j(this)},p.prototype.annotations.put.implementation=function(t){return b(this,t)},p.prototype.annotations.upload.implementation=async function(t,e){return await k(this,t,e)},p.prototype.annotations.dump.implementation=async function(t,e){return await S(this,t,e)},h.prototype.save.implementation=async function(t){if(void 0!==this.id){const t={name:this.name,bug_tracker:this.bugTracker,z_order:this.zOrder,labels:[...this.labels.map(t=>t.toJSON())]};return await r.tasks.saveTask(this.id,t),this}const e={name:this.name,labels:this.labels.map(t=>t.toJSON()),image_quality:this.imageQuality,z_order:Boolean(this.zOrder)};void 0!==this.bugTracker&&(e.bug_tracker=this.bugTracker),void 0!==this.segmentSize&&(e.segment_size=this.segmentSize),void 0!==this.overlap&&(e.overlap=this.overlap),void 0!==this.startFrame&&(e.start_frame=this.startFrame),void 0!==this.stopFrame&&(e.stop_frame=this.stopFrame),void 0!==this.frameFilter&&(e.frame_filter=this.frameFilter);const n={client_files:this.clientFiles,server_files:this.serverFiles,remote_files:this.remoteFiles},o=await r.tasks.createTask(e,n,t);return new h(o)},h.prototype.delete.implementation=async function(){return await r.tasks.deleteTask(this.id)},h.prototype.frames.get.implementation=async function(t){if(!Number.isInteger(t)||t<0)throw new a(`Frame must be a positive integer. Got: "${t}"`);if(t>=this.size)throw new a(`The frame with number ${t} is out of the task`);return await o(this.id,this.dataChunkSize,this.mode,t)},p.prototype.frames.preview.implementation=async function(){return await s(this.task.id)},h.prototype.frames.ranges.implementation=async function(){return await i(this.id)},h.prototype.frames.preview.implementation=async function(){return await s(this.id)},h.prototype.annotations.get.implementation=async function(t,e){if(!Number.isInteger(t)||t<0)throw new a(`Frame must be a positive integer. Got: "${t}"`);if(t>=this.size)throw new a(`Frame ${t} does not exist in the task`);return await d(this,t,e)},h.prototype.annotations.save.implementation=async function(t){return await g(this,t)},h.prototype.annotations.merge.implementation=async function(t){return await y(this,t)},h.prototype.annotations.split.implementation=async function(t,e){return await v(this,t,e)},h.prototype.annotations.group.implementation=async function(t,e){return await w(this,t,e)},h.prototype.annotations.hasUnsavedChanges.implementation=function(){return m(this)},h.prototype.annotations.clear.implementation=async function(t){return await O(this,t)},h.prototype.annotations.select.implementation=function(t,e,n){return x(this,t,e,n)},h.prototype.annotations.statistics.implementation=function(){return j(this)},h.prototype.annotations.put.implementation=function(t){return b(this,t)},h.prototype.annotations.upload.implementation=async function(t,e){return await k(this,t,e)},h.prototype.annotations.dump.implementation=async function(t,e){return await S(this,t,e)}})()},function(t,e,n){var r=n(195),o=n(106);t.exports=function(t){return r(o(t))}},function(t,e,n){var r=n(65),o=n(198);(t.exports=function(t,e){return o[t]||(o[t]=void 0!==e?e:{})})("versions",[]).push({version:"3.3.2",mode:r?"pure":"global",copyright:"© 2019 Denis Pushkarev (zloirock.ru)"})},function(t,e,n){var r=n(34),o=n(107),i=n(36),s=n(109),a=Object.defineProperty;e.f=r?a:function(t,e,n){if(i(t),e=s(e,!0),i(n),o)try{return a(t,e,n)}catch(t){}if("get"in n||"set"in n)throw TypeError("Accessors not supported");return"value"in n&&(t[e]=n.value),t}},function(t,e,n){n(4),n(8),n(64),(()=>{const{AttributeType:e}=n(24),{ArgumentError:r}=n(5);class o{constructor(t){const n={id:void 0,default_value:void 0,input_type:void 0,mutable:void 0,name:void 0,values:void 0};for(const e in n)Object.prototype.hasOwnProperty.call(n,e)&&Object.prototype.hasOwnProperty.call(t,e)&&(Array.isArray(t[e])?n[e]=[...t[e]]:n[e]=t[e]);if(!Object.values(e).includes(n.input_type))throw new r(`Got invalid attribute type ${n.input_type}`);Object.defineProperties(this,Object.freeze({id:{get:()=>n.id},defaultValue:{get:()=>n.default_value},inputType:{get:()=>n.input_type},mutable:{get:()=>n.mutable},name:{get:()=>n.name},values:{get:()=>[...n.values]}}))}toJSON(){const t={name:this.name,mutable:this.mutable,input_type:this.inputType,default_value:this.defaultValue,values:this.values};return void 0!==this.id&&(t.id=this.id),t}}t.exports={Attribute:o,Label:class{constructor(t){const e={id:void 0,name:void 0};for(const n in e)Object.prototype.hasOwnProperty.call(e,n)&&Object.prototype.hasOwnProperty.call(t,n)&&(e[n]=t[n]);if(e.attributes=[],Object.prototype.hasOwnProperty.call(t,"attributes")&&Array.isArray(t.attributes))for(const n of t.attributes)e.attributes.push(new o(n));Object.defineProperties(this,Object.freeze({id:{get:()=>e.id},name:{get:()=>e.name},attributes:{get:()=>[...e.attributes]}}))}toJSON(){const t={name:this.name,attributes:[...this.attributes.map(t=>t.toJSON())]};return void 0!==this.id&&(t.id=this.id),t}}}})()},function(t,e,n){(()=>{const{ArgumentError:e}=n(5);t.exports={isBoolean:function(t){return"boolean"==typeof t},isInteger:function(t){return"number"==typeof t&&Number.isInteger(t)},isEnum:function(t){for(const e in this)if(Object.prototype.hasOwnProperty.call(this,e)&&this[e]===t)return!0;return!1},isString:function(t){return"string"==typeof t},checkFilter:function(t,n){for(const r in t)if(Object.prototype.hasOwnProperty.call(t,r)){if(!(r in n))throw new e(`Unsupported filter property has been recieved: "${r}"`);if(!n[r](t[r]))throw new e(`Received filter property "${r}" is not satisfied for checker`)}},checkObjectType:function(t,n,r,o){if(r){if(typeof n!==r){if("integer"===r&&Number.isInteger(n))return;throw new e(`"${t}" is expected to be "${r}", but "${typeof n}" has been got.`)}}else if(o&&!(n instanceof o)){if(void 0!==n)throw new e(`"${t}" is expected to be ${o.name}, but `+`"${n.constructor.name}" has been got`);throw new e(`"${t}" is expected to be ${o.name}, but "undefined" has been got.`)}}}})()},function(t,e,n){var r=n(11),o=n(72),i=n(37),s=n(38),a=n(52),c=n(7),u=n(74),l=Object.getOwnPropertyDescriptor;e.f=r?l:function(t,e){if(t=s(t),e=a(e,!0),u)try{return l(t,e)}catch(t){}if(c(t,e))return i(!o.f.call(t,e),t[e])}},function(t,e,n){var r=n(12);t.exports=function(t,e){if(!r(t))return t;var n,o;if(e&&"function"==typeof(n=t.toString)&&!r(o=n.call(t)))return o;if("function"==typeof(n=t.valueOf)&&!r(o=n.call(t)))return o;if(!e&&"function"==typeof(n=t.toString)&&!r(o=n.call(t)))return o;throw TypeError("Can't convert object to primitive value")}},function(t,e,n){var r=n(0),o=n(12),i=r.document,s=o(i)&&o(i.createElement);t.exports=function(t){return s?i.createElement(t):{}}},function(t,e,n){var r=n(0),o=n(13);t.exports=function(t,e){try{o(r,t,e)}catch(n){r[t]=e}return e}},function(t,e,n){var r=n(39),o=n(76),i=r("keys");t.exports=function(t){return i[t]||(i[t]=o(t))}},function(t,e){t.exports={}},function(t,e){t.exports=["constructor","hasOwnProperty","isPrototypeOf","propertyIsEnumerable","toLocaleString","toString","valueOf"]},function(t,e){t.exports=function(t,e,n){if(!(t instanceof e))throw TypeError("Incorrect "+(n?n+" ":"")+"invocation");return t}},function(t,e,n){var r=n(40);t.exports=r("navigator","userAgent")||""},function(t,e){t.exports={backendAPI:"http://localhost:7000/api/v1",proxy:!1,taskID:void 0,jobID:void 0,clientID:+Date.now().toString().substr(-6)}},function(t,e,n){var r=n(42),o=n(26),i=function(t){return function(e,n){var i,s,a=String(o(e)),c=r(n),u=a.length;return c<0||c>=u?t?"":void 0:(i=a.charCodeAt(c))<55296||i>56319||c+1===u||(s=a.charCodeAt(c+1))<56320||s>57343?t?a.charAt(c):i:t?a.slice(c,c+2):s-56320+(i-55296<<10)+65536}};t.exports={codeAt:i(!1),charAt:i(!0)}},function(t,e,n){"use strict";(function(e){var r=n(6),o=n(176),i={"Content-Type":"application/x-www-form-urlencoded"};function s(t,e){!r.isUndefined(t)&&r.isUndefined(t["Content-Type"])&&(t["Content-Type"]=e)}var a,c={adapter:("undefined"!=typeof XMLHttpRequest?a=n(98):void 0!==e&&(a=n(98)),a),transformRequest:[function(t,e){return o(e,"Content-Type"),r.isFormData(t)||r.isArrayBuffer(t)||r.isBuffer(t)||r.isStream(t)||r.isFile(t)||r.isBlob(t)?t:r.isArrayBufferView(t)?t.buffer:r.isURLSearchParams(t)?(s(e,"application/x-www-form-urlencoded;charset=utf-8"),t.toString()):r.isObject(t)?(s(e,"application/json;charset=utf-8"),JSON.stringify(t)):t}],transformResponse:[function(t){if("string"==typeof t)try{t=JSON.parse(t)}catch(t){}return t}],timeout:0,xsrfCookieName:"XSRF-TOKEN",xsrfHeaderName:"X-XSRF-TOKEN",maxContentLength:-1,validateStatus:function(t){return t>=200&&t<300}};c.headers={common:{Accept:"application/json, text/plain, */*"}},r.forEach(["delete","get","head"],(function(t){c.headers[t]={}})),r.forEach(["post","put","patch"],(function(t){c.headers[t]=r.merge(i)})),t.exports=c}).call(this,n(97))},function(t,e,n){n(4),n(10),n(8),(()=>{const e=n(31),{ArgumentError:r}=n(5);class o{constructor(t){const e={label:null,attributes:{},points:null,outside:null,occluded:null,keyframe:null,group:null,zOrder:null,lock:null,color:null,visibility:null,clientID:t.clientID,serverID:t.serverID,frame:t.frame,objectType:t.objectType,shapeType:t.shapeType,updateFlags:{}};Object.defineProperty(e.updateFlags,"reset",{value:function(){this.label=!1,this.attributes=!1,this.points=!1,this.outside=!1,this.occluded=!1,this.keyframe=!1,this.group=!1,this.zOrder=!1,this.lock=!1,this.color=!1,this.visibility=!1},writable:!1}),Object.defineProperties(this,Object.freeze({updateFlags:{get:()=>e.updateFlags},frame:{get:()=>e.frame},objectType:{get:()=>e.objectType},shapeType:{get:()=>e.shapeType},clientID:{get:()=>e.clientID},serverID:{get:()=>e.serverID},label:{get:()=>e.label,set:t=>{e.updateFlags.label=!0,e.label=t}},color:{get:()=>e.color,set:t=>{e.updateFlags.color=!0,e.color=t}},visibility:{get:()=>e.visibility,set:t=>{e.updateFlags.visibility=!0,e.visibility=t}},points:{get:()=>e.points,set:t=>{if(!Array.isArray(t))throw new r("Points are expected to be an array "+`but got ${"object"==typeof t?t.constructor.name:typeof t}`);e.updateFlags.points=!0,e.points=[...t]}},group:{get:()=>e.group,set:t=>{e.updateFlags.group=!0,e.group=t}},zOrder:{get:()=>e.zOrder,set:t=>{e.updateFlags.zOrder=!0,e.zOrder=t}},outside:{get:()=>e.outside,set:t=>{e.updateFlags.outside=!0,e.outside=t}},keyframe:{get:()=>e.keyframe,set:t=>{e.updateFlags.keyframe=!0,e.keyframe=t}},occluded:{get:()=>e.occluded,set:t=>{e.updateFlags.occluded=!0,e.occluded=t}},lock:{get:()=>e.lock,set:t=>{e.updateFlags.lock=!0,e.lock=t}},attributes:{get:()=>e.attributes,set:t=>{if("object"!=typeof t)throw new r("Attributes are expected to be an object "+`but got ${"object"==typeof t?t.constructor.name:typeof t}`);for(const n of Object.keys(t))e.updateFlags.attributes=!0,e.attributes[n]=t[n]}}})),this.label=t.label,this.group=t.group,this.zOrder=t.zOrder,this.outside=t.outside,this.keyframe=t.keyframe,this.occluded=t.occluded,this.color=t.color,this.lock=t.lock,this.visibility=t.visibility,void 0!==t.points&&(this.points=t.points),void 0!==t.attributes&&(this.attributes=t.attributes),e.updateFlags.reset()}async save(){return await e.apiWrapper.call(this,o.prototype.save)}async delete(t=!1){return await e.apiWrapper.call(this,o.prototype.delete,t)}async up(){return await e.apiWrapper.call(this,o.prototype.up)}async down(){return await e.apiWrapper.call(this,o.prototype.down)}}o.prototype.save.implementation=async function(){return this.hidden&&this.hidden.save?this.hidden.save():this},o.prototype.delete.implementation=async function(t){return!(!this.hidden||!this.hidden.delete)&&this.hidden.delete(t)},o.prototype.up.implementation=async function(){return!(!this.hidden||!this.hidden.up)&&this.hidden.up()},o.prototype.down.implementation=async function(){return!(!this.hidden||!this.hidden.down)&&this.hidden.down()},t.exports=o})()},function(t,e,n){"use strict";n(14)({target:"URL",proto:!0,enumerable:!0},{toJSON:function(){return URL.prototype.toString.call(this)}})},function(t,e){t.exports=!1},function(t,e,n){var r=n(9),o=n(16);t.exports=function(t,e){try{o(r,t,e)}catch(n){r[t]=e}return e}},function(t,e){t.exports=function(t,e){return{enumerable:!(1&t),configurable:!(2&t),writable:!(4&t),value:e}}},function(t,e){t.exports={}},function(t,e){t.exports=["constructor","hasOwnProperty","isPrototypeOf","propertyIsEnumerable","toLocaleString","toString","valueOf"]},function(t,e,n){var r=n(47),o=n(110),i=r("keys");t.exports=function(t){return i[t]||(i[t]=o(t))}},function(t,e){t.exports={}},function(t,e,n){"use strict";var r={}.propertyIsEnumerable,o=Object.getOwnPropertyDescriptor,i=o&&!r.call({1:2},1);e.f=i?function(t){var e=o(this,t);return!!e&&e.enumerable}:r},function(t,e,n){var r=n(2),o=n(20),i="".split;t.exports=r((function(){return!Object("z").propertyIsEnumerable(0)}))?function(t){return"String"==o(t)?i.call(t,""):Object(t)}:Object},function(t,e,n){var r=n(11),o=n(2),i=n(53);t.exports=!r&&!o((function(){return 7!=Object.defineProperty(i("div"),"a",{get:function(){return 7}}).a}))},function(t,e,n){var r=n(39);t.exports=r("native-function-to-string",Function.toString)},function(t,e){var n=0,r=Math.random();t.exports=function(t){return"Symbol("+String(void 0===t?"":t)+")_"+(++n+r).toString(36)}},function(t,e,n){var r=n(7),o=n(130),i=n(51),s=n(18);t.exports=function(t,e){for(var n=o(e),a=s.f,c=i.f,u=0;uc;)r(a,n=e[c++])&&(~i(u,n)||u.push(n));return u}},function(t,e){e.f=Object.getOwnPropertySymbols},function(t,e,n){var r=n(2),o=/#|\.prototype\./,i=function(t,e){var n=a[s(t)];return n==u||n!=c&&("function"==typeof e?r(e):!!e)},s=i.normalize=function(t){return String(t).replace(o,".").toLowerCase()},a=i.data={},c=i.NATIVE="N",u=i.POLYFILL="P";t.exports=i},function(t,e,n){var r=n(19);t.exports=function(t,e,n){for(var o in e)r(t,o,e[o],n);return t}},function(t,e,n){var r=n(1),o=n(30),i=r("iterator"),s=Array.prototype;t.exports=function(t){return void 0!==t&&(o.Array===t||s[i]===t)}},function(t,e,n){var r=n(3);t.exports=function(t,e,n,o){try{return o?e(r(n)[0],n[1]):e(n)}catch(e){var i=t.return;throw void 0!==i&&r(i.call(t)),e}}},function(t,e,n){var r,o,i,s=n(0),a=n(2),c=n(20),u=n(43),l=n(86),f=n(53),p=n(59),h=s.location,d=s.setImmediate,b=s.clearImmediate,g=s.process,m=s.MessageChannel,y=s.Dispatch,v=0,w={},O=function(t){if(w.hasOwnProperty(t)){var e=w[t];delete w[t],e()}},x=function(t){return function(){O(t)}},j=function(t){O(t.data)},k=function(t){s.postMessage(t+"",h.protocol+"//"+h.host)};d&&b||(d=function(t){for(var e=[],n=1;arguments.length>n;)e.push(arguments[n++]);return w[++v]=function(){("function"==typeof t?t:Function(t)).apply(void 0,e)},r(v),v},b=function(t){delete w[t]},"process"==c(g)?r=function(t){g.nextTick(x(t))}:y&&y.now?r=function(t){y.now(x(t))}:m&&!/(iphone|ipod|ipad).*applewebkit/i.test(p)?(i=(o=new m).port2,o.port1.onmessage=j,r=u(i.postMessage,i,1)):!s.addEventListener||"function"!=typeof postMessage||s.importScripts||a(k)?r="onreadystatechange"in f("script")?function(t){l.appendChild(f("script")).onreadystatechange=function(){l.removeChild(this),O(t)}}:function(t){setTimeout(x(t),0)}:(r=k,s.addEventListener("message",j,!1))),t.exports={set:d,clear:b}},function(t,e,n){var r=n(40);t.exports=r("document","documentElement")},function(t,e,n){"use strict";var r=n(29),o=function(t){var e,n;this.promise=new t((function(t,r){if(void 0!==e||void 0!==n)throw TypeError("Bad Promise constructor");e=t,n=r})),this.resolve=r(e),this.reject=r(n)};t.exports.f=function(t){return new o(t)}},function(t,e,n){var r=n(3),o=n(89),i=n(57),s=n(56),a=n(86),c=n(53),u=n(55)("IE_PROTO"),l=function(){},f=function(){var t,e=c("iframe"),n=i.length;for(e.style.display="none",a.appendChild(e),e.src=String("javascript:"),(t=e.contentWindow.document).open(),t.write(" \ No newline at end of file diff --git a/cvat-ui/src/index.tsx b/cvat-ui/src/index.tsx index f8c68d427486..3ef428246f11 100644 --- a/cvat-ui/src/index.tsx +++ b/cvat-ui/src/index.tsx @@ -3,25 +3,39 @@ import ReactDOM from 'react-dom'; import { connect, Provider } from 'react-redux'; import CVATApplication from './components/cvat-app'; -import createCVATStore from './store'; + +import createRootReducer from './reducers/root-reducer'; +import createCVATStore, { getCVATStore } from './store'; import { authorizedAsync } from './actions/auth-actions'; -import { gettingFormatsAsync } from './actions/formats-actions'; +import { getFormatsAsync } from './actions/formats-actions'; import { checkPluginsAsync } from './actions/plugins-actions'; import { getUsersAsync } from './actions/users-actions'; +import { + resetErrors, + resetMessages, +} from './actions/notification-actions'; -import { CombinedState } from './reducers/root-reducer'; +import { + CombinedState, + NotificationsState, +} from './reducers/interfaces'; -const cvatStore = createCVATStore(); +createCVATStore(createRootReducer); +const cvatStore = getCVATStore(); interface StateToProps { pluginsInitialized: boolean; + pluginsFetching: boolean; userInitialized: boolean; usersInitialized: boolean; + usersFetching: boolean; formatsInitialized: boolean; - gettingAuthError: any; - gettingFormatsError: any; - gettingUsersError: any; + formatsFetching: boolean; + installedAutoAnnotation: boolean; + installedTFSegmentation: boolean; + installedTFAnnotation: boolean; + notifications: NotificationsState; user: any; } @@ -30,6 +44,8 @@ interface DispatchToProps { verifyAuthorized: () => void; loadUsers: () => void; initPlugins: () => void; + resetErrors: () => void; + resetMessages: () => void; } function mapStateToProps(state: CombinedState): StateToProps { @@ -39,43 +55,36 @@ function mapStateToProps(state: CombinedState): StateToProps { const { users } = state; return { - pluginsInitialized: plugins.initialized, userInitialized: auth.initialized, + pluginsInitialized: plugins.initialized, + pluginsFetching: plugins.fetching, usersInitialized: users.initialized, + usersFetching: users.fetching, formatsInitialized: formats.initialized, - gettingAuthError: auth.authError, - gettingUsersError: users.gettingUsersError, - gettingFormatsError: formats.gettingFormatsError, + formatsFetching: formats.fetching, + installedAutoAnnotation: plugins.plugins.AUTO_ANNOTATION, + installedTFSegmentation: plugins.plugins.TF_SEGMENTATION, + installedTFAnnotation: plugins.plugins.TF_ANNOTATION, + notifications: { ...state.notifications }, user: auth.user, }; } function mapDispatchToProps(dispatch: any): DispatchToProps { return { - loadFormats: (): void => dispatch(gettingFormatsAsync()), + loadFormats: (): void => dispatch(getFormatsAsync()), verifyAuthorized: (): void => dispatch(authorizedAsync()), initPlugins: (): void => dispatch(checkPluginsAsync()), loadUsers: (): void => dispatch(getUsersAsync()), + resetErrors: (): void => dispatch(resetErrors()), + resetMessages: (): void => dispatch(resetMessages()), }; } -function reduxAppWrapper(props: StateToProps & DispatchToProps) { +function reduxAppWrapper(props: StateToProps & DispatchToProps): JSX.Element { return ( - - ) + + ); } const ReduxAppWrapper = connect( @@ -86,8 +95,8 @@ const ReduxAppWrapper = connect( ReactDOM.render( ( - + ), - document.getElementById('root') -) + document.getElementById('root'), +); diff --git a/cvat-ui/src/reducers/auth-reducer.ts b/cvat-ui/src/reducers/auth-reducer.ts index d4c9cc97d4de..63fecdf67ece 100644 --- a/cvat-ui/src/reducers/auth-reducer.ts +++ b/cvat-ui/src/reducers/auth-reducer.ts @@ -5,10 +5,7 @@ import { AuthState } from './interfaces'; const defaultState: AuthState = { initialized: false, - authError: null, - loginError: null, - logoutError: null, - registerError: null, + fetching: false, user: null, }; @@ -19,48 +16,55 @@ export default (state = defaultState, action: AnyAction): AuthState => { ...state, initialized: true, user: action.payload.user, - authError: null, }; case AuthActionTypes.AUTHORIZED_FAILED: return { ...state, initialized: true, - authError: action.payload.error, + }; + case AuthActionTypes.LOGIN: + return { + ...state, + fetching: true, }; case AuthActionTypes.LOGIN_SUCCESS: return { ...state, + fetching: false, user: action.payload.user, - loginError: null, }; case AuthActionTypes.LOGIN_FAILED: return { ...state, - user: null, - loginError: action.payload.error, + fetching: false, + }; + case AuthActionTypes.LOGOUT: + return { + ...state, + fetching: true, }; case AuthActionTypes.LOGOUT_SUCCESS: return { ...state, + fetching: false, user: null, - logoutError: null, }; - case AuthActionTypes.LOGOUT_FAILED: + case AuthActionTypes.REGISTER: return { ...state, - logoutError: action.payload.error, + fetching: true, + user: action.payload.user, }; case AuthActionTypes.REGISTER_SUCCESS: return { ...state, + fetching: false, user: action.payload.user, - registerError: null, }; case AuthActionTypes.REGISTER_FAILED: return { ...state, - user: null, - registerError: action.payload.error, + fetching: false, }; default: return state; diff --git a/cvat-ui/src/reducers/formats-reducer.ts b/cvat-ui/src/reducers/formats-reducer.ts index 2bdc2f9219e2..40fd2a80506f 100644 --- a/cvat-ui/src/reducers/formats-reducer.ts +++ b/cvat-ui/src/reducers/formats-reducer.ts @@ -1,31 +1,44 @@ import { AnyAction } from 'redux'; import { FormatsActionTypes } from '../actions/formats-actions'; +import { AuthActionTypes } from '../actions/auth-actions'; import { FormatsState } from './interfaces'; const defaultState: FormatsState = { - loaders: [], - dumpers: [], - gettingFormatsError: null, + annotationFormats: [], + datasetFormats: [], initialized: false, + fetching: false, }; export default (state = defaultState, action: AnyAction): FormatsState => { switch (action.type) { - case FormatsActionTypes.GETTING_FORMATS_SUCCESS: + case FormatsActionTypes.GET_FORMATS: { + return { + ...state, + fetching: true, + initialized: false, + }; + } + case FormatsActionTypes.GET_FORMATS_SUCCESS: return { ...state, initialized: true, - gettingFormatsError: null, - dumpers: action.payload.formats.map((format: any): any[] => format.dumpers).flat(), - loaders: action.payload.formats.map((format: any): any[] => format.loaders).flat(), + fetching: false, + annotationFormats: action.payload.annotationFormats, + datasetFormats: action.payload.datasetFormats, }; - case FormatsActionTypes.GETTING_FORMATS_FAILED: + case FormatsActionTypes.GET_FORMATS_FAILED: return { ...state, initialized: true, - gettingFormatsError: action.payload.error, + fetching: false, + }; + case AuthActionTypes.LOGOUT_SUCCESS: { + return { + ...defaultState, }; + } default: return state; } diff --git a/cvat-ui/src/reducers/interfaces.ts b/cvat-ui/src/reducers/interfaces.ts index 68324b02d2d8..138c0bce7d85 100644 --- a/cvat-ui/src/reducers/interfaces.ts +++ b/cvat-ui/src/reducers/interfaces.ts @@ -1,9 +1,6 @@ export interface AuthState { initialized: boolean; - authError: any; - loginError: any; - logoutError: any; - registerError: any; + fetching: boolean; user: any; } @@ -26,40 +23,46 @@ export interface Task { export interface TasksState { initialized: boolean; - tasksFetchingError: any; + fetching: boolean; + hideEmpty: boolean; gettingQuery: TasksQuery; count: number; current: Task[]; activities: { dumps: { - dumpingError: any; byTask: { // dumps in different formats at the same time [tid: number]: string[]; // dumper names }; }; + exports: { + byTask: { + // exports in different formats at the same time + [tid: number]: string[]; // dumper names + }; + }; loads: { - loadingError: any; - loadingDoneMessage: string; byTask: { // only one loading simultaneously [tid: number]: string; // loader name }; }; deletes: { - deletingError: any; byTask: { [tid: number]: boolean; // deleted (deleting if in dictionary) }; }; + creates: { + status: string; + }; }; } export interface FormatsState { - loaders: any[]; - dumpers: any[]; + annotationFormats: any[]; + datasetFormats: any[]; + fetching: boolean; initialized: boolean; - gettingFormatsError: any; } // eslint-disable-next-line import/prefer-default-export @@ -67,24 +70,140 @@ export enum SupportedPlugins { GIT_INTEGRATION = 'GIT_INTEGRATION', AUTO_ANNOTATION = 'AUTO_ANNOTATION', TF_ANNOTATION = 'TF_ANNOTATION', + TF_SEGMENTATION = 'TF_SEGMENTATION', ANALYTICS = 'ANALYTICS', } export interface PluginsState { + fetching: boolean; initialized: boolean; plugins: { [name in SupportedPlugins]: boolean; }; } -export interface TaskState { - task: Task | null; - taskFetchingError: any; - taskUpdatingError: any; -} - export interface UsersState { users: any[]; + fetching: boolean; initialized: boolean; - gettingUsersError: any; +} + +export interface ShareFileInfo { // get this data from cvat-core + name: string; + type: 'DIR' | 'REG'; +} + +export interface ShareItem { + name: string; + type: 'DIR' | 'REG'; + children: ShareItem[]; +} + +export interface ShareState { + root: ShareItem; +} + +export interface Model { + id: number | null; // null for preinstalled models + ownerID: number | null; // null for preinstalled models + name: string; + primary: boolean; + uploadDate: string; + updateDate: string; + labels: string[]; +} + +export enum RQStatus { + unknown = 'unknown', + queued = 'queued', + started = 'started', + finished = 'finished', + failed = 'failed', +} + +export interface ActiveInference { + status: RQStatus; + progress: number; + error: string; +} + +export interface ModelsState { + initialized: boolean; + fetching: boolean; + creatingStatus: string; + models: Model[]; + inferences: { + [index: number]: ActiveInference; + }; + visibleRunWindows: boolean; + activeRunTask: any; +} + +export interface ModelFiles { + [key: string]: string | File; + xml: string | File; + bin: string | File; + py: string | File; + json: string | File; +} + +export interface ErrorState { + message: string; + reason: string; +} + +export interface NotificationsState { + errors: { + auth: { + authorized: null | ErrorState; + login: null | ErrorState; + logout: null | ErrorState; + register: null | ErrorState; + }; + tasks: { + fetching: null | ErrorState; + updating: null | ErrorState; + dumping: null | ErrorState; + loading: null | ErrorState; + exporting: null | ErrorState; + deleting: null | ErrorState; + creating: null | ErrorState; + }; + formats: { + fetching: null | ErrorState; + }; + users: { + fetching: null | ErrorState; + }; + share: { + fetching: null | ErrorState; + }; + models: { + creating: null | ErrorState; + starting: null | ErrorState; + deleting: null | ErrorState; + fetching: null | ErrorState; + metaFetching: null | ErrorState; + inferenceStatusFetching: null | ErrorState; + }; + }; + messages: { + tasks: { + loadingDone: string; + }; + models: { + inferenceDone: string; + }; + }; +} + +export interface CombinedState { + auth: AuthState; + tasks: TasksState; + users: UsersState; + share: ShareState; + formats: FormatsState; + plugins: PluginsState; + models: ModelsState; + notifications: NotificationsState; } diff --git a/cvat-ui/src/reducers/models-reducer.ts b/cvat-ui/src/reducers/models-reducer.ts new file mode 100644 index 000000000000..664622fecffe --- /dev/null +++ b/cvat-ui/src/reducers/models-reducer.ts @@ -0,0 +1,121 @@ +import { AnyAction } from 'redux'; + +import { ModelsActionTypes } from '../actions/models-actions'; +import { AuthActionTypes } from '../actions/auth-actions'; +import { ModelsState } from './interfaces'; + +const defaultState: ModelsState = { + initialized: false, + fetching: false, + creatingStatus: '', + models: [], + visibleRunWindows: false, + activeRunTask: null, + inferences: {}, +}; + +export default function (state = defaultState, action: AnyAction): ModelsState { + switch (action.type) { + case ModelsActionTypes.GET_MODELS: { + return { + ...state, + initialized: false, + fetching: true, + }; + } + case ModelsActionTypes.GET_MODELS_SUCCESS: { + return { + ...state, + models: action.payload.models, + initialized: true, + fetching: false, + }; + } + case ModelsActionTypes.GET_MODELS_FAILED: { + return { + ...state, + initialized: true, + fetching: false, + }; + } + case ModelsActionTypes.DELETE_MODEL_SUCCESS: { + return { + ...state, + models: state.models.filter( + (model): boolean => model.id !== action.payload.id, + ), + }; + } + case ModelsActionTypes.CREATE_MODEL: { + return { + ...state, + creatingStatus: '', + }; + } + case ModelsActionTypes.CREATE_MODEL_STATUS_UPDATED: { + return { + ...state, + creatingStatus: action.payload.status, + }; + } + case ModelsActionTypes.CREATE_MODEL_FAILED: { + return { + ...state, + creatingStatus: '', + }; + } + case ModelsActionTypes.CREATE_MODEL_SUCCESS: { + return { + ...state, + initialized: false, + creatingStatus: 'CREATED', + }; + } + case ModelsActionTypes.SHOW_RUN_MODEL_DIALOG: { + return { + ...state, + visibleRunWindows: true, + activeRunTask: action.payload.taskInstance, + }; + } + case ModelsActionTypes.CLOSE_RUN_MODEL_DIALOG: { + return { + ...state, + visibleRunWindows: false, + activeRunTask: null, + }; + } + case ModelsActionTypes.GET_INFERENCE_STATUS_SUCCESS: { + const inferences = { ...state.inferences }; + if (action.payload.activeInference.status === 'finished') { + delete inferences[action.payload.taskID]; + } else { + inferences[action.payload.taskID] = action.payload.activeInference; + } + + return { + ...state, + inferences, + }; + } + case ModelsActionTypes.GET_INFERENCE_STATUS_FAILED: { + const inferences = { ...state.inferences }; + delete inferences[action.payload.taskID]; + + return { + ...state, + inferences, + }; + } + case AuthActionTypes.LOGOUT_SUCCESS: { + return { + ...defaultState, + }; + } + default: { + return { + ...state, + }; + } + } +} diff --git a/cvat-ui/src/reducers/notifications-reducer.ts b/cvat-ui/src/reducers/notifications-reducer.ts new file mode 100644 index 000000000000..e6fa34873860 --- /dev/null +++ b/cvat-ui/src/reducers/notifications-reducer.ts @@ -0,0 +1,435 @@ +import { AnyAction } from 'redux'; + +import { AuthActionTypes } from '../actions/auth-actions'; +import { FormatsActionTypes } from '../actions/formats-actions'; +import { ModelsActionTypes } from '../actions/models-actions'; +import { ShareActionTypes } from '../actions/share-actions'; +import { TasksActionTypes } from '../actions/tasks-actions'; +import { UsersActionTypes } from '../actions/users-actions'; +import { NotificationsActionType } from '../actions/notification-actions'; + +import { NotificationsState } from './interfaces'; + +const defaultState: NotificationsState = { + errors: { + auth: { + authorized: null, + login: null, + logout: null, + register: null, + }, + tasks: { + fetching: null, + updating: null, + dumping: null, + loading: null, + exporting: null, + deleting: null, + creating: null, + }, + formats: { + fetching: null, + }, + users: { + fetching: null, + }, + share: { + fetching: null, + }, + models: { + creating: null, + starting: null, + deleting: null, + fetching: null, + metaFetching: null, + inferenceStatusFetching: null, + }, + }, + messages: { + tasks: { + loadingDone: '', + }, + models: { + inferenceDone: '', + }, + }, +}; + +export default function (state = defaultState, action: AnyAction): NotificationsState { + switch (action.type) { + case AuthActionTypes.AUTHORIZED_FAILED: { + return { + ...state, + errors: { + ...state.errors, + auth: { + ...state.errors.auth, + authorized: { + message: 'Could not check authorization on the server', + reason: action.payload.error.toString(), + }, + }, + }, + }; + } + case AuthActionTypes.LOGIN_FAILED: { + return { + ...state, + errors: { + ...state.errors, + auth: { + ...state.errors.auth, + login: { + message: 'Could not login on the server', + reason: action.payload.error.toString(), + }, + }, + }, + }; + } + case AuthActionTypes.LOGOUT_FAILED: { + return { + ...state, + errors: { + ...state.errors, + auth: { + ...state.errors.auth, + logout: { + message: 'Could not logout from the server', + reason: action.payload.error.toString(), + }, + }, + }, + }; + } + case AuthActionTypes.REGISTER_FAILED: { + return { + ...state, + errors: { + ...state.errors, + auth: { + ...state.errors.auth, + register: { + message: 'Could not register on the server', + reason: action.payload.error.toString(), + }, + }, + }, + }; + } + case TasksActionTypes.EXPORT_DATASET_FAILED: { + const taskID = action.payload.task.id; + return { + ...state, + errors: { + ...state.errors, + tasks: { + ...state.errors.tasks, + exporting: { + message: 'Could not export dataset for the ' + + `task ${taskID}`, + reason: action.payload.error.toString(), + }, + }, + }, + }; + } + case TasksActionTypes.GET_TASKS_FAILED: { + return { + ...state, + errors: { + ...state.errors, + tasks: { + ...state.errors.tasks, + fetching: { + message: 'Could not fetch tasks', + reason: action.payload.error.toString(), + }, + }, + }, + }; + } + case TasksActionTypes.LOAD_ANNOTATIONS_FAILED: { + const taskID = action.payload.task.id; + return { + ...state, + errors: { + ...state.errors, + tasks: { + ...state.errors.tasks, + loading: { + message: 'Could not upload annotation for the ' + + `task ${taskID}`, + reason: action.payload.error.toString(), + }, + }, + }, + }; + } + case TasksActionTypes.LOAD_ANNOTATIONS_SUCCESS: { + const taskID = action.payload.task.id; + return { + ...state, + messages: { + ...state.messages, + tasks: { + ...state.messages.tasks, + loadingDone: 'Annotations have been loaded to the ' + + `task ${taskID}`, + }, + }, + }; + } + case TasksActionTypes.UPDATE_TASK_FAILED: { + const taskID = action.payload.task.id; + return { + ...state, + errors: { + ...state.errors, + tasks: { + ...state.errors.tasks, + updating: { + message: 'Could not update ' + + `task ${taskID}`, + reason: action.payload.error.toString(), + }, + }, + }, + }; + } + case TasksActionTypes.DUMP_ANNOTATIONS_FAILED: { + const taskID = action.payload.task.id; + return { + ...state, + errors: { + ...state.errors, + tasks: { + ...state.errors.tasks, + dumping: { + message: 'Could not dump annotations for the ' + + `task ${taskID}`, + reason: action.payload.error.toString(), + }, + }, + }, + }; + } + case TasksActionTypes.DELETE_TASK_FAILED: { + const { taskID } = action.payload; + return { + ...state, + errors: { + ...state.errors, + tasks: { + ...state.errors.tasks, + deleting: { + message: 'Could not delete the ' + + `task ${taskID}`, + reason: action.payload.error.toString(), + }, + }, + }, + }; + } + case TasksActionTypes.CREATE_TASK_FAILED: { + return { + ...state, + errors: { + ...state.errors, + tasks: { + ...state.errors.tasks, + creating: { + message: 'Could not create the task', + reason: action.payload.error.toString(), + }, + }, + }, + }; + } + case FormatsActionTypes.GET_FORMATS_FAILED: { + return { + ...state, + errors: { + ...state.errors, + formats: { + ...state.errors.formats, + fetching: { + message: 'Could not get formats from the server', + reason: action.payload.error.toString(), + }, + }, + }, + }; + } + case UsersActionTypes.GET_USERS_FAILED: { + return { + ...state, + errors: { + ...state.errors, + users: { + ...state.errors.users, + fetching: { + message: 'Could not get users from the server', + reason: action.payload.error.toString(), + }, + }, + }, + }; + } + case ShareActionTypes.LOAD_SHARE_DATA_FAILED: { + return { + ...state, + errors: { + ...state.errors, + share: { + ...state.errors.share, + fetching: { + message: 'Could not load share data from the server', + reason: action.payload.error.toString(), + }, + }, + }, + }; + } + case ModelsActionTypes.CREATE_MODEL_FAILED: { + return { + ...state, + errors: { + ...state.errors, + models: { + ...state.errors.models, + creating: { + message: 'Could not create the model', + reason: action.payload.error.toString(), + }, + }, + }, + }; + } + case ModelsActionTypes.DELETE_MODEL_FAILED: { + return { + ...state, + errors: { + ...state.errors, + models: { + ...state.errors.models, + deleting: { + message: 'Could not delete the model', + reason: action.payload.error.toString(), + }, + }, + }, + }; + } + case ModelsActionTypes.GET_INFERENCE_STATUS_SUCCESS: { + if (action.payload.activeInference.status === 'finished') { + const { taskID } = action.payload; + return { + ...state, + messages: { + ...state.messages, + models: { + ...state.messages.models, + inferenceDone: 'Automatic annotation finished for the ' + + `task ${taskID}`, + }, + }, + }; + } + + return { + ...state, + }; + } + case ModelsActionTypes.FETCH_META_FAILED: { + return { + ...state, + errors: { + ...state.errors, + models: { + ...state.errors.models, + metaFetching: { + message: 'Could not fetch models meta information', + reason: action.payload.error.toString(), + }, + }, + }, + }; + } + case ModelsActionTypes.GET_INFERENCE_STATUS_FAILED: { + const { taskID } = action.payload; + return { + ...state, + errors: { + ...state.errors, + models: { + ...state.errors.models, + inferenceStatusFetching: { + message: 'Could not fetch inference status for the ' + + `task ${taskID}`, + reason: action.payload.error.toString(), + }, + }, + }, + }; + } + case ModelsActionTypes.GET_MODELS_FAILED: { + return { + ...state, + errors: { + ...state.errors, + models: { + ...state.errors.models, + fetching: { + message: 'Could not get models from the server', + reason: action.payload.error.toString(), + }, + }, + }, + }; + } + case ModelsActionTypes.INFER_MODEL_FAILED: { + const { taskID } = action.payload; + return { + ...state, + errors: { + ...state.errors, + models: { + ...state.errors.models, + starting: { + message: 'Could not infer model for the ' + + `task ${taskID}`, + reason: action.payload.error.toString(), + }, + }, + }, + }; + } + case NotificationsActionType.RESET_ERRORS: { + return { + ...state, + errors: { + ...defaultState.errors, + }, + }; + } + case NotificationsActionType.RESET_MESSAGES: { + return { + ...state, + messages: { + ...defaultState.messages, + }, + }; + } + case AuthActionTypes.LOGOUT_SUCCESS: { + return { + ...defaultState, + }; + } + default: { + return { + ...state, + }; + } + } +} diff --git a/cvat-ui/src/reducers/plugins-reducer.ts b/cvat-ui/src/reducers/plugins-reducer.ts index 0cb717e8c2a6..1a7e1f160787 100644 --- a/cvat-ui/src/reducers/plugins-reducer.ts +++ b/cvat-ui/src/reducers/plugins-reducer.ts @@ -1,31 +1,52 @@ import { AnyAction } from 'redux'; import { PluginsActionTypes } from '../actions/plugins-actions'; - +import { AuthActionTypes } from '../actions/auth-actions'; +import { registerGitPlugin } from '../utils/git-utils'; import { PluginsState, } from './interfaces'; + const defaultState: PluginsState = { + fetching: false, initialized: false, plugins: { GIT_INTEGRATION: false, AUTO_ANNOTATION: false, TF_ANNOTATION: false, + TF_SEGMENTATION: false, ANALYTICS: false, }, }; - export default function (state = defaultState, action: AnyAction): PluginsState { switch (action.type) { + case PluginsActionTypes.CHECK_PLUGINS: { + return { + ...state, + initialized: false, + fetching: true, + }; + } case PluginsActionTypes.CHECKED_ALL_PLUGINS: { const { plugins } = action.payload; + + if (!state.plugins.GIT_INTEGRATION && plugins.GIT_INTEGRATION) { + registerGitPlugin(); + } + return { ...state, initialized: true, + fetching: false, plugins, }; } + case AuthActionTypes.LOGOUT_SUCCESS: { + return { + ...defaultState, + }; + } default: return { ...state }; } diff --git a/cvat-ui/src/reducers/root-reducer.ts b/cvat-ui/src/reducers/root-reducer.ts index 57b4fee82f86..52d0723b9212 100644 --- a/cvat-ui/src/reducers/root-reducer.ts +++ b/cvat-ui/src/reducers/root-reducer.ts @@ -2,35 +2,21 @@ import { combineReducers, Reducer } from 'redux'; import authReducer from './auth-reducer'; import tasksReducer from './tasks-reducer'; import usersReducer from './users-reducer'; +import shareReducer from './share-reducer'; import formatsReducer from './formats-reducer'; import pluginsReducer from './plugins-reducer'; -import taskReducer from './task-reducer'; - -import { - AuthState, - TasksState, - UsersState, - FormatsState, - PluginsState, - TaskState, -} from './interfaces'; - -export interface CombinedState { - auth: AuthState; - tasks: TasksState; - users: UsersState; - formats: FormatsState; - plugins: PluginsState; - activeTask: TaskState; -} +import modelsReducer from './models-reducer'; +import notificationsReducer from './notifications-reducer'; export default function createRootReducer(): Reducer { return combineReducers({ auth: authReducer, tasks: tasksReducer, users: usersReducer, + share: shareReducer, formats: formatsReducer, plugins: pluginsReducer, - activeTask: taskReducer, + models: modelsReducer, + notifications: notificationsReducer, }); } diff --git a/cvat-ui/src/reducers/share-reducer.ts b/cvat-ui/src/reducers/share-reducer.ts new file mode 100644 index 000000000000..185bf2565e90 --- /dev/null +++ b/cvat-ui/src/reducers/share-reducer.ts @@ -0,0 +1,56 @@ +import { AnyAction } from 'redux'; + +import { ShareActionTypes } from '../actions/share-actions'; +import { AuthActionTypes } from '../actions/auth-actions'; +import { + ShareState, + ShareFileInfo, + ShareItem, +} from './interfaces'; + +const defaultState: ShareState = { + root: { + name: '/', + type: 'DIR', + children: [], + }, +}; + +export default function (state = defaultState, action: AnyAction): ShareState { + switch (action.type) { + case ShareActionTypes.LOAD_SHARE_DATA_SUCCESS: { + const { values } = action.payload; + const { directory } = action.payload; + + // Find directory item in storage + let dir = state.root; + for (const dirName of directory.split('/')) { + if (dirName) { + [dir] = dir.children.filter( + (child): boolean => child.name === dirName, + ); + } + } + + // Update its children + dir.children = (values as ShareFileInfo[]) + .map((value): ShareItem => ({ + ...value, + children: [], + })); + + return { + ...state, + }; + } + case AuthActionTypes.LOGOUT_SUCCESS: { + return { + ...defaultState, + }; + } + default: + return { + ...state, + }; + } +} diff --git a/cvat-ui/src/reducers/tasks-reducer.ts b/cvat-ui/src/reducers/tasks-reducer.ts index 691e8486ffa8..eed41a78ac6b 100644 --- a/cvat-ui/src/reducers/tasks-reducer.ts +++ b/cvat-ui/src/reducers/tasks-reducer.ts @@ -1,11 +1,13 @@ import { AnyAction } from 'redux'; import { TasksActionTypes } from '../actions/tasks-actions'; +import { AuthActionTypes } from '../actions/auth-actions'; import { TasksState, Task } from './interfaces'; const defaultState: TasksState = { initialized: false, - tasksFetchingError: null, + fetching: false, + hideEmpty: false, count: 0, current: [], gettingQuery: { @@ -20,43 +22,24 @@ const defaultState: TasksState = { }, activities: { dumps: { - dumpingError: null, + byTask: {}, + }, + exports: { byTask: {}, }, loads: { - loadingError: null, - loadingDoneMessage: '', byTask: {}, }, deletes: { - deletingError: null, byTask: {}, }, + creates: { + status: '', + }, }, }; -export default (inputState: TasksState = defaultState, action: AnyAction): TasksState => { - function cleanupTemporaryInfo(stateToResetErrors: TasksState): TasksState { - return { - ...stateToResetErrors, - tasksFetchingError: null, - activities: { - ...stateToResetErrors.activities, - dumps: { - ...stateToResetErrors.activities.dumps, - dumpingError: null, - }, - loads: { - ...stateToResetErrors.activities.loads, - loadingError: null, - loadingDoneMessage: '', - }, - }, - }; - } - - const state = cleanupTemporaryInfo(inputState); - +export default (state: TasksState = defaultState, action: AnyAction): TasksState => { switch (action.type) { case TasksActionTypes.GET_TASKS: return { @@ -64,11 +47,15 @@ export default (inputState: TasksState = defaultState, action: AnyAction): Tasks activities: { ...state.activities, deletes: { - deletingError: null, byTask: {}, }, }, initialized: false, + fetching: true, + hideEmpty: true, + count: 0, + current: [], + gettingQuery: { ...action.payload.query }, }; case TasksActionTypes.GET_TASKS_SUCCESS: { const combinedWithPreviews = action.payload.array @@ -80,6 +67,7 @@ export default (inputState: TasksState = defaultState, action: AnyAction): Tasks return { ...state, initialized: true, + fetching: false, count: action.payload.count, current: combinedWithPreviews, gettingQuery: { ...action.payload.query }, @@ -89,10 +77,7 @@ export default (inputState: TasksState = defaultState, action: AnyAction): Tasks return { ...state, initialized: true, - count: 0, - current: [], - gettingQuery: { ...action.payload.query }, - tasksFetchingError: action.payload.error, + fetching: false, }; case TasksActionTypes.DUMP_ANNOTATIONS: { const { task } = action.payload; @@ -105,8 +90,6 @@ export default (inputState: TasksState = defaultState, action: AnyAction): Tasks const theTaskDumpingActivities = [...tasksDumpingActivities.byTask[task.id] || []]; if (!theTaskDumpingActivities.includes(dumper.name)) { theTaskDumpingActivities.push(dumper.name); - } else { - throw Error('Dump with the same dumper for this same task has been already started'); } tasksDumpingActivities.byTask[task.id] = theTaskDumpingActivities; @@ -142,11 +125,9 @@ export default (inputState: TasksState = defaultState, action: AnyAction): Tasks case TasksActionTypes.DUMP_ANNOTATIONS_FAILED: { const { task } = action.payload; const { dumper } = action.payload; - const dumpingError = action.payload.error; const tasksDumpingActivities = { ...state.activities.dumps, - dumpingError, }; const theTaskDumpingActivities = tasksDumpingActivities.byTask[task.id] @@ -162,6 +143,70 @@ export default (inputState: TasksState = defaultState, action: AnyAction): Tasks }, }; } + case TasksActionTypes.EXPORT_DATASET: { + const { task } = action.payload; + const { exporter } = action.payload; + + const tasksExportingActivities = { + ...state.activities.exports, + }; + + const theTaskDumpingActivities = [...tasksExportingActivities.byTask[task.id] || []]; + if (!theTaskDumpingActivities.includes(exporter.name)) { + theTaskDumpingActivities.push(exporter.name); + } + tasksExportingActivities.byTask[task.id] = theTaskDumpingActivities; + + return { + ...state, + activities: { + ...state.activities, + exports: tasksExportingActivities, + }, + }; + } + case TasksActionTypes.EXPORT_DATASET_SUCCESS: { + const { task } = action.payload; + const { exporter } = action.payload; + + const tasksExportingActivities = { + ...state.activities.exports, + }; + + const theTaskExportingActivities = tasksExportingActivities.byTask[task.id] + .filter((exporterName: string): boolean => exporterName !== exporter.name); + + tasksExportingActivities.byTask[task.id] = theTaskExportingActivities; + + return { + ...state, + activities: { + ...state.activities, + exports: tasksExportingActivities, + }, + }; + } + case TasksActionTypes.EXPORT_DATASET_FAILED: { + const { task } = action.payload; + const { exporter } = action.payload; + + const tasksExportingActivities = { + ...state.activities.exports, + }; + + const theTaskExportingActivities = tasksExportingActivities.byTask[task.id] + .filter((exporterName: string): boolean => exporterName !== exporter.name); + + tasksExportingActivities.byTask[task.id] = theTaskExportingActivities; + + return { + ...state, + activities: { + ...state.activities, + exports: tasksExportingActivities, + }, + }; + } case TasksActionTypes.LOAD_ANNOTATIONS: { const { task } = action.payload; const { loader } = action.payload; @@ -199,14 +244,12 @@ export default (inputState: TasksState = defaultState, action: AnyAction): Tasks ...state.activities, loads: { ...tasksLoadingActivity, - loadingDoneMessage: `Annotations have been loaded to the task ${task.id}`, }, }, }; } case TasksActionTypes.LOAD_ANNOTATIONS_FAILED: { const { task } = action.payload; - const loadingError = action.payload.error; const tasksLoadingActivity = { ...state.activities.loads, @@ -220,7 +263,6 @@ export default (inputState: TasksState = defaultState, action: AnyAction): Tasks ...state.activities, loads: { ...tasksLoadingActivity, - loadingError, }, }, }; @@ -263,7 +305,6 @@ export default (inputState: TasksState = defaultState, action: AnyAction): Tasks } case TasksActionTypes.DELETE_TASK_FAILED: { const { taskID } = action.payload; - const { error } = action.payload; const deletesActivities = state.activities.deletes; @@ -278,11 +319,105 @@ export default (inputState: TasksState = defaultState, action: AnyAction): Tasks ...state.activities, deletes: { ...deletesActivities, - deletingError: error, }, }, }; } + case TasksActionTypes.CREATE_TASK: { + return { + ...state, + activities: { + ...state.activities, + creates: { + status: '', + }, + }, + }; + } + case TasksActionTypes.CREATE_TASK_STATUS_UPDATED: { + const { status } = action.payload; + + return { + ...state, + activities: { + ...state.activities, + creates: { + ...state.activities.creates, + status, + }, + }, + }; + } + case TasksActionTypes.CREATE_TASK_SUCCESS: { + return { + ...state, + activities: { + ...state.activities, + creates: { + ...state.activities.creates, + status: 'CREATED', + }, + }, + }; + } + case TasksActionTypes.CREATE_TASK_FAILED: { + return { + ...state, + activities: { + ...state.activities, + creates: { + ...state.activities.creates, + status: 'FAILED', + }, + }, + }; + } + case TasksActionTypes.UPDATE_TASK: { + return { + ...state, + }; + } + case TasksActionTypes.UPDATE_TASK_SUCCESS: { + return { + ...state, + current: state.current.map((task): Task => { + if (task.instance.id === action.payload.task.id) { + return { + ...task, + instance: action.payload.task, + }; + } + + return task; + }), + }; + } + case TasksActionTypes.UPDATE_TASK_FAILED: { + return { + ...state, + current: state.current.map((task): Task => { + if (task.instance.id === action.payload.task.id) { + return { + ...task, + instance: action.payload.task, + }; + } + + return task; + }), + }; + } + case TasksActionTypes.HIDE_EMPTY_TASKS: { + return { + ...state, + hideEmpty: action.payload.hideEmpty, + }; + } + case AuthActionTypes.LOGOUT_SUCCESS: { + return { + ...defaultState, + }; + } default: return state; } diff --git a/cvat-ui/src/reducers/users-reducer.ts b/cvat-ui/src/reducers/users-reducer.ts index cb821d1c8cac..bb37e6dfc470 100644 --- a/cvat-ui/src/reducers/users-reducer.ts +++ b/cvat-ui/src/reducers/users-reducer.ts @@ -1,35 +1,42 @@ import { AnyAction } from 'redux'; import { UsersState } from './interfaces'; +import { AuthActionTypes } from '../actions/auth-actions'; import { UsersActionTypes } from '../actions/users-actions'; -const initialState: UsersState = { +const defaultState: UsersState = { users: [], + fetching: false, initialized: false, - gettingUsersError: null, }; -export default function (state: UsersState = initialState, action: AnyAction): UsersState { +export default function (state: UsersState = defaultState, action: AnyAction): UsersState { switch (action.type) { - case UsersActionTypes.GET_USERS: + case UsersActionTypes.GET_USERS: { return { ...state, + fetching: true, initialized: false, - gettingUsersError: null, }; + } case UsersActionTypes.GET_USERS_SUCCESS: return { ...state, + fetching: false, initialized: true, users: action.payload.users, }; case UsersActionTypes.GET_USERS_FAILED: return { ...state, + fetching: false, initialized: true, - users: [], - gettingUsersError: action.payload.error, }; + case AuthActionTypes.LOGOUT_SUCCESS: { + return { + ...defaultState, + }; + } default: return { ...state, diff --git a/cvat-ui/src/store.ts b/cvat-ui/src/store.ts index 89fd5fc66599..e87aa054ec92 100644 --- a/cvat-ui/src/store.ts +++ b/cvat-ui/src/store.ts @@ -1,15 +1,28 @@ import thunk from 'redux-thunk'; -import { createStore, applyMiddleware, Store } from 'redux'; - -import createRootReducer from './reducers/root-reducer'; +import { + createStore, + applyMiddleware, + Store, + Reducer, +} from 'redux'; const middlewares = [ thunk, ]; -export default function createCVATStore(): Store { - return createStore( +let store: Store | null = null; + +export default function createCVATStore(createRootReducer: () => Reducer): void { + store = createStore( createRootReducer(), applyMiddleware(...middlewares), ); } + +export function getCVATStore(): Store { + if (store) { + return store; + } + + throw new Error('First create a store'); +} diff --git a/cvat-ui/src/stylesheet.css b/cvat-ui/src/stylesheet.css index 77e4a70e2da1..5fed0d58e168 100644 --- a/cvat-ui/src/stylesheet.css +++ b/cvat-ui/src/stylesheet.css @@ -1,4 +1,13 @@ +hr { + border: 0; + height: 0; + border-top: 1px solid rgba(0, 0, 0, 0.1); + border-bottom: 1px solid rgba(255, 255, 255, 0.3); +} + .cvat-header.ant-layout-header { + display: -webkit-box; + display: -ms-flexbox; display: flex; padding-left: 0px; padding-right: 0px; @@ -9,131 +18,90 @@ .cvat-left-header { width: 50%; + display: -webkit-box; + display: -ms-flexbox; display: flex; - justify-content: flex-start; - align-items: center; + -webkit-box-pack: start; + -ms-flex-pack: start; + justify-content: flex-start; + -webkit-box-align: center; + -ms-flex-align: center; + align-items: center; } .cvat-right-header { width: 50%; + display: -webkit-box; + display: -ms-flexbox; display: flex; - justify-content: flex-end; - align-items: center; + -webkit-box-pack: end; + -ms-flex-pack: end; + justify-content: flex-end; + -webkit-box-align: center; + -ms-flex-align: center; + align-items: center; } .cvat-flex { + display: -webkit-box; + display: -ms-flexbox; display: flex; } .cvat-flex-center { - align-items: center; + -webkit-box-align: center; + -ms-flex-align: center; + align-items: center; } .cvat-black-color { - color: black; -} - -.cvat-header-buttons.ant-radio-group { - height: 100%; - display: flex; + color: #363435; } -.cvat-header-buttons.ant-radio-group > label { - height: 100%; - background: rgba(255, 255, 255, 0); - border-radius: 0px; - display: flex; - align-items: center; - padding: 0 30px; - - /* Important here is used in order to redefine all states :hover, :active, :focus-within, etc */ - user-select: none !important; - border: none !important; - border-color: none !important; - box-shadow: none !important; - outline: none !important; - color: black !important; -} - -.cvat-header-buttons.ant-radio-group > label::before { - background-color: unset !important; -} - -.cvat-header-buttons.ant-radio-group > label.ant-radio-button-wrapper-checked { - height: 100%; - background: #C3C3C3; -} -.anticon.cvat-logo-icon { - display: flex; - align-items: center; - margin-right: 20px; -} - -.anticon.cvat-logo-icon > img { - display: flex; - height: 15.8px; - margin-left: 18px; +.cvat-feedback-button { + position: absolute; + bottom: 20px; + right: 20px; + padding: 0px; } -.anticon.cvat-back-icon > img { - display: flex; - height: 15.8px; - margin-left: 18px; - margin-right: 18px; +.cvat-feedback-button > i { + font-size: 40px; } -.anticon.cvat-back-icon:hover > img { - filter: invert(0.4); +.anticon.cvat-logo-icon > svg { + -webkit-transform: scale(0.7); + -ms-transform: scale(0.7); + transform: scale(0.7); } .ant-btn.cvat-header-button { - height: 100%; - background: rgba(255, 255, 255, 0); - border-radius: 0px; - color: black !important; - transition: color 0.5s; - padding: 0 30px; + color: black; + padding: 0px 10px; + margin-right: 10px; } -.ant-btn.cvat-header-button:active { - background: #C3C3C3; -} -.ant-menu.cvat-header-menu { - width: fit-content; - align-items: center; - border: 0px; +.ant-dropdown-trigger.cvat-header-menu-dropdown { + display: -webkit-box; + display: -ms-flexbox; + display: flex; + -webkit-box-align: center; + -ms-flex-align: center; + align-items: center; border-left: 1px solid #c3c3c3; - height: 100%; - background: rgba(255,255,255,0); -} - -.ant-menu.cvat-header-menu > li.ant-menu-submenu { - border-bottom: unset !important; -} - - -.ant-menu.cvat-header-menu > li > div { - margin-top: 0px; -} - -.anticon.cvat-header-user-icon { - display: contents; -} - -.anticon.cvat-header-user-icon > img { - width: 17px; - margin: 16px; + padding: 0px 20px; } -.anticon.cvat-header-menu-icon > img { - width: 14px; - margin: 10px; - transform: rotate(-90deg); +.anticon.cvat-header-account-icon > svg { + -webkit-transform: scale(0.4); + -ms-transform: scale(0.4); + transform: scale(0.4); } -.anticon.cvat-empty-tasks-icon > img { - width: 90px; +.anticon.cvat-header-menu-icon { + margin-left: 16px; + margin-right: 0px; } .cvat-title { @@ -143,72 +111,81 @@ padding-top: 5px; } -.tasks-page { +.cvat-tasks-page { padding-top: 30px; } -.tasks-page > div:nth-child(1) { +.cvat-tasks-page > div:nth-child(1) { margin-bottom: 10px; } -.tasks-page > div:nth-child(1) > div > span { +.cvat-tasks-page > div:nth-child(1) > div > span { color: black; } -.tasks-page > div:nth-child(2) > div:nth-child(1) { +.cvat-tasks-page > div:nth-child(2) > div:nth-child(1) { + display: -webkit-box; + display: -ms-flexbox; display: flex; } -.tasks-page > div:nth-child(2) > div:nth-child(2) { +.cvat-tasks-page > div:nth-child(2) > div:nth-child(2) { + display: -webkit-box; + display: -ms-flexbox; display: flex; - justify-content: flex-end; + -webkit-box-pack: end; + -ms-flex-pack: end; + justify-content: flex-end; } -.tasks-page > div:nth-child(2) > div:nth-child(1) > span:nth-child(2) { +.cvat-tasks-page > div:nth-child(2) > div:nth-child(1) > span:nth-child(2) { width: 200px; margin-left: 10px; } -.tasks-page > span.ant-typography { - user-select: none; +.cvat-tasks-page > span.ant-typography { + -webkit-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; } -.tasks-page { +.cvat-tasks-page { height: 100%; } -.tasks-page > div:nth-child(4) { - margin-top: 28px; +.cvat-tasks-page > div:nth-child(4) { + margin-top: 10px; } -.tasks-page > div:nth-child(3) { - margin-top: 28px; +.cvat-tasks-page > div:nth-child(3) { + margin-top: 10px; } /* > 1280 */ @media only screen and (min-height: 1280px) { - .tasks-page > div:nth-child(3) { + .cvat-tasks-page > div:nth-child(3) { height: 80%; } } /* 769 => 1280 */ @media only screen and (max-height: 1280px) { - .tasks-page > div:nth-child(3) { + .cvat-tasks-page > div:nth-child(3) { height: 80%; } } /* 0 => 768 */ @media only screen and (max-height: 768px) { - .tasks-page > div:nth-child(3) { + .cvat-tasks-page > div:nth-child(3) { height: 70%; } } /* empty-tasks icon */ .cvat-empty-task-list > div:nth-child(1) { - margin-top: 100px; + margin-top: 50px; } .cvat-empty-task-list > div:nth-child(2) > div { @@ -227,8 +204,12 @@ } .ant-pagination.cvat-tasks-pagination { + display: -webkit-box; + display: -ms-flexbox; display: flex; - justify-content: center; + -webkit-box-pack: center; + -ms-flex-pack: center; + justify-content: center; } .cvat-task-list { @@ -250,17 +231,26 @@ border: 1px solid #40a9ff; } +.cvat-tasks-list-item > div:nth-child(2) { + word-break: break-all; +} + .cvat-tasks-list-item > div:nth-child(4) > div { margin-right: 20px; } .cvat-tasks-list-item > div:nth-child(4) > div:nth-child(2) { - margin-right: 20px; - margin-top: 20px; + margin-right: 5px; + margin-top: 10px; } .cvat-tasks-list-item > div:nth-child(4) > div:nth-child(2) > div { + display: -webkit-box; + display: -ms-flexbox; display: flex; + -webkit-box-align: center; + -ms-flex-align: center; + align-items: center; } .cvat-task-item-menu-icon > img { @@ -268,23 +258,49 @@ } .cvat-task-item-menu-icon > img:hover { - filter: invert(0.5); + -webkit-filter: invert(0.5); + filter: invert(0.5); +} + +.ant-menu.cvat-actions-menu { + -webkit-box-shadow: 0 0 17px rgba(0,0,0,0.2); + box-shadow: 0 0 17px rgba(0,0,0,0.2); } -.cvat-task-item-menu > hr { +.cvat-actions-menu > hr { border: 0.5px solid #D6D6D6; } -.cvat-task-item-load-submenu-item { - padding: 0px; +.cvat-actions-menu > *:hover { + background-color: rgba(24,144,255,0.05); } -.cvat-task-item-load-submenu-item > span > .ant-upload { - width: 100%; +.cvat-actions-menu-load-submenu-item:hover { + background-color: rgba(24,144,255,0.05); } -.cvat-task-item-dump-submenu-item { - padding: 0px; +.cvat-actions-menu-dump-submenu-item > button { + text-align: start; +} + +.cvat-actions-menu-export-submenu-item:hover { + background-color: rgba(24,144,255,0.05); +} + +.cvat-actions-menu-export-submenu-item > button { + text-align: start; +} + +.cvat-actions-menu-dump-submenu-item:hover { + background-color: rgba(24,144,255,0.05); +} + +.cvat-actions-menu > li:nth-child(2) > div > span { + margin-right: 15px; +} + +.cvat-actions-menu > .ant-menu-submenu-vertical > .ant-menu-submenu-title .ant-menu-submenu-arrow { + width: 0px; } .cvat-task-item-preview { @@ -293,8 +309,12 @@ } .cvat-task-item-preview-wrapper { + display: -webkit-box; + display: -ms-flexbox; display: flex; - justify-content: center; + -webkit-box-pack: center; + -ms-flex-pack: center; + justify-content: center; overflow: hidden; margin: 20px; margin-top: 0px; @@ -310,8 +330,8 @@ margin-right: 5px; } -.cvat-task-completed-progress > div > div > div > div { - background: #52c41a !important; +.cvat-task-completed-progress > div > div > div > div.ant-progress-bg { + background: #52c41a !important; /* csslint allow: important */ } .cvat-task-progress-progress { @@ -326,6 +346,11 @@ margin-right: 5px; } +.cvat-task-details-wrapper { + overflow-y: auto; + height: 100%; +} + .cvat-task-details { width: 100%; height: auto; @@ -343,6 +368,26 @@ margin-top: 20px; } +.cvat-dataset-repository-url > a { + margin-right: 10px; +} + +.cvat-dataset-repository-url > .ant-tag-red { + -webkit-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; + opacity: 0.4; +} + +.cvat-dataset-repository-url > .ant-tag-red:hover { + opacity: 0.8; +} + +.cvat-dataset-repository-url > .ant-tag-red:active { + opacity: 1; +} + .cvat-task-job-list { width: 100%; height: auto; @@ -353,6 +398,12 @@ background: white; } +.cvat-task-job-list > div:nth-child(1) > div:nth-child(1) { + display: -webkit-box; + display: -ms-flexbox; + display: flex; +} + .cvat-task-top-bar { margin-top: 20px; margin-bottom: 10px; @@ -364,13 +415,17 @@ } .cvat-task-preview-wrapper { + display: -webkit-box; + display: -ms-flexbox; display: flex; - justify-content: start; + -webkit-box-pack: start; + -ms-flex-pack: start; + justify-content: start; overflow: hidden; margin-bottom: 20px; } -.cvat-task-assignee-selector { +.cvat-user-selector { margin-left: 10px; width: 150px; } @@ -379,36 +434,62 @@ margin-left: 15px; } -.cvat-raw-labels-viewer { - border-color: #d9d9d9 !important; - box-shadow: none !important; +textarea.ant-input.cvat-raw-labels-viewer { + border-color: #d9d9d9; + -webkit-box-shadow: none; + box-shadow: none; border-top: none; border-radius: 0px 0px 5px 5px; - min-height: 9em !important; + min-height: 9em; font-family:Consolas,Monaco,Lucida Console,Liberation Mono,DejaVu Sans Mono,Bitstream Vera Sans Mono,Courier New, monospace; } +.cvat-raw-labels-viewer:focus { + border-color: #d9d9d9; + -webkit-box-shadow: none; + box-shadow: none; +} + +.cvat-raw-labels-viewer:hover { + border-color: #d9d9d9; + -webkit-box-shadow: none; + box-shadow: none; +} + .cvat-constructor-viewer { border: 1px solid #d9d9d9; - box-shadow: none; + -webkit-box-shadow: none; + box-shadow: none; border-top: none; border-radius: 0px 0px 5px 5px; padding: 5px; + display: -webkit-box; + display: -ms-flexbox; display: flex; - flex-wrap: wrap; + -ms-flex-wrap: wrap; + flex-wrap: wrap; overflow-y: auto; min-height: 9em; } .cvat-constructor-viewer-item { + height: -webkit-fit-content; + height: -moz-fit-content; height: fit-content; + display: -webkit-box; + display: -ms-flexbox; display: flex; - align-items: center; + -webkit-box-align: center; + -ms-flex-align: center; + align-items: center; padding: 2px 10px; border-radius: 2px; margin: 2px; margin-left: 8px; - user-select: none; + -webkit-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; border: 1px solid rgba(0, 0, 0, 0); opacity: 0.6; } @@ -428,14 +509,23 @@ } .cvat-constructor-viewer-new-item { + height: -webkit-fit-content; + height: -moz-fit-content; height: fit-content; + display: -webkit-box; + display: -ms-flexbox; display: flex; - align-items: center; + -webkit-box-align: center; + -ms-flex-align: center; + align-items: center; padding: 2px 10px; border-radius: 2px; margin: 2px; margin-left: 8px; - user-select: none; + -webkit-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; opacity: 1; } @@ -469,14 +559,16 @@ .ant-typography.cvat-jobs-header { margin-bottom: 0px; + font-size: 20px; + font-weight: bold; } /* Pagination in center */ .cvat-task-jobs-table > div > div { text-align: center; } -.cvat-task-jobs-table > div > div > ul { - float: none !important; +.cvat-task-jobs-table > div > div > .ant-table-pagination.ant-pagination { + float: none; } .cvat-job-completed-color { @@ -491,6 +583,415 @@ color: #C1C1C1; } +.cvat-create-task-form-wrapper { + text-align: center; + margin-top: 40px; + overflow-y: auto; + height: 90%; +} + +.cvat-create-task-form-wrapper > div > span { + font-size: 36px; +} + +.cvat-create-task-content { + margin-top: 20px; + width: 100%; + height: auto; + border: 1px solid #c3c3c3; + border-radius: 3px; + padding: 20px; + background: white; + text-align: initial; +} + +.cvat-create-task-content > div:not(first-child) { + margin-top: 10px; +} + +.cvat-create-task-content > div:nth-child(7) > button { + float: right; + width: 120px; +} + +.cvat-share-tree { + height: -webkit-fit-content; + height: -moz-fit-content; + height: fit-content; + min-height: 10em; + max-height: 20em; + overflow: auto; +} + +.cvat-models-page { + padding-top: 30px; + height: 100%; + overflow: auto; +} + +.cvat-models-page > div:nth-child(1) { + margin-bottom: 10px; +} + +.cvat-models-page > div:nth-child(1) > div:nth-child(1) { + display: -webkit-box; + display: -ms-flexbox; + display: flex; +} + +.cvat-models-page > div:nth-child(1) > div:nth-child(2) { + display: -webkit-box; + display: -ms-flexbox; + display: flex; + -webkit-box-pack: end; + -ms-flex-pack: end; + justify-content: flex-end; +} + +/* empty-models icon */ +.cvat-empty-models-list > div:nth-child(1) { + margin-top: 50px; +} + +.cvat-empty-models-list > div:nth-child(2) > div { + margin-top: 20px; +} + +/* No models uploaded yet */ +.cvat-empty-models-list > div:nth-child(2) > div > span { + font-size: 20px; + color: #4A4A4A; +} + +/* To annotate your task automatically */ +.cvat-empty-models-list > div:nth-child(3) { + margin-top: 10px; +} + +.cvat-models-list { + height: 100%; + overflow-y: auto; +} + +.cvat-models-list-item { + width: 100%; + height: 60px; + border: 1px solid #c3c3c3; + border-radius: 3px; + margin-bottom: 15px; + padding: 15px; + background: white; +} + +.cvat-models-list-item:hover { + border: 1px solid #40a9ff; +} + +.cvat-models-list-item > div { + display: -webkit-box; + display: -ms-flexbox; + display: flex; + -webkit-box-align: center; + -ms-flex-align: center; + align-items: center; +} + +.cvat-models-list-item > div:nth-child(2) > span { + -o-text-overflow: ellipsis; + text-overflow: ellipsis; + white-space: nowrap; + overflow: hidden; +} + +.cvat-models-list-item > div:nth-child(3) > span { + -o-text-overflow: ellipsis; + text-overflow: ellipsis; + white-space: nowrap; + overflow: hidden; +} + +.cvat-menu-icon { + -webkit-transform: scale(0.5); + -ms-transform: scale(0.5); + transform: scale(0.5); +} + +.cvat-create-model-form-wrapper { + text-align: center; + margin-top: 40px; + overflow-y: auto; + height: 90%; +} + +.cvat-create-model-form-wrapper > div > span { + font-size: 36px; +} + +.cvat-create-model-content { + margin-top: 20px; + width: 100%; + height: auto; + border: 1px solid #c3c3c3; + border-radius: 3px; + padding: 20px; + background: white; + text-align: initial; +} + +.cvat-create-model-content > div:nth-child(1) > i { + float: right; + font-size: 20px; + color: red; +} + +.cvat-create-model-content > div:nth-child(4) { + margin-top: 10px; +} + +.cvat-create-model-content > div:nth-child(6) > button { + margin-top: 10px; + float: right; + width: 120px; +} + +.cvat-run-model-dialog > div:not(first-child) { + margin-top: 10px; +} + +.cvat-run-model-dialog-info-icon { + color: blue; +} + +.cvat-run-model-dialog-remove-mapping-icon { + color: red; +} + +#root { + width: 100%; + height: 100%; + min-height: 100%; + display: -ms-grid; + display: grid; +} + #cvat-create-task-button { padding: 0 30px; } + +#cvat-create-model-button { + padding: 0 30px; +} + +/* Annotation view */ +.cvat-annotation-page.ant-layout { + height: 100% +} + +.ant-layout-header.cvat-annotation-page-header { + background-color: #F1F1F1; + border-bottom: 1px solid #D7D7D7; + height: 54px; + padding: 0px; +} + +.cvat-annotation-header-left-group { + height: 100%; +} + +.cvat-annotation-header-left-group > div { + padding: 0px; + width: 54px; + height: 54px; + float: left; + text-align: center; +} + +.cvat-annotation-header-left-group > div:first-child { + -webkit-filter: invert(0.9); + filter: invert(0.9); + background: white; + border-radius: 0px; + width: 70px; +} + +.cvat-annotation-header-left-group > div > * { + display: block; + line-height: 0px; +} + +.cvat-annotation-header-left-group > div > span { + font-size: 10px; +} + +.cvat-annotation-header-left-group > div > i { + -webkit-transform: scale(0.8); + -ms-transform: scale(0.8); + transform: scale(0.8); + padding: 3px; +} + +.cvat-annotation-header-left-group > div:hover > i { + -webkit-transform: scale(0.9); + -ms-transform: scale(0.9); + transform: scale(0.9); +} + +.cvat-annotation-header-left-group > div:active > i { + -webkit-transform: scale(0.8); + -ms-transform: scale(0.8); + transform: scale(0.8); +} + +.cvat-annotation-header-player-group > div { + height: 54px; +} + +.cvat-annotation-header-player-buttons { + display: -webkit-box; + display: -ms-flexbox; + display: flex; + -webkit-box-align: center; + -ms-flex-align: center; + align-items: center; + position: relative; + height: 100%; + margin-right: 10px; +} + +.cvat-annotation-header-player-buttons > i { + -webkit-transform: scale(0.6); + -ms-transform: scale(0.6); + transform: scale(0.6); +} + +.cvat-annotation-header-player-buttons > i:hover { + -webkit-transform: scale(0.7); + -ms-transform: scale(0.7); + transform: scale(0.7); +} + +.cvat-annotation-header-player-buttons > i:active { + -webkit-transform: scale(0.6); + -ms-transform: scale(0.6); + transform: scale(0.6); +} + +.cvat-annotation-header-player-controls { + position: relative; + height: 100%; + line-height: 27px; +} + +.cvat-annotation-header-player-controls > div { + position: relative; + height: 50%; +} + +.cvat-annotation-header-player-slider { + width: 350px; +} + +.cvat-annotation-header-player-slider > .ant-slider-rail { + background-color: #979797; +} + +.cvat-annotation-header-filename-wrapper { + max-width: 180px; + overflow: hidden; + -o-text-overflow: ellipsis; + text-overflow: ellipsis; +} + +.cvat-annotation-header-frame-selector { + width: 5em; + margin-right: 0.5em; +} + +.cvat-annotation-header-right-group { + height: 100%; +} + +.cvat-annotation-header-right-group > div { + height: 54px; + float: left; + text-align: center; + margin-right: 20px; +} + +.cvat-annotation-header-right-group > div:not(:nth-child(3)) > * { + display: block; + line-height: 0px; +} + +.cvat-annotation-header-right-group > div > span { + font-size: 10px; +} + +.cvat-annotation-header-right-group > div > i { + -webkit-transform: scale(0.8); + -ms-transform: scale(0.8); + transform: scale(0.8); + padding: 3px; +} + +.cvat-annotation-header-right-group > div:hover > i { + -webkit-transform: scale(0.9); + -ms-transform: scale(0.9); + transform: scale(0.9); +} + +.cvat-annotation-header-right-group > div:active > i { + -webkit-transform: scale(0.8); + -ms-transform: scale(0.8); + transform: scale(0.8); +} + +.cvat-annotation-header-workspace-selector { + width: 150px; +} + +.cvat-annotation-page-controls-sidebar { + background-color: #F1F1F1; + border-right: 1px solid #D7D7D7; +} + +.cvat-annotation-page-objects-sidebar { + background-color: #F1F1F1; + border-left: 1px solid #D7D7D7; +} + +.cvat-annotation-page-canvas-container { + background-color: white; +} + +.cvat-annotation-page-objects-sidebar { + top: 0px; + right: 0px; + left: auto; + background: white; +} + +.cvat-annotation-page-controls-sidebar > div > i { + border-radius: 3.3px; + -webkit-transform: scale(0.65); + -ms-transform: scale(0.65); + transform: scale(0.65); + padding: 2px; +} + +.cvat-annotation-page-controls-sidebar > div > i:hover { + background: #D8D8D8; + -webkit-transform: scale(0.75); + -ms-transform: scale(0.75); + transform: scale(0.75); +} + +.cvat-annotation-page-controls-sidebar > div > i:active { + background: #C3C3C3; +} + +.cvat-annotation-page-controls-sidebar > div > i > svg { + -webkit-transform: scale(0.8); + -ms-transform: scale(0.8); + transform: scale(0.8); +} diff --git a/cvat-ui/src/utils/git-utils.ts b/cvat-ui/src/utils/git-utils.ts new file mode 100644 index 000000000000..ccc402a8fe17 --- /dev/null +++ b/cvat-ui/src/utils/git-utils.ts @@ -0,0 +1,191 @@ +import getCore from '../core'; + +const core = getCore(); +const baseURL = core.config.backendAPI.slice(0, -7); + +interface GitPlugin { + name: string; + description: string; + cvat: { + classes: { + Task: { + prototype: { + save: { + leave: (plugin: GitPlugin, task: any) => Promise; + }; + }; + }; + }; + }; + data: { + task: any; + lfs: boolean; + repos: string; + }; + callbacks: { + onStatusChange: ((status: string) => void) | null; + }; +} + +interface ReposData { + url: string; + status: { + value: 'sync' | '!sync' | 'merged'; + error: string | null; + }; +} + +function waitForClone(cloneResponse: any): Promise { + return new Promise((resolve, reject): void => { + async function checkCallback(): Promise { + core.server.request( + `${baseURL}/git/repository/check/${cloneResponse.rq_id}`, + { + method: 'GET', + }, + ).then((response: any): void => { + if (['queued', 'started'].includes(response.status)) { + setTimeout(checkCallback, 1000); + } else if (response.status === 'finished') { + resolve(); + } else if (response.status === 'failed') { + let message = 'Repository status check failed. '; + if (response.stderr) { + message += response.stderr; + } + + reject(message); + } else { + const message = `Repository status check returned the status "${response.status}"`; + reject(message); + } + }).catch((error: any): void => { + const message = `Can not sent a request to clone the repository. ${error.toString()}`; + reject(message); + }); + } + + setTimeout(checkCallback, 1000); + }); +} + +async function cloneRepository( + this: any, + plugin: GitPlugin, + createdTask: any, +): Promise { + return new Promise((resolve, reject): any => { + if (typeof (this.id) !== 'undefined' || plugin.data.task !== this) { + // not the first save, we do not need to clone the repository + // or anchor set for another task + resolve(createdTask); + } else if (plugin.data.repos) { + if (plugin.callbacks.onStatusChange) { + plugin.callbacks.onStatusChange('The repository is being cloned..'); + } + + core.server.request(`${baseURL}/git/repository/create/${createdTask.id}`, { + method: 'POST', + headers: { + 'Content-type': 'application/json', + }, + data: JSON.stringify({ + path: plugin.data.repos, + lfs: plugin.data.lfs, + tid: createdTask.id, + }), + }).then(waitForClone).then((): void => { + resolve(createdTask); + }).catch((error: any): void => { + createdTask.delete().finally((): void => { + reject( + new core.exceptions.PluginError( + typeof (error) === 'string' + ? error : error.message, + ), + ); + }); + }); + } + }); +} + +export function registerGitPlugin(): void { + const plugin: GitPlugin = { + name: 'Git', + description: 'Plugin allows to work with git repositories', + cvat: { + classes: { + Task: { + prototype: { + save: { + leave: cloneRepository, + }, + }, + }, + }, + }, + data: { + task: null, + lfs: false, + repos: '', + }, + callbacks: { + onStatusChange: null, + }, + }; + + core.plugins.register(plugin); +} + +export async function getReposData(tid: number): Promise { + const response = await core.server.request( + `${baseURL}/git/repository/get/${tid}`, + { + method: 'GET', + }, + ); + + if (!response.url.value) { + return null; + } + + return { + url: response.url.value.split(/\s+/)[0], + status: { + value: response.status.value, + error: response.status.error, + }, + }; +} + +export function syncRepos(tid: number): Promise { + return new Promise((resolve, reject): void => { + core.server.request(`${baseURL}/git/repository/push/${tid}`, { + method: 'GET', + }).then((syncResponse: any): void => { + async function checkSync(): Promise { + const id = syncResponse.rq_id; + const response = await core.server.request(`${baseURL}/git/repository/check/${id}`, { + method: 'GET', + }); + + if (['queued', 'started'].includes(response.status)) { + setTimeout(checkSync, 1000); + } else if (response.status === 'finished') { + resolve(); + } else if (response.status === 'failed') { + const message = `Can not push to remote repository. Message: ${response.stderr}`; + throw new Error(message); + } else { + const message = `Check returned status "${response.status}".`; + throw new Error(message); + } + } + + setTimeout(checkSync, 1000); + }).catch((error: any): void => { + reject(error); + }); + }); +} diff --git a/cvat-ui/src/utils/plugin-checker.ts b/cvat-ui/src/utils/plugin-checker.ts index edda0593f3bb..0a31ef1a9d4e 100644 --- a/cvat-ui/src/utils/plugin-checker.ts +++ b/cvat-ui/src/utils/plugin-checker.ts @@ -7,35 +7,32 @@ const core = getCore(); class PluginChecker { public static async check(plugin: SupportedPlugins): Promise { const serverHost = core.config.backendAPI.slice(0, -7); + const isReachable = async (url: string, method: string): Promise => { + try { + await core.server.request(url, { + method, + }); + return true; + } catch (error) { + return ![0, 404].includes(error.code); + } + }; switch (plugin) { case SupportedPlugins.GIT_INTEGRATION: { - const response = await fetch(`${serverHost}/git/repository/meta/get`); - if (response.ok) { - return true; - } - return false; + return isReachable(`${serverHost}/git/repository/meta/get`, 'OPTIONS'); } case SupportedPlugins.AUTO_ANNOTATION: { - const response = await fetch(`${serverHost}/auto_annotation/meta/get`); - if (response.ok) { - return true; - } - return false; + return isReachable(`${serverHost}/auto_annotation/meta/get`, 'OPTIONS'); } case SupportedPlugins.TF_ANNOTATION: { - const response = await fetch(`${serverHost}/tensorflow/annotation/meta/get`); - if (response.ok) { - return true; - } - return false; + return isReachable(`${serverHost}/tensorflow/annotation/meta/get`, 'OPTIONS'); + } + case SupportedPlugins.TF_SEGMENTATION: { + return isReachable(`${serverHost}/tensorflow/segmentation/meta/get`, 'OPTIONS'); } case SupportedPlugins.ANALYTICS: { - const response = await fetch(`${serverHost}/analytics/app/kibana`); - if (response.ok) { - return true; - } - return false; + return isReachable(`${serverHost}/analytics/app/kibana`, 'GET'); } default: return false; diff --git a/cvat-ui/src/utils/validation-patterns.ts b/cvat-ui/src/utils/validation-patterns.ts index f3761ac596c2..ea77cf3547ff 100644 --- a/cvat-ui/src/utils/validation-patterns.ts +++ b/cvat-ui/src/utils/validation-patterns.ts @@ -52,9 +52,16 @@ const validationPatterns = { }, validateURL: { - pattern: /^(https?):\/\/[^\s$.?#].[^\s]*$/, + // eslint-disable-next-line + pattern: /^((https?:\/\/)|(git@))[^\s$.?#].[^\s]*$/, // url, ssh url, ip message: 'URL is not valid', }, + + validatePath: { + // eslint-disable-next-line + pattern: /^\[\/?([A-z0-9-_+]+\/)*([A-z0-9]+\.(xml|zip|json))\]$/, + message: 'Git path is not valid', + }, }; export default { ...validationPatterns }; diff --git a/cvat-ui/tsconfig.json b/cvat-ui/tsconfig.json index 751f771c43bf..a42613556342 100644 --- a/cvat-ui/tsconfig.json +++ b/cvat-ui/tsconfig.json @@ -20,6 +20,7 @@ "jsx": "preserve" }, "include": [ + "./index.d.ts", "src/index.tsx" ] } diff --git a/cvat-ui/webpack.config.js b/cvat-ui/webpack.config.js index ae5688976a17..0dcde962a173 100644 --- a/cvat-ui/webpack.config.js +++ b/cvat-ui/webpack.config.js @@ -52,6 +52,22 @@ module.exports = { }, { test: /\.(css|sass)$/, use: ['style-loader', 'css-loader'] + }, { + test: /\.svg$/, + exclude: /node_modules/, + use: ['babel-loader', + { + loader: 'react-svg-loader', + query: { + svgo: { + plugins: [ + { pretty: true, }, + { cleanupIDs: false, } + ], + }, + }, + } + ] }], }, plugins: [ @@ -59,7 +75,9 @@ module.exports = { template: "./src/index.html", inject: false, }), - new Dotenv(), + new Dotenv({ + systemvars: true, + }), ], node: { fs: 'empty' }, }; \ No newline at end of file diff --git a/cvat/apps/annotation/labelme.py b/cvat/apps/annotation/labelme.py new file mode 100644 index 000000000000..0128ca739226 --- /dev/null +++ b/cvat/apps/annotation/labelme.py @@ -0,0 +1,307 @@ +# Copyright (C) 2019 Intel Corporation +# +# SPDX-License-Identifier: MIT + +format_spec = { + "name": "LabelMe", + "dumpers": [ + { + "display_name": "{name} {format} {version} for images", + "format": "ZIP", + "version": "3.0", + "handler": "dump_as_labelme_annotation" + } + ], + "loaders": [ + { + "display_name": "{name} {format} {version}", + "format": "ZIP", + "version": "3.0", + "handler": "load", + } + ], +} + + +_DEFAULT_USERNAME = 'cvat' +_MASKS_DIR = 'Masks' + + +def dump_frame_anno(frame_annotation): + from collections import defaultdict + from lxml import etree as ET + + root_elem = ET.Element('annotation') + + ET.SubElement(root_elem, 'filename').text = frame_annotation.name + ET.SubElement(root_elem, 'folder').text = '' + + source_elem = ET.SubElement(root_elem, 'source') + ET.SubElement(source_elem, 'sourceImage').text = '' + ET.SubElement(source_elem, 'sourceAnnotation').text = 'CVAT' + + image_elem = ET.SubElement(root_elem, 'imagesize') + ET.SubElement(image_elem, 'nrows').text = str(frame_annotation.height) + ET.SubElement(image_elem, 'ncols').text = str(frame_annotation.width) + + groups = defaultdict(list) + + for obj_id, shape in enumerate(frame_annotation.labeled_shapes): + obj_elem = ET.SubElement(root_elem, 'object') + ET.SubElement(obj_elem, 'name').text = str(shape.label) + ET.SubElement(obj_elem, 'deleted').text = '0' + ET.SubElement(obj_elem, 'verified').text = '0' + ET.SubElement(obj_elem, 'occluded').text = \ + 'yes' if shape.occluded else 'no' + ET.SubElement(obj_elem, 'date').text = '' + ET.SubElement(obj_elem, 'id').text = str(obj_id) + + parts_elem = ET.SubElement(obj_elem, 'parts') + if shape.group: + groups[shape.group].append((obj_id, parts_elem)) + else: + ET.SubElement(parts_elem, 'hasparts').text = '' + ET.SubElement(parts_elem, 'ispartof').text = '' + + if shape.type == 'rectangle': + ET.SubElement(obj_elem, 'type').text = 'bounding_box' + + poly_elem = ET.SubElement(obj_elem, 'polygon') + x0, y0, x1, y1 = shape.points + points = [ (x0, y0), (x1, y0), (x1, y1), (x0, y1) ] + for x, y in points: + point_elem = ET.SubElement(poly_elem, 'pt') + ET.SubElement(point_elem, 'x').text = '%.2f' % x + ET.SubElement(point_elem, 'y').text = '%.2f' % y + + ET.SubElement(poly_elem, 'username').text = _DEFAULT_USERNAME + elif shape.type == 'polygon': + poly_elem = ET.SubElement(obj_elem, 'polygon') + for x, y in zip(shape.points[::2], shape.points[1::2]): + point_elem = ET.SubElement(poly_elem, 'pt') + ET.SubElement(point_elem, 'x').text = '%.2f' % x + ET.SubElement(point_elem, 'y').text = '%.2f' % y + + ET.SubElement(poly_elem, 'username').text = _DEFAULT_USERNAME + elif shape.type == 'polyline': + pass + elif shape.type == 'points': + pass + else: + raise NotImplementedError("Unknown shape type '%s'" % shape.type) + + attrs = ['%s=%s' % (a.name, a.value) for a in shape.attributes] + ET.SubElement(obj_elem, 'attributes').text = ', '.join(attrs) + + for _, group in groups.items(): + leader_id, leader_parts_elem = group[0] + leader_parts = [str(o_id) for o_id, _ in group[1:]] + ET.SubElement(leader_parts_elem, 'hasparts').text = \ + ','.join(leader_parts) + ET.SubElement(leader_parts_elem, 'ispartof').text = '' + + for obj_id, parts_elem in group[1:]: + ET.SubElement(parts_elem, 'hasparts').text = '' + ET.SubElement(parts_elem, 'ispartof').text = str(leader_id) + + return ET.tostring(root_elem, encoding='unicode', pretty_print=True) + +def dump_as_labelme_annotation(file_object, annotations): + from zipfile import ZipFile, ZIP_DEFLATED + + with ZipFile(file_object, 'w', compression=ZIP_DEFLATED) as output_zip: + for frame_annotation in annotations.group_by_frame(): + xml_data = dump_frame_anno(frame_annotation) + filename = frame_annotation.name + filename = filename[ : filename.rfind('.')] + '.xml' + output_zip.writestr(filename, xml_data) + +def parse_xml_annotations(xml_data, annotations, input_zip): + from cvat.apps.annotation.coco import mask_to_polygon + from io import BytesIO + from lxml import etree as ET + import numpy as np + import os.path as osp + from PIL import Image + + def parse_attributes(attributes_string): + parsed = [] + if not attributes_string: + return parsed + + read = attributes_string.split(',') + read = [a.strip() for a in read if a.strip()] + for attr in read: + if '=' in attr: + name, value = attr.split('=', maxsplit=1) + parsed.append(annotations.Attribute(name, value)) + else: + parsed.append(annotations.Attribute(attr, '1')) + + return parsed + + + root_elem = ET.fromstring(xml_data) + + frame_number = annotations.match_frame(root_elem.find('filename').text) + + parsed_annotations = dict() + group_assignments = dict() + root_annotations = set() + for obj_elem in root_elem.iter('object'): + obj_id = int(obj_elem.find('id').text) + + ann_items = [] + + attributes = [] + attributes_elem = obj_elem.find('attributes') + if attributes_elem is not None and attributes_elem.text: + attributes = parse_attributes(attributes_elem.text) + + occluded = False + occluded_elem = obj_elem.find('occluded') + if occluded_elem is not None and occluded_elem.text: + occluded = (occluded_elem.text == 'yes') + + deleted = False + deleted_elem = obj_elem.find('deleted') + if deleted_elem is not None and deleted_elem.text: + deleted = bool(int(deleted_elem.text)) + + poly_elem = obj_elem.find('polygon') + segm_elem = obj_elem.find('segm') + type_elem = obj_elem.find('type') # the only value is 'bounding_box' + if poly_elem is not None: + points = [] + for point_elem in poly_elem.iter('pt'): + x = float(point_elem.find('x').text) + y = float(point_elem.find('y').text) + points.append(x) + points.append(y) + label = obj_elem.find('name').text + if label and attributes: + label_id = annotations._get_label_id(label) + if label_id: + attributes = [a for a in attributes + if annotations._get_attribute_id(label_id, a.name) + ] + else: + attributes = [] + else: + attributes = [] + + if type_elem is not None and type_elem.text == 'bounding_box': + xmin = min(points[::2]) + xmax = max(points[::2]) + ymin = min(points[1::2]) + ymax = max(points[1::2]) + ann_items.append(annotations.LabeledShape( + type='rectangle', + frame=frame_number, + label=label, + points=[xmin, ymin, xmax, ymax], + occluded=occluded, + attributes=attributes, + )) + else: + ann_items.append(annotations.LabeledShape( + type='polygon', + frame=frame_number, + label=label, + points=points, + occluded=occluded, + attributes=attributes, + )) + elif segm_elem is not None: + label = obj_elem.find('name').text + if label and attributes: + label_id = annotations._get_label_id(label) + if label_id: + attributes = [a for a in attributes + if annotations._get_attribute_id(label_id, a.name) + ] + else: + attributes = [] + else: + attributes = [] + + mask_file = segm_elem.find('mask').text + mask = input_zip.read(osp.join(_MASKS_DIR, mask_file)) + mask = np.asarray(Image.open(BytesIO(mask)).convert('L')) + mask = (mask != 0) + polygons = mask_to_polygon(mask) + + for polygon in polygons: + ann_items.append(annotations.LabeledShape( + type='polygon', + frame=frame_number, + label=label, + points=polygon, + occluded=occluded, + attributes=attributes, + )) + + if not deleted: + parsed_annotations[obj_id] = ann_items + + parts_elem = obj_elem.find('parts') + if parts_elem is not None: + children_ids = [] + hasparts_elem = parts_elem.find('hasparts') + if hasparts_elem is not None and hasparts_elem.text: + children_ids = [int(c) for c in hasparts_elem.text.split(',')] + + parent_ids = [] + ispartof_elem = parts_elem.find('ispartof') + if ispartof_elem is not None and ispartof_elem.text: + parent_ids = [int(c) for c in ispartof_elem.text.split(',')] + + if children_ids and not parent_ids and hasparts_elem.text: + root_annotations.add(obj_id) + group_assignments[obj_id] = [None, children_ids] + + # assign a single group to the whole subtree + current_group_id = 0 + annotations_to_visit = list(root_annotations) + while annotations_to_visit: + ann_id = annotations_to_visit.pop() + ann_assignment = group_assignments[ann_id] + group_id, children_ids = ann_assignment + if group_id: + continue + + if ann_id in root_annotations: + current_group_id += 1 # start a new group + + group_id = current_group_id + ann_assignment[0] = group_id + + # continue with children + annotations_to_visit.extend(children_ids) + + assert current_group_id == len(root_annotations) + + for ann_id, ann_items in parsed_annotations.items(): + group_id = 0 + if ann_id in group_assignments: + ann_assignment = group_assignments[ann_id] + group_id = ann_assignment[0] + + for ann_item in ann_items: + if group_id: + ann_item = ann_item._replace(group=group_id) + if isinstance(ann_item, annotations.LabeledShape): + annotations.add_shape(ann_item) + else: + raise NotImplementedError() + +def load(file_object, annotations): + from zipfile import ZipFile + + with ZipFile(file_object, 'r') as input_zip: + for filename in input_zip.namelist(): + if not filename.endswith('.xml'): + continue + + xml_data = input_zip.read(filename) + parse_xml_annotations(xml_data, annotations, input_zip) diff --git a/cvat/apps/annotation/mot.py b/cvat/apps/annotation/mot.py new file mode 100644 index 000000000000..b7f63d1e79b0 --- /dev/null +++ b/cvat/apps/annotation/mot.py @@ -0,0 +1,109 @@ +# SPDX-License-Identifier: MIT +format_spec = { + "name": "MOT", + "dumpers": [ + { + "display_name": "{name} {format} {version}", + "format": "CSV", + "version": "1.0", + "handler": "dump" + }, + ], + "loaders": [ + { + "display_name": "{name} {format} {version}", + "format": "CSV", + "version": "1.0", + "handler": "load", + } + ], +} + + +MOT = [ + "frame_id", + "track_id", + "xtl", + "ytl", + "width", + "height", + "confidence", + "class_id", + "visibility" +] + + +def dump(file_object, annotations): + """ Export track shapes in MOT CSV format. Due to limitations of the MOT + format, this process only supports rectangular interpolation mode + annotations. + """ + import csv + import io + + # csv requires a text buffer + with io.TextIOWrapper(file_object, encoding="utf-8") as csv_file: + writer = csv.DictWriter(csv_file, fieldnames=MOT) + for i, track in enumerate(annotations.tracks): + for shape in track.shapes: + # MOT doesn't support polygons or 'outside' property + if shape.type != 'rectangle': + continue + writer.writerow({ + "frame_id": shape.frame, + "track_id": i, + "xtl": shape.points[0], + "ytl": shape.points[1], + "width": shape.points[2] - shape.points[0], + "height": shape.points[3] - shape.points[1], + "confidence": 1, + "class_id": track.label, + "visibility": 1 - int(shape.occluded) + }) + + +def load(file_object, annotations): + """ Read MOT CSV format and convert objects to annotated tracks. + """ + import csv + import io + tracks = {} + # csv requires a text buffer + with io.TextIOWrapper(file_object, encoding="utf-8") as csv_file: + reader = csv.DictReader(csv_file, fieldnames=MOT) + for row in reader: + # create one shape per row + xtl = float(row["xtl"]) + ytl = float(row["ytl"]) + xbr = xtl + float(row["width"]) + ybr = ytl + float(row["height"]) + shape = annotations.TrackedShape( + type="rectangle", + points=[xtl, ytl, xbr, ybr], + occluded=float(row["visibility"]) == 0, + outside=False, + keyframe=False, + z_order=0, + frame=int(row["frame_id"]), + attributes=[], + ) + # build trajectories as lists of shapes in track dict + track_id = int(row["track_id"]) + if track_id not in tracks: + tracks[track_id] = annotations.Track(row["class_id"], track_id, []) + tracks[track_id].shapes.append(shape) + for track in tracks.values(): + # Set outside=True for the last shape since MOT has no support + # for this flag + last = annotations.TrackedShape( + type=track.shapes[-1].type, + points=track.shapes[-1].points, + occluded=track.shapes[-1].occluded, + outside=True, + keyframe=track.shapes[-1].keyframe, + z_order=track.shapes[-1].z_order, + frame=track.shapes[-1].frame, + attributes=track.shapes[-1].attributes, + ) + track.shapes[-1] = last + annotations.add_track(track) diff --git a/cvat/apps/annotation/settings.py b/cvat/apps/annotation/settings.py index 0ac2a38c8ad4..e1e5f82b42c8 100644 --- a/cvat/apps/annotation/settings.py +++ b/cvat/apps/annotation/settings.py @@ -12,4 +12,6 @@ os.path.join(path_prefix, 'coco.py'), os.path.join(path_prefix, 'mask.py'), os.path.join(path_prefix, 'tfrecord.py'), + os.path.join(path_prefix, 'mot.py'), + os.path.join(path_prefix, 'labelme.py'), ) diff --git a/cvat/apps/authentication/auth.py b/cvat/apps/authentication/auth.py index 2f54558c62af..539707bbeca9 100644 --- a/cvat/apps/authentication/auth.py +++ b/cvat/apps/authentication/auth.py @@ -2,7 +2,6 @@ # # SPDX-License-Identifier: MIT -import os from django.conf import settings from django.db.models import Q import rules @@ -11,6 +10,20 @@ from rest_framework.permissions import BasePermission from django.core import signing from rest_framework import authentication, exceptions +from rest_framework.authentication import TokenAuthentication as _TokenAuthentication +from django.contrib.auth import login + +# Even with token authorization it is very important to have a valid session id +# in cookies because in some cases we cannot use token authorization (e.g. when +# we redirect to the server in UI using just URL). To overkill that we override +# the class to call `login` method which restores the session id in cookies. +class TokenAuthentication(_TokenAuthentication): + def authenticate(self, request): + auth = super().authenticate(request) + session = getattr(request, 'session') + if auth is not None and session.session_key is None: + login(request, auth[0], 'django.contrib.auth.backends.ModelBackend') + return auth def register_signals(): from django.db.models.signals import post_migrate, post_save diff --git a/cvat/apps/authentication/decorators.py b/cvat/apps/authentication/decorators.py index dc0b107fee90..569b13520fef 100644 --- a/cvat/apps/authentication/decorators.py +++ b/cvat/apps/authentication/decorators.py @@ -1,15 +1,14 @@ -# Copyright (C) 2018 Intel Corporation +# Copyright (C) 2018-2019 Intel Corporation # # SPDX-License-Identifier: MIT from functools import wraps -from urllib.parse import urlparse +from django.views.generic import RedirectView from django.contrib.auth import REDIRECT_FIELD_NAME -from django.shortcuts import resolve_url, reverse from django.http import JsonResponse -from django.contrib.auth.views import redirect_to_login from django.conf import settings +from cvat.apps.authentication.auth import TokenAuthentication def login_required(function=None, redirect_field_name=REDIRECT_FIELD_NAME, login_url=None, redirect_methods=['GET']): @@ -19,19 +18,19 @@ def _wrapped_view(request, *args, **kwargs): if request.user.is_authenticated: return view_func(request, *args, **kwargs) else: - if request.method not in redirect_methods: - return JsonResponse({'login_page_url': reverse('login')}, status=403) + tokenAuth = TokenAuthentication() + auth = tokenAuth.authenticate(request) + if auth is not None: + return view_func(request, *args, **kwargs) - path = request.build_absolute_uri() - resolved_login_url = resolve_url(login_url or settings.LOGIN_URL) - # If the login url is the same scheme and net location then just - # use the path as the "next" url. - login_scheme, login_netloc = urlparse(resolved_login_url)[:2] - current_scheme, current_netloc = urlparse(path)[:2] - if ((not login_scheme or login_scheme == current_scheme) and - (not login_netloc or login_netloc == current_netloc)): - path = request.get_full_path() + login_url = '{}/login'.format(settings.UI_URL) + if request.method not in redirect_methods: + return JsonResponse({'login_page_url': login_url}, status=403) - return redirect_to_login(path, resolved_login_url, redirect_field_name) + return RedirectView.as_view( + url=login_url, + permanent=True, + query_string=True + )(request) return _wrapped_view return decorator(function) if function else decorator diff --git a/cvat/apps/auto_annotation/__init__.py b/cvat/apps/auto_annotation/__init__.py index d6d5de7d62e5..c929093f7019 100644 --- a/cvat/apps/auto_annotation/__init__.py +++ b/cvat/apps/auto_annotation/__init__.py @@ -1,12 +1,6 @@ -# Copyright (C) 2018 Intel Corporation +# Copyright (C) 2018-2019 Intel Corporation # # SPDX-License-Identifier: MIT -from cvat.settings.base import JS_3RDPARTY, CSS_3RDPARTY - default_app_config = 'cvat.apps.auto_annotation.apps.AutoAnnotationConfig' - -JS_3RDPARTY['dashboard'] = JS_3RDPARTY.get('dashboard', []) + ['auto_annotation/js/dashboardPlugin.js'] - -CSS_3RDPARTY['dashboard'] = CSS_3RDPARTY.get('dashboard', []) + ['auto_annotation/stylesheet.css'] diff --git a/cvat/apps/auto_annotation/model_loader.py b/cvat/apps/auto_annotation/model_loader.py index 15a7c792efeb..cb923a9cadaa 100644 --- a/cvat/apps/auto_annotation/model_loader.py +++ b/cvat/apps/auto_annotation/model_loader.py @@ -1,12 +1,11 @@ -# Copyright (C) 2018 Intel Corporation +# Copyright (C) 2018-2019 Intel Corporation # # SPDX-License-Identifier: MIT import json import cv2 import os -import subprocess import numpy as np from cvat.apps.auto_annotation.inference_engine import make_plugin, make_network diff --git a/cvat/apps/auto_annotation/model_manager.py b/cvat/apps/auto_annotation/model_manager.py index b98b94b99f90..ebed3e77fd76 100644 --- a/cvat/apps/auto_annotation/model_manager.py +++ b/cvat/apps/auto_annotation/model_manager.py @@ -1,4 +1,4 @@ -# Copyright (C) 2018 Intel Corporation +# Copyright (C) 2018-2019 Intel Corporation # # SPDX-License-Identifier: MIT @@ -9,7 +9,6 @@ import rq import shutil import tempfile -import itertools from django.db import transaction from django.utils import timezone @@ -23,12 +22,11 @@ from cvat.apps.engine.frame_provider import FrameProvider from .models import AnnotationModel, FrameworkChoice -from .model_loader import ModelLoader, load_labelmap +from .model_loader import load_labelmap from .image_loader import ImageLoader from .inference import run_inference_engine_annotation - def _remove_old_file(model_file_field): if model_file_field and os.path.exists(model_file_field.name): os.remove(model_file_field.name) diff --git a/cvat/apps/auto_annotation/views.py b/cvat/apps/auto_annotation/views.py index e13ed2c0766f..c521424dfde9 100644 --- a/cvat/apps/auto_annotation/views.py +++ b/cvat/apps/auto_annotation/views.py @@ -7,6 +7,7 @@ import os from django.http import HttpResponse, JsonResponse, HttpResponseBadRequest +from rest_framework.decorators import api_view from django.db.models import Q from rules.contrib.views import permission_required, objectgetter @@ -124,10 +125,11 @@ def delete_model(request, mid): model_manager.delete(mid) return HttpResponse() +@api_view(['POST']) @login_required def get_meta_info(request): try: - tids = json.loads(request.body.decode('utf-8')) + tids = request.data response = { "admin": has_admin_role(request.user), "models": [], @@ -147,6 +149,7 @@ def get_meta_info(request): "uploadDate": dl_model.created_date, "updateDate": dl_model.updated_date, "labels": labels, + "owner": dl_model.owner.id, }) queue = django_rq.get_queue("low") diff --git a/cvat/apps/auto_segmentation/__init__.py b/cvat/apps/auto_segmentation/__init__.py index 8494b54e563e..a0fca4cb39ea 100644 --- a/cvat/apps/auto_segmentation/__init__.py +++ b/cvat/apps/auto_segmentation/__init__.py @@ -1,9 +1,4 @@ -# Copyright (C) 2018 Intel Corporation +# Copyright (C) 2018-2019 Intel Corporation # # SPDX-License-Identifier: MIT - -from cvat.settings.base import JS_3RDPARTY - -JS_3RDPARTY['dashboard'] = JS_3RDPARTY.get('dashboard', []) + ['auto_segmentation/js/dashboardPlugin.js'] - diff --git a/cvat/apps/auto_segmentation/views.py b/cvat/apps/auto_segmentation/views.py index 7b41ab50304f..0f73ee29229f 100644 --- a/cvat/apps/auto_segmentation/views.py +++ b/cvat/apps/auto_segmentation/views.py @@ -1,9 +1,11 @@ -# Copyright (C) 2018 Intel Corporation +# Copyright (C) 2018-2019 Intel Corporation # # SPDX-License-Identifier: MIT + from django.http import HttpResponse, JsonResponse, HttpResponseBadRequest +from rest_framework.decorators import api_view from rules.contrib.views import permission_required, objectgetter from cvat.apps.authentication.decorators import login_required from cvat.apps.engine.models import Task as TaskModel @@ -185,14 +187,15 @@ def create_thread(tid, labels_mapping, user): try: slogger.task[tid].exception('exception was occured during auto segmentation of the task', exc_info=True) except Exception: - slogger.glob.exception('exception was occured during auto segmentation of the task {}'.format(tid), exc_into=True) + slogger.glob.exception('exception was occured during auto segmentation of the task {}'.format(tid), exc_info=True) raise ex +@api_view(['POST']) @login_required def get_meta_info(request): try: queue = django_rq.get_queue('low') - tids = json.loads(request.body.decode('utf-8')) + tids = request.data result = {} for tid in tids: job = queue.fetch_job('auto_segmentation.create/{}'.format(tid)) @@ -204,7 +207,7 @@ def get_meta_info(request): return JsonResponse(result) except Exception as ex: - slogger.glob.exception('exception was occured during tf meta request', exc_into=True) + slogger.glob.exception('exception was occured during tf meta request', exc_info=True) return HttpResponseBadRequest(str(ex)) diff --git a/cvat/apps/dataset_manager/__init__.py b/cvat/apps/dataset_manager/__init__.py new file mode 100644 index 000000000000..e69de29bb2d1 diff --git a/cvat/apps/dataset_manager/bindings.py b/cvat/apps/dataset_manager/bindings.py new file mode 100644 index 000000000000..cc758fd06517 --- /dev/null +++ b/cvat/apps/dataset_manager/bindings.py @@ -0,0 +1,176 @@ +from collections import OrderedDict +import os +import os.path as osp + +from django.db import transaction + +from cvat.apps.annotation.annotation import Annotation +from cvat.apps.engine.annotation import TaskAnnotation +from cvat.apps.engine.models import Task, ShapeType + +import datumaro.components.extractor as datumaro +from datumaro.util.image import lazy_image + + +class CvatImagesDirExtractor(datumaro.Extractor): + _SUPPORTED_FORMATS = ['.png', '.jpg'] + + def __init__(self, url): + super().__init__() + + items = [] + for (dirpath, _, filenames) in os.walk(url): + for name in filenames: + path = osp.join(dirpath, name) + if self._is_image(path): + item_id = Task.get_image_frame(path) + item = datumaro.DatasetItem( + id=item_id, image=lazy_image(path)) + items.append((item.id, item)) + + items = sorted(items, key=lambda e: int(e[0])) + items = OrderedDict(items) + self._items = items + + self._subsets = None + + def __iter__(self): + for item in self._items.values(): + yield item + + def __len__(self): + return len(self._items) + + def subsets(self): + return self._subsets + + def get(self, item_id, subset=None, path=None): + if path or subset: + raise KeyError() + return self._items[item_id] + + def _is_image(self, path): + for ext in self._SUPPORTED_FORMATS: + if osp.isfile(path) and path.endswith(ext): + return True + return False + + +class CvatTaskExtractor(datumaro.Extractor): + def __init__(self, url, db_task, user): + self._db_task = db_task + self._categories = self._load_categories() + + cvat_annotations = TaskAnnotation(db_task.id, user) + with transaction.atomic(): + cvat_annotations.init_from_db() + cvat_annotations = Annotation(cvat_annotations.ir_data, db_task) + + dm_annotations = [] + + for cvat_anno in cvat_annotations.group_by_frame(): + dm_anno = self._read_cvat_anno(cvat_anno) + dm_item = datumaro.DatasetItem( + id=cvat_anno.frame, annotations=dm_anno) + dm_annotations.append((dm_item.id, dm_item)) + + dm_annotations = sorted(dm_annotations, key=lambda e: int(e[0])) + self._items = OrderedDict(dm_annotations) + + self._subsets = None + + def __iter__(self): + for item in self._items.values(): + yield item + + def __len__(self): + return len(self._items) + + def subsets(self): + return self._subsets + + def get(self, item_id, subset=None, path=None): + if path or subset: + raise KeyError() + return self._items[item_id] + + def _load_categories(self): + categories = {} + label_categories = datumaro.LabelCategories() + + db_labels = self._db_task.label_set.all() + for db_label in db_labels: + db_attributes = db_label.attributespec_set.all() + label_categories.add(db_label.name) + + for db_attr in db_attributes: + label_categories.attributes.add(db_attr.name) + + categories[datumaro.AnnotationType.label] = label_categories + + return categories + + def categories(self): + return self._categories + + def _read_cvat_anno(self, cvat_anno): + item_anno = [] + + categories = self.categories() + label_cat = categories[datumaro.AnnotationType.label] + + label_map = {} + label_attrs = {} + db_labels = self._db_task.label_set.all() + for db_label in db_labels: + label_map[db_label.name] = label_cat.find(db_label.name)[0] + + attrs = {} + db_attributes = db_label.attributespec_set.all() + for db_attr in db_attributes: + attrs[db_attr.name] = db_attr.default_value + label_attrs[db_label.name] = attrs + map_label = lambda label_db_name: label_map[label_db_name] + + for tag_obj in cvat_anno.tags: + anno_group = tag_obj.group + if isinstance(anno_group, int): + anno_group = anno_group + anno_label = map_label(tag_obj.label) + anno_attr = dict(label_attrs[tag_obj.label]) + for attr in tag_obj.attributes: + anno_attr[attr.name] = attr.value + + anno = datumaro.LabelObject(label=anno_label, + attributes=anno_attr, group=anno_group) + item_anno.append(anno) + + for shape_obj in cvat_anno.labeled_shapes: + anno_group = shape_obj.group + if isinstance(anno_group, int): + anno_group = anno_group + anno_label = map_label(shape_obj.label) + anno_attr = dict(label_attrs[shape_obj.label]) + for attr in shape_obj.attributes: + anno_attr[attr.name] = attr.value + + anno_points = shape_obj.points + if shape_obj.type == ShapeType.POINTS: + anno = datumaro.PointsObject(anno_points, + label=anno_label, attributes=anno_attr, group=anno_group) + elif shape_obj.type == ShapeType.POLYLINE: + anno = datumaro.PolyLineObject(anno_points, + label=anno_label, attributes=anno_attr, group=anno_group) + elif shape_obj.type == ShapeType.POLYGON: + anno = datumaro.PolygonObject(anno_points, + label=anno_label, attributes=anno_attr, group=anno_group) + elif shape_obj.type == ShapeType.RECTANGLE: + x0, y0, x1, y1 = anno_points + anno = datumaro.BboxObject(x0, y0, x1 - x0, y1 - y0, + label=anno_label, attributes=anno_attr, group=anno_group) + else: + raise Exception("Unknown shape type '%s'" % (shape_obj.type)) + + item_anno.append(anno) + + return item_anno \ No newline at end of file diff --git a/cvat/apps/dataset_manager/export_templates/README.md b/cvat/apps/dataset_manager/export_templates/README.md new file mode 100644 index 000000000000..82067fa24c0a --- /dev/null +++ b/cvat/apps/dataset_manager/export_templates/README.md @@ -0,0 +1,22 @@ +# Quick start + +``` bash +# optionally make a virtualenv +python -m virtualenv .venv +. .venv/bin/activate + +# install dependencies +sed -r "s/^(.*)#.*$/\1/g" datumaro/requirements.txt | xargs -n 1 -L 1 pip install +pip install -r cvat/utils/cli/requirements.txt + +# set up environment +PYTHONPATH=':' +export PYTHONPATH +ln -s $PWD/datumaro/datum.py ./datum +chmod a+x datum + +# use Datumaro +./datum --help +``` + +Check Datumaro [QUICKSTART.md](datumaro/docs/quickstart.md) for further info. diff --git a/cvat/apps/dataset_manager/export_templates/extractors/cvat_rest_api_task_images.py b/cvat/apps/dataset_manager/export_templates/extractors/cvat_rest_api_task_images.py new file mode 100644 index 000000000000..28baafadc5e1 --- /dev/null +++ b/cvat/apps/dataset_manager/export_templates/extractors/cvat_rest_api_task_images.py @@ -0,0 +1,125 @@ +from collections import OrderedDict +import getpass +import json +import os, os.path as osp +import requests + +from datumaro.components.config import (Config, + SchemaBuilder as _SchemaBuilder, +) +import datumaro.components.extractor as datumaro +from datumaro.util.image import lazy_image, load_image + +from cvat.utils.cli.core import CLI as CVAT_CLI, CVAT_API_V1 + + +CONFIG_SCHEMA = _SchemaBuilder() \ + .add('task_id', int) \ + .add('server_host', str) \ + .add('server_port', int) \ + .build() + +DEFAULT_CONFIG = Config({ + 'server_port': 80 +}, schema=CONFIG_SCHEMA, mutable=False) + +class cvat_rest_api_task_images(datumaro.Extractor): + def _image_local_path(self, item_id): + task_id = self._config.task_id + return osp.join(self._cache_dir, + 'task_{}_frame_{:06d}.jpg'.format(task_id, item_id)) + + def _make_image_loader(self, item_id): + return lazy_image(item_id, + lambda item_id: self._image_loader(item_id, self)) + + def _is_image_cached(self, item_id): + return osp.isfile(self._image_local_path(item_id)) + + def _download_image(self, item_id): + self._connect() + os.makedirs(self._cache_dir, exist_ok=True) + self._cvat_cli.tasks_frame(task_id=self._config.task_id, + frame_ids=[item_id], outdir=self._cache_dir) + + def _connect(self): + if self._session is not None: + return + + session = None + try: + print("Enter credentials for '%s:%s':" % \ + (self._config.server_host, self._config.server_port)) + username = input('User: ') + password = getpass.getpass() + + session = requests.Session() + session.auth = (username, password) + + api = CVAT_API_V1(self._config.server_host, + self._config.server_port) + cli = CVAT_CLI(session, api) + + self._session = session + self._cvat_cli = cli + except Exception: + if session is not None: + session.close() + + def __del__(self): + if hasattr(self, '_session'): + if self._session is not None: + self._session.close() + + @staticmethod + def _image_loader(item_id, extractor): + if not extractor._is_image_cached(item_id): + extractor._download_image(item_id) + local_path = extractor._image_local_path(item_id) + return load_image(local_path) + + def __init__(self, url): + super().__init__() + + local_dir = url + self._local_dir = local_dir + self._cache_dir = osp.join(local_dir, 'images') + + with open(osp.join(url, 'config.json'), 'r') as config_file: + config = json.load(config_file) + config = Config(config, + fallback=DEFAULT_CONFIG, schema=CONFIG_SCHEMA) + self._config = config + + with open(osp.join(url, 'images_meta.json'), 'r') as images_file: + images_meta = json.load(images_file) + image_list = images_meta['images'] + + items = [] + for entry in image_list: + item_id = entry['id'] + item = datumaro.DatasetItem( + id=item_id, image=self._make_image_loader(item_id)) + items.append((item.id, item)) + + items = sorted(items, key=lambda e: int(e[0])) + items = OrderedDict(items) + self._items = items + + self._cvat_cli = None + self._session = None + + def __iter__(self): + for item in self._items.values(): + yield item + + def __len__(self): + return len(self._items) + + def subsets(self): + return None + + def get(self, item_id, subset=None, path=None): + if path or subset: + raise KeyError() + return self._items[item_id] diff --git a/cvat/apps/dataset_manager/task.py b/cvat/apps/dataset_manager/task.py new file mode 100644 index 000000000000..8103dab40976 --- /dev/null +++ b/cvat/apps/dataset_manager/task.py @@ -0,0 +1,416 @@ +from datetime import timedelta +import json +import os +import os.path as osp +import shutil +import sys +import tempfile + +from django.utils import timezone +import django_rq + +from cvat.apps.engine.log import slogger +from cvat.apps.engine.models import Task, ShapeType +from .util import current_function_name, make_zip_archive + +_CVAT_ROOT_DIR = __file__[:__file__.rfind('cvat/')] +_DATUMARO_REPO_PATH = osp.join(_CVAT_ROOT_DIR, 'datumaro') +sys.path.append(_DATUMARO_REPO_PATH) +from datumaro.components.project import Project +import datumaro.components.extractor as datumaro +from .bindings import CvatImagesDirExtractor, CvatTaskExtractor + + +_MODULE_NAME = __package__ + '.' + osp.splitext(osp.basename(__file__))[0] +def log_exception(logger=None, exc_info=True): + if logger is None: + logger = slogger + logger.exception("[%s @ %s]: exception occurred" % \ + (_MODULE_NAME, current_function_name(2)), + exc_info=exc_info) + +_TASK_IMAGES_EXTRACTOR = '_cvat_task_images' +_TASK_ANNO_EXTRACTOR = '_cvat_task_anno' +_TASK_IMAGES_REMOTE_EXTRACTOR = 'cvat_rest_api_task_images' + +def get_export_cache_dir(db_task): + return osp.join(db_task.get_task_dirname(), 'export_cache') + +EXPORT_FORMAT_DATUMARO_PROJECT = "datumaro_project" + + +class TaskProject: + @staticmethod + def _get_datumaro_project_dir(db_task): + return osp.join(db_task.get_task_dirname(), 'datumaro') + + @staticmethod + def create(db_task): + task_project = TaskProject(db_task) + task_project._create() + return task_project + + @staticmethod + def load(db_task): + task_project = TaskProject(db_task) + task_project._load() + task_project._init_dataset() + return task_project + + @staticmethod + def from_task(db_task, user): + task_project = TaskProject(db_task) + task_project._import_from_task(user) + return task_project + + def __init__(self, db_task): + self._db_task = db_task + self._project_dir = self._get_datumaro_project_dir(db_task) + self._project = None + self._dataset = None + + def _create(self): + self._project = Project.generate(self._project_dir) + self._project.add_source('task_%s' % self._db_task.id, { + 'url': self._db_task.get_data_dirname(), + 'format': _TASK_IMAGES_EXTRACTOR, + }) + self._project.env.extractors.register(_TASK_IMAGES_EXTRACTOR, + CvatImagesDirExtractor) + + self._init_dataset() + self._dataset.define_categories(self._generate_categories()) + + self.save() + + def _load(self): + self._project = Project.load(self._project_dir) + self._project.env.extractors.register(_TASK_IMAGES_EXTRACTOR, + CvatImagesDirExtractor) + + def _import_from_task(self, user): + self._project = Project.generate(self._project_dir) + + self._project.add_source('task_%s_images' % self._db_task.id, { + 'url': self._db_task.get_data_dirname(), + 'format': _TASK_IMAGES_EXTRACTOR, + }) + self._project.env.extractors.register(_TASK_IMAGES_EXTRACTOR, + CvatImagesDirExtractor) + + self._project.add_source('task_%s_anno' % self._db_task.id, { + 'format': _TASK_ANNO_EXTRACTOR, + }) + self._project.env.extractors.register(_TASK_ANNO_EXTRACTOR, + lambda url: CvatTaskExtractor(url, + db_task=self._db_task, user=user)) + + self._init_dataset() + + def _init_dataset(self): + self._dataset = self._project.make_dataset() + + def _generate_categories(self): + categories = {} + label_categories = datumaro.LabelCategories() + + db_labels = self._db_task.label_set.all() + for db_label in db_labels: + db_attributes = db_label.attributespec_set.all() + label_categories.add(db_label.name) + + for db_attr in db_attributes: + label_categories.attributes.add(db_attr.name) + + categories[datumaro.AnnotationType.label] = label_categories + + return categories + + def put_annotations(self, annotations): + patch = {} + + categories = self._dataset.categories() + label_cat = categories[datumaro.AnnotationType.label] + + label_map = {} + attr_map = {} + db_labels = self._db_task.label_set.all() + for db_label in db_labels: + label_map[db_label.id] = label_cat.find(db_label.name) + + db_attributes = db_label.attributespec_set.all() + for db_attr in db_attributes: + attr_map[(db_label.id, db_attr.id)] = db_attr.name + map_label = lambda label_db_id: label_map[label_db_id] + map_attr = lambda label_db_id, attr_db_id: \ + attr_map[(label_db_id, attr_db_id)] + + for tag_obj in annotations['tags']: + item_id = str(tag_obj['frame']) + item_anno = patch.get(item_id, []) + + anno_group = tag_obj['group'] + if isinstance(anno_group, int): + anno_group = [anno_group] + anno_label = map_label(tag_obj['label_id']) + anno_attr = {} + for attr in tag_obj['attributes']: + attr_name = map_attr(tag_obj['label_id'], attr['id']) + anno_attr[attr_name] = attr['value'] + + anno = datumaro.LabelObject(label=anno_label, + attributes=anno_attr, group=anno_group) + item_anno.append(anno) + + patch[item_id] = item_anno + + for shape_obj in annotations['shapes']: + item_id = str(shape_obj['frame']) + item_anno = patch.get(item_id, []) + + anno_group = shape_obj['group'] + if isinstance(anno_group, int): + anno_group = [anno_group] + anno_label = map_label(shape_obj['label_id']) + anno_attr = {} + for attr in shape_obj['attributes']: + attr_name = map_attr(shape_obj['label_id'], attr['id']) + anno_attr[attr_name] = attr['value'] + + anno_points = shape_obj['points'] + if shape_obj['type'] == ShapeType.POINTS: + anno = datumaro.PointsObject(anno_points, + label=anno_label, attributes=anno_attr, group=anno_group) + elif shape_obj['type'] == ShapeType.POLYLINE: + anno = datumaro.PolyLineObject(anno_points, + label=anno_label, attributes=anno_attr, group=anno_group) + elif shape_obj['type'] == ShapeType.POLYGON: + anno = datumaro.PolygonObject(anno_points, + label=anno_label, attributes=anno_attr, group=anno_group) + elif shape_obj['type'] == ShapeType.RECTANGLE: + x0, y0, x1, y1 = anno_points + anno = datumaro.BboxObject(x0, y0, x1 - x0, y1 - y0, + label=anno_label, attributes=anno_attr, group=anno_group) + else: + raise Exception("Unknown shape type '%s'" % (shape_obj['type'])) + + item_anno.append(anno) + + patch[item_id] = item_anno + + # TODO: support track annotations + + patch = [datumaro.DatasetItem(id=id_, annotations=anno) \ + for id_, ann in patch.items()] + + self._dataset.update(patch) + + def save(self, save_dir=None, save_images=False): + if self._dataset is not None: + self._dataset.save(save_dir=save_dir, save_images=save_images) + else: + self._project.save(save_dir=save_dir) + + def export(self, dst_format, save_dir, save_images=False, server_url=None): + if self._dataset is None: + self._init_dataset() + if dst_format == EXPORT_FORMAT_DATUMARO_PROJECT: + self._remote_export(save_dir=save_dir, server_url=server_url) + else: + self._dataset.export(output_format=dst_format, + save_dir=save_dir, save_images=save_images) + + def _remote_image_converter(self, save_dir, server_url=None): + os.makedirs(save_dir, exist_ok=True) + + db_task = self._db_task + items = [] + config = { + 'server_host': 'localhost', + 'task_id': db_task.id, + } + if server_url: + if ':' in server_url: + host, port = server_url.rsplit(':', maxsplit=1) + else: + host = server_url + port = None + config['server_host'] = host + if port is not None: + config['server_port'] = int(port) + + images_meta = { + 'images': items, + } + db_video = getattr(self._db_task, 'video', None) + if db_video is not None: + for i in range(self._db_task.size): + frame_info = { + 'id': str(i), + 'width': db_video.width, + 'height': db_video.height, + } + items.append(frame_info) + else: + for db_image in self._db_task.image_set.all(): + frame_info = { + 'id': db_image.frame, + 'width': db_image.width, + 'height': db_image.height, + } + items.append(frame_info) + + with open(osp.join(save_dir, 'config.json'), 'w') as config_file: + json.dump(config, config_file) + with open(osp.join(save_dir, 'images_meta.json'), 'w') as images_file: + json.dump(images_meta, images_file) + + def _remote_export(self, save_dir, server_url=None): + if self._dataset is None: + self._init_dataset() + + os.makedirs(save_dir, exist_ok=True) + self._dataset.save(save_dir=save_dir, save_images=False, merge=True) + + exported_project = Project.load(save_dir) + source_name = 'task_%s_images' % self._db_task.id + exported_project.add_source(source_name, { + 'format': _TASK_IMAGES_REMOTE_EXTRACTOR, + }) + self._remote_image_converter( + osp.join(save_dir, exported_project.local_source_dir(source_name)), + server_url=server_url) + exported_project.save() + + + templates_dir = osp.join(osp.dirname(__file__), 'export_templates') + target_dir = exported_project.config.project_dir + os.makedirs(target_dir, exist_ok=True) + shutil.copyfile( + osp.join(templates_dir, 'README.md'), + osp.join(target_dir, 'README.md')) + + templates_dir = osp.join(templates_dir, 'extractors') + target_dir = osp.join(target_dir, + exported_project.config.env_dir, + exported_project.env.config.extractors_dir) + os.makedirs(target_dir, exist_ok=True) + shutil.copyfile( + osp.join(templates_dir, _TASK_IMAGES_REMOTE_EXTRACTOR + '.py'), + osp.join(target_dir, _TASK_IMAGES_REMOTE_EXTRACTOR + '.py')) + + # NOTE: put datumaro component to the archive so that + # it was available to the user + shutil.copytree(_DATUMARO_REPO_PATH, osp.join(save_dir, 'datumaro'), + ignore=lambda src, names: ['__pycache__'] + [ + n for n in names + if sum([int(n.endswith(ext)) for ext in + ['.pyx', '.pyo', '.pyd', '.pyc']]) + ]) + + # include CVAT CLI module also + cvat_utils_dst_dir = osp.join(save_dir, 'cvat', 'utils') + os.makedirs(cvat_utils_dst_dir) + shutil.copytree(osp.join(_CVAT_ROOT_DIR, 'utils', 'cli'), + osp.join(cvat_utils_dst_dir, 'cli')) + + +DEFAULT_FORMAT = EXPORT_FORMAT_DATUMARO_PROJECT +DEFAULT_CACHE_TTL = timedelta(hours=10) +CACHE_TTL = DEFAULT_CACHE_TTL + +def export_project(task_id, user, dst_format=None, server_url=None): + try: + db_task = Task.objects.get(pk=task_id) + + if not dst_format: + dst_format = DEFAULT_FORMAT + + cache_dir = get_export_cache_dir(db_task) + save_dir = osp.join(cache_dir, dst_format) + archive_path = osp.normpath(save_dir) + '.zip' + + task_time = timezone.localtime(db_task.updated_date).timestamp() + if not (osp.exists(archive_path) and \ + task_time <= osp.getmtime(archive_path)): + os.makedirs(cache_dir, exist_ok=True) + with tempfile.TemporaryDirectory( + dir=cache_dir, prefix=dst_format + '_') as temp_dir: + project = TaskProject.from_task(db_task, user) + project.export(dst_format, save_dir=temp_dir, save_images=True, + server_url=server_url) + + os.makedirs(cache_dir, exist_ok=True) + make_zip_archive(temp_dir, archive_path) + + archive_ctime = osp.getctime(archive_path) + scheduler = django_rq.get_scheduler() + cleaning_job = scheduler.enqueue_in(time_delta=CACHE_TTL, + func=clear_export_cache, + task_id=task_id, + file_path=archive_path, file_ctime=archive_ctime) + slogger.task[task_id].info( + "The task '{}' is exported as '{}' " + "and available for downloading for next '{}'. " + "Export cache cleaning job is enqueued, " + "id '{}', start in '{}'".format( + db_task.name, dst_format, CACHE_TTL, + cleaning_job.id, CACHE_TTL)) + + return archive_path + except Exception: + log_exception(slogger.task[task_id]) + raise + +def clear_export_cache(task_id, file_path, file_ctime): + try: + if osp.exists(file_path) and osp.getctime(file_path) == file_ctime: + os.remove(file_path) + slogger.task[task_id].info( + "Export cache file '{}' successfully removed" \ + .format(file_path)) + except Exception: + log_exception(slogger.task[task_id]) + raise + + +EXPORT_FORMATS = [ + { + 'name': 'Datumaro', + 'tag': EXPORT_FORMAT_DATUMARO_PROJECT, + 'is_default': True, + }, + { + 'name': 'PASCAL VOC 2012', + 'tag': 'voc', + 'is_default': False, + }, + { + 'name': 'MS COCO', + 'tag': 'coco', + 'is_default': False, + }, + { + 'name': 'YOLO', + 'tag': 'yolo', + 'is_default': False, + }, + { + 'name': 'TF Detection API TFrecord', + 'tag': 'tf_detection_api', + 'is_default': False, + }, +] + +def get_export_formats(): + from datumaro.components import converters + + available_formats = set(name for name, _ in converters.items) + available_formats.add(EXPORT_FORMAT_DATUMARO_PROJECT) + + public_formats = [] + for fmt in EXPORT_FORMATS: + if fmt['tag'] in available_formats: + public_formats.append(fmt) + + return public_formats \ No newline at end of file diff --git a/cvat/apps/dataset_manager/util.py b/cvat/apps/dataset_manager/util.py new file mode 100644 index 000000000000..8ad9aabcf05b --- /dev/null +++ b/cvat/apps/dataset_manager/util.py @@ -0,0 +1,15 @@ +import inspect +import os, os.path as osp +import zipfile + + +def current_function_name(depth=1): + return inspect.getouterframes(inspect.currentframe())[depth].function + + +def make_zip_archive(src_path, dst_path): + with zipfile.ZipFile(dst_path, 'w') as archive: + for (dirpath, _, filenames) in os.walk(src_path): + for name in filenames: + path = osp.join(dirpath, name) + archive.write(path, osp.relpath(path, src_path)) diff --git a/cvat/apps/documentation/__init__.py b/cvat/apps/documentation/__init__.py index 743392981f00..a0fca4cb39ea 100644 --- a/cvat/apps/documentation/__init__.py +++ b/cvat/apps/documentation/__init__.py @@ -1,8 +1,4 @@ -# Copyright (C) 2018 Intel Corporation +# Copyright (C) 2018-2019 Intel Corporation # # SPDX-License-Identifier: MIT - -from cvat.settings.base import JS_3RDPARTY - -JS_3RDPARTY['dashboard'] = JS_3RDPARTY.get('dashboard', []) + ['documentation/js/dashboardPlugin.js'] diff --git a/cvat/apps/engine/pagination.py b/cvat/apps/engine/pagination.py new file mode 100644 index 000000000000..e18eeaf2ecd7 --- /dev/null +++ b/cvat/apps/engine/pagination.py @@ -0,0 +1,22 @@ +# Copyright (C) 2019 Intel Corporation +# +# SPDX-License-Identifier: MIT + +import sys +from rest_framework.pagination import PageNumberPagination + +class CustomPagination(PageNumberPagination): + page_size_query_param = "page_size" + + def get_page_size(self, request): + page_size = 0 + try: + value = request.query_params[self.page_size_query_param] + if value == "all": + page_size = sys.maxsize + else: + page_size = int(value) + except (KeyError, ValueError): + pass + + return page_size if page_size > 0 else self.page_size diff --git a/cvat/apps/engine/static/engine/js/annotationUI.js b/cvat/apps/engine/static/engine/js/annotationUI.js index 4a6fdac22007..839b021590bb 100644 --- a/cvat/apps/engine/static/engine/js/annotationUI.js +++ b/cvat/apps/engine/static/engine/js/annotationUI.js @@ -384,6 +384,13 @@ function setupMenu(job, task, shapeCollectionModel, $('#settingsWindow').removeClass('hidden'); }); + $('#openTaskButton').on('click', () => { + const win = window.open( + `${window.UI_URL}/tasks/${window.cvat.job.task_id}`, '_blank' + ); + win.focus(); + }); + $('#settingsButton').attr('title', ` ${shortkeys.open_settings.view_value} - ${shortkeys.open_settings.description}`); diff --git a/cvat/apps/engine/static/engine/js/cvat-core.min.js b/cvat/apps/engine/static/engine/js/cvat-core.min.js index 09502e7a62e8..682942b5be31 100644 --- a/cvat/apps/engine/static/engine/js/cvat-core.min.js +++ b/cvat/apps/engine/static/engine/js/cvat-core.min.js @@ -1,15 +1,15 @@ -window.cvat=function(t){var e={};function n(r){if(e[r])return e[r].exports;var o=e[r]={i:r,l:!1,exports:{}};return t[r].call(o.exports,o,o.exports,n),o.l=!0,o.exports}return n.m=t,n.c=e,n.d=function(t,e,r){n.o(t,e)||Object.defineProperty(t,e,{enumerable:!0,get:r})},n.r=function(t){"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(t,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(t,"__esModule",{value:!0})},n.t=function(t,e){if(1&e&&(t=n(t)),8&e)return t;if(4&e&&"object"==typeof t&&t&&t.__esModule)return t;var r=Object.create(null);if(n.r(r),Object.defineProperty(r,"default",{enumerable:!0,value:t}),2&e&&"string"!=typeof t)for(var o in t)n.d(r,o,function(e){return t[e]}.bind(null,o));return r},n.n=function(t){var e=t&&t.__esModule?function(){return t.default}:function(){return t};return n.d(e,"a",e),e},n.o=function(t,e){return Object.prototype.hasOwnProperty.call(t,e)},n.p="",n(n.s=140)}([function(t,e,n){(function(e){var n=function(t){return t&&t.Math==Math&&t};t.exports=n("object"==typeof globalThis&&globalThis)||n("object"==typeof window&&window)||n("object"==typeof self&&self)||n("object"==typeof e&&e)||Function("return this")()}).call(this,n(30))},function(t,e,n){(function(e){var n=function(t){return t&&t.Math==Math&&t};t.exports=n("object"==typeof globalThis&&globalThis)||n("object"==typeof window&&window)||n("object"==typeof self&&self)||n("object"==typeof e&&e)||Function("return this")()}).call(this,n(30))},function(t,e,n){var r=n(0),o=n(44),i=n(88),s=n(147),a=r.Symbol,c=o("wks");t.exports=function(t){return c[t]||(c[t]=s&&a[t]||(s?a:i)("Symbol."+t))}},function(t,e){t.exports=function(t){try{return!!t()}catch(t){return!0}}},function(t,e,n){var r=n(14);t.exports=function(t){if(!r(t))throw TypeError(String(t)+" is not an object");return t}},function(t,e,n){"use strict";var r=n(43),o=n(156),i=n(35),s=n(25),a=n(106),c=s.set,u=s.getterFor("Array Iterator");t.exports=a(Array,"Array",(function(t,e){c(this,{type:"Array Iterator",target:r(t),index:0,kind:e})}),(function(){var t=u(this),e=t.target,n=t.kind,r=t.index++;return!e||r>=e.length?(t.target=void 0,{value:void 0,done:!0}):"keys"==n?{value:r,done:!1}:"values"==n?{value:e[r],done:!1}:{value:[r,e[r]],done:!1}}),"values"),i.Arguments=i.Array,o("keys"),o("values"),o("entries")},function(t,e,n){n(11),(()=>{const e=n(161),r=n(163),o=n(66);class i extends Error{constructor(t){super(t);const n=(new Date).toISOString(),i=e.os.toString(),s=`${e.name} ${e.version}`,a=r.parse(this)[0],c=`${a.fileName}`,u=a.lineNumber,l=a.columnNumber,{jobID:f,taskID:p,clientID:h}=o;Object.defineProperties(this,Object.freeze({system:{get:()=>i},client:{get:()=>s},time:{get:()=>n},jobID:{get:()=>f},taskID:{get:()=>p},projID:{get:()=>void 0},clientID:{get:()=>h},filename:{get:()=>c},line:{get:()=>u},column:{get:()=>l}}))}async save(){const t={system:this.system,client:this.client,time:this.time,job_id:this.jobID,task_id:this.taskID,proj_id:this.projID,client_id:this.clientID,message:this.message,filename:this.filename,line:this.line,column:this.column,stack:this.stack};try{const e=n(26);await e.server.exception(t)}catch(t){}}}t.exports={Exception:i,ArgumentError:class extends i{constructor(t){super(t)}},DataError:class extends i{constructor(t){super(t)}},ScriptingError:class extends i{constructor(t){super(t)}},PluginError:class extends i{constructor(t){super(t)}},ServerError:class extends i{constructor(t,e){super(t),Object.defineProperties(this,Object.freeze({code:{get:()=>e}}))}}}})()},function(t,e,n){"use strict";var r=n(111),o=n(184),i=Object.prototype.toString;function s(t){return"[object Array]"===i.call(t)}function a(t){return null!==t&&"object"==typeof t}function c(t){return"[object Function]"===i.call(t)}function u(t,e){if(null!=t)if("object"!=typeof t&&(t=[t]),s(t))for(var n=0,r=t.length;ns;){var a,c,u,l=r[s++],f=i?l.ok:l.fail,p=l.resolve,h=l.reject,d=l.domain;try{f?(i||(2===e.rejection&&et(t,e),e.rejection=1),!0===f?a=o:(d&&d.enter(),a=f(o),d&&(d.exit(),u=!0)),a===l.promise?h(D("Promise-chain cycle")):(c=K(a))?c.call(a,p,h):p(a)):h(o)}catch(t){d&&!u&&d.exit(),h(t)}}e.reactions=[],e.notified=!1,n&&!e.rejection&&Q(t,e)}))}},Y=function(t,e,n){var r,o;V?((r=B.createEvent("Event")).promise=e,r.reason=n,r.initEvent(t,!1,!0),u.dispatchEvent(r)):r={promise:e,reason:n},(o=u["on"+t])?o(r):"unhandledrejection"===t&&_("Unhandled promise rejection",n)},Q=function(t,e){O.call(u,(function(){var n,r=e.value;if(tt(e)&&(n=T((function(){J?U.emit("unhandledRejection",r,t):Y("unhandledrejection",t,r)})),e.rejection=J||tt(e)?2:1,n.error))throw n.value}))},tt=function(t){return 1!==t.rejection&&!t.parent},et=function(t,e){O.call(u,(function(){J?U.emit("rejectionHandled",t):Y("rejectionhandled",t,e.value)}))},nt=function(t,e,n,r){return function(o){t(e,n,o,r)}},rt=function(t,e,n,r){e.done||(e.done=!0,r&&(e=r),e.value=n,e.state=2,Z(t,e,!0))},ot=function(t,e,n,r){if(!e.done){e.done=!0,r&&(e=r);try{if(t===n)throw D("Promise can't be resolved itself");var o=K(n);o?j((function(){var r={done:!1};try{o.call(n,nt(ot,t,r,e),nt(rt,t,r,e))}catch(n){rt(t,r,n,e)}})):(e.value=n,e.state=1,Z(t,e,!1))}catch(n){rt(t,{done:!1},n,e)}}};H&&($=function(t){v(this,$,F),g(t),r.call(this);var e=M(this);try{t(nt(ot,this,e),nt(rt,this,e))}catch(t){rt(this,e,t)}},(r=function(t){N(this,{type:F,done:!1,notified:!1,parent:!1,reactions:[],rejection:!1,state:0,value:void 0})}).prototype=h($.prototype,{then:function(t,e){var n=R(this),r=G(x(this,$));return r.ok="function"!=typeof t||t,r.fail="function"==typeof e&&e,r.domain=J?U.domain:void 0,n.parent=!0,n.reactions.push(r),0!=n.state&&Z(this,n,!1),r.promise},catch:function(t){return this.then(void 0,t)}}),o=function(){var t=new r,e=M(t);this.promise=t,this.resolve=nt(ot,t,e),this.reject=nt(rt,t,e)},A.f=G=function(t){return t===$||t===i?new o(t):W(t)},c||"function"!=typeof f||(s=f.prototype.then,p(f.prototype,"then",(function(t,e){var n=this;return new $((function(t,e){s.call(n,t,e)})).then(t,e)}),{unsafe:!0}),"function"==typeof L&&a({global:!0,enumerable:!0,forced:!0},{fetch:function(t){return S($,L.apply(u,arguments))}}))),a({global:!0,wrap:!0,forced:H},{Promise:$}),d($,F,!1,!0),m(F),i=l.Promise,a({target:F,stat:!0,forced:H},{reject:function(t){var e=G(this);return e.reject.call(void 0,t),e.promise}}),a({target:F,stat:!0,forced:c||H},{resolve:function(t){return S(c&&this===i?$:this,t)}}),a({target:F,stat:!0,forced:X},{all:function(t){var e=this,n=G(e),r=n.resolve,o=n.reject,i=T((function(){var n=g(e.resolve),i=[],s=0,a=1;w(t,(function(t){var c=s++,u=!1;i.push(void 0),a++,n.call(e,t).then((function(t){u||(u=!0,i[c]=t,--a||r(i))}),o)})),--a||r(i)}));return i.error&&o(i.value),n.promise},race:function(t){var e=this,n=G(e),r=n.reject,o=T((function(){var o=g(e.resolve);w(t,(function(t){o.call(e,t).then(n.resolve,r)}))}));return o.error&&r(o.value),n.promise}})},function(t,e,n){var r=n(0),o=n(57).f,i=n(15),s=n(18),a=n(60),c=n(89),u=n(93);t.exports=function(t,e){var n,l,f,p,h,d=t.target,m=t.global,b=t.stat;if(n=m?r:b?r[d]||a(d,{}):(r[d]||{}).prototype)for(l in e){if(p=e[l],f=t.noTargetGet?(h=o(n,l))&&h.value:n[l],!u(m?l:d+(b?".":"#")+l,t.forced)&&void 0!==f){if(typeof p==typeof f)continue;c(p,f)}(t.sham||f&&f.sham)&&i(p,"sham",!0),s(n,l,p,t)}}},function(t,e,n){var r=n(3);t.exports=!r((function(){return 7!=Object.defineProperty({},"a",{get:function(){return 7}}).a}))},function(t,e){t.exports=function(t){return"object"==typeof t?null!==t:"function"==typeof t}},function(t,e,n){var r=n(13),o=n(21),i=n(42);t.exports=r?function(t,e,n){return o.f(t,e,i(1,n))}:function(t,e,n){return t[e]=n,t}},function(t,e){t.exports=function(t){try{return!!t()}catch(t){return!0}}},function(t,e,n){var r=n(22);t.exports=function(t){if(!r(t))throw TypeError(String(t)+" is not an object");return t}},function(t,e,n){var r=n(0),o=n(44),i=n(15),s=n(9),a=n(60),c=n(87),u=n(25),l=u.get,f=u.enforce,p=String(c).split("toString");o("inspectSource",(function(t){return c.call(t)})),(t.exports=function(t,e,n,o){var c=!!o&&!!o.unsafe,u=!!o&&!!o.enumerable,l=!!o&&!!o.noTargetGet;"function"==typeof n&&("string"!=typeof e||s(n,"name")||i(n,"name",e),f(n).source=p.join("string"==typeof e?e:"")),t!==r?(c?!l&&t[e]&&(u=!0):delete t[e],u?t[e]=n:i(t,e,n)):u?t[e]=n:a(e,n)})(Function.prototype,"toString",(function(){return"function"==typeof this&&l(this).source||c.call(this)}))},function(t,e,n){var r=n(28),o=n(39),i=n(75);t.exports=r?function(t,e,n){return o.f(t,e,i(1,n))}:function(t,e,n){return t[e]=n,t}},function(t,e){var n={}.hasOwnProperty;t.exports=function(t,e){return n.call(t,e)}},function(t,e,n){var r=n(13),o=n(86),i=n(4),s=n(58),a=Object.defineProperty;e.f=r?a:function(t,e,n){if(i(t),e=s(e,!0),i(n),o)try{return a(t,e,n)}catch(t){}if("get"in n||"set"in n)throw TypeError("Accessors not supported");return"value"in n&&(t[e]=n.value),t}},function(t,e){t.exports=function(t){return"object"==typeof t?null!==t:"function"==typeof t}},function(t,e){var n={}.toString;t.exports=function(t){return n.call(t).slice(8,-1)}},function(t,e){t.exports=!1},function(t,e,n){var r,o,i,s=n(142),a=n(0),c=n(14),u=n(15),l=n(9),f=n(61),p=n(62),h=a.WeakMap;if(s){var d=new h,m=d.get,b=d.has,g=d.set;r=function(t,e){return g.call(d,t,e),e},o=function(t){return m.call(d,t)||{}},i=function(t){return b.call(d,t)}}else{var v=f("state");p[v]=!0,r=function(t,e){return u(t,v,e),e},o=function(t){return l(t,v)?t[v]:{}},i=function(t){return l(t,v)}}t.exports={set:r,get:o,has:i,enforce:function(t){return i(t)?o(t):r(t,{})},getterFor:function(t){return function(e){var n;if(!c(e)||(n=o(e)).type!==t)throw TypeError("Incompatible receiver, "+t+" required");return n}}}},function(t,e,n){n(11),n(165),(()=>{const e=n(170),{ServerError:r}=n(6),o=n(171),i=n(66);function s(t,e){if(t.response){const n=`${e}. `+`${t.message}. ${JSON.stringify(t.response.data)||""}.`;return new r(n,t.response.status)}const n=`${e}. `+`${t.message}.`;return new r(n,0)}const a=new class{constructor(){const a=n(182);a.defaults.withCredentials=!0,a.defaults.xsrfHeaderName="X-CSRFTOKEN",a.defaults.xsrfCookieName="csrftoken";let c=o.get("token");async function u(t=""){const{backendAPI:e}=i;let n=null;try{n=await a.get(`${e}/tasks?${t}`,{proxy:i.proxy})}catch(t){throw s(t,"Could not get tasks from a server")}return n.data.results.count=n.data.count,n.data.results}async function l(t){const{backendAPI:e}=i;try{await a.delete(`${e}/tasks/${t}`)}catch(t){throw s(t,"Could not delete the task from the server")}}c&&(a.defaults.headers.common.Authorization=`Token ${c}`),Object.defineProperties(this,Object.freeze({server:{value:Object.freeze({about:async function(){const{backendAPI:t}=i;let e=null;try{e=await a.get(`${t}/server/about`,{proxy:i.proxy})}catch(t){throw s(t,'Could not get "about" information from the server')}return e.data},share:async function(t){const{backendAPI:e}=i;t=encodeURIComponent(t);let n=null;try{n=await a.get(`${e}/server/share?directory=${t}`,{proxy:i.proxy})}catch(t){throw s(t,'Could not get "share" information from the server')}return n.data},formats:async function(){const{backendAPI:t}=i;let e=null;try{e=await a.get(`${t}/server/annotation/formats`,{proxy:i.proxy})}catch(t){throw s(t,"Could not get annotation formats from the server")}return e.data},exception:async function(t){const{backendAPI:e}=i;try{await a.post(`${e}/server/exception`,JSON.stringify(t),{proxy:i.proxy,headers:{"Content-Type":"application/json"}})}catch(t){throw s(t,"Could not send an exception to the server")}},login:async function(t,e){const n=[`${encodeURIComponent("username")}=${encodeURIComponent(t)}`,`${encodeURIComponent("password")}=${encodeURIComponent(e)}`].join("&").replace(/%20/g,"+");let r=null;try{r=await a.post(`${i.backendAPI}/auth/login`,n,{proxy:i.proxy})}catch(t){throw s(t,"Could not login on a server")}if(r.headers["set-cookie"]){const t=r.headers["set-cookie"].join(";");a.defaults.headers.common.Cookie=t}c=r.data.key,o.set("token",c),a.defaults.headers.common.Authorization=`Token ${c}`},logout:async function(){try{await a.post(`${i.backendAPI}/auth/logout`,{proxy:i.proxy})}catch(t){throw s(t,"Could not logout from the server")}o.remove("token"),a.defaults.headers.common.Authorization=""},authorized:async function(){try{await t.exports.users.getSelf()}catch(t){if(401===t.code)return!1;throw t}return!0},register:async function(t,e,n,r,o,c){let u=null;try{const s=JSON.stringify({username:t,first_name:e,last_name:n,email:r,password1:o,password2:c});u=await a.post(`${i.backendAPI}/auth/register`,s,{proxy:i.proxy,headers:{"Content-Type":"application/json"}})}catch(e){throw s(e,`Could not register '${t}' user on the server`)}return u.data}}),writable:!1},tasks:{value:Object.freeze({getTasks:u,saveTask:async function(t,e){const{backendAPI:n}=i;try{await a.patch(`${n}/tasks/${t}`,JSON.stringify(e),{proxy:i.proxy,headers:{"Content-Type":"application/json"}})}catch(t){throw s(t,"Could not save the task on the server")}},createTask:async function(t,n,o){const{backendAPI:c}=i,f=new e;for(const t in n)if(Object.prototype.hasOwnProperty.call(n,t))if(Array.isArray(n[t]))for(let e=0;e{setTimeout((async function i(){try{const s=await a.get(`${c}/tasks/${t}/status`);if(["Queued","Started"].includes(s.data.state))""!==s.data.message&&o(s.data.message),setTimeout(i,1e3);else if("Finished"===s.data.state)e();else if("Failed"===s.data.state){const t="Could not create the task on the server. "+`${s.data.message}.`;n(new r(t,400))}else n(new r(`Unknown task state has been received: ${s.data.state}`,500))}catch(t){n(s(t,"Could not put task to the server"))}}),1e3)})}(p.data.id)}catch(t){throw await l(p.data.id),t}return(await u(`?id=${p.id}`))[0]},deleteTask:l}),writable:!1},jobs:{value:Object.freeze({getJob:async function(t){const{backendAPI:e}=i;let n=null;try{n=await a.get(`${e}/jobs/${t}`,{proxy:i.proxy})}catch(t){throw s(t,"Could not get jobs from a server")}return n.data},saveJob:async function(t,e){const{backendAPI:n}=i;try{await a.patch(`${n}/jobs/${t}`,JSON.stringify(e),{proxy:i.proxy,headers:{"Content-Type":"application/json"}})}catch(t){throw s(t,"Could not save the job on the server")}}}),writable:!1},users:{value:Object.freeze({getUsers:async function(t=null){const{backendAPI:e}=i;let n=null;try{n=null===t?await a.get(`${e}/users`,{proxy:i.proxy}):await a.get(`${e}/users/${t}`,{proxy:i.proxy})}catch(t){throw s(t,"Could not get users from the server")}return n.data.results},getSelf:async function(){const{backendAPI:t}=i;let e=null;try{e=await a.get(`${t}/users/self`,{proxy:i.proxy})}catch(t){throw s(t,"Could not get user data from the server")}return e.data}}),writable:!1},frames:{value:Object.freeze({getData:async function(t,e){const{backendAPI:n}=i;let r=null;try{r=await a.get(`${n}/tasks/${t}/data?type=chunk&number=${e}&quality=compressed`,{proxy:i.proxy,responseType:"arraybuffer"})}catch(n){throw s(n,`Could not get chunk ${e} for the task ${t} from the server`)}return r.data},getMeta:async function(t){const{backendAPI:e}=i;let n=null;try{n=await a.get(`${e}/tasks/${t}/data/meta`,{proxy:i.proxy})}catch(e){throw s(e,`Could not get frame meta info for the task ${t} from the server`)}return n.data},getPreview:async function(t){const{backendAPI:e}=i;let n=null;try{n=await a.get(`${e}/tasks/${t}/data?type=preview`,{proxy:i.proxy,responseType:"blob"})}catch(e){const n=e.response?e.response.status:e.code;throw new r(`Could not get preview frame for the task ${t} from the server`,n)}return n.data}}),writable:!1},annotations:{value:Object.freeze({updateAnnotations:async function(t,e,n,r){const{backendAPI:o}=i;let c=null,u=null;"PUT"===r.toUpperCase()?(c=a.put.bind(a),u=`${o}/${t}s/${e}/annotations`):(c=a.patch.bind(a),u=`${o}/${t}s/${e}/annotations?action=${r}`);let l=null;try{l=await c(u,JSON.stringify(n),{proxy:i.proxy,headers:{"Content-Type":"application/json"}})}catch(n){throw s(n,`Could not ${r} annotations for the ${t} ${e} on the server`)}return l.data},getAnnotations:async function(t,e){const{backendAPI:n}=i;let r=null;try{r=await a.get(`${n}/${t}s/${e}/annotations`,{proxy:i.proxy})}catch(n){throw s(n,`Could not get annotations for the ${t} ${e} from the server`)}return r.data},dumpAnnotations:async function(t,e,n){const{backendAPI:r}=i,o=e.replace(/\//g,"_");let c=`${r}/tasks/${t}/annotations/${o}?format=${n}`;return new Promise((e,n)=>{setTimeout((async function r(){try{202===(await a.get(`${c}`,{proxy:i.proxy})).status?setTimeout(r,3e3):e(c=`${c}&action=download`)}catch(e){n(s(e,`Could not dump annotations for the task ${t} from the server`))}}))})},uploadAnnotations:async function(t,n,r,o){const{backendAPI:c}=i;let u=new e;return u.append("annotation_file",r),new Promise((r,l)=>{setTimeout((async function f(){try{202===(await a.put(`${c}/${t}s/${n}/annotations?format=${o}`,u,{proxy:i.proxy})).status?(u=new e,setTimeout(f,3e3)):r()}catch(e){l(s(e,`Could not upload annotations for the ${t} ${n}`))}}))})}}),writable:!1}}))}};t.exports=a})()},function(t,e,n){(function(e){var n=Object.assign?Object.assign:function(t,e,n,r){for(var o=1;o{const e=Object.freeze({DIR:"DIR",REG:"REG"}),n=Object.freeze({ANNOTATION:"annotation",VALIDATION:"validation",COMPLETED:"completed"}),r=Object.freeze({ANNOTATION:"annotation",INTERPOLATION:"interpolation"}),o=Object.freeze({CHECKBOX:"checkbox",RADIO:"radio",SELECT:"select",NUMBER:"number",TEXT:"text"}),i=Object.freeze({TAG:"tag",SHAPE:"shape",TRACK:"track"}),s=Object.freeze({RECTANGLE:"rectangle",POLYGON:"polygon",POLYLINE:"polyline",POINTS:"points"}),a=Object.freeze({ALL:"all",SHAPE:"shape",NONE:"none"});t.exports={ShareFileType:e,TaskStatus:n,TaskMode:r,AttributeType:o,ObjectType:i,ObjectShape:s,VisibleState:a,LogType:{pasteObject:0,changeAttribute:1,dragObject:2,deleteObject:3,pressShortcut:4,resizeObject:5,sendLogs:6,saveJob:7,jumpFrame:8,drawObject:9,changeLabel:10,sendTaskInfo:11,loadJob:12,moveImage:13,zoomImage:14,lockObject:15,mergeObjects:16,copyObject:17,propagateObject:18,undoAction:19,redoAction:20,sendUserActivity:21,sendException:22,changeFrame:23,debugInfo:24,fitImage:25,rotateImage:26}}})()},function(t,e){var n;n=function(){return this}();try{n=n||new Function("return this")()}catch(t){"object"==typeof window&&(n=window)}t.exports=n},function(t,e){t.exports=function(t){if(null==t)throw TypeError("Can't call method on "+t);return t}},function(t,e,n){var r=n(90),o=n(0),i=function(t){return"function"==typeof t?t:void 0};t.exports=function(t,e){return arguments.length<2?i(r[t])||i(o[t]):r[t]&&r[t][e]||o[t]&&o[t][e]}},function(t,e,n){var r=n(21).f,o=n(9),i=n(2)("toStringTag");t.exports=function(t,e,n){t&&!o(t=n?t:t.prototype,i)&&r(t,i,{configurable:!0,value:e})}},function(t,e){t.exports=function(t){if("function"!=typeof t)throw TypeError(String(t)+" is not a function");return t}},function(t,e){t.exports={}},function(t,e,n){n(155),n(5),n(11),n(10),(()=>{const{PluginError:e}=n(6),r=[];class o{static async apiWrapper(t,...n){const r=await o.list();for(const o of r){const r=o.functions.filter(e=>e.callback===t)[0];if(r&&r.enter)try{await r.enter.call(this,o,...n)}catch(t){throw t instanceof e?t:new e(`Exception in plugin ${o.name}: ${t.toString()}`)}}let i=await t.implementation.call(this,...n);for(const o of r){const r=o.functions.filter(e=>e.callback===t)[0];if(r&&r.leave)try{i=await r.leave.call(this,o,i,...n)}catch(t){throw t instanceof e?t:new e(`Exception in plugin ${o.name}: ${t.toString()}`)}}return i}static async register(t){const n=[];if("object"!=typeof t)throw new e(`Plugin should be an object, but got "${typeof t}"`);if(!("name"in t)||"string"!=typeof t.name)throw new e('Plugin must contain a "name" field and it must be a string');if(!("description"in t)||"string"!=typeof t.description)throw new e('Plugin must contain a "description" field and it must be a string');if("functions"in t)throw new e('Plugin must not contain a "functions" field');!function t(e,r){const o={};for(const n in e)Object.prototype.hasOwnProperty.call(e,n)&&("object"==typeof e[n]?Object.prototype.hasOwnProperty.call(r,n)&&t(e[n],r[n]):["enter","leave"].includes(n)&&"function"==typeof r&&(e[n],1)&&(o.callback=r,o[n]=e[n]));Object.keys(o).length&&n.push(o)}(t,{cvat:this}),Object.defineProperty(t,"functions",{value:n,writable:!1}),r.push(t)}static async list(){return r}}t.exports=o})()},function(t,e,n){var r=n(31);t.exports=function(t){return Object(r(t))}},function(t,e){var n={}.toString;t.exports=function(t){return n.call(t).slice(8,-1)}},function(t,e,n){var r=n(28),o=n(120),i=n(17),s=n(121),a=Object.defineProperty;e.f=r?a:function(t,e,n){if(i(t),e=s(e,!0),i(n),o)try{return a(t,e,n)}catch(t){}if("get"in n||"set"in n)throw TypeError("Accessors not supported");return"value"in n&&(t[e]=n.value),t}},function(t,e){t.exports={}},function(t,e){t.exports=function(t){if("function"!=typeof t)throw TypeError(String(t)+" is not a function");return t}},function(t,e){t.exports=function(t,e){return{enumerable:!(1&t),configurable:!(2&t),writable:!(4&t),value:e}}},function(t,e,n){var r=n(85),o=n(31);t.exports=function(t){return r(o(t))}},function(t,e,n){var r=n(24),o=n(141);(t.exports=function(t,e){return o[t]||(o[t]=void 0!==e?e:{})})("versions",[]).push({version:"3.3.3",mode:r?"pure":"global",copyright:"© 2019 Denis Pushkarev (zloirock.ru)"})},function(t,e,n){var r=n(46),o=Math.min;t.exports=function(t){return t>0?o(r(t),9007199254740991):0}},function(t,e){var n=Math.ceil,r=Math.floor;t.exports=function(t){return isNaN(t=+t)?0:(t>0?r:n)(t)}},function(t,e,n){var r=n(34);t.exports=function(t,e,n){if(r(t),void 0===e)return t;switch(n){case 0:return function(){return t.call(e)};case 1:return function(n){return t.call(e,n)};case 2:return function(n,r){return t.call(e,n,r)};case 3:return function(n,r,o){return t.call(e,n,r,o)}}return function(){return t.apply(e,arguments)}}},function(t,e,n){var r=n(150),o=n(35),i=n(2)("iterator");t.exports=function(t){if(null!=t)return t[i]||t["@@iterator"]||o[r(t)]}},function(t,e,n){n(5),n(11),n(200),n(10),n(71),(()=>{const e=n(36),r=n(26),{getFrame:o,getRanges:i,getPreview:s}=n(203),{ArgumentError:a}=n(6),{TaskStatus:c}=n(29),{Label:u}=n(55),l=n(69);function f(t){Object.defineProperties(t,{annotations:Object.freeze({value:{async upload(n,r){return await e.apiWrapper.call(this,t.annotations.upload,n,r)},async save(){return await e.apiWrapper.call(this,t.annotations.save)},async clear(n=!1){return await e.apiWrapper.call(this,t.annotations.clear,n)},async dump(n,r){return await e.apiWrapper.call(this,t.annotations.dump,n,r)},async statistics(){return await e.apiWrapper.call(this,t.annotations.statistics)},async put(n=[]){return await e.apiWrapper.call(this,t.annotations.put,n)},async get(n,r={}){return await e.apiWrapper.call(this,t.annotations.get,n,r)},async search(n,r,o){return await e.apiWrapper.call(this,t.annotations.search,n,r,o)},async select(n,r,o){return await e.apiWrapper.call(this,t.annotations.select,n,r,o)},async hasUnsavedChanges(){return await e.apiWrapper.call(this,t.annotations.hasUnsavedChanges)},async merge(n){return await e.apiWrapper.call(this,t.annotations.merge,n)},async split(n,r){return await e.apiWrapper.call(this,t.annotations.split,n,r)},async group(n,r=!1){return await e.apiWrapper.call(this,t.annotations.group,n,r)}},writable:!0}),frames:Object.freeze({value:{async get(n){return await e.apiWrapper.call(this,t.frames.get,n)},async ranges(){return await e.apiWrapper.call(this,t.frames.ranges)},async preview(){return await e.apiWrapper.call(this,t.frames.preview)}},writable:!0}),logs:Object.freeze({value:{async put(n,r){return await e.apiWrapper.call(this,t.logs.put,n,r)},async save(n){return await e.apiWrapper.call(this,t.logs.save,n)}},writable:!0}),actions:Object.freeze({value:{async undo(n){return await e.apiWrapper.call(this,t.actions.undo,n)},async redo(n){return await e.apiWrapper.call(this,t.actions.redo,n)},async clear(){return await e.apiWrapper.call(this,t.actions.clear)}},writable:!0}),events:Object.freeze({value:{async subscribe(n,r){return await e.apiWrapper.call(this,t.events.subscribe,n,r)},async unsubscribe(n,r=null){return await e.apiWrapper.call(this,t.events.unsubscribe,n,r)}},writable:!0})})}class p{constructor(){}}class h extends p{constructor(t){super();const e={id:void 0,assignee:void 0,status:void 0,start_frame:void 0,stop_frame:void 0,task:void 0};for(const n in e)if(Object.prototype.hasOwnProperty.call(e,n)&&(n in t&&(e[n]=t[n]),void 0===e[n]))throw new a(`Job field "${n}" was not initialized`);Object.defineProperties(this,Object.freeze({id:{get:()=>e.id},assignee:{get:()=>e.assignee,set:t=>{if(null!==t&&!(t instanceof l))throw new a("Value must be a user instance");e.assignee=t}},status:{get:()=>e.status,set:t=>{const n=c;let r=!1;for(const e in n)if(n[e]===t){r=!0;break}if(!r)throw new a("Value must be a value from the enumeration cvat.enums.TaskStatus");e.status=t}},startFrame:{get:()=>e.start_frame},stopFrame:{get:()=>e.stop_frame},task:{get:()=>e.task}})),this.annotations={get:Object.getPrototypeOf(this).annotations.get.bind(this),put:Object.getPrototypeOf(this).annotations.put.bind(this),save:Object.getPrototypeOf(this).annotations.save.bind(this),dump:Object.getPrototypeOf(this).annotations.dump.bind(this),merge:Object.getPrototypeOf(this).annotations.merge.bind(this),split:Object.getPrototypeOf(this).annotations.split.bind(this),group:Object.getPrototypeOf(this).annotations.group.bind(this),clear:Object.getPrototypeOf(this).annotations.clear.bind(this),upload:Object.getPrototypeOf(this).annotations.upload.bind(this),select:Object.getPrototypeOf(this).annotations.select.bind(this),statistics:Object.getPrototypeOf(this).annotations.statistics.bind(this),hasUnsavedChanges:Object.getPrototypeOf(this).annotations.hasUnsavedChanges.bind(this)},this.frames={get:Object.getPrototypeOf(this).frames.get.bind(this),ranges:Object.getPrototypeOf(this).frames.ranges.bind(this),preview:Object.getPrototypeOf(this).frames.preview.bind(this)}}async save(){return await e.apiWrapper.call(this,h.prototype.save)}}class d extends p{constructor(t){super();const e={id:void 0,name:void 0,status:void 0,size:void 0,mode:void 0,owner:void 0,assignee:void 0,created_date:void 0,updated_date:void 0,bug_tracker:void 0,overlap:void 0,segment_size:void 0,z_order:void 0,image_quality:void 0,start_frame:void 0,stop_frame:void 0,frame_filter:void 0,data_chunk_size:void 0,data_compressed_chunk_type:void 0,data_original_chunk_type:void 0,use_zip_chunks:void 0};for(const n in e)Object.prototype.hasOwnProperty.call(e,n)&&n in t&&(e[n]=t[n]);if(e.labels=[],e.jobs=[],e.files=Object.freeze({server_files:[],client_files:[],remote_files:[]}),Array.isArray(t.segments))for(const n of t.segments)if(Array.isArray(n.jobs))for(const t of n.jobs){const r=new h({url:t.url,id:t.id,assignee:t.assignee,status:t.status,start_frame:n.start_frame,stop_frame:n.stop_frame,task:this});e.jobs.push(r)}if(Array.isArray(t.labels))for(const n of t.labels){const t=new u(n);e.labels.push(t)}Object.defineProperties(this,Object.freeze({id:{get:()=>e.id},name:{get:()=>e.name,set:t=>{if(!t.trim().length)throw new a("Value must not be empty");e.name=t}},status:{get:()=>e.status},size:{get:()=>e.size},mode:{get:()=>e.mode},owner:{get:()=>e.owner},assignee:{get:()=>e.assignee,set:t=>{if(null!==t&&!(t instanceof l))throw new a("Value must be a user instance");e.assignee=t}},createdDate:{get:()=>e.created_date},updatedDate:{get:()=>e.updated_date},bugTracker:{get:()=>e.bug_tracker,set:t=>{e.bug_tracker=t}},overlap:{get:()=>e.overlap,set:t=>{if(!Number.isInteger(t)||t<0)throw new a("Value must be a non negative integer");e.overlap=t}},segmentSize:{get:()=>e.segment_size,set:t=>{if(!Number.isInteger(t)||t<0)throw new a("Value must be a positive integer");e.segment_size=t}},zOrder:{get:()=>e.z_order,set:t=>{if("boolean"!=typeof t)throw new a("Value must be a boolean");e.z_order=t}},imageQuality:{get:()=>e.image_quality,set:t=>{if(!Number.isInteger(t)||t<0)throw new a("Value must be a positive integer");e.image_quality=t}},useZipChunks:{get:()=>e.use_zip_chunks,set:t=>{if("boolean"!=typeof t)throw new a("Value must be a boolean");e.use_zip_chunks=t}},labels:{get:()=>[...e.labels],set:t=>{if(!Array.isArray(t))throw new a("Value must be an array of Labels");for(const e of t)if(!(e instanceof u))throw new a("Each array value must be an instance of Label. "+`${typeof e} was found`);e.labels=[...t]}},jobs:{get:()=>[...e.jobs]},serverFiles:{get:()=>[...e.files.server_files],set:t=>{if(!Array.isArray(t))throw new a(`Value must be an array. But ${typeof t} has been got.`);for(const e of t)if("string"!=typeof e)throw new a(`Array values must be a string. But ${typeof e} has been got.`);Array.prototype.push.apply(e.files.server_files,t)}},clientFiles:{get:()=>[...e.files.client_files],set:t=>{if(!Array.isArray(t))throw new a(`Value must be an array. But ${typeof t} has been got.`);for(const e of t)if(!(e instanceof File))throw new a(`Array values must be a File. But ${e.constructor.name} has been got.`);Array.prototype.push.apply(e.files.client_files,t)}},remoteFiles:{get:()=>[...e.files.remote_files],set:t=>{if(!Array.isArray(t))throw new a(`Value must be an array. But ${typeof t} has been got.`);for(const e of t)if("string"!=typeof e)throw new a(`Array values must be a string. But ${typeof e} has been got.`);Array.prototype.push.apply(e.files.remote_files,t)}},startFrame:{get:()=>e.start_frame,set:t=>{if(!Number.isInteger(t)||t<0)throw new a("Value must be a not negative integer");e.start_frame=t}},stopFrame:{get:()=>e.stop_frame,set:t=>{if(!Number.isInteger(t)||t<0)throw new a("Value must be a not negative integer");e.stop_frame=t}},frameFilter:{get:()=>e.frame_filter,set:t=>{if("string"!=typeof t)throw new a(`Filter value must be a string. But ${typeof t} has been got.`);e.frame_filter=t}},dataChunkSize:{get:()=>e.data_chunk_size,set:t=>{if("number"!=typeof t||t<1)throw new a(`Chunk size value must be a positive number. But value ${t} has been got.`);e.data_chunk_size=t}},dataChunkType:{get:()=>e.data_compressed_chunk_type}})),this.annotations={get:Object.getPrototypeOf(this).annotations.get.bind(this),put:Object.getPrototypeOf(this).annotations.put.bind(this),save:Object.getPrototypeOf(this).annotations.save.bind(this),dump:Object.getPrototypeOf(this).annotations.dump.bind(this),merge:Object.getPrototypeOf(this).annotations.merge.bind(this),split:Object.getPrototypeOf(this).annotations.split.bind(this),group:Object.getPrototypeOf(this).annotations.group.bind(this),clear:Object.getPrototypeOf(this).annotations.clear.bind(this),upload:Object.getPrototypeOf(this).annotations.upload.bind(this),select:Object.getPrototypeOf(this).annotations.select.bind(this),statistics:Object.getPrototypeOf(this).annotations.statistics.bind(this),hasUnsavedChanges:Object.getPrototypeOf(this).annotations.hasUnsavedChanges.bind(this)},this.frames={get:Object.getPrototypeOf(this).frames.get.bind(this),ranges:Object.getPrototypeOf(this).frames.ranges.bind(this),preview:Object.getPrototypeOf(this).frames.preview.bind(this)}}async save(t=(()=>{})){return await e.apiWrapper.call(this,d.prototype.save,t)}async delete(){return await e.apiWrapper.call(this,d.prototype.delete)}}t.exports={Job:h,Task:d};const{getAnnotations:m,putAnnotations:b,saveAnnotations:g,hasUnsavedChanges:v,mergeAnnotations:y,splitAnnotations:w,groupAnnotations:k,clearAnnotations:x,selectObject:O,annotationsStatistics:j,uploadAnnotations:S,dumpAnnotations:_}=n(247);f(h.prototype),f(d.prototype),h.prototype.save.implementation=async function(){if(this.id){const t={status:this.status};return await r.jobs.saveJob(this.id,t),this}throw new a("Can not save job without and id")},h.prototype.frames.get.implementation=async function(t){if(!Number.isInteger(t)||t<0)throw new a(`Frame must be a positive integer. Got: "${t}"`);if(tthis.stopFrame)throw new a(`The frame with number ${t} is out of the job`);return await o(this.task.id,this.task.dataChunkSize,this.task.dataChunkType,this.task.mode,t,this.startFrame,this.stopFrame)},h.prototype.frames.ranges.implementation=async function(){return await i(this.task.id)},h.prototype.annotations.get.implementation=async function(t,e){if(tthis.stopFrame)throw new a(`Frame ${t} does not exist in the job`);return await m(this,t,e)},h.prototype.annotations.save.implementation=async function(t){return await g(this,t)},h.prototype.annotations.merge.implementation=async function(t){return await y(this,t)},h.prototype.annotations.split.implementation=async function(t,e){return await w(this,t,e)},h.prototype.annotations.group.implementation=async function(t,e){return await k(this,t,e)},h.prototype.annotations.hasUnsavedChanges.implementation=function(){return v(this)},h.prototype.annotations.clear.implementation=async function(t){return await x(this,t)},h.prototype.annotations.select.implementation=function(t,e,n){return O(this,t,e,n)},h.prototype.annotations.statistics.implementation=function(){return j(this)},h.prototype.annotations.put.implementation=function(t){return b(this,t)},h.prototype.annotations.upload.implementation=async function(t,e){return await S(this,t,e)},h.prototype.annotations.dump.implementation=async function(t,e){return await _(this,t,e)},d.prototype.save.implementation=async function(t){if(void 0!==this.id){const t={assignee:this.assignee?this.assignee.id:null,name:this.name,bug_tracker:this.bugTracker,z_order:this.zOrder,labels:[...this.labels.map(t=>t.toJSON())]};return await r.tasks.saveTask(this.id,t),this}const e={name:this.name,labels:this.labels.map(t=>t.toJSON()),z_order:Boolean(this.zOrder)};void 0!==this.bugTracker&&(e.bug_tracker=this.bugTracker),void 0!==this.segmentSize&&(e.segment_size=this.segmentSize),void 0!==this.overlap&&(e.overlap=this.overlap);const n={client_files:this.clientFiles,server_files:this.serverFiles,remote_files:this.remoteFiles,image_quality:this.imageQuality,use_zip_chunks:this.useZipChunks};void 0!==this.startFrame&&(n.start_frame=this.startFrame),void 0!==this.stopFrame&&(n.stop_frame=this.stopFrame),void 0!==this.frameFilter&&(n.frame_filter=this.frameFilter);const o=await r.tasks.createTask(e,n,t);return new d(o)},d.prototype.delete.implementation=async function(){return await r.tasks.deleteTask(this.id)},d.prototype.frames.get.implementation=async function(t){if(!Number.isInteger(t)||t<0)throw new a(`Frame must be a positive integer. Got: "${t}"`);if(t>=this.size)throw new a(`The frame with number ${t} is out of the task`);return await o(this.id,this.dataChunkSize,this.dataChunkType,this.mode,t,0,this.size-1)},h.prototype.frames.preview.implementation=async function(){return await s(this.task.id)},d.prototype.frames.ranges.implementation=async function(){return await i(this.id)},d.prototype.frames.preview.implementation=async function(){return await s(this.id)},d.prototype.annotations.get.implementation=async function(t,e){if(!Number.isInteger(t)||t<0)throw new a(`Frame must be a positive integer. Got: "${t}"`);if(t>=this.size)throw new a(`Frame ${t} does not exist in the task`);return await m(this,t,e)},d.prototype.annotations.save.implementation=async function(t){return await g(this,t)},d.prototype.annotations.merge.implementation=async function(t){return await y(this,t)},d.prototype.annotations.split.implementation=async function(t,e){return await w(this,t,e)},d.prototype.annotations.group.implementation=async function(t,e){return await k(this,t,e)},d.prototype.annotations.hasUnsavedChanges.implementation=function(){return v(this)},d.prototype.annotations.clear.implementation=async function(t){return await x(this,t)},d.prototype.annotations.select.implementation=function(t,e,n){return O(this,t,e,n)},d.prototype.annotations.statistics.implementation=function(){return j(this)},d.prototype.annotations.put.implementation=function(t){return b(this,t)},d.prototype.annotations.upload.implementation=async function(t,e){return await S(this,t,e)},d.prototype.annotations.dump.implementation=async function(t,e){return await _(this,t,e)}})()},function(t,e,n){var r=n(206),o=n(119);t.exports=function(t){return r(o(t))}},function(t,e,n){var r=n(52),o=n(208);(t.exports=function(t,e){return o[t]||(o[t]=void 0!==e?e:{})})("versions",[]).push({version:"3.3.2",mode:r?"pure":"global",copyright:"© 2019 Denis Pushkarev (zloirock.ru)"})},function(t,e){t.exports=!1},function(t,e,n){var r=n(128),o=n(1),i=function(t){return"function"==typeof t?t:void 0};t.exports=function(t,e){return arguments.length<2?i(r[t])||i(o[t]):r[t]&&r[t][e]||o[t]&&o[t][e]}},function(t,e,n){var r=n(1),o=n(51),i=n(19),s=n(20),a=n(73),c=n(129),u=n(79),l=u.get,f=u.enforce,p=String(c).split("toString");o("inspectSource",(function(t){return c.call(t)})),(t.exports=function(t,e,n,o){var c=!!o&&!!o.unsafe,u=!!o&&!!o.enumerable,l=!!o&&!!o.noTargetGet;"function"==typeof n&&("string"!=typeof e||s(n,"name")||i(n,"name",e),f(n).source=p.join("string"==typeof e?e:"")),t!==r?(c?!l&&t[e]&&(u=!0):delete t[e],u?t[e]=n:i(t,e,n)):u?t[e]=n:a(e,n)})(Function.prototype,"toString",(function(){return"function"==typeof this&&l(this).source||c.call(this)}))},function(t,e,n){n(5),n(10),n(71),(()=>{const{AttributeType:e}=n(29),{ArgumentError:r}=n(6);class o{constructor(t){const n={id:void 0,default_value:void 0,input_type:void 0,mutable:void 0,name:void 0,values:void 0};for(const e in n)Object.prototype.hasOwnProperty.call(n,e)&&Object.prototype.hasOwnProperty.call(t,e)&&(Array.isArray(t[e])?n[e]=[...t[e]]:n[e]=t[e]);if(!Object.values(e).includes(n.input_type))throw new r(`Got invalid attribute type ${n.input_type}`);Object.defineProperties(this,Object.freeze({id:{get:()=>n.id},defaultValue:{get:()=>n.default_value},inputType:{get:()=>n.input_type},mutable:{get:()=>n.mutable},name:{get:()=>n.name},values:{get:()=>[...n.values]}}))}toJSON(){const t={name:this.name,mutable:this.mutable,input_type:this.inputType,default_value:this.defaultValue,values:this.values};return void 0!==this.id&&(t.id=this.id),t}}t.exports={Attribute:o,Label:class{constructor(t){const e={id:void 0,name:void 0};for(const n in e)Object.prototype.hasOwnProperty.call(e,n)&&Object.prototype.hasOwnProperty.call(t,n)&&(e[n]=t[n]);if(e.attributes=[],Object.prototype.hasOwnProperty.call(t,"attributes")&&Array.isArray(t.attributes))for(const n of t.attributes)e.attributes.push(new o(n));Object.defineProperties(this,Object.freeze({id:{get:()=>e.id},name:{get:()=>e.name},attributes:{get:()=>[...e.attributes]}}))}toJSON(){const t={name:this.name,attributes:[...this.attributes.map(t=>t.toJSON())]};return void 0!==this.id&&(t.id=this.id),t}}}})()},function(t,e,n){(()=>{const{ArgumentError:e}=n(6);t.exports={isBoolean:function(t){return"boolean"==typeof t},isInteger:function(t){return"number"==typeof t&&Number.isInteger(t)},isEnum:function(t){for(const e in this)if(Object.prototype.hasOwnProperty.call(this,e)&&this[e]===t)return!0;return!1},isString:function(t){return"string"==typeof t},checkFilter:function(t,n){for(const r in t)if(Object.prototype.hasOwnProperty.call(t,r)){if(!(r in n))throw new e(`Unsupported filter property has been recieved: "${r}"`);if(!n[r](t[r]))throw new e(`Received filter property "${r}" is not satisfied for checker`)}},checkObjectType:function(t,n,r,o){if(r){if(typeof n!==r){if("integer"===r&&Number.isInteger(n))return;throw new e(`"${t}" is expected to be "${r}", but "${typeof n}" has been got.`)}}else if(o&&!(n instanceof o)){if(void 0!==n)throw new e(`"${t}" is expected to be ${o.name}, but `+`"${n.constructor.name}" has been got`);throw new e(`"${t}" is expected to be ${o.name}, but "undefined" has been got.`)}}}})()},function(t,e,n){var r=n(13),o=n(84),i=n(42),s=n(43),a=n(58),c=n(9),u=n(86),l=Object.getOwnPropertyDescriptor;e.f=r?l:function(t,e){if(t=s(t),e=a(e,!0),u)try{return l(t,e)}catch(t){}if(c(t,e))return i(!o.f.call(t,e),t[e])}},function(t,e,n){var r=n(14);t.exports=function(t,e){if(!r(t))return t;var n,o;if(e&&"function"==typeof(n=t.toString)&&!r(o=n.call(t)))return o;if("function"==typeof(n=t.valueOf)&&!r(o=n.call(t)))return o;if(!e&&"function"==typeof(n=t.toString)&&!r(o=n.call(t)))return o;throw TypeError("Can't convert object to primitive value")}},function(t,e,n){var r=n(0),o=n(14),i=r.document,s=o(i)&&o(i.createElement);t.exports=function(t){return s?i.createElement(t):{}}},function(t,e,n){var r=n(0),o=n(15);t.exports=function(t,e){try{o(r,t,e)}catch(n){r[t]=e}return e}},function(t,e,n){var r=n(44),o=n(88),i=r("keys");t.exports=function(t){return i[t]||(i[t]=o(t))}},function(t,e){t.exports={}},function(t,e){t.exports=["constructor","hasOwnProperty","isPrototypeOf","propertyIsEnumerable","toLocaleString","toString","valueOf"]},function(t,e){t.exports=function(t,e,n){if(!(t instanceof e))throw TypeError("Incorrect "+(n?n+" ":"")+"invocation");return t}},function(t,e,n){var r=n(32);t.exports=r("navigator","userAgent")||""},function(t,e){t.exports={backendAPI:"http://localhost:7000/api/v1",proxy:!1,taskID:void 0,jobID:void 0,clientID:+Date.now().toString().substr(-6)}},function(t,e,n){var r=n(46),o=n(31),i=function(t){return function(e,n){var i,s,a=String(o(e)),c=r(n),u=a.length;return c<0||c>=u?t?"":void 0:(i=a.charCodeAt(c))<55296||i>56319||c+1===u||(s=a.charCodeAt(c+1))<56320||s>57343?t?a.charAt(c):i:t?a.slice(c,c+2):s-56320+(i-55296<<10)+65536}};t.exports={codeAt:i(!1),charAt:i(!0)}},function(t,e,n){"use strict";(function(e){var r=n(7),o=n(186),i={"Content-Type":"application/x-www-form-urlencoded"};function s(t,e){!r.isUndefined(t)&&r.isUndefined(t["Content-Type"])&&(t["Content-Type"]=e)}var a,c={adapter:("undefined"!=typeof XMLHttpRequest?a=n(113):void 0!==e&&(a=n(113)),a),transformRequest:[function(t,e){return o(e,"Content-Type"),r.isFormData(t)||r.isArrayBuffer(t)||r.isBuffer(t)||r.isStream(t)||r.isFile(t)||r.isBlob(t)?t:r.isArrayBufferView(t)?t.buffer:r.isURLSearchParams(t)?(s(e,"application/x-www-form-urlencoded;charset=utf-8"),t.toString()):r.isObject(t)?(s(e,"application/json;charset=utf-8"),JSON.stringify(t)):t}],transformResponse:[function(t){if("string"==typeof t)try{t=JSON.parse(t)}catch(t){}return t}],timeout:0,xsrfCookieName:"XSRF-TOKEN",xsrfHeaderName:"X-XSRF-TOKEN",maxContentLength:-1,validateStatus:function(t){return t>=200&&t<300}};c.headers={common:{Accept:"application/json, text/plain, */*"}},r.forEach(["delete","get","head"],(function(t){c.headers[t]={}})),r.forEach(["post","put","patch"],(function(t){c.headers[t]=r.merge(i)})),t.exports=c}).call(this,n(112))},function(t,e){t.exports=class{constructor(t){const e={id:null,username:null,email:null,first_name:null,last_name:null,groups:null,last_login:null,date_joined:null,is_staff:null,is_superuser:null,is_active:null};for(const n in e)Object.prototype.hasOwnProperty.call(e,n)&&n in t&&(e[n]=t[n]);Object.defineProperties(this,Object.freeze({id:{get:()=>e.id},username:{get:()=>e.username},email:{get:()=>e.email},firstName:{get:()=>e.first_name},lastName:{get:()=>e.last_name},groups:{get:()=>JSON.parse(JSON.stringify(e.groups))},lastLogin:{get:()=>e.last_login},dateJoined:{get:()=>e.date_joined},isStaff:{get:()=>e.is_staff},isSuperuser:{get:()=>e.is_superuser},isActive:{get:()=>e.is_active}}))}}},function(t,e,n){n(5),n(11),n(10),(()=>{const e=n(36),{ArgumentError:r}=n(6);class o{constructor(t){const e={label:null,attributes:{},points:null,outside:null,occluded:null,keyframe:null,group:null,zOrder:null,lock:null,color:null,visibility:null,clientID:t.clientID,serverID:t.serverID,frame:t.frame,objectType:t.objectType,shapeType:t.shapeType,updateFlags:{}};Object.defineProperty(e.updateFlags,"reset",{value:function(){this.label=!1,this.attributes=!1,this.points=!1,this.outside=!1,this.occluded=!1,this.keyframe=!1,this.group=!1,this.zOrder=!1,this.lock=!1,this.color=!1,this.visibility=!1},writable:!1}),Object.defineProperties(this,Object.freeze({updateFlags:{get:()=>e.updateFlags},frame:{get:()=>e.frame},objectType:{get:()=>e.objectType},shapeType:{get:()=>e.shapeType},clientID:{get:()=>e.clientID},serverID:{get:()=>e.serverID},label:{get:()=>e.label,set:t=>{e.updateFlags.label=!0,e.label=t}},color:{get:()=>e.color,set:t=>{e.updateFlags.color=!0,e.color=t}},visibility:{get:()=>e.visibility,set:t=>{e.updateFlags.visibility=!0,e.visibility=t}},points:{get:()=>e.points,set:t=>{if(!Array.isArray(t))throw new r("Points are expected to be an array "+`but got ${"object"==typeof t?t.constructor.name:typeof t}`);e.updateFlags.points=!0,e.points=[...t]}},group:{get:()=>e.group,set:t=>{e.updateFlags.group=!0,e.group=t}},zOrder:{get:()=>e.zOrder,set:t=>{e.updateFlags.zOrder=!0,e.zOrder=t}},outside:{get:()=>e.outside,set:t=>{e.updateFlags.outside=!0,e.outside=t}},keyframe:{get:()=>e.keyframe,set:t=>{e.updateFlags.keyframe=!0,e.keyframe=t}},occluded:{get:()=>e.occluded,set:t=>{e.updateFlags.occluded=!0,e.occluded=t}},lock:{get:()=>e.lock,set:t=>{e.updateFlags.lock=!0,e.lock=t}},attributes:{get:()=>e.attributes,set:t=>{if("object"!=typeof t)throw new r("Attributes are expected to be an object "+`but got ${"object"==typeof t?t.constructor.name:typeof t}`);for(const n of Object.keys(t))e.updateFlags.attributes=!0,e.attributes[n]=t[n]}}})),this.label=t.label,this.group=t.group,this.zOrder=t.zOrder,this.outside=t.outside,this.keyframe=t.keyframe,this.occluded=t.occluded,this.color=t.color,this.lock=t.lock,this.visibility=t.visibility,void 0!==t.points&&(this.points=t.points),void 0!==t.attributes&&(this.attributes=t.attributes),e.updateFlags.reset()}async save(){return await e.apiWrapper.call(this,o.prototype.save)}async delete(t=!1){return await e.apiWrapper.call(this,o.prototype.delete,t)}async up(){return await e.apiWrapper.call(this,o.prototype.up)}async down(){return await e.apiWrapper.call(this,o.prototype.down)}}o.prototype.save.implementation=async function(){return this.hidden&&this.hidden.save?this.hidden.save():this},o.prototype.delete.implementation=async function(t){return!(!this.hidden||!this.hidden.delete)&&this.hidden.delete(t)},o.prototype.up.implementation=async function(){return!(!this.hidden||!this.hidden.up)&&this.hidden.up()},o.prototype.down.implementation=async function(){return!(!this.hidden||!this.hidden.down)&&this.hidden.down()},t.exports=o})()},function(t,e,n){"use strict";n(12)({target:"URL",proto:!0,enumerable:!0},{toJSON:function(){return URL.prototype.toString.call(this)}})},function(t,e,n){"use strict";var r=n(50),o=n(207),i=n(40),s=n(79),a=n(215),c=s.set,u=s.getterFor("Array Iterator");t.exports=a(Array,"Array",(function(t,e){c(this,{type:"Array Iterator",target:r(t),index:0,kind:e})}),(function(){var t=u(this),e=t.target,n=t.kind,r=t.index++;return!e||r>=e.length?(t.target=void 0,{value:void 0,done:!0}):"keys"==n?{value:r,done:!1}:"values"==n?{value:e[r],done:!1}:{value:[r,e[r]],done:!1}}),"values"),i.Arguments=i.Array,o("keys"),o("values"),o("entries")},function(t,e,n){var r=n(1),o=n(19);t.exports=function(t,e){try{o(r,t,e)}catch(n){r[t]=e}return e}},function(t,e,n){var r=n(1),o=n(22),i=r.document,s=o(i)&&o(i.createElement);t.exports=function(t){return s?i.createElement(t):{}}},function(t,e){t.exports=function(t,e){return{enumerable:!(1&t),configurable:!(2&t),writable:!(4&t),value:e}}},function(t,e){t.exports={}},function(t,e){t.exports=["constructor","hasOwnProperty","isPrototypeOf","propertyIsEnumerable","toLocaleString","toString","valueOf"]},function(t,e,n){var r=n(51),o=n(122),i=r("keys");t.exports=function(t){return i[t]||(i[t]=o(t))}},function(t,e,n){var r,o,i,s=n(214),a=n(1),c=n(22),u=n(19),l=n(20),f=n(78),p=n(76),h=a.WeakMap;if(s){var d=new h,m=d.get,b=d.has,g=d.set;r=function(t,e){return g.call(d,t,e),e},o=function(t){return m.call(d,t)||{}},i=function(t){return b.call(d,t)}}else{var v=f("state");p[v]=!0,r=function(t,e){return u(t,v,e),e},o=function(t){return l(t,v)?t[v]:{}},i=function(t){return l(t,v)}}t.exports={set:r,get:o,has:i,enforce:function(t){return i(t)?o(t):r(t,{})},getterFor:function(t){return function(e){var n;if(!c(e)||(n=o(e)).type!==t)throw TypeError("Incompatible receiver, "+t+" required");return n}}}},function(t,e,n){var r=n(1),o=n(81).f,i=n(19),s=n(54),a=n(73),c=n(217),u=n(130);t.exports=function(t,e){var n,l,f,p,h,d=t.target,m=t.global,b=t.stat;if(n=m?r:b?r[d]||a(d,{}):(r[d]||{}).prototype)for(l in e){if(p=e[l],f=t.noTargetGet?(h=o(n,l))&&h.value:n[l],!u(m?l:d+(b?".":"#")+l,t.forced)&&void 0!==f){if(typeof p==typeof f)continue;c(p,f)}(t.sham||f&&f.sham)&&i(p,"sham",!0),s(n,l,p,t)}}},function(t,e,n){var r=n(28),o=n(216),i=n(75),s=n(50),a=n(121),c=n(20),u=n(120),l=Object.getOwnPropertyDescriptor;e.f=r?l:function(t,e){if(t=s(t),e=a(e,!0),u)try{return l(t,e)}catch(t){}if(c(t,e))return i(!o.f.call(t,e),t[e])}},function(t,e,n){var r=n(39).f,o=n(20),i=n(8)("toStringTag");t.exports=function(t,e,n){t&&!o(t=n?t:t.prototype,i)&&r(t,i,{configurable:!0,value:e})}},function(t,e,n){var r=n(53);t.exports=r("navigator","userAgent")||""},function(t,e,n){"use strict";var r={}.propertyIsEnumerable,o=Object.getOwnPropertyDescriptor,i=o&&!r.call({1:2},1);e.f=i?function(t){var e=o(this,t);return!!e&&e.enumerable}:r},function(t,e,n){var r=n(3),o=n(23),i="".split;t.exports=r((function(){return!Object("z").propertyIsEnumerable(0)}))?function(t){return"String"==o(t)?i.call(t,""):Object(t)}:Object},function(t,e,n){var r=n(13),o=n(3),i=n(59);t.exports=!r&&!o((function(){return 7!=Object.defineProperty(i("div"),"a",{get:function(){return 7}}).a}))},function(t,e,n){var r=n(44);t.exports=r("native-function-to-string",Function.toString)},function(t,e){var n=0,r=Math.random();t.exports=function(t){return"Symbol("+String(void 0===t?"":t)+")_"+(++n+r).toString(36)}},function(t,e,n){var r=n(9),o=n(143),i=n(57),s=n(21);t.exports=function(t,e){for(var n=o(e),a=s.f,c=i.f,u=0;uc;)r(a,n=e[c++])&&(~i(u,n)||u.push(n));return u}},function(t,e){e.f=Object.getOwnPropertySymbols},function(t,e,n){var r=n(3),o=/#|\.prototype\./,i=function(t,e){var n=a[s(t)];return n==u||n!=c&&("function"==typeof e?r(e):!!e)},s=i.normalize=function(t){return String(t).replace(o,".").toLowerCase()},a=i.data={},c=i.NATIVE="N",u=i.POLYFILL="P";t.exports=i},function(t,e,n){var r=n(0);t.exports=r.Promise},function(t,e,n){var r=n(18);t.exports=function(t,e,n){for(var o in e)r(t,o,e[o],n);return t}},function(t,e,n){var r=n(2),o=n(35),i=r("iterator"),s=Array.prototype;t.exports=function(t){return void 0!==t&&(o.Array===t||s[i]===t)}},function(t,e,n){var r=n(4);t.exports=function(t,e,n,o){try{return o?e(r(n)[0],n[1]):e(n)}catch(e){var i=t.return;throw void 0!==i&&r(i.call(t)),e}}},function(t,e,n){var r=n(4),o=n(34),i=n(2)("species");t.exports=function(t,e){var n,s=r(t).constructor;return void 0===s||null==(n=r(s)[i])?e:o(n)}},function(t,e,n){var r,o,i,s=n(0),a=n(3),c=n(23),u=n(47),l=n(100),f=n(59),p=n(65),h=s.location,d=s.setImmediate,m=s.clearImmediate,b=s.process,g=s.MessageChannel,v=s.Dispatch,y=0,w={},k=function(t){if(w.hasOwnProperty(t)){var e=w[t];delete w[t],e()}},x=function(t){return function(){k(t)}},O=function(t){k(t.data)},j=function(t){s.postMessage(t+"",h.protocol+"//"+h.host)};d&&m||(d=function(t){for(var e=[],n=1;arguments.length>n;)e.push(arguments[n++]);return w[++y]=function(){("function"==typeof t?t:Function(t)).apply(void 0,e)},r(y),y},m=function(t){delete w[t]},"process"==c(b)?r=function(t){b.nextTick(x(t))}:v&&v.now?r=function(t){v.now(x(t))}:g&&!/(iphone|ipod|ipad).*applewebkit/i.test(p)?(i=(o=new g).port2,o.port1.onmessage=O,r=u(i.postMessage,i,1)):!s.addEventListener||"function"!=typeof postMessage||s.importScripts||a(j)?r="onreadystatechange"in f("script")?function(t){l.appendChild(f("script")).onreadystatechange=function(){l.removeChild(this),k(t)}}:function(t){setTimeout(x(t),0)}:(r=j,s.addEventListener("message",O,!1))),t.exports={set:d,clear:m}},function(t,e,n){var r=n(32);t.exports=r("document","documentElement")},function(t,e,n){var r=n(4),o=n(14),i=n(102);t.exports=function(t,e){if(r(t),o(e)&&e.constructor===t)return e;var n=i.f(t);return(0,n.resolve)(e),n.promise}},function(t,e,n){"use strict";var r=n(34),o=function(t){var e,n;this.promise=new t((function(t,r){if(void 0!==e||void 0!==n)throw TypeError("Bad Promise constructor");e=t,n=r})),this.resolve=r(e),this.reject=r(n)};t.exports.f=function(t){return new o(t)}},function(t,e,n){var r=n(4),o=n(104),i=n(63),s=n(62),a=n(100),c=n(59),u=n(61)("IE_PROTO"),l=function(){},f=function(){var t,e=c("iframe"),n=i.length;for(e.style.display="none",a.appendChild(e),e.src=String("javascript:"),(t=e.contentWindow.document).open(),t.write(" @@ -162,7 +165,7 @@

- +
@@ -218,10 +221,10 @@ *[type="polygon"] - only polygon objects
car[occluded="true"] - only occluded cars
*[lock!="true"] - only unlocked tracks
- person[attr/age>="25" and attr/age<="35"] - persons with age (number) beetween [25,40] years
+ person[attr/age>="25" and attr/age<="35"] - persons with age (number) between [25,40] years
car[attr/parked="true"] - only parked cars
person[attr/race="asian"] | car[attr/model="bmw"] - asians and BMW cars
- face[attr/glass="sunglass" or attr/glass="no"] - faces with sunglass or without glass
+ face[attr/glass="sunglasses" or attr/glass="no"] - faces with sunglasses or without glass
*[attr/*="__undefined__"] - any tracks with any unlabeled attributes
*[width<300 or height<300] - shapes with height or width less than 300px
person[width>300 and height<200] - person shapes with width > 300px and height < 200px
@@ -340,6 +343,7 @@ + @@ -379,7 +383,7 @@
- +
diff --git a/cvat/apps/engine/tests/test_model.py b/cvat/apps/engine/tests/test_model.py new file mode 100644 index 000000000000..34454c0b1f58 --- /dev/null +++ b/cvat/apps/engine/tests/test_model.py @@ -0,0 +1,25 @@ +# Copyright (C) 2018 Intel Corporation +# +# SPDX-License-Identifier: MIT + +import os.path as osp + +from django.test import TestCase +from cvat.apps.engine.models import Task + + +class TaskModelTest(TestCase): + def test_frame_id_path_conversions(self): + task_id = 1 + task = Task(task_id) + + for i in [10 ** p for p in range(6)]: + src_path_expected = osp.join( + str(i // 10000), str(i // 100), '%s.jpg' % i) + src_path = task.get_frame_path(i) + + dst_frame = task.get_image_frame(src_path) + + self.assertTrue(src_path.endswith(src_path_expected), + '%s vs. %s' % (src_path, src_path_expected)) + self.assertEqual(i, dst_frame) diff --git a/cvat/apps/engine/tests/test_rest_api.py b/cvat/apps/engine/tests/test_rest_api.py index 79cf603de0d6..43947aeb6640 100644 --- a/cvat/apps/engine/tests/test_rest_api.py +++ b/cvat/apps/engine/tests/test_rest_api.py @@ -2665,6 +2665,9 @@ def _get_initial_annotation(annotation_format): annotations["shapes"] = rectangle_shapes_with_attrs + rectangle_shapes_wo_attrs + polygon_shapes_wo_attrs annotations["tracks"] = rectangle_tracks_with_attrs + rectangle_tracks_wo_attrs + elif annotation_format == "MOT CSV 1.0": + annotations["tracks"] = rectangle_tracks_wo_attrs + return annotations response = self._get_annotation_formats(annotator) diff --git a/cvat/apps/engine/urls.py b/cvat/apps/engine/urls.py index 3abde35ff06c..6631874b3790 100644 --- a/cvat/apps/engine/urls.py +++ b/cvat/apps/engine/urls.py @@ -1,5 +1,5 @@ -# Copyright (C) 2018 Intel Corporation +# Copyright (C) 2018-2019 Intel Corporation # # SPDX-License-Identifier: MIT @@ -34,6 +34,7 @@ urlpatterns = [ # Entry point for a client path('', views.dispatch_request), + path('dashboard/', views.dispatch_request), # documentation for API path('api/swagger.$', schema_view.without_ui(cache_timeout=0), name='schema-json'), diff --git a/cvat/apps/engine/views.py b/cvat/apps/engine/views.py index b8e7c79fba67..03904b771207 100644 --- a/cvat/apps/engine/views.py +++ b/cvat/apps/engine/views.py @@ -1,16 +1,18 @@ -# Copyright (C) 2018 Intel Corporation +# Copyright (C) 2018-2019 Intel Corporation # # SPDX-License-Identifier: MIT import os +import os.path as osp import re import traceback import shutil from datetime import datetime from tempfile import mkstemp, NamedTemporaryFile -from django.http import HttpResponseBadRequest, HttpResponse -from django.shortcuts import redirect, render +from django.views.generic import RedirectView +from django.http import HttpResponseBadRequest, HttpResponseNotFound +from django.shortcuts import render from django.conf import settings from sendfile import sendfile from rest_framework.permissions import IsAuthenticated @@ -24,12 +26,12 @@ from django_filters import rest_framework as filters import django_rq from django.db import IntegrityError +from django.utils import timezone from . import annotation, task, models from cvat.settings.base import JS_3RDPARTY, CSS_3RDPARTY from cvat.apps.authentication.decorators import login_required -import logging from .log import slogger, clogger from cvat.apps.engine.models import StatusChoice, Task, Job, Plugin from cvat.apps.engine.serializers import (TaskSerializer, UserSerializer, @@ -45,19 +47,28 @@ from cvat.apps.annotation.models import AnnotationDumper, AnnotationLoader from cvat.apps.annotation.format import get_annotation_formats from cvat.apps.engine.frame_provider import FrameProvider +import cvat.apps.dataset_manager.task as DatumaroTask # Server REST API @login_required def dispatch_request(request): """An entry point to dispatch legacy requests""" - if request.method == 'GET' and 'id' in request.GET: + if 'dashboard' in request.path or (request.path == '/' and 'id' not in request.GET): + return RedirectView.as_view( + url=settings.UI_URL, + permanent=True, + query_string=True + )(request) + elif request.method == 'GET' and 'id' in request.GET and request.path == '/': return render(request, 'engine/annotation.html', { 'css_3rdparty': CSS_3RDPARTY.get('engine', []), 'js_3rdparty': JS_3RDPARTY.get('engine', []), - 'status_list': [str(i) for i in StatusChoice] + 'status_list': [str(i) for i in StatusChoice], + 'ui_url': settings.UI_URL }) else: - return redirect('/dashboard/') + return HttpResponseNotFound() + class ServerViewSet(viewsets.ViewSet): serializer_class = None @@ -155,10 +166,17 @@ def share(request): @staticmethod @action(detail=False, methods=['GET'], url_path='annotation/formats') - def formats(request): + def annotation_formats(request): data = get_annotation_formats() return Response(data) + @staticmethod + @action(detail=False, methods=['GET'], url_path='dataset/formats') + def dataset_formats(request): + data = DatumaroTask.get_export_formats() + data = JSONRenderer().render(data) + return Response(data) + class ProjectFilter(filters.FilterSet): name = filters.CharFilter(field_name="name", lookup_expr="icontains") owner = filters.CharFilter(field_name="owner__username", lookup_expr="icontains") @@ -401,7 +419,7 @@ def dump(self, request, pk, filename): "{}.{}.{}.{}".format(filename, username, timestamp, db_dumper.format.lower())) queue = django_rq.get_queue("default") - rq_id = "{}@/api/v1/tasks/{}/annotations/{}".format(username, pk, filename) + rq_id = "{}@/api/v1/tasks/{}/annotations/{}/{}".format(username, pk, dump_format, filename) rq_job = queue.fetch_job(rq_id) if rq_job: @@ -492,6 +510,73 @@ def data_info(request, pk): if serializer.is_valid(raise_exception=True): return Response(serializer.data) + @action(detail=True, methods=['GET'], serializer_class=None, + url_path='dataset') + def dataset_export(self, request, pk): + """Export task as a dataset in a specific format""" + + db_task = self.get_object() + + action = request.query_params.get("action", "") + action = action.lower() + if action not in ["", "download"]: + raise serializers.ValidationError( + "Unexpected parameter 'action' specified for the request") + + dst_format = request.query_params.get("format", "") + if not dst_format: + dst_format = DatumaroTask.DEFAULT_FORMAT + dst_format = dst_format.lower() + if dst_format not in [f['tag'] + for f in DatumaroTask.get_export_formats()]: + raise serializers.ValidationError( + "Unexpected parameter 'format' specified for the request") + + rq_id = "task_dataset_export.{}.{}".format(pk, dst_format) + queue = django_rq.get_queue("default") + + rq_job = queue.fetch_job(rq_id) + if rq_job: + task_time = timezone.localtime(db_task.updated_date) + request_time = rq_job.meta.get('request_time', + timezone.make_aware(datetime.min)) + if request_time < task_time: + rq_job.cancel() + rq_job.delete() + else: + if rq_job.is_finished: + file_path = rq_job.return_value + if action == "download" and osp.exists(file_path): + rq_job.delete() + + timestamp = datetime.now().strftime("%Y_%m_%d_%H_%M_%S") + filename = "task_{}-{}-{}.zip".format( + db_task.name, timestamp, dst_format) + return sendfile(request, file_path, attachment=True, + attachment_filename=filename.lower()) + else: + if osp.exists(file_path): + return Response(status=status.HTTP_201_CREATED) + elif rq_job.is_failed: + exc_info = str(rq_job.exc_info) + rq_job.delete() + return Response(exc_info, + status=status.HTTP_500_INTERNAL_SERVER_ERROR) + else: + return Response(status=status.HTTP_202_ACCEPTED) + + try: + server_address = request.get_host() + except Exception: + server_address = None + + ttl = DatumaroTask.CACHE_TTL.total_seconds() + queue.enqueue_call(func=DatumaroTask.export_project, + args=(pk, request.user, dst_format, server_address), job_id=rq_id, + meta={ 'request_time': timezone.localtime() }, + result_ttl=ttl, failure_ttl=ttl) + return Response(status=status.HTTP_202_ACCEPTED) + class JobViewSet(viewsets.GenericViewSet, mixins.RetrieveModelMixin, mixins.UpdateModelMixin): queryset = Job.objects.all().order_by('id') diff --git a/cvat/apps/git/__init__.py b/cvat/apps/git/__init__.py index a7027503b5db..411e7c9d00c4 100644 --- a/cvat/apps/git/__init__.py +++ b/cvat/apps/git/__init__.py @@ -1,7 +1,3 @@ -# Copyright (C) 2018 Intel Corporation +# Copyright (C) 2018-2019 Intel Corporation # # SPDX-License-Identifier: MIT - -from cvat.settings.base import JS_3RDPARTY - -JS_3RDPARTY['dashboard'] = JS_3RDPARTY.get('dashboard', []) + ['git/js/dashboardPlugin.js'] diff --git a/cvat/apps/git/git.py b/cvat/apps/git/git.py index b9ef5136f953..1874b25ce5f2 100644 --- a/cvat/apps/git/git.py +++ b/cvat/apps/git/git.py @@ -76,8 +76,13 @@ def __init__(self, db_git, tid, user): # HTTP/HTTPS: [http://]github.com/proj/repos[.git] def _parse_url(self): try: - http_pattern = "([https|http]+)*[://]*([a-zA-Z0-9._-]+.[a-zA-Z]+)/([a-zA-Z0-9._-]+)/([a-zA-Z0-9._-]+)" - ssh_pattern = "([a-zA-Z0-9._-]+)@([a-zA-Z0-9._-]+):([a-zA-Z0-9._-]+)/([a-zA-Z0-9._-]+)" + # Almost STD66 (RFC3986), but schema can include a leading digit + # Reference on URL formats accepted by Git: + # https://github.com/git/git/blob/77bd3ea9f54f1584147b594abc04c26ca516d987/url.c + + host_pattern = r"((?:(?:(?:\d{1,3}\.){3}\d{1,3})|(?:[a-zA-Z0-9._-]+.[a-zA-Z]+))(?::\d+)?)" + http_pattern = r"(?:http[s]?://)?" + host_pattern + r"((?:/[a-zA-Z0-9._-]+){2})" + ssh_pattern = r"([a-zA-Z0-9._-]+)@" + host_pattern + r":([a-zA-Z0-9._-]+)/([a-zA-Z0-9._-]+)" http_match = re.match(http_pattern, self._url) ssh_match = re.match(ssh_pattern, self._url) @@ -87,21 +92,21 @@ def _parse_url(self): repos = None if http_match: - host = http_match.group(2) - repos = "{}/{}".format(http_match.group(3), http_match.group(4)) + host = http_match.group(1) + repos = http_match.group(2)[1:] elif ssh_match: user = ssh_match.group(1) host = ssh_match.group(2) repos = "{}/{}".format(ssh_match.group(3), ssh_match.group(4)) else: - raise Exception("Got URL doesn't sutisfy for regular expression") + raise Exception("Git repository URL does not satisfy pattern") if not repos.endswith(".git"): repos += ".git" return user, host, repos except Exception as ex: - slogger.glob.exception('URL parsing errors occured', exc_info = True) + slogger.glob.exception('URL parsing errors occurred', exc_info = True) raise ex @@ -428,11 +433,12 @@ def get(tid, user): response['status']['value'] = str(db_git.status) except git.exc.GitCommandError as ex: _have_no_access_exception(ex) + db_git.save() except Exception as ex: db_git.status = GitStatusChoice.NON_SYNCED + db_git.save() response['status']['error'] = str(ex) - db_git.save() return response def update_states(): diff --git a/cvat/apps/git/tests.py b/cvat/apps/git/tests.py index 3517aa28fb20..5d4d2c116fd3 100644 --- a/cvat/apps/git/tests.py +++ b/cvat/apps/git/tests.py @@ -2,6 +2,58 @@ # # SPDX-License-Identifier: MIT +from itertools import product + from django.test import TestCase # Create your tests here. + +from cvat.apps.git.git import Git + + +class GitUrlTest(TestCase): + class FakeGit: + def __init__(self, url): + self._url = url + + def _check_correct_urls(self, samples): + for i, (expected, url) in enumerate(samples): + git = GitUrlTest.FakeGit(url) + try: + actual = Git._parse_url(git) + self.assertEqual(expected, actual, "URL #%s: '%s'" % (i, url)) + except Exception: + self.assertFalse(True, "URL #%s: '%s'" % (i, url)) + + def test_correct_urls_can_be_parsed(self): + hosts = ['host.zone', '1.2.3.4'] + ports = ['', ':42'] + repo_groups = ['repo', 'r4p0'] + repo_repos = ['nkjl23', 'hewj'] + git_suffixes = ['', '.git'] + + samples = [] + + # http samples + protocols = ['', 'http://', 'https://'] + for protocol, host, port, repo_group, repo, git in product( + protocols, hosts, ports, repo_groups, repo_repos, git_suffixes): + url = '{protocol}{host}{port}/{repo_group}/{repo}{git}'.format( + protocol=protocol, host=host, port=port, + repo_group=repo_group, repo=repo, git=git + ) + expected = ('git', host + port, '%s/%s.git' % (repo_group, repo)) + samples.append((expected, url)) + + # git samples + users = ['user', 'u123_.'] + for user, host, port, repo_group, repo, git in product( + users, hosts, ports, repo_groups, repo_repos, git_suffixes): + url = '{user}@{host}{port}:{repo_group}/{repo}{git}'.format( + user=user, host=host, port=port, + repo_group=repo_group, repo=repo, git=git + ) + expected = (user, host + port, '%s/%s.git' % (repo_group, repo)) + samples.append((expected, url)) + + self._check_correct_urls(samples) \ No newline at end of file diff --git a/cvat/apps/log_viewer/__init__.py b/cvat/apps/log_viewer/__init__.py index 4c96c2ab030f..411e7c9d00c4 100644 --- a/cvat/apps/log_viewer/__init__.py +++ b/cvat/apps/log_viewer/__init__.py @@ -1,7 +1,3 @@ -# Copyright (C) 2018 Intel Corporation +# Copyright (C) 2018-2019 Intel Corporation # # SPDX-License-Identifier: MIT - -from cvat.settings.base import JS_3RDPARTY - -JS_3RDPARTY['dashboard'] = JS_3RDPARTY.get('dashboard', []) + ['log_viewer/js/dashboardPlugin.js'] diff --git a/cvat/apps/tf_annotation/__init__.py b/cvat/apps/tf_annotation/__init__.py index 7c9219c09832..a0fca4cb39ea 100644 --- a/cvat/apps/tf_annotation/__init__.py +++ b/cvat/apps/tf_annotation/__init__.py @@ -1,9 +1,4 @@ -# Copyright (C) 2018 Intel Corporation +# Copyright (C) 2018-2019 Intel Corporation # # SPDX-License-Identifier: MIT - -from cvat.settings.base import JS_3RDPARTY - -JS_3RDPARTY['dashboard'] = JS_3RDPARTY.get('dashboard', []) + ['tf_annotation/js/dashboardPlugin.js'] - diff --git a/cvat/apps/tf_annotation/views.py b/cvat/apps/tf_annotation/views.py index 2023b802593c..0f4aace27669 100644 --- a/cvat/apps/tf_annotation/views.py +++ b/cvat/apps/tf_annotation/views.py @@ -1,22 +1,19 @@ -# Copyright (C) 2018 Intel Corporation +# Copyright (C) 2018-2019 Intel Corporation # # SPDX-License-Identifier: MIT -from django.http import HttpResponse, JsonResponse, HttpResponseBadRequest, QueryDict -from django.core.exceptions import ObjectDoesNotExist -from django.shortcuts import render +from django.http import HttpResponse, JsonResponse, HttpResponseBadRequest +from rest_framework.decorators import api_view from rules.contrib.views import permission_required, objectgetter from cvat.apps.authentication.decorators import login_required from cvat.apps.engine.models import Task as TaskModel -from cvat.apps.engine import annotation, task from cvat.apps.engine.serializers import LabeledDataSerializer from cvat.apps.engine.annotation import put_task_data from cvat.apps.engine.frame_provider import FrameProvider import django_rq import fnmatch -import logging import json import os import rq @@ -210,14 +207,15 @@ def create_thread(tid, labels_mapping, user): try: slogger.task[tid].exception('exception was occured during tf annotation of the task', exc_info=True) except: - slogger.glob.exception('exception was occured during tf annotation of the task {}'.format(tid), exc_into=True) + slogger.glob.exception('exception was occured during tf annotation of the task {}'.format(tid), exc_info=True) raise ex +@api_view(['POST']) @login_required def get_meta_info(request): try: queue = django_rq.get_queue('low') - tids = json.loads(request.body.decode('utf-8')) + tids = request.data result = {} for tid in tids: job = queue.fetch_job('tf_annotation.create/{}'.format(tid)) @@ -229,7 +227,7 @@ def get_meta_info(request): return JsonResponse(result) except Exception as ex: - slogger.glob.exception('exception was occured during tf meta request', exc_into=True) + slogger.glob.exception('exception was occured during tf meta request', exc_info=True) return HttpResponseBadRequest(str(ex)) diff --git a/cvat/requirements/base.txt b/cvat/requirements/base.txt index c4d0645031db..9c36abcc7a57 100644 --- a/cvat/requirements/base.txt +++ b/cvat/requirements/base.txt @@ -1,5 +1,5 @@ click==6.7 -Django==2.2.4 +Django==2.2.8 django-appconf==1.0.2 django-auth-ldap==1.4.0 django-cacheops==4.0.6 @@ -17,6 +17,7 @@ redis==3.2.0 requests==2.20.0 rjsmin==1.0.12 rq==1.0.0 +rq-scheduler==0.9.1 scipy==1.2.1 sqlparse==0.2.4 django-sendfile==0.3.11 @@ -43,6 +44,6 @@ keras==2.2.5 opencv-python==4.1.0.25 h5py==2.9.0 imgaug==0.2.9 -django-cors-headers==3.0.2 +django-cors-headers==3.2.0 furl==2.0.0 av==6.2.0 diff --git a/cvat/settings/base.py b/cvat/settings/base.py index c44b45220a86..a0751c1afcf4 100644 --- a/cvat/settings/base.py +++ b/cvat/settings/base.py @@ -1,4 +1,4 @@ -# Copyright (C) 2018 Intel Corporation +# Copyright (C) 2018-2019 Intel Corporation # # SPDX-License-Identifier: MIT @@ -32,8 +32,9 @@ try: sys.path.append(BASE_DIR) - from keys.secret_key import SECRET_KEY + from keys.secret_key import SECRET_KEY # pylint: disable=unused-import except ImportError: + from django.utils.crypto import get_random_string keys_dir = os.path.join(BASE_DIR, 'keys') if not os.path.isdir(keys_dir): @@ -93,10 +94,10 @@ def generate_ssh_keys(): 'django.contrib.messages', 'django.contrib.staticfiles', 'cvat.apps.engine', - 'cvat.apps.dashboard', 'cvat.apps.authentication', 'cvat.apps.documentation', 'cvat.apps.git', + 'cvat.apps.dataset_manager', 'cvat.apps.annotation', 'django_rq', 'compressor', @@ -125,7 +126,7 @@ def generate_ssh_keys(): 'rest_framework.permissions.IsAuthenticated', ], 'DEFAULT_AUTHENTICATION_CLASSES': [ - 'rest_framework.authentication.TokenAuthentication', + 'cvat.apps.authentication.auth.TokenAuthentication', 'cvat.apps.authentication.auth.SignatureAuthentication', 'rest_framework.authentication.SessionAuthentication', 'rest_framework.authentication.BasicAuthentication' @@ -138,7 +139,7 @@ def generate_ssh_keys(): # Need to add 'api-docs' here as a workaround for include_docs_urls. 'ALLOWED_VERSIONS': ('v1', 'api-docs'), 'DEFAULT_PAGINATION_CLASS': - 'rest_framework.pagination.PageNumberPagination', + 'cvat.apps.engine.pagination.CustomPagination', 'PAGE_SIZE': 10, 'DEFAULT_FILTER_BACKENDS': ( 'rest_framework.filters.SearchFilter', @@ -159,7 +160,7 @@ def generate_ssh_keys(): if 'yes' == os.environ.get('OPENVINO_TOOLKIT', 'no'): INSTALLED_APPS += ['cvat.apps.auto_annotation'] -if 'yes' == os.environ.get('OPENVINO_TOOLKIT', 'no'): +if 'yes' == os.environ.get('OPENVINO_TOOLKIT', 'no') and os.environ.get('REID_MODEL_DIR', ''): INSTALLED_APPS += ['cvat.apps.reid'] if 'yes' == os.environ.get('WITH_DEXTR', 'no'): @@ -175,13 +176,15 @@ def generate_ssh_keys(): MIDDLEWARE = [ 'django.middleware.security.SecurityMiddleware', 'django.contrib.sessions.middleware.SessionMiddleware', + 'corsheaders.middleware.CorsMiddleware', 'django.middleware.common.CommonMiddleware', 'django.middleware.csrf.CsrfViewMiddleware', + # FIXME + # 'corsheaders.middleware.CorsPostCsrfMiddleware', 'django.contrib.auth.middleware.AuthenticationMiddleware', 'django.contrib.messages.middleware.MessageMiddleware', 'django.middleware.clickjacking.XFrameOptionsMiddleware', 'dj_pagination.middleware.PaginationMiddleware', - 'corsheaders.middleware.CorsMiddleware', ] # Cross-Origin Resource Sharing settings for CVAT UI @@ -190,8 +193,12 @@ def generate_ssh_keys(): UI_PORT = os.environ.get('UI_PORT', '3000') CORS_ALLOW_CREDENTIALS = True CSRF_TRUSTED_ORIGINS = [UI_HOST] -UI_URL = '{}://{}:{}'.format(UI_SCHEME, UI_HOST, UI_PORT) +UI_URL = '{}://{}'.format(UI_SCHEME, UI_HOST) +if len(UI_URL): + UI_URL += ':{}'.format(UI_PORT) + CORS_ORIGIN_WHITELIST = [UI_URL] +CORS_REPLACE_HTTPS_REFERER = True STATICFILES_FINDERS = [ 'django.contrib.staticfiles.finders.FileSystemFinder', diff --git a/cvat/urls.py b/cvat/urls.py index c40a942d2e78..6ae59f6b03aa 100644 --- a/cvat/urls.py +++ b/cvat/urls.py @@ -1,5 +1,5 @@ -# Copyright (C) 2018 Intel Corporation +# Copyright (C) 2018-2019 Intel Corporation # # SPDX-License-Identifier: MIT @@ -18,17 +18,14 @@ 1. Import the include() function: from django.urls import include, path 2. Add a URL to urlpatterns: path('blog/', include('blog.urls')) """ + from django.contrib import admin from django.urls import path, include -from django.conf import settings -from django.conf.urls.static import static from django.apps import apps -import os urlpatterns = [ path('admin/', admin.site.urls), path('', include('cvat.apps.engine.urls')), - path('dashboard/', include('cvat.apps.dashboard.urls')), path('django-rq/', include('django_rq.urls')), path('auth/', include('cvat.apps.authentication.urls')), path('documentation/', include('cvat.apps.documentation.urls')), diff --git a/datumaro/README.md b/datumaro/README.md new file mode 100644 index 000000000000..e7b58f54e90b --- /dev/null +++ b/datumaro/README.md @@ -0,0 +1,36 @@ +# Dataset framework + +A framework to prepare, manage, build, analyze datasets + +## Documentation + +-[Quick start guide](docs/quickstart.md) + +## Installation + +Python3.5+ is required. + +To install into a virtual environment do: + +``` bash +python -m pip install virtualenv +python -m virtualenv venv +. venv/bin/activate +pip install -r requirements.txt +``` + +## Execution + +The tool can be executed both as a script and as a module. + +``` bash +PYTHONPATH="..." +python -m datumaro +python path/to/datum.py +``` + +## Testing + +``` bash +python -m unittest discover -s tests +``` diff --git a/datumaro/datum.py b/datumaro/datum.py new file mode 100755 index 000000000000..d6ae4d2c85de --- /dev/null +++ b/datumaro/datum.py @@ -0,0 +1,8 @@ +#!/usr/bin/env python +import sys + +from datumaro import main + + +if __name__ == '__main__': + sys.exit(main()) diff --git a/datumaro/datumaro/__init__.py b/datumaro/datumaro/__init__.py new file mode 100644 index 000000000000..ea5ad68ed7be --- /dev/null +++ b/datumaro/datumaro/__init__.py @@ -0,0 +1,93 @@ + +# Copyright (C) 2019 Intel Corporation +# +# SPDX-License-Identifier: MIT + +import argparse +import logging as log +import sys + +from .cli import ( + project as project_module, + source as source_module, + item as item_module, + model as model_module, + # inference as inference_module, + + create_command as create_command_module, + add_command as add_command_module, + remove_command as remove_command_module, + export_command as export_command_module, + # diff_command as diff_command_module, + # build_command as build_command_module, + stats_command as stats_command_module, + explain_command as explain_command_module, +) +from .version import VERSION + + +KNOWN_COMMANDS = { + # contexts + 'project': project_module.main, + 'source': source_module.main, + 'item': item_module.main, + 'model': model_module.main, + # 'inference': inference_module.main, + + # shortcuts + 'create': create_command_module.main, + 'add': add_command_module.main, + 'remove': remove_command_module.main, + 'export': export_command_module.main, + # 'diff': diff_command_module.main, + # 'build': build_command_module.main, + 'stats': stats_command_module.main, + 'explain': explain_command_module.main, +} + +def get_command(name, args=None): + return KNOWN_COMMANDS[name] + +def loglevel(name): + numeric = getattr(log, name.upper(), None) + if not isinstance(numeric, int): + raise ValueError('Invalid log level: %s' % name) + return numeric + +def parse_command(input_args): + parser = argparse.ArgumentParser() + parser.add_argument('command', choices=KNOWN_COMMANDS.keys(), + help='A command to execute') + parser.add_argument('args', nargs=argparse.REMAINDER) + parser.add_argument('--version', action='version', version=VERSION) + parser.add_argument('--loglevel', type=loglevel, default='info', + help="Logging level (default: %(default)s)") + + general_args = parser.parse_args(input_args) + command_name = general_args.command + command_args = general_args.args + return general_args, command_name, command_args + +def set_up_logger(general_args): + loglevel = general_args.loglevel + log.basicConfig(format='%(asctime)s %(levelname)s: %(message)s', + level=loglevel) + +def main(args=None): + if args is None: + args = sys.argv[1:] + + general_args, command_name, command_args = parse_command(args) + + set_up_logger(general_args) + + command = get_command(command_name, general_args) + try: + return command(command_args) + except Exception as e: + log.error(e) + raise + + +if __name__ == '__main__': + sys.exit(main()) diff --git a/datumaro/datumaro/__main__.py b/datumaro/datumaro/__main__.py new file mode 100644 index 000000000000..9a055fae8f16 --- /dev/null +++ b/datumaro/datumaro/__main__.py @@ -0,0 +1,12 @@ + +# Copyright (C) 2019 Intel Corporation +# +# SPDX-License-Identifier: MIT + +import sys +from . import main + + +if __name__ == '__main__': + sys.exit(main()) + diff --git a/datumaro/datumaro/cli/__init__.py b/datumaro/datumaro/cli/__init__.py new file mode 100644 index 000000000000..a9773073830c --- /dev/null +++ b/datumaro/datumaro/cli/__init__.py @@ -0,0 +1,5 @@ + +# Copyright (C) 2019 Intel Corporation +# +# SPDX-License-Identifier: MIT + diff --git a/datumaro/datumaro/cli/add_command.py b/datumaro/datumaro/cli/add_command.py new file mode 100644 index 000000000000..49113084b4e1 --- /dev/null +++ b/datumaro/datumaro/cli/add_command.py @@ -0,0 +1,21 @@ + +# Copyright (C) 2019 Intel Corporation +# +# SPDX-License-Identifier: MIT + +import argparse + +from . import source as source_module + + +def build_parser(parser=argparse.ArgumentParser()): + source_module.build_add_parser(parser). \ + set_defaults(command=source_module.add_command) + + return parser + +def main(args=None): + parser = build_parser() + args = parser.parse_args(args) + + return args.command(args) diff --git a/datumaro/datumaro/cli/create_command.py b/datumaro/datumaro/cli/create_command.py new file mode 100644 index 000000000000..eb52458be0e6 --- /dev/null +++ b/datumaro/datumaro/cli/create_command.py @@ -0,0 +1,21 @@ + +# Copyright (C) 2019 Intel Corporation +# +# SPDX-License-Identifier: MIT + +import argparse + +from . import project as project_module + + +def build_parser(parser=argparse.ArgumentParser()): + project_module.build_create_parser(parser) \ + .set_defaults(command=project_module.create_command) + + return parser + +def main(args=None): + parser = build_parser() + args = parser.parse_args(args) + + return args.command(args) diff --git a/datumaro/datumaro/cli/explain_command.py b/datumaro/datumaro/cli/explain_command.py new file mode 100644 index 000000000000..8a83f7dafa7a --- /dev/null +++ b/datumaro/datumaro/cli/explain_command.py @@ -0,0 +1,192 @@ + +# Copyright (C) 2019 Intel Corporation +# +# SPDX-License-Identifier: MIT + +import argparse +import logging as log +import os +import os.path as osp + +from datumaro.components.project import Project +from datumaro.components.algorithms.rise import RISE +from datumaro.util.command_targets import (TargetKinds, target_selector, + ProjectTarget, SourceTarget, ImageTarget, is_project_path) +from datumaro.util.image import load_image, save_image +from .util.project import load_project + + +def build_parser(parser=argparse.ArgumentParser()): + parser.add_argument('-m', '--model', required=True, + help="Model to use for inference") + parser.add_argument('-t', '--target', default=None, + help="Inference target - image, source, project " + "(default: current dir)") + parser.add_argument('-d', '--save-dir', default=None, + help="Directory to save output (default: display only)") + + method_sp = parser.add_subparsers(dest='algorithm') + + rise_parser = method_sp.add_parser('rise') + rise_parser.add_argument('-s', '--max-samples', default=None, type=int, + help="Number of algorithm iterations (default: mask size ^ 2)") + rise_parser.add_argument('--mw', '--mask-width', + dest='mask_width', default=7, type=int, + help="Mask width (default: %(default)s)") + rise_parser.add_argument('--mh', '--mask-height', + dest='mask_height', default=7, type=int, + help="Mask height (default: %(default)s)") + rise_parser.add_argument('--prob', default=0.5, type=float, + help="Mask pixel inclusion probability (default: %(default)s)") + rise_parser.add_argument('--iou', '--iou-thresh', + dest='iou_thresh', default=0.9, type=float, + help="IoU match threshold for detections (default: %(default)s)") + rise_parser.add_argument('--nms', '--nms-iou-thresh', + dest='nms_iou_thresh', default=0.0, type=float, + help="IoU match threshold in Non-maxima suppression (default: no NMS)") + rise_parser.add_argument('--conf', '--det-conf-thresh', + dest='det_conf_thresh', default=0.0, type=float, + help="Confidence threshold for detections (default: do not filter)") + rise_parser.add_argument('-b', '--batch-size', default=1, type=int, + help="Inference batch size (default: %(default)s)") + rise_parser.add_argument('--progressive', action='store_true', + help="Visualize results during computations") + + parser.add_argument('-p', '--project', dest='project_dir', default='.', + help="Directory of the project to operate on (default: current dir)") + parser.set_defaults(command=explain_command) + + return parser + +def explain_command(args): + import cv2 + from matplotlib import cm + + project = load_project(args.project_dir) + + model = project.make_executable_model(args.model) + + if str(args.algorithm).lower() != 'rise': + raise NotImplementedError() + + rise = RISE(model, + max_samples=args.max_samples, + mask_width=args.mask_width, + mask_height=args.mask_height, + prob=args.prob, + iou_thresh=args.iou_thresh, + nms_thresh=args.nms_iou_thresh, + det_conf_thresh=args.det_conf_thresh, + batch_size=args.batch_size) + + if args.target[0] == TargetKinds.image: + image_path = args.target[1] + image = load_image(image_path) + if model.preferred_input_size() is not None: + h, w = model.preferred_input_size() + image = cv2.resize(image, (w, h)) + + log.info("Running inference explanation for '%s'" % image_path) + heatmap_iter = rise.apply(image, progressive=args.progressive) + + image = image / 255.0 + file_name = osp.splitext(osp.basename(image_path))[0] + if args.progressive: + for i, heatmaps in enumerate(heatmap_iter): + for j, heatmap in enumerate(heatmaps): + hm_painted = cm.jet(heatmap)[:, :, 2::-1] + disp = (image + hm_painted) / 2 + cv2.imshow('heatmap-%s' % j, hm_painted) + cv2.imshow(file_name + '-heatmap-%s' % j, disp) + cv2.waitKey(10) + print("Iter", i, "of", args.max_samples, end='\r') + else: + heatmaps = next(heatmap_iter) + + if args.save_dir is not None: + log.info("Saving inference heatmaps at '%s'" % args.save_dir) + os.makedirs(args.save_dir, exist_ok=True) + + for j, heatmap in enumerate(heatmaps): + save_path = osp.join(args.save_dir, + file_name + '-heatmap-%s.png' % j) + save_image(save_path, heatmap * 255.0) + else: + for j, heatmap in enumerate(heatmaps): + disp = (image + cm.jet(heatmap)[:, :, 2::-1]) / 2 + cv2.imshow(file_name + '-heatmap-%s' % j, disp) + cv2.waitKey(0) + elif args.target[0] == TargetKinds.source or \ + args.target[0] == TargetKinds.project: + if args.target[0] == TargetKinds.source: + source_name = args.target[1] + dataset = project.make_source_project(source_name).make_dataset() + log.info("Running inference explanation for '%s'" % source_name) + else: + project_name = project.config.project_name + dataset = project.make_dataset() + log.info("Running inference explanation for '%s'" % project_name) + + for item in dataset: + image = item.image + if image is None: + log.warn( + "Dataset item %s does not have image data. Skipping." % \ + (item.id)) + continue + + if model.preferred_input_size() is not None: + h, w = model.preferred_input_size() + image = cv2.resize(image, (w, h)) + heatmap_iter = rise.apply(image) + + image = image / 255.0 + file_name = osp.splitext(osp.basename(image_path))[0] + heatmaps = next(heatmap_iter) + + if args.save_dir is not None: + log.info("Saving inference heatmaps at '%s'" % args.save_dir) + os.makedirs(args.save_dir, exist_ok=True) + + for j, heatmap in enumerate(heatmaps): + save_path = osp.join(args.save_dir, + file_name + '-heatmap-%s.png' % j) + save_image(save_path, heatmap * 255.0) + + if args.progressive: + for j, heatmap in enumerate(heatmaps): + disp = (image + cm.jet(heatmap)[:, :, 2::-1]) / 2 + cv2.imshow(file_name + '-heatmap-%s' % j, disp) + cv2.waitKey(0) + else: + raise NotImplementedError() + + return 0 + +def main(args=None): + parser = build_parser() + args = parser.parse_args(args) + if 'command' not in args: + parser.print_help() + return 1 + + project_path = args.project_dir + if is_project_path(project_path): + project = Project.load(project_path) + else: + project = None + try: + args.target = target_selector( + ProjectTarget(is_default=True, project=project), + SourceTarget(project=project), + ImageTarget() + )(args.target) + if args.target[0] == TargetKinds.project: + if is_project_path(args.target[1]): + args.project_dir = osp.dirname(osp.abspath(args.target[1])) + except argparse.ArgumentTypeError as e: + print(e) + parser.print_help() + return 1 + + return args.command(args) diff --git a/datumaro/datumaro/cli/export_command.py b/datumaro/datumaro/cli/export_command.py new file mode 100644 index 000000000000..3bd3efe68d58 --- /dev/null +++ b/datumaro/datumaro/cli/export_command.py @@ -0,0 +1,69 @@ + +# Copyright (C) 2019 Intel Corporation +# +# SPDX-License-Identifier: MIT + +import argparse +import os.path as osp + +from datumaro.components.project import Project +from datumaro.util.command_targets import (TargetKinds, target_selector, + ProjectTarget, SourceTarget, ImageTarget, ExternalDatasetTarget, + is_project_path +) + +from . import project as project_module +from . import source as source_module +from . import item as item_module + + +def export_external_dataset(target, params): + raise NotImplementedError() + +def build_parser(parser=argparse.ArgumentParser()): + parser.add_argument('target', nargs='?', default=None) + parser.add_argument('params', nargs=argparse.REMAINDER) + + parser.add_argument('-p', '--project', dest='project_dir', default='.', + help="Directory of the project to operate on (default: current dir)") + + return parser + +def process_command(target, params, args): + project_dir = args.project_dir + target_kind, target_value = target + if target_kind == TargetKinds.project: + return project_module.main(['export', '-p', target_value] + params) + elif target_kind == TargetKinds.source: + return source_module.main(['export', '-p', project_dir, '-n', target_value] + params) + elif target_kind == TargetKinds.item: + return item_module.main(['export', '-p', project_dir, target_value] + params) + elif target_kind == TargetKinds.external_dataset: + return export_external_dataset(target_value, params) + return 1 + +def main(args=None): + parser = build_parser() + args = parser.parse_args(args) + + project_path = args.project_dir + if is_project_path(project_path): + project = Project.load(project_path) + else: + project = None + try: + args.target = target_selector( + ProjectTarget(is_default=True, project=project), + SourceTarget(project=project), + ExternalDatasetTarget(), + ImageTarget() + )(args.target) + if args.target[0] == TargetKinds.project: + if is_project_path(args.target[1]): + args.project_dir = osp.dirname(osp.abspath(args.target[1])) + except argparse.ArgumentTypeError as e: + print(e) + parser.print_help() + return 1 + + return process_command(args.target, args.params, args) diff --git a/datumaro/datumaro/cli/inference/__init__.py b/datumaro/datumaro/cli/inference/__init__.py new file mode 100644 index 000000000000..f5d48b7cff38 --- /dev/null +++ b/datumaro/datumaro/cli/inference/__init__.py @@ -0,0 +1,33 @@ + +# Copyright (C) 2019 Intel Corporation +# +# SPDX-License-Identifier: MIT + +import argparse + + +def run_command(args): + return 0 + +def build_run_parser(parser): + return parser + +def build_parser(parser=argparse.ArgumentParser()): + command_parsers = parser.add_subparsers(dest='command') + + build_run_parser(command_parsers.add_parser('run')). \ + set_defaults(command=run_command) + + return parser + +def process_command(command, args): + return 0 + +def main(args=None): + parser = build_parser() + args = parser.parse_args(args) + if 'command' not in args: + parser.print_help() + return 1 + + return args.command(args) diff --git a/datumaro/datumaro/cli/item/__init__.py b/datumaro/datumaro/cli/item/__init__.py new file mode 100644 index 000000000000..6082932a1570 --- /dev/null +++ b/datumaro/datumaro/cli/item/__init__.py @@ -0,0 +1,38 @@ + +# Copyright (C) 2019 Intel Corporation +# +# SPDX-License-Identifier: MIT + +import argparse + + +def build_export_parser(parser): + return parser + +def build_stats_parser(parser): + return parser + +def build_diff_parser(parser): + return parser + +def build_edit_parser(parser): + return parser + +def build_parser(parser=argparse.ArgumentParser()): + command_parsers = parser.add_subparsers(dest='command_name') + + build_export_parser(command_parsers.add_parser('export')) + build_stats_parser(command_parsers.add_parser('stats')) + build_diff_parser(command_parsers.add_parser('diff')) + build_edit_parser(command_parsers.add_parser('edit')) + + return parser + +def main(args=None): + parser = build_parser() + args = parser.parse_args(args) + if 'command' not in args: + parser.print_help() + return 1 + + return args.command(args) diff --git a/datumaro/datumaro/cli/model/__init__.py b/datumaro/datumaro/cli/model/__init__.py new file mode 100644 index 000000000000..b168248f1c4a --- /dev/null +++ b/datumaro/datumaro/cli/model/__init__.py @@ -0,0 +1,127 @@ + +# Copyright (C) 2019 Intel Corporation +# +# SPDX-License-Identifier: MIT + +import argparse +import logging as log +import os +import os.path as osp +import shutil + +from ..util.project import load_project + + +def add_command(args): + project = load_project(args.project_dir) + + log.info("Adding '%s' model to '%s' project" % \ + (args.launcher, project.config.project_name)) + + options = args.launcher_args_extractor(args) + + if args.launcher == 'openvino' and args.copy: + config = project.config + env_config = project.env.config + + model_dir_rel = osp.join( + config.env_dir, env_config.models_dir, args.name) + model_dir = osp.join( + config.project_dir, model_dir_rel) + + os.makedirs(model_dir, exist_ok=True) + + shutil.copy(options.description, + osp.join(model_dir, osp.basename(options.description))) + options.description = \ + osp.join(model_dir_rel, osp.basename(options.description)) + + shutil.copy(options.weights, + osp.join(model_dir, osp.basename(options.weights))) + options.weights = \ + osp.join(model_dir_rel, osp.basename(options.weights)) + + shutil.copy(options.interpretation_script, + osp.join(model_dir, osp.basename(options.interpretation_script))) + options.interpretation_script = \ + osp.join(model_dir_rel, osp.basename(options.interpretation_script)) + + project.add_model(args.name, { + 'launcher': args.launcher, + 'options': vars(options), + }) + + project.save() + + return 0 + +def build_openvino_add_parser(parser): + parser.add_argument('-d', '--description', required=True, + help="Path to the model description file (.xml)") + parser.add_argument('-w', '--weights', required=True, + help="Path to the model weights file (.bin)") + parser.add_argument('-i', '--interpretation-script', required=True, + help="Path to the network output interpretation script (.py)") + parser.add_argument('--plugins-path', default=None, + help="Path to the custom Inference Engine plugins directory") + parser.add_argument('--copy', action='store_true', + help="Copy the model data to the project") + return parser + +def openvino_args_extractor(args): + my_args = argparse.Namespace() + my_args.description = args.description + my_args.weights = args.weights + my_args.interpretation_script = args.interpretation_script + my_args.plugins_path = args.plugins_path + return my_args + +def build_add_parser(parser): + parser.add_argument('name', + help="Name of the model to be added") + launchers_sp = parser.add_subparsers(dest='launcher') + + build_openvino_add_parser(launchers_sp.add_parser('openvino')) \ + .set_defaults(launcher_args_extractor=openvino_args_extractor) + + parser.add_argument('-p', '--project', dest='project_dir', default='.', + help="Directory of the project to operate on (default: current dir)") + return parser + + +def remove_command(args): + project = load_project(args.project_dir) + + project.remove_model(args.name) + project.save() + + return 0 + +def build_remove_parser(parser): + parser.add_argument('name', + help="Name of the model to be removed") + parser.add_argument('-p', '--project', dest='project_dir', default='.', + help="Directory of the project to operate on (default: current dir)") + + return parser + + +def build_parser(parser=argparse.ArgumentParser()): + command_parsers = parser.add_subparsers(dest='command_name') + + build_add_parser(command_parsers.add_parser('add')) \ + .set_defaults(command=add_command) + + build_remove_parser(command_parsers.add_parser('remove')) \ + .set_defaults(command=remove_command) + + return parser + +def main(args=None): + parser = build_parser() + args = parser.parse_args(args) + if 'command' not in args: + parser.print_help() + return 1 + + return args.command(args) diff --git a/datumaro/datumaro/cli/project/__init__.py b/datumaro/datumaro/cli/project/__init__.py new file mode 100644 index 000000000000..bd43a72db51c --- /dev/null +++ b/datumaro/datumaro/cli/project/__init__.py @@ -0,0 +1,306 @@ + +# Copyright (C) 2019 Intel Corporation +# +# SPDX-License-Identifier: MIT + +import argparse +import logging as log +import os +import os.path as osp + +from datumaro.components.project import Project +from datumaro.components.comparator import Comparator +from .diff import DiffVisualizer +from ..util.project import make_project_path, load_project + + +def build_create_parser(parser): + parser.add_argument('-d', '--dest', default='.', dest='dst_dir', + help="Save directory for the new project (default: current dir") + parser.add_argument('-n', '--name', default=None, + help="Name of the new project (default: same as project dir)") + parser.add_argument('--overwrite', action='store_true', + help="Overwrite existing files in the save directory") + return parser + +def create_command(args): + project_dir = osp.abspath(args.dst_dir) + project_path = make_project_path(project_dir) + + if not args.overwrite and osp.isdir(project_dir) and os.listdir(project_dir): + log.error("Directory '%s' already exists " + "(pass --overwrite to force creation)" % project_dir) + return 1 + os.makedirs(project_dir, exist_ok=args.overwrite) + + if not args.overwrite and osp.isfile(project_path): + log.error("Project file '%s' already exists " + "(pass --overwrite to force creation)" % project_path) + return 1 + + project_name = args.name + if project_name is None: + project_name = osp.basename(project_dir) + + log.info("Creating project at '%s'" % (project_dir)) + + Project.generate(project_dir, { + 'project_name': project_name, + }) + + log.info("Project has been created at '%s'" % (project_dir)) + + return 0 + +def build_import_parser(parser): + import datumaro.components.importers as importers_module + importers_list = [name for name, cls in importers_module.items] + + parser.add_argument('-s', '--source', required=True, + help="Path to import a project from") + parser.add_argument('-f', '--format', required=True, + help="Source project format (options: %s)" % (', '.join(importers_list))) + parser.add_argument('-d', '--dest', default='.', dest='dst_dir', + help="Directory to save the new project to (default: current dir)") + parser.add_argument('-n', '--name', default=None, + help="Name of the new project (default: same as project dir)") + parser.add_argument('--overwrite', action='store_true', + help="Overwrite existing files in the save directory") + parser.add_argument('--copy', action='store_true', + help="Copy the dataset instead of saving source links") + # parser.add_argument('extra_args', nargs=argparse.REMAINDER, + # help="Additional arguments for importer (pass '-- -h' for help)") + return parser + +def import_command(args): + project_dir = osp.abspath(args.dst_dir) + project_path = make_project_path(project_dir) + + if not args.overwrite and osp.isdir(project_dir) and os.listdir(project_dir): + log.error("Directory '%s' already exists " + "(pass --overwrite to force creation)" % project_dir) + return 1 + os.makedirs(project_dir, exist_ok=args.overwrite) + + if not args.overwrite and osp.isfile(project_path): + log.error("Project file '%s' already exists " + "(pass --overwrite to force creation)" % project_path) + return 1 + + project_name = args.name + if project_name is None: + project_name = osp.basename(project_dir) + + log.info("Importing project from '%s' as '%s'" % \ + (args.source, args.format)) + + source = osp.abspath(args.source) + project = Project.import_from(source, args.format) + project.config.project_name = project_name + project.config.project_dir = project_dir + + dataset = project.make_dataset() + if args.copy: + log.info("Cloning data...") + dataset.save(merge=True, save_images=True) + else: + project.save() + + log.info("Project has been created at '%s'" % (project_dir)) + + return 0 + +def build_build_parser(parser): + return parser + +def build_export_parser(parser): + parser.add_argument('-e', '--filter', default=None, + help="Filter expression for dataset items. Examples: " + "extract images with width < height: " + "'/item[image/width < image/height]'; " + "extract images with large-area bboxes: " + "'/item[annotation/type=\"bbox\" and annotation/area>2000]'" + ) + parser.add_argument('-d', '--dest', dest='dst_dir', required=True, + help="Directory to save output") + parser.add_argument('-f', '--output-format', required=True, + help="Output format") + parser.add_argument('-p', '--project', dest='project_dir', default='.', + help="Directory of the project to operate on (default: current dir)") + parser.add_argument('extra_args', nargs=argparse.REMAINDER, default=None, + help="Additional arguments for converter (pass '-- -h' for help)") + return parser + +def export_command(args): + project = load_project(args.project_dir) + + dst_dir = osp.abspath(args.dst_dir) + os.makedirs(dst_dir, exist_ok=False) + + project.make_dataset().export( + save_dir=dst_dir, + output_format=args.output_format, + filter_expr=args.filter, + cmdline_args=args.extra_args) + log.info("Project exported to '%s' as '%s'" % \ + (dst_dir, args.output_format)) + + return 0 + +def build_stats_parser(parser): + parser.add_argument('name') + return parser + +def build_docs_parser(parser): + return parser + +def build_extract_parser(parser): + parser.add_argument('-e', '--filter', default=None, + help="Filter expression for dataset items. Examples: " + "extract images with width < height: " + "'/item[image/width < image/height]'; " + "extract images with large-area bboxes: " + "'/item[annotation/type=\"bbox\" and annotation/area>2000]'" + ) + parser.add_argument('-d', '--dest', dest='dst_dir', required=True, + help="Output directory") + parser.add_argument('-p', '--project', dest='project_dir', default='.', + help="Directory of the project to operate on (default: current dir)") + return parser + +def extract_command(args): + project = load_project(args.project_dir) + + dst_dir = osp.abspath(args.dst_dir) + os.makedirs(dst_dir, exist_ok=False) + + project.make_dataset().extract(filter_expr=args.filter, save_dir=dst_dir) + log.info("Subproject extracted to '%s'" % (dst_dir)) + + return 0 + +def build_merge_parser(parser): + parser.add_argument('other_project_dir', + help="Directory of the project to get data updates from") + parser.add_argument('-d', '--dest', dest='dst_dir', default=None, + help="Output directory (default: current project's dir)") + parser.add_argument('-p', '--project', dest='project_dir', default='.', + help="Directory of the project to operate on (default: current dir)") + return parser + +def merge_command(args): + first_project = load_project(args.project_dir) + second_project = load_project(args.other_project_dir) + + first_dataset = first_project.make_dataset() + first_dataset.update(second_project.make_dataset()) + + dst_dir = args.dst_dir + first_dataset.save(save_dir=dst_dir) + + if dst_dir is None: + dst_dir = first_project.config.project_dir + dst_dir = osp.abspath(dst_dir) + log.info("Merge result saved to '%s'" % (dst_dir)) + + return 0 + +def build_diff_parser(parser): + parser.add_argument('other_project_dir', + help="Directory of the second project to be compared") + parser.add_argument('-d', '--dest', default=None, dest='dst_dir', + help="Directory to save comparison results (default: do not save)") + parser.add_argument('-f', '--output-format', + default=DiffVisualizer.DEFAULT_FORMAT, + choices=[f.name for f in DiffVisualizer.Format], + help="Output format (default: %(default)s)") + parser.add_argument('--iou-thresh', default=0.5, type=float, + help="IoU match threshold for detections (default: %(default)s)") + parser.add_argument('--conf-thresh', default=0.5, type=float, + help="Confidence threshold for detections (default: %(default)s)") + parser.add_argument('-p', '--project', dest='project_dir', default='.', + help="Directory of the first project to be compared (default: current dir)") + return parser + +def diff_command(args): + first_project = load_project(args.project_dir) + second_project = load_project(args.other_project_dir) + + comparator = Comparator( + iou_threshold=args.iou_thresh, + conf_threshold=args.conf_thresh) + + save_dir = args.dst_dir + if save_dir is not None: + log.info("Saving diff to '%s'" % save_dir) + os.makedirs(osp.abspath(save_dir)) + visualizer = DiffVisualizer(save_dir=save_dir, comparator=comparator, + output_format=args.output_format) + visualizer.save_dataset_diff( + first_project.make_dataset(), + second_project.make_dataset()) + + return 0 + +def build_transform_parser(parser): + parser.add_argument('-d', '--dest', dest='dst_dir', required=True, + help="Directory to save output") + parser.add_argument('-m', '--model', dest='model_name', required=True, + help="Model to apply to the project") + parser.add_argument('-f', '--output-format', required=True, + help="Output format") + parser.add_argument('-p', '--project', dest='project_dir', default='.', + help="Directory of the project to operate on (default: current dir)") + return parser + +def transform_command(args): + project = load_project(args.project_dir) + + dst_dir = osp.abspath(args.dst_dir) + os.makedirs(dst_dir, exist_ok=False) + project.make_dataset().transform( + save_dir=dst_dir, + model_name=args.model_name) + + log.info("Transform results saved to '%s'" % (dst_dir)) + + return 0 + + +def build_parser(parser=argparse.ArgumentParser()): + command_parsers = parser.add_subparsers(dest='command_name') + + build_create_parser(command_parsers.add_parser('create')) \ + .set_defaults(command=create_command) + + build_import_parser(command_parsers.add_parser('import')) \ + .set_defaults(command=import_command) + + build_export_parser(command_parsers.add_parser('export')) \ + .set_defaults(command=export_command) + + build_extract_parser(command_parsers.add_parser('extract')) \ + .set_defaults(command=extract_command) + + build_merge_parser(command_parsers.add_parser('merge')) \ + .set_defaults(command=merge_command) + + build_build_parser(command_parsers.add_parser('build')) + build_stats_parser(command_parsers.add_parser('stats')) + build_docs_parser(command_parsers.add_parser('docs')) + build_diff_parser(command_parsers.add_parser('diff')) \ + .set_defaults(command=diff_command) + + build_transform_parser(command_parsers.add_parser('transform')) \ + .set_defaults(command=transform_command) + + return parser + +def main(args=None): + parser = build_parser() + args = parser.parse_args(args) + if 'command' not in args: + parser.print_help() + return 1 + + return args.command(args) diff --git a/datumaro/datumaro/cli/project/diff.py b/datumaro/datumaro/cli/project/diff.py new file mode 100644 index 000000000000..78fdcd51a1f7 --- /dev/null +++ b/datumaro/datumaro/cli/project/diff.py @@ -0,0 +1,281 @@ + +# Copyright (C) 2019 Intel Corporation +# +# SPDX-License-Identifier: MIT + +from collections import Counter +from enum import Enum +import numpy as np +import os +import os.path as osp + +_formats = ['simple'] + +import warnings +with warnings.catch_warnings(): + warnings.simplefilter("ignore") + import tensorboardX as tb + _formats.append('tensorboard') + +from datumaro.components.extractor import AnnotationType +from datumaro.util.image import save_image + + +Format = Enum('Formats', _formats) + +class DiffVisualizer: + Format = Format + DEFAULT_FORMAT = Format.simple + + _UNMATCHED_LABEL = -1 + + + def __init__(self, comparator, save_dir, output_format=DEFAULT_FORMAT): + self.comparator = comparator + + if isinstance(output_format, str): + output_format = Format[output_format] + assert output_format in Format + self.output_format = output_format + + self.save_dir = save_dir + if output_format is Format.tensorboard: + logdir = osp.join(self.save_dir, 'logs', 'diff') + self.file_writer = tb.SummaryWriter(logdir) + if output_format is Format.simple: + self.label_diff_writer = None + + self.categories = {} + + self.label_confusion_matrix = Counter() + self.bbox_confusion_matrix = Counter() + + def save_dataset_diff(self, extractor_a, extractor_b): + if self.save_dir: + os.makedirs(self.save_dir, exist_ok=True) + + if len(extractor_a) != len(extractor_b): + print("Datasets have different lengths: %s vs %s" % \ + (len(extractor_a), len(extractor_b))) + + self.categories = {} + + label_mismatch = self.comparator. \ + compare_dataset_labels(extractor_a, extractor_b) + if label_mismatch is None: + print("Datasets have no label information") + elif len(label_mismatch) != 0: + print("Datasets have mismatching labels:") + for a_label, b_label in label_mismatch: + if a_label is None: + print(" > %s" % b_label.name) + elif b_label is None: + print(" < %s" % a_label.name) + else: + print(" %s != %s" % (a_label.name, b_label.name)) + else: + self.categories.update(extractor_a.categories()) + self.categories.update(extractor_b.categories()) + + self.label_confusion_matrix = Counter() + self.bbox_confusion_matrix = Counter() + + if self.output_format is Format.tensorboard: + self.file_writer.reopen() + + for i, (item_a, item_b) in enumerate(zip(extractor_a, extractor_b)): + if item_a.id != item_b.id or not item_a.id or not item_b.id: + print("Dataset items #%s '%s' '%s' do not match" % \ + (i + 1, item_a.id, item_b.id)) + continue + + label_diff = self.comparator.compare_item_labels(item_a, item_b) + self.update_label_confusion(label_diff) + + bbox_diff = self.comparator.compare_item_bboxes(item_a, item_b) + self.update_bbox_confusion(bbox_diff) + + self.save_item_label_diff(item_a, item_b, label_diff) + self.save_item_bbox_diff(item_a, item_b, bbox_diff) + + if len(self.label_confusion_matrix) != 0: + self.save_conf_matrix(self.label_confusion_matrix, + 'labels_confusion.png') + if len(self.bbox_confusion_matrix) != 0: + self.save_conf_matrix(self.bbox_confusion_matrix, + 'bbox_confusion.png') + + if self.output_format is Format.tensorboard: + self.file_writer.flush() + self.file_writer.close() + elif self.output_format is Format.simple: + if self.label_diff_writer: + self.label_diff_writer.flush() + self.label_diff_writer.close() + + def update_label_confusion(self, label_diff): + matches, a_unmatched, b_unmatched = label_diff + for label in matches: + self.label_confusion_matrix[(label, label)] += 1 + for a_label in a_unmatched: + self.label_confusion_matrix[(a_label, self._UNMATCHED_LABEL)] += 1 + for b_label in b_unmatched: + self.label_confusion_matrix[(self._UNMATCHED_LABEL, b_label)] += 1 + + def update_bbox_confusion(self, bbox_diff): + matches, mispred, a_unmatched, b_unmatched = bbox_diff + for a_bbox, b_bbox in matches: + self.bbox_confusion_matrix[(a_bbox.label, b_bbox.label)] += 1 + for a_bbox, b_bbox in mispred: + self.bbox_confusion_matrix[(a_bbox.label, b_bbox.label)] += 1 + for a_bbox in a_unmatched: + self.bbox_confusion_matrix[(a_bbox.label, self._UNMATCHED_LABEL)] += 1 + for b_bbox in b_unmatched: + self.bbox_confusion_matrix[(self._UNMATCHED_LABEL, b_bbox.label)] += 1 + + @classmethod + def draw_text_with_background(cls, frame, text, origin, + font=None, scale=1.0, + color=(0, 0, 0), thickness=1, bgcolor=(1, 1, 1)): + import cv2 + + if not font: + font = cv2.FONT_HERSHEY_SIMPLEX + + text_size, baseline = cv2.getTextSize(text, font, scale, thickness) + cv2.rectangle(frame, + tuple((origin + (0, baseline)).astype(int)), + tuple((origin + (text_size[0], -text_size[1])).astype(int)), + bgcolor, cv2.FILLED) + cv2.putText(frame, text, + tuple(origin.astype(int)), + font, scale, color, thickness) + return text_size, baseline + + def draw_detection_roi(self, frame, x, y, w, h, label, conf, color): + import cv2 + + cv2.rectangle(frame, (x, y), (x + w, y + h), color, 2) + + text = '%s %.2f%%' % (label, 100.0 * conf) + text_scale = 0.5 + font = cv2.FONT_HERSHEY_SIMPLEX + text_size = cv2.getTextSize(text, font, text_scale, 1) + line_height = np.array([0, text_size[0][1]]) + self.draw_text_with_background(frame, text, + np.array([x, y]) - line_height * 0.5, + font, scale=text_scale, color=[255 - c for c in color]) + + def get_label(self, label_id): + cat = self.categories.get(AnnotationType.label) + if cat is None: + return str(label_id) + return cat.items[label_id].name + + def draw_bbox(self, img, shape, color): + x, y, w, h = shape.get_bbox() + self.draw_detection_roi(img, int(x), int(y), int(w), int(h), + self.get_label(shape.label), shape.attributes.get('score', 1), + color) + + def get_label_diff_file(self): + if self.label_diff_writer is None: + self.label_diff_writer = \ + open(osp.join(self.save_dir, 'label_diff.txt'), 'w') + return self.label_diff_writer + + def save_item_label_diff(self, item_a, item_b, diff): + _, a_unmatched, b_unmatched = diff + + if 0 < len(a_unmatched) + len(b_unmatched): + if self.output_format is Format.simple: + f = self.get_label_diff_file() + f.write(item_a.id + '\n') + for a_label in a_unmatched: + f.write(' >%s\n' % self.get_label(a_label)) + for b_label in b_unmatched: + f.write(' <%s\n' % self.get_label(b_label)) + elif self.output_format is Format.tensorboard: + tag = item_a.id + for a_label in a_unmatched: + self.file_writer.add_text(tag, + '>%s\n' % self.get_label(a_label)) + for b_label in b_unmatched: + self.file_writer.add_text(tag, + '<%s\n' % self.get_label(b_label)) + + def save_item_bbox_diff(self, item_a, item_b, diff): + _, mispred, a_unmatched, b_unmatched = diff + + if 0 < len(a_unmatched) + len(b_unmatched) + len(mispred): + img_a = item_a.image.copy() + img_b = img_a.copy() + for a_bbox, b_bbox in mispred: + self.draw_bbox(img_a, a_bbox, (0, 255, 0)) + self.draw_bbox(img_b, b_bbox, (0, 0, 255)) + for a_bbox in a_unmatched: + self.draw_bbox(img_a, a_bbox, (255, 255, 0)) + for b_bbox in b_unmatched: + self.draw_bbox(img_b, b_bbox, (255, 255, 0)) + + img = np.hstack([img_a, img_b]) + + path = osp.join(self.save_dir, 'diff_%s' % item_a.id) + + if self.output_format is Format.simple: + save_image(path + '.png', img) + elif self.output_format is Format.tensorboard: + self.save_as_tensorboard(img, path) + + def save_as_tensorboard(self, img, name): + img = img[:, :, ::-1] # to RGB + img = np.transpose(img, (2, 0, 1)) # to (C, H, W) + img = img.astype(dtype=np.uint8) + self.file_writer.add_image(name, img) + + def save_conf_matrix(self, conf_matrix, filename): + import matplotlib.pyplot as plt + + classes = None + label_categories = self.categories.get(AnnotationType.label) + if label_categories is not None: + classes = { id: c.name for id, c in enumerate(label_categories.items) } + if classes is None: + classes = { c: 'label_%s' % c for c, _ in conf_matrix } + classes[self._UNMATCHED_LABEL] = 'unmatched' + + class_idx = { id: i for i, id in enumerate(classes.keys()) } + matrix = np.zeros((len(classes), len(classes)), dtype=int) + for idx_pair in conf_matrix: + index = (class_idx[idx_pair[0]], class_idx[idx_pair[1]]) + matrix[index] = conf_matrix[idx_pair] + + labels = [label for id, label in classes.items()] + + fig = plt.figure() + fig.add_subplot(111) + table = plt.table( + cellText=matrix, + colLabels=labels, + rowLabels=labels, + loc ='center') + table.auto_set_font_size(False) + table.set_fontsize(8) + table.scale(3, 3) + # Removing ticks and spines enables you to get the figure only with table + plt.tick_params(axis='x', which='both', bottom=False, top=False, labelbottom=False) + plt.tick_params(axis='y', which='both', right=False, left=False, labelleft=False) + for pos in ['right','top','bottom','left']: + plt.gca().spines[pos].set_visible(False) + + for idx_pair in conf_matrix: + i = class_idx[idx_pair[0]] + j = class_idx[idx_pair[1]] + if conf_matrix[idx_pair] != 0: + if i != j: + table._cells[(i + 1, j)].set_facecolor('#FF0000') + else: + table._cells[(i + 1, j)].set_facecolor('#00FF00') + + plt.savefig(osp.join(self.save_dir, filename), + bbox_inches='tight', pad_inches=0.05) diff --git a/datumaro/datumaro/cli/remove_command.py b/datumaro/datumaro/cli/remove_command.py new file mode 100644 index 000000000000..f419cd3a7e14 --- /dev/null +++ b/datumaro/datumaro/cli/remove_command.py @@ -0,0 +1,21 @@ + +# Copyright (C) 2019 Intel Corporation +# +# SPDX-License-Identifier: MIT + +import argparse + +from . import source as source_module + + +def build_parser(parser=argparse.ArgumentParser()): + source_module.build_add_parser(parser). \ + set_defaults(command=source_module.remove_command) + + return parser + +def main(args=None): + parser = build_parser() + args = parser.parse_args(args) + + return args.command(args) diff --git a/datumaro/datumaro/cli/source/__init__.py b/datumaro/datumaro/cli/source/__init__.py new file mode 100644 index 000000000000..605d222b2131 --- /dev/null +++ b/datumaro/datumaro/cli/source/__init__.py @@ -0,0 +1,230 @@ + +# Copyright (C) 2019 Intel Corporation +# +# SPDX-License-Identifier: MIT + +import argparse +import logging as log +import os +import os.path as osp +import shutil + +from ..util.project import load_project + + +def build_create_parser(parser): + parser.add_argument('-n', '--name', required=True, + help="Name of the source to be created") + parser.add_argument('-p', '--project', dest='project_dir', default='.', + help="Directory of the project to operate on (default: current dir)") + return parser + +def create_command(args): + project = load_project(args.project_dir) + config = project.config + + name = args.name + + if project.env.git.has_submodule(name): + log.fatal("Submodule '%s' already exists" % (name)) + return 1 + + try: + project.get_source(name) + log.fatal("Source '%s' already exists" % (name)) + return 1 + except KeyError: + pass + + dst_dir = osp.join(config.project_dir, config.sources_dir, name) + project.env.git.init(dst_dir) + + project.add_source(name, { 'url': name }) + project.save() + + log.info("Source '%s' has been added to the project, location: '%s'" \ + % (name, dst_dir)) + + return 0 + +def build_import_parser(parser): + sp = parser.add_subparsers(dest='source_type') + + repo_parser = sp.add_parser('repo') + repo_parser.add_argument('url', + help="URL of the source git repository") + repo_parser.add_argument('-b', '--branch', default='master', + help="Branch of the source repository (default: %(default)s)") + repo_parser.add_argument('--checkout', action='store_true', + help="Do branch checkout") + + dir_parser = sp.add_parser('dir') + dir_parser.add_argument('url', + help="Path to the source directory") + dir_parser.add_argument('--copy', action='store_true', + help="Copy data to the project") + + parser.add_argument('-f', '--format', default=None, + help="Name of the source dataset format (default: 'project')") + parser.add_argument('-n', '--name', default=None, + help="Name of the source to be imported") + parser.add_argument('-p', '--project', dest='project_dir', default='.', + help="Directory of the project to operate on (default: current dir)") + return parser + +def import_command(args): + project = load_project(args.project_dir) + + if args.source_type == 'repo': + name = args.name + if name is None: + name = osp.splitext(osp.basename(args.url))[0] + + if project.env.git.has_submodule(name): + log.fatal("Submodule '%s' already exists" % (name)) + return 1 + + try: + project.get_source(name) + log.fatal("Source '%s' already exists" % (name)) + return 1 + except KeyError: + pass + + dst_dir = project.local_source_dir(name) + project.env.git.create_submodule(name, dst_dir, + url=args.url, branch=args.branch, no_checkout=not args.checkout) + + source = { 'url': args.url } + if args.format: + source['format'] = args.format + project.add_source(name, source) + project.save() + + log.info("Source '%s' has been added to the project, location: '%s'" \ + % (name, dst_dir)) + elif args.source_type == 'dir': + url = osp.abspath(args.url) + if not osp.exists(url): + log.fatal("Source path '%s' does not exist" % url) + return 1 + + name = args.name + if name is None: + name = osp.splitext(osp.basename(url))[0] + + try: + project.get_source(name) + log.fatal("Source '%s' already exists" % (name)) + return 1 + except KeyError: + pass + + dst_dir = url + if args.copy: + dst_dir = project.local_source_dir(name) + log.info("Copying from '%s' to '%s'" % (url, dst_dir)) + shutil.copytree(url, dst_dir) + url = name + + source = { 'url': url } + if args.format: + source['format'] = args.format + project.add_source(name, source) + project.save() + + log.info("Source '%s' has been added to the project, location: '%s'" \ + % (name, dst_dir)) + + return 0 + +def build_remove_parser(parser): + parser.add_argument('-n', '--name', required=True, + help="Name of the source to be removed") + parser.add_argument('--force', action='store_true', + help="Ignore possible errors during removal") + parser.add_argument('-p', '--project', dest='project_dir', default='.', + help="Directory of the project to operate on (default: current dir)") + return parser + +def remove_command(args): + project = load_project(args.project_dir) + + name = args.name + if name is None: + log.fatal("Expected source name") + return + + if project.env.git.has_submodule(name): + if args.force: + log.warning("Forcefully removing the '%s' source..." % (name)) + + project.env.git.remove_submodule(name, force=args.force) + + project.remove_source(name) + project.save() + + log.info("Source '%s' has been removed from the project" % (name)) + + return 0 + +def build_export_parser(parser): + parser.add_argument('-n', '--name', required=True, + help="Source dataset to be extracted") + parser.add_argument('-e', '--filter', default=None, + help="Filter expression for dataset items. Examples: " + "extract images with width < height: " + "'/item[image/width < image/height]'; " + "extract images with large-area bboxes: " + "'/item[annotation/type=\"bbox\" and annotation/area>2000]'" + ) + parser.add_argument('-d', '--dest', dest='dst_dir', required=True, + help="Directory to save output") + parser.add_argument('-f', '--output-format', required=True, + help="Output format") + parser.add_argument('-p', '--project', dest='project_dir', default='.', + help="Directory of the project to operate on (default: current dir)") + parser.add_argument('extra_args', nargs=argparse.REMAINDER, default=None, + help="Additional arguments for converter (pass '-- -h' for help)") + return parser + +def export_command(args): + project = load_project(args.project_dir) + + dst_dir = osp.abspath(args.dst_dir) + os.makedirs(dst_dir, exist_ok=False) + + source_project = project.make_source_project(args.name) + source_project.make_dataset().export( + save_dir=dst_dir, + output_format=args.output_format, + filter_expr=args.filter, + cmdline_args=args.extra_args) + log.info("Source '%s' exported to '%s' as '%s'" % \ + (args.name, dst_dir, args.output_format)) + + return 0 + +def build_parser(parser=argparse.ArgumentParser()): + command_parsers = parser.add_subparsers(dest='command_name') + + build_create_parser(command_parsers.add_parser('create')) \ + .set_defaults(command=create_command) + build_import_parser(command_parsers.add_parser('import')) \ + .set_defaults(command=import_command) + build_remove_parser(command_parsers.add_parser('remove')) \ + .set_defaults(command=remove_command) + build_export_parser(command_parsers.add_parser('export')) \ + .set_defaults(command=export_command) + + return parser + + +def main(args=None): + parser = build_parser() + args = parser.parse_args(args) + if 'command' not in args: + parser.print_help() + return 1 + + return args.command(args) diff --git a/datumaro/datumaro/cli/stats_command.py b/datumaro/datumaro/cli/stats_command.py new file mode 100644 index 000000000000..333883dedcef --- /dev/null +++ b/datumaro/datumaro/cli/stats_command.py @@ -0,0 +1,69 @@ + +# Copyright (C) 2019 Intel Corporation +# +# SPDX-License-Identifier: MIT + +import argparse +import os.path as osp + +from datumaro.components.project import Project +from datumaro.util.command_targets import (TargetKinds, target_selector, + ProjectTarget, SourceTarget, ExternalDatasetTarget, ImageTarget, + is_project_path +) + +from . import project as project_module +from . import source as source_module +from . import item as item_module + + +def compute_external_dataset_stats(target, params): + raise NotImplementedError() + +def build_parser(parser=argparse.ArgumentParser()): + parser.add_argument('target', nargs='?', default=None) + parser.add_argument('params', nargs=argparse.REMAINDER) + + parser.add_argument('-p', '--project', dest='project_dir', default='.', + help="Directory of the project to operate on (default: current dir)") + + return parser + +def process_command(target, params, args): + project_dir = args.project_dir + target_kind, target_value = target + if target_kind == TargetKinds.project: + return project_module.main(['stats', '-p', target_value] + params) + elif target_kind == TargetKinds.source: + return source_module.main(['stats', '-p', project_dir, target_value] + params) + elif target_kind == TargetKinds.item: + return item_module.main(['stats', '-p', project_dir, target_value] + params) + elif target_kind == TargetKinds.external_dataset: + return compute_external_dataset_stats(target_value, params) + return 1 + +def main(args=None): + parser = build_parser() + args = parser.parse_args(args) + + project_path = args.project_dir + if is_project_path(project_path): + project = Project.load(project_path) + else: + project = None + try: + args.target = target_selector( + ProjectTarget(is_default=True, project=project), + SourceTarget(project=project), + ExternalDatasetTarget(), + ImageTarget() + )(args.target) + if args.target[0] == TargetKinds.project: + if is_project_path(args.target[1]): + args.project_dir = osp.dirname(osp.abspath(args.target[1])) + except argparse.ArgumentTypeError as e: + print(e) + parser.print_help() + return 1 + + return process_command(args.target, args.params, args) diff --git a/datumaro/datumaro/cli/util/__init__.py b/datumaro/datumaro/cli/util/__init__.py new file mode 100644 index 000000000000..a9773073830c --- /dev/null +++ b/datumaro/datumaro/cli/util/__init__.py @@ -0,0 +1,5 @@ + +# Copyright (C) 2019 Intel Corporation +# +# SPDX-License-Identifier: MIT + diff --git a/datumaro/datumaro/cli/util/project.py b/datumaro/datumaro/cli/util/project.py new file mode 100644 index 000000000000..6e1f5e650bdc --- /dev/null +++ b/datumaro/datumaro/cli/util/project.py @@ -0,0 +1,20 @@ + +# Copyright (C) 2019 Intel Corporation +# +# SPDX-License-Identifier: MIT + +import os.path as osp + +from datumaro.components.project import Project, \ + PROJECT_DEFAULT_CONFIG as DEFAULT_CONFIG + + +def make_project_path(project_dir, project_filename=None): + if project_filename is None: + project_filename = DEFAULT_CONFIG.project_filename + return osp.join(project_dir, project_filename) + +def load_project(project_dir, project_filename=None): + if project_filename: + project_dir = osp.join(project_dir, project_filename) + return Project.load(project_dir) \ No newline at end of file diff --git a/datumaro/datumaro/components/__init__.py b/datumaro/datumaro/components/__init__.py new file mode 100644 index 000000000000..a9773073830c --- /dev/null +++ b/datumaro/datumaro/components/__init__.py @@ -0,0 +1,5 @@ + +# Copyright (C) 2019 Intel Corporation +# +# SPDX-License-Identifier: MIT + diff --git a/datumaro/datumaro/components/algorithms/__init__.py b/datumaro/datumaro/components/algorithms/__init__.py new file mode 100644 index 000000000000..a9773073830c --- /dev/null +++ b/datumaro/datumaro/components/algorithms/__init__.py @@ -0,0 +1,5 @@ + +# Copyright (C) 2019 Intel Corporation +# +# SPDX-License-Identifier: MIT + diff --git a/datumaro/datumaro/components/algorithms/rise.py b/datumaro/datumaro/components/algorithms/rise.py new file mode 100644 index 000000000000..78e936392c2c --- /dev/null +++ b/datumaro/datumaro/components/algorithms/rise.py @@ -0,0 +1,220 @@ + +# Copyright (C) 2019 Intel Corporation +# +# SPDX-License-Identifier: MIT + +# pylint: disable=unused-variable + +import numpy as np +from math import ceil + +from datumaro.components.extractor import * + + +def flatmatvec(mat): + return np.reshape(mat, (len(mat), -1)) + +def expand(array, axis=None): + if axis is None: + axis = len(array.shape) + return np.expand_dims(array, axis=axis) + +class RISE: + """ + Implements RISE: Randomized Input Sampling for + Explanation of Black-box Models algorithm + See explanations at: https://arxiv.org/pdf/1806.07421.pdf + """ + + def __init__(self, model, + max_samples=None, mask_width=7, mask_height=7, prob=0.5, + iou_thresh=0.9, nms_thresh=0.0, det_conf_thresh=0.0, + batch_size=1): + self.model = model + self.max_samples = max_samples + self.mask_height = mask_height + self.mask_width = mask_width + self.prob = prob + self.iou_thresh = iou_thresh + self.nms_thresh = nms_thresh + self.det_conf_thresh = det_conf_thresh + self.batch_size = batch_size + + @staticmethod + def split_outputs(annotations): + labels = [] + bboxes = [] + for r in annotations: + if r.type is AnnotationType.label: + labels.append(r) + elif r.type is AnnotationType.bbox: + bboxes.append(r) + return labels, bboxes + + @staticmethod + def nms(boxes, iou_thresh=0.5): + indices = np.argsort([b.attributes['score'] for b in boxes]) + ious = np.array([[a.iou(b) for b in boxes] for a in boxes]) + + predictions = [] + while len(indices) != 0: + i = len(indices) - 1 + pred_idx = indices[i] + to_remove = [i] + predictions.append(boxes[pred_idx]) + for i, box_idx in enumerate(indices[:i]): + if iou_thresh < ious[pred_idx, box_idx]: + to_remove.append(i) + indices = np.delete(indices, to_remove) + + return predictions + + def normalize_hmaps(self, heatmaps, counts): + eps = np.finfo(heatmaps.dtype).eps + mhmaps = flatmatvec(heatmaps) + mhmaps /= expand(counts * self.prob + eps) + mhmaps -= expand(np.min(mhmaps, axis=1)) + mhmaps /= expand(np.max(mhmaps, axis=1) + eps) + return np.reshape(mhmaps, heatmaps.shape) + + def apply(self, image, progressive=False): + import cv2 + + assert len(image.shape) == 3, \ + "Expected an input image in (H, W, C) format" + assert image.shape[2] in [3, 4], \ + "Expected BGR or BGRA input" + image = image[:, :, :3].astype(np.float32) + + model = self.model + iou_thresh = self.iou_thresh + + image_size = np.array((image.shape[:2])) + mask_size = np.array((self.mask_height, self.mask_width)) + cell_size = np.ceil(image_size / mask_size) + upsampled_size = np.ceil((mask_size + 1) * cell_size) + + rng = lambda shape=None: np.random.rand(*shape) + samples = np.prod(image_size) + if self.max_samples is not None: + samples = min(self.max_samples, samples) + batch_size = self.batch_size + + result = next(iter(model.launch(expand(image, 0)))) + result_labels, result_bboxes = self.split_outputs(result) + if 0 < self.det_conf_thresh: + result_bboxes = [b for b in result_bboxes \ + if self.det_conf_thresh <= b.attributes['score']] + if 0 < self.nms_thresh: + result_bboxes = self.nms(result_bboxes, self.nms_thresh) + + predicted_labels = set() + if len(result_labels) != 0: + predicted_label = max(result_labels, + key=lambda r: r.attributes['score']).label + predicted_labels.add(predicted_label) + if len(result_bboxes) != 0: + for bbox in result_bboxes: + predicted_labels.add(bbox.label) + predicted_labels = { label: idx \ + for idx, label in enumerate(predicted_labels) } + + predicted_bboxes = result_bboxes + + heatmaps_count = len(predicted_labels) + len(predicted_bboxes) + heatmaps = np.zeros((heatmaps_count, *image_size), dtype=np.float32) + total_counts = np.zeros(heatmaps_count, dtype=np.int32) + confs = np.zeros(heatmaps_count, dtype=np.float32) + + heatmap_id = 0 + + label_heatmaps = None + label_total_counts = None + label_confs = None + if len(predicted_labels) != 0: + step = len(predicted_labels) + label_heatmaps = heatmaps[heatmap_id : heatmap_id + step] + label_total_counts = total_counts[heatmap_id : heatmap_id + step] + label_confs = confs[heatmap_id : heatmap_id + step] + heatmap_id += step + + bbox_heatmaps = None + bbox_total_counts = None + bbox_confs = None + if len(predicted_bboxes) != 0: + step = len(predicted_bboxes) + bbox_heatmaps = heatmaps[heatmap_id : heatmap_id + step] + bbox_total_counts = total_counts[heatmap_id : heatmap_id + step] + bbox_confs = confs[heatmap_id : heatmap_id + step] + heatmap_id += step + + ups_mask = np.empty(upsampled_size.astype(int), dtype=np.float32) + masks = np.empty((batch_size, *image_size), dtype=np.float32) + + full_batch_inputs = np.empty((batch_size, *image.shape), dtype=np.float32) + current_heatmaps = np.empty_like(heatmaps) + for b in range(ceil(samples / batch_size)): + batch_pos = b * batch_size + current_batch_size = min(samples - batch_pos, batch_size) + + batch_masks = masks[: current_batch_size] + for i in range(current_batch_size): + mask = (rng(mask_size) < self.prob).astype(np.float32) + cv2.resize(mask, (int(upsampled_size[1]), int(upsampled_size[0])), + ups_mask) + + offsets = np.round(rng((2,)) * cell_size) + mask = ups_mask[ + int(offsets[0]):int(image_size[0] + offsets[0]), + int(offsets[1]):int(image_size[1] + offsets[1]) ] + batch_masks[i] = mask + + batch_inputs = full_batch_inputs[:current_batch_size] + np.multiply(expand(batch_masks), expand(image, 0), out=batch_inputs) + + results = model.launch(batch_inputs) + for mask, result in zip(batch_masks, results): + result_labels, result_bboxes = self.split_outputs(result) + + confs.fill(0) + if len(predicted_labels) != 0: + for r in result_labels: + idx = predicted_labels.get(r.label, None) + if idx is not None: + label_total_counts[idx] += 1 + label_confs[idx] += r.attributes['score'] + for r in result_bboxes: + idx = predicted_labels.get(r.label, None) + if idx is not None: + label_total_counts[idx] += 1 + label_confs[idx] += r.attributes['score'] + + if len(predicted_bboxes) != 0 and len(result_bboxes) != 0: + if 0 < self.det_conf_thresh: + result_bboxes = [b for b in result_bboxes \ + if self.det_conf_thresh <= b.attributes['score']] + if 0 < self.nms_thresh: + result_bboxes = self.nms(result_bboxes, self.nms_thresh) + + for detection in result_bboxes: + for pred_idx, pred in enumerate(predicted_bboxes): + if pred.label != detection.label: + continue + + iou = pred.iou(detection) + assert 0 <= iou and iou <= 1 + if iou < iou_thresh: + continue + + bbox_total_counts[pred_idx] += 1 + + conf = detection.attributes['score'] + bbox_confs[pred_idx] += conf + + np.multiply.outer(confs, mask, out=current_heatmaps) + heatmaps += current_heatmaps + + if progressive: + yield self.normalize_hmaps(heatmaps.copy(), total_counts) + + yield self.normalize_hmaps(heatmaps, total_counts) \ No newline at end of file diff --git a/datumaro/datumaro/components/comparator.py b/datumaro/datumaro/components/comparator.py new file mode 100644 index 000000000000..842a3963a989 --- /dev/null +++ b/datumaro/datumaro/components/comparator.py @@ -0,0 +1,113 @@ + +# Copyright (C) 2019 Intel Corporation +# +# SPDX-License-Identifier: MIT + +from itertools import zip_longest +import numpy as np + +from datumaro.components.extractor import AnnotationType, LabelCategories + + +class Comparator: + def __init__(self, + iou_threshold=0.5, conf_threshold=0.9): + self.iou_threshold = iou_threshold + self.conf_threshold = conf_threshold + + @staticmethod + def iou(box_a, box_b): + return box_a.iou(box_b) + + # pylint: disable=no-self-use + def compare_dataset_labels(self, extractor_a, extractor_b): + a_label_cat = extractor_a.categories().get(AnnotationType.label) + b_label_cat = extractor_b.categories().get(AnnotationType.label) + if not a_label_cat and not b_label_cat: + return None + if not a_label_cat: + a_label_cat = LabelCategories() + if not b_label_cat: + b_label_cat = LabelCategories() + + mismatches = [] + for a_label, b_label in zip_longest(a_label_cat.items, b_label_cat.items): + if a_label != b_label: + mismatches.append((a_label, b_label)) + return mismatches + # pylint: enable=no-self-use + + def compare_item_labels(self, item_a, item_b): + conf_threshold = self.conf_threshold + + a_labels = set([ann.label for ann in item_a.annotations \ + if ann.type is AnnotationType.label and \ + conf_threshold < ann.attributes.get('score', 1)]) + b_labels = set([ann.label for ann in item_b.annotations \ + if ann.type is AnnotationType.label and \ + conf_threshold < ann.attributes.get('score', 1)]) + + a_unmatched = a_labels - b_labels + b_unmatched = b_labels - a_labels + matches = a_labels & b_labels + + return matches, a_unmatched, b_unmatched + + def compare_item_bboxes(self, item_a, item_b): + iou_threshold = self.iou_threshold + conf_threshold = self.conf_threshold + + a_boxes = [ann for ann in item_a.annotations \ + if ann.type is AnnotationType.bbox and \ + conf_threshold < ann.attributes.get('score', 1)] + b_boxes = [ann for ann in item_b.annotations \ + if ann.type is AnnotationType.bbox and \ + conf_threshold < ann.attributes.get('score', 1)] + a_boxes.sort(key=lambda ann: 1 - ann.attributes.get('score', 1)) + b_boxes.sort(key=lambda ann: 1 - ann.attributes.get('score', 1)) + + # a_matches: indices of b_boxes matched to a bboxes + # b_matches: indices of a_boxes matched to b bboxes + a_matches = -np.ones(len(a_boxes), dtype=int) + b_matches = -np.ones(len(b_boxes), dtype=int) + + iou_matrix = np.array([ + [self.iou(a, b) for b in b_boxes] for a in a_boxes + ]) + + # matches: boxes we succeeded to match completely + # mispred: boxes we succeeded to match, having label mismatch + matches = [] + mispred = [] + + for a_idx, a_bbox in enumerate(a_boxes): + if len(b_boxes) == 0: + break + matched_b = a_matches[a_idx] + iou_max = max(iou_matrix[a_idx, matched_b], iou_threshold) + for b_idx, b_bbox in enumerate(b_boxes): + if 0 <= b_matches[b_idx]: # assign a_bbox with max conf + continue + iou = iou_matrix[a_idx, b_idx] + if iou < iou_max: + continue + iou_max = iou + matched_b = b_idx + + if matched_b < 0: + continue + a_matches[a_idx] = matched_b + b_matches[matched_b] = a_idx + + b_bbox = b_boxes[matched_b] + + if a_bbox.label == b_bbox.label: + matches.append( (a_bbox, b_bbox) ) + else: + mispred.append( (a_bbox, b_bbox) ) + + # *_umatched: boxes of (*) we failed to match + a_unmatched = [a_boxes[i] for i, m in enumerate(a_matches) if m < 0] + b_unmatched = [b_boxes[i] for i, m in enumerate(b_matches) if m < 0] + + return matches, mispred, a_unmatched, b_unmatched diff --git a/datumaro/datumaro/components/config.py b/datumaro/datumaro/components/config.py new file mode 100644 index 000000000000..520c6e70bd51 --- /dev/null +++ b/datumaro/datumaro/components/config.py @@ -0,0 +1,237 @@ + +# Copyright (C) 2019 Intel Corporation +# +# SPDX-License-Identifier: MIT + +import yaml + + +class Schema: + class Item: + def __init__(self, ctor, internal=False): + self.ctor = ctor + self.internal = internal + + def __call__(self, *args, **kwargs): + return self.ctor(*args, **kwargs) + + def __init__(self, items=None, fallback=None): + self._items = {} + if items is not None: + self._items.update(items) + self._fallback = fallback + + def _get_items(self, allow_fallback=True): + all_items = {} + + if allow_fallback and self._fallback is not None: + all_items.update(self._fallback) + all_items.update(self._items) + + return all_items + + def items(self, allow_fallback=True): + return self._get_items(allow_fallback=allow_fallback).items() + + def keys(self, allow_fallback=True): + return self._get_items(allow_fallback=allow_fallback).keys() + + def values(self, allow_fallback=True): + return self._get_items(allow_fallback=allow_fallback).values() + + def __contains__(self, key): + return key in self.keys() + + def __len__(self): + return len(self._get_items()) + + def __iter__(self): + return iter(self._get_items()) + + def __getitem__(self, key): + default = object() + value = self.get(key, default=default) + if value is default: + raise KeyError('Key "%s" does not exist' % (key)) + return value + + def get(self, key, default=None): + found = self._items.get(key, default) + if found is not default: + return found + + if self._fallback is not None: + return self._fallback.get(key, default) + +class SchemaBuilder: + def __init__(self): + self._items = {} + + def add(self, name, ctor=str, internal=False): + if name in self._items: + raise KeyError('Key "%s" already exists' % (name)) + + self._items[name] = Schema.Item(ctor, internal=internal) + return self + + def build(self): + return Schema(self._items) + +class Config: + def __init__(self, config=None, fallback=None, schema=None, mutable=True): + # schema should be established first + self.__dict__['_schema'] = schema + self.__dict__['_mutable'] = True + + self.__dict__['_config'] = {} + if fallback is not None: + for k, v in fallback.items(allow_fallback=False): + self.set(k, v) + if config is not None: + self.update(config) + + self.__dict__['_mutable'] = mutable + + def _items(self, allow_fallback=True, allow_internal=True): + all_config = {} + if allow_fallback and self._schema is not None: + for key, item in self._schema.items(): + all_config[key] = item() + all_config.update(self._config) + + if not allow_internal and self._schema is not None: + for key, item in self._schema.items(): + if item.internal: + all_config.pop(key) + return all_config + + def items(self, allow_fallback=True, allow_internal=True): + return self._items( + allow_fallback=allow_fallback, + allow_internal=allow_internal + ).items() + + def keys(self, allow_fallback=True, allow_internal=True): + return self._items( + allow_fallback=allow_fallback, + allow_internal=allow_internal + ).keys() + + def values(self, allow_fallback=True, allow_internal=True): + return self._items( + allow_fallback=allow_fallback, + allow_internal=allow_internal + ).values() + + def __contains__(self, key): + return key in self.keys() + + def __len__(self): + return len(self.items()) + + def __iter__(self): + return iter(zip(self.keys(), self.values())) + + def __getitem__(self, key): + default = object() + value = self.get(key, default=default) + if value is default: + raise KeyError('Key "%s" does not exist' % (key)) + return value + + def __setitem__(self, key, value): + return self.set(key, value) + + def __getattr__(self, key): + return self.get(key) + + def __setattr__(self, key, value): + return self.set(key, value) + + def __eq__(self, other): + try: + for k, my_v in self.items(allow_internal=False): + other_v = other[k] + if my_v != other_v: + return False + return True + except Exception: + return False + + def update(self, other): + for k, v in other.items(): + self.set(k, v) + + def remove(self, key): + if not self._mutable: + raise Exception("Cannot set value of immutable object") + + self._config.pop(key, None) + + def get(self, key, default=None): + found = self._config.get(key, default) + if found is not default: + return found + + if self._schema is not None: + found = self._schema.get(key, default) + if found is not default: + # ignore mutability + found = found() + self._config[key] = found + return found + + return found + + def set(self, key, value): + if not self._mutable: + raise Exception("Cannot set value of immutable object") + + if self._schema is not None: + if key not in self._schema: + raise Exception("Can not set key '%s' - schema mismatch" % (key)) + + schema_entry = self._schema[key] + schema_entry_instance = schema_entry() + if not isinstance(value, type(schema_entry_instance)): + if isinstance(value, dict) and \ + isinstance(schema_entry_instance, Config): + schema_entry_instance.update(value) + value = schema_entry_instance + else: + raise Exception("Can not set key '%s' - schema mismatch" % (key)) + + self._config[key] = value + return value + + @staticmethod + def parse(path): + with open(path, 'r') as f: + return Config(yaml.safe_load(f)) + + @staticmethod + def yaml_representer(dumper, value): + return dumper.represent_data( + value._items(allow_internal=False, allow_fallback=False)) + + def dump(self, path): + with open(path, 'w+') as f: + yaml.dump(self, f) + +yaml.add_multi_representer(Config, Config.yaml_representer) + + +class DefaultConfig(Config): + def __init__(self, default=None): + super().__init__() + self.__dict__['_default'] = default + + def set(self, key, value): + if key not in self.keys(allow_fallback=False): + value = self._default(value) + return super().set(key, value) + else: + return super().set(key, value) + + +DEFAULT_FORMAT = 'datumaro' \ No newline at end of file diff --git a/datumaro/datumaro/components/config_model.py b/datumaro/datumaro/components/config_model.py new file mode 100644 index 000000000000..fe133cb626c6 --- /dev/null +++ b/datumaro/datumaro/components/config_model.py @@ -0,0 +1,83 @@ + +# Copyright (C) 2019 Intel Corporation +# +# SPDX-License-Identifier: MIT + +from datumaro.components.config import Config, \ + DefaultConfig as _DefaultConfig, \ + SchemaBuilder as _SchemaBuilder + + +SOURCE_SCHEMA = _SchemaBuilder() \ + .add('url', str) \ + .add('format', str) \ + .add('options', dict) \ + .build() + +class Source(Config): + def __init__(self, config=None): + super().__init__(config, schema=SOURCE_SCHEMA) + + +MODEL_SCHEMA = _SchemaBuilder() \ + .add('launcher', str) \ + .add('model_dir', str, internal=True) \ + .add('options', dict) \ + .build() + +class Model(Config): + def __init__(self, config=None): + super().__init__(config, schema=MODEL_SCHEMA) + + +ENV_SCHEMA = _SchemaBuilder() \ + .add('models_dir', str) \ + .add('importers_dir', str) \ + .add('launchers_dir', str) \ + .add('converters_dir', str) \ + .add('extractors_dir', str) \ + \ + .add('models', lambda: _DefaultConfig( + lambda v=None: Model(v))) \ + .build() + +ENV_DEFAULT_CONFIG = Config({ + 'models_dir': 'models', + 'importers_dir': 'importers', + 'launchers_dir': 'launchers', + 'converters_dir': 'converters', + 'extractors_dir': 'extractors', +}, mutable=False, schema=ENV_SCHEMA) + + +PROJECT_SCHEMA = _SchemaBuilder() \ + .add('project_name', str) \ + .add('format_version', int) \ + \ + .add('sources_dir', str) \ + .add('dataset_dir', str) \ + .add('build_dir', str) \ + .add('subsets', list) \ + .add('sources', lambda: _DefaultConfig( + lambda v=None: Source(v))) \ + .add('filter', str) \ + \ + .add('project_filename', str, internal=True) \ + .add('project_dir', str, internal=True) \ + .add('env_filename', str, internal=True) \ + .add('env_dir', str, internal=True) \ + .build() + +PROJECT_DEFAULT_CONFIG = Config({ + 'project_name': 'undefined', + 'format_version': 1, + + 'sources_dir': 'sources', + 'dataset_dir': 'dataset', + 'build_dir': 'build', + + 'project_filename': 'config.yaml', + 'project_dir': '', + 'env_filename': 'datumaro.yaml', + 'env_dir': '.datumaro', +}, mutable=False, schema=PROJECT_SCHEMA) diff --git a/datumaro/datumaro/components/converter.py b/datumaro/datumaro/components/converter.py new file mode 100644 index 000000000000..9ea404d962de --- /dev/null +++ b/datumaro/datumaro/components/converter.py @@ -0,0 +1,19 @@ + +# Copyright (C) 2019 Intel Corporation +# +# SPDX-License-Identifier: MIT + +class Converter: + def __init__(self, cmdline_args=None): + pass + + def __call__(self, extractor, save_dir): + raise NotImplementedError() + + def _parse_cmdline(self, cmdline): + parser = self.build_cmdline_parser() + + if len(cmdline) != 0 and cmdline[0] == '--': + cmdline = cmdline[1:] + args = parser.parse_args(cmdline) + return vars(args) \ No newline at end of file diff --git a/datumaro/datumaro/components/converters/__init__.py b/datumaro/datumaro/components/converters/__init__.py new file mode 100644 index 000000000000..26c3710966b6 --- /dev/null +++ b/datumaro/datumaro/components/converters/__init__.py @@ -0,0 +1,53 @@ + +# Copyright (C) 2019 Intel Corporation +# +# SPDX-License-Identifier: MIT + +from datumaro.components.converters.datumaro import DatumaroConverter + +from datumaro.components.converters.ms_coco import ( + CocoConverter, + CocoImageInfoConverter, + CocoCaptionsConverter, + CocoInstancesConverter, + CocoPersonKeypointsConverter, + CocoLabelsConverter, +) + +from datumaro.components.converters.voc import ( + VocConverter, + VocClassificationConverter, + VocDetectionConverter, + VocLayoutConverter, + VocActionConverter, + VocSegmentationConverter, +) + +from datumaro.components.converters.yolo import YoloConverter + +from datumaro.components.converters.tfrecord import ( + DetectionApiConverter, +) + + +items = [ + ('datumaro', DatumaroConverter), + + ('coco', CocoConverter), + ('coco_images', CocoImageInfoConverter), + ('coco_captions', CocoCaptionsConverter), + ('coco_instances', CocoInstancesConverter), + ('coco_person_kp', CocoPersonKeypointsConverter), + ('coco_labels', CocoLabelsConverter), + + ('voc', VocConverter), + ('voc_cls', VocClassificationConverter), + ('voc_det', VocDetectionConverter), + ('voc_segm', VocSegmentationConverter), + ('voc_action', VocActionConverter), + ('voc_layout', VocLayoutConverter), + + ('yolo', YoloConverter), + + ('tf_detection_api', DetectionApiConverter), +] diff --git a/datumaro/datumaro/components/converters/datumaro.py b/datumaro/datumaro/components/converters/datumaro.py new file mode 100644 index 000000000000..4e80b5855aa4 --- /dev/null +++ b/datumaro/datumaro/components/converters/datumaro.py @@ -0,0 +1,298 @@ + +# Copyright (C) 2019 Intel Corporation +# +# SPDX-License-Identifier: MIT + +# pylint: disable=no-self-use + +import json +import os +import os.path as osp + +from datumaro.components.converter import Converter +from datumaro.components.extractor import ( + DEFAULT_SUBSET_NAME, + AnnotationType, Annotation, + LabelObject, MaskObject, PointsObject, PolygonObject, + PolyLineObject, BboxObject, CaptionObject, + LabelCategories, MaskCategories, PointsCategories +) +from datumaro.components.formats.datumaro import DatumaroPath +from datumaro.util.image import save_image + + +def _cast(value, type_conv, default=None): + if value is None: + return default + try: + return type_conv(value) + except Exception: + return default + +class _SubsetWriter: + def __init__(self, name, converter): + self._name = name + self._converter = converter + + self._data = { + 'info': {}, + 'categories': {}, + 'items': [], + } + + self._next_mask_id = 1 + + @property + def categories(self): + return self._data['categories'] + + @property + def items(self): + return self._data['items'] + + def write_item(self, item): + annotations = [] + self.items.append({ + 'id': item.id, + 'path': item.path, + 'annotations': annotations, + }) + + for ann in item.annotations: + if isinstance(ann, LabelObject): + converted_ann = self._convert_label_object(ann) + elif isinstance(ann, MaskObject): + converted_ann = self._convert_mask_object(ann) + elif isinstance(ann, PointsObject): + converted_ann = self._convert_points_object(ann) + elif isinstance(ann, PolyLineObject): + converted_ann = self._convert_polyline_object(ann) + elif isinstance(ann, PolygonObject): + converted_ann = self._convert_polygon_object(ann) + elif isinstance(ann, BboxObject): + converted_ann = self._convert_bbox_object(ann) + elif isinstance(ann, CaptionObject): + converted_ann = self._convert_caption_object(ann) + else: + raise NotImplementedError() + annotations.append(converted_ann) + + def write_categories(self, categories): + for ann_type, desc in categories.items(): + if isinstance(desc, LabelCategories): + converted_desc = self._convert_label_categories(desc) + elif isinstance(desc, MaskCategories): + converted_desc = self._convert_mask_categories(desc) + elif isinstance(desc, PointsCategories): + converted_desc = self._convert_points_categories(desc) + else: + raise NotImplementedError() + self.categories[ann_type.name] = converted_desc + + def write(self, save_dir): + with open(osp.join(save_dir, '%s.json' % (self._name)), 'w') as f: + json.dump(self._data, f) + + def _convert_annotation(self, obj): + assert isinstance(obj, Annotation) + + ann_json = { + 'id': _cast(obj.id, int), + 'type': _cast(obj.type.name, str), + 'attributes': obj.attributes, + 'group': _cast(obj.group, int, None), + } + return ann_json + + def _convert_label_object(self, obj): + converted = self._convert_annotation(obj) + + converted.update({ + 'label_id': _cast(obj.label, int), + }) + return converted + + def _save_mask(self, mask): + mask_id = None + if mask is None: + return mask_id + + mask_id = self._next_mask_id + self._next_mask_id += 1 + + filename = '%d%s' % (mask_id, DatumaroPath.MASK_EXT) + masks_dir = osp.join(self._converter._annotations_dir, + DatumaroPath.MASKS_DIR) + os.makedirs(masks_dir, exist_ok=True) + path = osp.join(masks_dir, filename) + save_image(path, mask) + return mask_id + + def _convert_mask_object(self, obj): + converted = self._convert_annotation(obj) + + mask = obj.image + mask_id = None + if mask is not None: + mask_id = self._save_mask(mask) + + converted.update({ + 'label_id': _cast(obj.label, int), + 'mask_id': _cast(mask_id, int), + }) + return converted + + def _convert_polyline_object(self, obj): + converted = self._convert_annotation(obj) + + converted.update({ + 'label_id': _cast(obj.label, int), + 'points': [float(p) for p in obj.get_points()], + }) + return converted + + def _convert_polygon_object(self, obj): + converted = self._convert_annotation(obj) + + converted.update({ + 'label_id': _cast(obj.label, int), + 'points': [float(p) for p in obj.get_points()], + }) + return converted + + def _convert_bbox_object(self, obj): + converted = self._convert_annotation(obj) + + converted.update({ + 'label_id': _cast(obj.label, int), + 'bbox': [float(p) for p in obj.get_bbox()], + }) + return converted + + def _convert_points_object(self, obj): + converted = self._convert_annotation(obj) + + converted.update({ + 'label_id': _cast(obj.label, int), + 'points': [float(p) for p in obj.points], + 'visibility': [int(v.value) for v in obj.visibility], + }) + return converted + + def _convert_caption_object(self, obj): + converted = self._convert_annotation(obj) + + converted.update({ + 'caption': _cast(obj.caption, str), + }) + return converted + + def _convert_label_categories(self, obj): + converted = { + 'labels': [], + } + for label in obj.items: + converted['labels'].append({ + 'name': _cast(label.name, str), + 'parent': _cast(label.parent, str), + }) + return converted + + def _convert_mask_categories(self, obj): + converted = { + 'colormap': [], + } + for label_id, color in obj.colormap.items(): + converted['colormap'].append({ + 'label_id': int(label_id), + 'r': int(color[0]), + 'g': int(color[1]), + 'b': int(color[2]), + }) + return converted + + def _convert_points_categories(self, obj): + converted = { + 'items': [], + } + for label_id, item in obj.items.items(): + converted['items'].append({ + 'label_id': int(label_id), + 'labels': [_cast(label, str) for label in item.labels], + 'adjacent': [int(v) for v in item.adjacent], + }) + return converted + +class _Converter: + def __init__(self, extractor, save_dir, save_images=False,): + self._extractor = extractor + self._save_dir = save_dir + self._save_images = save_images + + def convert(self): + os.makedirs(self._save_dir, exist_ok=True) + + images_dir = osp.join(self._save_dir, DatumaroPath.IMAGES_DIR) + os.makedirs(images_dir, exist_ok=True) + self._images_dir = images_dir + + annotations_dir = osp.join(self._save_dir, DatumaroPath.ANNOTATIONS_DIR) + os.makedirs(annotations_dir, exist_ok=True) + self._annotations_dir = annotations_dir + + subsets = self._extractor.subsets() + if len(subsets) == 0: + subsets = [ None ] + subsets = [n if n else DEFAULT_SUBSET_NAME for n in subsets] + subsets = { name: _SubsetWriter(name, self) for name in subsets } + + for subset, writer in subsets.items(): + writer.write_categories(self._extractor.categories()) + + for item in self._extractor: + subset = item.subset + if not subset: + subset = DEFAULT_SUBSET_NAME + writer = subsets[subset] + + if self._save_images: + self._save_image(item) + writer.write_item(item) + + for subset, writer in subsets.items(): + writer.write(annotations_dir) + + def _save_image(self, item): + image = item.image + if image is None: + return + + image_path = osp.join(self._images_dir, + str(item.id) + DatumaroPath.IMAGE_EXT) + save_image(image_path, image) + +class DatumaroConverter(Converter): + def __init__(self, save_images=False, cmdline_args=None): + super().__init__() + + self._options = { + 'save_images': save_images, + } + + if cmdline_args is not None: + self._options.update(self._parse_cmdline(cmdline_args)) + + @classmethod + def build_cmdline_parser(cls, parser=None): + import argparse + if not parser: + parser = argparse.ArgumentParser() + + parser.add_argument('--save-images', action='store_true', + help="Save images (default: %(default)s)") + + return parser + + def __call__(self, extractor, save_dir): + converter = _Converter(extractor, save_dir, **self._options) + converter.convert() \ No newline at end of file diff --git a/datumaro/datumaro/components/converters/ms_coco.py b/datumaro/datumaro/components/converters/ms_coco.py new file mode 100644 index 000000000000..f629f72dabc9 --- /dev/null +++ b/datumaro/datumaro/components/converters/ms_coco.py @@ -0,0 +1,496 @@ + +# Copyright (C) 2019 Intel Corporation +# +# SPDX-License-Identifier: MIT + +import json +import numpy as np +import os +import os.path as osp + +import pycocotools.mask as mask_utils + +from datumaro.components.converter import Converter +from datumaro.components.extractor import ( + DEFAULT_SUBSET_NAME, AnnotationType, PointsObject, BboxObject +) +from datumaro.components.formats.ms_coco import CocoTask, CocoPath +from datumaro.util import find +from datumaro.util.image import save_image +import datumaro.util.mask_tools as mask_tools + + +def _cast(value, type_conv, default=None): + if value is None: + return default + try: + return type_conv(value) + except Exception: + return default + +class _TaskConverter: + def __init__(self, context): + self._min_ann_id = 1 + self._context = context + + data = { + 'licenses': [], + 'info': {}, + 'categories': [], + 'images': [], + 'annotations': [] + } + + data['licenses'].append({ + 'name': '', + 'id': 0, + 'url': '' + }) + + data['info'] = { + 'contributor': '', + 'date_created': '', + 'description': '', + 'url': '', + 'version': '', + 'year': '' + } + self._data = data + + def is_empty(self): + return len(self._data['annotations']) == 0 + + def save_image_info(self, item, filename): + if item.has_image: + h, w, _ = item.image.shape + else: + h = 0 + w = 0 + + self._data['images'].append({ + 'id': _cast(item.id, int, 0), + 'width': int(w), + 'height': int(h), + 'file_name': _cast(filename, str, ''), + 'license': 0, + 'flickr_url': '', + 'coco_url': '', + 'date_captured': 0, + }) + + def save_categories(self, dataset): + raise NotImplementedError() + + def save_annotations(self, item): + raise NotImplementedError() + + def write(self, path): + next_id = self._min_ann_id + for ann in self.annotations: + if ann['id'] is None: + ann['id'] = next_id + next_id += 1 + + with open(path, 'w') as outfile: + json.dump(self._data, outfile) + + @property + def annotations(self): + return self._data['annotations'] + + @property + def categories(self): + return self._data['categories'] + + def _get_ann_id(self, annotation): + ann_id = annotation.id + if ann_id: + self._min_ann_id = max(ann_id, self._min_ann_id) + return ann_id + +class _InstancesConverter(_TaskConverter): + def save_categories(self, dataset): + label_categories = dataset.categories().get(AnnotationType.label) + if label_categories is None: + return + + for idx, cat in enumerate(label_categories.items): + self.categories.append({ + 'id': 1 + idx, + 'name': _cast(cat.name, str, ''), + 'supercategory': _cast(cat.parent, str, ''), + }) + + def save_annotations(self, item): + annotations = item.annotations.copy() + + while len(annotations) != 0: + ann = annotations.pop() + + if ann.type == AnnotationType.bbox and ann.label is not None: + pass + elif ann.type == AnnotationType.polygon and ann.label is not None: + pass + elif ann.type == AnnotationType.mask and ann.label is not None: + pass + else: + continue + + bbox = None + segmentation = None + + if ann.type == AnnotationType.bbox: + is_crowd = ann.attributes.get('is_crowd', False) + bbox = ann.get_bbox() + elif ann.type == AnnotationType.polygon: + is_crowd = ann.attributes.get('is_crowd', False) + elif ann.type == AnnotationType.mask: + is_crowd = ann.attributes.get('is_crowd', True) + if is_crowd: + segmentation = ann + area = None + + # If ann in a group, try to find corresponding annotations in + # this group, otherwise try to infer them. + + if bbox is None and ann.group is not None: + bbox = find(annotations, lambda x: \ + x.group == ann.group and \ + x.type == AnnotationType.bbox and \ + x.label == ann.label) + if bbox is not None: + bbox = bbox.get_bbox() + + if is_crowd: + # is_crowd=True means there should be a mask + if segmentation is None and ann.group is not None: + segmentation = find(annotations, lambda x: \ + x.group == ann.group and \ + x.type == AnnotationType.mask and \ + x.label == ann.label) + if segmentation is not None: + binary_mask = np.array(segmentation.image, dtype=np.bool) + binary_mask = np.asfortranarray(binary_mask, dtype=np.uint8) + segmentation = mask_utils.encode(binary_mask) + area = mask_utils.area(segmentation) + segmentation = mask_tools.convert_mask_to_rle(binary_mask) + else: + # is_crowd=False means there are some polygons + polygons = [] + if ann.type == AnnotationType.polygon: + polygons = [ ann ] + if ann.group is not None: + # A single object can consist of several polygons + polygons += [p for p in annotations + if p.group == ann.group and \ + p.type == AnnotationType.polygon and \ + p.label == ann.label] + if polygons: + segmentation = [p.get_points() for p in polygons] + h, w, _ = item.image.shape + rles = mask_utils.frPyObjects(segmentation, h, w) + rle = mask_utils.merge(rles) + area = mask_utils.area(rle) + + if self._context._merge_polygons: + binary_mask = mask_utils.decode(rle).astype(np.bool) + binary_mask = np.asfortranarray(binary_mask, dtype=np.uint8) + segmentation = mask_tools.convert_mask_to_rle(binary_mask) + is_crowd = True + bbox = [int(i) for i in mask_utils.toBbox(rle)] + + if ann.group is not None: + # Mark the group as visited to prevent repeats + for a in annotations[:]: + if a.group == ann.group: + annotations.remove(a) + + if segmentation is None: + is_crowd = False + segmentation = [ann.get_polygon()] + area = ann.area() + + if self._context._merge_polygons: + h, w, _ = item.image.shape + rles = mask_utils.frPyObjects(segmentation, h, w) + rle = mask_utils.merge(rles) + area = mask_utils.area(rle) + binary_mask = mask_utils.decode(rle).astype(np.bool) + binary_mask = np.asfortranarray(binary_mask, dtype=np.uint8) + segmentation = mask_tools.convert_mask_to_rle(binary_mask) + is_crowd = True + bbox = [int(i) for i in mask_utils.toBbox(rle)] + + if bbox is None: + bbox = ann.get_bbox() + + elem = { + 'id': self._get_ann_id(ann), + 'image_id': _cast(item.id, int, 0), + 'category_id': _cast(ann.label, int, -1) + 1, + 'segmentation': segmentation, + 'area': float(area), + 'bbox': bbox, + 'iscrowd': int(is_crowd), + } + if 'score' in ann.attributes: + elem['score'] = float(ann.attributes['score']) + + self.annotations.append(elem) + +class _ImageInfoConverter(_TaskConverter): + def is_empty(self): + return len(self._data['images']) == 0 + + def save_categories(self, dataset): + pass + + def save_annotations(self, item): + pass + +class _CaptionsConverter(_TaskConverter): + def save_categories(self, dataset): + pass + + def save_annotations(self, item): + for ann in item.annotations: + if ann.type != AnnotationType.caption: + continue + + elem = { + 'id': self._get_ann_id(ann), + 'image_id': _cast(item.id, int, 0), + 'category_id': 0, # NOTE: workaround for a bug in cocoapi + 'caption': ann.caption, + } + if 'score' in ann.attributes: + elem['score'] = float(ann.attributes['score']) + + self.annotations.append(elem) + +class _KeypointsConverter(_TaskConverter): + def save_categories(self, dataset): + label_categories = dataset.categories().get(AnnotationType.label) + if label_categories is None: + return + points_categories = dataset.categories().get(AnnotationType.points) + if points_categories is None: + return + + for idx, kp_cat in points_categories.items.items(): + label_cat = label_categories.items[idx] + + cat = { + 'id': 1 + idx, + 'name': _cast(label_cat.name, str, ''), + 'supercategory': _cast(label_cat.parent, str, ''), + 'keypoints': [str(l) for l in kp_cat.labels], + 'skeleton': [int(i) for i in kp_cat.adjacent], + } + self.categories.append(cat) + + def save_annotations(self, item): + for ann in item.annotations: + if ann.type != AnnotationType.points: + continue + + elem = { + 'id': self._get_ann_id(ann), + 'image_id': _cast(item.id, int, 0), + 'category_id': _cast(ann.label, int, -1) + 1, + } + if 'score' in ann.attributes: + elem['score'] = float(ann.attributes['score']) + + keypoints = [] + points = ann.get_points() + visibility = ann.visibility + for index in range(0, len(points), 2): + kp = points[index : index + 2] + state = visibility[index // 2].value + keypoints.extend([*kp, state]) + + num_visible = len([v for v in visibility \ + if v == PointsObject.Visibility.visible]) + + bbox = find(item.annotations, lambda x: \ + x.group == ann.group and \ + x.type == AnnotationType.bbox and + x.label == ann.label) + if bbox is None: + bbox = BboxObject(*ann.get_bbox()) + elem.update({ + 'segmentation': bbox.get_polygon(), + 'area': bbox.area(), + 'bbox': bbox.get_bbox(), + 'iscrowd': 0, + 'keypoints': keypoints, + 'num_keypoints': num_visible, + }) + + self.annotations.append(elem) + +class _LabelsConverter(_TaskConverter): + def save_categories(self, dataset): + label_categories = dataset.categories().get(AnnotationType.label) + if label_categories is None: + return + + for idx, cat in enumerate(label_categories.items): + self.categories.append({ + 'id': 1 + idx, + 'name': _cast(cat.name, str, ''), + 'supercategory': _cast(cat.parent, str, ''), + }) + + def save_annotations(self, item): + for ann in item.annotations: + if ann.type != AnnotationType.label: + continue + + elem = { + 'id': self._get_ann_id(ann), + 'image_id': _cast(item.id, int, 0), + 'category_id': int(ann.label) + 1, + } + if 'score' in ann.attributes: + elem['score'] = float(ann.attributes['score']) + + self.annotations.append(elem) + +class _Converter: + _TASK_CONVERTER = { + CocoTask.image_info: _ImageInfoConverter, + CocoTask.instances: _InstancesConverter, + CocoTask.person_keypoints: _KeypointsConverter, + CocoTask.captions: _CaptionsConverter, + CocoTask.labels: _LabelsConverter, + } + + def __init__(self, extractor, save_dir, + tasks=None, save_images=False, merge_polygons=False): + assert tasks is None or isinstance(tasks, (CocoTask, list)) + if tasks is None: + tasks = list(self._TASK_CONVERTER) + elif isinstance(tasks, CocoTask): + tasks = [tasks] + else: + for t in tasks: + assert t in CocoTask + self._tasks = tasks + + self._extractor = extractor + self._save_dir = save_dir + + self._save_images = save_images + self._merge_polygons = merge_polygons + + def make_dirs(self): + self._images_dir = osp.join(self._save_dir, CocoPath.IMAGES_DIR) + os.makedirs(self._images_dir, exist_ok=True) + + self._ann_dir = osp.join(self._save_dir, CocoPath.ANNOTATIONS_DIR) + os.makedirs(self._ann_dir, exist_ok=True) + + def make_task_converter(self, task): + if task not in self._TASK_CONVERTER: + raise NotImplementedError() + return self._TASK_CONVERTER[task](self) + + def make_task_converters(self): + return { + task: self.make_task_converter(task) for task in self._tasks + } + + def save_image(self, item, filename): + path = osp.join(self._images_dir, filename) + save_image(path, item.image) + + return path + + def convert(self): + self.make_dirs() + + subsets = self._extractor.subsets() + if len(subsets) == 0: + subsets = [ None ] + + for subset_name in subsets: + if subset_name: + subset = self._extractor.get_subset(subset_name) + else: + subset_name = DEFAULT_SUBSET_NAME + subset = self._extractor + + task_converters = self.make_task_converters() + for task_conv in task_converters.values(): + task_conv.save_categories(subset) + for item in subset: + filename = '' + if item.has_image: + filename = str(item.id) + CocoPath.IMAGE_EXT + if self._save_images: + self.save_image(item, filename) + for task_conv in task_converters.values(): + task_conv.save_image_info(item, filename) + task_conv.save_annotations(item) + + for task, task_conv in task_converters.items(): + if not task_conv.is_empty(): + task_conv.write(osp.join(self._ann_dir, + '%s_%s.json' % (task.name, subset_name))) + +class CocoConverter(Converter): + def __init__(self, + tasks=None, save_images=False, merge_polygons=False, + cmdline_args=None): + super().__init__() + + self._options = { + 'tasks': tasks, + 'save_images': save_images, + 'merge_polygons': merge_polygons, + } + + if cmdline_args is not None: + self._options.update(self._parse_cmdline(cmdline_args)) + + @staticmethod + def _split_tasks_string(s): + return [CocoTask[i.strip()] for i in s.split(',')] + + @classmethod + def build_cmdline_parser(cls, parser=None): + import argparse + if not parser: + parser = argparse.ArgumentParser() + + parser.add_argument('--save-images', action='store_true', + help="Save images (default: %(default)s)") + parser.add_argument('--merge-polygons', action='store_true', + help="Merge instance polygons into a mask (default: %(default)s)") + parser.add_argument('--tasks', type=cls._split_tasks_string, + default=None, + help="COCO task filter, comma-separated list of {%s} " + "(default: all)" % ', '.join([t.name for t in CocoTask])) + + return parser + + def __call__(self, extractor, save_dir): + converter = _Converter(extractor, save_dir, **self._options) + converter.convert() + +def CocoInstancesConverter(**kwargs): + return CocoConverter(CocoTask.instances, **kwargs) + +def CocoImageInfoConverter(**kwargs): + return CocoConverter(CocoTask.image_info, **kwargs) + +def CocoPersonKeypointsConverter(**kwargs): + return CocoConverter(CocoTask.person_keypoints, **kwargs) + +def CocoCaptionsConverter(**kwargs): + return CocoConverter(CocoTask.captions, **kwargs) + +def CocoLabelsConverter(**kwargs): + return CocoConverter(CocoTask.labels, **kwargs) \ No newline at end of file diff --git a/datumaro/datumaro/components/converters/tfrecord.py b/datumaro/datumaro/components/converters/tfrecord.py new file mode 100644 index 000000000000..bc28e74f0caf --- /dev/null +++ b/datumaro/datumaro/components/converters/tfrecord.py @@ -0,0 +1,146 @@ + +# Copyright (C) 2019 Intel Corporation +# +# SPDX-License-Identifier: MIT + +import codecs +from collections import OrderedDict +import os +import os.path as osp +import string + +from datumaro.components.extractor import AnnotationType, DEFAULT_SUBSET_NAME +from datumaro.components.formats.tfrecord import DetectionApiPath +from datumaro.util.image import encode_image +from datumaro.util.tf_util import import_tf as _import_tf + + +# we need it to filter out non-ASCII characters, otherwise training will crash +_printable = set(string.printable) +def _make_printable(s): + return ''.join(filter(lambda x: x in _printable, s)) + +def _make_tf_example(item, get_label_id, get_label, save_images=False): + tf = _import_tf() + + def int64_feature(value): + return tf.train.Feature(int64_list=tf.train.Int64List(value=[value])) + + def int64_list_feature(value): + return tf.train.Feature(int64_list=tf.train.Int64List(value=value)) + + def bytes_feature(value): + return tf.train.Feature(bytes_list=tf.train.BytesList(value=[value])) + + def bytes_list_feature(value): + return tf.train.Feature(bytes_list=tf.train.BytesList(value=value)) + + def float_list_feature(value): + return tf.train.Feature(float_list=tf.train.FloatList(value=value)) + + + features = { + 'image/source_id': bytes_feature(str(item.id).encode('utf-8')), + 'image/filename': bytes_feature( + ('%s%s' % (item.id, DetectionApiPath.IMAGE_EXT)).encode('utf-8')), + } + + if not item.has_image: + raise Exception( + "Failed to export dataset item '%s': item has no image" % item.id) + height, width, _ = item.image.shape + + features.update({ + 'image/height': int64_feature(height), + 'image/width': int64_feature(width), + }) + + if save_images and item.has_image: + fmt = DetectionApiPath.IMAGE_FORMAT + buffer = encode_image(item.image, DetectionApiPath.IMAGE_EXT) + + features.update({ + 'image/encoded': bytes_feature(buffer), + 'image/format': bytes_feature(fmt.encode('utf-8')), + }) + + xmins = [] # List of normalized left x coordinates in bounding box (1 per box) + xmaxs = [] # List of normalized right x coordinates in bounding box (1 per box) + ymins = [] # List of normalized top y coordinates in bounding box (1 per box) + ymaxs = [] # List of normalized bottom y coordinates in bounding box (1 per box) + classes_text = [] # List of string class name of bounding box (1 per box) + classes = [] # List of integer class id of bounding box (1 per box) + + boxes = [ann for ann in item.annotations if ann.type is AnnotationType.bbox] + for box in boxes: + box_label = _make_printable(get_label(box.label)) + + xmins.append(box.points[0] / width) + xmaxs.append(box.points[2] / width) + ymins.append(box.points[1] / height) + ymaxs.append(box.points[3] / height) + classes_text.append(box_label.encode('utf-8')) + classes.append(get_label_id(box.label)) + + if boxes: + features.update({ + 'image/object/bbox/xmin': float_list_feature(xmins), + 'image/object/bbox/xmax': float_list_feature(xmaxs), + 'image/object/bbox/ymin': float_list_feature(ymins), + 'image/object/bbox/ymax': float_list_feature(ymaxs), + 'image/object/class/text': bytes_list_feature(classes_text), + 'image/object/class/label': int64_list_feature(classes), + }) + + tf_example = tf.train.Example( + features=tf.train.Features(feature=features)) + + return tf_example + +class DetectionApiConverter: + def __init__(self, save_images=True): + self.save_images = save_images + + def __call__(self, extractor, save_dir): + tf = _import_tf() + + os.makedirs(save_dir, exist_ok=True) + + subsets = extractor.subsets() + if len(subsets) == 0: + subsets = [ None ] + + for subset_name in subsets: + if subset_name: + subset = extractor.get_subset(subset_name) + else: + subset_name = DEFAULT_SUBSET_NAME + subset = extractor + + label_categories = subset.categories()[AnnotationType.label] + get_label = lambda label_id: label_categories.items[label_id].name \ + if label_id is not None else '' + label_ids = OrderedDict((label.name, 1 + idx) + for idx, label in enumerate(label_categories.items)) + map_label_id = lambda label_id: label_ids.get(get_label(label_id), 0) + + labelmap_path = osp.join(save_dir, DetectionApiPath.LABELMAP_FILE) + with codecs.open(labelmap_path, 'w', encoding='utf8') as f: + for label, idx in label_ids.items(): + f.write( + 'item {\n' + + ('\tid: %s\n' % (idx)) + + ("\tname: '%s'\n" % (label)) + + '}\n\n' + ) + + anno_path = osp.join(save_dir, '%s.tfrecord' % (subset_name)) + with tf.io.TFRecordWriter(anno_path) as writer: + for item in subset: + tf_example = _make_tf_example( + item, + get_label=get_label, + get_label_id=map_label_id, + save_images=self.save_images, + ) + writer.write(tf_example.SerializeToString()) diff --git a/datumaro/datumaro/components/converters/voc.py b/datumaro/datumaro/components/converters/voc.py new file mode 100644 index 000000000000..d8ba98cf37ab --- /dev/null +++ b/datumaro/datumaro/components/converters/voc.py @@ -0,0 +1,413 @@ + +# Copyright (C) 2019 Intel Corporation +# +# SPDX-License-Identifier: MIT + +from collections import OrderedDict, defaultdict +import logging as log +from lxml import etree as ET +import os +import os.path as osp + +from datumaro.components.converter import Converter +from datumaro.components.extractor import DEFAULT_SUBSET_NAME, AnnotationType +from datumaro.components.formats.voc import VocLabel, VocAction, \ + VocBodyPart, VocPose, VocTask, VocPath, VocColormap, VocInstColormap +from datumaro.util import find +from datumaro.util.image import save_image +from datumaro.util.mask_tools import apply_colormap + + +def _write_xml_bbox(bbox, parent_elem): + x, y, w, h = bbox + bbox_elem = ET.SubElement(parent_elem, 'bndbox') + ET.SubElement(bbox_elem, 'xmin').text = str(x) + ET.SubElement(bbox_elem, 'ymin').text = str(y) + ET.SubElement(bbox_elem, 'xmax').text = str(x + w) + ET.SubElement(bbox_elem, 'ymax').text = str(y + h) + return bbox_elem + +class _Converter: + _LABELS = set([entry.name for entry in VocLabel]) + _BODY_PARTS = set([entry.name for entry in VocBodyPart]) + _ACTIONS = set([entry.name for entry in VocAction]) + + def __init__(self, extractor, save_dir, + tasks=None, apply_colormap=True, save_images=False): + assert tasks is None or isinstance(tasks, (VocTask, list)) + if tasks is None: + tasks = list(VocTask) + elif isinstance(tasks, VocTask): + tasks = [tasks] + else: + for t in tasks: + assert t in VocTask + self._tasks = tasks + + self._extractor = extractor + self._save_dir = save_dir + self._apply_colormap = apply_colormap + self._save_images = save_images + + self._label_categories = extractor.categories() \ + .get(AnnotationType.label) + self._mask_categories = extractor.categories() \ + .get(AnnotationType.mask) + + def convert(self): + self.init_dirs() + self.save_subsets() + + def init_dirs(self): + save_dir = self._save_dir + subsets_dir = osp.join(save_dir, VocPath.SUBSETS_DIR) + cls_subsets_dir = osp.join(subsets_dir, + VocPath.TASK_DIR[VocTask.classification]) + action_subsets_dir = osp.join(subsets_dir, + VocPath.TASK_DIR[VocTask.action_classification]) + layout_subsets_dir = osp.join(subsets_dir, + VocPath.TASK_DIR[VocTask.person_layout]) + segm_subsets_dir = osp.join(subsets_dir, + VocPath.TASK_DIR[VocTask.segmentation]) + ann_dir = osp.join(save_dir, VocPath.ANNOTATIONS_DIR) + img_dir = osp.join(save_dir, VocPath.IMAGES_DIR) + segm_dir = osp.join(save_dir, VocPath.SEGMENTATION_DIR) + inst_dir = osp.join(save_dir, VocPath.INSTANCES_DIR) + images_dir = osp.join(save_dir, VocPath.IMAGES_DIR) + + os.makedirs(subsets_dir, exist_ok=True) + os.makedirs(ann_dir, exist_ok=True) + os.makedirs(img_dir, exist_ok=True) + os.makedirs(segm_dir, exist_ok=True) + os.makedirs(inst_dir, exist_ok=True) + os.makedirs(images_dir, exist_ok=True) + + self._subsets_dir = subsets_dir + self._cls_subsets_dir = cls_subsets_dir + self._action_subsets_dir = action_subsets_dir + self._layout_subsets_dir = layout_subsets_dir + self._segm_subsets_dir = segm_subsets_dir + self._ann_dir = ann_dir + self._img_dir = img_dir + self._segm_dir = segm_dir + self._inst_dir = inst_dir + self._images_dir = images_dir + + def get_label(self, label_id): + return self._label_categories.items[label_id].name + + def save_subsets(self): + subsets = self._extractor.subsets() + if len(subsets) == 0: + subsets = [ None ] + + for subset_name in subsets: + if subset_name: + subset = self._extractor.get_subset(subset_name) + else: + subset_name = DEFAULT_SUBSET_NAME + subset = self._extractor + + class_lists = OrderedDict() + clsdet_list = OrderedDict() + action_list = OrderedDict() + layout_list = OrderedDict() + segm_list = OrderedDict() + + for item in subset: + item_id = str(item.id) + if self._save_images: + data = item.image + if data is not None: + save_image(osp.join(self._images_dir, + str(item_id) + VocPath.IMAGE_EXT), + data) + + labels = [] + bboxes = [] + masks = [] + for a in item.annotations: + if a.type == AnnotationType.label: + labels.append(a) + elif a.type == AnnotationType.bbox: + bboxes.append(a) + elif a.type == AnnotationType.mask: + masks.append(a) + + if len(bboxes) != 0: + root_elem = ET.Element('annotation') + if '_' in item_id: + folder = item_id[ : item_id.find('_')] + else: + folder = '' + ET.SubElement(root_elem, 'folder').text = folder + ET.SubElement(root_elem, 'filename').text = \ + item_id + VocPath.IMAGE_EXT + + source_elem = ET.SubElement(root_elem, 'source') + ET.SubElement(source_elem, 'database').text = 'Unknown' + ET.SubElement(source_elem, 'annotation').text = 'Unknown' + ET.SubElement(source_elem, 'image').text = 'Unknown' + + if item.has_image: + h, w, c = item.image.shape + size_elem = ET.SubElement(root_elem, 'size') + ET.SubElement(size_elem, 'width').text = str(w) + ET.SubElement(size_elem, 'height').text = str(h) + ET.SubElement(size_elem, 'depth').text = str(c) + + item_segmented = 0 < len(masks) + ET.SubElement(root_elem, 'segmented').text = \ + str(int(item_segmented)) + + objects_with_parts = [] + objects_with_actions = defaultdict(dict) + + main_bboxes = [] + layout_bboxes = [] + for bbox in bboxes: + label = self.get_label(bbox.label) + if label in self._LABELS: + main_bboxes.append(bbox) + elif label in self._BODY_PARTS: + layout_bboxes.append(bbox) + + for new_obj_id, obj in enumerate(main_bboxes): + attr = obj.attributes + + obj_elem = ET.SubElement(root_elem, 'object') + ET.SubElement(obj_elem, 'name').text = self.get_label(obj.label) + + pose = attr.get('pose') + if pose is not None: + ET.SubElement(obj_elem, 'pose').text = VocPose[pose].name + + truncated = attr.get('truncated') + if truncated is not None: + ET.SubElement(obj_elem, 'truncated').text = '%d' % truncated + + difficult = attr.get('difficult') + if difficult is not None: + ET.SubElement(obj_elem, 'difficult').text = '%d' % difficult + + bbox = obj.get_bbox() + if bbox is not None: + _write_xml_bbox(bbox, obj_elem) + + for part in VocBodyPart: + part_bbox = find(layout_bboxes, lambda x: \ + obj.id == x.group and \ + self.get_label(x.label) == part.name) + if part_bbox is not None: + part_elem = ET.SubElement(obj_elem, 'part') + ET.SubElement(part_elem, 'name').text = part.name + _write_xml_bbox(part_bbox.get_bbox(), part_elem) + + objects_with_parts.append(new_obj_id) + + actions = [x for x in labels + if obj.id == x.group and \ + self.get_label(x.label) in self._ACTIONS] + if len(actions) != 0: + actions_elem = ET.SubElement(obj_elem, 'actions') + for action in VocAction: + presented = find(actions, lambda x: \ + self.get_label(x.label) == action.name) is not None + ET.SubElement(actions_elem, action.name).text = \ + '%d' % presented + + objects_with_actions[new_obj_id][action] = presented + + if set(self._tasks) & set([None, + VocTask.detection, + VocTask.person_layout, + VocTask.action_classification]): + with open(osp.join(self._ann_dir, item_id + '.xml'), 'w') as f: + f.write(ET.tostring(root_elem, + encoding='unicode', pretty_print=True)) + + clsdet_list[item_id] = True + layout_list[item_id] = objects_with_parts + action_list[item_id] = objects_with_actions + + for label_obj in labels: + label = self.get_label(label_obj.label) + if label not in self._LABELS: + continue + class_list = class_lists.get(item_id, set()) + class_list.add(label_obj.label) + class_lists[item_id] = class_list + + clsdet_list[item_id] = True + + for mask_obj in masks: + if mask_obj.attributes.get('class') == True: + self.save_segm(osp.join(self._segm_dir, + item_id + VocPath.SEGM_EXT), + mask_obj, self._mask_categories.colormap) + if mask_obj.attributes.get('instances') == True: + self.save_segm(osp.join(self._inst_dir, + item_id + VocPath.SEGM_EXT), + mask_obj, VocInstColormap) + + segm_list[item_id] = True + + if len(item.annotations) == 0: + clsdet_list[item_id] = None + layout_list[item_id] = None + action_list[item_id] = None + segm_list[item_id] = None + + if set(self._tasks) & set([None, + VocTask.classification, + VocTask.detection, + VocTask.action_classification, + VocTask.person_layout]): + self.save_clsdet_lists(subset_name, clsdet_list) + if set(self._tasks) & set([None, VocTask.classification]): + self.save_class_lists(subset_name, class_lists) + if set(self._tasks) & set([None, VocTask.action_classification]): + self.save_action_lists(subset_name, action_list) + if set(self._tasks) & set([None, VocTask.person_layout]): + self.save_layout_lists(subset_name, layout_list) + if set(self._tasks) & set([None, VocTask.segmentation]): + self.save_segm_lists(subset_name, segm_list) + + def save_action_lists(self, subset_name, action_list): + os.makedirs(self._action_subsets_dir, exist_ok=True) + + ann_file = osp.join(self._action_subsets_dir, subset_name + '.txt') + with open(ann_file, 'w') as f: + for item in action_list: + f.write('%s\n' % item) + + if len(action_list) == 0: + return + + for action in VocAction: + ann_file = osp.join(self._action_subsets_dir, + '%s_%s.txt' % (action.name, subset_name)) + with open(ann_file, 'w') as f: + for item, objs in action_list.items(): + if not objs: + continue + for obj_id, obj_actions in objs.items(): + presented = obj_actions[action] + f.write('%s %s % d\n' % \ + (item, 1 + obj_id, 1 if presented else -1)) + + def save_class_lists(self, subset_name, class_lists): + os.makedirs(self._cls_subsets_dir, exist_ok=True) + + if len(class_lists) == 0: + return + + label_cat = self._extractor.categories().get(AnnotationType.label, None) + if not label_cat: + log.warn("Unable to save classification task lists " + "as source does not provide class labels. Skipped.") + return + + for label in VocLabel: + ann_file = osp.join(self._cls_subsets_dir, + '%s_%s.txt' % (label.name, subset_name)) + with open(ann_file, 'w') as f: + for item, item_labels in class_lists.items(): + if not item_labels: + continue + item_labels = [label_cat.items[l].name for l in item_labels] + presented = label.name in item_labels + f.write('%s % d\n' % \ + (item, 1 if presented else -1)) + + def save_clsdet_lists(self, subset_name, clsdet_list): + os.makedirs(self._cls_subsets_dir, exist_ok=True) + + ann_file = osp.join(self._cls_subsets_dir, subset_name + '.txt') + with open(ann_file, 'w') as f: + for item in clsdet_list: + f.write('%s\n' % item) + + def save_segm_lists(self, subset_name, segm_list): + os.makedirs(self._segm_subsets_dir, exist_ok=True) + + ann_file = osp.join(self._segm_subsets_dir, subset_name + '.txt') + with open(ann_file, 'w') as f: + for item in segm_list: + f.write('%s\n' % item) + + def save_layout_lists(self, subset_name, layout_list): + os.makedirs(self._layout_subsets_dir, exist_ok=True) + + ann_file = osp.join(self._layout_subsets_dir, subset_name + '.txt') + with open(ann_file, 'w') as f: + for item, item_layouts in layout_list.items(): + if item_layouts: + for obj_id in item_layouts: + f.write('%s % d\n' % (item, 1 + obj_id)) + else: + f.write('%s\n' % (item)) + + def save_segm(self, path, annotation, colormap): + data = annotation.image + if self._apply_colormap: + if colormap is None: + colormap = VocColormap + data = apply_colormap(data, colormap) + save_image(path, data) + +class VocConverter(Converter): + def __init__(self, + tasks=None, save_images=False, apply_colormap=False, + cmdline_args=None): + super().__init__() + + self._options = { + 'tasks': tasks, + 'save_images': save_images, + 'apply_colormap': apply_colormap, + } + + if cmdline_args is not None: + self._options.update(self._parse_cmdline(cmdline_args)) + + @staticmethod + def _split_tasks_string(s): + return [VocTask[i.strip()] for i in s.split(',')] + + @classmethod + def build_cmdline_parser(cls, parser=None): + import argparse + if not parser: + parser = argparse.ArgumentParser() + + parser.add_argument('--save-images', action='store_true', + help="Save images (default: %(default)s)") + parser.add_argument('--apply-colormap', type=bool, default=True, + help="Use colormap for class and instance masks " + "(default: %(default)s)") + parser.add_argument('--tasks', type=cls._split_tasks_string, + default=None, + help="VOC task filter, comma-separated list of {%s} " + "(default: all)" % ', '.join([t.name for t in VocTask])) + + return parser + + def __call__(self, extractor, save_dir): + converter = _Converter(extractor, save_dir, **self._options) + converter.convert() + +def VocClassificationConverter(**kwargs): + return VocConverter(VocTask.classification, **kwargs) + +def VocDetectionConverter(**kwargs): + return VocConverter(VocTask.detection, **kwargs) + +def VocLayoutConverter(**kwargs): + return VocConverter(VocTask.person_layout, **kwargs) + +def VocActionConverter(**kwargs): + return VocConverter(VocTask.action_classification, **kwargs) + +def VocSegmentationConverter(**kwargs): + return VocConverter(VocTask.segmentation, **kwargs) diff --git a/datumaro/datumaro/components/converters/yolo.py b/datumaro/datumaro/components/converters/yolo.py new file mode 100644 index 000000000000..4bf746939d01 --- /dev/null +++ b/datumaro/datumaro/components/converters/yolo.py @@ -0,0 +1,125 @@ + +# Copyright (C) 2019 Intel Corporation +# +# SPDX-License-Identifier: MIT + +from collections import OrderedDict +import logging as log +import os +import os.path as osp + +from datumaro.components.converter import Converter +from datumaro.components.extractor import AnnotationType +from datumaro.components.formats.yolo import YoloPath +from datumaro.util.image import save_image + + +def _make_yolo_bbox(img_size, box): + # https://github.com/pjreddie/darknet/blob/master/scripts/voc_label.py + # - values relative to width and height of image + # - are center of rectangle + x = (box[0] + box[2]) / 2 / img_size[0] + y = (box[1] + box[3]) / 2 / img_size[1] + w = (box[2] - box[0]) / img_size[0] + h = (box[3] - box[1]) / img_size[1] + return x, y, w, h + +class YoloConverter(Converter): + # https://github.com/AlexeyAB/darknet#how-to-train-to-detect-your-custom-objects + + def __init__(self, save_images=False, cmdline_args=None): + super().__init__() + self._save_images = save_images + + if cmdline_args is not None: + options = self._parse_cmdline(cmdline_args) + for k, v in options.items(): + if hasattr(self, '_' + str(k)): + setattr(self, '_' + str(k), v) + + @classmethod + def build_cmdline_parser(cls, parser=None): + import argparse + if not parser: + parser = argparse.ArgumentParser() + + parser.add_argument('--save-images', action='store_true', + help="Save images (default: %(default)s)") + + return parser + + def __call__(self, extractor, save_dir): + os.makedirs(save_dir, exist_ok=True) + + label_categories = extractor.categories()[AnnotationType.label] + label_ids = {label.name: idx + for idx, label in enumerate(label_categories.items)} + with open(osp.join(save_dir, 'obj.names'), 'w') as f: + f.writelines('%s\n' % l[0] + for l in sorted(label_ids.items(), key=lambda x: x[1])) + + subsets = extractor.subsets() + if len(subsets) == 0: + subsets = [ None ] + + subset_lists = OrderedDict() + + for subset_name in subsets: + if subset_name and subset_name in YoloPath.SUBSET_NAMES: + subset = extractor.get_subset(subset_name) + elif not subset_name: + subset_name = YoloPath.DEFAULT_SUBSET_NAME + subset = extractor + else: + log.warn("Skipping subset export '%s'. " + "If specified, the only valid names are %s" % \ + (subset_name, ', '.join( + "'%s'" % s for s in YoloPath.SUBSET_NAMES))) + continue + + subset_dir = osp.join(save_dir, 'obj_%s_data' % subset_name) + os.makedirs(subset_dir, exist_ok=True) + + image_paths = OrderedDict() + + for item in subset: + image_name = '%s.jpg' % item.id + image_paths[item.id] = osp.join('data', + osp.basename(subset_dir), image_name) + + if self._save_images: + image_path = osp.join(subset_dir, image_name) + if not osp.exists(image_path): + save_image(image_path, item.image) + + height, width, _ = item.image.shape + + yolo_annotation = '' + for bbox in item.annotations: + if bbox.type is not AnnotationType.bbox: + continue + if bbox.label is None: + continue + + yolo_bb = _make_yolo_bbox((width, height), bbox.points) + yolo_bb = ' '.join('%.6f' % p for p in yolo_bb) + yolo_annotation += '%s %s\n' % (bbox.label, yolo_bb) + + annotation_path = osp.join(subset_dir, '%s.txt' % item.id) + with open(annotation_path, 'w') as f: + f.write(yolo_annotation) + + subset_list_name = '%s.txt' % subset_name + subset_lists[subset_name] = subset_list_name + with open(osp.join(save_dir, subset_list_name), 'w') as f: + f.writelines('%s\n' % s for s in image_paths.values()) + + with open(osp.join(save_dir, 'obj.data'), 'w') as f: + f.write('classes = %s\n' % len(label_ids)) + + for subset_name, subset_list_name in subset_lists.items(): + f.write('%s = %s\n' % (subset_name, + osp.join('data', subset_list_name))) + + f.write('names = %s\n' % osp.join('data', 'obj.names')) + f.write('backup = backup/\n') \ No newline at end of file diff --git a/datumaro/datumaro/components/dataset_filter.py b/datumaro/datumaro/components/dataset_filter.py new file mode 100644 index 000000000000..157720f36519 --- /dev/null +++ b/datumaro/datumaro/components/dataset_filter.py @@ -0,0 +1,193 @@ + +# Copyright (C) 2019 Intel Corporation +# +# SPDX-License-Identifier: MIT + +from lxml import etree as ET # NOTE: lxml has proper XPath implementation +from datumaro.components.extractor import (DatasetItem, Annotation, + LabelObject, MaskObject, PointsObject, PolygonObject, + PolyLineObject, BboxObject, CaptionObject, +) + + +def _cast(value, type_conv, default=None): + if value is None: + return default + try: + return type_conv(value) + except Exception: + return default + +class DatasetItemEncoder: + def encode_item(self, item): + item_elem = ET.Element('item') + ET.SubElement(item_elem, 'id').text = str(item.id) + ET.SubElement(item_elem, 'subset').text = str(item.subset) + + # Dataset wrapper-specific + ET.SubElement(item_elem, 'source').text = \ + str(getattr(item, 'source', None)) + ET.SubElement(item_elem, 'extractor').text = \ + str(getattr(item, 'extractor', None)) + + image = item.image + if image is not None: + item_elem.append(self.encode_image(image)) + + for ann in item.annotations: + item_elem.append(self.encode_object(ann)) + + return item_elem + + @classmethod + def encode_image(cls, image): + image_elem = ET.Element('image') + + h, w, c = image.shape + ET.SubElement(image_elem, 'width').text = str(w) + ET.SubElement(image_elem, 'height').text = str(h) + ET.SubElement(image_elem, 'depth').text = str(c) + + return image_elem + + @classmethod + def encode_annotation(cls, annotation): + assert isinstance(annotation, Annotation) + ann_elem = ET.Element('annotation') + ET.SubElement(ann_elem, 'id').text = str(annotation.id) + ET.SubElement(ann_elem, 'type').text = str(annotation.type.name) + + for k, v in annotation.attributes.items(): + ET.SubElement(ann_elem, k).text = str(v) + + ET.SubElement(ann_elem, 'group').text = str(annotation.group) + + return ann_elem + + @classmethod + def encode_label_object(cls, obj): + ann_elem = cls.encode_annotation(obj) + + ET.SubElement(ann_elem, 'label_id').text = str(obj.label) + + return ann_elem + + @classmethod + def encode_mask_object(cls, obj): + ann_elem = cls.encode_annotation(obj) + + ET.SubElement(ann_elem, 'label_id').text = str(obj.label) + + mask = obj.image + if mask is not None: + ann_elem.append(cls.encode_image(mask)) + + return ann_elem + + @classmethod + def encode_bbox_object(cls, obj): + ann_elem = cls.encode_annotation(obj) + + ET.SubElement(ann_elem, 'label_id').text = str(obj.label) + ET.SubElement(ann_elem, 'x').text = str(obj.x) + ET.SubElement(ann_elem, 'y').text = str(obj.y) + ET.SubElement(ann_elem, 'w').text = str(obj.w) + ET.SubElement(ann_elem, 'h').text = str(obj.h) + ET.SubElement(ann_elem, 'area').text = str(obj.area()) + + return ann_elem + + @classmethod + def encode_points_object(cls, obj): + ann_elem = cls.encode_annotation(obj) + + ET.SubElement(ann_elem, 'label_id').text = str(obj.label) + + x, y, w, h = obj.get_bbox() + area = w * h + bbox_elem = ET.SubElement(ann_elem, 'bbox') + ET.SubElement(bbox_elem, 'x').text = str(x) + ET.SubElement(bbox_elem, 'y').text = str(y) + ET.SubElement(bbox_elem, 'w').text = str(w) + ET.SubElement(bbox_elem, 'h').text = str(h) + ET.SubElement(bbox_elem, 'area').text = str(area) + + points = ann_elem.points + for i in range(0, len(points), 2): + point_elem = ET.SubElement(ann_elem, 'point') + ET.SubElement(point_elem, 'x').text = str(points[i * 2]) + ET.SubElement(point_elem, 'y').text = str(points[i * 2 + 1]) + ET.SubElement(point_elem, 'visible').text = \ + str(ann_elem.visibility[i // 2].name) + + return ann_elem + + @classmethod + def encode_polyline_object(cls, obj): + ann_elem = cls.encode_annotation(obj) + + ET.SubElement(ann_elem, 'label_id').text = str(obj.label) + + x, y, w, h = obj.get_bbox() + area = w * h + bbox_elem = ET.SubElement(ann_elem, 'bbox') + ET.SubElement(bbox_elem, 'x').text = str(x) + ET.SubElement(bbox_elem, 'y').text = str(y) + ET.SubElement(bbox_elem, 'w').text = str(w) + ET.SubElement(bbox_elem, 'h').text = str(h) + ET.SubElement(bbox_elem, 'area').text = str(area) + + points = ann_elem.points + for i in range(0, len(points), 2): + point_elem = ET.SubElement(ann_elem, 'point') + ET.SubElement(point_elem, 'x').text = str(points[i * 2]) + ET.SubElement(point_elem, 'y').text = str(points[i * 2 + 1]) + + return ann_elem + + @classmethod + def encode_caption_object(cls, obj): + ann_elem = cls.encode_annotation(obj) + + ET.SubElement(ann_elem, 'caption').text = str(obj.caption) + + return ann_elem + + def encode_object(self, o): + if isinstance(o, LabelObject): + return self.encode_label_object(o) + if isinstance(o, MaskObject): + return self.encode_mask_object(o) + if isinstance(o, BboxObject): + return self.encode_bbox_object(o) + if isinstance(o, PointsObject): + return self.encode_points_object(o) + if isinstance(o, PolyLineObject): + return self.encode_polyline_object(o) + if isinstance(o, PolygonObject): + return self.encode_polygon_object(o) + if isinstance(o, CaptionObject): + return self.encode_caption_object(o) + if isinstance(o, Annotation): # keep after derived classes + return self.encode_annotation(o) + + if isinstance(o, DatasetItem): + return self.encode_item(o) + + return None + +class XPathDatasetFilter: + def __init__(self, filter_text=None): + self._filter = None + if filter_text is not None: + self._filter = ET.XPath(filter_text) + self._encoder = DatasetItemEncoder() + + def __call__(self, item): + encoded_item = self._serialize_item(item) + if self._filter is None: + return True + return bool(self._filter(encoded_item)) + + def _serialize_item(self, item): + return self._encoder.encode_item(item) \ No newline at end of file diff --git a/datumaro/datumaro/components/extractor.py b/datumaro/datumaro/components/extractor.py new file mode 100644 index 000000000000..bf73a9f05af9 --- /dev/null +++ b/datumaro/datumaro/components/extractor.py @@ -0,0 +1,560 @@ + +# Copyright (C) 2019 Intel Corporation +# +# SPDX-License-Identifier: MIT + +from collections import namedtuple +from enum import Enum +import numpy as np + + +AnnotationType = Enum('AnnotationType', + [ + 'label', + 'mask', + 'points', + 'polygon', + 'polyline', + 'bbox', + 'caption', + ]) + +class Annotation: + # pylint: disable=redefined-builtin + def __init__(self, id=None, type=None, attributes=None, group=None): + if id is not None: + id = int(id) + self.id = id + + assert type in AnnotationType + self.type = type + + if attributes is None: + attributes = {} + else: + attributes = dict(attributes) + self.attributes = attributes + + if group is not None: + group = int(group) + self.group = group + # pylint: enable=redefined-builtin + + def __eq__(self, other): + if not isinstance(other, Annotation): + return False + return \ + (self.id == other.id) and \ + (self.type == other.type) and \ + (self.attributes == other.attributes) and \ + (self.group == other.group) + +class Categories: + def __init__(self, attributes=None): + if attributes is None: + attributes = set() + self.attributes = attributes + + def __eq__(self, other): + if not isinstance(other, Categories): + return False + return \ + (self.attributes == other.attributes) + +class LabelCategories(Categories): + Category = namedtuple('Category', ['name', 'parent']) + + def __init__(self, items=None, attributes=None): + super().__init__(attributes=attributes) + + if items is None: + items = [] + self.items = items + + self._indices = {} + self._reindex() + + def _reindex(self): + indices = {} + for index, item in enumerate(self.items): + assert item.name not in self._indices + indices[item.name] = index + self._indices = indices + + def add(self, name, parent=None): + assert name not in self._indices + + index = len(self.items) + self.items.append(self.Category(name, parent)) + self._indices[name] = index + + def find(self, name): + index = self._indices.get(name) + if index: + return index, self.items[index] + return index, None + + def __eq__(self, other): + if not super().__eq__(other): + return False + return \ + (self.items == other.items) + +class LabelObject(Annotation): + # pylint: disable=redefined-builtin + def __init__(self, label=None, + id=None, attributes=None, group=None): + super().__init__(id=id, type=AnnotationType.label, + attributes=attributes, group=group) + self.label = label + # pylint: enable=redefined-builtin + + def __eq__(self, other): + if not super().__eq__(other): + return False + return \ + (self.label == other.label) + +class MaskCategories(Categories): + def __init__(self, colormap=None, inverse_colormap=None, attributes=None): + super().__init__(attributes=attributes) + + # colormap: label id -> color + if colormap is None: + colormap = {} + self.colormap = colormap + self._inverse_colormap = inverse_colormap + + @property + def inverse_colormap(self): + from datumaro.util.mask_tools import invert_colormap + if self._inverse_colormap is None: + if self.colormap is not None: + try: + self._inverse_colormap = invert_colormap(self.colormap) + except Exception: + pass + return self._inverse_colormap + + def __eq__(self, other): + if not super().__eq__(other): + return False + for label_id, my_color in self.colormap.items(): + other_color = other.colormap.get(label_id) + if not np.array_equal(my_color, other_color): + return False + return True + +class MaskObject(Annotation): + # pylint: disable=redefined-builtin + def __init__(self, image=None, label=None, + id=None, attributes=None, group=None): + super().__init__(id=id, type=AnnotationType.mask, + attributes=attributes, group=group) + self._image = image + self._label = label + # pylint: enable=redefined-builtin + + @property + def label(self): + return self._label + + @property + def image(self): + if callable(self._image): + return self._image() + return self._image + + def painted_data(self, colormap): + raise NotImplementedError() + + def area(self): + raise NotImplementedError() + + def extract(self, class_id): + raise NotImplementedError() + + def bbox(self): + raise NotImplementedError() + + def __eq__(self, other): + if not super().__eq__(other): + return False + return \ + (self.label == other.label) and \ + (self.image is not None and other.image is not None and \ + np.all(self.image == other.image)) + +def compute_iou(bbox_a, bbox_b): + aX, aY, aW, aH = bbox_a + bX, bY, bW, bH = bbox_b + in_right = min(aX + aW, bX + bW) + in_left = max(aX, bX) + in_top = max(aY, bY) + in_bottom = min(aY + aH, bY + bH) + + in_w = max(0, in_right - in_left) + in_h = max(0, in_bottom - in_top) + intersection = in_w * in_h + + a_area = aW * aH + b_area = bW * bH + union = a_area + b_area - intersection + + return intersection / max(1.0, union) + +class ShapeObject(Annotation): + # pylint: disable=redefined-builtin + def __init__(self, type, points=None, label=None, + id=None, attributes=None, group=None): + super().__init__(id=id, type=type, + attributes=attributes, group=group) + self.points = points + self.label = label + # pylint: enable=redefined-builtin + + def area(self): + raise NotImplementedError() + + def get_polygon(self): + raise NotImplementedError() + + def get_bbox(self): + points = self.get_points() + if not self.points: + return None + + xs = [p for p in points[0::2]] + ys = [p for p in points[1::2]] + x0 = min(xs) + x1 = max(xs) + y0 = min(ys) + y1 = max(ys) + return [x0, y0, x1 - x0, y1 - y0] + + def get_points(self): + return self.points + + def get_mask(self): + raise NotImplementedError() + + def __eq__(self, other): + if not super().__eq__(other): + return False + return \ + (self.points == other.points) and \ + (self.label == other.label) + +class PolyLineObject(ShapeObject): + # pylint: disable=redefined-builtin + def __init__(self, points=None, + label=None, id=None, attributes=None, group=None): + super().__init__(type=AnnotationType.polyline, + points=points, label=label, + id=id, attributes=attributes, group=group) + # pylint: enable=redefined-builtin + + def get_polygon(self): + return self.get_points() + + def area(self): + return 0 + +class PolygonObject(ShapeObject): + # pylint: disable=redefined-builtin + def __init__(self, points=None, + label=None, id=None, attributes=None, group=None): + super().__init__(type=AnnotationType.polygon, + points=points, label=label, + id=id, attributes=attributes, group=group) + # pylint: enable=redefined-builtin + + def get_polygon(self): + return self.get_points() + + def area(self): + import pycocotools.mask as mask_utils + + _, _, w, h = self.get_bbox() + rle = mask_utils.frPyObjects([self.get_points()], h, w) + area = mask_utils.area(rle) + return area + +class BboxObject(ShapeObject): + # pylint: disable=redefined-builtin + def __init__(self, x=0, y=0, w=0, h=0, + label=None, id=None, attributes=None, group=None): + super().__init__(type=AnnotationType.bbox, + points=[x, y, x + w, y + h], label=label, + id=id, attributes=attributes, group=group) + # pylint: enable=redefined-builtin + + @property + def x(self): + return self.points[0] + + @property + def y(self): + return self.points[1] + + @property + def w(self): + return self.points[2] - self.points[0] + + @property + def h(self): + return self.points[3] - self.points[1] + + def area(self): + return self.w * self.h + + def get_bbox(self): + return [self.x, self.y, self.w, self.h] + + def get_polygon(self): + x, y, w, h = self.get_bbox() + return [ + x, y, + x + w, y, + x + w, y + h, + x, y + h + ] + + def iou(self, other): + return compute_iou(self.get_bbox(), other.get_bbox()) + +class PointsCategories(Categories): + Category = namedtuple('Category', ['labels', 'adjacent']) + + def __init__(self, items=None, attributes=None): + super().__init__(attributes=attributes) + + if items is None: + items = {} + self.items = items + + def add(self, label_id, labels=None, adjacent=None): + if labels is None: + labels = [] + if adjacent is None: + adjacent = [] + self.items[label_id] = self.Category(labels, set(adjacent)) + + def __eq__(self, other): + if not super().__eq__(other): + return False + return \ + (self.items == other.items) + +class PointsObject(ShapeObject): + Visibility = Enum('Visibility', [ + ('absent', 0), + ('hidden', 1), + ('visible', 2), + ]) + + # pylint: disable=redefined-builtin + def __init__(self, points=None, visibility=None, label=None, + id=None, attributes=None, group=None): + if points is not None: + assert len(points) % 2 == 0 + + if visibility is not None: + assert len(visibility) == len(points) // 2 + for i, v in enumerate(visibility): + if not isinstance(v, self.Visibility): + visibility[i] = self.Visibility(v) + else: + visibility = [] + for _ in range(len(points) // 2): + visibility.append(self.Visibility.absent) + + super().__init__(type=AnnotationType.points, + points=points, label=label, + id=id, attributes=attributes, group=group) + + self.visibility = visibility + # pylint: enable=redefined-builtin + + def area(self): + return 0 + + def __eq__(self, other): + if not super().__eq__(other): + return False + return \ + (self.visibility == other.visibility) + +class CaptionObject(Annotation): + # pylint: disable=redefined-builtin + def __init__(self, caption=None, + id=None, attributes=None, group=None): + super().__init__(id=id, type=AnnotationType.caption, + attributes=attributes, group=group) + + if caption is None: + caption = '' + self.caption = caption + # pylint: enable=redefined-builtin + + def __eq__(self, other): + if not super().__eq__(other): + return False + return \ + (self.caption == other.caption) + +class DatasetItem: + # pylint: disable=redefined-builtin + def __init__(self, id, annotations=None, + subset=None, path=None, image=None): + assert id is not None + if not isinstance(id, str): + id = str(id) + assert len(id) != 0 + self._id = id + + if subset is None: + subset = '' + assert isinstance(subset, str) + self._subset = subset + + if path is None: + path = [] + self._path = path + + if annotations is None: + annotations = [] + self._annotations = annotations + + self._image = image + # pylint: enable=redefined-builtin + + @property + def id(self): + return self._id + + @property + def subset(self): + return self._subset + + @property + def path(self): + return self._path + + @property + def annotations(self): + return self._annotations + + @property + def image(self): + if callable(self._image): + return self._image() + return self._image + + @property + def has_image(self): + return self._image is not None + + def __eq__(self, other): + if not isinstance(other, __class__): + return False + return \ + (self.id == other.id) and \ + (self.subset == other.subset) and \ + (self.annotations == other.annotations) and \ + (self.has_image == other.has_image) and \ + (self.has_image and np.all(self.image == other.image) or \ + not self.has_image) + +class IExtractor: + def __iter__(self): + raise NotImplementedError() + + def __len__(self): + raise NotImplementedError() + + def subsets(self): + raise NotImplementedError() + + def get_subset(self, name): + raise NotImplementedError() + + def categories(self): + raise NotImplementedError() + + def select(self, pred): + raise NotImplementedError() + + def get(self, item_id, subset=None, path=None): + raise NotImplementedError() + +class _DatasetFilter: + def __init__(self, iterable, predicate): + self.iterable = iterable + self.predicate = predicate + + def __iter__(self): + return filter(self.predicate, self.iterable) + +class _ExtractorBase(IExtractor): + def __init__(self, length=None): + self._length = length + self._subsets = None + + def _init_cache(self): + subsets = set() + length = -1 + for length, item in enumerate(self): + subsets.add(item.subset) + length += 1 + + if self._length is None: + self._length = length + if self._subsets is None: + self._subsets = subsets + + def __len__(self): + if self._length is None: + self._init_cache() + return self._length + + def subsets(self): + if self._subsets is None: + self._init_cache() + return list(self._subsets) + + def get_subset(self, name): + if name in self.subsets(): + return self.select(lambda item: item.subset == name) + else: + raise Exception("Unknown subset '%s' requested" % name) + +class DatasetIteratorWrapper(_ExtractorBase): + def __init__(self, iterable, categories): + super().__init__(length=None) + self._iterable = iterable + self._categories = categories + + def __iter__(self): + return iter(self._iterable) + + def categories(self): + return self._categories + + def select(self, pred): + return DatasetIteratorWrapper( + _DatasetFilter(self, pred), self.categories()) + +class Extractor(_ExtractorBase): + def __init__(self, length=None): + super().__init__(length=None) + + def categories(self): + return {} + + def select(self, pred): + return DatasetIteratorWrapper( + _DatasetFilter(self, pred), self.categories()) + + +DEFAULT_SUBSET_NAME = 'default' \ No newline at end of file diff --git a/datumaro/datumaro/components/extractors/__init__.py b/datumaro/datumaro/components/extractors/__init__.py new file mode 100644 index 000000000000..9820a27df4d2 --- /dev/null +++ b/datumaro/datumaro/components/extractors/__init__.py @@ -0,0 +1,62 @@ + +# Copyright (C) 2019 Intel Corporation +# +# SPDX-License-Identifier: MIT + +from datumaro.components.extractors.datumaro import DatumaroExtractor + +from datumaro.components.extractors.ms_coco import ( + CocoImageInfoExtractor, + CocoCaptionsExtractor, + CocoInstancesExtractor, + CocoLabelsExtractor, + CocoPersonKeypointsExtractor, +) + +from datumaro.components.extractors.voc import ( + VocClassificationExtractor, + VocDetectionExtractor, + VocSegmentationExtractor, + VocLayoutExtractor, + VocActionExtractor, + VocComp_1_2_Extractor, + VocComp_3_4_Extractor, + VocComp_5_6_Extractor, + VocComp_7_8_Extractor, + VocComp_9_10_Extractor, +) + +from datumaro.components.extractors.yolo import ( + YoloExtractor, +) + +from datumaro.components.extractors.tfrecord import ( + DetectionApiExtractor, +) + + +items = [ + ('datumaro', DatumaroExtractor), + + ('coco_images', CocoImageInfoExtractor), + ('coco_captions', CocoCaptionsExtractor), + ('coco_instances', CocoInstancesExtractor), + ('coco_person_kp', CocoPersonKeypointsExtractor), + ('coco_labels', CocoLabelsExtractor), + + ('voc_cls', VocClassificationExtractor), + ('voc_det', VocDetectionExtractor), + ('voc_segm', VocSegmentationExtractor), + ('voc_layout', VocLayoutExtractor), + ('voc_action', VocActionExtractor), + + ('voc_comp_1_2', VocComp_1_2_Extractor), + ('voc_comp_3_4', VocComp_3_4_Extractor), + ('voc_comp_5_6', VocComp_5_6_Extractor), + ('voc_comp_7_8', VocComp_7_8_Extractor), + ('voc_comp_9_10', VocComp_9_10_Extractor), + + ('yolo', YoloExtractor), + + ('tf_detection_api', DetectionApiExtractor), +] \ No newline at end of file diff --git a/datumaro/datumaro/components/extractors/datumaro.py b/datumaro/datumaro/components/extractors/datumaro.py new file mode 100644 index 000000000000..6bb336533114 --- /dev/null +++ b/datumaro/datumaro/components/extractors/datumaro.py @@ -0,0 +1,214 @@ + +# Copyright (C) 2019 Intel Corporation +# +# SPDX-License-Identifier: MIT + +from collections import defaultdict +import json +import logging as log +import os.path as osp + +from datumaro.components.extractor import (Extractor, DatasetItem, + DEFAULT_SUBSET_NAME, + AnnotationType, + LabelObject, MaskObject, PointsObject, PolygonObject, + PolyLineObject, BboxObject, CaptionObject, + LabelCategories, MaskCategories, PointsCategories +) +from datumaro.components.formats.datumaro import DatumaroPath +from datumaro.util import dir_items +from datumaro.util.image import lazy_image +from datumaro.util.mask_tools import lazy_mask + + +class DatumaroExtractor(Extractor): + class Subset(Extractor): + def __init__(self, name, parent): + super().__init__() + self._parent = parent + self._name = name + self.items = [] + + def __iter__(self): + for item in self.items: + yield self._parent._get(item, self._name) + + def __len__(self): + return len(self.items) + + def categories(self): + return self._parent.categories() + + def __init__(self, path): + super().__init__() + + assert osp.isdir(path) + self._path = path + + annotations = defaultdict(list) + found_subsets = self._find_subsets(path) + parsed_anns = None + subsets = {} + for subset_name, subset_path in found_subsets.items(): + if subset_name == DEFAULT_SUBSET_NAME: + subset_name = None + subset = self.Subset(subset_name, self) + with open(subset_path, 'r') as f: + parsed_anns = json.load(f) + + for index, _ in enumerate(parsed_anns['items']): + subset.items.append(index) + + annotations[subset_name] = parsed_anns + subsets[subset_name] = subset + self._annotations = dict(annotations) + self._subsets = subsets + + self._categories = {} + if parsed_anns is not None: + self._categories = self._load_categories(parsed_anns) + + @staticmethod + def _load_categories(parsed): + categories = {} + + parsed_label_cat = parsed['categories'].get(AnnotationType.label.name) + if parsed_label_cat: + label_categories = LabelCategories() + for item in parsed_label_cat['labels']: + label_categories.add(item['name'], parent=item['parent']) + + categories[AnnotationType.label] = label_categories + + parsed_mask_cat = parsed['categories'].get(AnnotationType.mask.name) + if parsed_mask_cat: + colormap = {} + for item in parsed_mask_cat['colormap']: + colormap[int(item['label_id'])] = \ + (item['r'], item['g'], item['b']) + + mask_categories = MaskCategories(colormap=colormap) + categories[AnnotationType.mask] = mask_categories + + parsed_points_cat = parsed['categories'].get(AnnotationType.points.name) + if parsed_points_cat: + point_categories = PointsCategories() + for item in parsed_points_cat['items']: + point_categories.add(int(item['label_id']), + item['labels'], adjacent=item['adjacent']) + + categories[AnnotationType.points] = point_categories + + return categories + + def _get(self, index, subset_name): + item = self._annotations[subset_name]['items'][index] + + item_id = item.get('id') + + image_path = osp.join(self._path, DatumaroPath.IMAGES_DIR, + item_id + DatumaroPath.IMAGE_EXT) + image = None + if osp.isfile(image_path): + image = lazy_image(image_path) + + annotations = self._load_annotations(item) + + return DatasetItem(id=item_id, subset=subset_name, + annotations=annotations, image=image) + + def _load_annotations(self, item): + parsed = item['annotations'] + loaded = [] + + for ann in parsed: + ann_id = ann.get('id') + ann_type = AnnotationType[ann['type']] + attributes = ann.get('attributes') + group = ann.get('group') + + if ann_type == AnnotationType.label: + label_id = ann.get('label_id') + loaded.append(LabelObject(label=label_id, + id=ann_id, attributes=attributes, group=group)) + + elif ann_type == AnnotationType.mask: + label_id = ann.get('label_id') + mask_id = str(ann.get('mask_id')) + + mask_path = osp.join(self._path, DatumaroPath.ANNOTATIONS_DIR, + DatumaroPath.MASKS_DIR, mask_id + DatumaroPath.MASK_EXT) + mask = None + + if osp.isfile(mask_path): + mask = lazy_mask(mask_path) + else: + log.warn("Not found mask image file '%s', skipped." % \ + mask_path) + + loaded.append(MaskObject(label=label_id, image=mask, + id=ann_id, attributes=attributes, group=group)) + + elif ann_type == AnnotationType.polyline: + label_id = ann.get('label_id') + points = ann.get('points') + loaded.append(PolyLineObject(points, label=label_id, + id=ann_id, attributes=attributes, group=group)) + + elif ann_type == AnnotationType.polygon: + label_id = ann.get('label_id') + points = ann.get('points') + loaded.append(PolygonObject(points, label=label_id, + id=ann_id, attributes=attributes, group=group)) + + elif ann_type == AnnotationType.bbox: + label_id = ann.get('label_id') + x, y, w, h = ann.get('bbox') + loaded.append(BboxObject(x, y, w, h, label=label_id, + id=ann_id, attributes=attributes, group=group)) + + elif ann_type == AnnotationType.points: + label_id = ann.get('label_id') + points = ann.get('points') + loaded.append(PointsObject(points, label=label_id, + id=ann_id, attributes=attributes, group=group)) + + elif ann_type == AnnotationType.caption: + caption = ann.get('caption') + loaded.append(CaptionObject(caption, + id=ann_id, attributes=attributes, group=group)) + + else: + raise NotImplementedError() + + return loaded + + def categories(self): + return self._categories + + def __iter__(self): + for subset_name, subset in self._subsets.items(): + for index in subset.items: + yield self._get(index, subset_name) + + def __len__(self): + length = 0 + for subset in self._subsets.values(): + length += len(subset) + return length + + def subsets(self): + return list(self._subsets) + + def get_subset(self, name): + return self._subsets[name] + + @staticmethod + def _find_subsets(path): + anno_dir = osp.join(path, DatumaroPath.ANNOTATIONS_DIR) + if not osp.isdir(anno_dir): + raise Exception('Datumaro dataset not found at "%s"' % path) + + return { name: osp.join(anno_dir, name + '.json') + for name in dir_items(anno_dir, '.json', truncate_ext=True) + } \ No newline at end of file diff --git a/datumaro/datumaro/components/extractors/ms_coco.py b/datumaro/datumaro/components/extractors/ms_coco.py new file mode 100644 index 000000000000..537a297b2d1a --- /dev/null +++ b/datumaro/datumaro/components/extractors/ms_coco.py @@ -0,0 +1,309 @@ + +# Copyright (C) 2019 Intel Corporation +# +# SPDX-License-Identifier: MIT + +from collections import OrderedDict +import numpy as np +import os.path as osp + +from pycocotools.coco import COCO +import pycocotools.mask as mask_utils + +from datumaro.components.extractor import (Extractor, DatasetItem, + AnnotationType, + LabelObject, MaskObject, PointsObject, PolygonObject, + BboxObject, CaptionObject, + LabelCategories, PointsCategories +) +from datumaro.components.formats.ms_coco import CocoTask, CocoPath +from datumaro.util.image import lazy_image + + +class RleMask(MaskObject): + # pylint: disable=redefined-builtin + def __init__(self, rle=None, label=None, + id=None, attributes=None, group=None): + lazy_decode = lambda: mask_utils.decode(rle).astype(np.bool) + super().__init__(image=lazy_decode, label=label, + id=id, attributes=attributes, group=group) + + self._rle = rle + # pylint: enable=redefined-builtin + + def area(self): + return mask_utils.area(self._rle) + + def bbox(self): + return mask_utils.toBbox(self._rle) + + def __eq__(self, other): + if not isinstance(other, __class__): + return super().__eq__(other) + return self._rle == other._rle + + +class CocoExtractor(Extractor): + class Subset(Extractor): + def __init__(self, name, parent): + super().__init__() + self._name = name + self._parent = parent + self.loaders = {} + self.items = OrderedDict() + + def __iter__(self): + for img_id in self.items: + yield self._parent._get(img_id, self._name) + + def __len__(self): + return len(self.items) + + def categories(self): + return self._parent.categories() + + def __init__(self, path, task, merge_instance_polygons=False): + super().__init__() + + rootpath = path.rsplit(CocoPath.ANNOTATIONS_DIR, maxsplit=1)[0] + self._path = rootpath + self._task = task + self._subsets = {} + + subset_name = osp.splitext(osp.basename(path))[0] \ + .rsplit('_', maxsplit=1)[1] + subset = CocoExtractor.Subset(subset_name, self) + loader = self._make_subset_loader(path) + subset.loaders[task] = loader + for img_id in loader.getImgIds(): + subset.items[img_id] = None + self._subsets[subset_name] = subset + + self._load_categories() + + self._merge_instance_polygons = merge_instance_polygons + + @staticmethod + def _make_subset_loader(path): + # COCO API has an 'unclosed file' warning + coco_api = COCO() + with open(path, 'r') as f: + import json + dataset = json.load(f) + + coco_api.dataset = dataset + coco_api.createIndex() + return coco_api + + def _load_categories(self): + loaders = {} + + for subset in self._subsets.values(): + loaders.update(subset.loaders) + + self._categories = {} + + label_loader = loaders.get(CocoTask.labels) + instances_loader = loaders.get(CocoTask.instances) + person_kp_loader = loaders.get(CocoTask.person_keypoints) + + if label_loader is None and instances_loader is not None: + label_loader = instances_loader + if label_loader is None and person_kp_loader is not None: + label_loader = person_kp_loader + if label_loader is not None: + label_categories, label_map = \ + self._load_label_categories(label_loader) + self._categories[AnnotationType.label] = label_categories + self._label_map = label_map + + if person_kp_loader is not None: + person_kp_categories = \ + self._load_person_kp_categories(person_kp_loader) + self._categories[AnnotationType.points] = person_kp_categories + + # pylint: disable=no-self-use + def _load_label_categories(self, loader): + catIds = loader.getCatIds() + cats = loader.loadCats(catIds) + + categories = LabelCategories() + label_map = {} + for idx, cat in enumerate(cats): + label_map[cat['id']] = idx + categories.add(name=cat['name'], parent=cat['supercategory']) + + return categories, label_map + # pylint: enable=no-self-use + + def _load_person_kp_categories(self, loader): + catIds = loader.getCatIds() + cats = loader.loadCats(catIds) + + categories = PointsCategories() + for cat in cats: + label_id, _ = self._categories[AnnotationType.label].find(cat['name']) + categories.add(label_id=label_id, + labels=cat['keypoints'], adjacent=cat['skeleton']) + + return categories + + def categories(self): + return self._categories + + def __iter__(self): + for subset in self._subsets.values(): + for item in subset: + yield item + + def __len__(self): + length = 0 + for subset in self._subsets.values(): + length += len(subset) + return length + + def subsets(self): + return list(self._subsets) + + def get_subset(self, name): + return self._subsets[name] + + def _get(self, img_id, subset): + file_name = None + image_info = None + image = None + annotations = [] + for ann_type, loader in self._subsets[subset].loaders.items(): + if image is None: + image_info = loader.loadImgs(img_id)[0] + file_name = image_info['file_name'] + if file_name != '': + image_dir = osp.join(self._path, CocoPath.IMAGES_DIR) + search_paths = [ + osp.join(image_dir, file_name), + osp.join(image_dir, subset, file_name), + ] + for image_path in search_paths: + if osp.exists(image_path): + image = lazy_image(image_path) + break + + annIds = loader.getAnnIds(imgIds=img_id) + anns = loader.loadAnns(annIds) + + for ann in anns: + self._parse_annotation(ann, ann_type, annotations, image_info) + return DatasetItem(id=img_id, subset=subset, + image=image, annotations=annotations) + + def _parse_label(self, ann): + cat_id = ann.get('category_id') + if cat_id in [0, None]: + return None + return self._label_map[cat_id] + + def _parse_annotation(self, ann, ann_type, parsed_annotations, + image_info=None): + ann_id = ann.get('id') + attributes = {} + if 'score' in ann: + attributes['score'] = ann['score'] + + if ann_type is CocoTask.instances: + x, y, w, h = ann['bbox'] + label_id = self._parse_label(ann) + group = None + + is_crowd = bool(ann['iscrowd']) + attributes['is_crowd'] = is_crowd + + segmentation = ann.get('segmentation') + if segmentation is not None: + group = ann_id + rle = None + + if isinstance(segmentation, list): + # polygon - a single object can consist of multiple parts + for polygon_points in segmentation: + parsed_annotations.append(PolygonObject( + points=polygon_points, label=label_id, + id=ann_id, group=group, attributes=attributes + )) + + if self._merge_instance_polygons: + # merge all parts into a single mask RLE + img_h = image_info['height'] + img_w = image_info['width'] + rles = mask_utils.frPyObjects(segmentation, img_h, img_w) + rle = mask_utils.merge(rles) + elif isinstance(segmentation['counts'], list): + # uncompressed RLE + img_h, img_w = segmentation['size'] + rle = mask_utils.frPyObjects([segmentation], img_h, img_w)[0] + else: + # compressed RLE + rle = segmentation + + if rle is not None: + parsed_annotations.append(RleMask(rle=rle, label=label_id, + id=ann_id, group=group, attributes=attributes + )) + + parsed_annotations.append( + BboxObject(x, y, w, h, label=label_id, + id=ann_id, attributes=attributes, group=group) + ) + elif ann_type is CocoTask.labels: + label_id = self._parse_label(ann) + parsed_annotations.append( + LabelObject(label=label_id, + id=ann_id, attributes=attributes) + ) + elif ann_type is CocoTask.person_keypoints: + keypoints = ann['keypoints'] + points = [p for i, p in enumerate(keypoints) if i % 3 != 2] + visibility = keypoints[2::3] + bbox = ann.get('bbox') + label_id = self._parse_label(ann) + group = None + if bbox is not None: + group = ann_id + parsed_annotations.append( + PointsObject(points, visibility, label=label_id, + id=ann_id, attributes=attributes, group=group) + ) + if bbox is not None: + parsed_annotations.append( + BboxObject(*bbox, label=label_id, group=group) + ) + elif ann_type is CocoTask.captions: + caption = ann['caption'] + parsed_annotations.append( + CaptionObject(caption, + id=ann_id, attributes=attributes) + ) + else: + raise NotImplementedError() + + return parsed_annotations + +class CocoImageInfoExtractor(CocoExtractor): + def __init__(self, path, **kwargs): + super().__init__(path, task=CocoTask.image_info, **kwargs) + +class CocoCaptionsExtractor(CocoExtractor): + def __init__(self, path, **kwargs): + super().__init__(path, task=CocoTask.captions, **kwargs) + +class CocoInstancesExtractor(CocoExtractor): + def __init__(self, path, **kwargs): + super().__init__(path, task=CocoTask.instances, **kwargs) + +class CocoPersonKeypointsExtractor(CocoExtractor): + def __init__(self, path, **kwargs): + super().__init__(path, task=CocoTask.person_keypoints, + **kwargs) + +class CocoLabelsExtractor(CocoExtractor): + def __init__(self, path, **kwargs): + super().__init__(path, task=CocoTask.labels, **kwargs) \ No newline at end of file diff --git a/datumaro/datumaro/components/extractors/tfrecord.py b/datumaro/datumaro/components/extractors/tfrecord.py new file mode 100644 index 000000000000..46b78b63ba12 --- /dev/null +++ b/datumaro/datumaro/components/extractors/tfrecord.py @@ -0,0 +1,206 @@ + +# Copyright (C) 2019 Intel Corporation +# +# SPDX-License-Identifier: MIT + +from collections import OrderedDict +import numpy as np +import os.path as osp +import re + +from datumaro.components.extractor import AnnotationType, DEFAULT_SUBSET_NAME, \ + LabelCategories, BboxObject, DatasetItem, Extractor +from datumaro.components.formats.tfrecord import DetectionApiPath +from datumaro.util.image import lazy_image, decode_image +from datumaro.util.tf_util import import_tf as _import_tf + + +def clamp(value, _min, _max): + return max(min(_max, value), _min) + +class DetectionApiExtractor(Extractor): + class Subset(Extractor): + def __init__(self, name, parent): + super().__init__() + self._name = name + self._parent = parent + self.items = OrderedDict() + + def __iter__(self): + for item in self.items.values(): + yield item + + def __len__(self): + return len(self.items) + + def categories(self): + return self._parent.categories() + + def __init__(self, path, images_dir=None): + super().__init__() + + root_dir = osp.dirname(osp.abspath(path)) + if osp.basename(root_dir) == DetectionApiPath.ANNOTATIONS_DIR: + root_dir = osp.dirname(root_dir) + images_dir = osp.join(root_dir, DetectionApiPath.IMAGES_DIR) + if not osp.isdir(images_dir): + images_dir = None + self._images_dir = images_dir + + self._subsets = {} + + subset_name = osp.splitext(osp.basename(path))[0] + if subset_name == DEFAULT_SUBSET_NAME: + subset_name = None + subset = DetectionApiExtractor.Subset(subset_name, self) + items, labels = self._parse_tfrecord_file(path, subset_name, images_dir) + subset.items = items + self._subsets[subset_name] = subset + + label_categories = LabelCategories() + labels = sorted(labels.items(), key=lambda item: item[1]) + for label, _ in labels: + label_categories.add(label) + self._categories = { + AnnotationType.label: label_categories + } + + @classmethod + def _parse_labelmap(cls, text): + id_pattern = r'(?:id\s*:\s*(?P\d+))' + name_pattern = r'(?:name\s*:\s*[\'\"](?P.*?)[\'\"])' + entry_pattern = r'(\{(?:[\s\n]*(?:%(id)s|%(name)s)[\s\n]*){2}\})+' % \ + {'id': id_pattern, 'name': name_pattern} + matches = re.finditer(entry_pattern, text) + + labelmap = {} + for match in matches: + label_id = match.group('id') + label_name = match.group('name') + if label_id is not None and label_name is not None: + labelmap[label_name] = int(label_id) + + return labelmap + + @classmethod + def _parse_tfrecord_file(cls, filepath, subset_name, images_dir): + tf = _import_tf() + + dataset = tf.data.TFRecordDataset(filepath) + features = { + 'image/filename': tf.io.FixedLenFeature([], tf.string), + 'image/source_id': tf.io.FixedLenFeature([], tf.string), + 'image/height': tf.io.FixedLenFeature([], tf.int64), + 'image/width': tf.io.FixedLenFeature([], tf.int64), + 'image/encoded': tf.io.FixedLenFeature([], tf.string), + 'image/format': tf.io.FixedLenFeature([], tf.string), + # Object boxes and classes. + 'image/object/bbox/xmin': tf.io.VarLenFeature(tf.float32), + 'image/object/bbox/xmax': tf.io.VarLenFeature(tf.float32), + 'image/object/bbox/ymin': tf.io.VarLenFeature(tf.float32), + 'image/object/bbox/ymax': tf.io.VarLenFeature(tf.float32), + 'image/object/class/label': tf.io.VarLenFeature(tf.int64), + 'image/object/class/text': tf.io.VarLenFeature(tf.string), + 'image/object/mask': tf.io.VarLenFeature(tf.string), + } + + dataset_labels = OrderedDict() + labelmap_path = osp.join(osp.dirname(filepath), + DetectionApiPath.LABELMAP_FILE) + if osp.exists(labelmap_path): + with open(labelmap_path, 'r', encoding='utf-8') as f: + labelmap_text = f.read() + dataset_labels.update({ label: id - 1 + for label, id in cls._parse_labelmap(labelmap_text).items() + }) + + dataset_items = OrderedDict() + + for record in dataset: + parsed_record = tf.io.parse_single_example(record, features) + frame_id = parsed_record['image/source_id'].numpy().decode('utf-8') + frame_filename = \ + parsed_record['image/filename'].numpy().decode('utf-8') + frame_height = tf.cast( + parsed_record['image/height'], tf.int64).numpy().item() + frame_width = tf.cast( + parsed_record['image/width'], tf.int64).numpy().item() + frame_image = parsed_record['image/encoded'].numpy() + frame_format = parsed_record['image/format'].numpy().decode('utf-8') + xmins = tf.sparse.to_dense( + parsed_record['image/object/bbox/xmin']).numpy() + ymins = tf.sparse.to_dense( + parsed_record['image/object/bbox/ymin']).numpy() + xmaxs = tf.sparse.to_dense( + parsed_record['image/object/bbox/xmax']).numpy() + ymaxs = tf.sparse.to_dense( + parsed_record['image/object/bbox/ymax']).numpy() + label_ids = tf.sparse.to_dense( + parsed_record['image/object/class/label']).numpy() + labels = tf.sparse.to_dense( + parsed_record['image/object/class/text'], + default_value=b'').numpy() + + for label, label_id in zip(labels, label_ids): + label = label.decode('utf-8') + if not label: + continue + if label_id <= 0: + continue + if label in dataset_labels: + continue + dataset_labels[label] = label_id - 1 + + item_id = frame_id + if not item_id: + item_id = osp.splitext(frame_filename)[0] + + annotations = [] + for index, shape in enumerate( + np.dstack((labels, xmins, ymins, xmaxs, ymaxs))[0]): + label = shape[0].decode('utf-8') + x = clamp(shape[1] * frame_width, 0, frame_width) + y = clamp(shape[2] * frame_height, 0, frame_height) + w = clamp(shape[3] * frame_width, 0, frame_width) - x + h = clamp(shape[4] * frame_height, 0, frame_height) - y + annotations.append(BboxObject(x, y, w, h, + label=dataset_labels.get(label, None), id=index + )) + + image = None + if image is None and frame_image and frame_format: + image = lazy_image(frame_image, loader=decode_image) + if image is None and frame_filename and images_dir: + image_path = osp.join(images_dir, frame_filename) + if osp.exists(image_path): + image = lazy_image(image_path) + + dataset_items[item_id] = DatasetItem(id=item_id, subset=subset_name, + image=image, annotations=annotations) + + return dataset_items, dataset_labels + + def categories(self): + return self._categories + + def __iter__(self): + for subset in self._subsets.values(): + for item in subset: + yield item + + def __len__(self): + length = 0 + for subset in self._subsets.values(): + length += len(subset) + return length + + def subsets(self): + return list(self._subsets) + + def get_subset(self, name): + return self._subsets[name] + + def get(self, item_id, subset=None, path=None): + if path is not None: + return None + return self.get_subset(subset).items.get(item_id, None) \ No newline at end of file diff --git a/datumaro/datumaro/components/extractors/voc.py b/datumaro/datumaro/components/extractors/voc.py new file mode 100644 index 000000000000..fdbe7b37d178 --- /dev/null +++ b/datumaro/datumaro/components/extractors/voc.py @@ -0,0 +1,710 @@ + +# Copyright (C) 2019 Intel Corporation +# +# SPDX-License-Identifier: MIT + +from collections import defaultdict +from itertools import chain +import os +import os.path as osp +from xml.etree import ElementTree as ET + +from datumaro.components.extractor import (Extractor, DatasetItem, + AnnotationType, LabelObject, MaskObject, BboxObject, + LabelCategories, MaskCategories +) +from datumaro.components.formats.voc import (VocLabel, VocAction, + VocBodyPart, VocTask, VocPath, VocColormap, VocInstColormap, + VocIgnoredLabel +) +from datumaro.util import dir_items +from datumaro.util.image import lazy_image +from datumaro.util.mask_tools import lazy_mask, invert_colormap + + +_inverse_inst_colormap = invert_colormap(VocInstColormap) + +# pylint: disable=pointless-statement +def _make_voc_categories(): + categories = {} + + label_categories = LabelCategories() + for label in chain(VocLabel, VocAction, VocBodyPart): + label_categories.add(label.name) + categories[AnnotationType.label] = label_categories + + def label_id(class_index): + if class_index in [0, VocIgnoredLabel]: + return class_index + + class_label = VocLabel(class_index).name + label_id, _ = label_categories.find(class_label) + return label_id + 1 + colormap = { label_id(idx): tuple(color) \ + for idx, color in VocColormap.items() } + mask_categories = MaskCategories(colormap) + mask_categories.inverse_colormap # force init + categories[AnnotationType.mask] = mask_categories + + return categories +# pylint: enable=pointless-statement + +class VocExtractor(Extractor): + class Subset(Extractor): + def __init__(self, name, parent): + super().__init__() + self._parent = parent + self._name = name + self.items = [] + + def __iter__(self): + for item in self.items: + yield self._parent._get(item, self._name) + + def __len__(self): + return len(self.items) + + def categories(self): + return self._parent.categories() + + def _load_subsets(self, subsets_dir): + dir_files = dir_items(subsets_dir, '.txt', truncate_ext=True) + subset_names = [s for s in dir_files if '_' not in s] + + subsets = {} + for subset_name in subset_names: + subset = __class__.Subset(subset_name, self) + + with open(osp.join(subsets_dir, subset_name + '.txt'), 'r') as f: + subset.items = [line.split()[0] for line in f] + + subsets[subset_name] = subset + return subsets + + def _load_cls_annotations(self, subsets_dir, subset_names): + dir_files = dir_items(subsets_dir, '.txt', truncate_ext=True) + + label_annotations = defaultdict(list) + label_anno_files = [s for s in dir_files \ + if '_' in s and s[s.rfind('_') + 1:] in subset_names] + for ann_file in label_anno_files: + with open(osp.join(subsets_dir, ann_file + '.txt'), 'r') as f: + label = ann_file[:ann_file.rfind('_')] + label_id = VocLabel[label].value + for line in f: + item, present = line.split() + if present == '1': + label_annotations[item].append(label_id) + + self._annotations[VocTask.classification] = dict(label_annotations) + + def _load_det_annotations(self): + det_anno_dir = osp.join(self._path, VocPath.ANNOTATIONS_DIR) + det_anno_items = dir_items(det_anno_dir, '.xml', truncate_ext=True) + det_annotations = dict() + for ann_item in det_anno_items: + with open(osp.join(det_anno_dir, ann_item + '.xml'), 'r') as f: + ann_file_data = f.read() + ann_file_root = ET.fromstring(ann_file_data) + item = ann_file_root.find('filename').text + item = osp.splitext(item)[0] + det_annotations[item] = ann_file_data + + self._annotations[VocTask.detection] = det_annotations + + def _load_categories(self): + self._categories = _make_voc_categories() + + def __init__(self, path, task): + super().__init__() + + self._path = path + self._subsets = {} + self._categories = {} + self._annotations = {} + self._task = task + + self._load_categories() + + def __len__(self): + length = 0 + for subset in self._subsets.values(): + length += len(subset) + return length + + def subsets(self): + return list(self._subsets) + + def get_subset(self, name): + return self._subsets[name] + + def categories(self): + return self._categories + + def __iter__(self): + for subset in self._subsets.values(): + for item in subset: + yield item + + def _get(self, item, subset_name): + image = None + image_path = osp.join(self._path, VocPath.IMAGES_DIR, + item + VocPath.IMAGE_EXT) + if osp.isfile(image_path): + image = lazy_image(image_path) + + annotations = self._get_annotations(item) + + return DatasetItem(annotations=annotations, + id=item, subset=subset_name, image=image) + + def _get_label_id(self, label): + label_id, _ = self._categories[AnnotationType.label].find(label) + assert label_id is not None + return label_id + + def _get_annotations(self, item): + item_annotations = [] + + if self._task is VocTask.segmentation: + segm_path = osp.join(self._path, VocPath.SEGMENTATION_DIR, + item + VocPath.SEGM_EXT) + if osp.isfile(segm_path): + inverse_cls_colormap = \ + self._categories[AnnotationType.mask].inverse_colormap + item_annotations.append(MaskObject( + image=lazy_mask(segm_path, inverse_cls_colormap), + attributes={ 'class': True } + )) + + inst_path = osp.join(self._path, VocPath.INSTANCES_DIR, + item + VocPath.SEGM_EXT) + if osp.isfile(inst_path): + item_annotations.append(MaskObject( + image=lazy_mask(inst_path, _inverse_inst_colormap), + attributes={ 'instances': True } + )) + + cls_annotations = self._annotations.get(VocTask.classification) + if cls_annotations is not None and \ + self._task is VocTask.classification: + item_labels = cls_annotations.get(item) + if item_labels is not None: + for label in item_labels: + label_id = self._get_label_id(VocLabel(label).name) + item_annotations.append(LabelObject(label_id)) + + det_annotations = self._annotations.get(VocTask.detection) + if det_annotations is not None: + det_annotations = det_annotations.get(item) + if det_annotations is not None: + root_elem = ET.fromstring(det_annotations) + + for obj_id, object_elem in enumerate(root_elem.findall('object')): + attributes = {} + group = None + + obj_label_id = None + label_elem = object_elem.find('name') + if label_elem is not None: + obj_label_id = self._get_label_id(label_elem.text) + + obj_bbox = self._parse_bbox(object_elem) + + if obj_label_id is None or obj_bbox is None: + continue + + difficult_elem = object_elem.find('difficult') + if difficult_elem is not None: + attributes['difficult'] = (difficult_elem.text == '1') + + truncated_elem = object_elem.find('truncated') + if truncated_elem is not None: + attributes['truncated'] = (truncated_elem.text == '1') + + occluded_elem = object_elem.find('occluded') + if occluded_elem is not None: + attributes['occluded'] = (occluded_elem.text == '1') + + pose_elem = object_elem.find('pose') + if pose_elem is not None: + attributes['pose'] = pose_elem.text + + point_elem = object_elem.find('point') + if point_elem is not None: + point_x = point_elem.find('x') + point_y = point_elem.find('y') + point = [float(point_x.text), float(point_y.text)] + attributes['point'] = point + + actions_elem = object_elem.find('actions') + if actions_elem is not None and \ + self._task is VocTask.action_classification: + for action in VocAction: + action_elem = actions_elem.find(action.name) + if action_elem is None or action_elem.text != '1': + continue + + act_label_id = self._get_label_id(action.name) + assert group in [None, obj_id] + group = obj_id + item_annotations.append(LabelObject(act_label_id, + group=obj_id)) + + if self._task is VocTask.person_layout: + for part_elem in object_elem.findall('part'): + part = part_elem.find('name').text + part_label_id = self._get_label_id(part) + bbox = self._parse_bbox(part_elem) + group = obj_id + item_annotations.append(BboxObject( + *bbox, label=part_label_id, + group=obj_id)) + + if self._task in [VocTask.action_classification, VocTask.person_layout]: + if group is None: + continue + + item_annotations.append(BboxObject(*obj_bbox, label=obj_label_id, + attributes=attributes, id=obj_id, group=group)) + + return item_annotations + + @staticmethod + def _parse_bbox(object_elem): + try: + bbox_elem = object_elem.find('bndbox') + xmin = int(bbox_elem.find('xmin').text) + xmax = int(bbox_elem.find('xmax').text) + ymin = int(bbox_elem.find('ymin').text) + ymax = int(bbox_elem.find('ymax').text) + return [xmin, ymin, xmax - xmin, ymax - ymin] + except Exception: + return None + +class VocClassificationExtractor(VocExtractor): + _ANNO_DIR = 'Main' + + def __init__(self, path): + super().__init__(path, task=VocTask.classification) + + subsets_dir = osp.join(path, VocPath.SUBSETS_DIR, self._ANNO_DIR) + subsets = self._load_subsets(subsets_dir) + self._subsets = subsets + + self._load_cls_annotations(subsets_dir, subsets) + +class VocDetectionExtractor(VocExtractor): + _ANNO_DIR = 'Main' + + def __init__(self, path): + super().__init__(path, task=VocTask.detection) + + subsets_dir = osp.join(path, VocPath.SUBSETS_DIR, self._ANNO_DIR) + subsets = self._load_subsets(subsets_dir) + self._subsets = subsets + + self._load_det_annotations() + +class VocSegmentationExtractor(VocExtractor): + _ANNO_DIR = 'Segmentation' + + def __init__(self, path): + super().__init__(path, task=VocTask.segmentation) + + subsets_dir = osp.join(path, VocPath.SUBSETS_DIR, self._ANNO_DIR) + subsets = self._load_subsets(subsets_dir) + self._subsets = subsets + +class VocLayoutExtractor(VocExtractor): + _ANNO_DIR = 'Layout' + + def __init__(self, path): + super().__init__(path, task=VocTask.person_layout) + + subsets_dir = osp.join(path, VocPath.SUBSETS_DIR, self._ANNO_DIR) + subsets = self._load_subsets(subsets_dir) + self._subsets = subsets + + self._load_det_annotations() + +class VocActionExtractor(VocExtractor): + _ANNO_DIR = 'Action' + + def __init__(self, path): + super().__init__(path, task=VocTask.action_classification) + + subsets_dir = osp.join(path, VocPath.SUBSETS_DIR, self._ANNO_DIR) + subsets = self._load_subsets(subsets_dir) + self._subsets = subsets + + self._load_det_annotations() + + +class VocResultsExtractor(Extractor): + class Subset(Extractor): + def __init__(self, name, parent): + super().__init__() + self._parent = parent + self._name = name + self.items = [] + + def __iter__(self): + for item in self.items: + yield self._parent._get(item, self._name) + + def __len__(self): + return len(self.items) + + def categories(self): + return self._parent.categories() + + _SUPPORTED_TASKS = { + VocTask.classification: { + 'dir': 'Main', + 'mark': 'cls', + 'ext': '.txt', + 'path' : ['%(comp)s_cls_%(subset)s_%(label)s.txt'], + 'comp': ['comp1', 'comp2'], + }, + VocTask.detection: { + 'dir': 'Main', + 'mark': 'det', + 'ext': '.txt', + 'path': ['%(comp)s_det_%(subset)s_%(label)s.txt'], + 'comp': ['comp3', 'comp4'], + }, + VocTask.segmentation: { + 'dir': 'Segmentation', + 'mark': ['cls', 'inst'], + 'ext': '.png', + 'path': ['%(comp)s_%(subset)s_cls', '%(item)s.png'], + 'comp': ['comp5', 'comp6'], + }, + VocTask.person_layout: { + 'dir': 'Layout', + 'mark': 'layout', + 'ext': '.xml', + 'path': ['%(comp)s_layout_%(subset)s.xml'], + 'comp': ['comp7', 'comp8'], + }, + VocTask.action_classification: { + 'dir': 'Action', + 'mark': 'action', + 'ext': '.txt', + 'path': ['%(comp)s_action_%(subset)s_%(label)s.txt'], + 'comp': ['comp9', 'comp10'], + }, + } + + def _parse_txt_ann(self, path, subsets, annotations, task): + task_desc = self._SUPPORTED_TASKS[task] + task_dir = osp.join(path, task_desc['dir']) + ann_ext = task_desc['ext'] + if not osp.isdir(task_dir): + return + + ann_files = dir_items(task_dir, ann_ext, truncate_ext=True) + + for ann_file in ann_files: + ann_parts = filter(None, ann_file.strip().split('_')) + if len(ann_parts) != 4: + continue + _, mark, subset_name, label = ann_parts + if mark != task_desc['mark']: + continue + + label_id = VocLabel[label].value + anns = defaultdict(list) + with open(osp.join(task_dir, ann_file + ann_ext), 'r') as f: + for line in f: + line_parts = line.split() + item = line_parts[0] + anns[item].append((label_id, *line_parts[1:])) + + subset = VocResultsExtractor.Subset(subset_name, self) + subset.items = list(anns) + + subsets[subset_name] = subset + annotations[subset_name] = dict(anns) + + def _parse_classification(self, path, subsets, annotations): + self._parse_txt_ann(path, subsets, annotations, + VocTask.classification) + + def _parse_detection(self, path, subsets, annotations): + self._parse_txt_ann(path, subsets, annotations, + VocTask.detection) + + def _parse_action(self, path, subsets, annotations): + self._parse_txt_ann(path, subsets, annotations, + VocTask.action_classification) + + def _load_categories(self): + self._categories = _make_voc_categories() + + def _get_label_id(self, label): + label_id = self._categories[AnnotationType.label].find(label) + assert label_id is not None + return label_id + + def __init__(self, path): + super().__init__() + + self._path = path + self._subsets = {} + self._annotations = {} + + self._load_categories() + + def __len__(self): + length = 0 + for subset in self._subsets.values(): + length += len(subset) + return length + + def subsets(self): + return list(self._subsets) + + def get_subset(self, name): + return self._subsets[name] + + def categories(self): + return self._categories + + def __iter__(self): + for subset in self._subsets.values(): + for item in subset: + yield item + + def _get(self, item, subset_name): + image = None + image_path = osp.join(self._path, VocPath.IMAGES_DIR, + item + VocPath.IMAGE_EXT) + if osp.isfile(image_path): + image = lazy_image(image_path) + + annotations = self._get_annotations(item, subset_name) + + return DatasetItem(annotations=annotations, + id=item, subset=subset_name, image=image) + + def _get_annotations(self, item, subset_name): + raise NotImplementedError() + +class VocComp_1_2_Extractor(VocResultsExtractor): + def __init__(self, path): + super().__init__(path) + + subsets = {} + annotations = defaultdict(dict) + + self._parse_classification(path, subsets, annotations) + + self._subsets = subsets + self._annotations = dict(annotations) + + def _get_annotations(self, item, subset_name): + annotations = [] + + cls_ann = self._annotations[subset_name].get(item) + if cls_ann is not None: + for desc in cls_ann: + label_id, conf = desc + label_id = self._get_label_id(VocLabel(int(label_id)).name) + annotations.append(LabelObject( + label_id, + attributes={ 'score': float(conf) } + )) + + return annotations + +class VocComp_3_4_Extractor(VocResultsExtractor): + def __init__(self, path): + super().__init__(path) + + subsets = {} + annotations = defaultdict(dict) + + self._parse_detection(path, subsets, annotations) + + self._subsets = subsets + self._annotations = dict(annotations) + + def _get_annotations(self, item, subset_name): + annotations = [] + + det_ann = self._annotations[subset_name].get(item) + if det_ann is not None: + for desc in det_ann: + label_id, conf, left, top, right, bottom = desc + label_id = self._get_label_id(VocLabel(int(label_id)).name) + annotations.append(BboxObject( + x=float(left), y=float(top), + w=float(right) - float(left), h=float(bottom) - float(top), + label=label_id, + attributes={ 'score': float(conf) } + )) + + return annotations + +class VocComp_5_6_Extractor(VocResultsExtractor): + def __init__(self, path): + super().__init__(path) + + subsets = {} + annotations = defaultdict(dict) + + task_dir = osp.join(path, 'Segmentation') + if not osp.isdir(task_dir): + return + + ann_files = os.listdir(task_dir) + + for ann_dir in ann_files: + ann_parts = filter(None, ann_dir.strip().split('_')) + if len(ann_parts) != 4: + continue + _, subset_name, mark = ann_parts + if mark not in ['cls', 'inst']: + continue + + item_dir = osp.join(task_dir, ann_dir) + items = dir_items(item_dir, '.png', truncate_ext=True) + items = { name: osp.join(item_dir, item + '.png') \ + for name, item in items } + + subset = VocResultsExtractor.Subset(subset_name, self) + subset.items = list(items) + + subsets[subset_name] = subset + annotations[subset_name][mark] = items + + self._subsets = subsets + self._annotations = dict(annotations) + + def _get_annotations(self, item, subset_name): + annotations = [] + + segm_ann = self._annotations[subset_name] + cls_image_path = segm_ann.get(item) + if cls_image_path and osp.isfile(cls_image_path): + inverse_cls_colormap = \ + self._categories[AnnotationType.mask].inverse_colormap + annotations.append(MaskObject( + image=lazy_mask(cls_image_path, inverse_cls_colormap), + attributes={ 'class': True } + )) + + inst_ann = self._annotations[subset_name] + inst_image_path = inst_ann.get(item) + if inst_image_path and osp.isfile(inst_image_path): + annotations.append(MaskObject( + image=lazy_mask(inst_image_path, _inverse_inst_colormap), + attributes={ 'instances': True } + )) + + return annotations + +class VocComp_7_8_Extractor(VocResultsExtractor): + def __init__(self, path): + super().__init__(path) + + subsets = {} + annotations = defaultdict(dict) + + task = VocTask.person_layout + task_desc = self._SUPPORTED_TASKS[task] + task_dir = osp.join(path, task_desc['dir']) + if not osp.isdir(task_dir): + return + + ann_ext = task_desc['ext'] + ann_files = dir_items(task_dir, ann_ext, truncate_ext=True) + + for ann_file in ann_files: + ann_parts = filter(None, ann_file.strip().split('_')) + if len(ann_parts) != 4: + continue + _, mark, subset_name, _ = ann_parts + if mark != task_desc['mark']: + continue + + layouts = {} + root = ET.parse(osp.join(task_dir, ann_file + ann_ext)) + root_elem = root.getroot() + for layout_elem in root_elem.findall('layout'): + item = layout_elem.find('image').text + obj_id = int(layout_elem.find('object').text) + conf = float(layout_elem.find('confidence').text) + parts = [] + for part_elem in layout_elem.findall('part'): + label_id = VocBodyPart[part_elem.find('class').text].value + bbox_elem = part_elem.find('bndbox') + xmin = float(bbox_elem.find('xmin').text) + xmax = float(bbox_elem.find('xmax').text) + ymin = float(bbox_elem.find('ymin').text) + ymax = float(bbox_elem.find('ymax').text) + bbox = [xmin, ymin, xmax - xmin, ymax - ymin] + parts.append((label_id, bbox)) + layouts[item] = [obj_id, conf, parts] + + subset = VocResultsExtractor.Subset(subset_name, self) + subset.items = list(layouts) + + subsets[subset_name] = subset + annotations[subset_name] = layouts + + self._subsets = subsets + self._annotations = dict(annotations) + + def _get_annotations(self, item, subset_name): + annotations = [] + + layout_ann = self._annotations[subset_name].get(item) + if layout_ann is not None: + for desc in layout_ann: + obj_id, conf, parts = desc + attributes = { + 'score': conf, + 'object_id': obj_id, + } + + for part in parts: + part_id, bbox = part + label_id = self._get_label_id(VocBodyPart(part_id).name) + annotations.append(BboxObject( + *bbox, label=label_id, + attributes=attributes)) + + return annotations + +class VocComp_9_10_Extractor(VocResultsExtractor): + def __init__(self, path): + super().__init__(path) + + subsets = {} + annotations = defaultdict(dict) + + self._parse_action(path, subsets, annotations) + + self._subsets = subsets + self._annotations = dict(annotations) + + def _get_annotations(self, item, subset_name): + annotations = [] + + action_ann = self._annotations[subset_name].get(item) + if action_ann is not None: + for desc in action_ann: + action_id, obj_id, conf = desc + label_id = self._get_label_id(VocAction(int(action_id)).name) + annotations.append(LabelObject( + label_id, + attributes={ + 'score': conf, + 'object_id': int(obj_id), + } + )) + + return annotations \ No newline at end of file diff --git a/datumaro/datumaro/components/extractors/yolo.py b/datumaro/datumaro/components/extractors/yolo.py new file mode 100644 index 000000000000..81ead7b2baed --- /dev/null +++ b/datumaro/datumaro/components/extractors/yolo.py @@ -0,0 +1,162 @@ + +# Copyright (C) 2019 Intel Corporation +# +# SPDX-License-Identifier: MIT + +from collections import OrderedDict +import os.path as osp +import re + +from datumaro.components.extractor import (Extractor, DatasetItem, + AnnotationType, BboxObject, LabelCategories +) +from datumaro.components.formats.yolo import YoloPath +from datumaro.util.image import lazy_image + + +class YoloExtractor(Extractor): + class Subset(Extractor): + def __init__(self, name, parent): + super().__init__() + self._name = name + self._parent = parent + self.items = OrderedDict() + + def __iter__(self): + for item_id in self.items: + yield self._parent._get(item_id, self._name) + + def __len__(self): + return len(self.items) + + def categories(self): + return self._parent.categories() + + def __init__(self, config_path): + super().__init__() + + if not osp.isfile(config_path): + raise Exception("Can't read dataset descriptor file '%s'" % \ + config_path) + + rootpath = osp.dirname(config_path) + self._path = rootpath + + with open(config_path, 'r') as f: + config_lines = f.readlines() + + subsets = OrderedDict() + names_path = None + + for line in config_lines: + match = re.match(r'(\w+)\s*=\s*(.+)$', line) + if not match: + continue + + key = match.group(1) + value = match.group(2) + if key == 'names': + names_path = value + elif key in YoloPath.SUBSET_NAMES: + subsets[key] = value + else: + continue + + if not names_path: + raise Exception("Failed to parse labels path from '%s'" % \ + config_path) + + for subset_name, list_path in subsets.items(): + list_path = self._make_local_path(list_path) + if not osp.isfile(list_path): + raise Exception("Not found '%s' subset list file" % subset_name) + + subset = YoloExtractor.Subset(subset_name, self) + with open(list_path, 'r') as f: + subset.items = OrderedDict( + (osp.splitext(osp.basename(p))[0], p.strip()) for p in f) + + for image_path in subset.items.values(): + image_path = self._make_local_path(image_path) + if not osp.isfile(image_path): + raise Exception("Can't find image '%s'" % image_path) + + subsets[subset_name] = subset + + self._subsets = subsets + + self._categories = { + AnnotationType.label: + self._load_categories(self._make_local_path(names_path)) + } + + def _make_local_path(self, path): + default_base = osp.join('data', '') + if path.startswith(default_base): # default path + path = path[len(default_base) : ] + return osp.join(self._path, path) # relative or absolute path + + def _get(self, item_id, subset_name): + subset = self._subsets[subset_name] + item = subset.items[item_id] + + if isinstance(item, str): + image_path = self._make_local_path(item) + image = lazy_image(image_path) + h, w, _ = image().shape + anno_path = osp.splitext(image_path)[0] + '.txt' + annotations = self._parse_annotations(anno_path, w, h) + + item = DatasetItem(id=item_id, subset=subset_name, + image=image, annotations=annotations) + subset.items[item_id] = item + + return item + + @staticmethod + def _parse_annotations(anno_path, image_width, image_height): + with open(anno_path, 'r') as f: + annotations = [] + for line in f: + label_id, xc, yc, w, h = line.strip().split() + label_id = int(label_id) + w = float(w) + h = float(h) + x = float(xc) - w * 0.5 + y = float(yc) - h * 0.5 + annotations.append(BboxObject( + x * image_width, y * image_height, + w * image_width, h * image_height, + label=label_id + )) + return annotations + + @staticmethod + def _load_categories(names_path): + label_categories = LabelCategories() + + with open(names_path, 'r') as f: + for label in f: + label_categories.add(label) + + return label_categories + + def categories(self): + return self._categories + + def __iter__(self): + for subset in self._subsets.values(): + for item in subset: + yield item + + def __len__(self): + length = 0 + for subset in self._subsets.values(): + length += len(subset) + return length + + def subsets(self): + return list(self._subsets) + + def get_subset(self, name): + return self._subsets[name] \ No newline at end of file diff --git a/datumaro/datumaro/components/formats/__init__.py b/datumaro/datumaro/components/formats/__init__.py new file mode 100644 index 000000000000..a9773073830c --- /dev/null +++ b/datumaro/datumaro/components/formats/__init__.py @@ -0,0 +1,5 @@ + +# Copyright (C) 2019 Intel Corporation +# +# SPDX-License-Identifier: MIT + diff --git a/datumaro/datumaro/components/formats/datumaro.py b/datumaro/datumaro/components/formats/datumaro.py new file mode 100644 index 000000000000..ef587b9bbbe9 --- /dev/null +++ b/datumaro/datumaro/components/formats/datumaro.py @@ -0,0 +1,12 @@ + +# Copyright (C) 2019 Intel Corporation +# +# SPDX-License-Identifier: MIT + +class DatumaroPath: + IMAGES_DIR = 'images' + ANNOTATIONS_DIR = 'annotations' + MASKS_DIR = 'masks' + + IMAGE_EXT = '.jpg' + MASK_EXT = '.png' diff --git a/datumaro/datumaro/components/formats/ms_coco.py b/datumaro/datumaro/components/formats/ms_coco.py new file mode 100644 index 000000000000..2a9cddc2c1be --- /dev/null +++ b/datumaro/datumaro/components/formats/ms_coco.py @@ -0,0 +1,23 @@ + +# Copyright (C) 2019 Intel Corporation +# +# SPDX-License-Identifier: MIT + +from enum import Enum + + +CocoTask = Enum('CocoTask', [ + 'instances', + 'person_keypoints', + 'captions', + 'labels', # extension, does not exist in the original COCO format + 'image_info', + 'panoptic', + 'stuff', +]) + +class CocoPath: + IMAGES_DIR = 'images' + ANNOTATIONS_DIR = 'annotations' + + IMAGE_EXT = '.jpg' \ No newline at end of file diff --git a/datumaro/datumaro/components/formats/tfrecord.py b/datumaro/datumaro/components/formats/tfrecord.py new file mode 100644 index 000000000000..9e31212e89cd --- /dev/null +++ b/datumaro/datumaro/components/formats/tfrecord.py @@ -0,0 +1,13 @@ + +# Copyright (C) 2019 Intel Corporation +# +# SPDX-License-Identifier: MIT + +class DetectionApiPath: + IMAGES_DIR = 'images' + ANNOTATIONS_DIR = 'annotations' + + IMAGE_EXT = '.jpg' + IMAGE_FORMAT = 'jpeg' + + LABELMAP_FILE = 'label_map.pbtxt' \ No newline at end of file diff --git a/datumaro/datumaro/components/formats/voc.py b/datumaro/datumaro/components/formats/voc.py new file mode 100644 index 000000000000..5a9652906a4c --- /dev/null +++ b/datumaro/datumaro/components/formats/voc.py @@ -0,0 +1,107 @@ + +# Copyright (C) 2019 Intel Corporation +# +# SPDX-License-Identifier: MIT + +from collections import OrderedDict +from enum import Enum +import numpy as np + + +VocTask = Enum('VocTask', [ + 'classification', + 'detection', + 'segmentation', + 'action_classification', + 'person_layout', +]) + +VocLabel = Enum('VocLabel', [ + ('aeroplane', 1), + ('bicycle', 2), + ('bird', 3), + ('boat', 4), + ('bottle', 5), + ('bus', 6), + ('car', 7), + ('cat', 8), + ('chair', 9), + ('cow', 10), + ('diningtable', 11), + ('dog', 12), + ('horse', 13), + ('motorbike', 14), + ('person', 15), + ('pottedplant', 16), + ('sheep', 17), + ('sofa', 18), + ('train', 19), + ('tvmonitor', 20), +]) + +VocIgnoredLabel = 255 + +VocPose = Enum('VocPose', [ + 'Unspecified', + 'Left', + 'Right', + 'Frontal', + 'Rear', +]) + +VocBodyPart = Enum('VocBodyPart', [ + 'head', + 'hand', + 'foot', +]) + +VocAction = Enum('VocAction', [ + 'other', + 'jumping', + 'phoning', + 'playinginstrument', + 'reading', + 'ridingbike', + 'ridinghorse', + 'running', + 'takingphoto', + 'usingcomputer', + 'walking', +]) + +def generate_colormap(length=256): + def get_bit(number, index): + return (number >> index) & 1 + + colormap = np.zeros((length, 3), dtype=int) + indices = np.arange(length, dtype=int) + + for j in range(7, -1, -1): + for c in range(3): + colormap[:, c] |= get_bit(indices, c) << j + indices >>= 3 + + return OrderedDict( + (id, tuple(color)) for id, color in enumerate(colormap) + ) + +VocColormap = {id: color for id, color in generate_colormap(256).items() + if id in [l.value for l in VocLabel] + [0, VocIgnoredLabel]} +VocInstColormap = generate_colormap(256) + +class VocPath: + IMAGES_DIR = 'JPEGImages' + ANNOTATIONS_DIR = 'Annotations' + SEGMENTATION_DIR = 'SegmentationClass' + INSTANCES_DIR = 'SegmentationObject' + SUBSETS_DIR = 'ImageSets' + IMAGE_EXT = '.jpg' + SEGM_EXT = '.png' + + TASK_DIR = { + VocTask.classification: 'Main', + VocTask.detection: 'Main', + VocTask.segmentation: 'Segmentation', + VocTask.action_classification: 'Action', + VocTask.person_layout: 'Layout', + } \ No newline at end of file diff --git a/datumaro/datumaro/components/formats/yolo.py b/datumaro/datumaro/components/formats/yolo.py new file mode 100644 index 000000000000..8d44a9ba8fbb --- /dev/null +++ b/datumaro/datumaro/components/formats/yolo.py @@ -0,0 +1,9 @@ + +# Copyright (C) 2019 Intel Corporation +# +# SPDX-License-Identifier: MIT + + +class YoloPath: + DEFAULT_SUBSET_NAME = 'train' + SUBSET_NAMES = ['train', 'valid'] \ No newline at end of file diff --git a/datumaro/datumaro/components/importers/__init__.py b/datumaro/datumaro/components/importers/__init__.py new file mode 100644 index 000000000000..5d2923b8141e --- /dev/null +++ b/datumaro/datumaro/components/importers/__init__.py @@ -0,0 +1,31 @@ + +# Copyright (C) 2019 Intel Corporation +# +# SPDX-License-Identifier: MIT + +from datumaro.components.importers.datumaro import DatumaroImporter + +from datumaro.components.importers.ms_coco import ( + CocoImporter, +) + +from datumaro.components.importers.voc import ( + VocImporter, + VocResultsImporter, +) + +from datumaro.components.importers.tfrecord import ( + DetectionApiImporter, +) + + +items = [ + ('datumaro', DatumaroImporter), + + ('ms_coco', CocoImporter), + + ('voc', VocImporter), + ('voc_results', VocResultsImporter), + + ('tf_detection_api', DetectionApiImporter), +] \ No newline at end of file diff --git a/datumaro/datumaro/components/importers/datumaro.py b/datumaro/datumaro/components/importers/datumaro.py new file mode 100644 index 000000000000..40939b90cf18 --- /dev/null +++ b/datumaro/datumaro/components/importers/datumaro.py @@ -0,0 +1,25 @@ + +# Copyright (C) 2019 Intel Corporation +# +# SPDX-License-Identifier: MIT + +import os.path as osp + + +class DatumaroImporter: + EXTRACTOR_NAME = 'datumaro' + + def __call__(self, path): + from datumaro.components.project import Project # cyclic import + project = Project() + + if not osp.exists(path): + raise Exception("Failed to find 'datumaro' dataset at '%s'" % path) + + source_name = osp.splitext(osp.basename(path))[0] + project.add_source(source_name, { + 'url': path, + 'format': self.EXTRACTOR_NAME, + }) + + return project \ No newline at end of file diff --git a/datumaro/datumaro/components/importers/ms_coco.py b/datumaro/datumaro/components/importers/ms_coco.py new file mode 100644 index 000000000000..30d959b0024e --- /dev/null +++ b/datumaro/datumaro/components/importers/ms_coco.py @@ -0,0 +1,70 @@ + +# Copyright (C) 2019 Intel Corporation +# +# SPDX-License-Identifier: MIT + +from collections import defaultdict +import os +import os.path as osp + +from datumaro.components.formats.ms_coco import CocoTask, CocoPath + + +class CocoImporter: + _COCO_EXTRACTORS = { + CocoTask.instances: 'coco_instances', + CocoTask.person_keypoints: 'coco_person_kp', + CocoTask.captions: 'coco_captions', + CocoTask.labels: 'coco_labels', + CocoTask.image_info: 'coco_images', + } + + def __init__(self, task_filter=None): + self._task_filter = task_filter + + def __call__(self, path, **extra_params): + from datumaro.components.project import Project # cyclic import + project = Project() + + subsets = self.find_subsets(path) + + if len(subsets) == 0: + raise Exception("Failed to find 'coco' dataset at '%s'" % path) + + for ann_files in subsets.values(): + for ann_type, ann_file in ann_files.items(): + source_name = osp.splitext(osp.basename(ann_file))[0] + project.add_source(source_name, { + 'url': ann_file, + 'format': self._COCO_EXTRACTORS[ann_type], + 'options': extra_params, + }) + + return project + + @staticmethod + def find_subsets(dataset_dir): + ann_dir = os.path.join(dataset_dir, CocoPath.ANNOTATIONS_DIR) + if not osp.isdir(ann_dir): + raise NotADirectoryError( + 'COCO annotations directory not found at "%s"' % ann_dir) + + subsets = defaultdict(dict) + for ann_file in os.listdir(ann_dir): + subset_path = osp.join(ann_dir, ann_file) + if not subset_path.endswith('.json'): + continue + + name_parts = osp.splitext(ann_file)[0].rsplit('_', maxsplit=1) + ann_type = name_parts[0] + try: + ann_type = CocoTask[ann_type] + except KeyError: + raise Exception( + 'Unknown subset type %s, only known are: %s' % \ + (ann_type, + ', '.join([e.name for e in CocoTask]) + )) + subset_name = name_parts[1] + subsets[subset_name][ann_type] = subset_path + return dict(subsets) \ No newline at end of file diff --git a/datumaro/datumaro/components/importers/tfrecord.py b/datumaro/datumaro/components/importers/tfrecord.py new file mode 100644 index 000000000000..c42c2e174389 --- /dev/null +++ b/datumaro/datumaro/components/importers/tfrecord.py @@ -0,0 +1,35 @@ + +# Copyright (C) 2019 Intel Corporation +# +# SPDX-License-Identifier: MIT + +from glob import glob +import os.path as osp + + +class DetectionApiImporter: + EXTRACTOR_NAME = 'tf_detection_api' + + def __call__(self, path): + from datumaro.components.project import Project # cyclic import + project = Project() + + subset_paths = glob(osp.join(path, '*.tfrecord')) + + for subset_path in subset_paths: + if not osp.isfile(subset_path): + continue + + subset_name = osp.splitext(osp.basename(subset_path))[0] + + project.add_source(subset_name, { + 'url': subset_path, + 'format': self.EXTRACTOR_NAME, + }) + + if len(project.config.sources) == 0: + raise Exception( + "Failed to find 'tf_detection_api' dataset at '%s'" % path) + + return project + diff --git a/datumaro/datumaro/components/importers/voc.py b/datumaro/datumaro/components/importers/voc.py new file mode 100644 index 000000000000..432cf374141e --- /dev/null +++ b/datumaro/datumaro/components/importers/voc.py @@ -0,0 +1,77 @@ + +# Copyright (C) 2019 Intel Corporation +# +# SPDX-License-Identifier: MIT + +import os +import os.path as osp + +from datumaro.components.formats.voc import VocTask, VocPath +from datumaro.util import find + + +class VocImporter: + _TASKS = [ + (VocTask.classification, 'voc_cls', 'Main'), + (VocTask.detection, 'voc_det', 'Main'), + (VocTask.segmentation, 'voc_segm', 'Segmentation'), + (VocTask.person_layout, 'voc_layout', 'Layout'), + (VocTask.action_classification, 'voc_action', 'Action'), + ] + + def __call__(self, path): + from datumaro.components.project import Project # cyclic import + project = Project() + + for task, extractor_type, task_dir in self._TASKS: + task_dir = osp.join(path, VocPath.SUBSETS_DIR, task_dir) + if not osp.isdir(task_dir): + continue + + project.add_source(task.name, { + 'url': path, + 'format': extractor_type, + }) + + if len(project.config.sources) == 0: + raise Exception("Failed to find 'voc' dataset at '%s'" % path) + + return project + + +class VocResultsImporter: + _TASKS = [ + ('comp1', 'voc_comp_1_2', 'Main'), + ('comp2', 'voc_comp_1_2', 'Main'), + ('comp3', 'voc_comp_3_4', 'Main'), + ('comp4', 'voc_comp_3_4', 'Main'), + ('comp5', 'voc_comp_5_6', 'Segmentation'), + ('comp6', 'voc_comp_5_6', 'Segmentation'), + ('comp7', 'voc_comp_7_8', 'Layout'), + ('comp8', 'voc_comp_7_8', 'Layout'), + ('comp9', 'voc_comp_9_10', 'Action'), + ('comp10', 'voc_comp_9_10', 'Action'), + ] + + def __call__(self, path): + from datumaro.components.project import Project # cyclic import + project = Project() + + for task_name, extractor_type, task_dir in self._TASKS: + task_dir = osp.join(path, task_dir) + if not osp.isdir(task_dir): + continue + dir_items = os.listdir(task_dir) + if not find(dir_items, lambda x: x == task_name): + continue + + project.add_source(task_name, { + 'url': task_dir, + 'format': extractor_type, + }) + + if len(project.config.sources) == 0: + raise Exception("Failed to find 'voc_results' dataset at '%s'" % \ + path) + + return project \ No newline at end of file diff --git a/datumaro/datumaro/components/importers/yolo.py b/datumaro/datumaro/components/importers/yolo.py new file mode 100644 index 000000000000..4254b803e14c --- /dev/null +++ b/datumaro/datumaro/components/importers/yolo.py @@ -0,0 +1,32 @@ + +# Copyright (C) 2019 Intel Corporation +# +# SPDX-License-Identifier: MIT + +import os.path as osp +from datumaro.util import dir_items + + +class YoloImporter: + def __call__(self, path, **extra_params): + from datumaro.components.project import Project # cyclic import + project = Project() + + if not osp.exists(path): + raise Exception("Failed to find 'yolo' dataset at '%s'" % path) + + configs = [] + if osp.isfile(path): + configs = path + elif osp.isdir(path): + configs = [osp.join(path, p) for p in dir_items(path, '.data')] + + for config_path in configs: + source_name = osp.splitext(osp.basename(config_path))[0] + project.add_source(source_name, { + 'url': config_path, + 'format': 'yolo', + 'options': extra_params, + }) + + return project \ No newline at end of file diff --git a/datumaro/datumaro/components/launcher.py b/datumaro/datumaro/components/launcher.py new file mode 100644 index 000000000000..0e11e8cf076e --- /dev/null +++ b/datumaro/datumaro/components/launcher.py @@ -0,0 +1,95 @@ + +# Copyright (C) 2019 Intel Corporation +# +# SPDX-License-Identifier: MIT + +import numpy as np + +from datumaro.components.extractor import DatasetItem, Extractor + + +# pylint: disable=no-self-use +class Launcher: + def __init__(self): + pass + + def launch(self, inputs): + raise NotImplementedError() + + def preferred_input_size(self): + return None + + def get_categories(self): + return None +# pylint: enable=no-self-use + +class InferenceWrapper(Extractor): + class ItemWrapper(DatasetItem): + def __init__(self, item, annotations, path=None): + super().__init__(id=item.id) + self._annotations = annotations + self._item = item + self._path = path + + @DatasetItem.id.getter + def id(self): + return self._item.id + + @DatasetItem.subset.getter + def subset(self): + return self._item.subset + + @DatasetItem.path.getter + def path(self): + return self._path + + @DatasetItem.annotations.getter + def annotations(self): + return self._annotations + + @DatasetItem.image.getter + def image(self): + return self._item.image + + def __init__(self, extractor, launcher, batch_size=1): + super().__init__() + self._extractor = extractor + self._launcher = launcher + self._batch_size = batch_size + + def __iter__(self): + stop = False + data_iter = iter(self._extractor) + while not stop: + batch_items = [] + try: + for _ in range(self._batch_size): + item = next(data_iter) + batch_items.append(item) + except StopIteration: + stop = True + if len(batch_items) == 0: + break + + inputs = np.array([item.image for item in batch_items]) + inference = self._launcher.launch(inputs) + + for item, annotations in zip(batch_items, inference): + yield self.ItemWrapper(item, annotations) + + def __len__(self): + return len(self._extractor) + + def subsets(self): + return self._extractor.subsets() + + def get_subset(self, name): + subset = self._extractor.get_subset(name) + return InferenceWrapper(subset, + self._launcher, self._batch_size) + + def categories(self): + launcher_override = self._launcher.get_categories() + if launcher_override is not None: + return launcher_override + return self._extractor.categories() \ No newline at end of file diff --git a/datumaro/datumaro/components/launchers/__init__.py b/datumaro/datumaro/components/launchers/__init__.py new file mode 100644 index 000000000000..8d613a2ac53a --- /dev/null +++ b/datumaro/datumaro/components/launchers/__init__.py @@ -0,0 +1,13 @@ + +# Copyright (C) 2019 Intel Corporation +# +# SPDX-License-Identifier: MIT + +items = [ +] + +try: + from datumaro.components.launchers.openvino import OpenVinoLauncher + items.append(('openvino', OpenVinoLauncher)) +except ImportError: + pass diff --git a/datumaro/datumaro/components/launchers/openvino.py b/datumaro/datumaro/components/launchers/openvino.py new file mode 100644 index 000000000000..613203b9ec24 --- /dev/null +++ b/datumaro/datumaro/components/launchers/openvino.py @@ -0,0 +1,190 @@ + +# Copyright (C) 2019 Intel Corporation +# +# SPDX-License-Identifier: MIT + +# pylint: disable=exec-used + +import os +import os.path as osp +import numpy as np +import subprocess +import platform + +from openvino.inference_engine import IENetwork, IEPlugin + +from datumaro.components.launcher import Launcher + + +class InterpreterScript: + def __init__(self, path): + with open(path, 'r') as f: + script = f.read() + + context = {} + exec(script, context, context) + + process_outputs = context['process_outputs'] + assert callable(process_outputs) + self.__dict__['process_outputs'] = process_outputs + + get_categories = context.get('get_categories') + assert callable(get_categories) or get_categories is None + self.__dict__['get_categories'] = get_categories + + @staticmethod + def get_categories(): + return None + + @staticmethod + def process_outputs(inputs, outputs): + return [] + +class OpenVinoLauncher(Launcher): + _DEFAULT_IE_PLUGINS_PATH = "/opt/intel/openvino_2019.1.144/deployment_tools/inference_engine/lib/intel64" + _IE_PLUGINS_PATH = os.getenv("IE_PLUGINS_PATH", _DEFAULT_IE_PLUGINS_PATH) + + @staticmethod + def _check_instruction_set(instruction): + return instruction == str.strip( + subprocess.check_output( + 'lscpu | grep -o "{}" | head -1'.format(instruction), shell=True + ).decode('utf-8') + ) + + @staticmethod + def make_plugin(device='cpu', plugins_path=_IE_PLUGINS_PATH): + if plugins_path is None or not osp.isdir(plugins_path): + raise Exception('Inference engine plugins directory "%s" not found' % \ + (plugins_path)) + + plugin = IEPlugin(device='CPU', plugin_dirs=[plugins_path]) + if (OpenVinoLauncher._check_instruction_set('avx2')): + plugin.add_cpu_extension(os.path.join(plugins_path, + 'libcpu_extension_avx2.so')) + elif (OpenVinoLauncher._check_instruction_set('sse4')): + plugin.add_cpu_extension(os.path.join(plugins_path, + 'libcpu_extension_sse4.so')) + elif platform.system() == 'Darwin': + plugin.add_cpu_extension(os.path.join(plugins_path, + 'libcpu_extension.dylib')) + else: + raise Exception('Inference engine requires support of avx2 or sse4') + + return plugin + + @staticmethod + def make_network(model, weights): + return IENetwork.from_ir(model=model, weights=weights) + + def __init__(self, description, weights, interpretation_script, + plugins_path=None, model_dir=None, **kwargs): + if model_dir is None: + model_dir = '' + if not osp.isfile(description): + description = osp.join(model_dir, description) + if not osp.isfile(description): + raise Exception('Failed to open model description file "%s"' % \ + (description)) + + if not osp.isfile(weights): + weights = osp.join(model_dir, weights) + if not osp.isfile(weights): + raise Exception('Failed to open model weights file "%s"' % \ + (weights)) + + if not osp.isfile(interpretation_script): + interpretation_script = \ + osp.join(model_dir, interpretation_script) + if not osp.isfile(interpretation_script): + raise Exception('Failed to open model interpretation script file "%s"' % \ + (interpretation_script)) + + self._interpreter_script = InterpreterScript(interpretation_script) + + if plugins_path is None: + plugins_path = OpenVinoLauncher._IE_PLUGINS_PATH + + plugin = OpenVinoLauncher.make_plugin(plugins_path=plugins_path) + network = OpenVinoLauncher.make_network(description, weights) + self._network = network + self._plugin = plugin + self._load_executable_net() + + def _load_executable_net(self, batch_size=1): + network = self._network + plugin = self._plugin + + supported_layers = plugin.get_supported_layers(network) + not_supported_layers = [l for l in network.layers.keys() if l not in supported_layers] + if len(not_supported_layers) != 0: + raise Exception('Following layers are not supported by the plugin' + ' for the specified device {}:\n {}'. format( \ + plugin.device, ", ".join(not_supported_layers))) + + iter_inputs = iter(network.inputs) + self._input_blob_name = next(iter_inputs) + self._output_blob_name = next(iter(network.outputs)) + + # NOTE: handling for the inclusion of `image_info` in OpenVino2019 + self._require_image_info = 'image_info' in network.inputs + if self._input_blob_name == 'image_info': + self._input_blob_name = next(iter_inputs) + + input_type = network.inputs[self._input_blob_name] + self._input_layout = input_type if isinstance(input_type, list) else input_type.shape + + self._input_layout[0] = batch_size + network.reshape({self._input_blob_name: self._input_layout}) + self._batch_size = batch_size + + self._net = plugin.load(network=network, num_requests=1) + + def infer(self, inputs): + import cv2 + + assert len(inputs.shape) == 4, \ + "Expected an input image in (N, H, W, C) format, got %s" % \ + (inputs.shape) + assert inputs.shape[3] == 3, \ + "Expected BGR input" + + n, c, h, w = self._input_layout + if inputs.shape[1:3] != (h, w): + resized_inputs = np.empty((n, h, w, c), dtype=inputs.dtype) + for inp, resized_input in zip(inputs, resized_inputs): + cv2.resize(inp, (w, h), resized_input) + inputs = resized_inputs + inputs = inputs.transpose((0, 3, 1, 2)) # NHWC to NCHW + inputs = {self._input_blob_name: inputs} + if self._require_image_info: + info = np.zeros([1, 3]) + info[0, 0] = h + info[0, 1] = w + info[0, 2] = 1.0 # scale + inputs['image_info'] = info + + results = self._net.infer(inputs) + if len(results) == 1: + return results[self._output_blob_name] + else: + return results + + def launch(self, inputs): + batch_size = len(inputs) + if self._batch_size < batch_size: + self._load_executable_net(batch_size) + + outputs = self.infer(inputs) + results = self.process_outputs(inputs, outputs) + return results + + def get_categories(self): + return self._interpreter_script.get_categories() + + def process_outputs(self, inputs, outputs): + return self._interpreter_script.process_outputs(inputs, outputs) + + def preferred_input_size(self): + _, _, h, w = self._input_layout + return (h, w) diff --git a/datumaro/datumaro/components/project.py b/datumaro/datumaro/components/project.py new file mode 100644 index 000000000000..a648f461e593 --- /dev/null +++ b/datumaro/datumaro/components/project.py @@ -0,0 +1,724 @@ + +# Copyright (C) 2019 Intel Corporation +# +# SPDX-License-Identifier: MIT + +from collections import OrderedDict, defaultdict +import git +import importlib +from functools import reduce +import logging as log +import os +import os.path as osp +import sys + +from datumaro.components.config import Config, DEFAULT_FORMAT +from datumaro.components.config_model import * +from datumaro.components.extractor import * +from datumaro.components.launcher import * +from datumaro.components.dataset_filter import XPathDatasetFilter + + +def import_foreign_module(name, path): + module = None + default_path = sys.path.copy() + try: + sys.path = [ osp.abspath(path), ] + default_path + sys.modules.pop(name, None) # remove from cache + module = importlib.import_module(name) + sys.modules.pop(name) # remove from cache + except ImportError as e: + log.warn("Failed to import module '%s': %s" % (name, e)) + finally: + sys.path = default_path + return module + + +class Registry: + def __init__(self, config=None, item_type=None): + self.item_type = item_type + + self.items = {} + + if config is not None: + self.load(config) + + def load(self, config): + pass + + def register(self, name, value): + if self.item_type: + value = self.item_type(value) + self.items[name] = value + return value + + def unregister(self, name): + return self.items.pop(name, None) + + def get(self, key): + return self.items[key] # returns a class / ctor + + +class ModelRegistry(Registry): + def __init__(self, config=None): + super().__init__(config, item_type=Model) + + def load(self, config): + # TODO: list default dir, insert values + if 'models' in config: + for name, model in config.models.items(): + self.register(name, model) + + +class SourceRegistry(Registry): + def __init__(self, config=None): + super().__init__(config, item_type=Source) + + def load(self, config): + # TODO: list default dir, insert values + if 'sources' in config: + for name, source in config.sources.items(): + self.register(name, source) + + +class ModuleRegistry(Registry): + def __init__(self, config=None, builtin=None, local=None): + super().__init__(config) + + if builtin is not None: + for k, v in builtin: + self.register(k, v) + if local is not None: + for k, v in local: + self.register(k, v) + + +class GitWrapper: + def __init__(self, config=None): + self.repo = None + + if config is not None: + self.init(config.project_dir) + + @staticmethod + def _git_dir(base_path): + return osp.join(base_path, '.git') + + def init(self, path): + spawn = not osp.isdir(GitWrapper._git_dir(path)) + self.repo = git.Repo.init(path=path) + if spawn: + author = git.Actor("Nobody", "nobody@example.com") + self.repo.index.commit('Initial commit', author=author) + return self.repo + + def get_repo(self): + return self.repo + + def is_initialized(self): + return self.repo is not None + + def create_submodule(self, name, dst_dir, **kwargs): + self.repo.create_submodule(name, dst_dir, **kwargs) + + def has_submodule(self, name): + return name in [submodule.name for submodule in self.repo.submodules] + + def remove_submodule(self, name, **kwargs): + return self.repo.submodule(name).remove(**kwargs) + +def load_project_as_dataset(url): + # symbol forward declaration + raise NotImplementedError() + +class Environment: + PROJECT_EXTRACTOR_NAME = 'project' + + def __init__(self, config=None): + config = Config(config, + fallback=PROJECT_DEFAULT_CONFIG, schema=PROJECT_SCHEMA) + + env_dir = osp.join(config.project_dir, config.env_dir) + env_config_path = osp.join(env_dir, config.env_filename) + env_config = Config(fallback=ENV_DEFAULT_CONFIG, schema=ENV_SCHEMA) + if osp.isfile(env_config_path): + env_config.update(Config.parse(env_config_path)) + + self.config = env_config + + self.models = ModelRegistry(env_config) + self.sources = SourceRegistry(config) + + import datumaro.components.importers as builtin_importers + builtin_importers = builtin_importers.items + custom_importers = self._get_custom_module_items( + env_dir, env_config.importers_dir) + self.importers = ModuleRegistry(config, + builtin=builtin_importers, local=custom_importers) + + import datumaro.components.extractors as builtin_extractors + builtin_extractors = builtin_extractors.items + custom_extractors = self._get_custom_module_items( + env_dir, env_config.extractors_dir) + self.extractors = ModuleRegistry(config, + builtin=builtin_extractors, local=custom_extractors) + self.extractors.register(self.PROJECT_EXTRACTOR_NAME, + load_project_as_dataset) + + import datumaro.components.launchers as builtin_launchers + builtin_launchers = builtin_launchers.items + custom_launchers = self._get_custom_module_items( + env_dir, env_config.launchers_dir) + self.launchers = ModuleRegistry(config, + builtin=builtin_launchers, local=custom_launchers) + + import datumaro.components.converters as builtin_converters + builtin_converters = builtin_converters.items + custom_converters = self._get_custom_module_items( + env_dir, env_config.converters_dir) + if custom_converters is not None: + custom_converters = custom_converters.items + self.converters = ModuleRegistry(config, + builtin=builtin_converters, local=custom_converters) + + self.statistics = ModuleRegistry(config) + self.visualizers = ModuleRegistry(config) + self.git = GitWrapper(config) + + def _get_custom_module_items(self, module_dir, module_name): + items = None + + module = None + if osp.exists(osp.join(module_dir, module_name)): + module = import_foreign_module(module_name, module_dir) + if module is not None: + if hasattr(module, 'items'): + items = module.items + else: + items = self._find_custom_module_items( + osp.join(module_dir, module_name)) + + return items + + @staticmethod + def _find_custom_module_items(module_dir): + files = [p for p in os.listdir(module_dir) + if p.endswith('.py') and p != '__init__.py'] + + all_items = [] + for f in files: + name = osp.splitext(f)[0] + module = import_foreign_module(name, module_dir) + + items = [] + if hasattr(module, 'items'): + items = module.items + else: + if hasattr(module, name): + items = [ (name, getattr(module, name)) ] + else: + log.warn("Failed to import custom module '%s'." + " Custom module is expected to provide 'items' " + "list or have an item matching its file name." + " Skipping this module." % \ + (module_dir + '.' + name)) + + all_items.extend(items) + + return all_items + + def save(self, path): + self.config.dump(path) + + def make_extractor(self, name, *args, **kwargs): + return self.extractors.get(name)(*args, **kwargs) + + def make_importer(self, name, *args, **kwargs): + return self.importers.get(name)(*args, **kwargs) + + def make_launcher(self, name, *args, **kwargs): + return self.launchers.get(name)(*args, **kwargs) + + def make_converter(self, name, *args, **kwargs): + return self.converters.get(name)(*args, **kwargs) + + def register_model(self, name, model): + self.config.models[name] = model + self.models.register(name, model) + + def unregister_model(self, name): + self.config.models.remove(name) + self.models.unregister(name) + + +class Subset(Extractor): + def __init__(self, parent): + self._parent = parent + self.items = OrderedDict() + + def __iter__(self): + for item in self.items.values(): + yield item + + def __len__(self): + return len(self.items) + + def categories(self): + return self._parent.categories() + +class DatasetItemWrapper(DatasetItem): + def __init__(self, item, path, annotations, image=None): + self._item = item + self._path = path + self._annotations = annotations + self._image = image + + @DatasetItem.id.getter + def id(self): + return self._item.id + + @DatasetItem.subset.getter + def subset(self): + return self._item.subset + + @DatasetItem.path.getter + def path(self): + return self._path + + @DatasetItem.annotations.getter + def annotations(self): + return self._annotations + + @DatasetItem.has_image.getter + def has_image(self): + if self._image is not None: + return True + return self._item.has_image + + @DatasetItem.image.getter + def image(self): + if self._image is not None: + if callable(self._image): + return self._image() + return self._image + return self._item.image + +class ProjectDataset(Extractor): + def __init__(self, project): + super().__init__() + + self._project = project + config = self.config + env = self.env + + dataset_filter = None + if config.filter: + dataset_filter = XPathDatasetFilter(config.filter) + self._filter = dataset_filter + + sources = {} + for s_name, source in config.sources.items(): + s_format = source.format + if not s_format: + s_format = env.PROJECT_EXTRACTOR_NAME + options = {} + options.update(source.options) + + url = source.url + if not source.url: + url = osp.join(config.project_dir, config.sources_dir, s_name) + sources[s_name] = env.make_extractor(s_format, + url, **options) + self._sources = sources + + own_source = None + own_source_dir = osp.join(config.project_dir, config.dataset_dir) + if osp.isdir(own_source_dir): + own_source = env.make_extractor(DEFAULT_FORMAT, own_source_dir) + + # merge categories + # TODO: implement properly with merging and annotations remapping + categories = {} + for source in self._sources.values(): + categories.update(source.categories()) + for source in self._sources.values(): + for cat_type, source_cat in source.categories().items(): + assert categories[cat_type] == source_cat + if own_source is not None and len(own_source) != 0: + categories.update(own_source.categories()) + self._categories = categories + + # merge items + subsets = defaultdict(lambda: Subset(self)) + for source_name, source in self._sources.items(): + log.info("Loading '%s' source contents..." % source_name) + for item in source: + if dataset_filter and not dataset_filter(item): + continue + + existing_item = subsets[item.subset].items.get(item.id) + if existing_item is not None: + image = None + if existing_item.has_image: + # TODO: think of image comparison + image = self._lazy_image(existing_item) + + path = existing_item.path + if item.path != path: + path = None + item = DatasetItemWrapper(item=item, path=path, + image=image, annotations=self._merge_anno( + existing_item.annotations, item.annotations)) + else: + s_config = config.sources[source_name] + if s_config and \ + s_config.format != self.env.PROJECT_EXTRACTOR_NAME: + # NOTE: consider imported sources as our own dataset + path = None + else: + path = item.path + if path is None: + path = [] + path = [source_name] + path + item = DatasetItemWrapper(item=item, path=path, + annotations=item.annotations) + + subsets[item.subset].items[item.id] = item + + # override with our items, fallback to existing images + if own_source is not None: + log.info("Loading own dataset...") + for item in own_source: + if dataset_filter and not dataset_filter(item): + continue + + if not item.has_image: + existing_item = subsets[item.subset].items.get(item.id) + if existing_item is not None: + image = None + if existing_item.has_image: + # TODO: think of image comparison + image = self._lazy_image(existing_item) + item = DatasetItemWrapper(item=item, path=None, + annotations=item.annotations, image=image) + + subsets[item.subset].items[item.id] = item + + # TODO: implement subset remapping when needed + subsets_filter = config.subsets + if len(subsets_filter) != 0: + subsets = { k: v for k, v in subsets.items() if k in subsets_filter} + self._subsets = dict(subsets) + + self._length = None + + @staticmethod + def _lazy_image(item): + # NOTE: avoid https://docs.python.org/3/faq/programming.html#why-do-lambdas-defined-in-a-loop-with-different-values-all-return-the-same-result + return lambda: item.image + + @staticmethod + def _merge_anno(a, b): + from itertools import chain + merged = [] + for item in chain(a, b): + found = False + for elem in merged: + if elem == item: + found = True + break + if not found: + merged.append(item) + + return merged + + def iterate_own(self): + return self.select(lambda item: not item.path) + + def __iter__(self): + for subset in self._subsets.values(): + for item in subset: + if self._filter and not self._filter(item): + continue + yield item + + def __len__(self): + if self._length is None: + self._length = reduce(lambda s, x: s + len(x), + self._subsets.values(), 0) + return self._length + + def get_subset(self, name): + return self._subsets[name] + + def subsets(self): + return list(self._subsets) + + def categories(self): + return self._categories + + def define_categories(self, categories): + assert not self._categories + self._categories = categories + + def get(self, item_id, subset=None, path=None): + if path: + source = path[0] + rest_path = path[1:] + return self._sources[source].get( + item_id=item_id, subset=subset, path=rest_path) + return self._subsets[subset].items[item_id] + + def put(self, item, item_id=None, subset=None, path=None): + if path is None: + path = item.path + if path: + source = path[0] + rest_path = path[1:] + # TODO: reverse remapping + self._sources[source].put(item, + item_id=item_id, subset=subset, path=rest_path) + + if item_id is None: + item_id = item.id + if subset is None: + subset = item.subset + + item = DatasetItemWrapper(item=item, path=path, + annotations=item.annotations) + if item.subset not in self._subsets: + self._subsets[item.subset] = Subset(self) + self._subsets[subset].items[item_id] = item + self._length = None + + return item + + def build(self, tasks=None): + pass + + def docs(self): + pass + + def transform(self, model_name, save_dir=None): + project = Project(self.config) + project.config.remove('sources') + + if save_dir is None: + save_dir = self.config.project_dir + project.config.project_dir = save_dir + + dataset = project.make_dataset() + launcher = self._project.make_executable_model(model_name) + inference = InferenceWrapper(self, launcher) + dataset.update(inference) + + dataset.save(merge=True) + + def export(self, save_dir, output_format, + filter_expr=None, **converter_kwargs): + save_dir = osp.abspath(save_dir) + os.makedirs(save_dir, exist_ok=True) + + dataset = self + if filter_expr: + dataset_filter = XPathDatasetFilter(filter_expr) + dataset = dataset.select(dataset_filter) + + converter = self.env.make_converter(output_format, **converter_kwargs) + converter(dataset, save_dir) + + def extract(self, save_dir, filter_expr=None): + project = Project(self.config) + if filter_expr: + XPathDatasetFilter(filter_expr) + project.set_filter(filter_expr) + project.save(save_dir) + + def update(self, items): + for item in items: + if self._filter and not self._filter(item): + continue + self.put(item) + return self + + def save(self, save_dir=None, merge=False, recursive=True, + save_images=False): + if save_dir is None: + assert self.config.project_dir + save_dir = self.config.project_dir + project = self._project + else: + merge = True + + if merge: + project = Project(Config(self.config)) + project.config.remove('sources') + + save_dir = osp.abspath(save_dir) + os.makedirs(save_dir, exist_ok=True) + + dataset_save_dir = osp.join(save_dir, project.config.dataset_dir) + os.makedirs(dataset_save_dir, exist_ok=True) + + converter_kwargs = { + 'save_images': save_images, + } + + if merge: + # merge and save the resulting dataset + converter = self.env.make_converter( + DEFAULT_FORMAT, **converter_kwargs) + converter(self, dataset_save_dir) + else: + if recursive: + # children items should already be updated + # so we just save them recursively + for source in self._sources.values(): + if isinstance(source, ProjectDataset): + source.save(**converter_kwargs) + + converter = self.env.make_converter( + DEFAULT_FORMAT, **converter_kwargs) + converter(self.iterate_own(), dataset_save_dir) + + project.save(save_dir) + + @property + def env(self): + return self._project.env + + @property + def config(self): + return self._project.config + + @property + def sources(self): + return self._sources + +class Project: + @staticmethod + def load(path): + path = osp.abspath(path) + if osp.isdir(path): + path = osp.join(path, PROJECT_DEFAULT_CONFIG.project_filename) + config = Config.parse(path) + config.project_dir = osp.dirname(path) + config.project_filename = osp.basename(path) + return Project(config) + + def save(self, save_dir=None): + config = self.config + if save_dir is None: + assert config.project_dir + save_dir = osp.abspath(config.project_dir) + config_path = osp.join(save_dir, config.project_filename) + + env_dir = osp.join(save_dir, config.env_dir) + os.makedirs(env_dir, exist_ok=True) + self.env.save(osp.join(env_dir, config.env_filename)) + + config.dump(config_path) + + @staticmethod + def generate(save_dir, config=None): + project = Project(config) + project.save(save_dir) + project.config.project_dir = save_dir + return project + + @staticmethod + def import_from(path, dataset_format, env=None, **kwargs): + if env is None: + env = Environment() + importer = env.make_importer(dataset_format) + return importer(path, **kwargs) + + def __init__(self, config=None): + self.config = Config(config, + fallback=PROJECT_DEFAULT_CONFIG, schema=PROJECT_SCHEMA) + self.env = Environment(self.config) + + def make_dataset(self): + return ProjectDataset(self) + + def add_source(self, name, value=Source()): + if isinstance(value, (dict, Config)): + value = Source(value) + self.config.sources[name] = value + self.env.sources.register(name, value) + + def remove_source(self, name): + self.config.sources.remove(name) + self.env.sources.unregister(name) + + def get_source(self, name): + try: + return self.config.sources[name] + except KeyError: + raise KeyError("Source '%s' is not found" % name) + + def get_subsets(self): + return self.config.subsets + + def set_subsets(self, value): + if not value: + self.config.remove('subsets') + else: + self.config.subsets = value + + def add_model(self, name, value=Model()): + if isinstance(value, (dict, Config)): + value = Model(value) + self.env.register_model(name, value) + + def get_model(self, name): + try: + return self.env.models.get(name) + except KeyError: + raise KeyError("Model '%s' is not found" % name) + + def remove_model(self, name): + self.env.unregister_model(name) + + def make_executable_model(self, name): + model = self.get_model(name) + model.model_dir = self.local_model_dir(name) + return self.env.make_launcher(model.launcher, + **model.options, model_dir=model.model_dir) + + def make_source_project(self, name): + source = self.get_source(name) + + config = Config(self.config) + config.remove('sources') + config.remove('subsets') + config.remove('filter') + project = Project(config) + project.add_source(name, source) + return project + + def get_filter(self): + if 'filter' in self.config: + return self.config.filter + return '' + + def set_filter(self, value=None): + if not value: + self.config.remove('filter') + else: + # check filter + XPathDatasetFilter(value) + self.config.filter = value + + def local_model_dir(self, model_name): + return osp.join( + self.config.env_dir, self.env.config.models_dir, model_name) + + def local_source_dir(self, source_name): + return osp.join(self.config.sources_dir, source_name) + +# pylint: disable=function-redefined +def load_project_as_dataset(url): + # implement the function declared above + return Project.load(url).make_dataset() +# pylint: enable=function-redefined \ No newline at end of file diff --git a/datumaro/datumaro/util/__init__.py b/datumaro/datumaro/util/__init__.py new file mode 100644 index 000000000000..87c800fe515c --- /dev/null +++ b/datumaro/datumaro/util/__init__.py @@ -0,0 +1,20 @@ + +# Copyright (C) 2019 Intel Corporation +# +# SPDX-License-Identifier: MIT + +import os + + +def find(iterable, pred=lambda x: True, default=None): + return next((x for x in iterable if pred(x)), default) + +def dir_items(path, ext, truncate_ext=False): + items = [] + for f in os.listdir(path): + ext_pos = f.rfind(ext) + if ext_pos != -1: + if truncate_ext: + f = f[:ext_pos] + items.append(f) + return items \ No newline at end of file diff --git a/datumaro/datumaro/util/command_targets.py b/datumaro/datumaro/util/command_targets.py new file mode 100644 index 000000000000..d8035a23da34 --- /dev/null +++ b/datumaro/datumaro/util/command_targets.py @@ -0,0 +1,113 @@ + +# Copyright (C) 2019 Intel Corporation +# +# SPDX-License-Identifier: MIT + +import argparse +from enum import Enum + +from datumaro.components.project import Project +from datumaro.util.image import load_image + + +TargetKinds = Enum('TargetKinds', + ['project', 'source', 'external_dataset', 'inference', 'image']) + +def is_project_name(value, project): + return value == project.config.project_name + +def is_project_path(value): + if value: + try: + Project.load(value) + return True + except Exception: + pass + return False + +def is_project(value, project=None): + if is_project_path(value): + return True + elif project is not None: + return is_project_name(value, project) + + return False + +def is_source(value, project=None): + if project is not None: + try: + project.get_source(value) + return True + except KeyError: + pass + + return False + +def is_external_source(value): + return False + +def is_inference_path(value): + return False + +def is_image_path(value): + try: + return load_image(value) is not None + except Exception: + return False + + +class Target: + def __init__(self, kind, test, is_default=False, name=None): + self.kind = kind + self.test = test + self.is_default = is_default + self.name = name + + def _get_fields(self): + return [self.kind, self.test, self.is_default, self.name] + + def __str__(self): + return self.name or str(self.kind) + + def __len__(self): + return len(self._get_fields()) + + def __iter__(self): + return iter(self._get_fields()) + +def ProjectTarget(kind=TargetKinds.project, test=None, + is_default=False, name='project name or path', + project=None): + if test is None: + test = lambda v: is_project(v, project=project) + return Target(kind, test, is_default, name) + +def SourceTarget(kind=TargetKinds.source, test=None, + is_default=False, name='source name', + project=None): + if test is None: + test = lambda v: is_source(v, project=project) + return Target(kind, test, is_default, name) + +def ExternalDatasetTarget(kind=TargetKinds.external_dataset, + test=is_external_source, + is_default=False, name='external dataset path'): + return Target(kind, test, is_default, name) + +def InferenceTarget(kind=TargetKinds.inference, test=is_inference_path, + is_default=False, name='inference path'): + return Target(kind, test, is_default, name) + +def ImageTarget(kind=TargetKinds.image, test=is_image_path, + is_default=False, name='image path'): + return Target(kind, test, is_default, name) + + +def target_selector(*targets): + def selector(value): + for (kind, test, is_default, _) in targets: + if (is_default and (value == '' or value is None)) or test(value): + return (kind, value) + raise argparse.ArgumentTypeError('Value should be one of: %s' \ + % (', '.join([str(t) for t in targets]))) + return selector diff --git a/datumaro/datumaro/util/image.py b/datumaro/datumaro/util/image.py new file mode 100644 index 000000000000..2785f9e14b93 --- /dev/null +++ b/datumaro/datumaro/util/image.py @@ -0,0 +1,157 @@ + +# Copyright (C) 2019 Intel Corporation +# +# SPDX-License-Identifier: MIT + +# pylint: disable=unused-import + +from io import BytesIO +import numpy as np + +from enum import Enum +_IMAGE_BACKENDS = Enum('_IMAGE_BACKENDS', ['cv2', 'PIL']) +_IMAGE_BACKEND = None +try: + import cv2 + _IMAGE_BACKEND = _IMAGE_BACKENDS.cv2 +except ModuleNotFoundError: + import PIL + _IMAGE_BACKEND = _IMAGE_BACKENDS.PIL + +from datumaro.util.image_cache import ImageCache as _ImageCache + + +def load_image(path): + """ + Reads an image in the HWC Grayscale/BGR(A) float [0; 255] format. + """ + + if _IMAGE_BACKEND == _IMAGE_BACKENDS.cv2: + import cv2 + image = cv2.imread(path, cv2.IMREAD_UNCHANGED) + image = image.astype(np.float32) + elif _IMAGE_BACKEND == _IMAGE_BACKENDS.PIL: + from PIL import Image + image = Image.open(path) + image = np.asarray(image, dtype=np.float32) + if len(image.shape) == 3 and image.shape[2] in [3, 4]: + image[:, :, :3] = image[:, :, 2::-1] # RGB to BGR + else: + raise NotImplementedError() + + assert len(image.shape) in [2, 3] + if len(image.shape) == 3: + assert image.shape[2] in [3, 4] + return image + +def save_image(path, image, params=None): + if _IMAGE_BACKEND == _IMAGE_BACKENDS.cv2: + import cv2 + ext = path[-4:] + if ext.upper() == '.JPG': + params = [ int(cv2.IMWRITE_JPEG_QUALITY), 75 ] + + image = image.astype(np.uint8) + cv2.imwrite(path, image, params=params) + elif _IMAGE_BACKEND == _IMAGE_BACKENDS.PIL: + from PIL import Image + + if not params: + params = {} + + image = image.astype(np.uint8) + if len(image.shape) == 3 and image.shape[2] in [3, 4]: + image[:, :, :3] = image[:, :, 2::-1] # BGR to RGB + image = Image.fromarray(image) + image.save(path, **params) + else: + raise NotImplementedError() + +def encode_image(image, ext, params=None): + if _IMAGE_BACKEND == _IMAGE_BACKENDS.cv2: + import cv2 + + if not ext.startswith('.'): + ext = '.' + ext + + if ext.upper() == '.JPG': + params = [ int(cv2.IMWRITE_JPEG_QUALITY), 75 ] + + image = image.astype(np.uint8) + success, result = cv2.imencode(ext, image, params=params) + if not success: + raise Exception("Failed to encode image to '%s' format" % (ext)) + return result.tobytes() + elif _IMAGE_BACKEND == _IMAGE_BACKENDS.PIL: + from PIL import Image + + if ext.startswith('.'): + ext = ext[1:] + + if not params: + params = {} + + image = image.astype(np.uint8) + if len(image.shape) == 3 and image.shape[2] in [3, 4]: + image[:, :, :3] = image[:, :, 2::-1] # BGR to RGB + image = Image.fromarray(image) + with BytesIO() as buffer: + image.save(buffer, format=ext, **params) + return buffer.getvalue() + else: + raise NotImplementedError() + +def decode_image(image_bytes): + if _IMAGE_BACKEND == _IMAGE_BACKENDS.cv2: + import cv2 + image = np.frombuffer(image_bytes, dtype=np.uint8) + image = cv2.imdecode(image, cv2.IMREAD_UNCHANGED) + image = image.astype(np.float32) + elif _IMAGE_BACKEND == _IMAGE_BACKENDS.PIL: + from PIL import Image + image = Image.open(BytesIO(image_bytes)) + image = np.asarray(image, dtype=np.float32) + if len(image.shape) == 3 and image.shape[2] in [3, 4]: + image[:, :, :3] = image[:, :, 2::-1] # RGB to BGR + else: + raise NotImplementedError() + + assert len(image.shape) in [2, 3] + if len(image.shape) == 3: + assert image.shape[2] in [3, 4] + return image + + +class lazy_image: + def __init__(self, path, loader=load_image, cache=None): + self.path = path + self.loader = loader + + # Cache: + # - False: do not cache + # - None: use default (don't store in a class variable) + # - object: use this object as a cache + assert cache in [None, False] or isinstance(cache, object) + self.cache = cache + + def __call__(self): + image = None + image_id = id(self) # path is not necessary hashable or a file path + + cache = self._get_cache() + if cache is not None: + image = self._get_cache().get(image_id) + + if image is None: + image = self.loader(self.path) + if cache is not None: + cache.push(image_id, image) + return image + + def _get_cache(self): + cache = self.cache + if cache is None: + cache = _ImageCache.get_instance() + elif cache == False: + return None + return cache diff --git a/datumaro/datumaro/util/image_cache.py b/datumaro/datumaro/util/image_cache.py new file mode 100644 index 000000000000..fd1ad0d78639 --- /dev/null +++ b/datumaro/datumaro/util/image_cache.py @@ -0,0 +1,38 @@ +from collections import OrderedDict + + +_instance = None + +DEFAULT_CAPACITY = 2 + +class ImageCache: + @staticmethod + def get_instance(): + global _instance + if _instance is None: + _instance = ImageCache() + return _instance + + def __init__(self, capacity=DEFAULT_CAPACITY): + self.capacity = int(capacity) + self.items = OrderedDict() + + def push(self, item_id, image): + if self.capacity <= len(self.items): + self.items.popitem(last=True) + self.items[item_id] = image + + def get(self, item_id): + default = object() + item = self.items.get(item_id, default) + if item is default: + return None + + self.items.move_to_end(item_id, last=False) # naive splay tree + return item + + def size(self): + return len(self.items) + + def clear(self): + self.items.clear() \ No newline at end of file diff --git a/datumaro/datumaro/util/mask_tools.py b/datumaro/datumaro/util/mask_tools.py new file mode 100644 index 000000000000..d9c7fe9235d7 --- /dev/null +++ b/datumaro/datumaro/util/mask_tools.py @@ -0,0 +1,96 @@ + +# Copyright (C) 2019 Intel Corporation +# +# SPDX-License-Identifier: MIT + +from itertools import groupby +import numpy as np + +from datumaro.util.image import lazy_image, load_image + + +def generate_colormap(length=256): + def get_bit(number, index): + return (number >> index) & 1 + + colormap = np.zeros((length, 3), dtype=int) + indices = np.arange(length, dtype=int) + + for j in range(7, -1, -1): + for c in range(3): + colormap[:, c] |= get_bit(indices, c) << j + indices >>= 3 + + return { + id: tuple(color) for id, color in enumerate(colormap) + } + +def invert_colormap(colormap): + return { + tuple(a): index for index, a in colormap.items() + } + +_default_colormap = generate_colormap() +_default_unpaint_colormap = invert_colormap(_default_colormap) + +def _default_unpaint_colormap_fn(r, g, b): + return _default_unpaint_colormap[(r, g, b)] + +def unpaint_mask(painted_mask, colormap=None): + # expect HWC BGR [0; 255] image + # expect RGB->index colormap + assert len(painted_mask.shape) == 3 + if colormap is None: + colormap = _default_unpaint_colormap_fn + if callable(colormap): + map_fn = lambda a: colormap(int(a[2]), int(a[1]), int(a[0])) + else: + map_fn = lambda a: colormap[(int(a[2]), int(a[1]), int(a[0]))] + + unpainted_mask = np.apply_along_axis(map_fn, + 1, np.reshape(painted_mask, (-1, 3))) + unpainted_mask = np.reshape(unpainted_mask, (painted_mask.shape[:2])) + return unpainted_mask.astype(int) + + +def apply_colormap(mask, colormap=None): + # expect HW [0; max_index] mask + # expect index->RGB colormap + assert len(mask.shape) == 2 + + if colormap is None: + colormap = _default_colormap + if callable(colormap): + map_fn = lambda p: colormap(int(p[0]))[::-1] + else: + map_fn = lambda p: colormap[int(p[0])][::-1] + painted_mask = np.apply_along_axis(map_fn, 1, np.reshape(mask, (-1, 1))) + + painted_mask = np.reshape(painted_mask, (*mask.shape, 3)) + return painted_mask.astype(np.float32) + + +def load_mask(path, colormap=None): + mask = load_image(path) + if colormap is not None: + if len(mask.shape) == 3 and mask.shape[2] != 1: + mask = unpaint_mask(mask, colormap=colormap) + return mask + +def lazy_mask(path, colormap=None): + return lazy_image(path, lambda path: load_mask(path, colormap)) + + +def convert_mask_to_rle(binary_mask): + counts = [] + for i, (value, elements) in enumerate( + groupby(binary_mask.ravel(order='F'))): + # decoding starts from 0 + if i == 0 and value == 1: + counts.append(0) + counts.append(len(list(elements))) + + return { + 'counts': counts, + 'size': list(binary_mask.shape) + } \ No newline at end of file diff --git a/datumaro/datumaro/util/test_utils.py b/datumaro/datumaro/util/test_utils.py new file mode 100644 index 000000000000..9219f5cfa01b --- /dev/null +++ b/datumaro/datumaro/util/test_utils.py @@ -0,0 +1,39 @@ + +# Copyright (C) 2019 Intel Corporation +# +# SPDX-License-Identifier: MIT + +import inspect +import os +import os.path as osp +import shutil + + +def current_function_name(depth=1): + return inspect.getouterframes(inspect.currentframe())[depth].function + +class FileRemover: + def __init__(self, path, is_dir=False, ignore_errors=False): + self.path = path + self.is_dir = is_dir + self.ignore_errors = ignore_errors + + def __enter__(self): + return self + + # pylint: disable=redefined-builtin + def __exit__(self, type=None, value=None, traceback=None): + if self.is_dir: + shutil.rmtree(self.path, ignore_errors=self.ignore_errors) + else: + os.remove(self.path) + # pylint: enable=redefined-builtin + +class TestDir(FileRemover): + def __init__(self, path=None, ignore_errors=False): + if path is None: + path = osp.abspath('temp_%s' % current_function_name(2)) + + os.makedirs(path, exist_ok=ignore_errors) + + super().__init__(path, is_dir=True, ignore_errors=ignore_errors) \ No newline at end of file diff --git a/datumaro/datumaro/util/tf_util.py b/datumaro/datumaro/util/tf_util.py new file mode 100644 index 000000000000..0d939a95ce39 --- /dev/null +++ b/datumaro/datumaro/util/tf_util.py @@ -0,0 +1,38 @@ + +# Copyright (C) 2019 Intel Corporation +# +# SPDX-License-Identifier: MIT + +def import_tf(): + import sys + + tf = sys.modules.get('tensorflow', None) + if tf is not None: + return tf + + # Reduce output noise, https://stackoverflow.com/questions/38073432/how-to-suppress-verbose-tensorflow-logging + import os + os.environ['TF_CPP_MIN_LOG_LEVEL'] = '2' + + import tensorflow as tf + + try: + tf.get_logger().setLevel('WARNING') + except AttributeError: + pass + try: + tf.compat.v1.logging.set_verbosity(tf.compat.v1.logging.WARN) + except AttributeError: + pass + + # Enable eager execution in early versions to unlock dataset operations + try: + tf.compat.v1.enable_eager_execution() + except AttributeError: + pass + try: + tf.enable_eager_execution() + except AttributeError: + pass + + return tf \ No newline at end of file diff --git a/datumaro/datumaro/version.py b/datumaro/datumaro/version.py new file mode 100644 index 000000000000..8589c063873b --- /dev/null +++ b/datumaro/datumaro/version.py @@ -0,0 +1 @@ +VERSION = '0.1.0' \ No newline at end of file diff --git a/datumaro/docs/cli_design.mm b/datumaro/docs/cli_design.mm new file mode 100644 index 000000000000..4c7b188cf5fa --- /dev/null +++ b/datumaro/docs/cli_design.mm @@ -0,0 +1,147 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/datumaro/docs/design.md b/datumaro/docs/design.md new file mode 100644 index 000000000000..69d4d198816a --- /dev/null +++ b/datumaro/docs/design.md @@ -0,0 +1,228 @@ +# Datumaro + + + +## Table of contents + +- [Concept](#concept) +- [Design](#design) +- [RC 1 vision](#rc-1-vision) + +## Concept + +Datumaro is: +- a tool to build composite datasets and iterate over them +- a tool to create and maintain datasets + - Version control of annotations and images + - Publication (with removal of sensitive information) + - Editing + - Joining and splitting + - Exporting, format changing + - Image preprocessing +- a dataset storage +- a tool to debug datasets + - A network can be used to generate + informative data subsets (e.g. with false-positives) + to be analyzed further + +### Requirements + +- User interfaces + - a library + - a console tool with visualization means +- Targets: single datasets, composite datasets, single images / videos +- Built-in support for well-known annotation formats and datasets: + CVAT, COCO, PASCAL VOC, Cityscapes, ImageNet +- Extensibility with user-provided components +- Lightweightness - it should be easy to start working with Datumaro + - Minimal dependency on environment and configuration + - It should be easier to use Datumaro than writing own code + for computation of statistics or dataset manipulations + +### Functionality and ideas + +- Blur sensitive areas on dataset images +- Dataset annotation filters, relabelling etc. +- Dataset augmentation +- Calculation of statistics: + - Mean & std, custom stats +- "Edit" command to modify annotations +- Versioning (for images, annotations, subsets, sources etc., comparison) +- Documentation generation +- Provision of iterators for user code +- Dataset building (export in a specific format, indexation, statistics, documentation) +- Dataset exporting to other formats +- Dataset debugging (run inference, generate dataset slices, compute statistics) +- "Explainable AI" - highlight network attention areas ([paper](https://arxiv.org/abs/1901.04592)) + - Black-box approach + - Classification, Detection, Segmentation, Captioning + - White-box approach + +### Research topics + +- exploration of network prediction uncertainty (aka Bayessian approach) + Use case: explanation of network "quality", "stability", "certainty" +- adversarial attacks on networks +- dataset minification / reduction + Use case: removal of redundant information to reach the same network quality with lesser training time +- dataset expansion and filtration of additions + Use case: add only important data +- guidance for key frame selection for tracking ([paper](https://arxiv.org/abs/1903.11779)) + Use case: more effective annotation, better predictions + +## Design + +### Command-line + +Use Docker as an example. Basically, the interface is partitioned +on contexts and shortcuts. Contexts are semantically grouped commands, +related to a single topic or target. Shortcuts are handy shorter +alternatives for the most used commands and also special commands, +which are hard to be put into specific context. + +![cli-design-image](images/cli_design.png) + +- [FreeMind tool link](http://freemind.sourceforge.net/wiki/index.php/Main_Page) + +### High-level architecture + +- Using MVVM UI pattern + +![mvvm-image](images/mvvm.png) + +### Datumaro project and environment structure + + +``` +├── [datumaro module] +└── [project folder] + ├── .datumaro/ + │   ├── config.yml + │   ├── .git/ + │   ├── importers/ + │   │   ├── custom_format_importer1.py + │   │   └── ... + │   ├── statistics/ + │   │   ├── custom_statistic1.py + │   │   └── ... + │   ├── visualizers/ + │   │ ├── custom_visualizer1.py + │   │ └── ... + │   └── extractors/ + │   ├── custom_extractor1.py + │   └── ... + └── sources/ + ├── source1 + └── ... +``` + + +## RC 1 vision + +In the first version Datumaro should be a project manager for CVAT. +It should only consume data from CVAT. The collected dataset +can be downloaded by user to be operated on with Datumaro CLI. + + +``` + User + | + v + +------------------+ + | CVAT | + +--------v---------+ +------------------+ +--------------+ + | Datumaro module | ----> | Datumaro project | <---> | Datumaro CLI | <--- User + +------------------+ +------------------+ +--------------+ +``` + + +### Interfaces + +- [x] Python API for user code + - [ ] Installation as a package +- [x] A command-line tool for dataset manipulations + +### Features + +- Dataset format support (reading, exporting) + - [x] Own format + - [x] COCO + - [x] PASCAL VOC + - [ ] Cityscapes + - [ ] ImageNet + - [ ] CVAT + +- Dataset visualization (`show`) + - [ ] Ability to visualize a dataset + - [ ] with TensorBoard + +- Calculation of statistics for datasets + - [ ] Pixel mean, std + - [ ] Object counts (detection scenario) + - [ ] Image-Class distribution (classification scenario) + - [ ] Pixel-Class distribution (segmentation scenario) + - [ ] Image clusters + - [ ] Custom statistics + +- Dataset building + - [x] Composite dataset building + - [ ] Annotation remapping + - [ ] Subset splitting + - [x] Dataset filtering (`extract`) + - [x] Dataset merging (`merge`) + - [ ] Dataset item editing (`edit`) + +- Dataset comparison (`diff`) + - [x] Annotation-annotation comparison + - [x] Annotation-inference comparison + - [ ] Annotation quality estimation (for CVAT) + - Provide a simple method to check + annotation quality with a model and generate summary + +- Dataset and model debugging + - [x] Inference explanation (`explain`) + - [x] Black-box approach ([RISE paper](https://arxiv.org/abs/1806.07421)) + - [x] Ability to run a model on a dataset and read the results + +- CVAT-integration features + - [x] Task export + - [x] Datumaro project export + - [x] Dataset export + - [ ] Original raw data (images, a video file) can be downloaded (exported) + together with annotations or just have links + on CVAT server (in the future support S3, etc) + - [x] Be able to use local files instead of remote links + - [ ] Specify cache directory + - [x] Use case "annotate for model training" + - create a task + - annotate + - export the task + - convert to a training format + - train a DL model + - [ ] Use case "annotate and estimate quality" + - create a task + - annotate + - estimate quality of annotations + +### Optional features + +- Dataset publishing + - [ ] Versioning (for annotations, subsets, sources, etc.) + - [ ] Blur sensitive areas on images + - [ ] Tracking of legal information + - [ ] Documentation generation + +- Dataset building + - [ ] Dataset minification / Extraction of the most representative subset + - Use case: generate low-precision calibration dataset + +- Dataset and model debugging + - [ ] Training visualization + - [ ] Inference explanation (`explain`) + - [ ] White-box approach + +### Properties + +- Lightweightness +- Modularity +- Extensibility diff --git a/datumaro/docs/images/cli_design.png b/datumaro/docs/images/cli_design.png new file mode 100644 index 0000000000000000000000000000000000000000..702728c442a7938af24630916fcde41b14c66c33 GIT binary patch literal 93636 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 literal 0 HcmV?d00001 diff --git a/datumaro/docs/images/mvvm.png b/datumaro/docs/images/mvvm.png new file mode 100644 index 0000000000000000000000000000000000000000..88257123ac7db353ec1919203576b3b29d37ee91 GIT binary patch literal 30318 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 literal 0 HcmV?d00001 diff --git a/datumaro/docs/quickstart.md b/datumaro/docs/quickstart.md new file mode 100644 index 000000000000..d5fb98a6ab5a --- /dev/null +++ b/datumaro/docs/quickstart.md @@ -0,0 +1,325 @@ +# Quick start guide + +## Installation + +### Prerequisites + +- Python (3.5+) +- OpenVINO (optional) + +### Installation steps + +Download the project to any directory. + +Set up a virtual environment: + +``` bash +python -m pip install virtualenv +python -m virtualenv venv +. venv/bin/activate +while read -r p; do pip install $p; done < requirements.txt +``` + +## Usage + +The directory containing the project should be in the +`PYTHONPATH` environment variable. The other way is to invoke +commands from that directory. + +As a python module: + +``` bash +python -m datumaro --help +``` + +As a standalone python script: + +``` bash +python datum.py --help +``` + +As a python library: + +``` python +import datumaro +``` + +## Workflow + +> **Note**: command invocation **syntax is subject to change, refer to --help output** + +The key object is the project. It can be created or imported with +`project create` and `project import` commands. The project is a combination of +dataset and environment. + +If you want to interact with models, you should add them to project first. + +Implemented commands ([CLI design doc](images/cli_design.png)): +- project create +- project import +- project diff +- project transform +- source add +- explain + +### Create a project + +Usage: + +``` bash +python datum.py project create --help + +python datum.py project create \ + -d +``` + +Example: + +``` bash +python datum.py project create -d /home/my_dataset +``` + +### Import a project + +This command creates a project from an existing dataset. Supported formats: +- MS COCO +- Custom formats via custom `importers` and `extractors` + +Usage: + +``` bash +python -m datumaro project import --help + +python -m datumaro project import \ + \ + -d \ + -t +``` + +Example: + +``` bash +python -m datumaro project import \ + /home/coco_dir \ + -d /home/project_dir \ + -t ms_coco +``` + +An _MS COCO_-like dataset should have the following directory structure: + + +``` +COCO/ +├── annotations/ +│   ├── instances_val2017.json +│   ├── instances_train2017.json +├── images/ +│   ├── val2017 +│   ├── train2017 +``` + + +Everything after the last `_` is considered as a subset name. + +### Register a model + +Supported models: +- OpenVINO +- Custom models via custom `launchers` + +Usage: + +``` bash +python -m datumaro model add --help +``` + +Example: register OpenVINO model + +A model consists of a graph description and weights. There is also a script +used to convert model outputs to internal data structures. + +``` bash +python -m datumaro model add \ + openvino \ + -d -w -i +``` + +Interpretation script for an OpenVINO detection model (`convert.py`): + +``` python +from datumaro.components.extractor import * + +max_det = 10 +conf_thresh = 0.1 + +def process_outputs(inputs, outputs): + # inputs = model input, array or images, shape = (N, C, H, W) + # outputs = model output, shape = (N, 1, K, 7) + # results = conversion result, [ [ Annotation, ... ], ... ] + results = [] + for input, output in zip(inputs, outputs): + input_height, input_width = input.shape[:2] + detections = output[0] + image_results = [] + for i, det in enumerate(detections): + label = int(det[1]) + conf = det[2] + if conf <= conf_thresh: + continue + + x = max(int(det[3] * input_width), 0) + y = max(int(det[4] * input_height), 0) + w = min(int(det[5] * input_width - x), input_width) + h = min(int(det[6] * input_height - y), input_height) + image_results.append(BboxObject(x, y, w, h, + label=label, attributes={'score': conf} )) + + results.append(image_results[:max_det]) + + return results + +def get_categories(): + # Optionally, provide output categories - label map etc. + # Example: + label_categories = LabelCategories() + label_categories.add('person') + label_categories.add('car') + return { AnnotationType.label: label_categories } +``` + +### Run a model inference + +This command сreates a new project from the current project. The new +one annotations are the model outputs. + +Usage: + +``` bash +python -m datumaro project transform --help + +python -m datumaro project transform \ + -m \ + -d +``` + +Example: + +``` bash +python -m datumaro project import <...> +python -m datumaro model add mymodel <...> +python -m datumaro project transform -m mymodel -d ../mymodel_inference +``` + +### Compare datasets + +The command compares two datasets and saves the results in the +specified directory. The current project is considered to be +"ground truth". + +``` bash +python -m datumaro project diff --help + +python -m datumaro project diff -d +``` + +Example: compare a dataset with model inference + +``` bash +python -m datumaro project import <...> +python -m datumaro model add mymodel <...> +python -m datumaro project transform <...> -d ../inference +python -m datumaro project diff ../inference -d ../diff +``` + +### Run inference explanation + +Usage: + +``` bash +python -m datumaro explain --help + +python -m datumaro explain \ + -m \ + -d \ + -t \ + \ + +``` + +Example: run inference explanation on a single image with visualization + +``` bash +python -m datumaro project create <...> +python -m datumaro model add mymodel <...> +python -m datumaro explain \ + -m mymodel \ + -t 'image.png' \ + rise \ + -s 1000 --progressive +``` + +### Extract data subset based on filter + +This command allows to create a subprject form a project, which +would include only items satisfying some condition. XPath is used as a query +format. + +Usage: + +``` bash +python -m datumaro project extract --help + +python -m datumaro project extract \ + -p \ + -d \ + -f '' +``` + +Example: + +``` bash +python -m datumaro project extract \ + -p ../test_project \ + -d ../test_project-extract \ + -f '/item[image/width < image/height]' +``` + +Item representation: + +``` xml + + 290768 + minival2014 + + 612 + 612 + 3 + + + 80154 + bbox + 39 + 264.59 + 150.25 + 11.199999999999989 + 42.31 + 473.87199999999956 + + + 669839 + bbox + 41 + 163.58 + 191.75 + 76.98999999999998 + 73.63 + 5668.773699999998 + + ... + +``` + +## Links +- [TensorFlow detection model zoo](https://github.com/tensorflow/models/blob/master/research/object_detection/g3doc/detection_model_zoo.md) +- [How to convert model to OpenVINO format](https://docs.openvinotoolkit.org/latest/_docs_MO_DG_prepare_model_convert_model_tf_specific_Convert_Object_Detection_API_Models.html) +- [Model convert script for this model](https://github.com/opencv/cvat/blob/3e09503ba6c6daa6469a6c4d275a5a8b168dfa2c/components/tf_annotation/install.sh#L23) diff --git a/datumaro/requirements.txt b/datumaro/requirements.txt new file mode 100644 index 000000000000..f50ab0af9fa6 --- /dev/null +++ b/datumaro/requirements.txt @@ -0,0 +1,10 @@ +Cython>=0.27.3 # include before pycocotools +GitPython>=2.1.11 +lxml>=4.4.1 +matplotlib<3.1 # 3.1+ requires python3.6, but we have 3.5 in cvat +opencv-python>=4.1.0.25 +Pillow>=6.1.0 +pycocotools>=2.0.0 +PyYAML>=5.1.1 +tensorboardX>=1.8 +tensorflow>=1.12.0 \ No newline at end of file diff --git a/datumaro/setup.py b/datumaro/setup.py new file mode 100644 index 000000000000..1bdf5ff15e42 --- /dev/null +++ b/datumaro/setup.py @@ -0,0 +1,67 @@ + +# Copyright (C) 2019 Intel Corporation +# +# SPDX-License-Identifier: MIT + +import os.path as osp +import re +import setuptools + + +def find_version(file_path=None): + if not file_path: + file_path = osp.join(osp.dirname(osp.abspath(__file__)), + 'datumaro', 'version.py') + + with open(file_path, 'r') as version_file: + version_text = version_file.read() + + # PEP440: + # https://www.python.org/dev/peps/pep-0440/#appendix-b-parsing-version-strings-with-regular-expressions + pep_regex = r'([1-9]\d*!)?(0|[1-9]\d*)(\.(0|[1-9]\d*))*((a|b|rc)(0|[1-9]\d*))?(\.post(0|[1-9]\d*))?(\.dev(0|[1-9]\d*))?' + version_regex = r'VERSION\s*=\s*.(' + pep_regex + ').' + match = re.match(version_regex, version_text) + if not match: + raise RuntimeError("Failed to find version string in '%s'" % file_path) + + version = version_text[match.start(1) : match.end(1)] + return version + + +with open('README.md', 'r') as fh: + long_description = fh.read() + +setuptools.setup( + name="datumaro", + version=find_version(), + author="Intel", + author_email="maxim.zhiltsov@intel.com", + description="Dataset Framework", + long_description=long_description, + long_description_content_type="text/markdown", + url="https://github.com/opencv/cvat/datumaro", + packages=setuptools.find_packages(exclude=['tests*']), + classifiers=[ + "Programming Language :: Python :: 3", + "License :: OSI Approved :: MIT License", + "Operating System :: OS Independent", + ], + python_requires='>=3.5', + install_requires=[ + 'GitPython', + 'lxml', + 'matplotlib', + 'numpy', + 'opencv-python', + 'Pillow', + 'PyYAML', + 'pycocotools', + 'tensorboardX', + 'tensorflow', + ], + entry_points={ + 'console_scripts': [ + 'datum=datumaro:main', + ], + }, +) \ No newline at end of file diff --git a/datumaro/test.py b/datumaro/test.py new file mode 100644 index 000000000000..184bbff53262 --- /dev/null +++ b/datumaro/test.py @@ -0,0 +1,5 @@ +import unittest + + +if __name__ == '__main__': + unittest.main() \ No newline at end of file diff --git a/datumaro/tests/__init__.py b/datumaro/tests/__init__.py new file mode 100644 index 000000000000..e69de29bb2d1 diff --git a/datumaro/tests/test_RISE.py b/datumaro/tests/test_RISE.py new file mode 100644 index 000000000000..a7560f1ff0e3 --- /dev/null +++ b/datumaro/tests/test_RISE.py @@ -0,0 +1,230 @@ +from collections import namedtuple +import cv2 +import numpy as np + +from unittest import TestCase + +from datumaro.components.extractor import LabelObject, BboxObject +from datumaro.components.launcher import Launcher +from datumaro.components.algorithms.rise import RISE + + +class RiseTest(TestCase): + def test_rise_can_be_applied_to_classification_model(self): + class TestLauncher(Launcher): + def __init__(self, class_count, roi, **kwargs): + self.class_count = class_count + self.roi = roi + + def launch(self, inputs): + for inp in inputs: + yield self._process(inp) + + def _process(self, image): + roi = self.roi + roi_area = (roi[1] - roi[0]) * (roi[3] - roi[2]) + if 0.5 * roi_area < np.sum(image[roi[0]:roi[1], roi[2]:roi[3], 0]): + cls = 0 + else: + cls = 1 + + cls_conf = 0.5 + other_conf = (1.0 - cls_conf) / (self.class_count - 1) + + return [ + LabelObject(i, attributes={ + 'score': cls_conf if cls == i else other_conf }) \ + for i in range(self.class_count) + ] + + roi = [70, 90, 7, 90] + model = TestLauncher(class_count=3, roi=roi) + + rise = RISE(model, max_samples=(7 * 7) ** 2, mask_width=7, mask_height=7) + + image = np.ones((100, 100, 3)) + heatmaps = next(rise.apply(image)) + + self.assertEqual(1, len(heatmaps)) + + heatmap = heatmaps[0] + self.assertEqual(image.shape[:2], heatmap.shape) + + h_sum = np.sum(heatmap) + h_area = np.prod(heatmap.shape) + roi_sum = np.sum(heatmap[roi[0]:roi[1], roi[2]:roi[3]]) + roi_area = (roi[1] - roi[0]) * (roi[3] - roi[2]) + roi_den = roi_sum / roi_area + hrest_den = (h_sum - roi_sum) / (h_area - roi_area) + self.assertLess(hrest_den, roi_den) + + def test_rise_can_be_applied_to_detection_model(self): + ROI = namedtuple('ROI', + ['threshold', 'x', 'y', 'w', 'h', 'label']) + + class TestLauncher(Launcher): + def __init__(self, rois, class_count, fp_count=4, pixel_jitter=20, **kwargs): + self.rois = rois + self.roi_base_sums = [None, ] * len(rois) + self.class_count = class_count + self.fp_count = fp_count + self.pixel_jitter = pixel_jitter + + @staticmethod + def roi_value(roi, image): + return np.sum( + image[roi.y:roi.y + roi.h, roi.x:roi.x + roi.w, :]) + + def launch(self, inputs): + for inp in inputs: + yield self._process(inp) + + def _process(self, image): + detections = [] + for i, roi in enumerate(self.rois): + roi_sum = self.roi_value(roi, image) + roi_base_sum = self.roi_base_sums[i] + first_run = roi_base_sum is None + if first_run: + roi_base_sum = roi_sum + self.roi_base_sums[i] = roi_base_sum + + cls_conf = roi_sum / roi_base_sum + + if roi.threshold < roi_sum / roi_base_sum: + cls = roi.label + detections.append( + BboxObject(roi.x, roi.y, roi.w, roi.h, + label=cls, attributes={'score': cls_conf}) + ) + + if first_run: + continue + for j in range(self.fp_count): + if roi.threshold < cls_conf: + cls = roi.label + else: + cls = (i + j) % self.class_count + box = [roi.x, roi.y, roi.w, roi.h] + offset = (np.random.rand(4) - 0.5) * self.pixel_jitter + detections.append( + BboxObject(*(box + offset), + label=cls, attributes={'score': cls_conf}) + ) + + return detections + + rois = [ + ROI(0.3, 10, 40, 30, 10, 0), + ROI(0.5, 70, 90, 7, 10, 0), + ROI(0.7, 5, 20, 40, 60, 2), + ROI(0.9, 30, 20, 10, 40, 1), + ] + model = model = TestLauncher(class_count=3, rois=rois) + + rise = RISE(model, max_samples=(7 * 7) ** 2, mask_width=7, mask_height=7) + + image = np.ones((100, 100, 3)) + heatmaps = next(rise.apply(image)) + heatmaps_class_count = len(set([roi.label for roi in rois])) + self.assertEqual(heatmaps_class_count + len(rois), len(heatmaps)) + + # roi_image = image.copy() + # for i, roi in enumerate(rois): + # cv2.rectangle(roi_image, (roi.x, roi.y), (roi.x + roi.w, roi.y + roi.h), (32 * i) * 3) + # cv2.imshow('img', roi_image) + + for c in range(heatmaps_class_count): + class_roi = np.zeros(image.shape[:2]) + for i, roi in enumerate(rois): + if roi.label != c: + continue + class_roi[roi.y:roi.y + roi.h, roi.x:roi.x + roi.w] \ + += roi.threshold + + heatmap = heatmaps[c] + + roi_pixels = heatmap[class_roi != 0] + h_sum = np.sum(roi_pixels) + h_area = np.sum(roi_pixels != 0) + h_den = h_sum / h_area + + rest_pixels = heatmap[class_roi == 0] + r_sum = np.sum(rest_pixels) + r_area = np.sum(rest_pixels != 0) + r_den = r_sum / r_area + + # print(r_den, h_den) + # cv2.imshow('class %s' % c, heatmap) + self.assertLess(r_den, h_den) + + for i, roi in enumerate(rois): + heatmap = heatmaps[heatmaps_class_count + i] + h_sum = np.sum(heatmap) + h_area = np.prod(heatmap.shape) + roi_sum = np.sum(heatmap[roi.y:roi.y + roi.h, roi.x:roi.x + roi.w]) + roi_area = roi.h * roi.w + roi_den = roi_sum / roi_area + hrest_den = (h_sum - roi_sum) / (h_area - roi_area) + # print(hrest_den, h_den) + # cv2.imshow('roi %s' % i, heatmap) + self.assertLess(hrest_den, roi_den) + # cv2.waitKey(0) + + @staticmethod + def DISABLED_test_roi_nms(): + ROI = namedtuple('ROI', + ['conf', 'x', 'y', 'w', 'h', 'label']) + + class_count = 3 + noisy_count = 3 + rois = [ + ROI(0.3, 10, 40, 30, 10, 0), + ROI(0.5, 70, 90, 7, 10, 0), + ROI(0.7, 5, 20, 40, 60, 2), + ROI(0.9, 30, 20, 10, 40, 1), + ] + pixel_jitter = 10 + + detections = [] + for i, roi in enumerate(rois): + detections.append( + BboxObject(roi.x, roi.y, roi.w, roi.h, + label=roi.label, attributes={'score': roi.conf}) + ) + + for j in range(noisy_count): + cls_conf = roi.conf * j / noisy_count + cls = (i + j) % class_count + box = [roi.x, roi.y, roi.w, roi.h] + offset = (np.random.rand(4) - 0.5) * pixel_jitter + detections.append( + BboxObject(*(box + offset), + label=cls, attributes={'score': cls_conf}) + ) + + image = np.zeros((100, 100, 3)) + for i, det in enumerate(detections): + roi = ROI(det.attributes['score'], *det.get_bbox(), det.label) + p1 = (int(roi.x), int(roi.y)) + p2 = (int(roi.x + roi.w), int(roi.y + roi.h)) + c = (0, 1 * (i % (1 + noisy_count) == 0), 1) + cv2.rectangle(image, p1, p2, c) + cv2.putText(image, 'd%s-%s-%.2f' % (i, roi.label, roi.conf), + p1, cv2.FONT_HERSHEY_SIMPLEX, 0.25, c) + cv2.imshow('nms_image', image) + cv2.waitKey(0) + + nms_boxes = RISE.nms(detections, iou_thresh=0.25) + print(len(detections), len(nms_boxes)) + + for i, det in enumerate(nms_boxes): + roi = ROI(det.attributes['score'], *det.get_bbox(), det.label) + p1 = (int(roi.x), int(roi.y)) + p2 = (int(roi.x + roi.w), int(roi.y + roi.h)) + c = (0, 1, 0) + cv2.rectangle(image, p1, p2, c) + cv2.putText(image, 'p%s-%s-%.2f' % (i, roi.label, roi.conf), + p1, cv2.FONT_HERSHEY_SIMPLEX, 0.25, c) + cv2.imshow('nms_image', image) + cv2.waitKey(0) \ No newline at end of file diff --git a/datumaro/tests/test_coco_format.py b/datumaro/tests/test_coco_format.py new file mode 100644 index 000000000000..17d7155752f8 --- /dev/null +++ b/datumaro/tests/test_coco_format.py @@ -0,0 +1,488 @@ +import json +import numpy as np +import os +import os.path as osp +from PIL import Image + +from unittest import TestCase + +from datumaro.components.project import Project +from datumaro.components.extractor import ( + DEFAULT_SUBSET_NAME, + Extractor, DatasetItem, + AnnotationType, LabelObject, MaskObject, PointsObject, PolygonObject, + BboxObject, CaptionObject, + LabelCategories, PointsCategories +) +from datumaro.components.converters.ms_coco import ( + CocoConverter, + CocoImageInfoConverter, + CocoCaptionsConverter, + CocoInstancesConverter, + CocoPersonKeypointsConverter, + CocoLabelsConverter, +) +from datumaro.util import find +from datumaro.util.test_utils import TestDir + + +class CocoImporterTest(TestCase): + @staticmethod + def generate_annotation(): + annotation = { + 'licenses': [], + 'info': {}, + 'categories': [], + 'images': [], + 'annotations': [], + } + annotation['licenses'].append({ + 'name': '', + 'id': 0, + 'url': '', + }) + annotation['info'] = { + 'contributor': '', + 'date_created': '', + 'description': '', + 'url': '', + 'version': '', + 'year': '', + } + annotation['licenses'].append({ + 'name': '', + 'id': 0, + 'url': '', + }) + annotation['categories'].append({ + 'id': 1, + 'name': 'TEST', + 'supercategory': '', + }) + annotation['images'].append({ + "id": 1, + "width": 10, + "height": 5, + "file_name": '000000000001.jpg', + "license": 0, + "flickr_url": '', + "coco_url": '', + "date_captured": 0, + }) + annotation['annotations'].append({ + "id": 1, + "image_id": 1, + "category_id": 1, + "segmentation": [[0, 0, 1, 0, 1, 2, 0, 2]], + "area": 2, + "bbox": [0, 0, 1, 2], + "iscrowd": 0, + }) + annotation['annotations'].append({ + "id": 2, + "image_id": 1, + "category_id": 1, + "segmentation": { + "counts": [ + 0, 10, + 5, 5, + 5, 5, + 0, 10, + 10, 0], + "size": [10, 5]}, + "area": 30, + "bbox": [0, 0, 10, 4], + "iscrowd": 1, + }) + return annotation + + def COCO_dataset_generate(self, path): + img_dir = osp.join(path, 'images', 'val') + ann_dir = osp.join(path, 'annotations') + os.makedirs(img_dir) + os.makedirs(ann_dir) + + image = np.ones((10, 5, 3), dtype=np.uint8) + image = Image.fromarray(image).convert('RGB') + image.save(osp.join(img_dir, '000000000001.jpg')) + + annotation = self.generate_annotation() + + with open(osp.join(ann_dir, 'instances_val.json'), 'w') as outfile: + json.dump(annotation, outfile) + + def test_can_import(self): + with TestDir() as temp_dir: + self.COCO_dataset_generate(temp_dir.path) + project = Project.import_from(temp_dir.path, 'ms_coco') + dataset = project.make_dataset() + + self.assertListEqual(['val'], sorted(dataset.subsets())) + self.assertEqual(1, len(dataset)) + + item = next(iter(dataset)) + self.assertTrue(item.has_image) + self.assertEqual(np.sum(item.image), np.prod(item.image.shape)) + self.assertEqual(4, len(item.annotations)) + + ann_1 = find(item.annotations, lambda x: x.id == 1) + ann_1_poly = find(item.annotations, lambda x: \ + x.group == ann_1.id and x.type == AnnotationType.polygon) + self.assertFalse(ann_1 is None) + self.assertFalse(ann_1_poly is None) + + ann_2 = find(item.annotations, lambda x: x.id == 2) + ann_2_mask = find(item.annotations, lambda x: \ + x.group == ann_2.id and x.type == AnnotationType.mask) + self.assertFalse(ann_2 is None) + self.assertFalse(ann_2_mask is None) + +class CocoConverterTest(TestCase): + def _test_save_and_load(self, source_dataset, converter, test_dir, + importer_params=None, target_dataset=None): + converter(source_dataset, test_dir.path) + + if not importer_params: + importer_params = {} + project = Project.import_from(test_dir.path, 'ms_coco', + **importer_params) + parsed_dataset = project.make_dataset() + + if target_dataset is not None: + source_dataset = target_dataset + source_subsets = [s if s else DEFAULT_SUBSET_NAME + for s in source_dataset.subsets()] + self.assertListEqual( + sorted(source_subsets), + sorted(parsed_dataset.subsets()), + ) + + self.assertEqual(len(source_dataset), len(parsed_dataset)) + + for item_a in source_dataset: + item_b = find(parsed_dataset, lambda x: x.id == item_a.id) + self.assertFalse(item_b is None) + self.assertEqual(len(item_a.annotations), len(item_b.annotations)) + for ann_a in item_a.annotations: + ann_b = find(item_b.annotations, lambda x: \ + x.id == ann_a.id and \ + x.type == ann_a.type and x.group == ann_a.group) + self.assertEqual(ann_a, ann_b, 'id: ' + str(ann_a.id)) + + def test_can_save_and_load_captions(self): + class TestExtractor(Extractor): + def __iter__(self): + items = [ + DatasetItem(id=0, subset='train', + annotations=[ + CaptionObject('hello', id=1), + CaptionObject('world', id=2), + ]), + DatasetItem(id=1, subset='train', + annotations=[ + CaptionObject('test', id=3), + ]), + + DatasetItem(id=2, subset='val', + annotations=[ + CaptionObject('word', id=1), + ] + ), + ] + return iter(items) + + def subsets(self): + return ['train', 'val'] + + with TestDir() as test_dir: + self._test_save_and_load(TestExtractor(), + CocoCaptionsConverter(), test_dir) + + def test_can_save_and_load_instances(self): + class TestExtractor(Extractor): + def __iter__(self): + items = [ + DatasetItem(id=0, subset='train', image=np.ones((4, 4, 3)), + annotations=[ + # Bbox + single polygon + BboxObject(0, 1, 2, 3, label=2, group=1, id=1, + attributes={ 'is_crowd': False }), + PolygonObject([0, 1, 2, 1, 2, 3, 0, 3], + attributes={ 'is_crowd': False }, + label=2, group=1, id=1), + ]), + DatasetItem(id=1, subset='train', + annotations=[ + # Mask + bbox + MaskObject(np.array([[0, 0, 0, 0], [1, 0, 1, 0], + [1, 1, 0, 0], [0, 0, 1, 0]], + dtype=np.bool), + attributes={ 'is_crowd': True }, + label=4, group=3, id=3), + BboxObject(0, 1, 3, 3, label=4, group=3, id=3, + attributes={ 'is_crowd': True }), + ]), + + DatasetItem(id=3, subset='val', + annotations=[ + # Bbox + mask + BboxObject(0, 1, 3, 2, label=4, group=3, id=3, + attributes={ 'is_crowd': True }), + MaskObject(np.array([[0, 0, 0, 0], [1, 0, 1, 0], + [1, 1, 0, 0], [0, 0, 0, 0]], + dtype=np.bool), + attributes={ 'is_crowd': True }, + label=4, group=3, id=3), + ]), + ] + return iter(items) + + def subsets(self): + return ['train', 'val'] + + def categories(self): + label_categories = LabelCategories() + for i in range(10): + label_categories.add(str(i)) + return { + AnnotationType.label: label_categories, + } + + with TestDir() as test_dir: + self._test_save_and_load(TestExtractor(), + CocoInstancesConverter(), test_dir) + + def test_can_save_and_load_instances_with_mask_conversion(self): + class TestExtractor(Extractor): + def __iter__(self): + items = [ + DatasetItem(id=0, image=np.zeros((5, 5, 3)), subset='train', + annotations=[ + BboxObject(0, 0, 5, 5, label=3, id=4, group=4, + attributes={ 'is_crowd': False }), + PolygonObject([0, 0, 4, 0, 4, 4], + label=3, id=4, group=4, + attributes={ 'is_crowd': False }), + MaskObject(np.array([ + [0, 1, 1, 1, 0], + [0, 0, 1, 1, 0], + [0, 0, 0, 1, 0], + [0, 0, 0, 0, 0], + [0, 0, 0, 0, 0]], + # only internal fragment (without the border), + # but not everywhere... + dtype=np.bool), + attributes={ 'is_crowd': False }, + label=3, id=4, group=4), + ] + ), + ] + return iter(items) + + def subsets(self): + return ['train'] + + def categories(self): + label_categories = LabelCategories() + for i in range(10): + label_categories.add(str(i)) + return { + AnnotationType.label: label_categories, + } + + with TestDir() as test_dir: + self._test_save_and_load(TestExtractor(), + CocoInstancesConverter(), test_dir, + {'merge_instance_polygons': True}) + + def test_can_merge_instance_polygons_to_mask_in_coverter(self): + label_categories = LabelCategories() + for i in range(10): + label_categories.add(str(i)) + + class SrcTestExtractor(Extractor): + def __iter__(self): + items = [ + DatasetItem(id=0, image=np.zeros((5, 10, 3)), + annotations=[ + PolygonObject([0, 0, 4, 0, 4, 4], + label=3, id=4, group=4, + attributes={ 'is_crowd': False }), + PolygonObject([5, 0, 9, 0, 5, 5], + label=3, id=4, group=4, + attributes={ 'is_crowd': False }), + ] + ), + ] + return iter(items) + + def categories(self): + return { AnnotationType.label: label_categories } + + class DstTestExtractor(Extractor): + def __iter__(self): + items = [ + DatasetItem(id=0, image=np.zeros((5, 10, 3)), + annotations=[ + BboxObject(1, 0, 8, 4, label=3, id=4, group=4, + attributes={ 'is_crowd': True }), + MaskObject(np.array([ + [0, 1, 1, 1, 0, 1, 1, 1, 1, 0], + [0, 0, 1, 1, 0, 1, 1, 1, 0, 0], + [0, 0, 0, 1, 0, 1, 1, 0, 0, 0], + [0, 0, 0, 0, 0, 1, 0, 0, 0, 0], + [0, 0, 0, 0, 0, 0, 0, 0, 0, 0]], + # only internal fragment (without the border), + # but not everywhere... + dtype=np.bool), + attributes={ 'is_crowd': True }, + label=3, id=4, group=4), + ] + ), + ] + return iter(items) + + def categories(self): + return { AnnotationType.label: label_categories } + + with TestDir() as test_dir: + self._test_save_and_load(SrcTestExtractor(), + CocoInstancesConverter(merge_polygons=True), test_dir, + target_dataset=DstTestExtractor()) + + def test_can_save_and_load_images(self): + class TestExtractor(Extractor): + def __iter__(self): + items = [ + DatasetItem(id=0, subset='train'), + DatasetItem(id=1, subset='train'), + + DatasetItem(id=2, subset='val'), + DatasetItem(id=3, subset='val'), + DatasetItem(id=4, subset='val'), + + DatasetItem(id=5, subset='test'), + ] + return iter(items) + + def subsets(self): + return ['train', 'val', 'test'] + + with TestDir() as test_dir: + self._test_save_and_load(TestExtractor(), + CocoImageInfoConverter(), test_dir) + + def test_can_save_and_load_labels(self): + class TestExtractor(Extractor): + def __iter__(self): + items = [ + DatasetItem(id=0, subset='train', + annotations=[ + LabelObject(4, id=1), + LabelObject(9, id=2), + ]), + DatasetItem(id=1, subset='train', + annotations=[ + LabelObject(4, id=4), + ]), + + DatasetItem(id=2, subset='val', + annotations=[ + LabelObject(2, id=1), + ]), + ] + return iter(items) + + def subsets(self): + return ['train', 'val'] + + def categories(self): + label_categories = LabelCategories() + for i in range(10): + label_categories.add(str(i)) + return { + AnnotationType.label: label_categories, + } + + with TestDir() as test_dir: + self._test_save_and_load(TestExtractor(), + CocoLabelsConverter(), test_dir) + + def test_can_save_and_load_keypoints(self): + class TestExtractor(Extractor): + def __iter__(self): + items = [ + DatasetItem(id=0, subset='train', + annotations=[ + PointsObject([1, 2, 0, 2, 4, 1], [0, 1, 2], + label=3, group=1, id=1), + BboxObject(1, 2, 3, 4, label=3, group=1), + PointsObject([5, 6, 0, 7], group=2, id=2), + BboxObject(1, 2, 3, 4, group=2), + ]), + DatasetItem(id=1, subset='train', + annotations=[ + PointsObject([1, 2, 0, 2, 4, 1], label=5, + group=3, id=3), + BboxObject(1, 2, 3, 4, label=5, group=3), + ]), + + DatasetItem(id=2, subset='val', + annotations=[ + PointsObject([0, 2, 0, 2, 4, 1], label=2, + group=3, id=3), + BboxObject(0, 2, 4, 4, label=2, group=3), + ]), + ] + return iter(items) + + def subsets(self): + return ['train', 'val'] + + def categories(self): + label_categories = LabelCategories() + points_categories = PointsCategories() + for i in range(10): + label_categories.add(str(i)) + points_categories.add(i, []) + + return { + AnnotationType.label: label_categories, + AnnotationType.points: points_categories, + } + + with TestDir() as test_dir: + self._test_save_and_load(TestExtractor(), + CocoPersonKeypointsConverter(), test_dir) + + def test_can_save_dataset_with_no_subsets(self): + class TestExtractor(Extractor): + def __iter__(self): + items = [ + DatasetItem(id=1, annotations=[ + LabelObject(2, id=1), + ]), + + DatasetItem(id=2, image=np.zeros((5, 5, 3)), annotations=[ + LabelObject(3, id=3), + BboxObject(0, 0, 5, 5, label=3, id=4, group=4, + attributes={ 'is_crowd': False }), + PolygonObject([0, 0, 4, 0, 4, 4], label=3, id=4, group=4, + attributes={ 'is_crowd': False }), + ]), + ] + + for item in items: + yield item + + def categories(self): + label_cat = LabelCategories() + for label in range(10): + label_cat.add('label_' + str(label)) + return { + AnnotationType.label: label_cat, + } + + with TestDir() as test_dir: + self._test_save_and_load(TestExtractor(), + CocoConverter(), test_dir) \ No newline at end of file diff --git a/datumaro/tests/test_command_targets.py b/datumaro/tests/test_command_targets.py new file mode 100644 index 000000000000..d029b92397a8 --- /dev/null +++ b/datumaro/tests/test_command_targets.py @@ -0,0 +1,131 @@ +import cv2 +import numpy as np +import os.path as osp + +from unittest import TestCase + +from datumaro.components.project import Project +from datumaro.util.command_targets import ProjectTarget, \ + ImageTarget, SourceTarget +from datumaro.util.test_utils import current_function_name, TestDir + + +class CommandTargetsTest(TestCase): + def test_image_false_when_no_file(self): + path = '%s.jpg' % current_function_name() + target = ImageTarget() + + status = target.test(path) + + self.assertFalse(status) + + def test_image_false_when_false(self): + with TestDir() as test_dir: + path = osp.join(test_dir.path, 'test.jpg') + with open(path, 'w+') as f: + f.write('qwerty123') + + target = ImageTarget() + + status = target.test(path) + + self.assertFalse(status) + + def test_image_true_when_true(self): + with TestDir() as test_dir: + path = osp.join(test_dir.path, 'test.jpg') + image = np.random.random_sample([10, 10, 3]) + cv2.imwrite(path, image) + + target = ImageTarget() + + status = target.test(path) + + self.assertTrue(status) + + def test_project_false_when_no_file(self): + path = '%s.jpg' % current_function_name() + target = ProjectTarget() + + status = target.test(path) + + self.assertFalse(status) + + def test_project_false_when_no_name(self): + target = ProjectTarget(project=Project()) + + status = target.test('') + + self.assertFalse(status) + + def test_project_true_when_project_file(self): + with TestDir() as test_dir: + path = osp.join(test_dir.path, 'test.jpg') + Project().save(path) + + target = ProjectTarget() + + status = target.test(path) + + self.assertTrue(status) + + def test_project_true_when_project_name(self): + project_name = 'qwerty' + project = Project({ + 'project_name': project_name + }) + target = ProjectTarget(project=project) + + status = target.test(project_name) + + self.assertTrue(status) + + def test_project_false_when_not_project_name(self): + project_name = 'qwerty' + project = Project({ + 'project_name': project_name + }) + target = ProjectTarget(project=project) + + status = target.test(project_name + '123') + + self.assertFalse(status) + + def test_project_true_when_not_project_file(self): + with TestDir() as test_dir: + path = osp.join(test_dir.path, 'test.jpg') + with open(path, 'w+') as f: + f.write('wqererw') + + target = ProjectTarget() + + status = target.test(path) + + self.assertFalse(status) + + def test_source_false_when_no_project(self): + target = SourceTarget() + + status = target.test('qwerty123') + + self.assertFalse(status) + + def test_source_true_when_source_exists(self): + source_name = 'qwerty' + project = Project() + project.add_source(source_name) + target = SourceTarget(project=project) + + status = target.test(source_name) + + self.assertTrue(status) + + def test_source_false_when_source_doesnt_exist(self): + source_name = 'qwerty' + project = Project() + project.add_source(source_name) + target = SourceTarget(project=project) + + status = target.test(source_name + '123') + + self.assertFalse(status) \ No newline at end of file diff --git a/datumaro/tests/test_datumaro_format.py b/datumaro/tests/test_datumaro_format.py new file mode 100644 index 000000000000..3402ccba22f3 --- /dev/null +++ b/datumaro/tests/test_datumaro_format.py @@ -0,0 +1,100 @@ +from itertools import zip_longest +import numpy as np + +from unittest import TestCase + +from datumaro.components.project import Project +from datumaro.components.extractor import (Extractor, DatasetItem, + AnnotationType, LabelObject, MaskObject, PointsObject, PolygonObject, + PolyLineObject, BboxObject, CaptionObject, + LabelCategories, MaskCategories, PointsCategories +) +from datumaro.components.converters.datumaro import DatumaroConverter +from datumaro.util.test_utils import TestDir +from datumaro.util.mask_tools import generate_colormap + + +class DatumaroConverterTest(TestCase): + class TestExtractor(Extractor): + def __iter__(self): + items = [ + DatasetItem(id=100, subset='train', image=np.ones((10, 6, 3)), + annotations=[ + CaptionObject('hello', id=1), + CaptionObject('world', id=2, group=5), + LabelObject(2, id=3, attributes={ + 'x': 1, + 'y': '2', + }), + BboxObject(1, 2, 3, 4, label=4, id=4, attributes={ + 'score': 10.0, + }), + BboxObject(5, 6, 7, 8, id=5, group=5), + PointsObject([1, 2, 2, 0, 1, 1], label=0, id=5), + MaskObject(label=3, id=5, image=np.ones((2, 3))), + ]), + DatasetItem(id=21, subset='train', + annotations=[ + CaptionObject('test'), + LabelObject(2), + BboxObject(1, 2, 3, 4, 5, id=42, group=42) + ]), + + DatasetItem(id=2, subset='val', + annotations=[ + PolyLineObject([1, 2, 3, 4, 5, 6, 7, 8], id=11), + PolygonObject([1, 2, 3, 4, 5, 6, 7, 8], id=12), + ]), + + DatasetItem(id=42, subset='test'), + ] + return iter(items) + + def subsets(self): + return ['train', 'val', 'test'] + + def categories(self): + label_categories = LabelCategories() + for i in range(5): + label_categories.add('cat' + str(i)) + + mask_categories = MaskCategories( + generate_colormap(len(label_categories.items))) + + points_categories = PointsCategories() + for index, _ in enumerate(label_categories.items): + points_categories.add(index, ['cat1', 'cat2'], adjacent=[0, 1]) + + return { + AnnotationType.label: label_categories, + AnnotationType.mask: mask_categories, + AnnotationType.points: points_categories, + } + + def test_can_save_and_load(self): + with TestDir() as test_dir: + source_dataset = self.TestExtractor() + + converter = DatumaroConverter(save_images=True) + converter(source_dataset, test_dir.path) + + project = Project.import_from(test_dir.path, 'datumaro') + parsed_dataset = project.make_dataset() + + self.assertListEqual( + sorted(source_dataset.subsets()), + sorted(parsed_dataset.subsets()), + ) + + self.assertEqual(len(source_dataset), len(parsed_dataset)) + + for subset_name in source_dataset.subsets(): + source_subset = source_dataset.get_subset(subset_name) + parsed_subset = parsed_dataset.get_subset(subset_name) + for idx, (item_a, item_b) in enumerate( + zip_longest(source_subset, parsed_subset)): + self.assertEqual(item_a, item_b, str(idx)) + + self.assertEqual( + source_dataset.categories(), + parsed_dataset.categories()) \ No newline at end of file diff --git a/datumaro/tests/test_diff.py b/datumaro/tests/test_diff.py new file mode 100644 index 000000000000..5f0655f1228f --- /dev/null +++ b/datumaro/tests/test_diff.py @@ -0,0 +1,142 @@ +from unittest import TestCase + +from datumaro.components.extractor import DatasetItem, LabelObject, BboxObject +from datumaro.components.comparator import Comparator + + +class DiffTest(TestCase): + def test_no_bbox_diff_with_same_item(self): + detections = 3 + anns = [ + BboxObject(i * 10, 10, 10, 10, label=i, + attributes={'score': (1.0 + i) / detections}) \ + for i in range(detections) + ] + item = DatasetItem(id=0, annotations=anns) + + iou_thresh = 0.5 + conf_thresh = 0.5 + comp = Comparator( + iou_threshold=iou_thresh, conf_threshold=conf_thresh) + + result = comp.compare_item_bboxes(item, item) + + matches, mispred, a_greater, b_greater = result + self.assertEqual(0, len(mispred)) + self.assertEqual(0, len(a_greater)) + self.assertEqual(0, len(b_greater)) + self.assertEqual(len([it for it in item.annotations \ + if conf_thresh < it.attributes['score']]), + len(matches)) + for a_bbox, b_bbox in matches: + self.assertLess(iou_thresh, a_bbox.iou(b_bbox)) + self.assertEqual(a_bbox.label, b_bbox.label) + self.assertLess(conf_thresh, a_bbox.attributes['score']) + self.assertLess(conf_thresh, b_bbox.attributes['score']) + + def test_can_find_bbox_with_wrong_label(self): + detections = 3 + class_count = 2 + item1 = DatasetItem(id=1, annotations=[ + BboxObject(i * 10, 10, 10, 10, label=i, + attributes={'score': (1.0 + i) / detections}) \ + for i in range(detections) + ]) + item2 = DatasetItem(id=2, annotations=[ + BboxObject(i * 10, 10, 10, 10, label=(i + 1) % class_count, + attributes={'score': (1.0 + i) / detections}) \ + for i in range(detections) + ]) + + iou_thresh = 0.5 + conf_thresh = 0.5 + comp = Comparator( + iou_threshold=iou_thresh, conf_threshold=conf_thresh) + + result = comp.compare_item_bboxes(item1, item2) + + matches, mispred, a_greater, b_greater = result + self.assertEqual(len([it for it in item1.annotations \ + if conf_thresh < it.attributes['score']]), + len(mispred)) + self.assertEqual(0, len(a_greater)) + self.assertEqual(0, len(b_greater)) + self.assertEqual(0, len(matches)) + for a_bbox, b_bbox in mispred: + self.assertLess(iou_thresh, a_bbox.iou(b_bbox)) + self.assertEqual((a_bbox.label + 1) % class_count, b_bbox.label) + self.assertLess(conf_thresh, a_bbox.attributes['score']) + self.assertLess(conf_thresh, b_bbox.attributes['score']) + + def test_can_find_missing_boxes(self): + detections = 3 + class_count = 2 + item1 = DatasetItem(id=1, annotations=[ + BboxObject(i * 10, 10, 10, 10, label=i, + attributes={'score': (1.0 + i) / detections}) \ + for i in range(detections) if i % 2 == 0 + ]) + item2 = DatasetItem(id=2, annotations=[ + BboxObject(i * 10, 10, 10, 10, label=(i + 1) % class_count, + attributes={'score': (1.0 + i) / detections}) \ + for i in range(detections) if i % 2 == 1 + ]) + + iou_thresh = 0.5 + conf_thresh = 0.5 + comp = Comparator( + iou_threshold=iou_thresh, conf_threshold=conf_thresh) + + result = comp.compare_item_bboxes(item1, item2) + + matches, mispred, a_greater, b_greater = result + self.assertEqual(0, len(mispred)) + self.assertEqual(len([it for it in item1.annotations \ + if conf_thresh < it.attributes['score']]), + len(a_greater)) + self.assertEqual(len([it for it in item2.annotations \ + if conf_thresh < it.attributes['score']]), + len(b_greater)) + self.assertEqual(0, len(matches)) + + def test_no_label_diff_with_same_item(self): + detections = 3 + anns = [ + LabelObject(i, attributes={'score': (1.0 + i) / detections}) \ + for i in range(detections) + ] + item = DatasetItem(id=1, annotations=anns) + + conf_thresh = 0.5 + comp = Comparator(conf_threshold=conf_thresh) + + result = comp.compare_item_labels(item, item) + + matches, a_greater, b_greater = result + self.assertEqual(0, len(a_greater)) + self.assertEqual(0, len(b_greater)) + self.assertEqual(len([it for it in item.annotations \ + if conf_thresh < it.attributes['score']]), + len(matches)) + + def test_can_find_wrong_label(self): + item1 = DatasetItem(id=1, annotations=[ + LabelObject(0), + LabelObject(1), + LabelObject(2), + ]) + item2 = DatasetItem(id=2, annotations=[ + LabelObject(2), + LabelObject(3), + LabelObject(4), + ]) + + conf_thresh = 0.5 + comp = Comparator(conf_threshold=conf_thresh) + + result = comp.compare_item_labels(item1, item2) + + matches, a_greater, b_greater = result + self.assertEqual(2, len(a_greater)) + self.assertEqual(2, len(b_greater)) + self.assertEqual(1, len(matches)) \ No newline at end of file diff --git a/datumaro/tests/test_image.py b/datumaro/tests/test_image.py new file mode 100644 index 000000000000..424fd9c88dd1 --- /dev/null +++ b/datumaro/tests/test_image.py @@ -0,0 +1,52 @@ +from itertools import product +import numpy as np +import os.path as osp + +from unittest import TestCase + +import datumaro.util.image as image_module +from datumaro.util.test_utils import TestDir + + +class ImageTest(TestCase): + def setUp(self): + self.default_backend = image_module._IMAGE_BACKEND + + def tearDown(self): + image_module._IMAGE_BACKEND = self.default_backend + + def test_save_and_load_backends(self): + backends = image_module._IMAGE_BACKENDS + for save_backend, load_backend, c in product(backends, backends, [1, 3]): + with TestDir() as test_dir: + if c == 1: + src_image = np.random.randint(0, 255 + 1, (2, 4)) + else: + src_image = np.random.randint(0, 255 + 1, (2, 4, c)) + path = osp.join(test_dir.path, 'img.png') # lossless + + image_module._IMAGE_BACKEND = save_backend + image_module.save_image(path, src_image) + + image_module._IMAGE_BACKEND = load_backend + dst_image = image_module.load_image(path) + + self.assertTrue(np.all(src_image == dst_image), + 'save: %s, load: %s' % (save_backend, load_backend)) + + def test_encode_and_decode_backends(self): + backends = image_module._IMAGE_BACKENDS + for save_backend, load_backend, c in product(backends, backends, [1, 3]): + if c == 1: + src_image = np.random.randint(0, 255 + 1, (2, 4)) + else: + src_image = np.random.randint(0, 255 + 1, (2, 4, c)) + + image_module._IMAGE_BACKEND = save_backend + buffer = image_module.encode_image(src_image, '.png') # lossless + + image_module._IMAGE_BACKEND = load_backend + dst_image = image_module.decode_image(buffer) + + self.assertTrue(np.all(src_image == dst_image), + 'save: %s, load: %s' % (save_backend, load_backend)) \ No newline at end of file diff --git a/datumaro/tests/test_images.py b/datumaro/tests/test_images.py new file mode 100644 index 000000000000..8c05d61404e8 --- /dev/null +++ b/datumaro/tests/test_images.py @@ -0,0 +1,49 @@ +import numpy as np +import os.path as osp +from PIL import Image + +from unittest import TestCase + +from datumaro.util.test_utils import TestDir +from datumaro.util.image import lazy_image +from datumaro.util.image_cache import ImageCache + + +class LazyImageTest(TestCase): + def test_cache_works(self): + with TestDir() as test_dir: + image = np.ones((100, 100, 3), dtype=np.uint8) + image = Image.fromarray(image).convert('RGB') + + image_path = osp.join(test_dir.path, 'image.jpg') + image.save(image_path) + + caching_loader = lazy_image(image_path, cache=None) + self.assertTrue(caching_loader() is caching_loader()) + + non_caching_loader = lazy_image(image_path, cache=False) + self.assertFalse(non_caching_loader() is non_caching_loader()) + +class ImageCacheTest(TestCase): + def test_cache_fifo_displacement(self): + capacity = 2 + cache = ImageCache(capacity) + + loaders = [lazy_image(None, loader=lambda p: object(), cache=cache) + for _ in range(capacity + 1)] + + first_request = [loader() for loader in loaders[1 : ]] + loaders[0]() # pop something from the cache + + second_request = [loader() for loader in loaders[2 : ]] + second_request.insert(0, loaders[1]()) + + matches = sum([a is b for a, b in zip(first_request, second_request)]) + self.assertEqual(matches, len(first_request) - 1) + + def test_global_cache_is_accessible(self): + loader = lazy_image(None, loader=lambda p: object()) + + ImageCache.get_instance().clear() + self.assertTrue(loader() is loader()) + self.assertEqual(ImageCache.get_instance().size(), 1) \ No newline at end of file diff --git a/datumaro/tests/test_project.py b/datumaro/tests/test_project.py new file mode 100644 index 000000000000..1d9df96f14ab --- /dev/null +++ b/datumaro/tests/test_project.py @@ -0,0 +1,450 @@ +import os +import os.path as osp + +from unittest import TestCase + +from datumaro.components.project import Project, Environment +from datumaro.components.project import Source, Model +from datumaro.components.launcher import Launcher, InferenceWrapper +from datumaro.components.converter import Converter +from datumaro.components.extractor import Extractor, DatasetItem, LabelObject +from datumaro.components.config import Config, DefaultConfig, SchemaBuilder +from datumaro.components.dataset_filter import XPathDatasetFilter +from datumaro.util.test_utils import TestDir + + +class ProjectTest(TestCase): + def test_project_generate(self): + src_config = Config({ + 'project_name': 'test_project', + 'format_version': 1, + }) + + with TestDir() as test_dir: + project_path = test_dir.path + Project.generate(project_path, src_config) + + self.assertTrue(osp.isdir(project_path)) + + result_config = Project.load(project_path).config + self.assertEqual( + src_config.project_name, result_config.project_name) + self.assertEqual( + src_config.format_version, result_config.format_version) + + @staticmethod + def test_default_ctor_is_ok(): + Project() + + @staticmethod + def test_empty_config_is_ok(): + Project(Config()) + + def test_add_source(self): + source_name = 'source' + origin = Source({ + 'url': 'path', + 'format': 'ext' + }) + project = Project() + + project.add_source(source_name, origin) + + added = project.get_source(source_name) + self.assertIsNotNone(added) + self.assertEqual(added, origin) + + def test_added_source_can_be_saved(self): + source_name = 'source' + origin = Source({ + 'url': 'path', + }) + project = Project() + project.add_source(source_name, origin) + + saved = project.config + + self.assertEqual(origin, saved.sources[source_name]) + + def test_added_source_can_be_dumped(self): + source_name = 'source' + origin = Source({ + 'url': 'path', + }) + project = Project() + project.add_source(source_name, origin) + + with TestDir() as test_dir: + project.save(test_dir.path) + + loaded = Project.load(test_dir.path) + loaded = loaded.get_source(source_name) + self.assertEqual(origin, loaded) + + def test_can_import_with_custom_importer(self): + class TestImporter: + def __call__(self, path, subset=None): + return Project({ + 'project_filename': path, + 'subsets': [ subset ] + }) + + path = 'path' + importer_name = 'test_importer' + + env = Environment() + env.importers.register(importer_name, TestImporter) + + project = Project.import_from(path, importer_name, env, + subset='train') + + self.assertEqual(path, project.config.project_filename) + self.assertListEqual(['train'], project.config.subsets) + + def test_can_dump_added_model(self): + model_name = 'model' + + project = Project() + saved = Model({ 'launcher': 'name' }) + project.add_model(model_name, saved) + + with TestDir() as test_dir: + project.save(test_dir.path) + + loaded = Project.load(test_dir.path) + loaded = loaded.get_model(model_name) + self.assertEqual(saved, loaded) + + def test_can_have_project_source(self): + with TestDir() as test_dir: + Project.generate(test_dir.path) + + project2 = Project() + project2.add_source('project1', { + 'url': test_dir.path, + }) + dataset = project2.make_dataset() + + self.assertTrue('project1' in dataset.sources) + + def test_can_batch_launch_custom_model(self): + class TestExtractor(Extractor): + def __init__(self, url, n=0): + super().__init__(length=n) + self.n = n + + def __iter__(self): + for i in range(self.n): + yield DatasetItem(id=i, subset='train', image=i) + + def subsets(self): + return ['train'] + + class TestLauncher(Launcher): + def __init__(self, **kwargs): + pass + + def launch(self, inputs): + for i, inp in enumerate(inputs): + yield [ LabelObject(attributes={'idx': i, 'data': inp}) ] + + model_name = 'model' + launcher_name = 'custom_launcher' + + project = Project() + project.env.launchers.register(launcher_name, TestLauncher) + project.add_model(model_name, { 'launcher': launcher_name }) + model = project.make_executable_model(model_name) + extractor = TestExtractor('', n=5) + + batch_size = 3 + executor = InferenceWrapper(extractor, model, batch_size=batch_size) + + for item in executor: + self.assertEqual(1, len(item.annotations)) + self.assertEqual(int(item.id) % batch_size, + item.annotations[0].attributes['idx']) + self.assertEqual(int(item.id), + item.annotations[0].attributes['data']) + + def test_can_do_transform_with_custom_model(self): + class TestExtractorSrc(Extractor): + def __init__(self, url, n=2): + super().__init__(length=n) + self.n = n + + def __iter__(self): + for i in range(self.n): + yield DatasetItem(id=i, subset='train', image=i, + annotations=[ LabelObject(i) ]) + + def subsets(self): + return ['train'] + + class TestLauncher(Launcher): + def __init__(self, **kwargs): + pass + + def launch(self, inputs): + for inp in inputs: + yield [ LabelObject(inp) ] + + class TestConverter(Converter): + def __call__(self, extractor, save_dir): + for item in extractor: + with open(osp.join(save_dir, '%s.txt' % item.id), 'w+') as f: + f.write(str(item.subset) + '\n') + f.write(str(item.annotations[0].label) + '\n') + + class TestExtractorDst(Extractor): + def __init__(self, url): + super().__init__() + self.items = [osp.join(url, p) for p in sorted(os.listdir(url))] + + def __iter__(self): + for path in self.items: + with open(path, 'r') as f: + index = osp.splitext(osp.basename(path))[0] + subset = f.readline()[:-1] + label = int(f.readline()[:-1]) + assert(subset == 'train') + yield DatasetItem(id=index, subset=subset, + annotations=[ LabelObject(label) ]) + + def __len__(self): + return len(self.items) + + def subsets(self): + return ['train'] + + + model_name = 'model' + launcher_name = 'custom_launcher' + extractor_name = 'custom_extractor' + + project = Project() + project.env.launchers.register(launcher_name, TestLauncher) + project.env.extractors.register(extractor_name, TestExtractorSrc) + project.env.converters.register(extractor_name, TestConverter) + project.add_model(model_name, { 'launcher': launcher_name }) + project.add_source('source', { 'format': extractor_name }) + + with TestDir() as test_dir: + project.make_dataset().transform(model_name, test_dir.path) + + result = Project.load(test_dir.path) + result.env.extractors.register(extractor_name, TestExtractorDst) + it = iter(result.make_dataset()) + item1 = next(it) + item2 = next(it) + self.assertEqual(0, item1.annotations[0].label) + self.assertEqual(1, item2.annotations[0].label) + + def test_source_datasets_can_be_merged(self): + class TestExtractor(Extractor): + def __init__(self, url, n=0, s=0): + super().__init__(length=n) + self.n = n + self.s = s + + def __iter__(self): + for i in range(self.n): + yield DatasetItem(id=self.s + i, subset='train') + + def subsets(self): + return ['train'] + + e_name1 = 'e1' + e_name2 = 'e2' + n1 = 2 + n2 = 4 + + project = Project() + project.env.extractors.register(e_name1, lambda p: TestExtractor(p, n=n1)) + project.env.extractors.register(e_name2, lambda p: TestExtractor(p, n=n2, s=n1)) + project.add_source('source1', { 'format': e_name1 }) + project.add_source('source2', { 'format': e_name2 }) + + dataset = project.make_dataset() + + self.assertEqual(n1 + n2, len(dataset)) + + def test_project_filter_can_be_applied(self): + class TestExtractor(Extractor): + def __init__(self, url, n=10): + super().__init__(length=n) + self.n = n + + def __iter__(self): + for i in range(self.n): + yield DatasetItem(id=i, subset='train') + + def subsets(self): + return ['train'] + + e_type = 'type' + project = Project() + project.env.extractors.register(e_type, TestExtractor) + project.add_source('source', { 'format': e_type }) + project.set_filter('/item[id < 5]') + + dataset = project.make_dataset() + + self.assertEqual(5, len(dataset)) + + def test_project_own_dataset_can_be_modified(self): + project = Project() + dataset = project.make_dataset() + + item = DatasetItem(id=1) + dataset.put(item) + + self.assertEqual(item, next(iter(dataset))) + + def test_project_compound_child_can_be_modified_recursively(self): + with TestDir() as test_dir: + child1 = Project({ + 'project_dir': osp.join(test_dir.path, 'child1'), + }) + child1.save() + + child2 = Project({ + 'project_dir': osp.join(test_dir.path, 'child2'), + }) + child2.save() + + parent = Project() + parent.add_source('child1', { + 'url': child1.config.project_dir + }) + parent.add_source('child2', { + 'url': child2.config.project_dir + }) + dataset = parent.make_dataset() + + item1 = DatasetItem(id='ch1', path=['child1']) + item2 = DatasetItem(id='ch2', path=['child2']) + dataset.put(item1) + dataset.put(item2) + + self.assertEqual(2, len(dataset)) + self.assertEqual(1, len(dataset.sources['child1'])) + self.assertEqual(1, len(dataset.sources['child2'])) + + def test_project_can_merge_item_annotations(self): + class TestExtractor(Extractor): + def __init__(self, url, v=None): + super().__init__() + self.v = v + + def __iter__(self): + v1_item = DatasetItem(id=1, subset='train', annotations=[ + LabelObject(2, id=3), + LabelObject(3, attributes={ 'x': 1 }), + ]) + + v2_item = DatasetItem(id=1, subset='train', annotations=[ + LabelObject(3, attributes={ 'x': 1 }), + LabelObject(4, id=4), + ]) + + if self.v == 1: + yield v1_item + else: + yield v2_item + + def subsets(self): + return ['train'] + + project = Project() + project.env.extractors.register('t1', lambda p: TestExtractor(p, v=1)) + project.env.extractors.register('t2', lambda p: TestExtractor(p, v=2)) + project.add_source('source1', { 'format': 't1' }) + project.add_source('source2', { 'format': 't2' }) + + merged = project.make_dataset() + + self.assertEqual(1, len(merged)) + + item = next(iter(merged)) + self.assertEqual(3, len(item.annotations)) + +class DatasetFilterTest(TestCase): + class TestExtractor(Extractor): + def __init__(self, url, n=0): + super().__init__(length=n) + self.n = n + + def __iter__(self): + for i in range(self.n): + yield DatasetItem(id=i, subset='train') + + def subsets(self): + return ['train'] + + def test_xpathfilter_can_be_applied(self): + extractor = self.TestExtractor('', n=4) + dataset_filter = XPathDatasetFilter('/item[id > 1]') + + filtered = extractor.select(dataset_filter) + + self.assertEqual(2, len(filtered)) + +class ConfigTest(TestCase): + def test_can_produce_multilayer_config_from_dict(self): + schema_low = SchemaBuilder() \ + .add('options', dict) \ + .build() + schema_mid = SchemaBuilder() \ + .add('desc', lambda: Config(schema=schema_low)) \ + .build() + schema_top = SchemaBuilder() \ + .add('container', lambda: DefaultConfig( + lambda v: Config(v, schema=schema_mid))) \ + .build() + + value = 1 + source = Config({ + 'container': { + 'elem': { + 'desc': { + 'options': { + 'k': value + } + } + } + } + }, schema=schema_top) + + self.assertEqual(value, source.container['elem'].desc.options['k']) + +class ExtractorTest(TestCase): + def test_custom_extractor_can_be_created(self): + class CustomExtractor(Extractor): + def __init__(self, url): + super().__init__() + + def __iter__(self): + return iter([ + DatasetItem(id=0, subset='train'), + DatasetItem(id=1, subset='train'), + DatasetItem(id=2, subset='train'), + + DatasetItem(id=3, subset='test'), + ]) + + def subsets(self): + return ['train', 'test'] + + extractor_name = 'ext1' + project = Project() + project.env.extractors.register(extractor_name, CustomExtractor) + project.add_source('src1', { + 'url': 'path', + 'format': extractor_name, + }) + project.set_subsets(['train']) + + dataset = project.make_dataset() + + self.assertEqual(3, len(dataset)) diff --git a/datumaro/tests/test_tfrecord_format.py b/datumaro/tests/test_tfrecord_format.py new file mode 100644 index 000000000000..8511dc14e9aa --- /dev/null +++ b/datumaro/tests/test_tfrecord_format.py @@ -0,0 +1,151 @@ +import numpy as np + +from unittest import TestCase + +from datumaro.components.project import Project +from datumaro.components.extractor import (Extractor, DatasetItem, + AnnotationType, BboxObject, LabelCategories +) +from datumaro.components.extractors.tfrecord import ( + DetectionApiExtractor, +) +from datumaro.components.converters.tfrecord import ( + DetectionApiConverter, +) +from datumaro.util import find +from datumaro.util.test_utils import TestDir + + +class TfrecordConverterTest(TestCase): + def _test_can_save_and_load(self, source_dataset, converter, test_dir, + importer_params=None): + converter(source_dataset, test_dir.path) + + if not importer_params: + importer_params = {} + project = Project.import_from(test_dir.path, 'tf_detection_api', + **importer_params) + parsed_dataset = project.make_dataset() + + self.assertListEqual( + sorted(source_dataset.subsets()), + sorted(parsed_dataset.subsets()), + ) + + self.assertEqual(len(source_dataset), len(parsed_dataset)) + + for item_a in source_dataset: + item_b = find(parsed_dataset, lambda x: x.id == item_a.id) + self.assertFalse(item_b is None) + self.assertEqual(len(item_a.annotations), len(item_b.annotations)) + for ann_a in item_a.annotations: + ann_b = find(item_b.annotations, lambda x: \ + x.id == ann_a.id and \ + x.type == ann_a.type and x.group == ann_a.group) + self.assertEqual(ann_a, ann_b, 'id: ' + str(ann_a.id)) + + def test_can_save_bboxes(self): + class TestExtractor(Extractor): + def __iter__(self): + items = [ + DatasetItem(id=1, subset='train', + image=np.ones((16, 16, 3)), + annotations=[ + BboxObject(0, 4, 4, 8, label=2, id=0), + BboxObject(0, 4, 4, 4, label=3, id=1), + BboxObject(2, 4, 4, 4, id=2), + ] + ), + + DatasetItem(id=2, subset='val', + image=np.ones((8, 8, 3)), + annotations=[ + BboxObject(1, 2, 4, 2, label=3, id=0), + ] + ), + + DatasetItem(id=3, subset='test', + image=np.ones((5, 4, 3)) * 3, + ), + ] + + for item in items: + yield item + + def categories(self): + label_cat = LabelCategories() + for label in range(10): + label_cat.add('label_' + str(label)) + return { + AnnotationType.label: label_cat, + } + + with TestDir() as test_dir: + self._test_can_save_and_load( + TestExtractor(), DetectionApiConverter(save_images=True), + test_dir) + + def test_can_save_dataset_with_no_subsets(self): + class TestExtractor(Extractor): + def __iter__(self): + items = [ + DatasetItem(id=1, + image=np.ones((16, 16, 3)), + annotations=[ + BboxObject(2, 1, 4, 4, label=2, id=0), + BboxObject(4, 2, 8, 4, label=3, id=1), + ] + ), + + DatasetItem(id=2, + image=np.ones((8, 8, 3)) * 2, + annotations=[ + BboxObject(4, 4, 4, 4, label=3, id=0), + ] + ), + + DatasetItem(id=3, + image=np.ones((8, 4, 3)) * 3, + ), + ] + + for item in items: + yield item + + def categories(self): + label_cat = LabelCategories() + for label in range(10): + label_cat.add('label_' + str(label)) + return { + AnnotationType.label: label_cat, + } + + with TestDir() as test_dir: + self._test_can_save_and_load( + TestExtractor(), DetectionApiConverter(), test_dir) + + def test_labelmap_parsing(self): + text = """ + { + id: 4 + name: 'qw1' + } + { + id: 5 name: 'qw2' + } + + { + name: 'qw3' + id: 6 + } + {name:'qw4' id:7} + """ + expected = { + 'qw1': 4, + 'qw2': 5, + 'qw3': 6, + 'qw4': 7, + } + parsed = DetectionApiExtractor._parse_labelmap(text) + + self.assertEqual(expected, parsed) diff --git a/datumaro/tests/test_voc_format.py b/datumaro/tests/test_voc_format.py new file mode 100644 index 000000000000..fac5c27e37ef --- /dev/null +++ b/datumaro/tests/test_voc_format.py @@ -0,0 +1,489 @@ +import cv2 +from itertools import zip_longest +import numpy as np +import os +import os.path as osp +from xml.etree import ElementTree as ET +import shutil + +from unittest import TestCase + +from datumaro.components.extractor import (Extractor, DatasetItem, + AnnotationType, BboxObject, LabelCategories, +) +import datumaro.components.formats.voc as VOC +from datumaro.components.extractors.voc import ( + VocClassificationExtractor, + VocDetectionExtractor, + VocSegmentationExtractor, + VocLayoutExtractor, + VocActionExtractor, +) +from datumaro.components.converters.voc import ( + VocConverter, + VocClassificationConverter, + VocDetectionConverter, + VocLayoutConverter, + VocActionConverter, + VocSegmentationConverter, +) +from datumaro.components.importers.voc import VocImporter +from datumaro.util import find +from datumaro.util.test_utils import TestDir + + +class VocTest(TestCase): + def test_colormap_generator(self): + reference = np.array([ + [ 0, 0, 0], + [128, 0, 0], + [ 0, 128, 0], + [128, 128, 0], + [ 0, 0, 128], + [128, 0, 128], + [ 0, 128, 128], + [128, 128, 128], + [ 64, 0, 0], + [192, 0, 0], + [ 64, 128, 0], + [192, 128, 0], + [ 64, 0, 128], + [192, 0, 128], + [ 64, 128, 128], + [192, 128, 128], + [ 0, 64, 0], + [128, 64, 0], + [ 0, 192, 0], + [128, 192, 0], + [ 0, 64, 128], + [224, 224, 192], # ignored + ]) + + self.assertTrue(np.array_equal(reference, list(VOC.VocColormap.values()))) + +def get_label(extractor, label_id): + return extractor.categories()[AnnotationType.label].items[label_id].name + +def generate_dummy_voc(path): + cls_subsets_dir = osp.join(path, 'ImageSets', 'Main') + action_subsets_dir = osp.join(path, 'ImageSets', 'Action') + layout_subsets_dir = osp.join(path, 'ImageSets', 'Layout') + segm_subsets_dir = osp.join(path, 'ImageSets', 'Segmentation') + ann_dir = osp.join(path, 'Annotations') + img_dir = osp.join(path, 'JPEGImages') + segm_dir = osp.join(path, 'SegmentationClass') + inst_dir = osp.join(path, 'SegmentationObject') + + os.makedirs(cls_subsets_dir) + os.makedirs(ann_dir) + os.makedirs(img_dir) + os.makedirs(segm_dir) + os.makedirs(inst_dir) + + subsets = { + 'train': ['2007_000001'], + 'test': ['2007_000002'], + } + + # Subsets + for subset_name, subset in subsets.items(): + for item in subset: + with open(osp.join(cls_subsets_dir, subset_name + '.txt'), 'w') as f: + for item in subset: + f.write('%s\n' % item) + shutil.copytree(cls_subsets_dir, action_subsets_dir) + shutil.copytree(cls_subsets_dir, layout_subsets_dir) + shutil.copytree(cls_subsets_dir, segm_subsets_dir) + + # Classification + subset_name = 'train' + subset = subsets[subset_name] + for label in VOC.VocLabel: + with open(osp.join(cls_subsets_dir, '%s_%s.txt' % \ + (label.name, subset_name)), 'w') as f: + for item in subset: + presence = label.value % 2 + f.write('%s %2d\n' % (item, 1 if presence else -1)) + + # Detection + Action + Layout + subset_name = 'train' + subset = subsets[subset_name] + for item in subset: + root_elem = ET.Element('annotation') + ET.SubElement(root_elem, 'folder').text = 'VOC' + item.split('_')[0] + ET.SubElement(root_elem, 'filename').text = item + '.jpg' + + size_elem = ET.SubElement(root_elem, 'size') + ET.SubElement(size_elem, 'width').text = '10' + ET.SubElement(size_elem, 'height').text = '20' + ET.SubElement(size_elem, 'depth').text = '3' + + ET.SubElement(root_elem, 'segmented').text = '1' + + obj1_elem = ET.SubElement(root_elem, 'object') + ET.SubElement(obj1_elem, 'name').text = VOC.VocLabel(1).name + ET.SubElement(obj1_elem, 'pose').text = VOC.VocPose(1).name + ET.SubElement(obj1_elem, 'truncated').text = '1' + ET.SubElement(obj1_elem, 'difficult').text = '0' + obj1bb_elem = ET.SubElement(obj1_elem, 'bndbox') + ET.SubElement(obj1bb_elem, 'xmin').text = '1' + ET.SubElement(obj1bb_elem, 'ymin').text = '2' + ET.SubElement(obj1bb_elem, 'xmax').text = '3' + ET.SubElement(obj1bb_elem, 'ymax').text = '4' + + obj2_elem = ET.SubElement(root_elem, 'object') + ET.SubElement(obj2_elem, 'name').text = VOC.VocLabel.person.name + obj2bb_elem = ET.SubElement(obj2_elem, 'bndbox') + ET.SubElement(obj2bb_elem, 'xmin').text = '4' + ET.SubElement(obj2bb_elem, 'ymin').text = '5' + ET.SubElement(obj2bb_elem, 'xmax').text = '6' + ET.SubElement(obj2bb_elem, 'ymax').text = '7' + obj2head_elem = ET.SubElement(obj2_elem, 'part') + ET.SubElement(obj2head_elem, 'name').text = VOC.VocBodyPart(1).name + obj2headbb_elem = ET.SubElement(obj2head_elem, 'bndbox') + ET.SubElement(obj2headbb_elem, 'xmin').text = '5' + ET.SubElement(obj2headbb_elem, 'ymin').text = '6' + ET.SubElement(obj2headbb_elem, 'xmax').text = '7' + ET.SubElement(obj2headbb_elem, 'ymax').text = '8' + obj2act_elem = ET.SubElement(obj2_elem, 'actions') + for act in VOC.VocAction: + ET.SubElement(obj2act_elem, act.name).text = '%s' % (act.value % 2) + + with open(osp.join(ann_dir, item + '.xml'), 'w') as f: + f.write(ET.tostring(root_elem, encoding='unicode')) + + # Segmentation + Instances + subset_name = 'train' + subset = subsets[subset_name] + for item in subset: + cv2.imwrite(osp.join(segm_dir, item + '.png'), + np.ones([10, 20, 3]) * VOC.VocColormap[2]) + cv2.imwrite(osp.join(inst_dir, item + '.png'), + np.ones([10, 20, 3]) * VOC.VocColormap[2]) + + # Test images + subset_name = 'test' + subset = subsets[subset_name] + for item in subset: + cv2.imwrite(osp.join(img_dir, item + '.jpg'), + np.ones([10, 20, 3])) + + return subsets + +class VocExtractorTest(TestCase): + def test_can_load_voc_cls(self): + with TestDir() as test_dir: + generated_subsets = generate_dummy_voc(test_dir.path) + + extractor = VocClassificationExtractor(test_dir.path) + + self.assertEqual(len(generated_subsets), len(extractor.subsets())) + + subset_name = 'train' + generated_subset = generated_subsets[subset_name] + for id_ in generated_subset: + parsed_subset = extractor.get_subset(subset_name) + self.assertEqual(len(generated_subset), len(parsed_subset)) + + item = find(parsed_subset, lambda x: x.id == id_) + self.assertFalse(item is None) + + count = 0 + for label in VOC.VocLabel: + if label.value % 2 == 1: + count += 1 + ann = find(item.annotations, + lambda x: x.type == AnnotationType.label and \ + get_label(extractor, x.label) == label.name) + self.assertFalse(ann is None) + self.assertEqual(count, len(item.annotations)) + + subset_name = 'test' + generated_subset = generated_subsets[subset_name] + for id_ in generated_subset: + parsed_subset = extractor.get_subset(subset_name) + self.assertEqual(len(generated_subset), len(parsed_subset)) + + item = find(parsed_subset, lambda x: x.id == id_) + self.assertFalse(item is None) + + self.assertEqual(0, len(item.annotations)) + + def test_can_load_voc_det(self): + with TestDir() as test_dir: + generated_subsets = generate_dummy_voc(test_dir.path) + + extractor = VocDetectionExtractor(test_dir.path) + + self.assertEqual(len(generated_subsets), len(extractor.subsets())) + + subset_name = 'train' + generated_subset = generated_subsets[subset_name] + for id_ in generated_subset: + parsed_subset = extractor.get_subset(subset_name) + self.assertEqual(len(generated_subset), len(parsed_subset)) + + item = find(parsed_subset, lambda x: x.id == id_) + self.assertFalse(item is None) + + obj1 = find(item.annotations, + lambda x: x.type == AnnotationType.bbox and \ + get_label(extractor, x.label) == VOC.VocLabel(1).name) + self.assertFalse(obj1 is None) + self.assertListEqual([1, 2, 2, 2], obj1.get_bbox()) + self.assertDictEqual( + { + 'pose': VOC.VocPose(1).name, + 'truncated': True, + 'difficult': False, + }, + obj1.attributes) + + obj2 = find(item.annotations, + lambda x: x.type == AnnotationType.bbox and \ + get_label(extractor, x.label) == VOC.VocLabel.person.name) + self.assertFalse(obj2 is None) + self.assertListEqual([4, 5, 2, 2], obj2.get_bbox()) + + self.assertEqual(2, len(item.annotations)) + + subset_name = 'test' + generated_subset = generated_subsets[subset_name] + for id_ in generated_subset: + parsed_subset = extractor.get_subset(subset_name) + self.assertEqual(len(generated_subset), len(parsed_subset)) + + item = find(parsed_subset, lambda x: x.id == id_) + self.assertFalse(item is None) + + self.assertEqual(0, len(item.annotations)) + + def test_can_load_voc_segm(self): + with TestDir() as test_dir: + generated_subsets = generate_dummy_voc(test_dir.path) + + extractor = VocSegmentationExtractor(test_dir.path) + + self.assertEqual(len(generated_subsets), len(extractor.subsets())) + + subset_name = 'train' + generated_subset = generated_subsets[subset_name] + for id_ in generated_subset: + parsed_subset = extractor.get_subset(subset_name) + self.assertEqual(len(generated_subset), len(parsed_subset)) + + item = find(parsed_subset, lambda x: x.id == id_) + self.assertFalse(item is None) + + cls_mask = find(item.annotations, + lambda x: x.type == AnnotationType.mask and \ + x.attributes.get('class') == True) + self.assertFalse(cls_mask is None) + self.assertFalse(cls_mask.image is None) + + inst_mask = find(item.annotations, + lambda x: x.type == AnnotationType.mask and \ + x.attributes.get('instances') == True) + self.assertFalse(inst_mask is None) + self.assertFalse(inst_mask.image is None) + + self.assertEqual(2, len(item.annotations)) + + subset_name = 'test' + generated_subset = generated_subsets[subset_name] + for id_ in generated_subset: + parsed_subset = extractor.get_subset(subset_name) + self.assertEqual(len(generated_subset), len(parsed_subset)) + + item = find(parsed_subset, lambda x: x.id == id_) + self.assertFalse(item is None) + + self.assertEqual(0, len(item.annotations)) + + def test_can_load_voc_layout(self): + with TestDir() as test_dir: + generated_subsets = generate_dummy_voc(test_dir.path) + + extractor = VocLayoutExtractor(test_dir.path) + + self.assertEqual(len(generated_subsets), len(extractor.subsets())) + + subset_name = 'train' + generated_subset = generated_subsets[subset_name] + for id_ in generated_subset: + parsed_subset = extractor.get_subset(subset_name) + self.assertEqual(len(generated_subset), len(parsed_subset)) + + item = find(parsed_subset, lambda x: x.id == id_) + self.assertFalse(item is None) + + obj2 = find(item.annotations, + lambda x: x.type == AnnotationType.bbox and \ + get_label(extractor, x.label) == VOC.VocLabel.person.name) + self.assertFalse(obj2 is None) + self.assertListEqual([4, 5, 2, 2], obj2.get_bbox()) + + obj2head = find(item.annotations, + lambda x: x.type == AnnotationType.bbox and \ + get_label(extractor, x.label) == VOC.VocBodyPart(1).name) + self.assertTrue(obj2.id == obj2head.group) + self.assertListEqual([5, 6, 2, 2], obj2head.get_bbox()) + + self.assertEqual(2, len(item.annotations)) + + subset_name = 'test' + generated_subset = generated_subsets[subset_name] + for id_ in generated_subset: + parsed_subset = extractor.get_subset(subset_name) + self.assertEqual(len(generated_subset), len(parsed_subset)) + + item = find(parsed_subset, lambda x: x.id == id_) + self.assertFalse(item is None) + + self.assertEqual(0, len(item.annotations)) + + def test_can_load_voc_action(self): + with TestDir() as test_dir: + generated_subsets = generate_dummy_voc(test_dir.path) + + extractor = VocActionExtractor(test_dir.path) + + self.assertEqual(len(generated_subsets), len(extractor.subsets())) + + subset_name = 'train' + generated_subset = generated_subsets[subset_name] + for id_ in generated_subset: + parsed_subset = extractor.get_subset(subset_name) + self.assertEqual(len(generated_subset), len(parsed_subset)) + + item = find(parsed_subset, lambda x: x.id == id_) + self.assertFalse(item is None) + + obj2 = find(item.annotations, + lambda x: x.type == AnnotationType.bbox and \ + get_label(extractor, x.label) == VOC.VocLabel.person.name) + self.assertFalse(obj2 is None) + self.assertListEqual([4, 5, 2, 2], obj2.get_bbox()) + + count = 1 + for action in VOC.VocAction: + if action.value % 2 == 1: + count += 1 + ann = find(item.annotations, + lambda x: x.type == AnnotationType.label and \ + get_label(extractor, x.label) == action.name) + self.assertFalse(ann is None) + self.assertTrue(obj2.id == ann.group) + self.assertEqual(count, len(item.annotations)) + + subset_name = 'test' + generated_subset = generated_subsets[subset_name] + for id_ in generated_subset: + parsed_subset = extractor.get_subset(subset_name) + self.assertEqual(len(generated_subset), len(parsed_subset)) + + item = find(parsed_subset, lambda x: x.id == id_) + self.assertFalse(item is None) + + self.assertEqual(0, len(item.annotations)) + +class VocConverterTest(TestCase): + def _test_can_save_voc(self, extractor_type, converter_type, test_dir): + dummy_dir = osp.join(test_dir, 'dummy') + generate_dummy_voc(dummy_dir) + gen_extractor = extractor_type(dummy_dir) + + conv_dir = osp.join(test_dir, 'converted') + converter = converter_type() + converter(gen_extractor, conv_dir) + + conv_extractor = extractor_type(conv_dir) + for item_a, item_b in zip_longest(gen_extractor, conv_extractor): + self.assertEqual(item_a.id, item_b.id) + self.assertEqual(len(item_a.annotations), len(item_b.annotations)) + for ann_a, ann_b in zip(item_a.annotations, item_b.annotations): + self.assertEqual(ann_a.type, ann_b.type) + + def test_can_save_voc_cls(self): + with TestDir() as test_dir: + self._test_can_save_voc( + VocClassificationExtractor, VocClassificationConverter, + test_dir.path) + + def test_can_save_voc_det(self): + with TestDir() as test_dir: + self._test_can_save_voc( + VocDetectionExtractor, VocDetectionConverter, + test_dir.path) + + def test_can_save_voc_segm(self): + with TestDir() as test_dir: + self._test_can_save_voc( + VocSegmentationExtractor, VocSegmentationConverter, + test_dir.path) + + def test_can_save_voc_layout(self): + with TestDir() as test_dir: + self._test_can_save_voc( + VocLayoutExtractor, VocLayoutConverter, + test_dir.path) + + def test_can_save_voc_action(self): + with TestDir() as test_dir: + self._test_can_save_voc( + VocActionExtractor, VocActionConverter, + test_dir.path) + + def test_can_save_dataset_with_no_subsets(self): + class TestExtractor(Extractor): + def __iter__(self): + items = [ + DatasetItem(id=1, annotations=[ + BboxObject(2, 3, 4, 5, label=2, id=1), + BboxObject(2, 3, 4, 5, label=3, id=2), + ]), + + DatasetItem(id=2, annotations=[ + BboxObject(5, 4, 6, 5, label=3, id=1), + ]), + ] + + for item in items: + yield item + + def categories(self): + label_cat = LabelCategories() + for label in VOC.VocLabel: + label_cat.add(label.name) + return { + AnnotationType.label: label_cat, + } + + with TestDir() as test_dir: + src_extractor = TestExtractor() + converter = VocConverter() + + converter(src_extractor, test_dir.path) + + dst_extractor = VocImporter()(test_dir.path).make_dataset() + + self.assertEqual(len(src_extractor), len(dst_extractor)) + for item_a, item_b in zip_longest(src_extractor, dst_extractor): + self.assertEqual(item_a.id, item_b.id) + self.assertEqual(len(item_a.annotations), len(item_b.annotations)) + for ann_a, ann_b in zip(item_a.annotations, item_b.annotations): + self.assertEqual(ann_a.type, ann_b.type) + +class VocImporterTest(TestCase): + def test_can_import(self): + with TestDir() as test_dir: + dummy_dir = osp.join(test_dir.path, 'dummy') + subsets = generate_dummy_voc(dummy_dir) + + dataset = VocImporter()(dummy_dir).make_dataset() + + self.assertEqual(len(VOC.VocTask), len(dataset.sources)) + self.assertEqual(set(subsets), set(dataset.subsets())) + self.assertEqual( + sum([len(s) for _, s in subsets.items()]), + len(dataset)) \ No newline at end of file diff --git a/datumaro/tests/test_yolo_format.py b/datumaro/tests/test_yolo_format.py new file mode 100644 index 000000000000..364c91a04b54 --- /dev/null +++ b/datumaro/tests/test_yolo_format.py @@ -0,0 +1,69 @@ +import numpy as np + +from unittest import TestCase + +from datumaro.components.extractor import (Extractor, DatasetItem, + AnnotationType, BboxObject, LabelCategories, +) +from datumaro.components.importers.yolo import YoloImporter +from datumaro.components.converters.yolo import YoloConverter +from datumaro.util.test_utils import TestDir + + +class YoloFormatTest(TestCase): + def test_can_save_and_load(self): + class TestExtractor(Extractor): + def __iter__(self): + items = [ + DatasetItem(id=1, subset='train', image=np.ones((8, 8, 3)), + annotations=[ + BboxObject(0, 2, 4, 2, label=2), + BboxObject(0, 1, 2, 3, label=4), + ]), + DatasetItem(id=2, subset='train', image=np.ones((10, 10, 3)), + annotations=[ + BboxObject(0, 2, 4, 2, label=2), + BboxObject(3, 3, 2, 3, label=4), + BboxObject(2, 1, 2, 3, label=4), + ]), + + DatasetItem(id=3, subset='valid', image=np.ones((8, 8, 3)), + annotations=[ + BboxObject(0, 1, 5, 2, label=2), + BboxObject(0, 2, 3, 2, label=5), + BboxObject(0, 2, 4, 2, label=6), + BboxObject(0, 7, 3, 2, label=7), + ]), + ] + return iter(items) + + def categories(self): + label_categories = LabelCategories() + for i in range(10): + label_categories.add('label_' + str(i)) + return { + AnnotationType.label: label_categories, + } + + with TestDir() as test_dir: + source_dataset = TestExtractor() + + YoloConverter(save_images=True)(source_dataset, test_dir.path) + parsed_dataset = YoloImporter()(test_dir.path).make_dataset() + + self.assertListEqual( + sorted(source_dataset.subsets()), + sorted(parsed_dataset.subsets()), + ) + self.assertEqual(len(source_dataset), len(parsed_dataset)) + for subset_name in source_dataset.subsets(): + source_subset = source_dataset.get_subset(subset_name) + parsed_subset = parsed_dataset.get_subset(subset_name) + for item_a, item_b in zip(source_subset, parsed_subset): + self.assertEqual(len(item_a.annotations), len(item_b.annotations)) + for ann_a, ann_b in zip(item_a.annotations, item_b.annotations): + self.assertEqual(ann_a.type, ann_b.type) + self.assertAlmostEqual(ann_a.x, ann_b.x) + self.assertAlmostEqual(ann_a.y, ann_b.y) + self.assertAlmostEqual(ann_a.w, ann_b.w) + self.assertAlmostEqual(ann_a.h, ann_b.h) \ No newline at end of file diff --git a/docker-compose.yml b/docker-compose.yml index 82dfa352e5a0..4a5864755852 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -8,7 +8,7 @@ version: "2.3" services: cvat_db: container_name: cvat_db - image: postgres:10.3-alpine + image: postgres:10-alpine networks: default: aliases: @@ -22,7 +22,7 @@ services: cvat_redis: container_name: cvat_redis - image: redis:4.0.5-alpine + image: redis:4.0-alpine networks: default: aliases: @@ -54,8 +54,11 @@ services: OPENVINO_TOOLKIT: "no" environment: DJANGO_MODWSGI_EXTRA_ARGS: "" + UI_SCHEME: http + UI_HOST: localhost UI_PORT: 7080 + volumes: - cvat_data:/home/django/data - cvat_keys:/home/django/keys @@ -73,11 +76,11 @@ services: https_proxy: no_proxy: socks_proxy: + REACT_APP_API_PROTOCOL: http + REACT_APP_API_HOST: localhost + REACT_APP_API_PORT: 8080 dockerfile: Dockerfile.ui - environment: - REACT_APP_API_PROTOCOL: http - REACT_APP_API_HOST: localhost - REACT_APP_API_PORT: 8080 + networks: default: aliases: diff --git a/supervisord.conf b/supervisord.conf index 554ae6fa7fb7..d5e222d2a99b 100644 --- a/supervisord.conf +++ b/supervisord.conf @@ -41,6 +41,12 @@ command=%(ENV_HOME)s/wait-for-it.sh redis:6379 -t 0 -- bash -ic \ environment=SSH_AUTH_SOCK="/tmp/ssh-agent.sock" numprocs=1 +[program:rqscheduler] +command=%(ENV_HOME)s/wait-for-it.sh redis:6379 -t 0 -- bash -ic \ + "/usr/bin/python3 /usr/local/bin/rqscheduler --host redis -i 30" +environment=SSH_AUTH_SOCK="/tmp/ssh-agent.sock" +numprocs=1 + [program:runserver] ; Here need to run a couple of commands to initialize DB and copy static files. ; We cannot initialize DB on build because the DB should be online. Also some diff --git a/utils/auto_annotation/README.md b/utils/auto_annotation/README.md index e4dbd6641546..b2aff7bf9fbd 100644 --- a/utils/auto_annotation/README.md +++ b/utils/auto_annotation/README.md @@ -37,8 +37,21 @@ $ python cvat/utils/auto_annotation/run_model.py --py /path/to/python/interp.py --show-images ``` +If you'd like to see the labels printed on the image, use the `--show-labels` flag + +```shell +$ python cvat/utils/auto_annotation/run_model.py --py /path/to/python/interp.py \ + --xml /path/to/xml/file.xml \ + --bin /path/to/bin/file.bin \ + --json /path/to/json/mapping/mapping.json \ + --image-files /path/to/img.jpg /path2/to/img2.png /path/to/img3.jpg \ + --show-images \ + --show-labels +``` + There's a command that let's you scan quickly by setting the length of time (in milliseconds) to display each image. Use the `--show-image-delay` flag and set the appropriate time. +In this example, 2000 milliseconds is 2 seconds for each image. ```shell # Display each image in a window for 2 seconds diff --git a/utils/auto_annotation/run_model.py b/utils/auto_annotation/run_model.py index d791eb092955..33cd5453f5c8 100644 --- a/utils/auto_annotation/run_model.py +++ b/utils/auto_annotation/run_model.py @@ -29,6 +29,7 @@ def _get_kwargs(): parser.add_argument('--show-images', action='store_true', help='Show the results of the annotation in a window') parser.add_argument('--show-image-delay', default=0, type=int, help='Displays the images for a set duration in milliseconds, default is until a key is pressed') parser.add_argument('--serialize', default=False, action='store_true', help='Try to serialize the result') + parser.add_argument('--show-labels', action='store_true', help='Show the labels on the window') return vars(parser.parse_args()) @@ -45,6 +46,16 @@ def pairwise(iterable): result.append((iterable[i], iterable[i+1])) return np.array(result, dtype=np.int32) +def find_min_y(array): + min_ = sys.maxsize + index = None + for i, pair in enumerate(array): + if pair[1] < min_: + min_ = pair[1] + index = i + + return array[index] + def main(): kwargs = _get_kwargs() @@ -104,34 +115,8 @@ def main(): py_file, restricted=restricted) - if kwargs['serialize']: - os.environ['DJANGO_SETTINGS_MODULE'] = 'cvat.settings.production' - import django - django.setup() - - from cvat.apps.engine.serializers import LabeledDataSerializer - # NOTE: We're actually using `run_inference_engine_annotation` - # incorrectly here. The `mapping` dict is supposed to be a mapping - # of integers -> integers and represents the transition from model - # integers to the labels in the database. We're using a mapping of - # integers -> strings. For testing purposes, this shortcut is fine. - # We just want to make sure everything works. Until, that is.... - # we want to test using the label serializer. Then we have to transition - # back to integers, otherwise the serializer complains about have a string - # where an integer is expected. We'll just brute force that. - - for shape in results['shapes']: - # Change the english label to an integer for serialization validation - shape['label_id'] = 1 - - serializer = LabeledDataSerializer(data=results) - - if not serializer.is_valid(): - logging.critical('Data unable to be serialized correctly!') - serializer.is_valid(raise_exception=True) - - logging.warning('Program didn\'t have any errors.') + logging.warning('Inference didn\'t have any errors.') show_images = kwargs.get('show_images', False) if show_images: @@ -146,23 +131,64 @@ def main(): return show_image_delay = kwargs['show_image_delay'] + show_labels = kwargs.get('show_labels') + for index, data in enumerate(image_data): for detection in results['shapes']: if not detection['frame'] == index: continue points = detection['points'] + label_str = detection['label_id'] + # Cv2 doesn't like floats for drawing points = [int(p) for p in points] color = random_color() + if detection['type'] == 'rectangle': cv2.rectangle(data, (points[0], points[1]), (points[2], points[3]), color, 3) + + if show_labels: + cv2.putText(data, label_str, (points[0], points[1] - 7), cv2.FONT_HERSHEY_COMPLEX, 0.6, color, 1) + elif detection['type'] in ('polygon', 'polyline'): # polylines is picky about datatypes points = pairwise(points) cv2.polylines(data, [points], 1, color) + + if show_labels: + min_point = find_min_y(points) + cv2.putText(data, label_str, (min_point[0], min_point[1] - 7), cv2.FONT_HERSHEY_COMPLEX, 0.6, color, 1) + cv2.imshow(str(index), data) cv2.waitKey(show_image_delay) cv2.destroyWindow(str(index)) + if kwargs['serialize']: + os.environ['DJANGO_SETTINGS_MODULE'] = 'cvat.settings.production' + import django + django.setup() + + from cvat.apps.engine.serializers import LabeledDataSerializer + + # NOTE: We're actually using `run_inference_engine_annotation` + # incorrectly here. The `mapping` dict is supposed to be a mapping + # of integers -> integers and represents the transition from model + # integers to the labels in the database. We're using a mapping of + # integers -> strings. For testing purposes, this shortcut is fine. + # We just want to make sure everything works. Until, that is.... + # we want to test using the label serializer. Then we have to transition + # back to integers, otherwise the serializer complains about have a string + # where an integer is expected. We'll just brute force that. + + for shape in results['shapes']: + # Change the english label to an integer for serialization validation + shape['label_id'] = 1 + + serializer = LabeledDataSerializer(data=results) + + if not serializer.is_valid(): + logging.critical('Data unable to be serialized correctly!') + serializer.is_valid(raise_exception=True) + if __name__ == '__main__': main() diff --git a/utils/cli/cli.py b/utils/cli/cli.py index 96b6881fdf8a..f22bf81520c2 100755 --- a/utils/cli/cli.py +++ b/utils/cli/cli.py @@ -23,7 +23,8 @@ def main(): 'delete': CLI.tasks_delete, 'ls': CLI.tasks_list, 'frames': CLI.tasks_frame, - 'dump': CLI.tasks_dump} + 'dump': CLI.tasks_dump, + 'upload': CLI.tasks_upload} args = parser.parse_args() config_log(args.loglevel) with requests.Session() as session: diff --git a/utils/cli/core/core.py b/utils/cli/core/core.py index c1f1ad5fa58f..e0d2383d65b4 100644 --- a/utils/cli/core/core.py +++ b/utils/cli/core/core.py @@ -113,6 +113,22 @@ def tasks_dump(self, task_id, fileformat, filename, **kwargs): with open(filename, 'wb') as fp: fp.write(response.content) + def tasks_upload(self, task_id, fileformat, filename, **kwargs): + """ Upload annotations for a task in the specified format + (e.g. 'YOLO ZIP 1.0').""" + url = self.api.tasks_id_annotations_format(task_id, fileformat) + while True: + response = self.session.put( + url, + files={'annotation_file':open(filename, 'rb')} + ) + response.raise_for_status() + if response.status_code == 201: + break + + log.info('Upload job for Task ID {} \ + with annotation file {} finished'.format(task_id, filename)) + class CVAT_API_V1(): """ Build parameterized API URLs """ @@ -136,6 +152,10 @@ def tasks_id_data(self, task_id): def tasks_id_frame_id(self, task_id, frame_id): return self.tasks_id(task_id) + '/data?type=frame&number={}&quality=compressed'.format(frame_id) + def tasks_id_annotations_format(self, task_id, fileformat): + return self.tasks_id(task_id) + '/annotations?format={}' \ + .format(fileformat) + def tasks_id_annotations_filename(self, task_id, name, fileformat): return self.tasks_id(task_id) + '/annotations/{}?format={}' \ .format(name, fileformat) diff --git a/utils/cli/core/definition.py b/utils/cli/core/definition.py index c9e32e256d6d..e3d1a6222d59 100644 --- a/utils/cli/core/definition.py +++ b/utils/cli/core/definition.py @@ -208,3 +208,29 @@ def argparse(s): default='CVAT XML 1.1 for images', help='annotation format (default: %(default)s)' ) + +####################################################################### +# Upload Annotations +####################################################################### + +upload_parser = task_subparser.add_parser( + 'upload', + description='Upload annotations for a CVAT task.' +) +upload_parser.add_argument( + 'task_id', + type=int, + help='task ID' +) +upload_parser.add_argument( + 'filename', + type=str, + help='upload file' +) +upload_parser.add_argument( + '--format', + dest='fileformat', + type=str, + default='CVAT XML 1.1', + help='annotation format (default: %(default)s)' +) diff --git a/utils/open_model_zoo/Retail/object_detection/text/pixel_link_mobilenet_v2/0004/mappings.json b/utils/open_model_zoo/Retail/object_detection/text/pixel_link_mobilenet_v2/0004/mappings.json new file mode 100644 index 000000000000..f6a0aa87964b --- /dev/null +++ b/utils/open_model_zoo/Retail/object_detection/text/pixel_link_mobilenet_v2/0004/mappings.json @@ -0,0 +1,5 @@ +{ + "label_map": { + "1": "text" + } +} diff --git a/utils/open_model_zoo/Retail/object_detection/text/pixel_link_mobilenet_v2/0004/pixel_link_mobilenet_v2.py b/utils/open_model_zoo/Retail/object_detection/text/pixel_link_mobilenet_v2/0004/pixel_link_mobilenet_v2.py new file mode 100644 index 000000000000..b0f105ec5a12 --- /dev/null +++ b/utils/open_model_zoo/Retail/object_detection/text/pixel_link_mobilenet_v2/0004/pixel_link_mobilenet_v2.py @@ -0,0 +1,197 @@ +# SPDX-License-Identifier: MIT` + +import cv2 +import numpy as np + + +class PixelLinkDecoder(): + def __init__(self): + four_neighbours = False + if four_neighbours: + self._get_neighbours = self._get_neighbours_4 + else: + self._get_neighbours = self._get_neighbours_8 + self.pixel_conf_threshold = 0.8 + self.link_conf_threshold = 0.8 + + def decode(self, height, width, detections: dict): + self.image_height = height + self.image_width = width + self.pixel_scores = self._set_pixel_scores(detections['model/segm_logits/add']) + self.link_scores = self._set_link_scores(detections['model/link_logits_/add']) + + self.pixel_mask = self.pixel_scores >= self.pixel_conf_threshold + self.link_mask = self.link_scores >= self.link_conf_threshold + self.points = list(zip(*np.where(self.pixel_mask))) + self.h, self.w = np.shape(self.pixel_mask) + self.group_mask = dict.fromkeys(self.points, -1) + self.bboxes = None + self.root_map = None + self.mask = None + + self._decode() + + def _softmax(self, x, axis=None): + return np.exp(x - self._logsumexp(x, axis=axis, keepdims=True)) + + # pylint: disable=no-self-use + def _logsumexp(self, a, axis=None, b=None, keepdims=False, return_sign=False): + if b is not None: + a, b = np.broadcast_arrays(a, b) + if np.any(b == 0): + a = a + 0. # promote to at least float + a[b == 0] = -np.inf + + a_max = np.amax(a, axis=axis, keepdims=True) + + if a_max.ndim > 0: + a_max[~np.isfinite(a_max)] = 0 + elif not np.isfinite(a_max): + a_max = 0 + + if b is not None: + b = np.asarray(b) + tmp = b * np.exp(a - a_max) + else: + tmp = np.exp(a - a_max) + + # suppress warnings about log of zero + with np.errstate(divide='ignore'): + s = np.sum(tmp, axis=axis, keepdims=keepdims) + if return_sign: + sgn = np.sign(s) + s *= sgn # /= makes more sense but we need zero -> zero + out = np.log(s) + + if not keepdims: + a_max = np.squeeze(a_max, axis=axis) + out += a_max + + if return_sign: + return out, sgn + else: + return out + + def _set_pixel_scores(self, pixel_scores): + "get softmaxed properly shaped pixel scores" + tmp = np.transpose(pixel_scores, (0, 2, 3, 1)) + return self._softmax(tmp, axis=-1)[0, :, :, 1] + + def _set_link_scores(self, link_scores): + "get softmaxed properly shaped links scores" + tmp = np.transpose(link_scores, (0, 2, 3, 1)) + tmp_reshaped = tmp.reshape(tmp.shape[:-1] + (8, 2)) + return self._softmax(tmp_reshaped, axis=-1)[0, :, :, :, 1] + + def _find_root(self, point): + root = point + update_parent = False + tmp = self.group_mask[root] + while tmp is not -1: + root = tmp + tmp = self.group_mask[root] + update_parent = True + if update_parent: + self.group_mask[point] = root + return root + + def _join(self, p1, p2): + root1 = self._find_root(p1) + root2 = self._find_root(p2) + if root1 != root2: + self.group_mask[root2] = root1 + + def _get_index(self, root): + if root not in self.root_map: + self.root_map[root] = len(self.root_map) + 1 + return self.root_map[root] + + def _get_all(self): + self.root_map = {} + self.mask = np.zeros_like(self.pixel_mask, dtype=np.int32) + + for point in self.points: + point_root = self._find_root(point) + bbox_idx = self._get_index(point_root) + self.mask[point] = bbox_idx + + def _get_neighbours_8(self, x, y): + w, h = self.w, self.h + tmp = [(0, x - 1, y - 1), (1, x, y - 1), + (2, x + 1, y - 1), (3, x - 1, y), + (4, x + 1, y), (5, x - 1, y + 1), + (6, x, y + 1), (7, x + 1, y + 1)] + + return [i for i in tmp if i[1] >= 0 and i[1] < w and i[2] >= 0 and i[2] < h] + + def _get_neighbours_4(self, x, y): + w, h = self.w, self.h + tmp = [(1, x, y - 1), + (3, x - 1, y), + (4, x + 1, y), + (6, x, y + 1)] + + return [i for i in tmp if i[1] >= 0 and i[1] < w and i[2] >= 0 and i[2] < h] + + def _mask_to_bboxes(self, min_area=300, min_height=10): + self.bboxes = [] + max_bbox_idx = self.mask.max() + mask_tmp = cv2.resize(self.mask, (self.image_width, self.image_height), interpolation=cv2.INTER_NEAREST) + + for bbox_idx in range(1, max_bbox_idx + 1): + bbox_mask = mask_tmp == bbox_idx + cnts, _ = cv2.findContours(bbox_mask.astype(np.uint8), cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE) + if len(cnts) == 0: + continue + cnt = cnts[0] + rect, w, h = self._min_area_rect(cnt) + if min(w, h) < min_height: + continue + if w * h < min_area: + continue + self.bboxes.append(self._order_points(rect)) + + # pylint: disable=no-self-use + def _min_area_rect(self, cnt): + rect = cv2.minAreaRect(cnt) + w, h = rect[1] + box = cv2.boxPoints(rect) + box = np.int0(box) + return box, w, h + + # pylint: disable=no-self-use + def _order_points(self, rect): + """ (x, y) + Order: TL, TR, BR, BL + """ + tmp = np.zeros_like(rect) + sums = rect.sum(axis=1) + tmp[0] = rect[np.argmin(sums)] + tmp[2] = rect[np.argmax(sums)] + diff = np.diff(rect, axis=1) + tmp[1] = rect[np.argmin(diff)] + tmp[3] = rect[np.argmax(diff)] + return tmp + + def _decode(self): + for point in self.points: + y, x = point + neighbours = self._get_neighbours(x, y) + for n_idx, nx, ny in neighbours: + link_value = self.link_mask[y, x, n_idx] + pixel_cls = self.pixel_mask[ny, nx] + if link_value and pixel_cls: + self._join(point, (ny, nx)) + + self._get_all() + self._mask_to_bboxes() + + +label = 1 +pcd = PixelLinkDecoder() +for detection in detections: + frame = detection['frame_id'] + pcd.decode(detection['frame_height'], detection['frame_width'], detection['detections']) + for box in pcd.bboxes: + box = [[int(b[0]), int(b[1])] for b in box] + results.add_polygon(box, label, frame) diff --git a/utils/open_model_zoo/Retail/object_detection/text/pixel_link_mobilenet_v2/README.md b/utils/open_model_zoo/Retail/object_detection/text/pixel_link_mobilenet_v2/README.md new file mode 100644 index 000000000000..c7bac387865f --- /dev/null +++ b/utils/open_model_zoo/Retail/object_detection/text/pixel_link_mobilenet_v2/README.md @@ -0,0 +1,5 @@ +# Pixel Link + +* Model for the Detecting Scene Text vai Instance Segmentation +* Download using the `intel_model_zoo` using `$./downloader.py text-detection-0002` +* See [this Arxiv](https://arxiv.org/abs/1801.01315) link for the technical details diff --git a/utils/open_model_zoo/Transportation/semantic-segmentation-adas/interp.py b/utils/open_model_zoo/Transportation/semantic-segmentation-adas/interp.py new file mode 100644 index 000000000000..58a87fa35d1b --- /dev/null +++ b/utils/open_model_zoo/Transportation/semantic-segmentation-adas/interp.py @@ -0,0 +1,31 @@ +import numpy as np +from skimage.measure import approximate_polygon, find_contours + +import cv2 + + +for frame_results in detections: + frame_height = frame_results['frame_height'] + frame_width = frame_results['frame_width'] + frame_number = frame_results['frame_id'] + detection = frame_results['detections'] + detection = detection[0, 0, :, :] + width, height = detection.shape + + for i in range(21): + zero = np.zeros((width,height),dtype=np.uint8) + + f = float(i) + zero = ((detection == f) * 255).astype(np.float32) + zero = cv2.resize(zero, dsize=(frame_width, frame_height), interpolation=cv2.INTER_CUBIC) + + contours = find_contours(zero, 0.8) + + for contour in contours: + contour = np.flip(contour, axis=1) + contour = approximate_polygon(contour, tolerance=2.5) + segmentation = contour.tolist() + if len(segmentation) < 3: + continue + + results.add_polygon(segmentation, i, frame_number) diff --git a/utils/open_model_zoo/Transportation/semantic-segmentation-adas/mapping.json b/utils/open_model_zoo/Transportation/semantic-segmentation-adas/mapping.json new file mode 100644 index 000000000000..cbda289d3e2f --- /dev/null +++ b/utils/open_model_zoo/Transportation/semantic-segmentation-adas/mapping.json @@ -0,0 +1,25 @@ +{ + "label_map": { + "0": "road", + "1": "sidewalk", + "2": "building", + "3": "wall", + "4": "fence", + "5": "pole", + "6": "traffic light", + "7": "traffic sign", + "8": "vegetation", + "9": "terrain", + "10": "sky", + "11": "person", + "12": "rider", + "13": "car", + "14": "truck", + "15": "bus", + "16": "train", + "17": "motorcycle", + "18": "bicycle", + "19": "ego-vehicle", + "20": "background" + } +} diff --git a/utils/open_model_zoo/yolov3/interp.py b/utils/open_model_zoo/yolov3/interp.py index 025438535e4e..4c76c85448d0 100644 --- a/utils/open_model_zoo/yolov3/interp.py +++ b/utils/open_model_zoo/yolov3/interp.py @@ -151,4 +151,10 @@ def parse_yolo_region(self, blob: 'np.ndarray', original_shape: list, params: di ymin = obj['ymin'] ymax = obj['ymax'] + # Enforcing extra checks for bounding box coordinates + xmin = max(0,xmin) + ymin = max(0,ymin) + xmax = min(xmax,width) + ymax = min(ymax,height) + results.add_box(xmin, ymin, xmax, ymax, label, frame_number) diff --git a/utils/open_model_zoo/yolov3/mapping.json b/utils/open_model_zoo/yolov3/mapping.json index 15e7420b8d0a..bfb65a24cf0c 100644 --- a/utils/open_model_zoo/yolov3/mapping.json +++ b/utils/open_model_zoo/yolov3/mapping.json @@ -1,84 +1,84 @@ { "label_map": { - "1": "person", - "2": "bicycle", - "3": "car", - "4": "motorbike", - "5": "aeroplane", - "6": "bus", - "7": "train", - "8": "truck", - "9": "boat", - "10": "traffic light", - "11": "fire hydrant", - "12": "stop sign", - "13": "parking meter", - "14": "bench", - "15": "bird", - "16": "cat", - "17": "dog", - "18": "horse", - "19": "sheep", - "20": "cow", - "21": "elephant", - "22": "bear", - "23": "zebra", - "24": "giraffe", - "25": "backpack", - "26": "umbrella", - "27": "handbag", - "28": "tie", - "29": "suitcase", - "30": "frisbee", - "31": "skis", - "32": "snowboard", - "33": "sports ball", - "34": "kite", - "35": "baseball bat", - "36": "baseball glove", - "37": "skateboard", - "38": "surfboard", - "39": "tennis racket", - "40": "bottle", - "41": "wine glass", - "42": "cup", - "43": "fork", - "44": "knife", - "45": "spoon", - "46": "bowl", - "47": "banana", - "48": "apple", - "49": "sandwich", - "50": "orange", - "51": "broccoli", - "52": "carrot", - "53": "hot dog", - "54": "pizza", - "55": "donut", - "56": "cake", - "57": "chair", - "58": "sofa", - "59": "pottedplant", - "60": "bed", - "61": "diningtable", - "62": "toilet", - "63": "tvmonitor", - "64": "laptop", - "65": "mouse", - "66": "remote", - "67": "keyboard", - "68": "cell phone", - "69": "microwave", - "70": "oven", - "71": "toaster", - "72": "sink", - "73": "refrigerator", - "74": "book", - "75": "clock", - "76": "vase", - "77": "scissors", - "78": "teddy bear", - "79": "hair drier", - "80": "toothbrush" + "0": "person", + "1": "bicycle", + "2": "car", + "3": "motorbike", + "4": "aeroplane", + "5": "bus", + "6": "train", + "7": "truck", + "8": "boat", + "9": "traffic light", + "10": "fire hydrant", + "11": "stop sign", + "12": "parking meter", + "13": "bench", + "14": "bird", + "15": "cat", + "16": "dog", + "17": "horse", + "18": "sheep", + "19": "cow", + "20": "elephant", + "21": "bear", + "22": "zebra", + "23": "giraffe", + "24": "backpack", + "25": "umbrella", + "26": "handbag", + "27": "tie", + "28": "suitcase", + "29": "frisbee", + "30": "skis", + "31": "snowboard", + "32": "sports ball", + "33": "kite", + "34": "baseball bat", + "35": "baseball glove", + "36": "skateboard", + "37": "surfboard", + "38": "tennis racket", + "39": "bottle", + "40": "wine glass", + "41": "cup", + "42": "fork", + "43": "knife", + "44": "spoon", + "45": "bowl", + "46": "banana", + "47": "apple", + "48": "sandwich", + "49": "orange", + "50": "broccoli", + "51": "carrot", + "52": "hot dog", + "53": "pizza", + "54": "donut", + "55": "cake", + "56": "chair", + "57": "sofa", + "58": "pottedplant", + "59": "bed", + "60": "diningtable", + "61": "toilet", + "62": "tvmonitor", + "63": "laptop", + "64": "mouse", + "65": "remote", + "66": "keyboard", + "67": "cell phone", + "68": "microwave", + "69": "oven", + "70": "toaster", + "71": "sink", + "72": "refrigerator", + "73": "book", + "74": "clock", + "75": "vase", + "76": "scissors", + "77": "teddy bear", + "78": "hair drier", + "79": "toothbrush" } } diff --git a/utils/tfrecords/requirements.txt b/utils/tfrecords/requirements.txt index 616c04018e20..45e48c201536 100644 --- a/utils/tfrecords/requirements.txt +++ b/utils/tfrecords/requirements.txt @@ -1,3 +1,3 @@ argparse==1.1 -tensorflow==1.13.1 +tensorflow==1.15.0 pathlib==1.0.1 diff --git a/utils/voc/converter.py b/utils/voc/converter.py index 1764e819313e..671e87804ca2 100644 --- a/utils/voc/converter.py +++ b/utils/voc/converter.py @@ -124,11 +124,12 @@ def process_cvat_xml(xml_file, image_dir, output_dir): image_name = img_tag.get('name') width = img_tag.get('width') height = img_tag.get('height') + depth = img_tag.get('depth', 3) image_path = os.path.join(image_dir, image_name) if not os.path.exists(image_path): log.warn('{} image cannot be found. Is `{}` image directory correct?'. format(image_path, image_dir)) - writer = Writer(image_path, width, height) + writer = Writer(image_path, width, height, depth=depth) unknown_tags = {x.tag for x in img_tag.iter()}.difference(KNOWN_TAGS) if unknown_tags: From 387a6af58e00d4a4ecc587c4f647d734aa4e0312 Mon Sep 17 00:00:00 2001 From: Andrey Zhavoronkov Date: Wed, 18 Dec 2019 12:28:56 +0300 Subject: [PATCH 092/188] fixed auto_segmentation --- cvat/apps/auto_segmentation/views.py | 35 ++++++---------------------- 1 file changed, 7 insertions(+), 28 deletions(-) diff --git a/cvat/apps/auto_segmentation/views.py b/cvat/apps/auto_segmentation/views.py index 0f73ee29229f..8e61bfbb4120 100644 --- a/cvat/apps/auto_segmentation/views.py +++ b/cvat/apps/auto_segmentation/views.py @@ -11,10 +11,9 @@ from cvat.apps.engine.models import Task as TaskModel from cvat.apps.engine.serializers import LabeledDataSerializer from cvat.apps.engine.annotation import put_task_data +from cvat.apps.engine.frame_provider import FrameProvider import django_rq -import fnmatch -import json import os import rq @@ -26,13 +25,7 @@ import skimage.io from skimage.measure import find_contours, approximate_polygon - -def load_image_into_numpy(image): - (im_width, im_height) = image.size - return np.array(image.getdata()).reshape((im_height, im_width, 3)).astype(np.uint8) - - -def run_tensorflow_auto_segmentation(image_list, labels_mapping, treshold): +def run_tensorflow_auto_segmentation(frame_provider, labels_mapping, treshold): def _convert_to_int(boolean_mask): return boolean_mask.astype(np.uint8) @@ -88,16 +81,16 @@ class InferenceConfig(coco.CocoConfig): ## RUN OBJECT DETECTION result = {} - for image_num, image_path in enumerate(image_list): + for image_num, image_bytes in enumerate(frame_provider.get_original_frame_iter()): job.refresh() if 'cancel' in job.meta: del job.meta['cancel'] job.save() return None - job.meta['progress'] = image_num * 100 / len(image_list) + job.meta['progress'] = image_num * 100 / len(frame_provider) job.save_meta() - image = skimage.io.imread(image_path) + image = skimage.io.imread(image_bytes) # for multiple image detection, "batch size" must be equal to number of images r = model.detect([image], verbose=1) @@ -117,20 +110,6 @@ class InferenceConfig(coco.CocoConfig): return result - -def make_image_list(path_to_data): - def get_image_key(item): - return int(os.path.splitext(os.path.basename(item))[0]) - - image_list = [] - for root, _, filenames in os.walk(path_to_data): - for filename in fnmatch.filter(filenames, '*.jpg'): - image_list.append(os.path.join(root, filename)) - - image_list.sort(key=get_image_key) - return image_list - - def convert_to_cvat_format(data): result = { "tracks": [], @@ -166,12 +145,12 @@ def create_thread(tid, labels_mapping, user): # Get job indexes and segment length db_task = TaskModel.objects.get(pk=tid) # Get image list - image_list = make_image_list(db_task.get_data_dirname()) + frame_provider = FrameProvider(db_task.data) # Run auto segmentation by tf result = None slogger.glob.info("auto segmentation with tensorflow framework for task {}".format(tid)) - result = run_tensorflow_auto_segmentation(image_list, labels_mapping, TRESHOLD) + result = run_tensorflow_auto_segmentation(frame_provider, labels_mapping, TRESHOLD) if result is None: slogger.glob.info('auto segmentation for task {} canceled by user'.format(tid)) From 388cb0c400c5dd9247c413fc9d0d8bec45071c87 Mon Sep 17 00:00:00 2001 From: Andrey Zhavoronkov Date: Wed, 18 Dec 2019 15:32:47 +0300 Subject: [PATCH 093/188] fixed reid application --- cvat/apps/reid/reid.py | 22 ++++++++++------------ 1 file changed, 10 insertions(+), 12 deletions(-) diff --git a/cvat/apps/reid/reid.py b/cvat/apps/reid/reid.py index 59fce1cbfe1b..d616bd700e15 100644 --- a/cvat/apps/reid/reid.py +++ b/cvat/apps/reid/reid.py @@ -7,13 +7,14 @@ import cv2 import math import numpy -import fnmatch +import itertools from openvino.inference_engine import IENetwork, IEPlugin from scipy.optimize import linear_sum_assignment from scipy.spatial.distance import euclidean, cosine from cvat.apps.engine.models import Job +from cvat.apps.engine.frame_provider import FrameProvider class ReID: @@ -33,22 +34,18 @@ class ReID: def __init__(self, jid, data): self.__threshold = data["threshold"] self.__max_distance = data["maxDistance"] - self.__frame_urls = {} + self.__frame_boxes = {} db_job = Job.objects.select_related('segment__task').get(pk = jid) db_segment = db_job.segment db_task = db_segment.task + self.__frame_iter = itertools.islice(FrameProvider(db_task.data).get_original_frame_iter(), + db_segment.start_frame, + db_segment.stop_frame + 1) self.__stop_frame = db_segment.stop_frame - - for root, _, filenames in os.walk(db_task.get_data_dirname()): - for filename in fnmatch.filter(filenames, '*.jpg'): - frame = int(os.path.splitext(filename)[0]) - if frame >= db_segment.start_frame and frame <= db_segment.stop_frame: - self.__frame_urls[frame] = os.path.join(root, filename) - - for frame in self.__frame_urls: + for frame in range(db_segment.start_frame, db_segment.stop_frame + 1): self.__frame_boxes[frame] = [box for box in data["boxes"] if box["frame"] == frame] IE_PLUGINS_PATH = os.getenv('IE_PLUGINS_PATH', None) @@ -151,6 +148,7 @@ def __apply_matching(self): job = rq.get_current_job() box_tracks = {} + next_image = cv2.imdecode(numpy.fromstring(next(self.__frame_iter).read(), numpy.uint8), cv2.IMREAD_COLOR) for idx, (cur_frame, next_frame) in enumerate(list(zip(frames[:-1], frames[1:]))): job.refresh() if "cancel" in job.meta: @@ -171,8 +169,8 @@ def __apply_matching(self): if not (len(cur_boxes) and len(next_boxes)): continue - cur_image = cv2.imread(self.__frame_urls[cur_frame], cv2.IMREAD_COLOR) - next_image = cv2.imread(self.__frame_urls[next_frame], cv2.IMREAD_COLOR) + cur_image = next_image + next_image = cv2.imdecode(numpy.fromstring(next(self.__frame_iter).read(), numpy.uint8), cv2.IMREAD_COLOR) difference_matrix = self.__compute_difference_matrix(cur_boxes, next_boxes, cur_image, next_image) cur_idxs, next_idxs = linear_sum_assignment(difference_matrix) for idx, cur_idx in enumerate(cur_idxs): From de80790de57c62bc466c0d2bf5e546c3d1dac675 Mon Sep 17 00:00:00 2001 From: Andrey Zhavoronkov Date: Thu, 19 Dec 2019 10:58:21 +0300 Subject: [PATCH 094/188] fixed datumaro --- cvat/apps/dataset_manager/bindings.py | 49 ++++++------------- .../extractors/cvat_rest_api_task_images.py | 2 +- cvat/apps/dataset_manager/task.py | 24 ++++----- cvat/apps/engine/frame_provider.py | 9 ++-- cvat/apps/engine/media_extractors.py | 8 +-- cvat/apps/engine/mime_types.py | 9 ++++ cvat/apps/engine/models.py | 15 +----- cvat/apps/engine/serializers.py | 2 +- cvat/apps/engine/tests/test_model.py | 24 +-------- cvat/apps/engine/tests/test_rest_api.py | 2 +- cvat/apps/engine/views.py | 8 +-- utils/cli/core/core.py | 19 +++++-- utils/cli/core/definition.py | 9 +++- 13 files changed, 76 insertions(+), 104 deletions(-) create mode 100644 cvat/apps/engine/mime_types.py diff --git a/cvat/apps/dataset_manager/bindings.py b/cvat/apps/dataset_manager/bindings.py index cc758fd06517..59044ac226be 100644 --- a/cvat/apps/dataset_manager/bindings.py +++ b/cvat/apps/dataset_manager/bindings.py @@ -1,45 +1,32 @@ from collections import OrderedDict -import os -import os.path as osp from django.db import transaction from cvat.apps.annotation.annotation import Annotation from cvat.apps.engine.annotation import TaskAnnotation -from cvat.apps.engine.models import Task, ShapeType +from cvat.apps.engine.models import ShapeType import datumaro.components.extractor as datumaro -from datumaro.util.image import lazy_image +from datumaro.util.image import decode_image -class CvatImagesDirExtractor(datumaro.Extractor): - _SUPPORTED_FORMATS = ['.png', '.jpg'] +class CvatImagesExtractor(datumaro.Extractor): + # _SUPPORTED_FORMATS = ['.png', '.jpg'] - def __init__(self, url): + def __init__(self, url, frame_provider): super().__init__() - items = [] - for (dirpath, _, filenames) in os.walk(url): - for name in filenames: - path = osp.join(dirpath, name) - if self._is_image(path): - item_id = Task.get_image_frame(path) - item = datumaro.DatasetItem( - id=item_id, image=lazy_image(path)) - items.append((item.id, item)) - - items = sorted(items, key=lambda e: int(e[0])) - items = OrderedDict(items) - self._items = items - - self._subsets = None + self._frame_provider = frame_provider def __iter__(self): - for item in self._items.values(): - yield item + for item_id, image in enumerate(self._frame_provider.get_original_frame_iter()): + yield datumaro.DatasetItem( + id=item_id, + image=decode_image(image.getvalue()) + ) def __len__(self): - return len(self._items) + return len(self._frame_provider) def subsets(self): return self._subsets @@ -47,14 +34,10 @@ def subsets(self): def get(self, item_id, subset=None, path=None): if path or subset: raise KeyError() - return self._items[item_id] - - def _is_image(self, path): - for ext in self._SUPPORTED_FORMATS: - if osp.isfile(path) and path.endswith(ext): - return True - return False - + return datumaro.DatasetItem( + id=item_id, + image=self._frame_provider[item_id].getvalue() + ) class CvatTaskExtractor(datumaro.Extractor): def __init__(self, url, db_task, user): diff --git a/cvat/apps/dataset_manager/export_templates/extractors/cvat_rest_api_task_images.py b/cvat/apps/dataset_manager/export_templates/extractors/cvat_rest_api_task_images.py index 28baafadc5e1..92ed1e9026ba 100644 --- a/cvat/apps/dataset_manager/export_templates/extractors/cvat_rest_api_task_images.py +++ b/cvat/apps/dataset_manager/export_templates/extractors/cvat_rest_api_task_images.py @@ -40,7 +40,7 @@ def _download_image(self, item_id): self._connect() os.makedirs(self._cache_dir, exist_ok=True) self._cvat_cli.tasks_frame(task_id=self._config.task_id, - frame_ids=[item_id], outdir=self._cache_dir) + frame_ids=[item_id], outdir=self._cache_dir, quality='original') def _connect(self): if self._session is not None: diff --git a/cvat/apps/dataset_manager/task.py b/cvat/apps/dataset_manager/task.py index 8103dab40976..64f24f46c916 100644 --- a/cvat/apps/dataset_manager/task.py +++ b/cvat/apps/dataset_manager/task.py @@ -11,6 +11,7 @@ from cvat.apps.engine.log import slogger from cvat.apps.engine.models import Task, ShapeType +from cvat.apps.engine.frame_provider import FrameProvider from .util import current_function_name, make_zip_archive _CVAT_ROOT_DIR = __file__[:__file__.rfind('cvat/')] @@ -18,7 +19,7 @@ sys.path.append(_DATUMARO_REPO_PATH) from datumaro.components.project import Project import datumaro.components.extractor as datumaro -from .bindings import CvatImagesDirExtractor, CvatTaskExtractor +from .bindings import CvatImagesExtractor, CvatTaskExtractor _MODULE_NAME = __package__ + '.' + osp.splitext(osp.basename(__file__))[0] @@ -42,7 +43,7 @@ def get_export_cache_dir(db_task): class TaskProject: @staticmethod def _get_datumaro_project_dir(db_task): - return osp.join(db_task.get_task_dirname(), 'datumaro') + return db_task.get_task_datumaro_dirname() @staticmethod def create(db_task): @@ -72,11 +73,11 @@ def __init__(self, db_task): def _create(self): self._project = Project.generate(self._project_dir) self._project.add_source('task_%s' % self._db_task.id, { - 'url': self._db_task.get_data_dirname(), 'format': _TASK_IMAGES_EXTRACTOR, }) self._project.env.extractors.register(_TASK_IMAGES_EXTRACTOR, - CvatImagesDirExtractor) + lambda url: CvatImagesExtractor(url, + FrameProvider(self._db_task.data))) self._init_dataset() self._dataset.define_categories(self._generate_categories()) @@ -86,17 +87,18 @@ def _create(self): def _load(self): self._project = Project.load(self._project_dir) self._project.env.extractors.register(_TASK_IMAGES_EXTRACTOR, - CvatImagesDirExtractor) + lambda url: CvatImagesExtractor(url, + FrameProvider(self._db_task.data))) def _import_from_task(self, user): self._project = Project.generate(self._project_dir) self._project.add_source('task_%s_images' % self._db_task.id, { - 'url': self._db_task.get_data_dirname(), 'format': _TASK_IMAGES_EXTRACTOR, }) self._project.env.extractors.register(_TASK_IMAGES_EXTRACTOR, - CvatImagesDirExtractor) + lambda url: CvatImagesExtractor(url, + FrameProvider(self._db_task.data))) self._project.add_source('task_%s_anno' % self._db_task.id, { 'format': _TASK_ANNO_EXTRACTOR, @@ -242,9 +244,9 @@ def _remote_image_converter(self, save_dir, server_url=None): images_meta = { 'images': items, } - db_video = getattr(self._db_task, 'video', None) + db_video = getattr(self._db_task.data, 'video', None) if db_video is not None: - for i in range(self._db_task.size): + for i in range(self._db_task.data.size): frame_info = { 'id': str(i), 'width': db_video.width, @@ -252,7 +254,7 @@ def _remote_image_converter(self, save_dir, server_url=None): } items.append(frame_info) else: - for db_image in self._db_task.image_set.all(): + for db_image in self._db_task.data.images.all(): frame_info = { 'id': db_image.frame, 'width': db_image.width, @@ -413,4 +415,4 @@ def get_export_formats(): if fmt['tag'] in available_formats: public_formats.append(fmt) - return public_formats \ No newline at end of file + return public_formats diff --git a/cvat/apps/engine/frame_provider.py b/cvat/apps/engine/frame_provider.py index cb6b1d9fb736..9d962575c837 100644 --- a/cvat/apps/engine/frame_provider.py +++ b/cvat/apps/engine/frame_provider.py @@ -5,6 +5,7 @@ from cvat.apps.engine.media_extractors import VideoReader, ZipReader from cvat.apps.engine.models import DataChoice +from cvat.apps.engine.mime_types import mimetypes class FrameProvider(): @@ -43,7 +44,7 @@ def _validate_frame_number(self, frame_number): return frame_number_, chunk_number, frame_offset @staticmethod - def _av_frame_to_bytes(av_frame): + def _av_frame_to_png_bytes(av_frame): pil_img = av_frame.to_image() buf = BytesIO() pil_img.save(buf, format='PNG') @@ -57,11 +58,11 @@ def _get_frame(self, frame_number, chunk_path_getter, extracted_chunk, chunk_rea extracted_chunk = chunk_number chunk_reader = reader_class([chunk_path]) - frame, _ = chunk_reader[frame_offset] + frame, frame_name = chunk_reader[frame_offset] if reader_class is VideoReader: - return self._av_frame_to_bytes(frame) + return (self._av_frame_to_png_bytes(frame), 'image/png') - return frame + return (frame, mimetypes.guess_type(frame_name)) def get_compressed_frame(self, frame_number): return self._get_frame( diff --git a/cvat/apps/engine/media_extractors.py b/cvat/apps/engine/media_extractors.py index e28e8c4d89f0..1fc461c3ee16 100644 --- a/cvat/apps/engine/media_extractors.py +++ b/cvat/apps/engine/media_extractors.py @@ -6,19 +6,13 @@ import itertools from abc import ABC, abstractmethod - import av import av.datasets import numpy as np from pyunpack import Archive from PIL import Image -import mimetypes -_SCRIPT_DIR = os.path.realpath(os.path.dirname(__file__)) -MEDIA_MIMETYPES_FILES = [ - os.path.join(_SCRIPT_DIR, "media.mimetypes"), -] -mimetypes.init(files=MEDIA_MIMETYPES_FILES) +from cvat.apps.engine.mime_types import mimetypes def get_mime(name): for type_name, type_def in MEDIA_TYPES.items(): diff --git a/cvat/apps/engine/mime_types.py b/cvat/apps/engine/mime_types.py new file mode 100644 index 000000000000..ce2be0405205 --- /dev/null +++ b/cvat/apps/engine/mime_types.py @@ -0,0 +1,9 @@ +import os +import mimetypes + + +_SCRIPT_DIR = os.path.realpath(os.path.dirname(__file__)) +MEDIA_MIMETYPES_FILES = [ + os.path.join(_SCRIPT_DIR, "media.mimetypes"), +] +mimetypes.init(files=MEDIA_MIMETYPES_FILES) diff --git a/cvat/apps/engine/models.py b/cvat/apps/engine/models.py index 3001109e8b32..5e79caf8591b 100644 --- a/cvat/apps/engine/models.py +++ b/cvat/apps/engine/models.py @@ -165,19 +165,9 @@ class Task(models.Model): class Meta: default_permissions = () - def get_frame_path(self, frame): - d1, d2 = str(int(frame) // 10000), str(int(frame) // 100) - return os.path.join(self.get_data_dirname(), d1, d2, - str(frame) + '.jpg') - - def get_frame_step(self): - match = re.search("step\s*=\s*([1-9]\d*)", self.frame_filter) - return int(match.group(1)) if match else 1 - def get_task_dirname(self): return os.path.join(settings.TASKS_ROOT, str(self.id)) - def get_task_logs_dirname(self): return os.path.join(self.get_task_dirname(), 'logs') @@ -190,9 +180,8 @@ def get_log_path(self): def get_task_artifacts_dirname(self): return os.path.join(self.get_task_dirname(), 'artifacts') - def get_task_datum_dirname(self): - return os.path.join(self.get_task_dirname(), 'datum') - + def get_task_datumaro_dirname(self): + return os.path.join(self.get_task_dirname(), 'datumaro') def __str__(self): return self.name diff --git a/cvat/apps/engine/serializers.py b/cvat/apps/engine/serializers.py index b4e0ab9dbf02..7c868a6ba24b 100644 --- a/cvat/apps/engine/serializers.py +++ b/cvat/apps/engine/serializers.py @@ -238,7 +238,7 @@ def create(self, validated_data): os.makedirs(db_task.get_task_logs_dirname()) os.makedirs(db_task.get_task_artifacts_dirname()) - os.makedirs(db_task.get_task_datum_dirname()) + os.makedirs(db_task.get_task_datumaro_dirname()) db_task.save() return db_task diff --git a/cvat/apps/engine/tests/test_model.py b/cvat/apps/engine/tests/test_model.py index 34454c0b1f58..411e7c9d00c4 100644 --- a/cvat/apps/engine/tests/test_model.py +++ b/cvat/apps/engine/tests/test_model.py @@ -1,25 +1,3 @@ -# Copyright (C) 2018 Intel Corporation +# Copyright (C) 2018-2019 Intel Corporation # # SPDX-License-Identifier: MIT - -import os.path as osp - -from django.test import TestCase -from cvat.apps.engine.models import Task - - -class TaskModelTest(TestCase): - def test_frame_id_path_conversions(self): - task_id = 1 - task = Task(task_id) - - for i in [10 ** p for p in range(6)]: - src_path_expected = osp.join( - str(i // 10000), str(i // 100), '%s.jpg' % i) - src_path = task.get_frame_path(i) - - dst_frame = task.get_image_frame(src_path) - - self.assertTrue(src_path.endswith(src_path_expected), - '%s vs. %s' % (src_path, src_path_expected)) - self.assertEqual(i, dst_frame) diff --git a/cvat/apps/engine/tests/test_rest_api.py b/cvat/apps/engine/tests/test_rest_api.py index 43947aeb6640..20f2c006f85e 100644 --- a/cvat/apps/engine/tests/test_rest_api.py +++ b/cvat/apps/engine/tests/test_rest_api.py @@ -65,7 +65,7 @@ def create_db_task(data): os.makedirs(db_task.get_task_dirname()) os.makedirs(db_task.get_task_logs_dirname()) os.makedirs(db_task.get_task_artifacts_dirname()) - os.makedirs(db_task.get_task_datum_dirname()) + os.makedirs(db_task.get_task_datumaro_dirname()) db_task.data = db_data db_task.save() diff --git a/cvat/apps/engine/views.py b/cvat/apps/engine/views.py index c16c166455a8..3ddb55436525 100644 --- a/cvat/apps/engine/views.py +++ b/cvat/apps/engine/views.py @@ -11,7 +11,7 @@ from tempfile import mkstemp, NamedTemporaryFile from django.views.generic import RedirectView -from django.http import HttpResponseBadRequest, HttpResponseNotFound +from django.http import HttpResponse, HttpResponseBadRequest, HttpResponseNotFound from django.shortcuts import render from django.conf import settings from sendfile import sendfile @@ -343,11 +343,11 @@ def data(self, request, pk): elif data_type == 'frame': data_id = int(data_id) if data_quality == 'compressed': - buf = frame_provider.get_compressed_frame(data_id) + buf, mime = frame_provider.get_compressed_frame(data_id) else: - buf = frame_provider.get_original_frame(data_id) + buf, mime = frame_provider.get_original_frame(data_id) - return HttpResponse(buf.getvalue(), content_type='image/png') + return HttpResponse(buf.getvalue(), content_type=mime) elif data_type == 'preview': return sendfile(request, frame_provider.get_preview()) diff --git a/utils/cli/core/core.py b/utils/cli/core/core.py index cc389acea3be..f51dff580238 100644 --- a/utils/cli/core/core.py +++ b/utils/cli/core/core.py @@ -4,7 +4,10 @@ import os import requests from io import BytesIO +import mimetypes + from PIL import Image + from .definition import ResourceType log = logging.getLogger(__name__) @@ -78,15 +81,21 @@ def tasks_delete(self, task_ids, **kwargs): else: raise e - def tasks_frame(self, task_id, frame_ids, outdir='', **kwargs): + def tasks_frame(self, task_id, frame_ids, outdir='', quality='original', **kwargs): """ Download the requested frame numbers for a task and save images as task__frame_.jpg.""" for frame_id in frame_ids: - url = self.api.tasks_id_frame_id(task_id, frame_id) + url = self.api.tasks_id_frame_id(task_id, frame_id, quality) response = self.session.get(url) response.raise_for_status() im = Image.open(BytesIO(response.content)) - outfile = 'task_{}_frame_{:06d}.jpg'.format(task_id, frame_id) + mime_type = im.get_format_mimetype() or 'image/jpg' + im_ext = mimetypes.guess_extension(mime_type) + #replace '.jpe' with a more used '.jpg' + if im_ext == '.jpe' or None: + im_ext = '.jpg' + + outfile = 'task_{}_frame_{:06d}{}'.format(task_id, frame_id, im_ext) im.save(os.path.join(outdir, outfile)) def tasks_dump(self, task_id, fileformat, filename, **kwargs): @@ -149,8 +158,8 @@ def tasks_id(self, task_id): def tasks_id_data(self, task_id): return self.tasks_id(task_id) + '/data' - def tasks_id_frame_id(self, task_id, frame_id): - return self.tasks_id(task_id) + '/data?type=frame&number={}&quality=compressed'.format(frame_id) + def tasks_id_frame_id(self, task_id, frame_id, quality): + return self.tasks_id(task_id) + '/data?type=frame&number={}&quality={}'.format(frame_id, quality) def tasks_id_annotations_format(self, task_id, fileformat): return self.tasks_id(task_id) + '/annotations?format={}' \ diff --git a/utils/cli/core/definition.py b/utils/cli/core/definition.py index e3d1a6222d59..ed7719c3eb29 100644 --- a/utils/cli/core/definition.py +++ b/utils/cli/core/definition.py @@ -180,7 +180,14 @@ def argparse(s): '--outdir', type=str, default='', - help='directory to save images' + help='directory to save images (default: CWD)' +) +frames_parser.add_argument( + '--quality', + type=str, + choices=('original', 'compressed'), + default='original', + help='choose quality of images (default: %(default)s)' ) ####################################################################### From 1ef8c9b845a0519ec4fec7fa07bd1b73e5b3c0a5 Mon Sep 17 00:00:00 2001 From: Andrey Zhavoronkov Date: Fri, 20 Dec 2019 20:14:43 +0300 Subject: [PATCH 095/188] wip --- cvat-core/src/frames.js | 2 +- .../engine/static/engine/js/cvat-core.min.js | 2 +- cvat/apps/engine/static/engine/js/player.js | 222 ++++++++++++++++-- 3 files changed, 205 insertions(+), 21 deletions(-) diff --git a/cvat-core/src/frames.js b/cvat-core/src/frames.js index 947fb691da54..c728126d6812 100644 --- a/cvat-core/src/frames.js +++ b/cvat-core/src/frames.js @@ -300,7 +300,7 @@ frameDataCache[taskID] = { meta, chunkSize, - provider: new cvatData.FrameProvider(blockType, chunkSize, 9, decodedBlocksCacheSize, 2), + provider: new cvatData.FrameProvider(blockType, chunkSize, 9, decodedBlocksCacheSize, 1), lastFrameRequest : frame, decodedBlocksCacheSize, activeChunkRequest: undefined, diff --git a/cvat/apps/engine/static/engine/js/cvat-core.min.js b/cvat/apps/engine/static/engine/js/cvat-core.min.js index 590720c25519..08a321d06cdd 100644 --- a/cvat/apps/engine/static/engine/js/cvat-core.min.js +++ b/cvat/apps/engine/static/engine/js/cvat-core.min.js @@ -11,5 +11,5 @@ window.cvat=function(t){var e={};function n(r){if(e[r])return e[r].exports;var i * @author Feross Aboukhadijeh * @license MIT */ -t.exports=function(t){return null!=t&&null!=t.constructor&&"function"==typeof t.constructor.isBuffer&&t.constructor.isBuffer(t)}},function(t,e,n){"use strict";var r=n(68),i=n(7),o=n(193),s=n(194);function a(t){this.defaults=t,this.interceptors={request:new o,response:new o}}a.prototype.request=function(t){"string"==typeof t&&(t=i.merge({url:arguments[0]},arguments[1])),(t=i.merge(r,{method:"get"},this.defaults,t)).method=t.method.toLowerCase();var e=[s,void 0],n=Promise.resolve(t);for(this.interceptors.request.forEach((function(t){e.unshift(t.fulfilled,t.rejected)})),this.interceptors.response.forEach((function(t){e.push(t.fulfilled,t.rejected)}));e.length;)n=n.then(e.shift(),e.shift());return n},i.forEach(["delete","get","head","options"],(function(t){a.prototype[t]=function(e,n){return this.request(i.merge(n||{},{method:t,url:e}))}})),i.forEach(["post","put","patch"],(function(t){a.prototype[t]=function(e,n,r){return this.request(i.merge(r||{},{method:t,url:e,data:n}))}})),t.exports=a},function(t,e,n){"use strict";var r=n(7);t.exports=function(t,e){r.forEach(t,(function(n,r){r!==e&&r.toUpperCase()===e.toUpperCase()&&(t[e]=n,delete t[r])}))}},function(t,e,n){"use strict";var r=n(114);t.exports=function(t,e,n){var i=n.config.validateStatus;n.status&&i&&!i(n.status)?e(r("Request failed with status code "+n.status,n.config,null,n.request,n)):t(n)}},function(t,e,n){"use strict";t.exports=function(t,e,n,r,i){return t.config=e,n&&(t.code=n),t.request=r,t.response=i,t}},function(t,e,n){"use strict";var r=n(7);function i(t){return encodeURIComponent(t).replace(/%40/gi,"@").replace(/%3A/gi,":").replace(/%24/g,"$").replace(/%2C/gi,",").replace(/%20/g,"+").replace(/%5B/gi,"[").replace(/%5D/gi,"]")}t.exports=function(t,e,n){if(!e)return t;var o;if(n)o=n(e);else if(r.isURLSearchParams(e))o=e.toString();else{var s=[];r.forEach(e,(function(t,e){null!=t&&(r.isArray(t)?e+="[]":t=[t],r.forEach(t,(function(t){r.isDate(t)?t=t.toISOString():r.isObject(t)&&(t=JSON.stringify(t)),s.push(i(e)+"="+i(t))})))})),o=s.join("&")}return o&&(t+=(-1===t.indexOf("?")?"?":"&")+o),t}},function(t,e,n){"use strict";var r=n(7),i=["age","authorization","content-length","content-type","etag","expires","from","host","if-modified-since","if-unmodified-since","last-modified","location","max-forwards","proxy-authorization","referer","retry-after","user-agent"];t.exports=function(t){var e,n,o,s={};return t?(r.forEach(t.split("\n"),(function(t){if(o=t.indexOf(":"),e=r.trim(t.substr(0,o)).toLowerCase(),n=r.trim(t.substr(o+1)),e){if(s[e]&&i.indexOf(e)>=0)return;s[e]="set-cookie"===e?(s[e]?s[e]:[]).concat([n]):s[e]?s[e]+", "+n:n}})),s):s}},function(t,e,n){"use strict";var r=n(7);t.exports=r.isStandardBrowserEnv()?function(){var t,e=/(msie|trident)/i.test(navigator.userAgent),n=document.createElement("a");function i(t){var r=t;return e&&(n.setAttribute("href",r),r=n.href),n.setAttribute("href",r),{href:n.href,protocol:n.protocol?n.protocol.replace(/:$/,""):"",host:n.host,search:n.search?n.search.replace(/^\?/,""):"",hash:n.hash?n.hash.replace(/^#/,""):"",hostname:n.hostname,port:n.port,pathname:"/"===n.pathname.charAt(0)?n.pathname:"/"+n.pathname}}return t=i(window.location.href),function(e){var n=r.isString(e)?i(e):e;return n.protocol===t.protocol&&n.host===t.host}}():function(){return!0}},function(t,e,n){"use strict";var r=n(7);t.exports=r.isStandardBrowserEnv()?{write:function(t,e,n,i,o,s){var a=[];a.push(t+"="+encodeURIComponent(e)),r.isNumber(n)&&a.push("expires="+new Date(n).toGMTString()),r.isString(i)&&a.push("path="+i),r.isString(o)&&a.push("domain="+o),!0===s&&a.push("secure"),document.cookie=a.join("; ")},read:function(t){var e=document.cookie.match(new RegExp("(^|;\\s*)("+t+")=([^;]*)"));return e?decodeURIComponent(e[3]):null},remove:function(t){this.write(t,"",Date.now()-864e5)}}:{write:function(){},read:function(){return null},remove:function(){}}},function(t,e,n){"use strict";var r=n(7);function i(){this.handlers=[]}i.prototype.use=function(t,e){return this.handlers.push({fulfilled:t,rejected:e}),this.handlers.length-1},i.prototype.eject=function(t){this.handlers[t]&&(this.handlers[t]=null)},i.prototype.forEach=function(t){r.forEach(this.handlers,(function(e){null!==e&&t(e)}))},t.exports=i},function(t,e,n){"use strict";var r=n(7),i=n(195),o=n(115),s=n(68),a=n(196),c=n(197);function u(t){t.cancelToken&&t.cancelToken.throwIfRequested()}t.exports=function(t){return u(t),t.baseURL&&!a(t.url)&&(t.url=c(t.baseURL,t.url)),t.headers=t.headers||{},t.data=i(t.data,t.headers,t.transformRequest),t.headers=r.merge(t.headers.common||{},t.headers[t.method]||{},t.headers||{}),r.forEach(["delete","get","head","post","put","patch","common"],(function(e){delete t.headers[e]})),(t.adapter||s.adapter)(t).then((function(e){return u(t),e.data=i(e.data,e.headers,t.transformResponse),e}),(function(e){return o(e)||(u(t),e&&e.response&&(e.response.data=i(e.response.data,e.response.headers,t.transformResponse))),Promise.reject(e)}))}},function(t,e,n){"use strict";var r=n(7);t.exports=function(t,e,n){return r.forEach(n,(function(n){t=n(t,e)})),t}},function(t,e,n){"use strict";t.exports=function(t){return/^([a-z][a-z\d\+\-\.]*:)?\/\//i.test(t)}},function(t,e,n){"use strict";t.exports=function(t,e){return e?t.replace(/\/+$/,"")+"/"+e.replace(/^\/+/,""):t}},function(t,e,n){"use strict";var r=n(116);function i(t){if("function"!=typeof t)throw new TypeError("executor must be a function.");var e;this.promise=new Promise((function(t){e=t}));var n=this;t((function(t){n.reason||(n.reason=new r(t),e(n.reason))}))}i.prototype.throwIfRequested=function(){if(this.reason)throw this.reason},i.source=function(){var t;return{token:new i((function(e){t=e})),cancel:t}},t.exports=i},function(t,e,n){"use strict";t.exports=function(t){return function(e){return t.apply(null,e)}}},function(t,e,n){"use strict";var r=n(12),i=n(201).trim;r({target:"String",proto:!0,forced:n(202)("trim")},{trim:function(){return i(this)}})},function(t,e,n){var r=n(31),i="["+n(118)+"]",o=RegExp("^"+i+i+"*"),s=RegExp(i+i+"*$"),a=function(t){return function(e){var n=String(r(e));return 1&t&&(n=n.replace(o,"")),2&t&&(n=n.replace(s,"")),n}};t.exports={start:a(1),end:a(2),trim:a(3)}},function(t,e,n){var r=n(3),i=n(118);t.exports=function(t){return r((function(){return!!i[t]()||"​…᠎"!="​…᠎"[t]()||i[t].name!==t}))}},function(t,e,n){(function(e){n(5),n(11),n(204),n(10),(()=>{const r=n(205),i=n(36),o=n(26),{isBrowser:s,isNode:a}=n(246),{Exception:c,ArgumentError:u}=n(6),l={};class f{constructor(t,e,n,r,i,o){Object.defineProperties(this,Object.freeze({width:{value:t,writable:!1},height:{value:e,writable:!1},tid:{value:n,writable:!1},number:{value:r,writable:!1},startFrame:{value:i,writable:!1},stopFrame:{value:o,writable:!1}}))}async data(t=(()=>{})){return await i.apiWrapper.call(this,f.prototype.data,t)}}f.prototype.data.implementation=async function(t){return new Promise(async(e,n)=>{const r=t=>{if(l[this.tid].activeChunkRequest&&b===l[this.tid].activeChunkRequest.chunkNumber){const e=l[this.tid].activeChunkRequest.callbacks;if(e.length){const n=e.pop();l[this.tid].activeChunkRequest=void 0,n.resolve(f.frame(t))}}},i=()=>{if(l[this.tid].activeChunkRequest&&b===l[this.tid].activeChunkRequest.chunkNumber){for(const t of l[this.tid].activeChunkRequest.callbacks)t.reject(t.frameNumber);l[this.tid].activeChunkRequest=void 0}},u=()=>{const t=l[this.tid].activeChunkRequest;t.request=o.frames.getData(this.tid,t.chunkNumber).then(t=>{l[this.tid].activeChunkRequest.completed=!0,f.requestDecodeBlock(t,l[this.tid].activeChunkRequest.start,l[this.tid].activeChunkRequest.stop,l[this.tid].activeChunkRequest.onDecodeAll,l[this.tid].activeChunkRequest.rejectRequestAll)}).catch(t=>{n(t instanceof c?t:new c(t.message))}).finally(()=>{if(l[this.tid].nextChunkRequest){if(l[this.tid].activeChunkRequest)for(const t of l[this.tid].activeChunkRequest.callbacks)t.reject(t.frameNumber);l[this.tid].activeChunkRequest=l[this.tid].nextChunkRequest,l[this.tid].nextChunkRequest=void 0,u()}})},{provider:f}=l[this.tid],{chunkSize:p}=l[this.tid],h=Math.max(this.startFrame,parseInt(this.number/p,10)*p),d=Math.min(this.stopFrame,(parseInt(this.number/p,10)+1)*p-1),b=Math.floor(this.number/p);if(a)e("Dummy data");else if(s)try{const{decodedBlocksCacheSize:s}=l[this.tid];let a=await f.frame(this.number);if(null===a)if(t(),f.is_chunk_cached(h,d))l[this.tid].activeChunkRequest.callbacks.push({resolve:e,reject:n,frameNumber:this.number}),f.requestDecodeBlock(null,h,d,r,i);else if(!l[this.tid].activeChunkRequest||l[this.tid].activeChunkRequest&&l[this.tid].activeChunkRequest.completed)l[this.tid].activeChunkRequest&&l[this.tid].activeChunkRequest.rejectRequestAll(),l[this.tid].activeChunkRequest={request:void 0,chunkNumber:b,start:h,stop:d,onDecodeAll:r,rejectRequestAll:i,completed:!1,callbacks:[{resolve:e,reject:n,frameNumber:this.number}]},u();else if(l[this.tid].activeChunkRequest.chunkNumber===b)l[this.tid].activeChunkRequest.callbacks.push({resolve:e,reject:n,frameNumber:this.number});else{if(l[this.tid].nextChunkRequest)for(const t of l[this.tid].nextChunkRequest.callbacks)t.reject(t.frameNumber);l[this.tid].nextChunkRequest={request:void 0,chunkNumber:b,start:h,stop:d,onDecodeAll:r,rejectRequestAll:i,completed:!1,callbacks:[{resolve:e,reject:n,frameNumber:this.number}]}}else{if(this.number%p>1&&!f.isNextChunkExists(this.number)&&s>1){const t=b+1,e=Math.max(this.startFrame,t*p),r=Math.min(this.stopFrame,(t+1)*p-1);e{f.requestDecodeBlock(t,e,r,void 0,void 0)}).catch(t=>{n(t instanceof c?t:new c(t.message))}))}e(a)}}catch(t){n(t instanceof c?t:new c(t.message))}})},t.exports={FrameData:f,getFrame:async function(t,e,n,i,s,a,c){if(!(t in l)){const i="video"===n?r.BlockType.MP4VIDEO:r.BlockType.ARCHIVE,a=await o.frames.getMeta(t),c=i===r.BlockType.MP4VIDEO?Math.floor(258.90765432098766/e)||1:Math.floor(500/e)||1;l[t]={meta:a,chunkSize:e,provider:new r.FrameProvider(i,e,9,c,2),lastFrameRequest:s,decodedBlocksCacheSize:c,activeChunkRequest:void 0,nextChunkRequest:void 0}}const p=(t=>{let e=null;if("interpolation"===i)[e]=t;else{if("annotation"!==i)throw new u(`Invalid mode is specified ${i}`);if(s>=t.length)throw new u(`Meta information about frame ${s} can't be received from the server`);e=t[s]}return e})(l[t].meta);return l[t].lastFrameRequest=s,l[t].provider.setRenderSize(p.width,p.height),new f(p.width,p.height,t,s,a,c)},getRanges:function(t){return t in l?l[t].provider.cachedFrames:[]},getPreview:async function(t){return new Promise(async(n,r)=>{try{const r=await o.frames.getPreview(t);if(a)n(e.Buffer.from(r,"binary").toString("base64"));else if(s){const t=new FileReader;t.onload=()=>{n(t.result)},t.readAsDataURL(r)}}catch(t){r(t)}})}}})()}).call(this,n(30))},function(t,e,n){"use strict";var r=n(12),i=n(24),o=n(94),s=n(32),a=n(98),c=n(101),u=n(18);r({target:"Promise",proto:!0,real:!0},{finally:function(t){var e=a(this,s("Promise")),n="function"==typeof t;return this.then(n?function(n){return c(e,t()).then((function(){return n}))}:t,n?function(n){return c(e,t()).then((function(){throw n}))}:t)}}),i||"function"!=typeof o||o.prototype.finally||u(o.prototype,"finally",s("Promise").prototype.finally)},function(t,e,n){n(72),n(225),n(227),n(243);const{MP4Reader:r,Bytestream:i}=n(245),o=Object.freeze({MP4VIDEO:"mp4video",ARCHIVE:"archive"});class s{constructor(){this._lock=Promise.resolve()}_acquire(){var t;return this._lock=new Promise(e=>{t=e}),t}acquireQueued(){const t=this._lock.then(()=>e),e=this._acquire();return t}}t.exports={FrameProvider:class{constructor(t,e,n,r=5,i=2){this._frames={},this._cachedBlockCount=Math.max(1,n),this._decodedBlocksCacheSize=r,this._blocks_ranges=[],this._blocks={},this._blockSize=e,this._running=!1,this._blockType=t,this._currFrame=-1,this._requestedBlockDecode=null,this._width=null,this._height=null,this._decodingBlocks={},this._decodeThreadCount=0,this._timerId=setTimeout(this._worker.bind(this),100),this._mutex=new s,this._promisedFrames={},this._maxWorkerThreadCount=i}async _worker(){null!=this._requestedBlockDecode&&this._decodeThreadCountthis._cachedBlockCount){const t=this._blocks_ranges.shift(),[e,n]=t.split(":").map(t=>+t);delete this._blocks[e/this._blockSize];for(let t=e;t<=n;t++)delete this._frames[t]}const t=Math.floor(this._decodedBlocksCacheSize/2);for(let e=0;e+t);if(rthis._currFrame+t*this._blockSize)for(let t=n;t<=r;t++)delete this._frames[t]}}async requestDecodeBlock(t,e,n,r,i){const o=await this._mutex.acquireQueued();null!==this._requestedBlockDecode&&(e===this._requestedBlockDecode.start&&n===this._requestedBlockDecode.end?(this._requestedBlockDecode.resolveCallback=r,this._requestedBlockDecode.rejectCallback=i):this._requestedBlockDecode.rejectCallback&&this._requestedBlockDecode.rejectCallback()),`${e}:${n}`in this._decodingBlocks?(this._decodingBlocks[`${e}:${n}`].rejectCallback=i,this._decodingBlocks[`${e}:${n}`].resolveCallback=r):(null===t&&(t=this._blocks[Math.floor((e+1)/this.blockSize)]),this._requestedBlockDecode={block:t,start:e,end:n,resolveCallback:r,rejectCallback:i}),o()}isRequestExist(){return null!=this._requestedBlockDecode}setRenderSize(t,e){this._width=t,this._height=e}async frame(t){return this._currFrame=t,new Promise((e,n)=>{t in this._frames?null!==this._frames[t]?e(this._frames[t]):this._promisedFrames[t]={resolve:e,reject:n}:e(null)})}isNextChunkExists(t){const e=Math.floor(t/this._blockSize)+1;return"loading"===this._blocks[e]||e in this._blocks}setReadyToLoading(t){this._blocks[t]="loading"}cropImage(t,e,n,r,i,o,s){if(0===r&&o===e&&0===i&&s===n)return new ImageData(new Uint8ClampedArray(t),o,s);const a=new Uint32Array(t),c=o*s*4,u=new ArrayBuffer(c),l=new Uint32Array(u),f=new Uint8ClampedArray(u);if(e===o)return new ImageData(new Uint8ClampedArray(t,4*i,c),o,s);let p=0;for(let t=i;t{if(t.data.consoleLog)return;const r=Math.ceil(this._height/t.data.height);this._frames[u]=this.cropImage(t.data.buf,t.data.width,t.data.height,0,0,Math.floor(n/r),Math.floor(e/r)),this._decodingBlocks[`${s}:${a}`].resolveCallback&&this._decodingBlocks[`${s}:${a}`].resolveCallback(u),u in this._promisedFrames&&(this._promisedFrames[u].resolve(this._frames[u]),delete this._promisedFrames[u]),u===a&&(this._decodeThreadCount--,delete this._decodingBlocks[`${s}:${a}`],o.terminate()),u++},o.onerror=t=>{console.log(["ERROR: Line ",t.lineno," in ",t.filename,": ",t.message].join("")),o.terminate(),this._decodeThreadCount--;for(let t=u;t<=a;t++)t in this._promisedFrames&&(this._promisedFrames[t].reject(),delete this._promisedFrames[t]);this._decodingBlocks[`${s}:${a}`].rejectCallback&&this._decodingBlocks[`${s}:${a}`].rejectCallback(),delete this._decodingBlocks[`${s}:${a}`]},o.postMessage({type:"Broadway.js - Worker init",options:{rgb:!0,reuseMemory:!1}});const l=new r(new i(c));l.read();const f=l.tracks[1],p=l.tracks[1].trak.mdia.minf.stbl.stsd.avc1.avcC,h=p.sps[0],d=p.pps[0];o.postMessage({buf:h,offset:0,length:h.length}),o.postMessage({buf:d,offset:0,length:d.length});for(let t=0;t{o.postMessage({buf:t,offset:0,length:t.length})});this._decodeThreadCount++,t()}else{const r=new Worker("/static/engine/js/unzip_imgs.js");r.onerror=t=>{console.log(["ERROR: Line ",t.lineno," in ",t.filename,": ",t.message].join(""));for(let t=s;t<=a;t++)t in this._promisedFrames&&(this._promisedFrames[t].reject(),delete this._promisedFrames[t]);this._decodingBlocks[`${s}:${a}`].rejectCallback&&this._decodingBlocks[`${s}:${a}`].rejectCallback(),this._decodeThreadCount--},r.postMessage({block:c,start:s,end:a}),this._decodeThreadCount++,r.onmessage=t=>{this._frames[t.data.index]={data:t.data.data,width:n,height:e},this._decodingBlocks[`${s}:${a}`].resolveCallback&&this._decodingBlocks[`${s}:${a}`].resolveCallback(t.data.index),t.data.index in this._promisedFrames&&(this._promisedFrames[t.data.index].resolve(this._frames[t.data.index]),delete this._promisedFrames[t.data.index]),t.data.isEnd&&(delete this._decodingBlocks[`${s}:${a}`],this._decodeThreadCount--)},t()}}get decodeThreadCount(){return this._decodeThreadCount}get cachedFrames(){return[...this._blocks_ranges].sort((t,e)=>t.split(":")[0]-e.split(":")[0])}},BlockType:o}},function(t,e,n){var r=n(16),i=n(38),o="".split;t.exports=r((function(){return!Object("z").propertyIsEnumerable(0)}))?function(t){return"String"==i(t)?o.call(t,""):Object(t)}:Object},function(t,e,n){var r=n(8),i=n(123),o=n(19),s=r("unscopables"),a=Array.prototype;null==a[s]&&o(a,s,i(null)),t.exports=function(t){a[s][t]=!0}},function(t,e,n){var r=n(1),i=n(73),o=r["__core-js_shared__"]||i("__core-js_shared__",{});t.exports=o},function(t,e,n){var r=n(16);t.exports=!!Object.getOwnPropertySymbols&&!r((function(){return!String(Symbol())}))},function(t,e,n){var r=n(28),i=n(39),o=n(17),s=n(211);t.exports=r?Object.defineProperties:function(t,e){o(t);for(var n,r=s(e),a=r.length,c=0;a>c;)i.f(t,n=r[c++],e[n]);return t}},function(t,e,n){var r=n(124),i=n(77);t.exports=Object.keys||function(t){return r(t,i)}},function(t,e,n){var r=n(50),i=n(125),o=n(213),s=function(t){return function(e,n,s){var a,c=r(e),u=i(c.length),l=o(s,u);if(t&&n!=n){for(;u>l;)if((a=c[l++])!=a)return!0}else for(;u>l;l++)if((t||l in c)&&c[l]===n)return t||l||0;return!t&&-1}};t.exports={includes:s(!0),indexOf:s(!1)}},function(t,e,n){var r=n(126),i=Math.max,o=Math.min;t.exports=function(t,e){var n=r(t);return n<0?i(n+e,0):o(n,e)}},function(t,e,n){var r=n(1),i=n(129),o=r.WeakMap;t.exports="function"==typeof o&&/native code/.test(i.call(o))},function(t,e,n){"use strict";var r=n(80),i=n(221),o=n(132),s=n(223),a=n(82),c=n(19),u=n(54),l=n(8),f=n(52),p=n(40),h=n(131),d=h.IteratorPrototype,b=h.BUGGY_SAFARI_ITERATORS,m=l("iterator"),g=function(){return this};t.exports=function(t,e,n,l,h,v,y){i(n,e,l);var w,k,x,O=function(t){if(t===h&&T)return T;if(!b&&t in _)return _[t];switch(t){case"keys":case"values":case"entries":return function(){return new n(this,t)}}return function(){return new n(this)}},j=e+" Iterator",S=!1,_=t.prototype,A=_[m]||_["@@iterator"]||h&&_[h],T=!b&&A||O(h),P="Array"==e&&_.entries||A;if(P&&(w=o(P.call(new t)),d!==Object.prototype&&w.next&&(f||o(w)===d||(s?s(w,d):"function"!=typeof w[m]&&c(w,m,g)),a(w,j,!0,!0),f&&(p[j]=g))),"values"==h&&A&&"values"!==A.name&&(S=!0,T=function(){return A.call(this)}),f&&!y||_[m]===T||c(_,m,T),p[e]=T,h)if(k={values:O("values"),keys:v?T:O("keys"),entries:O("entries")},y)for(x in k)!b&&!S&&x in _||u(_,x,k[x]);else r({target:e,proto:!0,forced:b||S},k);return k}},function(t,e,n){"use strict";var r={}.propertyIsEnumerable,i=Object.getOwnPropertyDescriptor,o=i&&!r.call({1:2},1);e.f=o?function(t){var e=i(this,t);return!!e&&e.enumerable}:r},function(t,e,n){var r=n(20),i=n(218),o=n(81),s=n(39);t.exports=function(t,e){for(var n=i(e),a=s.f,c=o.f,u=0;us;){var a,c,u,l=r[s++],f=o?l.ok:l.fail,p=l.resolve,h=l.reject,d=l.domain;try{f?(o||(2===e.rejection&&et(t,e),e.rejection=1),!0===f?a=i:(d&&d.enter(),a=f(i),d&&(d.exit(),u=!0)),a===l.promise?h($("Promise-chain cycle")):(c=K(a))?c.call(a,p,h):p(a)):h(i)}catch(t){d&&!u&&d.exit(),h(t)}}e.reactions=[],e.notified=!1,n&&!e.rejection&&Q(t,e)}))}},Y=function(t,e,n){var r,i;V?((r=B.createEvent("Event")).promise=e,r.reason=n,r.initEvent(t,!1,!0),u.dispatchEvent(r)):r={promise:e,reason:n},(i=u["on"+t])?i(r):"unhandledrejection"===t&&_("Unhandled promise rejection",n)},Q=function(t,e){O.call(u,(function(){var n,r=e.value;if(tt(e)&&(n=T((function(){J?U.emit("unhandledRejection",r,t):Y("unhandledrejection",t,r)})),e.rejection=J||tt(e)?2:1,n.error))throw n.value}))},tt=function(t){return 1!==t.rejection&&!t.parent},et=function(t,e){O.call(u,(function(){J?U.emit("rejectionHandled",t):Y("rejectionhandled",t,e.value)}))},nt=function(t,e,n,r){return function(i){t(e,n,i,r)}},rt=function(t,e,n,r){e.done||(e.done=!0,r&&(e=r),e.value=n,e.state=2,Z(t,e,!0))},it=function(t,e,n,r){if(!e.done){e.done=!0,r&&(e=r);try{if(t===n)throw $("Promise can't be resolved itself");var i=K(n);i?j((function(){var r={done:!1};try{i.call(n,nt(it,t,r,e),nt(rt,t,r,e))}catch(n){rt(t,r,n,e)}})):(e.value=n,e.state=1,Z(t,e,!1))}catch(n){rt(t,{done:!1},n,e)}}};H&&(D=function(t){v(this,D,F),g(t),r.call(this);var e=M(this);try{t(nt(it,this,e),nt(rt,this,e))}catch(t){rt(this,e,t)}},(r=function(t){N(this,{type:F,done:!1,notified:!1,parent:!1,reactions:[],rejection:!1,state:0,value:void 0})}).prototype=h(D.prototype,{then:function(t,e){var n=R(this),r=W(x(this,D));return r.ok="function"!=typeof t||t,r.fail="function"==typeof e&&e,r.domain=J?U.domain:void 0,n.parent=!0,n.reactions.push(r),0!=n.state&&Z(this,n,!1),r.promise},catch:function(t){return this.then(void 0,t)}}),i=function(){var t=new r,e=M(t);this.promise=t,this.resolve=nt(it,t,e),this.reject=nt(rt,t,e)},A.f=W=function(t){return t===D||t===o?new i(t):G(t)},c||"function"!=typeof f||(s=f.prototype.then,p(f.prototype,"then",(function(t,e){var n=this;return new D((function(t,e){s.call(n,t,e)})).then(t,e)}),{unsafe:!0}),"function"==typeof L&&a({global:!0,enumerable:!0,forced:!0},{fetch:function(t){return S(D,L.apply(u,arguments))}}))),a({global:!0,wrap:!0,forced:H},{Promise:D}),d(D,F,!1,!0),b(F),o=l.Promise,a({target:F,stat:!0,forced:H},{reject:function(t){var e=W(this);return e.reject.call(void 0,t),e.promise}}),a({target:F,stat:!0,forced:c||H},{resolve:function(t){return S(c&&this===o?D:this,t)}}),a({target:F,stat:!0,forced:X},{all:function(t){var e=this,n=W(e),r=n.resolve,i=n.reject,o=T((function(){var n=g(e.resolve),o=[],s=0,a=1;w(t,(function(t){var c=s++,u=!1;o.push(void 0),a++,n.call(e,t).then((function(t){u||(u=!0,o[c]=t,--a||r(o))}),i)})),--a||r(o)}));return o.error&&i(o.value),n.promise},race:function(t){var e=this,n=W(e),r=n.reject,i=T((function(){var i=g(e.resolve);w(t,(function(t){i.call(e,t).then(n.resolve,r)}))}));return i.error&&r(i.value),n.promise}})},function(t,e,n){var r=n(1);t.exports=r.Promise},function(t,e,n){var r=n(54);t.exports=function(t,e,n){for(var i in e)r(t,i,e[i],n);return t}},function(t,e,n){"use strict";var r=n(53),i=n(39),o=n(8),s=n(28),a=o("species");t.exports=function(t){var e=r(t),n=i.f;s&&e&&!e[a]&&n(e,a,{configurable:!0,get:function(){return this}})}},function(t,e){t.exports=function(t,e,n){if(!(t instanceof e))throw TypeError("Incorrect "+(n?n+" ":"")+"invocation");return t}},function(t,e,n){var r=n(17),i=n(233),o=n(125),s=n(134),a=n(234),c=n(236),u=function(t,e){this.stopped=t,this.result=e};(t.exports=function(t,e,n,l,f){var p,h,d,b,m,g,v,y=s(e,n,l?2:1);if(f)p=t;else{if("function"!=typeof(h=a(t)))throw TypeError("Target is not iterable");if(i(h)){for(d=0,b=o(t.length);b>d;d++)if((m=l?y(r(v=t[d])[0],v[1]):y(t[d]))&&m instanceof u)return m;return new u(!1)}p=h.call(t)}for(g=p.next;!(v=g.call(p)).done;)if("object"==typeof(m=c(p,y,v.value,l))&&m&&m instanceof u)return m;return new u(!1)}).stop=function(t){return new u(!0,t)}},function(t,e,n){var r=n(8),i=n(40),o=r("iterator"),s=Array.prototype;t.exports=function(t){return void 0!==t&&(i.Array===t||s[o]===t)}},function(t,e,n){var r=n(235),i=n(40),o=n(8)("iterator");t.exports=function(t){if(null!=t)return t[o]||t["@@iterator"]||i[r(t)]}},function(t,e,n){var r=n(38),i=n(8)("toStringTag"),o="Arguments"==r(function(){return arguments}());t.exports=function(t){var e,n,s;return void 0===t?"Undefined":null===t?"Null":"string"==typeof(n=function(t,e){try{return t[e]}catch(t){}}(e=Object(t),i))?n:o?r(e):"Object"==(s=r(e))&&"function"==typeof e.callee?"Arguments":s}},function(t,e,n){var r=n(17);t.exports=function(t,e,n,i){try{return i?e(r(n)[0],n[1]):e(n)}catch(e){var o=t.return;throw void 0!==o&&r(o.call(t)),e}}},function(t,e,n){var r=n(8)("iterator"),i=!1;try{var o=0,s={next:function(){return{done:!!o++}},return:function(){i=!0}};s[r]=function(){return this},Array.from(s,(function(){throw 2}))}catch(t){}t.exports=function(t,e){if(!e&&!i)return!1;var n=!1;try{var o={};o[r]=function(){return{next:function(){return{done:n=!0}}}},t(o)}catch(t){}return n}},function(t,e,n){var r=n(17),i=n(41),o=n(8)("species");t.exports=function(t,e){var n,s=r(t).constructor;return void 0===s||null==(n=r(s)[o])?e:i(n)}},function(t,e,n){var r,i,o,s,a,c,u,l,f=n(1),p=n(81).f,h=n(38),d=n(135).set,b=n(83),m=f.MutationObserver||f.WebKitMutationObserver,g=f.process,v=f.Promise,y="process"==h(g),w=p(f,"queueMicrotask"),k=w&&w.value;k||(r=function(){var t,e;for(y&&(t=g.domain)&&t.exit();i;){e=i.fn,i=i.next;try{e()}catch(t){throw i?s():o=void 0,t}}o=void 0,t&&t.enter()},y?s=function(){g.nextTick(r)}:m&&!/(iphone|ipod|ipad).*applewebkit/i.test(b)?(a=!0,c=document.createTextNode(""),new m(r).observe(c,{characterData:!0}),s=function(){c.data=a=!a}):v&&v.resolve?(u=v.resolve(void 0),l=u.then,s=function(){l.call(u,r)}):s=function(){d.call(f,r)}),t.exports=k||function(t){var e={fn:t,next:void 0};o&&(o.next=e),i||(i=e,s()),o=e}},function(t,e,n){var r=n(17),i=n(22),o=n(136);t.exports=function(t,e){if(r(t),i(e)&&e.constructor===t)return e;var n=o.f(t);return(0,n.resolve)(e),n.promise}},function(t,e,n){var r=n(1);t.exports=function(t,e){var n=r.console;n&&n.error&&(1===arguments.length?n.error(t):n.error(t,e))}},function(t,e){t.exports=function(t){try{return{error:!1,value:t()}}catch(t){return{error:!0,value:t}}}},function(t,e,n){var r=n(1),i=n(244),o=n(72),s=n(19),a=n(8),c=a("iterator"),u=a("toStringTag"),l=o.values;for(var f in i){var p=r[f],h=p&&p.prototype;if(h){if(h[c]!==l)try{s(h,c,l)}catch(t){h[c]=l}if(h[u]||s(h,u,f),i[f])for(var d in o)if(h[d]!==o[d])try{s(h,d,o[d])}catch(t){h[d]=o[d]}}}},function(t,e){t.exports={CSSRuleList:0,CSSStyleDeclaration:0,CSSValueList:0,ClientRectList:0,DOMRectList:0,DOMStringList:0,DOMTokenList:1,DataTransferItemList:0,FileList:0,HTMLAllCollection:0,HTMLCollection:0,HTMLFormElement:0,HTMLSelectElement:0,MediaList:0,MimeTypeArray:0,NamedNodeMap:0,NodeList:1,PaintRequestList:0,Plugin:0,PluginArray:0,SVGLengthList:0,SVGNumberList:0,SVGPathSegList:0,SVGPointList:0,SVGStringList:0,SVGTransformList:0,SourceBufferList:0,StyleSheetList:0,TextTrackCueList:0,TextTrackList:0,TouchList:0}},function(t,e,n){n(72),t.exports=function(){"use strict";function t(t,e){t||error(e)}var e,n,r=function(){function t(t,e){this.w=t,this.h=e}return t.prototype={toString:function(){return"("+this.w+", "+this.h+")"},getHalfSize:function(){return new r(this.w>>>1,this.h>>>1)},length:function(){return this.w*this.h}},t}(),i=function(){function e(t,e,n){this.bytes=new Uint8Array(t),this.start=e||0,this.pos=this.start,this.end=e+n||this.bytes.length}return e.prototype={get length(){return this.end-this.start},get position(){return this.pos},get remaining(){return this.end-this.pos},readU8Array:function(t){if(this.pos>this.end-t)return null;var e=this.bytes.subarray(this.pos,this.pos+t);return this.pos+=t,e},readU32Array:function(t,e,n){if(e=e||1,this.pos>this.end-t*e*4)return null;if(1==e){for(var r=new Uint32Array(t),i=0;i>24},readU8:function(){return this.pos>=this.end?null:this.bytes[this.pos++]},read16:function(){return this.readU16()<<16>>16},readU16:function(){if(this.pos>=this.end-1)return null;var t=this.bytes[this.pos+0]<<8|this.bytes[this.pos+1];return this.pos+=2,t},read24:function(){return this.readU24()<<8>>8},readU24:function(){var t=this.pos,e=this.bytes;if(t>this.end-3)return null;var n=e[t+0]<<16|e[t+1]<<8|e[t+2];return this.pos+=3,n},peek32:function(t){var e=this.pos,n=this.bytes;if(e>this.end-4)return null;var r=n[e+0]<<24|n[e+1]<<16|n[e+2]<<8|n[e+3];return t&&(this.pos+=4),r},read32:function(){return this.peek32(!0)},readU32:function(){return this.peek32(!0)>>>0},read4CC:function(){var t=this.pos;if(t>this.end-4)return null;for(var e="",n=0;n<4;n++)e+=String.fromCharCode(this.bytes[t+n]);return this.pos+=4,e},readFP16:function(){return this.read32()/65536},readFP8:function(){return this.read16()/256},readISO639:function(){for(var t=this.readU16(),e="",n=0;n<3;n++){var r=t>>>5*(2-n)&31;e+=String.fromCharCode(r+96)}return e},readUTF8:function(t){for(var e="",n=0;nthis.end)&&error("Index out of bounds (bounds: [0, "+this.end+"], index: "+t+")."),this.pos=t},subStream:function(t,e){return new i(this.bytes.buffer,t,e)}},e}(),o=function(){function e(t){this.stream=t,this.tracks={}}return e.prototype={readBoxes:function(t,e){for(;t.peek32();){var n=this.readBox(t);if(n.type in e){var r=e[n.type];r instanceof Array||(e[n.type]=[r]),e[n.type].push(n)}else e[n.type]=n}},readBox:function(e){var n={offset:e.position};function r(){n.version=e.readU8(),n.flags=e.readU24()}function i(){return n.size-(e.position-n.offset)}function o(){e.skip(i())}var a=function(){var t=e.subStream(e.position,i());this.readBoxes(t,n),e.skip(t.length)}.bind(this);switch(n.size=e.readU32(),n.type=e.read4CC(),n.type){case"ftyp":n.name="File Type Box",n.majorBrand=e.read4CC(),n.minorVersion=e.readU32(),n.compatibleBrands=new Array((n.size-16)/4);for(var c=0;c0&&(n.name=e.readUTF8(u));break;case"minf":n.name="Media Information Box",a();break;case"stbl":n.name="Sample Table Box",a();break;case"stsd":n.name="Sample Description Box",r(),n.sd=[];e.readU32();a();break;case"avc1":e.reserved(6,0),n.dataReferenceIndex=e.readU16(),t(0==e.readU16()),t(0==e.readU16()),e.readU32(),e.readU32(),e.readU32(),n.width=e.readU16(),n.height=e.readU16(),n.horizontalResolution=e.readFP16(),n.verticalResolution=e.readFP16(),t(0==e.readU32()),n.frameCount=e.readU16(),n.compressorName=e.readPString(32),n.depth=e.readU16(),t(65535==e.readU16()),a();break;case"mp4a":e.reserved(6,0),n.dataReferenceIndex=e.readU16(),n.version=e.readU16(),e.skip(2),e.skip(4),n.channelCount=e.readU16(),n.sampleSize=e.readU16(),n.compressionId=e.readU16(),n.packetSize=e.readU16(),n.sampleRate=e.readU32()>>>16,t(0==n.version),a();break;case"esds":n.name="Elementary Stream Descriptor",r(),o();break;case"avcC":n.name="AVC Configuration Box",n.configurationVersion=e.readU8(),n.avcProfileIndication=e.readU8(),n.profileCompatibility=e.readU8(),n.avcLevelIndication=e.readU8(),n.lengthSizeMinusOne=3&e.readU8(),t(3==n.lengthSizeMinusOne,"TODO");var l=31&e.readU8();n.sps=[];for(c=0;c=8,"Cannot parse large media data yet."),n.data=e.readU8Array(i());break;default:o()}return n},read:function(){var t=(new Date).getTime();this.file={},this.readBoxes(this.stream,this.file),console.info("Parsed stream in "+((new Date).getTime()-t)+" ms")},traceSamples:function(){var t=this.tracks[1],e=this.tracks[2];console.info("Video Samples: "+t.getSampleCount()),console.info("Audio Samples: "+e.getSampleCount());for(var n=0,r=0,i=0;i<100;i++){var o=t.sampleToOffset(n),s=e.sampleToOffset(r),a=t.sampleToSize(n,1),c=e.sampleToSize(r,1);o0){var s=n[i-1],a=o.firstChunk-s.firstChunk,c=s.samplesPerChunk*a;if(!(e>=c))return{index:r+Math.floor(e/s.samplesPerChunk),offset:e%s.samplesPerChunk};if(e-=c,i==n.length-1)return{index:r+a+Math.floor(e/o.samplesPerChunk),offset:e%o.samplesPerChunk};r+=a}}t(!1)},chunkToOffset:function(t){return this.trak.mdia.minf.stbl.stco.table[t]},sampleToOffset:function(t){var e=this.sampleToChunk(t);return this.chunkToOffset(e.index)+this.sampleToSize(t-e.offset,e.offset)},timeToSample:function(t){for(var e=this.trak.mdia.minf.stbl.stts.table,n=0,r=0;r=i))return n+Math.floor(t/e[r].delta);t-=i,n+=e[r].count}},getTotalTime:function(){for(var e=this.trak.mdia.minf.stbl.stts.table,n=0,r=0;r0;){var s=new i(e.buffer,n).readU32();o.push(e.subarray(n+4,n+s+4)),n=n+s+4}return o}},e}();e=[],n="zero-timeout-message",window.addEventListener("message",(function(t){t.source==window&&t.data==n&&(t.stopPropagation(),e.length>0&&e.shift()())}),!0),window.setZeroTimeout=function(t){e.push(t),window.postMessage(n,"*")};var a=function(){function t(t,n,r,i){this.stream=t,this.useWorkers=n,this.webgl=r,this.render=i,this.statistics={videoStartTime:0,videoPictureCounter:0,windowStartTime:0,windowPictureCounter:0,fps:0,fpsMin:1e3,fpsMax:-1e3,webGLTextureUploadTime:0},this.onStatisticsUpdated=function(){},this.avc=new Player({useWorker:n,reuseMemory:!0,webgl:r,size:{width:640,height:368}}),this.webgl=this.avc.webgl;var o=this;this.avc.onPictureDecoded=function(){e.call(o)},this.canvas=this.avc.canvas}function e(){var t=this.statistics;t.videoPictureCounter+=1,t.windowPictureCounter+=1;var e=Date.now();t.videoStartTime||(t.videoStartTime=e);var n=e-t.videoStartTime;if(t.elapsed=n/1e3,!(n<1e3))if(t.windowStartTime){if(e-t.windowStartTime>1e3){var r=e-t.windowStartTime,i=t.windowPictureCounter/r*1e3;t.windowStartTime=e,t.windowPictureCounter=0,it.fpsMax&&(t.fpsMax=i),t.fps=i}i=t.videoPictureCounter/n*1e3;t.fpsSinceStart=i,this.onStatisticsUpdated(this.statistics)}else t.windowStartTime=e}return t.prototype={readAll:function(t){console.info("MP4Player::readAll()"),this.stream.readAll(null,function(e){this.reader=new o(new i(e)),this.reader.read();var n=this.reader.tracks[1];this.size=new r(n.trak.tkhd.width,n.trak.tkhd.height),console.info("MP4Player::readAll(), length: "+this.reader.stream.length),t&&t()}.bind(this))},play:function(){var t=this.reader;if(t){var e=t.tracks[1],n=(t.tracks[2],t.tracks[1].trak.mdia.minf.stbl.stsd.avc1.avcC),r=n.sps[0],i=n.pps[0];this.avc.decode(r),this.avc.decode(i);var o=0;setTimeout(function t(){var n=this.avc;e.getSampleNALUnits(o).forEach((function(t){n.decode(t)})),++o<3e3&&setTimeout(t.bind(this),1)}.bind(this),1)}else this.readAll(this.play.bind(this))}},t}(),c=function(){function t(t){var e=t.attributes.src?t.attributes.src.value:void 0,n=(t.attributes.width&&t.attributes.width.value,t.attributes.height&&t.attributes.height.value,document.createElement("div"));n.setAttribute("style","z-index: 100; position: absolute; bottom: 0px; background-color: rgba(0,0,0,0.8); height: 30px; width: 100%; text-align: left;"),this.info=document.createElement("div"),this.info.setAttribute("style","font-size: 14px; font-weight: bold; padding: 6px; color: lime;"),n.appendChild(this.info),t.appendChild(n);var r=!!t.attributes.workers&&"true"==t.attributes.workers.value,i=!!t.attributes.render&&"true"==t.attributes.render.value,o="auto";t.attributes.webgl&&("true"==t.attributes.webgl.value&&(o=!0),"false"==t.attributes.webgl.value&&(o=!1));var s="";s+=r?"worker thread ":"main thread ",this.player=new a(new Stream(e),r,o,i),this.canvas=this.player.canvas,this.canvas.onclick=function(){this.play()}.bind(this),t.appendChild(this.canvas),s+=" - webgl: "+this.player.webgl,this.info.innerHTML="Click canvas to load and play - "+s,this.score=null,this.player.onStatisticsUpdated=function(t){if(t.videoPictureCounter%10==0){var e="";t.fps&&(e+=" fps: "+t.fps.toFixed(2)),t.fpsSinceStart&&(e+=" avg: "+t.fpsSinceStart.toFixed(2));t.videoPictureCounter<1200?this.score=1200-t.videoPictureCounter:1200==t.videoPictureCounter&&(this.score=t.fpsSinceStart.toFixed(2)),this.info.innerHTML=s+e}}.bind(this)}return t.prototype={play:function(){this.player.play()}},t}();return{Size:r,Track:s,MP4Reader:o,MP4Player:a,Bytestream:i,Broadway:c}}()},function(t,e,n){"use strict";(function(t){Object.defineProperty(e,"__esModule",{value:!0});var n="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t},r="undefined"!=typeof window&&void 0!==window.document,i="object"===("undefined"==typeof self?"undefined":n(self))&&self.constructor&&"DedicatedWorkerGlobalScope"===self.constructor.name,o=void 0!==t&&null!=t.versions&&null!=t.versions.node;e.isBrowser=r,e.isWebWorker=i,e.isNode=o}).call(this,n(112))},function(t,e,n){n(5),n(11),n(10),(()=>{const e=n(26),r=n(248),i=n(251),{checkObjectType:o}=n(56),{Task:s}=n(49),{Loader:a,Dumper:c}=n(138),{ScriptingError:u,DataError:l,ArgumentError:f}=n(6),p=new WeakMap,h=new WeakMap;function d(t){if("task"===t)return h;if("job"===t)return p;throw new u(`Unknown session type was received ${t}`)}async function b(t){const n=t instanceof s?"task":"job",o=d(n);if(!o.has(t)){const s=await e.annotations.getAnnotations(n,t.id),a="job"===n?t.startFrame:0,c="job"===n?t.stopFrame:t.size-1,u={};for(let e=a;e<=c;e++)u[e]=await t.frames.get(e);const l=new r({labels:t.labels||t.task.labels,startFrame:a,stopFrame:c,frameMeta:u}).import(s),f=new i(s.version,l,t);o.set(t,{collection:l,saver:f})}}t.exports={getAnnotations:async function(t,e,n){return await b(t),d(t instanceof s?"task":"job").get(t).collection.get(e,n)},putAnnotations:function(t,e){const n=d(t instanceof s?"task":"job");if(n.has(t))return n.get(t).collection.put(e);throw new l("Collection has not been initialized yet. Call annotations.get() or annotations.clear(true) before")},saveAnnotations:async function(t,e){const n=d(t instanceof s?"task":"job");n.has(t)&&await n.get(t).saver.save(e)},hasUnsavedChanges:function(t){const e=d(t instanceof s?"task":"job");return!!e.has(t)&&e.get(t).saver.hasUnsavedChanges()},mergeAnnotations:function(t,e){const n=d(t instanceof s?"task":"job");if(n.has(t))return n.get(t).collection.merge(e);throw new l("Collection has not been initialized yet. Call annotations.get() or annotations.clear(true) before")},splitAnnotations:function(t,e,n){const r=d(t instanceof s?"task":"job");if(r.has(t))return r.get(t).collection.split(e,n);throw new l("Collection has not been initialized yet. Call annotations.get() or annotations.clear(true) before")},groupAnnotations:function(t,e,n){const r=d(t instanceof s?"task":"job");if(r.has(t))return r.get(t).collection.group(e,n);throw new l("Collection has not been initialized yet. Call annotations.get() or annotations.clear(true) before")},clearAnnotations:async function(t,e){o("reload",e,"boolean",null);const n=d(t instanceof s?"task":"job");n.has(t)&&n.get(t).collection.clear(),e&&(n.delete(t),await b(t))},annotationsStatistics:function(t){const e=d(t instanceof s?"task":"job");if(e.has(t))return e.get(t).collection.statistics();throw new l("Collection has not been initialized yet. Call annotations.get() or annotations.clear(true) before")},selectObject:function(t,e,n,r){const i=d(t instanceof s?"task":"job");if(i.has(t))return i.get(t).collection.select(e,n,r);throw new l("Collection has not been initialized yet. Call annotations.get() or annotations.clear(true) before")},uploadAnnotations:async function(t,n,r){const i=t instanceof s?"task":"job";if(!(r instanceof a))throw new f("A loader must be instance of Loader class");await e.annotations.uploadAnnotations(i,t.id,n,r.name)},dumpAnnotations:async function(t,n,r){if(!(r instanceof c))throw new f("A dumper must be instance of Dumper class");let i=null;return i="job"===(t instanceof s?"task":"job")?await e.annotations.dumpAnnotations(t.task.id,n,r.name):await e.annotations.dumpAnnotations(t.id,n,r.name)},exportDataset:async function(t,n){if(!(n instanceof String||"string"==typeof n))throw new f("Format must be a string");if(!(t instanceof s))throw new f("A dataset can only be created from a task");let r=null;return r=await e.tasks.exportDataset(t.id,n)}}})()},function(t,e,n){n(5),n(137),n(10),n(71),(()=>{const{RectangleShape:e,PolygonShape:r,PolylineShape:i,PointsShape:o,RectangleTrack:s,PolygonTrack:a,PolylineTrack:c,PointsTrack:u,Track:l,Shape:f,Tag:p,objectStateFactory:h}=n(250),{checkObjectType:d}=n(56),b=n(117),{Label:m}=n(55),{DataError:g,ArgumentError:v,ScriptingError:y}=n(6),{ObjectShape:w,ObjectType:k}=n(29),x=n(70),O=["#0066FF","#AF593E","#01A368","#FF861F","#ED0A3F","#FF3F34","#76D7EA","#8359A3","#FBE870","#C5E17A","#03BB85","#FFDF00","#8B8680","#0A6B0D","#8FD8D8","#A36F40","#F653A6","#CA3435","#FFCBA4","#FF99CC","#FA9D5A","#FFAE42","#A78B00","#788193","#514E49","#1164B4","#F4FA9F","#FED8B1","#C32148","#01796F","#E90067","#FF91A4","#404E5A","#6CDAE7","#FFC1CC","#006A93","#867200","#E2B631","#6EEB6E","#FFC800","#CC99BA","#FF007C","#BC6CAC","#DCCCD7","#EBE1C2","#A6AAAE","#B99685","#0086A7","#5E4330","#C8A2C8","#708EB3","#BC8777","#B2592D","#497E48","#6A2963","#E6335F","#00755E","#B5A895","#0048ba","#EED9C4","#C88A65","#FF6E4A","#87421F","#B2BEB5","#926F5B","#00B9FB","#6456B7","#DB5079","#C62D42","#FA9C44","#DA8A67","#FD7C6E","#93CCEA","#FCF686","#503E32","#FF5470","#9DE093","#FF7A00","#4F69C6","#A50B5E","#F0E68C","#FDFF00","#F091A9","#FFFF66","#6F9940","#FC74FD","#652DC1","#D6AEDD","#EE34D2","#BB3385","#6B3FA0","#33CC99","#FFDB00","#87FF2A","#6EEB6E","#FFC800","#CC99BA","#7A89B8","#006A93","#867200","#E2B631","#D9D6CF"];function j(t,n,s){const{type:a}=t,c=O[n%O.length];let u=null;switch(a){case"rectangle":u=new e(t,n,c,s);break;case"polygon":u=new r(t,n,c,s);break;case"polyline":u=new i(t,n,c,s);break;case"points":u=new o(t,n,c,s);break;default:throw new g(`An unexpected type of shape "${a}"`)}return u}function S(t,e,n){if(t.shapes.length){const{type:r}=t.shapes[0],i=O[e%O.length];let o=null;switch(r){case"rectangle":o=new s(t,e,i,n);break;case"polygon":o=new a(t,e,i,n);break;case"polyline":o=new c(t,e,i,n);break;case"points":o=new u(t,e,i,n);break;default:throw new g(`An unexpected type of track "${r}"`)}return o}return console.warn("The track without any shapes had been found. It was ignored."),null}t.exports=class{constructor(t){this.startFrame=t.startFrame,this.stopFrame=t.stopFrame,this.frameMeta=t.frameMeta,this.labels=t.labels.reduce((t,e)=>(t[e.id]=e,t),{}),this.shapes={},this.tags={},this.tracks=[],this.objects={},this.count=0,this.flush=!1,this.collectionZ={},this.groups={max:0},this.injection={labels:this.labels,collectionZ:this.collectionZ,groups:this.groups,frameMeta:this.frameMeta}}import(t){for(const e of t.tags){const t=++this.count,n=new p(e,t,this.injection);this.tags[n.frame]=this.tags[n.frame]||[],this.tags[n.frame].push(n),this.objects[t]=n}for(const e of t.shapes){const t=++this.count,n=j(e,t,this.injection);this.shapes[n.frame]=this.shapes[n.frame]||[],this.shapes[n.frame].push(n),this.objects[t]=n}for(const e of t.tracks){const t=++this.count,n=S(e,t,this.injection);n&&(this.tracks.push(n),this.objects[t]=n)}return this}export(){return{tracks:this.tracks.filter(t=>!t.removed).map(t=>t.toJSON()),shapes:Object.values(this.shapes).reduce((t,e)=>(t.push(...e),t),[]).filter(t=>!t.removed).map(t=>t.toJSON()),tags:Object.values(this.tags).reduce((t,e)=>(t.push(...e),t),[]).filter(t=>!t.removed).map(t=>t.toJSON())}}get(t){const{tracks:e}=this,n=this.shapes[t]||[],r=this.tags[t]||[],i=e.concat(n).concat(r).filter(t=>!t.removed),o=[];for(const e of i){const n=e.get(t);if(n.outside&&!n.keyframe)continue;const r=h.call(e,t,n);o.push(r)}return o}merge(t){if(d("shapes for merge",t,null,Array),!t.length)return;const e=t.map(t=>{d("object state",t,null,x);const e=this.objects[t.clientID];if(void 0===e)throw new v("The object has not been saved yet. Call ObjectState.put([state]) before you can merge it");return e}),n={},{label:r,shapeType:i}=t[0];if(!(r.id in this.labels))throw new v(`Unknown label for the task: ${r.id}`);if(!Object.values(w).includes(i))throw new v(`Got unknown shapeType "${i}"`);const o=r.attributes.reduce((t,e)=>(t[e.id]=e,t),{});for(let s=0;s(e in o&&o[e].mutable&&t.push({spec_id:+e,value:a.attributes[e]}),t),[])},a.frame+1 in n||(n[a.frame+1]=JSON.parse(JSON.stringify(n[a.frame])),n[a.frame+1].outside=!0,n[a.frame+1].frame++)}else{if(!(a instanceof l))throw new v(`Trying to merge unknown object type: ${a.constructor.name}. `+"Only shapes and tracks are expected.");{const t={};for(const e of Object.keys(a.shapes)){const r=a.shapes[e];if(e in n&&!n[e].outside){if(r.outside)continue;throw new v("Expected only one visible shape per frame")}let o=!1;for(const e in r.attributes)e in t&&t[e]===r.attributes[e]||(o=!0,t[e]=r.attributes[e]);n[e]={type:i,frame:+e,points:[...r.points],occluded:r.occluded,outside:r.outside,zOrder:r.zOrder,attributes:o?Object.keys(t).reduce((e,n)=>(e.push({spec_id:+n,value:t[n]}),e),[]):[]}}}}}let s=!1;for(const t of Object.keys(n).sort((t,e)=>+t-+e)){if((s=s||n[t].outside)||!n[t].outside)break;delete n[t]}const a=++this.count,c=S({frame:Math.min.apply(null,Object.keys(n).map(t=>+t)),shapes:Object.values(n),group:0,label_id:r.id,attributes:Object.keys(t[0].attributes).reduce((e,n)=>(o[n].mutable||e.push({spec_id:+n,value:t[0].attributes[n]}),e),[])},a,this.injection);this.tracks.push(c),this.objects[a]=c;for(const t of e)t.removed=!0,"function"==typeof t.resetCache&&t.resetCache()}split(t,e){d("object state",t,null,x),d("frame",e,"integer",null);const n=this.objects[t.clientID];if(void 0===n)throw new v("The object has not been saved yet. Call annotations.put([state]) before");if(t.objectType!==k.TRACK)return;const r=Object.keys(n.shapes).sort((t,e)=>+t-+e);if(e<=+r[0]||e>r[r.length-1])return;const i=n.label.attributes.reduce((t,e)=>(t[e.id]=e,t),{}),o=n.toJSON(),s={type:t.shapeType,points:[...t.points],occluded:t.occluded,outside:t.outside,zOrder:0,attributes:Object.keys(t.attributes).reduce((e,n)=>(i[n].mutable||e.push({spec_id:+n,value:t.attributes[n]}),e),[]),frame:e},a={frame:o.frame,group:0,label_id:o.label_id,attributes:o.attributes,shapes:[]},c=JSON.parse(JSON.stringify(a));c.frame=e,c.shapes.push(JSON.parse(JSON.stringify(s))),o.shapes.map(t=>(delete t.id,t.framee&&c.shapes.push(JSON.parse(JSON.stringify(t))),t)),a.shapes.push(s),a.shapes[a.shapes.length-1].outside=!0;let u=++this.count;const l=S(a,u,this.injection);this.tracks.push(l),this.objects[u]=l,u=++this.count;const f=S(c,u,this.injection);this.tracks.push(f),this.objects[u]=f,n.removed=!0,n.resetCache()}group(t,e){d("shapes for group",t,null,Array);const n=t.map(t=>{d("object state",t,null,x);const e=this.objects[t.clientID];if(void 0===e)throw new v("The object has not been saved yet. Call annotations.put([state]) before");return e}),r=e?0:++this.groups.max;for(const t of n)t.group=r,"function"==typeof t.resetCache&&t.resetCache();return r}clear(){this.shapes={},this.tags={},this.tracks=[],this.objects={},this.count=0,this.flush=!0}statistics(){const t={},e={rectangle:{shape:0,track:0},polygon:{shape:0,track:0},polyline:{shape:0,track:0},points:{shape:0,track:0},tags:0,manually:0,interpolated:0,total:0},n=JSON.parse(JSON.stringify(e));for(const n of Object.values(this.labels)){const{name:r}=n;t[r]=JSON.parse(JSON.stringify(e))}for(const e of Object.values(this.objects)){let n=null;if(e instanceof f)n="shape";else if(e instanceof l)n="track";else{if(!(e instanceof p))throw new y(`Unexpected object type: "${n}"`);n="tag"}const r=e.label.name;if("tag"===n)t[r].tags++,t[r].manually++,t[r].total++;else{const{shapeType:i}=e;if(t[r][i][n]++,"track"===n){const n=Object.keys(e.shapes).sort((t,e)=>+t-+e).map(t=>+t);let i=n[0],o=!1;for(const s of n){if(o){const e=s-i-1;t[r].interpolated+=e,t[r].total+=e}o=!e.shapes[s].outside,i=s,o&&(t[r].manually++,t[r].total++)}const s=n[n.length-1];if(s!==this.stopFrame&&!e.shapes[s].outside){const e=this.stopFrame-s;t[r].interpolated+=e,t[r].total+=e}}else t[r].manually++,t[r].total++}}for(const e of Object.keys(t))for(const r of Object.keys(t[e]))if("object"==typeof t[e][r])for(const i of Object.keys(t[e][r]))n[r][i]+=t[e][r][i];else n[r]+=t[e][r];return new b(t,n)}put(t){d("shapes for put",t,null,Array);const e={shapes:[],tracks:[],tags:[]};function n(t,e){const n=+e,r=this.attributes[e];return d("attribute id",n,"integer",null),d("attribute value",r,"string",null),t.push({spec_id:n,value:r}),t}for(const r of t){d("object state",r,null,x),d("state client ID",r.clientID,"undefined",null),d("state frame",r.frame,"integer",null),d("state attributes",r.attributes,null,Object),d("state label",r.label,null,m);const t=Object.keys(r.attributes).reduce(n.bind(r),[]),i=r.label.attributes.reduce((t,e)=>(t[e.id]=e,t),{});if("tag"===r.objectType)e.tags.push({attributes:t,frame:r.frame,label_id:r.label.id,group:0});else{d("state occluded",r.occluded,"boolean",null),d("state points",r.points,null,Array);for(const t of r.points)d("point coordinate",t,"number",null);if(!Object.values(w).includes(r.shapeType))throw new v("Object shape must be one of: "+`${JSON.stringify(Object.values(w))}`);if("shape"===r.objectType)e.shapes.push({attributes:t,frame:r.frame,group:0,label_id:r.label.id,occluded:r.occluded||!1,points:[...r.points],type:r.shapeType,z_order:0});else{if("track"!==r.objectType)throw new v("Object type must be one of: "+`${JSON.stringify(Object.values(k))}`);e.tracks.push({attributes:t.filter(t=>!i[t.spec_id].mutable),frame:r.frame,group:0,label_id:r.label.id,shapes:[{attributes:t.filter(t=>i[t.spec_id].mutable),frame:r.frame,occluded:r.occluded||!1,outside:!1,points:[...r.points],type:r.shapeType,z_order:0}]})}}}this.import(e)}select(t,e,n){d("shapes for select",t,null,Array),d("x coordinate",e,"number",null),d("y coordinate",n,"number",null);let r=null,i=null;for(const o of t){if(d("object state",o,null,x),o.outside)continue;const t=this.objects[o.clientID];if(void 0===t)throw new v("The object has not been saved yet. Call annotations.put([state]) before");const s=t.constructor.distance(o.points,e,n);null!==s&&(null===r||s{const e=n(70),{checkObjectType:r,isEnum:o}=n(56),{ObjectShape:s,ObjectType:a,AttributeType:c,VisibleState:u}=n(29),{DataError:l,ArgumentError:f,ScriptingError:p}=n(6),{Label:h}=n(55);function d(t,n){const r=new e(n);return r.hidden={save:this.save.bind(this,t,r),delete:this.delete.bind(this),up:this.up.bind(this,t,r),down:this.down.bind(this,t,r)},r}function b(t,e){if(t===s.RECTANGLE){if(e.length/2!=2)throw new l(`Rectangle must have 2 points, but got ${e.length/2}`)}else if(t===s.POLYGON){if(e.length/2<3)throw new l(`Polygon must have at least 3 points, but got ${e.length/2}`)}else if(t===s.POLYLINE){if(e.length/2<2)throw new l(`Polyline must have at least 2 points, but got ${e.length/2}`)}else{if(t!==s.POINTS)throw new f(`Unknown value of shapeType has been recieved ${t}`);if(e.length/2<1)throw new l(`Points must have at least 1 points, but got ${e.length/2}`)}}function m(t,e){if(t===s.POINTS)return!0;let n=Number.MAX_SAFE_INTEGER,r=Number.MIN_SAFE_INTEGER,i=Number.MAX_SAFE_INTEGER,o=Number.MIN_SAFE_INTEGER;for(let t=0;t=3}return(r-n)*(o-i)>=9}function g(t,e){const{values:n}=e,r=e.inputType;if("string"!=typeof t)throw new f(`Attribute value is expected to be string, but got ${typeof t}`);return r===c.NUMBER?+t>=+n[0]&&+t<=+n[1]&&!((+t-+n[0])%+n[2]):r===c.CHECKBOX?["true","false"].includes(t.toLowerCase()):n.includes(t)}class v{constructor(t,e,n){this.taskLabels=n.labels,this.clientID=e,this.serverID=t.id,this.group=t.group,this.label=this.taskLabels[t.label_id],this.frame=t.frame,this.removed=!1,this.lock=!1,this.attributes=t.attributes.reduce((t,e)=>(t[e.spec_id]=e.value,t),{}),this.appendDefaultAttributes(this.label),n.groups.max=Math.max(n.groups.max,this.group)}appendDefaultAttributes(t){const e=t.attributes;for(const t of e)t.id in this.attributes||(this.attributes[t.id]=t.defaultValue)}delete(t){return this.lock&&!t||(this.removed=!0),!0}}class y extends v{constructor(t,e,n,r){super(t,e,r),this.frameMeta=r.frameMeta,this.collectionZ=r.collectionZ,this.visibility=u.SHAPE,this.color=n,this.shapeType=null}_getZ(t){return this.collectionZ[t]=this.collectionZ[t]||{max:0,min:0},this.collectionZ[t]}save(){throw new p("Is not implemented")}get(){throw new p("Is not implemented")}toJSON(){throw new p("Is not implemented")}up(t,e){const n=this._getZ(t);n.max++,e.zOrder=n.max}down(t,e){const n=this._getZ(t);n.min--,e.zOrder=n.min}}class w extends y{constructor(t,e,n,r){super(t,e,n,r),this.points=t.points,this.occluded=t.occluded,this.zOrder=t.z_order;const i=this._getZ(this.frame);i.max=Math.max(i.max,this.zOrder||0),i.min=Math.min(i.min,this.zOrder||0)}toJSON(){return{type:this.shapeType,clientID:this.clientID,occluded:this.occluded,z_order:this.zOrder,points:[...this.points],attributes:Object.keys(this.attributes).reduce((t,e)=>(t.push({spec_id:e,value:this.attributes[e]}),t),[]),id:this.serverID,frame:this.frame,label_id:this.label.id,group:this.group}}get(t){if(t!==this.frame)throw new p("Got frame is not equal to the frame of the shape");return{objectType:a.SHAPE,shapeType:this.shapeType,clientID:this.clientID,serverID:this.serverID,occluded:this.occluded,lock:this.lock,zOrder:this.zOrder,points:[...this.points],attributes:i({},this.attributes),label:this.label,group:this.group,color:this.color,visibility:this.visibility}}save(t,e){if(t!==this.frame)throw new p("Got frame is not equal to the frame of the shape");if(this.lock&&e.lock)return d.call(this,t,this.get(t));const n=this.get(t),i=e.updateFlags;if(i.label&&(r("label",e.label,null,h),n.label=e.label,n.attributes={},this.appendDefaultAttributes.call(n,n.label)),i.attributes){const t=n.label.attributes.reduce((t,e)=>(t[e.id]=e,t),{});for(const r of Object.keys(e.attributes)){const i=e.attributes[r];if(!(r in t&&g(i,t[r])))throw new f(`Trying to save unknown attribute with id ${r} and value ${i}`);n.attributes[r]=i}}if(i.points){r("points",e.points,null,Array),b(this.shapeType,e.points);const{width:i,height:o}=this.frameMeta[t],s=[];for(let t=0;t{t[e.frame]={serverID:e.id,occluded:e.occluded,zOrder:e.z_order,points:e.points,outside:e.outside,attributes:e.attributes.reduce((t,e)=>(t[e.spec_id]=e.value,t),{})};const n=this._getZ(e.frame);return n.max=Math.max(n.max,e.z_order),n.min=Math.min(n.min,e.z_order),t},{}),this.cache={}}toJSON(){const t=this.label.attributes.reduce((t,e)=>(t[e.id]=e,t),{});return{clientID:this.clientID,id:this.serverID,frame:this.frame,label_id:this.label.id,group:this.group,attributes:Object.keys(this.attributes).reduce((e,n)=>(t[n].mutable||e.push({spec_id:n,value:this.attributes[n]}),e),[]),shapes:Object.keys(this.shapes).reduce((e,n)=>(e.push({type:this.shapeType,occluded:this.shapes[n].occluded,z_order:this.shapes[n].zOrder,points:[...this.shapes[n].points],outside:this.shapes[n].outside,attributes:Object.keys(this.shapes[n].attributes).reduce((e,r)=>(t[r].mutable&&e.push({spec_id:r,value:this.shapes[n].attributes[r]}),e),[]),id:this.shapes[n].serverID,frame:+n}),e),[])}}get(t){if(!(t in this.cache)){const e=Object.assign({},this.getPosition(t),{attributes:this.getAttributes(t),group:this.group,objectType:a.TRACK,shapeType:this.shapeType,clientID:this.clientID,serverID:this.serverID,lock:this.lock,color:this.color,visibility:this.visibility});this.cache[t]=e}const e=JSON.parse(JSON.stringify(this.cache[t]));return e.label=this.label,e}neighborsFrames(t){const e=Object.keys(this.shapes).map(t=>+t);let n=Number.MAX_SAFE_INTEGER,r=Number.MAX_SAFE_INTEGER;for(const i of e){const e=Math.abs(t-i);i<=t&&e+t-+e);for(const r of n)if(r<=t){const{attributes:t}=this.shapes[r];for(const n in t)Object.prototype.hasOwnProperty.call(t,n)&&(e[n]=t[n])}return e}save(t,e){if(this.lock&&e.lock)return d.call(this,t,this.get(t));const n=Object.assign(this.get(t));n.attributes=Object.assign(n.attributes),n.points=[...n.points];const i=e.updateFlags;let s=!1;i.label&&(r("label",e.label,null,h),n.label=e.label,n.attributes={},this.appendDefaultAttributes.call(n,n.label));const a=n.label.attributes.reduce((t,e)=>(t[e.id]=e,t),{});if(i.attributes)for(const t of Object.keys(e.attributes)){const r=e.attributes[t];if(!(t in a&&g(r,a[t])))throw new f(`Trying to save unknown attribute with id ${t} and value ${r}`);n.attributes[t]=r}if(i.points){r("points",e.points,null,Array),b(this.shapeType,e.points);const{width:i,height:o}=this.frameMeta[t],a=[];for(let t=0;tt&&delete this.cache[e];return this.cache[t].keyframe=!1,delete this.shapes[t],i.reset(),d.call(this,t,this.get(t))}if(s||i.keyframe&&e.keyframe){for(const e in this.cache)+e>t&&delete this.cache[e];if(this.cache[t].keyframe=!0,e.keyframe=!0,this.shapes[t]={frame:t,zOrder:n.zOrder,points:n.points,outside:n.outside,occluded:n.occluded,attributes:{}},i.attributes)for(const r of Object.keys(n.attributes))a[r].mutable&&(this.shapes[t].attributes[r]=e.attributes[r],this.shapes[t].attributes[r]=e.attributes[r])}return i.reset(),d.call(this,t,this.get(t))}getPosition(t){const{leftFrame:e,rightFrame:n}=this.neighborsFrames(t),r=Number.isInteger(n)?this.shapes[n]:null,i=Number.isInteger(e)?this.shapes[e]:null;if(i&&e===t)return{points:[...i.points],occluded:i.occluded,outside:i.outside,zOrder:i.zOrder,keyframe:!0};if(r&&i)return Object.assign({},this.interpolatePosition(i,r,(t-e)/(n-e)),{keyframe:!1});if(r)return{points:[...r.points],occluded:r.occluded,outside:!0,zOrder:0,keyframe:!1};if(i)return{points:[...i.points],occluded:i.occluded,outside:i.outside,zOrder:0,keyframe:!1};throw new p(`No one neightbour frame found for the track with client ID: "${this.id}"`)}delete(t){return this.lock&&!t||(this.removed=!0,this.resetCache()),!0}resetCache(){this.cache={}}}class x extends w{constructor(t,e,n,r){super(t,e,n,r),this.shapeType=s.RECTANGLE,b(this.shapeType,this.points)}static distance(t,e,n){const[r,i,o,s]=t;return e>=r&&e<=o&&n>=i&&n<=s?Math.min.apply(null,[e-r,n-i,o-e,s-n]):null}}class O extends w{constructor(t,e,n,r){super(t,e,n,r)}}class j extends O{constructor(t,e,n,r){super(t,e,n,r),this.shapeType=s.POLYGON,b(this.shapeType,this.points)}static distance(t,e,n){function r(t,r,i,o){return(i-t)*(n-r)-(e-t)*(o-r)}let i=0;const o=[];for(let s=0,a=t.length-2;sn&&r(c,u,l,f)>0&&i++:f<=n&&r(c,u,l,f)<0&&i--;const p=e-(u-f),h=n-(l-c);(p-c)*(l-p)>=0&&(h-u)*(f-h)>=0?o.push(Math.sqrt(Math.pow(e-p,2)+Math.pow(n-h,2))):o.push(Math.min(Math.sqrt(Math.pow(c-e,2)+Math.pow(u-n,2)),Math.sqrt(Math.pow(l-e,2)+Math.pow(f-n,2))))}return 0!==i?Math.min.apply(null,o):null}}class S extends O{constructor(t,e,n,r){super(t,e,n,r),this.shapeType=s.POLYLINE,b(this.shapeType,this.points)}static distance(t,e,n){const r=[];for(let i=0;i=0&&(n-s)*(c-n)>=0?r.push(Math.abs((c-s)*e-(a-o)*n+a*s-c*o)/Math.sqrt(Math.pow(c-s,2)+Math.pow(a-o,2))):r.push(Math.min(Math.sqrt(Math.pow(o-e,2)+Math.pow(s-n,2)),Math.sqrt(Math.pow(a-e,2)+Math.pow(c-n,2))))}return Math.min.apply(null,r)}}class _ extends O{constructor(t,e,n,r){super(t,e,n,r),this.shapeType=s.POINTS,b(this.shapeType,this.points)}static distance(t,e,n){const r=[];for(let i=0;ir&&(r=t[o]),t[o+1]>i&&(i=t[o+1]);return{xmin:e,ymin:n,xmax:r,ymax:i}}function i(t,e){const n=[],r=e.xmax-e.xmin,i=e.ymax-e.ymin;for(let o=0;on[i][t]-n[i][e]);const i={},o={};let s=0;for(;Object.values(o).length!==t.length;){for(const e of t){if(o[e])continue;const t=r[e][s],a=n[e][t];if(t in i&&i[t].distance>a){const e=i[t].value;delete i[t],delete o[e]}t in i||(i[t]={value:e,distance:a},o[e]=!0)}s++}const a={};for(const t of Object.keys(i))a[i[t].value]={value:t,distance:i[t].distance};return a}(Array.from(t.keys()),Array.from(e.keys()),s),c=(n(e)+n(t))/(e.length+t.length);!function(t,e){for(const n of Object.keys(t))t[n].distance>e&&delete t[n]}(a,c+3*Math.sqrt((r(t,c)+r(e,c))/(t.length+e.length)));for(const t of Object.keys(a))a[t]=a[t].value;const u=this.appendMapping(a,t,e);for(const n of u)i.push(t[n]),o.push(e[a[n]]);return[i,o]}let u=r(t.points),l=r(e.points);(u.xmax-u.xmin<1||l.ymax-l.ymin<1)&&(l=u={xmin:0,xmax:1024,ymin:0,ymax:768});const f=s(i(t.points,u)),p=s(i(e.points,l));let h=[],d=[];if(f.length>p.length){const[t,e]=c.call(this,p,f);h=e,d=t}else{const[t,e]=c.call(this,f,p);h=t,d=e}const b=o(a(h),u),m=o(a(d),l),g=[];for(let t=0;t+t),i=Object.keys(t).map(t=>+t),o=[];function s(t){let e=t,i=t;if(!r.length)throw new p("Interpolation mapping is empty");for(;!r.includes(e);)--e<0&&(e=n.length-1);for(;!r.includes(i);)++i>=n.length&&(i=0);return[e,i]}function a(t,e,r){const i=[];for(;e!==r;)i.push(n[e]),++e>=n.length&&(e=0);i.push(n[r]);let o=0,s=0,a=!1;for(let e=1;e(t.push({spec_id:e,value:this.attributes[e]}),t),[])}}get(t){if(t!==this.frame)throw new p("Got frame is not equal to the frame of the shape");return{objectType:a.TAG,clientID:this.clientID,serverID:this.serverID,lock:this.lock,attributes:Object.assign({},this.attributes),label:this.label,group:this.group}}save(t,e){if(t!==this.frame)throw new p("Got frame is not equal to the frame of the shape");if(this.lock&&e.lock)return d.call(this,t,this.get(t));const n=this.get(t),i=e.updateFlags;if(i.label&&(r("label",e.label,null,h),n.label=e.label,n.attributes={},this.appendDefaultAttributes.call(n,n.label)),i.attributes){const t=n.label.attributes.map(t=>`${t.id}`);for(const r of Object.keys(e.attributes))t.includes(r)&&(n.attributes[r]=e.attributes[r])}i.group&&(r("group",e.group,"integer",null),n.group=e.group),i.lock&&(r("lock",e.lock,"boolean",null),n.lock=e.lock),i.reset();for(const t of Object.keys(n))t in this&&(this[t]=n[t]);return d.call(this,t,this.get(t))}},objectStateFactory:d}})()},function(t,e,n){function r(t,e){var n=Object.keys(t);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(t);e&&(r=r.filter((function(e){return Object.getOwnPropertyDescriptor(t,e).enumerable}))),n.push.apply(n,r)}return n}function i(t){for(var e=1;e{const e=n(26),{Task:r}=n(49),{ScriptingError:o}="./exceptions";t.exports=class{constructor(t,e,n){this.sessionType=n instanceof r?"task":"job",this.id=n.id,this.version=t,this.collection=e,this.initialObjects={},this.hash=this._getHash();const i=this.collection.export();this._resetState();for(const t of i.shapes)this.initialObjects.shapes[t.id]=t;for(const t of i.tracks)this.initialObjects.tracks[t.id]=t;for(const t of i.tags)this.initialObjects.tags[t.id]=t}_resetState(){this.initialObjects={shapes:{},tracks:{},tags:{}}}_getHash(){const t=this.collection.export();return JSON.stringify(t)}async _request(t,n){return await e.annotations.updateAnnotations(this.sessionType,this.id,t,n)}async _put(t){return await this._request(t,"put")}async _create(t){return await this._request(t,"create")}async _update(t){return await this._request(t,"update")}async _delete(t){return await this._request(t,"delete")}_split(t){const e={created:{shapes:[],tracks:[],tags:[]},updated:{shapes:[],tracks:[],tags:[]},deleted:{shapes:[],tracks:[],tags:[]}};for(const n of Object.keys(t))for(const r of t[n])if(r.id in this.initialObjects[n]){JSON.stringify(r)!==JSON.stringify(this.initialObjects[n][r.id])&&e.updated[n].push(r)}else{if(void 0!==r.id)throw new o(`Id of object is defined "${r.id}"`+"but it absents in initial state");e.created[n].push(r)}const n={shapes:t.shapes.map(t=>+t.id),tracks:t.tracks.map(t=>+t.id),tags:t.tags.map(t=>+t.id)};for(const t of Object.keys(this.initialObjects))for(const r of Object.keys(this.initialObjects[t]))if(!n[t].includes(+r)){const n=this.initialObjects[t][r];e.deleted[t].push(n)}return e}_updateCreatedObjects(t,e){const n=t.tracks.length+t.shapes.length+t.tags.length,r=e.tracks.length+e.shapes.length+e.tags.length;if(r!==n)throw new o("Number of indexes is differed by number of saved objects"+`${r} vs ${n}`);for(const n of Object.keys(e))for(let r=0;rt.clientID),shapes:t.shapes.map(t=>t.clientID),tags:t.tags.map(t=>t.clientID)};return t.tracks.concat(t.shapes).concat(t.tags).map(t=>(delete t.clientID,t)),e}async save(t){"function"!=typeof t&&(t=t=>{console.log(t)});try{const e=this.collection.export(),{flush:n}=this.collection;if(n){t("New objects are being saved..");const n=this._receiveIndexes(e),r=await this._put(i({},e,{version:this.version}));this.version=r.version,this.collection.flush=!1,t("Saved objects are being updated in the client"),this._updateCreatedObjects(r,n),t("Initial state is being updated"),this._resetState();for(const t of Object.keys(this.initialObjects))for(const e of r[t])this.initialObjects[t][e.id]=e}else{const{created:n,updated:r,deleted:o}=this._split(e);t("New objects are being saved..");const s=this._receiveIndexes(n),a=await this._create(i({},n,{version:this.version}));this.version=a.version,t("Saved objects are being updated in the client"),this._updateCreatedObjects(a,s),t("Initial state is being updated");for(const t of Object.keys(this.initialObjects))for(const e of a[t])this.initialObjects[t][e.id]=e;t("Changed objects are being saved.."),this._receiveIndexes(r);const c=await this._update(i({},r,{version:this.version}));this.version=c.version,t("Initial state is being updated");for(const t of Object.keys(this.initialObjects))for(const e of c[t])this.initialObjects[t][e.id]=e;t("Changed objects are being saved.."),this._receiveIndexes(o);const u=await this._delete(i({},o,{version:this.version}));this._version=u.version,t("Initial state is being updated");for(const t of Object.keys(this.initialObjects))for(const e of u[t])delete this.initialObjects[t][e.id]}this.hash=this._getHash(),t("Saving is done")}catch(e){throw t(`Can not save annotations: ${e.message}`),e}}hasUnsavedChanges(){return this._getHash()!==this.hash}}})()},function(t){t.exports=JSON.parse('{"name":"cvat-core.js","version":"0.1.0","description":"Part of Computer Vision Tool which presents an interface for client-side integration","main":"babel.config.js","scripts":{"build":"webpack","test":"jest --config=jest.config.js --coverage","docs":"jsdoc --readme README.md src/*.js -p -c jsdoc.config.js -d docs","coveralls":"cat ./reports/coverage/lcov.info | coveralls"},"author":"Intel","license":"MIT","devDependencies":{"@babel/cli":"^7.4.4","@babel/core":"^7.4.4","@babel/preset-env":"^7.4.4","airbnb":"0.0.2","babel-eslint":"^10.0.1","babel-loader":"^8.0.6","core-js":"^3.0.1","coveralls":"^3.0.5","eslint":"6.1.0","eslint-config-airbnb-base":"14.0.0","eslint-plugin-import":"2.18.2","eslint-plugin-no-unsafe-innerhtml":"^1.0.16","eslint-plugin-no-unsanitized":"^3.0.2","eslint-plugin-security":"^1.4.0","jest":"^24.8.0","jest-junit":"^6.4.0","jsdoc":"^3.6.2","webpack":"^4.31.0","webpack-cli":"^3.3.2"},"dependencies":{"axios":"^0.18.0","browser-or-node":"^1.2.1","error-stack-parser":"^2.0.2","form-data":"^2.5.0","jest-config":"^24.8.0","js-cookie":"^2.2.0","platform":"^1.3.5","store":"^2.0.12"}}')},function(t,e,n){n(5),n(11),n(10),n(254),(()=>{const e=n(36),r=n(26),{isBoolean:i,isInteger:o,isEnum:s,isString:a,checkFilter:c}=n(56),{TaskStatus:u,TaskMode:l}=n(29),f=n(69),{AnnotationFormat:p}=n(138),{ArgumentError:h}=n(6),{Task:d}=n(49);function b(t,e){null!==t.assignee&&([t.assignee]=e.filter(e=>e.id===t.assignee));for(const n of t.segments)for(const t of n.jobs)null!==t.assignee&&([t.assignee]=e.filter(e=>e.id===t.assignee));return null!==t.owner&&([t.owner]=e.filter(e=>e.id===t.owner)),t}t.exports=function(t){return t.plugins.list.implementation=e.list,t.plugins.register.implementation=e.register.bind(t),t.server.about.implementation=async()=>{return await r.server.about()},t.server.share.implementation=async t=>{return await r.server.share(t)},t.server.formats.implementation=async()=>{return(await r.server.formats()).map(t=>new p(t))},t.server.datasetFormats.implementation=async()=>{return await r.server.datasetFormats()},t.server.register.implementation=async(t,e,n,i,o,s)=>{await r.server.register(t,e,n,i,o,s)},t.server.login.implementation=async(t,e)=>{await r.server.login(t,e)},t.server.logout.implementation=async()=>{await r.server.logout()},t.server.authorized.implementation=async()=>{return await r.server.authorized()},t.server.request.implementation=async(t,e)=>{return await r.server.request(t,e)},t.users.get.implementation=async t=>{c(t,{self:i});let e=null;return e=(e="self"in t&&t.self?[e=await r.users.getSelf()]:await r.users.getUsers()).map(t=>new f(t))},t.jobs.get.implementation=async t=>{if(c(t,{taskID:o,jobID:o}),"taskID"in t&&"jobID"in t)throw new h('Only one of fields "taskID" and "jobID" allowed simultaneously');if(!Object.keys(t).length)throw new h("Job filter must not be empty");let e=null;if("taskID"in t)e=await r.tasks.getTasks(`id=${t.taskID}`);else{const n=await r.jobs.getJob(t.jobID);void 0!==n.task_id&&(e=await r.tasks.getTasks(`id=${n.task_id}`))}if(null!==e&&e.length){const n=(await r.users.getUsers()).map(t=>new f(t)),i=new d(b(e[0],n));return t.jobID?i.jobs.filter(e=>e.id===t.jobID):i.jobs}return[]},t.tasks.get.implementation=async t=>{if(c(t,{page:o,name:a,id:o,owner:a,assignee:a,search:a,status:s.bind(u),mode:s.bind(l)}),"search"in t&&Object.keys(t).length>1&&!("page"in t&&2===Object.keys(t).length))throw new h('Do not use the filter field "search" with others');if("id"in t&&Object.keys(t).length>1&&!("page"in t&&2===Object.keys(t).length))throw new h('Do not use the filter field "id" with others');const e=new URLSearchParams;for(const n of["name","owner","assignee","search","status","mode","id","page"])Object.prototype.hasOwnProperty.call(t,n)&&e.set(n,t[n]);const n=(await r.users.getUsers()).map(t=>new f(t)),i=await r.tasks.getTasks(e.toString()),p=i.map(t=>b(t,n)).map(t=>new d(t));return p.count=i.count,p},t}})()},function(t,e,n){"use strict";n(255);var r,i=n(12),o=n(13),s=n(139),a=n(0),c=n(104),u=n(18),l=n(64),f=n(9),p=n(256),h=n(257),d=n(67).codeAt,b=n(259),m=n(33),g=n(260),v=n(25),y=a.URL,w=g.URLSearchParams,k=g.getState,x=v.set,O=v.getterFor("URL"),j=Math.floor,S=Math.pow,_=/[A-Za-z]/,A=/[\d+\-.A-Za-z]/,T=/\d/,P=/^(0x|0X)/,E=/^[0-7]+$/,C=/^\d+$/,I=/^[\dA-Fa-f]+$/,F=/[\u0000\u0009\u000A\u000D #%/:?@[\\]]/,M=/[\u0000\u0009\u000A\u000D #/:?@[\\]]/,N=/^[\u0000-\u001F ]+|[\u0000-\u001F ]+$/g,R=/[\u0009\u000A\u000D]/g,D=function(t,e){var n,r,i;if("["==e.charAt(0)){if("]"!=e.charAt(e.length-1))return"Invalid host";if(!(n=B(e.slice(1,-1))))return"Invalid host";t.host=n}else if(V(t)){if(e=b(e),F.test(e))return"Invalid host";if(null===(n=$(e)))return"Invalid host";t.host=n}else{if(M.test(e))return"Invalid host";for(n="",r=h(e),i=0;i4)return t;for(n=[],r=0;r1&&"0"==i.charAt(0)&&(o=P.test(i)?16:8,i=i.slice(8==o?1:2)),""===i)s=0;else{if(!(10==o?C:8==o?E:I).test(i))return t;s=parseInt(i,o)}n.push(s)}for(r=0;r=S(256,5-e))return null}else if(s>255)return null;for(a=n.pop(),r=0;r6)return;for(r=0;p();){if(i=null,r>0){if(!("."==p()&&r<4))return;f++}if(!T.test(p()))return;for(;T.test(p());){if(o=parseInt(p(),10),null===i)i=o;else{if(0==i)return;i=10*i+o}if(i>255)return;f++}c[u]=256*c[u]+i,2!=++r&&4!=r||u++}if(4!=r)return;break}if(":"==p()){if(f++,!p())return}else if(p())return;c[u++]=e}else{if(null!==l)return;f++,l=++u}}if(null!==l)for(s=u-l,u=7;0!=u&&s>0;)a=c[u],c[u--]=c[l+s-1],c[l+--s]=a;else if(8!=u)return;return c},U=function(t){var e,n,r,i;if("number"==typeof t){for(e=[],n=0;n<4;n++)e.unshift(t%256),t=j(t/256);return e.join(".")}if("object"==typeof t){for(e="",r=function(t){for(var e=null,n=1,r=null,i=0,o=0;o<8;o++)0!==t[o]?(i>n&&(e=r,n=i),r=null,i=0):(null===r&&(r=o),++i);return i>n&&(e=r,n=i),e}(t),n=0;n<8;n++)i&&0===t[n]||(i&&(i=!1),r===n?(e+=n?":":"::",i=!0):(e+=t[n].toString(16),n<7&&(e+=":")));return"["+e+"]"}return t},L={},z=p({},L,{" ":1,'"':1,"<":1,">":1,"`":1}),q=p({},z,{"#":1,"?":1,"{":1,"}":1}),W=p({},q,{"/":1,":":1,";":1,"=":1,"@":1,"[":1,"\\":1,"]":1,"^":1,"|":1}),G=function(t,e){var n=d(t,0);return n>32&&n<127&&!f(e,t)?t:encodeURIComponent(t)},J={ftp:21,file:null,http:80,https:443,ws:80,wss:443},V=function(t){return f(J,t.scheme)},H=function(t){return""!=t.username||""!=t.password},X=function(t){return!t.host||t.cannotBeABaseURL||"file"==t.scheme},K=function(t,e){var n;return 2==t.length&&_.test(t.charAt(0))&&(":"==(n=t.charAt(1))||!e&&"|"==n)},Z=function(t){var e;return t.length>1&&K(t.slice(0,2))&&(2==t.length||"/"===(e=t.charAt(2))||"\\"===e||"?"===e||"#"===e)},Y=function(t){var e=t.path,n=e.length;!n||"file"==t.scheme&&1==n&&K(e[0],!0)||e.pop()},Q=function(t){return"."===t||"%2e"===t.toLowerCase()},tt={},et={},nt={},rt={},it={},ot={},st={},at={},ct={},ut={},lt={},ft={},pt={},ht={},dt={},bt={},mt={},gt={},vt={},yt={},wt={},kt=function(t,e,n,i){var o,s,a,c,u,l=n||tt,p=0,d="",b=!1,m=!1,g=!1;for(n||(t.scheme="",t.username="",t.password="",t.host=null,t.port=null,t.path=[],t.query=null,t.fragment=null,t.cannotBeABaseURL=!1,e=e.replace(N,"")),e=e.replace(R,""),o=h(e);p<=o.length;){switch(s=o[p],l){case tt:if(!s||!_.test(s)){if(n)return"Invalid scheme";l=nt;continue}d+=s.toLowerCase(),l=et;break;case et:if(s&&(A.test(s)||"+"==s||"-"==s||"."==s))d+=s.toLowerCase();else{if(":"!=s){if(n)return"Invalid scheme";d="",l=nt,p=0;continue}if(n&&(V(t)!=f(J,d)||"file"==d&&(H(t)||null!==t.port)||"file"==t.scheme&&!t.host))return;if(t.scheme=d,n)return void(V(t)&&J[t.scheme]==t.port&&(t.port=null));d="","file"==t.scheme?l=ht:V(t)&&i&&i.scheme==t.scheme?l=rt:V(t)?l=at:"/"==o[p+1]?(l=it,p++):(t.cannotBeABaseURL=!0,t.path.push(""),l=vt)}break;case nt:if(!i||i.cannotBeABaseURL&&"#"!=s)return"Invalid scheme";if(i.cannotBeABaseURL&&"#"==s){t.scheme=i.scheme,t.path=i.path.slice(),t.query=i.query,t.fragment="",t.cannotBeABaseURL=!0,l=wt;break}l="file"==i.scheme?ht:ot;continue;case rt:if("/"!=s||"/"!=o[p+1]){l=ot;continue}l=ct,p++;break;case it:if("/"==s){l=ut;break}l=gt;continue;case ot:if(t.scheme=i.scheme,s==r)t.username=i.username,t.password=i.password,t.host=i.host,t.port=i.port,t.path=i.path.slice(),t.query=i.query;else if("/"==s||"\\"==s&&V(t))l=st;else if("?"==s)t.username=i.username,t.password=i.password,t.host=i.host,t.port=i.port,t.path=i.path.slice(),t.query="",l=yt;else{if("#"!=s){t.username=i.username,t.password=i.password,t.host=i.host,t.port=i.port,t.path=i.path.slice(),t.path.pop(),l=gt;continue}t.username=i.username,t.password=i.password,t.host=i.host,t.port=i.port,t.path=i.path.slice(),t.query=i.query,t.fragment="",l=wt}break;case st:if(!V(t)||"/"!=s&&"\\"!=s){if("/"!=s){t.username=i.username,t.password=i.password,t.host=i.host,t.port=i.port,l=gt;continue}l=ut}else l=ct;break;case at:if(l=ct,"/"!=s||"/"!=d.charAt(p+1))continue;p++;break;case ct:if("/"!=s&&"\\"!=s){l=ut;continue}break;case ut:if("@"==s){b&&(d="%40"+d),b=!0,a=h(d);for(var v=0;v65535)return"Invalid port";t.port=V(t)&&k===J[t.scheme]?null:k,d=""}if(n)return;l=mt;continue}return"Invalid port"}d+=s;break;case ht:if(t.scheme="file","/"==s||"\\"==s)l=dt;else{if(!i||"file"!=i.scheme){l=gt;continue}if(s==r)t.host=i.host,t.path=i.path.slice(),t.query=i.query;else if("?"==s)t.host=i.host,t.path=i.path.slice(),t.query="",l=yt;else{if("#"!=s){Z(o.slice(p).join(""))||(t.host=i.host,t.path=i.path.slice(),Y(t)),l=gt;continue}t.host=i.host,t.path=i.path.slice(),t.query=i.query,t.fragment="",l=wt}}break;case dt:if("/"==s||"\\"==s){l=bt;break}i&&"file"==i.scheme&&!Z(o.slice(p).join(""))&&(K(i.path[0],!0)?t.path.push(i.path[0]):t.host=i.host),l=gt;continue;case bt:if(s==r||"/"==s||"\\"==s||"?"==s||"#"==s){if(!n&&K(d))l=gt;else if(""==d){if(t.host="",n)return;l=mt}else{if(c=D(t,d))return c;if("localhost"==t.host&&(t.host=""),n)return;d="",l=mt}continue}d+=s;break;case mt:if(V(t)){if(l=gt,"/"!=s&&"\\"!=s)continue}else if(n||"?"!=s)if(n||"#"!=s){if(s!=r&&(l=gt,"/"!=s))continue}else t.fragment="",l=wt;else t.query="",l=yt;break;case gt:if(s==r||"/"==s||"\\"==s&&V(t)||!n&&("?"==s||"#"==s)){if(".."===(u=(u=d).toLowerCase())||"%2e."===u||".%2e"===u||"%2e%2e"===u?(Y(t),"/"==s||"\\"==s&&V(t)||t.path.push("")):Q(d)?"/"==s||"\\"==s&&V(t)||t.path.push(""):("file"==t.scheme&&!t.path.length&&K(d)&&(t.host&&(t.host=""),d=d.charAt(0)+":"),t.path.push(d)),d="","file"==t.scheme&&(s==r||"?"==s||"#"==s))for(;t.path.length>1&&""===t.path[0];)t.path.shift();"?"==s?(t.query="",l=yt):"#"==s&&(t.fragment="",l=wt)}else d+=G(s,q);break;case vt:"?"==s?(t.query="",l=yt):"#"==s?(t.fragment="",l=wt):s!=r&&(t.path[0]+=G(s,L));break;case yt:n||"#"!=s?s!=r&&("'"==s&&V(t)?t.query+="%27":t.query+="#"==s?"%23":G(s,L)):(t.fragment="",l=wt);break;case wt:s!=r&&(t.fragment+=G(s,z))}p++}},xt=function(t){var e,n,r=l(this,xt,"URL"),i=arguments.length>1?arguments[1]:void 0,s=String(t),a=x(r,{type:"URL"});if(void 0!==i)if(i instanceof xt)e=O(i);else if(n=kt(e={},String(i)))throw TypeError(n);if(n=kt(a,s,null,e))throw TypeError(n);var c=a.searchParams=new w,u=k(c);u.updateSearchParams(a.query),u.updateURL=function(){a.query=String(c)||null},o||(r.href=jt.call(r),r.origin=St.call(r),r.protocol=_t.call(r),r.username=At.call(r),r.password=Tt.call(r),r.host=Pt.call(r),r.hostname=Et.call(r),r.port=Ct.call(r),r.pathname=It.call(r),r.search=Ft.call(r),r.searchParams=Mt.call(r),r.hash=Nt.call(r))},Ot=xt.prototype,jt=function(){var t=O(this),e=t.scheme,n=t.username,r=t.password,i=t.host,o=t.port,s=t.path,a=t.query,c=t.fragment,u=e+":";return null!==i?(u+="//",H(t)&&(u+=n+(r?":"+r:"")+"@"),u+=U(i),null!==o&&(u+=":"+o)):"file"==e&&(u+="//"),u+=t.cannotBeABaseURL?s[0]:s.length?"/"+s.join("/"):"",null!==a&&(u+="?"+a),null!==c&&(u+="#"+c),u},St=function(){var t=O(this),e=t.scheme,n=t.port;if("blob"==e)try{return new URL(e.path[0]).origin}catch(t){return"null"}return"file"!=e&&V(t)?e+"://"+U(t.host)+(null!==n?":"+n:""):"null"},_t=function(){return O(this).scheme+":"},At=function(){return O(this).username},Tt=function(){return O(this).password},Pt=function(){var t=O(this),e=t.host,n=t.port;return null===e?"":null===n?U(e):U(e)+":"+n},Et=function(){var t=O(this).host;return null===t?"":U(t)},Ct=function(){var t=O(this).port;return null===t?"":String(t)},It=function(){var t=O(this),e=t.path;return t.cannotBeABaseURL?e[0]:e.length?"/"+e.join("/"):""},Ft=function(){var t=O(this).query;return t?"?"+t:""},Mt=function(){return O(this).searchParams},Nt=function(){var t=O(this).fragment;return t?"#"+t:""},Rt=function(t,e){return{get:t,set:e,configurable:!0,enumerable:!0}};if(o&&c(Ot,{href:Rt(jt,(function(t){var e=O(this),n=String(t),r=kt(e,n);if(r)throw TypeError(r);k(e.searchParams).updateSearchParams(e.query)})),origin:Rt(St),protocol:Rt(_t,(function(t){var e=O(this);kt(e,String(t)+":",tt)})),username:Rt(At,(function(t){var e=O(this),n=h(String(t));if(!X(e)){e.username="";for(var r=0;r=n.length?{value:void 0,done:!0}:(t=r(n,i),e.index+=t.length,{value:t,done:!1})}))},function(t,e,n){"use strict";var r=n(13),i=n(3),o=n(105),s=n(92),a=n(84),c=n(37),u=n(85),l=Object.assign;t.exports=!l||i((function(){var t={},e={},n=Symbol();return t[n]=7,"abcdefghijklmnopqrst".split("").forEach((function(t){e[t]=t})),7!=l({},t)[n]||"abcdefghijklmnopqrst"!=o(l({},e)).join("")}))?function(t,e){for(var n=c(t),i=arguments.length,l=1,f=s.f,p=a.f;i>l;)for(var h,d=u(arguments[l++]),b=f?o(d).concat(f(d)):o(d),m=b.length,g=0;m>g;)h=b[g++],r&&!p.call(d,h)||(n[h]=d[h]);return n}:l},function(t,e,n){"use strict";var r=n(47),i=n(37),o=n(97),s=n(96),a=n(45),c=n(258),u=n(48);t.exports=function(t){var e,n,l,f,p,h=i(t),d="function"==typeof this?this:Array,b=arguments.length,m=b>1?arguments[1]:void 0,g=void 0!==m,v=0,y=u(h);if(g&&(m=r(m,b>2?arguments[2]:void 0,2)),null==y||d==Array&&s(y))for(n=new d(e=a(h.length));e>v;v++)c(n,v,g?m(h[v],v):h[v]);else for(p=(f=y.call(h)).next,n=new d;!(l=p.call(f)).done;v++)c(n,v,g?o(f,m,[l.value,v],!0):l.value);return n.length=v,n}},function(t,e,n){"use strict";var r=n(58),i=n(21),o=n(42);t.exports=function(t,e,n){var s=r(e);s in t?i.f(t,s,o(0,n)):t[s]=n}},function(t,e,n){"use strict";var r=/[^\0-\u007E]/,i=/[.\u3002\uFF0E\uFF61]/g,o="Overflow: input needs wider integers to process",s=Math.floor,a=String.fromCharCode,c=function(t){return t+22+75*(t<26)},u=function(t,e,n){var r=0;for(t=n?s(t/700):t>>1,t+=s(t/e);t>455;r+=36)t=s(t/35);return s(r+36*t/(t+38))},l=function(t){var e,n,r=[],i=(t=function(t){for(var e=[],n=0,r=t.length;n=55296&&i<=56319&&n=l&&ns((2147483647-f)/m))throw RangeError(o);for(f+=(b-l)*m,l=b,e=0;e2147483647)throw RangeError(o);if(n==l){for(var g=f,v=36;;v+=36){var y=v<=p?1:v>=p+26?26:v-p;if(g0?arguments[0]:void 0,p=this,g=[];if(v(p,{type:"URLSearchParams",entries:g,updateURL:function(){},updateSearchParams:C}),void 0!==u)if(d(u))if("function"==typeof(t=m(u)))for(n=(e=t.call(u)).next;!(r=n.call(e)).done;){if((s=(o=(i=b(h(r.value))).next).call(i)).done||(a=o.call(i)).done||!o.call(i).done)throw TypeError("Expected sequence with length 2");g.push({key:s.value+"",value:a.value+""})}else for(c in u)f(u,c)&&g.push({key:c,value:u[c]+""});else E(g,"string"==typeof u?"?"===u.charAt(0)?u.slice(1):u:u+"")},N=M.prototype;s(N,{append:function(t,e){I(arguments.length,2);var n=y(this);n.entries.push({key:t+"",value:e+""}),n.updateURL()},delete:function(t){I(arguments.length,1);for(var e=y(this),n=e.entries,r=t+"",i=0;it.key){i.splice(e,0,t);break}e===n&&i.push(t)}r.updateURL()},forEach:function(t){for(var e,n=y(this).entries,r=p(t,arguments.length>1?arguments[1]:void 0,3),i=0;i=0)return;s[e]="set-cookie"===e?(s[e]?s[e]:[]).concat([n]):s[e]?s[e]+", "+n:n}})),s):s}},function(t,e,n){"use strict";var r=n(7);t.exports=r.isStandardBrowserEnv()?function(){var t,e=/(msie|trident)/i.test(navigator.userAgent),n=document.createElement("a");function i(t){var r=t;return e&&(n.setAttribute("href",r),r=n.href),n.setAttribute("href",r),{href:n.href,protocol:n.protocol?n.protocol.replace(/:$/,""):"",host:n.host,search:n.search?n.search.replace(/^\?/,""):"",hash:n.hash?n.hash.replace(/^#/,""):"",hostname:n.hostname,port:n.port,pathname:"/"===n.pathname.charAt(0)?n.pathname:"/"+n.pathname}}return t=i(window.location.href),function(e){var n=r.isString(e)?i(e):e;return n.protocol===t.protocol&&n.host===t.host}}():function(){return!0}},function(t,e,n){"use strict";var r=n(7);t.exports=r.isStandardBrowserEnv()?{write:function(t,e,n,i,o,s){var a=[];a.push(t+"="+encodeURIComponent(e)),r.isNumber(n)&&a.push("expires="+new Date(n).toGMTString()),r.isString(i)&&a.push("path="+i),r.isString(o)&&a.push("domain="+o),!0===s&&a.push("secure"),document.cookie=a.join("; ")},read:function(t){var e=document.cookie.match(new RegExp("(^|;\\s*)("+t+")=([^;]*)"));return e?decodeURIComponent(e[3]):null},remove:function(t){this.write(t,"",Date.now()-864e5)}}:{write:function(){},read:function(){return null},remove:function(){}}},function(t,e,n){"use strict";var r=n(7);function i(){this.handlers=[]}i.prototype.use=function(t,e){return this.handlers.push({fulfilled:t,rejected:e}),this.handlers.length-1},i.prototype.eject=function(t){this.handlers[t]&&(this.handlers[t]=null)},i.prototype.forEach=function(t){r.forEach(this.handlers,(function(e){null!==e&&t(e)}))},t.exports=i},function(t,e,n){"use strict";var r=n(7),i=n(195),o=n(115),s=n(68),a=n(196),c=n(197);function u(t){t.cancelToken&&t.cancelToken.throwIfRequested()}t.exports=function(t){return u(t),t.baseURL&&!a(t.url)&&(t.url=c(t.baseURL,t.url)),t.headers=t.headers||{},t.data=i(t.data,t.headers,t.transformRequest),t.headers=r.merge(t.headers.common||{},t.headers[t.method]||{},t.headers||{}),r.forEach(["delete","get","head","post","put","patch","common"],(function(e){delete t.headers[e]})),(t.adapter||s.adapter)(t).then((function(e){return u(t),e.data=i(e.data,e.headers,t.transformResponse),e}),(function(e){return o(e)||(u(t),e&&e.response&&(e.response.data=i(e.response.data,e.response.headers,t.transformResponse))),Promise.reject(e)}))}},function(t,e,n){"use strict";var r=n(7);t.exports=function(t,e,n){return r.forEach(n,(function(n){t=n(t,e)})),t}},function(t,e,n){"use strict";t.exports=function(t){return/^([a-z][a-z\d\+\-\.]*:)?\/\//i.test(t)}},function(t,e,n){"use strict";t.exports=function(t,e){return e?t.replace(/\/+$/,"")+"/"+e.replace(/^\/+/,""):t}},function(t,e,n){"use strict";var r=n(116);function i(t){if("function"!=typeof t)throw new TypeError("executor must be a function.");var e;this.promise=new Promise((function(t){e=t}));var n=this;t((function(t){n.reason||(n.reason=new r(t),e(n.reason))}))}i.prototype.throwIfRequested=function(){if(this.reason)throw this.reason},i.source=function(){var t;return{token:new i((function(e){t=e})),cancel:t}},t.exports=i},function(t,e,n){"use strict";t.exports=function(t){return function(e){return t.apply(null,e)}}},function(t,e,n){"use strict";var r=n(12),i=n(201).trim;r({target:"String",proto:!0,forced:n(202)("trim")},{trim:function(){return i(this)}})},function(t,e,n){var r=n(31),i="["+n(118)+"]",o=RegExp("^"+i+i+"*"),s=RegExp(i+i+"*$"),a=function(t){return function(e){var n=String(r(e));return 1&t&&(n=n.replace(o,"")),2&t&&(n=n.replace(s,"")),n}};t.exports={start:a(1),end:a(2),trim:a(3)}},function(t,e,n){var r=n(3),i=n(118);t.exports=function(t){return r((function(){return!!i[t]()||"​…᠎"!="​…᠎"[t]()||i[t].name!==t}))}},function(t,e,n){(function(e){n(5),n(11),n(204),n(10),(()=>{const r=n(205),i=n(36),o=n(26),{isBrowser:s,isNode:a}=n(246),{Exception:c,ArgumentError:u}=n(6),l={};class f{constructor(t,e,n,r,i,o){Object.defineProperties(this,Object.freeze({width:{value:t,writable:!1},height:{value:e,writable:!1},tid:{value:n,writable:!1},number:{value:r,writable:!1},startFrame:{value:i,writable:!1},stopFrame:{value:o,writable:!1}}))}async data(t=(()=>{})){return await i.apiWrapper.call(this,f.prototype.data,t)}}f.prototype.data.implementation=async function(t){return new Promise(async(e,n)=>{const r=t=>{if(l[this.tid].activeChunkRequest&&b===l[this.tid].activeChunkRequest.chunkNumber){const e=l[this.tid].activeChunkRequest.callbacks;if(e.length){const n=e.pop();l[this.tid].activeChunkRequest=void 0,n.resolve(f.frame(t))}}},i=()=>{if(l[this.tid].activeChunkRequest&&b===l[this.tid].activeChunkRequest.chunkNumber){for(const t of l[this.tid].activeChunkRequest.callbacks)t.reject(t.frameNumber);l[this.tid].activeChunkRequest=void 0}},u=()=>{const t=l[this.tid].activeChunkRequest;t.request=o.frames.getData(this.tid,t.chunkNumber).then(t=>{l[this.tid].activeChunkRequest.completed=!0,f.requestDecodeBlock(t,l[this.tid].activeChunkRequest.start,l[this.tid].activeChunkRequest.stop,l[this.tid].activeChunkRequest.onDecodeAll,l[this.tid].activeChunkRequest.rejectRequestAll)}).catch(t=>{n(t instanceof c?t:new c(t.message))}).finally(()=>{if(l[this.tid].nextChunkRequest){if(l[this.tid].activeChunkRequest)for(const t of l[this.tid].activeChunkRequest.callbacks)t.reject(t.frameNumber);l[this.tid].activeChunkRequest=l[this.tid].nextChunkRequest,l[this.tid].nextChunkRequest=void 0,u()}})},{provider:f}=l[this.tid],{chunkSize:p}=l[this.tid],h=Math.max(this.startFrame,parseInt(this.number/p,10)*p),d=Math.min(this.stopFrame,(parseInt(this.number/p,10)+1)*p-1),b=Math.floor(this.number/p);if(a)e("Dummy data");else if(s)try{const{decodedBlocksCacheSize:s}=l[this.tid];let a=await f.frame(this.number);if(null===a)if(t(),f.is_chunk_cached(h,d))l[this.tid].activeChunkRequest.callbacks.push({resolve:e,reject:n,frameNumber:this.number}),f.requestDecodeBlock(null,h,d,r,i);else if(!l[this.tid].activeChunkRequest||l[this.tid].activeChunkRequest&&l[this.tid].activeChunkRequest.completed)l[this.tid].activeChunkRequest&&l[this.tid].activeChunkRequest.rejectRequestAll(),l[this.tid].activeChunkRequest={request:void 0,chunkNumber:b,start:h,stop:d,onDecodeAll:r,rejectRequestAll:i,completed:!1,callbacks:[{resolve:e,reject:n,frameNumber:this.number}]},u();else if(l[this.tid].activeChunkRequest.chunkNumber===b)l[this.tid].activeChunkRequest.callbacks.push({resolve:e,reject:n,frameNumber:this.number});else{if(l[this.tid].nextChunkRequest)for(const t of l[this.tid].nextChunkRequest.callbacks)t.reject(t.frameNumber);l[this.tid].nextChunkRequest={request:void 0,chunkNumber:b,start:h,stop:d,onDecodeAll:r,rejectRequestAll:i,completed:!1,callbacks:[{resolve:e,reject:n,frameNumber:this.number}]}}else{if(this.number%p>1&&!f.isNextChunkExists(this.number)&&s>1){const t=b+1,e=Math.max(this.startFrame,t*p),r=Math.min(this.stopFrame,(t+1)*p-1);e{f.requestDecodeBlock(t,e,r,void 0,void 0)}).catch(t=>{n(t instanceof c?t:new c(t.message))}))}e(a)}}catch(t){n(t instanceof c?t:new c(t.message))}})},t.exports={FrameData:f,getFrame:async function(t,e,n,i,s,a,c){if(!(t in l)){const i="video"===n?r.BlockType.MP4VIDEO:r.BlockType.ARCHIVE,a=await o.frames.getMeta(t),c=i===r.BlockType.MP4VIDEO?Math.floor(258.90765432098766/e)||1:Math.floor(500/e)||1;l[t]={meta:a,chunkSize:e,provider:new r.FrameProvider(i,e,9,c,1),lastFrameRequest:s,decodedBlocksCacheSize:c,activeChunkRequest:void 0,nextChunkRequest:void 0}}const p=(t=>{let e=null;if("interpolation"===i)[e]=t;else{if("annotation"!==i)throw new u(`Invalid mode is specified ${i}`);if(s>=t.length)throw new u(`Meta information about frame ${s} can't be received from the server`);e=t[s]}return e})(l[t].meta);return l[t].lastFrameRequest=s,l[t].provider.setRenderSize(p.width,p.height),new f(p.width,p.height,t,s,a,c)},getRanges:function(t){return t in l?l[t].provider.cachedFrames:[]},getPreview:async function(t){return new Promise(async(n,r)=>{try{const r=await o.frames.getPreview(t);if(a)n(e.Buffer.from(r,"binary").toString("base64"));else if(s){const t=new FileReader;t.onload=()=>{n(t.result)},t.readAsDataURL(r)}}catch(t){r(t)}})}}})()}).call(this,n(30))},function(t,e,n){"use strict";var r=n(12),i=n(24),o=n(94),s=n(32),a=n(98),c=n(101),u=n(18);r({target:"Promise",proto:!0,real:!0},{finally:function(t){var e=a(this,s("Promise")),n="function"==typeof t;return this.then(n?function(n){return c(e,t()).then((function(){return n}))}:t,n?function(n){return c(e,t()).then((function(){throw n}))}:t)}}),i||"function"!=typeof o||o.prototype.finally||u(o.prototype,"finally",s("Promise").prototype.finally)},function(t,e,n){n(72),n(225),n(227),n(243);const{MP4Reader:r,Bytestream:i}=n(245),o=Object.freeze({MP4VIDEO:"mp4video",ARCHIVE:"archive"});class s{constructor(){this._lock=Promise.resolve()}_acquire(){var t;return this._lock=new Promise(e=>{t=e}),t}acquireQueued(){const t=this._lock.then(()=>e),e=this._acquire();return t}}t.exports={FrameProvider:class{constructor(t,e,n,r=5,i=2){this._frames={},this._cachedBlockCount=Math.max(1,n),this._decodedBlocksCacheSize=r,this._blocks_ranges=[],this._blocks={},this._blockSize=e,this._running=!1,this._blockType=t,this._currFrame=-1,this._requestedBlockDecode=null,this._width=null,this._height=null,this._decodingBlocks={},this._decodeThreadCount=0,this._timerId=setTimeout(this._worker.bind(this),100),this._mutex=new s,this._promisedFrames={},this._maxWorkerThreadCount=i}async _worker(){null!=this._requestedBlockDecode&&this._decodeThreadCountthis._cachedBlockCount){const t=this._blocks_ranges.shift(),[e,n]=t.split(":").map(t=>+t);delete this._blocks[e/this._blockSize];for(let t=e;t<=n;t++)delete this._frames[t]}const t=Math.floor(this._decodedBlocksCacheSize/2);for(let e=0;e+t);if(rthis._currFrame+t*this._blockSize)for(let t=n;t<=r;t++)delete this._frames[t]}}async requestDecodeBlock(t,e,n,r,i){const o=await this._mutex.acquireQueued();null!==this._requestedBlockDecode&&(e===this._requestedBlockDecode.start&&n===this._requestedBlockDecode.end?(this._requestedBlockDecode.resolveCallback=r,this._requestedBlockDecode.rejectCallback=i):this._requestedBlockDecode.rejectCallback&&this._requestedBlockDecode.rejectCallback()),`${e}:${n}`in this._decodingBlocks?(this._decodingBlocks[`${e}:${n}`].rejectCallback=i,this._decodingBlocks[`${e}:${n}`].resolveCallback=r):(null===t&&(t=this._blocks[Math.floor((e+1)/this.blockSize)]),this._requestedBlockDecode={block:t,start:e,end:n,resolveCallback:r,rejectCallback:i}),o()}isRequestExist(){return null!=this._requestedBlockDecode}setRenderSize(t,e){this._width=t,this._height=e}async frame(t){return this._currFrame=t,new Promise((e,n)=>{t in this._frames?null!==this._frames[t]?e(this._frames[t]):this._promisedFrames[t]={resolve:e,reject:n}:e(null)})}isNextChunkExists(t){const e=Math.floor(t/this._blockSize)+1;return"loading"===this._blocks[e]||e in this._blocks}setReadyToLoading(t){this._blocks[t]="loading"}cropImage(t,e,n,r,i,o,s){if(0===r&&o===e&&0===i&&s===n)return new ImageData(new Uint8ClampedArray(t),o,s);const a=new Uint32Array(t),c=o*s*4,u=new ArrayBuffer(c),l=new Uint32Array(u),f=new Uint8ClampedArray(u);if(e===o)return new ImageData(new Uint8ClampedArray(t,4*i,c),o,s);let p=0;for(let t=i;t{if(t.data.consoleLog)return;const r=Math.ceil(this._height/t.data.height);this._frames[u]=this.cropImage(t.data.buf,t.data.width,t.data.height,0,0,Math.floor(n/r),Math.floor(e/r)),this._decodingBlocks[`${s}:${a}`].resolveCallback&&this._decodingBlocks[`${s}:${a}`].resolveCallback(u),u in this._promisedFrames&&(this._promisedFrames[u].resolve(this._frames[u]),delete this._promisedFrames[u]),u===a&&(this._decodeThreadCount--,delete this._decodingBlocks[`${s}:${a}`],o.terminate()),u++},o.onerror=t=>{console.log(["ERROR: Line ",t.lineno," in ",t.filename,": ",t.message].join("")),o.terminate(),this._decodeThreadCount--;for(let t=u;t<=a;t++)t in this._promisedFrames&&(this._promisedFrames[t].reject(),delete this._promisedFrames[t]);this._decodingBlocks[`${s}:${a}`].rejectCallback&&this._decodingBlocks[`${s}:${a}`].rejectCallback(),delete this._decodingBlocks[`${s}:${a}`]},o.postMessage({type:"Broadway.js - Worker init",options:{rgb:!0,reuseMemory:!1}});const l=new r(new i(c));l.read();const f=l.tracks[1],p=l.tracks[1].trak.mdia.minf.stbl.stsd.avc1.avcC,h=p.sps[0],d=p.pps[0];o.postMessage({buf:h,offset:0,length:h.length}),o.postMessage({buf:d,offset:0,length:d.length});for(let t=0;t{o.postMessage({buf:t,offset:0,length:t.length})});this._decodeThreadCount++,t()}else{const r=new Worker("/static/engine/js/unzip_imgs.js");r.onerror=t=>{console.log(["ERROR: Line ",t.lineno," in ",t.filename,": ",t.message].join(""));for(let t=s;t<=a;t++)t in this._promisedFrames&&(this._promisedFrames[t].reject(),delete this._promisedFrames[t]);this._decodingBlocks[`${s}:${a}`].rejectCallback&&this._decodingBlocks[`${s}:${a}`].rejectCallback(),this._decodeThreadCount--},r.postMessage({block:c,start:s,end:a}),this._decodeThreadCount++,r.onmessage=t=>{this._frames[t.data.index]={data:t.data.data,width:n,height:e},this._decodingBlocks[`${s}:${a}`].resolveCallback&&this._decodingBlocks[`${s}:${a}`].resolveCallback(t.data.index),t.data.index in this._promisedFrames&&(this._promisedFrames[t.data.index].resolve(this._frames[t.data.index]),delete this._promisedFrames[t.data.index]),t.data.isEnd&&(delete this._decodingBlocks[`${s}:${a}`],this._decodeThreadCount--)},t()}}get decodeThreadCount(){return this._decodeThreadCount}get cachedFrames(){return[...this._blocks_ranges].sort((t,e)=>t.split(":")[0]-e.split(":")[0])}},BlockType:o}},function(t,e,n){var r=n(16),i=n(38),o="".split;t.exports=r((function(){return!Object("z").propertyIsEnumerable(0)}))?function(t){return"String"==i(t)?o.call(t,""):Object(t)}:Object},function(t,e,n){var r=n(8),i=n(123),o=n(19),s=r("unscopables"),a=Array.prototype;null==a[s]&&o(a,s,i(null)),t.exports=function(t){a[s][t]=!0}},function(t,e,n){var r=n(1),i=n(73),o=r["__core-js_shared__"]||i("__core-js_shared__",{});t.exports=o},function(t,e,n){var r=n(16);t.exports=!!Object.getOwnPropertySymbols&&!r((function(){return!String(Symbol())}))},function(t,e,n){var r=n(28),i=n(39),o=n(17),s=n(211);t.exports=r?Object.defineProperties:function(t,e){o(t);for(var n,r=s(e),a=r.length,c=0;a>c;)i.f(t,n=r[c++],e[n]);return t}},function(t,e,n){var r=n(124),i=n(77);t.exports=Object.keys||function(t){return r(t,i)}},function(t,e,n){var r=n(50),i=n(125),o=n(213),s=function(t){return function(e,n,s){var a,c=r(e),u=i(c.length),l=o(s,u);if(t&&n!=n){for(;u>l;)if((a=c[l++])!=a)return!0}else for(;u>l;l++)if((t||l in c)&&c[l]===n)return t||l||0;return!t&&-1}};t.exports={includes:s(!0),indexOf:s(!1)}},function(t,e,n){var r=n(126),i=Math.max,o=Math.min;t.exports=function(t,e){var n=r(t);return n<0?i(n+e,0):o(n,e)}},function(t,e,n){var r=n(1),i=n(129),o=r.WeakMap;t.exports="function"==typeof o&&/native code/.test(i.call(o))},function(t,e,n){"use strict";var r=n(80),i=n(221),o=n(132),s=n(223),a=n(82),c=n(19),u=n(54),l=n(8),f=n(52),p=n(40),h=n(131),d=h.IteratorPrototype,b=h.BUGGY_SAFARI_ITERATORS,m=l("iterator"),g=function(){return this};t.exports=function(t,e,n,l,h,v,y){i(n,e,l);var w,k,x,O=function(t){if(t===h&&T)return T;if(!b&&t in _)return _[t];switch(t){case"keys":case"values":case"entries":return function(){return new n(this,t)}}return function(){return new n(this)}},j=e+" Iterator",S=!1,_=t.prototype,A=_[m]||_["@@iterator"]||h&&_[h],T=!b&&A||O(h),P="Array"==e&&_.entries||A;if(P&&(w=o(P.call(new t)),d!==Object.prototype&&w.next&&(f||o(w)===d||(s?s(w,d):"function"!=typeof w[m]&&c(w,m,g)),a(w,j,!0,!0),f&&(p[j]=g))),"values"==h&&A&&"values"!==A.name&&(S=!0,T=function(){return A.call(this)}),f&&!y||_[m]===T||c(_,m,T),p[e]=T,h)if(k={values:O("values"),keys:v?T:O("keys"),entries:O("entries")},y)for(x in k)!b&&!S&&x in _||u(_,x,k[x]);else r({target:e,proto:!0,forced:b||S},k);return k}},function(t,e,n){"use strict";var r={}.propertyIsEnumerable,i=Object.getOwnPropertyDescriptor,o=i&&!r.call({1:2},1);e.f=o?function(t){var e=i(this,t);return!!e&&e.enumerable}:r},function(t,e,n){var r=n(20),i=n(218),o=n(81),s=n(39);t.exports=function(t,e){for(var n=i(e),a=s.f,c=o.f,u=0;us;){var a,c,u,l=r[s++],f=o?l.ok:l.fail,p=l.resolve,h=l.reject,d=l.domain;try{f?(o||(2===e.rejection&&et(t,e),e.rejection=1),!0===f?a=i:(d&&d.enter(),a=f(i),d&&(d.exit(),u=!0)),a===l.promise?h($("Promise-chain cycle")):(c=K(a))?c.call(a,p,h):p(a)):h(i)}catch(t){d&&!u&&d.exit(),h(t)}}e.reactions=[],e.notified=!1,n&&!e.rejection&&Q(t,e)}))}},Y=function(t,e,n){var r,i;V?((r=B.createEvent("Event")).promise=e,r.reason=n,r.initEvent(t,!1,!0),u.dispatchEvent(r)):r={promise:e,reason:n},(i=u["on"+t])?i(r):"unhandledrejection"===t&&_("Unhandled promise rejection",n)},Q=function(t,e){O.call(u,(function(){var n,r=e.value;if(tt(e)&&(n=T((function(){J?U.emit("unhandledRejection",r,t):Y("unhandledrejection",t,r)})),e.rejection=J||tt(e)?2:1,n.error))throw n.value}))},tt=function(t){return 1!==t.rejection&&!t.parent},et=function(t,e){O.call(u,(function(){J?U.emit("rejectionHandled",t):Y("rejectionhandled",t,e.value)}))},nt=function(t,e,n,r){return function(i){t(e,n,i,r)}},rt=function(t,e,n,r){e.done||(e.done=!0,r&&(e=r),e.value=n,e.state=2,Z(t,e,!0))},it=function(t,e,n,r){if(!e.done){e.done=!0,r&&(e=r);try{if(t===n)throw $("Promise can't be resolved itself");var i=K(n);i?j((function(){var r={done:!1};try{i.call(n,nt(it,t,r,e),nt(rt,t,r,e))}catch(n){rt(t,r,n,e)}})):(e.value=n,e.state=1,Z(t,e,!1))}catch(n){rt(t,{done:!1},n,e)}}};H&&(D=function(t){v(this,D,F),g(t),r.call(this);var e=M(this);try{t(nt(it,this,e),nt(rt,this,e))}catch(t){rt(this,e,t)}},(r=function(t){N(this,{type:F,done:!1,notified:!1,parent:!1,reactions:[],rejection:!1,state:0,value:void 0})}).prototype=h(D.prototype,{then:function(t,e){var n=R(this),r=W(x(this,D));return r.ok="function"!=typeof t||t,r.fail="function"==typeof e&&e,r.domain=J?U.domain:void 0,n.parent=!0,n.reactions.push(r),0!=n.state&&Z(this,n,!1),r.promise},catch:function(t){return this.then(void 0,t)}}),i=function(){var t=new r,e=M(t);this.promise=t,this.resolve=nt(it,t,e),this.reject=nt(rt,t,e)},A.f=W=function(t){return t===D||t===o?new i(t):G(t)},c||"function"!=typeof f||(s=f.prototype.then,p(f.prototype,"then",(function(t,e){var n=this;return new D((function(t,e){s.call(n,t,e)})).then(t,e)}),{unsafe:!0}),"function"==typeof L&&a({global:!0,enumerable:!0,forced:!0},{fetch:function(t){return S(D,L.apply(u,arguments))}}))),a({global:!0,wrap:!0,forced:H},{Promise:D}),d(D,F,!1,!0),b(F),o=l.Promise,a({target:F,stat:!0,forced:H},{reject:function(t){var e=W(this);return e.reject.call(void 0,t),e.promise}}),a({target:F,stat:!0,forced:c||H},{resolve:function(t){return S(c&&this===o?D:this,t)}}),a({target:F,stat:!0,forced:X},{all:function(t){var e=this,n=W(e),r=n.resolve,i=n.reject,o=T((function(){var n=g(e.resolve),o=[],s=0,a=1;w(t,(function(t){var c=s++,u=!1;o.push(void 0),a++,n.call(e,t).then((function(t){u||(u=!0,o[c]=t,--a||r(o))}),i)})),--a||r(o)}));return o.error&&i(o.value),n.promise},race:function(t){var e=this,n=W(e),r=n.reject,i=T((function(){var i=g(e.resolve);w(t,(function(t){i.call(e,t).then(n.resolve,r)}))}));return i.error&&r(i.value),n.promise}})},function(t,e,n){var r=n(1);t.exports=r.Promise},function(t,e,n){var r=n(54);t.exports=function(t,e,n){for(var i in e)r(t,i,e[i],n);return t}},function(t,e,n){"use strict";var r=n(53),i=n(39),o=n(8),s=n(28),a=o("species");t.exports=function(t){var e=r(t),n=i.f;s&&e&&!e[a]&&n(e,a,{configurable:!0,get:function(){return this}})}},function(t,e){t.exports=function(t,e,n){if(!(t instanceof e))throw TypeError("Incorrect "+(n?n+" ":"")+"invocation");return t}},function(t,e,n){var r=n(17),i=n(233),o=n(125),s=n(134),a=n(234),c=n(236),u=function(t,e){this.stopped=t,this.result=e};(t.exports=function(t,e,n,l,f){var p,h,d,b,m,g,v,y=s(e,n,l?2:1);if(f)p=t;else{if("function"!=typeof(h=a(t)))throw TypeError("Target is not iterable");if(i(h)){for(d=0,b=o(t.length);b>d;d++)if((m=l?y(r(v=t[d])[0],v[1]):y(t[d]))&&m instanceof u)return m;return new u(!1)}p=h.call(t)}for(g=p.next;!(v=g.call(p)).done;)if("object"==typeof(m=c(p,y,v.value,l))&&m&&m instanceof u)return m;return new u(!1)}).stop=function(t){return new u(!0,t)}},function(t,e,n){var r=n(8),i=n(40),o=r("iterator"),s=Array.prototype;t.exports=function(t){return void 0!==t&&(i.Array===t||s[o]===t)}},function(t,e,n){var r=n(235),i=n(40),o=n(8)("iterator");t.exports=function(t){if(null!=t)return t[o]||t["@@iterator"]||i[r(t)]}},function(t,e,n){var r=n(38),i=n(8)("toStringTag"),o="Arguments"==r(function(){return arguments}());t.exports=function(t){var e,n,s;return void 0===t?"Undefined":null===t?"Null":"string"==typeof(n=function(t,e){try{return t[e]}catch(t){}}(e=Object(t),i))?n:o?r(e):"Object"==(s=r(e))&&"function"==typeof e.callee?"Arguments":s}},function(t,e,n){var r=n(17);t.exports=function(t,e,n,i){try{return i?e(r(n)[0],n[1]):e(n)}catch(e){var o=t.return;throw void 0!==o&&r(o.call(t)),e}}},function(t,e,n){var r=n(8)("iterator"),i=!1;try{var o=0,s={next:function(){return{done:!!o++}},return:function(){i=!0}};s[r]=function(){return this},Array.from(s,(function(){throw 2}))}catch(t){}t.exports=function(t,e){if(!e&&!i)return!1;var n=!1;try{var o={};o[r]=function(){return{next:function(){return{done:n=!0}}}},t(o)}catch(t){}return n}},function(t,e,n){var r=n(17),i=n(41),o=n(8)("species");t.exports=function(t,e){var n,s=r(t).constructor;return void 0===s||null==(n=r(s)[o])?e:i(n)}},function(t,e,n){var r,i,o,s,a,c,u,l,f=n(1),p=n(81).f,h=n(38),d=n(135).set,b=n(83),m=f.MutationObserver||f.WebKitMutationObserver,g=f.process,v=f.Promise,y="process"==h(g),w=p(f,"queueMicrotask"),k=w&&w.value;k||(r=function(){var t,e;for(y&&(t=g.domain)&&t.exit();i;){e=i.fn,i=i.next;try{e()}catch(t){throw i?s():o=void 0,t}}o=void 0,t&&t.enter()},y?s=function(){g.nextTick(r)}:m&&!/(iphone|ipod|ipad).*applewebkit/i.test(b)?(a=!0,c=document.createTextNode(""),new m(r).observe(c,{characterData:!0}),s=function(){c.data=a=!a}):v&&v.resolve?(u=v.resolve(void 0),l=u.then,s=function(){l.call(u,r)}):s=function(){d.call(f,r)}),t.exports=k||function(t){var e={fn:t,next:void 0};o&&(o.next=e),i||(i=e,s()),o=e}},function(t,e,n){var r=n(17),i=n(22),o=n(136);t.exports=function(t,e){if(r(t),i(e)&&e.constructor===t)return e;var n=o.f(t);return(0,n.resolve)(e),n.promise}},function(t,e,n){var r=n(1);t.exports=function(t,e){var n=r.console;n&&n.error&&(1===arguments.length?n.error(t):n.error(t,e))}},function(t,e){t.exports=function(t){try{return{error:!1,value:t()}}catch(t){return{error:!0,value:t}}}},function(t,e,n){var r=n(1),i=n(244),o=n(72),s=n(19),a=n(8),c=a("iterator"),u=a("toStringTag"),l=o.values;for(var f in i){var p=r[f],h=p&&p.prototype;if(h){if(h[c]!==l)try{s(h,c,l)}catch(t){h[c]=l}if(h[u]||s(h,u,f),i[f])for(var d in o)if(h[d]!==o[d])try{s(h,d,o[d])}catch(t){h[d]=o[d]}}}},function(t,e){t.exports={CSSRuleList:0,CSSStyleDeclaration:0,CSSValueList:0,ClientRectList:0,DOMRectList:0,DOMStringList:0,DOMTokenList:1,DataTransferItemList:0,FileList:0,HTMLAllCollection:0,HTMLCollection:0,HTMLFormElement:0,HTMLSelectElement:0,MediaList:0,MimeTypeArray:0,NamedNodeMap:0,NodeList:1,PaintRequestList:0,Plugin:0,PluginArray:0,SVGLengthList:0,SVGNumberList:0,SVGPathSegList:0,SVGPointList:0,SVGStringList:0,SVGTransformList:0,SourceBufferList:0,StyleSheetList:0,TextTrackCueList:0,TextTrackList:0,TouchList:0}},function(t,e,n){n(72),t.exports=function(){"use strict";function t(t,e){t||error(e)}var e,n,r=function(){function t(t,e){this.w=t,this.h=e}return t.prototype={toString:function(){return"("+this.w+", "+this.h+")"},getHalfSize:function(){return new r(this.w>>>1,this.h>>>1)},length:function(){return this.w*this.h}},t}(),i=function(){function e(t,e,n){this.bytes=new Uint8Array(t),this.start=e||0,this.pos=this.start,this.end=e+n||this.bytes.length}return e.prototype={get length(){return this.end-this.start},get position(){return this.pos},get remaining(){return this.end-this.pos},readU8Array:function(t){if(this.pos>this.end-t)return null;var e=this.bytes.subarray(this.pos,this.pos+t);return this.pos+=t,e},readU32Array:function(t,e,n){if(e=e||1,this.pos>this.end-t*e*4)return null;if(1==e){for(var r=new Uint32Array(t),i=0;i>24},readU8:function(){return this.pos>=this.end?null:this.bytes[this.pos++]},read16:function(){return this.readU16()<<16>>16},readU16:function(){if(this.pos>=this.end-1)return null;var t=this.bytes[this.pos+0]<<8|this.bytes[this.pos+1];return this.pos+=2,t},read24:function(){return this.readU24()<<8>>8},readU24:function(){var t=this.pos,e=this.bytes;if(t>this.end-3)return null;var n=e[t+0]<<16|e[t+1]<<8|e[t+2];return this.pos+=3,n},peek32:function(t){var e=this.pos,n=this.bytes;if(e>this.end-4)return null;var r=n[e+0]<<24|n[e+1]<<16|n[e+2]<<8|n[e+3];return t&&(this.pos+=4),r},read32:function(){return this.peek32(!0)},readU32:function(){return this.peek32(!0)>>>0},read4CC:function(){var t=this.pos;if(t>this.end-4)return null;for(var e="",n=0;n<4;n++)e+=String.fromCharCode(this.bytes[t+n]);return this.pos+=4,e},readFP16:function(){return this.read32()/65536},readFP8:function(){return this.read16()/256},readISO639:function(){for(var t=this.readU16(),e="",n=0;n<3;n++){var r=t>>>5*(2-n)&31;e+=String.fromCharCode(r+96)}return e},readUTF8:function(t){for(var e="",n=0;nthis.end)&&error("Index out of bounds (bounds: [0, "+this.end+"], index: "+t+")."),this.pos=t},subStream:function(t,e){return new i(this.bytes.buffer,t,e)}},e}(),o=function(){function e(t){this.stream=t,this.tracks={}}return e.prototype={readBoxes:function(t,e){for(;t.peek32();){var n=this.readBox(t);if(n.type in e){var r=e[n.type];r instanceof Array||(e[n.type]=[r]),e[n.type].push(n)}else e[n.type]=n}},readBox:function(e){var n={offset:e.position};function r(){n.version=e.readU8(),n.flags=e.readU24()}function i(){return n.size-(e.position-n.offset)}function o(){e.skip(i())}var a=function(){var t=e.subStream(e.position,i());this.readBoxes(t,n),e.skip(t.length)}.bind(this);switch(n.size=e.readU32(),n.type=e.read4CC(),n.type){case"ftyp":n.name="File Type Box",n.majorBrand=e.read4CC(),n.minorVersion=e.readU32(),n.compatibleBrands=new Array((n.size-16)/4);for(var c=0;c0&&(n.name=e.readUTF8(u));break;case"minf":n.name="Media Information Box",a();break;case"stbl":n.name="Sample Table Box",a();break;case"stsd":n.name="Sample Description Box",r(),n.sd=[];e.readU32();a();break;case"avc1":e.reserved(6,0),n.dataReferenceIndex=e.readU16(),t(0==e.readU16()),t(0==e.readU16()),e.readU32(),e.readU32(),e.readU32(),n.width=e.readU16(),n.height=e.readU16(),n.horizontalResolution=e.readFP16(),n.verticalResolution=e.readFP16(),t(0==e.readU32()),n.frameCount=e.readU16(),n.compressorName=e.readPString(32),n.depth=e.readU16(),t(65535==e.readU16()),a();break;case"mp4a":e.reserved(6,0),n.dataReferenceIndex=e.readU16(),n.version=e.readU16(),e.skip(2),e.skip(4),n.channelCount=e.readU16(),n.sampleSize=e.readU16(),n.compressionId=e.readU16(),n.packetSize=e.readU16(),n.sampleRate=e.readU32()>>>16,t(0==n.version),a();break;case"esds":n.name="Elementary Stream Descriptor",r(),o();break;case"avcC":n.name="AVC Configuration Box",n.configurationVersion=e.readU8(),n.avcProfileIndication=e.readU8(),n.profileCompatibility=e.readU8(),n.avcLevelIndication=e.readU8(),n.lengthSizeMinusOne=3&e.readU8(),t(3==n.lengthSizeMinusOne,"TODO");var l=31&e.readU8();n.sps=[];for(c=0;c=8,"Cannot parse large media data yet."),n.data=e.readU8Array(i());break;default:o()}return n},read:function(){var t=(new Date).getTime();this.file={},this.readBoxes(this.stream,this.file),console.info("Parsed stream in "+((new Date).getTime()-t)+" ms")},traceSamples:function(){var t=this.tracks[1],e=this.tracks[2];console.info("Video Samples: "+t.getSampleCount()),console.info("Audio Samples: "+e.getSampleCount());for(var n=0,r=0,i=0;i<100;i++){var o=t.sampleToOffset(n),s=e.sampleToOffset(r),a=t.sampleToSize(n,1),c=e.sampleToSize(r,1);o0){var s=n[i-1],a=o.firstChunk-s.firstChunk,c=s.samplesPerChunk*a;if(!(e>=c))return{index:r+Math.floor(e/s.samplesPerChunk),offset:e%s.samplesPerChunk};if(e-=c,i==n.length-1)return{index:r+a+Math.floor(e/o.samplesPerChunk),offset:e%o.samplesPerChunk};r+=a}}t(!1)},chunkToOffset:function(t){return this.trak.mdia.minf.stbl.stco.table[t]},sampleToOffset:function(t){var e=this.sampleToChunk(t);return this.chunkToOffset(e.index)+this.sampleToSize(t-e.offset,e.offset)},timeToSample:function(t){for(var e=this.trak.mdia.minf.stbl.stts.table,n=0,r=0;r=i))return n+Math.floor(t/e[r].delta);t-=i,n+=e[r].count}},getTotalTime:function(){for(var e=this.trak.mdia.minf.stbl.stts.table,n=0,r=0;r0;){var s=new i(e.buffer,n).readU32();o.push(e.subarray(n+4,n+s+4)),n=n+s+4}return o}},e}();e=[],n="zero-timeout-message",window.addEventListener("message",(function(t){t.source==window&&t.data==n&&(t.stopPropagation(),e.length>0&&e.shift()())}),!0),window.setZeroTimeout=function(t){e.push(t),window.postMessage(n,"*")};var a=function(){function t(t,n,r,i){this.stream=t,this.useWorkers=n,this.webgl=r,this.render=i,this.statistics={videoStartTime:0,videoPictureCounter:0,windowStartTime:0,windowPictureCounter:0,fps:0,fpsMin:1e3,fpsMax:-1e3,webGLTextureUploadTime:0},this.onStatisticsUpdated=function(){},this.avc=new Player({useWorker:n,reuseMemory:!0,webgl:r,size:{width:640,height:368}}),this.webgl=this.avc.webgl;var o=this;this.avc.onPictureDecoded=function(){e.call(o)},this.canvas=this.avc.canvas}function e(){var t=this.statistics;t.videoPictureCounter+=1,t.windowPictureCounter+=1;var e=Date.now();t.videoStartTime||(t.videoStartTime=e);var n=e-t.videoStartTime;if(t.elapsed=n/1e3,!(n<1e3))if(t.windowStartTime){if(e-t.windowStartTime>1e3){var r=e-t.windowStartTime,i=t.windowPictureCounter/r*1e3;t.windowStartTime=e,t.windowPictureCounter=0,it.fpsMax&&(t.fpsMax=i),t.fps=i}i=t.videoPictureCounter/n*1e3;t.fpsSinceStart=i,this.onStatisticsUpdated(this.statistics)}else t.windowStartTime=e}return t.prototype={readAll:function(t){console.info("MP4Player::readAll()"),this.stream.readAll(null,function(e){this.reader=new o(new i(e)),this.reader.read();var n=this.reader.tracks[1];this.size=new r(n.trak.tkhd.width,n.trak.tkhd.height),console.info("MP4Player::readAll(), length: "+this.reader.stream.length),t&&t()}.bind(this))},play:function(){var t=this.reader;if(t){var e=t.tracks[1],n=(t.tracks[2],t.tracks[1].trak.mdia.minf.stbl.stsd.avc1.avcC),r=n.sps[0],i=n.pps[0];this.avc.decode(r),this.avc.decode(i);var o=0;setTimeout(function t(){var n=this.avc;e.getSampleNALUnits(o).forEach((function(t){n.decode(t)})),++o<3e3&&setTimeout(t.bind(this),1)}.bind(this),1)}else this.readAll(this.play.bind(this))}},t}(),c=function(){function t(t){var e=t.attributes.src?t.attributes.src.value:void 0,n=(t.attributes.width&&t.attributes.width.value,t.attributes.height&&t.attributes.height.value,document.createElement("div"));n.setAttribute("style","z-index: 100; position: absolute; bottom: 0px; background-color: rgba(0,0,0,0.8); height: 30px; width: 100%; text-align: left;"),this.info=document.createElement("div"),this.info.setAttribute("style","font-size: 14px; font-weight: bold; padding: 6px; color: lime;"),n.appendChild(this.info),t.appendChild(n);var r=!!t.attributes.workers&&"true"==t.attributes.workers.value,i=!!t.attributes.render&&"true"==t.attributes.render.value,o="auto";t.attributes.webgl&&("true"==t.attributes.webgl.value&&(o=!0),"false"==t.attributes.webgl.value&&(o=!1));var s="";s+=r?"worker thread ":"main thread ",this.player=new a(new Stream(e),r,o,i),this.canvas=this.player.canvas,this.canvas.onclick=function(){this.play()}.bind(this),t.appendChild(this.canvas),s+=" - webgl: "+this.player.webgl,this.info.innerHTML="Click canvas to load and play - "+s,this.score=null,this.player.onStatisticsUpdated=function(t){if(t.videoPictureCounter%10==0){var e="";t.fps&&(e+=" fps: "+t.fps.toFixed(2)),t.fpsSinceStart&&(e+=" avg: "+t.fpsSinceStart.toFixed(2));t.videoPictureCounter<1200?this.score=1200-t.videoPictureCounter:1200==t.videoPictureCounter&&(this.score=t.fpsSinceStart.toFixed(2)),this.info.innerHTML=s+e}}.bind(this)}return t.prototype={play:function(){this.player.play()}},t}();return{Size:r,Track:s,MP4Reader:o,MP4Player:a,Bytestream:i,Broadway:c}}()},function(t,e,n){"use strict";(function(t){Object.defineProperty(e,"__esModule",{value:!0});var n="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t},r="undefined"!=typeof window&&void 0!==window.document,i="object"===("undefined"==typeof self?"undefined":n(self))&&self.constructor&&"DedicatedWorkerGlobalScope"===self.constructor.name,o=void 0!==t&&null!=t.versions&&null!=t.versions.node;e.isBrowser=r,e.isWebWorker=i,e.isNode=o}).call(this,n(112))},function(t,e,n){n(5),n(11),n(10),(()=>{const e=n(26),r=n(248),i=n(251),{checkObjectType:o}=n(56),{Task:s}=n(49),{Loader:a,Dumper:c}=n(138),{ScriptingError:u,DataError:l,ArgumentError:f}=n(6),p=new WeakMap,h=new WeakMap;function d(t){if("task"===t)return h;if("job"===t)return p;throw new u(`Unknown session type was received ${t}`)}async function b(t){const n=t instanceof s?"task":"job",o=d(n);if(!o.has(t)){const s=await e.annotations.getAnnotations(n,t.id),a="job"===n?t.startFrame:0,c="job"===n?t.stopFrame:t.size-1,u={};for(let e=a;e<=c;e++)u[e]=await t.frames.get(e);const l=new r({labels:t.labels||t.task.labels,startFrame:a,stopFrame:c,frameMeta:u}).import(s),f=new i(s.version,l,t);o.set(t,{collection:l,saver:f})}}t.exports={getAnnotations:async function(t,e,n){return await b(t),d(t instanceof s?"task":"job").get(t).collection.get(e,n)},putAnnotations:function(t,e){const n=d(t instanceof s?"task":"job");if(n.has(t))return n.get(t).collection.put(e);throw new l("Collection has not been initialized yet. Call annotations.get() or annotations.clear(true) before")},saveAnnotations:async function(t,e){const n=d(t instanceof s?"task":"job");n.has(t)&&await n.get(t).saver.save(e)},hasUnsavedChanges:function(t){const e=d(t instanceof s?"task":"job");return!!e.has(t)&&e.get(t).saver.hasUnsavedChanges()},mergeAnnotations:function(t,e){const n=d(t instanceof s?"task":"job");if(n.has(t))return n.get(t).collection.merge(e);throw new l("Collection has not been initialized yet. Call annotations.get() or annotations.clear(true) before")},splitAnnotations:function(t,e,n){const r=d(t instanceof s?"task":"job");if(r.has(t))return r.get(t).collection.split(e,n);throw new l("Collection has not been initialized yet. Call annotations.get() or annotations.clear(true) before")},groupAnnotations:function(t,e,n){const r=d(t instanceof s?"task":"job");if(r.has(t))return r.get(t).collection.group(e,n);throw new l("Collection has not been initialized yet. Call annotations.get() or annotations.clear(true) before")},clearAnnotations:async function(t,e){o("reload",e,"boolean",null);const n=d(t instanceof s?"task":"job");n.has(t)&&n.get(t).collection.clear(),e&&(n.delete(t),await b(t))},annotationsStatistics:function(t){const e=d(t instanceof s?"task":"job");if(e.has(t))return e.get(t).collection.statistics();throw new l("Collection has not been initialized yet. Call annotations.get() or annotations.clear(true) before")},selectObject:function(t,e,n,r){const i=d(t instanceof s?"task":"job");if(i.has(t))return i.get(t).collection.select(e,n,r);throw new l("Collection has not been initialized yet. Call annotations.get() or annotations.clear(true) before")},uploadAnnotations:async function(t,n,r){const i=t instanceof s?"task":"job";if(!(r instanceof a))throw new f("A loader must be instance of Loader class");await e.annotations.uploadAnnotations(i,t.id,n,r.name)},dumpAnnotations:async function(t,n,r){if(!(r instanceof c))throw new f("A dumper must be instance of Dumper class");let i=null;return i="job"===(t instanceof s?"task":"job")?await e.annotations.dumpAnnotations(t.task.id,n,r.name):await e.annotations.dumpAnnotations(t.id,n,r.name)},exportDataset:async function(t,n){if(!(n instanceof String||"string"==typeof n))throw new f("Format must be a string");if(!(t instanceof s))throw new f("A dataset can only be created from a task");let r=null;return r=await e.tasks.exportDataset(t.id,n)}}})()},function(t,e,n){n(5),n(137),n(10),n(71),(()=>{const{RectangleShape:e,PolygonShape:r,PolylineShape:i,PointsShape:o,RectangleTrack:s,PolygonTrack:a,PolylineTrack:c,PointsTrack:u,Track:l,Shape:f,Tag:p,objectStateFactory:h}=n(250),{checkObjectType:d}=n(56),b=n(117),{Label:m}=n(55),{DataError:g,ArgumentError:v,ScriptingError:y}=n(6),{ObjectShape:w,ObjectType:k}=n(29),x=n(70),O=["#0066FF","#AF593E","#01A368","#FF861F","#ED0A3F","#FF3F34","#76D7EA","#8359A3","#FBE870","#C5E17A","#03BB85","#FFDF00","#8B8680","#0A6B0D","#8FD8D8","#A36F40","#F653A6","#CA3435","#FFCBA4","#FF99CC","#FA9D5A","#FFAE42","#A78B00","#788193","#514E49","#1164B4","#F4FA9F","#FED8B1","#C32148","#01796F","#E90067","#FF91A4","#404E5A","#6CDAE7","#FFC1CC","#006A93","#867200","#E2B631","#6EEB6E","#FFC800","#CC99BA","#FF007C","#BC6CAC","#DCCCD7","#EBE1C2","#A6AAAE","#B99685","#0086A7","#5E4330","#C8A2C8","#708EB3","#BC8777","#B2592D","#497E48","#6A2963","#E6335F","#00755E","#B5A895","#0048ba","#EED9C4","#C88A65","#FF6E4A","#87421F","#B2BEB5","#926F5B","#00B9FB","#6456B7","#DB5079","#C62D42","#FA9C44","#DA8A67","#FD7C6E","#93CCEA","#FCF686","#503E32","#FF5470","#9DE093","#FF7A00","#4F69C6","#A50B5E","#F0E68C","#FDFF00","#F091A9","#FFFF66","#6F9940","#FC74FD","#652DC1","#D6AEDD","#EE34D2","#BB3385","#6B3FA0","#33CC99","#FFDB00","#87FF2A","#6EEB6E","#FFC800","#CC99BA","#7A89B8","#006A93","#867200","#E2B631","#D9D6CF"];function j(t,n,s){const{type:a}=t,c=O[n%O.length];let u=null;switch(a){case"rectangle":u=new e(t,n,c,s);break;case"polygon":u=new r(t,n,c,s);break;case"polyline":u=new i(t,n,c,s);break;case"points":u=new o(t,n,c,s);break;default:throw new g(`An unexpected type of shape "${a}"`)}return u}function S(t,e,n){if(t.shapes.length){const{type:r}=t.shapes[0],i=O[e%O.length];let o=null;switch(r){case"rectangle":o=new s(t,e,i,n);break;case"polygon":o=new a(t,e,i,n);break;case"polyline":o=new c(t,e,i,n);break;case"points":o=new u(t,e,i,n);break;default:throw new g(`An unexpected type of track "${r}"`)}return o}return console.warn("The track without any shapes had been found. It was ignored."),null}t.exports=class{constructor(t){this.startFrame=t.startFrame,this.stopFrame=t.stopFrame,this.frameMeta=t.frameMeta,this.labels=t.labels.reduce((t,e)=>(t[e.id]=e,t),{}),this.shapes={},this.tags={},this.tracks=[],this.objects={},this.count=0,this.flush=!1,this.collectionZ={},this.groups={max:0},this.injection={labels:this.labels,collectionZ:this.collectionZ,groups:this.groups,frameMeta:this.frameMeta}}import(t){for(const e of t.tags){const t=++this.count,n=new p(e,t,this.injection);this.tags[n.frame]=this.tags[n.frame]||[],this.tags[n.frame].push(n),this.objects[t]=n}for(const e of t.shapes){const t=++this.count,n=j(e,t,this.injection);this.shapes[n.frame]=this.shapes[n.frame]||[],this.shapes[n.frame].push(n),this.objects[t]=n}for(const e of t.tracks){const t=++this.count,n=S(e,t,this.injection);n&&(this.tracks.push(n),this.objects[t]=n)}return this}export(){return{tracks:this.tracks.filter(t=>!t.removed).map(t=>t.toJSON()),shapes:Object.values(this.shapes).reduce((t,e)=>(t.push(...e),t),[]).filter(t=>!t.removed).map(t=>t.toJSON()),tags:Object.values(this.tags).reduce((t,e)=>(t.push(...e),t),[]).filter(t=>!t.removed).map(t=>t.toJSON())}}get(t){const{tracks:e}=this,n=this.shapes[t]||[],r=this.tags[t]||[],i=e.concat(n).concat(r).filter(t=>!t.removed),o=[];for(const e of i){const n=e.get(t);if(n.outside&&!n.keyframe)continue;const r=h.call(e,t,n);o.push(r)}return o}merge(t){if(d("shapes for merge",t,null,Array),!t.length)return;const e=t.map(t=>{d("object state",t,null,x);const e=this.objects[t.clientID];if(void 0===e)throw new v("The object has not been saved yet. Call ObjectState.put([state]) before you can merge it");return e}),n={},{label:r,shapeType:i}=t[0];if(!(r.id in this.labels))throw new v(`Unknown label for the task: ${r.id}`);if(!Object.values(w).includes(i))throw new v(`Got unknown shapeType "${i}"`);const o=r.attributes.reduce((t,e)=>(t[e.id]=e,t),{});for(let s=0;s(e in o&&o[e].mutable&&t.push({spec_id:+e,value:a.attributes[e]}),t),[])},a.frame+1 in n||(n[a.frame+1]=JSON.parse(JSON.stringify(n[a.frame])),n[a.frame+1].outside=!0,n[a.frame+1].frame++)}else{if(!(a instanceof l))throw new v(`Trying to merge unknown object type: ${a.constructor.name}. `+"Only shapes and tracks are expected.");{const t={};for(const e of Object.keys(a.shapes)){const r=a.shapes[e];if(e in n&&!n[e].outside){if(r.outside)continue;throw new v("Expected only one visible shape per frame")}let o=!1;for(const e in r.attributes)e in t&&t[e]===r.attributes[e]||(o=!0,t[e]=r.attributes[e]);n[e]={type:i,frame:+e,points:[...r.points],occluded:r.occluded,outside:r.outside,zOrder:r.zOrder,attributes:o?Object.keys(t).reduce((e,n)=>(e.push({spec_id:+n,value:t[n]}),e),[]):[]}}}}}let s=!1;for(const t of Object.keys(n).sort((t,e)=>+t-+e)){if((s=s||n[t].outside)||!n[t].outside)break;delete n[t]}const a=++this.count,c=S({frame:Math.min.apply(null,Object.keys(n).map(t=>+t)),shapes:Object.values(n),group:0,label_id:r.id,attributes:Object.keys(t[0].attributes).reduce((e,n)=>(o[n].mutable||e.push({spec_id:+n,value:t[0].attributes[n]}),e),[])},a,this.injection);this.tracks.push(c),this.objects[a]=c;for(const t of e)t.removed=!0,"function"==typeof t.resetCache&&t.resetCache()}split(t,e){d("object state",t,null,x),d("frame",e,"integer",null);const n=this.objects[t.clientID];if(void 0===n)throw new v("The object has not been saved yet. Call annotations.put([state]) before");if(t.objectType!==k.TRACK)return;const r=Object.keys(n.shapes).sort((t,e)=>+t-+e);if(e<=+r[0]||e>r[r.length-1])return;const i=n.label.attributes.reduce((t,e)=>(t[e.id]=e,t),{}),o=n.toJSON(),s={type:t.shapeType,points:[...t.points],occluded:t.occluded,outside:t.outside,zOrder:0,attributes:Object.keys(t.attributes).reduce((e,n)=>(i[n].mutable||e.push({spec_id:+n,value:t.attributes[n]}),e),[]),frame:e},a={frame:o.frame,group:0,label_id:o.label_id,attributes:o.attributes,shapes:[]},c=JSON.parse(JSON.stringify(a));c.frame=e,c.shapes.push(JSON.parse(JSON.stringify(s))),o.shapes.map(t=>(delete t.id,t.framee&&c.shapes.push(JSON.parse(JSON.stringify(t))),t)),a.shapes.push(s),a.shapes[a.shapes.length-1].outside=!0;let u=++this.count;const l=S(a,u,this.injection);this.tracks.push(l),this.objects[u]=l,u=++this.count;const f=S(c,u,this.injection);this.tracks.push(f),this.objects[u]=f,n.removed=!0,n.resetCache()}group(t,e){d("shapes for group",t,null,Array);const n=t.map(t=>{d("object state",t,null,x);const e=this.objects[t.clientID];if(void 0===e)throw new v("The object has not been saved yet. Call annotations.put([state]) before");return e}),r=e?0:++this.groups.max;for(const t of n)t.group=r,"function"==typeof t.resetCache&&t.resetCache();return r}clear(){this.shapes={},this.tags={},this.tracks=[],this.objects={},this.count=0,this.flush=!0}statistics(){const t={},e={rectangle:{shape:0,track:0},polygon:{shape:0,track:0},polyline:{shape:0,track:0},points:{shape:0,track:0},tags:0,manually:0,interpolated:0,total:0},n=JSON.parse(JSON.stringify(e));for(const n of Object.values(this.labels)){const{name:r}=n;t[r]=JSON.parse(JSON.stringify(e))}for(const e of Object.values(this.objects)){let n=null;if(e instanceof f)n="shape";else if(e instanceof l)n="track";else{if(!(e instanceof p))throw new y(`Unexpected object type: "${n}"`);n="tag"}const r=e.label.name;if("tag"===n)t[r].tags++,t[r].manually++,t[r].total++;else{const{shapeType:i}=e;if(t[r][i][n]++,"track"===n){const n=Object.keys(e.shapes).sort((t,e)=>+t-+e).map(t=>+t);let i=n[0],o=!1;for(const s of n){if(o){const e=s-i-1;t[r].interpolated+=e,t[r].total+=e}o=!e.shapes[s].outside,i=s,o&&(t[r].manually++,t[r].total++)}const s=n[n.length-1];if(s!==this.stopFrame&&!e.shapes[s].outside){const e=this.stopFrame-s;t[r].interpolated+=e,t[r].total+=e}}else t[r].manually++,t[r].total++}}for(const e of Object.keys(t))for(const r of Object.keys(t[e]))if("object"==typeof t[e][r])for(const i of Object.keys(t[e][r]))n[r][i]+=t[e][r][i];else n[r]+=t[e][r];return new b(t,n)}put(t){d("shapes for put",t,null,Array);const e={shapes:[],tracks:[],tags:[]};function n(t,e){const n=+e,r=this.attributes[e];return d("attribute id",n,"integer",null),d("attribute value",r,"string",null),t.push({spec_id:n,value:r}),t}for(const r of t){d("object state",r,null,x),d("state client ID",r.clientID,"undefined",null),d("state frame",r.frame,"integer",null),d("state attributes",r.attributes,null,Object),d("state label",r.label,null,m);const t=Object.keys(r.attributes).reduce(n.bind(r),[]),i=r.label.attributes.reduce((t,e)=>(t[e.id]=e,t),{});if("tag"===r.objectType)e.tags.push({attributes:t,frame:r.frame,label_id:r.label.id,group:0});else{d("state occluded",r.occluded,"boolean",null),d("state points",r.points,null,Array);for(const t of r.points)d("point coordinate",t,"number",null);if(!Object.values(w).includes(r.shapeType))throw new v("Object shape must be one of: "+`${JSON.stringify(Object.values(w))}`);if("shape"===r.objectType)e.shapes.push({attributes:t,frame:r.frame,group:0,label_id:r.label.id,occluded:r.occluded||!1,points:[...r.points],type:r.shapeType,z_order:0});else{if("track"!==r.objectType)throw new v("Object type must be one of: "+`${JSON.stringify(Object.values(k))}`);e.tracks.push({attributes:t.filter(t=>!i[t.spec_id].mutable),frame:r.frame,group:0,label_id:r.label.id,shapes:[{attributes:t.filter(t=>i[t.spec_id].mutable),frame:r.frame,occluded:r.occluded||!1,outside:!1,points:[...r.points],type:r.shapeType,z_order:0}]})}}}this.import(e)}select(t,e,n){d("shapes for select",t,null,Array),d("x coordinate",e,"number",null),d("y coordinate",n,"number",null);let r=null,i=null;for(const o of t){if(d("object state",o,null,x),o.outside)continue;const t=this.objects[o.clientID];if(void 0===t)throw new v("The object has not been saved yet. Call annotations.put([state]) before");const s=t.constructor.distance(o.points,e,n);null!==s&&(null===r||s{const e=n(70),{checkObjectType:r,isEnum:o}=n(56),{ObjectShape:s,ObjectType:a,AttributeType:c,VisibleState:u}=n(29),{DataError:l,ArgumentError:f,ScriptingError:p}=n(6),{Label:h}=n(55);function d(t,n){const r=new e(n);return r.hidden={save:this.save.bind(this,t,r),delete:this.delete.bind(this),up:this.up.bind(this,t,r),down:this.down.bind(this,t,r)},r}function b(t,e){if(t===s.RECTANGLE){if(e.length/2!=2)throw new l(`Rectangle must have 2 points, but got ${e.length/2}`)}else if(t===s.POLYGON){if(e.length/2<3)throw new l(`Polygon must have at least 3 points, but got ${e.length/2}`)}else if(t===s.POLYLINE){if(e.length/2<2)throw new l(`Polyline must have at least 2 points, but got ${e.length/2}`)}else{if(t!==s.POINTS)throw new f(`Unknown value of shapeType has been recieved ${t}`);if(e.length/2<1)throw new l(`Points must have at least 1 points, but got ${e.length/2}`)}}function m(t,e){if(t===s.POINTS)return!0;let n=Number.MAX_SAFE_INTEGER,r=Number.MIN_SAFE_INTEGER,i=Number.MAX_SAFE_INTEGER,o=Number.MIN_SAFE_INTEGER;for(let t=0;t=3}return(r-n)*(o-i)>=9}function g(t,e){const{values:n}=e,r=e.inputType;if("string"!=typeof t)throw new f(`Attribute value is expected to be string, but got ${typeof t}`);return r===c.NUMBER?+t>=+n[0]&&+t<=+n[1]&&!((+t-+n[0])%+n[2]):r===c.CHECKBOX?["true","false"].includes(t.toLowerCase()):n.includes(t)}class v{constructor(t,e,n){this.taskLabels=n.labels,this.clientID=e,this.serverID=t.id,this.group=t.group,this.label=this.taskLabels[t.label_id],this.frame=t.frame,this.removed=!1,this.lock=!1,this.attributes=t.attributes.reduce((t,e)=>(t[e.spec_id]=e.value,t),{}),this.appendDefaultAttributes(this.label),n.groups.max=Math.max(n.groups.max,this.group)}appendDefaultAttributes(t){const e=t.attributes;for(const t of e)t.id in this.attributes||(this.attributes[t.id]=t.defaultValue)}delete(t){return this.lock&&!t||(this.removed=!0),!0}}class y extends v{constructor(t,e,n,r){super(t,e,r),this.frameMeta=r.frameMeta,this.collectionZ=r.collectionZ,this.visibility=u.SHAPE,this.color=n,this.shapeType=null}_getZ(t){return this.collectionZ[t]=this.collectionZ[t]||{max:0,min:0},this.collectionZ[t]}save(){throw new p("Is not implemented")}get(){throw new p("Is not implemented")}toJSON(){throw new p("Is not implemented")}up(t,e){const n=this._getZ(t);n.max++,e.zOrder=n.max}down(t,e){const n=this._getZ(t);n.min--,e.zOrder=n.min}}class w extends y{constructor(t,e,n,r){super(t,e,n,r),this.points=t.points,this.occluded=t.occluded,this.zOrder=t.z_order;const i=this._getZ(this.frame);i.max=Math.max(i.max,this.zOrder||0),i.min=Math.min(i.min,this.zOrder||0)}toJSON(){return{type:this.shapeType,clientID:this.clientID,occluded:this.occluded,z_order:this.zOrder,points:[...this.points],attributes:Object.keys(this.attributes).reduce((t,e)=>(t.push({spec_id:e,value:this.attributes[e]}),t),[]),id:this.serverID,frame:this.frame,label_id:this.label.id,group:this.group}}get(t){if(t!==this.frame)throw new p("Got frame is not equal to the frame of the shape");return{objectType:a.SHAPE,shapeType:this.shapeType,clientID:this.clientID,serverID:this.serverID,occluded:this.occluded,lock:this.lock,zOrder:this.zOrder,points:[...this.points],attributes:i({},this.attributes),label:this.label,group:this.group,color:this.color,visibility:this.visibility}}save(t,e){if(t!==this.frame)throw new p("Got frame is not equal to the frame of the shape");if(this.lock&&e.lock)return d.call(this,t,this.get(t));const n=this.get(t),i=e.updateFlags;if(i.label&&(r("label",e.label,null,h),n.label=e.label,n.attributes={},this.appendDefaultAttributes.call(n,n.label)),i.attributes){const t=n.label.attributes.reduce((t,e)=>(t[e.id]=e,t),{});for(const r of Object.keys(e.attributes)){const i=e.attributes[r];if(!(r in t&&g(i,t[r])))throw new f(`Trying to save unknown attribute with id ${r} and value ${i}`);n.attributes[r]=i}}if(i.points){r("points",e.points,null,Array),b(this.shapeType,e.points);const{width:i,height:o}=this.frameMeta[t],s=[];for(let t=0;t{t[e.frame]={serverID:e.id,occluded:e.occluded,zOrder:e.z_order,points:e.points,outside:e.outside,attributes:e.attributes.reduce((t,e)=>(t[e.spec_id]=e.value,t),{})};const n=this._getZ(e.frame);return n.max=Math.max(n.max,e.z_order),n.min=Math.min(n.min,e.z_order),t},{}),this.cache={}}toJSON(){const t=this.label.attributes.reduce((t,e)=>(t[e.id]=e,t),{});return{clientID:this.clientID,id:this.serverID,frame:this.frame,label_id:this.label.id,group:this.group,attributes:Object.keys(this.attributes).reduce((e,n)=>(t[n].mutable||e.push({spec_id:n,value:this.attributes[n]}),e),[]),shapes:Object.keys(this.shapes).reduce((e,n)=>(e.push({type:this.shapeType,occluded:this.shapes[n].occluded,z_order:this.shapes[n].zOrder,points:[...this.shapes[n].points],outside:this.shapes[n].outside,attributes:Object.keys(this.shapes[n].attributes).reduce((e,r)=>(t[r].mutable&&e.push({spec_id:r,value:this.shapes[n].attributes[r]}),e),[]),id:this.shapes[n].serverID,frame:+n}),e),[])}}get(t){if(!(t in this.cache)){const e=Object.assign({},this.getPosition(t),{attributes:this.getAttributes(t),group:this.group,objectType:a.TRACK,shapeType:this.shapeType,clientID:this.clientID,serverID:this.serverID,lock:this.lock,color:this.color,visibility:this.visibility});this.cache[t]=e}const e=JSON.parse(JSON.stringify(this.cache[t]));return e.label=this.label,e}neighborsFrames(t){const e=Object.keys(this.shapes).map(t=>+t);let n=Number.MAX_SAFE_INTEGER,r=Number.MAX_SAFE_INTEGER;for(const i of e){const e=Math.abs(t-i);i<=t&&e+t-+e);for(const r of n)if(r<=t){const{attributes:t}=this.shapes[r];for(const n in t)Object.prototype.hasOwnProperty.call(t,n)&&(e[n]=t[n])}return e}save(t,e){if(this.lock&&e.lock)return d.call(this,t,this.get(t));const n=Object.assign(this.get(t));n.attributes=Object.assign(n.attributes),n.points=[...n.points];const i=e.updateFlags;let s=!1;i.label&&(r("label",e.label,null,h),n.label=e.label,n.attributes={},this.appendDefaultAttributes.call(n,n.label));const a=n.label.attributes.reduce((t,e)=>(t[e.id]=e,t),{});if(i.attributes)for(const t of Object.keys(e.attributes)){const r=e.attributes[t];if(!(t in a&&g(r,a[t])))throw new f(`Trying to save unknown attribute with id ${t} and value ${r}`);n.attributes[t]=r}if(i.points){r("points",e.points,null,Array),b(this.shapeType,e.points);const{width:i,height:o}=this.frameMeta[t],a=[];for(let t=0;tt&&delete this.cache[e];return this.cache[t].keyframe=!1,delete this.shapes[t],i.reset(),d.call(this,t,this.get(t))}if(s||i.keyframe&&e.keyframe){for(const e in this.cache)+e>t&&delete this.cache[e];if(this.cache[t].keyframe=!0,e.keyframe=!0,this.shapes[t]={frame:t,zOrder:n.zOrder,points:n.points,outside:n.outside,occluded:n.occluded,attributes:{}},i.attributes)for(const r of Object.keys(n.attributes))a[r].mutable&&(this.shapes[t].attributes[r]=e.attributes[r],this.shapes[t].attributes[r]=e.attributes[r])}return i.reset(),d.call(this,t,this.get(t))}getPosition(t){const{leftFrame:e,rightFrame:n}=this.neighborsFrames(t),r=Number.isInteger(n)?this.shapes[n]:null,i=Number.isInteger(e)?this.shapes[e]:null;if(i&&e===t)return{points:[...i.points],occluded:i.occluded,outside:i.outside,zOrder:i.zOrder,keyframe:!0};if(r&&i)return Object.assign({},this.interpolatePosition(i,r,(t-e)/(n-e)),{keyframe:!1});if(r)return{points:[...r.points],occluded:r.occluded,outside:!0,zOrder:0,keyframe:!1};if(i)return{points:[...i.points],occluded:i.occluded,outside:i.outside,zOrder:0,keyframe:!1};throw new p(`No one neightbour frame found for the track with client ID: "${this.id}"`)}delete(t){return this.lock&&!t||(this.removed=!0,this.resetCache()),!0}resetCache(){this.cache={}}}class x extends w{constructor(t,e,n,r){super(t,e,n,r),this.shapeType=s.RECTANGLE,b(this.shapeType,this.points)}static distance(t,e,n){const[r,i,o,s]=t;return e>=r&&e<=o&&n>=i&&n<=s?Math.min.apply(null,[e-r,n-i,o-e,s-n]):null}}class O extends w{constructor(t,e,n,r){super(t,e,n,r)}}class j extends O{constructor(t,e,n,r){super(t,e,n,r),this.shapeType=s.POLYGON,b(this.shapeType,this.points)}static distance(t,e,n){function r(t,r,i,o){return(i-t)*(n-r)-(e-t)*(o-r)}let i=0;const o=[];for(let s=0,a=t.length-2;sn&&r(c,u,l,f)>0&&i++:f<=n&&r(c,u,l,f)<0&&i--;const p=e-(u-f),h=n-(l-c);(p-c)*(l-p)>=0&&(h-u)*(f-h)>=0?o.push(Math.sqrt(Math.pow(e-p,2)+Math.pow(n-h,2))):o.push(Math.min(Math.sqrt(Math.pow(c-e,2)+Math.pow(u-n,2)),Math.sqrt(Math.pow(l-e,2)+Math.pow(f-n,2))))}return 0!==i?Math.min.apply(null,o):null}}class S extends O{constructor(t,e,n,r){super(t,e,n,r),this.shapeType=s.POLYLINE,b(this.shapeType,this.points)}static distance(t,e,n){const r=[];for(let i=0;i=0&&(n-s)*(c-n)>=0?r.push(Math.abs((c-s)*e-(a-o)*n+a*s-c*o)/Math.sqrt(Math.pow(c-s,2)+Math.pow(a-o,2))):r.push(Math.min(Math.sqrt(Math.pow(o-e,2)+Math.pow(s-n,2)),Math.sqrt(Math.pow(a-e,2)+Math.pow(c-n,2))))}return Math.min.apply(null,r)}}class _ extends O{constructor(t,e,n,r){super(t,e,n,r),this.shapeType=s.POINTS,b(this.shapeType,this.points)}static distance(t,e,n){const r=[];for(let i=0;ir&&(r=t[o]),t[o+1]>i&&(i=t[o+1]);return{xmin:e,ymin:n,xmax:r,ymax:i}}function i(t,e){const n=[],r=e.xmax-e.xmin,i=e.ymax-e.ymin;for(let o=0;on[i][t]-n[i][e]);const i={},o={};let s=0;for(;Object.values(o).length!==t.length;){for(const e of t){if(o[e])continue;const t=r[e][s],a=n[e][t];if(t in i&&i[t].distance>a){const e=i[t].value;delete i[t],delete o[e]}t in i||(i[t]={value:e,distance:a},o[e]=!0)}s++}const a={};for(const t of Object.keys(i))a[i[t].value]={value:t,distance:i[t].distance};return a}(Array.from(t.keys()),Array.from(e.keys()),s),c=(n(e)+n(t))/(e.length+t.length);!function(t,e){for(const n of Object.keys(t))t[n].distance>e&&delete t[n]}(a,c+3*Math.sqrt((r(t,c)+r(e,c))/(t.length+e.length)));for(const t of Object.keys(a))a[t]=a[t].value;const u=this.appendMapping(a,t,e);for(const n of u)i.push(t[n]),o.push(e[a[n]]);return[i,o]}let u=r(t.points),l=r(e.points);(u.xmax-u.xmin<1||l.ymax-l.ymin<1)&&(l=u={xmin:0,xmax:1024,ymin:0,ymax:768});const f=s(i(t.points,u)),p=s(i(e.points,l));let h=[],d=[];if(f.length>p.length){const[t,e]=c.call(this,p,f);h=e,d=t}else{const[t,e]=c.call(this,f,p);h=t,d=e}const b=o(a(h),u),m=o(a(d),l),g=[];for(let t=0;t+t),i=Object.keys(t).map(t=>+t),o=[];function s(t){let e=t,i=t;if(!r.length)throw new p("Interpolation mapping is empty");for(;!r.includes(e);)--e<0&&(e=n.length-1);for(;!r.includes(i);)++i>=n.length&&(i=0);return[e,i]}function a(t,e,r){const i=[];for(;e!==r;)i.push(n[e]),++e>=n.length&&(e=0);i.push(n[r]);let o=0,s=0,a=!1;for(let e=1;e(t.push({spec_id:e,value:this.attributes[e]}),t),[])}}get(t){if(t!==this.frame)throw new p("Got frame is not equal to the frame of the shape");return{objectType:a.TAG,clientID:this.clientID,serverID:this.serverID,lock:this.lock,attributes:Object.assign({},this.attributes),label:this.label,group:this.group}}save(t,e){if(t!==this.frame)throw new p("Got frame is not equal to the frame of the shape");if(this.lock&&e.lock)return d.call(this,t,this.get(t));const n=this.get(t),i=e.updateFlags;if(i.label&&(r("label",e.label,null,h),n.label=e.label,n.attributes={},this.appendDefaultAttributes.call(n,n.label)),i.attributes){const t=n.label.attributes.map(t=>`${t.id}`);for(const r of Object.keys(e.attributes))t.includes(r)&&(n.attributes[r]=e.attributes[r])}i.group&&(r("group",e.group,"integer",null),n.group=e.group),i.lock&&(r("lock",e.lock,"boolean",null),n.lock=e.lock),i.reset();for(const t of Object.keys(n))t in this&&(this[t]=n[t]);return d.call(this,t,this.get(t))}},objectStateFactory:d}})()},function(t,e,n){function r(t,e){var n=Object.keys(t);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(t);e&&(r=r.filter((function(e){return Object.getOwnPropertyDescriptor(t,e).enumerable}))),n.push.apply(n,r)}return n}function i(t){for(var e=1;e{const e=n(26),{Task:r}=n(49),{ScriptingError:o}="./exceptions";t.exports=class{constructor(t,e,n){this.sessionType=n instanceof r?"task":"job",this.id=n.id,this.version=t,this.collection=e,this.initialObjects={},this.hash=this._getHash();const i=this.collection.export();this._resetState();for(const t of i.shapes)this.initialObjects.shapes[t.id]=t;for(const t of i.tracks)this.initialObjects.tracks[t.id]=t;for(const t of i.tags)this.initialObjects.tags[t.id]=t}_resetState(){this.initialObjects={shapes:{},tracks:{},tags:{}}}_getHash(){const t=this.collection.export();return JSON.stringify(t)}async _request(t,n){return await e.annotations.updateAnnotations(this.sessionType,this.id,t,n)}async _put(t){return await this._request(t,"put")}async _create(t){return await this._request(t,"create")}async _update(t){return await this._request(t,"update")}async _delete(t){return await this._request(t,"delete")}_split(t){const e={created:{shapes:[],tracks:[],tags:[]},updated:{shapes:[],tracks:[],tags:[]},deleted:{shapes:[],tracks:[],tags:[]}};for(const n of Object.keys(t))for(const r of t[n])if(r.id in this.initialObjects[n]){JSON.stringify(r)!==JSON.stringify(this.initialObjects[n][r.id])&&e.updated[n].push(r)}else{if(void 0!==r.id)throw new o(`Id of object is defined "${r.id}"`+"but it absents in initial state");e.created[n].push(r)}const n={shapes:t.shapes.map(t=>+t.id),tracks:t.tracks.map(t=>+t.id),tags:t.tags.map(t=>+t.id)};for(const t of Object.keys(this.initialObjects))for(const r of Object.keys(this.initialObjects[t]))if(!n[t].includes(+r)){const n=this.initialObjects[t][r];e.deleted[t].push(n)}return e}_updateCreatedObjects(t,e){const n=t.tracks.length+t.shapes.length+t.tags.length,r=e.tracks.length+e.shapes.length+e.tags.length;if(r!==n)throw new o("Number of indexes is differed by number of saved objects"+`${r} vs ${n}`);for(const n of Object.keys(e))for(let r=0;rt.clientID),shapes:t.shapes.map(t=>t.clientID),tags:t.tags.map(t=>t.clientID)};return t.tracks.concat(t.shapes).concat(t.tags).map(t=>(delete t.clientID,t)),e}async save(t){"function"!=typeof t&&(t=t=>{console.log(t)});try{const e=this.collection.export(),{flush:n}=this.collection;if(n){t("New objects are being saved..");const n=this._receiveIndexes(e),r=await this._put(i({},e,{version:this.version}));this.version=r.version,this.collection.flush=!1,t("Saved objects are being updated in the client"),this._updateCreatedObjects(r,n),t("Initial state is being updated"),this._resetState();for(const t of Object.keys(this.initialObjects))for(const e of r[t])this.initialObjects[t][e.id]=e}else{const{created:n,updated:r,deleted:o}=this._split(e);t("New objects are being saved..");const s=this._receiveIndexes(n),a=await this._create(i({},n,{version:this.version}));this.version=a.version,t("Saved objects are being updated in the client"),this._updateCreatedObjects(a,s),t("Initial state is being updated");for(const t of Object.keys(this.initialObjects))for(const e of a[t])this.initialObjects[t][e.id]=e;t("Changed objects are being saved.."),this._receiveIndexes(r);const c=await this._update(i({},r,{version:this.version}));this.version=c.version,t("Initial state is being updated");for(const t of Object.keys(this.initialObjects))for(const e of c[t])this.initialObjects[t][e.id]=e;t("Changed objects are being saved.."),this._receiveIndexes(o);const u=await this._delete(i({},o,{version:this.version}));this._version=u.version,t("Initial state is being updated");for(const t of Object.keys(this.initialObjects))for(const e of u[t])delete this.initialObjects[t][e.id]}this.hash=this._getHash(),t("Saving is done")}catch(e){throw t(`Can not save annotations: ${e.message}`),e}}hasUnsavedChanges(){return this._getHash()!==this.hash}}})()},function(t){t.exports=JSON.parse('{"name":"cvat-core.js","version":"0.1.0","description":"Part of Computer Vision Tool which presents an interface for client-side integration","main":"babel.config.js","scripts":{"build":"webpack","test":"jest --config=jest.config.js --coverage","docs":"jsdoc --readme README.md src/*.js -p -c jsdoc.config.js -d docs","coveralls":"cat ./reports/coverage/lcov.info | coveralls"},"author":"Intel","license":"MIT","devDependencies":{"@babel/cli":"^7.4.4","@babel/core":"^7.4.4","@babel/preset-env":"^7.4.4","airbnb":"0.0.2","babel-eslint":"^10.0.1","babel-loader":"^8.0.6","core-js":"^3.0.1","coveralls":"^3.0.5","eslint":"6.1.0","eslint-config-airbnb-base":"14.0.0","eslint-plugin-import":"2.18.2","eslint-plugin-no-unsafe-innerhtml":"^1.0.16","eslint-plugin-no-unsanitized":"^3.0.2","eslint-plugin-security":"^1.4.0","jest":"^24.8.0","jest-junit":"^6.4.0","jsdoc":"^3.6.2","webpack":"^4.31.0","webpack-cli":"^3.3.2"},"dependencies":{"axios":"^0.18.0","browser-or-node":"^1.2.1","error-stack-parser":"^2.0.2","form-data":"^2.5.0","jest-config":"^24.8.0","js-cookie":"^2.2.0","platform":"^1.3.5","store":"^2.0.12"}}')},function(t,e,n){n(5),n(11),n(10),n(254),(()=>{const e=n(36),r=n(26),{isBoolean:i,isInteger:o,isEnum:s,isString:a,checkFilter:c}=n(56),{TaskStatus:u,TaskMode:l}=n(29),f=n(69),{AnnotationFormat:p}=n(138),{ArgumentError:h}=n(6),{Task:d}=n(49);function b(t,e){null!==t.assignee&&([t.assignee]=e.filter(e=>e.id===t.assignee));for(const n of t.segments)for(const t of n.jobs)null!==t.assignee&&([t.assignee]=e.filter(e=>e.id===t.assignee));return null!==t.owner&&([t.owner]=e.filter(e=>e.id===t.owner)),t}t.exports=function(t){return t.plugins.list.implementation=e.list,t.plugins.register.implementation=e.register.bind(t),t.server.about.implementation=async()=>{return await r.server.about()},t.server.share.implementation=async t=>{return await r.server.share(t)},t.server.formats.implementation=async()=>{return(await r.server.formats()).map(t=>new p(t))},t.server.datasetFormats.implementation=async()=>{return await r.server.datasetFormats()},t.server.register.implementation=async(t,e,n,i,o,s)=>{await r.server.register(t,e,n,i,o,s)},t.server.login.implementation=async(t,e)=>{await r.server.login(t,e)},t.server.logout.implementation=async()=>{await r.server.logout()},t.server.authorized.implementation=async()=>{return await r.server.authorized()},t.server.request.implementation=async(t,e)=>{return await r.server.request(t,e)},t.users.get.implementation=async t=>{c(t,{self:i});let e=null;return e=(e="self"in t&&t.self?[e=await r.users.getSelf()]:await r.users.getUsers()).map(t=>new f(t))},t.jobs.get.implementation=async t=>{if(c(t,{taskID:o,jobID:o}),"taskID"in t&&"jobID"in t)throw new h('Only one of fields "taskID" and "jobID" allowed simultaneously');if(!Object.keys(t).length)throw new h("Job filter must not be empty");let e=null;if("taskID"in t)e=await r.tasks.getTasks(`id=${t.taskID}`);else{const n=await r.jobs.getJob(t.jobID);void 0!==n.task_id&&(e=await r.tasks.getTasks(`id=${n.task_id}`))}if(null!==e&&e.length){const n=(await r.users.getUsers()).map(t=>new f(t)),i=new d(b(e[0],n));return t.jobID?i.jobs.filter(e=>e.id===t.jobID):i.jobs}return[]},t.tasks.get.implementation=async t=>{if(c(t,{page:o,name:a,id:o,owner:a,assignee:a,search:a,status:s.bind(u),mode:s.bind(l)}),"search"in t&&Object.keys(t).length>1&&!("page"in t&&2===Object.keys(t).length))throw new h('Do not use the filter field "search" with others');if("id"in t&&Object.keys(t).length>1&&!("page"in t&&2===Object.keys(t).length))throw new h('Do not use the filter field "id" with others');const e=new URLSearchParams;for(const n of["name","owner","assignee","search","status","mode","id","page"])Object.prototype.hasOwnProperty.call(t,n)&&e.set(n,t[n]);const n=(await r.users.getUsers()).map(t=>new f(t)),i=await r.tasks.getTasks(e.toString()),p=i.map(t=>b(t,n)).map(t=>new d(t));return p.count=i.count,p},t}})()},function(t,e,n){"use strict";n(255);var r,i=n(12),o=n(13),s=n(139),a=n(0),c=n(104),u=n(18),l=n(64),f=n(9),p=n(256),h=n(257),d=n(67).codeAt,b=n(259),m=n(33),g=n(260),v=n(25),y=a.URL,w=g.URLSearchParams,k=g.getState,x=v.set,O=v.getterFor("URL"),j=Math.floor,S=Math.pow,_=/[A-Za-z]/,A=/[\d+\-.A-Za-z]/,T=/\d/,P=/^(0x|0X)/,E=/^[0-7]+$/,C=/^\d+$/,I=/^[\dA-Fa-f]+$/,F=/[\u0000\u0009\u000A\u000D #%/:?@[\\]]/,M=/[\u0000\u0009\u000A\u000D #/:?@[\\]]/,N=/^[\u0000-\u001F ]+|[\u0000-\u001F ]+$/g,R=/[\u0009\u000A\u000D]/g,D=function(t,e){var n,r,i;if("["==e.charAt(0)){if("]"!=e.charAt(e.length-1))return"Invalid host";if(!(n=B(e.slice(1,-1))))return"Invalid host";t.host=n}else if(V(t)){if(e=b(e),F.test(e))return"Invalid host";if(null===(n=$(e)))return"Invalid host";t.host=n}else{if(M.test(e))return"Invalid host";for(n="",r=h(e),i=0;i4)return t;for(n=[],r=0;r1&&"0"==i.charAt(0)&&(o=P.test(i)?16:8,i=i.slice(8==o?1:2)),""===i)s=0;else{if(!(10==o?C:8==o?E:I).test(i))return t;s=parseInt(i,o)}n.push(s)}for(r=0;r=S(256,5-e))return null}else if(s>255)return null;for(a=n.pop(),r=0;r6)return;for(r=0;p();){if(i=null,r>0){if(!("."==p()&&r<4))return;f++}if(!T.test(p()))return;for(;T.test(p());){if(o=parseInt(p(),10),null===i)i=o;else{if(0==i)return;i=10*i+o}if(i>255)return;f++}c[u]=256*c[u]+i,2!=++r&&4!=r||u++}if(4!=r)return;break}if(":"==p()){if(f++,!p())return}else if(p())return;c[u++]=e}else{if(null!==l)return;f++,l=++u}}if(null!==l)for(s=u-l,u=7;0!=u&&s>0;)a=c[u],c[u--]=c[l+s-1],c[l+--s]=a;else if(8!=u)return;return c},U=function(t){var e,n,r,i;if("number"==typeof t){for(e=[],n=0;n<4;n++)e.unshift(t%256),t=j(t/256);return e.join(".")}if("object"==typeof t){for(e="",r=function(t){for(var e=null,n=1,r=null,i=0,o=0;o<8;o++)0!==t[o]?(i>n&&(e=r,n=i),r=null,i=0):(null===r&&(r=o),++i);return i>n&&(e=r,n=i),e}(t),n=0;n<8;n++)i&&0===t[n]||(i&&(i=!1),r===n?(e+=n?":":"::",i=!0):(e+=t[n].toString(16),n<7&&(e+=":")));return"["+e+"]"}return t},L={},z=p({},L,{" ":1,'"':1,"<":1,">":1,"`":1}),q=p({},z,{"#":1,"?":1,"{":1,"}":1}),W=p({},q,{"/":1,":":1,";":1,"=":1,"@":1,"[":1,"\\":1,"]":1,"^":1,"|":1}),G=function(t,e){var n=d(t,0);return n>32&&n<127&&!f(e,t)?t:encodeURIComponent(t)},J={ftp:21,file:null,http:80,https:443,ws:80,wss:443},V=function(t){return f(J,t.scheme)},H=function(t){return""!=t.username||""!=t.password},X=function(t){return!t.host||t.cannotBeABaseURL||"file"==t.scheme},K=function(t,e){var n;return 2==t.length&&_.test(t.charAt(0))&&(":"==(n=t.charAt(1))||!e&&"|"==n)},Z=function(t){var e;return t.length>1&&K(t.slice(0,2))&&(2==t.length||"/"===(e=t.charAt(2))||"\\"===e||"?"===e||"#"===e)},Y=function(t){var e=t.path,n=e.length;!n||"file"==t.scheme&&1==n&&K(e[0],!0)||e.pop()},Q=function(t){return"."===t||"%2e"===t.toLowerCase()},tt={},et={},nt={},rt={},it={},ot={},st={},at={},ct={},ut={},lt={},ft={},pt={},ht={},dt={},bt={},mt={},gt={},vt={},yt={},wt={},kt=function(t,e,n,i){var o,s,a,c,u,l=n||tt,p=0,d="",b=!1,m=!1,g=!1;for(n||(t.scheme="",t.username="",t.password="",t.host=null,t.port=null,t.path=[],t.query=null,t.fragment=null,t.cannotBeABaseURL=!1,e=e.replace(N,"")),e=e.replace(R,""),o=h(e);p<=o.length;){switch(s=o[p],l){case tt:if(!s||!_.test(s)){if(n)return"Invalid scheme";l=nt;continue}d+=s.toLowerCase(),l=et;break;case et:if(s&&(A.test(s)||"+"==s||"-"==s||"."==s))d+=s.toLowerCase();else{if(":"!=s){if(n)return"Invalid scheme";d="",l=nt,p=0;continue}if(n&&(V(t)!=f(J,d)||"file"==d&&(H(t)||null!==t.port)||"file"==t.scheme&&!t.host))return;if(t.scheme=d,n)return void(V(t)&&J[t.scheme]==t.port&&(t.port=null));d="","file"==t.scheme?l=ht:V(t)&&i&&i.scheme==t.scheme?l=rt:V(t)?l=at:"/"==o[p+1]?(l=it,p++):(t.cannotBeABaseURL=!0,t.path.push(""),l=vt)}break;case nt:if(!i||i.cannotBeABaseURL&&"#"!=s)return"Invalid scheme";if(i.cannotBeABaseURL&&"#"==s){t.scheme=i.scheme,t.path=i.path.slice(),t.query=i.query,t.fragment="",t.cannotBeABaseURL=!0,l=wt;break}l="file"==i.scheme?ht:ot;continue;case rt:if("/"!=s||"/"!=o[p+1]){l=ot;continue}l=ct,p++;break;case it:if("/"==s){l=ut;break}l=gt;continue;case ot:if(t.scheme=i.scheme,s==r)t.username=i.username,t.password=i.password,t.host=i.host,t.port=i.port,t.path=i.path.slice(),t.query=i.query;else if("/"==s||"\\"==s&&V(t))l=st;else if("?"==s)t.username=i.username,t.password=i.password,t.host=i.host,t.port=i.port,t.path=i.path.slice(),t.query="",l=yt;else{if("#"!=s){t.username=i.username,t.password=i.password,t.host=i.host,t.port=i.port,t.path=i.path.slice(),t.path.pop(),l=gt;continue}t.username=i.username,t.password=i.password,t.host=i.host,t.port=i.port,t.path=i.path.slice(),t.query=i.query,t.fragment="",l=wt}break;case st:if(!V(t)||"/"!=s&&"\\"!=s){if("/"!=s){t.username=i.username,t.password=i.password,t.host=i.host,t.port=i.port,l=gt;continue}l=ut}else l=ct;break;case at:if(l=ct,"/"!=s||"/"!=d.charAt(p+1))continue;p++;break;case ct:if("/"!=s&&"\\"!=s){l=ut;continue}break;case ut:if("@"==s){b&&(d="%40"+d),b=!0,a=h(d);for(var v=0;v65535)return"Invalid port";t.port=V(t)&&k===J[t.scheme]?null:k,d=""}if(n)return;l=mt;continue}return"Invalid port"}d+=s;break;case ht:if(t.scheme="file","/"==s||"\\"==s)l=dt;else{if(!i||"file"!=i.scheme){l=gt;continue}if(s==r)t.host=i.host,t.path=i.path.slice(),t.query=i.query;else if("?"==s)t.host=i.host,t.path=i.path.slice(),t.query="",l=yt;else{if("#"!=s){Z(o.slice(p).join(""))||(t.host=i.host,t.path=i.path.slice(),Y(t)),l=gt;continue}t.host=i.host,t.path=i.path.slice(),t.query=i.query,t.fragment="",l=wt}}break;case dt:if("/"==s||"\\"==s){l=bt;break}i&&"file"==i.scheme&&!Z(o.slice(p).join(""))&&(K(i.path[0],!0)?t.path.push(i.path[0]):t.host=i.host),l=gt;continue;case bt:if(s==r||"/"==s||"\\"==s||"?"==s||"#"==s){if(!n&&K(d))l=gt;else if(""==d){if(t.host="",n)return;l=mt}else{if(c=D(t,d))return c;if("localhost"==t.host&&(t.host=""),n)return;d="",l=mt}continue}d+=s;break;case mt:if(V(t)){if(l=gt,"/"!=s&&"\\"!=s)continue}else if(n||"?"!=s)if(n||"#"!=s){if(s!=r&&(l=gt,"/"!=s))continue}else t.fragment="",l=wt;else t.query="",l=yt;break;case gt:if(s==r||"/"==s||"\\"==s&&V(t)||!n&&("?"==s||"#"==s)){if(".."===(u=(u=d).toLowerCase())||"%2e."===u||".%2e"===u||"%2e%2e"===u?(Y(t),"/"==s||"\\"==s&&V(t)||t.path.push("")):Q(d)?"/"==s||"\\"==s&&V(t)||t.path.push(""):("file"==t.scheme&&!t.path.length&&K(d)&&(t.host&&(t.host=""),d=d.charAt(0)+":"),t.path.push(d)),d="","file"==t.scheme&&(s==r||"?"==s||"#"==s))for(;t.path.length>1&&""===t.path[0];)t.path.shift();"?"==s?(t.query="",l=yt):"#"==s&&(t.fragment="",l=wt)}else d+=G(s,q);break;case vt:"?"==s?(t.query="",l=yt):"#"==s?(t.fragment="",l=wt):s!=r&&(t.path[0]+=G(s,L));break;case yt:n||"#"!=s?s!=r&&("'"==s&&V(t)?t.query+="%27":t.query+="#"==s?"%23":G(s,L)):(t.fragment="",l=wt);break;case wt:s!=r&&(t.fragment+=G(s,z))}p++}},xt=function(t){var e,n,r=l(this,xt,"URL"),i=arguments.length>1?arguments[1]:void 0,s=String(t),a=x(r,{type:"URL"});if(void 0!==i)if(i instanceof xt)e=O(i);else if(n=kt(e={},String(i)))throw TypeError(n);if(n=kt(a,s,null,e))throw TypeError(n);var c=a.searchParams=new w,u=k(c);u.updateSearchParams(a.query),u.updateURL=function(){a.query=String(c)||null},o||(r.href=jt.call(r),r.origin=St.call(r),r.protocol=_t.call(r),r.username=At.call(r),r.password=Tt.call(r),r.host=Pt.call(r),r.hostname=Et.call(r),r.port=Ct.call(r),r.pathname=It.call(r),r.search=Ft.call(r),r.searchParams=Mt.call(r),r.hash=Nt.call(r))},Ot=xt.prototype,jt=function(){var t=O(this),e=t.scheme,n=t.username,r=t.password,i=t.host,o=t.port,s=t.path,a=t.query,c=t.fragment,u=e+":";return null!==i?(u+="//",H(t)&&(u+=n+(r?":"+r:"")+"@"),u+=U(i),null!==o&&(u+=":"+o)):"file"==e&&(u+="//"),u+=t.cannotBeABaseURL?s[0]:s.length?"/"+s.join("/"):"",null!==a&&(u+="?"+a),null!==c&&(u+="#"+c),u},St=function(){var t=O(this),e=t.scheme,n=t.port;if("blob"==e)try{return new URL(e.path[0]).origin}catch(t){return"null"}return"file"!=e&&V(t)?e+"://"+U(t.host)+(null!==n?":"+n:""):"null"},_t=function(){return O(this).scheme+":"},At=function(){return O(this).username},Tt=function(){return O(this).password},Pt=function(){var t=O(this),e=t.host,n=t.port;return null===e?"":null===n?U(e):U(e)+":"+n},Et=function(){var t=O(this).host;return null===t?"":U(t)},Ct=function(){var t=O(this).port;return null===t?"":String(t)},It=function(){var t=O(this),e=t.path;return t.cannotBeABaseURL?e[0]:e.length?"/"+e.join("/"):""},Ft=function(){var t=O(this).query;return t?"?"+t:""},Mt=function(){return O(this).searchParams},Nt=function(){var t=O(this).fragment;return t?"#"+t:""},Rt=function(t,e){return{get:t,set:e,configurable:!0,enumerable:!0}};if(o&&c(Ot,{href:Rt(jt,(function(t){var e=O(this),n=String(t),r=kt(e,n);if(r)throw TypeError(r);k(e.searchParams).updateSearchParams(e.query)})),origin:Rt(St),protocol:Rt(_t,(function(t){var e=O(this);kt(e,String(t)+":",tt)})),username:Rt(At,(function(t){var e=O(this),n=h(String(t));if(!X(e)){e.username="";for(var r=0;r=n.length?{value:void 0,done:!0}:(t=r(n,i),e.index+=t.length,{value:t,done:!1})}))},function(t,e,n){"use strict";var r=n(13),i=n(3),o=n(105),s=n(92),a=n(84),c=n(37),u=n(85),l=Object.assign;t.exports=!l||i((function(){var t={},e={},n=Symbol();return t[n]=7,"abcdefghijklmnopqrst".split("").forEach((function(t){e[t]=t})),7!=l({},t)[n]||"abcdefghijklmnopqrst"!=o(l({},e)).join("")}))?function(t,e){for(var n=c(t),i=arguments.length,l=1,f=s.f,p=a.f;i>l;)for(var h,d=u(arguments[l++]),b=f?o(d).concat(f(d)):o(d),m=b.length,g=0;m>g;)h=b[g++],r&&!p.call(d,h)||(n[h]=d[h]);return n}:l},function(t,e,n){"use strict";var r=n(47),i=n(37),o=n(97),s=n(96),a=n(45),c=n(258),u=n(48);t.exports=function(t){var e,n,l,f,p,h=i(t),d="function"==typeof this?this:Array,b=arguments.length,m=b>1?arguments[1]:void 0,g=void 0!==m,v=0,y=u(h);if(g&&(m=r(m,b>2?arguments[2]:void 0,2)),null==y||d==Array&&s(y))for(n=new d(e=a(h.length));e>v;v++)c(n,v,g?m(h[v],v):h[v]);else for(p=(f=y.call(h)).next,n=new d;!(l=p.call(f)).done;v++)c(n,v,g?o(f,m,[l.value,v],!0):l.value);return n.length=v,n}},function(t,e,n){"use strict";var r=n(58),i=n(21),o=n(42);t.exports=function(t,e,n){var s=r(e);s in t?i.f(t,s,o(0,n)):t[s]=n}},function(t,e,n){"use strict";var r=/[^\0-\u007E]/,i=/[.\u3002\uFF0E\uFF61]/g,o="Overflow: input needs wider integers to process",s=Math.floor,a=String.fromCharCode,c=function(t){return t+22+75*(t<26)},u=function(t,e,n){var r=0;for(t=n?s(t/700):t>>1,t+=s(t/e);t>455;r+=36)t=s(t/35);return s(r+36*t/(t+38))},l=function(t){var e,n,r=[],i=(t=function(t){for(var e=[],n=0,r=t.length;n=55296&&i<=56319&&n=l&&ns((2147483647-f)/m))throw RangeError(o);for(f+=(b-l)*m,l=b,e=0;e2147483647)throw RangeError(o);if(n==l){for(var g=f,v=36;;v+=36){var y=v<=p?1:v>=p+26?26:v-p;if(g0?arguments[0]:void 0,p=this,g=[];if(v(p,{type:"URLSearchParams",entries:g,updateURL:function(){},updateSearchParams:C}),void 0!==u)if(d(u))if("function"==typeof(t=m(u)))for(n=(e=t.call(u)).next;!(r=n.call(e)).done;){if((s=(o=(i=b(h(r.value))).next).call(i)).done||(a=o.call(i)).done||!o.call(i).done)throw TypeError("Expected sequence with length 2");g.push({key:s.value+"",value:a.value+""})}else for(c in u)f(u,c)&&g.push({key:c,value:u[c]+""});else E(g,"string"==typeof u?"?"===u.charAt(0)?u.slice(1):u:u+"")},N=M.prototype;s(N,{append:function(t,e){I(arguments.length,2);var n=y(this);n.entries.push({key:t+"",value:e+""}),n.updateURL()},delete:function(t){I(arguments.length,1);for(var e=y(this),n=e.entries,r=t+"",i=0;it.key){i.splice(e,0,t);break}e===n&&i.push(t)}r.updateURL()},forEach:function(t){for(var e,n=y(this).entries,r=p(t,arguments.length>1?arguments[1]:void 0,3),i=0;i this._loaded); + this._size = size; + this._buffer = {}; + this._requestedChunks = {}; + this._frameProvider = frameProvider; + this._chunkSize = chunkSize; + this._frameProvider.subscribe(this); + this._loaded = null; + this._stopFrame = stopFrame; + } + + getFreeBufferSize () { + let requestedFrameCount = 0; + for (let chunk_idx in this._requestedChunks){ + if(this._requestedChunks.hasOwnProperty(chunk_idx)){ + requestedFrameCount += this._requestedChunks[chunk_idx].requestedFrames.size; + } + } + return this._size - Object.keys(this._buffer).length -requestedFrameCount; + } + + async onFrameLoad(last) { // callback for FrameProvider instance + const chunk_idx = Math.floor(last / this._chunkSize); + if (chunk_idx in this._requestedChunks && this._requestedChunks[chunk_idx].requestedFrames.has(last)) { + this._requestedChunks[chunk_idx].buffer[last] = await this._frameProvider.require(last); + this._requestedChunks[chunk_idx].requestedFrames.delete(last); + + if (this._requestedChunks[chunk_idx].requestedFrames.size === 0) { + if (this._requestedChunks[chunk_idx].resolve) { + const bufferedframes = Object.keys(this._requestedChunks[chunk_idx].buffer).map(f => +f); + this._requestedChunks[chunk_idx].resolve(new Set(bufferedframes)); + } + } + } else { + this._loaded = last; + this.notify(); + } + } + + requestOneChunkFrames(chunk_idx) { + return new Promise ( (resolve, reject) => { + this._requestedChunks[chunk_idx] = {...this._requestedChunks[chunk_idx], resolve, reject}; + for (const frame of this._requestedChunks[chunk_idx].requestedFrames.entries()) { + const requestedFrame = frame[1]; + this._frameProvider.require(requestedFrame).then(frameData => { + if (!this._requestedChunks[chunk_idx].requestedFrames.has(requestedFrame)) { + reject(); + // this._requestedFrames.clear(); + // this._buffer = {}; + } + + if (frameData !== null) { + this._requestedChunks[chunk_idx].requestedFrames.delete(requestedFrame); + this._requestedChunks[chunk_idx].buffer[requestedFrame] = frameData; + if (this._requestedChunks[chunk_idx].requestedFrames.size === 0) { + const bufferedframes = Object.keys(this._requestedChunks[chunk_idx].buffer).map(f => +f); + this._requestedChunks[chunk_idx].resolve(new Set(bufferedframes)); + } + } + }).catch( error => { + console.log('TODO: handle excepton correctly ' + error); + }); + } + }); + } + + fillBuffer(startFrame, frameStep) { + const freeSize = this.getFreeBufferSize(); + const stopFrame = Math.min(startFrame + frameStep * freeSize, this._stopFrame); + + for (let i = startFrame; i < stopFrame; i += frameStep) { + const chunk_idx = Math.floor(i / this._chunkSize); + if (!(chunk_idx in this._requestedChunks)) { + this._requestedChunks[chunk_idx] = { + requestedFrames: new Set(), + resolve: null, + reject: null, + buffer: {}, + }; + } + this._requestedChunks[chunk_idx].requestedFrames.add(i); + } + + let bufferedFrames = new Set(); + + return new Promise( async (resolve, reject) => { + for (let chunk_idx in this._requestedChunks){ + if(this._requestedChunks.hasOwnProperty(chunk_idx)) { + try { + const chunkFrames = await this.requestOneChunkFrames(chunk_idx); + bufferedFrames = new Set([...bufferedFrames, ...chunkFrames]); + this._buffer = {...this._buffer, ...this._requestedChunks[chunk_idx].buffer}; + delete this._requestedChunks[chunk_idx]; + if (Object.keys(this._requestedChunks).length === 0){ + resolve(bufferedFrames); + } + + } catch (error) { + // need to cleanup + reject(); + } + } + } + }); + } + + require(frameNumber) { + if (frameNumber in this._buffer) { + const frame = this._buffer[frameNumber]; + delete this._buffer[frameNumber]; + return frame; + } + return this._frameProvider.require(frameNumber); + } + + clear() { + this._requestedChunks = {}; + this._buffer = {}; + } +} const MAX_PLAYER_SCALE = 10; const MIN_PLAYER_SCALE = 0.1; @@ -116,10 +238,15 @@ class PlayerModel extends Listener { this._playing = false; this._playInterval = null; this._pauseFlag = null; + this._chunkSize = window.cvat.job.chunk_size; this._frameProvider = new FrameProviderWrapper(this._frame.stop); + this._bufferSize = 36; + this._frameBuffer = new FrameBuffer(this._bufferSize, this._frameProvider, this._chunkSize, this._frame.stop); this._continueAfterLoad = false; - this._continueTimeout = null; + // this._continueTimeout = null; this._image = null; + this._activeBufrequest = false; + this._bufferedFrames = new Set(); this._geometry = { scale: 1, @@ -137,7 +264,7 @@ class PlayerModel extends Listener { window.cvat.translate.playerOffset = this._geometry.frameOffset; window.cvat.player.rotation = this._geometry.rotation; - this._frameProvider.subscribe(this); + this._frameBuffer.subscribe(this); } get frames() { @@ -205,25 +332,25 @@ class PlayerModel extends Listener { return this._frame.previous === this._frame.current; } - async onFrameLoad(last) { // callback for FrameProvider instance + async onBufferLoad(last) { // callback for FrameProvider instance if (last === this._frame.current) { - if (this._continueTimeout) { - clearTimeout(this._continueTimeout); - this._continueTimeout = null; - } + // if (this._continueTimeout) { + // clearTimeout(this._continueTimeout); + // this._continueTimeout = null; + // } // If need continue playing after load, set timeout for additional frame download if (this._continueAfterLoad) { - this._continueTimeout = setTimeout(async () => { + // this._continueTimeout = setTimeout(async () => { // If you still need to play, start it - this._continueTimeout = null; + // this._continueTimeout = null; if (this._continueAfterLoad) { this._continueAfterLoad = false; this.play(); } else { // Else update the frame await this.shift(0); } - }, 5000); + // }, 5000); } else { // Just update frame if no need to play await this.shift(0); } @@ -231,10 +358,14 @@ class PlayerModel extends Listener { } play() { + const skip = Math.max(Math.floor(this._settings.fps / 25), 1); this._pauseFlag = false; this._playing = true; const timeout = 1000 / this._settings.fps; this._frame.requested.clear(); + // this._frameBuffer.clear(); + this._bufferedFrames.clear(); + const playFunc = async () => { if (this._pauseFlag) { // pause method without notify (for frame downloading) if (this._playInterval) { @@ -243,24 +374,71 @@ class PlayerModel extends Listener { } return; } - const skip = Math.max(Math.floor(this._settings.fps / 25), 1); + const requestedFrame = this._frame.current + skip; - if (requestedFrame % this._frame.chunkSize === 0 && this._frame.requested.size) { - if (this._playInterval) { - clearInterval(this._playInterval); - this._playInterval = null; - return; - } + // if (requestedFrame % this._frame.chunkSize === 0 && this._frame.requested.size) { + // if (this._playInterval) { + // clearInterval(this._playInterval); + // this._playInterval = null; + // return; + // } + // } + + if (this._bufferedFrames.size < this._bufferSize / 2) { + const startFrame = this._bufferedFrames.size ? Math.max(...this._bufferedFrames) : requestedFrame; + fillBufferRequest(startFrame); + } + + if (!this._bufferedFrames.size) { + setTimeout(checkFunction, 50); + return; } + const res = await this.shift(skip); + this._bufferedFrames.delete(requestedFrame); if (!res) { this.pause(); // if not changed, pause } else if (this._frame.requested.size === 0 && !this._playInterval) { this._playInterval = setInterval(playFunc, timeout); } + }; + + const fillBufferRequest = (startFrame) => { + if (this._activeBufrequest) { + return; + } + this._activeBufrequest = true; + this._frameBuffer.fillBuffer(startFrame, skip).then((bufferedFrames) => { + // console.log(`Buffer is ready`); + this._bufferedFrames = new Set([...this._bufferedFrames, ...bufferedFrames]); + if ((!this._pauseFlag || this._continueAfterLoad) && !this._playInterval) { + this._continueAfterLoad = false; + this._pauseFlag = false; + this._playInterval = setInterval(playFunc, timeout); + } + }).catch(error => { + throw error; + }).finally(() => { + this._activeBufrequest = false; + }); }; - this._playInterval = setInterval(playFunc, timeout); + + // fillBufferRequest(); + + const checkFunction = () => { + if (this._activeBufrequest && !this._bufferedFrames.size) { + // console.log(`Wait buffering of frames`); + this._image = null; + this._continueAfterLoad = this.playing; + this._pauseFlag = true; + this.notify(); + } + }; + + // setTimeout(checkFunction, 300); + + setTimeout(playFunc, timeout); } pause() { @@ -294,7 +472,7 @@ class PlayerModel extends Listener { return false; } try { - const frame = await this._frameProvider.require(requestedFrame); + const frame = await this._frameBuffer.require(requestedFrame); if (!this._frame.requested.has(requestedFrame)) { return false; } @@ -335,6 +513,8 @@ class PlayerModel extends Listener { } catch (error) { if (typeof (error) === 'number') { this._frame.requested.delete(error); + } else { + throw error; } } } @@ -735,6 +915,7 @@ class PlayerView { this._counterClockwiseRotationButtonUI = $('#counterClockwiseRotation'); this._rotationWrapperUI = $('#rotationWrapper'); this._rotatateAllImagesUI = $('#rotateAllImages'); + this._updateCall = performance.now(); this._latestDrawnImage = null; this._clockwiseRotationButtonUI.on('click', () => { @@ -924,6 +1105,9 @@ class PlayerView { } onPlayerUpdate(model) { + const t1 = performance.now(); + console.log(`update call diff ${t1 - this._updateCall}`); + this._updateCall = t1; const { image } = model; const { frames } = model; const { geometry } = model; From a1da83d8353c6eadfa77d6a534a7732f04c47490 Mon Sep 17 00:00:00 2001 From: Andrey Zhavoronkov Date: Sat, 21 Dec 2019 12:31:00 +0300 Subject: [PATCH 096/188] wip --- cvat-core/src/frames.js | 49 +++++++++---------- .../engine/static/engine/js/cvat-core.min.js | 2 +- cvat/apps/engine/static/engine/js/player.js | 28 +++++------ 3 files changed, 38 insertions(+), 41 deletions(-) diff --git a/cvat-core/src/frames.js b/cvat-core/src/frames.js index c728126d6812..9fb15adae8a2 100644 --- a/cvat-core/src/frames.js +++ b/cvat-core/src/frames.js @@ -91,11 +91,10 @@ const onDecodeAll = (frameNumber) => { if (frameDataCache[this.tid].activeChunkRequest && chunkNumber === frameDataCache[this.tid].activeChunkRequest.chunkNumber) { const callbackArray = frameDataCache[this.tid].activeChunkRequest.callbacks; - if (callbackArray.length) { - const lastRequest = callbackArray.pop(); - frameDataCache[this.tid].activeChunkRequest = undefined; - lastRequest.resolve(provider.frame(frameNumber)); + for (const callback of callbackArray) { + callback.resolve(provider.frame(frameNumber)); } + frameDataCache[this.tid].activeChunkRequest = undefined; } }; @@ -211,28 +210,28 @@ provider.requestDecodeBlock(null, start, stop, onDecodeAll, rejectRequestAll); } } else { - if (this.number % chunkSize > 1 && !provider.isNextChunkExists(this.number) && decodedBlocksCacheSize > 1) { - const nextChunkNumber = chunkNumber + 1; - const nextStart = Math.max(this.startFrame, nextChunkNumber * chunkSize); - const nextStop = Math.min(this.stopFrame, (nextChunkNumber + 1) * chunkSize - 1); + // if (this.number % chunkSize > 1 && !provider.isNextChunkExists(this.number) && decodedBlocksCacheSize > 1) { + // const nextChunkNumber = chunkNumber + 1; + // const nextStart = Math.max(this.startFrame, nextChunkNumber * chunkSize); + // const nextStop = Math.min(this.stopFrame, (nextChunkNumber + 1) * chunkSize - 1); - if (nextStart < this.stopFrame) { - provider.setReadyToLoading(nextChunkNumber); - if (!provider.is_chunk_cached(nextStart, nextStop)){ - serverProxy.frames.getData(this.tid, nextChunkNumber).then(nextChunk =>{ - provider.requestDecodeBlock(nextChunk, nextStart, nextStop, undefined, undefined); - }).catch(exception => { - if (exception instanceof Exception) { - reject(exception); - } else { - reject(new Exception(exception.message)); - } - }); - } else { - provider.requestDecodeBlock(null, nextStart, nextStop, undefined, undefined); - } - } - } + // if (nextStart < this.stopFrame) { + // provider.setReadyToLoading(nextChunkNumber); + // if (!provider.is_chunk_cached(nextStart, nextStop)){ + // serverProxy.frames.getData(this.tid, nextChunkNumber).then(nextChunk =>{ + // provider.requestDecodeBlock(nextChunk, nextStart, nextStop, undefined, undefined); + // }).catch(exception => { + // if (exception instanceof Exception) { + // reject(exception); + // } else { + // reject(new Exception(exception.message)); + // } + // }); + // } else { + // provider.requestDecodeBlock(null, nextStart, nextStop, undefined, undefined); + // } + // } + // } resolve(frame); } } catch (exception) { diff --git a/cvat/apps/engine/static/engine/js/cvat-core.min.js b/cvat/apps/engine/static/engine/js/cvat-core.min.js index 08a321d06cdd..62ace20105ac 100644 --- a/cvat/apps/engine/static/engine/js/cvat-core.min.js +++ b/cvat/apps/engine/static/engine/js/cvat-core.min.js @@ -11,5 +11,5 @@ window.cvat=function(t){var e={};function n(r){if(e[r])return e[r].exports;var i * @author Feross Aboukhadijeh * @license MIT */ -t.exports=function(t){return null!=t&&null!=t.constructor&&"function"==typeof t.constructor.isBuffer&&t.constructor.isBuffer(t)}},function(t,e,n){"use strict";var r=n(68),i=n(7),o=n(193),s=n(194);function a(t){this.defaults=t,this.interceptors={request:new o,response:new o}}a.prototype.request=function(t){"string"==typeof t&&(t=i.merge({url:arguments[0]},arguments[1])),(t=i.merge(r,{method:"get"},this.defaults,t)).method=t.method.toLowerCase();var e=[s,void 0],n=Promise.resolve(t);for(this.interceptors.request.forEach((function(t){e.unshift(t.fulfilled,t.rejected)})),this.interceptors.response.forEach((function(t){e.push(t.fulfilled,t.rejected)}));e.length;)n=n.then(e.shift(),e.shift());return n},i.forEach(["delete","get","head","options"],(function(t){a.prototype[t]=function(e,n){return this.request(i.merge(n||{},{method:t,url:e}))}})),i.forEach(["post","put","patch"],(function(t){a.prototype[t]=function(e,n,r){return this.request(i.merge(r||{},{method:t,url:e,data:n}))}})),t.exports=a},function(t,e,n){"use strict";var r=n(7);t.exports=function(t,e){r.forEach(t,(function(n,r){r!==e&&r.toUpperCase()===e.toUpperCase()&&(t[e]=n,delete t[r])}))}},function(t,e,n){"use strict";var r=n(114);t.exports=function(t,e,n){var i=n.config.validateStatus;n.status&&i&&!i(n.status)?e(r("Request failed with status code "+n.status,n.config,null,n.request,n)):t(n)}},function(t,e,n){"use strict";t.exports=function(t,e,n,r,i){return t.config=e,n&&(t.code=n),t.request=r,t.response=i,t}},function(t,e,n){"use strict";var r=n(7);function i(t){return encodeURIComponent(t).replace(/%40/gi,"@").replace(/%3A/gi,":").replace(/%24/g,"$").replace(/%2C/gi,",").replace(/%20/g,"+").replace(/%5B/gi,"[").replace(/%5D/gi,"]")}t.exports=function(t,e,n){if(!e)return t;var o;if(n)o=n(e);else if(r.isURLSearchParams(e))o=e.toString();else{var s=[];r.forEach(e,(function(t,e){null!=t&&(r.isArray(t)?e+="[]":t=[t],r.forEach(t,(function(t){r.isDate(t)?t=t.toISOString():r.isObject(t)&&(t=JSON.stringify(t)),s.push(i(e)+"="+i(t))})))})),o=s.join("&")}return o&&(t+=(-1===t.indexOf("?")?"?":"&")+o),t}},function(t,e,n){"use strict";var r=n(7),i=["age","authorization","content-length","content-type","etag","expires","from","host","if-modified-since","if-unmodified-since","last-modified","location","max-forwards","proxy-authorization","referer","retry-after","user-agent"];t.exports=function(t){var e,n,o,s={};return t?(r.forEach(t.split("\n"),(function(t){if(o=t.indexOf(":"),e=r.trim(t.substr(0,o)).toLowerCase(),n=r.trim(t.substr(o+1)),e){if(s[e]&&i.indexOf(e)>=0)return;s[e]="set-cookie"===e?(s[e]?s[e]:[]).concat([n]):s[e]?s[e]+", "+n:n}})),s):s}},function(t,e,n){"use strict";var r=n(7);t.exports=r.isStandardBrowserEnv()?function(){var t,e=/(msie|trident)/i.test(navigator.userAgent),n=document.createElement("a");function i(t){var r=t;return e&&(n.setAttribute("href",r),r=n.href),n.setAttribute("href",r),{href:n.href,protocol:n.protocol?n.protocol.replace(/:$/,""):"",host:n.host,search:n.search?n.search.replace(/^\?/,""):"",hash:n.hash?n.hash.replace(/^#/,""):"",hostname:n.hostname,port:n.port,pathname:"/"===n.pathname.charAt(0)?n.pathname:"/"+n.pathname}}return t=i(window.location.href),function(e){var n=r.isString(e)?i(e):e;return n.protocol===t.protocol&&n.host===t.host}}():function(){return!0}},function(t,e,n){"use strict";var r=n(7);t.exports=r.isStandardBrowserEnv()?{write:function(t,e,n,i,o,s){var a=[];a.push(t+"="+encodeURIComponent(e)),r.isNumber(n)&&a.push("expires="+new Date(n).toGMTString()),r.isString(i)&&a.push("path="+i),r.isString(o)&&a.push("domain="+o),!0===s&&a.push("secure"),document.cookie=a.join("; ")},read:function(t){var e=document.cookie.match(new RegExp("(^|;\\s*)("+t+")=([^;]*)"));return e?decodeURIComponent(e[3]):null},remove:function(t){this.write(t,"",Date.now()-864e5)}}:{write:function(){},read:function(){return null},remove:function(){}}},function(t,e,n){"use strict";var r=n(7);function i(){this.handlers=[]}i.prototype.use=function(t,e){return this.handlers.push({fulfilled:t,rejected:e}),this.handlers.length-1},i.prototype.eject=function(t){this.handlers[t]&&(this.handlers[t]=null)},i.prototype.forEach=function(t){r.forEach(this.handlers,(function(e){null!==e&&t(e)}))},t.exports=i},function(t,e,n){"use strict";var r=n(7),i=n(195),o=n(115),s=n(68),a=n(196),c=n(197);function u(t){t.cancelToken&&t.cancelToken.throwIfRequested()}t.exports=function(t){return u(t),t.baseURL&&!a(t.url)&&(t.url=c(t.baseURL,t.url)),t.headers=t.headers||{},t.data=i(t.data,t.headers,t.transformRequest),t.headers=r.merge(t.headers.common||{},t.headers[t.method]||{},t.headers||{}),r.forEach(["delete","get","head","post","put","patch","common"],(function(e){delete t.headers[e]})),(t.adapter||s.adapter)(t).then((function(e){return u(t),e.data=i(e.data,e.headers,t.transformResponse),e}),(function(e){return o(e)||(u(t),e&&e.response&&(e.response.data=i(e.response.data,e.response.headers,t.transformResponse))),Promise.reject(e)}))}},function(t,e,n){"use strict";var r=n(7);t.exports=function(t,e,n){return r.forEach(n,(function(n){t=n(t,e)})),t}},function(t,e,n){"use strict";t.exports=function(t){return/^([a-z][a-z\d\+\-\.]*:)?\/\//i.test(t)}},function(t,e,n){"use strict";t.exports=function(t,e){return e?t.replace(/\/+$/,"")+"/"+e.replace(/^\/+/,""):t}},function(t,e,n){"use strict";var r=n(116);function i(t){if("function"!=typeof t)throw new TypeError("executor must be a function.");var e;this.promise=new Promise((function(t){e=t}));var n=this;t((function(t){n.reason||(n.reason=new r(t),e(n.reason))}))}i.prototype.throwIfRequested=function(){if(this.reason)throw this.reason},i.source=function(){var t;return{token:new i((function(e){t=e})),cancel:t}},t.exports=i},function(t,e,n){"use strict";t.exports=function(t){return function(e){return t.apply(null,e)}}},function(t,e,n){"use strict";var r=n(12),i=n(201).trim;r({target:"String",proto:!0,forced:n(202)("trim")},{trim:function(){return i(this)}})},function(t,e,n){var r=n(31),i="["+n(118)+"]",o=RegExp("^"+i+i+"*"),s=RegExp(i+i+"*$"),a=function(t){return function(e){var n=String(r(e));return 1&t&&(n=n.replace(o,"")),2&t&&(n=n.replace(s,"")),n}};t.exports={start:a(1),end:a(2),trim:a(3)}},function(t,e,n){var r=n(3),i=n(118);t.exports=function(t){return r((function(){return!!i[t]()||"​…᠎"!="​…᠎"[t]()||i[t].name!==t}))}},function(t,e,n){(function(e){n(5),n(11),n(204),n(10),(()=>{const r=n(205),i=n(36),o=n(26),{isBrowser:s,isNode:a}=n(246),{Exception:c,ArgumentError:u}=n(6),l={};class f{constructor(t,e,n,r,i,o){Object.defineProperties(this,Object.freeze({width:{value:t,writable:!1},height:{value:e,writable:!1},tid:{value:n,writable:!1},number:{value:r,writable:!1},startFrame:{value:i,writable:!1},stopFrame:{value:o,writable:!1}}))}async data(t=(()=>{})){return await i.apiWrapper.call(this,f.prototype.data,t)}}f.prototype.data.implementation=async function(t){return new Promise(async(e,n)=>{const r=t=>{if(l[this.tid].activeChunkRequest&&b===l[this.tid].activeChunkRequest.chunkNumber){const e=l[this.tid].activeChunkRequest.callbacks;if(e.length){const n=e.pop();l[this.tid].activeChunkRequest=void 0,n.resolve(f.frame(t))}}},i=()=>{if(l[this.tid].activeChunkRequest&&b===l[this.tid].activeChunkRequest.chunkNumber){for(const t of l[this.tid].activeChunkRequest.callbacks)t.reject(t.frameNumber);l[this.tid].activeChunkRequest=void 0}},u=()=>{const t=l[this.tid].activeChunkRequest;t.request=o.frames.getData(this.tid,t.chunkNumber).then(t=>{l[this.tid].activeChunkRequest.completed=!0,f.requestDecodeBlock(t,l[this.tid].activeChunkRequest.start,l[this.tid].activeChunkRequest.stop,l[this.tid].activeChunkRequest.onDecodeAll,l[this.tid].activeChunkRequest.rejectRequestAll)}).catch(t=>{n(t instanceof c?t:new c(t.message))}).finally(()=>{if(l[this.tid].nextChunkRequest){if(l[this.tid].activeChunkRequest)for(const t of l[this.tid].activeChunkRequest.callbacks)t.reject(t.frameNumber);l[this.tid].activeChunkRequest=l[this.tid].nextChunkRequest,l[this.tid].nextChunkRequest=void 0,u()}})},{provider:f}=l[this.tid],{chunkSize:p}=l[this.tid],h=Math.max(this.startFrame,parseInt(this.number/p,10)*p),d=Math.min(this.stopFrame,(parseInt(this.number/p,10)+1)*p-1),b=Math.floor(this.number/p);if(a)e("Dummy data");else if(s)try{const{decodedBlocksCacheSize:s}=l[this.tid];let a=await f.frame(this.number);if(null===a)if(t(),f.is_chunk_cached(h,d))l[this.tid].activeChunkRequest.callbacks.push({resolve:e,reject:n,frameNumber:this.number}),f.requestDecodeBlock(null,h,d,r,i);else if(!l[this.tid].activeChunkRequest||l[this.tid].activeChunkRequest&&l[this.tid].activeChunkRequest.completed)l[this.tid].activeChunkRequest&&l[this.tid].activeChunkRequest.rejectRequestAll(),l[this.tid].activeChunkRequest={request:void 0,chunkNumber:b,start:h,stop:d,onDecodeAll:r,rejectRequestAll:i,completed:!1,callbacks:[{resolve:e,reject:n,frameNumber:this.number}]},u();else if(l[this.tid].activeChunkRequest.chunkNumber===b)l[this.tid].activeChunkRequest.callbacks.push({resolve:e,reject:n,frameNumber:this.number});else{if(l[this.tid].nextChunkRequest)for(const t of l[this.tid].nextChunkRequest.callbacks)t.reject(t.frameNumber);l[this.tid].nextChunkRequest={request:void 0,chunkNumber:b,start:h,stop:d,onDecodeAll:r,rejectRequestAll:i,completed:!1,callbacks:[{resolve:e,reject:n,frameNumber:this.number}]}}else{if(this.number%p>1&&!f.isNextChunkExists(this.number)&&s>1){const t=b+1,e=Math.max(this.startFrame,t*p),r=Math.min(this.stopFrame,(t+1)*p-1);e{f.requestDecodeBlock(t,e,r,void 0,void 0)}).catch(t=>{n(t instanceof c?t:new c(t.message))}))}e(a)}}catch(t){n(t instanceof c?t:new c(t.message))}})},t.exports={FrameData:f,getFrame:async function(t,e,n,i,s,a,c){if(!(t in l)){const i="video"===n?r.BlockType.MP4VIDEO:r.BlockType.ARCHIVE,a=await o.frames.getMeta(t),c=i===r.BlockType.MP4VIDEO?Math.floor(258.90765432098766/e)||1:Math.floor(500/e)||1;l[t]={meta:a,chunkSize:e,provider:new r.FrameProvider(i,e,9,c,1),lastFrameRequest:s,decodedBlocksCacheSize:c,activeChunkRequest:void 0,nextChunkRequest:void 0}}const p=(t=>{let e=null;if("interpolation"===i)[e]=t;else{if("annotation"!==i)throw new u(`Invalid mode is specified ${i}`);if(s>=t.length)throw new u(`Meta information about frame ${s} can't be received from the server`);e=t[s]}return e})(l[t].meta);return l[t].lastFrameRequest=s,l[t].provider.setRenderSize(p.width,p.height),new f(p.width,p.height,t,s,a,c)},getRanges:function(t){return t in l?l[t].provider.cachedFrames:[]},getPreview:async function(t){return new Promise(async(n,r)=>{try{const r=await o.frames.getPreview(t);if(a)n(e.Buffer.from(r,"binary").toString("base64"));else if(s){const t=new FileReader;t.onload=()=>{n(t.result)},t.readAsDataURL(r)}}catch(t){r(t)}})}}})()}).call(this,n(30))},function(t,e,n){"use strict";var r=n(12),i=n(24),o=n(94),s=n(32),a=n(98),c=n(101),u=n(18);r({target:"Promise",proto:!0,real:!0},{finally:function(t){var e=a(this,s("Promise")),n="function"==typeof t;return this.then(n?function(n){return c(e,t()).then((function(){return n}))}:t,n?function(n){return c(e,t()).then((function(){throw n}))}:t)}}),i||"function"!=typeof o||o.prototype.finally||u(o.prototype,"finally",s("Promise").prototype.finally)},function(t,e,n){n(72),n(225),n(227),n(243);const{MP4Reader:r,Bytestream:i}=n(245),o=Object.freeze({MP4VIDEO:"mp4video",ARCHIVE:"archive"});class s{constructor(){this._lock=Promise.resolve()}_acquire(){var t;return this._lock=new Promise(e=>{t=e}),t}acquireQueued(){const t=this._lock.then(()=>e),e=this._acquire();return t}}t.exports={FrameProvider:class{constructor(t,e,n,r=5,i=2){this._frames={},this._cachedBlockCount=Math.max(1,n),this._decodedBlocksCacheSize=r,this._blocks_ranges=[],this._blocks={},this._blockSize=e,this._running=!1,this._blockType=t,this._currFrame=-1,this._requestedBlockDecode=null,this._width=null,this._height=null,this._decodingBlocks={},this._decodeThreadCount=0,this._timerId=setTimeout(this._worker.bind(this),100),this._mutex=new s,this._promisedFrames={},this._maxWorkerThreadCount=i}async _worker(){null!=this._requestedBlockDecode&&this._decodeThreadCountthis._cachedBlockCount){const t=this._blocks_ranges.shift(),[e,n]=t.split(":").map(t=>+t);delete this._blocks[e/this._blockSize];for(let t=e;t<=n;t++)delete this._frames[t]}const t=Math.floor(this._decodedBlocksCacheSize/2);for(let e=0;e+t);if(rthis._currFrame+t*this._blockSize)for(let t=n;t<=r;t++)delete this._frames[t]}}async requestDecodeBlock(t,e,n,r,i){const o=await this._mutex.acquireQueued();null!==this._requestedBlockDecode&&(e===this._requestedBlockDecode.start&&n===this._requestedBlockDecode.end?(this._requestedBlockDecode.resolveCallback=r,this._requestedBlockDecode.rejectCallback=i):this._requestedBlockDecode.rejectCallback&&this._requestedBlockDecode.rejectCallback()),`${e}:${n}`in this._decodingBlocks?(this._decodingBlocks[`${e}:${n}`].rejectCallback=i,this._decodingBlocks[`${e}:${n}`].resolveCallback=r):(null===t&&(t=this._blocks[Math.floor((e+1)/this.blockSize)]),this._requestedBlockDecode={block:t,start:e,end:n,resolveCallback:r,rejectCallback:i}),o()}isRequestExist(){return null!=this._requestedBlockDecode}setRenderSize(t,e){this._width=t,this._height=e}async frame(t){return this._currFrame=t,new Promise((e,n)=>{t in this._frames?null!==this._frames[t]?e(this._frames[t]):this._promisedFrames[t]={resolve:e,reject:n}:e(null)})}isNextChunkExists(t){const e=Math.floor(t/this._blockSize)+1;return"loading"===this._blocks[e]||e in this._blocks}setReadyToLoading(t){this._blocks[t]="loading"}cropImage(t,e,n,r,i,o,s){if(0===r&&o===e&&0===i&&s===n)return new ImageData(new Uint8ClampedArray(t),o,s);const a=new Uint32Array(t),c=o*s*4,u=new ArrayBuffer(c),l=new Uint32Array(u),f=new Uint8ClampedArray(u);if(e===o)return new ImageData(new Uint8ClampedArray(t,4*i,c),o,s);let p=0;for(let t=i;t{if(t.data.consoleLog)return;const r=Math.ceil(this._height/t.data.height);this._frames[u]=this.cropImage(t.data.buf,t.data.width,t.data.height,0,0,Math.floor(n/r),Math.floor(e/r)),this._decodingBlocks[`${s}:${a}`].resolveCallback&&this._decodingBlocks[`${s}:${a}`].resolveCallback(u),u in this._promisedFrames&&(this._promisedFrames[u].resolve(this._frames[u]),delete this._promisedFrames[u]),u===a&&(this._decodeThreadCount--,delete this._decodingBlocks[`${s}:${a}`],o.terminate()),u++},o.onerror=t=>{console.log(["ERROR: Line ",t.lineno," in ",t.filename,": ",t.message].join("")),o.terminate(),this._decodeThreadCount--;for(let t=u;t<=a;t++)t in this._promisedFrames&&(this._promisedFrames[t].reject(),delete this._promisedFrames[t]);this._decodingBlocks[`${s}:${a}`].rejectCallback&&this._decodingBlocks[`${s}:${a}`].rejectCallback(),delete this._decodingBlocks[`${s}:${a}`]},o.postMessage({type:"Broadway.js - Worker init",options:{rgb:!0,reuseMemory:!1}});const l=new r(new i(c));l.read();const f=l.tracks[1],p=l.tracks[1].trak.mdia.minf.stbl.stsd.avc1.avcC,h=p.sps[0],d=p.pps[0];o.postMessage({buf:h,offset:0,length:h.length}),o.postMessage({buf:d,offset:0,length:d.length});for(let t=0;t{o.postMessage({buf:t,offset:0,length:t.length})});this._decodeThreadCount++,t()}else{const r=new Worker("/static/engine/js/unzip_imgs.js");r.onerror=t=>{console.log(["ERROR: Line ",t.lineno," in ",t.filename,": ",t.message].join(""));for(let t=s;t<=a;t++)t in this._promisedFrames&&(this._promisedFrames[t].reject(),delete this._promisedFrames[t]);this._decodingBlocks[`${s}:${a}`].rejectCallback&&this._decodingBlocks[`${s}:${a}`].rejectCallback(),this._decodeThreadCount--},r.postMessage({block:c,start:s,end:a}),this._decodeThreadCount++,r.onmessage=t=>{this._frames[t.data.index]={data:t.data.data,width:n,height:e},this._decodingBlocks[`${s}:${a}`].resolveCallback&&this._decodingBlocks[`${s}:${a}`].resolveCallback(t.data.index),t.data.index in this._promisedFrames&&(this._promisedFrames[t.data.index].resolve(this._frames[t.data.index]),delete this._promisedFrames[t.data.index]),t.data.isEnd&&(delete this._decodingBlocks[`${s}:${a}`],this._decodeThreadCount--)},t()}}get decodeThreadCount(){return this._decodeThreadCount}get cachedFrames(){return[...this._blocks_ranges].sort((t,e)=>t.split(":")[0]-e.split(":")[0])}},BlockType:o}},function(t,e,n){var r=n(16),i=n(38),o="".split;t.exports=r((function(){return!Object("z").propertyIsEnumerable(0)}))?function(t){return"String"==i(t)?o.call(t,""):Object(t)}:Object},function(t,e,n){var r=n(8),i=n(123),o=n(19),s=r("unscopables"),a=Array.prototype;null==a[s]&&o(a,s,i(null)),t.exports=function(t){a[s][t]=!0}},function(t,e,n){var r=n(1),i=n(73),o=r["__core-js_shared__"]||i("__core-js_shared__",{});t.exports=o},function(t,e,n){var r=n(16);t.exports=!!Object.getOwnPropertySymbols&&!r((function(){return!String(Symbol())}))},function(t,e,n){var r=n(28),i=n(39),o=n(17),s=n(211);t.exports=r?Object.defineProperties:function(t,e){o(t);for(var n,r=s(e),a=r.length,c=0;a>c;)i.f(t,n=r[c++],e[n]);return t}},function(t,e,n){var r=n(124),i=n(77);t.exports=Object.keys||function(t){return r(t,i)}},function(t,e,n){var r=n(50),i=n(125),o=n(213),s=function(t){return function(e,n,s){var a,c=r(e),u=i(c.length),l=o(s,u);if(t&&n!=n){for(;u>l;)if((a=c[l++])!=a)return!0}else for(;u>l;l++)if((t||l in c)&&c[l]===n)return t||l||0;return!t&&-1}};t.exports={includes:s(!0),indexOf:s(!1)}},function(t,e,n){var r=n(126),i=Math.max,o=Math.min;t.exports=function(t,e){var n=r(t);return n<0?i(n+e,0):o(n,e)}},function(t,e,n){var r=n(1),i=n(129),o=r.WeakMap;t.exports="function"==typeof o&&/native code/.test(i.call(o))},function(t,e,n){"use strict";var r=n(80),i=n(221),o=n(132),s=n(223),a=n(82),c=n(19),u=n(54),l=n(8),f=n(52),p=n(40),h=n(131),d=h.IteratorPrototype,b=h.BUGGY_SAFARI_ITERATORS,m=l("iterator"),g=function(){return this};t.exports=function(t,e,n,l,h,v,y){i(n,e,l);var w,k,x,O=function(t){if(t===h&&T)return T;if(!b&&t in _)return _[t];switch(t){case"keys":case"values":case"entries":return function(){return new n(this,t)}}return function(){return new n(this)}},j=e+" Iterator",S=!1,_=t.prototype,A=_[m]||_["@@iterator"]||h&&_[h],T=!b&&A||O(h),P="Array"==e&&_.entries||A;if(P&&(w=o(P.call(new t)),d!==Object.prototype&&w.next&&(f||o(w)===d||(s?s(w,d):"function"!=typeof w[m]&&c(w,m,g)),a(w,j,!0,!0),f&&(p[j]=g))),"values"==h&&A&&"values"!==A.name&&(S=!0,T=function(){return A.call(this)}),f&&!y||_[m]===T||c(_,m,T),p[e]=T,h)if(k={values:O("values"),keys:v?T:O("keys"),entries:O("entries")},y)for(x in k)!b&&!S&&x in _||u(_,x,k[x]);else r({target:e,proto:!0,forced:b||S},k);return k}},function(t,e,n){"use strict";var r={}.propertyIsEnumerable,i=Object.getOwnPropertyDescriptor,o=i&&!r.call({1:2},1);e.f=o?function(t){var e=i(this,t);return!!e&&e.enumerable}:r},function(t,e,n){var r=n(20),i=n(218),o=n(81),s=n(39);t.exports=function(t,e){for(var n=i(e),a=s.f,c=o.f,u=0;us;){var a,c,u,l=r[s++],f=o?l.ok:l.fail,p=l.resolve,h=l.reject,d=l.domain;try{f?(o||(2===e.rejection&&et(t,e),e.rejection=1),!0===f?a=i:(d&&d.enter(),a=f(i),d&&(d.exit(),u=!0)),a===l.promise?h($("Promise-chain cycle")):(c=K(a))?c.call(a,p,h):p(a)):h(i)}catch(t){d&&!u&&d.exit(),h(t)}}e.reactions=[],e.notified=!1,n&&!e.rejection&&Q(t,e)}))}},Y=function(t,e,n){var r,i;V?((r=B.createEvent("Event")).promise=e,r.reason=n,r.initEvent(t,!1,!0),u.dispatchEvent(r)):r={promise:e,reason:n},(i=u["on"+t])?i(r):"unhandledrejection"===t&&_("Unhandled promise rejection",n)},Q=function(t,e){O.call(u,(function(){var n,r=e.value;if(tt(e)&&(n=T((function(){J?U.emit("unhandledRejection",r,t):Y("unhandledrejection",t,r)})),e.rejection=J||tt(e)?2:1,n.error))throw n.value}))},tt=function(t){return 1!==t.rejection&&!t.parent},et=function(t,e){O.call(u,(function(){J?U.emit("rejectionHandled",t):Y("rejectionhandled",t,e.value)}))},nt=function(t,e,n,r){return function(i){t(e,n,i,r)}},rt=function(t,e,n,r){e.done||(e.done=!0,r&&(e=r),e.value=n,e.state=2,Z(t,e,!0))},it=function(t,e,n,r){if(!e.done){e.done=!0,r&&(e=r);try{if(t===n)throw $("Promise can't be resolved itself");var i=K(n);i?j((function(){var r={done:!1};try{i.call(n,nt(it,t,r,e),nt(rt,t,r,e))}catch(n){rt(t,r,n,e)}})):(e.value=n,e.state=1,Z(t,e,!1))}catch(n){rt(t,{done:!1},n,e)}}};H&&(D=function(t){v(this,D,F),g(t),r.call(this);var e=M(this);try{t(nt(it,this,e),nt(rt,this,e))}catch(t){rt(this,e,t)}},(r=function(t){N(this,{type:F,done:!1,notified:!1,parent:!1,reactions:[],rejection:!1,state:0,value:void 0})}).prototype=h(D.prototype,{then:function(t,e){var n=R(this),r=W(x(this,D));return r.ok="function"!=typeof t||t,r.fail="function"==typeof e&&e,r.domain=J?U.domain:void 0,n.parent=!0,n.reactions.push(r),0!=n.state&&Z(this,n,!1),r.promise},catch:function(t){return this.then(void 0,t)}}),i=function(){var t=new r,e=M(t);this.promise=t,this.resolve=nt(it,t,e),this.reject=nt(rt,t,e)},A.f=W=function(t){return t===D||t===o?new i(t):G(t)},c||"function"!=typeof f||(s=f.prototype.then,p(f.prototype,"then",(function(t,e){var n=this;return new D((function(t,e){s.call(n,t,e)})).then(t,e)}),{unsafe:!0}),"function"==typeof L&&a({global:!0,enumerable:!0,forced:!0},{fetch:function(t){return S(D,L.apply(u,arguments))}}))),a({global:!0,wrap:!0,forced:H},{Promise:D}),d(D,F,!1,!0),b(F),o=l.Promise,a({target:F,stat:!0,forced:H},{reject:function(t){var e=W(this);return e.reject.call(void 0,t),e.promise}}),a({target:F,stat:!0,forced:c||H},{resolve:function(t){return S(c&&this===o?D:this,t)}}),a({target:F,stat:!0,forced:X},{all:function(t){var e=this,n=W(e),r=n.resolve,i=n.reject,o=T((function(){var n=g(e.resolve),o=[],s=0,a=1;w(t,(function(t){var c=s++,u=!1;o.push(void 0),a++,n.call(e,t).then((function(t){u||(u=!0,o[c]=t,--a||r(o))}),i)})),--a||r(o)}));return o.error&&i(o.value),n.promise},race:function(t){var e=this,n=W(e),r=n.reject,i=T((function(){var i=g(e.resolve);w(t,(function(t){i.call(e,t).then(n.resolve,r)}))}));return i.error&&r(i.value),n.promise}})},function(t,e,n){var r=n(1);t.exports=r.Promise},function(t,e,n){var r=n(54);t.exports=function(t,e,n){for(var i in e)r(t,i,e[i],n);return t}},function(t,e,n){"use strict";var r=n(53),i=n(39),o=n(8),s=n(28),a=o("species");t.exports=function(t){var e=r(t),n=i.f;s&&e&&!e[a]&&n(e,a,{configurable:!0,get:function(){return this}})}},function(t,e){t.exports=function(t,e,n){if(!(t instanceof e))throw TypeError("Incorrect "+(n?n+" ":"")+"invocation");return t}},function(t,e,n){var r=n(17),i=n(233),o=n(125),s=n(134),a=n(234),c=n(236),u=function(t,e){this.stopped=t,this.result=e};(t.exports=function(t,e,n,l,f){var p,h,d,b,m,g,v,y=s(e,n,l?2:1);if(f)p=t;else{if("function"!=typeof(h=a(t)))throw TypeError("Target is not iterable");if(i(h)){for(d=0,b=o(t.length);b>d;d++)if((m=l?y(r(v=t[d])[0],v[1]):y(t[d]))&&m instanceof u)return m;return new u(!1)}p=h.call(t)}for(g=p.next;!(v=g.call(p)).done;)if("object"==typeof(m=c(p,y,v.value,l))&&m&&m instanceof u)return m;return new u(!1)}).stop=function(t){return new u(!0,t)}},function(t,e,n){var r=n(8),i=n(40),o=r("iterator"),s=Array.prototype;t.exports=function(t){return void 0!==t&&(i.Array===t||s[o]===t)}},function(t,e,n){var r=n(235),i=n(40),o=n(8)("iterator");t.exports=function(t){if(null!=t)return t[o]||t["@@iterator"]||i[r(t)]}},function(t,e,n){var r=n(38),i=n(8)("toStringTag"),o="Arguments"==r(function(){return arguments}());t.exports=function(t){var e,n,s;return void 0===t?"Undefined":null===t?"Null":"string"==typeof(n=function(t,e){try{return t[e]}catch(t){}}(e=Object(t),i))?n:o?r(e):"Object"==(s=r(e))&&"function"==typeof e.callee?"Arguments":s}},function(t,e,n){var r=n(17);t.exports=function(t,e,n,i){try{return i?e(r(n)[0],n[1]):e(n)}catch(e){var o=t.return;throw void 0!==o&&r(o.call(t)),e}}},function(t,e,n){var r=n(8)("iterator"),i=!1;try{var o=0,s={next:function(){return{done:!!o++}},return:function(){i=!0}};s[r]=function(){return this},Array.from(s,(function(){throw 2}))}catch(t){}t.exports=function(t,e){if(!e&&!i)return!1;var n=!1;try{var o={};o[r]=function(){return{next:function(){return{done:n=!0}}}},t(o)}catch(t){}return n}},function(t,e,n){var r=n(17),i=n(41),o=n(8)("species");t.exports=function(t,e){var n,s=r(t).constructor;return void 0===s||null==(n=r(s)[o])?e:i(n)}},function(t,e,n){var r,i,o,s,a,c,u,l,f=n(1),p=n(81).f,h=n(38),d=n(135).set,b=n(83),m=f.MutationObserver||f.WebKitMutationObserver,g=f.process,v=f.Promise,y="process"==h(g),w=p(f,"queueMicrotask"),k=w&&w.value;k||(r=function(){var t,e;for(y&&(t=g.domain)&&t.exit();i;){e=i.fn,i=i.next;try{e()}catch(t){throw i?s():o=void 0,t}}o=void 0,t&&t.enter()},y?s=function(){g.nextTick(r)}:m&&!/(iphone|ipod|ipad).*applewebkit/i.test(b)?(a=!0,c=document.createTextNode(""),new m(r).observe(c,{characterData:!0}),s=function(){c.data=a=!a}):v&&v.resolve?(u=v.resolve(void 0),l=u.then,s=function(){l.call(u,r)}):s=function(){d.call(f,r)}),t.exports=k||function(t){var e={fn:t,next:void 0};o&&(o.next=e),i||(i=e,s()),o=e}},function(t,e,n){var r=n(17),i=n(22),o=n(136);t.exports=function(t,e){if(r(t),i(e)&&e.constructor===t)return e;var n=o.f(t);return(0,n.resolve)(e),n.promise}},function(t,e,n){var r=n(1);t.exports=function(t,e){var n=r.console;n&&n.error&&(1===arguments.length?n.error(t):n.error(t,e))}},function(t,e){t.exports=function(t){try{return{error:!1,value:t()}}catch(t){return{error:!0,value:t}}}},function(t,e,n){var r=n(1),i=n(244),o=n(72),s=n(19),a=n(8),c=a("iterator"),u=a("toStringTag"),l=o.values;for(var f in i){var p=r[f],h=p&&p.prototype;if(h){if(h[c]!==l)try{s(h,c,l)}catch(t){h[c]=l}if(h[u]||s(h,u,f),i[f])for(var d in o)if(h[d]!==o[d])try{s(h,d,o[d])}catch(t){h[d]=o[d]}}}},function(t,e){t.exports={CSSRuleList:0,CSSStyleDeclaration:0,CSSValueList:0,ClientRectList:0,DOMRectList:0,DOMStringList:0,DOMTokenList:1,DataTransferItemList:0,FileList:0,HTMLAllCollection:0,HTMLCollection:0,HTMLFormElement:0,HTMLSelectElement:0,MediaList:0,MimeTypeArray:0,NamedNodeMap:0,NodeList:1,PaintRequestList:0,Plugin:0,PluginArray:0,SVGLengthList:0,SVGNumberList:0,SVGPathSegList:0,SVGPointList:0,SVGStringList:0,SVGTransformList:0,SourceBufferList:0,StyleSheetList:0,TextTrackCueList:0,TextTrackList:0,TouchList:0}},function(t,e,n){n(72),t.exports=function(){"use strict";function t(t,e){t||error(e)}var e,n,r=function(){function t(t,e){this.w=t,this.h=e}return t.prototype={toString:function(){return"("+this.w+", "+this.h+")"},getHalfSize:function(){return new r(this.w>>>1,this.h>>>1)},length:function(){return this.w*this.h}},t}(),i=function(){function e(t,e,n){this.bytes=new Uint8Array(t),this.start=e||0,this.pos=this.start,this.end=e+n||this.bytes.length}return e.prototype={get length(){return this.end-this.start},get position(){return this.pos},get remaining(){return this.end-this.pos},readU8Array:function(t){if(this.pos>this.end-t)return null;var e=this.bytes.subarray(this.pos,this.pos+t);return this.pos+=t,e},readU32Array:function(t,e,n){if(e=e||1,this.pos>this.end-t*e*4)return null;if(1==e){for(var r=new Uint32Array(t),i=0;i>24},readU8:function(){return this.pos>=this.end?null:this.bytes[this.pos++]},read16:function(){return this.readU16()<<16>>16},readU16:function(){if(this.pos>=this.end-1)return null;var t=this.bytes[this.pos+0]<<8|this.bytes[this.pos+1];return this.pos+=2,t},read24:function(){return this.readU24()<<8>>8},readU24:function(){var t=this.pos,e=this.bytes;if(t>this.end-3)return null;var n=e[t+0]<<16|e[t+1]<<8|e[t+2];return this.pos+=3,n},peek32:function(t){var e=this.pos,n=this.bytes;if(e>this.end-4)return null;var r=n[e+0]<<24|n[e+1]<<16|n[e+2]<<8|n[e+3];return t&&(this.pos+=4),r},read32:function(){return this.peek32(!0)},readU32:function(){return this.peek32(!0)>>>0},read4CC:function(){var t=this.pos;if(t>this.end-4)return null;for(var e="",n=0;n<4;n++)e+=String.fromCharCode(this.bytes[t+n]);return this.pos+=4,e},readFP16:function(){return this.read32()/65536},readFP8:function(){return this.read16()/256},readISO639:function(){for(var t=this.readU16(),e="",n=0;n<3;n++){var r=t>>>5*(2-n)&31;e+=String.fromCharCode(r+96)}return e},readUTF8:function(t){for(var e="",n=0;nthis.end)&&error("Index out of bounds (bounds: [0, "+this.end+"], index: "+t+")."),this.pos=t},subStream:function(t,e){return new i(this.bytes.buffer,t,e)}},e}(),o=function(){function e(t){this.stream=t,this.tracks={}}return e.prototype={readBoxes:function(t,e){for(;t.peek32();){var n=this.readBox(t);if(n.type in e){var r=e[n.type];r instanceof Array||(e[n.type]=[r]),e[n.type].push(n)}else e[n.type]=n}},readBox:function(e){var n={offset:e.position};function r(){n.version=e.readU8(),n.flags=e.readU24()}function i(){return n.size-(e.position-n.offset)}function o(){e.skip(i())}var a=function(){var t=e.subStream(e.position,i());this.readBoxes(t,n),e.skip(t.length)}.bind(this);switch(n.size=e.readU32(),n.type=e.read4CC(),n.type){case"ftyp":n.name="File Type Box",n.majorBrand=e.read4CC(),n.minorVersion=e.readU32(),n.compatibleBrands=new Array((n.size-16)/4);for(var c=0;c0&&(n.name=e.readUTF8(u));break;case"minf":n.name="Media Information Box",a();break;case"stbl":n.name="Sample Table Box",a();break;case"stsd":n.name="Sample Description Box",r(),n.sd=[];e.readU32();a();break;case"avc1":e.reserved(6,0),n.dataReferenceIndex=e.readU16(),t(0==e.readU16()),t(0==e.readU16()),e.readU32(),e.readU32(),e.readU32(),n.width=e.readU16(),n.height=e.readU16(),n.horizontalResolution=e.readFP16(),n.verticalResolution=e.readFP16(),t(0==e.readU32()),n.frameCount=e.readU16(),n.compressorName=e.readPString(32),n.depth=e.readU16(),t(65535==e.readU16()),a();break;case"mp4a":e.reserved(6,0),n.dataReferenceIndex=e.readU16(),n.version=e.readU16(),e.skip(2),e.skip(4),n.channelCount=e.readU16(),n.sampleSize=e.readU16(),n.compressionId=e.readU16(),n.packetSize=e.readU16(),n.sampleRate=e.readU32()>>>16,t(0==n.version),a();break;case"esds":n.name="Elementary Stream Descriptor",r(),o();break;case"avcC":n.name="AVC Configuration Box",n.configurationVersion=e.readU8(),n.avcProfileIndication=e.readU8(),n.profileCompatibility=e.readU8(),n.avcLevelIndication=e.readU8(),n.lengthSizeMinusOne=3&e.readU8(),t(3==n.lengthSizeMinusOne,"TODO");var l=31&e.readU8();n.sps=[];for(c=0;c=8,"Cannot parse large media data yet."),n.data=e.readU8Array(i());break;default:o()}return n},read:function(){var t=(new Date).getTime();this.file={},this.readBoxes(this.stream,this.file),console.info("Parsed stream in "+((new Date).getTime()-t)+" ms")},traceSamples:function(){var t=this.tracks[1],e=this.tracks[2];console.info("Video Samples: "+t.getSampleCount()),console.info("Audio Samples: "+e.getSampleCount());for(var n=0,r=0,i=0;i<100;i++){var o=t.sampleToOffset(n),s=e.sampleToOffset(r),a=t.sampleToSize(n,1),c=e.sampleToSize(r,1);o0){var s=n[i-1],a=o.firstChunk-s.firstChunk,c=s.samplesPerChunk*a;if(!(e>=c))return{index:r+Math.floor(e/s.samplesPerChunk),offset:e%s.samplesPerChunk};if(e-=c,i==n.length-1)return{index:r+a+Math.floor(e/o.samplesPerChunk),offset:e%o.samplesPerChunk};r+=a}}t(!1)},chunkToOffset:function(t){return this.trak.mdia.minf.stbl.stco.table[t]},sampleToOffset:function(t){var e=this.sampleToChunk(t);return this.chunkToOffset(e.index)+this.sampleToSize(t-e.offset,e.offset)},timeToSample:function(t){for(var e=this.trak.mdia.minf.stbl.stts.table,n=0,r=0;r=i))return n+Math.floor(t/e[r].delta);t-=i,n+=e[r].count}},getTotalTime:function(){for(var e=this.trak.mdia.minf.stbl.stts.table,n=0,r=0;r0;){var s=new i(e.buffer,n).readU32();o.push(e.subarray(n+4,n+s+4)),n=n+s+4}return o}},e}();e=[],n="zero-timeout-message",window.addEventListener("message",(function(t){t.source==window&&t.data==n&&(t.stopPropagation(),e.length>0&&e.shift()())}),!0),window.setZeroTimeout=function(t){e.push(t),window.postMessage(n,"*")};var a=function(){function t(t,n,r,i){this.stream=t,this.useWorkers=n,this.webgl=r,this.render=i,this.statistics={videoStartTime:0,videoPictureCounter:0,windowStartTime:0,windowPictureCounter:0,fps:0,fpsMin:1e3,fpsMax:-1e3,webGLTextureUploadTime:0},this.onStatisticsUpdated=function(){},this.avc=new Player({useWorker:n,reuseMemory:!0,webgl:r,size:{width:640,height:368}}),this.webgl=this.avc.webgl;var o=this;this.avc.onPictureDecoded=function(){e.call(o)},this.canvas=this.avc.canvas}function e(){var t=this.statistics;t.videoPictureCounter+=1,t.windowPictureCounter+=1;var e=Date.now();t.videoStartTime||(t.videoStartTime=e);var n=e-t.videoStartTime;if(t.elapsed=n/1e3,!(n<1e3))if(t.windowStartTime){if(e-t.windowStartTime>1e3){var r=e-t.windowStartTime,i=t.windowPictureCounter/r*1e3;t.windowStartTime=e,t.windowPictureCounter=0,it.fpsMax&&(t.fpsMax=i),t.fps=i}i=t.videoPictureCounter/n*1e3;t.fpsSinceStart=i,this.onStatisticsUpdated(this.statistics)}else t.windowStartTime=e}return t.prototype={readAll:function(t){console.info("MP4Player::readAll()"),this.stream.readAll(null,function(e){this.reader=new o(new i(e)),this.reader.read();var n=this.reader.tracks[1];this.size=new r(n.trak.tkhd.width,n.trak.tkhd.height),console.info("MP4Player::readAll(), length: "+this.reader.stream.length),t&&t()}.bind(this))},play:function(){var t=this.reader;if(t){var e=t.tracks[1],n=(t.tracks[2],t.tracks[1].trak.mdia.minf.stbl.stsd.avc1.avcC),r=n.sps[0],i=n.pps[0];this.avc.decode(r),this.avc.decode(i);var o=0;setTimeout(function t(){var n=this.avc;e.getSampleNALUnits(o).forEach((function(t){n.decode(t)})),++o<3e3&&setTimeout(t.bind(this),1)}.bind(this),1)}else this.readAll(this.play.bind(this))}},t}(),c=function(){function t(t){var e=t.attributes.src?t.attributes.src.value:void 0,n=(t.attributes.width&&t.attributes.width.value,t.attributes.height&&t.attributes.height.value,document.createElement("div"));n.setAttribute("style","z-index: 100; position: absolute; bottom: 0px; background-color: rgba(0,0,0,0.8); height: 30px; width: 100%; text-align: left;"),this.info=document.createElement("div"),this.info.setAttribute("style","font-size: 14px; font-weight: bold; padding: 6px; color: lime;"),n.appendChild(this.info),t.appendChild(n);var r=!!t.attributes.workers&&"true"==t.attributes.workers.value,i=!!t.attributes.render&&"true"==t.attributes.render.value,o="auto";t.attributes.webgl&&("true"==t.attributes.webgl.value&&(o=!0),"false"==t.attributes.webgl.value&&(o=!1));var s="";s+=r?"worker thread ":"main thread ",this.player=new a(new Stream(e),r,o,i),this.canvas=this.player.canvas,this.canvas.onclick=function(){this.play()}.bind(this),t.appendChild(this.canvas),s+=" - webgl: "+this.player.webgl,this.info.innerHTML="Click canvas to load and play - "+s,this.score=null,this.player.onStatisticsUpdated=function(t){if(t.videoPictureCounter%10==0){var e="";t.fps&&(e+=" fps: "+t.fps.toFixed(2)),t.fpsSinceStart&&(e+=" avg: "+t.fpsSinceStart.toFixed(2));t.videoPictureCounter<1200?this.score=1200-t.videoPictureCounter:1200==t.videoPictureCounter&&(this.score=t.fpsSinceStart.toFixed(2)),this.info.innerHTML=s+e}}.bind(this)}return t.prototype={play:function(){this.player.play()}},t}();return{Size:r,Track:s,MP4Reader:o,MP4Player:a,Bytestream:i,Broadway:c}}()},function(t,e,n){"use strict";(function(t){Object.defineProperty(e,"__esModule",{value:!0});var n="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t},r="undefined"!=typeof window&&void 0!==window.document,i="object"===("undefined"==typeof self?"undefined":n(self))&&self.constructor&&"DedicatedWorkerGlobalScope"===self.constructor.name,o=void 0!==t&&null!=t.versions&&null!=t.versions.node;e.isBrowser=r,e.isWebWorker=i,e.isNode=o}).call(this,n(112))},function(t,e,n){n(5),n(11),n(10),(()=>{const e=n(26),r=n(248),i=n(251),{checkObjectType:o}=n(56),{Task:s}=n(49),{Loader:a,Dumper:c}=n(138),{ScriptingError:u,DataError:l,ArgumentError:f}=n(6),p=new WeakMap,h=new WeakMap;function d(t){if("task"===t)return h;if("job"===t)return p;throw new u(`Unknown session type was received ${t}`)}async function b(t){const n=t instanceof s?"task":"job",o=d(n);if(!o.has(t)){const s=await e.annotations.getAnnotations(n,t.id),a="job"===n?t.startFrame:0,c="job"===n?t.stopFrame:t.size-1,u={};for(let e=a;e<=c;e++)u[e]=await t.frames.get(e);const l=new r({labels:t.labels||t.task.labels,startFrame:a,stopFrame:c,frameMeta:u}).import(s),f=new i(s.version,l,t);o.set(t,{collection:l,saver:f})}}t.exports={getAnnotations:async function(t,e,n){return await b(t),d(t instanceof s?"task":"job").get(t).collection.get(e,n)},putAnnotations:function(t,e){const n=d(t instanceof s?"task":"job");if(n.has(t))return n.get(t).collection.put(e);throw new l("Collection has not been initialized yet. Call annotations.get() or annotations.clear(true) before")},saveAnnotations:async function(t,e){const n=d(t instanceof s?"task":"job");n.has(t)&&await n.get(t).saver.save(e)},hasUnsavedChanges:function(t){const e=d(t instanceof s?"task":"job");return!!e.has(t)&&e.get(t).saver.hasUnsavedChanges()},mergeAnnotations:function(t,e){const n=d(t instanceof s?"task":"job");if(n.has(t))return n.get(t).collection.merge(e);throw new l("Collection has not been initialized yet. Call annotations.get() or annotations.clear(true) before")},splitAnnotations:function(t,e,n){const r=d(t instanceof s?"task":"job");if(r.has(t))return r.get(t).collection.split(e,n);throw new l("Collection has not been initialized yet. Call annotations.get() or annotations.clear(true) before")},groupAnnotations:function(t,e,n){const r=d(t instanceof s?"task":"job");if(r.has(t))return r.get(t).collection.group(e,n);throw new l("Collection has not been initialized yet. Call annotations.get() or annotations.clear(true) before")},clearAnnotations:async function(t,e){o("reload",e,"boolean",null);const n=d(t instanceof s?"task":"job");n.has(t)&&n.get(t).collection.clear(),e&&(n.delete(t),await b(t))},annotationsStatistics:function(t){const e=d(t instanceof s?"task":"job");if(e.has(t))return e.get(t).collection.statistics();throw new l("Collection has not been initialized yet. Call annotations.get() or annotations.clear(true) before")},selectObject:function(t,e,n,r){const i=d(t instanceof s?"task":"job");if(i.has(t))return i.get(t).collection.select(e,n,r);throw new l("Collection has not been initialized yet. Call annotations.get() or annotations.clear(true) before")},uploadAnnotations:async function(t,n,r){const i=t instanceof s?"task":"job";if(!(r instanceof a))throw new f("A loader must be instance of Loader class");await e.annotations.uploadAnnotations(i,t.id,n,r.name)},dumpAnnotations:async function(t,n,r){if(!(r instanceof c))throw new f("A dumper must be instance of Dumper class");let i=null;return i="job"===(t instanceof s?"task":"job")?await e.annotations.dumpAnnotations(t.task.id,n,r.name):await e.annotations.dumpAnnotations(t.id,n,r.name)},exportDataset:async function(t,n){if(!(n instanceof String||"string"==typeof n))throw new f("Format must be a string");if(!(t instanceof s))throw new f("A dataset can only be created from a task");let r=null;return r=await e.tasks.exportDataset(t.id,n)}}})()},function(t,e,n){n(5),n(137),n(10),n(71),(()=>{const{RectangleShape:e,PolygonShape:r,PolylineShape:i,PointsShape:o,RectangleTrack:s,PolygonTrack:a,PolylineTrack:c,PointsTrack:u,Track:l,Shape:f,Tag:p,objectStateFactory:h}=n(250),{checkObjectType:d}=n(56),b=n(117),{Label:m}=n(55),{DataError:g,ArgumentError:v,ScriptingError:y}=n(6),{ObjectShape:w,ObjectType:k}=n(29),x=n(70),O=["#0066FF","#AF593E","#01A368","#FF861F","#ED0A3F","#FF3F34","#76D7EA","#8359A3","#FBE870","#C5E17A","#03BB85","#FFDF00","#8B8680","#0A6B0D","#8FD8D8","#A36F40","#F653A6","#CA3435","#FFCBA4","#FF99CC","#FA9D5A","#FFAE42","#A78B00","#788193","#514E49","#1164B4","#F4FA9F","#FED8B1","#C32148","#01796F","#E90067","#FF91A4","#404E5A","#6CDAE7","#FFC1CC","#006A93","#867200","#E2B631","#6EEB6E","#FFC800","#CC99BA","#FF007C","#BC6CAC","#DCCCD7","#EBE1C2","#A6AAAE","#B99685","#0086A7","#5E4330","#C8A2C8","#708EB3","#BC8777","#B2592D","#497E48","#6A2963","#E6335F","#00755E","#B5A895","#0048ba","#EED9C4","#C88A65","#FF6E4A","#87421F","#B2BEB5","#926F5B","#00B9FB","#6456B7","#DB5079","#C62D42","#FA9C44","#DA8A67","#FD7C6E","#93CCEA","#FCF686","#503E32","#FF5470","#9DE093","#FF7A00","#4F69C6","#A50B5E","#F0E68C","#FDFF00","#F091A9","#FFFF66","#6F9940","#FC74FD","#652DC1","#D6AEDD","#EE34D2","#BB3385","#6B3FA0","#33CC99","#FFDB00","#87FF2A","#6EEB6E","#FFC800","#CC99BA","#7A89B8","#006A93","#867200","#E2B631","#D9D6CF"];function j(t,n,s){const{type:a}=t,c=O[n%O.length];let u=null;switch(a){case"rectangle":u=new e(t,n,c,s);break;case"polygon":u=new r(t,n,c,s);break;case"polyline":u=new i(t,n,c,s);break;case"points":u=new o(t,n,c,s);break;default:throw new g(`An unexpected type of shape "${a}"`)}return u}function S(t,e,n){if(t.shapes.length){const{type:r}=t.shapes[0],i=O[e%O.length];let o=null;switch(r){case"rectangle":o=new s(t,e,i,n);break;case"polygon":o=new a(t,e,i,n);break;case"polyline":o=new c(t,e,i,n);break;case"points":o=new u(t,e,i,n);break;default:throw new g(`An unexpected type of track "${r}"`)}return o}return console.warn("The track without any shapes had been found. It was ignored."),null}t.exports=class{constructor(t){this.startFrame=t.startFrame,this.stopFrame=t.stopFrame,this.frameMeta=t.frameMeta,this.labels=t.labels.reduce((t,e)=>(t[e.id]=e,t),{}),this.shapes={},this.tags={},this.tracks=[],this.objects={},this.count=0,this.flush=!1,this.collectionZ={},this.groups={max:0},this.injection={labels:this.labels,collectionZ:this.collectionZ,groups:this.groups,frameMeta:this.frameMeta}}import(t){for(const e of t.tags){const t=++this.count,n=new p(e,t,this.injection);this.tags[n.frame]=this.tags[n.frame]||[],this.tags[n.frame].push(n),this.objects[t]=n}for(const e of t.shapes){const t=++this.count,n=j(e,t,this.injection);this.shapes[n.frame]=this.shapes[n.frame]||[],this.shapes[n.frame].push(n),this.objects[t]=n}for(const e of t.tracks){const t=++this.count,n=S(e,t,this.injection);n&&(this.tracks.push(n),this.objects[t]=n)}return this}export(){return{tracks:this.tracks.filter(t=>!t.removed).map(t=>t.toJSON()),shapes:Object.values(this.shapes).reduce((t,e)=>(t.push(...e),t),[]).filter(t=>!t.removed).map(t=>t.toJSON()),tags:Object.values(this.tags).reduce((t,e)=>(t.push(...e),t),[]).filter(t=>!t.removed).map(t=>t.toJSON())}}get(t){const{tracks:e}=this,n=this.shapes[t]||[],r=this.tags[t]||[],i=e.concat(n).concat(r).filter(t=>!t.removed),o=[];for(const e of i){const n=e.get(t);if(n.outside&&!n.keyframe)continue;const r=h.call(e,t,n);o.push(r)}return o}merge(t){if(d("shapes for merge",t,null,Array),!t.length)return;const e=t.map(t=>{d("object state",t,null,x);const e=this.objects[t.clientID];if(void 0===e)throw new v("The object has not been saved yet. Call ObjectState.put([state]) before you can merge it");return e}),n={},{label:r,shapeType:i}=t[0];if(!(r.id in this.labels))throw new v(`Unknown label for the task: ${r.id}`);if(!Object.values(w).includes(i))throw new v(`Got unknown shapeType "${i}"`);const o=r.attributes.reduce((t,e)=>(t[e.id]=e,t),{});for(let s=0;s(e in o&&o[e].mutable&&t.push({spec_id:+e,value:a.attributes[e]}),t),[])},a.frame+1 in n||(n[a.frame+1]=JSON.parse(JSON.stringify(n[a.frame])),n[a.frame+1].outside=!0,n[a.frame+1].frame++)}else{if(!(a instanceof l))throw new v(`Trying to merge unknown object type: ${a.constructor.name}. `+"Only shapes and tracks are expected.");{const t={};for(const e of Object.keys(a.shapes)){const r=a.shapes[e];if(e in n&&!n[e].outside){if(r.outside)continue;throw new v("Expected only one visible shape per frame")}let o=!1;for(const e in r.attributes)e in t&&t[e]===r.attributes[e]||(o=!0,t[e]=r.attributes[e]);n[e]={type:i,frame:+e,points:[...r.points],occluded:r.occluded,outside:r.outside,zOrder:r.zOrder,attributes:o?Object.keys(t).reduce((e,n)=>(e.push({spec_id:+n,value:t[n]}),e),[]):[]}}}}}let s=!1;for(const t of Object.keys(n).sort((t,e)=>+t-+e)){if((s=s||n[t].outside)||!n[t].outside)break;delete n[t]}const a=++this.count,c=S({frame:Math.min.apply(null,Object.keys(n).map(t=>+t)),shapes:Object.values(n),group:0,label_id:r.id,attributes:Object.keys(t[0].attributes).reduce((e,n)=>(o[n].mutable||e.push({spec_id:+n,value:t[0].attributes[n]}),e),[])},a,this.injection);this.tracks.push(c),this.objects[a]=c;for(const t of e)t.removed=!0,"function"==typeof t.resetCache&&t.resetCache()}split(t,e){d("object state",t,null,x),d("frame",e,"integer",null);const n=this.objects[t.clientID];if(void 0===n)throw new v("The object has not been saved yet. Call annotations.put([state]) before");if(t.objectType!==k.TRACK)return;const r=Object.keys(n.shapes).sort((t,e)=>+t-+e);if(e<=+r[0]||e>r[r.length-1])return;const i=n.label.attributes.reduce((t,e)=>(t[e.id]=e,t),{}),o=n.toJSON(),s={type:t.shapeType,points:[...t.points],occluded:t.occluded,outside:t.outside,zOrder:0,attributes:Object.keys(t.attributes).reduce((e,n)=>(i[n].mutable||e.push({spec_id:+n,value:t.attributes[n]}),e),[]),frame:e},a={frame:o.frame,group:0,label_id:o.label_id,attributes:o.attributes,shapes:[]},c=JSON.parse(JSON.stringify(a));c.frame=e,c.shapes.push(JSON.parse(JSON.stringify(s))),o.shapes.map(t=>(delete t.id,t.framee&&c.shapes.push(JSON.parse(JSON.stringify(t))),t)),a.shapes.push(s),a.shapes[a.shapes.length-1].outside=!0;let u=++this.count;const l=S(a,u,this.injection);this.tracks.push(l),this.objects[u]=l,u=++this.count;const f=S(c,u,this.injection);this.tracks.push(f),this.objects[u]=f,n.removed=!0,n.resetCache()}group(t,e){d("shapes for group",t,null,Array);const n=t.map(t=>{d("object state",t,null,x);const e=this.objects[t.clientID];if(void 0===e)throw new v("The object has not been saved yet. Call annotations.put([state]) before");return e}),r=e?0:++this.groups.max;for(const t of n)t.group=r,"function"==typeof t.resetCache&&t.resetCache();return r}clear(){this.shapes={},this.tags={},this.tracks=[],this.objects={},this.count=0,this.flush=!0}statistics(){const t={},e={rectangle:{shape:0,track:0},polygon:{shape:0,track:0},polyline:{shape:0,track:0},points:{shape:0,track:0},tags:0,manually:0,interpolated:0,total:0},n=JSON.parse(JSON.stringify(e));for(const n of Object.values(this.labels)){const{name:r}=n;t[r]=JSON.parse(JSON.stringify(e))}for(const e of Object.values(this.objects)){let n=null;if(e instanceof f)n="shape";else if(e instanceof l)n="track";else{if(!(e instanceof p))throw new y(`Unexpected object type: "${n}"`);n="tag"}const r=e.label.name;if("tag"===n)t[r].tags++,t[r].manually++,t[r].total++;else{const{shapeType:i}=e;if(t[r][i][n]++,"track"===n){const n=Object.keys(e.shapes).sort((t,e)=>+t-+e).map(t=>+t);let i=n[0],o=!1;for(const s of n){if(o){const e=s-i-1;t[r].interpolated+=e,t[r].total+=e}o=!e.shapes[s].outside,i=s,o&&(t[r].manually++,t[r].total++)}const s=n[n.length-1];if(s!==this.stopFrame&&!e.shapes[s].outside){const e=this.stopFrame-s;t[r].interpolated+=e,t[r].total+=e}}else t[r].manually++,t[r].total++}}for(const e of Object.keys(t))for(const r of Object.keys(t[e]))if("object"==typeof t[e][r])for(const i of Object.keys(t[e][r]))n[r][i]+=t[e][r][i];else n[r]+=t[e][r];return new b(t,n)}put(t){d("shapes for put",t,null,Array);const e={shapes:[],tracks:[],tags:[]};function n(t,e){const n=+e,r=this.attributes[e];return d("attribute id",n,"integer",null),d("attribute value",r,"string",null),t.push({spec_id:n,value:r}),t}for(const r of t){d("object state",r,null,x),d("state client ID",r.clientID,"undefined",null),d("state frame",r.frame,"integer",null),d("state attributes",r.attributes,null,Object),d("state label",r.label,null,m);const t=Object.keys(r.attributes).reduce(n.bind(r),[]),i=r.label.attributes.reduce((t,e)=>(t[e.id]=e,t),{});if("tag"===r.objectType)e.tags.push({attributes:t,frame:r.frame,label_id:r.label.id,group:0});else{d("state occluded",r.occluded,"boolean",null),d("state points",r.points,null,Array);for(const t of r.points)d("point coordinate",t,"number",null);if(!Object.values(w).includes(r.shapeType))throw new v("Object shape must be one of: "+`${JSON.stringify(Object.values(w))}`);if("shape"===r.objectType)e.shapes.push({attributes:t,frame:r.frame,group:0,label_id:r.label.id,occluded:r.occluded||!1,points:[...r.points],type:r.shapeType,z_order:0});else{if("track"!==r.objectType)throw new v("Object type must be one of: "+`${JSON.stringify(Object.values(k))}`);e.tracks.push({attributes:t.filter(t=>!i[t.spec_id].mutable),frame:r.frame,group:0,label_id:r.label.id,shapes:[{attributes:t.filter(t=>i[t.spec_id].mutable),frame:r.frame,occluded:r.occluded||!1,outside:!1,points:[...r.points],type:r.shapeType,z_order:0}]})}}}this.import(e)}select(t,e,n){d("shapes for select",t,null,Array),d("x coordinate",e,"number",null),d("y coordinate",n,"number",null);let r=null,i=null;for(const o of t){if(d("object state",o,null,x),o.outside)continue;const t=this.objects[o.clientID];if(void 0===t)throw new v("The object has not been saved yet. Call annotations.put([state]) before");const s=t.constructor.distance(o.points,e,n);null!==s&&(null===r||s{const e=n(70),{checkObjectType:r,isEnum:o}=n(56),{ObjectShape:s,ObjectType:a,AttributeType:c,VisibleState:u}=n(29),{DataError:l,ArgumentError:f,ScriptingError:p}=n(6),{Label:h}=n(55);function d(t,n){const r=new e(n);return r.hidden={save:this.save.bind(this,t,r),delete:this.delete.bind(this),up:this.up.bind(this,t,r),down:this.down.bind(this,t,r)},r}function b(t,e){if(t===s.RECTANGLE){if(e.length/2!=2)throw new l(`Rectangle must have 2 points, but got ${e.length/2}`)}else if(t===s.POLYGON){if(e.length/2<3)throw new l(`Polygon must have at least 3 points, but got ${e.length/2}`)}else if(t===s.POLYLINE){if(e.length/2<2)throw new l(`Polyline must have at least 2 points, but got ${e.length/2}`)}else{if(t!==s.POINTS)throw new f(`Unknown value of shapeType has been recieved ${t}`);if(e.length/2<1)throw new l(`Points must have at least 1 points, but got ${e.length/2}`)}}function m(t,e){if(t===s.POINTS)return!0;let n=Number.MAX_SAFE_INTEGER,r=Number.MIN_SAFE_INTEGER,i=Number.MAX_SAFE_INTEGER,o=Number.MIN_SAFE_INTEGER;for(let t=0;t=3}return(r-n)*(o-i)>=9}function g(t,e){const{values:n}=e,r=e.inputType;if("string"!=typeof t)throw new f(`Attribute value is expected to be string, but got ${typeof t}`);return r===c.NUMBER?+t>=+n[0]&&+t<=+n[1]&&!((+t-+n[0])%+n[2]):r===c.CHECKBOX?["true","false"].includes(t.toLowerCase()):n.includes(t)}class v{constructor(t,e,n){this.taskLabels=n.labels,this.clientID=e,this.serverID=t.id,this.group=t.group,this.label=this.taskLabels[t.label_id],this.frame=t.frame,this.removed=!1,this.lock=!1,this.attributes=t.attributes.reduce((t,e)=>(t[e.spec_id]=e.value,t),{}),this.appendDefaultAttributes(this.label),n.groups.max=Math.max(n.groups.max,this.group)}appendDefaultAttributes(t){const e=t.attributes;for(const t of e)t.id in this.attributes||(this.attributes[t.id]=t.defaultValue)}delete(t){return this.lock&&!t||(this.removed=!0),!0}}class y extends v{constructor(t,e,n,r){super(t,e,r),this.frameMeta=r.frameMeta,this.collectionZ=r.collectionZ,this.visibility=u.SHAPE,this.color=n,this.shapeType=null}_getZ(t){return this.collectionZ[t]=this.collectionZ[t]||{max:0,min:0},this.collectionZ[t]}save(){throw new p("Is not implemented")}get(){throw new p("Is not implemented")}toJSON(){throw new p("Is not implemented")}up(t,e){const n=this._getZ(t);n.max++,e.zOrder=n.max}down(t,e){const n=this._getZ(t);n.min--,e.zOrder=n.min}}class w extends y{constructor(t,e,n,r){super(t,e,n,r),this.points=t.points,this.occluded=t.occluded,this.zOrder=t.z_order;const i=this._getZ(this.frame);i.max=Math.max(i.max,this.zOrder||0),i.min=Math.min(i.min,this.zOrder||0)}toJSON(){return{type:this.shapeType,clientID:this.clientID,occluded:this.occluded,z_order:this.zOrder,points:[...this.points],attributes:Object.keys(this.attributes).reduce((t,e)=>(t.push({spec_id:e,value:this.attributes[e]}),t),[]),id:this.serverID,frame:this.frame,label_id:this.label.id,group:this.group}}get(t){if(t!==this.frame)throw new p("Got frame is not equal to the frame of the shape");return{objectType:a.SHAPE,shapeType:this.shapeType,clientID:this.clientID,serverID:this.serverID,occluded:this.occluded,lock:this.lock,zOrder:this.zOrder,points:[...this.points],attributes:i({},this.attributes),label:this.label,group:this.group,color:this.color,visibility:this.visibility}}save(t,e){if(t!==this.frame)throw new p("Got frame is not equal to the frame of the shape");if(this.lock&&e.lock)return d.call(this,t,this.get(t));const n=this.get(t),i=e.updateFlags;if(i.label&&(r("label",e.label,null,h),n.label=e.label,n.attributes={},this.appendDefaultAttributes.call(n,n.label)),i.attributes){const t=n.label.attributes.reduce((t,e)=>(t[e.id]=e,t),{});for(const r of Object.keys(e.attributes)){const i=e.attributes[r];if(!(r in t&&g(i,t[r])))throw new f(`Trying to save unknown attribute with id ${r} and value ${i}`);n.attributes[r]=i}}if(i.points){r("points",e.points,null,Array),b(this.shapeType,e.points);const{width:i,height:o}=this.frameMeta[t],s=[];for(let t=0;t{t[e.frame]={serverID:e.id,occluded:e.occluded,zOrder:e.z_order,points:e.points,outside:e.outside,attributes:e.attributes.reduce((t,e)=>(t[e.spec_id]=e.value,t),{})};const n=this._getZ(e.frame);return n.max=Math.max(n.max,e.z_order),n.min=Math.min(n.min,e.z_order),t},{}),this.cache={}}toJSON(){const t=this.label.attributes.reduce((t,e)=>(t[e.id]=e,t),{});return{clientID:this.clientID,id:this.serverID,frame:this.frame,label_id:this.label.id,group:this.group,attributes:Object.keys(this.attributes).reduce((e,n)=>(t[n].mutable||e.push({spec_id:n,value:this.attributes[n]}),e),[]),shapes:Object.keys(this.shapes).reduce((e,n)=>(e.push({type:this.shapeType,occluded:this.shapes[n].occluded,z_order:this.shapes[n].zOrder,points:[...this.shapes[n].points],outside:this.shapes[n].outside,attributes:Object.keys(this.shapes[n].attributes).reduce((e,r)=>(t[r].mutable&&e.push({spec_id:r,value:this.shapes[n].attributes[r]}),e),[]),id:this.shapes[n].serverID,frame:+n}),e),[])}}get(t){if(!(t in this.cache)){const e=Object.assign({},this.getPosition(t),{attributes:this.getAttributes(t),group:this.group,objectType:a.TRACK,shapeType:this.shapeType,clientID:this.clientID,serverID:this.serverID,lock:this.lock,color:this.color,visibility:this.visibility});this.cache[t]=e}const e=JSON.parse(JSON.stringify(this.cache[t]));return e.label=this.label,e}neighborsFrames(t){const e=Object.keys(this.shapes).map(t=>+t);let n=Number.MAX_SAFE_INTEGER,r=Number.MAX_SAFE_INTEGER;for(const i of e){const e=Math.abs(t-i);i<=t&&e+t-+e);for(const r of n)if(r<=t){const{attributes:t}=this.shapes[r];for(const n in t)Object.prototype.hasOwnProperty.call(t,n)&&(e[n]=t[n])}return e}save(t,e){if(this.lock&&e.lock)return d.call(this,t,this.get(t));const n=Object.assign(this.get(t));n.attributes=Object.assign(n.attributes),n.points=[...n.points];const i=e.updateFlags;let s=!1;i.label&&(r("label",e.label,null,h),n.label=e.label,n.attributes={},this.appendDefaultAttributes.call(n,n.label));const a=n.label.attributes.reduce((t,e)=>(t[e.id]=e,t),{});if(i.attributes)for(const t of Object.keys(e.attributes)){const r=e.attributes[t];if(!(t in a&&g(r,a[t])))throw new f(`Trying to save unknown attribute with id ${t} and value ${r}`);n.attributes[t]=r}if(i.points){r("points",e.points,null,Array),b(this.shapeType,e.points);const{width:i,height:o}=this.frameMeta[t],a=[];for(let t=0;tt&&delete this.cache[e];return this.cache[t].keyframe=!1,delete this.shapes[t],i.reset(),d.call(this,t,this.get(t))}if(s||i.keyframe&&e.keyframe){for(const e in this.cache)+e>t&&delete this.cache[e];if(this.cache[t].keyframe=!0,e.keyframe=!0,this.shapes[t]={frame:t,zOrder:n.zOrder,points:n.points,outside:n.outside,occluded:n.occluded,attributes:{}},i.attributes)for(const r of Object.keys(n.attributes))a[r].mutable&&(this.shapes[t].attributes[r]=e.attributes[r],this.shapes[t].attributes[r]=e.attributes[r])}return i.reset(),d.call(this,t,this.get(t))}getPosition(t){const{leftFrame:e,rightFrame:n}=this.neighborsFrames(t),r=Number.isInteger(n)?this.shapes[n]:null,i=Number.isInteger(e)?this.shapes[e]:null;if(i&&e===t)return{points:[...i.points],occluded:i.occluded,outside:i.outside,zOrder:i.zOrder,keyframe:!0};if(r&&i)return Object.assign({},this.interpolatePosition(i,r,(t-e)/(n-e)),{keyframe:!1});if(r)return{points:[...r.points],occluded:r.occluded,outside:!0,zOrder:0,keyframe:!1};if(i)return{points:[...i.points],occluded:i.occluded,outside:i.outside,zOrder:0,keyframe:!1};throw new p(`No one neightbour frame found for the track with client ID: "${this.id}"`)}delete(t){return this.lock&&!t||(this.removed=!0,this.resetCache()),!0}resetCache(){this.cache={}}}class x extends w{constructor(t,e,n,r){super(t,e,n,r),this.shapeType=s.RECTANGLE,b(this.shapeType,this.points)}static distance(t,e,n){const[r,i,o,s]=t;return e>=r&&e<=o&&n>=i&&n<=s?Math.min.apply(null,[e-r,n-i,o-e,s-n]):null}}class O extends w{constructor(t,e,n,r){super(t,e,n,r)}}class j extends O{constructor(t,e,n,r){super(t,e,n,r),this.shapeType=s.POLYGON,b(this.shapeType,this.points)}static distance(t,e,n){function r(t,r,i,o){return(i-t)*(n-r)-(e-t)*(o-r)}let i=0;const o=[];for(let s=0,a=t.length-2;sn&&r(c,u,l,f)>0&&i++:f<=n&&r(c,u,l,f)<0&&i--;const p=e-(u-f),h=n-(l-c);(p-c)*(l-p)>=0&&(h-u)*(f-h)>=0?o.push(Math.sqrt(Math.pow(e-p,2)+Math.pow(n-h,2))):o.push(Math.min(Math.sqrt(Math.pow(c-e,2)+Math.pow(u-n,2)),Math.sqrt(Math.pow(l-e,2)+Math.pow(f-n,2))))}return 0!==i?Math.min.apply(null,o):null}}class S extends O{constructor(t,e,n,r){super(t,e,n,r),this.shapeType=s.POLYLINE,b(this.shapeType,this.points)}static distance(t,e,n){const r=[];for(let i=0;i=0&&(n-s)*(c-n)>=0?r.push(Math.abs((c-s)*e-(a-o)*n+a*s-c*o)/Math.sqrt(Math.pow(c-s,2)+Math.pow(a-o,2))):r.push(Math.min(Math.sqrt(Math.pow(o-e,2)+Math.pow(s-n,2)),Math.sqrt(Math.pow(a-e,2)+Math.pow(c-n,2))))}return Math.min.apply(null,r)}}class _ extends O{constructor(t,e,n,r){super(t,e,n,r),this.shapeType=s.POINTS,b(this.shapeType,this.points)}static distance(t,e,n){const r=[];for(let i=0;ir&&(r=t[o]),t[o+1]>i&&(i=t[o+1]);return{xmin:e,ymin:n,xmax:r,ymax:i}}function i(t,e){const n=[],r=e.xmax-e.xmin,i=e.ymax-e.ymin;for(let o=0;on[i][t]-n[i][e]);const i={},o={};let s=0;for(;Object.values(o).length!==t.length;){for(const e of t){if(o[e])continue;const t=r[e][s],a=n[e][t];if(t in i&&i[t].distance>a){const e=i[t].value;delete i[t],delete o[e]}t in i||(i[t]={value:e,distance:a},o[e]=!0)}s++}const a={};for(const t of Object.keys(i))a[i[t].value]={value:t,distance:i[t].distance};return a}(Array.from(t.keys()),Array.from(e.keys()),s),c=(n(e)+n(t))/(e.length+t.length);!function(t,e){for(const n of Object.keys(t))t[n].distance>e&&delete t[n]}(a,c+3*Math.sqrt((r(t,c)+r(e,c))/(t.length+e.length)));for(const t of Object.keys(a))a[t]=a[t].value;const u=this.appendMapping(a,t,e);for(const n of u)i.push(t[n]),o.push(e[a[n]]);return[i,o]}let u=r(t.points),l=r(e.points);(u.xmax-u.xmin<1||l.ymax-l.ymin<1)&&(l=u={xmin:0,xmax:1024,ymin:0,ymax:768});const f=s(i(t.points,u)),p=s(i(e.points,l));let h=[],d=[];if(f.length>p.length){const[t,e]=c.call(this,p,f);h=e,d=t}else{const[t,e]=c.call(this,f,p);h=t,d=e}const b=o(a(h),u),m=o(a(d),l),g=[];for(let t=0;t+t),i=Object.keys(t).map(t=>+t),o=[];function s(t){let e=t,i=t;if(!r.length)throw new p("Interpolation mapping is empty");for(;!r.includes(e);)--e<0&&(e=n.length-1);for(;!r.includes(i);)++i>=n.length&&(i=0);return[e,i]}function a(t,e,r){const i=[];for(;e!==r;)i.push(n[e]),++e>=n.length&&(e=0);i.push(n[r]);let o=0,s=0,a=!1;for(let e=1;e(t.push({spec_id:e,value:this.attributes[e]}),t),[])}}get(t){if(t!==this.frame)throw new p("Got frame is not equal to the frame of the shape");return{objectType:a.TAG,clientID:this.clientID,serverID:this.serverID,lock:this.lock,attributes:Object.assign({},this.attributes),label:this.label,group:this.group}}save(t,e){if(t!==this.frame)throw new p("Got frame is not equal to the frame of the shape");if(this.lock&&e.lock)return d.call(this,t,this.get(t));const n=this.get(t),i=e.updateFlags;if(i.label&&(r("label",e.label,null,h),n.label=e.label,n.attributes={},this.appendDefaultAttributes.call(n,n.label)),i.attributes){const t=n.label.attributes.map(t=>`${t.id}`);for(const r of Object.keys(e.attributes))t.includes(r)&&(n.attributes[r]=e.attributes[r])}i.group&&(r("group",e.group,"integer",null),n.group=e.group),i.lock&&(r("lock",e.lock,"boolean",null),n.lock=e.lock),i.reset();for(const t of Object.keys(n))t in this&&(this[t]=n[t]);return d.call(this,t,this.get(t))}},objectStateFactory:d}})()},function(t,e,n){function r(t,e){var n=Object.keys(t);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(t);e&&(r=r.filter((function(e){return Object.getOwnPropertyDescriptor(t,e).enumerable}))),n.push.apply(n,r)}return n}function i(t){for(var e=1;e{const e=n(26),{Task:r}=n(49),{ScriptingError:o}="./exceptions";t.exports=class{constructor(t,e,n){this.sessionType=n instanceof r?"task":"job",this.id=n.id,this.version=t,this.collection=e,this.initialObjects={},this.hash=this._getHash();const i=this.collection.export();this._resetState();for(const t of i.shapes)this.initialObjects.shapes[t.id]=t;for(const t of i.tracks)this.initialObjects.tracks[t.id]=t;for(const t of i.tags)this.initialObjects.tags[t.id]=t}_resetState(){this.initialObjects={shapes:{},tracks:{},tags:{}}}_getHash(){const t=this.collection.export();return JSON.stringify(t)}async _request(t,n){return await e.annotations.updateAnnotations(this.sessionType,this.id,t,n)}async _put(t){return await this._request(t,"put")}async _create(t){return await this._request(t,"create")}async _update(t){return await this._request(t,"update")}async _delete(t){return await this._request(t,"delete")}_split(t){const e={created:{shapes:[],tracks:[],tags:[]},updated:{shapes:[],tracks:[],tags:[]},deleted:{shapes:[],tracks:[],tags:[]}};for(const n of Object.keys(t))for(const r of t[n])if(r.id in this.initialObjects[n]){JSON.stringify(r)!==JSON.stringify(this.initialObjects[n][r.id])&&e.updated[n].push(r)}else{if(void 0!==r.id)throw new o(`Id of object is defined "${r.id}"`+"but it absents in initial state");e.created[n].push(r)}const n={shapes:t.shapes.map(t=>+t.id),tracks:t.tracks.map(t=>+t.id),tags:t.tags.map(t=>+t.id)};for(const t of Object.keys(this.initialObjects))for(const r of Object.keys(this.initialObjects[t]))if(!n[t].includes(+r)){const n=this.initialObjects[t][r];e.deleted[t].push(n)}return e}_updateCreatedObjects(t,e){const n=t.tracks.length+t.shapes.length+t.tags.length,r=e.tracks.length+e.shapes.length+e.tags.length;if(r!==n)throw new o("Number of indexes is differed by number of saved objects"+`${r} vs ${n}`);for(const n of Object.keys(e))for(let r=0;rt.clientID),shapes:t.shapes.map(t=>t.clientID),tags:t.tags.map(t=>t.clientID)};return t.tracks.concat(t.shapes).concat(t.tags).map(t=>(delete t.clientID,t)),e}async save(t){"function"!=typeof t&&(t=t=>{console.log(t)});try{const e=this.collection.export(),{flush:n}=this.collection;if(n){t("New objects are being saved..");const n=this._receiveIndexes(e),r=await this._put(i({},e,{version:this.version}));this.version=r.version,this.collection.flush=!1,t("Saved objects are being updated in the client"),this._updateCreatedObjects(r,n),t("Initial state is being updated"),this._resetState();for(const t of Object.keys(this.initialObjects))for(const e of r[t])this.initialObjects[t][e.id]=e}else{const{created:n,updated:r,deleted:o}=this._split(e);t("New objects are being saved..");const s=this._receiveIndexes(n),a=await this._create(i({},n,{version:this.version}));this.version=a.version,t("Saved objects are being updated in the client"),this._updateCreatedObjects(a,s),t("Initial state is being updated");for(const t of Object.keys(this.initialObjects))for(const e of a[t])this.initialObjects[t][e.id]=e;t("Changed objects are being saved.."),this._receiveIndexes(r);const c=await this._update(i({},r,{version:this.version}));this.version=c.version,t("Initial state is being updated");for(const t of Object.keys(this.initialObjects))for(const e of c[t])this.initialObjects[t][e.id]=e;t("Changed objects are being saved.."),this._receiveIndexes(o);const u=await this._delete(i({},o,{version:this.version}));this._version=u.version,t("Initial state is being updated");for(const t of Object.keys(this.initialObjects))for(const e of u[t])delete this.initialObjects[t][e.id]}this.hash=this._getHash(),t("Saving is done")}catch(e){throw t(`Can not save annotations: ${e.message}`),e}}hasUnsavedChanges(){return this._getHash()!==this.hash}}})()},function(t){t.exports=JSON.parse('{"name":"cvat-core.js","version":"0.1.0","description":"Part of Computer Vision Tool which presents an interface for client-side integration","main":"babel.config.js","scripts":{"build":"webpack","test":"jest --config=jest.config.js --coverage","docs":"jsdoc --readme README.md src/*.js -p -c jsdoc.config.js -d docs","coveralls":"cat ./reports/coverage/lcov.info | coveralls"},"author":"Intel","license":"MIT","devDependencies":{"@babel/cli":"^7.4.4","@babel/core":"^7.4.4","@babel/preset-env":"^7.4.4","airbnb":"0.0.2","babel-eslint":"^10.0.1","babel-loader":"^8.0.6","core-js":"^3.0.1","coveralls":"^3.0.5","eslint":"6.1.0","eslint-config-airbnb-base":"14.0.0","eslint-plugin-import":"2.18.2","eslint-plugin-no-unsafe-innerhtml":"^1.0.16","eslint-plugin-no-unsanitized":"^3.0.2","eslint-plugin-security":"^1.4.0","jest":"^24.8.0","jest-junit":"^6.4.0","jsdoc":"^3.6.2","webpack":"^4.31.0","webpack-cli":"^3.3.2"},"dependencies":{"axios":"^0.18.0","browser-or-node":"^1.2.1","error-stack-parser":"^2.0.2","form-data":"^2.5.0","jest-config":"^24.8.0","js-cookie":"^2.2.0","platform":"^1.3.5","store":"^2.0.12"}}')},function(t,e,n){n(5),n(11),n(10),n(254),(()=>{const e=n(36),r=n(26),{isBoolean:i,isInteger:o,isEnum:s,isString:a,checkFilter:c}=n(56),{TaskStatus:u,TaskMode:l}=n(29),f=n(69),{AnnotationFormat:p}=n(138),{ArgumentError:h}=n(6),{Task:d}=n(49);function b(t,e){null!==t.assignee&&([t.assignee]=e.filter(e=>e.id===t.assignee));for(const n of t.segments)for(const t of n.jobs)null!==t.assignee&&([t.assignee]=e.filter(e=>e.id===t.assignee));return null!==t.owner&&([t.owner]=e.filter(e=>e.id===t.owner)),t}t.exports=function(t){return t.plugins.list.implementation=e.list,t.plugins.register.implementation=e.register.bind(t),t.server.about.implementation=async()=>{return await r.server.about()},t.server.share.implementation=async t=>{return await r.server.share(t)},t.server.formats.implementation=async()=>{return(await r.server.formats()).map(t=>new p(t))},t.server.datasetFormats.implementation=async()=>{return await r.server.datasetFormats()},t.server.register.implementation=async(t,e,n,i,o,s)=>{await r.server.register(t,e,n,i,o,s)},t.server.login.implementation=async(t,e)=>{await r.server.login(t,e)},t.server.logout.implementation=async()=>{await r.server.logout()},t.server.authorized.implementation=async()=>{return await r.server.authorized()},t.server.request.implementation=async(t,e)=>{return await r.server.request(t,e)},t.users.get.implementation=async t=>{c(t,{self:i});let e=null;return e=(e="self"in t&&t.self?[e=await r.users.getSelf()]:await r.users.getUsers()).map(t=>new f(t))},t.jobs.get.implementation=async t=>{if(c(t,{taskID:o,jobID:o}),"taskID"in t&&"jobID"in t)throw new h('Only one of fields "taskID" and "jobID" allowed simultaneously');if(!Object.keys(t).length)throw new h("Job filter must not be empty");let e=null;if("taskID"in t)e=await r.tasks.getTasks(`id=${t.taskID}`);else{const n=await r.jobs.getJob(t.jobID);void 0!==n.task_id&&(e=await r.tasks.getTasks(`id=${n.task_id}`))}if(null!==e&&e.length){const n=(await r.users.getUsers()).map(t=>new f(t)),i=new d(b(e[0],n));return t.jobID?i.jobs.filter(e=>e.id===t.jobID):i.jobs}return[]},t.tasks.get.implementation=async t=>{if(c(t,{page:o,name:a,id:o,owner:a,assignee:a,search:a,status:s.bind(u),mode:s.bind(l)}),"search"in t&&Object.keys(t).length>1&&!("page"in t&&2===Object.keys(t).length))throw new h('Do not use the filter field "search" with others');if("id"in t&&Object.keys(t).length>1&&!("page"in t&&2===Object.keys(t).length))throw new h('Do not use the filter field "id" with others');const e=new URLSearchParams;for(const n of["name","owner","assignee","search","status","mode","id","page"])Object.prototype.hasOwnProperty.call(t,n)&&e.set(n,t[n]);const n=(await r.users.getUsers()).map(t=>new f(t)),i=await r.tasks.getTasks(e.toString()),p=i.map(t=>b(t,n)).map(t=>new d(t));return p.count=i.count,p},t}})()},function(t,e,n){"use strict";n(255);var r,i=n(12),o=n(13),s=n(139),a=n(0),c=n(104),u=n(18),l=n(64),f=n(9),p=n(256),h=n(257),d=n(67).codeAt,b=n(259),m=n(33),g=n(260),v=n(25),y=a.URL,w=g.URLSearchParams,k=g.getState,x=v.set,O=v.getterFor("URL"),j=Math.floor,S=Math.pow,_=/[A-Za-z]/,A=/[\d+\-.A-Za-z]/,T=/\d/,P=/^(0x|0X)/,E=/^[0-7]+$/,C=/^\d+$/,I=/^[\dA-Fa-f]+$/,F=/[\u0000\u0009\u000A\u000D #%/:?@[\\]]/,M=/[\u0000\u0009\u000A\u000D #/:?@[\\]]/,N=/^[\u0000-\u001F ]+|[\u0000-\u001F ]+$/g,R=/[\u0009\u000A\u000D]/g,D=function(t,e){var n,r,i;if("["==e.charAt(0)){if("]"!=e.charAt(e.length-1))return"Invalid host";if(!(n=B(e.slice(1,-1))))return"Invalid host";t.host=n}else if(V(t)){if(e=b(e),F.test(e))return"Invalid host";if(null===(n=$(e)))return"Invalid host";t.host=n}else{if(M.test(e))return"Invalid host";for(n="",r=h(e),i=0;i4)return t;for(n=[],r=0;r1&&"0"==i.charAt(0)&&(o=P.test(i)?16:8,i=i.slice(8==o?1:2)),""===i)s=0;else{if(!(10==o?C:8==o?E:I).test(i))return t;s=parseInt(i,o)}n.push(s)}for(r=0;r=S(256,5-e))return null}else if(s>255)return null;for(a=n.pop(),r=0;r6)return;for(r=0;p();){if(i=null,r>0){if(!("."==p()&&r<4))return;f++}if(!T.test(p()))return;for(;T.test(p());){if(o=parseInt(p(),10),null===i)i=o;else{if(0==i)return;i=10*i+o}if(i>255)return;f++}c[u]=256*c[u]+i,2!=++r&&4!=r||u++}if(4!=r)return;break}if(":"==p()){if(f++,!p())return}else if(p())return;c[u++]=e}else{if(null!==l)return;f++,l=++u}}if(null!==l)for(s=u-l,u=7;0!=u&&s>0;)a=c[u],c[u--]=c[l+s-1],c[l+--s]=a;else if(8!=u)return;return c},U=function(t){var e,n,r,i;if("number"==typeof t){for(e=[],n=0;n<4;n++)e.unshift(t%256),t=j(t/256);return e.join(".")}if("object"==typeof t){for(e="",r=function(t){for(var e=null,n=1,r=null,i=0,o=0;o<8;o++)0!==t[o]?(i>n&&(e=r,n=i),r=null,i=0):(null===r&&(r=o),++i);return i>n&&(e=r,n=i),e}(t),n=0;n<8;n++)i&&0===t[n]||(i&&(i=!1),r===n?(e+=n?":":"::",i=!0):(e+=t[n].toString(16),n<7&&(e+=":")));return"["+e+"]"}return t},L={},z=p({},L,{" ":1,'"':1,"<":1,">":1,"`":1}),q=p({},z,{"#":1,"?":1,"{":1,"}":1}),W=p({},q,{"/":1,":":1,";":1,"=":1,"@":1,"[":1,"\\":1,"]":1,"^":1,"|":1}),G=function(t,e){var n=d(t,0);return n>32&&n<127&&!f(e,t)?t:encodeURIComponent(t)},J={ftp:21,file:null,http:80,https:443,ws:80,wss:443},V=function(t){return f(J,t.scheme)},H=function(t){return""!=t.username||""!=t.password},X=function(t){return!t.host||t.cannotBeABaseURL||"file"==t.scheme},K=function(t,e){var n;return 2==t.length&&_.test(t.charAt(0))&&(":"==(n=t.charAt(1))||!e&&"|"==n)},Z=function(t){var e;return t.length>1&&K(t.slice(0,2))&&(2==t.length||"/"===(e=t.charAt(2))||"\\"===e||"?"===e||"#"===e)},Y=function(t){var e=t.path,n=e.length;!n||"file"==t.scheme&&1==n&&K(e[0],!0)||e.pop()},Q=function(t){return"."===t||"%2e"===t.toLowerCase()},tt={},et={},nt={},rt={},it={},ot={},st={},at={},ct={},ut={},lt={},ft={},pt={},ht={},dt={},bt={},mt={},gt={},vt={},yt={},wt={},kt=function(t,e,n,i){var o,s,a,c,u,l=n||tt,p=0,d="",b=!1,m=!1,g=!1;for(n||(t.scheme="",t.username="",t.password="",t.host=null,t.port=null,t.path=[],t.query=null,t.fragment=null,t.cannotBeABaseURL=!1,e=e.replace(N,"")),e=e.replace(R,""),o=h(e);p<=o.length;){switch(s=o[p],l){case tt:if(!s||!_.test(s)){if(n)return"Invalid scheme";l=nt;continue}d+=s.toLowerCase(),l=et;break;case et:if(s&&(A.test(s)||"+"==s||"-"==s||"."==s))d+=s.toLowerCase();else{if(":"!=s){if(n)return"Invalid scheme";d="",l=nt,p=0;continue}if(n&&(V(t)!=f(J,d)||"file"==d&&(H(t)||null!==t.port)||"file"==t.scheme&&!t.host))return;if(t.scheme=d,n)return void(V(t)&&J[t.scheme]==t.port&&(t.port=null));d="","file"==t.scheme?l=ht:V(t)&&i&&i.scheme==t.scheme?l=rt:V(t)?l=at:"/"==o[p+1]?(l=it,p++):(t.cannotBeABaseURL=!0,t.path.push(""),l=vt)}break;case nt:if(!i||i.cannotBeABaseURL&&"#"!=s)return"Invalid scheme";if(i.cannotBeABaseURL&&"#"==s){t.scheme=i.scheme,t.path=i.path.slice(),t.query=i.query,t.fragment="",t.cannotBeABaseURL=!0,l=wt;break}l="file"==i.scheme?ht:ot;continue;case rt:if("/"!=s||"/"!=o[p+1]){l=ot;continue}l=ct,p++;break;case it:if("/"==s){l=ut;break}l=gt;continue;case ot:if(t.scheme=i.scheme,s==r)t.username=i.username,t.password=i.password,t.host=i.host,t.port=i.port,t.path=i.path.slice(),t.query=i.query;else if("/"==s||"\\"==s&&V(t))l=st;else if("?"==s)t.username=i.username,t.password=i.password,t.host=i.host,t.port=i.port,t.path=i.path.slice(),t.query="",l=yt;else{if("#"!=s){t.username=i.username,t.password=i.password,t.host=i.host,t.port=i.port,t.path=i.path.slice(),t.path.pop(),l=gt;continue}t.username=i.username,t.password=i.password,t.host=i.host,t.port=i.port,t.path=i.path.slice(),t.query=i.query,t.fragment="",l=wt}break;case st:if(!V(t)||"/"!=s&&"\\"!=s){if("/"!=s){t.username=i.username,t.password=i.password,t.host=i.host,t.port=i.port,l=gt;continue}l=ut}else l=ct;break;case at:if(l=ct,"/"!=s||"/"!=d.charAt(p+1))continue;p++;break;case ct:if("/"!=s&&"\\"!=s){l=ut;continue}break;case ut:if("@"==s){b&&(d="%40"+d),b=!0,a=h(d);for(var v=0;v65535)return"Invalid port";t.port=V(t)&&k===J[t.scheme]?null:k,d=""}if(n)return;l=mt;continue}return"Invalid port"}d+=s;break;case ht:if(t.scheme="file","/"==s||"\\"==s)l=dt;else{if(!i||"file"!=i.scheme){l=gt;continue}if(s==r)t.host=i.host,t.path=i.path.slice(),t.query=i.query;else if("?"==s)t.host=i.host,t.path=i.path.slice(),t.query="",l=yt;else{if("#"!=s){Z(o.slice(p).join(""))||(t.host=i.host,t.path=i.path.slice(),Y(t)),l=gt;continue}t.host=i.host,t.path=i.path.slice(),t.query=i.query,t.fragment="",l=wt}}break;case dt:if("/"==s||"\\"==s){l=bt;break}i&&"file"==i.scheme&&!Z(o.slice(p).join(""))&&(K(i.path[0],!0)?t.path.push(i.path[0]):t.host=i.host),l=gt;continue;case bt:if(s==r||"/"==s||"\\"==s||"?"==s||"#"==s){if(!n&&K(d))l=gt;else if(""==d){if(t.host="",n)return;l=mt}else{if(c=D(t,d))return c;if("localhost"==t.host&&(t.host=""),n)return;d="",l=mt}continue}d+=s;break;case mt:if(V(t)){if(l=gt,"/"!=s&&"\\"!=s)continue}else if(n||"?"!=s)if(n||"#"!=s){if(s!=r&&(l=gt,"/"!=s))continue}else t.fragment="",l=wt;else t.query="",l=yt;break;case gt:if(s==r||"/"==s||"\\"==s&&V(t)||!n&&("?"==s||"#"==s)){if(".."===(u=(u=d).toLowerCase())||"%2e."===u||".%2e"===u||"%2e%2e"===u?(Y(t),"/"==s||"\\"==s&&V(t)||t.path.push("")):Q(d)?"/"==s||"\\"==s&&V(t)||t.path.push(""):("file"==t.scheme&&!t.path.length&&K(d)&&(t.host&&(t.host=""),d=d.charAt(0)+":"),t.path.push(d)),d="","file"==t.scheme&&(s==r||"?"==s||"#"==s))for(;t.path.length>1&&""===t.path[0];)t.path.shift();"?"==s?(t.query="",l=yt):"#"==s&&(t.fragment="",l=wt)}else d+=G(s,q);break;case vt:"?"==s?(t.query="",l=yt):"#"==s?(t.fragment="",l=wt):s!=r&&(t.path[0]+=G(s,L));break;case yt:n||"#"!=s?s!=r&&("'"==s&&V(t)?t.query+="%27":t.query+="#"==s?"%23":G(s,L)):(t.fragment="",l=wt);break;case wt:s!=r&&(t.fragment+=G(s,z))}p++}},xt=function(t){var e,n,r=l(this,xt,"URL"),i=arguments.length>1?arguments[1]:void 0,s=String(t),a=x(r,{type:"URL"});if(void 0!==i)if(i instanceof xt)e=O(i);else if(n=kt(e={},String(i)))throw TypeError(n);if(n=kt(a,s,null,e))throw TypeError(n);var c=a.searchParams=new w,u=k(c);u.updateSearchParams(a.query),u.updateURL=function(){a.query=String(c)||null},o||(r.href=jt.call(r),r.origin=St.call(r),r.protocol=_t.call(r),r.username=At.call(r),r.password=Tt.call(r),r.host=Pt.call(r),r.hostname=Et.call(r),r.port=Ct.call(r),r.pathname=It.call(r),r.search=Ft.call(r),r.searchParams=Mt.call(r),r.hash=Nt.call(r))},Ot=xt.prototype,jt=function(){var t=O(this),e=t.scheme,n=t.username,r=t.password,i=t.host,o=t.port,s=t.path,a=t.query,c=t.fragment,u=e+":";return null!==i?(u+="//",H(t)&&(u+=n+(r?":"+r:"")+"@"),u+=U(i),null!==o&&(u+=":"+o)):"file"==e&&(u+="//"),u+=t.cannotBeABaseURL?s[0]:s.length?"/"+s.join("/"):"",null!==a&&(u+="?"+a),null!==c&&(u+="#"+c),u},St=function(){var t=O(this),e=t.scheme,n=t.port;if("blob"==e)try{return new URL(e.path[0]).origin}catch(t){return"null"}return"file"!=e&&V(t)?e+"://"+U(t.host)+(null!==n?":"+n:""):"null"},_t=function(){return O(this).scheme+":"},At=function(){return O(this).username},Tt=function(){return O(this).password},Pt=function(){var t=O(this),e=t.host,n=t.port;return null===e?"":null===n?U(e):U(e)+":"+n},Et=function(){var t=O(this).host;return null===t?"":U(t)},Ct=function(){var t=O(this).port;return null===t?"":String(t)},It=function(){var t=O(this),e=t.path;return t.cannotBeABaseURL?e[0]:e.length?"/"+e.join("/"):""},Ft=function(){var t=O(this).query;return t?"?"+t:""},Mt=function(){return O(this).searchParams},Nt=function(){var t=O(this).fragment;return t?"#"+t:""},Rt=function(t,e){return{get:t,set:e,configurable:!0,enumerable:!0}};if(o&&c(Ot,{href:Rt(jt,(function(t){var e=O(this),n=String(t),r=kt(e,n);if(r)throw TypeError(r);k(e.searchParams).updateSearchParams(e.query)})),origin:Rt(St),protocol:Rt(_t,(function(t){var e=O(this);kt(e,String(t)+":",tt)})),username:Rt(At,(function(t){var e=O(this),n=h(String(t));if(!X(e)){e.username="";for(var r=0;r=n.length?{value:void 0,done:!0}:(t=r(n,i),e.index+=t.length,{value:t,done:!1})}))},function(t,e,n){"use strict";var r=n(13),i=n(3),o=n(105),s=n(92),a=n(84),c=n(37),u=n(85),l=Object.assign;t.exports=!l||i((function(){var t={},e={},n=Symbol();return t[n]=7,"abcdefghijklmnopqrst".split("").forEach((function(t){e[t]=t})),7!=l({},t)[n]||"abcdefghijklmnopqrst"!=o(l({},e)).join("")}))?function(t,e){for(var n=c(t),i=arguments.length,l=1,f=s.f,p=a.f;i>l;)for(var h,d=u(arguments[l++]),b=f?o(d).concat(f(d)):o(d),m=b.length,g=0;m>g;)h=b[g++],r&&!p.call(d,h)||(n[h]=d[h]);return n}:l},function(t,e,n){"use strict";var r=n(47),i=n(37),o=n(97),s=n(96),a=n(45),c=n(258),u=n(48);t.exports=function(t){var e,n,l,f,p,h=i(t),d="function"==typeof this?this:Array,b=arguments.length,m=b>1?arguments[1]:void 0,g=void 0!==m,v=0,y=u(h);if(g&&(m=r(m,b>2?arguments[2]:void 0,2)),null==y||d==Array&&s(y))for(n=new d(e=a(h.length));e>v;v++)c(n,v,g?m(h[v],v):h[v]);else for(p=(f=y.call(h)).next,n=new d;!(l=p.call(f)).done;v++)c(n,v,g?o(f,m,[l.value,v],!0):l.value);return n.length=v,n}},function(t,e,n){"use strict";var r=n(58),i=n(21),o=n(42);t.exports=function(t,e,n){var s=r(e);s in t?i.f(t,s,o(0,n)):t[s]=n}},function(t,e,n){"use strict";var r=/[^\0-\u007E]/,i=/[.\u3002\uFF0E\uFF61]/g,o="Overflow: input needs wider integers to process",s=Math.floor,a=String.fromCharCode,c=function(t){return t+22+75*(t<26)},u=function(t,e,n){var r=0;for(t=n?s(t/700):t>>1,t+=s(t/e);t>455;r+=36)t=s(t/35);return s(r+36*t/(t+38))},l=function(t){var e,n,r=[],i=(t=function(t){for(var e=[],n=0,r=t.length;n=55296&&i<=56319&&n=l&&ns((2147483647-f)/m))throw RangeError(o);for(f+=(b-l)*m,l=b,e=0;e2147483647)throw RangeError(o);if(n==l){for(var g=f,v=36;;v+=36){var y=v<=p?1:v>=p+26?26:v-p;if(g0?arguments[0]:void 0,p=this,g=[];if(v(p,{type:"URLSearchParams",entries:g,updateURL:function(){},updateSearchParams:C}),void 0!==u)if(d(u))if("function"==typeof(t=m(u)))for(n=(e=t.call(u)).next;!(r=n.call(e)).done;){if((s=(o=(i=b(h(r.value))).next).call(i)).done||(a=o.call(i)).done||!o.call(i).done)throw TypeError("Expected sequence with length 2");g.push({key:s.value+"",value:a.value+""})}else for(c in u)f(u,c)&&g.push({key:c,value:u[c]+""});else E(g,"string"==typeof u?"?"===u.charAt(0)?u.slice(1):u:u+"")},N=M.prototype;s(N,{append:function(t,e){I(arguments.length,2);var n=y(this);n.entries.push({key:t+"",value:e+""}),n.updateURL()},delete:function(t){I(arguments.length,1);for(var e=y(this),n=e.entries,r=t+"",i=0;it.key){i.splice(e,0,t);break}e===n&&i.push(t)}r.updateURL()},forEach:function(t){for(var e,n=y(this).entries,r=p(t,arguments.length>1?arguments[1]:void 0,3),i=0;i=0)return;s[e]="set-cookie"===e?(s[e]?s[e]:[]).concat([n]):s[e]?s[e]+", "+n:n}})),s):s}},function(t,e,n){"use strict";var r=n(7);t.exports=r.isStandardBrowserEnv()?function(){var t,e=/(msie|trident)/i.test(navigator.userAgent),n=document.createElement("a");function i(t){var r=t;return e&&(n.setAttribute("href",r),r=n.href),n.setAttribute("href",r),{href:n.href,protocol:n.protocol?n.protocol.replace(/:$/,""):"",host:n.host,search:n.search?n.search.replace(/^\?/,""):"",hash:n.hash?n.hash.replace(/^#/,""):"",hostname:n.hostname,port:n.port,pathname:"/"===n.pathname.charAt(0)?n.pathname:"/"+n.pathname}}return t=i(window.location.href),function(e){var n=r.isString(e)?i(e):e;return n.protocol===t.protocol&&n.host===t.host}}():function(){return!0}},function(t,e,n){"use strict";var r=n(7);t.exports=r.isStandardBrowserEnv()?{write:function(t,e,n,i,o,s){var a=[];a.push(t+"="+encodeURIComponent(e)),r.isNumber(n)&&a.push("expires="+new Date(n).toGMTString()),r.isString(i)&&a.push("path="+i),r.isString(o)&&a.push("domain="+o),!0===s&&a.push("secure"),document.cookie=a.join("; ")},read:function(t){var e=document.cookie.match(new RegExp("(^|;\\s*)("+t+")=([^;]*)"));return e?decodeURIComponent(e[3]):null},remove:function(t){this.write(t,"",Date.now()-864e5)}}:{write:function(){},read:function(){return null},remove:function(){}}},function(t,e,n){"use strict";var r=n(7);function i(){this.handlers=[]}i.prototype.use=function(t,e){return this.handlers.push({fulfilled:t,rejected:e}),this.handlers.length-1},i.prototype.eject=function(t){this.handlers[t]&&(this.handlers[t]=null)},i.prototype.forEach=function(t){r.forEach(this.handlers,(function(e){null!==e&&t(e)}))},t.exports=i},function(t,e,n){"use strict";var r=n(7),i=n(195),o=n(115),s=n(68),a=n(196),c=n(197);function u(t){t.cancelToken&&t.cancelToken.throwIfRequested()}t.exports=function(t){return u(t),t.baseURL&&!a(t.url)&&(t.url=c(t.baseURL,t.url)),t.headers=t.headers||{},t.data=i(t.data,t.headers,t.transformRequest),t.headers=r.merge(t.headers.common||{},t.headers[t.method]||{},t.headers||{}),r.forEach(["delete","get","head","post","put","patch","common"],(function(e){delete t.headers[e]})),(t.adapter||s.adapter)(t).then((function(e){return u(t),e.data=i(e.data,e.headers,t.transformResponse),e}),(function(e){return o(e)||(u(t),e&&e.response&&(e.response.data=i(e.response.data,e.response.headers,t.transformResponse))),Promise.reject(e)}))}},function(t,e,n){"use strict";var r=n(7);t.exports=function(t,e,n){return r.forEach(n,(function(n){t=n(t,e)})),t}},function(t,e,n){"use strict";t.exports=function(t){return/^([a-z][a-z\d\+\-\.]*:)?\/\//i.test(t)}},function(t,e,n){"use strict";t.exports=function(t,e){return e?t.replace(/\/+$/,"")+"/"+e.replace(/^\/+/,""):t}},function(t,e,n){"use strict";var r=n(116);function i(t){if("function"!=typeof t)throw new TypeError("executor must be a function.");var e;this.promise=new Promise((function(t){e=t}));var n=this;t((function(t){n.reason||(n.reason=new r(t),e(n.reason))}))}i.prototype.throwIfRequested=function(){if(this.reason)throw this.reason},i.source=function(){var t;return{token:new i((function(e){t=e})),cancel:t}},t.exports=i},function(t,e,n){"use strict";t.exports=function(t){return function(e){return t.apply(null,e)}}},function(t,e,n){"use strict";var r=n(12),i=n(201).trim;r({target:"String",proto:!0,forced:n(202)("trim")},{trim:function(){return i(this)}})},function(t,e,n){var r=n(31),i="["+n(118)+"]",o=RegExp("^"+i+i+"*"),s=RegExp(i+i+"*$"),a=function(t){return function(e){var n=String(r(e));return 1&t&&(n=n.replace(o,"")),2&t&&(n=n.replace(s,"")),n}};t.exports={start:a(1),end:a(2),trim:a(3)}},function(t,e,n){var r=n(3),i=n(118);t.exports=function(t){return r((function(){return!!i[t]()||"​…᠎"!="​…᠎"[t]()||i[t].name!==t}))}},function(t,e,n){(function(e){n(5),n(11),n(204),n(10),(()=>{const r=n(205),i=n(36),o=n(26),{isBrowser:s,isNode:a}=n(246),{Exception:c,ArgumentError:u}=n(6),l={};class f{constructor(t,e,n,r,i,o){Object.defineProperties(this,Object.freeze({width:{value:t,writable:!1},height:{value:e,writable:!1},tid:{value:n,writable:!1},number:{value:r,writable:!1},startFrame:{value:i,writable:!1},stopFrame:{value:o,writable:!1}}))}async data(t=(()=>{})){return await i.apiWrapper.call(this,f.prototype.data,t)}}f.prototype.data.implementation=async function(t){return new Promise(async(e,n)=>{const r=t=>{if(l[this.tid].activeChunkRequest&&b===l[this.tid].activeChunkRequest.chunkNumber){const e=l[this.tid].activeChunkRequest.callbacks;for(const n of e)n.resolve(f.frame(t));l[this.tid].activeChunkRequest=void 0}},i=()=>{if(l[this.tid].activeChunkRequest&&b===l[this.tid].activeChunkRequest.chunkNumber){for(const t of l[this.tid].activeChunkRequest.callbacks)t.reject(t.frameNumber);l[this.tid].activeChunkRequest=void 0}},u=()=>{const t=l[this.tid].activeChunkRequest;t.request=o.frames.getData(this.tid,t.chunkNumber).then(t=>{l[this.tid].activeChunkRequest.completed=!0,f.requestDecodeBlock(t,l[this.tid].activeChunkRequest.start,l[this.tid].activeChunkRequest.stop,l[this.tid].activeChunkRequest.onDecodeAll,l[this.tid].activeChunkRequest.rejectRequestAll)}).catch(t=>{n(t instanceof c?t:new c(t.message))}).finally(()=>{if(l[this.tid].nextChunkRequest){if(l[this.tid].activeChunkRequest)for(const t of l[this.tid].activeChunkRequest.callbacks)t.reject(t.frameNumber);l[this.tid].activeChunkRequest=l[this.tid].nextChunkRequest,l[this.tid].nextChunkRequest=void 0,u()}})},{provider:f}=l[this.tid],{chunkSize:p}=l[this.tid],h=Math.max(this.startFrame,parseInt(this.number/p,10)*p),d=Math.min(this.stopFrame,(parseInt(this.number/p,10)+1)*p-1),b=Math.floor(this.number/p);if(a)e("Dummy data");else if(s)try{const{decodedBlocksCacheSize:o}=l[this.tid];let s=await f.frame(this.number);if(null===s)if(t(),f.is_chunk_cached(h,d))l[this.tid].activeChunkRequest.callbacks.push({resolve:e,reject:n,frameNumber:this.number}),f.requestDecodeBlock(null,h,d,r,i);else if(!l[this.tid].activeChunkRequest||l[this.tid].activeChunkRequest&&l[this.tid].activeChunkRequest.completed)l[this.tid].activeChunkRequest&&l[this.tid].activeChunkRequest.rejectRequestAll(),l[this.tid].activeChunkRequest={request:void 0,chunkNumber:b,start:h,stop:d,onDecodeAll:r,rejectRequestAll:i,completed:!1,callbacks:[{resolve:e,reject:n,frameNumber:this.number}]},u();else if(l[this.tid].activeChunkRequest.chunkNumber===b)l[this.tid].activeChunkRequest.callbacks.push({resolve:e,reject:n,frameNumber:this.number});else{if(l[this.tid].nextChunkRequest)for(const t of l[this.tid].nextChunkRequest.callbacks)t.reject(t.frameNumber);l[this.tid].nextChunkRequest={request:void 0,chunkNumber:b,start:h,stop:d,onDecodeAll:r,rejectRequestAll:i,completed:!1,callbacks:[{resolve:e,reject:n,frameNumber:this.number}]}}else e(s)}catch(t){n(t instanceof c?t:new c(t.message))}})},t.exports={FrameData:f,getFrame:async function(t,e,n,i,s,a,c){if(!(t in l)){const i="video"===n?r.BlockType.MP4VIDEO:r.BlockType.ARCHIVE,a=await o.frames.getMeta(t),c=i===r.BlockType.MP4VIDEO?Math.floor(258.90765432098766/e)||1:Math.floor(500/e)||1;l[t]={meta:a,chunkSize:e,provider:new r.FrameProvider(i,e,9,c,1),lastFrameRequest:s,decodedBlocksCacheSize:c,activeChunkRequest:void 0,nextChunkRequest:void 0}}const p=(t=>{let e=null;if("interpolation"===i)[e]=t;else{if("annotation"!==i)throw new u(`Invalid mode is specified ${i}`);if(s>=t.length)throw new u(`Meta information about frame ${s} can't be received from the server`);e=t[s]}return e})(l[t].meta);return l[t].lastFrameRequest=s,l[t].provider.setRenderSize(p.width,p.height),new f(p.width,p.height,t,s,a,c)},getRanges:function(t){return t in l?l[t].provider.cachedFrames:[]},getPreview:async function(t){return new Promise(async(n,r)=>{try{const r=await o.frames.getPreview(t);if(a)n(e.Buffer.from(r,"binary").toString("base64"));else if(s){const t=new FileReader;t.onload=()=>{n(t.result)},t.readAsDataURL(r)}}catch(t){r(t)}})}}})()}).call(this,n(30))},function(t,e,n){"use strict";var r=n(12),i=n(24),o=n(94),s=n(32),a=n(98),c=n(101),u=n(18);r({target:"Promise",proto:!0,real:!0},{finally:function(t){var e=a(this,s("Promise")),n="function"==typeof t;return this.then(n?function(n){return c(e,t()).then((function(){return n}))}:t,n?function(n){return c(e,t()).then((function(){throw n}))}:t)}}),i||"function"!=typeof o||o.prototype.finally||u(o.prototype,"finally",s("Promise").prototype.finally)},function(t,e,n){n(72),n(225),n(227),n(243);const{MP4Reader:r,Bytestream:i}=n(245),o=Object.freeze({MP4VIDEO:"mp4video",ARCHIVE:"archive"});class s{constructor(){this._lock=Promise.resolve()}_acquire(){var t;return this._lock=new Promise(e=>{t=e}),t}acquireQueued(){const t=this._lock.then(()=>e),e=this._acquire();return t}}t.exports={FrameProvider:class{constructor(t,e,n,r=5,i=2){this._frames={},this._cachedBlockCount=Math.max(1,n),this._decodedBlocksCacheSize=r,this._blocks_ranges=[],this._blocks={},this._blockSize=e,this._running=!1,this._blockType=t,this._currFrame=-1,this._requestedBlockDecode=null,this._width=null,this._height=null,this._decodingBlocks={},this._decodeThreadCount=0,this._timerId=setTimeout(this._worker.bind(this),100),this._mutex=new s,this._promisedFrames={},this._maxWorkerThreadCount=i}async _worker(){null!=this._requestedBlockDecode&&this._decodeThreadCountthis._cachedBlockCount){const t=this._blocks_ranges.shift(),[e,n]=t.split(":").map(t=>+t);delete this._blocks[e/this._blockSize];for(let t=e;t<=n;t++)delete this._frames[t]}const t=Math.floor(this._decodedBlocksCacheSize/2);for(let e=0;e+t);if(rthis._currFrame+t*this._blockSize)for(let t=n;t<=r;t++)delete this._frames[t]}}async requestDecodeBlock(t,e,n,r,i){const o=await this._mutex.acquireQueued();null!==this._requestedBlockDecode&&(e===this._requestedBlockDecode.start&&n===this._requestedBlockDecode.end?(this._requestedBlockDecode.resolveCallback=r,this._requestedBlockDecode.rejectCallback=i):this._requestedBlockDecode.rejectCallback&&this._requestedBlockDecode.rejectCallback()),`${e}:${n}`in this._decodingBlocks?(this._decodingBlocks[`${e}:${n}`].rejectCallback=i,this._decodingBlocks[`${e}:${n}`].resolveCallback=r):(null===t&&(t=this._blocks[Math.floor((e+1)/this.blockSize)]),this._requestedBlockDecode={block:t,start:e,end:n,resolveCallback:r,rejectCallback:i}),o()}isRequestExist(){return null!=this._requestedBlockDecode}setRenderSize(t,e){this._width=t,this._height=e}async frame(t){return this._currFrame=t,new Promise((e,n)=>{t in this._frames?null!==this._frames[t]?e(this._frames[t]):this._promisedFrames[t]={resolve:e,reject:n}:e(null)})}isNextChunkExists(t){const e=Math.floor(t/this._blockSize)+1;return"loading"===this._blocks[e]||e in this._blocks}setReadyToLoading(t){this._blocks[t]="loading"}cropImage(t,e,n,r,i,o,s){if(0===r&&o===e&&0===i&&s===n)return new ImageData(new Uint8ClampedArray(t),o,s);const a=new Uint32Array(t),c=o*s*4,u=new ArrayBuffer(c),l=new Uint32Array(u),f=new Uint8ClampedArray(u);if(e===o)return new ImageData(new Uint8ClampedArray(t,4*i,c),o,s);let p=0;for(let t=i;t{if(t.data.consoleLog)return;const r=Math.ceil(this._height/t.data.height);this._frames[u]=this.cropImage(t.data.buf,t.data.width,t.data.height,0,0,Math.floor(n/r),Math.floor(e/r)),this._decodingBlocks[`${s}:${a}`].resolveCallback&&this._decodingBlocks[`${s}:${a}`].resolveCallback(u),u in this._promisedFrames&&(this._promisedFrames[u].resolve(this._frames[u]),delete this._promisedFrames[u]),u===a&&(this._decodeThreadCount--,delete this._decodingBlocks[`${s}:${a}`],o.terminate()),u++},o.onerror=t=>{console.log(["ERROR: Line ",t.lineno," in ",t.filename,": ",t.message].join("")),o.terminate(),this._decodeThreadCount--;for(let t=u;t<=a;t++)t in this._promisedFrames&&(this._promisedFrames[t].reject(),delete this._promisedFrames[t]);this._decodingBlocks[`${s}:${a}`].rejectCallback&&this._decodingBlocks[`${s}:${a}`].rejectCallback(),delete this._decodingBlocks[`${s}:${a}`]},o.postMessage({type:"Broadway.js - Worker init",options:{rgb:!0,reuseMemory:!1}});const l=new r(new i(c));l.read();const f=l.tracks[1],p=l.tracks[1].trak.mdia.minf.stbl.stsd.avc1.avcC,h=p.sps[0],d=p.pps[0];o.postMessage({buf:h,offset:0,length:h.length}),o.postMessage({buf:d,offset:0,length:d.length});for(let t=0;t{o.postMessage({buf:t,offset:0,length:t.length})});this._decodeThreadCount++,t()}else{const r=new Worker("/static/engine/js/unzip_imgs.js");r.onerror=t=>{console.log(["ERROR: Line ",t.lineno," in ",t.filename,": ",t.message].join(""));for(let t=s;t<=a;t++)t in this._promisedFrames&&(this._promisedFrames[t].reject(),delete this._promisedFrames[t]);this._decodingBlocks[`${s}:${a}`].rejectCallback&&this._decodingBlocks[`${s}:${a}`].rejectCallback(),this._decodeThreadCount--},r.postMessage({block:c,start:s,end:a}),this._decodeThreadCount++,r.onmessage=t=>{this._frames[t.data.index]={data:t.data.data,width:n,height:e},this._decodingBlocks[`${s}:${a}`].resolveCallback&&this._decodingBlocks[`${s}:${a}`].resolveCallback(t.data.index),t.data.index in this._promisedFrames&&(this._promisedFrames[t.data.index].resolve(this._frames[t.data.index]),delete this._promisedFrames[t.data.index]),t.data.isEnd&&(delete this._decodingBlocks[`${s}:${a}`],this._decodeThreadCount--)},t()}}get decodeThreadCount(){return this._decodeThreadCount}get cachedFrames(){return[...this._blocks_ranges].sort((t,e)=>t.split(":")[0]-e.split(":")[0])}},BlockType:o}},function(t,e,n){var r=n(16),i=n(38),o="".split;t.exports=r((function(){return!Object("z").propertyIsEnumerable(0)}))?function(t){return"String"==i(t)?o.call(t,""):Object(t)}:Object},function(t,e,n){var r=n(8),i=n(123),o=n(19),s=r("unscopables"),a=Array.prototype;null==a[s]&&o(a,s,i(null)),t.exports=function(t){a[s][t]=!0}},function(t,e,n){var r=n(1),i=n(73),o=r["__core-js_shared__"]||i("__core-js_shared__",{});t.exports=o},function(t,e,n){var r=n(16);t.exports=!!Object.getOwnPropertySymbols&&!r((function(){return!String(Symbol())}))},function(t,e,n){var r=n(28),i=n(39),o=n(17),s=n(211);t.exports=r?Object.defineProperties:function(t,e){o(t);for(var n,r=s(e),a=r.length,c=0;a>c;)i.f(t,n=r[c++],e[n]);return t}},function(t,e,n){var r=n(124),i=n(77);t.exports=Object.keys||function(t){return r(t,i)}},function(t,e,n){var r=n(50),i=n(125),o=n(213),s=function(t){return function(e,n,s){var a,c=r(e),u=i(c.length),l=o(s,u);if(t&&n!=n){for(;u>l;)if((a=c[l++])!=a)return!0}else for(;u>l;l++)if((t||l in c)&&c[l]===n)return t||l||0;return!t&&-1}};t.exports={includes:s(!0),indexOf:s(!1)}},function(t,e,n){var r=n(126),i=Math.max,o=Math.min;t.exports=function(t,e){var n=r(t);return n<0?i(n+e,0):o(n,e)}},function(t,e,n){var r=n(1),i=n(129),o=r.WeakMap;t.exports="function"==typeof o&&/native code/.test(i.call(o))},function(t,e,n){"use strict";var r=n(80),i=n(221),o=n(132),s=n(223),a=n(82),c=n(19),u=n(54),l=n(8),f=n(52),p=n(40),h=n(131),d=h.IteratorPrototype,b=h.BUGGY_SAFARI_ITERATORS,m=l("iterator"),g=function(){return this};t.exports=function(t,e,n,l,h,v,y){i(n,e,l);var w,k,x,O=function(t){if(t===h&&T)return T;if(!b&&t in _)return _[t];switch(t){case"keys":case"values":case"entries":return function(){return new n(this,t)}}return function(){return new n(this)}},j=e+" Iterator",S=!1,_=t.prototype,A=_[m]||_["@@iterator"]||h&&_[h],T=!b&&A||O(h),P="Array"==e&&_.entries||A;if(P&&(w=o(P.call(new t)),d!==Object.prototype&&w.next&&(f||o(w)===d||(s?s(w,d):"function"!=typeof w[m]&&c(w,m,g)),a(w,j,!0,!0),f&&(p[j]=g))),"values"==h&&A&&"values"!==A.name&&(S=!0,T=function(){return A.call(this)}),f&&!y||_[m]===T||c(_,m,T),p[e]=T,h)if(k={values:O("values"),keys:v?T:O("keys"),entries:O("entries")},y)for(x in k)!b&&!S&&x in _||u(_,x,k[x]);else r({target:e,proto:!0,forced:b||S},k);return k}},function(t,e,n){"use strict";var r={}.propertyIsEnumerable,i=Object.getOwnPropertyDescriptor,o=i&&!r.call({1:2},1);e.f=o?function(t){var e=i(this,t);return!!e&&e.enumerable}:r},function(t,e,n){var r=n(20),i=n(218),o=n(81),s=n(39);t.exports=function(t,e){for(var n=i(e),a=s.f,c=o.f,u=0;us;){var a,c,u,l=r[s++],f=o?l.ok:l.fail,p=l.resolve,h=l.reject,d=l.domain;try{f?(o||(2===e.rejection&&et(t,e),e.rejection=1),!0===f?a=i:(d&&d.enter(),a=f(i),d&&(d.exit(),u=!0)),a===l.promise?h($("Promise-chain cycle")):(c=K(a))?c.call(a,p,h):p(a)):h(i)}catch(t){d&&!u&&d.exit(),h(t)}}e.reactions=[],e.notified=!1,n&&!e.rejection&&Q(t,e)}))}},Y=function(t,e,n){var r,i;V?((r=B.createEvent("Event")).promise=e,r.reason=n,r.initEvent(t,!1,!0),u.dispatchEvent(r)):r={promise:e,reason:n},(i=u["on"+t])?i(r):"unhandledrejection"===t&&_("Unhandled promise rejection",n)},Q=function(t,e){O.call(u,(function(){var n,r=e.value;if(tt(e)&&(n=T((function(){J?U.emit("unhandledRejection",r,t):Y("unhandledrejection",t,r)})),e.rejection=J||tt(e)?2:1,n.error))throw n.value}))},tt=function(t){return 1!==t.rejection&&!t.parent},et=function(t,e){O.call(u,(function(){J?U.emit("rejectionHandled",t):Y("rejectionhandled",t,e.value)}))},nt=function(t,e,n,r){return function(i){t(e,n,i,r)}},rt=function(t,e,n,r){e.done||(e.done=!0,r&&(e=r),e.value=n,e.state=2,Z(t,e,!0))},it=function(t,e,n,r){if(!e.done){e.done=!0,r&&(e=r);try{if(t===n)throw $("Promise can't be resolved itself");var i=K(n);i?j((function(){var r={done:!1};try{i.call(n,nt(it,t,r,e),nt(rt,t,r,e))}catch(n){rt(t,r,n,e)}})):(e.value=n,e.state=1,Z(t,e,!1))}catch(n){rt(t,{done:!1},n,e)}}};H&&(D=function(t){v(this,D,F),g(t),r.call(this);var e=M(this);try{t(nt(it,this,e),nt(rt,this,e))}catch(t){rt(this,e,t)}},(r=function(t){N(this,{type:F,done:!1,notified:!1,parent:!1,reactions:[],rejection:!1,state:0,value:void 0})}).prototype=h(D.prototype,{then:function(t,e){var n=R(this),r=W(x(this,D));return r.ok="function"!=typeof t||t,r.fail="function"==typeof e&&e,r.domain=J?U.domain:void 0,n.parent=!0,n.reactions.push(r),0!=n.state&&Z(this,n,!1),r.promise},catch:function(t){return this.then(void 0,t)}}),i=function(){var t=new r,e=M(t);this.promise=t,this.resolve=nt(it,t,e),this.reject=nt(rt,t,e)},A.f=W=function(t){return t===D||t===o?new i(t):G(t)},c||"function"!=typeof f||(s=f.prototype.then,p(f.prototype,"then",(function(t,e){var n=this;return new D((function(t,e){s.call(n,t,e)})).then(t,e)}),{unsafe:!0}),"function"==typeof L&&a({global:!0,enumerable:!0,forced:!0},{fetch:function(t){return S(D,L.apply(u,arguments))}}))),a({global:!0,wrap:!0,forced:H},{Promise:D}),d(D,F,!1,!0),b(F),o=l.Promise,a({target:F,stat:!0,forced:H},{reject:function(t){var e=W(this);return e.reject.call(void 0,t),e.promise}}),a({target:F,stat:!0,forced:c||H},{resolve:function(t){return S(c&&this===o?D:this,t)}}),a({target:F,stat:!0,forced:X},{all:function(t){var e=this,n=W(e),r=n.resolve,i=n.reject,o=T((function(){var n=g(e.resolve),o=[],s=0,a=1;w(t,(function(t){var c=s++,u=!1;o.push(void 0),a++,n.call(e,t).then((function(t){u||(u=!0,o[c]=t,--a||r(o))}),i)})),--a||r(o)}));return o.error&&i(o.value),n.promise},race:function(t){var e=this,n=W(e),r=n.reject,i=T((function(){var i=g(e.resolve);w(t,(function(t){i.call(e,t).then(n.resolve,r)}))}));return i.error&&r(i.value),n.promise}})},function(t,e,n){var r=n(1);t.exports=r.Promise},function(t,e,n){var r=n(54);t.exports=function(t,e,n){for(var i in e)r(t,i,e[i],n);return t}},function(t,e,n){"use strict";var r=n(53),i=n(39),o=n(8),s=n(28),a=o("species");t.exports=function(t){var e=r(t),n=i.f;s&&e&&!e[a]&&n(e,a,{configurable:!0,get:function(){return this}})}},function(t,e){t.exports=function(t,e,n){if(!(t instanceof e))throw TypeError("Incorrect "+(n?n+" ":"")+"invocation");return t}},function(t,e,n){var r=n(17),i=n(233),o=n(125),s=n(134),a=n(234),c=n(236),u=function(t,e){this.stopped=t,this.result=e};(t.exports=function(t,e,n,l,f){var p,h,d,b,m,g,v,y=s(e,n,l?2:1);if(f)p=t;else{if("function"!=typeof(h=a(t)))throw TypeError("Target is not iterable");if(i(h)){for(d=0,b=o(t.length);b>d;d++)if((m=l?y(r(v=t[d])[0],v[1]):y(t[d]))&&m instanceof u)return m;return new u(!1)}p=h.call(t)}for(g=p.next;!(v=g.call(p)).done;)if("object"==typeof(m=c(p,y,v.value,l))&&m&&m instanceof u)return m;return new u(!1)}).stop=function(t){return new u(!0,t)}},function(t,e,n){var r=n(8),i=n(40),o=r("iterator"),s=Array.prototype;t.exports=function(t){return void 0!==t&&(i.Array===t||s[o]===t)}},function(t,e,n){var r=n(235),i=n(40),o=n(8)("iterator");t.exports=function(t){if(null!=t)return t[o]||t["@@iterator"]||i[r(t)]}},function(t,e,n){var r=n(38),i=n(8)("toStringTag"),o="Arguments"==r(function(){return arguments}());t.exports=function(t){var e,n,s;return void 0===t?"Undefined":null===t?"Null":"string"==typeof(n=function(t,e){try{return t[e]}catch(t){}}(e=Object(t),i))?n:o?r(e):"Object"==(s=r(e))&&"function"==typeof e.callee?"Arguments":s}},function(t,e,n){var r=n(17);t.exports=function(t,e,n,i){try{return i?e(r(n)[0],n[1]):e(n)}catch(e){var o=t.return;throw void 0!==o&&r(o.call(t)),e}}},function(t,e,n){var r=n(8)("iterator"),i=!1;try{var o=0,s={next:function(){return{done:!!o++}},return:function(){i=!0}};s[r]=function(){return this},Array.from(s,(function(){throw 2}))}catch(t){}t.exports=function(t,e){if(!e&&!i)return!1;var n=!1;try{var o={};o[r]=function(){return{next:function(){return{done:n=!0}}}},t(o)}catch(t){}return n}},function(t,e,n){var r=n(17),i=n(41),o=n(8)("species");t.exports=function(t,e){var n,s=r(t).constructor;return void 0===s||null==(n=r(s)[o])?e:i(n)}},function(t,e,n){var r,i,o,s,a,c,u,l,f=n(1),p=n(81).f,h=n(38),d=n(135).set,b=n(83),m=f.MutationObserver||f.WebKitMutationObserver,g=f.process,v=f.Promise,y="process"==h(g),w=p(f,"queueMicrotask"),k=w&&w.value;k||(r=function(){var t,e;for(y&&(t=g.domain)&&t.exit();i;){e=i.fn,i=i.next;try{e()}catch(t){throw i?s():o=void 0,t}}o=void 0,t&&t.enter()},y?s=function(){g.nextTick(r)}:m&&!/(iphone|ipod|ipad).*applewebkit/i.test(b)?(a=!0,c=document.createTextNode(""),new m(r).observe(c,{characterData:!0}),s=function(){c.data=a=!a}):v&&v.resolve?(u=v.resolve(void 0),l=u.then,s=function(){l.call(u,r)}):s=function(){d.call(f,r)}),t.exports=k||function(t){var e={fn:t,next:void 0};o&&(o.next=e),i||(i=e,s()),o=e}},function(t,e,n){var r=n(17),i=n(22),o=n(136);t.exports=function(t,e){if(r(t),i(e)&&e.constructor===t)return e;var n=o.f(t);return(0,n.resolve)(e),n.promise}},function(t,e,n){var r=n(1);t.exports=function(t,e){var n=r.console;n&&n.error&&(1===arguments.length?n.error(t):n.error(t,e))}},function(t,e){t.exports=function(t){try{return{error:!1,value:t()}}catch(t){return{error:!0,value:t}}}},function(t,e,n){var r=n(1),i=n(244),o=n(72),s=n(19),a=n(8),c=a("iterator"),u=a("toStringTag"),l=o.values;for(var f in i){var p=r[f],h=p&&p.prototype;if(h){if(h[c]!==l)try{s(h,c,l)}catch(t){h[c]=l}if(h[u]||s(h,u,f),i[f])for(var d in o)if(h[d]!==o[d])try{s(h,d,o[d])}catch(t){h[d]=o[d]}}}},function(t,e){t.exports={CSSRuleList:0,CSSStyleDeclaration:0,CSSValueList:0,ClientRectList:0,DOMRectList:0,DOMStringList:0,DOMTokenList:1,DataTransferItemList:0,FileList:0,HTMLAllCollection:0,HTMLCollection:0,HTMLFormElement:0,HTMLSelectElement:0,MediaList:0,MimeTypeArray:0,NamedNodeMap:0,NodeList:1,PaintRequestList:0,Plugin:0,PluginArray:0,SVGLengthList:0,SVGNumberList:0,SVGPathSegList:0,SVGPointList:0,SVGStringList:0,SVGTransformList:0,SourceBufferList:0,StyleSheetList:0,TextTrackCueList:0,TextTrackList:0,TouchList:0}},function(t,e,n){n(72),t.exports=function(){"use strict";function t(t,e){t||error(e)}var e,n,r=function(){function t(t,e){this.w=t,this.h=e}return t.prototype={toString:function(){return"("+this.w+", "+this.h+")"},getHalfSize:function(){return new r(this.w>>>1,this.h>>>1)},length:function(){return this.w*this.h}},t}(),i=function(){function e(t,e,n){this.bytes=new Uint8Array(t),this.start=e||0,this.pos=this.start,this.end=e+n||this.bytes.length}return e.prototype={get length(){return this.end-this.start},get position(){return this.pos},get remaining(){return this.end-this.pos},readU8Array:function(t){if(this.pos>this.end-t)return null;var e=this.bytes.subarray(this.pos,this.pos+t);return this.pos+=t,e},readU32Array:function(t,e,n){if(e=e||1,this.pos>this.end-t*e*4)return null;if(1==e){for(var r=new Uint32Array(t),i=0;i>24},readU8:function(){return this.pos>=this.end?null:this.bytes[this.pos++]},read16:function(){return this.readU16()<<16>>16},readU16:function(){if(this.pos>=this.end-1)return null;var t=this.bytes[this.pos+0]<<8|this.bytes[this.pos+1];return this.pos+=2,t},read24:function(){return this.readU24()<<8>>8},readU24:function(){var t=this.pos,e=this.bytes;if(t>this.end-3)return null;var n=e[t+0]<<16|e[t+1]<<8|e[t+2];return this.pos+=3,n},peek32:function(t){var e=this.pos,n=this.bytes;if(e>this.end-4)return null;var r=n[e+0]<<24|n[e+1]<<16|n[e+2]<<8|n[e+3];return t&&(this.pos+=4),r},read32:function(){return this.peek32(!0)},readU32:function(){return this.peek32(!0)>>>0},read4CC:function(){var t=this.pos;if(t>this.end-4)return null;for(var e="",n=0;n<4;n++)e+=String.fromCharCode(this.bytes[t+n]);return this.pos+=4,e},readFP16:function(){return this.read32()/65536},readFP8:function(){return this.read16()/256},readISO639:function(){for(var t=this.readU16(),e="",n=0;n<3;n++){var r=t>>>5*(2-n)&31;e+=String.fromCharCode(r+96)}return e},readUTF8:function(t){for(var e="",n=0;nthis.end)&&error("Index out of bounds (bounds: [0, "+this.end+"], index: "+t+")."),this.pos=t},subStream:function(t,e){return new i(this.bytes.buffer,t,e)}},e}(),o=function(){function e(t){this.stream=t,this.tracks={}}return e.prototype={readBoxes:function(t,e){for(;t.peek32();){var n=this.readBox(t);if(n.type in e){var r=e[n.type];r instanceof Array||(e[n.type]=[r]),e[n.type].push(n)}else e[n.type]=n}},readBox:function(e){var n={offset:e.position};function r(){n.version=e.readU8(),n.flags=e.readU24()}function i(){return n.size-(e.position-n.offset)}function o(){e.skip(i())}var a=function(){var t=e.subStream(e.position,i());this.readBoxes(t,n),e.skip(t.length)}.bind(this);switch(n.size=e.readU32(),n.type=e.read4CC(),n.type){case"ftyp":n.name="File Type Box",n.majorBrand=e.read4CC(),n.minorVersion=e.readU32(),n.compatibleBrands=new Array((n.size-16)/4);for(var c=0;c0&&(n.name=e.readUTF8(u));break;case"minf":n.name="Media Information Box",a();break;case"stbl":n.name="Sample Table Box",a();break;case"stsd":n.name="Sample Description Box",r(),n.sd=[];e.readU32();a();break;case"avc1":e.reserved(6,0),n.dataReferenceIndex=e.readU16(),t(0==e.readU16()),t(0==e.readU16()),e.readU32(),e.readU32(),e.readU32(),n.width=e.readU16(),n.height=e.readU16(),n.horizontalResolution=e.readFP16(),n.verticalResolution=e.readFP16(),t(0==e.readU32()),n.frameCount=e.readU16(),n.compressorName=e.readPString(32),n.depth=e.readU16(),t(65535==e.readU16()),a();break;case"mp4a":e.reserved(6,0),n.dataReferenceIndex=e.readU16(),n.version=e.readU16(),e.skip(2),e.skip(4),n.channelCount=e.readU16(),n.sampleSize=e.readU16(),n.compressionId=e.readU16(),n.packetSize=e.readU16(),n.sampleRate=e.readU32()>>>16,t(0==n.version),a();break;case"esds":n.name="Elementary Stream Descriptor",r(),o();break;case"avcC":n.name="AVC Configuration Box",n.configurationVersion=e.readU8(),n.avcProfileIndication=e.readU8(),n.profileCompatibility=e.readU8(),n.avcLevelIndication=e.readU8(),n.lengthSizeMinusOne=3&e.readU8(),t(3==n.lengthSizeMinusOne,"TODO");var l=31&e.readU8();n.sps=[];for(c=0;c=8,"Cannot parse large media data yet."),n.data=e.readU8Array(i());break;default:o()}return n},read:function(){var t=(new Date).getTime();this.file={},this.readBoxes(this.stream,this.file),console.info("Parsed stream in "+((new Date).getTime()-t)+" ms")},traceSamples:function(){var t=this.tracks[1],e=this.tracks[2];console.info("Video Samples: "+t.getSampleCount()),console.info("Audio Samples: "+e.getSampleCount());for(var n=0,r=0,i=0;i<100;i++){var o=t.sampleToOffset(n),s=e.sampleToOffset(r),a=t.sampleToSize(n,1),c=e.sampleToSize(r,1);o0){var s=n[i-1],a=o.firstChunk-s.firstChunk,c=s.samplesPerChunk*a;if(!(e>=c))return{index:r+Math.floor(e/s.samplesPerChunk),offset:e%s.samplesPerChunk};if(e-=c,i==n.length-1)return{index:r+a+Math.floor(e/o.samplesPerChunk),offset:e%o.samplesPerChunk};r+=a}}t(!1)},chunkToOffset:function(t){return this.trak.mdia.minf.stbl.stco.table[t]},sampleToOffset:function(t){var e=this.sampleToChunk(t);return this.chunkToOffset(e.index)+this.sampleToSize(t-e.offset,e.offset)},timeToSample:function(t){for(var e=this.trak.mdia.minf.stbl.stts.table,n=0,r=0;r=i))return n+Math.floor(t/e[r].delta);t-=i,n+=e[r].count}},getTotalTime:function(){for(var e=this.trak.mdia.minf.stbl.stts.table,n=0,r=0;r0;){var s=new i(e.buffer,n).readU32();o.push(e.subarray(n+4,n+s+4)),n=n+s+4}return o}},e}();e=[],n="zero-timeout-message",window.addEventListener("message",(function(t){t.source==window&&t.data==n&&(t.stopPropagation(),e.length>0&&e.shift()())}),!0),window.setZeroTimeout=function(t){e.push(t),window.postMessage(n,"*")};var a=function(){function t(t,n,r,i){this.stream=t,this.useWorkers=n,this.webgl=r,this.render=i,this.statistics={videoStartTime:0,videoPictureCounter:0,windowStartTime:0,windowPictureCounter:0,fps:0,fpsMin:1e3,fpsMax:-1e3,webGLTextureUploadTime:0},this.onStatisticsUpdated=function(){},this.avc=new Player({useWorker:n,reuseMemory:!0,webgl:r,size:{width:640,height:368}}),this.webgl=this.avc.webgl;var o=this;this.avc.onPictureDecoded=function(){e.call(o)},this.canvas=this.avc.canvas}function e(){var t=this.statistics;t.videoPictureCounter+=1,t.windowPictureCounter+=1;var e=Date.now();t.videoStartTime||(t.videoStartTime=e);var n=e-t.videoStartTime;if(t.elapsed=n/1e3,!(n<1e3))if(t.windowStartTime){if(e-t.windowStartTime>1e3){var r=e-t.windowStartTime,i=t.windowPictureCounter/r*1e3;t.windowStartTime=e,t.windowPictureCounter=0,it.fpsMax&&(t.fpsMax=i),t.fps=i}i=t.videoPictureCounter/n*1e3;t.fpsSinceStart=i,this.onStatisticsUpdated(this.statistics)}else t.windowStartTime=e}return t.prototype={readAll:function(t){console.info("MP4Player::readAll()"),this.stream.readAll(null,function(e){this.reader=new o(new i(e)),this.reader.read();var n=this.reader.tracks[1];this.size=new r(n.trak.tkhd.width,n.trak.tkhd.height),console.info("MP4Player::readAll(), length: "+this.reader.stream.length),t&&t()}.bind(this))},play:function(){var t=this.reader;if(t){var e=t.tracks[1],n=(t.tracks[2],t.tracks[1].trak.mdia.minf.stbl.stsd.avc1.avcC),r=n.sps[0],i=n.pps[0];this.avc.decode(r),this.avc.decode(i);var o=0;setTimeout(function t(){var n=this.avc;e.getSampleNALUnits(o).forEach((function(t){n.decode(t)})),++o<3e3&&setTimeout(t.bind(this),1)}.bind(this),1)}else this.readAll(this.play.bind(this))}},t}(),c=function(){function t(t){var e=t.attributes.src?t.attributes.src.value:void 0,n=(t.attributes.width&&t.attributes.width.value,t.attributes.height&&t.attributes.height.value,document.createElement("div"));n.setAttribute("style","z-index: 100; position: absolute; bottom: 0px; background-color: rgba(0,0,0,0.8); height: 30px; width: 100%; text-align: left;"),this.info=document.createElement("div"),this.info.setAttribute("style","font-size: 14px; font-weight: bold; padding: 6px; color: lime;"),n.appendChild(this.info),t.appendChild(n);var r=!!t.attributes.workers&&"true"==t.attributes.workers.value,i=!!t.attributes.render&&"true"==t.attributes.render.value,o="auto";t.attributes.webgl&&("true"==t.attributes.webgl.value&&(o=!0),"false"==t.attributes.webgl.value&&(o=!1));var s="";s+=r?"worker thread ":"main thread ",this.player=new a(new Stream(e),r,o,i),this.canvas=this.player.canvas,this.canvas.onclick=function(){this.play()}.bind(this),t.appendChild(this.canvas),s+=" - webgl: "+this.player.webgl,this.info.innerHTML="Click canvas to load and play - "+s,this.score=null,this.player.onStatisticsUpdated=function(t){if(t.videoPictureCounter%10==0){var e="";t.fps&&(e+=" fps: "+t.fps.toFixed(2)),t.fpsSinceStart&&(e+=" avg: "+t.fpsSinceStart.toFixed(2));t.videoPictureCounter<1200?this.score=1200-t.videoPictureCounter:1200==t.videoPictureCounter&&(this.score=t.fpsSinceStart.toFixed(2)),this.info.innerHTML=s+e}}.bind(this)}return t.prototype={play:function(){this.player.play()}},t}();return{Size:r,Track:s,MP4Reader:o,MP4Player:a,Bytestream:i,Broadway:c}}()},function(t,e,n){"use strict";(function(t){Object.defineProperty(e,"__esModule",{value:!0});var n="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t},r="undefined"!=typeof window&&void 0!==window.document,i="object"===("undefined"==typeof self?"undefined":n(self))&&self.constructor&&"DedicatedWorkerGlobalScope"===self.constructor.name,o=void 0!==t&&null!=t.versions&&null!=t.versions.node;e.isBrowser=r,e.isWebWorker=i,e.isNode=o}).call(this,n(112))},function(t,e,n){n(5),n(11),n(10),(()=>{const e=n(26),r=n(248),i=n(251),{checkObjectType:o}=n(56),{Task:s}=n(49),{Loader:a,Dumper:c}=n(138),{ScriptingError:u,DataError:l,ArgumentError:f}=n(6),p=new WeakMap,h=new WeakMap;function d(t){if("task"===t)return h;if("job"===t)return p;throw new u(`Unknown session type was received ${t}`)}async function b(t){const n=t instanceof s?"task":"job",o=d(n);if(!o.has(t)){const s=await e.annotations.getAnnotations(n,t.id),a="job"===n?t.startFrame:0,c="job"===n?t.stopFrame:t.size-1,u={};for(let e=a;e<=c;e++)u[e]=await t.frames.get(e);const l=new r({labels:t.labels||t.task.labels,startFrame:a,stopFrame:c,frameMeta:u}).import(s),f=new i(s.version,l,t);o.set(t,{collection:l,saver:f})}}t.exports={getAnnotations:async function(t,e,n){return await b(t),d(t instanceof s?"task":"job").get(t).collection.get(e,n)},putAnnotations:function(t,e){const n=d(t instanceof s?"task":"job");if(n.has(t))return n.get(t).collection.put(e);throw new l("Collection has not been initialized yet. Call annotations.get() or annotations.clear(true) before")},saveAnnotations:async function(t,e){const n=d(t instanceof s?"task":"job");n.has(t)&&await n.get(t).saver.save(e)},hasUnsavedChanges:function(t){const e=d(t instanceof s?"task":"job");return!!e.has(t)&&e.get(t).saver.hasUnsavedChanges()},mergeAnnotations:function(t,e){const n=d(t instanceof s?"task":"job");if(n.has(t))return n.get(t).collection.merge(e);throw new l("Collection has not been initialized yet. Call annotations.get() or annotations.clear(true) before")},splitAnnotations:function(t,e,n){const r=d(t instanceof s?"task":"job");if(r.has(t))return r.get(t).collection.split(e,n);throw new l("Collection has not been initialized yet. Call annotations.get() or annotations.clear(true) before")},groupAnnotations:function(t,e,n){const r=d(t instanceof s?"task":"job");if(r.has(t))return r.get(t).collection.group(e,n);throw new l("Collection has not been initialized yet. Call annotations.get() or annotations.clear(true) before")},clearAnnotations:async function(t,e){o("reload",e,"boolean",null);const n=d(t instanceof s?"task":"job");n.has(t)&&n.get(t).collection.clear(),e&&(n.delete(t),await b(t))},annotationsStatistics:function(t){const e=d(t instanceof s?"task":"job");if(e.has(t))return e.get(t).collection.statistics();throw new l("Collection has not been initialized yet. Call annotations.get() or annotations.clear(true) before")},selectObject:function(t,e,n,r){const i=d(t instanceof s?"task":"job");if(i.has(t))return i.get(t).collection.select(e,n,r);throw new l("Collection has not been initialized yet. Call annotations.get() or annotations.clear(true) before")},uploadAnnotations:async function(t,n,r){const i=t instanceof s?"task":"job";if(!(r instanceof a))throw new f("A loader must be instance of Loader class");await e.annotations.uploadAnnotations(i,t.id,n,r.name)},dumpAnnotations:async function(t,n,r){if(!(r instanceof c))throw new f("A dumper must be instance of Dumper class");let i=null;return i="job"===(t instanceof s?"task":"job")?await e.annotations.dumpAnnotations(t.task.id,n,r.name):await e.annotations.dumpAnnotations(t.id,n,r.name)},exportDataset:async function(t,n){if(!(n instanceof String||"string"==typeof n))throw new f("Format must be a string");if(!(t instanceof s))throw new f("A dataset can only be created from a task");let r=null;return r=await e.tasks.exportDataset(t.id,n)}}})()},function(t,e,n){n(5),n(137),n(10),n(71),(()=>{const{RectangleShape:e,PolygonShape:r,PolylineShape:i,PointsShape:o,RectangleTrack:s,PolygonTrack:a,PolylineTrack:c,PointsTrack:u,Track:l,Shape:f,Tag:p,objectStateFactory:h}=n(250),{checkObjectType:d}=n(56),b=n(117),{Label:m}=n(55),{DataError:g,ArgumentError:v,ScriptingError:y}=n(6),{ObjectShape:w,ObjectType:k}=n(29),x=n(70),O=["#0066FF","#AF593E","#01A368","#FF861F","#ED0A3F","#FF3F34","#76D7EA","#8359A3","#FBE870","#C5E17A","#03BB85","#FFDF00","#8B8680","#0A6B0D","#8FD8D8","#A36F40","#F653A6","#CA3435","#FFCBA4","#FF99CC","#FA9D5A","#FFAE42","#A78B00","#788193","#514E49","#1164B4","#F4FA9F","#FED8B1","#C32148","#01796F","#E90067","#FF91A4","#404E5A","#6CDAE7","#FFC1CC","#006A93","#867200","#E2B631","#6EEB6E","#FFC800","#CC99BA","#FF007C","#BC6CAC","#DCCCD7","#EBE1C2","#A6AAAE","#B99685","#0086A7","#5E4330","#C8A2C8","#708EB3","#BC8777","#B2592D","#497E48","#6A2963","#E6335F","#00755E","#B5A895","#0048ba","#EED9C4","#C88A65","#FF6E4A","#87421F","#B2BEB5","#926F5B","#00B9FB","#6456B7","#DB5079","#C62D42","#FA9C44","#DA8A67","#FD7C6E","#93CCEA","#FCF686","#503E32","#FF5470","#9DE093","#FF7A00","#4F69C6","#A50B5E","#F0E68C","#FDFF00","#F091A9","#FFFF66","#6F9940","#FC74FD","#652DC1","#D6AEDD","#EE34D2","#BB3385","#6B3FA0","#33CC99","#FFDB00","#87FF2A","#6EEB6E","#FFC800","#CC99BA","#7A89B8","#006A93","#867200","#E2B631","#D9D6CF"];function j(t,n,s){const{type:a}=t,c=O[n%O.length];let u=null;switch(a){case"rectangle":u=new e(t,n,c,s);break;case"polygon":u=new r(t,n,c,s);break;case"polyline":u=new i(t,n,c,s);break;case"points":u=new o(t,n,c,s);break;default:throw new g(`An unexpected type of shape "${a}"`)}return u}function S(t,e,n){if(t.shapes.length){const{type:r}=t.shapes[0],i=O[e%O.length];let o=null;switch(r){case"rectangle":o=new s(t,e,i,n);break;case"polygon":o=new a(t,e,i,n);break;case"polyline":o=new c(t,e,i,n);break;case"points":o=new u(t,e,i,n);break;default:throw new g(`An unexpected type of track "${r}"`)}return o}return console.warn("The track without any shapes had been found. It was ignored."),null}t.exports=class{constructor(t){this.startFrame=t.startFrame,this.stopFrame=t.stopFrame,this.frameMeta=t.frameMeta,this.labels=t.labels.reduce((t,e)=>(t[e.id]=e,t),{}),this.shapes={},this.tags={},this.tracks=[],this.objects={},this.count=0,this.flush=!1,this.collectionZ={},this.groups={max:0},this.injection={labels:this.labels,collectionZ:this.collectionZ,groups:this.groups,frameMeta:this.frameMeta}}import(t){for(const e of t.tags){const t=++this.count,n=new p(e,t,this.injection);this.tags[n.frame]=this.tags[n.frame]||[],this.tags[n.frame].push(n),this.objects[t]=n}for(const e of t.shapes){const t=++this.count,n=j(e,t,this.injection);this.shapes[n.frame]=this.shapes[n.frame]||[],this.shapes[n.frame].push(n),this.objects[t]=n}for(const e of t.tracks){const t=++this.count,n=S(e,t,this.injection);n&&(this.tracks.push(n),this.objects[t]=n)}return this}export(){return{tracks:this.tracks.filter(t=>!t.removed).map(t=>t.toJSON()),shapes:Object.values(this.shapes).reduce((t,e)=>(t.push(...e),t),[]).filter(t=>!t.removed).map(t=>t.toJSON()),tags:Object.values(this.tags).reduce((t,e)=>(t.push(...e),t),[]).filter(t=>!t.removed).map(t=>t.toJSON())}}get(t){const{tracks:e}=this,n=this.shapes[t]||[],r=this.tags[t]||[],i=e.concat(n).concat(r).filter(t=>!t.removed),o=[];for(const e of i){const n=e.get(t);if(n.outside&&!n.keyframe)continue;const r=h.call(e,t,n);o.push(r)}return o}merge(t){if(d("shapes for merge",t,null,Array),!t.length)return;const e=t.map(t=>{d("object state",t,null,x);const e=this.objects[t.clientID];if(void 0===e)throw new v("The object has not been saved yet. Call ObjectState.put([state]) before you can merge it");return e}),n={},{label:r,shapeType:i}=t[0];if(!(r.id in this.labels))throw new v(`Unknown label for the task: ${r.id}`);if(!Object.values(w).includes(i))throw new v(`Got unknown shapeType "${i}"`);const o=r.attributes.reduce((t,e)=>(t[e.id]=e,t),{});for(let s=0;s(e in o&&o[e].mutable&&t.push({spec_id:+e,value:a.attributes[e]}),t),[])},a.frame+1 in n||(n[a.frame+1]=JSON.parse(JSON.stringify(n[a.frame])),n[a.frame+1].outside=!0,n[a.frame+1].frame++)}else{if(!(a instanceof l))throw new v(`Trying to merge unknown object type: ${a.constructor.name}. `+"Only shapes and tracks are expected.");{const t={};for(const e of Object.keys(a.shapes)){const r=a.shapes[e];if(e in n&&!n[e].outside){if(r.outside)continue;throw new v("Expected only one visible shape per frame")}let o=!1;for(const e in r.attributes)e in t&&t[e]===r.attributes[e]||(o=!0,t[e]=r.attributes[e]);n[e]={type:i,frame:+e,points:[...r.points],occluded:r.occluded,outside:r.outside,zOrder:r.zOrder,attributes:o?Object.keys(t).reduce((e,n)=>(e.push({spec_id:+n,value:t[n]}),e),[]):[]}}}}}let s=!1;for(const t of Object.keys(n).sort((t,e)=>+t-+e)){if((s=s||n[t].outside)||!n[t].outside)break;delete n[t]}const a=++this.count,c=S({frame:Math.min.apply(null,Object.keys(n).map(t=>+t)),shapes:Object.values(n),group:0,label_id:r.id,attributes:Object.keys(t[0].attributes).reduce((e,n)=>(o[n].mutable||e.push({spec_id:+n,value:t[0].attributes[n]}),e),[])},a,this.injection);this.tracks.push(c),this.objects[a]=c;for(const t of e)t.removed=!0,"function"==typeof t.resetCache&&t.resetCache()}split(t,e){d("object state",t,null,x),d("frame",e,"integer",null);const n=this.objects[t.clientID];if(void 0===n)throw new v("The object has not been saved yet. Call annotations.put([state]) before");if(t.objectType!==k.TRACK)return;const r=Object.keys(n.shapes).sort((t,e)=>+t-+e);if(e<=+r[0]||e>r[r.length-1])return;const i=n.label.attributes.reduce((t,e)=>(t[e.id]=e,t),{}),o=n.toJSON(),s={type:t.shapeType,points:[...t.points],occluded:t.occluded,outside:t.outside,zOrder:0,attributes:Object.keys(t.attributes).reduce((e,n)=>(i[n].mutable||e.push({spec_id:+n,value:t.attributes[n]}),e),[]),frame:e},a={frame:o.frame,group:0,label_id:o.label_id,attributes:o.attributes,shapes:[]},c=JSON.parse(JSON.stringify(a));c.frame=e,c.shapes.push(JSON.parse(JSON.stringify(s))),o.shapes.map(t=>(delete t.id,t.framee&&c.shapes.push(JSON.parse(JSON.stringify(t))),t)),a.shapes.push(s),a.shapes[a.shapes.length-1].outside=!0;let u=++this.count;const l=S(a,u,this.injection);this.tracks.push(l),this.objects[u]=l,u=++this.count;const f=S(c,u,this.injection);this.tracks.push(f),this.objects[u]=f,n.removed=!0,n.resetCache()}group(t,e){d("shapes for group",t,null,Array);const n=t.map(t=>{d("object state",t,null,x);const e=this.objects[t.clientID];if(void 0===e)throw new v("The object has not been saved yet. Call annotations.put([state]) before");return e}),r=e?0:++this.groups.max;for(const t of n)t.group=r,"function"==typeof t.resetCache&&t.resetCache();return r}clear(){this.shapes={},this.tags={},this.tracks=[],this.objects={},this.count=0,this.flush=!0}statistics(){const t={},e={rectangle:{shape:0,track:0},polygon:{shape:0,track:0},polyline:{shape:0,track:0},points:{shape:0,track:0},tags:0,manually:0,interpolated:0,total:0},n=JSON.parse(JSON.stringify(e));for(const n of Object.values(this.labels)){const{name:r}=n;t[r]=JSON.parse(JSON.stringify(e))}for(const e of Object.values(this.objects)){let n=null;if(e instanceof f)n="shape";else if(e instanceof l)n="track";else{if(!(e instanceof p))throw new y(`Unexpected object type: "${n}"`);n="tag"}const r=e.label.name;if("tag"===n)t[r].tags++,t[r].manually++,t[r].total++;else{const{shapeType:i}=e;if(t[r][i][n]++,"track"===n){const n=Object.keys(e.shapes).sort((t,e)=>+t-+e).map(t=>+t);let i=n[0],o=!1;for(const s of n){if(o){const e=s-i-1;t[r].interpolated+=e,t[r].total+=e}o=!e.shapes[s].outside,i=s,o&&(t[r].manually++,t[r].total++)}const s=n[n.length-1];if(s!==this.stopFrame&&!e.shapes[s].outside){const e=this.stopFrame-s;t[r].interpolated+=e,t[r].total+=e}}else t[r].manually++,t[r].total++}}for(const e of Object.keys(t))for(const r of Object.keys(t[e]))if("object"==typeof t[e][r])for(const i of Object.keys(t[e][r]))n[r][i]+=t[e][r][i];else n[r]+=t[e][r];return new b(t,n)}put(t){d("shapes for put",t,null,Array);const e={shapes:[],tracks:[],tags:[]};function n(t,e){const n=+e,r=this.attributes[e];return d("attribute id",n,"integer",null),d("attribute value",r,"string",null),t.push({spec_id:n,value:r}),t}for(const r of t){d("object state",r,null,x),d("state client ID",r.clientID,"undefined",null),d("state frame",r.frame,"integer",null),d("state attributes",r.attributes,null,Object),d("state label",r.label,null,m);const t=Object.keys(r.attributes).reduce(n.bind(r),[]),i=r.label.attributes.reduce((t,e)=>(t[e.id]=e,t),{});if("tag"===r.objectType)e.tags.push({attributes:t,frame:r.frame,label_id:r.label.id,group:0});else{d("state occluded",r.occluded,"boolean",null),d("state points",r.points,null,Array);for(const t of r.points)d("point coordinate",t,"number",null);if(!Object.values(w).includes(r.shapeType))throw new v("Object shape must be one of: "+`${JSON.stringify(Object.values(w))}`);if("shape"===r.objectType)e.shapes.push({attributes:t,frame:r.frame,group:0,label_id:r.label.id,occluded:r.occluded||!1,points:[...r.points],type:r.shapeType,z_order:0});else{if("track"!==r.objectType)throw new v("Object type must be one of: "+`${JSON.stringify(Object.values(k))}`);e.tracks.push({attributes:t.filter(t=>!i[t.spec_id].mutable),frame:r.frame,group:0,label_id:r.label.id,shapes:[{attributes:t.filter(t=>i[t.spec_id].mutable),frame:r.frame,occluded:r.occluded||!1,outside:!1,points:[...r.points],type:r.shapeType,z_order:0}]})}}}this.import(e)}select(t,e,n){d("shapes for select",t,null,Array),d("x coordinate",e,"number",null),d("y coordinate",n,"number",null);let r=null,i=null;for(const o of t){if(d("object state",o,null,x),o.outside)continue;const t=this.objects[o.clientID];if(void 0===t)throw new v("The object has not been saved yet. Call annotations.put([state]) before");const s=t.constructor.distance(o.points,e,n);null!==s&&(null===r||s{const e=n(70),{checkObjectType:r,isEnum:o}=n(56),{ObjectShape:s,ObjectType:a,AttributeType:c,VisibleState:u}=n(29),{DataError:l,ArgumentError:f,ScriptingError:p}=n(6),{Label:h}=n(55);function d(t,n){const r=new e(n);return r.hidden={save:this.save.bind(this,t,r),delete:this.delete.bind(this),up:this.up.bind(this,t,r),down:this.down.bind(this,t,r)},r}function b(t,e){if(t===s.RECTANGLE){if(e.length/2!=2)throw new l(`Rectangle must have 2 points, but got ${e.length/2}`)}else if(t===s.POLYGON){if(e.length/2<3)throw new l(`Polygon must have at least 3 points, but got ${e.length/2}`)}else if(t===s.POLYLINE){if(e.length/2<2)throw new l(`Polyline must have at least 2 points, but got ${e.length/2}`)}else{if(t!==s.POINTS)throw new f(`Unknown value of shapeType has been recieved ${t}`);if(e.length/2<1)throw new l(`Points must have at least 1 points, but got ${e.length/2}`)}}function m(t,e){if(t===s.POINTS)return!0;let n=Number.MAX_SAFE_INTEGER,r=Number.MIN_SAFE_INTEGER,i=Number.MAX_SAFE_INTEGER,o=Number.MIN_SAFE_INTEGER;for(let t=0;t=3}return(r-n)*(o-i)>=9}function g(t,e){const{values:n}=e,r=e.inputType;if("string"!=typeof t)throw new f(`Attribute value is expected to be string, but got ${typeof t}`);return r===c.NUMBER?+t>=+n[0]&&+t<=+n[1]&&!((+t-+n[0])%+n[2]):r===c.CHECKBOX?["true","false"].includes(t.toLowerCase()):n.includes(t)}class v{constructor(t,e,n){this.taskLabels=n.labels,this.clientID=e,this.serverID=t.id,this.group=t.group,this.label=this.taskLabels[t.label_id],this.frame=t.frame,this.removed=!1,this.lock=!1,this.attributes=t.attributes.reduce((t,e)=>(t[e.spec_id]=e.value,t),{}),this.appendDefaultAttributes(this.label),n.groups.max=Math.max(n.groups.max,this.group)}appendDefaultAttributes(t){const e=t.attributes;for(const t of e)t.id in this.attributes||(this.attributes[t.id]=t.defaultValue)}delete(t){return this.lock&&!t||(this.removed=!0),!0}}class y extends v{constructor(t,e,n,r){super(t,e,r),this.frameMeta=r.frameMeta,this.collectionZ=r.collectionZ,this.visibility=u.SHAPE,this.color=n,this.shapeType=null}_getZ(t){return this.collectionZ[t]=this.collectionZ[t]||{max:0,min:0},this.collectionZ[t]}save(){throw new p("Is not implemented")}get(){throw new p("Is not implemented")}toJSON(){throw new p("Is not implemented")}up(t,e){const n=this._getZ(t);n.max++,e.zOrder=n.max}down(t,e){const n=this._getZ(t);n.min--,e.zOrder=n.min}}class w extends y{constructor(t,e,n,r){super(t,e,n,r),this.points=t.points,this.occluded=t.occluded,this.zOrder=t.z_order;const i=this._getZ(this.frame);i.max=Math.max(i.max,this.zOrder||0),i.min=Math.min(i.min,this.zOrder||0)}toJSON(){return{type:this.shapeType,clientID:this.clientID,occluded:this.occluded,z_order:this.zOrder,points:[...this.points],attributes:Object.keys(this.attributes).reduce((t,e)=>(t.push({spec_id:e,value:this.attributes[e]}),t),[]),id:this.serverID,frame:this.frame,label_id:this.label.id,group:this.group}}get(t){if(t!==this.frame)throw new p("Got frame is not equal to the frame of the shape");return{objectType:a.SHAPE,shapeType:this.shapeType,clientID:this.clientID,serverID:this.serverID,occluded:this.occluded,lock:this.lock,zOrder:this.zOrder,points:[...this.points],attributes:i({},this.attributes),label:this.label,group:this.group,color:this.color,visibility:this.visibility}}save(t,e){if(t!==this.frame)throw new p("Got frame is not equal to the frame of the shape");if(this.lock&&e.lock)return d.call(this,t,this.get(t));const n=this.get(t),i=e.updateFlags;if(i.label&&(r("label",e.label,null,h),n.label=e.label,n.attributes={},this.appendDefaultAttributes.call(n,n.label)),i.attributes){const t=n.label.attributes.reduce((t,e)=>(t[e.id]=e,t),{});for(const r of Object.keys(e.attributes)){const i=e.attributes[r];if(!(r in t&&g(i,t[r])))throw new f(`Trying to save unknown attribute with id ${r} and value ${i}`);n.attributes[r]=i}}if(i.points){r("points",e.points,null,Array),b(this.shapeType,e.points);const{width:i,height:o}=this.frameMeta[t],s=[];for(let t=0;t{t[e.frame]={serverID:e.id,occluded:e.occluded,zOrder:e.z_order,points:e.points,outside:e.outside,attributes:e.attributes.reduce((t,e)=>(t[e.spec_id]=e.value,t),{})};const n=this._getZ(e.frame);return n.max=Math.max(n.max,e.z_order),n.min=Math.min(n.min,e.z_order),t},{}),this.cache={}}toJSON(){const t=this.label.attributes.reduce((t,e)=>(t[e.id]=e,t),{});return{clientID:this.clientID,id:this.serverID,frame:this.frame,label_id:this.label.id,group:this.group,attributes:Object.keys(this.attributes).reduce((e,n)=>(t[n].mutable||e.push({spec_id:n,value:this.attributes[n]}),e),[]),shapes:Object.keys(this.shapes).reduce((e,n)=>(e.push({type:this.shapeType,occluded:this.shapes[n].occluded,z_order:this.shapes[n].zOrder,points:[...this.shapes[n].points],outside:this.shapes[n].outside,attributes:Object.keys(this.shapes[n].attributes).reduce((e,r)=>(t[r].mutable&&e.push({spec_id:r,value:this.shapes[n].attributes[r]}),e),[]),id:this.shapes[n].serverID,frame:+n}),e),[])}}get(t){if(!(t in this.cache)){const e=Object.assign({},this.getPosition(t),{attributes:this.getAttributes(t),group:this.group,objectType:a.TRACK,shapeType:this.shapeType,clientID:this.clientID,serverID:this.serverID,lock:this.lock,color:this.color,visibility:this.visibility});this.cache[t]=e}const e=JSON.parse(JSON.stringify(this.cache[t]));return e.label=this.label,e}neighborsFrames(t){const e=Object.keys(this.shapes).map(t=>+t);let n=Number.MAX_SAFE_INTEGER,r=Number.MAX_SAFE_INTEGER;for(const i of e){const e=Math.abs(t-i);i<=t&&e+t-+e);for(const r of n)if(r<=t){const{attributes:t}=this.shapes[r];for(const n in t)Object.prototype.hasOwnProperty.call(t,n)&&(e[n]=t[n])}return e}save(t,e){if(this.lock&&e.lock)return d.call(this,t,this.get(t));const n=Object.assign(this.get(t));n.attributes=Object.assign(n.attributes),n.points=[...n.points];const i=e.updateFlags;let s=!1;i.label&&(r("label",e.label,null,h),n.label=e.label,n.attributes={},this.appendDefaultAttributes.call(n,n.label));const a=n.label.attributes.reduce((t,e)=>(t[e.id]=e,t),{});if(i.attributes)for(const t of Object.keys(e.attributes)){const r=e.attributes[t];if(!(t in a&&g(r,a[t])))throw new f(`Trying to save unknown attribute with id ${t} and value ${r}`);n.attributes[t]=r}if(i.points){r("points",e.points,null,Array),b(this.shapeType,e.points);const{width:i,height:o}=this.frameMeta[t],a=[];for(let t=0;tt&&delete this.cache[e];return this.cache[t].keyframe=!1,delete this.shapes[t],i.reset(),d.call(this,t,this.get(t))}if(s||i.keyframe&&e.keyframe){for(const e in this.cache)+e>t&&delete this.cache[e];if(this.cache[t].keyframe=!0,e.keyframe=!0,this.shapes[t]={frame:t,zOrder:n.zOrder,points:n.points,outside:n.outside,occluded:n.occluded,attributes:{}},i.attributes)for(const r of Object.keys(n.attributes))a[r].mutable&&(this.shapes[t].attributes[r]=e.attributes[r],this.shapes[t].attributes[r]=e.attributes[r])}return i.reset(),d.call(this,t,this.get(t))}getPosition(t){const{leftFrame:e,rightFrame:n}=this.neighborsFrames(t),r=Number.isInteger(n)?this.shapes[n]:null,i=Number.isInteger(e)?this.shapes[e]:null;if(i&&e===t)return{points:[...i.points],occluded:i.occluded,outside:i.outside,zOrder:i.zOrder,keyframe:!0};if(r&&i)return Object.assign({},this.interpolatePosition(i,r,(t-e)/(n-e)),{keyframe:!1});if(r)return{points:[...r.points],occluded:r.occluded,outside:!0,zOrder:0,keyframe:!1};if(i)return{points:[...i.points],occluded:i.occluded,outside:i.outside,zOrder:0,keyframe:!1};throw new p(`No one neightbour frame found for the track with client ID: "${this.id}"`)}delete(t){return this.lock&&!t||(this.removed=!0,this.resetCache()),!0}resetCache(){this.cache={}}}class x extends w{constructor(t,e,n,r){super(t,e,n,r),this.shapeType=s.RECTANGLE,b(this.shapeType,this.points)}static distance(t,e,n){const[r,i,o,s]=t;return e>=r&&e<=o&&n>=i&&n<=s?Math.min.apply(null,[e-r,n-i,o-e,s-n]):null}}class O extends w{constructor(t,e,n,r){super(t,e,n,r)}}class j extends O{constructor(t,e,n,r){super(t,e,n,r),this.shapeType=s.POLYGON,b(this.shapeType,this.points)}static distance(t,e,n){function r(t,r,i,o){return(i-t)*(n-r)-(e-t)*(o-r)}let i=0;const o=[];for(let s=0,a=t.length-2;sn&&r(c,u,l,f)>0&&i++:f<=n&&r(c,u,l,f)<0&&i--;const p=e-(u-f),h=n-(l-c);(p-c)*(l-p)>=0&&(h-u)*(f-h)>=0?o.push(Math.sqrt(Math.pow(e-p,2)+Math.pow(n-h,2))):o.push(Math.min(Math.sqrt(Math.pow(c-e,2)+Math.pow(u-n,2)),Math.sqrt(Math.pow(l-e,2)+Math.pow(f-n,2))))}return 0!==i?Math.min.apply(null,o):null}}class S extends O{constructor(t,e,n,r){super(t,e,n,r),this.shapeType=s.POLYLINE,b(this.shapeType,this.points)}static distance(t,e,n){const r=[];for(let i=0;i=0&&(n-s)*(c-n)>=0?r.push(Math.abs((c-s)*e-(a-o)*n+a*s-c*o)/Math.sqrt(Math.pow(c-s,2)+Math.pow(a-o,2))):r.push(Math.min(Math.sqrt(Math.pow(o-e,2)+Math.pow(s-n,2)),Math.sqrt(Math.pow(a-e,2)+Math.pow(c-n,2))))}return Math.min.apply(null,r)}}class _ extends O{constructor(t,e,n,r){super(t,e,n,r),this.shapeType=s.POINTS,b(this.shapeType,this.points)}static distance(t,e,n){const r=[];for(let i=0;ir&&(r=t[o]),t[o+1]>i&&(i=t[o+1]);return{xmin:e,ymin:n,xmax:r,ymax:i}}function i(t,e){const n=[],r=e.xmax-e.xmin,i=e.ymax-e.ymin;for(let o=0;on[i][t]-n[i][e]);const i={},o={};let s=0;for(;Object.values(o).length!==t.length;){for(const e of t){if(o[e])continue;const t=r[e][s],a=n[e][t];if(t in i&&i[t].distance>a){const e=i[t].value;delete i[t],delete o[e]}t in i||(i[t]={value:e,distance:a},o[e]=!0)}s++}const a={};for(const t of Object.keys(i))a[i[t].value]={value:t,distance:i[t].distance};return a}(Array.from(t.keys()),Array.from(e.keys()),s),c=(n(e)+n(t))/(e.length+t.length);!function(t,e){for(const n of Object.keys(t))t[n].distance>e&&delete t[n]}(a,c+3*Math.sqrt((r(t,c)+r(e,c))/(t.length+e.length)));for(const t of Object.keys(a))a[t]=a[t].value;const u=this.appendMapping(a,t,e);for(const n of u)i.push(t[n]),o.push(e[a[n]]);return[i,o]}let u=r(t.points),l=r(e.points);(u.xmax-u.xmin<1||l.ymax-l.ymin<1)&&(l=u={xmin:0,xmax:1024,ymin:0,ymax:768});const f=s(i(t.points,u)),p=s(i(e.points,l));let h=[],d=[];if(f.length>p.length){const[t,e]=c.call(this,p,f);h=e,d=t}else{const[t,e]=c.call(this,f,p);h=t,d=e}const b=o(a(h),u),m=o(a(d),l),g=[];for(let t=0;t+t),i=Object.keys(t).map(t=>+t),o=[];function s(t){let e=t,i=t;if(!r.length)throw new p("Interpolation mapping is empty");for(;!r.includes(e);)--e<0&&(e=n.length-1);for(;!r.includes(i);)++i>=n.length&&(i=0);return[e,i]}function a(t,e,r){const i=[];for(;e!==r;)i.push(n[e]),++e>=n.length&&(e=0);i.push(n[r]);let o=0,s=0,a=!1;for(let e=1;e(t.push({spec_id:e,value:this.attributes[e]}),t),[])}}get(t){if(t!==this.frame)throw new p("Got frame is not equal to the frame of the shape");return{objectType:a.TAG,clientID:this.clientID,serverID:this.serverID,lock:this.lock,attributes:Object.assign({},this.attributes),label:this.label,group:this.group}}save(t,e){if(t!==this.frame)throw new p("Got frame is not equal to the frame of the shape");if(this.lock&&e.lock)return d.call(this,t,this.get(t));const n=this.get(t),i=e.updateFlags;if(i.label&&(r("label",e.label,null,h),n.label=e.label,n.attributes={},this.appendDefaultAttributes.call(n,n.label)),i.attributes){const t=n.label.attributes.map(t=>`${t.id}`);for(const r of Object.keys(e.attributes))t.includes(r)&&(n.attributes[r]=e.attributes[r])}i.group&&(r("group",e.group,"integer",null),n.group=e.group),i.lock&&(r("lock",e.lock,"boolean",null),n.lock=e.lock),i.reset();for(const t of Object.keys(n))t in this&&(this[t]=n[t]);return d.call(this,t,this.get(t))}},objectStateFactory:d}})()},function(t,e,n){function r(t,e){var n=Object.keys(t);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(t);e&&(r=r.filter((function(e){return Object.getOwnPropertyDescriptor(t,e).enumerable}))),n.push.apply(n,r)}return n}function i(t){for(var e=1;e{const e=n(26),{Task:r}=n(49),{ScriptingError:o}="./exceptions";t.exports=class{constructor(t,e,n){this.sessionType=n instanceof r?"task":"job",this.id=n.id,this.version=t,this.collection=e,this.initialObjects={},this.hash=this._getHash();const i=this.collection.export();this._resetState();for(const t of i.shapes)this.initialObjects.shapes[t.id]=t;for(const t of i.tracks)this.initialObjects.tracks[t.id]=t;for(const t of i.tags)this.initialObjects.tags[t.id]=t}_resetState(){this.initialObjects={shapes:{},tracks:{},tags:{}}}_getHash(){const t=this.collection.export();return JSON.stringify(t)}async _request(t,n){return await e.annotations.updateAnnotations(this.sessionType,this.id,t,n)}async _put(t){return await this._request(t,"put")}async _create(t){return await this._request(t,"create")}async _update(t){return await this._request(t,"update")}async _delete(t){return await this._request(t,"delete")}_split(t){const e={created:{shapes:[],tracks:[],tags:[]},updated:{shapes:[],tracks:[],tags:[]},deleted:{shapes:[],tracks:[],tags:[]}};for(const n of Object.keys(t))for(const r of t[n])if(r.id in this.initialObjects[n]){JSON.stringify(r)!==JSON.stringify(this.initialObjects[n][r.id])&&e.updated[n].push(r)}else{if(void 0!==r.id)throw new o(`Id of object is defined "${r.id}"`+"but it absents in initial state");e.created[n].push(r)}const n={shapes:t.shapes.map(t=>+t.id),tracks:t.tracks.map(t=>+t.id),tags:t.tags.map(t=>+t.id)};for(const t of Object.keys(this.initialObjects))for(const r of Object.keys(this.initialObjects[t]))if(!n[t].includes(+r)){const n=this.initialObjects[t][r];e.deleted[t].push(n)}return e}_updateCreatedObjects(t,e){const n=t.tracks.length+t.shapes.length+t.tags.length,r=e.tracks.length+e.shapes.length+e.tags.length;if(r!==n)throw new o("Number of indexes is differed by number of saved objects"+`${r} vs ${n}`);for(const n of Object.keys(e))for(let r=0;rt.clientID),shapes:t.shapes.map(t=>t.clientID),tags:t.tags.map(t=>t.clientID)};return t.tracks.concat(t.shapes).concat(t.tags).map(t=>(delete t.clientID,t)),e}async save(t){"function"!=typeof t&&(t=t=>{console.log(t)});try{const e=this.collection.export(),{flush:n}=this.collection;if(n){t("New objects are being saved..");const n=this._receiveIndexes(e),r=await this._put(i({},e,{version:this.version}));this.version=r.version,this.collection.flush=!1,t("Saved objects are being updated in the client"),this._updateCreatedObjects(r,n),t("Initial state is being updated"),this._resetState();for(const t of Object.keys(this.initialObjects))for(const e of r[t])this.initialObjects[t][e.id]=e}else{const{created:n,updated:r,deleted:o}=this._split(e);t("New objects are being saved..");const s=this._receiveIndexes(n),a=await this._create(i({},n,{version:this.version}));this.version=a.version,t("Saved objects are being updated in the client"),this._updateCreatedObjects(a,s),t("Initial state is being updated");for(const t of Object.keys(this.initialObjects))for(const e of a[t])this.initialObjects[t][e.id]=e;t("Changed objects are being saved.."),this._receiveIndexes(r);const c=await this._update(i({},r,{version:this.version}));this.version=c.version,t("Initial state is being updated");for(const t of Object.keys(this.initialObjects))for(const e of c[t])this.initialObjects[t][e.id]=e;t("Changed objects are being saved.."),this._receiveIndexes(o);const u=await this._delete(i({},o,{version:this.version}));this._version=u.version,t("Initial state is being updated");for(const t of Object.keys(this.initialObjects))for(const e of u[t])delete this.initialObjects[t][e.id]}this.hash=this._getHash(),t("Saving is done")}catch(e){throw t(`Can not save annotations: ${e.message}`),e}}hasUnsavedChanges(){return this._getHash()!==this.hash}}})()},function(t){t.exports=JSON.parse('{"name":"cvat-core.js","version":"0.1.0","description":"Part of Computer Vision Tool which presents an interface for client-side integration","main":"babel.config.js","scripts":{"build":"webpack","test":"jest --config=jest.config.js --coverage","docs":"jsdoc --readme README.md src/*.js -p -c jsdoc.config.js -d docs","coveralls":"cat ./reports/coverage/lcov.info | coveralls"},"author":"Intel","license":"MIT","devDependencies":{"@babel/cli":"^7.4.4","@babel/core":"^7.4.4","@babel/preset-env":"^7.4.4","airbnb":"0.0.2","babel-eslint":"^10.0.1","babel-loader":"^8.0.6","core-js":"^3.0.1","coveralls":"^3.0.5","eslint":"6.1.0","eslint-config-airbnb-base":"14.0.0","eslint-plugin-import":"2.18.2","eslint-plugin-no-unsafe-innerhtml":"^1.0.16","eslint-plugin-no-unsanitized":"^3.0.2","eslint-plugin-security":"^1.4.0","jest":"^24.8.0","jest-junit":"^6.4.0","jsdoc":"^3.6.2","webpack":"^4.31.0","webpack-cli":"^3.3.2"},"dependencies":{"axios":"^0.18.0","browser-or-node":"^1.2.1","error-stack-parser":"^2.0.2","form-data":"^2.5.0","jest-config":"^24.8.0","js-cookie":"^2.2.0","platform":"^1.3.5","store":"^2.0.12"}}')},function(t,e,n){n(5),n(11),n(10),n(254),(()=>{const e=n(36),r=n(26),{isBoolean:i,isInteger:o,isEnum:s,isString:a,checkFilter:c}=n(56),{TaskStatus:u,TaskMode:l}=n(29),f=n(69),{AnnotationFormat:p}=n(138),{ArgumentError:h}=n(6),{Task:d}=n(49);function b(t,e){null!==t.assignee&&([t.assignee]=e.filter(e=>e.id===t.assignee));for(const n of t.segments)for(const t of n.jobs)null!==t.assignee&&([t.assignee]=e.filter(e=>e.id===t.assignee));return null!==t.owner&&([t.owner]=e.filter(e=>e.id===t.owner)),t}t.exports=function(t){return t.plugins.list.implementation=e.list,t.plugins.register.implementation=e.register.bind(t),t.server.about.implementation=async()=>{return await r.server.about()},t.server.share.implementation=async t=>{return await r.server.share(t)},t.server.formats.implementation=async()=>{return(await r.server.formats()).map(t=>new p(t))},t.server.datasetFormats.implementation=async()=>{return await r.server.datasetFormats()},t.server.register.implementation=async(t,e,n,i,o,s)=>{await r.server.register(t,e,n,i,o,s)},t.server.login.implementation=async(t,e)=>{await r.server.login(t,e)},t.server.logout.implementation=async()=>{await r.server.logout()},t.server.authorized.implementation=async()=>{return await r.server.authorized()},t.server.request.implementation=async(t,e)=>{return await r.server.request(t,e)},t.users.get.implementation=async t=>{c(t,{self:i});let e=null;return e=(e="self"in t&&t.self?[e=await r.users.getSelf()]:await r.users.getUsers()).map(t=>new f(t))},t.jobs.get.implementation=async t=>{if(c(t,{taskID:o,jobID:o}),"taskID"in t&&"jobID"in t)throw new h('Only one of fields "taskID" and "jobID" allowed simultaneously');if(!Object.keys(t).length)throw new h("Job filter must not be empty");let e=null;if("taskID"in t)e=await r.tasks.getTasks(`id=${t.taskID}`);else{const n=await r.jobs.getJob(t.jobID);void 0!==n.task_id&&(e=await r.tasks.getTasks(`id=${n.task_id}`))}if(null!==e&&e.length){const n=(await r.users.getUsers()).map(t=>new f(t)),i=new d(b(e[0],n));return t.jobID?i.jobs.filter(e=>e.id===t.jobID):i.jobs}return[]},t.tasks.get.implementation=async t=>{if(c(t,{page:o,name:a,id:o,owner:a,assignee:a,search:a,status:s.bind(u),mode:s.bind(l)}),"search"in t&&Object.keys(t).length>1&&!("page"in t&&2===Object.keys(t).length))throw new h('Do not use the filter field "search" with others');if("id"in t&&Object.keys(t).length>1&&!("page"in t&&2===Object.keys(t).length))throw new h('Do not use the filter field "id" with others');const e=new URLSearchParams;for(const n of["name","owner","assignee","search","status","mode","id","page"])Object.prototype.hasOwnProperty.call(t,n)&&e.set(n,t[n]);const n=(await r.users.getUsers()).map(t=>new f(t)),i=await r.tasks.getTasks(e.toString()),p=i.map(t=>b(t,n)).map(t=>new d(t));return p.count=i.count,p},t}})()},function(t,e,n){"use strict";n(255);var r,i=n(12),o=n(13),s=n(139),a=n(0),c=n(104),u=n(18),l=n(64),f=n(9),p=n(256),h=n(257),d=n(67).codeAt,b=n(259),m=n(33),g=n(260),v=n(25),y=a.URL,w=g.URLSearchParams,k=g.getState,x=v.set,O=v.getterFor("URL"),j=Math.floor,S=Math.pow,_=/[A-Za-z]/,A=/[\d+\-.A-Za-z]/,T=/\d/,P=/^(0x|0X)/,E=/^[0-7]+$/,C=/^\d+$/,I=/^[\dA-Fa-f]+$/,F=/[\u0000\u0009\u000A\u000D #%/:?@[\\]]/,M=/[\u0000\u0009\u000A\u000D #/:?@[\\]]/,N=/^[\u0000-\u001F ]+|[\u0000-\u001F ]+$/g,R=/[\u0009\u000A\u000D]/g,D=function(t,e){var n,r,i;if("["==e.charAt(0)){if("]"!=e.charAt(e.length-1))return"Invalid host";if(!(n=B(e.slice(1,-1))))return"Invalid host";t.host=n}else if(V(t)){if(e=b(e),F.test(e))return"Invalid host";if(null===(n=$(e)))return"Invalid host";t.host=n}else{if(M.test(e))return"Invalid host";for(n="",r=h(e),i=0;i4)return t;for(n=[],r=0;r1&&"0"==i.charAt(0)&&(o=P.test(i)?16:8,i=i.slice(8==o?1:2)),""===i)s=0;else{if(!(10==o?C:8==o?E:I).test(i))return t;s=parseInt(i,o)}n.push(s)}for(r=0;r=S(256,5-e))return null}else if(s>255)return null;for(a=n.pop(),r=0;r6)return;for(r=0;p();){if(i=null,r>0){if(!("."==p()&&r<4))return;f++}if(!T.test(p()))return;for(;T.test(p());){if(o=parseInt(p(),10),null===i)i=o;else{if(0==i)return;i=10*i+o}if(i>255)return;f++}c[u]=256*c[u]+i,2!=++r&&4!=r||u++}if(4!=r)return;break}if(":"==p()){if(f++,!p())return}else if(p())return;c[u++]=e}else{if(null!==l)return;f++,l=++u}}if(null!==l)for(s=u-l,u=7;0!=u&&s>0;)a=c[u],c[u--]=c[l+s-1],c[l+--s]=a;else if(8!=u)return;return c},U=function(t){var e,n,r,i;if("number"==typeof t){for(e=[],n=0;n<4;n++)e.unshift(t%256),t=j(t/256);return e.join(".")}if("object"==typeof t){for(e="",r=function(t){for(var e=null,n=1,r=null,i=0,o=0;o<8;o++)0!==t[o]?(i>n&&(e=r,n=i),r=null,i=0):(null===r&&(r=o),++i);return i>n&&(e=r,n=i),e}(t),n=0;n<8;n++)i&&0===t[n]||(i&&(i=!1),r===n?(e+=n?":":"::",i=!0):(e+=t[n].toString(16),n<7&&(e+=":")));return"["+e+"]"}return t},L={},z=p({},L,{" ":1,'"':1,"<":1,">":1,"`":1}),q=p({},z,{"#":1,"?":1,"{":1,"}":1}),W=p({},q,{"/":1,":":1,";":1,"=":1,"@":1,"[":1,"\\":1,"]":1,"^":1,"|":1}),G=function(t,e){var n=d(t,0);return n>32&&n<127&&!f(e,t)?t:encodeURIComponent(t)},J={ftp:21,file:null,http:80,https:443,ws:80,wss:443},V=function(t){return f(J,t.scheme)},H=function(t){return""!=t.username||""!=t.password},X=function(t){return!t.host||t.cannotBeABaseURL||"file"==t.scheme},K=function(t,e){var n;return 2==t.length&&_.test(t.charAt(0))&&(":"==(n=t.charAt(1))||!e&&"|"==n)},Z=function(t){var e;return t.length>1&&K(t.slice(0,2))&&(2==t.length||"/"===(e=t.charAt(2))||"\\"===e||"?"===e||"#"===e)},Y=function(t){var e=t.path,n=e.length;!n||"file"==t.scheme&&1==n&&K(e[0],!0)||e.pop()},Q=function(t){return"."===t||"%2e"===t.toLowerCase()},tt={},et={},nt={},rt={},it={},ot={},st={},at={},ct={},ut={},lt={},ft={},pt={},ht={},dt={},bt={},mt={},gt={},vt={},yt={},wt={},kt=function(t,e,n,i){var o,s,a,c,u,l=n||tt,p=0,d="",b=!1,m=!1,g=!1;for(n||(t.scheme="",t.username="",t.password="",t.host=null,t.port=null,t.path=[],t.query=null,t.fragment=null,t.cannotBeABaseURL=!1,e=e.replace(N,"")),e=e.replace(R,""),o=h(e);p<=o.length;){switch(s=o[p],l){case tt:if(!s||!_.test(s)){if(n)return"Invalid scheme";l=nt;continue}d+=s.toLowerCase(),l=et;break;case et:if(s&&(A.test(s)||"+"==s||"-"==s||"."==s))d+=s.toLowerCase();else{if(":"!=s){if(n)return"Invalid scheme";d="",l=nt,p=0;continue}if(n&&(V(t)!=f(J,d)||"file"==d&&(H(t)||null!==t.port)||"file"==t.scheme&&!t.host))return;if(t.scheme=d,n)return void(V(t)&&J[t.scheme]==t.port&&(t.port=null));d="","file"==t.scheme?l=ht:V(t)&&i&&i.scheme==t.scheme?l=rt:V(t)?l=at:"/"==o[p+1]?(l=it,p++):(t.cannotBeABaseURL=!0,t.path.push(""),l=vt)}break;case nt:if(!i||i.cannotBeABaseURL&&"#"!=s)return"Invalid scheme";if(i.cannotBeABaseURL&&"#"==s){t.scheme=i.scheme,t.path=i.path.slice(),t.query=i.query,t.fragment="",t.cannotBeABaseURL=!0,l=wt;break}l="file"==i.scheme?ht:ot;continue;case rt:if("/"!=s||"/"!=o[p+1]){l=ot;continue}l=ct,p++;break;case it:if("/"==s){l=ut;break}l=gt;continue;case ot:if(t.scheme=i.scheme,s==r)t.username=i.username,t.password=i.password,t.host=i.host,t.port=i.port,t.path=i.path.slice(),t.query=i.query;else if("/"==s||"\\"==s&&V(t))l=st;else if("?"==s)t.username=i.username,t.password=i.password,t.host=i.host,t.port=i.port,t.path=i.path.slice(),t.query="",l=yt;else{if("#"!=s){t.username=i.username,t.password=i.password,t.host=i.host,t.port=i.port,t.path=i.path.slice(),t.path.pop(),l=gt;continue}t.username=i.username,t.password=i.password,t.host=i.host,t.port=i.port,t.path=i.path.slice(),t.query=i.query,t.fragment="",l=wt}break;case st:if(!V(t)||"/"!=s&&"\\"!=s){if("/"!=s){t.username=i.username,t.password=i.password,t.host=i.host,t.port=i.port,l=gt;continue}l=ut}else l=ct;break;case at:if(l=ct,"/"!=s||"/"!=d.charAt(p+1))continue;p++;break;case ct:if("/"!=s&&"\\"!=s){l=ut;continue}break;case ut:if("@"==s){b&&(d="%40"+d),b=!0,a=h(d);for(var v=0;v65535)return"Invalid port";t.port=V(t)&&k===J[t.scheme]?null:k,d=""}if(n)return;l=mt;continue}return"Invalid port"}d+=s;break;case ht:if(t.scheme="file","/"==s||"\\"==s)l=dt;else{if(!i||"file"!=i.scheme){l=gt;continue}if(s==r)t.host=i.host,t.path=i.path.slice(),t.query=i.query;else if("?"==s)t.host=i.host,t.path=i.path.slice(),t.query="",l=yt;else{if("#"!=s){Z(o.slice(p).join(""))||(t.host=i.host,t.path=i.path.slice(),Y(t)),l=gt;continue}t.host=i.host,t.path=i.path.slice(),t.query=i.query,t.fragment="",l=wt}}break;case dt:if("/"==s||"\\"==s){l=bt;break}i&&"file"==i.scheme&&!Z(o.slice(p).join(""))&&(K(i.path[0],!0)?t.path.push(i.path[0]):t.host=i.host),l=gt;continue;case bt:if(s==r||"/"==s||"\\"==s||"?"==s||"#"==s){if(!n&&K(d))l=gt;else if(""==d){if(t.host="",n)return;l=mt}else{if(c=D(t,d))return c;if("localhost"==t.host&&(t.host=""),n)return;d="",l=mt}continue}d+=s;break;case mt:if(V(t)){if(l=gt,"/"!=s&&"\\"!=s)continue}else if(n||"?"!=s)if(n||"#"!=s){if(s!=r&&(l=gt,"/"!=s))continue}else t.fragment="",l=wt;else t.query="",l=yt;break;case gt:if(s==r||"/"==s||"\\"==s&&V(t)||!n&&("?"==s||"#"==s)){if(".."===(u=(u=d).toLowerCase())||"%2e."===u||".%2e"===u||"%2e%2e"===u?(Y(t),"/"==s||"\\"==s&&V(t)||t.path.push("")):Q(d)?"/"==s||"\\"==s&&V(t)||t.path.push(""):("file"==t.scheme&&!t.path.length&&K(d)&&(t.host&&(t.host=""),d=d.charAt(0)+":"),t.path.push(d)),d="","file"==t.scheme&&(s==r||"?"==s||"#"==s))for(;t.path.length>1&&""===t.path[0];)t.path.shift();"?"==s?(t.query="",l=yt):"#"==s&&(t.fragment="",l=wt)}else d+=G(s,q);break;case vt:"?"==s?(t.query="",l=yt):"#"==s?(t.fragment="",l=wt):s!=r&&(t.path[0]+=G(s,L));break;case yt:n||"#"!=s?s!=r&&("'"==s&&V(t)?t.query+="%27":t.query+="#"==s?"%23":G(s,L)):(t.fragment="",l=wt);break;case wt:s!=r&&(t.fragment+=G(s,z))}p++}},xt=function(t){var e,n,r=l(this,xt,"URL"),i=arguments.length>1?arguments[1]:void 0,s=String(t),a=x(r,{type:"URL"});if(void 0!==i)if(i instanceof xt)e=O(i);else if(n=kt(e={},String(i)))throw TypeError(n);if(n=kt(a,s,null,e))throw TypeError(n);var c=a.searchParams=new w,u=k(c);u.updateSearchParams(a.query),u.updateURL=function(){a.query=String(c)||null},o||(r.href=jt.call(r),r.origin=St.call(r),r.protocol=_t.call(r),r.username=At.call(r),r.password=Tt.call(r),r.host=Pt.call(r),r.hostname=Et.call(r),r.port=Ct.call(r),r.pathname=It.call(r),r.search=Ft.call(r),r.searchParams=Mt.call(r),r.hash=Nt.call(r))},Ot=xt.prototype,jt=function(){var t=O(this),e=t.scheme,n=t.username,r=t.password,i=t.host,o=t.port,s=t.path,a=t.query,c=t.fragment,u=e+":";return null!==i?(u+="//",H(t)&&(u+=n+(r?":"+r:"")+"@"),u+=U(i),null!==o&&(u+=":"+o)):"file"==e&&(u+="//"),u+=t.cannotBeABaseURL?s[0]:s.length?"/"+s.join("/"):"",null!==a&&(u+="?"+a),null!==c&&(u+="#"+c),u},St=function(){var t=O(this),e=t.scheme,n=t.port;if("blob"==e)try{return new URL(e.path[0]).origin}catch(t){return"null"}return"file"!=e&&V(t)?e+"://"+U(t.host)+(null!==n?":"+n:""):"null"},_t=function(){return O(this).scheme+":"},At=function(){return O(this).username},Tt=function(){return O(this).password},Pt=function(){var t=O(this),e=t.host,n=t.port;return null===e?"":null===n?U(e):U(e)+":"+n},Et=function(){var t=O(this).host;return null===t?"":U(t)},Ct=function(){var t=O(this).port;return null===t?"":String(t)},It=function(){var t=O(this),e=t.path;return t.cannotBeABaseURL?e[0]:e.length?"/"+e.join("/"):""},Ft=function(){var t=O(this).query;return t?"?"+t:""},Mt=function(){return O(this).searchParams},Nt=function(){var t=O(this).fragment;return t?"#"+t:""},Rt=function(t,e){return{get:t,set:e,configurable:!0,enumerable:!0}};if(o&&c(Ot,{href:Rt(jt,(function(t){var e=O(this),n=String(t),r=kt(e,n);if(r)throw TypeError(r);k(e.searchParams).updateSearchParams(e.query)})),origin:Rt(St),protocol:Rt(_t,(function(t){var e=O(this);kt(e,String(t)+":",tt)})),username:Rt(At,(function(t){var e=O(this),n=h(String(t));if(!X(e)){e.username="";for(var r=0;r=n.length?{value:void 0,done:!0}:(t=r(n,i),e.index+=t.length,{value:t,done:!1})}))},function(t,e,n){"use strict";var r=n(13),i=n(3),o=n(105),s=n(92),a=n(84),c=n(37),u=n(85),l=Object.assign;t.exports=!l||i((function(){var t={},e={},n=Symbol();return t[n]=7,"abcdefghijklmnopqrst".split("").forEach((function(t){e[t]=t})),7!=l({},t)[n]||"abcdefghijklmnopqrst"!=o(l({},e)).join("")}))?function(t,e){for(var n=c(t),i=arguments.length,l=1,f=s.f,p=a.f;i>l;)for(var h,d=u(arguments[l++]),b=f?o(d).concat(f(d)):o(d),m=b.length,g=0;m>g;)h=b[g++],r&&!p.call(d,h)||(n[h]=d[h]);return n}:l},function(t,e,n){"use strict";var r=n(47),i=n(37),o=n(97),s=n(96),a=n(45),c=n(258),u=n(48);t.exports=function(t){var e,n,l,f,p,h=i(t),d="function"==typeof this?this:Array,b=arguments.length,m=b>1?arguments[1]:void 0,g=void 0!==m,v=0,y=u(h);if(g&&(m=r(m,b>2?arguments[2]:void 0,2)),null==y||d==Array&&s(y))for(n=new d(e=a(h.length));e>v;v++)c(n,v,g?m(h[v],v):h[v]);else for(p=(f=y.call(h)).next,n=new d;!(l=p.call(f)).done;v++)c(n,v,g?o(f,m,[l.value,v],!0):l.value);return n.length=v,n}},function(t,e,n){"use strict";var r=n(58),i=n(21),o=n(42);t.exports=function(t,e,n){var s=r(e);s in t?i.f(t,s,o(0,n)):t[s]=n}},function(t,e,n){"use strict";var r=/[^\0-\u007E]/,i=/[.\u3002\uFF0E\uFF61]/g,o="Overflow: input needs wider integers to process",s=Math.floor,a=String.fromCharCode,c=function(t){return t+22+75*(t<26)},u=function(t,e,n){var r=0;for(t=n?s(t/700):t>>1,t+=s(t/e);t>455;r+=36)t=s(t/35);return s(r+36*t/(t+38))},l=function(t){var e,n,r=[],i=(t=function(t){for(var e=[],n=0,r=t.length;n=55296&&i<=56319&&n=l&&ns((2147483647-f)/m))throw RangeError(o);for(f+=(b-l)*m,l=b,e=0;e2147483647)throw RangeError(o);if(n==l){for(var g=f,v=36;;v+=36){var y=v<=p?1:v>=p+26?26:v-p;if(g0?arguments[0]:void 0,p=this,g=[];if(v(p,{type:"URLSearchParams",entries:g,updateURL:function(){},updateSearchParams:C}),void 0!==u)if(d(u))if("function"==typeof(t=m(u)))for(n=(e=t.call(u)).next;!(r=n.call(e)).done;){if((s=(o=(i=b(h(r.value))).next).call(i)).done||(a=o.call(i)).done||!o.call(i).done)throw TypeError("Expected sequence with length 2");g.push({key:s.value+"",value:a.value+""})}else for(c in u)f(u,c)&&g.push({key:c,value:u[c]+""});else E(g,"string"==typeof u?"?"===u.charAt(0)?u.slice(1):u:u+"")},N=M.prototype;s(N,{append:function(t,e){I(arguments.length,2);var n=y(this);n.entries.push({key:t+"",value:e+""}),n.updateURL()},delete:function(t){I(arguments.length,1);for(var e=y(this),n=e.entries,r=t+"",i=0;it.key){i.splice(e,0,t);break}e===n&&i.push(t)}r.updateURL()},forEach:function(t){for(var e,n=y(this).entries,r=p(t,arguments.length>1?arguments[1]:void 0,3),i=0;i { - for (let chunk_idx in this._requestedChunks){ + for (const chunk_idx in this._requestedChunks) { if(this._requestedChunks.hasOwnProperty(chunk_idx)) { try { const chunkFrames = await this.requestOneChunkFrames(chunk_idx); @@ -203,8 +204,11 @@ class FrameBuffer extends Listener { const frame = this._buffer[frameNumber]; delete this._buffer[frameNumber]; return frame; + } else { + this.clear(); + return this._frameProvider.require(frameNumber); } - return this._frameProvider.require(frameNumber); + } clear() { @@ -240,7 +244,7 @@ class PlayerModel extends Listener { this._pauseFlag = null; this._chunkSize = window.cvat.job.chunk_size; this._frameProvider = new FrameProviderWrapper(this._frame.stop); - this._bufferSize = 36; + this._bufferSize = 107; this._frameBuffer = new FrameBuffer(this._bufferSize, this._frameProvider, this._chunkSize, this._frame.stop); this._continueAfterLoad = false; // this._continueTimeout = null; @@ -384,13 +388,14 @@ class PlayerModel extends Listener { // } // } - if (this._bufferedFrames.size < this._bufferSize / 2) { - const startFrame = this._bufferedFrames.size ? Math.max(...this._bufferedFrames) : requestedFrame; + // if (this._bufferedFrames.size < this._bufferSize / 2) { + if (this._bufferedFrames.size === 0 && requestedFrame <= this._frame.stop) { + const startFrame = requestedFrame; fillBufferRequest(startFrame); } if (!this._bufferedFrames.size) { - setTimeout(checkFunction, 50); + setTimeout(checkFunction, 500); return; } @@ -424,8 +429,6 @@ class PlayerModel extends Listener { }); }; - // fillBufferRequest(); - const checkFunction = () => { if (this._activeBufrequest && !this._bufferedFrames.size) { // console.log(`Wait buffering of frames`); @@ -436,8 +439,6 @@ class PlayerModel extends Listener { } }; - // setTimeout(checkFunction, 300); - setTimeout(playFunc, timeout); } @@ -1105,9 +1106,6 @@ class PlayerView { } onPlayerUpdate(model) { - const t1 = performance.now(); - console.log(`update call diff ${t1 - this._updateCall}`); - this._updateCall = t1; const { image } = model; const { frames } = model; const { geometry } = model; From ccbda7d7516191459a9e3d6a696f895dc44585f8 Mon Sep 17 00:00:00 2001 From: Andrey Zhavoronkov Date: Mon, 23 Dec 2019 11:57:38 +0300 Subject: [PATCH 097/188] wip --- cvat/apps/engine/static/engine/js/player.js | 60 +++++++++++++-------- 1 file changed, 38 insertions(+), 22 deletions(-) diff --git a/cvat/apps/engine/static/engine/js/player.js b/cvat/apps/engine/static/engine/js/player.js index 7c0d5d4da89c..b196ab386d2f 100644 --- a/cvat/apps/engine/static/engine/js/player.js +++ b/cvat/apps/engine/static/engine/js/player.js @@ -58,7 +58,7 @@ class FrameProviderWrapper extends Listener { }).catch((error) => { if (typeof (error) === 'number') { if (this._required === error) { - console.log('Unexpecter error. Requested frame was rejected'); + console.log(`Unexpecter error. Requested frame ${error} was rejected`); } else { console.log(`${error} rejected - ok`); } @@ -69,10 +69,9 @@ class FrameProviderWrapper extends Listener { } catch (error) { if (typeof (error) === 'number') { if (this._required === error) { - console.log('Unexpecter error. Requested frame was rejected'); + console.log(`Unexpecter error. Requested frame ${error} was rejected`); } else { console.log(`${error} rejected - ok`); - throw error; } } else { throw error; @@ -139,8 +138,6 @@ class FrameBuffer extends Listener { this._frameProvider.require(requestedFrame).then(frameData => { if (!this._requestedChunks[chunk_idx].requestedFrames.has(requestedFrame)) { reject(); - // this._requestedFrames.clear(); - // this._buffer = {}; } if (frameData !== null) { @@ -152,13 +149,14 @@ class FrameBuffer extends Listener { } } }).catch( error => { - console.log('TODO: handle excepton correctly ' + error); + reject(error); }); } }); } fillBuffer(startFrame, frameStep) { + console.log(`FrameBuffer:Fill buffer request`); const freeSize = this.getFreeBufferSize(); const stopFrame = Math.min(startFrame + frameStep * freeSize, this._stopFrame + 1); @@ -183,16 +181,18 @@ class FrameBuffer extends Listener { if(this._requestedChunks.hasOwnProperty(chunk_idx)) { try { const chunkFrames = await this.requestOneChunkFrames(chunk_idx); - bufferedFrames = new Set([...bufferedFrames, ...chunkFrames]); - this._buffer = {...this._buffer, ...this._requestedChunks[chunk_idx].buffer}; - delete this._requestedChunks[chunk_idx]; - if (Object.keys(this._requestedChunks).length === 0){ - resolve(bufferedFrames); + if (chunk_idx in this._requestedChunks) { + bufferedFrames = new Set([...bufferedFrames, ...chunkFrames]); + this._buffer = {...this._buffer, ...this._requestedChunks[chunk_idx].buffer}; + delete this._requestedChunks[chunk_idx]; + if (Object.keys(this._requestedChunks).length === 0){ + resolve(bufferedFrames); + } + } else { + reject(); } - } catch (error) { - // need to cleanup - reject(); + reject(error); } } } @@ -208,13 +208,18 @@ class FrameBuffer extends Listener { this.clear(); return this._frameProvider.require(frameNumber); } - } clear() { this._requestedChunks = {}; this._buffer = {}; } + + deleteFrame(frameNumber){ + if (frameNumber in this._buffer) { + delete this._buffer[frameNumber]; + } + } } const MAX_PLAYER_SCALE = 10; @@ -244,7 +249,7 @@ class PlayerModel extends Listener { this._pauseFlag = null; this._chunkSize = window.cvat.job.chunk_size; this._frameProvider = new FrameProviderWrapper(this._frame.stop); - this._bufferSize = 107; + this._bufferSize = 500; this._frameBuffer = new FrameBuffer(this._bufferSize, this._frameProvider, this._chunkSize, this._frame.stop); this._continueAfterLoad = false; // this._continueTimeout = null; @@ -367,8 +372,14 @@ class PlayerModel extends Listener { this._playing = true; const timeout = 1000 / this._settings.fps; this._frame.requested.clear(); - // this._frameBuffer.clear(); - this._bufferedFrames.clear(); + + for (const bufferedFrame in this._bufferedFrames) { + if (bufferedFrame <= this._frame.current) { + this._bufferedFrames.delete(bufferedFrame); + this._frameBuffer.deleteFrame(bufferedFrame); + } + } + // this._bufferedFrames.clear(); const playFunc = async () => { if (this._pauseFlag) { // pause method without notify (for frame downloading) @@ -389,8 +400,12 @@ class PlayerModel extends Listener { // } // if (this._bufferedFrames.size < this._bufferSize / 2) { - if (this._bufferedFrames.size === 0 && requestedFrame <= this._frame.stop) { - const startFrame = requestedFrame; + // if (this._bufferedFrames.size === 0 && requestedFrame <= this._frame.stop) { + if (this._bufferedFrames.size < this._bufferSize / 2 && requestedFrame <= this._frame.stop) { + let startFrame = requestedFrame; + if (this._bufferedFrames.size !== 0) { + startFrame = Math.max(...this._bufferedFrames) + 1; + } fillBufferRequest(startFrame); } @@ -412,10 +427,11 @@ class PlayerModel extends Listener { if (this._activeBufrequest) { return; } + console.log(`Fill buffer request`); this._activeBufrequest = true; this._frameBuffer.fillBuffer(startFrame, skip).then((bufferedFrames) => { - // console.log(`Buffer is ready`); + console.log(`Buffer is ready`); this._bufferedFrames = new Set([...this._bufferedFrames, ...bufferedFrames]); if ((!this._pauseFlag || this._continueAfterLoad) && !this._playInterval) { this._continueAfterLoad = false; @@ -431,7 +447,7 @@ class PlayerModel extends Listener { const checkFunction = () => { if (this._activeBufrequest && !this._bufferedFrames.size) { - // console.log(`Wait buffering of frames`); + console.log(`Wait buffering of frames`); this._image = null; this._continueAfterLoad = this.playing; this._pauseFlag = true; From 1f25caa8c2e7bb79266720f2da594ee6903424ab Mon Sep 17 00:00:00 2001 From: Andrey Zhavoronkov Date: Mon, 23 Dec 2019 19:32:10 +0300 Subject: [PATCH 098/188] added frame buffer --- cvat-data/src/js/cvat-data.js | 14 +- .../engine/static/engine/js/annotationUI.js | 4 +- .../engine/static/engine/js/cvat-core.min.js | 2 +- cvat/apps/engine/static/engine/js/player.js | 235 +++++++++--------- 4 files changed, 129 insertions(+), 126 deletions(-) diff --git a/cvat-data/src/js/cvat-data.js b/cvat-data/src/js/cvat-data.js index c01ae54ac900..b5423eca3c7e 100755 --- a/cvat-data/src/js/cvat-data.js +++ b/cvat-data/src/js/cvat-data.js @@ -290,8 +290,6 @@ class FrameProvider { }); } this._decodeThreadCount++; - release(); - } else { const worker = new Worker('/static/engine/js/unzip_imgs.js'); @@ -310,11 +308,6 @@ class FrameProvider { this._decodeThreadCount--; }; - worker.postMessage({block : block, - start : start, - end : end }); - this._decodeThreadCount++; - worker.onmessage = (event) => { this._frames[event.data.index] = { data: event.data.data, @@ -336,8 +329,13 @@ class FrameProvider { } }; - release(); + worker.postMessage({block : block, + start : start, + end : end }); + this._decodeThreadCount++; + } + release(); } get decodeThreadCount() diff --git a/cvat/apps/engine/static/engine/js/annotationUI.js b/cvat/apps/engine/static/engine/js/annotationUI.js index 839b021590bb..d79c592e5b83 100644 --- a/cvat/apps/engine/static/engine/js/annotationUI.js +++ b/cvat/apps/engine/static/engine/js/annotationUI.js @@ -640,7 +640,9 @@ function buildAnnotationUI(jobData, taskData, imageMetaData, annotationData, ann playerModel.subscribe(shapeBufferView); playerModel.subscribe(shapeGrouperView); playerModel.subscribe(polyshapeEditorView); - playerModel.shift(window.cvat.search.get('frame') || 0, true); + playerModel.shift(window.cvat.search.get('frame') || 0, true).then( () => { + setTimeout( () => playerModel.fillBuffer(1 + (window.cvat.search.get('frame') || 0), 1, playerModel.bufferSize), 5000); + }); const { shortkeys } = window.cvat.config; diff --git a/cvat/apps/engine/static/engine/js/cvat-core.min.js b/cvat/apps/engine/static/engine/js/cvat-core.min.js index 62ace20105ac..81e19dda9915 100644 --- a/cvat/apps/engine/static/engine/js/cvat-core.min.js +++ b/cvat/apps/engine/static/engine/js/cvat-core.min.js @@ -11,5 +11,5 @@ window.cvat=function(t){var e={};function n(r){if(e[r])return e[r].exports;var i * @author Feross Aboukhadijeh * @license MIT */ -t.exports=function(t){return null!=t&&null!=t.constructor&&"function"==typeof t.constructor.isBuffer&&t.constructor.isBuffer(t)}},function(t,e,n){"use strict";var r=n(68),i=n(7),o=n(193),s=n(194);function a(t){this.defaults=t,this.interceptors={request:new o,response:new o}}a.prototype.request=function(t){"string"==typeof t&&(t=i.merge({url:arguments[0]},arguments[1])),(t=i.merge(r,{method:"get"},this.defaults,t)).method=t.method.toLowerCase();var e=[s,void 0],n=Promise.resolve(t);for(this.interceptors.request.forEach((function(t){e.unshift(t.fulfilled,t.rejected)})),this.interceptors.response.forEach((function(t){e.push(t.fulfilled,t.rejected)}));e.length;)n=n.then(e.shift(),e.shift());return n},i.forEach(["delete","get","head","options"],(function(t){a.prototype[t]=function(e,n){return this.request(i.merge(n||{},{method:t,url:e}))}})),i.forEach(["post","put","patch"],(function(t){a.prototype[t]=function(e,n,r){return this.request(i.merge(r||{},{method:t,url:e,data:n}))}})),t.exports=a},function(t,e,n){"use strict";var r=n(7);t.exports=function(t,e){r.forEach(t,(function(n,r){r!==e&&r.toUpperCase()===e.toUpperCase()&&(t[e]=n,delete t[r])}))}},function(t,e,n){"use strict";var r=n(114);t.exports=function(t,e,n){var i=n.config.validateStatus;n.status&&i&&!i(n.status)?e(r("Request failed with status code "+n.status,n.config,null,n.request,n)):t(n)}},function(t,e,n){"use strict";t.exports=function(t,e,n,r,i){return t.config=e,n&&(t.code=n),t.request=r,t.response=i,t}},function(t,e,n){"use strict";var r=n(7);function i(t){return encodeURIComponent(t).replace(/%40/gi,"@").replace(/%3A/gi,":").replace(/%24/g,"$").replace(/%2C/gi,",").replace(/%20/g,"+").replace(/%5B/gi,"[").replace(/%5D/gi,"]")}t.exports=function(t,e,n){if(!e)return t;var o;if(n)o=n(e);else if(r.isURLSearchParams(e))o=e.toString();else{var s=[];r.forEach(e,(function(t,e){null!=t&&(r.isArray(t)?e+="[]":t=[t],r.forEach(t,(function(t){r.isDate(t)?t=t.toISOString():r.isObject(t)&&(t=JSON.stringify(t)),s.push(i(e)+"="+i(t))})))})),o=s.join("&")}return o&&(t+=(-1===t.indexOf("?")?"?":"&")+o),t}},function(t,e,n){"use strict";var r=n(7),i=["age","authorization","content-length","content-type","etag","expires","from","host","if-modified-since","if-unmodified-since","last-modified","location","max-forwards","proxy-authorization","referer","retry-after","user-agent"];t.exports=function(t){var e,n,o,s={};return t?(r.forEach(t.split("\n"),(function(t){if(o=t.indexOf(":"),e=r.trim(t.substr(0,o)).toLowerCase(),n=r.trim(t.substr(o+1)),e){if(s[e]&&i.indexOf(e)>=0)return;s[e]="set-cookie"===e?(s[e]?s[e]:[]).concat([n]):s[e]?s[e]+", "+n:n}})),s):s}},function(t,e,n){"use strict";var r=n(7);t.exports=r.isStandardBrowserEnv()?function(){var t,e=/(msie|trident)/i.test(navigator.userAgent),n=document.createElement("a");function i(t){var r=t;return e&&(n.setAttribute("href",r),r=n.href),n.setAttribute("href",r),{href:n.href,protocol:n.protocol?n.protocol.replace(/:$/,""):"",host:n.host,search:n.search?n.search.replace(/^\?/,""):"",hash:n.hash?n.hash.replace(/^#/,""):"",hostname:n.hostname,port:n.port,pathname:"/"===n.pathname.charAt(0)?n.pathname:"/"+n.pathname}}return t=i(window.location.href),function(e){var n=r.isString(e)?i(e):e;return n.protocol===t.protocol&&n.host===t.host}}():function(){return!0}},function(t,e,n){"use strict";var r=n(7);t.exports=r.isStandardBrowserEnv()?{write:function(t,e,n,i,o,s){var a=[];a.push(t+"="+encodeURIComponent(e)),r.isNumber(n)&&a.push("expires="+new Date(n).toGMTString()),r.isString(i)&&a.push("path="+i),r.isString(o)&&a.push("domain="+o),!0===s&&a.push("secure"),document.cookie=a.join("; ")},read:function(t){var e=document.cookie.match(new RegExp("(^|;\\s*)("+t+")=([^;]*)"));return e?decodeURIComponent(e[3]):null},remove:function(t){this.write(t,"",Date.now()-864e5)}}:{write:function(){},read:function(){return null},remove:function(){}}},function(t,e,n){"use strict";var r=n(7);function i(){this.handlers=[]}i.prototype.use=function(t,e){return this.handlers.push({fulfilled:t,rejected:e}),this.handlers.length-1},i.prototype.eject=function(t){this.handlers[t]&&(this.handlers[t]=null)},i.prototype.forEach=function(t){r.forEach(this.handlers,(function(e){null!==e&&t(e)}))},t.exports=i},function(t,e,n){"use strict";var r=n(7),i=n(195),o=n(115),s=n(68),a=n(196),c=n(197);function u(t){t.cancelToken&&t.cancelToken.throwIfRequested()}t.exports=function(t){return u(t),t.baseURL&&!a(t.url)&&(t.url=c(t.baseURL,t.url)),t.headers=t.headers||{},t.data=i(t.data,t.headers,t.transformRequest),t.headers=r.merge(t.headers.common||{},t.headers[t.method]||{},t.headers||{}),r.forEach(["delete","get","head","post","put","patch","common"],(function(e){delete t.headers[e]})),(t.adapter||s.adapter)(t).then((function(e){return u(t),e.data=i(e.data,e.headers,t.transformResponse),e}),(function(e){return o(e)||(u(t),e&&e.response&&(e.response.data=i(e.response.data,e.response.headers,t.transformResponse))),Promise.reject(e)}))}},function(t,e,n){"use strict";var r=n(7);t.exports=function(t,e,n){return r.forEach(n,(function(n){t=n(t,e)})),t}},function(t,e,n){"use strict";t.exports=function(t){return/^([a-z][a-z\d\+\-\.]*:)?\/\//i.test(t)}},function(t,e,n){"use strict";t.exports=function(t,e){return e?t.replace(/\/+$/,"")+"/"+e.replace(/^\/+/,""):t}},function(t,e,n){"use strict";var r=n(116);function i(t){if("function"!=typeof t)throw new TypeError("executor must be a function.");var e;this.promise=new Promise((function(t){e=t}));var n=this;t((function(t){n.reason||(n.reason=new r(t),e(n.reason))}))}i.prototype.throwIfRequested=function(){if(this.reason)throw this.reason},i.source=function(){var t;return{token:new i((function(e){t=e})),cancel:t}},t.exports=i},function(t,e,n){"use strict";t.exports=function(t){return function(e){return t.apply(null,e)}}},function(t,e,n){"use strict";var r=n(12),i=n(201).trim;r({target:"String",proto:!0,forced:n(202)("trim")},{trim:function(){return i(this)}})},function(t,e,n){var r=n(31),i="["+n(118)+"]",o=RegExp("^"+i+i+"*"),s=RegExp(i+i+"*$"),a=function(t){return function(e){var n=String(r(e));return 1&t&&(n=n.replace(o,"")),2&t&&(n=n.replace(s,"")),n}};t.exports={start:a(1),end:a(2),trim:a(3)}},function(t,e,n){var r=n(3),i=n(118);t.exports=function(t){return r((function(){return!!i[t]()||"​…᠎"!="​…᠎"[t]()||i[t].name!==t}))}},function(t,e,n){(function(e){n(5),n(11),n(204),n(10),(()=>{const r=n(205),i=n(36),o=n(26),{isBrowser:s,isNode:a}=n(246),{Exception:c,ArgumentError:u}=n(6),l={};class f{constructor(t,e,n,r,i,o){Object.defineProperties(this,Object.freeze({width:{value:t,writable:!1},height:{value:e,writable:!1},tid:{value:n,writable:!1},number:{value:r,writable:!1},startFrame:{value:i,writable:!1},stopFrame:{value:o,writable:!1}}))}async data(t=(()=>{})){return await i.apiWrapper.call(this,f.prototype.data,t)}}f.prototype.data.implementation=async function(t){return new Promise(async(e,n)=>{const r=t=>{if(l[this.tid].activeChunkRequest&&b===l[this.tid].activeChunkRequest.chunkNumber){const e=l[this.tid].activeChunkRequest.callbacks;for(const n of e)n.resolve(f.frame(t));l[this.tid].activeChunkRequest=void 0}},i=()=>{if(l[this.tid].activeChunkRequest&&b===l[this.tid].activeChunkRequest.chunkNumber){for(const t of l[this.tid].activeChunkRequest.callbacks)t.reject(t.frameNumber);l[this.tid].activeChunkRequest=void 0}},u=()=>{const t=l[this.tid].activeChunkRequest;t.request=o.frames.getData(this.tid,t.chunkNumber).then(t=>{l[this.tid].activeChunkRequest.completed=!0,f.requestDecodeBlock(t,l[this.tid].activeChunkRequest.start,l[this.tid].activeChunkRequest.stop,l[this.tid].activeChunkRequest.onDecodeAll,l[this.tid].activeChunkRequest.rejectRequestAll)}).catch(t=>{n(t instanceof c?t:new c(t.message))}).finally(()=>{if(l[this.tid].nextChunkRequest){if(l[this.tid].activeChunkRequest)for(const t of l[this.tid].activeChunkRequest.callbacks)t.reject(t.frameNumber);l[this.tid].activeChunkRequest=l[this.tid].nextChunkRequest,l[this.tid].nextChunkRequest=void 0,u()}})},{provider:f}=l[this.tid],{chunkSize:p}=l[this.tid],h=Math.max(this.startFrame,parseInt(this.number/p,10)*p),d=Math.min(this.stopFrame,(parseInt(this.number/p,10)+1)*p-1),b=Math.floor(this.number/p);if(a)e("Dummy data");else if(s)try{const{decodedBlocksCacheSize:o}=l[this.tid];let s=await f.frame(this.number);if(null===s)if(t(),f.is_chunk_cached(h,d))l[this.tid].activeChunkRequest.callbacks.push({resolve:e,reject:n,frameNumber:this.number}),f.requestDecodeBlock(null,h,d,r,i);else if(!l[this.tid].activeChunkRequest||l[this.tid].activeChunkRequest&&l[this.tid].activeChunkRequest.completed)l[this.tid].activeChunkRequest&&l[this.tid].activeChunkRequest.rejectRequestAll(),l[this.tid].activeChunkRequest={request:void 0,chunkNumber:b,start:h,stop:d,onDecodeAll:r,rejectRequestAll:i,completed:!1,callbacks:[{resolve:e,reject:n,frameNumber:this.number}]},u();else if(l[this.tid].activeChunkRequest.chunkNumber===b)l[this.tid].activeChunkRequest.callbacks.push({resolve:e,reject:n,frameNumber:this.number});else{if(l[this.tid].nextChunkRequest)for(const t of l[this.tid].nextChunkRequest.callbacks)t.reject(t.frameNumber);l[this.tid].nextChunkRequest={request:void 0,chunkNumber:b,start:h,stop:d,onDecodeAll:r,rejectRequestAll:i,completed:!1,callbacks:[{resolve:e,reject:n,frameNumber:this.number}]}}else e(s)}catch(t){n(t instanceof c?t:new c(t.message))}})},t.exports={FrameData:f,getFrame:async function(t,e,n,i,s,a,c){if(!(t in l)){const i="video"===n?r.BlockType.MP4VIDEO:r.BlockType.ARCHIVE,a=await o.frames.getMeta(t),c=i===r.BlockType.MP4VIDEO?Math.floor(258.90765432098766/e)||1:Math.floor(500/e)||1;l[t]={meta:a,chunkSize:e,provider:new r.FrameProvider(i,e,9,c,1),lastFrameRequest:s,decodedBlocksCacheSize:c,activeChunkRequest:void 0,nextChunkRequest:void 0}}const p=(t=>{let e=null;if("interpolation"===i)[e]=t;else{if("annotation"!==i)throw new u(`Invalid mode is specified ${i}`);if(s>=t.length)throw new u(`Meta information about frame ${s} can't be received from the server`);e=t[s]}return e})(l[t].meta);return l[t].lastFrameRequest=s,l[t].provider.setRenderSize(p.width,p.height),new f(p.width,p.height,t,s,a,c)},getRanges:function(t){return t in l?l[t].provider.cachedFrames:[]},getPreview:async function(t){return new Promise(async(n,r)=>{try{const r=await o.frames.getPreview(t);if(a)n(e.Buffer.from(r,"binary").toString("base64"));else if(s){const t=new FileReader;t.onload=()=>{n(t.result)},t.readAsDataURL(r)}}catch(t){r(t)}})}}})()}).call(this,n(30))},function(t,e,n){"use strict";var r=n(12),i=n(24),o=n(94),s=n(32),a=n(98),c=n(101),u=n(18);r({target:"Promise",proto:!0,real:!0},{finally:function(t){var e=a(this,s("Promise")),n="function"==typeof t;return this.then(n?function(n){return c(e,t()).then((function(){return n}))}:t,n?function(n){return c(e,t()).then((function(){throw n}))}:t)}}),i||"function"!=typeof o||o.prototype.finally||u(o.prototype,"finally",s("Promise").prototype.finally)},function(t,e,n){n(72),n(225),n(227),n(243);const{MP4Reader:r,Bytestream:i}=n(245),o=Object.freeze({MP4VIDEO:"mp4video",ARCHIVE:"archive"});class s{constructor(){this._lock=Promise.resolve()}_acquire(){var t;return this._lock=new Promise(e=>{t=e}),t}acquireQueued(){const t=this._lock.then(()=>e),e=this._acquire();return t}}t.exports={FrameProvider:class{constructor(t,e,n,r=5,i=2){this._frames={},this._cachedBlockCount=Math.max(1,n),this._decodedBlocksCacheSize=r,this._blocks_ranges=[],this._blocks={},this._blockSize=e,this._running=!1,this._blockType=t,this._currFrame=-1,this._requestedBlockDecode=null,this._width=null,this._height=null,this._decodingBlocks={},this._decodeThreadCount=0,this._timerId=setTimeout(this._worker.bind(this),100),this._mutex=new s,this._promisedFrames={},this._maxWorkerThreadCount=i}async _worker(){null!=this._requestedBlockDecode&&this._decodeThreadCountthis._cachedBlockCount){const t=this._blocks_ranges.shift(),[e,n]=t.split(":").map(t=>+t);delete this._blocks[e/this._blockSize];for(let t=e;t<=n;t++)delete this._frames[t]}const t=Math.floor(this._decodedBlocksCacheSize/2);for(let e=0;e+t);if(rthis._currFrame+t*this._blockSize)for(let t=n;t<=r;t++)delete this._frames[t]}}async requestDecodeBlock(t,e,n,r,i){const o=await this._mutex.acquireQueued();null!==this._requestedBlockDecode&&(e===this._requestedBlockDecode.start&&n===this._requestedBlockDecode.end?(this._requestedBlockDecode.resolveCallback=r,this._requestedBlockDecode.rejectCallback=i):this._requestedBlockDecode.rejectCallback&&this._requestedBlockDecode.rejectCallback()),`${e}:${n}`in this._decodingBlocks?(this._decodingBlocks[`${e}:${n}`].rejectCallback=i,this._decodingBlocks[`${e}:${n}`].resolveCallback=r):(null===t&&(t=this._blocks[Math.floor((e+1)/this.blockSize)]),this._requestedBlockDecode={block:t,start:e,end:n,resolveCallback:r,rejectCallback:i}),o()}isRequestExist(){return null!=this._requestedBlockDecode}setRenderSize(t,e){this._width=t,this._height=e}async frame(t){return this._currFrame=t,new Promise((e,n)=>{t in this._frames?null!==this._frames[t]?e(this._frames[t]):this._promisedFrames[t]={resolve:e,reject:n}:e(null)})}isNextChunkExists(t){const e=Math.floor(t/this._blockSize)+1;return"loading"===this._blocks[e]||e in this._blocks}setReadyToLoading(t){this._blocks[t]="loading"}cropImage(t,e,n,r,i,o,s){if(0===r&&o===e&&0===i&&s===n)return new ImageData(new Uint8ClampedArray(t),o,s);const a=new Uint32Array(t),c=o*s*4,u=new ArrayBuffer(c),l=new Uint32Array(u),f=new Uint8ClampedArray(u);if(e===o)return new ImageData(new Uint8ClampedArray(t,4*i,c),o,s);let p=0;for(let t=i;t{if(t.data.consoleLog)return;const r=Math.ceil(this._height/t.data.height);this._frames[u]=this.cropImage(t.data.buf,t.data.width,t.data.height,0,0,Math.floor(n/r),Math.floor(e/r)),this._decodingBlocks[`${s}:${a}`].resolveCallback&&this._decodingBlocks[`${s}:${a}`].resolveCallback(u),u in this._promisedFrames&&(this._promisedFrames[u].resolve(this._frames[u]),delete this._promisedFrames[u]),u===a&&(this._decodeThreadCount--,delete this._decodingBlocks[`${s}:${a}`],o.terminate()),u++},o.onerror=t=>{console.log(["ERROR: Line ",t.lineno," in ",t.filename,": ",t.message].join("")),o.terminate(),this._decodeThreadCount--;for(let t=u;t<=a;t++)t in this._promisedFrames&&(this._promisedFrames[t].reject(),delete this._promisedFrames[t]);this._decodingBlocks[`${s}:${a}`].rejectCallback&&this._decodingBlocks[`${s}:${a}`].rejectCallback(),delete this._decodingBlocks[`${s}:${a}`]},o.postMessage({type:"Broadway.js - Worker init",options:{rgb:!0,reuseMemory:!1}});const l=new r(new i(c));l.read();const f=l.tracks[1],p=l.tracks[1].trak.mdia.minf.stbl.stsd.avc1.avcC,h=p.sps[0],d=p.pps[0];o.postMessage({buf:h,offset:0,length:h.length}),o.postMessage({buf:d,offset:0,length:d.length});for(let t=0;t{o.postMessage({buf:t,offset:0,length:t.length})});this._decodeThreadCount++,t()}else{const r=new Worker("/static/engine/js/unzip_imgs.js");r.onerror=t=>{console.log(["ERROR: Line ",t.lineno," in ",t.filename,": ",t.message].join(""));for(let t=s;t<=a;t++)t in this._promisedFrames&&(this._promisedFrames[t].reject(),delete this._promisedFrames[t]);this._decodingBlocks[`${s}:${a}`].rejectCallback&&this._decodingBlocks[`${s}:${a}`].rejectCallback(),this._decodeThreadCount--},r.postMessage({block:c,start:s,end:a}),this._decodeThreadCount++,r.onmessage=t=>{this._frames[t.data.index]={data:t.data.data,width:n,height:e},this._decodingBlocks[`${s}:${a}`].resolveCallback&&this._decodingBlocks[`${s}:${a}`].resolveCallback(t.data.index),t.data.index in this._promisedFrames&&(this._promisedFrames[t.data.index].resolve(this._frames[t.data.index]),delete this._promisedFrames[t.data.index]),t.data.isEnd&&(delete this._decodingBlocks[`${s}:${a}`],this._decodeThreadCount--)},t()}}get decodeThreadCount(){return this._decodeThreadCount}get cachedFrames(){return[...this._blocks_ranges].sort((t,e)=>t.split(":")[0]-e.split(":")[0])}},BlockType:o}},function(t,e,n){var r=n(16),i=n(38),o="".split;t.exports=r((function(){return!Object("z").propertyIsEnumerable(0)}))?function(t){return"String"==i(t)?o.call(t,""):Object(t)}:Object},function(t,e,n){var r=n(8),i=n(123),o=n(19),s=r("unscopables"),a=Array.prototype;null==a[s]&&o(a,s,i(null)),t.exports=function(t){a[s][t]=!0}},function(t,e,n){var r=n(1),i=n(73),o=r["__core-js_shared__"]||i("__core-js_shared__",{});t.exports=o},function(t,e,n){var r=n(16);t.exports=!!Object.getOwnPropertySymbols&&!r((function(){return!String(Symbol())}))},function(t,e,n){var r=n(28),i=n(39),o=n(17),s=n(211);t.exports=r?Object.defineProperties:function(t,e){o(t);for(var n,r=s(e),a=r.length,c=0;a>c;)i.f(t,n=r[c++],e[n]);return t}},function(t,e,n){var r=n(124),i=n(77);t.exports=Object.keys||function(t){return r(t,i)}},function(t,e,n){var r=n(50),i=n(125),o=n(213),s=function(t){return function(e,n,s){var a,c=r(e),u=i(c.length),l=o(s,u);if(t&&n!=n){for(;u>l;)if((a=c[l++])!=a)return!0}else for(;u>l;l++)if((t||l in c)&&c[l]===n)return t||l||0;return!t&&-1}};t.exports={includes:s(!0),indexOf:s(!1)}},function(t,e,n){var r=n(126),i=Math.max,o=Math.min;t.exports=function(t,e){var n=r(t);return n<0?i(n+e,0):o(n,e)}},function(t,e,n){var r=n(1),i=n(129),o=r.WeakMap;t.exports="function"==typeof o&&/native code/.test(i.call(o))},function(t,e,n){"use strict";var r=n(80),i=n(221),o=n(132),s=n(223),a=n(82),c=n(19),u=n(54),l=n(8),f=n(52),p=n(40),h=n(131),d=h.IteratorPrototype,b=h.BUGGY_SAFARI_ITERATORS,m=l("iterator"),g=function(){return this};t.exports=function(t,e,n,l,h,v,y){i(n,e,l);var w,k,x,O=function(t){if(t===h&&T)return T;if(!b&&t in _)return _[t];switch(t){case"keys":case"values":case"entries":return function(){return new n(this,t)}}return function(){return new n(this)}},j=e+" Iterator",S=!1,_=t.prototype,A=_[m]||_["@@iterator"]||h&&_[h],T=!b&&A||O(h),P="Array"==e&&_.entries||A;if(P&&(w=o(P.call(new t)),d!==Object.prototype&&w.next&&(f||o(w)===d||(s?s(w,d):"function"!=typeof w[m]&&c(w,m,g)),a(w,j,!0,!0),f&&(p[j]=g))),"values"==h&&A&&"values"!==A.name&&(S=!0,T=function(){return A.call(this)}),f&&!y||_[m]===T||c(_,m,T),p[e]=T,h)if(k={values:O("values"),keys:v?T:O("keys"),entries:O("entries")},y)for(x in k)!b&&!S&&x in _||u(_,x,k[x]);else r({target:e,proto:!0,forced:b||S},k);return k}},function(t,e,n){"use strict";var r={}.propertyIsEnumerable,i=Object.getOwnPropertyDescriptor,o=i&&!r.call({1:2},1);e.f=o?function(t){var e=i(this,t);return!!e&&e.enumerable}:r},function(t,e,n){var r=n(20),i=n(218),o=n(81),s=n(39);t.exports=function(t,e){for(var n=i(e),a=s.f,c=o.f,u=0;us;){var a,c,u,l=r[s++],f=o?l.ok:l.fail,p=l.resolve,h=l.reject,d=l.domain;try{f?(o||(2===e.rejection&&et(t,e),e.rejection=1),!0===f?a=i:(d&&d.enter(),a=f(i),d&&(d.exit(),u=!0)),a===l.promise?h($("Promise-chain cycle")):(c=K(a))?c.call(a,p,h):p(a)):h(i)}catch(t){d&&!u&&d.exit(),h(t)}}e.reactions=[],e.notified=!1,n&&!e.rejection&&Q(t,e)}))}},Y=function(t,e,n){var r,i;V?((r=B.createEvent("Event")).promise=e,r.reason=n,r.initEvent(t,!1,!0),u.dispatchEvent(r)):r={promise:e,reason:n},(i=u["on"+t])?i(r):"unhandledrejection"===t&&_("Unhandled promise rejection",n)},Q=function(t,e){O.call(u,(function(){var n,r=e.value;if(tt(e)&&(n=T((function(){J?U.emit("unhandledRejection",r,t):Y("unhandledrejection",t,r)})),e.rejection=J||tt(e)?2:1,n.error))throw n.value}))},tt=function(t){return 1!==t.rejection&&!t.parent},et=function(t,e){O.call(u,(function(){J?U.emit("rejectionHandled",t):Y("rejectionhandled",t,e.value)}))},nt=function(t,e,n,r){return function(i){t(e,n,i,r)}},rt=function(t,e,n,r){e.done||(e.done=!0,r&&(e=r),e.value=n,e.state=2,Z(t,e,!0))},it=function(t,e,n,r){if(!e.done){e.done=!0,r&&(e=r);try{if(t===n)throw $("Promise can't be resolved itself");var i=K(n);i?j((function(){var r={done:!1};try{i.call(n,nt(it,t,r,e),nt(rt,t,r,e))}catch(n){rt(t,r,n,e)}})):(e.value=n,e.state=1,Z(t,e,!1))}catch(n){rt(t,{done:!1},n,e)}}};H&&(D=function(t){v(this,D,F),g(t),r.call(this);var e=M(this);try{t(nt(it,this,e),nt(rt,this,e))}catch(t){rt(this,e,t)}},(r=function(t){N(this,{type:F,done:!1,notified:!1,parent:!1,reactions:[],rejection:!1,state:0,value:void 0})}).prototype=h(D.prototype,{then:function(t,e){var n=R(this),r=W(x(this,D));return r.ok="function"!=typeof t||t,r.fail="function"==typeof e&&e,r.domain=J?U.domain:void 0,n.parent=!0,n.reactions.push(r),0!=n.state&&Z(this,n,!1),r.promise},catch:function(t){return this.then(void 0,t)}}),i=function(){var t=new r,e=M(t);this.promise=t,this.resolve=nt(it,t,e),this.reject=nt(rt,t,e)},A.f=W=function(t){return t===D||t===o?new i(t):G(t)},c||"function"!=typeof f||(s=f.prototype.then,p(f.prototype,"then",(function(t,e){var n=this;return new D((function(t,e){s.call(n,t,e)})).then(t,e)}),{unsafe:!0}),"function"==typeof L&&a({global:!0,enumerable:!0,forced:!0},{fetch:function(t){return S(D,L.apply(u,arguments))}}))),a({global:!0,wrap:!0,forced:H},{Promise:D}),d(D,F,!1,!0),b(F),o=l.Promise,a({target:F,stat:!0,forced:H},{reject:function(t){var e=W(this);return e.reject.call(void 0,t),e.promise}}),a({target:F,stat:!0,forced:c||H},{resolve:function(t){return S(c&&this===o?D:this,t)}}),a({target:F,stat:!0,forced:X},{all:function(t){var e=this,n=W(e),r=n.resolve,i=n.reject,o=T((function(){var n=g(e.resolve),o=[],s=0,a=1;w(t,(function(t){var c=s++,u=!1;o.push(void 0),a++,n.call(e,t).then((function(t){u||(u=!0,o[c]=t,--a||r(o))}),i)})),--a||r(o)}));return o.error&&i(o.value),n.promise},race:function(t){var e=this,n=W(e),r=n.reject,i=T((function(){var i=g(e.resolve);w(t,(function(t){i.call(e,t).then(n.resolve,r)}))}));return i.error&&r(i.value),n.promise}})},function(t,e,n){var r=n(1);t.exports=r.Promise},function(t,e,n){var r=n(54);t.exports=function(t,e,n){for(var i in e)r(t,i,e[i],n);return t}},function(t,e,n){"use strict";var r=n(53),i=n(39),o=n(8),s=n(28),a=o("species");t.exports=function(t){var e=r(t),n=i.f;s&&e&&!e[a]&&n(e,a,{configurable:!0,get:function(){return this}})}},function(t,e){t.exports=function(t,e,n){if(!(t instanceof e))throw TypeError("Incorrect "+(n?n+" ":"")+"invocation");return t}},function(t,e,n){var r=n(17),i=n(233),o=n(125),s=n(134),a=n(234),c=n(236),u=function(t,e){this.stopped=t,this.result=e};(t.exports=function(t,e,n,l,f){var p,h,d,b,m,g,v,y=s(e,n,l?2:1);if(f)p=t;else{if("function"!=typeof(h=a(t)))throw TypeError("Target is not iterable");if(i(h)){for(d=0,b=o(t.length);b>d;d++)if((m=l?y(r(v=t[d])[0],v[1]):y(t[d]))&&m instanceof u)return m;return new u(!1)}p=h.call(t)}for(g=p.next;!(v=g.call(p)).done;)if("object"==typeof(m=c(p,y,v.value,l))&&m&&m instanceof u)return m;return new u(!1)}).stop=function(t){return new u(!0,t)}},function(t,e,n){var r=n(8),i=n(40),o=r("iterator"),s=Array.prototype;t.exports=function(t){return void 0!==t&&(i.Array===t||s[o]===t)}},function(t,e,n){var r=n(235),i=n(40),o=n(8)("iterator");t.exports=function(t){if(null!=t)return t[o]||t["@@iterator"]||i[r(t)]}},function(t,e,n){var r=n(38),i=n(8)("toStringTag"),o="Arguments"==r(function(){return arguments}());t.exports=function(t){var e,n,s;return void 0===t?"Undefined":null===t?"Null":"string"==typeof(n=function(t,e){try{return t[e]}catch(t){}}(e=Object(t),i))?n:o?r(e):"Object"==(s=r(e))&&"function"==typeof e.callee?"Arguments":s}},function(t,e,n){var r=n(17);t.exports=function(t,e,n,i){try{return i?e(r(n)[0],n[1]):e(n)}catch(e){var o=t.return;throw void 0!==o&&r(o.call(t)),e}}},function(t,e,n){var r=n(8)("iterator"),i=!1;try{var o=0,s={next:function(){return{done:!!o++}},return:function(){i=!0}};s[r]=function(){return this},Array.from(s,(function(){throw 2}))}catch(t){}t.exports=function(t,e){if(!e&&!i)return!1;var n=!1;try{var o={};o[r]=function(){return{next:function(){return{done:n=!0}}}},t(o)}catch(t){}return n}},function(t,e,n){var r=n(17),i=n(41),o=n(8)("species");t.exports=function(t,e){var n,s=r(t).constructor;return void 0===s||null==(n=r(s)[o])?e:i(n)}},function(t,e,n){var r,i,o,s,a,c,u,l,f=n(1),p=n(81).f,h=n(38),d=n(135).set,b=n(83),m=f.MutationObserver||f.WebKitMutationObserver,g=f.process,v=f.Promise,y="process"==h(g),w=p(f,"queueMicrotask"),k=w&&w.value;k||(r=function(){var t,e;for(y&&(t=g.domain)&&t.exit();i;){e=i.fn,i=i.next;try{e()}catch(t){throw i?s():o=void 0,t}}o=void 0,t&&t.enter()},y?s=function(){g.nextTick(r)}:m&&!/(iphone|ipod|ipad).*applewebkit/i.test(b)?(a=!0,c=document.createTextNode(""),new m(r).observe(c,{characterData:!0}),s=function(){c.data=a=!a}):v&&v.resolve?(u=v.resolve(void 0),l=u.then,s=function(){l.call(u,r)}):s=function(){d.call(f,r)}),t.exports=k||function(t){var e={fn:t,next:void 0};o&&(o.next=e),i||(i=e,s()),o=e}},function(t,e,n){var r=n(17),i=n(22),o=n(136);t.exports=function(t,e){if(r(t),i(e)&&e.constructor===t)return e;var n=o.f(t);return(0,n.resolve)(e),n.promise}},function(t,e,n){var r=n(1);t.exports=function(t,e){var n=r.console;n&&n.error&&(1===arguments.length?n.error(t):n.error(t,e))}},function(t,e){t.exports=function(t){try{return{error:!1,value:t()}}catch(t){return{error:!0,value:t}}}},function(t,e,n){var r=n(1),i=n(244),o=n(72),s=n(19),a=n(8),c=a("iterator"),u=a("toStringTag"),l=o.values;for(var f in i){var p=r[f],h=p&&p.prototype;if(h){if(h[c]!==l)try{s(h,c,l)}catch(t){h[c]=l}if(h[u]||s(h,u,f),i[f])for(var d in o)if(h[d]!==o[d])try{s(h,d,o[d])}catch(t){h[d]=o[d]}}}},function(t,e){t.exports={CSSRuleList:0,CSSStyleDeclaration:0,CSSValueList:0,ClientRectList:0,DOMRectList:0,DOMStringList:0,DOMTokenList:1,DataTransferItemList:0,FileList:0,HTMLAllCollection:0,HTMLCollection:0,HTMLFormElement:0,HTMLSelectElement:0,MediaList:0,MimeTypeArray:0,NamedNodeMap:0,NodeList:1,PaintRequestList:0,Plugin:0,PluginArray:0,SVGLengthList:0,SVGNumberList:0,SVGPathSegList:0,SVGPointList:0,SVGStringList:0,SVGTransformList:0,SourceBufferList:0,StyleSheetList:0,TextTrackCueList:0,TextTrackList:0,TouchList:0}},function(t,e,n){n(72),t.exports=function(){"use strict";function t(t,e){t||error(e)}var e,n,r=function(){function t(t,e){this.w=t,this.h=e}return t.prototype={toString:function(){return"("+this.w+", "+this.h+")"},getHalfSize:function(){return new r(this.w>>>1,this.h>>>1)},length:function(){return this.w*this.h}},t}(),i=function(){function e(t,e,n){this.bytes=new Uint8Array(t),this.start=e||0,this.pos=this.start,this.end=e+n||this.bytes.length}return e.prototype={get length(){return this.end-this.start},get position(){return this.pos},get remaining(){return this.end-this.pos},readU8Array:function(t){if(this.pos>this.end-t)return null;var e=this.bytes.subarray(this.pos,this.pos+t);return this.pos+=t,e},readU32Array:function(t,e,n){if(e=e||1,this.pos>this.end-t*e*4)return null;if(1==e){for(var r=new Uint32Array(t),i=0;i>24},readU8:function(){return this.pos>=this.end?null:this.bytes[this.pos++]},read16:function(){return this.readU16()<<16>>16},readU16:function(){if(this.pos>=this.end-1)return null;var t=this.bytes[this.pos+0]<<8|this.bytes[this.pos+1];return this.pos+=2,t},read24:function(){return this.readU24()<<8>>8},readU24:function(){var t=this.pos,e=this.bytes;if(t>this.end-3)return null;var n=e[t+0]<<16|e[t+1]<<8|e[t+2];return this.pos+=3,n},peek32:function(t){var e=this.pos,n=this.bytes;if(e>this.end-4)return null;var r=n[e+0]<<24|n[e+1]<<16|n[e+2]<<8|n[e+3];return t&&(this.pos+=4),r},read32:function(){return this.peek32(!0)},readU32:function(){return this.peek32(!0)>>>0},read4CC:function(){var t=this.pos;if(t>this.end-4)return null;for(var e="",n=0;n<4;n++)e+=String.fromCharCode(this.bytes[t+n]);return this.pos+=4,e},readFP16:function(){return this.read32()/65536},readFP8:function(){return this.read16()/256},readISO639:function(){for(var t=this.readU16(),e="",n=0;n<3;n++){var r=t>>>5*(2-n)&31;e+=String.fromCharCode(r+96)}return e},readUTF8:function(t){for(var e="",n=0;nthis.end)&&error("Index out of bounds (bounds: [0, "+this.end+"], index: "+t+")."),this.pos=t},subStream:function(t,e){return new i(this.bytes.buffer,t,e)}},e}(),o=function(){function e(t){this.stream=t,this.tracks={}}return e.prototype={readBoxes:function(t,e){for(;t.peek32();){var n=this.readBox(t);if(n.type in e){var r=e[n.type];r instanceof Array||(e[n.type]=[r]),e[n.type].push(n)}else e[n.type]=n}},readBox:function(e){var n={offset:e.position};function r(){n.version=e.readU8(),n.flags=e.readU24()}function i(){return n.size-(e.position-n.offset)}function o(){e.skip(i())}var a=function(){var t=e.subStream(e.position,i());this.readBoxes(t,n),e.skip(t.length)}.bind(this);switch(n.size=e.readU32(),n.type=e.read4CC(),n.type){case"ftyp":n.name="File Type Box",n.majorBrand=e.read4CC(),n.minorVersion=e.readU32(),n.compatibleBrands=new Array((n.size-16)/4);for(var c=0;c0&&(n.name=e.readUTF8(u));break;case"minf":n.name="Media Information Box",a();break;case"stbl":n.name="Sample Table Box",a();break;case"stsd":n.name="Sample Description Box",r(),n.sd=[];e.readU32();a();break;case"avc1":e.reserved(6,0),n.dataReferenceIndex=e.readU16(),t(0==e.readU16()),t(0==e.readU16()),e.readU32(),e.readU32(),e.readU32(),n.width=e.readU16(),n.height=e.readU16(),n.horizontalResolution=e.readFP16(),n.verticalResolution=e.readFP16(),t(0==e.readU32()),n.frameCount=e.readU16(),n.compressorName=e.readPString(32),n.depth=e.readU16(),t(65535==e.readU16()),a();break;case"mp4a":e.reserved(6,0),n.dataReferenceIndex=e.readU16(),n.version=e.readU16(),e.skip(2),e.skip(4),n.channelCount=e.readU16(),n.sampleSize=e.readU16(),n.compressionId=e.readU16(),n.packetSize=e.readU16(),n.sampleRate=e.readU32()>>>16,t(0==n.version),a();break;case"esds":n.name="Elementary Stream Descriptor",r(),o();break;case"avcC":n.name="AVC Configuration Box",n.configurationVersion=e.readU8(),n.avcProfileIndication=e.readU8(),n.profileCompatibility=e.readU8(),n.avcLevelIndication=e.readU8(),n.lengthSizeMinusOne=3&e.readU8(),t(3==n.lengthSizeMinusOne,"TODO");var l=31&e.readU8();n.sps=[];for(c=0;c=8,"Cannot parse large media data yet."),n.data=e.readU8Array(i());break;default:o()}return n},read:function(){var t=(new Date).getTime();this.file={},this.readBoxes(this.stream,this.file),console.info("Parsed stream in "+((new Date).getTime()-t)+" ms")},traceSamples:function(){var t=this.tracks[1],e=this.tracks[2];console.info("Video Samples: "+t.getSampleCount()),console.info("Audio Samples: "+e.getSampleCount());for(var n=0,r=0,i=0;i<100;i++){var o=t.sampleToOffset(n),s=e.sampleToOffset(r),a=t.sampleToSize(n,1),c=e.sampleToSize(r,1);o0){var s=n[i-1],a=o.firstChunk-s.firstChunk,c=s.samplesPerChunk*a;if(!(e>=c))return{index:r+Math.floor(e/s.samplesPerChunk),offset:e%s.samplesPerChunk};if(e-=c,i==n.length-1)return{index:r+a+Math.floor(e/o.samplesPerChunk),offset:e%o.samplesPerChunk};r+=a}}t(!1)},chunkToOffset:function(t){return this.trak.mdia.minf.stbl.stco.table[t]},sampleToOffset:function(t){var e=this.sampleToChunk(t);return this.chunkToOffset(e.index)+this.sampleToSize(t-e.offset,e.offset)},timeToSample:function(t){for(var e=this.trak.mdia.minf.stbl.stts.table,n=0,r=0;r=i))return n+Math.floor(t/e[r].delta);t-=i,n+=e[r].count}},getTotalTime:function(){for(var e=this.trak.mdia.minf.stbl.stts.table,n=0,r=0;r0;){var s=new i(e.buffer,n).readU32();o.push(e.subarray(n+4,n+s+4)),n=n+s+4}return o}},e}();e=[],n="zero-timeout-message",window.addEventListener("message",(function(t){t.source==window&&t.data==n&&(t.stopPropagation(),e.length>0&&e.shift()())}),!0),window.setZeroTimeout=function(t){e.push(t),window.postMessage(n,"*")};var a=function(){function t(t,n,r,i){this.stream=t,this.useWorkers=n,this.webgl=r,this.render=i,this.statistics={videoStartTime:0,videoPictureCounter:0,windowStartTime:0,windowPictureCounter:0,fps:0,fpsMin:1e3,fpsMax:-1e3,webGLTextureUploadTime:0},this.onStatisticsUpdated=function(){},this.avc=new Player({useWorker:n,reuseMemory:!0,webgl:r,size:{width:640,height:368}}),this.webgl=this.avc.webgl;var o=this;this.avc.onPictureDecoded=function(){e.call(o)},this.canvas=this.avc.canvas}function e(){var t=this.statistics;t.videoPictureCounter+=1,t.windowPictureCounter+=1;var e=Date.now();t.videoStartTime||(t.videoStartTime=e);var n=e-t.videoStartTime;if(t.elapsed=n/1e3,!(n<1e3))if(t.windowStartTime){if(e-t.windowStartTime>1e3){var r=e-t.windowStartTime,i=t.windowPictureCounter/r*1e3;t.windowStartTime=e,t.windowPictureCounter=0,it.fpsMax&&(t.fpsMax=i),t.fps=i}i=t.videoPictureCounter/n*1e3;t.fpsSinceStart=i,this.onStatisticsUpdated(this.statistics)}else t.windowStartTime=e}return t.prototype={readAll:function(t){console.info("MP4Player::readAll()"),this.stream.readAll(null,function(e){this.reader=new o(new i(e)),this.reader.read();var n=this.reader.tracks[1];this.size=new r(n.trak.tkhd.width,n.trak.tkhd.height),console.info("MP4Player::readAll(), length: "+this.reader.stream.length),t&&t()}.bind(this))},play:function(){var t=this.reader;if(t){var e=t.tracks[1],n=(t.tracks[2],t.tracks[1].trak.mdia.minf.stbl.stsd.avc1.avcC),r=n.sps[0],i=n.pps[0];this.avc.decode(r),this.avc.decode(i);var o=0;setTimeout(function t(){var n=this.avc;e.getSampleNALUnits(o).forEach((function(t){n.decode(t)})),++o<3e3&&setTimeout(t.bind(this),1)}.bind(this),1)}else this.readAll(this.play.bind(this))}},t}(),c=function(){function t(t){var e=t.attributes.src?t.attributes.src.value:void 0,n=(t.attributes.width&&t.attributes.width.value,t.attributes.height&&t.attributes.height.value,document.createElement("div"));n.setAttribute("style","z-index: 100; position: absolute; bottom: 0px; background-color: rgba(0,0,0,0.8); height: 30px; width: 100%; text-align: left;"),this.info=document.createElement("div"),this.info.setAttribute("style","font-size: 14px; font-weight: bold; padding: 6px; color: lime;"),n.appendChild(this.info),t.appendChild(n);var r=!!t.attributes.workers&&"true"==t.attributes.workers.value,i=!!t.attributes.render&&"true"==t.attributes.render.value,o="auto";t.attributes.webgl&&("true"==t.attributes.webgl.value&&(o=!0),"false"==t.attributes.webgl.value&&(o=!1));var s="";s+=r?"worker thread ":"main thread ",this.player=new a(new Stream(e),r,o,i),this.canvas=this.player.canvas,this.canvas.onclick=function(){this.play()}.bind(this),t.appendChild(this.canvas),s+=" - webgl: "+this.player.webgl,this.info.innerHTML="Click canvas to load and play - "+s,this.score=null,this.player.onStatisticsUpdated=function(t){if(t.videoPictureCounter%10==0){var e="";t.fps&&(e+=" fps: "+t.fps.toFixed(2)),t.fpsSinceStart&&(e+=" avg: "+t.fpsSinceStart.toFixed(2));t.videoPictureCounter<1200?this.score=1200-t.videoPictureCounter:1200==t.videoPictureCounter&&(this.score=t.fpsSinceStart.toFixed(2)),this.info.innerHTML=s+e}}.bind(this)}return t.prototype={play:function(){this.player.play()}},t}();return{Size:r,Track:s,MP4Reader:o,MP4Player:a,Bytestream:i,Broadway:c}}()},function(t,e,n){"use strict";(function(t){Object.defineProperty(e,"__esModule",{value:!0});var n="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t},r="undefined"!=typeof window&&void 0!==window.document,i="object"===("undefined"==typeof self?"undefined":n(self))&&self.constructor&&"DedicatedWorkerGlobalScope"===self.constructor.name,o=void 0!==t&&null!=t.versions&&null!=t.versions.node;e.isBrowser=r,e.isWebWorker=i,e.isNode=o}).call(this,n(112))},function(t,e,n){n(5),n(11),n(10),(()=>{const e=n(26),r=n(248),i=n(251),{checkObjectType:o}=n(56),{Task:s}=n(49),{Loader:a,Dumper:c}=n(138),{ScriptingError:u,DataError:l,ArgumentError:f}=n(6),p=new WeakMap,h=new WeakMap;function d(t){if("task"===t)return h;if("job"===t)return p;throw new u(`Unknown session type was received ${t}`)}async function b(t){const n=t instanceof s?"task":"job",o=d(n);if(!o.has(t)){const s=await e.annotations.getAnnotations(n,t.id),a="job"===n?t.startFrame:0,c="job"===n?t.stopFrame:t.size-1,u={};for(let e=a;e<=c;e++)u[e]=await t.frames.get(e);const l=new r({labels:t.labels||t.task.labels,startFrame:a,stopFrame:c,frameMeta:u}).import(s),f=new i(s.version,l,t);o.set(t,{collection:l,saver:f})}}t.exports={getAnnotations:async function(t,e,n){return await b(t),d(t instanceof s?"task":"job").get(t).collection.get(e,n)},putAnnotations:function(t,e){const n=d(t instanceof s?"task":"job");if(n.has(t))return n.get(t).collection.put(e);throw new l("Collection has not been initialized yet. Call annotations.get() or annotations.clear(true) before")},saveAnnotations:async function(t,e){const n=d(t instanceof s?"task":"job");n.has(t)&&await n.get(t).saver.save(e)},hasUnsavedChanges:function(t){const e=d(t instanceof s?"task":"job");return!!e.has(t)&&e.get(t).saver.hasUnsavedChanges()},mergeAnnotations:function(t,e){const n=d(t instanceof s?"task":"job");if(n.has(t))return n.get(t).collection.merge(e);throw new l("Collection has not been initialized yet. Call annotations.get() or annotations.clear(true) before")},splitAnnotations:function(t,e,n){const r=d(t instanceof s?"task":"job");if(r.has(t))return r.get(t).collection.split(e,n);throw new l("Collection has not been initialized yet. Call annotations.get() or annotations.clear(true) before")},groupAnnotations:function(t,e,n){const r=d(t instanceof s?"task":"job");if(r.has(t))return r.get(t).collection.group(e,n);throw new l("Collection has not been initialized yet. Call annotations.get() or annotations.clear(true) before")},clearAnnotations:async function(t,e){o("reload",e,"boolean",null);const n=d(t instanceof s?"task":"job");n.has(t)&&n.get(t).collection.clear(),e&&(n.delete(t),await b(t))},annotationsStatistics:function(t){const e=d(t instanceof s?"task":"job");if(e.has(t))return e.get(t).collection.statistics();throw new l("Collection has not been initialized yet. Call annotations.get() or annotations.clear(true) before")},selectObject:function(t,e,n,r){const i=d(t instanceof s?"task":"job");if(i.has(t))return i.get(t).collection.select(e,n,r);throw new l("Collection has not been initialized yet. Call annotations.get() or annotations.clear(true) before")},uploadAnnotations:async function(t,n,r){const i=t instanceof s?"task":"job";if(!(r instanceof a))throw new f("A loader must be instance of Loader class");await e.annotations.uploadAnnotations(i,t.id,n,r.name)},dumpAnnotations:async function(t,n,r){if(!(r instanceof c))throw new f("A dumper must be instance of Dumper class");let i=null;return i="job"===(t instanceof s?"task":"job")?await e.annotations.dumpAnnotations(t.task.id,n,r.name):await e.annotations.dumpAnnotations(t.id,n,r.name)},exportDataset:async function(t,n){if(!(n instanceof String||"string"==typeof n))throw new f("Format must be a string");if(!(t instanceof s))throw new f("A dataset can only be created from a task");let r=null;return r=await e.tasks.exportDataset(t.id,n)}}})()},function(t,e,n){n(5),n(137),n(10),n(71),(()=>{const{RectangleShape:e,PolygonShape:r,PolylineShape:i,PointsShape:o,RectangleTrack:s,PolygonTrack:a,PolylineTrack:c,PointsTrack:u,Track:l,Shape:f,Tag:p,objectStateFactory:h}=n(250),{checkObjectType:d}=n(56),b=n(117),{Label:m}=n(55),{DataError:g,ArgumentError:v,ScriptingError:y}=n(6),{ObjectShape:w,ObjectType:k}=n(29),x=n(70),O=["#0066FF","#AF593E","#01A368","#FF861F","#ED0A3F","#FF3F34","#76D7EA","#8359A3","#FBE870","#C5E17A","#03BB85","#FFDF00","#8B8680","#0A6B0D","#8FD8D8","#A36F40","#F653A6","#CA3435","#FFCBA4","#FF99CC","#FA9D5A","#FFAE42","#A78B00","#788193","#514E49","#1164B4","#F4FA9F","#FED8B1","#C32148","#01796F","#E90067","#FF91A4","#404E5A","#6CDAE7","#FFC1CC","#006A93","#867200","#E2B631","#6EEB6E","#FFC800","#CC99BA","#FF007C","#BC6CAC","#DCCCD7","#EBE1C2","#A6AAAE","#B99685","#0086A7","#5E4330","#C8A2C8","#708EB3","#BC8777","#B2592D","#497E48","#6A2963","#E6335F","#00755E","#B5A895","#0048ba","#EED9C4","#C88A65","#FF6E4A","#87421F","#B2BEB5","#926F5B","#00B9FB","#6456B7","#DB5079","#C62D42","#FA9C44","#DA8A67","#FD7C6E","#93CCEA","#FCF686","#503E32","#FF5470","#9DE093","#FF7A00","#4F69C6","#A50B5E","#F0E68C","#FDFF00","#F091A9","#FFFF66","#6F9940","#FC74FD","#652DC1","#D6AEDD","#EE34D2","#BB3385","#6B3FA0","#33CC99","#FFDB00","#87FF2A","#6EEB6E","#FFC800","#CC99BA","#7A89B8","#006A93","#867200","#E2B631","#D9D6CF"];function j(t,n,s){const{type:a}=t,c=O[n%O.length];let u=null;switch(a){case"rectangle":u=new e(t,n,c,s);break;case"polygon":u=new r(t,n,c,s);break;case"polyline":u=new i(t,n,c,s);break;case"points":u=new o(t,n,c,s);break;default:throw new g(`An unexpected type of shape "${a}"`)}return u}function S(t,e,n){if(t.shapes.length){const{type:r}=t.shapes[0],i=O[e%O.length];let o=null;switch(r){case"rectangle":o=new s(t,e,i,n);break;case"polygon":o=new a(t,e,i,n);break;case"polyline":o=new c(t,e,i,n);break;case"points":o=new u(t,e,i,n);break;default:throw new g(`An unexpected type of track "${r}"`)}return o}return console.warn("The track without any shapes had been found. It was ignored."),null}t.exports=class{constructor(t){this.startFrame=t.startFrame,this.stopFrame=t.stopFrame,this.frameMeta=t.frameMeta,this.labels=t.labels.reduce((t,e)=>(t[e.id]=e,t),{}),this.shapes={},this.tags={},this.tracks=[],this.objects={},this.count=0,this.flush=!1,this.collectionZ={},this.groups={max:0},this.injection={labels:this.labels,collectionZ:this.collectionZ,groups:this.groups,frameMeta:this.frameMeta}}import(t){for(const e of t.tags){const t=++this.count,n=new p(e,t,this.injection);this.tags[n.frame]=this.tags[n.frame]||[],this.tags[n.frame].push(n),this.objects[t]=n}for(const e of t.shapes){const t=++this.count,n=j(e,t,this.injection);this.shapes[n.frame]=this.shapes[n.frame]||[],this.shapes[n.frame].push(n),this.objects[t]=n}for(const e of t.tracks){const t=++this.count,n=S(e,t,this.injection);n&&(this.tracks.push(n),this.objects[t]=n)}return this}export(){return{tracks:this.tracks.filter(t=>!t.removed).map(t=>t.toJSON()),shapes:Object.values(this.shapes).reduce((t,e)=>(t.push(...e),t),[]).filter(t=>!t.removed).map(t=>t.toJSON()),tags:Object.values(this.tags).reduce((t,e)=>(t.push(...e),t),[]).filter(t=>!t.removed).map(t=>t.toJSON())}}get(t){const{tracks:e}=this,n=this.shapes[t]||[],r=this.tags[t]||[],i=e.concat(n).concat(r).filter(t=>!t.removed),o=[];for(const e of i){const n=e.get(t);if(n.outside&&!n.keyframe)continue;const r=h.call(e,t,n);o.push(r)}return o}merge(t){if(d("shapes for merge",t,null,Array),!t.length)return;const e=t.map(t=>{d("object state",t,null,x);const e=this.objects[t.clientID];if(void 0===e)throw new v("The object has not been saved yet. Call ObjectState.put([state]) before you can merge it");return e}),n={},{label:r,shapeType:i}=t[0];if(!(r.id in this.labels))throw new v(`Unknown label for the task: ${r.id}`);if(!Object.values(w).includes(i))throw new v(`Got unknown shapeType "${i}"`);const o=r.attributes.reduce((t,e)=>(t[e.id]=e,t),{});for(let s=0;s(e in o&&o[e].mutable&&t.push({spec_id:+e,value:a.attributes[e]}),t),[])},a.frame+1 in n||(n[a.frame+1]=JSON.parse(JSON.stringify(n[a.frame])),n[a.frame+1].outside=!0,n[a.frame+1].frame++)}else{if(!(a instanceof l))throw new v(`Trying to merge unknown object type: ${a.constructor.name}. `+"Only shapes and tracks are expected.");{const t={};for(const e of Object.keys(a.shapes)){const r=a.shapes[e];if(e in n&&!n[e].outside){if(r.outside)continue;throw new v("Expected only one visible shape per frame")}let o=!1;for(const e in r.attributes)e in t&&t[e]===r.attributes[e]||(o=!0,t[e]=r.attributes[e]);n[e]={type:i,frame:+e,points:[...r.points],occluded:r.occluded,outside:r.outside,zOrder:r.zOrder,attributes:o?Object.keys(t).reduce((e,n)=>(e.push({spec_id:+n,value:t[n]}),e),[]):[]}}}}}let s=!1;for(const t of Object.keys(n).sort((t,e)=>+t-+e)){if((s=s||n[t].outside)||!n[t].outside)break;delete n[t]}const a=++this.count,c=S({frame:Math.min.apply(null,Object.keys(n).map(t=>+t)),shapes:Object.values(n),group:0,label_id:r.id,attributes:Object.keys(t[0].attributes).reduce((e,n)=>(o[n].mutable||e.push({spec_id:+n,value:t[0].attributes[n]}),e),[])},a,this.injection);this.tracks.push(c),this.objects[a]=c;for(const t of e)t.removed=!0,"function"==typeof t.resetCache&&t.resetCache()}split(t,e){d("object state",t,null,x),d("frame",e,"integer",null);const n=this.objects[t.clientID];if(void 0===n)throw new v("The object has not been saved yet. Call annotations.put([state]) before");if(t.objectType!==k.TRACK)return;const r=Object.keys(n.shapes).sort((t,e)=>+t-+e);if(e<=+r[0]||e>r[r.length-1])return;const i=n.label.attributes.reduce((t,e)=>(t[e.id]=e,t),{}),o=n.toJSON(),s={type:t.shapeType,points:[...t.points],occluded:t.occluded,outside:t.outside,zOrder:0,attributes:Object.keys(t.attributes).reduce((e,n)=>(i[n].mutable||e.push({spec_id:+n,value:t.attributes[n]}),e),[]),frame:e},a={frame:o.frame,group:0,label_id:o.label_id,attributes:o.attributes,shapes:[]},c=JSON.parse(JSON.stringify(a));c.frame=e,c.shapes.push(JSON.parse(JSON.stringify(s))),o.shapes.map(t=>(delete t.id,t.framee&&c.shapes.push(JSON.parse(JSON.stringify(t))),t)),a.shapes.push(s),a.shapes[a.shapes.length-1].outside=!0;let u=++this.count;const l=S(a,u,this.injection);this.tracks.push(l),this.objects[u]=l,u=++this.count;const f=S(c,u,this.injection);this.tracks.push(f),this.objects[u]=f,n.removed=!0,n.resetCache()}group(t,e){d("shapes for group",t,null,Array);const n=t.map(t=>{d("object state",t,null,x);const e=this.objects[t.clientID];if(void 0===e)throw new v("The object has not been saved yet. Call annotations.put([state]) before");return e}),r=e?0:++this.groups.max;for(const t of n)t.group=r,"function"==typeof t.resetCache&&t.resetCache();return r}clear(){this.shapes={},this.tags={},this.tracks=[],this.objects={},this.count=0,this.flush=!0}statistics(){const t={},e={rectangle:{shape:0,track:0},polygon:{shape:0,track:0},polyline:{shape:0,track:0},points:{shape:0,track:0},tags:0,manually:0,interpolated:0,total:0},n=JSON.parse(JSON.stringify(e));for(const n of Object.values(this.labels)){const{name:r}=n;t[r]=JSON.parse(JSON.stringify(e))}for(const e of Object.values(this.objects)){let n=null;if(e instanceof f)n="shape";else if(e instanceof l)n="track";else{if(!(e instanceof p))throw new y(`Unexpected object type: "${n}"`);n="tag"}const r=e.label.name;if("tag"===n)t[r].tags++,t[r].manually++,t[r].total++;else{const{shapeType:i}=e;if(t[r][i][n]++,"track"===n){const n=Object.keys(e.shapes).sort((t,e)=>+t-+e).map(t=>+t);let i=n[0],o=!1;for(const s of n){if(o){const e=s-i-1;t[r].interpolated+=e,t[r].total+=e}o=!e.shapes[s].outside,i=s,o&&(t[r].manually++,t[r].total++)}const s=n[n.length-1];if(s!==this.stopFrame&&!e.shapes[s].outside){const e=this.stopFrame-s;t[r].interpolated+=e,t[r].total+=e}}else t[r].manually++,t[r].total++}}for(const e of Object.keys(t))for(const r of Object.keys(t[e]))if("object"==typeof t[e][r])for(const i of Object.keys(t[e][r]))n[r][i]+=t[e][r][i];else n[r]+=t[e][r];return new b(t,n)}put(t){d("shapes for put",t,null,Array);const e={shapes:[],tracks:[],tags:[]};function n(t,e){const n=+e,r=this.attributes[e];return d("attribute id",n,"integer",null),d("attribute value",r,"string",null),t.push({spec_id:n,value:r}),t}for(const r of t){d("object state",r,null,x),d("state client ID",r.clientID,"undefined",null),d("state frame",r.frame,"integer",null),d("state attributes",r.attributes,null,Object),d("state label",r.label,null,m);const t=Object.keys(r.attributes).reduce(n.bind(r),[]),i=r.label.attributes.reduce((t,e)=>(t[e.id]=e,t),{});if("tag"===r.objectType)e.tags.push({attributes:t,frame:r.frame,label_id:r.label.id,group:0});else{d("state occluded",r.occluded,"boolean",null),d("state points",r.points,null,Array);for(const t of r.points)d("point coordinate",t,"number",null);if(!Object.values(w).includes(r.shapeType))throw new v("Object shape must be one of: "+`${JSON.stringify(Object.values(w))}`);if("shape"===r.objectType)e.shapes.push({attributes:t,frame:r.frame,group:0,label_id:r.label.id,occluded:r.occluded||!1,points:[...r.points],type:r.shapeType,z_order:0});else{if("track"!==r.objectType)throw new v("Object type must be one of: "+`${JSON.stringify(Object.values(k))}`);e.tracks.push({attributes:t.filter(t=>!i[t.spec_id].mutable),frame:r.frame,group:0,label_id:r.label.id,shapes:[{attributes:t.filter(t=>i[t.spec_id].mutable),frame:r.frame,occluded:r.occluded||!1,outside:!1,points:[...r.points],type:r.shapeType,z_order:0}]})}}}this.import(e)}select(t,e,n){d("shapes for select",t,null,Array),d("x coordinate",e,"number",null),d("y coordinate",n,"number",null);let r=null,i=null;for(const o of t){if(d("object state",o,null,x),o.outside)continue;const t=this.objects[o.clientID];if(void 0===t)throw new v("The object has not been saved yet. Call annotations.put([state]) before");const s=t.constructor.distance(o.points,e,n);null!==s&&(null===r||s{const e=n(70),{checkObjectType:r,isEnum:o}=n(56),{ObjectShape:s,ObjectType:a,AttributeType:c,VisibleState:u}=n(29),{DataError:l,ArgumentError:f,ScriptingError:p}=n(6),{Label:h}=n(55);function d(t,n){const r=new e(n);return r.hidden={save:this.save.bind(this,t,r),delete:this.delete.bind(this),up:this.up.bind(this,t,r),down:this.down.bind(this,t,r)},r}function b(t,e){if(t===s.RECTANGLE){if(e.length/2!=2)throw new l(`Rectangle must have 2 points, but got ${e.length/2}`)}else if(t===s.POLYGON){if(e.length/2<3)throw new l(`Polygon must have at least 3 points, but got ${e.length/2}`)}else if(t===s.POLYLINE){if(e.length/2<2)throw new l(`Polyline must have at least 2 points, but got ${e.length/2}`)}else{if(t!==s.POINTS)throw new f(`Unknown value of shapeType has been recieved ${t}`);if(e.length/2<1)throw new l(`Points must have at least 1 points, but got ${e.length/2}`)}}function m(t,e){if(t===s.POINTS)return!0;let n=Number.MAX_SAFE_INTEGER,r=Number.MIN_SAFE_INTEGER,i=Number.MAX_SAFE_INTEGER,o=Number.MIN_SAFE_INTEGER;for(let t=0;t=3}return(r-n)*(o-i)>=9}function g(t,e){const{values:n}=e,r=e.inputType;if("string"!=typeof t)throw new f(`Attribute value is expected to be string, but got ${typeof t}`);return r===c.NUMBER?+t>=+n[0]&&+t<=+n[1]&&!((+t-+n[0])%+n[2]):r===c.CHECKBOX?["true","false"].includes(t.toLowerCase()):n.includes(t)}class v{constructor(t,e,n){this.taskLabels=n.labels,this.clientID=e,this.serverID=t.id,this.group=t.group,this.label=this.taskLabels[t.label_id],this.frame=t.frame,this.removed=!1,this.lock=!1,this.attributes=t.attributes.reduce((t,e)=>(t[e.spec_id]=e.value,t),{}),this.appendDefaultAttributes(this.label),n.groups.max=Math.max(n.groups.max,this.group)}appendDefaultAttributes(t){const e=t.attributes;for(const t of e)t.id in this.attributes||(this.attributes[t.id]=t.defaultValue)}delete(t){return this.lock&&!t||(this.removed=!0),!0}}class y extends v{constructor(t,e,n,r){super(t,e,r),this.frameMeta=r.frameMeta,this.collectionZ=r.collectionZ,this.visibility=u.SHAPE,this.color=n,this.shapeType=null}_getZ(t){return this.collectionZ[t]=this.collectionZ[t]||{max:0,min:0},this.collectionZ[t]}save(){throw new p("Is not implemented")}get(){throw new p("Is not implemented")}toJSON(){throw new p("Is not implemented")}up(t,e){const n=this._getZ(t);n.max++,e.zOrder=n.max}down(t,e){const n=this._getZ(t);n.min--,e.zOrder=n.min}}class w extends y{constructor(t,e,n,r){super(t,e,n,r),this.points=t.points,this.occluded=t.occluded,this.zOrder=t.z_order;const i=this._getZ(this.frame);i.max=Math.max(i.max,this.zOrder||0),i.min=Math.min(i.min,this.zOrder||0)}toJSON(){return{type:this.shapeType,clientID:this.clientID,occluded:this.occluded,z_order:this.zOrder,points:[...this.points],attributes:Object.keys(this.attributes).reduce((t,e)=>(t.push({spec_id:e,value:this.attributes[e]}),t),[]),id:this.serverID,frame:this.frame,label_id:this.label.id,group:this.group}}get(t){if(t!==this.frame)throw new p("Got frame is not equal to the frame of the shape");return{objectType:a.SHAPE,shapeType:this.shapeType,clientID:this.clientID,serverID:this.serverID,occluded:this.occluded,lock:this.lock,zOrder:this.zOrder,points:[...this.points],attributes:i({},this.attributes),label:this.label,group:this.group,color:this.color,visibility:this.visibility}}save(t,e){if(t!==this.frame)throw new p("Got frame is not equal to the frame of the shape");if(this.lock&&e.lock)return d.call(this,t,this.get(t));const n=this.get(t),i=e.updateFlags;if(i.label&&(r("label",e.label,null,h),n.label=e.label,n.attributes={},this.appendDefaultAttributes.call(n,n.label)),i.attributes){const t=n.label.attributes.reduce((t,e)=>(t[e.id]=e,t),{});for(const r of Object.keys(e.attributes)){const i=e.attributes[r];if(!(r in t&&g(i,t[r])))throw new f(`Trying to save unknown attribute with id ${r} and value ${i}`);n.attributes[r]=i}}if(i.points){r("points",e.points,null,Array),b(this.shapeType,e.points);const{width:i,height:o}=this.frameMeta[t],s=[];for(let t=0;t{t[e.frame]={serverID:e.id,occluded:e.occluded,zOrder:e.z_order,points:e.points,outside:e.outside,attributes:e.attributes.reduce((t,e)=>(t[e.spec_id]=e.value,t),{})};const n=this._getZ(e.frame);return n.max=Math.max(n.max,e.z_order),n.min=Math.min(n.min,e.z_order),t},{}),this.cache={}}toJSON(){const t=this.label.attributes.reduce((t,e)=>(t[e.id]=e,t),{});return{clientID:this.clientID,id:this.serverID,frame:this.frame,label_id:this.label.id,group:this.group,attributes:Object.keys(this.attributes).reduce((e,n)=>(t[n].mutable||e.push({spec_id:n,value:this.attributes[n]}),e),[]),shapes:Object.keys(this.shapes).reduce((e,n)=>(e.push({type:this.shapeType,occluded:this.shapes[n].occluded,z_order:this.shapes[n].zOrder,points:[...this.shapes[n].points],outside:this.shapes[n].outside,attributes:Object.keys(this.shapes[n].attributes).reduce((e,r)=>(t[r].mutable&&e.push({spec_id:r,value:this.shapes[n].attributes[r]}),e),[]),id:this.shapes[n].serverID,frame:+n}),e),[])}}get(t){if(!(t in this.cache)){const e=Object.assign({},this.getPosition(t),{attributes:this.getAttributes(t),group:this.group,objectType:a.TRACK,shapeType:this.shapeType,clientID:this.clientID,serverID:this.serverID,lock:this.lock,color:this.color,visibility:this.visibility});this.cache[t]=e}const e=JSON.parse(JSON.stringify(this.cache[t]));return e.label=this.label,e}neighborsFrames(t){const e=Object.keys(this.shapes).map(t=>+t);let n=Number.MAX_SAFE_INTEGER,r=Number.MAX_SAFE_INTEGER;for(const i of e){const e=Math.abs(t-i);i<=t&&e+t-+e);for(const r of n)if(r<=t){const{attributes:t}=this.shapes[r];for(const n in t)Object.prototype.hasOwnProperty.call(t,n)&&(e[n]=t[n])}return e}save(t,e){if(this.lock&&e.lock)return d.call(this,t,this.get(t));const n=Object.assign(this.get(t));n.attributes=Object.assign(n.attributes),n.points=[...n.points];const i=e.updateFlags;let s=!1;i.label&&(r("label",e.label,null,h),n.label=e.label,n.attributes={},this.appendDefaultAttributes.call(n,n.label));const a=n.label.attributes.reduce((t,e)=>(t[e.id]=e,t),{});if(i.attributes)for(const t of Object.keys(e.attributes)){const r=e.attributes[t];if(!(t in a&&g(r,a[t])))throw new f(`Trying to save unknown attribute with id ${t} and value ${r}`);n.attributes[t]=r}if(i.points){r("points",e.points,null,Array),b(this.shapeType,e.points);const{width:i,height:o}=this.frameMeta[t],a=[];for(let t=0;tt&&delete this.cache[e];return this.cache[t].keyframe=!1,delete this.shapes[t],i.reset(),d.call(this,t,this.get(t))}if(s||i.keyframe&&e.keyframe){for(const e in this.cache)+e>t&&delete this.cache[e];if(this.cache[t].keyframe=!0,e.keyframe=!0,this.shapes[t]={frame:t,zOrder:n.zOrder,points:n.points,outside:n.outside,occluded:n.occluded,attributes:{}},i.attributes)for(const r of Object.keys(n.attributes))a[r].mutable&&(this.shapes[t].attributes[r]=e.attributes[r],this.shapes[t].attributes[r]=e.attributes[r])}return i.reset(),d.call(this,t,this.get(t))}getPosition(t){const{leftFrame:e,rightFrame:n}=this.neighborsFrames(t),r=Number.isInteger(n)?this.shapes[n]:null,i=Number.isInteger(e)?this.shapes[e]:null;if(i&&e===t)return{points:[...i.points],occluded:i.occluded,outside:i.outside,zOrder:i.zOrder,keyframe:!0};if(r&&i)return Object.assign({},this.interpolatePosition(i,r,(t-e)/(n-e)),{keyframe:!1});if(r)return{points:[...r.points],occluded:r.occluded,outside:!0,zOrder:0,keyframe:!1};if(i)return{points:[...i.points],occluded:i.occluded,outside:i.outside,zOrder:0,keyframe:!1};throw new p(`No one neightbour frame found for the track with client ID: "${this.id}"`)}delete(t){return this.lock&&!t||(this.removed=!0,this.resetCache()),!0}resetCache(){this.cache={}}}class x extends w{constructor(t,e,n,r){super(t,e,n,r),this.shapeType=s.RECTANGLE,b(this.shapeType,this.points)}static distance(t,e,n){const[r,i,o,s]=t;return e>=r&&e<=o&&n>=i&&n<=s?Math.min.apply(null,[e-r,n-i,o-e,s-n]):null}}class O extends w{constructor(t,e,n,r){super(t,e,n,r)}}class j extends O{constructor(t,e,n,r){super(t,e,n,r),this.shapeType=s.POLYGON,b(this.shapeType,this.points)}static distance(t,e,n){function r(t,r,i,o){return(i-t)*(n-r)-(e-t)*(o-r)}let i=0;const o=[];for(let s=0,a=t.length-2;sn&&r(c,u,l,f)>0&&i++:f<=n&&r(c,u,l,f)<0&&i--;const p=e-(u-f),h=n-(l-c);(p-c)*(l-p)>=0&&(h-u)*(f-h)>=0?o.push(Math.sqrt(Math.pow(e-p,2)+Math.pow(n-h,2))):o.push(Math.min(Math.sqrt(Math.pow(c-e,2)+Math.pow(u-n,2)),Math.sqrt(Math.pow(l-e,2)+Math.pow(f-n,2))))}return 0!==i?Math.min.apply(null,o):null}}class S extends O{constructor(t,e,n,r){super(t,e,n,r),this.shapeType=s.POLYLINE,b(this.shapeType,this.points)}static distance(t,e,n){const r=[];for(let i=0;i=0&&(n-s)*(c-n)>=0?r.push(Math.abs((c-s)*e-(a-o)*n+a*s-c*o)/Math.sqrt(Math.pow(c-s,2)+Math.pow(a-o,2))):r.push(Math.min(Math.sqrt(Math.pow(o-e,2)+Math.pow(s-n,2)),Math.sqrt(Math.pow(a-e,2)+Math.pow(c-n,2))))}return Math.min.apply(null,r)}}class _ extends O{constructor(t,e,n,r){super(t,e,n,r),this.shapeType=s.POINTS,b(this.shapeType,this.points)}static distance(t,e,n){const r=[];for(let i=0;ir&&(r=t[o]),t[o+1]>i&&(i=t[o+1]);return{xmin:e,ymin:n,xmax:r,ymax:i}}function i(t,e){const n=[],r=e.xmax-e.xmin,i=e.ymax-e.ymin;for(let o=0;on[i][t]-n[i][e]);const i={},o={};let s=0;for(;Object.values(o).length!==t.length;){for(const e of t){if(o[e])continue;const t=r[e][s],a=n[e][t];if(t in i&&i[t].distance>a){const e=i[t].value;delete i[t],delete o[e]}t in i||(i[t]={value:e,distance:a},o[e]=!0)}s++}const a={};for(const t of Object.keys(i))a[i[t].value]={value:t,distance:i[t].distance};return a}(Array.from(t.keys()),Array.from(e.keys()),s),c=(n(e)+n(t))/(e.length+t.length);!function(t,e){for(const n of Object.keys(t))t[n].distance>e&&delete t[n]}(a,c+3*Math.sqrt((r(t,c)+r(e,c))/(t.length+e.length)));for(const t of Object.keys(a))a[t]=a[t].value;const u=this.appendMapping(a,t,e);for(const n of u)i.push(t[n]),o.push(e[a[n]]);return[i,o]}let u=r(t.points),l=r(e.points);(u.xmax-u.xmin<1||l.ymax-l.ymin<1)&&(l=u={xmin:0,xmax:1024,ymin:0,ymax:768});const f=s(i(t.points,u)),p=s(i(e.points,l));let h=[],d=[];if(f.length>p.length){const[t,e]=c.call(this,p,f);h=e,d=t}else{const[t,e]=c.call(this,f,p);h=t,d=e}const b=o(a(h),u),m=o(a(d),l),g=[];for(let t=0;t+t),i=Object.keys(t).map(t=>+t),o=[];function s(t){let e=t,i=t;if(!r.length)throw new p("Interpolation mapping is empty");for(;!r.includes(e);)--e<0&&(e=n.length-1);for(;!r.includes(i);)++i>=n.length&&(i=0);return[e,i]}function a(t,e,r){const i=[];for(;e!==r;)i.push(n[e]),++e>=n.length&&(e=0);i.push(n[r]);let o=0,s=0,a=!1;for(let e=1;e(t.push({spec_id:e,value:this.attributes[e]}),t),[])}}get(t){if(t!==this.frame)throw new p("Got frame is not equal to the frame of the shape");return{objectType:a.TAG,clientID:this.clientID,serverID:this.serverID,lock:this.lock,attributes:Object.assign({},this.attributes),label:this.label,group:this.group}}save(t,e){if(t!==this.frame)throw new p("Got frame is not equal to the frame of the shape");if(this.lock&&e.lock)return d.call(this,t,this.get(t));const n=this.get(t),i=e.updateFlags;if(i.label&&(r("label",e.label,null,h),n.label=e.label,n.attributes={},this.appendDefaultAttributes.call(n,n.label)),i.attributes){const t=n.label.attributes.map(t=>`${t.id}`);for(const r of Object.keys(e.attributes))t.includes(r)&&(n.attributes[r]=e.attributes[r])}i.group&&(r("group",e.group,"integer",null),n.group=e.group),i.lock&&(r("lock",e.lock,"boolean",null),n.lock=e.lock),i.reset();for(const t of Object.keys(n))t in this&&(this[t]=n[t]);return d.call(this,t,this.get(t))}},objectStateFactory:d}})()},function(t,e,n){function r(t,e){var n=Object.keys(t);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(t);e&&(r=r.filter((function(e){return Object.getOwnPropertyDescriptor(t,e).enumerable}))),n.push.apply(n,r)}return n}function i(t){for(var e=1;e{const e=n(26),{Task:r}=n(49),{ScriptingError:o}="./exceptions";t.exports=class{constructor(t,e,n){this.sessionType=n instanceof r?"task":"job",this.id=n.id,this.version=t,this.collection=e,this.initialObjects={},this.hash=this._getHash();const i=this.collection.export();this._resetState();for(const t of i.shapes)this.initialObjects.shapes[t.id]=t;for(const t of i.tracks)this.initialObjects.tracks[t.id]=t;for(const t of i.tags)this.initialObjects.tags[t.id]=t}_resetState(){this.initialObjects={shapes:{},tracks:{},tags:{}}}_getHash(){const t=this.collection.export();return JSON.stringify(t)}async _request(t,n){return await e.annotations.updateAnnotations(this.sessionType,this.id,t,n)}async _put(t){return await this._request(t,"put")}async _create(t){return await this._request(t,"create")}async _update(t){return await this._request(t,"update")}async _delete(t){return await this._request(t,"delete")}_split(t){const e={created:{shapes:[],tracks:[],tags:[]},updated:{shapes:[],tracks:[],tags:[]},deleted:{shapes:[],tracks:[],tags:[]}};for(const n of Object.keys(t))for(const r of t[n])if(r.id in this.initialObjects[n]){JSON.stringify(r)!==JSON.stringify(this.initialObjects[n][r.id])&&e.updated[n].push(r)}else{if(void 0!==r.id)throw new o(`Id of object is defined "${r.id}"`+"but it absents in initial state");e.created[n].push(r)}const n={shapes:t.shapes.map(t=>+t.id),tracks:t.tracks.map(t=>+t.id),tags:t.tags.map(t=>+t.id)};for(const t of Object.keys(this.initialObjects))for(const r of Object.keys(this.initialObjects[t]))if(!n[t].includes(+r)){const n=this.initialObjects[t][r];e.deleted[t].push(n)}return e}_updateCreatedObjects(t,e){const n=t.tracks.length+t.shapes.length+t.tags.length,r=e.tracks.length+e.shapes.length+e.tags.length;if(r!==n)throw new o("Number of indexes is differed by number of saved objects"+`${r} vs ${n}`);for(const n of Object.keys(e))for(let r=0;rt.clientID),shapes:t.shapes.map(t=>t.clientID),tags:t.tags.map(t=>t.clientID)};return t.tracks.concat(t.shapes).concat(t.tags).map(t=>(delete t.clientID,t)),e}async save(t){"function"!=typeof t&&(t=t=>{console.log(t)});try{const e=this.collection.export(),{flush:n}=this.collection;if(n){t("New objects are being saved..");const n=this._receiveIndexes(e),r=await this._put(i({},e,{version:this.version}));this.version=r.version,this.collection.flush=!1,t("Saved objects are being updated in the client"),this._updateCreatedObjects(r,n),t("Initial state is being updated"),this._resetState();for(const t of Object.keys(this.initialObjects))for(const e of r[t])this.initialObjects[t][e.id]=e}else{const{created:n,updated:r,deleted:o}=this._split(e);t("New objects are being saved..");const s=this._receiveIndexes(n),a=await this._create(i({},n,{version:this.version}));this.version=a.version,t("Saved objects are being updated in the client"),this._updateCreatedObjects(a,s),t("Initial state is being updated");for(const t of Object.keys(this.initialObjects))for(const e of a[t])this.initialObjects[t][e.id]=e;t("Changed objects are being saved.."),this._receiveIndexes(r);const c=await this._update(i({},r,{version:this.version}));this.version=c.version,t("Initial state is being updated");for(const t of Object.keys(this.initialObjects))for(const e of c[t])this.initialObjects[t][e.id]=e;t("Changed objects are being saved.."),this._receiveIndexes(o);const u=await this._delete(i({},o,{version:this.version}));this._version=u.version,t("Initial state is being updated");for(const t of Object.keys(this.initialObjects))for(const e of u[t])delete this.initialObjects[t][e.id]}this.hash=this._getHash(),t("Saving is done")}catch(e){throw t(`Can not save annotations: ${e.message}`),e}}hasUnsavedChanges(){return this._getHash()!==this.hash}}})()},function(t){t.exports=JSON.parse('{"name":"cvat-core.js","version":"0.1.0","description":"Part of Computer Vision Tool which presents an interface for client-side integration","main":"babel.config.js","scripts":{"build":"webpack","test":"jest --config=jest.config.js --coverage","docs":"jsdoc --readme README.md src/*.js -p -c jsdoc.config.js -d docs","coveralls":"cat ./reports/coverage/lcov.info | coveralls"},"author":"Intel","license":"MIT","devDependencies":{"@babel/cli":"^7.4.4","@babel/core":"^7.4.4","@babel/preset-env":"^7.4.4","airbnb":"0.0.2","babel-eslint":"^10.0.1","babel-loader":"^8.0.6","core-js":"^3.0.1","coveralls":"^3.0.5","eslint":"6.1.0","eslint-config-airbnb-base":"14.0.0","eslint-plugin-import":"2.18.2","eslint-plugin-no-unsafe-innerhtml":"^1.0.16","eslint-plugin-no-unsanitized":"^3.0.2","eslint-plugin-security":"^1.4.0","jest":"^24.8.0","jest-junit":"^6.4.0","jsdoc":"^3.6.2","webpack":"^4.31.0","webpack-cli":"^3.3.2"},"dependencies":{"axios":"^0.18.0","browser-or-node":"^1.2.1","error-stack-parser":"^2.0.2","form-data":"^2.5.0","jest-config":"^24.8.0","js-cookie":"^2.2.0","platform":"^1.3.5","store":"^2.0.12"}}')},function(t,e,n){n(5),n(11),n(10),n(254),(()=>{const e=n(36),r=n(26),{isBoolean:i,isInteger:o,isEnum:s,isString:a,checkFilter:c}=n(56),{TaskStatus:u,TaskMode:l}=n(29),f=n(69),{AnnotationFormat:p}=n(138),{ArgumentError:h}=n(6),{Task:d}=n(49);function b(t,e){null!==t.assignee&&([t.assignee]=e.filter(e=>e.id===t.assignee));for(const n of t.segments)for(const t of n.jobs)null!==t.assignee&&([t.assignee]=e.filter(e=>e.id===t.assignee));return null!==t.owner&&([t.owner]=e.filter(e=>e.id===t.owner)),t}t.exports=function(t){return t.plugins.list.implementation=e.list,t.plugins.register.implementation=e.register.bind(t),t.server.about.implementation=async()=>{return await r.server.about()},t.server.share.implementation=async t=>{return await r.server.share(t)},t.server.formats.implementation=async()=>{return(await r.server.formats()).map(t=>new p(t))},t.server.datasetFormats.implementation=async()=>{return await r.server.datasetFormats()},t.server.register.implementation=async(t,e,n,i,o,s)=>{await r.server.register(t,e,n,i,o,s)},t.server.login.implementation=async(t,e)=>{await r.server.login(t,e)},t.server.logout.implementation=async()=>{await r.server.logout()},t.server.authorized.implementation=async()=>{return await r.server.authorized()},t.server.request.implementation=async(t,e)=>{return await r.server.request(t,e)},t.users.get.implementation=async t=>{c(t,{self:i});let e=null;return e=(e="self"in t&&t.self?[e=await r.users.getSelf()]:await r.users.getUsers()).map(t=>new f(t))},t.jobs.get.implementation=async t=>{if(c(t,{taskID:o,jobID:o}),"taskID"in t&&"jobID"in t)throw new h('Only one of fields "taskID" and "jobID" allowed simultaneously');if(!Object.keys(t).length)throw new h("Job filter must not be empty");let e=null;if("taskID"in t)e=await r.tasks.getTasks(`id=${t.taskID}`);else{const n=await r.jobs.getJob(t.jobID);void 0!==n.task_id&&(e=await r.tasks.getTasks(`id=${n.task_id}`))}if(null!==e&&e.length){const n=(await r.users.getUsers()).map(t=>new f(t)),i=new d(b(e[0],n));return t.jobID?i.jobs.filter(e=>e.id===t.jobID):i.jobs}return[]},t.tasks.get.implementation=async t=>{if(c(t,{page:o,name:a,id:o,owner:a,assignee:a,search:a,status:s.bind(u),mode:s.bind(l)}),"search"in t&&Object.keys(t).length>1&&!("page"in t&&2===Object.keys(t).length))throw new h('Do not use the filter field "search" with others');if("id"in t&&Object.keys(t).length>1&&!("page"in t&&2===Object.keys(t).length))throw new h('Do not use the filter field "id" with others');const e=new URLSearchParams;for(const n of["name","owner","assignee","search","status","mode","id","page"])Object.prototype.hasOwnProperty.call(t,n)&&e.set(n,t[n]);const n=(await r.users.getUsers()).map(t=>new f(t)),i=await r.tasks.getTasks(e.toString()),p=i.map(t=>b(t,n)).map(t=>new d(t));return p.count=i.count,p},t}})()},function(t,e,n){"use strict";n(255);var r,i=n(12),o=n(13),s=n(139),a=n(0),c=n(104),u=n(18),l=n(64),f=n(9),p=n(256),h=n(257),d=n(67).codeAt,b=n(259),m=n(33),g=n(260),v=n(25),y=a.URL,w=g.URLSearchParams,k=g.getState,x=v.set,O=v.getterFor("URL"),j=Math.floor,S=Math.pow,_=/[A-Za-z]/,A=/[\d+\-.A-Za-z]/,T=/\d/,P=/^(0x|0X)/,E=/^[0-7]+$/,C=/^\d+$/,I=/^[\dA-Fa-f]+$/,F=/[\u0000\u0009\u000A\u000D #%/:?@[\\]]/,M=/[\u0000\u0009\u000A\u000D #/:?@[\\]]/,N=/^[\u0000-\u001F ]+|[\u0000-\u001F ]+$/g,R=/[\u0009\u000A\u000D]/g,D=function(t,e){var n,r,i;if("["==e.charAt(0)){if("]"!=e.charAt(e.length-1))return"Invalid host";if(!(n=B(e.slice(1,-1))))return"Invalid host";t.host=n}else if(V(t)){if(e=b(e),F.test(e))return"Invalid host";if(null===(n=$(e)))return"Invalid host";t.host=n}else{if(M.test(e))return"Invalid host";for(n="",r=h(e),i=0;i4)return t;for(n=[],r=0;r1&&"0"==i.charAt(0)&&(o=P.test(i)?16:8,i=i.slice(8==o?1:2)),""===i)s=0;else{if(!(10==o?C:8==o?E:I).test(i))return t;s=parseInt(i,o)}n.push(s)}for(r=0;r=S(256,5-e))return null}else if(s>255)return null;for(a=n.pop(),r=0;r6)return;for(r=0;p();){if(i=null,r>0){if(!("."==p()&&r<4))return;f++}if(!T.test(p()))return;for(;T.test(p());){if(o=parseInt(p(),10),null===i)i=o;else{if(0==i)return;i=10*i+o}if(i>255)return;f++}c[u]=256*c[u]+i,2!=++r&&4!=r||u++}if(4!=r)return;break}if(":"==p()){if(f++,!p())return}else if(p())return;c[u++]=e}else{if(null!==l)return;f++,l=++u}}if(null!==l)for(s=u-l,u=7;0!=u&&s>0;)a=c[u],c[u--]=c[l+s-1],c[l+--s]=a;else if(8!=u)return;return c},U=function(t){var e,n,r,i;if("number"==typeof t){for(e=[],n=0;n<4;n++)e.unshift(t%256),t=j(t/256);return e.join(".")}if("object"==typeof t){for(e="",r=function(t){for(var e=null,n=1,r=null,i=0,o=0;o<8;o++)0!==t[o]?(i>n&&(e=r,n=i),r=null,i=0):(null===r&&(r=o),++i);return i>n&&(e=r,n=i),e}(t),n=0;n<8;n++)i&&0===t[n]||(i&&(i=!1),r===n?(e+=n?":":"::",i=!0):(e+=t[n].toString(16),n<7&&(e+=":")));return"["+e+"]"}return t},L={},z=p({},L,{" ":1,'"':1,"<":1,">":1,"`":1}),q=p({},z,{"#":1,"?":1,"{":1,"}":1}),W=p({},q,{"/":1,":":1,";":1,"=":1,"@":1,"[":1,"\\":1,"]":1,"^":1,"|":1}),G=function(t,e){var n=d(t,0);return n>32&&n<127&&!f(e,t)?t:encodeURIComponent(t)},J={ftp:21,file:null,http:80,https:443,ws:80,wss:443},V=function(t){return f(J,t.scheme)},H=function(t){return""!=t.username||""!=t.password},X=function(t){return!t.host||t.cannotBeABaseURL||"file"==t.scheme},K=function(t,e){var n;return 2==t.length&&_.test(t.charAt(0))&&(":"==(n=t.charAt(1))||!e&&"|"==n)},Z=function(t){var e;return t.length>1&&K(t.slice(0,2))&&(2==t.length||"/"===(e=t.charAt(2))||"\\"===e||"?"===e||"#"===e)},Y=function(t){var e=t.path,n=e.length;!n||"file"==t.scheme&&1==n&&K(e[0],!0)||e.pop()},Q=function(t){return"."===t||"%2e"===t.toLowerCase()},tt={},et={},nt={},rt={},it={},ot={},st={},at={},ct={},ut={},lt={},ft={},pt={},ht={},dt={},bt={},mt={},gt={},vt={},yt={},wt={},kt=function(t,e,n,i){var o,s,a,c,u,l=n||tt,p=0,d="",b=!1,m=!1,g=!1;for(n||(t.scheme="",t.username="",t.password="",t.host=null,t.port=null,t.path=[],t.query=null,t.fragment=null,t.cannotBeABaseURL=!1,e=e.replace(N,"")),e=e.replace(R,""),o=h(e);p<=o.length;){switch(s=o[p],l){case tt:if(!s||!_.test(s)){if(n)return"Invalid scheme";l=nt;continue}d+=s.toLowerCase(),l=et;break;case et:if(s&&(A.test(s)||"+"==s||"-"==s||"."==s))d+=s.toLowerCase();else{if(":"!=s){if(n)return"Invalid scheme";d="",l=nt,p=0;continue}if(n&&(V(t)!=f(J,d)||"file"==d&&(H(t)||null!==t.port)||"file"==t.scheme&&!t.host))return;if(t.scheme=d,n)return void(V(t)&&J[t.scheme]==t.port&&(t.port=null));d="","file"==t.scheme?l=ht:V(t)&&i&&i.scheme==t.scheme?l=rt:V(t)?l=at:"/"==o[p+1]?(l=it,p++):(t.cannotBeABaseURL=!0,t.path.push(""),l=vt)}break;case nt:if(!i||i.cannotBeABaseURL&&"#"!=s)return"Invalid scheme";if(i.cannotBeABaseURL&&"#"==s){t.scheme=i.scheme,t.path=i.path.slice(),t.query=i.query,t.fragment="",t.cannotBeABaseURL=!0,l=wt;break}l="file"==i.scheme?ht:ot;continue;case rt:if("/"!=s||"/"!=o[p+1]){l=ot;continue}l=ct,p++;break;case it:if("/"==s){l=ut;break}l=gt;continue;case ot:if(t.scheme=i.scheme,s==r)t.username=i.username,t.password=i.password,t.host=i.host,t.port=i.port,t.path=i.path.slice(),t.query=i.query;else if("/"==s||"\\"==s&&V(t))l=st;else if("?"==s)t.username=i.username,t.password=i.password,t.host=i.host,t.port=i.port,t.path=i.path.slice(),t.query="",l=yt;else{if("#"!=s){t.username=i.username,t.password=i.password,t.host=i.host,t.port=i.port,t.path=i.path.slice(),t.path.pop(),l=gt;continue}t.username=i.username,t.password=i.password,t.host=i.host,t.port=i.port,t.path=i.path.slice(),t.query=i.query,t.fragment="",l=wt}break;case st:if(!V(t)||"/"!=s&&"\\"!=s){if("/"!=s){t.username=i.username,t.password=i.password,t.host=i.host,t.port=i.port,l=gt;continue}l=ut}else l=ct;break;case at:if(l=ct,"/"!=s||"/"!=d.charAt(p+1))continue;p++;break;case ct:if("/"!=s&&"\\"!=s){l=ut;continue}break;case ut:if("@"==s){b&&(d="%40"+d),b=!0,a=h(d);for(var v=0;v65535)return"Invalid port";t.port=V(t)&&k===J[t.scheme]?null:k,d=""}if(n)return;l=mt;continue}return"Invalid port"}d+=s;break;case ht:if(t.scheme="file","/"==s||"\\"==s)l=dt;else{if(!i||"file"!=i.scheme){l=gt;continue}if(s==r)t.host=i.host,t.path=i.path.slice(),t.query=i.query;else if("?"==s)t.host=i.host,t.path=i.path.slice(),t.query="",l=yt;else{if("#"!=s){Z(o.slice(p).join(""))||(t.host=i.host,t.path=i.path.slice(),Y(t)),l=gt;continue}t.host=i.host,t.path=i.path.slice(),t.query=i.query,t.fragment="",l=wt}}break;case dt:if("/"==s||"\\"==s){l=bt;break}i&&"file"==i.scheme&&!Z(o.slice(p).join(""))&&(K(i.path[0],!0)?t.path.push(i.path[0]):t.host=i.host),l=gt;continue;case bt:if(s==r||"/"==s||"\\"==s||"?"==s||"#"==s){if(!n&&K(d))l=gt;else if(""==d){if(t.host="",n)return;l=mt}else{if(c=D(t,d))return c;if("localhost"==t.host&&(t.host=""),n)return;d="",l=mt}continue}d+=s;break;case mt:if(V(t)){if(l=gt,"/"!=s&&"\\"!=s)continue}else if(n||"?"!=s)if(n||"#"!=s){if(s!=r&&(l=gt,"/"!=s))continue}else t.fragment="",l=wt;else t.query="",l=yt;break;case gt:if(s==r||"/"==s||"\\"==s&&V(t)||!n&&("?"==s||"#"==s)){if(".."===(u=(u=d).toLowerCase())||"%2e."===u||".%2e"===u||"%2e%2e"===u?(Y(t),"/"==s||"\\"==s&&V(t)||t.path.push("")):Q(d)?"/"==s||"\\"==s&&V(t)||t.path.push(""):("file"==t.scheme&&!t.path.length&&K(d)&&(t.host&&(t.host=""),d=d.charAt(0)+":"),t.path.push(d)),d="","file"==t.scheme&&(s==r||"?"==s||"#"==s))for(;t.path.length>1&&""===t.path[0];)t.path.shift();"?"==s?(t.query="",l=yt):"#"==s&&(t.fragment="",l=wt)}else d+=G(s,q);break;case vt:"?"==s?(t.query="",l=yt):"#"==s?(t.fragment="",l=wt):s!=r&&(t.path[0]+=G(s,L));break;case yt:n||"#"!=s?s!=r&&("'"==s&&V(t)?t.query+="%27":t.query+="#"==s?"%23":G(s,L)):(t.fragment="",l=wt);break;case wt:s!=r&&(t.fragment+=G(s,z))}p++}},xt=function(t){var e,n,r=l(this,xt,"URL"),i=arguments.length>1?arguments[1]:void 0,s=String(t),a=x(r,{type:"URL"});if(void 0!==i)if(i instanceof xt)e=O(i);else if(n=kt(e={},String(i)))throw TypeError(n);if(n=kt(a,s,null,e))throw TypeError(n);var c=a.searchParams=new w,u=k(c);u.updateSearchParams(a.query),u.updateURL=function(){a.query=String(c)||null},o||(r.href=jt.call(r),r.origin=St.call(r),r.protocol=_t.call(r),r.username=At.call(r),r.password=Tt.call(r),r.host=Pt.call(r),r.hostname=Et.call(r),r.port=Ct.call(r),r.pathname=It.call(r),r.search=Ft.call(r),r.searchParams=Mt.call(r),r.hash=Nt.call(r))},Ot=xt.prototype,jt=function(){var t=O(this),e=t.scheme,n=t.username,r=t.password,i=t.host,o=t.port,s=t.path,a=t.query,c=t.fragment,u=e+":";return null!==i?(u+="//",H(t)&&(u+=n+(r?":"+r:"")+"@"),u+=U(i),null!==o&&(u+=":"+o)):"file"==e&&(u+="//"),u+=t.cannotBeABaseURL?s[0]:s.length?"/"+s.join("/"):"",null!==a&&(u+="?"+a),null!==c&&(u+="#"+c),u},St=function(){var t=O(this),e=t.scheme,n=t.port;if("blob"==e)try{return new URL(e.path[0]).origin}catch(t){return"null"}return"file"!=e&&V(t)?e+"://"+U(t.host)+(null!==n?":"+n:""):"null"},_t=function(){return O(this).scheme+":"},At=function(){return O(this).username},Tt=function(){return O(this).password},Pt=function(){var t=O(this),e=t.host,n=t.port;return null===e?"":null===n?U(e):U(e)+":"+n},Et=function(){var t=O(this).host;return null===t?"":U(t)},Ct=function(){var t=O(this).port;return null===t?"":String(t)},It=function(){var t=O(this),e=t.path;return t.cannotBeABaseURL?e[0]:e.length?"/"+e.join("/"):""},Ft=function(){var t=O(this).query;return t?"?"+t:""},Mt=function(){return O(this).searchParams},Nt=function(){var t=O(this).fragment;return t?"#"+t:""},Rt=function(t,e){return{get:t,set:e,configurable:!0,enumerable:!0}};if(o&&c(Ot,{href:Rt(jt,(function(t){var e=O(this),n=String(t),r=kt(e,n);if(r)throw TypeError(r);k(e.searchParams).updateSearchParams(e.query)})),origin:Rt(St),protocol:Rt(_t,(function(t){var e=O(this);kt(e,String(t)+":",tt)})),username:Rt(At,(function(t){var e=O(this),n=h(String(t));if(!X(e)){e.username="";for(var r=0;r=n.length?{value:void 0,done:!0}:(t=r(n,i),e.index+=t.length,{value:t,done:!1})}))},function(t,e,n){"use strict";var r=n(13),i=n(3),o=n(105),s=n(92),a=n(84),c=n(37),u=n(85),l=Object.assign;t.exports=!l||i((function(){var t={},e={},n=Symbol();return t[n]=7,"abcdefghijklmnopqrst".split("").forEach((function(t){e[t]=t})),7!=l({},t)[n]||"abcdefghijklmnopqrst"!=o(l({},e)).join("")}))?function(t,e){for(var n=c(t),i=arguments.length,l=1,f=s.f,p=a.f;i>l;)for(var h,d=u(arguments[l++]),b=f?o(d).concat(f(d)):o(d),m=b.length,g=0;m>g;)h=b[g++],r&&!p.call(d,h)||(n[h]=d[h]);return n}:l},function(t,e,n){"use strict";var r=n(47),i=n(37),o=n(97),s=n(96),a=n(45),c=n(258),u=n(48);t.exports=function(t){var e,n,l,f,p,h=i(t),d="function"==typeof this?this:Array,b=arguments.length,m=b>1?arguments[1]:void 0,g=void 0!==m,v=0,y=u(h);if(g&&(m=r(m,b>2?arguments[2]:void 0,2)),null==y||d==Array&&s(y))for(n=new d(e=a(h.length));e>v;v++)c(n,v,g?m(h[v],v):h[v]);else for(p=(f=y.call(h)).next,n=new d;!(l=p.call(f)).done;v++)c(n,v,g?o(f,m,[l.value,v],!0):l.value);return n.length=v,n}},function(t,e,n){"use strict";var r=n(58),i=n(21),o=n(42);t.exports=function(t,e,n){var s=r(e);s in t?i.f(t,s,o(0,n)):t[s]=n}},function(t,e,n){"use strict";var r=/[^\0-\u007E]/,i=/[.\u3002\uFF0E\uFF61]/g,o="Overflow: input needs wider integers to process",s=Math.floor,a=String.fromCharCode,c=function(t){return t+22+75*(t<26)},u=function(t,e,n){var r=0;for(t=n?s(t/700):t>>1,t+=s(t/e);t>455;r+=36)t=s(t/35);return s(r+36*t/(t+38))},l=function(t){var e,n,r=[],i=(t=function(t){for(var e=[],n=0,r=t.length;n=55296&&i<=56319&&n=l&&ns((2147483647-f)/m))throw RangeError(o);for(f+=(b-l)*m,l=b,e=0;e2147483647)throw RangeError(o);if(n==l){for(var g=f,v=36;;v+=36){var y=v<=p?1:v>=p+26?26:v-p;if(g0?arguments[0]:void 0,p=this,g=[];if(v(p,{type:"URLSearchParams",entries:g,updateURL:function(){},updateSearchParams:C}),void 0!==u)if(d(u))if("function"==typeof(t=m(u)))for(n=(e=t.call(u)).next;!(r=n.call(e)).done;){if((s=(o=(i=b(h(r.value))).next).call(i)).done||(a=o.call(i)).done||!o.call(i).done)throw TypeError("Expected sequence with length 2");g.push({key:s.value+"",value:a.value+""})}else for(c in u)f(u,c)&&g.push({key:c,value:u[c]+""});else E(g,"string"==typeof u?"?"===u.charAt(0)?u.slice(1):u:u+"")},N=M.prototype;s(N,{append:function(t,e){I(arguments.length,2);var n=y(this);n.entries.push({key:t+"",value:e+""}),n.updateURL()},delete:function(t){I(arguments.length,1);for(var e=y(this),n=e.entries,r=t+"",i=0;it.key){i.splice(e,0,t);break}e===n&&i.push(t)}r.updateURL()},forEach:function(t){for(var e,n=y(this).entries,r=p(t,arguments.length>1?arguments[1]:void 0,3),i=0;i=0)return;s[e]="set-cookie"===e?(s[e]?s[e]:[]).concat([n]):s[e]?s[e]+", "+n:n}})),s):s}},function(t,e,n){"use strict";var r=n(7);t.exports=r.isStandardBrowserEnv()?function(){var t,e=/(msie|trident)/i.test(navigator.userAgent),n=document.createElement("a");function i(t){var r=t;return e&&(n.setAttribute("href",r),r=n.href),n.setAttribute("href",r),{href:n.href,protocol:n.protocol?n.protocol.replace(/:$/,""):"",host:n.host,search:n.search?n.search.replace(/^\?/,""):"",hash:n.hash?n.hash.replace(/^#/,""):"",hostname:n.hostname,port:n.port,pathname:"/"===n.pathname.charAt(0)?n.pathname:"/"+n.pathname}}return t=i(window.location.href),function(e){var n=r.isString(e)?i(e):e;return n.protocol===t.protocol&&n.host===t.host}}():function(){return!0}},function(t,e,n){"use strict";var r=n(7);t.exports=r.isStandardBrowserEnv()?{write:function(t,e,n,i,o,s){var a=[];a.push(t+"="+encodeURIComponent(e)),r.isNumber(n)&&a.push("expires="+new Date(n).toGMTString()),r.isString(i)&&a.push("path="+i),r.isString(o)&&a.push("domain="+o),!0===s&&a.push("secure"),document.cookie=a.join("; ")},read:function(t){var e=document.cookie.match(new RegExp("(^|;\\s*)("+t+")=([^;]*)"));return e?decodeURIComponent(e[3]):null},remove:function(t){this.write(t,"",Date.now()-864e5)}}:{write:function(){},read:function(){return null},remove:function(){}}},function(t,e,n){"use strict";var r=n(7);function i(){this.handlers=[]}i.prototype.use=function(t,e){return this.handlers.push({fulfilled:t,rejected:e}),this.handlers.length-1},i.prototype.eject=function(t){this.handlers[t]&&(this.handlers[t]=null)},i.prototype.forEach=function(t){r.forEach(this.handlers,(function(e){null!==e&&t(e)}))},t.exports=i},function(t,e,n){"use strict";var r=n(7),i=n(195),o=n(115),s=n(68),a=n(196),c=n(197);function u(t){t.cancelToken&&t.cancelToken.throwIfRequested()}t.exports=function(t){return u(t),t.baseURL&&!a(t.url)&&(t.url=c(t.baseURL,t.url)),t.headers=t.headers||{},t.data=i(t.data,t.headers,t.transformRequest),t.headers=r.merge(t.headers.common||{},t.headers[t.method]||{},t.headers||{}),r.forEach(["delete","get","head","post","put","patch","common"],(function(e){delete t.headers[e]})),(t.adapter||s.adapter)(t).then((function(e){return u(t),e.data=i(e.data,e.headers,t.transformResponse),e}),(function(e){return o(e)||(u(t),e&&e.response&&(e.response.data=i(e.response.data,e.response.headers,t.transformResponse))),Promise.reject(e)}))}},function(t,e,n){"use strict";var r=n(7);t.exports=function(t,e,n){return r.forEach(n,(function(n){t=n(t,e)})),t}},function(t,e,n){"use strict";t.exports=function(t){return/^([a-z][a-z\d\+\-\.]*:)?\/\//i.test(t)}},function(t,e,n){"use strict";t.exports=function(t,e){return e?t.replace(/\/+$/,"")+"/"+e.replace(/^\/+/,""):t}},function(t,e,n){"use strict";var r=n(116);function i(t){if("function"!=typeof t)throw new TypeError("executor must be a function.");var e;this.promise=new Promise((function(t){e=t}));var n=this;t((function(t){n.reason||(n.reason=new r(t),e(n.reason))}))}i.prototype.throwIfRequested=function(){if(this.reason)throw this.reason},i.source=function(){var t;return{token:new i((function(e){t=e})),cancel:t}},t.exports=i},function(t,e,n){"use strict";t.exports=function(t){return function(e){return t.apply(null,e)}}},function(t,e,n){"use strict";var r=n(12),i=n(201).trim;r({target:"String",proto:!0,forced:n(202)("trim")},{trim:function(){return i(this)}})},function(t,e,n){var r=n(31),i="["+n(118)+"]",o=RegExp("^"+i+i+"*"),s=RegExp(i+i+"*$"),a=function(t){return function(e){var n=String(r(e));return 1&t&&(n=n.replace(o,"")),2&t&&(n=n.replace(s,"")),n}};t.exports={start:a(1),end:a(2),trim:a(3)}},function(t,e,n){var r=n(3),i=n(118);t.exports=function(t){return r((function(){return!!i[t]()||"​…᠎"!="​…᠎"[t]()||i[t].name!==t}))}},function(t,e,n){(function(e){n(5),n(11),n(204),n(10),(()=>{const r=n(205),i=n(36),o=n(26),{isBrowser:s,isNode:a}=n(246),{Exception:c,ArgumentError:u}=n(6),l={};class f{constructor(t,e,n,r,i,o){Object.defineProperties(this,Object.freeze({width:{value:t,writable:!1},height:{value:e,writable:!1},tid:{value:n,writable:!1},number:{value:r,writable:!1},startFrame:{value:i,writable:!1},stopFrame:{value:o,writable:!1}}))}async data(t=(()=>{})){return await i.apiWrapper.call(this,f.prototype.data,t)}}f.prototype.data.implementation=async function(t){return new Promise(async(e,n)=>{const r=t=>{if(l[this.tid].activeChunkRequest&&b===l[this.tid].activeChunkRequest.chunkNumber){const e=l[this.tid].activeChunkRequest.callbacks;for(const n of e)n.resolve(f.frame(t));l[this.tid].activeChunkRequest=void 0}},i=()=>{if(l[this.tid].activeChunkRequest&&b===l[this.tid].activeChunkRequest.chunkNumber){for(const t of l[this.tid].activeChunkRequest.callbacks)t.reject(t.frameNumber);l[this.tid].activeChunkRequest=void 0}},u=()=>{const t=l[this.tid].activeChunkRequest;t.request=o.frames.getData(this.tid,t.chunkNumber).then(t=>{l[this.tid].activeChunkRequest.completed=!0,f.requestDecodeBlock(t,l[this.tid].activeChunkRequest.start,l[this.tid].activeChunkRequest.stop,l[this.tid].activeChunkRequest.onDecodeAll,l[this.tid].activeChunkRequest.rejectRequestAll)}).catch(t=>{n(t instanceof c?t:new c(t.message))}).finally(()=>{if(l[this.tid].nextChunkRequest){if(l[this.tid].activeChunkRequest)for(const t of l[this.tid].activeChunkRequest.callbacks)t.reject(t.frameNumber);l[this.tid].activeChunkRequest=l[this.tid].nextChunkRequest,l[this.tid].nextChunkRequest=void 0,u()}})},{provider:f}=l[this.tid],{chunkSize:p}=l[this.tid],h=Math.max(this.startFrame,parseInt(this.number/p,10)*p),d=Math.min(this.stopFrame,(parseInt(this.number/p,10)+1)*p-1),b=Math.floor(this.number/p);if(a)e("Dummy data");else if(s)try{const{decodedBlocksCacheSize:o}=l[this.tid];let s=await f.frame(this.number);if(null===s)if(t(),f.is_chunk_cached(h,d))l[this.tid].activeChunkRequest.callbacks.push({resolve:e,reject:n,frameNumber:this.number}),f.requestDecodeBlock(null,h,d,r,i);else if(!l[this.tid].activeChunkRequest||l[this.tid].activeChunkRequest&&l[this.tid].activeChunkRequest.completed)l[this.tid].activeChunkRequest&&l[this.tid].activeChunkRequest.rejectRequestAll(),l[this.tid].activeChunkRequest={request:void 0,chunkNumber:b,start:h,stop:d,onDecodeAll:r,rejectRequestAll:i,completed:!1,callbacks:[{resolve:e,reject:n,frameNumber:this.number}]},u();else if(l[this.tid].activeChunkRequest.chunkNumber===b)l[this.tid].activeChunkRequest.callbacks.push({resolve:e,reject:n,frameNumber:this.number});else{if(l[this.tid].nextChunkRequest)for(const t of l[this.tid].nextChunkRequest.callbacks)t.reject(t.frameNumber);l[this.tid].nextChunkRequest={request:void 0,chunkNumber:b,start:h,stop:d,onDecodeAll:r,rejectRequestAll:i,completed:!1,callbacks:[{resolve:e,reject:n,frameNumber:this.number}]}}else e(s)}catch(t){n(t instanceof c?t:new c(t.message))}})},t.exports={FrameData:f,getFrame:async function(t,e,n,i,s,a,c){if(!(t in l)){const i="video"===n?r.BlockType.MP4VIDEO:r.BlockType.ARCHIVE,a=await o.frames.getMeta(t),c=i===r.BlockType.MP4VIDEO?Math.floor(258.90765432098766/e)||1:Math.floor(500/e)||1;l[t]={meta:a,chunkSize:e,provider:new r.FrameProvider(i,e,9,c,1),lastFrameRequest:s,decodedBlocksCacheSize:c,activeChunkRequest:void 0,nextChunkRequest:void 0}}const p=(t=>{let e=null;if("interpolation"===i)[e]=t;else{if("annotation"!==i)throw new u(`Invalid mode is specified ${i}`);if(s>=t.length)throw new u(`Meta information about frame ${s} can't be received from the server`);e=t[s]}return e})(l[t].meta);return l[t].lastFrameRequest=s,l[t].provider.setRenderSize(p.width,p.height),new f(p.width,p.height,t,s,a,c)},getRanges:function(t){return t in l?l[t].provider.cachedFrames:[]},getPreview:async function(t){return new Promise(async(n,r)=>{try{const r=await o.frames.getPreview(t);if(a)n(e.Buffer.from(r,"binary").toString("base64"));else if(s){const t=new FileReader;t.onload=()=>{n(t.result)},t.readAsDataURL(r)}}catch(t){r(t)}})}}})()}).call(this,n(30))},function(t,e,n){"use strict";var r=n(12),i=n(24),o=n(94),s=n(32),a=n(98),c=n(101),u=n(18);r({target:"Promise",proto:!0,real:!0},{finally:function(t){var e=a(this,s("Promise")),n="function"==typeof t;return this.then(n?function(n){return c(e,t()).then((function(){return n}))}:t,n?function(n){return c(e,t()).then((function(){throw n}))}:t)}}),i||"function"!=typeof o||o.prototype.finally||u(o.prototype,"finally",s("Promise").prototype.finally)},function(t,e,n){n(72),n(225),n(227),n(243);const{MP4Reader:r,Bytestream:i}=n(245),o=Object.freeze({MP4VIDEO:"mp4video",ARCHIVE:"archive"});class s{constructor(){this._lock=Promise.resolve()}_acquire(){var t;return this._lock=new Promise(e=>{t=e}),t}acquireQueued(){const t=this._lock.then(()=>e),e=this._acquire();return t}}t.exports={FrameProvider:class{constructor(t,e,n,r=5,i=2){this._frames={},this._cachedBlockCount=Math.max(1,n),this._decodedBlocksCacheSize=r,this._blocks_ranges=[],this._blocks={},this._blockSize=e,this._running=!1,this._blockType=t,this._currFrame=-1,this._requestedBlockDecode=null,this._width=null,this._height=null,this._decodingBlocks={},this._decodeThreadCount=0,this._timerId=setTimeout(this._worker.bind(this),100),this._mutex=new s,this._promisedFrames={},this._maxWorkerThreadCount=i}async _worker(){null!=this._requestedBlockDecode&&this._decodeThreadCountthis._cachedBlockCount){const t=this._blocks_ranges.shift(),[e,n]=t.split(":").map(t=>+t);delete this._blocks[e/this._blockSize];for(let t=e;t<=n;t++)delete this._frames[t]}const t=Math.floor(this._decodedBlocksCacheSize/2);for(let e=0;e+t);if(rthis._currFrame+t*this._blockSize)for(let t=n;t<=r;t++)delete this._frames[t]}}async requestDecodeBlock(t,e,n,r,i){const o=await this._mutex.acquireQueued();null!==this._requestedBlockDecode&&(e===this._requestedBlockDecode.start&&n===this._requestedBlockDecode.end?(this._requestedBlockDecode.resolveCallback=r,this._requestedBlockDecode.rejectCallback=i):this._requestedBlockDecode.rejectCallback&&this._requestedBlockDecode.rejectCallback()),`${e}:${n}`in this._decodingBlocks?(this._decodingBlocks[`${e}:${n}`].rejectCallback=i,this._decodingBlocks[`${e}:${n}`].resolveCallback=r):(null===t&&(t=this._blocks[Math.floor((e+1)/this.blockSize)]),this._requestedBlockDecode={block:t,start:e,end:n,resolveCallback:r,rejectCallback:i}),o()}isRequestExist(){return null!=this._requestedBlockDecode}setRenderSize(t,e){this._width=t,this._height=e}async frame(t){return this._currFrame=t,new Promise((e,n)=>{t in this._frames?null!==this._frames[t]?e(this._frames[t]):this._promisedFrames[t]={resolve:e,reject:n}:e(null)})}isNextChunkExists(t){const e=Math.floor(t/this._blockSize)+1;return"loading"===this._blocks[e]||e in this._blocks}setReadyToLoading(t){this._blocks[t]="loading"}cropImage(t,e,n,r,i,o,s){if(0===r&&o===e&&0===i&&s===n)return new ImageData(new Uint8ClampedArray(t),o,s);const a=new Uint32Array(t),c=o*s*4,u=new ArrayBuffer(c),l=new Uint32Array(u),f=new Uint8ClampedArray(u);if(e===o)return new ImageData(new Uint8ClampedArray(t,4*i,c),o,s);let p=0;for(let t=i;t{if(r.data.consoleLog)return;const i=Math.ceil(this._height/r.data.height);this._frames[o]=this.cropImage(r.data.buf,r.data.width,r.data.height,0,0,Math.floor(n/i),Math.floor(e/i)),this._decodingBlocks[`${s}:${a}`].resolveCallback&&this._decodingBlocks[`${s}:${a}`].resolveCallback(o),o in this._promisedFrames&&(this._promisedFrames[o].resolve(this._frames[o]),delete this._promisedFrames[o]),o===a&&(this._decodeThreadCount--,delete this._decodingBlocks[`${s}:${a}`],t.terminate()),o++},t.onerror=e=>{console.log(["ERROR: Line ",e.lineno," in ",e.filename,": ",e.message].join("")),t.terminate(),this._decodeThreadCount--;for(let t=o;t<=a;t++)t in this._promisedFrames&&(this._promisedFrames[t].reject(),delete this._promisedFrames[t]);this._decodingBlocks[`${s}:${a}`].rejectCallback&&this._decodingBlocks[`${s}:${a}`].rejectCallback(),delete this._decodingBlocks[`${s}:${a}`]},t.postMessage({type:"Broadway.js - Worker init",options:{rgb:!0,reuseMemory:!1}});const u=new r(new i(c));u.read();const l=u.tracks[1],f=u.tracks[1].trak.mdia.minf.stbl.stsd.avc1.avcC,p=f.sps[0],h=f.pps[0];t.postMessage({buf:p,offset:0,length:p.length}),t.postMessage({buf:h,offset:0,length:h.length});for(let e=0;e{t.postMessage({buf:e,offset:0,length:e.length})});this._decodeThreadCount++}else{const t=new Worker("/static/engine/js/unzip_imgs.js");t.onerror=t=>{console.log(["ERROR: Line ",t.lineno," in ",t.filename,": ",t.message].join(""));for(let t=s;t<=a;t++)t in this._promisedFrames&&(this._promisedFrames[t].reject(),delete this._promisedFrames[t]);this._decodingBlocks[`${s}:${a}`].rejectCallback&&this._decodingBlocks[`${s}:${a}`].rejectCallback(),this._decodeThreadCount--},t.onmessage=t=>{this._frames[t.data.index]={data:t.data.data,width:n,height:e},this._decodingBlocks[`${s}:${a}`].resolveCallback&&this._decodingBlocks[`${s}:${a}`].resolveCallback(t.data.index),t.data.index in this._promisedFrames&&(this._promisedFrames[t.data.index].resolve(this._frames[t.data.index]),delete this._promisedFrames[t.data.index]),t.data.isEnd&&(delete this._decodingBlocks[`${s}:${a}`],this._decodeThreadCount--)},t.postMessage({block:c,start:s,end:a}),this._decodeThreadCount++}t()}get decodeThreadCount(){return this._decodeThreadCount}get cachedFrames(){return[...this._blocks_ranges].sort((t,e)=>t.split(":")[0]-e.split(":")[0])}},BlockType:o}},function(t,e,n){var r=n(16),i=n(38),o="".split;t.exports=r((function(){return!Object("z").propertyIsEnumerable(0)}))?function(t){return"String"==i(t)?o.call(t,""):Object(t)}:Object},function(t,e,n){var r=n(8),i=n(123),o=n(19),s=r("unscopables"),a=Array.prototype;null==a[s]&&o(a,s,i(null)),t.exports=function(t){a[s][t]=!0}},function(t,e,n){var r=n(1),i=n(73),o=r["__core-js_shared__"]||i("__core-js_shared__",{});t.exports=o},function(t,e,n){var r=n(16);t.exports=!!Object.getOwnPropertySymbols&&!r((function(){return!String(Symbol())}))},function(t,e,n){var r=n(28),i=n(39),o=n(17),s=n(211);t.exports=r?Object.defineProperties:function(t,e){o(t);for(var n,r=s(e),a=r.length,c=0;a>c;)i.f(t,n=r[c++],e[n]);return t}},function(t,e,n){var r=n(124),i=n(77);t.exports=Object.keys||function(t){return r(t,i)}},function(t,e,n){var r=n(50),i=n(125),o=n(213),s=function(t){return function(e,n,s){var a,c=r(e),u=i(c.length),l=o(s,u);if(t&&n!=n){for(;u>l;)if((a=c[l++])!=a)return!0}else for(;u>l;l++)if((t||l in c)&&c[l]===n)return t||l||0;return!t&&-1}};t.exports={includes:s(!0),indexOf:s(!1)}},function(t,e,n){var r=n(126),i=Math.max,o=Math.min;t.exports=function(t,e){var n=r(t);return n<0?i(n+e,0):o(n,e)}},function(t,e,n){var r=n(1),i=n(129),o=r.WeakMap;t.exports="function"==typeof o&&/native code/.test(i.call(o))},function(t,e,n){"use strict";var r=n(80),i=n(221),o=n(132),s=n(223),a=n(82),c=n(19),u=n(54),l=n(8),f=n(52),p=n(40),h=n(131),d=h.IteratorPrototype,b=h.BUGGY_SAFARI_ITERATORS,m=l("iterator"),g=function(){return this};t.exports=function(t,e,n,l,h,v,y){i(n,e,l);var w,k,x,O=function(t){if(t===h&&T)return T;if(!b&&t in _)return _[t];switch(t){case"keys":case"values":case"entries":return function(){return new n(this,t)}}return function(){return new n(this)}},j=e+" Iterator",S=!1,_=t.prototype,A=_[m]||_["@@iterator"]||h&&_[h],T=!b&&A||O(h),P="Array"==e&&_.entries||A;if(P&&(w=o(P.call(new t)),d!==Object.prototype&&w.next&&(f||o(w)===d||(s?s(w,d):"function"!=typeof w[m]&&c(w,m,g)),a(w,j,!0,!0),f&&(p[j]=g))),"values"==h&&A&&"values"!==A.name&&(S=!0,T=function(){return A.call(this)}),f&&!y||_[m]===T||c(_,m,T),p[e]=T,h)if(k={values:O("values"),keys:v?T:O("keys"),entries:O("entries")},y)for(x in k)!b&&!S&&x in _||u(_,x,k[x]);else r({target:e,proto:!0,forced:b||S},k);return k}},function(t,e,n){"use strict";var r={}.propertyIsEnumerable,i=Object.getOwnPropertyDescriptor,o=i&&!r.call({1:2},1);e.f=o?function(t){var e=i(this,t);return!!e&&e.enumerable}:r},function(t,e,n){var r=n(20),i=n(218),o=n(81),s=n(39);t.exports=function(t,e){for(var n=i(e),a=s.f,c=o.f,u=0;us;){var a,c,u,l=r[s++],f=o?l.ok:l.fail,p=l.resolve,h=l.reject,d=l.domain;try{f?(o||(2===e.rejection&&et(t,e),e.rejection=1),!0===f?a=i:(d&&d.enter(),a=f(i),d&&(d.exit(),u=!0)),a===l.promise?h($("Promise-chain cycle")):(c=K(a))?c.call(a,p,h):p(a)):h(i)}catch(t){d&&!u&&d.exit(),h(t)}}e.reactions=[],e.notified=!1,n&&!e.rejection&&Q(t,e)}))}},Y=function(t,e,n){var r,i;V?((r=B.createEvent("Event")).promise=e,r.reason=n,r.initEvent(t,!1,!0),u.dispatchEvent(r)):r={promise:e,reason:n},(i=u["on"+t])?i(r):"unhandledrejection"===t&&_("Unhandled promise rejection",n)},Q=function(t,e){O.call(u,(function(){var n,r=e.value;if(tt(e)&&(n=T((function(){J?U.emit("unhandledRejection",r,t):Y("unhandledrejection",t,r)})),e.rejection=J||tt(e)?2:1,n.error))throw n.value}))},tt=function(t){return 1!==t.rejection&&!t.parent},et=function(t,e){O.call(u,(function(){J?U.emit("rejectionHandled",t):Y("rejectionhandled",t,e.value)}))},nt=function(t,e,n,r){return function(i){t(e,n,i,r)}},rt=function(t,e,n,r){e.done||(e.done=!0,r&&(e=r),e.value=n,e.state=2,Z(t,e,!0))},it=function(t,e,n,r){if(!e.done){e.done=!0,r&&(e=r);try{if(t===n)throw $("Promise can't be resolved itself");var i=K(n);i?j((function(){var r={done:!1};try{i.call(n,nt(it,t,r,e),nt(rt,t,r,e))}catch(n){rt(t,r,n,e)}})):(e.value=n,e.state=1,Z(t,e,!1))}catch(n){rt(t,{done:!1},n,e)}}};H&&(D=function(t){v(this,D,F),g(t),r.call(this);var e=M(this);try{t(nt(it,this,e),nt(rt,this,e))}catch(t){rt(this,e,t)}},(r=function(t){N(this,{type:F,done:!1,notified:!1,parent:!1,reactions:[],rejection:!1,state:0,value:void 0})}).prototype=h(D.prototype,{then:function(t,e){var n=R(this),r=W(x(this,D));return r.ok="function"!=typeof t||t,r.fail="function"==typeof e&&e,r.domain=J?U.domain:void 0,n.parent=!0,n.reactions.push(r),0!=n.state&&Z(this,n,!1),r.promise},catch:function(t){return this.then(void 0,t)}}),i=function(){var t=new r,e=M(t);this.promise=t,this.resolve=nt(it,t,e),this.reject=nt(rt,t,e)},A.f=W=function(t){return t===D||t===o?new i(t):G(t)},c||"function"!=typeof f||(s=f.prototype.then,p(f.prototype,"then",(function(t,e){var n=this;return new D((function(t,e){s.call(n,t,e)})).then(t,e)}),{unsafe:!0}),"function"==typeof L&&a({global:!0,enumerable:!0,forced:!0},{fetch:function(t){return S(D,L.apply(u,arguments))}}))),a({global:!0,wrap:!0,forced:H},{Promise:D}),d(D,F,!1,!0),b(F),o=l.Promise,a({target:F,stat:!0,forced:H},{reject:function(t){var e=W(this);return e.reject.call(void 0,t),e.promise}}),a({target:F,stat:!0,forced:c||H},{resolve:function(t){return S(c&&this===o?D:this,t)}}),a({target:F,stat:!0,forced:X},{all:function(t){var e=this,n=W(e),r=n.resolve,i=n.reject,o=T((function(){var n=g(e.resolve),o=[],s=0,a=1;w(t,(function(t){var c=s++,u=!1;o.push(void 0),a++,n.call(e,t).then((function(t){u||(u=!0,o[c]=t,--a||r(o))}),i)})),--a||r(o)}));return o.error&&i(o.value),n.promise},race:function(t){var e=this,n=W(e),r=n.reject,i=T((function(){var i=g(e.resolve);w(t,(function(t){i.call(e,t).then(n.resolve,r)}))}));return i.error&&r(i.value),n.promise}})},function(t,e,n){var r=n(1);t.exports=r.Promise},function(t,e,n){var r=n(54);t.exports=function(t,e,n){for(var i in e)r(t,i,e[i],n);return t}},function(t,e,n){"use strict";var r=n(53),i=n(39),o=n(8),s=n(28),a=o("species");t.exports=function(t){var e=r(t),n=i.f;s&&e&&!e[a]&&n(e,a,{configurable:!0,get:function(){return this}})}},function(t,e){t.exports=function(t,e,n){if(!(t instanceof e))throw TypeError("Incorrect "+(n?n+" ":"")+"invocation");return t}},function(t,e,n){var r=n(17),i=n(233),o=n(125),s=n(134),a=n(234),c=n(236),u=function(t,e){this.stopped=t,this.result=e};(t.exports=function(t,e,n,l,f){var p,h,d,b,m,g,v,y=s(e,n,l?2:1);if(f)p=t;else{if("function"!=typeof(h=a(t)))throw TypeError("Target is not iterable");if(i(h)){for(d=0,b=o(t.length);b>d;d++)if((m=l?y(r(v=t[d])[0],v[1]):y(t[d]))&&m instanceof u)return m;return new u(!1)}p=h.call(t)}for(g=p.next;!(v=g.call(p)).done;)if("object"==typeof(m=c(p,y,v.value,l))&&m&&m instanceof u)return m;return new u(!1)}).stop=function(t){return new u(!0,t)}},function(t,e,n){var r=n(8),i=n(40),o=r("iterator"),s=Array.prototype;t.exports=function(t){return void 0!==t&&(i.Array===t||s[o]===t)}},function(t,e,n){var r=n(235),i=n(40),o=n(8)("iterator");t.exports=function(t){if(null!=t)return t[o]||t["@@iterator"]||i[r(t)]}},function(t,e,n){var r=n(38),i=n(8)("toStringTag"),o="Arguments"==r(function(){return arguments}());t.exports=function(t){var e,n,s;return void 0===t?"Undefined":null===t?"Null":"string"==typeof(n=function(t,e){try{return t[e]}catch(t){}}(e=Object(t),i))?n:o?r(e):"Object"==(s=r(e))&&"function"==typeof e.callee?"Arguments":s}},function(t,e,n){var r=n(17);t.exports=function(t,e,n,i){try{return i?e(r(n)[0],n[1]):e(n)}catch(e){var o=t.return;throw void 0!==o&&r(o.call(t)),e}}},function(t,e,n){var r=n(8)("iterator"),i=!1;try{var o=0,s={next:function(){return{done:!!o++}},return:function(){i=!0}};s[r]=function(){return this},Array.from(s,(function(){throw 2}))}catch(t){}t.exports=function(t,e){if(!e&&!i)return!1;var n=!1;try{var o={};o[r]=function(){return{next:function(){return{done:n=!0}}}},t(o)}catch(t){}return n}},function(t,e,n){var r=n(17),i=n(41),o=n(8)("species");t.exports=function(t,e){var n,s=r(t).constructor;return void 0===s||null==(n=r(s)[o])?e:i(n)}},function(t,e,n){var r,i,o,s,a,c,u,l,f=n(1),p=n(81).f,h=n(38),d=n(135).set,b=n(83),m=f.MutationObserver||f.WebKitMutationObserver,g=f.process,v=f.Promise,y="process"==h(g),w=p(f,"queueMicrotask"),k=w&&w.value;k||(r=function(){var t,e;for(y&&(t=g.domain)&&t.exit();i;){e=i.fn,i=i.next;try{e()}catch(t){throw i?s():o=void 0,t}}o=void 0,t&&t.enter()},y?s=function(){g.nextTick(r)}:m&&!/(iphone|ipod|ipad).*applewebkit/i.test(b)?(a=!0,c=document.createTextNode(""),new m(r).observe(c,{characterData:!0}),s=function(){c.data=a=!a}):v&&v.resolve?(u=v.resolve(void 0),l=u.then,s=function(){l.call(u,r)}):s=function(){d.call(f,r)}),t.exports=k||function(t){var e={fn:t,next:void 0};o&&(o.next=e),i||(i=e,s()),o=e}},function(t,e,n){var r=n(17),i=n(22),o=n(136);t.exports=function(t,e){if(r(t),i(e)&&e.constructor===t)return e;var n=o.f(t);return(0,n.resolve)(e),n.promise}},function(t,e,n){var r=n(1);t.exports=function(t,e){var n=r.console;n&&n.error&&(1===arguments.length?n.error(t):n.error(t,e))}},function(t,e){t.exports=function(t){try{return{error:!1,value:t()}}catch(t){return{error:!0,value:t}}}},function(t,e,n){var r=n(1),i=n(244),o=n(72),s=n(19),a=n(8),c=a("iterator"),u=a("toStringTag"),l=o.values;for(var f in i){var p=r[f],h=p&&p.prototype;if(h){if(h[c]!==l)try{s(h,c,l)}catch(t){h[c]=l}if(h[u]||s(h,u,f),i[f])for(var d in o)if(h[d]!==o[d])try{s(h,d,o[d])}catch(t){h[d]=o[d]}}}},function(t,e){t.exports={CSSRuleList:0,CSSStyleDeclaration:0,CSSValueList:0,ClientRectList:0,DOMRectList:0,DOMStringList:0,DOMTokenList:1,DataTransferItemList:0,FileList:0,HTMLAllCollection:0,HTMLCollection:0,HTMLFormElement:0,HTMLSelectElement:0,MediaList:0,MimeTypeArray:0,NamedNodeMap:0,NodeList:1,PaintRequestList:0,Plugin:0,PluginArray:0,SVGLengthList:0,SVGNumberList:0,SVGPathSegList:0,SVGPointList:0,SVGStringList:0,SVGTransformList:0,SourceBufferList:0,StyleSheetList:0,TextTrackCueList:0,TextTrackList:0,TouchList:0}},function(t,e,n){n(72),t.exports=function(){"use strict";function t(t,e){t||error(e)}var e,n,r=function(){function t(t,e){this.w=t,this.h=e}return t.prototype={toString:function(){return"("+this.w+", "+this.h+")"},getHalfSize:function(){return new r(this.w>>>1,this.h>>>1)},length:function(){return this.w*this.h}},t}(),i=function(){function e(t,e,n){this.bytes=new Uint8Array(t),this.start=e||0,this.pos=this.start,this.end=e+n||this.bytes.length}return e.prototype={get length(){return this.end-this.start},get position(){return this.pos},get remaining(){return this.end-this.pos},readU8Array:function(t){if(this.pos>this.end-t)return null;var e=this.bytes.subarray(this.pos,this.pos+t);return this.pos+=t,e},readU32Array:function(t,e,n){if(e=e||1,this.pos>this.end-t*e*4)return null;if(1==e){for(var r=new Uint32Array(t),i=0;i>24},readU8:function(){return this.pos>=this.end?null:this.bytes[this.pos++]},read16:function(){return this.readU16()<<16>>16},readU16:function(){if(this.pos>=this.end-1)return null;var t=this.bytes[this.pos+0]<<8|this.bytes[this.pos+1];return this.pos+=2,t},read24:function(){return this.readU24()<<8>>8},readU24:function(){var t=this.pos,e=this.bytes;if(t>this.end-3)return null;var n=e[t+0]<<16|e[t+1]<<8|e[t+2];return this.pos+=3,n},peek32:function(t){var e=this.pos,n=this.bytes;if(e>this.end-4)return null;var r=n[e+0]<<24|n[e+1]<<16|n[e+2]<<8|n[e+3];return t&&(this.pos+=4),r},read32:function(){return this.peek32(!0)},readU32:function(){return this.peek32(!0)>>>0},read4CC:function(){var t=this.pos;if(t>this.end-4)return null;for(var e="",n=0;n<4;n++)e+=String.fromCharCode(this.bytes[t+n]);return this.pos+=4,e},readFP16:function(){return this.read32()/65536},readFP8:function(){return this.read16()/256},readISO639:function(){for(var t=this.readU16(),e="",n=0;n<3;n++){var r=t>>>5*(2-n)&31;e+=String.fromCharCode(r+96)}return e},readUTF8:function(t){for(var e="",n=0;nthis.end)&&error("Index out of bounds (bounds: [0, "+this.end+"], index: "+t+")."),this.pos=t},subStream:function(t,e){return new i(this.bytes.buffer,t,e)}},e}(),o=function(){function e(t){this.stream=t,this.tracks={}}return e.prototype={readBoxes:function(t,e){for(;t.peek32();){var n=this.readBox(t);if(n.type in e){var r=e[n.type];r instanceof Array||(e[n.type]=[r]),e[n.type].push(n)}else e[n.type]=n}},readBox:function(e){var n={offset:e.position};function r(){n.version=e.readU8(),n.flags=e.readU24()}function i(){return n.size-(e.position-n.offset)}function o(){e.skip(i())}var a=function(){var t=e.subStream(e.position,i());this.readBoxes(t,n),e.skip(t.length)}.bind(this);switch(n.size=e.readU32(),n.type=e.read4CC(),n.type){case"ftyp":n.name="File Type Box",n.majorBrand=e.read4CC(),n.minorVersion=e.readU32(),n.compatibleBrands=new Array((n.size-16)/4);for(var c=0;c0&&(n.name=e.readUTF8(u));break;case"minf":n.name="Media Information Box",a();break;case"stbl":n.name="Sample Table Box",a();break;case"stsd":n.name="Sample Description Box",r(),n.sd=[];e.readU32();a();break;case"avc1":e.reserved(6,0),n.dataReferenceIndex=e.readU16(),t(0==e.readU16()),t(0==e.readU16()),e.readU32(),e.readU32(),e.readU32(),n.width=e.readU16(),n.height=e.readU16(),n.horizontalResolution=e.readFP16(),n.verticalResolution=e.readFP16(),t(0==e.readU32()),n.frameCount=e.readU16(),n.compressorName=e.readPString(32),n.depth=e.readU16(),t(65535==e.readU16()),a();break;case"mp4a":e.reserved(6,0),n.dataReferenceIndex=e.readU16(),n.version=e.readU16(),e.skip(2),e.skip(4),n.channelCount=e.readU16(),n.sampleSize=e.readU16(),n.compressionId=e.readU16(),n.packetSize=e.readU16(),n.sampleRate=e.readU32()>>>16,t(0==n.version),a();break;case"esds":n.name="Elementary Stream Descriptor",r(),o();break;case"avcC":n.name="AVC Configuration Box",n.configurationVersion=e.readU8(),n.avcProfileIndication=e.readU8(),n.profileCompatibility=e.readU8(),n.avcLevelIndication=e.readU8(),n.lengthSizeMinusOne=3&e.readU8(),t(3==n.lengthSizeMinusOne,"TODO");var l=31&e.readU8();n.sps=[];for(c=0;c=8,"Cannot parse large media data yet."),n.data=e.readU8Array(i());break;default:o()}return n},read:function(){var t=(new Date).getTime();this.file={},this.readBoxes(this.stream,this.file),console.info("Parsed stream in "+((new Date).getTime()-t)+" ms")},traceSamples:function(){var t=this.tracks[1],e=this.tracks[2];console.info("Video Samples: "+t.getSampleCount()),console.info("Audio Samples: "+e.getSampleCount());for(var n=0,r=0,i=0;i<100;i++){var o=t.sampleToOffset(n),s=e.sampleToOffset(r),a=t.sampleToSize(n,1),c=e.sampleToSize(r,1);o0){var s=n[i-1],a=o.firstChunk-s.firstChunk,c=s.samplesPerChunk*a;if(!(e>=c))return{index:r+Math.floor(e/s.samplesPerChunk),offset:e%s.samplesPerChunk};if(e-=c,i==n.length-1)return{index:r+a+Math.floor(e/o.samplesPerChunk),offset:e%o.samplesPerChunk};r+=a}}t(!1)},chunkToOffset:function(t){return this.trak.mdia.minf.stbl.stco.table[t]},sampleToOffset:function(t){var e=this.sampleToChunk(t);return this.chunkToOffset(e.index)+this.sampleToSize(t-e.offset,e.offset)},timeToSample:function(t){for(var e=this.trak.mdia.minf.stbl.stts.table,n=0,r=0;r=i))return n+Math.floor(t/e[r].delta);t-=i,n+=e[r].count}},getTotalTime:function(){for(var e=this.trak.mdia.minf.stbl.stts.table,n=0,r=0;r0;){var s=new i(e.buffer,n).readU32();o.push(e.subarray(n+4,n+s+4)),n=n+s+4}return o}},e}();e=[],n="zero-timeout-message",window.addEventListener("message",(function(t){t.source==window&&t.data==n&&(t.stopPropagation(),e.length>0&&e.shift()())}),!0),window.setZeroTimeout=function(t){e.push(t),window.postMessage(n,"*")};var a=function(){function t(t,n,r,i){this.stream=t,this.useWorkers=n,this.webgl=r,this.render=i,this.statistics={videoStartTime:0,videoPictureCounter:0,windowStartTime:0,windowPictureCounter:0,fps:0,fpsMin:1e3,fpsMax:-1e3,webGLTextureUploadTime:0},this.onStatisticsUpdated=function(){},this.avc=new Player({useWorker:n,reuseMemory:!0,webgl:r,size:{width:640,height:368}}),this.webgl=this.avc.webgl;var o=this;this.avc.onPictureDecoded=function(){e.call(o)},this.canvas=this.avc.canvas}function e(){var t=this.statistics;t.videoPictureCounter+=1,t.windowPictureCounter+=1;var e=Date.now();t.videoStartTime||(t.videoStartTime=e);var n=e-t.videoStartTime;if(t.elapsed=n/1e3,!(n<1e3))if(t.windowStartTime){if(e-t.windowStartTime>1e3){var r=e-t.windowStartTime,i=t.windowPictureCounter/r*1e3;t.windowStartTime=e,t.windowPictureCounter=0,it.fpsMax&&(t.fpsMax=i),t.fps=i}i=t.videoPictureCounter/n*1e3;t.fpsSinceStart=i,this.onStatisticsUpdated(this.statistics)}else t.windowStartTime=e}return t.prototype={readAll:function(t){console.info("MP4Player::readAll()"),this.stream.readAll(null,function(e){this.reader=new o(new i(e)),this.reader.read();var n=this.reader.tracks[1];this.size=new r(n.trak.tkhd.width,n.trak.tkhd.height),console.info("MP4Player::readAll(), length: "+this.reader.stream.length),t&&t()}.bind(this))},play:function(){var t=this.reader;if(t){var e=t.tracks[1],n=(t.tracks[2],t.tracks[1].trak.mdia.minf.stbl.stsd.avc1.avcC),r=n.sps[0],i=n.pps[0];this.avc.decode(r),this.avc.decode(i);var o=0;setTimeout(function t(){var n=this.avc;e.getSampleNALUnits(o).forEach((function(t){n.decode(t)})),++o<3e3&&setTimeout(t.bind(this),1)}.bind(this),1)}else this.readAll(this.play.bind(this))}},t}(),c=function(){function t(t){var e=t.attributes.src?t.attributes.src.value:void 0,n=(t.attributes.width&&t.attributes.width.value,t.attributes.height&&t.attributes.height.value,document.createElement("div"));n.setAttribute("style","z-index: 100; position: absolute; bottom: 0px; background-color: rgba(0,0,0,0.8); height: 30px; width: 100%; text-align: left;"),this.info=document.createElement("div"),this.info.setAttribute("style","font-size: 14px; font-weight: bold; padding: 6px; color: lime;"),n.appendChild(this.info),t.appendChild(n);var r=!!t.attributes.workers&&"true"==t.attributes.workers.value,i=!!t.attributes.render&&"true"==t.attributes.render.value,o="auto";t.attributes.webgl&&("true"==t.attributes.webgl.value&&(o=!0),"false"==t.attributes.webgl.value&&(o=!1));var s="";s+=r?"worker thread ":"main thread ",this.player=new a(new Stream(e),r,o,i),this.canvas=this.player.canvas,this.canvas.onclick=function(){this.play()}.bind(this),t.appendChild(this.canvas),s+=" - webgl: "+this.player.webgl,this.info.innerHTML="Click canvas to load and play - "+s,this.score=null,this.player.onStatisticsUpdated=function(t){if(t.videoPictureCounter%10==0){var e="";t.fps&&(e+=" fps: "+t.fps.toFixed(2)),t.fpsSinceStart&&(e+=" avg: "+t.fpsSinceStart.toFixed(2));t.videoPictureCounter<1200?this.score=1200-t.videoPictureCounter:1200==t.videoPictureCounter&&(this.score=t.fpsSinceStart.toFixed(2)),this.info.innerHTML=s+e}}.bind(this)}return t.prototype={play:function(){this.player.play()}},t}();return{Size:r,Track:s,MP4Reader:o,MP4Player:a,Bytestream:i,Broadway:c}}()},function(t,e,n){"use strict";(function(t){Object.defineProperty(e,"__esModule",{value:!0});var n="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t},r="undefined"!=typeof window&&void 0!==window.document,i="object"===("undefined"==typeof self?"undefined":n(self))&&self.constructor&&"DedicatedWorkerGlobalScope"===self.constructor.name,o=void 0!==t&&null!=t.versions&&null!=t.versions.node;e.isBrowser=r,e.isWebWorker=i,e.isNode=o}).call(this,n(112))},function(t,e,n){n(5),n(11),n(10),(()=>{const e=n(26),r=n(248),i=n(251),{checkObjectType:o}=n(56),{Task:s}=n(49),{Loader:a,Dumper:c}=n(138),{ScriptingError:u,DataError:l,ArgumentError:f}=n(6),p=new WeakMap,h=new WeakMap;function d(t){if("task"===t)return h;if("job"===t)return p;throw new u(`Unknown session type was received ${t}`)}async function b(t){const n=t instanceof s?"task":"job",o=d(n);if(!o.has(t)){const s=await e.annotations.getAnnotations(n,t.id),a="job"===n?t.startFrame:0,c="job"===n?t.stopFrame:t.size-1,u={};for(let e=a;e<=c;e++)u[e]=await t.frames.get(e);const l=new r({labels:t.labels||t.task.labels,startFrame:a,stopFrame:c,frameMeta:u}).import(s),f=new i(s.version,l,t);o.set(t,{collection:l,saver:f})}}t.exports={getAnnotations:async function(t,e,n){return await b(t),d(t instanceof s?"task":"job").get(t).collection.get(e,n)},putAnnotations:function(t,e){const n=d(t instanceof s?"task":"job");if(n.has(t))return n.get(t).collection.put(e);throw new l("Collection has not been initialized yet. Call annotations.get() or annotations.clear(true) before")},saveAnnotations:async function(t,e){const n=d(t instanceof s?"task":"job");n.has(t)&&await n.get(t).saver.save(e)},hasUnsavedChanges:function(t){const e=d(t instanceof s?"task":"job");return!!e.has(t)&&e.get(t).saver.hasUnsavedChanges()},mergeAnnotations:function(t,e){const n=d(t instanceof s?"task":"job");if(n.has(t))return n.get(t).collection.merge(e);throw new l("Collection has not been initialized yet. Call annotations.get() or annotations.clear(true) before")},splitAnnotations:function(t,e,n){const r=d(t instanceof s?"task":"job");if(r.has(t))return r.get(t).collection.split(e,n);throw new l("Collection has not been initialized yet. Call annotations.get() or annotations.clear(true) before")},groupAnnotations:function(t,e,n){const r=d(t instanceof s?"task":"job");if(r.has(t))return r.get(t).collection.group(e,n);throw new l("Collection has not been initialized yet. Call annotations.get() or annotations.clear(true) before")},clearAnnotations:async function(t,e){o("reload",e,"boolean",null);const n=d(t instanceof s?"task":"job");n.has(t)&&n.get(t).collection.clear(),e&&(n.delete(t),await b(t))},annotationsStatistics:function(t){const e=d(t instanceof s?"task":"job");if(e.has(t))return e.get(t).collection.statistics();throw new l("Collection has not been initialized yet. Call annotations.get() or annotations.clear(true) before")},selectObject:function(t,e,n,r){const i=d(t instanceof s?"task":"job");if(i.has(t))return i.get(t).collection.select(e,n,r);throw new l("Collection has not been initialized yet. Call annotations.get() or annotations.clear(true) before")},uploadAnnotations:async function(t,n,r){const i=t instanceof s?"task":"job";if(!(r instanceof a))throw new f("A loader must be instance of Loader class");await e.annotations.uploadAnnotations(i,t.id,n,r.name)},dumpAnnotations:async function(t,n,r){if(!(r instanceof c))throw new f("A dumper must be instance of Dumper class");let i=null;return i="job"===(t instanceof s?"task":"job")?await e.annotations.dumpAnnotations(t.task.id,n,r.name):await e.annotations.dumpAnnotations(t.id,n,r.name)},exportDataset:async function(t,n){if(!(n instanceof String||"string"==typeof n))throw new f("Format must be a string");if(!(t instanceof s))throw new f("A dataset can only be created from a task");let r=null;return r=await e.tasks.exportDataset(t.id,n)}}})()},function(t,e,n){n(5),n(137),n(10),n(71),(()=>{const{RectangleShape:e,PolygonShape:r,PolylineShape:i,PointsShape:o,RectangleTrack:s,PolygonTrack:a,PolylineTrack:c,PointsTrack:u,Track:l,Shape:f,Tag:p,objectStateFactory:h}=n(250),{checkObjectType:d}=n(56),b=n(117),{Label:m}=n(55),{DataError:g,ArgumentError:v,ScriptingError:y}=n(6),{ObjectShape:w,ObjectType:k}=n(29),x=n(70),O=["#0066FF","#AF593E","#01A368","#FF861F","#ED0A3F","#FF3F34","#76D7EA","#8359A3","#FBE870","#C5E17A","#03BB85","#FFDF00","#8B8680","#0A6B0D","#8FD8D8","#A36F40","#F653A6","#CA3435","#FFCBA4","#FF99CC","#FA9D5A","#FFAE42","#A78B00","#788193","#514E49","#1164B4","#F4FA9F","#FED8B1","#C32148","#01796F","#E90067","#FF91A4","#404E5A","#6CDAE7","#FFC1CC","#006A93","#867200","#E2B631","#6EEB6E","#FFC800","#CC99BA","#FF007C","#BC6CAC","#DCCCD7","#EBE1C2","#A6AAAE","#B99685","#0086A7","#5E4330","#C8A2C8","#708EB3","#BC8777","#B2592D","#497E48","#6A2963","#E6335F","#00755E","#B5A895","#0048ba","#EED9C4","#C88A65","#FF6E4A","#87421F","#B2BEB5","#926F5B","#00B9FB","#6456B7","#DB5079","#C62D42","#FA9C44","#DA8A67","#FD7C6E","#93CCEA","#FCF686","#503E32","#FF5470","#9DE093","#FF7A00","#4F69C6","#A50B5E","#F0E68C","#FDFF00","#F091A9","#FFFF66","#6F9940","#FC74FD","#652DC1","#D6AEDD","#EE34D2","#BB3385","#6B3FA0","#33CC99","#FFDB00","#87FF2A","#6EEB6E","#FFC800","#CC99BA","#7A89B8","#006A93","#867200","#E2B631","#D9D6CF"];function j(t,n,s){const{type:a}=t,c=O[n%O.length];let u=null;switch(a){case"rectangle":u=new e(t,n,c,s);break;case"polygon":u=new r(t,n,c,s);break;case"polyline":u=new i(t,n,c,s);break;case"points":u=new o(t,n,c,s);break;default:throw new g(`An unexpected type of shape "${a}"`)}return u}function S(t,e,n){if(t.shapes.length){const{type:r}=t.shapes[0],i=O[e%O.length];let o=null;switch(r){case"rectangle":o=new s(t,e,i,n);break;case"polygon":o=new a(t,e,i,n);break;case"polyline":o=new c(t,e,i,n);break;case"points":o=new u(t,e,i,n);break;default:throw new g(`An unexpected type of track "${r}"`)}return o}return console.warn("The track without any shapes had been found. It was ignored."),null}t.exports=class{constructor(t){this.startFrame=t.startFrame,this.stopFrame=t.stopFrame,this.frameMeta=t.frameMeta,this.labels=t.labels.reduce((t,e)=>(t[e.id]=e,t),{}),this.shapes={},this.tags={},this.tracks=[],this.objects={},this.count=0,this.flush=!1,this.collectionZ={},this.groups={max:0},this.injection={labels:this.labels,collectionZ:this.collectionZ,groups:this.groups,frameMeta:this.frameMeta}}import(t){for(const e of t.tags){const t=++this.count,n=new p(e,t,this.injection);this.tags[n.frame]=this.tags[n.frame]||[],this.tags[n.frame].push(n),this.objects[t]=n}for(const e of t.shapes){const t=++this.count,n=j(e,t,this.injection);this.shapes[n.frame]=this.shapes[n.frame]||[],this.shapes[n.frame].push(n),this.objects[t]=n}for(const e of t.tracks){const t=++this.count,n=S(e,t,this.injection);n&&(this.tracks.push(n),this.objects[t]=n)}return this}export(){return{tracks:this.tracks.filter(t=>!t.removed).map(t=>t.toJSON()),shapes:Object.values(this.shapes).reduce((t,e)=>(t.push(...e),t),[]).filter(t=>!t.removed).map(t=>t.toJSON()),tags:Object.values(this.tags).reduce((t,e)=>(t.push(...e),t),[]).filter(t=>!t.removed).map(t=>t.toJSON())}}get(t){const{tracks:e}=this,n=this.shapes[t]||[],r=this.tags[t]||[],i=e.concat(n).concat(r).filter(t=>!t.removed),o=[];for(const e of i){const n=e.get(t);if(n.outside&&!n.keyframe)continue;const r=h.call(e,t,n);o.push(r)}return o}merge(t){if(d("shapes for merge",t,null,Array),!t.length)return;const e=t.map(t=>{d("object state",t,null,x);const e=this.objects[t.clientID];if(void 0===e)throw new v("The object has not been saved yet. Call ObjectState.put([state]) before you can merge it");return e}),n={},{label:r,shapeType:i}=t[0];if(!(r.id in this.labels))throw new v(`Unknown label for the task: ${r.id}`);if(!Object.values(w).includes(i))throw new v(`Got unknown shapeType "${i}"`);const o=r.attributes.reduce((t,e)=>(t[e.id]=e,t),{});for(let s=0;s(e in o&&o[e].mutable&&t.push({spec_id:+e,value:a.attributes[e]}),t),[])},a.frame+1 in n||(n[a.frame+1]=JSON.parse(JSON.stringify(n[a.frame])),n[a.frame+1].outside=!0,n[a.frame+1].frame++)}else{if(!(a instanceof l))throw new v(`Trying to merge unknown object type: ${a.constructor.name}. `+"Only shapes and tracks are expected.");{const t={};for(const e of Object.keys(a.shapes)){const r=a.shapes[e];if(e in n&&!n[e].outside){if(r.outside)continue;throw new v("Expected only one visible shape per frame")}let o=!1;for(const e in r.attributes)e in t&&t[e]===r.attributes[e]||(o=!0,t[e]=r.attributes[e]);n[e]={type:i,frame:+e,points:[...r.points],occluded:r.occluded,outside:r.outside,zOrder:r.zOrder,attributes:o?Object.keys(t).reduce((e,n)=>(e.push({spec_id:+n,value:t[n]}),e),[]):[]}}}}}let s=!1;for(const t of Object.keys(n).sort((t,e)=>+t-+e)){if((s=s||n[t].outside)||!n[t].outside)break;delete n[t]}const a=++this.count,c=S({frame:Math.min.apply(null,Object.keys(n).map(t=>+t)),shapes:Object.values(n),group:0,label_id:r.id,attributes:Object.keys(t[0].attributes).reduce((e,n)=>(o[n].mutable||e.push({spec_id:+n,value:t[0].attributes[n]}),e),[])},a,this.injection);this.tracks.push(c),this.objects[a]=c;for(const t of e)t.removed=!0,"function"==typeof t.resetCache&&t.resetCache()}split(t,e){d("object state",t,null,x),d("frame",e,"integer",null);const n=this.objects[t.clientID];if(void 0===n)throw new v("The object has not been saved yet. Call annotations.put([state]) before");if(t.objectType!==k.TRACK)return;const r=Object.keys(n.shapes).sort((t,e)=>+t-+e);if(e<=+r[0]||e>r[r.length-1])return;const i=n.label.attributes.reduce((t,e)=>(t[e.id]=e,t),{}),o=n.toJSON(),s={type:t.shapeType,points:[...t.points],occluded:t.occluded,outside:t.outside,zOrder:0,attributes:Object.keys(t.attributes).reduce((e,n)=>(i[n].mutable||e.push({spec_id:+n,value:t.attributes[n]}),e),[]),frame:e},a={frame:o.frame,group:0,label_id:o.label_id,attributes:o.attributes,shapes:[]},c=JSON.parse(JSON.stringify(a));c.frame=e,c.shapes.push(JSON.parse(JSON.stringify(s))),o.shapes.map(t=>(delete t.id,t.framee&&c.shapes.push(JSON.parse(JSON.stringify(t))),t)),a.shapes.push(s),a.shapes[a.shapes.length-1].outside=!0;let u=++this.count;const l=S(a,u,this.injection);this.tracks.push(l),this.objects[u]=l,u=++this.count;const f=S(c,u,this.injection);this.tracks.push(f),this.objects[u]=f,n.removed=!0,n.resetCache()}group(t,e){d("shapes for group",t,null,Array);const n=t.map(t=>{d("object state",t,null,x);const e=this.objects[t.clientID];if(void 0===e)throw new v("The object has not been saved yet. Call annotations.put([state]) before");return e}),r=e?0:++this.groups.max;for(const t of n)t.group=r,"function"==typeof t.resetCache&&t.resetCache();return r}clear(){this.shapes={},this.tags={},this.tracks=[],this.objects={},this.count=0,this.flush=!0}statistics(){const t={},e={rectangle:{shape:0,track:0},polygon:{shape:0,track:0},polyline:{shape:0,track:0},points:{shape:0,track:0},tags:0,manually:0,interpolated:0,total:0},n=JSON.parse(JSON.stringify(e));for(const n of Object.values(this.labels)){const{name:r}=n;t[r]=JSON.parse(JSON.stringify(e))}for(const e of Object.values(this.objects)){let n=null;if(e instanceof f)n="shape";else if(e instanceof l)n="track";else{if(!(e instanceof p))throw new y(`Unexpected object type: "${n}"`);n="tag"}const r=e.label.name;if("tag"===n)t[r].tags++,t[r].manually++,t[r].total++;else{const{shapeType:i}=e;if(t[r][i][n]++,"track"===n){const n=Object.keys(e.shapes).sort((t,e)=>+t-+e).map(t=>+t);let i=n[0],o=!1;for(const s of n){if(o){const e=s-i-1;t[r].interpolated+=e,t[r].total+=e}o=!e.shapes[s].outside,i=s,o&&(t[r].manually++,t[r].total++)}const s=n[n.length-1];if(s!==this.stopFrame&&!e.shapes[s].outside){const e=this.stopFrame-s;t[r].interpolated+=e,t[r].total+=e}}else t[r].manually++,t[r].total++}}for(const e of Object.keys(t))for(const r of Object.keys(t[e]))if("object"==typeof t[e][r])for(const i of Object.keys(t[e][r]))n[r][i]+=t[e][r][i];else n[r]+=t[e][r];return new b(t,n)}put(t){d("shapes for put",t,null,Array);const e={shapes:[],tracks:[],tags:[]};function n(t,e){const n=+e,r=this.attributes[e];return d("attribute id",n,"integer",null),d("attribute value",r,"string",null),t.push({spec_id:n,value:r}),t}for(const r of t){d("object state",r,null,x),d("state client ID",r.clientID,"undefined",null),d("state frame",r.frame,"integer",null),d("state attributes",r.attributes,null,Object),d("state label",r.label,null,m);const t=Object.keys(r.attributes).reduce(n.bind(r),[]),i=r.label.attributes.reduce((t,e)=>(t[e.id]=e,t),{});if("tag"===r.objectType)e.tags.push({attributes:t,frame:r.frame,label_id:r.label.id,group:0});else{d("state occluded",r.occluded,"boolean",null),d("state points",r.points,null,Array);for(const t of r.points)d("point coordinate",t,"number",null);if(!Object.values(w).includes(r.shapeType))throw new v("Object shape must be one of: "+`${JSON.stringify(Object.values(w))}`);if("shape"===r.objectType)e.shapes.push({attributes:t,frame:r.frame,group:0,label_id:r.label.id,occluded:r.occluded||!1,points:[...r.points],type:r.shapeType,z_order:0});else{if("track"!==r.objectType)throw new v("Object type must be one of: "+`${JSON.stringify(Object.values(k))}`);e.tracks.push({attributes:t.filter(t=>!i[t.spec_id].mutable),frame:r.frame,group:0,label_id:r.label.id,shapes:[{attributes:t.filter(t=>i[t.spec_id].mutable),frame:r.frame,occluded:r.occluded||!1,outside:!1,points:[...r.points],type:r.shapeType,z_order:0}]})}}}this.import(e)}select(t,e,n){d("shapes for select",t,null,Array),d("x coordinate",e,"number",null),d("y coordinate",n,"number",null);let r=null,i=null;for(const o of t){if(d("object state",o,null,x),o.outside)continue;const t=this.objects[o.clientID];if(void 0===t)throw new v("The object has not been saved yet. Call annotations.put([state]) before");const s=t.constructor.distance(o.points,e,n);null!==s&&(null===r||s{const e=n(70),{checkObjectType:r,isEnum:o}=n(56),{ObjectShape:s,ObjectType:a,AttributeType:c,VisibleState:u}=n(29),{DataError:l,ArgumentError:f,ScriptingError:p}=n(6),{Label:h}=n(55);function d(t,n){const r=new e(n);return r.hidden={save:this.save.bind(this,t,r),delete:this.delete.bind(this),up:this.up.bind(this,t,r),down:this.down.bind(this,t,r)},r}function b(t,e){if(t===s.RECTANGLE){if(e.length/2!=2)throw new l(`Rectangle must have 2 points, but got ${e.length/2}`)}else if(t===s.POLYGON){if(e.length/2<3)throw new l(`Polygon must have at least 3 points, but got ${e.length/2}`)}else if(t===s.POLYLINE){if(e.length/2<2)throw new l(`Polyline must have at least 2 points, but got ${e.length/2}`)}else{if(t!==s.POINTS)throw new f(`Unknown value of shapeType has been recieved ${t}`);if(e.length/2<1)throw new l(`Points must have at least 1 points, but got ${e.length/2}`)}}function m(t,e){if(t===s.POINTS)return!0;let n=Number.MAX_SAFE_INTEGER,r=Number.MIN_SAFE_INTEGER,i=Number.MAX_SAFE_INTEGER,o=Number.MIN_SAFE_INTEGER;for(let t=0;t=3}return(r-n)*(o-i)>=9}function g(t,e){const{values:n}=e,r=e.inputType;if("string"!=typeof t)throw new f(`Attribute value is expected to be string, but got ${typeof t}`);return r===c.NUMBER?+t>=+n[0]&&+t<=+n[1]&&!((+t-+n[0])%+n[2]):r===c.CHECKBOX?["true","false"].includes(t.toLowerCase()):n.includes(t)}class v{constructor(t,e,n){this.taskLabels=n.labels,this.clientID=e,this.serverID=t.id,this.group=t.group,this.label=this.taskLabels[t.label_id],this.frame=t.frame,this.removed=!1,this.lock=!1,this.attributes=t.attributes.reduce((t,e)=>(t[e.spec_id]=e.value,t),{}),this.appendDefaultAttributes(this.label),n.groups.max=Math.max(n.groups.max,this.group)}appendDefaultAttributes(t){const e=t.attributes;for(const t of e)t.id in this.attributes||(this.attributes[t.id]=t.defaultValue)}delete(t){return this.lock&&!t||(this.removed=!0),!0}}class y extends v{constructor(t,e,n,r){super(t,e,r),this.frameMeta=r.frameMeta,this.collectionZ=r.collectionZ,this.visibility=u.SHAPE,this.color=n,this.shapeType=null}_getZ(t){return this.collectionZ[t]=this.collectionZ[t]||{max:0,min:0},this.collectionZ[t]}save(){throw new p("Is not implemented")}get(){throw new p("Is not implemented")}toJSON(){throw new p("Is not implemented")}up(t,e){const n=this._getZ(t);n.max++,e.zOrder=n.max}down(t,e){const n=this._getZ(t);n.min--,e.zOrder=n.min}}class w extends y{constructor(t,e,n,r){super(t,e,n,r),this.points=t.points,this.occluded=t.occluded,this.zOrder=t.z_order;const i=this._getZ(this.frame);i.max=Math.max(i.max,this.zOrder||0),i.min=Math.min(i.min,this.zOrder||0)}toJSON(){return{type:this.shapeType,clientID:this.clientID,occluded:this.occluded,z_order:this.zOrder,points:[...this.points],attributes:Object.keys(this.attributes).reduce((t,e)=>(t.push({spec_id:e,value:this.attributes[e]}),t),[]),id:this.serverID,frame:this.frame,label_id:this.label.id,group:this.group}}get(t){if(t!==this.frame)throw new p("Got frame is not equal to the frame of the shape");return{objectType:a.SHAPE,shapeType:this.shapeType,clientID:this.clientID,serverID:this.serverID,occluded:this.occluded,lock:this.lock,zOrder:this.zOrder,points:[...this.points],attributes:i({},this.attributes),label:this.label,group:this.group,color:this.color,visibility:this.visibility}}save(t,e){if(t!==this.frame)throw new p("Got frame is not equal to the frame of the shape");if(this.lock&&e.lock)return d.call(this,t,this.get(t));const n=this.get(t),i=e.updateFlags;if(i.label&&(r("label",e.label,null,h),n.label=e.label,n.attributes={},this.appendDefaultAttributes.call(n,n.label)),i.attributes){const t=n.label.attributes.reduce((t,e)=>(t[e.id]=e,t),{});for(const r of Object.keys(e.attributes)){const i=e.attributes[r];if(!(r in t&&g(i,t[r])))throw new f(`Trying to save unknown attribute with id ${r} and value ${i}`);n.attributes[r]=i}}if(i.points){r("points",e.points,null,Array),b(this.shapeType,e.points);const{width:i,height:o}=this.frameMeta[t],s=[];for(let t=0;t{t[e.frame]={serverID:e.id,occluded:e.occluded,zOrder:e.z_order,points:e.points,outside:e.outside,attributes:e.attributes.reduce((t,e)=>(t[e.spec_id]=e.value,t),{})};const n=this._getZ(e.frame);return n.max=Math.max(n.max,e.z_order),n.min=Math.min(n.min,e.z_order),t},{}),this.cache={}}toJSON(){const t=this.label.attributes.reduce((t,e)=>(t[e.id]=e,t),{});return{clientID:this.clientID,id:this.serverID,frame:this.frame,label_id:this.label.id,group:this.group,attributes:Object.keys(this.attributes).reduce((e,n)=>(t[n].mutable||e.push({spec_id:n,value:this.attributes[n]}),e),[]),shapes:Object.keys(this.shapes).reduce((e,n)=>(e.push({type:this.shapeType,occluded:this.shapes[n].occluded,z_order:this.shapes[n].zOrder,points:[...this.shapes[n].points],outside:this.shapes[n].outside,attributes:Object.keys(this.shapes[n].attributes).reduce((e,r)=>(t[r].mutable&&e.push({spec_id:r,value:this.shapes[n].attributes[r]}),e),[]),id:this.shapes[n].serverID,frame:+n}),e),[])}}get(t){if(!(t in this.cache)){const e=Object.assign({},this.getPosition(t),{attributes:this.getAttributes(t),group:this.group,objectType:a.TRACK,shapeType:this.shapeType,clientID:this.clientID,serverID:this.serverID,lock:this.lock,color:this.color,visibility:this.visibility});this.cache[t]=e}const e=JSON.parse(JSON.stringify(this.cache[t]));return e.label=this.label,e}neighborsFrames(t){const e=Object.keys(this.shapes).map(t=>+t);let n=Number.MAX_SAFE_INTEGER,r=Number.MAX_SAFE_INTEGER;for(const i of e){const e=Math.abs(t-i);i<=t&&e+t-+e);for(const r of n)if(r<=t){const{attributes:t}=this.shapes[r];for(const n in t)Object.prototype.hasOwnProperty.call(t,n)&&(e[n]=t[n])}return e}save(t,e){if(this.lock&&e.lock)return d.call(this,t,this.get(t));const n=Object.assign(this.get(t));n.attributes=Object.assign(n.attributes),n.points=[...n.points];const i=e.updateFlags;let s=!1;i.label&&(r("label",e.label,null,h),n.label=e.label,n.attributes={},this.appendDefaultAttributes.call(n,n.label));const a=n.label.attributes.reduce((t,e)=>(t[e.id]=e,t),{});if(i.attributes)for(const t of Object.keys(e.attributes)){const r=e.attributes[t];if(!(t in a&&g(r,a[t])))throw new f(`Trying to save unknown attribute with id ${t} and value ${r}`);n.attributes[t]=r}if(i.points){r("points",e.points,null,Array),b(this.shapeType,e.points);const{width:i,height:o}=this.frameMeta[t],a=[];for(let t=0;tt&&delete this.cache[e];return this.cache[t].keyframe=!1,delete this.shapes[t],i.reset(),d.call(this,t,this.get(t))}if(s||i.keyframe&&e.keyframe){for(const e in this.cache)+e>t&&delete this.cache[e];if(this.cache[t].keyframe=!0,e.keyframe=!0,this.shapes[t]={frame:t,zOrder:n.zOrder,points:n.points,outside:n.outside,occluded:n.occluded,attributes:{}},i.attributes)for(const r of Object.keys(n.attributes))a[r].mutable&&(this.shapes[t].attributes[r]=e.attributes[r],this.shapes[t].attributes[r]=e.attributes[r])}return i.reset(),d.call(this,t,this.get(t))}getPosition(t){const{leftFrame:e,rightFrame:n}=this.neighborsFrames(t),r=Number.isInteger(n)?this.shapes[n]:null,i=Number.isInteger(e)?this.shapes[e]:null;if(i&&e===t)return{points:[...i.points],occluded:i.occluded,outside:i.outside,zOrder:i.zOrder,keyframe:!0};if(r&&i)return Object.assign({},this.interpolatePosition(i,r,(t-e)/(n-e)),{keyframe:!1});if(r)return{points:[...r.points],occluded:r.occluded,outside:!0,zOrder:0,keyframe:!1};if(i)return{points:[...i.points],occluded:i.occluded,outside:i.outside,zOrder:0,keyframe:!1};throw new p(`No one neightbour frame found for the track with client ID: "${this.id}"`)}delete(t){return this.lock&&!t||(this.removed=!0,this.resetCache()),!0}resetCache(){this.cache={}}}class x extends w{constructor(t,e,n,r){super(t,e,n,r),this.shapeType=s.RECTANGLE,b(this.shapeType,this.points)}static distance(t,e,n){const[r,i,o,s]=t;return e>=r&&e<=o&&n>=i&&n<=s?Math.min.apply(null,[e-r,n-i,o-e,s-n]):null}}class O extends w{constructor(t,e,n,r){super(t,e,n,r)}}class j extends O{constructor(t,e,n,r){super(t,e,n,r),this.shapeType=s.POLYGON,b(this.shapeType,this.points)}static distance(t,e,n){function r(t,r,i,o){return(i-t)*(n-r)-(e-t)*(o-r)}let i=0;const o=[];for(let s=0,a=t.length-2;sn&&r(c,u,l,f)>0&&i++:f<=n&&r(c,u,l,f)<0&&i--;const p=e-(u-f),h=n-(l-c);(p-c)*(l-p)>=0&&(h-u)*(f-h)>=0?o.push(Math.sqrt(Math.pow(e-p,2)+Math.pow(n-h,2))):o.push(Math.min(Math.sqrt(Math.pow(c-e,2)+Math.pow(u-n,2)),Math.sqrt(Math.pow(l-e,2)+Math.pow(f-n,2))))}return 0!==i?Math.min.apply(null,o):null}}class S extends O{constructor(t,e,n,r){super(t,e,n,r),this.shapeType=s.POLYLINE,b(this.shapeType,this.points)}static distance(t,e,n){const r=[];for(let i=0;i=0&&(n-s)*(c-n)>=0?r.push(Math.abs((c-s)*e-(a-o)*n+a*s-c*o)/Math.sqrt(Math.pow(c-s,2)+Math.pow(a-o,2))):r.push(Math.min(Math.sqrt(Math.pow(o-e,2)+Math.pow(s-n,2)),Math.sqrt(Math.pow(a-e,2)+Math.pow(c-n,2))))}return Math.min.apply(null,r)}}class _ extends O{constructor(t,e,n,r){super(t,e,n,r),this.shapeType=s.POINTS,b(this.shapeType,this.points)}static distance(t,e,n){const r=[];for(let i=0;ir&&(r=t[o]),t[o+1]>i&&(i=t[o+1]);return{xmin:e,ymin:n,xmax:r,ymax:i}}function i(t,e){const n=[],r=e.xmax-e.xmin,i=e.ymax-e.ymin;for(let o=0;on[i][t]-n[i][e]);const i={},o={};let s=0;for(;Object.values(o).length!==t.length;){for(const e of t){if(o[e])continue;const t=r[e][s],a=n[e][t];if(t in i&&i[t].distance>a){const e=i[t].value;delete i[t],delete o[e]}t in i||(i[t]={value:e,distance:a},o[e]=!0)}s++}const a={};for(const t of Object.keys(i))a[i[t].value]={value:t,distance:i[t].distance};return a}(Array.from(t.keys()),Array.from(e.keys()),s),c=(n(e)+n(t))/(e.length+t.length);!function(t,e){for(const n of Object.keys(t))t[n].distance>e&&delete t[n]}(a,c+3*Math.sqrt((r(t,c)+r(e,c))/(t.length+e.length)));for(const t of Object.keys(a))a[t]=a[t].value;const u=this.appendMapping(a,t,e);for(const n of u)i.push(t[n]),o.push(e[a[n]]);return[i,o]}let u=r(t.points),l=r(e.points);(u.xmax-u.xmin<1||l.ymax-l.ymin<1)&&(l=u={xmin:0,xmax:1024,ymin:0,ymax:768});const f=s(i(t.points,u)),p=s(i(e.points,l));let h=[],d=[];if(f.length>p.length){const[t,e]=c.call(this,p,f);h=e,d=t}else{const[t,e]=c.call(this,f,p);h=t,d=e}const b=o(a(h),u),m=o(a(d),l),g=[];for(let t=0;t+t),i=Object.keys(t).map(t=>+t),o=[];function s(t){let e=t,i=t;if(!r.length)throw new p("Interpolation mapping is empty");for(;!r.includes(e);)--e<0&&(e=n.length-1);for(;!r.includes(i);)++i>=n.length&&(i=0);return[e,i]}function a(t,e,r){const i=[];for(;e!==r;)i.push(n[e]),++e>=n.length&&(e=0);i.push(n[r]);let o=0,s=0,a=!1;for(let e=1;e(t.push({spec_id:e,value:this.attributes[e]}),t),[])}}get(t){if(t!==this.frame)throw new p("Got frame is not equal to the frame of the shape");return{objectType:a.TAG,clientID:this.clientID,serverID:this.serverID,lock:this.lock,attributes:Object.assign({},this.attributes),label:this.label,group:this.group}}save(t,e){if(t!==this.frame)throw new p("Got frame is not equal to the frame of the shape");if(this.lock&&e.lock)return d.call(this,t,this.get(t));const n=this.get(t),i=e.updateFlags;if(i.label&&(r("label",e.label,null,h),n.label=e.label,n.attributes={},this.appendDefaultAttributes.call(n,n.label)),i.attributes){const t=n.label.attributes.map(t=>`${t.id}`);for(const r of Object.keys(e.attributes))t.includes(r)&&(n.attributes[r]=e.attributes[r])}i.group&&(r("group",e.group,"integer",null),n.group=e.group),i.lock&&(r("lock",e.lock,"boolean",null),n.lock=e.lock),i.reset();for(const t of Object.keys(n))t in this&&(this[t]=n[t]);return d.call(this,t,this.get(t))}},objectStateFactory:d}})()},function(t,e,n){function r(t,e){var n=Object.keys(t);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(t);e&&(r=r.filter((function(e){return Object.getOwnPropertyDescriptor(t,e).enumerable}))),n.push.apply(n,r)}return n}function i(t){for(var e=1;e{const e=n(26),{Task:r}=n(49),{ScriptingError:o}="./exceptions";t.exports=class{constructor(t,e,n){this.sessionType=n instanceof r?"task":"job",this.id=n.id,this.version=t,this.collection=e,this.initialObjects={},this.hash=this._getHash();const i=this.collection.export();this._resetState();for(const t of i.shapes)this.initialObjects.shapes[t.id]=t;for(const t of i.tracks)this.initialObjects.tracks[t.id]=t;for(const t of i.tags)this.initialObjects.tags[t.id]=t}_resetState(){this.initialObjects={shapes:{},tracks:{},tags:{}}}_getHash(){const t=this.collection.export();return JSON.stringify(t)}async _request(t,n){return await e.annotations.updateAnnotations(this.sessionType,this.id,t,n)}async _put(t){return await this._request(t,"put")}async _create(t){return await this._request(t,"create")}async _update(t){return await this._request(t,"update")}async _delete(t){return await this._request(t,"delete")}_split(t){const e={created:{shapes:[],tracks:[],tags:[]},updated:{shapes:[],tracks:[],tags:[]},deleted:{shapes:[],tracks:[],tags:[]}};for(const n of Object.keys(t))for(const r of t[n])if(r.id in this.initialObjects[n]){JSON.stringify(r)!==JSON.stringify(this.initialObjects[n][r.id])&&e.updated[n].push(r)}else{if(void 0!==r.id)throw new o(`Id of object is defined "${r.id}"`+"but it absents in initial state");e.created[n].push(r)}const n={shapes:t.shapes.map(t=>+t.id),tracks:t.tracks.map(t=>+t.id),tags:t.tags.map(t=>+t.id)};for(const t of Object.keys(this.initialObjects))for(const r of Object.keys(this.initialObjects[t]))if(!n[t].includes(+r)){const n=this.initialObjects[t][r];e.deleted[t].push(n)}return e}_updateCreatedObjects(t,e){const n=t.tracks.length+t.shapes.length+t.tags.length,r=e.tracks.length+e.shapes.length+e.tags.length;if(r!==n)throw new o("Number of indexes is differed by number of saved objects"+`${r} vs ${n}`);for(const n of Object.keys(e))for(let r=0;rt.clientID),shapes:t.shapes.map(t=>t.clientID),tags:t.tags.map(t=>t.clientID)};return t.tracks.concat(t.shapes).concat(t.tags).map(t=>(delete t.clientID,t)),e}async save(t){"function"!=typeof t&&(t=t=>{console.log(t)});try{const e=this.collection.export(),{flush:n}=this.collection;if(n){t("New objects are being saved..");const n=this._receiveIndexes(e),r=await this._put(i({},e,{version:this.version}));this.version=r.version,this.collection.flush=!1,t("Saved objects are being updated in the client"),this._updateCreatedObjects(r,n),t("Initial state is being updated"),this._resetState();for(const t of Object.keys(this.initialObjects))for(const e of r[t])this.initialObjects[t][e.id]=e}else{const{created:n,updated:r,deleted:o}=this._split(e);t("New objects are being saved..");const s=this._receiveIndexes(n),a=await this._create(i({},n,{version:this.version}));this.version=a.version,t("Saved objects are being updated in the client"),this._updateCreatedObjects(a,s),t("Initial state is being updated");for(const t of Object.keys(this.initialObjects))for(const e of a[t])this.initialObjects[t][e.id]=e;t("Changed objects are being saved.."),this._receiveIndexes(r);const c=await this._update(i({},r,{version:this.version}));this.version=c.version,t("Initial state is being updated");for(const t of Object.keys(this.initialObjects))for(const e of c[t])this.initialObjects[t][e.id]=e;t("Changed objects are being saved.."),this._receiveIndexes(o);const u=await this._delete(i({},o,{version:this.version}));this._version=u.version,t("Initial state is being updated");for(const t of Object.keys(this.initialObjects))for(const e of u[t])delete this.initialObjects[t][e.id]}this.hash=this._getHash(),t("Saving is done")}catch(e){throw t(`Can not save annotations: ${e.message}`),e}}hasUnsavedChanges(){return this._getHash()!==this.hash}}})()},function(t){t.exports=JSON.parse('{"name":"cvat-core.js","version":"0.1.0","description":"Part of Computer Vision Tool which presents an interface for client-side integration","main":"babel.config.js","scripts":{"build":"webpack","test":"jest --config=jest.config.js --coverage","docs":"jsdoc --readme README.md src/*.js -p -c jsdoc.config.js -d docs","coveralls":"cat ./reports/coverage/lcov.info | coveralls"},"author":"Intel","license":"MIT","devDependencies":{"@babel/cli":"^7.4.4","@babel/core":"^7.4.4","@babel/preset-env":"^7.4.4","airbnb":"0.0.2","babel-eslint":"^10.0.1","babel-loader":"^8.0.6","core-js":"^3.0.1","coveralls":"^3.0.5","eslint":"6.1.0","eslint-config-airbnb-base":"14.0.0","eslint-plugin-import":"2.18.2","eslint-plugin-no-unsafe-innerhtml":"^1.0.16","eslint-plugin-no-unsanitized":"^3.0.2","eslint-plugin-security":"^1.4.0","jest":"^24.8.0","jest-junit":"^6.4.0","jsdoc":"^3.6.2","webpack":"^4.31.0","webpack-cli":"^3.3.2"},"dependencies":{"axios":"^0.18.0","browser-or-node":"^1.2.1","error-stack-parser":"^2.0.2","form-data":"^2.5.0","jest-config":"^24.8.0","js-cookie":"^2.2.0","platform":"^1.3.5","store":"^2.0.12"}}')},function(t,e,n){n(5),n(11),n(10),n(254),(()=>{const e=n(36),r=n(26),{isBoolean:i,isInteger:o,isEnum:s,isString:a,checkFilter:c}=n(56),{TaskStatus:u,TaskMode:l}=n(29),f=n(69),{AnnotationFormat:p}=n(138),{ArgumentError:h}=n(6),{Task:d}=n(49);function b(t,e){null!==t.assignee&&([t.assignee]=e.filter(e=>e.id===t.assignee));for(const n of t.segments)for(const t of n.jobs)null!==t.assignee&&([t.assignee]=e.filter(e=>e.id===t.assignee));return null!==t.owner&&([t.owner]=e.filter(e=>e.id===t.owner)),t}t.exports=function(t){return t.plugins.list.implementation=e.list,t.plugins.register.implementation=e.register.bind(t),t.server.about.implementation=async()=>{return await r.server.about()},t.server.share.implementation=async t=>{return await r.server.share(t)},t.server.formats.implementation=async()=>{return(await r.server.formats()).map(t=>new p(t))},t.server.datasetFormats.implementation=async()=>{return await r.server.datasetFormats()},t.server.register.implementation=async(t,e,n,i,o,s)=>{await r.server.register(t,e,n,i,o,s)},t.server.login.implementation=async(t,e)=>{await r.server.login(t,e)},t.server.logout.implementation=async()=>{await r.server.logout()},t.server.authorized.implementation=async()=>{return await r.server.authorized()},t.server.request.implementation=async(t,e)=>{return await r.server.request(t,e)},t.users.get.implementation=async t=>{c(t,{self:i});let e=null;return e=(e="self"in t&&t.self?[e=await r.users.getSelf()]:await r.users.getUsers()).map(t=>new f(t))},t.jobs.get.implementation=async t=>{if(c(t,{taskID:o,jobID:o}),"taskID"in t&&"jobID"in t)throw new h('Only one of fields "taskID" and "jobID" allowed simultaneously');if(!Object.keys(t).length)throw new h("Job filter must not be empty");let e=null;if("taskID"in t)e=await r.tasks.getTasks(`id=${t.taskID}`);else{const n=await r.jobs.getJob(t.jobID);void 0!==n.task_id&&(e=await r.tasks.getTasks(`id=${n.task_id}`))}if(null!==e&&e.length){const n=(await r.users.getUsers()).map(t=>new f(t)),i=new d(b(e[0],n));return t.jobID?i.jobs.filter(e=>e.id===t.jobID):i.jobs}return[]},t.tasks.get.implementation=async t=>{if(c(t,{page:o,name:a,id:o,owner:a,assignee:a,search:a,status:s.bind(u),mode:s.bind(l)}),"search"in t&&Object.keys(t).length>1&&!("page"in t&&2===Object.keys(t).length))throw new h('Do not use the filter field "search" with others');if("id"in t&&Object.keys(t).length>1&&!("page"in t&&2===Object.keys(t).length))throw new h('Do not use the filter field "id" with others');const e=new URLSearchParams;for(const n of["name","owner","assignee","search","status","mode","id","page"])Object.prototype.hasOwnProperty.call(t,n)&&e.set(n,t[n]);const n=(await r.users.getUsers()).map(t=>new f(t)),i=await r.tasks.getTasks(e.toString()),p=i.map(t=>b(t,n)).map(t=>new d(t));return p.count=i.count,p},t}})()},function(t,e,n){"use strict";n(255);var r,i=n(12),o=n(13),s=n(139),a=n(0),c=n(104),u=n(18),l=n(64),f=n(9),p=n(256),h=n(257),d=n(67).codeAt,b=n(259),m=n(33),g=n(260),v=n(25),y=a.URL,w=g.URLSearchParams,k=g.getState,x=v.set,O=v.getterFor("URL"),j=Math.floor,S=Math.pow,_=/[A-Za-z]/,A=/[\d+\-.A-Za-z]/,T=/\d/,P=/^(0x|0X)/,E=/^[0-7]+$/,C=/^\d+$/,I=/^[\dA-Fa-f]+$/,F=/[\u0000\u0009\u000A\u000D #%/:?@[\\]]/,M=/[\u0000\u0009\u000A\u000D #/:?@[\\]]/,N=/^[\u0000-\u001F ]+|[\u0000-\u001F ]+$/g,R=/[\u0009\u000A\u000D]/g,D=function(t,e){var n,r,i;if("["==e.charAt(0)){if("]"!=e.charAt(e.length-1))return"Invalid host";if(!(n=B(e.slice(1,-1))))return"Invalid host";t.host=n}else if(V(t)){if(e=b(e),F.test(e))return"Invalid host";if(null===(n=$(e)))return"Invalid host";t.host=n}else{if(M.test(e))return"Invalid host";for(n="",r=h(e),i=0;i4)return t;for(n=[],r=0;r1&&"0"==i.charAt(0)&&(o=P.test(i)?16:8,i=i.slice(8==o?1:2)),""===i)s=0;else{if(!(10==o?C:8==o?E:I).test(i))return t;s=parseInt(i,o)}n.push(s)}for(r=0;r=S(256,5-e))return null}else if(s>255)return null;for(a=n.pop(),r=0;r6)return;for(r=0;p();){if(i=null,r>0){if(!("."==p()&&r<4))return;f++}if(!T.test(p()))return;for(;T.test(p());){if(o=parseInt(p(),10),null===i)i=o;else{if(0==i)return;i=10*i+o}if(i>255)return;f++}c[u]=256*c[u]+i,2!=++r&&4!=r||u++}if(4!=r)return;break}if(":"==p()){if(f++,!p())return}else if(p())return;c[u++]=e}else{if(null!==l)return;f++,l=++u}}if(null!==l)for(s=u-l,u=7;0!=u&&s>0;)a=c[u],c[u--]=c[l+s-1],c[l+--s]=a;else if(8!=u)return;return c},U=function(t){var e,n,r,i;if("number"==typeof t){for(e=[],n=0;n<4;n++)e.unshift(t%256),t=j(t/256);return e.join(".")}if("object"==typeof t){for(e="",r=function(t){for(var e=null,n=1,r=null,i=0,o=0;o<8;o++)0!==t[o]?(i>n&&(e=r,n=i),r=null,i=0):(null===r&&(r=o),++i);return i>n&&(e=r,n=i),e}(t),n=0;n<8;n++)i&&0===t[n]||(i&&(i=!1),r===n?(e+=n?":":"::",i=!0):(e+=t[n].toString(16),n<7&&(e+=":")));return"["+e+"]"}return t},L={},z=p({},L,{" ":1,'"':1,"<":1,">":1,"`":1}),q=p({},z,{"#":1,"?":1,"{":1,"}":1}),W=p({},q,{"/":1,":":1,";":1,"=":1,"@":1,"[":1,"\\":1,"]":1,"^":1,"|":1}),G=function(t,e){var n=d(t,0);return n>32&&n<127&&!f(e,t)?t:encodeURIComponent(t)},J={ftp:21,file:null,http:80,https:443,ws:80,wss:443},V=function(t){return f(J,t.scheme)},H=function(t){return""!=t.username||""!=t.password},X=function(t){return!t.host||t.cannotBeABaseURL||"file"==t.scheme},K=function(t,e){var n;return 2==t.length&&_.test(t.charAt(0))&&(":"==(n=t.charAt(1))||!e&&"|"==n)},Z=function(t){var e;return t.length>1&&K(t.slice(0,2))&&(2==t.length||"/"===(e=t.charAt(2))||"\\"===e||"?"===e||"#"===e)},Y=function(t){var e=t.path,n=e.length;!n||"file"==t.scheme&&1==n&&K(e[0],!0)||e.pop()},Q=function(t){return"."===t||"%2e"===t.toLowerCase()},tt={},et={},nt={},rt={},it={},ot={},st={},at={},ct={},ut={},lt={},ft={},pt={},ht={},dt={},bt={},mt={},gt={},vt={},yt={},wt={},kt=function(t,e,n,i){var o,s,a,c,u,l=n||tt,p=0,d="",b=!1,m=!1,g=!1;for(n||(t.scheme="",t.username="",t.password="",t.host=null,t.port=null,t.path=[],t.query=null,t.fragment=null,t.cannotBeABaseURL=!1,e=e.replace(N,"")),e=e.replace(R,""),o=h(e);p<=o.length;){switch(s=o[p],l){case tt:if(!s||!_.test(s)){if(n)return"Invalid scheme";l=nt;continue}d+=s.toLowerCase(),l=et;break;case et:if(s&&(A.test(s)||"+"==s||"-"==s||"."==s))d+=s.toLowerCase();else{if(":"!=s){if(n)return"Invalid scheme";d="",l=nt,p=0;continue}if(n&&(V(t)!=f(J,d)||"file"==d&&(H(t)||null!==t.port)||"file"==t.scheme&&!t.host))return;if(t.scheme=d,n)return void(V(t)&&J[t.scheme]==t.port&&(t.port=null));d="","file"==t.scheme?l=ht:V(t)&&i&&i.scheme==t.scheme?l=rt:V(t)?l=at:"/"==o[p+1]?(l=it,p++):(t.cannotBeABaseURL=!0,t.path.push(""),l=vt)}break;case nt:if(!i||i.cannotBeABaseURL&&"#"!=s)return"Invalid scheme";if(i.cannotBeABaseURL&&"#"==s){t.scheme=i.scheme,t.path=i.path.slice(),t.query=i.query,t.fragment="",t.cannotBeABaseURL=!0,l=wt;break}l="file"==i.scheme?ht:ot;continue;case rt:if("/"!=s||"/"!=o[p+1]){l=ot;continue}l=ct,p++;break;case it:if("/"==s){l=ut;break}l=gt;continue;case ot:if(t.scheme=i.scheme,s==r)t.username=i.username,t.password=i.password,t.host=i.host,t.port=i.port,t.path=i.path.slice(),t.query=i.query;else if("/"==s||"\\"==s&&V(t))l=st;else if("?"==s)t.username=i.username,t.password=i.password,t.host=i.host,t.port=i.port,t.path=i.path.slice(),t.query="",l=yt;else{if("#"!=s){t.username=i.username,t.password=i.password,t.host=i.host,t.port=i.port,t.path=i.path.slice(),t.path.pop(),l=gt;continue}t.username=i.username,t.password=i.password,t.host=i.host,t.port=i.port,t.path=i.path.slice(),t.query=i.query,t.fragment="",l=wt}break;case st:if(!V(t)||"/"!=s&&"\\"!=s){if("/"!=s){t.username=i.username,t.password=i.password,t.host=i.host,t.port=i.port,l=gt;continue}l=ut}else l=ct;break;case at:if(l=ct,"/"!=s||"/"!=d.charAt(p+1))continue;p++;break;case ct:if("/"!=s&&"\\"!=s){l=ut;continue}break;case ut:if("@"==s){b&&(d="%40"+d),b=!0,a=h(d);for(var v=0;v65535)return"Invalid port";t.port=V(t)&&k===J[t.scheme]?null:k,d=""}if(n)return;l=mt;continue}return"Invalid port"}d+=s;break;case ht:if(t.scheme="file","/"==s||"\\"==s)l=dt;else{if(!i||"file"!=i.scheme){l=gt;continue}if(s==r)t.host=i.host,t.path=i.path.slice(),t.query=i.query;else if("?"==s)t.host=i.host,t.path=i.path.slice(),t.query="",l=yt;else{if("#"!=s){Z(o.slice(p).join(""))||(t.host=i.host,t.path=i.path.slice(),Y(t)),l=gt;continue}t.host=i.host,t.path=i.path.slice(),t.query=i.query,t.fragment="",l=wt}}break;case dt:if("/"==s||"\\"==s){l=bt;break}i&&"file"==i.scheme&&!Z(o.slice(p).join(""))&&(K(i.path[0],!0)?t.path.push(i.path[0]):t.host=i.host),l=gt;continue;case bt:if(s==r||"/"==s||"\\"==s||"?"==s||"#"==s){if(!n&&K(d))l=gt;else if(""==d){if(t.host="",n)return;l=mt}else{if(c=D(t,d))return c;if("localhost"==t.host&&(t.host=""),n)return;d="",l=mt}continue}d+=s;break;case mt:if(V(t)){if(l=gt,"/"!=s&&"\\"!=s)continue}else if(n||"?"!=s)if(n||"#"!=s){if(s!=r&&(l=gt,"/"!=s))continue}else t.fragment="",l=wt;else t.query="",l=yt;break;case gt:if(s==r||"/"==s||"\\"==s&&V(t)||!n&&("?"==s||"#"==s)){if(".."===(u=(u=d).toLowerCase())||"%2e."===u||".%2e"===u||"%2e%2e"===u?(Y(t),"/"==s||"\\"==s&&V(t)||t.path.push("")):Q(d)?"/"==s||"\\"==s&&V(t)||t.path.push(""):("file"==t.scheme&&!t.path.length&&K(d)&&(t.host&&(t.host=""),d=d.charAt(0)+":"),t.path.push(d)),d="","file"==t.scheme&&(s==r||"?"==s||"#"==s))for(;t.path.length>1&&""===t.path[0];)t.path.shift();"?"==s?(t.query="",l=yt):"#"==s&&(t.fragment="",l=wt)}else d+=G(s,q);break;case vt:"?"==s?(t.query="",l=yt):"#"==s?(t.fragment="",l=wt):s!=r&&(t.path[0]+=G(s,L));break;case yt:n||"#"!=s?s!=r&&("'"==s&&V(t)?t.query+="%27":t.query+="#"==s?"%23":G(s,L)):(t.fragment="",l=wt);break;case wt:s!=r&&(t.fragment+=G(s,z))}p++}},xt=function(t){var e,n,r=l(this,xt,"URL"),i=arguments.length>1?arguments[1]:void 0,s=String(t),a=x(r,{type:"URL"});if(void 0!==i)if(i instanceof xt)e=O(i);else if(n=kt(e={},String(i)))throw TypeError(n);if(n=kt(a,s,null,e))throw TypeError(n);var c=a.searchParams=new w,u=k(c);u.updateSearchParams(a.query),u.updateURL=function(){a.query=String(c)||null},o||(r.href=jt.call(r),r.origin=St.call(r),r.protocol=_t.call(r),r.username=At.call(r),r.password=Tt.call(r),r.host=Pt.call(r),r.hostname=Et.call(r),r.port=Ct.call(r),r.pathname=It.call(r),r.search=Ft.call(r),r.searchParams=Mt.call(r),r.hash=Nt.call(r))},Ot=xt.prototype,jt=function(){var t=O(this),e=t.scheme,n=t.username,r=t.password,i=t.host,o=t.port,s=t.path,a=t.query,c=t.fragment,u=e+":";return null!==i?(u+="//",H(t)&&(u+=n+(r?":"+r:"")+"@"),u+=U(i),null!==o&&(u+=":"+o)):"file"==e&&(u+="//"),u+=t.cannotBeABaseURL?s[0]:s.length?"/"+s.join("/"):"",null!==a&&(u+="?"+a),null!==c&&(u+="#"+c),u},St=function(){var t=O(this),e=t.scheme,n=t.port;if("blob"==e)try{return new URL(e.path[0]).origin}catch(t){return"null"}return"file"!=e&&V(t)?e+"://"+U(t.host)+(null!==n?":"+n:""):"null"},_t=function(){return O(this).scheme+":"},At=function(){return O(this).username},Tt=function(){return O(this).password},Pt=function(){var t=O(this),e=t.host,n=t.port;return null===e?"":null===n?U(e):U(e)+":"+n},Et=function(){var t=O(this).host;return null===t?"":U(t)},Ct=function(){var t=O(this).port;return null===t?"":String(t)},It=function(){var t=O(this),e=t.path;return t.cannotBeABaseURL?e[0]:e.length?"/"+e.join("/"):""},Ft=function(){var t=O(this).query;return t?"?"+t:""},Mt=function(){return O(this).searchParams},Nt=function(){var t=O(this).fragment;return t?"#"+t:""},Rt=function(t,e){return{get:t,set:e,configurable:!0,enumerable:!0}};if(o&&c(Ot,{href:Rt(jt,(function(t){var e=O(this),n=String(t),r=kt(e,n);if(r)throw TypeError(r);k(e.searchParams).updateSearchParams(e.query)})),origin:Rt(St),protocol:Rt(_t,(function(t){var e=O(this);kt(e,String(t)+":",tt)})),username:Rt(At,(function(t){var e=O(this),n=h(String(t));if(!X(e)){e.username="";for(var r=0;r=n.length?{value:void 0,done:!0}:(t=r(n,i),e.index+=t.length,{value:t,done:!1})}))},function(t,e,n){"use strict";var r=n(13),i=n(3),o=n(105),s=n(92),a=n(84),c=n(37),u=n(85),l=Object.assign;t.exports=!l||i((function(){var t={},e={},n=Symbol();return t[n]=7,"abcdefghijklmnopqrst".split("").forEach((function(t){e[t]=t})),7!=l({},t)[n]||"abcdefghijklmnopqrst"!=o(l({},e)).join("")}))?function(t,e){for(var n=c(t),i=arguments.length,l=1,f=s.f,p=a.f;i>l;)for(var h,d=u(arguments[l++]),b=f?o(d).concat(f(d)):o(d),m=b.length,g=0;m>g;)h=b[g++],r&&!p.call(d,h)||(n[h]=d[h]);return n}:l},function(t,e,n){"use strict";var r=n(47),i=n(37),o=n(97),s=n(96),a=n(45),c=n(258),u=n(48);t.exports=function(t){var e,n,l,f,p,h=i(t),d="function"==typeof this?this:Array,b=arguments.length,m=b>1?arguments[1]:void 0,g=void 0!==m,v=0,y=u(h);if(g&&(m=r(m,b>2?arguments[2]:void 0,2)),null==y||d==Array&&s(y))for(n=new d(e=a(h.length));e>v;v++)c(n,v,g?m(h[v],v):h[v]);else for(p=(f=y.call(h)).next,n=new d;!(l=p.call(f)).done;v++)c(n,v,g?o(f,m,[l.value,v],!0):l.value);return n.length=v,n}},function(t,e,n){"use strict";var r=n(58),i=n(21),o=n(42);t.exports=function(t,e,n){var s=r(e);s in t?i.f(t,s,o(0,n)):t[s]=n}},function(t,e,n){"use strict";var r=/[^\0-\u007E]/,i=/[.\u3002\uFF0E\uFF61]/g,o="Overflow: input needs wider integers to process",s=Math.floor,a=String.fromCharCode,c=function(t){return t+22+75*(t<26)},u=function(t,e,n){var r=0;for(t=n?s(t/700):t>>1,t+=s(t/e);t>455;r+=36)t=s(t/35);return s(r+36*t/(t+38))},l=function(t){var e,n,r=[],i=(t=function(t){for(var e=[],n=0,r=t.length;n=55296&&i<=56319&&n=l&&ns((2147483647-f)/m))throw RangeError(o);for(f+=(b-l)*m,l=b,e=0;e2147483647)throw RangeError(o);if(n==l){for(var g=f,v=36;;v+=36){var y=v<=p?1:v>=p+26?26:v-p;if(g0?arguments[0]:void 0,p=this,g=[];if(v(p,{type:"URLSearchParams",entries:g,updateURL:function(){},updateSearchParams:C}),void 0!==u)if(d(u))if("function"==typeof(t=m(u)))for(n=(e=t.call(u)).next;!(r=n.call(e)).done;){if((s=(o=(i=b(h(r.value))).next).call(i)).done||(a=o.call(i)).done||!o.call(i).done)throw TypeError("Expected sequence with length 2");g.push({key:s.value+"",value:a.value+""})}else for(c in u)f(u,c)&&g.push({key:c,value:u[c]+""});else E(g,"string"==typeof u?"?"===u.charAt(0)?u.slice(1):u:u+"")},N=M.prototype;s(N,{append:function(t,e){I(arguments.length,2);var n=y(this);n.entries.push({key:t+"",value:e+""}),n.updateURL()},delete:function(t){I(arguments.length,1);for(var e=y(this),n=e.entries,r=t+"",i=0;it.key){i.splice(e,0,t);break}e===n&&i.push(t)}r.updateURL()},forEach:function(t){for(var e,n=y(this).entries,r=p(t,arguments.length>1?arguments[1]:void 0,3),i=0;i { + this._loaded = {frameNumber}; if (typeof (error) === 'number') { if (this._required === error) { console.log(`Unexpecter error. Requested frame ${error} was rejected`); } else { console.log(`${error} rejected - ok`); } - } else { - throw error; } + this.notify(); }); } catch (error) { if (typeof (error) === 'number') { @@ -73,7 +73,6 @@ class FrameProviderWrapper extends Listener { } else { console.log(`${error} rejected - ok`); } - } else { throw error; } } @@ -91,7 +90,7 @@ class FrameProviderWrapper extends Listener { class FrameBuffer extends Listener { constructor(size, frameProvider, chunkSize, stopFrame) { - super('onBufferLoad', () => this._loaded); + super('onFrameReady', () => this._loaded); this._size = size; this._buffer = {}; this._requestedChunks = {}; @@ -113,15 +112,25 @@ class FrameBuffer extends Listener { } async onFrameLoad(last) { // callback for FrameProvider instance + const isReject = typeof(last) === 'object'; + if (isReject) { + last = last.frameNumber; + } const chunk_idx = Math.floor(last / this._chunkSize); if (chunk_idx in this._requestedChunks && this._requestedChunks[chunk_idx].requestedFrames.has(last)) { - this._requestedChunks[chunk_idx].buffer[last] = await this._frameProvider.require(last); - this._requestedChunks[chunk_idx].requestedFrames.delete(last); - - if (this._requestedChunks[chunk_idx].requestedFrames.size === 0) { - if (this._requestedChunks[chunk_idx].resolve) { - const bufferedframes = Object.keys(this._requestedChunks[chunk_idx].buffer).map(f => +f); - this._requestedChunks[chunk_idx].resolve(new Set(bufferedframes)); + if (isReject) { + this._requestedChunks[chunk_idx].reject(new Set()); + this._requestedChunks[chunk_idx].requestedFrames.clear(); + } + const frameData = await this._frameProvider.require(last); + if (chunk_idx in this._requestedChunks && this._requestedChunks[chunk_idx].requestedFrames.has(last)) { + this._requestedChunks[chunk_idx].buffer[last] = frameData; + this._requestedChunks[chunk_idx].requestedFrames.delete(last); + if (this._requestedChunks[chunk_idx].requestedFrames.size === 0) { + if (this._requestedChunks[chunk_idx].resolve) { + const bufferedframes = Object.keys(this._requestedChunks[chunk_idx].buffer).map(f => +f); + this._requestedChunks[chunk_idx].resolve(new Set(bufferedframes)); + } } } } else { @@ -136,8 +145,8 @@ class FrameBuffer extends Listener { for (const frame of this._requestedChunks[chunk_idx].requestedFrames.entries()) { const requestedFrame = frame[1]; this._frameProvider.require(requestedFrame).then(frameData => { - if (!this._requestedChunks[chunk_idx].requestedFrames.has(requestedFrame)) { - reject(); + if (!(chunk_idx in this._requestedChunks) || !this._requestedChunks[chunk_idx].requestedFrames.has(requestedFrame)) { + reject(requestedFrame); } if (frameData !== null) { @@ -155,11 +164,13 @@ class FrameBuffer extends Listener { }); } - fillBuffer(startFrame, frameStep) { - console.log(`FrameBuffer:Fill buffer request`); + fillBuffer(startFrame, frameStep=1, count=null) { const freeSize = this.getFreeBufferSize(); - const stopFrame = Math.min(startFrame + frameStep * freeSize, this._stopFrame + 1); + let stopFrame = Math.min(startFrame + frameStep * freeSize, this._stopFrame + 1); + if (count) { + stopFrame = Math.min(stopFrame, count); + } for (let i = startFrame; i < stopFrame; i += frameStep) { const chunk_idx = Math.floor(i / this._chunkSize); @@ -189,10 +200,11 @@ class FrameBuffer extends Listener { resolve(bufferedFrames); } } else { - reject(); + reject(parseInt(chunk_idx)); } } catch (error) { - reject(error); + this._requestedChunks = {}; + resolve(bufferedFrames); } } } @@ -205,12 +217,16 @@ class FrameBuffer extends Listener { delete this._buffer[frameNumber]; return frame; } else { - this.clear(); return this._frameProvider.require(frameNumber); } } clear() { + for (const chunk_idx in this._requestedChunks) { + if (this._requestedChunks.hasOwnProperty(chunk_idx) && this._requestedChunks[chunk_idx].reject) { + this._requestedChunks[chunk_idx].reject(); + } + } this._requestedChunks = {}; this._buffer = {}; } @@ -249,13 +265,14 @@ class PlayerModel extends Listener { this._pauseFlag = null; this._chunkSize = window.cvat.job.chunk_size; this._frameProvider = new FrameProviderWrapper(this._frame.stop); - this._bufferSize = 500; + this._bufferSize = 200; this._frameBuffer = new FrameBuffer(this._bufferSize, this._frameProvider, this._chunkSize, this._frame.stop); this._continueAfterLoad = false; - // this._continueTimeout = null; this._image = null; this._activeBufrequest = false; this._bufferedFrames = new Set(); + this._step = 1; + this._timeout = 1000 / this._settings.fps; this._geometry = { scale: 1, @@ -276,6 +293,10 @@ class PlayerModel extends Listener { this._frameBuffer.subscribe(this); } + get bufferSize() { + return this._bufferSize; + } + get frames() { return { start: this._frame.start, @@ -293,7 +314,6 @@ class PlayerModel extends Listener { } get playing() { - // return this._playInterval != null; return this._playing; } @@ -341,121 +361,99 @@ class PlayerModel extends Listener { return this._frame.previous === this._frame.current; } - async onBufferLoad(last) { // callback for FrameProvider instance + async onFrameReady(last) { // callback for FrameProvider instance if (last === this._frame.current) { - // if (this._continueTimeout) { - // clearTimeout(this._continueTimeout); - // this._continueTimeout = null; - // } - // If need continue playing after load, set timeout for additional frame download if (this._continueAfterLoad) { - // this._continueTimeout = setTimeout(async () => { - // If you still need to play, start it - // this._continueTimeout = null; - if (this._continueAfterLoad) { - this._continueAfterLoad = false; - this.play(); - } else { // Else update the frame - await this.shift(0); - } - // }, 5000); - } else { // Just update frame if no need to play + this._continueAfterLoad = false; + this.play(); + } else { // Else update the frame await this.shift(0); } } } - play() { - const skip = Math.max(Math.floor(this._settings.fps / 25), 1); - this._pauseFlag = false; - this._playing = true; - const timeout = 1000 / this._settings.fps; - this._frame.requested.clear(); + fillBuffer(startFrame, step, count=null) { + if (this._activeBufrequest) { + return; + } - for (const bufferedFrame in this._bufferedFrames) { - if (bufferedFrame <= this._frame.current) { - this._bufferedFrames.delete(bufferedFrame); - this._frameBuffer.deleteFrame(bufferedFrame); + this._activeBufrequest = true; + this._frameBuffer.fillBuffer(startFrame, step, count).then((bufferedFrames) => { + this._bufferedFrames = new Set([...this._bufferedFrames, ...bufferedFrames]); + if ((!this._pauseFlag || this._continueAfterLoad) && !this._playInterval) { + this._continueAfterLoad = false; + this._pauseFlag = false; + this._playInterval = setInterval(() => this._playFunction(), this._timeout); } - } - // this._bufferedFrames.clear(); + }).catch(error => { + if (typeof(error) !== 'number') { + throw error; + } + }).finally(() => { + this._activeBufrequest = false; + }); + } - const playFunc = async () => { - if (this._pauseFlag) { // pause method without notify (for frame downloading) - if (this._playInterval) { - clearInterval(this._playInterval); - this._playInterval = null; - } - return; + async _playFunction() { + if (this._pauseFlag) { // pause method without notify (for frame downloading) + if (this._playInterval) { + clearInterval(this._playInterval); + this._playInterval = null; } + return; + } - const requestedFrame = this._frame.current + skip; - // if (requestedFrame % this._frame.chunkSize === 0 && this._frame.requested.size) { - // if (this._playInterval) { - // clearInterval(this._playInterval); - // this._playInterval = null; - // return; - // } - // } - - // if (this._bufferedFrames.size < this._bufferSize / 2) { - // if (this._bufferedFrames.size === 0 && requestedFrame <= this._frame.stop) { - if (this._bufferedFrames.size < this._bufferSize / 2 && requestedFrame <= this._frame.stop) { - let startFrame = requestedFrame; - if (this._bufferedFrames.size !== 0) { - startFrame = Math.max(...this._bufferedFrames) + 1; + const requestedFrame = this._frame.current + this._step; + if (this._bufferedFrames.size < this._bufferSize / 2 && requestedFrame <= this._frame.stop) { + if (this._bufferedFrames.size !== 0) { + const maxBufFrame = Math.max(...this._bufferedFrames); + if (maxBufFrame !== this._frame.stop) { + this.fillBuffer(maxBufFrame + 1, this._step); } - fillBufferRequest(startFrame); + } else { + this.fillBuffer(requestedFrame, this._step); } + } - if (!this._bufferedFrames.size) { - setTimeout(checkFunction, 500); - return; + if (!this._bufferedFrames.size) { + if (this._frame.current === this._frame.stop) { + this.pause(); + } else { + setTimeout(() => { + if (this._activeBufrequest && !this._bufferedFrames.size) { + this._image = null; + this._continueAfterLoad = this.playing; + this._pauseFlag = true; + this.notify(); + } + }, 500); } + return; + } - const res = await this.shift(skip); - this._bufferedFrames.delete(requestedFrame); - if (!res) { - this.pause(); // if not changed, pause - } else if (this._frame.requested.size === 0 && !this._playInterval) { - this._playInterval = setInterval(playFunc, timeout); - } - }; + const res = await this.shift(this._step); + if (!res) { + this.pause(); // if not changed, pause + } else if (this._frame.requested.size === 0 && !this._playInterval) { + this._playInterval = setInterval(() => this._playFunction(), this._timeout); + } + } - const fillBufferRequest = (startFrame) => { - if (this._activeBufrequest) { - return; - } - console.log(`Fill buffer request`); - - this._activeBufrequest = true; - this._frameBuffer.fillBuffer(startFrame, skip).then((bufferedFrames) => { - console.log(`Buffer is ready`); - this._bufferedFrames = new Set([...this._bufferedFrames, ...bufferedFrames]); - if ((!this._pauseFlag || this._continueAfterLoad) && !this._playInterval) { - this._continueAfterLoad = false; - this._pauseFlag = false; - this._playInterval = setInterval(playFunc, timeout); - } - }).catch(error => { - throw error; - }).finally(() => { - this._activeBufrequest = false; - }); - }; + play() { + this._step = Math.max(Math.floor(this._settings.fps / 25), 1); + this._pauseFlag = false; + this._playing = true; + this._timeout = 1000 / this._settings.fps; + this._frame.requested.clear(); - const checkFunction = () => { - if (this._activeBufrequest && !this._bufferedFrames.size) { - console.log(`Wait buffering of frames`); - this._image = null; - this._continueAfterLoad = this.playing; - this._pauseFlag = true; - this.notify(); + this._bufferedFrames.forEach( bufferedFrame => { + if (bufferedFrame <= this._frame.current || bufferedFrame >= this._frame.current + this._bufferSize) { + this._bufferedFrames.delete(bufferedFrame); + this._frameBuffer.deleteFrame(bufferedFrame); } - }; - - setTimeout(playFunc, timeout); + }); + this._playFunction(); } pause() { @@ -489,7 +487,12 @@ class PlayerModel extends Listener { return false; } try { + if (!this._bufferedFrames.has(requestedFrame)) { + this._bufferedFrames.clear(); + this._frameBuffer.clear(); + } const frame = await this._frameBuffer.require(requestedFrame); + this._bufferedFrames.delete(requestedFrame); if (!this._frame.requested.has(requestedFrame)) { return false; } From 8cf272ec1c78b7bd8ec3375b65e5389ebff6f574 Mon Sep 17 00:00:00 2001 From: Andrey Zhavoronkov Date: Tue, 24 Dec 2019 10:39:53 +0300 Subject: [PATCH 099/188] fix codacy issues --- cvat/apps/engine/media_extractors.py | 2 +- cvat/apps/engine/static/engine/js/avc.wasm | Bin 126815 -> 132979 bytes .../engine/static/engine/js/decode_video.js | 3 --- 3 files changed, 1 insertion(+), 4 deletions(-) delete mode 100644 cvat/apps/engine/static/engine/js/decode_video.js diff --git a/cvat/apps/engine/media_extractors.py b/cvat/apps/engine/media_extractors.py index 1fc461c3ee16..9b50804f0652 100644 --- a/cvat/apps/engine/media_extractors.py +++ b/cvat/apps/engine/media_extractors.py @@ -234,7 +234,7 @@ def __init__(self, quality): @staticmethod def _compress_image(image_path, quality): - image = Image.open(image_path) + image = image_path.to_image() if isinstance(image_path, av.VideoFrame) else Image.open(image_path) # Ensure image data fits into 8bit per pixel before RGB conversion as PIL clips values on conversion if image.mode == "I": # Image mode is 32bit integer pixels. diff --git a/cvat/apps/engine/static/engine/js/avc.wasm b/cvat/apps/engine/static/engine/js/avc.wasm index 559b2b3157a0fccbcf3128e8a5d4e371654d2d3e..378ac32d9a676a169af5c87ad0ccba9649e02366 100644 GIT binary patch literal 132979 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.length?(t.target=void 0,{value:void 0,done:!0}):"keys"==r?{value:i,done:!1}:"values"==r?{value:e[i],done:!1}:{value:[i,e[i]],done:!1}}),"values"),n.Arguments=n.Array,o("keys"),o("values"),o("entries")},function(t,e,r){var i=r(39),o=r(21);t.exports=function(t){return i(o(t))}},function(t,e,r){var i=r(12),o=r(43);(t.exports=function(t,e){return o[t]||(o[t]=void 0!==e?e:{})})("versions",[]).push({version:"3.3.2",mode:i?"pure":"global",copyright:"© 2019 Denis Pushkarev (zloirock.ru)"})},function(t,e,r){var i=r(5),o=r(22),n=r(7),s=r(24),a=Object.defineProperty;e.f=i?a:function(t,e,r){if(n(t),e=s(e,!0),n(r),o)try{return a(t,e,r)}catch(t){}if("get"in r||"set"in r)throw TypeError("Accessors not supported");return"value"in r&&(t[e]=r.value),t}},function(t,e){t.exports=!1},function(t,e,r){var i=r(0),o=r(1);t.exports=function(t,e){try{o(i,t,e)}catch(r){i[t]=e}return e}},function(t,e){t.exports=function(t,e){return{enumerable:!(1&t),configurable:!(2&t),writable:!(4&t),value:e}}},function(t,e){t.exports={}},function(t,e){t.exports=["constructor","hasOwnProperty","isPrototypeOf","propertyIsEnumerable","toLocaleString","toString","valueOf"]},function(t,e,r){var i=r(10),o=r(25),n=i("keys");t.exports=function(t){return n[t]||(n[t]=o(t))}},function(t,e){t.exports={}},function(t,e){ -/*! jsmpeg v1.0 | (c) Dominic Szablewski | MIT license */ -t.exports={Player:null,VideoElement:null,BitBuffer:null,Source:{},Demuxer:{},Decoder:{},Renderer:{},AudioOutput:{},Now:function(){return Date.now()/1e3},Fill:function(t,e){if(t.fill)t.fill(e);else for(var r=0;r>3,r=this.bytes.length-this.byteLength;if(this.index===this.byteLength<<3||t>r+e)return this.byteLength=0,void(this.index=0);0!==e&&(this.bytes.copyWithin?this.bytes.copyWithin(0,e,this.byteLength):this.bytes.set(this.bytes.subarray(e,this.byteLength)),this.byteLength=this.byteLength-e,this.index-=e<<3)},t.prototype.write=function(e){var r="object"==typeof e[0],i=0,o=this.bytes.length-this.byteLength;if(r){i=0;for(var n=0;no)if(this.mode===t.MODE.EXPAND){var s=Math.max(2*this.bytes.length,i-o);this.resize(s)}else this.evict(i);if(r)for(n=0;n>3;t>3;return t>=this.byteLength||0==this.bytes[t]&&0==this.bytes[t+1]&&1==this.bytes[t+2]},t.prototype.peek=function(t){for(var e=this.index,r=0;t;){var i=8-(7&e),o=i>3]&255>>8-o<>n,e+=o,t-=o}return r},t.prototype.read=function(t){var e=this.peek(t);return this.index+=t,e},t.prototype.skip=function(t){return this.index+=t},t.prototype.rewind=function(t){this.index=Math.max(this.index-t,0)},t.prototype.has=function(t){return(this.byteLength<<3)-this.index>=t},t.MODE={EVICT:1,EXPAND:2},t}()},function(t,e){t.exports=function(t){if(null==t)throw TypeError("Can't call method on "+t);return t}},function(t,e,r){var i=r(5),o=r(3),n=r(23);t.exports=!i&&!o((function(){return 7!=Object.defineProperty(n("div"),"a",{get:function(){return 7}}).a}))},function(t,e,r){var i=r(0),o=r(6),n=i.document,s=o(n)&&o(n.createElement);t.exports=function(t){return s?n.createElement(t):{}}},function(t,e,r){var i=r(6);t.exports=function(t,e){if(!i(t))return t;var r,o;if(e&&"function"==typeof(r=t.toString)&&!i(o=r.call(t)))return o;if("function"==typeof(r=t.valueOf)&&!i(o=r.call(t)))return o;if(!e&&"function"==typeof(r=t.toString)&&!i(o=r.call(t)))return o;throw TypeError("Can't convert object to primitive value")}},function(t,e){var r=0,i=Math.random();t.exports=function(t){return"Symbol("+String(void 0===t?"":t)+")_"+(++r+i).toString(36)}},function(t,e,r){var i=r(7),o=r(45),n=r(16),s=r(15),a=r(50),c=r(23),h=r(17)("IE_PROTO"),u=function(){},f=function(){var t,e=c("iframe"),r=n.length;for(e.style.display="none",a.appendChild(e),e.src=String("javascript:"),(t=e.contentWindow.document).open(),t.write(" - - {% for js_file in js_3rdparty %} - - {% endfor %} -{% endblock %} - -{% block head_js_cvat %} - {{ block.super }} - - - - - - - -{% endblock %} - -{% block content %} -

- -
Label Boxes
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- -
-
-
- - - -
- - - -
- - - - -
- - - - -
- - - - -
- - - - -
- - - - -
- - - - -
- - -
-
- - - -
- -
-
-
- - -
-
- -
-
- -
- - - - -{% endblock %} diff --git a/cvat/apps/engine/migrations/0023_auto_20191023_1025.py b/cvat/apps/engine/migrations/0023_auto_20191023_1025.py index 0db393ded5e0..59048794c676 100644 --- a/cvat/apps/engine/migrations/0023_auto_20191023_1025.py +++ b/cvat/apps/engine/migrations/0023_auto_20191023_1025.py @@ -1,28 +1,20 @@ # Generated by Django 2.2.4 on 2019-10-23 10:25 -import cvat.apps.engine.models -from cvat.apps.engine.media_extractors import (VideoReader, ArchiveReader, ZipReader, - PdfReader , ImageListReader, Mpeg4ChunkWriter, Mpeg4CompressedChunkWriter, - ZipChunkWriter, ZipCompressedChunkWriter, get_mime, MEDIA_TYPES) +import os +import re +import shutil +import glob + from django.db import migrations, models import django.db.models.deletion from django.conf import settings +from cvat.apps.engine.media_extractors import (VideoReader, ArchiveReader, ZipReader, + PdfReader , ImageListReader, Mpeg4ChunkWriter, Mpeg4CompressedChunkWriter, + ZipChunkWriter, ZipCompressedChunkWriter, get_mime) from cvat.apps.engine.models import DataChoice - -# from cvat.apps.engine.serializers import TaskSerializer, DataSerializer - -import os -import re -import shutil -import glob - def create_data_objects(apps, schema_editor): - def get_frame_path(frame): - d1, d2 = str(int(frame) // 10000), str(int(frame) // 100) - return os.path.join(d1, d2, str(frame) + '.jpg') - def fix_path(path): ind = path.find('.upload') if ind != -1: @@ -186,8 +178,8 @@ class Migration(migrations.Migration): ('start_frame', models.PositiveIntegerField(default=0)), ('stop_frame', models.PositiveIntegerField(default=0)), ('frame_filter', models.CharField(blank=True, default='', max_length=256)), - ('compressed_chunk_type', models.CharField(choices=[('video', 'VIDEO'), ('imageset', 'IMAGESET'), ('list', 'LIST')], default=cvat.apps.engine.models.DataChoice('imageset'), max_length=32)), - ('original_chunk_type', models.CharField(choices=[('video', 'VIDEO'), ('imageset', 'IMAGESET'), ('list', 'LIST')], default=cvat.apps.engine.models.DataChoice('imageset'), max_length=32)), + ('compressed_chunk_type', models.CharField(choices=[('video', 'VIDEO'), ('imageset', 'IMAGESET'), ('list', 'LIST')], default=DataChoice('imageset'), max_length=32)), + ('original_chunk_type', models.CharField(choices=[('video', 'VIDEO'), ('imageset', 'IMAGESET'), ('list', 'LIST')], default=DataChoice('imageset'), max_length=32)), ], options={ 'default_permissions': (), diff --git a/cvat/apps/engine/views.py b/cvat/apps/engine/views.py index c53aa2a82b2e..442f622a8aea 100644 --- a/cvat/apps/engine/views.py +++ b/cvat/apps/engine/views.py @@ -8,10 +8,10 @@ import traceback import shutil from datetime import datetime -from tempfile import mkstemp, NamedTemporaryFile +from tempfile import mkstemp from django.views.generic import RedirectView -from django.http import HttpResponse, HttpResponseBadRequest, HttpResponseNotFound +from django.http import HttpResponse, HttpResponseNotFound from django.shortcuts import render from django.conf import settings from sendfile import sendfile @@ -600,11 +600,12 @@ def _get_rq_response(queue, job_id): return response + @staticmethod @swagger_auto_schema(method='get', operation_summary='Method provides a list of sizes (width, height) of media files which are related with the task', responses={'200': ImageMetaSerializer(many=True)}) @action(detail=True, methods=['GET'], serializer_class=ImageMetaSerializer, url_path='data/meta') - def data_info(self, request, pk): + def data_info(request, pk): data = { 'original_size': [], } diff --git a/cvat/apps/tf_annotation/views.py b/cvat/apps/tf_annotation/views.py index 0f4aace27669..534ca5b96edb 100644 --- a/cvat/apps/tf_annotation/views.py +++ b/cvat/apps/tf_annotation/views.py @@ -13,8 +13,6 @@ from cvat.apps.engine.frame_provider import FrameProvider import django_rq -import fnmatch -import json import os import rq diff --git a/utils/cli/core/core.py b/utils/cli/core/core.py index f51dff580238..dddde8e29add 100644 --- a/utils/cli/core/core.py +++ b/utils/cli/core/core.py @@ -165,10 +165,6 @@ def tasks_id_annotations_format(self, task_id, fileformat): return self.tasks_id(task_id) + '/annotations?format={}' \ .format(fileformat) - def tasks_id_annotations_format(self, task_id, fileformat): - return self.tasks_id(task_id) + '/annotations?format={}' \ - .format(fileformat) - def tasks_id_annotations_filename(self, task_id, name, fileformat): return self.tasks_id(task_id) + '/annotations/{}?format={}' \ .format(name, fileformat) From 7f01b6a418da113ec59010ff846ad47ce8a1991c Mon Sep 17 00:00:00 2001 From: Andrey Zhavoronkov Date: Tue, 24 Dec 2019 12:55:42 +0300 Subject: [PATCH 101/188] fix codacy issues part2 --- cvat-data/src/js/unzip_imgs.js | 40 ++++++++++++------- .../engine/static/engine/js/annotationUI.js | 4 +- .../engine/static/engine/js/unzip_imgs.js | 2 +- 3 files changed, 28 insertions(+), 18 deletions(-) diff --git a/cvat-data/src/js/unzip_imgs.js b/cvat-data/src/js/unzip_imgs.js index 6e7b264d5c65..b006fd243b89 100644 --- a/cvat-data/src/js/unzip_imgs.js +++ b/cvat-data/src/js/unzip_imgs.js @@ -1,17 +1,22 @@ -const JSZip = require('jszip'); +/* +* Copyright (C) 2019 Intel Corporation +* SPDX-License-Identifier: MIT +*/ + +/* global + require:true +*/ -self.onmessage = function (e) { +const JSZip = require('jszip'); +onmessage = (e) => { const zip = new JSZip(); - const start = e.data.start; - const end = e.data.end; - const block = e.data.block; + const { start, end, block } = e.data; zip.loadAsync(block).then((_zip) => { - fileMapping = {}; + const fileMapping = {}; let index = start; _zip.forEach((relativePath) => { - fileMapping[relativePath] = index++; }); index = start; @@ -21,17 +26,22 @@ self.onmessage = function (e) { _zip.file(relativePath).async('blob').then((fileData) => { const reader = new FileReader(); - reader.onload = (function(i, event){ - postMessage({fileName : relativePath, index : fileIndex, data: reader.result, isEnd : inverseUnzippedFilesCount <= start}); - inverseUnzippedFilesCount --; - if (inverseUnzippedFilesCount < start){ - self.close(); + reader.onload = (() => { + postMessage({ + fileName: relativePath, + index: fileIndex, + data: reader.result, + isEnd: inverseUnzippedFilesCount <= start, + }); + inverseUnzippedFilesCount--; + if (inverseUnzippedFilesCount < start) { + // eslint-disable-next-line no-restricted-globals + close(); } - }).bind(fileIndex, relativePath); + }); reader.readAsDataURL(fileData); }); }); }); - -} +}; diff --git a/cvat/apps/engine/static/engine/js/annotationUI.js b/cvat/apps/engine/static/engine/js/annotationUI.js index d79c592e5b83..640ec336e4ab 100644 --- a/cvat/apps/engine/static/engine/js/annotationUI.js +++ b/cvat/apps/engine/static/engine/js/annotationUI.js @@ -640,8 +640,8 @@ function buildAnnotationUI(jobData, taskData, imageMetaData, annotationData, ann playerModel.subscribe(shapeBufferView); playerModel.subscribe(shapeGrouperView); playerModel.subscribe(polyshapeEditorView); - playerModel.shift(window.cvat.search.get('frame') || 0, true).then( () => { - setTimeout( () => playerModel.fillBuffer(1 + (window.cvat.search.get('frame') || 0), 1, playerModel.bufferSize), 5000); + playerModel.shift(window.cvat.search.get('frame') || 0, true).then(() => { + setTimeout(() => playerModel.fillBuffer(1 + (window.cvat.search.get('frame') || 0), 1, playerModel.bufferSize), 5000); }); const { shortkeys } = window.cvat.config; diff --git a/cvat/apps/engine/static/engine/js/unzip_imgs.js b/cvat/apps/engine/static/engine/js/unzip_imgs.js index cce8f3950d6b..56c2c9ac651e 100644 --- a/cvat/apps/engine/static/engine/js/unzip_imgs.js +++ b/cvat/apps/engine/static/engine/js/unzip_imgs.js @@ -5,4 +5,4 @@ * @author Feross Aboukhadijeh * @license MIT */ -var n=r(53),i=r(54),o=r(24);function s(){return u.TYPED_ARRAY_SUPPORT?2147483647:1073741823}function a(t,e){if(s()=s())throw new RangeError("Attempt to allocate Buffer larger than maximum size: 0x"+s().toString(16)+" bytes");return 0|t}function p(t,e){if(u.isBuffer(t))return t.length;if("undefined"!=typeof ArrayBuffer&&"function"==typeof ArrayBuffer.isView&&(ArrayBuffer.isView(t)||t instanceof ArrayBuffer))return t.byteLength;"string"!=typeof t&&(t=""+t);var r=t.length;if(0===r)return 0;for(var n=!1;;)switch(e){case"ascii":case"latin1":case"binary":return r;case"utf8":case"utf-8":case void 0:return j(t).length;case"ucs2":case"ucs-2":case"utf16le":case"utf-16le":return 2*r;case"hex":return r>>>1;case"base64":return Z(t).length;default:if(n)return j(t).length;e=(""+e).toLowerCase(),n=!0}}function g(t,e,r){var n=!1;if((void 0===e||e<0)&&(e=0),e>this.length)return"";if((void 0===r||r>this.length)&&(r=this.length),r<=0)return"";if((r>>>=0)<=(e>>>=0))return"";for(t||(t="utf8");;)switch(t){case"hex":return I(this,e,r);case"utf8":case"utf-8":return A(this,e,r);case"ascii":return T(this,e,r);case"latin1":case"binary":return R(this,e,r);case"base64":return S(this,e,r);case"ucs2":case"ucs-2":case"utf16le":case"utf-16le":return O(this,e,r);default:if(n)throw new TypeError("Unknown encoding: "+t);t=(t+"").toLowerCase(),n=!0}}function m(t,e,r){var n=t[e];t[e]=t[r],t[r]=n}function _(t,e,r,n,i){if(0===t.length)return-1;if("string"==typeof r?(n=r,r=0):r>2147483647?r=2147483647:r<-2147483648&&(r=-2147483648),r=+r,isNaN(r)&&(r=i?0:t.length-1),r<0&&(r=t.length+r),r>=t.length){if(i)return-1;r=t.length-1}else if(r<0){if(!i)return-1;r=0}if("string"==typeof e&&(e=u.from(e,n)),u.isBuffer(e))return 0===e.length?-1:v(t,e,r,n,i);if("number"==typeof e)return e&=255,u.TYPED_ARRAY_SUPPORT&&"function"==typeof Uint8Array.prototype.indexOf?i?Uint8Array.prototype.indexOf.call(t,e,r):Uint8Array.prototype.lastIndexOf.call(t,e,r):v(t,[e],r,n,i);throw new TypeError("val must be string, number or Buffer")}function v(t,e,r,n,i){var o,s=1,a=t.length,u=e.length;if(void 0!==n&&("ucs2"===(n=String(n).toLowerCase())||"ucs-2"===n||"utf16le"===n||"utf-16le"===n)){if(t.length<2||e.length<2)return-1;s=2,a/=2,u/=2,r/=2}function h(t,e){return 1===s?t[e]:t.readUInt16BE(e*s)}if(i){var f=-1;for(o=r;oa&&(r=a-u),o=r;o>=0;o--){for(var l=!0,c=0;ci&&(n=i):n=i;var o=e.length;if(o%2!=0)throw new TypeError("Invalid hex string");n>o/2&&(n=o/2);for(var s=0;s>8,i=r%256,o.push(i),o.push(n);return o}(e,t.length-r),t,r,n)}function S(t,e,r){return 0===e&&r===t.length?n.fromByteArray(t):n.fromByteArray(t.slice(e,r))}function A(t,e,r){r=Math.min(t.length,r);for(var n=[],i=e;i239?4:h>223?3:h>191?2:1;if(i+l<=r)switch(l){case 1:h<128&&(f=h);break;case 2:128==(192&(o=t[i+1]))&&(u=(31&h)<<6|63&o)>127&&(f=u);break;case 3:o=t[i+1],s=t[i+2],128==(192&o)&&128==(192&s)&&(u=(15&h)<<12|(63&o)<<6|63&s)>2047&&(u<55296||u>57343)&&(f=u);break;case 4:o=t[i+1],s=t[i+2],a=t[i+3],128==(192&o)&&128==(192&s)&&128==(192&a)&&(u=(15&h)<<18|(63&o)<<12|(63&s)<<6|63&a)>65535&&u<1114112&&(f=u)}null===f?(f=65533,l=1):f>65535&&(f-=65536,n.push(f>>>10&1023|55296),f=56320|1023&f),n.push(f),i+=l}return function(t){var e=t.length;if(e<=C)return String.fromCharCode.apply(String,t);var r="",n=0;for(;n0&&(t=this.toString("hex",0,r).match(/.{2}/g).join(" "),this.length>r&&(t+=" ... ")),""},u.prototype.compare=function(t,e,r,n,i){if(!u.isBuffer(t))throw new TypeError("Argument must be a Buffer");if(void 0===e&&(e=0),void 0===r&&(r=t?t.length:0),void 0===n&&(n=0),void 0===i&&(i=this.length),e<0||r>t.length||n<0||i>this.length)throw new RangeError("out of range index");if(n>=i&&e>=r)return 0;if(n>=i)return-1;if(e>=r)return 1;if(this===t)return 0;for(var o=(i>>>=0)-(n>>>=0),s=(r>>>=0)-(e>>>=0),a=Math.min(o,s),h=this.slice(n,i),f=t.slice(e,r),l=0;li)&&(r=i),t.length>0&&(r<0||e<0)||e>this.length)throw new RangeError("Attempt to write outside buffer bounds");n||(n="utf8");for(var o=!1;;)switch(n){case"hex":return y(this,t,e,r);case"utf8":case"utf-8":return w(this,t,e,r);case"ascii":return b(this,t,e,r);case"latin1":case"binary":return k(this,t,e,r);case"base64":return x(this,t,e,r);case"ucs2":case"ucs-2":case"utf16le":case"utf-16le":return E(this,t,e,r);default:if(o)throw new TypeError("Unknown encoding: "+n);n=(""+n).toLowerCase(),o=!0}},u.prototype.toJSON=function(){return{type:"Buffer",data:Array.prototype.slice.call(this._arr||this,0)}};var C=4096;function T(t,e,r){var n="";r=Math.min(t.length,r);for(var i=e;in)&&(r=n);for(var i="",o=e;or)throw new RangeError("Trying to access beyond buffer length")}function z(t,e,r,n,i,o){if(!u.isBuffer(t))throw new TypeError('"buffer" argument must be a Buffer instance');if(e>i||et.length)throw new RangeError("Index out of range")}function L(t,e,r,n){e<0&&(e=65535+e+1);for(var i=0,o=Math.min(t.length-r,2);i>>8*(n?i:1-i)}function P(t,e,r,n){e<0&&(e=4294967295+e+1);for(var i=0,o=Math.min(t.length-r,4);i>>8*(n?i:3-i)&255}function D(t,e,r,n,i,o){if(r+n>t.length)throw new RangeError("Index out of range");if(r<0)throw new RangeError("Index out of range")}function U(t,e,r,n,o){return o||D(t,0,r,4),i.write(t,e,r,n,23,4),r+4}function N(t,e,r,n,o){return o||D(t,0,r,8),i.write(t,e,r,n,52,8),r+8}u.prototype.slice=function(t,e){var r,n=this.length;if((t=~~t)<0?(t+=n)<0&&(t=0):t>n&&(t=n),(e=void 0===e?n:~~e)<0?(e+=n)<0&&(e=0):e>n&&(e=n),e0&&(i*=256);)n+=this[t+--e]*i;return n},u.prototype.readUInt8=function(t,e){return e||B(t,1,this.length),this[t]},u.prototype.readUInt16LE=function(t,e){return e||B(t,2,this.length),this[t]|this[t+1]<<8},u.prototype.readUInt16BE=function(t,e){return e||B(t,2,this.length),this[t]<<8|this[t+1]},u.prototype.readUInt32LE=function(t,e){return e||B(t,4,this.length),(this[t]|this[t+1]<<8|this[t+2]<<16)+16777216*this[t+3]},u.prototype.readUInt32BE=function(t,e){return e||B(t,4,this.length),16777216*this[t]+(this[t+1]<<16|this[t+2]<<8|this[t+3])},u.prototype.readIntLE=function(t,e,r){t|=0,e|=0,r||B(t,e,this.length);for(var n=this[t],i=1,o=0;++o=(i*=128)&&(n-=Math.pow(2,8*e)),n},u.prototype.readIntBE=function(t,e,r){t|=0,e|=0,r||B(t,e,this.length);for(var n=e,i=1,o=this[t+--n];n>0&&(i*=256);)o+=this[t+--n]*i;return o>=(i*=128)&&(o-=Math.pow(2,8*e)),o},u.prototype.readInt8=function(t,e){return e||B(t,1,this.length),128&this[t]?-1*(255-this[t]+1):this[t]},u.prototype.readInt16LE=function(t,e){e||B(t,2,this.length);var r=this[t]|this[t+1]<<8;return 32768&r?4294901760|r:r},u.prototype.readInt16BE=function(t,e){e||B(t,2,this.length);var r=this[t+1]|this[t]<<8;return 32768&r?4294901760|r:r},u.prototype.readInt32LE=function(t,e){return e||B(t,4,this.length),this[t]|this[t+1]<<8|this[t+2]<<16|this[t+3]<<24},u.prototype.readInt32BE=function(t,e){return e||B(t,4,this.length),this[t]<<24|this[t+1]<<16|this[t+2]<<8|this[t+3]},u.prototype.readFloatLE=function(t,e){return e||B(t,4,this.length),i.read(this,t,!0,23,4)},u.prototype.readFloatBE=function(t,e){return e||B(t,4,this.length),i.read(this,t,!1,23,4)},u.prototype.readDoubleLE=function(t,e){return e||B(t,8,this.length),i.read(this,t,!0,52,8)},u.prototype.readDoubleBE=function(t,e){return e||B(t,8,this.length),i.read(this,t,!1,52,8)},u.prototype.writeUIntLE=function(t,e,r,n){(t=+t,e|=0,r|=0,n)||z(this,t,e,r,Math.pow(2,8*r)-1,0);var i=1,o=0;for(this[e]=255&t;++o=0&&(o*=256);)this[e+i]=t/o&255;return e+r},u.prototype.writeUInt8=function(t,e,r){return t=+t,e|=0,r||z(this,t,e,1,255,0),u.TYPED_ARRAY_SUPPORT||(t=Math.floor(t)),this[e]=255&t,e+1},u.prototype.writeUInt16LE=function(t,e,r){return t=+t,e|=0,r||z(this,t,e,2,65535,0),u.TYPED_ARRAY_SUPPORT?(this[e]=255&t,this[e+1]=t>>>8):L(this,t,e,!0),e+2},u.prototype.writeUInt16BE=function(t,e,r){return t=+t,e|=0,r||z(this,t,e,2,65535,0),u.TYPED_ARRAY_SUPPORT?(this[e]=t>>>8,this[e+1]=255&t):L(this,t,e,!1),e+2},u.prototype.writeUInt32LE=function(t,e,r){return t=+t,e|=0,r||z(this,t,e,4,4294967295,0),u.TYPED_ARRAY_SUPPORT?(this[e+3]=t>>>24,this[e+2]=t>>>16,this[e+1]=t>>>8,this[e]=255&t):P(this,t,e,!0),e+4},u.prototype.writeUInt32BE=function(t,e,r){return t=+t,e|=0,r||z(this,t,e,4,4294967295,0),u.TYPED_ARRAY_SUPPORT?(this[e]=t>>>24,this[e+1]=t>>>16,this[e+2]=t>>>8,this[e+3]=255&t):P(this,t,e,!1),e+4},u.prototype.writeIntLE=function(t,e,r,n){if(t=+t,e|=0,!n){var i=Math.pow(2,8*r-1);z(this,t,e,r,i-1,-i)}var o=0,s=1,a=0;for(this[e]=255&t;++o>0)-a&255;return e+r},u.prototype.writeIntBE=function(t,e,r,n){if(t=+t,e|=0,!n){var i=Math.pow(2,8*r-1);z(this,t,e,r,i-1,-i)}var o=r-1,s=1,a=0;for(this[e+o]=255&t;--o>=0&&(s*=256);)t<0&&0===a&&0!==this[e+o+1]&&(a=1),this[e+o]=(t/s>>0)-a&255;return e+r},u.prototype.writeInt8=function(t,e,r){return t=+t,e|=0,r||z(this,t,e,1,127,-128),u.TYPED_ARRAY_SUPPORT||(t=Math.floor(t)),t<0&&(t=255+t+1),this[e]=255&t,e+1},u.prototype.writeInt16LE=function(t,e,r){return t=+t,e|=0,r||z(this,t,e,2,32767,-32768),u.TYPED_ARRAY_SUPPORT?(this[e]=255&t,this[e+1]=t>>>8):L(this,t,e,!0),e+2},u.prototype.writeInt16BE=function(t,e,r){return t=+t,e|=0,r||z(this,t,e,2,32767,-32768),u.TYPED_ARRAY_SUPPORT?(this[e]=t>>>8,this[e+1]=255&t):L(this,t,e,!1),e+2},u.prototype.writeInt32LE=function(t,e,r){return t=+t,e|=0,r||z(this,t,e,4,2147483647,-2147483648),u.TYPED_ARRAY_SUPPORT?(this[e]=255&t,this[e+1]=t>>>8,this[e+2]=t>>>16,this[e+3]=t>>>24):P(this,t,e,!0),e+4},u.prototype.writeInt32BE=function(t,e,r){return t=+t,e|=0,r||z(this,t,e,4,2147483647,-2147483648),t<0&&(t=4294967295+t+1),u.TYPED_ARRAY_SUPPORT?(this[e]=t>>>24,this[e+1]=t>>>16,this[e+2]=t>>>8,this[e+3]=255&t):P(this,t,e,!1),e+4},u.prototype.writeFloatLE=function(t,e,r){return U(this,t,e,!0,r)},u.prototype.writeFloatBE=function(t,e,r){return U(this,t,e,!1,r)},u.prototype.writeDoubleLE=function(t,e,r){return N(this,t,e,!0,r)},u.prototype.writeDoubleBE=function(t,e,r){return N(this,t,e,!1,r)},u.prototype.copy=function(t,e,r,n){if(r||(r=0),n||0===n||(n=this.length),e>=t.length&&(e=t.length),e||(e=0),n>0&&n=this.length)throw new RangeError("sourceStart out of bounds");if(n<0)throw new RangeError("sourceEnd out of bounds");n>this.length&&(n=this.length),t.length-e=0;--i)t[i+e]=this[i+r];else if(o<1e3||!u.TYPED_ARRAY_SUPPORT)for(i=0;i>>=0,r=void 0===r?this.length:r>>>0,t||(t=0),"number"==typeof t)for(o=e;o55295&&r<57344){if(!i){if(r>56319){(e-=3)>-1&&o.push(239,191,189);continue}if(s+1===n){(e-=3)>-1&&o.push(239,191,189);continue}i=r;continue}if(r<56320){(e-=3)>-1&&o.push(239,191,189),i=r;continue}r=65536+(i-55296<<10|r-56320)}else i&&(e-=3)>-1&&o.push(239,191,189);if(i=null,r<128){if((e-=1)<0)break;o.push(r)}else if(r<2048){if((e-=2)<0)break;o.push(r>>6|192,63&r|128)}else if(r<65536){if((e-=3)<0)break;o.push(r>>12|224,r>>6&63|128,63&r|128)}else{if(!(r<1114112))throw new Error("Invalid code point");if((e-=4)<0)break;o.push(r>>18|240,r>>12&63|128,r>>6&63|128,63&r|128)}}return o}function Z(t){return n.toByteArray(function(t){if((t=function(t){return t.trim?t.trim():t.replace(/^\s+|\s+$/g,"")}(t).replace(F,"")).length<2)return"";for(;t.length%4!=0;)t+="=";return t}(t))}function W(t,e,r,n){for(var i=0;i=e.length||i>=t.length);++i)e[i+r]=t[i];return i}}).call(this,r(8))},function(t,e,r){"use strict";(function(t){if(e.base64=!0,e.array=!0,e.string=!0,e.arraybuffer="undefined"!=typeof ArrayBuffer&&"undefined"!=typeof Uint8Array,e.nodebuffer=void 0!==t,e.uint8array="undefined"!=typeof Uint8Array,"undefined"==typeof ArrayBuffer)e.blob=!1;else{var n=new ArrayBuffer(0);try{e.blob=0===new Blob([n],{type:"application/zip"}).size}catch(t){try{var i=new(self.BlobBuilder||self.WebKitBlobBuilder||self.MozBlobBuilder||self.MSBlobBuilder);i.append(n),e.blob=0===i.getBlob("application/zip").size}catch(t){e.blob=!1}}}try{e.nodestream=!!r(25).Readable}catch(t){e.nodestream=!1}}).call(this,r(2).Buffer)},function(t,e,r){"use strict";var n="undefined"!=typeof Uint8Array&&"undefined"!=typeof Uint16Array&&"undefined"!=typeof Int32Array;function i(t,e){return Object.prototype.hasOwnProperty.call(t,e)}e.assign=function(t){for(var e=Array.prototype.slice.call(arguments,1);e.length;){var r=e.shift();if(r){if("object"!=typeof r)throw new TypeError(r+"must be non-object");for(var n in r)i(r,n)&&(t[n]=r[n])}}return t},e.shrinkBuf=function(t,e){return t.length===e?t:t.subarray?t.subarray(0,e):(t.length=e,t)};var o={arraySet:function(t,e,r,n,i){if(e.subarray&&t.subarray)t.set(e.subarray(r,r+n),i);else for(var o=0;o=252?6:u>=248?5:u>=240?4:u>=224?3:u>=192?2:1;a[254]=a[254]=1;function h(){s.call(this,"utf-8 decode"),this.leftOver=null}function f(){s.call(this,"utf-8 encode")}e.utf8encode=function(t){return i.nodebuffer?o.newBufferFrom(t,"utf-8"):function(t){var e,r,n,o,s,a=t.length,u=0;for(o=0;o>>6,e[s++]=128|63&r):r<65536?(e[s++]=224|r>>>12,e[s++]=128|r>>>6&63,e[s++]=128|63&r):(e[s++]=240|r>>>18,e[s++]=128|r>>>12&63,e[s++]=128|r>>>6&63,e[s++]=128|63&r);return e}(t)},e.utf8decode=function(t){return i.nodebuffer?n.transformTo("nodebuffer",t).toString("utf-8"):function(t){var e,r,i,o,s=t.length,u=new Array(2*s);for(r=0,e=0;e4)u[r++]=65533,e+=o-1;else{for(i&=2===o?31:3===o?15:7;o>1&&e1?u[r++]=65533:i<65536?u[r++]=i:(i-=65536,u[r++]=55296|i>>10&1023,u[r++]=56320|1023&i)}return u.length!==r&&(u.subarray?u=u.subarray(0,r):u.length=r),n.applyFromCharCode(u)}(t=n.transformTo(i.uint8array?"uint8array":"array",t))},n.inherits(h,s),h.prototype.processChunk=function(t){var r=n.transformTo(i.uint8array?"uint8array":"array",t.data);if(this.leftOver&&this.leftOver.length){if(i.uint8array){var o=r;(r=new Uint8Array(o.length+this.leftOver.length)).set(this.leftOver,0),r.set(o,this.leftOver.length)}else r=this.leftOver.concat(r);this.leftOver=null}var s=function(t,e){var r;for((e=e||t.length)>t.length&&(e=t.length),r=e-1;r>=0&&128==(192&t[r]);)r--;return r<0?e:0===r?e:r+a[t[r]]>e?r:e}(r),u=r;s!==r.length&&(i.uint8array?(u=r.subarray(0,s),this.leftOver=r.subarray(s,r.length)):(u=r.slice(0,s),this.leftOver=r.slice(s,r.length))),this.push({data:e.utf8decode(u),meta:t.meta})},h.prototype.flush=function(){this.leftOver&&this.leftOver.length&&(this.push({data:e.utf8decode(this.leftOver),meta:{}}),this.leftOver=null)},e.Utf8DecodeWorker=h,n.inherits(f,s),f.prototype.processChunk=function(t){this.push({data:e.utf8encode(t.data),meta:t.meta})},e.Utf8EncodeWorker=f},function(t,e){"function"==typeof Object.create?t.exports=function(t,e){e&&(t.super_=e,t.prototype=Object.create(e.prototype,{constructor:{value:t,enumerable:!1,writable:!0,configurable:!0}}))}:t.exports=function(t,e){if(e){t.super_=e;var r=function(){};r.prototype=e.prototype,t.prototype=new r,t.prototype.constructor=t}}},function(t,e){var r;r=function(){return this}();try{r=r||new Function("return this")()}catch(t){"object"==typeof window&&(r=window)}t.exports=r},function(t,e,r){(function(t){function r(t){return Object.prototype.toString.call(t)}e.isArray=function(t){return Array.isArray?Array.isArray(t):"[object Array]"===r(t)},e.isBoolean=function(t){return"boolean"==typeof t},e.isNull=function(t){return null===t},e.isNullOrUndefined=function(t){return null==t},e.isNumber=function(t){return"number"==typeof t},e.isString=function(t){return"string"==typeof t},e.isSymbol=function(t){return"symbol"==typeof t},e.isUndefined=function(t){return void 0===t},e.isRegExp=function(t){return"[object RegExp]"===r(t)},e.isObject=function(t){return"object"==typeof t&&null!==t},e.isDate=function(t){return"[object Date]"===r(t)},e.isError=function(t){return"[object Error]"===r(t)||t instanceof Error},e.isFunction=function(t){return"function"==typeof t},e.isPrimitive=function(t){return null===t||"boolean"==typeof t||"number"==typeof t||"string"==typeof t||"symbol"==typeof t||void 0===t},e.isBuffer=t.isBuffer}).call(this,r(2).Buffer)},function(t,e,r){"use strict";var n=null;n="undefined"!=typeof Promise?Promise:r(79),t.exports={Promise:n}},function(t,e,r){t.exports=i;var n=r(12).EventEmitter;function i(){n.call(this)}r(7)(i,n),i.Readable=r(55),i.Writable=r(61),i.Duplex=r(62),i.Transform=r(63),i.PassThrough=r(64),i.Stream=i,i.prototype.pipe=function(t,e){var r=this;function i(e){t.writable&&!1===t.write(e)&&r.pause&&r.pause()}function o(){r.readable&&r.resume&&r.resume()}r.on("data",i),t.on("drain",o),t._isStdio||e&&!1===e.end||(r.on("end",a),r.on("close",u));var s=!1;function a(){s||(s=!0,t.end())}function u(){s||(s=!0,"function"==typeof t.destroy&&t.destroy())}function h(t){if(f(),0===n.listenerCount(this,"error"))throw t}function f(){r.removeListener("data",i),t.removeListener("drain",o),r.removeListener("end",a),r.removeListener("close",u),r.removeListener("error",h),t.removeListener("error",h),r.removeListener("end",f),r.removeListener("close",f),t.removeListener("close",f)}return r.on("error",h),t.on("error",h),r.on("end",f),r.on("close",f),t.on("close",f),t.emit("pipe",r),t}},function(t,e,r){"use strict";var n,i="object"==typeof Reflect?Reflect:null,o=i&&"function"==typeof i.apply?i.apply:function(t,e,r){return Function.prototype.apply.call(t,e,r)};n=i&&"function"==typeof i.ownKeys?i.ownKeys:Object.getOwnPropertySymbols?function(t){return Object.getOwnPropertyNames(t).concat(Object.getOwnPropertySymbols(t))}:function(t){return Object.getOwnPropertyNames(t)};var s=Number.isNaN||function(t){return t!=t};function a(){a.init.call(this)}t.exports=a,a.EventEmitter=a,a.prototype._events=void 0,a.prototype._eventsCount=0,a.prototype._maxListeners=void 0;var u=10;function h(t){return void 0===t._maxListeners?a.defaultMaxListeners:t._maxListeners}function f(t,e,r,n){var i,o,s,a;if("function"!=typeof r)throw new TypeError('The "listener" argument must be of type Function. Received type '+typeof r);if(void 0===(o=t._events)?(o=t._events=Object.create(null),t._eventsCount=0):(void 0!==o.newListener&&(t.emit("newListener",e,r.listener?r.listener:r),o=t._events),s=o[e]),void 0===s)s=o[e]=r,++t._eventsCount;else if("function"==typeof s?s=o[e]=n?[r,s]:[s,r]:n?s.unshift(r):s.push(r),(i=h(t))>0&&s.length>i&&!s.warned){s.warned=!0;var u=new Error("Possible EventEmitter memory leak detected. "+s.length+" "+String(e)+" listeners added. Use emitter.setMaxListeners() to increase limit");u.name="MaxListenersExceededWarning",u.emitter=t,u.type=e,u.count=s.length,a=u,console&&console.warn&&console.warn(a)}return t}function l(){for(var t=[],e=0;e0&&(s=e[0]),s instanceof Error)throw s;var a=new Error("Unhandled error."+(s?" ("+s.message+")":""));throw a.context=s,a}var u=i[t];if(void 0===u)return!1;if("function"==typeof u)o(u,this,e);else{var h=u.length,f=g(u,h);for(r=0;r=0;o--)if(r[o]===e||r[o].listener===e){s=r[o].listener,i=o;break}if(i<0)return this;0===i?r.shift():function(t,e){for(;e+1=0;n--)this.removeListener(t,e[n]);return this},a.prototype.listeners=function(t){return d(this,t,!0)},a.prototype.rawListeners=function(t){return d(this,t,!1)},a.listenerCount=function(t,e){return"function"==typeof t.listenerCount?t.listenerCount(e):p.call(t,e)},a.prototype.listenerCount=p,a.prototype.eventNames=function(){return this._eventsCount>0?n(this._events):[]}},function(t,e){var r,n,i=t.exports={};function o(){throw new Error("setTimeout has not been defined")}function s(){throw new Error("clearTimeout has not been defined")}function a(t){if(r===setTimeout)return setTimeout(t,0);if((r===o||!r)&&setTimeout)return r=setTimeout,setTimeout(t,0);try{return r(t,0)}catch(e){try{return r.call(null,t,0)}catch(e){return r.call(this,t,0)}}}!function(){try{r="function"==typeof setTimeout?setTimeout:o}catch(t){r=o}try{n="function"==typeof clearTimeout?clearTimeout:s}catch(t){n=s}}();var u,h=[],f=!1,l=-1;function c(){f&&u&&(f=!1,u.length?h=u.concat(h):l=-1,h.length&&d())}function d(){if(!f){var t=a(c);f=!0;for(var e=h.length;e;){for(u=h,h=[];++l1)for(var r=1;r-1?n:i,s=r(2).Buffer;p.WritableState=d;var a=r(9);a.inherits=r(7);var u,h={deprecate:r(59)};!function(){try{u=r(11)}catch(t){}finally{u||(u=r(12).EventEmitter)}}();var f;s=r(2).Buffer;function l(){}function c(t,e,r){this.chunk=t,this.encoding=e,this.callback=r,this.next=null}function d(t,e){f=f||r(5),t=t||{},this.objectMode=!!t.objectMode,e instanceof f&&(this.objectMode=this.objectMode||!!t.writableObjectMode);var n=t.highWaterMark,s=this.objectMode?16:16384;this.highWaterMark=n||0===n?n:s,this.highWaterMark=~~this.highWaterMark,this.needDrain=!1,this.ending=!1,this.ended=!1,this.finished=!1;var a=!1===t.decodeStrings;this.decodeStrings=!a,this.defaultEncoding=t.defaultEncoding||"utf8",this.length=0,this.writing=!1,this.corked=0,this.sync=!0,this.bufferProcessing=!1,this.onwrite=function(t){!function(t,e){var r=t._writableState,n=r.sync,s=r.writecb;if(function(t){t.writing=!1,t.writecb=null,t.length-=t.writelen,t.writelen=0}(r),e)!function(t,e,r,n,o){--e.pendingcb,r?i(o,n):o(n);t._writableState.errorEmitted=!0,t.emit("error",n)}(t,r,n,e,s);else{var a=v(r);a||r.corked||r.bufferProcessing||!r.bufferedRequest||_(t,r),n?o(m,t,r,a,s):m(t,r,a,s)}}(e,t)},this.writecb=null,this.writelen=0,this.bufferedRequest=null,this.lastBufferedRequest=null,this.pendingcb=0,this.prefinished=!1,this.errorEmitted=!1,this.bufferedRequestCount=0,this.corkedRequestsFree=new b(this),this.corkedRequestsFree.next=new b(this)}function p(t){if(f=f||r(5),!(this instanceof p||this instanceof f))return new p(t);this._writableState=new d(t,this),this.writable=!0,t&&("function"==typeof t.write&&(this._write=t.write),"function"==typeof t.writev&&(this._writev=t.writev)),u.call(this)}function g(t,e,r,n,i,o,s){e.writelen=n,e.writecb=s,e.writing=!0,e.sync=!0,r?t._writev(i,e.onwrite):t._write(i,o,e.onwrite),e.sync=!1}function m(t,e,r,n){r||function(t,e){0===e.length&&e.needDrain&&(e.needDrain=!1,t.emit("drain"))}(t,e),e.pendingcb--,n(),w(t,e)}function _(t,e){e.bufferProcessing=!0;var r=e.bufferedRequest;if(t._writev&&r&&r.next){var n=e.bufferedRequestCount,i=new Array(n),o=e.corkedRequestsFree;o.entry=r;for(var s=0;r;)i[s]=r,r=r.next,s+=1;g(t,e,!0,e.length,i,"",o.finish),e.pendingcb++,e.lastBufferedRequest=null,e.corkedRequestsFree=o.next,o.next=null}else{for(;r;){var a=r.chunk,u=r.encoding,h=r.callback;if(g(t,e,!1,e.objectMode?1:a.length,a,u,h),r=r.next,e.writing)break}null===r&&(e.lastBufferedRequest=null)}e.bufferedRequestCount=0,e.bufferedRequest=r,e.bufferProcessing=!1}function v(t){return t.ending&&0===t.length&&null===t.bufferedRequest&&!t.finished&&!t.writing}function y(t,e){e.prefinished||(e.prefinished=!0,t.emit("prefinish"))}function w(t,e){var r=v(e);return r&&(0===e.pendingcb?(y(t,e),e.finished=!0,t.emit("finish")):y(t,e)),r}function b(t){var e=this;this.next=null,this.entry=null,this.finish=function(r){var n=e.entry;for(e.entry=null;n;){var i=n.callback;t.pendingcb--,i(r),n=n.next}t.corkedRequestsFree?t.corkedRequestsFree.next=e:t.corkedRequestsFree=e}}a.inherits(p,u),d.prototype.getBuffer=function(){for(var t=this.bufferedRequest,e=[];t;)e.push(t),t=t.next;return e},function(){try{Object.defineProperty(d.prototype,"buffer",{get:h.deprecate((function(){return this.getBuffer()}),"_writableState.buffer is deprecated. Use _writableState.getBuffer instead.")})}catch(t){}}(),p.prototype.pipe=function(){this.emit("error",new Error("Cannot pipe. Not readable."))},p.prototype.write=function(t,e,r){var n=this._writableState,o=!1;return"function"==typeof e&&(r=e,e=null),s.isBuffer(t)?e="buffer":e||(e=n.defaultEncoding),"function"!=typeof r&&(r=l),n.ended?function(t,e){var r=new Error("write after end");t.emit("error",r),i(e,r)}(this,r):function(t,e,r,n){var o=!0;if(!s.isBuffer(r)&&"string"!=typeof r&&null!=r&&!e.objectMode){var a=new TypeError("Invalid non-string/buffer chunk");t.emit("error",a),i(n,a),o=!1}return o}(this,n,t,r)&&(n.pendingcb++,o=function(t,e,r,n,i){r=function(t,e,r){t.objectMode||!1===t.decodeStrings||"string"!=typeof e||(e=new s(e,r));return e}(e,r,n),s.isBuffer(r)&&(n="buffer");var o=e.objectMode?1:r.length;e.length+=o;var a=e.length-1))throw new TypeError("Unknown encoding: "+t);this._writableState.defaultEncoding=t},p.prototype._write=function(t,e,r){r(new Error("not implemented"))},p.prototype._writev=null,p.prototype.end=function(t,e,r){var n=this._writableState;"function"==typeof t?(r=t,t=null,e=null):"function"==typeof e&&(r=e,e=null),null!=t&&this.write(t,e),n.corked&&(n.corked=1,this.uncork()),n.ending||n.finished||function(t,e,r){e.ending=!0,w(t,e),r&&(e.finished?i(r):t.once("finish",r));e.ended=!0,t.writable=!1}(this,n,r)}}).call(this,r(13),r(57).setImmediate)},function(t,e,r){"use strict";t.exports=s;var n=r(5),i=r(9);function o(t){this.afterTransform=function(e,r){return function(t,e,r){var n=t._transformState;n.transforming=!1;var i=n.writecb;if(!i)return t.emit("error",new Error("no writecb in Transform class"));n.writechunk=null,n.writecb=null,null!=r&&t.push(r);i(e);var o=t._readableState;o.reading=!1,(o.needReadable||o.length>>1:t>>>1;e[r]=t}return e}();t.exports=function(t,e){return void 0!==t&&t.length?"string"!==n.getTypeOf(t)?function(t,e,r,n){var o=i,s=n+r;t^=-1;for(var a=n;a>>8^o[255&(t^e[a])];return-1^t}(0|e,t,t.length,0):function(t,e,r,n){var o=i,s=n+r;t^=-1;for(var a=n;a>>8^o[255&(t^e.charCodeAt(a))];return-1^t}(0|e,t,t.length,0):0}},function(t,e,r){"use strict";t.exports={2:"need dictionary",1:"stream end",0:"","-1":"file error","-2":"stream error","-3":"data error","-4":"insufficient memory","-5":"buffer error","-6":"incompatible version"}},function(t,e){var r={}.toString;t.exports=Array.isArray||function(t){return"[object Array]"==r.call(t)}},function(t,e,r){t.exports=r(11)},function(t,e,r){"use strict";(function(e){t.exports=p;var n=r(16),i=r(24),o=r(2).Buffer;p.ReadableState=d;r(12);var s,a=function(t,e){return t.listeners(e).length};!function(){try{s=r(11)}catch(t){}finally{s||(s=r(12).EventEmitter)}}();o=r(2).Buffer;var u=r(9);u.inherits=r(7);var h,f,l=r(56),c=void 0;function d(t,e){f=f||r(5),t=t||{},this.objectMode=!!t.objectMode,e instanceof f&&(this.objectMode=this.objectMode||!!t.readableObjectMode);var n=t.highWaterMark,i=this.objectMode?16:16384;this.highWaterMark=n||0===n?n:i,this.highWaterMark=~~this.highWaterMark,this.buffer=[],this.length=0,this.pipes=null,this.pipesCount=0,this.flowing=null,this.ended=!1,this.endEmitted=!1,this.reading=!1,this.sync=!0,this.needReadable=!1,this.emittedReadable=!1,this.readableListening=!1,this.resumeScheduled=!1,this.defaultEncoding=t.defaultEncoding||"utf8",this.ranOut=!1,this.awaitDrain=0,this.readingMore=!1,this.decoder=null,this.encoding=null,t.encoding&&(h||(h=r(27).StringDecoder),this.decoder=new h(t.encoding),this.encoding=t.encoding)}function p(t){if(f=f||r(5),!(this instanceof p))return new p(t);this._readableState=new d(t,this),this.readable=!0,t&&"function"==typeof t.read&&(this._read=t.read),s.call(this)}function g(t,e,r,i,s){var a=function(t,e){var r=null;o.isBuffer(e)||"string"==typeof e||null==e||t.objectMode||(r=new TypeError("Invalid non-string/buffer chunk"));return r}(e,r);if(a)t.emit("error",a);else if(null===r)e.reading=!1,function(t,e){if(e.ended)return;if(e.decoder){var r=e.decoder.end();r&&r.length&&(e.buffer.push(r),e.length+=e.objectMode?1:r.length)}e.ended=!0,v(t)}(t,e);else if(e.objectMode||r&&r.length>0)if(e.ended&&!s){var u=new Error("stream.push() after EOF");t.emit("error",u)}else if(e.endEmitted&&s){u=new Error("stream.unshift() after end event");t.emit("error",u)}else{var h;!e.decoder||s||i||(r=e.decoder.write(r),h=!e.objectMode&&0===r.length),s||(e.reading=!1),h||(e.flowing&&0===e.length&&!e.sync?(t.emit("data",r),t.read(0)):(e.length+=e.objectMode?1:r.length,s?e.buffer.unshift(r):e.buffer.push(r),e.needReadable&&v(t))),function(t,e){e.readingMore||(e.readingMore=!0,n(w,t,e))}(t,e)}else s||(e.reading=!1);return function(t){return!t.ended&&(t.needReadable||t.lengthe.highWaterMark&&(e.highWaterMark=function(t){return t>=m?t=m:(t--,t|=t>>>1,t|=t>>>2,t|=t>>>4,t|=t>>>8,t|=t>>>16,t++),t}(t)),t>e.length?e.ended?e.length:(e.needReadable=!0,0):t)}function v(t){var e=t._readableState;e.needReadable=!1,e.emittedReadable||(c("emitReadable",e.flowing),e.emittedReadable=!0,e.sync?n(y,t):y(t))}function y(t){c("emit readable"),t.emit("readable"),x(t)}function w(t,e){for(var r=e.length;!e.reading&&!e.flowing&&!e.ended&&e.length=i)r=s?n.join(""):1===n.length?n[0]:o.concat(n,i),n.length=0;else{if(t0)throw new Error("endReadable called on non-empty stream");e.endEmitted||(e.ended=!0,n(A,e,t))}function A(t,e){t.endEmitted||0!==t.length||(t.endEmitted=!0,e.readable=!1,e.emit("end"))}p.prototype.read=function(t){c("read",t);var e=this._readableState,r=t;if(("number"!=typeof t||t>0)&&(e.emittedReadable=!1),0===t&&e.needReadable&&(e.length>=e.highWaterMark||e.ended))return c("read: emitReadable",e.length,e.ended),0===e.length&&e.ended?S(this):v(this),null;if(0===(t=_(t,e))&&e.ended)return 0===e.length&&S(this),null;var n,i=e.needReadable;return c("need readable",i),(0===e.length||e.length-t0?E(t,e):null)&&(e.needReadable=!0,t=0),e.length-=t,0!==e.length||e.ended||(e.needReadable=!0),r!==t&&e.ended&&0===e.length&&S(this),null!==n&&this.emit("data",n),n},p.prototype._read=function(t){this.emit("error",new Error("not implemented"))},p.prototype.pipe=function(t,r){var o=this,s=this._readableState;switch(s.pipesCount){case 0:s.pipes=t;break;case 1:s.pipes=[s.pipes,t];break;default:s.pipes.push(t)}s.pipesCount+=1,c("pipe count=%d opts=%j",s.pipesCount,r);var u=(!r||!1!==r.end)&&t!==e.stdout&&t!==e.stderr?f:p;function h(t){c("onunpipe"),t===o&&p()}function f(){c("onend"),t.end()}s.endEmitted?n(u):o.once("end",u),t.on("unpipe",h);var l=function(t){return function(){var e=t._readableState;c("pipeOnDrain",e.awaitDrain),e.awaitDrain&&e.awaitDrain--,0===e.awaitDrain&&a(t,"data")&&(e.flowing=!0,x(t))}}(o);t.on("drain",l);var d=!1;function p(){c("cleanup"),t.removeListener("close",_),t.removeListener("finish",v),t.removeListener("drain",l),t.removeListener("error",m),t.removeListener("unpipe",h),o.removeListener("end",f),o.removeListener("end",p),o.removeListener("data",g),d=!0,!s.awaitDrain||t._writableState&&!t._writableState.needDrain||l()}function g(e){c("ondata"),!1===t.write(e)&&(1!==s.pipesCount||s.pipes[0]!==t||1!==o.listenerCount("data")||d||(c("false write response, pause",o._readableState.awaitDrain),o._readableState.awaitDrain++),o.pause())}function m(e){c("onerror",e),y(),t.removeListener("error",m),0===a(t,"error")&&t.emit("error",e)}function _(){t.removeListener("finish",v),y()}function v(){c("onfinish"),t.removeListener("close",_),y()}function y(){c("unpipe"),o.unpipe(t)}return o.on("data",g),t._events&&t._events.error?i(t._events.error)?t._events.error.unshift(m):t._events.error=[m,t._events.error]:t.on("error",m),t.once("close",_),t.once("finish",v),t.emit("pipe",o),s.flowing||(c("pipe resume"),o.resume()),t},p.prototype.unpipe=function(t){var e=this._readableState;if(0===e.pipesCount)return this;if(1===e.pipesCount)return t&&t!==e.pipes?this:(t||(t=e.pipes),e.pipes=null,e.pipesCount=0,e.flowing=!1,t&&t.emit("unpipe",this),this);if(!t){var r=e.pipes,n=e.pipesCount;e.pipes=null,e.pipesCount=0,e.flowing=!1;for(var i=0;i>5==6?2:t>>4==14?3:t>>3==30?4:t>>6==2?-1:-2}function a(t){var e=this.lastTotal-this.lastNeed,r=function(t,e,r){if(128!=(192&e[0]))return t.lastNeed=0,"�";if(t.lastNeed>1&&e.length>1){if(128!=(192&e[1]))return t.lastNeed=1,"�";if(t.lastNeed>2&&e.length>2&&128!=(192&e[2]))return t.lastNeed=2,"�"}}(this,t);return void 0!==r?r:this.lastNeed<=t.length?(t.copy(this.lastChar,e,0,this.lastNeed),this.lastChar.toString(this.encoding,0,this.lastTotal)):(t.copy(this.lastChar,e,0,t.length),void(this.lastNeed-=t.length))}function u(t,e){if((t.length-e)%2==0){var r=t.toString("utf16le",e);if(r){var n=r.charCodeAt(r.length-1);if(n>=55296&&n<=56319)return this.lastNeed=2,this.lastTotal=4,this.lastChar[0]=t[t.length-2],this.lastChar[1]=t[t.length-1],r.slice(0,-1)}return r}return this.lastNeed=1,this.lastTotal=2,this.lastChar[0]=t[t.length-1],t.toString("utf16le",e,t.length-1)}function h(t){var e=t&&t.length?this.write(t):"";if(this.lastNeed){var r=this.lastTotal-this.lastNeed;return e+this.lastChar.toString("utf16le",0,r)}return e}function f(t,e){var r=(t.length-e)%3;return 0===r?t.toString("base64",e):(this.lastNeed=3-r,this.lastTotal=3,1===r?this.lastChar[0]=t[t.length-1]:(this.lastChar[0]=t[t.length-2],this.lastChar[1]=t[t.length-1]),t.toString("base64",e,t.length-r))}function l(t){var e=t&&t.length?this.write(t):"";return this.lastNeed?e+this.lastChar.toString("base64",0,3-this.lastNeed):e}function c(t){return t.toString(this.encoding)}function d(t){return t&&t.length?this.write(t):""}e.StringDecoder=o,o.prototype.write=function(t){if(0===t.length)return"";var e,r;if(this.lastNeed){if(void 0===(e=this.fillLast(t)))return"";r=this.lastNeed,this.lastNeed=0}else r=0;return r=0)return i>0&&(t.lastNeed=i-1),i;if(--n=0)return i>0&&(t.lastNeed=i-2),i;if(--n=0)return i>0&&(2===i?i=0:t.lastNeed=i-3),i;return 0}(this,t,e);if(!this.lastNeed)return t.toString("utf8",e);this.lastTotal=r;var n=t.length-(r-this.lastNeed);return t.copy(this.lastChar,0,n),t.toString("utf8",e,n)},o.prototype.fillLast=function(t){if(this.lastNeed<=t.length)return t.copy(this.lastChar,this.lastTotal-this.lastNeed,0,this.lastNeed),this.lastChar.toString(this.encoding,0,this.lastTotal);t.copy(this.lastChar,this.lastTotal-this.lastNeed,0,t.length),this.lastNeed-=t.length}},function(t,e,r){"use strict";t.exports=o;var n=r(18),i=r(9);function o(t){if(!(this instanceof o))return new o(t);n.call(this,t)}i.inherits=r(7),i.inherits(o,n),o.prototype._transform=function(t,e,r){r(null,t)}},function(t,e,r){"use strict";var n=r(0),i=r(3),o="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=";e.encode=function(t){for(var e,r,i,s,a,u,h,f=[],l=0,c=t.length,d=c,p="string"!==n.getTypeOf(t);l>2,a=(3&e)<<4|r>>4,u=d>1?(15&r)<<2|i>>6:64,h=d>2?63&i:64,f.push(o.charAt(s)+o.charAt(a)+o.charAt(u)+o.charAt(h));return f.join("")},e.decode=function(t){var e,r,n,s,a,u,h=0,f=0;if("data:"===t.substr(0,"data:".length))throw new Error("Invalid base64 input, it looks like a data url.");var l,c=3*(t=t.replace(/[^A-Za-z0-9\+\/\=]/g,"")).length/4;if(t.charAt(t.length-1)===o.charAt(64)&&c--,t.charAt(t.length-2)===o.charAt(64)&&c--,c%1!=0)throw new Error("Invalid base64 input, bad content length.");for(l=i.uint8array?new Uint8Array(0|c):new Array(0|c);h>4,r=(15&s)<<4|(a=o.indexOf(t.charAt(h++)))>>2,n=(3&a)<<6|(u=o.indexOf(t.charAt(h++))),l[f++]=e,64!==a&&(l[f++]=r),64!==u&&(l[f++]=n);return l}},function(t,e){var r=t.exports={version:"2.3.0"};"number"==typeof __e&&(__e=r)},function(t,e,r){var n=r(68);t.exports=function(t,e,r){if(n(t),void 0===e)return t;switch(r){case 1:return function(r){return t.call(e,r)};case 2:return function(r,n){return t.call(e,r,n)};case 3:return function(r,n,i){return t.call(e,r,n,i)}}return function(){return t.apply(e,arguments)}}},function(t,e){t.exports=function(t){try{return!!t()}catch(t){return!0}}},function(t,e,r){var n=r(19),i=r(15).document,o=n(i)&&n(i.createElement);t.exports=function(t){return o?i.createElement(t):{}}},function(t,e,r){"use strict";(function(e){var n=r(0),i=r(81),o=r(1),s=r(29),a=r(3),u=r(10),h=null;if(a.nodestream)try{h=r(82)}catch(t){}function f(t,r){return new u.Promise((function(i,o){var a=[],u=t._internalType,h=t._outputType,f=t._mimeType;t.on("data",(function(t,e){a.push(t),r&&r(e)})).on("error",(function(t){a=[],o(t)})).on("end",(function(){try{var t=function(t,e,r){switch(t){case"blob":return n.newBlob(n.transformTo("arraybuffer",e),r);case"base64":return s.encode(e);default:return n.transformTo(t,e)}}(h,function(t,r){var n,i=0,o=null,s=0;for(n=0;n=this.max)return this.end();switch(this.type){case"string":t=this.data.substring(this.index,e);break;case"uint8array":t=this.data.subarray(this.index,e);break;case"array":case"nodebuffer":t=this.data.slice(this.index,e)}return this.index=e,this.push({data:t,meta:{percent:this.max?this.index/this.max*100:0}})},t.exports=o},function(t,e,r){"use strict";var n=r(0),i=r(1);function o(t){i.call(this,"DataLengthProbe for "+t),this.propName=t,this.withStreamInfo(t,0)}n.inherits(o,i),o.prototype.processChunk=function(t){if(t){var e=this.streamInfo[this.propName]||0;this.streamInfo[this.propName]=e+t.data.length}i.prototype.processChunk.call(this,t)},t.exports=o},function(t,e,r){"use strict";var n=r(1),i=r(22);function o(){n.call(this,"Crc32Probe"),this.withStreamInfo("crc32",0)}r(0).inherits(o,n),o.prototype.processChunk=function(t){this.streamInfo.crc32=i(t.data,this.streamInfo.crc32||0),this.push(t)},t.exports=o},function(t,e,r){"use strict";var n=r(1);e.STORE={magic:"\0\0",compressWorker:function(t){return new n("STORE compression")},uncompressWorker:function(){return new n("STORE decompression")}},e.DEFLATE=r(85)},function(t,e,r){"use strict";t.exports=function(t,e,r,n){for(var i=65535&t|0,o=t>>>16&65535|0,s=0;0!==r;){r-=s=r>2e3?2e3:r;do{o=o+(i=i+e[n++]|0)|0}while(--s);i%=65521,o%=65521}return i|o<<16|0}},function(t,e,r){"use strict";var n=function(){for(var t,e=[],r=0;r<256;r++){t=r;for(var n=0;n<8;n++)t=1&t?3988292384^t>>>1:t>>>1;e[r]=t}return e}();t.exports=function(t,e,r,i){var o=n,s=i+r;t^=-1;for(var a=i;a>>8^o[255&(t^e[a])];return-1^t}},function(t,e,r){"use strict";var n=r(4),i=!0,o=!0;try{String.fromCharCode.apply(null,[0])}catch(t){i=!1}try{String.fromCharCode.apply(null,new Uint8Array(1))}catch(t){o=!1}for(var s=new n.Buf8(256),a=0;a<256;a++)s[a]=a>=252?6:a>=248?5:a>=240?4:a>=224?3:a>=192?2:1;function u(t,e){if(e<65534&&(t.subarray&&o||!t.subarray&&i))return String.fromCharCode.apply(null,n.shrinkBuf(t,e));for(var r="",s=0;s>>6,e[s++]=128|63&r):r<65536?(e[s++]=224|r>>>12,e[s++]=128|r>>>6&63,e[s++]=128|63&r):(e[s++]=240|r>>>18,e[s++]=128|r>>>12&63,e[s++]=128|r>>>6&63,e[s++]=128|63&r);return e},e.buf2binstring=function(t){return u(t,t.length)},e.binstring2buf=function(t){for(var e=new n.Buf8(t.length),r=0,i=e.length;r4)h[n++]=65533,r+=o-1;else{for(i&=2===o?31:3===o?15:7;o>1&&r1?h[n++]=65533:i<65536?h[n++]=i:(i-=65536,h[n++]=55296|i>>10&1023,h[n++]=56320|1023&i)}return u(h,n)},e.utf8border=function(t,e){var r;for((e=e||t.length)>t.length&&(e=t.length),r=e-1;r>=0&&128==(192&t[r]);)r--;return r<0?e:0===r?e:r+s[t[r]]>e?r:e}},function(t,e,r){"use strict";t.exports=function(){this.input=null,this.next_in=0,this.avail_in=0,this.total_in=0,this.output=null,this.next_out=0,this.avail_out=0,this.total_out=0,this.msg="",this.state=null,this.data_type=2,this.adler=0}},function(t,e,r){"use strict";t.exports={Z_NO_FLUSH:0,Z_PARTIAL_FLUSH:1,Z_SYNC_FLUSH:2,Z_FULL_FLUSH:3,Z_FINISH:4,Z_BLOCK:5,Z_TREES:6,Z_OK:0,Z_STREAM_END:1,Z_NEED_DICT:2,Z_ERRNO:-1,Z_STREAM_ERROR:-2,Z_DATA_ERROR:-3,Z_BUF_ERROR:-5,Z_NO_COMPRESSION:0,Z_BEST_SPEED:1,Z_BEST_COMPRESSION:9,Z_DEFAULT_COMPRESSION:-1,Z_FILTERED:1,Z_HUFFMAN_ONLY:2,Z_RLE:3,Z_FIXED:4,Z_DEFAULT_STRATEGY:0,Z_BINARY:0,Z_TEXT:1,Z_UNKNOWN:2,Z_DEFLATED:8}},function(t,e,r){"use strict";e.LOCAL_FILE_HEADER="PK",e.CENTRAL_FILE_HEADER="PK",e.CENTRAL_DIRECTORY_END="PK",e.ZIP64_CENTRAL_DIRECTORY_LOCATOR="PK",e.ZIP64_CENTRAL_DIRECTORY_END="PK",e.DATA_DESCRIPTOR="PK\b"},function(t,e,r){"use strict";var n=r(0),i=r(3),o=r(47),s=r(99),a=r(100),u=r(49);t.exports=function(t){var e=n.getTypeOf(t);return n.checkSupport(e),"string"!==e||i.uint8array?"nodebuffer"===e?new a(t):i.uint8array?new u(n.transformTo("uint8array",t)):new o(n.transformTo("array",t)):new s(t)}},function(t,e,r){"use strict";var n=r(48);function i(t){n.call(this,t);for(var e=0;e=0;--o)if(this.data[o]===e&&this.data[o+1]===r&&this.data[o+2]===n&&this.data[o+3]===i)return o-this.zero;return-1},i.prototype.readAndCheckSignature=function(t){var e=t.charCodeAt(0),r=t.charCodeAt(1),n=t.charCodeAt(2),i=t.charCodeAt(3),o=this.readData(4);return e===o[0]&&r===o[1]&&n===o[2]&&i===o[3]},i.prototype.readData=function(t){if(this.checkOffset(t),0===t)return[];var e=this.data.slice(this.zero+this.index,this.zero+this.index+t);return this.index+=t,e},t.exports=i},function(t,e,r){"use strict";var n=r(0);function i(t){this.data=t,this.length=t.length,this.index=0,this.zero=0}i.prototype={checkOffset:function(t){this.checkIndex(this.index+t)},checkIndex:function(t){if(this.length=this.index;e--)r=(r<<8)+this.byteAt(e);return this.index+=t,r},readString:function(t){return n.transformTo("string",this.readData(t))},readData:function(t){},lastIndexOfSignature:function(t){},readAndCheckSignature:function(t){},readDate:function(){var t=this.readInt(4);return new Date(Date.UTC(1980+(t>>25&127),(t>>21&15)-1,t>>16&31,t>>11&31,t>>5&63,(31&t)<<1))}},t.exports=i},function(t,e,r){"use strict";var n=r(47);function i(t){n.call(this,t)}r(0).inherits(i,n),i.prototype.readData=function(t){if(this.checkOffset(t),0===t)return new Uint8Array(0);var e=this.data.subarray(this.zero+this.index,this.zero+this.index+t);return this.index+=t,e},t.exports=i},function(t,e,r){const n=r(51);self.onmessage=function(t){const e=new n,r=t.data.start,i=t.data.end,o=t.data.block;e.loadAsync(o).then(t=>{fileMapping={};let e=r;t.forEach(t=>{fileMapping[t]=e++}),e=r;let n=i;t.forEach(i=>{const o=e++;t.file(i).async("blob").then(t=>{const e=new FileReader;e.onload=function(t,s){postMessage({fileName:i,index:o,data:e.result,isEnd:n<=r}),--n0?t.substring(0,e):""},g=function(t){return"/"!==t.slice(-1)&&(t+="/"),t},m=function(t,e){return e=void 0!==e?e:a.createFolders,t=g(t),this.files[t]||d.call(this,t,null,{dir:!0,createFolders:e}),this.files[t]};function _(t){return"[object RegExp]"===Object.prototype.toString.call(t)}var v={load:function(){throw new Error("This method has been removed in JSZip 3.0, please check the upgrade guide.")},forEach:function(t){var e,r,n;for(e in this.files)this.files.hasOwnProperty(e)&&(n=this.files[e],(r=e.slice(this.root.length,e.length))&&e.slice(0,this.root.length)===this.root&&t(r,n))},filter:function(t){var e=[];return this.forEach((function(r,n){t(r,n)&&e.push(n)})),e},file:function(t,e,r){if(1===arguments.length){if(_(t)){var n=t;return this.filter((function(t,e){return!e.dir&&n.test(t)}))}var i=this.files[this.root+t];return i&&!i.dir?i:null}return(t=this.root+t,d.call(this,t,e,r),this)},folder:function(t){if(!t)return this;if(_(t))return this.filter((function(e,r){return r.dir&&t.test(e)}));var e=this.root+t,r=m.call(this,e),n=this.clone();return n.root=r.name,n},remove:function(t){t=this.root+t;var e=this.files[t];if(e||("/"!==t.slice(-1)&&(t+="/"),e=this.files[t]),e&&!e.dir)delete this.files[t];else for(var r=this.filter((function(e,r){return r.name.slice(0,t.length)===t})),n=0;n0?s-4:s;for(r=0;r>16&255,u[f++]=e>>8&255,u[f++]=255&e;2===a&&(e=i[t.charCodeAt(r)]<<2|i[t.charCodeAt(r+1)]>>4,u[f++]=255&e);1===a&&(e=i[t.charCodeAt(r)]<<10|i[t.charCodeAt(r+1)]<<4|i[t.charCodeAt(r+2)]>>2,u[f++]=e>>8&255,u[f++]=255&e);return u},e.fromByteArray=function(t){for(var e,r=t.length,i=r%3,o=[],s=0,a=r-i;sa?a:s+16383));1===i?(e=t[r-1],o.push(n[e>>2]+n[e<<4&63]+"==")):2===i&&(e=(t[r-2]<<8)+t[r-1],o.push(n[e>>10]+n[e>>4&63]+n[e<<2&63]+"="));return o.join("")};for(var n=[],i=[],o="undefined"!=typeof Uint8Array?Uint8Array:Array,s="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/",a=0,u=s.length;a0)throw new Error("Invalid string. Length must be a multiple of 4");var r=t.indexOf("=");return-1===r&&(r=e),[r,r===e?0:4-r%4]}function f(t,e,r){for(var i,o,s=[],a=e;a>18&63]+n[o>>12&63]+n[o>>6&63]+n[63&o]);return s.join("")}i["-".charCodeAt(0)]=62,i["_".charCodeAt(0)]=63},function(t,e){e.read=function(t,e,r,n,i){var o,s,a=8*i-n-1,u=(1<>1,f=-7,l=r?i-1:0,c=r?-1:1,d=t[e+l];for(l+=c,o=d&(1<<-f)-1,d>>=-f,f+=a;f>0;o=256*o+t[e+l],l+=c,f-=8);for(s=o&(1<<-f)-1,o>>=-f,f+=n;f>0;s=256*s+t[e+l],l+=c,f-=8);if(0===o)o=1-h;else{if(o===u)return s?NaN:1/0*(d?-1:1);s+=Math.pow(2,n),o-=h}return(d?-1:1)*s*Math.pow(2,o-n)},e.write=function(t,e,r,n,i,o){var s,a,u,h=8*o-i-1,f=(1<>1,c=23===i?Math.pow(2,-24)-Math.pow(2,-77):0,d=n?0:o-1,p=n?1:-1,g=e<0||0===e&&1/e<0?1:0;for(e=Math.abs(e),isNaN(e)||e===1/0?(a=isNaN(e)?1:0,s=f):(s=Math.floor(Math.log(e)/Math.LN2),e*(u=Math.pow(2,-s))<1&&(s--,u*=2),(e+=s+l>=1?c/u:c*Math.pow(2,1-l))*u>=2&&(s++,u/=2),s+l>=f?(a=0,s=f):s+l>=1?(a=(e*u-1)*Math.pow(2,i),s+=l):(a=e*Math.pow(2,l-1)*Math.pow(2,i),s=0));i>=8;t[r+d]=255&a,d+=p,a/=256,i-=8);for(s=s<0;t[r+d]=255&s,d+=p,s/=256,h-=8);t[r+d-p]|=128*g}},function(t,e,r){var n=function(){try{return r(11)}catch(t){}}();(e=t.exports=r(26)).Stream=n||e,e.Readable=e,e.Writable=r(17),e.Duplex=r(5),e.Transform=r(18),e.PassThrough=r(28)},function(t,e){},function(t,e,r){(function(t){var n=void 0!==t&&t||"undefined"!=typeof self&&self||window,i=Function.prototype.apply;function o(t,e){this._id=t,this._clearFn=e}e.setTimeout=function(){return new o(i.call(setTimeout,n,arguments),clearTimeout)},e.setInterval=function(){return new o(i.call(setInterval,n,arguments),clearInterval)},e.clearTimeout=e.clearInterval=function(t){t&&t.close()},o.prototype.unref=o.prototype.ref=function(){},o.prototype.close=function(){this._clearFn.call(n,this._id)},e.enroll=function(t,e){clearTimeout(t._idleTimeoutId),t._idleTimeout=e},e.unenroll=function(t){clearTimeout(t._idleTimeoutId),t._idleTimeout=-1},e._unrefActive=e.active=function(t){clearTimeout(t._idleTimeoutId);var e=t._idleTimeout;e>=0&&(t._idleTimeoutId=setTimeout((function(){t._onTimeout&&t._onTimeout()}),e))},r(58),e.setImmediate="undefined"!=typeof self&&self.setImmediate||void 0!==t&&t.setImmediate||this&&this.setImmediate,e.clearImmediate="undefined"!=typeof self&&self.clearImmediate||void 0!==t&&t.clearImmediate||this&&this.clearImmediate}).call(this,r(8))},function(t,e,r){(function(t,e){!function(t,r){"use strict";if(!t.setImmediate){var n,i,o,s,a,u=1,h={},f=!1,l=t.document,c=Object.getPrototypeOf&&Object.getPrototypeOf(t);c=c&&c.setTimeout?c:t,"[object process]"==={}.toString.call(t.process)?n=function(t){e.nextTick((function(){p(t)}))}:!function(){if(t.postMessage&&!t.importScripts){var e=!0,r=t.onmessage;return t.onmessage=function(){e=!1},t.postMessage("","*"),t.onmessage=r,e}}()?t.MessageChannel?((o=new MessageChannel).port1.onmessage=function(t){p(t.data)},n=function(t){o.port2.postMessage(t)}):l&&"onreadystatechange"in l.createElement("script")?(i=l.documentElement,n=function(t){var e=l.createElement("script");e.onreadystatechange=function(){p(t),e.onreadystatechange=null,i.removeChild(e),e=null},i.appendChild(e)}):n=function(t){setTimeout(p,0,t)}:(s="setImmediate$"+Math.random()+"$",a=function(e){e.source===t&&"string"==typeof e.data&&0===e.data.indexOf(s)&&p(+e.data.slice(s.length))},t.addEventListener?t.addEventListener("message",a,!1):t.attachEvent("onmessage",a),n=function(e){t.postMessage(s+e,"*")}),c.setImmediate=function(t){"function"!=typeof t&&(t=new Function(""+t));for(var e=new Array(arguments.length-1),r=0;rr;)e.push(arguments[r++]);return m[++g]=function(){a("function"==typeof t?t:Function(t),e)},n(g),g},d=function(t){delete m[t]},"process"==r(78)(l)?n=function(t){l.nextTick(s(_,t,1))}:p?(o=(i=new p).port2,i.port1.onmessage=v,n=s(o.postMessage,o,1)):f.addEventListener&&"function"==typeof postMessage&&!f.importScripts?(n=function(t){f.postMessage(t+"","*")},f.addEventListener("message",v,!1)):n="onreadystatechange"in h("script")?function(t){u.appendChild(h("script")).onreadystatechange=function(){u.removeChild(this),_.call(t)}}:function(t){setTimeout(s(_,t,1),0)}),t.exports={set:c,clear:d}},function(t,e){t.exports=function(t,e,r){var n=void 0===r;switch(e.length){case 0:return n?t():t.call(r);case 1:return n?t(e[0]):t.call(r,e[0]);case 2:return n?t(e[0],e[1]):t.call(r,e[0],e[1]);case 3:return n?t(e[0],e[1],e[2]):t.call(r,e[0],e[1],e[2]);case 4:return n?t(e[0],e[1],e[2],e[3]):t.call(r,e[0],e[1],e[2],e[3])}return t.apply(r,e)}},function(t,e,r){t.exports=r(15).document&&document.documentElement},function(t,e){var r={}.toString;t.exports=function(t){return r.call(t).slice(8,-1)}},function(t,e,r){"use strict";var n=r(80);function i(){}var o={},s=["REJECTED"],a=["FULFILLED"],u=["PENDING"];function h(t){if("function"!=typeof t)throw new TypeError("resolver must be a function");this.state=u,this.queue=[],this.outcome=void 0,t!==i&&d(this,t)}function f(t,e,r){this.promise=t,"function"==typeof e&&(this.onFulfilled=e,this.callFulfilled=this.otherCallFulfilled),"function"==typeof r&&(this.onRejected=r,this.callRejected=this.otherCallRejected)}function l(t,e,r){n((function(){var n;try{n=e(r)}catch(e){return o.reject(t,e)}n===t?o.reject(t,new TypeError("Cannot resolve promise with itself")):o.resolve(t,n)}))}function c(t){var e=t&&t.then;if(t&&("object"==typeof t||"function"==typeof t)&&"function"==typeof e)return function(){e.apply(t,arguments)}}function d(t,e){var r=!1;function n(e){r||(r=!0,o.reject(t,e))}function i(e){r||(r=!0,o.resolve(t,e))}var s=p((function(){e(i,n)}));"error"===s.status&&n(s.value)}function p(t,e){var r={};try{r.value=t(e),r.status="success"}catch(t){r.status="error",r.value=t}return r}t.exports=h,h.prototype.catch=function(t){return this.then(null,t)},h.prototype.then=function(t,e){if("function"!=typeof t&&this.state===a||"function"!=typeof e&&this.state===s)return this;var r=new this.constructor(i);this.state!==u?l(r,this.state===a?t:e,this.outcome):this.queue.push(new f(r,t,e));return r},f.prototype.callFulfilled=function(t){o.resolve(this.promise,t)},f.prototype.otherCallFulfilled=function(t){l(this.promise,this.onFulfilled,t)},f.prototype.callRejected=function(t){o.reject(this.promise,t)},f.prototype.otherCallRejected=function(t){l(this.promise,this.onRejected,t)},o.resolve=function(t,e){var r=p(c,e);if("error"===r.status)return o.reject(t,r.value);var n=r.value;if(n)d(t,n);else{t.state=a,t.outcome=e;for(var i=-1,s=t.queue.length;++i0?e.windowBits=-e.windowBits:e.gzip&&e.windowBits>0&&e.windowBits<16&&(e.windowBits+=16),this.err=0,this.msg="",this.ended=!1,this.chunks=[],this.strm=new a,this.strm.avail_out=0;var r=n.deflateInit2(this.strm,e.level,e.method,e.windowBits,e.memLevel,e.strategy);if(r!==h)throw new Error(s[r]);if(e.header&&n.deflateSetHeader(this.strm,e.header),e.dictionary){var p;if(p="string"==typeof e.dictionary?o.string2buf(e.dictionary):"[object ArrayBuffer]"===u.call(e.dictionary)?new Uint8Array(e.dictionary):e.dictionary,(r=n.deflateSetDictionary(this.strm,p))!==h)throw new Error(s[r]);this._dict_set=!0}}function p(t,e){var r=new d(e);if(r.push(t,!0),r.err)throw r.msg||s[r.err];return r.result}d.prototype.push=function(t,e){var r,s,a=this.strm,f=this.options.chunkSize;if(this.ended)return!1;s=e===~~e?e:!0===e?4:0,"string"==typeof t?a.input=o.string2buf(t):"[object ArrayBuffer]"===u.call(t)?a.input=new Uint8Array(t):a.input=t,a.next_in=0,a.avail_in=a.input.length;do{if(0===a.avail_out&&(a.output=new i.Buf8(f),a.next_out=0,a.avail_out=f),1!==(r=n.deflate(a,s))&&r!==h)return this.onEnd(r),this.ended=!0,!1;0!==a.avail_out&&(0!==a.avail_in||4!==s&&2!==s)||("string"===this.options.to?this.onData(o.buf2binstring(i.shrinkBuf(a.output,a.next_out))):this.onData(i.shrinkBuf(a.output,a.next_out)))}while((a.avail_in>0||0===a.avail_out)&&1!==r);return 4===s?(r=n.deflateEnd(this.strm),this.onEnd(r),this.ended=!0,r===h):2!==s||(this.onEnd(h),a.avail_out=0,!0)},d.prototype.onData=function(t){this.chunks.push(t)},d.prototype.onEnd=function(t){t===h&&("string"===this.options.to?this.result=this.chunks.join(""):this.result=i.flattenChunks(this.chunks)),this.chunks=[],this.err=t,this.msg=this.strm.msg},e.Deflate=d,e.deflate=p,e.deflateRaw=function(t,e){return(e=e||{}).raw=!0,p(t,e)},e.gzip=function(t,e){return(e=e||{}).gzip=!0,p(t,e)}},function(t,e,r){"use strict";var n,i=r(4),o=r(89),s=r(40),a=r(41),u=r(23),h=0,f=1,l=3,c=4,d=5,p=0,g=1,m=-2,_=-3,v=-5,y=-1,w=1,b=2,k=3,x=4,E=0,S=2,A=8,C=9,T=15,R=8,I=286,O=30,B=19,z=2*I+1,L=15,P=3,D=258,U=D+P+1,N=32,F=42,M=69,j=73,Z=91,W=103,Y=113,H=666,q=1,K=2,X=3,V=4,J=3;function G(t,e){return t.msg=u[e],e}function $(t){return(t<<1)-(t>4?9:0)}function Q(t){for(var e=t.length;--e>=0;)t[e]=0}function tt(t){var e=t.state,r=e.pending;r>t.avail_out&&(r=t.avail_out),0!==r&&(i.arraySet(t.output,e.pending_buf,e.pending_out,r,t.next_out),t.next_out+=r,e.pending_out+=r,t.total_out+=r,t.avail_out-=r,e.pending-=r,0===e.pending&&(e.pending_out=0))}function et(t,e){o._tr_flush_block(t,t.block_start>=0?t.block_start:-1,t.strstart-t.block_start,e),t.block_start=t.strstart,tt(t.strm)}function rt(t,e){t.pending_buf[t.pending++]=e}function nt(t,e){t.pending_buf[t.pending++]=e>>>8&255,t.pending_buf[t.pending++]=255&e}function it(t,e){var r,n,i=t.max_chain_length,o=t.strstart,s=t.prev_length,a=t.nice_match,u=t.strstart>t.w_size-U?t.strstart-(t.w_size-U):0,h=t.window,f=t.w_mask,l=t.prev,c=t.strstart+D,d=h[o+s-1],p=h[o+s];t.prev_length>=t.good_match&&(i>>=2),a>t.lookahead&&(a=t.lookahead);do{if(h[(r=e)+s]===p&&h[r+s-1]===d&&h[r]===h[o]&&h[++r]===h[o+1]){o+=2,r++;do{}while(h[++o]===h[++r]&&h[++o]===h[++r]&&h[++o]===h[++r]&&h[++o]===h[++r]&&h[++o]===h[++r]&&h[++o]===h[++r]&&h[++o]===h[++r]&&h[++o]===h[++r]&&os){if(t.match_start=e,s=n,n>=a)break;d=h[o+s-1],p=h[o+s]}}}while((e=l[e&f])>u&&0!=--i);return s<=t.lookahead?s:t.lookahead}function ot(t){var e,r,n,o,u,h,f,l,c,d,p=t.w_size;do{if(o=t.window_size-t.lookahead-t.strstart,t.strstart>=p+(p-U)){i.arraySet(t.window,t.window,p,p,0),t.match_start-=p,t.strstart-=p,t.block_start-=p,e=r=t.hash_size;do{n=t.head[--e],t.head[e]=n>=p?n-p:0}while(--r);e=r=p;do{n=t.prev[--e],t.prev[e]=n>=p?n-p:0}while(--r);o+=p}if(0===t.strm.avail_in)break;if(h=t.strm,f=t.window,l=t.strstart+t.lookahead,c=o,d=void 0,(d=h.avail_in)>c&&(d=c),r=0===d?0:(h.avail_in-=d,i.arraySet(f,h.input,h.next_in,d,l),1===h.state.wrap?h.adler=s(h.adler,f,d,l):2===h.state.wrap&&(h.adler=a(h.adler,f,d,l)),h.next_in+=d,h.total_in+=d,d),t.lookahead+=r,t.lookahead+t.insert>=P)for(u=t.strstart-t.insert,t.ins_h=t.window[u],t.ins_h=(t.ins_h<=P&&(t.ins_h=(t.ins_h<=P)if(n=o._tr_tally(t,t.strstart-t.match_start,t.match_length-P),t.lookahead-=t.match_length,t.match_length<=t.max_lazy_match&&t.lookahead>=P){t.match_length--;do{t.strstart++,t.ins_h=(t.ins_h<=P&&(t.ins_h=(t.ins_h<4096)&&(t.match_length=P-1)),t.prev_length>=P&&t.match_length<=t.prev_length){i=t.strstart+t.lookahead-P,n=o._tr_tally(t,t.strstart-1-t.prev_match,t.prev_length-P),t.lookahead-=t.prev_length-1,t.prev_length-=2;do{++t.strstart<=i&&(t.ins_h=(t.ins_h<15&&(a=2,n-=16),o<1||o>C||r!==A||n<8||n>15||e<0||e>9||s<0||s>x)return G(t,m);8===n&&(n=9);var u=new ht;return t.state=u,u.strm=t,u.wrap=a,u.gzhead=null,u.w_bits=n,u.w_size=1<t.pending_buf_size-5&&(r=t.pending_buf_size-5);;){if(t.lookahead<=1){if(ot(t),0===t.lookahead&&e===h)return q;if(0===t.lookahead)break}t.strstart+=t.lookahead,t.lookahead=0;var n=t.block_start+r;if((0===t.strstart||t.strstart>=n)&&(t.lookahead=t.strstart-n,t.strstart=n,et(t,!1),0===t.strm.avail_out))return q;if(t.strstart-t.block_start>=t.w_size-U&&(et(t,!1),0===t.strm.avail_out))return q}return t.insert=0,e===c?(et(t,!0),0===t.strm.avail_out?X:V):(t.strstart>t.block_start&&(et(t,!1),t.strm.avail_out),q)})),new ut(4,4,8,4,st),new ut(4,5,16,8,st),new ut(4,6,32,32,st),new ut(4,4,16,16,at),new ut(8,16,32,32,at),new ut(8,16,128,128,at),new ut(8,32,128,256,at),new ut(32,128,258,1024,at),new ut(32,258,258,4096,at)],e.deflateInit=function(t,e){return ct(t,e,A,T,R,E)},e.deflateInit2=ct,e.deflateReset=lt,e.deflateResetKeep=ft,e.deflateSetHeader=function(t,e){return t&&t.state?2!==t.state.wrap?m:(t.state.gzhead=e,p):m},e.deflate=function(t,e){var r,i,s,u;if(!t||!t.state||e>d||e<0)return t?G(t,m):m;if(i=t.state,!t.output||!t.input&&0!==t.avail_in||i.status===H&&e!==c)return G(t,0===t.avail_out?v:m);if(i.strm=t,r=i.last_flush,i.last_flush=e,i.status===F)if(2===i.wrap)t.adler=0,rt(i,31),rt(i,139),rt(i,8),i.gzhead?(rt(i,(i.gzhead.text?1:0)+(i.gzhead.hcrc?2:0)+(i.gzhead.extra?4:0)+(i.gzhead.name?8:0)+(i.gzhead.comment?16:0)),rt(i,255&i.gzhead.time),rt(i,i.gzhead.time>>8&255),rt(i,i.gzhead.time>>16&255),rt(i,i.gzhead.time>>24&255),rt(i,9===i.level?2:i.strategy>=b||i.level<2?4:0),rt(i,255&i.gzhead.os),i.gzhead.extra&&i.gzhead.extra.length&&(rt(i,255&i.gzhead.extra.length),rt(i,i.gzhead.extra.length>>8&255)),i.gzhead.hcrc&&(t.adler=a(t.adler,i.pending_buf,i.pending,0)),i.gzindex=0,i.status=M):(rt(i,0),rt(i,0),rt(i,0),rt(i,0),rt(i,0),rt(i,9===i.level?2:i.strategy>=b||i.level<2?4:0),rt(i,J),i.status=Y);else{var _=A+(i.w_bits-8<<4)<<8;_|=(i.strategy>=b||i.level<2?0:i.level<6?1:6===i.level?2:3)<<6,0!==i.strstart&&(_|=N),_+=31-_%31,i.status=Y,nt(i,_),0!==i.strstart&&(nt(i,t.adler>>>16),nt(i,65535&t.adler)),t.adler=1}if(i.status===M)if(i.gzhead.extra){for(s=i.pending;i.gzindex<(65535&i.gzhead.extra.length)&&(i.pending!==i.pending_buf_size||(i.gzhead.hcrc&&i.pending>s&&(t.adler=a(t.adler,i.pending_buf,i.pending-s,s)),tt(t),s=i.pending,i.pending!==i.pending_buf_size));)rt(i,255&i.gzhead.extra[i.gzindex]),i.gzindex++;i.gzhead.hcrc&&i.pending>s&&(t.adler=a(t.adler,i.pending_buf,i.pending-s,s)),i.gzindex===i.gzhead.extra.length&&(i.gzindex=0,i.status=j)}else i.status=j;if(i.status===j)if(i.gzhead.name){s=i.pending;do{if(i.pending===i.pending_buf_size&&(i.gzhead.hcrc&&i.pending>s&&(t.adler=a(t.adler,i.pending_buf,i.pending-s,s)),tt(t),s=i.pending,i.pending===i.pending_buf_size)){u=1;break}u=i.gzindexs&&(t.adler=a(t.adler,i.pending_buf,i.pending-s,s)),0===u&&(i.gzindex=0,i.status=Z)}else i.status=Z;if(i.status===Z)if(i.gzhead.comment){s=i.pending;do{if(i.pending===i.pending_buf_size&&(i.gzhead.hcrc&&i.pending>s&&(t.adler=a(t.adler,i.pending_buf,i.pending-s,s)),tt(t),s=i.pending,i.pending===i.pending_buf_size)){u=1;break}u=i.gzindexs&&(t.adler=a(t.adler,i.pending_buf,i.pending-s,s)),0===u&&(i.status=W)}else i.status=W;if(i.status===W&&(i.gzhead.hcrc?(i.pending+2>i.pending_buf_size&&tt(t),i.pending+2<=i.pending_buf_size&&(rt(i,255&t.adler),rt(i,t.adler>>8&255),t.adler=0,i.status=Y)):i.status=Y),0!==i.pending){if(tt(t),0===t.avail_out)return i.last_flush=-1,p}else if(0===t.avail_in&&$(e)<=$(r)&&e!==c)return G(t,v);if(i.status===H&&0!==t.avail_in)return G(t,v);if(0!==t.avail_in||0!==i.lookahead||e!==h&&i.status!==H){var y=i.strategy===b?function(t,e){for(var r;;){if(0===t.lookahead&&(ot(t),0===t.lookahead)){if(e===h)return q;break}if(t.match_length=0,r=o._tr_tally(t,0,t.window[t.strstart]),t.lookahead--,t.strstart++,r&&(et(t,!1),0===t.strm.avail_out))return q}return t.insert=0,e===c?(et(t,!0),0===t.strm.avail_out?X:V):t.last_lit&&(et(t,!1),0===t.strm.avail_out)?q:K}(i,e):i.strategy===k?function(t,e){for(var r,n,i,s,a=t.window;;){if(t.lookahead<=D){if(ot(t),t.lookahead<=D&&e===h)return q;if(0===t.lookahead)break}if(t.match_length=0,t.lookahead>=P&&t.strstart>0&&(n=a[i=t.strstart-1])===a[++i]&&n===a[++i]&&n===a[++i]){s=t.strstart+D;do{}while(n===a[++i]&&n===a[++i]&&n===a[++i]&&n===a[++i]&&n===a[++i]&&n===a[++i]&&n===a[++i]&&n===a[++i]&&it.lookahead&&(t.match_length=t.lookahead)}if(t.match_length>=P?(r=o._tr_tally(t,1,t.match_length-P),t.lookahead-=t.match_length,t.strstart+=t.match_length,t.match_length=0):(r=o._tr_tally(t,0,t.window[t.strstart]),t.lookahead--,t.strstart++),r&&(et(t,!1),0===t.strm.avail_out))return q}return t.insert=0,e===c?(et(t,!0),0===t.strm.avail_out?X:V):t.last_lit&&(et(t,!1),0===t.strm.avail_out)?q:K}(i,e):n[i.level].func(i,e);if(y!==X&&y!==V||(i.status=H),y===q||y===X)return 0===t.avail_out&&(i.last_flush=-1),p;if(y===K&&(e===f?o._tr_align(i):e!==d&&(o._tr_stored_block(i,0,0,!1),e===l&&(Q(i.head),0===i.lookahead&&(i.strstart=0,i.block_start=0,i.insert=0))),tt(t),0===t.avail_out))return i.last_flush=-1,p}return e!==c?p:i.wrap<=0?g:(2===i.wrap?(rt(i,255&t.adler),rt(i,t.adler>>8&255),rt(i,t.adler>>16&255),rt(i,t.adler>>24&255),rt(i,255&t.total_in),rt(i,t.total_in>>8&255),rt(i,t.total_in>>16&255),rt(i,t.total_in>>24&255)):(nt(i,t.adler>>>16),nt(i,65535&t.adler)),tt(t),i.wrap>0&&(i.wrap=-i.wrap),0!==i.pending?p:g)},e.deflateEnd=function(t){var e;return t&&t.state?(e=t.state.status)!==F&&e!==M&&e!==j&&e!==Z&&e!==W&&e!==Y&&e!==H?G(t,m):(t.state=null,e===Y?G(t,_):p):m},e.deflateSetDictionary=function(t,e){var r,n,o,a,u,h,f,l,c=e.length;if(!t||!t.state)return m;if(2===(a=(r=t.state).wrap)||1===a&&r.status!==F||r.lookahead)return m;for(1===a&&(t.adler=s(t.adler,e,c,0)),r.wrap=0,c>=r.w_size&&(0===a&&(Q(r.head),r.strstart=0,r.block_start=0,r.insert=0),l=new i.Buf8(r.w_size),i.arraySet(l,e,c-r.w_size,r.w_size,0),e=l,c=r.w_size),u=t.avail_in,h=t.next_in,f=t.input,t.avail_in=c,t.next_in=0,t.input=e,ot(r);r.lookahead>=P;){n=r.strstart,o=r.lookahead-(P-1);do{r.ins_h=(r.ins_h<=0;)t[e]=0}var h=0,f=1,l=2,c=29,d=256,p=d+1+c,g=30,m=19,_=2*p+1,v=15,y=16,w=7,b=256,k=16,x=17,E=18,S=[0,0,0,0,0,0,0,0,1,1,1,1,2,2,2,2,3,3,3,3,4,4,4,4,5,5,5,5,0],A=[0,0,0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7,8,8,9,9,10,10,11,11,12,12,13,13],C=[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,3,7],T=[16,17,18,0,8,7,9,6,10,5,11,4,12,3,13,2,14,1,15],R=new Array(2*(p+2));u(R);var I=new Array(2*g);u(I);var O=new Array(512);u(O);var B=new Array(256);u(B);var z=new Array(c);u(z);var L,P,D,U=new Array(g);function N(t,e,r,n,i){this.static_tree=t,this.extra_bits=e,this.extra_base=r,this.elems=n,this.max_length=i,this.has_stree=t&&t.length}function F(t,e){this.dyn_tree=t,this.max_code=0,this.stat_desc=e}function M(t){return t<256?O[t]:O[256+(t>>>7)]}function j(t,e){t.pending_buf[t.pending++]=255&e,t.pending_buf[t.pending++]=e>>>8&255}function Z(t,e,r){t.bi_valid>y-r?(t.bi_buf|=e<>y-t.bi_valid,t.bi_valid+=r-y):(t.bi_buf|=e<>>=1,r<<=1}while(--e>0);return r>>>1}function H(t,e,r){var n,i,o=new Array(v+1),s=0;for(n=1;n<=v;n++)o[n]=s=s+r[n-1]<<1;for(i=0;i<=e;i++){var a=t[2*i+1];0!==a&&(t[2*i]=Y(o[a]++,a))}}function q(t){var e;for(e=0;e8?j(t,t.bi_buf):t.bi_valid>0&&(t.pending_buf[t.pending++]=t.bi_buf),t.bi_buf=0,t.bi_valid=0}function X(t,e,r,n){var i=2*e,o=2*r;return t[i]>1;r>=1;r--)V(t,o,r);i=u;do{r=t.heap[1],t.heap[1]=t.heap[t.heap_len--],V(t,o,1),n=t.heap[1],t.heap[--t.heap_max]=r,t.heap[--t.heap_max]=n,o[2*i]=o[2*r]+o[2*n],t.depth[i]=(t.depth[r]>=t.depth[n]?t.depth[r]:t.depth[n])+1,o[2*r+1]=o[2*n+1]=i,t.heap[1]=i++,V(t,o,1)}while(t.heap_len>=2);t.heap[--t.heap_max]=t.heap[1],function(t,e){var r,n,i,o,s,a,u=e.dyn_tree,h=e.max_code,f=e.stat_desc.static_tree,l=e.stat_desc.has_stree,c=e.stat_desc.extra_bits,d=e.stat_desc.extra_base,p=e.stat_desc.max_length,g=0;for(o=0;o<=v;o++)t.bl_count[o]=0;for(u[2*t.heap[t.heap_max]+1]=0,r=t.heap_max+1;r<_;r++)(o=u[2*u[2*(n=t.heap[r])+1]+1]+1)>p&&(o=p,g++),u[2*n+1]=o,n>h||(t.bl_count[o]++,s=0,n>=d&&(s=c[n-d]),a=u[2*n],t.opt_len+=a*(o+s),l&&(t.static_len+=a*(f[2*n+1]+s)));if(0!==g){do{for(o=p-1;0===t.bl_count[o];)o--;t.bl_count[o]--,t.bl_count[o+1]+=2,t.bl_count[p]--,g-=2}while(g>0);for(o=p;0!==o;o--)for(n=t.bl_count[o];0!==n;)(i=t.heap[--r])>h||(u[2*i+1]!==o&&(t.opt_len+=(o-u[2*i+1])*u[2*i],u[2*i+1]=o),n--)}}(t,e),H(o,h,t.bl_count)}function $(t,e,r){var n,i,o=-1,s=e[1],a=0,u=7,h=4;for(0===s&&(u=138,h=3),e[2*(r+1)+1]=65535,n=0;n<=r;n++)i=s,s=e[2*(n+1)+1],++a>=7;n0?(t.strm.data_type===a&&(t.strm.data_type=function(t){var e,r=4093624447;for(e=0;e<=31;e++,r>>>=1)if(1&r&&0!==t.dyn_ltree[2*e])return o;if(0!==t.dyn_ltree[18]||0!==t.dyn_ltree[20]||0!==t.dyn_ltree[26])return s;for(e=32;e=3&&0===t.bl_tree[2*T[e]+1];e--);return t.opt_len+=3*(e+1)+5+5+4,e}(t),u=t.opt_len+3+7>>>3,(h=t.static_len+3+7>>>3)<=u&&(u=h)):u=h=r+5,r+4<=u&&-1!==e?et(t,e,r,n):t.strategy===i||h===u?(Z(t,(f<<1)+(n?1:0),3),J(t,R,I)):(Z(t,(l<<1)+(n?1:0),3),function(t,e,r,n){var i;for(Z(t,e-257,5),Z(t,r-1,5),Z(t,n-4,4),i=0;i>>8&255,t.pending_buf[t.d_buf+2*t.last_lit+1]=255&e,t.pending_buf[t.l_buf+t.last_lit]=255&r,t.last_lit++,0===e?t.dyn_ltree[2*r]++:(t.matches++,e--,t.dyn_ltree[2*(B[r]+d+1)]++,t.dyn_dtree[2*M(e)]++),t.last_lit===t.lit_bufsize-1},e._tr_align=function(t){Z(t,f<<1,3),W(t,b,R),function(t){16===t.bi_valid?(j(t,t.bi_buf),t.bi_buf=0,t.bi_valid=0):t.bi_valid>=8&&(t.pending_buf[t.pending++]=255&t.bi_buf,t.bi_buf>>=8,t.bi_valid-=8)}(t)}},function(t,e,r){"use strict";var n=r(91),i=r(4),o=r(42),s=r(44),a=r(23),u=r(43),h=r(94),f=Object.prototype.toString;function l(t){if(!(this instanceof l))return new l(t);this.options=i.assign({chunkSize:16384,windowBits:0,to:""},t||{});var e=this.options;e.raw&&e.windowBits>=0&&e.windowBits<16&&(e.windowBits=-e.windowBits,0===e.windowBits&&(e.windowBits=-15)),!(e.windowBits>=0&&e.windowBits<16)||t&&t.windowBits||(e.windowBits+=32),e.windowBits>15&&e.windowBits<48&&0==(15&e.windowBits)&&(e.windowBits|=15),this.err=0,this.msg="",this.ended=!1,this.chunks=[],this.strm=new u,this.strm.avail_out=0;var r=n.inflateInit2(this.strm,e.windowBits);if(r!==s.Z_OK)throw new Error(a[r]);if(this.header=new h,n.inflateGetHeader(this.strm,this.header),e.dictionary&&("string"==typeof e.dictionary?e.dictionary=o.string2buf(e.dictionary):"[object ArrayBuffer]"===f.call(e.dictionary)&&(e.dictionary=new Uint8Array(e.dictionary)),e.raw&&(r=n.inflateSetDictionary(this.strm,e.dictionary))!==s.Z_OK))throw new Error(a[r])}function c(t,e){var r=new l(e);if(r.push(t,!0),r.err)throw r.msg||a[r.err];return r.result}l.prototype.push=function(t,e){var r,a,u,h,l,c=this.strm,d=this.options.chunkSize,p=this.options.dictionary,g=!1;if(this.ended)return!1;a=e===~~e?e:!0===e?s.Z_FINISH:s.Z_NO_FLUSH,"string"==typeof t?c.input=o.binstring2buf(t):"[object ArrayBuffer]"===f.call(t)?c.input=new Uint8Array(t):c.input=t,c.next_in=0,c.avail_in=c.input.length;do{if(0===c.avail_out&&(c.output=new i.Buf8(d),c.next_out=0,c.avail_out=d),(r=n.inflate(c,s.Z_NO_FLUSH))===s.Z_NEED_DICT&&p&&(r=n.inflateSetDictionary(this.strm,p)),r===s.Z_BUF_ERROR&&!0===g&&(r=s.Z_OK,g=!1),r!==s.Z_STREAM_END&&r!==s.Z_OK)return this.onEnd(r),this.ended=!0,!1;c.next_out&&(0!==c.avail_out&&r!==s.Z_STREAM_END&&(0!==c.avail_in||a!==s.Z_FINISH&&a!==s.Z_SYNC_FLUSH)||("string"===this.options.to?(u=o.utf8border(c.output,c.next_out),h=c.next_out-u,l=o.buf2string(c.output,u),c.next_out=h,c.avail_out=d-h,h&&i.arraySet(c.output,c.output,u,h,0),this.onData(l)):this.onData(i.shrinkBuf(c.output,c.next_out)))),0===c.avail_in&&0===c.avail_out&&(g=!0)}while((c.avail_in>0||0===c.avail_out)&&r!==s.Z_STREAM_END);return r===s.Z_STREAM_END&&(a=s.Z_FINISH),a===s.Z_FINISH?(r=n.inflateEnd(this.strm),this.onEnd(r),this.ended=!0,r===s.Z_OK):a!==s.Z_SYNC_FLUSH||(this.onEnd(s.Z_OK),c.avail_out=0,!0)},l.prototype.onData=function(t){this.chunks.push(t)},l.prototype.onEnd=function(t){t===s.Z_OK&&("string"===this.options.to?this.result=this.chunks.join(""):this.result=i.flattenChunks(this.chunks)),this.chunks=[],this.err=t,this.msg=this.strm.msg},e.Inflate=l,e.inflate=c,e.inflateRaw=function(t,e){return(e=e||{}).raw=!0,c(t,e)},e.ungzip=c},function(t,e,r){"use strict";var n=r(4),i=r(40),o=r(41),s=r(92),a=r(93),u=0,h=1,f=2,l=4,c=5,d=6,p=0,g=1,m=2,_=-2,v=-3,y=-4,w=-5,b=8,k=1,x=2,E=3,S=4,A=5,C=6,T=7,R=8,I=9,O=10,B=11,z=12,L=13,P=14,D=15,U=16,N=17,F=18,M=19,j=20,Z=21,W=22,Y=23,H=24,q=25,K=26,X=27,V=28,J=29,G=30,$=31,Q=32,tt=852,et=592,rt=15;function nt(t){return(t>>>24&255)+(t>>>8&65280)+((65280&t)<<8)+((255&t)<<24)}function it(){this.mode=0,this.last=!1,this.wrap=0,this.havedict=!1,this.flags=0,this.dmax=0,this.check=0,this.total=0,this.head=null,this.wbits=0,this.wsize=0,this.whave=0,this.wnext=0,this.window=null,this.hold=0,this.bits=0,this.length=0,this.offset=0,this.extra=0,this.lencode=null,this.distcode=null,this.lenbits=0,this.distbits=0,this.ncode=0,this.nlen=0,this.ndist=0,this.have=0,this.next=null,this.lens=new n.Buf16(320),this.work=new n.Buf16(288),this.lendyn=null,this.distdyn=null,this.sane=0,this.back=0,this.was=0}function ot(t){var e;return t&&t.state?(e=t.state,t.total_in=t.total_out=e.total=0,t.msg="",e.wrap&&(t.adler=1&e.wrap),e.mode=k,e.last=0,e.havedict=0,e.dmax=32768,e.head=null,e.hold=0,e.bits=0,e.lencode=e.lendyn=new n.Buf32(tt),e.distcode=e.distdyn=new n.Buf32(et),e.sane=1,e.back=-1,p):_}function st(t){var e;return t&&t.state?((e=t.state).wsize=0,e.whave=0,e.wnext=0,ot(t)):_}function at(t,e){var r,n;return t&&t.state?(n=t.state,e<0?(r=0,e=-e):(r=1+(e>>4),e<48&&(e&=15)),e&&(e<8||e>15)?_:(null!==n.window&&n.wbits!==e&&(n.window=null),n.wrap=r,n.wbits=e,st(t))):_}function ut(t,e){var r,n;return t?(n=new it,t.state=n,n.window=null,(r=at(t,e))!==p&&(t.state=null),r):_}var ht,ft,lt=!0;function ct(t){if(lt){var e;for(ht=new n.Buf32(512),ft=new n.Buf32(32),e=0;e<144;)t.lens[e++]=8;for(;e<256;)t.lens[e++]=9;for(;e<280;)t.lens[e++]=7;for(;e<288;)t.lens[e++]=8;for(a(h,t.lens,0,288,ht,0,t.work,{bits:9}),e=0;e<32;)t.lens[e++]=5;a(f,t.lens,0,32,ft,0,t.work,{bits:5}),lt=!1}t.lencode=ht,t.lenbits=9,t.distcode=ft,t.distbits=5}function dt(t,e,r,i){var o,s=t.state;return null===s.window&&(s.wsize=1<=s.wsize?(n.arraySet(s.window,e,r-s.wsize,s.wsize,0),s.wnext=0,s.whave=s.wsize):((o=s.wsize-s.wnext)>i&&(o=i),n.arraySet(s.window,e,r-i,o,s.wnext),(i-=o)?(n.arraySet(s.window,e,r-i,i,0),s.wnext=i,s.whave=s.wsize):(s.wnext+=o,s.wnext===s.wsize&&(s.wnext=0),s.whave>>8&255,r.check=o(r.check,Ct,2,0),at=0,ut=0,r.mode=x;break}if(r.flags=0,r.head&&(r.head.done=!1),!(1&r.wrap)||(((255&at)<<8)+(at>>8))%31){t.msg="incorrect header check",r.mode=G;break}if((15&at)!==b){t.msg="unknown compression method",r.mode=G;break}if(ut-=4,kt=8+(15&(at>>>=4)),0===r.wbits)r.wbits=kt;else if(kt>r.wbits){t.msg="invalid window size",r.mode=G;break}r.dmax=1<>8&1),512&r.flags&&(Ct[0]=255&at,Ct[1]=at>>>8&255,r.check=o(r.check,Ct,2,0)),at=0,ut=0,r.mode=E;case E:for(;ut<32;){if(0===ot)break t;ot--,at+=tt[rt++]<>>8&255,Ct[2]=at>>>16&255,Ct[3]=at>>>24&255,r.check=o(r.check,Ct,4,0)),at=0,ut=0,r.mode=S;case S:for(;ut<16;){if(0===ot)break t;ot--,at+=tt[rt++]<>8),512&r.flags&&(Ct[0]=255&at,Ct[1]=at>>>8&255,r.check=o(r.check,Ct,2,0)),at=0,ut=0,r.mode=A;case A:if(1024&r.flags){for(;ut<16;){if(0===ot)break t;ot--,at+=tt[rt++]<>>8&255,r.check=o(r.check,Ct,2,0)),at=0,ut=0}else r.head&&(r.head.extra=null);r.mode=C;case C:if(1024&r.flags&&((lt=r.length)>ot&&(lt=ot),lt&&(r.head&&(kt=r.head.extra_len-r.length,r.head.extra||(r.head.extra=new Array(r.head.extra_len)),n.arraySet(r.head.extra,tt,rt,lt,kt)),512&r.flags&&(r.check=o(r.check,tt,lt,rt)),ot-=lt,rt+=lt,r.length-=lt),r.length))break t;r.length=0,r.mode=T;case T:if(2048&r.flags){if(0===ot)break t;lt=0;do{kt=tt[rt+lt++],r.head&&kt&&r.length<65536&&(r.head.name+=String.fromCharCode(kt))}while(kt&<>9&1,r.head.done=!0),t.adler=r.check=0,r.mode=z;break;case O:for(;ut<32;){if(0===ot)break t;ot--,at+=tt[rt++]<>>=7&ut,ut-=7&ut,r.mode=X;break}for(;ut<3;){if(0===ot)break t;ot--,at+=tt[rt++]<>>=1)){case 0:r.mode=P;break;case 1:if(ct(r),r.mode=j,e===d){at>>>=2,ut-=2;break t}break;case 2:r.mode=N;break;case 3:t.msg="invalid block type",r.mode=G}at>>>=2,ut-=2;break;case P:for(at>>>=7&ut,ut-=7&ut;ut<32;){if(0===ot)break t;ot--,at+=tt[rt++]<>>16^65535)){t.msg="invalid stored block lengths",r.mode=G;break}if(r.length=65535&at,at=0,ut=0,r.mode=D,e===d)break t;case D:r.mode=U;case U:if(lt=r.length){if(lt>ot&&(lt=ot),lt>st&&(lt=st),0===lt)break t;n.arraySet(et,tt,rt,lt,it),ot-=lt,rt+=lt,st-=lt,it+=lt,r.length-=lt;break}r.mode=z;break;case N:for(;ut<14;){if(0===ot)break t;ot--,at+=tt[rt++]<>>=5,ut-=5,r.ndist=1+(31&at),at>>>=5,ut-=5,r.ncode=4+(15&at),at>>>=4,ut-=4,r.nlen>286||r.ndist>30){t.msg="too many length or distance symbols",r.mode=G;break}r.have=0,r.mode=F;case F:for(;r.have>>=3,ut-=3}for(;r.have<19;)r.lens[Tt[r.have++]]=0;if(r.lencode=r.lendyn,r.lenbits=7,Et={bits:r.lenbits},xt=a(u,r.lens,0,19,r.lencode,0,r.work,Et),r.lenbits=Et.bits,xt){t.msg="invalid code lengths set",r.mode=G;break}r.have=0,r.mode=M;case M:for(;r.have>>16&255,vt=65535&At,!((mt=At>>>24)<=ut);){if(0===ot)break t;ot--,at+=tt[rt++]<>>=mt,ut-=mt,r.lens[r.have++]=vt;else{if(16===vt){for(St=mt+2;ut>>=mt,ut-=mt,0===r.have){t.msg="invalid bit length repeat",r.mode=G;break}kt=r.lens[r.have-1],lt=3+(3&at),at>>>=2,ut-=2}else if(17===vt){for(St=mt+3;ut>>=mt)),at>>>=3,ut-=3}else{for(St=mt+7;ut>>=mt)),at>>>=7,ut-=7}if(r.have+lt>r.nlen+r.ndist){t.msg="invalid bit length repeat",r.mode=G;break}for(;lt--;)r.lens[r.have++]=kt}}if(r.mode===G)break;if(0===r.lens[256]){t.msg="invalid code -- missing end-of-block",r.mode=G;break}if(r.lenbits=9,Et={bits:r.lenbits},xt=a(h,r.lens,0,r.nlen,r.lencode,0,r.work,Et),r.lenbits=Et.bits,xt){t.msg="invalid literal/lengths set",r.mode=G;break}if(r.distbits=6,r.distcode=r.distdyn,Et={bits:r.distbits},xt=a(f,r.lens,r.nlen,r.ndist,r.distcode,0,r.work,Et),r.distbits=Et.bits,xt){t.msg="invalid distances set",r.mode=G;break}if(r.mode=j,e===d)break t;case j:r.mode=Z;case Z:if(ot>=6&&st>=258){t.next_out=it,t.avail_out=st,t.next_in=rt,t.avail_in=ot,r.hold=at,r.bits=ut,s(t,ft),it=t.next_out,et=t.output,st=t.avail_out,rt=t.next_in,tt=t.input,ot=t.avail_in,at=r.hold,ut=r.bits,r.mode===z&&(r.back=-1);break}for(r.back=0;_t=(At=r.lencode[at&(1<>>16&255,vt=65535&At,!((mt=At>>>24)<=ut);){if(0===ot)break t;ot--,at+=tt[rt++]<>yt)])>>>16&255,vt=65535&At,!(yt+(mt=At>>>24)<=ut);){if(0===ot)break t;ot--,at+=tt[rt++]<>>=yt,ut-=yt,r.back+=yt}if(at>>>=mt,ut-=mt,r.back+=mt,r.length=vt,0===_t){r.mode=K;break}if(32&_t){r.back=-1,r.mode=z;break}if(64&_t){t.msg="invalid literal/length code",r.mode=G;break}r.extra=15&_t,r.mode=W;case W:if(r.extra){for(St=r.extra;ut>>=r.extra,ut-=r.extra,r.back+=r.extra}r.was=r.length,r.mode=Y;case Y:for(;_t=(At=r.distcode[at&(1<>>16&255,vt=65535&At,!((mt=At>>>24)<=ut);){if(0===ot)break t;ot--,at+=tt[rt++]<>yt)])>>>16&255,vt=65535&At,!(yt+(mt=At>>>24)<=ut);){if(0===ot)break t;ot--,at+=tt[rt++]<>>=yt,ut-=yt,r.back+=yt}if(at>>>=mt,ut-=mt,r.back+=mt,64&_t){t.msg="invalid distance code",r.mode=G;break}r.offset=vt,r.extra=15&_t,r.mode=H;case H:if(r.extra){for(St=r.extra;ut>>=r.extra,ut-=r.extra,r.back+=r.extra}if(r.offset>r.dmax){t.msg="invalid distance too far back",r.mode=G;break}r.mode=q;case q:if(0===st)break t;if(lt=ft-st,r.offset>lt){if((lt=r.offset-lt)>r.whave&&r.sane){t.msg="invalid distance too far back",r.mode=G;break}lt>r.wnext?(lt-=r.wnext,pt=r.wsize-lt):pt=r.wnext-lt,lt>r.length&&(lt=r.length),gt=r.window}else gt=et,pt=it-r.offset,lt=r.length;lt>st&&(lt=st),st-=lt,r.length-=lt;do{et[it++]=gt[pt++]}while(--lt);0===r.length&&(r.mode=Z);break;case K:if(0===st)break t;et[it++]=r.length,st--,r.mode=Z;break;case X:if(r.wrap){for(;ut<32;){if(0===ot)break t;ot--,at|=tt[rt++]<>>=w=y>>>24,p-=w,0===(w=y>>>16&255))A[o++]=65535&y;else{if(!(16&w)){if(0==(64&w)){y=g[(65535&y)+(d&(1<>>=w,p-=w),p<15&&(d+=S[n++]<>>=w=y>>>24,p-=w,!(16&(w=y>>>16&255))){if(0==(64&w)){y=m[(65535&y)+(d&(1<u){t.msg="invalid distance too far back",r.mode=30;break t}if(d>>>=w,p-=w,k>(w=o-s)){if((w=k-w)>f&&r.sane){t.msg="invalid distance too far back",r.mode=30;break t}if(x=0,E=c,0===l){if(x+=h-w,w2;)A[o++]=E[x++],A[o++]=E[x++],A[o++]=E[x++],b-=3;b&&(A[o++]=E[x++],b>1&&(A[o++]=E[x++]))}else{x=o-k;do{A[o++]=A[x++],A[o++]=A[x++],A[o++]=A[x++],b-=3}while(b>2);b&&(A[o++]=A[x++],b>1&&(A[o++]=A[x++]))}break}}break}}while(n>3,d&=(1<<(p-=b<<3))-1,t.next_in=n,t.next_out=o,t.avail_in=n=1&&0===P[A];A--);if(C>A&&(C=A),0===A)return h[f++]=20971520,h[f++]=20971520,c.bits=1,0;for(S=1;S0&&(0===t||1!==A))return-1;for(D[1]=0,x=1;x<15;x++)D[x+1]=D[x]+P[x];for(E=0;E852||2===t&&O>592)return 1;for(;;){y=x-R,l[E]v?(w=U[N+l[E]],b=z[L+l[E]]):(w=96,b=0),d=1<>R)+(p-=d)]=y<<24|w<<16|b|0}while(0!==p);for(d=1<>=1;if(0!==d?(B&=d-1,B+=d):B=0,E++,0==--P[x]){if(x===A)break;x=e[r+l[E]]}if(x>C&&(B&m)!==g){for(0===R&&(R=C),_+=S,I=1<<(T=x-R);T+R852||2===t&&O>592)return 1;h[g=B&m]=C<<24|T<<16|_-f|0}}return 0!==B&&(h[_+B]=x-R<<24|64<<16|0),c.bits=C,0}},function(t,e,r){"use strict";t.exports=function(){this.text=0,this.time=0,this.xflags=0,this.os=0,this.extra=null,this.extra_len=0,this.name="",this.comment="",this.hcrc=0,this.done=!1}},function(t,e,r){"use strict";var n=r(0),i=r(1),o=r(6),s=r(22),a=r(45),u=function(t,e){var r,n="";for(r=0;r>>=8;return n},h=function(t,e,r,i,h,f){var l,c,d=t.file,p=t.compression,g=f!==o.utf8encode,m=n.transformTo("string",f(d.name)),_=n.transformTo("string",o.utf8encode(d.name)),v=d.comment,y=n.transformTo("string",f(v)),w=n.transformTo("string",o.utf8encode(v)),b=_.length!==d.name.length,k=w.length!==v.length,x="",E="",S="",A=d.dir,C=d.date,T={crc32:0,compressedSize:0,uncompressedSize:0};e&&!r||(T.crc32=t.crc32,T.compressedSize=t.compressedSize,T.uncompressedSize=t.uncompressedSize);var R=0;e&&(R|=8),g||!b&&!k||(R|=2048);var I,O,B,z=0,L=0;A&&(z|=16),"UNIX"===h?(L=798,z|=(I=d.unixPermissions,O=A,B=I,I||(B=O?16893:33204),(65535&B)<<16)):(L=20,z|=63&(d.dosPermissions||0)),l=C.getUTCHours(),l<<=6,l|=C.getUTCMinutes(),l<<=5,l|=C.getUTCSeconds()/2,c=C.getUTCFullYear()-1980,c<<=4,c|=C.getUTCMonth()+1,c<<=5,c|=C.getUTCDate(),b&&(E=u(1,1)+u(s(m),4)+_,x+="up"+u(E.length,2)+E),k&&(S=u(1,1)+u(s(y),4)+w,x+="uc"+u(S.length,2)+S);var P="";return P+="\n\0",P+=u(R,2),P+=p.magic,P+=u(l,2),P+=u(c,2),P+=u(T.crc32,4),P+=u(T.compressedSize,4),P+=u(T.uncompressedSize,4),P+=u(m.length,2),P+=u(x.length,2),{fileRecord:a.LOCAL_FILE_HEADER+P+m+x,dirRecord:a.CENTRAL_FILE_HEADER+u(L,2)+P+u(y.length,2)+"\0\0\0\0"+u(z,4)+u(i,4)+m+x+y}},f=function(t){return a.DATA_DESCRIPTOR+u(t.crc32,4)+u(t.compressedSize,4)+u(t.uncompressedSize,4)};function l(t,e,r,n){i.call(this,"ZipFileWorker"),this.bytesWritten=0,this.zipComment=e,this.zipPlatform=r,this.encodeFileName=n,this.streamFiles=t,this.accumulate=!1,this.contentBuffer=[],this.dirRecords=[],this.currentSourceOffset=0,this.entriesCount=0,this.currentFile=null,this._sources=[]}n.inherits(l,i),l.prototype.push=function(t){var e=t.meta.percent||0,r=this.entriesCount,n=this._sources.length;this.accumulate?this.contentBuffer.push(t):(this.bytesWritten+=t.data.length,i.prototype.push.call(this,{data:t.data,meta:{currentFile:this.currentFile,percent:r?(e+100*(r-n-1))/r:100}}))},l.prototype.openedSource=function(t){this.currentSourceOffset=this.bytesWritten,this.currentFile=t.file.name;var e=this.streamFiles&&!t.file.dir;if(e){var r=h(t,e,!1,this.currentSourceOffset,this.zipPlatform,this.encodeFileName);this.push({data:r.fileRecord,meta:{percent:0}})}else this.accumulate=!0},l.prototype.closedSource=function(t){this.accumulate=!1;var e=this.streamFiles&&!t.file.dir,r=h(t,e,!0,this.currentSourceOffset,this.zipPlatform,this.encodeFileName);if(this.dirRecords.push(r.dirRecord),e)this.push({data:f(t),meta:{percent:100}});else for(this.push({data:r.fileRecord,meta:{percent:0}});this.contentBuffer.length;)this.push(this.contentBuffer.shift());this.currentFile=null},l.prototype.flush=function(){for(var t=this.bytesWritten,e=0;e1)throw new Error("Multi-volumes zip are not supported")},readLocalFiles:function(){var t,e;for(t=0;t0)this.isSignature(e,o.CENTRAL_FILE_HEADER)||(this.reader.zero=n);else if(n<0)throw new Error("Corrupted zip: missing "+Math.abs(n)+" bytes.")},prepareReader:function(t){this.reader=n(t)},load:function(t){this.prepareReader(t),this.readEndOfCentral(),this.readCentralDir(),this.readLocalFiles()}},t.exports=u},function(t,e,r){"use strict";var n=r(48);function i(t){n.call(this,t)}r(0).inherits(i,n),i.prototype.byteAt=function(t){return this.data.charCodeAt(this.zero+t)},i.prototype.lastIndexOfSignature=function(t){return this.data.lastIndexOf(t)-this.zero},i.prototype.readAndCheckSignature=function(t){return t===this.readData(4)},i.prototype.readData=function(t){this.checkOffset(t);var e=this.data.slice(this.zero+this.index,this.zero+this.index+t);return this.index+=t,e},t.exports=i},function(t,e,r){"use strict";var n=r(49);function i(t){n.call(this,t)}r(0).inherits(i,n),i.prototype.readData=function(t){this.checkOffset(t);var e=this.data.slice(this.zero+this.index,this.zero+this.index+t);return this.index+=t,e},t.exports=i},function(t,e,r){"use strict";var n=r(46),i=r(0),o=r(21),s=r(22),a=r(6),u=r(39),h=r(3);function f(t,e){this.options=t,this.loadOptions=e}f.prototype={isEncrypted:function(){return 1==(1&this.bitFlag)},useUTF8:function(){return 2048==(2048&this.bitFlag)},readLocalPart:function(t){var e,r;if(t.skip(22),this.fileNameLength=t.readInt(2),r=t.readInt(2),this.fileName=t.readData(this.fileNameLength),t.skip(r),-1===this.compressedSize||-1===this.uncompressedSize)throw new Error("Bug or corrupted zip : didn't get enough informations from the central directory (compressedSize === -1 || uncompressedSize === -1)");if(null===(e=function(t){for(var e in u)if(u.hasOwnProperty(e)&&u[e].magic===t)return u[e];return null}(this.compressionMethod)))throw new Error("Corrupted zip : compression "+i.pretty(this.compressionMethod)+" unknown (inner file : "+i.transformTo("string",this.fileName)+")");this.decompressed=new o(this.compressedSize,this.uncompressedSize,this.crc32,e,t.readData(this.compressedSize))},readCentralPart:function(t){this.versionMadeBy=t.readInt(2),t.skip(2),this.bitFlag=t.readInt(2),this.compressionMethod=t.readString(2),this.date=t.readDate(),this.crc32=t.readInt(4),this.compressedSize=t.readInt(4),this.uncompressedSize=t.readInt(4);var e=t.readInt(2);if(this.extraFieldsLength=t.readInt(2),this.fileCommentLength=t.readInt(2),this.diskNumberStart=t.readInt(2),this.internalFileAttributes=t.readInt(2),this.externalFileAttributes=t.readInt(4),this.localHeaderOffset=t.readInt(4),this.isEncrypted())throw new Error("Encrypted zip are not supported");t.skip(e),this.readExtraFields(t),this.parseZIP64ExtraField(t),this.fileComment=t.readData(this.fileCommentLength)},processAttributes:function(){this.unixPermissions=null,this.dosPermissions=null;var t=this.versionMadeBy>>8;this.dir=!!(16&this.externalFileAttributes),0===t&&(this.dosPermissions=63&this.externalFileAttributes),3===t&&(this.unixPermissions=this.externalFileAttributes>>16&65535),this.dir||"/"!==this.fileNameStr.slice(-1)||(this.dir=!0)},parseZIP64ExtraField:function(t){if(this.extraFields[1]){var e=n(this.extraFields[1].value);this.uncompressedSize===i.MAX_VALUE_32BITS&&(this.uncompressedSize=e.readInt(8)),this.compressedSize===i.MAX_VALUE_32BITS&&(this.compressedSize=e.readInt(8)),this.localHeaderOffset===i.MAX_VALUE_32BITS&&(this.localHeaderOffset=e.readInt(8)),this.diskNumberStart===i.MAX_VALUE_32BITS&&(this.diskNumberStart=e.readInt(4))}},readExtraFields:function(t){var e,r,n,i=t.index+this.extraFieldsLength;for(this.extraFields||(this.extraFields={});t.index=s())throw new RangeError("Attempt to allocate Buffer larger than maximum size: 0x"+s().toString(16)+" bytes");return 0|t}function p(t,e){if(u.isBuffer(t))return t.length;if("undefined"!=typeof ArrayBuffer&&"function"==typeof ArrayBuffer.isView&&(ArrayBuffer.isView(t)||t instanceof ArrayBuffer))return t.byteLength;"string"!=typeof t&&(t=""+t);var r=t.length;if(0===r)return 0;for(var n=!1;;)switch(e){case"ascii":case"latin1":case"binary":return r;case"utf8":case"utf-8":case void 0:return j(t).length;case"ucs2":case"ucs-2":case"utf16le":case"utf-16le":return 2*r;case"hex":return r>>>1;case"base64":return Z(t).length;default:if(n)return j(t).length;e=(""+e).toLowerCase(),n=!0}}function g(t,e,r){var n=!1;if((void 0===e||e<0)&&(e=0),e>this.length)return"";if((void 0===r||r>this.length)&&(r=this.length),r<=0)return"";if((r>>>=0)<=(e>>>=0))return"";for(t||(t="utf8");;)switch(t){case"hex":return I(this,e,r);case"utf8":case"utf-8":return A(this,e,r);case"ascii":return T(this,e,r);case"latin1":case"binary":return R(this,e,r);case"base64":return S(this,e,r);case"ucs2":case"ucs-2":case"utf16le":case"utf-16le":return O(this,e,r);default:if(n)throw new TypeError("Unknown encoding: "+t);t=(t+"").toLowerCase(),n=!0}}function m(t,e,r){var n=t[e];t[e]=t[r],t[r]=n}function _(t,e,r,n,i){if(0===t.length)return-1;if("string"==typeof r?(n=r,r=0):r>2147483647?r=2147483647:r<-2147483648&&(r=-2147483648),r=+r,isNaN(r)&&(r=i?0:t.length-1),r<0&&(r=t.length+r),r>=t.length){if(i)return-1;r=t.length-1}else if(r<0){if(!i)return-1;r=0}if("string"==typeof e&&(e=u.from(e,n)),u.isBuffer(e))return 0===e.length?-1:v(t,e,r,n,i);if("number"==typeof e)return e&=255,u.TYPED_ARRAY_SUPPORT&&"function"==typeof Uint8Array.prototype.indexOf?i?Uint8Array.prototype.indexOf.call(t,e,r):Uint8Array.prototype.lastIndexOf.call(t,e,r):v(t,[e],r,n,i);throw new TypeError("val must be string, number or Buffer")}function v(t,e,r,n,i){var o,s=1,a=t.length,u=e.length;if(void 0!==n&&("ucs2"===(n=String(n).toLowerCase())||"ucs-2"===n||"utf16le"===n||"utf-16le"===n)){if(t.length<2||e.length<2)return-1;s=2,a/=2,u/=2,r/=2}function h(t,e){return 1===s?t[e]:t.readUInt16BE(e*s)}if(i){var f=-1;for(o=r;oa&&(r=a-u),o=r;o>=0;o--){for(var l=!0,c=0;ci&&(n=i):n=i;var o=e.length;if(o%2!=0)throw new TypeError("Invalid hex string");n>o/2&&(n=o/2);for(var s=0;s>8,i=r%256,o.push(i),o.push(n);return o}(e,t.length-r),t,r,n)}function S(t,e,r){return 0===e&&r===t.length?n.fromByteArray(t):n.fromByteArray(t.slice(e,r))}function A(t,e,r){r=Math.min(t.length,r);for(var n=[],i=e;i239?4:h>223?3:h>191?2:1;if(i+l<=r)switch(l){case 1:h<128&&(f=h);break;case 2:128==(192&(o=t[i+1]))&&(u=(31&h)<<6|63&o)>127&&(f=u);break;case 3:o=t[i+1],s=t[i+2],128==(192&o)&&128==(192&s)&&(u=(15&h)<<12|(63&o)<<6|63&s)>2047&&(u<55296||u>57343)&&(f=u);break;case 4:o=t[i+1],s=t[i+2],a=t[i+3],128==(192&o)&&128==(192&s)&&128==(192&a)&&(u=(15&h)<<18|(63&o)<<12|(63&s)<<6|63&a)>65535&&u<1114112&&(f=u)}null===f?(f=65533,l=1):f>65535&&(f-=65536,n.push(f>>>10&1023|55296),f=56320|1023&f),n.push(f),i+=l}return function(t){var e=t.length;if(e<=C)return String.fromCharCode.apply(String,t);var r="",n=0;for(;n0&&(t=this.toString("hex",0,r).match(/.{2}/g).join(" "),this.length>r&&(t+=" ... ")),""},u.prototype.compare=function(t,e,r,n,i){if(!u.isBuffer(t))throw new TypeError("Argument must be a Buffer");if(void 0===e&&(e=0),void 0===r&&(r=t?t.length:0),void 0===n&&(n=0),void 0===i&&(i=this.length),e<0||r>t.length||n<0||i>this.length)throw new RangeError("out of range index");if(n>=i&&e>=r)return 0;if(n>=i)return-1;if(e>=r)return 1;if(this===t)return 0;for(var o=(i>>>=0)-(n>>>=0),s=(r>>>=0)-(e>>>=0),a=Math.min(o,s),h=this.slice(n,i),f=t.slice(e,r),l=0;li)&&(r=i),t.length>0&&(r<0||e<0)||e>this.length)throw new RangeError("Attempt to write outside buffer bounds");n||(n="utf8");for(var o=!1;;)switch(n){case"hex":return y(this,t,e,r);case"utf8":case"utf-8":return w(this,t,e,r);case"ascii":return b(this,t,e,r);case"latin1":case"binary":return k(this,t,e,r);case"base64":return x(this,t,e,r);case"ucs2":case"ucs-2":case"utf16le":case"utf-16le":return E(this,t,e,r);default:if(o)throw new TypeError("Unknown encoding: "+n);n=(""+n).toLowerCase(),o=!0}},u.prototype.toJSON=function(){return{type:"Buffer",data:Array.prototype.slice.call(this._arr||this,0)}};var C=4096;function T(t,e,r){var n="";r=Math.min(t.length,r);for(var i=e;in)&&(r=n);for(var i="",o=e;or)throw new RangeError("Trying to access beyond buffer length")}function z(t,e,r,n,i,o){if(!u.isBuffer(t))throw new TypeError('"buffer" argument must be a Buffer instance');if(e>i||et.length)throw new RangeError("Index out of range")}function L(t,e,r,n){e<0&&(e=65535+e+1);for(var i=0,o=Math.min(t.length-r,2);i>>8*(n?i:1-i)}function P(t,e,r,n){e<0&&(e=4294967295+e+1);for(var i=0,o=Math.min(t.length-r,4);i>>8*(n?i:3-i)&255}function D(t,e,r,n,i,o){if(r+n>t.length)throw new RangeError("Index out of range");if(r<0)throw new RangeError("Index out of range")}function U(t,e,r,n,o){return o||D(t,0,r,4),i.write(t,e,r,n,23,4),r+4}function N(t,e,r,n,o){return o||D(t,0,r,8),i.write(t,e,r,n,52,8),r+8}u.prototype.slice=function(t,e){var r,n=this.length;if((t=~~t)<0?(t+=n)<0&&(t=0):t>n&&(t=n),(e=void 0===e?n:~~e)<0?(e+=n)<0&&(e=0):e>n&&(e=n),e0&&(i*=256);)n+=this[t+--e]*i;return n},u.prototype.readUInt8=function(t,e){return e||B(t,1,this.length),this[t]},u.prototype.readUInt16LE=function(t,e){return e||B(t,2,this.length),this[t]|this[t+1]<<8},u.prototype.readUInt16BE=function(t,e){return e||B(t,2,this.length),this[t]<<8|this[t+1]},u.prototype.readUInt32LE=function(t,e){return e||B(t,4,this.length),(this[t]|this[t+1]<<8|this[t+2]<<16)+16777216*this[t+3]},u.prototype.readUInt32BE=function(t,e){return e||B(t,4,this.length),16777216*this[t]+(this[t+1]<<16|this[t+2]<<8|this[t+3])},u.prototype.readIntLE=function(t,e,r){t|=0,e|=0,r||B(t,e,this.length);for(var n=this[t],i=1,o=0;++o=(i*=128)&&(n-=Math.pow(2,8*e)),n},u.prototype.readIntBE=function(t,e,r){t|=0,e|=0,r||B(t,e,this.length);for(var n=e,i=1,o=this[t+--n];n>0&&(i*=256);)o+=this[t+--n]*i;return o>=(i*=128)&&(o-=Math.pow(2,8*e)),o},u.prototype.readInt8=function(t,e){return e||B(t,1,this.length),128&this[t]?-1*(255-this[t]+1):this[t]},u.prototype.readInt16LE=function(t,e){e||B(t,2,this.length);var r=this[t]|this[t+1]<<8;return 32768&r?4294901760|r:r},u.prototype.readInt16BE=function(t,e){e||B(t,2,this.length);var r=this[t+1]|this[t]<<8;return 32768&r?4294901760|r:r},u.prototype.readInt32LE=function(t,e){return e||B(t,4,this.length),this[t]|this[t+1]<<8|this[t+2]<<16|this[t+3]<<24},u.prototype.readInt32BE=function(t,e){return e||B(t,4,this.length),this[t]<<24|this[t+1]<<16|this[t+2]<<8|this[t+3]},u.prototype.readFloatLE=function(t,e){return e||B(t,4,this.length),i.read(this,t,!0,23,4)},u.prototype.readFloatBE=function(t,e){return e||B(t,4,this.length),i.read(this,t,!1,23,4)},u.prototype.readDoubleLE=function(t,e){return e||B(t,8,this.length),i.read(this,t,!0,52,8)},u.prototype.readDoubleBE=function(t,e){return e||B(t,8,this.length),i.read(this,t,!1,52,8)},u.prototype.writeUIntLE=function(t,e,r,n){(t=+t,e|=0,r|=0,n)||z(this,t,e,r,Math.pow(2,8*r)-1,0);var i=1,o=0;for(this[e]=255&t;++o=0&&(o*=256);)this[e+i]=t/o&255;return e+r},u.prototype.writeUInt8=function(t,e,r){return t=+t,e|=0,r||z(this,t,e,1,255,0),u.TYPED_ARRAY_SUPPORT||(t=Math.floor(t)),this[e]=255&t,e+1},u.prototype.writeUInt16LE=function(t,e,r){return t=+t,e|=0,r||z(this,t,e,2,65535,0),u.TYPED_ARRAY_SUPPORT?(this[e]=255&t,this[e+1]=t>>>8):L(this,t,e,!0),e+2},u.prototype.writeUInt16BE=function(t,e,r){return t=+t,e|=0,r||z(this,t,e,2,65535,0),u.TYPED_ARRAY_SUPPORT?(this[e]=t>>>8,this[e+1]=255&t):L(this,t,e,!1),e+2},u.prototype.writeUInt32LE=function(t,e,r){return t=+t,e|=0,r||z(this,t,e,4,4294967295,0),u.TYPED_ARRAY_SUPPORT?(this[e+3]=t>>>24,this[e+2]=t>>>16,this[e+1]=t>>>8,this[e]=255&t):P(this,t,e,!0),e+4},u.prototype.writeUInt32BE=function(t,e,r){return t=+t,e|=0,r||z(this,t,e,4,4294967295,0),u.TYPED_ARRAY_SUPPORT?(this[e]=t>>>24,this[e+1]=t>>>16,this[e+2]=t>>>8,this[e+3]=255&t):P(this,t,e,!1),e+4},u.prototype.writeIntLE=function(t,e,r,n){if(t=+t,e|=0,!n){var i=Math.pow(2,8*r-1);z(this,t,e,r,i-1,-i)}var o=0,s=1,a=0;for(this[e]=255&t;++o>0)-a&255;return e+r},u.prototype.writeIntBE=function(t,e,r,n){if(t=+t,e|=0,!n){var i=Math.pow(2,8*r-1);z(this,t,e,r,i-1,-i)}var o=r-1,s=1,a=0;for(this[e+o]=255&t;--o>=0&&(s*=256);)t<0&&0===a&&0!==this[e+o+1]&&(a=1),this[e+o]=(t/s>>0)-a&255;return e+r},u.prototype.writeInt8=function(t,e,r){return t=+t,e|=0,r||z(this,t,e,1,127,-128),u.TYPED_ARRAY_SUPPORT||(t=Math.floor(t)),t<0&&(t=255+t+1),this[e]=255&t,e+1},u.prototype.writeInt16LE=function(t,e,r){return t=+t,e|=0,r||z(this,t,e,2,32767,-32768),u.TYPED_ARRAY_SUPPORT?(this[e]=255&t,this[e+1]=t>>>8):L(this,t,e,!0),e+2},u.prototype.writeInt16BE=function(t,e,r){return t=+t,e|=0,r||z(this,t,e,2,32767,-32768),u.TYPED_ARRAY_SUPPORT?(this[e]=t>>>8,this[e+1]=255&t):L(this,t,e,!1),e+2},u.prototype.writeInt32LE=function(t,e,r){return t=+t,e|=0,r||z(this,t,e,4,2147483647,-2147483648),u.TYPED_ARRAY_SUPPORT?(this[e]=255&t,this[e+1]=t>>>8,this[e+2]=t>>>16,this[e+3]=t>>>24):P(this,t,e,!0),e+4},u.prototype.writeInt32BE=function(t,e,r){return t=+t,e|=0,r||z(this,t,e,4,2147483647,-2147483648),t<0&&(t=4294967295+t+1),u.TYPED_ARRAY_SUPPORT?(this[e]=t>>>24,this[e+1]=t>>>16,this[e+2]=t>>>8,this[e+3]=255&t):P(this,t,e,!1),e+4},u.prototype.writeFloatLE=function(t,e,r){return U(this,t,e,!0,r)},u.prototype.writeFloatBE=function(t,e,r){return U(this,t,e,!1,r)},u.prototype.writeDoubleLE=function(t,e,r){return N(this,t,e,!0,r)},u.prototype.writeDoubleBE=function(t,e,r){return N(this,t,e,!1,r)},u.prototype.copy=function(t,e,r,n){if(r||(r=0),n||0===n||(n=this.length),e>=t.length&&(e=t.length),e||(e=0),n>0&&n=this.length)throw new RangeError("sourceStart out of bounds");if(n<0)throw new RangeError("sourceEnd out of bounds");n>this.length&&(n=this.length),t.length-e=0;--i)t[i+e]=this[i+r];else if(o<1e3||!u.TYPED_ARRAY_SUPPORT)for(i=0;i>>=0,r=void 0===r?this.length:r>>>0,t||(t=0),"number"==typeof t)for(o=e;o55295&&r<57344){if(!i){if(r>56319){(e-=3)>-1&&o.push(239,191,189);continue}if(s+1===n){(e-=3)>-1&&o.push(239,191,189);continue}i=r;continue}if(r<56320){(e-=3)>-1&&o.push(239,191,189),i=r;continue}r=65536+(i-55296<<10|r-56320)}else i&&(e-=3)>-1&&o.push(239,191,189);if(i=null,r<128){if((e-=1)<0)break;o.push(r)}else if(r<2048){if((e-=2)<0)break;o.push(r>>6|192,63&r|128)}else if(r<65536){if((e-=3)<0)break;o.push(r>>12|224,r>>6&63|128,63&r|128)}else{if(!(r<1114112))throw new Error("Invalid code point");if((e-=4)<0)break;o.push(r>>18|240,r>>12&63|128,r>>6&63|128,63&r|128)}}return o}function Z(t){return n.toByteArray(function(t){if((t=function(t){return t.trim?t.trim():t.replace(/^\s+|\s+$/g,"")}(t).replace(F,"")).length<2)return"";for(;t.length%4!=0;)t+="=";return t}(t))}function W(t,e,r,n){for(var i=0;i=e.length||i>=t.length);++i)e[i+r]=t[i];return i}}).call(this,r(8))},function(t,e,r){"use strict";(function(t){if(e.base64=!0,e.array=!0,e.string=!0,e.arraybuffer="undefined"!=typeof ArrayBuffer&&"undefined"!=typeof Uint8Array,e.nodebuffer=void 0!==t,e.uint8array="undefined"!=typeof Uint8Array,"undefined"==typeof ArrayBuffer)e.blob=!1;else{var n=new ArrayBuffer(0);try{e.blob=0===new Blob([n],{type:"application/zip"}).size}catch(t){try{var i=new(self.BlobBuilder||self.WebKitBlobBuilder||self.MozBlobBuilder||self.MSBlobBuilder);i.append(n),e.blob=0===i.getBlob("application/zip").size}catch(t){e.blob=!1}}}try{e.nodestream=!!r(25).Readable}catch(t){e.nodestream=!1}}).call(this,r(2).Buffer)},function(t,e,r){"use strict";var n="undefined"!=typeof Uint8Array&&"undefined"!=typeof Uint16Array&&"undefined"!=typeof Int32Array;function i(t,e){return Object.prototype.hasOwnProperty.call(t,e)}e.assign=function(t){for(var e=Array.prototype.slice.call(arguments,1);e.length;){var r=e.shift();if(r){if("object"!=typeof r)throw new TypeError(r+"must be non-object");for(var n in r)i(r,n)&&(t[n]=r[n])}}return t},e.shrinkBuf=function(t,e){return t.length===e?t:t.subarray?t.subarray(0,e):(t.length=e,t)};var o={arraySet:function(t,e,r,n,i){if(e.subarray&&t.subarray)t.set(e.subarray(r,r+n),i);else for(var o=0;o=252?6:u>=248?5:u>=240?4:u>=224?3:u>=192?2:1;a[254]=a[254]=1;function h(){s.call(this,"utf-8 decode"),this.leftOver=null}function f(){s.call(this,"utf-8 encode")}e.utf8encode=function(t){return i.nodebuffer?o.newBufferFrom(t,"utf-8"):function(t){var e,r,n,o,s,a=t.length,u=0;for(o=0;o>>6,e[s++]=128|63&r):r<65536?(e[s++]=224|r>>>12,e[s++]=128|r>>>6&63,e[s++]=128|63&r):(e[s++]=240|r>>>18,e[s++]=128|r>>>12&63,e[s++]=128|r>>>6&63,e[s++]=128|63&r);return e}(t)},e.utf8decode=function(t){return i.nodebuffer?n.transformTo("nodebuffer",t).toString("utf-8"):function(t){var e,r,i,o,s=t.length,u=new Array(2*s);for(r=0,e=0;e4)u[r++]=65533,e+=o-1;else{for(i&=2===o?31:3===o?15:7;o>1&&e1?u[r++]=65533:i<65536?u[r++]=i:(i-=65536,u[r++]=55296|i>>10&1023,u[r++]=56320|1023&i)}return u.length!==r&&(u.subarray?u=u.subarray(0,r):u.length=r),n.applyFromCharCode(u)}(t=n.transformTo(i.uint8array?"uint8array":"array",t))},n.inherits(h,s),h.prototype.processChunk=function(t){var r=n.transformTo(i.uint8array?"uint8array":"array",t.data);if(this.leftOver&&this.leftOver.length){if(i.uint8array){var o=r;(r=new Uint8Array(o.length+this.leftOver.length)).set(this.leftOver,0),r.set(o,this.leftOver.length)}else r=this.leftOver.concat(r);this.leftOver=null}var s=function(t,e){var r;for((e=e||t.length)>t.length&&(e=t.length),r=e-1;r>=0&&128==(192&t[r]);)r--;return r<0?e:0===r?e:r+a[t[r]]>e?r:e}(r),u=r;s!==r.length&&(i.uint8array?(u=r.subarray(0,s),this.leftOver=r.subarray(s,r.length)):(u=r.slice(0,s),this.leftOver=r.slice(s,r.length))),this.push({data:e.utf8decode(u),meta:t.meta})},h.prototype.flush=function(){this.leftOver&&this.leftOver.length&&(this.push({data:e.utf8decode(this.leftOver),meta:{}}),this.leftOver=null)},e.Utf8DecodeWorker=h,n.inherits(f,s),f.prototype.processChunk=function(t){this.push({data:e.utf8encode(t.data),meta:t.meta})},e.Utf8EncodeWorker=f},function(t,e){"function"==typeof Object.create?t.exports=function(t,e){e&&(t.super_=e,t.prototype=Object.create(e.prototype,{constructor:{value:t,enumerable:!1,writable:!0,configurable:!0}}))}:t.exports=function(t,e){if(e){t.super_=e;var r=function(){};r.prototype=e.prototype,t.prototype=new r,t.prototype.constructor=t}}},function(t,e){var r;r=function(){return this}();try{r=r||new Function("return this")()}catch(t){"object"==typeof window&&(r=window)}t.exports=r},function(t,e,r){(function(t){function r(t){return Object.prototype.toString.call(t)}e.isArray=function(t){return Array.isArray?Array.isArray(t):"[object Array]"===r(t)},e.isBoolean=function(t){return"boolean"==typeof t},e.isNull=function(t){return null===t},e.isNullOrUndefined=function(t){return null==t},e.isNumber=function(t){return"number"==typeof t},e.isString=function(t){return"string"==typeof t},e.isSymbol=function(t){return"symbol"==typeof t},e.isUndefined=function(t){return void 0===t},e.isRegExp=function(t){return"[object RegExp]"===r(t)},e.isObject=function(t){return"object"==typeof t&&null!==t},e.isDate=function(t){return"[object Date]"===r(t)},e.isError=function(t){return"[object Error]"===r(t)||t instanceof Error},e.isFunction=function(t){return"function"==typeof t},e.isPrimitive=function(t){return null===t||"boolean"==typeof t||"number"==typeof t||"string"==typeof t||"symbol"==typeof t||void 0===t},e.isBuffer=t.isBuffer}).call(this,r(2).Buffer)},function(t,e,r){"use strict";var n=null;n="undefined"!=typeof Promise?Promise:r(79),t.exports={Promise:n}},function(t,e,r){t.exports=i;var n=r(12).EventEmitter;function i(){n.call(this)}r(7)(i,n),i.Readable=r(55),i.Writable=r(61),i.Duplex=r(62),i.Transform=r(63),i.PassThrough=r(64),i.Stream=i,i.prototype.pipe=function(t,e){var r=this;function i(e){t.writable&&!1===t.write(e)&&r.pause&&r.pause()}function o(){r.readable&&r.resume&&r.resume()}r.on("data",i),t.on("drain",o),t._isStdio||e&&!1===e.end||(r.on("end",a),r.on("close",u));var s=!1;function a(){s||(s=!0,t.end())}function u(){s||(s=!0,"function"==typeof t.destroy&&t.destroy())}function h(t){if(f(),0===n.listenerCount(this,"error"))throw t}function f(){r.removeListener("data",i),t.removeListener("drain",o),r.removeListener("end",a),r.removeListener("close",u),r.removeListener("error",h),t.removeListener("error",h),r.removeListener("end",f),r.removeListener("close",f),t.removeListener("close",f)}return r.on("error",h),t.on("error",h),r.on("end",f),r.on("close",f),t.on("close",f),t.emit("pipe",r),t}},function(t,e,r){"use strict";var n,i="object"==typeof Reflect?Reflect:null,o=i&&"function"==typeof i.apply?i.apply:function(t,e,r){return Function.prototype.apply.call(t,e,r)};n=i&&"function"==typeof i.ownKeys?i.ownKeys:Object.getOwnPropertySymbols?function(t){return Object.getOwnPropertyNames(t).concat(Object.getOwnPropertySymbols(t))}:function(t){return Object.getOwnPropertyNames(t)};var s=Number.isNaN||function(t){return t!=t};function a(){a.init.call(this)}t.exports=a,a.EventEmitter=a,a.prototype._events=void 0,a.prototype._eventsCount=0,a.prototype._maxListeners=void 0;var u=10;function h(t){return void 0===t._maxListeners?a.defaultMaxListeners:t._maxListeners}function f(t,e,r,n){var i,o,s,a;if("function"!=typeof r)throw new TypeError('The "listener" argument must be of type Function. Received type '+typeof r);if(void 0===(o=t._events)?(o=t._events=Object.create(null),t._eventsCount=0):(void 0!==o.newListener&&(t.emit("newListener",e,r.listener?r.listener:r),o=t._events),s=o[e]),void 0===s)s=o[e]=r,++t._eventsCount;else if("function"==typeof s?s=o[e]=n?[r,s]:[s,r]:n?s.unshift(r):s.push(r),(i=h(t))>0&&s.length>i&&!s.warned){s.warned=!0;var u=new Error("Possible EventEmitter memory leak detected. "+s.length+" "+String(e)+" listeners added. Use emitter.setMaxListeners() to increase limit");u.name="MaxListenersExceededWarning",u.emitter=t,u.type=e,u.count=s.length,a=u,console&&console.warn&&console.warn(a)}return t}function l(){for(var t=[],e=0;e0&&(s=e[0]),s instanceof Error)throw s;var a=new Error("Unhandled error."+(s?" ("+s.message+")":""));throw a.context=s,a}var u=i[t];if(void 0===u)return!1;if("function"==typeof u)o(u,this,e);else{var h=u.length,f=g(u,h);for(r=0;r=0;o--)if(r[o]===e||r[o].listener===e){s=r[o].listener,i=o;break}if(i<0)return this;0===i?r.shift():function(t,e){for(;e+1=0;n--)this.removeListener(t,e[n]);return this},a.prototype.listeners=function(t){return d(this,t,!0)},a.prototype.rawListeners=function(t){return d(this,t,!1)},a.listenerCount=function(t,e){return"function"==typeof t.listenerCount?t.listenerCount(e):p.call(t,e)},a.prototype.listenerCount=p,a.prototype.eventNames=function(){return this._eventsCount>0?n(this._events):[]}},function(t,e){var r,n,i=t.exports={};function o(){throw new Error("setTimeout has not been defined")}function s(){throw new Error("clearTimeout has not been defined")}function a(t){if(r===setTimeout)return setTimeout(t,0);if((r===o||!r)&&setTimeout)return r=setTimeout,setTimeout(t,0);try{return r(t,0)}catch(e){try{return r.call(null,t,0)}catch(e){return r.call(this,t,0)}}}!function(){try{r="function"==typeof setTimeout?setTimeout:o}catch(t){r=o}try{n="function"==typeof clearTimeout?clearTimeout:s}catch(t){n=s}}();var u,h=[],f=!1,l=-1;function c(){f&&u&&(f=!1,u.length?h=u.concat(h):l=-1,h.length&&d())}function d(){if(!f){var t=a(c);f=!0;for(var e=h.length;e;){for(u=h,h=[];++l1)for(var r=1;r-1?n:i,s=r(2).Buffer;p.WritableState=d;var a=r(9);a.inherits=r(7);var u,h={deprecate:r(59)};!function(){try{u=r(11)}catch(t){}finally{u||(u=r(12).EventEmitter)}}();var f;s=r(2).Buffer;function l(){}function c(t,e,r){this.chunk=t,this.encoding=e,this.callback=r,this.next=null}function d(t,e){f=f||r(5),t=t||{},this.objectMode=!!t.objectMode,e instanceof f&&(this.objectMode=this.objectMode||!!t.writableObjectMode);var n=t.highWaterMark,s=this.objectMode?16:16384;this.highWaterMark=n||0===n?n:s,this.highWaterMark=~~this.highWaterMark,this.needDrain=!1,this.ending=!1,this.ended=!1,this.finished=!1;var a=!1===t.decodeStrings;this.decodeStrings=!a,this.defaultEncoding=t.defaultEncoding||"utf8",this.length=0,this.writing=!1,this.corked=0,this.sync=!0,this.bufferProcessing=!1,this.onwrite=function(t){!function(t,e){var r=t._writableState,n=r.sync,s=r.writecb;if(function(t){t.writing=!1,t.writecb=null,t.length-=t.writelen,t.writelen=0}(r),e)!function(t,e,r,n,o){--e.pendingcb,r?i(o,n):o(n);t._writableState.errorEmitted=!0,t.emit("error",n)}(t,r,n,e,s);else{var a=v(r);a||r.corked||r.bufferProcessing||!r.bufferedRequest||_(t,r),n?o(m,t,r,a,s):m(t,r,a,s)}}(e,t)},this.writecb=null,this.writelen=0,this.bufferedRequest=null,this.lastBufferedRequest=null,this.pendingcb=0,this.prefinished=!1,this.errorEmitted=!1,this.bufferedRequestCount=0,this.corkedRequestsFree=new b(this),this.corkedRequestsFree.next=new b(this)}function p(t){if(f=f||r(5),!(this instanceof p||this instanceof f))return new p(t);this._writableState=new d(t,this),this.writable=!0,t&&("function"==typeof t.write&&(this._write=t.write),"function"==typeof t.writev&&(this._writev=t.writev)),u.call(this)}function g(t,e,r,n,i,o,s){e.writelen=n,e.writecb=s,e.writing=!0,e.sync=!0,r?t._writev(i,e.onwrite):t._write(i,o,e.onwrite),e.sync=!1}function m(t,e,r,n){r||function(t,e){0===e.length&&e.needDrain&&(e.needDrain=!1,t.emit("drain"))}(t,e),e.pendingcb--,n(),w(t,e)}function _(t,e){e.bufferProcessing=!0;var r=e.bufferedRequest;if(t._writev&&r&&r.next){var n=e.bufferedRequestCount,i=new Array(n),o=e.corkedRequestsFree;o.entry=r;for(var s=0;r;)i[s]=r,r=r.next,s+=1;g(t,e,!0,e.length,i,"",o.finish),e.pendingcb++,e.lastBufferedRequest=null,e.corkedRequestsFree=o.next,o.next=null}else{for(;r;){var a=r.chunk,u=r.encoding,h=r.callback;if(g(t,e,!1,e.objectMode?1:a.length,a,u,h),r=r.next,e.writing)break}null===r&&(e.lastBufferedRequest=null)}e.bufferedRequestCount=0,e.bufferedRequest=r,e.bufferProcessing=!1}function v(t){return t.ending&&0===t.length&&null===t.bufferedRequest&&!t.finished&&!t.writing}function y(t,e){e.prefinished||(e.prefinished=!0,t.emit("prefinish"))}function w(t,e){var r=v(e);return r&&(0===e.pendingcb?(y(t,e),e.finished=!0,t.emit("finish")):y(t,e)),r}function b(t){var e=this;this.next=null,this.entry=null,this.finish=function(r){var n=e.entry;for(e.entry=null;n;){var i=n.callback;t.pendingcb--,i(r),n=n.next}t.corkedRequestsFree?t.corkedRequestsFree.next=e:t.corkedRequestsFree=e}}a.inherits(p,u),d.prototype.getBuffer=function(){for(var t=this.bufferedRequest,e=[];t;)e.push(t),t=t.next;return e},function(){try{Object.defineProperty(d.prototype,"buffer",{get:h.deprecate((function(){return this.getBuffer()}),"_writableState.buffer is deprecated. Use _writableState.getBuffer instead.")})}catch(t){}}(),p.prototype.pipe=function(){this.emit("error",new Error("Cannot pipe. Not readable."))},p.prototype.write=function(t,e,r){var n=this._writableState,o=!1;return"function"==typeof e&&(r=e,e=null),s.isBuffer(t)?e="buffer":e||(e=n.defaultEncoding),"function"!=typeof r&&(r=l),n.ended?function(t,e){var r=new Error("write after end");t.emit("error",r),i(e,r)}(this,r):function(t,e,r,n){var o=!0;if(!s.isBuffer(r)&&"string"!=typeof r&&null!=r&&!e.objectMode){var a=new TypeError("Invalid non-string/buffer chunk");t.emit("error",a),i(n,a),o=!1}return o}(this,n,t,r)&&(n.pendingcb++,o=function(t,e,r,n,i){r=function(t,e,r){t.objectMode||!1===t.decodeStrings||"string"!=typeof e||(e=new s(e,r));return e}(e,r,n),s.isBuffer(r)&&(n="buffer");var o=e.objectMode?1:r.length;e.length+=o;var a=e.length-1))throw new TypeError("Unknown encoding: "+t);this._writableState.defaultEncoding=t},p.prototype._write=function(t,e,r){r(new Error("not implemented"))},p.prototype._writev=null,p.prototype.end=function(t,e,r){var n=this._writableState;"function"==typeof t?(r=t,t=null,e=null):"function"==typeof e&&(r=e,e=null),null!=t&&this.write(t,e),n.corked&&(n.corked=1,this.uncork()),n.ending||n.finished||function(t,e,r){e.ending=!0,w(t,e),r&&(e.finished?i(r):t.once("finish",r));e.ended=!0,t.writable=!1}(this,n,r)}}).call(this,r(13),r(57).setImmediate)},function(t,e,r){"use strict";t.exports=s;var n=r(5),i=r(9);function o(t){this.afterTransform=function(e,r){return function(t,e,r){var n=t._transformState;n.transforming=!1;var i=n.writecb;if(!i)return t.emit("error",new Error("no writecb in Transform class"));n.writechunk=null,n.writecb=null,null!=r&&t.push(r);i(e);var o=t._readableState;o.reading=!1,(o.needReadable||o.length>>1:t>>>1;e[r]=t}return e}();t.exports=function(t,e){return void 0!==t&&t.length?"string"!==n.getTypeOf(t)?function(t,e,r,n){var o=i,s=n+r;t^=-1;for(var a=n;a>>8^o[255&(t^e[a])];return-1^t}(0|e,t,t.length,0):function(t,e,r,n){var o=i,s=n+r;t^=-1;for(var a=n;a>>8^o[255&(t^e.charCodeAt(a))];return-1^t}(0|e,t,t.length,0):0}},function(t,e,r){"use strict";t.exports={2:"need dictionary",1:"stream end",0:"","-1":"file error","-2":"stream error","-3":"data error","-4":"insufficient memory","-5":"buffer error","-6":"incompatible version"}},function(t,e){var r={}.toString;t.exports=Array.isArray||function(t){return"[object Array]"==r.call(t)}},function(t,e,r){t.exports=r(11)},function(t,e,r){"use strict";(function(e){t.exports=p;var n=r(16),i=r(24),o=r(2).Buffer;p.ReadableState=d;r(12);var s,a=function(t,e){return t.listeners(e).length};!function(){try{s=r(11)}catch(t){}finally{s||(s=r(12).EventEmitter)}}();o=r(2).Buffer;var u=r(9);u.inherits=r(7);var h,f,l=r(56),c=void 0;function d(t,e){f=f||r(5),t=t||{},this.objectMode=!!t.objectMode,e instanceof f&&(this.objectMode=this.objectMode||!!t.readableObjectMode);var n=t.highWaterMark,i=this.objectMode?16:16384;this.highWaterMark=n||0===n?n:i,this.highWaterMark=~~this.highWaterMark,this.buffer=[],this.length=0,this.pipes=null,this.pipesCount=0,this.flowing=null,this.ended=!1,this.endEmitted=!1,this.reading=!1,this.sync=!0,this.needReadable=!1,this.emittedReadable=!1,this.readableListening=!1,this.resumeScheduled=!1,this.defaultEncoding=t.defaultEncoding||"utf8",this.ranOut=!1,this.awaitDrain=0,this.readingMore=!1,this.decoder=null,this.encoding=null,t.encoding&&(h||(h=r(27).StringDecoder),this.decoder=new h(t.encoding),this.encoding=t.encoding)}function p(t){if(f=f||r(5),!(this instanceof p))return new p(t);this._readableState=new d(t,this),this.readable=!0,t&&"function"==typeof t.read&&(this._read=t.read),s.call(this)}function g(t,e,r,i,s){var a=function(t,e){var r=null;o.isBuffer(e)||"string"==typeof e||null==e||t.objectMode||(r=new TypeError("Invalid non-string/buffer chunk"));return r}(e,r);if(a)t.emit("error",a);else if(null===r)e.reading=!1,function(t,e){if(e.ended)return;if(e.decoder){var r=e.decoder.end();r&&r.length&&(e.buffer.push(r),e.length+=e.objectMode?1:r.length)}e.ended=!0,v(t)}(t,e);else if(e.objectMode||r&&r.length>0)if(e.ended&&!s){var u=new Error("stream.push() after EOF");t.emit("error",u)}else if(e.endEmitted&&s){u=new Error("stream.unshift() after end event");t.emit("error",u)}else{var h;!e.decoder||s||i||(r=e.decoder.write(r),h=!e.objectMode&&0===r.length),s||(e.reading=!1),h||(e.flowing&&0===e.length&&!e.sync?(t.emit("data",r),t.read(0)):(e.length+=e.objectMode?1:r.length,s?e.buffer.unshift(r):e.buffer.push(r),e.needReadable&&v(t))),function(t,e){e.readingMore||(e.readingMore=!0,n(w,t,e))}(t,e)}else s||(e.reading=!1);return function(t){return!t.ended&&(t.needReadable||t.lengthe.highWaterMark&&(e.highWaterMark=function(t){return t>=m?t=m:(t--,t|=t>>>1,t|=t>>>2,t|=t>>>4,t|=t>>>8,t|=t>>>16,t++),t}(t)),t>e.length?e.ended?e.length:(e.needReadable=!0,0):t)}function v(t){var e=t._readableState;e.needReadable=!1,e.emittedReadable||(c("emitReadable",e.flowing),e.emittedReadable=!0,e.sync?n(y,t):y(t))}function y(t){c("emit readable"),t.emit("readable"),x(t)}function w(t,e){for(var r=e.length;!e.reading&&!e.flowing&&!e.ended&&e.length=i)r=s?n.join(""):1===n.length?n[0]:o.concat(n,i),n.length=0;else{if(t0)throw new Error("endReadable called on non-empty stream");e.endEmitted||(e.ended=!0,n(A,e,t))}function A(t,e){t.endEmitted||0!==t.length||(t.endEmitted=!0,e.readable=!1,e.emit("end"))}p.prototype.read=function(t){c("read",t);var e=this._readableState,r=t;if(("number"!=typeof t||t>0)&&(e.emittedReadable=!1),0===t&&e.needReadable&&(e.length>=e.highWaterMark||e.ended))return c("read: emitReadable",e.length,e.ended),0===e.length&&e.ended?S(this):v(this),null;if(0===(t=_(t,e))&&e.ended)return 0===e.length&&S(this),null;var n,i=e.needReadable;return c("need readable",i),(0===e.length||e.length-t0?E(t,e):null)&&(e.needReadable=!0,t=0),e.length-=t,0!==e.length||e.ended||(e.needReadable=!0),r!==t&&e.ended&&0===e.length&&S(this),null!==n&&this.emit("data",n),n},p.prototype._read=function(t){this.emit("error",new Error("not implemented"))},p.prototype.pipe=function(t,r){var o=this,s=this._readableState;switch(s.pipesCount){case 0:s.pipes=t;break;case 1:s.pipes=[s.pipes,t];break;default:s.pipes.push(t)}s.pipesCount+=1,c("pipe count=%d opts=%j",s.pipesCount,r);var u=(!r||!1!==r.end)&&t!==e.stdout&&t!==e.stderr?f:p;function h(t){c("onunpipe"),t===o&&p()}function f(){c("onend"),t.end()}s.endEmitted?n(u):o.once("end",u),t.on("unpipe",h);var l=function(t){return function(){var e=t._readableState;c("pipeOnDrain",e.awaitDrain),e.awaitDrain&&e.awaitDrain--,0===e.awaitDrain&&a(t,"data")&&(e.flowing=!0,x(t))}}(o);t.on("drain",l);var d=!1;function p(){c("cleanup"),t.removeListener("close",_),t.removeListener("finish",v),t.removeListener("drain",l),t.removeListener("error",m),t.removeListener("unpipe",h),o.removeListener("end",f),o.removeListener("end",p),o.removeListener("data",g),d=!0,!s.awaitDrain||t._writableState&&!t._writableState.needDrain||l()}function g(e){c("ondata"),!1===t.write(e)&&(1!==s.pipesCount||s.pipes[0]!==t||1!==o.listenerCount("data")||d||(c("false write response, pause",o._readableState.awaitDrain),o._readableState.awaitDrain++),o.pause())}function m(e){c("onerror",e),y(),t.removeListener("error",m),0===a(t,"error")&&t.emit("error",e)}function _(){t.removeListener("finish",v),y()}function v(){c("onfinish"),t.removeListener("close",_),y()}function y(){c("unpipe"),o.unpipe(t)}return o.on("data",g),t._events&&t._events.error?i(t._events.error)?t._events.error.unshift(m):t._events.error=[m,t._events.error]:t.on("error",m),t.once("close",_),t.once("finish",v),t.emit("pipe",o),s.flowing||(c("pipe resume"),o.resume()),t},p.prototype.unpipe=function(t){var e=this._readableState;if(0===e.pipesCount)return this;if(1===e.pipesCount)return t&&t!==e.pipes?this:(t||(t=e.pipes),e.pipes=null,e.pipesCount=0,e.flowing=!1,t&&t.emit("unpipe",this),this);if(!t){var r=e.pipes,n=e.pipesCount;e.pipes=null,e.pipesCount=0,e.flowing=!1;for(var i=0;i>5==6?2:t>>4==14?3:t>>3==30?4:t>>6==2?-1:-2}function a(t){var e=this.lastTotal-this.lastNeed,r=function(t,e,r){if(128!=(192&e[0]))return t.lastNeed=0,"�";if(t.lastNeed>1&&e.length>1){if(128!=(192&e[1]))return t.lastNeed=1,"�";if(t.lastNeed>2&&e.length>2&&128!=(192&e[2]))return t.lastNeed=2,"�"}}(this,t);return void 0!==r?r:this.lastNeed<=t.length?(t.copy(this.lastChar,e,0,this.lastNeed),this.lastChar.toString(this.encoding,0,this.lastTotal)):(t.copy(this.lastChar,e,0,t.length),void(this.lastNeed-=t.length))}function u(t,e){if((t.length-e)%2==0){var r=t.toString("utf16le",e);if(r){var n=r.charCodeAt(r.length-1);if(n>=55296&&n<=56319)return this.lastNeed=2,this.lastTotal=4,this.lastChar[0]=t[t.length-2],this.lastChar[1]=t[t.length-1],r.slice(0,-1)}return r}return this.lastNeed=1,this.lastTotal=2,this.lastChar[0]=t[t.length-1],t.toString("utf16le",e,t.length-1)}function h(t){var e=t&&t.length?this.write(t):"";if(this.lastNeed){var r=this.lastTotal-this.lastNeed;return e+this.lastChar.toString("utf16le",0,r)}return e}function f(t,e){var r=(t.length-e)%3;return 0===r?t.toString("base64",e):(this.lastNeed=3-r,this.lastTotal=3,1===r?this.lastChar[0]=t[t.length-1]:(this.lastChar[0]=t[t.length-2],this.lastChar[1]=t[t.length-1]),t.toString("base64",e,t.length-r))}function l(t){var e=t&&t.length?this.write(t):"";return this.lastNeed?e+this.lastChar.toString("base64",0,3-this.lastNeed):e}function c(t){return t.toString(this.encoding)}function d(t){return t&&t.length?this.write(t):""}e.StringDecoder=o,o.prototype.write=function(t){if(0===t.length)return"";var e,r;if(this.lastNeed){if(void 0===(e=this.fillLast(t)))return"";r=this.lastNeed,this.lastNeed=0}else r=0;return r=0)return i>0&&(t.lastNeed=i-1),i;if(--n=0)return i>0&&(t.lastNeed=i-2),i;if(--n=0)return i>0&&(2===i?i=0:t.lastNeed=i-3),i;return 0}(this,t,e);if(!this.lastNeed)return t.toString("utf8",e);this.lastTotal=r;var n=t.length-(r-this.lastNeed);return t.copy(this.lastChar,0,n),t.toString("utf8",e,n)},o.prototype.fillLast=function(t){if(this.lastNeed<=t.length)return t.copy(this.lastChar,this.lastTotal-this.lastNeed,0,this.lastNeed),this.lastChar.toString(this.encoding,0,this.lastTotal);t.copy(this.lastChar,this.lastTotal-this.lastNeed,0,t.length),this.lastNeed-=t.length}},function(t,e,r){"use strict";t.exports=o;var n=r(18),i=r(9);function o(t){if(!(this instanceof o))return new o(t);n.call(this,t)}i.inherits=r(7),i.inherits(o,n),o.prototype._transform=function(t,e,r){r(null,t)}},function(t,e,r){"use strict";var n=r(0),i=r(3),o="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=";e.encode=function(t){for(var e,r,i,s,a,u,h,f=[],l=0,c=t.length,d=c,p="string"!==n.getTypeOf(t);l>2,a=(3&e)<<4|r>>4,u=d>1?(15&r)<<2|i>>6:64,h=d>2?63&i:64,f.push(o.charAt(s)+o.charAt(a)+o.charAt(u)+o.charAt(h));return f.join("")},e.decode=function(t){var e,r,n,s,a,u,h=0,f=0;if("data:"===t.substr(0,"data:".length))throw new Error("Invalid base64 input, it looks like a data url.");var l,c=3*(t=t.replace(/[^A-Za-z0-9\+\/\=]/g,"")).length/4;if(t.charAt(t.length-1)===o.charAt(64)&&c--,t.charAt(t.length-2)===o.charAt(64)&&c--,c%1!=0)throw new Error("Invalid base64 input, bad content length.");for(l=i.uint8array?new Uint8Array(0|c):new Array(0|c);h>4,r=(15&s)<<4|(a=o.indexOf(t.charAt(h++)))>>2,n=(3&a)<<6|(u=o.indexOf(t.charAt(h++))),l[f++]=e,64!==a&&(l[f++]=r),64!==u&&(l[f++]=n);return l}},function(t,e){var r=t.exports={version:"2.3.0"};"number"==typeof __e&&(__e=r)},function(t,e,r){var n=r(68);t.exports=function(t,e,r){if(n(t),void 0===e)return t;switch(r){case 1:return function(r){return t.call(e,r)};case 2:return function(r,n){return t.call(e,r,n)};case 3:return function(r,n,i){return t.call(e,r,n,i)}}return function(){return t.apply(e,arguments)}}},function(t,e){t.exports=function(t){try{return!!t()}catch(t){return!0}}},function(t,e,r){var n=r(19),i=r(15).document,o=n(i)&&n(i.createElement);t.exports=function(t){return o?i.createElement(t):{}}},function(t,e,r){"use strict";(function(e){var n=r(0),i=r(81),o=r(1),s=r(29),a=r(3),u=r(10),h=null;if(a.nodestream)try{h=r(82)}catch(t){}function f(t,r){return new u.Promise((function(i,o){var a=[],u=t._internalType,h=t._outputType,f=t._mimeType;t.on("data",(function(t,e){a.push(t),r&&r(e)})).on("error",(function(t){a=[],o(t)})).on("end",(function(){try{var t=function(t,e,r){switch(t){case"blob":return n.newBlob(n.transformTo("arraybuffer",e),r);case"base64":return s.encode(e);default:return n.transformTo(t,e)}}(h,function(t,r){var n,i=0,o=null,s=0;for(n=0;n=this.max)return this.end();switch(this.type){case"string":t=this.data.substring(this.index,e);break;case"uint8array":t=this.data.subarray(this.index,e);break;case"array":case"nodebuffer":t=this.data.slice(this.index,e)}return this.index=e,this.push({data:t,meta:{percent:this.max?this.index/this.max*100:0}})},t.exports=o},function(t,e,r){"use strict";var n=r(0),i=r(1);function o(t){i.call(this,"DataLengthProbe for "+t),this.propName=t,this.withStreamInfo(t,0)}n.inherits(o,i),o.prototype.processChunk=function(t){if(t){var e=this.streamInfo[this.propName]||0;this.streamInfo[this.propName]=e+t.data.length}i.prototype.processChunk.call(this,t)},t.exports=o},function(t,e,r){"use strict";var n=r(1),i=r(22);function o(){n.call(this,"Crc32Probe"),this.withStreamInfo("crc32",0)}r(0).inherits(o,n),o.prototype.processChunk=function(t){this.streamInfo.crc32=i(t.data,this.streamInfo.crc32||0),this.push(t)},t.exports=o},function(t,e,r){"use strict";var n=r(1);e.STORE={magic:"\0\0",compressWorker:function(t){return new n("STORE compression")},uncompressWorker:function(){return new n("STORE decompression")}},e.DEFLATE=r(85)},function(t,e,r){"use strict";t.exports=function(t,e,r,n){for(var i=65535&t|0,o=t>>>16&65535|0,s=0;0!==r;){r-=s=r>2e3?2e3:r;do{o=o+(i=i+e[n++]|0)|0}while(--s);i%=65521,o%=65521}return i|o<<16|0}},function(t,e,r){"use strict";var n=function(){for(var t,e=[],r=0;r<256;r++){t=r;for(var n=0;n<8;n++)t=1&t?3988292384^t>>>1:t>>>1;e[r]=t}return e}();t.exports=function(t,e,r,i){var o=n,s=i+r;t^=-1;for(var a=i;a>>8^o[255&(t^e[a])];return-1^t}},function(t,e,r){"use strict";var n=r(4),i=!0,o=!0;try{String.fromCharCode.apply(null,[0])}catch(t){i=!1}try{String.fromCharCode.apply(null,new Uint8Array(1))}catch(t){o=!1}for(var s=new n.Buf8(256),a=0;a<256;a++)s[a]=a>=252?6:a>=248?5:a>=240?4:a>=224?3:a>=192?2:1;function u(t,e){if(e<65534&&(t.subarray&&o||!t.subarray&&i))return String.fromCharCode.apply(null,n.shrinkBuf(t,e));for(var r="",s=0;s>>6,e[s++]=128|63&r):r<65536?(e[s++]=224|r>>>12,e[s++]=128|r>>>6&63,e[s++]=128|63&r):(e[s++]=240|r>>>18,e[s++]=128|r>>>12&63,e[s++]=128|r>>>6&63,e[s++]=128|63&r);return e},e.buf2binstring=function(t){return u(t,t.length)},e.binstring2buf=function(t){for(var e=new n.Buf8(t.length),r=0,i=e.length;r4)h[n++]=65533,r+=o-1;else{for(i&=2===o?31:3===o?15:7;o>1&&r1?h[n++]=65533:i<65536?h[n++]=i:(i-=65536,h[n++]=55296|i>>10&1023,h[n++]=56320|1023&i)}return u(h,n)},e.utf8border=function(t,e){var r;for((e=e||t.length)>t.length&&(e=t.length),r=e-1;r>=0&&128==(192&t[r]);)r--;return r<0?e:0===r?e:r+s[t[r]]>e?r:e}},function(t,e,r){"use strict";t.exports=function(){this.input=null,this.next_in=0,this.avail_in=0,this.total_in=0,this.output=null,this.next_out=0,this.avail_out=0,this.total_out=0,this.msg="",this.state=null,this.data_type=2,this.adler=0}},function(t,e,r){"use strict";t.exports={Z_NO_FLUSH:0,Z_PARTIAL_FLUSH:1,Z_SYNC_FLUSH:2,Z_FULL_FLUSH:3,Z_FINISH:4,Z_BLOCK:5,Z_TREES:6,Z_OK:0,Z_STREAM_END:1,Z_NEED_DICT:2,Z_ERRNO:-1,Z_STREAM_ERROR:-2,Z_DATA_ERROR:-3,Z_BUF_ERROR:-5,Z_NO_COMPRESSION:0,Z_BEST_SPEED:1,Z_BEST_COMPRESSION:9,Z_DEFAULT_COMPRESSION:-1,Z_FILTERED:1,Z_HUFFMAN_ONLY:2,Z_RLE:3,Z_FIXED:4,Z_DEFAULT_STRATEGY:0,Z_BINARY:0,Z_TEXT:1,Z_UNKNOWN:2,Z_DEFLATED:8}},function(t,e,r){"use strict";e.LOCAL_FILE_HEADER="PK",e.CENTRAL_FILE_HEADER="PK",e.CENTRAL_DIRECTORY_END="PK",e.ZIP64_CENTRAL_DIRECTORY_LOCATOR="PK",e.ZIP64_CENTRAL_DIRECTORY_END="PK",e.DATA_DESCRIPTOR="PK\b"},function(t,e,r){"use strict";var n=r(0),i=r(3),o=r(47),s=r(99),a=r(100),u=r(49);t.exports=function(t){var e=n.getTypeOf(t);return n.checkSupport(e),"string"!==e||i.uint8array?"nodebuffer"===e?new a(t):i.uint8array?new u(n.transformTo("uint8array",t)):new o(n.transformTo("array",t)):new s(t)}},function(t,e,r){"use strict";var n=r(48);function i(t){n.call(this,t);for(var e=0;e=0;--o)if(this.data[o]===e&&this.data[o+1]===r&&this.data[o+2]===n&&this.data[o+3]===i)return o-this.zero;return-1},i.prototype.readAndCheckSignature=function(t){var e=t.charCodeAt(0),r=t.charCodeAt(1),n=t.charCodeAt(2),i=t.charCodeAt(3),o=this.readData(4);return e===o[0]&&r===o[1]&&n===o[2]&&i===o[3]},i.prototype.readData=function(t){if(this.checkOffset(t),0===t)return[];var e=this.data.slice(this.zero+this.index,this.zero+this.index+t);return this.index+=t,e},t.exports=i},function(t,e,r){"use strict";var n=r(0);function i(t){this.data=t,this.length=t.length,this.index=0,this.zero=0}i.prototype={checkOffset:function(t){this.checkIndex(this.index+t)},checkIndex:function(t){if(this.length=this.index;e--)r=(r<<8)+this.byteAt(e);return this.index+=t,r},readString:function(t){return n.transformTo("string",this.readData(t))},readData:function(t){},lastIndexOfSignature:function(t){},readAndCheckSignature:function(t){},readDate:function(){var t=this.readInt(4);return new Date(Date.UTC(1980+(t>>25&127),(t>>21&15)-1,t>>16&31,t>>11&31,t>>5&63,(31&t)<<1))}},t.exports=i},function(t,e,r){"use strict";var n=r(47);function i(t){n.call(this,t)}r(0).inherits(i,n),i.prototype.readData=function(t){if(this.checkOffset(t),0===t)return new Uint8Array(0);var e=this.data.subarray(this.zero+this.index,this.zero+this.index+t);return this.index+=t,e},t.exports=i},function(t,e,r){const n=r(51);onmessage=t=>{const e=new n,{start:r,end:i,block:o}=t.data;e.loadAsync(o).then(t=>{const e={};let n=r;t.forEach(t=>{e[t]=n++}),n=r;let o=i;t.forEach(e=>{const i=n++;t.file(e).async("blob").then(t=>{const n=new FileReader;n.onload=()=>{postMessage({fileName:e,index:i,data:n.result,isEnd:o<=r}),--o0?t.substring(0,e):""},g=function(t){return"/"!==t.slice(-1)&&(t+="/"),t},m=function(t,e){return e=void 0!==e?e:a.createFolders,t=g(t),this.files[t]||d.call(this,t,null,{dir:!0,createFolders:e}),this.files[t]};function _(t){return"[object RegExp]"===Object.prototype.toString.call(t)}var v={load:function(){throw new Error("This method has been removed in JSZip 3.0, please check the upgrade guide.")},forEach:function(t){var e,r,n;for(e in this.files)this.files.hasOwnProperty(e)&&(n=this.files[e],(r=e.slice(this.root.length,e.length))&&e.slice(0,this.root.length)===this.root&&t(r,n))},filter:function(t){var e=[];return this.forEach((function(r,n){t(r,n)&&e.push(n)})),e},file:function(t,e,r){if(1===arguments.length){if(_(t)){var n=t;return this.filter((function(t,e){return!e.dir&&n.test(t)}))}var i=this.files[this.root+t];return i&&!i.dir?i:null}return(t=this.root+t,d.call(this,t,e,r),this)},folder:function(t){if(!t)return this;if(_(t))return this.filter((function(e,r){return r.dir&&t.test(e)}));var e=this.root+t,r=m.call(this,e),n=this.clone();return n.root=r.name,n},remove:function(t){t=this.root+t;var e=this.files[t];if(e||("/"!==t.slice(-1)&&(t+="/"),e=this.files[t]),e&&!e.dir)delete this.files[t];else for(var r=this.filter((function(e,r){return r.name.slice(0,t.length)===t})),n=0;n0?s-4:s;for(r=0;r>16&255,u[f++]=e>>8&255,u[f++]=255&e;2===a&&(e=i[t.charCodeAt(r)]<<2|i[t.charCodeAt(r+1)]>>4,u[f++]=255&e);1===a&&(e=i[t.charCodeAt(r)]<<10|i[t.charCodeAt(r+1)]<<4|i[t.charCodeAt(r+2)]>>2,u[f++]=e>>8&255,u[f++]=255&e);return u},e.fromByteArray=function(t){for(var e,r=t.length,i=r%3,o=[],s=0,a=r-i;sa?a:s+16383));1===i?(e=t[r-1],o.push(n[e>>2]+n[e<<4&63]+"==")):2===i&&(e=(t[r-2]<<8)+t[r-1],o.push(n[e>>10]+n[e>>4&63]+n[e<<2&63]+"="));return o.join("")};for(var n=[],i=[],o="undefined"!=typeof Uint8Array?Uint8Array:Array,s="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/",a=0,u=s.length;a0)throw new Error("Invalid string. Length must be a multiple of 4");var r=t.indexOf("=");return-1===r&&(r=e),[r,r===e?0:4-r%4]}function f(t,e,r){for(var i,o,s=[],a=e;a>18&63]+n[o>>12&63]+n[o>>6&63]+n[63&o]);return s.join("")}i["-".charCodeAt(0)]=62,i["_".charCodeAt(0)]=63},function(t,e){e.read=function(t,e,r,n,i){var o,s,a=8*i-n-1,u=(1<>1,f=-7,l=r?i-1:0,c=r?-1:1,d=t[e+l];for(l+=c,o=d&(1<<-f)-1,d>>=-f,f+=a;f>0;o=256*o+t[e+l],l+=c,f-=8);for(s=o&(1<<-f)-1,o>>=-f,f+=n;f>0;s=256*s+t[e+l],l+=c,f-=8);if(0===o)o=1-h;else{if(o===u)return s?NaN:1/0*(d?-1:1);s+=Math.pow(2,n),o-=h}return(d?-1:1)*s*Math.pow(2,o-n)},e.write=function(t,e,r,n,i,o){var s,a,u,h=8*o-i-1,f=(1<>1,c=23===i?Math.pow(2,-24)-Math.pow(2,-77):0,d=n?0:o-1,p=n?1:-1,g=e<0||0===e&&1/e<0?1:0;for(e=Math.abs(e),isNaN(e)||e===1/0?(a=isNaN(e)?1:0,s=f):(s=Math.floor(Math.log(e)/Math.LN2),e*(u=Math.pow(2,-s))<1&&(s--,u*=2),(e+=s+l>=1?c/u:c*Math.pow(2,1-l))*u>=2&&(s++,u/=2),s+l>=f?(a=0,s=f):s+l>=1?(a=(e*u-1)*Math.pow(2,i),s+=l):(a=e*Math.pow(2,l-1)*Math.pow(2,i),s=0));i>=8;t[r+d]=255&a,d+=p,a/=256,i-=8);for(s=s<0;t[r+d]=255&s,d+=p,s/=256,h-=8);t[r+d-p]|=128*g}},function(t,e,r){var n=function(){try{return r(11)}catch(t){}}();(e=t.exports=r(26)).Stream=n||e,e.Readable=e,e.Writable=r(17),e.Duplex=r(5),e.Transform=r(18),e.PassThrough=r(28)},function(t,e){},function(t,e,r){(function(t){var n=void 0!==t&&t||"undefined"!=typeof self&&self||window,i=Function.prototype.apply;function o(t,e){this._id=t,this._clearFn=e}e.setTimeout=function(){return new o(i.call(setTimeout,n,arguments),clearTimeout)},e.setInterval=function(){return new o(i.call(setInterval,n,arguments),clearInterval)},e.clearTimeout=e.clearInterval=function(t){t&&t.close()},o.prototype.unref=o.prototype.ref=function(){},o.prototype.close=function(){this._clearFn.call(n,this._id)},e.enroll=function(t,e){clearTimeout(t._idleTimeoutId),t._idleTimeout=e},e.unenroll=function(t){clearTimeout(t._idleTimeoutId),t._idleTimeout=-1},e._unrefActive=e.active=function(t){clearTimeout(t._idleTimeoutId);var e=t._idleTimeout;e>=0&&(t._idleTimeoutId=setTimeout((function(){t._onTimeout&&t._onTimeout()}),e))},r(58),e.setImmediate="undefined"!=typeof self&&self.setImmediate||void 0!==t&&t.setImmediate||this&&this.setImmediate,e.clearImmediate="undefined"!=typeof self&&self.clearImmediate||void 0!==t&&t.clearImmediate||this&&this.clearImmediate}).call(this,r(8))},function(t,e,r){(function(t,e){!function(t,r){"use strict";if(!t.setImmediate){var n,i,o,s,a,u=1,h={},f=!1,l=t.document,c=Object.getPrototypeOf&&Object.getPrototypeOf(t);c=c&&c.setTimeout?c:t,"[object process]"==={}.toString.call(t.process)?n=function(t){e.nextTick((function(){p(t)}))}:!function(){if(t.postMessage&&!t.importScripts){var e=!0,r=t.onmessage;return t.onmessage=function(){e=!1},t.postMessage("","*"),t.onmessage=r,e}}()?t.MessageChannel?((o=new MessageChannel).port1.onmessage=function(t){p(t.data)},n=function(t){o.port2.postMessage(t)}):l&&"onreadystatechange"in l.createElement("script")?(i=l.documentElement,n=function(t){var e=l.createElement("script");e.onreadystatechange=function(){p(t),e.onreadystatechange=null,i.removeChild(e),e=null},i.appendChild(e)}):n=function(t){setTimeout(p,0,t)}:(s="setImmediate$"+Math.random()+"$",a=function(e){e.source===t&&"string"==typeof e.data&&0===e.data.indexOf(s)&&p(+e.data.slice(s.length))},t.addEventListener?t.addEventListener("message",a,!1):t.attachEvent("onmessage",a),n=function(e){t.postMessage(s+e,"*")}),c.setImmediate=function(t){"function"!=typeof t&&(t=new Function(""+t));for(var e=new Array(arguments.length-1),r=0;rr;)e.push(arguments[r++]);return m[++g]=function(){a("function"==typeof t?t:Function(t),e)},n(g),g},d=function(t){delete m[t]},"process"==r(78)(l)?n=function(t){l.nextTick(s(_,t,1))}:p?(o=(i=new p).port2,i.port1.onmessage=v,n=s(o.postMessage,o,1)):f.addEventListener&&"function"==typeof postMessage&&!f.importScripts?(n=function(t){f.postMessage(t+"","*")},f.addEventListener("message",v,!1)):n="onreadystatechange"in h("script")?function(t){u.appendChild(h("script")).onreadystatechange=function(){u.removeChild(this),_.call(t)}}:function(t){setTimeout(s(_,t,1),0)}),t.exports={set:c,clear:d}},function(t,e){t.exports=function(t,e,r){var n=void 0===r;switch(e.length){case 0:return n?t():t.call(r);case 1:return n?t(e[0]):t.call(r,e[0]);case 2:return n?t(e[0],e[1]):t.call(r,e[0],e[1]);case 3:return n?t(e[0],e[1],e[2]):t.call(r,e[0],e[1],e[2]);case 4:return n?t(e[0],e[1],e[2],e[3]):t.call(r,e[0],e[1],e[2],e[3])}return t.apply(r,e)}},function(t,e,r){t.exports=r(15).document&&document.documentElement},function(t,e){var r={}.toString;t.exports=function(t){return r.call(t).slice(8,-1)}},function(t,e,r){"use strict";var n=r(80);function i(){}var o={},s=["REJECTED"],a=["FULFILLED"],u=["PENDING"];function h(t){if("function"!=typeof t)throw new TypeError("resolver must be a function");this.state=u,this.queue=[],this.outcome=void 0,t!==i&&d(this,t)}function f(t,e,r){this.promise=t,"function"==typeof e&&(this.onFulfilled=e,this.callFulfilled=this.otherCallFulfilled),"function"==typeof r&&(this.onRejected=r,this.callRejected=this.otherCallRejected)}function l(t,e,r){n((function(){var n;try{n=e(r)}catch(e){return o.reject(t,e)}n===t?o.reject(t,new TypeError("Cannot resolve promise with itself")):o.resolve(t,n)}))}function c(t){var e=t&&t.then;if(t&&("object"==typeof t||"function"==typeof t)&&"function"==typeof e)return function(){e.apply(t,arguments)}}function d(t,e){var r=!1;function n(e){r||(r=!0,o.reject(t,e))}function i(e){r||(r=!0,o.resolve(t,e))}var s=p((function(){e(i,n)}));"error"===s.status&&n(s.value)}function p(t,e){var r={};try{r.value=t(e),r.status="success"}catch(t){r.status="error",r.value=t}return r}t.exports=h,h.prototype.catch=function(t){return this.then(null,t)},h.prototype.then=function(t,e){if("function"!=typeof t&&this.state===a||"function"!=typeof e&&this.state===s)return this;var r=new this.constructor(i);this.state!==u?l(r,this.state===a?t:e,this.outcome):this.queue.push(new f(r,t,e));return r},f.prototype.callFulfilled=function(t){o.resolve(this.promise,t)},f.prototype.otherCallFulfilled=function(t){l(this.promise,this.onFulfilled,t)},f.prototype.callRejected=function(t){o.reject(this.promise,t)},f.prototype.otherCallRejected=function(t){l(this.promise,this.onRejected,t)},o.resolve=function(t,e){var r=p(c,e);if("error"===r.status)return o.reject(t,r.value);var n=r.value;if(n)d(t,n);else{t.state=a,t.outcome=e;for(var i=-1,s=t.queue.length;++i0?e.windowBits=-e.windowBits:e.gzip&&e.windowBits>0&&e.windowBits<16&&(e.windowBits+=16),this.err=0,this.msg="",this.ended=!1,this.chunks=[],this.strm=new a,this.strm.avail_out=0;var r=n.deflateInit2(this.strm,e.level,e.method,e.windowBits,e.memLevel,e.strategy);if(r!==h)throw new Error(s[r]);if(e.header&&n.deflateSetHeader(this.strm,e.header),e.dictionary){var p;if(p="string"==typeof e.dictionary?o.string2buf(e.dictionary):"[object ArrayBuffer]"===u.call(e.dictionary)?new Uint8Array(e.dictionary):e.dictionary,(r=n.deflateSetDictionary(this.strm,p))!==h)throw new Error(s[r]);this._dict_set=!0}}function p(t,e){var r=new d(e);if(r.push(t,!0),r.err)throw r.msg||s[r.err];return r.result}d.prototype.push=function(t,e){var r,s,a=this.strm,f=this.options.chunkSize;if(this.ended)return!1;s=e===~~e?e:!0===e?4:0,"string"==typeof t?a.input=o.string2buf(t):"[object ArrayBuffer]"===u.call(t)?a.input=new Uint8Array(t):a.input=t,a.next_in=0,a.avail_in=a.input.length;do{if(0===a.avail_out&&(a.output=new i.Buf8(f),a.next_out=0,a.avail_out=f),1!==(r=n.deflate(a,s))&&r!==h)return this.onEnd(r),this.ended=!0,!1;0!==a.avail_out&&(0!==a.avail_in||4!==s&&2!==s)||("string"===this.options.to?this.onData(o.buf2binstring(i.shrinkBuf(a.output,a.next_out))):this.onData(i.shrinkBuf(a.output,a.next_out)))}while((a.avail_in>0||0===a.avail_out)&&1!==r);return 4===s?(r=n.deflateEnd(this.strm),this.onEnd(r),this.ended=!0,r===h):2!==s||(this.onEnd(h),a.avail_out=0,!0)},d.prototype.onData=function(t){this.chunks.push(t)},d.prototype.onEnd=function(t){t===h&&("string"===this.options.to?this.result=this.chunks.join(""):this.result=i.flattenChunks(this.chunks)),this.chunks=[],this.err=t,this.msg=this.strm.msg},e.Deflate=d,e.deflate=p,e.deflateRaw=function(t,e){return(e=e||{}).raw=!0,p(t,e)},e.gzip=function(t,e){return(e=e||{}).gzip=!0,p(t,e)}},function(t,e,r){"use strict";var n,i=r(4),o=r(89),s=r(40),a=r(41),u=r(23),h=0,f=1,l=3,c=4,d=5,p=0,g=1,m=-2,_=-3,v=-5,y=-1,w=1,b=2,k=3,x=4,E=0,S=2,A=8,C=9,T=15,R=8,I=286,O=30,B=19,z=2*I+1,L=15,P=3,D=258,U=D+P+1,N=32,F=42,M=69,j=73,Z=91,W=103,Y=113,H=666,q=1,K=2,X=3,V=4,J=3;function G(t,e){return t.msg=u[e],e}function $(t){return(t<<1)-(t>4?9:0)}function Q(t){for(var e=t.length;--e>=0;)t[e]=0}function tt(t){var e=t.state,r=e.pending;r>t.avail_out&&(r=t.avail_out),0!==r&&(i.arraySet(t.output,e.pending_buf,e.pending_out,r,t.next_out),t.next_out+=r,e.pending_out+=r,t.total_out+=r,t.avail_out-=r,e.pending-=r,0===e.pending&&(e.pending_out=0))}function et(t,e){o._tr_flush_block(t,t.block_start>=0?t.block_start:-1,t.strstart-t.block_start,e),t.block_start=t.strstart,tt(t.strm)}function rt(t,e){t.pending_buf[t.pending++]=e}function nt(t,e){t.pending_buf[t.pending++]=e>>>8&255,t.pending_buf[t.pending++]=255&e}function it(t,e){var r,n,i=t.max_chain_length,o=t.strstart,s=t.prev_length,a=t.nice_match,u=t.strstart>t.w_size-U?t.strstart-(t.w_size-U):0,h=t.window,f=t.w_mask,l=t.prev,c=t.strstart+D,d=h[o+s-1],p=h[o+s];t.prev_length>=t.good_match&&(i>>=2),a>t.lookahead&&(a=t.lookahead);do{if(h[(r=e)+s]===p&&h[r+s-1]===d&&h[r]===h[o]&&h[++r]===h[o+1]){o+=2,r++;do{}while(h[++o]===h[++r]&&h[++o]===h[++r]&&h[++o]===h[++r]&&h[++o]===h[++r]&&h[++o]===h[++r]&&h[++o]===h[++r]&&h[++o]===h[++r]&&h[++o]===h[++r]&&os){if(t.match_start=e,s=n,n>=a)break;d=h[o+s-1],p=h[o+s]}}}while((e=l[e&f])>u&&0!=--i);return s<=t.lookahead?s:t.lookahead}function ot(t){var e,r,n,o,u,h,f,l,c,d,p=t.w_size;do{if(o=t.window_size-t.lookahead-t.strstart,t.strstart>=p+(p-U)){i.arraySet(t.window,t.window,p,p,0),t.match_start-=p,t.strstart-=p,t.block_start-=p,e=r=t.hash_size;do{n=t.head[--e],t.head[e]=n>=p?n-p:0}while(--r);e=r=p;do{n=t.prev[--e],t.prev[e]=n>=p?n-p:0}while(--r);o+=p}if(0===t.strm.avail_in)break;if(h=t.strm,f=t.window,l=t.strstart+t.lookahead,c=o,d=void 0,(d=h.avail_in)>c&&(d=c),r=0===d?0:(h.avail_in-=d,i.arraySet(f,h.input,h.next_in,d,l),1===h.state.wrap?h.adler=s(h.adler,f,d,l):2===h.state.wrap&&(h.adler=a(h.adler,f,d,l)),h.next_in+=d,h.total_in+=d,d),t.lookahead+=r,t.lookahead+t.insert>=P)for(u=t.strstart-t.insert,t.ins_h=t.window[u],t.ins_h=(t.ins_h<=P&&(t.ins_h=(t.ins_h<=P)if(n=o._tr_tally(t,t.strstart-t.match_start,t.match_length-P),t.lookahead-=t.match_length,t.match_length<=t.max_lazy_match&&t.lookahead>=P){t.match_length--;do{t.strstart++,t.ins_h=(t.ins_h<=P&&(t.ins_h=(t.ins_h<4096)&&(t.match_length=P-1)),t.prev_length>=P&&t.match_length<=t.prev_length){i=t.strstart+t.lookahead-P,n=o._tr_tally(t,t.strstart-1-t.prev_match,t.prev_length-P),t.lookahead-=t.prev_length-1,t.prev_length-=2;do{++t.strstart<=i&&(t.ins_h=(t.ins_h<15&&(a=2,n-=16),o<1||o>C||r!==A||n<8||n>15||e<0||e>9||s<0||s>x)return G(t,m);8===n&&(n=9);var u=new ht;return t.state=u,u.strm=t,u.wrap=a,u.gzhead=null,u.w_bits=n,u.w_size=1<t.pending_buf_size-5&&(r=t.pending_buf_size-5);;){if(t.lookahead<=1){if(ot(t),0===t.lookahead&&e===h)return q;if(0===t.lookahead)break}t.strstart+=t.lookahead,t.lookahead=0;var n=t.block_start+r;if((0===t.strstart||t.strstart>=n)&&(t.lookahead=t.strstart-n,t.strstart=n,et(t,!1),0===t.strm.avail_out))return q;if(t.strstart-t.block_start>=t.w_size-U&&(et(t,!1),0===t.strm.avail_out))return q}return t.insert=0,e===c?(et(t,!0),0===t.strm.avail_out?X:V):(t.strstart>t.block_start&&(et(t,!1),t.strm.avail_out),q)})),new ut(4,4,8,4,st),new ut(4,5,16,8,st),new ut(4,6,32,32,st),new ut(4,4,16,16,at),new ut(8,16,32,32,at),new ut(8,16,128,128,at),new ut(8,32,128,256,at),new ut(32,128,258,1024,at),new ut(32,258,258,4096,at)],e.deflateInit=function(t,e){return ct(t,e,A,T,R,E)},e.deflateInit2=ct,e.deflateReset=lt,e.deflateResetKeep=ft,e.deflateSetHeader=function(t,e){return t&&t.state?2!==t.state.wrap?m:(t.state.gzhead=e,p):m},e.deflate=function(t,e){var r,i,s,u;if(!t||!t.state||e>d||e<0)return t?G(t,m):m;if(i=t.state,!t.output||!t.input&&0!==t.avail_in||i.status===H&&e!==c)return G(t,0===t.avail_out?v:m);if(i.strm=t,r=i.last_flush,i.last_flush=e,i.status===F)if(2===i.wrap)t.adler=0,rt(i,31),rt(i,139),rt(i,8),i.gzhead?(rt(i,(i.gzhead.text?1:0)+(i.gzhead.hcrc?2:0)+(i.gzhead.extra?4:0)+(i.gzhead.name?8:0)+(i.gzhead.comment?16:0)),rt(i,255&i.gzhead.time),rt(i,i.gzhead.time>>8&255),rt(i,i.gzhead.time>>16&255),rt(i,i.gzhead.time>>24&255),rt(i,9===i.level?2:i.strategy>=b||i.level<2?4:0),rt(i,255&i.gzhead.os),i.gzhead.extra&&i.gzhead.extra.length&&(rt(i,255&i.gzhead.extra.length),rt(i,i.gzhead.extra.length>>8&255)),i.gzhead.hcrc&&(t.adler=a(t.adler,i.pending_buf,i.pending,0)),i.gzindex=0,i.status=M):(rt(i,0),rt(i,0),rt(i,0),rt(i,0),rt(i,0),rt(i,9===i.level?2:i.strategy>=b||i.level<2?4:0),rt(i,J),i.status=Y);else{var _=A+(i.w_bits-8<<4)<<8;_|=(i.strategy>=b||i.level<2?0:i.level<6?1:6===i.level?2:3)<<6,0!==i.strstart&&(_|=N),_+=31-_%31,i.status=Y,nt(i,_),0!==i.strstart&&(nt(i,t.adler>>>16),nt(i,65535&t.adler)),t.adler=1}if(i.status===M)if(i.gzhead.extra){for(s=i.pending;i.gzindex<(65535&i.gzhead.extra.length)&&(i.pending!==i.pending_buf_size||(i.gzhead.hcrc&&i.pending>s&&(t.adler=a(t.adler,i.pending_buf,i.pending-s,s)),tt(t),s=i.pending,i.pending!==i.pending_buf_size));)rt(i,255&i.gzhead.extra[i.gzindex]),i.gzindex++;i.gzhead.hcrc&&i.pending>s&&(t.adler=a(t.adler,i.pending_buf,i.pending-s,s)),i.gzindex===i.gzhead.extra.length&&(i.gzindex=0,i.status=j)}else i.status=j;if(i.status===j)if(i.gzhead.name){s=i.pending;do{if(i.pending===i.pending_buf_size&&(i.gzhead.hcrc&&i.pending>s&&(t.adler=a(t.adler,i.pending_buf,i.pending-s,s)),tt(t),s=i.pending,i.pending===i.pending_buf_size)){u=1;break}u=i.gzindexs&&(t.adler=a(t.adler,i.pending_buf,i.pending-s,s)),0===u&&(i.gzindex=0,i.status=Z)}else i.status=Z;if(i.status===Z)if(i.gzhead.comment){s=i.pending;do{if(i.pending===i.pending_buf_size&&(i.gzhead.hcrc&&i.pending>s&&(t.adler=a(t.adler,i.pending_buf,i.pending-s,s)),tt(t),s=i.pending,i.pending===i.pending_buf_size)){u=1;break}u=i.gzindexs&&(t.adler=a(t.adler,i.pending_buf,i.pending-s,s)),0===u&&(i.status=W)}else i.status=W;if(i.status===W&&(i.gzhead.hcrc?(i.pending+2>i.pending_buf_size&&tt(t),i.pending+2<=i.pending_buf_size&&(rt(i,255&t.adler),rt(i,t.adler>>8&255),t.adler=0,i.status=Y)):i.status=Y),0!==i.pending){if(tt(t),0===t.avail_out)return i.last_flush=-1,p}else if(0===t.avail_in&&$(e)<=$(r)&&e!==c)return G(t,v);if(i.status===H&&0!==t.avail_in)return G(t,v);if(0!==t.avail_in||0!==i.lookahead||e!==h&&i.status!==H){var y=i.strategy===b?function(t,e){for(var r;;){if(0===t.lookahead&&(ot(t),0===t.lookahead)){if(e===h)return q;break}if(t.match_length=0,r=o._tr_tally(t,0,t.window[t.strstart]),t.lookahead--,t.strstart++,r&&(et(t,!1),0===t.strm.avail_out))return q}return t.insert=0,e===c?(et(t,!0),0===t.strm.avail_out?X:V):t.last_lit&&(et(t,!1),0===t.strm.avail_out)?q:K}(i,e):i.strategy===k?function(t,e){for(var r,n,i,s,a=t.window;;){if(t.lookahead<=D){if(ot(t),t.lookahead<=D&&e===h)return q;if(0===t.lookahead)break}if(t.match_length=0,t.lookahead>=P&&t.strstart>0&&(n=a[i=t.strstart-1])===a[++i]&&n===a[++i]&&n===a[++i]){s=t.strstart+D;do{}while(n===a[++i]&&n===a[++i]&&n===a[++i]&&n===a[++i]&&n===a[++i]&&n===a[++i]&&n===a[++i]&&n===a[++i]&&it.lookahead&&(t.match_length=t.lookahead)}if(t.match_length>=P?(r=o._tr_tally(t,1,t.match_length-P),t.lookahead-=t.match_length,t.strstart+=t.match_length,t.match_length=0):(r=o._tr_tally(t,0,t.window[t.strstart]),t.lookahead--,t.strstart++),r&&(et(t,!1),0===t.strm.avail_out))return q}return t.insert=0,e===c?(et(t,!0),0===t.strm.avail_out?X:V):t.last_lit&&(et(t,!1),0===t.strm.avail_out)?q:K}(i,e):n[i.level].func(i,e);if(y!==X&&y!==V||(i.status=H),y===q||y===X)return 0===t.avail_out&&(i.last_flush=-1),p;if(y===K&&(e===f?o._tr_align(i):e!==d&&(o._tr_stored_block(i,0,0,!1),e===l&&(Q(i.head),0===i.lookahead&&(i.strstart=0,i.block_start=0,i.insert=0))),tt(t),0===t.avail_out))return i.last_flush=-1,p}return e!==c?p:i.wrap<=0?g:(2===i.wrap?(rt(i,255&t.adler),rt(i,t.adler>>8&255),rt(i,t.adler>>16&255),rt(i,t.adler>>24&255),rt(i,255&t.total_in),rt(i,t.total_in>>8&255),rt(i,t.total_in>>16&255),rt(i,t.total_in>>24&255)):(nt(i,t.adler>>>16),nt(i,65535&t.adler)),tt(t),i.wrap>0&&(i.wrap=-i.wrap),0!==i.pending?p:g)},e.deflateEnd=function(t){var e;return t&&t.state?(e=t.state.status)!==F&&e!==M&&e!==j&&e!==Z&&e!==W&&e!==Y&&e!==H?G(t,m):(t.state=null,e===Y?G(t,_):p):m},e.deflateSetDictionary=function(t,e){var r,n,o,a,u,h,f,l,c=e.length;if(!t||!t.state)return m;if(2===(a=(r=t.state).wrap)||1===a&&r.status!==F||r.lookahead)return m;for(1===a&&(t.adler=s(t.adler,e,c,0)),r.wrap=0,c>=r.w_size&&(0===a&&(Q(r.head),r.strstart=0,r.block_start=0,r.insert=0),l=new i.Buf8(r.w_size),i.arraySet(l,e,c-r.w_size,r.w_size,0),e=l,c=r.w_size),u=t.avail_in,h=t.next_in,f=t.input,t.avail_in=c,t.next_in=0,t.input=e,ot(r);r.lookahead>=P;){n=r.strstart,o=r.lookahead-(P-1);do{r.ins_h=(r.ins_h<=0;)t[e]=0}var h=0,f=1,l=2,c=29,d=256,p=d+1+c,g=30,m=19,_=2*p+1,v=15,y=16,w=7,b=256,k=16,x=17,E=18,S=[0,0,0,0,0,0,0,0,1,1,1,1,2,2,2,2,3,3,3,3,4,4,4,4,5,5,5,5,0],A=[0,0,0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7,8,8,9,9,10,10,11,11,12,12,13,13],C=[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,3,7],T=[16,17,18,0,8,7,9,6,10,5,11,4,12,3,13,2,14,1,15],R=new Array(2*(p+2));u(R);var I=new Array(2*g);u(I);var O=new Array(512);u(O);var B=new Array(256);u(B);var z=new Array(c);u(z);var L,P,D,U=new Array(g);function N(t,e,r,n,i){this.static_tree=t,this.extra_bits=e,this.extra_base=r,this.elems=n,this.max_length=i,this.has_stree=t&&t.length}function F(t,e){this.dyn_tree=t,this.max_code=0,this.stat_desc=e}function M(t){return t<256?O[t]:O[256+(t>>>7)]}function j(t,e){t.pending_buf[t.pending++]=255&e,t.pending_buf[t.pending++]=e>>>8&255}function Z(t,e,r){t.bi_valid>y-r?(t.bi_buf|=e<>y-t.bi_valid,t.bi_valid+=r-y):(t.bi_buf|=e<>>=1,r<<=1}while(--e>0);return r>>>1}function H(t,e,r){var n,i,o=new Array(v+1),s=0;for(n=1;n<=v;n++)o[n]=s=s+r[n-1]<<1;for(i=0;i<=e;i++){var a=t[2*i+1];0!==a&&(t[2*i]=Y(o[a]++,a))}}function q(t){var e;for(e=0;e8?j(t,t.bi_buf):t.bi_valid>0&&(t.pending_buf[t.pending++]=t.bi_buf),t.bi_buf=0,t.bi_valid=0}function X(t,e,r,n){var i=2*e,o=2*r;return t[i]>1;r>=1;r--)V(t,o,r);i=u;do{r=t.heap[1],t.heap[1]=t.heap[t.heap_len--],V(t,o,1),n=t.heap[1],t.heap[--t.heap_max]=r,t.heap[--t.heap_max]=n,o[2*i]=o[2*r]+o[2*n],t.depth[i]=(t.depth[r]>=t.depth[n]?t.depth[r]:t.depth[n])+1,o[2*r+1]=o[2*n+1]=i,t.heap[1]=i++,V(t,o,1)}while(t.heap_len>=2);t.heap[--t.heap_max]=t.heap[1],function(t,e){var r,n,i,o,s,a,u=e.dyn_tree,h=e.max_code,f=e.stat_desc.static_tree,l=e.stat_desc.has_stree,c=e.stat_desc.extra_bits,d=e.stat_desc.extra_base,p=e.stat_desc.max_length,g=0;for(o=0;o<=v;o++)t.bl_count[o]=0;for(u[2*t.heap[t.heap_max]+1]=0,r=t.heap_max+1;r<_;r++)(o=u[2*u[2*(n=t.heap[r])+1]+1]+1)>p&&(o=p,g++),u[2*n+1]=o,n>h||(t.bl_count[o]++,s=0,n>=d&&(s=c[n-d]),a=u[2*n],t.opt_len+=a*(o+s),l&&(t.static_len+=a*(f[2*n+1]+s)));if(0!==g){do{for(o=p-1;0===t.bl_count[o];)o--;t.bl_count[o]--,t.bl_count[o+1]+=2,t.bl_count[p]--,g-=2}while(g>0);for(o=p;0!==o;o--)for(n=t.bl_count[o];0!==n;)(i=t.heap[--r])>h||(u[2*i+1]!==o&&(t.opt_len+=(o-u[2*i+1])*u[2*i],u[2*i+1]=o),n--)}}(t,e),H(o,h,t.bl_count)}function $(t,e,r){var n,i,o=-1,s=e[1],a=0,u=7,h=4;for(0===s&&(u=138,h=3),e[2*(r+1)+1]=65535,n=0;n<=r;n++)i=s,s=e[2*(n+1)+1],++a>=7;n0?(t.strm.data_type===a&&(t.strm.data_type=function(t){var e,r=4093624447;for(e=0;e<=31;e++,r>>>=1)if(1&r&&0!==t.dyn_ltree[2*e])return o;if(0!==t.dyn_ltree[18]||0!==t.dyn_ltree[20]||0!==t.dyn_ltree[26])return s;for(e=32;e=3&&0===t.bl_tree[2*T[e]+1];e--);return t.opt_len+=3*(e+1)+5+5+4,e}(t),u=t.opt_len+3+7>>>3,(h=t.static_len+3+7>>>3)<=u&&(u=h)):u=h=r+5,r+4<=u&&-1!==e?et(t,e,r,n):t.strategy===i||h===u?(Z(t,(f<<1)+(n?1:0),3),J(t,R,I)):(Z(t,(l<<1)+(n?1:0),3),function(t,e,r,n){var i;for(Z(t,e-257,5),Z(t,r-1,5),Z(t,n-4,4),i=0;i>>8&255,t.pending_buf[t.d_buf+2*t.last_lit+1]=255&e,t.pending_buf[t.l_buf+t.last_lit]=255&r,t.last_lit++,0===e?t.dyn_ltree[2*r]++:(t.matches++,e--,t.dyn_ltree[2*(B[r]+d+1)]++,t.dyn_dtree[2*M(e)]++),t.last_lit===t.lit_bufsize-1},e._tr_align=function(t){Z(t,f<<1,3),W(t,b,R),function(t){16===t.bi_valid?(j(t,t.bi_buf),t.bi_buf=0,t.bi_valid=0):t.bi_valid>=8&&(t.pending_buf[t.pending++]=255&t.bi_buf,t.bi_buf>>=8,t.bi_valid-=8)}(t)}},function(t,e,r){"use strict";var n=r(91),i=r(4),o=r(42),s=r(44),a=r(23),u=r(43),h=r(94),f=Object.prototype.toString;function l(t){if(!(this instanceof l))return new l(t);this.options=i.assign({chunkSize:16384,windowBits:0,to:""},t||{});var e=this.options;e.raw&&e.windowBits>=0&&e.windowBits<16&&(e.windowBits=-e.windowBits,0===e.windowBits&&(e.windowBits=-15)),!(e.windowBits>=0&&e.windowBits<16)||t&&t.windowBits||(e.windowBits+=32),e.windowBits>15&&e.windowBits<48&&0==(15&e.windowBits)&&(e.windowBits|=15),this.err=0,this.msg="",this.ended=!1,this.chunks=[],this.strm=new u,this.strm.avail_out=0;var r=n.inflateInit2(this.strm,e.windowBits);if(r!==s.Z_OK)throw new Error(a[r]);if(this.header=new h,n.inflateGetHeader(this.strm,this.header),e.dictionary&&("string"==typeof e.dictionary?e.dictionary=o.string2buf(e.dictionary):"[object ArrayBuffer]"===f.call(e.dictionary)&&(e.dictionary=new Uint8Array(e.dictionary)),e.raw&&(r=n.inflateSetDictionary(this.strm,e.dictionary))!==s.Z_OK))throw new Error(a[r])}function c(t,e){var r=new l(e);if(r.push(t,!0),r.err)throw r.msg||a[r.err];return r.result}l.prototype.push=function(t,e){var r,a,u,h,l,c=this.strm,d=this.options.chunkSize,p=this.options.dictionary,g=!1;if(this.ended)return!1;a=e===~~e?e:!0===e?s.Z_FINISH:s.Z_NO_FLUSH,"string"==typeof t?c.input=o.binstring2buf(t):"[object ArrayBuffer]"===f.call(t)?c.input=new Uint8Array(t):c.input=t,c.next_in=0,c.avail_in=c.input.length;do{if(0===c.avail_out&&(c.output=new i.Buf8(d),c.next_out=0,c.avail_out=d),(r=n.inflate(c,s.Z_NO_FLUSH))===s.Z_NEED_DICT&&p&&(r=n.inflateSetDictionary(this.strm,p)),r===s.Z_BUF_ERROR&&!0===g&&(r=s.Z_OK,g=!1),r!==s.Z_STREAM_END&&r!==s.Z_OK)return this.onEnd(r),this.ended=!0,!1;c.next_out&&(0!==c.avail_out&&r!==s.Z_STREAM_END&&(0!==c.avail_in||a!==s.Z_FINISH&&a!==s.Z_SYNC_FLUSH)||("string"===this.options.to?(u=o.utf8border(c.output,c.next_out),h=c.next_out-u,l=o.buf2string(c.output,u),c.next_out=h,c.avail_out=d-h,h&&i.arraySet(c.output,c.output,u,h,0),this.onData(l)):this.onData(i.shrinkBuf(c.output,c.next_out)))),0===c.avail_in&&0===c.avail_out&&(g=!0)}while((c.avail_in>0||0===c.avail_out)&&r!==s.Z_STREAM_END);return r===s.Z_STREAM_END&&(a=s.Z_FINISH),a===s.Z_FINISH?(r=n.inflateEnd(this.strm),this.onEnd(r),this.ended=!0,r===s.Z_OK):a!==s.Z_SYNC_FLUSH||(this.onEnd(s.Z_OK),c.avail_out=0,!0)},l.prototype.onData=function(t){this.chunks.push(t)},l.prototype.onEnd=function(t){t===s.Z_OK&&("string"===this.options.to?this.result=this.chunks.join(""):this.result=i.flattenChunks(this.chunks)),this.chunks=[],this.err=t,this.msg=this.strm.msg},e.Inflate=l,e.inflate=c,e.inflateRaw=function(t,e){return(e=e||{}).raw=!0,c(t,e)},e.ungzip=c},function(t,e,r){"use strict";var n=r(4),i=r(40),o=r(41),s=r(92),a=r(93),u=0,h=1,f=2,l=4,c=5,d=6,p=0,g=1,m=2,_=-2,v=-3,y=-4,w=-5,b=8,k=1,x=2,E=3,S=4,A=5,C=6,T=7,R=8,I=9,O=10,B=11,z=12,L=13,P=14,D=15,U=16,N=17,F=18,M=19,j=20,Z=21,W=22,Y=23,H=24,q=25,K=26,X=27,V=28,J=29,G=30,$=31,Q=32,tt=852,et=592,rt=15;function nt(t){return(t>>>24&255)+(t>>>8&65280)+((65280&t)<<8)+((255&t)<<24)}function it(){this.mode=0,this.last=!1,this.wrap=0,this.havedict=!1,this.flags=0,this.dmax=0,this.check=0,this.total=0,this.head=null,this.wbits=0,this.wsize=0,this.whave=0,this.wnext=0,this.window=null,this.hold=0,this.bits=0,this.length=0,this.offset=0,this.extra=0,this.lencode=null,this.distcode=null,this.lenbits=0,this.distbits=0,this.ncode=0,this.nlen=0,this.ndist=0,this.have=0,this.next=null,this.lens=new n.Buf16(320),this.work=new n.Buf16(288),this.lendyn=null,this.distdyn=null,this.sane=0,this.back=0,this.was=0}function ot(t){var e;return t&&t.state?(e=t.state,t.total_in=t.total_out=e.total=0,t.msg="",e.wrap&&(t.adler=1&e.wrap),e.mode=k,e.last=0,e.havedict=0,e.dmax=32768,e.head=null,e.hold=0,e.bits=0,e.lencode=e.lendyn=new n.Buf32(tt),e.distcode=e.distdyn=new n.Buf32(et),e.sane=1,e.back=-1,p):_}function st(t){var e;return t&&t.state?((e=t.state).wsize=0,e.whave=0,e.wnext=0,ot(t)):_}function at(t,e){var r,n;return t&&t.state?(n=t.state,e<0?(r=0,e=-e):(r=1+(e>>4),e<48&&(e&=15)),e&&(e<8||e>15)?_:(null!==n.window&&n.wbits!==e&&(n.window=null),n.wrap=r,n.wbits=e,st(t))):_}function ut(t,e){var r,n;return t?(n=new it,t.state=n,n.window=null,(r=at(t,e))!==p&&(t.state=null),r):_}var ht,ft,lt=!0;function ct(t){if(lt){var e;for(ht=new n.Buf32(512),ft=new n.Buf32(32),e=0;e<144;)t.lens[e++]=8;for(;e<256;)t.lens[e++]=9;for(;e<280;)t.lens[e++]=7;for(;e<288;)t.lens[e++]=8;for(a(h,t.lens,0,288,ht,0,t.work,{bits:9}),e=0;e<32;)t.lens[e++]=5;a(f,t.lens,0,32,ft,0,t.work,{bits:5}),lt=!1}t.lencode=ht,t.lenbits=9,t.distcode=ft,t.distbits=5}function dt(t,e,r,i){var o,s=t.state;return null===s.window&&(s.wsize=1<=s.wsize?(n.arraySet(s.window,e,r-s.wsize,s.wsize,0),s.wnext=0,s.whave=s.wsize):((o=s.wsize-s.wnext)>i&&(o=i),n.arraySet(s.window,e,r-i,o,s.wnext),(i-=o)?(n.arraySet(s.window,e,r-i,i,0),s.wnext=i,s.whave=s.wsize):(s.wnext+=o,s.wnext===s.wsize&&(s.wnext=0),s.whave>>8&255,r.check=o(r.check,Ct,2,0),at=0,ut=0,r.mode=x;break}if(r.flags=0,r.head&&(r.head.done=!1),!(1&r.wrap)||(((255&at)<<8)+(at>>8))%31){t.msg="incorrect header check",r.mode=G;break}if((15&at)!==b){t.msg="unknown compression method",r.mode=G;break}if(ut-=4,kt=8+(15&(at>>>=4)),0===r.wbits)r.wbits=kt;else if(kt>r.wbits){t.msg="invalid window size",r.mode=G;break}r.dmax=1<>8&1),512&r.flags&&(Ct[0]=255&at,Ct[1]=at>>>8&255,r.check=o(r.check,Ct,2,0)),at=0,ut=0,r.mode=E;case E:for(;ut<32;){if(0===ot)break t;ot--,at+=tt[rt++]<>>8&255,Ct[2]=at>>>16&255,Ct[3]=at>>>24&255,r.check=o(r.check,Ct,4,0)),at=0,ut=0,r.mode=S;case S:for(;ut<16;){if(0===ot)break t;ot--,at+=tt[rt++]<>8),512&r.flags&&(Ct[0]=255&at,Ct[1]=at>>>8&255,r.check=o(r.check,Ct,2,0)),at=0,ut=0,r.mode=A;case A:if(1024&r.flags){for(;ut<16;){if(0===ot)break t;ot--,at+=tt[rt++]<>>8&255,r.check=o(r.check,Ct,2,0)),at=0,ut=0}else r.head&&(r.head.extra=null);r.mode=C;case C:if(1024&r.flags&&((lt=r.length)>ot&&(lt=ot),lt&&(r.head&&(kt=r.head.extra_len-r.length,r.head.extra||(r.head.extra=new Array(r.head.extra_len)),n.arraySet(r.head.extra,tt,rt,lt,kt)),512&r.flags&&(r.check=o(r.check,tt,lt,rt)),ot-=lt,rt+=lt,r.length-=lt),r.length))break t;r.length=0,r.mode=T;case T:if(2048&r.flags){if(0===ot)break t;lt=0;do{kt=tt[rt+lt++],r.head&&kt&&r.length<65536&&(r.head.name+=String.fromCharCode(kt))}while(kt&<>9&1,r.head.done=!0),t.adler=r.check=0,r.mode=z;break;case O:for(;ut<32;){if(0===ot)break t;ot--,at+=tt[rt++]<>>=7&ut,ut-=7&ut,r.mode=X;break}for(;ut<3;){if(0===ot)break t;ot--,at+=tt[rt++]<>>=1)){case 0:r.mode=P;break;case 1:if(ct(r),r.mode=j,e===d){at>>>=2,ut-=2;break t}break;case 2:r.mode=N;break;case 3:t.msg="invalid block type",r.mode=G}at>>>=2,ut-=2;break;case P:for(at>>>=7&ut,ut-=7&ut;ut<32;){if(0===ot)break t;ot--,at+=tt[rt++]<>>16^65535)){t.msg="invalid stored block lengths",r.mode=G;break}if(r.length=65535&at,at=0,ut=0,r.mode=D,e===d)break t;case D:r.mode=U;case U:if(lt=r.length){if(lt>ot&&(lt=ot),lt>st&&(lt=st),0===lt)break t;n.arraySet(et,tt,rt,lt,it),ot-=lt,rt+=lt,st-=lt,it+=lt,r.length-=lt;break}r.mode=z;break;case N:for(;ut<14;){if(0===ot)break t;ot--,at+=tt[rt++]<>>=5,ut-=5,r.ndist=1+(31&at),at>>>=5,ut-=5,r.ncode=4+(15&at),at>>>=4,ut-=4,r.nlen>286||r.ndist>30){t.msg="too many length or distance symbols",r.mode=G;break}r.have=0,r.mode=F;case F:for(;r.have>>=3,ut-=3}for(;r.have<19;)r.lens[Tt[r.have++]]=0;if(r.lencode=r.lendyn,r.lenbits=7,Et={bits:r.lenbits},xt=a(u,r.lens,0,19,r.lencode,0,r.work,Et),r.lenbits=Et.bits,xt){t.msg="invalid code lengths set",r.mode=G;break}r.have=0,r.mode=M;case M:for(;r.have>>16&255,vt=65535&At,!((mt=At>>>24)<=ut);){if(0===ot)break t;ot--,at+=tt[rt++]<>>=mt,ut-=mt,r.lens[r.have++]=vt;else{if(16===vt){for(St=mt+2;ut>>=mt,ut-=mt,0===r.have){t.msg="invalid bit length repeat",r.mode=G;break}kt=r.lens[r.have-1],lt=3+(3&at),at>>>=2,ut-=2}else if(17===vt){for(St=mt+3;ut>>=mt)),at>>>=3,ut-=3}else{for(St=mt+7;ut>>=mt)),at>>>=7,ut-=7}if(r.have+lt>r.nlen+r.ndist){t.msg="invalid bit length repeat",r.mode=G;break}for(;lt--;)r.lens[r.have++]=kt}}if(r.mode===G)break;if(0===r.lens[256]){t.msg="invalid code -- missing end-of-block",r.mode=G;break}if(r.lenbits=9,Et={bits:r.lenbits},xt=a(h,r.lens,0,r.nlen,r.lencode,0,r.work,Et),r.lenbits=Et.bits,xt){t.msg="invalid literal/lengths set",r.mode=G;break}if(r.distbits=6,r.distcode=r.distdyn,Et={bits:r.distbits},xt=a(f,r.lens,r.nlen,r.ndist,r.distcode,0,r.work,Et),r.distbits=Et.bits,xt){t.msg="invalid distances set",r.mode=G;break}if(r.mode=j,e===d)break t;case j:r.mode=Z;case Z:if(ot>=6&&st>=258){t.next_out=it,t.avail_out=st,t.next_in=rt,t.avail_in=ot,r.hold=at,r.bits=ut,s(t,ft),it=t.next_out,et=t.output,st=t.avail_out,rt=t.next_in,tt=t.input,ot=t.avail_in,at=r.hold,ut=r.bits,r.mode===z&&(r.back=-1);break}for(r.back=0;_t=(At=r.lencode[at&(1<>>16&255,vt=65535&At,!((mt=At>>>24)<=ut);){if(0===ot)break t;ot--,at+=tt[rt++]<>yt)])>>>16&255,vt=65535&At,!(yt+(mt=At>>>24)<=ut);){if(0===ot)break t;ot--,at+=tt[rt++]<>>=yt,ut-=yt,r.back+=yt}if(at>>>=mt,ut-=mt,r.back+=mt,r.length=vt,0===_t){r.mode=K;break}if(32&_t){r.back=-1,r.mode=z;break}if(64&_t){t.msg="invalid literal/length code",r.mode=G;break}r.extra=15&_t,r.mode=W;case W:if(r.extra){for(St=r.extra;ut>>=r.extra,ut-=r.extra,r.back+=r.extra}r.was=r.length,r.mode=Y;case Y:for(;_t=(At=r.distcode[at&(1<>>16&255,vt=65535&At,!((mt=At>>>24)<=ut);){if(0===ot)break t;ot--,at+=tt[rt++]<>yt)])>>>16&255,vt=65535&At,!(yt+(mt=At>>>24)<=ut);){if(0===ot)break t;ot--,at+=tt[rt++]<>>=yt,ut-=yt,r.back+=yt}if(at>>>=mt,ut-=mt,r.back+=mt,64&_t){t.msg="invalid distance code",r.mode=G;break}r.offset=vt,r.extra=15&_t,r.mode=H;case H:if(r.extra){for(St=r.extra;ut>>=r.extra,ut-=r.extra,r.back+=r.extra}if(r.offset>r.dmax){t.msg="invalid distance too far back",r.mode=G;break}r.mode=q;case q:if(0===st)break t;if(lt=ft-st,r.offset>lt){if((lt=r.offset-lt)>r.whave&&r.sane){t.msg="invalid distance too far back",r.mode=G;break}lt>r.wnext?(lt-=r.wnext,pt=r.wsize-lt):pt=r.wnext-lt,lt>r.length&&(lt=r.length),gt=r.window}else gt=et,pt=it-r.offset,lt=r.length;lt>st&&(lt=st),st-=lt,r.length-=lt;do{et[it++]=gt[pt++]}while(--lt);0===r.length&&(r.mode=Z);break;case K:if(0===st)break t;et[it++]=r.length,st--,r.mode=Z;break;case X:if(r.wrap){for(;ut<32;){if(0===ot)break t;ot--,at|=tt[rt++]<>>=w=y>>>24,p-=w,0===(w=y>>>16&255))A[o++]=65535&y;else{if(!(16&w)){if(0==(64&w)){y=g[(65535&y)+(d&(1<>>=w,p-=w),p<15&&(d+=S[n++]<>>=w=y>>>24,p-=w,!(16&(w=y>>>16&255))){if(0==(64&w)){y=m[(65535&y)+(d&(1<u){t.msg="invalid distance too far back",r.mode=30;break t}if(d>>>=w,p-=w,k>(w=o-s)){if((w=k-w)>f&&r.sane){t.msg="invalid distance too far back",r.mode=30;break t}if(x=0,E=c,0===l){if(x+=h-w,w2;)A[o++]=E[x++],A[o++]=E[x++],A[o++]=E[x++],b-=3;b&&(A[o++]=E[x++],b>1&&(A[o++]=E[x++]))}else{x=o-k;do{A[o++]=A[x++],A[o++]=A[x++],A[o++]=A[x++],b-=3}while(b>2);b&&(A[o++]=A[x++],b>1&&(A[o++]=A[x++]))}break}}break}}while(n>3,d&=(1<<(p-=b<<3))-1,t.next_in=n,t.next_out=o,t.avail_in=n=1&&0===P[A];A--);if(C>A&&(C=A),0===A)return h[f++]=20971520,h[f++]=20971520,c.bits=1,0;for(S=1;S0&&(0===t||1!==A))return-1;for(D[1]=0,x=1;x<15;x++)D[x+1]=D[x]+P[x];for(E=0;E852||2===t&&O>592)return 1;for(;;){y=x-R,l[E]v?(w=U[N+l[E]],b=z[L+l[E]]):(w=96,b=0),d=1<>R)+(p-=d)]=y<<24|w<<16|b|0}while(0!==p);for(d=1<>=1;if(0!==d?(B&=d-1,B+=d):B=0,E++,0==--P[x]){if(x===A)break;x=e[r+l[E]]}if(x>C&&(B&m)!==g){for(0===R&&(R=C),_+=S,I=1<<(T=x-R);T+R852||2===t&&O>592)return 1;h[g=B&m]=C<<24|T<<16|_-f|0}}return 0!==B&&(h[_+B]=x-R<<24|64<<16|0),c.bits=C,0}},function(t,e,r){"use strict";t.exports=function(){this.text=0,this.time=0,this.xflags=0,this.os=0,this.extra=null,this.extra_len=0,this.name="",this.comment="",this.hcrc=0,this.done=!1}},function(t,e,r){"use strict";var n=r(0),i=r(1),o=r(6),s=r(22),a=r(45),u=function(t,e){var r,n="";for(r=0;r>>=8;return n},h=function(t,e,r,i,h,f){var l,c,d=t.file,p=t.compression,g=f!==o.utf8encode,m=n.transformTo("string",f(d.name)),_=n.transformTo("string",o.utf8encode(d.name)),v=d.comment,y=n.transformTo("string",f(v)),w=n.transformTo("string",o.utf8encode(v)),b=_.length!==d.name.length,k=w.length!==v.length,x="",E="",S="",A=d.dir,C=d.date,T={crc32:0,compressedSize:0,uncompressedSize:0};e&&!r||(T.crc32=t.crc32,T.compressedSize=t.compressedSize,T.uncompressedSize=t.uncompressedSize);var R=0;e&&(R|=8),g||!b&&!k||(R|=2048);var I,O,B,z=0,L=0;A&&(z|=16),"UNIX"===h?(L=798,z|=(I=d.unixPermissions,O=A,B=I,I||(B=O?16893:33204),(65535&B)<<16)):(L=20,z|=63&(d.dosPermissions||0)),l=C.getUTCHours(),l<<=6,l|=C.getUTCMinutes(),l<<=5,l|=C.getUTCSeconds()/2,c=C.getUTCFullYear()-1980,c<<=4,c|=C.getUTCMonth()+1,c<<=5,c|=C.getUTCDate(),b&&(E=u(1,1)+u(s(m),4)+_,x+="up"+u(E.length,2)+E),k&&(S=u(1,1)+u(s(y),4)+w,x+="uc"+u(S.length,2)+S);var P="";return P+="\n\0",P+=u(R,2),P+=p.magic,P+=u(l,2),P+=u(c,2),P+=u(T.crc32,4),P+=u(T.compressedSize,4),P+=u(T.uncompressedSize,4),P+=u(m.length,2),P+=u(x.length,2),{fileRecord:a.LOCAL_FILE_HEADER+P+m+x,dirRecord:a.CENTRAL_FILE_HEADER+u(L,2)+P+u(y.length,2)+"\0\0\0\0"+u(z,4)+u(i,4)+m+x+y}},f=function(t){return a.DATA_DESCRIPTOR+u(t.crc32,4)+u(t.compressedSize,4)+u(t.uncompressedSize,4)};function l(t,e,r,n){i.call(this,"ZipFileWorker"),this.bytesWritten=0,this.zipComment=e,this.zipPlatform=r,this.encodeFileName=n,this.streamFiles=t,this.accumulate=!1,this.contentBuffer=[],this.dirRecords=[],this.currentSourceOffset=0,this.entriesCount=0,this.currentFile=null,this._sources=[]}n.inherits(l,i),l.prototype.push=function(t){var e=t.meta.percent||0,r=this.entriesCount,n=this._sources.length;this.accumulate?this.contentBuffer.push(t):(this.bytesWritten+=t.data.length,i.prototype.push.call(this,{data:t.data,meta:{currentFile:this.currentFile,percent:r?(e+100*(r-n-1))/r:100}}))},l.prototype.openedSource=function(t){this.currentSourceOffset=this.bytesWritten,this.currentFile=t.file.name;var e=this.streamFiles&&!t.file.dir;if(e){var r=h(t,e,!1,this.currentSourceOffset,this.zipPlatform,this.encodeFileName);this.push({data:r.fileRecord,meta:{percent:0}})}else this.accumulate=!0},l.prototype.closedSource=function(t){this.accumulate=!1;var e=this.streamFiles&&!t.file.dir,r=h(t,e,!0,this.currentSourceOffset,this.zipPlatform,this.encodeFileName);if(this.dirRecords.push(r.dirRecord),e)this.push({data:f(t),meta:{percent:100}});else for(this.push({data:r.fileRecord,meta:{percent:0}});this.contentBuffer.length;)this.push(this.contentBuffer.shift());this.currentFile=null},l.prototype.flush=function(){for(var t=this.bytesWritten,e=0;e1)throw new Error("Multi-volumes zip are not supported")},readLocalFiles:function(){var t,e;for(t=0;t0)this.isSignature(e,o.CENTRAL_FILE_HEADER)||(this.reader.zero=n);else if(n<0)throw new Error("Corrupted zip: missing "+Math.abs(n)+" bytes.")},prepareReader:function(t){this.reader=n(t)},load:function(t){this.prepareReader(t),this.readEndOfCentral(),this.readCentralDir(),this.readLocalFiles()}},t.exports=u},function(t,e,r){"use strict";var n=r(48);function i(t){n.call(this,t)}r(0).inherits(i,n),i.prototype.byteAt=function(t){return this.data.charCodeAt(this.zero+t)},i.prototype.lastIndexOfSignature=function(t){return this.data.lastIndexOf(t)-this.zero},i.prototype.readAndCheckSignature=function(t){return t===this.readData(4)},i.prototype.readData=function(t){this.checkOffset(t);var e=this.data.slice(this.zero+this.index,this.zero+this.index+t);return this.index+=t,e},t.exports=i},function(t,e,r){"use strict";var n=r(49);function i(t){n.call(this,t)}r(0).inherits(i,n),i.prototype.readData=function(t){this.checkOffset(t);var e=this.data.slice(this.zero+this.index,this.zero+this.index+t);return this.index+=t,e},t.exports=i},function(t,e,r){"use strict";var n=r(46),i=r(0),o=r(21),s=r(22),a=r(6),u=r(39),h=r(3);function f(t,e){this.options=t,this.loadOptions=e}f.prototype={isEncrypted:function(){return 1==(1&this.bitFlag)},useUTF8:function(){return 2048==(2048&this.bitFlag)},readLocalPart:function(t){var e,r;if(t.skip(22),this.fileNameLength=t.readInt(2),r=t.readInt(2),this.fileName=t.readData(this.fileNameLength),t.skip(r),-1===this.compressedSize||-1===this.uncompressedSize)throw new Error("Bug or corrupted zip : didn't get enough informations from the central directory (compressedSize === -1 || uncompressedSize === -1)");if(null===(e=function(t){for(var e in u)if(u.hasOwnProperty(e)&&u[e].magic===t)return u[e];return null}(this.compressionMethod)))throw new Error("Corrupted zip : compression "+i.pretty(this.compressionMethod)+" unknown (inner file : "+i.transformTo("string",this.fileName)+")");this.decompressed=new o(this.compressedSize,this.uncompressedSize,this.crc32,e,t.readData(this.compressedSize))},readCentralPart:function(t){this.versionMadeBy=t.readInt(2),t.skip(2),this.bitFlag=t.readInt(2),this.compressionMethod=t.readString(2),this.date=t.readDate(),this.crc32=t.readInt(4),this.compressedSize=t.readInt(4),this.uncompressedSize=t.readInt(4);var e=t.readInt(2);if(this.extraFieldsLength=t.readInt(2),this.fileCommentLength=t.readInt(2),this.diskNumberStart=t.readInt(2),this.internalFileAttributes=t.readInt(2),this.externalFileAttributes=t.readInt(4),this.localHeaderOffset=t.readInt(4),this.isEncrypted())throw new Error("Encrypted zip are not supported");t.skip(e),this.readExtraFields(t),this.parseZIP64ExtraField(t),this.fileComment=t.readData(this.fileCommentLength)},processAttributes:function(){this.unixPermissions=null,this.dosPermissions=null;var t=this.versionMadeBy>>8;this.dir=!!(16&this.externalFileAttributes),0===t&&(this.dosPermissions=63&this.externalFileAttributes),3===t&&(this.unixPermissions=this.externalFileAttributes>>16&65535),this.dir||"/"!==this.fileNameStr.slice(-1)||(this.dir=!0)},parseZIP64ExtraField:function(t){if(this.extraFields[1]){var e=n(this.extraFields[1].value);this.uncompressedSize===i.MAX_VALUE_32BITS&&(this.uncompressedSize=e.readInt(8)),this.compressedSize===i.MAX_VALUE_32BITS&&(this.compressedSize=e.readInt(8)),this.localHeaderOffset===i.MAX_VALUE_32BITS&&(this.localHeaderOffset=e.readInt(8)),this.diskNumberStart===i.MAX_VALUE_32BITS&&(this.diskNumberStart=e.readInt(4))}},readExtraFields:function(t){var e,r,n,i=t.index+this.extraFieldsLength;for(this.extraFields||(this.extraFields={});t.index Date: Tue, 24 Dec 2019 13:01:23 +0300 Subject: [PATCH 102/188] fix codacy issues part3 --- cvat-core/src/session.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/cvat-core/src/session.js b/cvat-core/src/session.js index e5bfe41de4c1..2b116e704fa0 100644 --- a/cvat-core/src/session.js +++ b/cvat-core/src/session.js @@ -10,7 +10,7 @@ (() => { const PluginRegistry = require('./plugins'); const serverProxy = require('./server-proxy'); - const { getFrame, getRanges, getPreview} = require('./frames'); + const { getFrame, getRanges, getPreview } = require('./frames'); const { ArgumentError } = require('./exceptions'); const { TaskStatus } = require('./enums'); const { Label } = require('./labels'); From 38503c726aab50a92e1df8690db4114fd15751af Mon Sep 17 00:00:00 2001 From: Andrey Zhavoronkov Date: Tue, 24 Dec 2019 13:07:02 +0300 Subject: [PATCH 103/188] fix codacy issues part4 --- cvat-core/src/frames.js | 165 ++++++++---------- .../engine/static/engine/js/cvat-core.min.js | 2 +- 2 files changed, 78 insertions(+), 89 deletions(-) diff --git a/cvat-core/src/frames.js b/cvat-core/src/frames.js index 9fb15adae8a2..b731f872aa02 100644 --- a/cvat-core/src/frames.js +++ b/cvat-core/src/frames.js @@ -13,7 +13,7 @@ const PluginRegistry = require('./plugins'); const serverProxy = require('./server-proxy'); const { isBrowser, isNode } = require('browser-or-node'); - const { Exception, ArgumentError} = require('./exceptions'); + const { Exception, ArgumentError } = require('./exceptions'); // This is the frames storage const frameDataCache = {}; @@ -87,9 +87,22 @@ } FrameData.prototype.data.implementation = async function (onServerRequest) { - return new Promise( async (resolve, reject) => { + return new Promise((resolve, reject) => { + const { provider } = frameDataCache[this.tid]; + const { chunkSize } = frameDataCache[this.tid]; + const start = Math.max( + this.startFrame, + parseInt(this.number / chunkSize, 10) * chunkSize, + ); + const stop = Math.min( + this.stopFrame, + (parseInt(this.number / chunkSize, 10) + 1) * chunkSize - 1, + ); + const chunkNumber = Math.floor(this.number / chunkSize); + const onDecodeAll = (frameNumber) => { - if (frameDataCache[this.tid].activeChunkRequest && chunkNumber === frameDataCache[this.tid].activeChunkRequest.chunkNumber) { + if (frameDataCache[this.tid].activeChunkRequest + && chunkNumber === frameDataCache[this.tid].activeChunkRequest.chunkNumber) { const callbackArray = frameDataCache[this.tid].activeChunkRequest.callbacks; for (const callback of callbackArray) { callback.resolve(provider.frame(frameNumber)); @@ -99,7 +112,8 @@ }; const rejectRequestAll = () => { - if (frameDataCache[this.tid].activeChunkRequest && chunkNumber === frameDataCache[this.tid].activeChunkRequest.chunkNumber) { + if (frameDataCache[this.tid].activeChunkRequest + && chunkNumber === frameDataCache[this.tid].activeChunkRequest.chunkNumber) { for (const r of frameDataCache[this.tid].activeChunkRequest.callbacks) { r.reject(r.frameNumber); } @@ -108,17 +122,16 @@ }; const makeActiveRequest = () => { - const activeChunk = frameDataCache[this.tid].activeChunkRequest - activeChunk.request = serverProxy.frames.getData(this.tid, activeChunk.chunkNumber).then( - (chunk) => { - frameDataCache[this.tid].activeChunkRequest.completed = true; - provider.requestDecodeBlock(chunk, - frameDataCache[this.tid].activeChunkRequest.start, - frameDataCache[this.tid].activeChunkRequest.stop, - frameDataCache[this.tid].activeChunkRequest.onDecodeAll, - frameDataCache[this.tid].activeChunkRequest.rejectRequestAll - ); - }).catch(exception => { + const activeChunk = frameDataCache[this.tid].activeChunkRequest; + activeChunk.request = serverProxy.frames.getData(this.tid, + activeChunk.chunkNumber).then((chunk) => { + frameDataCache[this.tid].activeChunkRequest.completed = true; + provider.requestDecodeBlock(chunk, + frameDataCache[this.tid].activeChunkRequest.start, + frameDataCache[this.tid].activeChunkRequest.stop, + frameDataCache[this.tid].activeChunkRequest.onDecodeAll, + frameDataCache[this.tid].activeChunkRequest.rejectRequestAll); + }).catch((exception) => { if (exception instanceof Exception) { reject(exception); } else { @@ -138,22 +151,16 @@ }); }; - const { provider } = frameDataCache[this.tid]; - const { chunkSize } = frameDataCache[this.tid]; - const start = Math.max(this.startFrame, parseInt(this.number / chunkSize, 10) * chunkSize); - const stop = Math.min(this.stopFrame, (parseInt(this.number / chunkSize, 10) + 1) * chunkSize - 1); - const chunkNumber = Math.floor(this.number / chunkSize); - if (isNode) { - resolve("Dummy data"); + resolve('Dummy data'); } else if (isBrowser) { - try { - const { decodedBlocksCacheSize } = frameDataCache[this.tid]; - let frame = await provider.frame(this.number); + provider.frame(this.number).then((frame) => { if (frame === null) { onServerRequest(); if (!provider.is_chunk_cached(start, stop)) { - if (!frameDataCache[this.tid].activeChunkRequest || (frameDataCache[this.tid].activeChunkRequest && frameDataCache[this.tid].activeChunkRequest.completed)) { + if (!frameDataCache[this.tid].activeChunkRequest + || (frameDataCache[this.tid].activeChunkRequest + && frameDataCache[this.tid].activeChunkRequest.completed)) { if (frameDataCache[this.tid].activeChunkRequest) { frameDataCache[this.tid].activeChunkRequest.rejectRequestAll(); } @@ -172,34 +179,34 @@ }], }; makeActiveRequest(); + } else if (frameDataCache[this.tid].activeChunkRequest.chunkNumber + === chunkNumber) { + frameDataCache[this.tid].activeChunkRequest.callbacks.push({ + resolve, + reject, + frameNumber: this.number, + }); } else { - if (frameDataCache[this.tid].activeChunkRequest.chunkNumber === chunkNumber) { - frameDataCache[this.tid].activeChunkRequest.callbacks.push({ + if (frameDataCache[this.tid].nextChunkRequest) { + const { callbacks } = frameDataCache[this.tid].nextChunkRequest; + for (const r of callbacks) { + r.reject(r.frameNumber); + } + } + frameDataCache[this.tid].nextChunkRequest = { + request: undefined, + chunkNumber, + start, + stop, + onDecodeAll, + rejectRequestAll, + completed: false, + callbacks: [{ resolve, reject, frameNumber: this.number, - }); - } else { - if (frameDataCache[this.tid].nextChunkRequest) { - for (const r of frameDataCache[this.tid].nextChunkRequest.callbacks) { - r.reject(r.frameNumber); - } - } - frameDataCache[this.tid].nextChunkRequest = { - request: undefined, - chunkNumber, - start, - stop, - onDecodeAll, - rejectRequestAll, - completed: false, - callbacks: [{ - resolve, - reject, - frameNumber: this.number, - }], - }; - } + }], + }; } } else { frameDataCache[this.tid].activeChunkRequest.callbacks.push({ @@ -207,49 +214,27 @@ reject, frameNumber: this.number, }); - provider.requestDecodeBlock(null, start, stop, onDecodeAll, rejectRequestAll); + provider.requestDecodeBlock(null, start, stop, + onDecodeAll, rejectRequestAll); } } else { - // if (this.number % chunkSize > 1 && !provider.isNextChunkExists(this.number) && decodedBlocksCacheSize > 1) { - // const nextChunkNumber = chunkNumber + 1; - // const nextStart = Math.max(this.startFrame, nextChunkNumber * chunkSize); - // const nextStop = Math.min(this.stopFrame, (nextChunkNumber + 1) * chunkSize - 1); - - // if (nextStart < this.stopFrame) { - // provider.setReadyToLoading(nextChunkNumber); - // if (!provider.is_chunk_cached(nextStart, nextStop)){ - // serverProxy.frames.getData(this.tid, nextChunkNumber).then(nextChunk =>{ - // provider.requestDecodeBlock(nextChunk, nextStart, nextStop, undefined, undefined); - // }).catch(exception => { - // if (exception instanceof Exception) { - // reject(exception); - // } else { - // reject(new Exception(exception.message)); - // } - // }); - // } else { - // provider.requestDecodeBlock(null, nextStart, nextStop, undefined, undefined); - // } - // } - // } resolve(frame); } - } catch (exception) { + }).catch((exception) => { if (exception instanceof Exception) { reject(exception); } else { reject(new Exception(exception.message)); } - } + }); } }); }; async function getPreview(taskID) { - return new Promise(async (resolve, reject) => { - try { - // Just go to server and get preview (no any cache) - const result = await serverProxy.frames.getPreview(taskID); + return new Promise((resolve, reject) => { + // Just go to server and get preview (no any cache) + serverProxy.frames.getPreview(taskID).then((result) => { if (isNode) { resolve(global.Buffer.from(result, 'binary').toString('base64')); } else if (isBrowser) { @@ -259,9 +244,9 @@ }; reader.readAsDataURL(result); } - } catch (error) { + }).catch((error) => { reject(error); - } + }); }); } @@ -291,16 +276,20 @@ : cvatData.BlockType.ARCHIVE; const meta = await serverProxy.frames.getMeta(taskID); - // limit of decoded frames cache by 2GB for video (max height of video frame is 1080) and 500 frames for archive - const decodedBlocksCacheSize = blockType === cvatData.BlockType.MP4VIDEO ? - Math.floor(2147483648 / 1920 / 1080 / 4 / chunkSize) || 1: - Math.floor(500 / chunkSize) || 1; + // limit of decoded frames cache by 2GB for video (max height of video frame is 1080) + // and 500 frames for archive + const decodedBlocksCacheSize = blockType === cvatData.BlockType.MP4VIDEO + ? Math.floor(2147483648 / 1920 / 1080 / 4 / chunkSize) || 1 + : Math.floor(500 / chunkSize) || 1; frameDataCache[taskID] = { meta, chunkSize, - provider: new cvatData.FrameProvider(blockType, chunkSize, 9, decodedBlocksCacheSize, 1), - lastFrameRequest : frame, + provider: new cvatData.FrameProvider( + blockType, chunkSize, 9, + decodedBlocksCacheSize, 1, + ), + lastFrameRequest: frame, decodedBlocksCacheSize, activeChunkRequest: undefined, nextChunkRequest: undefined, @@ -311,7 +300,7 @@ frameDataCache[taskID].lastFrameRequest = frame; frameDataCache[taskID].provider.setRenderSize(size.width, size.height); return new FrameData(size.width, size.height, taskID, frame, startFrame, stopFrame); - }; + } function getRanges(taskID) { if (!(taskID in frameDataCache)) { diff --git a/cvat/apps/engine/static/engine/js/cvat-core.min.js b/cvat/apps/engine/static/engine/js/cvat-core.min.js index 9d0fe14d3a04..086294187607 100644 --- a/cvat/apps/engine/static/engine/js/cvat-core.min.js +++ b/cvat/apps/engine/static/engine/js/cvat-core.min.js @@ -11,5 +11,5 @@ window.cvat=function(t){var e={};function n(r){if(e[r])return e[r].exports;var i * @author Feross Aboukhadijeh * @license MIT */ -t.exports=function(t){return null!=t&&null!=t.constructor&&"function"==typeof t.constructor.isBuffer&&t.constructor.isBuffer(t)}},function(t,e,n){"use strict";var r=n(68),i=n(7),o=n(193),s=n(194);function a(t){this.defaults=t,this.interceptors={request:new o,response:new o}}a.prototype.request=function(t){"string"==typeof t&&(t=i.merge({url:arguments[0]},arguments[1])),(t=i.merge(r,{method:"get"},this.defaults,t)).method=t.method.toLowerCase();var e=[s,void 0],n=Promise.resolve(t);for(this.interceptors.request.forEach((function(t){e.unshift(t.fulfilled,t.rejected)})),this.interceptors.response.forEach((function(t){e.push(t.fulfilled,t.rejected)}));e.length;)n=n.then(e.shift(),e.shift());return n},i.forEach(["delete","get","head","options"],(function(t){a.prototype[t]=function(e,n){return this.request(i.merge(n||{},{method:t,url:e}))}})),i.forEach(["post","put","patch"],(function(t){a.prototype[t]=function(e,n,r){return this.request(i.merge(r||{},{method:t,url:e,data:n}))}})),t.exports=a},function(t,e,n){"use strict";var r=n(7);t.exports=function(t,e){r.forEach(t,(function(n,r){r!==e&&r.toUpperCase()===e.toUpperCase()&&(t[e]=n,delete t[r])}))}},function(t,e,n){"use strict";var r=n(114);t.exports=function(t,e,n){var i=n.config.validateStatus;n.status&&i&&!i(n.status)?e(r("Request failed with status code "+n.status,n.config,null,n.request,n)):t(n)}},function(t,e,n){"use strict";t.exports=function(t,e,n,r,i){return t.config=e,n&&(t.code=n),t.request=r,t.response=i,t}},function(t,e,n){"use strict";var r=n(7);function i(t){return encodeURIComponent(t).replace(/%40/gi,"@").replace(/%3A/gi,":").replace(/%24/g,"$").replace(/%2C/gi,",").replace(/%20/g,"+").replace(/%5B/gi,"[").replace(/%5D/gi,"]")}t.exports=function(t,e,n){if(!e)return t;var o;if(n)o=n(e);else if(r.isURLSearchParams(e))o=e.toString();else{var s=[];r.forEach(e,(function(t,e){null!=t&&(r.isArray(t)?e+="[]":t=[t],r.forEach(t,(function(t){r.isDate(t)?t=t.toISOString():r.isObject(t)&&(t=JSON.stringify(t)),s.push(i(e)+"="+i(t))})))})),o=s.join("&")}return o&&(t+=(-1===t.indexOf("?")?"?":"&")+o),t}},function(t,e,n){"use strict";var r=n(7),i=["age","authorization","content-length","content-type","etag","expires","from","host","if-modified-since","if-unmodified-since","last-modified","location","max-forwards","proxy-authorization","referer","retry-after","user-agent"];t.exports=function(t){var e,n,o,s={};return t?(r.forEach(t.split("\n"),(function(t){if(o=t.indexOf(":"),e=r.trim(t.substr(0,o)).toLowerCase(),n=r.trim(t.substr(o+1)),e){if(s[e]&&i.indexOf(e)>=0)return;s[e]="set-cookie"===e?(s[e]?s[e]:[]).concat([n]):s[e]?s[e]+", "+n:n}})),s):s}},function(t,e,n){"use strict";var r=n(7);t.exports=r.isStandardBrowserEnv()?function(){var t,e=/(msie|trident)/i.test(navigator.userAgent),n=document.createElement("a");function i(t){var r=t;return e&&(n.setAttribute("href",r),r=n.href),n.setAttribute("href",r),{href:n.href,protocol:n.protocol?n.protocol.replace(/:$/,""):"",host:n.host,search:n.search?n.search.replace(/^\?/,""):"",hash:n.hash?n.hash.replace(/^#/,""):"",hostname:n.hostname,port:n.port,pathname:"/"===n.pathname.charAt(0)?n.pathname:"/"+n.pathname}}return t=i(window.location.href),function(e){var n=r.isString(e)?i(e):e;return n.protocol===t.protocol&&n.host===t.host}}():function(){return!0}},function(t,e,n){"use strict";var r=n(7);t.exports=r.isStandardBrowserEnv()?{write:function(t,e,n,i,o,s){var a=[];a.push(t+"="+encodeURIComponent(e)),r.isNumber(n)&&a.push("expires="+new Date(n).toGMTString()),r.isString(i)&&a.push("path="+i),r.isString(o)&&a.push("domain="+o),!0===s&&a.push("secure"),document.cookie=a.join("; ")},read:function(t){var e=document.cookie.match(new RegExp("(^|;\\s*)("+t+")=([^;]*)"));return e?decodeURIComponent(e[3]):null},remove:function(t){this.write(t,"",Date.now()-864e5)}}:{write:function(){},read:function(){return null},remove:function(){}}},function(t,e,n){"use strict";var r=n(7);function i(){this.handlers=[]}i.prototype.use=function(t,e){return this.handlers.push({fulfilled:t,rejected:e}),this.handlers.length-1},i.prototype.eject=function(t){this.handlers[t]&&(this.handlers[t]=null)},i.prototype.forEach=function(t){r.forEach(this.handlers,(function(e){null!==e&&t(e)}))},t.exports=i},function(t,e,n){"use strict";var r=n(7),i=n(195),o=n(115),s=n(68),a=n(196),c=n(197);function u(t){t.cancelToken&&t.cancelToken.throwIfRequested()}t.exports=function(t){return u(t),t.baseURL&&!a(t.url)&&(t.url=c(t.baseURL,t.url)),t.headers=t.headers||{},t.data=i(t.data,t.headers,t.transformRequest),t.headers=r.merge(t.headers.common||{},t.headers[t.method]||{},t.headers||{}),r.forEach(["delete","get","head","post","put","patch","common"],(function(e){delete t.headers[e]})),(t.adapter||s.adapter)(t).then((function(e){return u(t),e.data=i(e.data,e.headers,t.transformResponse),e}),(function(e){return o(e)||(u(t),e&&e.response&&(e.response.data=i(e.response.data,e.response.headers,t.transformResponse))),Promise.reject(e)}))}},function(t,e,n){"use strict";var r=n(7);t.exports=function(t,e,n){return r.forEach(n,(function(n){t=n(t,e)})),t}},function(t,e,n){"use strict";t.exports=function(t){return/^([a-z][a-z\d\+\-\.]*:)?\/\//i.test(t)}},function(t,e,n){"use strict";t.exports=function(t,e){return e?t.replace(/\/+$/,"")+"/"+e.replace(/^\/+/,""):t}},function(t,e,n){"use strict";var r=n(116);function i(t){if("function"!=typeof t)throw new TypeError("executor must be a function.");var e;this.promise=new Promise((function(t){e=t}));var n=this;t((function(t){n.reason||(n.reason=new r(t),e(n.reason))}))}i.prototype.throwIfRequested=function(){if(this.reason)throw this.reason},i.source=function(){var t;return{token:new i((function(e){t=e})),cancel:t}},t.exports=i},function(t,e,n){"use strict";t.exports=function(t){return function(e){return t.apply(null,e)}}},function(t,e,n){"use strict";var r=n(12),i=n(201).trim;r({target:"String",proto:!0,forced:n(202)("trim")},{trim:function(){return i(this)}})},function(t,e,n){var r=n(31),i="["+n(118)+"]",o=RegExp("^"+i+i+"*"),s=RegExp(i+i+"*$"),a=function(t){return function(e){var n=String(r(e));return 1&t&&(n=n.replace(o,"")),2&t&&(n=n.replace(s,"")),n}};t.exports={start:a(1),end:a(2),trim:a(3)}},function(t,e,n){var r=n(3),i=n(118);t.exports=function(t){return r((function(){return!!i[t]()||"​…᠎"!="​…᠎"[t]()||i[t].name!==t}))}},function(t,e,n){(function(e){n(5),n(11),n(204),n(10),(()=>{const r=n(205),i=n(36),o=n(26),{isBrowser:s,isNode:a}=n(246),{Exception:c,ArgumentError:u}=n(6),l={};class f{constructor(t,e,n,r,i,o){Object.defineProperties(this,Object.freeze({width:{value:t,writable:!1},height:{value:e,writable:!1},tid:{value:n,writable:!1},number:{value:r,writable:!1},startFrame:{value:i,writable:!1},stopFrame:{value:o,writable:!1}}))}async data(t=(()=>{})){return await i.apiWrapper.call(this,f.prototype.data,t)}}f.prototype.data.implementation=async function(t){return new Promise(async(e,n)=>{const r=t=>{if(l[this.tid].activeChunkRequest&&b===l[this.tid].activeChunkRequest.chunkNumber){const e=l[this.tid].activeChunkRequest.callbacks;for(const n of e)n.resolve(f.frame(t));l[this.tid].activeChunkRequest=void 0}},i=()=>{if(l[this.tid].activeChunkRequest&&b===l[this.tid].activeChunkRequest.chunkNumber){for(const t of l[this.tid].activeChunkRequest.callbacks)t.reject(t.frameNumber);l[this.tid].activeChunkRequest=void 0}},u=()=>{const t=l[this.tid].activeChunkRequest;t.request=o.frames.getData(this.tid,t.chunkNumber).then(t=>{l[this.tid].activeChunkRequest.completed=!0,f.requestDecodeBlock(t,l[this.tid].activeChunkRequest.start,l[this.tid].activeChunkRequest.stop,l[this.tid].activeChunkRequest.onDecodeAll,l[this.tid].activeChunkRequest.rejectRequestAll)}).catch(t=>{n(t instanceof c?t:new c(t.message))}).finally(()=>{if(l[this.tid].nextChunkRequest){if(l[this.tid].activeChunkRequest)for(const t of l[this.tid].activeChunkRequest.callbacks)t.reject(t.frameNumber);l[this.tid].activeChunkRequest=l[this.tid].nextChunkRequest,l[this.tid].nextChunkRequest=void 0,u()}})},{provider:f}=l[this.tid],{chunkSize:p}=l[this.tid],h=Math.max(this.startFrame,parseInt(this.number/p,10)*p),d=Math.min(this.stopFrame,(parseInt(this.number/p,10)+1)*p-1),b=Math.floor(this.number/p);if(a)e("Dummy data");else if(s)try{const{decodedBlocksCacheSize:o}=l[this.tid];let s=await f.frame(this.number);if(null===s)if(t(),f.is_chunk_cached(h,d))l[this.tid].activeChunkRequest.callbacks.push({resolve:e,reject:n,frameNumber:this.number}),f.requestDecodeBlock(null,h,d,r,i);else if(!l[this.tid].activeChunkRequest||l[this.tid].activeChunkRequest&&l[this.tid].activeChunkRequest.completed)l[this.tid].activeChunkRequest&&l[this.tid].activeChunkRequest.rejectRequestAll(),l[this.tid].activeChunkRequest={request:void 0,chunkNumber:b,start:h,stop:d,onDecodeAll:r,rejectRequestAll:i,completed:!1,callbacks:[{resolve:e,reject:n,frameNumber:this.number}]},u();else if(l[this.tid].activeChunkRequest.chunkNumber===b)l[this.tid].activeChunkRequest.callbacks.push({resolve:e,reject:n,frameNumber:this.number});else{if(l[this.tid].nextChunkRequest)for(const t of l[this.tid].nextChunkRequest.callbacks)t.reject(t.frameNumber);l[this.tid].nextChunkRequest={request:void 0,chunkNumber:b,start:h,stop:d,onDecodeAll:r,rejectRequestAll:i,completed:!1,callbacks:[{resolve:e,reject:n,frameNumber:this.number}]}}else e(s)}catch(t){n(t instanceof c?t:new c(t.message))}})},t.exports={FrameData:f,getFrame:async function(t,e,n,i,s,a,c){if(!(t in l)){const i="video"===n?r.BlockType.MP4VIDEO:r.BlockType.ARCHIVE,a=await o.frames.getMeta(t),c=i===r.BlockType.MP4VIDEO?Math.floor(258.90765432098766/e)||1:Math.floor(500/e)||1;l[t]={meta:a,chunkSize:e,provider:new r.FrameProvider(i,e,9,c,1),lastFrameRequest:s,decodedBlocksCacheSize:c,activeChunkRequest:void 0,nextChunkRequest:void 0}}const p=(t=>{let e=null;if("interpolation"===i)[e]=t;else{if("annotation"!==i)throw new u(`Invalid mode is specified ${i}`);if(s>=t.length)throw new u(`Meta information about frame ${s} can't be received from the server`);e=t[s]}return e})(l[t].meta);return l[t].lastFrameRequest=s,l[t].provider.setRenderSize(p.width,p.height),new f(p.width,p.height,t,s,a,c)},getRanges:function(t){return t in l?l[t].provider.cachedFrames:[]},getPreview:async function(t){return new Promise(async(n,r)=>{try{const r=await o.frames.getPreview(t);if(a)n(e.Buffer.from(r,"binary").toString("base64"));else if(s){const t=new FileReader;t.onload=()=>{n(t.result)},t.readAsDataURL(r)}}catch(t){r(t)}})}}})()}).call(this,n(30))},function(t,e,n){"use strict";var r=n(12),i=n(24),o=n(94),s=n(32),a=n(98),c=n(101),u=n(18);r({target:"Promise",proto:!0,real:!0},{finally:function(t){var e=a(this,s("Promise")),n="function"==typeof t;return this.then(n?function(n){return c(e,t()).then((function(){return n}))}:t,n?function(n){return c(e,t()).then((function(){throw n}))}:t)}}),i||"function"!=typeof o||o.prototype.finally||u(o.prototype,"finally",s("Promise").prototype.finally)},function(t,e,n){n(72),n(225),n(227),n(243);const{MP4Reader:r,Bytestream:i}=n(245),o=Object.freeze({MP4VIDEO:"mp4video",ARCHIVE:"archive"});class s{constructor(){this._lock=Promise.resolve()}_acquire(){var t;return this._lock=new Promise(e=>{t=e}),t}acquireQueued(){const t=this._lock.then(()=>e),e=this._acquire();return t}}t.exports={FrameProvider:class{constructor(t,e,n,r=5,i=2){this._frames={},this._cachedBlockCount=Math.max(1,n),this._decodedBlocksCacheSize=r,this._blocks_ranges=[],this._blocks={},this._blockSize=e,this._running=!1,this._blockType=t,this._currFrame=-1,this._requestedBlockDecode=null,this._width=null,this._height=null,this._decodingBlocks={},this._decodeThreadCount=0,this._timerId=setTimeout(this._worker.bind(this),100),this._mutex=new s,this._promisedFrames={},this._maxWorkerThreadCount=i}async _worker(){null!=this._requestedBlockDecode&&this._decodeThreadCountthis._cachedBlockCount){const t=this._blocks_ranges.shift(),[e,n]=t.split(":").map(t=>+t);delete this._blocks[e/this._blockSize];for(let t=e;t<=n;t++)delete this._frames[t]}const t=Math.floor(this._decodedBlocksCacheSize/2);for(let e=0;e+t);if(rthis._currFrame+t*this._blockSize)for(let t=n;t<=r;t++)delete this._frames[t]}}async requestDecodeBlock(t,e,n,r,i){const o=await this._mutex.acquireQueued();null!==this._requestedBlockDecode&&(e===this._requestedBlockDecode.start&&n===this._requestedBlockDecode.end?(this._requestedBlockDecode.resolveCallback=r,this._requestedBlockDecode.rejectCallback=i):this._requestedBlockDecode.rejectCallback&&this._requestedBlockDecode.rejectCallback()),`${e}:${n}`in this._decodingBlocks?(this._decodingBlocks[`${e}:${n}`].rejectCallback=i,this._decodingBlocks[`${e}:${n}`].resolveCallback=r):(null===t&&(t=this._blocks[Math.floor((e+1)/this.blockSize)]),this._requestedBlockDecode={block:t,start:e,end:n,resolveCallback:r,rejectCallback:i}),o()}isRequestExist(){return null!=this._requestedBlockDecode}setRenderSize(t,e){this._width=t,this._height=e}async frame(t){return this._currFrame=t,new Promise((e,n)=>{t in this._frames?null!==this._frames[t]?e(this._frames[t]):this._promisedFrames[t]={resolve:e,reject:n}:e(null)})}isNextChunkExists(t){const e=Math.floor(t/this._blockSize)+1;return"loading"===this._blocks[e]||e in this._blocks}setReadyToLoading(t){this._blocks[t]="loading"}cropImage(t,e,n,r,i,o,s){if(0===r&&o===e&&0===i&&s===n)return new ImageData(new Uint8ClampedArray(t),o,s);const a=new Uint32Array(t),c=o*s*4,u=new ArrayBuffer(c),l=new Uint32Array(u),f=new Uint8ClampedArray(u);if(e===o)return new ImageData(new Uint8ClampedArray(t,4*i,c),o,s);let p=0;for(let t=i;t{if(r.data.consoleLog)return;const i=Math.ceil(this._height/r.data.height);this._frames[o]=this.cropImage(r.data.buf,r.data.width,r.data.height,0,0,Math.floor(n/i),Math.floor(e/i)),this._decodingBlocks[`${s}:${a}`].resolveCallback&&this._decodingBlocks[`${s}:${a}`].resolveCallback(o),o in this._promisedFrames&&(this._promisedFrames[o].resolve(this._frames[o]),delete this._promisedFrames[o]),o===a&&(this._decodeThreadCount--,delete this._decodingBlocks[`${s}:${a}`],t.terminate()),o++},t.onerror=e=>{console.log(["ERROR: Line ",e.lineno," in ",e.filename,": ",e.message].join("")),t.terminate(),this._decodeThreadCount--;for(let t=o;t<=a;t++)t in this._promisedFrames&&(this._promisedFrames[t].reject(),delete this._promisedFrames[t]);this._decodingBlocks[`${s}:${a}`].rejectCallback&&this._decodingBlocks[`${s}:${a}`].rejectCallback(),delete this._decodingBlocks[`${s}:${a}`]},t.postMessage({type:"Broadway.js - Worker init",options:{rgb:!0,reuseMemory:!1}});const u=new r(new i(c));u.read();const l=u.tracks[1],f=u.tracks[1].trak.mdia.minf.stbl.stsd.avc1.avcC,p=f.sps[0],h=f.pps[0];t.postMessage({buf:p,offset:0,length:p.length}),t.postMessage({buf:h,offset:0,length:h.length});for(let e=0;e{t.postMessage({buf:e,offset:0,length:e.length})});this._decodeThreadCount++}else{const t=new Worker("/static/engine/js/unzip_imgs.js");t.onerror=t=>{console.log(["ERROR: Line ",t.lineno," in ",t.filename,": ",t.message].join(""));for(let t=s;t<=a;t++)t in this._promisedFrames&&(this._promisedFrames[t].reject(),delete this._promisedFrames[t]);this._decodingBlocks[`${s}:${a}`].rejectCallback&&this._decodingBlocks[`${s}:${a}`].rejectCallback(),this._decodeThreadCount--},t.onmessage=t=>{this._frames[t.data.index]={data:t.data.data,width:n,height:e},this._decodingBlocks[`${s}:${a}`].resolveCallback&&this._decodingBlocks[`${s}:${a}`].resolveCallback(t.data.index),t.data.index in this._promisedFrames&&(this._promisedFrames[t.data.index].resolve(this._frames[t.data.index]),delete this._promisedFrames[t.data.index]),t.data.isEnd&&(delete this._decodingBlocks[`${s}:${a}`],this._decodeThreadCount--)},t.postMessage({block:c,start:s,end:a}),this._decodeThreadCount++}t()}get decodeThreadCount(){return this._decodeThreadCount}get cachedFrames(){return[...this._blocks_ranges].sort((t,e)=>t.split(":")[0]-e.split(":")[0])}},BlockType:o}},function(t,e,n){var r=n(16),i=n(38),o="".split;t.exports=r((function(){return!Object("z").propertyIsEnumerable(0)}))?function(t){return"String"==i(t)?o.call(t,""):Object(t)}:Object},function(t,e,n){var r=n(8),i=n(123),o=n(19),s=r("unscopables"),a=Array.prototype;null==a[s]&&o(a,s,i(null)),t.exports=function(t){a[s][t]=!0}},function(t,e,n){var r=n(1),i=n(73),o=r["__core-js_shared__"]||i("__core-js_shared__",{});t.exports=o},function(t,e,n){var r=n(16);t.exports=!!Object.getOwnPropertySymbols&&!r((function(){return!String(Symbol())}))},function(t,e,n){var r=n(28),i=n(39),o=n(17),s=n(211);t.exports=r?Object.defineProperties:function(t,e){o(t);for(var n,r=s(e),a=r.length,c=0;a>c;)i.f(t,n=r[c++],e[n]);return t}},function(t,e,n){var r=n(124),i=n(77);t.exports=Object.keys||function(t){return r(t,i)}},function(t,e,n){var r=n(50),i=n(125),o=n(213),s=function(t){return function(e,n,s){var a,c=r(e),u=i(c.length),l=o(s,u);if(t&&n!=n){for(;u>l;)if((a=c[l++])!=a)return!0}else for(;u>l;l++)if((t||l in c)&&c[l]===n)return t||l||0;return!t&&-1}};t.exports={includes:s(!0),indexOf:s(!1)}},function(t,e,n){var r=n(126),i=Math.max,o=Math.min;t.exports=function(t,e){var n=r(t);return n<0?i(n+e,0):o(n,e)}},function(t,e,n){var r=n(1),i=n(129),o=r.WeakMap;t.exports="function"==typeof o&&/native code/.test(i.call(o))},function(t,e,n){"use strict";var r=n(80),i=n(221),o=n(132),s=n(223),a=n(82),c=n(19),u=n(54),l=n(8),f=n(52),p=n(40),h=n(131),d=h.IteratorPrototype,b=h.BUGGY_SAFARI_ITERATORS,m=l("iterator"),g=function(){return this};t.exports=function(t,e,n,l,h,v,y){i(n,e,l);var w,k,x,O=function(t){if(t===h&&T)return T;if(!b&&t in _)return _[t];switch(t){case"keys":case"values":case"entries":return function(){return new n(this,t)}}return function(){return new n(this)}},j=e+" Iterator",S=!1,_=t.prototype,A=_[m]||_["@@iterator"]||h&&_[h],T=!b&&A||O(h),P="Array"==e&&_.entries||A;if(P&&(w=o(P.call(new t)),d!==Object.prototype&&w.next&&(f||o(w)===d||(s?s(w,d):"function"!=typeof w[m]&&c(w,m,g)),a(w,j,!0,!0),f&&(p[j]=g))),"values"==h&&A&&"values"!==A.name&&(S=!0,T=function(){return A.call(this)}),f&&!y||_[m]===T||c(_,m,T),p[e]=T,h)if(k={values:O("values"),keys:v?T:O("keys"),entries:O("entries")},y)for(x in k)!b&&!S&&x in _||u(_,x,k[x]);else r({target:e,proto:!0,forced:b||S},k);return k}},function(t,e,n){"use strict";var r={}.propertyIsEnumerable,i=Object.getOwnPropertyDescriptor,o=i&&!r.call({1:2},1);e.f=o?function(t){var e=i(this,t);return!!e&&e.enumerable}:r},function(t,e,n){var r=n(20),i=n(218),o=n(81),s=n(39);t.exports=function(t,e){for(var n=i(e),a=s.f,c=o.f,u=0;us;){var a,c,u,l=r[s++],f=o?l.ok:l.fail,p=l.resolve,h=l.reject,d=l.domain;try{f?(o||(2===e.rejection&&et(t,e),e.rejection=1),!0===f?a=i:(d&&d.enter(),a=f(i),d&&(d.exit(),u=!0)),a===l.promise?h($("Promise-chain cycle")):(c=K(a))?c.call(a,p,h):p(a)):h(i)}catch(t){d&&!u&&d.exit(),h(t)}}e.reactions=[],e.notified=!1,n&&!e.rejection&&Q(t,e)}))}},Y=function(t,e,n){var r,i;V?((r=B.createEvent("Event")).promise=e,r.reason=n,r.initEvent(t,!1,!0),u.dispatchEvent(r)):r={promise:e,reason:n},(i=u["on"+t])?i(r):"unhandledrejection"===t&&_("Unhandled promise rejection",n)},Q=function(t,e){O.call(u,(function(){var n,r=e.value;if(tt(e)&&(n=T((function(){J?U.emit("unhandledRejection",r,t):Y("unhandledrejection",t,r)})),e.rejection=J||tt(e)?2:1,n.error))throw n.value}))},tt=function(t){return 1!==t.rejection&&!t.parent},et=function(t,e){O.call(u,(function(){J?U.emit("rejectionHandled",t):Y("rejectionhandled",t,e.value)}))},nt=function(t,e,n,r){return function(i){t(e,n,i,r)}},rt=function(t,e,n,r){e.done||(e.done=!0,r&&(e=r),e.value=n,e.state=2,Z(t,e,!0))},it=function(t,e,n,r){if(!e.done){e.done=!0,r&&(e=r);try{if(t===n)throw $("Promise can't be resolved itself");var i=K(n);i?j((function(){var r={done:!1};try{i.call(n,nt(it,t,r,e),nt(rt,t,r,e))}catch(n){rt(t,r,n,e)}})):(e.value=n,e.state=1,Z(t,e,!1))}catch(n){rt(t,{done:!1},n,e)}}};H&&(D=function(t){v(this,D,F),g(t),r.call(this);var e=M(this);try{t(nt(it,this,e),nt(rt,this,e))}catch(t){rt(this,e,t)}},(r=function(t){N(this,{type:F,done:!1,notified:!1,parent:!1,reactions:[],rejection:!1,state:0,value:void 0})}).prototype=h(D.prototype,{then:function(t,e){var n=R(this),r=W(x(this,D));return r.ok="function"!=typeof t||t,r.fail="function"==typeof e&&e,r.domain=J?U.domain:void 0,n.parent=!0,n.reactions.push(r),0!=n.state&&Z(this,n,!1),r.promise},catch:function(t){return this.then(void 0,t)}}),i=function(){var t=new r,e=M(t);this.promise=t,this.resolve=nt(it,t,e),this.reject=nt(rt,t,e)},A.f=W=function(t){return t===D||t===o?new i(t):G(t)},c||"function"!=typeof f||(s=f.prototype.then,p(f.prototype,"then",(function(t,e){var n=this;return new D((function(t,e){s.call(n,t,e)})).then(t,e)}),{unsafe:!0}),"function"==typeof L&&a({global:!0,enumerable:!0,forced:!0},{fetch:function(t){return S(D,L.apply(u,arguments))}}))),a({global:!0,wrap:!0,forced:H},{Promise:D}),d(D,F,!1,!0),b(F),o=l.Promise,a({target:F,stat:!0,forced:H},{reject:function(t){var e=W(this);return e.reject.call(void 0,t),e.promise}}),a({target:F,stat:!0,forced:c||H},{resolve:function(t){return S(c&&this===o?D:this,t)}}),a({target:F,stat:!0,forced:X},{all:function(t){var e=this,n=W(e),r=n.resolve,i=n.reject,o=T((function(){var n=g(e.resolve),o=[],s=0,a=1;w(t,(function(t){var c=s++,u=!1;o.push(void 0),a++,n.call(e,t).then((function(t){u||(u=!0,o[c]=t,--a||r(o))}),i)})),--a||r(o)}));return o.error&&i(o.value),n.promise},race:function(t){var e=this,n=W(e),r=n.reject,i=T((function(){var i=g(e.resolve);w(t,(function(t){i.call(e,t).then(n.resolve,r)}))}));return i.error&&r(i.value),n.promise}})},function(t,e,n){var r=n(1);t.exports=r.Promise},function(t,e,n){var r=n(54);t.exports=function(t,e,n){for(var i in e)r(t,i,e[i],n);return t}},function(t,e,n){"use strict";var r=n(53),i=n(39),o=n(8),s=n(28),a=o("species");t.exports=function(t){var e=r(t),n=i.f;s&&e&&!e[a]&&n(e,a,{configurable:!0,get:function(){return this}})}},function(t,e){t.exports=function(t,e,n){if(!(t instanceof e))throw TypeError("Incorrect "+(n?n+" ":"")+"invocation");return t}},function(t,e,n){var r=n(17),i=n(233),o=n(125),s=n(134),a=n(234),c=n(236),u=function(t,e){this.stopped=t,this.result=e};(t.exports=function(t,e,n,l,f){var p,h,d,b,m,g,v,y=s(e,n,l?2:1);if(f)p=t;else{if("function"!=typeof(h=a(t)))throw TypeError("Target is not iterable");if(i(h)){for(d=0,b=o(t.length);b>d;d++)if((m=l?y(r(v=t[d])[0],v[1]):y(t[d]))&&m instanceof u)return m;return new u(!1)}p=h.call(t)}for(g=p.next;!(v=g.call(p)).done;)if("object"==typeof(m=c(p,y,v.value,l))&&m&&m instanceof u)return m;return new u(!1)}).stop=function(t){return new u(!0,t)}},function(t,e,n){var r=n(8),i=n(40),o=r("iterator"),s=Array.prototype;t.exports=function(t){return void 0!==t&&(i.Array===t||s[o]===t)}},function(t,e,n){var r=n(235),i=n(40),o=n(8)("iterator");t.exports=function(t){if(null!=t)return t[o]||t["@@iterator"]||i[r(t)]}},function(t,e,n){var r=n(38),i=n(8)("toStringTag"),o="Arguments"==r(function(){return arguments}());t.exports=function(t){var e,n,s;return void 0===t?"Undefined":null===t?"Null":"string"==typeof(n=function(t,e){try{return t[e]}catch(t){}}(e=Object(t),i))?n:o?r(e):"Object"==(s=r(e))&&"function"==typeof e.callee?"Arguments":s}},function(t,e,n){var r=n(17);t.exports=function(t,e,n,i){try{return i?e(r(n)[0],n[1]):e(n)}catch(e){var o=t.return;throw void 0!==o&&r(o.call(t)),e}}},function(t,e,n){var r=n(8)("iterator"),i=!1;try{var o=0,s={next:function(){return{done:!!o++}},return:function(){i=!0}};s[r]=function(){return this},Array.from(s,(function(){throw 2}))}catch(t){}t.exports=function(t,e){if(!e&&!i)return!1;var n=!1;try{var o={};o[r]=function(){return{next:function(){return{done:n=!0}}}},t(o)}catch(t){}return n}},function(t,e,n){var r=n(17),i=n(41),o=n(8)("species");t.exports=function(t,e){var n,s=r(t).constructor;return void 0===s||null==(n=r(s)[o])?e:i(n)}},function(t,e,n){var r,i,o,s,a,c,u,l,f=n(1),p=n(81).f,h=n(38),d=n(135).set,b=n(83),m=f.MutationObserver||f.WebKitMutationObserver,g=f.process,v=f.Promise,y="process"==h(g),w=p(f,"queueMicrotask"),k=w&&w.value;k||(r=function(){var t,e;for(y&&(t=g.domain)&&t.exit();i;){e=i.fn,i=i.next;try{e()}catch(t){throw i?s():o=void 0,t}}o=void 0,t&&t.enter()},y?s=function(){g.nextTick(r)}:m&&!/(iphone|ipod|ipad).*applewebkit/i.test(b)?(a=!0,c=document.createTextNode(""),new m(r).observe(c,{characterData:!0}),s=function(){c.data=a=!a}):v&&v.resolve?(u=v.resolve(void 0),l=u.then,s=function(){l.call(u,r)}):s=function(){d.call(f,r)}),t.exports=k||function(t){var e={fn:t,next:void 0};o&&(o.next=e),i||(i=e,s()),o=e}},function(t,e,n){var r=n(17),i=n(22),o=n(136);t.exports=function(t,e){if(r(t),i(e)&&e.constructor===t)return e;var n=o.f(t);return(0,n.resolve)(e),n.promise}},function(t,e,n){var r=n(1);t.exports=function(t,e){var n=r.console;n&&n.error&&(1===arguments.length?n.error(t):n.error(t,e))}},function(t,e){t.exports=function(t){try{return{error:!1,value:t()}}catch(t){return{error:!0,value:t}}}},function(t,e,n){var r=n(1),i=n(244),o=n(72),s=n(19),a=n(8),c=a("iterator"),u=a("toStringTag"),l=o.values;for(var f in i){var p=r[f],h=p&&p.prototype;if(h){if(h[c]!==l)try{s(h,c,l)}catch(t){h[c]=l}if(h[u]||s(h,u,f),i[f])for(var d in o)if(h[d]!==o[d])try{s(h,d,o[d])}catch(t){h[d]=o[d]}}}},function(t,e){t.exports={CSSRuleList:0,CSSStyleDeclaration:0,CSSValueList:0,ClientRectList:0,DOMRectList:0,DOMStringList:0,DOMTokenList:1,DataTransferItemList:0,FileList:0,HTMLAllCollection:0,HTMLCollection:0,HTMLFormElement:0,HTMLSelectElement:0,MediaList:0,MimeTypeArray:0,NamedNodeMap:0,NodeList:1,PaintRequestList:0,Plugin:0,PluginArray:0,SVGLengthList:0,SVGNumberList:0,SVGPathSegList:0,SVGPointList:0,SVGStringList:0,SVGTransformList:0,SourceBufferList:0,StyleSheetList:0,TextTrackCueList:0,TextTrackList:0,TouchList:0}},function(t,e,n){n(72),t.exports=function(){"use strict";function t(t,e){t||error(e)}var e,n,r=function(){function t(t,e){this.w=t,this.h=e}return t.prototype={toString:function(){return"("+this.w+", "+this.h+")"},getHalfSize:function(){return new r(this.w>>>1,this.h>>>1)},length:function(){return this.w*this.h}},t}(),i=function(){function e(t,e,n){this.bytes=new Uint8Array(t),this.start=e||0,this.pos=this.start,this.end=e+n||this.bytes.length}return e.prototype={get length(){return this.end-this.start},get position(){return this.pos},get remaining(){return this.end-this.pos},readU8Array:function(t){if(this.pos>this.end-t)return null;var e=this.bytes.subarray(this.pos,this.pos+t);return this.pos+=t,e},readU32Array:function(t,e,n){if(e=e||1,this.pos>this.end-t*e*4)return null;if(1==e){for(var r=new Uint32Array(t),i=0;i>24},readU8:function(){return this.pos>=this.end?null:this.bytes[this.pos++]},read16:function(){return this.readU16()<<16>>16},readU16:function(){if(this.pos>=this.end-1)return null;var t=this.bytes[this.pos+0]<<8|this.bytes[this.pos+1];return this.pos+=2,t},read24:function(){return this.readU24()<<8>>8},readU24:function(){var t=this.pos,e=this.bytes;if(t>this.end-3)return null;var n=e[t+0]<<16|e[t+1]<<8|e[t+2];return this.pos+=3,n},peek32:function(t){var e=this.pos,n=this.bytes;if(e>this.end-4)return null;var r=n[e+0]<<24|n[e+1]<<16|n[e+2]<<8|n[e+3];return t&&(this.pos+=4),r},read32:function(){return this.peek32(!0)},readU32:function(){return this.peek32(!0)>>>0},read4CC:function(){var t=this.pos;if(t>this.end-4)return null;for(var e="",n=0;n<4;n++)e+=String.fromCharCode(this.bytes[t+n]);return this.pos+=4,e},readFP16:function(){return this.read32()/65536},readFP8:function(){return this.read16()/256},readISO639:function(){for(var t=this.readU16(),e="",n=0;n<3;n++){var r=t>>>5*(2-n)&31;e+=String.fromCharCode(r+96)}return e},readUTF8:function(t){for(var e="",n=0;nthis.end)&&error("Index out of bounds (bounds: [0, "+this.end+"], index: "+t+")."),this.pos=t},subStream:function(t,e){return new i(this.bytes.buffer,t,e)}},e}(),o=function(){function e(t){this.stream=t,this.tracks={}}return e.prototype={readBoxes:function(t,e){for(;t.peek32();){var n=this.readBox(t);if(n.type in e){var r=e[n.type];r instanceof Array||(e[n.type]=[r]),e[n.type].push(n)}else e[n.type]=n}},readBox:function(e){var n={offset:e.position};function r(){n.version=e.readU8(),n.flags=e.readU24()}function i(){return n.size-(e.position-n.offset)}function o(){e.skip(i())}var a=function(){var t=e.subStream(e.position,i());this.readBoxes(t,n),e.skip(t.length)}.bind(this);switch(n.size=e.readU32(),n.type=e.read4CC(),n.type){case"ftyp":n.name="File Type Box",n.majorBrand=e.read4CC(),n.minorVersion=e.readU32(),n.compatibleBrands=new Array((n.size-16)/4);for(var c=0;c0&&(n.name=e.readUTF8(u));break;case"minf":n.name="Media Information Box",a();break;case"stbl":n.name="Sample Table Box",a();break;case"stsd":n.name="Sample Description Box",r(),n.sd=[];e.readU32();a();break;case"avc1":e.reserved(6,0),n.dataReferenceIndex=e.readU16(),t(0==e.readU16()),t(0==e.readU16()),e.readU32(),e.readU32(),e.readU32(),n.width=e.readU16(),n.height=e.readU16(),n.horizontalResolution=e.readFP16(),n.verticalResolution=e.readFP16(),t(0==e.readU32()),n.frameCount=e.readU16(),n.compressorName=e.readPString(32),n.depth=e.readU16(),t(65535==e.readU16()),a();break;case"mp4a":e.reserved(6,0),n.dataReferenceIndex=e.readU16(),n.version=e.readU16(),e.skip(2),e.skip(4),n.channelCount=e.readU16(),n.sampleSize=e.readU16(),n.compressionId=e.readU16(),n.packetSize=e.readU16(),n.sampleRate=e.readU32()>>>16,t(0==n.version),a();break;case"esds":n.name="Elementary Stream Descriptor",r(),o();break;case"avcC":n.name="AVC Configuration Box",n.configurationVersion=e.readU8(),n.avcProfileIndication=e.readU8(),n.profileCompatibility=e.readU8(),n.avcLevelIndication=e.readU8(),n.lengthSizeMinusOne=3&e.readU8(),t(3==n.lengthSizeMinusOne,"TODO");var l=31&e.readU8();n.sps=[];for(c=0;c=8,"Cannot parse large media data yet."),n.data=e.readU8Array(i());break;default:o()}return n},read:function(){var t=(new Date).getTime();this.file={},this.readBoxes(this.stream,this.file),console.info("Parsed stream in "+((new Date).getTime()-t)+" ms")},traceSamples:function(){var t=this.tracks[1],e=this.tracks[2];console.info("Video Samples: "+t.getSampleCount()),console.info("Audio Samples: "+e.getSampleCount());for(var n=0,r=0,i=0;i<100;i++){var o=t.sampleToOffset(n),s=e.sampleToOffset(r),a=t.sampleToSize(n,1),c=e.sampleToSize(r,1);o0){var s=n[i-1],a=o.firstChunk-s.firstChunk,c=s.samplesPerChunk*a;if(!(e>=c))return{index:r+Math.floor(e/s.samplesPerChunk),offset:e%s.samplesPerChunk};if(e-=c,i==n.length-1)return{index:r+a+Math.floor(e/o.samplesPerChunk),offset:e%o.samplesPerChunk};r+=a}}t(!1)},chunkToOffset:function(t){return this.trak.mdia.minf.stbl.stco.table[t]},sampleToOffset:function(t){var e=this.sampleToChunk(t);return this.chunkToOffset(e.index)+this.sampleToSize(t-e.offset,e.offset)},timeToSample:function(t){for(var e=this.trak.mdia.minf.stbl.stts.table,n=0,r=0;r=i))return n+Math.floor(t/e[r].delta);t-=i,n+=e[r].count}},getTotalTime:function(){for(var e=this.trak.mdia.minf.stbl.stts.table,n=0,r=0;r0;){var s=new i(e.buffer,n).readU32();o.push(e.subarray(n+4,n+s+4)),n=n+s+4}return o}},e}();e=[],n="zero-timeout-message",window.addEventListener("message",(function(t){t.source==window&&t.data==n&&(t.stopPropagation(),e.length>0&&e.shift()())}),!0),window.setZeroTimeout=function(t){e.push(t),window.postMessage(n,"*")};var a=function(){function t(t,n,r,i){this.stream=t,this.useWorkers=n,this.webgl=r,this.render=i,this.statistics={videoStartTime:0,videoPictureCounter:0,windowStartTime:0,windowPictureCounter:0,fps:0,fpsMin:1e3,fpsMax:-1e3,webGLTextureUploadTime:0},this.onStatisticsUpdated=function(){},this.avc=new Player({useWorker:n,reuseMemory:!0,webgl:r,size:{width:640,height:368}}),this.webgl=this.avc.webgl;var o=this;this.avc.onPictureDecoded=function(){e.call(o)},this.canvas=this.avc.canvas}function e(){var t=this.statistics;t.videoPictureCounter+=1,t.windowPictureCounter+=1;var e=Date.now();t.videoStartTime||(t.videoStartTime=e);var n=e-t.videoStartTime;if(t.elapsed=n/1e3,!(n<1e3))if(t.windowStartTime){if(e-t.windowStartTime>1e3){var r=e-t.windowStartTime,i=t.windowPictureCounter/r*1e3;t.windowStartTime=e,t.windowPictureCounter=0,it.fpsMax&&(t.fpsMax=i),t.fps=i}i=t.videoPictureCounter/n*1e3;t.fpsSinceStart=i,this.onStatisticsUpdated(this.statistics)}else t.windowStartTime=e}return t.prototype={readAll:function(t){console.info("MP4Player::readAll()"),this.stream.readAll(null,function(e){this.reader=new o(new i(e)),this.reader.read();var n=this.reader.tracks[1];this.size=new r(n.trak.tkhd.width,n.trak.tkhd.height),console.info("MP4Player::readAll(), length: "+this.reader.stream.length),t&&t()}.bind(this))},play:function(){var t=this.reader;if(t){var e=t.tracks[1],n=(t.tracks[2],t.tracks[1].trak.mdia.minf.stbl.stsd.avc1.avcC),r=n.sps[0],i=n.pps[0];this.avc.decode(r),this.avc.decode(i);var o=0;setTimeout(function t(){var n=this.avc;e.getSampleNALUnits(o).forEach((function(t){n.decode(t)})),++o<3e3&&setTimeout(t.bind(this),1)}.bind(this),1)}else this.readAll(this.play.bind(this))}},t}(),c=function(){function t(t){var e=t.attributes.src?t.attributes.src.value:void 0,n=(t.attributes.width&&t.attributes.width.value,t.attributes.height&&t.attributes.height.value,document.createElement("div"));n.setAttribute("style","z-index: 100; position: absolute; bottom: 0px; background-color: rgba(0,0,0,0.8); height: 30px; width: 100%; text-align: left;"),this.info=document.createElement("div"),this.info.setAttribute("style","font-size: 14px; font-weight: bold; padding: 6px; color: lime;"),n.appendChild(this.info),t.appendChild(n);var r=!!t.attributes.workers&&"true"==t.attributes.workers.value,i=!!t.attributes.render&&"true"==t.attributes.render.value,o="auto";t.attributes.webgl&&("true"==t.attributes.webgl.value&&(o=!0),"false"==t.attributes.webgl.value&&(o=!1));var s="";s+=r?"worker thread ":"main thread ",this.player=new a(new Stream(e),r,o,i),this.canvas=this.player.canvas,this.canvas.onclick=function(){this.play()}.bind(this),t.appendChild(this.canvas),s+=" - webgl: "+this.player.webgl,this.info.innerHTML="Click canvas to load and play - "+s,this.score=null,this.player.onStatisticsUpdated=function(t){if(t.videoPictureCounter%10==0){var e="";t.fps&&(e+=" fps: "+t.fps.toFixed(2)),t.fpsSinceStart&&(e+=" avg: "+t.fpsSinceStart.toFixed(2));t.videoPictureCounter<1200?this.score=1200-t.videoPictureCounter:1200==t.videoPictureCounter&&(this.score=t.fpsSinceStart.toFixed(2)),this.info.innerHTML=s+e}}.bind(this)}return t.prototype={play:function(){this.player.play()}},t}();return{Size:r,Track:s,MP4Reader:o,MP4Player:a,Bytestream:i,Broadway:c}}()},function(t,e,n){"use strict";(function(t){Object.defineProperty(e,"__esModule",{value:!0});var n="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t},r="undefined"!=typeof window&&void 0!==window.document,i="object"===("undefined"==typeof self?"undefined":n(self))&&self.constructor&&"DedicatedWorkerGlobalScope"===self.constructor.name,o=void 0!==t&&null!=t.versions&&null!=t.versions.node;e.isBrowser=r,e.isWebWorker=i,e.isNode=o}).call(this,n(112))},function(t,e,n){n(5),n(11),n(10),(()=>{const e=n(26),r=n(248),i=n(251),{checkObjectType:o}=n(56),{Task:s}=n(49),{Loader:a,Dumper:c}=n(138),{ScriptingError:u,DataError:l,ArgumentError:f}=n(6),p=new WeakMap,h=new WeakMap;function d(t){if("task"===t)return h;if("job"===t)return p;throw new u(`Unknown session type was received ${t}`)}async function b(t){const n=t instanceof s?"task":"job",o=d(n);if(!o.has(t)){const s=await e.annotations.getAnnotations(n,t.id),a="job"===n?t.startFrame:0,c="job"===n?t.stopFrame:t.size-1,u={};for(let e=a;e<=c;e++)u[e]=await t.frames.get(e);const l=new r({labels:t.labels||t.task.labels,startFrame:a,stopFrame:c,frameMeta:u}).import(s),f=new i(s.version,l,t);o.set(t,{collection:l,saver:f})}}t.exports={getAnnotations:async function(t,e,n){return await b(t),d(t instanceof s?"task":"job").get(t).collection.get(e,n)},putAnnotations:function(t,e){const n=d(t instanceof s?"task":"job");if(n.has(t))return n.get(t).collection.put(e);throw new l("Collection has not been initialized yet. Call annotations.get() or annotations.clear(true) before")},saveAnnotations:async function(t,e){const n=d(t instanceof s?"task":"job");n.has(t)&&await n.get(t).saver.save(e)},hasUnsavedChanges:function(t){const e=d(t instanceof s?"task":"job");return!!e.has(t)&&e.get(t).saver.hasUnsavedChanges()},mergeAnnotations:function(t,e){const n=d(t instanceof s?"task":"job");if(n.has(t))return n.get(t).collection.merge(e);throw new l("Collection has not been initialized yet. Call annotations.get() or annotations.clear(true) before")},splitAnnotations:function(t,e,n){const r=d(t instanceof s?"task":"job");if(r.has(t))return r.get(t).collection.split(e,n);throw new l("Collection has not been initialized yet. Call annotations.get() or annotations.clear(true) before")},groupAnnotations:function(t,e,n){const r=d(t instanceof s?"task":"job");if(r.has(t))return r.get(t).collection.group(e,n);throw new l("Collection has not been initialized yet. Call annotations.get() or annotations.clear(true) before")},clearAnnotations:async function(t,e){o("reload",e,"boolean",null);const n=d(t instanceof s?"task":"job");n.has(t)&&n.get(t).collection.clear(),e&&(n.delete(t),await b(t))},annotationsStatistics:function(t){const e=d(t instanceof s?"task":"job");if(e.has(t))return e.get(t).collection.statistics();throw new l("Collection has not been initialized yet. Call annotations.get() or annotations.clear(true) before")},selectObject:function(t,e,n,r){const i=d(t instanceof s?"task":"job");if(i.has(t))return i.get(t).collection.select(e,n,r);throw new l("Collection has not been initialized yet. Call annotations.get() or annotations.clear(true) before")},uploadAnnotations:async function(t,n,r){const i=t instanceof s?"task":"job";if(!(r instanceof a))throw new f("A loader must be instance of Loader class");await e.annotations.uploadAnnotations(i,t.id,n,r.name)},dumpAnnotations:async function(t,n,r){if(!(r instanceof c))throw new f("A dumper must be instance of Dumper class");let i=null;return i="job"===(t instanceof s?"task":"job")?await e.annotations.dumpAnnotations(t.task.id,n,r.name):await e.annotations.dumpAnnotations(t.id,n,r.name)},exportDataset:async function(t,n){if(!(n instanceof String||"string"==typeof n))throw new f("Format must be a string");if(!(t instanceof s))throw new f("A dataset can only be created from a task");let r=null;return r=await e.tasks.exportDataset(t.id,n)}}})()},function(t,e,n){n(5),n(137),n(10),n(71),(()=>{const{RectangleShape:e,PolygonShape:r,PolylineShape:i,PointsShape:o,RectangleTrack:s,PolygonTrack:a,PolylineTrack:c,PointsTrack:u,Track:l,Shape:f,Tag:p,objectStateFactory:h}=n(250),{checkObjectType:d}=n(56),b=n(117),{Label:m}=n(55),{DataError:g,ArgumentError:v,ScriptingError:y}=n(6),{ObjectShape:w,ObjectType:k}=n(29),x=n(70),O=["#0066FF","#AF593E","#01A368","#FF861F","#ED0A3F","#FF3F34","#76D7EA","#8359A3","#FBE870","#C5E17A","#03BB85","#FFDF00","#8B8680","#0A6B0D","#8FD8D8","#A36F40","#F653A6","#CA3435","#FFCBA4","#FF99CC","#FA9D5A","#FFAE42","#A78B00","#788193","#514E49","#1164B4","#F4FA9F","#FED8B1","#C32148","#01796F","#E90067","#FF91A4","#404E5A","#6CDAE7","#FFC1CC","#006A93","#867200","#E2B631","#6EEB6E","#FFC800","#CC99BA","#FF007C","#BC6CAC","#DCCCD7","#EBE1C2","#A6AAAE","#B99685","#0086A7","#5E4330","#C8A2C8","#708EB3","#BC8777","#B2592D","#497E48","#6A2963","#E6335F","#00755E","#B5A895","#0048ba","#EED9C4","#C88A65","#FF6E4A","#87421F","#B2BEB5","#926F5B","#00B9FB","#6456B7","#DB5079","#C62D42","#FA9C44","#DA8A67","#FD7C6E","#93CCEA","#FCF686","#503E32","#FF5470","#9DE093","#FF7A00","#4F69C6","#A50B5E","#F0E68C","#FDFF00","#F091A9","#FFFF66","#6F9940","#FC74FD","#652DC1","#D6AEDD","#EE34D2","#BB3385","#6B3FA0","#33CC99","#FFDB00","#87FF2A","#6EEB6E","#FFC800","#CC99BA","#7A89B8","#006A93","#867200","#E2B631","#D9D6CF"];function j(t,n,s){const{type:a}=t,c=O[n%O.length];let u=null;switch(a){case"rectangle":u=new e(t,n,c,s);break;case"polygon":u=new r(t,n,c,s);break;case"polyline":u=new i(t,n,c,s);break;case"points":u=new o(t,n,c,s);break;default:throw new g(`An unexpected type of shape "${a}"`)}return u}function S(t,e,n){if(t.shapes.length){const{type:r}=t.shapes[0],i=O[e%O.length];let o=null;switch(r){case"rectangle":o=new s(t,e,i,n);break;case"polygon":o=new a(t,e,i,n);break;case"polyline":o=new c(t,e,i,n);break;case"points":o=new u(t,e,i,n);break;default:throw new g(`An unexpected type of track "${r}"`)}return o}return console.warn("The track without any shapes had been found. It was ignored."),null}t.exports=class{constructor(t){this.startFrame=t.startFrame,this.stopFrame=t.stopFrame,this.frameMeta=t.frameMeta,this.labels=t.labels.reduce((t,e)=>(t[e.id]=e,t),{}),this.shapes={},this.tags={},this.tracks=[],this.objects={},this.count=0,this.flush=!1,this.collectionZ={},this.groups={max:0},this.injection={labels:this.labels,collectionZ:this.collectionZ,groups:this.groups,frameMeta:this.frameMeta}}import(t){for(const e of t.tags){const t=++this.count,n=new p(e,t,this.injection);this.tags[n.frame]=this.tags[n.frame]||[],this.tags[n.frame].push(n),this.objects[t]=n}for(const e of t.shapes){const t=++this.count,n=j(e,t,this.injection);this.shapes[n.frame]=this.shapes[n.frame]||[],this.shapes[n.frame].push(n),this.objects[t]=n}for(const e of t.tracks){const t=++this.count,n=S(e,t,this.injection);n&&(this.tracks.push(n),this.objects[t]=n)}return this}export(){return{tracks:this.tracks.filter(t=>!t.removed).map(t=>t.toJSON()),shapes:Object.values(this.shapes).reduce((t,e)=>(t.push(...e),t),[]).filter(t=>!t.removed).map(t=>t.toJSON()),tags:Object.values(this.tags).reduce((t,e)=>(t.push(...e),t),[]).filter(t=>!t.removed).map(t=>t.toJSON())}}get(t){const{tracks:e}=this,n=this.shapes[t]||[],r=this.tags[t]||[],i=e.concat(n).concat(r).filter(t=>!t.removed),o=[];for(const e of i){const n=e.get(t);if(n.outside&&!n.keyframe)continue;const r=h.call(e,t,n);o.push(r)}return o}merge(t){if(d("shapes for merge",t,null,Array),!t.length)return;const e=t.map(t=>{d("object state",t,null,x);const e=this.objects[t.clientID];if(void 0===e)throw new v("The object has not been saved yet. Call ObjectState.put([state]) before you can merge it");return e}),n={},{label:r,shapeType:i}=t[0];if(!(r.id in this.labels))throw new v(`Unknown label for the task: ${r.id}`);if(!Object.values(w).includes(i))throw new v(`Got unknown shapeType "${i}"`);const o=r.attributes.reduce((t,e)=>(t[e.id]=e,t),{});for(let s=0;s(e in o&&o[e].mutable&&t.push({spec_id:+e,value:a.attributes[e]}),t),[])},a.frame+1 in n||(n[a.frame+1]=JSON.parse(JSON.stringify(n[a.frame])),n[a.frame+1].outside=!0,n[a.frame+1].frame++)}else{if(!(a instanceof l))throw new v(`Trying to merge unknown object type: ${a.constructor.name}. `+"Only shapes and tracks are expected.");{const t={};for(const e of Object.keys(a.shapes)){const r=a.shapes[e];if(e in n&&!n[e].outside){if(r.outside)continue;throw new v("Expected only one visible shape per frame")}let o=!1;for(const e in r.attributes)e in t&&t[e]===r.attributes[e]||(o=!0,t[e]=r.attributes[e]);n[e]={type:i,frame:+e,points:[...r.points],occluded:r.occluded,outside:r.outside,zOrder:r.zOrder,attributes:o?Object.keys(t).reduce((e,n)=>(e.push({spec_id:+n,value:t[n]}),e),[]):[]}}}}}let s=!1;for(const t of Object.keys(n).sort((t,e)=>+t-+e)){if((s=s||n[t].outside)||!n[t].outside)break;delete n[t]}const a=++this.count,c=S({frame:Math.min.apply(null,Object.keys(n).map(t=>+t)),shapes:Object.values(n),group:0,label_id:r.id,attributes:Object.keys(t[0].attributes).reduce((e,n)=>(o[n].mutable||e.push({spec_id:+n,value:t[0].attributes[n]}),e),[])},a,this.injection);this.tracks.push(c),this.objects[a]=c;for(const t of e)t.removed=!0,"function"==typeof t.resetCache&&t.resetCache()}split(t,e){d("object state",t,null,x),d("frame",e,"integer",null);const n=this.objects[t.clientID];if(void 0===n)throw new v("The object has not been saved yet. Call annotations.put([state]) before");if(t.objectType!==k.TRACK)return;const r=Object.keys(n.shapes).sort((t,e)=>+t-+e);if(e<=+r[0]||e>r[r.length-1])return;const i=n.label.attributes.reduce((t,e)=>(t[e.id]=e,t),{}),o=n.toJSON(),s={type:t.shapeType,points:[...t.points],occluded:t.occluded,outside:t.outside,zOrder:0,attributes:Object.keys(t.attributes).reduce((e,n)=>(i[n].mutable||e.push({spec_id:+n,value:t.attributes[n]}),e),[]),frame:e},a={frame:o.frame,group:0,label_id:o.label_id,attributes:o.attributes,shapes:[]},c=JSON.parse(JSON.stringify(a));c.frame=e,c.shapes.push(JSON.parse(JSON.stringify(s))),o.shapes.map(t=>(delete t.id,t.framee&&c.shapes.push(JSON.parse(JSON.stringify(t))),t)),a.shapes.push(s),a.shapes[a.shapes.length-1].outside=!0;let u=++this.count;const l=S(a,u,this.injection);this.tracks.push(l),this.objects[u]=l,u=++this.count;const f=S(c,u,this.injection);this.tracks.push(f),this.objects[u]=f,n.removed=!0,n.resetCache()}group(t,e){d("shapes for group",t,null,Array);const n=t.map(t=>{d("object state",t,null,x);const e=this.objects[t.clientID];if(void 0===e)throw new v("The object has not been saved yet. Call annotations.put([state]) before");return e}),r=e?0:++this.groups.max;for(const t of n)t.group=r,"function"==typeof t.resetCache&&t.resetCache();return r}clear(){this.shapes={},this.tags={},this.tracks=[],this.objects={},this.count=0,this.flush=!0}statistics(){const t={},e={rectangle:{shape:0,track:0},polygon:{shape:0,track:0},polyline:{shape:0,track:0},points:{shape:0,track:0},tags:0,manually:0,interpolated:0,total:0},n=JSON.parse(JSON.stringify(e));for(const n of Object.values(this.labels)){const{name:r}=n;t[r]=JSON.parse(JSON.stringify(e))}for(const e of Object.values(this.objects)){let n=null;if(e instanceof f)n="shape";else if(e instanceof l)n="track";else{if(!(e instanceof p))throw new y(`Unexpected object type: "${n}"`);n="tag"}const r=e.label.name;if("tag"===n)t[r].tags++,t[r].manually++,t[r].total++;else{const{shapeType:i}=e;if(t[r][i][n]++,"track"===n){const n=Object.keys(e.shapes).sort((t,e)=>+t-+e).map(t=>+t);let i=n[0],o=!1;for(const s of n){if(o){const e=s-i-1;t[r].interpolated+=e,t[r].total+=e}o=!e.shapes[s].outside,i=s,o&&(t[r].manually++,t[r].total++)}const s=n[n.length-1];if(s!==this.stopFrame&&!e.shapes[s].outside){const e=this.stopFrame-s;t[r].interpolated+=e,t[r].total+=e}}else t[r].manually++,t[r].total++}}for(const e of Object.keys(t))for(const r of Object.keys(t[e]))if("object"==typeof t[e][r])for(const i of Object.keys(t[e][r]))n[r][i]+=t[e][r][i];else n[r]+=t[e][r];return new b(t,n)}put(t){d("shapes for put",t,null,Array);const e={shapes:[],tracks:[],tags:[]};function n(t,e){const n=+e,r=this.attributes[e];return d("attribute id",n,"integer",null),d("attribute value",r,"string",null),t.push({spec_id:n,value:r}),t}for(const r of t){d("object state",r,null,x),d("state client ID",r.clientID,"undefined",null),d("state frame",r.frame,"integer",null),d("state attributes",r.attributes,null,Object),d("state label",r.label,null,m);const t=Object.keys(r.attributes).reduce(n.bind(r),[]),i=r.label.attributes.reduce((t,e)=>(t[e.id]=e,t),{});if("tag"===r.objectType)e.tags.push({attributes:t,frame:r.frame,label_id:r.label.id,group:0});else{d("state occluded",r.occluded,"boolean",null),d("state points",r.points,null,Array);for(const t of r.points)d("point coordinate",t,"number",null);if(!Object.values(w).includes(r.shapeType))throw new v("Object shape must be one of: "+`${JSON.stringify(Object.values(w))}`);if("shape"===r.objectType)e.shapes.push({attributes:t,frame:r.frame,group:0,label_id:r.label.id,occluded:r.occluded||!1,points:[...r.points],type:r.shapeType,z_order:0});else{if("track"!==r.objectType)throw new v("Object type must be one of: "+`${JSON.stringify(Object.values(k))}`);e.tracks.push({attributes:t.filter(t=>!i[t.spec_id].mutable),frame:r.frame,group:0,label_id:r.label.id,shapes:[{attributes:t.filter(t=>i[t.spec_id].mutable),frame:r.frame,occluded:r.occluded||!1,outside:!1,points:[...r.points],type:r.shapeType,z_order:0}]})}}}this.import(e)}select(t,e,n){d("shapes for select",t,null,Array),d("x coordinate",e,"number",null),d("y coordinate",n,"number",null);let r=null,i=null;for(const o of t){if(d("object state",o,null,x),o.outside)continue;const t=this.objects[o.clientID];if(void 0===t)throw new v("The object has not been saved yet. Call annotations.put([state]) before");const s=t.constructor.distance(o.points,e,n);null!==s&&(null===r||s{const e=n(70),{checkObjectType:r,isEnum:o}=n(56),{ObjectShape:s,ObjectType:a,AttributeType:c,VisibleState:u}=n(29),{DataError:l,ArgumentError:f,ScriptingError:p}=n(6),{Label:h}=n(55);function d(t,n){const r=new e(n);return r.hidden={save:this.save.bind(this,t,r),delete:this.delete.bind(this),up:this.up.bind(this,t,r),down:this.down.bind(this,t,r)},r}function b(t,e){if(t===s.RECTANGLE){if(e.length/2!=2)throw new l(`Rectangle must have 2 points, but got ${e.length/2}`)}else if(t===s.POLYGON){if(e.length/2<3)throw new l(`Polygon must have at least 3 points, but got ${e.length/2}`)}else if(t===s.POLYLINE){if(e.length/2<2)throw new l(`Polyline must have at least 2 points, but got ${e.length/2}`)}else{if(t!==s.POINTS)throw new f(`Unknown value of shapeType has been recieved ${t}`);if(e.length/2<1)throw new l(`Points must have at least 1 points, but got ${e.length/2}`)}}function m(t,e){if(t===s.POINTS)return!0;let n=Number.MAX_SAFE_INTEGER,r=Number.MIN_SAFE_INTEGER,i=Number.MAX_SAFE_INTEGER,o=Number.MIN_SAFE_INTEGER;for(let t=0;t=3}return(r-n)*(o-i)>=9}function g(t,e){const{values:n}=e,r=e.inputType;if("string"!=typeof t)throw new f(`Attribute value is expected to be string, but got ${typeof t}`);return r===c.NUMBER?+t>=+n[0]&&+t<=+n[1]&&!((+t-+n[0])%+n[2]):r===c.CHECKBOX?["true","false"].includes(t.toLowerCase()):n.includes(t)}class v{constructor(t,e,n){this.taskLabels=n.labels,this.clientID=e,this.serverID=t.id,this.group=t.group,this.label=this.taskLabels[t.label_id],this.frame=t.frame,this.removed=!1,this.lock=!1,this.attributes=t.attributes.reduce((t,e)=>(t[e.spec_id]=e.value,t),{}),this.appendDefaultAttributes(this.label),n.groups.max=Math.max(n.groups.max,this.group)}appendDefaultAttributes(t){const e=t.attributes;for(const t of e)t.id in this.attributes||(this.attributes[t.id]=t.defaultValue)}delete(t){return this.lock&&!t||(this.removed=!0),!0}}class y extends v{constructor(t,e,n,r){super(t,e,r),this.frameMeta=r.frameMeta,this.collectionZ=r.collectionZ,this.visibility=u.SHAPE,this.color=n,this.shapeType=null}_getZ(t){return this.collectionZ[t]=this.collectionZ[t]||{max:0,min:0},this.collectionZ[t]}save(){throw new p("Is not implemented")}get(){throw new p("Is not implemented")}toJSON(){throw new p("Is not implemented")}up(t,e){const n=this._getZ(t);n.max++,e.zOrder=n.max}down(t,e){const n=this._getZ(t);n.min--,e.zOrder=n.min}}class w extends y{constructor(t,e,n,r){super(t,e,n,r),this.points=t.points,this.occluded=t.occluded,this.zOrder=t.z_order;const i=this._getZ(this.frame);i.max=Math.max(i.max,this.zOrder||0),i.min=Math.min(i.min,this.zOrder||0)}toJSON(){return{type:this.shapeType,clientID:this.clientID,occluded:this.occluded,z_order:this.zOrder,points:[...this.points],attributes:Object.keys(this.attributes).reduce((t,e)=>(t.push({spec_id:e,value:this.attributes[e]}),t),[]),id:this.serverID,frame:this.frame,label_id:this.label.id,group:this.group}}get(t){if(t!==this.frame)throw new p("Got frame is not equal to the frame of the shape");return{objectType:a.SHAPE,shapeType:this.shapeType,clientID:this.clientID,serverID:this.serverID,occluded:this.occluded,lock:this.lock,zOrder:this.zOrder,points:[...this.points],attributes:i({},this.attributes),label:this.label,group:this.group,color:this.color,visibility:this.visibility}}save(t,e){if(t!==this.frame)throw new p("Got frame is not equal to the frame of the shape");if(this.lock&&e.lock)return d.call(this,t,this.get(t));const n=this.get(t),i=e.updateFlags;if(i.label&&(r("label",e.label,null,h),n.label=e.label,n.attributes={},this.appendDefaultAttributes.call(n,n.label)),i.attributes){const t=n.label.attributes.reduce((t,e)=>(t[e.id]=e,t),{});for(const r of Object.keys(e.attributes)){const i=e.attributes[r];if(!(r in t&&g(i,t[r])))throw new f(`Trying to save unknown attribute with id ${r} and value ${i}`);n.attributes[r]=i}}if(i.points){r("points",e.points,null,Array),b(this.shapeType,e.points);const{width:i,height:o}=this.frameMeta[t],s=[];for(let t=0;t{t[e.frame]={serverID:e.id,occluded:e.occluded,zOrder:e.z_order,points:e.points,outside:e.outside,attributes:e.attributes.reduce((t,e)=>(t[e.spec_id]=e.value,t),{})};const n=this._getZ(e.frame);return n.max=Math.max(n.max,e.z_order),n.min=Math.min(n.min,e.z_order),t},{}),this.cache={}}toJSON(){const t=this.label.attributes.reduce((t,e)=>(t[e.id]=e,t),{});return{clientID:this.clientID,id:this.serverID,frame:this.frame,label_id:this.label.id,group:this.group,attributes:Object.keys(this.attributes).reduce((e,n)=>(t[n].mutable||e.push({spec_id:n,value:this.attributes[n]}),e),[]),shapes:Object.keys(this.shapes).reduce((e,n)=>(e.push({type:this.shapeType,occluded:this.shapes[n].occluded,z_order:this.shapes[n].zOrder,points:[...this.shapes[n].points],outside:this.shapes[n].outside,attributes:Object.keys(this.shapes[n].attributes).reduce((e,r)=>(t[r].mutable&&e.push({spec_id:r,value:this.shapes[n].attributes[r]}),e),[]),id:this.shapes[n].serverID,frame:+n}),e),[])}}get(t){if(!(t in this.cache)){const e=Object.assign({},this.getPosition(t),{attributes:this.getAttributes(t),group:this.group,objectType:a.TRACK,shapeType:this.shapeType,clientID:this.clientID,serverID:this.serverID,lock:this.lock,color:this.color,visibility:this.visibility});this.cache[t]=e}const e=JSON.parse(JSON.stringify(this.cache[t]));return e.label=this.label,e}neighborsFrames(t){const e=Object.keys(this.shapes).map(t=>+t);let n=Number.MAX_SAFE_INTEGER,r=Number.MAX_SAFE_INTEGER;for(const i of e){const e=Math.abs(t-i);i<=t&&e+t-+e);for(const r of n)if(r<=t){const{attributes:t}=this.shapes[r];for(const n in t)Object.prototype.hasOwnProperty.call(t,n)&&(e[n]=t[n])}return e}save(t,e){if(this.lock&&e.lock)return d.call(this,t,this.get(t));const n=Object.assign(this.get(t));n.attributes=Object.assign(n.attributes),n.points=[...n.points];const i=e.updateFlags;let s=!1;i.label&&(r("label",e.label,null,h),n.label=e.label,n.attributes={},this.appendDefaultAttributes.call(n,n.label));const a=n.label.attributes.reduce((t,e)=>(t[e.id]=e,t),{});if(i.attributes)for(const t of Object.keys(e.attributes)){const r=e.attributes[t];if(!(t in a&&g(r,a[t])))throw new f(`Trying to save unknown attribute with id ${t} and value ${r}`);n.attributes[t]=r}if(i.points){r("points",e.points,null,Array),b(this.shapeType,e.points);const{width:i,height:o}=this.frameMeta[t],a=[];for(let t=0;tt&&delete this.cache[e];return this.cache[t].keyframe=!1,delete this.shapes[t],i.reset(),d.call(this,t,this.get(t))}if(s||i.keyframe&&e.keyframe){for(const e in this.cache)+e>t&&delete this.cache[e];if(this.cache[t].keyframe=!0,e.keyframe=!0,this.shapes[t]={frame:t,zOrder:n.zOrder,points:n.points,outside:n.outside,occluded:n.occluded,attributes:{}},i.attributes)for(const r of Object.keys(n.attributes))a[r].mutable&&(this.shapes[t].attributes[r]=e.attributes[r],this.shapes[t].attributes[r]=e.attributes[r])}return i.reset(),d.call(this,t,this.get(t))}getPosition(t){const{leftFrame:e,rightFrame:n}=this.neighborsFrames(t),r=Number.isInteger(n)?this.shapes[n]:null,i=Number.isInteger(e)?this.shapes[e]:null;if(i&&e===t)return{points:[...i.points],occluded:i.occluded,outside:i.outside,zOrder:i.zOrder,keyframe:!0};if(r&&i)return Object.assign({},this.interpolatePosition(i,r,(t-e)/(n-e)),{keyframe:!1});if(r)return{points:[...r.points],occluded:r.occluded,outside:!0,zOrder:0,keyframe:!1};if(i)return{points:[...i.points],occluded:i.occluded,outside:i.outside,zOrder:0,keyframe:!1};throw new p(`No one neightbour frame found for the track with client ID: "${this.id}"`)}delete(t){return this.lock&&!t||(this.removed=!0,this.resetCache()),!0}resetCache(){this.cache={}}}class x extends w{constructor(t,e,n,r){super(t,e,n,r),this.shapeType=s.RECTANGLE,b(this.shapeType,this.points)}static distance(t,e,n){const[r,i,o,s]=t;return e>=r&&e<=o&&n>=i&&n<=s?Math.min.apply(null,[e-r,n-i,o-e,s-n]):null}}class O extends w{constructor(t,e,n,r){super(t,e,n,r)}}class j extends O{constructor(t,e,n,r){super(t,e,n,r),this.shapeType=s.POLYGON,b(this.shapeType,this.points)}static distance(t,e,n){function r(t,r,i,o){return(i-t)*(n-r)-(e-t)*(o-r)}let i=0;const o=[];for(let s=0,a=t.length-2;sn&&r(c,u,l,f)>0&&i++:f<=n&&r(c,u,l,f)<0&&i--;const p=e-(u-f),h=n-(l-c);(p-c)*(l-p)>=0&&(h-u)*(f-h)>=0?o.push(Math.sqrt(Math.pow(e-p,2)+Math.pow(n-h,2))):o.push(Math.min(Math.sqrt(Math.pow(c-e,2)+Math.pow(u-n,2)),Math.sqrt(Math.pow(l-e,2)+Math.pow(f-n,2))))}return 0!==i?Math.min.apply(null,o):null}}class S extends O{constructor(t,e,n,r){super(t,e,n,r),this.shapeType=s.POLYLINE,b(this.shapeType,this.points)}static distance(t,e,n){const r=[];for(let i=0;i=0&&(n-s)*(c-n)>=0?r.push(Math.abs((c-s)*e-(a-o)*n+a*s-c*o)/Math.sqrt(Math.pow(c-s,2)+Math.pow(a-o,2))):r.push(Math.min(Math.sqrt(Math.pow(o-e,2)+Math.pow(s-n,2)),Math.sqrt(Math.pow(a-e,2)+Math.pow(c-n,2))))}return Math.min.apply(null,r)}}class _ extends O{constructor(t,e,n,r){super(t,e,n,r),this.shapeType=s.POINTS,b(this.shapeType,this.points)}static distance(t,e,n){const r=[];for(let i=0;ir&&(r=t[o]),t[o+1]>i&&(i=t[o+1]);return{xmin:e,ymin:n,xmax:r,ymax:i}}function i(t,e){const n=[],r=e.xmax-e.xmin,i=e.ymax-e.ymin;for(let o=0;on[i][t]-n[i][e]);const i={},o={};let s=0;for(;Object.values(o).length!==t.length;){for(const e of t){if(o[e])continue;const t=r[e][s],a=n[e][t];if(t in i&&i[t].distance>a){const e=i[t].value;delete i[t],delete o[e]}t in i||(i[t]={value:e,distance:a},o[e]=!0)}s++}const a={};for(const t of Object.keys(i))a[i[t].value]={value:t,distance:i[t].distance};return a}(Array.from(t.keys()),Array.from(e.keys()),s),c=(n(e)+n(t))/(e.length+t.length);!function(t,e){for(const n of Object.keys(t))t[n].distance>e&&delete t[n]}(a,c+3*Math.sqrt((r(t,c)+r(e,c))/(t.length+e.length)));for(const t of Object.keys(a))a[t]=a[t].value;const u=this.appendMapping(a,t,e);for(const n of u)i.push(t[n]),o.push(e[a[n]]);return[i,o]}let u=r(t.points),l=r(e.points);(u.xmax-u.xmin<1||l.ymax-l.ymin<1)&&(l=u={xmin:0,xmax:1024,ymin:0,ymax:768});const f=s(i(t.points,u)),p=s(i(e.points,l));let h=[],d=[];if(f.length>p.length){const[t,e]=c.call(this,p,f);h=e,d=t}else{const[t,e]=c.call(this,f,p);h=t,d=e}const b=o(a(h),u),m=o(a(d),l),g=[];for(let t=0;t+t),i=Object.keys(t).map(t=>+t),o=[];function s(t){let e=t,i=t;if(!r.length)throw new p("Interpolation mapping is empty");for(;!r.includes(e);)--e<0&&(e=n.length-1);for(;!r.includes(i);)++i>=n.length&&(i=0);return[e,i]}function a(t,e,r){const i=[];for(;e!==r;)i.push(n[e]),++e>=n.length&&(e=0);i.push(n[r]);let o=0,s=0,a=!1;for(let e=1;e(t.push({spec_id:e,value:this.attributes[e]}),t),[])}}get(t){if(t!==this.frame)throw new p("Got frame is not equal to the frame of the shape");return{objectType:a.TAG,clientID:this.clientID,serverID:this.serverID,lock:this.lock,attributes:Object.assign({},this.attributes),label:this.label,group:this.group}}save(t,e){if(t!==this.frame)throw new p("Got frame is not equal to the frame of the shape");if(this.lock&&e.lock)return d.call(this,t,this.get(t));const n=this.get(t),i=e.updateFlags;if(i.label&&(r("label",e.label,null,h),n.label=e.label,n.attributes={},this.appendDefaultAttributes.call(n,n.label)),i.attributes){const t=n.label.attributes.map(t=>`${t.id}`);for(const r of Object.keys(e.attributes))t.includes(r)&&(n.attributes[r]=e.attributes[r])}i.group&&(r("group",e.group,"integer",null),n.group=e.group),i.lock&&(r("lock",e.lock,"boolean",null),n.lock=e.lock),i.reset();for(const t of Object.keys(n))t in this&&(this[t]=n[t]);return d.call(this,t,this.get(t))}},objectStateFactory:d}})()},function(t,e,n){function r(t,e){var n=Object.keys(t);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(t);e&&(r=r.filter((function(e){return Object.getOwnPropertyDescriptor(t,e).enumerable}))),n.push.apply(n,r)}return n}function i(t){for(var e=1;e{const e=n(26),{Task:r}=n(49),{ScriptingError:o}="./exceptions";t.exports=class{constructor(t,e,n){this.sessionType=n instanceof r?"task":"job",this.id=n.id,this.version=t,this.collection=e,this.initialObjects={},this.hash=this._getHash();const i=this.collection.export();this._resetState();for(const t of i.shapes)this.initialObjects.shapes[t.id]=t;for(const t of i.tracks)this.initialObjects.tracks[t.id]=t;for(const t of i.tags)this.initialObjects.tags[t.id]=t}_resetState(){this.initialObjects={shapes:{},tracks:{},tags:{}}}_getHash(){const t=this.collection.export();return JSON.stringify(t)}async _request(t,n){return await e.annotations.updateAnnotations(this.sessionType,this.id,t,n)}async _put(t){return await this._request(t,"put")}async _create(t){return await this._request(t,"create")}async _update(t){return await this._request(t,"update")}async _delete(t){return await this._request(t,"delete")}_split(t){const e={created:{shapes:[],tracks:[],tags:[]},updated:{shapes:[],tracks:[],tags:[]},deleted:{shapes:[],tracks:[],tags:[]}};for(const n of Object.keys(t))for(const r of t[n])if(r.id in this.initialObjects[n]){JSON.stringify(r)!==JSON.stringify(this.initialObjects[n][r.id])&&e.updated[n].push(r)}else{if(void 0!==r.id)throw new o(`Id of object is defined "${r.id}"`+"but it absents in initial state");e.created[n].push(r)}const n={shapes:t.shapes.map(t=>+t.id),tracks:t.tracks.map(t=>+t.id),tags:t.tags.map(t=>+t.id)};for(const t of Object.keys(this.initialObjects))for(const r of Object.keys(this.initialObjects[t]))if(!n[t].includes(+r)){const n=this.initialObjects[t][r];e.deleted[t].push(n)}return e}_updateCreatedObjects(t,e){const n=t.tracks.length+t.shapes.length+t.tags.length,r=e.tracks.length+e.shapes.length+e.tags.length;if(r!==n)throw new o("Number of indexes is differed by number of saved objects"+`${r} vs ${n}`);for(const n of Object.keys(e))for(let r=0;rt.clientID),shapes:t.shapes.map(t=>t.clientID),tags:t.tags.map(t=>t.clientID)};return t.tracks.concat(t.shapes).concat(t.tags).map(t=>(delete t.clientID,t)),e}async save(t){"function"!=typeof t&&(t=t=>{console.log(t)});try{const e=this.collection.export(),{flush:n}=this.collection;if(n){t("New objects are being saved..");const n=this._receiveIndexes(e),r=await this._put(i({},e,{version:this.version}));this.version=r.version,this.collection.flush=!1,t("Saved objects are being updated in the client"),this._updateCreatedObjects(r,n),t("Initial state is being updated"),this._resetState();for(const t of Object.keys(this.initialObjects))for(const e of r[t])this.initialObjects[t][e.id]=e}else{const{created:n,updated:r,deleted:o}=this._split(e);t("New objects are being saved..");const s=this._receiveIndexes(n),a=await this._create(i({},n,{version:this.version}));this.version=a.version,t("Saved objects are being updated in the client"),this._updateCreatedObjects(a,s),t("Initial state is being updated");for(const t of Object.keys(this.initialObjects))for(const e of a[t])this.initialObjects[t][e.id]=e;t("Changed objects are being saved.."),this._receiveIndexes(r);const c=await this._update(i({},r,{version:this.version}));this.version=c.version,t("Initial state is being updated");for(const t of Object.keys(this.initialObjects))for(const e of c[t])this.initialObjects[t][e.id]=e;t("Changed objects are being saved.."),this._receiveIndexes(o);const u=await this._delete(i({},o,{version:this.version}));this._version=u.version,t("Initial state is being updated");for(const t of Object.keys(this.initialObjects))for(const e of u[t])delete this.initialObjects[t][e.id]}this.hash=this._getHash(),t("Saving is done")}catch(e){throw t(`Can not save annotations: ${e.message}`),e}}hasUnsavedChanges(){return this._getHash()!==this.hash}}})()},function(t){t.exports=JSON.parse('{"name":"cvat-core.js","version":"0.1.0","description":"Part of Computer Vision Tool which presents an interface for client-side integration","main":"babel.config.js","scripts":{"build":"webpack","test":"jest --config=jest.config.js --coverage","docs":"jsdoc --readme README.md src/*.js -p -c jsdoc.config.js -d docs","coveralls":"cat ./reports/coverage/lcov.info | coveralls"},"author":"Intel","license":"MIT","devDependencies":{"@babel/cli":"^7.4.4","@babel/core":"^7.4.4","@babel/preset-env":"^7.4.4","airbnb":"0.0.2","babel-eslint":"^10.0.1","babel-loader":"^8.0.6","core-js":"^3.0.1","coveralls":"^3.0.5","eslint":"6.1.0","eslint-config-airbnb-base":"14.0.0","eslint-plugin-import":"2.18.2","eslint-plugin-no-unsafe-innerhtml":"^1.0.16","eslint-plugin-no-unsanitized":"^3.0.2","eslint-plugin-security":"^1.4.0","jest":"^24.8.0","jest-junit":"^6.4.0","jsdoc":"^3.6.2","webpack":"^4.31.0","webpack-cli":"^3.3.2"},"dependencies":{"axios":"^0.18.0","browser-or-node":"^1.2.1","error-stack-parser":"^2.0.2","form-data":"^2.5.0","jest-config":"^24.8.0","js-cookie":"^2.2.0","platform":"^1.3.5","store":"^2.0.12"}}')},function(t,e,n){n(5),n(11),n(10),n(254),(()=>{const e=n(36),r=n(26),{isBoolean:i,isInteger:o,isEnum:s,isString:a,checkFilter:c}=n(56),{TaskStatus:u,TaskMode:l}=n(29),f=n(69),{AnnotationFormat:p}=n(138),{ArgumentError:h}=n(6),{Task:d}=n(49);function b(t,e){null!==t.assignee&&([t.assignee]=e.filter(e=>e.id===t.assignee));for(const n of t.segments)for(const t of n.jobs)null!==t.assignee&&([t.assignee]=e.filter(e=>e.id===t.assignee));return null!==t.owner&&([t.owner]=e.filter(e=>e.id===t.owner)),t}t.exports=function(t){return t.plugins.list.implementation=e.list,t.plugins.register.implementation=e.register.bind(t),t.server.about.implementation=async()=>{return await r.server.about()},t.server.share.implementation=async t=>{return await r.server.share(t)},t.server.formats.implementation=async()=>{return(await r.server.formats()).map(t=>new p(t))},t.server.datasetFormats.implementation=async()=>{return await r.server.datasetFormats()},t.server.register.implementation=async(t,e,n,i,o,s)=>{await r.server.register(t,e,n,i,o,s)},t.server.login.implementation=async(t,e)=>{await r.server.login(t,e)},t.server.logout.implementation=async()=>{await r.server.logout()},t.server.authorized.implementation=async()=>{return await r.server.authorized()},t.server.request.implementation=async(t,e)=>{return await r.server.request(t,e)},t.users.get.implementation=async t=>{c(t,{self:i});let e=null;return e=(e="self"in t&&t.self?[e=await r.users.getSelf()]:await r.users.getUsers()).map(t=>new f(t))},t.jobs.get.implementation=async t=>{if(c(t,{taskID:o,jobID:o}),"taskID"in t&&"jobID"in t)throw new h('Only one of fields "taskID" and "jobID" allowed simultaneously');if(!Object.keys(t).length)throw new h("Job filter must not be empty");let e=null;if("taskID"in t)e=await r.tasks.getTasks(`id=${t.taskID}`);else{const n=await r.jobs.getJob(t.jobID);void 0!==n.task_id&&(e=await r.tasks.getTasks(`id=${n.task_id}`))}if(null!==e&&e.length){const n=(await r.users.getUsers()).map(t=>new f(t)),i=new d(b(e[0],n));return t.jobID?i.jobs.filter(e=>e.id===t.jobID):i.jobs}return[]},t.tasks.get.implementation=async t=>{if(c(t,{page:o,name:a,id:o,owner:a,assignee:a,search:a,status:s.bind(u),mode:s.bind(l)}),"search"in t&&Object.keys(t).length>1&&!("page"in t&&2===Object.keys(t).length))throw new h('Do not use the filter field "search" with others');if("id"in t&&Object.keys(t).length>1&&!("page"in t&&2===Object.keys(t).length))throw new h('Do not use the filter field "id" with others');const e=new URLSearchParams;for(const n of["name","owner","assignee","search","status","mode","id","page"])Object.prototype.hasOwnProperty.call(t,n)&&e.set(n,t[n]);const n=(await r.users.getUsers()).map(t=>new f(t)),i=await r.tasks.getTasks(e.toString()),p=i.map(t=>b(t,n)).map(t=>new d(t));return p.count=i.count,p},t}})()},function(t,e,n){"use strict";n(255);var r,i=n(12),o=n(13),s=n(139),a=n(0),c=n(104),u=n(18),l=n(64),f=n(9),p=n(256),h=n(257),d=n(67).codeAt,b=n(259),m=n(33),g=n(260),v=n(25),y=a.URL,w=g.URLSearchParams,k=g.getState,x=v.set,O=v.getterFor("URL"),j=Math.floor,S=Math.pow,_=/[A-Za-z]/,A=/[\d+\-.A-Za-z]/,T=/\d/,P=/^(0x|0X)/,E=/^[0-7]+$/,C=/^\d+$/,I=/^[\dA-Fa-f]+$/,F=/[\u0000\u0009\u000A\u000D #%/:?@[\\]]/,M=/[\u0000\u0009\u000A\u000D #/:?@[\\]]/,N=/^[\u0000-\u001F ]+|[\u0000-\u001F ]+$/g,R=/[\u0009\u000A\u000D]/g,D=function(t,e){var n,r,i;if("["==e.charAt(0)){if("]"!=e.charAt(e.length-1))return"Invalid host";if(!(n=B(e.slice(1,-1))))return"Invalid host";t.host=n}else if(V(t)){if(e=b(e),F.test(e))return"Invalid host";if(null===(n=$(e)))return"Invalid host";t.host=n}else{if(M.test(e))return"Invalid host";for(n="",r=h(e),i=0;i4)return t;for(n=[],r=0;r1&&"0"==i.charAt(0)&&(o=P.test(i)?16:8,i=i.slice(8==o?1:2)),""===i)s=0;else{if(!(10==o?C:8==o?E:I).test(i))return t;s=parseInt(i,o)}n.push(s)}for(r=0;r=S(256,5-e))return null}else if(s>255)return null;for(a=n.pop(),r=0;r6)return;for(r=0;p();){if(i=null,r>0){if(!("."==p()&&r<4))return;f++}if(!T.test(p()))return;for(;T.test(p());){if(o=parseInt(p(),10),null===i)i=o;else{if(0==i)return;i=10*i+o}if(i>255)return;f++}c[u]=256*c[u]+i,2!=++r&&4!=r||u++}if(4!=r)return;break}if(":"==p()){if(f++,!p())return}else if(p())return;c[u++]=e}else{if(null!==l)return;f++,l=++u}}if(null!==l)for(s=u-l,u=7;0!=u&&s>0;)a=c[u],c[u--]=c[l+s-1],c[l+--s]=a;else if(8!=u)return;return c},U=function(t){var e,n,r,i;if("number"==typeof t){for(e=[],n=0;n<4;n++)e.unshift(t%256),t=j(t/256);return e.join(".")}if("object"==typeof t){for(e="",r=function(t){for(var e=null,n=1,r=null,i=0,o=0;o<8;o++)0!==t[o]?(i>n&&(e=r,n=i),r=null,i=0):(null===r&&(r=o),++i);return i>n&&(e=r,n=i),e}(t),n=0;n<8;n++)i&&0===t[n]||(i&&(i=!1),r===n?(e+=n?":":"::",i=!0):(e+=t[n].toString(16),n<7&&(e+=":")));return"["+e+"]"}return t},L={},z=p({},L,{" ":1,'"':1,"<":1,">":1,"`":1}),q=p({},z,{"#":1,"?":1,"{":1,"}":1}),W=p({},q,{"/":1,":":1,";":1,"=":1,"@":1,"[":1,"\\":1,"]":1,"^":1,"|":1}),G=function(t,e){var n=d(t,0);return n>32&&n<127&&!f(e,t)?t:encodeURIComponent(t)},J={ftp:21,file:null,http:80,https:443,ws:80,wss:443},V=function(t){return f(J,t.scheme)},H=function(t){return""!=t.username||""!=t.password},X=function(t){return!t.host||t.cannotBeABaseURL||"file"==t.scheme},K=function(t,e){var n;return 2==t.length&&_.test(t.charAt(0))&&(":"==(n=t.charAt(1))||!e&&"|"==n)},Z=function(t){var e;return t.length>1&&K(t.slice(0,2))&&(2==t.length||"/"===(e=t.charAt(2))||"\\"===e||"?"===e||"#"===e)},Y=function(t){var e=t.path,n=e.length;!n||"file"==t.scheme&&1==n&&K(e[0],!0)||e.pop()},Q=function(t){return"."===t||"%2e"===t.toLowerCase()},tt={},et={},nt={},rt={},it={},ot={},st={},at={},ct={},ut={},lt={},ft={},pt={},ht={},dt={},bt={},mt={},gt={},vt={},yt={},wt={},kt=function(t,e,n,i){var o,s,a,c,u,l=n||tt,p=0,d="",b=!1,m=!1,g=!1;for(n||(t.scheme="",t.username="",t.password="",t.host=null,t.port=null,t.path=[],t.query=null,t.fragment=null,t.cannotBeABaseURL=!1,e=e.replace(N,"")),e=e.replace(R,""),o=h(e);p<=o.length;){switch(s=o[p],l){case tt:if(!s||!_.test(s)){if(n)return"Invalid scheme";l=nt;continue}d+=s.toLowerCase(),l=et;break;case et:if(s&&(A.test(s)||"+"==s||"-"==s||"."==s))d+=s.toLowerCase();else{if(":"!=s){if(n)return"Invalid scheme";d="",l=nt,p=0;continue}if(n&&(V(t)!=f(J,d)||"file"==d&&(H(t)||null!==t.port)||"file"==t.scheme&&!t.host))return;if(t.scheme=d,n)return void(V(t)&&J[t.scheme]==t.port&&(t.port=null));d="","file"==t.scheme?l=ht:V(t)&&i&&i.scheme==t.scheme?l=rt:V(t)?l=at:"/"==o[p+1]?(l=it,p++):(t.cannotBeABaseURL=!0,t.path.push(""),l=vt)}break;case nt:if(!i||i.cannotBeABaseURL&&"#"!=s)return"Invalid scheme";if(i.cannotBeABaseURL&&"#"==s){t.scheme=i.scheme,t.path=i.path.slice(),t.query=i.query,t.fragment="",t.cannotBeABaseURL=!0,l=wt;break}l="file"==i.scheme?ht:ot;continue;case rt:if("/"!=s||"/"!=o[p+1]){l=ot;continue}l=ct,p++;break;case it:if("/"==s){l=ut;break}l=gt;continue;case ot:if(t.scheme=i.scheme,s==r)t.username=i.username,t.password=i.password,t.host=i.host,t.port=i.port,t.path=i.path.slice(),t.query=i.query;else if("/"==s||"\\"==s&&V(t))l=st;else if("?"==s)t.username=i.username,t.password=i.password,t.host=i.host,t.port=i.port,t.path=i.path.slice(),t.query="",l=yt;else{if("#"!=s){t.username=i.username,t.password=i.password,t.host=i.host,t.port=i.port,t.path=i.path.slice(),t.path.pop(),l=gt;continue}t.username=i.username,t.password=i.password,t.host=i.host,t.port=i.port,t.path=i.path.slice(),t.query=i.query,t.fragment="",l=wt}break;case st:if(!V(t)||"/"!=s&&"\\"!=s){if("/"!=s){t.username=i.username,t.password=i.password,t.host=i.host,t.port=i.port,l=gt;continue}l=ut}else l=ct;break;case at:if(l=ct,"/"!=s||"/"!=d.charAt(p+1))continue;p++;break;case ct:if("/"!=s&&"\\"!=s){l=ut;continue}break;case ut:if("@"==s){b&&(d="%40"+d),b=!0,a=h(d);for(var v=0;v65535)return"Invalid port";t.port=V(t)&&k===J[t.scheme]?null:k,d=""}if(n)return;l=mt;continue}return"Invalid port"}d+=s;break;case ht:if(t.scheme="file","/"==s||"\\"==s)l=dt;else{if(!i||"file"!=i.scheme){l=gt;continue}if(s==r)t.host=i.host,t.path=i.path.slice(),t.query=i.query;else if("?"==s)t.host=i.host,t.path=i.path.slice(),t.query="",l=yt;else{if("#"!=s){Z(o.slice(p).join(""))||(t.host=i.host,t.path=i.path.slice(),Y(t)),l=gt;continue}t.host=i.host,t.path=i.path.slice(),t.query=i.query,t.fragment="",l=wt}}break;case dt:if("/"==s||"\\"==s){l=bt;break}i&&"file"==i.scheme&&!Z(o.slice(p).join(""))&&(K(i.path[0],!0)?t.path.push(i.path[0]):t.host=i.host),l=gt;continue;case bt:if(s==r||"/"==s||"\\"==s||"?"==s||"#"==s){if(!n&&K(d))l=gt;else if(""==d){if(t.host="",n)return;l=mt}else{if(c=D(t,d))return c;if("localhost"==t.host&&(t.host=""),n)return;d="",l=mt}continue}d+=s;break;case mt:if(V(t)){if(l=gt,"/"!=s&&"\\"!=s)continue}else if(n||"?"!=s)if(n||"#"!=s){if(s!=r&&(l=gt,"/"!=s))continue}else t.fragment="",l=wt;else t.query="",l=yt;break;case gt:if(s==r||"/"==s||"\\"==s&&V(t)||!n&&("?"==s||"#"==s)){if(".."===(u=(u=d).toLowerCase())||"%2e."===u||".%2e"===u||"%2e%2e"===u?(Y(t),"/"==s||"\\"==s&&V(t)||t.path.push("")):Q(d)?"/"==s||"\\"==s&&V(t)||t.path.push(""):("file"==t.scheme&&!t.path.length&&K(d)&&(t.host&&(t.host=""),d=d.charAt(0)+":"),t.path.push(d)),d="","file"==t.scheme&&(s==r||"?"==s||"#"==s))for(;t.path.length>1&&""===t.path[0];)t.path.shift();"?"==s?(t.query="",l=yt):"#"==s&&(t.fragment="",l=wt)}else d+=G(s,q);break;case vt:"?"==s?(t.query="",l=yt):"#"==s?(t.fragment="",l=wt):s!=r&&(t.path[0]+=G(s,L));break;case yt:n||"#"!=s?s!=r&&("'"==s&&V(t)?t.query+="%27":t.query+="#"==s?"%23":G(s,L)):(t.fragment="",l=wt);break;case wt:s!=r&&(t.fragment+=G(s,z))}p++}},xt=function(t){var e,n,r=l(this,xt,"URL"),i=arguments.length>1?arguments[1]:void 0,s=String(t),a=x(r,{type:"URL"});if(void 0!==i)if(i instanceof xt)e=O(i);else if(n=kt(e={},String(i)))throw TypeError(n);if(n=kt(a,s,null,e))throw TypeError(n);var c=a.searchParams=new w,u=k(c);u.updateSearchParams(a.query),u.updateURL=function(){a.query=String(c)||null},o||(r.href=jt.call(r),r.origin=St.call(r),r.protocol=_t.call(r),r.username=At.call(r),r.password=Tt.call(r),r.host=Pt.call(r),r.hostname=Et.call(r),r.port=Ct.call(r),r.pathname=It.call(r),r.search=Ft.call(r),r.searchParams=Mt.call(r),r.hash=Nt.call(r))},Ot=xt.prototype,jt=function(){var t=O(this),e=t.scheme,n=t.username,r=t.password,i=t.host,o=t.port,s=t.path,a=t.query,c=t.fragment,u=e+":";return null!==i?(u+="//",H(t)&&(u+=n+(r?":"+r:"")+"@"),u+=U(i),null!==o&&(u+=":"+o)):"file"==e&&(u+="//"),u+=t.cannotBeABaseURL?s[0]:s.length?"/"+s.join("/"):"",null!==a&&(u+="?"+a),null!==c&&(u+="#"+c),u},St=function(){var t=O(this),e=t.scheme,n=t.port;if("blob"==e)try{return new URL(e.path[0]).origin}catch(t){return"null"}return"file"!=e&&V(t)?e+"://"+U(t.host)+(null!==n?":"+n:""):"null"},_t=function(){return O(this).scheme+":"},At=function(){return O(this).username},Tt=function(){return O(this).password},Pt=function(){var t=O(this),e=t.host,n=t.port;return null===e?"":null===n?U(e):U(e)+":"+n},Et=function(){var t=O(this).host;return null===t?"":U(t)},Ct=function(){var t=O(this).port;return null===t?"":String(t)},It=function(){var t=O(this),e=t.path;return t.cannotBeABaseURL?e[0]:e.length?"/"+e.join("/"):""},Ft=function(){var t=O(this).query;return t?"?"+t:""},Mt=function(){return O(this).searchParams},Nt=function(){var t=O(this).fragment;return t?"#"+t:""},Rt=function(t,e){return{get:t,set:e,configurable:!0,enumerable:!0}};if(o&&c(Ot,{href:Rt(jt,(function(t){var e=O(this),n=String(t),r=kt(e,n);if(r)throw TypeError(r);k(e.searchParams).updateSearchParams(e.query)})),origin:Rt(St),protocol:Rt(_t,(function(t){var e=O(this);kt(e,String(t)+":",tt)})),username:Rt(At,(function(t){var e=O(this),n=h(String(t));if(!X(e)){e.username="";for(var r=0;r=n.length?{value:void 0,done:!0}:(t=r(n,i),e.index+=t.length,{value:t,done:!1})}))},function(t,e,n){"use strict";var r=n(13),i=n(3),o=n(105),s=n(92),a=n(84),c=n(37),u=n(85),l=Object.assign;t.exports=!l||i((function(){var t={},e={},n=Symbol();return t[n]=7,"abcdefghijklmnopqrst".split("").forEach((function(t){e[t]=t})),7!=l({},t)[n]||"abcdefghijklmnopqrst"!=o(l({},e)).join("")}))?function(t,e){for(var n=c(t),i=arguments.length,l=1,f=s.f,p=a.f;i>l;)for(var h,d=u(arguments[l++]),b=f?o(d).concat(f(d)):o(d),m=b.length,g=0;m>g;)h=b[g++],r&&!p.call(d,h)||(n[h]=d[h]);return n}:l},function(t,e,n){"use strict";var r=n(47),i=n(37),o=n(97),s=n(96),a=n(45),c=n(258),u=n(48);t.exports=function(t){var e,n,l,f,p,h=i(t),d="function"==typeof this?this:Array,b=arguments.length,m=b>1?arguments[1]:void 0,g=void 0!==m,v=0,y=u(h);if(g&&(m=r(m,b>2?arguments[2]:void 0,2)),null==y||d==Array&&s(y))for(n=new d(e=a(h.length));e>v;v++)c(n,v,g?m(h[v],v):h[v]);else for(p=(f=y.call(h)).next,n=new d;!(l=p.call(f)).done;v++)c(n,v,g?o(f,m,[l.value,v],!0):l.value);return n.length=v,n}},function(t,e,n){"use strict";var r=n(58),i=n(21),o=n(42);t.exports=function(t,e,n){var s=r(e);s in t?i.f(t,s,o(0,n)):t[s]=n}},function(t,e,n){"use strict";var r=/[^\0-\u007E]/,i=/[.\u3002\uFF0E\uFF61]/g,o="Overflow: input needs wider integers to process",s=Math.floor,a=String.fromCharCode,c=function(t){return t+22+75*(t<26)},u=function(t,e,n){var r=0;for(t=n?s(t/700):t>>1,t+=s(t/e);t>455;r+=36)t=s(t/35);return s(r+36*t/(t+38))},l=function(t){var e,n,r=[],i=(t=function(t){for(var e=[],n=0,r=t.length;n=55296&&i<=56319&&n=l&&ns((2147483647-f)/m))throw RangeError(o);for(f+=(b-l)*m,l=b,e=0;e2147483647)throw RangeError(o);if(n==l){for(var g=f,v=36;;v+=36){var y=v<=p?1:v>=p+26?26:v-p;if(g0?arguments[0]:void 0,p=this,g=[];if(v(p,{type:"URLSearchParams",entries:g,updateURL:function(){},updateSearchParams:C}),void 0!==u)if(d(u))if("function"==typeof(t=m(u)))for(n=(e=t.call(u)).next;!(r=n.call(e)).done;){if((s=(o=(i=b(h(r.value))).next).call(i)).done||(a=o.call(i)).done||!o.call(i).done)throw TypeError("Expected sequence with length 2");g.push({key:s.value+"",value:a.value+""})}else for(c in u)f(u,c)&&g.push({key:c,value:u[c]+""});else E(g,"string"==typeof u?"?"===u.charAt(0)?u.slice(1):u:u+"")},N=M.prototype;s(N,{append:function(t,e){I(arguments.length,2);var n=y(this);n.entries.push({key:t+"",value:e+""}),n.updateURL()},delete:function(t){I(arguments.length,1);for(var e=y(this),n=e.entries,r=t+"",i=0;it.key){i.splice(e,0,t);break}e===n&&i.push(t)}r.updateURL()},forEach:function(t){for(var e,n=y(this).entries,r=p(t,arguments.length>1?arguments[1]:void 0,3),i=0;i=0)return;s[e]="set-cookie"===e?(s[e]?s[e]:[]).concat([n]):s[e]?s[e]+", "+n:n}})),s):s}},function(t,e,n){"use strict";var r=n(7);t.exports=r.isStandardBrowserEnv()?function(){var t,e=/(msie|trident)/i.test(navigator.userAgent),n=document.createElement("a");function i(t){var r=t;return e&&(n.setAttribute("href",r),r=n.href),n.setAttribute("href",r),{href:n.href,protocol:n.protocol?n.protocol.replace(/:$/,""):"",host:n.host,search:n.search?n.search.replace(/^\?/,""):"",hash:n.hash?n.hash.replace(/^#/,""):"",hostname:n.hostname,port:n.port,pathname:"/"===n.pathname.charAt(0)?n.pathname:"/"+n.pathname}}return t=i(window.location.href),function(e){var n=r.isString(e)?i(e):e;return n.protocol===t.protocol&&n.host===t.host}}():function(){return!0}},function(t,e,n){"use strict";var r=n(7);t.exports=r.isStandardBrowserEnv()?{write:function(t,e,n,i,o,s){var a=[];a.push(t+"="+encodeURIComponent(e)),r.isNumber(n)&&a.push("expires="+new Date(n).toGMTString()),r.isString(i)&&a.push("path="+i),r.isString(o)&&a.push("domain="+o),!0===s&&a.push("secure"),document.cookie=a.join("; ")},read:function(t){var e=document.cookie.match(new RegExp("(^|;\\s*)("+t+")=([^;]*)"));return e?decodeURIComponent(e[3]):null},remove:function(t){this.write(t,"",Date.now()-864e5)}}:{write:function(){},read:function(){return null},remove:function(){}}},function(t,e,n){"use strict";var r=n(7);function i(){this.handlers=[]}i.prototype.use=function(t,e){return this.handlers.push({fulfilled:t,rejected:e}),this.handlers.length-1},i.prototype.eject=function(t){this.handlers[t]&&(this.handlers[t]=null)},i.prototype.forEach=function(t){r.forEach(this.handlers,(function(e){null!==e&&t(e)}))},t.exports=i},function(t,e,n){"use strict";var r=n(7),i=n(195),o=n(115),s=n(68),a=n(196),c=n(197);function u(t){t.cancelToken&&t.cancelToken.throwIfRequested()}t.exports=function(t){return u(t),t.baseURL&&!a(t.url)&&(t.url=c(t.baseURL,t.url)),t.headers=t.headers||{},t.data=i(t.data,t.headers,t.transformRequest),t.headers=r.merge(t.headers.common||{},t.headers[t.method]||{},t.headers||{}),r.forEach(["delete","get","head","post","put","patch","common"],(function(e){delete t.headers[e]})),(t.adapter||s.adapter)(t).then((function(e){return u(t),e.data=i(e.data,e.headers,t.transformResponse),e}),(function(e){return o(e)||(u(t),e&&e.response&&(e.response.data=i(e.response.data,e.response.headers,t.transformResponse))),Promise.reject(e)}))}},function(t,e,n){"use strict";var r=n(7);t.exports=function(t,e,n){return r.forEach(n,(function(n){t=n(t,e)})),t}},function(t,e,n){"use strict";t.exports=function(t){return/^([a-z][a-z\d\+\-\.]*:)?\/\//i.test(t)}},function(t,e,n){"use strict";t.exports=function(t,e){return e?t.replace(/\/+$/,"")+"/"+e.replace(/^\/+/,""):t}},function(t,e,n){"use strict";var r=n(116);function i(t){if("function"!=typeof t)throw new TypeError("executor must be a function.");var e;this.promise=new Promise((function(t){e=t}));var n=this;t((function(t){n.reason||(n.reason=new r(t),e(n.reason))}))}i.prototype.throwIfRequested=function(){if(this.reason)throw this.reason},i.source=function(){var t;return{token:new i((function(e){t=e})),cancel:t}},t.exports=i},function(t,e,n){"use strict";t.exports=function(t){return function(e){return t.apply(null,e)}}},function(t,e,n){"use strict";var r=n(12),i=n(201).trim;r({target:"String",proto:!0,forced:n(202)("trim")},{trim:function(){return i(this)}})},function(t,e,n){var r=n(31),i="["+n(118)+"]",o=RegExp("^"+i+i+"*"),s=RegExp(i+i+"*$"),a=function(t){return function(e){var n=String(r(e));return 1&t&&(n=n.replace(o,"")),2&t&&(n=n.replace(s,"")),n}};t.exports={start:a(1),end:a(2),trim:a(3)}},function(t,e,n){var r=n(3),i=n(118);t.exports=function(t){return r((function(){return!!i[t]()||"​…᠎"!="​…᠎"[t]()||i[t].name!==t}))}},function(t,e,n){(function(e){n(5),n(11),n(204),n(10),(()=>{const r=n(205),i=n(36),o=n(26),{isBrowser:s,isNode:a}=n(246),{Exception:c,ArgumentError:u}=n(6),l={};class f{constructor(t,e,n,r,i,o){Object.defineProperties(this,Object.freeze({width:{value:t,writable:!1},height:{value:e,writable:!1},tid:{value:n,writable:!1},number:{value:r,writable:!1},startFrame:{value:i,writable:!1},stopFrame:{value:o,writable:!1}}))}async data(t=(()=>{})){return await i.apiWrapper.call(this,f.prototype.data,t)}}f.prototype.data.implementation=async function(t){return new Promise((e,n)=>{const{provider:r}=l[this.tid],{chunkSize:i}=l[this.tid],u=Math.max(this.startFrame,parseInt(this.number/i,10)*i),f=Math.min(this.stopFrame,(parseInt(this.number/i,10)+1)*i-1),p=Math.floor(this.number/i),h=t=>{if(l[this.tid].activeChunkRequest&&p===l[this.tid].activeChunkRequest.chunkNumber){const e=l[this.tid].activeChunkRequest.callbacks;for(const n of e)n.resolve(r.frame(t));l[this.tid].activeChunkRequest=void 0}},d=()=>{if(l[this.tid].activeChunkRequest&&p===l[this.tid].activeChunkRequest.chunkNumber){for(const t of l[this.tid].activeChunkRequest.callbacks)t.reject(t.frameNumber);l[this.tid].activeChunkRequest=void 0}},b=()=>{const t=l[this.tid].activeChunkRequest;t.request=o.frames.getData(this.tid,t.chunkNumber).then(t=>{l[this.tid].activeChunkRequest.completed=!0,r.requestDecodeBlock(t,l[this.tid].activeChunkRequest.start,l[this.tid].activeChunkRequest.stop,l[this.tid].activeChunkRequest.onDecodeAll,l[this.tid].activeChunkRequest.rejectRequestAll)}).catch(t=>{n(t instanceof c?t:new c(t.message))}).finally(()=>{if(l[this.tid].nextChunkRequest){if(l[this.tid].activeChunkRequest)for(const t of l[this.tid].activeChunkRequest.callbacks)t.reject(t.frameNumber);l[this.tid].activeChunkRequest=l[this.tid].nextChunkRequest,l[this.tid].nextChunkRequest=void 0,b()}})};a?e("Dummy data"):s&&r.frame(this.number).then(i=>{if(null===i)if(t(),r.is_chunk_cached(u,f))l[this.tid].activeChunkRequest.callbacks.push({resolve:e,reject:n,frameNumber:this.number}),r.requestDecodeBlock(null,u,f,h,d);else if(!l[this.tid].activeChunkRequest||l[this.tid].activeChunkRequest&&l[this.tid].activeChunkRequest.completed)l[this.tid].activeChunkRequest&&l[this.tid].activeChunkRequest.rejectRequestAll(),l[this.tid].activeChunkRequest={request:void 0,chunkNumber:p,start:u,stop:f,onDecodeAll:h,rejectRequestAll:d,completed:!1,callbacks:[{resolve:e,reject:n,frameNumber:this.number}]},b();else if(l[this.tid].activeChunkRequest.chunkNumber===p)l[this.tid].activeChunkRequest.callbacks.push({resolve:e,reject:n,frameNumber:this.number});else{if(l[this.tid].nextChunkRequest){const{callbacks:t}=l[this.tid].nextChunkRequest;for(const e of t)e.reject(e.frameNumber)}l[this.tid].nextChunkRequest={request:void 0,chunkNumber:p,start:u,stop:f,onDecodeAll:h,rejectRequestAll:d,completed:!1,callbacks:[{resolve:e,reject:n,frameNumber:this.number}]}}else e(i)}).catch(t=>{n(t instanceof c?t:new c(t.message))})})},t.exports={FrameData:f,getFrame:async function(t,e,n,i,s,a,c){if(!(t in l)){const i="video"===n?r.BlockType.MP4VIDEO:r.BlockType.ARCHIVE,a=await o.frames.getMeta(t),c=i===r.BlockType.MP4VIDEO?Math.floor(258.90765432098766/e)||1:Math.floor(500/e)||1;l[t]={meta:a,chunkSize:e,provider:new r.FrameProvider(i,e,9,c,1),lastFrameRequest:s,decodedBlocksCacheSize:c,activeChunkRequest:void 0,nextChunkRequest:void 0}}const p=(t=>{let e=null;if("interpolation"===i)[e]=t;else{if("annotation"!==i)throw new u(`Invalid mode is specified ${i}`);if(s>=t.length)throw new u(`Meta information about frame ${s} can't be received from the server`);e=t[s]}return e})(l[t].meta);return l[t].lastFrameRequest=s,l[t].provider.setRenderSize(p.width,p.height),new f(p.width,p.height,t,s,a,c)},getRanges:function(t){return t in l?l[t].provider.cachedFrames:[]},getPreview:async function(t){return new Promise((n,r)=>{o.frames.getPreview(t).then(t=>{if(a)n(e.Buffer.from(t,"binary").toString("base64"));else if(s){const e=new FileReader;e.onload=()=>{n(e.result)},e.readAsDataURL(t)}}).catch(t=>{r(t)})})}}})()}).call(this,n(30))},function(t,e,n){"use strict";var r=n(12),i=n(24),o=n(94),s=n(32),a=n(98),c=n(101),u=n(18);r({target:"Promise",proto:!0,real:!0},{finally:function(t){var e=a(this,s("Promise")),n="function"==typeof t;return this.then(n?function(n){return c(e,t()).then((function(){return n}))}:t,n?function(n){return c(e,t()).then((function(){throw n}))}:t)}}),i||"function"!=typeof o||o.prototype.finally||u(o.prototype,"finally",s("Promise").prototype.finally)},function(t,e,n){n(72),n(225),n(227),n(243);const{MP4Reader:r,Bytestream:i}=n(245),o=Object.freeze({MP4VIDEO:"mp4video",ARCHIVE:"archive"});class s{constructor(){this._lock=Promise.resolve()}_acquire(){var t;return this._lock=new Promise(e=>{t=e}),t}acquireQueued(){const t=this._lock.then(()=>e),e=this._acquire();return t}}t.exports={FrameProvider:class{constructor(t,e,n,r=5,i=2){this._frames={},this._cachedBlockCount=Math.max(1,n),this._decodedBlocksCacheSize=r,this._blocks_ranges=[],this._blocks={},this._blockSize=e,this._running=!1,this._blockType=t,this._currFrame=-1,this._requestedBlockDecode=null,this._width=null,this._height=null,this._decodingBlocks={},this._decodeThreadCount=0,this._timerId=setTimeout(this._worker.bind(this),100),this._mutex=new s,this._promisedFrames={},this._maxWorkerThreadCount=i}async _worker(){null!=this._requestedBlockDecode&&this._decodeThreadCountthis._cachedBlockCount){const t=this._blocks_ranges.shift(),[e,n]=t.split(":").map(t=>+t);delete this._blocks[e/this._blockSize];for(let t=e;t<=n;t++)delete this._frames[t]}const t=Math.floor(this._decodedBlocksCacheSize/2);for(let e=0;e+t);if(rthis._currFrame+t*this._blockSize)for(let t=n;t<=r;t++)delete this._frames[t]}}async requestDecodeBlock(t,e,n,r,i){const o=await this._mutex.acquireQueued();null!==this._requestedBlockDecode&&(e===this._requestedBlockDecode.start&&n===this._requestedBlockDecode.end?(this._requestedBlockDecode.resolveCallback=r,this._requestedBlockDecode.rejectCallback=i):this._requestedBlockDecode.rejectCallback&&this._requestedBlockDecode.rejectCallback()),`${e}:${n}`in this._decodingBlocks?(this._decodingBlocks[`${e}:${n}`].rejectCallback=i,this._decodingBlocks[`${e}:${n}`].resolveCallback=r):(null===t&&(t=this._blocks[Math.floor((e+1)/this.blockSize)]),this._requestedBlockDecode={block:t,start:e,end:n,resolveCallback:r,rejectCallback:i}),o()}isRequestExist(){return null!=this._requestedBlockDecode}setRenderSize(t,e){this._width=t,this._height=e}async frame(t){return this._currFrame=t,new Promise((e,n)=>{t in this._frames?null!==this._frames[t]?e(this._frames[t]):this._promisedFrames[t]={resolve:e,reject:n}:e(null)})}isNextChunkExists(t){const e=Math.floor(t/this._blockSize)+1;return"loading"===this._blocks[e]||e in this._blocks}setReadyToLoading(t){this._blocks[t]="loading"}cropImage(t,e,n,r,i,o,s){if(0===r&&o===e&&0===i&&s===n)return new ImageData(new Uint8ClampedArray(t),o,s);const a=new Uint32Array(t),c=o*s*4,u=new ArrayBuffer(c),l=new Uint32Array(u),f=new Uint8ClampedArray(u);if(e===o)return new ImageData(new Uint8ClampedArray(t,4*i,c),o,s);let p=0;for(let t=i;t{if(r.data.consoleLog)return;const i=Math.ceil(this._height/r.data.height);this._frames[o]=this.cropImage(r.data.buf,r.data.width,r.data.height,0,0,Math.floor(n/i),Math.floor(e/i)),this._decodingBlocks[`${s}:${a}`].resolveCallback&&this._decodingBlocks[`${s}:${a}`].resolveCallback(o),o in this._promisedFrames&&(this._promisedFrames[o].resolve(this._frames[o]),delete this._promisedFrames[o]),o===a&&(this._decodeThreadCount--,delete this._decodingBlocks[`${s}:${a}`],t.terminate()),o++},t.onerror=e=>{console.log(["ERROR: Line ",e.lineno," in ",e.filename,": ",e.message].join("")),t.terminate(),this._decodeThreadCount--;for(let t=o;t<=a;t++)t in this._promisedFrames&&(this._promisedFrames[t].reject(),delete this._promisedFrames[t]);this._decodingBlocks[`${s}:${a}`].rejectCallback&&this._decodingBlocks[`${s}:${a}`].rejectCallback(),delete this._decodingBlocks[`${s}:${a}`]},t.postMessage({type:"Broadway.js - Worker init",options:{rgb:!0,reuseMemory:!1}});const u=new r(new i(c));u.read();const l=u.tracks[1],f=u.tracks[1].trak.mdia.minf.stbl.stsd.avc1.avcC,p=f.sps[0],h=f.pps[0];t.postMessage({buf:p,offset:0,length:p.length}),t.postMessage({buf:h,offset:0,length:h.length});for(let e=0;e{t.postMessage({buf:e,offset:0,length:e.length})});this._decodeThreadCount++}else{const t=new Worker("/static/engine/js/unzip_imgs.js");t.onerror=t=>{console.log(["ERROR: Line ",t.lineno," in ",t.filename,": ",t.message].join(""));for(let t=s;t<=a;t++)t in this._promisedFrames&&(this._promisedFrames[t].reject(),delete this._promisedFrames[t]);this._decodingBlocks[`${s}:${a}`].rejectCallback&&this._decodingBlocks[`${s}:${a}`].rejectCallback(),this._decodeThreadCount--},t.onmessage=t=>{this._frames[t.data.index]={data:t.data.data,width:n,height:e},this._decodingBlocks[`${s}:${a}`].resolveCallback&&this._decodingBlocks[`${s}:${a}`].resolveCallback(t.data.index),t.data.index in this._promisedFrames&&(this._promisedFrames[t.data.index].resolve(this._frames[t.data.index]),delete this._promisedFrames[t.data.index]),t.data.isEnd&&(delete this._decodingBlocks[`${s}:${a}`],this._decodeThreadCount--)},t.postMessage({block:c,start:s,end:a}),this._decodeThreadCount++}t()}get decodeThreadCount(){return this._decodeThreadCount}get cachedFrames(){return[...this._blocks_ranges].sort((t,e)=>t.split(":")[0]-e.split(":")[0])}},BlockType:o}},function(t,e,n){var r=n(16),i=n(38),o="".split;t.exports=r((function(){return!Object("z").propertyIsEnumerable(0)}))?function(t){return"String"==i(t)?o.call(t,""):Object(t)}:Object},function(t,e,n){var r=n(8),i=n(123),o=n(19),s=r("unscopables"),a=Array.prototype;null==a[s]&&o(a,s,i(null)),t.exports=function(t){a[s][t]=!0}},function(t,e,n){var r=n(1),i=n(73),o=r["__core-js_shared__"]||i("__core-js_shared__",{});t.exports=o},function(t,e,n){var r=n(16);t.exports=!!Object.getOwnPropertySymbols&&!r((function(){return!String(Symbol())}))},function(t,e,n){var r=n(28),i=n(39),o=n(17),s=n(211);t.exports=r?Object.defineProperties:function(t,e){o(t);for(var n,r=s(e),a=r.length,c=0;a>c;)i.f(t,n=r[c++],e[n]);return t}},function(t,e,n){var r=n(124),i=n(77);t.exports=Object.keys||function(t){return r(t,i)}},function(t,e,n){var r=n(50),i=n(125),o=n(213),s=function(t){return function(e,n,s){var a,c=r(e),u=i(c.length),l=o(s,u);if(t&&n!=n){for(;u>l;)if((a=c[l++])!=a)return!0}else for(;u>l;l++)if((t||l in c)&&c[l]===n)return t||l||0;return!t&&-1}};t.exports={includes:s(!0),indexOf:s(!1)}},function(t,e,n){var r=n(126),i=Math.max,o=Math.min;t.exports=function(t,e){var n=r(t);return n<0?i(n+e,0):o(n,e)}},function(t,e,n){var r=n(1),i=n(129),o=r.WeakMap;t.exports="function"==typeof o&&/native code/.test(i.call(o))},function(t,e,n){"use strict";var r=n(80),i=n(221),o=n(132),s=n(223),a=n(82),c=n(19),u=n(54),l=n(8),f=n(52),p=n(40),h=n(131),d=h.IteratorPrototype,b=h.BUGGY_SAFARI_ITERATORS,m=l("iterator"),g=function(){return this};t.exports=function(t,e,n,l,h,v,y){i(n,e,l);var w,k,x,O=function(t){if(t===h&&T)return T;if(!b&&t in _)return _[t];switch(t){case"keys":case"values":case"entries":return function(){return new n(this,t)}}return function(){return new n(this)}},j=e+" Iterator",S=!1,_=t.prototype,A=_[m]||_["@@iterator"]||h&&_[h],T=!b&&A||O(h),P="Array"==e&&_.entries||A;if(P&&(w=o(P.call(new t)),d!==Object.prototype&&w.next&&(f||o(w)===d||(s?s(w,d):"function"!=typeof w[m]&&c(w,m,g)),a(w,j,!0,!0),f&&(p[j]=g))),"values"==h&&A&&"values"!==A.name&&(S=!0,T=function(){return A.call(this)}),f&&!y||_[m]===T||c(_,m,T),p[e]=T,h)if(k={values:O("values"),keys:v?T:O("keys"),entries:O("entries")},y)for(x in k)!b&&!S&&x in _||u(_,x,k[x]);else r({target:e,proto:!0,forced:b||S},k);return k}},function(t,e,n){"use strict";var r={}.propertyIsEnumerable,i=Object.getOwnPropertyDescriptor,o=i&&!r.call({1:2},1);e.f=o?function(t){var e=i(this,t);return!!e&&e.enumerable}:r},function(t,e,n){var r=n(20),i=n(218),o=n(81),s=n(39);t.exports=function(t,e){for(var n=i(e),a=s.f,c=o.f,u=0;us;){var a,c,u,l=r[s++],f=o?l.ok:l.fail,p=l.resolve,h=l.reject,d=l.domain;try{f?(o||(2===e.rejection&&et(t,e),e.rejection=1),!0===f?a=i:(d&&d.enter(),a=f(i),d&&(d.exit(),u=!0)),a===l.promise?h($("Promise-chain cycle")):(c=K(a))?c.call(a,p,h):p(a)):h(i)}catch(t){d&&!u&&d.exit(),h(t)}}e.reactions=[],e.notified=!1,n&&!e.rejection&&Q(t,e)}))}},Y=function(t,e,n){var r,i;V?((r=B.createEvent("Event")).promise=e,r.reason=n,r.initEvent(t,!1,!0),u.dispatchEvent(r)):r={promise:e,reason:n},(i=u["on"+t])?i(r):"unhandledrejection"===t&&_("Unhandled promise rejection",n)},Q=function(t,e){O.call(u,(function(){var n,r=e.value;if(tt(e)&&(n=T((function(){J?U.emit("unhandledRejection",r,t):Y("unhandledrejection",t,r)})),e.rejection=J||tt(e)?2:1,n.error))throw n.value}))},tt=function(t){return 1!==t.rejection&&!t.parent},et=function(t,e){O.call(u,(function(){J?U.emit("rejectionHandled",t):Y("rejectionhandled",t,e.value)}))},nt=function(t,e,n,r){return function(i){t(e,n,i,r)}},rt=function(t,e,n,r){e.done||(e.done=!0,r&&(e=r),e.value=n,e.state=2,Z(t,e,!0))},it=function(t,e,n,r){if(!e.done){e.done=!0,r&&(e=r);try{if(t===n)throw $("Promise can't be resolved itself");var i=K(n);i?j((function(){var r={done:!1};try{i.call(n,nt(it,t,r,e),nt(rt,t,r,e))}catch(n){rt(t,r,n,e)}})):(e.value=n,e.state=1,Z(t,e,!1))}catch(n){rt(t,{done:!1},n,e)}}};H&&(D=function(t){v(this,D,F),g(t),r.call(this);var e=M(this);try{t(nt(it,this,e),nt(rt,this,e))}catch(t){rt(this,e,t)}},(r=function(t){N(this,{type:F,done:!1,notified:!1,parent:!1,reactions:[],rejection:!1,state:0,value:void 0})}).prototype=h(D.prototype,{then:function(t,e){var n=R(this),r=W(x(this,D));return r.ok="function"!=typeof t||t,r.fail="function"==typeof e&&e,r.domain=J?U.domain:void 0,n.parent=!0,n.reactions.push(r),0!=n.state&&Z(this,n,!1),r.promise},catch:function(t){return this.then(void 0,t)}}),i=function(){var t=new r,e=M(t);this.promise=t,this.resolve=nt(it,t,e),this.reject=nt(rt,t,e)},A.f=W=function(t){return t===D||t===o?new i(t):G(t)},c||"function"!=typeof f||(s=f.prototype.then,p(f.prototype,"then",(function(t,e){var n=this;return new D((function(t,e){s.call(n,t,e)})).then(t,e)}),{unsafe:!0}),"function"==typeof L&&a({global:!0,enumerable:!0,forced:!0},{fetch:function(t){return S(D,L.apply(u,arguments))}}))),a({global:!0,wrap:!0,forced:H},{Promise:D}),d(D,F,!1,!0),b(F),o=l.Promise,a({target:F,stat:!0,forced:H},{reject:function(t){var e=W(this);return e.reject.call(void 0,t),e.promise}}),a({target:F,stat:!0,forced:c||H},{resolve:function(t){return S(c&&this===o?D:this,t)}}),a({target:F,stat:!0,forced:X},{all:function(t){var e=this,n=W(e),r=n.resolve,i=n.reject,o=T((function(){var n=g(e.resolve),o=[],s=0,a=1;w(t,(function(t){var c=s++,u=!1;o.push(void 0),a++,n.call(e,t).then((function(t){u||(u=!0,o[c]=t,--a||r(o))}),i)})),--a||r(o)}));return o.error&&i(o.value),n.promise},race:function(t){var e=this,n=W(e),r=n.reject,i=T((function(){var i=g(e.resolve);w(t,(function(t){i.call(e,t).then(n.resolve,r)}))}));return i.error&&r(i.value),n.promise}})},function(t,e,n){var r=n(1);t.exports=r.Promise},function(t,e,n){var r=n(54);t.exports=function(t,e,n){for(var i in e)r(t,i,e[i],n);return t}},function(t,e,n){"use strict";var r=n(53),i=n(39),o=n(8),s=n(28),a=o("species");t.exports=function(t){var e=r(t),n=i.f;s&&e&&!e[a]&&n(e,a,{configurable:!0,get:function(){return this}})}},function(t,e){t.exports=function(t,e,n){if(!(t instanceof e))throw TypeError("Incorrect "+(n?n+" ":"")+"invocation");return t}},function(t,e,n){var r=n(17),i=n(233),o=n(125),s=n(134),a=n(234),c=n(236),u=function(t,e){this.stopped=t,this.result=e};(t.exports=function(t,e,n,l,f){var p,h,d,b,m,g,v,y=s(e,n,l?2:1);if(f)p=t;else{if("function"!=typeof(h=a(t)))throw TypeError("Target is not iterable");if(i(h)){for(d=0,b=o(t.length);b>d;d++)if((m=l?y(r(v=t[d])[0],v[1]):y(t[d]))&&m instanceof u)return m;return new u(!1)}p=h.call(t)}for(g=p.next;!(v=g.call(p)).done;)if("object"==typeof(m=c(p,y,v.value,l))&&m&&m instanceof u)return m;return new u(!1)}).stop=function(t){return new u(!0,t)}},function(t,e,n){var r=n(8),i=n(40),o=r("iterator"),s=Array.prototype;t.exports=function(t){return void 0!==t&&(i.Array===t||s[o]===t)}},function(t,e,n){var r=n(235),i=n(40),o=n(8)("iterator");t.exports=function(t){if(null!=t)return t[o]||t["@@iterator"]||i[r(t)]}},function(t,e,n){var r=n(38),i=n(8)("toStringTag"),o="Arguments"==r(function(){return arguments}());t.exports=function(t){var e,n,s;return void 0===t?"Undefined":null===t?"Null":"string"==typeof(n=function(t,e){try{return t[e]}catch(t){}}(e=Object(t),i))?n:o?r(e):"Object"==(s=r(e))&&"function"==typeof e.callee?"Arguments":s}},function(t,e,n){var r=n(17);t.exports=function(t,e,n,i){try{return i?e(r(n)[0],n[1]):e(n)}catch(e){var o=t.return;throw void 0!==o&&r(o.call(t)),e}}},function(t,e,n){var r=n(8)("iterator"),i=!1;try{var o=0,s={next:function(){return{done:!!o++}},return:function(){i=!0}};s[r]=function(){return this},Array.from(s,(function(){throw 2}))}catch(t){}t.exports=function(t,e){if(!e&&!i)return!1;var n=!1;try{var o={};o[r]=function(){return{next:function(){return{done:n=!0}}}},t(o)}catch(t){}return n}},function(t,e,n){var r=n(17),i=n(41),o=n(8)("species");t.exports=function(t,e){var n,s=r(t).constructor;return void 0===s||null==(n=r(s)[o])?e:i(n)}},function(t,e,n){var r,i,o,s,a,c,u,l,f=n(1),p=n(81).f,h=n(38),d=n(135).set,b=n(83),m=f.MutationObserver||f.WebKitMutationObserver,g=f.process,v=f.Promise,y="process"==h(g),w=p(f,"queueMicrotask"),k=w&&w.value;k||(r=function(){var t,e;for(y&&(t=g.domain)&&t.exit();i;){e=i.fn,i=i.next;try{e()}catch(t){throw i?s():o=void 0,t}}o=void 0,t&&t.enter()},y?s=function(){g.nextTick(r)}:m&&!/(iphone|ipod|ipad).*applewebkit/i.test(b)?(a=!0,c=document.createTextNode(""),new m(r).observe(c,{characterData:!0}),s=function(){c.data=a=!a}):v&&v.resolve?(u=v.resolve(void 0),l=u.then,s=function(){l.call(u,r)}):s=function(){d.call(f,r)}),t.exports=k||function(t){var e={fn:t,next:void 0};o&&(o.next=e),i||(i=e,s()),o=e}},function(t,e,n){var r=n(17),i=n(22),o=n(136);t.exports=function(t,e){if(r(t),i(e)&&e.constructor===t)return e;var n=o.f(t);return(0,n.resolve)(e),n.promise}},function(t,e,n){var r=n(1);t.exports=function(t,e){var n=r.console;n&&n.error&&(1===arguments.length?n.error(t):n.error(t,e))}},function(t,e){t.exports=function(t){try{return{error:!1,value:t()}}catch(t){return{error:!0,value:t}}}},function(t,e,n){var r=n(1),i=n(244),o=n(72),s=n(19),a=n(8),c=a("iterator"),u=a("toStringTag"),l=o.values;for(var f in i){var p=r[f],h=p&&p.prototype;if(h){if(h[c]!==l)try{s(h,c,l)}catch(t){h[c]=l}if(h[u]||s(h,u,f),i[f])for(var d in o)if(h[d]!==o[d])try{s(h,d,o[d])}catch(t){h[d]=o[d]}}}},function(t,e){t.exports={CSSRuleList:0,CSSStyleDeclaration:0,CSSValueList:0,ClientRectList:0,DOMRectList:0,DOMStringList:0,DOMTokenList:1,DataTransferItemList:0,FileList:0,HTMLAllCollection:0,HTMLCollection:0,HTMLFormElement:0,HTMLSelectElement:0,MediaList:0,MimeTypeArray:0,NamedNodeMap:0,NodeList:1,PaintRequestList:0,Plugin:0,PluginArray:0,SVGLengthList:0,SVGNumberList:0,SVGPathSegList:0,SVGPointList:0,SVGStringList:0,SVGTransformList:0,SourceBufferList:0,StyleSheetList:0,TextTrackCueList:0,TextTrackList:0,TouchList:0}},function(t,e,n){n(72),t.exports=function(){"use strict";function t(t,e){t||error(e)}var e,n,r=function(){function t(t,e){this.w=t,this.h=e}return t.prototype={toString:function(){return"("+this.w+", "+this.h+")"},getHalfSize:function(){return new r(this.w>>>1,this.h>>>1)},length:function(){return this.w*this.h}},t}(),i=function(){function e(t,e,n){this.bytes=new Uint8Array(t),this.start=e||0,this.pos=this.start,this.end=e+n||this.bytes.length}return e.prototype={get length(){return this.end-this.start},get position(){return this.pos},get remaining(){return this.end-this.pos},readU8Array:function(t){if(this.pos>this.end-t)return null;var e=this.bytes.subarray(this.pos,this.pos+t);return this.pos+=t,e},readU32Array:function(t,e,n){if(e=e||1,this.pos>this.end-t*e*4)return null;if(1==e){for(var r=new Uint32Array(t),i=0;i>24},readU8:function(){return this.pos>=this.end?null:this.bytes[this.pos++]},read16:function(){return this.readU16()<<16>>16},readU16:function(){if(this.pos>=this.end-1)return null;var t=this.bytes[this.pos+0]<<8|this.bytes[this.pos+1];return this.pos+=2,t},read24:function(){return this.readU24()<<8>>8},readU24:function(){var t=this.pos,e=this.bytes;if(t>this.end-3)return null;var n=e[t+0]<<16|e[t+1]<<8|e[t+2];return this.pos+=3,n},peek32:function(t){var e=this.pos,n=this.bytes;if(e>this.end-4)return null;var r=n[e+0]<<24|n[e+1]<<16|n[e+2]<<8|n[e+3];return t&&(this.pos+=4),r},read32:function(){return this.peek32(!0)},readU32:function(){return this.peek32(!0)>>>0},read4CC:function(){var t=this.pos;if(t>this.end-4)return null;for(var e="",n=0;n<4;n++)e+=String.fromCharCode(this.bytes[t+n]);return this.pos+=4,e},readFP16:function(){return this.read32()/65536},readFP8:function(){return this.read16()/256},readISO639:function(){for(var t=this.readU16(),e="",n=0;n<3;n++){var r=t>>>5*(2-n)&31;e+=String.fromCharCode(r+96)}return e},readUTF8:function(t){for(var e="",n=0;nthis.end)&&error("Index out of bounds (bounds: [0, "+this.end+"], index: "+t+")."),this.pos=t},subStream:function(t,e){return new i(this.bytes.buffer,t,e)}},e}(),o=function(){function e(t){this.stream=t,this.tracks={}}return e.prototype={readBoxes:function(t,e){for(;t.peek32();){var n=this.readBox(t);if(n.type in e){var r=e[n.type];r instanceof Array||(e[n.type]=[r]),e[n.type].push(n)}else e[n.type]=n}},readBox:function(e){var n={offset:e.position};function r(){n.version=e.readU8(),n.flags=e.readU24()}function i(){return n.size-(e.position-n.offset)}function o(){e.skip(i())}var a=function(){var t=e.subStream(e.position,i());this.readBoxes(t,n),e.skip(t.length)}.bind(this);switch(n.size=e.readU32(),n.type=e.read4CC(),n.type){case"ftyp":n.name="File Type Box",n.majorBrand=e.read4CC(),n.minorVersion=e.readU32(),n.compatibleBrands=new Array((n.size-16)/4);for(var c=0;c0&&(n.name=e.readUTF8(u));break;case"minf":n.name="Media Information Box",a();break;case"stbl":n.name="Sample Table Box",a();break;case"stsd":n.name="Sample Description Box",r(),n.sd=[];e.readU32();a();break;case"avc1":e.reserved(6,0),n.dataReferenceIndex=e.readU16(),t(0==e.readU16()),t(0==e.readU16()),e.readU32(),e.readU32(),e.readU32(),n.width=e.readU16(),n.height=e.readU16(),n.horizontalResolution=e.readFP16(),n.verticalResolution=e.readFP16(),t(0==e.readU32()),n.frameCount=e.readU16(),n.compressorName=e.readPString(32),n.depth=e.readU16(),t(65535==e.readU16()),a();break;case"mp4a":e.reserved(6,0),n.dataReferenceIndex=e.readU16(),n.version=e.readU16(),e.skip(2),e.skip(4),n.channelCount=e.readU16(),n.sampleSize=e.readU16(),n.compressionId=e.readU16(),n.packetSize=e.readU16(),n.sampleRate=e.readU32()>>>16,t(0==n.version),a();break;case"esds":n.name="Elementary Stream Descriptor",r(),o();break;case"avcC":n.name="AVC Configuration Box",n.configurationVersion=e.readU8(),n.avcProfileIndication=e.readU8(),n.profileCompatibility=e.readU8(),n.avcLevelIndication=e.readU8(),n.lengthSizeMinusOne=3&e.readU8(),t(3==n.lengthSizeMinusOne,"TODO");var l=31&e.readU8();n.sps=[];for(c=0;c=8,"Cannot parse large media data yet."),n.data=e.readU8Array(i());break;default:o()}return n},read:function(){var t=(new Date).getTime();this.file={},this.readBoxes(this.stream,this.file),console.info("Parsed stream in "+((new Date).getTime()-t)+" ms")},traceSamples:function(){var t=this.tracks[1],e=this.tracks[2];console.info("Video Samples: "+t.getSampleCount()),console.info("Audio Samples: "+e.getSampleCount());for(var n=0,r=0,i=0;i<100;i++){var o=t.sampleToOffset(n),s=e.sampleToOffset(r),a=t.sampleToSize(n,1),c=e.sampleToSize(r,1);o0){var s=n[i-1],a=o.firstChunk-s.firstChunk,c=s.samplesPerChunk*a;if(!(e>=c))return{index:r+Math.floor(e/s.samplesPerChunk),offset:e%s.samplesPerChunk};if(e-=c,i==n.length-1)return{index:r+a+Math.floor(e/o.samplesPerChunk),offset:e%o.samplesPerChunk};r+=a}}t(!1)},chunkToOffset:function(t){return this.trak.mdia.minf.stbl.stco.table[t]},sampleToOffset:function(t){var e=this.sampleToChunk(t);return this.chunkToOffset(e.index)+this.sampleToSize(t-e.offset,e.offset)},timeToSample:function(t){for(var e=this.trak.mdia.minf.stbl.stts.table,n=0,r=0;r=i))return n+Math.floor(t/e[r].delta);t-=i,n+=e[r].count}},getTotalTime:function(){for(var e=this.trak.mdia.minf.stbl.stts.table,n=0,r=0;r0;){var s=new i(e.buffer,n).readU32();o.push(e.subarray(n+4,n+s+4)),n=n+s+4}return o}},e}();e=[],n="zero-timeout-message",window.addEventListener("message",(function(t){t.source==window&&t.data==n&&(t.stopPropagation(),e.length>0&&e.shift()())}),!0),window.setZeroTimeout=function(t){e.push(t),window.postMessage(n,"*")};var a=function(){function t(t,n,r,i){this.stream=t,this.useWorkers=n,this.webgl=r,this.render=i,this.statistics={videoStartTime:0,videoPictureCounter:0,windowStartTime:0,windowPictureCounter:0,fps:0,fpsMin:1e3,fpsMax:-1e3,webGLTextureUploadTime:0},this.onStatisticsUpdated=function(){},this.avc=new Player({useWorker:n,reuseMemory:!0,webgl:r,size:{width:640,height:368}}),this.webgl=this.avc.webgl;var o=this;this.avc.onPictureDecoded=function(){e.call(o)},this.canvas=this.avc.canvas}function e(){var t=this.statistics;t.videoPictureCounter+=1,t.windowPictureCounter+=1;var e=Date.now();t.videoStartTime||(t.videoStartTime=e);var n=e-t.videoStartTime;if(t.elapsed=n/1e3,!(n<1e3))if(t.windowStartTime){if(e-t.windowStartTime>1e3){var r=e-t.windowStartTime,i=t.windowPictureCounter/r*1e3;t.windowStartTime=e,t.windowPictureCounter=0,it.fpsMax&&(t.fpsMax=i),t.fps=i}i=t.videoPictureCounter/n*1e3;t.fpsSinceStart=i,this.onStatisticsUpdated(this.statistics)}else t.windowStartTime=e}return t.prototype={readAll:function(t){console.info("MP4Player::readAll()"),this.stream.readAll(null,function(e){this.reader=new o(new i(e)),this.reader.read();var n=this.reader.tracks[1];this.size=new r(n.trak.tkhd.width,n.trak.tkhd.height),console.info("MP4Player::readAll(), length: "+this.reader.stream.length),t&&t()}.bind(this))},play:function(){var t=this.reader;if(t){var e=t.tracks[1],n=(t.tracks[2],t.tracks[1].trak.mdia.minf.stbl.stsd.avc1.avcC),r=n.sps[0],i=n.pps[0];this.avc.decode(r),this.avc.decode(i);var o=0;setTimeout(function t(){var n=this.avc;e.getSampleNALUnits(o).forEach((function(t){n.decode(t)})),++o<3e3&&setTimeout(t.bind(this),1)}.bind(this),1)}else this.readAll(this.play.bind(this))}},t}(),c=function(){function t(t){var e=t.attributes.src?t.attributes.src.value:void 0,n=(t.attributes.width&&t.attributes.width.value,t.attributes.height&&t.attributes.height.value,document.createElement("div"));n.setAttribute("style","z-index: 100; position: absolute; bottom: 0px; background-color: rgba(0,0,0,0.8); height: 30px; width: 100%; text-align: left;"),this.info=document.createElement("div"),this.info.setAttribute("style","font-size: 14px; font-weight: bold; padding: 6px; color: lime;"),n.appendChild(this.info),t.appendChild(n);var r=!!t.attributes.workers&&"true"==t.attributes.workers.value,i=!!t.attributes.render&&"true"==t.attributes.render.value,o="auto";t.attributes.webgl&&("true"==t.attributes.webgl.value&&(o=!0),"false"==t.attributes.webgl.value&&(o=!1));var s="";s+=r?"worker thread ":"main thread ",this.player=new a(new Stream(e),r,o,i),this.canvas=this.player.canvas,this.canvas.onclick=function(){this.play()}.bind(this),t.appendChild(this.canvas),s+=" - webgl: "+this.player.webgl,this.info.innerHTML="Click canvas to load and play - "+s,this.score=null,this.player.onStatisticsUpdated=function(t){if(t.videoPictureCounter%10==0){var e="";t.fps&&(e+=" fps: "+t.fps.toFixed(2)),t.fpsSinceStart&&(e+=" avg: "+t.fpsSinceStart.toFixed(2));t.videoPictureCounter<1200?this.score=1200-t.videoPictureCounter:1200==t.videoPictureCounter&&(this.score=t.fpsSinceStart.toFixed(2)),this.info.innerHTML=s+e}}.bind(this)}return t.prototype={play:function(){this.player.play()}},t}();return{Size:r,Track:s,MP4Reader:o,MP4Player:a,Bytestream:i,Broadway:c}}()},function(t,e,n){"use strict";(function(t){Object.defineProperty(e,"__esModule",{value:!0});var n="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t},r="undefined"!=typeof window&&void 0!==window.document,i="object"===("undefined"==typeof self?"undefined":n(self))&&self.constructor&&"DedicatedWorkerGlobalScope"===self.constructor.name,o=void 0!==t&&null!=t.versions&&null!=t.versions.node;e.isBrowser=r,e.isWebWorker=i,e.isNode=o}).call(this,n(112))},function(t,e,n){n(5),n(11),n(10),(()=>{const e=n(26),r=n(248),i=n(251),{checkObjectType:o}=n(56),{Task:s}=n(49),{Loader:a,Dumper:c}=n(138),{ScriptingError:u,DataError:l,ArgumentError:f}=n(6),p=new WeakMap,h=new WeakMap;function d(t){if("task"===t)return h;if("job"===t)return p;throw new u(`Unknown session type was received ${t}`)}async function b(t){const n=t instanceof s?"task":"job",o=d(n);if(!o.has(t)){const s=await e.annotations.getAnnotations(n,t.id),a="job"===n?t.startFrame:0,c="job"===n?t.stopFrame:t.size-1,u={};for(let e=a;e<=c;e++)u[e]=await t.frames.get(e);const l=new r({labels:t.labels||t.task.labels,startFrame:a,stopFrame:c,frameMeta:u}).import(s),f=new i(s.version,l,t);o.set(t,{collection:l,saver:f})}}t.exports={getAnnotations:async function(t,e,n){return await b(t),d(t instanceof s?"task":"job").get(t).collection.get(e,n)},putAnnotations:function(t,e){const n=d(t instanceof s?"task":"job");if(n.has(t))return n.get(t).collection.put(e);throw new l("Collection has not been initialized yet. Call annotations.get() or annotations.clear(true) before")},saveAnnotations:async function(t,e){const n=d(t instanceof s?"task":"job");n.has(t)&&await n.get(t).saver.save(e)},hasUnsavedChanges:function(t){const e=d(t instanceof s?"task":"job");return!!e.has(t)&&e.get(t).saver.hasUnsavedChanges()},mergeAnnotations:function(t,e){const n=d(t instanceof s?"task":"job");if(n.has(t))return n.get(t).collection.merge(e);throw new l("Collection has not been initialized yet. Call annotations.get() or annotations.clear(true) before")},splitAnnotations:function(t,e,n){const r=d(t instanceof s?"task":"job");if(r.has(t))return r.get(t).collection.split(e,n);throw new l("Collection has not been initialized yet. Call annotations.get() or annotations.clear(true) before")},groupAnnotations:function(t,e,n){const r=d(t instanceof s?"task":"job");if(r.has(t))return r.get(t).collection.group(e,n);throw new l("Collection has not been initialized yet. Call annotations.get() or annotations.clear(true) before")},clearAnnotations:async function(t,e){o("reload",e,"boolean",null);const n=d(t instanceof s?"task":"job");n.has(t)&&n.get(t).collection.clear(),e&&(n.delete(t),await b(t))},annotationsStatistics:function(t){const e=d(t instanceof s?"task":"job");if(e.has(t))return e.get(t).collection.statistics();throw new l("Collection has not been initialized yet. Call annotations.get() or annotations.clear(true) before")},selectObject:function(t,e,n,r){const i=d(t instanceof s?"task":"job");if(i.has(t))return i.get(t).collection.select(e,n,r);throw new l("Collection has not been initialized yet. Call annotations.get() or annotations.clear(true) before")},uploadAnnotations:async function(t,n,r){const i=t instanceof s?"task":"job";if(!(r instanceof a))throw new f("A loader must be instance of Loader class");await e.annotations.uploadAnnotations(i,t.id,n,r.name)},dumpAnnotations:async function(t,n,r){if(!(r instanceof c))throw new f("A dumper must be instance of Dumper class");let i=null;return i="job"===(t instanceof s?"task":"job")?await e.annotations.dumpAnnotations(t.task.id,n,r.name):await e.annotations.dumpAnnotations(t.id,n,r.name)},exportDataset:async function(t,n){if(!(n instanceof String||"string"==typeof n))throw new f("Format must be a string");if(!(t instanceof s))throw new f("A dataset can only be created from a task");let r=null;return r=await e.tasks.exportDataset(t.id,n)}}})()},function(t,e,n){n(5),n(137),n(10),n(71),(()=>{const{RectangleShape:e,PolygonShape:r,PolylineShape:i,PointsShape:o,RectangleTrack:s,PolygonTrack:a,PolylineTrack:c,PointsTrack:u,Track:l,Shape:f,Tag:p,objectStateFactory:h}=n(250),{checkObjectType:d}=n(56),b=n(117),{Label:m}=n(55),{DataError:g,ArgumentError:v,ScriptingError:y}=n(6),{ObjectShape:w,ObjectType:k}=n(29),x=n(70),O=["#0066FF","#AF593E","#01A368","#FF861F","#ED0A3F","#FF3F34","#76D7EA","#8359A3","#FBE870","#C5E17A","#03BB85","#FFDF00","#8B8680","#0A6B0D","#8FD8D8","#A36F40","#F653A6","#CA3435","#FFCBA4","#FF99CC","#FA9D5A","#FFAE42","#A78B00","#788193","#514E49","#1164B4","#F4FA9F","#FED8B1","#C32148","#01796F","#E90067","#FF91A4","#404E5A","#6CDAE7","#FFC1CC","#006A93","#867200","#E2B631","#6EEB6E","#FFC800","#CC99BA","#FF007C","#BC6CAC","#DCCCD7","#EBE1C2","#A6AAAE","#B99685","#0086A7","#5E4330","#C8A2C8","#708EB3","#BC8777","#B2592D","#497E48","#6A2963","#E6335F","#00755E","#B5A895","#0048ba","#EED9C4","#C88A65","#FF6E4A","#87421F","#B2BEB5","#926F5B","#00B9FB","#6456B7","#DB5079","#C62D42","#FA9C44","#DA8A67","#FD7C6E","#93CCEA","#FCF686","#503E32","#FF5470","#9DE093","#FF7A00","#4F69C6","#A50B5E","#F0E68C","#FDFF00","#F091A9","#FFFF66","#6F9940","#FC74FD","#652DC1","#D6AEDD","#EE34D2","#BB3385","#6B3FA0","#33CC99","#FFDB00","#87FF2A","#6EEB6E","#FFC800","#CC99BA","#7A89B8","#006A93","#867200","#E2B631","#D9D6CF"];function j(t,n,s){const{type:a}=t,c=O[n%O.length];let u=null;switch(a){case"rectangle":u=new e(t,n,c,s);break;case"polygon":u=new r(t,n,c,s);break;case"polyline":u=new i(t,n,c,s);break;case"points":u=new o(t,n,c,s);break;default:throw new g(`An unexpected type of shape "${a}"`)}return u}function S(t,e,n){if(t.shapes.length){const{type:r}=t.shapes[0],i=O[e%O.length];let o=null;switch(r){case"rectangle":o=new s(t,e,i,n);break;case"polygon":o=new a(t,e,i,n);break;case"polyline":o=new c(t,e,i,n);break;case"points":o=new u(t,e,i,n);break;default:throw new g(`An unexpected type of track "${r}"`)}return o}return console.warn("The track without any shapes had been found. It was ignored."),null}t.exports=class{constructor(t){this.startFrame=t.startFrame,this.stopFrame=t.stopFrame,this.frameMeta=t.frameMeta,this.labels=t.labels.reduce((t,e)=>(t[e.id]=e,t),{}),this.shapes={},this.tags={},this.tracks=[],this.objects={},this.count=0,this.flush=!1,this.collectionZ={},this.groups={max:0},this.injection={labels:this.labels,collectionZ:this.collectionZ,groups:this.groups,frameMeta:this.frameMeta}}import(t){for(const e of t.tags){const t=++this.count,n=new p(e,t,this.injection);this.tags[n.frame]=this.tags[n.frame]||[],this.tags[n.frame].push(n),this.objects[t]=n}for(const e of t.shapes){const t=++this.count,n=j(e,t,this.injection);this.shapes[n.frame]=this.shapes[n.frame]||[],this.shapes[n.frame].push(n),this.objects[t]=n}for(const e of t.tracks){const t=++this.count,n=S(e,t,this.injection);n&&(this.tracks.push(n),this.objects[t]=n)}return this}export(){return{tracks:this.tracks.filter(t=>!t.removed).map(t=>t.toJSON()),shapes:Object.values(this.shapes).reduce((t,e)=>(t.push(...e),t),[]).filter(t=>!t.removed).map(t=>t.toJSON()),tags:Object.values(this.tags).reduce((t,e)=>(t.push(...e),t),[]).filter(t=>!t.removed).map(t=>t.toJSON())}}get(t){const{tracks:e}=this,n=this.shapes[t]||[],r=this.tags[t]||[],i=e.concat(n).concat(r).filter(t=>!t.removed),o=[];for(const e of i){const n=e.get(t);if(n.outside&&!n.keyframe)continue;const r=h.call(e,t,n);o.push(r)}return o}merge(t){if(d("shapes for merge",t,null,Array),!t.length)return;const e=t.map(t=>{d("object state",t,null,x);const e=this.objects[t.clientID];if(void 0===e)throw new v("The object has not been saved yet. Call ObjectState.put([state]) before you can merge it");return e}),n={},{label:r,shapeType:i}=t[0];if(!(r.id in this.labels))throw new v(`Unknown label for the task: ${r.id}`);if(!Object.values(w).includes(i))throw new v(`Got unknown shapeType "${i}"`);const o=r.attributes.reduce((t,e)=>(t[e.id]=e,t),{});for(let s=0;s(e in o&&o[e].mutable&&t.push({spec_id:+e,value:a.attributes[e]}),t),[])},a.frame+1 in n||(n[a.frame+1]=JSON.parse(JSON.stringify(n[a.frame])),n[a.frame+1].outside=!0,n[a.frame+1].frame++)}else{if(!(a instanceof l))throw new v(`Trying to merge unknown object type: ${a.constructor.name}. `+"Only shapes and tracks are expected.");{const t={};for(const e of Object.keys(a.shapes)){const r=a.shapes[e];if(e in n&&!n[e].outside){if(r.outside)continue;throw new v("Expected only one visible shape per frame")}let o=!1;for(const e in r.attributes)e in t&&t[e]===r.attributes[e]||(o=!0,t[e]=r.attributes[e]);n[e]={type:i,frame:+e,points:[...r.points],occluded:r.occluded,outside:r.outside,zOrder:r.zOrder,attributes:o?Object.keys(t).reduce((e,n)=>(e.push({spec_id:+n,value:t[n]}),e),[]):[]}}}}}let s=!1;for(const t of Object.keys(n).sort((t,e)=>+t-+e)){if((s=s||n[t].outside)||!n[t].outside)break;delete n[t]}const a=++this.count,c=S({frame:Math.min.apply(null,Object.keys(n).map(t=>+t)),shapes:Object.values(n),group:0,label_id:r.id,attributes:Object.keys(t[0].attributes).reduce((e,n)=>(o[n].mutable||e.push({spec_id:+n,value:t[0].attributes[n]}),e),[])},a,this.injection);this.tracks.push(c),this.objects[a]=c;for(const t of e)t.removed=!0,"function"==typeof t.resetCache&&t.resetCache()}split(t,e){d("object state",t,null,x),d("frame",e,"integer",null);const n=this.objects[t.clientID];if(void 0===n)throw new v("The object has not been saved yet. Call annotations.put([state]) before");if(t.objectType!==k.TRACK)return;const r=Object.keys(n.shapes).sort((t,e)=>+t-+e);if(e<=+r[0]||e>r[r.length-1])return;const i=n.label.attributes.reduce((t,e)=>(t[e.id]=e,t),{}),o=n.toJSON(),s={type:t.shapeType,points:[...t.points],occluded:t.occluded,outside:t.outside,zOrder:0,attributes:Object.keys(t.attributes).reduce((e,n)=>(i[n].mutable||e.push({spec_id:+n,value:t.attributes[n]}),e),[]),frame:e},a={frame:o.frame,group:0,label_id:o.label_id,attributes:o.attributes,shapes:[]},c=JSON.parse(JSON.stringify(a));c.frame=e,c.shapes.push(JSON.parse(JSON.stringify(s))),o.shapes.map(t=>(delete t.id,t.framee&&c.shapes.push(JSON.parse(JSON.stringify(t))),t)),a.shapes.push(s),a.shapes[a.shapes.length-1].outside=!0;let u=++this.count;const l=S(a,u,this.injection);this.tracks.push(l),this.objects[u]=l,u=++this.count;const f=S(c,u,this.injection);this.tracks.push(f),this.objects[u]=f,n.removed=!0,n.resetCache()}group(t,e){d("shapes for group",t,null,Array);const n=t.map(t=>{d("object state",t,null,x);const e=this.objects[t.clientID];if(void 0===e)throw new v("The object has not been saved yet. Call annotations.put([state]) before");return e}),r=e?0:++this.groups.max;for(const t of n)t.group=r,"function"==typeof t.resetCache&&t.resetCache();return r}clear(){this.shapes={},this.tags={},this.tracks=[],this.objects={},this.count=0,this.flush=!0}statistics(){const t={},e={rectangle:{shape:0,track:0},polygon:{shape:0,track:0},polyline:{shape:0,track:0},points:{shape:0,track:0},tags:0,manually:0,interpolated:0,total:0},n=JSON.parse(JSON.stringify(e));for(const n of Object.values(this.labels)){const{name:r}=n;t[r]=JSON.parse(JSON.stringify(e))}for(const e of Object.values(this.objects)){let n=null;if(e instanceof f)n="shape";else if(e instanceof l)n="track";else{if(!(e instanceof p))throw new y(`Unexpected object type: "${n}"`);n="tag"}const r=e.label.name;if("tag"===n)t[r].tags++,t[r].manually++,t[r].total++;else{const{shapeType:i}=e;if(t[r][i][n]++,"track"===n){const n=Object.keys(e.shapes).sort((t,e)=>+t-+e).map(t=>+t);let i=n[0],o=!1;for(const s of n){if(o){const e=s-i-1;t[r].interpolated+=e,t[r].total+=e}o=!e.shapes[s].outside,i=s,o&&(t[r].manually++,t[r].total++)}const s=n[n.length-1];if(s!==this.stopFrame&&!e.shapes[s].outside){const e=this.stopFrame-s;t[r].interpolated+=e,t[r].total+=e}}else t[r].manually++,t[r].total++}}for(const e of Object.keys(t))for(const r of Object.keys(t[e]))if("object"==typeof t[e][r])for(const i of Object.keys(t[e][r]))n[r][i]+=t[e][r][i];else n[r]+=t[e][r];return new b(t,n)}put(t){d("shapes for put",t,null,Array);const e={shapes:[],tracks:[],tags:[]};function n(t,e){const n=+e,r=this.attributes[e];return d("attribute id",n,"integer",null),d("attribute value",r,"string",null),t.push({spec_id:n,value:r}),t}for(const r of t){d("object state",r,null,x),d("state client ID",r.clientID,"undefined",null),d("state frame",r.frame,"integer",null),d("state attributes",r.attributes,null,Object),d("state label",r.label,null,m);const t=Object.keys(r.attributes).reduce(n.bind(r),[]),i=r.label.attributes.reduce((t,e)=>(t[e.id]=e,t),{});if("tag"===r.objectType)e.tags.push({attributes:t,frame:r.frame,label_id:r.label.id,group:0});else{d("state occluded",r.occluded,"boolean",null),d("state points",r.points,null,Array);for(const t of r.points)d("point coordinate",t,"number",null);if(!Object.values(w).includes(r.shapeType))throw new v("Object shape must be one of: "+`${JSON.stringify(Object.values(w))}`);if("shape"===r.objectType)e.shapes.push({attributes:t,frame:r.frame,group:0,label_id:r.label.id,occluded:r.occluded||!1,points:[...r.points],type:r.shapeType,z_order:0});else{if("track"!==r.objectType)throw new v("Object type must be one of: "+`${JSON.stringify(Object.values(k))}`);e.tracks.push({attributes:t.filter(t=>!i[t.spec_id].mutable),frame:r.frame,group:0,label_id:r.label.id,shapes:[{attributes:t.filter(t=>i[t.spec_id].mutable),frame:r.frame,occluded:r.occluded||!1,outside:!1,points:[...r.points],type:r.shapeType,z_order:0}]})}}}this.import(e)}select(t,e,n){d("shapes for select",t,null,Array),d("x coordinate",e,"number",null),d("y coordinate",n,"number",null);let r=null,i=null;for(const o of t){if(d("object state",o,null,x),o.outside)continue;const t=this.objects[o.clientID];if(void 0===t)throw new v("The object has not been saved yet. Call annotations.put([state]) before");const s=t.constructor.distance(o.points,e,n);null!==s&&(null===r||s{const e=n(70),{checkObjectType:r,isEnum:o}=n(56),{ObjectShape:s,ObjectType:a,AttributeType:c,VisibleState:u}=n(29),{DataError:l,ArgumentError:f,ScriptingError:p}=n(6),{Label:h}=n(55);function d(t,n){const r=new e(n);return r.hidden={save:this.save.bind(this,t,r),delete:this.delete.bind(this),up:this.up.bind(this,t,r),down:this.down.bind(this,t,r)},r}function b(t,e){if(t===s.RECTANGLE){if(e.length/2!=2)throw new l(`Rectangle must have 2 points, but got ${e.length/2}`)}else if(t===s.POLYGON){if(e.length/2<3)throw new l(`Polygon must have at least 3 points, but got ${e.length/2}`)}else if(t===s.POLYLINE){if(e.length/2<2)throw new l(`Polyline must have at least 2 points, but got ${e.length/2}`)}else{if(t!==s.POINTS)throw new f(`Unknown value of shapeType has been recieved ${t}`);if(e.length/2<1)throw new l(`Points must have at least 1 points, but got ${e.length/2}`)}}function m(t,e){if(t===s.POINTS)return!0;let n=Number.MAX_SAFE_INTEGER,r=Number.MIN_SAFE_INTEGER,i=Number.MAX_SAFE_INTEGER,o=Number.MIN_SAFE_INTEGER;for(let t=0;t=3}return(r-n)*(o-i)>=9}function g(t,e){const{values:n}=e,r=e.inputType;if("string"!=typeof t)throw new f(`Attribute value is expected to be string, but got ${typeof t}`);return r===c.NUMBER?+t>=+n[0]&&+t<=+n[1]&&!((+t-+n[0])%+n[2]):r===c.CHECKBOX?["true","false"].includes(t.toLowerCase()):n.includes(t)}class v{constructor(t,e,n){this.taskLabels=n.labels,this.clientID=e,this.serverID=t.id,this.group=t.group,this.label=this.taskLabels[t.label_id],this.frame=t.frame,this.removed=!1,this.lock=!1,this.attributes=t.attributes.reduce((t,e)=>(t[e.spec_id]=e.value,t),{}),this.appendDefaultAttributes(this.label),n.groups.max=Math.max(n.groups.max,this.group)}appendDefaultAttributes(t){const e=t.attributes;for(const t of e)t.id in this.attributes||(this.attributes[t.id]=t.defaultValue)}delete(t){return this.lock&&!t||(this.removed=!0),!0}}class y extends v{constructor(t,e,n,r){super(t,e,r),this.frameMeta=r.frameMeta,this.collectionZ=r.collectionZ,this.visibility=u.SHAPE,this.color=n,this.shapeType=null}_getZ(t){return this.collectionZ[t]=this.collectionZ[t]||{max:0,min:0},this.collectionZ[t]}save(){throw new p("Is not implemented")}get(){throw new p("Is not implemented")}toJSON(){throw new p("Is not implemented")}up(t,e){const n=this._getZ(t);n.max++,e.zOrder=n.max}down(t,e){const n=this._getZ(t);n.min--,e.zOrder=n.min}}class w extends y{constructor(t,e,n,r){super(t,e,n,r),this.points=t.points,this.occluded=t.occluded,this.zOrder=t.z_order;const i=this._getZ(this.frame);i.max=Math.max(i.max,this.zOrder||0),i.min=Math.min(i.min,this.zOrder||0)}toJSON(){return{type:this.shapeType,clientID:this.clientID,occluded:this.occluded,z_order:this.zOrder,points:[...this.points],attributes:Object.keys(this.attributes).reduce((t,e)=>(t.push({spec_id:e,value:this.attributes[e]}),t),[]),id:this.serverID,frame:this.frame,label_id:this.label.id,group:this.group}}get(t){if(t!==this.frame)throw new p("Got frame is not equal to the frame of the shape");return{objectType:a.SHAPE,shapeType:this.shapeType,clientID:this.clientID,serverID:this.serverID,occluded:this.occluded,lock:this.lock,zOrder:this.zOrder,points:[...this.points],attributes:i({},this.attributes),label:this.label,group:this.group,color:this.color,visibility:this.visibility}}save(t,e){if(t!==this.frame)throw new p("Got frame is not equal to the frame of the shape");if(this.lock&&e.lock)return d.call(this,t,this.get(t));const n=this.get(t),i=e.updateFlags;if(i.label&&(r("label",e.label,null,h),n.label=e.label,n.attributes={},this.appendDefaultAttributes.call(n,n.label)),i.attributes){const t=n.label.attributes.reduce((t,e)=>(t[e.id]=e,t),{});for(const r of Object.keys(e.attributes)){const i=e.attributes[r];if(!(r in t&&g(i,t[r])))throw new f(`Trying to save unknown attribute with id ${r} and value ${i}`);n.attributes[r]=i}}if(i.points){r("points",e.points,null,Array),b(this.shapeType,e.points);const{width:i,height:o}=this.frameMeta[t],s=[];for(let t=0;t{t[e.frame]={serverID:e.id,occluded:e.occluded,zOrder:e.z_order,points:e.points,outside:e.outside,attributes:e.attributes.reduce((t,e)=>(t[e.spec_id]=e.value,t),{})};const n=this._getZ(e.frame);return n.max=Math.max(n.max,e.z_order),n.min=Math.min(n.min,e.z_order),t},{}),this.cache={}}toJSON(){const t=this.label.attributes.reduce((t,e)=>(t[e.id]=e,t),{});return{clientID:this.clientID,id:this.serverID,frame:this.frame,label_id:this.label.id,group:this.group,attributes:Object.keys(this.attributes).reduce((e,n)=>(t[n].mutable||e.push({spec_id:n,value:this.attributes[n]}),e),[]),shapes:Object.keys(this.shapes).reduce((e,n)=>(e.push({type:this.shapeType,occluded:this.shapes[n].occluded,z_order:this.shapes[n].zOrder,points:[...this.shapes[n].points],outside:this.shapes[n].outside,attributes:Object.keys(this.shapes[n].attributes).reduce((e,r)=>(t[r].mutable&&e.push({spec_id:r,value:this.shapes[n].attributes[r]}),e),[]),id:this.shapes[n].serverID,frame:+n}),e),[])}}get(t){if(!(t in this.cache)){const e=Object.assign({},this.getPosition(t),{attributes:this.getAttributes(t),group:this.group,objectType:a.TRACK,shapeType:this.shapeType,clientID:this.clientID,serverID:this.serverID,lock:this.lock,color:this.color,visibility:this.visibility});this.cache[t]=e}const e=JSON.parse(JSON.stringify(this.cache[t]));return e.label=this.label,e}neighborsFrames(t){const e=Object.keys(this.shapes).map(t=>+t);let n=Number.MAX_SAFE_INTEGER,r=Number.MAX_SAFE_INTEGER;for(const i of e){const e=Math.abs(t-i);i<=t&&e+t-+e);for(const r of n)if(r<=t){const{attributes:t}=this.shapes[r];for(const n in t)Object.prototype.hasOwnProperty.call(t,n)&&(e[n]=t[n])}return e}save(t,e){if(this.lock&&e.lock)return d.call(this,t,this.get(t));const n=Object.assign(this.get(t));n.attributes=Object.assign(n.attributes),n.points=[...n.points];const i=e.updateFlags;let s=!1;i.label&&(r("label",e.label,null,h),n.label=e.label,n.attributes={},this.appendDefaultAttributes.call(n,n.label));const a=n.label.attributes.reduce((t,e)=>(t[e.id]=e,t),{});if(i.attributes)for(const t of Object.keys(e.attributes)){const r=e.attributes[t];if(!(t in a&&g(r,a[t])))throw new f(`Trying to save unknown attribute with id ${t} and value ${r}`);n.attributes[t]=r}if(i.points){r("points",e.points,null,Array),b(this.shapeType,e.points);const{width:i,height:o}=this.frameMeta[t],a=[];for(let t=0;tt&&delete this.cache[e];return this.cache[t].keyframe=!1,delete this.shapes[t],i.reset(),d.call(this,t,this.get(t))}if(s||i.keyframe&&e.keyframe){for(const e in this.cache)+e>t&&delete this.cache[e];if(this.cache[t].keyframe=!0,e.keyframe=!0,this.shapes[t]={frame:t,zOrder:n.zOrder,points:n.points,outside:n.outside,occluded:n.occluded,attributes:{}},i.attributes)for(const r of Object.keys(n.attributes))a[r].mutable&&(this.shapes[t].attributes[r]=e.attributes[r],this.shapes[t].attributes[r]=e.attributes[r])}return i.reset(),d.call(this,t,this.get(t))}getPosition(t){const{leftFrame:e,rightFrame:n}=this.neighborsFrames(t),r=Number.isInteger(n)?this.shapes[n]:null,i=Number.isInteger(e)?this.shapes[e]:null;if(i&&e===t)return{points:[...i.points],occluded:i.occluded,outside:i.outside,zOrder:i.zOrder,keyframe:!0};if(r&&i)return Object.assign({},this.interpolatePosition(i,r,(t-e)/(n-e)),{keyframe:!1});if(r)return{points:[...r.points],occluded:r.occluded,outside:!0,zOrder:0,keyframe:!1};if(i)return{points:[...i.points],occluded:i.occluded,outside:i.outside,zOrder:0,keyframe:!1};throw new p(`No one neightbour frame found for the track with client ID: "${this.id}"`)}delete(t){return this.lock&&!t||(this.removed=!0,this.resetCache()),!0}resetCache(){this.cache={}}}class x extends w{constructor(t,e,n,r){super(t,e,n,r),this.shapeType=s.RECTANGLE,b(this.shapeType,this.points)}static distance(t,e,n){const[r,i,o,s]=t;return e>=r&&e<=o&&n>=i&&n<=s?Math.min.apply(null,[e-r,n-i,o-e,s-n]):null}}class O extends w{constructor(t,e,n,r){super(t,e,n,r)}}class j extends O{constructor(t,e,n,r){super(t,e,n,r),this.shapeType=s.POLYGON,b(this.shapeType,this.points)}static distance(t,e,n){function r(t,r,i,o){return(i-t)*(n-r)-(e-t)*(o-r)}let i=0;const o=[];for(let s=0,a=t.length-2;sn&&r(c,u,l,f)>0&&i++:f<=n&&r(c,u,l,f)<0&&i--;const p=e-(u-f),h=n-(l-c);(p-c)*(l-p)>=0&&(h-u)*(f-h)>=0?o.push(Math.sqrt(Math.pow(e-p,2)+Math.pow(n-h,2))):o.push(Math.min(Math.sqrt(Math.pow(c-e,2)+Math.pow(u-n,2)),Math.sqrt(Math.pow(l-e,2)+Math.pow(f-n,2))))}return 0!==i?Math.min.apply(null,o):null}}class S extends O{constructor(t,e,n,r){super(t,e,n,r),this.shapeType=s.POLYLINE,b(this.shapeType,this.points)}static distance(t,e,n){const r=[];for(let i=0;i=0&&(n-s)*(c-n)>=0?r.push(Math.abs((c-s)*e-(a-o)*n+a*s-c*o)/Math.sqrt(Math.pow(c-s,2)+Math.pow(a-o,2))):r.push(Math.min(Math.sqrt(Math.pow(o-e,2)+Math.pow(s-n,2)),Math.sqrt(Math.pow(a-e,2)+Math.pow(c-n,2))))}return Math.min.apply(null,r)}}class _ extends O{constructor(t,e,n,r){super(t,e,n,r),this.shapeType=s.POINTS,b(this.shapeType,this.points)}static distance(t,e,n){const r=[];for(let i=0;ir&&(r=t[o]),t[o+1]>i&&(i=t[o+1]);return{xmin:e,ymin:n,xmax:r,ymax:i}}function i(t,e){const n=[],r=e.xmax-e.xmin,i=e.ymax-e.ymin;for(let o=0;on[i][t]-n[i][e]);const i={},o={};let s=0;for(;Object.values(o).length!==t.length;){for(const e of t){if(o[e])continue;const t=r[e][s],a=n[e][t];if(t in i&&i[t].distance>a){const e=i[t].value;delete i[t],delete o[e]}t in i||(i[t]={value:e,distance:a},o[e]=!0)}s++}const a={};for(const t of Object.keys(i))a[i[t].value]={value:t,distance:i[t].distance};return a}(Array.from(t.keys()),Array.from(e.keys()),s),c=(n(e)+n(t))/(e.length+t.length);!function(t,e){for(const n of Object.keys(t))t[n].distance>e&&delete t[n]}(a,c+3*Math.sqrt((r(t,c)+r(e,c))/(t.length+e.length)));for(const t of Object.keys(a))a[t]=a[t].value;const u=this.appendMapping(a,t,e);for(const n of u)i.push(t[n]),o.push(e[a[n]]);return[i,o]}let u=r(t.points),l=r(e.points);(u.xmax-u.xmin<1||l.ymax-l.ymin<1)&&(l=u={xmin:0,xmax:1024,ymin:0,ymax:768});const f=s(i(t.points,u)),p=s(i(e.points,l));let h=[],d=[];if(f.length>p.length){const[t,e]=c.call(this,p,f);h=e,d=t}else{const[t,e]=c.call(this,f,p);h=t,d=e}const b=o(a(h),u),m=o(a(d),l),g=[];for(let t=0;t+t),i=Object.keys(t).map(t=>+t),o=[];function s(t){let e=t,i=t;if(!r.length)throw new p("Interpolation mapping is empty");for(;!r.includes(e);)--e<0&&(e=n.length-1);for(;!r.includes(i);)++i>=n.length&&(i=0);return[e,i]}function a(t,e,r){const i=[];for(;e!==r;)i.push(n[e]),++e>=n.length&&(e=0);i.push(n[r]);let o=0,s=0,a=!1;for(let e=1;e(t.push({spec_id:e,value:this.attributes[e]}),t),[])}}get(t){if(t!==this.frame)throw new p("Got frame is not equal to the frame of the shape");return{objectType:a.TAG,clientID:this.clientID,serverID:this.serverID,lock:this.lock,attributes:Object.assign({},this.attributes),label:this.label,group:this.group}}save(t,e){if(t!==this.frame)throw new p("Got frame is not equal to the frame of the shape");if(this.lock&&e.lock)return d.call(this,t,this.get(t));const n=this.get(t),i=e.updateFlags;if(i.label&&(r("label",e.label,null,h),n.label=e.label,n.attributes={},this.appendDefaultAttributes.call(n,n.label)),i.attributes){const t=n.label.attributes.map(t=>`${t.id}`);for(const r of Object.keys(e.attributes))t.includes(r)&&(n.attributes[r]=e.attributes[r])}i.group&&(r("group",e.group,"integer",null),n.group=e.group),i.lock&&(r("lock",e.lock,"boolean",null),n.lock=e.lock),i.reset();for(const t of Object.keys(n))t in this&&(this[t]=n[t]);return d.call(this,t,this.get(t))}},objectStateFactory:d}})()},function(t,e,n){function r(t,e){var n=Object.keys(t);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(t);e&&(r=r.filter((function(e){return Object.getOwnPropertyDescriptor(t,e).enumerable}))),n.push.apply(n,r)}return n}function i(t){for(var e=1;e{const e=n(26),{Task:r}=n(49),{ScriptingError:o}="./exceptions";t.exports=class{constructor(t,e,n){this.sessionType=n instanceof r?"task":"job",this.id=n.id,this.version=t,this.collection=e,this.initialObjects={},this.hash=this._getHash();const i=this.collection.export();this._resetState();for(const t of i.shapes)this.initialObjects.shapes[t.id]=t;for(const t of i.tracks)this.initialObjects.tracks[t.id]=t;for(const t of i.tags)this.initialObjects.tags[t.id]=t}_resetState(){this.initialObjects={shapes:{},tracks:{},tags:{}}}_getHash(){const t=this.collection.export();return JSON.stringify(t)}async _request(t,n){return await e.annotations.updateAnnotations(this.sessionType,this.id,t,n)}async _put(t){return await this._request(t,"put")}async _create(t){return await this._request(t,"create")}async _update(t){return await this._request(t,"update")}async _delete(t){return await this._request(t,"delete")}_split(t){const e={created:{shapes:[],tracks:[],tags:[]},updated:{shapes:[],tracks:[],tags:[]},deleted:{shapes:[],tracks:[],tags:[]}};for(const n of Object.keys(t))for(const r of t[n])if(r.id in this.initialObjects[n]){JSON.stringify(r)!==JSON.stringify(this.initialObjects[n][r.id])&&e.updated[n].push(r)}else{if(void 0!==r.id)throw new o(`Id of object is defined "${r.id}"`+"but it absents in initial state");e.created[n].push(r)}const n={shapes:t.shapes.map(t=>+t.id),tracks:t.tracks.map(t=>+t.id),tags:t.tags.map(t=>+t.id)};for(const t of Object.keys(this.initialObjects))for(const r of Object.keys(this.initialObjects[t]))if(!n[t].includes(+r)){const n=this.initialObjects[t][r];e.deleted[t].push(n)}return e}_updateCreatedObjects(t,e){const n=t.tracks.length+t.shapes.length+t.tags.length,r=e.tracks.length+e.shapes.length+e.tags.length;if(r!==n)throw new o("Number of indexes is differed by number of saved objects"+`${r} vs ${n}`);for(const n of Object.keys(e))for(let r=0;rt.clientID),shapes:t.shapes.map(t=>t.clientID),tags:t.tags.map(t=>t.clientID)};return t.tracks.concat(t.shapes).concat(t.tags).map(t=>(delete t.clientID,t)),e}async save(t){"function"!=typeof t&&(t=t=>{console.log(t)});try{const e=this.collection.export(),{flush:n}=this.collection;if(n){t("New objects are being saved..");const n=this._receiveIndexes(e),r=await this._put(i({},e,{version:this.version}));this.version=r.version,this.collection.flush=!1,t("Saved objects are being updated in the client"),this._updateCreatedObjects(r,n),t("Initial state is being updated"),this._resetState();for(const t of Object.keys(this.initialObjects))for(const e of r[t])this.initialObjects[t][e.id]=e}else{const{created:n,updated:r,deleted:o}=this._split(e);t("New objects are being saved..");const s=this._receiveIndexes(n),a=await this._create(i({},n,{version:this.version}));this.version=a.version,t("Saved objects are being updated in the client"),this._updateCreatedObjects(a,s),t("Initial state is being updated");for(const t of Object.keys(this.initialObjects))for(const e of a[t])this.initialObjects[t][e.id]=e;t("Changed objects are being saved.."),this._receiveIndexes(r);const c=await this._update(i({},r,{version:this.version}));this.version=c.version,t("Initial state is being updated");for(const t of Object.keys(this.initialObjects))for(const e of c[t])this.initialObjects[t][e.id]=e;t("Changed objects are being saved.."),this._receiveIndexes(o);const u=await this._delete(i({},o,{version:this.version}));this._version=u.version,t("Initial state is being updated");for(const t of Object.keys(this.initialObjects))for(const e of u[t])delete this.initialObjects[t][e.id]}this.hash=this._getHash(),t("Saving is done")}catch(e){throw t(`Can not save annotations: ${e.message}`),e}}hasUnsavedChanges(){return this._getHash()!==this.hash}}})()},function(t){t.exports=JSON.parse('{"name":"cvat-core.js","version":"0.1.0","description":"Part of Computer Vision Tool which presents an interface for client-side integration","main":"babel.config.js","scripts":{"build":"webpack","test":"jest --config=jest.config.js --coverage","docs":"jsdoc --readme README.md src/*.js -p -c jsdoc.config.js -d docs","coveralls":"cat ./reports/coverage/lcov.info | coveralls"},"author":"Intel","license":"MIT","devDependencies":{"@babel/cli":"^7.4.4","@babel/core":"^7.4.4","@babel/preset-env":"^7.4.4","airbnb":"0.0.2","babel-eslint":"^10.0.1","babel-loader":"^8.0.6","core-js":"^3.0.1","coveralls":"^3.0.5","eslint":"6.1.0","eslint-config-airbnb-base":"14.0.0","eslint-plugin-import":"2.18.2","eslint-plugin-no-unsafe-innerhtml":"^1.0.16","eslint-plugin-no-unsanitized":"^3.0.2","eslint-plugin-security":"^1.4.0","jest":"^24.8.0","jest-junit":"^6.4.0","jsdoc":"^3.6.2","webpack":"^4.31.0","webpack-cli":"^3.3.2"},"dependencies":{"axios":"^0.18.0","browser-or-node":"^1.2.1","error-stack-parser":"^2.0.2","form-data":"^2.5.0","jest-config":"^24.8.0","js-cookie":"^2.2.0","platform":"^1.3.5","store":"^2.0.12"}}')},function(t,e,n){n(5),n(11),n(10),n(254),(()=>{const e=n(36),r=n(26),{isBoolean:i,isInteger:o,isEnum:s,isString:a,checkFilter:c}=n(56),{TaskStatus:u,TaskMode:l}=n(29),f=n(69),{AnnotationFormat:p}=n(138),{ArgumentError:h}=n(6),{Task:d}=n(49);function b(t,e){null!==t.assignee&&([t.assignee]=e.filter(e=>e.id===t.assignee));for(const n of t.segments)for(const t of n.jobs)null!==t.assignee&&([t.assignee]=e.filter(e=>e.id===t.assignee));return null!==t.owner&&([t.owner]=e.filter(e=>e.id===t.owner)),t}t.exports=function(t){return t.plugins.list.implementation=e.list,t.plugins.register.implementation=e.register.bind(t),t.server.about.implementation=async()=>{return await r.server.about()},t.server.share.implementation=async t=>{return await r.server.share(t)},t.server.formats.implementation=async()=>{return(await r.server.formats()).map(t=>new p(t))},t.server.datasetFormats.implementation=async()=>{return await r.server.datasetFormats()},t.server.register.implementation=async(t,e,n,i,o,s)=>{await r.server.register(t,e,n,i,o,s)},t.server.login.implementation=async(t,e)=>{await r.server.login(t,e)},t.server.logout.implementation=async()=>{await r.server.logout()},t.server.authorized.implementation=async()=>{return await r.server.authorized()},t.server.request.implementation=async(t,e)=>{return await r.server.request(t,e)},t.users.get.implementation=async t=>{c(t,{self:i});let e=null;return e=(e="self"in t&&t.self?[e=await r.users.getSelf()]:await r.users.getUsers()).map(t=>new f(t))},t.jobs.get.implementation=async t=>{if(c(t,{taskID:o,jobID:o}),"taskID"in t&&"jobID"in t)throw new h('Only one of fields "taskID" and "jobID" allowed simultaneously');if(!Object.keys(t).length)throw new h("Job filter must not be empty");let e=null;if("taskID"in t)e=await r.tasks.getTasks(`id=${t.taskID}`);else{const n=await r.jobs.getJob(t.jobID);void 0!==n.task_id&&(e=await r.tasks.getTasks(`id=${n.task_id}`))}if(null!==e&&e.length){const n=(await r.users.getUsers()).map(t=>new f(t)),i=new d(b(e[0],n));return t.jobID?i.jobs.filter(e=>e.id===t.jobID):i.jobs}return[]},t.tasks.get.implementation=async t=>{if(c(t,{page:o,name:a,id:o,owner:a,assignee:a,search:a,status:s.bind(u),mode:s.bind(l)}),"search"in t&&Object.keys(t).length>1&&!("page"in t&&2===Object.keys(t).length))throw new h('Do not use the filter field "search" with others');if("id"in t&&Object.keys(t).length>1&&!("page"in t&&2===Object.keys(t).length))throw new h('Do not use the filter field "id" with others');const e=new URLSearchParams;for(const n of["name","owner","assignee","search","status","mode","id","page"])Object.prototype.hasOwnProperty.call(t,n)&&e.set(n,t[n]);const n=(await r.users.getUsers()).map(t=>new f(t)),i=await r.tasks.getTasks(e.toString()),p=i.map(t=>b(t,n)).map(t=>new d(t));return p.count=i.count,p},t}})()},function(t,e,n){"use strict";n(255);var r,i=n(12),o=n(13),s=n(139),a=n(0),c=n(104),u=n(18),l=n(64),f=n(9),p=n(256),h=n(257),d=n(67).codeAt,b=n(259),m=n(33),g=n(260),v=n(25),y=a.URL,w=g.URLSearchParams,k=g.getState,x=v.set,O=v.getterFor("URL"),j=Math.floor,S=Math.pow,_=/[A-Za-z]/,A=/[\d+\-.A-Za-z]/,T=/\d/,P=/^(0x|0X)/,E=/^[0-7]+$/,C=/^\d+$/,I=/^[\dA-Fa-f]+$/,F=/[\u0000\u0009\u000A\u000D #%/:?@[\\]]/,M=/[\u0000\u0009\u000A\u000D #/:?@[\\]]/,N=/^[\u0000-\u001F ]+|[\u0000-\u001F ]+$/g,R=/[\u0009\u000A\u000D]/g,D=function(t,e){var n,r,i;if("["==e.charAt(0)){if("]"!=e.charAt(e.length-1))return"Invalid host";if(!(n=B(e.slice(1,-1))))return"Invalid host";t.host=n}else if(V(t)){if(e=b(e),F.test(e))return"Invalid host";if(null===(n=$(e)))return"Invalid host";t.host=n}else{if(M.test(e))return"Invalid host";for(n="",r=h(e),i=0;i4)return t;for(n=[],r=0;r1&&"0"==i.charAt(0)&&(o=P.test(i)?16:8,i=i.slice(8==o?1:2)),""===i)s=0;else{if(!(10==o?C:8==o?E:I).test(i))return t;s=parseInt(i,o)}n.push(s)}for(r=0;r=S(256,5-e))return null}else if(s>255)return null;for(a=n.pop(),r=0;r6)return;for(r=0;p();){if(i=null,r>0){if(!("."==p()&&r<4))return;f++}if(!T.test(p()))return;for(;T.test(p());){if(o=parseInt(p(),10),null===i)i=o;else{if(0==i)return;i=10*i+o}if(i>255)return;f++}c[u]=256*c[u]+i,2!=++r&&4!=r||u++}if(4!=r)return;break}if(":"==p()){if(f++,!p())return}else if(p())return;c[u++]=e}else{if(null!==l)return;f++,l=++u}}if(null!==l)for(s=u-l,u=7;0!=u&&s>0;)a=c[u],c[u--]=c[l+s-1],c[l+--s]=a;else if(8!=u)return;return c},U=function(t){var e,n,r,i;if("number"==typeof t){for(e=[],n=0;n<4;n++)e.unshift(t%256),t=j(t/256);return e.join(".")}if("object"==typeof t){for(e="",r=function(t){for(var e=null,n=1,r=null,i=0,o=0;o<8;o++)0!==t[o]?(i>n&&(e=r,n=i),r=null,i=0):(null===r&&(r=o),++i);return i>n&&(e=r,n=i),e}(t),n=0;n<8;n++)i&&0===t[n]||(i&&(i=!1),r===n?(e+=n?":":"::",i=!0):(e+=t[n].toString(16),n<7&&(e+=":")));return"["+e+"]"}return t},L={},z=p({},L,{" ":1,'"':1,"<":1,">":1,"`":1}),q=p({},z,{"#":1,"?":1,"{":1,"}":1}),W=p({},q,{"/":1,":":1,";":1,"=":1,"@":1,"[":1,"\\":1,"]":1,"^":1,"|":1}),G=function(t,e){var n=d(t,0);return n>32&&n<127&&!f(e,t)?t:encodeURIComponent(t)},J={ftp:21,file:null,http:80,https:443,ws:80,wss:443},V=function(t){return f(J,t.scheme)},H=function(t){return""!=t.username||""!=t.password},X=function(t){return!t.host||t.cannotBeABaseURL||"file"==t.scheme},K=function(t,e){var n;return 2==t.length&&_.test(t.charAt(0))&&(":"==(n=t.charAt(1))||!e&&"|"==n)},Z=function(t){var e;return t.length>1&&K(t.slice(0,2))&&(2==t.length||"/"===(e=t.charAt(2))||"\\"===e||"?"===e||"#"===e)},Y=function(t){var e=t.path,n=e.length;!n||"file"==t.scheme&&1==n&&K(e[0],!0)||e.pop()},Q=function(t){return"."===t||"%2e"===t.toLowerCase()},tt={},et={},nt={},rt={},it={},ot={},st={},at={},ct={},ut={},lt={},ft={},pt={},ht={},dt={},bt={},mt={},gt={},vt={},yt={},wt={},kt=function(t,e,n,i){var o,s,a,c,u,l=n||tt,p=0,d="",b=!1,m=!1,g=!1;for(n||(t.scheme="",t.username="",t.password="",t.host=null,t.port=null,t.path=[],t.query=null,t.fragment=null,t.cannotBeABaseURL=!1,e=e.replace(N,"")),e=e.replace(R,""),o=h(e);p<=o.length;){switch(s=o[p],l){case tt:if(!s||!_.test(s)){if(n)return"Invalid scheme";l=nt;continue}d+=s.toLowerCase(),l=et;break;case et:if(s&&(A.test(s)||"+"==s||"-"==s||"."==s))d+=s.toLowerCase();else{if(":"!=s){if(n)return"Invalid scheme";d="",l=nt,p=0;continue}if(n&&(V(t)!=f(J,d)||"file"==d&&(H(t)||null!==t.port)||"file"==t.scheme&&!t.host))return;if(t.scheme=d,n)return void(V(t)&&J[t.scheme]==t.port&&(t.port=null));d="","file"==t.scheme?l=ht:V(t)&&i&&i.scheme==t.scheme?l=rt:V(t)?l=at:"/"==o[p+1]?(l=it,p++):(t.cannotBeABaseURL=!0,t.path.push(""),l=vt)}break;case nt:if(!i||i.cannotBeABaseURL&&"#"!=s)return"Invalid scheme";if(i.cannotBeABaseURL&&"#"==s){t.scheme=i.scheme,t.path=i.path.slice(),t.query=i.query,t.fragment="",t.cannotBeABaseURL=!0,l=wt;break}l="file"==i.scheme?ht:ot;continue;case rt:if("/"!=s||"/"!=o[p+1]){l=ot;continue}l=ct,p++;break;case it:if("/"==s){l=ut;break}l=gt;continue;case ot:if(t.scheme=i.scheme,s==r)t.username=i.username,t.password=i.password,t.host=i.host,t.port=i.port,t.path=i.path.slice(),t.query=i.query;else if("/"==s||"\\"==s&&V(t))l=st;else if("?"==s)t.username=i.username,t.password=i.password,t.host=i.host,t.port=i.port,t.path=i.path.slice(),t.query="",l=yt;else{if("#"!=s){t.username=i.username,t.password=i.password,t.host=i.host,t.port=i.port,t.path=i.path.slice(),t.path.pop(),l=gt;continue}t.username=i.username,t.password=i.password,t.host=i.host,t.port=i.port,t.path=i.path.slice(),t.query=i.query,t.fragment="",l=wt}break;case st:if(!V(t)||"/"!=s&&"\\"!=s){if("/"!=s){t.username=i.username,t.password=i.password,t.host=i.host,t.port=i.port,l=gt;continue}l=ut}else l=ct;break;case at:if(l=ct,"/"!=s||"/"!=d.charAt(p+1))continue;p++;break;case ct:if("/"!=s&&"\\"!=s){l=ut;continue}break;case ut:if("@"==s){b&&(d="%40"+d),b=!0,a=h(d);for(var v=0;v65535)return"Invalid port";t.port=V(t)&&k===J[t.scheme]?null:k,d=""}if(n)return;l=mt;continue}return"Invalid port"}d+=s;break;case ht:if(t.scheme="file","/"==s||"\\"==s)l=dt;else{if(!i||"file"!=i.scheme){l=gt;continue}if(s==r)t.host=i.host,t.path=i.path.slice(),t.query=i.query;else if("?"==s)t.host=i.host,t.path=i.path.slice(),t.query="",l=yt;else{if("#"!=s){Z(o.slice(p).join(""))||(t.host=i.host,t.path=i.path.slice(),Y(t)),l=gt;continue}t.host=i.host,t.path=i.path.slice(),t.query=i.query,t.fragment="",l=wt}}break;case dt:if("/"==s||"\\"==s){l=bt;break}i&&"file"==i.scheme&&!Z(o.slice(p).join(""))&&(K(i.path[0],!0)?t.path.push(i.path[0]):t.host=i.host),l=gt;continue;case bt:if(s==r||"/"==s||"\\"==s||"?"==s||"#"==s){if(!n&&K(d))l=gt;else if(""==d){if(t.host="",n)return;l=mt}else{if(c=D(t,d))return c;if("localhost"==t.host&&(t.host=""),n)return;d="",l=mt}continue}d+=s;break;case mt:if(V(t)){if(l=gt,"/"!=s&&"\\"!=s)continue}else if(n||"?"!=s)if(n||"#"!=s){if(s!=r&&(l=gt,"/"!=s))continue}else t.fragment="",l=wt;else t.query="",l=yt;break;case gt:if(s==r||"/"==s||"\\"==s&&V(t)||!n&&("?"==s||"#"==s)){if(".."===(u=(u=d).toLowerCase())||"%2e."===u||".%2e"===u||"%2e%2e"===u?(Y(t),"/"==s||"\\"==s&&V(t)||t.path.push("")):Q(d)?"/"==s||"\\"==s&&V(t)||t.path.push(""):("file"==t.scheme&&!t.path.length&&K(d)&&(t.host&&(t.host=""),d=d.charAt(0)+":"),t.path.push(d)),d="","file"==t.scheme&&(s==r||"?"==s||"#"==s))for(;t.path.length>1&&""===t.path[0];)t.path.shift();"?"==s?(t.query="",l=yt):"#"==s&&(t.fragment="",l=wt)}else d+=G(s,q);break;case vt:"?"==s?(t.query="",l=yt):"#"==s?(t.fragment="",l=wt):s!=r&&(t.path[0]+=G(s,L));break;case yt:n||"#"!=s?s!=r&&("'"==s&&V(t)?t.query+="%27":t.query+="#"==s?"%23":G(s,L)):(t.fragment="",l=wt);break;case wt:s!=r&&(t.fragment+=G(s,z))}p++}},xt=function(t){var e,n,r=l(this,xt,"URL"),i=arguments.length>1?arguments[1]:void 0,s=String(t),a=x(r,{type:"URL"});if(void 0!==i)if(i instanceof xt)e=O(i);else if(n=kt(e={},String(i)))throw TypeError(n);if(n=kt(a,s,null,e))throw TypeError(n);var c=a.searchParams=new w,u=k(c);u.updateSearchParams(a.query),u.updateURL=function(){a.query=String(c)||null},o||(r.href=jt.call(r),r.origin=St.call(r),r.protocol=_t.call(r),r.username=At.call(r),r.password=Tt.call(r),r.host=Pt.call(r),r.hostname=Et.call(r),r.port=Ct.call(r),r.pathname=It.call(r),r.search=Ft.call(r),r.searchParams=Mt.call(r),r.hash=Nt.call(r))},Ot=xt.prototype,jt=function(){var t=O(this),e=t.scheme,n=t.username,r=t.password,i=t.host,o=t.port,s=t.path,a=t.query,c=t.fragment,u=e+":";return null!==i?(u+="//",H(t)&&(u+=n+(r?":"+r:"")+"@"),u+=U(i),null!==o&&(u+=":"+o)):"file"==e&&(u+="//"),u+=t.cannotBeABaseURL?s[0]:s.length?"/"+s.join("/"):"",null!==a&&(u+="?"+a),null!==c&&(u+="#"+c),u},St=function(){var t=O(this),e=t.scheme,n=t.port;if("blob"==e)try{return new URL(e.path[0]).origin}catch(t){return"null"}return"file"!=e&&V(t)?e+"://"+U(t.host)+(null!==n?":"+n:""):"null"},_t=function(){return O(this).scheme+":"},At=function(){return O(this).username},Tt=function(){return O(this).password},Pt=function(){var t=O(this),e=t.host,n=t.port;return null===e?"":null===n?U(e):U(e)+":"+n},Et=function(){var t=O(this).host;return null===t?"":U(t)},Ct=function(){var t=O(this).port;return null===t?"":String(t)},It=function(){var t=O(this),e=t.path;return t.cannotBeABaseURL?e[0]:e.length?"/"+e.join("/"):""},Ft=function(){var t=O(this).query;return t?"?"+t:""},Mt=function(){return O(this).searchParams},Nt=function(){var t=O(this).fragment;return t?"#"+t:""},Rt=function(t,e){return{get:t,set:e,configurable:!0,enumerable:!0}};if(o&&c(Ot,{href:Rt(jt,(function(t){var e=O(this),n=String(t),r=kt(e,n);if(r)throw TypeError(r);k(e.searchParams).updateSearchParams(e.query)})),origin:Rt(St),protocol:Rt(_t,(function(t){var e=O(this);kt(e,String(t)+":",tt)})),username:Rt(At,(function(t){var e=O(this),n=h(String(t));if(!X(e)){e.username="";for(var r=0;r=n.length?{value:void 0,done:!0}:(t=r(n,i),e.index+=t.length,{value:t,done:!1})}))},function(t,e,n){"use strict";var r=n(13),i=n(3),o=n(105),s=n(92),a=n(84),c=n(37),u=n(85),l=Object.assign;t.exports=!l||i((function(){var t={},e={},n=Symbol();return t[n]=7,"abcdefghijklmnopqrst".split("").forEach((function(t){e[t]=t})),7!=l({},t)[n]||"abcdefghijklmnopqrst"!=o(l({},e)).join("")}))?function(t,e){for(var n=c(t),i=arguments.length,l=1,f=s.f,p=a.f;i>l;)for(var h,d=u(arguments[l++]),b=f?o(d).concat(f(d)):o(d),m=b.length,g=0;m>g;)h=b[g++],r&&!p.call(d,h)||(n[h]=d[h]);return n}:l},function(t,e,n){"use strict";var r=n(47),i=n(37),o=n(97),s=n(96),a=n(45),c=n(258),u=n(48);t.exports=function(t){var e,n,l,f,p,h=i(t),d="function"==typeof this?this:Array,b=arguments.length,m=b>1?arguments[1]:void 0,g=void 0!==m,v=0,y=u(h);if(g&&(m=r(m,b>2?arguments[2]:void 0,2)),null==y||d==Array&&s(y))for(n=new d(e=a(h.length));e>v;v++)c(n,v,g?m(h[v],v):h[v]);else for(p=(f=y.call(h)).next,n=new d;!(l=p.call(f)).done;v++)c(n,v,g?o(f,m,[l.value,v],!0):l.value);return n.length=v,n}},function(t,e,n){"use strict";var r=n(58),i=n(21),o=n(42);t.exports=function(t,e,n){var s=r(e);s in t?i.f(t,s,o(0,n)):t[s]=n}},function(t,e,n){"use strict";var r=/[^\0-\u007E]/,i=/[.\u3002\uFF0E\uFF61]/g,o="Overflow: input needs wider integers to process",s=Math.floor,a=String.fromCharCode,c=function(t){return t+22+75*(t<26)},u=function(t,e,n){var r=0;for(t=n?s(t/700):t>>1,t+=s(t/e);t>455;r+=36)t=s(t/35);return s(r+36*t/(t+38))},l=function(t){var e,n,r=[],i=(t=function(t){for(var e=[],n=0,r=t.length;n=55296&&i<=56319&&n=l&&ns((2147483647-f)/m))throw RangeError(o);for(f+=(b-l)*m,l=b,e=0;e2147483647)throw RangeError(o);if(n==l){for(var g=f,v=36;;v+=36){var y=v<=p?1:v>=p+26?26:v-p;if(g0?arguments[0]:void 0,p=this,g=[];if(v(p,{type:"URLSearchParams",entries:g,updateURL:function(){},updateSearchParams:C}),void 0!==u)if(d(u))if("function"==typeof(t=m(u)))for(n=(e=t.call(u)).next;!(r=n.call(e)).done;){if((s=(o=(i=b(h(r.value))).next).call(i)).done||(a=o.call(i)).done||!o.call(i).done)throw TypeError("Expected sequence with length 2");g.push({key:s.value+"",value:a.value+""})}else for(c in u)f(u,c)&&g.push({key:c,value:u[c]+""});else E(g,"string"==typeof u?"?"===u.charAt(0)?u.slice(1):u:u+"")},N=M.prototype;s(N,{append:function(t,e){I(arguments.length,2);var n=y(this);n.entries.push({key:t+"",value:e+""}),n.updateURL()},delete:function(t){I(arguments.length,1);for(var e=y(this),n=e.entries,r=t+"",i=0;it.key){i.splice(e,0,t);break}e===n&&i.push(t)}r.updateURL()},forEach:function(t){for(var e,n=y(this).entries,r=p(t,arguments.length>1?arguments[1]:void 0,3),i=0;i Date: Tue, 24 Dec 2019 13:23:30 +0300 Subject: [PATCH 104/188] fix codacy issues part5 --- cvat-data/src/js/3rdparty/avc.wasm | Bin 132979 -> 126815 bytes cvat/apps/engine/static/engine/js/avc.wasm | Bin 132979 -> 126815 bytes 2 files changed, 0 insertions(+), 0 deletions(-) diff --git a/cvat-data/src/js/3rdparty/avc.wasm b/cvat-data/src/js/3rdparty/avc.wasm index 378ac32d9a676a169af5c87ad0ccba9649e02366..559b2b3157a0fccbcf3128e8a5d4e371654d2d3e 100644 GIT binary patch literal 126815 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 Date: Tue, 24 Dec 2019 14:34:23 +0300 Subject: [PATCH 105/188] fix codacy issues part6 --- cvat/apps/engine/static/engine/js/player.js | 256 +++++++++++--------- 1 file changed, 137 insertions(+), 119 deletions(-) diff --git a/cvat/apps/engine/static/engine/js/player.js b/cvat/apps/engine/static/engine/js/player.js index 38ffa40bf998..13fba895cda3 100644 --- a/cvat/apps/engine/static/engine/js/player.js +++ b/cvat/apps/engine/static/engine/js/player.js @@ -26,56 +26,39 @@ class FrameProviderWrapper extends Listener { async require(frameNumber) { this._required = frameNumber; - try { - const frameData = await window.cvatTask.frames.get(frameNumber); - const ranges = await window.cvatTask.frames.ranges(); - for (const range of ranges) { - const [start, stop] = range.split(':').map((el) => +el); - if (frameNumber >= start && frameNumber <= stop) { - const data = await frameData.data(); - this._loaded = frameNumber; - this._result = { - data, - renderWidth: frameData.width, - renderHeight: frameData.height, - }; - return this._result; - } - } - - // fetching from server - // we don't want to wait it - // but we promise to notify the player when frame is loaded - frameData.data().then((data) => { + const frameData = await window.cvatTask.frames.get(frameNumber); + const ranges = await window.cvatTask.frames.ranges(); + for (const range of ranges) { + const [start, stop] = range.split(':').map((el) => +el); + if (frameNumber >= start && frameNumber <= stop) { + const data = await frameData.data(); this._loaded = frameNumber; this._result = { data, renderWidth: frameData.width, renderHeight: frameData.height, }; - - this.notify(); - }).catch((error) => { - this._loaded = {frameNumber}; - if (typeof (error) === 'number') { - if (this._required === error) { - console.log(`Unexpecter error. Requested frame ${error} was rejected`); - } else { - console.log(`${error} rejected - ok`); - } - } - this.notify(); - }); - } catch (error) { - if (typeof (error) === 'number') { - if (this._required === error) { - console.log(`Unexpecter error. Requested frame ${error} was rejected`); - } else { - console.log(`${error} rejected - ok`); - } - throw error; + return this._result; } } + + // fetching from server + // we don't want to wait it + // but we promise to notify the player when frame is loaded + frameData.data().then((data) => { + this._loaded = frameNumber; + this._result = { + data, + renderWidth: frameData.width, + renderHeight: frameData.height, + }; + + this.notify(); + }).catch(() => { + this._loaded = { frameNumber }; + this.notify(); + }); + return null; } @@ -101,35 +84,39 @@ class FrameBuffer extends Listener { this._stopFrame = stopFrame; } - getFreeBufferSize () { + getFreeBufferSize() { let requestedFrameCount = 0; - for (let chunk_idx in this._requestedChunks){ - if(this._requestedChunks.hasOwnProperty(chunk_idx)){ - requestedFrameCount += this._requestedChunks[chunk_idx].requestedFrames.size; + for (const chunkIdx in this._requestedChunks) { + if (Object.prototype.hasOwnProperty.call(this._requestedChunks, chunkIdx)) { + requestedFrameCount += this._requestedChunks[chunkIdx].requestedFrames.size; } - } + } return this._size - Object.keys(this._buffer).length - requestedFrameCount; } async onFrameLoad(last) { // callback for FrameProvider instance - const isReject = typeof(last) === 'object'; + const isReject = typeof (last) === 'object'; if (isReject) { last = last.frameNumber; } - const chunk_idx = Math.floor(last / this._chunkSize); - if (chunk_idx in this._requestedChunks && this._requestedChunks[chunk_idx].requestedFrames.has(last)) { + const chunkIdx = Math.floor(last / this._chunkSize); + if (chunkIdx in this._requestedChunks + && this._requestedChunks[chunkIdx].requestedFrames.has(last)) { if (isReject) { - this._requestedChunks[chunk_idx].reject(new Set()); - this._requestedChunks[chunk_idx].requestedFrames.clear(); + this._requestedChunks[chunkIdx].reject(new Set()); + this._requestedChunks[chunkIdx].requestedFrames.clear(); } - const frameData = await this._frameProvider.require(last); - if (chunk_idx in this._requestedChunks && this._requestedChunks[chunk_idx].requestedFrames.has(last)) { - this._requestedChunks[chunk_idx].buffer[last] = frameData; - this._requestedChunks[chunk_idx].requestedFrames.delete(last); - if (this._requestedChunks[chunk_idx].requestedFrames.size === 0) { - if (this._requestedChunks[chunk_idx].resolve) { - const bufferedframes = Object.keys(this._requestedChunks[chunk_idx].buffer).map(f => +f); - this._requestedChunks[chunk_idx].resolve(new Set(bufferedframes)); + const frameData = await this._frameProvider.require(last); + if (chunkIdx in this._requestedChunks + && this._requestedChunks[chunkIdx].requestedFrames.has(last)) { + this._requestedChunks[chunkIdx].buffer[last] = frameData; + this._requestedChunks[chunkIdx].requestedFrames.delete(last); + if (this._requestedChunks[chunkIdx].requestedFrames.size === 0) { + if (this._requestedChunks[chunkIdx].resolve) { + const bufferedframes = Object.keys( + this._requestedChunks[chunkIdx].buffer, + ).map(f => +f); + this._requestedChunks[chunkIdx].resolve(new Set(bufferedframes)); } } } @@ -139,32 +126,39 @@ class FrameBuffer extends Listener { } } - requestOneChunkFrames(chunk_idx) { - return new Promise ( (resolve, reject) => { - this._requestedChunks[chunk_idx] = {...this._requestedChunks[chunk_idx], resolve, reject}; - for (const frame of this._requestedChunks[chunk_idx].requestedFrames.entries()) { + requestOneChunkFrames(chunkIdx) { + return new Promise((resolve, reject) => { + this._requestedChunks[chunkIdx] = { + ...this._requestedChunks[chunkIdx], + resolve, + reject, + }; + for (const frame of this._requestedChunks[chunkIdx].requestedFrames.entries()) { const requestedFrame = frame[1]; this._frameProvider.require(requestedFrame).then(frameData => { - if (!(chunk_idx in this._requestedChunks) || !this._requestedChunks[chunk_idx].requestedFrames.has(requestedFrame)) { + if (!(chunkIdx in this._requestedChunks) + || !this._requestedChunks[chunkIdx].requestedFrames.has(requestedFrame)) { reject(requestedFrame); } if (frameData !== null) { - this._requestedChunks[chunk_idx].requestedFrames.delete(requestedFrame); - this._requestedChunks[chunk_idx].buffer[requestedFrame] = frameData; - if (this._requestedChunks[chunk_idx].requestedFrames.size === 0) { - const bufferedframes = Object.keys(this._requestedChunks[chunk_idx].buffer).map(f => +f); - this._requestedChunks[chunk_idx].resolve(new Set(bufferedframes)); + this._requestedChunks[chunkIdx].requestedFrames.delete(requestedFrame); + this._requestedChunks[chunkIdx].buffer[requestedFrame] = frameData; + if (this._requestedChunks[chunkIdx].requestedFrames.size === 0) { + const bufferedframes = Object.keys( + this._requestedChunks[chunkIdx].buffer, + ).map(f => +f); + this._requestedChunks[chunkIdx].resolve(new Set(bufferedframes)); } } - }).catch( error => { + }).catch(error => { reject(error); }); } }); } - fillBuffer(startFrame, frameStep=1, count=null) { + fillBuffer(startFrame, frameStep = 1, count = null) { const freeSize = this.getFreeBufferSize(); let stopFrame = Math.min(startFrame + frameStep * freeSize, this._stopFrame + 1); @@ -173,41 +167,46 @@ class FrameBuffer extends Listener { } for (let i = startFrame; i < stopFrame; i += frameStep) { - const chunk_idx = Math.floor(i / this._chunkSize); - if (!(chunk_idx in this._requestedChunks)) { - this._requestedChunks[chunk_idx] = { + const chunkIdx = Math.floor(i / this._chunkSize); + if (!(chunkIdx in this._requestedChunks)) { + this._requestedChunks[chunkIdx] = { requestedFrames: new Set(), resolve: null, reject: null, buffer: {}, }; } - this._requestedChunks[chunk_idx].requestedFrames.add(i); + this._requestedChunks[chunkIdx].requestedFrames.add(i); } let bufferedFrames = new Set(); - return new Promise( async (resolve, reject) => { - for (const chunk_idx in this._requestedChunks) { - if(this._requestedChunks.hasOwnProperty(chunk_idx)) { + // Need to decode chunks in sequence + // eslint-disable-next-line no-async-promise-executor + return new Promise(async (resolve, reject) => { + for (const chunkIdx in this._requestedChunks) { + if (Object.prototype.hasOwnProperty.call(this._requestedChunks, chunkIdx)) { try { - const chunkFrames = await this.requestOneChunkFrames(chunk_idx); - if (chunk_idx in this._requestedChunks) { + const chunkFrames = await this.requestOneChunkFrames(chunkIdx); + if (chunkIdx in this._requestedChunks) { bufferedFrames = new Set([...bufferedFrames, ...chunkFrames]); - this._buffer = {...this._buffer, ...this._requestedChunks[chunk_idx].buffer}; - delete this._requestedChunks[chunk_idx]; - if (Object.keys(this._requestedChunks).length === 0){ + this._buffer = { + ...this._buffer, + ...this._requestedChunks[chunkIdx].buffer, + }; + delete this._requestedChunks[chunkIdx]; + if (Object.keys(this._requestedChunks).length === 0) { resolve(bufferedFrames); } } else { - reject(parseInt(chunk_idx)); + reject(chunkIdx); } } catch (error) { this._requestedChunks = {}; resolve(bufferedFrames); } } - } + } }); } @@ -216,22 +215,22 @@ class FrameBuffer extends Listener { const frame = this._buffer[frameNumber]; delete this._buffer[frameNumber]; return frame; - } else { - return this._frameProvider.require(frameNumber); } + return this._frameProvider.require(frameNumber); } clear() { - for (const chunk_idx in this._requestedChunks) { - if (this._requestedChunks.hasOwnProperty(chunk_idx) && this._requestedChunks[chunk_idx].reject) { - this._requestedChunks[chunk_idx].reject(); + for (const chunkIdx in this._requestedChunks) { + if (Object.prototype.hasOwnProperty.call(this._requestedChunks, chunkIdx) + && this._requestedChunks[chunkIdx].reject) { + this._requestedChunks[chunkIdx].reject(); } } this._requestedChunks = {}; this._buffer = {}; } - deleteFrame(frameNumber){ + deleteFrame(frameNumber) { if (frameNumber in this._buffer) { delete this._buffer[frameNumber]; } @@ -266,7 +265,10 @@ class PlayerModel extends Listener { this._chunkSize = window.cvat.job.chunk_size; this._frameProvider = new FrameProviderWrapper(this._frame.stop); this._bufferSize = 200; - this._frameBuffer = new FrameBuffer(this._bufferSize, this._frameProvider, this._chunkSize, this._frame.stop); + this._frameBuffer = new FrameBuffer( + this._bufferSize, this._frameProvider, + this._chunkSize, this._frame.stop, + ); this._continueAfterLoad = false; this._image = null; this._activeBufrequest = false; @@ -373,7 +375,7 @@ class PlayerModel extends Listener { } } - fillBuffer(startFrame, step, count=null) { + fillBuffer(startFrame, step, count = null) { if (this._activeBufrequest) { return; } @@ -387,7 +389,7 @@ class PlayerModel extends Listener { this._playInterval = setInterval(() => this._playFunction(), this._timeout); } }).catch(error => { - if (typeof(error) !== 'number') { + if (typeof (error) !== 'number') { throw error; } }).finally(() => { @@ -405,7 +407,8 @@ class PlayerModel extends Listener { } const requestedFrame = this._frame.current + this._step; - if (this._bufferedFrames.size < this._bufferSize / 2 && requestedFrame <= this._frame.stop) { + if (this._bufferedFrames.size < this._bufferSize / 2 + && requestedFrame <= this._frame.stop) { if (this._bufferedFrames.size !== 0) { const maxBufFrame = Math.max(...this._bufferedFrames); if (maxBufFrame !== this._frame.stop) { @@ -447,8 +450,9 @@ class PlayerModel extends Listener { this._timeout = 1000 / this._settings.fps; this._frame.requested.clear(); - this._bufferedFrames.forEach( bufferedFrame => { - if (bufferedFrame <= this._frame.current || bufferedFrame >= this._frame.current + this._bufferSize) { + this._bufferedFrames.forEach(bufferedFrame => { + if (bufferedFrame <= this._frame.current + || bufferedFrame >= this._frame.current + this._bufferSize) { this._bufferedFrames.delete(bufferedFrame); this._frameBuffer.deleteFrame(bufferedFrame); } @@ -467,7 +471,7 @@ class PlayerModel extends Listener { } } - async shift(delta, absolute, is_load_frame = true) { + async shift(delta, absolute, isLoadFrame = true) { if (['resize', 'drag'].indexOf(window.cvat.mode) !== -1) { return false; } @@ -479,7 +483,7 @@ class PlayerModel extends Listener { this._frame.stop); this._frame.requested.add(requestedFrame); - if (!is_load_frame) { + if (!isLoadFrame) { this._image = null; this._continueAfterLoad = this.playing; this._pauseFlag = true; @@ -520,7 +524,8 @@ class PlayerModel extends Listener { const curFrameRotation = this._framewiseRotation[this._frame.current]; const prevFrameRotation = this._framewiseRotation[this._frame.previous]; const differentRotation = curFrameRotation !== prevFrameRotation; - // fit if tool is in the annotation mode or frame loading is first in the interpolation mode + // fit if tool is in the annotation mode or frame loading is first + // in the interpolation mode if (this._settings.resetZoom || this._frame.previous === null || differentRotation) { this._frame.previous = requestedFrame; this.fit(); // notify() inside the fit() @@ -537,6 +542,7 @@ class PlayerModel extends Listener { throw error; } } + return false; } updateGeometry(geometry) { @@ -558,8 +564,10 @@ class PlayerModel extends Listener { this._geometry.height / this._image.renderHeight); } - this._geometry.top = (this._geometry.height - this._image.renderHeight * this._geometry.scale) / 2; - this._geometry.left = (this._geometry.width - this._image.renderWidth * this._geometry.scale) / 2; + this._geometry.top = (this._geometry.height + - this._image.renderHeight * this._geometry.scale) / 2; + this._geometry.left = (this._geometry.width + - this._image.renderWidth * this._geometry.scale) / 2; window.cvat.player.rotation = rotation; window.cvat.player.geometry.scale = this._geometry.scale; @@ -581,14 +589,19 @@ class PlayerModel extends Listener { if (this._geometry.scale < fittedScale) { this._geometry.scale = fittedScale; - this._geometry.top = (this._geometry.height - this._image.renderHeight * this._geometry.scale) / 2; - this._geometry.left = (this._geometry.width - this._image.renderWidth * this._geometry.scale) / 2; + this._geometry.top = (this._geometry.height + - this._image.renderHeight * this._geometry.scale) / 2; + this._geometry.left = (this._geometry.width + - this._image.renderWidth * this._geometry.scale) / 2; } else { - this._geometry.left = (this._geometry.width / this._geometry.scale - xtl * 2 - boxWidth) * this._geometry.scale / 2; - this._geometry.top = (this._geometry.height / this._geometry.scale - ytl * 2 - boxHeight) * this._geometry.scale / 2; + this._geometry.left = ((this._geometry.width / this._geometry.scale + - xtl * 2 - boxWidth) * this._geometry.scale) / 2; + this._geometry.top = ((this._geometry.height / this._geometry.scale + - ytl * 2 - boxHeight) * this._geometry.scale) / 2; } window.cvat.player.geometry.scale = this._geometry.scale; - this._frame.previous = this._frame.current; // fix infinite loop via playerUpdate->collectionUpdate*->AAMUpdate->playerUpdate->... + // fix infinite loop via playerUpdate->collectionUpdate*->AAMUpdate->playerUpdate->... + this._frame.previous = this._frame.current; this.notify(); } @@ -596,11 +609,15 @@ class PlayerModel extends Listener { if (!this._image) return; const oldScale = this._geometry.scale; - const newScale = value > 0 ? this._geometry.scale * 6 / 5 : this._geometry.scale * 5 / 6; + const newScale = value > 0 + ? (this._geometry.scale * 6) / 5 + : (this._geometry.scale * 5) / 6; this._geometry.scale = Math.clamp(newScale, MIN_PLAYER_SCALE, MAX_PLAYER_SCALE); - this._geometry.left += (point.x * (oldScale / this._geometry.scale - 1)) * this._geometry.scale; - this._geometry.top += (point.y * (oldScale / this._geometry.scale - 1)) * this._geometry.scale; + this._geometry.left += this._geometry.scale + * (point.x * (oldScale / this._geometry.scale - 1)); + this._geometry.top += this._geometry.scale + * (point.y * (oldScale / this._geometry.scale - 1)); window.cvat.player.geometry.scale = this._geometry.scale; this.notify(); @@ -649,7 +666,7 @@ class PlayerController { move: null, }; - function setupPlayerShortcuts(playerModel) { + function setupPlayerShortcuts() { const nextHandler = Logger.shortkeyLogDecorator((e) => { this.next(); e.preventDefault(); @@ -792,7 +809,7 @@ class PlayerController { } } - progressMouseDown(e) { + progressMouseDown() { this._rewinding = true; } @@ -809,7 +826,7 @@ class PlayerController { this._rewind(e, true); } - _rewind(e, is_move = false) { + _rewind(e, isMove = false) { if (this._rewinding) { if (!this._events.jump) { this._events.jump = Logger.addContinuedEvent(Logger.EventType.jumpFrame); @@ -821,7 +838,7 @@ class PlayerController { const percent = x / progressWidth; const targetFrame = Math.round((frames.stop - frames.start) * percent); this._model.pause(); - this._model.shift(targetFrame + frames.start, !is_move); + this._model.shift(targetFrame + frames.start, !isMove); } } @@ -1143,16 +1160,17 @@ class PlayerView { this._playerCanvasBackground.attr('width', image.renderWidth); this._playerCanvasBackground.attr('height', image.renderHeight); const imageData = image.data; - ctx.scale(image.renderWidth / image.data.width, image.renderHeight / image.data.height); + ctx.scale(image.renderWidth / image.data.width, + image.renderHeight / image.data.height); ctx.putImageData(imageData, 0, 0); ctx.drawImage(this._playerCanvasBackground[0], 0, 0); } else { - var img = new Image(); - img.onload = function() { + const img = new Image(); + img.onload = () => { this._playerCanvasBackground.attr('width', img.width); this._playerCanvasBackground.attr('height', img.height); ctx.drawImage(img, 0, 0); - }.bind(this); + }; img.src = image.data.data; } } From f00001f52b137d822c33eb73617ad1db5bd75432 Mon Sep 17 00:00:00 2001 From: Andrey Zhavoronkov Date: Tue, 24 Dec 2019 15:37:50 +0300 Subject: [PATCH 106/188] fix codacy issues part7 --- cvat-core/src/frames.js | 2 +- cvat-data/package-lock.json | 5 + cvat-data/package.json | 1 + cvat-data/src/js/cvat-data.js | 354 +++++++++--------- .../engine/static/engine/js/cvat-core.min.js | 4 +- 5 files changed, 178 insertions(+), 188 deletions(-) diff --git a/cvat-core/src/frames.js b/cvat-core/src/frames.js index b731f872aa02..b27a0654a324 100644 --- a/cvat-core/src/frames.js +++ b/cvat-core/src/frames.js @@ -157,7 +157,7 @@ provider.frame(this.number).then((frame) => { if (frame === null) { onServerRequest(); - if (!provider.is_chunk_cached(start, stop)) { + if (!provider.isChunkCached(start, stop)) { if (!frameDataCache[this.tid].activeChunkRequest || (frameDataCache[this.tid].activeChunkRequest && frameDataCache[this.tid].activeChunkRequest.completed)) { diff --git a/cvat-data/package-lock.json b/cvat-data/package-lock.json index 5adf5431566e..d1c808ea26e8 100644 --- a/cvat-data/package-lock.json +++ b/cvat-data/package-lock.json @@ -1353,6 +1353,11 @@ "integrity": "sha512-csOlWGAcRFJaI6m+F2WKdnMKr4HhdhFVBk0H/QbJFMCr+uO2kwohwXQPxw/9OCxp05r5ghVBFSyioixx3gfkNQ==", "dev": true }, + "async-mutex": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/async-mutex/-/async-mutex-0.1.4.tgz", + "integrity": "sha512-zVWTmAnxxHaeB2B1te84oecI8zTDJ/8G49aVBblRX6be0oq6pAybNcUSxwfgVOmOjSCvN4aYZAqwtyNI8e1YGw==" + }, "atob": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/atob/-/atob-2.1.2.tgz", diff --git a/cvat-data/package.json b/cvat-data/package.json index 5ab998c10230..358954ab3735 100644 --- a/cvat-data/package.json +++ b/cvat-data/package.json @@ -24,6 +24,7 @@ "webpack-dev-server": "^3.8.0" }, "dependencies": { + "async-mutex": "^0.1.4", "jszip": "3.1.5" }, "scripts": { diff --git a/cvat-data/src/js/cvat-data.js b/cvat-data/src/js/cvat-data.js index b5423eca3c7e..e118a2ac104c 100755 --- a/cvat-data/src/js/cvat-data.js +++ b/cvat-data/src/js/cvat-data.js @@ -7,34 +7,19 @@ require:true */ // require("./decode_video") +// eslint-disable-next-line max-classes-per-file +const { Mutex } = require('async-mutex'); const { MP4Reader, Bytestream } = require('./3rdparty/mp4'); + const BlockType = Object.freeze({ MP4VIDEO: 'mp4video', ARCHIVE: 'archive', }); - -class Mutex { - constructor() { - this._lock = Promise.resolve(); - } - _acquire() { - var release; - this._lock = new Promise(resolve => { - release = resolve; - }); - return release; - } - acquireQueued() { - const q = this._lock.then(() => release); - const release = this._acquire(); - return q; - } -}; - class FrameProvider { - constructor(blockType, blockSize, cachedBlockCount, decodedBlocksCacheSize=5, maxWorkerThreadCount=2) { + constructor(blockType, blockSize, cachedBlockCount, + decodedBlocksCacheSize = 5, maxWorkerThreadCount = 2) { this._frames = {}; this._cachedBlockCount = Math.max(1, cachedBlockCount); // number of stored blocks this._decodedBlocksCacheSize = decodedBlocksCacheSize; @@ -53,18 +38,17 @@ class FrameProvider { this._mutex = new Mutex(); this._promisedFrames = {}; this._maxWorkerThreadCount = maxWorkerThreadCount; - }; + } - async _worker() - { - if (this._requestedBlockDecode != null && this._decodeThreadCount < this._maxWorkerThreadCount) { + async _worker() { + if (this._requestedBlockDecode != null + && this._decodeThreadCount < this._maxWorkerThreadCount) { await this.startDecode(); } this._timerId = setTimeout(this._worker.bind(this), 100); } - is_chunk_cached(start, end) - { + isChunkCached(start, end) { return (`${start}:${end}` in this._blocks_ranges); } @@ -74,7 +58,7 @@ class FrameProvider { const shifted = this._blocks_ranges.shift(); // get the oldest block const [start, end] = shifted.split(':').map((el) => +el); delete this._blocks[start / this._blockSize]; - for (let i = start; i <= end; i++){ + for (let i = start; i <= end; i++) { delete this._frames[i]; } } @@ -83,8 +67,8 @@ class FrameProvider { const distance = Math.floor(this._decodedBlocksCacheSize / 2); for (let i = 0; i < this._blocks_ranges.length; i++) { const [start, end] = this._blocks_ranges[i].split(':').map((el) => +el); - if (end < this._currFrame - distance * this._blockSize || - start > this._currFrame + distance * this._blockSize) { + if (end < this._currFrame - distance * this._blockSize + || start > this._currFrame + distance * this._blockSize) { for (let j = start; j <= end; j++) { delete this._frames[j]; } @@ -92,42 +76,41 @@ class FrameProvider { } } - async requestDecodeBlock(block, start, end, resolveCallback, rejectCallback){ - const release = await this._mutex.acquireQueued(); - if (this._requestedBlockDecode !== null) { - if (start === this._requestedBlockDecode.start && - end === this._requestedBlockDecode.end) { + async requestDecodeBlock(block, start, end, resolveCallback, rejectCallback) { + const release = await this._mutex.acquire(); + try { + if (this._requestedBlockDecode !== null) { + if (start === this._requestedBlockDecode.start + && end === this._requestedBlockDecode.end) { this._requestedBlockDecode.resolveCallback = resolveCallback; this._requestedBlockDecode.rejectCallback = rejectCallback; - } else if (this._requestedBlockDecode.rejectCallback) { - this._requestedBlockDecode.rejectCallback(); - } - } - if (!(`${start}:${end}` in this._decodingBlocks)) { - if (block === null) - { - block = this._blocks[Math.floor((start+1) / this.blockSize)]; + } else if (this._requestedBlockDecode.rejectCallback) { + this._requestedBlockDecode.rejectCallback(); + } } - this._requestedBlockDecode = { - block : block, - start : start, - end : end, - resolveCallback : resolveCallback, - rejectCallback : rejectCallback, + if (!(`${start}:${end}` in this._decodingBlocks)) { + this._requestedBlockDecode = { + block: block || this._blocks[Math.floor((start + 1) / this.blockSize)], + start, + end, + resolveCallback, + rejectCallback, + }; + } else { + this._decodingBlocks[`${start}:${end}`].rejectCallback = rejectCallback; + this._decodingBlocks[`${start}:${end}`].resolveCallback = resolveCallback; } - } else { - this._decodingBlocks[`${start}:${end}`].rejectCallback = rejectCallback; - this._decodingBlocks[`${start}:${end}`].resolveCallback = resolveCallback; + } finally { + release(); } - release(); } isRequestExist() { return this._requestedBlockDecode != null; } - setRenderSize(width, height){ - this._width = width + setRenderSize(width, height) { + this._width = width; this._height = height; } @@ -152,11 +135,11 @@ class FrameProvider { isNextChunkExists(frameNumber) { const nextChunkNum = Math.floor(frameNumber / this._blockSize) + 1; - if (this._blocks[nextChunkNum] === "loading"){ + if (this._blocks[nextChunkNum] === 'loading') { return true; } - else - return nextChunkNum in this._blocks; + + return nextChunkNum in this._blocks; } /* @@ -170,13 +153,13 @@ class FrameProvider { */ setReadyToLoading(chunkNumber) { - this._blocks[chunkNumber] = "loading"; + this._blocks[chunkNumber] = 'loading'; } - cropImage(imageBuffer, imageWidth, imageHeight, xOffset, yOffset, width, height) { - if (xOffset === 0 && width === imageWidth && - yOffset === 0 && height === imageHeight) { - return new ImageData(new Uint8ClampedArray(imageBuffer), width, height); + static cropImage(imageBuffer, imageWidth, imageHeight, xOffset, yOffset, width, height) { + if (xOffset === 0 && width === imageWidth + && yOffset === 0 && height === imageHeight) { + return new ImageData(new Uint8ClampedArray(imageBuffer), width, height); } const source = new Uint32Array(imageBuffer); @@ -186,7 +169,11 @@ class FrameProvider { const rgbaInt8Clamped = new Uint8ClampedArray(buffer); if (imageWidth === width) { - return new ImageData(new Uint8ClampedArray(imageBuffer, yOffset * 4, bufferSize), width, height); + return new ImageData( + new Uint8ClampedArray(imageBuffer, yOffset * 4, bufferSize), + width, + height, + ); } let writeIdx = 0; @@ -200,146 +187,143 @@ class FrameProvider { } async startDecode() { - const release = await this._mutex.acquireQueued(); - const height = this._height; - const width = this._width; - const start = this._requestedBlockDecode.start; - const end = this._requestedBlockDecode.end; - const block = this._requestedBlockDecode.block; - - this._blocks_ranges.push(`${start}:${end}`); - this._decodingBlocks[`${start}:${end}`] = this._requestedBlockDecode; - this._requestedBlockDecode = null; - this._blocks[Math.floor((start+1)/ this._blockSize)] = block; - for (let i = start; i <= end; i++){ - this._frames[i] = null; - } - this._cleanup(); - if (this._blockType === BlockType.MP4VIDEO) { - const worker = new Worker('/static/engine/js/Decoder.js'); - let index = start; - - worker.onmessage = (e) => { - if (e.data.consoleLog) { // ignore initialization message - return; - } + const release = await this._mutex.acquire(); + try { + const height = this._height; + const width = this._width; + const { start, end, block } = this._requestedBlockDecode; + + this._blocks_ranges.push(`${start}:${end}`); + this._decodingBlocks[`${start}:${end}`] = this._requestedBlockDecode; + this._requestedBlockDecode = null; + this._blocks[Math.floor((start + 1) / this._blockSize)] = block; + for (let i = start; i <= end; i++) { + this._frames[i] = null; + } + this._cleanup(); + if (this._blockType === BlockType.MP4VIDEO) { + const worker = new Worker('/static/engine/js/Decoder.js'); + let index = start; + + worker.onmessage = (e) => { + if (e.data.consoleLog) { // ignore initialization message + return; + } - const scaleFactor = Math.ceil(this._height / e.data.height); - this._frames[index] = this.cropImage( - e.data.buf, e.data.width, e.data.height, 0, 0, - Math.floor(width / scaleFactor), Math.floor(height / scaleFactor)); + const scaleFactor = Math.ceil(this._height / e.data.height); + this._frames[index] = this.cropImage( + e.data.buf, e.data.width, e.data.height, 0, 0, + Math.floor(width / scaleFactor), Math.floor(height / scaleFactor), + ); - if (this._decodingBlocks[`${start}:${end}`].resolveCallback) { - this._decodingBlocks[`${start}:${end}`].resolveCallback(index); - } + if (this._decodingBlocks[`${start}:${end}`].resolveCallback) { + this._decodingBlocks[`${start}:${end}`].resolveCallback(index); + } - if (index in this._promisedFrames) { - this._promisedFrames[index].resolve(this._frames[index]); - delete this._promisedFrames[index]; - } - if (index === end) { - this._decodeThreadCount--; - delete this._decodingBlocks[`${start}:${end}`]; + if (index in this._promisedFrames) { + this._promisedFrames[index].resolve(this._frames[index]); + delete this._promisedFrames[index]; + } + if (index === end) { + this._decodeThreadCount--; + delete this._decodingBlocks[`${start}:${end}`]; + worker.terminate(); + } + index++; + }; + + worker.onerror = (e) => { worker.terminate(); - } - index++; - }; - - worker.onerror = (e) => { - console.log(['ERROR: Line ', e.lineno, ' in ', e.filename, ': ', e.message].join('')); - worker.terminate(); - this._decodeThreadCount--; - - for (let i = index; i <= end; i++){ - if (i in this._promisedFrames) { - this._promisedFrames[i].reject(); - delete this._promisedFrames[i]; + this._decodeThreadCount--; + + for (let i = index; i <= end; i++) { + if (i in this._promisedFrames) { + this._promisedFrames[i].reject(); + delete this._promisedFrames[i]; + } } - } - if (this._decodingBlocks[`${start}:${end}`].rejectCallback) { - this._decodingBlocks[`${start}:${end}`].rejectCallback(); - } - delete this._decodingBlocks[`${start}:${end}`]; - }; - - worker.postMessage({ - type: "Broadway.js - Worker init", - options: { - rgb: true, - reuseMemory: false, - }, - }); - - const reader = new MP4Reader(new Bytestream(block)); - reader.read(); - const video = reader.tracks[1]; - - const avc = reader.tracks[1].trak.mdia.minf.stbl.stsd.avc1.avcC; - const sps = avc.sps[0]; - const pps = avc.pps[0]; - - /* Decode Sequence & Picture Parameter Sets */ - worker.postMessage({buf: sps, offset: 0, length: sps.length}); - worker.postMessage({buf: pps, offset: 0, length: pps.length}); - - /* Decode Pictures */ - for (let sample = 0; sample < video.getSampleCount(); sample++){ - video.getSampleNALUnits(sample).forEach(nal => { - worker.postMessage({buf: nal, offset: 0, length: nal.length}) + if (this._decodingBlocks[`${start}:${end}`].rejectCallback) { + this._decodingBlocks[`${start}:${end}`].rejectCallback(Error(e)); + } + delete this._decodingBlocks[`${start}:${end}`]; + }; + + worker.postMessage({ + type: 'Broadway.js - Worker init', + options: { + rgb: true, + reuseMemory: false, + }, }); - } - this._decodeThreadCount++; - } else { - const worker = new Worker('/static/engine/js/unzip_imgs.js'); - worker.onerror = (e) => { - console.log(['ERROR: Line ', e.lineno, ' in ', e.filename, ': ', e.message].join('')); + const reader = new MP4Reader(new Bytestream(block)); + reader.read(); + const video = reader.tracks[1]; - for (let i = start; i <= end; i++) { - if (i in this._promisedFrames) { - this._promisedFrames[i].reject(); - delete this._promisedFrames[i]; - } - } - if (this._decodingBlocks[`${start}:${end}`].rejectCallback) { - this._decodingBlocks[`${start}:${end}`].rejectCallback(); + const avc = reader.tracks[1].trak.mdia.minf.stbl.stsd.avc1.avcC; + const sps = avc.sps[0]; + const pps = avc.pps[0]; + + /* Decode Sequence & Picture Parameter Sets */ + worker.postMessage({ buf: sps, offset: 0, length: sps.length }); + worker.postMessage({ buf: pps, offset: 0, length: pps.length }); + + /* Decode Pictures */ + for (let sample = 0; sample < video.getSampleCount(); sample++) { + video.getSampleNALUnits(sample).forEach((nal) => { + worker.postMessage({ buf: nal, offset: 0, length: nal.length }); + }); } - this._decodeThreadCount--; - }; - - worker.onmessage = (event) => { - this._frames[event.data.index] = { - data: event.data.data, - width, - height, + this._decodeThreadCount++; + } else { + const worker = new Worker('/static/engine/js/unzip_imgs.js'); + + worker.onerror = (e) => { + for (let i = start; i <= end; i++) { + if (i in this._promisedFrames) { + this._promisedFrames[i].reject(); + delete this._promisedFrames[i]; + } + } + if (this._decodingBlocks[`${start}:${end}`].rejectCallback) { + this._decodingBlocks[`${start}:${end}`].rejectCallback(Error(e)); + } + this._decodeThreadCount--; }; - if (this._decodingBlocks[`${start}:${end}`].resolveCallback) { - this._decodingBlocks[`${start}:${end}`].resolveCallback(event.data.index); - } - if (event.data.index in this._promisedFrames) { - this._promisedFrames[event.data.index].resolve(this._frames[event.data.index]); - delete this._promisedFrames[event.data.index]; - } + worker.onmessage = (event) => { + this._frames[event.data.index] = { + data: event.data.data, + width, + height, + }; + if (this._decodingBlocks[`${start}:${end}`].resolveCallback) { + this._decodingBlocks[`${start}:${end}`].resolveCallback(event.data.index); + } - if (event.data.isEnd){ - delete this._decodingBlocks[`${start}:${end}`]; - this._decodeThreadCount--; - } - }; + if (event.data.index in this._promisedFrames) { + this._promisedFrames[event.data.index].resolve( + this._frames[event.data.index], + ); + delete this._promisedFrames[event.data.index]; + } - worker.postMessage({block : block, - start : start, - end : end }); - this._decodeThreadCount++; + if (event.data.isEnd) { + delete this._decodingBlocks[`${start}:${end}`]; + this._decodeThreadCount--; + } + }; + worker.postMessage({ block, start, end }); + this._decodeThreadCount++; + } + } finally { + release(); } - release(); } - get decodeThreadCount() - { + get decodeThreadCount() { return this._decodeThreadCount; } diff --git a/cvat/apps/engine/static/engine/js/cvat-core.min.js b/cvat/apps/engine/static/engine/js/cvat-core.min.js index 086294187607..5c4c3a2be12a 100644 --- a/cvat/apps/engine/static/engine/js/cvat-core.min.js +++ b/cvat/apps/engine/static/engine/js/cvat-core.min.js @@ -1,4 +1,4 @@ -window.cvat=function(t){var e={};function n(r){if(e[r])return e[r].exports;var i=e[r]={i:r,l:!1,exports:{}};return t[r].call(i.exports,i,i.exports,n),i.l=!0,i.exports}return n.m=t,n.c=e,n.d=function(t,e,r){n.o(t,e)||Object.defineProperty(t,e,{enumerable:!0,get:r})},n.r=function(t){"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(t,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(t,"__esModule",{value:!0})},n.t=function(t,e){if(1&e&&(t=n(t)),8&e)return t;if(4&e&&"object"==typeof t&&t&&t.__esModule)return t;var r=Object.create(null);if(n.r(r),Object.defineProperty(r,"default",{enumerable:!0,value:t}),2&e&&"string"!=typeof t)for(var i in t)n.d(r,i,function(e){return t[e]}.bind(null,i));return r},n.n=function(t){var e=t&&t.__esModule?function(){return t.default}:function(){return t};return n.d(e,"a",e),e},n.o=function(t,e){return Object.prototype.hasOwnProperty.call(t,e)},n.p="",n(n.s=140)}([function(t,e,n){(function(e){var n=function(t){return t&&t.Math==Math&&t};t.exports=n("object"==typeof globalThis&&globalThis)||n("object"==typeof window&&window)||n("object"==typeof self&&self)||n("object"==typeof e&&e)||Function("return this")()}).call(this,n(30))},function(t,e,n){(function(e){var n=function(t){return t&&t.Math==Math&&t};t.exports=n("object"==typeof globalThis&&globalThis)||n("object"==typeof window&&window)||n("object"==typeof self&&self)||n("object"==typeof e&&e)||Function("return this")()}).call(this,n(30))},function(t,e,n){var r=n(0),i=n(44),o=n(88),s=n(147),a=r.Symbol,c=i("wks");t.exports=function(t){return c[t]||(c[t]=s&&a[t]||(s?a:o)("Symbol."+t))}},function(t,e){t.exports=function(t){try{return!!t()}catch(t){return!0}}},function(t,e,n){var r=n(14);t.exports=function(t){if(!r(t))throw TypeError(String(t)+" is not an object");return t}},function(t,e,n){"use strict";var r=n(43),i=n(156),o=n(35),s=n(25),a=n(106),c=s.set,u=s.getterFor("Array Iterator");t.exports=a(Array,"Array",(function(t,e){c(this,{type:"Array Iterator",target:r(t),index:0,kind:e})}),(function(){var t=u(this),e=t.target,n=t.kind,r=t.index++;return!e||r>=e.length?(t.target=void 0,{value:void 0,done:!0}):"keys"==n?{value:r,done:!1}:"values"==n?{value:e[r],done:!1}:{value:[r,e[r]],done:!1}}),"values"),o.Arguments=o.Array,i("keys"),i("values"),i("entries")},function(t,e,n){n(11),(()=>{const e=n(161),r=n(163),i=n(66);class o extends Error{constructor(t){super(t);const n=(new Date).toISOString(),o=e.os.toString(),s=`${e.name} ${e.version}`,a=r.parse(this)[0],c=`${a.fileName}`,u=a.lineNumber,l=a.columnNumber,{jobID:f,taskID:p,clientID:h}=i;Object.defineProperties(this,Object.freeze({system:{get:()=>o},client:{get:()=>s},time:{get:()=>n},jobID:{get:()=>f},taskID:{get:()=>p},projID:{get:()=>void 0},clientID:{get:()=>h},filename:{get:()=>c},line:{get:()=>u},column:{get:()=>l}}))}async save(){const t={system:this.system,client:this.client,time:this.time,job_id:this.jobID,task_id:this.taskID,proj_id:this.projID,client_id:this.clientID,message:this.message,filename:this.filename,line:this.line,column:this.column,stack:this.stack};try{const e=n(26);await e.server.exception(t)}catch(t){}}}t.exports={Exception:o,ArgumentError:class extends o{constructor(t){super(t)}},DataError:class extends o{constructor(t){super(t)}},ScriptingError:class extends o{constructor(t){super(t)}},PluginError:class extends o{constructor(t){super(t)}},ServerError:class extends o{constructor(t,e){super(t),Object.defineProperties(this,Object.freeze({code:{get:()=>e}}))}}}})()},function(t,e,n){"use strict";var r=n(111),i=n(184),o=Object.prototype.toString;function s(t){return"[object Array]"===o.call(t)}function a(t){return null!==t&&"object"==typeof t}function c(t){return"[object Function]"===o.call(t)}function u(t,e){if(null!=t)if("object"!=typeof t&&(t=[t]),s(t))for(var n=0,r=t.length;ns;){var a,c,u,l=r[s++],f=o?l.ok:l.fail,p=l.resolve,h=l.reject,d=l.domain;try{f?(o||(2===e.rejection&&et(t,e),e.rejection=1),!0===f?a=i:(d&&d.enter(),a=f(i),d&&(d.exit(),u=!0)),a===l.promise?h($("Promise-chain cycle")):(c=K(a))?c.call(a,p,h):p(a)):h(i)}catch(t){d&&!u&&d.exit(),h(t)}}e.reactions=[],e.notified=!1,n&&!e.rejection&&Q(t,e)}))}},Y=function(t,e,n){var r,i;V?((r=B.createEvent("Event")).promise=e,r.reason=n,r.initEvent(t,!1,!0),u.dispatchEvent(r)):r={promise:e,reason:n},(i=u["on"+t])?i(r):"unhandledrejection"===t&&_("Unhandled promise rejection",n)},Q=function(t,e){O.call(u,(function(){var n,r=e.value;if(tt(e)&&(n=T((function(){J?U.emit("unhandledRejection",r,t):Y("unhandledrejection",t,r)})),e.rejection=J||tt(e)?2:1,n.error))throw n.value}))},tt=function(t){return 1!==t.rejection&&!t.parent},et=function(t,e){O.call(u,(function(){J?U.emit("rejectionHandled",t):Y("rejectionhandled",t,e.value)}))},nt=function(t,e,n,r){return function(i){t(e,n,i,r)}},rt=function(t,e,n,r){e.done||(e.done=!0,r&&(e=r),e.value=n,e.state=2,Z(t,e,!0))},it=function(t,e,n,r){if(!e.done){e.done=!0,r&&(e=r);try{if(t===n)throw $("Promise can't be resolved itself");var i=K(n);i?j((function(){var r={done:!1};try{i.call(n,nt(it,t,r,e),nt(rt,t,r,e))}catch(n){rt(t,r,n,e)}})):(e.value=n,e.state=1,Z(t,e,!1))}catch(n){rt(t,{done:!1},n,e)}}};H&&(D=function(t){v(this,D,F),g(t),r.call(this);var e=M(this);try{t(nt(it,this,e),nt(rt,this,e))}catch(t){rt(this,e,t)}},(r=function(t){N(this,{type:F,done:!1,notified:!1,parent:!1,reactions:[],rejection:!1,state:0,value:void 0})}).prototype=h(D.prototype,{then:function(t,e){var n=R(this),r=W(x(this,D));return r.ok="function"!=typeof t||t,r.fail="function"==typeof e&&e,r.domain=J?U.domain:void 0,n.parent=!0,n.reactions.push(r),0!=n.state&&Z(this,n,!1),r.promise},catch:function(t){return this.then(void 0,t)}}),i=function(){var t=new r,e=M(t);this.promise=t,this.resolve=nt(it,t,e),this.reject=nt(rt,t,e)},A.f=W=function(t){return t===D||t===o?new i(t):G(t)},c||"function"!=typeof f||(s=f.prototype.then,p(f.prototype,"then",(function(t,e){var n=this;return new D((function(t,e){s.call(n,t,e)})).then(t,e)}),{unsafe:!0}),"function"==typeof L&&a({global:!0,enumerable:!0,forced:!0},{fetch:function(t){return S(D,L.apply(u,arguments))}}))),a({global:!0,wrap:!0,forced:H},{Promise:D}),d(D,F,!1,!0),b(F),o=l.Promise,a({target:F,stat:!0,forced:H},{reject:function(t){var e=W(this);return e.reject.call(void 0,t),e.promise}}),a({target:F,stat:!0,forced:c||H},{resolve:function(t){return S(c&&this===o?D:this,t)}}),a({target:F,stat:!0,forced:X},{all:function(t){var e=this,n=W(e),r=n.resolve,i=n.reject,o=T((function(){var n=g(e.resolve),o=[],s=0,a=1;w(t,(function(t){var c=s++,u=!1;o.push(void 0),a++,n.call(e,t).then((function(t){u||(u=!0,o[c]=t,--a||r(o))}),i)})),--a||r(o)}));return o.error&&i(o.value),n.promise},race:function(t){var e=this,n=W(e),r=n.reject,i=T((function(){var i=g(e.resolve);w(t,(function(t){i.call(e,t).then(n.resolve,r)}))}));return i.error&&r(i.value),n.promise}})},function(t,e,n){var r=n(0),i=n(57).f,o=n(15),s=n(18),a=n(60),c=n(89),u=n(93);t.exports=function(t,e){var n,l,f,p,h,d=t.target,b=t.global,m=t.stat;if(n=b?r:m?r[d]||a(d,{}):(r[d]||{}).prototype)for(l in e){if(p=e[l],f=t.noTargetGet?(h=i(n,l))&&h.value:n[l],!u(b?l:d+(m?".":"#")+l,t.forced)&&void 0!==f){if(typeof p==typeof f)continue;c(p,f)}(t.sham||f&&f.sham)&&o(p,"sham",!0),s(n,l,p,t)}}},function(t,e,n){var r=n(3);t.exports=!r((function(){return 7!=Object.defineProperty({},"a",{get:function(){return 7}}).a}))},function(t,e){t.exports=function(t){return"object"==typeof t?null!==t:"function"==typeof t}},function(t,e,n){var r=n(13),i=n(21),o=n(42);t.exports=r?function(t,e,n){return i.f(t,e,o(1,n))}:function(t,e,n){return t[e]=n,t}},function(t,e){t.exports=function(t){try{return!!t()}catch(t){return!0}}},function(t,e,n){var r=n(22);t.exports=function(t){if(!r(t))throw TypeError(String(t)+" is not an object");return t}},function(t,e,n){var r=n(0),i=n(44),o=n(15),s=n(9),a=n(60),c=n(87),u=n(25),l=u.get,f=u.enforce,p=String(c).split("toString");i("inspectSource",(function(t){return c.call(t)})),(t.exports=function(t,e,n,i){var c=!!i&&!!i.unsafe,u=!!i&&!!i.enumerable,l=!!i&&!!i.noTargetGet;"function"==typeof n&&("string"!=typeof e||s(n,"name")||o(n,"name",e),f(n).source=p.join("string"==typeof e?e:"")),t!==r?(c?!l&&t[e]&&(u=!0):delete t[e],u?t[e]=n:o(t,e,n)):u?t[e]=n:a(e,n)})(Function.prototype,"toString",(function(){return"function"==typeof this&&l(this).source||c.call(this)}))},function(t,e,n){var r=n(28),i=n(39),o=n(75);t.exports=r?function(t,e,n){return i.f(t,e,o(1,n))}:function(t,e,n){return t[e]=n,t}},function(t,e){var n={}.hasOwnProperty;t.exports=function(t,e){return n.call(t,e)}},function(t,e,n){var r=n(13),i=n(86),o=n(4),s=n(58),a=Object.defineProperty;e.f=r?a:function(t,e,n){if(o(t),e=s(e,!0),o(n),i)try{return a(t,e,n)}catch(t){}if("get"in n||"set"in n)throw TypeError("Accessors not supported");return"value"in n&&(t[e]=n.value),t}},function(t,e){t.exports=function(t){return"object"==typeof t?null!==t:"function"==typeof t}},function(t,e){var n={}.toString;t.exports=function(t){return n.call(t).slice(8,-1)}},function(t,e){t.exports=!1},function(t,e,n){var r,i,o,s=n(142),a=n(0),c=n(14),u=n(15),l=n(9),f=n(61),p=n(62),h=a.WeakMap;if(s){var d=new h,b=d.get,m=d.has,g=d.set;r=function(t,e){return g.call(d,t,e),e},i=function(t){return b.call(d,t)||{}},o=function(t){return m.call(d,t)}}else{var v=f("state");p[v]=!0,r=function(t,e){return u(t,v,e),e},i=function(t){return l(t,v)?t[v]:{}},o=function(t){return l(t,v)}}t.exports={set:r,get:i,has:o,enforce:function(t){return o(t)?i(t):r(t,{})},getterFor:function(t){return function(e){var n;if(!c(e)||(n=i(e)).type!==t)throw TypeError("Incompatible receiver, "+t+" required");return n}}}},function(t,e,n){function r(t,e){var n=Object.keys(t);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(t);e&&(r=r.filter((function(e){return Object.getOwnPropertyDescriptor(t,e).enumerable}))),n.push.apply(n,r)}return n}function i(t,e,n){return e in t?Object.defineProperty(t,e,{value:n,enumerable:!0,configurable:!0,writable:!0}):t[e]=n,t}n(11),n(165),(()=>{const e=n(170),{ServerError:o}=n(6),s=n(171),a=n(66);function c(t){if(t.response){const e=`${t.message}. ${JSON.stringify(t.response.data)||""}.`;return new o(e,t.response.status)}const e=`${t.message}.`;return new o(e,0)}const u=new class{constructor(){const u=n(182);u.defaults.withCredentials=!0,u.defaults.xsrfHeaderName="X-CSRFTOKEN",u.defaults.xsrfCookieName="csrftoken";let l=s.get("token");async function f(t=""){const{backendAPI:e}=a;let n=null;try{n=await u.get(`${e}/tasks?page_size=10&${t}`,{proxy:a.proxy})}catch(t){throw c(t)}return n.data.results.count=n.data.count,n.data.results}async function p(t){const{backendAPI:e}=a;try{await u.delete(`${e}/tasks/${t}`)}catch(t){throw c(t)}}l&&(u.defaults.headers.common.Authorization=`Token ${l}`),Object.defineProperties(this,Object.freeze({server:{value:Object.freeze({about:async function(){const{backendAPI:t}=a;let e=null;try{e=await u.get(`${t}/server/about`,{proxy:a.proxy})}catch(t){throw c(t)}return e.data},share:async function(t){const{backendAPI:e}=a;t=encodeURIComponent(t);let n=null;try{n=await u.get(`${e}/server/share?directory=${t}`,{proxy:a.proxy})}catch(t){throw c(t)}return n.data},formats:async function(){const{backendAPI:t}=a;let e=null;try{e=await u.get(`${t}/server/annotation/formats`,{proxy:a.proxy})}catch(t){throw c(t)}return e.data},datasetFormats:async function(){const{backendAPI:t}=a;let e=null;try{e=await u.get(`${t}/server/dataset/formats`,{proxy:a.proxy}),e=JSON.parse(e.data)}catch(t){throw c(t)}return e},exception:async function(t){const{backendAPI:e}=a;try{await u.post(`${e}/server/exception`,JSON.stringify(t),{proxy:a.proxy,headers:{"Content-Type":"application/json"}})}catch(t){throw c(t)}},login:async function(t,e){const n=[`${encodeURIComponent("username")}=${encodeURIComponent(t)}`,`${encodeURIComponent("password")}=${encodeURIComponent(e)}`].join("&").replace(/%20/g,"+");u.defaults.headers.common.Authorization="";let r=null;try{r=await u.post(`${a.backendAPI}/auth/login`,n,{proxy:a.proxy})}catch(t){throw c(t)}if(r.headers["set-cookie"]){const t=r.headers["set-cookie"].join(";");u.defaults.headers.common.Cookie=t}l=r.data.key,s.set("token",l),u.defaults.headers.common.Authorization=`Token ${l}`},logout:async function(){try{await u.post(`${a.backendAPI}/auth/logout`,{proxy:a.proxy})}catch(t){throw c(t)}s.remove("token"),u.defaults.headers.common.Authorization=""},authorized:async function(){try{await t.exports.users.getSelf()}catch(t){if(401===t.code)return!1;throw t}return!0},register:async function(t,e,n,r,i,o){let s=null;try{const c=JSON.stringify({username:t,first_name:e,last_name:n,email:r,password1:i,password2:o});s=await u.post(`${a.backendAPI}/auth/register`,c,{proxy:a.proxy,headers:{"Content-Type":"application/json"}})}catch(t){throw c(t)}return s.data},request:async function(t,e){try{return(await u(function(t){for(var e=1;e{setTimeout((async function s(){try{const a=await u.get(`${i}/tasks/${t}/status`);if(["Queued","Started"].includes(a.data.state))""!==a.data.message&&r(a.data.message),setTimeout(s,1e3);else if("Finished"===a.data.state)e();else if("Failed"===a.data.state){const t="Could not create the task on the server. "+`${a.data.message}.`;n(new o(t,400))}else n(new o(`Unknown task state has been received: ${a.data.state}`,500))}catch(t){n(c(t))}}),1e3)})}(l.data.id)}catch(t){throw await p(l.data.id),t}return(await f(`?id=${l.id}`))[0]},deleteTask:p,exportDataset:async function(t,e){const{backendAPI:n}=a;let r=`${n}/tasks/${t}/dataset?format=${e}`;return new Promise((t,e)=>{setTimeout((async function n(){try{202===(await u.get(`${r}`,{proxy:a.proxy})).status?setTimeout(n,3e3):t(r=`${r}&action=download`)}catch(t){e(c(t))}}))})}}),writable:!1},jobs:{value:Object.freeze({getJob:async function(t){const{backendAPI:e}=a;let n=null;try{n=await u.get(`${e}/jobs/${t}`,{proxy:a.proxy})}catch(t){throw c(t)}return n.data},saveJob:async function(t,e){const{backendAPI:n}=a;try{await u.patch(`${n}/jobs/${t}`,JSON.stringify(e),{proxy:a.proxy,headers:{"Content-Type":"application/json"}})}catch(t){throw c(t)}}}),writable:!1},users:{value:Object.freeze({getUsers:async function(t=null){const{backendAPI:e}=a;let n=null;try{n=null===t?await u.get(`${e}/users?page_size=all`,{proxy:a.proxy}):await u.get(`${e}/users/${t}`,{proxy:a.proxy})}catch(t){throw c(t)}return n.data.results},getSelf:async function(){const{backendAPI:t}=a;let e=null;try{e=await u.get(`${t}/users/self`,{proxy:a.proxy})}catch(t){throw c(t)}return e.data}}),writable:!1},frames:{value:Object.freeze({getData:async function(t,e){const{backendAPI:n}=a;let r=null;try{r=await u.get(`${n}/tasks/${t}/data?type=chunk&number=${e}&quality=compressed`,{proxy:a.proxy,responseType:"arraybuffer"})}catch(t){throw c(t)}return r.data},getMeta:async function(t){const{backendAPI:e}=a;let n=null;try{n=await u.get(`${e}/tasks/${t}/data/meta`,{proxy:a.proxy})}catch(t){throw c(t)}return n.data},getPreview:async function(t){const{backendAPI:e}=a;let n=null;try{n=await u.get(`${e}/tasks/${t}/data?type=preview`,{proxy:a.proxy,responseType:"blob"})}catch(e){const n=e.response?e.response.status:e.code;throw new o(`Could not get preview frame for the task ${t} from the server`,n)}return n.data}}),writable:!1},annotations:{value:Object.freeze({updateAnnotations:async function(t,e,n,r){const{backendAPI:i}=a;let o=null,s=null;"PUT"===r.toUpperCase()?(o=u.put.bind(u),s=`${i}/${t}s/${e}/annotations`):(o=u.patch.bind(u),s=`${i}/${t}s/${e}/annotations?action=${r}`);let l=null;try{l=await o(s,JSON.stringify(n),{proxy:a.proxy,headers:{"Content-Type":"application/json"}})}catch(t){throw c(t)}return l.data},getAnnotations:async function(t,e){const{backendAPI:n}=a;let r=null;try{r=await u.get(`${n}/${t}s/${e}/annotations`,{proxy:a.proxy})}catch(t){throw c(t)}return r.data},dumpAnnotations:async function(t,e,n){const{backendAPI:r}=a;let i=`${r}/tasks/${t}/annotations/${e.replace(/\//g,"_")}?format=${n}`;return new Promise((t,e)=>{setTimeout((async function n(){u.get(`${i}`,{proxy:a.proxy}).then(e=>{202===e.status?setTimeout(n,3e3):t(i=`${i}&action=download`)}).catch(t=>{e(c(t))})}))})},uploadAnnotations:async function(t,n,r,i){const{backendAPI:o}=a;let s=new e;return s.append("annotation_file",r),new Promise((r,l)=>{setTimeout((async function f(){try{202===(await u.put(`${o}/${t}s/${n}/annotations?format=${i}`,s,{proxy:a.proxy})).status?(s=new e,setTimeout(f,3e3)):r()}catch(t){l(c(t))}}))})}}),writable:!1}}))}};t.exports=u})()},function(t,e,n){(function(e){var n=Object.assign?Object.assign:function(t,e,n,r){for(var i=1;i{const e=Object.freeze({DIR:"DIR",REG:"REG"}),n=Object.freeze({ANNOTATION:"annotation",VALIDATION:"validation",COMPLETED:"completed"}),r=Object.freeze({ANNOTATION:"annotation",INTERPOLATION:"interpolation"}),i=Object.freeze({CHECKBOX:"checkbox",RADIO:"radio",SELECT:"select",NUMBER:"number",TEXT:"text"}),o=Object.freeze({TAG:"tag",SHAPE:"shape",TRACK:"track"}),s=Object.freeze({RECTANGLE:"rectangle",POLYGON:"polygon",POLYLINE:"polyline",POINTS:"points"}),a=Object.freeze({ALL:"all",SHAPE:"shape",NONE:"none"});t.exports={ShareFileType:e,TaskStatus:n,TaskMode:r,AttributeType:i,ObjectType:o,ObjectShape:s,VisibleState:a,LogType:{pasteObject:0,changeAttribute:1,dragObject:2,deleteObject:3,pressShortcut:4,resizeObject:5,sendLogs:6,saveJob:7,jumpFrame:8,drawObject:9,changeLabel:10,sendTaskInfo:11,loadJob:12,moveImage:13,zoomImage:14,lockObject:15,mergeObjects:16,copyObject:17,propagateObject:18,undoAction:19,redoAction:20,sendUserActivity:21,sendException:22,changeFrame:23,debugInfo:24,fitImage:25,rotateImage:26}}})()},function(t,e){var n;n=function(){return this}();try{n=n||new Function("return this")()}catch(t){"object"==typeof window&&(n=window)}t.exports=n},function(t,e){t.exports=function(t){if(null==t)throw TypeError("Can't call method on "+t);return t}},function(t,e,n){var r=n(90),i=n(0),o=function(t){return"function"==typeof t?t:void 0};t.exports=function(t,e){return arguments.length<2?o(r[t])||o(i[t]):r[t]&&r[t][e]||i[t]&&i[t][e]}},function(t,e,n){var r=n(21).f,i=n(9),o=n(2)("toStringTag");t.exports=function(t,e,n){t&&!i(t=n?t:t.prototype,o)&&r(t,o,{configurable:!0,value:e})}},function(t,e){t.exports=function(t){if("function"!=typeof t)throw TypeError(String(t)+" is not a function");return t}},function(t,e){t.exports={}},function(t,e,n){n(155),n(5),n(11),n(10),(()=>{const{PluginError:e}=n(6),r=[];class i{static async apiWrapper(t,...n){const r=await i.list();for(const i of r){const r=i.functions.filter(e=>e.callback===t)[0];if(r&&r.enter)try{await r.enter.call(this,i,...n)}catch(t){throw t instanceof e?t:new e(`Exception in plugin ${i.name}: ${t.toString()}`)}}let o=await t.implementation.call(this,...n);for(const i of r){const r=i.functions.filter(e=>e.callback===t)[0];if(r&&r.leave)try{o=await r.leave.call(this,i,o,...n)}catch(t){throw t instanceof e?t:new e(`Exception in plugin ${i.name}: ${t.toString()}`)}}return o}static async register(t){const n=[];if("object"!=typeof t)throw new e(`Plugin should be an object, but got "${typeof t}"`);if(!("name"in t)||"string"!=typeof t.name)throw new e('Plugin must contain a "name" field and it must be a string');if(!("description"in t)||"string"!=typeof t.description)throw new e('Plugin must contain a "description" field and it must be a string');if("functions"in t)throw new e('Plugin must not contain a "functions" field');!function t(e,r){const i={};for(const n in e)Object.prototype.hasOwnProperty.call(e,n)&&("object"==typeof e[n]?Object.prototype.hasOwnProperty.call(r,n)&&t(e[n],r[n]):["enter","leave"].includes(n)&&"function"==typeof r&&(e[n],1)&&(i.callback=r,i[n]=e[n]));Object.keys(i).length&&n.push(i)}(t,{cvat:this}),Object.defineProperty(t,"functions",{value:n,writable:!1}),r.push(t)}static async list(){return r}}t.exports=i})()},function(t,e,n){var r=n(31);t.exports=function(t){return Object(r(t))}},function(t,e){var n={}.toString;t.exports=function(t){return n.call(t).slice(8,-1)}},function(t,e,n){var r=n(28),i=n(120),o=n(17),s=n(121),a=Object.defineProperty;e.f=r?a:function(t,e,n){if(o(t),e=s(e,!0),o(n),i)try{return a(t,e,n)}catch(t){}if("get"in n||"set"in n)throw TypeError("Accessors not supported");return"value"in n&&(t[e]=n.value),t}},function(t,e){t.exports={}},function(t,e){t.exports=function(t){if("function"!=typeof t)throw TypeError(String(t)+" is not a function");return t}},function(t,e){t.exports=function(t,e){return{enumerable:!(1&t),configurable:!(2&t),writable:!(4&t),value:e}}},function(t,e,n){var r=n(85),i=n(31);t.exports=function(t){return r(i(t))}},function(t,e,n){var r=n(24),i=n(141);(t.exports=function(t,e){return i[t]||(i[t]=void 0!==e?e:{})})("versions",[]).push({version:"3.3.3",mode:r?"pure":"global",copyright:"© 2019 Denis Pushkarev (zloirock.ru)"})},function(t,e,n){var r=n(46),i=Math.min;t.exports=function(t){return t>0?i(r(t),9007199254740991):0}},function(t,e){var n=Math.ceil,r=Math.floor;t.exports=function(t){return isNaN(t=+t)?0:(t>0?r:n)(t)}},function(t,e,n){var r=n(34);t.exports=function(t,e,n){if(r(t),void 0===e)return t;switch(n){case 0:return function(){return t.call(e)};case 1:return function(n){return t.call(e,n)};case 2:return function(n,r){return t.call(e,n,r)};case 3:return function(n,r,i){return t.call(e,n,r,i)}}return function(){return t.apply(e,arguments)}}},function(t,e,n){var r=n(150),i=n(35),o=n(2)("iterator");t.exports=function(t){if(null!=t)return t[o]||t["@@iterator"]||i[r(t)]}},function(t,e,n){n(5),n(11),n(200),n(10),n(71),(()=>{const e=n(36),r=n(26),{getFrame:i,getRanges:o,getPreview:s}=n(203),{ArgumentError:a}=n(6),{TaskStatus:c}=n(29),{Label:u}=n(55),l=n(69);function f(t){Object.defineProperties(t,{annotations:Object.freeze({value:{async upload(n,r){return await e.apiWrapper.call(this,t.annotations.upload,n,r)},async save(){return await e.apiWrapper.call(this,t.annotations.save)},async clear(n=!1){return await e.apiWrapper.call(this,t.annotations.clear,n)},async dump(n,r){return await e.apiWrapper.call(this,t.annotations.dump,n,r)},async statistics(){return await e.apiWrapper.call(this,t.annotations.statistics)},async put(n=[]){return await e.apiWrapper.call(this,t.annotations.put,n)},async get(n,r={}){return await e.apiWrapper.call(this,t.annotations.get,n,r)},async search(n,r,i){return await e.apiWrapper.call(this,t.annotations.search,n,r,i)},async select(n,r,i){return await e.apiWrapper.call(this,t.annotations.select,n,r,i)},async hasUnsavedChanges(){return await e.apiWrapper.call(this,t.annotations.hasUnsavedChanges)},async merge(n){return await e.apiWrapper.call(this,t.annotations.merge,n)},async split(n,r){return await e.apiWrapper.call(this,t.annotations.split,n,r)},async group(n,r=!1){return await e.apiWrapper.call(this,t.annotations.group,n,r)},async exportDataset(n){return await e.apiWrapper.call(this,t.annotations.exportDataset,n)}},writable:!0}),frames:Object.freeze({value:{async get(n){return await e.apiWrapper.call(this,t.frames.get,n)},async ranges(){return await e.apiWrapper.call(this,t.frames.ranges)},async preview(){return await e.apiWrapper.call(this,t.frames.preview)}},writable:!0}),logs:Object.freeze({value:{async put(n,r){return await e.apiWrapper.call(this,t.logs.put,n,r)},async save(n){return await e.apiWrapper.call(this,t.logs.save,n)}},writable:!0}),actions:Object.freeze({value:{async undo(n){return await e.apiWrapper.call(this,t.actions.undo,n)},async redo(n){return await e.apiWrapper.call(this,t.actions.redo,n)},async clear(){return await e.apiWrapper.call(this,t.actions.clear)}},writable:!0}),events:Object.freeze({value:{async subscribe(n,r){return await e.apiWrapper.call(this,t.events.subscribe,n,r)},async unsubscribe(n,r=null){return await e.apiWrapper.call(this,t.events.unsubscribe,n,r)}},writable:!0})})}class p{constructor(){}}class h extends p{constructor(t){super();const e={id:void 0,assignee:void 0,status:void 0,start_frame:void 0,stop_frame:void 0,task:void 0};for(const n in e)if(Object.prototype.hasOwnProperty.call(e,n)&&(n in t&&(e[n]=t[n]),void 0===e[n]))throw new a(`Job field "${n}" was not initialized`);Object.defineProperties(this,Object.freeze({id:{get:()=>e.id},assignee:{get:()=>e.assignee,set:t=>{if(null!==t&&!(t instanceof l))throw new a("Value must be a user instance");e.assignee=t}},status:{get:()=>e.status,set:t=>{const n=c;let r=!1;for(const e in n)if(n[e]===t){r=!0;break}if(!r)throw new a("Value must be a value from the enumeration cvat.enums.TaskStatus");e.status=t}},startFrame:{get:()=>e.start_frame},stopFrame:{get:()=>e.stop_frame},task:{get:()=>e.task}})),this.annotations={get:Object.getPrototypeOf(this).annotations.get.bind(this),put:Object.getPrototypeOf(this).annotations.put.bind(this),save:Object.getPrototypeOf(this).annotations.save.bind(this),dump:Object.getPrototypeOf(this).annotations.dump.bind(this),merge:Object.getPrototypeOf(this).annotations.merge.bind(this),split:Object.getPrototypeOf(this).annotations.split.bind(this),group:Object.getPrototypeOf(this).annotations.group.bind(this),clear:Object.getPrototypeOf(this).annotations.clear.bind(this),upload:Object.getPrototypeOf(this).annotations.upload.bind(this),select:Object.getPrototypeOf(this).annotations.select.bind(this),statistics:Object.getPrototypeOf(this).annotations.statistics.bind(this),hasUnsavedChanges:Object.getPrototypeOf(this).annotations.hasUnsavedChanges.bind(this)},this.frames={get:Object.getPrototypeOf(this).frames.get.bind(this),ranges:Object.getPrototypeOf(this).frames.ranges.bind(this),preview:Object.getPrototypeOf(this).frames.preview.bind(this)}}async save(){return await e.apiWrapper.call(this,h.prototype.save)}}class d extends p{constructor(t){super();const e={id:void 0,name:void 0,status:void 0,size:void 0,mode:void 0,owner:void 0,assignee:void 0,created_date:void 0,updated_date:void 0,bug_tracker:void 0,overlap:void 0,segment_size:void 0,z_order:void 0,image_quality:void 0,start_frame:void 0,stop_frame:void 0,frame_filter:void 0,data_chunk_size:void 0,data_compressed_chunk_type:void 0,data_original_chunk_type:void 0,use_zip_chunks:void 0};for(const n in e)Object.prototype.hasOwnProperty.call(e,n)&&n in t&&(e[n]=t[n]);if(e.labels=[],e.jobs=[],e.files=Object.freeze({server_files:[],client_files:[],remote_files:[]}),Array.isArray(t.segments))for(const n of t.segments)if(Array.isArray(n.jobs))for(const t of n.jobs){const r=new h({url:t.url,id:t.id,assignee:t.assignee,status:t.status,start_frame:n.start_frame,stop_frame:n.stop_frame,task:this});e.jobs.push(r)}if(Array.isArray(t.labels))for(const n of t.labels){const t=new u(n);e.labels.push(t)}Object.defineProperties(this,Object.freeze({id:{get:()=>e.id},name:{get:()=>e.name,set:t=>{if(!t.trim().length)throw new a("Value must not be empty");e.name=t}},status:{get:()=>e.status},size:{get:()=>e.size},mode:{get:()=>e.mode},owner:{get:()=>e.owner},assignee:{get:()=>e.assignee,set:t=>{if(null!==t&&!(t instanceof l))throw new a("Value must be a user instance");e.assignee=t}},createdDate:{get:()=>e.created_date},updatedDate:{get:()=>e.updated_date},bugTracker:{get:()=>e.bug_tracker,set:t=>{e.bug_tracker=t}},overlap:{get:()=>e.overlap,set:t=>{if(!Number.isInteger(t)||t<0)throw new a("Value must be a non negative integer");e.overlap=t}},segmentSize:{get:()=>e.segment_size,set:t=>{if(!Number.isInteger(t)||t<0)throw new a("Value must be a positive integer");e.segment_size=t}},zOrder:{get:()=>e.z_order,set:t=>{if("boolean"!=typeof t)throw new a("Value must be a boolean");e.z_order=t}},imageQuality:{get:()=>e.image_quality,set:t=>{if(!Number.isInteger(t)||t<0)throw new a("Value must be a positive integer");e.image_quality=t}},useZipChunks:{get:()=>!0,set:t=>{if("boolean"!=typeof t)throw new a("Value must be a boolean");e.use_zip_chunks=t}},labels:{get:()=>[...e.labels],set:t=>{if(!Array.isArray(t))throw new a("Value must be an array of Labels");for(const e of t)if(!(e instanceof u))throw new a("Each array value must be an instance of Label. "+`${typeof e} was found`);e.labels=[...t]}},jobs:{get:()=>[...e.jobs]},serverFiles:{get:()=>[...e.files.server_files],set:t=>{if(!Array.isArray(t))throw new a(`Value must be an array. But ${typeof t} has been got.`);for(const e of t)if("string"!=typeof e)throw new a(`Array values must be a string. But ${typeof e} has been got.`);Array.prototype.push.apply(e.files.server_files,t)}},clientFiles:{get:()=>[...e.files.client_files],set:t=>{if(!Array.isArray(t))throw new a(`Value must be an array. But ${typeof t} has been got.`);for(const e of t)if(!(e instanceof File))throw new a(`Array values must be a File. But ${e.constructor.name} has been got.`);Array.prototype.push.apply(e.files.client_files,t)}},remoteFiles:{get:()=>[...e.files.remote_files],set:t=>{if(!Array.isArray(t))throw new a(`Value must be an array. But ${typeof t} has been got.`);for(const e of t)if("string"!=typeof e)throw new a(`Array values must be a string. But ${typeof e} has been got.`);Array.prototype.push.apply(e.files.remote_files,t)}},startFrame:{get:()=>e.start_frame,set:t=>{if(!Number.isInteger(t)||t<0)throw new a("Value must be a not negative integer");e.start_frame=t}},stopFrame:{get:()=>e.stop_frame,set:t=>{if(!Number.isInteger(t)||t<0)throw new a("Value must be a not negative integer");e.stop_frame=t}},frameFilter:{get:()=>e.frame_filter,set:t=>{if("string"!=typeof t)throw new a(`Filter value must be a string. But ${typeof t} has been got.`);e.frame_filter=t}},dataChunkSize:{get:()=>e.data_chunk_size,set:t=>{if("number"!=typeof t||t<1)throw new a(`Chunk size value must be a positive number. But value ${t} has been got.`);e.data_chunk_size=t}},dataChunkType:{get:()=>e.data_compressed_chunk_type}})),this.annotations={get:Object.getPrototypeOf(this).annotations.get.bind(this),put:Object.getPrototypeOf(this).annotations.put.bind(this),save:Object.getPrototypeOf(this).annotations.save.bind(this),dump:Object.getPrototypeOf(this).annotations.dump.bind(this),merge:Object.getPrototypeOf(this).annotations.merge.bind(this),split:Object.getPrototypeOf(this).annotations.split.bind(this),group:Object.getPrototypeOf(this).annotations.group.bind(this),clear:Object.getPrototypeOf(this).annotations.clear.bind(this),upload:Object.getPrototypeOf(this).annotations.upload.bind(this),select:Object.getPrototypeOf(this).annotations.select.bind(this),statistics:Object.getPrototypeOf(this).annotations.statistics.bind(this),hasUnsavedChanges:Object.getPrototypeOf(this).annotations.hasUnsavedChanges.bind(this),exportDataset:Object.getPrototypeOf(this).annotations.exportDataset.bind(this)},this.frames={get:Object.getPrototypeOf(this).frames.get.bind(this),ranges:Object.getPrototypeOf(this).frames.ranges.bind(this),preview:Object.getPrototypeOf(this).frames.preview.bind(this)}}async save(t=(()=>{})){return await e.apiWrapper.call(this,d.prototype.save,t)}async delete(){return await e.apiWrapper.call(this,d.prototype.delete)}}t.exports={Job:h,Task:d};const{getAnnotations:b,putAnnotations:m,saveAnnotations:g,hasUnsavedChanges:v,mergeAnnotations:y,splitAnnotations:w,groupAnnotations:k,clearAnnotations:x,selectObject:O,annotationsStatistics:j,uploadAnnotations:S,dumpAnnotations:_,exportDataset:A}=n(247);f(h.prototype),f(d.prototype),h.prototype.save.implementation=async function(){if(this.id){const t={status:this.status,assignee:this.assignee?this.assignee.id:null};return await r.jobs.saveJob(this.id,t),this}throw new a("Can not save job without and id")},h.prototype.frames.get.implementation=async function(t){if(!Number.isInteger(t)||t<0)throw new a(`Frame must be a positive integer. Got: "${t}"`);if(tthis.stopFrame)throw new a(`The frame with number ${t} is out of the job`);return await i(this.task.id,this.task.dataChunkSize,this.task.dataChunkType,this.task.mode,t,this.startFrame,this.stopFrame)},h.prototype.frames.ranges.implementation=async function(){return await o(this.task.id)},h.prototype.annotations.get.implementation=async function(t,e){if(tthis.stopFrame)throw new a(`Frame ${t} does not exist in the job`);return await b(this,t,e)},h.prototype.annotations.save.implementation=async function(t){return await g(this,t)},h.prototype.annotations.merge.implementation=async function(t){return await y(this,t)},h.prototype.annotations.split.implementation=async function(t,e){return await w(this,t,e)},h.prototype.annotations.group.implementation=async function(t,e){return await k(this,t,e)},h.prototype.annotations.hasUnsavedChanges.implementation=function(){return v(this)},h.prototype.annotations.clear.implementation=async function(t){return await x(this,t)},h.prototype.annotations.select.implementation=function(t,e,n){return O(this,t,e,n)},h.prototype.annotations.statistics.implementation=function(){return j(this)},h.prototype.annotations.put.implementation=function(t){return m(this,t)},h.prototype.annotations.upload.implementation=async function(t,e){return await S(this,t,e)},h.prototype.annotations.dump.implementation=async function(t,e){return await _(this,t,e)},d.prototype.save.implementation=async function(t){if(void 0!==this.id){const t={assignee:this.assignee?this.assignee.id:null,name:this.name,bug_tracker:this.bugTracker,z_order:this.zOrder,labels:[...this.labels.map(t=>t.toJSON())]};return await r.tasks.saveTask(this.id,t),this}const e={name:this.name,labels:this.labels.map(t=>t.toJSON()),z_order:Boolean(this.zOrder)};void 0!==this.bugTracker&&(e.bug_tracker=this.bugTracker),void 0!==this.segmentSize&&(e.segment_size=this.segmentSize),void 0!==this.overlap&&(e.overlap=this.overlap);const n={client_files:this.clientFiles,server_files:this.serverFiles,remote_files:this.remoteFiles,image_quality:this.imageQuality,use_zip_chunks:this.useZipChunks};void 0!==this.startFrame&&(n.start_frame=this.startFrame),void 0!==this.stopFrame&&(n.stop_frame=this.stopFrame),void 0!==this.frameFilter&&(n.frame_filter=this.frameFilter);const i=await r.tasks.createTask(e,n,t);return new d(i)},d.prototype.delete.implementation=async function(){return await r.tasks.deleteTask(this.id)},d.prototype.frames.get.implementation=async function(t){if(!Number.isInteger(t)||t<0)throw new a(`Frame must be a positive integer. Got: "${t}"`);if(t>=this.size)throw new a(`The frame with number ${t} is out of the task`);return await i(this.id,this.dataChunkSize,this.dataChunkType,this.mode,t,0,this.size-1)},h.prototype.frames.preview.implementation=async function(){return await s(this.task.id)},d.prototype.frames.ranges.implementation=async function(){return await o(this.id)},d.prototype.frames.preview.implementation=async function(){return await s(this.id)},d.prototype.annotations.get.implementation=async function(t,e){if(!Number.isInteger(t)||t<0)throw new a(`Frame must be a positive integer. Got: "${t}"`);if(t>=this.size)throw new a(`Frame ${t} does not exist in the task`);return await b(this,t,e)},d.prototype.annotations.save.implementation=async function(t){return await g(this,t)},d.prototype.annotations.merge.implementation=async function(t){return await y(this,t)},d.prototype.annotations.split.implementation=async function(t,e){return await w(this,t,e)},d.prototype.annotations.group.implementation=async function(t,e){return await k(this,t,e)},d.prototype.annotations.hasUnsavedChanges.implementation=function(){return v(this)},d.prototype.annotations.clear.implementation=async function(t){return await x(this,t)},d.prototype.annotations.select.implementation=function(t,e,n){return O(this,t,e,n)},d.prototype.annotations.statistics.implementation=function(){return j(this)},d.prototype.annotations.put.implementation=function(t){return m(this,t)},d.prototype.annotations.upload.implementation=async function(t,e){return await S(this,t,e)},d.prototype.annotations.dump.implementation=async function(t,e){return await _(this,t,e)},d.prototype.annotations.exportDataset.implementation=async function(t){return await A(this,t)}})()},function(t,e,n){var r=n(206),i=n(119);t.exports=function(t){return r(i(t))}},function(t,e,n){var r=n(52),i=n(208);(t.exports=function(t,e){return i[t]||(i[t]=void 0!==e?e:{})})("versions",[]).push({version:"3.3.2",mode:r?"pure":"global",copyright:"© 2019 Denis Pushkarev (zloirock.ru)"})},function(t,e){t.exports=!1},function(t,e,n){var r=n(128),i=n(1),o=function(t){return"function"==typeof t?t:void 0};t.exports=function(t,e){return arguments.length<2?o(r[t])||o(i[t]):r[t]&&r[t][e]||i[t]&&i[t][e]}},function(t,e,n){var r=n(1),i=n(51),o=n(19),s=n(20),a=n(73),c=n(129),u=n(79),l=u.get,f=u.enforce,p=String(c).split("toString");i("inspectSource",(function(t){return c.call(t)})),(t.exports=function(t,e,n,i){var c=!!i&&!!i.unsafe,u=!!i&&!!i.enumerable,l=!!i&&!!i.noTargetGet;"function"==typeof n&&("string"!=typeof e||s(n,"name")||o(n,"name",e),f(n).source=p.join("string"==typeof e?e:"")),t!==r?(c?!l&&t[e]&&(u=!0):delete t[e],u?t[e]=n:o(t,e,n)):u?t[e]=n:a(e,n)})(Function.prototype,"toString",(function(){return"function"==typeof this&&l(this).source||c.call(this)}))},function(t,e,n){n(5),n(10),n(71),(()=>{const{AttributeType:e}=n(29),{ArgumentError:r}=n(6);class i{constructor(t){const n={id:void 0,default_value:void 0,input_type:void 0,mutable:void 0,name:void 0,values:void 0};for(const e in n)Object.prototype.hasOwnProperty.call(n,e)&&Object.prototype.hasOwnProperty.call(t,e)&&(Array.isArray(t[e])?n[e]=[...t[e]]:n[e]=t[e]);if(!Object.values(e).includes(n.input_type))throw new r(`Got invalid attribute type ${n.input_type}`);Object.defineProperties(this,Object.freeze({id:{get:()=>n.id},defaultValue:{get:()=>n.default_value},inputType:{get:()=>n.input_type},mutable:{get:()=>n.mutable},name:{get:()=>n.name},values:{get:()=>[...n.values]}}))}toJSON(){const t={name:this.name,mutable:this.mutable,input_type:this.inputType,default_value:this.defaultValue,values:this.values};return void 0!==this.id&&(t.id=this.id),t}}t.exports={Attribute:i,Label:class{constructor(t){const e={id:void 0,name:void 0};for(const n in e)Object.prototype.hasOwnProperty.call(e,n)&&Object.prototype.hasOwnProperty.call(t,n)&&(e[n]=t[n]);if(e.attributes=[],Object.prototype.hasOwnProperty.call(t,"attributes")&&Array.isArray(t.attributes))for(const n of t.attributes)e.attributes.push(new i(n));Object.defineProperties(this,Object.freeze({id:{get:()=>e.id},name:{get:()=>e.name},attributes:{get:()=>[...e.attributes]}}))}toJSON(){const t={name:this.name,attributes:[...this.attributes.map(t=>t.toJSON())]};return void 0!==this.id&&(t.id=this.id),t}}}})()},function(t,e,n){(()=>{const{ArgumentError:e}=n(6);t.exports={isBoolean:function(t){return"boolean"==typeof t},isInteger:function(t){return"number"==typeof t&&Number.isInteger(t)},isEnum:function(t){for(const e in this)if(Object.prototype.hasOwnProperty.call(this,e)&&this[e]===t)return!0;return!1},isString:function(t){return"string"==typeof t},checkFilter:function(t,n){for(const r in t)if(Object.prototype.hasOwnProperty.call(t,r)){if(!(r in n))throw new e(`Unsupported filter property has been recieved: "${r}"`);if(!n[r](t[r]))throw new e(`Received filter property "${r}" is not satisfied for checker`)}},checkObjectType:function(t,n,r,i){if(r){if(typeof n!==r){if("integer"===r&&Number.isInteger(n))return;throw new e(`"${t}" is expected to be "${r}", but "${typeof n}" has been got.`)}}else if(i&&!(n instanceof i)){if(void 0!==n)throw new e(`"${t}" is expected to be ${i.name}, but `+`"${n.constructor.name}" has been got`);throw new e(`"${t}" is expected to be ${i.name}, but "undefined" has been got.`)}}}})()},function(t,e,n){var r=n(13),i=n(84),o=n(42),s=n(43),a=n(58),c=n(9),u=n(86),l=Object.getOwnPropertyDescriptor;e.f=r?l:function(t,e){if(t=s(t),e=a(e,!0),u)try{return l(t,e)}catch(t){}if(c(t,e))return o(!i.f.call(t,e),t[e])}},function(t,e,n){var r=n(14);t.exports=function(t,e){if(!r(t))return t;var n,i;if(e&&"function"==typeof(n=t.toString)&&!r(i=n.call(t)))return i;if("function"==typeof(n=t.valueOf)&&!r(i=n.call(t)))return i;if(!e&&"function"==typeof(n=t.toString)&&!r(i=n.call(t)))return i;throw TypeError("Can't convert object to primitive value")}},function(t,e,n){var r=n(0),i=n(14),o=r.document,s=i(o)&&i(o.createElement);t.exports=function(t){return s?o.createElement(t):{}}},function(t,e,n){var r=n(0),i=n(15);t.exports=function(t,e){try{i(r,t,e)}catch(n){r[t]=e}return e}},function(t,e,n){var r=n(44),i=n(88),o=r("keys");t.exports=function(t){return o[t]||(o[t]=i(t))}},function(t,e){t.exports={}},function(t,e){t.exports=["constructor","hasOwnProperty","isPrototypeOf","propertyIsEnumerable","toLocaleString","toString","valueOf"]},function(t,e){t.exports=function(t,e,n){if(!(t instanceof e))throw TypeError("Incorrect "+(n?n+" ":"")+"invocation");return t}},function(t,e,n){var r=n(32);t.exports=r("navigator","userAgent")||""},function(t,e){t.exports={backendAPI:"http://localhost:7000/api/v1",proxy:!1,taskID:void 0,jobID:void 0,clientID:+Date.now().toString().substr(-6)}},function(t,e,n){var r=n(46),i=n(31),o=function(t){return function(e,n){var o,s,a=String(i(e)),c=r(n),u=a.length;return c<0||c>=u?t?"":void 0:(o=a.charCodeAt(c))<55296||o>56319||c+1===u||(s=a.charCodeAt(c+1))<56320||s>57343?t?a.charAt(c):o:t?a.slice(c,c+2):s-56320+(o-55296<<10)+65536}};t.exports={codeAt:o(!1),charAt:o(!0)}},function(t,e,n){"use strict";(function(e){var r=n(7),i=n(186),o={"Content-Type":"application/x-www-form-urlencoded"};function s(t,e){!r.isUndefined(t)&&r.isUndefined(t["Content-Type"])&&(t["Content-Type"]=e)}var a,c={adapter:("undefined"!=typeof XMLHttpRequest?a=n(113):void 0!==e&&(a=n(113)),a),transformRequest:[function(t,e){return i(e,"Content-Type"),r.isFormData(t)||r.isArrayBuffer(t)||r.isBuffer(t)||r.isStream(t)||r.isFile(t)||r.isBlob(t)?t:r.isArrayBufferView(t)?t.buffer:r.isURLSearchParams(t)?(s(e,"application/x-www-form-urlencoded;charset=utf-8"),t.toString()):r.isObject(t)?(s(e,"application/json;charset=utf-8"),JSON.stringify(t)):t}],transformResponse:[function(t){if("string"==typeof t)try{t=JSON.parse(t)}catch(t){}return t}],timeout:0,xsrfCookieName:"XSRF-TOKEN",xsrfHeaderName:"X-XSRF-TOKEN",maxContentLength:-1,validateStatus:function(t){return t>=200&&t<300}};c.headers={common:{Accept:"application/json, text/plain, */*"}},r.forEach(["delete","get","head"],(function(t){c.headers[t]={}})),r.forEach(["post","put","patch"],(function(t){c.headers[t]=r.merge(o)})),t.exports=c}).call(this,n(112))},function(t,e){t.exports=class{constructor(t){const e={id:null,username:null,email:null,first_name:null,last_name:null,groups:null,last_login:null,date_joined:null,is_staff:null,is_superuser:null,is_active:null};for(const n in e)Object.prototype.hasOwnProperty.call(e,n)&&n in t&&(e[n]=t[n]);Object.defineProperties(this,Object.freeze({id:{get:()=>e.id},username:{get:()=>e.username},email:{get:()=>e.email},firstName:{get:()=>e.first_name},lastName:{get:()=>e.last_name},groups:{get:()=>JSON.parse(JSON.stringify(e.groups))},lastLogin:{get:()=>e.last_login},dateJoined:{get:()=>e.date_joined},isStaff:{get:()=>e.is_staff},isSuperuser:{get:()=>e.is_superuser},isActive:{get:()=>e.is_active}}))}}},function(t,e,n){n(5),n(11),n(10),(()=>{const e=n(36),{ArgumentError:r}=n(6);class i{constructor(t){const e={label:null,attributes:{},points:null,outside:null,occluded:null,keyframe:null,group:null,zOrder:null,lock:null,color:null,visibility:null,clientID:t.clientID,serverID:t.serverID,frame:t.frame,objectType:t.objectType,shapeType:t.shapeType,updateFlags:{}};Object.defineProperty(e.updateFlags,"reset",{value:function(){this.label=!1,this.attributes=!1,this.points=!1,this.outside=!1,this.occluded=!1,this.keyframe=!1,this.group=!1,this.zOrder=!1,this.lock=!1,this.color=!1,this.visibility=!1},writable:!1}),Object.defineProperties(this,Object.freeze({updateFlags:{get:()=>e.updateFlags},frame:{get:()=>e.frame},objectType:{get:()=>e.objectType},shapeType:{get:()=>e.shapeType},clientID:{get:()=>e.clientID},serverID:{get:()=>e.serverID},label:{get:()=>e.label,set:t=>{e.updateFlags.label=!0,e.label=t}},color:{get:()=>e.color,set:t=>{e.updateFlags.color=!0,e.color=t}},visibility:{get:()=>e.visibility,set:t=>{e.updateFlags.visibility=!0,e.visibility=t}},points:{get:()=>e.points,set:t=>{if(!Array.isArray(t))throw new r("Points are expected to be an array "+`but got ${"object"==typeof t?t.constructor.name:typeof t}`);e.updateFlags.points=!0,e.points=[...t]}},group:{get:()=>e.group,set:t=>{e.updateFlags.group=!0,e.group=t}},zOrder:{get:()=>e.zOrder,set:t=>{e.updateFlags.zOrder=!0,e.zOrder=t}},outside:{get:()=>e.outside,set:t=>{e.updateFlags.outside=!0,e.outside=t}},keyframe:{get:()=>e.keyframe,set:t=>{e.updateFlags.keyframe=!0,e.keyframe=t}},occluded:{get:()=>e.occluded,set:t=>{e.updateFlags.occluded=!0,e.occluded=t}},lock:{get:()=>e.lock,set:t=>{e.updateFlags.lock=!0,e.lock=t}},attributes:{get:()=>e.attributes,set:t=>{if("object"!=typeof t)throw new r("Attributes are expected to be an object "+`but got ${"object"==typeof t?t.constructor.name:typeof t}`);for(const n of Object.keys(t))e.updateFlags.attributes=!0,e.attributes[n]=t[n]}}})),this.label=t.label,this.group=t.group,this.zOrder=t.zOrder,this.outside=t.outside,this.keyframe=t.keyframe,this.occluded=t.occluded,this.color=t.color,this.lock=t.lock,this.visibility=t.visibility,void 0!==t.points&&(this.points=t.points),void 0!==t.attributes&&(this.attributes=t.attributes),e.updateFlags.reset()}async save(){return await e.apiWrapper.call(this,i.prototype.save)}async delete(t=!1){return await e.apiWrapper.call(this,i.prototype.delete,t)}async up(){return await e.apiWrapper.call(this,i.prototype.up)}async down(){return await e.apiWrapper.call(this,i.prototype.down)}}i.prototype.save.implementation=async function(){return this.hidden&&this.hidden.save?this.hidden.save():this},i.prototype.delete.implementation=async function(t){return!(!this.hidden||!this.hidden.delete)&&this.hidden.delete(t)},i.prototype.up.implementation=async function(){return!(!this.hidden||!this.hidden.up)&&this.hidden.up()},i.prototype.down.implementation=async function(){return!(!this.hidden||!this.hidden.down)&&this.hidden.down()},t.exports=i})()},function(t,e,n){"use strict";n(12)({target:"URL",proto:!0,enumerable:!0},{toJSON:function(){return URL.prototype.toString.call(this)}})},function(t,e,n){"use strict";var r=n(50),i=n(207),o=n(40),s=n(79),a=n(215),c=s.set,u=s.getterFor("Array Iterator");t.exports=a(Array,"Array",(function(t,e){c(this,{type:"Array Iterator",target:r(t),index:0,kind:e})}),(function(){var t=u(this),e=t.target,n=t.kind,r=t.index++;return!e||r>=e.length?(t.target=void 0,{value:void 0,done:!0}):"keys"==n?{value:r,done:!1}:"values"==n?{value:e[r],done:!1}:{value:[r,e[r]],done:!1}}),"values"),o.Arguments=o.Array,i("keys"),i("values"),i("entries")},function(t,e,n){var r=n(1),i=n(19);t.exports=function(t,e){try{i(r,t,e)}catch(n){r[t]=e}return e}},function(t,e,n){var r=n(1),i=n(22),o=r.document,s=i(o)&&i(o.createElement);t.exports=function(t){return s?o.createElement(t):{}}},function(t,e){t.exports=function(t,e){return{enumerable:!(1&t),configurable:!(2&t),writable:!(4&t),value:e}}},function(t,e){t.exports={}},function(t,e){t.exports=["constructor","hasOwnProperty","isPrototypeOf","propertyIsEnumerable","toLocaleString","toString","valueOf"]},function(t,e,n){var r=n(51),i=n(122),o=r("keys");t.exports=function(t){return o[t]||(o[t]=i(t))}},function(t,e,n){var r,i,o,s=n(214),a=n(1),c=n(22),u=n(19),l=n(20),f=n(78),p=n(76),h=a.WeakMap;if(s){var d=new h,b=d.get,m=d.has,g=d.set;r=function(t,e){return g.call(d,t,e),e},i=function(t){return b.call(d,t)||{}},o=function(t){return m.call(d,t)}}else{var v=f("state");p[v]=!0,r=function(t,e){return u(t,v,e),e},i=function(t){return l(t,v)?t[v]:{}},o=function(t){return l(t,v)}}t.exports={set:r,get:i,has:o,enforce:function(t){return o(t)?i(t):r(t,{})},getterFor:function(t){return function(e){var n;if(!c(e)||(n=i(e)).type!==t)throw TypeError("Incompatible receiver, "+t+" required");return n}}}},function(t,e,n){var r=n(1),i=n(81).f,o=n(19),s=n(54),a=n(73),c=n(217),u=n(130);t.exports=function(t,e){var n,l,f,p,h,d=t.target,b=t.global,m=t.stat;if(n=b?r:m?r[d]||a(d,{}):(r[d]||{}).prototype)for(l in e){if(p=e[l],f=t.noTargetGet?(h=i(n,l))&&h.value:n[l],!u(b?l:d+(m?".":"#")+l,t.forced)&&void 0!==f){if(typeof p==typeof f)continue;c(p,f)}(t.sham||f&&f.sham)&&o(p,"sham",!0),s(n,l,p,t)}}},function(t,e,n){var r=n(28),i=n(216),o=n(75),s=n(50),a=n(121),c=n(20),u=n(120),l=Object.getOwnPropertyDescriptor;e.f=r?l:function(t,e){if(t=s(t),e=a(e,!0),u)try{return l(t,e)}catch(t){}if(c(t,e))return o(!i.f.call(t,e),t[e])}},function(t,e,n){var r=n(39).f,i=n(20),o=n(8)("toStringTag");t.exports=function(t,e,n){t&&!i(t=n?t:t.prototype,o)&&r(t,o,{configurable:!0,value:e})}},function(t,e,n){var r=n(53);t.exports=r("navigator","userAgent")||""},function(t,e,n){"use strict";var r={}.propertyIsEnumerable,i=Object.getOwnPropertyDescriptor,o=i&&!r.call({1:2},1);e.f=o?function(t){var e=i(this,t);return!!e&&e.enumerable}:r},function(t,e,n){var r=n(3),i=n(23),o="".split;t.exports=r((function(){return!Object("z").propertyIsEnumerable(0)}))?function(t){return"String"==i(t)?o.call(t,""):Object(t)}:Object},function(t,e,n){var r=n(13),i=n(3),o=n(59);t.exports=!r&&!i((function(){return 7!=Object.defineProperty(o("div"),"a",{get:function(){return 7}}).a}))},function(t,e,n){var r=n(44);t.exports=r("native-function-to-string",Function.toString)},function(t,e){var n=0,r=Math.random();t.exports=function(t){return"Symbol("+String(void 0===t?"":t)+")_"+(++n+r).toString(36)}},function(t,e,n){var r=n(9),i=n(143),o=n(57),s=n(21);t.exports=function(t,e){for(var n=i(e),a=s.f,c=o.f,u=0;uc;)r(a,n=e[c++])&&(~o(u,n)||u.push(n));return u}},function(t,e){e.f=Object.getOwnPropertySymbols},function(t,e,n){var r=n(3),i=/#|\.prototype\./,o=function(t,e){var n=a[s(t)];return n==u||n!=c&&("function"==typeof e?r(e):!!e)},s=o.normalize=function(t){return String(t).replace(i,".").toLowerCase()},a=o.data={},c=o.NATIVE="N",u=o.POLYFILL="P";t.exports=o},function(t,e,n){var r=n(0);t.exports=r.Promise},function(t,e,n){var r=n(18);t.exports=function(t,e,n){for(var i in e)r(t,i,e[i],n);return t}},function(t,e,n){var r=n(2),i=n(35),o=r("iterator"),s=Array.prototype;t.exports=function(t){return void 0!==t&&(i.Array===t||s[o]===t)}},function(t,e,n){var r=n(4);t.exports=function(t,e,n,i){try{return i?e(r(n)[0],n[1]):e(n)}catch(e){var o=t.return;throw void 0!==o&&r(o.call(t)),e}}},function(t,e,n){var r=n(4),i=n(34),o=n(2)("species");t.exports=function(t,e){var n,s=r(t).constructor;return void 0===s||null==(n=r(s)[o])?e:i(n)}},function(t,e,n){var r,i,o,s=n(0),a=n(3),c=n(23),u=n(47),l=n(100),f=n(59),p=n(65),h=s.location,d=s.setImmediate,b=s.clearImmediate,m=s.process,g=s.MessageChannel,v=s.Dispatch,y=0,w={},k=function(t){if(w.hasOwnProperty(t)){var e=w[t];delete w[t],e()}},x=function(t){return function(){k(t)}},O=function(t){k(t.data)},j=function(t){s.postMessage(t+"",h.protocol+"//"+h.host)};d&&b||(d=function(t){for(var e=[],n=1;arguments.length>n;)e.push(arguments[n++]);return w[++y]=function(){("function"==typeof t?t:Function(t)).apply(void 0,e)},r(y),y},b=function(t){delete w[t]},"process"==c(m)?r=function(t){m.nextTick(x(t))}:v&&v.now?r=function(t){v.now(x(t))}:g&&!/(iphone|ipod|ipad).*applewebkit/i.test(p)?(o=(i=new g).port2,i.port1.onmessage=O,r=u(o.postMessage,o,1)):!s.addEventListener||"function"!=typeof postMessage||s.importScripts||a(j)?r="onreadystatechange"in f("script")?function(t){l.appendChild(f("script")).onreadystatechange=function(){l.removeChild(this),k(t)}}:function(t){setTimeout(x(t),0)}:(r=j,s.addEventListener("message",O,!1))),t.exports={set:d,clear:b}},function(t,e,n){var r=n(32);t.exports=r("document","documentElement")},function(t,e,n){var r=n(4),i=n(14),o=n(102);t.exports=function(t,e){if(r(t),i(e)&&e.constructor===t)return e;var n=o.f(t);return(0,n.resolve)(e),n.promise}},function(t,e,n){"use strict";var r=n(34),i=function(t){var e,n;this.promise=new t((function(t,r){if(void 0!==e||void 0!==n)throw TypeError("Bad Promise constructor");e=t,n=r})),this.resolve=r(e),this.reject=r(n)};t.exports.f=function(t){return new i(t)}},function(t,e,n){var r=n(4),i=n(104),o=n(63),s=n(62),a=n(100),c=n(59),u=n(61)("IE_PROTO"),l=function(){},f=function(){var t,e=c("iframe"),n=o.length;for(e.style.display="none",a.appendChild(e),e.src=String("javascript:"),(t=e.contentWindow.document).open(),t.write("