diff --git a/src/client/images/abilityIcons.png b/src/client/images/abilityIcons.png index 0f6de171..9885cd34 100644 Binary files a/src/client/images/abilityIcons.png and b/src/client/images/abilityIcons.png differ diff --git a/src/client/images/abilityIcons.pyxel b/src/client/images/abilityIcons.pyxel index 8ee1518c..a5ef4277 100644 Binary files a/src/client/images/abilityIcons.pyxel and b/src/client/images/abilityIcons.pyxel differ diff --git a/src/client/images/characters.png b/src/client/images/characters.png index 0c07522b..3c12b312 100644 Binary files a/src/client/images/characters.png and b/src/client/images/characters.png differ diff --git a/src/client/images/characters.pyxel b/src/client/images/characters.pyxel index 0badcd83..8e0267fb 100644 Binary files a/src/client/images/characters.pyxel and b/src/client/images/characters.pyxel differ diff --git a/src/client/js/components/components.js b/src/client/js/components/components.js index e0b343f6..8a223654 100644 --- a/src/client/js/components/components.js +++ b/src/client/js/components/components.js @@ -31,7 +31,7 @@ define([ if (cpn.type) templates.push(tpl); if (cpn.extends) - extenders.push(tpl); + extenders.push({ extends: cpn.extends, tpl }); res(); }); @@ -49,7 +49,7 @@ define([ templates.forEach(t => { const extensions = extenders.filter(e => e.extends === t.type); - extensions.forEach(e => $.extend(true, t, e)); + extensions.forEach(e => $.extend(true, t, e.tpl)); t.eventList = {}; t.hookEvent = hookEvent; diff --git a/src/client/js/misc/physics.js b/src/client/js/misc/physics.js index 3a24bd17..f3b49199 100644 --- a/src/client/js/misc/physics.js +++ b/src/client/js/misc/physics.js @@ -1,7 +1,9 @@ define([ - 'js/misc/distanceToPolygon' + 'js/misc/distanceToPolygon', + 'js/system/events' ], function ( - distanceToPolygon + distanceToPolygon, + events ) { return { grid: null, @@ -10,6 +12,8 @@ define([ height: 0, init: function (collisionMap) { + events.on('resetPhysics', this.reset.bind(this)); + this.width = collisionMap.length; this.height = collisionMap[0].length; @@ -22,6 +26,13 @@ define([ } }, + reset: function () { + this.width = 0; + this.height = 0; + + this.grid = []; + }, + isTileBlocking: function (x, y, mob, obj) { if ((x < 0) || (y < 0) || (x >= this.width) | (y >= this.height)) return true; diff --git a/src/client/js/misc/statTranslations.js b/src/client/js/misc/statTranslations.js index 90f4c1d0..ba7d86c1 100644 --- a/src/client/js/misc/statTranslations.js +++ b/src/client/js/misc/statTranslations.js @@ -52,7 +52,7 @@ define([ attackSpeed: 'attack speed', castSpeed: 'cast speed', - lifeOnHit: 'life gained on hit', + lifeOnHit: 'life gained on dealing physical damage', auraReserveMultiplier: 'aura mana reservation multiplier', diff --git a/src/client/js/objects/objBase.js b/src/client/js/objects/objBase.js index e66f480b..c84747ec 100644 --- a/src/client/js/objects/objBase.js +++ b/src/client/js/objects/objBase.js @@ -174,7 +174,7 @@ define([ offEvents: function () { if (this.pather) - this.pather.onDeath(); + this.pather.resetPath(); for (let e in this.eventCallbacks) this.eventCallbacks[e].forEach(c => events.off(e, c)); diff --git a/src/client/js/objects/objects.js b/src/client/js/objects/objects.js index fdc98bcd..33ffbbd2 100644 --- a/src/client/js/objects/objects.js +++ b/src/client/js/objects/objects.js @@ -15,11 +15,15 @@ define([ objects: [], init: function () { - events.on('onGetObject', this.onGetObject.bind(this)); - events.on('onRezone', this.onRezone.bind(this)); events.on('onChangeHoverTile', this.getLocation.bind(this)); - events.on('onTilesVisible', this.onTilesVisible.bind(this)); - events.on('onToggleNameplates', this.onToggleNameplates.bind(this)); + + [ + 'onGetObject', + 'onTilesVisible', + 'onToggleNameplates', + 'destroyAllObjects' + ] + .forEach(e => events.on(e, this[e].bind(this))); }, getLocation: function (x, y) { @@ -87,20 +91,14 @@ define([ return list[fromIndex]; }, - onRezone: function (oldZone) { - let objects = this.objects; - let oLen = objects.length; - for (let i = 0; i < oLen; i++) { - let o = objects[i]; + destroyAllObjects: function () { + this.objects.forEach(o => { + o.destroy(); + }); - if (oldZone === null) - o.destroy(); - else if (o.zoneId === oldZone) - o.destroy(); - } + this.objects.length = 0; - if (window.player) - window.player.offEvents(); + window?.player?.offEvents(); }, onGetObject: function (obj) { diff --git a/src/client/js/rendering/helpers/resetRenderer.js b/src/client/js/rendering/helpers/resetRenderer.js new file mode 100644 index 00000000..99fc8209 --- /dev/null +++ b/src/client/js/rendering/helpers/resetRenderer.js @@ -0,0 +1,45 @@ +define([ + 'js/rendering/spritePool' +], function ( + spritePool +) { + return function () { + let map = this.map; + let w = this.w = map.length; + let h = this.h = map[0].length; + + this.stage.removeChild(this.layers.hiders); + this.layers.hiders = new PIXI.Container(); + this.layers.hiders.layer = 'hiders'; + this.stage.addChild(this.layers.hiders); + + let container = this.layers.tileSprites; + this.stage.removeChild(container); + + this.layers.tileSprites = container = new PIXI.Container(); + container.layer = 'tiles'; + this.stage.addChild(container); + + this.stage.children.sort((a, b) => { + if (a.layer === 'hiders') + return 1; + else if (b.layer === 'hiders') + return -1; + else if (a.layer === 'tiles') + return -1; + else if (b.layer === 'tiles') + return 1; + return 0; + }); + + spritePool.clean(); + + this.sprites = _.get2dArray(w, h, 'array'); + + this.map = []; + this.w = 0; + this.h = 0; + + delete this.moveTo; + }; +}); diff --git a/src/client/js/rendering/renderer.js b/src/client/js/rendering/renderer.js index c8ef3486..71a567fa 100644 --- a/src/client/js/rendering/renderer.js +++ b/src/client/js/rendering/renderer.js @@ -8,7 +8,8 @@ define([ 'js/rendering/shaders/outline', 'js/rendering/spritePool', 'js/system/globals', - 'js/rendering/renderLoginBackground' + 'js/rendering/renderLoginBackground', + 'js/rendering/helpers/resetRenderer' ], function ( resources, events, @@ -19,7 +20,8 @@ define([ shaderOutline, spritePool, globals, - renderLoginBackground + renderLoginBackground, + resetRenderer ) { const mRandom = Math.random.bind(Math); @@ -84,6 +86,7 @@ define([ events.on('onGetMap', this.onGetMap.bind(this)); events.on('onToggleFullscreen', this.toggleScreen.bind(this)); events.on('onMoveSpeedChange', this.adaptCameraMoveSpeed.bind(this)); + events.on('resetRenderer', resetRenderer.bind(this)); this.width = $('body').width(); this.height = $('body').height(); diff --git a/src/client/js/system/client.js b/src/client/js/system/client.js index 4e92ec57..ed28c285 100644 --- a/src/client/js/system/client.js +++ b/src/client/js/system/client.js @@ -18,7 +18,38 @@ define([ this.socket.on('event', this.onEvent.bind(this)); this.socket.on('events', this.onEvents.bind(this)); this.socket.on('dc', this.onDisconnect.bind(this)); + + Object.entries(this.processAction).forEach(([k, v]) => { + this.processAction[k] = v.bind(this); + }); + }, + + onRezoneStart: function () { + //Fired for mods to listen to + events.emit('rezoneStart'); + + events.emit('destroyAllObjects'); + events.emit('resetRenderer'); + events.emit('resetPhysics'); + events.emit('clearUis'); + + client.request({ + threadModule: 'rezoneManager', + method: 'clientAck', + data: {} + }); + }, + + onGetMap: function ([msg]) { + events.emit('onGetMap', msg); + + client.request({ + threadModule: 'instancer', + method: 'clientAck', + data: {} + }); }, + onConnected: function (onReady) { if (this.doneConnect) this.onDisconnect(); @@ -28,45 +59,67 @@ define([ if (onReady) onReady(); }, + onDisconnect: function () { window.location = window.location; }, + onHandshake: function () { events.emit('onHandshake'); this.socket.emit('handshake'); }, + request: function (msg) { this.socket.emit('request', msg, msg.callback); }, - onEvent: function (response) { - events.emit(response.event, response.data); - }, - onEvents: function (response) { - //If we get objects, self needs to be first - // otherwise we might create the object (setting his position or attack animation) - // before instantiating it - let oList = response.onGetObject; - if (oList) { - let prepend = oList.filter(o => o.self); - oList.spliceWhere(o => prepend.some(p => p === o)); - oList.unshift.apply(oList, prepend); - } - for (let e in response) { - let r = response[e]; + processAction: { + default: function (eventName, msgs) { + msgs.forEach(m => events.emit(eventName, m)); + }, - //Certain messages expect to be performed last (because the object they act on hasn't been created when they get queued) - r.sort(function (a, b) { - if (a.performLast) - return 1; - else if (b.performLast) - return -1; - return 0; - }); + rezoneStart: function (eventName, msgs) { + events.emit('rezoneStart'); + + events.emit('destroyAllObjects'); + events.emit('resetRenderer'); + events.emit('resetPhysics'); + events.emit('clearUis'); - r.forEach(function (o) { - events.emit(e, o); + client.request({ + threadModule: 'rezoneManager', + method: 'clientAck', + data: {} }); + }, + + getMap: function (eventName, msgs) { + events.emit('onBuildIngameUis'); + events.emit('onGetMap', msgs[0]); + }, + + onGetObject: function (eventName, msgs) { + const prepend = msgs.filter(o => o.self); + msgs.spliceWhere(o => prepend.some(p => p === o)); + msgs.unshift.apply(msgs, prepend); + + this.processAction.default(eventName, msgs); + } + }, + + onEvent: function ({ event: eventName, data: eventData }) { + const handler = this.processAction[eventName] || this.processAction.default; + + handler(eventName, [eventData]); + }, + + onEvents: function (response) { + for (let eventName in response) { + const eventMsgs = response[eventName]; + + const handler = this.processAction[eventName] || this.processAction.default; + + handler(eventName, eventMsgs); } } }; diff --git a/src/client/package.json b/src/client/package.json index 6d51d70b..ce64147b 100644 --- a/src/client/package.json +++ b/src/client/package.json @@ -1,6 +1,6 @@ { "name": "isleward_client", - "version": "0.10.5", + "version": "0.10.6", "description": "isleward", "dependencies": { }, diff --git a/src/client/ui/factory.js b/src/client/ui/factory.js index 282e066a..9d02b76a 100644 --- a/src/client/ui/factory.js +++ b/src/client/ui/factory.js @@ -14,12 +14,13 @@ define([ return { uis: [], root: '', + ingameUisBuilt: false, init: function (root) { if (root) this.root = root + '/'; - events.on('onEnterGame', this.onEnterGame.bind(this)); + events.on('onBuildIngameUis', this.onBuildIngameUis.bind(this)); events.on('onUiKeyDown', this.onUiKeyDown.bind(this)); events.on('onResize', this.onResize.bind(this)); @@ -31,39 +32,40 @@ define([ }); }, - onEnterGame: async function () { - events.clearQueue(); + onBuildIngameUis: async function () { + if (!this.ingameUisBuilt) { + events.clearQueue(); - await Promise.all( - globals.clientConfig.uiList.map(u => { - const uiType = u.path ? u.path.split('/').pop() : u; + await Promise.all( + globals.clientConfig.uiList.map(u => { + const uiType = u.path ? u.path.split('/').pop() : u; - return new Promise(res => { - const doneCheck = () => { - const isDone = this.uis.some(ui => ui.type === uiType); - if (isDone) { - res(); + return new Promise(res => { + const doneCheck = () => { + const isDone = this.uis.some(ui => ui.type === uiType); + if (isDone) { + res(); - return; - } + return; + } - setTimeout(doneCheck, 100); - }; + setTimeout(doneCheck, 100); + }; - this.build(uiType, { path: u.path }); + this.build(uiType, { path: u.path }); - doneCheck(); - }); - }) - ); + doneCheck(); + }); + }) + ); + + this.ingameUisBuilt = true; + } client.request({ - cpn: 'player', - method: 'performAction', - data: { - cpn: 'player', - method: 'notifyServerUiReady' - } + threadModule: 'instancer', + method: 'clientAck', + data: {} }); }, @@ -169,6 +171,16 @@ define([ } }, + exitGame: function () { + $('[class^="ui"]:not(.ui-container)').toArray().forEach(el => { + let ui = $(el).data('ui'); + if (ui && ui.destroy) + ui.destroy(); + }); + + this.ingameUisBuilt = false; + }, + getUi: function (type) { return this.uis.find(u => u.type === type); } diff --git a/src/client/ui/templates/buffs/buffs.js b/src/client/ui/templates/buffs/buffs.js deleted file mode 100644 index 73340c51..00000000 --- a/src/client/ui/templates/buffs/buffs.js +++ /dev/null @@ -1,59 +0,0 @@ -define([ - 'js/system/events', - 'html!ui/templates/buffs/template', - 'css!ui/templates/buffs/styles', - 'html!ui/templates/buffs/templateBuff' -], function ( - events, - template, - styles, - templateBuff -) { - let icons = { - stunned: [4, 0], - regenHp: [3, 1], - regenMana: [4, 1], - swiftness: [5, 1], - stealth: [7, 0], - reflectDamage: [2, 1], - holyVengeance: [4, 0] - }; - - return { - tpl: template, - - icons: {}, - - postRender: function () { - this.onEvent('onGetBuff', this.onGetBuff.bind(this)); - this.onEvent('onRemoveBuff', this.onRemoveBuff.bind(this)); - }, - - onGetBuff: function (buff) { - let icon = icons[buff.type]; - if (!icon) - return; - - let imgX = icon[0] * -32; - let imgY = icon[1] * -32; - - let html = templateBuff; - let el = $(html).appendTo(this.el) - .find('.inner') - .css({ - background: 'url(../../../images/statusIcons.png) ' + imgX + 'px ' + imgY + 'px' - }); - - this.icons[buff.id] = el.parent(); - }, - - onRemoveBuff: function (buff) { - let el = this.icons[buff.id]; - if (!el) - return; - - el.remove(); - delete this.icons[buff.id]; - } - }; -}); diff --git a/src/client/ui/templates/buffs/styles.css b/src/client/ui/templates/buffs/styles.css deleted file mode 100644 index 00ca7319..00000000 --- a/src/client/ui/templates/buffs/styles.css +++ /dev/null @@ -1 +0,0 @@ -.uiBuffs{position:absolute;left:16px;top:104px}.uiBuffs .icon{width:40px;height:40px;padding:4px;background-color:rgba(49,33,54,.75);margin-right:16px;float:left}.uiBuffs .icon .inner{width:32px;height:32px;background:url(../../../images/statusIcons.png) 0 0}.mobile .uiBuffs{left:316px;top:10px} \ No newline at end of file diff --git a/src/client/ui/templates/buffs/template.html b/src/client/ui/templates/buffs/template.html deleted file mode 100644 index 6201230f..00000000 --- a/src/client/ui/templates/buffs/template.html +++ /dev/null @@ -1 +0,0 @@ -
\ No newline at end of file diff --git a/src/client/ui/templates/characters/characters.js b/src/client/ui/templates/characters/characters.js index 139c2c9f..cb236b13 100644 --- a/src/client/ui/templates/characters/characters.js +++ b/src/client/ui/templates/characters/characters.js @@ -97,7 +97,6 @@ define([ onPlay: function () { this.el.removeClass('disabled'); this.destroy(); - events.emit('onEnterGame'); }, onNewClick: function () { diff --git a/src/client/ui/templates/createCharacter/createCharacter.js b/src/client/ui/templates/createCharacter/createCharacter.js index 56a9508a..f91d6e64 100644 --- a/src/client/ui/templates/createCharacter/createCharacter.js +++ b/src/client/ui/templates/createCharacter/createCharacter.js @@ -151,7 +151,6 @@ define([ if (!result) { this.clear(); this.destroy(); - events.emit('onEnterGame'); } else this.el.find('.message').html(result); }, diff --git a/src/client/ui/templates/death/death.js b/src/client/ui/templates/death/death.js index 0d132c46..f2a53b3b 100644 --- a/src/client/ui/templates/death/death.js +++ b/src/client/ui/templates/death/death.js @@ -20,14 +20,14 @@ define([ this.onEvent('onPermadeath', this.onPermadeath.bind(this)); this.find('.btn-logout').on('click', this.onLogout.bind(this)); - this.find('.btn-respawn').on('click', this.onRespawn.bind(this)); + this.find('.btn-respawn').on('click', this.performRespawn.bind(this)); }, onLogout: function () { $('.uiMainMenu').data('ui').charSelect(); }, - onRespawn: function () { + performRespawn: function () { events.emit('onHideOverlay', this.el); this.hide(true); diff --git a/src/client/ui/templates/effects/effects.js b/src/client/ui/templates/effects/effects.js new file mode 100644 index 00000000..09128752 --- /dev/null +++ b/src/client/ui/templates/effects/effects.js @@ -0,0 +1,54 @@ +define([ + 'html!ui/templates/effects/template', + 'css!ui/templates/effects/styles', + 'html!ui/templates/effects/templateEffect' +], function ( + template, + styles, + templateEffect +) { + return { + tpl: template, + + icons: {}, + + postRender: function () { + this.onEvent('onGetEffectIcon', this.onGetEffectIcon.bind(this)); + this.onEvent('onRemoveEffectIcon', this.onRemoveEffectIcon.bind(this)); + }, + + buildIcon: function (config) { + let { icon, url } = config; + + if (!url) + url = '../../../images/statusIcons.png'; + + let imgX = icon[0] * -32; + let imgY = icon[1] * -32; + + let html = templateEffect; + let el = $(html).appendTo(this.el) + .find('.inner') + .css({ + background: `url(${url}) ${imgX}px ${imgY}px` + }); + + return el.parent(); + }, + + onGetEffectIcon: function (config) { + let el = this.buildIcon(config); + + this.icons[config.id] = el; + }, + + onRemoveEffectIcon: function (config) { + let el = this.icons[config.id]; + if (!el) + return; + + el.remove(); + delete this.icons[config.id]; + } + }; +}); diff --git a/src/client/ui/templates/effects/styles.css b/src/client/ui/templates/effects/styles.css new file mode 100644 index 00000000..507b50d1 --- /dev/null +++ b/src/client/ui/templates/effects/styles.css @@ -0,0 +1 @@ +.uiEffects{position:absolute;left:16px;top:104px}.uiEffects .icon{width:40px;height:40px;padding:4px;background-color:rgba(49,33,54,.75);margin-right:16px;float:left}.uiEffects .icon .inner{width:32px;height:32px;background:url(../../../images/statusIcons.png) 0 0}.mobile .uiEffects{left:316px;top:10px} \ No newline at end of file diff --git a/src/client/ui/templates/buffs/styles.less b/src/client/ui/templates/effects/styles.less similarity index 91% rename from src/client/ui/templates/buffs/styles.less rename to src/client/ui/templates/effects/styles.less index 3ec1066f..104844d5 100644 --- a/src/client/ui/templates/buffs/styles.less +++ b/src/client/ui/templates/effects/styles.less @@ -1,6 +1,6 @@ @import "../../../css/colors.less"; -.uiBuffs { +.uiEffects { position: absolute; left: 16px; top: 104px; @@ -23,7 +23,7 @@ } -.mobile .uiBuffs { +.mobile .uiEffects { left: 316px; top: 10px; } diff --git a/src/client/ui/templates/effects/template.html b/src/client/ui/templates/effects/template.html new file mode 100644 index 00000000..886b4c6c --- /dev/null +++ b/src/client/ui/templates/effects/template.html @@ -0,0 +1 @@ +
\ No newline at end of file diff --git a/src/client/ui/templates/buffs/templateBuff.html b/src/client/ui/templates/effects/templateEffect.html similarity index 56% rename from src/client/ui/templates/buffs/templateBuff.html rename to src/client/ui/templates/effects/templateEffect.html index 1fcd0b63..836047bf 100644 --- a/src/client/ui/templates/buffs/templateBuff.html +++ b/src/client/ui/templates/effects/templateEffect.html @@ -1,3 +1,3 @@ -
+
diff --git a/src/client/ui/templates/events/events.js b/src/client/ui/templates/events/events.js index 1a7c8ba2..7aa870c3 100644 --- a/src/client/ui/templates/events/events.js +++ b/src/client/ui/templates/events/events.js @@ -26,7 +26,7 @@ define([ this.find('.btnCollapse').on('click', this.toggleButtons.bind(this)); } - this.onEvent('onRezone', this.onRezone.bind(this)); + this.onEvent('clearUis', this.clear.bind(this)); this.onEvent('onObtainEvent', this.onObtainEvent.bind(this)); this.onEvent('onRemoveEvent', this.onRemoveEvent.bind(this)); @@ -37,7 +37,7 @@ define([ this.onToggleEventsVisibility(config.showEvents); }, - onRezone: function () { + clear: function () { this.list = []; this.el.find('.list').empty(); }, diff --git a/src/client/ui/templates/inventory/inventory.js b/src/client/ui/templates/inventory/inventory.js index 1669071c..3427767c 100644 --- a/src/client/ui/templates/inventory/inventory.js +++ b/src/client/ui/templates/inventory/inventory.js @@ -328,17 +328,17 @@ define([ ctxConfig.push(menuItems.divider); } - if ((!item.eq) && (!item.active)) { - if (!item.quest) { - if ((window.player.stash.active) && (!item.noStash)) - ctxConfig.push(menuItems.stash); + if (!item.eq && !item.active && !item.quest) { + const isAtStash = window.player.serverActions.hasAction('openStash'); - if (!item.noDrop) - ctxConfig.push(menuItems.drop); + if (isAtStash && !item.noStash) + ctxConfig.push(menuItems.stash); - if ((!item.material) && (!item.noSalvage)) - ctxConfig.push(menuItems.salvage); - } + if (!item.noDrop) + ctxConfig.push(menuItems.drop); + + if (!item.material && !item.noSalvage) + ctxConfig.push(menuItems.salvage); } if (item.quantity > 1 && !item.quest) diff --git a/src/client/ui/templates/login/template.html b/src/client/ui/templates/login/template.html index 4767c033..d62be9ef 100644 --- a/src/client/ui/templates/login/template.html +++ b/src/client/ui/templates/login/template.html @@ -11,11 +11,11 @@
-
[ Latest Release Notes ]
+
[ Latest Release Notes ]
Pledge on Patreon
Donate on Paypal
Access the Wiki
-
v0.10.5
+
v0.10.6
diff --git a/src/client/ui/templates/mainMenu/mainMenu.js b/src/client/ui/templates/mainMenu/mainMenu.js index 5b79e5ad..a7ac296b 100644 --- a/src/client/ui/templates/mainMenu/mainMenu.js +++ b/src/client/ui/templates/mainMenu/mainMenu.js @@ -58,17 +58,17 @@ define([ }, onCharSelect: function () { - renderer.clean(); - objects.onRezone(); + events.emit('destroyAllObjects'); + events.emit('resetRenderer'); + events.emit('resetPhysics'); + renderer.buildTitleScreen(); sound.unload(); events.emit('onShowCharacterSelect'); - $('[class^="ui"]:not(.ui-container)').toArray().forEach(el => { - let ui = $(el).data('ui'); - if (ui && ui.destroy) - ui.destroy(); - }); + + factory.exitGame(); + factory.build('characters', {}); }, diff --git a/src/client/ui/templates/quests/quests.js b/src/client/ui/templates/quests/quests.js index e83d688e..c4fd1fa2 100644 --- a/src/client/ui/templates/quests/quests.js +++ b/src/client/ui/templates/quests/quests.js @@ -25,7 +25,7 @@ define([ this.find('.btnCollapse').on('click', this.toggleButtons.bind(this)); } - this.onEvent('onRezone', this.onRezone.bind(this)); + this.onEvent('clearUis', this.clear.bind(this)); this.onEvent('onObtainQuest', this.onObtainQuest.bind(this)); this.onEvent('onUpdateQuest', this.onUpdateQuest.bind(this)); @@ -35,7 +35,7 @@ define([ this.onToggleQuestsVisibility(config.showQuests); }, - onRezone: function () { + clear: function () { this.quests = []; this.el.find('.list').empty(); }, diff --git a/src/client/ui/templates/stash/stash.js b/src/client/ui/templates/stash/stash.js index 04d856ed..1f1cb5b2 100644 --- a/src/client/ui/templates/stash/stash.js +++ b/src/client/ui/templates/stash/stash.js @@ -22,33 +22,38 @@ define([ hoverItem: null, items: [], + maxItems: null, modal: true, hasClose: true, postRender: function () { - this.onEvent('onGetStashItems', this.onGetStashItems.bind(this)); - this.onEvent('onDestroyStashItems', this.onDestroyStashItems.bind(this)); - this.onEvent('onKeyDown', this.onKeyDown.bind(this)); - this.onEvent('onKeyUp', this.onKeyUp.bind(this)); - this.onEvent('onOpenStash', this.toggle.bind(this)); + [ + 'onKeyUp', + 'onKeyDown', + 'onOpenStash', + 'onAddStashItems', + 'onRemoveStashItems' + ] + .forEach(e => { + this.onEvent(e, this[e].bind(this)); + }); }, build: function () { - this.el.removeClass('scrolls'); - if (window.player.stash.maxItems > 50) - this.el.addClass('scrolls'); + const { el, maxItems, items } = this; - let container = this.el.find('.grid') - .empty(); + el.removeClass('scrolls'); + if (maxItems > 50) + el.addClass('scrolls'); - let items = this.items; - let iLen = Math.max(items.length, window.player.stash.maxItems); + const container = this.el.find('.grid').empty(); - for (let i = 0; i < iLen; i++) { - let item = items[i]; + const renderItemCount = Math.max(items.length, maxItems); - let itemEl = renderItem(container, item); + for (let i = 0; i < renderItemCount; i++) { + const item = items[i]; + const itemEl = renderItem(container, item); if (!item) continue; @@ -126,14 +131,28 @@ define([ this.build(); }, - onDestroyStashItems: function (itemIds) { - itemIds.forEach(function (id) { - let item = this.items.find(i => i.id === id); + onAddStashItems: function (addItems) { + const { items } = this; + + addItems.forEach(newItem => { + const existIndex = items.findIndex(i => i.id === newItem.id); + if (existIndex !== -1) + items.splice(existIndex, 1, newItem); + else + items.push(newItem); + }); + }, + + onRemoveStashItems: function (removeItemIds) { + const { items } = this; + + removeItemIds.forEach(id => { + const item = items.find(i => i.id === id); if (item === this.hoverItem) this.hideTooltip(); - this.items.spliceWhere(i => i.id === id); - }, this); + items.spliceWhere(i => i.id === id); + }); if (this.shown) this.build(); @@ -155,8 +174,12 @@ define([ events.emit('onHideContextMenu'); }, - onOpenStash: function () { - this.build(); + onOpenStash: function ({ items, maxItems }) { + this.maxItems = maxItems; + + this.show(); + + this.onGetStashItems(items); }, beforeDestroy: function () { diff --git a/src/client/ui/templates/talk/talk.js b/src/client/ui/templates/talk/talk.js index 47191bac..617c0f9a 100644 --- a/src/client/ui/templates/talk/talk.js +++ b/src/client/ui/templates/talk/talk.js @@ -18,11 +18,7 @@ define([ postRender: function () { this.onEvent('onGetTalk', this.onGetTalk.bind(this)); - this.onEvent('onRezone', this.onRezone.bind(this)); - }, - - onRezone: function () { - this.hide(); + this.onEvent('clearUis', this.hide.bind(this)); }, onGetTalk: function (dialogue) { diff --git a/src/server/.eslintrc b/src/server/.eslintrc index cf00716e..5165c488 100644 --- a/src/server/.eslintrc +++ b/src/server/.eslintrc @@ -58,7 +58,9 @@ "leaderboard": false, "clientConfig": false, "random": false, - "consts": false + "consts": false, + "rezoneManager": false, + "eventManager": false }, "rules": { diff --git a/src/server/clientComponents/effects.js b/src/server/clientComponents/effects.js index 06341b6e..503fc3d2 100644 --- a/src/server/clientComponents/effects.js +++ b/src/server/clientComponents/effects.js @@ -1,135 +1,127 @@ define([ - 'js/rendering/renderer' + 'js/system/events', + 'js/rendering/numbers' ], function ( - renderer + events, + numbers ) { - let auras = { - reflectDamage: 0, - stealth: 1, - regenHp: 9, - regenMana: 10, - swiftness: 11, - holyVengeance: 8, - rare: 16 + const defaultBuffIcons = { + stunned: [4, 0] }; - return { - type: 'effects', + const effectBase = { + init: function () { + this.defaultDamageText(false); - alpha: 0, - alphaDir: 0.0025, + if (this.self && defaultBuffIcons[this.type]) { + events.emit('onGetEffectIcon', { + id: this.id, + icon: defaultBuffIcons[this.type] + }); + } + }, - alphaMax: 0.6, - alphaMin: 0.35, + destroy: function () { + if (!this.obj.destroyed) + this.defaultDamageText(true); - alphaCutoff: 0.4, + if (this.self && defaultBuffIcons[this.type]) { + events.emit('onRemoveEffectIcon', { + id: this.id + }); + } + }, + + defaultDamageText: function (removing) { + numbers.onGetDamage({ + id: this.obj.id, + event: true, + text: (removing ? '-' : '+') + this.type + }); + } + }; + + return { + type: 'effects', effects: [], + templates: { + + }, + init: function (blueprint) { - this.effects = this.effects - .filter(e => auras[e] !== null) - .map(e => { - return { - name: e, - sprite: renderer.buildObject({ - layerName: 'effects', - sheetName: 'auras', - x: this.obj.x, - y: this.obj.y + 1, - w: scale * 3, - h: scale * 3, - cell: auras[e] - }) - }; - }); + this.effects = this.effects.map(e => this.buildEffect(e)); }, + + buildEffect: function (data) { + let template = this.templates[data.type] || {}; + + let effect = $.extend(true, {}, effectBase, template, data); + + effect.self = !!this.obj.self; + effect.obj = this.obj; + + if (effect.init) + effect.init(); + + return effect; + }, + extend: function (blueprint) { if (blueprint.addEffects) { - blueprint.addEffects = blueprint.addEffects - .filter(e => { - return (auras[e] !== null); - }) - .map(e => { - return { - name: e, - sprite: renderer.buildObject({ - layerName: 'effects', - sheetName: 'auras', - x: this.obj.x, - y: this.obj.y + 1, - w: scale * 3, - h: scale * 3, - cell: auras[e] - }) - }; - }); + blueprint.addEffects = blueprint.addEffects.map(e => this.buildEffect(e)); this.effects.push.apply(this.effects, blueprint.addEffects || []); } if (blueprint.removeEffects) { - blueprint.removeEffects.forEach(r => { - let effect = this.effects.find(e => e.name === r); + blueprint.removeEffects.forEach(removeId => { + let effect = this.effects.find(e => e.id === removeId); if (!effect) return; - renderer.destroyObject({ - layerName: 'effects', - sprite: effect.sprite - }); + if (effect.destroy) + effect.destroy(); - this.effects.spliceFirstWhere(e => e.name === r); + this.effects.spliceFirstWhere(e => e.id === removeId); }); } - }, - - update: function () { - this.alpha += this.alphaDir; - if ((this.alphaDir > 0) && (this.alpha >= this.alphaMax)) { - this.alpha = this.alphaMax; - this.alphaDir *= -1; - } else if ((this.alphaDir < 0) && (this.alpha <= this.alphaMin)) { - this.alpha = this.alphaMin; - this.alphaDir *= -1; - } + if (blueprint.extendEffects) { + blueprint.extendEffects.forEach(u => { + let effect = this.effects.find(e => e.id === u.id); - let x = this.obj.x; - let y = this.obj.y; + if (!effect) + return; - let useAlpha = this.alpha; - if (useAlpha < this.alphaCutoff) - useAlpha = 0; - else { - useAlpha -= this.alphaCutoff; - useAlpha /= (this.alphaMax - this.alphaCutoff); + if (effect.extend) + effect.extend(u.data); + else { + for (let p in u.data) + effect[p] = u.data[p]; + } + }); } + }, + update: function () { this.effects.forEach(e => { - renderer.setSpritePosition({ - x, - y: y + 1, - sprite: e.sprite - }); - - e.sprite.alpha = useAlpha; - - e.sprite.visible = this.obj.isVisible; + if (e.update) + e.update(); }); }, setVisible: function (visible) { this.effects.forEach(e => { - e.sprite.visible = visible; + if (e.setVisible) + e.setVisible(visible); }); }, destroy: function () { this.effects.forEach(e => { - renderer.destroyObject({ - layerName: 'effects', - sprite: e.sprite - }); + if (e.destroy) + e.destroy(); }); } }; diff --git a/src/server/clientComponents/effects/auras.js b/src/server/clientComponents/effects/auras.js new file mode 100644 index 00000000..f09ba3b8 --- /dev/null +++ b/src/server/clientComponents/effects/auras.js @@ -0,0 +1,136 @@ +define([ + 'js/rendering/renderer', + 'js/system/events' +], function ( + renderer, + events +) { + const auras = { + reflectDamage: 0, + stealth: 1, + regenHp: 9, + regenMana: 10, + swiftness: 11, + holyVengeance: 8, + rare: 16 + }; + const buffIcons = { + regenHp: [3, 1], + regenMana: [4, 1], + swiftness: [5, 1], + stealth: [7, 0], + reflectDamage: [2, 1], + holyVengeance: [4, 0] + }; + + let templates = {}; + + Object.keys(auras).forEach(type => { + let cell = auras[type]; + + templates[type] = { + sprite: null, + + alpha: 0, + alphaDir: 0.0025, + + alphaMax: 0.6, + alphaMin: 0.35, + + alphaCutoff: 0.4, + + init: function () { + this.sprite = renderer.buildObject({ + layerName: 'effects', + sheetName: 'auras', + x: this.obj.x, + y: this.obj.y + 1, + w: scale * 3, + h: scale * 3, + cell: cell + }); + + this.defaultDamageText(); + + if (this.self && buffIcons[type]) { + events.emit('onGetEffectIcon', { + id: this.id, + icon: buffIcons[type] + }); + } + }, + + getAlpha: function () { + let listAuras = this.obj.effects.effects.filter(e => auras[e.type]); + let first = listAuras[0]; + + // The first aura in the list should do all the updating so that all auras pulse together + if (first === this) { + this.alpha += this.alphaDir; + if ((this.alphaDir > 0) && (this.alpha >= this.alphaMax)) { + this.alpha = this.alphaMax; + this.alphaDir *= -1; + } else if ((this.alphaDir < 0) && (this.alpha <= this.alphaMin)) { + this.alpha = this.alphaMin; + this.alphaDir *= -1; + } + } else { + this.alpha = first.alpha; + this.alphaDir = first.alphaDir; + } + + let useAlpha = this.alpha; + if (useAlpha < this.alphaCutoff) + useAlpha = 0; + else { + useAlpha -= this.alphaCutoff; + useAlpha /= (this.alphaMax - this.alphaCutoff); + } + + return useAlpha; + }, + + update: function () { + let useAlpha = this.getAlpha(); + + let x = this.obj.x; + let y = this.obj.y; + + renderer.setSpritePosition({ + x, + y: y + 1, + sprite: this.sprite + }); + + this.sprite.alpha = useAlpha; + + this.sprite.visible = this.obj.isVisible; + }, + + destroy: function () { + renderer.destroyObject({ + layerName: 'effects', + sprite: this.sprite + }); + + this.defaultDamageText(true); + + if (this.self && buffIcons[type]) { + events.emit('onRemoveEffectIcon', { + id: this.id + }); + } + }, + + setVisible: function (visible) { + this.sprite.visible = visible; + } + }; + }); + + return { + templates: { + ...templates + } + }; +}); diff --git a/src/server/clientComponents/gatherer.js b/src/server/clientComponents/gatherer.js index 0f3a81f1..8df1a5cb 100644 --- a/src/server/clientComponents/gatherer.js +++ b/src/server/clientComponents/gatherer.js @@ -13,7 +13,6 @@ define([ init: function () { this.obj.on('onKeyDown', this.onKeyDown.bind(this)); - this.hookEvent('onRezone', this.onRezone.bind(this)); }, extend: function (msg) { @@ -53,13 +52,6 @@ define([ } }, - onRezone: function () { - this.extend({ - progress: 100, - action: 'Fishing' - }); - }, - onKeyDown: function (key) { if (key !== 'g') return; diff --git a/src/server/clientComponents/pather.js b/src/server/clientComponents/pather.js index 4b48c58d..48fe5414 100644 --- a/src/server/clientComponents/pather.js +++ b/src/server/clientComponents/pather.js @@ -27,9 +27,9 @@ define([ lastY: 0, init: function () { - events.on('onRespawn', this.onDeath.bind(this)); - events.on('onDeath', this.onDeath.bind(this)); - events.on('onClearQueue', this.onDeath.bind(this)); + events.on('teleportToPosition', this.resetPath.bind(this)); + events.on('onDeath', this.resetPath.bind(this)); + events.on('onClearQueue', this.resetPath.bind(this)); this.pathPos.x = round(this.obj.x); this.pathPos.y = round(this.obj.y); @@ -46,7 +46,7 @@ define([ this.path = []; }, - onDeath: function () { + resetPath: function () { this.clearPath(); this.pathPos.x = round(this.obj.x); diff --git a/src/server/clientComponents/player.js b/src/server/clientComponents/player.js index d65aa0e2..36d576f2 100644 --- a/src/server/clientComponents/player.js +++ b/src/server/clientComponents/player.js @@ -29,7 +29,7 @@ define([ obj.addComponent('serverActions'); obj.addComponent('pather'); - this.hookEvent('onRespawn', this.onRespawn.bind(this)); + this.hookEvent('teleportToPosition', this.teleportToPosition.bind(this)); events.emit('onGetPortrait', obj.portrait); }, @@ -74,7 +74,7 @@ define([ }, instant); }, - onRespawn: function ({ x, y }) { + teleportToPosition: function ({ x, y }) { this.positionCamera(x, y, true); sound.update(x, y); }, diff --git a/src/server/clientComponents/serverActions.js b/src/server/clientComponents/serverActions.js index b1bc09a5..2c7c2763 100644 --- a/src/server/clientComponents/serverActions.js +++ b/src/server/clientComponents/serverActions.js @@ -14,6 +14,10 @@ define([ this.hookEvent('onKeyUp', this.onKeyUp.bind(this)); }, + hasAction: function (actionId) { + return this.actions.some(a => a.id === actionId); + }, + onKeyUp: function (key) { this.actions.forEach(function (a) { if (a.key !== key) diff --git a/src/server/clientComponents/stash.js b/src/server/clientComponents/stash.js index 7e51bf1a..0ae7e4ce 100644 --- a/src/server/clientComponents/stash.js +++ b/src/server/clientComponents/stash.js @@ -1,49 +1,7 @@ -define([ - 'js/system/events' -], function ( - events -) { +define([], function () { return { type: 'stash', - active: false, - - items: null, - - init: function () { - events.emit('onGetStashItems', this.items); - }, - - extend: function (blueprint) { - if (blueprint.has('active')) - this.active = blueprint.active; - - if (blueprint.getItems) { - let items = this.items; - let newItems = blueprint.getItems || []; - let nLen = newItems.length; - - for (let i = 0; i < nLen; i++) { - let nItem = newItems[i]; - let nId = nItem.id; - - let findItem = items.find(f => f.id === nId); - if (findItem) { - $.extend(true, findItem, nItem); - - newItems.splice(i, 1); - i--; - nLen--; - } - } - - this.items.push.apply(this.items, blueprint.getItems || []); - - events.emit('onGetStashItems', this.items); - } - - if (blueprint.destroyItems) - events.emit('onDestroyStashItems', blueprint.destroyItems); - } + init: function () {} }; }); diff --git a/src/server/components/aggro.js b/src/server/components/aggro.js index bd46374a..df67e17b 100644 --- a/src/server/components/aggro.js +++ b/src/server/components/aggro.js @@ -403,5 +403,9 @@ module.exports = { clearIgnoreList: function () { this.ignoreList = []; + }, + + isInCombat: function () { + return this.list.length > 0; } }; diff --git a/src/server/components/auth.js b/src/server/components/auth.js index 5e5117e5..bbe21089 100644 --- a/src/server/components/auth.js +++ b/src/server/components/auth.js @@ -93,6 +93,9 @@ module.exports = { doSave: async function (callback, saveStash = true) { const simple = this.obj.getSimple(true, true); + delete simple.destroyed; + delete simple.forceDestroy; + simple.components.spliceWhere(f => (f.type === 'stash')); await io.setAsync({ @@ -111,10 +114,15 @@ module.exports = { }, doSaveStash: async function () { + const { username, obj: { stash } } = this; + + if (!stash.changed) + return; + await io.setAsync({ - key: this.username, + key: username, table: 'stash', - value: this.obj.stash.serialize(), + value: stash.serialize(), clean: true, serialize: true }); @@ -174,7 +182,6 @@ module.exports = { this.characters[charName] = character; await this.getCustomChannels(character); - await this.getStash(); await this.verifySkin(character); @@ -341,8 +348,13 @@ module.exports = { register: async function (msg) { let credentials = msg.data; - if ((credentials.username === '') || (credentials.password === '')) { + if (credentials.username === '' || credentials.password === '') { msg.callback(messages.login.allFields); + + return; + } else if (credentials.username.length > 32) { + msg.callback(messages.login.maxUsernameLength); + return; } diff --git a/src/server/components/effects.js b/src/server/components/effects.js index b1e1ca74..59656719 100644 --- a/src/server/components/effects.js +++ b/src/server/components/effects.js @@ -110,14 +110,14 @@ module.exports = { let effect = effects[i]; if (!forceDestroy) { if (effect.persist) { - this.syncRemove(effect.id, effect.type); + this.syncRemove(effect.id); continue; } } this.destroyEffect(effect); - this.syncRemove(effect.id, effect.type); + this.syncRemove(effect.id); effects.splice(i, 1); eLen--; i--; @@ -137,36 +137,40 @@ module.exports = { }, addEffect: function (options, source) { + //Skip 0-duration effects if ((options.has('ttl')) && (options.ttl === 0)) return; options.caster = options.caster || source; + //"X of Y in Z" cc resist check if (!options.force && !this.canApplyEffect(options.type)) return; - if (!options.new) { - let exists = this.effects.find(e => e.type === options.type); - if (exists) { - exists.ttl += options.ttl; + let oldEffect = this.effects.find(e => e.type === options.type); - for (let p in options) { - if (p === 'ttl') - continue; - - exists[p] = options[p]; - } - - return exists; - } + //If there is no existing effect or the effect is not stackable, make a new effect + if (!oldEffect || !oldEffect.shouldStack) + return this.buildEffect(options); + + //If the effect is stackable and the new effect should stack, stack with the old effect + let shouldStack = oldEffect.shouldStack(options); + if (shouldStack && oldEffect.incrementStack) { + oldEffect.incrementStack(options); + return oldEffect; } + //Otherwise make a new effect + return this.buildEffect(options); + }, + + getTypeTemplate: function (type) { let typeTemplate = null; - if (options.type) { - let type = options.type[0].toUpperCase() + options.type.substr(1); + if (type) { + let capitalizedType = type[0].toUpperCase() + type.substr(1); let result = { type: type, - url: 'config/effects/effect' + type + '.js' + url: 'config/effects/effect' + capitalizedType + '.js' }; this.obj.instance.eventEmitter.emit('onBeforeGetEffect', result); @@ -174,84 +178,77 @@ module.exports = { } let builtEffect = extend({}, effectTemplate, typeTemplate); + return builtEffect; + }, + + buildEffect: function (options) { + let builtEffect = this.getTypeTemplate(options.type); + for (let p in options) builtEffect[p] = options[p]; builtEffect.obj = this.obj; builtEffect.id = this.nextId++; - builtEffect.noMsg = options.noMsg; + builtEffect.silent = options.silent; if (builtEffect.init) builtEffect.init(options.source); this.effects.push(builtEffect); - if (!options.noMsg) { - this.obj.instance.syncer.queue('onGetBuff', { - type: options.type, - id: builtEffect.id - }, [this.obj.serverId]); - - this.obj.instance.syncer.queue('onGetDamage', { - id: this.obj.id, - event: true, - text: '+' + options.type - }, -1); - - this.obj.syncer.setArray(false, 'effects', 'addEffects', options.type); - } + if (!options.silent) + this.obj.syncer.setArray(false, 'effects', 'addEffects', builtEffect.simplify()); this.obj.instance.eventEmitter.emit('onAddEffect', this.obj, builtEffect); return builtEffect; }, - syncRemove: function (id, type, noMsg) { - if ((noMsg) || (!type)) + syncExtend: function (id, data) { + let effect = this.effects.find(e => e.id === id); + if (!effect) + return; + + //Never sync silent effects + if (effect.silent) return; - this.obj.instance.syncer.queue('onRemoveBuff', { - id: id - }, [this.obj.serverId]); + this.obj.syncer.setArray(true, 'effects', 'extendEffects', { + id, + data + }); + }, + + syncRemove: function (id) { + let effect = this.effects.find(e => e.id === id); + + if (!effect) + return; - this.obj.instance.syncer.queue('onGetDamage', { - id: this.obj.id, - event: true, - text: '-' + type - }, -1); + if (effect.silent) + return; - this.obj.syncer.setArray(false, 'effects', 'removeEffects', type); + this.obj.syncer.setArray(false, 'effects', 'removeEffects', id); }, - removeEffect: function (checkEffect, noMsg) { - let effects = this.effects; - let eLen = effects.length; - for (let i = 0; i < eLen; i++) { - let effect = effects[i]; - if (effect === checkEffect) { - this.destroyEffect(effect); + removeEffect: function (id) { + const effect = this.effects.find(e => e.id === id); - this.syncRemove(effect.id, effect.type, noMsg || effect.noMsg); - effects.splice(i, 1); + //It's possible that something else has removed the effect + if (!effect) + return; - return; - } - } + this.destroyEffect(effect); + + this.syncRemove(effect.id); + + this.effects.spliceWhere(e => e.id === id); }, - removeEffectByName: function (effectName, noMsg) { - let effects = this.effects; - let eLen = effects.length; - for (let i = 0; i < eLen; i++) { - let effect = effects[i]; - if (effect.type === effectName) { - this.destroyEffect(effect); - this.syncRemove(effect.id, effect.type, noMsg || effects.noMsg); - effects.splice(i, 1); - - return effect; - } - } + removeEffectByType: function (type) { + const effects = this.effects.filter(e => e.type === type); + + effects.forEach(e => this.removeEffect(e.id)); }, getEffectByType: function (effectType) { @@ -293,23 +290,22 @@ module.exports = { for (let i = 0; i < eLen; i++) { let e = effects[i]; - if (e.ttl > 0) { + if (e.ttl > 0) e.ttl--; - if (e.ttl === 0) - e.destroyed = true; - } + else if (e.ttl === 0) + e.destroyed = true; if (e.update) e.update(); if (e.destroyed) { + this.destroyEffect(e); + + this.syncRemove(e.id); + effects.splice(i, 1); eLen--; i--; - - this.destroyEffect(e); - - this.syncRemove(e.id, e.type, e.noMsg); } } diff --git a/src/server/components/extensions/socialCommands.js b/src/server/components/extensions/socialCommands.js index d3e11464..5cef379d 100644 --- a/src/server/components/extensions/socialCommands.js +++ b/src/server/components/extensions/socialCommands.js @@ -549,7 +549,7 @@ module.exports = { die: function () { this.obj.stats.takeDamage({ - amount: 99999 + amount: 20000000 }, 1, this.obj); }, diff --git a/src/server/components/inventory.js b/src/server/components/inventory.js index 7c4a9abc..f1f3b8c4 100644 --- a/src/server/components/inventory.js +++ b/src/server/components/inventory.js @@ -272,19 +272,16 @@ module.exports = { this.obj.syncer.setArray(true, 'inventory', 'getItems', item); }, - stashItem: function (id) { - let item = this.findItem(id); + stashItem: async function (id) { + const item = this.findItem(id); if (!item || item.quest || item.noStash) return; delete item.pos; - let stash = this.obj.stash; - if (!stash.active) - return; - - let clonedItem = extend({}, item); - const success = stash.deposit(clonedItem); + const stash = this.obj.stash; + const clonedItem = extend({}, item); + const success = await stash.deposit(clonedItem); if (!success) return; diff --git a/src/server/components/mob.js b/src/server/components/mob.js index 51c1533c..735b9fbb 100644 --- a/src/server/components/mob.js +++ b/src/server/components/mob.js @@ -98,6 +98,8 @@ module.exports = { patrol: null, patrolTargetNode: 0, + needLos: null, + init: function (blueprint) { this.physics = this.obj.instance.physics; @@ -111,6 +113,7 @@ module.exports = { this.maxChaseDistance = blueprint.maxChaseDistance; }, + /* eslint-disable-next-line max-lines-per-function */ update: function () { let obj = this.obj; @@ -121,20 +124,22 @@ module.exports = { //Have we reached home? if (this.goHome) { let distanceFromHome = Math.max(abs(this.originX - obj.x), abs(this.originY - obj.y)); - if (!distanceFromHome) + if (!distanceFromHome) { this.goHome = false; - } - - //Are we too far from home? - if ((!this.goHome) && (!obj.follower) && (target)) { - if (!this.canChase(target)) { - obj.clearQueue(); - obj.aggro.unAggro(target); - target = obj.aggro.getHighest(); + obj.spellbook.resetRotation(); } } if (!this.goHome) { + //Are we too far from home? + if (!obj.follower && target) { + if (!this.canChase(target)) { + obj.clearQueue(); + obj.aggro.unAggro(target); + target = obj.aggro.getHighest(); + } + } + if ((target) && (target !== obj) && ((!obj.follower) || (obj.follower.master !== target))) { //If we just started attacking, patrols need to know where home is if (!this.target && this.patrol) { @@ -145,10 +150,11 @@ module.exports = { //Are we in fight mode? this.fight(target); return; - } else if ((!target) && (this.target)) { + } else if (!target && this.target) { //Is fight mode over? this.target = null; obj.clearQueue(); + obj.spellbook.resetRotation(); if (canPathHome(this)) this.goHome = true; @@ -251,8 +257,8 @@ module.exports = { let ty = ~~target.y; let distance = max(abs(x - tx), abs(y - ty)); - let furthestAttackRange = obj.spellbook.getFurthestRange(null, true); - let furthestStayRange = obj.spellbook.getFurthestRange(null, false); + let furthestAttackRange = obj.spellbook.getFurthestRange(target, true); + let furthestStayRange = obj.spellbook.getFurthestRange(target, false); let doesCollide = null; let hasLos = null; @@ -263,18 +269,20 @@ module.exports = { hasLos = this.physics.hasLos(x, y, tx, ty); //Maybe we don't care if the mob has LoS if (hasLos || this.needLos === false) { - if (((obj.follower) && (obj.follower.master.player)) || (rnd() < 0.65)) { - let spell = obj.spellbook.getRandomSpell(target); - let success = obj.spellbook.cast({ - spell: spell, - target: target - }); - //null means we don't have LoS - if (success !== null) - return; - hasLos = false; - } else + let spell = obj.spellbook.getSpellToCast(target); + if (!spell) return; + + let success = obj.spellbook.cast({ + spell: spell.id, + target + }); + + //null means we don't have LoS + if (success !== null) + return; + + hasLos = false; } } } else if (furthestAttackRange === 0) { diff --git a/src/server/components/player.js b/src/server/components/player.js index 4af46950..d5d04e32 100644 --- a/src/server/components/player.js +++ b/src/server/components/player.js @@ -70,9 +70,7 @@ module.exports = { faction: 'players' }); obj.addComponent('gatherer'); - obj.addComponent('stash', { - items: character.stash - }); + obj.addComponent('stash'); let blueprintEffects = character.components.find(c => c.type === 'effects') || {}; if (blueprintEffects.effects) { @@ -235,7 +233,7 @@ module.exports = { obj.instance.physics.addObject(obj, obj.x, obj.y); - obj.instance.syncer.queue('onRespawn', { + obj.instance.syncer.queue('teleportToPosition', { x: obj.x, y: obj.y }, [obj.serverId]); @@ -276,11 +274,5 @@ module.exports = { msg.data.data.callbackId = atlas.registerCallback(msg.callback); atlas.performAction(this.obj, msg.data); - }, - - notifyServerUiReady: function () { - this.obj.instance.eventEmitter.emit('onPlayerUiReady', { - obj: this.obj - }); } }; diff --git a/src/server/components/portal.js b/src/server/components/portal.js index c6dd7371..e0545206 100644 --- a/src/server/components/portal.js +++ b/src/server/components/portal.js @@ -16,18 +16,20 @@ module.exports = { this.patronLevel = ~~blueprint.patron; }, - collisionEnter: async function (obj) { + collisionEnter: function (obj) { if (!obj.player) return; - const { toZone: zoneName, toPos, toRelativePos } = this; + (async () => { + const { toZone: zoneName, toPos, toRelativePos } = this; - await sendObjToZone({ - obj, - invokingObj: this, - zoneName, - toPos, - toRelativePos - }); + await sendObjToZone({ + obj, + invokingObj: this, + zoneName, + toPos, + toRelativePos + }); + })(); } }; diff --git a/src/server/components/portal/sendObjToZone.js b/src/server/components/portal/sendObjToZone.js index a2b4c4dd..7c53204c 100644 --- a/src/server/components/portal/sendObjToZone.js +++ b/src/server/components/portal/sendObjToZone.js @@ -1,9 +1,19 @@ -const sendObjToZone = async ({ obj, invokingObj, zoneName, toPos, toRelativePos }) => { - const { serverId, instance: { physics, syncer: globalSyncer } } = obj; +const fixPosition = (obj, toPos, toRelativePos, invokingObj) => { + if (toPos) { + obj.x = toPos.x; + obj.y = toPos.y; + } else if (toRelativePos) { + obj.x = invokingObj.obj.x + toRelativePos.x; + obj.y = invokingObj.obj.y + toRelativePos.y; + } +}; - globalSyncer.flushForTarget(serverId); +const sendObjToZone = async ({ obj, invokingObj, zoneName, toPos, toRelativePos }) => { + const { serverId, instance: { syncer: globalSyncer, physics } } = obj; if (obj.zoneName === zoneName) { + globalSyncer.flushForTarget(serverId); + physics.removeObject(obj, obj.x, obj.y); if (toRelativePos) { @@ -18,7 +28,7 @@ const sendObjToZone = async ({ obj, invokingObj, zoneName, toPos, toRelativePos physics.addObject(obj, obj.x, obj.y); - globalSyncer.queue('onRespawn', { + globalSyncer.queue('teleportToPosition', { x: obj.x, y: obj.y }, [obj.serverId]); @@ -26,28 +36,41 @@ const sendObjToZone = async ({ obj, invokingObj, zoneName, toPos, toRelativePos return; } - obj.fireEvent('beforeRezone'); - - obj.destroyed = true; + //We set this before saving so that objects aren't saved ON portals + obj.zoneName = zoneName; + fixPosition(obj, toPos, toRelativePos, invokingObj); + //Destroy, flush events and notify other objects + globalSyncer.processDestroyedObject(obj); await obj.auth.doSave(); + //We have to do this again. This is because onCollisionEnter in portal is not blocking (even though it is async) + // So physics will carry on and allow the obj to move onto the next tile (changing the position while we save above) + fixPosition(obj, toPos, toRelativePos, invokingObj); + + //Test code, remove later + Object.entries(globalSyncer.buffer).forEach(([k, v]) => { + v.forEach(e => { + if (e.to.includes(serverId)) { + /* eslint-disable-next-line */ + console.log('Found event', k, 'for rezoning object'); + } + }); + }); + const simpleObj = obj.getSimple(true, false, true); + simpleObj.destroyed = false; + simpleObj.forceDestroy = false; - if (toPos) { - simpleObj.x = toPos.x; - simpleObj.y = toPos.y; - } else if (toRelativePos) { - simpleObj.x = invokingObj.obj.x + toRelativePos.x; - simpleObj.y = invokingObj.obj.y + toRelativePos.y; - } + rezoneManager.stageRezone(simpleObj, zoneName); process.send({ - method: 'rezone', - id: obj.serverId, - args: { - obj: simpleObj, - newZone: zoneName + method: 'events', + data: { + rezoneStart: [{ + obj: { msg: {} }, + to: [serverId] + }] } }); }; diff --git a/src/server/components/social.js b/src/server/components/social.js index c7c60da0..fc0692a7 100644 --- a/src/server/components/social.js +++ b/src/server/components/social.js @@ -86,7 +86,7 @@ module.exports = { return; let source = cons.players.find(c => c.id === sourceId); - if (!source) + if (!source || !source.social) return; source.social.sendMessage('invite sent', 'color-yellowB'); diff --git a/src/server/components/social/rezone.js b/src/server/components/social/rezone.js index e3edbc07..d5caeb12 100644 --- a/src/server/components/social/rezone.js +++ b/src/server/components/social/rezone.js @@ -3,6 +3,9 @@ const sendObjToZone = require('../portal/sendObjToZone'); module.exports = (cpnSocial, targetZone) => { const { obj } = cpnSocial; + if (obj.zoneName === targetZone) + return; + sendObjToZone({ obj, zoneName: targetZone diff --git a/src/server/components/spellbook.js b/src/server/components/spellbook.js index a1cbf0e8..4f15ea71 100644 --- a/src/server/components/spellbook.js +++ b/src/server/components/spellbook.js @@ -3,6 +3,11 @@ let animations = require('../config/animations'); let playerSpells = require('../config/spells'); let playerSpellsConfig = require('../config/spellsConfig'); +//Helpers +const rotationManager = require('./spellbook/rotationManager'); + +//Component + module.exports = { type: 'spellbook', @@ -16,6 +21,8 @@ module.exports = { callbacks: [], + rotation: null, + init: function (blueprint) { this.objects = this.obj.instance.objects; this.physics = this.obj.instance.physics; @@ -24,7 +31,22 @@ module.exports = { (blueprint.spells || []).forEach(s => this.addSpell(s, -1)); + if (blueprint.rotation) { + const { duration, spells } = blueprint.rotation; + + this.rotation = { + currentTick: 0, + duration, + spells + }; + } + delete blueprint.spells; + + //External helpers that should form part of the component + this.getSpellToCast = rotationManager.getSpellToCast.bind(null, this); + this.getFurthestRange = rotationManager.getFurthestRange.bind(null, this); + this.resetRotation = rotationManager.resetRotation.bind(null, this); }, transfer: function () { @@ -243,17 +265,6 @@ module.exports = { }); }, - getRandomSpell: function (target) { - const valid = this.spells.filter(s => { - return (!s.selfCast && !s.procCast && !s.castOnDeath && s.canCast(target)); - }); - - if (!valid.length) - return null; - - return valid[~~(Math.random() * valid.length)].id; - }, - getTarget: function (spell, action) { let target = action.target; @@ -289,7 +300,7 @@ module.exports = { } } - if (spell.spellType === 'buff') { + if (spell.spellType === 'buff' || spell.spellType === 'heal') { if (this.obj.aggro.faction !== target.aggro.faction) return; } else if (target.aggro && !this.obj.aggro.canAttack(target)) { @@ -339,6 +350,7 @@ module.exports = { return false; action.target = this.getTarget(spell, action); + //If a target has become nonSelectable, we need to stop attacks that are queued/auto if (!action.target || action.target.nonSelectable) return false; @@ -445,25 +457,6 @@ module.exports = { return this.closestRange; }, - getFurthestRange: function (spellNum, checkCanCast) { - if (spellNum) - return this.spells[spellNum].range; - - let spells = this.spells; - let sLen = spells.length; - let furthest = 0; - for (let i = 0; i < sLen; i++) { - let spell = spells[i]; - if (spell.procCast || spell.castOnDeath) - continue; - - if (spell.range > furthest && (!checkCanCast || spell.canCast())) - furthest = spell.range; - } - - return furthest; - }, - getCooldowns: function () { let cds = []; this.spells.forEach( @@ -480,6 +473,9 @@ module.exports = { let didCast = false; const isCasting = this.isCasting(); + if (this.rotation) + rotationManager.tick(this); + this.spells.forEach(s => { let auto = s.autoActive; if (auto) { diff --git a/src/server/components/spellbook/rotationManager.js b/src/server/components/spellbook/rotationManager.js new file mode 100644 index 00000000..c902120d --- /dev/null +++ b/src/server/components/spellbook/rotationManager.js @@ -0,0 +1,131 @@ +const getDefaultRotationSpell = rotationSpells => { + const spells = rotationSpells.filter(s => !s.atRotationTicks); + + if (!spells.length) + return; + + if (spells.length === 1) + return spells[0]; + + const randomSpell = spells[~~(Math.random() * spells.length)]; + + return randomSpell; +}; + +//Mobs that define rotations (normally bosses) use this method to determine their spell choices +const getRotationSpell = (source, target) => { + const { spells, rotation: { currentTick, spells: rotationSpells } } = source; + + //Find spell matching current tick + let rotationEntry = rotationSpells.find(s => s.atRotationTicks?.includes(currentTick)); + + if (!rotationEntry) + rotationEntry = getDefaultRotationSpell(rotationSpells); + + if (!rotationEntry) + return; + + //Don't cast anything + if (rotationEntry.spellIndex === -1) + return; + + const useSpell = spells[rotationEntry.spellIndex]; + + //Todo: We should set cdMax and manaCost to 0 of rotation spells (unless there's a mana drain mechanic) + // later and we want to allow that on bosses + useSpell.cd = 0; + useSpell.manaCost = 0; + if (!useSpell.selfCast && !useSpell.canCast(target)) + return getDefaultRotationSpell(rotationSpells); + + return useSpell; +}; + +//Mobs without rune rotations (normally the case) simple select any random spell that is valid +const getRandomSpell = (source, target) => { + const valid = source.spells.filter(s => { + return (!s.selfCast && !s.procCast && !s.castOnDeath && s.canCast(target)); + }); + + if (!valid.length) + return null; + + return valid[~~(Math.random() * valid.length)]; +}; + +const getSpellToCast = (source, target) => { + if (source.rotation) + return getRotationSpell(source, target); + + const { obj: { follower } } = source; + + //Mobs don't cast all the time but player followers do + if (!follower?.master?.player && Math.random() >= 0.65) + return; + + return getRandomSpell(source, target); +}; + +const tick = source => { + if (!source.obj.aggro.isInCombat()) + return; + + const { rotation } = source; + + rotation.currentTick++; + + if (rotation.currentTick === rotation.duration) + rotation.currentTick = 1; +}; + +//Gets the range we need to be at to cast a specific rotation spell +const getFurthestRangeRotation = (source, target, checkCanCast) => { + const spell = getRotationSpell(source, target); + + if (!spell) + return 0; + + return spell.range; +}; + +/* + This is used by mobs when in combat mode, + * When checkCanCast is true, we want to see if we can cast right now + * When checkCanCast is false, we want to see if there is a spell we could cast in the near future + -> This could be a spell that is currently on cooldown, or that the mob has insufficient mana for + ---> Even though mobs don't need mana for spells at the moment + -> Ultimately, this means the mob should not move, just wait +*/ +const getFurthestRange = (source, target, checkCanCast) => { + const { spells, rotation } = source; + + if (rotation) + return getFurthestRangeRotation(source, target, checkCanCast); + + let sLen = spells.length; + let furthest = 0; + for (let i = 0; i < sLen; i++) { + let spell = spells[i]; + if (spell.procCast || spell.castOnDeath) + continue; + + if (spell.range > furthest && (!checkCanCast || spell.canCast())) + furthest = spell.range; + } + + return furthest; +}; + +const resetRotation = source => { + if (!source.rotation) + return; + + source.rotation.currentTick = 0; +}; + +module.exports = { + tick, + resetRotation, + getSpellToCast, + getFurthestRange +}; diff --git a/src/server/components/stash.js b/src/server/components/stash.js index 129294a9..21fe119b 100644 --- a/src/server/components/stash.js +++ b/src/server/components/stash.js @@ -1,127 +1,138 @@ +//System +const eventEmitter = require('../misc/events'); + +//Helpers +const fixes = require('../fixes/fixes'); const cpnInventory = require('./inventory'); const { isItemStackable } = require('./inventory/helpers'); +//Config const maxItemsBase = 50; +//Component module.exports = { type: 'stash', active: false, - items: [], + items: null, changed: false, maxItems: maxItemsBase, - init: function (blueprint) { - let items = blueprint.items || []; - let iLen = items.length; - for (let i = 0; i < iLen; i++) - this.getItem(items[i]); + init: function (blueprint) {}, + + getItemsFromDb: async function () { + const { obj } = this; + + this.items = await io.getAsync({ + key: obj.account, + table: 'stash', + isArray: true, + clean: true + }); - delete blueprint.items; + fixes.fixStash(this.items); - this.blueprint = blueprint; + await eventEmitter.emit('onAfterGetStash', { + obj: obj, + stash: this.items + }); }, getItem: function (item) { - //Material? - let exists = false; + const { items } = this; + if (isItemStackable(item)) { - let existItem = this.items.find(i => i.name === item.name); + const existItem = items.find(i => i.name === item.name); if (existItem) { - exists = true; if (!existItem.quantity) existItem.quantity = 1; - existItem.quantity += (item.quantity || 1); + + existItem.quantity += (+item.quantity || 1); //We modify the old object because it gets sent to the client item.id = existItem.id; item.quantity = existItem.quantity; item = existItem; + + return; } } //Get next id - if (!exists) { - let id = 0; - let items = this.items; - let iLen = items.length; - for (let i = 0; i < iLen; i++) { - let fItem = items[i]; - if (fItem.id >= id) - id = fItem.id + 1; - } - item.id = id; - } + let id = 0; + items.forEach(i => { + if (i.id >= id) + id = i.id + 1; + }); + item.id = id; - if (!exists) - this.items.push(item); + items.push(item); }, - deposit: function (item) { - if (!this.active) + deposit: async function (item) { + if (!this.items) + await this.getItemsFromDb(); + + const { active, items, maxItems, obj } = this; + + if (!active) return; - else if (this.items.length >= this.maxItems) { - let isStackable = this.items.some(stashedItem => item.name === stashedItem.name && (isItemStackable(stashedItem))); + + else if (items.length >= maxItems) { + const isStackable = items.some(stashedItem => item.name === stashedItem.name && isItemStackable(stashedItem)); if (!isStackable) { const message = 'You do not have room in your stash to deposit that item'; - this.obj.social.notifySelf({ message }); + obj.social.notifySelf({ message }); return; } } - this.getItem(item); - - this.obj.syncer.setArray(true, 'stash', 'getItems', item); this.changed = true; - return true; - }, - - destroyItem: function (id) { - let item = this.items.find(i => i.id === id); - if (!item) - return; + this.getItem(item); - this.items.spliceWhere(i => i === item); + const sendItem = cpnInventory.simplifyItem.call({ obj: {} }, item); - this.obj.syncer.setArray(true, 'stash', 'destroyItems', id); + obj.instance.syncer.queue('onAddStashItems', [sendItem], [obj.serverId]); - this.changed = true; + return true; }, withdraw: function (id) { - if (!this.active) + const { active, items, obj } = this; + + if (!active) return; - let item = this.items.find(i => i.id === id); + let item = items.find(i => i.id === id); if (!item) return; - else if (!this.obj.inventory.hasSpace(item)) { + else if (!obj.inventory.hasSpace(item)) { const message = 'You do not have room in your inventory to withdraw that item'; - this.obj.social.notifySelf({ message }); + obj.social.notifySelf({ message }); return; } - this.obj.inventory.getItem(item); - this.items.spliceWhere(i => i === item); + this.changed = true; - this.obj.syncer.setArray(true, 'stash', 'destroyItems', id); + obj.inventory.getItem(item); + items.spliceWhere(i => i === item); - this.changed = true; + obj.instance.syncer.queue('onRemoveStashItems', [id], [obj.serverId]); }, setActive: function (active) { - let obj = this.obj; + const { obj } = this; this.active = active; - obj.syncer.set(true, 'stash', 'active', this.active); const actionType = active ? 'addActions' : 'removeActions'; obj.syncer.setArray(true, 'serverActions', actionType, { + id: 'openStash', key: 'u', action: { targetId: obj.id, @@ -130,34 +141,53 @@ module.exports = { } }); + if (!this.active) + return; + let msg = 'Press U to access your Shared Stash'; - this.obj.instance.syncer.queue('onGetAnnouncement', { - src: this.obj.id, + obj.instance.syncer.queue('onGetAnnouncement', { + src: obj.id, msg: msg }, [obj.serverId]); - - if (this.active && this.items.length > this.maxItems) { - const message = `You have more than ${this.maxItems} items in your stash. In the future, these items will be lost.`; - obj.social.notifySelf({ message }); - } }, - open: function () { - const { active, obj } = this; + open: async function () { + if (!this.items) + await this.getItemsFromDb(); - if (active) - obj.instance.syncer.queue('onOpenStash', {}, [obj.serverId]); + const { obj, active, maxItems, items } = this; + + if (!active) + return; + + const sendItems = items.map(i => cpnInventory.simplifyItem.call({ obj: {} }, i)); + + const msg = { + maxItems, + items: sendItems + }; + + obj.instance.syncer.queue('onOpenStash', msg, [obj.serverId]); + + if (items.length > maxItems) { + const message = `You have more than ${maxItems} items in your stash. In the future, these items will be lost.`; + obj.social.notifySelf({ message }); + } }, simplify: function (self) { if (!self) return null; + return { type: 'stash' }; + }, + + simplifyTransfer: function () { + const { type, items } = this; + return { - type: 'stash', - active: this.active, - items: this.items, - maxItems: this.maxItems + type, + items }; }, diff --git a/src/server/components/stats.js b/src/server/components/stats.js index 9c0eb015..1b094f5f 100644 --- a/src/server/components/stats.js +++ b/src/server/components/stats.js @@ -629,7 +629,8 @@ module.exports = { source: source.id, heal: true, amount: amount, - crit: heal.crit + crit: heal.crit, + element: heal.element }, recipients); } @@ -776,6 +777,9 @@ module.exports = { }, afterDealDamage: function (damageEvent, target) { + if (damageEvent.element) + return; + const { obj, values: { lifeOnHit } } = this; if (target === obj || !lifeOnHit) diff --git a/src/server/config/clientConfig.js b/src/server/config/clientConfig.js index a2f3934d..6b6a2d47 100644 --- a/src/server/config/clientConfig.js +++ b/src/server/config/clientConfig.js @@ -44,7 +44,8 @@ const config = { 'images/tiles.png': 8, 'images/walls.png': 8, 'images/objects.png': 8, - 'images/mobs.png': 8 + 'images/mobs.png': 8, + 'images/characters.png': 8 }, blockingTileIndices: [ 6, 7, 54, 55, 62, 63, 154, 189, 190, 192, 193, 194, 195, 196, 197 @@ -147,7 +148,7 @@ const config = { //Table Sides 103, 110, 118, 126, //Wall-mounted plants - 120, 122, 140, + 120, 121, //Ship oars 140, 143, //Ship Cannons @@ -173,7 +174,7 @@ const config = { 'party', 'help', 'dialogue', - 'buffs', + 'effects', 'tooltips', 'tooltipInfo', 'tooltipItem', @@ -221,6 +222,11 @@ module.exports = { }); }); + config.clientComponents.push({ + extends: 'effects', + path: 'server/clientComponents/effects/auras.js' + }); + events.emit('onBeforeGetClientConfig', config); //Deprecated diff --git a/src/server/config/effects/effectStunned.js b/src/server/config/effects/effectStunned.js index 45c701dc..ccb46557 100644 --- a/src/server/config/effects/effectStunned.js +++ b/src/server/config/effects/effectStunned.js @@ -2,7 +2,8 @@ module.exports = { type: 'stunned', init: function () { - this.obj.spellbook.stopCasting(); + if (this.obj.spellbook) + this.obj.spellbook.stopCasting(); }, events: { diff --git a/src/server/config/effects/effectTemplate.js b/src/server/config/effects/effectTemplate.js index 24ef084b..166759ef 100644 --- a/src/server/config/effects/effectTemplate.js +++ b/src/server/config/effects/effectTemplate.js @@ -1,4 +1,15 @@ module.exports = { + syncExtend: function (data) { + let effects = this.obj.effects; + effects.syncExtend(this.id, data); + }, + + isFirstOfType: function () { + let effects = this.obj.effects; + let firstOfType = effects.find(f => f.type === this.type); + return (firstOfType.id === this); + }, + save: function () { if (!this.persist) return null; @@ -19,6 +30,9 @@ module.exports = { }, simplify: function () { - return this.type; + return { + id: this.id, + type: this.type + }; } }; diff --git a/src/server/config/serverConfig.js b/src/server/config/serverConfig.js index b04099c6..0ab213e6 100644 --- a/src/server/config/serverConfig.js +++ b/src/server/config/serverConfig.js @@ -1,5 +1,5 @@ module.exports = { - version: '0.10.5', + version: '0.10.6', port: 4000, startupMessage: 'Server: ready', defaultZone: 'fjolarok', diff --git a/src/server/config/skins.js b/src/server/config/skins.js index a6025a13..b674330a 100644 --- a/src/server/config/skins.js +++ b/src/server/config/skins.js @@ -18,11 +18,6 @@ const config = { sprite: [2, 0], defaultSpirit: 'bear', default: true - }, - //Faction Skins - 'gaekatlan-druid': { - name: 'Gaekatlan Druid', - sprite: [0, 1] } }; diff --git a/src/server/config/spells.js b/src/server/config/spells.js index fb5e84f8..6a9be26d 100644 --- a/src/server/config/spells.js +++ b/src/server/config/spells.js @@ -212,6 +212,57 @@ let spells = [{ randomSpeed: true, chance: 0.02 } +}, { + name: 'Healing Touch', + description: 'Restore health to a friendly target.', + type: 'singleTargetHeal', + spellType: 'heal', + icon: [0, 3], + animation: 'raiseStaff', + particles: { + scale: { + start: { + min: 6, + max: 16 + }, + end: { + min: 0, + max: 4 + } + }, + speed: { + start: { + min: 2, + max: 12 + }, + end: { + min: 0, + max: 4 + } + }, + lifetime: { + min: 1, + max: 3 + }, + alpha: { + start: 0.45, + end: 0 + }, + color: { + start: ['ffeb38', 'fcfcfc'], + end: ['fcfcfc', 'faac45'] + }, + spawnType: 'circle', + spawnCircle: { + x: 0, + y: 0, + r: 12 + }, + randomScale: true, + randomColor: true, + randomSpeed: true, + chance: 0.02 + } }, { name: 'Holy Vengeance', description: 'Grants holy vengeance to a friendly target. For the duration of the effect, dealing damage will also heal the attacker.', diff --git a/src/server/config/spells/spellAura.js b/src/server/config/spells/spellAura.js index 7036683b..f0bb5feb 100644 --- a/src/server/config/spells/spellAura.js +++ b/src/server/config/spells/spellAura.js @@ -69,7 +69,7 @@ module.exports = { if (distance > range) { if (effect) { delete effects[m]; - obj.effects.removeEffect(effect); + obj.effects.removeEffect(effect.id); } return; @@ -85,8 +85,7 @@ module.exports = { type: this.effect, amount: amount, caster: this.obj, - ttl: -1, - new: true + ttl: -1 }); }); @@ -96,7 +95,7 @@ module.exports = { delete effects[serverId]; const obj = objects.find(f => ~~f.serverId === ~~serverId); if (obj) - obj.effects.removeEffect(effect); + obj.effects.removeEffect(effect.id); } }); }, @@ -117,7 +116,7 @@ module.exports = { return; } - obj.effects.removeEffect(effect); + obj.effects.removeEffect(effect.id); delete effects[m]; }, this); } diff --git a/src/server/config/spells/spellCharge.js b/src/server/config/spells/spellCharge.js index ec2577fd..7b7a394c 100644 --- a/src/server/config/spells/spellCharge.js +++ b/src/server/config/spells/spellCharge.js @@ -55,19 +55,10 @@ module.exports = { type: 'stunned' }); - if (targetEffect) { - this.obj.instance.syncer.queue('onGetDamage', { - id: target.id, - event: true, - text: 'stunned' - }, -1); - } - let selfEffect = this.obj.effects.addEffect({ type: 'stunned', - noMsg: true, - force: true, - new: true + silent: true, + force: true }); const moveAnimationEffect = { @@ -115,7 +106,7 @@ module.exports = { obj.instance.physics.addObject(obj, obj.x, obj.y); - obj.effects.removeEffect(selfEffect, true); + obj.effects.removeEffect(selfEffect.id); this.obj.aggro.move(); diff --git a/src/server/config/spells/spellFireblast.js b/src/server/config/spells/spellFireblast.js index 288ecf8d..ad90f442 100644 --- a/src/server/config/spells/spellFireblast.js +++ b/src/server/config/spells/spellFireblast.js @@ -115,8 +115,7 @@ module.exports = { const targetEffect = m.effects.addEffect({ type: 'stunned', - noMsg: true, - new: true + silent: true }); //If targetEffect is undefined, it means that the target has become resistant @@ -147,7 +146,7 @@ module.exports = { }, endEffect: function (target, targetPos, targetEffect) { - target.effects.removeEffect(targetEffect, true); + target.effects.removeEffect(targetEffect.id); target.instance.physics.removeObject(target, target.x, target.y); diff --git a/src/server/config/spells/spellIceSpear.js b/src/server/config/spells/spellIceSpear.js index 0d80f9e6..e54dd0e0 100644 --- a/src/server/config/spells/spellIceSpear.js +++ b/src/server/config/spells/spellIceSpear.js @@ -54,19 +54,11 @@ module.exports = { if (this.obj.destroyed) return; - let targetEffect = target.effects.addEffect({ + target.effects.addEffect({ type: 'slowed', ttl: this.freezeDuration }); - if (targetEffect) { - this.obj.instance.syncer.queue('onGetDamage', { - id: target.id, - event: true, - text: 'slowed' - }, -1); - } - let damage = this.getDamage(target); target.stats.takeDamage(damage, this.threatMult, this.obj); } diff --git a/src/server/config/spells/spellReflectDamage.js b/src/server/config/spells/spellReflectDamage.js index e9f8a7a4..d0734285 100644 --- a/src/server/config/spells/spellReflectDamage.js +++ b/src/server/config/spells/spellReflectDamage.js @@ -36,6 +36,6 @@ module.exports = { let obj = this.obj; - obj.effects.removeEffect(selfEffect); + obj.effects.removeEffect(selfEffect.id); } }; diff --git a/src/server/config/spells/spellSingleTargetHeal.js b/src/server/config/spells/spellSingleTargetHeal.js new file mode 100644 index 00000000..939aeb94 --- /dev/null +++ b/src/server/config/spells/spellSingleTargetHeal.js @@ -0,0 +1,41 @@ +module.exports = { + type: 'singleTargetHeal', + + cdMax: 20, + manaCost: 0, + range: 9, + + healing: 1, + + needLos: true, + targetFriendly: true, + + spellType: 'heal', + particleDuration: 10, + + cast: function (action) { + const target = action.target; + const { x, y } = target; + + const amount = this.getDamage(target, true); + target.stats.getHp(amount, this.obj); + + const effect = { + x, + y, + components: [{ + type: 'particles', + //This ttl is in frames (each frame is roughly 1000 / 60 ms) + ttl: (1000 / 60) * this.particleDuration, + destroyObject: true, + blueprint: this.particles + }] + }; + + this.obj.instance.syncer.queue('onGetObject', effect, -1); + + this.sendBump(target); + + return true; + } +}; diff --git a/src/server/config/spells/spellStealth.js b/src/server/config/spells/spellStealth.js index 22ad77e0..afd6d4a8 100644 --- a/src/server/config/spells/spellStealth.js +++ b/src/server/config/spells/spellStealth.js @@ -8,6 +8,8 @@ module.exports = { targetGround: true, + effect: null, + cast: function (action) { //Clear Aggro this.obj.aggro.die(); @@ -15,10 +17,10 @@ module.exports = { let ttl = this.duration * consts.tickTime; let endCallback = this.queueCallback(this.endEffect.bind(this), ttl - 50); - this.obj.effects.addEffect({ + this.effect = this.obj.effects.addEffect({ type: 'stealth', endCallback: endCallback - }); + }); return true; }, @@ -28,7 +30,7 @@ module.exports = { let obj = this.obj; - obj.effects.removeEffectByName('stealth'); + obj.effects.removeEffect(this.effect.id); this.obj.aggro.move(); } }; diff --git a/src/server/config/spells/spellTrailDash.js b/src/server/config/spells/spellTrailDash.js index 8fb06fe8..966a39ac 100644 --- a/src/server/config/spells/spellTrailDash.js +++ b/src/server/config/spells/spellTrailDash.js @@ -164,7 +164,7 @@ module.exports = { this.castingEffect = this.obj.effects.addEffect({ type: 'casting', - noMsg: true + silent: true }); this.casting = true; diff --git a/src/server/config/spellsConfig.js b/src/server/config/spellsConfig.js index 832a81ec..a865fef4 100644 --- a/src/server/config/spellsConfig.js +++ b/src/server/config/spellsConfig.js @@ -76,9 +76,9 @@ let spells = { statType: 'int', statMult: 1, element: 'holy', - cdMax: 5, + cdMax: 15, castTimeMax: 4, - manaCost: 8, + manaCost: 12, range: 9, radius: 3, random: { @@ -87,6 +87,19 @@ let spells = { } }, + 'healing touch': { + statType: 'int', + statMult: 1, + element: 'holy', + cdMax: 5, + castTimeMax: 3, + manaCost: 8, + range: 9, + random: { + healing: [1, 3] + } + }, + slash: { statType: 'str', statMult: 1, @@ -130,7 +143,6 @@ let spells = { cdMax: 12, castTimeMax: 2, manaCost: 7, - noDrop: true, random: { i_range: [1, 2.5], damage: [4, 18] @@ -156,7 +168,6 @@ let spells = { castTimeMax: 3, range: 10, manaCost: 7, - noDrop: true, random: { damage: [8, 35], i_stunDuration: [4, 7] @@ -167,11 +178,12 @@ let spells = { statMult: 1, manaCost: 14, needLos: true, - cdMax: 20, + cdMax: 15, castTimeMax: 0, range: 9, + isAttack: true, random: { - damage: [3, 16], + damage: [3, 18], i_delay: [1, 4] }, negativeStats: [ @@ -219,7 +231,7 @@ let spells = { auraRange: 9, effect: 'swiftness', random: { - chance: [5, 10] + chance: [8, 20] } } diff --git a/src/server/events/phases/phaseGiveRewards.js b/src/server/events/phases/phaseGiveRewards.js index 866fa66d..d4941b92 100644 --- a/src/server/events/phases/phaseGiveRewards.js +++ b/src/server/events/phases/phaseGiveRewards.js @@ -1,6 +1,6 @@ module.exports = { init: function (event) { - const { config, rewards, eventManager } = event; + const { config, rewards, eventManager: eManager } = event; const { name: eventName, rewardSenderName } = config; @@ -26,7 +26,7 @@ module.exports = { }); if ((config.events) && (config.events.afterGiveRewards)) - config.events.afterGiveRewards(eventManager, config); + config.events.afterGiveRewards(eManager, config); this.end = true; } diff --git a/src/server/misc/messages.js b/src/server/misc/messages.js index 3dedcf04..21d08662 100644 --- a/src/server/misc/messages.js +++ b/src/server/misc/messages.js @@ -5,7 +5,8 @@ module.exports = { allFields: 'please complete all fields', illegal: 'illegal characters in username', incorrect: 'invalid username and password', - charExists: 'character name is taken' + charExists: 'character name is taken', + maxUsernameLength: 'username may not be longer than 32 characters' }, createCharacter: { nameLength: 'name must be between 3 and 12 characters' diff --git a/src/server/mods/class-necromancer/index.js b/src/server/mods/class-necromancer/index.js index 23509459..db4823e2 100644 --- a/src/server/mods/class-necromancer/index.js +++ b/src/server/mods/class-necromancer/index.js @@ -126,7 +126,7 @@ module.exports = { range: 1, random: { damage: [4, 14], - healPercent: [10, 30] + healPercent: [2, 15] } }; diff --git a/src/server/objects/objBase.js b/src/server/objects/objBase.js index c9397c01..a7726b3a 100644 --- a/src/server/objects/objBase.js +++ b/src/server/objects/objBase.js @@ -277,7 +277,7 @@ module.exports = { }, performMove: function (action) { - const { x: xOld, y: yOld, syncer, aggro, mob, instance: { physics } } = this; + const { x: xOld, y: yOld, syncer, aggro, instance: { physics } } = this; const { maxDistance = 1, force, data } = action; const { x: xNew, y: yNew } = data; @@ -309,26 +309,16 @@ module.exports = { return false; } - //Don't allow mob overlap during combat - if (mob && mob.target) { - this.x = xNew; - this.y = yNew; + this.x = xNew; + this.y = yNew; - if (physics.addObject(this, xNew, yNew)) - physics.removeObject(this, xOld, yOld); - else { - this.x = xOld; - this.y = yOld; - - return false; - } - } else { + if (physics.addObject(this, xNew, yNew, xOld, yOld)) physics.removeObject(this, xOld, yOld, xNew, yNew); + else { + this.x = xOld; + this.y = yOld; - this.x = xNew; - this.y = yNew; - - physics.addObject(this, xNew, yNew, xOld, yOld); + return false; } //We can't use xNew and yNew because addObject could have changed the position (like entering a building interior with stairs) diff --git a/src/server/objects/objects.js b/src/server/objects/objects.js index 9f9a4374..57b825b8 100644 --- a/src/server/objects/objects.js +++ b/src/server/objects/objects.js @@ -203,64 +203,87 @@ module.exports = { return newO; }, - sendEvent: function (msg) { - let player = this.objects.find(p => p.id === msg.id); - if (!player) + + sendEvent: function (msg, { name: sourceZone }) { + const { id, data } = msg; + + const player = this.objects.find(p => p.id === id); + if (!player || player.zoneName !== sourceZone) return; player.socket.emit('event', { - event: msg.data.event, - data: msg.data.data + event: data.event, + data: data.data }); }, - sendEvents: function (msg) { - let players = {}; - let objects = this.objects; - let data = msg.data; + sendEvents: function ({ data }, { name: sourceZone }) { + const { objects } = this; + + //Store will contain all events to be sent to players + const store = {}; + for (let e in data) { - let event = data[e]; - let eLen = event.length; + const event = data[e]; + const eLen = event.length; for (let j = 0; j < eLen; j++) { - let eventEntry = event[j]; - - let obj = eventEntry.obj; - - if (e !== 'serverModule') { - let to = eventEntry.to; - let toLen = to.length; - for (let i = 0; i < toLen; i++) { - let toId = to[i]; - - let player = players[toId]; - if (!player) { - let findPlayer = objects.find(o => o.id === toId); - if (!findPlayer) - continue; - else { - player = (players[toId] = { - socket: findPlayer.socket, - events: {} - }); - } + const eventEntry = event[j]; + + const { obj: eventObj, to } = eventEntry; + + if (e === 'serverModule') { + const { method, msg } = eventObj; + + if (Array.isArray(msg)) + global[eventObj.module][method](...msg); + else + global[eventObj.module][method](msg); + + continue; + } + + const toLen = to.length; + for (let i = 0; i < toLen; i++) { + const toId = to[i]; + + let storeEntry = store[toId]; + if (!storeEntry) { + const playerObj = objects.find(o => o.id === toId); + + if (!playerObj || playerObj.zoneName !== sourceZone) { + io.setAsync({ + key: new Date(), + table: 'error', + value: `ignoring ${e}` + }); + + continue; } - let eventList = player.events[e] || (player.events[e] = []); - eventList.push(obj); + store[toId] = { + obj: playerObj, + events: { [e]: [eventObj] } + }; + + continue; } - } else if (obj.msg instanceof Array) - global[obj.module][obj.method](...obj.msg); - else - global[obj.module][obj.method](obj.msg); + + if (!storeEntry.events[e]) + storeEntry.events[e] = []; + + storeEntry.events[e].push(eventObj); + } } } - for (let p in players) { - let player = players[p]; - player.socket.emit('events', player.events); + for (let p in store) { + const { obj: { socket }, events } = store[p]; + + socket.emit('events', events); } }, + updateObject: async function (msg) { let player = this.objects.find(p => p.id === msg.serverId); if (!player) @@ -324,6 +347,13 @@ module.exports = { if ((o.update) && (!o.destroyed)) o.update(); + //When objects are sent to other zones, we destroy them immediately (thhrough sendObjToZone) + if (o.forceDestroy) { + i--; + len--; + continue; + } + if (o.ttl) { o.ttl--; if (!o.ttl) diff --git a/src/server/package-lock.json b/src/server/package-lock.json index d022b0eb..90ba298e 100644 --- a/src/server/package-lock.json +++ b/src/server/package-lock.json @@ -1,8 +1,2566 @@ { "name": "isleward_server", - "version": "0.10.4", - "lockfileVersion": 1, + "version": "0.10.6", + "lockfileVersion": 2, "requires": true, + "packages": { + "": { + "name": "isleward_server", + "version": "0.10.6", + "dependencies": { + "axios": "^0.22.0", + "bcrypt-nodejs": "0.0.3", + "compression": "^1.7.4", + "express": "^4.17.1", + "express-minify": "^1.0.0", + "image-size": "^1.0.0", + "rethinkdbdash": "^2.3.31", + "socket.io": "^4.2.0", + "universal-analytics": "^0.5.1" + }, + "devDependencies": { + "babel-eslint": "^10.1.0", + "eslint": "^7.32.0", + "eslint-plugin-prettier": "^4.0.0", + "eslint-plugin-requirejs": "^4.0.1" + } + }, + "node_modules/@babel/code-frame": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.8.3.tgz", + "integrity": "sha512-a9gxpmdXtZEInkCSHUJDLHZVBgb1QS0jhss4cPP93EW7s+uC5bikET2twEF3KV+7rDblJcmNvTR7VJejqd2C2g==", + "dev": true, + "dependencies": { + "@babel/highlight": "^7.8.3" + } + }, + "node_modules/@babel/generator": { + "version": "7.9.4", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.9.4.tgz", + "integrity": "sha512-rjP8ahaDy/ouhrvCoU1E5mqaitWrxwuNGU+dy1EpaoK48jZay4MdkskKGIMHLZNewg8sAsqpGSREJwP0zH3YQA==", + "dev": true, + "dependencies": { + "@babel/types": "^7.9.0", + "jsesc": "^2.5.1", + "lodash": "^4.17.13", + "source-map": "^0.5.0" + } + }, + "node_modules/@babel/generator/node_modules/source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/@babel/helper-function-name": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.8.3.tgz", + "integrity": "sha512-BCxgX1BC2hD/oBlIFUgOCQDOPV8nSINxCwM3o93xP4P9Fq6aV5sgv2cOOITDMtCfQ+3PvHp3l689XZvAM9QyOA==", + "dev": true, + "dependencies": { + "@babel/helper-get-function-arity": "^7.8.3", + "@babel/template": "^7.8.3", + "@babel/types": "^7.8.3" + } + }, + "node_modules/@babel/helper-get-function-arity": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.8.3.tgz", + "integrity": "sha512-FVDR+Gd9iLjUMY1fzE2SR0IuaJToR4RkCDARVfsBBPSP53GEqSFjD8gNyxg246VUyc/ALRxFaAK8rVG7UT7xRA==", + "dev": true, + "dependencies": { + "@babel/types": "^7.8.3" + } + }, + "node_modules/@babel/helper-split-export-declaration": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.8.3.tgz", + "integrity": "sha512-3x3yOeyBhW851hroze7ElzdkeRXQYQbFIb7gLK1WQYsw2GWDay5gAJNw1sWJ0VFP6z5J1whqeXH/WCdCjZv6dA==", + "dev": true, + "dependencies": { + "@babel/types": "^7.8.3" + } + }, + "node_modules/@babel/helper-validator-identifier": { + "version": "7.9.0", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.9.0.tgz", + "integrity": "sha512-6G8bQKjOh+of4PV/ThDm/rRqlU7+IGoJuofpagU5GlEl29Vv0RGqqt86ZGRV8ZuSOY3o+8yXl5y782SMcG7SHw==", + "dev": true + }, + "node_modules/@babel/highlight": { + "version": "7.9.0", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.9.0.tgz", + "integrity": "sha512-lJZPilxX7Op3Nv/2cvFdnlepPXDxi29wxteT57Q965oc5R9v86ztx0jfxVrTcBk8C2kcPkkDa2Z4T3ZsPPVWsQ==", + "dev": true, + "dependencies": { + "@babel/helper-validator-identifier": "^7.9.0", + "chalk": "^2.0.0", + "js-tokens": "^4.0.0" + } + }, + "node_modules/@babel/parser": { + "version": "7.9.4", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.9.4.tgz", + "integrity": "sha512-bC49otXX6N0/VYhgOMh4gnP26E9xnDZK3TmbNpxYzzz9BQLBosQwfyOe9/cXUU3txYhTzLCbcqd5c8y/OmCjHA==", + "dev": true, + "bin": { + "parser": "bin/babel-parser.js" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@babel/template": { + "version": "7.8.6", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.8.6.tgz", + "integrity": "sha512-zbMsPMy/v0PWFZEhQJ66bqjhH+z0JgMoBWuikXybgG3Gkd/3t5oQ1Rw2WQhnSrsOmsKXnZOx15tkC4qON/+JPg==", + "dev": true, + "dependencies": { + "@babel/code-frame": "^7.8.3", + "@babel/parser": "^7.8.6", + "@babel/types": "^7.8.6" + } + }, + "node_modules/@babel/traverse": { + "version": "7.9.0", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.9.0.tgz", + "integrity": "sha512-jAZQj0+kn4WTHO5dUZkZKhbFrqZE7K5LAQ5JysMnmvGij+wOdr+8lWqPeW0BcF4wFwrEXXtdGO7wcV6YPJcf3w==", + "dev": true, + "dependencies": { + "@babel/code-frame": "^7.8.3", + "@babel/generator": "^7.9.0", + "@babel/helper-function-name": "^7.8.3", + "@babel/helper-split-export-declaration": "^7.8.3", + "@babel/parser": "^7.9.0", + "@babel/types": "^7.9.0", + "debug": "^4.1.0", + "globals": "^11.1.0", + "lodash": "^4.17.13" + } + }, + "node_modules/@babel/traverse/node_modules/debug": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", + "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", + "deprecated": "Debug versions >=3.2.0 <3.2.7 || >=4 <4.3.1 have a low-severity ReDos regression when used in a Node.js environment. It is recommended you upgrade to 3.2.7 or 4.3.1. (https://github.com/visionmedia/debug/issues/797)", + "dev": true, + "dependencies": { + "ms": "^2.1.1" + } + }, + "node_modules/@babel/traverse/node_modules/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 + }, + "node_modules/@babel/types": { + "version": "7.9.0", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.9.0.tgz", + "integrity": "sha512-BS9JKfXkzzJl8RluW4JGknzpiUV7ZrvTayM6yfqLTVBEnFtyowVIOu6rqxRd5cVO6yGoWf4T8u8dgK9oB+GCng==", + "dev": true, + "dependencies": { + "@babel/helper-validator-identifier": "^7.9.0", + "lodash": "^4.17.13", + "to-fast-properties": "^2.0.0" + } + }, + "node_modules/@eslint/eslintrc": { + "version": "0.4.3", + "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-0.4.3.tgz", + "integrity": "sha512-J6KFFz5QCYUJq3pf0mjEcCJVERbzv71PUIDczuh9JkwGEzced6CO5ADLHB1rbf/+oPBtoPfMYNOpGDzCANlbXw==", + "dev": true, + "dependencies": { + "ajv": "^6.12.4", + "debug": "^4.1.1", + "espree": "^7.3.0", + "globals": "^13.9.0", + "ignore": "^4.0.6", + "import-fresh": "^3.2.1", + "js-yaml": "^3.13.1", + "minimatch": "^3.0.4", + "strip-json-comments": "^3.1.1" + }, + "engines": { + "node": "^10.12.0 || >=12.0.0" + } + }, + "node_modules/@eslint/eslintrc/node_modules/debug": { + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.2.tgz", + "integrity": "sha512-mOp8wKcvj7XxC78zLgw/ZA+6TSgkoE2C/ienthhRD298T7UNwAg9diBpLRxC0mOezLl4B0xV7M0cCO6P/O0Xhw==", + "dev": true, + "dependencies": { + "ms": "2.1.2" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/@eslint/eslintrc/node_modules/globals": { + "version": "13.11.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-13.11.0.tgz", + "integrity": "sha512-08/xrJ7wQjK9kkkRoI3OFUBbLx4f+6x3SGwcPvQ0QH6goFDrOU2oyAWrmh3dJezu65buo+HBMzAMQy6rovVC3g==", + "dev": true, + "dependencies": { + "type-fest": "^0.20.2" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@eslint/eslintrc/node_modules/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 + }, + "node_modules/@humanwhocodes/config-array": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.5.0.tgz", + "integrity": "sha512-FagtKFz74XrTl7y6HCzQpwDfXP0yhxe9lHLD1UZxjvZIcbyRz8zTFF/yYNfSfzU414eDwZ1SrO0Qvtyf+wFMQg==", + "dev": true, + "dependencies": { + "@humanwhocodes/object-schema": "^1.2.0", + "debug": "^4.1.1", + "minimatch": "^3.0.4" + }, + "engines": { + "node": ">=10.10.0" + } + }, + "node_modules/@humanwhocodes/config-array/node_modules/debug": { + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.2.tgz", + "integrity": "sha512-mOp8wKcvj7XxC78zLgw/ZA+6TSgkoE2C/ienthhRD298T7UNwAg9diBpLRxC0mOezLl4B0xV7M0cCO6P/O0Xhw==", + "dev": true, + "dependencies": { + "ms": "2.1.2" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/@humanwhocodes/config-array/node_modules/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 + }, + "node_modules/@humanwhocodes/object-schema": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-1.2.0.tgz", + "integrity": "sha512-wdppn25U8z/2yiaT6YGquE6X8sSv7hNMWSXYSSU1jGv/yd6XqjXgTDJ8KP4NgjTXfJ3GbRjeeb8RTV7a/VpM+w==", + "dev": true + }, + "node_modules/@types/component-emitter": { + "version": "1.2.10", + "resolved": "https://registry.npmjs.org/@types/component-emitter/-/component-emitter-1.2.10.tgz", + "integrity": "sha512-bsjleuRKWmGqajMerkzox19aGbscQX5rmmvvXl3wlIp5gMG1HgkiwPxsN5p070fBDKTNSPgojVbuY1+HWMbFhg==" + }, + "node_modules/@types/cookie": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/@types/cookie/-/cookie-0.4.1.tgz", + "integrity": "sha512-XW/Aa8APYr6jSVVA1y/DEIZX0/GMKLEVekNG727R8cs56ahETkRAy/3DR7+fJyh7oUgGwNQaRfXCun0+KbWY7Q==" + }, + "node_modules/@types/cors": { + "version": "2.8.12", + "resolved": "https://registry.npmjs.org/@types/cors/-/cors-2.8.12.tgz", + "integrity": "sha512-vt+kDhq/M2ayberEtJcIN/hxXy1Pk+59g2FV/ZQceeaTyCtCucjL2Q7FXlFjtWn4n15KCr1NE2lNNFhp0lEThw==" + }, + "node_modules/@types/node": { + "version": "16.10.3", + "resolved": "https://registry.npmjs.org/@types/node/-/node-16.10.3.tgz", + "integrity": "sha512-ho3Ruq+fFnBrZhUYI46n/bV2GjwzSkwuT4dTf0GkuNFmnb8nq4ny2z9JEVemFi6bdEJanHLlYfy9c6FN9B9McQ==" + }, + "node_modules/accepts": { + "version": "1.3.7", + "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.7.tgz", + "integrity": "sha512-Il80Qs2WjYlJIBNzNkK6KYqlVMTbZLXgHx2oT0pU/fjRHyEp+PEfEPY0R3WCwAGVOtauxh1hOxNgIf5bv7dQpA==", + "dependencies": { + "mime-types": "~2.1.24", + "negotiator": "0.6.2" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/acorn": { + "version": "7.4.1", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-7.4.1.tgz", + "integrity": "sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A==", + "dev": true, + "bin": { + "acorn": "bin/acorn" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/acorn-jsx": { + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz", + "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==", + "dev": true, + "peerDependencies": { + "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" + } + }, + "node_modules/ajv": { + "version": "6.12.6", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", + "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + "dev": true, + "dependencies": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/ansi-colors": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-4.1.1.tgz", + "integrity": "sha512-JoX0apGbHaUJBNl6yF+p6JAFYZ666/hhCGKN5t9QFjbJQKUU/g8MNbFDbvfrgKXvI1QpZplPOnwIo99lX/AAmA==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/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, + "dependencies": { + "color-convert": "^1.9.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/argparse": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", + "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", + "dev": true, + "dependencies": { + "sprintf-js": "~1.0.2" + } + }, + "node_modules/array-flatten": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", + "integrity": "sha1-ml9pkFGx5wczKPKgCJaLZOopVdI=" + }, + "node_modules/astral-regex": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/astral-regex/-/astral-regex-2.0.0.tgz", + "integrity": "sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/axios": { + "version": "0.22.0", + "resolved": "https://registry.npmjs.org/axios/-/axios-0.22.0.tgz", + "integrity": "sha512-Z0U3uhqQeg1oNcihswf4ZD57O3NrR1+ZXhxaROaWpDmsDTx7T2HNBV2ulBtie2hwJptu8UvgnJoK+BIqdzh/1w==", + "dependencies": { + "follow-redirects": "^1.14.4" + } + }, + "node_modules/babel-eslint": { + "version": "10.1.0", + "resolved": "https://registry.npmjs.org/babel-eslint/-/babel-eslint-10.1.0.tgz", + "integrity": "sha512-ifWaTHQ0ce+448CYop8AdrQiBsGrnC+bMgfyKFdi6EsPLTAWG+QfyDeM6OH+FmWnKvEq5NnBMLvlBUPKQZoDSg==", + "deprecated": "babel-eslint is now @babel/eslint-parser. This package will no longer receive updates.", + "dev": true, + "dependencies": { + "@babel/code-frame": "^7.0.0", + "@babel/parser": "^7.7.0", + "@babel/traverse": "^7.7.0", + "@babel/types": "^7.7.0", + "eslint-visitor-keys": "^1.0.0", + "resolve": "^1.12.0" + }, + "engines": { + "node": ">=6" + }, + "peerDependencies": { + "eslint": ">= 4.12.1" + } + }, + "node_modules/balanced-match": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", + "dev": true + }, + "node_modules/base64-arraybuffer": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/base64-arraybuffer/-/base64-arraybuffer-0.1.4.tgz", + "integrity": "sha1-mBjHngWbE1X5fgQooBfIOOkLqBI=", + "engines": { + "node": ">= 0.6.0" + } + }, + "node_modules/base64id": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/base64id/-/base64id-2.0.0.tgz", + "integrity": "sha512-lGe34o6EHj9y3Kts9R4ZYs/Gr+6N7MCaMlIFA3F1R2O5/m7K06AxfSeO5530PEERE6/WyEg3lsuyw4GHlPZHog==", + "engines": { + "node": "^4.5.0 || >= 5.9" + } + }, + "node_modules/bcrypt-nodejs": { + "version": "0.0.3", + "resolved": "https://registry.npmjs.org/bcrypt-nodejs/-/bcrypt-nodejs-0.0.3.tgz", + "integrity": "sha1-xgkX8m3CNWYVZsaBBhwwPCsohCs=", + "deprecated": "bcrypt-nodejs is no longer actively maintained. Please use bcrypt or bcryptjs. See https://github.com/kelektiv/node.bcrypt.js/wiki/bcrypt-vs-brypt.js to learn more about these two options" + }, + "node_modules/bluebird": { + "version": "3.7.2", + "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.7.2.tgz", + "integrity": "sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg==" + }, + "node_modules/body-parser": { + "version": "1.19.0", + "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.19.0.tgz", + "integrity": "sha512-dhEPs72UPbDnAQJ9ZKMNTP6ptJaionhP5cBb541nXPlW60Jepo9RV/a4fX4XWW9CuFNK22krhrj1+rgzifNCsw==", + "dependencies": { + "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" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/body-parser/node_modules/bytes": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.0.tgz", + "integrity": "sha512-zauLjrfCG+xvoyaqLoV8bLVXXNGC4JqlxFCutSDWA6fJrTo2ZuvLYTqZ7aHBLZSMOopbzwv8f+wZcVzfVTI2Dg==", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/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, + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/bytes": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.0.0.tgz", + "integrity": "sha1-0ygVQE1olpn4Wk6k+odV3ROpYEg=", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/callsites": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", + "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/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, + "dependencies": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/clean-css": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/clean-css/-/clean-css-4.2.3.tgz", + "integrity": "sha512-VcMWDN54ZN/DS+g58HYL5/n4Zrqe8vHJpGA8KdgUXFU4fuP/aHNw8eld9SyEIyabIMJX/0RaY/fplOo5hYLSFA==", + "dependencies": { + "source-map": "~0.6.0" + }, + "engines": { + "node": ">= 4.0" + } + }, + "node_modules/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, + "dependencies": { + "color-name": "1.1.3" + } + }, + "node_modules/color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=", + "dev": true + }, + "node_modules/commander": { + "version": "2.20.3", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", + "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==" + }, + "node_modules/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==" + }, + "node_modules/compressible": { + "version": "2.0.18", + "resolved": "https://registry.npmjs.org/compressible/-/compressible-2.0.18.tgz", + "integrity": "sha512-AF3r7P5dWxL8MxyITRMlORQNaOA2IkAFaTr4k7BUumjPtRpGDTZpl0Pb1XCO6JeDCBdp126Cgs9sMxqSjgYyRg==", + "dependencies": { + "mime-db": ">= 1.43.0 < 2" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/compression": { + "version": "1.7.4", + "resolved": "https://registry.npmjs.org/compression/-/compression-1.7.4.tgz", + "integrity": "sha512-jaSIDzP9pZVS4ZfQ+TzvtiWhdpFhE2RDHz8QJkpX9SIpLq88VueF5jJw6t+6CUQcAoA6t+x89MLrWAqpfDE8iQ==", + "dependencies": { + "accepts": "~1.3.5", + "bytes": "3.0.0", + "compressible": "~2.0.16", + "debug": "2.6.9", + "on-headers": "~1.0.2", + "safe-buffer": "5.1.2", + "vary": "~1.1.2" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/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 + }, + "node_modules/content-disposition": { + "version": "0.5.3", + "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.3.tgz", + "integrity": "sha512-ExO0774ikEObIAEV9kDo50o+79VCUdEB6n6lzKgGwupcVeRlhrj3qGAfwq8G6uBJjkqLrhT0qEYFcWng8z1z0g==", + "dependencies": { + "safe-buffer": "5.1.2" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/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==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/cookie": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.4.0.tgz", + "integrity": "sha512-+Hp8fLp57wnUSt0tY0tHEXh4voZRDnoIrZPqlo3DPiI4y9lwg/jqx+1Om94/W6ZaPDOUbnjOt/99w66zk+l1Xg==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/cookie-signature": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz", + "integrity": "sha1-4wOogrNCzD7oylE6eZmXNNqzriw=" + }, + "node_modules/cors": { + "version": "2.8.5", + "resolved": "https://registry.npmjs.org/cors/-/cors-2.8.5.tgz", + "integrity": "sha512-KIHbLJqu73RGr/hnbrO9uBeixNGuvSQjul/jdFvS/KFSIH1hWVd1ng7zOHx+YrEfInLG7q4n6GHQ9cDtxv/P6g==", + "dependencies": { + "object-assign": "^4", + "vary": "^1" + }, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/cross-spawn": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", + "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", + "dev": true, + "dependencies": { + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/deep-is": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz", + "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==", + "dev": true + }, + "node_modules/depd": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz", + "integrity": "sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak=", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/destroy": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.0.4.tgz", + "integrity": "sha1-l4hXRCxEdJ5CBmE+N5RiBYJqvYA=" + }, + "node_modules/doctrine": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz", + "integrity": "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==", + "dev": true, + "dependencies": { + "esutils": "^2.0.2" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/ee-first": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", + "integrity": "sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0=" + }, + "node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "dev": true + }, + "node_modules/encodeurl": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", + "integrity": "sha1-rT/0yG7C0CkyL1oCw6mmBslbP1k=", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/engine.io": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/engine.io/-/engine.io-5.2.1.tgz", + "integrity": "sha512-hyNxjVgWp619QMfqi/+/6/LQF+ueOIWeVOza3TeyvxUGjeT9U/xPkkHW/NJNuhbStrxMujEoMadoc2EY7DDEnw==", + "dependencies": { + "accepts": "~1.3.4", + "base64id": "2.0.0", + "cookie": "~0.4.1", + "cors": "~2.8.5", + "debug": "~4.3.1", + "engine.io-parser": "~4.0.0", + "ws": "~7.4.2" + }, + "engines": { + "node": ">=10.0.0" + } + }, + "node_modules/engine.io-parser": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/engine.io-parser/-/engine.io-parser-4.0.3.tgz", + "integrity": "sha512-xEAAY0msNnESNPc00e19y5heTPX4y/TJ36gr8t1voOaNmTojP9b3oK3BbJLFufW2XFPQaaijpFewm2g2Um3uqA==", + "dependencies": { + "base64-arraybuffer": "0.1.4" + }, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/engine.io/node_modules/cookie": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.4.1.tgz", + "integrity": "sha512-ZwrFkGJxUR3EIoXtO+yVE69Eb7KlixbaeAWfBQB9vVsNn/o+Yw69gBWSSDK825hQNdN+wF8zELf3dFNl/kxkUA==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/engine.io/node_modules/debug": { + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.2.tgz", + "integrity": "sha512-mOp8wKcvj7XxC78zLgw/ZA+6TSgkoE2C/ienthhRD298T7UNwAg9diBpLRxC0mOezLl4B0xV7M0cCO6P/O0Xhw==", + "dependencies": { + "ms": "2.1.2" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/engine.io/node_modules/ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" + }, + "node_modules/enquirer": { + "version": "2.3.6", + "resolved": "https://registry.npmjs.org/enquirer/-/enquirer-2.3.6.tgz", + "integrity": "sha512-yjNnPr315/FjS4zIsUxYguYUPP2e1NK4d7E7ZOLiyYCcbFBiTMyID+2wvm2w6+pZ/odMA7cRkjhsPbltwBOrLg==", + "dev": true, + "dependencies": { + "ansi-colors": "^4.1.1" + }, + "engines": { + "node": ">=8.6" + } + }, + "node_modules/escape-html": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", + "integrity": "sha1-Aljq5NPQwJdN4cFpGI7wBR0dGYg=" + }, + "node_modules/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, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/eslint": { + "version": "7.32.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-7.32.0.tgz", + "integrity": "sha512-VHZ8gX+EDfz+97jGcgyGCyRia/dPOd6Xh9yPv8Bl1+SoaIwD+a/vlrOmGRUyOYu7MwUhc7CxqeaDZU13S4+EpA==", + "dev": true, + "dependencies": { + "@babel/code-frame": "7.12.11", + "@eslint/eslintrc": "^0.4.3", + "@humanwhocodes/config-array": "^0.5.0", + "ajv": "^6.10.0", + "chalk": "^4.0.0", + "cross-spawn": "^7.0.2", + "debug": "^4.0.1", + "doctrine": "^3.0.0", + "enquirer": "^2.3.5", + "escape-string-regexp": "^4.0.0", + "eslint-scope": "^5.1.1", + "eslint-utils": "^2.1.0", + "eslint-visitor-keys": "^2.0.0", + "espree": "^7.3.1", + "esquery": "^1.4.0", + "esutils": "^2.0.2", + "fast-deep-equal": "^3.1.3", + "file-entry-cache": "^6.0.1", + "functional-red-black-tree": "^1.0.1", + "glob-parent": "^5.1.2", + "globals": "^13.6.0", + "ignore": "^4.0.6", + "import-fresh": "^3.0.0", + "imurmurhash": "^0.1.4", + "is-glob": "^4.0.0", + "js-yaml": "^3.13.1", + "json-stable-stringify-without-jsonify": "^1.0.1", + "levn": "^0.4.1", + "lodash.merge": "^4.6.2", + "minimatch": "^3.0.4", + "natural-compare": "^1.4.0", + "optionator": "^0.9.1", + "progress": "^2.0.0", + "regexpp": "^3.1.0", + "semver": "^7.2.1", + "strip-ansi": "^6.0.0", + "strip-json-comments": "^3.1.0", + "table": "^6.0.9", + "text-table": "^0.2.0", + "v8-compile-cache": "^2.0.3" + }, + "bin": { + "eslint": "bin/eslint.js" + }, + "engines": { + "node": "^10.12.0 || >=12.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/eslint-plugin-prettier": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-prettier/-/eslint-plugin-prettier-4.0.0.tgz", + "integrity": "sha512-98MqmCJ7vJodoQK359bqQWaxOE0CS8paAz/GgjaZLyex4TTk3g9HugoO89EqWCrFiOqn9EVvcoo7gZzONCWVwQ==", + "dev": true, + "dependencies": { + "prettier-linter-helpers": "^1.0.0" + }, + "engines": { + "node": ">=6.0.0" + }, + "peerDependencies": { + "eslint": ">=7.28.0", + "prettier": ">=2.0.0" + }, + "peerDependenciesMeta": { + "eslint-config-prettier": { + "optional": true + } + } + }, + "node_modules/eslint-plugin-requirejs": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/eslint-plugin-requirejs/-/eslint-plugin-requirejs-4.0.1.tgz", + "integrity": "sha512-7SCBeOZha5E1TGRxbfvNypG0/1Da3gonaT8IeWfNN9iUriamtnwXrGwYipEFr/yMHNCHRpua4LL/7DSov6aUEQ==", + "dev": true, + "dependencies": { + "ignore": "5.0.5" + }, + "engines": { + "node": ">=6" + }, + "peerDependencies": { + "eslint": ">=3.0.0" + } + }, + "node_modules/eslint-plugin-requirejs/node_modules/ignore": { + "version": "5.0.5", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.0.5.tgz", + "integrity": "sha512-kOC8IUb8HSDMVcYrDVezCxpJkzSQWTAzf3olpKM6o9rM5zpojx23O0Fl8Wr4+qJ6ZbPEHqf1fdwev/DS7v7pmA==", + "dev": true, + "engines": { + "node": ">= 4" + } + }, + "node_modules/eslint-scope": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz", + "integrity": "sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==", + "dev": true, + "dependencies": { + "esrecurse": "^4.3.0", + "estraverse": "^4.1.1" + }, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/eslint-utils": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-2.1.0.tgz", + "integrity": "sha512-w94dQYoauyvlDc43XnGB8lU3Zt713vNChgt4EWwhXAP2XkBvndfxF0AgIqKOOasjPIPzj9JqgwkwbCYD0/V3Zg==", + "dev": true, + "dependencies": { + "eslint-visitor-keys": "^1.1.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/mysticatea" + } + }, + "node_modules/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, + "engines": { + "node": ">=4" + } + }, + "node_modules/eslint/node_modules/@babel/code-frame": { + "version": "7.12.11", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.12.11.tgz", + "integrity": "sha512-Zt1yodBx1UcyiePMSkWnU4hPqhwq7hGi2nFL1LeA3EUl+q2LQx16MISgJ0+z7dnmgvP9QtIleuETGOiOH1RcIw==", + "dev": true, + "dependencies": { + "@babel/highlight": "^7.10.4" + } + }, + "node_modules/eslint/node_modules/@babel/helper-validator-identifier": { + "version": "7.15.7", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.15.7.tgz", + "integrity": "sha512-K4JvCtQqad9OY2+yTU8w+E82ywk/fe+ELNlt1G8z3bVGlZfn/hOcQQsUhGhW/N+tb3fxK800wLtKOE/aM0m72w==", + "dev": true, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/eslint/node_modules/@babel/highlight": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.14.5.tgz", + "integrity": "sha512-qf9u2WFWVV0MppaL877j2dBtQIDgmidgjGk5VIMw3OadXvYaXn66U1BFlH2t4+t3i+8PhedppRv+i40ABzd+gg==", + "dev": true, + "dependencies": { + "@babel/helper-validator-identifier": "^7.14.5", + "chalk": "^2.0.0", + "js-tokens": "^4.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/eslint/node_modules/@babel/highlight/node_modules/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, + "dependencies": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/eslint/node_modules/@babel/highlight/node_modules/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, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/eslint/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/eslint/node_modules/chalk/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/eslint/node_modules/chalk/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/eslint/node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/eslint/node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "node_modules/eslint/node_modules/debug": { + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.2.tgz", + "integrity": "sha512-mOp8wKcvj7XxC78zLgw/ZA+6TSgkoE2C/ienthhRD298T7UNwAg9diBpLRxC0mOezLl4B0xV7M0cCO6P/O0Xhw==", + "dev": true, + "dependencies": { + "ms": "2.1.2" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/eslint/node_modules/escape-string-regexp": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", + "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/eslint/node_modules/eslint-visitor-keys": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-2.1.0.tgz", + "integrity": "sha512-0rSmRBzXgDzIsD6mGdJgevzgezI534Cer5L/vyMX0kHzT/jiB43jRhd9YUlMGYLQy2zprNmoT8qasCGtY+QaKw==", + "dev": true, + "engines": { + "node": ">=10" + } + }, + "node_modules/eslint/node_modules/fast-deep-equal": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", + "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", + "dev": true + }, + "node_modules/eslint/node_modules/globals": { + "version": "13.11.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-13.11.0.tgz", + "integrity": "sha512-08/xrJ7wQjK9kkkRoI3OFUBbLx4f+6x3SGwcPvQ0QH6goFDrOU2oyAWrmh3dJezu65buo+HBMzAMQy6rovVC3g==", + "dev": true, + "dependencies": { + "type-fest": "^0.20.2" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/eslint/node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/eslint/node_modules/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 + }, + "node_modules/espree": { + "version": "7.3.1", + "resolved": "https://registry.npmjs.org/espree/-/espree-7.3.1.tgz", + "integrity": "sha512-v3JCNCE64umkFpmkFGqzVKsOT0tN1Zr+ueqLZfpV1Ob8e+CEgPWa+OxCoGH3tnhimMKIaBm4m/vaRpJ/krRz2g==", + "dev": true, + "dependencies": { + "acorn": "^7.4.0", + "acorn-jsx": "^5.3.1", + "eslint-visitor-keys": "^1.3.0" + }, + "engines": { + "node": "^10.12.0 || >=12.0.0" + } + }, + "node_modules/espree/node_modules/eslint-visitor-keys": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.3.0.tgz", + "integrity": "sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/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, + "bin": { + "esparse": "bin/esparse.js", + "esvalidate": "bin/esvalidate.js" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/esquery": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.4.0.tgz", + "integrity": "sha512-cCDispWt5vHHtwMY2YrAQ4ibFkAL8RbH5YGBnZBc90MolvvfkkQcJro/aZiAQUlQ3qgrYS6D6v8Gc5G5CQsc9w==", + "dev": true, + "dependencies": { + "estraverse": "^5.1.0" + }, + "engines": { + "node": ">=0.10" + } + }, + "node_modules/esquery/node_modules/estraverse": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.2.0.tgz", + "integrity": "sha512-BxbNGGNm0RyRYvUdHpIwv9IWzeM9XClbOxwoATuFdOE7ZE6wHL+HQ5T8hoPM+zHvmKzzsEqhgy0GrQ5X13afiQ==", + "dev": true, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/esrecurse": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", + "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", + "dev": true, + "dependencies": { + "estraverse": "^5.2.0" + }, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/esrecurse/node_modules/estraverse": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.2.0.tgz", + "integrity": "sha512-BxbNGGNm0RyRYvUdHpIwv9IWzeM9XClbOxwoATuFdOE7ZE6wHL+HQ5T8hoPM+zHvmKzzsEqhgy0GrQ5X13afiQ==", + "dev": true, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/estraverse": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", + "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", + "dev": true, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/esutils": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", + "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/etag": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", + "integrity": "sha1-Qa4u62XvpiJorr/qg6x9eSmbCIc=", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/express": { + "version": "4.17.1", + "resolved": "https://registry.npmjs.org/express/-/express-4.17.1.tgz", + "integrity": "sha512-mHJ9O79RqluphRrcw2X/GTh3k9tVv8YcoyY4Kkh4WDMUYKRZUq0h1o0w2rrrxBqM7VoeUVqgb27xlEMXTnYt4g==", + "dependencies": { + "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" + }, + "engines": { + "node": ">= 0.10.0" + } + }, + "node_modules/express-minify": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/express-minify/-/express-minify-1.0.0.tgz", + "integrity": "sha512-04/iYxB79jGeNZBBkbAW7L7FMG4Wtu78F1SayXIKiJD6MfqYnOI3DD8no7QOntgedYCdYUpj+Skg8QWR/2WnMQ==", + "dependencies": { + "clean-css": "^4.1.7", + "on-headers": "^1.0.1", + "uglify-js": "^3.0.28" + }, + "engines": { + "node": ">= 4.0.0" + } + }, + "node_modules/fast-deep-equal": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.1.tgz", + "integrity": "sha512-8UEa58QDLauDNfpbrX55Q9jrGHThw2ZMdOky5Gl1CDtVeJDPVrG4Jxx1N8jw2gkWaff5UUuX1KJd+9zGe2B+ZA==", + "dev": true + }, + "node_modules/fast-diff": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/fast-diff/-/fast-diff-1.2.0.tgz", + "integrity": "sha512-xJuoT5+L99XlZ8twedaRf6Ax2TgQVxvgZOYoPKqZufmJib0tL2tegPBOZb1pVNgIhlqDlA0eO0c3wBvQcmzx4w==", + "dev": true + }, + "node_modules/fast-json-stable-stringify": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", + "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", + "dev": true + }, + "node_modules/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 + }, + "node_modules/file-entry-cache": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-6.0.1.tgz", + "integrity": "sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==", + "dev": true, + "dependencies": { + "flat-cache": "^3.0.4" + }, + "engines": { + "node": "^10.12.0 || >=12.0.0" + } + }, + "node_modules/finalhandler": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.1.2.tgz", + "integrity": "sha512-aAWcW57uxVNrQZqFXjITpW3sIUQmHGG3qSb9mUah9MgMC4NeWhNOlNjXEYq3HjRAvL6arUviZGGJsBg6z0zsWA==", + "dependencies": { + "debug": "2.6.9", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "on-finished": "~2.3.0", + "parseurl": "~1.3.3", + "statuses": "~1.5.0", + "unpipe": "~1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/flat-cache": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-3.0.4.tgz", + "integrity": "sha512-dm9s5Pw7Jc0GvMYbshN6zchCA9RgQlzzEZX3vylR9IqFfS8XciblUXOKfW6SiuJ0e13eDYZoZV5wdrev7P3Nwg==", + "dev": true, + "dependencies": { + "flatted": "^3.1.0", + "rimraf": "^3.0.2" + }, + "engines": { + "node": "^10.12.0 || >=12.0.0" + } + }, + "node_modules/flatted": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.2.2.tgz", + "integrity": "sha512-JaTY/wtrcSyvXJl4IMFHPKyFur1sE9AUqc0QnhOaJ0CxHtAoIV8pYDzeEfAaNEtGkOfq4gr3LBFmdXW5mOQFnA==", + "dev": true + }, + "node_modules/follow-redirects": { + "version": "1.14.8", + "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.14.8.tgz", + "integrity": "sha512-1x0S9UVJHsQprFcEC/qnNzBLcIxsjAV905f/UkQxbclCsoTWlacCNOpQa/anodLl2uaEKFhfWOvM2Qg77+15zA==", + "funding": [ + { + "type": "individual", + "url": "https://github.com/sponsors/RubenVerborgh" + } + ], + "engines": { + "node": ">=4.0" + }, + "peerDependenciesMeta": { + "debug": { + "optional": true + } + } + }, + "node_modules/forwarded": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.1.2.tgz", + "integrity": "sha1-mMI9qxF1ZXuMBXPozszZGw/xjIQ=", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/fresh": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", + "integrity": "sha1-PYyt2Q2XZWn6g1qx+OSyOhBWBac=", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/fs.realpath": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=", + "dev": true + }, + "node_modules/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 + }, + "node_modules/glob": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.0.tgz", + "integrity": "sha512-lmLf6gtyrPq8tTjSmrO94wBeQbFR3HbLHbuyD69wuyQkImp2hWqMGB47OX65FBkPffO641IP9jWa1z4ivqG26Q==", + "dev": true, + "dependencies": { + "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" + }, + "engines": { + "node": "*" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/glob-parent": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "dev": true, + "dependencies": { + "is-glob": "^4.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/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, + "engines": { + "node": ">=4" + } + }, + "node_modules/has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/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==", + "dependencies": { + "depd": "~1.1.2", + "inherits": "2.0.3", + "setprototypeof": "1.1.1", + "statuses": ">= 1.5.0 < 2", + "toidentifier": "1.0.0" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/iconv-lite": { + "version": "0.4.24", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", + "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", + "dependencies": { + "safer-buffer": ">= 2.1.2 < 3" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/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, + "engines": { + "node": ">= 4" + } + }, + "node_modules/image-size": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/image-size/-/image-size-1.0.0.tgz", + "integrity": "sha512-JLJ6OwBfO1KcA+TvJT+v8gbE6iWbj24LyDNFgFEN0lzegn6cC6a/p3NIDaepMsJjQjlUWqIC7wJv8lBFxPNjcw==", + "dependencies": { + "queue": "6.0.2" + }, + "bin": { + "image-size": "bin/image-size.js" + }, + "engines": { + "node": ">=12.0.0" + } + }, + "node_modules/import-fresh": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz", + "integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==", + "dev": true, + "dependencies": { + "parent-module": "^1.0.0", + "resolve-from": "^4.0.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/imurmurhash": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", + "integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o=", + "dev": true, + "engines": { + "node": ">=0.8.19" + } + }, + "node_modules/inflight": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", + "dev": true, + "dependencies": { + "once": "^1.3.0", + "wrappy": "1" + } + }, + "node_modules/inherits": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", + "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=" + }, + "node_modules/ipaddr.js": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz", + "integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==", + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/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, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/is-glob": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", + "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", + "dev": true, + "dependencies": { + "is-extglob": "^2.1.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=", + "dev": true + }, + "node_modules/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 + }, + "node_modules/js-yaml": { + "version": "3.14.1", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz", + "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==", + "dev": true, + "dependencies": { + "argparse": "^1.0.7", + "esprima": "^4.0.0" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, + "node_modules/jsesc": { + "version": "2.5.2", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz", + "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==", + "dev": true, + "bin": { + "jsesc": "bin/jsesc" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/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 + }, + "node_modules/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 + }, + "node_modules/levn": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz", + "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==", + "dev": true, + "dependencies": { + "prelude-ls": "^1.2.1", + "type-check": "~0.4.0" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/lodash": { + "version": "4.17.21", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", + "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==", + "dev": true + }, + "node_modules/lodash.clonedeep": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/lodash.clonedeep/-/lodash.clonedeep-4.5.0.tgz", + "integrity": "sha1-4j8/nE+Pvd6HJSnBBxhXoIblzO8=", + "dev": true + }, + "node_modules/lodash.merge": { + "version": "4.6.2", + "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", + "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==", + "dev": true + }, + "node_modules/lodash.truncate": { + "version": "4.4.2", + "resolved": "https://registry.npmjs.org/lodash.truncate/-/lodash.truncate-4.4.2.tgz", + "integrity": "sha1-WjUNoLERO4N+z//VgSy+WNbq4ZM=", + "dev": true + }, + "node_modules/lru-cache": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "dev": true, + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/media-typer": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", + "integrity": "sha1-hxDXrwqmJvj/+hzgAWhUUmMlV0g=", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/merge-descriptors": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz", + "integrity": "sha1-sAqqVW3YtEVoFQ7J0blT8/kMu2E=" + }, + "node_modules/methods": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", + "integrity": "sha1-VSmk1nZUE07cxSZmVoNbD4Ua/O4=", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/mime": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", + "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==", + "bin": { + "mime": "cli.js" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/mime-db": { + "version": "1.43.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.43.0.tgz", + "integrity": "sha512-+5dsGEEovYbT8UY9yD7eE4XTc4UwJ1jBYlgaQQF38ENsKR3wj/8q8RFZrF9WIZpB2V1ArTVFUva8sAul1NzRzQ==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/mime-types": { + "version": "2.1.26", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.26.tgz", + "integrity": "sha512-01paPWYgLrkqAyrlDorC1uDwl2p3qZT7yl806vW7DvDoxwXi46jsjFbg+WdwotBIk6/MbEhO/dh5aZ5sNj/dWQ==", + "dependencies": { + "mime-db": "1.43.0" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/minimatch": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", + "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", + "dev": true, + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" + }, + "node_modules/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 + }, + "node_modules/negotiator": { + "version": "0.6.2", + "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.2.tgz", + "integrity": "sha512-hZXc7K2e+PgeI1eDBe/10Ard4ekbfrrqG8Ep+8Jmf4JID2bNg7NvCPOZN+kfF574pFQI7mum2AUqDidoKqcTOw==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/object-assign": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", + "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/on-finished": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.3.0.tgz", + "integrity": "sha1-IPEzZIGwg811M3mSoWlxqi2QaUc=", + "dependencies": { + "ee-first": "1.1.1" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/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==", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", + "dev": true, + "dependencies": { + "wrappy": "1" + } + }, + "node_modules/optionator": { + "version": "0.9.1", + "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.1.tgz", + "integrity": "sha512-74RlY5FCnhq4jRxVUPKDaRwrVNXMqsGsiW6AJw4XK8hmtm10wC0ypZBLw5IIp85NZMr91+qd1RvvENwg7jjRFw==", + "dev": true, + "dependencies": { + "deep-is": "^0.1.3", + "fast-levenshtein": "^2.0.6", + "levn": "^0.4.1", + "prelude-ls": "^1.2.1", + "type-check": "^0.4.0", + "word-wrap": "^1.2.3" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/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, + "dependencies": { + "callsites": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/parseurl": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", + "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/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, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/path-key": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", + "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/path-parse": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", + "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", + "dev": true + }, + "node_modules/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=" + }, + "node_modules/prelude-ls": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", + "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==", + "dev": true, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/prettier-linter-helpers": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/prettier-linter-helpers/-/prettier-linter-helpers-1.0.0.tgz", + "integrity": "sha512-GbK2cP9nraSSUF9N2XwUwqfzlAFlMNYYl+ShE/V+H8a9uNl/oUqB1w2EL54Jh0OlyRSd8RfWYJ3coVS4TROP2w==", + "dev": true, + "dependencies": { + "fast-diff": "^1.1.2" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/progress": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/progress/-/progress-2.0.3.tgz", + "integrity": "sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==", + "dev": true, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/proxy-addr": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.6.tgz", + "integrity": "sha512-dh/frvCBVmSsDYzw6n926jv974gddhkFPfiN8hPOi30Wax25QZyZEGveluCgliBnqmuM+UJmBErbAUFIoDbjOw==", + "dependencies": { + "forwarded": "~0.1.2", + "ipaddr.js": "1.9.1" + }, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/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, + "engines": { + "node": ">=6" + } + }, + "node_modules/qs": { + "version": "6.7.0", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.7.0.tgz", + "integrity": "sha512-VCdBRNFTX1fyE7Nb6FYoURo/SPe62QCaAyzJvUjwRaIsc+NePBEniHlvxFmmX56+HZphIGtV0XeCirBtpDrTyQ==", + "engines": { + "node": ">=0.6" + } + }, + "node_modules/queue": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/queue/-/queue-6.0.2.tgz", + "integrity": "sha512-iHZWu+q3IdFZFX36ro/lKBkSvfkztY5Y7HMiPlOUjhupPcG2JMfst2KKEpu5XndviX/3UhFbRngUPNKtgvtZiA==", + "dependencies": { + "inherits": "~2.0.3" + } + }, + "node_modules/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==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/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==", + "dependencies": { + "bytes": "3.1.0", + "http-errors": "1.7.2", + "iconv-lite": "0.4.24", + "unpipe": "1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/raw-body/node_modules/bytes": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.0.tgz", + "integrity": "sha512-zauLjrfCG+xvoyaqLoV8bLVXXNGC4JqlxFCutSDWA6fJrTo2ZuvLYTqZ7aHBLZSMOopbzwv8f+wZcVzfVTI2Dg==", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/regexpp": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/regexpp/-/regexpp-3.2.0.tgz", + "integrity": "sha512-pq2bWo9mVD43nbts2wGv17XLiNLya+GklZ8kaDLV2Z08gDCsGpnKn9BFMepvWuHCbyVvY7J5o5+BVvoQbmlJLg==", + "dev": true, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/mysticatea" + } + }, + "node_modules/require-from-string": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz", + "integrity": "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/resolve": { + "version": "1.15.1", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.15.1.tgz", + "integrity": "sha512-84oo6ZTtoTUpjgNEr5SJyzQhzL72gaRodsSfyxC/AXRvwu0Yse9H8eF9IpGo7b8YetZhlI6v7ZQ6bKBFV/6S7w==", + "dev": true, + "dependencies": { + "path-parse": "^1.0.6" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/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, + "engines": { + "node": ">=4" + } + }, + "node_modules/rethinkdbdash": { + "version": "2.3.31", + "resolved": "https://registry.npmjs.org/rethinkdbdash/-/rethinkdbdash-2.3.31.tgz", + "integrity": "sha512-6nXrKFjdg2Ug0YpdmPWSvyD/2EisHnFNt4FWZ74dcXGK48ievSv+cNFTmVv+KjLi6I9CCf6w4CKZ6yCYTfMfdQ==", + "dependencies": { + "bluebird": ">= 3.0.1" + } + }, + "node_modules/rimraf": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", + "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", + "dev": true, + "dependencies": { + "glob": "^7.1.3" + }, + "bin": { + "rimraf": "bin.js" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/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==" + }, + "node_modules/safer-buffer": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" + }, + "node_modules/semver": { + "version": "7.3.5", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.5.tgz", + "integrity": "sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ==", + "dev": true, + "dependencies": { + "lru-cache": "^6.0.0" + }, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/send": { + "version": "0.17.1", + "resolved": "https://registry.npmjs.org/send/-/send-0.17.1.tgz", + "integrity": "sha512-BsVKsiGcQMFwT8UxypobUKyv7irCNRHk1T0G680vk88yf6LBByGcZJOTJCrTP2xVN6yI+XjPJcNuE3V4fT9sAg==", + "dependencies": { + "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" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/send/node_modules/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==" + }, + "node_modules/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==", + "dependencies": { + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "parseurl": "~1.3.3", + "send": "0.17.1" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/setprototypeof": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.1.tgz", + "integrity": "sha512-JvdAWfbXeIGaZ9cILp38HntZSFSo3mWg6xGcJJsd+d4aRMOqauag1C63dJfDw7OaMYwEbHMOxEZ1lqVRYP2OAw==" + }, + "node_modules/shebang-command": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", + "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", + "dev": true, + "dependencies": { + "shebang-regex": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/shebang-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", + "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/slice-ansi": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-4.0.0.tgz", + "integrity": "sha512-qMCMfhY040cVHT43K9BFygqYbUPFZKHOg7K73mtTWJRb8pyP3fzf4Ixd5SzdEJQ6MRUg/WBnOLxghZtKKurENQ==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.0.0", + "astral-regex": "^2.0.0", + "is-fullwidth-code-point": "^3.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/slice-ansi?sponsor=1" + } + }, + "node_modules/slice-ansi/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/slice-ansi/node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/slice-ansi/node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "node_modules/socket.io": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/socket.io/-/socket.io-4.2.0.tgz", + "integrity": "sha512-sjlGfMmnaWvTRVxGRGWyhd9ctpg4APxWAxu85O/SxekkxHhfxmePWZbaYCkeX5QQX0z1YEnKOlNt6w82E4Nzug==", + "dependencies": { + "@types/cookie": "^0.4.1", + "@types/cors": "^2.8.12", + "@types/node": ">=10.0.0", + "accepts": "~1.3.4", + "base64id": "~2.0.0", + "debug": "~4.3.2", + "engine.io": "~5.2.0", + "socket.io-adapter": "~2.3.2", + "socket.io-parser": "~4.0.4" + }, + "engines": { + "node": ">=10.0.0" + } + }, + "node_modules/socket.io-adapter": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/socket.io-adapter/-/socket.io-adapter-2.3.2.tgz", + "integrity": "sha512-PBZpxUPYjmoogY0aoaTmo1643JelsaS1CiAwNjRVdrI0X9Seuc19Y2Wife8k88avW6haG8cznvwbubAZwH4Mtg==" + }, + "node_modules/socket.io-parser": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/socket.io-parser/-/socket.io-parser-4.0.4.tgz", + "integrity": "sha512-t+b0SS+IxG7Rxzda2EVvyBZbvFPBCjJoyHuE0P//7OAsN23GItzDRdWa6ALxZI/8R5ygK7jAR6t028/z+7295g==", + "dependencies": { + "@types/component-emitter": "^1.2.10", + "component-emitter": "~1.3.0", + "debug": "~4.3.1" + }, + "engines": { + "node": ">=10.0.0" + } + }, + "node_modules/socket.io-parser/node_modules/debug": { + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.2.tgz", + "integrity": "sha512-mOp8wKcvj7XxC78zLgw/ZA+6TSgkoE2C/ienthhRD298T7UNwAg9diBpLRxC0mOezLl4B0xV7M0cCO6P/O0Xhw==", + "dependencies": { + "ms": "2.1.2" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/socket.io-parser/node_modules/ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" + }, + "node_modules/socket.io/node_modules/debug": { + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.2.tgz", + "integrity": "sha512-mOp8wKcvj7XxC78zLgw/ZA+6TSgkoE2C/ienthhRD298T7UNwAg9diBpLRxC0mOezLl4B0xV7M0cCO6P/O0Xhw==", + "dependencies": { + "ms": "2.1.2" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/socket.io/node_modules/ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" + }, + "node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/sprintf-js": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", + "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=", + "dev": true + }, + "node_modules/statuses": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz", + "integrity": "sha1-Fhx9rBd2Wf2YEfQ3cfqZOBR4Yow=", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dev": true, + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dev": true, + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-json-comments": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", + "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", + "dev": true, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/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, + "dependencies": { + "has-flag": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/table": { + "version": "6.7.2", + "resolved": "https://registry.npmjs.org/table/-/table-6.7.2.tgz", + "integrity": "sha512-UFZK67uvyNivLeQbVtkiUs8Uuuxv24aSL4/Vil2PJVtMgU8Lx0CYkP12uCGa3kjyQzOSgV1+z9Wkb82fCGsO0g==", + "dev": true, + "dependencies": { + "ajv": "^8.0.1", + "lodash.clonedeep": "^4.5.0", + "lodash.truncate": "^4.4.2", + "slice-ansi": "^4.0.0", + "string-width": "^4.2.3", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=10.0.0" + } + }, + "node_modules/table/node_modules/ajv": { + "version": "8.6.3", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.6.3.tgz", + "integrity": "sha512-SMJOdDP6LqTkD0Uq8qLi+gMwSt0imXLSV080qFVwJCpH9U6Mb+SUGHAXM0KNbcBPguytWyvFxcHgMLe2D2XSpw==", + "dev": true, + "dependencies": { + "fast-deep-equal": "^3.1.1", + "json-schema-traverse": "^1.0.0", + "require-from-string": "^2.0.2", + "uri-js": "^4.2.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/table/node_modules/json-schema-traverse": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", + "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", + "dev": true + }, + "node_modules/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 + }, + "node_modules/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, + "engines": { + "node": ">=4" + } + }, + "node_modules/toidentifier": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.0.tgz", + "integrity": "sha512-yaOH/Pk/VEhBWWTlhI+qXxDFXlejDGcQipMlyxda9nthulaxLZUNcUqFxokp0vcYnvteJln5FNQDRrxj3YcbVw==", + "engines": { + "node": ">=0.6" + } + }, + "node_modules/type-check": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", + "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==", + "dev": true, + "dependencies": { + "prelude-ls": "^1.2.1" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/type-fest": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", + "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/type-is": { + "version": "1.6.18", + "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz", + "integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==", + "dependencies": { + "media-typer": "0.3.0", + "mime-types": "~2.1.24" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/uglify-js": { + "version": "3.8.1", + "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.8.1.tgz", + "integrity": "sha512-W7KxyzeaQmZvUFbGj4+YFshhVrMBGSg2IbcYAjGWGvx8DHvJMclbTDMpffdxFUGPBHjIytk7KJUR/KUXstUGDw==", + "dependencies": { + "commander": "~2.20.3", + "source-map": "~0.6.1" + }, + "bin": { + "uglifyjs": "bin/uglifyjs" + }, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/universal-analytics": { + "version": "0.5.1", + "resolved": "https://registry.npmjs.org/universal-analytics/-/universal-analytics-0.5.1.tgz", + "integrity": "sha512-raLjYsNQmJbK0o8veSU9GXA5XG/YhfuZDzWCAB4SNDnPI4ozXLrbFSDZiRENdOFEIUqmdUTYcaQCOa0Y36EtsQ==", + "dependencies": { + "debug": "^4.1.1", + "uuid": "^8.0.0" + }, + "engines": { + "node": ">=12.18.2" + } + }, + "node_modules/universal-analytics/node_modules/debug": { + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.2.tgz", + "integrity": "sha512-mOp8wKcvj7XxC78zLgw/ZA+6TSgkoE2C/ienthhRD298T7UNwAg9diBpLRxC0mOezLl4B0xV7M0cCO6P/O0Xhw==", + "dependencies": { + "ms": "2.1.2" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/universal-analytics/node_modules/ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" + }, + "node_modules/unpipe": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", + "integrity": "sha1-sr9O6FFKrmFltIF4KdIbLvSZBOw=", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/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, + "dependencies": { + "punycode": "^2.1.0" + } + }, + "node_modules/utils-merge": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz", + "integrity": "sha1-n5VxD1CiZ5R7LMwSR0HBAoQn5xM=", + "engines": { + "node": ">= 0.4.0" + } + }, + "node_modules/uuid": { + "version": "8.3.2", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz", + "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==", + "bin": { + "uuid": "dist/bin/uuid" + } + }, + "node_modules/v8-compile-cache": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/v8-compile-cache/-/v8-compile-cache-2.3.0.tgz", + "integrity": "sha512-l8lCEmLcLYZh4nbunNZvQCJc5pv7+RCwa8q/LdUx8u7lsWvPDKmpodJAJNwkAhJC//dFY48KuIEmjtd4RViDrA==", + "dev": true + }, + "node_modules/vary": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", + "integrity": "sha1-IpnwLG3tMNSllhsLn3RSShj2NPw=", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/which": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "dev": true, + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "node-which": "bin/node-which" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/word-wrap": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.3.tgz", + "integrity": "sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=", + "dev": true + }, + "node_modules/ws": { + "version": "7.4.6", + "resolved": "https://registry.npmjs.org/ws/-/ws-7.4.6.tgz", + "integrity": "sha512-YmhHDO4MzaDLB+M9ym/mDA5z0naX8j7SIlT8f8z+I0VtzsRbekxEutHSme7NPS2qE8StCYQNUnfWdXta/Yu85A==", + "engines": { + "node": ">=8.3.0" + }, + "peerDependencies": { + "bufferutil": "^4.0.1", + "utf-8-validate": "^5.0.2" + }, + "peerDependenciesMeta": { + "bufferutil": { + "optional": true + }, + "utf-8-validate": { + "optional": true + } + } + }, + "node_modules/yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "dev": true + } + }, "dependencies": { "@babel/code-frame": { "version": "7.8.3", @@ -145,6 +2703,7 @@ "version": "0.4.3", "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-0.4.3.tgz", "integrity": "sha512-J6KFFz5QCYUJq3pf0mjEcCJVERbzv71PUIDczuh9JkwGEzced6CO5ADLHB1rbf/+oPBtoPfMYNOpGDzCANlbXw==", + "dev": true, "requires": { "ajv": "^6.12.4", "debug": "^4.1.1", @@ -157,21 +2716,11 @@ "strip-json-comments": "^3.1.1" }, "dependencies": { - "ajv": { - "version": "6.12.6", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", - "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", - "requires": { - "fast-deep-equal": "^3.1.1", - "fast-json-stable-stringify": "^2.0.0", - "json-schema-traverse": "^0.4.1", - "uri-js": "^4.2.2" - } - }, "debug": { "version": "4.3.2", "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.2.tgz", "integrity": "sha512-mOp8wKcvj7XxC78zLgw/ZA+6TSgkoE2C/ienthhRD298T7UNwAg9diBpLRxC0mOezLl4B0xV7M0cCO6P/O0Xhw==", + "dev": true, "requires": { "ms": "2.1.2" } @@ -180,6 +2729,7 @@ "version": "13.11.0", "resolved": "https://registry.npmjs.org/globals/-/globals-13.11.0.tgz", "integrity": "sha512-08/xrJ7wQjK9kkkRoI3OFUBbLx4f+6x3SGwcPvQ0QH6goFDrOU2oyAWrmh3dJezu65buo+HBMzAMQy6rovVC3g==", + "dev": true, "requires": { "type-fest": "^0.20.2" } @@ -187,7 +2737,8 @@ "ms": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "dev": true } } }, @@ -195,6 +2746,7 @@ "version": "0.5.0", "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.5.0.tgz", "integrity": "sha512-FagtKFz74XrTl7y6HCzQpwDfXP0yhxe9lHLD1UZxjvZIcbyRz8zTFF/yYNfSfzU414eDwZ1SrO0Qvtyf+wFMQg==", + "dev": true, "requires": { "@humanwhocodes/object-schema": "^1.2.0", "debug": "^4.1.1", @@ -205,6 +2757,7 @@ "version": "4.3.2", "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.2.tgz", "integrity": "sha512-mOp8wKcvj7XxC78zLgw/ZA+6TSgkoE2C/ienthhRD298T7UNwAg9diBpLRxC0mOezLl4B0xV7M0cCO6P/O0Xhw==", + "dev": true, "requires": { "ms": "2.1.2" } @@ -212,14 +2765,16 @@ "ms": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "dev": true } } }, "@humanwhocodes/object-schema": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-1.2.0.tgz", - "integrity": "sha512-wdppn25U8z/2yiaT6YGquE6X8sSv7hNMWSXYSSU1jGv/yd6XqjXgTDJ8KP4NgjTXfJ3GbRjeeb8RTV7a/VpM+w==" + "integrity": "sha512-wdppn25U8z/2yiaT6YGquE6X8sSv7hNMWSXYSSU1jGv/yd6XqjXgTDJ8KP4NgjTXfJ3GbRjeeb8RTV7a/VpM+w==", + "dev": true }, "@types/component-emitter": { "version": "1.2.10", @@ -253,17 +2808,21 @@ "acorn": { "version": "7.4.1", "resolved": "https://registry.npmjs.org/acorn/-/acorn-7.4.1.tgz", - "integrity": "sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A==" + "integrity": "sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A==", + "dev": true }, "acorn-jsx": { "version": "5.3.2", "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz", - "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==" + "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==", + "dev": true, + "requires": {} }, "ajv": { - "version": "6.12.0", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.0.tgz", - "integrity": "sha512-D6gFiFA0RRLyUbvijN74DWAjXSFxWKaWP7mldxkVhyhAV3+SWA9HEJPHQ2c9soIeTFJqcSdFDGFgdqs1iUU2Hw==", + "version": "6.12.6", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", + "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + "dev": true, "requires": { "fast-deep-equal": "^3.1.1", "fast-json-stable-stringify": "^2.0.0", @@ -274,17 +2833,20 @@ "ansi-colors": { "version": "4.1.1", "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-4.1.1.tgz", - "integrity": "sha512-JoX0apGbHaUJBNl6yF+p6JAFYZ666/hhCGKN5t9QFjbJQKUU/g8MNbFDbvfrgKXvI1QpZplPOnwIo99lX/AAmA==" + "integrity": "sha512-JoX0apGbHaUJBNl6yF+p6JAFYZ666/hhCGKN5t9QFjbJQKUU/g8MNbFDbvfrgKXvI1QpZplPOnwIo99lX/AAmA==", + "dev": true }, "ansi-regex": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", - "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==" + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "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" } @@ -293,6 +2855,7 @@ "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" } @@ -302,38 +2865,11 @@ "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", "integrity": "sha1-ml9pkFGx5wczKPKgCJaLZOopVdI=" }, - "asn1": { - "version": "0.2.4", - "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.4.tgz", - "integrity": "sha512-jxwzQpLQjSmWXgwaCZE9Nz+glAG01yF1QnWgbhGwHI5A6FRIEY6IVqtHhIepHqI7/kyEyQEagBC5mBEFlIYvdg==", - "requires": { - "safer-buffer": "~2.1.0" - } - }, - "assert-plus": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", - "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=" - }, "astral-regex": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/astral-regex/-/astral-regex-2.0.0.tgz", - "integrity": "sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ==" - }, - "asynckit": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", - "integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k=" - }, - "aws-sign2": { - "version": "0.7.0", - "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.7.0.tgz", - "integrity": "sha1-tG6JCTSpWR8tL2+G1+ap8bP+dqg=" - }, - "aws4": { - "version": "1.9.1", - "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.9.1.tgz", - "integrity": "sha512-wMHVg2EOHaMRxbzgFJ9gtjOOCrI80OHLG14rxi28XwOW8ux6IiEbRCGGGqCtdAIg4FQCbW20k9RsT4y3gJlFug==" + "integrity": "sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ==", + "dev": true }, "axios": { "version": "0.22.0", @@ -360,7 +2896,8 @@ "balanced-match": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", - "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==" + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", + "dev": true }, "base64-arraybuffer": { "version": "0.1.4", @@ -377,14 +2914,6 @@ "resolved": "https://registry.npmjs.org/bcrypt-nodejs/-/bcrypt-nodejs-0.0.3.tgz", "integrity": "sha1-xgkX8m3CNWYVZsaBBhwwPCsohCs=" }, - "bcrypt-pbkdf": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz", - "integrity": "sha1-pDAdOJtqQ/m2f/PKEaP2Y342Dp4=", - "requires": { - "tweetnacl": "^0.14.3" - } - }, "bluebird": { "version": "3.7.2", "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.7.2.tgz", @@ -418,6 +2947,7 @@ "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" @@ -431,12 +2961,8 @@ "callsites": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", - "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==" - }, - "caseless": { - "version": "0.12.0", - "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz", - "integrity": "sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw=" + "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", + "dev": true }, "chalk": { "version": "2.4.2", @@ -461,6 +2987,7 @@ "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" } @@ -468,15 +2995,8 @@ "color-name": { "version": "1.1.3", "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=" - }, - "combined-stream": { - "version": "1.0.8", - "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", - "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", - "requires": { - "delayed-stream": "~1.0.0" - } + "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=", + "dev": true }, "commander": { "version": "2.20.3", @@ -513,7 +3033,8 @@ "concat-map": { "version": "0.0.1", "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", - "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=" + "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=", + "dev": true }, "content-disposition": { "version": "0.5.3", @@ -538,11 +3059,6 @@ "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz", "integrity": "sha1-4wOogrNCzD7oylE6eZmXNNqzriw=" }, - "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=" - }, "cors": { "version": "2.8.5", "resolved": "https://registry.npmjs.org/cors/-/cors-2.8.5.tgz", @@ -556,20 +3072,13 @@ "version": "7.0.3", "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", + "dev": true, "requires": { "path-key": "^3.1.0", "shebang-command": "^2.0.0", "which": "^2.0.1" } }, - "dashdash": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz", - "integrity": "sha1-hTz6D3y+L+1d4gMmuN1YEDX24vA=", - "requires": { - "assert-plus": "^1.0.0" - } - }, "debug": { "version": "2.6.9", "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", @@ -581,12 +3090,8 @@ "deep-is": { "version": "0.1.4", "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz", - "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==" - }, - "delayed-stream": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", - "integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk=" + "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==", + "dev": true }, "depd": { "version": "1.1.2", @@ -602,19 +3107,11 @@ "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" } }, - "ecc-jsbn": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz", - "integrity": "sha1-OoOpBOVDUyh4dMVkt1SThoSamMk=", - "requires": { - "jsbn": "~0.1.0", - "safer-buffer": "^2.1.0" - } - }, "ee-first": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", @@ -623,7 +3120,8 @@ "emoji-regex": { "version": "8.0.0", "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", - "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==" + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "dev": true }, "encodeurl": { "version": "1.0.2", @@ -631,9 +3129,9 @@ "integrity": "sha1-rT/0yG7C0CkyL1oCw6mmBslbP1k=" }, "engine.io": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/engine.io/-/engine.io-5.2.0.tgz", - "integrity": "sha512-d1DexkQx87IFr1FLuV+0f5kAm1Hk1uOVijLOb+D1sDO2QMb7YjE02VHtZtxo7xIXMgcWLb+vl3HRT0rI9tr4jQ==", + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/engine.io/-/engine.io-5.2.1.tgz", + "integrity": "sha512-hyNxjVgWp619QMfqi/+/6/LQF+ueOIWeVOza3TeyvxUGjeT9U/xPkkHW/NJNuhbStrxMujEoMadoc2EY7DDEnw==", "requires": { "accepts": "~1.3.4", "base64id": "2.0.0", @@ -676,6 +3174,7 @@ "version": "2.3.6", "resolved": "https://registry.npmjs.org/enquirer/-/enquirer-2.3.6.tgz", "integrity": "sha512-yjNnPr315/FjS4zIsUxYguYUPP2e1NK4d7E7ZOLiyYCcbFBiTMyID+2wvm2w6+pZ/odMA7cRkjhsPbltwBOrLg==", + "dev": true, "requires": { "ansi-colors": "^4.1.1" } @@ -695,6 +3194,7 @@ "version": "7.32.0", "resolved": "https://registry.npmjs.org/eslint/-/eslint-7.32.0.tgz", "integrity": "sha512-VHZ8gX+EDfz+97jGcgyGCyRia/dPOd6Xh9yPv8Bl1+SoaIwD+a/vlrOmGRUyOYu7MwUhc7CxqeaDZU13S4+EpA==", + "dev": true, "requires": { "@babel/code-frame": "7.12.11", "@eslint/eslintrc": "^0.4.3", @@ -742,6 +3242,7 @@ "version": "7.12.11", "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.12.11.tgz", "integrity": "sha512-Zt1yodBx1UcyiePMSkWnU4hPqhwq7hGi2nFL1LeA3EUl+q2LQx16MISgJ0+z7dnmgvP9QtIleuETGOiOH1RcIw==", + "dev": true, "requires": { "@babel/highlight": "^7.10.4" } @@ -749,12 +3250,14 @@ "@babel/helper-validator-identifier": { "version": "7.15.7", "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.15.7.tgz", - "integrity": "sha512-K4JvCtQqad9OY2+yTU8w+E82ywk/fe+ELNlt1G8z3bVGlZfn/hOcQQsUhGhW/N+tb3fxK800wLtKOE/aM0m72w==" + "integrity": "sha512-K4JvCtQqad9OY2+yTU8w+E82ywk/fe+ELNlt1G8z3bVGlZfn/hOcQQsUhGhW/N+tb3fxK800wLtKOE/aM0m72w==", + "dev": true }, "@babel/highlight": { "version": "7.14.5", "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.14.5.tgz", "integrity": "sha512-qf9u2WFWVV0MppaL877j2dBtQIDgmidgjGk5VIMw3OadXvYaXn66U1BFlH2t4+t3i+8PhedppRv+i40ABzd+gg==", + "dev": true, "requires": { "@babel/helper-validator-identifier": "^7.14.5", "chalk": "^2.0.0", @@ -765,6 +3268,7 @@ "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", @@ -774,7 +3278,8 @@ "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=" + "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=", + "dev": true } } }, @@ -782,6 +3287,7 @@ "version": "4.1.2", "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, "requires": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" @@ -791,6 +3297,7 @@ "version": "4.3.0", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, "requires": { "color-convert": "^2.0.1" } @@ -799,6 +3306,7 @@ "version": "7.2.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, "requires": { "has-flag": "^4.0.0" } @@ -809,6 +3317,7 @@ "version": "2.0.1", "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, "requires": { "color-name": "~1.1.4" } @@ -816,12 +3325,14 @@ "color-name": { "version": "1.1.4", "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true }, "debug": { "version": "4.3.2", "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.2.tgz", "integrity": "sha512-mOp8wKcvj7XxC78zLgw/ZA+6TSgkoE2C/ienthhRD298T7UNwAg9diBpLRxC0mOezLl4B0xV7M0cCO6P/O0Xhw==", + "dev": true, "requires": { "ms": "2.1.2" } @@ -829,22 +3340,26 @@ "escape-string-regexp": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", - "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==" + "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", + "dev": true }, "eslint-visitor-keys": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-2.1.0.tgz", - "integrity": "sha512-0rSmRBzXgDzIsD6mGdJgevzgezI534Cer5L/vyMX0kHzT/jiB43jRhd9YUlMGYLQy2zprNmoT8qasCGtY+QaKw==" + "integrity": "sha512-0rSmRBzXgDzIsD6mGdJgevzgezI534Cer5L/vyMX0kHzT/jiB43jRhd9YUlMGYLQy2zprNmoT8qasCGtY+QaKw==", + "dev": true }, "fast-deep-equal": { "version": "3.1.3", "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", - "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==" + "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", + "dev": true }, "globals": { "version": "13.11.0", "resolved": "https://registry.npmjs.org/globals/-/globals-13.11.0.tgz", "integrity": "sha512-08/xrJ7wQjK9kkkRoI3OFUBbLx4f+6x3SGwcPvQ0QH6goFDrOU2oyAWrmh3dJezu65buo+HBMzAMQy6rovVC3g==", + "dev": true, "requires": { "type-fest": "^0.20.2" } @@ -852,12 +3367,14 @@ "has-flag": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==" + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true }, "ms": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "dev": true } } }, @@ -891,6 +3408,7 @@ "version": "5.1.1", "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz", "integrity": "sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==", + "dev": true, "requires": { "esrecurse": "^4.3.0", "estraverse": "^4.1.1" @@ -900,6 +3418,7 @@ "version": "2.1.0", "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-2.1.0.tgz", "integrity": "sha512-w94dQYoauyvlDc43XnGB8lU3Zt713vNChgt4EWwhXAP2XkBvndfxF0AgIqKOOasjPIPzj9JqgwkwbCYD0/V3Zg==", + "dev": true, "requires": { "eslint-visitor-keys": "^1.1.0" } @@ -907,12 +3426,14 @@ "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==" + "integrity": "sha512-8y9YjtM1JBJU/A9Kc+SbaOV4y29sSWckBwMHa+FGtVj5gN/sbnKDf6xJUl+8g7FAij9LVaP8C24DUiH/f/2Z9A==", + "dev": true }, "espree": { "version": "7.3.1", "resolved": "https://registry.npmjs.org/espree/-/espree-7.3.1.tgz", "integrity": "sha512-v3JCNCE64umkFpmkFGqzVKsOT0tN1Zr+ueqLZfpV1Ob8e+CEgPWa+OxCoGH3tnhimMKIaBm4m/vaRpJ/krRz2g==", + "dev": true, "requires": { "acorn": "^7.4.0", "acorn-jsx": "^5.3.1", @@ -922,19 +3443,22 @@ "eslint-visitor-keys": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.3.0.tgz", - "integrity": "sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ==" + "integrity": "sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ==", + "dev": true } } }, "esprima": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", - "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==" + "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", + "dev": true }, "esquery": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.4.0.tgz", "integrity": "sha512-cCDispWt5vHHtwMY2YrAQ4ibFkAL8RbH5YGBnZBc90MolvvfkkQcJro/aZiAQUlQ3qgrYS6D6v8Gc5G5CQsc9w==", + "dev": true, "requires": { "estraverse": "^5.1.0" }, @@ -942,7 +3466,8 @@ "estraverse": { "version": "5.2.0", "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.2.0.tgz", - "integrity": "sha512-BxbNGGNm0RyRYvUdHpIwv9IWzeM9XClbOxwoATuFdOE7ZE6wHL+HQ5T8hoPM+zHvmKzzsEqhgy0GrQ5X13afiQ==" + "integrity": "sha512-BxbNGGNm0RyRYvUdHpIwv9IWzeM9XClbOxwoATuFdOE7ZE6wHL+HQ5T8hoPM+zHvmKzzsEqhgy0GrQ5X13afiQ==", + "dev": true } } }, @@ -950,6 +3475,7 @@ "version": "4.3.0", "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", + "dev": true, "requires": { "estraverse": "^5.2.0" }, @@ -957,19 +3483,22 @@ "estraverse": { "version": "5.2.0", "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.2.0.tgz", - "integrity": "sha512-BxbNGGNm0RyRYvUdHpIwv9IWzeM9XClbOxwoATuFdOE7ZE6wHL+HQ5T8hoPM+zHvmKzzsEqhgy0GrQ5X13afiQ==" + "integrity": "sha512-BxbNGGNm0RyRYvUdHpIwv9IWzeM9XClbOxwoATuFdOE7ZE6wHL+HQ5T8hoPM+zHvmKzzsEqhgy0GrQ5X13afiQ==", + "dev": true } } }, "estraverse": { "version": "4.3.0", "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", - "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==" + "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==" + "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", + "dev": true }, "etag": { "version": "1.8.1", @@ -1023,20 +3552,11 @@ "uglify-js": "^3.0.28" } }, - "extend": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", - "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==" - }, - "extsprintf": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.3.0.tgz", - "integrity": "sha1-lpGEQOMEGnpBT4xS48V06zw+HgU=" - }, "fast-deep-equal": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.1.tgz", - "integrity": "sha512-8UEa58QDLauDNfpbrX55Q9jrGHThw2ZMdOky5Gl1CDtVeJDPVrG4Jxx1N8jw2gkWaff5UUuX1KJd+9zGe2B+ZA==" + "integrity": "sha512-8UEa58QDLauDNfpbrX55Q9jrGHThw2ZMdOky5Gl1CDtVeJDPVrG4Jxx1N8jw2gkWaff5UUuX1KJd+9zGe2B+ZA==", + "dev": true }, "fast-diff": { "version": "1.2.0", @@ -1047,17 +3567,20 @@ "fast-json-stable-stringify": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", - "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==" + "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", + "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=" + "integrity": "sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc=", + "dev": true }, "file-entry-cache": { "version": "6.0.1", "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-6.0.1.tgz", "integrity": "sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==", + "dev": true, "requires": { "flat-cache": "^3.0.4" } @@ -1080,6 +3603,7 @@ "version": "3.0.4", "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-3.0.4.tgz", "integrity": "sha512-dm9s5Pw7Jc0GvMYbshN6zchCA9RgQlzzEZX3vylR9IqFfS8XciblUXOKfW6SiuJ0e13eDYZoZV5wdrev7P3Nwg==", + "dev": true, "requires": { "flatted": "^3.1.0", "rimraf": "^3.0.2" @@ -1088,27 +3612,13 @@ "flatted": { "version": "3.2.2", "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.2.2.tgz", - "integrity": "sha512-JaTY/wtrcSyvXJl4IMFHPKyFur1sE9AUqc0QnhOaJ0CxHtAoIV8pYDzeEfAaNEtGkOfq4gr3LBFmdXW5mOQFnA==" + "integrity": "sha512-JaTY/wtrcSyvXJl4IMFHPKyFur1sE9AUqc0QnhOaJ0CxHtAoIV8pYDzeEfAaNEtGkOfq4gr3LBFmdXW5mOQFnA==", + "dev": true }, "follow-redirects": { - "version": "1.14.4", - "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.14.4.tgz", - "integrity": "sha512-zwGkiSXC1MUJG/qmeIFH2HBJx9u0V46QGUe3YR1fXG8bXQxq7fLj0RjLZQ5nubr9qNJUZrH+xUcwXEoXNpfS+g==" - }, - "forever-agent": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz", - "integrity": "sha1-+8cfDEGt6zf5bFd60e1C2P2sypE=" - }, - "form-data": { - "version": "2.3.3", - "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.3.3.tgz", - "integrity": "sha512-1lLKB2Mu3aGP1Q/2eCOx0fNbRMe7XdwktwOruhfqqd0rIJWwN4Dh+E3hrPSlDCXnSR7UtZ1N38rVXm+6+MEhJQ==", - "requires": { - "asynckit": "^0.4.0", - "combined-stream": "^1.0.6", - "mime-types": "^2.1.12" - } + "version": "1.14.8", + "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.14.8.tgz", + "integrity": "sha512-1x0S9UVJHsQprFcEC/qnNzBLcIxsjAV905f/UkQxbclCsoTWlacCNOpQa/anodLl2uaEKFhfWOvM2Qg77+15zA==" }, "forwarded": { "version": "0.1.2", @@ -1123,25 +3633,20 @@ "fs.realpath": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", - "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=" + "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=", + "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=" - }, - "getpass": { - "version": "0.1.7", - "resolved": "https://registry.npmjs.org/getpass/-/getpass-0.1.7.tgz", - "integrity": "sha1-Xv+OPmhNVprkyysSgmBOi6YhSfo=", - "requires": { - "assert-plus": "^1.0.0" - } + "integrity": "sha1-GwqzvVU7Kg1jmdKcDj6gslIHgyc=", + "dev": true }, "glob": { "version": "7.2.0", "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.0.tgz", "integrity": "sha512-lmLf6gtyrPq8tTjSmrO94wBeQbFR3HbLHbuyD69wuyQkImp2hWqMGB47OX65FBkPffO641IP9jWa1z4ivqG26Q==", + "dev": true, "requires": { "fs.realpath": "^1.0.0", "inflight": "^1.0.4", @@ -1155,6 +3660,7 @@ "version": "5.1.2", "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "dev": true, "requires": { "is-glob": "^4.0.1" } @@ -1165,24 +3671,11 @@ "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==", "dev": true }, - "har-schema": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/har-schema/-/har-schema-2.0.0.tgz", - "integrity": "sha1-qUwiJOvKwEeCoNkDVSHyRzW37JI=" - }, - "har-validator": { - "version": "5.1.3", - "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-5.1.3.tgz", - "integrity": "sha512-sNvOCzEQNr/qrvJgc3UG/kD4QtlHycrzwS+6mfTrrSq97BvaYcPZZI1ZSqGSPR73Cxn4LKTD4PttRwfU7jWq5g==", - "requires": { - "ajv": "^6.5.5", - "har-schema": "^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=" + "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", + "dev": true }, "http-errors": { "version": "1.7.2", @@ -1196,16 +3689,6 @@ "toidentifier": "1.0.0" } }, - "http-signature": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.2.0.tgz", - "integrity": "sha1-muzZJRFHcvPZW2WmCruPfBj7rOE=", - "requires": { - "assert-plus": "^1.0.0", - "jsprim": "^1.2.2", - "sshpk": "^1.7.0" - } - }, "iconv-lite": { "version": "0.4.24", "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", @@ -1217,7 +3700,8 @@ "ignore": { "version": "4.0.6", "resolved": "https://registry.npmjs.org/ignore/-/ignore-4.0.6.tgz", - "integrity": "sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg==" + "integrity": "sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg==", + "dev": true }, "image-size": { "version": "1.0.0", @@ -1231,6 +3715,7 @@ "version": "3.3.0", "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz", "integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==", + "dev": true, "requires": { "parent-module": "^1.0.0", "resolve-from": "^4.0.0" @@ -1239,12 +3724,14 @@ "imurmurhash": { "version": "0.1.4", "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", - "integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o=" + "integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o=", + "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" @@ -1263,96 +3750,69 @@ "is-extglob": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", - "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=" + "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=", + "dev": true }, "is-fullwidth-code-point": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", - "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==" + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "dev": true }, "is-glob": { "version": "4.0.3", "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", + "dev": true, "requires": { "is-extglob": "^2.1.1" } }, - "is-typedarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", - "integrity": "sha1-5HnICFjfDBsR3dppQPlgEfzaSpo=" - }, "isexe": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", - "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=" - }, - "isstream": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz", - "integrity": "sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo=" + "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=", + "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==" + "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", + "dev": true }, "js-yaml": { "version": "3.14.1", "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz", "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==", + "dev": true, "requires": { "argparse": "^1.0.7", "esprima": "^4.0.0" } }, - "jsbn": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz", - "integrity": "sha1-peZUwuWi3rXyAdls77yoDA7y9RM=" - }, "jsesc": { "version": "2.5.2", "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz", "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==", "dev": true }, - "json-schema": { - "version": "0.2.3", - "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.2.3.tgz", - "integrity": "sha1-tIDIkuWaLwWVTOcnvT8qTogvnhM=" - }, "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==" + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", + "dev": true }, "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=" - }, - "json-stringify-safe": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz", - "integrity": "sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus=" - }, - "jsprim": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/jsprim/-/jsprim-1.4.1.tgz", - "integrity": "sha1-MT5mvB5cwG5Di8G3SZwuXFastqI=", - "requires": { - "assert-plus": "1.0.0", - "extsprintf": "1.3.0", - "json-schema": "0.2.3", - "verror": "1.10.0" - } + "integrity": "sha1-nbe1lJatPzz+8wp1FC0tkwrXJlE=", + "dev": true }, "levn": { "version": "0.4.1", "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz", "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==", + "dev": true, "requires": { "prelude-ls": "^1.2.1", "type-check": "~0.4.0" @@ -1367,22 +3827,26 @@ "lodash.clonedeep": { "version": "4.5.0", "resolved": "https://registry.npmjs.org/lodash.clonedeep/-/lodash.clonedeep-4.5.0.tgz", - "integrity": "sha1-4j8/nE+Pvd6HJSnBBxhXoIblzO8=" + "integrity": "sha1-4j8/nE+Pvd6HJSnBBxhXoIblzO8=", + "dev": true }, "lodash.merge": { "version": "4.6.2", "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", - "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==" + "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==", + "dev": true }, "lodash.truncate": { "version": "4.4.2", "resolved": "https://registry.npmjs.org/lodash.truncate/-/lodash.truncate-4.4.2.tgz", - "integrity": "sha1-WjUNoLERO4N+z//VgSy+WNbq4ZM=" + "integrity": "sha1-WjUNoLERO4N+z//VgSy+WNbq4ZM=", + "dev": true }, "lru-cache": { "version": "6.0.0", "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "dev": true, "requires": { "yallist": "^4.0.0" } @@ -1424,6 +3888,7 @@ "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" } @@ -1436,18 +3901,14 @@ "natural-compare": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", - "integrity": "sha1-Sr6/7tdUHywnrPspvbvRXI1bpPc=" + "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==" }, - "oauth-sign": { - "version": "0.9.0", - "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.9.0.tgz", - "integrity": "sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ==" - }, "object-assign": { "version": "4.1.1", "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", @@ -1470,6 +3931,7 @@ "version": "1.4.0", "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", + "dev": true, "requires": { "wrappy": "1" } @@ -1478,6 +3940,7 @@ "version": "0.9.1", "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.1.tgz", "integrity": "sha512-74RlY5FCnhq4jRxVUPKDaRwrVNXMqsGsiW6AJw4XK8hmtm10wC0ypZBLw5IIp85NZMr91+qd1RvvENwg7jjRFw==", + "dev": true, "requires": { "deep-is": "^0.1.3", "fast-levenshtein": "^2.0.6", @@ -1491,6 +3954,7 @@ "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" } @@ -1503,12 +3967,14 @@ "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=" + "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=", + "dev": true }, "path-key": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", - "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==" + "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", + "dev": true }, "path-parse": { "version": "1.0.7", @@ -1521,15 +3987,11 @@ "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz", "integrity": "sha1-32BBeABfUi8V60SQ5yR6G/qmf4w=" }, - "performance-now": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz", - "integrity": "sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns=" - }, "prelude-ls": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", - "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==" + "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==", + "dev": true }, "prettier-linter-helpers": { "version": "1.0.0", @@ -1543,7 +4005,8 @@ "progress": { "version": "2.0.3", "resolved": "https://registry.npmjs.org/progress/-/progress-2.0.3.tgz", - "integrity": "sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==" + "integrity": "sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==", + "dev": true }, "proxy-addr": { "version": "2.0.6", @@ -1554,15 +4017,11 @@ "ipaddr.js": "1.9.1" } }, - "psl": { - "version": "1.8.0", - "resolved": "https://registry.npmjs.org/psl/-/psl-1.8.0.tgz", - "integrity": "sha512-RIdOzyoavK+hA18OGGWDqUTsCLhtA7IcZ/6NCs4fFJaHBDab+pDDmDIByWFRQJq2Cd7r1OoQxBGKOaztq+hjIQ==" - }, "punycode": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz", - "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==" + "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==", + "dev": true }, "qs": { "version": "6.7.0", @@ -1603,46 +4062,14 @@ "regexpp": { "version": "3.2.0", "resolved": "https://registry.npmjs.org/regexpp/-/regexpp-3.2.0.tgz", - "integrity": "sha512-pq2bWo9mVD43nbts2wGv17XLiNLya+GklZ8kaDLV2Z08gDCsGpnKn9BFMepvWuHCbyVvY7J5o5+BVvoQbmlJLg==" - }, - "request": { - "version": "2.88.2", - "resolved": "https://registry.npmjs.org/request/-/request-2.88.2.tgz", - "integrity": "sha512-MsvtOrfG9ZcrOwAW+Qi+F6HbD0CWXEh9ou77uOb7FM2WPhwT7smM833PzanhJLsgXjN89Ir6V2PczXNnMpwKhw==", - "requires": { - "aws-sign2": "~0.7.0", - "aws4": "^1.8.0", - "caseless": "~0.12.0", - "combined-stream": "~1.0.6", - "extend": "~3.0.2", - "forever-agent": "~0.6.1", - "form-data": "~2.3.2", - "har-validator": "~5.1.3", - "http-signature": "~1.2.0", - "is-typedarray": "~1.0.0", - "isstream": "~0.1.2", - "json-stringify-safe": "~5.0.1", - "mime-types": "~2.1.19", - "oauth-sign": "~0.9.0", - "performance-now": "^2.1.0", - "qs": "~6.5.2", - "safe-buffer": "^5.1.2", - "tough-cookie": "~2.5.0", - "tunnel-agent": "^0.6.0", - "uuid": "^3.3.2" - }, - "dependencies": { - "qs": { - "version": "6.5.2", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.2.tgz", - "integrity": "sha512-N5ZAX4/LxJmF+7wN74pUD6qAh9/wnvdQcjq9TZjevvXzSUo7bfmw91saqMjzGS2xq91/odN2dW/WOl7qQHNDGA==" - } - } + "integrity": "sha512-pq2bWo9mVD43nbts2wGv17XLiNLya+GklZ8kaDLV2Z08gDCsGpnKn9BFMepvWuHCbyVvY7J5o5+BVvoQbmlJLg==", + "dev": true }, "require-from-string": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz", - "integrity": "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==" + "integrity": "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==", + "dev": true }, "resolve": { "version": "1.15.1", @@ -1656,7 +4083,8 @@ "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==" + "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", + "dev": true }, "rethinkdbdash": { "version": "2.3.31", @@ -1670,6 +4098,7 @@ "version": "3.0.2", "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", + "dev": true, "requires": { "glob": "^7.1.3" } @@ -1688,6 +4117,7 @@ "version": "7.3.5", "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.5.tgz", "integrity": "sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ==", + "dev": true, "requires": { "lru-cache": "^6.0.0" } @@ -1739,6 +4169,7 @@ "version": "2.0.0", "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", + "dev": true, "requires": { "shebang-regex": "^3.0.0" } @@ -1746,12 +4177,14 @@ "shebang-regex": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", - "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==" + "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", + "dev": true }, "slice-ansi": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-4.0.0.tgz", "integrity": "sha512-qMCMfhY040cVHT43K9BFygqYbUPFZKHOg7K73mtTWJRb8pyP3fzf4Ixd5SzdEJQ6MRUg/WBnOLxghZtKKurENQ==", + "dev": true, "requires": { "ansi-styles": "^4.0.0", "astral-regex": "^2.0.0", @@ -1762,6 +4195,7 @@ "version": "4.3.0", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, "requires": { "color-convert": "^2.0.1" } @@ -1770,6 +4204,7 @@ "version": "2.0.1", "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, "requires": { "color-name": "~1.1.4" } @@ -1777,7 +4212,8 @@ "color-name": { "version": "1.1.4", "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true } } }, @@ -1850,23 +4286,8 @@ "sprintf-js": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", - "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=" - }, - "sshpk": { - "version": "1.16.1", - "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.16.1.tgz", - "integrity": "sha512-HXXqVUq7+pcKeLqqZj6mHFUMvXtOJt1uoUx09pFW6011inTMxqI8BA8PM95myrIyyKwdnzjdFjLiE6KBPVtJIg==", - "requires": { - "asn1": "~0.2.3", - "assert-plus": "^1.0.0", - "bcrypt-pbkdf": "^1.0.0", - "dashdash": "^1.12.0", - "ecc-jsbn": "~0.1.1", - "getpass": "^0.1.1", - "jsbn": "~0.1.0", - "safer-buffer": "^2.0.2", - "tweetnacl": "~0.14.0" - } + "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=", + "dev": true }, "statuses": { "version": "1.5.0", @@ -1877,6 +4298,7 @@ "version": "4.2.3", "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dev": true, "requires": { "emoji-regex": "^8.0.0", "is-fullwidth-code-point": "^3.0.0", @@ -1887,6 +4309,7 @@ "version": "6.0.1", "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dev": true, "requires": { "ansi-regex": "^5.0.1" } @@ -1894,12 +4317,14 @@ "strip-json-comments": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", - "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==" + "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", + "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" } @@ -1908,6 +4333,7 @@ "version": "6.7.2", "resolved": "https://registry.npmjs.org/table/-/table-6.7.2.tgz", "integrity": "sha512-UFZK67uvyNivLeQbVtkiUs8Uuuxv24aSL4/Vil2PJVtMgU8Lx0CYkP12uCGa3kjyQzOSgV1+z9Wkb82fCGsO0g==", + "dev": true, "requires": { "ajv": "^8.0.1", "lodash.clonedeep": "^4.5.0", @@ -1921,6 +4347,7 @@ "version": "8.6.3", "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.6.3.tgz", "integrity": "sha512-SMJOdDP6LqTkD0Uq8qLi+gMwSt0imXLSV080qFVwJCpH9U6Mb+SUGHAXM0KNbcBPguytWyvFxcHgMLe2D2XSpw==", + "dev": true, "requires": { "fast-deep-equal": "^3.1.1", "json-schema-traverse": "^1.0.0", @@ -1931,14 +4358,16 @@ "json-schema-traverse": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", - "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==" + "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", + "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=" + "integrity": "sha1-f17oI66AUgfACvLfSoTsP8+lcLQ=", + "dev": true }, "to-fast-properties": { "version": "2.0.0", @@ -1951,32 +4380,11 @@ "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.0.tgz", "integrity": "sha512-yaOH/Pk/VEhBWWTlhI+qXxDFXlejDGcQipMlyxda9nthulaxLZUNcUqFxokp0vcYnvteJln5FNQDRrxj3YcbVw==" }, - "tough-cookie": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.5.0.tgz", - "integrity": "sha512-nlLsUzgm1kfLXSXfRZMc1KLAugd4hqJHDTvc2hDIwS3mZAfMEuMbc03SujMF+GEcpaX/qboeycw6iO8JwVv2+g==", - "requires": { - "psl": "^1.1.28", - "punycode": "^2.1.1" - } - }, - "tunnel-agent": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz", - "integrity": "sha1-J6XeoGs2sEoKmWZ3SykIaPD8QP0=", - "requires": { - "safe-buffer": "^5.0.1" - } - }, - "tweetnacl": { - "version": "0.14.5", - "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz", - "integrity": "sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q=" - }, "type-check": { "version": "0.4.0", "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==", + "dev": true, "requires": { "prelude-ls": "^1.2.1" } @@ -1984,7 +4392,8 @@ "type-fest": { "version": "0.20.2", "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", - "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==" + "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==", + "dev": true }, "type-is": { "version": "1.6.18", @@ -2005,19 +4414,18 @@ } }, "universal-analytics": { - "version": "0.4.23", - "resolved": "https://registry.npmjs.org/universal-analytics/-/universal-analytics-0.4.23.tgz", - "integrity": "sha512-lgMIH7XBI6OgYn1woDEmxhGdj8yDefMKg7GkWdeATAlQZFrMrNyxSkpDzY57iY0/6fdlzTbBV03OawvvzG+q7A==", + "version": "0.5.1", + "resolved": "https://registry.npmjs.org/universal-analytics/-/universal-analytics-0.5.1.tgz", + "integrity": "sha512-raLjYsNQmJbK0o8veSU9GXA5XG/YhfuZDzWCAB4SNDnPI4ozXLrbFSDZiRENdOFEIUqmdUTYcaQCOa0Y36EtsQ==", "requires": { "debug": "^4.1.1", - "request": "^2.88.2", - "uuid": "^3.0.0" + "uuid": "^8.0.0" }, "dependencies": { "debug": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.2.0.tgz", - "integrity": "sha512-IX2ncY78vDTjZMFUdmsvIRFY2Cf4FnD0wRs+nQwJU8Lu99/tPFdb0VybiiMTPe3I6rQmwsqQqRBvxU+bZ/I8sg==", + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.2.tgz", + "integrity": "sha512-mOp8wKcvj7XxC78zLgw/ZA+6TSgkoE2C/ienthhRD298T7UNwAg9diBpLRxC0mOezLl4B0xV7M0cCO6P/O0Xhw==", "requires": { "ms": "2.1.2" } @@ -2038,6 +4446,7 @@ "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" } @@ -2048,34 +4457,26 @@ "integrity": "sha1-n5VxD1CiZ5R7LMwSR0HBAoQn5xM=" }, "uuid": { - "version": "3.4.0", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.4.0.tgz", - "integrity": "sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==" + "version": "8.3.2", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz", + "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==" }, "v8-compile-cache": { "version": "2.3.0", "resolved": "https://registry.npmjs.org/v8-compile-cache/-/v8-compile-cache-2.3.0.tgz", - "integrity": "sha512-l8lCEmLcLYZh4nbunNZvQCJc5pv7+RCwa8q/LdUx8u7lsWvPDKmpodJAJNwkAhJC//dFY48KuIEmjtd4RViDrA==" + "integrity": "sha512-l8lCEmLcLYZh4nbunNZvQCJc5pv7+RCwa8q/LdUx8u7lsWvPDKmpodJAJNwkAhJC//dFY48KuIEmjtd4RViDrA==", + "dev": true }, "vary": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", "integrity": "sha1-IpnwLG3tMNSllhsLn3RSShj2NPw=" }, - "verror": { - "version": "1.10.0", - "resolved": "https://registry.npmjs.org/verror/-/verror-1.10.0.tgz", - "integrity": "sha1-OhBcoXBTr1XW4nDB+CiGguGNpAA=", - "requires": { - "assert-plus": "^1.0.0", - "core-util-is": "1.0.2", - "extsprintf": "^1.2.0" - } - }, "which": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "dev": true, "requires": { "isexe": "^2.0.0" } @@ -2083,22 +4484,26 @@ "word-wrap": { "version": "1.2.3", "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.3.tgz", - "integrity": "sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ==" + "integrity": "sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ==", + "dev": true }, "wrappy": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", - "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=" + "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=", + "dev": true }, "ws": { "version": "7.4.6", "resolved": "https://registry.npmjs.org/ws/-/ws-7.4.6.tgz", - "integrity": "sha512-YmhHDO4MzaDLB+M9ym/mDA5z0naX8j7SIlT8f8z+I0VtzsRbekxEutHSme7NPS2qE8StCYQNUnfWdXta/Yu85A==" + "integrity": "sha512-YmhHDO4MzaDLB+M9ym/mDA5z0naX8j7SIlT8f8z+I0VtzsRbekxEutHSme7NPS2qE8StCYQNUnfWdXta/Yu85A==", + "requires": {} }, "yallist": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "dev": true } } } diff --git a/src/server/package.json b/src/server/package.json index a80b9c08..17c49a9a 100644 --- a/src/server/package.json +++ b/src/server/package.json @@ -1,6 +1,6 @@ { "name": "isleward_server", - "version": "0.10.5", + "version": "0.10.6", "description": "isleward", "dependencies": { "axios": "^0.22.0", @@ -11,7 +11,7 @@ "image-size": "^1.0.0", "rethinkdbdash": "^2.3.31", "socket.io": "^4.2.0", - "universal-analytics": "^0.4.23" + "universal-analytics": "^0.5.1" }, "devDependencies": { "babel-eslint": "^10.1.0", diff --git a/src/server/security/connections.js b/src/server/security/connections.js index 7bd04b83..61ae3ee5 100644 --- a/src/server/security/connections.js +++ b/src/server/security/connections.js @@ -77,8 +77,11 @@ module.exports = { (['getCharacterList', 'getCharacter', 'deleteCharacter'].indexOf(msg.method) === -1) ) || ( - (player.dead) && - (msg.data.method !== 'respawn') + player.dead && + !( + (msg.method === 'performAction' && ['respawn'].includes(msg.data.method)) || + (msg.method === 'clientAck') + ) ) ) return; diff --git a/src/server/security/routerConfig.js b/src/server/security/routerConfig.js index 5038f287..966b6dee 100644 --- a/src/server/security/routerConfig.js +++ b/src/server/security/routerConfig.js @@ -18,13 +18,14 @@ const routerConfig = { wardrobe: ['open', 'apply'], stats: ['respawn'], passives: ['tickNode', 'untickNode'], - workbench: ['open', 'craft', 'getRecipe'], - player: ['notifyServerUiReady'] + workbench: ['open', 'craft', 'getRecipe'] }, globalAllowed: { clientConfig: ['getClientConfig'], leaderboard: ['requestList'], - cons: ['unzone'] + cons: ['unzone'], + rezoneManager: ['clientAck'], + instancer: ['clientAck'] }, allowTargetId: { door: ['lock', 'unlock'], diff --git a/src/server/world/atlas.js b/src/server/world/atlas.js index 709818be..c91d5f5e 100644 --- a/src/server/world/atlas.js +++ b/src/server/world/atlas.js @@ -128,15 +128,16 @@ module.exports = { mapList.mapList.filter(m => !m.disabled).forEach(m => this.spawnMap(m)); }, spawnMap: function (map) { - let worker = childProcess.fork('./world/worker'); - let thread = { + const worker = childProcess.fork('./world/worker', [map.name]); + + const thread = { id: this.nextId++, name: map.name, path: map.path, - worker: worker + worker }; - let onMessage = this.onMessage.bind(this, thread); + const onMessage = this.onMessage.bind(this, thread); worker.on('message', function (m) { onMessage(m); }); @@ -174,11 +175,11 @@ module.exports = { }, event: function (thread, message) { - objects.sendEvent(message); + objects.sendEvent(message, thread); }, events: function (thread, message) { - objects.sendEvents(message); + objects.sendEvents(message, thread); }, object: function (thread, message) { diff --git a/src/server/world/instancer.js b/src/server/world/instancer.js index 4cf535d3..59c1a669 100644 --- a/src/server/world/instancer.js +++ b/src/server/world/instancer.js @@ -13,6 +13,9 @@ let eventEmitter = require('../misc/events'); const mods = require('../misc/mods'); const transactions = require('../security/transactions'); +//Own helpers +const { stageZoneIn, unstageZoneIn, clientAck } = require('./instancer/handshakes'); + module.exports = { instances: [], zoneId: -1, @@ -65,6 +68,9 @@ module.exports = { [resourceSpawner, syncer, objects, questBuilder, events].forEach(i => i.init(fakeInstance)); this.tick(); + + this.clientAck = clientAck; + eventEmitter.on('removeObject', unstageZoneIn); }, startRegen: function (respawnMap, respawnPos) { @@ -211,21 +217,24 @@ module.exports = { obj.spawn = map.spawn; - syncer.queue('onGetMap', map.clientMap, [obj.serverId]); + stageZoneIn(msg); - if (!msg.transfer) - objects.addObject(obj, this.onAddObject.bind(this)); - else { - let o = objects.transferObject(obj); - questBuilder.obtain(o); - eventEmitter.emit('onAfterPlayerEnterZone', o); - } + process.send({ + method: 'events', + data: { + getMap: [{ + obj: map.clientMap, + to: [obj.serverId] + }] + } + }); }, + //This function fires when the player logs in the first time, not upon rezone onAddObject: function (obj) { if (obj.player) { obj.stats.onLogin(); - eventEmitter.emit('onAfterPlayerEnterZone', obj); + eventEmitter.emit('onAfterPlayerEnterZone', obj, { isTransfer: false }); } questBuilder.obtain(obj); @@ -302,6 +311,10 @@ module.exports = { return; } + //We fire this event because even though an object might be destroyed already, + // mods and modules might have staged events/actions we need to clear + eventEmitter.emit('removeObject', { obj: msg.obj }); + let obj = msg.obj; obj = objects.find(o => o.serverId === obj.id); if (!obj) { diff --git a/src/server/world/instancer/handshakes.js b/src/server/world/instancer/handshakes.js new file mode 100644 index 00000000..c4c6a8ce --- /dev/null +++ b/src/server/world/instancer/handshakes.js @@ -0,0 +1,49 @@ +//Local State +const stagedZoneIns = []; + +//Methods + +//Fired when an object is removed through a socket dc +// We do this because a client might DC during rezone handshake +const unstageZoneIn = msg => { + stagedZoneIns.spliceWhere(s => s.obj.serverId === msg.obj.id); +}; + +const stageZoneIn = msg => { + const { serverId } = msg.obj; + + stagedZoneIns.spliceWhere(o => o.obj.serverId === serverId); + + stagedZoneIns.push(msg); +}; + +const doZoneIn = function (staged) { + const { onAddObject, instances: [ { objects, questBuilder, eventEmitter } ] } = instancer; + + const { transfer: isTransfer, obj } = staged; + + if (!isTransfer) + objects.addObject(obj, onAddObject.bind(instancer)); + else { + let o = objects.transferObject(obj); + questBuilder.obtain(o); + eventEmitter.emit('onAfterPlayerEnterZone', o, { isTransfer }); + } +}; + +const clientAck = msg => { + const staged = stagedZoneIns.find(s => s.obj.serverId === msg.sourceId); + if (!staged) + return; + + stagedZoneIns.spliceWhere(s => s === staged); + + doZoneIn(staged); +}; + +//Exports +module.exports = { + unstageZoneIn, + stageZoneIn, + clientAck +}; diff --git a/src/server/world/map.js b/src/server/world/map.js index 07d250e8..776223e4 100644 --- a/src/server/world/map.js +++ b/src/server/world/map.js @@ -85,8 +85,13 @@ module.exports = { try { chats = require('../' + this.path + '/' + this.name + '/chats'); } catch (e) {} - if (chats) - this.zone.chats = chats; + + if (chats) { + if (this.zone.chats) + extend(this.zone.chats, chats); + else + this.zone.chats = chats; + } let dialogues = null; try { diff --git a/src/server/world/mobBuilder.js b/src/server/world/mobBuilder.js index 1f63faab..a5cb9bfa 100644 --- a/src/server/world/mobBuilder.js +++ b/src/server/world/mobBuilder.js @@ -50,6 +50,8 @@ module.exports = { if (cpnMob.patrol) cpnMob.walkDistance = 1; + cpnMob.needLos = blueprint.needLos; + let spells = extend([], blueprint.spells); spells.forEach(s => { if (!s.animation && mob.sheetName === 'mobs' && animations.mobs[mob.cell]) @@ -179,21 +181,6 @@ module.exports = { s.dmgMult = s.name ? dmgMult / 3 : dmgMult; s.statType = preferStat; s.manaCost = 0; - - /*if (mob.name.toLowerCase().includes('stinktooth')) { - mob.stats.values.critChance = 0; - mob.stats.values.attackCritChance = 0; - mob.stats.values.spellCritChance = 0; - - const n = mob.name + '-' + s.type; - if (!track[n]) - track[n] = []; - - track[n].push(~~s.getDamage(mob, true).amount); - track[n].sort((a, b) => a - b); - console.log(track); - console.log(''); - }*/ }); //Hack to disallow low level mobs from having any lifeOnHit diff --git a/src/server/world/rezoneManager.js b/src/server/world/rezoneManager.js new file mode 100644 index 00000000..08bf8a97 --- /dev/null +++ b/src/server/world/rezoneManager.js @@ -0,0 +1,55 @@ +//Imports +const eventEmitter = require('../misc/events'); + +//Local State +const stagedRezones = []; + +//Methods + +//Fired when an object is removed through a socket dc +// We do this because a client might DC during rezone handshake +const unstageRezone = msg => { + stagedRezones.spliceWhere(s => s.simplifiedObj.serverId === msg.obj.id); +}; + +const stageRezone = (simplifiedObj, targetZone) => { + const { serverId } = simplifiedObj; + + stagedRezones.spliceWhere(o => o.simplifiedObj.serverId === serverId); + + stagedRezones.push({ simplifiedObj, targetZone }); +}; + +const doRezone = stagedRezone => { + const { simplifiedObj, targetZone } = stagedRezone; + + process.send({ + method: 'rezone', + id: simplifiedObj.serverId, + args: { + obj: simplifiedObj, + newZone: targetZone + } + }); +}; + +const clientAck = msg => { + const staged = stagedRezones.find(s => s.simplifiedObj.serverId === msg.sourceId); + if (!staged) + return; + + stagedRezones.spliceWhere(s => s === staged); + + doRezone(staged); +}; + +const init = () => { + eventEmitter.on('removeObject', unstageRezone); +}; + +//Exports +module.exports = { + init, + stageRezone, + clientAck +}; diff --git a/src/server/world/spawners.js b/src/server/world/spawners.js index 3cad19bd..22fd59ca 100644 --- a/src/server/world/spawners.js +++ b/src/server/world/spawners.js @@ -60,7 +60,6 @@ module.exports = { this.syncer.queue('onGetObject', { id: obj.id, - performLast: true, components: [spawnAnimation] }, -1); } diff --git a/src/server/world/syncer.js b/src/server/world/syncer.js index 4b1affde..f46704e9 100644 --- a/src/server/world/syncer.js +++ b/src/server/world/syncer.js @@ -180,6 +180,35 @@ module.exports = { } }, + processDestroyedObject: function (obj) { + const { objects, queue } = this; + const { id, serverId } = obj; + + obj.destroyed = true; + + //We mark forceDestroy to tell objects that we're destroying an object outside of the + // syncer's update method + obj.forceDestroy = true; + + const msg = { + id: id, + destroyed: true + }; + + objects.removeObject(obj); + + this.flushForTarget(serverId); + + const fnQueueMsg = queue.bind(this, 'onGetObject'); + + //Find any players that have seen this obj + objects + .filter(o => !o.destroyed && o?.player?.hasSeen(id)) + .forEach(o => { + fnQueueMsg(msg, [o.serverId]); + }); + }, + send: function () { if (!this.dirty) return; diff --git a/src/server/world/worker.js b/src/server/world/worker.js index 456782e0..360090c1 100644 --- a/src/server/world/worker.js +++ b/src/server/world/worker.js @@ -5,6 +5,7 @@ global.consts = require('../config/consts'); global.instancer = require('./instancer'); global.eventManager = require('../events/events'); global.clientConfig = require('../config/clientConfig'); +global.rezoneManager = require('./rezoneManager'); const components = require('../components/components'); const mods = require('../misc/mods'); @@ -21,6 +22,8 @@ const itemEffects = require('../items/itemEffects'); const profanities = require('../misc/profanities'); const eventEmitter = require('../misc/events'); +instancer.mapName = process.argv[2]; + let onCpnsReady = async function () { factions.init(); skins.init(); @@ -33,6 +36,8 @@ let onCpnsReady = async function () { recipes.init(); itemEffects.init(); profanities.init(); + rezoneManager.init(); + await clientConfig.init(); process.send({