Browse Source

first usable

master
Rob Colbert 2 years ago
parent
commit
c3d0b6bfa9
  1. 3
      .gitignore
  2. 18
      .vscode/launch.json
  3. 8
      README.md
  4. 6
      app/views/layout.pug
  5. 15
      app/views/multiplayer-canvas.pug
  6. 219
      canvas-io-server.js
  7. 153
      client/js/canvas-app.js
  8. 134
      client/js/canvas-socket.js
  9. 29
      client/less/lib/color-palette.less
  10. 2
      client/less/lib/container.less
  11. 1
      client/less/lib/multiplayer-canvas.less
  12. 1
      client/less/style.less
  13. 12
      package.json
  14. 41
      webapp.js
  15. 7
      webpack.config.js
  16. 661
      yarn.lock

3
.gitignore

@ -1,2 +1,3 @@
node_modules
.env
images
.env

18
.vscode/launch.json

@ -0,0 +1,18 @@
{
// Use IntelliSense to learn about possible attributes.
// Hover to view descriptions of existing attributes.
// For more information, visit: https://go.microsoft.com/fwlink/?linkid=830387
"version": "0.2.0",
"configurations": [
{
"type": "pwa-node",
"request": "launch",
"name": "webapp",
"skipFiles": [
"<node_internals>/**"
],
"program": "${workspaceFolder}/webapp.js",
"console": "integratedTerminal"
}
]
}

8
README.md

@ -6,4 +6,10 @@ An HTML5 &lt;canvas&gt; to which multiple people can connect over Socket.io and
```sh
yarn start
```
```
## How It Works
A connect token is generated when the multiplayer canvas view is loaded, and this becomes the session's ID. The client must present this token when connecting to the canvas IO server, and it must match what was stored in Redis, not be expired, not already be claimed, etc.
If accepted, the socket session then stores the connect token to be used as a unique key that identifies that client session. Rate limits are implemented against this key using [rate-limiter-flexible](https://www.npmjs.com/package/rate-limiter-flexible), such as how often a `setpixel` command can be received and processed.

6
app/views/layout.pug

@ -23,4 +23,8 @@ html(lang="en")
block content-view
script(src=`${appModuleUrl}?v=${pkg.version}`)
script(src='/socket.io/socket.io.js')
script(async, src=`${appModuleUrl}?v=${pkg.version}`, type="module")
block viewjs

15
app/views/multiplayer-canvas.pug

@ -1,4 +1,17 @@
extends layout
block content-view
.margin
canvas(id="multiplayer-canvas", width="32", height="32").multiplayer-canvas
p This is the NiceCrew Multiplayer Canvas project. People are welcomed to stop by and set up to 10 pixels per minute. Work in teams to control a section of the image.
.margin
canvas(id="multiplayer-canvas", width="32", height="32").multiplayer-canvas
.margin
.color-palette
block viewjs
script.
window.dtp = window.dtp || { };
window.dtp.imageId = !{JSON.stringify(imageId || 'test-image')};
window.dtp.connectToken = !{JSON.stringify(connectToken)};

219
canvas-io-server.js

@ -0,0 +1,219 @@
// canvas-io-server.js
// Copyright (C) 2022 Rob Colbert @[email protected]
// License: Apache-2.0
'use strict';
import path, { dirname } from 'path';
import { fileURLToPath } from 'url';
const __dirname = dirname(fileURLToPath(import.meta.url)); // jshint ignore:line
import fs from 'fs';
import { Server } from 'socket.io';
import { createAdapter } from '@socket.io/redis-adapter';
import { RateLimiterRedis } from 'rate-limiter-flexible';
import Jimp from 'jimp';
import { CronJob } from 'cron';
class CanvasImage {
get dirty ( ) { return this._dirty; }
constructor (id, width, height) {
this.id = id;
this.image = new Jimp(width, height, 0xffffffff);
this._dirty = false;
}
setPixel (pixel) {
let idx = ((pixel.y * this.image.bitmap.width) + pixel.x) * 4;
this.image.bitmap.data[idx++] = pixel.r;
this.image.bitmap.data[idx++] = pixel.g;
this.image.bitmap.data[idx++] = pixel.b;
this._dirty = true;
}
async save (filename) {
await this.image.deflateLevel(9).writeAsync(filename);
this._dirty = false;
}
}
export default class CanvasIoServer {
constructor (app) {
this.app = app;
this.limiters = {
getImageData: new RateLimiterRedis({ storeClient: this.app.redis, points: 10, duration: 60 }),
setPixel: new RateLimiterRedis({ storeClient: this.app.redis, points: 10, duration: 60 }),
};
this.images = { };
console.log('creating test image', { width: 32, height: 32 });
this.images['test-image'] = new CanvasImage('test-image', 32, 32);
this.images['test-image'].setPixel({ x: 5, y: 5, r: 255, g: 0, b: 0 });
}
async start ( ) {
const pubClient = this.app.redis.duplicate();
pubClient.on('error', this.onRedisError.bind(this));
const subClient = this.app.redis.duplicate();
subClient.on('error', this.onRedisError.bind(this));
const transports = ['websocket'/*, 'polling'*/];
const adapter = createAdapter(pubClient, subClient);
this.io = new Server(this.app.httpServer, { adapter, transports });
this.io.on('connection', this.onSocketConnect.bind(this));
console.log('starting image backup cron');
this.backupCron = new CronJob(
'*/15 * * * * *',
this.onImageBackup.bind(this),
null,
true,
'America/New_York',
);
console.log('CanvasIoServer ready');
}
async onRedisError (error) {
console.log('Redis error', error);
}
async onSocketConnect (socket) {
const CONNECT_TOKEN = socket.handshake.auth.token;
console.log('socket connection', { sid: socket.id, token: CONNECT_TOKEN });
const TOKEN_KEY = `connect-token:${CONNECT_TOKEN}`;
const tokenData = await this.app.redis.get(TOKEN_KEY);
if (!tokenData) {
console.log('rejecting invalid socket token', {
sid: socket.sid,
handshake: socket.handshake,
});
socket.close();
return;
}
const token = JSON.parse(tokenData);
const IMAGE_ID = token.imageId;
/*
* Remove the connect token to prevent multiple connects
*/
await this.app.redis.del(TOKEN_KEY);
const session = { CONNECT_TOKEN, IMAGE_ID, socket };
session.onSocketDisconnect = this.onSocketDisconnect.bind(this, session);
session.onJoinChannel = this.onJoinChannel.bind(this, session);
session.onLeaveChannel = this.onLeaveChannel.bind(this, session);
session.onGetImageData = this.onGetImageData.bind(this, session);
session.onSetPixel = this.onSetPixel.bind(this, session);
socket.on('disconnect', session.onSocketDisconnect);
socket.on('join', session.onJoinChannel);
socket.on('leave', session.onLeaveChannel);
socket.on('getimagedata', session.onGetImageData);
socket.on('setpixel', session.onSetPixel);
socket.emit('authenticated', { message: 'token verified' });
}
async onSocketDisconnect (session, reason) {
const { CONNECT_TOKEN, IMAGE_ID, socket } = session;
console.log('socket disconnect', { sid: socket.id, CONNECT_TOKEN, IMAGE_ID, reason });
session.socket.off('disconnect', session.onSocketDisconnect);
session.socket.off('join', session.onJoinChannel);
session.socket.off('leave', session.onLeaveChannel);
}
async onJoinChannel (session, message) {
const { channelId } = message;
console.log('socket joins channel', { sid: session.socket.id, token: session.CONNECT_TOKEN, channelId });
session.socket.join(channelId);
session.socket.emit('join-result', { channelId });
}
async onLeaveChannel (session, message) {
const { channelId } = message;
console.log('socket leaves channel', { sid: session.socket.id, token: session.CONNECT_TOKEN, channelId });
session.socket.leave(channelId);
}
async onGetImageData (session) {
const { CONNECT_TOKEN, IMAGE_ID, socket } = session;
console.log('onGetImageData', { sid: session.socket.id, CONNECT_TOKEN, IMAGE_ID });
try {
const limiterKey = `${IMAGE_ID}:${CONNECT_TOKEN}`;
await this.limiters.getImageData.consume(limiterKey, 1);
} catch (error) {
console.log('onGetImageData rate limit exceeded', { CONNECT_TOKEN, IMAGE_ID });
socket.emit('canvas-error', { command: 'getimagedata', message: error.message });
return;
}
const image = this.images[IMAGE_ID];
if (!image) {
socket.emit('canvas-error', { message: 'image not found' });
return;
}
session.socket.emit('canvas-image-data', {
width: image.image.bitmap.width,
height: image.image.bitmap.height,
data: Buffer.from(image.image.bitmap.data),
});
}
async onSetPixel (session, message) {
const { CONNECT_TOKEN, IMAGE_ID, socket } = session;
try {
const limiterKey = `${IMAGE_ID}:${CONNECT_TOKEN}`;
await this.limiters.setPixel.consume(limiterKey, 1);
} catch (error) {
console.log('failed to setpixel', error);
socket.emit('canvas-error', { command: 'setpixel', error: JSON.stringify(error) });
return;
}
const image = this.images[IMAGE_ID];
if (!image) {
socket.emit('canvas-error', { command: 'setpixel', message: 'Image does not exist' });
return;
}
console.log('onSetPixel', IMAGE_ID, message);
image.setPixel(message);
this.io.in(IMAGE_ID).emit('canvas-setpixel', {
x: message.x,
y: message.y,
r: message.r,
g: message.g,
b: message.b,
});
}
async onImageBackup ( ) {
for (const imageId in this.images) {
const image = this.images[imageId];
const imageIdPrefix = image.id.slice(0, 4);
const imagePath = path.join(__dirname, 'images', imageIdPrefix);
await fs.promises.mkdir(imagePath, { recursive: true });
await image.save(path.join(imagePath, `${image.id}.png`));
}
}
}

153
client/js/canvas-app.js

@ -4,7 +4,7 @@
'use strict';
console.log('loaded');
window.dtp = window.dtp || { };
const IMAGE_W = 32;
const IMAGE_H = 32;
@ -13,6 +13,10 @@ const DTP_COMPONENT_NAME = 'canvas-app';
import '../less/style.less';
import { NiceAudio, NiceLog } from 'dtp-nice-game';
import CanvasSocket from './canvas-socket.js';
import Color from 'color';
import ColorConvert from 'color-convert';
export default class CanvasApp {
@ -20,11 +24,116 @@ export default class CanvasApp {
this.audio = new NiceAudio();
this.log = new NiceLog(DTP_COMPONENT_NAME);
this.log.info('Canvas app online');
this.log.info('init', 'Canvas app online');
this.initCanvas();
this.initColorPalette();
document.addEventListener('mpcvs:socket-connected', this.onSocketConnected.bind(this));
this.socket = new CanvasSocket();
this.socket.connect({
withRetry: true,
withError: false,
connectToken: window.dtp.connectToken,
});
}
async onSocketConnected ( ) {
console.log('APP: socket connected');
const { socket } = this.socket;
socket.on('canvas-error', this.onCanvasError.bind(this));
socket.on('canvas-image-data', this.onCanvasImageData.bind(this));
socket.on('canvas-setpixel', this.onCanvasSetPixel.bind(this));
socket.emit('getimagedata');
}
async onCanvasError (message) {
console.log('onCanvasError', { message });
}
async onCanvasImageData (message) {
console.log('onCanvasImageData', { message });
this.imageData = new ImageData( // jshint ignore:line
new Uint8ClampedArray(message.data),
message.width,
message.height,
);
this.ctx.putImageData(this.imageData, 0, 0);
}
async onCanvasSetPixel (message) {
console.log('onCanvasSetPixel', message);
this.setPixel(message);
this.ctx.putImageData(this.imageData, 0, 0);
}
initCanvas ( ) {
this.canvas = document.querySelector('canvas');
this.canvas.onclick = this.onCanvasClick.bind(this);
this.ctx = this.canvas.getContext('2d');
this.imageData = this.ctx.createImageData(32, 32);
}
initColorPalette ( ) {
const setDrawColor = this.setDrawColor.bind(this);
const palette = document.querySelector('.color-palette');
const colors = [ ];
for (let h = 0; h <= 360; h += 36) {
for (let v = 25; v <= 75; v += 25) {
for (let s = 25; s <= 100; s += 25) {
colors.push('#' + ColorConvert.hsl.hex(h, s, v));
}
}
}
// for (let r = 0; r <= 255; r+= 64) {
// for (let g = 0; g <= 255; g += 64) {
// for (let b = 0; b <= 255; b += 64) {
// const c = Color.hsl() Color({ r, g, b });
// colors.push(c.hex());
// }
// }
// }
colors.push("#ffffff"); // white
colors.push("#000000"); // black
colors.push("#ff0000"); // red
colors.push("#00ff00"); // green
colors.push("#0000ff"); // blue
this.colorButtons = [ ];
let idx = 0;
colors.forEach((color) => {
const button = document.createElement('button');
button.classList.add('color-select-btn');
button.setAttribute('data-idx', idx++);
button.setAttribute('data-color', color);
button.onclick = setDrawColor;
button.style.backgroundColor = color;
this.colorButtons.push(button);
palette.appendChild(button);
});
this.colorButtons[0].click();
}
setDrawColor (event) {
const target = event.target || event.currentTarget;
const color = target.getAttribute('data-color');
this.log.info('setDrawColor', 'setting draw color', { color });
this.currentColor = Color(color);
this.colorButtons.forEach((button) => {
button.classList.remove('active');
});
target.classList.add('active');
}
updatePixels (message) {
@ -33,18 +142,42 @@ export default class CanvasApp {
(pixel.x > (IMAGE_W - 1)) ||
(pixel.y < 0) ||
(pixel.y > (IMAGE_H - 1))) {
this.log.info('rejecting invalid pixel update', pixel);
this.log.info('updatePixels', 'rejecting invalid pixel update', pixel);
return;
}
let pixelIdx = (pixel.y * IMAGE_W * 4) + (pixel.x * 4);
this.imageData[pixelIdx++] = pixel.r;
this.imageData[pixelIdx++] = pixel.g;
this.imageData[pixelIdx++] = pixel.b;
}
this.ctx.putImageData(this.imageData, 0, 0);
}
setPixel (pixel) {
let pixelIdx = ((pixel.y * IMAGE_W ) + pixel.x) * 4;
this.log.info('updatePixels', 'updating pixel', { pixelIdx, pixel });
this.imageData.data[pixelIdx++] = pixel.r;
this.imageData.data[pixelIdx++] = pixel.g;
this.imageData.data[pixelIdx++] = pixel.b;
this.imageData.data[pixelIdx++] = 255;
}
async onCanvasClick (event) {
const cellPixels = this.canvas.clientWidth / 32;
if (cellPixels === 0) {
return; // prevent a divide by zero
}
const x = Math.floor(event.offsetX / cellPixels);
const y = Math.floor(event.offsetY / cellPixels);
console.log(x, y, this.currentColor.hex());
const pixel = {
x, y,
r: this.currentColor.red(),
g: this.currentColor.green(),
b: this.currentColor.blue(),
};
this.socket.socket.emit('setpixel', pixel);
}
}
window.addEventListener('load', async ( ) => {
window.app = new CanvasApp();
console.log('running');
window.dtp.app = new CanvasApp();
});

134
client/js/canvas-socket.js

@ -0,0 +1,134 @@
// canvas-socket.js
// Copyright (C) 2022 Rob Colbert @[email protected]
// License: Apache-2.0
'use strict';
window.dtp = window.dtp || { };
export default class CanvasSocket {
constructor ( ) {
this.isConnected = false;
this.isAuthenticated = false;
this.joinedChannels = { };
}
async connect (options) {
options = Object.assign({
withRetry: true,
withError: false,
}, options);
try {
console.log('connecting to Multiplayer Canvas server');
this.socket = io('/', {
transports: ['websocket'],
reconnection: false,
auth: {
token: options.connectToken,
},
});
this.socket.on('connect', this.onSocketConnect.bind(this));
this.socket.on('authenticated', this.onSocketAuthenticated.bind(this));
this.socket.on('join-result', this.onJoinResult.bind(this));
this.socket.on('disconnect', this.onSocketDisconnect.bind(this));
} catch (error) {
console.log('connect', 'failed to connect', { error });
if (options.withRetry) {
this.retryConnect();
}
if (options.withError) {
throw error;
}
}
}
async onSocketConnect ( ) {
console.log('onSocketConnect', 'WebSocket connected');
this.isConnected = true;
if (this.disconnectDialog) {
this.disconnectDialog.hide();
delete this.disconnectDialog;
}
}
async onSocketDisconnect (reason) {
this.isConnected = false;
this.socket.close();
delete this.socket;
if (!this.isAuthenticated) {
UIkit.modal.alert(`Failed to authenticate WebSocket session. Please log out, log back in, and try again.`);
return;
}
const REASONS = {
'io server disconnect': 'The server closed the connection',
'io client disconnect': 'The client closed the connection',
'ping timeout': 'The server is unreachable',
'transport close': 'Connection was lost or network changed',
'transport error': 'Server communication error, please try again.',
};
console.log('onSocketDisconnect', 'WebSocket disconnected', { reason });
const modal = UIkit.modal.alert(`Disconnected: ${REASONS[reason]}`);
this.disconnectDialog = modal.dialog;
UIkit.util.on(modal.dialog.$el, 'hidden', ( ) => {
console.log('onSocketDisconnect', 'disconnect dialog closed');
delete this.disconnectDialog;
});
this.retryConnect();
}
retryConnect ( ) {
if (this.retryTimeout) {
return; // a retry is already in progress
}
this.retryTimeout = setTimeout(async ( ) => {
delete this.retryTimeout;
await this.connect();
}, 2000);
}
async onSocketAuthenticated (message) {
console.log('onSocketAuthenticated', message.message, { user: message.user });
this.isAuthenticated = true;
this.user = message.user;
this.joinChannel(window.dtp.imageId, 'image');
document.dispatchEvent(new Event('mpcvs:socket-connected'));
}
async joinChannel (channelId, channelType) {
console.log('joinChannel', 'joining channel', { channelId, channelType });
this.socket.emit('join', { channelId, channelType });
}
async isChannelJoined (channelId) {
return !!this.joinedChannels[channelId];
}
async onJoinResult (message) {
console.log('onJoinResult', 'channel joined', { message });
this.joinedChannels[message.channelId] = message;
}
async leaveChannel (channelId) {
console.log('leaveChannel', 'leaving channel', { channelId });
this.socket.emit('leave', { channelId });
if (this.joinedChannels[channelId]) {
delete this.joinedChannels[channelId];
}
}
async sendUserChat (channelId, content) {
console.log('sendUserChat', 'sending message to channel', { channelId, content });
this.socket.emit('user-chat', { channelId, content });
}
}

29
client/less/lib/color-palette.less

@ -0,0 +1,29 @@
@keyframes active-button {
0% { border: solid 2px #008000; }
50% { border: solid 2px #00ff00; }
100% { border: solid 2px #008000; }
}
.color-palette {
display: flex;
flex-wrap: wrap;
width: 100%;
justify-content: center;
button.color-select-btn {
display: inline-block;
box-sizing: border-box;
width: 32px;
height: 32px;
margin: 4px;
border: solid 2px transparent;
outline: none;
&.active {
animation-name: active-button;
animation-duration: 1s;
animation-iteration-count: infinite;
}
}
}

2
client/less/lib/container.less

@ -6,6 +6,6 @@
.container {
width: 100%;
max-width: 1280px;
max-width: 640px;
margin: 0 auto;
}

1
client/less/lib/multiplayer-canvas.less

@ -13,4 +13,5 @@ canvas.multiplayer-canvas {
height: auto;
border: solid 1px white;
image-rendering: pixelated;
}

1
client/less/style.less

@ -8,6 +8,7 @@
@import 'lib/main.less';
@import 'lib/brand-link.less';
@import 'lib/color-palette.less';
@import 'lib/container.less';
@import 'lib/multiplayer-canvas.less';
@import 'lib/navbar.less';

12
package.json

@ -2,22 +2,30 @@
"name": "multiplayer-canvas",
"version": "0.1.0",
"description": "Interactive multi-user HTML5 <canvas> delivering online pixel war goodness.",
"main": "multiplayer-canvas.js",
"main": "webapp.js",
"repository": "https://git.digitaltelepresence.com/rob/multiplayer-canvas.git",
"type": "module",
"scripts": {
"develop": "node multiplayer-canvas.js",
"develop": "node webapp.js",
"bundle": "NODE_ENV=production yarn webpack --config webpack.config.js"
},
"author": "Rob Colbert",
"license": "Apache-2.0",
"private": false,
"dependencies": {
"@socket.io/redis-adapter": "^7.1.0",
"color": "^4.2.1",
"color-convert": "^2.0.1",
"cron": "^1.8.2",
"dotenv": "^16.0.0",
"dtp-nice-game": "https://git.digitaltelepresence.com/digital-telepresence/dtp-nice-game.git",
"express": "^4.17.3",
"express-winston": "^4.2.0",
"ioredis": "^5.0.3",
"jimp": "^0.16.1",
"pug": "^3.0.2",
"rate-limiter-flexible": "^2.3.6",
"uuid": "^8.3.2",
"winston": "^3.7.1"
},
"devDependencies": {

41
multiplayer-canvas.js → webapp.js

@ -1,4 +1,4 @@
// multiplayer-canvas.js
// webapp.js
// Copyright (C) 2022 Rob Colbert @[email protected]
// License: Apache-2.0
@ -15,6 +15,11 @@ const require = createRequire(import.meta.url); // jshint ignore:line
import express from 'express';
import { v4 as uuidv4 } from 'uuid';
import Redis from 'ioredis';
import CanvasIoServer from './canvas-io-server.js';
import winston from 'winston';
import expressWinston from 'express-winston';
@ -80,17 +85,49 @@ class MultiplayerCanvasApp {
}
async start ( ) {
this.redis = new Redis({
host: process.env.REDIS_HOST,
port: process.env.REDIS_PORT,
password: process.env.REDIS_PASSWORD,
key: process.env.REDIS_KEY_PREFIX || 'dtp',
});
this.redis.on('error', this.onRedisError.bind(this));
console.log('start', 'creating HTTP server');
this.httpServer = require('http').createServer(this.app);
this.io = new CanvasIoServer(this);
await this.io.start();
return new Promise((resolve, reject) => {
this.app.listen(3000, (err) => {
this.httpServer.listen(3000, (err) => {
if (err) {
return reject(err);
}
console.log('start', `${APP_CONFIG.pkg.name} online`);
resolve();
});
});
}
async onRedisError (error) {
console.log('Redis error', error);
}
async getCanvasView (req, res) {
/*
* Create a socket connect token and assign it to res.locals for use in the
* view. Store it in Redis for 30 seconds.
*/
res.locals.connectToken = uuidv4();
await this.redis.setex(`connect-token:${res.locals.connectToken}`, 30, JSON.stringify({
imageId: 'test-image',
ip: req.ip,
}));
/*
* Render the Multiplayer Canvas view
*/
res.locals.appModuleUrl = '/dist/canvas-app.bundle.js';
res.render('multiplayer-canvas');
}

7
webpack.config.js

@ -55,16 +55,11 @@ export default {
},
mode: webpackMode,
output: {
clean: true,
filename: '[name].bundle.js',
path: path.resolve(__dirname, 'dist'),
clean: true,
publicPath: '/dist',
},
optimization: {
splitChunks: {
chunks: 'all',
},
},
plugins,
module: {
rules: [

661
yarn.lock

@ -12,6 +12,13 @@
resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.17.8.tgz#2817fb9d885dd8132ea0f8eb615a6388cca1c240"
integrity sha512-BoHhDJrJXqcg+ZL16Xv39H9n+AqJ4pcDrQBGZN+wHxIysrLZ3/ECwCBUch/1zUNhnsXULcONU3Ei5Hmkfk6kiQ==
"@babel/runtime@^7.7.2":
version "7.17.8"
resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.17.8.tgz#3e56e4aff81befa55ac3ac6a0967349fd1c5bca2"
integrity sha512-dQpEpK0O9o6lj6oPu0gRDbbnk+4LeHlNcBpspf6Olzt3GIX4P1lWF1gS+pHLDFlaJvbR6q7jCfQ08zA4QJBnmA==
dependencies:
regenerator-runtime "^0.13.4"
"@babel/types@^7.6.1", "@babel/types@^7.9.6":
version "7.17.0"
resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.17.0.tgz#a826e368bccb6b3d84acd76acad5c0d87342390b"
@ -39,6 +46,301 @@
resolved "https://registry.yarnpkg.com/@discoveryjs/json-ext/-/json-ext-0.5.7.tgz#1d572bfbbe14b7704e0ba0f39b74815b84870d70"
integrity sha512-dBVuXR082gk3jsFp7Rd/JI4kytwGHecnCoTtXFb7DB6CNHp4rg5k1bhg0nWdLGLnOV71lmDzGQaLMy8iPLY0pw==
"@ioredis/commands@^1.1.1":
version "1.1.1"
resolved "https://registry.yarnpkg.com/@ioredis/commands/-/commands-1.1.1.tgz#2ba4299ea624a6bfac15b35f6df90b0015691ec3"
integrity sha512-fsR4P/ROllzf/7lXYyElUJCheWdTJVJvOTps8v9IWKFATxR61ANOlnoPqhH099xYLrJGpc2ZQ28B3rMeUt5VQg==
"@jimp/bmp@^0.16.1":
version "0.16.1"
resolved "https://registry.yarnpkg.com/@jimp/bmp/-/bmp-0.16.1.tgz#6e2da655b2ba22e721df0795423f34e92ef13768"
integrity sha512-iwyNYQeBawrdg/f24x3pQ5rEx+/GwjZcCXd3Kgc+ZUd+Ivia7sIqBsOnDaMZdKCBPlfW364ekexnlOqyVa0NWg==
dependencies:
"@babel/runtime" "^7.7.2"
"@jimp/utils" "^0.16.1"
bmp-js "^0.1.0"
"@jimp/core@^0.16.1":
version "0.16.1"
resolved "https://registry.yarnpkg.com/@jimp/core/-/core-0.16.1.tgz#68c4288f6ef7f31a0f6b859ba3fb28dae930d39d"
integrity sha512-la7kQia31V6kQ4q1kI/uLimu8FXx7imWVajDGtwUG8fzePLWDFJyZl0fdIXVCL1JW2nBcRHidUot6jvlRDi2+g==
dependencies:
"@babel/runtime" "^7.7.2"
"@jimp/utils" "^0.16.1"
any-base "^1.1.0"
buffer "^5.2.0"
exif-parser "^0.1.12"
file-type "^9.0.0"
load-bmfont "^1.3.1"
mkdirp "^0.5.1"
phin "^2.9.1"
pixelmatch "^4.0.2"
tinycolor2 "^1.4.1"
"@jimp/custom@^0.16.1":
version "0.16.1"
resolved "https://registry.yarnpkg.com/@jimp/custom/-/custom-0.16.1.tgz#28b659c59e20a1d75a0c46067bd3f4bd302cf9c5"
integrity sha512-DNUAHNSiUI/j9hmbatD6WN/EBIyeq4AO0frl5ETtt51VN1SvE4t4v83ZA/V6ikxEf3hxLju4tQ5Pc3zmZkN/3A==
dependencies:
"@babel/runtime" "^7.7.2"
"@jimp/core" "^0.16.1"
"@jimp/gif@^0.16.1":
version "0.16.1"
resolved "https://registry.yarnpkg.com/@jimp/gif/-/gif-0.16.1.tgz#d1f7c3a58f4666482750933af8b8f4666414f3ca"
integrity sha512-r/1+GzIW1D5zrP4tNrfW+3y4vqD935WBXSc8X/wm23QTY9aJO9Lw6PEdzpYCEY+SOklIFKaJYUAq/Nvgm/9ryw==
dependencies:
"@babel/runtime" "^7.7.2"
"@jimp/utils" "^0.16.1"
gifwrap "^0.9.2"
omggif "^1.0.9"
"@jimp/jpeg@^0.16.1":
version "0.16.1"
resolved "https://registry.yarnpkg.com/@jimp/jpeg/-/jpeg-0.16.1.tgz#3b7bb08a4173f2f6d81f3049b251df3ee2ac8175"
integrity sha512-8352zrdlCCLFdZ/J+JjBslDvml+fS3Z8gttdml0We759PnnZGqrnPRhkOEOJbNUlE+dD4ckLeIe6NPxlS/7U+w==
dependencies:
"@babel/runtime" "^7.7.2"
"@jimp/utils" "^0.16.1"
jpeg-js "0.4.2"
"@jimp/plugin-blit@^0.16.1":
version "0.16.1"
resolved "https://registry.yarnpkg.com/@jimp/plugin-blit/-/plugin-blit-0.16.1.tgz#09ea919f9d326de3b9c2826fe4155da37dde8edb"
integrity sha512-fKFNARm32RoLSokJ8WZXHHH2CGzz6ire2n1Jh6u+XQLhk9TweT1DcLHIXwQMh8oR12KgjbgsMGvrMVlVknmOAg==
dependencies:
"@babel/runtime" "^7.7.2"
"@jimp/utils" "^0.16.1"
"@jimp/plugin-blur@^0.16.1":
version "0.16.1"
resolved "https://registry.yarnpkg.com/@jimp/plugin-blur/-/plugin-blur-0.16.1.tgz#e614fa002797dcd662e705d4cea376e7db968bf5"
integrity sha512-1WhuLGGj9MypFKRcPvmW45ht7nXkOKu+lg3n2VBzIB7r4kKNVchuI59bXaCYQumOLEqVK7JdB4glaDAbCQCLyw==
dependencies:
"@babel/runtime" "^7.7.2"
"@jimp/utils" "^0.16.1"
"@jimp/plugin-circle@^0.16.1":
version "0.16.1"
resolved "https://registry.yarnpkg.com/@jimp/plugin-circle/-/plugin-circle-0.16.1.tgz#20e3194a67ca29740aba2630fd4d0a89afa27491"
integrity sha512-JK7yi1CIU7/XL8hdahjcbGA3V7c+F+Iw+mhMQhLEi7Q0tCnZ69YJBTamMiNg3fWPVfMuvWJJKOBRVpwNTuaZRg==
dependencies:
"@babel/runtime" "^7.7.2"
"@jimp/utils" "^0.16.1"
"@jimp/plugin-color@^0.16.1":
version "0.16.1"
resolved "https://registry.yarnpkg.com/@jimp/plugin-color/-/plugin-color-0.16.1.tgz#0f298ba74dee818b663834cd80d53e56f3755233"
integrity sha512-9yQttBAO5SEFj7S6nJK54f+1BnuBG4c28q+iyzm1JjtnehjqMg6Ljw4gCSDCvoCQ3jBSYHN66pmwTV74SU1B7A==
dependencies:
"@babel/runtime" "^7.7.2"
"@jimp/utils" "^0.16.1"
tinycolor2 "^1.4.1"
"@jimp/plugin-contain@^0.16.1":
version "0.16.1"
resolved "https://registry.yarnpkg.com/@jimp/plugin-contain/-/plugin-contain-0.16.1.tgz#3c5f5c495fd9bb08a970739d83694934f58123f2"
integrity sha512-44F3dUIjBDHN+Ym/vEfg+jtjMjAqd2uw9nssN67/n4FdpuZUVs7E7wadKY1RRNuJO+WgcD5aDQcsvurXMETQTg==
dependencies:
"@babel/runtime" "^7.7.2"
"@jimp/utils" "^0.16.1"
"@jimp/plugin-cover@^0.16.1":
version "0.16.1"
resolved "https://registry.yarnpkg.com/@jimp/plugin-cover/-/plugin-cover-0.16.1.tgz#0e8caec16a40abe15b1b32e5383a603a3306dc41"
integrity sha512-YztWCIldBAVo0zxcQXR+a/uk3/TtYnpKU2CanOPJ7baIuDlWPsG+YE4xTsswZZc12H9Kl7CiziEbDtvF9kwA/Q==
dependencies:
"@babel/runtime" "^7.7.2"
"@jimp/utils" "^0.16.1"
"@jimp/plugin-crop@^0.16.1":
version "0.16.1"
resolved "https://registry.yarnpkg.com/@jimp/plugin-crop/-/plugin-crop-0.16.1.tgz#b362497c873043fe47ba881ab08604bf7226f50f"
integrity sha512-UQdva9oQzCVadkyo3T5Tv2CUZbf0klm2cD4cWMlASuTOYgaGaFHhT9st+kmfvXjKL8q3STkBu/zUPV6PbuV3ew==
dependencies:
"@babel/runtime" "^7.7.2"
"@jimp/utils" "^0.16.1"
"@jimp/plugin-displace@^0.16.1":
version "0.16.1"
resolved "https://registry.yarnpkg.com/@jimp/plugin-displace/-/plugin-displace-0.16.1.tgz#4dd9db518c3e78de9d723f86a234bf98922afe8d"
integrity sha512-iVAWuz2+G6Heu8gVZksUz+4hQYpR4R0R/RtBzpWEl8ItBe7O6QjORAkhxzg+WdYLL2A/Yd4ekTpvK0/qW8hTVw==
dependencies:
"@babel/runtime" "^7.7.2"
"@jimp/utils" "^0.16.1"
"@jimp/plugin-dither@^0.16.1":
version "0.16.1"
resolved "https://registry.yarnpkg.com/@jimp/plugin-dither/-/plugin-dither-0.16.1.tgz#b47de2c0bb09608bed228b41c3cd01a85ec2d45b"
integrity sha512-tADKVd+HDC9EhJRUDwMvzBXPz4GLoU6s5P7xkVq46tskExYSptgj5713J5Thj3NMgH9Rsqu22jNg1H/7tr3V9Q==
dependencies:
"@babel/runtime" "^7.7.2"
"@jimp/utils" "^0.16.1"
"@jimp/plugin-fisheye@^0.16.1":
version "0.16.1"
resolved "https://registry.yarnpkg.com/@jimp/plugin-fisheye/-/plugin-fisheye-0.16.1.tgz#f625047b6cdbe1b83b89e9030fd025ab19cdb1a4"
integrity sha512-BWHnc5hVobviTyIRHhIy9VxI1ACf4CeSuCfURB6JZm87YuyvgQh5aX5UDKtOz/3haMHXBLP61ZBxlNpMD8CG4A==
dependencies:
"@babel/runtime" "^7.7.2"
"@jimp/utils" "^0.16.1"
"@jimp/plugin-flip@^0.16.1":
version "0.16.1"
resolved "https://registry.yarnpkg.com/@jimp/plugin-flip/-/plugin-flip-0.16.1.tgz#7a99ea22bde802641017ed0f2615870c144329bb"
integrity sha512-KdxTf0zErfZ8DyHkImDTnQBuHby+a5YFdoKI/G3GpBl3qxLBvC+PWkS2F/iN3H7wszP7/TKxTEvWL927pypT0w==
dependencies:
"@babel/runtime" "^7.7.2"
"@jimp/utils" "^0.16.1"
"@jimp/plugin-gaussian@^0.16.1":
version "0.16.1"
resolved "https://registry.yarnpkg.com/@jimp/plugin-gaussian/-/plugin-gaussian-0.16.1.tgz#0845e314085ccd52e34fad9a83949bc0d81a68e8"
integrity sha512-u9n4wjskh3N1mSqketbL6tVcLU2S5TEaFPR40K6TDv4phPLZALi1Of7reUmYpVm8mBDHt1I6kGhuCJiWvzfGyg==
dependencies:
"@babel/runtime" "^7.7.2"
"@jimp/utils" "^0.16.1"
"@jimp/plugin-invert@^0.16.1":
version "0.16.1"
resolved "https://registry.yarnpkg.com/@jimp/plugin-invert/-/plugin-invert-0.16.1.tgz#7e6f5a15707256f3778d06921675bbcf18545c97"
integrity sha512-2DKuyVXANH8WDpW9NG+PYFbehzJfweZszFYyxcaewaPLN0GxvxVLOGOPP1NuUTcHkOdMFbE0nHDuB7f+sYF/2w==
dependencies:
"@babel/runtime" "^7.7.2"
"@jimp/utils" "^0.16.1"
"@jimp/plugin-mask@^0.16.1":
version "0.16.1"
resolved "https://registry.yarnpkg.com/@jimp/plugin-mask/-/plugin-mask-0.16.1.tgz#e7f2460e05c3cda7af5e76f33ccb0579f66f90df"
integrity sha512-snfiqHlVuj4bSFS0v96vo2PpqCDMe4JB+O++sMo5jF5mvGcGL6AIeLo8cYqPNpdO6BZpBJ8MY5El0Veckhr39Q==
dependencies:
"@babel/runtime" "^7.7.2"
"@jimp/utils" "^0.16.1"
"@jimp/plugin-normalize@^0.16.1":
version "0.16.1"
resolved "https://registry.yarnpkg.com/@jimp/plugin-normalize/-/plugin-normalize-0.16.1.tgz#032dfd88eefbc4dedc8b1b2d243832e4f3af30c8"
integrity sha512-dOQfIOvGLKDKXPU8xXWzaUeB0nvkosHw6Xg1WhS1Z5Q0PazByhaxOQkSKgUryNN/H+X7UdbDvlyh/yHf3ITRaw==
dependencies:
"@babel/runtime" "^7.7.2"
"@jimp/utils" "^0.16.1"
"@jimp/plugin-print@^0.16.1":
version "0.16.1"
resolved "https://registry.yarnpkg.com/@jimp/plugin-print/-/plugin-print-0.16.1.tgz#66b803563f9d109825970714466e6ab9ae639ff6"
integrity sha512-ceWgYN40jbN4cWRxixym+csyVymvrryuKBQ+zoIvN5iE6OyS+2d7Mn4zlNgumSczb9GGyZZESIgVcBDA1ezq0Q==
dependencies:
"@babel/runtime" "^7.7.2"
"@jimp/utils" "^0.16.1"
load-bmfont "^1.4.0"
"@jimp/plugin-resize@^0.16.1":
version "0.16.1"
resolved "https://registry.yarnpkg.com/@jimp/plugin-resize/-/plugin-resize-0.16.1.tgz#65e39d848ed13ba2d6c6faf81d5d590396571d10"
integrity sha512-u4JBLdRI7dargC04p2Ha24kofQBk3vhaf0q8FwSYgnCRwxfvh2RxvhJZk9H7Q91JZp6wgjz/SjvEAYjGCEgAwQ==
dependencies:
"@babel/runtime" "^7.7.2"
"@jimp/utils" "^0.16.1"
"@jimp/plugin-rotate@^0.16.1":
version "0.16.1"
resolved "https://registry.yarnpkg.com/@jimp/plugin-rotate/-/plugin-rotate-0.16.1.tgz#53fb5d51a4b3d05af9c91c2a8fffe5d7a1a47c8c"
integrity sha512-ZUU415gDQ0VjYutmVgAYYxC9Og9ixu2jAGMCU54mSMfuIlmohYfwARQmI7h4QB84M76c9hVLdONWjuo+rip/zg==
dependencies:
"@babel/runtime" "^7.7.2"
"@jimp/utils" "^0.16.1"
"@jimp/plugin-scale@^0.16.1":
version "0.16.1"
resolved "https://registry.yarnpkg.com/@jimp/plugin-scale/-/plugin-scale-0.16.1.tgz#89f6ba59feed3429847ed226aebda33a240cc647"
integrity sha512-jM2QlgThIDIc4rcyughD5O7sOYezxdafg/2Xtd1csfK3z6fba3asxDwthqPZAgitrLgiKBDp6XfzC07Y/CefUw==
dependencies:
"@babel/runtime" "^7.7.2"
"@jimp/utils" "^0.16.1"
"@jimp/plugin-shadow@^0.16.1":
version "0.16.1"
resolved "https://registry.yarnpkg.com/@jimp/plugin-shadow/-/plugin-shadow-0.16.1.tgz#a7af892a740febf41211e10a5467c3c5c521a04c"
integrity sha512-MeD2Is17oKzXLnsphAa1sDstTu6nxscugxAEk3ji0GV1FohCvpHBcec0nAq6/czg4WzqfDts+fcPfC79qWmqrA==
dependencies:
"@babel/runtime" "^7.7.2"
"@jimp/utils" "^0.16.1"
"@jimp/plugin-threshold@^0.16.1":
version "0.16.1"
resolved "https://registry.yarnpkg.com/@jimp/plugin-threshold/-/plugin-threshold-0.16.1.tgz#34f3078f9965145b7ae26c53a32ad74b1195bbf5"
integrity sha512-iGW8U/wiCSR0+6syrPioVGoSzQFt4Z91SsCRbgNKTAk7D+XQv6OI78jvvYg4o0c2FOlwGhqz147HZV5utoSLxA==
dependencies:
"@babel/runtime" "^7.7.2"
"@jimp/utils" "^0.16.1"
"@jimp/plugins@^0.16.1":
version "0.16.1"
resolved "https://registry.yarnpkg.com/@jimp/plugins/-/plugins-0.16.1.tgz#9f08544c97226d6460a16ced79f57e85bec3257b"
integrity sha512-c+lCqa25b+4q6mJZSetlxhMoYuiltyS+ValLzdwK/47+aYsq+kcJNl+TuxIEKf59yr9+5rkbpsPkZHLF/V7FFA==
dependencies:
"@babel/runtime" "^7.7.2"
"@jimp/plugin-blit" "^0.16.1"
"@jimp/plugin-blur" "^0.16.1"
"@jimp/plugin-circle" "^0.16.1"
"@jimp/plugin-color" "^0.16.1"
"@jimp/plugin-contain" "^0.16.1"
"@jimp/plugin-cover" "^0.16.1"
"@jimp/plugin-crop" "^0.16.1"
"@jimp/plugin-displace" "^0.16.1"
"@jimp/plugin-dither" "^0.16.1"
"@jimp/plugin-fisheye" "^0.16.1"
"@jimp/plugin-flip" "^0.16.1"
"@jimp/plugin-gaussian" "^0.16.1"
"@jimp/plugin-invert" "^0.16.1"
"@jimp/plugin-mask" "^0.16.1"
"@jimp/plugin-normalize" "^0.16.1"
"@jimp/plugin-print" "^0.16.1"
"@jimp/plugin-resize" "^0.16.1"
"@jimp/plugin-rotate" "^0.16.1"
"@jimp/plugin-scale" "^0.16.1"
"@jimp/plugin-shadow" "^0.16.1"
"@jimp/plugin-threshold" "^0.16.1"
timm "^1.6.1"
"@jimp/png@^0.16.1":
version "0.16.1"
resolved "https://registry.yarnpkg.com/@jimp/png/-/png-0.16.1.tgz#f24cfc31529900b13a2dd9d4fdb4460c1e4d814e"
integrity sha512-iyWoCxEBTW0OUWWn6SveD4LePW89kO7ZOy5sCfYeDM/oTPLpR8iMIGvZpZUz1b8kvzFr27vPst4E5rJhGjwsdw==
dependencies:
"@babel/runtime" "^7.7.2"
"@jimp/utils" "^0.16.1"
pngjs "^3.3.3"
"@jimp/tiff@^0.16.1":
version "0.16.1"
resolved "https://registry.yarnpkg.com/@jimp/tiff/-/tiff-0.16.1.tgz#0e8756695687d7574b6bc73efab0acd4260b7a12"
integrity sha512-3K3+xpJS79RmSkAvFMgqY5dhSB+/sxhwTFA9f4AVHUK0oKW+u6r52Z1L0tMXHnpbAdR9EJ+xaAl2D4x19XShkQ==
dependencies:
"@babel/runtime" "^7.7.2"
utif "^2.0.1"
"@jimp/types@^0.16.1":
version "0.16.1"
resolved "https://registry.yarnpkg.com/@jimp/types/-/types-0.16.1.tgz#0dbab37b3202315c91010f16c31766d35a2322cc"
integrity sha512-g1w/+NfWqiVW4CaXSJyD28JQqZtm2eyKMWPhBBDCJN9nLCN12/Az0WFF3JUAktzdsEC2KRN2AqB1a2oMZBNgSQ==
dependencies:
"@babel/runtime" "^7.7.2"
"@jimp/bmp" "^0.16.1"
"@jimp/gif" "^0.16.1"
"@jimp/jpeg" "^0.16.1"
"@jimp/png" "^0.16.1"
"@jimp/tiff" "^0.16.1"
timm "^1.6.1"
"@jimp/utils@^0.16.1":
version "0.16.1"
resolved "https://registry.yarnpkg.com/@jimp/utils/-/utils-0.16.1.tgz#2f51e6f14ff8307c4aa83d5e1a277da14a9fe3f7"
integrity sha512-8fULQjB0x4LzUSiSYG6ZtQl355sZjxbv8r9PPAuYHzS9sGiSHJQavNqK/nKnpDsVkU88/vRGcE7t3nMU0dEnVw==
dependencies:
"@babel/runtime" "^7.7.2"
regenerator-runtime "^0.13.3"
"@socket.io/base64-arraybuffer@~1.0.2":
version "1.0.2"
resolved "https://registry.yarnpkg.com/@socket.io/base64-arraybuffer/-/base64-arraybuffer-1.0.2.tgz#568d9beae00b0d835f4f8c53fd55714986492e61"
@ -49,6 +351,16 @@
resolved "https://registry.yarnpkg.com/@socket.io/component-emitter/-/component-emitter-3.0.0.tgz#8863915676f837d9dad7b76f50cb500c1e9422e9"
integrity sha512-2pTGuibAXJswAPJjaKisthqS/NOK5ypG4LYT6tEAV0S/mxW0zOIvYvGK0V8w8+SHxAm6vRMSjqSalFXeBAqs+Q==
"@socket.io/redis-adapter@^7.1.0":
version "7.1.0"
resolved "https://registry.yarnpkg.com/@socket.io/redis-adapter/-/redis-adapter-7.1.0.tgz#66f854da3cc47b80a9f5d287e93a58af16e5c3fb"
integrity sha512-vbsNJKUQgtVHcOqNL2ac8kSemTVNKHRzYPldqQJt0eFKvlAtAviuAMzBP0WmOp5OoRLQMjhVsVvgMzzMsVsK5g==
dependencies:
debug "~4.3.1"
notepack.io "~2.2.0"
socket.io-adapter "~2.3.0"
uid2 "0.0.3"
"@types/component-emitter@^1.2.10":
version "1.2.11"
resolved "https://registry.yarnpkg.com/@types/component-emitter/-/component-emitter-1.2.11.tgz#50d47d42b347253817a39709fef03ce66a108506"
@ -95,6 +407,11 @@
resolved "https://registry.yarnpkg.com/@types/node/-/node-17.0.23.tgz#3b41a6e643589ac6442bdbd7a4a3ded62f33f7da"
integrity sha512-UxDxWn7dl97rKVeVS61vErvw086aCYhDLyvRQZ5Rk65rZKepaFdm53GeqXaKBuOhED4e9uWq34IC3TdSdJJ2Gw==
"@types/[email protected]":
version "16.9.1"
resolved "https://registry.yarnpkg.com/@types/node/-/node-16.9.1.tgz#0611b37db4246c937feef529ddcc018cf8e35708"
integrity sha512-QpLcX9ZSsq3YYUUnD3nFDY8H7wctAhQj/TFKL8Ya8v5fMm3CFXxo8zStsLAl780ltoYoo1WvKUVGBQK+1ifr7g==
"@webassemblyjs/[email protected]":
version "1.11.1"
resolved "https://registry.yarnpkg.com/@webassemblyjs/ast/-/ast-1.11.1.tgz#2bfd767eae1a6996f432ff7e8d7fc75679c0b6a7"
@ -334,6 +651,11 @@ ansi-styles@^4.0.0:
dependencies:
color-convert "^2.0.1"
any-base@^1.1.0:
version "1.1.0"
resolved "https://registry.yarnpkg.com/any-base/-/any-base-1.1.0.tgz#ae101a62bc08a597b4c9ab5b7089d456630549fe"
integrity sha512-uMgjozySS8adZZYePpaWs8cxB9/kdzmpX6SgJZ+wbz1K5eYk5QMYDVJaZKhxyIHUdnnJkfR7SVgStgH7LkGUyg==
anymatch@~3.1.2:
version "3.1.2"
resolved "https://registry.yarnpkg.com/anymatch/-/anymatch-3.1.2.tgz#c0557c096af32f106198f4f4e2a383537e378716"
@ -396,6 +718,11 @@ balanced-match@^1.0.0:
resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.2.tgz#e83e3a7e3f300b34cb9d87f615fa0cbf357690ee"
integrity sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==
base64-js@^1.3.1:
version "1.5.1"
resolved "https://registry.yarnpkg.com/base64-js/-/base64-js-1.5.1.tgz#1b1b440160a5bf7ad40b650f095963481903930a"
integrity sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==
[email protected], base64id@~2.0.0:
version "2.0.0"
resolved "https://registry.yarnpkg.com/base64id/-/base64id-2.0.0.tgz#2770ac6bc47d312af97a8bf9a634342e0cd25cb6"
@ -411,6 +738,11 @@ binary-extensions@^2.0.0:
resolved "https://registry.yarnpkg.com/binary-extensions/-/binary-extensions-2.2.0.tgz#75f502eeaf9ffde42fc98829645be4ea76bd9e2d"
integrity sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==
bmp-js@^0.1.0:
version "0.1.0"
resolved "https://registry.yarnpkg.com/bmp-js/-/bmp-js-0.1.0.tgz#e05a63f796a6c1ff25f4771ec7adadc148c07233"
integrity sha1-4Fpj95amwf8l9Hcex62twUjAcjM=
[email protected]:
version "1.19.2"
resolved "https://registry.yarnpkg.com/body-parser/-/body-parser-1.19.2.tgz#4714ccd9c157d44797b8b5607d72c0b89952f26e"
@ -528,11 +860,24 @@ bs-snippet-injector@^2.0.1:
resolved "https://registry.yarnpkg.com/bs-snippet-injector/-/bs-snippet-injector-2.0.1.tgz#61b5393f11f52559ed120693100343b6edb04dd5"
integrity sha1-YbU5PxH1JVntEgaTEANDtu2wTdU=
[email protected]:
version "0.0.1"
resolved "https://registry.yarnpkg.com/buffer-equal/-/buffer-equal-0.0.1.tgz#91bc74b11ea405bc916bc6aa908faafa5b4aac4b"
integrity sha1-kbx0sR6kBbyRa8aqkI+q+ltKrEs=
buffer-from@^1.0.0:
version "1.1.2"
resolved "https://registry.yarnpkg.com/buffer-from/-/buffer-from-1.1.2.tgz#2b146a6fd72e80b4f55d255f35ed59a3a9a41bd5"
integrity sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==
buffer@^5.2.0:
version "5.7.1"
resolved "https://registry.yarnpkg.com/buffer/-/buffer-5.7.1.tgz#ba62e7c13133053582197160851a8f648e99eed0"
integrity sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==
dependencies:
base64-js "^1.3.1"
ieee754 "^1.1.13"
[email protected]:
version "3.1.2"
resolved "https://registry.yarnpkg.com/bytes/-/bytes-3.1.2.tgz#8b0beeb98605adf1b128fa4386403c009e0221a5"
@ -624,6 +969,11 @@ clone-deep@^4.0.1:
kind-of "^6.0.2"
shallow-clone "^3.0.0"
cluster-key-slot@^1.1.0:
version "1.1.0"
resolved "https://registry.yarnpkg.com/cluster-key-slot/-/cluster-key-slot-1.1.0.tgz#30474b2a981fb12172695833052bc0d01336d10d"
integrity sha512-2Nii8p3RwAPiFwsnZvukotvow2rIHM+yQ6ZcBXGHdniadkYGZYiGmkHJIbZPIV9nfv7m/U1IPMVVcAhoWFeklw==
color-convert@^1.9.0, color-convert@^1.9.3:
version "1.9.3"
resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-1.9.3.tgz#bb71850690e1f136567de629d2d5471deda4c1e8"
@ -648,7 +998,7 @@ color-name@^1.0.0, color-name@~1.1.4:
resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.4.tgz#c2a09a87acbde69543de6f63fa3995c826c536a2"
integrity sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==
color-string@^1.6.0:
color-string@^1.6.0, color-string@^1.9.0:
version "1.9.0"
resolved "https://registry.yarnpkg.com/color-string/-/color-string-1.9.0.tgz#63b6ebd1bec11999d1df3a79a7569451ac2be8aa"
integrity sha512-9Mrz2AQLefkH1UvASKj6v6hj/7eWgjnT/cVsR8CumieLoT+g900exWeNogqtweI8dxloXN9BDQTYro1oWu/5CQ==
@ -664,6 +1014,14 @@ color@^3.1.3:
color-convert "^1.9.3"
color-string "^1.6.0"
color@^4.2.1:
version "4.2.1"
resolved "https://registry.yarnpkg.com/color/-/color-4.2.1.tgz#498aee5fce7fc982606c8875cab080ac0547c884"
integrity sha512-MFJr0uY4RvTQUKvPq7dh9grVOTYSFeXja2mBXioCGjnjJoXrAp9jJ1NQTDR73c9nwBSAQiNKloKl5zq9WB9UPw==
dependencies:
color-convert "^2.0.1"
color-string "^1.9.0"
colorette@^2.0.10, colorette@^2.0.14:
version "2.0.16"
resolved "https://registry.yarnpkg.com/colorette/-/colorette-2.0.16.tgz#713b9af84fdb000139f04546bd4a93f62a5085da"
@ -769,6 +1127,13 @@ cors@~2.8.5:
object-assign "^4"
vary "^1"
cron@^1.8.2:
version "1.8.2"
resolved "https://registry.yarnpkg.com/cron/-/cron-1.8.2.tgz#4ac5e3c55ba8c163d84f3407bde94632da8370ce"
integrity sha512-Gk2c4y6xKEO8FSAUTklqtfSr7oTq0CiPQeLBG5Fl0qoXpZyMcj1SG59YL+hqq04bu6/IuEA7lMkYDAplQNKkyg==
dependencies:
moment-timezone "^0.5.x"
cross-spawn@^7.0.3:
version "7.0.3"
resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-7.0.3.tgz#f73a85b9d5d41d045551c177e2882d4ac85728a6"
@ -823,13 +1188,18 @@ debug@^3.2.6:
dependencies:
ms "^2.1.1"
debug@~4.3.1, debug@~4.3.2:
debug@^4.3.4, debug@~4.3.1, debug@~4.3.2:
version "4.3.4"
resolved "https://registry.yarnpkg.com/debug/-/debug-4.3.4.tgz#1319f6579357f2338d3337d2cdd4914bb5dcc865"
integrity sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==
dependencies:
ms "2.1.2"
denque@^2.0.1:
version "2.0.1"
resolved "https://registry.yarnpkg.com/denque/-/denque-2.0.1.tgz#bcef4c1b80dc32efe97515744f21a4229ab8934a"
integrity sha512-tfiWc6BQLXNLpNiR5iGd0Ocu3P3VpxfzFiqubLgMfhfOw9WyvgJBd46CClNn9k3qfbjvT//0cf7AlYRX/OslMQ==
[email protected]:
version "2.0.0"
resolved "https://registry.yarnpkg.com/depd/-/depd-2.0.0.tgz#b696163cc757560d09cf22cc8fad1571b79e76df"
@ -868,6 +1238,11 @@ dom-serializer@0:
domelementtype "^2.0.1"
entities "^2.0.0"
dom-walk@^0.1.0:
version "0.1.2"
resolved "https://registry.yarnpkg.com/dom-walk/-/dom-walk-0.1.2.tgz#0c548bef048f4d1f2a97249002236060daa3fd84"
integrity sha512-6QvTW9mrGeIegrFXdtQi9pk7O/nSK6lSdXW2eqUspN5LWD7UTji2Fqw5V2YLjBpHEoU9Xl/eUWNpDeZvoyOv2w==
domelementtype@1:
version "1.3.1"
resolved "https://registry.yarnpkg.com/domelementtype/-/domelementtype-1.3.1.tgz#d048c44b37b0d10a7f2a3d5fee3f4333d790481f"
@ -1086,6 +1461,11 @@ execa@^5.0.0:
signal-exit "^3.0.3"
strip-final-newline "^2.0.0"
exif-parser@^0.1.12:
version "0.1.12"
resolved "https://registry.yarnpkg.com/exif-parser/-/exif-parser-0.1.12.tgz#58a9d2d72c02c1f6f02a0ef4a9166272b7760922"
integrity sha1-WKnS1ywCwfbwKg70qRZicrd2CSI=
[email protected], [email protected]:
version "0.1.2"
resolved "https://registry.yarnpkg.com/exit/-/exit-0.1.2.tgz#0632638f8d877cc82107d30a0fff1a17cba1cd0c"
@ -1155,6 +1535,11 @@ fecha@^4.2.0:
resolved "https://registry.yarnpkg.com/fecha/-/fecha-4.2.1.tgz#0a83ad8f86ef62a091e22bb5a039cd03d23eecce"
integrity sha512-MMMQ0ludy/nBs1/o0zVOiKTpG7qMbonKUzjJgQFEuvq6INZ1OraKPRAWkBq5vlKLOUMpmNYG1JoN3oDPUQ9m3Q==
file-type@^9.0.0:
version "9.0.0"
resolved "https://registry.yarnpkg.com/file-type/-/file-type-9.0.0.tgz#a68d5ad07f486414dfb2c8866f73161946714a18"
integrity sha512-Qe/5NJrgIOlwijpq3B7BEpzPFcgzggOTagZmkXQY4LA6bsXKTUstK7Wp12lEJ/mLKTpvIZxmIuRcLYWT6ov9lw==
fill-range@^7.0.1:
version "7.0.1"
resolved "https://registry.yarnpkg.com/fill-range/-/fill-range-7.0.1.tgz#1919a6a7c75fe38b2c7c77e5198535da9acdda40"
@ -1264,6 +1649,14 @@ get-stream@^6.0.0:
resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-6.0.1.tgz#a262d8eef67aced57c2852ad6167526a43cbf7b7"
integrity sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==
gifwrap@^0.9.2:
version "0.9.4"
resolved "https://registry.yarnpkg.com/gifwrap/-/gifwrap-0.9.4.tgz#f4eb6169ba027d61df64aafbdcb1f8ae58ccc0c5"
integrity sha512-MDMwbhASQuVeD4JKd1fKgNgCRL3fGqMM4WaqpNhWO0JiMOAjbQdumbs4BbBZEy9/M00EHEjKN3HieVhCUlwjeQ==
dependencies:
image-q "^4.0.0"
omggif "^1.0.10"
glob-parent@~5.1.2:
version "5.1.2"
resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-5.1.2.tgz#869832c58034fe68a4093c17dc15e8340d8401c4"
@ -1288,6 +1681,14 @@ glob@^7.1.1:
once "^1.3.0"
path-is-absolute "^1.0.0"
global@~4.4.0:
version "4.4.0"
resolved "https://registry.yarnpkg.com/global/-/global-4.4.0.tgz#3e7b105179006a323ed71aafca3e9c57a5cc6406"
integrity sha512-wv/LAoHdRE3BeTGz53FAamhGlPLhlssK45usmGFThIi4XqnBmjKQ16u+RNbP7WvigRZDxUsM0J3gcQ5yicaL0w==
dependencies:
min-document "^2.19.0"
process "^0.11.10"
graceful-fs@^4.1.2, graceful-fs@^4.1.6, graceful-fs@^4.2.4, graceful-fs@^4.2.9:
version "4.2.10"
resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.10.tgz#147d3a006da4ca3ce14728c7aefc287c367d7a6c"
@ -1403,6 +1804,18 @@ icss-utils@^5.0.0, icss-utils@^5.1.0:
resolved "https://registry.yarnpkg.com/icss-utils/-/icss-utils-5.1.0.tgz#c6be6858abd013d768e98366ae47e25d5887b1ae"
integrity sha512-soFhflCVWLfRNOPU3iv5Z9VUdT44xFRbzjLsEzSr5AQmgqPMTHdU3PMT1Cf1ssx8fLNJDA1juftYl+PUcv3MqA==
ieee754@^1.1.13:
version "1.2.1"
resolved "https://registry.yarnpkg.com/ieee754/-/ieee754-1.2.1.tgz#8eb7a10a63fff25d15a57b001586d177d1b0d352"
integrity sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==
image-q@^4.0.0:
version "4.0.0"
resolved "https://registry.yarnpkg.com/image-q/-/image-q-4.0.0.tgz#31e075be7bae3c1f42a85c469b4732c358981776"
integrity sha512-PfJGVgIfKQJuq3s0tTDOKtztksibuUEbJQIYT3by6wctQo+Rdlh7ef4evJ5NCdxY4CfMbvFkocEwbl4BF8RlJw==
dependencies:
"@types/node" "16.9.1"
image-size@~0.5.0:
version "0.5.5"
resolved "https://registry.yarnpkg.com/image-size/-/image-size-0.5.5.tgz#09dfd4ab9d20e29eb1c3e80b8990378df9e3cb9c"
@ -1444,6 +1857,21 @@ interpret@^2.2.0:
resolved "https://registry.yarnpkg.com/interpret/-/interpret-2.2.0.tgz#1a78a0b5965c40a5416d007ad6f50ad27c417df9"
integrity sha512-Ju0Bz/cEia55xDwUWEa8+olFpCiQoypjnQySseKtmjNrnps3P+xfpUmGr90T7yjlVJmOtybRvPXhKMbHr+fWnw==
ioredis@^5.0.3:
version "5.0.3"
resolved "https://registry.yarnpkg.com/ioredis/-/ioredis-5.0.3.tgz#5a742a03128a9924f98b957c8721720b4165b3ab"
integrity sha512-hKxywVypoGGUJDyfnMufO0VNkuIaQufo2/PJ5SOYBKWgf4+gCnZEPaBPle615k08euY9/B9DKytVtwZROF7HaA==
dependencies:
"@ioredis/commands" "^1.1.1"
cluster-key-slot "^1.1.0"
debug "^4.3.4"
denque "^2.0.1"
lodash.defaults "^4.2.0"
lodash.isarguments "^3.1.0"
redis-errors "^1.2.0"
redis-parser "^3.0.0"
standard-as-callback "^2.1.0"
[email protected]:
version "1.9.1"
resolved "https://registry.yarnpkg.com/ipaddr.js/-/ipaddr.js-1.9.1.tgz#bff38543eeb8984825079ff3a2a8e6cbd46781b3"
@ -1486,6 +1914,11 @@ is-fullwidth-code-point@^3.0.0:
resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz#f116f8064fe90b3f7844a38997c0b75051269f1d"
integrity sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==
is-function@^1.0.1:
version "1.0.2"
resolved "https://registry.yarnpkg.com/is-function/-/is-function-1.0.2.tgz#4f097f30abf6efadac9833b17ca5dc03f8144e08"
integrity sha512-lw7DUp0aWXYg+CBCN+JKkcE0Q2RayZnSvnZBlwgxHBQhqt5pZNVy4Ri7H9GmmXkdu7LUthszM+Tor1u/2iBcpQ==
is-glob@^4.0.1, is-glob@~4.0.1:
version "4.0.3"
resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-4.0.3.tgz#64f61e42cbbb2eec2071a9dac0b28ba1e65d5084"
@ -1564,6 +1997,22 @@ jest-worker@^27.4.5:
merge-stream "^2.0.0"
supports-color "^8.0.0"
jimp@^0.16.1:
version "0.16.1"
resolved "https://registry.yarnpkg.com/jimp/-/jimp-0.16.1.tgz#192f851a30e5ca11112a3d0aa53137659a78ca7a"
integrity sha512-+EKVxbR36Td7Hfd23wKGIeEyHbxShZDX6L8uJkgVW3ESA9GiTEPK08tG1XI2r/0w5Ch0HyJF5kPqF9K7EmGjaw==
dependencies:
"@babel/runtime" "^7.7.2"
"@jimp/custom" "^0.16.1"
"@jimp/plugins" "^0.16.1"
"@jimp/types" "^0.16.1"
regenerator-runtime "^0.13.3"
[email protected]:
version "0.4.2"
resolved "https://registry.yarnpkg.com/jpeg-js/-/jpeg-js-0.4.2.tgz#8b345b1ae4abde64c2da2fe67ea216a114ac279d"
integrity sha512-+az2gi/hvex7eLTMTlbRLOhH6P6WFdk2ITI8HJsaH2VqYO0I594zXSYEP+tf4FW+8Cy68ScDXoAsQdyQanv3sw==
js-stringify@^1.0.2:
version "1.0.2"
resolved "https://registry.yarnpkg.com/js-stringify/-/js-stringify-1.0.2.tgz#1736fddfd9724f28a3682adc6230ae7e4e9679db"
@ -1656,6 +2105,20 @@ limiter@^1.0.5:
resolved "https://registry.yarnpkg.com/limiter/-/limiter-1.1.5.tgz#8f92a25b3b16c6131293a0cc834b4a838a2aa7c2"
integrity sha512-FWWMIEOxz3GwUI4Ts/IvgVy6LPvoMPgjMdQ185nN6psJyBJ4yOpzqm695/h5umdLJg2vW3GR5iG11MAkR2AzJA==
load-bmfont@^1.3.1, load-bmfont@^1.4.0:
version "1.4.1"
resolved "https://registry.yarnpkg.com/load-bmfont/-/load-bmfont-1.4.1.tgz#c0f5f4711a1e2ccff725a7b6078087ccfcddd3e9"
integrity sha512-8UyQoYmdRDy81Brz6aLAUhfZLwr5zV0L3taTQ4hju7m6biuwiWiJXjPhBJxbUQJA8PrkvJ/7Enqmwk2sM14soA==
dependencies:
buffer-equal "0.0.1"
mime "^1.3.4"
parse-bmfont-ascii "^1.0.3"
parse-bmfont-binary "^1.0.5"
parse-bmfont-xml "^1.1.4"
phin "^2.9.1"
xhr "^2.0.1"
xtend "^4.0.0"
loader-runner@^4.2.0:
version "4.2.0"
resolved "https://registry.yarnpkg.com/loader-runner/-/loader-runner-4.2.0.tgz#d7022380d66d14c5fb1d496b89864ebcfd478384"
@ -1678,6 +2141,16 @@ locate-path@^5.0.0:
dependencies:
p-locate "^4.1.0"
lodash.defaults@^4.2.0:
version "4.2.0"
resolved "https://registry.yarnpkg.com/lodash.defaults/-/lodash.defaults-4.2.0.tgz#d09178716ffea4dde9e5fb7b37f6f0802274580c"
integrity sha1-0JF4cW/+pN3p5ft7N/bwgCJ0WAw=
lodash.isarguments@^3.1.0:
version "3.1.0"
resolved "https://registry.yarnpkg.com/lodash.isarguments/-/lodash.isarguments-3.1.0.tgz#2f573d85c6a24289ff00663b491c1d338ff3458a"
integrity sha1-L1c9hcaiQon/AGY7SRwdM4/zRYo=
lodash.isfinite@^3.3.2:
version "3.3.2"
resolved "https://registry.yarnpkg.com/lodash.isfinite/-/lodash.isfinite-3.3.2.tgz#fb89b65a9a80281833f0b7478b3a5104f898ebb3"
@ -1766,7 +2239,7 @@ [email protected]:
resolved "https://registry.yarnpkg.com/mime/-/mime-1.4.1.tgz#121f9ebc49e3766f311a76e1fa1c8003c4b03aa6"
integrity sha512-KI1+qOZu5DcW6wayYHSzR/tXKCDC5Om4s1z2QJjDULzLcmf3DvzS7oluY4HCTrc+9FiKmWUgeNLg7W3uIQvxtQ==
[email protected], mime@^1.4.1:
[email protected], mime@^1.3.4, mime@^1.4.1:
version "1.6.0"
resolved "https://registry.yarnpkg.com/mime/-/mime-1.6.0.tgz#32cd9e5c64553bd58d19a568af452acff04981b1"
integrity sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==
@ -1776,6 +2249,13 @@ mimic-fn@^2.1.0:
resolved "https://registry.yarnpkg.com/mimic-fn/-/mimic-fn-2.1.0.tgz#7ed2c2ccccaf84d3ffcb7a69b57711fc2083401b"
integrity sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==
min-document@^2.19.0:
version "2.19.0"
resolved "https://registry.yarnpkg.com/min-document/-/min-document-2.19.0.tgz#7bd282e3f5842ed295bb748cdd9f1ffa2c824685"
integrity sha1-e9KC4/WELtKVu3SM3Z8f+iyCRoU=
dependencies:
dom-walk "^0.1.0"
mini-css-extract-plugin@^2.6.0:
version "2.6.0"
resolved "https://registry.yarnpkg.com/mini-css-extract-plugin/-/mini-css-extract-plugin-2.6.0.tgz#578aebc7fc14d32c0ad304c2c34f08af44673f5e"
@ -1797,11 +2277,35 @@ minimatch@~3.0.2:
dependencies:
brace-expansion "^1.1.7"
minimist@^1.2.6:
version "1.2.6"
resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.6.tgz#8637a5b759ea0d6e98702cfb3a9283323c93af44"
integrity sha512-Jsjnk4bw3YJqYzbdyBiNsPWHPfO++UGG749Cxs6peCu5Xg4nrena6OVxOYxrQTqww0Jmwt+Ref8rggumkTLz9Q==
mitt@^1.1.3:
version "1.2.0"
resolved "https://registry.yarnpkg.com/mitt/-/mitt-1.2.0.tgz#cb24e6569c806e31bd4e3995787fe38a04fdf90d"
integrity sha512-r6lj77KlwqLhIUku9UWYes7KJtsczvolZkzp8hbaDPPaE24OmWl5s539Mytlj22siEQKosZ26qCBgda2PKwoJw==
mkdirp@^0.5.1:
version "0.5.6"
resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-0.5.6.tgz#7def03d2432dcae4ba1d611445c48396062255f6"
integrity sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==
dependencies:
minimist "^1.2.6"
moment-timezone@^0.5.x:
version "0.5.34"
resolved "https://registry.yarnpkg.com/moment-timezone/-/moment-timezone-0.5.34.tgz#a75938f7476b88f155d3504a9343f7519d9a405c"
integrity sha512-3zAEHh2hKUs3EXLESx/wsgw6IQdusOT8Bxm3D9UrHPQR7zlMmzwybC8zHEM1tQ4LJwP7fcxrWr8tuBg05fFCbg==
dependencies:
moment ">= 2.9.0"
"moment@>= 2.9.0":
version "2.29.2"
resolved "https://registry.yarnpkg.com/moment/-/moment-2.29.2.tgz#00910c60b20843bcba52d37d58c628b47b1f20e4"
integrity sha512-UgzG4rvxYpN15jgCmVJwac49h9ly9NurikMWGPdVxm8GZD6XjkKPxDTjQQ43gtGgnV3X0cAyWDdP2Wexoquifg==
[email protected]:
version "2.0.0"
resolved "https://registry.yarnpkg.com/ms/-/ms-2.0.0.tgz#5608aeadfc00be6c2901df5f9861788de0d597c8"
@ -1851,6 +2355,11 @@ normalize-path@^3.0.0, normalize-path@~3.0.0:
resolved "https://registry.yarnpkg.com/normalize-path/-/normalize-path-3.0.0.tgz#0dcd69ff23a1c9b11fd0978316644a0388216a65"
integrity sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==
notepack.io@~2.2.0:
version "2.2.0"
resolved "https://registry.yarnpkg.com/notepack.io/-/notepack.io-2.2.0.tgz#d7ea71d1cb90094f88c6f3c8d84277c2d0cd101c"
integrity sha512-9b5w3t5VSH6ZPosoYnyDONnUTF8o0UkBw7JLA6eBlYJWyGT1Q3vQa8Hmuj1/X6RYvHjjygBDgw6fJhe0JEojfw==
npm-run-path@^4.0.1:
version "4.0.1"
resolved "https://registry.yarnpkg.com/npm-run-path/-/npm-run-path-4.0.1.tgz#b7ecd1e5ed53da8e37a55e1c2269e0b97ed748ea"
@ -1863,6 +2372,11 @@ object-assign@^4, object-assign@^4.1.1:
resolved "https://registry.yarnpkg.com/object-assign/-/object-assign-4.1.1.tgz#2109adc7965887cfc05cbbd442cac8bfbb360863"
integrity sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=
omggif@^1.0.10, omggif@^1.0.9:
version "1.0.10"
resolved "https://registry.yarnpkg.com/omggif/-/omggif-1.0.10.tgz#ddaaf90d4a42f532e9e7cb3a95ecdd47f17c7b19"
integrity sha512-LMJTtvgc/nugXj0Vcrrs68Mn2D1r0zf630VNtqtpI1FEO7e+O9FP4gqs9AcnBaSEeoHIPm28u6qgPR0oyEpGSw==
on-finished@~2.3.0:
version "2.3.0"
resolved "https://registry.yarnpkg.com/on-finished/-/on-finished-2.3.0.tgz#20f1336481b083cd75337992a16971aa2d906947"
@ -1922,6 +2436,34 @@ p-try@^2.0.0:
resolved "https://registry.yarnpkg.com/p-try/-/p-try-2.2.0.tgz#cb2868540e313d61de58fafbe35ce9004d5540e6"
integrity sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==
pako@^1.0.5:
version "1.0.11"
resolved "https://registry.yarnpkg.com/pako/-/pako-1.0.11.tgz#6c9599d340d54dfd3946380252a35705a6b992bf"
integrity sha512-4hLB8Py4zZce5s4yd9XzopqwVv/yGNhV1Bl8NTmCq1763HeK2+EwVTv+leGeL13Dnh2wfbqowVPXCIO0z4taYw==
parse-bmfont-ascii@^1.0.3:
version "1.0.6"
resolved "https://registry.yarnpkg.com/parse-bmfont-ascii/-/parse-bmfont-ascii-1.0.6.tgz#11ac3c3ff58f7c2020ab22769079108d4dfa0285"
integrity sha1-Eaw8P/WPfCAgqyJ2kHkQjU36AoU=
parse-bmfont-binary@^1.0.5:
version "1.0.6"
resolved "https://registry.yarnpkg.com/parse-bmfont-binary/-/parse-bmfont-binary-1.0.6.tgz#d038b476d3e9dd9db1e11a0b0e53a22792b69006"
integrity sha1-0Di0dtPp3Z2x4RoLDlOiJ5K2kAY=
parse-bmfont-xml@^1.1.4:
version "1.1.4"
resolved "https://registry.yarnpkg.com/parse-bmfont-xml/-/parse-bmfont-xml-1.1.4.tgz#015319797e3e12f9e739c4d513872cd2fa35f389"
integrity sha512-bjnliEOmGv3y1aMEfREMBJ9tfL3WR0i0CKPj61DnSLaoxWR3nLrsQrEbCId/8rF4NyRF0cCqisSVXyQYWM+mCQ==
dependencies:
xml-parse-from-string "^1.0.0"
xml2js "^0.4.5"
parse-headers@^2.0.0:
version "2.0.5"
resolved "https://registry.yarnpkg.com/parse-headers/-/parse-headers-2.0.5.tgz#069793f9356a54008571eb7f9761153e6c770da9"
integrity sha512-ft3iAoLOB/MlwbNXgzy43SWGP6sQki2jQvAyBg/zDFAgr9bfNWZIUj42Kw2eJIl8kEi4PbgE6U1Zau/HwI75HA==
parse-node-version@^1.0.1:
version "1.0.1"
resolved "https://registry.yarnpkg.com/parse-node-version/-/parse-node-version-1.0.1.tgz#e2b5dbede00e7fa9bc363607f53327e8b073189b"
@ -1967,6 +2509,11 @@ [email protected]:
resolved "https://registry.yarnpkg.com/path-to-regexp/-/path-to-regexp-0.1.7.tgz#df604178005f522f15eb4490e7247a1bfaa67f8c"
integrity sha1-32BBeABfUi8V60SQ5yR6G/qmf4w=
phin@^2.9.1:
version "2.9.3"
resolved "https://registry.yarnpkg.com/phin/-/phin-2.9.3.tgz#f9b6ac10a035636fb65dfc576aaaa17b8743125c"
integrity sha512-CzFr90qM24ju5f88quFC/6qohjC144rehe5n6DH900lgXmUe86+xCKc10ev56gRKC4/BkHUoG4uSiQgBiIXwDA==
picocolors@^1.0.0:
version "1.0.0"
resolved "https://registry.yarnpkg.com/picocolors/-/picocolors-1.0.0.tgz#cb5bdc74ff3f51892236eaf79d68bc44564ab81c"
@ -1982,6 +2529,13 @@ pify@^4.0.1:
resolved "https://registry.yarnpkg.com/pify/-/pify-4.0.1.tgz#4b2cd25c50d598735c50292224fd8c6df41e3231"
integrity sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==
pixelmatch@^4.0.2:
version "4.0.2"
resolved "https://registry.yarnpkg.com/pixelmatch/-/pixelmatch-4.0.2.tgz#8f47dcec5011b477b67db03c243bc1f3085e8854"
integrity sha1-j0fc7FARtHe2fbA8JDvB8wheiFQ=
dependencies:
pngjs "^3.0.0"
pkg-dir@^4.2.0:
version "4.2.0"
resolved "https://registry.yarnpkg.com/pkg-dir/-/pkg-dir-4.2.0.tgz#f099133df7ede422e81d1d8448270eeb3e4261f3"
@ -1989,6 +2543,11 @@ pkg-dir@^4.2.0:
dependencies:
find-up "^4.0.0"
pngjs@^3.0.0, pngjs@^3.3.3:
version "3.4.0"
resolved "https://registry.yarnpkg.com/pngjs/-/pngjs-3.4.0.tgz#99ca7d725965fb655814eaf65f38f12bbdbf555f"
integrity sha512-NCrCHhWmnQklfH4MtJMRjZ2a8c80qXeMlQMv2uVp9ISJMTt562SbGd6n2oq0PaPgKm7Z6pL9E2UlLIhC+SHL3w==
[email protected]:
version "2.1.1"
resolved "https://registry.yarnpkg.com/portscanner/-/portscanner-2.1.1.tgz#eabb409e4de24950f5a2a516d35ae769343fbb96"
@ -2047,6 +2606,11 @@ postcss@^8.4.7:
picocolors "^1.0.0"
source-map-js "^1.0.2"
process@^0.11.10:
version "0.11.10"
resolved "https://registry.yarnpkg.com/process/-/process-0.11.10.tgz#7332300e840161bda3e69a1d1d91a7d4bc16f182"
integrity sha1-czIwDoQBYb2j5podHZGn1LwW8YI=
promise@^7.0.1:
version "7.3.1"
resolved "https://registry.yarnpkg.com/promise/-/promise-7.3.1.tgz#064b72602b18f90f29192b8b1bc418ffd1ebd3bf"
@ -2197,6 +2761,11 @@ range-parser@^1.2.1, range-parser@~1.2.0, range-parser@~1.2.1:
resolved "https://registry.yarnpkg.com/range-parser/-/range-parser-1.2.1.tgz#3cf37023d199e1c24d1a55b84800c2f3e6468031"
integrity sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==
rate-limiter-flexible@^2.3.6:
version "2.3.6"
resolved "https://registry.yarnpkg.com/rate-limiter-flexible/-/rate-limiter-flexible-2.3.6.tgz#b1a2549dca91069c8a33d57c08a27262c0356c60"
integrity sha512-8DVFOe89rreyut/vzwBI7vgXJynyYoYnH5XogtAKs0F/neAbCTTglXxSJ7fZeZamcFXZDvMidCBvps4KM+1srw==
[email protected]:
version "2.4.3"
resolved "https://registry.yarnpkg.com/raw-body/-/raw-body-2.4.3.tgz#8f80305d11c2a0a545c2d9d89d7a0286fcead43c"
@ -2250,6 +2819,23 @@ rechoir@^0.7.0:
dependencies:
resolve "^1.9.0"
redis-errors@^1.0.0, redis-errors@^1.2.0:
version "1.2.0"
resolved "https://registry.yarnpkg.com/redis-errors/-/redis-errors-1.2.0.tgz#eb62d2adb15e4eaf4610c04afe1529384250abad"
integrity sha1-62LSrbFeTq9GEMBK/hUpOEJQq60=
redis-parser@^3.0.0:
version "3.0.0"
resolved "https://registry.yarnpkg.com/redis-parser/-/redis-parser-3.0.0.tgz#b66d828cdcafe6b4b8a428a7def4c6bcac31c8b4"
integrity sha1-tm2CjNyv5rS4pCin3vTGvKwxyLQ=
dependencies:
redis-errors "^1.0.0"
regenerator-runtime@^0.13.3, regenerator-runtime@^0.13.4:
version "0.13.9"
resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.13.9.tgz#8925742a98ffd90814988d7566ad30ca3b263b52"
integrity sha512-p3VT+cOEgxFsRRA9X4lkI1E+k2/CtnKtU4gcxyaCUreilL/vqI6CdZ3wxVUx3UOUg+gnUOQQcRI7BmSI656MYA==
require-directory@^2.1.1:
version "2.1.1"
resolved "https://registry.yarnpkg.com/require-directory/-/require-directory-2.1.1.tgz#8c64ad5fd30dab1c976e2344ffe7f792a6a6df42"
@ -2321,7 +2907,7 @@ safe-stable-stringify@^2.3.1:
resolved "https://registry.yarnpkg.com/safer-buffer/-/safer-buffer-2.1.2.tgz#44fa161b0187b9549dd84bb91802f9bd8385cd6a"
integrity sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==
sax@^1.2.4:
sax@>=0.6.0, sax@^1.2.4:
version "1.2.4"
resolved "https://registry.yarnpkg.com/sax/-/sax-1.2.4.tgz#2816234e2378bddc4e5354fab5caa895df7100d9"
integrity sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw==
@ -2481,7 +3067,7 @@ simple-swizzle@^0.2.2:
dependencies:
is-arrayish "^0.3.1"
socket.io-adapter@~2.3.3:
socket.io-adapter@~2.3.0, socket.io-adapter@~2.3.3:
version "2.3.3"
resolved "https://registry.yarnpkg.com/socket.io-adapter/-/socket.io-adapter-2.3.3.tgz#4d6111e4d42e9f7646e365b4f578269821f13486"
integrity sha512-Qd/iwn3VskrpNO60BeRyCyr8ZWw9CPZyitW4AQwmRZ8zCiyDiL+znRnWX6tDHXnWn1sJrM1+b6Mn6wEDJJ4aYQ==
@ -2555,6 +3141,11 @@ [email protected]:
resolved "https://registry.yarnpkg.com/stack-trace/-/stack-trace-0.0.10.tgz#547c70b347e8d32b4e108ea1a2a159e5fdde19c0"
integrity sha1-VHxws0fo0ytOEI6hoqFZ5f3eGcA=
standard-as-callback@^2.1.0:
version "2.1.0"
resolved "https://registry.yarnpkg.com/standard-as-callback/-/standard-as-callback-2.1.0.tgz#8953fc05359868a77b5b9739a665c5977bb7df45"
integrity sha512-qoRRSyROncaz1z0mvYqIE4lCd9p2R90i6GxW3uZv5ucSu8tU7B5HXUP1gG8pVZsYNVaXjk8ClXHPttLyxAL48A==
[email protected]:
version "2.0.1"
resolved "https://registry.yarnpkg.com/statuses/-/statuses-2.0.1.tgz#55cb000ccf1d48728bd23c685a063998cf1a1b63"
@ -2701,6 +3292,16 @@ tfunk@^4.0.0:
chalk "^1.1.3"
dlv "^1.1.3"
timm@^1.6.1:
version "1.7.1"
resolved "https://registry.yarnpkg.com/timm/-/timm-1.7.1.tgz#96bab60c7d45b5a10a8a4d0f0117c6b7e5aff76f"
integrity sha512-IjZc9KIotudix8bMaBW6QvMuq64BrJWFs1+4V0lXwWGQZwH+LnX87doAYhem4caOEusRP9/g6jVDQmZ8XOk1nw==
tinycolor2@^1.4.1:
version "1.4.2"
resolved "https://registry.yarnpkg.com/tinycolor2/-/tinycolor2-1.4.2.tgz#3f6a4d1071ad07676d7fa472e1fac40a719d8803"
integrity sha512-vJhccZPs965sV/L2sU4oRQVAos0pQXwsvTLkWYdqJ+a8Q5kPFzJTuOFwy7UniPli44NKQGAglksjvOcpo95aZA==
to-fast-properties@^2.0.0:
version "2.0.0"
resolved "https://registry.yarnpkg.com/to-fast-properties/-/to-fast-properties-2.0.0.tgz#dc5e698cbd079265bc73e0377681a4e4e83f616e"
@ -2746,6 +3347,11 @@ [email protected]:
resolved "https://registry.yarnpkg.com/ua-parser-js/-/ua-parser-js-1.0.2.tgz#e2976c34dbfb30b15d2c300b2a53eac87c57a775"
integrity sha512-00y/AXhx0/SsnI51fTc0rLRmafiGOM4/O+ny10Ps7f+j/b8p/ZY11ytMgznXkOVo4GQ+KwQG5UQLkLGirsACRg==
[email protected]:
version "0.0.3"
resolved "https://registry.yarnpkg.com/uid2/-/uid2-0.0.3.tgz#483126e11774df2f71b8b639dcd799c376162b82"
integrity sha1-SDEm4Rd03y9xuLY53NeZw3YWK4I=
universalify@^0.1.0:
version "0.1.2"
resolved "https://registry.yarnpkg.com/universalify/-/universalify-0.1.2.tgz#b646f69be3942dabcecc9d6639c80dc105efaa66"
@ -2763,6 +3369,13 @@ uri-js@^4.2.2:
dependencies:
punycode "^2.1.0"
utif@^2.0.1:
version "2.0.1"
resolved "https://registry.yarnpkg.com/utif/-/utif-2.0.1.tgz#9e1582d9bbd20011a6588548ed3266298e711759"
integrity sha512-Z/S1fNKCicQTf375lIP9G8Sa1H/phcysstNrrSdZKj1f9g58J4NMgb5IgiEZN9/nLMPDwF0W7hdOe9Qq2IYoLg==
dependencies:
pako "^1.0.5"
util-deprecate@^1.0.1, util-deprecate@^1.0.2:
version "1.0.2"
resolved "https://registry.yarnpkg.com/util-deprecate/-/util-deprecate-1.0.2.tgz#450d4dc9fa70de732762fbd2d4a28981419a0ccf"
@ -2773,6 +3386,11 @@ [email protected]:
resolved "https://registry.yarnpkg.com/utils-merge/-/utils-merge-1.0.1.tgz#9f95710f50a267947b2ccc124741c1028427e713"
integrity sha1-n5VxD1CiZ5R7LMwSR0HBAoQn5xM=
uuid@^8.3.2:
version "8.3.2"
resolved "https://registry.yarnpkg.com/uuid/-/uuid-8.3.2.tgz#80d5b5ced271bb9af6c445f21a1a04c606cefbe2"
integrity sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==
vary@^1, vary@~1.1.2:
version "1.1.2"
resolved "https://registry.yarnpkg.com/vary/-/vary-1.1.2.tgz#2299f02c6ded30d4a5961b0b9f74524a18f634fc"
@ -2929,11 +3547,44 @@ ws@~8.2.3:
resolved "https://registry.yarnpkg.com/ws/-/ws-8.2.3.tgz#63a56456db1b04367d0b721a0b80cae6d8becbba"
integrity sha512-wBuoj1BDpC6ZQ1B7DWQBYVLphPWkm8i9Y0/3YdHjHKHiohOJ1ws+3OccDWtH+PoC9DZD5WOTrJvNbWvjS6JWaA==
xhr@^2.0.1:
version "2.6.0"
resolved "https://registry.yarnpkg.com/xhr/-/xhr-2.6.0.tgz#b69d4395e792b4173d6b7df077f0fc5e4e2b249d"
integrity sha512-/eCGLb5rxjx5e3mF1A7s+pLlR6CGyqWN91fv1JgER5mVWg1MZmlhBvy9kjcsOdRk8RrIujotWyJamfyrp+WIcA==
dependencies:
global "~4.4.0"
is-function "^1.0.1"
parse-headers "^2.0.0"
xtend "^4.0.0"
xml-parse-from-string@^1.0.0:
version "1.0.1"
resolved "https://registry.yarnpkg.com/xml-parse-from-string/-/xml-parse-from-string-1.0.1.tgz#a9029e929d3dbcded169f3c6e28238d95a5d5a28"
integrity sha1-qQKekp09vN7RafPG4oI42VpdWig=
xml2js@^0.4.5:
version "0.4.23"
resolved "https://registry.yarnpkg.com/xml2js/-/xml2js-0.4.23.tgz#a0c69516752421eb2ac758ee4d4ccf58843eac66"
integrity sha512-ySPiMjM0+pLDftHgXY4By0uswI3SPKLDw/i3UXbnO8M/p28zqexCUoPmQFrYD+/1BzhGJSs2i1ERWKJAtiLrug==
dependencies:
sax ">=0.6.0"
xmlbuilder "~11.0.0"
xmlbuilder@~11.0.0:
version "11.0.1"
resolved "https://registry.yarnpkg.com/xmlbuilder/-/xmlbuilder-11.0.1.tgz#be9bae1c8a046e76b31127726347d0ad7002beb3"
integrity sha512-fDlsI/kFEx7gLvbecc0/ohLG50fugQp8ryHzMTuW9vSa1GJ0XYWKnhsUx7oie3G98+r56aTQIUB4kht42R3JvA==
xmlhttprequest-ssl@~2.0.0:
version "2.0.0"
resolved "https://registry.yarnpkg.com/xmlhttprequest-ssl/-/xmlhttprequest-ssl-2.0.0.tgz#91360c86b914e67f44dce769180027c0da618c67"
integrity sha512-QKxVRxiRACQcVuQEYFsI1hhkrMlrXHPegbbd1yn9UHOmRxY+si12nQYzri3vbzt8VdTTRviqcKxcyllFas5z2A==
xtend@^4.0.0:
version "4.0.2"
resolved "https://registry.yarnpkg.com/xtend/-/xtend-4.0.2.tgz#bb72779f5fa465186b1f438f674fa347fdb5db54"
integrity sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==
y18n@^5.0.5:
version "5.0.8"
resolved "https://registry.yarnpkg.com/y18n/-/y18n-5.0.8.tgz#7f4934d0f7ca8c56f95314939ddcd2dd91ce1d55"

Loading…
Cancel
Save