diff --git a/.gitignore b/.gitignore
new file mode 100644
index 0000000..40b878d
--- /dev/null
+++ b/.gitignore
@@ -0,0 +1 @@
+node_modules/
\ No newline at end of file
diff --git a/Guide.md b/Guide.md
new file mode 100644
index 0000000..a40095b
--- /dev/null
+++ b/Guide.md
@@ -0,0 +1 @@
+## Guide Coming soon
diff --git a/LICENSE b/LICENSE
new file mode 100644
index 0000000..12f6d78
--- /dev/null
+++ b/LICENSE
@@ -0,0 +1,21 @@
+MIT License
+
+Copyright (c) 2021 Whirl
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+SOFTWARE.
diff --git a/README.md b/README.md
new file mode 100644
index 0000000..834f5a4
--- /dev/null
+++ b/README.md
@@ -0,0 +1,43 @@
+
Welcome to SelectRoles 👋
+
+
+
+
+
+
+
+
+> Get your own menu roles for your discord server
+> written in discord.js v13 by Whirl
+
+## Install (Requires [Node.js v16.6](https://nodejs.org/en/))
+
+```sh
+npm i
+```
+
+## Usage
+
+```sh
+node .
+```
+
+## Run tests
+
+```sh
+npm run test
+```
+
+## Author
+
+👤 **Whirl**
+
+* Website: whirl.codes
+* Twitter: [@Whirl\_21](https://twitter.com/Whirl\_21)
+* Github: [@Whirl21](https://github.com/Whirl21)
+
+## Show your support
+
+Give a ⭐️ if this project helped you!
+
+***
diff --git a/config.json b/config.json
new file mode 100644
index 0000000..d55e56a
--- /dev/null
+++ b/config.json
@@ -0,0 +1,19 @@
+{
+ "token":"", //ur bot token here
+ "r1":"", //role 1 id
+ "r2":"", //role2 id
+ "r3":"", //role3 id
+ "r4":"", //role4id
+ "r5":"",//role5id
+ "r1m":"",//role 1 emoji
+ "r2m":"",//role 2 emoji
+ "r3m":"",//role3 emoji
+ "r4m":"",//role4 emoji
+ "r5m":""//role5 emoji
+
+}
+/*
+@{Warning} -
+remove all comments from this file
+
+*/
diff --git a/index.js b/index.js
new file mode 100644
index 0000000..e4a8839
--- /dev/null
+++ b/index.js
@@ -0,0 +1,144 @@
+/*
+Copyright 2021 Whirl
+
+Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+
+
+
+*/
+
+
+
+// require the needed discord.js classes
+const { Client, Intents, MessageActionRow, MessageSelectMenu } = require('discord.js');
+
+// create a new Discord client
+const client = new Client({ intents: [Intents.FLAGS.GUILDS] });
+
+const {token , r1 , r2 ,r3 ,r4,r5 , r1m , r2m , r3m , r4m , r5m} = require('./config.json')
+//event triggered when the client is ready/online logs ready {@type string} in the console
+
+
+
+client.once('ready', () => {
+ console.log('Ready!');
+});
+
+client.on('interactionCreate', async interaction => {
+
+
+ if (interaction.commandName == 'roles') {
+ const row = new MessageActionRow()
+ .addComponents(
+ new MessageSelectMenu()
+ .setCustomId('roles')
+ .setPlaceholder('Select a reaction role')
+ .addOptions([
+ { //edit the option according to you ⚠leave the emoji fields like they are
+ label: 'Reaction Role 1',
+ description: 'Take this role by clicking me ',
+ value: 'first_option',
+ emoji: r1m
+ },
+ {
+ label: 'Reaction Role 2',
+ description: 'Take this role by clicking me ',
+ value: 'second_option',
+ emoji: r2m
+ },
+ {
+ label: 'Reaction Role 3',
+ description: 'Take this role by clicking me ',
+ value: 'third_option',
+ emoji: r3m
+ },
+ {
+ label: 'Reaction Role 4',
+ description: 'Take this role by clicking me ',
+ value: 'fourth_option',
+ emoji: r4m
+ },
+ {
+ label: 'Reaction Role 5',
+ description: 'Take this role by clicking me s',
+ value: 'fifth_option',
+ emoji: r5m
+ },
+ ]),
+ );
+
+ await interaction.reply({ content: "Hello There take your roles", ephemeral: true ,components: [row]})//edit the content here
+ //this sends it as empheral so that the chat does not get choked with these
+}
+
+
+
+ //if the interaction is select menu then reply
+ if(interaction.isSelectMenu()){
+
+ let choice = interaction.values[0]
+ const member = interaction.member
+ if(choice == 'first_option'){
+ if (member.roles.cache.some(role => role.id == r1)) {
+ interaction.reply({content: "The role was successfully removed from you" , ephemeral: true})
+ member.roles.remove('847793663597608990')
+ }
+ else{
+ member.roles.add(r1)
+ await interaction.reply({ content: "The role was successfully added to you", ephemeral: true })}
+ }
+
+else if(choice == 'second_option'){
+ if (member.roles.cache.some(role => role.id == r2)) {
+ interaction.reply({content: "The role was successfully removed from you", ephemeral: true})
+ member.roles.remove(r2)
+ }
+ else{
+ member.roles.add(r2)
+ await interaction.reply({ content: "The role was successfully added to you", ephemeral: true })}
+ }
+
+
+ else if(choice == 'third_option'){
+ if (member.roles.cache.some(role => role.id == r3)) {
+ interaction.reply({content: "The role was successfully removed from you", ephemeral: true})
+ member.roles.remove(r3)
+ }
+ else{
+ member.roles.add(r3)
+ await interaction.reply({ content: "The role was successfully added to you", ephemeral: true })}
+ }
+
+
+
+ else if(choice == 'fourth_option'){
+ if (member.roles.cache.some(role => role.id == r4)) {
+ interaction.reply({content: "The role was successfully removed from you!", ephemeral: true})
+ member.roles.remove(r4)
+ }
+ else{
+ member.roles.add(r4)
+ await interaction.reply({ content: "The role was successfully added to you", ephemeral: true })}
+ }
+
+
+ else if(choice == 'fifth_option'){
+ if (member.roles.cache.some(role => role.id == r5)) {
+ interaction.reply({content: "The role was successfully removed from you", ephemeral: true})
+ member.roles.remove(r5)
+ }
+ else{
+ member.roles.add(r5)
+ await interaction.reply({ content: "The role was successfully added to you", ephemeral: true })}
+ }
+
+
+
+ }
+})
+
+client.login(token);//logging into our bot
diff --git a/node_modules/.bin/is-ci b/node_modules/.bin/is-ci
new file mode 100644
index 0000000..c9b0db4
--- /dev/null
+++ b/node_modules/.bin/is-ci
@@ -0,0 +1,12 @@
+#!/bin/sh
+basedir=$(dirname "$(echo "$0" | sed -e 's,\\,/,g')")
+
+case `uname` in
+ *CYGWIN*|*MINGW*|*MSYS*) basedir=`cygpath -w "$basedir"`;;
+esac
+
+if [ -x "$basedir/node" ]; then
+ exec "$basedir/node" "$basedir/../is-ci/bin.js" "$@"
+else
+ exec node "$basedir/../is-ci/bin.js" "$@"
+fi
diff --git a/node_modules/.bin/is-ci.cmd b/node_modules/.bin/is-ci.cmd
new file mode 100644
index 0000000..67e1e22
--- /dev/null
+++ b/node_modules/.bin/is-ci.cmd
@@ -0,0 +1,17 @@
+@ECHO off
+GOTO start
+:find_dp0
+SET dp0=%~dp0
+EXIT /b
+:start
+SETLOCAL
+CALL :find_dp0
+
+IF EXIST "%dp0%\node.exe" (
+ SET "_prog=%dp0%\node.exe"
+) ELSE (
+ SET "_prog=node"
+ SET PATHEXT=%PATHEXT:;.JS;=;%
+)
+
+endLocal & goto #_undefined_# 2>NUL || title %COMSPEC% & "%_prog%" "%dp0%\..\is-ci\bin.js" %*
diff --git a/node_modules/.bin/is-ci.ps1 b/node_modules/.bin/is-ci.ps1
new file mode 100644
index 0000000..773a44d
--- /dev/null
+++ b/node_modules/.bin/is-ci.ps1
@@ -0,0 +1,28 @@
+#!/usr/bin/env pwsh
+$basedir=Split-Path $MyInvocation.MyCommand.Definition -Parent
+
+$exe=""
+if ($PSVersionTable.PSVersion -lt "6.0" -or $IsWindows) {
+ # Fix case when both the Windows and Linux builds of Node
+ # are installed in the same directory
+ $exe=".exe"
+}
+$ret=0
+if (Test-Path "$basedir/node$exe") {
+ # Support pipeline input
+ if ($MyInvocation.ExpectingInput) {
+ $input | & "$basedir/node$exe" "$basedir/../is-ci/bin.js" $args
+ } else {
+ & "$basedir/node$exe" "$basedir/../is-ci/bin.js" $args
+ }
+ $ret=$LASTEXITCODE
+} else {
+ # Support pipeline input
+ if ($MyInvocation.ExpectingInput) {
+ $input | & "node$exe" "$basedir/../is-ci/bin.js" $args
+ } else {
+ & "node$exe" "$basedir/../is-ci/bin.js" $args
+ }
+ $ret=$LASTEXITCODE
+}
+exit $ret
diff --git a/node_modules/.bin/nodemon b/node_modules/.bin/nodemon
new file mode 100644
index 0000000..4d75661
--- /dev/null
+++ b/node_modules/.bin/nodemon
@@ -0,0 +1,12 @@
+#!/bin/sh
+basedir=$(dirname "$(echo "$0" | sed -e 's,\\,/,g')")
+
+case `uname` in
+ *CYGWIN*|*MINGW*|*MSYS*) basedir=`cygpath -w "$basedir"`;;
+esac
+
+if [ -x "$basedir/node" ]; then
+ exec "$basedir/node" "$basedir/../nodemon/bin/nodemon.js" "$@"
+else
+ exec node "$basedir/../nodemon/bin/nodemon.js" "$@"
+fi
diff --git a/node_modules/.bin/nodemon.cmd b/node_modules/.bin/nodemon.cmd
new file mode 100644
index 0000000..55acf8a
--- /dev/null
+++ b/node_modules/.bin/nodemon.cmd
@@ -0,0 +1,17 @@
+@ECHO off
+GOTO start
+:find_dp0
+SET dp0=%~dp0
+EXIT /b
+:start
+SETLOCAL
+CALL :find_dp0
+
+IF EXIST "%dp0%\node.exe" (
+ SET "_prog=%dp0%\node.exe"
+) ELSE (
+ SET "_prog=node"
+ SET PATHEXT=%PATHEXT:;.JS;=;%
+)
+
+endLocal & goto #_undefined_# 2>NUL || title %COMSPEC% & "%_prog%" "%dp0%\..\nodemon\bin\nodemon.js" %*
diff --git a/node_modules/.bin/nodemon.ps1 b/node_modules/.bin/nodemon.ps1
new file mode 100644
index 0000000..d4e3f5d
--- /dev/null
+++ b/node_modules/.bin/nodemon.ps1
@@ -0,0 +1,28 @@
+#!/usr/bin/env pwsh
+$basedir=Split-Path $MyInvocation.MyCommand.Definition -Parent
+
+$exe=""
+if ($PSVersionTable.PSVersion -lt "6.0" -or $IsWindows) {
+ # Fix case when both the Windows and Linux builds of Node
+ # are installed in the same directory
+ $exe=".exe"
+}
+$ret=0
+if (Test-Path "$basedir/node$exe") {
+ # Support pipeline input
+ if ($MyInvocation.ExpectingInput) {
+ $input | & "$basedir/node$exe" "$basedir/../nodemon/bin/nodemon.js" $args
+ } else {
+ & "$basedir/node$exe" "$basedir/../nodemon/bin/nodemon.js" $args
+ }
+ $ret=$LASTEXITCODE
+} else {
+ # Support pipeline input
+ if ($MyInvocation.ExpectingInput) {
+ $input | & "node$exe" "$basedir/../nodemon/bin/nodemon.js" $args
+ } else {
+ & "node$exe" "$basedir/../nodemon/bin/nodemon.js" $args
+ }
+ $ret=$LASTEXITCODE
+}
+exit $ret
diff --git a/node_modules/.bin/nodetouch b/node_modules/.bin/nodetouch
new file mode 100644
index 0000000..03f8b4d
--- /dev/null
+++ b/node_modules/.bin/nodetouch
@@ -0,0 +1,12 @@
+#!/bin/sh
+basedir=$(dirname "$(echo "$0" | sed -e 's,\\,/,g')")
+
+case `uname` in
+ *CYGWIN*|*MINGW*|*MSYS*) basedir=`cygpath -w "$basedir"`;;
+esac
+
+if [ -x "$basedir/node" ]; then
+ exec "$basedir/node" "$basedir/../touch/bin/nodetouch.js" "$@"
+else
+ exec node "$basedir/../touch/bin/nodetouch.js" "$@"
+fi
diff --git a/node_modules/.bin/nodetouch.cmd b/node_modules/.bin/nodetouch.cmd
new file mode 100644
index 0000000..8298b91
--- /dev/null
+++ b/node_modules/.bin/nodetouch.cmd
@@ -0,0 +1,17 @@
+@ECHO off
+GOTO start
+:find_dp0
+SET dp0=%~dp0
+EXIT /b
+:start
+SETLOCAL
+CALL :find_dp0
+
+IF EXIST "%dp0%\node.exe" (
+ SET "_prog=%dp0%\node.exe"
+) ELSE (
+ SET "_prog=node"
+ SET PATHEXT=%PATHEXT:;.JS;=;%
+)
+
+endLocal & goto #_undefined_# 2>NUL || title %COMSPEC% & "%_prog%" "%dp0%\..\touch\bin\nodetouch.js" %*
diff --git a/node_modules/.bin/nodetouch.ps1 b/node_modules/.bin/nodetouch.ps1
new file mode 100644
index 0000000..5f68b4c
--- /dev/null
+++ b/node_modules/.bin/nodetouch.ps1
@@ -0,0 +1,28 @@
+#!/usr/bin/env pwsh
+$basedir=Split-Path $MyInvocation.MyCommand.Definition -Parent
+
+$exe=""
+if ($PSVersionTable.PSVersion -lt "6.0" -or $IsWindows) {
+ # Fix case when both the Windows and Linux builds of Node
+ # are installed in the same directory
+ $exe=".exe"
+}
+$ret=0
+if (Test-Path "$basedir/node$exe") {
+ # Support pipeline input
+ if ($MyInvocation.ExpectingInput) {
+ $input | & "$basedir/node$exe" "$basedir/../touch/bin/nodetouch.js" $args
+ } else {
+ & "$basedir/node$exe" "$basedir/../touch/bin/nodetouch.js" $args
+ }
+ $ret=$LASTEXITCODE
+} else {
+ # Support pipeline input
+ if ($MyInvocation.ExpectingInput) {
+ $input | & "node$exe" "$basedir/../touch/bin/nodetouch.js" $args
+ } else {
+ & "node$exe" "$basedir/../touch/bin/nodetouch.js" $args
+ }
+ $ret=$LASTEXITCODE
+}
+exit $ret
diff --git a/node_modules/.bin/nopt b/node_modules/.bin/nopt
new file mode 100644
index 0000000..f1ec43b
--- /dev/null
+++ b/node_modules/.bin/nopt
@@ -0,0 +1,12 @@
+#!/bin/sh
+basedir=$(dirname "$(echo "$0" | sed -e 's,\\,/,g')")
+
+case `uname` in
+ *CYGWIN*|*MINGW*|*MSYS*) basedir=`cygpath -w "$basedir"`;;
+esac
+
+if [ -x "$basedir/node" ]; then
+ exec "$basedir/node" "$basedir/../nopt/bin/nopt.js" "$@"
+else
+ exec node "$basedir/../nopt/bin/nopt.js" "$@"
+fi
diff --git a/node_modules/.bin/nopt.cmd b/node_modules/.bin/nopt.cmd
new file mode 100644
index 0000000..a7f38b3
--- /dev/null
+++ b/node_modules/.bin/nopt.cmd
@@ -0,0 +1,17 @@
+@ECHO off
+GOTO start
+:find_dp0
+SET dp0=%~dp0
+EXIT /b
+:start
+SETLOCAL
+CALL :find_dp0
+
+IF EXIST "%dp0%\node.exe" (
+ SET "_prog=%dp0%\node.exe"
+) ELSE (
+ SET "_prog=node"
+ SET PATHEXT=%PATHEXT:;.JS;=;%
+)
+
+endLocal & goto #_undefined_# 2>NUL || title %COMSPEC% & "%_prog%" "%dp0%\..\nopt\bin\nopt.js" %*
diff --git a/node_modules/.bin/nopt.ps1 b/node_modules/.bin/nopt.ps1
new file mode 100644
index 0000000..9d6ba56
--- /dev/null
+++ b/node_modules/.bin/nopt.ps1
@@ -0,0 +1,28 @@
+#!/usr/bin/env pwsh
+$basedir=Split-Path $MyInvocation.MyCommand.Definition -Parent
+
+$exe=""
+if ($PSVersionTable.PSVersion -lt "6.0" -or $IsWindows) {
+ # Fix case when both the Windows and Linux builds of Node
+ # are installed in the same directory
+ $exe=".exe"
+}
+$ret=0
+if (Test-Path "$basedir/node$exe") {
+ # Support pipeline input
+ if ($MyInvocation.ExpectingInput) {
+ $input | & "$basedir/node$exe" "$basedir/../nopt/bin/nopt.js" $args
+ } else {
+ & "$basedir/node$exe" "$basedir/../nopt/bin/nopt.js" $args
+ }
+ $ret=$LASTEXITCODE
+} else {
+ # Support pipeline input
+ if ($MyInvocation.ExpectingInput) {
+ $input | & "node$exe" "$basedir/../nopt/bin/nopt.js" $args
+ } else {
+ & "node$exe" "$basedir/../nopt/bin/nopt.js" $args
+ }
+ $ret=$LASTEXITCODE
+}
+exit $ret
diff --git a/node_modules/.bin/rc b/node_modules/.bin/rc
new file mode 100644
index 0000000..e31cd83
--- /dev/null
+++ b/node_modules/.bin/rc
@@ -0,0 +1,12 @@
+#!/bin/sh
+basedir=$(dirname "$(echo "$0" | sed -e 's,\\,/,g')")
+
+case `uname` in
+ *CYGWIN*|*MINGW*|*MSYS*) basedir=`cygpath -w "$basedir"`;;
+esac
+
+if [ -x "$basedir/node" ]; then
+ exec "$basedir/node" "$basedir/../rc/cli.js" "$@"
+else
+ exec node "$basedir/../rc/cli.js" "$@"
+fi
diff --git a/node_modules/.bin/rc.cmd b/node_modules/.bin/rc.cmd
new file mode 100644
index 0000000..be16b73
--- /dev/null
+++ b/node_modules/.bin/rc.cmd
@@ -0,0 +1,17 @@
+@ECHO off
+GOTO start
+:find_dp0
+SET dp0=%~dp0
+EXIT /b
+:start
+SETLOCAL
+CALL :find_dp0
+
+IF EXIST "%dp0%\node.exe" (
+ SET "_prog=%dp0%\node.exe"
+) ELSE (
+ SET "_prog=node"
+ SET PATHEXT=%PATHEXT:;.JS;=;%
+)
+
+endLocal & goto #_undefined_# 2>NUL || title %COMSPEC% & "%_prog%" "%dp0%\..\rc\cli.js" %*
diff --git a/node_modules/.bin/rc.ps1 b/node_modules/.bin/rc.ps1
new file mode 100644
index 0000000..9a9b6e3
--- /dev/null
+++ b/node_modules/.bin/rc.ps1
@@ -0,0 +1,28 @@
+#!/usr/bin/env pwsh
+$basedir=Split-Path $MyInvocation.MyCommand.Definition -Parent
+
+$exe=""
+if ($PSVersionTable.PSVersion -lt "6.0" -or $IsWindows) {
+ # Fix case when both the Windows and Linux builds of Node
+ # are installed in the same directory
+ $exe=".exe"
+}
+$ret=0
+if (Test-Path "$basedir/node$exe") {
+ # Support pipeline input
+ if ($MyInvocation.ExpectingInput) {
+ $input | & "$basedir/node$exe" "$basedir/../rc/cli.js" $args
+ } else {
+ & "$basedir/node$exe" "$basedir/../rc/cli.js" $args
+ }
+ $ret=$LASTEXITCODE
+} else {
+ # Support pipeline input
+ if ($MyInvocation.ExpectingInput) {
+ $input | & "node$exe" "$basedir/../rc/cli.js" $args
+ } else {
+ & "node$exe" "$basedir/../rc/cli.js" $args
+ }
+ $ret=$LASTEXITCODE
+}
+exit $ret
diff --git a/node_modules/.bin/semver b/node_modules/.bin/semver
new file mode 100644
index 0000000..86cee84
--- /dev/null
+++ b/node_modules/.bin/semver
@@ -0,0 +1,12 @@
+#!/bin/sh
+basedir=$(dirname "$(echo "$0" | sed -e 's,\\,/,g')")
+
+case `uname` in
+ *CYGWIN*|*MINGW*|*MSYS*) basedir=`cygpath -w "$basedir"`;;
+esac
+
+if [ -x "$basedir/node" ]; then
+ exec "$basedir/node" "$basedir/../semver/bin/semver" "$@"
+else
+ exec node "$basedir/../semver/bin/semver" "$@"
+fi
diff --git a/node_modules/.bin/semver.cmd b/node_modules/.bin/semver.cmd
new file mode 100644
index 0000000..22d9286
--- /dev/null
+++ b/node_modules/.bin/semver.cmd
@@ -0,0 +1,17 @@
+@ECHO off
+GOTO start
+:find_dp0
+SET dp0=%~dp0
+EXIT /b
+:start
+SETLOCAL
+CALL :find_dp0
+
+IF EXIST "%dp0%\node.exe" (
+ SET "_prog=%dp0%\node.exe"
+) ELSE (
+ SET "_prog=node"
+ SET PATHEXT=%PATHEXT:;.JS;=;%
+)
+
+endLocal & goto #_undefined_# 2>NUL || title %COMSPEC% & "%_prog%" "%dp0%\..\semver\bin\semver" %*
diff --git a/node_modules/.bin/semver.ps1 b/node_modules/.bin/semver.ps1
new file mode 100644
index 0000000..98c1b09
--- /dev/null
+++ b/node_modules/.bin/semver.ps1
@@ -0,0 +1,28 @@
+#!/usr/bin/env pwsh
+$basedir=Split-Path $MyInvocation.MyCommand.Definition -Parent
+
+$exe=""
+if ($PSVersionTable.PSVersion -lt "6.0" -or $IsWindows) {
+ # Fix case when both the Windows and Linux builds of Node
+ # are installed in the same directory
+ $exe=".exe"
+}
+$ret=0
+if (Test-Path "$basedir/node$exe") {
+ # Support pipeline input
+ if ($MyInvocation.ExpectingInput) {
+ $input | & "$basedir/node$exe" "$basedir/../semver/bin/semver" $args
+ } else {
+ & "$basedir/node$exe" "$basedir/../semver/bin/semver" $args
+ }
+ $ret=$LASTEXITCODE
+} else {
+ # Support pipeline input
+ if ($MyInvocation.ExpectingInput) {
+ $input | & "node$exe" "$basedir/../semver/bin/semver" $args
+ } else {
+ & "node$exe" "$basedir/../semver/bin/semver" $args
+ }
+ $ret=$LASTEXITCODE
+}
+exit $ret
diff --git a/node_modules/.package-lock.json b/node_modules/.package-lock.json
new file mode 100644
index 0000000..97b39de
--- /dev/null
+++ b/node_modules/.package-lock.json
@@ -0,0 +1,1392 @@
+{
+ "name": "SelectRoles",
+ "version": "1.0.0",
+ "lockfileVersion": 2,
+ "requires": true,
+ "packages": {
+ "node_modules/@discordjs/builders": {
+ "version": "0.5.0",
+ "resolved": "https://registry.npmjs.org/@discordjs/builders/-/builders-0.5.0.tgz",
+ "integrity": "sha512-HP5y4Rqw68o61Qv4qM5tVmDbWi4mdTFftqIOGRo33SNPpLJ1Ga3KEIR2ibKofkmsoQhEpLmopD1AZDs3cKpHuw==",
+ "dependencies": {
+ "@sindresorhus/is": "^4.0.1",
+ "discord-api-types": "^0.22.0",
+ "ow": "^0.27.0",
+ "ts-mixer": "^6.0.0",
+ "tslib": "^2.3.0"
+ },
+ "engines": {
+ "node": ">=14.0.0",
+ "npm": ">=7.0.0"
+ }
+ },
+ "node_modules/@discordjs/collection": {
+ "version": "0.2.1",
+ "resolved": "https://registry.npmjs.org/@discordjs/collection/-/collection-0.2.1.tgz",
+ "integrity": "sha512-vhxqzzM8gkomw0TYRF3tgx7SwElzUlXT/Aa41O7mOcyN6wIJfj5JmDWaO5XGKsGSsNx7F3i5oIlrucCCWV1Nog==",
+ "engines": {
+ "node": ">=14.0.0"
+ }
+ },
+ "node_modules/@discordjs/form-data": {
+ "version": "3.0.1",
+ "resolved": "https://registry.npmjs.org/@discordjs/form-data/-/form-data-3.0.1.tgz",
+ "integrity": "sha512-ZfFsbgEXW71Rw/6EtBdrP5VxBJy4dthyC0tpQKGKmYFImlmmrykO14Za+BiIVduwjte0jXEBlhSKf0MWbFp9Eg==",
+ "dependencies": {
+ "asynckit": "^0.4.0",
+ "combined-stream": "^1.0.8",
+ "mime-types": "^2.1.12"
+ },
+ "engines": {
+ "node": ">= 6"
+ }
+ },
+ "node_modules/@sapphire/async-queue": {
+ "version": "1.1.4",
+ "resolved": "https://registry.npmjs.org/@sapphire/async-queue/-/async-queue-1.1.4.tgz",
+ "integrity": "sha512-fFrlF/uWpGOX5djw5Mu2Hnnrunao75WGey0sP0J3jnhmrJ5TAPzHYOmytD5iN/+pMxS+f+u/gezqHa9tPhRHEA==",
+ "engines": {
+ "node": ">=14",
+ "npm": ">=6"
+ }
+ },
+ "node_modules/@sindresorhus/is": {
+ "version": "4.0.1",
+ "resolved": "https://registry.npmjs.org/@sindresorhus/is/-/is-4.0.1.tgz",
+ "integrity": "sha512-Qm9hBEBu18wt1PO2flE7LPb30BHMQt1eQgbV76YntdNk73XZGpn3izvGTYxbGgzXKgbCjiia0uxTd3aTNQrY/g==",
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sindresorhus/is?sponsor=1"
+ }
+ },
+ "node_modules/@szmarczak/http-timer": {
+ "version": "1.1.2",
+ "resolved": "https://registry.npmjs.org/@szmarczak/http-timer/-/http-timer-1.1.2.tgz",
+ "integrity": "sha512-XIB2XbzHTN6ieIjfIMV9hlVcfPU26s2vafYWQcZHWXHOxiaRZYEDKEwdl129Zyg50+foYV2jCgtrqSA6qNuNSA==",
+ "dependencies": {
+ "defer-to-connect": "^1.0.1"
+ },
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/@types/node": {
+ "version": "16.6.1",
+ "resolved": "https://registry.npmjs.org/@types/node/-/node-16.6.1.tgz",
+ "integrity": "sha512-Sr7BhXEAer9xyGuCN3Ek9eg9xPviCF2gfu9kTfuU2HkTVAMYSDeX40fvpmo72n5nansg3nsBjuQBrsS28r+NUw=="
+ },
+ "node_modules/@types/ws": {
+ "version": "7.4.7",
+ "resolved": "https://registry.npmjs.org/@types/ws/-/ws-7.4.7.tgz",
+ "integrity": "sha512-JQbbmxZTZehdc2iszGKs5oC3NFnjeay7mtAWrdt7qNtAVK0g19muApzAy4bm9byz79xa2ZnO/BOBC2R8RC5Lww==",
+ "dependencies": {
+ "@types/node": "*"
+ }
+ },
+ "node_modules/abbrev": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz",
+ "integrity": "sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q=="
+ },
+ "node_modules/ansi-align": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/ansi-align/-/ansi-align-3.0.0.tgz",
+ "integrity": "sha512-ZpClVKqXN3RGBmKibdfWzqCY4lnjEuoNzU5T0oEFpfd/z5qJHVarukridD4juLO2FXMiwUQxr9WqQtaYa8XRYw==",
+ "dependencies": {
+ "string-width": "^3.0.0"
+ }
+ },
+ "node_modules/ansi-align/node_modules/ansi-regex": {
+ "version": "4.1.0",
+ "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz",
+ "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==",
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/ansi-align/node_modules/emoji-regex": {
+ "version": "7.0.3",
+ "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-7.0.3.tgz",
+ "integrity": "sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA=="
+ },
+ "node_modules/ansi-align/node_modules/is-fullwidth-code-point": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz",
+ "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=",
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/ansi-align/node_modules/string-width": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz",
+ "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==",
+ "dependencies": {
+ "emoji-regex": "^7.0.1",
+ "is-fullwidth-code-point": "^2.0.0",
+ "strip-ansi": "^5.1.0"
+ },
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/ansi-align/node_modules/strip-ansi": {
+ "version": "5.2.0",
+ "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz",
+ "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==",
+ "dependencies": {
+ "ansi-regex": "^4.1.0"
+ },
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/ansi-regex": {
+ "version": "5.0.0",
+ "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz",
+ "integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==",
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "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==",
+ "dependencies": {
+ "color-convert": "^2.0.1"
+ },
+ "engines": {
+ "node": ">=8"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/ansi-styles?sponsor=1"
+ }
+ },
+ "node_modules/anymatch": {
+ "version": "3.1.2",
+ "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.2.tgz",
+ "integrity": "sha512-P43ePfOAIupkguHUycrc4qJ9kz8ZiuOUijaETwX7THt0Y/GNK7v0aa8rY816xWjZ7rJdA5XdMcpVFTKMq+RvWg==",
+ "dependencies": {
+ "normalize-path": "^3.0.0",
+ "picomatch": "^2.0.4"
+ },
+ "engines": {
+ "node": ">= 8"
+ }
+ },
+ "node_modules/asynckit": {
+ "version": "0.4.0",
+ "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz",
+ "integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k="
+ },
+ "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=="
+ },
+ "node_modules/binary-extensions": {
+ "version": "2.2.0",
+ "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz",
+ "integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==",
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/boxen": {
+ "version": "4.2.0",
+ "resolved": "https://registry.npmjs.org/boxen/-/boxen-4.2.0.tgz",
+ "integrity": "sha512-eB4uT9RGzg2odpER62bBwSLvUeGC+WbRjjyyFhGsKnc8wp/m0+hQsMUvUe3H2V0D5vw0nBdO1hCJoZo5mKeuIQ==",
+ "dependencies": {
+ "ansi-align": "^3.0.0",
+ "camelcase": "^5.3.1",
+ "chalk": "^3.0.0",
+ "cli-boxes": "^2.2.0",
+ "string-width": "^4.1.0",
+ "term-size": "^2.1.0",
+ "type-fest": "^0.8.1",
+ "widest-line": "^3.1.0"
+ },
+ "engines": {
+ "node": ">=8"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/boxen/node_modules/type-fest": {
+ "version": "0.8.1",
+ "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.8.1.tgz",
+ "integrity": "sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==",
+ "engines": {
+ "node": ">=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==",
+ "dependencies": {
+ "balanced-match": "^1.0.0",
+ "concat-map": "0.0.1"
+ }
+ },
+ "node_modules/braces": {
+ "version": "3.0.2",
+ "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz",
+ "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==",
+ "dependencies": {
+ "fill-range": "^7.0.1"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/cacheable-request": {
+ "version": "6.1.0",
+ "resolved": "https://registry.npmjs.org/cacheable-request/-/cacheable-request-6.1.0.tgz",
+ "integrity": "sha512-Oj3cAGPCqOZX7Rz64Uny2GYAZNliQSqfbePrgAQ1wKAihYmCUnraBtJtKcGR4xz7wF+LoJC+ssFZvv5BgF9Igg==",
+ "dependencies": {
+ "clone-response": "^1.0.2",
+ "get-stream": "^5.1.0",
+ "http-cache-semantics": "^4.0.0",
+ "keyv": "^3.0.0",
+ "lowercase-keys": "^2.0.0",
+ "normalize-url": "^4.1.0",
+ "responselike": "^1.0.2"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/cacheable-request/node_modules/get-stream": {
+ "version": "5.2.0",
+ "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-5.2.0.tgz",
+ "integrity": "sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==",
+ "dependencies": {
+ "pump": "^3.0.0"
+ },
+ "engines": {
+ "node": ">=8"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/cacheable-request/node_modules/lowercase-keys": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-2.0.0.tgz",
+ "integrity": "sha512-tqNXrS78oMOE73NMxK4EMLQsQowWf8jKooH9g7xPavRT706R6bkQJ6DY2Te7QukaZsulxa30wQ7bk0pm4XiHmA==",
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/callsites": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz",
+ "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==",
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/camelcase": {
+ "version": "5.3.1",
+ "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz",
+ "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==",
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/chalk": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/chalk/-/chalk-3.0.0.tgz",
+ "integrity": "sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==",
+ "dependencies": {
+ "ansi-styles": "^4.1.0",
+ "supports-color": "^7.1.0"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/chalk/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==",
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "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==",
+ "dependencies": {
+ "has-flag": "^4.0.0"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/chokidar": {
+ "version": "3.5.2",
+ "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.2.tgz",
+ "integrity": "sha512-ekGhOnNVPgT77r4K/U3GDhu+FQ2S8TnK/s2KbIGXi0SZWuwkZ2QNyfWdZW+TVfn84DpEP7rLeCt2UI6bJ8GwbQ==",
+ "dependencies": {
+ "anymatch": "~3.1.2",
+ "braces": "~3.0.2",
+ "glob-parent": "~5.1.2",
+ "is-binary-path": "~2.1.0",
+ "is-glob": "~4.0.1",
+ "normalize-path": "~3.0.0",
+ "readdirp": "~3.6.0"
+ },
+ "engines": {
+ "node": ">= 8.10.0"
+ },
+ "optionalDependencies": {
+ "fsevents": "~2.3.2"
+ }
+ },
+ "node_modules/ci-info": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-2.0.0.tgz",
+ "integrity": "sha512-5tK7EtrZ0N+OLFMthtqOj4fI2Jeb88C4CAZPu25LDVUgXJ0A3Js4PMGqrn0JU1W0Mh1/Z8wZzYPxqUrXeBboCQ=="
+ },
+ "node_modules/cli-boxes": {
+ "version": "2.2.1",
+ "resolved": "https://registry.npmjs.org/cli-boxes/-/cli-boxes-2.2.1.tgz",
+ "integrity": "sha512-y4coMcylgSCdVinjiDBuR8PCC2bLjyGTwEmPb9NHR/QaNU6EUOXcTY/s6VjGMD6ENSEaeQYHCY0GNGS5jfMwPw==",
+ "engines": {
+ "node": ">=6"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/clone-response": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/clone-response/-/clone-response-1.0.2.tgz",
+ "integrity": "sha1-0dyXOSAxTfZ/vrlCI7TuNQI56Ws=",
+ "dependencies": {
+ "mimic-response": "^1.0.0"
+ }
+ },
+ "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==",
+ "dependencies": {
+ "color-name": "~1.1.4"
+ },
+ "engines": {
+ "node": ">=7.0.0"
+ }
+ },
+ "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=="
+ },
+ "node_modules/combined-stream": {
+ "version": "1.0.8",
+ "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz",
+ "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==",
+ "dependencies": {
+ "delayed-stream": "~1.0.0"
+ },
+ "engines": {
+ "node": ">= 0.8"
+ }
+ },
+ "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="
+ },
+ "node_modules/configstore": {
+ "version": "5.0.1",
+ "resolved": "https://registry.npmjs.org/configstore/-/configstore-5.0.1.tgz",
+ "integrity": "sha512-aMKprgk5YhBNyH25hj8wGt2+D52Sw1DRRIzqBwLp2Ya9mFmY8KPvvtvmna8SxVR9JMZ4kzMD68N22vlaRpkeFA==",
+ "dependencies": {
+ "dot-prop": "^5.2.0",
+ "graceful-fs": "^4.1.2",
+ "make-dir": "^3.0.0",
+ "unique-string": "^2.0.0",
+ "write-file-atomic": "^3.0.0",
+ "xdg-basedir": "^4.0.0"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/configstore/node_modules/dot-prop": {
+ "version": "5.3.0",
+ "resolved": "https://registry.npmjs.org/dot-prop/-/dot-prop-5.3.0.tgz",
+ "integrity": "sha512-QM8q3zDe58hqUqjraQOmzZ1LIH9SWQJTlEKCH4kJ2oQvLZk7RbQXvtDM2XEq3fwkV9CCvvH4LA0AV+ogFsBM2Q==",
+ "dependencies": {
+ "is-obj": "^2.0.0"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/crypto-random-string": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/crypto-random-string/-/crypto-random-string-2.0.0.tgz",
+ "integrity": "sha512-v1plID3y9r/lPhviJ1wrXpLeyUIGAZ2SHNYTEapm7/8A9nLPoyvVp3RK/EPFqn5kEznyWgYZNsRtYYIWbuG8KA==",
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/debug": {
+ "version": "3.2.7",
+ "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz",
+ "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==",
+ "dependencies": {
+ "ms": "^2.1.1"
+ }
+ },
+ "node_modules/decompress-response": {
+ "version": "3.3.0",
+ "resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-3.3.0.tgz",
+ "integrity": "sha1-gKTdMjdIOEv6JICDYirt7Jgq3/M=",
+ "dependencies": {
+ "mimic-response": "^1.0.0"
+ },
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/deep-extend": {
+ "version": "0.6.0",
+ "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.6.0.tgz",
+ "integrity": "sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==",
+ "engines": {
+ "node": ">=4.0.0"
+ }
+ },
+ "node_modules/defer-to-connect": {
+ "version": "1.1.3",
+ "resolved": "https://registry.npmjs.org/defer-to-connect/-/defer-to-connect-1.1.3.tgz",
+ "integrity": "sha512-0ISdNousHvZT2EiFlZeZAHBUvSxmKswVCEf8hW7KWgG4a8MVEu/3Vb6uWYozkjylyCxe0JBIiRB1jV45S70WVQ=="
+ },
+ "node_modules/delayed-stream": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz",
+ "integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk=",
+ "engines": {
+ "node": ">=0.4.0"
+ }
+ },
+ "node_modules/discord-api-types": {
+ "version": "0.22.0",
+ "resolved": "https://registry.npmjs.org/discord-api-types/-/discord-api-types-0.22.0.tgz",
+ "integrity": "sha512-l8yD/2zRbZItUQpy7ZxBJwaLX/Bs2TGaCthRppk8Sw24LOIWg12t9JEreezPoYD0SQcC2htNNo27kYEpYW/Srg==",
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/discord.js": {
+ "version": "13.1.0",
+ "resolved": "https://registry.npmjs.org/discord.js/-/discord.js-13.1.0.tgz",
+ "integrity": "sha512-gxO4CXKdHpqA+WKG+f5RNnd3srTDj5uFJHgOathksDE90YNq/Qijkd2WlMgTTMS6AJoEnHxI7G9eDQHCuZ+xDA==",
+ "dependencies": {
+ "@discordjs/builders": "^0.5.0",
+ "@discordjs/collection": "^0.2.1",
+ "@discordjs/form-data": "^3.0.1",
+ "@sapphire/async-queue": "^1.1.4",
+ "@types/ws": "^7.4.7",
+ "discord-api-types": "^0.22.0",
+ "node-fetch": "^2.6.1",
+ "ws": "^7.5.1"
+ },
+ "engines": {
+ "node": ">=16.6.0",
+ "npm": ">=7.0.0"
+ }
+ },
+ "node_modules/dot-prop": {
+ "version": "6.0.1",
+ "resolved": "https://registry.npmjs.org/dot-prop/-/dot-prop-6.0.1.tgz",
+ "integrity": "sha512-tE7ztYzXHIeyvc7N+hR3oi7FIbf/NIjVP9hmAt3yMXzrQ072/fpjGLx2GxNxGxUl5V73MEqYzioOMoVhGMJ5cA==",
+ "dependencies": {
+ "is-obj": "^2.0.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/duplexer3": {
+ "version": "0.1.4",
+ "resolved": "https://registry.npmjs.org/duplexer3/-/duplexer3-0.1.4.tgz",
+ "integrity": "sha1-7gHdHKwO08vH/b6jfcCo8c4ALOI="
+ },
+ "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=="
+ },
+ "node_modules/end-of-stream": {
+ "version": "1.4.4",
+ "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz",
+ "integrity": "sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==",
+ "dependencies": {
+ "once": "^1.4.0"
+ }
+ },
+ "node_modules/escape-goat": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmjs.org/escape-goat/-/escape-goat-2.1.1.tgz",
+ "integrity": "sha512-8/uIhbG12Csjy2JEW7D9pHbreaVaS/OpN3ycnyvElTdwM5n6GY6W6e2IPemfvGZeUMqZ9A/3GqIZMgKnBhAw/Q==",
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/fill-range": {
+ "version": "7.0.1",
+ "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz",
+ "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==",
+ "dependencies": {
+ "to-regex-range": "^5.0.1"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/get-stream": {
+ "version": "4.1.0",
+ "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-4.1.0.tgz",
+ "integrity": "sha512-GMat4EJ5161kIy2HevLlr4luNjBgvmj413KaQA7jt4V8B4RDsfpHk7WQ9GVqfYyyx8OS/L66Kox+rJRNklLK7w==",
+ "dependencies": {
+ "pump": "^3.0.0"
+ },
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "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==",
+ "dependencies": {
+ "is-glob": "^4.0.1"
+ },
+ "engines": {
+ "node": ">= 6"
+ }
+ },
+ "node_modules/global-dirs": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/global-dirs/-/global-dirs-2.1.0.tgz",
+ "integrity": "sha512-MG6kdOUh/xBnyo9cJFeIKkLEc1AyFq42QTU4XiX51i2NEdxLxLWXIjEjmqKeSuKR7pAZjTqUVoT2b2huxVLgYQ==",
+ "dependencies": {
+ "ini": "1.3.7"
+ },
+ "engines": {
+ "node": ">=8"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/got": {
+ "version": "9.6.0",
+ "resolved": "https://registry.npmjs.org/got/-/got-9.6.0.tgz",
+ "integrity": "sha512-R7eWptXuGYxwijs0eV+v3o6+XH1IqVK8dJOEecQfTmkncw9AV4dcw/Dhxi8MdlqPthxxpZyizMzyg8RTmEsG+Q==",
+ "dependencies": {
+ "@sindresorhus/is": "^0.14.0",
+ "@szmarczak/http-timer": "^1.1.2",
+ "cacheable-request": "^6.0.0",
+ "decompress-response": "^3.3.0",
+ "duplexer3": "^0.1.4",
+ "get-stream": "^4.1.0",
+ "lowercase-keys": "^1.0.1",
+ "mimic-response": "^1.0.1",
+ "p-cancelable": "^1.0.0",
+ "to-readable-stream": "^1.0.0",
+ "url-parse-lax": "^3.0.0"
+ },
+ "engines": {
+ "node": ">=8.6"
+ }
+ },
+ "node_modules/got/node_modules/@sindresorhus/is": {
+ "version": "0.14.0",
+ "resolved": "https://registry.npmjs.org/@sindresorhus/is/-/is-0.14.0.tgz",
+ "integrity": "sha512-9NET910DNaIPngYnLLPeg+Ogzqsi9uM4mSboU5y6p8S5DzMTVEsJZrawi+BoDNUVBa2DhJqQYUFvMDfgU062LQ==",
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/graceful-fs": {
+ "version": "4.2.8",
+ "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.8.tgz",
+ "integrity": "sha512-qkIilPUYcNhJpd33n0GBXTB1MMPp14TxEsEs0pTrsSVucApsYzW5V+Q8Qxhik6KU3evy+qkAAowTByymK0avdg=="
+ },
+ "node_modules/has-flag": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz",
+ "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=",
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/has-yarn": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/has-yarn/-/has-yarn-2.1.0.tgz",
+ "integrity": "sha512-UqBRqi4ju7T+TqGNdqAO0PaSVGsDGJUBQvk9eUWNGRY1CFGDzYhLWoM7JQEemnlvVcv/YEmc2wNW8BC24EnUsw==",
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/http-cache-semantics": {
+ "version": "4.1.0",
+ "resolved": "https://registry.npmjs.org/http-cache-semantics/-/http-cache-semantics-4.1.0.tgz",
+ "integrity": "sha512-carPklcUh7ROWRK7Cv27RPtdhYhUsela/ue5/jKzjegVvXDqM2ILE9Q2BGn9JZJh1g87cp56su/FgQSzcWS8cQ=="
+ },
+ "node_modules/ignore-by-default": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/ignore-by-default/-/ignore-by-default-1.0.1.tgz",
+ "integrity": "sha1-SMptcvbGo68Aqa1K5odr44ieKwk="
+ },
+ "node_modules/import-lazy": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/import-lazy/-/import-lazy-2.1.0.tgz",
+ "integrity": "sha1-BWmOPUXIjo1+nZLLBYTnfwlvPkM=",
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/imurmurhash": {
+ "version": "0.1.4",
+ "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz",
+ "integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o=",
+ "engines": {
+ "node": ">=0.8.19"
+ }
+ },
+ "node_modules/ini": {
+ "version": "1.3.7",
+ "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.7.tgz",
+ "integrity": "sha512-iKpRpXP+CrP2jyrxvg1kMUpXDyRUFDWurxbnVT1vQPx+Wz9uCYsMIqYuSBLV+PAaZG/d7kRLKRFc9oDMsH+mFQ=="
+ },
+ "node_modules/is-binary-path": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz",
+ "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==",
+ "dependencies": {
+ "binary-extensions": "^2.0.0"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/is-ci": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/is-ci/-/is-ci-2.0.0.tgz",
+ "integrity": "sha512-YfJT7rkpQB0updsdHLGWrvhBJfcfzNNawYDNIyQXJz0IViGf75O8EBPKSdvw2rF+LGCsX4FZ8tcr3b19LcZq4w==",
+ "dependencies": {
+ "ci-info": "^2.0.0"
+ },
+ "bin": {
+ "is-ci": "bin.js"
+ }
+ },
+ "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=",
+ "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==",
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/is-glob": {
+ "version": "4.0.1",
+ "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.1.tgz",
+ "integrity": "sha512-5G0tKtBTFImOqDnLB2hG6Bp2qcKEFduo4tZu9MT/H6NQv/ghhy30o55ufafxJ/LdH79LLs2Kfrn85TLKyA7BUg==",
+ "dependencies": {
+ "is-extglob": "^2.1.1"
+ },
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/is-installed-globally": {
+ "version": "0.3.2",
+ "resolved": "https://registry.npmjs.org/is-installed-globally/-/is-installed-globally-0.3.2.tgz",
+ "integrity": "sha512-wZ8x1js7Ia0kecP/CHM/3ABkAmujX7WPvQk6uu3Fly/Mk44pySulQpnHG46OMjHGXApINnV4QhY3SWnECO2z5g==",
+ "dependencies": {
+ "global-dirs": "^2.0.1",
+ "is-path-inside": "^3.0.1"
+ },
+ "engines": {
+ "node": ">=8"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/is-npm": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/is-npm/-/is-npm-4.0.0.tgz",
+ "integrity": "sha512-96ECIfh9xtDDlPylNPXhzjsykHsMJZ18ASpaWzQyBr4YRTcVjUvzaHayDAES2oU/3KpljhHUjtSRNiDwi0F0ig==",
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/is-number": {
+ "version": "7.0.0",
+ "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz",
+ "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==",
+ "engines": {
+ "node": ">=0.12.0"
+ }
+ },
+ "node_modules/is-obj": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/is-obj/-/is-obj-2.0.0.tgz",
+ "integrity": "sha512-drqDG3cbczxxEJRoOXcOjtdp1J/lyp1mNn0xaznRs8+muBhgQcrnbspox5X5fOw0HnMnbfDzvnEMEtqDEJEo8w==",
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/is-path-inside": {
+ "version": "3.0.3",
+ "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-3.0.3.tgz",
+ "integrity": "sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==",
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/is-typedarray": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz",
+ "integrity": "sha1-5HnICFjfDBsR3dppQPlgEfzaSpo="
+ },
+ "node_modules/is-yarn-global": {
+ "version": "0.3.0",
+ "resolved": "https://registry.npmjs.org/is-yarn-global/-/is-yarn-global-0.3.0.tgz",
+ "integrity": "sha512-VjSeb/lHmkoyd8ryPVIKvOCn4D1koMqY+vqyjjUfc3xyKtP4dYOxM44sZrnqQSzSds3xyOrUTLTC9LVCVgLngw=="
+ },
+ "node_modules/json-buffer": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.0.tgz",
+ "integrity": "sha1-Wx85evx11ne96Lz8Dkfh+aPZqJg="
+ },
+ "node_modules/keyv": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/keyv/-/keyv-3.1.0.tgz",
+ "integrity": "sha512-9ykJ/46SN/9KPM/sichzQ7OvXyGDYKGTaDlKMGCAlg2UK8KRy4jb0d8sFc+0Tt0YYnThq8X2RZgCg74RPxgcVA==",
+ "dependencies": {
+ "json-buffer": "3.0.0"
+ }
+ },
+ "node_modules/latest-version": {
+ "version": "5.1.0",
+ "resolved": "https://registry.npmjs.org/latest-version/-/latest-version-5.1.0.tgz",
+ "integrity": "sha512-weT+r0kTkRQdCdYCNtkMwWXQTMEswKrFBkm4ckQOMVhhqhIMI1UT2hMj+1iigIhgSZm5gTmrRXBNoGUgaTY1xA==",
+ "dependencies": {
+ "package-json": "^6.3.0"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/lodash.isequal": {
+ "version": "4.5.0",
+ "resolved": "https://registry.npmjs.org/lodash.isequal/-/lodash.isequal-4.5.0.tgz",
+ "integrity": "sha1-QVxEePK8wwEgwizhDtMib30+GOA="
+ },
+ "node_modules/lowercase-keys": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-1.0.1.tgz",
+ "integrity": "sha512-G2Lj61tXDnVFFOi8VZds+SoQjtQC3dgokKdDG2mTm1tx4m50NUHBOZSBwQQHyy0V12A0JTG4icfZQH+xPyh8VA==",
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/make-dir": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz",
+ "integrity": "sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==",
+ "dependencies": {
+ "semver": "^6.0.0"
+ },
+ "engines": {
+ "node": ">=8"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/make-dir/node_modules/semver": {
+ "version": "6.3.0",
+ "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz",
+ "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==",
+ "bin": {
+ "semver": "bin/semver.js"
+ }
+ },
+ "node_modules/mime-db": {
+ "version": "1.49.0",
+ "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.49.0.tgz",
+ "integrity": "sha512-CIc8j9URtOVApSFCQIF+VBkX1RwXp/oMMOrqdyXSBXq5RWNEsRfyj1kiRnQgmNXmHxPoFIxOroKA3zcU9P+nAA==",
+ "engines": {
+ "node": ">= 0.6"
+ }
+ },
+ "node_modules/mime-types": {
+ "version": "2.1.32",
+ "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.32.tgz",
+ "integrity": "sha512-hJGaVS4G4c9TSMYh2n6SQAGrC4RnfU+daP8G7cSCmaqNjiOoUY0VHCMS42pxnQmVF1GWwFhbHWn3RIxCqTmZ9A==",
+ "dependencies": {
+ "mime-db": "1.49.0"
+ },
+ "engines": {
+ "node": ">= 0.6"
+ }
+ },
+ "node_modules/mimic-response": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-1.0.1.tgz",
+ "integrity": "sha512-j5EctnkH7amfV/q5Hgmoal1g2QHFJRraOtmx0JpIqkxhBhI/lJSl1nMpQ45hVarwNETOoWEimndZ4QK0RHxuxQ==",
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/minimatch": {
+ "version": "3.0.4",
+ "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz",
+ "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==",
+ "dependencies": {
+ "brace-expansion": "^1.1.7"
+ },
+ "engines": {
+ "node": "*"
+ }
+ },
+ "node_modules/minimist": {
+ "version": "1.2.5",
+ "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz",
+ "integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw=="
+ },
+ "node_modules/ms": {
+ "version": "2.1.3",
+ "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz",
+ "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA=="
+ },
+ "node_modules/node-fetch": {
+ "version": "2.6.1",
+ "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.1.tgz",
+ "integrity": "sha512-V4aYg89jEoVRxRb2fJdAg8FHvI7cEyYdVAh94HH0UIK8oJxUfkjlDQN9RbMx+bEjP7+ggMiFRprSti032Oipxw==",
+ "engines": {
+ "node": "4.x || >=6.0.0"
+ }
+ },
+ "node_modules/nodemon": {
+ "version": "2.0.12",
+ "resolved": "https://registry.npmjs.org/nodemon/-/nodemon-2.0.12.tgz",
+ "integrity": "sha512-egCTmNZdObdBxUBw6ZNwvZ/xzk24CKRs5K6d+5zbmrMr7rOpPmfPeF6OxM3DDpaRx331CQRFEktn+wrFFfBSOA==",
+ "hasInstallScript": true,
+ "dependencies": {
+ "chokidar": "^3.2.2",
+ "debug": "^3.2.6",
+ "ignore-by-default": "^1.0.1",
+ "minimatch": "^3.0.4",
+ "pstree.remy": "^1.1.7",
+ "semver": "^5.7.1",
+ "supports-color": "^5.5.0",
+ "touch": "^3.1.0",
+ "undefsafe": "^2.0.3",
+ "update-notifier": "^4.1.0"
+ },
+ "bin": {
+ "nodemon": "bin/nodemon.js"
+ },
+ "engines": {
+ "node": ">=8.10.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/nodemon"
+ }
+ },
+ "node_modules/nopt": {
+ "version": "1.0.10",
+ "resolved": "https://registry.npmjs.org/nopt/-/nopt-1.0.10.tgz",
+ "integrity": "sha1-bd0hvSoxQXuScn3Vhfim83YI6+4=",
+ "dependencies": {
+ "abbrev": "1"
+ },
+ "bin": {
+ "nopt": "bin/nopt.js"
+ },
+ "engines": {
+ "node": "*"
+ }
+ },
+ "node_modules/normalize-path": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz",
+ "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==",
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/normalize-url": {
+ "version": "4.5.1",
+ "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-4.5.1.tgz",
+ "integrity": "sha512-9UZCFRHQdNrfTpGg8+1INIg93B6zE0aXMVFkw1WFwvO4SlZywU6aLg5Of0Ap/PgcbSw4LNxvMWXMeugwMCX0AA==",
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/once": {
+ "version": "1.4.0",
+ "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz",
+ "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=",
+ "dependencies": {
+ "wrappy": "1"
+ }
+ },
+ "node_modules/ow": {
+ "version": "0.27.0",
+ "resolved": "https://registry.npmjs.org/ow/-/ow-0.27.0.tgz",
+ "integrity": "sha512-SGnrGUbhn4VaUGdU0EJLMwZWSupPmF46hnTRII7aCLCrqixTAC5eKo8kI4/XXf1eaaI8YEVT+3FeGNJI9himAQ==",
+ "dependencies": {
+ "@sindresorhus/is": "^4.0.1",
+ "callsites": "^3.1.0",
+ "dot-prop": "^6.0.1",
+ "lodash.isequal": "^4.5.0",
+ "type-fest": "^1.2.1",
+ "vali-date": "^1.0.0"
+ },
+ "engines": {
+ "node": ">=12"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/p-cancelable": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/p-cancelable/-/p-cancelable-1.1.0.tgz",
+ "integrity": "sha512-s73XxOZ4zpt1edZYZzvhqFa6uvQc1vwUa0K0BdtIZgQMAJj9IbebH+JkgKZc9h+B05PKHLOTl4ajG1BmNrVZlw==",
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/package-json": {
+ "version": "6.5.0",
+ "resolved": "https://registry.npmjs.org/package-json/-/package-json-6.5.0.tgz",
+ "integrity": "sha512-k3bdm2n25tkyxcjSKzB5x8kfVxlMdgsbPr0GkZcwHsLpba6cBjqCt1KlcChKEvxHIcTB1FVMuwoijZ26xex5MQ==",
+ "dependencies": {
+ "got": "^9.6.0",
+ "registry-auth-token": "^4.0.0",
+ "registry-url": "^5.0.0",
+ "semver": "^6.2.0"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/package-json/node_modules/semver": {
+ "version": "6.3.0",
+ "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz",
+ "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==",
+ "bin": {
+ "semver": "bin/semver.js"
+ }
+ },
+ "node_modules/picomatch": {
+ "version": "2.3.0",
+ "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.0.tgz",
+ "integrity": "sha512-lY1Q/PiJGC2zOv/z391WOTD+Z02bCgsFfvxoXXf6h7kv9o+WmsmzYqrAwY63sNgOxE4xEdq0WyUnXfKeBrSvYw==",
+ "engines": {
+ "node": ">=8.6"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/jonschlinkert"
+ }
+ },
+ "node_modules/prepend-http": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/prepend-http/-/prepend-http-2.0.0.tgz",
+ "integrity": "sha1-6SQ0v6XqjBn0HN/UAddBo8gZ2Jc=",
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/pstree.remy": {
+ "version": "1.1.8",
+ "resolved": "https://registry.npmjs.org/pstree.remy/-/pstree.remy-1.1.8.tgz",
+ "integrity": "sha512-77DZwxQmxKnu3aR542U+X8FypNzbfJ+C5XQDk3uWjWxn6151aIMGthWYRXTqT1E5oJvg+ljaa2OJi+VfvCOQ8w=="
+ },
+ "node_modules/pump": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz",
+ "integrity": "sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==",
+ "dependencies": {
+ "end-of-stream": "^1.1.0",
+ "once": "^1.3.1"
+ }
+ },
+ "node_modules/pupa": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmjs.org/pupa/-/pupa-2.1.1.tgz",
+ "integrity": "sha512-l1jNAspIBSFqbT+y+5FosojNpVpF94nlI+wDUpqP9enwOTfHx9f0gh5nB96vl+6yTpsJsypeNrwfzPrKuHB41A==",
+ "dependencies": {
+ "escape-goat": "^2.0.0"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/rc": {
+ "version": "1.2.8",
+ "resolved": "https://registry.npmjs.org/rc/-/rc-1.2.8.tgz",
+ "integrity": "sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==",
+ "dependencies": {
+ "deep-extend": "^0.6.0",
+ "ini": "~1.3.0",
+ "minimist": "^1.2.0",
+ "strip-json-comments": "~2.0.1"
+ },
+ "bin": {
+ "rc": "cli.js"
+ }
+ },
+ "node_modules/readdirp": {
+ "version": "3.6.0",
+ "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz",
+ "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==",
+ "dependencies": {
+ "picomatch": "^2.2.1"
+ },
+ "engines": {
+ "node": ">=8.10.0"
+ }
+ },
+ "node_modules/registry-auth-token": {
+ "version": "4.2.1",
+ "resolved": "https://registry.npmjs.org/registry-auth-token/-/registry-auth-token-4.2.1.tgz",
+ "integrity": "sha512-6gkSb4U6aWJB4SF2ZvLb76yCBjcvufXBqvvEx1HbmKPkutswjW1xNVRY0+daljIYRbogN7O0etYSlbiaEQyMyw==",
+ "dependencies": {
+ "rc": "^1.2.8"
+ },
+ "engines": {
+ "node": ">=6.0.0"
+ }
+ },
+ "node_modules/registry-url": {
+ "version": "5.1.0",
+ "resolved": "https://registry.npmjs.org/registry-url/-/registry-url-5.1.0.tgz",
+ "integrity": "sha512-8acYXXTI0AkQv6RAOjE3vOaIXZkT9wo4LOFbBKYQEEnnMNBpKqdUrI6S4NT0KPIo/WVvJ5tE/X5LF/TQUf0ekw==",
+ "dependencies": {
+ "rc": "^1.2.8"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/responselike": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/responselike/-/responselike-1.0.2.tgz",
+ "integrity": "sha1-kYcg7ztjHFZCvgaPFa3lpG9Loec=",
+ "dependencies": {
+ "lowercase-keys": "^1.0.0"
+ }
+ },
+ "node_modules/semver": {
+ "version": "5.7.1",
+ "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz",
+ "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==",
+ "bin": {
+ "semver": "bin/semver"
+ }
+ },
+ "node_modules/semver-diff": {
+ "version": "3.1.1",
+ "resolved": "https://registry.npmjs.org/semver-diff/-/semver-diff-3.1.1.tgz",
+ "integrity": "sha512-GX0Ix/CJcHyB8c4ykpHGIAvLyOwOobtM/8d+TQkAd81/bEjgPHrfba41Vpesr7jX/t8Uh+R3EX9eAS5be+jQYg==",
+ "dependencies": {
+ "semver": "^6.3.0"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/semver-diff/node_modules/semver": {
+ "version": "6.3.0",
+ "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz",
+ "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==",
+ "bin": {
+ "semver": "bin/semver.js"
+ }
+ },
+ "node_modules/signal-exit": {
+ "version": "3.0.3",
+ "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.3.tgz",
+ "integrity": "sha512-VUJ49FC8U1OxwZLxIbTTrDvLnf/6TDgxZcK8wxR8zs13xpx7xbG60ndBlhNrFi2EMuFRoeDoJO7wthSLq42EjA=="
+ },
+ "node_modules/string-width": {
+ "version": "4.2.2",
+ "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.2.tgz",
+ "integrity": "sha512-XBJbT3N4JhVumXE0eoLU9DCjcaF92KLNqTmFCnG1pf8duUxFGwtP6AD6nkjw9a3IdiRtL3E2w3JDiE/xi3vOeA==",
+ "dependencies": {
+ "emoji-regex": "^8.0.0",
+ "is-fullwidth-code-point": "^3.0.0",
+ "strip-ansi": "^6.0.0"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/strip-ansi": {
+ "version": "6.0.0",
+ "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.0.tgz",
+ "integrity": "sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==",
+ "dependencies": {
+ "ansi-regex": "^5.0.0"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/strip-json-comments": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz",
+ "integrity": "sha1-PFMZQukIwml8DsNEhYwobHygpgo=",
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "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==",
+ "dependencies": {
+ "has-flag": "^3.0.0"
+ },
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/term-size": {
+ "version": "2.2.1",
+ "resolved": "https://registry.npmjs.org/term-size/-/term-size-2.2.1.tgz",
+ "integrity": "sha512-wK0Ri4fOGjv/XPy8SBHZChl8CM7uMc5VML7SqiQ0zG7+J5Vr+RMQDoHa2CNT6KHUnTGIXH34UDMkPzAUyapBZg==",
+ "engines": {
+ "node": ">=8"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/to-readable-stream": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/to-readable-stream/-/to-readable-stream-1.0.0.tgz",
+ "integrity": "sha512-Iq25XBt6zD5npPhlLVXGFN3/gyR2/qODcKNNyTMd4vbm39HUaOiAM4PMq0eMVC/Tkxz+Zjdsc55g9yyz+Yq00Q==",
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/to-regex-range": {
+ "version": "5.0.1",
+ "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz",
+ "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==",
+ "dependencies": {
+ "is-number": "^7.0.0"
+ },
+ "engines": {
+ "node": ">=8.0"
+ }
+ },
+ "node_modules/touch": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/touch/-/touch-3.1.0.tgz",
+ "integrity": "sha512-WBx8Uy5TLtOSRtIq+M03/sKDrXCLHxwDcquSP2c43Le03/9serjQBIztjRz6FkJez9D/hleyAXTBGLwwZUw9lA==",
+ "dependencies": {
+ "nopt": "~1.0.10"
+ },
+ "bin": {
+ "nodetouch": "bin/nodetouch.js"
+ }
+ },
+ "node_modules/ts-mixer": {
+ "version": "6.0.0",
+ "resolved": "https://registry.npmjs.org/ts-mixer/-/ts-mixer-6.0.0.tgz",
+ "integrity": "sha512-nXIb1fvdY5CBSrDIblLn73NW0qRDk5yJ0Sk1qPBF560OdJfQp9jhl+0tzcY09OZ9U+6GpeoI9RjwoIKFIoB9MQ=="
+ },
+ "node_modules/tslib": {
+ "version": "2.3.1",
+ "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.3.1.tgz",
+ "integrity": "sha512-77EbyPPpMz+FRFRuAFlWMtmgUWGe9UOG2Z25NqCwiIjRhOf5iKGuzSe5P2w1laq+FkRy4p+PCuVkJSGkzTEKVw=="
+ },
+ "node_modules/type-fest": {
+ "version": "1.4.0",
+ "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-1.4.0.tgz",
+ "integrity": "sha512-yGSza74xk0UG8k+pLh5oeoYirvIiWo5t0/o3zHHAO2tRDiZcxWP7fywNlXhqb6/r6sWvwi+RsyQMWhVLe4BVuA==",
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/typedarray-to-buffer": {
+ "version": "3.1.5",
+ "resolved": "https://registry.npmjs.org/typedarray-to-buffer/-/typedarray-to-buffer-3.1.5.tgz",
+ "integrity": "sha512-zdu8XMNEDepKKR+XYOXAVPtWui0ly0NtohUscw+UmaHiAWT8hrV1rr//H6V+0DvJ3OQ19S979M0laLfX8rm82Q==",
+ "dependencies": {
+ "is-typedarray": "^1.0.0"
+ }
+ },
+ "node_modules/undefsafe": {
+ "version": "2.0.3",
+ "resolved": "https://registry.npmjs.org/undefsafe/-/undefsafe-2.0.3.tgz",
+ "integrity": "sha512-nrXZwwXrD/T/JXeygJqdCO6NZZ1L66HrxM/Z7mIq2oPanoN0F1nLx3lwJMu6AwJY69hdixaFQOuoYsMjE5/C2A==",
+ "dependencies": {
+ "debug": "^2.2.0"
+ }
+ },
+ "node_modules/undefsafe/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/undefsafe/node_modules/ms": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
+ "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g="
+ },
+ "node_modules/unique-string": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/unique-string/-/unique-string-2.0.0.tgz",
+ "integrity": "sha512-uNaeirEPvpZWSgzwsPGtU2zVSTrn/8L5q/IexZmH0eH6SA73CmAA5U4GwORTxQAZs95TAXLNqeLoPPNO5gZfWg==",
+ "dependencies": {
+ "crypto-random-string": "^2.0.0"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/update-notifier": {
+ "version": "4.1.3",
+ "resolved": "https://registry.npmjs.org/update-notifier/-/update-notifier-4.1.3.tgz",
+ "integrity": "sha512-Yld6Z0RyCYGB6ckIjffGOSOmHXj1gMeE7aROz4MG+XMkmixBX4jUngrGXNYz7wPKBmtoD4MnBa2Anu7RSKht/A==",
+ "dependencies": {
+ "boxen": "^4.2.0",
+ "chalk": "^3.0.0",
+ "configstore": "^5.0.1",
+ "has-yarn": "^2.1.0",
+ "import-lazy": "^2.1.0",
+ "is-ci": "^2.0.0",
+ "is-installed-globally": "^0.3.1",
+ "is-npm": "^4.0.0",
+ "is-yarn-global": "^0.3.0",
+ "latest-version": "^5.0.0",
+ "pupa": "^2.0.1",
+ "semver-diff": "^3.1.1",
+ "xdg-basedir": "^4.0.0"
+ },
+ "engines": {
+ "node": ">=8"
+ },
+ "funding": {
+ "url": "https://github.com/yeoman/update-notifier?sponsor=1"
+ }
+ },
+ "node_modules/url-parse-lax": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/url-parse-lax/-/url-parse-lax-3.0.0.tgz",
+ "integrity": "sha1-FrXK/Afb42dsGxmZF3gj1lA6yww=",
+ "dependencies": {
+ "prepend-http": "^2.0.0"
+ },
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/vali-date": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/vali-date/-/vali-date-1.0.0.tgz",
+ "integrity": "sha1-G5BKWWCfsyjvB4E4Qgk09rhnCaY=",
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/widest-line": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/widest-line/-/widest-line-3.1.0.tgz",
+ "integrity": "sha512-NsmoXalsWVDMGupxZ5R08ka9flZjjiLvHVAWYOKtiKM8ujtZWr9cRffak+uSE48+Ob8ObalXpwyeUiyDD6QFgg==",
+ "dependencies": {
+ "string-width": "^4.0.0"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/wrappy": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz",
+ "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8="
+ },
+ "node_modules/write-file-atomic": {
+ "version": "3.0.3",
+ "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-3.0.3.tgz",
+ "integrity": "sha512-AvHcyZ5JnSfq3ioSyjrBkH9yW4m7Ayk8/9My/DD9onKeu/94fwrMocemO2QAJFAlnnDN+ZDS+ZjAR5ua1/PV/Q==",
+ "dependencies": {
+ "imurmurhash": "^0.1.4",
+ "is-typedarray": "^1.0.0",
+ "signal-exit": "^3.0.2",
+ "typedarray-to-buffer": "^3.1.5"
+ }
+ },
+ "node_modules/ws": {
+ "version": "7.5.3",
+ "resolved": "https://registry.npmjs.org/ws/-/ws-7.5.3.tgz",
+ "integrity": "sha512-kQ/dHIzuLrS6Je9+uv81ueZomEwH0qVYstcAQ4/Z93K8zeko9gtAbttJWzoC5ukqXY1PpoouV3+VSOqEAFt5wg==",
+ "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/xdg-basedir": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/xdg-basedir/-/xdg-basedir-4.0.0.tgz",
+ "integrity": "sha512-PSNhEJDejZYV7h50BohL09Er9VaIefr2LMAf3OEmpCkjOi34eYyQYAXUTjEQtZJTKcF0E2UKTh+osDLsgNim9Q==",
+ "engines": {
+ "node": ">=8"
+ }
+ }
+ }
+}
diff --git a/node_modules/@discordjs/builders/LICENSE b/node_modules/@discordjs/builders/LICENSE
new file mode 100644
index 0000000..9300648
--- /dev/null
+++ b/node_modules/@discordjs/builders/LICENSE
@@ -0,0 +1,190 @@
+ Apache License
+ Version 2.0, January 2004
+ http://www.apache.org/licenses/
+
+ TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
+
+ 1. Definitions.
+
+ "License" shall mean the terms and conditions for use, reproduction,
+ and distribution as defined by Sections 1 through 9 of this document.
+
+ "Licensor" shall mean the copyright owner or entity authorized by
+ the copyright owner that is granting the License.
+
+ "Legal Entity" shall mean the union of the acting entity and all
+ other entities that control, are controlled by, or are under common
+ control with that entity. For the purposes of this definition,
+ "control" means (i) the power, direct or indirect, to cause the
+ direction or management of such entity, whether by contract or
+ otherwise, or (ii) ownership of fifty percent (50%) or more of the
+ outstanding shares, or (iii) beneficial ownership of such entity.
+
+ "You" (or "Your") shall mean an individual or Legal Entity
+ exercising permissions granted by this License.
+
+ "Source" form shall mean the preferred form for making modifications,
+ including but not limited to software source code, documentation
+ source, and configuration files.
+
+ "Object" form shall mean any form resulting from mechanical
+ transformation or translation of a Source form, including but
+ not limited to compiled object code, generated documentation,
+ and conversions to other media types.
+
+ "Work" shall mean the work of authorship, whether in Source or
+ Object form, made available under the License, as indicated by a
+ copyright notice that is included in or attached to the work
+ (an example is provided in the Appendix below).
+
+ "Derivative Works" shall mean any work, whether in Source or Object
+ form, that is based on (or derived from) the Work and for which the
+ editorial revisions, annotations, elaborations, or other modifications
+ represent, as a whole, an original work of authorship. For the purposes
+ of this License, Derivative Works shall not include works that remain
+ separable from, or merely link (or bind by name) to the interfaces of,
+ the Work and Derivative Works thereof.
+
+ "Contribution" shall mean any work of authorship, including
+ the original version of the Work and any modifications or additions
+ to that Work or Derivative Works thereof, that is intentionally
+ submitted to Licensor for inclusion in the Work by the copyright owner
+ or by an individual or Legal Entity authorized to submit on behalf of
+ the copyright owner. For the purposes of this definition, "submitted"
+ means any form of electronic, verbal, or written communication sent
+ to the Licensor or its representatives, including but not limited to
+ communication on electronic mailing lists, source code control systems,
+ and issue tracking systems that are managed by, or on behalf of, the
+ Licensor for the purpose of discussing and improving the Work, but
+ excluding communication that is conspicuously marked or otherwise
+ designated in writing by the copyright owner as "Not a Contribution."
+
+ "Contributor" shall mean Licensor and any individual or Legal Entity
+ on behalf of whom a Contribution has been received by Licensor and
+ subsequently incorporated within the Work.
+
+ 2. Grant of Copyright License. Subject to the terms and conditions of
+ this License, each Contributor hereby grants to You a perpetual,
+ worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+ copyright license to reproduce, prepare Derivative Works of,
+ publicly display, publicly perform, sublicense, and distribute the
+ Work and such Derivative Works in Source or Object form.
+
+ 3. Grant of Patent License. Subject to the terms and conditions of
+ this License, each Contributor hereby grants to You a perpetual,
+ worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+ (except as stated in this section) patent license to make, have made,
+ use, offer to sell, sell, import, and otherwise transfer the Work,
+ where such license applies only to those patent claims licensable
+ by such Contributor that are necessarily infringed by their
+ Contribution(s) alone or by combination of their Contribution(s)
+ with the Work to which such Contribution(s) was submitted. If You
+ institute patent litigation against any entity (including a
+ cross-claim or counterclaim in a lawsuit) alleging that the Work
+ or a Contribution incorporated within the Work constitutes direct
+ or contributory patent infringement, then any patent licenses
+ granted to You under this License for that Work shall terminate
+ as of the date such litigation is filed.
+
+ 4. Redistribution. You may reproduce and distribute copies of the
+ Work or Derivative Works thereof in any medium, with or without
+ modifications, and in Source or Object form, provided that You
+ meet the following conditions:
+
+ (a) You must give any other recipients of the Work or
+ Derivative Works a copy of this License; and
+
+ (b) You must cause any modified files to carry prominent notices
+ stating that You changed the files; and
+
+ (c) You must retain, in the Source form of any Derivative Works
+ that You distribute, all copyright, patent, trademark, and
+ attribution notices from the Source form of the Work,
+ excluding those notices that do not pertain to any part of
+ the Derivative Works; and
+
+ (d) If the Work includes a "NOTICE" text file as part of its
+ distribution, then any Derivative Works that You distribute must
+ include a readable copy of the attribution notices contained
+ within such NOTICE file, excluding those notices that do not
+ pertain to any part of the Derivative Works, in at least one
+ of the following places: within a NOTICE text file distributed
+ as part of the Derivative Works; within the Source form or
+ documentation, if provided along with the Derivative Works; or,
+ within a display generated by the Derivative Works, if and
+ wherever such third-party notices normally appear. The contents
+ of the NOTICE file are for informational purposes only and
+ do not modify the License. You may add Your own attribution
+ notices within Derivative Works that You distribute, alongside
+ or as an addendum to the NOTICE text from the Work, provided
+ that such additional attribution notices cannot be construed
+ as modifying the License.
+
+ You may add Your own copyright statement to Your modifications and
+ may provide additional or different license terms and conditions
+ for use, reproduction, or distribution of Your modifications, or
+ for any such Derivative Works as a whole, provided Your use,
+ reproduction, and distribution of the Work otherwise complies with
+ the conditions stated in this License.
+
+ 5. Submission of Contributions. Unless You explicitly state otherwise,
+ any Contribution intentionally submitted for inclusion in the Work
+ by You to the Licensor shall be under the terms and conditions of
+ this License, without any additional terms or conditions.
+ Notwithstanding the above, nothing herein shall supersede or modify
+ the terms of any separate license agreement you may have executed
+ with Licensor regarding such Contributions.
+
+ 6. Trademarks. This License does not grant permission to use the trade
+ names, trademarks, service marks, or product names of the Licensor,
+ except as required for reasonable and customary use in describing the
+ origin of the Work and reproducing the content of the NOTICE file.
+
+ 7. Disclaimer of Warranty. Unless required by applicable law or
+ agreed to in writing, Licensor provides the Work (and each
+ Contributor provides its Contributions) on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
+ implied, including, without limitation, any warranties or conditions
+ of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
+ PARTICULAR PURPOSE. You are solely responsible for determining the
+ appropriateness of using or redistributing the Work and assume any
+ risks associated with Your exercise of permissions under this License.
+
+ 8. Limitation of Liability. In no event and under no legal theory,
+ whether in tort (including negligence), contract, or otherwise,
+ unless required by applicable law (such as deliberate and grossly
+ negligent acts) or agreed to in writing, shall any Contributor be
+ liable to You for damages, including any direct, indirect, special,
+ incidental, or consequential damages of any character arising as a
+ result of this License or out of the use or inability to use the
+ Work (including but not limited to damages for loss of goodwill,
+ work stoppage, computer failure or malfunction, or any and all
+ other commercial damages or losses), even if such Contributor
+ has been advised of the possibility of such damages.
+
+ 9. Accepting Warranty or Additional Liability. While redistributing
+ the Work or Derivative Works thereof, You may choose to offer,
+ and charge a fee for, acceptance of support, warranty, indemnity,
+ or other liability obligations and/or rights consistent with this
+ License. However, in accepting such obligations, You may act only
+ on Your own behalf and on Your sole responsibility, not on behalf
+ of any other Contributor, and only if You agree to indemnify,
+ defend, and hold each Contributor harmless for any liability
+ incurred by, or claims asserted against, such Contributor by reason
+ of your accepting any such warranty or additional liability.
+
+ END OF TERMS AND CONDITIONS
+
+ Copyright 2021 Vlad Frangu
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
diff --git a/node_modules/@discordjs/builders/README.md b/node_modules/@discordjs/builders/README.md
new file mode 100644
index 0000000..7838460
--- /dev/null
+++ b/node_modules/@discordjs/builders/README.md
@@ -0,0 +1,33 @@
+
+
+## Installation
+
+Install with [npm](https://www.npmjs.com/) / [yarn](https://yarnpkg.com) / [pnpm](https://pnpm.js.org/):
+
+```sh
+npm install @discordjs/builders
+yarn add @discordjs/builders
+pnpm add @discordjs/builders
+```
+
+## Contribution
+
+See [Contributing Guide](https://github.com/discordjs/builders/blob/main/.github/CONTRIBUTING.md).
+
+## Examples
+
+Here are some examples for the builders and utilities you can find in this package:
+
+- [Slash Command Builders](./docs/examples/Slash%20Command%20Builders.md)
diff --git a/node_modules/@discordjs/builders/dist/index.d.ts b/node_modules/@discordjs/builders/dist/index.d.ts
new file mode 100644
index 0000000..3530b2c
--- /dev/null
+++ b/node_modules/@discordjs/builders/dist/index.d.ts
@@ -0,0 +1,12 @@
+export * from './messages/formatters';
+export * as SlashCommandAssertions from './interactions/slashCommands/Assertions';
+export * from './interactions/slashCommands/SlashCommandBuilder';
+export * from './interactions/slashCommands/SlashCommandSubcommands';
+export * from './interactions/slashCommands/options/boolean';
+export * from './interactions/slashCommands/options/channel';
+export * from './interactions/slashCommands/options/integer';
+export * from './interactions/slashCommands/options/mentionable';
+export * from './interactions/slashCommands/options/role';
+export * from './interactions/slashCommands/options/string';
+export * from './interactions/slashCommands/options/user';
+//# sourceMappingURL=index.d.ts.map
\ No newline at end of file
diff --git a/node_modules/@discordjs/builders/dist/index.d.ts.map b/node_modules/@discordjs/builders/dist/index.d.ts.map
new file mode 100644
index 0000000..865451b
--- /dev/null
+++ b/node_modules/@discordjs/builders/dist/index.d.ts.map
@@ -0,0 +1 @@
+{"version":3,"file":"index.d.ts","sourceRoot":"/","sources":["index.ts"],"names":[],"mappings":"AAAA,cAAc,uBAAuB,CAAC;AAEtC,OAAO,KAAK,sBAAsB,MAAM,yCAAyC,CAAC;AAClF,cAAc,kDAAkD,CAAC;AACjE,cAAc,sDAAsD,CAAC;AACrE,cAAc,8CAA8C,CAAC;AAC7D,cAAc,8CAA8C,CAAC;AAC7D,cAAc,8CAA8C,CAAC;AAC7D,cAAc,kDAAkD,CAAC;AACjE,cAAc,2CAA2C,CAAC;AAC1D,cAAc,6CAA6C,CAAC;AAC5D,cAAc,2CAA2C,CAAC"}
\ No newline at end of file
diff --git a/node_modules/@discordjs/builders/dist/index.js b/node_modules/@discordjs/builders/dist/index.js
new file mode 100644
index 0000000..fe11988
--- /dev/null
+++ b/node_modules/@discordjs/builders/dist/index.js
@@ -0,0 +1,16 @@
+"use strict";
+Object.defineProperty(exports, "__esModule", { value: true });
+exports.SlashCommandAssertions = void 0;
+const tslib_1 = require("tslib");
+tslib_1.__exportStar(require("./messages/formatters"), exports);
+exports.SlashCommandAssertions = tslib_1.__importStar(require("./interactions/slashCommands/Assertions"));
+tslib_1.__exportStar(require("./interactions/slashCommands/SlashCommandBuilder"), exports);
+tslib_1.__exportStar(require("./interactions/slashCommands/SlashCommandSubcommands"), exports);
+tslib_1.__exportStar(require("./interactions/slashCommands/options/boolean"), exports);
+tslib_1.__exportStar(require("./interactions/slashCommands/options/channel"), exports);
+tslib_1.__exportStar(require("./interactions/slashCommands/options/integer"), exports);
+tslib_1.__exportStar(require("./interactions/slashCommands/options/mentionable"), exports);
+tslib_1.__exportStar(require("./interactions/slashCommands/options/role"), exports);
+tslib_1.__exportStar(require("./interactions/slashCommands/options/string"), exports);
+tslib_1.__exportStar(require("./interactions/slashCommands/options/user"), exports);
+//# sourceMappingURL=index.js.map
\ No newline at end of file
diff --git a/node_modules/@discordjs/builders/dist/index.js.map b/node_modules/@discordjs/builders/dist/index.js.map
new file mode 100644
index 0000000..efbee90
--- /dev/null
+++ b/node_modules/@discordjs/builders/dist/index.js.map
@@ -0,0 +1 @@
+{"version":3,"file":"index.js","sourceRoot":"/","sources":["index.ts"],"names":[],"mappings":";;;;AAAA,gEAAsC;AAEtC,0GAAkF;AAClF,2FAAiE;AACjE,+FAAqE;AACrE,uFAA6D;AAC7D,uFAA6D;AAC7D,uFAA6D;AAC7D,2FAAiE;AACjE,oFAA0D;AAC1D,sFAA4D;AAC5D,oFAA0D","sourcesContent":["export * from './messages/formatters';\n\nexport * as SlashCommandAssertions from './interactions/slashCommands/Assertions';\nexport * from './interactions/slashCommands/SlashCommandBuilder';\nexport * from './interactions/slashCommands/SlashCommandSubcommands';\nexport * from './interactions/slashCommands/options/boolean';\nexport * from './interactions/slashCommands/options/channel';\nexport * from './interactions/slashCommands/options/integer';\nexport * from './interactions/slashCommands/options/mentionable';\nexport * from './interactions/slashCommands/options/role';\nexport * from './interactions/slashCommands/options/string';\nexport * from './interactions/slashCommands/options/user';\n"]}
\ No newline at end of file
diff --git a/node_modules/@discordjs/builders/dist/index.mjs b/node_modules/@discordjs/builders/dist/index.mjs
new file mode 100644
index 0000000..71b2694
--- /dev/null
+++ b/node_modules/@discordjs/builders/dist/index.mjs
@@ -0,0 +1,33 @@
+import mod from "./index.js";
+
+export default mod;
+export const Faces = mod.Faces;
+export const SlashCommandAssertions = mod.SlashCommandAssertions;
+export const SlashCommandBooleanOption = mod.SlashCommandBooleanOption;
+export const SlashCommandBuilder = mod.SlashCommandBuilder;
+export const SlashCommandChannelOption = mod.SlashCommandChannelOption;
+export const SlashCommandIntegerOption = mod.SlashCommandIntegerOption;
+export const SlashCommandMentionableOption = mod.SlashCommandMentionableOption;
+export const SlashCommandRoleOption = mod.SlashCommandRoleOption;
+export const SlashCommandStringOption = mod.SlashCommandStringOption;
+export const SlashCommandSubcommandBuilder = mod.SlashCommandSubcommandBuilder;
+export const SlashCommandSubcommandGroupBuilder = mod.SlashCommandSubcommandGroupBuilder;
+export const SlashCommandUserOption = mod.SlashCommandUserOption;
+export const TimestampStyles = mod.TimestampStyles;
+export const blockQuote = mod.blockQuote;
+export const bold = mod.bold;
+export const channelMention = mod.channelMention;
+export const codeBlock = mod.codeBlock;
+export const formatEmoji = mod.formatEmoji;
+export const hideLinkEmbed = mod.hideLinkEmbed;
+export const hyperlink = mod.hyperlink;
+export const inlineCode = mod.inlineCode;
+export const italic = mod.italic;
+export const memberNicknameMention = mod.memberNicknameMention;
+export const quote = mod.quote;
+export const roleMention = mod.roleMention;
+export const spoiler = mod.spoiler;
+export const strikethrough = mod.strikethrough;
+export const time = mod.time;
+export const underscore = mod.underscore;
+export const userMention = mod.userMention;
diff --git a/node_modules/@discordjs/builders/dist/interactions/slashCommands/Assertions.d.ts b/node_modules/@discordjs/builders/dist/interactions/slashCommands/Assertions.d.ts
new file mode 100644
index 0000000..a4ca912
--- /dev/null
+++ b/node_modules/@discordjs/builders/dist/interactions/slashCommands/Assertions.d.ts
@@ -0,0 +1,11 @@
+import type { APIApplicationCommandOptionChoice } from 'discord-api-types/v9';
+import type { SlashCommandOptionBase } from './mixins/CommandOptionBase';
+import type { ToAPIApplicationCommandOptions } from './SlashCommandBuilder';
+import type { SlashCommandSubcommandBuilder, SlashCommandSubcommandGroupBuilder } from './SlashCommandSubcommands';
+export declare function validateRequiredParameters(name: string, description: string, options: ToAPIApplicationCommandOptions[]): void;
+export declare function validateName(name: unknown): asserts name is string;
+export declare function validateDescription(description: unknown): asserts description is string;
+export declare function validateMaxOptionsLength(options: unknown): asserts options is ToAPIApplicationCommandOptions[];
+export declare function validateMaxChoicesLength(choices: APIApplicationCommandOptionChoice[]): void;
+export declare function assertReturnOfBuilder(input: unknown, ExpectedInstanceOf: new () => T): asserts input is T;
+//# sourceMappingURL=Assertions.d.ts.map
\ No newline at end of file
diff --git a/node_modules/@discordjs/builders/dist/interactions/slashCommands/Assertions.d.ts.map b/node_modules/@discordjs/builders/dist/interactions/slashCommands/Assertions.d.ts.map
new file mode 100644
index 0000000..f27fa12
--- /dev/null
+++ b/node_modules/@discordjs/builders/dist/interactions/slashCommands/Assertions.d.ts.map
@@ -0,0 +1 @@
+{"version":3,"file":"Assertions.d.ts","sourceRoot":"/","sources":["interactions/slashCommands/Assertions.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,iCAAiC,EAAE,MAAM,sBAAsB,CAAC;AAE9E,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,4BAA4B,CAAC;AACzE,OAAO,KAAK,EAAE,8BAA8B,EAAE,MAAM,uBAAuB,CAAC;AAC5E,OAAO,KAAK,EAAE,6BAA6B,EAAE,kCAAkC,EAAE,MAAM,2BAA2B,CAAC;AAEnH,wBAAgB,0BAA0B,CACzC,IAAI,EAAE,MAAM,EACZ,WAAW,EAAE,MAAM,EACnB,OAAO,EAAE,8BAA8B,EAAE,QAUzC;AAUD,wBAAgB,YAAY,CAAC,IAAI,EAAE,OAAO,GAAG,OAAO,CAAC,IAAI,IAAI,MAAM,CAElE;AAID,wBAAgB,mBAAmB,CAAC,WAAW,EAAE,OAAO,GAAG,OAAO,CAAC,WAAW,IAAI,MAAM,CAEvF;AAID,wBAAgB,wBAAwB,CAAC,OAAO,EAAE,OAAO,GAAG,OAAO,CAAC,OAAO,IAAI,8BAA8B,EAAE,CAE9G;AAED,wBAAgB,wBAAwB,CAAC,OAAO,EAAE,iCAAiC,EAAE,QAEpF;AAED,wBAAgB,qBAAqB,CACpC,CAAC,SAAS,sBAAsB,GAAG,6BAA6B,GAAG,kCAAkC,EACpG,KAAK,EAAE,OAAO,EAAE,kBAAkB,EAAE,UAAU,CAAC,GAAG,OAAO,CAAC,KAAK,IAAI,CAAC,CAuBrE"}
\ No newline at end of file
diff --git a/node_modules/@discordjs/builders/dist/interactions/slashCommands/Assertions.js b/node_modules/@discordjs/builders/dist/interactions/slashCommands/Assertions.js
new file mode 100644
index 0000000..887f849
--- /dev/null
+++ b/node_modules/@discordjs/builders/dist/interactions/slashCommands/Assertions.js
@@ -0,0 +1,58 @@
+"use strict";
+Object.defineProperty(exports, "__esModule", { value: true });
+exports.assertReturnOfBuilder = exports.validateMaxChoicesLength = exports.validateMaxOptionsLength = exports.validateDescription = exports.validateName = exports.validateRequiredParameters = void 0;
+const tslib_1 = require("tslib");
+const is_1 = tslib_1.__importDefault(require("@sindresorhus/is"));
+const ow_1 = tslib_1.__importDefault(require("ow"));
+function validateRequiredParameters(name, description, options) {
+ // Assert name matches all conditions
+ validateName(name);
+ // Assert description conditions
+ validateDescription(description);
+ // Assert options conditions
+ validateMaxOptionsLength(options);
+}
+exports.validateRequiredParameters = validateRequiredParameters;
+const namePredicate = ow_1.default.string.lowercase
+ .minLength(1)
+ .maxLength(32)
+ .addValidator({
+ message: (value, label) => `Expected ${label} to match "^[\\p{L}\\p{N}_-]+$", got ${value} instead`,
+ validator: (value) => /^[\p{L}\p{N}_-]+$/u.test(value),
+});
+function validateName(name) {
+ ow_1.default(name, 'name', namePredicate);
+}
+exports.validateName = validateName;
+const descriptionPredicate = ow_1.default.string.minLength(1).maxLength(100);
+function validateDescription(description) {
+ ow_1.default(description, 'description', descriptionPredicate);
+}
+exports.validateDescription = validateDescription;
+const maxArrayLengthPredicate = ow_1.default.array.maxLength(25);
+function validateMaxOptionsLength(options) {
+ ow_1.default(options, 'options', maxArrayLengthPredicate);
+}
+exports.validateMaxOptionsLength = validateMaxOptionsLength;
+function validateMaxChoicesLength(choices) {
+ ow_1.default(choices, 'choices', maxArrayLengthPredicate);
+}
+exports.validateMaxChoicesLength = validateMaxChoicesLength;
+function assertReturnOfBuilder(input, ExpectedInstanceOf) {
+ const instanceName = ExpectedInstanceOf.name;
+ if (is_1.default.nullOrUndefined(input)) {
+ throw new TypeError(`Expected to receive a ${instanceName} builder, got ${input === null ? 'null' : 'undefined'} instead.`);
+ }
+ if (is_1.default.primitive(input)) {
+ throw new TypeError(`Expected to receive a ${instanceName} builder, got a primitive (${typeof input}) instead.`);
+ }
+ if (!(input instanceof ExpectedInstanceOf)) {
+ const casted = input;
+ const constructorName = is_1.default.function_(input) ? input.name : casted.constructor.name;
+ const stringTag = Reflect.get(casted, Symbol.toStringTag);
+ const fullResultName = stringTag ? `${constructorName} [${stringTag}]` : constructorName;
+ throw new TypeError(`Expected to receive a ${instanceName} builder, got ${fullResultName} instead.`);
+ }
+}
+exports.assertReturnOfBuilder = assertReturnOfBuilder;
+//# sourceMappingURL=Assertions.js.map
\ No newline at end of file
diff --git a/node_modules/@discordjs/builders/dist/interactions/slashCommands/Assertions.js.map b/node_modules/@discordjs/builders/dist/interactions/slashCommands/Assertions.js.map
new file mode 100644
index 0000000..fe1441f
--- /dev/null
+++ b/node_modules/@discordjs/builders/dist/interactions/slashCommands/Assertions.js.map
@@ -0,0 +1 @@
+{"version":3,"file":"Assertions.js","sourceRoot":"/","sources":["interactions/slashCommands/Assertions.ts"],"names":[],"mappings":";;;;AAAA,kEAAkC;AAElC,oDAAoB;AAKpB,SAAgB,0BAA0B,CACzC,IAAY,EACZ,WAAmB,EACnB,OAAyC;IAEzC,qCAAqC;IACrC,YAAY,CAAC,IAAI,CAAC,CAAC;IAEnB,gCAAgC;IAChC,mBAAmB,CAAC,WAAW,CAAC,CAAC;IAEjC,4BAA4B;IAC5B,wBAAwB,CAAC,OAAO,CAAC,CAAC;AACnC,CAAC;AAbD,gEAaC;AAED,MAAM,aAAa,GAAG,YAAE,CAAC,MAAM,CAAC,SAAS;KACvC,SAAS,CAAC,CAAC,CAAC;KACZ,SAAS,CAAC,EAAE,CAAC;KACb,YAAY,CAAC;IACb,OAAO,EAAE,CAAC,KAAK,EAAE,KAAK,EAAE,EAAE,CAAC,YAAY,KAAM,wCAAwC,KAAK,UAAU;IACpG,SAAS,EAAE,CAAC,KAAK,EAAE,EAAE,CAAC,oBAAoB,CAAC,IAAI,CAAC,KAAK,CAAC;CACtD,CAAC,CAAC;AAEJ,SAAgB,YAAY,CAAC,IAAa;IACzC,YAAE,CAAC,IAAI,EAAE,MAAM,EAAE,aAAa,CAAC,CAAC;AACjC,CAAC;AAFD,oCAEC;AAED,MAAM,oBAAoB,GAAG,YAAE,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC;AAEnE,SAAgB,mBAAmB,CAAC,WAAoB;IACvD,YAAE,CAAC,WAAW,EAAE,aAAa,EAAE,oBAAoB,CAAC,CAAC;AACtD,CAAC;AAFD,kDAEC;AAED,MAAM,uBAAuB,GAAG,YAAE,CAAC,KAAK,CAAC,SAAS,CAAC,EAAE,CAAC,CAAC;AAEvD,SAAgB,wBAAwB,CAAC,OAAgB;IACxD,YAAE,CAAC,OAAO,EAAE,SAAS,EAAE,uBAAuB,CAAC,CAAC;AACjD,CAAC;AAFD,4DAEC;AAED,SAAgB,wBAAwB,CAAC,OAA4C;IACpF,YAAE,CAAC,OAAO,EAAE,SAAS,EAAE,uBAAuB,CAAC,CAAC;AACjD,CAAC;AAFD,4DAEC;AAED,SAAgB,qBAAqB,CAEnC,KAAc,EAAE,kBAA+B;IAChD,MAAM,YAAY,GAAG,kBAAkB,CAAC,IAAI,CAAC;IAE7C,IAAI,YAAE,CAAC,eAAe,CAAC,KAAK,CAAC,EAAE;QAC9B,MAAM,IAAI,SAAS,CAClB,yBAAyB,YAAY,iBAAiB,KAAK,KAAK,IAAI,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,WAAW,WAAW,CACtG,CAAC;KACF;IAED,IAAI,YAAE,CAAC,SAAS,CAAC,KAAK,CAAC,EAAE;QACxB,MAAM,IAAI,SAAS,CAAC,yBAAyB,YAAY,8BAA8B,OAAO,KAAK,YAAY,CAAC,CAAC;KACjH;IAED,IAAI,CAAC,CAAC,KAAK,YAAY,kBAAkB,CAAC,EAAE;QAC3C,MAAM,MAAM,GAAG,KAAqC,CAAC;QAErD,MAAM,eAAe,GAAG,YAAE,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,MAAM,CAAC,WAAW,CAAC,IAAI,CAAC;QACnF,MAAM,SAAS,GAAG,OAAO,CAAC,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,WAAW,CAAuB,CAAC;QAEhF,MAAM,cAAc,GAAG,SAAS,CAAC,CAAC,CAAC,GAAG,eAAe,KAAK,SAAS,GAAG,CAAC,CAAC,CAAC,eAAe,CAAC;QAEzF,MAAM,IAAI,SAAS,CAAC,yBAAyB,YAAY,iBAAiB,cAAc,WAAW,CAAC,CAAC;KACrG;AACF,CAAC;AAzBD,sDAyBC","sourcesContent":["import is from '@sindresorhus/is';\nimport type { APIApplicationCommandOptionChoice } from 'discord-api-types/v9';\nimport ow from 'ow';\nimport type { SlashCommandOptionBase } from './mixins/CommandOptionBase';\nimport type { ToAPIApplicationCommandOptions } from './SlashCommandBuilder';\nimport type { SlashCommandSubcommandBuilder, SlashCommandSubcommandGroupBuilder } from './SlashCommandSubcommands';\n\nexport function validateRequiredParameters(\n\tname: string,\n\tdescription: string,\n\toptions: ToAPIApplicationCommandOptions[],\n) {\n\t// Assert name matches all conditions\n\tvalidateName(name);\n\n\t// Assert description conditions\n\tvalidateDescription(description);\n\n\t// Assert options conditions\n\tvalidateMaxOptionsLength(options);\n}\n\nconst namePredicate = ow.string.lowercase\n\t.minLength(1)\n\t.maxLength(32)\n\t.addValidator({\n\t\tmessage: (value, label) => `Expected ${label!} to match \"^[\\\\p{L}\\\\p{N}_-]+$\", got ${value} instead`,\n\t\tvalidator: (value) => /^[\\p{L}\\p{N}_-]+$/u.test(value),\n\t});\n\nexport function validateName(name: unknown): asserts name is string {\n\tow(name, 'name', namePredicate);\n}\n\nconst descriptionPredicate = ow.string.minLength(1).maxLength(100);\n\nexport function validateDescription(description: unknown): asserts description is string {\n\tow(description, 'description', descriptionPredicate);\n}\n\nconst maxArrayLengthPredicate = ow.array.maxLength(25);\n\nexport function validateMaxOptionsLength(options: unknown): asserts options is ToAPIApplicationCommandOptions[] {\n\tow(options, 'options', maxArrayLengthPredicate);\n}\n\nexport function validateMaxChoicesLength(choices: APIApplicationCommandOptionChoice[]) {\n\tow(choices, 'choices', maxArrayLengthPredicate);\n}\n\nexport function assertReturnOfBuilder<\n\tT extends SlashCommandOptionBase | SlashCommandSubcommandBuilder | SlashCommandSubcommandGroupBuilder,\n>(input: unknown, ExpectedInstanceOf: new () => T): asserts input is T {\n\tconst instanceName = ExpectedInstanceOf.name;\n\n\tif (is.nullOrUndefined(input)) {\n\t\tthrow new TypeError(\n\t\t\t`Expected to receive a ${instanceName} builder, got ${input === null ? 'null' : 'undefined'} instead.`,\n\t\t);\n\t}\n\n\tif (is.primitive(input)) {\n\t\tthrow new TypeError(`Expected to receive a ${instanceName} builder, got a primitive (${typeof input}) instead.`);\n\t}\n\n\tif (!(input instanceof ExpectedInstanceOf)) {\n\t\tconst casted = input as Record;\n\n\t\tconst constructorName = is.function_(input) ? input.name : casted.constructor.name;\n\t\tconst stringTag = Reflect.get(casted, Symbol.toStringTag) as string | undefined;\n\n\t\tconst fullResultName = stringTag ? `${constructorName} [${stringTag}]` : constructorName;\n\n\t\tthrow new TypeError(`Expected to receive a ${instanceName} builder, got ${fullResultName} instead.`);\n\t}\n}\n"]}
\ No newline at end of file
diff --git a/node_modules/@discordjs/builders/dist/interactions/slashCommands/SlashCommandBuilder.d.ts b/node_modules/@discordjs/builders/dist/interactions/slashCommands/SlashCommandBuilder.d.ts
new file mode 100644
index 0000000..5b0ee56
--- /dev/null
+++ b/node_modules/@discordjs/builders/dist/interactions/slashCommands/SlashCommandBuilder.d.ts
@@ -0,0 +1,50 @@
+import type { APIApplicationCommandOption } from 'discord-api-types/v9';
+import { SharedNameAndDescription } from './mixins/NameAndDescription';
+import { SharedSlashCommandOptions } from './mixins/CommandOptions';
+import { SlashCommandSubcommandBuilder, SlashCommandSubcommandGroupBuilder } from './SlashCommandSubcommands';
+export declare class SlashCommandBuilder {
+ /**
+ * The name of this slash command
+ */
+ readonly name: string;
+ /**
+ * The description of this slash command
+ */
+ readonly description: string;
+ /**
+ * The options of this slash command
+ */
+ readonly options: ToAPIApplicationCommandOptions[];
+ /**
+ * Returns the final data that should be sent to Discord.
+ *
+ * **Note:** Calling this function will validate required properties based on their conditions.
+ */
+ toJSON(): {
+ name: string;
+ description: string;
+ options: APIApplicationCommandOption[];
+ };
+ /**
+ * Adds a new subcommand group to this command
+ * @param input A function that returns a subcommand group builder, or an already built builder
+ */
+ addSubcommandGroup(input: SlashCommandSubcommandGroupBuilder | ((subcommandGroup: SlashCommandSubcommandGroupBuilder) => SlashCommandSubcommandGroupBuilder)): SlashCommandSubcommandGroupsOnlyBuilder;
+ /**
+ * Adds a new subcommand to this command
+ * @param input A function that returns a subcommand builder, or an already built builder
+ */
+ addSubcommand(input: SlashCommandSubcommandBuilder | ((subcommandGroup: SlashCommandSubcommandBuilder) => SlashCommandSubcommandBuilder)): SlashCommandSubcommandsOnlyBuilder;
+}
+export interface SlashCommandBuilder extends SharedNameAndDescription, SharedSlashCommandOptions {
+}
+export interface SlashCommandSubcommandsOnlyBuilder extends SharedNameAndDescription, Pick {
+}
+export interface SlashCommandSubcommandGroupsOnlyBuilder extends SharedNameAndDescription, Pick {
+}
+export interface SlashCommandOptionsOnlyBuilder extends SharedNameAndDescription, SharedSlashCommandOptions, Pick {
+}
+export interface ToAPIApplicationCommandOptions {
+ toJSON(): APIApplicationCommandOption;
+}
+//# sourceMappingURL=SlashCommandBuilder.d.ts.map
\ No newline at end of file
diff --git a/node_modules/@discordjs/builders/dist/interactions/slashCommands/SlashCommandBuilder.d.ts.map b/node_modules/@discordjs/builders/dist/interactions/slashCommands/SlashCommandBuilder.d.ts.map
new file mode 100644
index 0000000..7337097
--- /dev/null
+++ b/node_modules/@discordjs/builders/dist/interactions/slashCommands/SlashCommandBuilder.d.ts.map
@@ -0,0 +1 @@
+{"version":3,"file":"SlashCommandBuilder.d.ts","sourceRoot":"/","sources":["interactions/slashCommands/SlashCommandBuilder.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,2BAA2B,EAAE,MAAM,sBAAsB,CAAC;AAGxE,OAAO,EAAE,wBAAwB,EAAE,MAAM,6BAA6B,CAAC;AACvE,OAAO,EAAE,yBAAyB,EAAE,MAAM,yBAAyB,CAAC;AACpE,OAAO,EAAE,6BAA6B,EAAE,kCAAkC,EAAE,MAAM,2BAA2B,CAAC;AAE9G,qBACa,mBAAmB;IAC/B;;OAEG;IACH,SAAgB,IAAI,EAAE,MAAM,CAAc;IAE1C;;OAEG;IACH,SAAgB,WAAW,EAAE,MAAM,CAAc;IAEjD;;OAEG;IACH,SAAgB,OAAO,EAAE,8BAA8B,EAAE,CAAM;IAE/D;;;;OAIG;IACI,MAAM;;;;;IASb;;;OAGG;IACI,kBAAkB,CACxB,KAAK,EACF,kCAAkC,GAClC,CAAC,CAAC,eAAe,EAAE,kCAAkC,KAAK,kCAAkC,CAAC,GAC9F,uCAAuC;IAqB1C;;;OAGG;IACI,aAAa,CACnB,KAAK,EACF,6BAA6B,GAC7B,CAAC,CAAC,eAAe,EAAE,6BAA6B,KAAK,6BAA6B,CAAC,GACpF,kCAAkC;CAqBrC;AAED,MAAM,WAAW,mBAAoB,SAAQ,wBAAwB,EAAE,yBAAyB;CAAG;AAEnG,MAAM,WAAW,kCAChB,SAAQ,wBAAwB,EAC/B,IAAI,CAAC,mBAAmB,EAAE,QAAQ,GAAG,eAAe,CAAC;CAAG;AAE1D,MAAM,WAAW,uCAChB,SAAQ,wBAAwB,EAC/B,IAAI,CAAC,mBAAmB,EAAE,QAAQ,GAAG,oBAAoB,CAAC;CAAG;AAE/D,MAAM,WAAW,8BAChB,SAAQ,wBAAwB,EAC/B,yBAAyB,EACzB,IAAI,CAAC,mBAAmB,EAAE,QAAQ,CAAC;CAAG;AAExC,MAAM,WAAW,8BAA8B;IAC9C,MAAM,IAAI,2BAA2B,CAAC;CACtC"}
\ No newline at end of file
diff --git a/node_modules/@discordjs/builders/dist/interactions/slashCommands/SlashCommandBuilder.js b/node_modules/@discordjs/builders/dist/interactions/slashCommands/SlashCommandBuilder.js
new file mode 100644
index 0000000..ddaad91
--- /dev/null
+++ b/node_modules/@discordjs/builders/dist/interactions/slashCommands/SlashCommandBuilder.js
@@ -0,0 +1,96 @@
+"use strict";
+Object.defineProperty(exports, "__esModule", { value: true });
+exports.SlashCommandBuilder = void 0;
+const tslib_1 = require("tslib");
+const ts_mixer_1 = require("ts-mixer");
+const Assertions_1 = require("./Assertions");
+const NameAndDescription_1 = require("./mixins/NameAndDescription");
+const CommandOptions_1 = require("./mixins/CommandOptions");
+const SlashCommandSubcommands_1 = require("./SlashCommandSubcommands");
+let SlashCommandBuilder = class SlashCommandBuilder {
+ constructor() {
+ /**
+ * The name of this slash command
+ */
+ Object.defineProperty(this, "name", {
+ enumerable: true,
+ configurable: true,
+ writable: true,
+ value: undefined
+ });
+ /**
+ * The description of this slash command
+ */
+ Object.defineProperty(this, "description", {
+ enumerable: true,
+ configurable: true,
+ writable: true,
+ value: undefined
+ });
+ /**
+ * The options of this slash command
+ */
+ Object.defineProperty(this, "options", {
+ enumerable: true,
+ configurable: true,
+ writable: true,
+ value: []
+ });
+ }
+ /**
+ * Returns the final data that should be sent to Discord.
+ *
+ * **Note:** Calling this function will validate required properties based on their conditions.
+ */
+ toJSON() {
+ Assertions_1.validateRequiredParameters(this.name, this.description, this.options);
+ return {
+ name: this.name,
+ description: this.description,
+ options: this.options.map((option) => option.toJSON()),
+ };
+ }
+ /**
+ * Adds a new subcommand group to this command
+ * @param input A function that returns a subcommand group builder, or an already built builder
+ */
+ addSubcommandGroup(input) {
+ const { options } = this;
+ // First, assert options conditions - we cannot have more than 25 options
+ Assertions_1.validateMaxOptionsLength(options);
+ // Make sure there is no subcommand at the root level - if there is, throw
+ const hasSubcommands = options.some((item) => item instanceof SlashCommandSubcommands_1.SlashCommandSubcommandBuilder);
+ if (hasSubcommands)
+ throw new RangeError(`You cannot mix subcommands and subcommand groups at the root level.`);
+ // Get the final result
+ const result = typeof input === 'function' ? input(new SlashCommandSubcommands_1.SlashCommandSubcommandGroupBuilder()) : input;
+ Assertions_1.assertReturnOfBuilder(result, SlashCommandSubcommands_1.SlashCommandSubcommandGroupBuilder);
+ // Push it
+ options.push(result);
+ return this;
+ }
+ /**
+ * Adds a new subcommand to this command
+ * @param input A function that returns a subcommand builder, or an already built builder
+ */
+ addSubcommand(input) {
+ const { options } = this;
+ // First, assert options conditions - we cannot have more than 25 options
+ Assertions_1.validateMaxOptionsLength(options);
+ // Make sure there is no subcommand at the root level - if there is, throw
+ const hasSubcommandGroups = options.some((item) => item instanceof SlashCommandSubcommands_1.SlashCommandSubcommandGroupBuilder);
+ if (hasSubcommandGroups)
+ throw new RangeError(`You cannot mix subcommands and subcommand groups at the root level.`);
+ // Get the final result
+ const result = typeof input === 'function' ? input(new SlashCommandSubcommands_1.SlashCommandSubcommandBuilder()) : input;
+ Assertions_1.assertReturnOfBuilder(result, SlashCommandSubcommands_1.SlashCommandSubcommandBuilder);
+ // Push it
+ options.push(result);
+ return this;
+ }
+};
+SlashCommandBuilder = tslib_1.__decorate([
+ ts_mixer_1.mix(CommandOptions_1.SharedSlashCommandOptions, NameAndDescription_1.SharedNameAndDescription)
+], SlashCommandBuilder);
+exports.SlashCommandBuilder = SlashCommandBuilder;
+//# sourceMappingURL=SlashCommandBuilder.js.map
\ No newline at end of file
diff --git a/node_modules/@discordjs/builders/dist/interactions/slashCommands/SlashCommandBuilder.js.map b/node_modules/@discordjs/builders/dist/interactions/slashCommands/SlashCommandBuilder.js.map
new file mode 100644
index 0000000..5c271ff
--- /dev/null
+++ b/node_modules/@discordjs/builders/dist/interactions/slashCommands/SlashCommandBuilder.js.map
@@ -0,0 +1 @@
+{"version":3,"file":"SlashCommandBuilder.js","sourceRoot":"/","sources":["interactions/slashCommands/SlashCommandBuilder.ts"],"names":[],"mappings":";;;;AACA,uCAA+B;AAC/B,6CAA2G;AAC3G,oEAAuE;AACvE,4DAAoE;AACpE,uEAA8G;AAG9G,IAAa,mBAAmB,GAAhC,MAAa,mBAAmB;IAAhC;QACC;;WAEG;QACH;;;;mBAA+B,SAAU;WAAC;QAE1C;;WAEG;QACH;;;;mBAAsC,SAAU;WAAC;QAEjD;;WAEG;QACH;;;;mBAA4D,EAAE;WAAC;IA0EhE,CAAC;IAxEA;;;;OAIG;IACI,MAAM;QACZ,uCAA0B,CAAC,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC,WAAW,EAAE,IAAI,CAAC,OAAO,CAAC,CAAC;QACtE,OAAO;YACN,IAAI,EAAE,IAAI,CAAC,IAAI;YACf,WAAW,EAAE,IAAI,CAAC,WAAW;YAC7B,OAAO,EAAE,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,CAAC,MAAM,EAAE,CAAC;SACtD,CAAC;IACH,CAAC;IAED;;;OAGG;IACI,kBAAkB,CACxB,KAEgG;QAEhG,MAAM,EAAE,OAAO,EAAE,GAAG,IAAI,CAAC;QAEzB,yEAAyE;QACzE,qCAAwB,CAAC,OAAO,CAAC,CAAC;QAElC,0EAA0E;QAC1E,MAAM,cAAc,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,YAAY,uDAA6B,CAAC,CAAC;QAC7F,IAAI,cAAc;YAAE,MAAM,IAAI,UAAU,CAAC,qEAAqE,CAAC,CAAC;QAEhH,uBAAuB;QACvB,MAAM,MAAM,GAAG,OAAO,KAAK,KAAK,UAAU,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI,4DAAkC,EAAE,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC;QAErG,kCAAqB,CAAC,MAAM,EAAE,4DAAkC,CAAC,CAAC;QAElE,UAAU;QACV,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;QAErB,OAAO,IAAI,CAAC;IACb,CAAC;IAED;;;OAGG;IACI,aAAa,CACnB,KAEsF;QAEtF,MAAM,EAAE,OAAO,EAAE,GAAG,IAAI,CAAC;QAEzB,yEAAyE;QACzE,qCAAwB,CAAC,OAAO,CAAC,CAAC;QAElC,0EAA0E;QAC1E,MAAM,mBAAmB,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,YAAY,4DAAkC,CAAC,CAAC;QACvG,IAAI,mBAAmB;YACtB,MAAM,IAAI,UAAU,CAAC,qEAAqE,CAAC,CAAC;QAE7F,uBAAuB;QACvB,MAAM,MAAM,GAAG,OAAO,KAAK,KAAK,UAAU,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI,uDAA6B,EAAE,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC;QAEhG,kCAAqB,CAAC,MAAM,EAAE,uDAA6B,CAAC,CAAC;QAE7D,UAAU;QACV,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;QAErB,OAAO,IAAI,CAAC;IACb,CAAC;CACD,CAAA;AAxFY,mBAAmB;IAD/B,cAAG,CAAC,0CAAyB,EAAE,6CAAwB,CAAC;GAC5C,mBAAmB,CAwF/B;AAxFY,kDAAmB","sourcesContent":["import type { APIApplicationCommandOption } from 'discord-api-types/v9';\nimport { mix } from 'ts-mixer';\nimport { assertReturnOfBuilder, validateMaxOptionsLength, validateRequiredParameters } from './Assertions';\nimport { SharedNameAndDescription } from './mixins/NameAndDescription';\nimport { SharedSlashCommandOptions } from './mixins/CommandOptions';\nimport { SlashCommandSubcommandBuilder, SlashCommandSubcommandGroupBuilder } from './SlashCommandSubcommands';\n\n@mix(SharedSlashCommandOptions, SharedNameAndDescription)\nexport class SlashCommandBuilder {\n\t/**\n\t * The name of this slash command\n\t */\n\tpublic readonly name: string = undefined!;\n\n\t/**\n\t * The description of this slash command\n\t */\n\tpublic readonly description: string = undefined!;\n\n\t/**\n\t * The options of this slash command\n\t */\n\tpublic readonly options: ToAPIApplicationCommandOptions[] = [];\n\n\t/**\n\t * Returns the final data that should be sent to Discord.\n\t *\n\t * **Note:** Calling this function will validate required properties based on their conditions.\n\t */\n\tpublic toJSON() {\n\t\tvalidateRequiredParameters(this.name, this.description, this.options);\n\t\treturn {\n\t\t\tname: this.name,\n\t\t\tdescription: this.description,\n\t\t\toptions: this.options.map((option) => option.toJSON()),\n\t\t};\n\t}\n\n\t/**\n\t * Adds a new subcommand group to this command\n\t * @param input A function that returns a subcommand group builder, or an already built builder\n\t */\n\tpublic addSubcommandGroup(\n\t\tinput:\n\t\t\t| SlashCommandSubcommandGroupBuilder\n\t\t\t| ((subcommandGroup: SlashCommandSubcommandGroupBuilder) => SlashCommandSubcommandGroupBuilder),\n\t): SlashCommandSubcommandGroupsOnlyBuilder {\n\t\tconst { options } = this;\n\n\t\t// First, assert options conditions - we cannot have more than 25 options\n\t\tvalidateMaxOptionsLength(options);\n\n\t\t// Make sure there is no subcommand at the root level - if there is, throw\n\t\tconst hasSubcommands = options.some((item) => item instanceof SlashCommandSubcommandBuilder);\n\t\tif (hasSubcommands) throw new RangeError(`You cannot mix subcommands and subcommand groups at the root level.`);\n\n\t\t// Get the final result\n\t\tconst result = typeof input === 'function' ? input(new SlashCommandSubcommandGroupBuilder()) : input;\n\n\t\tassertReturnOfBuilder(result, SlashCommandSubcommandGroupBuilder);\n\n\t\t// Push it\n\t\toptions.push(result);\n\n\t\treturn this;\n\t}\n\n\t/**\n\t * Adds a new subcommand to this command\n\t * @param input A function that returns a subcommand builder, or an already built builder\n\t */\n\tpublic addSubcommand(\n\t\tinput:\n\t\t\t| SlashCommandSubcommandBuilder\n\t\t\t| ((subcommandGroup: SlashCommandSubcommandBuilder) => SlashCommandSubcommandBuilder),\n\t): SlashCommandSubcommandsOnlyBuilder {\n\t\tconst { options } = this;\n\n\t\t// First, assert options conditions - we cannot have more than 25 options\n\t\tvalidateMaxOptionsLength(options);\n\n\t\t// Make sure there is no subcommand at the root level - if there is, throw\n\t\tconst hasSubcommandGroups = options.some((item) => item instanceof SlashCommandSubcommandGroupBuilder);\n\t\tif (hasSubcommandGroups)\n\t\t\tthrow new RangeError(`You cannot mix subcommands and subcommand groups at the root level.`);\n\n\t\t// Get the final result\n\t\tconst result = typeof input === 'function' ? input(new SlashCommandSubcommandBuilder()) : input;\n\n\t\tassertReturnOfBuilder(result, SlashCommandSubcommandBuilder);\n\n\t\t// Push it\n\t\toptions.push(result);\n\n\t\treturn this;\n\t}\n}\n\nexport interface SlashCommandBuilder extends SharedNameAndDescription, SharedSlashCommandOptions {}\n\nexport interface SlashCommandSubcommandsOnlyBuilder\n\textends SharedNameAndDescription,\n\t\tPick {}\n\nexport interface SlashCommandSubcommandGroupsOnlyBuilder\n\textends SharedNameAndDescription,\n\t\tPick {}\n\nexport interface SlashCommandOptionsOnlyBuilder\n\textends SharedNameAndDescription,\n\t\tSharedSlashCommandOptions,\n\t\tPick {}\n\nexport interface ToAPIApplicationCommandOptions {\n\ttoJSON(): APIApplicationCommandOption;\n}\n"]}
\ No newline at end of file
diff --git a/node_modules/@discordjs/builders/dist/interactions/slashCommands/SlashCommandSubcommands.d.ts b/node_modules/@discordjs/builders/dist/interactions/slashCommands/SlashCommandSubcommands.d.ts
new file mode 100644
index 0000000..dff28bb
--- /dev/null
+++ b/node_modules/@discordjs/builders/dist/interactions/slashCommands/SlashCommandSubcommands.d.ts
@@ -0,0 +1,64 @@
+import { ApplicationCommandOptionType } from 'discord-api-types/v9';
+import { SharedSlashCommandOptions } from './mixins/CommandOptions';
+import { SharedNameAndDescription } from './mixins/NameAndDescription';
+import type { ToAPIApplicationCommandOptions } from './SlashCommandBuilder';
+/**
+ * Represents a folder for subcommands
+ *
+ * For more information, go to https://discord.com/developers/docs/interactions/slash-commands#subcommands-and-subcommand-groups
+ */
+export declare class SlashCommandSubcommandGroupBuilder implements ToAPIApplicationCommandOptions {
+ /**
+ * The name of this subcommand group
+ */
+ readonly name: string;
+ /**
+ * The description of this subcommand group
+ */
+ readonly description: string;
+ /**
+ * The subcommands part of this subcommand group
+ */
+ readonly options: ToAPIApplicationCommandOptions[];
+ /**
+ * Adds a new subcommand to this group
+ * @param input A function that returns a subcommand builder, or an already built builder
+ */
+ addSubcommand(input: SlashCommandSubcommandBuilder | ((subcommandGroup: SlashCommandSubcommandBuilder) => SlashCommandSubcommandBuilder)): this;
+ toJSON(): {
+ type: ApplicationCommandOptionType;
+ name: string;
+ description: string;
+ options: import("discord-api-types/v9").APIApplicationCommandOption[];
+ };
+}
+export interface SlashCommandSubcommandGroupBuilder extends SharedNameAndDescription {
+}
+/**
+ * Represents a subcommand
+ *
+ * For more information, go to https://discord.com/developers/docs/interactions/slash-commands#subcommands-and-subcommand-groups
+ */
+export declare class SlashCommandSubcommandBuilder implements ToAPIApplicationCommandOptions {
+ /**
+ * The name of this subcommand
+ */
+ readonly name: string;
+ /**
+ * The description of this subcommand
+ */
+ readonly description: string;
+ /**
+ * The options of this subcommand
+ */
+ readonly options: ToAPIApplicationCommandOptions[];
+ toJSON(): {
+ type: ApplicationCommandOptionType;
+ name: string;
+ description: string;
+ options: import("discord-api-types/v9").APIApplicationCommandOption[];
+ };
+}
+export interface SlashCommandSubcommandBuilder extends SharedNameAndDescription, SharedSlashCommandOptions {
+}
+//# sourceMappingURL=SlashCommandSubcommands.d.ts.map
\ No newline at end of file
diff --git a/node_modules/@discordjs/builders/dist/interactions/slashCommands/SlashCommandSubcommands.d.ts.map b/node_modules/@discordjs/builders/dist/interactions/slashCommands/SlashCommandSubcommands.d.ts.map
new file mode 100644
index 0000000..bdc2bb9
--- /dev/null
+++ b/node_modules/@discordjs/builders/dist/interactions/slashCommands/SlashCommandSubcommands.d.ts.map
@@ -0,0 +1 @@
+{"version":3,"file":"SlashCommandSubcommands.d.ts","sourceRoot":"/","sources":["interactions/slashCommands/SlashCommandSubcommands.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,4BAA4B,EAAE,MAAM,sBAAsB,CAAC;AAGpE,OAAO,EAAE,yBAAyB,EAAE,MAAM,yBAAyB,CAAC;AACpE,OAAO,EAAE,wBAAwB,EAAE,MAAM,6BAA6B,CAAC;AACvE,OAAO,KAAK,EAAE,8BAA8B,EAAE,MAAM,uBAAuB,CAAC;AAE5E;;;;GAIG;AACH,qBACa,kCAAmC,YAAW,8BAA8B;IACxF;;OAEG;IACH,SAAgB,IAAI,EAAE,MAAM,CAAc;IAE1C;;OAEG;IACH,SAAgB,WAAW,EAAE,MAAM,CAAc;IAEjD;;OAEG;IACH,SAAgB,OAAO,EAAE,8BAA8B,EAAE,CAAM;IAE/D;;;OAGG;IACI,aAAa,CACnB,KAAK,EACF,6BAA6B,GAC7B,CAAC,CAAC,eAAe,EAAE,6BAA6B,KAAK,6BAA6B,CAAC;IAkBhF,MAAM;;;;;;CASb;AAED,MAAM,WAAW,kCAAmC,SAAQ,wBAAwB;CAAG;AAEvF;;;;GAIG;AACH,qBACa,6BAA8B,YAAW,8BAA8B;IACnF;;OAEG;IACH,SAAgB,IAAI,EAAE,MAAM,CAAc;IAE1C;;OAEG;IACH,SAAgB,WAAW,EAAE,MAAM,CAAc;IAEjD;;OAEG;IACH,SAAgB,OAAO,EAAE,8BAA8B,EAAE,CAAM;IAExD,MAAM;;;;;;CASb;AAED,MAAM,WAAW,6BAA8B,SAAQ,wBAAwB,EAAE,yBAAyB,CAAC,KAAK,CAAC;CAAG"}
\ No newline at end of file
diff --git a/node_modules/@discordjs/builders/dist/interactions/slashCommands/SlashCommandSubcommands.js b/node_modules/@discordjs/builders/dist/interactions/slashCommands/SlashCommandSubcommands.js
new file mode 100644
index 0000000..0bbb917
--- /dev/null
+++ b/node_modules/@discordjs/builders/dist/interactions/slashCommands/SlashCommandSubcommands.js
@@ -0,0 +1,123 @@
+"use strict";
+Object.defineProperty(exports, "__esModule", { value: true });
+exports.SlashCommandSubcommandBuilder = exports.SlashCommandSubcommandGroupBuilder = void 0;
+const tslib_1 = require("tslib");
+require("discord-api-types/v9");
+const ts_mixer_1 = require("ts-mixer");
+const Assertions_1 = require("./Assertions");
+const CommandOptions_1 = require("./mixins/CommandOptions");
+const NameAndDescription_1 = require("./mixins/NameAndDescription");
+/**
+ * Represents a folder for subcommands
+ *
+ * For more information, go to https://discord.com/developers/docs/interactions/slash-commands#subcommands-and-subcommand-groups
+ */
+let SlashCommandSubcommandGroupBuilder = class SlashCommandSubcommandGroupBuilder {
+ constructor() {
+ /**
+ * The name of this subcommand group
+ */
+ Object.defineProperty(this, "name", {
+ enumerable: true,
+ configurable: true,
+ writable: true,
+ value: undefined
+ });
+ /**
+ * The description of this subcommand group
+ */
+ Object.defineProperty(this, "description", {
+ enumerable: true,
+ configurable: true,
+ writable: true,
+ value: undefined
+ });
+ /**
+ * The subcommands part of this subcommand group
+ */
+ Object.defineProperty(this, "options", {
+ enumerable: true,
+ configurable: true,
+ writable: true,
+ value: []
+ });
+ }
+ /**
+ * Adds a new subcommand to this group
+ * @param input A function that returns a subcommand builder, or an already built builder
+ */
+ addSubcommand(input) {
+ const { options } = this;
+ // First, assert options conditions - we cannot have more than 25 options
+ Assertions_1.validateMaxOptionsLength(options);
+ // Get the final result
+ const result = typeof input === 'function' ? input(new SlashCommandSubcommandBuilder()) : input;
+ Assertions_1.assertReturnOfBuilder(result, SlashCommandSubcommandBuilder);
+ // Push it
+ options.push(result);
+ return this;
+ }
+ toJSON() {
+ Assertions_1.validateRequiredParameters(this.name, this.description, this.options);
+ return {
+ type: 2 /* SubcommandGroup */,
+ name: this.name,
+ description: this.description,
+ options: this.options.map((option) => option.toJSON()),
+ };
+ }
+};
+SlashCommandSubcommandGroupBuilder = tslib_1.__decorate([
+ ts_mixer_1.mix(NameAndDescription_1.SharedNameAndDescription)
+], SlashCommandSubcommandGroupBuilder);
+exports.SlashCommandSubcommandGroupBuilder = SlashCommandSubcommandGroupBuilder;
+/**
+ * Represents a subcommand
+ *
+ * For more information, go to https://discord.com/developers/docs/interactions/slash-commands#subcommands-and-subcommand-groups
+ */
+let SlashCommandSubcommandBuilder = class SlashCommandSubcommandBuilder {
+ constructor() {
+ /**
+ * The name of this subcommand
+ */
+ Object.defineProperty(this, "name", {
+ enumerable: true,
+ configurable: true,
+ writable: true,
+ value: undefined
+ });
+ /**
+ * The description of this subcommand
+ */
+ Object.defineProperty(this, "description", {
+ enumerable: true,
+ configurable: true,
+ writable: true,
+ value: undefined
+ });
+ /**
+ * The options of this subcommand
+ */
+ Object.defineProperty(this, "options", {
+ enumerable: true,
+ configurable: true,
+ writable: true,
+ value: []
+ });
+ }
+ toJSON() {
+ Assertions_1.validateRequiredParameters(this.name, this.description, this.options);
+ return {
+ type: 1 /* Subcommand */,
+ name: this.name,
+ description: this.description,
+ options: this.options.map((option) => option.toJSON()),
+ };
+ }
+};
+SlashCommandSubcommandBuilder = tslib_1.__decorate([
+ ts_mixer_1.mix(NameAndDescription_1.SharedNameAndDescription, CommandOptions_1.SharedSlashCommandOptions)
+], SlashCommandSubcommandBuilder);
+exports.SlashCommandSubcommandBuilder = SlashCommandSubcommandBuilder;
+//# sourceMappingURL=SlashCommandSubcommands.js.map
\ No newline at end of file
diff --git a/node_modules/@discordjs/builders/dist/interactions/slashCommands/SlashCommandSubcommands.js.map b/node_modules/@discordjs/builders/dist/interactions/slashCommands/SlashCommandSubcommands.js.map
new file mode 100644
index 0000000..223a108
--- /dev/null
+++ b/node_modules/@discordjs/builders/dist/interactions/slashCommands/SlashCommandSubcommands.js.map
@@ -0,0 +1 @@
+{"version":3,"file":"SlashCommandSubcommands.js","sourceRoot":"/","sources":["interactions/slashCommands/SlashCommandSubcommands.ts"],"names":[],"mappings":";;;;AAAA,gCAAoE;AACpE,uCAA+B;AAC/B,6CAA2G;AAC3G,4DAAoE;AACpE,oEAAuE;AAGvE;;;;GAIG;AAEH,IAAa,kCAAkC,GAA/C,MAAa,kCAAkC;IAA/C;QACC;;WAEG;QACH;;;;mBAA+B,SAAU;WAAC;QAE1C;;WAEG;QACH;;;;mBAAsC,SAAU;WAAC;QAEjD;;WAEG;QACH;;;;mBAA4D,EAAE;WAAC;IAoChE,CAAC;IAlCA;;;OAGG;IACI,aAAa,CACnB,KAEsF;QAEtF,MAAM,EAAE,OAAO,EAAE,GAAG,IAAI,CAAC;QAEzB,yEAAyE;QACzE,qCAAwB,CAAC,OAAO,CAAC,CAAC;QAElC,uBAAuB;QACvB,MAAM,MAAM,GAAG,OAAO,KAAK,KAAK,UAAU,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI,6BAA6B,EAAE,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC;QAEhG,kCAAqB,CAAC,MAAM,EAAE,6BAA6B,CAAC,CAAC;QAE7D,UAAU;QACV,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;QAErB,OAAO,IAAI,CAAC;IACb,CAAC;IAEM,MAAM;QACZ,uCAA0B,CAAC,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC,WAAW,EAAE,IAAI,CAAC,OAAO,CAAC,CAAC;QACtE,OAAO;YACN,IAAI,yBAA8C;YAClD,IAAI,EAAE,IAAI,CAAC,IAAI;YACf,WAAW,EAAE,IAAI,CAAC,WAAW;YAC7B,OAAO,EAAE,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,CAAC,MAAM,EAAE,CAAC;SACtD,CAAC;IACH,CAAC;CACD,CAAA;AAlDY,kCAAkC;IAD9C,cAAG,CAAC,6CAAwB,CAAC;GACjB,kCAAkC,CAkD9C;AAlDY,gFAAkC;AAsD/C;;;;GAIG;AAEH,IAAa,6BAA6B,GAA1C,MAAa,6BAA6B;IAA1C;QACC;;WAEG;QACH;;;;mBAA+B,SAAU;WAAC;QAE1C;;WAEG;QACH;;;;mBAAsC,SAAU;WAAC;QAEjD;;WAEG;QACH;;;;mBAA4D,EAAE;WAAC;IAWhE,CAAC;IATO,MAAM;QACZ,uCAA0B,CAAC,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC,WAAW,EAAE,IAAI,CAAC,OAAO,CAAC,CAAC;QACtE,OAAO;YACN,IAAI,oBAAyC;YAC7C,IAAI,EAAE,IAAI,CAAC,IAAI;YACf,WAAW,EAAE,IAAI,CAAC,WAAW;YAC7B,OAAO,EAAE,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,CAAC,MAAM,EAAE,CAAC;SACtD,CAAC;IACH,CAAC;CACD,CAAA;AAzBY,6BAA6B;IADzC,cAAG,CAAC,6CAAwB,EAAE,0CAAyB,CAAC;GAC5C,6BAA6B,CAyBzC;AAzBY,sEAA6B","sourcesContent":["import { ApplicationCommandOptionType } from 'discord-api-types/v9';\nimport { mix } from 'ts-mixer';\nimport { assertReturnOfBuilder, validateMaxOptionsLength, validateRequiredParameters } from './Assertions';\nimport { SharedSlashCommandOptions } from './mixins/CommandOptions';\nimport { SharedNameAndDescription } from './mixins/NameAndDescription';\nimport type { ToAPIApplicationCommandOptions } from './SlashCommandBuilder';\n\n/**\n * Represents a folder for subcommands\n *\n * For more information, go to https://discord.com/developers/docs/interactions/slash-commands#subcommands-and-subcommand-groups\n */\n@mix(SharedNameAndDescription)\nexport class SlashCommandSubcommandGroupBuilder implements ToAPIApplicationCommandOptions {\n\t/**\n\t * The name of this subcommand group\n\t */\n\tpublic readonly name: string = undefined!;\n\n\t/**\n\t * The description of this subcommand group\n\t */\n\tpublic readonly description: string = undefined!;\n\n\t/**\n\t * The subcommands part of this subcommand group\n\t */\n\tpublic readonly options: ToAPIApplicationCommandOptions[] = [];\n\n\t/**\n\t * Adds a new subcommand to this group\n\t * @param input A function that returns a subcommand builder, or an already built builder\n\t */\n\tpublic addSubcommand(\n\t\tinput:\n\t\t\t| SlashCommandSubcommandBuilder\n\t\t\t| ((subcommandGroup: SlashCommandSubcommandBuilder) => SlashCommandSubcommandBuilder),\n\t) {\n\t\tconst { options } = this;\n\n\t\t// First, assert options conditions - we cannot have more than 25 options\n\t\tvalidateMaxOptionsLength(options);\n\n\t\t// Get the final result\n\t\tconst result = typeof input === 'function' ? input(new SlashCommandSubcommandBuilder()) : input;\n\n\t\tassertReturnOfBuilder(result, SlashCommandSubcommandBuilder);\n\n\t\t// Push it\n\t\toptions.push(result);\n\n\t\treturn this;\n\t}\n\n\tpublic toJSON() {\n\t\tvalidateRequiredParameters(this.name, this.description, this.options);\n\t\treturn {\n\t\t\ttype: ApplicationCommandOptionType.SubcommandGroup,\n\t\t\tname: this.name,\n\t\t\tdescription: this.description,\n\t\t\toptions: this.options.map((option) => option.toJSON()),\n\t\t};\n\t}\n}\n\nexport interface SlashCommandSubcommandGroupBuilder extends SharedNameAndDescription {}\n\n/**\n * Represents a subcommand\n *\n * For more information, go to https://discord.com/developers/docs/interactions/slash-commands#subcommands-and-subcommand-groups\n */\n@mix(SharedNameAndDescription, SharedSlashCommandOptions)\nexport class SlashCommandSubcommandBuilder implements ToAPIApplicationCommandOptions {\n\t/**\n\t * The name of this subcommand\n\t */\n\tpublic readonly name: string = undefined!;\n\n\t/**\n\t * The description of this subcommand\n\t */\n\tpublic readonly description: string = undefined!;\n\n\t/**\n\t * The options of this subcommand\n\t */\n\tpublic readonly options: ToAPIApplicationCommandOptions[] = [];\n\n\tpublic toJSON() {\n\t\tvalidateRequiredParameters(this.name, this.description, this.options);\n\t\treturn {\n\t\t\ttype: ApplicationCommandOptionType.Subcommand,\n\t\t\tname: this.name,\n\t\t\tdescription: this.description,\n\t\t\toptions: this.options.map((option) => option.toJSON()),\n\t\t};\n\t}\n}\n\nexport interface SlashCommandSubcommandBuilder extends SharedNameAndDescription, SharedSlashCommandOptions {}\n"]}
\ No newline at end of file
diff --git a/node_modules/@discordjs/builders/dist/interactions/slashCommands/mixins/CommandOptionBase.d.ts b/node_modules/@discordjs/builders/dist/interactions/slashCommands/mixins/CommandOptionBase.d.ts
new file mode 100644
index 0000000..605d794
--- /dev/null
+++ b/node_modules/@discordjs/builders/dist/interactions/slashCommands/mixins/CommandOptionBase.d.ts
@@ -0,0 +1,20 @@
+import type { ApplicationCommandOptionType } from 'discord-api-types/v9';
+import type { ToAPIApplicationCommandOptions } from '../SlashCommandBuilder';
+import { SharedNameAndDescription } from './NameAndDescription';
+export declare class SlashCommandOptionBase extends SharedNameAndDescription implements ToAPIApplicationCommandOptions {
+ required: boolean;
+ readonly type: ApplicationCommandOptionType;
+ constructor(type: ApplicationCommandOptionType);
+ /**
+ * Marks the option as required
+ * @param required If this option should be required
+ */
+ setRequired(required: boolean): this;
+ toJSON(): {
+ type: ApplicationCommandOptionType;
+ name: string;
+ description: string;
+ required: boolean;
+ };
+}
+//# sourceMappingURL=CommandOptionBase.d.ts.map
\ No newline at end of file
diff --git a/node_modules/@discordjs/builders/dist/interactions/slashCommands/mixins/CommandOptionBase.d.ts.map b/node_modules/@discordjs/builders/dist/interactions/slashCommands/mixins/CommandOptionBase.d.ts.map
new file mode 100644
index 0000000..2df4534
--- /dev/null
+++ b/node_modules/@discordjs/builders/dist/interactions/slashCommands/mixins/CommandOptionBase.d.ts.map
@@ -0,0 +1 @@
+{"version":3,"file":"CommandOptionBase.d.ts","sourceRoot":"/","sources":["interactions/slashCommands/mixins/CommandOptionBase.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,4BAA4B,EAAE,MAAM,sBAAsB,CAAC;AAGzE,OAAO,KAAK,EAAE,8BAA8B,EAAE,MAAM,wBAAwB,CAAC;AAC7E,OAAO,EAAE,wBAAwB,EAAE,MAAM,sBAAsB,CAAC;AAEhE,qBAAa,sBAAuB,SAAQ,wBAAyB,YAAW,8BAA8B;IACtG,QAAQ,UAAS;IACxB,SAAgB,IAAI,EAAE,4BAA4B,CAAC;gBAEhC,IAAI,EAAE,4BAA4B;IAKrD;;;OAGG;IACI,WAAW,CAAC,QAAQ,EAAE,OAAO;IAS7B,MAAM;;;;;;CAab"}
\ No newline at end of file
diff --git a/node_modules/@discordjs/builders/dist/interactions/slashCommands/mixins/CommandOptionBase.js b/node_modules/@discordjs/builders/dist/interactions/slashCommands/mixins/CommandOptionBase.js
new file mode 100644
index 0000000..0faefa5
--- /dev/null
+++ b/node_modules/@discordjs/builders/dist/interactions/slashCommands/mixins/CommandOptionBase.js
@@ -0,0 +1,48 @@
+"use strict";
+Object.defineProperty(exports, "__esModule", { value: true });
+exports.SlashCommandOptionBase = void 0;
+const tslib_1 = require("tslib");
+const ow_1 = tslib_1.__importDefault(require("ow"));
+const Assertions_1 = require("../Assertions");
+const NameAndDescription_1 = require("./NameAndDescription");
+class SlashCommandOptionBase extends NameAndDescription_1.SharedNameAndDescription {
+ constructor(type) {
+ super();
+ Object.defineProperty(this, "required", {
+ enumerable: true,
+ configurable: true,
+ writable: true,
+ value: false
+ });
+ Object.defineProperty(this, "type", {
+ enumerable: true,
+ configurable: true,
+ writable: true,
+ value: void 0
+ });
+ this.type = type;
+ }
+ /**
+ * Marks the option as required
+ * @param required If this option should be required
+ */
+ setRequired(required) {
+ // Assert that you actually passed a boolean
+ ow_1.default(required, 'required', ow_1.default.boolean);
+ this.required = required;
+ return this;
+ }
+ toJSON() {
+ Assertions_1.validateRequiredParameters(this.name, this.description, []);
+ // Assert that you actually passed a boolean
+ ow_1.default(this.required, 'required', ow_1.default.boolean);
+ return {
+ type: this.type,
+ name: this.name,
+ description: this.description,
+ required: this.required,
+ };
+ }
+}
+exports.SlashCommandOptionBase = SlashCommandOptionBase;
+//# sourceMappingURL=CommandOptionBase.js.map
\ No newline at end of file
diff --git a/node_modules/@discordjs/builders/dist/interactions/slashCommands/mixins/CommandOptionBase.js.map b/node_modules/@discordjs/builders/dist/interactions/slashCommands/mixins/CommandOptionBase.js.map
new file mode 100644
index 0000000..7c34245
--- /dev/null
+++ b/node_modules/@discordjs/builders/dist/interactions/slashCommands/mixins/CommandOptionBase.js.map
@@ -0,0 +1 @@
+{"version":3,"file":"CommandOptionBase.js","sourceRoot":"/","sources":["interactions/slashCommands/mixins/CommandOptionBase.ts"],"names":[],"mappings":";;;;AACA,oDAAoB;AACpB,8CAA2D;AAE3D,6DAAgE;AAEhE,MAAa,sBAAuB,SAAQ,6CAAwB;IAInE,YAAmB,IAAkC;QACpD,KAAK,EAAE,CAAC;QAJT;;;;mBAAkB,KAAK;WAAC;QACxB;;;;;WAAmD;QAIlD,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC;IAClB,CAAC;IAED;;;OAGG;IACI,WAAW,CAAC,QAAiB;QACnC,4CAA4C;QAC5C,YAAE,CAAC,QAAQ,EAAE,UAAU,EAAE,YAAE,CAAC,OAAO,CAAC,CAAC;QAErC,IAAI,CAAC,QAAQ,GAAG,QAAQ,CAAC;QAEzB,OAAO,IAAI,CAAC;IACb,CAAC;IAEM,MAAM;QACZ,uCAA0B,CAAC,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC,WAAW,EAAE,EAAE,CAAC,CAAC;QAE5D,4CAA4C;QAC5C,YAAE,CAAC,IAAI,CAAC,QAAQ,EAAE,UAAU,EAAE,YAAE,CAAC,OAAO,CAAC,CAAC;QAE1C,OAAO;YACN,IAAI,EAAE,IAAI,CAAC,IAAI;YACf,IAAI,EAAE,IAAI,CAAC,IAAI;YACf,WAAW,EAAE,IAAI,CAAC,WAAW;YAC7B,QAAQ,EAAE,IAAI,CAAC,QAAQ;SACvB,CAAC;IACH,CAAC;CACD;AAnCD,wDAmCC","sourcesContent":["import type { ApplicationCommandOptionType } from 'discord-api-types/v9';\nimport ow from 'ow';\nimport { validateRequiredParameters } from '../Assertions';\nimport type { ToAPIApplicationCommandOptions } from '../SlashCommandBuilder';\nimport { SharedNameAndDescription } from './NameAndDescription';\n\nexport class SlashCommandOptionBase extends SharedNameAndDescription implements ToAPIApplicationCommandOptions {\n\tpublic required = false;\n\tpublic readonly type: ApplicationCommandOptionType;\n\n\tpublic constructor(type: ApplicationCommandOptionType) {\n\t\tsuper();\n\t\tthis.type = type;\n\t}\n\n\t/**\n\t * Marks the option as required\n\t * @param required If this option should be required\n\t */\n\tpublic setRequired(required: boolean) {\n\t\t// Assert that you actually passed a boolean\n\t\tow(required, 'required', ow.boolean);\n\n\t\tthis.required = required;\n\n\t\treturn this;\n\t}\n\n\tpublic toJSON() {\n\t\tvalidateRequiredParameters(this.name, this.description, []);\n\n\t\t// Assert that you actually passed a boolean\n\t\tow(this.required, 'required', ow.boolean);\n\n\t\treturn {\n\t\t\ttype: this.type,\n\t\t\tname: this.name,\n\t\t\tdescription: this.description,\n\t\t\trequired: this.required,\n\t\t};\n\t}\n}\n"]}
\ No newline at end of file
diff --git a/node_modules/@discordjs/builders/dist/interactions/slashCommands/mixins/CommandOptionWithChoices.d.ts b/node_modules/@discordjs/builders/dist/interactions/slashCommands/mixins/CommandOptionWithChoices.d.ts
new file mode 100644
index 0000000..bbbab94
--- /dev/null
+++ b/node_modules/@discordjs/builders/dist/interactions/slashCommands/mixins/CommandOptionWithChoices.d.ts
@@ -0,0 +1,25 @@
+import { APIApplicationCommandOptionChoice, ApplicationCommandOptionType } from 'discord-api-types/v9';
+import type { ToAPIApplicationCommandOptions } from '../SlashCommandBuilder';
+import { SlashCommandOptionBase } from './CommandOptionBase';
+export declare abstract class ApplicationCommandOptionWithChoicesBase extends SlashCommandOptionBase implements ToAPIApplicationCommandOptions {
+ choices?: APIApplicationCommandOptionChoice[];
+ /**
+ * Adds a choice for this option
+ * @param name The name of the choice
+ * @param value The value of the choice
+ */
+ addChoice(name: string, value: T): this;
+ /**
+ * Adds multiple choices for this option
+ * @param choices The choices to add
+ */
+ addChoices(choices: [name: string, value: T][]): this;
+ toJSON(): {
+ choices: APIApplicationCommandOptionChoice[] | undefined;
+ type: ApplicationCommandOptionType;
+ name: string;
+ description: string;
+ required: boolean;
+ };
+}
+//# sourceMappingURL=CommandOptionWithChoices.d.ts.map
\ No newline at end of file
diff --git a/node_modules/@discordjs/builders/dist/interactions/slashCommands/mixins/CommandOptionWithChoices.d.ts.map b/node_modules/@discordjs/builders/dist/interactions/slashCommands/mixins/CommandOptionWithChoices.d.ts.map
new file mode 100644
index 0000000..26102cd
--- /dev/null
+++ b/node_modules/@discordjs/builders/dist/interactions/slashCommands/mixins/CommandOptionWithChoices.d.ts.map
@@ -0,0 +1 @@
+{"version":3,"file":"CommandOptionWithChoices.d.ts","sourceRoot":"/","sources":["interactions/slashCommands/mixins/CommandOptionWithChoices.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,iCAAiC,EAAE,4BAA4B,EAAE,MAAM,sBAAsB,CAAC;AAGvG,OAAO,KAAK,EAAE,8BAA8B,EAAE,MAAM,wBAAwB,CAAC;AAC7E,OAAO,EAAE,sBAAsB,EAAE,MAAM,qBAAqB,CAAC;AAU7D,8BAAsB,uCAAuC,CAAC,CAAC,SAAS,MAAM,GAAG,MAAM,CACtF,SAAQ,sBACR,YAAW,8BAA8B;IAElC,OAAO,CAAC,EAAE,iCAAiC,EAAE,CAAC;IAErD;;;;OAIG;IACI,SAAS,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,CAAC;IAqBvC;;;OAGG;IACI,UAAU,CAAC,OAAO,EAAE,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,CAAC,CAAC,EAAE;IAWrC,MAAM;;;;;;;CAMtB"}
\ No newline at end of file
diff --git a/node_modules/@discordjs/builders/dist/interactions/slashCommands/mixins/CommandOptionWithChoices.js b/node_modules/@discordjs/builders/dist/interactions/slashCommands/mixins/CommandOptionWithChoices.js
new file mode 100644
index 0000000..06b9bb2
--- /dev/null
+++ b/node_modules/@discordjs/builders/dist/interactions/slashCommands/mixins/CommandOptionWithChoices.js
@@ -0,0 +1,59 @@
+"use strict";
+Object.defineProperty(exports, "__esModule", { value: true });
+exports.ApplicationCommandOptionWithChoicesBase = void 0;
+const tslib_1 = require("tslib");
+require("discord-api-types/v9");
+const ow_1 = tslib_1.__importDefault(require("ow"));
+const Assertions_1 = require("../Assertions");
+const CommandOptionBase_1 = require("./CommandOptionBase");
+const stringPredicate = ow_1.default.string.minLength(1).maxLength(100);
+const integerPredicate = ow_1.default.number.finite;
+// TODO: See resolution for sindresorhus/ow#217 in relation to this cast
+const choicesPredicate = ow_1.default.array.ofType(ow_1.default.array.exactShape([stringPredicate, ow_1.default.any(ow_1.default.string, integerPredicate)]));
+class ApplicationCommandOptionWithChoicesBase extends CommandOptionBase_1.SlashCommandOptionBase {
+ constructor() {
+ super(...arguments);
+ Object.defineProperty(this, "choices", {
+ enumerable: true,
+ configurable: true,
+ writable: true,
+ value: void 0
+ });
+ }
+ /**
+ * Adds a choice for this option
+ * @param name The name of the choice
+ * @param value The value of the choice
+ */
+ addChoice(name, value) {
+ this.choices ?? (this.choices = []);
+ Assertions_1.validateMaxChoicesLength(this.choices);
+ // Validate name
+ ow_1.default(name, `${this.type === 3 /* String */ ? 'string' : 'integer'} choice name`, stringPredicate);
+ // Validate the value
+ if (this.type === 3 /* String */)
+ ow_1.default(value, 'string choice value', stringPredicate);
+ else
+ ow_1.default(value, 'integer choice value', integerPredicate);
+ this.choices.push({ name, value });
+ return this;
+ }
+ /**
+ * Adds multiple choices for this option
+ * @param choices The choices to add
+ */
+ addChoices(choices) {
+ ow_1.default(choices, `${this.type === 3 /* String */ ? 'string' : 'integer'} choices`, choicesPredicate);
+ for (const [label, value] of choices)
+ this.addChoice(label, value);
+ return this;
+ }
+ toJSON() {
+ return {
+ ...super.toJSON(),
+ choices: this.choices,
+ };
+ }
+}
+exports.ApplicationCommandOptionWithChoicesBase = ApplicationCommandOptionWithChoicesBase;
+//# sourceMappingURL=CommandOptionWithChoices.js.map
\ No newline at end of file
diff --git a/node_modules/@discordjs/builders/dist/interactions/slashCommands/mixins/CommandOptionWithChoices.js.map b/node_modules/@discordjs/builders/dist/interactions/slashCommands/mixins/CommandOptionWithChoices.js.map
new file mode 100644
index 0000000..ecfeed3
--- /dev/null
+++ b/node_modules/@discordjs/builders/dist/interactions/slashCommands/mixins/CommandOptionWithChoices.js.map
@@ -0,0 +1 @@
+{"version":3,"file":"CommandOptionWithChoices.js","sourceRoot":"/","sources":["interactions/slashCommands/mixins/CommandOptionWithChoices.ts"],"names":[],"mappings":";;;;AAAA,gCAAuG;AACvG,oDAAmC;AACnC,8CAAyD;AAEzD,2DAA6D;AAE7D,MAAM,eAAe,GAAG,YAAE,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC;AAC9D,MAAM,gBAAgB,GAAG,YAAE,CAAC,MAAM,CAAC,MAAM,CAAC;AAE1C,wEAAwE;AACxE,MAAM,gBAAgB,GAAG,YAAE,CAAC,KAAK,CAAC,MAAM,CACvC,YAAE,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC,eAAe,EAAE,YAAE,CAAC,GAAG,CAAC,YAAE,CAAC,MAAM,EAAE,gBAAgB,CAA0C,CAAC,CAAC,CACpH,CAAC;AAEF,MAAsB,uCACrB,SAAQ,0CAAsB;IAD/B;;QAIC;;;;;WAAqD;IAiDtD,CAAC;IA/CA;;;;OAIG;IACI,SAAS,CAAC,IAAY,EAAE,KAAQ;QACtC,IAAI,CAAC,OAAO,KAAZ,IAAI,CAAC,OAAO,GAAK,EAAE,EAAC;QAEpB,qCAAwB,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;QAEvC,gBAAgB;QAChB,YAAE,CACD,IAAI,EACJ,GAAG,IAAI,CAAC,IAAI,mBAAwC,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,SAAS,cAAc,EACzF,eAAe,CACf,CAAC;QAEF,qBAAqB;QACrB,IAAI,IAAI,CAAC,IAAI,mBAAwC;YAAE,YAAE,CAAC,KAAK,EAAE,qBAAqB,EAAE,eAAe,CAAC,CAAC;;YACpG,YAAE,CAAC,KAAK,EAAE,sBAAsB,EAAE,gBAAgB,CAAC,CAAC;QAEzD,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC,CAAC;QAEnC,OAAO,IAAI,CAAC;IACb,CAAC;IAED;;;OAGG;IACI,UAAU,CAAC,OAAmC;QACpD,YAAE,CACD,OAAO,EACP,GAAG,IAAI,CAAC,IAAI,mBAAwC,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,SAAS,UAAU,EACrF,gBAAgB,CAChB,CAAC;QAEF,KAAK,MAAM,CAAC,KAAK,EAAE,KAAK,CAAC,IAAI,OAAO;YAAE,IAAI,CAAC,SAAS,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC;QACnE,OAAO,IAAI,CAAC;IACb,CAAC;IAEe,MAAM;QACrB,OAAO;YACN,GAAG,KAAK,CAAC,MAAM,EAAE;YACjB,OAAO,EAAE,IAAI,CAAC,OAAO;SACrB,CAAC;IACH,CAAC;CACD;AArDD,0FAqDC","sourcesContent":["import { APIApplicationCommandOptionChoice, ApplicationCommandOptionType } from 'discord-api-types/v9';\nimport ow, { Predicate } from 'ow';\nimport { validateMaxChoicesLength } from '../Assertions';\nimport type { ToAPIApplicationCommandOptions } from '../SlashCommandBuilder';\nimport { SlashCommandOptionBase } from './CommandOptionBase';\n\nconst stringPredicate = ow.string.minLength(1).maxLength(100);\nconst integerPredicate = ow.number.finite;\n\n// TODO: See resolution for sindresorhus/ow#217 in relation to this cast\nconst choicesPredicate = ow.array.ofType<[string, string | number]>(\n\tow.array.exactShape([stringPredicate, ow.any(ow.string, integerPredicate) as unknown as Predicate]),\n);\n\nexport abstract class ApplicationCommandOptionWithChoicesBase\n\textends SlashCommandOptionBase\n\timplements ToAPIApplicationCommandOptions\n{\n\tpublic choices?: APIApplicationCommandOptionChoice[];\n\n\t/**\n\t * Adds a choice for this option\n\t * @param name The name of the choice\n\t * @param value The value of the choice\n\t */\n\tpublic addChoice(name: string, value: T) {\n\t\tthis.choices ??= [];\n\n\t\tvalidateMaxChoicesLength(this.choices);\n\n\t\t// Validate name\n\t\tow(\n\t\t\tname,\n\t\t\t`${this.type === ApplicationCommandOptionType.String ? 'string' : 'integer'} choice name`,\n\t\t\tstringPredicate,\n\t\t);\n\n\t\t// Validate the value\n\t\tif (this.type === ApplicationCommandOptionType.String) ow(value, 'string choice value', stringPredicate);\n\t\telse ow(value, 'integer choice value', integerPredicate);\n\n\t\tthis.choices.push({ name, value });\n\n\t\treturn this;\n\t}\n\n\t/**\n\t * Adds multiple choices for this option\n\t * @param choices The choices to add\n\t */\n\tpublic addChoices(choices: [name: string, value: T][]) {\n\t\tow(\n\t\t\tchoices,\n\t\t\t`${this.type === ApplicationCommandOptionType.String ? 'string' : 'integer'} choices`,\n\t\t\tchoicesPredicate,\n\t\t);\n\n\t\tfor (const [label, value] of choices) this.addChoice(label, value);\n\t\treturn this;\n\t}\n\n\tpublic override toJSON() {\n\t\treturn {\n\t\t\t...super.toJSON(),\n\t\t\tchoices: this.choices,\n\t\t};\n\t}\n}\n"]}
\ No newline at end of file
diff --git a/node_modules/@discordjs/builders/dist/interactions/slashCommands/mixins/CommandOptions.d.ts b/node_modules/@discordjs/builders/dist/interactions/slashCommands/mixins/CommandOptions.d.ts
new file mode 100644
index 0000000..c3db448
--- /dev/null
+++ b/node_modules/@discordjs/builders/dist/interactions/slashCommands/mixins/CommandOptions.d.ts
@@ -0,0 +1,48 @@
+import { SlashCommandBooleanOption } from '../options/boolean';
+import { SlashCommandChannelOption } from '../options/channel';
+import { SlashCommandIntegerOption } from '../options/integer';
+import { SlashCommandMentionableOption } from '../options/mentionable';
+import { SlashCommandRoleOption } from '../options/role';
+import { SlashCommandStringOption } from '../options/string';
+import { SlashCommandUserOption } from '../options/user';
+import type { ToAPIApplicationCommandOptions } from '../SlashCommandBuilder';
+export declare class SharedSlashCommandOptions {
+ readonly options: ToAPIApplicationCommandOptions[];
+ /**
+ * Adds a boolean option
+ * @param input A function that returns an option builder, or an already built builder
+ */
+ addBooleanOption(input: SlashCommandBooleanOption | ((builder: SlashCommandBooleanOption) => SlashCommandBooleanOption)): ShouldOmitSubcommandFunctions extends true ? Omit : this;
+ /**
+ * Adds a user option
+ * @param input A function that returns an option builder, or an already built builder
+ */
+ addUserOption(input: SlashCommandUserOption | ((builder: SlashCommandUserOption) => SlashCommandUserOption)): ShouldOmitSubcommandFunctions extends true ? Omit : this;
+ /**
+ * Adds a channel option
+ * @param input A function that returns an option builder, or an already built builder
+ */
+ addChannelOption(input: SlashCommandChannelOption | ((builder: SlashCommandChannelOption) => SlashCommandChannelOption)): ShouldOmitSubcommandFunctions extends true ? Omit : this;
+ /**
+ * Adds a role option
+ * @param input A function that returns an option builder, or an already built builder
+ */
+ addRoleOption(input: SlashCommandRoleOption | ((builder: SlashCommandRoleOption) => SlashCommandRoleOption)): ShouldOmitSubcommandFunctions extends true ? Omit : this;
+ /**
+ * Adds a mentionable option
+ * @param input A function that returns an option builder, or an already built builder
+ */
+ addMentionableOption(input: SlashCommandMentionableOption | ((builder: SlashCommandMentionableOption) => SlashCommandMentionableOption)): ShouldOmitSubcommandFunctions extends true ? Omit : this;
+ /**
+ * Adds a string option
+ * @param input A function that returns an option builder, or an already built builder
+ */
+ addStringOption(input: SlashCommandStringOption | ((builder: SlashCommandStringOption) => SlashCommandStringOption)): ShouldOmitSubcommandFunctions extends true ? Omit : this;
+ /**
+ * Adds an integer option
+ * @param input A function that returns an option builder, or an already built builder
+ */
+ addIntegerOption(input: SlashCommandIntegerOption | ((builder: SlashCommandIntegerOption) => SlashCommandIntegerOption)): ShouldOmitSubcommandFunctions extends true ? Omit : this;
+ private _sharedAddOptionMethod;
+}
+//# sourceMappingURL=CommandOptions.d.ts.map
\ No newline at end of file
diff --git a/node_modules/@discordjs/builders/dist/interactions/slashCommands/mixins/CommandOptions.d.ts.map b/node_modules/@discordjs/builders/dist/interactions/slashCommands/mixins/CommandOptions.d.ts.map
new file mode 100644
index 0000000..2a21fbc
--- /dev/null
+++ b/node_modules/@discordjs/builders/dist/interactions/slashCommands/mixins/CommandOptions.d.ts.map
@@ -0,0 +1 @@
+{"version":3,"file":"CommandOptions.d.ts","sourceRoot":"/","sources":["interactions/slashCommands/mixins/CommandOptions.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,yBAAyB,EAAE,MAAM,oBAAoB,CAAC;AAC/D,OAAO,EAAE,yBAAyB,EAAE,MAAM,oBAAoB,CAAC;AAC/D,OAAO,EAAE,yBAAyB,EAAE,MAAM,oBAAoB,CAAC;AAC/D,OAAO,EAAE,6BAA6B,EAAE,MAAM,wBAAwB,CAAC;AACvE,OAAO,EAAE,sBAAsB,EAAE,MAAM,iBAAiB,CAAC;AACzD,OAAO,EAAE,wBAAwB,EAAE,MAAM,mBAAmB,CAAC;AAC7D,OAAO,EAAE,sBAAsB,EAAE,MAAM,iBAAiB,CAAC;AACzD,OAAO,KAAK,EAAE,8BAA8B,EAAE,MAAM,wBAAwB,CAAC;AAE7E,qBAAa,yBAAyB,CAAC,6BAA6B,GAAG,IAAI;IAC1E,SAAgB,OAAO,EAAG,8BAA8B,EAAE,CAAC;IAE3D;;;OAGG;IACI,gBAAgB,CACtB,KAAK,EAAE,yBAAyB,GAAG,CAAC,CAAC,OAAO,EAAE,yBAAyB,KAAK,yBAAyB,CAAC;IAKvG;;;OAGG;IACI,aAAa,CAAC,KAAK,EAAE,sBAAsB,GAAG,CAAC,CAAC,OAAO,EAAE,sBAAsB,KAAK,sBAAsB,CAAC;IAIlH;;;OAGG;IACI,gBAAgB,CACtB,KAAK,EAAE,yBAAyB,GAAG,CAAC,CAAC,OAAO,EAAE,yBAAyB,KAAK,yBAAyB,CAAC;IAKvG;;;OAGG;IACI,aAAa,CAAC,KAAK,EAAE,sBAAsB,GAAG,CAAC,CAAC,OAAO,EAAE,sBAAsB,KAAK,sBAAsB,CAAC;IAIlH;;;OAGG;IACI,oBAAoB,CAC1B,KAAK,EAAE,6BAA6B,GAAG,CAAC,CAAC,OAAO,EAAE,6BAA6B,KAAK,6BAA6B,CAAC;IAKnH;;;OAGG;IACI,eAAe,CACrB,KAAK,EAAE,wBAAwB,GAAG,CAAC,CAAC,OAAO,EAAE,wBAAwB,KAAK,wBAAwB,CAAC;IAKpG;;;OAGG;IACI,gBAAgB,CACtB,KAAK,EAAE,yBAAyB,GAAG,CAAC,CAAC,OAAO,EAAE,yBAAyB,KAAK,yBAAyB,CAAC;IAKvG,OAAO,CAAC,sBAAsB;CAmB9B"}
\ No newline at end of file
diff --git a/node_modules/@discordjs/builders/dist/interactions/slashCommands/mixins/CommandOptions.js b/node_modules/@discordjs/builders/dist/interactions/slashCommands/mixins/CommandOptions.js
new file mode 100644
index 0000000..940275f
--- /dev/null
+++ b/node_modules/@discordjs/builders/dist/interactions/slashCommands/mixins/CommandOptions.js
@@ -0,0 +1,83 @@
+"use strict";
+Object.defineProperty(exports, "__esModule", { value: true });
+exports.SharedSlashCommandOptions = void 0;
+const Assertions_1 = require("../Assertions");
+const boolean_1 = require("../options/boolean");
+const channel_1 = require("../options/channel");
+const integer_1 = require("../options/integer");
+const mentionable_1 = require("../options/mentionable");
+const role_1 = require("../options/role");
+const string_1 = require("../options/string");
+const user_1 = require("../options/user");
+class SharedSlashCommandOptions {
+ constructor() {
+ Object.defineProperty(this, "options", {
+ enumerable: true,
+ configurable: true,
+ writable: true,
+ value: void 0
+ });
+ }
+ /**
+ * Adds a boolean option
+ * @param input A function that returns an option builder, or an already built builder
+ */
+ addBooleanOption(input) {
+ return this._sharedAddOptionMethod(input, boolean_1.SlashCommandBooleanOption);
+ }
+ /**
+ * Adds a user option
+ * @param input A function that returns an option builder, or an already built builder
+ */
+ addUserOption(input) {
+ return this._sharedAddOptionMethod(input, user_1.SlashCommandUserOption);
+ }
+ /**
+ * Adds a channel option
+ * @param input A function that returns an option builder, or an already built builder
+ */
+ addChannelOption(input) {
+ return this._sharedAddOptionMethod(input, channel_1.SlashCommandChannelOption);
+ }
+ /**
+ * Adds a role option
+ * @param input A function that returns an option builder, or an already built builder
+ */
+ addRoleOption(input) {
+ return this._sharedAddOptionMethod(input, role_1.SlashCommandRoleOption);
+ }
+ /**
+ * Adds a mentionable option
+ * @param input A function that returns an option builder, or an already built builder
+ */
+ addMentionableOption(input) {
+ return this._sharedAddOptionMethod(input, mentionable_1.SlashCommandMentionableOption);
+ }
+ /**
+ * Adds a string option
+ * @param input A function that returns an option builder, or an already built builder
+ */
+ addStringOption(input) {
+ return this._sharedAddOptionMethod(input, string_1.SlashCommandStringOption);
+ }
+ /**
+ * Adds an integer option
+ * @param input A function that returns an option builder, or an already built builder
+ */
+ addIntegerOption(input) {
+ return this._sharedAddOptionMethod(input, integer_1.SlashCommandIntegerOption);
+ }
+ _sharedAddOptionMethod(input, Instance) {
+ const { options } = this;
+ // First, assert options conditions - we cannot have more than 25 options
+ Assertions_1.validateMaxOptionsLength(options);
+ // Get the final result
+ const result = typeof input === 'function' ? input(new Instance()) : input;
+ Assertions_1.assertReturnOfBuilder(result, Instance);
+ // Push it
+ options.push(result);
+ return this;
+ }
+}
+exports.SharedSlashCommandOptions = SharedSlashCommandOptions;
+//# sourceMappingURL=CommandOptions.js.map
\ No newline at end of file
diff --git a/node_modules/@discordjs/builders/dist/interactions/slashCommands/mixins/CommandOptions.js.map b/node_modules/@discordjs/builders/dist/interactions/slashCommands/mixins/CommandOptions.js.map
new file mode 100644
index 0000000..b2b1223
--- /dev/null
+++ b/node_modules/@discordjs/builders/dist/interactions/slashCommands/mixins/CommandOptions.js.map
@@ -0,0 +1 @@
+{"version":3,"file":"CommandOptions.js","sourceRoot":"/","sources":["interactions/slashCommands/mixins/CommandOptions.ts"],"names":[],"mappings":";;;AAAA,8CAAgF;AAEhF,gDAA+D;AAC/D,gDAA+D;AAC/D,gDAA+D;AAC/D,wDAAuE;AACvE,0CAAyD;AACzD,8CAA6D;AAC7D,0CAAyD;AAGzD,MAAa,yBAAyB;IAAtC;QACC;;;;;WAA2D;IAuF5D,CAAC;IArFA;;;OAGG;IACI,gBAAgB,CACtB,KAAsG;QAEtG,OAAO,IAAI,CAAC,sBAAsB,CAAC,KAAK,EAAE,mCAAyB,CAAC,CAAC;IACtE,CAAC;IAED;;;OAGG;IACI,aAAa,CAAC,KAA6F;QACjH,OAAO,IAAI,CAAC,sBAAsB,CAAC,KAAK,EAAE,6BAAsB,CAAC,CAAC;IACnE,CAAC;IAED;;;OAGG;IACI,gBAAgB,CACtB,KAAsG;QAEtG,OAAO,IAAI,CAAC,sBAAsB,CAAC,KAAK,EAAE,mCAAyB,CAAC,CAAC;IACtE,CAAC;IAED;;;OAGG;IACI,aAAa,CAAC,KAA6F;QACjH,OAAO,IAAI,CAAC,sBAAsB,CAAC,KAAK,EAAE,6BAAsB,CAAC,CAAC;IACnE,CAAC;IAED;;;OAGG;IACI,oBAAoB,CAC1B,KAAkH;QAElH,OAAO,IAAI,CAAC,sBAAsB,CAAC,KAAK,EAAE,2CAA6B,CAAC,CAAC;IAC1E,CAAC;IAED;;;OAGG;IACI,eAAe,CACrB,KAAmG;QAEnG,OAAO,IAAI,CAAC,sBAAsB,CAAC,KAAK,EAAE,iCAAwB,CAAC,CAAC;IACrE,CAAC;IAED;;;OAGG;IACI,gBAAgB,CACtB,KAAsG;QAEtG,OAAO,IAAI,CAAC,sBAAsB,CAAC,KAAK,EAAE,mCAAyB,CAAC,CAAC;IACtE,CAAC;IAEO,sBAAsB,CAC7B,KAA8B,EAC9B,QAAqB;QAErB,MAAM,EAAE,OAAO,EAAE,GAAG,IAAI,CAAC;QAEzB,yEAAyE;QACzE,qCAAwB,CAAC,OAAO,CAAC,CAAC;QAElC,uBAAuB;QACvB,MAAM,MAAM,GAAG,OAAO,KAAK,KAAK,UAAU,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI,QAAQ,EAAE,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC;QAE3E,kCAAqB,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAC;QAExC,UAAU;QACV,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;QAErB,OAAO,IAAI,CAAC;IACb,CAAC;CACD;AAxFD,8DAwFC","sourcesContent":["import { assertReturnOfBuilder, validateMaxOptionsLength } from '../Assertions';\nimport type { SlashCommandOptionBase } from './CommandOptionBase';\nimport { SlashCommandBooleanOption } from '../options/boolean';\nimport { SlashCommandChannelOption } from '../options/channel';\nimport { SlashCommandIntegerOption } from '../options/integer';\nimport { SlashCommandMentionableOption } from '../options/mentionable';\nimport { SlashCommandRoleOption } from '../options/role';\nimport { SlashCommandStringOption } from '../options/string';\nimport { SlashCommandUserOption } from '../options/user';\nimport type { ToAPIApplicationCommandOptions } from '../SlashCommandBuilder';\n\nexport class SharedSlashCommandOptions {\n\tpublic readonly options!: ToAPIApplicationCommandOptions[];\n\n\t/**\n\t * Adds a boolean option\n\t * @param input A function that returns an option builder, or an already built builder\n\t */\n\tpublic addBooleanOption(\n\t\tinput: SlashCommandBooleanOption | ((builder: SlashCommandBooleanOption) => SlashCommandBooleanOption),\n\t) {\n\t\treturn this._sharedAddOptionMethod(input, SlashCommandBooleanOption);\n\t}\n\n\t/**\n\t * Adds a user option\n\t * @param input A function that returns an option builder, or an already built builder\n\t */\n\tpublic addUserOption(input: SlashCommandUserOption | ((builder: SlashCommandUserOption) => SlashCommandUserOption)) {\n\t\treturn this._sharedAddOptionMethod(input, SlashCommandUserOption);\n\t}\n\n\t/**\n\t * Adds a channel option\n\t * @param input A function that returns an option builder, or an already built builder\n\t */\n\tpublic addChannelOption(\n\t\tinput: SlashCommandChannelOption | ((builder: SlashCommandChannelOption) => SlashCommandChannelOption),\n\t) {\n\t\treturn this._sharedAddOptionMethod(input, SlashCommandChannelOption);\n\t}\n\n\t/**\n\t * Adds a role option\n\t * @param input A function that returns an option builder, or an already built builder\n\t */\n\tpublic addRoleOption(input: SlashCommandRoleOption | ((builder: SlashCommandRoleOption) => SlashCommandRoleOption)) {\n\t\treturn this._sharedAddOptionMethod(input, SlashCommandRoleOption);\n\t}\n\n\t/**\n\t * Adds a mentionable option\n\t * @param input A function that returns an option builder, or an already built builder\n\t */\n\tpublic addMentionableOption(\n\t\tinput: SlashCommandMentionableOption | ((builder: SlashCommandMentionableOption) => SlashCommandMentionableOption),\n\t) {\n\t\treturn this._sharedAddOptionMethod(input, SlashCommandMentionableOption);\n\t}\n\n\t/**\n\t * Adds a string option\n\t * @param input A function that returns an option builder, or an already built builder\n\t */\n\tpublic addStringOption(\n\t\tinput: SlashCommandStringOption | ((builder: SlashCommandStringOption) => SlashCommandStringOption),\n\t) {\n\t\treturn this._sharedAddOptionMethod(input, SlashCommandStringOption);\n\t}\n\n\t/**\n\t * Adds an integer option\n\t * @param input A function that returns an option builder, or an already built builder\n\t */\n\tpublic addIntegerOption(\n\t\tinput: SlashCommandIntegerOption | ((builder: SlashCommandIntegerOption) => SlashCommandIntegerOption),\n\t) {\n\t\treturn this._sharedAddOptionMethod(input, SlashCommandIntegerOption);\n\t}\n\n\tprivate _sharedAddOptionMethod(\n\t\tinput: T | ((builder: T) => T),\n\t\tInstance: new () => T,\n\t): ShouldOmitSubcommandFunctions extends true ? Omit : this {\n\t\tconst { options } = this;\n\n\t\t// First, assert options conditions - we cannot have more than 25 options\n\t\tvalidateMaxOptionsLength(options);\n\n\t\t// Get the final result\n\t\tconst result = typeof input === 'function' ? input(new Instance()) : input;\n\n\t\tassertReturnOfBuilder(result, Instance);\n\n\t\t// Push it\n\t\toptions.push(result);\n\n\t\treturn this;\n\t}\n}\n"]}
\ No newline at end of file
diff --git a/node_modules/@discordjs/builders/dist/interactions/slashCommands/mixins/NameAndDescription.d.ts b/node_modules/@discordjs/builders/dist/interactions/slashCommands/mixins/NameAndDescription.d.ts
new file mode 100644
index 0000000..a7a5695
--- /dev/null
+++ b/node_modules/@discordjs/builders/dist/interactions/slashCommands/mixins/NameAndDescription.d.ts
@@ -0,0 +1,15 @@
+export declare class SharedNameAndDescription {
+ readonly name: string;
+ readonly description: string;
+ /**
+ * Sets the name
+ * @param name The name
+ */
+ setName(name: string): this;
+ /**
+ * Sets the description
+ * @param description The description
+ */
+ setDescription(description: string): this;
+}
+//# sourceMappingURL=NameAndDescription.d.ts.map
\ No newline at end of file
diff --git a/node_modules/@discordjs/builders/dist/interactions/slashCommands/mixins/NameAndDescription.d.ts.map b/node_modules/@discordjs/builders/dist/interactions/slashCommands/mixins/NameAndDescription.d.ts.map
new file mode 100644
index 0000000..868dc88
--- /dev/null
+++ b/node_modules/@discordjs/builders/dist/interactions/slashCommands/mixins/NameAndDescription.d.ts.map
@@ -0,0 +1 @@
+{"version":3,"file":"NameAndDescription.d.ts","sourceRoot":"/","sources":["interactions/slashCommands/mixins/NameAndDescription.ts"],"names":[],"mappings":"AAEA,qBAAa,wBAAwB;IACpC,SAAgB,IAAI,EAAG,MAAM,CAAC;IAC9B,SAAgB,WAAW,EAAG,MAAM,CAAC;IAErC;;;OAGG;IACI,OAAO,CAAC,IAAI,EAAE,MAAM;IAS3B;;;OAGG;IACI,cAAc,CAAC,WAAW,EAAE,MAAM;CAQzC"}
\ No newline at end of file
diff --git a/node_modules/@discordjs/builders/dist/interactions/slashCommands/mixins/NameAndDescription.js b/node_modules/@discordjs/builders/dist/interactions/slashCommands/mixins/NameAndDescription.js
new file mode 100644
index 0000000..bb6031d
--- /dev/null
+++ b/node_modules/@discordjs/builders/dist/interactions/slashCommands/mixins/NameAndDescription.js
@@ -0,0 +1,42 @@
+"use strict";
+Object.defineProperty(exports, "__esModule", { value: true });
+exports.SharedNameAndDescription = void 0;
+const Assertions_1 = require("../Assertions");
+class SharedNameAndDescription {
+ constructor() {
+ Object.defineProperty(this, "name", {
+ enumerable: true,
+ configurable: true,
+ writable: true,
+ value: void 0
+ });
+ Object.defineProperty(this, "description", {
+ enumerable: true,
+ configurable: true,
+ writable: true,
+ value: void 0
+ });
+ }
+ /**
+ * Sets the name
+ * @param name The name
+ */
+ setName(name) {
+ // Assert the name matches the conditions
+ Assertions_1.validateName(name);
+ Reflect.set(this, 'name', name);
+ return this;
+ }
+ /**
+ * Sets the description
+ * @param description The description
+ */
+ setDescription(description) {
+ // Assert the description matches the conditions
+ Assertions_1.validateDescription(description);
+ Reflect.set(this, 'description', description);
+ return this;
+ }
+}
+exports.SharedNameAndDescription = SharedNameAndDescription;
+//# sourceMappingURL=NameAndDescription.js.map
\ No newline at end of file
diff --git a/node_modules/@discordjs/builders/dist/interactions/slashCommands/mixins/NameAndDescription.js.map b/node_modules/@discordjs/builders/dist/interactions/slashCommands/mixins/NameAndDescription.js.map
new file mode 100644
index 0000000..f4fa197
--- /dev/null
+++ b/node_modules/@discordjs/builders/dist/interactions/slashCommands/mixins/NameAndDescription.js.map
@@ -0,0 +1 @@
+{"version":3,"file":"NameAndDescription.js","sourceRoot":"/","sources":["interactions/slashCommands/mixins/NameAndDescription.ts"],"names":[],"mappings":";;;AAAA,8CAAkE;AAElE,MAAa,wBAAwB;IAArC;QACC;;;;;WAA8B;QAC9B;;;;;WAAqC;IA2BtC,CAAC;IAzBA;;;OAGG;IACI,OAAO,CAAC,IAAY;QAC1B,yCAAyC;QACzC,yBAAY,CAAC,IAAI,CAAC,CAAC;QAEnB,OAAO,CAAC,GAAG,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,CAAC,CAAC;QAEhC,OAAO,IAAI,CAAC;IACb,CAAC;IAED;;;OAGG;IACI,cAAc,CAAC,WAAmB;QACxC,gDAAgD;QAChD,gCAAmB,CAAC,WAAW,CAAC,CAAC;QAEjC,OAAO,CAAC,GAAG,CAAC,IAAI,EAAE,aAAa,EAAE,WAAW,CAAC,CAAC;QAE9C,OAAO,IAAI,CAAC;IACb,CAAC;CACD;AA7BD,4DA6BC","sourcesContent":["import { validateDescription, validateName } from '../Assertions';\n\nexport class SharedNameAndDescription {\n\tpublic readonly name!: string;\n\tpublic readonly description!: string;\n\n\t/**\n\t * Sets the name\n\t * @param name The name\n\t */\n\tpublic setName(name: string) {\n\t\t// Assert the name matches the conditions\n\t\tvalidateName(name);\n\n\t\tReflect.set(this, 'name', name);\n\n\t\treturn this;\n\t}\n\n\t/**\n\t * Sets the description\n\t * @param description The description\n\t */\n\tpublic setDescription(description: string) {\n\t\t// Assert the description matches the conditions\n\t\tvalidateDescription(description);\n\n\t\tReflect.set(this, 'description', description);\n\n\t\treturn this;\n\t}\n}\n"]}
\ No newline at end of file
diff --git a/node_modules/@discordjs/builders/dist/interactions/slashCommands/options/boolean.d.ts b/node_modules/@discordjs/builders/dist/interactions/slashCommands/options/boolean.d.ts
new file mode 100644
index 0000000..a0cda36
--- /dev/null
+++ b/node_modules/@discordjs/builders/dist/interactions/slashCommands/options/boolean.d.ts
@@ -0,0 +1,7 @@
+import { ApplicationCommandOptionType } from 'discord-api-types/v9';
+import { SlashCommandOptionBase } from '../mixins/CommandOptionBase';
+export declare class SlashCommandBooleanOption extends SlashCommandOptionBase {
+ readonly type: ApplicationCommandOptionType.Boolean;
+ constructor();
+}
+//# sourceMappingURL=boolean.d.ts.map
\ No newline at end of file
diff --git a/node_modules/@discordjs/builders/dist/interactions/slashCommands/options/boolean.d.ts.map b/node_modules/@discordjs/builders/dist/interactions/slashCommands/options/boolean.d.ts.map
new file mode 100644
index 0000000..d4d1596
--- /dev/null
+++ b/node_modules/@discordjs/builders/dist/interactions/slashCommands/options/boolean.d.ts.map
@@ -0,0 +1 @@
+{"version":3,"file":"boolean.d.ts","sourceRoot":"/","sources":["interactions/slashCommands/options/boolean.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,4BAA4B,EAAE,MAAM,sBAAsB,CAAC;AACpE,OAAO,EAAE,sBAAsB,EAAE,MAAM,6BAA6B,CAAC;AAErE,qBAAa,yBAA0B,SAAQ,sBAAsB;IACpE,SAAyB,IAAI,uCAAiD;;CAK9E"}
\ No newline at end of file
diff --git a/node_modules/@discordjs/builders/dist/interactions/slashCommands/options/boolean.js b/node_modules/@discordjs/builders/dist/interactions/slashCommands/options/boolean.js
new file mode 100644
index 0000000..c54342d
--- /dev/null
+++ b/node_modules/@discordjs/builders/dist/interactions/slashCommands/options/boolean.js
@@ -0,0 +1,18 @@
+"use strict";
+Object.defineProperty(exports, "__esModule", { value: true });
+exports.SlashCommandBooleanOption = void 0;
+require("discord-api-types/v9");
+const CommandOptionBase_1 = require("../mixins/CommandOptionBase");
+class SlashCommandBooleanOption extends CommandOptionBase_1.SlashCommandOptionBase {
+ constructor() {
+ super(5 /* Boolean */);
+ Object.defineProperty(this, "type", {
+ enumerable: true,
+ configurable: true,
+ writable: true,
+ value: 5 /* Boolean */
+ });
+ }
+}
+exports.SlashCommandBooleanOption = SlashCommandBooleanOption;
+//# sourceMappingURL=boolean.js.map
\ No newline at end of file
diff --git a/node_modules/@discordjs/builders/dist/interactions/slashCommands/options/boolean.js.map b/node_modules/@discordjs/builders/dist/interactions/slashCommands/options/boolean.js.map
new file mode 100644
index 0000000..94e0554
--- /dev/null
+++ b/node_modules/@discordjs/builders/dist/interactions/slashCommands/options/boolean.js.map
@@ -0,0 +1 @@
+{"version":3,"file":"boolean.js","sourceRoot":"/","sources":["interactions/slashCommands/options/boolean.ts"],"names":[],"mappings":";;;AAAA,gCAAoE;AACpE,mEAAqE;AAErE,MAAa,yBAA0B,SAAQ,0CAAsB;IAGpE;QACC,KAAK,iBAAsC,CAAC;QAH7C;;;;mBAAgC,eAA6C;WAAC;IAI9E,CAAC;CACD;AAND,8DAMC","sourcesContent":["import { ApplicationCommandOptionType } from 'discord-api-types/v9';\nimport { SlashCommandOptionBase } from '../mixins/CommandOptionBase';\n\nexport class SlashCommandBooleanOption extends SlashCommandOptionBase {\n\tpublic override readonly type = ApplicationCommandOptionType.Boolean as const;\n\n\tpublic constructor() {\n\t\tsuper(ApplicationCommandOptionType.Boolean);\n\t}\n}\n"]}
\ No newline at end of file
diff --git a/node_modules/@discordjs/builders/dist/interactions/slashCommands/options/channel.d.ts b/node_modules/@discordjs/builders/dist/interactions/slashCommands/options/channel.d.ts
new file mode 100644
index 0000000..2b6d03a
--- /dev/null
+++ b/node_modules/@discordjs/builders/dist/interactions/slashCommands/options/channel.d.ts
@@ -0,0 +1,7 @@
+import { ApplicationCommandOptionType } from 'discord-api-types/v9';
+import { SlashCommandOptionBase } from '../mixins/CommandOptionBase';
+export declare class SlashCommandChannelOption extends SlashCommandOptionBase {
+ readonly type: ApplicationCommandOptionType.Channel;
+ constructor();
+}
+//# sourceMappingURL=channel.d.ts.map
\ No newline at end of file
diff --git a/node_modules/@discordjs/builders/dist/interactions/slashCommands/options/channel.d.ts.map b/node_modules/@discordjs/builders/dist/interactions/slashCommands/options/channel.d.ts.map
new file mode 100644
index 0000000..5e55e53
--- /dev/null
+++ b/node_modules/@discordjs/builders/dist/interactions/slashCommands/options/channel.d.ts.map
@@ -0,0 +1 @@
+{"version":3,"file":"channel.d.ts","sourceRoot":"/","sources":["interactions/slashCommands/options/channel.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,4BAA4B,EAAE,MAAM,sBAAsB,CAAC;AACpE,OAAO,EAAE,sBAAsB,EAAE,MAAM,6BAA6B,CAAC;AAErE,qBAAa,yBAA0B,SAAQ,sBAAsB;IACpE,SAAyB,IAAI,uCAAiD;;CAK9E"}
\ No newline at end of file
diff --git a/node_modules/@discordjs/builders/dist/interactions/slashCommands/options/channel.js b/node_modules/@discordjs/builders/dist/interactions/slashCommands/options/channel.js
new file mode 100644
index 0000000..87e22b4
--- /dev/null
+++ b/node_modules/@discordjs/builders/dist/interactions/slashCommands/options/channel.js
@@ -0,0 +1,18 @@
+"use strict";
+Object.defineProperty(exports, "__esModule", { value: true });
+exports.SlashCommandChannelOption = void 0;
+require("discord-api-types/v9");
+const CommandOptionBase_1 = require("../mixins/CommandOptionBase");
+class SlashCommandChannelOption extends CommandOptionBase_1.SlashCommandOptionBase {
+ constructor() {
+ super(7 /* Channel */);
+ Object.defineProperty(this, "type", {
+ enumerable: true,
+ configurable: true,
+ writable: true,
+ value: 7 /* Channel */
+ });
+ }
+}
+exports.SlashCommandChannelOption = SlashCommandChannelOption;
+//# sourceMappingURL=channel.js.map
\ No newline at end of file
diff --git a/node_modules/@discordjs/builders/dist/interactions/slashCommands/options/channel.js.map b/node_modules/@discordjs/builders/dist/interactions/slashCommands/options/channel.js.map
new file mode 100644
index 0000000..1424a39
--- /dev/null
+++ b/node_modules/@discordjs/builders/dist/interactions/slashCommands/options/channel.js.map
@@ -0,0 +1 @@
+{"version":3,"file":"channel.js","sourceRoot":"/","sources":["interactions/slashCommands/options/channel.ts"],"names":[],"mappings":";;;AAAA,gCAAoE;AACpE,mEAAqE;AAErE,MAAa,yBAA0B,SAAQ,0CAAsB;IAGpE;QACC,KAAK,iBAAsC,CAAC;QAH7C;;;;mBAAgC,eAA6C;WAAC;IAI9E,CAAC;CACD;AAND,8DAMC","sourcesContent":["import { ApplicationCommandOptionType } from 'discord-api-types/v9';\nimport { SlashCommandOptionBase } from '../mixins/CommandOptionBase';\n\nexport class SlashCommandChannelOption extends SlashCommandOptionBase {\n\tpublic override readonly type = ApplicationCommandOptionType.Channel as const;\n\n\tpublic constructor() {\n\t\tsuper(ApplicationCommandOptionType.Channel);\n\t}\n}\n"]}
\ No newline at end of file
diff --git a/node_modules/@discordjs/builders/dist/interactions/slashCommands/options/integer.d.ts b/node_modules/@discordjs/builders/dist/interactions/slashCommands/options/integer.d.ts
new file mode 100644
index 0000000..3faefe0
--- /dev/null
+++ b/node_modules/@discordjs/builders/dist/interactions/slashCommands/options/integer.d.ts
@@ -0,0 +1,7 @@
+import { ApplicationCommandOptionType } from 'discord-api-types/v9';
+import { ApplicationCommandOptionWithChoicesBase } from '../mixins/CommandOptionWithChoices';
+export declare class SlashCommandIntegerOption extends ApplicationCommandOptionWithChoicesBase {
+ readonly type: ApplicationCommandOptionType.Integer;
+ constructor();
+}
+//# sourceMappingURL=integer.d.ts.map
\ No newline at end of file
diff --git a/node_modules/@discordjs/builders/dist/interactions/slashCommands/options/integer.d.ts.map b/node_modules/@discordjs/builders/dist/interactions/slashCommands/options/integer.d.ts.map
new file mode 100644
index 0000000..e991150
--- /dev/null
+++ b/node_modules/@discordjs/builders/dist/interactions/slashCommands/options/integer.d.ts.map
@@ -0,0 +1 @@
+{"version":3,"file":"integer.d.ts","sourceRoot":"/","sources":["interactions/slashCommands/options/integer.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,4BAA4B,EAAE,MAAM,sBAAsB,CAAC;AACpE,OAAO,EAAE,uCAAuC,EAAE,MAAM,oCAAoC,CAAC;AAE7F,qBAAa,yBAA0B,SAAQ,uCAAuC,CAAC,MAAM,CAAC;IAC7F,SAAyB,IAAI,uCAAiD;;CAK9E"}
\ No newline at end of file
diff --git a/node_modules/@discordjs/builders/dist/interactions/slashCommands/options/integer.js b/node_modules/@discordjs/builders/dist/interactions/slashCommands/options/integer.js
new file mode 100644
index 0000000..73ace64
--- /dev/null
+++ b/node_modules/@discordjs/builders/dist/interactions/slashCommands/options/integer.js
@@ -0,0 +1,18 @@
+"use strict";
+Object.defineProperty(exports, "__esModule", { value: true });
+exports.SlashCommandIntegerOption = void 0;
+require("discord-api-types/v9");
+const CommandOptionWithChoices_1 = require("../mixins/CommandOptionWithChoices");
+class SlashCommandIntegerOption extends CommandOptionWithChoices_1.ApplicationCommandOptionWithChoicesBase {
+ constructor() {
+ super(4 /* Integer */);
+ Object.defineProperty(this, "type", {
+ enumerable: true,
+ configurable: true,
+ writable: true,
+ value: 4 /* Integer */
+ });
+ }
+}
+exports.SlashCommandIntegerOption = SlashCommandIntegerOption;
+//# sourceMappingURL=integer.js.map
\ No newline at end of file
diff --git a/node_modules/@discordjs/builders/dist/interactions/slashCommands/options/integer.js.map b/node_modules/@discordjs/builders/dist/interactions/slashCommands/options/integer.js.map
new file mode 100644
index 0000000..8bb13b6
--- /dev/null
+++ b/node_modules/@discordjs/builders/dist/interactions/slashCommands/options/integer.js.map
@@ -0,0 +1 @@
+{"version":3,"file":"integer.js","sourceRoot":"/","sources":["interactions/slashCommands/options/integer.ts"],"names":[],"mappings":";;;AAAA,gCAAoE;AACpE,iFAA6F;AAE7F,MAAa,yBAA0B,SAAQ,kEAA+C;IAG7F;QACC,KAAK,iBAAsC,CAAC;QAH7C;;;;mBAAgC,eAA6C;WAAC;IAI9E,CAAC;CACD;AAND,8DAMC","sourcesContent":["import { ApplicationCommandOptionType } from 'discord-api-types/v9';\nimport { ApplicationCommandOptionWithChoicesBase } from '../mixins/CommandOptionWithChoices';\n\nexport class SlashCommandIntegerOption extends ApplicationCommandOptionWithChoicesBase {\n\tpublic override readonly type = ApplicationCommandOptionType.Integer as const;\n\n\tpublic constructor() {\n\t\tsuper(ApplicationCommandOptionType.Integer);\n\t}\n}\n"]}
\ No newline at end of file
diff --git a/node_modules/@discordjs/builders/dist/interactions/slashCommands/options/mentionable.d.ts b/node_modules/@discordjs/builders/dist/interactions/slashCommands/options/mentionable.d.ts
new file mode 100644
index 0000000..ff98caf
--- /dev/null
+++ b/node_modules/@discordjs/builders/dist/interactions/slashCommands/options/mentionable.d.ts
@@ -0,0 +1,7 @@
+import { ApplicationCommandOptionType } from 'discord-api-types/v9';
+import { SlashCommandOptionBase } from '../mixins/CommandOptionBase';
+export declare class SlashCommandMentionableOption extends SlashCommandOptionBase {
+ readonly type: ApplicationCommandOptionType.Mentionable;
+ constructor();
+}
+//# sourceMappingURL=mentionable.d.ts.map
\ No newline at end of file
diff --git a/node_modules/@discordjs/builders/dist/interactions/slashCommands/options/mentionable.d.ts.map b/node_modules/@discordjs/builders/dist/interactions/slashCommands/options/mentionable.d.ts.map
new file mode 100644
index 0000000..2099899
--- /dev/null
+++ b/node_modules/@discordjs/builders/dist/interactions/slashCommands/options/mentionable.d.ts.map
@@ -0,0 +1 @@
+{"version":3,"file":"mentionable.d.ts","sourceRoot":"/","sources":["interactions/slashCommands/options/mentionable.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,4BAA4B,EAAE,MAAM,sBAAsB,CAAC;AACpE,OAAO,EAAE,sBAAsB,EAAE,MAAM,6BAA6B,CAAC;AAErE,qBAAa,6BAA8B,SAAQ,sBAAsB;IACxE,SAAyB,IAAI,2CAAqD;;CAKlF"}
\ No newline at end of file
diff --git a/node_modules/@discordjs/builders/dist/interactions/slashCommands/options/mentionable.js b/node_modules/@discordjs/builders/dist/interactions/slashCommands/options/mentionable.js
new file mode 100644
index 0000000..a6167b3
--- /dev/null
+++ b/node_modules/@discordjs/builders/dist/interactions/slashCommands/options/mentionable.js
@@ -0,0 +1,18 @@
+"use strict";
+Object.defineProperty(exports, "__esModule", { value: true });
+exports.SlashCommandMentionableOption = void 0;
+require("discord-api-types/v9");
+const CommandOptionBase_1 = require("../mixins/CommandOptionBase");
+class SlashCommandMentionableOption extends CommandOptionBase_1.SlashCommandOptionBase {
+ constructor() {
+ super(9 /* Mentionable */);
+ Object.defineProperty(this, "type", {
+ enumerable: true,
+ configurable: true,
+ writable: true,
+ value: 9 /* Mentionable */
+ });
+ }
+}
+exports.SlashCommandMentionableOption = SlashCommandMentionableOption;
+//# sourceMappingURL=mentionable.js.map
\ No newline at end of file
diff --git a/node_modules/@discordjs/builders/dist/interactions/slashCommands/options/mentionable.js.map b/node_modules/@discordjs/builders/dist/interactions/slashCommands/options/mentionable.js.map
new file mode 100644
index 0000000..96e79cb
--- /dev/null
+++ b/node_modules/@discordjs/builders/dist/interactions/slashCommands/options/mentionable.js.map
@@ -0,0 +1 @@
+{"version":3,"file":"mentionable.js","sourceRoot":"/","sources":["interactions/slashCommands/options/mentionable.ts"],"names":[],"mappings":";;;AAAA,gCAAoE;AACpE,mEAAqE;AAErE,MAAa,6BAA8B,SAAQ,0CAAsB;IAGxE;QACC,KAAK,qBAA0C,CAAC;QAHjD;;;;mBAAgC,mBAAiD;WAAC;IAIlF,CAAC;CACD;AAND,sEAMC","sourcesContent":["import { ApplicationCommandOptionType } from 'discord-api-types/v9';\nimport { SlashCommandOptionBase } from '../mixins/CommandOptionBase';\n\nexport class SlashCommandMentionableOption extends SlashCommandOptionBase {\n\tpublic override readonly type = ApplicationCommandOptionType.Mentionable as const;\n\n\tpublic constructor() {\n\t\tsuper(ApplicationCommandOptionType.Mentionable);\n\t}\n}\n"]}
\ No newline at end of file
diff --git a/node_modules/@discordjs/builders/dist/interactions/slashCommands/options/role.d.ts b/node_modules/@discordjs/builders/dist/interactions/slashCommands/options/role.d.ts
new file mode 100644
index 0000000..3f78471
--- /dev/null
+++ b/node_modules/@discordjs/builders/dist/interactions/slashCommands/options/role.d.ts
@@ -0,0 +1,7 @@
+import { ApplicationCommandOptionType } from 'discord-api-types/v9';
+import { SlashCommandOptionBase } from '../mixins/CommandOptionBase';
+export declare class SlashCommandRoleOption extends SlashCommandOptionBase {
+ readonly type: ApplicationCommandOptionType.Role;
+ constructor();
+}
+//# sourceMappingURL=role.d.ts.map
\ No newline at end of file
diff --git a/node_modules/@discordjs/builders/dist/interactions/slashCommands/options/role.d.ts.map b/node_modules/@discordjs/builders/dist/interactions/slashCommands/options/role.d.ts.map
new file mode 100644
index 0000000..c4efc7a
--- /dev/null
+++ b/node_modules/@discordjs/builders/dist/interactions/slashCommands/options/role.d.ts.map
@@ -0,0 +1 @@
+{"version":3,"file":"role.d.ts","sourceRoot":"/","sources":["interactions/slashCommands/options/role.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,4BAA4B,EAAE,MAAM,sBAAsB,CAAC;AACpE,OAAO,EAAE,sBAAsB,EAAE,MAAM,6BAA6B,CAAC;AAErE,qBAAa,sBAAuB,SAAQ,sBAAsB;IACjE,SAAyB,IAAI,oCAA8C;;CAK3E"}
\ No newline at end of file
diff --git a/node_modules/@discordjs/builders/dist/interactions/slashCommands/options/role.js b/node_modules/@discordjs/builders/dist/interactions/slashCommands/options/role.js
new file mode 100644
index 0000000..a01871a
--- /dev/null
+++ b/node_modules/@discordjs/builders/dist/interactions/slashCommands/options/role.js
@@ -0,0 +1,18 @@
+"use strict";
+Object.defineProperty(exports, "__esModule", { value: true });
+exports.SlashCommandRoleOption = void 0;
+require("discord-api-types/v9");
+const CommandOptionBase_1 = require("../mixins/CommandOptionBase");
+class SlashCommandRoleOption extends CommandOptionBase_1.SlashCommandOptionBase {
+ constructor() {
+ super(8 /* Role */);
+ Object.defineProperty(this, "type", {
+ enumerable: true,
+ configurable: true,
+ writable: true,
+ value: 8 /* Role */
+ });
+ }
+}
+exports.SlashCommandRoleOption = SlashCommandRoleOption;
+//# sourceMappingURL=role.js.map
\ No newline at end of file
diff --git a/node_modules/@discordjs/builders/dist/interactions/slashCommands/options/role.js.map b/node_modules/@discordjs/builders/dist/interactions/slashCommands/options/role.js.map
new file mode 100644
index 0000000..d901da3
--- /dev/null
+++ b/node_modules/@discordjs/builders/dist/interactions/slashCommands/options/role.js.map
@@ -0,0 +1 @@
+{"version":3,"file":"role.js","sourceRoot":"/","sources":["interactions/slashCommands/options/role.ts"],"names":[],"mappings":";;;AAAA,gCAAoE;AACpE,mEAAqE;AAErE,MAAa,sBAAuB,SAAQ,0CAAsB;IAGjE;QACC,KAAK,cAAmC,CAAC;QAH1C;;;;mBAAgC,YAA0C;WAAC;IAI3E,CAAC;CACD;AAND,wDAMC","sourcesContent":["import { ApplicationCommandOptionType } from 'discord-api-types/v9';\nimport { SlashCommandOptionBase } from '../mixins/CommandOptionBase';\n\nexport class SlashCommandRoleOption extends SlashCommandOptionBase {\n\tpublic override readonly type = ApplicationCommandOptionType.Role as const;\n\n\tpublic constructor() {\n\t\tsuper(ApplicationCommandOptionType.Role);\n\t}\n}\n"]}
\ No newline at end of file
diff --git a/node_modules/@discordjs/builders/dist/interactions/slashCommands/options/string.d.ts b/node_modules/@discordjs/builders/dist/interactions/slashCommands/options/string.d.ts
new file mode 100644
index 0000000..3141ee7
--- /dev/null
+++ b/node_modules/@discordjs/builders/dist/interactions/slashCommands/options/string.d.ts
@@ -0,0 +1,7 @@
+import { ApplicationCommandOptionType } from 'discord-api-types/v9';
+import { ApplicationCommandOptionWithChoicesBase } from '../mixins/CommandOptionWithChoices';
+export declare class SlashCommandStringOption extends ApplicationCommandOptionWithChoicesBase {
+ readonly type: ApplicationCommandOptionType.String;
+ constructor();
+}
+//# sourceMappingURL=string.d.ts.map
\ No newline at end of file
diff --git a/node_modules/@discordjs/builders/dist/interactions/slashCommands/options/string.d.ts.map b/node_modules/@discordjs/builders/dist/interactions/slashCommands/options/string.d.ts.map
new file mode 100644
index 0000000..cce8fc5
--- /dev/null
+++ b/node_modules/@discordjs/builders/dist/interactions/slashCommands/options/string.d.ts.map
@@ -0,0 +1 @@
+{"version":3,"file":"string.d.ts","sourceRoot":"/","sources":["interactions/slashCommands/options/string.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,4BAA4B,EAAE,MAAM,sBAAsB,CAAC;AACpE,OAAO,EAAE,uCAAuC,EAAE,MAAM,oCAAoC,CAAC;AAE7F,qBAAa,wBAAyB,SAAQ,uCAAuC,CAAC,MAAM,CAAC;IAC5F,SAAyB,IAAI,sCAAgD;;CAK7E"}
\ No newline at end of file
diff --git a/node_modules/@discordjs/builders/dist/interactions/slashCommands/options/string.js b/node_modules/@discordjs/builders/dist/interactions/slashCommands/options/string.js
new file mode 100644
index 0000000..8578f86
--- /dev/null
+++ b/node_modules/@discordjs/builders/dist/interactions/slashCommands/options/string.js
@@ -0,0 +1,18 @@
+"use strict";
+Object.defineProperty(exports, "__esModule", { value: true });
+exports.SlashCommandStringOption = void 0;
+require("discord-api-types/v9");
+const CommandOptionWithChoices_1 = require("../mixins/CommandOptionWithChoices");
+class SlashCommandStringOption extends CommandOptionWithChoices_1.ApplicationCommandOptionWithChoicesBase {
+ constructor() {
+ super(3 /* String */);
+ Object.defineProperty(this, "type", {
+ enumerable: true,
+ configurable: true,
+ writable: true,
+ value: 3 /* String */
+ });
+ }
+}
+exports.SlashCommandStringOption = SlashCommandStringOption;
+//# sourceMappingURL=string.js.map
\ No newline at end of file
diff --git a/node_modules/@discordjs/builders/dist/interactions/slashCommands/options/string.js.map b/node_modules/@discordjs/builders/dist/interactions/slashCommands/options/string.js.map
new file mode 100644
index 0000000..68eac55
--- /dev/null
+++ b/node_modules/@discordjs/builders/dist/interactions/slashCommands/options/string.js.map
@@ -0,0 +1 @@
+{"version":3,"file":"string.js","sourceRoot":"/","sources":["interactions/slashCommands/options/string.ts"],"names":[],"mappings":";;;AAAA,gCAAoE;AACpE,iFAA6F;AAE7F,MAAa,wBAAyB,SAAQ,kEAA+C;IAG5F;QACC,KAAK,gBAAqC,CAAC;QAH5C;;;;mBAAgC,cAA4C;WAAC;IAI7E,CAAC;CACD;AAND,4DAMC","sourcesContent":["import { ApplicationCommandOptionType } from 'discord-api-types/v9';\nimport { ApplicationCommandOptionWithChoicesBase } from '../mixins/CommandOptionWithChoices';\n\nexport class SlashCommandStringOption extends ApplicationCommandOptionWithChoicesBase {\n\tpublic override readonly type = ApplicationCommandOptionType.String as const;\n\n\tpublic constructor() {\n\t\tsuper(ApplicationCommandOptionType.String);\n\t}\n}\n"]}
\ No newline at end of file
diff --git a/node_modules/@discordjs/builders/dist/interactions/slashCommands/options/user.d.ts b/node_modules/@discordjs/builders/dist/interactions/slashCommands/options/user.d.ts
new file mode 100644
index 0000000..341727c
--- /dev/null
+++ b/node_modules/@discordjs/builders/dist/interactions/slashCommands/options/user.d.ts
@@ -0,0 +1,7 @@
+import { ApplicationCommandOptionType } from 'discord-api-types/v9';
+import { SlashCommandOptionBase } from '../mixins/CommandOptionBase';
+export declare class SlashCommandUserOption extends SlashCommandOptionBase {
+ readonly type: ApplicationCommandOptionType.User;
+ constructor();
+}
+//# sourceMappingURL=user.d.ts.map
\ No newline at end of file
diff --git a/node_modules/@discordjs/builders/dist/interactions/slashCommands/options/user.d.ts.map b/node_modules/@discordjs/builders/dist/interactions/slashCommands/options/user.d.ts.map
new file mode 100644
index 0000000..9947f56
--- /dev/null
+++ b/node_modules/@discordjs/builders/dist/interactions/slashCommands/options/user.d.ts.map
@@ -0,0 +1 @@
+{"version":3,"file":"user.d.ts","sourceRoot":"/","sources":["interactions/slashCommands/options/user.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,4BAA4B,EAAE,MAAM,sBAAsB,CAAC;AACpE,OAAO,EAAE,sBAAsB,EAAE,MAAM,6BAA6B,CAAC;AAErE,qBAAa,sBAAuB,SAAQ,sBAAsB;IACjE,SAAyB,IAAI,oCAA8C;;CAK3E"}
\ No newline at end of file
diff --git a/node_modules/@discordjs/builders/dist/interactions/slashCommands/options/user.js b/node_modules/@discordjs/builders/dist/interactions/slashCommands/options/user.js
new file mode 100644
index 0000000..d4922ad
--- /dev/null
+++ b/node_modules/@discordjs/builders/dist/interactions/slashCommands/options/user.js
@@ -0,0 +1,18 @@
+"use strict";
+Object.defineProperty(exports, "__esModule", { value: true });
+exports.SlashCommandUserOption = void 0;
+require("discord-api-types/v9");
+const CommandOptionBase_1 = require("../mixins/CommandOptionBase");
+class SlashCommandUserOption extends CommandOptionBase_1.SlashCommandOptionBase {
+ constructor() {
+ super(6 /* User */);
+ Object.defineProperty(this, "type", {
+ enumerable: true,
+ configurable: true,
+ writable: true,
+ value: 6 /* User */
+ });
+ }
+}
+exports.SlashCommandUserOption = SlashCommandUserOption;
+//# sourceMappingURL=user.js.map
\ No newline at end of file
diff --git a/node_modules/@discordjs/builders/dist/interactions/slashCommands/options/user.js.map b/node_modules/@discordjs/builders/dist/interactions/slashCommands/options/user.js.map
new file mode 100644
index 0000000..44bad52
--- /dev/null
+++ b/node_modules/@discordjs/builders/dist/interactions/slashCommands/options/user.js.map
@@ -0,0 +1 @@
+{"version":3,"file":"user.js","sourceRoot":"/","sources":["interactions/slashCommands/options/user.ts"],"names":[],"mappings":";;;AAAA,gCAAoE;AACpE,mEAAqE;AAErE,MAAa,sBAAuB,SAAQ,0CAAsB;IAGjE;QACC,KAAK,cAAmC,CAAC;QAH1C;;;;mBAAgC,YAA0C;WAAC;IAI3E,CAAC;CACD;AAND,wDAMC","sourcesContent":["import { ApplicationCommandOptionType } from 'discord-api-types/v9';\nimport { SlashCommandOptionBase } from '../mixins/CommandOptionBase';\n\nexport class SlashCommandUserOption extends SlashCommandOptionBase {\n\tpublic override readonly type = ApplicationCommandOptionType.User as const;\n\n\tpublic constructor() {\n\t\tsuper(ApplicationCommandOptionType.User);\n\t}\n}\n"]}
\ No newline at end of file
diff --git a/node_modules/@discordjs/builders/dist/messages/formatters.d.ts b/node_modules/@discordjs/builders/dist/messages/formatters.d.ts
new file mode 100644
index 0000000..fbe14af
--- /dev/null
+++ b/node_modules/@discordjs/builders/dist/messages/formatters.d.ts
@@ -0,0 +1,220 @@
+///
+import type { Snowflake } from 'discord-api-types/globals';
+import type { URL } from 'url';
+/**
+ * Wraps the content inside a codeblock with no language.
+ * @param content The content to wrap.
+ * @returns The formatted content.
+ */
+export declare function codeBlock(content: C): `\`\`\`\n${C}\`\`\``;
+/**
+ * Wraps the content inside a codeblock with the specified language.
+ * @param language The language for the codeblock.
+ * @param content The content to wrap.
+ * @returns The formatted content.
+ */
+export declare function codeBlock(language: L, content: C): `\`\`\`${L}\n${C}\`\`\``;
+/**
+ * Wraps the content inside \`backticks\`, which formats it as inline code.
+ * @param content The content to wrap.
+ * @returns The formatted content.
+ */
+export declare function inlineCode(content: C): `\`${C}\``;
+/**
+ * Formats the content into italic text.
+ * @param content The content to wrap.
+ * @returns The formatted content.
+ */
+export declare function italic(content: C): `_${C}_`;
+/**
+ * Formats the content into bold text.
+ * @param content The content to wrap.
+ * @returns The formatted content.
+ */
+export declare function bold(content: C): `**${C}**`;
+/**
+ * Formats the content into underscored text.
+ * @param content The content to wrap.
+ * @returns The formatted content.
+ */
+export declare function underscore(content: C): `__${C}__`;
+/**
+ * Formats the content into strike-through text.
+ * @param content The content to wrap.
+ * @returns The formatted content.
+ */
+export declare function strikethrough(content: C): `~~${C}~~`;
+/**
+ * Formats the content into a quote. This needs to be at the start of the line for Discord to format it.
+ * @param content The content to wrap.
+ * @returns The formatted content.
+ */
+export declare function quote(content: C): `> ${C}`;
+/**
+ * Formats the content into a block quote. This needs to be at the start of the line for Discord to format it.
+ * @param content The content to wrap.
+ * @returns The formatted content.
+ */
+export declare function blockQuote(content: C): `>>> ${C}`;
+/**
+ * Wraps the URL into `<>`, which stops it from embedding.
+ * @param url The URL to wrap.
+ * @returns The formatted content.
+ */
+export declare function hideLinkEmbed(url: C): `<${C}>`;
+/**
+ * Wraps the URL into `<>`, which stops it from embedding.
+ * @param url The URL to wrap.
+ * @returns The formatted content.
+ */
+export declare function hideLinkEmbed(url: URL): `<${string}>`;
+/**
+ * Formats the content and the URL into a masked URL.
+ * @param content The content to display.
+ * @param url The URL the content links to.
+ * @returns The formatted content.
+ */
+export declare function hyperlink(content: C, url: URL): `[${C}](${string})`;
+/**
+ * Formats the content and the URL into a masked URL.
+ * @param content The content to display.
+ * @param url The URL the content links to.
+ * @returns The formatted content.
+ */
+export declare function hyperlink(content: C, url: U): `[${C}](${U})`;
+/**
+ * Formats the content and the URL into a masked URL.
+ * @param content The content to display.
+ * @param url The URL the content links to.
+ * @param title The title shown when hovering on the masked link.
+ * @returns The formatted content.
+ */
+export declare function hyperlink(content: C, url: URL, title: T): `[${C}](${string} "${T}")`;
+/**
+ * Formats the content and the URL into a masked URL.
+ * @param content The content to display.
+ * @param url The URL the content links to.
+ * @param title The title shown when hovering on the masked link.
+ * @returns The formatted content.
+ */
+export declare function hyperlink(content: C, url: U, title: T): `[${C}](${U} "${T}")`;
+/**
+ * Wraps the content inside spoiler (hidden text).
+ * @param content The content to wrap.
+ * @returns The formatted content.
+ */
+export declare function spoiler(content: C): `||${C}||`;
+/**
+ * Formats a user ID into a user mention.
+ * @param userId The user ID to format.
+ * @returns The formatted user mention.
+ */
+export declare function userMention(userId: C): `<@${C}>`;
+/**
+ * Formats a user ID into a member-nickname mention.
+ * @param memberId The user ID to format.
+ * @returns The formatted member-nickname mention.
+ */
+export declare function memberNicknameMention(memberId: C): `<@!${C}>`;
+/**
+ * Formats a channel ID into a channel mention.
+ * @param channelId The channel ID to format.
+ * @returns The formatted channel mention.
+ */
+export declare function channelMention(channelId: C): `<#${C}>`;
+/**
+ * Formats a role ID into a role mention.
+ * @param roleId The role ID to format.
+ * @returns The formatted role mention.
+ */
+export declare function roleMention(roleId: C): `<@&${C}>`;
+/**
+ * Formats an emoji ID into a fully qualified emoji identifier
+ * @param emojiId The emoji ID to format.
+ * @returns The formatted emoji.
+ */
+export declare function formatEmoji(emojiId: C, animated?: false): `<:_:${C}>`;
+/**
+ * Formats an emoji ID into a fully qualified emoji identifier
+ * @param emojiId The emoji ID to format.
+ * @param animated Whether the emoji is animated or not. Defaults to `false`
+ * @returns The formatted emoji.
+ */
+export declare function formatEmoji(emojiId: C, animated?: true): ``;
+/**
+ * Formats a date into a short date-time string.
+ * @param date The date to format, defaults to the current time.
+ */
+export declare function time(date?: Date): ``;
+/**
+ * Formats a date given a format style.
+ * @param date The date to format.
+ * @param style The style to use.
+ */
+export declare function time(date: Date, style: S): ``;
+/**
+ * Formats the given timestamp into a short date-time string.
+ * @param seconds The time to format, represents an UNIX timestamp in seconds.
+ */
+export declare function time(seconds: C): ``;
+/**
+ * Formats the given timestamp into a short date-time string.
+ * @param seconds The time to format, represents an UNIX timestamp in seconds.
+ * @param style The style to use.
+ */
+export declare function time(seconds: C, style: S): ``;
+/**
+ * The [message formatting timestamp styles](https://discord.com/developers/docs/reference#message-formatting-timestamp-styles) supported by Discord.
+ */
+export declare const TimestampStyles: {
+ /**
+ * Short time format, consisting of hours and minutes, e.g. 16:20.
+ */
+ readonly ShortTime: "t";
+ /**
+ * Long time format, consisting of hours, minutes, and seconds, e.g. 16:20:30.
+ */
+ readonly LongTime: "T";
+ /**
+ * Short date format, consisting of day, month, and year, e.g. 20/04/2021.
+ */
+ readonly ShortDate: "d";
+ /**
+ * Long date format, consisting of day, month, and year, e.g. 20 April 2021.
+ */
+ readonly LongDate: "D";
+ /**
+ * Short date-time format, consisting of short date and short time formats, e.g. 20 April 2021 16:20.
+ */
+ readonly ShortDateTime: "f";
+ /**
+ * Long date-time format, consisting of long date and short time formats, e.g. Tuesday, 20 April 2021 16:20.
+ */
+ readonly LongDateTime: "F";
+ /**
+ * Relative time format, consisting of a relative duration format, e.g. 2 months ago.
+ */
+ readonly RelativeTime: "R";
+};
+/**
+ * The possible values, see {@link TimestampStyles} for more information.
+ */
+export declare type TimestampStylesString = typeof TimestampStyles[keyof typeof TimestampStyles];
+/**
+ * An enum with all the available faces from Discord's native slash commands
+ */
+export declare enum Faces {
+ /**
+ * ¯\\_(ツ)\\_/¯
+ */
+ Shrug = "\u00AF\\_(\u30C4)\\_/\u00AF",
+ /**
+ * (╯°□°)╯︵ ┻━┻
+ */
+ Tableflip = "(\u256F\u00B0\u25A1\u00B0\uFF09\u256F\uFE35 \u253B\u2501\u253B",
+ /**
+ * ┬─┬ ノ( ゜-゜ノ)
+ */
+ Unflip = "\u252C\u2500\u252C \u30CE( \u309C-\u309C\u30CE)"
+}
+//# sourceMappingURL=formatters.d.ts.map
\ No newline at end of file
diff --git a/node_modules/@discordjs/builders/dist/messages/formatters.d.ts.map b/node_modules/@discordjs/builders/dist/messages/formatters.d.ts.map
new file mode 100644
index 0000000..2ece71d
--- /dev/null
+++ b/node_modules/@discordjs/builders/dist/messages/formatters.d.ts.map
@@ -0,0 +1 @@
+{"version":3,"file":"formatters.d.ts","sourceRoot":"/","sources":["messages/formatters.ts"],"names":[],"mappings":"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"}
\ No newline at end of file
diff --git a/node_modules/@discordjs/builders/dist/messages/formatters.js b/node_modules/@discordjs/builders/dist/messages/formatters.js
new file mode 100644
index 0000000..4d3b467
--- /dev/null
+++ b/node_modules/@discordjs/builders/dist/messages/formatters.js
@@ -0,0 +1,194 @@
+"use strict";
+Object.defineProperty(exports, "__esModule", { value: true });
+exports.Faces = exports.TimestampStyles = exports.time = exports.formatEmoji = exports.roleMention = exports.channelMention = exports.memberNicknameMention = exports.userMention = exports.spoiler = exports.hyperlink = exports.hideLinkEmbed = exports.blockQuote = exports.quote = exports.strikethrough = exports.underscore = exports.bold = exports.italic = exports.inlineCode = exports.codeBlock = void 0;
+function codeBlock(language, content) {
+ return typeof content === 'undefined' ? `\`\`\`\n${language}\`\`\`` : `\`\`\`${language}\n${content}\`\`\``;
+}
+exports.codeBlock = codeBlock;
+/**
+ * Wraps the content inside \`backticks\`, which formats it as inline code.
+ * @param content The content to wrap.
+ * @returns The formatted content.
+ */
+function inlineCode(content) {
+ return `\`${content}\``;
+}
+exports.inlineCode = inlineCode;
+/**
+ * Formats the content into italic text.
+ * @param content The content to wrap.
+ * @returns The formatted content.
+ */
+function italic(content) {
+ return `_${content}_`;
+}
+exports.italic = italic;
+/**
+ * Formats the content into bold text.
+ * @param content The content to wrap.
+ * @returns The formatted content.
+ */
+function bold(content) {
+ return `**${content}**`;
+}
+exports.bold = bold;
+/**
+ * Formats the content into underscored text.
+ * @param content The content to wrap.
+ * @returns The formatted content.
+ */
+function underscore(content) {
+ return `__${content}__`;
+}
+exports.underscore = underscore;
+/**
+ * Formats the content into strike-through text.
+ * @param content The content to wrap.
+ * @returns The formatted content.
+ */
+function strikethrough(content) {
+ return `~~${content}~~`;
+}
+exports.strikethrough = strikethrough;
+/**
+ * Formats the content into a quote. This needs to be at the start of the line for Discord to format it.
+ * @param content The content to wrap.
+ * @returns The formatted content.
+ */
+function quote(content) {
+ return `> ${content}`;
+}
+exports.quote = quote;
+/**
+ * Formats the content into a block quote. This needs to be at the start of the line for Discord to format it.
+ * @param content The content to wrap.
+ * @returns The formatted content.
+ */
+function blockQuote(content) {
+ return `>>> ${content}`;
+}
+exports.blockQuote = blockQuote;
+function hideLinkEmbed(url) {
+ // eslint-disable-next-line @typescript-eslint/restrict-template-expressions
+ return `<${url}>`;
+}
+exports.hideLinkEmbed = hideLinkEmbed;
+function hyperlink(content, url, title) {
+ // eslint-disable-next-line @typescript-eslint/restrict-template-expressions
+ return title ? `[${content}](${url} "${title}")` : `[${content}](${url})`;
+}
+exports.hyperlink = hyperlink;
+/**
+ * Wraps the content inside spoiler (hidden text).
+ * @param content The content to wrap.
+ * @returns The formatted content.
+ */
+function spoiler(content) {
+ return `||${content}||`;
+}
+exports.spoiler = spoiler;
+/**
+ * Formats a user ID into a user mention.
+ * @param userId The user ID to format.
+ * @returns The formatted user mention.
+ */
+function userMention(userId) {
+ return `<@${userId}>`;
+}
+exports.userMention = userMention;
+/**
+ * Formats a user ID into a member-nickname mention.
+ * @param memberId The user ID to format.
+ * @returns The formatted member-nickname mention.
+ */
+function memberNicknameMention(memberId) {
+ return `<@!${memberId}>`;
+}
+exports.memberNicknameMention = memberNicknameMention;
+/**
+ * Formats a channel ID into a channel mention.
+ * @param channelId The channel ID to format.
+ * @returns The formatted channel mention.
+ */
+function channelMention(channelId) {
+ return `<#${channelId}>`;
+}
+exports.channelMention = channelMention;
+/**
+ * Formats a role ID into a role mention.
+ * @param roleId The role ID to format.
+ * @returns The formatted role mention.
+ */
+function roleMention(roleId) {
+ return `<@&${roleId}>`;
+}
+exports.roleMention = roleMention;
+/**
+ * Formats an emoji ID into a fully qualified emoji identifier
+ * @param emojiId The emoji ID to format.
+ * @param animated Whether the emoji is animated or not. Defaults to `false`
+ * @returns The formatted emoji.
+ */
+function formatEmoji(emojiId, animated = false) {
+ return `<${animated ? 'a' : ''}:_:${emojiId}>`;
+}
+exports.formatEmoji = formatEmoji;
+function time(timeOrSeconds, style) {
+ if (typeof timeOrSeconds !== 'number') {
+ timeOrSeconds = Math.floor((timeOrSeconds?.getTime() ?? Date.now()) / 1000);
+ }
+ return typeof style === 'string' ? `` : ``;
+}
+exports.time = time;
+/**
+ * The [message formatting timestamp styles](https://discord.com/developers/docs/reference#message-formatting-timestamp-styles) supported by Discord.
+ */
+exports.TimestampStyles = {
+ /**
+ * Short time format, consisting of hours and minutes, e.g. 16:20.
+ */
+ ShortTime: 't',
+ /**
+ * Long time format, consisting of hours, minutes, and seconds, e.g. 16:20:30.
+ */
+ LongTime: 'T',
+ /**
+ * Short date format, consisting of day, month, and year, e.g. 20/04/2021.
+ */
+ ShortDate: 'd',
+ /**
+ * Long date format, consisting of day, month, and year, e.g. 20 April 2021.
+ */
+ LongDate: 'D',
+ /**
+ * Short date-time format, consisting of short date and short time formats, e.g. 20 April 2021 16:20.
+ */
+ ShortDateTime: 'f',
+ /**
+ * Long date-time format, consisting of long date and short time formats, e.g. Tuesday, 20 April 2021 16:20.
+ */
+ LongDateTime: 'F',
+ /**
+ * Relative time format, consisting of a relative duration format, e.g. 2 months ago.
+ */
+ RelativeTime: 'R',
+};
+/**
+ * An enum with all the available faces from Discord's native slash commands
+ */
+var Faces;
+(function (Faces) {
+ /**
+ * ¯\\_(ツ)\\_/¯
+ */
+ Faces["Shrug"] = "\u00AF\\_(\u30C4)\\_/\u00AF";
+ /**
+ * (╯°□°)╯︵ ┻━┻
+ */
+ Faces["Tableflip"] = "(\u256F\u00B0\u25A1\u00B0\uFF09\u256F\uFE35 \u253B\u2501\u253B";
+ /**
+ * ┬─┬ ノ( ゜-゜ノ)
+ */
+ Faces["Unflip"] = "\u252C\u2500\u252C \u30CE( \u309C-\u309C\u30CE)";
+})(Faces = exports.Faces || (exports.Faces = {}));
+//# sourceMappingURL=formatters.js.map
\ No newline at end of file
diff --git a/node_modules/@discordjs/builders/dist/messages/formatters.js.map b/node_modules/@discordjs/builders/dist/messages/formatters.js.map
new file mode 100644
index 0000000..86b5226
--- /dev/null
+++ b/node_modules/@discordjs/builders/dist/messages/formatters.js.map
@@ -0,0 +1 @@
+{"version":3,"file":"formatters.js","sourceRoot":"/","sources":["messages/formatters.ts"],"names":[],"mappings":"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","sourcesContent":["import type { Snowflake } from 'discord-api-types/globals';\nimport type { URL } from 'url';\n\n/**\n * Wraps the content inside a codeblock with no language.\n * @param content The content to wrap.\n * @returns The formatted content.\n */\nexport function codeBlock(content: C): `\\`\\`\\`\\n${C}\\`\\`\\``;\n\n/**\n * Wraps the content inside a codeblock with the specified language.\n * @param language The language for the codeblock.\n * @param content The content to wrap.\n * @returns The formatted content.\n */\nexport function codeBlock(language: L, content: C): `\\`\\`\\`${L}\\n${C}\\`\\`\\``;\nexport function codeBlock(language: string, content?: string): string {\n\treturn typeof content === 'undefined' ? `\\`\\`\\`\\n${language}\\`\\`\\`` : `\\`\\`\\`${language}\\n${content}\\`\\`\\``;\n}\n\n/**\n * Wraps the content inside \\`backticks\\`, which formats it as inline code.\n * @param content The content to wrap.\n * @returns The formatted content.\n */\nexport function inlineCode(content: C): `\\`${C}\\`` {\n\treturn `\\`${content}\\``;\n}\n\n/**\n * Formats the content into italic text.\n * @param content The content to wrap.\n * @returns The formatted content.\n */\nexport function italic(content: C): `_${C}_` {\n\treturn `_${content}_`;\n}\n\n/**\n * Formats the content into bold text.\n * @param content The content to wrap.\n * @returns The formatted content.\n */\nexport function bold(content: C): `**${C}**` {\n\treturn `**${content}**`;\n}\n\n/**\n * Formats the content into underscored text.\n * @param content The content to wrap.\n * @returns The formatted content.\n */\nexport function underscore(content: C): `__${C}__` {\n\treturn `__${content}__`;\n}\n\n/**\n * Formats the content into strike-through text.\n * @param content The content to wrap.\n * @returns The formatted content.\n */\nexport function strikethrough(content: C): `~~${C}~~` {\n\treturn `~~${content}~~`;\n}\n\n/**\n * Formats the content into a quote. This needs to be at the start of the line for Discord to format it.\n * @param content The content to wrap.\n * @returns The formatted content.\n */\nexport function quote(content: C): `> ${C}` {\n\treturn `> ${content}`;\n}\n\n/**\n * Formats the content into a block quote. This needs to be at the start of the line for Discord to format it.\n * @param content The content to wrap.\n * @returns The formatted content.\n */\nexport function blockQuote(content: C): `>>> ${C}` {\n\treturn `>>> ${content}`;\n}\n\n/**\n * Wraps the URL into `<>`, which stops it from embedding.\n * @param url The URL to wrap.\n * @returns The formatted content.\n */\nexport function hideLinkEmbed(url: C): `<${C}>`;\n\n/**\n * Wraps the URL into `<>`, which stops it from embedding.\n * @param url The URL to wrap.\n * @returns The formatted content.\n */\nexport function hideLinkEmbed(url: URL): `<${string}>`;\nexport function hideLinkEmbed(url: string | URL) {\n\t// eslint-disable-next-line @typescript-eslint/restrict-template-expressions\n\treturn `<${url}>`;\n}\n\n/**\n * Formats the content and the URL into a masked URL.\n * @param content The content to display.\n * @param url The URL the content links to.\n * @returns The formatted content.\n */\nexport function hyperlink(content: C, url: URL): `[${C}](${string})`;\n\n/**\n * Formats the content and the URL into a masked URL.\n * @param content The content to display.\n * @param url The URL the content links to.\n * @returns The formatted content.\n */\nexport function hyperlink(content: C, url: U): `[${C}](${U})`;\n\n/**\n * Formats the content and the URL into a masked URL.\n * @param content The content to display.\n * @param url The URL the content links to.\n * @param title The title shown when hovering on the masked link.\n * @returns The formatted content.\n */\nexport function hyperlink(\n\tcontent: C,\n\turl: URL,\n\ttitle: T,\n): `[${C}](${string} \"${T}\")`;\n\n/**\n * Formats the content and the URL into a masked URL.\n * @param content The content to display.\n * @param url The URL the content links to.\n * @param title The title shown when hovering on the masked link.\n * @returns The formatted content.\n */\nexport function hyperlink(\n\tcontent: C,\n\turl: U,\n\ttitle: T,\n): `[${C}](${U} \"${T}\")`;\nexport function hyperlink(content: string, url: string | URL, title?: string) {\n\t// eslint-disable-next-line @typescript-eslint/restrict-template-expressions\n\treturn title ? `[${content}](${url} \"${title}\")` : `[${content}](${url})`;\n}\n\n/**\n * Wraps the content inside spoiler (hidden text).\n * @param content The content to wrap.\n * @returns The formatted content.\n */\nexport function spoiler(content: C): `||${C}||` {\n\treturn `||${content}||`;\n}\n\n/**\n * Formats a user ID into a user mention.\n * @param userId The user ID to format.\n * @returns The formatted user mention.\n */\nexport function userMention(userId: C): `<@${C}>` {\n\treturn `<@${userId}>`;\n}\n\n/**\n * Formats a user ID into a member-nickname mention.\n * @param memberId The user ID to format.\n * @returns The formatted member-nickname mention.\n */\nexport function memberNicknameMention(memberId: C): `<@!${C}>` {\n\treturn `<@!${memberId}>`;\n}\n\n/**\n * Formats a channel ID into a channel mention.\n * @param channelId The channel ID to format.\n * @returns The formatted channel mention.\n */\nexport function channelMention(channelId: C): `<#${C}>` {\n\treturn `<#${channelId}>`;\n}\n\n/**\n * Formats a role ID into a role mention.\n * @param roleId The role ID to format.\n * @returns The formatted role mention.\n */\nexport function roleMention(roleId: C): `<@&${C}>` {\n\treturn `<@&${roleId}>`;\n}\n\n/**\n * Formats an emoji ID into a fully qualified emoji identifier\n * @param emojiId The emoji ID to format.\n * @returns The formatted emoji.\n */\nexport function formatEmoji(emojiId: C, animated?: false): `<:_:${C}>`;\n\n/**\n * Formats an emoji ID into a fully qualified emoji identifier\n * @param emojiId The emoji ID to format.\n * @param animated Whether the emoji is animated or not. Defaults to `false`\n * @returns The formatted emoji.\n */\nexport function formatEmoji(emojiId: C, animated?: true): ``;\n\n/**\n * Formats an emoji ID into a fully qualified emoji identifier\n * @param emojiId The emoji ID to format.\n * @param animated Whether the emoji is animated or not. Defaults to `false`\n * @returns The formatted emoji.\n */\nexport function formatEmoji(emojiId: C, animated = false): `` | `<:_:${C}>` {\n\treturn `<${animated ? 'a' : ''}:_:${emojiId}>`;\n}\n\n/**\n * Formats a date into a short date-time string.\n * @param date The date to format, defaults to the current time.\n */\nexport function time(date?: Date): ``;\n\n/**\n * Formats a date given a format style.\n * @param date The date to format.\n * @param style The style to use.\n */\nexport function time(date: Date, style: S): ``;\n\n/**\n * Formats the given timestamp into a short date-time string.\n * @param seconds The time to format, represents an UNIX timestamp in seconds.\n */\nexport function time(seconds: C): ``;\n\n/**\n * Formats the given timestamp into a short date-time string.\n * @param seconds The time to format, represents an UNIX timestamp in seconds.\n * @param style The style to use.\n */\nexport function time(seconds: C, style: S): ``;\nexport function time(timeOrSeconds?: number | Date, style?: TimestampStylesString): string {\n\tif (typeof timeOrSeconds !== 'number') {\n\t\ttimeOrSeconds = Math.floor((timeOrSeconds?.getTime() ?? Date.now()) / 1000);\n\t}\n\n\treturn typeof style === 'string' ? `` : ``;\n}\n\n/**\n * The [message formatting timestamp styles](https://discord.com/developers/docs/reference#message-formatting-timestamp-styles) supported by Discord.\n */\nexport const TimestampStyles = {\n\t/**\n\t * Short time format, consisting of hours and minutes, e.g. 16:20.\n\t */\n\tShortTime: 't',\n\n\t/**\n\t * Long time format, consisting of hours, minutes, and seconds, e.g. 16:20:30.\n\t */\n\tLongTime: 'T',\n\n\t/**\n\t * Short date format, consisting of day, month, and year, e.g. 20/04/2021.\n\t */\n\tShortDate: 'd',\n\n\t/**\n\t * Long date format, consisting of day, month, and year, e.g. 20 April 2021.\n\t */\n\tLongDate: 'D',\n\n\t/**\n\t * Short date-time format, consisting of short date and short time formats, e.g. 20 April 2021 16:20.\n\t */\n\tShortDateTime: 'f',\n\n\t/**\n\t * Long date-time format, consisting of long date and short time formats, e.g. Tuesday, 20 April 2021 16:20.\n\t */\n\tLongDateTime: 'F',\n\n\t/**\n\t * Relative time format, consisting of a relative duration format, e.g. 2 months ago.\n\t */\n\tRelativeTime: 'R',\n} as const;\n\n/**\n * The possible values, see {@link TimestampStyles} for more information.\n */\nexport type TimestampStylesString = typeof TimestampStyles[keyof typeof TimestampStyles];\n\n/**\n * An enum with all the available faces from Discord's native slash commands\n */\nexport enum Faces {\n\t/**\n\t * ¯\\\\_(ツ)\\\\_/¯\n\t */\n\tShrug = '¯\\\\_(ツ)\\\\_/¯',\n\n\t/**\n\t * (╯°□°)╯︵ ┻━┻\n\t */\n\tTableflip = '(╯°□°)╯︵ ┻━┻',\n\n\t/**\n\t * ┬─┬ ノ( ゜-゜ノ)\n\t */\n\tUnflip = '┬─┬ ノ( ゜-゜ノ)',\n}\n"]}
\ No newline at end of file
diff --git a/node_modules/@discordjs/builders/package.json b/node_modules/@discordjs/builders/package.json
new file mode 100644
index 0000000..f909c2e
--- /dev/null
+++ b/node_modules/@discordjs/builders/package.json
@@ -0,0 +1,86 @@
+{
+ "name": "@discordjs/builders",
+ "version": "0.5.0",
+ "description": "A set of builders that you can use when creating your bot.",
+ "main": "./dist/index.js",
+ "module": "./dist/index.mjs",
+ "types": "./dist/index.d.ts",
+ "exports": {
+ "require": "./dist/index.js",
+ "import": "./dist/index.mjs"
+ },
+ "scripts": {
+ "prebuild": "npm run clean",
+ "build": "tsc && gen-esm-wrapper ./dist/index.js ./dist/index.mjs",
+ "clean": "rimraf dist",
+ "lint": "eslint --ext mjs,ts src/**/*.ts",
+ "lint:fix": "eslint --fix --ext mjs,ts src/**/*.ts",
+ "prepare": "is-ci || husky install",
+ "prepublishOnly": "npm run lint && npm run test",
+ "pretest": "npm run build",
+ "test": "jest",
+ "test:ci": "jest --verbose --no-stack-trace",
+ "release": "standard-version --preset angular"
+ },
+ "repository": {
+ "type": "git",
+ "url": "https://github.com/discordjs/builders.git"
+ },
+ "keywords": [
+ "discord",
+ "api",
+ "bot",
+ "client",
+ "node",
+ "discordapp",
+ "discordjs"
+ ],
+ "author": "Vlad Frangu ",
+ "license": "Apache-2.0",
+ "files": [
+ "dist"
+ ],
+ "bugs": {
+ "url": "https://github.com/discordjs/builders/issues"
+ },
+ "homepage": "https://github.com/discordjs/builders#readme",
+ "dependencies": {
+ "@sindresorhus/is": "^4.0.1",
+ "discord-api-types": "^0.22.0",
+ "ow": "^0.27.0",
+ "ts-mixer": "^6.0.0",
+ "tslib": "^2.3.0"
+ },
+ "devDependencies": {
+ "@babel/core": "^7.15.0",
+ "@babel/plugin-proposal-decorators": "^7.14.5",
+ "@babel/preset-env": "^7.15.0",
+ "@babel/preset-typescript": "^7.15.0",
+ "@commitlint/cli": "^13.1.0",
+ "@commitlint/config-angular": "^13.1.0",
+ "@types/jest": "^26.0.24",
+ "@types/node": "^16.4.12",
+ "@typescript-eslint/eslint-plugin": "^4.29.0",
+ "@typescript-eslint/parser": "^4.29.0",
+ "babel-jest": "^27.0.6",
+ "babel-plugin-transform-typescript-metadata": "^0.3.2",
+ "eslint": "^7.32.0",
+ "eslint-config-marine": "^9.0.6",
+ "eslint-config-prettier": "^8.3.0",
+ "eslint-plugin-prettier": "^3.4.0",
+ "gen-esm-wrapper": "^1.1.2",
+ "husky": "^7.0.1",
+ "is-ci": "^3.0.0",
+ "jest": "^27.0.6",
+ "lint-staged": "^11.1.1",
+ "npm-run-all": "^4.1.5",
+ "prettier": "^2.3.2",
+ "rimraf": "^3.0.2",
+ "standard-version": "^9.3.1",
+ "typescript": "^4.3.5"
+ },
+ "engines": {
+ "node": ">=14.0.0",
+ "npm": ">=7.0.0"
+ }
+}
diff --git a/node_modules/@discordjs/collection/LICENSE b/node_modules/@discordjs/collection/LICENSE
new file mode 100644
index 0000000..414073d
--- /dev/null
+++ b/node_modules/@discordjs/collection/LICENSE
@@ -0,0 +1,190 @@
+ Apache License
+ Version 2.0, January 2004
+ http://www.apache.org/licenses/
+
+ TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
+
+ 1. Definitions.
+
+ "License" shall mean the terms and conditions for use, reproduction,
+ and distribution as defined by Sections 1 through 9 of this document.
+
+ "Licensor" shall mean the copyright owner or entity authorized by
+ the copyright owner that is granting the License.
+
+ "Legal Entity" shall mean the union of the acting entity and all
+ other entities that control, are controlled by, or are under common
+ control with that entity. For the purposes of this definition,
+ "control" means (i) the power, direct or indirect, to cause the
+ direction or management of such entity, whether by contract or
+ otherwise, or (ii) ownership of fifty percent (50%) or more of the
+ outstanding shares, or (iii) beneficial ownership of such entity.
+
+ "You" (or "Your") shall mean an individual or Legal Entity
+ exercising permissions granted by this License.
+
+ "Source" form shall mean the preferred form for making modifications,
+ including but not limited to software source code, documentation
+ source, and configuration files.
+
+ "Object" form shall mean any form resulting from mechanical
+ transformation or translation of a Source form, including but
+ not limited to compiled object code, generated documentation,
+ and conversions to other media types.
+
+ "Work" shall mean the work of authorship, whether in Source or
+ Object form, made available under the License, as indicated by a
+ copyright notice that is included in or attached to the work
+ (an example is provided in the Appendix below).
+
+ "Derivative Works" shall mean any work, whether in Source or Object
+ form, that is based on (or derived from) the Work and for which the
+ editorial revisions, annotations, elaborations, or other modifications
+ represent, as a whole, an original work of authorship. For the purposes
+ of this License, Derivative Works shall not include works that remain
+ separable from, or merely link (or bind by name) to the interfaces of,
+ the Work and Derivative Works thereof.
+
+ "Contribution" shall mean any work of authorship, including
+ the original version of the Work and any modifications or additions
+ to that Work or Derivative Works thereof, that is intentionally
+ submitted to Licensor for inclusion in the Work by the copyright owner
+ or by an individual or Legal Entity authorized to submit on behalf of
+ the copyright owner. For the purposes of this definition, "submitted"
+ means any form of electronic, verbal, or written communication sent
+ to the Licensor or its representatives, including but not limited to
+ communication on electronic mailing lists, source code control systems,
+ and issue tracking systems that are managed by, or on behalf of, the
+ Licensor for the purpose of discussing and improving the Work, but
+ excluding communication that is conspicuously marked or otherwise
+ designated in writing by the copyright owner as "Not a Contribution."
+
+ "Contributor" shall mean Licensor and any individual or Legal Entity
+ on behalf of whom a Contribution has been received by Licensor and
+ subsequently incorporated within the Work.
+
+ 2. Grant of Copyright License. Subject to the terms and conditions of
+ this License, each Contributor hereby grants to You a perpetual,
+ worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+ copyright license to reproduce, prepare Derivative Works of,
+ publicly display, publicly perform, sublicense, and distribute the
+ Work and such Derivative Works in Source or Object form.
+
+ 3. Grant of Patent License. Subject to the terms and conditions of
+ this License, each Contributor hereby grants to You a perpetual,
+ worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+ (except as stated in this section) patent license to make, have made,
+ use, offer to sell, sell, import, and otherwise transfer the Work,
+ where such license applies only to those patent claims licensable
+ by such Contributor that are necessarily infringed by their
+ Contribution(s) alone or by combination of their Contribution(s)
+ with the Work to which such Contribution(s) was submitted. If You
+ institute patent litigation against any entity (including a
+ cross-claim or counterclaim in a lawsuit) alleging that the Work
+ or a Contribution incorporated within the Work constitutes direct
+ or contributory patent infringement, then any patent licenses
+ granted to You under this License for that Work shall terminate
+ as of the date such litigation is filed.
+
+ 4. Redistribution. You may reproduce and distribute copies of the
+ Work or Derivative Works thereof in any medium, with or without
+ modifications, and in Source or Object form, provided that You
+ meet the following conditions:
+
+ (a) You must give any other recipients of the Work or
+ Derivative Works a copy of this License; and
+
+ (b) You must cause any modified files to carry prominent notices
+ stating that You changed the files; and
+
+ (c) You must retain, in the Source form of any Derivative Works
+ that You distribute, all copyright, patent, trademark, and
+ attribution notices from the Source form of the Work,
+ excluding those notices that do not pertain to any part of
+ the Derivative Works; and
+
+ (d) If the Work includes a "NOTICE" text file as part of its
+ distribution, then any Derivative Works that You distribute must
+ include a readable copy of the attribution notices contained
+ within such NOTICE file, excluding those notices that do not
+ pertain to any part of the Derivative Works, in at least one
+ of the following places: within a NOTICE text file distributed
+ as part of the Derivative Works; within the Source form or
+ documentation, if provided along with the Derivative Works; or,
+ within a display generated by the Derivative Works, if and
+ wherever such third-party notices normally appear. The contents
+ of the NOTICE file are for informational purposes only and
+ do not modify the License. You may add Your own attribution
+ notices within Derivative Works that You distribute, alongside
+ or as an addendum to the NOTICE text from the Work, provided
+ that such additional attribution notices cannot be construed
+ as modifying the License.
+
+ You may add Your own copyright statement to Your modifications and
+ may provide additional or different license terms and conditions
+ for use, reproduction, or distribution of Your modifications, or
+ for any such Derivative Works as a whole, provided Your use,
+ reproduction, and distribution of the Work otherwise complies with
+ the conditions stated in this License.
+
+ 5. Submission of Contributions. Unless You explicitly state otherwise,
+ any Contribution intentionally submitted for inclusion in the Work
+ by You to the Licensor shall be under the terms and conditions of
+ this License, without any additional terms or conditions.
+ Notwithstanding the above, nothing herein shall supersede or modify
+ the terms of any separate license agreement you may have executed
+ with Licensor regarding such Contributions.
+
+ 6. Trademarks. This License does not grant permission to use the trade
+ names, trademarks, service marks, or product names of the Licensor,
+ except as required for reasonable and customary use in describing the
+ origin of the Work and reproducing the content of the NOTICE file.
+
+ 7. Disclaimer of Warranty. Unless required by applicable law or
+ agreed to in writing, Licensor provides the Work (and each
+ Contributor provides its Contributions) on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
+ implied, including, without limitation, any warranties or conditions
+ of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
+ PARTICULAR PURPOSE. You are solely responsible for determining the
+ appropriateness of using or redistributing the Work and assume any
+ risks associated with Your exercise of permissions under this License.
+
+ 8. Limitation of Liability. In no event and under no legal theory,
+ whether in tort (including negligence), contract, or otherwise,
+ unless required by applicable law (such as deliberate and grossly
+ negligent acts) or agreed to in writing, shall any Contributor be
+ liable to You for damages, including any direct, indirect, special,
+ incidental, or consequential damages of any character arising as a
+ result of this License or out of the use or inability to use the
+ Work (including but not limited to damages for loss of goodwill,
+ work stoppage, computer failure or malfunction, or any and all
+ other commercial damages or losses), even if such Contributor
+ has been advised of the possibility of such damages.
+
+ 9. Accepting Warranty or Additional Liability. While redistributing
+ the Work or Derivative Works thereof, You may choose to offer,
+ and charge a fee for, acceptance of support, warranty, indemnity,
+ or other liability obligations and/or rights consistent with this
+ License. However, in accepting such obligations, You may act only
+ on Your own behalf and on Your sole responsibility, not on behalf
+ of any other Contributor, and only if You agree to indemnify,
+ defend, and hold each Contributor harmless for any liability
+ incurred by, or claims asserted against, such Contributor by reason
+ of your accepting any such warranty or additional liability.
+
+ END OF TERMS AND CONDITIONS
+
+ Copyright 2015 - 2021 Amish Shah
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
diff --git a/node_modules/@discordjs/collection/README.md b/node_modules/@discordjs/collection/README.md
new file mode 100644
index 0000000..0e31ccd
--- /dev/null
+++ b/node_modules/@discordjs/collection/README.md
@@ -0,0 +1,3 @@
+# Collection
+
+Utility data structure used in Discord.js.
diff --git a/node_modules/@discordjs/collection/dist/index.d.ts b/node_modules/@discordjs/collection/dist/index.d.ts
new file mode 100644
index 0000000..3bcd3f8
--- /dev/null
+++ b/node_modules/@discordjs/collection/dist/index.d.ts
@@ -0,0 +1,326 @@
+export interface CollectionConstructor {
+ new (): Collection;
+ new (entries?: ReadonlyArray | null): Collection;
+ new (iterable: Iterable): Collection;
+ readonly prototype: Collection;
+ readonly [Symbol.species]: CollectionConstructor;
+}
+/**
+ * A Map with additional utility methods. This is used throughout discord.js rather than Arrays for anything that has
+ * an ID, for significantly improved performance and ease-of-use.
+ * @extends {Map}
+ * @property {number} size - The amount of elements in this collection.
+ */
+export declare class Collection extends Map {
+ static readonly default: typeof Collection;
+ ['constructor']: CollectionConstructor;
+ /**
+ * Identical to [Map.get()](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Map/get).
+ * Gets an element with the specified key, and returns its value, or `undefined` if the element does not exist.
+ * @param {*} key - The key to get from this collection
+ * @returns {* | undefined}
+ */
+ get(key: K): V | undefined;
+ /**
+ * Identical to [Map.set()](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Map/set).
+ * Sets a new element in the collection with the specified key and value.
+ * @param {*} key - The key of the element to add
+ * @param {*} value - The value of the element to add
+ * @returns {Collection}
+ */
+ set(key: K, value: V): this;
+ /**
+ * Identical to [Map.has()](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Map/has).
+ * Checks if an element exists in the collection.
+ * @param {*} key - The key of the element to check for
+ * @returns {boolean} `true` if the element exists, `false` if it does not exist.
+ */
+ has(key: K): boolean;
+ /**
+ * Identical to [Map.delete()](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Map/delete).
+ * Deletes an element from the collection.
+ * @param {*} key - The key to delete from the collection
+ * @returns {boolean} `true` if the element was removed, `false` if the element does not exist.
+ */
+ delete(key: K): boolean;
+ /**
+ * Identical to [Map.clear()](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Map/clear).
+ * Removes all elements from the collection.
+ * @returns {undefined}
+ */
+ clear(): void;
+ /**
+ * Checks if all of the elements exist in the collection.
+ * @param {...*} keys - The keys of the elements to check for
+ * @returns {boolean} `true` if all of the elements exist, `false` if at least one does not exist.
+ */
+ hasAll(...keys: K[]): boolean;
+ /**
+ * Checks if any of the elements exist in the collection.
+ * @param {...*} keys - The keys of the elements to check for
+ * @returns {boolean} `true` if any of the elements exist, `false` if none exist.
+ */
+ hasAny(...keys: K[]): boolean;
+ /**
+ * Obtains the first value(s) in this collection.
+ * @param {number} [amount] Amount of values to obtain from the beginning
+ * @returns {*|Array<*>} A single value if no amount is provided or an array of values, starting from the end if
+ * amount is negative
+ */
+ first(): V | undefined;
+ first(amount: number): V[];
+ /**
+ * Obtains the first key(s) in this collection.
+ * @param {number} [amount] Amount of keys to obtain from the beginning
+ * @returns {*|Array<*>} A single key if no amount is provided or an array of keys, starting from the end if
+ * amount is negative
+ */
+ firstKey(): K | undefined;
+ firstKey(amount: number): K[];
+ /**
+ * Obtains the last value(s) in this collection.
+ * @param {number} [amount] Amount of values to obtain from the end
+ * @returns {*|Array<*>} A single value if no amount is provided or an array of values, starting from the start if
+ * amount is negative
+ */
+ last(): V | undefined;
+ last(amount: number): V[];
+ /**
+ * Obtains the last key(s) in this collection.
+ * @param {number} [amount] Amount of keys to obtain from the end
+ * @returns {*|Array<*>} A single key if no amount is provided or an array of keys, starting from the start if
+ * amount is negative
+ */
+ lastKey(): K | undefined;
+ lastKey(amount: number): K[];
+ /**
+ * Obtains unique random value(s) from this collection.
+ * @param {number} [amount] Amount of values to obtain randomly
+ * @returns {*|Array<*>} A single value if no amount is provided or an array of values
+ */
+ random(): V;
+ random(amount: number): V[];
+ /**
+ * Obtains unique random key(s) from this collection.
+ * @param {number} [amount] Amount of keys to obtain randomly
+ * @returns {*|Array<*>} A single key if no amount is provided or an array
+ */
+ randomKey(): K;
+ randomKey(amount: number): K[];
+ /**
+ * Searches for a single item where the given function returns a truthy value. This behaves like
+ * [Array.find()](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/find).
+ * All collections used in Discord.js are mapped using their `id` property, and if you want to find by id you
+ * should use the `get` method. See
+ * [MDN](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Map/get) for details.
+ * @param {Function} fn The function to test with (should return boolean)
+ * @param {*} [thisArg] Value to use as `this` when executing function
+ * @returns {*}
+ * @example collection.find(user => user.username === 'Bob');
+ */
+ find(fn: (value: V, key: K, collection: this) => value is V2): V2 | undefined;
+ find(fn: (value: V, key: K, collection: this) => boolean): V | undefined;
+ find(fn: (this: This, value: V, key: K, collection: this) => value is V2, thisArg: This): V2 | undefined;
+ find(fn: (this: This, value: V, key: K, collection: this) => boolean, thisArg: This): V | undefined;
+ /**
+ * Searches for the key of a single item where the given function returns a truthy value. This behaves like
+ * [Array.findIndex()](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/findIndex),
+ * but returns the key rather than the positional index.
+ * @param {Function} fn The function to test with (should return boolean)
+ * @param {*} [thisArg] Value to use as `this` when executing function
+ * @returns {*}
+ * @example collection.findKey(user => user.username === 'Bob');
+ */
+ findKey(fn: (value: V, key: K, collection: this) => key is K2): K2 | undefined;
+ findKey(fn: (value: V, key: K, collection: this) => boolean): K | undefined;
+ findKey(fn: (this: This, value: V, key: K, collection: this) => key is K2, thisArg: This): K2 | undefined;
+ findKey(fn: (this: This, value: V, key: K, collection: this) => boolean, thisArg: This): K | undefined;
+ /**
+ * Removes items that satisfy the provided filter function.
+ * @param {Function} fn Function used to test (should return a boolean)
+ * @param {*} [thisArg] Value to use as `this` when executing function
+ * @returns {number} The number of removed entries
+ */
+ sweep(fn: (value: V, key: K, collection: this) => boolean): number;
+ sweep(fn: (this: T, value: V, key: K, collection: this) => boolean, thisArg: T): number;
+ /**
+ * Identical to
+ * [Array.filter()](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/filter),
+ * but returns a Collection instead of an Array.
+ * @param {Function} fn The function to test with (should return boolean)
+ * @param {*} [thisArg] Value to use as `this` when executing function
+ * @returns {Collection}
+ * @example collection.filter(user => user.username === 'Bob');
+ */
+ filter(fn: (value: V, key: K, collection: this) => key is K2): Collection;
+ filter(fn: (value: V, key: K, collection: this) => value is V2): Collection;
+ filter(fn: (value: V, key: K, collection: this) => boolean): Collection;
+ filter(fn: (this: This, value: V, key: K, collection: this) => key is K2, thisArg: This): Collection;
+ filter(fn: (this: This, value: V, key: K, collection: this) => value is V2, thisArg: This): Collection;
+ filter(fn: (this: This, value: V, key: K, collection: this) => boolean, thisArg: This): Collection;
+ /**
+ * Partitions the collection into two collections where the first collection
+ * contains the items that passed and the second contains the items that failed.
+ * @param {Function} fn Function used to test (should return a boolean)
+ * @param {*} [thisArg] Value to use as `this` when executing function
+ * @returns {Collection[]}
+ * @example const [big, small] = collection.partition(guild => guild.memberCount > 250);
+ */
+ partition(fn: (value: V, key: K, collection: this) => key is K2): [Collection, Collection, V>];
+ partition(fn: (value: V, key: K, collection: this) => value is V2): [Collection, Collection>];
+ partition(fn: (value: V, key: K, collection: this) => boolean): [Collection, Collection];
+ partition(fn: (this: This, value: V, key: K, collection: this) => key is K2, thisArg: This): [Collection, Collection, V>];
+ partition(fn: (this: This, value: V, key: K, collection: this) => value is V2, thisArg: This): [Collection, Collection>];
+ partition(fn: (this: This, value: V, key: K, collection: this) => boolean, thisArg: This): [Collection, Collection];
+ /**
+ * Maps each item into a Collection, then joins the results into a single Collection. Identical in behavior to
+ * [Array.flatMap()](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/flatMap).
+ * @param {Function} fn Function that produces a new Collection
+ * @param {*} [thisArg] Value to use as `this` when executing function
+ * @returns {Collection}
+ * @example collection.flatMap(guild => guild.members.cache);
+ */
+ flatMap(fn: (value: V, key: K, collection: this) => Collection): Collection;
+ flatMap(fn: (this: This, value: V, key: K, collection: this) => Collection, thisArg: This): Collection;
+ /**
+ * Maps each item to another value into an array. Identical in behavior to
+ * [Array.map()](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/map).
+ * @param {Function} fn Function that produces an element of the new array, taking three arguments
+ * @param {*} [thisArg] Value to use as `this` when executing function
+ * @returns {Array}
+ * @example collection.map(user => user.tag);
+ */
+ map(fn: (value: V, key: K, collection: this) => T): T[];
+ map(fn: (this: This, value: V, key: K, collection: this) => T, thisArg: This): T[];
+ /**
+ * Maps each item to another value into a collection. Identical in behavior to
+ * [Array.map()](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/map).
+ * @param {Function} fn Function that produces an element of the new collection, taking three arguments
+ * @param {*} [thisArg] Value to use as `this` when executing function
+ * @returns {Collection}
+ * @example collection.mapValues(user => user.tag);
+ */
+ mapValues(fn: (value: V, key: K, collection: this) => T): Collection;
+ mapValues(fn: (this: This, value: V, key: K, collection: this) => T, thisArg: This): Collection;
+ /**
+ * Checks if there exists an item that passes a test. Identical in behavior to
+ * [Array.some()](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/some).
+ * @param {Function} fn Function used to test (should return a boolean)
+ * @param {*} [thisArg] Value to use as `this` when executing function
+ * @returns {boolean}
+ * @example collection.some(user => user.discriminator === '0000');
+ */
+ some(fn: (value: V, key: K, collection: this) => boolean): boolean;
+ some(fn: (this: T, value: V, key: K, collection: this) => boolean, thisArg: T): boolean;
+ /**
+ * Checks if all items passes a test. Identical in behavior to
+ * [Array.every()](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/every).
+ * @param {Function} fn Function used to test (should return a boolean)
+ * @param {*} [thisArg] Value to use as `this` when executing function
+ * @returns {boolean}
+ * @example collection.every(user => !user.bot);
+ */
+ every(fn: (value: V, key: K, collection: this) => key is K2): this is Collection;
+ every(fn: (value: V, key: K, collection: this) => value is V2): this is Collection;
+ every(fn: (value: V, key: K, collection: this) => boolean): boolean;
+ every(fn: (this: This, value: V, key: K, collection: this) => key is K2, thisArg: This): this is Collection;
+ every(fn: (this: This, value: V, key: K, collection: this) => value is V2, thisArg: This): this is Collection;
+ every(fn: (this: This, value: V, key: K, collection: this) => boolean, thisArg: This): boolean;
+ /**
+ * Applies a function to produce a single value. Identical in behavior to
+ * [Array.reduce()](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/reduce).
+ * @param {Function} fn Function used to reduce, taking four arguments; `accumulator`, `currentValue`, `currentKey`,
+ * and `collection`
+ * @param {*} [initialValue] Starting value for the accumulator
+ * @returns {*}
+ * @example collection.reduce((acc, guild) => acc + guild.memberCount, 0);
+ */
+ reduce(fn: (accumulator: T, value: V, key: K, collection: this) => T, initialValue?: T): T;
+ /**
+ * Identical to
+ * [Map.forEach()](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Map/forEach),
+ * but returns the collection instead of undefined.
+ * @param {Function} fn Function to execute for each element
+ * @param {*} [thisArg] Value to use as `this` when executing function
+ * @returns {Collection}
+ * @example
+ * collection
+ * .each(user => console.log(user.username))
+ * .filter(user => user.bot)
+ * .each(user => console.log(user.username));
+ */
+ each(fn: (value: V, key: K, collection: this) => void): this;
+ each(fn: (this: T, value: V, key: K, collection: this) => void, thisArg: T): this;
+ /**
+ * Runs a function on the collection and returns the collection.
+ * @param {Function} fn Function to execute
+ * @param {*} [thisArg] Value to use as `this` when executing function
+ * @returns {Collection}
+ * @example
+ * collection
+ * .tap(coll => console.log(coll.size))
+ * .filter(user => user.bot)
+ * .tap(coll => console.log(coll.size))
+ */
+ tap(fn: (collection: this) => void): this;
+ tap(fn: (this: T, collection: this) => void, thisArg: T): this;
+ /**
+ * Creates an identical shallow copy of this collection.
+ * @returns {Collection}
+ * @example const newColl = someColl.clone();
+ */
+ clone(): Collection;
+ /**
+ * Combines this collection with others into a new collection. None of the source collections are modified.
+ * @param {...Collection} collections Collections to merge
+ * @returns {Collection}
+ * @example const newColl = someColl.concat(someOtherColl, anotherColl, ohBoyAColl);
+ */
+ concat(...collections: Collection[]): Collection;
+ /**
+ * Checks if this collection shares identical items with another.
+ * This is different to checking for equality using equal-signs, because
+ * the collections may be different objects, but contain the same data.
+ * @param {Collection} collection Collection to compare with
+ * @returns {boolean} Whether the collections have identical contents
+ */
+ equals(collection: Collection): boolean;
+ /**
+ * The sort method sorts the items of a collection in place and returns it.
+ * The sort is not necessarily stable in Node 10 or older.
+ * The default sort order is according to string Unicode code points.
+ * @param {Function} [compareFunction] Specifies a function that defines the sort order.
+ * If omitted, the collection is sorted according to each character's Unicode code point value,
+ * according to the string conversion of each element.
+ * @returns {Collection}
+ * @example collection.sort((userA, userB) => userA.createdTimestamp - userB.createdTimestamp);
+ */
+ sort(compareFunction?: Comparator): this;
+ /**
+ * The intersect method returns a new structure containing items where the keys are present in both original structures.
+ * @param {Collection} other The other Collection to filter against
+ * @returns {Collection}
+ */
+ intersect(other: Collection): Collection;
+ /**
+ * The difference method returns a new structure containing items where the key is present in one of the original structures but not the other.
+ * @param {Collection} other The other Collection to filter against
+ * @returns {Collection}
+ */
+ difference(other: Collection): Collection;
+ /**
+ * The sorted method sorts the items of a collection and returns it.
+ * The sort is not necessarily stable in Node 10 or older.
+ * The default sort order is according to string Unicode code points.
+ * @param {Function} [compareFunction] Specifies a function that defines the sort order.
+ * If omitted, the collection is sorted according to each character's Unicode code point value,
+ * according to the string conversion of each element.
+ * @returns {Collection}
+ * @example collection.sorted((userA, userB) => userA.createdTimestamp - userB.createdTimestamp);
+ */
+ sorted(compareFunction?: Comparator): Collection;
+ toJSON(): V[];
+ private static defaultSort;
+}
+export declare type Comparator = (firstValue: V, secondValue: V, firstKey: K, secondKey: K) => number;
+export default Collection;
diff --git a/node_modules/@discordjs/collection/dist/index.js b/node_modules/@discordjs/collection/dist/index.js
new file mode 100644
index 0000000..e730c30
--- /dev/null
+++ b/node_modules/@discordjs/collection/dist/index.js
@@ -0,0 +1,381 @@
+"use strict";
+Object.defineProperty(exports, "__esModule", { value: true });
+exports.Collection = void 0;
+/**
+ * A Map with additional utility methods. This is used throughout discord.js rather than Arrays for anything that has
+ * an ID, for significantly improved performance and ease-of-use.
+ * @extends {Map}
+ * @property {number} size - The amount of elements in this collection.
+ */
+class Collection extends Map {
+ /**
+ * Identical to [Map.get()](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Map/get).
+ * Gets an element with the specified key, and returns its value, or `undefined` if the element does not exist.
+ * @param {*} key - The key to get from this collection
+ * @returns {* | undefined}
+ */
+ get(key) {
+ return super.get(key);
+ }
+ /**
+ * Identical to [Map.set()](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Map/set).
+ * Sets a new element in the collection with the specified key and value.
+ * @param {*} key - The key of the element to add
+ * @param {*} value - The value of the element to add
+ * @returns {Collection}
+ */
+ set(key, value) {
+ return super.set(key, value);
+ }
+ /**
+ * Identical to [Map.has()](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Map/has).
+ * Checks if an element exists in the collection.
+ * @param {*} key - The key of the element to check for
+ * @returns {boolean} `true` if the element exists, `false` if it does not exist.
+ */
+ has(key) {
+ return super.has(key);
+ }
+ /**
+ * Identical to [Map.delete()](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Map/delete).
+ * Deletes an element from the collection.
+ * @param {*} key - The key to delete from the collection
+ * @returns {boolean} `true` if the element was removed, `false` if the element does not exist.
+ */
+ delete(key) {
+ return super.delete(key);
+ }
+ /**
+ * Identical to [Map.clear()](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Map/clear).
+ * Removes all elements from the collection.
+ * @returns {undefined}
+ */
+ clear() {
+ return super.clear();
+ }
+ /**
+ * Checks if all of the elements exist in the collection.
+ * @param {...*} keys - The keys of the elements to check for
+ * @returns {boolean} `true` if all of the elements exist, `false` if at least one does not exist.
+ */
+ hasAll(...keys) {
+ return keys.every((k) => super.has(k));
+ }
+ /**
+ * Checks if any of the elements exist in the collection.
+ * @param {...*} keys - The keys of the elements to check for
+ * @returns {boolean} `true` if any of the elements exist, `false` if none exist.
+ */
+ hasAny(...keys) {
+ return keys.some((k) => super.has(k));
+ }
+ first(amount) {
+ if (typeof amount === 'undefined')
+ return this.values().next().value;
+ if (amount < 0)
+ return this.last(amount * -1);
+ amount = Math.min(this.size, amount);
+ const iter = this.values();
+ return Array.from({ length: amount }, () => iter.next().value);
+ }
+ firstKey(amount) {
+ if (typeof amount === 'undefined')
+ return this.keys().next().value;
+ if (amount < 0)
+ return this.lastKey(amount * -1);
+ amount = Math.min(this.size, amount);
+ const iter = this.keys();
+ return Array.from({ length: amount }, () => iter.next().value);
+ }
+ last(amount) {
+ const arr = [...this.values()];
+ if (typeof amount === 'undefined')
+ return arr[arr.length - 1];
+ if (amount < 0)
+ return this.first(amount * -1);
+ if (!amount)
+ return [];
+ return arr.slice(-amount);
+ }
+ lastKey(amount) {
+ const arr = [...this.keys()];
+ if (typeof amount === 'undefined')
+ return arr[arr.length - 1];
+ if (amount < 0)
+ return this.firstKey(amount * -1);
+ if (!amount)
+ return [];
+ return arr.slice(-amount);
+ }
+ random(amount) {
+ const arr = [...this.values()];
+ if (typeof amount === 'undefined')
+ return arr[Math.floor(Math.random() * arr.length)];
+ if (!arr.length || !amount)
+ return [];
+ return Array.from({ length: Math.min(amount, arr.length) }, () => arr.splice(Math.floor(Math.random() * arr.length), 1)[0]);
+ }
+ randomKey(amount) {
+ const arr = [...this.keys()];
+ if (typeof amount === 'undefined')
+ return arr[Math.floor(Math.random() * arr.length)];
+ if (!arr.length || !amount)
+ return [];
+ return Array.from({ length: Math.min(amount, arr.length) }, () => arr.splice(Math.floor(Math.random() * arr.length), 1)[0]);
+ }
+ find(fn, thisArg) {
+ if (typeof thisArg !== 'undefined')
+ fn = fn.bind(thisArg);
+ for (const [key, val] of this) {
+ if (fn(val, key, this))
+ return val;
+ }
+ return undefined;
+ }
+ findKey(fn, thisArg) {
+ if (typeof thisArg !== 'undefined')
+ fn = fn.bind(thisArg);
+ for (const [key, val] of this) {
+ if (fn(val, key, this))
+ return key;
+ }
+ return undefined;
+ }
+ sweep(fn, thisArg) {
+ if (typeof thisArg !== 'undefined')
+ fn = fn.bind(thisArg);
+ const previousSize = this.size;
+ for (const [key, val] of this) {
+ if (fn(val, key, this))
+ this.delete(key);
+ }
+ return previousSize - this.size;
+ }
+ filter(fn, thisArg) {
+ if (typeof thisArg !== 'undefined')
+ fn = fn.bind(thisArg);
+ const results = new this.constructor[Symbol.species]();
+ for (const [key, val] of this) {
+ if (fn(val, key, this))
+ results.set(key, val);
+ }
+ return results;
+ }
+ partition(fn, thisArg) {
+ if (typeof thisArg !== 'undefined')
+ fn = fn.bind(thisArg);
+ const results = [
+ new this.constructor[Symbol.species](),
+ new this.constructor[Symbol.species](),
+ ];
+ for (const [key, val] of this) {
+ if (fn(val, key, this)) {
+ results[0].set(key, val);
+ }
+ else {
+ results[1].set(key, val);
+ }
+ }
+ return results;
+ }
+ flatMap(fn, thisArg) {
+ const collections = this.map(fn, thisArg);
+ return new this.constructor[Symbol.species]().concat(...collections);
+ }
+ map(fn, thisArg) {
+ if (typeof thisArg !== 'undefined')
+ fn = fn.bind(thisArg);
+ const iter = this.entries();
+ return Array.from({ length: this.size }, () => {
+ const [key, value] = iter.next().value;
+ return fn(value, key, this);
+ });
+ }
+ mapValues(fn, thisArg) {
+ if (typeof thisArg !== 'undefined')
+ fn = fn.bind(thisArg);
+ const coll = new this.constructor[Symbol.species]();
+ for (const [key, val] of this)
+ coll.set(key, fn(val, key, this));
+ return coll;
+ }
+ some(fn, thisArg) {
+ if (typeof thisArg !== 'undefined')
+ fn = fn.bind(thisArg);
+ for (const [key, val] of this) {
+ if (fn(val, key, this))
+ return true;
+ }
+ return false;
+ }
+ every(fn, thisArg) {
+ if (typeof thisArg !== 'undefined')
+ fn = fn.bind(thisArg);
+ for (const [key, val] of this) {
+ if (!fn(val, key, this))
+ return false;
+ }
+ return true;
+ }
+ /**
+ * Applies a function to produce a single value. Identical in behavior to
+ * [Array.reduce()](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/reduce).
+ * @param {Function} fn Function used to reduce, taking four arguments; `accumulator`, `currentValue`, `currentKey`,
+ * and `collection`
+ * @param {*} [initialValue] Starting value for the accumulator
+ * @returns {*}
+ * @example collection.reduce((acc, guild) => acc + guild.memberCount, 0);
+ */
+ reduce(fn, initialValue) {
+ let accumulator;
+ if (typeof initialValue !== 'undefined') {
+ accumulator = initialValue;
+ for (const [key, val] of this)
+ accumulator = fn(accumulator, val, key, this);
+ return accumulator;
+ }
+ let first = true;
+ for (const [key, val] of this) {
+ if (first) {
+ accumulator = val;
+ first = false;
+ continue;
+ }
+ accumulator = fn(accumulator, val, key, this);
+ }
+ // No items iterated.
+ if (first) {
+ throw new TypeError('Reduce of empty collection with no initial value');
+ }
+ return accumulator;
+ }
+ each(fn, thisArg) {
+ this.forEach(fn, thisArg);
+ return this;
+ }
+ tap(fn, thisArg) {
+ if (typeof thisArg !== 'undefined')
+ fn = fn.bind(thisArg);
+ fn(this);
+ return this;
+ }
+ /**
+ * Creates an identical shallow copy of this collection.
+ * @returns {Collection}
+ * @example const newColl = someColl.clone();
+ */
+ clone() {
+ return new this.constructor[Symbol.species](this);
+ }
+ /**
+ * Combines this collection with others into a new collection. None of the source collections are modified.
+ * @param {...Collection} collections Collections to merge
+ * @returns {Collection}
+ * @example const newColl = someColl.concat(someOtherColl, anotherColl, ohBoyAColl);
+ */
+ concat(...collections) {
+ const newColl = this.clone();
+ for (const coll of collections) {
+ for (const [key, val] of coll)
+ newColl.set(key, val);
+ }
+ return newColl;
+ }
+ /**
+ * Checks if this collection shares identical items with another.
+ * This is different to checking for equality using equal-signs, because
+ * the collections may be different objects, but contain the same data.
+ * @param {Collection} collection Collection to compare with
+ * @returns {boolean} Whether the collections have identical contents
+ */
+ equals(collection) {
+ // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition
+ if (!collection)
+ return false; // runtime check
+ if (this === collection)
+ return true;
+ if (this.size !== collection.size)
+ return false;
+ for (const [key, value] of this) {
+ if (!collection.has(key) || value !== collection.get(key)) {
+ return false;
+ }
+ }
+ return true;
+ }
+ /**
+ * The sort method sorts the items of a collection in place and returns it.
+ * The sort is not necessarily stable in Node 10 or older.
+ * The default sort order is according to string Unicode code points.
+ * @param {Function} [compareFunction] Specifies a function that defines the sort order.
+ * If omitted, the collection is sorted according to each character's Unicode code point value,
+ * according to the string conversion of each element.
+ * @returns {Collection}
+ * @example collection.sort((userA, userB) => userA.createdTimestamp - userB.createdTimestamp);
+ */
+ sort(compareFunction = Collection.defaultSort) {
+ const entries = [...this.entries()];
+ entries.sort((a, b) => compareFunction(a[1], b[1], a[0], b[0]));
+ // Perform clean-up
+ super.clear();
+ // Set the new entries
+ for (const [k, v] of entries) {
+ super.set(k, v);
+ }
+ return this;
+ }
+ /**
+ * The intersect method returns a new structure containing items where the keys are present in both original structures.
+ * @param {Collection} other The other Collection to filter against
+ * @returns {Collection}
+ */
+ intersect(other) {
+ const coll = new this.constructor[Symbol.species]();
+ for (const [k, v] of other) {
+ if (this.has(k))
+ coll.set(k, v);
+ }
+ return coll;
+ }
+ /**
+ * The difference method returns a new structure containing items where the key is present in one of the original structures but not the other.
+ * @param {Collection} other The other Collection to filter against
+ * @returns {Collection}
+ */
+ difference(other) {
+ const coll = new this.constructor[Symbol.species]();
+ for (const [k, v] of other) {
+ if (!this.has(k))
+ coll.set(k, v);
+ }
+ for (const [k, v] of this) {
+ if (!other.has(k))
+ coll.set(k, v);
+ }
+ return coll;
+ }
+ /**
+ * The sorted method sorts the items of a collection and returns it.
+ * The sort is not necessarily stable in Node 10 or older.
+ * The default sort order is according to string Unicode code points.
+ * @param {Function} [compareFunction] Specifies a function that defines the sort order.
+ * If omitted, the collection is sorted according to each character's Unicode code point value,
+ * according to the string conversion of each element.
+ * @returns {Collection}
+ * @example collection.sorted((userA, userB) => userA.createdTimestamp - userB.createdTimestamp);
+ */
+ sorted(compareFunction = Collection.defaultSort) {
+ return new this.constructor[Symbol.species](this).sort((av, bv, ak, bk) => compareFunction(av, bv, ak, bk));
+ }
+ toJSON() {
+ // toJSON is called recursively by JSON.stringify.
+ return [...this.values()];
+ }
+ static defaultSort(firstValue, secondValue) {
+ return Number(firstValue > secondValue) || Number(firstValue === secondValue) - 1;
+ }
+}
+exports.Collection = Collection;
+Collection.default = Collection;
+exports.default = Collection;
+//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiLyIsInNvdXJjZXMiOlsiaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBUUE7Ozs7O0dBS0c7QUFDSCxNQUFhLFVBQWlCLFNBQVEsR0FBUztJQUk5Qzs7Ozs7T0FLRztJQUNJLEdBQUcsQ0FBQyxHQUFNO1FBQ2hCLE9BQU8sS0FBSyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQztJQUN2QixDQUFDO0lBRUQ7Ozs7OztPQU1HO0lBQ0ksR0FBRyxDQUFDLEdBQU0sRUFBRSxLQUFRO1FBQzFCLE9BQU8sS0FBSyxDQUFDLEdBQUcsQ0FBQyxHQUFHLEVBQUUsS0FBSyxDQUFDLENBQUM7SUFDOUIsQ0FBQztJQUVEOzs7OztPQUtHO0lBQ0ksR0FBRyxDQUFDLEdBQU07UUFDaEIsT0FBTyxLQUFLLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0lBQ3ZCLENBQUM7SUFFRDs7Ozs7T0FLRztJQUNJLE1BQU0sQ0FBQyxHQUFNO1FBQ25CLE9BQU8sS0FBSyxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQztJQUMxQixDQUFDO0lBRUQ7Ozs7T0FJRztJQUNJLEtBQUs7UUFDWCxPQUFPLEtBQUssQ0FBQyxLQUFLLEVBQUUsQ0FBQztJQUN0QixDQUFDO0lBRUQ7Ozs7T0FJRztJQUNJLE1BQU0sQ0FBQyxHQUFHLElBQVM7UUFDekIsT0FBTyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDeEMsQ0FBQztJQUVEOzs7O09BSUc7SUFDSSxNQUFNLENBQUMsR0FBRyxJQUFTO1FBQ3pCLE9BQU8sSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQ3ZDLENBQUM7SUFVTSxLQUFLLENBQUMsTUFB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Q0FBQztJQUVEOzs7Ozs7Ozs7T0FTRztJQUNJLE1BQU0sQ0FBQyxrQkFBb0MsVUFBVSxDQUFDLFdBQVc7UUFDdkUsT0FBTyxJQUFJLElBQUksQ0FBQyxXQUFXLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLENBQUMsZUFBZSxDQUFDLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUM7SUFDN0csQ0FBQztJQUVNLE1BQU07UUFDWixrREFBa0Q7UUFDbEQsT0FBTyxDQUFDLEdBQUcsSUFBSSxDQUFDLE1BQU0sRUFBRSxDQUFDLENBQUM7SUFDM0IsQ0FBQztJQUVPLE1BQU0sQ0FBQyxXQUFXLENBQUksVUFBYSxFQUFFLFdBQWM7UUFDMUQsT0FBTyxNQUFNLENBQUMsVUFBVSxHQUFHLFdBQVcsQ0FBQyxJQUFJLE1BQU0sQ0FBQyxVQUFVLEtBQUssV0FBVyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0lBQ25GLENBQUM7O0FBNWxCRixnQ0E2bEJDO0FBNWxCdUIsa0JBQU8sR0FBc0IsVUFBVSxDQUFDO0FBZ21CaEUsa0JBQWUsVUFBVSxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiZXhwb3J0IGludGVyZmFjZSBDb2xsZWN0aW9uQ29uc3RydWN0b3Ige1xuXHRuZXcgKCk6IENvbGxlY3Rpb248dW5rbm93biwgdW5rbm93bj47XG5cdG5ldyA8SywgVj4oZW50cmllcz86IFJlYWRvbmx5QXJyYXk8cmVhZG9ubHkgW0ssIFZdPiB8IG51bGwpOiBDb2xsZWN0aW9uPEssIFY+O1xuXHRuZXcgPEssIFY+KGl0ZXJhYmxlOiBJdGVyYWJsZTxyZWFkb25seSBbSywgVl0+KTogQ29sbGVjdGlvbjxLLCBWPjtcblx0cmVhZG9ubHkgcHJvdG90eXBlOiBDb2xsZWN0aW9uPHVua25vd24sIHVua25vd24+O1xuXHRyZWFkb25seSBbU3ltYm9sLnNwZWNpZXNdOiBDb2xsZWN0aW9uQ29uc3RydWN0b3I7XG59XG5cbi8qKlxuICogQSBNYXAgd2l0aCBhZGRpdGlvbmFsIHV0aWxpdHkgbWV0aG9kcy4gVGhpcyBpcyB1c2VkIHRocm91Z2hvdXQgZGlzY29yZC5qcyByYXRoZXIgdGhhbiBBcnJheXMgZm9yIGFueXRoaW5nIHRoYXQgaGFzXG4gKiBhbiBJRCwgZm9yIHNpZ25pZmljYW50bHkgaW1wcm92ZWQgcGVyZm9ybWFuY2UgYW5kIGVhc2Utb2YtdXNlLlxuICogQGV4dGVuZHMge01hcH1cbiAqIEBwcm9wZXJ0eSB7bnVtYmVyfSBzaXplIC0gVGhlIGFtb3VudCBvZiBlbGVtZW50cyBpbiB0aGlzIGNvbGxlY3Rpb24uXG4gKi9cbmV4cG9ydCBjbGFzcyBDb2xsZWN0aW9uPEssIFY+IGV4dGVuZHMgTWFwPEssIFY+IHtcblx0cHVibGljIHN0YXRpYyByZWFkb25seSBkZWZhdWx0OiB0eXBlb2YgQ29sbGVjdGlvbiA9IENvbGxlY3Rpb247XG5cdHB1YmxpYyBbJ2NvbnN0cnVjdG9yJ106IENvbGxlY3Rpb25Db25zdHJ1Y3RvcjtcblxuXHQvKipcblx0ICogSWRlbnRpY2FsIHRvIFtNYXAuZ2V0KCldKGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvV2ViL0phdmFTY3JpcHQvUmVmZXJlbmNlL0dsb2JhbF9PYmplY3RzL01hcC9nZXQpLlxuXHQgKiBHZXRzIGFuIGVsZW1lbnQgd2l0aCB0aGUgc3BlY2lmaWVkIGtleSwgYW5kIHJldHVybnMgaXRzIHZhbHVlLCBvciBgdW5kZWZpbmVkYCBpZiB0aGUgZWxlbWVudCBkb2VzIG5vdCBleGlzdC5cblx0ICogQHBhcmFtIHsqfSBrZXkgLSBUaGUga2V5IHRvIGdldCBmcm9tIHRoaXMgY29sbGVjdGlvblxuXHQgKiBAcmV0dXJucyB7KiB8IHVuZGVmaW5lZH1cblx0ICovXG5cdHB1YmxpYyBnZXQoa2V5OiBLKTogViB8IHVuZGVmaW5lZCB7XG5cdFx0cmV0dXJuIHN1cGVyLmdldChrZXkpO1xuXHR9XG5cblx0LyoqXG5cdCAqIElkZW50aWNhbCB0byBbTWFwLnNldCgpXShodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi1VUy9kb2NzL1dlYi9KYXZhU2NyaXB0L1JlZmVyZW5jZS9HbG9iYWxfT2JqZWN0cy9NYXAvc2V0KS5cblx0ICogU2V0cyBhIG5ldyBlbGVtZW50IGluIHRoZSBjb2xsZWN0aW9uIHdpdGggdGhlIHNwZWNpZmllZCBrZXkgYW5kIHZhbHVlLlxuXHQgKiBAcGFyYW0geyp9IGtleSAtIFRoZSBrZXkgb2YgdGhlIGVsZW1lbnQgdG8gYWRkXG5cdCAqIEBwYXJhbSB7Kn0gdmFsdWUgLSBUaGUgdmFsdWUgb2YgdGhlIGVsZW1lbnQgdG8gYWRkXG5cdCAqIEByZXR1cm5zIHtDb2xsZWN0aW9ufVxuXHQgKi9cblx0cHVibGljIHNldChrZXk6IEssIHZhbHVlOiBWKTogdGhpcyB7XG5cdFx0cmV0dXJuIHN1cGVyLnNldChrZXksIHZhbHVlKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBJZGVudGljYWwgdG8gW01hcC5oYXMoKV0oaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9XZWIvSmF2YVNjcmlwdC9SZWZlcmVuY2UvR2xvYmFsX09iamVjdHMvTWFwL2hhcykuXG5cdCAqIENoZWNrcyBpZiBhbiBlbGVtZW50IGV4aXN0cyBpbiB0aGUgY29sbGVjdGlvbi5cblx0ICogQHBhcmFtIHsqfSBrZXkgLSBUaGUga2V5IG9mIHRoZSBlbGVtZW50IHRvIGNoZWNrIGZvclxuXHQgKiBAcmV0dXJucyB7Ym9vbGVhbn0gYHRydWVgIGlmIHRoZSBlbGVtZW50IGV4aXN0cywgYGZhbHNlYCBpZiBpdCBkb2VzIG5vdCBleGlzdC5cblx0ICovXG5cdHB1YmxpYyBoYXMoa2V5OiBLKTogYm9vbGVhbiB7XG5cdFx0cmV0dXJuIHN1cGVyLmhhcyhrZXkpO1xuXHR9XG5cblx0LyoqXG5cdCAqIElkZW50aWNhbCB0byBbTWFwLmRlbGV0ZSgpXShodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi1VUy9kb2NzL1dlYi9KYXZhU2NyaXB0L1JlZmVyZW5jZS9HbG9iYWxfT2JqZWN0cy9NYXAvZGVsZXRlKS5cblx0ICogRGVsZXRlcyBhbiBlbGVtZW50IGZyb20gdGhlIGNvbGxlY3Rpb24uXG5cdCAqIEBwYXJhbSB7Kn0ga2V5IC0gVGhlIGtleSB0byBkZWxldGUgZnJvbSB0aGUgY29sbGVjdGlvblxuXHQgKiBAcmV0dXJucyB7Ym9vbGVhbn0gYHRydWVgIGlmIHRoZSBlbGVtZW50IHdhcyByZW1vdmVkLCBgZmFsc2VgIGlmIHRoZSBlbGVtZW50IGRvZXMgbm90IGV4aXN0LlxuXHQgKi9cblx0cHVibGljIGRlbGV0ZShrZXk6IEspOiBib29sZWFuIHtcblx0XHRyZXR1cm4gc3VwZXIuZGVsZXRlKGtleSk7XG5cdH1cblxuXHQvKipcblx0ICogSWRlbnRpY2FsIHRvIFtNYXAuY2xlYXIoKV0oaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9XZWIvSmF2YVNjcmlwdC9SZWZlcmVuY2UvR2xvYmFsX09iamVjdHMvTWFwL2NsZWFyKS5cblx0ICogUmVtb3ZlcyBhbGwgZWxlbWVudHMgZnJvbSB0aGUgY29sbGVjdGlvbi5cblx0ICogQHJldHVybnMge3VuZGVmaW5lZH1cblx0ICovXG5cdHB1YmxpYyBjbGVhcigpOiB2b2lkIHtcblx0XHRyZXR1cm4gc3VwZXIuY2xlYXIoKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBDaGVja3MgaWYgYWxsIG9mIHRoZSBlbGVtZW50cyBleGlzdCBpbiB0aGUgY29sbGVjdGlvbi5cblx0ICogQHBhcmFtIHsuLi4qfSBrZXlzIC0gVGhlIGtleXMgb2YgdGhlIGVsZW1lbnRzIHRvIGNoZWNrIGZvclxuXHQgKiBAcmV0dXJucyB7Ym9vbGVhbn0gYHRydWVgIGlmIGFsbCBvZiB0aGUgZWxlbWVudHMgZXhpc3QsIGBmYWxzZWAgaWYgYXQgbGVhc3Qgb25lIGRvZXMgbm90IGV4aXN0LlxuXHQgKi9cblx0cHVibGljIGhhc0FsbCguLi5rZXlzOiBLW10pOiBib29sZWFuIHtcblx0XHRyZXR1cm4ga2V5cy5ldmVyeSgoaykgPT4gc3VwZXIuaGFzKGspKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBDaGVja3MgaWYgYW55IG9mIHRoZSBlbGVtZW50cyBleGlzdCBpbiB0aGUgY29sbGVjdGlvbi5cblx0ICogQHBhcmFtIHsuLi4qfSBrZXlzIC0gVGhlIGtleXMgb2YgdGhlIGVsZW1lbnRzIHRvIGNoZWNrIGZvclxuXHQgKiBAcmV0dXJucyB7Ym9vbGVhbn0gYHRydWVgIGlmIGFueSBvZiB0aGUgZWxlbWVudHMgZXhpc3QsIGBmYWxzZWAgaWYgbm9uZSBleGlzdC5cblx0ICovXG5cdHB1YmxpYyBoYXNBbnkoLi4ua2V5czogS1tdKTogYm9vbGVhbiB7XG5cdFx0cmV0dXJuIGtleXMuc29tZSgoaykgPT4gc3VwZXIuaGFzKGspKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBPYnRhaW5zIHRoZSBmaXJzdCB2YWx1ZShzKSBpbiB0aGlzIGNvbGxlY3Rpb24uXG5cdCAqIEBwYXJhbSB7bnVtYmVyfSBbYW1vdW50XSBBbW91bnQgb2YgdmFsdWVzIHRvIG9idGFpbiBmcm9tIHRoZSBiZWdpbm5pbmdcblx0ICogQHJldHVybnMgeyp8QXJyYXk8Kj59IEEgc2luZ2xlIHZhbHVlIGlmIG5vIGFtb3VudCBpcyBwcm92aWRlZCBvciBhbiBhcnJheSBvZiB2YWx1ZXMsIHN0YXJ0aW5nIGZyb20gdGhlIGVuZCBpZlxuXHQgKiBhbW91bnQgaXMgbmVnYXRpdmVcblx0ICovXG5cdHB1YmxpYyBmaXJzdCgpOiBWIHwgdW5kZWZpbmVkO1xuXHRwdWJsaWMgZmlyc3QoYW1vdW50OiBudW1iZXIpOiBWW107XG5cdHB1YmxpYyBmaXJzdChhbW91bnQ/OiBudW1iZXIpOiBWIHwgVltdIHwgdW5kZWZpbmVkIHtcblx0XHRpZiAodHlwZW9mIGFtb3VudCA9PT0gJ3VuZGVmaW5lZCcpIHJldHVybiB0aGlzLnZhbHVlcygpLm5leHQoKS52YWx1ZTtcblx0XHRpZiAoYW1vdW50IDwgMCkgcmV0dXJuIHRoaXMubGFzdChhbW91bnQgKiAtMSk7XG5cdFx0YW1vdW50ID0gTWF0aC5taW4odGhpcy5zaXplLCBhbW91bnQpO1xuXHRcdGNvbnN0IGl0ZXIgPSB0aGlzLnZhbHVlcygpO1xuXHRcdHJldHVybiBBcnJheS5mcm9tKHsgbGVuZ3RoOiBhbW91bnQgfSwgKCk6IFYgPT4gaXRlci5uZXh0KCkudmFsdWUpO1xuXHR9XG5cblx0LyoqXG5cdCAqIE9idGFpbnMgdGhlIGZpcnN0IGtleShzKSBpbiB0aGlzIGNvbGxlY3Rpb24uXG5cdCAqIEBwYXJhbSB7bnVtYmVyfSBbYW1vdW50XSBBbW91bnQgb2Yga2V5cyB0byBvYnRhaW4gZnJvbSB0aGUgYmVnaW5uaW5nXG5cdCAqIEByZXR1cm5zIHsqfEFycmF5PCo+fSBBIHNpbmdsZSBrZXkgaWYgbm8gYW1vdW50IGlzIHByb3ZpZGVkIG9yIGFuIGFycmF5IG9mIGtleXMsIHN0YXJ0aW5nIGZyb20gdGhlIGVuZCBpZlxuXHQgKiBhbW91bnQgaXMgbmVnYXRpdmVcblx0ICovXG5cdHB1YmxpYyBmaXJzdEtleSgpOiBLIHwgdW5kZWZpbmVkO1xuXHRwdWJsaWMgZmlyc3RLZXkoYW1vdW50OiBudW1iZXIpOiBLW107XG5cdHB1YmxpYyBmaXJzdEtleShhbW91bnQ/OiBudW1iZXIpOiBLIHwgS1tdIHwgdW5kZWZpbmVkIHtcblx0XHRpZiAodHlwZW9mIGFtb3VudCA9PT0gJ3VuZGVmaW5lZCcpIHJldHVybiB0aGlzLmtleXMoKS5uZXh0KCkudmFsdWU7XG5cdFx0aWYgKGFtb3VudCA8IDApIHJldHVybiB0aGlzLmxhc3RLZXkoYW1vdW50ICogLTEpO1xuXHRcdGFtb3VudCA9IE1hdGgubWluKHRoaXMuc2l6ZSwgYW1vdW50KTtcblx0XHRjb25zdCBpdGVyID0gdGhpcy5rZXlzKCk7XG5cdFx0cmV0dXJuIEFycmF5LmZyb20oeyBsZW5ndGg6IGFtb3VudCB9LCAoKTogSyA9PiBpdGVyLm5leHQoKS52YWx1ZSk7XG5cdH1cblxuXHQvKipcblx0ICogT2J0YWlucyB0aGUgbGFzdCB2YWx1ZShzKSBpbiB0aGlzIGNvbGxlY3Rpb24uXG5cdCAqIEBwYXJhbSB7bnVtYmVyfSBbYW1vdW50XSBBbW91bnQgb2YgdmFsdWVzIHRvIG9idGFpbiBmcm9tIHRoZSBlbmRcblx0ICogQHJldHVybnMgeyp8QXJyYXk8Kj59IEEgc2luZ2xlIHZhbHVlIGlmIG5vIGFtb3VudCBpcyBwcm92aWRlZCBvciBhbiBhcnJheSBvZiB2YWx1ZXMsIHN0YXJ0aW5nIGZyb20gdGhlIHN0YXJ0IGlmXG5cdCAqIGFtb3VudCBpcyBuZWdhdGl2ZVxuXHQgKi9cblx0cHVibGljIGxhc3QoKTogViB8IHVuZGVmaW5lZDtcblx0cHVibGljIGxhc3QoYW1vdW50OiBudW1iZXIpOiBWW107XG5cdHB1YmxpYyBsYXN0KGFtb3VudD86IG51bWJlcik6IFYgfCBWW10gfCB1bmRlZmluZWQge1xuXHRcdGNvbnN0IGFyciA9IFsuLi50aGlzLnZhbHVlcygpXTtcblx0XHRpZiAodHlwZW9mIGFtb3VudCA9PT0gJ3VuZGVmaW5lZCcpIHJldHVybiBhcnJbYXJyLmxlbmd0aCAtIDFdO1xuXHRcdGlmIChhbW91bnQgPCAwKSByZXR1cm4gdGhpcy5maXJzdChhbW91bnQgKiAtMSk7XG5cdFx0aWYgKCFhbW91bnQpIHJldHVybiBbXTtcblx0XHRyZXR1cm4gYXJyLnNsaWNlKC1hbW91bnQpO1xuXHR9XG5cblx0LyoqXG5cdCAqIE9idGFpbnMgdGhlIGxhc3Qga2V5KHMpIGluIHRoaXMgY29sbGVjdGlvbi5cblx0ICogQHBhcmFtIHtudW1iZXJ9IFthbW91bnRdIEFtb3VudCBvZiBrZXlzIHRvIG9idGFpbiBmcm9tIHRoZSBlbmRcblx0ICogQHJldHVybnMgeyp8QXJyYXk8Kj59IEEgc2luZ2xlIGtleSBpZiBubyBhbW91bnQgaXMgcHJvdmlkZWQgb3IgYW4gYXJyYXkgb2Yga2V5cywgc3RhcnRpbmcgZnJvbSB0aGUgc3RhcnQgaWZcblx0ICogYW1vdW50IGlzIG5lZ2F0aXZlXG5cdCAqL1xuXHRwdWJsaWMgbGFzdEtleSgpOiBLIHwgdW5kZWZpbmVkO1xuXHRwdWJsaWMgbGFzdEtleShhbW91bnQ6IG51bWJlcik6IEtbXTtcblx0cHVibGljIGxhc3RLZXkoYW1vdW50PzogbnVtYmVyKTogSyB8IEtbXSB8IHVuZGVmaW5lZCB7XG5cdFx0Y29uc3QgYXJyID0gWy4uLnRoaXMua2V5cygpXTtcblx0XHRpZiAodHlwZW9mIGFtb3VudCA9PT0gJ3VuZGVmaW5lZCcpIHJldHVybiBhcnJbYXJyLmxlbmd0aCAtIDFdO1xuXHRcdGlmIChhbW91bnQgPCAwKSByZXR1cm4gdGhpcy5maXJzdEtleShhbW91bnQgKiAtMSk7XG5cdFx0aWYgKCFhbW91bnQpIHJldHVybiBbXTtcblx0XHRyZXR1cm4gYXJyLnNsaWNlKC1hbW91bnQpO1xuXHR9XG5cblx0LyoqXG5cdCAqIE9idGFpbnMgdW5pcXVlIHJhbmRvbSB2YWx1ZShzKSBmcm9tIHRoaXMgY29sbGVjdGlvbi5cblx0ICogQHBhcmFtIHtudW1iZXJ9IFthbW91bnRdIEFtb3VudCBvZiB2YWx1ZXMgdG8gb2J0YWluIHJhbmRvbWx5XG5cdCAqIEByZXR1cm5zIHsqfEFycmF5PCo+fSBBIHNpbmdsZSB2YWx1ZSBpZiBubyBhbW91bnQgaXMgcHJvdmlkZWQgb3IgYW4gYXJyYXkgb2YgdmFsdWVzXG5cdCAqL1xuXHRwdWJsaWMgcmFuZG9tKCk6IFY7XG5cdHB1YmxpYyByYW5kb20oYW1vdW50OiBudW1iZXIpOiBWW107XG5cdHB1YmxpYyByYW5kb20oYW1vdW50PzogbnVtYmVyKTogViB8IFZbXSB7XG5cdFx0Y29uc3QgYXJyID0gWy4uLnRoaXMudmFsdWVzKCldO1xuXHRcdGlmICh0eXBlb2YgYW1vdW50ID09PSAndW5kZWZpbmVkJykgcmV0dXJuIGFycltNYXRoLmZsb29yKE1hdGgucmFuZG9tKCkgKiBhcnIubGVuZ3RoKV07XG5cdFx0aWYgKCFhcnIubGVuZ3RoIHx8ICFhbW91bnQpIHJldHVybiBbXTtcblx0XHRyZXR1cm4gQXJyYXkuZnJvbShcblx0XHRcdHsgbGVuZ3RoOiBNYXRoLm1pbihhbW91bnQsIGFyci5sZW5ndGgpIH0sXG5cdFx0XHQoKTogViA9PiBhcnIuc3BsaWNlKE1hdGguZmxvb3IoTWF0aC5yYW5kb20oKSAqIGFyci5sZW5ndGgpLCAxKVswXSxcblx0XHQpO1xuXHR9XG5cblx0LyoqXG5cdCAqIE9idGFpbnMgdW5pcXVlIHJhbmRvbSBrZXkocykgZnJvbSB0aGlzIGNvbGxlY3Rpb24uXG5cdCAqIEBwYXJhbSB7bnVtYmVyfSBbYW1vdW50XSBBbW91bnQgb2Yga2V5cyB0byBvYnRhaW4gcmFuZG9tbHlcblx0ICogQHJldHVybnMgeyp8QXJyYXk8Kj59IEEgc2luZ2xlIGtleSBpZiBubyBhbW91bnQgaXMgcHJvdmlkZWQgb3IgYW4gYXJyYXlcblx0ICovXG5cdHB1YmxpYyByYW5kb21LZXkoKTogSztcblx0cHVibGljIHJhbmRvbUtleShhbW91bnQ6IG51bWJlcik6IEtbXTtcblx0cHVibGljIHJhbmRvbUtleShhbW91bnQ/OiBudW1iZXIpOiBLIHwgS1tdIHtcblx0XHRjb25zdCBhcnIgPSBbLi4udGhpcy5rZXlzKCldO1xuXHRcdGlmICh0eXBlb2YgYW1vdW50ID09PSAndW5kZWZpbmVkJykgcmV0dXJuIGFycltNYXRoLmZsb29yKE1hdGgucmFuZG9tKCkgKiBhcnIubGVuZ3RoKV07XG5cdFx0aWYgKCFhcnIubGVuZ3RoIHx8ICFhbW91bnQpIHJldHVybiBbXTtcblx0XHRyZXR1cm4gQXJyYXkuZnJvbShcblx0XHRcdHsgbGVuZ3RoOiBNYXRoLm1pbihhbW91bnQsIGFyci5sZW5ndGgpIH0sXG5cdFx0XHQoKTogSyA9PiBhcnIuc3BsaWNlKE1hdGguZmxvb3IoTWF0aC5yYW5kb20oKSAqIGFyci5sZW5ndGgpLCAxKVswXSxcblx0XHQpO1xuXHR9XG5cblx0LyoqXG5cdCAqIFNlYXJjaGVzIGZvciBhIHNpbmdsZSBpdGVtIHdoZXJlIHRoZSBnaXZlbiBmdW5jdGlvbiByZXR1cm5zIGEgdHJ1dGh5IHZhbHVlLiBUaGlzIGJlaGF2ZXMgbGlrZVxuXHQgKiBbQXJyYXkuZmluZCgpXShodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi1VUy9kb2NzL1dlYi9KYXZhU2NyaXB0L1JlZmVyZW5jZS9HbG9iYWxfT2JqZWN0cy9BcnJheS9maW5kKS5cblx0ICogPHdhcm4+QWxsIGNvbGxlY3Rpb25zIHVzZWQgaW4gRGlzY29yZC5qcyBhcmUgbWFwcGVkIHVzaW5nIHRoZWlyIGBpZGAgcHJvcGVydHksIGFuZCBpZiB5b3Ugd2FudCB0byBmaW5kIGJ5IGlkIHlvdVxuXHQgKiBzaG91bGQgdXNlIHRoZSBgZ2V0YCBtZXRob2QuIFNlZVxuXHQgKiBbTUROXShodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi1VUy9kb2NzL1dlYi9KYXZhU2NyaXB0L1JlZmVyZW5jZS9HbG9iYWxfT2JqZWN0cy9NYXAvZ2V0KSBmb3IgZGV0YWlscy48L3dhcm4+XG5cdCAqIEBwYXJhbSB7RnVuY3Rpb259IGZuIFRoZSBmdW5jdGlvbiB0byB0ZXN0IHdpdGggKHNob3VsZCByZXR1cm4gYm9vbGVhbilcblx0ICogQHBhcmFtIHsqfSBbdGhpc0FyZ10gVmFsdWUgdG8gdXNlIGFzIGB0aGlzYCB3aGVuIGV4ZWN1dGluZyBmdW5jdGlvblxuXHQgKiBAcmV0dXJucyB7Kn1cblx0ICogQGV4YW1wbGUgY29sbGVjdGlvbi5maW5kKHVzZXIgPT4gdXNlci51c2VybmFtZSA9PT0gJ0JvYicpO1xuXHQgKi9cblx0cHVibGljIGZpbmQ8VjIgZXh0ZW5kcyBWPihmbjogKHZhbHVlOiBWLCBrZXk6IEssIGNvbGxlY3Rpb246IHRoaXMpID0+IHZhbHVlIGlzIFYyKTogVjIgfCB1bmRlZmluZWQ7XG5cdHB1YmxpYyBmaW5kKGZuOiAodmFsdWU6IFYsIGtleTogSywgY29sbGVjdGlvbjogdGhpcykgPT4gYm9vbGVhbik6IFYgfCB1bmRlZmluZWQ7XG5cdHB1YmxpYyBmaW5kPFRoaXMsIFYyIGV4dGVuZHMgVj4oXG5cdFx0Zm46ICh0aGlzOiBUaGlzLCB2YWx1ZTogViwga2V5OiBLLCBjb2xsZWN0aW9uOiB0aGlzKSA9PiB2YWx1ZSBpcyBWMixcblx0XHR0aGlzQXJnOiBUaGlzLFxuXHQpOiBWMiB8IHVuZGVmaW5lZDtcblx0cHVibGljIGZpbmQ8VGhpcz4oZm46ICh0aGlzOiBUaGlzLCB2YWx1ZTogViwga2V5OiBLLCBjb2xsZWN0aW9uOiB0aGlzKSA9PiBib29sZWFuLCB0aGlzQXJnOiBUaGlzKTogViB8IHVuZGVmaW5lZDtcblx0cHVibGljIGZpbmQoZm46ICh2YWx1ZTogViwga2V5OiBLLCBjb2xsZWN0aW9uOiB0aGlzKSA9PiBib29sZWFuLCB0aGlzQXJnPzogdW5rbm93bik6IFYgfCB1bmRlZmluZWQge1xuXHRcdGlmICh0eXBlb2YgdGhpc0FyZyAhPT0gJ3VuZGVmaW5lZCcpIGZuID0gZm4uYmluZCh0aGlzQXJnKTtcblx0XHRmb3IgKGNvbnN0IFtrZXksIHZhbF0gb2YgdGhpcykge1xuXHRcdFx0aWYgKGZuKHZhbCwga2V5LCB0aGlzKSkgcmV0dXJuIHZhbDtcblx0XHR9XG5cdFx0cmV0dXJuIHVuZGVmaW5lZDtcblx0fVxuXG5cdC8qKlxuXHQgKiBTZWFyY2hlcyBmb3IgdGhlIGtleSBvZiBhIHNpbmdsZSBpdGVtIHdoZXJlIHRoZSBnaXZlbiBmdW5jdGlvbiByZXR1cm5zIGEgdHJ1dGh5IHZhbHVlLiBUaGlzIGJlaGF2ZXMgbGlrZVxuXHQgKiBbQXJyYXkuZmluZEluZGV4KCldKGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvV2ViL0phdmFTY3JpcHQvUmVmZXJlbmNlL0dsb2JhbF9PYmplY3RzL0FycmF5L2ZpbmRJbmRleCksXG5cdCAqIGJ1dCByZXR1cm5zIHRoZSBrZXkgcmF0aGVyIHRoYW4gdGhlIHBvc2l0aW9uYWwgaW5kZXguXG5cdCAqIEBwYXJhbSB7RnVuY3Rpb259IGZuIFRoZSBmdW5jdGlvbiB0byB0ZXN0IHdpdGggKHNob3VsZCByZXR1cm4gYm9vbGVhbilcblx0ICogQHBhcmFtIHsqfSBbdGhpc0FyZ10gVmFsdWUgdG8gdXNlIGFzIGB0aGlzYCB3aGVuIGV4ZWN1dGluZyBmdW5jdGlvblxuXHQgKiBAcmV0dXJucyB7Kn1cblx0ICogQGV4YW1wbGUgY29sbGVjdGlvbi5maW5kS2V5KHVzZXIgPT4gdXNlci51c2VybmFtZSA9PT0gJ0JvYicpO1xuXHQgKi9cblx0cHVibGljIGZpbmRLZXk8SzIgZXh0ZW5kcyBLPihmbjogKHZhbHVlOiBWLCBrZXk6IEssIGNvbGxlY3Rpb246IHRoaXMpID0+IGtleSBpcyBLMik6IEsyIHwgdW5kZWZpbmVkO1xuXHRwdWJsaWMgZmluZEtleShmbjogKHZhbHVlOiBWLCBrZXk6IEssIGNvbGxlY3Rpb246IHRoaXMpID0+IGJvb2xlYW4pOiBLIHwgdW5kZWZpbmVkO1xuXHRwdWJsaWMgZmluZEtleTxUaGlzLCBLMiBleHRlbmRzIEs+KFxuXHRcdGZuOiAodGhpczogVGhpcywgdmFsdWU6IFYsIGtleTogSywgY29sbGVjdGlvbjogdGhpcykgPT4ga2V5IGlzIEsyLFxuXHRcdHRoaXNBcmc6IFRoaXMsXG5cdCk6IEsyIHwgdW5kZWZpbmVkO1xuXHRwdWJsaWMgZmluZEtleTxUaGlzPihmbjogKHRoaXM6IFRoaXMsIHZhbHVlOiBWLCBrZXk6IEssIGNvbGxlY3Rpb246IHRoaXMpID0+IGJvb2xlYW4sIHRoaXNBcmc6IFRoaXMpOiBLIHwgdW5kZWZpbmVkO1xuXHRwdWJsaWMgZmluZEtleShmbjogKHZhbHVlOiBWLCBrZXk6IEssIGNvbGxlY3Rpb246IHRoaXMpID0+IGJvb2xlYW4sIHRoaXNBcmc/OiB1bmtub3duKTogSyB8IHVuZGVmaW5lZCB7XG5cdFx0aWYgKHR5cGVvZiB0aGlzQXJnICE9PSAndW5kZWZpbmVkJykgZm4gPSBmbi5iaW5kKHRoaXNBcmcpO1xuXHRcdGZvciAoY29uc3QgW2tleSwgdmFsXSBvZiB0aGlzKSB7XG5cdFx0XHRpZiAoZm4odmFsLCBrZXksIHRoaXMpKSByZXR1cm4ga2V5O1xuXHRcdH1cblx0XHRyZXR1cm4gdW5kZWZpbmVkO1xuXHR9XG5cblx0LyoqXG5cdCAqIFJlbW92ZXMgaXRlbXMgdGhhdCBzYXRpc2Z5IHRoZSBwcm92aWRlZCBmaWx0ZXIgZnVuY3Rpb24uXG5cdCAqIEBwYXJhbSB7RnVuY3Rpb259IGZuIEZ1bmN0aW9uIHVzZWQgdG8gdGVzdCAoc2hvdWxkIHJldHVybiBhIGJvb2xlYW4pXG5cdCAqIEBwYXJhbSB7Kn0gW3RoaXNBcmddIFZhbHVlIHRvIHVzZSBhcyBgdGhpc2Agd2hlbiBleGVjdXRpbmcgZnVuY3Rpb25cblx0ICogQHJldHVybnMge251bWJlcn0gVGhlIG51bWJlciBvZiByZW1vdmVkIGVudHJpZXNcblx0ICovXG5cdHB1YmxpYyBzd2VlcChmbjogKHZhbHVlOiBWLCBrZXk6IEssIGNvbGxlY3Rpb246IHRoaXMpID0+IGJvb2xlYW4pOiBudW1iZXI7XG5cdHB1YmxpYyBzd2VlcDxUPihmbjogKHRoaXM6IFQsIHZhbHVlOiBWLCBrZXk6IEssIGNvbGxlY3Rpb246IHRoaXMpID0+IGJvb2xlYW4sIHRoaXNBcmc6IFQpOiBudW1iZXI7XG5cdHB1YmxpYyBzd2VlcChmbjogKHZhbHVlOiBWLCBrZXk6IEssIGNvbGxlY3Rpb246IHRoaXMpID0+IGJvb2xlYW4sIHRoaXNBcmc/OiB1bmtub3duKTogbnVtYmVyIHtcblx0XHRpZiAodHlwZW9mIHRoaXNBcmcgIT09ICd1bmRlZmluZWQnKSBmbiA9IGZuLmJpbmQodGhpc0FyZyk7XG5cdFx0Y29uc3QgcHJldmlvdXNTaXplID0gdGhpcy5zaXplO1xuXHRcdGZvciAoY29uc3QgW2tleSwgdmFsXSBvZiB0aGlzKSB7XG5cdFx0XHRpZiAoZm4odmFsLCBrZXksIHRoaXMpKSB0aGlzLmRlbGV0ZShrZXkpO1xuXHRcdH1cblx0XHRyZXR1cm4gcHJldmlvdXNTaXplIC0gdGhpcy5zaXplO1xuXHR9XG5cblx0LyoqXG5cdCAqIElkZW50aWNhbCB0b1xuXHQgKiBbQXJyYXkuZmlsdGVyKCldKGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvV2ViL0phdmFTY3JpcHQvUmVmZXJlbmNlL0dsb2JhbF9PYmplY3RzL0FycmF5L2ZpbHRlciksXG5cdCAqIGJ1dCByZXR1cm5zIGEgQ29sbGVjdGlvbiBpbnN0ZWFkIG9mIGFuIEFycmF5LlxuXHQgKiBAcGFyYW0ge0Z1bmN0aW9ufSBmbiBUaGUgZnVuY3Rpb24gdG8gdGVzdCB3aXRoIChzaG91bGQgcmV0dXJuIGJvb2xlYW4pXG5cdCAqIEBwYXJhbSB7Kn0gW3RoaXNBcmddIFZhbHVlIHRvIHVzZSBhcyBgdGhpc2Agd2hlbiBleGVjdXRpbmcgZnVuY3Rpb25cblx0ICogQHJldHVybnMge0NvbGxlY3Rpb259XG5cdCAqIEBleGFtcGxlIGNvbGxlY3Rpb24uZmlsdGVyKHVzZXIgPT4gdXNlci51c2VybmFtZSA9PT0gJ0JvYicpO1xuXHQgKi9cblx0cHVibGljIGZpbHRlcjxLMiBleHRlbmRzIEs+KGZuOiAodmFsdWU6IFYsIGtleTogSywgY29sbGVjdGlvbjogdGhpcykgPT4ga2V5IGlzIEsyKTogQ29sbGVjdGlvbjxLMiwgVj47XG5cdHB1YmxpYyBmaWx0ZXI8VjIgZXh0ZW5kcyBWPihmbjogKHZhbHVlOiBWLCBrZXk6IEssIGNvbGxlY3Rpb246IHRoaXMpID0+IHZhbHVlIGlzIFYyKTogQ29sbGVjdGlvbjxLLCBWMj47XG5cdHB1YmxpYyBmaWx0ZXIoZm46ICh2YWx1ZTogViwga2V5OiBLLCBjb2xsZWN0aW9uOiB0aGlzKSA9PiBib29sZWFuKTogQ29sbGVjdGlvbjxLLCBWPjtcblx0cHVibGljIGZpbHRlcjxUaGlzLCBLMiBleHRlbmRzIEs+KFxuXHRcdGZuOiAodGhpczogVGhpcywgdmFsdWU6IFYsIGtleTogSywgY29sbGVjdGlvbjogdGhpcykgPT4ga2V5IGlzIEsyLFxuXHRcdHRoaXNBcmc6IFRoaXMsXG5cdCk6IENvbGxlY3Rpb248SzIsIFY+O1xuXHRwdWJsaWMgZmlsdGVyPFRoaXMsIFYyIGV4dGVuZHMgVj4oXG5cdFx0Zm46ICh0aGlzOiBUaGlzLCB2YWx1ZTogViwga2V5OiBLLCBjb2xsZWN0aW9uOiB0aGlzKSA9PiB2YWx1ZSBpcyBWMixcblx0XHR0aGlzQXJnOiBUaGlzLFxuXHQpOiBDb2xsZWN0aW9uPEssIFYyPjtcblx0cHVibGljIGZpbHRlcjxUaGlzPihmbjogKHRoaXM6IFRoaXMsIHZhbHVlOiBWLCBrZXk6IEssIGNvbGxlY3Rpb246IHRoaXMpID0+IGJvb2xlYW4sIHRoaXNBcmc6IFRoaXMpOiBDb2xsZWN0aW9uPEssIFY+O1xuXHRwdWJsaWMgZmlsdGVyKGZuOiAodmFsdWU6IFYsIGtleTogSywgY29sbGVjdGlvbjogdGhpcykgPT4gYm9vbGVhbiwgdGhpc0FyZz86IHVua25vd24pOiBDb2xsZWN0aW9uPEssIFY+IHtcblx0XHRpZiAodHlwZW9mIHRoaXNBcmcgIT09ICd1bmRlZmluZWQnKSBmbiA9IGZuLmJpbmQodGhpc0FyZyk7XG5cdFx0Y29uc3QgcmVzdWx0cyA9IG5ldyB0aGlzLmNvbnN0cnVjdG9yW1N5bWJvbC5zcGVjaWVzXTxLLCBWPigpO1xuXHRcdGZvciAoY29uc3QgW2tleSwgdmFsXSBvZiB0aGlzKSB7XG5cdFx0XHRpZiAoZm4odmFsLCBrZXksIHRoaXMpKSByZXN1bHRzLnNldChrZXksIHZhbCk7XG5cdFx0fVxuXHRcdHJldHVybiByZXN1bHRzO1xuXHR9XG5cblx0LyoqXG5cdCAqIFBhcnRpdGlvbnMgdGhlIGNvbGxlY3Rpb24gaW50byB0d28gY29sbGVjdGlvbnMgd2hlcmUgdGhlIGZpcnN0IGNvbGxlY3Rpb25cblx0ICogY29udGFpbnMgdGhlIGl0ZW1zIHRoYXQgcGFzc2VkIGFuZCB0aGUgc2Vjb25kIGNvbnRhaW5zIHRoZSBpdGVtcyB0aGF0IGZhaWxlZC5cblx0ICogQHBhcmFtIHtGdW5jdGlvbn0gZm4gRnVuY3Rpb24gdXNlZCB0byB0ZXN0IChzaG91bGQgcmV0dXJuIGEgYm9vbGVhbilcblx0ICogQHBhcmFtIHsqfSBbdGhpc0FyZ10gVmFsdWUgdG8gdXNlIGFzIGB0aGlzYCB3aGVuIGV4ZWN1dGluZyBmdW5jdGlvblxuXHQgKiBAcmV0dXJucyB7Q29sbGVjdGlvbltdfVxuXHQgKiBAZXhhbXBsZSBjb25zdCBbYmlnLCBzbWFsbF0gPSBjb2xsZWN0aW9uLnBhcnRpdGlvbihndWlsZCA9PiBndWlsZC5tZW1iZXJDb3VudCA+IDI1MCk7XG5cdCAqL1xuXHRwdWJsaWMgcGFydGl0aW9uPEsyIGV4dGVuZHMgSz4oXG5cdFx0Zm46ICh2YWx1ZTogViwga2V5OiBLLCBjb2xsZWN0aW9uOiB0aGlzKSA9PiBrZXkgaXMgSzIsXG5cdCk6IFtDb2xsZWN0aW9uPEsyLCBWPiwgQ29sbGVjdGlvbjxFeGNsdWRlPEssIEsyPiwgVj5dO1xuXHRwdWJsaWMgcGFydGl0aW9uPFYyIGV4dGVuZHMgVj4oXG5cdFx0Zm46ICh2YWx1ZTogViwga2V5OiBLLCBjb2xsZWN0aW9uOiB0aGlzKSA9PiB2YWx1ZSBpcyBWMixcblx0KTogW0NvbGxlY3Rpb248SywgVjI+LCBDb2xsZWN0aW9uPEssIEV4Y2x1ZGU8ViwgVjI+Pl07XG5cdHB1YmxpYyBwYXJ0aXRpb24oZm46ICh2YWx1ZTogViwga2V5OiBLLCBjb2xsZWN0aW9uOiB0aGlzKSA9PiBib29sZWFuKTogW0NvbGxlY3Rpb248SywgVj4sIENvbGxlY3Rpb248SywgVj5dO1xuXHRwdWJsaWMgcGFydGl0aW9uPFRoaXMsIEsyIGV4dGVuZHMgSz4oXG5cdFx0Zm46ICh0aGlzOiBUaGlzLCB2YWx1ZTogViwga2V5OiBLLCBjb2xsZWN0aW9uOiB0aGlzKSA9PiBrZXkgaXMgSzIsXG5cdFx0dGhpc0FyZzogVGhpcyxcblx0KTogW0NvbGxlY3Rpb248SzIsIFY+LCBDb2xsZWN0aW9uPEV4Y2x1ZGU8SywgSzI+LCBWPl07XG5cdHB1YmxpYyBwYXJ0aXRpb248VGhpcywgVjIgZXh0ZW5kcyBWPihcblx0XHRmbjogKHRoaXM6IFRoaXMsIHZhbHVlOiBWLCBrZXk6IEssIGNvbGxlY3Rpb246IHRoaXMpID0+IHZhbHVlIGlzIFYyLFxuXHRcdHRoaXNBcmc6IFRoaXMsXG5cdCk6IFtDb2xsZWN0aW9uPEssIFYyPiwgQ29sbGVjdGlvbjxLLCBFeGNsdWRlPFYsIFYyPj5dO1xuXHRwdWJsaWMgcGFydGl0aW9uPFRoaXM+KFxuXHRcdGZuOiAodGhpczogVGhpcywgdmFsdWU6IFYsIGtleTogSywgY29sbGVjdGlvbjogdGhpcykgPT4gYm9vbGVhbixcblx0XHR0aGlzQXJnOiBUaGlzLFxuXHQpOiBbQ29sbGVjdGlvbjxLLCBWPiwgQ29sbGVjdGlvbjxLLCBWPl07XG5cdHB1YmxpYyBwYXJ0aXRpb24oXG5cdFx0Zm46ICh2YWx1ZTogViwga2V5OiBLLCBjb2xsZWN0aW9uOiB0aGlzKSA9PiBib29sZWFuLFxuXHRcdHRoaXNBcmc/OiB1bmtub3duLFxuXHQpOiBbQ29sbGVjdGlvbjxLLCBWPiwgQ29sbGVjdGlvbjxLLCBWPl0ge1xuXHRcdGlmICh0eXBlb2YgdGhpc0FyZyAhPT0gJ3VuZGVmaW5lZCcpIGZuID0gZm4uYmluZCh0aGlzQXJnKTtcblx0XHRjb25zdCByZXN1bHRzOiBbQ29sbGVjdGlvbjxLLCBWPiwgQ29sbGVjdGlvbjxLLCBWPl0gPSBbXG5cdFx0XHRuZXcgdGhpcy5jb25zdHJ1Y3RvcltTeW1ib2wuc3BlY2llc108SywgVj4oKSxcblx0XHRcdG5ldyB0aGlzLmNvbnN0cnVjdG9yW1N5bWJvbC5zcGVjaWVzXTxLLCBWPigpLFxuXHRcdF07XG5cdFx0Zm9yIChjb25zdCBba2V5LCB2YWxdIG9mIHRoaXMpIHtcblx0XHRcdGlmIChmbih2YWwsIGtleSwgdGhpcykpIHtcblx0XHRcdFx0cmVzdWx0c1swXS5zZXQoa2V5LCB2YWwpO1xuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0cmVzdWx0c1sxXS5zZXQoa2V5LCB2YWwpO1xuXHRcdFx0fVxuXHRcdH1cblx0XHRyZXR1cm4gcmVzdWx0cztcblx0fVxuXG5cdC8qKlxuXHQgKiBNYXBzIGVhY2ggaXRlbSBpbnRvIGEgQ29sbGVjdGlvbiwgdGhlbiBqb2lucyB0aGUgcmVzdWx0cyBpbnRvIGEgc2luZ2xlIENvbGxlY3Rpb24uIElkZW50aWNhbCBpbiBiZWhhdmlvciB0b1xuXHQgKiBbQXJyYXkuZmxhdE1hcCgpXShodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi1VUy9kb2NzL1dlYi9KYXZhU2NyaXB0L1JlZmVyZW5jZS9HbG9iYWxfT2JqZWN0cy9BcnJheS9mbGF0TWFwKS5cblx0ICogQHBhcmFtIHtGdW5jdGlvbn0gZm4gRnVuY3Rpb24gdGhhdCBwcm9kdWNlcyBhIG5ldyBDb2xsZWN0aW9uXG5cdCAqIEBwYXJhbSB7Kn0gW3RoaXNBcmddIFZhbHVlIHRvIHVzZSBhcyBgdGhpc2Agd2hlbiBleGVjdXRpbmcgZnVuY3Rpb25cblx0ICogQHJldHVybnMge0NvbGxlY3Rpb259XG5cdCAqIEBleGFtcGxlIGNvbGxlY3Rpb24uZmxhdE1hcChndWlsZCA9PiBndWlsZC5tZW1iZXJzLmNhY2hlKTtcblx0ICovXG5cdHB1YmxpYyBmbGF0TWFwPFQ+KGZuOiAodmFsdWU6IFYsIGtleTogSywgY29sbGVjdGlvbjogdGhpcykgPT4gQ29sbGVjdGlvbjxLLCBUPik6IENvbGxlY3Rpb248SywgVD47XG5cdHB1YmxpYyBmbGF0TWFwPFQsIFRoaXM+KFxuXHRcdGZuOiAodGhpczogVGhpcywgdmFsdWU6IFYsIGtleTogSywgY29sbGVjdGlvbjogdGhpcykgPT4gQ29sbGVjdGlvbjxLLCBUPixcblx0XHR0aGlzQXJnOiBUaGlzLFxuXHQpOiBDb2xsZWN0aW9uPEssIFQ+O1xuXHRwdWJsaWMgZmxhdE1hcDxUPihmbjogKHZhbHVlOiBWLCBrZXk6IEssIGNvbGxlY3Rpb246IHRoaXMpID0+IENvbGxlY3Rpb248SywgVD4sIHRoaXNBcmc/OiB1bmtub3duKTogQ29sbGVjdGlvbjxLLCBUPiB7XG5cdFx0Y29uc3QgY29sbGVjdGlvbnMgPSB0aGlzLm1hcChmbiwgdGhpc0FyZyk7XG5cdFx0cmV0dXJuIG5ldyB0aGlzLmNvbnN0cnVjdG9yW1N5bWJvbC5zcGVjaWVzXTxLLCBUPigpLmNvbmNhdCguLi5jb2xsZWN0aW9ucyk7XG5cdH1cblxuXHQvKipcblx0ICogTWFwcyBlYWNoIGl0ZW0gdG8gYW5vdGhlciB2YWx1ZSBpbnRvIGFuIGFycmF5LiBJZGVudGljYWwgaW4gYmVoYXZpb3IgdG9cblx0ICogW0FycmF5Lm1hcCgpXShodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi1VUy9kb2NzL1dlYi9KYXZhU2NyaXB0L1JlZmVyZW5jZS9HbG9iYWxfT2JqZWN0cy9BcnJheS9tYXApLlxuXHQgKiBAcGFyYW0ge0Z1bmN0aW9ufSBmbiBGdW5jdGlvbiB0aGF0IHByb2R1Y2VzIGFuIGVsZW1lbnQgb2YgdGhlIG5ldyBhcnJheSwgdGFraW5nIHRocmVlIGFyZ3VtZW50c1xuXHQgKiBAcGFyYW0geyp9IFt0aGlzQXJnXSBWYWx1ZSB0byB1c2UgYXMgYHRoaXNgIHdoZW4gZXhlY3V0aW5nIGZ1bmN0aW9uXG5cdCAqIEByZXR1cm5zIHtBcnJheX1cblx0ICogQGV4YW1wbGUgY29sbGVjdGlvbi5tYXAodXNlciA9PiB1c2VyLnRhZyk7XG5cdCAqL1xuXHRwdWJsaWMgbWFwPFQ+KGZuOiAodmFsdWU6IFYsIGtleTogSywgY29sbGVjdGlvbjogdGhpcykgPT4gVCk6IFRbXTtcblx0cHVibGljIG1hcDxUaGlzLCBUPihmbjogKHRoaXM6IFRoaXMsIHZhbHVlOiBWLCBrZXk6IEssIGNvbGxlY3Rpb246IHRoaXMpID0+IFQsIHRoaXNBcmc6IFRoaXMpOiBUW107XG5cdHB1YmxpYyBtYXA8VD4oZm46ICh2YWx1ZTogViwga2V5OiBLLCBjb2xsZWN0aW9uOiB0aGlzKSA9PiBULCB0aGlzQXJnPzogdW5rbm93bik6IFRbXSB7XG5cdFx0aWYgKHR5cGVvZiB0aGlzQXJnICE9PSAndW5kZWZpbmVkJykgZm4gPSBmbi5iaW5kKHRoaXNBcmcpO1xuXHRcdGNvbnN0IGl0ZXIgPSB0aGlzLmVudHJpZXMoKTtcblx0XHRyZXR1cm4gQXJyYXkuZnJvbSh7IGxlbmd0aDogdGhpcy5zaXplIH0sICgpOiBUID0+IHtcblx0XHRcdGNvbnN0IFtrZXksIHZhbHVlXSA9IGl0ZXIubmV4dCgpLnZhbHVlO1xuXHRcdFx0cmV0dXJuIGZuKHZhbHVlLCBrZXksIHRoaXMpO1xuXHRcdH0pO1xuXHR9XG5cblx0LyoqXG5cdCAqIE1hcHMgZWFjaCBpdGVtIHRvIGFub3RoZXIgdmFsdWUgaW50byBhIGNvbGxlY3Rpb24uIElkZW50aWNhbCBpbiBiZWhhdmlvciB0b1xuXHQgKiBbQXJyYXkubWFwKCldKGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvV2ViL0phdmFTY3JpcHQvUmVmZXJlbmNlL0dsb2JhbF9PYmplY3RzL0FycmF5L21hcCkuXG5cdCAqIEBwYXJhbSB7RnVuY3Rpb259IGZuIEZ1bmN0aW9uIHRoYXQgcHJvZHVjZXMgYW4gZWxlbWVudCBvZiB0aGUgbmV3IGNvbGxlY3Rpb24sIHRha2luZyB0aHJlZSBhcmd1bWVudHNcblx0ICogQHBhcmFtIHsqfSBbdGhpc0FyZ10gVmFsdWUgdG8gdXNlIGFzIGB0aGlzYCB3aGVuIGV4ZWN1dGluZyBmdW5jdGlvblxuXHQgKiBAcmV0dXJucyB7Q29sbGVjdGlvbn1cblx0ICogQGV4YW1wbGUgY29sbGVjdGlvbi5tYXBWYWx1ZXModXNlciA9PiB1c2VyLnRhZyk7XG5cdCAqL1xuXHRwdWJsaWMgbWFwVmFsdWVzPFQ+KGZuOiAodmFsdWU6IFYsIGtleTogSywgY29sbGVjdGlvbjogdGhpcykgPT4gVCk6IENvbGxlY3Rpb248SywgVD47XG5cdHB1YmxpYyBtYXBWYWx1ZXM8VGhpcywgVD4oZm46ICh0aGlzOiBUaGlzLCB2YWx1ZTogViwga2V5OiBLLCBjb2xsZWN0aW9uOiB0aGlzKSA9PiBULCB0aGlzQXJnOiBUaGlzKTogQ29sbGVjdGlvbjxLLCBUPjtcblx0cHVibGljIG1hcFZhbHVlczxUPihmbjogKHZhbHVlOiBWLCBrZXk6IEssIGNvbGxlY3Rpb246IHRoaXMpID0+IFQsIHRoaXNBcmc/OiB1bmtub3duKTogQ29sbGVjdGlvbjxLLCBUPiB7XG5cdFx0aWYgKHR5cGVvZiB0aGlzQXJnICE9PSAndW5kZWZpbmVkJykgZm4gPSBmbi5iaW5kKHRoaXNBcmcpO1xuXHRcdGNvbnN0IGNvbGwgPSBuZXcgdGhpcy5jb25zdHJ1Y3RvcltTeW1ib2wuc3BlY2llc108SywgVD4oKTtcblx0XHRmb3IgKGNvbnN0IFtrZXksIHZhbF0gb2YgdGhpcykgY29sbC5zZXQoa2V5LCBmbih2YWwsIGtleSwgdGhpcykpO1xuXHRcdHJldHVybiBjb2xsO1xuXHR9XG5cblx0LyoqXG5cdCAqIENoZWNrcyBpZiB0aGVyZSBleGlzdHMgYW4gaXRlbSB0aGF0IHBhc3NlcyBhIHRlc3QuIElkZW50aWNhbCBpbiBiZWhhdmlvciB0b1xuXHQgKiBbQXJyYXkuc29tZSgpXShodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi1VUy9kb2NzL1dlYi9KYXZhU2NyaXB0L1JlZmVyZW5jZS9HbG9iYWxfT2JqZWN0cy9BcnJheS9zb21lKS5cblx0ICogQHBhcmFtIHtGdW5jdGlvbn0gZm4gRnVuY3Rpb24gdXNlZCB0byB0ZXN0IChzaG91bGQgcmV0dXJuIGEgYm9vbGVhbilcblx0ICogQHBhcmFtIHsqfSBbdGhpc0FyZ10gVmFsdWUgdG8gdXNlIGFzIGB0aGlzYCB3aGVuIGV4ZWN1dGluZyBmdW5jdGlvblxuXHQgKiBAcmV0dXJucyB7Ym9vbGVhbn1cblx0ICogQGV4YW1wbGUgY29sbGVjdGlvbi5zb21lKHVzZXIgPT4gdXNlci5kaXNjcmltaW5hdG9yID09PSAnMDAwMCcpO1xuXHQgKi9cblx0cHVibGljIHNvbWUoZm46ICh2YWx1ZTogViwga2V5OiBLLCBjb2xsZWN0aW9uOiB0aGlzKSA9PiBib29sZWFuKTogYm9vbGVhbjtcblx0cHVibGljIHNvbWU8VD4oZm46ICh0aGlzOiBULCB2YWx1ZTogViwga2V5OiBLLCBjb2xsZWN0aW9uOiB0aGlzKSA9PiBib29sZWFuLCB0aGlzQXJnOiBUKTogYm9vbGVhbjtcblx0cHVibGljIHNvbWUoZm46ICh2YWx1ZTogViwga2V5OiBLLCBjb2xsZWN0aW9uOiB0aGlzKSA9PiBib29sZWFuLCB0aGlzQXJnPzogdW5rbm93bik6IGJvb2xlYW4ge1xuXHRcdGlmICh0eXBlb2YgdGhpc0FyZyAhPT0gJ3VuZGVmaW5lZCcpIGZuID0gZm4uYmluZCh0aGlzQXJnKTtcblx0XHRmb3IgKGNvbnN0IFtrZXksIHZhbF0gb2YgdGhpcykge1xuXHRcdFx0aWYgKGZuKHZhbCwga2V5LCB0aGlzKSkgcmV0dXJuIHRydWU7XG5cdFx0fVxuXHRcdHJldHVybiBmYWxzZTtcblx0fVxuXG5cdC8qKlxuXHQgKiBDaGVja3MgaWYgYWxsIGl0ZW1zIHBhc3NlcyBhIHRlc3QuIElkZW50aWNhbCBpbiBiZWhhdmlvciB0b1xuXHQgKiBbQXJyYXkuZXZlcnkoKV0oaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9XZWIvSmF2YVNjcmlwdC9SZWZlcmVuY2UvR2xvYmFsX09iamVjdHMvQXJyYXkvZXZlcnkpLlxuXHQgKiBAcGFyYW0ge0Z1bmN0aW9ufSBmbiBGdW5jdGlvbiB1c2VkIHRvIHRlc3QgKHNob3VsZCByZXR1cm4gYSBib29sZWFuKVxuXHQgKiBAcGFyYW0geyp9IFt0aGlzQXJnXSBWYWx1ZSB0byB1c2UgYXMgYHRoaXNgIHdoZW4gZXhlY3V0aW5nIGZ1bmN0aW9uXG5cdCAqIEByZXR1cm5zIHtib29sZWFufVxuXHQgKiBAZXhhbXBsZSBjb2xsZWN0aW9uLmV2ZXJ5KHVzZXIgPT4gIXVzZXIuYm90KTtcblx0ICovXG5cdHB1YmxpYyBldmVyeTxLMiBleHRlbmRzIEs+KGZuOiAodmFsdWU6IFYsIGtleTogSywgY29sbGVjdGlvbjogdGhpcykgPT4ga2V5IGlzIEsyKTogdGhpcyBpcyBDb2xsZWN0aW9uPEsyLCBWPjtcblx0cHVibGljIGV2ZXJ5PFYyIGV4dGVuZHMgVj4oZm46ICh2YWx1ZTogViwga2V5OiBLLCBjb2xsZWN0aW9uOiB0aGlzKSA9PiB2YWx1ZSBpcyBWMik6IHRoaXMgaXMgQ29sbGVjdGlvbjxLLCBWMj47XG5cdHB1YmxpYyBldmVyeShmbjogKHZhbHVlOiBWLCBrZXk6IEssIGNvbGxlY3Rpb246IHRoaXMpID0+IGJvb2xlYW4pOiBib29sZWFuO1xuXHRwdWJsaWMgZXZlcnk8VGhpcywgSzIgZXh0ZW5kcyBLPihcblx0XHRmbjogKHRoaXM6IFRoaXMsIHZhbHVlOiBWLCBrZXk6IEssIGNvbGxlY3Rpb246IHRoaXMpID0+IGtleSBpcyBLMixcblx0XHR0aGlzQXJnOiBUaGlzLFxuXHQpOiB0aGlzIGlzIENvbGxlY3Rpb248SzIsIFY+O1xuXHRwdWJsaWMgZXZlcnk8VGhpcywgVjIgZXh0ZW5kcyBWPihcblx0XHRmbjogKHRoaXM6IFRoaXMsIHZhbHVlOiBWLCBrZXk6IEssIGNvbGxlY3Rpb246IHRoaXMpID0+IHZhbHVlIGlzIFYyLFxuXHRcdHRoaXNBcmc6IFRoaXMsXG5cdCk6IHRoaXMgaXMgQ29sbGVjdGlvbjxLLCBWMj47XG5cdHB1YmxpYyBldmVyeTxUaGlzPihmbjogKHRoaXM6IFRoaXMsIHZhbHVlOiBWLCBrZXk6IEssIGNvbGxlY3Rpb246IHRoaXMpID0+IGJvb2xlYW4sIHRoaXNBcmc6IFRoaXMpOiBib29sZWFuO1xuXHRwdWJsaWMgZXZlcnkoZm46ICh2YWx1ZTogViwga2V5OiBLLCBjb2xsZWN0aW9uOiB0aGlzKSA9PiBib29sZWFuLCB0aGlzQXJnPzogdW5rbm93bik6IGJvb2xlYW4ge1xuXHRcdGlmICh0eXBlb2YgdGhpc0FyZyAhPT0gJ3VuZGVmaW5lZCcpIGZuID0gZm4uYmluZCh0aGlzQXJnKTtcblx0XHRmb3IgKGNvbnN0IFtrZXksIHZhbF0gb2YgdGhpcykge1xuXHRcdFx0aWYgKCFmbih2YWwsIGtleSwgdGhpcykpIHJldHVybiBmYWxzZTtcblx0XHR9XG5cdFx0cmV0dXJuIHRydWU7XG5cdH1cblxuXHQvKipcblx0ICogQXBwbGllcyBhIGZ1bmN0aW9uIHRvIHByb2R1Y2UgYSBzaW5nbGUgdmFsdWUuIElkZW50aWNhbCBpbiBiZWhhdmlvciB0b1xuXHQgKiBbQXJyYXkucmVkdWNlKCldKGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvV2ViL0phdmFTY3JpcHQvUmVmZXJlbmNlL0dsb2JhbF9PYmplY3RzL0FycmF5L3JlZHVjZSkuXG5cdCAqIEBwYXJhbSB7RnVuY3Rpb259IGZuIEZ1bmN0aW9uIHVzZWQgdG8gcmVkdWNlLCB0YWtpbmcgZm91ciBhcmd1bWVudHM7IGBhY2N1bXVsYXRvcmAsIGBjdXJyZW50VmFsdWVgLCBgY3VycmVudEtleWAsXG5cdCAqIGFuZCBgY29sbGVjdGlvbmBcblx0ICogQHBhcmFtIHsqfSBbaW5pdGlhbFZhbHVlXSBTdGFydGluZyB2YWx1ZSBmb3IgdGhlIGFjY3VtdWxhdG9yXG5cdCAqIEByZXR1cm5zIHsqfVxuXHQgKiBAZXhhbXBsZSBjb2xsZWN0aW9uLnJlZHVjZSgoYWNjLCBndWlsZCkgPT4gYWNjICsgZ3VpbGQubWVtYmVyQ291bnQsIDApO1xuXHQgKi9cblx0cHVibGljIHJlZHVjZTxUPihmbjogKGFjY3VtdWxhdG9yOiBULCB2YWx1ZTogViwga2V5OiBLLCBjb2xsZWN0aW9uOiB0aGlzKSA9PiBULCBpbml0aWFsVmFsdWU/OiBUKTogVCB7XG5cdFx0bGV0IGFjY3VtdWxhdG9yITogVDtcblxuXHRcdGlmICh0eXBlb2YgaW5pdGlhbFZhbHVlICE9PSAndW5kZWZpbmVkJykge1xuXHRcdFx0YWNjdW11bGF0b3IgPSBpbml0aWFsVmFsdWU7XG5cdFx0XHRmb3IgKGNvbnN0IFtrZXksIHZhbF0gb2YgdGhpcykgYWNjdW11bGF0b3IgPSBmbihhY2N1bXVsYXRvciwgdmFsLCBrZXksIHRoaXMpO1xuXHRcdFx0cmV0dXJuIGFjY3VtdWxhdG9yO1xuXHRcdH1cblx0XHRsZXQgZmlyc3QgPSB0cnVlO1xuXHRcdGZvciAoY29uc3QgW2tleSwgdmFsXSBvZiB0aGlzKSB7XG5cdFx0XHRpZiAoZmlyc3QpIHtcblx0XHRcdFx0YWNjdW11bGF0b3IgPSB2YWwgYXMgdW5rbm93biBhcyBUO1xuXHRcdFx0XHRmaXJzdCA9IGZhbHNlO1xuXHRcdFx0XHRjb250aW51ZTtcblx0XHRcdH1cblx0XHRcdGFjY3VtdWxhdG9yID0gZm4oYWNjdW11bGF0b3IsIHZhbCwga2V5LCB0aGlzKTtcblx0XHR9XG5cblx0XHQvLyBObyBpdGVtcyBpdGVyYXRlZC5cblx0XHRpZiAoZmlyc3QpIHtcblx0XHRcdHRocm93IG5ldyBUeXBlRXJyb3IoJ1JlZHVjZSBvZiBlbXB0eSBjb2xsZWN0aW9uIHdpdGggbm8gaW5pdGlhbCB2YWx1ZScpO1xuXHRcdH1cblxuXHRcdHJldHVybiBhY2N1bXVsYXRvcjtcblx0fVxuXG5cdC8qKlxuXHQgKiBJZGVudGljYWwgdG9cblx0ICogW01hcC5mb3JFYWNoKCldKGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvV2ViL0phdmFTY3JpcHQvUmVmZXJlbmNlL0dsb2JhbF9PYmplY3RzL01hcC9mb3JFYWNoKSxcblx0ICogYnV0IHJldHVybnMgdGhlIGNvbGxlY3Rpb24gaW5zdGVhZCBvZiB1bmRlZmluZWQuXG5cdCAqIEBwYXJhbSB7RnVuY3Rpb259IGZuIEZ1bmN0aW9uIHRvIGV4ZWN1dGUgZm9yIGVhY2ggZWxlbWVudFxuXHQgKiBAcGFyYW0geyp9IFt0aGlzQXJnXSBWYWx1ZSB0byB1c2UgYXMgYHRoaXNgIHdoZW4gZXhlY3V0aW5nIGZ1bmN0aW9uXG5cdCAqIEByZXR1cm5zIHtDb2xsZWN0aW9ufVxuXHQgKiBAZXhhbXBsZVxuXHQgKiBjb2xsZWN0aW9uXG5cdCAqICAuZWFjaCh1c2VyID0+IGNvbnNvbGUubG9nKHVzZXIudXNlcm5hbWUpKVxuXHQgKiAgLmZpbHRlcih1c2VyID0+IHVzZXIuYm90KVxuXHQgKiAgLmVhY2godXNlciA9PiBjb25zb2xlLmxvZyh1c2VyLnVzZXJuYW1lKSk7XG5cdCAqL1xuXHRwdWJsaWMgZWFjaChmbjogKHZhbHVlOiBWLCBrZXk6IEssIGNvbGxlY3Rpb246IHRoaXMpID0+IHZvaWQpOiB0aGlzO1xuXHRwdWJsaWMgZWFjaDxUPihmbjogKHRoaXM6IFQsIHZhbHVlOiBWLCBrZXk6IEssIGNvbGxlY3Rpb246IHRoaXMpID0+IHZvaWQsIHRoaXNBcmc6IFQpOiB0aGlzO1xuXHRwdWJsaWMgZWFjaChmbjogKHZhbHVlOiBWLCBrZXk6IEssIGNvbGxlY3Rpb246IHRoaXMpID0+IHZvaWQsIHRoaXNBcmc/OiB1bmtub3duKTogdGhpcyB7XG5cdFx0dGhpcy5mb3JFYWNoKGZuIGFzICh2YWx1ZTogViwga2V5OiBLLCBtYXA6IE1hcDxLLCBWPikgPT4gdm9pZCwgdGhpc0FyZyk7XG5cdFx0cmV0dXJuIHRoaXM7XG5cdH1cblxuXHQvKipcblx0ICogUnVucyBhIGZ1bmN0aW9uIG9uIHRoZSBjb2xsZWN0aW9uIGFuZCByZXR1cm5zIHRoZSBjb2xsZWN0aW9uLlxuXHQgKiBAcGFyYW0ge0Z1bmN0aW9ufSBmbiBGdW5jdGlvbiB0byBleGVjdXRlXG5cdCAqIEBwYXJhbSB7Kn0gW3RoaXNBcmddIFZhbHVlIHRvIHVzZSBhcyBgdGhpc2Agd2hlbiBleGVjdXRpbmcgZnVuY3Rpb25cblx0ICogQHJldHVybnMge0NvbGxlY3Rpb259XG5cdCAqIEBleGFtcGxlXG5cdCAqIGNvbGxlY3Rpb25cblx0ICogIC50YXAoY29sbCA9PiBjb25zb2xlLmxvZyhjb2xsLnNpemUpKVxuXHQgKiAgLmZpbHRlcih1c2VyID0+IHVzZXIuYm90KVxuXHQgKiAgLnRhcChjb2xsID0+IGNvbnNvbGUubG9nKGNvbGwuc2l6ZSkpXG5cdCAqL1xuXHRwdWJsaWMgdGFwKGZuOiAoY29sbGVjdGlvbjogdGhpcykgPT4gdm9pZCk6IHRoaXM7XG5cdHB1YmxpYyB0YXA8VD4oZm46ICh0aGlzOiBULCBjb2xsZWN0aW9uOiB0aGlzKSA9PiB2b2lkLCB0aGlzQXJnOiBUKTogdGhpcztcblx0cHVibGljIHRhcChmbjogKGNvbGxlY3Rpb246IHRoaXMpID0+IHZvaWQsIHRoaXNBcmc/OiB1bmtub3duKTogdGhpcyB7XG5cdFx0aWYgKHR5cGVvZiB0aGlzQXJnICE9PSAndW5kZWZpbmVkJykgZm4gPSBmbi5iaW5kKHRoaXNBcmcpO1xuXHRcdGZuKHRoaXMpO1xuXHRcdHJldHVybiB0aGlzO1xuXHR9XG5cblx0LyoqXG5cdCAqIENyZWF0ZXMgYW4gaWRlbnRpY2FsIHNoYWxsb3cgY29weSBvZiB0aGlzIGNvbGxlY3Rpb24uXG5cdCAqIEByZXR1cm5zIHtDb2xsZWN0aW9ufVxuXHQgKiBAZXhhbXBsZSBjb25zdCBuZXdDb2xsID0gc29tZUNvbGwuY2xvbmUoKTtcblx0ICovXG5cdHB1YmxpYyBjbG9uZSgpOiBDb2xsZWN0aW9uPEssIFY+IHtcblx0XHRyZXR1cm4gbmV3IHRoaXMuY29uc3RydWN0b3JbU3ltYm9sLnNwZWNpZXNdKHRoaXMpO1xuXHR9XG5cblx0LyoqXG5cdCAqIENvbWJpbmVzIHRoaXMgY29sbGVjdGlvbiB3aXRoIG90aGVycyBpbnRvIGEgbmV3IGNvbGxlY3Rpb24uIE5vbmUgb2YgdGhlIHNvdXJjZSBjb2xsZWN0aW9ucyBhcmUgbW9kaWZpZWQuXG5cdCAqIEBwYXJhbSB7Li4uQ29sbGVjdGlvbn0gY29sbGVjdGlvbnMgQ29sbGVjdGlvbnMgdG8gbWVyZ2Vcblx0ICogQHJldHVybnMge0NvbGxlY3Rpb259XG5cdCAqIEBleGFtcGxlIGNvbnN0IG5ld0NvbGwgPSBzb21lQ29sbC5jb25jYXQoc29tZU90aGVyQ29sbCwgYW5vdGhlckNvbGwsIG9oQm95QUNvbGwpO1xuXHQgKi9cblx0cHVibGljIGNvbmNhdCguLi5jb2xsZWN0aW9uczogQ29sbGVjdGlvbjxLLCBWPltdKTogQ29sbGVjdGlvbjxLLCBWPiB7XG5cdFx0Y29uc3QgbmV3Q29sbCA9IHRoaXMuY2xvbmUoKTtcblx0XHRmb3IgKGNvbnN0IGNvbGwgb2YgY29sbGVjdGlvbnMpIHtcblx0XHRcdGZvciAoY29uc3QgW2tleSwgdmFsXSBvZiBjb2xsKSBuZXdDb2xsLnNldChrZXksIHZhbCk7XG5cdFx0fVxuXHRcdHJldHVybiBuZXdDb2xsO1xuXHR9XG5cblx0LyoqXG5cdCAqIENoZWNrcyBpZiB0aGlzIGNvbGxlY3Rpb24gc2hhcmVzIGlkZW50aWNhbCBpdGVtcyB3aXRoIGFub3RoZXIuXG5cdCAqIFRoaXMgaXMgZGlmZmVyZW50IHRvIGNoZWNraW5nIGZvciBlcXVhbGl0eSB1c2luZyBlcXVhbC1zaWducywgYmVjYXVzZVxuXHQgKiB0aGUgY29sbGVjdGlvbnMgbWF5IGJlIGRpZmZlcmVudCBvYmplY3RzLCBidXQgY29udGFpbiB0aGUgc2FtZSBkYXRhLlxuXHQgKiBAcGFyYW0ge0NvbGxlY3Rpb259IGNvbGxlY3Rpb24gQ29sbGVjdGlvbiB0byBjb21wYXJlIHdpdGhcblx0ICogQHJldHVybnMge2Jvb2xlYW59IFdoZXRoZXIgdGhlIGNvbGxlY3Rpb25zIGhhdmUgaWRlbnRpY2FsIGNvbnRlbnRzXG5cdCAqL1xuXHRwdWJsaWMgZXF1YWxzKGNvbGxlY3Rpb246IENvbGxlY3Rpb248SywgVj4pOiBib29sZWFuIHtcblx0XHQvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVubmVjZXNzYXJ5LWNvbmRpdGlvblxuXHRcdGlmICghY29sbGVjdGlvbikgcmV0dXJuIGZhbHNlOyAvLyBydW50aW1lIGNoZWNrXG5cdFx0aWYgKHRoaXMgPT09IGNvbGxlY3Rpb24pIHJldHVybiB0cnVlO1xuXHRcdGlmICh0aGlzLnNpemUgIT09IGNvbGxlY3Rpb24uc2l6ZSkgcmV0dXJuIGZhbHNlO1xuXHRcdGZvciAoY29uc3QgW2tleSwgdmFsdWVdIG9mIHRoaXMpIHtcblx0XHRcdGlmICghY29sbGVjdGlvbi5oYXMoa2V5KSB8fCB2YWx1ZSAhPT0gY29sbGVjdGlvbi5nZXQoa2V5KSkge1xuXHRcdFx0XHRyZXR1cm4gZmFsc2U7XG5cdFx0XHR9XG5cdFx0fVxuXHRcdHJldHVybiB0cnVlO1xuXHR9XG5cblx0LyoqXG5cdCAqIFRoZSBzb3J0IG1ldGhvZCBzb3J0cyB0aGUgaXRlbXMgb2YgYSBjb2xsZWN0aW9uIGluIHBsYWNlIGFuZCByZXR1cm5zIGl0LlxuXHQgKiBUaGUgc29ydCBpcyBub3QgbmVjZXNzYXJpbHkgc3RhYmxlIGluIE5vZGUgMTAgb3Igb2xkZXIuXG5cdCAqIFRoZSBkZWZhdWx0IHNvcnQgb3JkZXIgaXMgYWNjb3JkaW5nIHRvIHN0cmluZyBVbmljb2RlIGNvZGUgcG9pbnRzLlxuXHQgKiBAcGFyYW0ge0Z1bmN0aW9ufSBbY29tcGFyZUZ1bmN0aW9uXSBTcGVjaWZpZXMgYSBmdW5jdGlvbiB0aGF0IGRlZmluZXMgdGhlIHNvcnQgb3JkZXIuXG5cdCAqIElmIG9taXR0ZWQsIHRoZSBjb2xsZWN0aW9uIGlzIHNvcnRlZCBhY2NvcmRpbmcgdG8gZWFjaCBjaGFyYWN0ZXIncyBVbmljb2RlIGNvZGUgcG9pbnQgdmFsdWUsXG5cdCAqIGFjY29yZGluZyB0byB0aGUgc3RyaW5nIGNvbnZlcnNpb24gb2YgZWFjaCBlbGVtZW50LlxuXHQgKiBAcmV0dXJucyB7Q29sbGVjdGlvbn1cblx0ICogQGV4YW1wbGUgY29sbGVjdGlvbi5zb3J0KCh1c2VyQSwgdXNlckIpID0+IHVzZXJBLmNyZWF0ZWRUaW1lc3RhbXAgLSB1c2VyQi5jcmVhdGVkVGltZXN0YW1wKTtcblx0ICovXG5cdHB1YmxpYyBzb3J0KGNvbXBhcmVGdW5jdGlvbjogQ29tcGFyYXRvcjxLLCBWPiA9IENvbGxlY3Rpb24uZGVmYXVsdFNvcnQpOiB0aGlzIHtcblx0XHRjb25zdCBlbnRyaWVzID0gWy4uLnRoaXMuZW50cmllcygpXTtcblx0XHRlbnRyaWVzLnNvcnQoKGEsIGIpOiBudW1iZXIgPT4gY29tcGFyZUZ1bmN0aW9uKGFbMV0sIGJbMV0sIGFbMF0sIGJbMF0pKTtcblxuXHRcdC8vIFBlcmZvcm0gY2xlYW4tdXBcblx0XHRzdXBlci5jbGVhcigpO1xuXG5cdFx0Ly8gU2V0IHRoZSBuZXcgZW50cmllc1xuXHRcdGZvciAoY29uc3QgW2ssIHZdIG9mIGVudHJpZXMpIHtcblx0XHRcdHN1cGVyLnNldChrLCB2KTtcblx0XHR9XG5cdFx0cmV0dXJuIHRoaXM7XG5cdH1cblxuXHQvKipcblx0ICogVGhlIGludGVyc2VjdCBtZXRob2QgcmV0dXJucyBhIG5ldyBzdHJ1Y3R1cmUgY29udGFpbmluZyBpdGVtcyB3aGVyZSB0aGUga2V5cyBhcmUgcHJlc2VudCBpbiBib3RoIG9yaWdpbmFsIHN0cnVjdHVyZXMuXG5cdCAqIEBwYXJhbSB7Q29sbGVjdGlvbn0gb3RoZXIgVGhlIG90aGVyIENvbGxlY3Rpb24gdG8gZmlsdGVyIGFnYWluc3Rcblx0ICogQHJldHVybnMge0NvbGxlY3Rpb259XG5cdCAqL1xuXHRwdWJsaWMgaW50ZXJzZWN0KG90aGVyOiBDb2xsZWN0aW9uPEssIFY+KTogQ29sbGVjdGlvbjxLLCBWPiB7XG5cdFx0Y29uc3QgY29sbCA9IG5ldyB0aGlzLmNvbnN0cnVjdG9yW1N5bWJvbC5zcGVjaWVzXTxLLCBWPigpO1xuXHRcdGZvciAoY29uc3QgW2ssIHZdIG9mIG90aGVyKSB7XG5cdFx0XHRpZiAodGhpcy5oYXMoaykpIGNvbGwuc2V0KGssIHYpO1xuXHRcdH1cblx0XHRyZXR1cm4gY29sbDtcblx0fVxuXG5cdC8qKlxuXHQgKiBUaGUgZGlmZmVyZW5jZSBtZXRob2QgcmV0dXJucyBhIG5ldyBzdHJ1Y3R1cmUgY29udGFpbmluZyBpdGVtcyB3aGVyZSB0aGUga2V5IGlzIHByZXNlbnQgaW4gb25lIG9mIHRoZSBvcmlnaW5hbCBzdHJ1Y3R1cmVzIGJ1dCBub3QgdGhlIG90aGVyLlxuXHQgKiBAcGFyYW0ge0NvbGxlY3Rpb259IG90aGVyIFRoZSBvdGhlciBDb2xsZWN0aW9uIHRvIGZpbHRlciBhZ2FpbnN0XG5cdCAqIEByZXR1cm5zIHtDb2xsZWN0aW9ufVxuXHQgKi9cblx0cHVibGljIGRpZmZlcmVuY2Uob3RoZXI6IENvbGxlY3Rpb248SywgVj4pOiBDb2xsZWN0aW9uPEssIFY+IHtcblx0XHRjb25zdCBjb2xsID0gbmV3IHRoaXMuY29uc3RydWN0b3JbU3ltYm9sLnNwZWNpZXNdPEssIFY+KCk7XG5cdFx0Zm9yIChjb25zdCBbaywgdl0gb2Ygb3RoZXIpIHtcblx0XHRcdGlmICghdGhpcy5oYXMoaykpIGNvbGwuc2V0KGssIHYpO1xuXHRcdH1cblx0XHRmb3IgKGNvbnN0IFtrLCB2XSBvZiB0aGlzKSB7XG5cdFx0XHRpZiAoIW90aGVyLmhhcyhrKSkgY29sbC5zZXQoaywgdik7XG5cdFx0fVxuXHRcdHJldHVybiBjb2xsO1xuXHR9XG5cblx0LyoqXG5cdCAqIFRoZSBzb3J0ZWQgbWV0aG9kIHNvcnRzIHRoZSBpdGVtcyBvZiBhIGNvbGxlY3Rpb24gYW5kIHJldHVybnMgaXQuXG5cdCAqIFRoZSBzb3J0IGlzIG5vdCBuZWNlc3NhcmlseSBzdGFibGUgaW4gTm9kZSAxMCBvciBvbGRlci5cblx0ICogVGhlIGRlZmF1bHQgc29ydCBvcmRlciBpcyBhY2NvcmRpbmcgdG8gc3RyaW5nIFVuaWNvZGUgY29kZSBwb2ludHMuXG5cdCAqIEBwYXJhbSB7RnVuY3Rpb259IFtjb21wYXJlRnVuY3Rpb25dIFNwZWNpZmllcyBhIGZ1bmN0aW9uIHRoYXQgZGVmaW5lcyB0aGUgc29ydCBvcmRlci5cblx0ICogSWYgb21pdHRlZCwgdGhlIGNvbGxlY3Rpb24gaXMgc29ydGVkIGFjY29yZGluZyB0byBlYWNoIGNoYXJhY3RlcidzIFVuaWNvZGUgY29kZSBwb2ludCB2YWx1ZSxcblx0ICogYWNjb3JkaW5nIHRvIHRoZSBzdHJpbmcgY29udmVyc2lvbiBvZiBlYWNoIGVsZW1lbnQuXG5cdCAqIEByZXR1cm5zIHtDb2xsZWN0aW9ufVxuXHQgKiBAZXhhbXBsZSBjb2xsZWN0aW9uLnNvcnRlZCgodXNlckEsIHVzZXJCKSA9PiB1c2VyQS5jcmVhdGVkVGltZXN0YW1wIC0gdXNlckIuY3JlYXRlZFRpbWVzdGFtcCk7XG5cdCAqL1xuXHRwdWJsaWMgc29ydGVkKGNvbXBhcmVGdW5jdGlvbjogQ29tcGFyYXRvcjxLLCBWPiA9IENvbGxlY3Rpb24uZGVmYXVsdFNvcnQpOiBDb2xsZWN0aW9uPEssIFY+IHtcblx0XHRyZXR1cm4gbmV3IHRoaXMuY29uc3RydWN0b3JbU3ltYm9sLnNwZWNpZXNdKHRoaXMpLnNvcnQoKGF2LCBidiwgYWssIGJrKSA9PiBjb21wYXJlRnVuY3Rpb24oYXYsIGJ2LCBhaywgYmspKTtcblx0fVxuXG5cdHB1YmxpYyB0b0pTT04oKSB7XG5cdFx0Ly8gdG9KU09OIGlzIGNhbGxlZCByZWN1cnNpdmVseSBieSBKU09OLnN0cmluZ2lmeS5cblx0XHRyZXR1cm4gWy4uLnRoaXMudmFsdWVzKCldO1xuXHR9XG5cblx0cHJpdmF0ZSBzdGF0aWMgZGVmYXVsdFNvcnQ8Vj4oZmlyc3RWYWx1ZTogViwgc2Vjb25kVmFsdWU6IFYpOiBudW1iZXIge1xuXHRcdHJldHVybiBOdW1iZXIoZmlyc3RWYWx1ZSA+IHNlY29uZFZhbHVlKSB8fCBOdW1iZXIoZmlyc3RWYWx1ZSA9PT0gc2Vjb25kVmFsdWUpIC0gMTtcblx0fVxufVxuXG5leHBvcnQgdHlwZSBDb21wYXJhdG9yPEssIFY+ID0gKGZpcnN0VmFsdWU6IFYsIHNlY29uZFZhbHVlOiBWLCBmaXJzdEtleTogSywgc2Vjb25kS2V5OiBLKSA9PiBudW1iZXI7XG5cbmV4cG9ydCBkZWZhdWx0IENvbGxlY3Rpb247XG4iXX0=
\ No newline at end of file
diff --git a/node_modules/@discordjs/collection/package.json b/node_modules/@discordjs/collection/package.json
new file mode 100644
index 0000000..f1151bb
--- /dev/null
+++ b/node_modules/@discordjs/collection/package.json
@@ -0,0 +1,105 @@
+{
+ "name": "@discordjs/collection",
+ "version": "0.2.1",
+ "description": "Utility data structure used in Discord.js",
+ "main": "dist/index.js",
+ "types": "dist/index.d.ts",
+ "scripts": {
+ "lint": "eslint test src --ext .ts",
+ "lint:fix": "eslint test src --ext .ts --fix",
+ "prebuild": "npm run lint",
+ "build": "rimraf dist/ && tsc",
+ "pretest": "npm run build",
+ "test": "jest",
+ "docs": "docgen --jsdoc jsdoc.json --source src/*.ts src/**/*.ts --custom docs/index.yml --output docs/docs.json",
+ "docs:test": "docgen --jsdoc jsdoc.json --source src/*.ts src/**/*.ts --custom docs/index.yml"
+ },
+ "repository": {
+ "type": "git",
+ "url": "git+https://github.com/discordjs/collection.git"
+ },
+ "keywords": [
+ "map",
+ "collection",
+ "utility"
+ ],
+ "files": [
+ "!**/*.ts",
+ "**/*.d.ts",
+ "!package-lock.json"
+ ],
+ "author": "Amish Shah ",
+ "license": "Apache-2.0",
+ "bugs": {
+ "url": "https://github.com/discordjs/collection/issues"
+ },
+ "homepage": "https://github.com/discordjs/collection#readme",
+ "engines": {
+ "node": ">=14.0.0"
+ },
+ "devDependencies": {
+ "@babel/cli": "^7.14.8",
+ "@babel/core": "^7.14.8",
+ "@babel/preset-env": "^7.14.8",
+ "@babel/preset-typescript": "^7.14.5",
+ "@commitlint/cli": "^13.1.0",
+ "@commitlint/config-angular": "^13.1.0",
+ "@types/jest": "^26.0.24",
+ "@types/node": "^16.4.8",
+ "@typescript-eslint/eslint-plugin": "^4.28.5",
+ "@typescript-eslint/parser": "^4.28.5",
+ "discord.js-docgen": "discordjs/docgen#ts-patch",
+ "eslint": "^7.32.0",
+ "eslint-config-marine": "^9.0.6",
+ "eslint-config-prettier": "^8.3.0",
+ "eslint-plugin-prettier": "^3.4.0",
+ "husky": "^4.3.7",
+ "jest": "^27.0.6",
+ "jsdoc-babel": "^0.5.0",
+ "lint-staged": "^11.1.1",
+ "prettier": "^2.3.2",
+ "rimraf": "^3.0.2",
+ "typescript": "^4.3.5"
+ },
+ "husky": {
+ "hooks": {
+ "pre-commit": "lint-staged",
+ "commit-msg": "commitlint -E HUSKY_GIT_PARAMS"
+ }
+ },
+ "lint-staged": {
+ "*.{ts,js}": [
+ "eslint --fix"
+ ],
+ "*.{json,yml,yaml}": [
+ "prettier --write"
+ ]
+ },
+ "commitlint": {
+ "extends": [
+ "@commitlint/config-angular"
+ ],
+ "rules": {
+ "type-enum": [
+ 2,
+ "always",
+ [
+ "chore",
+ "build",
+ "ci",
+ "docs",
+ "feat",
+ "fix",
+ "perf",
+ "refactor",
+ "revert",
+ "style",
+ "test",
+ "types",
+ "wip",
+ "src"
+ ]
+ ]
+ }
+ }
+}
diff --git a/node_modules/@discordjs/form-data/License b/node_modules/@discordjs/form-data/License
new file mode 100644
index 0000000..c7ff12a
--- /dev/null
+++ b/node_modules/@discordjs/form-data/License
@@ -0,0 +1,19 @@
+Copyright (c) 2012 Felix Geisendörfer (felix@debuggable.com) and contributors
+
+ Permission is hereby granted, free of charge, to any person obtaining a copy
+ of this software and associated documentation files (the "Software"), to deal
+ in the Software without restriction, including without limitation the rights
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+ copies of the Software, and to permit persons to whom the Software is
+ furnished to do so, subject to the following conditions:
+
+ The above copyright notice and this permission notice shall be included in
+ all copies or substantial portions of the Software.
+
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+ THE SOFTWARE.
diff --git a/node_modules/@discordjs/form-data/Readme.md b/node_modules/@discordjs/form-data/Readme.md
new file mode 100644
index 0000000..3d8c93a
--- /dev/null
+++ b/node_modules/@discordjs/form-data/Readme.md
@@ -0,0 +1,353 @@
+# Form-Data [](https://www.npmjs.com/package/form-data) [](https://gitter.im/form-data/form-data)
+
+A library to create readable ```"multipart/form-data"``` streams. Can be used to submit forms and file uploads to other web applications.
+
+The API of this library is inspired by the [XMLHttpRequest-2 FormData Interface][xhr2-fd].
+
+[xhr2-fd]: http://dev.w3.org/2006/webapi/XMLHttpRequest-2/Overview.html#the-formdata-interface
+
+[](https://travis-ci.org/form-data/form-data)
+[](https://travis-ci.org/form-data/form-data)
+[](https://travis-ci.org/form-data/form-data)
+
+[](https://coveralls.io/github/form-data/form-data?branch=master)
+[](https://david-dm.org/form-data/form-data)
+
+## Install
+
+```
+npm install --save form-data
+```
+
+## Usage
+
+In this example we are constructing a form with 3 fields that contain a string,
+a buffer and a file stream.
+
+``` javascript
+var FormData = require('form-data');
+var fs = require('fs');
+
+var form = new FormData();
+form.append('my_field', 'my value');
+form.append('my_buffer', new Buffer(10));
+form.append('my_file', fs.createReadStream('/foo/bar.jpg'));
+```
+
+Also you can use http-response stream:
+
+``` javascript
+var FormData = require('form-data');
+var http = require('http');
+
+var form = new FormData();
+
+http.request('http://nodejs.org/images/logo.png', function(response) {
+ form.append('my_field', 'my value');
+ form.append('my_buffer', new Buffer(10));
+ form.append('my_logo', response);
+});
+```
+
+Or @mikeal's [request](https://github.com/request/request) stream:
+
+``` javascript
+var FormData = require('form-data');
+var request = require('request');
+
+var form = new FormData();
+
+form.append('my_field', 'my value');
+form.append('my_buffer', new Buffer(10));
+form.append('my_logo', request('http://nodejs.org/images/logo.png'));
+```
+
+In order to submit this form to a web application, call ```submit(url, [callback])``` method:
+
+``` javascript
+form.submit('http://example.org/', function(err, res) {
+ // res – response object (http.IncomingMessage) //
+ res.resume();
+});
+
+```
+
+For more advanced request manipulations ```submit()``` method returns ```http.ClientRequest``` object, or you can choose from one of the alternative submission methods.
+
+### Custom options
+
+You can provide custom options, such as `maxDataSize`:
+
+``` javascript
+var FormData = require('form-data');
+
+var form = new FormData({ maxDataSize: 20971520 });
+form.append('my_field', 'my value');
+form.append('my_buffer', /* something big */);
+```
+
+List of available options could be found in [combined-stream](https://github.com/felixge/node-combined-stream/blob/master/lib/combined_stream.js#L7-L15)
+
+### Alternative submission methods
+
+You can use node's http client interface:
+
+``` javascript
+var http = require('http');
+
+var request = http.request({
+ method: 'post',
+ host: 'example.org',
+ path: '/upload',
+ headers: form.getHeaders()
+});
+
+form.pipe(request);
+
+request.on('response', function(res) {
+ console.log(res.statusCode);
+});
+```
+
+Or if you would prefer the `'Content-Length'` header to be set for you:
+
+``` javascript
+form.submit('example.org/upload', function(err, res) {
+ console.log(res.statusCode);
+});
+```
+
+To use custom headers and pre-known length in parts:
+
+``` javascript
+var CRLF = '\r\n';
+var form = new FormData();
+
+var options = {
+ header: CRLF + '--' + form.getBoundary() + CRLF + 'X-Custom-Header: 123' + CRLF + CRLF,
+ knownLength: 1
+};
+
+form.append('my_buffer', buffer, options);
+
+form.submit('http://example.com/', function(err, res) {
+ if (err) throw err;
+ console.log('Done');
+});
+```
+
+Form-Data can recognize and fetch all the required information from common types of streams (```fs.readStream```, ```http.response``` and ```mikeal's request```), for some other types of streams you'd need to provide "file"-related information manually:
+
+``` javascript
+someModule.stream(function(err, stdout, stderr) {
+ if (err) throw err;
+
+ var form = new FormData();
+
+ form.append('file', stdout, {
+ filename: 'unicycle.jpg', // ... or:
+ filepath: 'photos/toys/unicycle.jpg',
+ contentType: 'image/jpeg',
+ knownLength: 19806
+ });
+
+ form.submit('http://example.com/', function(err, res) {
+ if (err) throw err;
+ console.log('Done');
+ });
+});
+```
+
+The `filepath` property overrides `filename` and may contain a relative path. This is typically used when uploading [multiple files from a directory](https://wicg.github.io/entries-api/#dom-htmlinputelement-webkitdirectory).
+
+For edge cases, like POST request to URL with query string or to pass HTTP auth credentials, object can be passed to `form.submit()` as first parameter:
+
+``` javascript
+form.submit({
+ host: 'example.com',
+ path: '/probably.php?extra=params',
+ auth: 'username:password'
+}, function(err, res) {
+ console.log(res.statusCode);
+});
+```
+
+In case you need to also send custom HTTP headers with the POST request, you can use the `headers` key in first parameter of `form.submit()`:
+
+``` javascript
+form.submit({
+ host: 'example.com',
+ path: '/surelynot.php',
+ headers: {'x-test-header': 'test-header-value'}
+}, function(err, res) {
+ console.log(res.statusCode);
+});
+```
+
+### Methods
+
+- [_Void_ append( **String** _field_, **Mixed** _value_ [, **Mixed** _options_] )](https://github.com/form-data/form-data#void-append-string-field-mixed-value--mixed-options-).
+- [_Headers_ getHeaders( [**Headers** _userHeaders_] )](https://github.com/form-data/form-data#array-getheaders-array-userheaders-)
+- [_String_ getBoundary()](https://github.com/form-data/form-data#string-getboundary)
+- [_Buffer_ getBuffer()](https://github.com/form-data/form-data#buffer-getbuffer)
+- [_Integer_ getLengthSync()](https://github.com/form-data/form-data#integer-getlengthsync)
+- [_Integer_ getLength( **function** _callback_ )](https://github.com/form-data/form-data#integer-getlength-function-callback-)
+- [_Boolean_ hasKnownLength()](https://github.com/form-data/form-data#boolean-hasknownlength)
+- [_Request_ submit( _params_, **function** _callback_ )](https://github.com/form-data/form-data#request-submit-params-function-callback-)
+- [_String_ toString()](https://github.com/form-data/form-data#string-tostring)
+
+#### _Void_ append( **String** _field_, **Mixed** _value_ [, **Mixed** _options_] )
+Append data to the form. You can submit about any format (string, integer, boolean, buffer, etc.). However, Arrays are not supported and need to be turned into strings by the user.
+```javascript
+var form = new FormData();
+form.append( 'my_string', 'my value' );
+form.append( 'my_integer', 1 );
+form.append( 'my_boolean', true );
+form.append( 'my_buffer', new Buffer(10) );
+form.append( 'my_array_as_json', JSON.stringify( ['bird','cute'] ) )
+```
+
+You may provide a string for options, or an object.
+```javascript
+// Set filename by providing a string for options
+form.append( 'my_file', fs.createReadStream('/foo/bar.jpg'), 'bar.jpg' );
+
+// provide an object.
+form.append( 'my_file', fs.createReadStream('/foo/bar.jpg'), {filename: 'bar.jpg', contentType: 'image/jpeg', knownLength: 19806} );
+```
+
+#### _Headers_ getHeaders( [**Headers** _userHeaders_] )
+This method adds the correct `content-type` header to the provided array of `userHeaders`.
+
+#### _String_ getBoundary()
+Return the boundary of the formData. A boundary consists of 26 `-` followed by 24 numbers
+for example:
+```javascript
+--------------------------515890814546601021194782
+```
+_Note: The boundary must be unique and may not appear in the data._
+
+#### _Buffer_ getBuffer()
+Return the full formdata request package, as a Buffer. You can insert this Buffer in e.g. Axios to send multipart data.
+```javascript
+var form = new FormData();
+form.append( 'my_buffer', Buffer.from([0x4a,0x42,0x20,0x52,0x6f,0x63,0x6b,0x73]) );
+form.append( 'my_file', fs.readFileSync('/foo/bar.jpg') );
+
+axios.post( 'https://example.com/path/to/api',
+ form.getBuffer(),
+ form.getHeaders()
+ )
+```
+**Note:** Because the output is of type Buffer, you can only append types that are accepted by Buffer: *string, Buffer, ArrayBuffer, Array, or Array-like Object*. A ReadStream for example will result in an error.
+
+#### _Integer_ getLengthSync()
+Same as `getLength` but synchronous.
+
+_Note: getLengthSync __doesn't__ calculate streams length._
+
+#### _Integer_ getLength( **function** _callback_ )
+Returns the `Content-Length` async. The callback is used to handle errors and continue once the length has been calculated
+```javascript
+this.getLength(function(err, length) {
+ if (err) {
+ this._error(err);
+ return;
+ }
+
+ // add content length
+ request.setHeader('Content-Length', length);
+
+ ...
+}.bind(this));
+```
+
+#### _Boolean_ hasKnownLength()
+Checks if the length of added values is known.
+
+#### _Request_ submit( _params_, **function** _callback_ )
+Submit the form to a web application.
+```javascript
+var form = new FormData();
+form.append( 'my_string', 'Hello World' );
+
+form.submit( 'http://example.com/', function(err, res) {
+ // res – response object (http.IncomingMessage) //
+ res.resume();
+} );
+```
+
+#### _String_ toString()
+Returns the form data as a string. Don't use this if you are sending files or buffers, use `getBuffer()` instead.
+
+### Integration with other libraries
+
+#### Request
+
+Form submission using [request](https://github.com/request/request):
+
+```javascript
+var formData = {
+ my_field: 'my_value',
+ my_file: fs.createReadStream(__dirname + '/unicycle.jpg'),
+};
+
+request.post({url:'http://service.com/upload', formData: formData}, function(err, httpResponse, body) {
+ if (err) {
+ return console.error('upload failed:', err);
+ }
+ console.log('Upload successful! Server responded with:', body);
+});
+```
+
+For more details see [request readme](https://github.com/request/request#multipartform-data-multipart-form-uploads).
+
+#### node-fetch
+
+You can also submit a form using [node-fetch](https://github.com/bitinn/node-fetch):
+
+```javascript
+var form = new FormData();
+
+form.append('a', 1);
+
+fetch('http://example.com', { method: 'POST', body: form })
+ .then(function(res) {
+ return res.json();
+ }).then(function(json) {
+ console.log(json);
+ });
+```
+
+#### axios
+
+In Node.js you can post a file using [axios](https://github.com/axios/axios):
+```javascript
+const form = new FormData();
+const stream = fs.createReadStream(PATH_TO_FILE);
+
+form.append('image', stream);
+
+// In Node.js environment you need to set boundary in the header field 'Content-Type' by calling method `getHeaders`
+const formHeaders = form.getHeaders();
+
+axios.post('http://example.com', form, {
+ headers: {
+ ...formHeaders,
+ },
+})
+.then(response => response)
+.catch(error => error)
+```
+
+## Notes
+
+- ```getLengthSync()``` method DOESN'T calculate length for streams, use ```knownLength``` options as workaround.
+- ```getLength(cb)``` will send an error as first parameter of callback if stream length cannot be calculated (e.g. send in custom streams w/o using ```knownLength```).
+- ```sbumit``` will not add `content-length` if form length is unknown or not calculable.
+- Starting version `2.x` FormData has dropped support for `node@0.10.x`.
+- Starting version `3.x` FormData has dropped support for `node@4.x`.
+
+## License
+
+Form-Data is released under the [MIT](License) license.
diff --git a/node_modules/@discordjs/form-data/index.d.ts b/node_modules/@discordjs/form-data/index.d.ts
new file mode 100644
index 0000000..6e52045
--- /dev/null
+++ b/node_modules/@discordjs/form-data/index.d.ts
@@ -0,0 +1,61 @@
+// Definitions by: Carlos Ballesteros Velasco
+// Leon Yu
+// BendingBender
+// Maple Miao
+
+///
+import * as stream from 'stream';
+import * as http from 'http';
+
+export = FormData;
+
+// Extracted because @types/node doesn't export interfaces.
+interface ReadableOptions {
+ highWaterMark?: number;
+ encoding?: string;
+ objectMode?: boolean;
+ read?(this: stream.Readable, size: number): void;
+ destroy?(this: stream.Readable, error: Error | null, callback: (error: Error | null) => void): void;
+ autoDestroy?: boolean;
+}
+
+interface Options extends ReadableOptions {
+ writable?: boolean;
+ readable?: boolean;
+ dataSize?: number;
+ maxDataSize?: number;
+ pauseStreams?: boolean;
+}
+
+declare class FormData extends stream.Readable {
+ constructor(options?: Options);
+ append(key: string, value: any, options?: FormData.AppendOptions | string): void;
+ getHeaders(userHeaders?: FormData.Headers): FormData.Headers;
+ submit(
+ params: string | FormData.SubmitOptions,
+ callback?: (error: Error | null, response: http.IncomingMessage) => void
+ ): http.ClientRequest;
+ getBuffer(): Buffer;
+ getBoundary(): string;
+ getLength(callback: (err: Error | null, length: number) => void): void;
+ getLengthSync(): number;
+ hasKnownLength(): boolean;
+}
+
+declare namespace FormData {
+ interface Headers {
+ [key: string]: any;
+ }
+
+ interface AppendOptions {
+ header?: string | Headers;
+ knownLength?: number;
+ filename?: string;
+ filepath?: string;
+ contentType?: string;
+ }
+
+ interface SubmitOptions extends http.RequestOptions {
+ protocol?: 'https:' | 'http:';
+ }
+}
diff --git a/node_modules/@discordjs/form-data/lib/browser.js b/node_modules/@discordjs/form-data/lib/browser.js
new file mode 100644
index 0000000..09e7c70
--- /dev/null
+++ b/node_modules/@discordjs/form-data/lib/browser.js
@@ -0,0 +1,2 @@
+/* eslint-env browser */
+module.exports = typeof self == 'object' ? self.FormData : window.FormData;
diff --git a/node_modules/@discordjs/form-data/lib/form_data.js b/node_modules/@discordjs/form-data/lib/form_data.js
new file mode 100644
index 0000000..0b9d8c8
--- /dev/null
+++ b/node_modules/@discordjs/form-data/lib/form_data.js
@@ -0,0 +1,497 @@
+var CombinedStream = require('combined-stream');
+var util = require('util');
+var path = require('path');
+var http = require('http');
+var https = require('https');
+var parseUrl = require('url').parse;
+var fs = require('fs');
+var Stream = require('stream').Stream;
+var mime = require('mime-types');
+var asynckit = require('asynckit');
+var populate = require('./populate.js');
+
+// Public API
+module.exports = FormData;
+
+// make it a Stream
+util.inherits(FormData, CombinedStream);
+
+/**
+ * Create readable "multipart/form-data" streams.
+ * Can be used to submit forms
+ * and file uploads to other web applications.
+ *
+ * @constructor
+ * @param {Object} options - Properties to be added/overriden for FormData and CombinedStream
+ */
+function FormData(options) {
+ if (!(this instanceof FormData)) {
+ return new FormData(options);
+ }
+
+ this._overheadLength = 0;
+ this._valueLength = 0;
+ this._valuesToMeasure = [];
+
+ CombinedStream.call(this);
+
+ options = options || {};
+ for (var option in options) {
+ this[option] = options[option];
+ }
+}
+
+FormData.LINE_BREAK = '\r\n';
+FormData.DEFAULT_CONTENT_TYPE = 'application/octet-stream';
+
+FormData.prototype.append = function(field, value, options) {
+
+ options = options || {};
+
+ // allow filename as single option
+ if (typeof options == 'string') {
+ options = {filename: options};
+ }
+
+ var append = CombinedStream.prototype.append.bind(this);
+
+ // all that streamy business can't handle numbers
+ if (typeof value == 'number') {
+ value = '' + value;
+ }
+
+ // https://github.com/felixge/node-form-data/issues/38
+ if (util.isArray(value)) {
+ // Please convert your array into string
+ // the way web server expects it
+ this._error(new Error('Arrays are not supported.'));
+ return;
+ }
+
+ var header = this._multiPartHeader(field, value, options);
+ var footer = this._multiPartFooter();
+
+ append(header);
+ append(value);
+ append(footer);
+
+ // pass along options.knownLength
+ this._trackLength(header, value, options);
+};
+
+FormData.prototype._trackLength = function(header, value, options) {
+ var valueLength = 0;
+
+ // used w/ getLengthSync(), when length is known.
+ // e.g. for streaming directly from a remote server,
+ // w/ a known file a size, and not wanting to wait for
+ // incoming file to finish to get its size.
+ if (options.knownLength != null) {
+ valueLength += +options.knownLength;
+ } else if (Buffer.isBuffer(value)) {
+ valueLength = value.length;
+ } else if (typeof value === 'string') {
+ valueLength = Buffer.byteLength(value);
+ }
+
+ this._valueLength += valueLength;
+
+ // @check why add CRLF? does this account for custom/multiple CRLFs?
+ this._overheadLength +=
+ Buffer.byteLength(header) +
+ FormData.LINE_BREAK.length;
+
+ // empty or either doesn't have path or not an http response or not a stream
+ if (!value || ( !value.path && !(value.readable && value.hasOwnProperty('httpVersion')) && !(value instanceof Stream))) {
+ return;
+ }
+
+ // no need to bother with the length
+ if (!options.knownLength) {
+ this._valuesToMeasure.push(value);
+ }
+};
+
+FormData.prototype._lengthRetriever = function(value, callback) {
+
+ if (value.hasOwnProperty('fd')) {
+
+ // take read range into a account
+ // `end` = Infinity –> read file till the end
+ //
+ // TODO: Looks like there is bug in Node fs.createReadStream
+ // it doesn't respect `end` options without `start` options
+ // Fix it when node fixes it.
+ // https://github.com/joyent/node/issues/7819
+ if (value.end != undefined && value.end != Infinity && value.start != undefined) {
+
+ // when end specified
+ // no need to calculate range
+ // inclusive, starts with 0
+ callback(null, value.end + 1 - (value.start ? value.start : 0));
+
+ // not that fast snoopy
+ } else {
+ // still need to fetch file size from fs
+ fs.stat(value.path, function(err, stat) {
+
+ var fileSize;
+
+ if (err) {
+ callback(err);
+ return;
+ }
+
+ // update final size based on the range options
+ fileSize = stat.size - (value.start ? value.start : 0);
+ callback(null, fileSize);
+ });
+ }
+
+ // or http response
+ } else if (value.hasOwnProperty('httpVersion')) {
+ callback(null, +value.headers['content-length']);
+
+ // or request stream http://github.com/mikeal/request
+ } else if (value.hasOwnProperty('httpModule')) {
+ // wait till response come back
+ value.on('response', function(response) {
+ value.pause();
+ callback(null, +response.headers['content-length']);
+ });
+ value.resume();
+
+ // something else
+ } else {
+ callback('Unknown stream');
+ }
+};
+
+FormData.prototype._multiPartHeader = function(field, value, options) {
+ // custom header specified (as string)?
+ // it becomes responsible for boundary
+ // (e.g. to handle extra CRLFs on .NET servers)
+ if (typeof options.header == 'string') {
+ return options.header;
+ }
+
+ var contentDisposition = this._getContentDisposition(value, options);
+ var contentType = this._getContentType(value, options);
+
+ var contents = '';
+ var headers = {
+ // add custom disposition as third element or keep it two elements if not
+ 'Content-Disposition': ['form-data', 'name="' + field + '"'].concat(contentDisposition || []),
+ // if no content type. allow it to be empty array
+ 'Content-Type': [].concat(contentType || [])
+ };
+
+ // allow custom headers.
+ if (typeof options.header == 'object') {
+ populate(headers, options.header);
+ }
+
+ var header;
+ for (var prop in headers) {
+ if (!headers.hasOwnProperty(prop)) continue;
+ header = headers[prop];
+
+ // skip nullish headers.
+ if (header == null) {
+ continue;
+ }
+
+ // convert all headers to arrays.
+ if (!Array.isArray(header)) {
+ header = [header];
+ }
+
+ // add non-empty headers.
+ if (header.length) {
+ contents += prop + ': ' + header.join('; ') + FormData.LINE_BREAK;
+ }
+ }
+
+ return '--' + this.getBoundary() + FormData.LINE_BREAK + contents + FormData.LINE_BREAK;
+};
+
+FormData.prototype._getContentDisposition = function(value, options) {
+
+ var filename
+ , contentDisposition
+ ;
+
+ if (typeof options.filepath === 'string') {
+ // custom filepath for relative paths
+ filename = path.normalize(options.filepath).replace(/\\/g, '/');
+ } else if (options.filename || value.name || value.path) {
+ // custom filename take precedence
+ // formidable and the browser add a name property
+ // fs- and request- streams have path property
+ filename = path.basename(options.filename || value.name || value.path);
+ } else if (value.readable && value.hasOwnProperty('httpVersion')) {
+ // or try http response
+ filename = path.basename(value.client._httpMessage.path || '');
+ }
+
+ if (filename) {
+ contentDisposition = 'filename="' + filename + '"';
+ }
+
+ return contentDisposition;
+};
+
+FormData.prototype._getContentType = function(value, options) {
+
+ // use custom content-type above all
+ var contentType = options.contentType;
+
+ // or try `name` from formidable, browser
+ if (!contentType && value.name) {
+ contentType = mime.lookup(value.name);
+ }
+
+ // or try `path` from fs-, request- streams
+ if (!contentType && value.path) {
+ contentType = mime.lookup(value.path);
+ }
+
+ // or if it's http-reponse
+ if (!contentType && value.readable && value.hasOwnProperty('httpVersion')) {
+ contentType = value.headers['content-type'];
+ }
+
+ // or guess it from the filepath or filename
+ if (!contentType && (options.filepath || options.filename)) {
+ contentType = mime.lookup(options.filepath || options.filename);
+ }
+
+ // fallback to the default content type if `value` is not simple value
+ if (!contentType && typeof value == 'object') {
+ contentType = FormData.DEFAULT_CONTENT_TYPE;
+ }
+
+ return contentType;
+};
+
+FormData.prototype._multiPartFooter = function() {
+ return function(next) {
+ var footer = FormData.LINE_BREAK;
+
+ var lastPart = (this._streams.length === 0);
+ if (lastPart) {
+ footer += this._lastBoundary();
+ }
+
+ next(footer);
+ }.bind(this);
+};
+
+FormData.prototype._lastBoundary = function() {
+ return '--' + this.getBoundary() + '--' + FormData.LINE_BREAK;
+};
+
+FormData.prototype.getHeaders = function(userHeaders) {
+ var header;
+ var formHeaders = {
+ 'content-type': 'multipart/form-data; boundary=' + this.getBoundary()
+ };
+
+ for (header in userHeaders) {
+ if (userHeaders.hasOwnProperty(header)) {
+ formHeaders[header.toLowerCase()] = userHeaders[header];
+ }
+ }
+
+ return formHeaders;
+};
+
+FormData.prototype.getBoundary = function() {
+ if (!this._boundary) {
+ this._generateBoundary();
+ }
+
+ return this._boundary;
+};
+
+FormData.prototype.getBuffer = function() {
+ var dataBuffer = new Buffer.alloc( 0 );
+ var boundary = this.getBoundary();
+
+ // Create the form content. Add Line breaks to the end of data.
+ for (var i = 0, len = this._streams.length; i < len; i++) {
+ if (typeof this._streams[i] !== 'function') {
+
+ // Add content to the buffer.
+ if(Buffer.isBuffer(this._streams[i])) {
+ dataBuffer = Buffer.concat( [dataBuffer, this._streams[i]]);
+ }else {
+ dataBuffer = Buffer.concat( [dataBuffer, Buffer.from(this._streams[i])]);
+ }
+
+ // Add break after content.
+ if (typeof this._streams[i] !== 'string' || this._streams[i].substring( 2, boundary.length + 2 ) !== boundary) {
+ dataBuffer = Buffer.concat( [dataBuffer, Buffer.from(FormData.LINE_BREAK)] );
+ }
+ }
+ }
+
+ // Add the footer and return the Buffer object.
+ return Buffer.concat( [dataBuffer, Buffer.from(this._lastBoundary())] );
+};
+
+FormData.prototype._generateBoundary = function() {
+ // This generates a 50 character boundary similar to those used by Firefox.
+ // They are optimized for boyer-moore parsing.
+ var boundary = '--------------------------';
+ for (var i = 0; i < 24; i++) {
+ boundary += Math.floor(Math.random() * 10).toString(16);
+ }
+
+ this._boundary = boundary;
+};
+
+// Note: getLengthSync DOESN'T calculate streams length
+// As workaround one can calculate file size manually
+// and add it as knownLength option
+FormData.prototype.getLengthSync = function() {
+ var knownLength = this._overheadLength + this._valueLength;
+
+ // Don't get confused, there are 3 "internal" streams for each keyval pair
+ // so it basically checks if there is any value added to the form
+ if (this._streams.length) {
+ knownLength += this._lastBoundary().length;
+ }
+
+ // https://github.com/form-data/form-data/issues/40
+ if (!this.hasKnownLength()) {
+ // Some async length retrievers are present
+ // therefore synchronous length calculation is false.
+ // Please use getLength(callback) to get proper length
+ this._error(new Error('Cannot calculate proper length in synchronous way.'));
+ }
+
+ return knownLength;
+};
+
+// Public API to check if length of added values is known
+// https://github.com/form-data/form-data/issues/196
+// https://github.com/form-data/form-data/issues/262
+FormData.prototype.hasKnownLength = function() {
+ var hasKnownLength = true;
+
+ if (this._valuesToMeasure.length) {
+ hasKnownLength = false;
+ }
+
+ return hasKnownLength;
+};
+
+FormData.prototype.getLength = function(cb) {
+ var knownLength = this._overheadLength + this._valueLength;
+
+ if (this._streams.length) {
+ knownLength += this._lastBoundary().length;
+ }
+
+ if (!this._valuesToMeasure.length) {
+ process.nextTick(cb.bind(this, null, knownLength));
+ return;
+ }
+
+ asynckit.parallel(this._valuesToMeasure, this._lengthRetriever, function(err, values) {
+ if (err) {
+ cb(err);
+ return;
+ }
+
+ values.forEach(function(length) {
+ knownLength += length;
+ });
+
+ cb(null, knownLength);
+ });
+};
+
+FormData.prototype.submit = function(params, cb) {
+ var request
+ , options
+ , defaults = {method: 'post'}
+ ;
+
+ // parse provided url if it's string
+ // or treat it as options object
+ if (typeof params == 'string') {
+
+ params = parseUrl(params);
+ options = populate({
+ port: params.port,
+ path: params.pathname,
+ host: params.hostname,
+ protocol: params.protocol
+ }, defaults);
+
+ // use custom params
+ } else {
+
+ options = populate(params, defaults);
+ // if no port provided use default one
+ if (!options.port) {
+ options.port = options.protocol == 'https:' ? 443 : 80;
+ }
+ }
+
+ // put that good code in getHeaders to some use
+ options.headers = this.getHeaders(params.headers);
+
+ // https if specified, fallback to http in any other case
+ if (options.protocol == 'https:') {
+ request = https.request(options);
+ } else {
+ request = http.request(options);
+ }
+
+ // get content length and fire away
+ this.getLength(function(err, length) {
+ if (err && err !== 'Unknown stream') {
+ this._error(err);
+ return;
+ }
+
+ // add content length
+ if (length) {
+ request.setHeader('Content-Length', length);
+ }
+
+ this.pipe(request);
+ if (cb) {
+ var onResponse;
+
+ var callback = function (error, responce) {
+ request.removeListener('error', callback);
+ request.removeListener('response', onResponse);
+
+ return cb.call(this, error, responce);
+ };
+
+ onResponse = callback.bind(this, null);
+
+ request.on('error', callback);
+ request.on('response', onResponse);
+ }
+ }.bind(this));
+
+ return request;
+};
+
+FormData.prototype._error = function(err) {
+ if (!this.error) {
+ this.error = err;
+ this.pause();
+ this.emit('error', err);
+ }
+};
+
+FormData.prototype.toString = function () {
+ return '[object FormData]';
+};
diff --git a/node_modules/@discordjs/form-data/lib/populate.js b/node_modules/@discordjs/form-data/lib/populate.js
new file mode 100644
index 0000000..4d35738
--- /dev/null
+++ b/node_modules/@discordjs/form-data/lib/populate.js
@@ -0,0 +1,10 @@
+// populates missing values
+module.exports = function(dst, src) {
+
+ Object.keys(src).forEach(function(prop)
+ {
+ dst[prop] = dst[prop] || src[prop];
+ });
+
+ return dst;
+};
diff --git a/node_modules/@discordjs/form-data/package.json b/node_modules/@discordjs/form-data/package.json
new file mode 100644
index 0000000..854446f
--- /dev/null
+++ b/node_modules/@discordjs/form-data/package.json
@@ -0,0 +1,64 @@
+{
+ "author": "Felix Geisendörfer (http://debuggable.com/)",
+ "name": "@discordjs/form-data",
+ "description": "A library to create readable \"multipart/form-data\" streams. Can be used to submit forms and file uploads to other web applications.",
+ "version": "3.0.1",
+ "repository": {
+ "type": "git",
+ "url": "git://github.com/form-data/form-data.git"
+ },
+ "main": "./lib/form_data",
+ "browser": "./lib/browser",
+ "typings": "./index.d.ts",
+ "scripts": {
+ "pretest": "rimraf coverage test/tmp",
+ "test": "istanbul cover test/run.js",
+ "posttest": "istanbul report lcov text",
+ "lint": "eslint lib/*.js test/*.js test/integration/*.js",
+ "report": "istanbul report lcov text",
+ "ci-lint": "is-node-modern 8 && npm run lint || is-node-not-modern 8",
+ "ci-test": "npm run test && npm run browser && npm run report",
+ "predebug": "rimraf coverage test/tmp",
+ "debug": "verbose=1 ./test/run.js",
+ "browser": "browserify -t browserify-istanbul test/run-browser.js | obake --coverage",
+ "check": "istanbul check-coverage coverage/coverage*.json",
+ "files": "pkgfiles --sort=name",
+ "get-version": "node -e \"console.log(require('./package.json').version)\""
+ },
+ "pre-commit": [
+ "lint",
+ "ci-test",
+ "check"
+ ],
+ "engines": {
+ "node": ">= 6"
+ },
+ "dependencies": {
+ "asynckit": "^0.4.0",
+ "combined-stream": "^1.0.8",
+ "mime-types": "^2.1.12"
+ },
+ "devDependencies": {
+ "@types/node": "^12.0.10",
+ "browserify": "^13.1.1",
+ "browserify-istanbul": "^2.0.0",
+ "coveralls": "^3.0.4",
+ "cross-spawn": "^6.0.5",
+ "eslint": "^6.0.1",
+ "fake": "^0.2.2",
+ "far": "^0.0.7",
+ "formidable": "^1.0.17",
+ "in-publish": "^2.0.0",
+ "is-node-modern": "^1.0.0",
+ "istanbul": "^0.4.5",
+ "obake": "^0.1.2",
+ "puppeteer": "^1.19.0",
+ "pkgfiles": "^2.3.0",
+ "pre-commit": "^1.1.3",
+ "request": "^2.88.0",
+ "rimraf": "^2.7.1",
+ "tape": "^4.6.2",
+ "typescript": "^3.5.2"
+ },
+ "license": "MIT"
+}
diff --git a/node_modules/@sapphire/async-queue/LICENSE.md b/node_modules/@sapphire/async-queue/LICENSE.md
new file mode 100644
index 0000000..685eb3a
--- /dev/null
+++ b/node_modules/@sapphire/async-queue/LICENSE.md
@@ -0,0 +1,24 @@
+# The MIT License (MIT)
+
+Copyright © `2020` `The Sapphire Community and its contributors`
+
+Permission is hereby granted, free of charge, to any person
+obtaining a copy of this software and associated documentation
+files (the “Software”), to deal in the Software without
+restriction, including without limitation the rights to use,
+copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the
+Software is furnished to do so, subject to the following
+conditions:
+
+The above copyright notice and this permission notice shall be
+included in all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED “AS IS”, WITHOUT WARRANTY OF ANY KIND,
+EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES
+OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
+HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
+WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
+OTHER DEALINGS IN THE SOFTWARE.
diff --git a/node_modules/@sapphire/async-queue/README.md b/node_modules/@sapphire/async-queue/README.md
new file mode 100644
index 0000000..06cc286
--- /dev/null
+++ b/node_modules/@sapphire/async-queue/README.md
@@ -0,0 +1,95 @@
+
+
+
+
+# @sapphire/async-queue
+
+**Sequential asynchronous lock-based queue for promises.**
+
+[](https://github.com/sapphiredev/utilities/blob/main/LICENSE.md)
+[](https://codecov.io/gh/sapphiredev/utilities)
+[](https://bundlephobia.com/result?p=@sapphire/async-queue)
+[](https://www.npmjs.com/package/@sapphire/async-queue)
+[](https://depfu.com/github/sapphiredev/utilities?project_id=15195)
+
+
+
+## Description
+
+Ever needed a queue for a set of promises? This is the package for you.
+
+## Features
+
+- Written in TypeScript
+- Bundled with Rollup so it can be used in NodeJS and browsers
+- Offers CommonJS, ESM and UMD bundles
+- Fully tested
+
+## Installation
+
+You can use the following command to install this package, or replace `npm install` with your package manager of choice.
+
+```sh
+npm install @sapphire/async-queue
+```
+
+---
+
+## API Documentation
+
+For the full API documentation please refer to the TypeDoc generated [documentation](https://sapphiredev.github.io/utilities/modules/_sapphire_async_queue.html).
+
+## Buy us some doughnuts
+
+Sapphire Community is and always will be open source, even if we don't get donations. That being said, we know there are amazing people who may still want to donate just to show their appreciation. Thank you very much in advance!
+
+We accept donations through Open Collective, Ko-fi, PayPal, Patreon and GitHub Sponsorships. You can use the buttons below to donate through your method of choice.
+
+| Donate With | Address |
+| :-------------: | :-------------------------------------------------: |
+| Open Collective | [Click Here](https://sapphirejs.dev/opencollective) |
+| Ko-fi | [Click Here](https://sapphirejs.dev/kofi) |
+| Patreon | [Click Here](https://sapphirejs.dev/patreon) |
+| PayPal | [Click Here](https://sapphirejs.dev/paypal) |
+
+## Contributors ✨
+
+Thanks goes to these wonderful people ([emoji key](https://allcontributors.org/docs/en/emoji-key)):
+
+
+
+
+
+
+
+
+
+
+
+This project follows the [all-contributors](https://github.com/all-contributors/all-contributors) specification. Contributions of any kind welcome!
diff --git a/node_modules/@sapphire/async-queue/dist/index.d.ts b/node_modules/@sapphire/async-queue/dist/index.d.ts
new file mode 100644
index 0000000..5230846
--- /dev/null
+++ b/node_modules/@sapphire/async-queue/dist/index.d.ts
@@ -0,0 +1,2 @@
+export * from './lib/AsyncQueue';
+//# sourceMappingURL=index.d.ts.map
\ No newline at end of file
diff --git a/node_modules/@sapphire/async-queue/dist/index.d.ts.map b/node_modules/@sapphire/async-queue/dist/index.d.ts.map
new file mode 100644
index 0000000..c55e43f
--- /dev/null
+++ b/node_modules/@sapphire/async-queue/dist/index.d.ts.map
@@ -0,0 +1 @@
+{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,kBAAkB,CAAC"}
\ No newline at end of file
diff --git a/node_modules/@sapphire/async-queue/dist/index.js b/node_modules/@sapphire/async-queue/dist/index.js
new file mode 100644
index 0000000..ee43a21
--- /dev/null
+++ b/node_modules/@sapphire/async-queue/dist/index.js
@@ -0,0 +1,70 @@
+'use strict';
+
+Object.defineProperty(exports, '__esModule', { value: true });
+
+/**
+ * The AsyncQueue class used to sequentialize burst requests
+ */
+class AsyncQueue {
+ constructor() {
+ /**
+ * The promises array
+ */
+ Object.defineProperty(this, "promises", {
+ enumerable: true,
+ configurable: true,
+ writable: true,
+ value: []
+ });
+ }
+ /**
+ * The remaining amount of queued promises
+ */
+ get remaining() {
+ return this.promises.length;
+ }
+ /**
+ * Waits for last promise and queues a new one
+ * @example
+ * ```
+ * const queue = new AsyncQueue();
+ * async function request(url, options) {
+ * await queue.wait();
+ * try {
+ * const result = await fetch(url, options);
+ * // Do some operations with 'result'
+ * } finally {
+ * // Remove first entry from the queue and resolve for the next entry
+ * queue.shift();
+ * }
+ * }
+ *
+ * request(someUrl1, someOptions1); // Will call fetch() immediately
+ * request(someUrl2, someOptions2); // Will call fetch() after the first finished
+ * request(someUrl3, someOptions3); // Will call fetch() after the second finished
+ * ```
+ */
+ wait() {
+ const next = this.promises.length ? this.promises[this.promises.length - 1].promise : Promise.resolve();
+ let resolve;
+ const promise = new Promise((res) => {
+ resolve = res;
+ });
+ this.promises.push({
+ resolve: resolve,
+ promise
+ });
+ return next;
+ }
+ /**
+ * Frees the queue's lock for the next item to process
+ */
+ shift() {
+ const deferred = this.promises.shift();
+ if (typeof deferred !== 'undefined')
+ deferred.resolve();
+ }
+}
+
+exports.AsyncQueue = AsyncQueue;
+//# sourceMappingURL=index.js.map
diff --git a/node_modules/@sapphire/async-queue/dist/index.js.map b/node_modules/@sapphire/async-queue/dist/index.js.map
new file mode 100644
index 0000000..b470eda
--- /dev/null
+++ b/node_modules/@sapphire/async-queue/dist/index.js.map
@@ -0,0 +1 @@
+{"version":3,"file":"index.js","sources":["../src/lib/AsyncQueue.ts"],"sourcesContent":["/**\n * The AsyncQueue class used to sequentialize burst requests\n */\nexport class AsyncQueue {\n\t/**\n\t * The remaining amount of queued promises\n\t */\n\tpublic get remaining(): number {\n\t\treturn this.promises.length;\n\t}\n\n\t/**\n\t * The promises array\n\t */\n\tprivate promises: InternalAsyncQueueDeferredPromise[] = [];\n\n\t/**\n\t * Waits for last promise and queues a new one\n\t * @example\n\t * ```\n\t * const queue = new AsyncQueue();\n\t * async function request(url, options) {\n\t * await queue.wait();\n\t * try {\n\t * const result = await fetch(url, options);\n\t * // Do some operations with 'result'\n\t * } finally {\n\t * // Remove first entry from the queue and resolve for the next entry\n\t * queue.shift();\n\t * }\n\t * }\n\t *\n\t * request(someUrl1, someOptions1); // Will call fetch() immediately\n\t * request(someUrl2, someOptions2); // Will call fetch() after the first finished\n\t * request(someUrl3, someOptions3); // Will call fetch() after the second finished\n\t * ```\n\t */\n\tpublic wait(): Promise {\n\t\tconst next = this.promises.length ? this.promises[this.promises.length - 1].promise : Promise.resolve();\n\t\tlet resolve: () => void;\n\t\tconst promise = new Promise((res) => {\n\t\t\tresolve = res;\n\t\t});\n\n\t\tthis.promises.push({\n\t\t\tresolve: resolve!,\n\t\t\tpromise\n\t\t});\n\n\t\treturn next;\n\t}\n\n\t/**\n\t * Frees the queue's lock for the next item to process\n\t */\n\tpublic shift(): void {\n\t\tconst deferred = this.promises.shift();\n\t\tif (typeof deferred !== 'undefined') deferred.resolve();\n\t}\n}\n\n/**\n * @internal\n */\ninterface InternalAsyncQueueDeferredPromise {\n\tresolve(): void;\n\tpromise: Promise;\n}\n"],"names":[],"mappings":";;;;AAAA;;;MAGa,UAAU;IAAvB;;;;QAWC;;;;mBAAwD,EAAE;WAAC;KA6C3D;;;;IApDA,IAAW,SAAS;QACnB,OAAO,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC;KAC5B;;;;;;;;;;;;;;;;;;;;;;IA4BM,IAAI;QACV,MAAM,IAAI,GAAG,IAAI,CAAC,QAAQ,CAAC,MAAM,GAAG,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,QAAQ,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,OAAO,GAAG,OAAO,CAAC,OAAO,EAAE,CAAC;QACxG,IAAI,OAAmB,CAAC;QACxB,MAAM,OAAO,GAAG,IAAI,OAAO,CAAO,CAAC,GAAG;YACrC,OAAO,GAAG,GAAG,CAAC;SACd,CAAC,CAAC;QAEH,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC;YAClB,OAAO,EAAE,OAAQ;YACjB,OAAO;SACP,CAAC,CAAC;QAEH,OAAO,IAAI,CAAC;KACZ;;;;IAKM,KAAK;QACX,MAAM,QAAQ,GAAG,IAAI,CAAC,QAAQ,CAAC,KAAK,EAAE,CAAC;QACvC,IAAI,OAAO,QAAQ,KAAK,WAAW;YAAE,QAAQ,CAAC,OAAO,EAAE,CAAC;KACxD;;;;;"}
\ No newline at end of file
diff --git a/node_modules/@sapphire/async-queue/dist/index.mjs b/node_modules/@sapphire/async-queue/dist/index.mjs
new file mode 100644
index 0000000..c46365e
--- /dev/null
+++ b/node_modules/@sapphire/async-queue/dist/index.mjs
@@ -0,0 +1,66 @@
+/**
+ * The AsyncQueue class used to sequentialize burst requests
+ */
+class AsyncQueue {
+ constructor() {
+ /**
+ * The promises array
+ */
+ Object.defineProperty(this, "promises", {
+ enumerable: true,
+ configurable: true,
+ writable: true,
+ value: []
+ });
+ }
+ /**
+ * The remaining amount of queued promises
+ */
+ get remaining() {
+ return this.promises.length;
+ }
+ /**
+ * Waits for last promise and queues a new one
+ * @example
+ * ```
+ * const queue = new AsyncQueue();
+ * async function request(url, options) {
+ * await queue.wait();
+ * try {
+ * const result = await fetch(url, options);
+ * // Do some operations with 'result'
+ * } finally {
+ * // Remove first entry from the queue and resolve for the next entry
+ * queue.shift();
+ * }
+ * }
+ *
+ * request(someUrl1, someOptions1); // Will call fetch() immediately
+ * request(someUrl2, someOptions2); // Will call fetch() after the first finished
+ * request(someUrl3, someOptions3); // Will call fetch() after the second finished
+ * ```
+ */
+ wait() {
+ const next = this.promises.length ? this.promises[this.promises.length - 1].promise : Promise.resolve();
+ let resolve;
+ const promise = new Promise((res) => {
+ resolve = res;
+ });
+ this.promises.push({
+ resolve: resolve,
+ promise
+ });
+ return next;
+ }
+ /**
+ * Frees the queue's lock for the next item to process
+ */
+ shift() {
+ const deferred = this.promises.shift();
+ if (typeof deferred !== 'undefined')
+ deferred.resolve();
+ }
+}
+
+export { AsyncQueue };
+//# sourceMappingURL=index.mjs.map
diff --git a/node_modules/@sapphire/async-queue/dist/index.mjs.map b/node_modules/@sapphire/async-queue/dist/index.mjs.map
new file mode 100644
index 0000000..b629a5d
--- /dev/null
+++ b/node_modules/@sapphire/async-queue/dist/index.mjs.map
@@ -0,0 +1 @@
+{"version":3,"file":"index.mjs","sources":["../src/lib/AsyncQueue.ts"],"sourcesContent":["/**\n * The AsyncQueue class used to sequentialize burst requests\n */\nexport class AsyncQueue {\n\t/**\n\t * The remaining amount of queued promises\n\t */\n\tpublic get remaining(): number {\n\t\treturn this.promises.length;\n\t}\n\n\t/**\n\t * The promises array\n\t */\n\tprivate promises: InternalAsyncQueueDeferredPromise[] = [];\n\n\t/**\n\t * Waits for last promise and queues a new one\n\t * @example\n\t * ```\n\t * const queue = new AsyncQueue();\n\t * async function request(url, options) {\n\t * await queue.wait();\n\t * try {\n\t * const result = await fetch(url, options);\n\t * // Do some operations with 'result'\n\t * } finally {\n\t * // Remove first entry from the queue and resolve for the next entry\n\t * queue.shift();\n\t * }\n\t * }\n\t *\n\t * request(someUrl1, someOptions1); // Will call fetch() immediately\n\t * request(someUrl2, someOptions2); // Will call fetch() after the first finished\n\t * request(someUrl3, someOptions3); // Will call fetch() after the second finished\n\t * ```\n\t */\n\tpublic wait(): Promise {\n\t\tconst next = this.promises.length ? this.promises[this.promises.length - 1].promise : Promise.resolve();\n\t\tlet resolve: () => void;\n\t\tconst promise = new Promise((res) => {\n\t\t\tresolve = res;\n\t\t});\n\n\t\tthis.promises.push({\n\t\t\tresolve: resolve!,\n\t\t\tpromise\n\t\t});\n\n\t\treturn next;\n\t}\n\n\t/**\n\t * Frees the queue's lock for the next item to process\n\t */\n\tpublic shift(): void {\n\t\tconst deferred = this.promises.shift();\n\t\tif (typeof deferred !== 'undefined') deferred.resolve();\n\t}\n}\n\n/**\n * @internal\n */\ninterface InternalAsyncQueueDeferredPromise {\n\tresolve(): void;\n\tpromise: Promise;\n}\n"],"names":[],"mappings":"AAAA;;;MAGa,UAAU;IAAvB;;;;QAWC;;;;mBAAwD,EAAE;WAAC;KA6C3D;;;;IApDA,IAAW,SAAS;QACnB,OAAO,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC;KAC5B;;;;;;;;;;;;;;;;;;;;;;IA4BM,IAAI;QACV,MAAM,IAAI,GAAG,IAAI,CAAC,QAAQ,CAAC,MAAM,GAAG,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,QAAQ,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,OAAO,GAAG,OAAO,CAAC,OAAO,EAAE,CAAC;QACxG,IAAI,OAAmB,CAAC;QACxB,MAAM,OAAO,GAAG,IAAI,OAAO,CAAO,CAAC,GAAG;YACrC,OAAO,GAAG,GAAG,CAAC;SACd,CAAC,CAAC;QAEH,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC;YAClB,OAAO,EAAE,OAAQ;YACjB,OAAO;SACP,CAAC,CAAC;QAEH,OAAO,IAAI,CAAC;KACZ;;;;IAKM,KAAK;QACX,MAAM,QAAQ,GAAG,IAAI,CAAC,QAAQ,CAAC,KAAK,EAAE,CAAC;QACvC,IAAI,OAAO,QAAQ,KAAK,WAAW;YAAE,QAAQ,CAAC,OAAO,EAAE,CAAC;KACxD;;;;;"}
\ No newline at end of file
diff --git a/node_modules/@sapphire/async-queue/dist/index.umd.js b/node_modules/@sapphire/async-queue/dist/index.umd.js
new file mode 100644
index 0000000..3da3cd8
--- /dev/null
+++ b/node_modules/@sapphire/async-queue/dist/index.umd.js
@@ -0,0 +1,76 @@
+(function (global, factory) {
+ typeof exports === 'object' && typeof module !== 'undefined' ? factory(exports) :
+ typeof define === 'function' && define.amd ? define(['exports'], factory) :
+ (global = typeof globalThis !== 'undefined' ? globalThis : global || self, factory(global.SapphireAsyncQueue = {}));
+}(this, (function (exports) { 'use strict';
+
+ /**
+ * The AsyncQueue class used to sequentialize burst requests
+ */
+ class AsyncQueue {
+ constructor() {
+ /**
+ * The promises array
+ */
+ Object.defineProperty(this, "promises", {
+ enumerable: true,
+ configurable: true,
+ writable: true,
+ value: []
+ });
+ }
+ /**
+ * The remaining amount of queued promises
+ */
+ get remaining() {
+ return this.promises.length;
+ }
+ /**
+ * Waits for last promise and queues a new one
+ * @example
+ * ```
+ * const queue = new AsyncQueue();
+ * async function request(url, options) {
+ * await queue.wait();
+ * try {
+ * const result = await fetch(url, options);
+ * // Do some operations with 'result'
+ * } finally {
+ * // Remove first entry from the queue and resolve for the next entry
+ * queue.shift();
+ * }
+ * }
+ *
+ * request(someUrl1, someOptions1); // Will call fetch() immediately
+ * request(someUrl2, someOptions2); // Will call fetch() after the first finished
+ * request(someUrl3, someOptions3); // Will call fetch() after the second finished
+ * ```
+ */
+ wait() {
+ const next = this.promises.length ? this.promises[this.promises.length - 1].promise : Promise.resolve();
+ let resolve;
+ const promise = new Promise((res) => {
+ resolve = res;
+ });
+ this.promises.push({
+ resolve: resolve,
+ promise
+ });
+ return next;
+ }
+ /**
+ * Frees the queue's lock for the next item to process
+ */
+ shift() {
+ const deferred = this.promises.shift();
+ if (typeof deferred !== 'undefined')
+ deferred.resolve();
+ }
+ }
+
+ exports.AsyncQueue = AsyncQueue;
+
+ Object.defineProperty(exports, '__esModule', { value: true });
+
+})));
+//# sourceMappingURL=index.umd.js.map
diff --git a/node_modules/@sapphire/async-queue/dist/index.umd.js.map b/node_modules/@sapphire/async-queue/dist/index.umd.js.map
new file mode 100644
index 0000000..0485efb
--- /dev/null
+++ b/node_modules/@sapphire/async-queue/dist/index.umd.js.map
@@ -0,0 +1 @@
+{"version":3,"file":"index.umd.js","sources":["../src/lib/AsyncQueue.ts"],"sourcesContent":["/**\n * The AsyncQueue class used to sequentialize burst requests\n */\nexport class AsyncQueue {\n\t/**\n\t * The remaining amount of queued promises\n\t */\n\tpublic get remaining(): number {\n\t\treturn this.promises.length;\n\t}\n\n\t/**\n\t * The promises array\n\t */\n\tprivate promises: InternalAsyncQueueDeferredPromise[] = [];\n\n\t/**\n\t * Waits for last promise and queues a new one\n\t * @example\n\t * ```\n\t * const queue = new AsyncQueue();\n\t * async function request(url, options) {\n\t * await queue.wait();\n\t * try {\n\t * const result = await fetch(url, options);\n\t * // Do some operations with 'result'\n\t * } finally {\n\t * // Remove first entry from the queue and resolve for the next entry\n\t * queue.shift();\n\t * }\n\t * }\n\t *\n\t * request(someUrl1, someOptions1); // Will call fetch() immediately\n\t * request(someUrl2, someOptions2); // Will call fetch() after the first finished\n\t * request(someUrl3, someOptions3); // Will call fetch() after the second finished\n\t * ```\n\t */\n\tpublic wait(): Promise {\n\t\tconst next = this.promises.length ? this.promises[this.promises.length - 1].promise : Promise.resolve();\n\t\tlet resolve: () => void;\n\t\tconst promise = new Promise((res) => {\n\t\t\tresolve = res;\n\t\t});\n\n\t\tthis.promises.push({\n\t\t\tresolve: resolve!,\n\t\t\tpromise\n\t\t});\n\n\t\treturn next;\n\t}\n\n\t/**\n\t * Frees the queue's lock for the next item to process\n\t */\n\tpublic shift(): void {\n\t\tconst deferred = this.promises.shift();\n\t\tif (typeof deferred !== 'undefined') deferred.resolve();\n\t}\n}\n\n/**\n * @internal\n */\ninterface InternalAsyncQueueDeferredPromise {\n\tresolve(): void;\n\tpromise: Promise;\n}\n"],"names":[],"mappings":";;;;;;CAAA;;;OAGa,UAAU;KAAvB;;;;SAWC;;;;oBAAwD,EAAE;YAAC;MA6C3D;;;;KApDA,IAAW,SAAS;SACnB,OAAO,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC;MAC5B;;;;;;;;;;;;;;;;;;;;;;KA4BM,IAAI;SACV,MAAM,IAAI,GAAG,IAAI,CAAC,QAAQ,CAAC,MAAM,GAAG,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,QAAQ,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,OAAO,GAAG,OAAO,CAAC,OAAO,EAAE,CAAC;SACxG,IAAI,OAAmB,CAAC;SACxB,MAAM,OAAO,GAAG,IAAI,OAAO,CAAO,CAAC,GAAG;aACrC,OAAO,GAAG,GAAG,CAAC;UACd,CAAC,CAAC;SAEH,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC;aAClB,OAAO,EAAE,OAAQ;aACjB,OAAO;UACP,CAAC,CAAC;SAEH,OAAO,IAAI,CAAC;MACZ;;;;KAKM,KAAK;SACX,MAAM,QAAQ,GAAG,IAAI,CAAC,QAAQ,CAAC,KAAK,EAAE,CAAC;SACvC,IAAI,OAAO,QAAQ,KAAK,WAAW;aAAE,QAAQ,CAAC,OAAO,EAAE,CAAC;MACxD;;;;;;;;;;;"}
\ No newline at end of file
diff --git a/node_modules/@sapphire/async-queue/dist/lib/AsyncQueue.d.ts b/node_modules/@sapphire/async-queue/dist/lib/AsyncQueue.d.ts
new file mode 100644
index 0000000..9c89038
--- /dev/null
+++ b/node_modules/@sapphire/async-queue/dist/lib/AsyncQueue.d.ts
@@ -0,0 +1,40 @@
+/**
+ * The AsyncQueue class used to sequentialize burst requests
+ */
+export declare class AsyncQueue {
+ /**
+ * The remaining amount of queued promises
+ */
+ get remaining(): number;
+ /**
+ * The promises array
+ */
+ private promises;
+ /**
+ * Waits for last promise and queues a new one
+ * @example
+ * ```
+ * const queue = new AsyncQueue();
+ * async function request(url, options) {
+ * await queue.wait();
+ * try {
+ * const result = await fetch(url, options);
+ * // Do some operations with 'result'
+ * } finally {
+ * // Remove first entry from the queue and resolve for the next entry
+ * queue.shift();
+ * }
+ * }
+ *
+ * request(someUrl1, someOptions1); // Will call fetch() immediately
+ * request(someUrl2, someOptions2); // Will call fetch() after the first finished
+ * request(someUrl3, someOptions3); // Will call fetch() after the second finished
+ * ```
+ */
+ wait(): Promise;
+ /**
+ * Frees the queue's lock for the next item to process
+ */
+ shift(): void;
+}
+//# sourceMappingURL=AsyncQueue.d.ts.map
\ No newline at end of file
diff --git a/node_modules/@sapphire/async-queue/dist/lib/AsyncQueue.d.ts.map b/node_modules/@sapphire/async-queue/dist/lib/AsyncQueue.d.ts.map
new file mode 100644
index 0000000..56205af
--- /dev/null
+++ b/node_modules/@sapphire/async-queue/dist/lib/AsyncQueue.d.ts.map
@@ -0,0 +1 @@
+{"version":3,"file":"AsyncQueue.d.ts","sourceRoot":"","sources":["../../src/lib/AsyncQueue.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,qBAAa,UAAU;IACtB;;OAEG;IACH,IAAW,SAAS,IAAI,MAAM,CAE7B;IAED;;OAEG;IACH,OAAO,CAAC,QAAQ,CAA2C;IAE3D;;;;;;;;;;;;;;;;;;;;OAoBG;IACI,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;IAe5B;;OAEG;IACI,KAAK,IAAI,IAAI;CAIpB"}
\ No newline at end of file
diff --git a/node_modules/@sapphire/async-queue/package.json b/node_modules/@sapphire/async-queue/package.json
new file mode 100644
index 0000000..faf54a7
--- /dev/null
+++ b/node_modules/@sapphire/async-queue/package.json
@@ -0,0 +1,55 @@
+{
+ "name": "@sapphire/async-queue",
+ "version": "1.1.4",
+ "description": "Sequential asynchronous lock-based queue for promises",
+ "author": "@sapphire",
+ "license": "MIT",
+ "main": "dist/index.js",
+ "module": "dist/index.mjs",
+ "browser": "dist/index.umd.js",
+ "unpkg": "dist/index.umd.js",
+ "types": "dist/index.d.ts",
+ "exports": {
+ "import": "./dist/index.mjs",
+ "require": "./dist/index.js"
+ },
+ "sideEffects": false,
+ "homepage": "https://github.com/sapphiredev/utilities/tree/main/packages/async-queue",
+ "scripts": {
+ "test": "jest",
+ "lint": "eslint src tests --ext ts --fix -c ../../.eslintrc",
+ "build": "rollup -c",
+ "start": "yarn build -w",
+ "prepublishOnly": "yarn build"
+ },
+ "repository": {
+ "type": "git",
+ "url": "git+https://github.com/sapphiredev/utilities.git",
+ "directory": "packages/async-queue"
+ },
+ "files": [
+ "dist",
+ "!dist/*.tsbuildinfo"
+ ],
+ "engines": {
+ "node": ">=14",
+ "npm": ">=6"
+ },
+ "keywords": [
+ "@sapphire/async-queue",
+ "bot",
+ "typescript",
+ "ts",
+ "yarn",
+ "discord",
+ "sapphire",
+ "standalone"
+ ],
+ "bugs": {
+ "url": "https://github.com/sapphiredev/utilities/issues"
+ },
+ "publishConfig": {
+ "access": "public"
+ },
+ "gitHead": "632c305cb9666dcff8c0ee71167570b8df46ccab"
+}
diff --git a/node_modules/@sindresorhus/is/dist/index.d.ts b/node_modules/@sindresorhus/is/dist/index.d.ts
new file mode 100644
index 0000000..3687767
--- /dev/null
+++ b/node_modules/@sindresorhus/is/dist/index.d.ts
@@ -0,0 +1,220 @@
+///
+///
+///
+import { Class, TypedArray, ObservableLike, Primitive } from './types';
+export { Class, TypedArray, ObservableLike, Primitive };
+declare const objectTypeNames: readonly ["Function", "Generator", "AsyncGenerator", "GeneratorFunction", "AsyncGeneratorFunction", "AsyncFunction", "Observable", "Array", "Buffer", "Object", "RegExp", "Date", "Error", "Map", "Set", "WeakMap", "WeakSet", "ArrayBuffer", "SharedArrayBuffer", "DataView", "Promise", "URL", "HTMLElement", ...("Int8Array" | "Uint8Array" | "Uint8ClampedArray" | "Int16Array" | "Uint16Array" | "Int32Array" | "Uint32Array" | "Float32Array" | "Float64Array" | "BigInt64Array" | "BigUint64Array")[]];
+declare type ObjectTypeName = typeof objectTypeNames[number];
+declare const primitiveTypeNames: readonly ["null", "undefined", "string", "number", "bigint", "boolean", "symbol"];
+declare type PrimitiveTypeName = typeof primitiveTypeNames[number];
+export declare type TypeName = ObjectTypeName | PrimitiveTypeName;
+declare function is(value: unknown): TypeName;
+declare namespace is {
+ var undefined: (value: unknown) => value is undefined;
+ var string: (value: unknown) => value is string;
+ var number: (value: unknown) => value is number;
+ var bigint: (value: unknown) => value is bigint;
+ var function_: (value: unknown) => value is Function;
+ var null_: (value: unknown) => value is null;
+ var class_: (value: unknown) => value is Class;
+ var boolean: (value: unknown) => value is boolean;
+ var symbol: (value: unknown) => value is symbol;
+ var numericString: (value: unknown) => value is string;
+ var array: (value: unknown, assertion?: ((value: T) => value is T) | undefined) => value is T[];
+ var buffer: (value: unknown) => value is Buffer;
+ var nullOrUndefined: (value: unknown) => value is null | undefined;
+ var object: (value: unknown) => value is object;
+ var iterable: (value: unknown) => value is IterableIterator;
+ var asyncIterable: (value: unknown) => value is AsyncIterableIterator;
+ var generator: (value: unknown) => value is Generator;
+ var asyncGenerator: (value: unknown) => value is AsyncGenerator;
+ var nativePromise: (value: unknown) => value is Promise;
+ var promise: (value: unknown) => value is Promise;
+ var generatorFunction: (value: unknown) => value is GeneratorFunction;
+ var asyncGeneratorFunction: (value: unknown) => value is (...args: any[]) => Promise;
+ var asyncFunction: (value: unknown) => value is (...args: any[]) => Promise;
+ var boundFunction: (value: unknown) => value is Function;
+ var regExp: (value: unknown) => value is RegExp;
+ var date: (value: unknown) => value is Date;
+ var error: (value: unknown) => value is Error;
+ var map: (value: unknown) => value is Map;
+ var set: (value: unknown) => value is Set;
+ var weakMap: (value: unknown) => value is WeakMap;
+ var weakSet: (value: unknown) => value is WeakSet;
+ var int8Array: (value: unknown) => value is Int8Array;
+ var uint8Array: (value: unknown) => value is Uint8Array;
+ var uint8ClampedArray: (value: unknown) => value is Uint8ClampedArray;
+ var int16Array: (value: unknown) => value is Int16Array;
+ var uint16Array: (value: unknown) => value is Uint16Array;
+ var int32Array: (value: unknown) => value is Int32Array;
+ var uint32Array: (value: unknown) => value is Uint32Array;
+ var float32Array: (value: unknown) => value is Float32Array;
+ var float64Array: (value: unknown) => value is Float64Array;
+ var bigInt64Array: (value: unknown) => value is BigInt64Array;
+ var bigUint64Array: (value: unknown) => value is BigUint64Array;
+ var arrayBuffer: (value: unknown) => value is ArrayBuffer;
+ var sharedArrayBuffer: (value: unknown) => value is SharedArrayBuffer;
+ var dataView: (value: unknown) => value is DataView;
+ var directInstanceOf: (instance: unknown, class_: Class) => instance is T;
+ var urlInstance: (value: unknown) => value is URL;
+ var urlString: (value: unknown) => value is string;
+ var truthy: (value: unknown) => boolean;
+ var falsy: (value: unknown) => boolean;
+ var nan: (value: unknown) => boolean;
+ var primitive: (value: unknown) => value is Primitive;
+ var integer: (value: unknown) => value is number;
+ var safeInteger: (value: unknown) => value is number;
+ var plainObject: (value: unknown) => value is Record;
+ var typedArray: (value: unknown) => value is TypedArray;
+ var arrayLike: (value: unknown) => value is ArrayLike;
+ var inRange: (value: number, range: number | number[]) => value is number;
+ var domElement: (value: unknown) => value is HTMLElement;
+ var observable: (value: unknown) => value is ObservableLike;
+ var nodeStream: (value: unknown) => value is NodeStream;
+ var infinite: (value: unknown) => value is number;
+ var evenInteger: (value: number) => value is number;
+ var oddInteger: (value: number) => value is number;
+ var emptyArray: (value: unknown) => value is never[];
+ var nonEmptyArray: (value: unknown) => value is unknown[];
+ var emptyString: (value: unknown) => value is "";
+ var nonEmptyString: (value: unknown) => value is string;
+ var emptyStringOrWhitespace: (value: unknown) => value is string;
+ var emptyObject: (value: unknown) => value is Record;
+ var nonEmptyObject: (value: unknown) => value is Record;
+ var emptySet: (value: unknown) => value is Set;
+ var nonEmptySet: (value: unknown) => value is Set;
+ var emptyMap: (value: unknown) => value is Map;
+ var nonEmptyMap: (value: unknown) => value is Map;
+ var any: (predicate: Predicate | Predicate[], ...values: unknown[]) => boolean;
+ var all: (predicate: Predicate, ...values: unknown[]) => boolean;
+}
+declare type ObjectKey = string | number | symbol;
+export interface ArrayLike {
+ readonly [index: number]: T;
+ readonly length: number;
+}
+export interface NodeStream extends NodeJS.EventEmitter {
+ pipe(destination: T, options?: {
+ end?: boolean;
+ }): T;
+}
+export declare type Predicate = (value: unknown) => boolean;
+export declare const enum AssertionTypeDescription {
+ class_ = "Class",
+ numericString = "string with a number",
+ nullOrUndefined = "null or undefined",
+ iterable = "Iterable",
+ asyncIterable = "AsyncIterable",
+ nativePromise = "native Promise",
+ urlString = "string with a URL",
+ truthy = "truthy",
+ falsy = "falsy",
+ nan = "NaN",
+ primitive = "primitive",
+ integer = "integer",
+ safeInteger = "integer",
+ plainObject = "plain object",
+ arrayLike = "array-like",
+ typedArray = "TypedArray",
+ domElement = "HTMLElement",
+ nodeStream = "Node.js Stream",
+ infinite = "infinite number",
+ emptyArray = "empty array",
+ nonEmptyArray = "non-empty array",
+ emptyString = "empty string",
+ nonEmptyString = "non-empty string",
+ emptyStringOrWhitespace = "empty string or whitespace",
+ emptyObject = "empty object",
+ nonEmptyObject = "non-empty object",
+ emptySet = "empty set",
+ nonEmptySet = "non-empty set",
+ emptyMap = "empty map",
+ nonEmptyMap = "non-empty map",
+ evenInteger = "even integer",
+ oddInteger = "odd integer",
+ directInstanceOf = "T",
+ inRange = "in range",
+ any = "predicate returns truthy for any value",
+ all = "predicate returns truthy for all values"
+}
+interface Assert {
+ undefined: (value: unknown) => asserts value is undefined;
+ string: (value: unknown) => asserts value is string;
+ number: (value: unknown) => asserts value is number;
+ bigint: (value: unknown) => asserts value is bigint;
+ function_: (value: unknown) => asserts value is Function;
+ null_: (value: unknown) => asserts value is null;
+ class_: (value: unknown) => asserts value is Class;
+ boolean: (value: unknown) => asserts value is boolean;
+ symbol: (value: unknown) => asserts value is symbol;
+ numericString: (value: unknown) => asserts value is string;
+ array: (value: unknown, assertion?: (element: unknown) => asserts element is T) => asserts value is T[];
+ buffer: (value: unknown) => asserts value is Buffer;
+ nullOrUndefined: (value: unknown) => asserts value is null | undefined;
+ object: (value: unknown) => asserts value is Record;
+ iterable: (value: unknown) => asserts value is Iterable;
+ asyncIterable: (value: unknown) => asserts value is AsyncIterable;
+ generator: (value: unknown) => asserts value is Generator;
+ asyncGenerator: (value: unknown) => asserts value is AsyncGenerator;
+ nativePromise: (value: unknown) => asserts value is Promise;
+ promise: (value: unknown) => asserts value is Promise;
+ generatorFunction: (value: unknown) => asserts value is GeneratorFunction;
+ asyncGeneratorFunction: (value: unknown) => asserts value is AsyncGeneratorFunction;
+ asyncFunction: (value: unknown) => asserts value is Function;
+ boundFunction: (value: unknown) => asserts value is Function;
+ regExp: (value: unknown) => asserts value is RegExp;
+ date: (value: unknown) => asserts value is Date;
+ error: (value: unknown) => asserts value is Error;
+ map: (value: unknown) => asserts value is Map;
+ set: (value: unknown) => asserts value is Set;
+ weakMap: (value: unknown) => asserts value is WeakMap;
+ weakSet: (value: unknown) => asserts value is WeakSet;
+ int8Array: (value: unknown) => asserts value is Int8Array;
+ uint8Array: (value: unknown) => asserts value is Uint8Array;
+ uint8ClampedArray: (value: unknown) => asserts value is Uint8ClampedArray;
+ int16Array: (value: unknown) => asserts value is Int16Array;
+ uint16Array: (value: unknown) => asserts value is Uint16Array;
+ int32Array: (value: unknown) => asserts value is Int32Array;
+ uint32Array: (value: unknown) => asserts value is Uint32Array;
+ float32Array: (value: unknown) => asserts value is Float32Array;
+ float64Array: (value: unknown) => asserts value is Float64Array;
+ bigInt64Array: (value: unknown) => asserts value is BigInt64Array;
+ bigUint64Array: (value: unknown) => asserts value is BigUint64Array;
+ arrayBuffer: (value: unknown) => asserts value is ArrayBuffer;
+ sharedArrayBuffer: (value: unknown) => asserts value is SharedArrayBuffer;
+ dataView: (value: unknown) => asserts value is DataView;
+ urlInstance: (value: unknown) => asserts value is URL;
+ urlString: (value: unknown) => asserts value is string;
+ truthy: (value: unknown) => asserts value is unknown;
+ falsy: (value: unknown) => asserts value is unknown;
+ nan: (value: unknown) => asserts value is unknown;
+ primitive: (value: unknown) => asserts value is Primitive;
+ integer: (value: unknown) => asserts value is number;
+ safeInteger: (value: unknown) => asserts value is number;
+ plainObject: (value: unknown) => asserts value is Record;
+ typedArray: (value: unknown) => asserts value is TypedArray;
+ arrayLike: (value: unknown) => asserts value is ArrayLike