├── .github └── FUNDING.yml ├── .gitignore ├── .env.sample ├── src ├── helpers │ ├── delay.ts │ ├── format.ts │ ├── dud.ts │ ├── bot.ts │ ├── i18n.ts │ ├── date.ts │ ├── name.ts │ ├── tryReport.ts │ ├── getAttackerDefender.ts │ ├── MessageUpdater.ts │ ├── buttons.ts │ ├── checkDuel.ts │ └── duelChecker.ts ├── middlewares │ ├── attachUser.ts │ ├── attachDuel.ts │ ├── checkTime.ts │ ├── updateUser.ts │ └── checkLock.ts ├── models │ ├── index.ts │ ├── User.ts │ └── Duel.ts ├── commands │ ├── help.ts │ ├── duelMode.ts │ ├── lock.ts │ ├── attackerAnonimity.ts │ ├── stats.ts │ ├── language.ts │ ├── leaderboard.ts │ ├── transfer.ts │ ├── mine.ts │ └── duel.ts ├── types │ └── telegraf.d.ts └── app.ts ├── tsconfig.json ├── README.md ├── LICENSE ├── package.json ├── locales ├── en.yaml └── ru.yaml └── yarn.lock /.github/FUNDING.yml: -------------------------------------------------------------------------------- 1 | github: backmeupplz 2 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | node_modules 2 | dist 3 | .env 4 | *.log -------------------------------------------------------------------------------- /.env.sample: -------------------------------------------------------------------------------- 1 | TOKEN=123 2 | MONGO=mongodb://localhost:27017/tlgcoin 3 | ADMIN=123 -------------------------------------------------------------------------------- /src/helpers/delay.ts: -------------------------------------------------------------------------------- 1 | export function delay(s: number) { 2 | return new Promise(res => { 3 | setTimeout(() => { 4 | res() 5 | }, s * 1000) 6 | }) 7 | } 8 | -------------------------------------------------------------------------------- /src/helpers/format.ts: -------------------------------------------------------------------------------- 1 | // Dependencies 2 | import commaNumber = require('comma-number') 3 | 4 | const balanceFormat = commaNumber.bindWith(' ', ',') 5 | 6 | export function format(n: number) { 7 | return balanceFormat(n) 8 | } 9 | -------------------------------------------------------------------------------- /src/middlewares/attachUser.ts: -------------------------------------------------------------------------------- 1 | // Dependencies 2 | import { findOrCreateUser } from '../models' 3 | import { ContextMessageUpdate } from 'telegraf' 4 | 5 | export async function attachUser(ctx: ContextMessageUpdate, next) { 6 | const dbuser = await findOrCreateUser(ctx) 7 | ctx.dbuser = dbuser 8 | next() 9 | } 10 | -------------------------------------------------------------------------------- /src/helpers/dud.ts: -------------------------------------------------------------------------------- 1 | // Dependencies 2 | import { Telegraf, ContextMessageUpdate } from 'telegraf' 3 | import { tryReport } from './tryReport' 4 | 5 | export function setupDud(bot: Telegraf) { 6 | bot.action('dud', async ctx => { 7 | // Answer right away 8 | await tryReport(ctx.answerCbQuery(ctx.i18n.t('dud_message'))) 9 | }) 10 | } 11 | -------------------------------------------------------------------------------- /src/models/index.ts: -------------------------------------------------------------------------------- 1 | // Dependencies 2 | import * as mongoose from 'mongoose' 3 | 4 | // Connect to mongoose 5 | mongoose.connect(process.env.MONGO, { 6 | useNewUrlParser: true, 7 | useUnifiedTopology: true, 8 | }) 9 | 10 | mongoose.set('useCreateIndex', true) 11 | mongoose.set('useFindAndModify', false) 12 | 13 | // Export models 14 | export * from './User' 15 | export * from './Duel' 16 | -------------------------------------------------------------------------------- /src/commands/help.ts: -------------------------------------------------------------------------------- 1 | // Dependencies 2 | import { Telegraf, ContextMessageUpdate } from 'telegraf' 3 | import { checkLock } from '../middlewares/checkLock' 4 | 5 | export function setupHelp(bot: Telegraf) { 6 | bot.command(['help', 'start'], checkLock, async (ctx) => { 7 | await ctx.replyWithHTML(ctx.i18n.t('help', { id: ctx.chat.id }), { 8 | disable_web_page_preview: true, 9 | }) 10 | }) 11 | } 12 | -------------------------------------------------------------------------------- /tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "compilerOptions": { 3 | "module": "commonjs", 4 | "target": "es2017", 5 | "lib": ["es2015"], 6 | "moduleResolution": "node", 7 | "sourceMap": true, 8 | "outDir": "dist", 9 | "baseUrl": ".", 10 | "paths": { 11 | "*": ["node_modules/*", "src/types/*"] 12 | }, 13 | "emitDecoratorMetadata": true, 14 | "experimentalDecorators": true 15 | }, 16 | "include": ["src/**/*"] 17 | } 18 | -------------------------------------------------------------------------------- /src/commands/duelMode.ts: -------------------------------------------------------------------------------- 1 | // Dependencies 2 | import { Telegraf, ContextMessageUpdate } from 'telegraf' 3 | import { checkLock } from '../middlewares/checkLock' 4 | 5 | export function setupDuelMode(bot: Telegraf) { 6 | bot.command('duelMode', checkLock, async ctx => { 7 | ctx.dbuser.duelsOn = !ctx.dbuser.duelsOn 8 | await ctx.dbuser.save() 9 | await ctx.replyWithHTML( 10 | ctx.i18n.t(ctx.dbuser.duelsOn ? 'duels_on' : 'duels_off') 11 | ) 12 | }) 13 | } 14 | -------------------------------------------------------------------------------- /src/commands/lock.ts: -------------------------------------------------------------------------------- 1 | // Dependencies 2 | import { Telegraf, ContextMessageUpdate } from 'telegraf' 3 | import { checkLock } from '../middlewares/checkLock' 4 | 5 | export function setupLock(bot: Telegraf) { 6 | bot.command('lock', checkLock, async ctx => { 7 | ctx.dbuser.adminLocked = !ctx.dbuser.adminLocked 8 | await ctx.dbuser.save() 9 | await ctx.replyWithHTML( 10 | ctx.i18n.t(ctx.dbuser.adminLocked ? 'lock_on' : 'lock_off') 11 | ) 12 | }) 13 | } 14 | -------------------------------------------------------------------------------- /src/helpers/bot.ts: -------------------------------------------------------------------------------- 1 | // Dependencies 2 | import { ContextMessageUpdate, Telegraf } from 'telegraf' 3 | import { tryReport } from './tryReport' 4 | const TelegrafBot = require('telegraf') 5 | 6 | export const bot = new TelegrafBot(process.env.TOKEN, { 7 | channelMode: true, 8 | }) as Telegraf 9 | 10 | bot.telegram.getMe().then(botInfo => { 11 | const anybot = bot as any 12 | anybot.options.username = botInfo.username 13 | }) 14 | 15 | bot.catch(async err => { 16 | await tryReport(err) 17 | }) 18 | -------------------------------------------------------------------------------- /src/middlewares/attachDuel.ts: -------------------------------------------------------------------------------- 1 | // Dependencies 2 | import { DuelModel } from '../models' 3 | import { ContextMessageUpdate } from 'telegraf' 4 | import { tryReport } from '../helpers/tryReport' 5 | 6 | export async function attachDuelToCB(ctx: ContextMessageUpdate, next) { 7 | // Get duel 8 | const duelId = ctx.callbackQuery.data.split('~')[1] 9 | const duel = await DuelModel.findOne({ _id: duelId }).populate( 10 | 'attacker defender' 11 | ) 12 | if (!duel) { 13 | return tryReport(ctx.answerCbQuery(ctx.i18n.t('duel_not_found'))) 14 | } 15 | ctx.duel = duel 16 | next() 17 | } 18 | -------------------------------------------------------------------------------- /src/commands/attackerAnonimity.ts: -------------------------------------------------------------------------------- 1 | // Dependencies 2 | import { Telegraf, ContextMessageUpdate } from 'telegraf' 3 | import { checkLock } from '../middlewares/checkLock' 4 | 5 | export function setupAttackerAnonimity(bot: Telegraf) { 6 | bot.command('attackerAnonimity', checkLock, async ctx => { 7 | ctx.dbuser.attackerAnonimity = !ctx.dbuser.attackerAnonimity 8 | await ctx.dbuser.save() 9 | await ctx.replyWithHTML( 10 | ctx.i18n.t( 11 | ctx.dbuser.attackerAnonimity 12 | ? 'attacker_anonimity_on' 13 | : 'attacker_anonimity_off' 14 | ) 15 | ) 16 | }) 17 | } 18 | -------------------------------------------------------------------------------- /src/helpers/i18n.ts: -------------------------------------------------------------------------------- 1 | // Dependencies 2 | import I18N from 'telegraf-i18n' 3 | import Telegraf, { ContextMessageUpdate } from 'telegraf' 4 | const dirtyI18N = require('telegraf-i18n') 5 | 6 | const i18n = new dirtyI18N({ 7 | directory: `${__dirname}/../../locales`, 8 | defaultLanguage: 'en', 9 | sessionName: 'session', 10 | useSession: false, 11 | allowMissing: false, 12 | }) as I18N 13 | 14 | export function setupI18N(bot: Telegraf) { 15 | bot.use(i18n.middleware()) 16 | bot.use((ctx, next) => { 17 | const anyI18N = ctx.i18n as any 18 | anyI18N.locale(ctx.dbuser.language) 19 | next() 20 | }) 21 | } 22 | -------------------------------------------------------------------------------- /src/middlewares/checkTime.ts: -------------------------------------------------------------------------------- 1 | import { ContextMessageUpdate } from 'telegraf' 2 | 3 | export async function checkTime(ctx: ContextMessageUpdate, next: () => any) { 4 | if (ctx.updateType === 'message') { 5 | if ( 6 | new Date().getTime() / 1000 - (ctx.message || ctx.channelPost).date < 7 | 5 * 60 8 | ) { 9 | next() 10 | } else { 11 | console.log( 12 | `Ignoring message from ${ctx.from.id} at ${ 13 | ctx.chat.id 14 | } (${new Date().getTime() / 1000}:${ 15 | (ctx.message || ctx.channelPost).date 16 | })` 17 | ) 18 | } 19 | } else { 20 | next() 21 | } 22 | } 23 | -------------------------------------------------------------------------------- /src/helpers/date.ts: -------------------------------------------------------------------------------- 1 | export function getUTCDate(d?: Date) { 2 | const date = d || new Date() 3 | 4 | return `${leadZero(date.getUTCDate())}-${leadZero( 5 | date.getUTCMonth() + 1 6 | )}-${date.getUTCFullYear()}` 7 | } 8 | 9 | export function getUTCTime(d?: Date) { 10 | const date = d || new Date() 11 | 12 | return `${leadZero(date.getUTCHours())}:${leadZero( 13 | date.getUTCMinutes() 14 | )}:${leadZero(date.getUTCSeconds())} UTC` 15 | } 16 | 17 | function leadZero(n: number) { 18 | return n < 10 ? `0${n}` : n 19 | } 20 | 21 | export function dateMinutesAfterNow(minutes: number) { 22 | const minutesLater = new Date() 23 | minutesLater.setMinutes(minutesLater.getMinutes() + minutes) 24 | return minutesLater 25 | } 26 | -------------------------------------------------------------------------------- /src/types/telegraf.d.ts: -------------------------------------------------------------------------------- 1 | // Dependencies 2 | import I18N from 'telegraf-i18n' 3 | import * as tt from 'telegraf/typings/telegram-types.d' 4 | import { User, Duel } from '../models' 5 | import { InstanceType } from '@hasezoey/typegoose' 6 | 7 | declare module 'telegraf' { 8 | export class ContextMessageUpdate { 9 | dbuser: InstanceType 10 | duel: InstanceType 11 | i18n: I18N 12 | options: { 13 | username?: string 14 | } 15 | } 16 | 17 | export interface Composer { 18 | action( 19 | action: string | string[] | RegExp, 20 | middleware: Middleware, 21 | ...middlewares: Array> 22 | ): Composer 23 | } 24 | } 25 | -------------------------------------------------------------------------------- /src/middlewares/updateUser.ts: -------------------------------------------------------------------------------- 1 | // Dependencies 2 | import { ContextMessageUpdate } from 'telegraf' 3 | import { tryReport } from '../helpers/tryReport' 4 | 5 | export async function updateUser(ctx: ContextMessageUpdate, next) { 6 | await tryReport(async () => { 7 | const user = ctx.dbuser 8 | user.type = ctx.chat.type 9 | user.chat = ctx.chat 10 | user.username = ctx.chat.username 11 | ? ctx.chat.username.toLowerCase() 12 | : undefined 13 | if (user.type !== 'private') { 14 | if (!user.chat.username && !user.chat.invite_link) { 15 | const link = await tryReport(ctx.telegram.exportChatInviteLink(user.id)) 16 | user.chat.invite_link = link 17 | } 18 | } 19 | await user.save() 20 | }) 21 | next() 22 | } 23 | -------------------------------------------------------------------------------- /src/commands/stats.ts: -------------------------------------------------------------------------------- 1 | // Dependencies 2 | import { UserModel } from '../models/User' 3 | import { checkLock } from '../middlewares/checkLock' 4 | import { Telegraf, ContextMessageUpdate } from 'telegraf' 5 | import { format } from '../helpers/format' 6 | 7 | export function setupStats(bot: Telegraf) { 8 | bot.command('stats', checkLock, async ctx => { 9 | const stats = (await UserModel.aggregate([ 10 | { 11 | $group: { 12 | _id: 'Stats', 13 | totalAmount: { $sum: '$balance' }, 14 | count: { $sum: 1 }, 15 | }, 16 | }, 17 | ]))[0] 18 | await ctx.replyWithHTML( 19 | ctx.i18n.t('stats', { 20 | count: format(stats.count), 21 | total: format(stats.totalAmount), 22 | }) 23 | ) 24 | }) 25 | } 26 | -------------------------------------------------------------------------------- /src/helpers/name.ts: -------------------------------------------------------------------------------- 1 | import { Chat, User } from 'telegram-typings' 2 | 3 | export function getName(chat: Chat | User) { 4 | if (!('type' in chat) || chat.type === 'private') { 5 | return chat.username 6 | ? chat.username 7 | : `${chat.first_name}${chat.last_name ? ` ${chat.last_name}` : ''}` 8 | } else { 9 | return (chat as Chat).title 10 | } 11 | } 12 | 13 | export function getNameWithLink(chat: Chat) { 14 | if (chat.type === 'private') { 15 | return chat.username 16 | ? `@${chat.username}` 17 | : `${chat.first_name}${ 18 | chat.last_name ? ` ${chat.last_name}` : '' 19 | }` 20 | } else { 21 | return chat.username 22 | ? `${chat.title}` 23 | : chat.invite_link 24 | ? `${chat.title}` 25 | : `${chat.title}` 26 | } 27 | } 28 | -------------------------------------------------------------------------------- /src/helpers/tryReport.ts: -------------------------------------------------------------------------------- 1 | // Dependencies 2 | import { bot } from './bot' 3 | 4 | export async function tryReport(fun: (() => T) | Promise) { 5 | try { 6 | const result = await (fun instanceof Function ? fun() : fun) 7 | return result 8 | } catch (err) { 9 | await report(err) 10 | return undefined 11 | } 12 | } 13 | 14 | async function report(err: Error) { 15 | const dismissableErrors = ['message is not modified', 'Too Many Requests', 'not enough rights to manage chat invite link', 'query is too old and response timeout expired or query ID is invalid', 'socket hang up'] 16 | try { 17 | for (const errorText of dismissableErrors) { 18 | if (err.message.indexOf(errorText) > -1) { 19 | return 20 | } 21 | } 22 | const text = `Error:\n${err.message || 23 | JSON.stringify(err)}\n\n${err.stack 24 | .replace('<', '{{') 25 | .replace('>', '}}')}` 26 | bot.telegram.sendMessage(process.env.ADMIN, text, { 27 | parse_mode: 'HTML', 28 | }) 29 | } catch (err) { 30 | console.error(err) 31 | } 32 | } 33 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # [@tlgcoin_bot](https://t.me/tlgcoin_bot) Telegram clicker bot code 2 | 3 | This is the code for the clicker Telegram bot I've built. Enjoy and feel free to reuse, expand or improve! 4 | 5 | # Installation and local launch 6 | 7 | 1. Clone this repo: `git clone https://github.com/backmeupplz/tlgcoin` 8 | 2. Launch the [mongo database](https://www.mongodb.com/) locally 9 | 3. Create `.env` with the environment variables listed below 10 | 4. Run `yarn install` in the root folder 11 | 5. Run `yarn start` 12 | 13 | And you should be good to go! Feel free to fork and submit pull requests. Thanks! 14 | 15 | # Environment variables 16 | 17 | - `TOKEN` — Telegram bot token 18 | - `MONGO`— URL of the mongo database 19 | — `ADMIN` — ID of the bot admin 20 | 21 | Also, please, consider looking at `.env.sample`. 22 | 23 | # Continuous integration 24 | 25 | Any commit pushed to master gets deployed to @randymbot via [CI Ninja](https://github.com/backmeupplz/ci-ninja). 26 | 27 | # License 28 | 29 | MIT — use for any purpose. Would be great if you could leave a note about the original developers. Thanks! 30 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2019 Nikita Kolmogorov 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "tlgcoin", 3 | "version": "1.0.0", 4 | "description": "Clicker coin for Telegram", 5 | "main": "dist/app.js", 6 | "repository": "https://github.com/backmeupplz/tlgcoin", 7 | "author": "backmeupplz ", 8 | "license": "MIT", 9 | "private": false, 10 | "scripts": { 11 | "distribute": "yarn build-ts && node dist/app.js", 12 | "develop": "concurrently -k -p \"[{name}]\" -n \"TypeScript,Node\" -c \"yellow.bold,cyan.bold\" \"yarn watch-ts\" \"yarn watch-js\"", 13 | "build-ts": "tsc --skipLibCheck", 14 | "watch-ts": "tsc -w --skipLibCheck", 15 | "watch-js": "nodemon dist/app.js" 16 | }, 17 | "devDependencies": { 18 | "concurrently": "^4.1.2", 19 | "nodemon": "^1.19.2" 20 | }, 21 | "dependencies": { 22 | "@hasezoey/typegoose": "^5.9.2", 23 | "@types/dotenv": "^6.1.1", 24 | "@types/js-yaml": "^3.12.1", 25 | "@types/mongoose": "^5.5.17", 26 | "@types/node": "^12.7.5", 27 | "comma-number": "^2.0.1", 28 | "dotenv": "^8.1.0", 29 | "js-yaml": "^3.13.1", 30 | "mongoose": "^5.5.2", 31 | "random-emoji": "^1.0.2", 32 | "semaphore-async-await": "^1.5.1", 33 | "telegraf": "^3.32.0", 34 | "telegraf-i18n": "^6.6.0", 35 | "typescript": "^3.6.3" 36 | } 37 | } 38 | -------------------------------------------------------------------------------- /src/helpers/getAttackerDefender.ts: -------------------------------------------------------------------------------- 1 | // Dependencies 2 | import { User, UserModel } from '../models/' 3 | import { ContextMessageUpdate } from 'telegraf' 4 | import { InstanceType } from '@hasezoey/typegoose' 5 | import { tryReport } from './tryReport' 6 | 7 | export async function getAttackerDefender(ctx: ContextMessageUpdate) { 8 | const components = (ctx.message || ctx.channelPost).text.split(' ') 9 | if (components.length < 2) { 10 | await tryReport(ctx.replyWithHTML(ctx.i18n.t('duel_format_error'))) 11 | return false 12 | } 13 | const defenderHandleOrID = components[1] 14 | // Get attacker 15 | const attacker = ctx.dbuser 16 | // Get defender 17 | let defender: InstanceType 18 | if (defenderHandleOrID.indexOf('@') > -1) { 19 | defender = await UserModel.findOne({ 20 | username: defenderHandleOrID.substr(1).toLowerCase(), 21 | }) 22 | } else { 23 | defender = await UserModel.findOne({ 24 | id: parseInt(defenderHandleOrID, 10), 25 | }) 26 | } 27 | if (!defender) { 28 | await tryReport( 29 | ctx.replyWithHTML( 30 | ctx.i18n.t('chat_not_found_error', { 31 | recipient: defenderHandleOrID, 32 | }) 33 | ) 34 | ) 35 | return false 36 | } 37 | return { 38 | defender, 39 | attacker, 40 | } 41 | } 42 | -------------------------------------------------------------------------------- /src/models/User.ts: -------------------------------------------------------------------------------- 1 | // Dependencies 2 | import { ContextMessageUpdate } from 'telegraf' 3 | import { prop, Typegoose } from '@hasezoey/typegoose' 4 | import * as Telegram from 'telegram-typings' 5 | 6 | export class User extends Typegoose { 7 | @prop({ required: true, index: true, unique: true }) 8 | id: number 9 | @prop({ required: true, default: 'en' }) 10 | language: string 11 | 12 | @prop({ required: true, default: 0 }) 13 | balance: number 14 | 15 | @prop({ required: true, index: true }) 16 | type: string 17 | @prop({ required: true }) 18 | chat: Telegram.Chat 19 | @prop() 20 | username?: string 21 | 22 | @prop({ required: true, default: true }) 23 | duelsOn: boolean 24 | @prop({ required: true, default: false }) 25 | adminLocked: boolean 26 | @prop({ required: true, default: true }) 27 | attackerAnonimity: boolean 28 | } 29 | 30 | // Get User model 31 | export const UserModel = new User().getModelForClass(User, { 32 | schemaOptions: { timestamps: true }, 33 | }) 34 | 35 | // Get or create user 36 | export async function findOrCreateUser(ctx: ContextMessageUpdate) { 37 | let user = await UserModel.findOne({ id: ctx.chat.id }) 38 | if (!user) { 39 | try { 40 | user = await new UserModel({ 41 | id: ctx.chat.id, 42 | chat: ctx.chat, 43 | type: ctx.chat.type, 44 | }).save() 45 | } catch (err) { 46 | user = await UserModel.findOne({ id: ctx.chat.id }) 47 | } 48 | } 49 | return user 50 | } 51 | -------------------------------------------------------------------------------- /src/app.ts: -------------------------------------------------------------------------------- 1 | // Config dotenv 2 | import * as dotenv from 'dotenv' 3 | dotenv.config({ path: `${__dirname}/../.env` }) 4 | // Dependencies 5 | import { bot } from './helpers/bot' 6 | import { checkTime } from './middlewares/checkTime' 7 | import { setupHelp } from './commands/help' 8 | import { setupI18N } from './helpers/i18n' 9 | import { setupLanguage } from './commands/language' 10 | import { attachUser } from './middlewares/attachUser' 11 | import { setupMine } from './commands/mine' 12 | import { setupLeaderboard } from './commands/leaderboard' 13 | import { updateUser } from './middlewares/updateUser' 14 | import { setupTransfer } from './commands/transfer' 15 | import { setupDuel } from './commands/duel' 16 | import { setupDuelMode } from './commands/duelMode' 17 | import { startCheckingDuels } from './helpers/duelChecker' 18 | import { setupLock } from './commands/lock' 19 | import { setupAttackerAnonimity } from './commands/attackerAnonimity' 20 | import { setupDud } from './helpers/dud' 21 | import { setupStats } from './commands/stats' 22 | 23 | // Check time 24 | bot.use(checkTime) 25 | // Attach and update user 26 | bot.use(attachUser) 27 | bot.use(updateUser) 28 | // Setup localization 29 | setupI18N(bot) 30 | // Setup commands 31 | setupHelp(bot) 32 | setupLanguage(bot) 33 | setupMine(bot) 34 | setupLeaderboard(bot) 35 | setupTransfer(bot) 36 | setupDuel(bot) 37 | setupDuelMode(bot) 38 | setupLock(bot) 39 | setupAttackerAnonimity(bot) 40 | setupDud(bot) 41 | setupStats(bot) 42 | 43 | // Start checking duels 44 | startCheckingDuels(bot) 45 | 46 | // Start bot 47 | bot.startPolling() 48 | 49 | // Log 50 | console.info('Bot is up and running') 51 | -------------------------------------------------------------------------------- /src/middlewares/checkLock.ts: -------------------------------------------------------------------------------- 1 | // Dependencies 2 | import { ContextMessageUpdate } from 'telegraf' 3 | import { tryReport } from '../helpers/tryReport' 4 | 5 | export async function checkLock(ctx: ContextMessageUpdate, next: () => any) { 6 | // Non-group 7 | if ( 8 | !ctx.dbuser.adminLocked || 9 | ctx.chat.type === 'private' || 10 | ctx.chat.type === 'channel' 11 | ) { 12 | next() 13 | return 14 | } 15 | // Superadmin (yay!) 16 | if (ctx.from.id === parseInt(process.env.ADMIN)) { 17 | next() 18 | return 19 | } 20 | // Anonymous admins 21 | if ( 22 | ctx.from && 23 | ctx.from.username && 24 | ctx.from.username === 'GroupAnonymousBot' 25 | ) { 26 | next() 27 | return 28 | } 29 | // Chat admins 30 | if (await checkIfAdmin(ctx)) { 31 | next() 32 | } else { 33 | // Delete if needed 34 | await tryReport( 35 | ctx.telegram.deleteMessage( 36 | ctx.chat.id, 37 | (ctx.message || ctx.channelPost).message_id 38 | ) 39 | ) 40 | } 41 | } 42 | 43 | export async function checkIfAdmin(ctx: ContextMessageUpdate) { 44 | const admins = await tryReport(ctx.getChatAdministrators()) 45 | if (!admins) { 46 | return true 47 | } 48 | let isAdmin = false 49 | for (const admin of admins) { 50 | if (admin.user.id === ctx.from.id) { 51 | isAdmin = true 52 | break 53 | } 54 | } 55 | return isAdmin 56 | } 57 | 58 | export async function checkIfAdminCB( 59 | ctx: ContextMessageUpdate, 60 | next: () => any 61 | ) { 62 | // Check if admin in nonprivate 63 | if (ctx.chat.type !== 'private' && !(await checkIfAdmin(ctx))) { 64 | await ctx.answerCbQuery(ctx.i18n.t('only_admins_error')) 65 | } else { 66 | return next() 67 | } 68 | } 69 | -------------------------------------------------------------------------------- /src/models/Duel.ts: -------------------------------------------------------------------------------- 1 | // Dependencies 2 | import { prop, Typegoose } from '@hasezoey/typegoose' 3 | import { User } from './' 4 | import { Message } from 'telegram-typings' 5 | 6 | export enum DuelState { 7 | setup = 'setup', 8 | requested = 'requested', 9 | active = 'active', 10 | finished = 'finished', 11 | cancelled = 'cancelled', 12 | } 13 | 14 | enum DuelType { 15 | clicks = '0', 16 | patience = '1', 17 | } 18 | 19 | enum StakeType { 20 | percent = 'percent', 21 | fixed = 'fixed', 22 | } 23 | 24 | export enum DuelSide { 25 | attacker = '0', 26 | defender = '1', 27 | } 28 | 29 | export class Duel extends Typegoose { 30 | @prop({ 31 | enum: DuelType, 32 | required: true, 33 | default: DuelType.clicks, 34 | index: true, 35 | }) 36 | type: DuelType 37 | 38 | @prop({ ref: User, required: true, index: true }) 39 | attacker: User 40 | @prop({ required: true, index: true }) 41 | attackerId: number 42 | @prop({ ref: User, required: true, index: true }) 43 | defender: User 44 | @prop({ required: true, index: true }) 45 | defenderId: number 46 | 47 | @prop() 48 | attackerMessage?: Message 49 | @prop() 50 | defenderMessage?: Message 51 | 52 | @prop({ required: true, default: 0 }) 53 | attackerBalance: number 54 | @prop({ required: true, default: 0 }) 55 | defenderBalance: number 56 | 57 | @prop({ 58 | required: true, 59 | enum: DuelState, 60 | default: DuelState.setup, 61 | index: true, 62 | }) 63 | state: DuelState 64 | 65 | @prop() 66 | endDate?: Date 67 | 68 | @prop({ enum: StakeType, required: true, default: StakeType.percent }) 69 | stakeType: StakeType 70 | @prop({ required: true, default: 20 }) 71 | stake: number 72 | 73 | @prop() 74 | createdAt?: Date 75 | } 76 | 77 | // Get Duel model 78 | export const DuelModel = new Duel().getModelForClass(Duel, { 79 | schemaOptions: { timestamps: true }, 80 | }) 81 | -------------------------------------------------------------------------------- /src/helpers/MessageUpdater.ts: -------------------------------------------------------------------------------- 1 | // Dependencies 2 | import { delay } from './delay' 3 | import Semaphore from 'semaphore-async-await' 4 | import { tryReport } from './tryReport' 5 | 6 | enum MessageUpdateRequestStatus { 7 | Empty = 0, 8 | Occupied = 1, 9 | Requested = 2, 10 | } 11 | 12 | export class MessageUpdater { 13 | private updateLocks = {} 14 | private messageUpdateRequests = {} 15 | 16 | public async waitWhenUpdatesAreOver(id: string) { 17 | while (this.messageUpdateRequests[id]) { 18 | await delay(0.5) 19 | } 20 | } 21 | 22 | public async update(id: string, updater: (() => any) | Promise) { 23 | // Lock semaphore 24 | let updateLock = this.updateLocks[id] 25 | if (!updateLock) { 26 | updateLock = new Semaphore(1) 27 | this.updateLocks[id] = updateLock 28 | } 29 | await updateLock.wait() 30 | // Check the update requests 31 | if (this.messageUpdateRequests[id]) { 32 | this.messageUpdateRequests[id] = MessageUpdateRequestStatus.Requested 33 | // Release lock 34 | updateLock.signal() 35 | return 36 | } 37 | this.messageUpdateRequests[id] = MessageUpdateRequestStatus.Occupied 38 | // Release lock 39 | updateLock.signal() 40 | do { 41 | // If requested, change to occupied 42 | if ( 43 | this.messageUpdateRequests[id] === MessageUpdateRequestStatus.Requested 44 | ) { 45 | this.messageUpdateRequests[id] = MessageUpdateRequestStatus.Occupied 46 | } 47 | // Use the updater function 48 | await tryReport(updater instanceof Function ? updater() : updater) 49 | // Release the locks 50 | if ( 51 | this.messageUpdateRequests[id] !== MessageUpdateRequestStatus.Requested 52 | ) { 53 | this.messageUpdateRequests[id] = MessageUpdateRequestStatus.Empty 54 | } 55 | } while ( 56 | this.messageUpdateRequests[id] === MessageUpdateRequestStatus.Requested 57 | ) 58 | } 59 | } 60 | -------------------------------------------------------------------------------- /src/commands/language.ts: -------------------------------------------------------------------------------- 1 | // Dependencies 2 | import { Telegraf, ContextMessageUpdate, Markup as m, Extra } from 'telegraf' 3 | import { readdirSync, readFileSync } from 'fs' 4 | import { safeLoad } from 'js-yaml' 5 | import { ExtraEditMessage } from 'telegraf/typings/telegram-types' 6 | import { checkLock } from '../middlewares/checkLock' 7 | import { tryReport } from '../helpers/tryReport' 8 | 9 | export function setupLanguage(bot: Telegraf) { 10 | bot.command('language', checkLock, async ctx => { 11 | await ctx.reply(ctx.i18n.t('language'), { 12 | reply_markup: languageKeyboard(), 13 | }) 14 | }) 15 | 16 | bot.action(localesFiles().map(file => file.split('.')[0]), async ctx => { 17 | let user = ctx.dbuser 18 | user.language = ctx.callbackQuery.data 19 | user = await user.save() 20 | const message = ctx.callbackQuery.message 21 | ctx.i18n.locale(ctx.callbackQuery.data) 22 | await tryReport( 23 | ctx.telegram.editMessageText( 24 | message.chat.id, 25 | message.message_id, 26 | undefined, 27 | ctx.i18n.t('language_selected'), 28 | Extra.HTML(true) as ExtraEditMessage 29 | ) 30 | ) 31 | }) 32 | } 33 | 34 | function languageKeyboard() { 35 | const locales = localesFiles() 36 | const result = [] 37 | locales.forEach((locale, index) => { 38 | const localeCode = locale.split('.')[0] 39 | const localeName = safeLoad( 40 | readFileSync(`${__dirname}/../../locales/${locale}`, 'utf8') 41 | ).name 42 | if (index % 2 == 0) { 43 | if (index === 0) { 44 | result.push([m.callbackButton(localeName, localeCode)]) 45 | } else { 46 | result[result.length - 1].push(m.callbackButton(localeName, localeCode)) 47 | } 48 | } else { 49 | result[result.length - 1].push(m.callbackButton(localeName, localeCode)) 50 | if (index < locales.length - 1) { 51 | result.push([]) 52 | } 53 | } 54 | }) 55 | return m.inlineKeyboard(result) 56 | } 57 | 58 | function localesFiles() { 59 | return readdirSync(`${__dirname}/../../locales`) 60 | } 61 | -------------------------------------------------------------------------------- /src/commands/leaderboard.ts: -------------------------------------------------------------------------------- 1 | // Dependencies 2 | import { checkLock } from '../middlewares/checkLock' 3 | import { Telegraf, ContextMessageUpdate } from 'telegraf' 4 | import { UserModel } from '../models' 5 | import { getName, getNameWithLink } from '../helpers/name' 6 | import { format } from '../helpers/format' 7 | import { getUTCTime } from '../helpers/date' 8 | import { refreshInlineButton } from '../helpers/buttons' 9 | 10 | export function setupLeaderboard(bot: Telegraf) { 11 | bot.command('leaderboard', checkLock, async ctx => { 12 | await ctx.replyWithHTML( 13 | await leaderboardText(ctx), 14 | refreshInlineButton(ctx) 15 | ) 16 | }) 17 | bot.action('refresh', async ctx => { 18 | await ctx.editMessageText( 19 | await leaderboardText(ctx), 20 | refreshInlineButton(ctx) 21 | ) 22 | }) 23 | } 24 | 25 | async function leaderboardText(ctx: ContextMessageUpdate) { 26 | // Get stats 27 | const topUsers = await UserModel.find({ type: 'private' }) 28 | .sort({ balance: -1 }) 29 | .limit(10) 30 | const topChannels = await UserModel.find({ type: 'channel' }) 31 | .sort({ balance: -1 }) 32 | .limit(10) 33 | const topChats = await UserModel.find({ 34 | type: ['group', 'supergroup'], 35 | }) 36 | .sort({ balance: -1 }) 37 | .limit(10) 38 | let text = `${ctx.i18n.t('leaderboard', { 39 | players: topUsers.reduce( 40 | (prev, cur, i) => 41 | `${prev ? `${prev}\n` : prev}${i + 1}. ${ 42 | ctx.chat.type === 'private' 43 | ? getNameWithLink(cur.chat) 44 | : getName(cur.chat) 45 | } (${format(cur.balance)})`, 46 | '' 47 | ), 48 | chats: topChats.reduce( 49 | (prev, cur, i) => 50 | `${prev ? `${prev}\n` : prev}${i + 1}. ${getNameWithLink( 51 | cur.chat 52 | )} (${format(cur.balance)})`, 53 | '' 54 | ), 55 | channels: topChannels.reduce( 56 | (prev, cur, i) => 57 | `${prev ? `${prev}\n` : prev}${i + 1}. ${getNameWithLink( 58 | cur.chat 59 | )} (${format(cur.balance)})`, 60 | '' 61 | ), 62 | })}\n${ctx.i18n.t('updated', { time: getUTCTime() })}` 63 | if (ctx.chat.type === 'channel') { 64 | text = `${text} ${ctx.i18n.t('signature', { 65 | username: ctx.options.username, 66 | })}` 67 | } 68 | return text 69 | } 70 | -------------------------------------------------------------------------------- /src/commands/transfer.ts: -------------------------------------------------------------------------------- 1 | // Dependencies 2 | import { User, UserModel } from '../models/User' 3 | import { Telegraf, ContextMessageUpdate } from 'telegraf' 4 | import { InstanceType } from '@hasezoey/typegoose' 5 | import { getName } from '../helpers/name' 6 | import { checkLock } from '../middlewares/checkLock' 7 | 8 | export function setupTransfer(bot: Telegraf) { 9 | bot.command('transfer', checkLock, async ctx => { 10 | // Check if there is text 11 | if ( 12 | !(ctx.message || ctx.channelPost) || 13 | !(ctx.message || ctx.channelPost).text 14 | ) { 15 | return 16 | } 17 | const components = (ctx.message || ctx.channelPost).text.split(' ') 18 | if (components.length < 3) { 19 | return ctx.replyWithHTML(ctx.i18n.t('transfer_format_error')) 20 | } 21 | const recipientHandleOrID = components[1] 22 | // Get sender 23 | const sender = await UserModel.findOne({ id: ctx.from.id }) 24 | if (!sender) { 25 | return ctx.replyWithHTML( 26 | ctx.i18n.t('chat_not_found_error', { 27 | recipient: getName(ctx.from), 28 | }) 29 | ) 30 | } 31 | // Get recipient 32 | let recipient: InstanceType 33 | if (recipientHandleOrID.indexOf('@') > -1) { 34 | recipient = await UserModel.findOne({ 35 | username: recipientHandleOrID.substr(1).toLowerCase(), 36 | }) 37 | } else { 38 | recipient = await UserModel.findOne({ 39 | id: parseInt(recipientHandleOrID, 10), 40 | }) 41 | } 42 | if (!recipient) { 43 | return ctx.replyWithHTML( 44 | ctx.i18n.t('chat_not_found_error', { 45 | recipient: recipientHandleOrID, 46 | }) 47 | ) 48 | } 49 | const amount = parseInt(components[2], 10) 50 | // Check if amount is non-positive 51 | if (!amount || amount <= 0 || isNaN(amount)) { 52 | return 53 | } 54 | // Check balance 55 | if (sender.balance < amount) { 56 | return ctx.replyWithHTML( 57 | ctx.i18n.t('transfer_balance_error', { 58 | balance: sender.balance, 59 | amount, 60 | }) 61 | ) 62 | } 63 | // Transfer 64 | await UserModel.findOneAndUpdate( 65 | { id: sender.id }, 66 | { $inc: { balance: amount * -1 } } 67 | ) 68 | await UserModel.findOneAndUpdate( 69 | { id: recipient.id }, 70 | { $inc: { balance: amount } } 71 | ) 72 | // Reply with success 73 | await ctx.replyWithHTML( 74 | ctx.i18n.t('transfer_success', { 75 | amount, 76 | sender: getName(sender.chat), 77 | recipient: getName(recipient.chat), 78 | }) 79 | ) 80 | }) 81 | } 82 | -------------------------------------------------------------------------------- /src/commands/mine.ts: -------------------------------------------------------------------------------- 1 | // Dependencies 2 | import { MessageUpdater } from '../helpers/MessageUpdater' 3 | import { checkLock } from '../middlewares/checkLock' 4 | import { Telegraf, ContextMessageUpdate } from 'telegraf' 5 | import Semaphore from 'semaphore-async-await' 6 | import { UserModel } from '../models' 7 | import { getName } from '../helpers/name' 8 | import { format } from '../helpers/format' 9 | import { getUTCTime } from '../helpers/date' 10 | import { tryReport } from '../helpers/tryReport' 11 | import { mineButtonExtraInline } from '../helpers/buttons' 12 | 13 | const mineAmount = 1 14 | 15 | const messageUpdater = new MessageUpdater() 16 | 17 | export function setupMine(bot: Telegraf) { 18 | bot.command('mine', checkLock, async ctx => { 19 | // Send inline button 20 | await ctx.replyWithHTML( 21 | await mineText(ctx), 22 | mineButtonExtraInline(ctx, mineAmount) 23 | ) 24 | }) 25 | bot.action('mine', async ctx => { 26 | // Answer right away 27 | await tryReport(ctx.answerCbQuery()) 28 | // Try adding coins 29 | ctx.dbuser = await UserModel.findOneAndUpdate( 30 | { id: ctx.dbuser.id }, 31 | { $inc: { balance: mineAmount } } 32 | ) 33 | // Try updating balance message 34 | messageUpdater.update( 35 | `${ctx.chat.id}-${ctx.callbackQuery.message.message_id}`, 36 | async () => { 37 | await updateMessage(ctx) 38 | } 39 | ) 40 | }) 41 | } 42 | 43 | async function updateMessage(ctx: ContextMessageUpdate) { 44 | // Update message 45 | ctx.dbuser = await UserModel.findOne({ id: ctx.dbuser.id }) 46 | const text = await mineText(ctx) 47 | const extra = mineButtonExtraInline(ctx, mineAmount) 48 | await ctx.editMessageText(text, extra) 49 | } 50 | 51 | async function mineText(ctx: ContextMessageUpdate) { 52 | const position = format( 53 | (await UserModel.find({ 54 | id: { $ne: ctx.chat.id }, 55 | type: ctx.dbuser.type, 56 | balance: { $gt: ctx.dbuser.balance }, 57 | }).countDocuments()) + 1 58 | ) 59 | const overallCount = format( 60 | await UserModel.find({ 61 | id: { $ne: ctx.chat.id }, 62 | type: ctx.dbuser.type, 63 | }).countDocuments() 64 | ) 65 | const isPrivate = ctx.chat.type === 'private' 66 | const name = getName(ctx.dbuser.chat) 67 | 68 | let text = `${ctx.i18n.t(isPrivate ? 'mine_personal' : 'mine_group', { 69 | name, 70 | balance: format(ctx.dbuser.balance), 71 | cps: 0, 72 | position: `${position}/${overallCount}`, 73 | })}` 74 | text = `${text}\n${ctx.i18n.t('updated', { time: getUTCTime() })}` 75 | if (ctx.chat.type === 'channel') { 76 | text = `${text} ${ctx.i18n.t('signature', { 77 | username: ctx.options.username, 78 | })}` 79 | } 80 | return text 81 | } 82 | -------------------------------------------------------------------------------- /src/helpers/buttons.ts: -------------------------------------------------------------------------------- 1 | // Dependencies 2 | import { ContextMessageUpdate, Extra } from 'telegraf' 3 | import { InstanceType } from '@hasezoey/typegoose' 4 | import { Duel, DuelSide } from '../models' 5 | import randomEmoji = require('random-emoji') 6 | 7 | export function activeDuelInlineButton( 8 | ctx: ContextMessageUpdate, 9 | duel: InstanceType, 10 | side: DuelSide 11 | ) { 12 | const n = Math.floor(Math.random() * 6 + 1) 13 | return Extra.HTML() 14 | .webPreview(false) 15 | .markup(m => 16 | m.inlineKeyboard([ 17 | [ 18 | duelButton(m, ctx, n !== 1, duel, side), 19 | duelButton(m, ctx, n !== 2, duel, side), 20 | ], 21 | [ 22 | duelButton(m, ctx, n !== 3, duel, side), 23 | duelButton(m, ctx, n !== 4, duel, side), 24 | ], 25 | [ 26 | duelButton(m, ctx, n !== 5, duel, side), 27 | duelButton(m, ctx, n !== 6, duel, side), 28 | ], 29 | ]) 30 | ) 31 | } 32 | 33 | export function confirmDuelInlineButton( 34 | ctx: ContextMessageUpdate, 35 | duel: InstanceType 36 | ) { 37 | return Extra.HTML() 38 | .webPreview(false) 39 | .markup(m => 40 | m.inlineKeyboard([ 41 | m.callbackButton(ctx.i18n.t('attack'), `attack~${duel.id}`), 42 | m.callbackButton(ctx.i18n.t('cancel'), `cancel~${duel.id}`), 43 | ]) 44 | ) 45 | } 46 | 47 | export function requestDuelInlineButton( 48 | ctx: ContextMessageUpdate, 49 | duel: InstanceType 50 | ) { 51 | return Extra.HTML() 52 | .webPreview(false) 53 | .markup(m => 54 | m.inlineKeyboard([ 55 | m.callbackButton(ctx.i18n.t('fight'), `fight~${duel.id}`), 56 | m.callbackButton(ctx.i18n.t('flee'), `flee~${duel.id}`), 57 | ]) 58 | ) 59 | } 60 | 61 | export function refreshInlineButton(ctx: ContextMessageUpdate) { 62 | return Extra.HTML() 63 | .webPreview(false) 64 | .markup(m => 65 | m.inlineKeyboard([m.callbackButton(ctx.i18n.t('refresh'), 'refresh')]) 66 | ) 67 | } 68 | 69 | export function mineButtonExtraInline(ctx, amount) { 70 | const n = Math.floor(Math.random() * 6 + 1) 71 | return Extra.HTML().markup(m => 72 | m.inlineKeyboard([ 73 | [ 74 | mineButton(m, ctx, amount, n !== 1), 75 | mineButton(m, ctx, amount, n !== 2), 76 | ], 77 | [ 78 | mineButton(m, ctx, amount, n !== 3), 79 | mineButton(m, ctx, amount, n !== 4), 80 | ], 81 | [ 82 | mineButton(m, ctx, amount, n !== 5), 83 | mineButton(m, ctx, amount, n !== 6), 84 | ], 85 | ]) 86 | ) 87 | } 88 | 89 | function mineButton(m, ctx: ContextMessageUpdate, amount, isDud: boolean) { 90 | return m.callbackButton( 91 | isDud 92 | ? randomEmoji.random({ count: 1 })[0].character 93 | : ctx.i18n.t('mine_button', { amount }), 94 | isDud ? 'dud' : 'mine' 95 | ) 96 | } 97 | 98 | function duelButton(m, ctx: ContextMessageUpdate, isDud: boolean, duel, side) { 99 | return m.callbackButton( 100 | isDud 101 | ? randomEmoji.random({ count: 1 })[0].character 102 | : ctx.i18n.t('duel_action'), 103 | isDud ? 'dud' : `duel~${duel.id}~${side}` 104 | ) 105 | } 106 | -------------------------------------------------------------------------------- /src/helpers/checkDuel.ts: -------------------------------------------------------------------------------- 1 | // Dependencies 2 | import { User, DuelModel, DuelState } from '../models' 3 | import { ContextMessageUpdate } from 'telegraf' 4 | import { getName } from './name' 5 | import { tryReport } from './tryReport' 6 | 7 | export async function checkDuel( 8 | attacker: User, 9 | defender: User, 10 | ctx: ContextMessageUpdate 11 | ) { 12 | // Check if it's the same person 13 | if (attacker.id === defender.id) { 14 | await tryReport(ctx.replyWithHTML(ctx.i18n.t('duel_self_error'))) 15 | return false 16 | } 17 | // Check balance 18 | if (attacker.balance < 1000) { 19 | await tryReport(ctx.replyWithHTML(ctx.i18n.t('duel_balance_error'))) 20 | return false 21 | } 22 | // Check if defender is channel 23 | if (defender.type === 'channel') { 24 | await tryReport(ctx.replyWithHTML(ctx.i18n.t('duel_channel_error'))) 25 | return false 26 | } 27 | // Check defender duel mode 28 | if (!defender.duelsOn) { 29 | await tryReport( 30 | ctx.replyWithHTML( 31 | ctx.i18n.t('duel_off_error', { 32 | defender: getName(defender.chat), 33 | }) 34 | ) 35 | ) 36 | return false 37 | } 38 | // Check if attacker is in duel now as attacker 39 | const activeAttackDuel = await DuelModel.findOne({ 40 | attacker, 41 | state: DuelState.active, 42 | }).populate('attacker defender') 43 | if (activeAttackDuel) { 44 | await tryReport( 45 | ctx.replyWithHTML( 46 | ctx.i18n.t('active_duel_error', { 47 | attacker: getName(attacker.chat), 48 | defender: getName(activeAttackDuel.defender.chat), 49 | }) 50 | ) 51 | ) 52 | return false 53 | } 54 | // Check if attacker is in duel now as defender 55 | const activeDefendDuel = await DuelModel.findOne({ 56 | defender: attacker, 57 | state: DuelState.active, 58 | }).populate('attacker defender') 59 | if (activeDefendDuel) { 60 | await tryReport( 61 | ctx.replyWithHTML( 62 | ctx.i18n.t('active_duel_error', { 63 | attacker: getName(activeDefendDuel.attacker.chat), 64 | defender: getName(attacker.chat), 65 | }) 66 | ) 67 | ) 68 | return false 69 | } 70 | // Check if defender is in duel now as attacker 71 | const activeAttackDuelDefender = await DuelModel.findOne({ 72 | attacker: defender, 73 | state: DuelState.active, 74 | }).populate('attacker defender') 75 | if (activeAttackDuelDefender) { 76 | await tryReport( 77 | ctx.replyWithHTML( 78 | ctx.i18n.t('active_duel_error', { 79 | attacker: getName(defender.chat), 80 | defender: getName(activeAttackDuelDefender.defender.chat), 81 | }) 82 | ) 83 | ) 84 | return false 85 | } 86 | // Check if attacker is in duel now as defender 87 | const activeDefendDuelDefender = await DuelModel.findOne({ 88 | defender, 89 | state: DuelState.active, 90 | }).populate('attacker defender') 91 | if (activeDefendDuelDefender) { 92 | await tryReport( 93 | ctx.replyWithHTML( 94 | ctx.i18n.t('active_duel_error', { 95 | attacker: getName(activeDefendDuelDefender.attacker.chat), 96 | defender: getName(defender.chat), 97 | }) 98 | ) 99 | ) 100 | return false 101 | } 102 | // Check if request has been sent too early 103 | const pastRequest = await DuelModel.findOne({ 104 | defenderId: defender.id, 105 | attackerId: attacker.id, 106 | state: { $in: [DuelState.requested, DuelState.cancelled] }, 107 | }) 108 | .sort({ createdAt: -1 }) 109 | .populate('attacker defender') 110 | if ( 111 | pastRequest && 112 | (pastRequest.createdAt.getTime() - Date.now()) / 1000 < 60 * 60 * 1000 113 | ) { 114 | await tryReport(ctx.replyWithHTML(ctx.i18n.t('duel_request_early_error'))) 115 | return false 116 | } 117 | // Success 118 | return true 119 | } 120 | -------------------------------------------------------------------------------- /locales/en.yaml: -------------------------------------------------------------------------------- 1 | name: English 2 | help: | 3 | TLGCoin is a simple and fun Telegram-wide game. Compete with friends, transfer TLGCoin to other players for good deeds, fight for the first place in the top players and chats lists! Show them how it's done! 4 | 5 | /help — this message 6 | /language — change language 7 | /leaderboard — top chats and players 8 | /transfer — share your TLGCoins with other players, chats and channels 9 | /duel — duel for TLGCoins 10 | /duelMode — toggle duel mode on and off 11 | /lock — answer only to admins or to anyone 12 | /attackerAnonimity — hide or show duel attacker's link (useful to avoid spam) 13 | /stats — overall users stats 14 | /mine — start mining TLGCoins! 15 | 16 | Address all questions to @borodutch_support. Telegram ID for this chat is ${id}. 17 | 18 | Do you want to support the bot's author? I wrote a scientific book about how to live healthier and happier! You can buy it on Amazon — amazon.com/dp/B0CHL7WRYM or on the book's website — wdlaty.com. Thank you! 19 | language: Please, select the language. 20 | language_selected: Bot now speaks English. 21 | mine_personal: | 22 | • ${name}, you have ${balance} TLG 23 | • Your position in the top rating is ${position} 24 | 25 | Press button below to mine more and update this message! 26 | mine_group: | 27 | ${name} stats 28 | 29 | • Balance: ${balance} TLG 30 | • Position in the top rating: ${position} 31 | 32 | Press button below to mine more and update this message! 33 | mine_button: Mine ${amount} TLG! 34 | leaderboard: | 35 | 🏆 Top players 🏆 36 | 37 | ${players} 38 | 39 | 🔥 Top chats 🔥 40 | 41 | ${chats} 42 | 43 | 📣 Top channels 📣 44 | 45 | ${channels} 46 | updated: Updated ${time} 47 | signature: — @${username} 48 | transfer_format_error: Please, specify who should receive TLGCoins and how many TLGCoins to send in the form of either /transfer @borodutch 100 or /transfer 76104711 100; where first comes the command, then the recipient (handle or ID) and then the amount. You can learn chat's Telegram ID in /help. 49 | chat_not_found_error: Chat ${recipient} could not be found. Try sending them link to @tlgcoin_bot and ask them to start the chat with the bot. 50 | transfer_balance_error: Sorry, you don't have enough TLGCoins to complete the transfer of ${amount} TLGCoins. Your balance is ${balance} TLGCoins. 51 | transfer_success: Successfully transfered ${amount} TLGCoins from ${sender} to ${recipient}. 52 | refresh: Refresh 53 | duel_format_error: Please, specify the chat that you want to duel in the form of either /duel @borodutch or /duel 76104711; where first comes the command, then the chat (handle or ID) that you want to duel. You can learn chat's Telegram ID in /help. 54 | duel_balance_error: Sorry, you don't have enough TLGCoins to duel. You should have at least 1000 TLGCoins. 55 | duel_self_error: You cannot duel yourselves. 56 | only_admins_error: Only admins can do this. 57 | active_duel_error: ${attacker} is already dueling ${defender}. 58 | duel_request_early_error: You can only request a duel once an hour. 59 | duels_on: Duel mode is now active in this chat — you can be attacked! 60 | duels_off: Duel mode is now disabled in this chat — you cannot be attacked. 61 | duel_channel_error: You cannot request duels from channels. 62 | duel_confirm: | 63 | Are you sure that ${attacker} (${attackerBalance} TLGCoins) wants to request a duel from ${defender} (${defenderBalance} TLGCoins)? 64 | 65 | The rules are simple: whoever gets the most clicks in 10 minutes will get 20% of the other's TLGCoins. 66 | attack: Attack! 67 | cancel: Cancel 68 | duel_off_error: ${defender} chat doesn't have duel mode on. 69 | duel_cancelled: Duel cancelled. 70 | duel_requested: Duel between ${attacker} and ${defender} has been requested. Awaiting answer from ${defender}. 71 | duel_request: | 72 | ${attacker} (${type} — ${attackerBalance} TLGCoins) has challenged ${defender} (${defenderBalance} TLGCoins) to a duel! Would you like to fight back and try winning their precious TLGCoins? 73 | 74 | The rules are simple: whoever gets the most clicks in 10 minutes will get 20% of the other's TLGCoins. 75 | fight: Fight! 76 | flee: Flee 77 | defender_fled: Unfortunately, ${defender} fled, so no duel happened this time. 78 | flee_success: Fled successfully. 79 | active_duel: | 80 | Duel between ${attacker} and ${defender} 81 | 82 | ${duelers} 83 | 84 | Press the button below — who will have the most clicks by the end of the duel will take 20% of the loser's TLGCoins! 85 | 86 | Duel will end: ${duelEndTime} 87 | duel_action: Do a click! 88 | duel_not_found: Duel not found. 89 | fight_message: Let the duel begin! 90 | duel_finished: Duel finished. 91 | duel_finished_message: | 92 | Duel between ${attacker} and ${defender} has finished. 93 | 94 | ${duelers} 95 | 96 | ${winner} won ${amount} TLGCoins and they've been transferred from ${looser}. Thank you for the fair duel! 97 | duel_finished_message_tie: | 98 | Duel between ${attacker} and ${defender} has finished in a tie. Nobody won, nobody lost. 99 | 100 | ${duelers} 101 | 102 | Thank you for the fair duel! 103 | lock_on: Bot will only respond to admin commands. 104 | lock_off: Bot will respond commands sent by anyone. 105 | attacker_anonimity_on: Bot will anonimize who attacks you. 106 | attacker_anonimity_off: Bot will tell you who attacks you. 107 | anonymous_fighters: Anonymous fighters 108 | channel: channel 109 | group: group 110 | supergroup: supergroup 111 | private: person 112 | dud_message: It's a dud! Try the correct button. 113 | stats: | 114 | 🔥 Users number: ${count}, total TLGCoins mined: ${total} 115 | -------------------------------------------------------------------------------- /locales/ru.yaml: -------------------------------------------------------------------------------- 1 | name: Русский 2 | help: | 3 | ТЛГКоин — это простая и веселая игра-кликер для всего Телеграма. Соревнуйтесь с друзьями, переводите друг другу ТЛГКоины за хорошие поступки, сражайтесь за первое место в топе чатов и отдельных игроков по количеству ТЛГКоинов! Покажите всем, где раки зимуют! 4 | 5 | /help — это сообщение 6 | /language — сменить язык 7 | /leaderboard — топ чатов и игроков 8 | /transfer — поделитесь ТЛГКоинами с другими игроками, чатами или каналами 9 | /duel — сражайтесь за ТЛГКоины 10 | /duelMode — включить или выключить режим дуэли 11 | /lock — отвечать на команды, посланные только админами или любыми участниками 12 | /attackerAnonimity — показать или скрыть имя атакующего (ограничивает спам) 13 | /stats — статистика по всем пользователям 14 | /mine — начать майнить ТЛГКоины! 15 | 16 | По всем вопросам на @borodutch_support. ID Телеграма этого чата — ${id}. 17 | 18 | Хотите поддержать автора бота? Я написал научную книгу о том, как жить здоровее и счастливее! Купить ее можно на Амазоне — amazon.com/dp/B0CHL7WRYM или на сайте книги — wdlaty.com. Спасибо! 19 | language: Пожалуйста, выберите язык. 20 | language_selected: Бот теперь говорит по-русски. 21 | mine_personal: | 22 | • ${name}, у вас ${balance} ТЛГ 23 | • Ваша позиция в топ-рейтинге ${position} 24 | 25 | Нажмите на кнопку ниже, чтобы обновить это сообщение и получить еще ТЛГ! 26 | mine_group: | 27 | Статистика ${name} 28 | 29 | • Баланс: ${balance} ТЛГ 30 | • Позиция в топ-рейтинге: ${position} 31 | 32 | Нажмите на кнопку ниже, чтобы обновить это сообщение и получить еще ТЛГ! 33 | mine_button: Создать ${amount} ТЛГ! 34 | leaderboard: | 35 | 🏆 Топ игроков 🏆 36 | 37 | ${players} 38 | 39 | 🔥 Топ чатов 🔥 40 | 41 | ${chats} 42 | 43 | 📣 Топ каналов 📣 44 | 45 | ${channels} 46 | updated: Обновлено ${time} 47 | signature: — @${username} 48 | transfer_format_error: Пожалуйста, укажите, кто должен получить ТЛГКоины и как много ТЛГКоинов перевести в формате либо /transfer @borodutch 100, либо /transfer 76104711 100; где сначала идет команда, потом получатель (хендл или ID) и потом сумма перевода. Вы можете узнать ID Телеграма для чата в /help. 49 | chat_not_found_error: Чат ${recipient} не найден. Попробуйте послать им ссылку на @tlgcoin_bot и попросить начать чат с ботом. 50 | transfer_balance_error: Простите, но у вас недостаточно ТЛГКоинов для перевода ${amount} ТЛГКоинов. Ваш баланс ${balance} ТЛГКоинов. 51 | transfer_success: Успешно переведено ${amount} ТЛГКоинов от ${sender} к ${recipient}. 52 | refresh: Обновить 53 | duel_format_error: Пожалуйста, укажите чат, с которым вы хотите вступить в дуэль в формате либо /duel @borodutch, либо /duel 76104711; где сначала идет команада, а потом чат (хендл или ID), с которым вы хотите сразиться. Вы можете узнать ID Телеграма для чата в /help. 54 | duel_balance_error: Простите, но у вас недостаточно ТЛГКоинов для сражения. У вас должно быть минимум 1000 ТЛГКоинов. 55 | duel_self_error: Вы не можете сразиться сами с собой. 56 | only_admins_error: Только админы могут это сделать. 57 | active_duel_error: ${attacker} уже сражается с ${defender}. 58 | duel_request_early_error: Запрашивать дуэль можно максимум раз в час. 59 | duels_on: Режим дуэлей теперь включен в этом чате — вас могут атаковать! 60 | duels_off: Режим дуэли теперь выключен в этом чате — вас не смогут атаковать. 61 | duel_channel_error: Нельзя вызывать каналы на дуэль. 62 | duel_confirm: | 63 | Вы уверены, что ${attacker} (${attackerBalance} ТЛГКоинов) хочет атаковать ${defender} (${defenderBalance} ТЛГКоинов)? 64 | 65 | Правила просты: кто накликает больше за 10 минут, получит 20% ТЛГКоинов проигравшего. 66 | attack: Атаковать! 67 | cancel: Отменить 68 | duel_off_error: У чата ${defender} отключены дуэли. 69 | duel_cancelled: Дуэль отменена. 70 | duel_requested: Дуэль между ${attacker} и ${defender} запрошена. Ждем ответа от ${defender}. 71 | duel_request: | 72 | ${attacker} (${type} — ${attackerBalance} ТЛГКоинов) запросили дуэль с ${defender} (${defenderBalance} ТЛГКоинов)! Ответите на вызов и попробуете выиграть их ненаглядные ТЛГКоины? 73 | 74 | Правила просты: кто накликает больше за 10 минут, получит 20% ТЛГКоинов проигравшего. 75 | fight: Сразиться! 76 | flee: Убежать 77 | defender_fled: К сожалению, ${defender} сбежали, так что никакой дуэли в этот раз не было. 78 | flee_success: Успшено убежали. 79 | active_duel: | 80 | Дуэль ${attacker} против ${defender} 81 | 82 | ${duelers} 83 | 84 | Жмите на кнопку ниже — у кого будет больше кликов, тот и заберет 20% всех ТЛГКоинов проигравшего! 85 | 86 | Дуэль закончится: ${duelEndTime} 87 | duel_action: Сделать клик! 88 | duel_not_found: Дуэль не найдена. 89 | fight_message: Да начнется дуэль! 90 | duel_finished: Дуэль закончилась. 91 | duel_finished_message: | 92 | Дуэль ${attacker} против ${defender} завершена. 93 | 94 | ${duelers} 95 | 96 | ${winner} выиграли ${amount} ТЛГКоинов, которые были переведены от ${looser}. Спасибо за честную дуэль! 97 | duel_finished_message_tie: | 98 | Дуэль ${attacker} против ${defender} завершилась ничьей. Никто не победил, никто не проиграл. 99 | 100 | ${duelers} 101 | 102 | Спасибо за честную дуэль! 103 | lock_on: Бот будет отвечать только админам. 104 | lock_off: Бот будет отвечать всем. 105 | attacker_anonimity_on: Бот будет анонимизировать имя атакующего. 106 | attacker_anonimity_off: Бот будет говорить имя атакующего. 107 | anonymous_fighters: Анонимные агрессоры 108 | channel: канал 109 | group: группа 110 | supergroup: супергруппа 111 | private: человек 112 | dud_message: Это подделка! Попробуйте настоящую кнопку. 113 | stats: | 114 | 🔥 Количество пользователей: ${count}, ТЛГКоинов намайнено: ${total} 115 | -------------------------------------------------------------------------------- /src/helpers/duelChecker.ts: -------------------------------------------------------------------------------- 1 | // Dependencies 2 | import { UserModel } from '../models/User' 3 | import { Telegraf, ContextMessageUpdate, Extra } from 'telegraf' 4 | import { DuelState, DuelModel } from '../models/Duel' 5 | import { messageUpdater } from '../commands/duel' 6 | import { ExtraEditMessage } from 'telegraf/typings/telegram-types' 7 | import { getName } from './name' 8 | import { format } from './format' 9 | import I18N from 'telegraf-i18n' 10 | import { getUTCTime } from './date' 11 | import { tryReport } from './tryReport' 12 | 13 | const dirtyI18N = require('telegraf-i18n') 14 | 15 | let isChecking = false 16 | 17 | let bot: Telegraf 18 | 19 | export async function startCheckingDuels( 20 | newBot: Telegraf 21 | ) { 22 | bot = newBot 23 | setInterval(async () => { 24 | if (isChecking) { 25 | return 26 | } 27 | isChecking = true 28 | await tryReport(checkDuels()) 29 | isChecking = false 30 | }, 10 * 1000) 31 | } 32 | 33 | async function checkDuels() { 34 | const duels = await DuelModel.find({ state: DuelState.active }).populate( 35 | 'attacker defender' 36 | ) 37 | for (const duel of duels) { 38 | if (duel.endDate && duel.endDate.getTime() < Date.now()) { 39 | duel.state = DuelState.finished 40 | await duel.save() 41 | const isTie = duel.attackerBalance === duel.defenderBalance 42 | const attackerWon = duel.attackerBalance > duel.defenderBalance 43 | let amountWon = 0 44 | if (!isTie) { 45 | amountWon = attackerWon 46 | ? Math.floor(duel.defender.balance * 0.2) 47 | : Math.floor(duel.attacker.balance * 0.2) 48 | await UserModel.findOneAndUpdate( 49 | { id: duel.defenderId }, 50 | { $inc: { balance: amountWon * (attackerWon ? -1 : 1) } } 51 | ) 52 | await UserModel.findOneAndUpdate( 53 | { id: duel.attackerId }, 54 | { $inc: { balance: amountWon * (attackerWon ? 1 : -1) } } 55 | ) 56 | } 57 | // Wait until message updates are over 58 | await messageUpdater.waitWhenUpdatesAreOver(duel.id) 59 | // Get text 60 | const duelers = 61 | duel.attackerBalance > duel.defenderBalance 62 | ? `(${format(duel.attackerBalance)}) ${getName( 63 | duel.attacker.chat 64 | )}\n(${format(duel.defenderBalance)}) ${getName( 65 | duel.defender.chat 66 | )}` 67 | : `(${format(duel.defenderBalance)}) ${getName( 68 | duel.defender.chat 69 | )}\n(${format(duel.attackerBalance)}) ${getName( 70 | duel.attacker.chat 71 | )}` 72 | const i18n = ((new dirtyI18N({ 73 | directory: `${__dirname}/../../locales`, 74 | defaultLanguage: 'en', 75 | sessionName: 'session', 76 | useSession: false, 77 | allowMissing: false, 78 | }) as I18N).createContext(duel.attacker.language, {}) as any) as I18N 79 | // Update messages 80 | if (isTie) { 81 | i18n.locale(duel.attacker.language) 82 | let text = `${i18n.t('duel_finished_message_tie', { 83 | attacker: getName(duel.attacker.chat), 84 | defender: getName(duel.defender.chat), 85 | duelers, 86 | })}\n${i18n.t('updated', { time: getUTCTime() })}` 87 | if (duel.attacker.chat.type === 'channel') { 88 | text = `${text} ${i18n.t('signature', { 89 | username: bot.options.username, 90 | })}` 91 | } 92 | await tryReport( 93 | bot.telegram.editMessageText( 94 | duel.attackerMessage.chat.id, 95 | duel.attackerMessage.message_id, 96 | undefined, 97 | text, 98 | Extra.HTML() as ExtraEditMessage 99 | ) 100 | ) 101 | i18n.locale(duel.defender.language) 102 | text = `${i18n.t('duel_finished_message', { 103 | attacker: getName(duel.attacker.chat), 104 | defender: getName(duel.defender.chat), 105 | duelers, 106 | })}\n${i18n.t('updated', { time: getUTCTime() })}` 107 | if (duel.defender.chat.type === 'channel') { 108 | text = `${text} ${i18n.t('signature', { 109 | username: bot.options.username, 110 | })}` 111 | } 112 | await tryReport( 113 | bot.telegram.editMessageText( 114 | duel.defenderMessage.chat.id, 115 | duel.defenderMessage.message_id, 116 | undefined, 117 | text, 118 | Extra.HTML() as ExtraEditMessage 119 | ) 120 | ) 121 | } else { 122 | i18n.locale(duel.attacker.language) 123 | let text = `${i18n.t('duel_finished_message', { 124 | attacker: getName(duel.attacker.chat), 125 | defender: getName(duel.defender.chat), 126 | duelers, 127 | winner: attackerWon 128 | ? getName(duel.attacker.chat) 129 | : getName(duel.defender.chat), 130 | looser: attackerWon 131 | ? getName(duel.defender.chat) 132 | : getName(duel.attacker.chat), 133 | amount: format(amountWon), 134 | })}\n${i18n.t('updated', { time: getUTCTime() })}` 135 | if (duel.attacker.chat.type === 'channel') { 136 | text = `${text} ${i18n.t('signature', { 137 | username: bot.options.username, 138 | })}` 139 | } 140 | await tryReport( 141 | bot.telegram.editMessageText( 142 | duel.attackerMessage.chat.id, 143 | duel.attackerMessage.message_id, 144 | undefined, 145 | text, 146 | Extra.HTML() as ExtraEditMessage 147 | ) 148 | ) 149 | i18n.locale(duel.defender.language) 150 | text = `${i18n.t('duel_finished_message', { 151 | attacker: getName(duel.attacker.chat), 152 | defender: getName(duel.defender.chat), 153 | duelers, 154 | winner: attackerWon 155 | ? getName(duel.attacker.chat) 156 | : getName(duel.defender.chat), 157 | looser: attackerWon 158 | ? getName(duel.defender.chat) 159 | : getName(duel.attacker.chat), 160 | amount: format(amountWon), 161 | })}\n${i18n.t('updated', { time: getUTCTime() })}` 162 | if (duel.defender.chat.type === 'channel') { 163 | text = `${text} ${i18n.t('signature', { 164 | username: bot.options.username, 165 | })}` 166 | } 167 | await tryReport( 168 | bot.telegram.editMessageText( 169 | duel.defenderMessage.chat.id, 170 | duel.defenderMessage.message_id, 171 | undefined, 172 | text, 173 | Extra.HTML() as ExtraEditMessage 174 | ) 175 | ) 176 | } 177 | } 178 | } 179 | } 180 | -------------------------------------------------------------------------------- /src/commands/duel.ts: -------------------------------------------------------------------------------- 1 | // Dependencies 2 | import { MessageUpdater } from '../helpers/MessageUpdater' 3 | import { format } from '../helpers/format' 4 | import { Telegraf, ContextMessageUpdate, Extra } from 'telegraf' 5 | import Semaphore from 'semaphore-async-await' 6 | import { InstanceType } from '@hasezoey/typegoose' 7 | import { DuelModel, DuelState, Duel, DuelSide } from '../models/Duel' 8 | import { getName, getNameWithLink } from '../helpers/name' 9 | import { ExtraEditMessage } from 'telegraf/typings/telegram-types' 10 | import { getUTCTime, getUTCDate, dateMinutesAfterNow } from '../helpers/date' 11 | import { checkLock, checkIfAdminCB } from '../middlewares/checkLock' 12 | import { attachDuelToCB } from '../middlewares/attachDuel' 13 | import { checkDuel } from '../helpers/checkDuel' 14 | import { getAttackerDefender } from '../helpers/getAttackerDefender' 15 | import { tryReport } from '../helpers/tryReport' 16 | import { 17 | confirmDuelInlineButton, 18 | requestDuelInlineButton, 19 | activeDuelInlineButton, 20 | } from '../helpers/buttons' 21 | 22 | const duelLock = new Semaphore(1) 23 | export const messageUpdater = new MessageUpdater() 24 | 25 | export function setupDuel(bot: Telegraf) { 26 | bot.command('duel', checkLock, async ctx => { 27 | // Lock semaphore 28 | await duelLock.wait() 29 | // Try setting up duel 30 | await tryReport(async () => { 31 | // Get players 32 | const players = await getAttackerDefender(ctx) 33 | if (!players) { 34 | return 35 | } 36 | const { attacker, defender } = players 37 | // Check duel 38 | if (!(await checkDuel(attacker, defender, ctx))) { 39 | return 40 | } 41 | // Create request 42 | let duel = await new DuelModel({ 43 | attacker, 44 | attackerId: attacker.id, 45 | defender, 46 | defenderId: defender.id, 47 | }).save() 48 | // Confirm with attacker 49 | duel.attackerMessage = await ctx.telegram.sendMessage( 50 | attacker.id, 51 | ctx.i18n.t('duel_confirm', { 52 | attacker: getName(attacker.chat), 53 | defender: getName(defender.chat), 54 | attackerBalance: format(attacker.balance), 55 | defenderBalance: format(defender.balance), 56 | }), 57 | confirmDuelInlineButton(ctx, duel) 58 | ) 59 | // Save duel 60 | await duel.save() 61 | }) 62 | // Unlock semaphore 63 | duelLock.signal() 64 | }) 65 | 66 | bot.action(/attack.+/g, checkIfAdminCB, attachDuelToCB, async ctx => { 67 | const duel = ctx.duel 68 | // Change state 69 | duel.state = DuelState.requested 70 | // Send request to defender 71 | ctx.i18n.locale(duel.defender.language) 72 | const attackerName = duel.defender.attackerAnonimity 73 | ? `${ctx.i18n.t('anonymous_fighters')}` 74 | : getNameWithLink(duel.attacker.chat) 75 | duel.defenderMessage = await tryReport( 76 | ctx.telegram.sendMessage( 77 | duel.defender.id, 78 | ctx.i18n.t('duel_request', { 79 | attacker: attackerName, 80 | defender: getName(duel.defender.chat), 81 | attackerBalance: format(duel.attacker.balance), 82 | defenderBalance: format(duel.defender.balance), 83 | type: ctx.i18n.t(duel.attacker.type), 84 | }), 85 | requestDuelInlineButton(ctx, duel) 86 | ) 87 | ) 88 | // Save duel 89 | await duel.save() 90 | // Update message for attacker 91 | ctx.i18n.locale(duel.attacker.language) 92 | await tryReport( 93 | ctx.editMessageText( 94 | ctx.i18n.t('duel_requested', { 95 | attacker: getName(duel.attacker.chat), 96 | defender: getName(duel.defender.chat), 97 | }), 98 | Extra.HTML() as ExtraEditMessage 99 | ) 100 | ) 101 | // Finish callback query 102 | await ctx.answerCbQuery() 103 | }) 104 | 105 | bot.action(/cancel.+/g, checkIfAdminCB, attachDuelToCB, async ctx => { 106 | // Remove duel 107 | await ctx.duel.remove() 108 | // Edit message 109 | await tryReport(ctx.deleteMessage()) 110 | // Answer callback query 111 | await ctx.answerCbQuery(ctx.i18n.t('duel_cancelled')) 112 | }) 113 | 114 | bot.action(/flee.+/g, checkIfAdminCB, attachDuelToCB, async ctx => { 115 | const duel = ctx.duel 116 | // Update attacker message 117 | ctx.i18n.locale(duel.attacker.language) 118 | await tryReport( 119 | ctx.telegram.editMessageText( 120 | duel.attackerMessage.chat.id, 121 | duel.attackerMessage.message_id, 122 | undefined, 123 | ctx.i18n.t('defender_fled', { 124 | defender: getName(duel.defender.chat), 125 | }), 126 | Extra.HTML() as ExtraEditMessage 127 | ) 128 | ) 129 | // Cancel duel 130 | duel.state = DuelState.cancelled 131 | await duel.save() 132 | // Edit message 133 | await tryReport(ctx.deleteMessage()) 134 | // Answer callback query 135 | ctx.i18n.locale(duel.defender.language) 136 | await ctx.answerCbQuery(ctx.i18n.t('flee_success')) 137 | }) 138 | 139 | bot.action(/fight.+/g, checkIfAdminCB, attachDuelToCB, async ctx => { 140 | const duel = ctx.duel 141 | // Update the state 142 | duel.state = DuelState.active 143 | duel.endDate = dateMinutesAfterNow(10) 144 | await duel.save() 145 | // Update attacker message 146 | ctx.i18n.locale(duel.attacker.language) 147 | await tryReport( 148 | ctx.telegram.editMessageText( 149 | duel.attackerMessage.chat.id, 150 | duel.attackerMessage.message_id, 151 | undefined, 152 | activeDuelText(duel, ctx), 153 | activeDuelInlineButton(ctx, duel, DuelSide.attacker) 154 | ) 155 | ) 156 | // Update defender message 157 | ctx.i18n.locale(duel.defender.language) 158 | await tryReport( 159 | ctx.editMessageText( 160 | activeDuelText(duel, ctx), 161 | activeDuelInlineButton(ctx, duel, DuelSide.defender) 162 | ) 163 | ) 164 | await ctx.answerCbQuery(ctx.i18n.t('fight_message')) 165 | }) 166 | 167 | bot.action(/duel.+/, attachDuelToCB, async ctx => { 168 | const duel = ctx.duel 169 | if (duel.state !== DuelState.active) { 170 | return ctx.answerCbQuery(ctx.i18n.t('duel_finished')) 171 | } 172 | // Get options 173 | const options = ctx.callbackQuery.data.split('~') 174 | // Answer callback query right away 175 | await tryReport(ctx.answerCbQuery()) 176 | // Get if attacker or defender 177 | const side = `${parseInt(options[2], 10)}` as DuelSide 178 | // Increment the right side 179 | if (side === DuelSide.attacker) { 180 | await DuelModel.findOneAndUpdate( 181 | { _id: duel.id, state: DuelState.active }, 182 | { $inc: { attackerBalance: 1 } } 183 | ) 184 | } else { 185 | await DuelModel.findOneAndUpdate( 186 | { _id: duel.id, state: DuelState.active }, 187 | { $inc: { defenderBalance: 1 } } 188 | ) 189 | } 190 | messageUpdater.update(duel.id, async () => { 191 | await updateMessages(ctx, duel) 192 | }) 193 | }) 194 | } 195 | 196 | function activeDuelText(duel: InstanceType, ctx: ContextMessageUpdate) { 197 | const duelers = 198 | duel.attackerBalance > duel.defenderBalance 199 | ? `(${format(duel.attackerBalance)}) ${getName( 200 | duel.attacker.chat 201 | )}\n(${format(duel.defenderBalance)}) ${getName( 202 | duel.defender.chat 203 | )}` 204 | : `(${format(duel.defenderBalance)}) ${getName( 205 | duel.defender.chat 206 | )}\n(${format(duel.attackerBalance)}) ${getName( 207 | duel.attacker.chat 208 | )}` 209 | let text = `${ctx.i18n.t('active_duel', { 210 | attacker: getName(duel.attacker.chat), 211 | defender: getName(duel.defender.chat), 212 | duelers, 213 | duelEndTime: `${getUTCDate(duel.endDate)} ${getUTCTime(duel.endDate)}`, 214 | })}\n${ctx.i18n.t('updated', { time: getUTCTime() })}` 215 | if (ctx.chat.type === 'channel') { 216 | text = `${text} ${ctx.i18n.t('signature', { 217 | username: ctx.options.username, 218 | })}` 219 | } 220 | return text 221 | } 222 | 223 | async function updateMessages( 224 | ctx: ContextMessageUpdate, 225 | duel: InstanceType 226 | ) { 227 | // Get fresh duel 228 | duel = await DuelModel.findOne({ _id: duel.id }).populate('attacker defender') 229 | // Update attacker message 230 | ctx.i18n.locale(duel.attacker.language) 231 | await tryReport( 232 | ctx.telegram.editMessageText( 233 | duel.attackerMessage.chat.id, 234 | duel.attackerMessage.message_id, 235 | undefined, 236 | activeDuelText(duel, ctx), 237 | activeDuelInlineButton(ctx, duel, DuelSide.attacker) 238 | ) 239 | ) 240 | // Update defender message 241 | ctx.i18n.locale(duel.defender.language) 242 | await tryReport( 243 | ctx.telegram.editMessageText( 244 | duel.defenderMessage.chat.id, 245 | duel.defenderMessage.message_id, 246 | undefined, 247 | activeDuelText(duel, ctx), 248 | activeDuelInlineButton(ctx, duel, DuelSide.defender) 249 | ) 250 | ) 251 | } 252 | -------------------------------------------------------------------------------- /yarn.lock: -------------------------------------------------------------------------------- 1 | # THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY. 2 | # yarn lockfile v1 3 | 4 | 5 | "@hasezoey/typegoose@^5.9.2": 6 | version "5.9.2" 7 | resolved "https://registry.yarnpkg.com/@hasezoey/typegoose/-/typegoose-5.9.2.tgz#10e949ba04da61156416448f9d5990794dd15fd3" 8 | integrity sha512-PwbOGJi9IggUF8E2K3fEHSEoBgXV3nlDd1H6m/rjC9iWG1GeKHAp9gp0SPZh3e/5rJ3vWbfWbyukD/pMT3tbxA== 9 | dependencies: 10 | reflect-metadata "^0.1.13" 11 | 12 | "@types/bson@*": 13 | version "4.0.0" 14 | resolved "https://registry.yarnpkg.com/@types/bson/-/bson-4.0.0.tgz#9073772679d749116eb1dfca56f8eaac6d59cc7a" 15 | integrity sha512-pq/rqJwJWkbS10crsG5bgnrisL8pML79KlMKQMoQwLUjlPAkrUHMvHJ3oGwE7WHR61Lv/nadMwXVAD2b+fpD8Q== 16 | dependencies: 17 | "@types/node" "*" 18 | 19 | "@types/dotenv@^6.1.1": 20 | version "6.1.1" 21 | resolved "https://registry.yarnpkg.com/@types/dotenv/-/dotenv-6.1.1.tgz#f7ce1cc4fe34f0a4373ba99fefa437b0bec54b46" 22 | integrity sha512-ftQl3DtBvqHl9L16tpqqzA4YzCSXZfi7g8cQceTz5rOlYtk/IZbFjAv3mLOQlNIgOaylCQWQoBdDQHPgEBJPHg== 23 | dependencies: 24 | "@types/node" "*" 25 | 26 | "@types/js-yaml@^3.12.1": 27 | version "3.12.1" 28 | resolved "https://registry.yarnpkg.com/@types/js-yaml/-/js-yaml-3.12.1.tgz#5c6f4a1eabca84792fbd916f0cb40847f123c656" 29 | integrity sha512-SGGAhXLHDx+PK4YLNcNGa6goPf9XRWQNAUUbffkwVGGXIxmDKWyGGL4inzq2sPmExu431Ekb9aEMn9BkPqEYFA== 30 | 31 | "@types/mongodb@*": 32 | version "3.3.1" 33 | resolved "https://registry.yarnpkg.com/@types/mongodb/-/mongodb-3.3.1.tgz#9569ffcb356fbb5313ae2d3afa88c230bf8cf0d1" 34 | integrity sha512-Va7o1fN3zeabmIJSQ6yuAWkqPvrT38HSTIi4YbVOb2UL7FJ4diXrWt+OUuuEFWAVPtF9VZV5h+7LDYdzgXWgQA== 35 | dependencies: 36 | "@types/bson" "*" 37 | "@types/node" "*" 38 | 39 | "@types/mongoose@^5.5.17": 40 | version "5.5.17" 41 | resolved "https://registry.yarnpkg.com/@types/mongoose/-/mongoose-5.5.17.tgz#1f8eb3799368ae266758d2df1bd1a7cfca0f6875" 42 | integrity sha512-Nv7Fmun31np7YpNw9s2Aib+bqErDeO2QQZgtl4zUJSwY4Fyp+UDYV/nWANEbKMFU0fkQ3aNbnkODziL1YtSdbg== 43 | dependencies: 44 | "@types/mongodb" "*" 45 | "@types/node" "*" 46 | 47 | "@types/node@*", "@types/node@^12.0.4", "@types/node@^12.7.5": 48 | version "12.7.5" 49 | resolved "https://registry.yarnpkg.com/@types/node/-/node-12.7.5.tgz#e19436e7f8e9b4601005d73673b6dc4784ffcc2f" 50 | integrity sha512-9fq4jZVhPNW8r+UYKnxF1e2HkDWOWKM5bC2/7c9wPV835I0aOrVbS/Hw/pWPk2uKrNXQqg9Z959Kz+IYDd5p3w== 51 | 52 | abbrev@1: 53 | version "1.1.1" 54 | resolved "https://registry.yarnpkg.com/abbrev/-/abbrev-1.1.1.tgz#f8f2c887ad10bf67f634f005b6987fed3179aac8" 55 | integrity sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q== 56 | 57 | ansi-align@^2.0.0: 58 | version "2.0.0" 59 | resolved "https://registry.yarnpkg.com/ansi-align/-/ansi-align-2.0.0.tgz#c36aeccba563b89ceb556f3690f0b1d9e3547f7f" 60 | integrity sha1-w2rsy6VjuJzrVW82kPCx2eNUf38= 61 | dependencies: 62 | string-width "^2.0.0" 63 | 64 | ansi-regex@^2.0.0: 65 | version "2.1.1" 66 | resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-2.1.1.tgz#c3b33ab5ee360d86e0e628f0468ae7ef27d654df" 67 | integrity sha1-w7M6te42DYbg5ijwRorn7yfWVN8= 68 | 69 | ansi-regex@^3.0.0: 70 | version "3.0.0" 71 | resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-3.0.0.tgz#ed0317c322064f79466c02966bddb605ab37d998" 72 | integrity sha1-7QMXwyIGT3lGbAKWa922Bas32Zg= 73 | 74 | ansi-styles@^3.2.1: 75 | version "3.2.1" 76 | resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-3.2.1.tgz#41fbb20243e50b12be0f04b8dedbf07520ce841d" 77 | integrity sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA== 78 | dependencies: 79 | color-convert "^1.9.0" 80 | 81 | anymatch@^2.0.0: 82 | version "2.0.0" 83 | resolved "https://registry.yarnpkg.com/anymatch/-/anymatch-2.0.0.tgz#bcb24b4f37934d9aa7ac17b4adaf89e7c76ef2eb" 84 | integrity sha512-5teOsQWABXHHBFP9y3skS5P3d/WfWXpv3FUpy+LorMrNYaT9pI4oLMQX7jzQ2KklNpGpWHzdCXTDT2Y3XGlZBw== 85 | dependencies: 86 | micromatch "^3.1.4" 87 | normalize-path "^2.1.1" 88 | 89 | aproba@^1.0.3: 90 | version "1.2.0" 91 | resolved "https://registry.yarnpkg.com/aproba/-/aproba-1.2.0.tgz#6802e6264efd18c790a1b0d517f0f2627bf2c94a" 92 | integrity sha512-Y9J6ZjXtoYh8RnXVCMOU/ttDmk1aBjunq9vO0ta5x85WDQiQfUF9sIPBITdbiiIVcBo03Hi3jMxigBtsddlXRw== 93 | 94 | are-we-there-yet@~1.1.2: 95 | version "1.1.5" 96 | resolved "https://registry.yarnpkg.com/are-we-there-yet/-/are-we-there-yet-1.1.5.tgz#4b35c2944f062a8bfcda66410760350fe9ddfc21" 97 | integrity sha512-5hYdAkZlcG8tOLujVDTgCT+uPX0VnpAH28gWsLfzpXYm7wP6mp5Q/gYyR7YQ0cKVJcXJnl3j2kpBan13PtQf6w== 98 | dependencies: 99 | delegates "^1.0.0" 100 | readable-stream "^2.0.6" 101 | 102 | argparse@^1.0.7: 103 | version "1.0.10" 104 | resolved "https://registry.yarnpkg.com/argparse/-/argparse-1.0.10.tgz#bcd6791ea5ae09725e17e5ad988134cd40b3d911" 105 | integrity sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg== 106 | dependencies: 107 | sprintf-js "~1.0.2" 108 | 109 | arr-diff@^4.0.0: 110 | version "4.0.0" 111 | resolved "https://registry.yarnpkg.com/arr-diff/-/arr-diff-4.0.0.tgz#d6461074febfec71e7e15235761a329a5dc7c520" 112 | integrity sha1-1kYQdP6/7HHn4VI1dhoyml3HxSA= 113 | 114 | arr-flatten@^1.1.0: 115 | version "1.1.0" 116 | resolved "https://registry.yarnpkg.com/arr-flatten/-/arr-flatten-1.1.0.tgz#36048bbff4e7b47e136644316c99669ea5ae91f1" 117 | integrity sha512-L3hKV5R/p5o81R7O02IGnwpDmkp6E982XhtbuwSe3O4qOtMMMtodicASA1Cny2U+aCXcNpml+m4dPsvsJ3jatg== 118 | 119 | arr-union@^3.1.0: 120 | version "3.1.0" 121 | resolved "https://registry.yarnpkg.com/arr-union/-/arr-union-3.1.0.tgz#e39b09aea9def866a8f206e288af63919bae39c4" 122 | integrity sha1-45sJrqne+Gao8gbiiK9jkZuuOcQ= 123 | 124 | array-unique@^0.3.2: 125 | version "0.3.2" 126 | resolved "https://registry.yarnpkg.com/array-unique/-/array-unique-0.3.2.tgz#a894b75d4bc4f6cd679ef3244a9fd8f46ae2d428" 127 | integrity sha1-qJS3XUvE9s1nnvMkSp/Y9Gri1Cg= 128 | 129 | assign-symbols@^1.0.0: 130 | version "1.0.0" 131 | resolved "https://registry.yarnpkg.com/assign-symbols/-/assign-symbols-1.0.0.tgz#59667f41fadd4f20ccbc2bb96b8d4f7f78ec0367" 132 | integrity sha1-WWZ/QfrdTyDMvCu5a41Pf3jsA2c= 133 | 134 | async-each@^1.0.1: 135 | version "1.0.3" 136 | resolved "https://registry.yarnpkg.com/async-each/-/async-each-1.0.3.tgz#b727dbf87d7651602f06f4d4ac387f47d91b0cbf" 137 | integrity sha512-z/WhQ5FPySLdvREByI2vZiTWwCnF0moMJ1hK9YQwDTHKh6I7/uSckMetoRGb5UBZPC1z0jlw+n/XCgjeH7y1AQ== 138 | 139 | async@2.6.2: 140 | version "2.6.2" 141 | resolved "https://registry.yarnpkg.com/async/-/async-2.6.2.tgz#18330ea7e6e313887f5d2f2a904bac6fe4dd5381" 142 | integrity sha512-H1qVYh1MYhEEFLsP97cVKqCGo7KfCyTt6uEWqsTBr9SO84oK9Uwbyd/yCW+6rKJLHksBNUVWZDAjfS+Ccx0Bbg== 143 | dependencies: 144 | lodash "^4.17.11" 145 | 146 | atob@^2.1.1: 147 | version "2.1.2" 148 | resolved "https://registry.yarnpkg.com/atob/-/atob-2.1.2.tgz#6d9517eb9e030d2436666651e86bd9f6f13533c9" 149 | integrity sha512-Wm6ukoaOGJi/73p/cl2GvLjTI5JM1k/O14isD73YML8StrH/7/lRFgmg8nICZgD3bZZvjwCGxtMOD3wWNAu8cg== 150 | 151 | balanced-match@^1.0.0: 152 | version "1.0.0" 153 | resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.0.tgz#89b4d199ab2bee49de164ea02b89ce462d71b767" 154 | integrity sha1-ibTRmasr7kneFk6gK4nORi1xt2c= 155 | 156 | base@^0.11.1: 157 | version "0.11.2" 158 | resolved "https://registry.yarnpkg.com/base/-/base-0.11.2.tgz#7bde5ced145b6d551a90db87f83c558b4eb48a8f" 159 | integrity sha512-5T6P4xPgpp0YDFvSWwEZ4NoE3aM4QBQXDzmVbraCkFj8zHM+mba8SyqB5DbZWyR7mYHo6Y7BdQo3MoA4m0TeQg== 160 | dependencies: 161 | cache-base "^1.0.1" 162 | class-utils "^0.3.5" 163 | component-emitter "^1.2.1" 164 | define-property "^1.0.0" 165 | isobject "^3.0.1" 166 | mixin-deep "^1.2.0" 167 | pascalcase "^0.1.1" 168 | 169 | binary-extensions@^1.0.0: 170 | version "1.13.1" 171 | resolved "https://registry.yarnpkg.com/binary-extensions/-/binary-extensions-1.13.1.tgz#598afe54755b2868a5330d2aff9d4ebb53209b65" 172 | integrity sha512-Un7MIEDdUC5gNpcGDV97op1Ywk748MpHcFTHoYs6qnj1Z3j7I53VG3nwZhKzoBZmbdRNnb6WRdFlwl7tSDuZGw== 173 | 174 | bluebird@3.5.1: 175 | version "3.5.1" 176 | resolved "https://registry.yarnpkg.com/bluebird/-/bluebird-3.5.1.tgz#d9551f9de98f1fcda1e683d17ee91a0602ee2eb9" 177 | integrity sha512-MKiLiV+I1AA596t9w1sQJ8jkiSr5+ZKi0WKrYGUn6d1Fx+Ij4tIj+m2WMQSGczs5jZVxV339chE8iwk6F64wjA== 178 | 179 | boxen@^1.2.1: 180 | version "1.3.0" 181 | resolved "https://registry.yarnpkg.com/boxen/-/boxen-1.3.0.tgz#55c6c39a8ba58d9c61ad22cd877532deb665a20b" 182 | integrity sha512-TNPjfTr432qx7yOjQyaXm3dSR0MH9vXp7eT1BFSl/C51g+EFnOR9hTg1IreahGBmDNCehscshe45f+C1TBZbLw== 183 | dependencies: 184 | ansi-align "^2.0.0" 185 | camelcase "^4.0.0" 186 | chalk "^2.0.1" 187 | cli-boxes "^1.0.0" 188 | string-width "^2.0.0" 189 | term-size "^1.2.0" 190 | widest-line "^2.0.0" 191 | 192 | brace-expansion@^1.1.7: 193 | version "1.1.11" 194 | resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-1.1.11.tgz#3c7fcbf529d87226f3d2f52b966ff5271eb441dd" 195 | integrity sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA== 196 | dependencies: 197 | balanced-match "^1.0.0" 198 | concat-map "0.0.1" 199 | 200 | braces@^2.3.1, braces@^2.3.2: 201 | version "2.3.2" 202 | resolved "https://registry.yarnpkg.com/braces/-/braces-2.3.2.tgz#5979fd3f14cd531565e5fa2df1abfff1dfaee729" 203 | integrity sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w== 204 | dependencies: 205 | arr-flatten "^1.1.0" 206 | array-unique "^0.3.2" 207 | extend-shallow "^2.0.1" 208 | fill-range "^4.0.0" 209 | isobject "^3.0.1" 210 | repeat-element "^1.1.2" 211 | snapdragon "^0.8.1" 212 | snapdragon-node "^2.0.1" 213 | split-string "^3.0.2" 214 | to-regex "^3.0.1" 215 | 216 | bson@^1.1.1, bson@~1.1.1: 217 | version "1.1.6" 218 | resolved "https://registry.yarnpkg.com/bson/-/bson-1.1.6.tgz#fb819be9a60cd677e0853aee4ca712a785d6618a" 219 | integrity sha512-EvVNVeGo4tHxwi8L6bPj3y3itEvStdwvvlojVxxbyYfoaxJ6keLgrTuKdyfEAszFK+H3olzBuafE0yoh0D1gdg== 220 | 221 | cache-base@^1.0.1: 222 | version "1.0.1" 223 | resolved "https://registry.yarnpkg.com/cache-base/-/cache-base-1.0.1.tgz#0a7f46416831c8b662ee36fe4e7c59d76f666ab2" 224 | integrity sha512-AKcdTnFSWATd5/GCPRxr2ChwIJ85CeyrEyjRHlKxQ56d4XJMGym0uAiKn0xbLOGOl3+yRpOTi484dVCEc5AUzQ== 225 | dependencies: 226 | collection-visit "^1.0.0" 227 | component-emitter "^1.2.1" 228 | get-value "^2.0.6" 229 | has-value "^1.0.0" 230 | isobject "^3.0.1" 231 | set-value "^2.0.0" 232 | to-object-path "^0.3.0" 233 | union-value "^1.0.0" 234 | unset-value "^1.0.0" 235 | 236 | camelcase@^4.0.0: 237 | version "4.1.0" 238 | resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-4.1.0.tgz#d545635be1e33c542649c69173e5de6acfae34dd" 239 | integrity sha1-1UVjW+HjPFQmScaRc+Xeas+uNN0= 240 | 241 | camelcase@^5.0.0: 242 | version "5.3.1" 243 | resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-5.3.1.tgz#e3c9b31569e106811df242f715725a1f4c494320" 244 | integrity sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg== 245 | 246 | capture-stack-trace@^1.0.0: 247 | version "1.0.1" 248 | resolved "https://registry.yarnpkg.com/capture-stack-trace/-/capture-stack-trace-1.0.1.tgz#a6c0bbe1f38f3aa0b92238ecb6ff42c344d4135d" 249 | integrity sha512-mYQLZnx5Qt1JgB1WEiMCf2647plpGeQ2NMR/5L0HNZzGQo4fuSPnK+wjfPnKZV0aiJDgzmWqqkV/g7JD+DW0qw== 250 | 251 | chalk@^2.0.1, chalk@^2.4.2: 252 | version "2.4.2" 253 | resolved "https://registry.yarnpkg.com/chalk/-/chalk-2.4.2.tgz#cd42541677a54333cf541a49108c1432b44c9424" 254 | integrity sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ== 255 | dependencies: 256 | ansi-styles "^3.2.1" 257 | escape-string-regexp "^1.0.5" 258 | supports-color "^5.3.0" 259 | 260 | chokidar@^2.1.5: 261 | version "2.1.8" 262 | resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-2.1.8.tgz#804b3a7b6a99358c3c5c61e71d8728f041cff917" 263 | integrity sha512-ZmZUazfOzf0Nve7duiCKD23PFSCs4JPoYyccjUFF3aQkQadqBhfzhjkwBH2mNOG9cTBwhamM37EIsIkZw3nRgg== 264 | dependencies: 265 | anymatch "^2.0.0" 266 | async-each "^1.0.1" 267 | braces "^2.3.2" 268 | glob-parent "^3.1.0" 269 | inherits "^2.0.3" 270 | is-binary-path "^1.0.0" 271 | is-glob "^4.0.0" 272 | normalize-path "^3.0.0" 273 | path-is-absolute "^1.0.0" 274 | readdirp "^2.2.1" 275 | upath "^1.1.1" 276 | optionalDependencies: 277 | fsevents "^1.2.7" 278 | 279 | chownr@^1.1.4: 280 | version "1.1.4" 281 | resolved "https://registry.yarnpkg.com/chownr/-/chownr-1.1.4.tgz#6fc9d7b42d32a583596337666e7d08084da2cc6b" 282 | integrity sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg== 283 | 284 | ci-info@^1.5.0: 285 | version "1.6.0" 286 | resolved "https://registry.yarnpkg.com/ci-info/-/ci-info-1.6.0.tgz#2ca20dbb9ceb32d4524a683303313f0304b1e497" 287 | integrity sha512-vsGdkwSCDpWmP80ncATX7iea5DWQemg1UgCW5J8tqjU3lYw4FBYuj89J0CTVomA7BEfvSZd84GmHko+MxFQU2A== 288 | 289 | class-utils@^0.3.5: 290 | version "0.3.6" 291 | resolved "https://registry.yarnpkg.com/class-utils/-/class-utils-0.3.6.tgz#f93369ae8b9a7ce02fd41faad0ca83033190c463" 292 | integrity sha512-qOhPa/Fj7s6TY8H8esGu5QNpMMQxz79h+urzrNYN6mn+9BnxlDGf5QZ+XeCDsxSjPqsSR56XOZOJmpeurnLMeg== 293 | dependencies: 294 | arr-union "^3.1.0" 295 | define-property "^0.2.5" 296 | isobject "^3.0.0" 297 | static-extend "^0.1.1" 298 | 299 | cli-boxes@^1.0.0: 300 | version "1.0.0" 301 | resolved "https://registry.yarnpkg.com/cli-boxes/-/cli-boxes-1.0.0.tgz#4fa917c3e59c94a004cd61f8ee509da651687143" 302 | integrity sha1-T6kXw+WclKAEzWH47lCdplFocUM= 303 | 304 | cliui@^4.0.0: 305 | version "4.1.0" 306 | resolved "https://registry.yarnpkg.com/cliui/-/cliui-4.1.0.tgz#348422dbe82d800b3022eef4f6ac10bf2e4d1b49" 307 | integrity sha512-4FG+RSG9DL7uEwRUZXZn3SS34DiDPfzP0VOiEwtUWlE+AR2EIg+hSyvrIgUUfhdgR/UkAeW2QHgeP+hWrXs7jQ== 308 | dependencies: 309 | string-width "^2.1.1" 310 | strip-ansi "^4.0.0" 311 | wrap-ansi "^2.0.0" 312 | 313 | code-point-at@^1.0.0: 314 | version "1.1.0" 315 | resolved "https://registry.yarnpkg.com/code-point-at/-/code-point-at-1.1.0.tgz#0d070b4d043a5bea33a2f1a40e2edb3d9a4ccf77" 316 | integrity sha1-DQcLTQQ6W+ozovGkDi7bPZpMz3c= 317 | 318 | collection-visit@^1.0.0: 319 | version "1.0.0" 320 | resolved "https://registry.yarnpkg.com/collection-visit/-/collection-visit-1.0.0.tgz#4bc0373c164bc3291b4d368c829cf1a80a59dca0" 321 | integrity sha1-S8A3PBZLwykbTTaMgpzxqApZ3KA= 322 | dependencies: 323 | map-visit "^1.0.0" 324 | object-visit "^1.0.0" 325 | 326 | color-convert@^1.9.0: 327 | version "1.9.3" 328 | resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-1.9.3.tgz#bb71850690e1f136567de629d2d5471deda4c1e8" 329 | integrity sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg== 330 | dependencies: 331 | color-name "1.1.3" 332 | 333 | color-name@1.1.3: 334 | version "1.1.3" 335 | resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.3.tgz#a7d0558bd89c42f795dd42328f740831ca53bc25" 336 | integrity sha1-p9BVi9icQveV3UIyj3QIMcpTvCU= 337 | 338 | comma-number@^2.0.1: 339 | version "2.0.1" 340 | resolved "https://registry.yarnpkg.com/comma-number/-/comma-number-2.0.1.tgz#d01de3f207f00ccd593dcbcf17ac633bbb942b62" 341 | integrity sha512-hrxY6UjA+tSUV5uZS2iOF8+/q7AACiq/zc9R6SO61MmOhrzNC0qXXh7g/jNYTm09fp6T40vQg15zkCmTJVA8Ww== 342 | 343 | compile-template@^0.3.1: 344 | version "0.3.1" 345 | resolved "https://registry.yarnpkg.com/compile-template/-/compile-template-0.3.1.tgz#e581a08385c792609408d448187a5eaaf334b6b0" 346 | integrity sha512-5aB55cRApvy8zKPe9RrrLVysVpHafgp1IMvfGYQ8QnXrIsafYuj73yyIGYEHsslYoDxIs/XsM5wTIxICcwIKog== 347 | 348 | component-emitter@^1.2.1: 349 | version "1.3.0" 350 | resolved "https://registry.yarnpkg.com/component-emitter/-/component-emitter-1.3.0.tgz#16e4070fba8ae29b679f2215853ee181ab2eabc0" 351 | integrity sha512-Rd3se6QB+sO1TwqZjscQrurpEPIfO0/yYnSin6Q/rD3mOutHvUrCAhJub3r90uNb+SESBuE0QYoB90YdfatsRg== 352 | 353 | concat-map@0.0.1: 354 | version "0.0.1" 355 | resolved "https://registry.yarnpkg.com/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b" 356 | integrity sha1-2Klr13/Wjfd5OnMDajug1UBdR3s= 357 | 358 | concurrently@^4.1.2: 359 | version "4.1.2" 360 | resolved "https://registry.yarnpkg.com/concurrently/-/concurrently-4.1.2.tgz#1a683b2b5c41e9ed324c9002b9f6e4c6e1f3b6d7" 361 | integrity sha512-Kim9SFrNr2jd8/0yNYqDTFALzUX1tvimmwFWxmp/D4mRI+kbqIIwE2RkBDrxS2ic25O1UgQMI5AtBqdtX3ynYg== 362 | dependencies: 363 | chalk "^2.4.2" 364 | date-fns "^1.30.1" 365 | lodash "^4.17.15" 366 | read-pkg "^4.0.1" 367 | rxjs "^6.5.2" 368 | spawn-command "^0.0.2-1" 369 | supports-color "^4.5.0" 370 | tree-kill "^1.2.1" 371 | yargs "^12.0.5" 372 | 373 | configstore@^3.0.0: 374 | version "3.1.2" 375 | resolved "https://registry.yarnpkg.com/configstore/-/configstore-3.1.2.tgz#c6f25defaeef26df12dd33414b001fe81a543f8f" 376 | integrity sha512-vtv5HtGjcYUgFrXc6Kx747B83MRRVS5R1VTEQoXvuP+kMI+if6uywV0nDGoiydJRy4yk7h9od5Og0kxx4zUXmw== 377 | dependencies: 378 | dot-prop "^4.1.0" 379 | graceful-fs "^4.1.2" 380 | make-dir "^1.0.0" 381 | unique-string "^1.0.0" 382 | write-file-atomic "^2.0.0" 383 | xdg-basedir "^3.0.0" 384 | 385 | console-control-strings@^1.0.0, console-control-strings@~1.1.0: 386 | version "1.1.0" 387 | resolved "https://registry.yarnpkg.com/console-control-strings/-/console-control-strings-1.1.0.tgz#3d7cf4464db6446ea644bf4b39507f9851008e8e" 388 | integrity sha1-PXz0Rk22RG6mRL9LOVB/mFEAjo4= 389 | 390 | copy-descriptor@^0.1.0: 391 | version "0.1.1" 392 | resolved "https://registry.yarnpkg.com/copy-descriptor/-/copy-descriptor-0.1.1.tgz#676f6eb3c39997c2ee1ac3a924fd6124748f578d" 393 | integrity sha1-Z29us8OZl8LuGsOpJP1hJHSPV40= 394 | 395 | core-util-is@~1.0.0: 396 | version "1.0.2" 397 | resolved "https://registry.yarnpkg.com/core-util-is/-/core-util-is-1.0.2.tgz#b5fd54220aa2bc5ab57aab7140c940754503c1a7" 398 | integrity sha1-tf1UIgqivFq1eqtxQMlAdUUDwac= 399 | 400 | create-error-class@^3.0.0: 401 | version "3.0.2" 402 | resolved "https://registry.yarnpkg.com/create-error-class/-/create-error-class-3.0.2.tgz#06be7abef947a3f14a30fd610671d401bca8b7b6" 403 | integrity sha1-Br56vvlHo/FKMP1hBnHUAbyot7Y= 404 | dependencies: 405 | capture-stack-trace "^1.0.0" 406 | 407 | cross-spawn@^5.0.1: 408 | version "5.1.0" 409 | resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-5.1.0.tgz#e8bd0efee58fcff6f8f94510a0a554bbfa235449" 410 | integrity sha1-6L0O/uWPz/b4+UUQoKVUu/ojVEk= 411 | dependencies: 412 | lru-cache "^4.0.1" 413 | shebang-command "^1.2.0" 414 | which "^1.2.9" 415 | 416 | cross-spawn@^6.0.0: 417 | version "6.0.5" 418 | resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-6.0.5.tgz#4a5ec7c64dfae22c3a14124dbacdee846d80cbc4" 419 | integrity sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ== 420 | dependencies: 421 | nice-try "^1.0.4" 422 | path-key "^2.0.1" 423 | semver "^5.5.0" 424 | shebang-command "^1.2.0" 425 | which "^1.2.9" 426 | 427 | crypto-random-string@^1.0.0: 428 | version "1.0.0" 429 | resolved "https://registry.yarnpkg.com/crypto-random-string/-/crypto-random-string-1.0.0.tgz#a230f64f568310e1498009940790ec99545bca7e" 430 | integrity sha1-ojD2T1aDEOFJgAmUB5DsmVRbyn4= 431 | 432 | date-fns@^1.30.1: 433 | version "1.30.1" 434 | resolved "https://registry.yarnpkg.com/date-fns/-/date-fns-1.30.1.tgz#2e71bf0b119153dbb4cc4e88d9ea5acfb50dc05c" 435 | integrity sha512-hBSVCvSmWC+QypYObzwGOd9wqdDpOt+0wl0KbU+R+uuZBS1jN8VsD1ss3irQDknRj5NvxiTF6oj/nDRnN/UQNw== 436 | 437 | debug@3.1.0: 438 | version "3.1.0" 439 | resolved "https://registry.yarnpkg.com/debug/-/debug-3.1.0.tgz#5bb5a0672628b64149566ba16819e61518c67261" 440 | integrity sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g== 441 | dependencies: 442 | ms "2.0.0" 443 | 444 | debug@^2.2.0, debug@^2.3.3: 445 | version "2.6.9" 446 | resolved "https://registry.yarnpkg.com/debug/-/debug-2.6.9.tgz#5d128515df134ff327e90a4c93f4e077a536341f" 447 | integrity sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA== 448 | dependencies: 449 | ms "2.0.0" 450 | 451 | debug@^3.1.0, debug@^3.2.6: 452 | version "3.2.6" 453 | resolved "https://registry.yarnpkg.com/debug/-/debug-3.2.6.tgz#e83d17de16d8a7efb7717edbe5fb10135eee629b" 454 | integrity sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ== 455 | dependencies: 456 | ms "^2.1.1" 457 | 458 | debug@^4.0.1: 459 | version "4.1.1" 460 | resolved "https://registry.yarnpkg.com/debug/-/debug-4.1.1.tgz#3b72260255109c6b589cee050f1d516139664791" 461 | integrity sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw== 462 | dependencies: 463 | ms "^2.1.1" 464 | 465 | decamelize@^1.2.0: 466 | version "1.2.0" 467 | resolved "https://registry.yarnpkg.com/decamelize/-/decamelize-1.2.0.tgz#f6534d15148269b20352e7bee26f501f9a191290" 468 | integrity sha1-9lNNFRSCabIDUue+4m9QH5oZEpA= 469 | 470 | decode-uri-component@^0.2.0: 471 | version "0.2.0" 472 | resolved "https://registry.yarnpkg.com/decode-uri-component/-/decode-uri-component-0.2.0.tgz#eb3913333458775cb84cd1a1fae062106bb87545" 473 | integrity sha1-6zkTMzRYd1y4TNGh+uBiEGu4dUU= 474 | 475 | deep-extend@^0.6.0: 476 | version "0.6.0" 477 | resolved "https://registry.yarnpkg.com/deep-extend/-/deep-extend-0.6.0.tgz#c4fa7c95404a17a9c3e8ca7e1537312b736330ac" 478 | integrity sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA== 479 | 480 | define-property@^0.2.5: 481 | version "0.2.5" 482 | resolved "https://registry.yarnpkg.com/define-property/-/define-property-0.2.5.tgz#c35b1ef918ec3c990f9a5bc57be04aacec5c8116" 483 | integrity sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY= 484 | dependencies: 485 | is-descriptor "^0.1.0" 486 | 487 | define-property@^1.0.0: 488 | version "1.0.0" 489 | resolved "https://registry.yarnpkg.com/define-property/-/define-property-1.0.0.tgz#769ebaaf3f4a63aad3af9e8d304c9bbe79bfb0e6" 490 | integrity sha1-dp66rz9KY6rTr56NMEybvnm/sOY= 491 | dependencies: 492 | is-descriptor "^1.0.0" 493 | 494 | define-property@^2.0.2: 495 | version "2.0.2" 496 | resolved "https://registry.yarnpkg.com/define-property/-/define-property-2.0.2.tgz#d459689e8d654ba77e02a817f8710d702cb16e9d" 497 | integrity sha512-jwK2UV4cnPpbcG7+VRARKTZPUWowwXA8bzH5NP6ud0oeAxyYPuGZUAC7hMugpCdz4BeSZl2Dl9k66CHJ/46ZYQ== 498 | dependencies: 499 | is-descriptor "^1.0.2" 500 | isobject "^3.0.1" 501 | 502 | delegates@^1.0.0: 503 | version "1.0.0" 504 | resolved "https://registry.yarnpkg.com/delegates/-/delegates-1.0.0.tgz#84c6e159b81904fdca59a0ef44cd870d31250f9a" 505 | integrity sha1-hMbhWbgZBP3KWaDvRM2HDTElD5o= 506 | 507 | detect-libc@^1.0.2: 508 | version "1.0.3" 509 | resolved "https://registry.yarnpkg.com/detect-libc/-/detect-libc-1.0.3.tgz#fa137c4bd698edf55cd5cd02ac559f91a4c4ba9b" 510 | integrity sha1-+hN8S9aY7fVc1c0CrFWfkaTEups= 511 | 512 | dot-prop@^4.1.0: 513 | version "4.2.0" 514 | resolved "https://registry.yarnpkg.com/dot-prop/-/dot-prop-4.2.0.tgz#1f19e0c2e1aa0e32797c49799f2837ac6af69c57" 515 | integrity sha512-tUMXrxlExSW6U2EXiiKGSBVdYgtV8qlHL+C10TsW4PURY/ic+eaysnSkwB4kA/mBlCyy/IKDJ+Lc3wbWeaXtuQ== 516 | dependencies: 517 | is-obj "^1.0.0" 518 | 519 | dotenv@^8.1.0: 520 | version "8.1.0" 521 | resolved "https://registry.yarnpkg.com/dotenv/-/dotenv-8.1.0.tgz#d811e178652bfb8a1e593c6dd704ec7e90d85ea2" 522 | integrity sha512-GUE3gqcDCaMltj2++g6bRQ5rBJWtkWTmqmD0fo1RnnMuUqHNCt2oTPeDnS9n6fKYvlhn7AeBkb38lymBtWBQdA== 523 | 524 | duplexer3@^0.1.4: 525 | version "0.1.4" 526 | resolved "https://registry.yarnpkg.com/duplexer3/-/duplexer3-0.1.4.tgz#ee01dd1cac0ed3cbc7fdbea37dc0a8f1ce002ce2" 527 | integrity sha1-7gHdHKwO08vH/b6jfcCo8c4ALOI= 528 | 529 | emoji-named-characters@^1.0.2: 530 | version "1.0.2" 531 | resolved "https://registry.yarnpkg.com/emoji-named-characters/-/emoji-named-characters-1.0.2.tgz#cdeb36d0e66002c4b9d7bf1dfbc3a199fb7d409b" 532 | integrity sha1-zes20OZgAsS5178d+8Ohmft9QJs= 533 | 534 | end-of-stream@^1.1.0: 535 | version "1.4.1" 536 | resolved "https://registry.yarnpkg.com/end-of-stream/-/end-of-stream-1.4.1.tgz#ed29634d19baba463b6ce6b80a37213eab71ec43" 537 | integrity sha512-1MkrZNvWTKCaigbn+W15elq2BB/L22nqrSY5DKlo3X6+vclJm8Bb5djXJBmEX6fS3+zCh/F4VBK5Z2KxJt4s2Q== 538 | dependencies: 539 | once "^1.4.0" 540 | 541 | error-ex@^1.3.1: 542 | version "1.3.2" 543 | resolved "https://registry.yarnpkg.com/error-ex/-/error-ex-1.3.2.tgz#b4ac40648107fdcdcfae242f428bea8a14d4f1bf" 544 | integrity sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g== 545 | dependencies: 546 | is-arrayish "^0.2.1" 547 | 548 | escape-string-regexp@^1.0.5: 549 | version "1.0.5" 550 | resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz#1b61c0562190a8dff6ae3bb2cf0200ca130b86d4" 551 | integrity sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ= 552 | 553 | esprima@^4.0.0: 554 | version "4.0.1" 555 | resolved "https://registry.yarnpkg.com/esprima/-/esprima-4.0.1.tgz#13b04cdb3e6c5d19df91ab6987a8695619b0aa71" 556 | integrity sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A== 557 | 558 | execa@^0.7.0: 559 | version "0.7.0" 560 | resolved "https://registry.yarnpkg.com/execa/-/execa-0.7.0.tgz#944becd34cc41ee32a63a9faf27ad5a65fc59777" 561 | integrity sha1-lEvs00zEHuMqY6n68nrVpl/Fl3c= 562 | dependencies: 563 | cross-spawn "^5.0.1" 564 | get-stream "^3.0.0" 565 | is-stream "^1.1.0" 566 | npm-run-path "^2.0.0" 567 | p-finally "^1.0.0" 568 | signal-exit "^3.0.0" 569 | strip-eof "^1.0.0" 570 | 571 | execa@^1.0.0: 572 | version "1.0.0" 573 | resolved "https://registry.yarnpkg.com/execa/-/execa-1.0.0.tgz#c6236a5bb4df6d6f15e88e7f017798216749ddd8" 574 | integrity sha512-adbxcyWV46qiHyvSp50TKt05tB4tK3HcmF7/nxfAdhnox83seTDbwnaqKO4sXRy7roHAIFqJP/Rw/AuEbX61LA== 575 | dependencies: 576 | cross-spawn "^6.0.0" 577 | get-stream "^4.0.0" 578 | is-stream "^1.1.0" 579 | npm-run-path "^2.0.0" 580 | p-finally "^1.0.0" 581 | signal-exit "^3.0.0" 582 | strip-eof "^1.0.0" 583 | 584 | expand-brackets@^2.1.4: 585 | version "2.1.4" 586 | resolved "https://registry.yarnpkg.com/expand-brackets/-/expand-brackets-2.1.4.tgz#b77735e315ce30f6b6eff0f83b04151a22449622" 587 | integrity sha1-t3c14xXOMPa27/D4OwQVGiJEliI= 588 | dependencies: 589 | debug "^2.3.3" 590 | define-property "^0.2.5" 591 | extend-shallow "^2.0.1" 592 | posix-character-classes "^0.1.0" 593 | regex-not "^1.0.0" 594 | snapdragon "^0.8.1" 595 | to-regex "^3.0.1" 596 | 597 | extend-shallow@^2.0.1: 598 | version "2.0.1" 599 | resolved "https://registry.yarnpkg.com/extend-shallow/-/extend-shallow-2.0.1.tgz#51af7d614ad9a9f610ea1bafbb989d6b1c56890f" 600 | integrity sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8= 601 | dependencies: 602 | is-extendable "^0.1.0" 603 | 604 | extend-shallow@^3.0.0, extend-shallow@^3.0.2: 605 | version "3.0.2" 606 | resolved "https://registry.yarnpkg.com/extend-shallow/-/extend-shallow-3.0.2.tgz#26a71aaf073b39fb2127172746131c2704028db8" 607 | integrity sha1-Jqcarwc7OfshJxcnRhMcJwQCjbg= 608 | dependencies: 609 | assign-symbols "^1.0.0" 610 | is-extendable "^1.0.1" 611 | 612 | extglob@^2.0.4: 613 | version "2.0.4" 614 | resolved "https://registry.yarnpkg.com/extglob/-/extglob-2.0.4.tgz#ad00fe4dc612a9232e8718711dc5cb5ab0285543" 615 | integrity sha512-Nmb6QXkELsuBr24CJSkilo6UHHgbekK5UiZgfE6UHD3Eb27YC6oD+bhcT+tJ6cl8dmsgdQxnWlcry8ksBIBLpw== 616 | dependencies: 617 | array-unique "^0.3.2" 618 | define-property "^1.0.0" 619 | expand-brackets "^2.1.4" 620 | extend-shallow "^2.0.1" 621 | fragment-cache "^0.2.1" 622 | regex-not "^1.0.0" 623 | snapdragon "^0.8.1" 624 | to-regex "^3.0.1" 625 | 626 | fill-range@^4.0.0: 627 | version "4.0.0" 628 | resolved "https://registry.yarnpkg.com/fill-range/-/fill-range-4.0.0.tgz#d544811d428f98eb06a63dc402d2403c328c38f7" 629 | integrity sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc= 630 | dependencies: 631 | extend-shallow "^2.0.1" 632 | is-number "^3.0.0" 633 | repeat-string "^1.6.1" 634 | to-regex-range "^2.1.0" 635 | 636 | find-up@^3.0.0: 637 | version "3.0.0" 638 | resolved "https://registry.yarnpkg.com/find-up/-/find-up-3.0.0.tgz#49169f1d7993430646da61ecc5ae355c21c97b73" 639 | integrity sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg== 640 | dependencies: 641 | locate-path "^3.0.0" 642 | 643 | for-in@^1.0.2: 644 | version "1.0.2" 645 | resolved "https://registry.yarnpkg.com/for-in/-/for-in-1.0.2.tgz#81068d295a8142ec0ac726c6e2200c30fb6d5e80" 646 | integrity sha1-gQaNKVqBQuwKxybG4iAMMPttXoA= 647 | 648 | fragment-cache@^0.2.1: 649 | version "0.2.1" 650 | resolved "https://registry.yarnpkg.com/fragment-cache/-/fragment-cache-0.2.1.tgz#4290fad27f13e89be7f33799c6bc5a0abfff0d19" 651 | integrity sha1-QpD60n8T6Jvn8zeZxrxaCr//DRk= 652 | dependencies: 653 | map-cache "^0.2.2" 654 | 655 | fs-minipass@^1.2.7: 656 | version "1.2.7" 657 | resolved "https://registry.yarnpkg.com/fs-minipass/-/fs-minipass-1.2.7.tgz#ccff8570841e7fe4265693da88936c55aed7f7c7" 658 | integrity sha512-GWSSJGFy4e9GUeCcbIkED+bgAoFyj7XF1mV8rma3QW4NIqX9Kyx79N/PF61H5udOV3aY1IaMLs6pGbH71nlCTA== 659 | dependencies: 660 | minipass "^2.6.0" 661 | 662 | fs.realpath@^1.0.0: 663 | version "1.0.0" 664 | resolved "https://registry.yarnpkg.com/fs.realpath/-/fs.realpath-1.0.0.tgz#1504ad2523158caa40db4a2787cb01411994ea4f" 665 | integrity sha1-FQStJSMVjKpA20onh8sBQRmU6k8= 666 | 667 | fsevents@^1.2.7: 668 | version "1.2.9" 669 | resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-1.2.9.tgz#3f5ed66583ccd6f400b5a00db6f7e861363e388f" 670 | integrity sha512-oeyj2H3EjjonWcFjD5NvZNE9Rqe4UW+nQBU2HNeKw0koVLEFIhtyETyAakeAM3de7Z/SW5kcA+fZUait9EApnw== 671 | dependencies: 672 | nan "^2.12.1" 673 | node-pre-gyp "^0.12.0" 674 | 675 | gauge@~2.7.3: 676 | version "2.7.4" 677 | resolved "https://registry.yarnpkg.com/gauge/-/gauge-2.7.4.tgz#2c03405c7538c39d7eb37b317022e325fb018bf7" 678 | integrity sha1-LANAXHU4w51+s3sxcCLjJfsBi/c= 679 | dependencies: 680 | aproba "^1.0.3" 681 | console-control-strings "^1.0.0" 682 | has-unicode "^2.0.0" 683 | object-assign "^4.1.0" 684 | signal-exit "^3.0.0" 685 | string-width "^1.0.1" 686 | strip-ansi "^3.0.1" 687 | wide-align "^1.1.0" 688 | 689 | get-caller-file@^1.0.1: 690 | version "1.0.3" 691 | resolved "https://registry.yarnpkg.com/get-caller-file/-/get-caller-file-1.0.3.tgz#f978fa4c90d1dfe7ff2d6beda2a515e713bdcf4a" 692 | integrity sha512-3t6rVToeoZfYSGd8YoLFR2DJkiQrIiUrGcjvFX2mDw3bn6k2OtwHN0TNCLbBO+w8qTvimhDkv+LSscbJY1vE6w== 693 | 694 | get-stream@^3.0.0: 695 | version "3.0.0" 696 | resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-3.0.0.tgz#8e943d1358dc37555054ecbe2edb05aa174ede14" 697 | integrity sha1-jpQ9E1jcN1VQVOy+LtsFqhdO3hQ= 698 | 699 | get-stream@^4.0.0: 700 | version "4.1.0" 701 | resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-4.1.0.tgz#c1b255575f3dc21d59bfc79cd3d2b46b1c3a54b5" 702 | integrity sha512-GMat4EJ5161kIy2HevLlr4luNjBgvmj413KaQA7jt4V8B4RDsfpHk7WQ9GVqfYyyx8OS/L66Kox+rJRNklLK7w== 703 | dependencies: 704 | pump "^3.0.0" 705 | 706 | get-value@^2.0.3, get-value@^2.0.6: 707 | version "2.0.6" 708 | resolved "https://registry.yarnpkg.com/get-value/-/get-value-2.0.6.tgz#dc15ca1c672387ca76bd37ac0a395ba2042a2c28" 709 | integrity sha1-3BXKHGcjh8p2vTesCjlbogQqLCg= 710 | 711 | glob-parent@^3.1.0: 712 | version "3.1.0" 713 | resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-3.1.0.tgz#9e6af6299d8d3bd2bd40430832bd113df906c5ae" 714 | integrity sha1-nmr2KZ2NO9K9QEMIMr0RPfkGxa4= 715 | dependencies: 716 | is-glob "^3.1.0" 717 | path-dirname "^1.0.0" 718 | 719 | glob@^7.1.3: 720 | version "7.1.4" 721 | resolved "https://registry.yarnpkg.com/glob/-/glob-7.1.4.tgz#aa608a2f6c577ad357e1ae5a5c26d9a8d1969255" 722 | integrity sha512-hkLPepehmnKk41pUGm3sYxoFs/umurYfYJCerbXEyFIWcAzvpipAgVkBqqT9RBKMGjnq6kMuyYwha6csxbiM1A== 723 | dependencies: 724 | fs.realpath "^1.0.0" 725 | inflight "^1.0.4" 726 | inherits "2" 727 | minimatch "^3.0.4" 728 | once "^1.3.0" 729 | path-is-absolute "^1.0.0" 730 | 731 | global-dirs@^0.1.0: 732 | version "0.1.1" 733 | resolved "https://registry.yarnpkg.com/global-dirs/-/global-dirs-0.1.1.tgz#b319c0dd4607f353f3be9cca4c72fc148c49f445" 734 | integrity sha1-sxnA3UYH81PzvpzKTHL8FIxJ9EU= 735 | dependencies: 736 | ini "^1.3.4" 737 | 738 | got@^6.7.1: 739 | version "6.7.1" 740 | resolved "https://registry.yarnpkg.com/got/-/got-6.7.1.tgz#240cd05785a9a18e561dc1b44b41c763ef1e8db0" 741 | integrity sha1-JAzQV4WpoY5WHcG0S0HHY+8ejbA= 742 | dependencies: 743 | create-error-class "^3.0.0" 744 | duplexer3 "^0.1.4" 745 | get-stream "^3.0.0" 746 | is-redirect "^1.0.0" 747 | is-retry-allowed "^1.0.0" 748 | is-stream "^1.0.0" 749 | lowercase-keys "^1.0.0" 750 | safe-buffer "^5.0.1" 751 | timed-out "^4.0.0" 752 | unzip-response "^2.0.1" 753 | url-parse-lax "^1.0.0" 754 | 755 | graceful-fs@^4.1.11, graceful-fs@^4.1.2: 756 | version "4.2.2" 757 | resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.2.tgz#6f0952605d0140c1cfdb138ed005775b92d67b02" 758 | integrity sha512-IItsdsea19BoLC7ELy13q1iJFNmd7ofZH5+X/pJr90/nRoPEX0DJo1dHDbgtYWOhJhcCgMDTOw84RZ72q6lB+Q== 759 | 760 | has-flag@^2.0.0: 761 | version "2.0.0" 762 | resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-2.0.0.tgz#e8207af1cc7b30d446cc70b734b5e8be18f88d51" 763 | integrity sha1-6CB68cx7MNRGzHC3NLXovhj4jVE= 764 | 765 | has-flag@^3.0.0: 766 | version "3.0.0" 767 | resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-3.0.0.tgz#b5d454dc2199ae225699f3467e5a07f3b955bafd" 768 | integrity sha1-tdRU3CGZriJWmfNGfloH87lVuv0= 769 | 770 | has-unicode@^2.0.0: 771 | version "2.0.1" 772 | resolved "https://registry.yarnpkg.com/has-unicode/-/has-unicode-2.0.1.tgz#e0e6fe6a28cf51138855e086d1691e771de2a8b9" 773 | integrity sha1-4Ob+aijPUROIVeCG0Wkedx3iqLk= 774 | 775 | has-value@^0.3.1: 776 | version "0.3.1" 777 | resolved "https://registry.yarnpkg.com/has-value/-/has-value-0.3.1.tgz#7b1f58bada62ca827ec0a2078025654845995e1f" 778 | integrity sha1-ex9YutpiyoJ+wKIHgCVlSEWZXh8= 779 | dependencies: 780 | get-value "^2.0.3" 781 | has-values "^0.1.4" 782 | isobject "^2.0.0" 783 | 784 | has-value@^1.0.0: 785 | version "1.0.0" 786 | resolved "https://registry.yarnpkg.com/has-value/-/has-value-1.0.0.tgz#18b281da585b1c5c51def24c930ed29a0be6b177" 787 | integrity sha1-GLKB2lhbHFxR3vJMkw7SmgvmsXc= 788 | dependencies: 789 | get-value "^2.0.6" 790 | has-values "^1.0.0" 791 | isobject "^3.0.0" 792 | 793 | has-values@^0.1.4: 794 | version "0.1.4" 795 | resolved "https://registry.yarnpkg.com/has-values/-/has-values-0.1.4.tgz#6d61de95d91dfca9b9a02089ad384bff8f62b771" 796 | integrity sha1-bWHeldkd/Km5oCCJrThL/49it3E= 797 | 798 | has-values@^1.0.0: 799 | version "1.0.0" 800 | resolved "https://registry.yarnpkg.com/has-values/-/has-values-1.0.0.tgz#95b0b63fec2146619a6fe57fe75628d5a39efe4f" 801 | integrity sha1-lbC2P+whRmGab+V/51Yo1aOe/k8= 802 | dependencies: 803 | is-number "^3.0.0" 804 | kind-of "^4.0.0" 805 | 806 | hosted-git-info@^2.1.4: 807 | version "2.8.9" 808 | resolved "https://registry.yarnpkg.com/hosted-git-info/-/hosted-git-info-2.8.9.tgz#dffc0bf9a21c02209090f2aa69429e1414daf3f9" 809 | integrity sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw== 810 | 811 | iconv-lite@^0.4.4: 812 | version "0.4.24" 813 | resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.4.24.tgz#2022b4b25fbddc21d2f524974a474aafe733908b" 814 | integrity sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA== 815 | dependencies: 816 | safer-buffer ">= 2.1.2 < 3" 817 | 818 | ignore-by-default@^1.0.1: 819 | version "1.0.1" 820 | resolved "https://registry.yarnpkg.com/ignore-by-default/-/ignore-by-default-1.0.1.tgz#48ca6d72f6c6a3af00a9ad4ae6876be3889e2b09" 821 | integrity sha1-SMptcvbGo68Aqa1K5odr44ieKwk= 822 | 823 | ignore-walk@^3.0.1: 824 | version "3.0.2" 825 | resolved "https://registry.yarnpkg.com/ignore-walk/-/ignore-walk-3.0.2.tgz#99d83a246c196ea5c93ef9315ad7b0819c35069b" 826 | integrity sha512-EXyErtpHbn75ZTsOADsfx6J/FPo6/5cjev46PXrcTpd8z3BoRkXgYu9/JVqrI7tusjmwCZutGeRJeU0Wo1e4Cw== 827 | dependencies: 828 | minimatch "^3.0.4" 829 | 830 | import-lazy@^2.1.0: 831 | version "2.1.0" 832 | resolved "https://registry.yarnpkg.com/import-lazy/-/import-lazy-2.1.0.tgz#05698e3d45c88e8d7e9d92cb0584e77f096f3e43" 833 | integrity sha1-BWmOPUXIjo1+nZLLBYTnfwlvPkM= 834 | 835 | imurmurhash@^0.1.4: 836 | version "0.1.4" 837 | resolved "https://registry.yarnpkg.com/imurmurhash/-/imurmurhash-0.1.4.tgz#9218b9b2b928a238b13dc4fb6b6d576f231453ea" 838 | integrity sha1-khi5srkoojixPcT7a21XbyMUU+o= 839 | 840 | inflight@^1.0.4: 841 | version "1.0.6" 842 | resolved "https://registry.yarnpkg.com/inflight/-/inflight-1.0.6.tgz#49bd6331d7d02d0c09bc910a1075ba8165b56df9" 843 | integrity sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk= 844 | dependencies: 845 | once "^1.3.0" 846 | wrappy "1" 847 | 848 | inherits@2, inherits@^2.0.3, inherits@~2.0.3: 849 | version "2.0.4" 850 | resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.4.tgz#0fa2c64f932917c3433a0ded55363aae37416b7c" 851 | integrity sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ== 852 | 853 | ini@^1.3.4, ini@~1.3.0: 854 | version "1.3.7" 855 | resolved "https://registry.yarnpkg.com/ini/-/ini-1.3.7.tgz#a09363e1911972ea16d7a8851005d84cf09a9a84" 856 | integrity sha512-iKpRpXP+CrP2jyrxvg1kMUpXDyRUFDWurxbnVT1vQPx+Wz9uCYsMIqYuSBLV+PAaZG/d7kRLKRFc9oDMsH+mFQ== 857 | 858 | invert-kv@^2.0.0: 859 | version "2.0.0" 860 | resolved "https://registry.yarnpkg.com/invert-kv/-/invert-kv-2.0.0.tgz#7393f5afa59ec9ff5f67a27620d11c226e3eec02" 861 | integrity sha512-wPVv/y/QQ/Uiirj/vh3oP+1Ww+AWehmi1g5fFWGPF6IpCBCDVrhgHRMvrLfdYcwDh3QJbGXDW4JAuzxElLSqKA== 862 | 863 | is-accessor-descriptor@^0.1.6: 864 | version "0.1.6" 865 | resolved "https://registry.yarnpkg.com/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz#a9e12cb3ae8d876727eeef3843f8a0897b5c98d6" 866 | integrity sha1-qeEss66Nh2cn7u84Q/igiXtcmNY= 867 | dependencies: 868 | kind-of "^3.0.2" 869 | 870 | is-accessor-descriptor@^1.0.0: 871 | version "1.0.0" 872 | resolved "https://registry.yarnpkg.com/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz#169c2f6d3df1f992618072365c9b0ea1f6878656" 873 | integrity sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ== 874 | dependencies: 875 | kind-of "^6.0.0" 876 | 877 | is-arrayish@^0.2.1: 878 | version "0.2.1" 879 | resolved "https://registry.yarnpkg.com/is-arrayish/-/is-arrayish-0.2.1.tgz#77c99840527aa8ecb1a8ba697b80645a7a926a9d" 880 | integrity sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0= 881 | 882 | is-binary-path@^1.0.0: 883 | version "1.0.1" 884 | resolved "https://registry.yarnpkg.com/is-binary-path/-/is-binary-path-1.0.1.tgz#75f16642b480f187a711c814161fd3a4a7655898" 885 | integrity sha1-dfFmQrSA8YenEcgUFh/TpKdlWJg= 886 | dependencies: 887 | binary-extensions "^1.0.0" 888 | 889 | is-buffer@^1.1.5: 890 | version "1.1.6" 891 | resolved "https://registry.yarnpkg.com/is-buffer/-/is-buffer-1.1.6.tgz#efaa2ea9daa0d7ab2ea13a97b2b8ad51fefbe8be" 892 | integrity sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w== 893 | 894 | is-ci@^1.0.10: 895 | version "1.2.1" 896 | resolved "https://registry.yarnpkg.com/is-ci/-/is-ci-1.2.1.tgz#e3779c8ee17fccf428488f6e281187f2e632841c" 897 | integrity sha512-s6tfsaQaQi3JNciBH6shVqEDvhGut0SUXr31ag8Pd8BBbVVlcGfWhpPmEOoM6RJ5TFhbypvf5yyRw/VXW1IiWg== 898 | dependencies: 899 | ci-info "^1.5.0" 900 | 901 | is-data-descriptor@^0.1.4: 902 | version "0.1.4" 903 | resolved "https://registry.yarnpkg.com/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz#0b5ee648388e2c860282e793f1856fec3f301b56" 904 | integrity sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y= 905 | dependencies: 906 | kind-of "^3.0.2" 907 | 908 | is-data-descriptor@^1.0.0: 909 | version "1.0.0" 910 | resolved "https://registry.yarnpkg.com/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz#d84876321d0e7add03990406abbbbd36ba9268c7" 911 | integrity sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ== 912 | dependencies: 913 | kind-of "^6.0.0" 914 | 915 | is-descriptor@^0.1.0: 916 | version "0.1.6" 917 | resolved "https://registry.yarnpkg.com/is-descriptor/-/is-descriptor-0.1.6.tgz#366d8240dde487ca51823b1ab9f07a10a78251ca" 918 | integrity sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg== 919 | dependencies: 920 | is-accessor-descriptor "^0.1.6" 921 | is-data-descriptor "^0.1.4" 922 | kind-of "^5.0.0" 923 | 924 | is-descriptor@^1.0.0, is-descriptor@^1.0.2: 925 | version "1.0.2" 926 | resolved "https://registry.yarnpkg.com/is-descriptor/-/is-descriptor-1.0.2.tgz#3b159746a66604b04f8c81524ba365c5f14d86ec" 927 | integrity sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg== 928 | dependencies: 929 | is-accessor-descriptor "^1.0.0" 930 | is-data-descriptor "^1.0.0" 931 | kind-of "^6.0.2" 932 | 933 | is-extendable@^0.1.0, is-extendable@^0.1.1: 934 | version "0.1.1" 935 | resolved "https://registry.yarnpkg.com/is-extendable/-/is-extendable-0.1.1.tgz#62b110e289a471418e3ec36a617d472e301dfc89" 936 | integrity sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik= 937 | 938 | is-extendable@^1.0.1: 939 | version "1.0.1" 940 | resolved "https://registry.yarnpkg.com/is-extendable/-/is-extendable-1.0.1.tgz#a7470f9e426733d81bd81e1155264e3a3507cab4" 941 | integrity sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA== 942 | dependencies: 943 | is-plain-object "^2.0.4" 944 | 945 | is-extglob@^2.1.0, is-extglob@^2.1.1: 946 | version "2.1.1" 947 | resolved "https://registry.yarnpkg.com/is-extglob/-/is-extglob-2.1.1.tgz#a88c02535791f02ed37c76a1b9ea9773c833f8c2" 948 | integrity sha1-qIwCU1eR8C7TfHahueqXc8gz+MI= 949 | 950 | is-fullwidth-code-point@^1.0.0: 951 | version "1.0.0" 952 | resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz#ef9e31386f031a7f0d643af82fde50c457ef00cb" 953 | integrity sha1-754xOG8DGn8NZDr4L95QxFfvAMs= 954 | dependencies: 955 | number-is-nan "^1.0.0" 956 | 957 | is-fullwidth-code-point@^2.0.0: 958 | version "2.0.0" 959 | resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz#a3b30a5c4f199183167aaab93beefae3ddfb654f" 960 | integrity sha1-o7MKXE8ZkYMWeqq5O+764937ZU8= 961 | 962 | is-glob@^3.1.0: 963 | version "3.1.0" 964 | resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-3.1.0.tgz#7ba5ae24217804ac70707b96922567486cc3e84a" 965 | integrity sha1-e6WuJCF4BKxwcHuWkiVnSGzD6Eo= 966 | dependencies: 967 | is-extglob "^2.1.0" 968 | 969 | is-glob@^4.0.0: 970 | version "4.0.1" 971 | resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-4.0.1.tgz#7567dbe9f2f5e2467bc77ab83c4a29482407a5dc" 972 | integrity sha512-5G0tKtBTFImOqDnLB2hG6Bp2qcKEFduo4tZu9MT/H6NQv/ghhy30o55ufafxJ/LdH79LLs2Kfrn85TLKyA7BUg== 973 | dependencies: 974 | is-extglob "^2.1.1" 975 | 976 | is-installed-globally@^0.1.0: 977 | version "0.1.0" 978 | resolved "https://registry.yarnpkg.com/is-installed-globally/-/is-installed-globally-0.1.0.tgz#0dfd98f5a9111716dd535dda6492f67bf3d25a80" 979 | integrity sha1-Df2Y9akRFxbdU13aZJL2e/PSWoA= 980 | dependencies: 981 | global-dirs "^0.1.0" 982 | is-path-inside "^1.0.0" 983 | 984 | is-npm@^1.0.0: 985 | version "1.0.0" 986 | resolved "https://registry.yarnpkg.com/is-npm/-/is-npm-1.0.0.tgz#f2fb63a65e4905b406c86072765a1a4dc793b9f4" 987 | integrity sha1-8vtjpl5JBbQGyGBydloaTceTufQ= 988 | 989 | is-number@^3.0.0: 990 | version "3.0.0" 991 | resolved "https://registry.yarnpkg.com/is-number/-/is-number-3.0.0.tgz#24fd6201a4782cf50561c810276afc7d12d71195" 992 | integrity sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU= 993 | dependencies: 994 | kind-of "^3.0.2" 995 | 996 | is-obj@^1.0.0: 997 | version "1.0.1" 998 | resolved "https://registry.yarnpkg.com/is-obj/-/is-obj-1.0.1.tgz#3e4729ac1f5fde025cd7d83a896dab9f4f67db0f" 999 | integrity sha1-PkcprB9f3gJc19g6iW2rn09n2w8= 1000 | 1001 | is-path-inside@^1.0.0: 1002 | version "1.0.1" 1003 | resolved "https://registry.yarnpkg.com/is-path-inside/-/is-path-inside-1.0.1.tgz#8ef5b7de50437a3fdca6b4e865ef7aa55cb48036" 1004 | integrity sha1-jvW33lBDej/cprToZe96pVy0gDY= 1005 | dependencies: 1006 | path-is-inside "^1.0.1" 1007 | 1008 | is-plain-object@^2.0.3, is-plain-object@^2.0.4: 1009 | version "2.0.4" 1010 | resolved "https://registry.yarnpkg.com/is-plain-object/-/is-plain-object-2.0.4.tgz#2c163b3fafb1b606d9d17928f05c2a1c38e07677" 1011 | integrity sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og== 1012 | dependencies: 1013 | isobject "^3.0.1" 1014 | 1015 | is-redirect@^1.0.0: 1016 | version "1.0.0" 1017 | resolved "https://registry.yarnpkg.com/is-redirect/-/is-redirect-1.0.0.tgz#1d03dded53bd8db0f30c26e4f95d36fc7c87dc24" 1018 | integrity sha1-HQPd7VO9jbDzDCbk+V02/HyH3CQ= 1019 | 1020 | is-retry-allowed@^1.0.0: 1021 | version "1.2.0" 1022 | resolved "https://registry.yarnpkg.com/is-retry-allowed/-/is-retry-allowed-1.2.0.tgz#d778488bd0a4666a3be8a1482b9f2baafedea8b4" 1023 | integrity sha512-RUbUeKwvm3XG2VYamhJL1xFktgjvPzL0Hq8C+6yrWIswDy3BIXGqCxhxkc30N9jqK311gVU137K8Ei55/zVJRg== 1024 | 1025 | is-stream@^1.0.0, is-stream@^1.1.0: 1026 | version "1.1.0" 1027 | resolved "https://registry.yarnpkg.com/is-stream/-/is-stream-1.1.0.tgz#12d4a3dd4e68e0b79ceb8dbc84173ae80d91ca44" 1028 | integrity sha1-EtSj3U5o4Lec6428hBc66A2RykQ= 1029 | 1030 | is-windows@^1.0.2: 1031 | version "1.0.2" 1032 | resolved "https://registry.yarnpkg.com/is-windows/-/is-windows-1.0.2.tgz#d1850eb9791ecd18e6182ce12a30f396634bb19d" 1033 | integrity sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA== 1034 | 1035 | isarray@1.0.0, isarray@~1.0.0: 1036 | version "1.0.0" 1037 | resolved "https://registry.yarnpkg.com/isarray/-/isarray-1.0.0.tgz#bb935d48582cba168c06834957a54a3e07124f11" 1038 | integrity sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE= 1039 | 1040 | isexe@^2.0.0: 1041 | version "2.0.0" 1042 | resolved "https://registry.yarnpkg.com/isexe/-/isexe-2.0.0.tgz#e8fbf374dc556ff8947a10dcb0572d633f2cfa10" 1043 | integrity sha1-6PvzdNxVb/iUehDcsFctYz8s+hA= 1044 | 1045 | isobject@^2.0.0: 1046 | version "2.1.0" 1047 | resolved "https://registry.yarnpkg.com/isobject/-/isobject-2.1.0.tgz#f065561096a3f1da2ef46272f815c840d87e0c89" 1048 | integrity sha1-8GVWEJaj8dou9GJy+BXIQNh+DIk= 1049 | dependencies: 1050 | isarray "1.0.0" 1051 | 1052 | isobject@^3.0.0, isobject@^3.0.1: 1053 | version "3.0.1" 1054 | resolved "https://registry.yarnpkg.com/isobject/-/isobject-3.0.1.tgz#4e431e92b11a9731636aa1f9c8d1ccbcfdab78df" 1055 | integrity sha1-TkMekrEalzFjaqH5yNHMvP2reN8= 1056 | 1057 | js-yaml@^3.13.1, js-yaml@^3.6.1: 1058 | version "3.13.1" 1059 | resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-3.13.1.tgz#aff151b30bfdfa8e49e05da22e7415e9dfa37847" 1060 | integrity sha512-YfbcO7jXDdyj0DGxYVSlSeQNHbD7XPWvrVWeVUujrQEoZzWJIRrCPoyk6kL6IAjAG2IolMK4T0hNUe0HOUs5Jw== 1061 | dependencies: 1062 | argparse "^1.0.7" 1063 | esprima "^4.0.0" 1064 | 1065 | json-parse-better-errors@^1.0.1: 1066 | version "1.0.2" 1067 | resolved "https://registry.yarnpkg.com/json-parse-better-errors/-/json-parse-better-errors-1.0.2.tgz#bb867cfb3450e69107c131d1c514bab3dc8bcaa9" 1068 | integrity sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw== 1069 | 1070 | kareem@2.3.1: 1071 | version "2.3.1" 1072 | resolved "https://registry.yarnpkg.com/kareem/-/kareem-2.3.1.tgz#def12d9c941017fabfb00f873af95e9c99e1be87" 1073 | integrity sha512-l3hLhffs9zqoDe8zjmb/mAN4B8VT3L56EUvKNqLFVs9YlFA+zx7ke1DO8STAdDyYNkeSo1nKmjuvQeI12So8Xw== 1074 | 1075 | kind-of@^3.0.2, kind-of@^3.0.3, kind-of@^3.2.0: 1076 | version "3.2.2" 1077 | resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-3.2.2.tgz#31ea21a734bab9bbb0f32466d893aea51e4a3c64" 1078 | integrity sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ= 1079 | dependencies: 1080 | is-buffer "^1.1.5" 1081 | 1082 | kind-of@^4.0.0: 1083 | version "4.0.0" 1084 | resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-4.0.0.tgz#20813df3d712928b207378691a45066fae72dd57" 1085 | integrity sha1-IIE989cSkosgc3hpGkUGb65y3Vc= 1086 | dependencies: 1087 | is-buffer "^1.1.5" 1088 | 1089 | kind-of@^5.0.0: 1090 | version "5.1.0" 1091 | resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-5.1.0.tgz#729c91e2d857b7a419a1f9aa65685c4c33f5845d" 1092 | integrity sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw== 1093 | 1094 | kind-of@^6.0.0, kind-of@^6.0.2: 1095 | version "6.0.2" 1096 | resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-6.0.2.tgz#01146b36a6218e64e58f3a8d66de5d7fc6f6d051" 1097 | integrity sha512-s5kLOcnH0XqDO+FvuaLX8DDjZ18CGFk7VygH40QoKPUQhW4e2rvM0rwUq0t8IQDOwYSeLK01U90OjzBTme2QqA== 1098 | 1099 | latest-version@^3.0.0: 1100 | version "3.1.0" 1101 | resolved "https://registry.yarnpkg.com/latest-version/-/latest-version-3.1.0.tgz#a205383fea322b33b5ae3b18abee0dc2f356ee15" 1102 | integrity sha1-ogU4P+oyKzO1rjsYq+4NwvNW7hU= 1103 | dependencies: 1104 | package-json "^4.0.0" 1105 | 1106 | lcid@^2.0.0: 1107 | version "2.0.0" 1108 | resolved "https://registry.yarnpkg.com/lcid/-/lcid-2.0.0.tgz#6ef5d2df60e52f82eb228a4c373e8d1f397253cf" 1109 | integrity sha512-avPEb8P8EGnwXKClwsNUgryVjllcRqtMYa49NTsbQagYuT1DcXnl1915oxWjoyGrXR6zH/Y0Zc96xWsPcoDKeA== 1110 | dependencies: 1111 | invert-kv "^2.0.0" 1112 | 1113 | locate-path@^3.0.0: 1114 | version "3.0.0" 1115 | resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-3.0.0.tgz#dbec3b3ab759758071b58fe59fc41871af21400e" 1116 | integrity sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A== 1117 | dependencies: 1118 | p-locate "^3.0.0" 1119 | path-exists "^3.0.0" 1120 | 1121 | lodash.shuffle@^4.1.0: 1122 | version "4.2.0" 1123 | resolved "https://registry.yarnpkg.com/lodash.shuffle/-/lodash.shuffle-4.2.0.tgz#145b5053cf875f6f5c2a33f48b6e9948c6ec7b4b" 1124 | integrity sha1-FFtQU8+HX29cKjP0i26ZSMbse0s= 1125 | 1126 | lodash@^4.17.11, lodash@^4.17.15: 1127 | version "4.17.21" 1128 | resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.21.tgz#679591c564c3bffaae8454cf0b3df370c3d6911c" 1129 | integrity sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg== 1130 | 1131 | lowercase-keys@^1.0.0: 1132 | version "1.0.1" 1133 | resolved "https://registry.yarnpkg.com/lowercase-keys/-/lowercase-keys-1.0.1.tgz#6f9e30b47084d971a7c820ff15a6c5167b74c26f" 1134 | integrity sha512-G2Lj61tXDnVFFOi8VZds+SoQjtQC3dgokKdDG2mTm1tx4m50NUHBOZSBwQQHyy0V12A0JTG4icfZQH+xPyh8VA== 1135 | 1136 | lru-cache@^4.0.1: 1137 | version "4.1.5" 1138 | resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-4.1.5.tgz#8bbe50ea85bed59bc9e33dcab8235ee9bcf443cd" 1139 | integrity sha512-sWZlbEP2OsHNkXrMl5GYk/jKk70MBng6UU4YI/qGDYbgf6YbP4EvmqISbXCoJiRKs+1bSpFHVgQxvJ17F2li5g== 1140 | dependencies: 1141 | pseudomap "^1.0.2" 1142 | yallist "^2.1.2" 1143 | 1144 | make-dir@^1.0.0: 1145 | version "1.3.0" 1146 | resolved "https://registry.yarnpkg.com/make-dir/-/make-dir-1.3.0.tgz#79c1033b80515bd6d24ec9933e860ca75ee27f0c" 1147 | integrity sha512-2w31R7SJtieJJnQtGc7RVL2StM2vGYVfqUOvUDxH6bC6aJTxPxTF0GnIgCyu7tjockiUWAYQRbxa7vKn34s5sQ== 1148 | dependencies: 1149 | pify "^3.0.0" 1150 | 1151 | map-age-cleaner@^0.1.1: 1152 | version "0.1.3" 1153 | resolved "https://registry.yarnpkg.com/map-age-cleaner/-/map-age-cleaner-0.1.3.tgz#7d583a7306434c055fe474b0f45078e6e1b4b92a" 1154 | integrity sha512-bJzx6nMoP6PDLPBFmg7+xRKeFZvFboMrGlxmNj9ClvX53KrmvM5bXFXEWjbz4cz1AFn+jWJ9z/DJSz7hrs0w3w== 1155 | dependencies: 1156 | p-defer "^1.0.0" 1157 | 1158 | map-cache@^0.2.2: 1159 | version "0.2.2" 1160 | resolved "https://registry.yarnpkg.com/map-cache/-/map-cache-0.2.2.tgz#c32abd0bd6525d9b051645bb4f26ac5dc98a0dbf" 1161 | integrity sha1-wyq9C9ZSXZsFFkW7TyasXcmKDb8= 1162 | 1163 | map-visit@^1.0.0: 1164 | version "1.0.0" 1165 | resolved "https://registry.yarnpkg.com/map-visit/-/map-visit-1.0.0.tgz#ecdca8f13144e660f1b5bd41f12f3479d98dfb8f" 1166 | integrity sha1-7Nyo8TFE5mDxtb1B8S80edmN+48= 1167 | dependencies: 1168 | object-visit "^1.0.0" 1169 | 1170 | mem@^4.0.0: 1171 | version "4.3.0" 1172 | resolved "https://registry.yarnpkg.com/mem/-/mem-4.3.0.tgz#461af497bc4ae09608cdb2e60eefb69bff744178" 1173 | integrity sha512-qX2bG48pTqYRVmDB37rn/6PT7LcR8T7oAX3bf99u1Tt1nzxYfxkgqDwUwolPlXweM0XzBOBFzSx4kfp7KP1s/w== 1174 | dependencies: 1175 | map-age-cleaner "^0.1.1" 1176 | mimic-fn "^2.0.0" 1177 | p-is-promise "^2.0.0" 1178 | 1179 | micromatch@^3.1.10, micromatch@^3.1.4: 1180 | version "3.1.10" 1181 | resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-3.1.10.tgz#70859bc95c9840952f359a068a3fc49f9ecfac23" 1182 | integrity sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg== 1183 | dependencies: 1184 | arr-diff "^4.0.0" 1185 | array-unique "^0.3.2" 1186 | braces "^2.3.1" 1187 | define-property "^2.0.2" 1188 | extend-shallow "^3.0.2" 1189 | extglob "^2.0.4" 1190 | fragment-cache "^0.2.1" 1191 | kind-of "^6.0.2" 1192 | nanomatch "^1.2.9" 1193 | object.pick "^1.3.0" 1194 | regex-not "^1.0.0" 1195 | snapdragon "^0.8.1" 1196 | to-regex "^3.0.2" 1197 | 1198 | mimic-fn@^2.0.0: 1199 | version "2.1.0" 1200 | resolved "https://registry.yarnpkg.com/mimic-fn/-/mimic-fn-2.1.0.tgz#7ed2c2ccccaf84d3ffcb7a69b57711fc2083401b" 1201 | integrity sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg== 1202 | 1203 | minimatch@^3.0.4: 1204 | version "3.0.4" 1205 | resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.0.4.tgz#5166e286457f03306064be5497e8dbb0c3d32083" 1206 | integrity sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA== 1207 | dependencies: 1208 | brace-expansion "^1.1.7" 1209 | 1210 | minimist@^1.2.0: 1211 | version "1.2.0" 1212 | resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.0.tgz#a35008b20f41383eec1fb914f4cd5df79a264284" 1213 | integrity sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ= 1214 | 1215 | minimist@^1.2.5: 1216 | version "1.2.5" 1217 | resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.5.tgz#67d66014b66a6a8aaa0c083c5fd58df4e4e97602" 1218 | integrity sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw== 1219 | 1220 | minipass@^2.6.0, minipass@^2.9.0: 1221 | version "2.9.0" 1222 | resolved "https://registry.yarnpkg.com/minipass/-/minipass-2.9.0.tgz#e713762e7d3e32fed803115cf93e04bca9fcc9a6" 1223 | integrity sha512-wxfUjg9WebH+CUDX/CdbRlh5SmfZiy/hpkxaRI16Y9W56Pa75sWgd/rvFilSgrauD9NyFymP/+JFV3KwzIsJeg== 1224 | dependencies: 1225 | safe-buffer "^5.1.2" 1226 | yallist "^3.0.0" 1227 | 1228 | minizlib@^1.3.3: 1229 | version "1.3.3" 1230 | resolved "https://registry.yarnpkg.com/minizlib/-/minizlib-1.3.3.tgz#2290de96818a34c29551c8a8d301216bd65a861d" 1231 | integrity sha512-6ZYMOEnmVsdCeTJVE0W9ZD+pVnE8h9Hma/iOwwRDsdQoePpoX56/8B6z3P9VNwppJuBKNRuFDRNRqRWexT9G9Q== 1232 | dependencies: 1233 | minipass "^2.9.0" 1234 | 1235 | mixin-deep@^1.2.0: 1236 | version "1.3.2" 1237 | resolved "https://registry.yarnpkg.com/mixin-deep/-/mixin-deep-1.3.2.tgz#1120b43dc359a785dce65b55b82e257ccf479566" 1238 | integrity sha512-WRoDn//mXBiJ1H40rqa3vH0toePwSsGb45iInWlTySa+Uu4k3tYUSxa2v1KqAiLtvlrSzaExqS1gtk96A9zvEA== 1239 | dependencies: 1240 | for-in "^1.0.2" 1241 | is-extendable "^1.0.1" 1242 | 1243 | mkdirp@^0.5.1, mkdirp@^0.5.5: 1244 | version "0.5.5" 1245 | resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-0.5.5.tgz#d91cefd62d1436ca0f41620e251288d420099def" 1246 | integrity sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ== 1247 | dependencies: 1248 | minimist "^1.2.5" 1249 | 1250 | mongodb@3.3.2: 1251 | version "3.3.2" 1252 | resolved "https://registry.yarnpkg.com/mongodb/-/mongodb-3.3.2.tgz#ff086b5f552cf07e24ce098694210f3d42d668b2" 1253 | integrity sha512-fqJt3iywelk4yKu/lfwQg163Bjpo5zDKhXiohycvon4iQHbrfflSAz9AIlRE6496Pm/dQKQK5bMigdVo2s6gBg== 1254 | dependencies: 1255 | bson "^1.1.1" 1256 | require_optional "^1.0.1" 1257 | safe-buffer "^5.1.2" 1258 | 1259 | mongoose-legacy-pluralize@1.0.2: 1260 | version "1.0.2" 1261 | resolved "https://registry.yarnpkg.com/mongoose-legacy-pluralize/-/mongoose-legacy-pluralize-1.0.2.tgz#3ba9f91fa507b5186d399fb40854bff18fb563e4" 1262 | integrity sha512-Yo/7qQU4/EyIS8YDFSeenIvXxZN+ld7YdV9LqFVQJzTLye8unujAWPZ4NWKfFA+RNjh+wvTWKY9Z3E5XM6ZZiQ== 1263 | 1264 | mongoose@^5.5.2: 1265 | version "5.7.0" 1266 | resolved "https://registry.yarnpkg.com/mongoose/-/mongoose-5.7.0.tgz#5a686d7a85342784a26d1afb875a2a8170a7a32f" 1267 | integrity sha512-nE43r4kEUpUBfr32rf+zJKEtzd6I3F5YdbrSHp/DDdVQyej34Cv7gfBdcoRNehrPQDV3khOh0JpiS1aLN9/OCw== 1268 | dependencies: 1269 | async "2.6.2" 1270 | bson "~1.1.1" 1271 | kareem "2.3.1" 1272 | mongodb "3.3.2" 1273 | mongoose-legacy-pluralize "1.0.2" 1274 | mpath "0.6.0" 1275 | mquery "3.2.1" 1276 | ms "2.1.2" 1277 | regexp-clone "1.0.0" 1278 | safe-buffer "5.1.2" 1279 | sift "7.0.1" 1280 | sliced "1.0.1" 1281 | 1282 | mpath@0.6.0: 1283 | version "0.6.0" 1284 | resolved "https://registry.yarnpkg.com/mpath/-/mpath-0.6.0.tgz#aa922029fca4f0f641f360e74c5c1b6a4c47078e" 1285 | integrity sha512-i75qh79MJ5Xo/sbhxrDrPSEG0H/mr1kcZXJ8dH6URU5jD/knFxCVqVC/gVSW7GIXL/9hHWlT9haLbCXWOll3qw== 1286 | 1287 | mquery@3.2.1: 1288 | version "3.2.1" 1289 | resolved "https://registry.yarnpkg.com/mquery/-/mquery-3.2.1.tgz#8b059a49cdae0a8a9e804284ef64c2f58d3ac05d" 1290 | integrity sha512-kY/K8QToZWTTocm0U+r8rqcJCp5PRl6e8tPmoDs5OeSO3DInZE2rAL6AYH+V406JTo8305LdASOQcxRDqHojyw== 1291 | dependencies: 1292 | bluebird "3.5.1" 1293 | debug "3.1.0" 1294 | regexp-clone "^1.0.0" 1295 | safe-buffer "5.1.2" 1296 | sliced "1.0.1" 1297 | 1298 | ms@2.0.0: 1299 | version "2.0.0" 1300 | resolved "https://registry.yarnpkg.com/ms/-/ms-2.0.0.tgz#5608aeadfc00be6c2901df5f9861788de0d597c8" 1301 | integrity sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g= 1302 | 1303 | ms@2.1.2, ms@^2.1.1: 1304 | version "2.1.2" 1305 | resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.2.tgz#d09d1f357b443f493382a8eb3ccd183872ae6009" 1306 | integrity sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w== 1307 | 1308 | nan@^2.12.1: 1309 | version "2.14.0" 1310 | resolved "https://registry.yarnpkg.com/nan/-/nan-2.14.0.tgz#7818f722027b2459a86f0295d434d1fc2336c52c" 1311 | integrity sha512-INOFj37C7k3AfaNTtX8RhsTw7qRy7eLET14cROi9+5HAVbbHuIWUHEauBv5qT4Av2tWasiTY1Jw6puUNqRJXQg== 1312 | 1313 | nanomatch@^1.2.9: 1314 | version "1.2.13" 1315 | resolved "https://registry.yarnpkg.com/nanomatch/-/nanomatch-1.2.13.tgz#b87a8aa4fc0de8fe6be88895b38983ff265bd119" 1316 | integrity sha512-fpoe2T0RbHwBTBUOftAfBPaDEi06ufaUai0mE6Yn1kacc3SnTErfb/h+X94VXzI64rKFHYImXSvdwGGCmwOqCA== 1317 | dependencies: 1318 | arr-diff "^4.0.0" 1319 | array-unique "^0.3.2" 1320 | define-property "^2.0.2" 1321 | extend-shallow "^3.0.2" 1322 | fragment-cache "^0.2.1" 1323 | is-windows "^1.0.2" 1324 | kind-of "^6.0.2" 1325 | object.pick "^1.3.0" 1326 | regex-not "^1.0.0" 1327 | snapdragon "^0.8.1" 1328 | to-regex "^3.0.1" 1329 | 1330 | needle@^2.2.1: 1331 | version "2.4.0" 1332 | resolved "https://registry.yarnpkg.com/needle/-/needle-2.4.0.tgz#6833e74975c444642590e15a750288c5f939b57c" 1333 | integrity sha512-4Hnwzr3mi5L97hMYeNl8wRW/Onhy4nUKR/lVemJ8gJedxxUyBLm9kkrDColJvoSfwi0jCNhD+xCdOtiGDQiRZg== 1334 | dependencies: 1335 | debug "^3.2.6" 1336 | iconv-lite "^0.4.4" 1337 | sax "^1.2.4" 1338 | 1339 | nice-try@^1.0.4: 1340 | version "1.0.5" 1341 | resolved "https://registry.yarnpkg.com/nice-try/-/nice-try-1.0.5.tgz#a3378a7696ce7d223e88fc9b764bd7ef1089e366" 1342 | integrity sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ== 1343 | 1344 | node-fetch@^2.2.0: 1345 | version "2.6.1" 1346 | resolved "https://registry.yarnpkg.com/node-fetch/-/node-fetch-2.6.1.tgz#045bd323631f76ed2e2b55573394416b639a0052" 1347 | integrity sha512-V4aYg89jEoVRxRb2fJdAg8FHvI7cEyYdVAh94HH0UIK8oJxUfkjlDQN9RbMx+bEjP7+ggMiFRprSti032Oipxw== 1348 | 1349 | node-pre-gyp@^0.12.0: 1350 | version "0.12.0" 1351 | resolved "https://registry.yarnpkg.com/node-pre-gyp/-/node-pre-gyp-0.12.0.tgz#39ba4bb1439da030295f899e3b520b7785766149" 1352 | integrity sha512-4KghwV8vH5k+g2ylT+sLTjy5wmUOb9vPhnM8NHvRf9dHmnW/CndrFXy2aRPaPST6dugXSdHXfeaHQm77PIz/1A== 1353 | dependencies: 1354 | detect-libc "^1.0.2" 1355 | mkdirp "^0.5.1" 1356 | needle "^2.2.1" 1357 | nopt "^4.0.1" 1358 | npm-packlist "^1.1.6" 1359 | npmlog "^4.0.2" 1360 | rc "^1.2.7" 1361 | rimraf "^2.6.1" 1362 | semver "^5.3.0" 1363 | tar "^4" 1364 | 1365 | nodemon@^1.19.2: 1366 | version "1.19.2" 1367 | resolved "https://registry.yarnpkg.com/nodemon/-/nodemon-1.19.2.tgz#b0975147dc99b3761ceb595b3f9277084931dcc0" 1368 | integrity sha512-hRLYaw5Ihyw9zK7NF+9EUzVyS6Cvgc14yh8CAYr38tPxJa6UrOxwAQ351GwrgoanHCF0FalQFn6w5eoX/LGdJw== 1369 | dependencies: 1370 | chokidar "^2.1.5" 1371 | debug "^3.1.0" 1372 | ignore-by-default "^1.0.1" 1373 | minimatch "^3.0.4" 1374 | pstree.remy "^1.1.6" 1375 | semver "^5.5.0" 1376 | supports-color "^5.2.0" 1377 | touch "^3.1.0" 1378 | undefsafe "^2.0.2" 1379 | update-notifier "^2.5.0" 1380 | 1381 | nopt@^4.0.1: 1382 | version "4.0.1" 1383 | resolved "https://registry.yarnpkg.com/nopt/-/nopt-4.0.1.tgz#d0d4685afd5415193c8c7505602d0d17cd64474d" 1384 | integrity sha1-0NRoWv1UFRk8jHUFYC0NF81kR00= 1385 | dependencies: 1386 | abbrev "1" 1387 | osenv "^0.1.4" 1388 | 1389 | nopt@~1.0.10: 1390 | version "1.0.10" 1391 | resolved "https://registry.yarnpkg.com/nopt/-/nopt-1.0.10.tgz#6ddd21bd2a31417b92727dd585f8a6f37608ebee" 1392 | integrity sha1-bd0hvSoxQXuScn3Vhfim83YI6+4= 1393 | dependencies: 1394 | abbrev "1" 1395 | 1396 | normalize-package-data@^2.3.2: 1397 | version "2.5.0" 1398 | resolved "https://registry.yarnpkg.com/normalize-package-data/-/normalize-package-data-2.5.0.tgz#e66db1838b200c1dfc233225d12cb36520e234a8" 1399 | integrity sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA== 1400 | dependencies: 1401 | hosted-git-info "^2.1.4" 1402 | resolve "^1.10.0" 1403 | semver "2 || 3 || 4 || 5" 1404 | validate-npm-package-license "^3.0.1" 1405 | 1406 | normalize-path@^2.1.1: 1407 | version "2.1.1" 1408 | resolved "https://registry.yarnpkg.com/normalize-path/-/normalize-path-2.1.1.tgz#1ab28b556e198363a8c1a6f7e6fa20137fe6aed9" 1409 | integrity sha1-GrKLVW4Zg2Oowab35vogE3/mrtk= 1410 | dependencies: 1411 | remove-trailing-separator "^1.0.1" 1412 | 1413 | normalize-path@^3.0.0: 1414 | version "3.0.0" 1415 | resolved "https://registry.yarnpkg.com/normalize-path/-/normalize-path-3.0.0.tgz#0dcd69ff23a1c9b11fd0978316644a0388216a65" 1416 | integrity sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA== 1417 | 1418 | npm-bundled@^1.0.1: 1419 | version "1.0.6" 1420 | resolved "https://registry.yarnpkg.com/npm-bundled/-/npm-bundled-1.0.6.tgz#e7ba9aadcef962bb61248f91721cd932b3fe6bdd" 1421 | integrity sha512-8/JCaftHwbd//k6y2rEWp6k1wxVfpFzB6t1p825+cUb7Ym2XQfhwIC5KwhrvzZRJu+LtDE585zVaS32+CGtf0g== 1422 | 1423 | npm-packlist@^1.1.6: 1424 | version "1.4.4" 1425 | resolved "https://registry.yarnpkg.com/npm-packlist/-/npm-packlist-1.4.4.tgz#866224233850ac534b63d1a6e76050092b5d2f44" 1426 | integrity sha512-zTLo8UcVYtDU3gdeaFu2Xu0n0EvelfHDGuqtNIn5RO7yQj4H1TqNdBc/yZjxnWA0PVB8D3Woyp0i5B43JwQ6Vw== 1427 | dependencies: 1428 | ignore-walk "^3.0.1" 1429 | npm-bundled "^1.0.1" 1430 | 1431 | npm-run-path@^2.0.0: 1432 | version "2.0.2" 1433 | resolved "https://registry.yarnpkg.com/npm-run-path/-/npm-run-path-2.0.2.tgz#35a9232dfa35d7067b4cb2ddf2357b1871536c5f" 1434 | integrity sha1-NakjLfo11wZ7TLLd8jV7GHFTbF8= 1435 | dependencies: 1436 | path-key "^2.0.0" 1437 | 1438 | npmlog@^4.0.2: 1439 | version "4.1.2" 1440 | resolved "https://registry.yarnpkg.com/npmlog/-/npmlog-4.1.2.tgz#08a7f2a8bf734604779a9efa4ad5cc717abb954b" 1441 | integrity sha512-2uUqazuKlTaSI/dC8AzicUck7+IrEaOnN/e0jd3Xtt1KcGpwx30v50mL7oPyr/h9bL3E4aZccVwpwP+5W9Vjkg== 1442 | dependencies: 1443 | are-we-there-yet "~1.1.2" 1444 | console-control-strings "~1.1.0" 1445 | gauge "~2.7.3" 1446 | set-blocking "~2.0.0" 1447 | 1448 | number-is-nan@^1.0.0: 1449 | version "1.0.1" 1450 | resolved "https://registry.yarnpkg.com/number-is-nan/-/number-is-nan-1.0.1.tgz#097b602b53422a522c1afb8790318336941a011d" 1451 | integrity sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0= 1452 | 1453 | object-assign@^4.1.0: 1454 | version "4.1.1" 1455 | resolved "https://registry.yarnpkg.com/object-assign/-/object-assign-4.1.1.tgz#2109adc7965887cfc05cbbd442cac8bfbb360863" 1456 | integrity sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM= 1457 | 1458 | object-copy@^0.1.0: 1459 | version "0.1.0" 1460 | resolved "https://registry.yarnpkg.com/object-copy/-/object-copy-0.1.0.tgz#7e7d858b781bd7c991a41ba975ed3812754e998c" 1461 | integrity sha1-fn2Fi3gb18mRpBupde04EnVOmYw= 1462 | dependencies: 1463 | copy-descriptor "^0.1.0" 1464 | define-property "^0.2.5" 1465 | kind-of "^3.0.3" 1466 | 1467 | object-visit@^1.0.0: 1468 | version "1.0.1" 1469 | resolved "https://registry.yarnpkg.com/object-visit/-/object-visit-1.0.1.tgz#f79c4493af0c5377b59fe39d395e41042dd045bb" 1470 | integrity sha1-95xEk68MU3e1n+OdOV5BBC3QRbs= 1471 | dependencies: 1472 | isobject "^3.0.0" 1473 | 1474 | object.pick@^1.3.0: 1475 | version "1.3.0" 1476 | resolved "https://registry.yarnpkg.com/object.pick/-/object.pick-1.3.0.tgz#87a10ac4c1694bd2e1cbf53591a66141fb5dd747" 1477 | integrity sha1-h6EKxMFpS9Lhy/U1kaZhQftd10c= 1478 | dependencies: 1479 | isobject "^3.0.1" 1480 | 1481 | once@^1.3.0, once@^1.3.1, once@^1.4.0: 1482 | version "1.4.0" 1483 | resolved "https://registry.yarnpkg.com/once/-/once-1.4.0.tgz#583b1aa775961d4b113ac17d9c50baef9dd76bd1" 1484 | integrity sha1-WDsap3WWHUsROsF9nFC6753Xa9E= 1485 | dependencies: 1486 | wrappy "1" 1487 | 1488 | os-homedir@^1.0.0: 1489 | version "1.0.2" 1490 | resolved "https://registry.yarnpkg.com/os-homedir/-/os-homedir-1.0.2.tgz#ffbc4988336e0e833de0c168c7ef152121aa7fb3" 1491 | integrity sha1-/7xJiDNuDoM94MFox+8VISGqf7M= 1492 | 1493 | os-locale@^3.0.0: 1494 | version "3.1.0" 1495 | resolved "https://registry.yarnpkg.com/os-locale/-/os-locale-3.1.0.tgz#a802a6ee17f24c10483ab9935719cef4ed16bf1a" 1496 | integrity sha512-Z8l3R4wYWM40/52Z+S265okfFj8Kt2cC2MKY+xNi3kFs+XGI7WXu/I309QQQYbRW4ijiZ+yxs9pqEhJh0DqW3Q== 1497 | dependencies: 1498 | execa "^1.0.0" 1499 | lcid "^2.0.0" 1500 | mem "^4.0.0" 1501 | 1502 | os-tmpdir@^1.0.0: 1503 | version "1.0.2" 1504 | resolved "https://registry.yarnpkg.com/os-tmpdir/-/os-tmpdir-1.0.2.tgz#bbe67406c79aa85c5cfec766fe5734555dfa1274" 1505 | integrity sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ= 1506 | 1507 | osenv@^0.1.4: 1508 | version "0.1.5" 1509 | resolved "https://registry.yarnpkg.com/osenv/-/osenv-0.1.5.tgz#85cdfafaeb28e8677f416e287592b5f3f49ea410" 1510 | integrity sha512-0CWcCECdMVc2Rw3U5w9ZjqX6ga6ubk1xDVKxtBQPK7wis/0F2r9T6k4ydGYhecl7YUBxBVxhL5oisPsNxAPe2g== 1511 | dependencies: 1512 | os-homedir "^1.0.0" 1513 | os-tmpdir "^1.0.0" 1514 | 1515 | p-defer@^1.0.0: 1516 | version "1.0.0" 1517 | resolved "https://registry.yarnpkg.com/p-defer/-/p-defer-1.0.0.tgz#9f6eb182f6c9aa8cd743004a7d4f96b196b0fb0c" 1518 | integrity sha1-n26xgvbJqozXQwBKfU+WsZaw+ww= 1519 | 1520 | p-finally@^1.0.0: 1521 | version "1.0.0" 1522 | resolved "https://registry.yarnpkg.com/p-finally/-/p-finally-1.0.0.tgz#3fbcfb15b899a44123b34b6dcc18b724336a2cae" 1523 | integrity sha1-P7z7FbiZpEEjs0ttzBi3JDNqLK4= 1524 | 1525 | p-is-promise@^2.0.0: 1526 | version "2.1.0" 1527 | resolved "https://registry.yarnpkg.com/p-is-promise/-/p-is-promise-2.1.0.tgz#918cebaea248a62cf7ffab8e3bca8c5f882fc42e" 1528 | integrity sha512-Y3W0wlRPK8ZMRbNq97l4M5otioeA5lm1z7bkNkxCka8HSPjR0xRWmpCmc9utiaLP9Jb1eD8BgeIxTW4AIF45Pg== 1529 | 1530 | p-limit@^2.0.0: 1531 | version "2.2.1" 1532 | resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-2.2.1.tgz#aa07a788cc3151c939b5131f63570f0dd2009537" 1533 | integrity sha512-85Tk+90UCVWvbDavCLKPOLC9vvY8OwEX/RtKF+/1OADJMVlFfEHOiMTPVyxg7mk/dKa+ipdHm0OUkTvCpMTuwg== 1534 | dependencies: 1535 | p-try "^2.0.0" 1536 | 1537 | p-locate@^3.0.0: 1538 | version "3.0.0" 1539 | resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-3.0.0.tgz#322d69a05c0264b25997d9f40cd8a891ab0064a4" 1540 | integrity sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ== 1541 | dependencies: 1542 | p-limit "^2.0.0" 1543 | 1544 | p-try@^2.0.0: 1545 | version "2.2.0" 1546 | resolved "https://registry.yarnpkg.com/p-try/-/p-try-2.2.0.tgz#cb2868540e313d61de58fafbe35ce9004d5540e6" 1547 | integrity sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ== 1548 | 1549 | package-json@^4.0.0: 1550 | version "4.0.1" 1551 | resolved "https://registry.yarnpkg.com/package-json/-/package-json-4.0.1.tgz#8869a0401253661c4c4ca3da6c2121ed555f5eed" 1552 | integrity sha1-iGmgQBJTZhxMTKPabCEh7VVfXu0= 1553 | dependencies: 1554 | got "^6.7.1" 1555 | registry-auth-token "^3.0.1" 1556 | registry-url "^3.0.3" 1557 | semver "^5.1.0" 1558 | 1559 | parse-json@^4.0.0: 1560 | version "4.0.0" 1561 | resolved "https://registry.yarnpkg.com/parse-json/-/parse-json-4.0.0.tgz#be35f5425be1f7f6c747184f98a788cb99477ee0" 1562 | integrity sha1-vjX1Qlvh9/bHRxhPmKeIy5lHfuA= 1563 | dependencies: 1564 | error-ex "^1.3.1" 1565 | json-parse-better-errors "^1.0.1" 1566 | 1567 | pascalcase@^0.1.1: 1568 | version "0.1.1" 1569 | resolved "https://registry.yarnpkg.com/pascalcase/-/pascalcase-0.1.1.tgz#b363e55e8006ca6fe21784d2db22bd15d7917f14" 1570 | integrity sha1-s2PlXoAGym/iF4TS2yK9FdeRfxQ= 1571 | 1572 | path-dirname@^1.0.0: 1573 | version "1.0.2" 1574 | resolved "https://registry.yarnpkg.com/path-dirname/-/path-dirname-1.0.2.tgz#cc33d24d525e099a5388c0336c6e32b9160609e0" 1575 | integrity sha1-zDPSTVJeCZpTiMAzbG4yuRYGCeA= 1576 | 1577 | path-exists@^3.0.0: 1578 | version "3.0.0" 1579 | resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-3.0.0.tgz#ce0ebeaa5f78cb18925ea7d810d7b59b010fd515" 1580 | integrity sha1-zg6+ql94yxiSXqfYENe1mwEP1RU= 1581 | 1582 | path-is-absolute@^1.0.0: 1583 | version "1.0.1" 1584 | resolved "https://registry.yarnpkg.com/path-is-absolute/-/path-is-absolute-1.0.1.tgz#174b9268735534ffbc7ace6bf53a5a9e1b5c5f5f" 1585 | integrity sha1-F0uSaHNVNP+8es5r9TpanhtcX18= 1586 | 1587 | path-is-inside@^1.0.1: 1588 | version "1.0.2" 1589 | resolved "https://registry.yarnpkg.com/path-is-inside/-/path-is-inside-1.0.2.tgz#365417dede44430d1c11af61027facf074bdfc53" 1590 | integrity sha1-NlQX3t5EQw0cEa9hAn+s8HS9/FM= 1591 | 1592 | path-key@^2.0.0, path-key@^2.0.1: 1593 | version "2.0.1" 1594 | resolved "https://registry.yarnpkg.com/path-key/-/path-key-2.0.1.tgz#411cadb574c5a140d3a4b1910d40d80cc9f40b40" 1595 | integrity sha1-QRyttXTFoUDTpLGRDUDYDMn0C0A= 1596 | 1597 | path-parse@^1.0.6: 1598 | version "1.0.7" 1599 | resolved "https://registry.yarnpkg.com/path-parse/-/path-parse-1.0.7.tgz#fbc114b60ca42b30d9daf5858e4bd68bbedb6735" 1600 | integrity sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw== 1601 | 1602 | pify@^3.0.0: 1603 | version "3.0.0" 1604 | resolved "https://registry.yarnpkg.com/pify/-/pify-3.0.0.tgz#e5a4acd2c101fdf3d9a4d07f0dbc4db49dd28176" 1605 | integrity sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY= 1606 | 1607 | posix-character-classes@^0.1.0: 1608 | version "0.1.1" 1609 | resolved "https://registry.yarnpkg.com/posix-character-classes/-/posix-character-classes-0.1.1.tgz#01eac0fe3b5af71a2a6c02feabb8c1fef7e00eab" 1610 | integrity sha1-AerA/jta9xoqbAL+q7jB/vfgDqs= 1611 | 1612 | prepend-http@^1.0.1: 1613 | version "1.0.4" 1614 | resolved "https://registry.yarnpkg.com/prepend-http/-/prepend-http-1.0.4.tgz#d4f4562b0ce3696e41ac52d0e002e57a635dc6dc" 1615 | integrity sha1-1PRWKwzjaW5BrFLQ4ALlemNdxtw= 1616 | 1617 | process-nextick-args@~2.0.0: 1618 | version "2.0.1" 1619 | resolved "https://registry.yarnpkg.com/process-nextick-args/-/process-nextick-args-2.0.1.tgz#7820d9b16120cc55ca9ae7792680ae7dba6d7fe2" 1620 | integrity sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag== 1621 | 1622 | pseudomap@^1.0.2: 1623 | version "1.0.2" 1624 | resolved "https://registry.yarnpkg.com/pseudomap/-/pseudomap-1.0.2.tgz#f052a28da70e618917ef0a8ac34c1ae5a68286b3" 1625 | integrity sha1-8FKijacOYYkX7wqKw0wa5aaChrM= 1626 | 1627 | pstree.remy@^1.1.6: 1628 | version "1.1.7" 1629 | resolved "https://registry.yarnpkg.com/pstree.remy/-/pstree.remy-1.1.7.tgz#c76963a28047ed61542dc361aa26ee55a7fa15f3" 1630 | integrity sha512-xsMgrUwRpuGskEzBFkH8NmTimbZ5PcPup0LA8JJkHIm2IMUbQcpo3yeLNWVrufEYjh8YwtSVh0xz6UeWc5Oh5A== 1631 | 1632 | pump@^3.0.0: 1633 | version "3.0.0" 1634 | resolved "https://registry.yarnpkg.com/pump/-/pump-3.0.0.tgz#b4a2116815bde2f4e1ea602354e8c75565107a64" 1635 | integrity sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww== 1636 | dependencies: 1637 | end-of-stream "^1.1.0" 1638 | once "^1.3.1" 1639 | 1640 | random-emoji@^1.0.2: 1641 | version "1.0.2" 1642 | resolved "https://registry.yarnpkg.com/random-emoji/-/random-emoji-1.0.2.tgz#578298377f56baba45f6ad4797da1a0303321e8c" 1643 | integrity sha1-V4KYN39WurpF9q1Hl9oaAwMyHow= 1644 | dependencies: 1645 | emoji-named-characters "^1.0.2" 1646 | lodash.shuffle "^4.1.0" 1647 | 1648 | rc@^1.0.1, rc@^1.1.6, rc@^1.2.7: 1649 | version "1.2.8" 1650 | resolved "https://registry.yarnpkg.com/rc/-/rc-1.2.8.tgz#cd924bf5200a075b83c188cd6b9e211b7fc0d3ed" 1651 | integrity sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw== 1652 | dependencies: 1653 | deep-extend "^0.6.0" 1654 | ini "~1.3.0" 1655 | minimist "^1.2.0" 1656 | strip-json-comments "~2.0.1" 1657 | 1658 | read-pkg@^4.0.1: 1659 | version "4.0.1" 1660 | resolved "https://registry.yarnpkg.com/read-pkg/-/read-pkg-4.0.1.tgz#963625378f3e1c4d48c85872b5a6ec7d5d093237" 1661 | integrity sha1-ljYlN48+HE1IyFhytabsfV0JMjc= 1662 | dependencies: 1663 | normalize-package-data "^2.3.2" 1664 | parse-json "^4.0.0" 1665 | pify "^3.0.0" 1666 | 1667 | readable-stream@^2.0.2, readable-stream@^2.0.6: 1668 | version "2.3.6" 1669 | resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-2.3.6.tgz#b11c27d88b8ff1fbe070643cf94b0c79ae1b0aaf" 1670 | integrity sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw== 1671 | dependencies: 1672 | core-util-is "~1.0.0" 1673 | inherits "~2.0.3" 1674 | isarray "~1.0.0" 1675 | process-nextick-args "~2.0.0" 1676 | safe-buffer "~5.1.1" 1677 | string_decoder "~1.1.1" 1678 | util-deprecate "~1.0.1" 1679 | 1680 | readdirp@^2.2.1: 1681 | version "2.2.1" 1682 | resolved "https://registry.yarnpkg.com/readdirp/-/readdirp-2.2.1.tgz#0e87622a3325aa33e892285caf8b4e846529a525" 1683 | integrity sha512-1JU/8q+VgFZyxwrJ+SVIOsh+KywWGpds3NTqikiKpDMZWScmAYyKIgqkO+ARvNWJfXeXR1zxz7aHF4u4CyH6vQ== 1684 | dependencies: 1685 | graceful-fs "^4.1.11" 1686 | micromatch "^3.1.10" 1687 | readable-stream "^2.0.2" 1688 | 1689 | reflect-metadata@^0.1.13: 1690 | version "0.1.13" 1691 | resolved "https://registry.yarnpkg.com/reflect-metadata/-/reflect-metadata-0.1.13.tgz#67ae3ca57c972a2aa1642b10fe363fe32d49dc08" 1692 | integrity sha512-Ts1Y/anZELhSsjMcU605fU9RE4Oi3p5ORujwbIKXfWa+0Zxs510Qrmrce5/Jowq3cHSZSJqBjypxmHarc+vEWg== 1693 | 1694 | regex-not@^1.0.0, regex-not@^1.0.2: 1695 | version "1.0.2" 1696 | resolved "https://registry.yarnpkg.com/regex-not/-/regex-not-1.0.2.tgz#1f4ece27e00b0b65e0247a6810e6a85d83a5752c" 1697 | integrity sha512-J6SDjUgDxQj5NusnOtdFxDwN/+HWykR8GELwctJ7mdqhcyy1xEc4SRFHUXvxTp661YaVKAjfRLZ9cCqS6tn32A== 1698 | dependencies: 1699 | extend-shallow "^3.0.2" 1700 | safe-regex "^1.1.0" 1701 | 1702 | regexp-clone@1.0.0, regexp-clone@^1.0.0: 1703 | version "1.0.0" 1704 | resolved "https://registry.yarnpkg.com/regexp-clone/-/regexp-clone-1.0.0.tgz#222db967623277056260b992626354a04ce9bf63" 1705 | integrity sha512-TuAasHQNamyyJ2hb97IuBEif4qBHGjPHBS64sZwytpLEqtBQ1gPJTnOaQ6qmpET16cK14kkjbazl6+p0RRv0yw== 1706 | 1707 | registry-auth-token@^3.0.1: 1708 | version "3.4.0" 1709 | resolved "https://registry.yarnpkg.com/registry-auth-token/-/registry-auth-token-3.4.0.tgz#d7446815433f5d5ed6431cd5dca21048f66b397e" 1710 | integrity sha512-4LM6Fw8eBQdwMYcES4yTnn2TqIasbXuwDx3um+QRs7S55aMKCBKBxvPXl2RiUjHwuJLTyYfxSpmfSAjQpcuP+A== 1711 | dependencies: 1712 | rc "^1.1.6" 1713 | safe-buffer "^5.0.1" 1714 | 1715 | registry-url@^3.0.3: 1716 | version "3.1.0" 1717 | resolved "https://registry.yarnpkg.com/registry-url/-/registry-url-3.1.0.tgz#3d4ef870f73dde1d77f0cf9a381432444e174942" 1718 | integrity sha1-PU74cPc93h138M+aOBQyRE4XSUI= 1719 | dependencies: 1720 | rc "^1.0.1" 1721 | 1722 | remove-trailing-separator@^1.0.1: 1723 | version "1.1.0" 1724 | resolved "https://registry.yarnpkg.com/remove-trailing-separator/-/remove-trailing-separator-1.1.0.tgz#c24bce2a283adad5bc3f58e0d48249b92379d8ef" 1725 | integrity sha1-wkvOKig62tW8P1jg1IJJuSN52O8= 1726 | 1727 | repeat-element@^1.1.2: 1728 | version "1.1.3" 1729 | resolved "https://registry.yarnpkg.com/repeat-element/-/repeat-element-1.1.3.tgz#782e0d825c0c5a3bb39731f84efee6b742e6b1ce" 1730 | integrity sha512-ahGq0ZnV5m5XtZLMb+vP76kcAM5nkLqk0lpqAuojSKGgQtn4eRi4ZZGm2olo2zKFH+sMsWaqOCW1dqAnOru72g== 1731 | 1732 | repeat-string@^1.6.1: 1733 | version "1.6.1" 1734 | resolved "https://registry.yarnpkg.com/repeat-string/-/repeat-string-1.6.1.tgz#8dcae470e1c88abc2d600fff4a776286da75e637" 1735 | integrity sha1-jcrkcOHIirwtYA//Sndihtp15jc= 1736 | 1737 | require-directory@^2.1.1: 1738 | version "2.1.1" 1739 | resolved "https://registry.yarnpkg.com/require-directory/-/require-directory-2.1.1.tgz#8c64ad5fd30dab1c976e2344ffe7f792a6a6df42" 1740 | integrity sha1-jGStX9MNqxyXbiNE/+f3kqam30I= 1741 | 1742 | require-main-filename@^1.0.1: 1743 | version "1.0.1" 1744 | resolved "https://registry.yarnpkg.com/require-main-filename/-/require-main-filename-1.0.1.tgz#97f717b69d48784f5f526a6c5aa8ffdda055a4d1" 1745 | integrity sha1-l/cXtp1IeE9fUmpsWqj/3aBVpNE= 1746 | 1747 | require_optional@^1.0.1: 1748 | version "1.0.1" 1749 | resolved "https://registry.yarnpkg.com/require_optional/-/require_optional-1.0.1.tgz#4cf35a4247f64ca3df8c2ef208cc494b1ca8fc2e" 1750 | integrity sha512-qhM/y57enGWHAe3v/NcwML6a3/vfESLe/sGM2dII+gEO0BpKRUkWZow/tyloNqJyN6kXSl3RyyM8Ll5D/sJP8g== 1751 | dependencies: 1752 | resolve-from "^2.0.0" 1753 | semver "^5.1.0" 1754 | 1755 | resolve-from@^2.0.0: 1756 | version "2.0.0" 1757 | resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-2.0.0.tgz#9480ab20e94ffa1d9e80a804c7ea147611966b57" 1758 | integrity sha1-lICrIOlP+h2egKgEx+oUdhGWa1c= 1759 | 1760 | resolve-url@^0.2.1: 1761 | version "0.2.1" 1762 | resolved "https://registry.yarnpkg.com/resolve-url/-/resolve-url-0.2.1.tgz#2c637fe77c893afd2a663fe21aa9080068e2052a" 1763 | integrity sha1-LGN/53yJOv0qZj/iGqkIAGjiBSo= 1764 | 1765 | resolve@^1.10.0: 1766 | version "1.12.0" 1767 | resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.12.0.tgz#3fc644a35c84a48554609ff26ec52b66fa577df6" 1768 | integrity sha512-B/dOmuoAik5bKcD6s6nXDCjzUKnaDvdkRyAk6rsmsKLipWj4797iothd7jmmUhWTfinVMU+wc56rYKsit2Qy4w== 1769 | dependencies: 1770 | path-parse "^1.0.6" 1771 | 1772 | ret@~0.1.10: 1773 | version "0.1.15" 1774 | resolved "https://registry.yarnpkg.com/ret/-/ret-0.1.15.tgz#b8a4825d5bdb1fc3f6f53c2bc33f81388681c7bc" 1775 | integrity sha512-TTlYpa+OL+vMMNG24xSlQGEJ3B/RzEfUlLct7b5G/ytav+wPrplCpVMFuwzXbkecJrb6IYo1iFb0S9v37754mg== 1776 | 1777 | rimraf@^2.6.1: 1778 | version "2.7.1" 1779 | resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-2.7.1.tgz#35797f13a7fdadc566142c29d4f07ccad483e3ec" 1780 | integrity sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w== 1781 | dependencies: 1782 | glob "^7.1.3" 1783 | 1784 | rxjs@^6.5.2: 1785 | version "6.5.3" 1786 | resolved "https://registry.yarnpkg.com/rxjs/-/rxjs-6.5.3.tgz#510e26317f4db91a7eb1de77d9dd9ba0a4899a3a" 1787 | integrity sha512-wuYsAYYFdWTAnAaPoKGNhfpWwKZbJW+HgAJ+mImp+Epl7BG8oNWBCTyRM8gba9k4lk8BgWdoYm21Mo/RYhhbgA== 1788 | dependencies: 1789 | tslib "^1.9.0" 1790 | 1791 | safe-buffer@5.1.2, safe-buffer@~5.1.0, safe-buffer@~5.1.1: 1792 | version "5.1.2" 1793 | resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.1.2.tgz#991ec69d296e0313747d59bdfd2b745c35f8828d" 1794 | integrity sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g== 1795 | 1796 | safe-buffer@^5.0.1, safe-buffer@^5.1.2, safe-buffer@^5.2.1: 1797 | version "5.2.1" 1798 | resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.2.1.tgz#1eaf9fa9bdb1fdd4ec75f58f9cdb4e6b7827eec6" 1799 | integrity sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ== 1800 | 1801 | safe-regex@^1.1.0: 1802 | version "1.1.0" 1803 | resolved "https://registry.yarnpkg.com/safe-regex/-/safe-regex-1.1.0.tgz#40a3669f3b077d1e943d44629e157dd48023bf2e" 1804 | integrity sha1-QKNmnzsHfR6UPURinhV91IAjvy4= 1805 | dependencies: 1806 | ret "~0.1.10" 1807 | 1808 | "safer-buffer@>= 2.1.2 < 3": 1809 | version "2.1.2" 1810 | resolved "https://registry.yarnpkg.com/safer-buffer/-/safer-buffer-2.1.2.tgz#44fa161b0187b9549dd84bb91802f9bd8385cd6a" 1811 | integrity sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg== 1812 | 1813 | sandwich-stream@^2.0.1: 1814 | version "2.0.2" 1815 | resolved "https://registry.yarnpkg.com/sandwich-stream/-/sandwich-stream-2.0.2.tgz#6d1feb6cf7e9fe9fadb41513459a72c2e84000fa" 1816 | integrity sha512-jLYV0DORrzY3xaz/S9ydJL6Iz7essZeAfnAavsJ+zsJGZ1MOnsS52yRjU3uF3pJa/lla7+wisp//fxOwOH8SKQ== 1817 | 1818 | sax@^1.2.4: 1819 | version "1.2.4" 1820 | resolved "https://registry.yarnpkg.com/sax/-/sax-1.2.4.tgz#2816234e2378bddc4e5354fab5caa895df7100d9" 1821 | integrity sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw== 1822 | 1823 | semaphore-async-await@^1.5.1: 1824 | version "1.5.1" 1825 | resolved "https://registry.yarnpkg.com/semaphore-async-await/-/semaphore-async-await-1.5.1.tgz#857bef5e3644601ca4b9570b87e9df5ca12974fa" 1826 | integrity sha1-hXvvXjZEYBykuVcLh+nfXKEpdPo= 1827 | 1828 | semver-diff@^2.0.0: 1829 | version "2.1.0" 1830 | resolved "https://registry.yarnpkg.com/semver-diff/-/semver-diff-2.1.0.tgz#4bbb8437c8d37e4b0cf1a68fd726ec6d645d6d36" 1831 | integrity sha1-S7uEN8jTfksM8aaP1ybsbWRdbTY= 1832 | dependencies: 1833 | semver "^5.0.3" 1834 | 1835 | "semver@2 || 3 || 4 || 5", semver@^5.0.3, semver@^5.1.0, semver@^5.3.0, semver@^5.5.0: 1836 | version "5.7.1" 1837 | resolved "https://registry.yarnpkg.com/semver/-/semver-5.7.1.tgz#a954f931aeba508d307bbf069eff0c01c96116f7" 1838 | integrity sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ== 1839 | 1840 | set-blocking@^2.0.0, set-blocking@~2.0.0: 1841 | version "2.0.0" 1842 | resolved "https://registry.yarnpkg.com/set-blocking/-/set-blocking-2.0.0.tgz#045f9782d011ae9a6803ddd382b24392b3d890f7" 1843 | integrity sha1-BF+XgtARrppoA93TgrJDkrPYkPc= 1844 | 1845 | set-value@^2.0.0, set-value@^2.0.1: 1846 | version "2.0.1" 1847 | resolved "https://registry.yarnpkg.com/set-value/-/set-value-2.0.1.tgz#a18d40530e6f07de4228c7defe4227af8cad005b" 1848 | integrity sha512-JxHc1weCN68wRY0fhCoXpyK55m/XPHafOmK4UWD7m2CI14GMcFypt4w/0+NV5f/ZMby2F6S2wwA7fgynh9gWSw== 1849 | dependencies: 1850 | extend-shallow "^2.0.1" 1851 | is-extendable "^0.1.1" 1852 | is-plain-object "^2.0.3" 1853 | split-string "^3.0.1" 1854 | 1855 | shebang-command@^1.2.0: 1856 | version "1.2.0" 1857 | resolved "https://registry.yarnpkg.com/shebang-command/-/shebang-command-1.2.0.tgz#44aac65b695b03398968c39f363fee5deafdf1ea" 1858 | integrity sha1-RKrGW2lbAzmJaMOfNj/uXer98eo= 1859 | dependencies: 1860 | shebang-regex "^1.0.0" 1861 | 1862 | shebang-regex@^1.0.0: 1863 | version "1.0.0" 1864 | resolved "https://registry.yarnpkg.com/shebang-regex/-/shebang-regex-1.0.0.tgz#da42f49740c0b42db2ca9728571cb190c98efea3" 1865 | integrity sha1-2kL0l0DAtC2yypcoVxyxkMmO/qM= 1866 | 1867 | sift@7.0.1: 1868 | version "7.0.1" 1869 | resolved "https://registry.yarnpkg.com/sift/-/sift-7.0.1.tgz#47d62c50b159d316f1372f8b53f9c10cd21a4b08" 1870 | integrity sha512-oqD7PMJ+uO6jV9EQCl0LrRw1OwsiPsiFQR5AR30heR+4Dl7jBBbDLnNvWiak20tzZlSE1H7RB30SX/1j/YYT7g== 1871 | 1872 | signal-exit@^3.0.0, signal-exit@^3.0.2: 1873 | version "3.0.2" 1874 | resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.2.tgz#b5fdc08f1287ea1178628e415e25132b73646c6d" 1875 | integrity sha1-tf3AjxKH6hF4Yo5BXiUTK3NkbG0= 1876 | 1877 | sliced@1.0.1: 1878 | version "1.0.1" 1879 | resolved "https://registry.yarnpkg.com/sliced/-/sliced-1.0.1.tgz#0b3a662b5d04c3177b1926bea82b03f837a2ef41" 1880 | integrity sha1-CzpmK10Ewxd7GSa+qCsD+Dei70E= 1881 | 1882 | snapdragon-node@^2.0.1: 1883 | version "2.1.1" 1884 | resolved "https://registry.yarnpkg.com/snapdragon-node/-/snapdragon-node-2.1.1.tgz#6c175f86ff14bdb0724563e8f3c1b021a286853b" 1885 | integrity sha512-O27l4xaMYt/RSQ5TR3vpWCAB5Kb/czIcqUFOM/C4fYcLnbZUc1PkjTAMjof2pBWaSTwOUd6qUHcFGVGj7aIwnw== 1886 | dependencies: 1887 | define-property "^1.0.0" 1888 | isobject "^3.0.0" 1889 | snapdragon-util "^3.0.1" 1890 | 1891 | snapdragon-util@^3.0.1: 1892 | version "3.0.1" 1893 | resolved "https://registry.yarnpkg.com/snapdragon-util/-/snapdragon-util-3.0.1.tgz#f956479486f2acd79700693f6f7b805e45ab56e2" 1894 | integrity sha512-mbKkMdQKsjX4BAL4bRYTj21edOf8cN7XHdYUJEe+Zn99hVEYcMvKPct1IqNe7+AZPirn8BCDOQBHQZknqmKlZQ== 1895 | dependencies: 1896 | kind-of "^3.2.0" 1897 | 1898 | snapdragon@^0.8.1: 1899 | version "0.8.2" 1900 | resolved "https://registry.yarnpkg.com/snapdragon/-/snapdragon-0.8.2.tgz#64922e7c565b0e14204ba1aa7d6964278d25182d" 1901 | integrity sha512-FtyOnWN/wCHTVXOMwvSv26d+ko5vWlIDD6zoUJ7LW8vh+ZBC8QdljveRP+crNrtBwioEUWy/4dMtbBjA4ioNlg== 1902 | dependencies: 1903 | base "^0.11.1" 1904 | debug "^2.2.0" 1905 | define-property "^0.2.5" 1906 | extend-shallow "^2.0.1" 1907 | map-cache "^0.2.2" 1908 | source-map "^0.5.6" 1909 | source-map-resolve "^0.5.0" 1910 | use "^3.1.0" 1911 | 1912 | source-map-resolve@^0.5.0: 1913 | version "0.5.2" 1914 | resolved "https://registry.yarnpkg.com/source-map-resolve/-/source-map-resolve-0.5.2.tgz#72e2cc34095543e43b2c62b2c4c10d4a9054f259" 1915 | integrity sha512-MjqsvNwyz1s0k81Goz/9vRBe9SZdB09Bdw+/zYyO+3CuPk6fouTaxscHkgtE8jKvf01kVfl8riHzERQ/kefaSA== 1916 | dependencies: 1917 | atob "^2.1.1" 1918 | decode-uri-component "^0.2.0" 1919 | resolve-url "^0.2.1" 1920 | source-map-url "^0.4.0" 1921 | urix "^0.1.0" 1922 | 1923 | source-map-url@^0.4.0: 1924 | version "0.4.0" 1925 | resolved "https://registry.yarnpkg.com/source-map-url/-/source-map-url-0.4.0.tgz#3e935d7ddd73631b97659956d55128e87b5084a3" 1926 | integrity sha1-PpNdfd1zYxuXZZlW1VEo6HtQhKM= 1927 | 1928 | source-map@^0.5.6: 1929 | version "0.5.7" 1930 | resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.5.7.tgz#8a039d2d1021d22d1ea14c80d8ea468ba2ef3fcc" 1931 | integrity sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w= 1932 | 1933 | spawn-command@^0.0.2-1: 1934 | version "0.0.2-1" 1935 | resolved "https://registry.yarnpkg.com/spawn-command/-/spawn-command-0.0.2-1.tgz#62f5e9466981c1b796dc5929937e11c9c6921bd0" 1936 | integrity sha1-YvXpRmmBwbeW3Fkpk34RycaSG9A= 1937 | 1938 | spdx-correct@^3.0.0: 1939 | version "3.1.0" 1940 | resolved "https://registry.yarnpkg.com/spdx-correct/-/spdx-correct-3.1.0.tgz#fb83e504445268f154b074e218c87c003cd31df4" 1941 | integrity sha512-lr2EZCctC2BNR7j7WzJ2FpDznxky1sjfxvvYEyzxNyb6lZXHODmEoJeFu4JupYlkfha1KZpJyoqiJ7pgA1qq8Q== 1942 | dependencies: 1943 | spdx-expression-parse "^3.0.0" 1944 | spdx-license-ids "^3.0.0" 1945 | 1946 | spdx-exceptions@^2.1.0: 1947 | version "2.2.0" 1948 | resolved "https://registry.yarnpkg.com/spdx-exceptions/-/spdx-exceptions-2.2.0.tgz#2ea450aee74f2a89bfb94519c07fcd6f41322977" 1949 | integrity sha512-2XQACfElKi9SlVb1CYadKDXvoajPgBVPn/gOQLrTvHdElaVhr7ZEbqJaRnJLVNeaI4cMEAgVCeBMKF6MWRDCRA== 1950 | 1951 | spdx-expression-parse@^3.0.0: 1952 | version "3.0.0" 1953 | resolved "https://registry.yarnpkg.com/spdx-expression-parse/-/spdx-expression-parse-3.0.0.tgz#99e119b7a5da00e05491c9fa338b7904823b41d0" 1954 | integrity sha512-Yg6D3XpRD4kkOmTpdgbUiEJFKghJH03fiC1OPll5h/0sO6neh2jqRDVHOQ4o/LMea0tgCkbMgea5ip/e+MkWyg== 1955 | dependencies: 1956 | spdx-exceptions "^2.1.0" 1957 | spdx-license-ids "^3.0.0" 1958 | 1959 | spdx-license-ids@^3.0.0: 1960 | version "3.0.5" 1961 | resolved "https://registry.yarnpkg.com/spdx-license-ids/-/spdx-license-ids-3.0.5.tgz#3694b5804567a458d3c8045842a6358632f62654" 1962 | integrity sha512-J+FWzZoynJEXGphVIS+XEh3kFSjZX/1i9gFBaWQcB+/tmpe2qUsSBABpcxqxnAxFdiUFEgAX1bjYGQvIZmoz9Q== 1963 | 1964 | split-string@^3.0.1, split-string@^3.0.2: 1965 | version "3.1.0" 1966 | resolved "https://registry.yarnpkg.com/split-string/-/split-string-3.1.0.tgz#7cb09dda3a86585705c64b39a6466038682e8fe2" 1967 | integrity sha512-NzNVhJDYpwceVVii8/Hu6DKfD2G+NrQHlS/V/qgv763EYudVwEcMQNxd2lh+0VrUByXN/oJkl5grOhYWvQUYiw== 1968 | dependencies: 1969 | extend-shallow "^3.0.0" 1970 | 1971 | sprintf-js@~1.0.2: 1972 | version "1.0.3" 1973 | resolved "https://registry.yarnpkg.com/sprintf-js/-/sprintf-js-1.0.3.tgz#04e6926f662895354f3dd015203633b857297e2c" 1974 | integrity sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw= 1975 | 1976 | static-extend@^0.1.1: 1977 | version "0.1.2" 1978 | resolved "https://registry.yarnpkg.com/static-extend/-/static-extend-0.1.2.tgz#60809c39cbff55337226fd5e0b520f341f1fb5c6" 1979 | integrity sha1-YICcOcv/VTNyJv1eC1IPNB8ftcY= 1980 | dependencies: 1981 | define-property "^0.2.5" 1982 | object-copy "^0.1.0" 1983 | 1984 | string-width@^1.0.1: 1985 | version "1.0.2" 1986 | resolved "https://registry.yarnpkg.com/string-width/-/string-width-1.0.2.tgz#118bdf5b8cdc51a2a7e70d211e07e2b0b9b107d3" 1987 | integrity sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M= 1988 | dependencies: 1989 | code-point-at "^1.0.0" 1990 | is-fullwidth-code-point "^1.0.0" 1991 | strip-ansi "^3.0.0" 1992 | 1993 | "string-width@^1.0.2 || 2", string-width@^2.0.0, string-width@^2.1.1: 1994 | version "2.1.1" 1995 | resolved "https://registry.yarnpkg.com/string-width/-/string-width-2.1.1.tgz#ab93f27a8dc13d28cac815c462143a6d9012ae9e" 1996 | integrity sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw== 1997 | dependencies: 1998 | is-fullwidth-code-point "^2.0.0" 1999 | strip-ansi "^4.0.0" 2000 | 2001 | string_decoder@~1.1.1: 2002 | version "1.1.1" 2003 | resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.1.1.tgz#9cf1611ba62685d7030ae9e4ba34149c3af03fc8" 2004 | integrity sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg== 2005 | dependencies: 2006 | safe-buffer "~5.1.0" 2007 | 2008 | strip-ansi@^3.0.0, strip-ansi@^3.0.1: 2009 | version "3.0.1" 2010 | resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-3.0.1.tgz#6a385fb8853d952d5ff05d0e8aaf94278dc63dcf" 2011 | integrity sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8= 2012 | dependencies: 2013 | ansi-regex "^2.0.0" 2014 | 2015 | strip-ansi@^4.0.0: 2016 | version "4.0.0" 2017 | resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-4.0.0.tgz#a8479022eb1ac368a871389b635262c505ee368f" 2018 | integrity sha1-qEeQIusaw2iocTibY1JixQXuNo8= 2019 | dependencies: 2020 | ansi-regex "^3.0.0" 2021 | 2022 | strip-eof@^1.0.0: 2023 | version "1.0.0" 2024 | resolved "https://registry.yarnpkg.com/strip-eof/-/strip-eof-1.0.0.tgz#bb43ff5598a6eb05d89b59fcd129c983313606bf" 2025 | integrity sha1-u0P/VZim6wXYm1n80SnJgzE2Br8= 2026 | 2027 | strip-json-comments@~2.0.1: 2028 | version "2.0.1" 2029 | resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-2.0.1.tgz#3c531942e908c2697c0ec344858c286c7ca0a60a" 2030 | integrity sha1-PFMZQukIwml8DsNEhYwobHygpgo= 2031 | 2032 | supports-color@^4.5.0: 2033 | version "4.5.0" 2034 | resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-4.5.0.tgz#be7a0de484dec5c5cddf8b3d59125044912f635b" 2035 | integrity sha1-vnoN5ITexcXN34s9WRJQRJEvY1s= 2036 | dependencies: 2037 | has-flag "^2.0.0" 2038 | 2039 | supports-color@^5.2.0, supports-color@^5.3.0: 2040 | version "5.5.0" 2041 | resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-5.5.0.tgz#e2e69a44ac8772f78a1ec0b35b689df6530efc8f" 2042 | integrity sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow== 2043 | dependencies: 2044 | has-flag "^3.0.0" 2045 | 2046 | tar@^4: 2047 | version "4.4.19" 2048 | resolved "https://registry.yarnpkg.com/tar/-/tar-4.4.19.tgz#2e4d7263df26f2b914dee10c825ab132123742f3" 2049 | integrity sha512-a20gEsvHnWe0ygBY8JbxoM4w3SJdhc7ZAuxkLqh+nvNQN2IOt0B5lLgM490X5Hl8FF0dl0tOf2ewFYAlIFgzVA== 2050 | dependencies: 2051 | chownr "^1.1.4" 2052 | fs-minipass "^1.2.7" 2053 | minipass "^2.9.0" 2054 | minizlib "^1.3.3" 2055 | mkdirp "^0.5.5" 2056 | safe-buffer "^5.2.1" 2057 | yallist "^3.1.1" 2058 | 2059 | telegraf-i18n@^6.6.0: 2060 | version "6.6.0" 2061 | resolved "https://registry.yarnpkg.com/telegraf-i18n/-/telegraf-i18n-6.6.0.tgz#d75a5247bd4b6678f051b370871fca9488c61952" 2062 | integrity sha512-xe8ztg9lh5IoN0xjlHpuNkF/b2+HGMYEDwURFYaKbUIavNSXpB5B48WeOJ6MySEAIRNegc+S9lLzJcb4JBPX0g== 2063 | dependencies: 2064 | compile-template "^0.3.1" 2065 | debug "^4.0.1" 2066 | js-yaml "^3.6.1" 2067 | 2068 | telegraf@^3.32.0: 2069 | version "3.32.0" 2070 | resolved "https://registry.yarnpkg.com/telegraf/-/telegraf-3.32.0.tgz#70ec304b9c8645f8988924ebe90e5c00ee46ddbb" 2071 | integrity sha512-5ZHiovyuG1rVLygJjaqf57wDt8e1nijAinKXCxN1tyUZ4BcrkZW/z5rVTEXA+KegpFbWxKKv3KnJwUJrKDqD0Q== 2072 | dependencies: 2073 | "@types/node" "^12.0.4" 2074 | debug "^4.0.1" 2075 | node-fetch "^2.2.0" 2076 | sandwich-stream "^2.0.1" 2077 | telegram-typings "^3.6.0" 2078 | 2079 | telegram-typings@^3.6.0: 2080 | version "3.6.1" 2081 | resolved "https://registry.yarnpkg.com/telegram-typings/-/telegram-typings-3.6.1.tgz#1288d547f8694b61f1c01c2993e295f3114d9e25" 2082 | integrity sha512-njVv1EAhIZnmQVLocZEADYUyqA1WIXuVcDYlsp+mXua/XB0pxx+PKtMSPeZ/EE4wPWTw9h/hA9ASTT6yQelkiw== 2083 | 2084 | term-size@^1.2.0: 2085 | version "1.2.0" 2086 | resolved "https://registry.yarnpkg.com/term-size/-/term-size-1.2.0.tgz#458b83887f288fc56d6fffbfad262e26638efa69" 2087 | integrity sha1-RYuDiH8oj8Vtb/+/rSYuJmOO+mk= 2088 | dependencies: 2089 | execa "^0.7.0" 2090 | 2091 | timed-out@^4.0.0: 2092 | version "4.0.1" 2093 | resolved "https://registry.yarnpkg.com/timed-out/-/timed-out-4.0.1.tgz#f32eacac5a175bea25d7fab565ab3ed8741ef56f" 2094 | integrity sha1-8y6srFoXW+ol1/q1Zas+2HQe9W8= 2095 | 2096 | to-object-path@^0.3.0: 2097 | version "0.3.0" 2098 | resolved "https://registry.yarnpkg.com/to-object-path/-/to-object-path-0.3.0.tgz#297588b7b0e7e0ac08e04e672f85c1f4999e17af" 2099 | integrity sha1-KXWIt7Dn4KwI4E5nL4XB9JmeF68= 2100 | dependencies: 2101 | kind-of "^3.0.2" 2102 | 2103 | to-regex-range@^2.1.0: 2104 | version "2.1.1" 2105 | resolved "https://registry.yarnpkg.com/to-regex-range/-/to-regex-range-2.1.1.tgz#7c80c17b9dfebe599e27367e0d4dd5590141db38" 2106 | integrity sha1-fIDBe53+vlmeJzZ+DU3VWQFB2zg= 2107 | dependencies: 2108 | is-number "^3.0.0" 2109 | repeat-string "^1.6.1" 2110 | 2111 | to-regex@^3.0.1, to-regex@^3.0.2: 2112 | version "3.0.2" 2113 | resolved "https://registry.yarnpkg.com/to-regex/-/to-regex-3.0.2.tgz#13cfdd9b336552f30b51f33a8ae1b42a7a7599ce" 2114 | integrity sha512-FWtleNAtZ/Ki2qtqej2CXTOayOH9bHDQF+Q48VpWyDXjbYxA4Yz8iDB31zXOBUlOHHKidDbqGVrTUvQMPmBGBw== 2115 | dependencies: 2116 | define-property "^2.0.2" 2117 | extend-shallow "^3.0.2" 2118 | regex-not "^1.0.2" 2119 | safe-regex "^1.1.0" 2120 | 2121 | touch@^3.1.0: 2122 | version "3.1.0" 2123 | resolved "https://registry.yarnpkg.com/touch/-/touch-3.1.0.tgz#fe365f5f75ec9ed4e56825e0bb76d24ab74af83b" 2124 | integrity sha512-WBx8Uy5TLtOSRtIq+M03/sKDrXCLHxwDcquSP2c43Le03/9serjQBIztjRz6FkJez9D/hleyAXTBGLwwZUw9lA== 2125 | dependencies: 2126 | nopt "~1.0.10" 2127 | 2128 | tree-kill@^1.2.1: 2129 | version "1.2.2" 2130 | resolved "https://registry.yarnpkg.com/tree-kill/-/tree-kill-1.2.2.tgz#4ca09a9092c88b73a7cdc5e8a01b507b0790a0cc" 2131 | integrity sha512-L0Orpi8qGpRG//Nd+H90vFB+3iHnue1zSSGmNOOCh1GLJ7rUKVwV2HvijphGQS2UmhUZewS9VgvxYIdgr+fG1A== 2132 | 2133 | tslib@^1.9.0: 2134 | version "1.10.0" 2135 | resolved "https://registry.yarnpkg.com/tslib/-/tslib-1.10.0.tgz#c3c19f95973fb0a62973fb09d90d961ee43e5c8a" 2136 | integrity sha512-qOebF53frne81cf0S9B41ByenJ3/IuH8yJKngAX35CmiZySA0khhkovshKK+jGCaMnVomla7gVlIcc3EvKPbTQ== 2137 | 2138 | typescript@^3.6.3: 2139 | version "3.6.3" 2140 | resolved "https://registry.yarnpkg.com/typescript/-/typescript-3.6.3.tgz#fea942fabb20f7e1ca7164ff626f1a9f3f70b4da" 2141 | integrity sha512-N7bceJL1CtRQ2RiG0AQME13ksR7DiuQh/QehubYcghzv20tnh+MQnQIuJddTmsbqYj+dztchykemz0zFzlvdQw== 2142 | 2143 | undefsafe@^2.0.2: 2144 | version "2.0.2" 2145 | resolved "https://registry.yarnpkg.com/undefsafe/-/undefsafe-2.0.2.tgz#225f6b9e0337663e0d8e7cfd686fc2836ccace76" 2146 | integrity sha1-Il9rngM3Zj4Njnz9aG/Cg2zKznY= 2147 | dependencies: 2148 | debug "^2.2.0" 2149 | 2150 | union-value@^1.0.0: 2151 | version "1.0.1" 2152 | resolved "https://registry.yarnpkg.com/union-value/-/union-value-1.0.1.tgz#0b6fe7b835aecda61c6ea4d4f02c14221e109847" 2153 | integrity sha512-tJfXmxMeWYnczCVs7XAEvIV7ieppALdyepWMkHkwciRpZraG/xwT+s2JN8+pr1+8jCRf80FFzvr+MpQeeoF4Xg== 2154 | dependencies: 2155 | arr-union "^3.1.0" 2156 | get-value "^2.0.6" 2157 | is-extendable "^0.1.1" 2158 | set-value "^2.0.1" 2159 | 2160 | unique-string@^1.0.0: 2161 | version "1.0.0" 2162 | resolved "https://registry.yarnpkg.com/unique-string/-/unique-string-1.0.0.tgz#9e1057cca851abb93398f8b33ae187b99caec11a" 2163 | integrity sha1-nhBXzKhRq7kzmPizOuGHuZyuwRo= 2164 | dependencies: 2165 | crypto-random-string "^1.0.0" 2166 | 2167 | unset-value@^1.0.0: 2168 | version "1.0.0" 2169 | resolved "https://registry.yarnpkg.com/unset-value/-/unset-value-1.0.0.tgz#8376873f7d2335179ffb1e6fc3a8ed0dfc8ab559" 2170 | integrity sha1-g3aHP30jNRef+x5vw6jtDfyKtVk= 2171 | dependencies: 2172 | has-value "^0.3.1" 2173 | isobject "^3.0.0" 2174 | 2175 | unzip-response@^2.0.1: 2176 | version "2.0.1" 2177 | resolved "https://registry.yarnpkg.com/unzip-response/-/unzip-response-2.0.1.tgz#d2f0f737d16b0615e72a6935ed04214572d56f97" 2178 | integrity sha1-0vD3N9FrBhXnKmk17QQhRXLVb5c= 2179 | 2180 | upath@^1.1.1: 2181 | version "1.2.0" 2182 | resolved "https://registry.yarnpkg.com/upath/-/upath-1.2.0.tgz#8f66dbcd55a883acdae4408af8b035a5044c1894" 2183 | integrity sha512-aZwGpamFO61g3OlfT7OQCHqhGnW43ieH9WZeP7QxN/G/jS4jfqUkZxoryvJgVPEcrl5NL/ggHsSmLMHuH64Lhg== 2184 | 2185 | update-notifier@^2.5.0: 2186 | version "2.5.0" 2187 | resolved "https://registry.yarnpkg.com/update-notifier/-/update-notifier-2.5.0.tgz#d0744593e13f161e406acb1d9408b72cad08aff6" 2188 | integrity sha512-gwMdhgJHGuj/+wHJJs9e6PcCszpxR1b236igrOkUofGhqJuG+amlIKwApH1IW1WWl7ovZxsX49lMBWLxSdm5Dw== 2189 | dependencies: 2190 | boxen "^1.2.1" 2191 | chalk "^2.0.1" 2192 | configstore "^3.0.0" 2193 | import-lazy "^2.1.0" 2194 | is-ci "^1.0.10" 2195 | is-installed-globally "^0.1.0" 2196 | is-npm "^1.0.0" 2197 | latest-version "^3.0.0" 2198 | semver-diff "^2.0.0" 2199 | xdg-basedir "^3.0.0" 2200 | 2201 | urix@^0.1.0: 2202 | version "0.1.0" 2203 | resolved "https://registry.yarnpkg.com/urix/-/urix-0.1.0.tgz#da937f7a62e21fec1fd18d49b35c2935067a6c72" 2204 | integrity sha1-2pN/emLiH+wf0Y1Js1wpNQZ6bHI= 2205 | 2206 | url-parse-lax@^1.0.0: 2207 | version "1.0.0" 2208 | resolved "https://registry.yarnpkg.com/url-parse-lax/-/url-parse-lax-1.0.0.tgz#7af8f303645e9bd79a272e7a14ac68bc0609da73" 2209 | integrity sha1-evjzA2Rem9eaJy56FKxovAYJ2nM= 2210 | dependencies: 2211 | prepend-http "^1.0.1" 2212 | 2213 | use@^3.1.0: 2214 | version "3.1.1" 2215 | resolved "https://registry.yarnpkg.com/use/-/use-3.1.1.tgz#d50c8cac79a19fbc20f2911f56eb973f4e10070f" 2216 | integrity sha512-cwESVXlO3url9YWlFW/TA9cshCEhtu7IKJ/p5soJ/gGpj7vbvFrAY/eIioQ6Dw23KjZhYgiIo8HOs1nQ2vr/oQ== 2217 | 2218 | util-deprecate@~1.0.1: 2219 | version "1.0.2" 2220 | resolved "https://registry.yarnpkg.com/util-deprecate/-/util-deprecate-1.0.2.tgz#450d4dc9fa70de732762fbd2d4a28981419a0ccf" 2221 | integrity sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8= 2222 | 2223 | validate-npm-package-license@^3.0.1: 2224 | version "3.0.4" 2225 | resolved "https://registry.yarnpkg.com/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz#fc91f6b9c7ba15c857f4cb2c5defeec39d4f410a" 2226 | integrity sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew== 2227 | dependencies: 2228 | spdx-correct "^3.0.0" 2229 | spdx-expression-parse "^3.0.0" 2230 | 2231 | which-module@^2.0.0: 2232 | version "2.0.0" 2233 | resolved "https://registry.yarnpkg.com/which-module/-/which-module-2.0.0.tgz#d9ef07dce77b9902b8a3a8fa4b31c3e3f7e6e87a" 2234 | integrity sha1-2e8H3Od7mQK4o6j6SzHD4/fm6Ho= 2235 | 2236 | which@^1.2.9: 2237 | version "1.3.1" 2238 | resolved "https://registry.yarnpkg.com/which/-/which-1.3.1.tgz#a45043d54f5805316da8d62f9f50918d3da70b0a" 2239 | integrity sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ== 2240 | dependencies: 2241 | isexe "^2.0.0" 2242 | 2243 | wide-align@^1.1.0: 2244 | version "1.1.3" 2245 | resolved "https://registry.yarnpkg.com/wide-align/-/wide-align-1.1.3.tgz#ae074e6bdc0c14a431e804e624549c633b000457" 2246 | integrity sha512-QGkOQc8XL6Bt5PwnsExKBPuMKBxnGxWWW3fU55Xt4feHozMUhdUMaBCk290qpm/wG5u/RSKzwdAC4i51YigihA== 2247 | dependencies: 2248 | string-width "^1.0.2 || 2" 2249 | 2250 | widest-line@^2.0.0: 2251 | version "2.0.1" 2252 | resolved "https://registry.yarnpkg.com/widest-line/-/widest-line-2.0.1.tgz#7438764730ec7ef4381ce4df82fb98a53142a3fc" 2253 | integrity sha512-Ba5m9/Fa4Xt9eb2ELXt77JxVDV8w7qQrH0zS/TWSJdLyAwQjWoOzpzj5lwVftDz6n/EOu3tNACS84v509qwnJA== 2254 | dependencies: 2255 | string-width "^2.1.1" 2256 | 2257 | wrap-ansi@^2.0.0: 2258 | version "2.1.0" 2259 | resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-2.1.0.tgz#d8fc3d284dd05794fe84973caecdd1cf824fdd85" 2260 | integrity sha1-2Pw9KE3QV5T+hJc8rs3Rz4JP3YU= 2261 | dependencies: 2262 | string-width "^1.0.1" 2263 | strip-ansi "^3.0.1" 2264 | 2265 | wrappy@1: 2266 | version "1.0.2" 2267 | resolved "https://registry.yarnpkg.com/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f" 2268 | integrity sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8= 2269 | 2270 | write-file-atomic@^2.0.0: 2271 | version "2.4.3" 2272 | resolved "https://registry.yarnpkg.com/write-file-atomic/-/write-file-atomic-2.4.3.tgz#1fd2e9ae1df3e75b8d8c367443c692d4ca81f481" 2273 | integrity sha512-GaETH5wwsX+GcnzhPgKcKjJ6M2Cq3/iZp1WyY/X1CSqrW+jVNM9Y7D8EC2sM4ZG/V8wZlSniJnCKWPmBYAucRQ== 2274 | dependencies: 2275 | graceful-fs "^4.1.11" 2276 | imurmurhash "^0.1.4" 2277 | signal-exit "^3.0.2" 2278 | 2279 | xdg-basedir@^3.0.0: 2280 | version "3.0.0" 2281 | resolved "https://registry.yarnpkg.com/xdg-basedir/-/xdg-basedir-3.0.0.tgz#496b2cc109eca8dbacfe2dc72b603c17c5870ad4" 2282 | integrity sha1-SWsswQnsqNus/i3HK2A8F8WHCtQ= 2283 | 2284 | "y18n@^3.2.1 || ^4.0.0": 2285 | version "4.0.0" 2286 | resolved "https://registry.yarnpkg.com/y18n/-/y18n-4.0.0.tgz#95ef94f85ecc81d007c264e190a120f0a3c8566b" 2287 | integrity sha512-r9S/ZyXu/Xu9q1tYlpsLIsa3EeLXXk0VwlxqTcFRfg9EhMW+17kbt9G0NrgCmhGb5vT2hyhJZLfDGx+7+5Uj/w== 2288 | 2289 | yallist@^2.1.2: 2290 | version "2.1.2" 2291 | resolved "https://registry.yarnpkg.com/yallist/-/yallist-2.1.2.tgz#1c11f9218f076089a47dd512f93c6699a6a81d52" 2292 | integrity sha1-HBH5IY8HYImkfdUS+TxmmaaoHVI= 2293 | 2294 | yallist@^3.0.0, yallist@^3.1.1: 2295 | version "3.1.1" 2296 | resolved "https://registry.yarnpkg.com/yallist/-/yallist-3.1.1.tgz#dbb7daf9bfd8bac9ab45ebf602b8cbad0d5d08fd" 2297 | integrity sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g== 2298 | 2299 | yargs-parser@^11.1.1: 2300 | version "11.1.1" 2301 | resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-11.1.1.tgz#879a0865973bca9f6bab5cbdf3b1c67ec7d3bcf4" 2302 | integrity sha512-C6kB/WJDiaxONLJQnF8ccx9SEeoTTLek8RVbaOIsrAUS8VrBEXfmeSnCZxygc+XC2sNMBIwOOnfcxiynjHsVSQ== 2303 | dependencies: 2304 | camelcase "^5.0.0" 2305 | decamelize "^1.2.0" 2306 | 2307 | yargs@^12.0.5: 2308 | version "12.0.5" 2309 | resolved "https://registry.yarnpkg.com/yargs/-/yargs-12.0.5.tgz#05f5997b609647b64f66b81e3b4b10a368e7ad13" 2310 | integrity sha512-Lhz8TLaYnxq/2ObqHDql8dX8CJi97oHxrjUcYtzKbbykPtVW9WB+poxI+NM2UIzsMgNCZTIf0AQwsjK5yMAqZw== 2311 | dependencies: 2312 | cliui "^4.0.0" 2313 | decamelize "^1.2.0" 2314 | find-up "^3.0.0" 2315 | get-caller-file "^1.0.1" 2316 | os-locale "^3.0.0" 2317 | require-directory "^2.1.1" 2318 | require-main-filename "^1.0.1" 2319 | set-blocking "^2.0.0" 2320 | string-width "^2.0.0" 2321 | which-module "^2.0.0" 2322 | y18n "^3.2.1 || ^4.0.0" 2323 | yargs-parser "^11.1.1" 2324 | --------------------------------------------------------------------------------