diff --git a/Source/HTTPServer.js b/Source/HTTPServer.js index d543589..a28c886 100644 --- a/Source/HTTPServer.js +++ b/Source/HTTPServer.js @@ -3,6 +3,8 @@ let http = require("http"); let express = require("express"); let compression = require("compression"); +let {resolve} = require("path"); +const { termoutput } = require("./config"); let server = http.createServer(); let app = express(); server.addListener("request", app); @@ -10,14 +12,12 @@ app.use(compression({ level: 9 })); server.listen(7707,'0.0.0.0',() => { - console.log("HTTP Service Running..."); + termoutput && console.log("HTTP Service Running..."); }); exports.http = server; - -let {resolve} = require("path"); app.get("/script",(request, response)=>{ - response.sendFile(resolve("./script/wsjs.js")) + response.sendFile(resolve("./script/index.js")) }); app.get("*",(request, response)=>{ response.sendFile(resolve("./script/status.xml")) diff --git a/Source/Services/Auth.js b/Source/Services/Auth.js index 49eb97a..e12e256 100644 --- a/Source/Services/Auth.js +++ b/Source/Services/Auth.js @@ -1,21 +1,32 @@ const { Client } = require("../Client.js"); let {addService, addListener} = require("../WebSocket.js"); -addListener('disconnect',(global, xClient)=>{ - for (const pair of xClient.pairs) { - - } -}) - addService(({ client, message, end, next })=>{ - let {type,username,password,to} = message; + let {type,username,password,to,value} = message; switch(type) { + case "auth/pair-system":{ + if(value == 'everybody') + { + client.requiredPair = true; + end({status:"success"}); + } + if(value == 'disable') + { + client.requiredPair = false; + end({status:"success"}); + } + break; + } + case "my/socketid":{ + end(client.id); + break; + } case 'auth/public':{ client.requiredPair = false; return end({ @@ -51,7 +62,11 @@ addService(({ status: 'fail', message: 'ALREADY-REQUESTED' }) - } + }; + end({ + status: 'success', + message: 'REQUESTED' + }) client.peerRequest(pairclient); break; } @@ -112,6 +127,21 @@ addService(({ }) break; } + case 'is/reachable':{ + if(Client.clients.has(to)) + { + let otherPeer = Client.clients.get(to); + if(otherPeer.requiredPair && !otherPeer.pairs.has(to)) + { + end(false); + }else{ + end(true); + } + }else{ + end(false); + } + break; + } case 'auth/check':{ let auth = client.store.has('user'); return end({ diff --git a/Source/Services/DataTransfer.js b/Source/Services/DataTransfer.js index 6ef7388..5aff745 100644 --- a/Source/Services/DataTransfer.js +++ b/Source/Services/DataTransfer.js @@ -2,7 +2,6 @@ const { Client } = require("../Client.js"); let {randomUUID} = require("crypto"); let {addService,addListener} = require("../WebSocket.js"); const { Room } = require("./Room.js"); -let term = require("terminal-kit").terminal; /* Peer to peer veri aktarımı @@ -20,7 +19,8 @@ addService(({ global, message, next, - response + response, + messageId }) => { let {type} = message; switch(type) @@ -30,6 +30,12 @@ addService(({ if(Client.clients.has(to)) { let otherPeer = Client.clients.get(to); + if(otherPeer.requiredPair && !otherPeer.pairs.has(to)) + { + return handshake && end({ + type: 'fail' + }) + } otherPeer.send([{ from: client.id, pack: pack @@ -44,8 +50,41 @@ addService(({ } break; } + case "request/to":{ + let {to,pack} = message; + if(Client.clients.has(to)) + { + let otherPeer = Client.clients.get(to); + if(otherPeer.requiredPair && !otherPeer.pairs.has(to)) + { + return; + } + otherPeer.send([{ + from: client.id, + pack: pack, + id:messageId + }, 'request']); + }; + break; + } + case "response/to":{ + let {to,pack, id} = message; + if(Client.clients.has(to)) + { + let otherPeer = Client.clients.get(to); + if(otherPeer.requiredPair && !otherPeer.pairs.has(to)) + { + return; + } + otherPeer.send([{ + from: client.id, + pack: pack + }, id]); + }; + break; + } case "pack/room":{ - let {to,pack, handshake} = message; + let {to,pack, handshake,wom} = message; if(Room.rooms.has(to)) { if(!client.rooms.has(to)) @@ -57,7 +96,7 @@ addService(({ Room.rooms.get(to).send([{ from: client.id, pack: pack - }, 'pack']); + }, 'pack'], wom ? client.id : void 0); handshake && end({ type: 'success' }) diff --git a/Source/Services/Room.js b/Source/Services/Room.js index 37f12c9..98a1a43 100644 --- a/Source/Services/Room.js +++ b/Source/Services/Room.js @@ -2,6 +2,7 @@ const { Client } = require("../Client.js"); let {randomUUID,createHash} = require("crypto"); const joi = require("joi"); let {addService,addListener} = require("../WebSocket.js"); +const { termoutput } = require("../config.js"); let term = require("terminal-kit").terminal; function Sha256(update) @@ -69,7 +70,7 @@ function Room() */ Room.prototype.publish = function(room){ Room.rooms.set(this.id, this); - term.green("Room Published ").white(this.name," in ").yellow(this.clients.size).white(" clients")('\n'); + termoutput && term.green("Room Published ").white(this.name," in ").yellow(this.clients.size).white(" clients")('\n'); }; Room.prototype.toJSON = function(){ let obj = {}; @@ -83,11 +84,14 @@ Room.prototype.toJSON = function(){ obj.waitingInvited = [...this.waitingInvited]; return obj; }; -Room.prototype.send = function(obj){ +Room.prototype.send = function(obj, withOut){ for (const client of this.clients.values()) { - client.send(obj); + if(client.id != withOut) + { + client.send(obj); + } } - term.green("Room bulk message ").white(this.name," in ").yellow(this.clients.size + "").white(" clients")('\n'); + termoutput && term.green("Room bulk message ").white(this.name," in ").yellow(this.clients.size + "").white(" clients")('\n'); }; /** * @param {Client} client @@ -103,10 +107,10 @@ Room.prototype.join = function(client){ }; client.rooms.add(this.id); this.clients.set(client.id, client); - term.green("Client Room joined ").white(this.name," in ").yellow(this.clients.size + "").white(" clients")('\n'); + termoutput && term.green("Client Room joined ").white(this.name," in ").yellow(this.clients.size + "").white(" clients")('\n'); }; Room.prototype.down = function(){ - term.red("Room is downed ").red(this.name," in ").yellow(this.clients.size + "").red(" clients")('\n'); + termoutput && term.red("Room is downed ").red(this.name," in ").yellow(this.clients.size + "").red(" clients")('\n'); this.send([{ roomid: this.id, ownerid: this.owner.id @@ -131,10 +135,10 @@ Room.prototype.eject = function(client){ if(this.clients.size == 0) { this.down(); - term.red("Client Room closed ").red(this.name," at 0 clients")('\n'); + termoutput && term.red("Client Room closed ").red(this.name," at 0 clients")('\n'); } - term.red("Client Room ejected ").red(this.name," in ").yellow(this.clients.size + "").red(" clients")('\n'); + termoutput && term.red("Client Room ejected ").red(this.name," in ").yellow(this.clients.size + "").red(" clients")('\n'); }; /** @@ -171,7 +175,8 @@ let CreateRoomVerify = joi.object({ joinType: joi.string().pattern(/^free$|^invite$|^password$|^lock$/).required(), description: joi.string().required(), name: joi.string().required(), - credential: joi.string().optional() + credential: joi.string().optional(), + ifexistsJoin: joi.boolean().optional() }); addService(({ diff --git a/Source/WebSocket.js b/Source/WebSocket.js index 5f6c1c6..470e41e 100644 --- a/Source/WebSocket.js +++ b/Source/WebSocket.js @@ -4,11 +4,11 @@ let websocket = require("websocket"); let {http} = require("./HTTPServer"); let {randomUUID} = require("crypto"); const { Client } = require("./Client.js"); - -console.log("Web Socket Protocol is ready"); +const { termoutput } = require("./config"); +termoutput && console.log("Web Socket Protocol is ready"); http.addListener("upgrade",() => { - console.log("HTTP Upgrading to WebSocket"); + termoutput && console.log("HTTP Upgrading to WebSocket"); }) let wsServer = new websocket.server({ @@ -108,6 +108,7 @@ async function emitService(global, client, id, payload, action) action, client, global, + messageId: id, response:(obj)=>{ client.send([obj, id, 'C']) // continue ([C]ONTINUE flag) }, diff --git a/Source/config.js b/Source/config.js new file mode 100644 index 0000000..81463b8 --- /dev/null +++ b/Source/config.js @@ -0,0 +1 @@ +exports.termoutput = false; \ No newline at end of file diff --git a/docs/protocol.md b/docs/protocol.md new file mode 100644 index 0000000..6731334 --- /dev/null +++ b/docs/protocol.md @@ -0,0 +1,93 @@ +# Namespace + +## Auth + +### auth/public: +- Eşleşme gerekmez, herkese açık hale getirir +- İşlem bittiğinde success değeri verirr + +### auth/private +Eşleşme gerekir, biri size mesaj göndermek için onay alması gerekir +Onaylandığında success gönder + +### request/pair +- private bir eşe onay isteği gönderirsiniz, eşe bildirim gider +- Client online değilse fail CLIENT-NOT-FOUND mesajı döner +- Zaten kabul etmişse success ALREADY-PAIRED mesajı döner +- Zaten onay isteği göndermişseniz fail ALREADY-REQUESTED mesajı döner +- Gönderildiğinde success REQUESTED mesajı döner +- Eş isteğe herhangi bir cevap dönerse request/pair veya rejected/pair tetiklenir ve from değerleriyle kim oldukları bildirilir + +### accept/pair +- Uzak eşin onay isteğine onay verirsiniz + +### accept/pair +- Uzak eşin onay isteğine onay verirsiniz + +### reject/pair +- Uzak eşin isteğini reddedersiniz + +### pair/list +- Erişebileceğiniz private eşlerin ve sizinle etkileşime giren eşlerin +listesini verir + +### auth/login +- saQut Account hesabıyla ilgili ön tanımlı hızlı işlem yapar + +### auth/check +- saQut Account hesabıyla ilgili ön tanımlı hızlı işlem yapar + +### auth/logout +- saQut Account hesabıyla ilgili ön tanımlı hızlı işlem yapar + +## Room + +### myroom-info + +Kendinize özel açılan odanın bilgisini verir + +### room-peers + +İçerisinde bulunduğunuz odanın içerisinde bulunan eşlerin listesini verir + +### room-info + +İçerisinde bulunduğunuz odanın bilgisini verir + +### joinedrooms + +Katıldığınız odaların listesini verir + +### closeroom + +Sahibi olduğunuz odayı kapatır + +### create-room + +Yeni bir oda oluşturur + +### joinroom + +Bir odaya katılır veya sahibine katılma isteği gönderirsiniz + +### accept/invite-room + +Gizli bir odaya katılma isteği gödneren kişiyi odaya kabul edersiniz + +### reject/invite-room + +Gizli bir odaya katılma isteği gödneren kişiyi reddedersiniz + +### room/list + +Herkese açık olan tüm odaları listeler + +## Data transfer + +### pack/to + +Diğer eşe bir paket gönderir + +### pack/room + +Bir odaya katılmış tüm üyelere, oda üzerinden bir mesaj gönderir \ No newline at end of file diff --git a/frontend/Connection.ts b/frontend/Connection.ts new file mode 100644 index 0000000..9d2adca --- /dev/null +++ b/frontend/Connection.ts @@ -0,0 +1,78 @@ +export interface IConnection{ + endpoint: string; + autoPair?: boolean; +} +export class Connection +{ + public ws! : WebSocket; + public endpoint : URL; + public autoPair : boolean = false; + public connected : boolean = false; + constructor(options: IConnection){ + this.endpoint = new URL(options.endpoint); + this.autoPair = options.autoPair || false; + } + public connect() + { + this.ws = new WebSocket(this.endpoint.href); + this.addWSEvents(); + } + public disconnect() + { + this.ws.close(); + } + public addWSEvents() + { + this.ws.addEventListener("open", () => this.eventOpen()); + this.ws.addEventListener("close", () => this.eventClose()); + this.ws.addEventListener("error", () => this.eventError()); + this.ws.addEventListener("message", ({data}) => this.eventMessage(data as string | ArrayBuffer)); + } + private eventOpen() + { + this.connected = true; + for (const callback of this.activeConnectionEvent) { + callback(void 0); + } + } + private eventClose() + { + this.connected = false; + } + private eventError() + { + this.connected = false; + } + private recaivePackEvent : ((data:any) => any)[] = []; + public onRecaivePack(func:(data:any) => any) + { + this.recaivePackEvent.push(func); + } + private activeConnectionEvent : Function[] = []; + public onActive(func:Function) + { + if(this.connected) + { + func() + }else{ + this.activeConnectionEvent.push(func); + } + } + private eventMessage(data: string | ArrayBuffer) + { + if(typeof data == "string") + { + let $data = JSON.parse(data); + for (const callback of this.recaivePackEvent) { + callback($data); + } + } + } + public tranferToServer(data:any) + { + if(this.connected) + { + this.ws.send(JSON.stringify(data)); + } + } +} \ No newline at end of file diff --git a/frontend/EventPool.ts b/frontend/EventPool.ts new file mode 100644 index 0000000..442988d --- /dev/null +++ b/frontend/EventPool.ts @@ -0,0 +1,52 @@ +import MWSE from "./index"; +import { Message } from "./WSTSProtocol"; + +export default class EventPool +{ + public wsts : MWSE; + public events : Map = new Map(); + public signals : Map = new Map(); + + public requests : Map = new Map(); + + public count = 0; + constructor(wsts:MWSE){ + this.wsts = wsts; + } + public request(msg: Message) : Promise + { + return new Promise((ok,rej) => { + let id = ++this.count; + this.wsts.WSTSProtocol.SendRequest(msg, id); + this.events.set(id,[ + (data:any) => { + ok(data); + }, + (data:any) => { + rej(data); + } + ]); + }) + } + public stream(msg: Message, callback: Function) + { + let id = ++this.count; + this.wsts.WSTSProtocol.StartStream(msg, id); + this.events.set(id,[ + (data:any) => { + callback(data); + }, + () => { } + ]); + } + public signal(event: string, callback: Function) + { + let T = this.signals.get(event); + if(!T) + { + this.signals.set(event, [callback]); + }else{ + T.push(callback); + } + } +} \ No newline at end of file diff --git a/frontend/EventTarget.ts b/frontend/EventTarget.ts new file mode 100644 index 0000000..a1b76d7 --- /dev/null +++ b/frontend/EventTarget.ts @@ -0,0 +1,32 @@ +export default class EventTarget +{ + private events : {[key:string]:Function[]} = {}; + public emit(eventName :string, ...args:any[]) + { + if(this.events[eventName]) + { + for (const callback of this.events[eventName]) { + callback(...args); + } + } + } + public on(eventName :string, callback:Function) + { + if(this.events[eventName]) + { + this.events[eventName].push(callback) + }else{ + this.events[eventName] = [callback]; + } + } + public activeScope : boolean = false; + scope(f:Function) + { + if(this.activeScope) + { + f() + }else{ + this.on('scope', f) + } + } +} \ No newline at end of file diff --git a/frontend/Peer.ts b/frontend/Peer.ts new file mode 100644 index 0000000..f58b9ed --- /dev/null +++ b/frontend/Peer.ts @@ -0,0 +1,83 @@ +import EventTarget from "./EventTarget"; +import MWSE from "./index"; + +interface IPeerOptions{ + +}; + + +export default class Peer extends EventTarget +{ + public mwse : MWSE; + public options : IPeerOptions = {}; + public socketId? : string; + public selfSocket : boolean = false; + public active : boolean = false; + constructor(wsts:MWSE){ + super(); + this.mwse = wsts; + } + setPeerOptions(options: string | IPeerOptions){ + if(typeof options == "string") + { + this.setSocketId(options) + }else{ + this.options = options; + } + } + setSocketId(uuid: string){ + this.socketId = uuid; + } + async metadata() : Promise + { + if(this.socketId == 'me') + { + let result = await this.mwse.EventPooling.request({ + type:'my/socketid' + }); + this.selfSocket = true; + this.active ||= true; + this.socketId = result; + this.emit('scope'); + this.activeScope = true; + return result; + } + }; + + async request(pack:any){ + if(this.active) + { + return await this.mwse.request(this.socketId as string, pack); + } + }; + equalTo(peer : Peer | {socketId: string}) + { + return this.socketId == peer.socketId; + } + async isReachable() + { + return await this.mwse.EventPooling.request({ + type:'is/reachable', + to: this.socketId + }); + } + async enablePairAuth(){ + await this.mwse.EventPooling.request({ + type:'auth/pair-system', + value: 'everybody' + }); + } + async disablePairAuth(){ + await this.mwse.EventPooling.request({ + type:'auth/pair-system', + value: 'disable' + }); + } + async send(pack: any){ + await this.mwse.EventPooling.request({ + type:'pack/to', + pack, + to: this.socketId + }); + } +} \ No newline at end of file diff --git a/frontend/Room.ts b/frontend/Room.ts new file mode 100644 index 0000000..e5b02b6 --- /dev/null +++ b/frontend/Room.ts @@ -0,0 +1,125 @@ +import EventTarget from "./EventTarget"; +import MWSE from "./index"; +import Peer from "./Peer"; + +export interface IRoomOptions +{ + name: string; + description?:string; + joinType: "free"|"invite"|"password"|"lock"; + credential?: string; + ifexistsJoin?: boolean; + accessType?: "public"|"private"; + notifyActionInvite?: boolean; + notifyActionJoined?: boolean; + notifyActionEjected?: boolean; +} + + +export default class Room extends EventTarget +{ + public mwse : MWSE; + public options! : IRoomOptions; + public roomId? : string; + public accessType? : "public"|"private"; + public description? : string; + public joinType? : "free"|"invite"|"password"|"lock"; + public name? : string; + public owner? : string; + public peers : Map = new Map(); + + constructor(wsts:MWSE){ + super(); + this.mwse = wsts; + } + public setRoomOptions(options : IRoomOptions | string) + { + if(typeof options == "string") + { + this.roomId = options; + }else{ + let defaultOptions = { + joinType: "free", + ifexistsJoin: true, + accessType: "private", + notifyActionInvite: true, + notifyActionJoined: true, + notifyActionEjected: true + }; + Object.assign(defaultOptions,options); + this.options = defaultOptions as IRoomOptions; + } + } + + setRoomId(uuid: string){ + this.roomId = uuid; + } + async createRoom(roomOptions : IRoomOptions){ + let options = this.options || roomOptions; + let result = await this.mwse.EventPooling.request({ + type:'create-room', + ...options + }); + if(result.status == 'fail') + { + if(result.message == "ALREADY-EXISTS" && this.options.ifexistsJoin) + { + return this.join(); + } + throw new Error(result.message || result.messages); + }else{ + this.options = { + ...this.options, + ...result.room + }; + this.roomId = result.room.id; + this.mwse.rooms.set(this.roomId as string, this); + } + } + async join(){ + let result = await this.mwse.EventPooling.request({ + type:'joinroom', + name: this.options.name, + credential: this.options.credential + }); + if(result.status == 'fail') + { + throw new Error(result.message); + }else{ + this.options = { + ...this.options, + ...result.room + }; + this.roomId = result.room.id; + this.mwse.rooms.set(this.roomId as string, this); + } + } + async send(pack: any, wom:boolean = false){ + await this.mwse.EventPooling.request({ + type:'pack/room', + pack, + to: this.roomId, + wom + }); + } + async fetchAllPeers(){ + let {status, peers} = await this.mwse.EventPooling.request({ + type:'room-peers', + roomId: this.roomId + }) as {status:"success"|"fail", peers: string[]}; + + let cup : Peer[] = []; + + if(status == 'fail') + { + throw new Error("Cant using peers on room") + }else if(status == 'success'){ + for (const peerid of peers) { + let peer = this.mwse.peer(peerid); + cup.push(peer); + this.peers.set(peerid, peer); + } + }; + return cup; + } +} \ No newline at end of file diff --git a/frontend/WSTSProtocol.ts b/frontend/WSTSProtocol.ts new file mode 100644 index 0000000..3556b27 --- /dev/null +++ b/frontend/WSTSProtocol.ts @@ -0,0 +1,66 @@ +import MWSE from "./index"; + +export interface Message { + [key:string|number]:any; +} +export default class WSTSProtocol +{ + public mwse : MWSE; + constructor(wsts:MWSE){ + this.mwse = wsts; + this.addListener(); + } + public addListener() + { + this.mwse.server?.onRecaivePack((pack)=>{ + this.PackAnalyze(pack) + }) + } + public SendRaw(pack: Message) + { + this.mwse.server.tranferToServer(pack); + } + public SendOnly(pack: Message) + { + this.mwse.server.tranferToServer([pack,'R']); + } + public SendRequest(pack: Message, id: number) + { + this.mwse.server.tranferToServer([pack, id, 'R']); + } + public StartStream(pack: Message, id: number) + { + this.mwse.server.tranferToServer([pack, id, 'S']); + } + public PackAnalyze(data:any) + { + let [payload, id, action] = data; + if(typeof id === 'number') + { + let callback = this.mwse.EventPooling.events.get(id); + if(callback) + { + callback[0](payload, action); + switch(action) + { + case 'E':{ // [E]ND flag + this.mwse.EventPooling.events.delete(id); + break; + } + case 'S': // [S]TREAM flag + default:{ + break; + } + } + }else console.warn("Missing event sended from server"); + }else{ + let signals = this.mwse.EventPooling.signals.get(id); + if(signals) + { + for (const callback of signals) { + callback(payload); + } + }else console.warn("Missing event sended from server"); + } + } +} \ No newline at end of file diff --git a/frontend/index.ts b/frontend/index.ts new file mode 100644 index 0000000..84cc19a --- /dev/null +++ b/frontend/index.ts @@ -0,0 +1,136 @@ +import {Connection,IConnection} from "./Connection"; +import EventPool from "./EventPool"; +import EventTarget from "./EventTarget"; +import Peer from "./Peer"; +import Room, { IRoomOptions } from "./Room"; +import WSTSProtocol, { Message } from "./WSTSProtocol"; +export default class MWSE extends EventTarget { + public server! : Connection; + public WSTSProtocol! : WSTSProtocol; + public EventPooling! : EventPool; + public rooms : Map = new Map(); + public pairs : Map = new Map(); + public peers : Map = new Map(); + public me! : Peer; + constructor(options: IConnection){ + super(); + this.server = new Connection(options); + this.server.connect(); + this.WSTSProtocol = new WSTSProtocol(this); + this.EventPooling = new EventPool(this); + this.me = new Peer(this); + this.me.scope(()=>{ + this.peers.set('me', this.me); + this.peers.set(this.me.socketId as string, this.me); + }) + this.server.onActive(async ()=>{ + this.me.setSocketId('me'); + await this.me.metadata(); + this.emit('scope'); + this.activeScope = true; + }); + this.packMessagingSystem(); + } + public async request(peerId: string, pack:Message) + { + let {pack:answer} = await this.EventPooling.request({ + type: 'request/to', + to: peerId, + pack + }); + return answer; + } + public async response(peerId: string, requestId:number, pack:Message) + { + this.WSTSProtocol.SendOnly({ + type: 'response/to', + to: peerId, + pack, + id: requestId + }) + } + private packMessagingSystem() + { + this.EventPooling.signal('pack',(payload : {from:string,pack:any}) => { + let {from,pack} = payload; + this.peer(from, true).emit('message', pack); + }) + this.EventPooling.signal('request',(payload : {from:string,pack:any,id:number}) => { + let {from,pack, id} = payload; + let scope = { + body: pack, + response: (pack: Message) => { + this.response(from, id, pack); + }, + peer: this.peer(from, true) + }; + this.peer(from, true).emit('request', scope); + this.peer('me').emit('request', scope); + }) + this.EventPooling.signal('pack/room',(payload : {to:string,pack:any}) => { + let {to,pack} = payload; + this.room(to).emit('message', pack); + }) + this.EventPooling.signal('room/joined',(payload : {id:string,roomid:any,ownerid:string}) => { + let {id,roomid} = payload; + let room = this.room(roomid); + let peer = this.peer(id, true); + room.emit('join', peer); + }) + this.EventPooling.signal('room/ejected',(payload : {id:string,roomid:any,ownerid:string}) => { + let {id,roomid} = payload; + let room = this.room(roomid); + let peer = this.peer(id); + room.emit('eject', peer); + }) + this.EventPooling.signal('room/closed',(payload : {roomid:any}) => { + let {roomid} = payload; + let room = this.room(roomid); + room.emit('close'); + this.rooms.delete(roomid); + }) + } + public room(options: IRoomOptions | string) : Room + { + if(typeof options == "string") + { + if(this.rooms.has(options)) + { + return this.rooms.get(options) as Room + } + } + let room = new Room(this); + room.setRoomOptions(options); + // this.rooms.set(room.roomId as string, room); + this.emit('room'); + return room; + } + public peer(options: string | IRoomOptions, isActive = false) : Peer + { + if(typeof options == "string") + { + if(this.peers.has(options)) + { + return this.peers.get(options) as Peer + } + if(this.pairs.has(options)) + { + return this.pairs.get(options) as Peer + } + } + let peer = new Peer(this); + peer.setPeerOptions(options); + peer.active = isActive; + this.peers.set(peer.socketId as string, peer); + this.emit('peer', peer); + return peer; + } +}; + +declare global { + interface Window { + MWSE: any; + } +} + +window.MWSE = MWSE; \ No newline at end of file diff --git a/script/wsjs.js b/frontend/index.txt similarity index 100% rename from script/wsjs.js rename to frontend/index.txt diff --git a/package-lock.json b/package-lock.json index 4b875d3..bcc09b1 100644 --- a/package-lock.json +++ b/package-lock.json @@ -14,8 +14,15 @@ "joi": "^17.7.0", "knex": "^2.3.0", "sqlite3": "^5.1.2", + "systemjs": "^6.13.0", "terminal-kit": "^3.0.0", + "typescript": "^4.9.3", "websocket": "^1.0.34" + }, + "devDependencies": { + "@parcel/packager-ts": "^2.7.0", + "@parcel/transformer-typescript-types": "^2.7.0", + "tslib": "^2.4.1" } }, "node_modules/@cronvel/get-pixels": { @@ -50,6 +57,99 @@ "@hapi/hoek": "^9.0.0" } }, + "node_modules/@lezer/common": { + "version": "0.15.12", + "resolved": "https://registry.npmjs.org/@lezer/common/-/common-0.15.12.tgz", + "integrity": "sha512-edfwCxNLnzq5pBA/yaIhwJ3U3Kz8VAUOTRg0hhxaizaI1N+qxV7EXDv/kLCkLeq2RzSFvxexlaj5Mzfn2kY0Ig==", + "dev": true + }, + "node_modules/@lezer/lr": { + "version": "0.15.8", + "resolved": "https://registry.npmjs.org/@lezer/lr/-/lr-0.15.8.tgz", + "integrity": "sha512-bM6oE6VQZ6hIFxDNKk8bKPa14hqFrV07J/vHGOeiAbJReIaQXmkVb6xQu4MR+JBTLa5arGRyAAjJe1qaQt3Uvg==", + "dev": true, + "dependencies": { + "@lezer/common": "^0.15.0" + } + }, + "node_modules/@lmdb/lmdb-darwin-arm64": { + "version": "2.5.2", + "resolved": "https://registry.npmjs.org/@lmdb/lmdb-darwin-arm64/-/lmdb-darwin-arm64-2.5.2.tgz", + "integrity": "sha512-+F8ioQIUN68B4UFiIBYu0QQvgb9FmlKw2ctQMSBfW2QBrZIxz9vD9jCGqTCPqZBRbPHAS/vG1zSXnKqnS2ch/A==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@lmdb/lmdb-darwin-x64": { + "version": "2.5.2", + "resolved": "https://registry.npmjs.org/@lmdb/lmdb-darwin-x64/-/lmdb-darwin-x64-2.5.2.tgz", + "integrity": "sha512-KvPH56KRLLx4KSfKBx0m1r7GGGUMXm0jrKmNE7plbHlesZMuPJICtn07HYgQhj1LNsK7Yqwuvnqh1QxhJnF1EA==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@lmdb/lmdb-linux-arm": { + "version": "2.5.2", + "resolved": "https://registry.npmjs.org/@lmdb/lmdb-linux-arm/-/lmdb-linux-arm-2.5.2.tgz", + "integrity": "sha512-5kQAP21hAkfW5Bl+e0P57dV4dGYnkNIpR7f/GAh6QHlgXx+vp/teVj4PGRZaKAvt0GX6++N6hF8NnGElLDuIDw==", + "cpu": [ + "arm" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@lmdb/lmdb-linux-arm64": { + "version": "2.5.2", + "resolved": "https://registry.npmjs.org/@lmdb/lmdb-linux-arm64/-/lmdb-linux-arm64-2.5.2.tgz", + "integrity": "sha512-aLl89VHL/wjhievEOlPocoefUyWdvzVrcQ/MHQYZm2JfV1jUsrbr/ZfkPPUFvZBf+VSE+Q0clWs9l29PCX1hTQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@lmdb/lmdb-linux-x64": { + "version": "2.5.2", + "resolved": "https://registry.npmjs.org/@lmdb/lmdb-linux-x64/-/lmdb-linux-x64-2.5.2.tgz", + "integrity": "sha512-xUdUfwDJLGjOUPH3BuPBt0NlIrR7f/QHKgu3GZIXswMMIihAekj2i97oI0iWG5Bok/b+OBjHPfa8IU9velnP/Q==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@lmdb/lmdb-win32-x64": { + "version": "2.5.2", + "resolved": "https://registry.npmjs.org/@lmdb/lmdb-win32-x64/-/lmdb-win32-x64-2.5.2.tgz", + "integrity": "sha512-zrBczSbXKxEyK2ijtbRdICDygRqWSRPpZMN5dD1T8VMEW5RIhIbwFWw2phDRXuBQdVDpSjalCIUMWMV2h3JaZA==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ] + }, "node_modules/@mapbox/node-pre-gyp": { "version": "1.0.10", "resolved": "https://registry.npmjs.org/@mapbox/node-pre-gyp/-/node-pre-gyp-1.0.10.tgz", @@ -69,6 +169,98 @@ "node-pre-gyp": "bin/node-pre-gyp" } }, + "node_modules/@mischnic/json-sourcemap": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/@mischnic/json-sourcemap/-/json-sourcemap-0.1.0.tgz", + "integrity": "sha512-dQb3QnfNqmQNYA4nFSN/uLaByIic58gOXq4Y4XqLOWmOrw73KmJPt/HLyG0wvn1bnR6mBKs/Uwvkh+Hns1T0XA==", + "dev": true, + "dependencies": { + "@lezer/common": "^0.15.7", + "@lezer/lr": "^0.15.4", + "json5": "^2.2.1" + }, + "engines": { + "node": ">=12.0.0" + } + }, + "node_modules/@msgpackr-extract/msgpackr-extract-darwin-arm64": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/@msgpackr-extract/msgpackr-extract-darwin-arm64/-/msgpackr-extract-darwin-arm64-2.2.0.tgz", + "integrity": "sha512-Z9LFPzfoJi4mflGWV+rv7o7ZbMU5oAU9VmzCgL240KnqDW65Y2HFCT3MW06/ITJSnbVLacmcEJA8phywK7JinQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@msgpackr-extract/msgpackr-extract-darwin-x64": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/@msgpackr-extract/msgpackr-extract-darwin-x64/-/msgpackr-extract-darwin-x64-2.2.0.tgz", + "integrity": "sha512-vq0tT8sjZsy4JdSqmadWVw6f66UXqUCabLmUVHZwUFzMgtgoIIQjT4VVRHKvlof3P/dMCkbMJ5hB1oJ9OWHaaw==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@msgpackr-extract/msgpackr-extract-linux-arm": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/@msgpackr-extract/msgpackr-extract-linux-arm/-/msgpackr-extract-linux-arm-2.2.0.tgz", + "integrity": "sha512-SaJ3Qq4lX9Syd2xEo9u3qPxi/OB+5JO/ngJKK97XDpa1C587H9EWYO6KD8995DAjSinWvdHKRrCOXVUC5fvGOg==", + "cpu": [ + "arm" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@msgpackr-extract/msgpackr-extract-linux-arm64": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/@msgpackr-extract/msgpackr-extract-linux-arm64/-/msgpackr-extract-linux-arm64-2.2.0.tgz", + "integrity": "sha512-hlxxLdRmPyq16QCutUtP8Tm6RDWcyaLsRssaHROatgnkOxdleMTgetf9JsdncL8vLh7FVy/RN9i3XR5dnb9cRA==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@msgpackr-extract/msgpackr-extract-linux-x64": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/@msgpackr-extract/msgpackr-extract-linux-x64/-/msgpackr-extract-linux-x64-2.2.0.tgz", + "integrity": "sha512-94y5PJrSOqUNcFKmOl7z319FelCLAE0rz/jPCWS+UtdMZvpa4jrQd+cJPQCLp2Fes1yAW/YUQj/Di6YVT3c3Iw==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@msgpackr-extract/msgpackr-extract-win32-x64": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/@msgpackr-extract/msgpackr-extract-win32-x64/-/msgpackr-extract-win32-x64-2.2.0.tgz", + "integrity": "sha512-XrC0JzsqQSvOyM3t04FMLO6z5gCuhPE6k4FXuLK5xf52ZbdvcFe1yBmo7meCew9B8G2f0T9iu9t3kfTYRYROgA==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ] + }, "node_modules/@npmcli/fs": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/@npmcli/fs/-/fs-1.1.1.tgz", @@ -93,6 +285,867 @@ "node": ">=10" } }, + "node_modules/@parcel/cache": { + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/@parcel/cache/-/cache-2.7.0.tgz", + "integrity": "sha512-JlXNoZXcWzLKdDlfeF3dIj5Vtel5T9vtdBN72PJ+cjC4qNHk4Uwvc5sfOBELuibGN0bVu2bwY9nUgSwCiB1iIA==", + "dev": true, + "dependencies": { + "@parcel/fs": "2.7.0", + "@parcel/logger": "2.7.0", + "@parcel/utils": "2.7.0", + "lmdb": "2.5.2" + }, + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + }, + "peerDependencies": { + "@parcel/core": "^2.7.0" + } + }, + "node_modules/@parcel/codeframe": { + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/@parcel/codeframe/-/codeframe-2.7.0.tgz", + "integrity": "sha512-UTKx0jejJmmO1dwTHSJuRgrO8N6PMlkxRT6sew8N6NC3Bgv6pu0EbO+RtlWt/jCvzcdLOPdIoTzj4MMZvgcMYg==", + "dev": true, + "dependencies": { + "chalk": "^4.1.0" + }, + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/core": { + "version": "2.8.0", + "resolved": "https://registry.npmjs.org/@parcel/core/-/core-2.8.0.tgz", + "integrity": "sha512-udzbe3jjbpfKlRE9pdlROAa+lvAjS1L/AzN6r2j1y/Fsn7ze/NfvnCFw6o2YNIrXg002aQ7M1St/x1fdGfmVKA==", + "dev": true, + "peer": true, + "dependencies": { + "@mischnic/json-sourcemap": "^0.1.0", + "@parcel/cache": "2.8.0", + "@parcel/diagnostic": "2.8.0", + "@parcel/events": "2.8.0", + "@parcel/fs": "2.8.0", + "@parcel/graph": "2.8.0", + "@parcel/hash": "2.8.0", + "@parcel/logger": "2.8.0", + "@parcel/package-manager": "2.8.0", + "@parcel/plugin": "2.8.0", + "@parcel/source-map": "^2.1.1", + "@parcel/types": "2.8.0", + "@parcel/utils": "2.8.0", + "@parcel/workers": "2.8.0", + "abortcontroller-polyfill": "^1.1.9", + "base-x": "^3.0.8", + "browserslist": "^4.6.6", + "clone": "^2.1.1", + "dotenv": "^7.0.0", + "dotenv-expand": "^5.1.0", + "json5": "^2.2.0", + "msgpackr": "^1.5.4", + "nullthrows": "^1.1.1", + "semver": "^5.7.1" + }, + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/core/node_modules/@parcel/cache": { + "version": "2.8.0", + "resolved": "https://registry.npmjs.org/@parcel/cache/-/cache-2.8.0.tgz", + "integrity": "sha512-k945hrafMDR2wyCKyZYgwypeLLuZWce6FzhgunI4taBUeVnNCcpFAWzbfOVQ39SqZTGDqG3MNT+VuehssHXxyg==", + "dev": true, + "peer": true, + "dependencies": { + "@parcel/fs": "2.8.0", + "@parcel/logger": "2.8.0", + "@parcel/utils": "2.8.0", + "lmdb": "2.5.2" + }, + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + }, + "peerDependencies": { + "@parcel/core": "^2.8.0" + } + }, + "node_modules/@parcel/core/node_modules/@parcel/codeframe": { + "version": "2.8.0", + "resolved": "https://registry.npmjs.org/@parcel/codeframe/-/codeframe-2.8.0.tgz", + "integrity": "sha512-821d+KVcpEvJNMj9WMC39xXZK6zvRS/HUjQag2f3DkcRcZwk1uXJZdW6p1EB7C3e4e/0KSK3NTSVGEvbOSR+9w==", + "dev": true, + "peer": true, + "dependencies": { + "chalk": "^4.1.0" + }, + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/core/node_modules/@parcel/diagnostic": { + "version": "2.8.0", + "resolved": "https://registry.npmjs.org/@parcel/diagnostic/-/diagnostic-2.8.0.tgz", + "integrity": "sha512-ERnk0zDvm0jQUSj1M+2PLiwVC6nWrtuFEuye6VGuxRDcp9NHbz6gwApeEYxFkPsb3TQPhNjnXXm5nmAw1bpWWw==", + "dev": true, + "peer": true, + "dependencies": { + "@mischnic/json-sourcemap": "^0.1.0", + "nullthrows": "^1.1.1" + }, + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/core/node_modules/@parcel/fs": { + "version": "2.8.0", + "resolved": "https://registry.npmjs.org/@parcel/fs/-/fs-2.8.0.tgz", + "integrity": "sha512-v3DbJlpl8v2/VRlZPw7cy+0myi0YfLblGZcwDvqIsWS35qyxD2rmtYV8u1BusonbgmJeaKiopSECmJkumt0jCw==", + "dev": true, + "peer": true, + "dependencies": { + "@parcel/fs-search": "2.8.0", + "@parcel/types": "2.8.0", + "@parcel/utils": "2.8.0", + "@parcel/watcher": "^2.0.7", + "@parcel/workers": "2.8.0" + }, + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + }, + "peerDependencies": { + "@parcel/core": "^2.8.0" + } + }, + "node_modules/@parcel/core/node_modules/@parcel/fs-search": { + "version": "2.8.0", + "resolved": "https://registry.npmjs.org/@parcel/fs-search/-/fs-search-2.8.0.tgz", + "integrity": "sha512-yo7/Y8DCFlhOlIBb5SsRDTkM+7g0DY9sK57iw3hn2z1tGoIiIRptrieImFYSizs7HfDwDY/PMLfORmUdoReDzQ==", + "dev": true, + "peer": true, + "dependencies": { + "detect-libc": "^1.0.3" + }, + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/core/node_modules/@parcel/logger": { + "version": "2.8.0", + "resolved": "https://registry.npmjs.org/@parcel/logger/-/logger-2.8.0.tgz", + "integrity": "sha512-W+7rKsLxLUX6xRmP8PhGWcG48PqrzTPeMWpgSds5nXxAHEFh4cYbkwPKGoTU65a9xUDVyqNreHNIKyizgwAZHQ==", + "dev": true, + "peer": true, + "dependencies": { + "@parcel/diagnostic": "2.8.0", + "@parcel/events": "2.8.0" + }, + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/core/node_modules/@parcel/markdown-ansi": { + "version": "2.8.0", + "resolved": "https://registry.npmjs.org/@parcel/markdown-ansi/-/markdown-ansi-2.8.0.tgz", + "integrity": "sha512-xItzXmc3btFhJXsIbE946iaqE6STd2xe5H0zSIaZVXEeucCtMzcd4hxRELquxPstlrAOrrp/lrRpbAlMhso9iA==", + "dev": true, + "peer": true, + "dependencies": { + "chalk": "^4.1.0" + }, + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/core/node_modules/@parcel/package-manager": { + "version": "2.8.0", + "resolved": "https://registry.npmjs.org/@parcel/package-manager/-/package-manager-2.8.0.tgz", + "integrity": "sha512-n4FgerAX1lTKKTgxmiocnos47Y+b0L60iwU6Q4cC2n4KQNRuNyfhxFXwWcqHstR9wa72JgPaDgo4k0l3Bk8FZw==", + "dev": true, + "peer": true, + "dependencies": { + "@parcel/diagnostic": "2.8.0", + "@parcel/fs": "2.8.0", + "@parcel/logger": "2.8.0", + "@parcel/types": "2.8.0", + "@parcel/utils": "2.8.0", + "@parcel/workers": "2.8.0", + "semver": "^5.7.1" + }, + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + }, + "peerDependencies": { + "@parcel/core": "^2.8.0" + } + }, + "node_modules/@parcel/core/node_modules/@parcel/plugin": { + "version": "2.8.0", + "resolved": "https://registry.npmjs.org/@parcel/plugin/-/plugin-2.8.0.tgz", + "integrity": "sha512-Tsf+7nDg7KauvTVY6rGc7CmgJruKSwJ54KJ9s5nYFFP9nfwmyqbayCi9xOxicWU9zIHfuF5Etwf17lcA0oAvzw==", + "dev": true, + "peer": true, + "dependencies": { + "@parcel/types": "2.8.0" + }, + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/core/node_modules/@parcel/types": { + "version": "2.8.0", + "resolved": "https://registry.npmjs.org/@parcel/types/-/types-2.8.0.tgz", + "integrity": "sha512-DeN3vCnVl9onjtyWxpbP7LwRslVEko4kBaM7yILsuQjEnXmaIOsqIf6FQJOUOPBtQTFFNeQQ2qyf5XoO/rkJ8g==", + "dev": true, + "peer": true, + "dependencies": { + "@parcel/cache": "2.8.0", + "@parcel/diagnostic": "2.8.0", + "@parcel/fs": "2.8.0", + "@parcel/package-manager": "2.8.0", + "@parcel/source-map": "^2.1.1", + "@parcel/workers": "2.8.0", + "utility-types": "^3.10.0" + } + }, + "node_modules/@parcel/core/node_modules/@parcel/utils": { + "version": "2.8.0", + "resolved": "https://registry.npmjs.org/@parcel/utils/-/utils-2.8.0.tgz", + "integrity": "sha512-r4ACsGtW7zkMUIgwQyOVtPAFiy8L81gbz4tMIRSqyQKnkW7oEHcQ3uN1/LPxj2yfkyQLmhJxmtptLUy9j53rcw==", + "dev": true, + "peer": true, + "dependencies": { + "@parcel/codeframe": "2.8.0", + "@parcel/diagnostic": "2.8.0", + "@parcel/hash": "2.8.0", + "@parcel/logger": "2.8.0", + "@parcel/markdown-ansi": "2.8.0", + "@parcel/source-map": "^2.1.1", + "chalk": "^4.1.0" + }, + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/core/node_modules/@parcel/workers": { + "version": "2.8.0", + "resolved": "https://registry.npmjs.org/@parcel/workers/-/workers-2.8.0.tgz", + "integrity": "sha512-vAzoC/wPHLQnyy9P/TrSPftY8F3MhZqPTFi681mxVtLWA3t7wiNlw1zDVKRDP8m5XS1yQOr8Q56CAHyRexhc8g==", + "dev": true, + "peer": true, + "dependencies": { + "@parcel/diagnostic": "2.8.0", + "@parcel/logger": "2.8.0", + "@parcel/types": "2.8.0", + "@parcel/utils": "2.8.0", + "chrome-trace-event": "^1.0.2", + "nullthrows": "^1.1.1" + }, + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + }, + "peerDependencies": { + "@parcel/core": "^2.8.0" + } + }, + "node_modules/@parcel/core/node_modules/detect-libc": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-1.0.3.tgz", + "integrity": "sha512-pGjwhsmsp4kL2RTz08wcOlGN83otlqHeD/Z5T8GXZB+/YcpQ/dgo+lbU8ZsGxV0HIvqqxo9l7mqYwyYMD9bKDg==", + "dev": true, + "peer": true, + "bin": { + "detect-libc": "bin/detect-libc.js" + }, + "engines": { + "node": ">=0.10" + } + }, + "node_modules/@parcel/core/node_modules/semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", + "dev": true, + "peer": true, + "bin": { + "semver": "bin/semver" + } + }, + "node_modules/@parcel/diagnostic": { + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/@parcel/diagnostic/-/diagnostic-2.7.0.tgz", + "integrity": "sha512-pdq/cTwVoL0n8yuDCRXFRSQHVWdmmIXPt3R3iT4KtYDYvOrMT2dLPT79IMqQkhYPANW8GuL15n/WxRngfRdkug==", + "dev": true, + "dependencies": { + "@mischnic/json-sourcemap": "^0.1.0", + "nullthrows": "^1.1.1" + }, + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/events": { + "version": "2.8.0", + "resolved": "https://registry.npmjs.org/@parcel/events/-/events-2.8.0.tgz", + "integrity": "sha512-xqSZYY3oONM4IZm9+vhyFqX+KFIl145veIczUikwGJlcJZQfAAw736syPx6ecpB+m1EVg3AlvJWy7Lmel4Ak+Q==", + "dev": true, + "peer": true, + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/fs": { + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/@parcel/fs/-/fs-2.7.0.tgz", + "integrity": "sha512-PU5fo4Hh8y03LZgemgVREttc0wyHQUNmsJCybxTB7EjJie2CqJRumo+DFppArlvdchLwJdc9em03yQV/GNWrEg==", + "dev": true, + "dependencies": { + "@parcel/fs-search": "2.7.0", + "@parcel/types": "2.7.0", + "@parcel/utils": "2.7.0", + "@parcel/watcher": "^2.0.0", + "@parcel/workers": "2.7.0" + }, + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + }, + "peerDependencies": { + "@parcel/core": "^2.7.0" + } + }, + "node_modules/@parcel/fs-search": { + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/@parcel/fs-search/-/fs-search-2.7.0.tgz", + "integrity": "sha512-K1Hv25bnRpwQVA15RvcRuB8ZhfclnCHA8N8L6w7Ul1ncSJDxCIkIAc5hAubYNNYW3kWjCC2SOaEgFKnbvMllEQ==", + "dev": true, + "dependencies": { + "detect-libc": "^1.0.3" + }, + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/fs-search/node_modules/detect-libc": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-1.0.3.tgz", + "integrity": "sha512-pGjwhsmsp4kL2RTz08wcOlGN83otlqHeD/Z5T8GXZB+/YcpQ/dgo+lbU8ZsGxV0HIvqqxo9l7mqYwyYMD9bKDg==", + "dev": true, + "bin": { + "detect-libc": "bin/detect-libc.js" + }, + "engines": { + "node": ">=0.10" + } + }, + "node_modules/@parcel/graph": { + "version": "2.8.0", + "resolved": "https://registry.npmjs.org/@parcel/graph/-/graph-2.8.0.tgz", + "integrity": "sha512-JvAyvBpGmhZ30bi+hStQr52eu+InfJBoiN9Z/32byIWhXEl02EAOwfsPqAe+FGCsdgXnnCGg5F9ZCqwzZ9dwbw==", + "dev": true, + "peer": true, + "dependencies": { + "@parcel/utils": "2.8.0", + "nullthrows": "^1.1.1" + }, + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/graph/node_modules/@parcel/codeframe": { + "version": "2.8.0", + "resolved": "https://registry.npmjs.org/@parcel/codeframe/-/codeframe-2.8.0.tgz", + "integrity": "sha512-821d+KVcpEvJNMj9WMC39xXZK6zvRS/HUjQag2f3DkcRcZwk1uXJZdW6p1EB7C3e4e/0KSK3NTSVGEvbOSR+9w==", + "dev": true, + "peer": true, + "dependencies": { + "chalk": "^4.1.0" + }, + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/graph/node_modules/@parcel/diagnostic": { + "version": "2.8.0", + "resolved": "https://registry.npmjs.org/@parcel/diagnostic/-/diagnostic-2.8.0.tgz", + "integrity": "sha512-ERnk0zDvm0jQUSj1M+2PLiwVC6nWrtuFEuye6VGuxRDcp9NHbz6gwApeEYxFkPsb3TQPhNjnXXm5nmAw1bpWWw==", + "dev": true, + "peer": true, + "dependencies": { + "@mischnic/json-sourcemap": "^0.1.0", + "nullthrows": "^1.1.1" + }, + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/graph/node_modules/@parcel/logger": { + "version": "2.8.0", + "resolved": "https://registry.npmjs.org/@parcel/logger/-/logger-2.8.0.tgz", + "integrity": "sha512-W+7rKsLxLUX6xRmP8PhGWcG48PqrzTPeMWpgSds5nXxAHEFh4cYbkwPKGoTU65a9xUDVyqNreHNIKyizgwAZHQ==", + "dev": true, + "peer": true, + "dependencies": { + "@parcel/diagnostic": "2.8.0", + "@parcel/events": "2.8.0" + }, + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/graph/node_modules/@parcel/markdown-ansi": { + "version": "2.8.0", + "resolved": "https://registry.npmjs.org/@parcel/markdown-ansi/-/markdown-ansi-2.8.0.tgz", + "integrity": "sha512-xItzXmc3btFhJXsIbE946iaqE6STd2xe5H0zSIaZVXEeucCtMzcd4hxRELquxPstlrAOrrp/lrRpbAlMhso9iA==", + "dev": true, + "peer": true, + "dependencies": { + "chalk": "^4.1.0" + }, + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/graph/node_modules/@parcel/utils": { + "version": "2.8.0", + "resolved": "https://registry.npmjs.org/@parcel/utils/-/utils-2.8.0.tgz", + "integrity": "sha512-r4ACsGtW7zkMUIgwQyOVtPAFiy8L81gbz4tMIRSqyQKnkW7oEHcQ3uN1/LPxj2yfkyQLmhJxmtptLUy9j53rcw==", + "dev": true, + "peer": true, + "dependencies": { + "@parcel/codeframe": "2.8.0", + "@parcel/diagnostic": "2.8.0", + "@parcel/hash": "2.8.0", + "@parcel/logger": "2.8.0", + "@parcel/markdown-ansi": "2.8.0", + "@parcel/source-map": "^2.1.1", + "chalk": "^4.1.0" + }, + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/hash": { + "version": "2.8.0", + "resolved": "https://registry.npmjs.org/@parcel/hash/-/hash-2.8.0.tgz", + "integrity": "sha512-KV1+96t7Nukth5K7ldUXjVr8ZTH9Dohl49K0Tc+5Qkysif0OxwcDtpVDmcnrUnWmqdBX0AdoLY0Q2Nnly89n/w==", + "dev": true, + "peer": true, + "dependencies": { + "detect-libc": "^1.0.3", + "xxhash-wasm": "^0.4.2" + }, + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/hash/node_modules/detect-libc": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-1.0.3.tgz", + "integrity": "sha512-pGjwhsmsp4kL2RTz08wcOlGN83otlqHeD/Z5T8GXZB+/YcpQ/dgo+lbU8ZsGxV0HIvqqxo9l7mqYwyYMD9bKDg==", + "dev": true, + "peer": true, + "bin": { + "detect-libc": "bin/detect-libc.js" + }, + "engines": { + "node": ">=0.10" + } + }, + "node_modules/@parcel/logger": { + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/@parcel/logger/-/logger-2.7.0.tgz", + "integrity": "sha512-qjMY/bYo38+o+OiIrTRldU9CwL1E7J72t+xkTP8QIcUxLWz5LYR0YbynZUVulmBSfqsykjjxCy4a+8siVr+lPw==", + "dev": true, + "dependencies": { + "@parcel/diagnostic": "2.7.0", + "@parcel/events": "2.7.0" + }, + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/logger/node_modules/@parcel/events": { + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/@parcel/events/-/events-2.7.0.tgz", + "integrity": "sha512-kQDwMKgZ1U4M/G17qeDYF6bW5kybluN6ajYPc7mZcrWg+trEI/oXi81GMFaMX0BSUhwhbiN5+/Vb2wiG/Sn6ig==", + "dev": true, + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/markdown-ansi": { + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/@parcel/markdown-ansi/-/markdown-ansi-2.7.0.tgz", + "integrity": "sha512-ipOX0D6FVZFEXeb/z8MnTMq2RQEIuaILY90olVIuHEFLHHfOPEn+RK3u13HA1ChF5/9E3cMD79tu6x9JL9Kqag==", + "dev": true, + "dependencies": { + "chalk": "^4.1.0" + }, + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/package-manager": { + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/@parcel/package-manager/-/package-manager-2.7.0.tgz", + "integrity": "sha512-wmfSX1mRrTi8MeA4KrnPk/x7zGUsILCQmTo6lA4gygzAxDbM1pGuyFN8/Kt0y0SFO2lbljARtD/4an5qdotH+Q==", + "dev": true, + "dependencies": { + "@parcel/diagnostic": "2.7.0", + "@parcel/fs": "2.7.0", + "@parcel/logger": "2.7.0", + "@parcel/types": "2.7.0", + "@parcel/utils": "2.7.0", + "@parcel/workers": "2.7.0", + "semver": "^5.7.1" + }, + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + }, + "peerDependencies": { + "@parcel/core": "^2.7.0" + } + }, + "node_modules/@parcel/package-manager/node_modules/semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", + "dev": true, + "bin": { + "semver": "bin/semver" + } + }, + "node_modules/@parcel/packager-ts": { + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/@parcel/packager-ts/-/packager-ts-2.7.0.tgz", + "integrity": "sha512-XT46njOHQCYmubQRbtjQOLT9RbXgxQ8aTxCOeO9jEay6snDnY6k+HdMXHAD6qZNyVgm85HJzjmDFDUeJQt9LKw==", + "dev": true, + "dependencies": { + "@parcel/plugin": "2.7.0" + }, + "engines": { + "node": ">= 12.0.0", + "parcel": "^2.7.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/plugin": { + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/@parcel/plugin/-/plugin-2.7.0.tgz", + "integrity": "sha512-qqgx+nnMn6/0lRc4lKbLGmhNtBiT93S2gFNB4Eb4Pfz/SxVYoW+fmml+KdfOSiZffWOAH5L6NwhyD7N8aSikzw==", + "dev": true, + "dependencies": { + "@parcel/types": "2.7.0" + }, + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/source-map": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/@parcel/source-map/-/source-map-2.1.1.tgz", + "integrity": "sha512-Ejx1P/mj+kMjQb8/y5XxDUn4reGdr+WyKYloBljpppUy8gs42T+BNoEOuRYqDVdgPc6NxduzIDoJS9pOFfV5Ew==", + "dev": true, + "dependencies": { + "detect-libc": "^1.0.3" + }, + "engines": { + "node": "^12.18.3 || >=14" + } + }, + "node_modules/@parcel/source-map/node_modules/detect-libc": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-1.0.3.tgz", + "integrity": "sha512-pGjwhsmsp4kL2RTz08wcOlGN83otlqHeD/Z5T8GXZB+/YcpQ/dgo+lbU8ZsGxV0HIvqqxo9l7mqYwyYMD9bKDg==", + "dev": true, + "bin": { + "detect-libc": "bin/detect-libc.js" + }, + "engines": { + "node": ">=0.10" + } + }, + "node_modules/@parcel/transformer-typescript-types": { + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/@parcel/transformer-typescript-types/-/transformer-typescript-types-2.7.0.tgz", + "integrity": "sha512-7eZFJH+0ZOZoh+4ZUKVnP79LI8h45hGAAqCI1UG8l7ZEf6q9yy8lwF9cREu4dUih70TDUHnHkxoNHfZWOjkDSg==", + "dev": true, + "dependencies": { + "@parcel/diagnostic": "2.7.0", + "@parcel/plugin": "2.7.0", + "@parcel/source-map": "^2.0.0", + "@parcel/ts-utils": "2.7.0", + "@parcel/utils": "2.7.0", + "nullthrows": "^1.1.1" + }, + "engines": { + "node": ">= 12.0.0", + "parcel": "^2.7.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + }, + "peerDependencies": { + "typescript": ">=3.0.0" + } + }, + "node_modules/@parcel/ts-utils": { + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/@parcel/ts-utils/-/ts-utils-2.7.0.tgz", + "integrity": "sha512-hxgWu9p9+zo9OvllYy12DRrAEyAGGLQysI6PyNvYvsZSmb7sQg9YQ7spD1QmWIQUC1H6BkyzQsowpK0hvPK1xg==", + "dev": true, + "dependencies": { + "nullthrows": "^1.1.1" + }, + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + }, + "peerDependencies": { + "typescript": ">=3.0.0" + } + }, + "node_modules/@parcel/types": { + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/@parcel/types/-/types-2.7.0.tgz", + "integrity": "sha512-+dhXVUnseTCpJvBTGMp0V6X13z6O/A/+CUtwEpMGZ8XSmZ4Gk44GvaTiBOp0bJpWG4fvCKp+UmC8PYbrDiiziw==", + "dev": true, + "dependencies": { + "@parcel/cache": "2.7.0", + "@parcel/diagnostic": "2.7.0", + "@parcel/fs": "2.7.0", + "@parcel/package-manager": "2.7.0", + "@parcel/source-map": "^2.0.0", + "@parcel/workers": "2.7.0", + "utility-types": "^3.10.0" + } + }, + "node_modules/@parcel/utils": { + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/@parcel/utils/-/utils-2.7.0.tgz", + "integrity": "sha512-jNZ5bIGg1r1RDRKi562o4kuVwnz+XJ2Ie3b0Zwrqwvgfj6AbRFIKzDd+h85dWWmcDYzKUbHp11u6VJl1u8Vapg==", + "dev": true, + "dependencies": { + "@parcel/codeframe": "2.7.0", + "@parcel/diagnostic": "2.7.0", + "@parcel/hash": "2.7.0", + "@parcel/logger": "2.7.0", + "@parcel/markdown-ansi": "2.7.0", + "@parcel/source-map": "^2.0.0", + "chalk": "^4.1.0" + }, + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/utils/node_modules/@parcel/hash": { + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/@parcel/hash/-/hash-2.7.0.tgz", + "integrity": "sha512-k6bSKnIlPJMPU3yjQzfgfvF9zuJZGOAlJgzpL4BbWvdbE8BTdjzLcFn0Ujrtud94EgIkiXd22sC2HpCUWoHGdA==", + "dev": true, + "dependencies": { + "detect-libc": "^1.0.3", + "xxhash-wasm": "^0.4.2" + }, + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/utils/node_modules/detect-libc": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-1.0.3.tgz", + "integrity": "sha512-pGjwhsmsp4kL2RTz08wcOlGN83otlqHeD/Z5T8GXZB+/YcpQ/dgo+lbU8ZsGxV0HIvqqxo9l7mqYwyYMD9bKDg==", + "dev": true, + "bin": { + "detect-libc": "bin/detect-libc.js" + }, + "engines": { + "node": ">=0.10" + } + }, + "node_modules/@parcel/watcher": { + "version": "2.0.7", + "resolved": "https://registry.npmjs.org/@parcel/watcher/-/watcher-2.0.7.tgz", + "integrity": "sha512-gc3hoS6e+2XdIQ4HHljDB1l0Yx2EWh/sBBtCEFNKGSMlwASWeAQsOY/fPbxOBcZ/pg0jBh4Ga+4xHlZc4faAEQ==", + "dev": true, + "hasInstallScript": true, + "dependencies": { + "node-addon-api": "^3.2.1", + "node-gyp-build": "^4.3.0" + }, + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/watcher/node_modules/node-addon-api": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/node-addon-api/-/node-addon-api-3.2.1.tgz", + "integrity": "sha512-mmcei9JghVNDYydghQmeDX8KoAm0FAiYyIcUt/N4nhyAipB17pllZQDOJD2fotxABnt4Mdz+dKTO7eftLg4d0A==", + "dev": true + }, + "node_modules/@parcel/workers": { + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/@parcel/workers/-/workers-2.7.0.tgz", + "integrity": "sha512-99VfaOX+89+RaoTSyH9ZQtkMBFZBFMvJmVJ/GeJT6QCd2wtKBStTHlaSnQOkLD/iRjJCNwV2xpZmm8YkTwV+hg==", + "dev": true, + "dependencies": { + "@parcel/diagnostic": "2.7.0", + "@parcel/logger": "2.7.0", + "@parcel/types": "2.7.0", + "@parcel/utils": "2.7.0", + "chrome-trace-event": "^1.0.2", + "nullthrows": "^1.1.1" + }, + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + }, + "peerDependencies": { + "@parcel/core": "^2.7.0" + } + }, "node_modules/@sideway/address": { "version": "4.1.4", "resolved": "https://registry.npmjs.org/@sideway/address/-/address-4.1.4.tgz", @@ -125,6 +1178,13 @@ "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz", "integrity": "sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==" }, + "node_modules/abortcontroller-polyfill": { + "version": "1.7.5", + "resolved": "https://registry.npmjs.org/abortcontroller-polyfill/-/abortcontroller-polyfill-1.7.5.tgz", + "integrity": "sha512-JMJ5soJWP18htbbxJjG7bG6yuI6pRhgJ0scHHTfkUjf6wjP912xZWvM+A4sJK3gqd9E8fcPbDnOefbA9Th/FIQ==", + "dev": true, + "peer": true + }, "node_modules/accepts": { "version": "1.3.8", "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.8.tgz", @@ -183,6 +1243,21 @@ "node": ">=8" } }, + "node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, "node_modules/aproba": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/aproba/-/aproba-2.0.0.tgz", @@ -210,6 +1285,16 @@ "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==" }, + "node_modules/base-x": { + "version": "3.0.9", + "resolved": "https://registry.npmjs.org/base-x/-/base-x-3.0.9.tgz", + "integrity": "sha512-H7JU6iBHTal1gp56aKoaa//YUxEaAOUiydvrV/pILqIHXTtqxSkATOnDA2u+jZ/61sD+L/412+7kzXRtWukhpQ==", + "dev": true, + "peer": true, + "dependencies": { + "safe-buffer": "^5.0.1" + } + }, "node_modules/body-parser": { "version": "1.20.1", "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.1.tgz", @@ -282,6 +1367,35 @@ "concat-map": "0.0.1" } }, + "node_modules/browserslist": { + "version": "4.21.4", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.21.4.tgz", + "integrity": "sha512-CBHJJdDmgjl3daYjN5Cp5kbTf1mUhZoS+beLklHIvkOWscs83YAhLlF3Wsh/lciQYAcbBJgTOD44VtG31ZM4Hw==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/browserslist" + } + ], + "peer": true, + "dependencies": { + "caniuse-lite": "^1.0.30001400", + "electron-to-chromium": "^1.4.251", + "node-releases": "^2.0.6", + "update-browserslist-db": "^1.0.9" + }, + "bin": { + "browserslist": "cli.js" + }, + "engines": { + "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" + } + }, "node_modules/bufferutil": { "version": "4.0.7", "resolved": "https://registry.npmjs.org/bufferutil/-/bufferutil-4.0.7.tgz", @@ -343,6 +1457,39 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/caniuse-lite": { + "version": "1.0.30001434", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001434.tgz", + "integrity": "sha512-aOBHrLmTQw//WFa2rcF1If9fa3ypkC1wzqqiKHgfdrXTWcU8C4gKVZT77eQAPWN1APys3+uQ0Df07rKauXGEYA==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/caniuse-lite" + } + ], + "peer": true + }, + "node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, "node_modules/chownr": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/chownr/-/chownr-2.0.0.tgz", @@ -356,6 +1503,15 @@ "resolved": "https://registry.npmjs.org/chroma-js/-/chroma-js-2.4.2.tgz", "integrity": "sha512-U9eDw6+wt7V8z5NncY2jJfZa+hUH8XEj8FQHgFJTrUFnJfXYf4Ml4adI2vXZOjqRDpFWtYVWypDfZwnJ+HIR4A==" }, + "node_modules/chrome-trace-event": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/chrome-trace-event/-/chrome-trace-event-1.0.3.tgz", + "integrity": "sha512-p3KULyQg4S7NIHixdwbGX+nFHkoBiA4YQmyWtjb8XngSKV124nJmRysgAeujbUVb15vh+RvFUfCPqU7rXk+hZg==", + "dev": true, + "engines": { + "node": ">=6.0" + } + }, "node_modules/clean-stack": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/clean-stack/-/clean-stack-2.2.0.tgz", @@ -365,6 +1521,34 @@ "node": ">=6" } }, + "node_modules/clone": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/clone/-/clone-2.1.2.tgz", + "integrity": "sha512-3Pe/CF1Nn94hyhIYpjtiLhdCoEoz0DqQ+988E9gmeEdQZlojxnOb74wctFyuwWQHzqyf9X7C7MG8juUpqBJT8w==", + "dev": true, + "peer": true, + "engines": { + "node": ">=0.8" + } + }, + "node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, "node_modules/color-support": { "version": "1.1.3", "resolved": "https://registry.npmjs.org/color-support/-/color-support-1.1.3.tgz", @@ -538,11 +1722,35 @@ "node": ">=8" } }, + "node_modules/dotenv": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-7.0.0.tgz", + "integrity": "sha512-M3NhsLbV1i6HuGzBUH8vXrtxOk+tWmzWKDMbAVSUp3Zsjm7ywFeuwrUXhmhQyRK1q5B5GGy7hcXPbj3bnfZg2g==", + "dev": true, + "peer": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/dotenv-expand": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/dotenv-expand/-/dotenv-expand-5.1.0.tgz", + "integrity": "sha512-YXQl1DSa4/PQyRfgrv6aoNjhasp/p4qs9FjJ4q4cQk+8m4r6k4ZSiEyytKG8f8W9gi8WsQtIObNmKd+tMzNTmA==", + "dev": true, + "peer": true + }, "node_modules/ee-first": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", "integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==" }, + "node_modules/electron-to-chromium": { + "version": "1.4.284", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.284.tgz", + "integrity": "sha512-M8WEXFuKXMYMVr45fo8mq0wUrrJHheiKZf6BArTKk9ZBYCKJEOU5H8cdWgDT+qCVZf7Na4lVUaZsA+h6uA9+PA==", + "dev": true, + "peer": true + }, "node_modules/emoji-regex": { "version": "8.0.0", "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", @@ -865,6 +2073,15 @@ "node": ">= 0.4.0" } }, + "node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, "node_modules/has-symbols": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz", @@ -1080,6 +2297,18 @@ "resolved": "https://registry.npmjs.org/jpeg-js/-/jpeg-js-0.4.4.tgz", "integrity": "sha512-WZzeDOEtTOBK4Mdsar0IqEU5sMr3vSV2RqkAIzUEV2BHnUfKGyswWFPFwK5EeDo93K3FohSHbLAjj0s1Wzd+dg==" }, + "node_modules/json5": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.1.tgz", + "integrity": "sha512-1hqLFMSrGHRHxav9q9gNjJ5EXznIxGVO09xQRrwplcS8qs28pZ8s8hupZAmqDwZUmVZ2Qb2jnyPOWcDH8m8dlA==", + "dev": true, + "bin": { + "json5": "lib/cli.js" + }, + "engines": { + "node": ">=6" + } + }, "node_modules/knex": { "version": "2.3.0", "resolved": "https://registry.npmjs.org/knex/-/knex-2.3.0.tgz", @@ -1138,6 +2367,28 @@ "node": ">=6.0.0" } }, + "node_modules/lmdb": { + "version": "2.5.2", + "resolved": "https://registry.npmjs.org/lmdb/-/lmdb-2.5.2.tgz", + "integrity": "sha512-V5V5Xa2Hp9i2XsbDALkBTeHXnBXh/lEmk9p22zdr7jtuOIY9TGhjK6vAvTpOOx9IKU4hJkRWZxn/HsvR1ELLtA==", + "dev": true, + "hasInstallScript": true, + "dependencies": { + "msgpackr": "^1.5.4", + "node-addon-api": "^4.3.0", + "node-gyp-build-optional-packages": "5.0.3", + "ordered-binary": "^1.2.4", + "weak-lru-cache": "^1.2.2" + }, + "optionalDependencies": { + "@lmdb/lmdb-darwin-arm64": "2.5.2", + "@lmdb/lmdb-darwin-x64": "2.5.2", + "@lmdb/lmdb-linux-arm": "2.5.2", + "@lmdb/lmdb-linux-arm64": "2.5.2", + "@lmdb/lmdb-linux-x64": "2.5.2", + "@lmdb/lmdb-win32-x64": "2.5.2" + } + }, "node_modules/lodash": { "version": "4.17.21", "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", @@ -1369,6 +2620,37 @@ "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" }, + "node_modules/msgpackr": { + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/msgpackr/-/msgpackr-1.8.0.tgz", + "integrity": "sha512-1Cos3r86XACdjLVY4CN8r72Cgs5lUzxSON6yb81sNZP9vC9nnBrEbu1/ldBhuR9BKejtoYV5C9UhmYUvZFJSNQ==", + "dev": true, + "optionalDependencies": { + "msgpackr-extract": "^2.2.0" + } + }, + "node_modules/msgpackr-extract": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/msgpackr-extract/-/msgpackr-extract-2.2.0.tgz", + "integrity": "sha512-0YcvWSv7ZOGl9Od6Y5iJ3XnPww8O7WLcpYMDwX+PAA/uXLDtyw94PJv9GLQV/nnp3cWlDhMoyKZIQLrx33sWog==", + "dev": true, + "hasInstallScript": true, + "optional": true, + "dependencies": { + "node-gyp-build-optional-packages": "5.0.3" + }, + "bin": { + "download-msgpackr-prebuilds": "bin/download-prebuilds.js" + }, + "optionalDependencies": { + "@msgpackr-extract/msgpackr-extract-darwin-arm64": "2.2.0", + "@msgpackr-extract/msgpackr-extract-darwin-x64": "2.2.0", + "@msgpackr-extract/msgpackr-extract-linux-arm": "2.2.0", + "@msgpackr-extract/msgpackr-extract-linux-arm64": "2.2.0", + "@msgpackr-extract/msgpackr-extract-linux-x64": "2.2.0", + "@msgpackr-extract/msgpackr-extract-win32-x64": "2.2.0" + } + }, "node_modules/ndarray": { "version": "1.0.19", "resolved": "https://registry.npmjs.org/ndarray/-/ndarray-1.0.19.tgz", @@ -1474,6 +2756,17 @@ "node-gyp-build-test": "build-test.js" } }, + "node_modules/node-gyp-build-optional-packages": { + "version": "5.0.3", + "resolved": "https://registry.npmjs.org/node-gyp-build-optional-packages/-/node-gyp-build-optional-packages-5.0.3.tgz", + "integrity": "sha512-k75jcVzk5wnnc/FMxsf4udAoTEUv2jY3ycfdSd3yWu6Cnd1oee6/CfZJApyscA4FJOmdoixWwiwOyf16RzD5JA==", + "dev": true, + "bin": { + "node-gyp-build-optional-packages": "bin.js", + "node-gyp-build-optional-packages-optional": "optional.js", + "node-gyp-build-optional-packages-test": "build-test.js" + } + }, "node_modules/node-gyp/node_modules/are-we-there-yet": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/are-we-there-yet/-/are-we-there-yet-3.0.1.tgz", @@ -1521,6 +2814,13 @@ "node": "^12.13.0 || ^14.15.0 || >=16.0.0" } }, + "node_modules/node-releases": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.6.tgz", + "integrity": "sha512-PiVXnNuFm5+iYkLBNeq5211hvO38y63T0i2KKh2KnUs3RpzJ+JtODFjkD8yjLwnDkTYF1eKXheUwdssR+NRZdg==", + "dev": true, + "peer": true + }, "node_modules/nopt": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/nopt/-/nopt-5.0.0.tgz", @@ -1546,6 +2846,12 @@ "set-blocking": "^2.0.0" } }, + "node_modules/nullthrows": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/nullthrows/-/nullthrows-1.1.1.tgz", + "integrity": "sha512-2vPPEi+Z7WqML2jZYddDIfy5Dqb0r2fze2zTxNNknZaFpVHU3mFB3R+DWeJWGVx0ecvttSGlJTI+WG+8Z4cDWw==", + "dev": true + }, "node_modules/object-assign": { "version": "4.1.1", "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", @@ -1594,6 +2900,12 @@ "wrappy": "1" } }, + "node_modules/ordered-binary": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/ordered-binary/-/ordered-binary-1.4.0.tgz", + "integrity": "sha512-EHQ/jk4/a9hLupIKxTfUsQRej1Yd/0QLQs3vGvIqg5ZtCYSzNhkzHoZc7Zf4e4kUlDaC3Uw8Q/1opOLNN2OKRQ==", + "dev": true + }, "node_modules/p-map": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/p-map/-/p-map-4.0.0.tgz", @@ -1640,6 +2952,13 @@ "resolved": "https://registry.npmjs.org/pg-connection-string/-/pg-connection-string-2.5.0.tgz", "integrity": "sha512-r5o/V/ORTA6TmUnyWZR9nCj1klXCO2CEKNRlVuJptZe85QuhFayC7WeMic7ndayT5IRIR0S0xFxFi2ousartlQ==" }, + "node_modules/picocolors": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz", + "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==", + "dev": true, + "peer": true + }, "node_modules/pngjs": { "version": "6.0.0", "resolved": "https://registry.npmjs.org/pngjs/-/pngjs-6.0.0.tgz", @@ -2070,6 +3389,18 @@ "node": ">=8" } }, + "node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, "node_modules/supports-preserve-symlinks-flag": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", @@ -2081,6 +3412,11 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/systemjs": { + "version": "6.13.0", + "resolved": "https://registry.npmjs.org/systemjs/-/systemjs-6.13.0.tgz", + "integrity": "sha512-P3cgh2bpaPvAO2NE3uRp/n6hmk4xPX4DQf+UzTlCAycssKdqhp6hjw+ENWe+aUS7TogKRFtptMosTSFeC6R55g==" + }, "node_modules/tar": { "version": "6.1.12", "resolved": "https://registry.npmjs.org/tar/-/tar-6.1.12.tgz", @@ -2149,6 +3485,12 @@ "resolved": "https://registry.npmjs.org/tree-kit/-/tree-kit-0.7.4.tgz", "integrity": "sha512-Of3tPmVs3b6BhzyUJ7t0olisf47kYr9qAm0XaUpURMjdBn6TwiVaaMuTFoKkkvPGojd9trKAHlrGGcGKcdR1DA==" }, + "node_modules/tslib": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.1.tgz", + "integrity": "sha512-tGyy4dAjRIEwI7BzsB0lynWgOpfqjUdq91XXAlIWD2OwKBH7oCl/GZG/HT4BOHrTlPMOASlMQ7veyTqpmRcrNA==", + "dev": true + }, "node_modules/type": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/type/-/type-1.2.0.tgz", @@ -2174,6 +3516,18 @@ "is-typedarray": "^1.0.0" } }, + "node_modules/typescript": { + "version": "4.9.3", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.9.3.tgz", + "integrity": "sha512-CIfGzTelbKNEnLpLdGFgdyKhG23CKdKgQPOBc+OUNrkJ2vr+KSzsSV5kq5iWhEQbok+quxgGzrAtGWCyU7tHnA==", + "bin": { + "tsc": "bin/tsc", + "tsserver": "bin/tsserver" + }, + "engines": { + "node": ">=4.2.0" + } + }, "node_modules/uniq": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/uniq/-/uniq-1.0.1.tgz", @@ -2205,6 +3559,33 @@ "node": ">= 0.8" } }, + "node_modules/update-browserslist-db": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.10.tgz", + "integrity": "sha512-OztqDenkfFkbSG+tRxBeAnCVPckDBcvibKd35yDONx6OU8N7sqgwc7rCbkJ/WcYtVRZ4ba68d6byhC21GFh7sQ==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/browserslist" + } + ], + "peer": true, + "dependencies": { + "escalade": "^3.1.1", + "picocolors": "^1.0.0" + }, + "bin": { + "browserslist-lint": "cli.js" + }, + "peerDependencies": { + "browserslist": ">= 4.21.0" + } + }, "node_modules/utf-8-validate": { "version": "5.0.10", "resolved": "https://registry.npmjs.org/utf-8-validate/-/utf-8-validate-5.0.10.tgz", @@ -2222,6 +3603,15 @@ "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==" }, + "node_modules/utility-types": { + "version": "3.10.0", + "resolved": "https://registry.npmjs.org/utility-types/-/utility-types-3.10.0.tgz", + "integrity": "sha512-O11mqxmi7wMKCo6HKFt5AhO4BwY3VV68YU07tgxfz8zJTIxr4BpsezN49Ffwy9j3ZpwwJp4fkRwjRzq3uWE6Rg==", + "dev": true, + "engines": { + "node": ">= 4" + } + }, "node_modules/utils-merge": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz", @@ -2238,6 +3628,12 @@ "node": ">= 0.8" } }, + "node_modules/weak-lru-cache": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/weak-lru-cache/-/weak-lru-cache-1.2.2.tgz", + "integrity": "sha512-DEAoo25RfSYMuTGc9vPJzZcZullwIqRDSI9LOy+fkCJPi6hykCnfKaXTuPBDuXAUcqHXyOgFtHNp/kB2FjYHbw==", + "dev": true + }, "node_modules/webidl-conversions": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz", @@ -2309,6 +3705,12 @@ "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==" }, + "node_modules/xxhash-wasm": { + "version": "0.4.2", + "resolved": "https://registry.npmjs.org/xxhash-wasm/-/xxhash-wasm-0.4.2.tgz", + "integrity": "sha512-/eyHVRJQCirEkSZ1agRSCwriMhwlyUcFkXD5TPVSLP+IPzjsqMVzZwdoczLp1SoQU0R3dxz1RpIK+4YNQbCVOA==", + "dev": true + }, "node_modules/yaeti": { "version": "0.0.6", "resolved": "https://registry.npmjs.org/yaeti/-/yaeti-0.0.6.tgz", @@ -2356,6 +3758,63 @@ "@hapi/hoek": "^9.0.0" } }, + "@lezer/common": { + "version": "0.15.12", + "resolved": "https://registry.npmjs.org/@lezer/common/-/common-0.15.12.tgz", + "integrity": "sha512-edfwCxNLnzq5pBA/yaIhwJ3U3Kz8VAUOTRg0hhxaizaI1N+qxV7EXDv/kLCkLeq2RzSFvxexlaj5Mzfn2kY0Ig==", + "dev": true + }, + "@lezer/lr": { + "version": "0.15.8", + "resolved": "https://registry.npmjs.org/@lezer/lr/-/lr-0.15.8.tgz", + "integrity": "sha512-bM6oE6VQZ6hIFxDNKk8bKPa14hqFrV07J/vHGOeiAbJReIaQXmkVb6xQu4MR+JBTLa5arGRyAAjJe1qaQt3Uvg==", + "dev": true, + "requires": { + "@lezer/common": "^0.15.0" + } + }, + "@lmdb/lmdb-darwin-arm64": { + "version": "2.5.2", + "resolved": "https://registry.npmjs.org/@lmdb/lmdb-darwin-arm64/-/lmdb-darwin-arm64-2.5.2.tgz", + "integrity": "sha512-+F8ioQIUN68B4UFiIBYu0QQvgb9FmlKw2ctQMSBfW2QBrZIxz9vD9jCGqTCPqZBRbPHAS/vG1zSXnKqnS2ch/A==", + "dev": true, + "optional": true + }, + "@lmdb/lmdb-darwin-x64": { + "version": "2.5.2", + "resolved": "https://registry.npmjs.org/@lmdb/lmdb-darwin-x64/-/lmdb-darwin-x64-2.5.2.tgz", + "integrity": "sha512-KvPH56KRLLx4KSfKBx0m1r7GGGUMXm0jrKmNE7plbHlesZMuPJICtn07HYgQhj1LNsK7Yqwuvnqh1QxhJnF1EA==", + "dev": true, + "optional": true + }, + "@lmdb/lmdb-linux-arm": { + "version": "2.5.2", + "resolved": "https://registry.npmjs.org/@lmdb/lmdb-linux-arm/-/lmdb-linux-arm-2.5.2.tgz", + "integrity": "sha512-5kQAP21hAkfW5Bl+e0P57dV4dGYnkNIpR7f/GAh6QHlgXx+vp/teVj4PGRZaKAvt0GX6++N6hF8NnGElLDuIDw==", + "dev": true, + "optional": true + }, + "@lmdb/lmdb-linux-arm64": { + "version": "2.5.2", + "resolved": "https://registry.npmjs.org/@lmdb/lmdb-linux-arm64/-/lmdb-linux-arm64-2.5.2.tgz", + "integrity": "sha512-aLl89VHL/wjhievEOlPocoefUyWdvzVrcQ/MHQYZm2JfV1jUsrbr/ZfkPPUFvZBf+VSE+Q0clWs9l29PCX1hTQ==", + "dev": true, + "optional": true + }, + "@lmdb/lmdb-linux-x64": { + "version": "2.5.2", + "resolved": "https://registry.npmjs.org/@lmdb/lmdb-linux-x64/-/lmdb-linux-x64-2.5.2.tgz", + "integrity": "sha512-xUdUfwDJLGjOUPH3BuPBt0NlIrR7f/QHKgu3GZIXswMMIihAekj2i97oI0iWG5Bok/b+OBjHPfa8IU9velnP/Q==", + "dev": true, + "optional": true + }, + "@lmdb/lmdb-win32-x64": { + "version": "2.5.2", + "resolved": "https://registry.npmjs.org/@lmdb/lmdb-win32-x64/-/lmdb-win32-x64-2.5.2.tgz", + "integrity": "sha512-zrBczSbXKxEyK2ijtbRdICDygRqWSRPpZMN5dD1T8VMEW5RIhIbwFWw2phDRXuBQdVDpSjalCIUMWMV2h3JaZA==", + "dev": true, + "optional": true + }, "@mapbox/node-pre-gyp": { "version": "1.0.10", "resolved": "https://registry.npmjs.org/@mapbox/node-pre-gyp/-/node-pre-gyp-1.0.10.tgz", @@ -2372,6 +3831,59 @@ "tar": "^6.1.11" } }, + "@mischnic/json-sourcemap": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/@mischnic/json-sourcemap/-/json-sourcemap-0.1.0.tgz", + "integrity": "sha512-dQb3QnfNqmQNYA4nFSN/uLaByIic58gOXq4Y4XqLOWmOrw73KmJPt/HLyG0wvn1bnR6mBKs/Uwvkh+Hns1T0XA==", + "dev": true, + "requires": { + "@lezer/common": "^0.15.7", + "@lezer/lr": "^0.15.4", + "json5": "^2.2.1" + } + }, + "@msgpackr-extract/msgpackr-extract-darwin-arm64": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/@msgpackr-extract/msgpackr-extract-darwin-arm64/-/msgpackr-extract-darwin-arm64-2.2.0.tgz", + "integrity": "sha512-Z9LFPzfoJi4mflGWV+rv7o7ZbMU5oAU9VmzCgL240KnqDW65Y2HFCT3MW06/ITJSnbVLacmcEJA8phywK7JinQ==", + "dev": true, + "optional": true + }, + "@msgpackr-extract/msgpackr-extract-darwin-x64": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/@msgpackr-extract/msgpackr-extract-darwin-x64/-/msgpackr-extract-darwin-x64-2.2.0.tgz", + "integrity": "sha512-vq0tT8sjZsy4JdSqmadWVw6f66UXqUCabLmUVHZwUFzMgtgoIIQjT4VVRHKvlof3P/dMCkbMJ5hB1oJ9OWHaaw==", + "dev": true, + "optional": true + }, + "@msgpackr-extract/msgpackr-extract-linux-arm": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/@msgpackr-extract/msgpackr-extract-linux-arm/-/msgpackr-extract-linux-arm-2.2.0.tgz", + "integrity": "sha512-SaJ3Qq4lX9Syd2xEo9u3qPxi/OB+5JO/ngJKK97XDpa1C587H9EWYO6KD8995DAjSinWvdHKRrCOXVUC5fvGOg==", + "dev": true, + "optional": true + }, + "@msgpackr-extract/msgpackr-extract-linux-arm64": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/@msgpackr-extract/msgpackr-extract-linux-arm64/-/msgpackr-extract-linux-arm64-2.2.0.tgz", + "integrity": "sha512-hlxxLdRmPyq16QCutUtP8Tm6RDWcyaLsRssaHROatgnkOxdleMTgetf9JsdncL8vLh7FVy/RN9i3XR5dnb9cRA==", + "dev": true, + "optional": true + }, + "@msgpackr-extract/msgpackr-extract-linux-x64": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/@msgpackr-extract/msgpackr-extract-linux-x64/-/msgpackr-extract-linux-x64-2.2.0.tgz", + "integrity": "sha512-94y5PJrSOqUNcFKmOl7z319FelCLAE0rz/jPCWS+UtdMZvpa4jrQd+cJPQCLp2Fes1yAW/YUQj/Di6YVT3c3Iw==", + "dev": true, + "optional": true + }, + "@msgpackr-extract/msgpackr-extract-win32-x64": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/@msgpackr-extract/msgpackr-extract-win32-x64/-/msgpackr-extract-win32-x64-2.2.0.tgz", + "integrity": "sha512-XrC0JzsqQSvOyM3t04FMLO6z5gCuhPE6k4FXuLK5xf52ZbdvcFe1yBmo7meCew9B8G2f0T9iu9t3kfTYRYROgA==", + "dev": true, + "optional": true + }, "@npmcli/fs": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/@npmcli/fs/-/fs-1.1.1.tgz", @@ -2392,6 +3904,554 @@ "rimraf": "^3.0.2" } }, + "@parcel/cache": { + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/@parcel/cache/-/cache-2.7.0.tgz", + "integrity": "sha512-JlXNoZXcWzLKdDlfeF3dIj5Vtel5T9vtdBN72PJ+cjC4qNHk4Uwvc5sfOBELuibGN0bVu2bwY9nUgSwCiB1iIA==", + "dev": true, + "requires": { + "@parcel/fs": "2.7.0", + "@parcel/logger": "2.7.0", + "@parcel/utils": "2.7.0", + "lmdb": "2.5.2" + } + }, + "@parcel/codeframe": { + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/@parcel/codeframe/-/codeframe-2.7.0.tgz", + "integrity": "sha512-UTKx0jejJmmO1dwTHSJuRgrO8N6PMlkxRT6sew8N6NC3Bgv6pu0EbO+RtlWt/jCvzcdLOPdIoTzj4MMZvgcMYg==", + "dev": true, + "requires": { + "chalk": "^4.1.0" + } + }, + "@parcel/core": { + "version": "2.8.0", + "resolved": "https://registry.npmjs.org/@parcel/core/-/core-2.8.0.tgz", + "integrity": "sha512-udzbe3jjbpfKlRE9pdlROAa+lvAjS1L/AzN6r2j1y/Fsn7ze/NfvnCFw6o2YNIrXg002aQ7M1St/x1fdGfmVKA==", + "dev": true, + "peer": true, + "requires": { + "@mischnic/json-sourcemap": "^0.1.0", + "@parcel/cache": "2.8.0", + "@parcel/diagnostic": "2.8.0", + "@parcel/events": "2.8.0", + "@parcel/fs": "2.8.0", + "@parcel/graph": "2.8.0", + "@parcel/hash": "2.8.0", + "@parcel/logger": "2.8.0", + "@parcel/package-manager": "2.8.0", + "@parcel/plugin": "2.8.0", + "@parcel/source-map": "^2.1.1", + "@parcel/types": "2.8.0", + "@parcel/utils": "2.8.0", + "@parcel/workers": "2.8.0", + "abortcontroller-polyfill": "^1.1.9", + "base-x": "^3.0.8", + "browserslist": "^4.6.6", + "clone": "^2.1.1", + "dotenv": "^7.0.0", + "dotenv-expand": "^5.1.0", + "json5": "^2.2.0", + "msgpackr": "^1.5.4", + "nullthrows": "^1.1.1", + "semver": "^5.7.1" + }, + "dependencies": { + "@parcel/cache": { + "version": "2.8.0", + "resolved": "https://registry.npmjs.org/@parcel/cache/-/cache-2.8.0.tgz", + "integrity": "sha512-k945hrafMDR2wyCKyZYgwypeLLuZWce6FzhgunI4taBUeVnNCcpFAWzbfOVQ39SqZTGDqG3MNT+VuehssHXxyg==", + "dev": true, + "peer": true, + "requires": { + "@parcel/fs": "2.8.0", + "@parcel/logger": "2.8.0", + "@parcel/utils": "2.8.0", + "lmdb": "2.5.2" + } + }, + "@parcel/codeframe": { + "version": "2.8.0", + "resolved": "https://registry.npmjs.org/@parcel/codeframe/-/codeframe-2.8.0.tgz", + "integrity": "sha512-821d+KVcpEvJNMj9WMC39xXZK6zvRS/HUjQag2f3DkcRcZwk1uXJZdW6p1EB7C3e4e/0KSK3NTSVGEvbOSR+9w==", + "dev": true, + "peer": true, + "requires": { + "chalk": "^4.1.0" + } + }, + "@parcel/diagnostic": { + "version": "2.8.0", + "resolved": "https://registry.npmjs.org/@parcel/diagnostic/-/diagnostic-2.8.0.tgz", + "integrity": "sha512-ERnk0zDvm0jQUSj1M+2PLiwVC6nWrtuFEuye6VGuxRDcp9NHbz6gwApeEYxFkPsb3TQPhNjnXXm5nmAw1bpWWw==", + "dev": true, + "peer": true, + "requires": { + "@mischnic/json-sourcemap": "^0.1.0", + "nullthrows": "^1.1.1" + } + }, + "@parcel/fs": { + "version": "2.8.0", + "resolved": "https://registry.npmjs.org/@parcel/fs/-/fs-2.8.0.tgz", + "integrity": "sha512-v3DbJlpl8v2/VRlZPw7cy+0myi0YfLblGZcwDvqIsWS35qyxD2rmtYV8u1BusonbgmJeaKiopSECmJkumt0jCw==", + "dev": true, + "peer": true, + "requires": { + "@parcel/fs-search": "2.8.0", + "@parcel/types": "2.8.0", + "@parcel/utils": "2.8.0", + "@parcel/watcher": "^2.0.7", + "@parcel/workers": "2.8.0" + } + }, + "@parcel/fs-search": { + "version": "2.8.0", + "resolved": "https://registry.npmjs.org/@parcel/fs-search/-/fs-search-2.8.0.tgz", + "integrity": "sha512-yo7/Y8DCFlhOlIBb5SsRDTkM+7g0DY9sK57iw3hn2z1tGoIiIRptrieImFYSizs7HfDwDY/PMLfORmUdoReDzQ==", + "dev": true, + "peer": true, + "requires": { + "detect-libc": "^1.0.3" + } + }, + "@parcel/logger": { + "version": "2.8.0", + "resolved": "https://registry.npmjs.org/@parcel/logger/-/logger-2.8.0.tgz", + "integrity": "sha512-W+7rKsLxLUX6xRmP8PhGWcG48PqrzTPeMWpgSds5nXxAHEFh4cYbkwPKGoTU65a9xUDVyqNreHNIKyizgwAZHQ==", + "dev": true, + "peer": true, + "requires": { + "@parcel/diagnostic": "2.8.0", + "@parcel/events": "2.8.0" + } + }, + "@parcel/markdown-ansi": { + "version": "2.8.0", + "resolved": "https://registry.npmjs.org/@parcel/markdown-ansi/-/markdown-ansi-2.8.0.tgz", + "integrity": "sha512-xItzXmc3btFhJXsIbE946iaqE6STd2xe5H0zSIaZVXEeucCtMzcd4hxRELquxPstlrAOrrp/lrRpbAlMhso9iA==", + "dev": true, + "peer": true, + "requires": { + "chalk": "^4.1.0" + } + }, + "@parcel/package-manager": { + "version": "2.8.0", + "resolved": "https://registry.npmjs.org/@parcel/package-manager/-/package-manager-2.8.0.tgz", + "integrity": "sha512-n4FgerAX1lTKKTgxmiocnos47Y+b0L60iwU6Q4cC2n4KQNRuNyfhxFXwWcqHstR9wa72JgPaDgo4k0l3Bk8FZw==", + "dev": true, + "peer": true, + "requires": { + "@parcel/diagnostic": "2.8.0", + "@parcel/fs": "2.8.0", + "@parcel/logger": "2.8.0", + "@parcel/types": "2.8.0", + "@parcel/utils": "2.8.0", + "@parcel/workers": "2.8.0", + "semver": "^5.7.1" + } + }, + "@parcel/plugin": { + "version": "2.8.0", + "resolved": "https://registry.npmjs.org/@parcel/plugin/-/plugin-2.8.0.tgz", + "integrity": "sha512-Tsf+7nDg7KauvTVY6rGc7CmgJruKSwJ54KJ9s5nYFFP9nfwmyqbayCi9xOxicWU9zIHfuF5Etwf17lcA0oAvzw==", + "dev": true, + "peer": true, + "requires": { + "@parcel/types": "2.8.0" + } + }, + "@parcel/types": { + "version": "2.8.0", + "resolved": "https://registry.npmjs.org/@parcel/types/-/types-2.8.0.tgz", + "integrity": "sha512-DeN3vCnVl9onjtyWxpbP7LwRslVEko4kBaM7yILsuQjEnXmaIOsqIf6FQJOUOPBtQTFFNeQQ2qyf5XoO/rkJ8g==", + "dev": true, + "peer": true, + "requires": { + "@parcel/cache": "2.8.0", + "@parcel/diagnostic": "2.8.0", + "@parcel/fs": "2.8.0", + "@parcel/package-manager": "2.8.0", + "@parcel/source-map": "^2.1.1", + "@parcel/workers": "2.8.0", + "utility-types": "^3.10.0" + } + }, + "@parcel/utils": { + "version": "2.8.0", + "resolved": "https://registry.npmjs.org/@parcel/utils/-/utils-2.8.0.tgz", + "integrity": "sha512-r4ACsGtW7zkMUIgwQyOVtPAFiy8L81gbz4tMIRSqyQKnkW7oEHcQ3uN1/LPxj2yfkyQLmhJxmtptLUy9j53rcw==", + "dev": true, + "peer": true, + "requires": { + "@parcel/codeframe": "2.8.0", + "@parcel/diagnostic": "2.8.0", + "@parcel/hash": "2.8.0", + "@parcel/logger": "2.8.0", + "@parcel/markdown-ansi": "2.8.0", + "@parcel/source-map": "^2.1.1", + "chalk": "^4.1.0" + } + }, + "@parcel/workers": { + "version": "2.8.0", + "resolved": "https://registry.npmjs.org/@parcel/workers/-/workers-2.8.0.tgz", + "integrity": "sha512-vAzoC/wPHLQnyy9P/TrSPftY8F3MhZqPTFi681mxVtLWA3t7wiNlw1zDVKRDP8m5XS1yQOr8Q56CAHyRexhc8g==", + "dev": true, + "peer": true, + "requires": { + "@parcel/diagnostic": "2.8.0", + "@parcel/logger": "2.8.0", + "@parcel/types": "2.8.0", + "@parcel/utils": "2.8.0", + "chrome-trace-event": "^1.0.2", + "nullthrows": "^1.1.1" + } + }, + "detect-libc": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-1.0.3.tgz", + "integrity": "sha512-pGjwhsmsp4kL2RTz08wcOlGN83otlqHeD/Z5T8GXZB+/YcpQ/dgo+lbU8ZsGxV0HIvqqxo9l7mqYwyYMD9bKDg==", + "dev": true, + "peer": true + }, + "semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", + "dev": true, + "peer": true + } + } + }, + "@parcel/diagnostic": { + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/@parcel/diagnostic/-/diagnostic-2.7.0.tgz", + "integrity": "sha512-pdq/cTwVoL0n8yuDCRXFRSQHVWdmmIXPt3R3iT4KtYDYvOrMT2dLPT79IMqQkhYPANW8GuL15n/WxRngfRdkug==", + "dev": true, + "requires": { + "@mischnic/json-sourcemap": "^0.1.0", + "nullthrows": "^1.1.1" + } + }, + "@parcel/events": { + "version": "2.8.0", + "resolved": "https://registry.npmjs.org/@parcel/events/-/events-2.8.0.tgz", + "integrity": "sha512-xqSZYY3oONM4IZm9+vhyFqX+KFIl145veIczUikwGJlcJZQfAAw736syPx6ecpB+m1EVg3AlvJWy7Lmel4Ak+Q==", + "dev": true, + "peer": true + }, + "@parcel/fs": { + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/@parcel/fs/-/fs-2.7.0.tgz", + "integrity": "sha512-PU5fo4Hh8y03LZgemgVREttc0wyHQUNmsJCybxTB7EjJie2CqJRumo+DFppArlvdchLwJdc9em03yQV/GNWrEg==", + "dev": true, + "requires": { + "@parcel/fs-search": "2.7.0", + "@parcel/types": "2.7.0", + "@parcel/utils": "2.7.0", + "@parcel/watcher": "^2.0.0", + "@parcel/workers": "2.7.0" + } + }, + "@parcel/fs-search": { + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/@parcel/fs-search/-/fs-search-2.7.0.tgz", + "integrity": "sha512-K1Hv25bnRpwQVA15RvcRuB8ZhfclnCHA8N8L6w7Ul1ncSJDxCIkIAc5hAubYNNYW3kWjCC2SOaEgFKnbvMllEQ==", + "dev": true, + "requires": { + "detect-libc": "^1.0.3" + }, + "dependencies": { + "detect-libc": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-1.0.3.tgz", + "integrity": "sha512-pGjwhsmsp4kL2RTz08wcOlGN83otlqHeD/Z5T8GXZB+/YcpQ/dgo+lbU8ZsGxV0HIvqqxo9l7mqYwyYMD9bKDg==", + "dev": true + } + } + }, + "@parcel/graph": { + "version": "2.8.0", + "resolved": "https://registry.npmjs.org/@parcel/graph/-/graph-2.8.0.tgz", + "integrity": "sha512-JvAyvBpGmhZ30bi+hStQr52eu+InfJBoiN9Z/32byIWhXEl02EAOwfsPqAe+FGCsdgXnnCGg5F9ZCqwzZ9dwbw==", + "dev": true, + "peer": true, + "requires": { + "@parcel/utils": "2.8.0", + "nullthrows": "^1.1.1" + }, + "dependencies": { + "@parcel/codeframe": { + "version": "2.8.0", + "resolved": "https://registry.npmjs.org/@parcel/codeframe/-/codeframe-2.8.0.tgz", + "integrity": "sha512-821d+KVcpEvJNMj9WMC39xXZK6zvRS/HUjQag2f3DkcRcZwk1uXJZdW6p1EB7C3e4e/0KSK3NTSVGEvbOSR+9w==", + "dev": true, + "peer": true, + "requires": { + "chalk": "^4.1.0" + } + }, + "@parcel/diagnostic": { + "version": "2.8.0", + "resolved": "https://registry.npmjs.org/@parcel/diagnostic/-/diagnostic-2.8.0.tgz", + "integrity": "sha512-ERnk0zDvm0jQUSj1M+2PLiwVC6nWrtuFEuye6VGuxRDcp9NHbz6gwApeEYxFkPsb3TQPhNjnXXm5nmAw1bpWWw==", + "dev": true, + "peer": true, + "requires": { + "@mischnic/json-sourcemap": "^0.1.0", + "nullthrows": "^1.1.1" + } + }, + "@parcel/logger": { + "version": "2.8.0", + "resolved": "https://registry.npmjs.org/@parcel/logger/-/logger-2.8.0.tgz", + "integrity": "sha512-W+7rKsLxLUX6xRmP8PhGWcG48PqrzTPeMWpgSds5nXxAHEFh4cYbkwPKGoTU65a9xUDVyqNreHNIKyizgwAZHQ==", + "dev": true, + "peer": true, + "requires": { + "@parcel/diagnostic": "2.8.0", + "@parcel/events": "2.8.0" + } + }, + "@parcel/markdown-ansi": { + "version": "2.8.0", + "resolved": "https://registry.npmjs.org/@parcel/markdown-ansi/-/markdown-ansi-2.8.0.tgz", + "integrity": "sha512-xItzXmc3btFhJXsIbE946iaqE6STd2xe5H0zSIaZVXEeucCtMzcd4hxRELquxPstlrAOrrp/lrRpbAlMhso9iA==", + "dev": true, + "peer": true, + "requires": { + "chalk": "^4.1.0" + } + }, + "@parcel/utils": { + "version": "2.8.0", + "resolved": "https://registry.npmjs.org/@parcel/utils/-/utils-2.8.0.tgz", + "integrity": "sha512-r4ACsGtW7zkMUIgwQyOVtPAFiy8L81gbz4tMIRSqyQKnkW7oEHcQ3uN1/LPxj2yfkyQLmhJxmtptLUy9j53rcw==", + "dev": true, + "peer": true, + "requires": { + "@parcel/codeframe": "2.8.0", + "@parcel/diagnostic": "2.8.0", + "@parcel/hash": "2.8.0", + "@parcel/logger": "2.8.0", + "@parcel/markdown-ansi": "2.8.0", + "@parcel/source-map": "^2.1.1", + "chalk": "^4.1.0" + } + } + } + }, + "@parcel/hash": { + "version": "2.8.0", + "resolved": "https://registry.npmjs.org/@parcel/hash/-/hash-2.8.0.tgz", + "integrity": "sha512-KV1+96t7Nukth5K7ldUXjVr8ZTH9Dohl49K0Tc+5Qkysif0OxwcDtpVDmcnrUnWmqdBX0AdoLY0Q2Nnly89n/w==", + "dev": true, + "peer": true, + "requires": { + "detect-libc": "^1.0.3", + "xxhash-wasm": "^0.4.2" + }, + "dependencies": { + "detect-libc": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-1.0.3.tgz", + "integrity": "sha512-pGjwhsmsp4kL2RTz08wcOlGN83otlqHeD/Z5T8GXZB+/YcpQ/dgo+lbU8ZsGxV0HIvqqxo9l7mqYwyYMD9bKDg==", + "dev": true, + "peer": true + } + } + }, + "@parcel/logger": { + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/@parcel/logger/-/logger-2.7.0.tgz", + "integrity": "sha512-qjMY/bYo38+o+OiIrTRldU9CwL1E7J72t+xkTP8QIcUxLWz5LYR0YbynZUVulmBSfqsykjjxCy4a+8siVr+lPw==", + "dev": true, + "requires": { + "@parcel/diagnostic": "2.7.0", + "@parcel/events": "2.7.0" + }, + "dependencies": { + "@parcel/events": { + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/@parcel/events/-/events-2.7.0.tgz", + "integrity": "sha512-kQDwMKgZ1U4M/G17qeDYF6bW5kybluN6ajYPc7mZcrWg+trEI/oXi81GMFaMX0BSUhwhbiN5+/Vb2wiG/Sn6ig==", + "dev": true + } + } + }, + "@parcel/markdown-ansi": { + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/@parcel/markdown-ansi/-/markdown-ansi-2.7.0.tgz", + "integrity": "sha512-ipOX0D6FVZFEXeb/z8MnTMq2RQEIuaILY90olVIuHEFLHHfOPEn+RK3u13HA1ChF5/9E3cMD79tu6x9JL9Kqag==", + "dev": true, + "requires": { + "chalk": "^4.1.0" + } + }, + "@parcel/package-manager": { + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/@parcel/package-manager/-/package-manager-2.7.0.tgz", + "integrity": "sha512-wmfSX1mRrTi8MeA4KrnPk/x7zGUsILCQmTo6lA4gygzAxDbM1pGuyFN8/Kt0y0SFO2lbljARtD/4an5qdotH+Q==", + "dev": true, + "requires": { + "@parcel/diagnostic": "2.7.0", + "@parcel/fs": "2.7.0", + "@parcel/logger": "2.7.0", + "@parcel/types": "2.7.0", + "@parcel/utils": "2.7.0", + "@parcel/workers": "2.7.0", + "semver": "^5.7.1" + }, + "dependencies": { + "semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", + "dev": true + } + } + }, + "@parcel/packager-ts": { + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/@parcel/packager-ts/-/packager-ts-2.7.0.tgz", + "integrity": "sha512-XT46njOHQCYmubQRbtjQOLT9RbXgxQ8aTxCOeO9jEay6snDnY6k+HdMXHAD6qZNyVgm85HJzjmDFDUeJQt9LKw==", + "dev": true, + "requires": { + "@parcel/plugin": "2.7.0" + } + }, + "@parcel/plugin": { + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/@parcel/plugin/-/plugin-2.7.0.tgz", + "integrity": "sha512-qqgx+nnMn6/0lRc4lKbLGmhNtBiT93S2gFNB4Eb4Pfz/SxVYoW+fmml+KdfOSiZffWOAH5L6NwhyD7N8aSikzw==", + "dev": true, + "requires": { + "@parcel/types": "2.7.0" + } + }, + "@parcel/source-map": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/@parcel/source-map/-/source-map-2.1.1.tgz", + "integrity": "sha512-Ejx1P/mj+kMjQb8/y5XxDUn4reGdr+WyKYloBljpppUy8gs42T+BNoEOuRYqDVdgPc6NxduzIDoJS9pOFfV5Ew==", + "dev": true, + "requires": { + "detect-libc": "^1.0.3" + }, + "dependencies": { + "detect-libc": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-1.0.3.tgz", + "integrity": "sha512-pGjwhsmsp4kL2RTz08wcOlGN83otlqHeD/Z5T8GXZB+/YcpQ/dgo+lbU8ZsGxV0HIvqqxo9l7mqYwyYMD9bKDg==", + "dev": true + } + } + }, + "@parcel/transformer-typescript-types": { + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/@parcel/transformer-typescript-types/-/transformer-typescript-types-2.7.0.tgz", + "integrity": "sha512-7eZFJH+0ZOZoh+4ZUKVnP79LI8h45hGAAqCI1UG8l7ZEf6q9yy8lwF9cREu4dUih70TDUHnHkxoNHfZWOjkDSg==", + "dev": true, + "requires": { + "@parcel/diagnostic": "2.7.0", + "@parcel/plugin": "2.7.0", + "@parcel/source-map": "^2.0.0", + "@parcel/ts-utils": "2.7.0", + "@parcel/utils": "2.7.0", + "nullthrows": "^1.1.1" + } + }, + "@parcel/ts-utils": { + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/@parcel/ts-utils/-/ts-utils-2.7.0.tgz", + "integrity": "sha512-hxgWu9p9+zo9OvllYy12DRrAEyAGGLQysI6PyNvYvsZSmb7sQg9YQ7spD1QmWIQUC1H6BkyzQsowpK0hvPK1xg==", + "dev": true, + "requires": { + "nullthrows": "^1.1.1" + } + }, + "@parcel/types": { + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/@parcel/types/-/types-2.7.0.tgz", + "integrity": "sha512-+dhXVUnseTCpJvBTGMp0V6X13z6O/A/+CUtwEpMGZ8XSmZ4Gk44GvaTiBOp0bJpWG4fvCKp+UmC8PYbrDiiziw==", + "dev": true, + "requires": { + "@parcel/cache": "2.7.0", + "@parcel/diagnostic": "2.7.0", + "@parcel/fs": "2.7.0", + "@parcel/package-manager": "2.7.0", + "@parcel/source-map": "^2.0.0", + "@parcel/workers": "2.7.0", + "utility-types": "^3.10.0" + } + }, + "@parcel/utils": { + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/@parcel/utils/-/utils-2.7.0.tgz", + "integrity": "sha512-jNZ5bIGg1r1RDRKi562o4kuVwnz+XJ2Ie3b0Zwrqwvgfj6AbRFIKzDd+h85dWWmcDYzKUbHp11u6VJl1u8Vapg==", + "dev": true, + "requires": { + "@parcel/codeframe": "2.7.0", + "@parcel/diagnostic": "2.7.0", + "@parcel/hash": "2.7.0", + "@parcel/logger": "2.7.0", + "@parcel/markdown-ansi": "2.7.0", + "@parcel/source-map": "^2.0.0", + "chalk": "^4.1.0" + }, + "dependencies": { + "@parcel/hash": { + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/@parcel/hash/-/hash-2.7.0.tgz", + "integrity": "sha512-k6bSKnIlPJMPU3yjQzfgfvF9zuJZGOAlJgzpL4BbWvdbE8BTdjzLcFn0Ujrtud94EgIkiXd22sC2HpCUWoHGdA==", + "dev": true, + "requires": { + "detect-libc": "^1.0.3", + "xxhash-wasm": "^0.4.2" + } + }, + "detect-libc": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-1.0.3.tgz", + "integrity": "sha512-pGjwhsmsp4kL2RTz08wcOlGN83otlqHeD/Z5T8GXZB+/YcpQ/dgo+lbU8ZsGxV0HIvqqxo9l7mqYwyYMD9bKDg==", + "dev": true + } + } + }, + "@parcel/watcher": { + "version": "2.0.7", + "resolved": "https://registry.npmjs.org/@parcel/watcher/-/watcher-2.0.7.tgz", + "integrity": "sha512-gc3hoS6e+2XdIQ4HHljDB1l0Yx2EWh/sBBtCEFNKGSMlwASWeAQsOY/fPbxOBcZ/pg0jBh4Ga+4xHlZc4faAEQ==", + "dev": true, + "requires": { + "node-addon-api": "^3.2.1", + "node-gyp-build": "^4.3.0" + }, + "dependencies": { + "node-addon-api": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/node-addon-api/-/node-addon-api-3.2.1.tgz", + "integrity": "sha512-mmcei9JghVNDYydghQmeDX8KoAm0FAiYyIcUt/N4nhyAipB17pllZQDOJD2fotxABnt4Mdz+dKTO7eftLg4d0A==", + "dev": true + } + } + }, + "@parcel/workers": { + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/@parcel/workers/-/workers-2.7.0.tgz", + "integrity": "sha512-99VfaOX+89+RaoTSyH9ZQtkMBFZBFMvJmVJ/GeJT6QCd2wtKBStTHlaSnQOkLD/iRjJCNwV2xpZmm8YkTwV+hg==", + "dev": true, + "requires": { + "@parcel/diagnostic": "2.7.0", + "@parcel/logger": "2.7.0", + "@parcel/types": "2.7.0", + "@parcel/utils": "2.7.0", + "chrome-trace-event": "^1.0.2", + "nullthrows": "^1.1.1" + } + }, "@sideway/address": { "version": "4.1.4", "resolved": "https://registry.npmjs.org/@sideway/address/-/address-4.1.4.tgz", @@ -2421,6 +4481,13 @@ "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz", "integrity": "sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==" }, + "abortcontroller-polyfill": { + "version": "1.7.5", + "resolved": "https://registry.npmjs.org/abortcontroller-polyfill/-/abortcontroller-polyfill-1.7.5.tgz", + "integrity": "sha512-JMJ5soJWP18htbbxJjG7bG6yuI6pRhgJ0scHHTfkUjf6wjP912xZWvM+A4sJK3gqd9E8fcPbDnOefbA9Th/FIQ==", + "dev": true, + "peer": true + }, "accepts": { "version": "1.3.8", "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.8.tgz", @@ -2464,6 +4531,15 @@ "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==" }, + "ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "requires": { + "color-convert": "^2.0.1" + } + }, "aproba": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/aproba/-/aproba-2.0.0.tgz", @@ -2488,6 +4564,16 @@ "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==" }, + "base-x": { + "version": "3.0.9", + "resolved": "https://registry.npmjs.org/base-x/-/base-x-3.0.9.tgz", + "integrity": "sha512-H7JU6iBHTal1gp56aKoaa//YUxEaAOUiydvrV/pILqIHXTtqxSkATOnDA2u+jZ/61sD+L/412+7kzXRtWukhpQ==", + "dev": true, + "peer": true, + "requires": { + "safe-buffer": "^5.0.1" + } + }, "body-parser": { "version": "1.20.1", "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.1.tgz", @@ -2549,6 +4635,19 @@ "concat-map": "0.0.1" } }, + "browserslist": { + "version": "4.21.4", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.21.4.tgz", + "integrity": "sha512-CBHJJdDmgjl3daYjN5Cp5kbTf1mUhZoS+beLklHIvkOWscs83YAhLlF3Wsh/lciQYAcbBJgTOD44VtG31ZM4Hw==", + "dev": true, + "peer": true, + "requires": { + "caniuse-lite": "^1.0.30001400", + "electron-to-chromium": "^1.4.251", + "node-releases": "^2.0.6", + "update-browserslist-db": "^1.0.9" + } + }, "bufferutil": { "version": "4.0.7", "resolved": "https://registry.npmjs.org/bufferutil/-/bufferutil-4.0.7.tgz", @@ -2597,6 +4696,23 @@ "get-intrinsic": "^1.0.2" } }, + "caniuse-lite": { + "version": "1.0.30001434", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001434.tgz", + "integrity": "sha512-aOBHrLmTQw//WFa2rcF1If9fa3ypkC1wzqqiKHgfdrXTWcU8C4gKVZT77eQAPWN1APys3+uQ0Df07rKauXGEYA==", + "dev": true, + "peer": true + }, + "chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, "chownr": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/chownr/-/chownr-2.0.0.tgz", @@ -2607,12 +4723,40 @@ "resolved": "https://registry.npmjs.org/chroma-js/-/chroma-js-2.4.2.tgz", "integrity": "sha512-U9eDw6+wt7V8z5NncY2jJfZa+hUH8XEj8FQHgFJTrUFnJfXYf4Ml4adI2vXZOjqRDpFWtYVWypDfZwnJ+HIR4A==" }, + "chrome-trace-event": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/chrome-trace-event/-/chrome-trace-event-1.0.3.tgz", + "integrity": "sha512-p3KULyQg4S7NIHixdwbGX+nFHkoBiA4YQmyWtjb8XngSKV124nJmRysgAeujbUVb15vh+RvFUfCPqU7rXk+hZg==", + "dev": true + }, "clean-stack": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/clean-stack/-/clean-stack-2.2.0.tgz", "integrity": "sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A==", "optional": true }, + "clone": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/clone/-/clone-2.1.2.tgz", + "integrity": "sha512-3Pe/CF1Nn94hyhIYpjtiLhdCoEoz0DqQ+988E9gmeEdQZlojxnOb74wctFyuwWQHzqyf9X7C7MG8juUpqBJT8w==", + "dev": true, + "peer": true + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, "color-support": { "version": "1.1.3", "resolved": "https://registry.npmjs.org/color-support/-/color-support-1.1.3.tgz", @@ -2749,11 +4893,32 @@ "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.0.1.tgz", "integrity": "sha512-463v3ZeIrcWtdgIg6vI6XUncguvr2TnGl4SzDXinkt9mSLpBJKXT3mW6xT3VQdDN11+WVs29pgvivTc4Lp8v+w==" }, + "dotenv": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-7.0.0.tgz", + "integrity": "sha512-M3NhsLbV1i6HuGzBUH8vXrtxOk+tWmzWKDMbAVSUp3Zsjm7ywFeuwrUXhmhQyRK1q5B5GGy7hcXPbj3bnfZg2g==", + "dev": true, + "peer": true + }, + "dotenv-expand": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/dotenv-expand/-/dotenv-expand-5.1.0.tgz", + "integrity": "sha512-YXQl1DSa4/PQyRfgrv6aoNjhasp/p4qs9FjJ4q4cQk+8m4r6k4ZSiEyytKG8f8W9gi8WsQtIObNmKd+tMzNTmA==", + "dev": true, + "peer": true + }, "ee-first": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", "integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==" }, + "electron-to-chromium": { + "version": "1.4.284", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.284.tgz", + "integrity": "sha512-M8WEXFuKXMYMVr45fo8mq0wUrrJHheiKZf6BArTKk9ZBYCKJEOU5H8cdWgDT+qCVZf7Na4lVUaZsA+h6uA9+PA==", + "dev": true, + "peer": true + }, "emoji-regex": { "version": "8.0.0", "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", @@ -3027,6 +5192,12 @@ "function-bind": "^1.1.1" } }, + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true + }, "has-symbols": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz", @@ -3205,6 +5376,12 @@ "resolved": "https://registry.npmjs.org/jpeg-js/-/jpeg-js-0.4.4.tgz", "integrity": "sha512-WZzeDOEtTOBK4Mdsar0IqEU5sMr3vSV2RqkAIzUEV2BHnUfKGyswWFPFwK5EeDo93K3FohSHbLAjj0s1Wzd+dg==" }, + "json5": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.1.tgz", + "integrity": "sha512-1hqLFMSrGHRHxav9q9gNjJ5EXznIxGVO09xQRrwplcS8qs28pZ8s8hupZAmqDwZUmVZ2Qb2jnyPOWcDH8m8dlA==", + "dev": true + }, "knex": { "version": "2.3.0", "resolved": "https://registry.npmjs.org/knex/-/knex-2.3.0.tgz", @@ -3231,6 +5408,25 @@ "resolved": "https://registry.npmjs.org/lazyness/-/lazyness-1.2.0.tgz", "integrity": "sha512-KenL6EFbwxBwRxG93t0gcUyi0Nw0Ub31FJKN1laA4UscdkL1K1AxUd0gYZdcLU3v+x+wcFi4uQKS5hL+fk500g==" }, + "lmdb": { + "version": "2.5.2", + "resolved": "https://registry.npmjs.org/lmdb/-/lmdb-2.5.2.tgz", + "integrity": "sha512-V5V5Xa2Hp9i2XsbDALkBTeHXnBXh/lEmk9p22zdr7jtuOIY9TGhjK6vAvTpOOx9IKU4hJkRWZxn/HsvR1ELLtA==", + "dev": true, + "requires": { + "@lmdb/lmdb-darwin-arm64": "2.5.2", + "@lmdb/lmdb-darwin-x64": "2.5.2", + "@lmdb/lmdb-linux-arm": "2.5.2", + "@lmdb/lmdb-linux-arm64": "2.5.2", + "@lmdb/lmdb-linux-x64": "2.5.2", + "@lmdb/lmdb-win32-x64": "2.5.2", + "msgpackr": "^1.5.4", + "node-addon-api": "^4.3.0", + "node-gyp-build-optional-packages": "5.0.3", + "ordered-binary": "^1.2.4", + "weak-lru-cache": "^1.2.2" + } + }, "lodash": { "version": "4.17.21", "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", @@ -3399,6 +5595,31 @@ "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" }, + "msgpackr": { + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/msgpackr/-/msgpackr-1.8.0.tgz", + "integrity": "sha512-1Cos3r86XACdjLVY4CN8r72Cgs5lUzxSON6yb81sNZP9vC9nnBrEbu1/ldBhuR9BKejtoYV5C9UhmYUvZFJSNQ==", + "dev": true, + "requires": { + "msgpackr-extract": "^2.2.0" + } + }, + "msgpackr-extract": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/msgpackr-extract/-/msgpackr-extract-2.2.0.tgz", + "integrity": "sha512-0YcvWSv7ZOGl9Od6Y5iJ3XnPww8O7WLcpYMDwX+PAA/uXLDtyw94PJv9GLQV/nnp3cWlDhMoyKZIQLrx33sWog==", + "dev": true, + "optional": true, + "requires": { + "@msgpackr-extract/msgpackr-extract-darwin-arm64": "2.2.0", + "@msgpackr-extract/msgpackr-extract-darwin-x64": "2.2.0", + "@msgpackr-extract/msgpackr-extract-linux-arm": "2.2.0", + "@msgpackr-extract/msgpackr-extract-linux-arm64": "2.2.0", + "@msgpackr-extract/msgpackr-extract-linux-x64": "2.2.0", + "@msgpackr-extract/msgpackr-extract-win32-x64": "2.2.0", + "node-gyp-build-optional-packages": "5.0.3" + } + }, "ndarray": { "version": "1.0.19", "resolved": "https://registry.npmjs.org/ndarray/-/ndarray-1.0.19.tgz", @@ -3513,6 +5734,19 @@ "resolved": "https://registry.npmjs.org/node-gyp-build/-/node-gyp-build-4.5.0.tgz", "integrity": "sha512-2iGbaQBV+ITgCz76ZEjmhUKAKVf7xfY1sRl4UiKQspfZMH2h06SyhNsnSVy50cwkFQDGLyif6m/6uFXHkOZ6rg==" }, + "node-gyp-build-optional-packages": { + "version": "5.0.3", + "resolved": "https://registry.npmjs.org/node-gyp-build-optional-packages/-/node-gyp-build-optional-packages-5.0.3.tgz", + "integrity": "sha512-k75jcVzk5wnnc/FMxsf4udAoTEUv2jY3ycfdSd3yWu6Cnd1oee6/CfZJApyscA4FJOmdoixWwiwOyf16RzD5JA==", + "dev": true + }, + "node-releases": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.6.tgz", + "integrity": "sha512-PiVXnNuFm5+iYkLBNeq5211hvO38y63T0i2KKh2KnUs3RpzJ+JtODFjkD8yjLwnDkTYF1eKXheUwdssR+NRZdg==", + "dev": true, + "peer": true + }, "nopt": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/nopt/-/nopt-5.0.0.tgz", @@ -3532,6 +5766,12 @@ "set-blocking": "^2.0.0" } }, + "nullthrows": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/nullthrows/-/nullthrows-1.1.1.tgz", + "integrity": "sha512-2vPPEi+Z7WqML2jZYddDIfy5Dqb0r2fze2zTxNNknZaFpVHU3mFB3R+DWeJWGVx0ecvttSGlJTI+WG+8Z4cDWw==", + "dev": true + }, "object-assign": { "version": "4.1.1", "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", @@ -3568,6 +5808,12 @@ "wrappy": "1" } }, + "ordered-binary": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/ordered-binary/-/ordered-binary-1.4.0.tgz", + "integrity": "sha512-EHQ/jk4/a9hLupIKxTfUsQRej1Yd/0QLQs3vGvIqg5ZtCYSzNhkzHoZc7Zf4e4kUlDaC3Uw8Q/1opOLNN2OKRQ==", + "dev": true + }, "p-map": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/p-map/-/p-map-4.0.0.tgz", @@ -3602,6 +5848,13 @@ "resolved": "https://registry.npmjs.org/pg-connection-string/-/pg-connection-string-2.5.0.tgz", "integrity": "sha512-r5o/V/ORTA6TmUnyWZR9nCj1klXCO2CEKNRlVuJptZe85QuhFayC7WeMic7ndayT5IRIR0S0xFxFi2ousartlQ==" }, + "picocolors": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz", + "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==", + "dev": true, + "peer": true + }, "pngjs": { "version": "6.0.0", "resolved": "https://registry.npmjs.org/pngjs/-/pngjs-6.0.0.tgz", @@ -3915,11 +6168,25 @@ "ansi-regex": "^5.0.1" } }, + "supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "requires": { + "has-flag": "^4.0.0" + } + }, "supports-preserve-symlinks-flag": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==" }, + "systemjs": { + "version": "6.13.0", + "resolved": "https://registry.npmjs.org/systemjs/-/systemjs-6.13.0.tgz", + "integrity": "sha512-P3cgh2bpaPvAO2NE3uRp/n6hmk4xPX4DQf+UzTlCAycssKdqhp6hjw+ENWe+aUS7TogKRFtptMosTSFeC6R55g==" + }, "tar": { "version": "6.1.12", "resolved": "https://registry.npmjs.org/tar/-/tar-6.1.12.tgz", @@ -3973,6 +6240,12 @@ "resolved": "https://registry.npmjs.org/tree-kit/-/tree-kit-0.7.4.tgz", "integrity": "sha512-Of3tPmVs3b6BhzyUJ7t0olisf47kYr9qAm0XaUpURMjdBn6TwiVaaMuTFoKkkvPGojd9trKAHlrGGcGKcdR1DA==" }, + "tslib": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.1.tgz", + "integrity": "sha512-tGyy4dAjRIEwI7BzsB0lynWgOpfqjUdq91XXAlIWD2OwKBH7oCl/GZG/HT4BOHrTlPMOASlMQ7veyTqpmRcrNA==", + "dev": true + }, "type": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/type/-/type-1.2.0.tgz", @@ -3995,6 +6268,11 @@ "is-typedarray": "^1.0.0" } }, + "typescript": { + "version": "4.9.3", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.9.3.tgz", + "integrity": "sha512-CIfGzTelbKNEnLpLdGFgdyKhG23CKdKgQPOBc+OUNrkJ2vr+KSzsSV5kq5iWhEQbok+quxgGzrAtGWCyU7tHnA==" + }, "uniq": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/uniq/-/uniq-1.0.1.tgz", @@ -4023,6 +6301,17 @@ "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", "integrity": "sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==" }, + "update-browserslist-db": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.10.tgz", + "integrity": "sha512-OztqDenkfFkbSG+tRxBeAnCVPckDBcvibKd35yDONx6OU8N7sqgwc7rCbkJ/WcYtVRZ4ba68d6byhC21GFh7sQ==", + "dev": true, + "peer": true, + "requires": { + "escalade": "^3.1.1", + "picocolors": "^1.0.0" + } + }, "utf-8-validate": { "version": "5.0.10", "resolved": "https://registry.npmjs.org/utf-8-validate/-/utf-8-validate-5.0.10.tgz", @@ -4036,6 +6325,12 @@ "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==" }, + "utility-types": { + "version": "3.10.0", + "resolved": "https://registry.npmjs.org/utility-types/-/utility-types-3.10.0.tgz", + "integrity": "sha512-O11mqxmi7wMKCo6HKFt5AhO4BwY3VV68YU07tgxfz8zJTIxr4BpsezN49Ffwy9j3ZpwwJp4fkRwjRzq3uWE6Rg==", + "dev": true + }, "utils-merge": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz", @@ -4046,6 +6341,12 @@ "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", "integrity": "sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==" }, + "weak-lru-cache": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/weak-lru-cache/-/weak-lru-cache-1.2.2.tgz", + "integrity": "sha512-DEAoo25RfSYMuTGc9vPJzZcZullwIqRDSI9LOy+fkCJPi6hykCnfKaXTuPBDuXAUcqHXyOgFtHNp/kB2FjYHbw==", + "dev": true + }, "webidl-conversions": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz", @@ -4110,6 +6411,12 @@ "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==" }, + "xxhash-wasm": { + "version": "0.4.2", + "resolved": "https://registry.npmjs.org/xxhash-wasm/-/xxhash-wasm-0.4.2.tgz", + "integrity": "sha512-/eyHVRJQCirEkSZ1agRSCwriMhwlyUcFkXD5TPVSLP+IPzjsqMVzZwdoczLp1SoQU0R3dxz1RpIK+4YNQbCVOA==", + "dev": true + }, "yaeti": { "version": "0.0.6", "resolved": "https://registry.npmjs.org/yaeti/-/yaeti-0.0.6.tgz", diff --git a/package.json b/package.json index 8518325..6095ce2 100644 --- a/package.json +++ b/package.json @@ -2,9 +2,29 @@ "name": "mwse", "version": "0.1.0", "description": "Mikro WebSocket Engine", - "main": "Source/index.js", "scripts": { - "test": "echo \"Error: no test specified\" && exit 1" + "compile": "parcel watch --no-hmr", + "build": "parcel build" + }, + "source": "./frontend/index.ts", + "targets": { + "default": { + "distDir": "./script/", + "publicUrl": "./", + "sourceMap": true, + "outputFormat": "global", + "optimize": true, + "context": "browser", + "engines": { + "chrome": "65", + "android": "4.4.3", + "edge": "16", + "firefox": "59", + "ie": "10", + "ios": "10", + "safari": "10" + } + } }, "repository": { "type": "git", @@ -24,7 +44,14 @@ "joi": "^17.7.0", "knex": "^2.3.0", "sqlite3": "^5.1.2", + "systemjs": "^6.13.0", "terminal-kit": "^3.0.0", + "typescript": "^4.9.3", "websocket": "^1.0.34" + }, + "devDependencies": { + "@parcel/packager-ts": "^2.7.0", + "@parcel/transformer-typescript-types": "^2.7.0", + "tslib": "^2.4.1" } } diff --git a/script/index.js b/script/index.js new file mode 100644 index 0000000..e849e27 --- /dev/null +++ b/script/index.js @@ -0,0 +1,2 @@ +(()=>{class e{autoPair=!1;connected=!1;constructor(e){this.endpoint=new URL(e.endpoint),this.autoPair=e.autoPair||!1}connect(){this.ws=new WebSocket(this.endpoint.href),this.addWSEvents()}disconnect(){this.ws.close()}addWSEvents(){this.ws.addEventListener("open",(()=>this.eventOpen())),this.ws.addEventListener("close",(()=>this.eventClose())),this.ws.addEventListener("error",(()=>this.eventError())),this.ws.addEventListener("message",(({data:e})=>this.eventMessage(e)))}eventOpen(){this.connected=!0;for(const e of this.activeConnectionEvent)e(void 0)}eventClose(){this.connected=!1}eventError(){this.connected=!1}recaivePackEvent=[];onRecaivePack(e){this.recaivePackEvent.push(e)}activeConnectionEvent=[];onActive(e){this.connected?e():this.activeConnectionEvent.push(e)}eventMessage(e){if("string"==typeof e){let t=JSON.parse(e);for(const e of this.recaivePackEvent)e(t)}}tranferToServer(e){this.connected&&this.ws.send(JSON.stringify(e))}}class t{events=new Map;signals=new Map;requests=new Map;count=0;constructor(e){this.wsts=e}request(e){return new Promise(((t,s)=>{let i=++this.count;this.wsts.WSTSProtocol.SendRequest(e,i),this.events.set(i,[e=>{t(e)},e=>{s(e)}])}))}stream(e,t){let s=++this.count;this.wsts.WSTSProtocol.StartStream(e,s),this.events.set(s,[e=>{t(e)},()=>{}])}signal(e,t){let s=this.signals.get(e);s?s.push(t):this.signals.set(e,[t])}}class s{events={};emit(e,...t){if(this.events[e])for(const s of this.events[e])s(...t)}on(e,t){this.events[e]?this.events[e].push(t):this.events[e]=[t]}activeScope=!1;scope(e){this.activeScope?e():this.on("scope",e)}}class i extends s{options={};selfSocket=!1;active=!1;constructor(e){super(),this.mwse=e}setPeerOptions(e){"string"==typeof e?this.setSocketId(e):this.options=e}setSocketId(e){this.socketId=e}async metadata(){if("me"==this.socketId){let e=await this.mwse.EventPooling.request({type:"my/socketid"});return this.selfSocket=!0,this.active||=!0,this.socketId=e,this.emit("scope"),this.activeScope=!0,e}}async request(e){if(this.active)return await this.mwse.request(this.socketId,e)}equalTo(e){return this.socketId==e.socketId}async isReachable(){return await this.mwse.EventPooling.request({type:"is/reachable",to:this.socketId})}async enablePairAuth(){await this.mwse.EventPooling.request({type:"auth/pair-system",value:"everybody"})}async disablePairAuth(){await this.mwse.EventPooling.request({type:"auth/pair-system",value:"disable"})}async send(e){await this.mwse.EventPooling.request({type:"pack/to",pack:e,to:this.socketId})}}class o extends s{peers=new Map;constructor(e){super(),this.mwse=e}setRoomOptions(e){if("string"==typeof e)this.roomId=e;else{let t={joinType:"free",ifexistsJoin:!0,accessType:"private",notifyActionInvite:!0,notifyActionJoined:!0,notifyActionEjected:!0};Object.assign(t,e),this.options=t}}setRoomId(e){this.roomId=e}async createRoom(e){let t=this.options||e,s=await this.mwse.EventPooling.request({type:"create-room",...t});if("fail"==s.status){if("ALREADY-EXISTS"==s.message&&this.options.ifexistsJoin)return this.join();throw new Error(s.message||s.messages)}this.options={...this.options,...s.room},this.roomId=s.room.id,this.mwse.rooms.set(this.roomId,this)}async join(){let e=await this.mwse.EventPooling.request({type:"joinroom",name:this.options.name,credential:this.options.credential});if("fail"==e.status)throw new Error(e.message);this.options={...this.options,...e.room},this.roomId=e.room.id,this.mwse.rooms.set(this.roomId,this)}async send(e,t=!1){await this.mwse.EventPooling.request({type:"pack/room",pack:e,to:this.roomId,wom:t})}async fetchAllPeers(){let{status:e,peers:t}=await this.mwse.EventPooling.request({type:"room-peers",roomId:this.roomId}),s=[];if("fail"==e)throw new Error("Cant using peers on room");if("success"==e)for(const e of t){let t=this.mwse.peer(e);s.push(t),this.peers.set(e,t)}return s}}class n{constructor(e){this.mwse=e,this.addListener()}addListener(){this.mwse.server?.onRecaivePack((e=>{this.PackAnalyze(e)}))}SendRaw(e){this.mwse.server.tranferToServer(e)}SendOnly(e){this.mwse.server.tranferToServer([e,"R"])}SendRequest(e,t){this.mwse.server.tranferToServer([e,t,"R"])}StartStream(e,t){this.mwse.server.tranferToServer([e,t,"S"])}PackAnalyze(e){let[t,s,i]=e;if("number"==typeof s){let e=this.mwse.EventPooling.events.get(s);if(e){if(e[0](t,i),"E"===i)this.mwse.EventPooling.events.delete(s)}else console.warn("Missing event sended from server")}else{let e=this.mwse.EventPooling.signals.get(s);if(e)for(const s of e)s(t);else console.warn("Missing event sended from server")}}}window.MWSE=class extends s{rooms=new Map;pairs=new Map;peers=new Map;constructor(s){super(),this.server=new e(s),this.server.connect(),this.WSTSProtocol=new n(this),this.EventPooling=new t(this),this.me=new i(this),this.me.scope((()=>{this.peers.set("me",this.me),this.peers.set(this.me.socketId,this.me)})),this.server.onActive((async()=>{this.me.setSocketId("me"),await this.me.metadata(),this.emit("scope"),this.activeScope=!0})),this.packMessagingSystem()}async request(e,t){let{pack:s}=await this.EventPooling.request({type:"request/to",to:e,pack:t});return s}async response(e,t,s){this.WSTSProtocol.SendOnly({type:"response/to",to:e,pack:s,id:t})}packMessagingSystem(){this.EventPooling.signal("pack",(e=>{let{from:t,pack:s}=e;this.peer(t,!0).emit("message",s)})),this.EventPooling.signal("request",(e=>{let{from:t,pack:s,id:i}=e,o={body:s,response:e=>{this.response(t,i,e)},peer:this.peer(t,!0)};this.peer(t,!0).emit("request",o),this.peer("me").emit("request",o)})),this.EventPooling.signal("pack/room",(e=>{let{to:t,pack:s}=e;this.room(t).emit("message",s)})),this.EventPooling.signal("room/joined",(e=>{let{id:t,roomid:s}=e,i=this.room(s),o=this.peer(t,!0);i.emit("join",o)})),this.EventPooling.signal("room/ejected",(e=>{let{id:t,roomid:s}=e,i=this.room(s),o=this.peer(t);i.emit("eject",o)})),this.EventPooling.signal("room/closed",(e=>{let{roomid:t}=e;this.room(t).emit("close"),this.rooms.delete(t)}))}room(e){if("string"==typeof e&&this.rooms.has(e))return this.rooms.get(e);let t=new o(this);return t.setRoomOptions(e),this.emit("room"),t}peer(e,t=!1){if("string"==typeof e){if(this.peers.has(e))return this.peers.get(e);if(this.pairs.has(e))return this.pairs.get(e)}let s=new i(this);return s.setPeerOptions(e),s.active=t,this.peers.set(s.socketId,s),this.emit("peer",s),s}}})(); +//# sourceMappingURL=index.js.map diff --git a/script/index.js.map b/script/index.js.map new file mode 100644 index 0000000..a701095 --- /dev/null +++ b/script/index.js.map @@ -0,0 +1 @@ +{"mappings":"MAIO,MAAMA,EAIFC,UAAqB,EACrBC,WAAsB,EAC7BC,YAAYC,GACRC,KAAKC,SAAW,IAAIC,IAAIH,EAAQE,UAChCD,KAAKJ,SAAWG,EAAQH,WAAY,CACxC,CACOO,UAEHH,KAAKI,GAAK,IAAIC,UAAUL,KAAKC,SAASK,MACtCN,KAAKO,aACT,CACOC,aAEHR,KAAKI,GAAGK,OACZ,CACOF,cAEHP,KAAKI,GAAGM,iBAAiB,QAAQ,IAAMV,KAAKW,cAC5CX,KAAKI,GAAGM,iBAAiB,SAAS,IAAMV,KAAKY,eAC7CZ,KAAKI,GAAGM,iBAAiB,SAAS,IAAMV,KAAKa,eAC7Cb,KAAKI,GAAGM,iBAAiB,WAAW,EAACI,KAACA,KAAUd,KAAKe,aAAaD,IACtE,CACQH,YAEJX,KAAKH,WAAY,EACjB,IAAK,MAAMmB,KAAYhB,KAAKiB,sBACxBD,OAAS,EAEjB,CACQJ,aAEJZ,KAAKH,WAAY,CACrB,CACQgB,aAEJb,KAAKH,WAAY,CACrB,CACQqB,iBAA2C,GAC5CC,cAAcC,GAEjBpB,KAAKkB,iBAAiBG,KAAKD,EAC/B,CACQH,sBAAqC,GACtCK,SAASF,GAETpB,KAAKH,UAEJuB,IAEApB,KAAKiB,sBAAsBI,KAAKD,EAExC,CACQL,aAAaD,GAEjB,GAAkB,iBAARA,EACV,CACI,IAAIS,EAAQC,KAAKC,MAAMX,GACvB,IAAK,MAAME,KAAYhB,KAAKkB,iBACxBF,EAASO,EAEjB,CACJ,CACOG,gBAAgBZ,GAEhBd,KAAKH,WAEJG,KAAKI,GAAGuB,KAAKH,KAAKI,UAAUd,GAEpC,ECzEW,MAAAe,EAGJC,OAA4C,IAAIC,IAChDC,QAAoC,IAAID,IAExCE,SAA8C,IAAIF,IAElDG,MAAQ,EACfpC,YAAYqC,GACRnC,KAAKmC,KAAOA,CAChB,CACOC,QAAQC,GAEX,OAAO,IAAIC,SAAQ,CAACC,EAAGC,KACnB,IAAIC,IAAOzC,KAAKkC,MAChBlC,KAAKmC,KAAKO,aAAaC,YAAYN,EAAKI,GACxCzC,KAAK8B,OAAOc,IAAIH,EAAG,CACd3B,IACGyB,EAAGzB,EAAA,EAENA,IACG0B,EAAI1B,EAAA,GAEX,GAET,CACO+B,OAAOR,EAAcrB,GAExB,IAAIyB,IAAOzC,KAAKkC,MAChBlC,KAAKmC,KAAKO,aAAaI,YAAYT,EAAKI,GACxCzC,KAAK8B,OAAOc,IAAIH,EAAG,CACd3B,IACGE,EAASF,EAAA,EAEb,QAER,CACOiC,OAAOC,EAAehC,GAEzB,IAAIiC,EAAIjD,KAAKgC,QAAQkB,IAAIF,GACrBC,EAIAA,EAAE5B,KAAKL,GAFPhB,KAAKgC,QAAQY,IAAII,EAAO,CAAChC,GAIjC,EClDW,MAAAmC,EAEHrB,OAAqC,CAAC,EACvCsB,KAAKC,KAAsBC,GAE9B,GAAGtD,KAAK8B,OAAOuB,GAEX,IAAK,MAAMrC,KAAYhB,KAAK8B,OAAOuB,GAC/BrC,KAAYsC,EAGxB,CACOC,GAAGF,EAAmBrC,GAEtBhB,KAAK8B,OAAOuB,GAEXrD,KAAK8B,OAAOuB,GAAWhC,KAAKL,GAE5BhB,KAAK8B,OAAOuB,GAAa,CAACrC,EAElC,CACOwC,aAAwB,EAC/BC,MAAMC,GAEC1D,KAAKwD,YAEJE,IAEA1D,KAAKuD,GAAG,QAASG,EAEzB,ECtBW,MAAAC,UAAmBR,EAGvBpD,QAAyB,CAAC,EAE1B6D,YAAuB,EACvBC,QAAmB,EAC1B/D,YAAYqC,GACR2B,QACA9D,KAAK+D,KAAO5B,CAChB,CACA6B,eAAejE,GACU,iBAAXA,EAENC,KAAKiE,YAAYlE,GAEjBC,KAAKD,QAAUA,CAEvB,CACAkE,YAAYC,GACRlE,KAAKmE,SAAWD,CACpB,CACAE,iBAEI,GAAoB,MAAjBpE,KAAKmE,SACR,CACI,IAAIE,QAAerE,KAAK+D,KAAKO,aAAalC,QAAQ,CAC9CmC,KAAK,gBAOT,OALAvE,KAAK4D,YAAa,EAClB5D,KAAK6D,UAAW,EAChB7D,KAAKmE,SAAWE,EAChBrE,KAAKoD,KAAK,SACVpD,KAAKwD,aAAc,EACZa,CACX,CACJ,CAEAD,cAAcI,GACV,GAAGxE,KAAK6D,OAEL,aAAa7D,KAAK+D,KAAK3B,QAAQpC,KAAKmE,SAAoBK,EAE/D,CACAC,QAAQC,GAEJ,OAAO1E,KAAKmE,UAAYO,EAAKP,QACjC,CACAC,oBAEI,aAAapE,KAAK+D,KAAKO,aAAalC,QAAQ,CACxCmC,KAAK,eACLI,GAAI3E,KAAKmE,UAEjB,CACAC,6BACUpE,KAAK+D,KAAKO,aAAalC,QAAQ,CACjCmC,KAAK,mBACLK,MAAO,aAEf,CACAR,8BACUpE,KAAK+D,KAAKO,aAAalC,QAAQ,CACjCmC,KAAK,mBACLK,MAAO,WAEf,CACAR,WAAWI,SACDxE,KAAK+D,KAAKO,aAAalC,QAAQ,CACjCmC,KAAK,U,KACLC,EACAG,GAAI3E,KAAKmE,UAEjB,EC/DW,MAAAU,UAAmB1B,EAUvB2B,MAA2B,IAAI/C,IAEtCjC,YAAYqC,GACR2B,QACA9D,KAAK+D,KAAO5B,CAChB,CACO4C,eAAehF,GAElB,GAAqB,iBAAXA,EAENC,KAAKgF,OAASjF,MACb,CACD,IAAIkF,EAAiB,CACjBC,SAAU,OACVC,cAAc,EACdC,WAAY,UACZC,oBAAoB,EACpBC,oBAAoB,EACpBC,qBAAqB,GAEzBC,OAAOC,OAAOR,EAAelF,GAC7BC,KAAKD,QAAUkF,CACnB,CACJ,CAEAS,UAAUxB,GACNlE,KAAKgF,OAASd,CAClB,CACAE,iBAAiBuB,GACb,IAAI5F,EAAUC,KAAKD,SAAY4F,EAC3BtB,QAAerE,KAAK+D,KAAKO,aAAalC,QAAQ,CAC9CmC,KAAK,iBACFxE,IAEP,GAAoB,QAAjBsE,EAAOuB,OACV,CACI,GAAqB,kBAAlBvB,EAAOwB,SAA+B7F,KAAKD,QAAQoF,aAElD,OAAOnF,KAAK8F,OAEhB,MAAM,IAAIC,MAAM1B,EAAOwB,SAAWxB,EAAO2B,SAC7C,CACIhG,KAAKD,QAAU,IACRC,KAAKD,WACLsE,EAAO4B,MAEdjG,KAAKgF,OAASX,EAAO4B,KAAKxD,GAC1BzC,KAAK+D,KAAKmC,MAAMtD,IAAI5C,KAAKgF,OAAkBhF,KAEnD,CACAoE,aACI,IAAIC,QAAerE,KAAK+D,KAAKO,aAAalC,QAAQ,CAC9CmC,KAAK,WACL4B,KAAMnG,KAAKD,QAAQoG,KACnBC,WAAYpG,KAAKD,QAAQqG,aAE7B,GAAoB,QAAjB/B,EAAOuB,OAEN,MAAM,IAAIG,MAAM1B,EAAOwB,SAEvB7F,KAAKD,QAAU,IACRC,KAAKD,WACLsE,EAAO4B,MAEdjG,KAAKgF,OAASX,EAAO4B,KAAKxD,GAC1BzC,KAAK+D,KAAKmC,MAAMtD,IAAI5C,KAAKgF,OAAkBhF,KAEnD,CACAoE,WAAWI,EAAW6B,GAAc,SAC1BrG,KAAK+D,KAAKO,aAAalC,QAAQ,CACjCmC,KAAK,Y,KACLC,EACAG,GAAI3E,KAAKgF,O,IACTqB,GAER,CACAjC,sBACI,IAAIwB,OAACA,EAAMd,MAAEA,SAAe9E,KAAK+D,KAAKO,aAAalC,QAAQ,CACvDmC,KAAK,aACLS,OAAQhF,KAAKgF,SAGbsB,EAAe,GAEnB,GAAa,QAAVV,EAEC,MAAM,IAAIG,MAAM,4BACd,GAAa,WAAVH,EACL,IAAK,MAAMW,KAAUzB,EAAO,CACxB,IAAIJ,EAAO1E,KAAK+D,KAAKW,KAAK6B,GAC1BD,EAAIjF,KAAKqD,GACT1E,KAAK8E,MAAMlC,IAAI2D,EAAQ7B,EAC3B,CAEJ,OAAO4B,CACX,ECtHW,MAAAE,EAGX1G,YAAYqC,GACRnC,KAAK+D,KAAO5B,EACZnC,KAAKyG,aACT,CACOA,cAEHzG,KAAK+D,KAAK2C,QAAQvF,eAAeqD,IAC7BxE,KAAK2G,YAAYnC,EAAA,GAEzB,CACOoC,QAAQpC,GAEXxE,KAAK+D,KAAK2C,OAAOhF,gBAAgB8C,EACrC,CACOqC,SAASrC,GAEZxE,KAAK+D,KAAK2C,OAAOhF,gBAAgB,CAAC8C,EAAK,KAC3C,CACO7B,YAAY6B,EAAe/B,GAE9BzC,KAAK+D,KAAK2C,OAAOhF,gBAAgB,CAAC8C,EAAM/B,EAAI,KAChD,CACOK,YAAY0B,EAAe/B,GAE9BzC,KAAK+D,KAAK2C,OAAOhF,gBAAgB,CAAC8C,EAAM/B,EAAI,KAChD,CACOkE,YAAY7F,GAEf,IAAKgG,EAASrE,EAAIsE,GAAUjG,EAC5B,GAAiB,iBAAP2B,EACV,CACI,IAAIzB,EAAWhB,KAAK+D,KAAKO,aAAaxC,OAAOoB,IAAIT,GACjD,GAAGzB,GAGC,GADAA,EAAS,GAAG8F,EAASC,GAGZ,MAFFA,EAGC/G,KAAK+D,KAAKO,aAAaxC,OAAOkF,OAAOvE,QAQ3CwE,QAAQC,KAAK,mCACvB,KAAK,CACD,IAAIlF,EAAUhC,KAAK+D,KAAKO,aAAatC,QAAQkB,IAAIT,GACjD,GAAGT,EAEC,IAAK,MAAMmF,KAAYnF,EACnBmF,EAASL,QAEXG,QAAQC,KAAK,mCACvB,CACJ,ECuEJE,OAAOC,KAjIQ,cAAmBlE,EAIvB+C,MAA4B,IAAInE,IAChCuF,MAA4B,IAAIvF,IAChC+C,MAA4B,IAAI/C,IAEvCjC,YAAYC,GACR+D,QACA9D,KAAK0G,OAAS,IAAI/G,EAAWI,GAC7BC,KAAK0G,OAAOvG,UACZH,KAAK0C,aAAe,IAAI8D,EAAaxG,MACrCA,KAAKsE,aAAe,IAAIzC,EAAU7B,MAClCA,KAAKuH,GAAK,IAAI5D,EAAK3D,MACnBA,KAAKuH,GAAG9D,OAAM,KACVzD,KAAK8E,MAAMlC,IAAI,KAAM5C,KAAKuH,IAC1BvH,KAAK8E,MAAMlC,IAAI5C,KAAKuH,GAAGpD,SAAoBnE,KAAKuH,GAAE,IAEtDvH,KAAK0G,OAAOpF,UAAS8C,UACjBpE,KAAKuH,GAAGtD,YAAY,YACdjE,KAAKuH,GAAGC,WACdxH,KAAKoD,KAAK,SACVpD,KAAKwD,aAAc,CAAI,IAE3BxD,KAAKyH,qBACT,CACArD,cAAqBsD,EAAgBlD,GAEjC,IAAKA,KAAKmD,SAAgB3H,KAAKsE,aAAalC,QAAQ,CAChDmC,KAAM,aACNI,GAAI+C,E,KACJlD,IAEJ,OAAOmD,CACX,CACAvD,eAAsBsD,EAAgBE,EAAkBpD,GAEpDxE,KAAK0C,aAAamE,SAAS,CACvBtC,KAAM,cACNI,GAAI+C,E,KACJlD,EACA/B,GAAImF,GAEZ,CACQH,sBAEJzH,KAAKsE,aAAavB,OAAO,QAAQ+D,IAC7B,IAAIe,KAACA,EAAIrD,KAACA,GAAQsC,EAClB9G,KAAK0E,KAAKmD,GAAM,GAAMzE,KAAK,UAAWoB,EAAA,IAE1CxE,KAAKsE,aAAavB,OAAO,WAAW+D,IAChC,IAAIe,KAACA,EAAIrD,KAACA,EAAI/B,GAAEA,GAAMqE,EAClBrD,EAAQ,CACRqE,KAAMtD,EACNuD,SAAWvD,IACPxE,KAAK+H,SAASF,EAAMpF,EAAI+B,EAAA,EAE5BE,KAAM1E,KAAK0E,KAAKmD,GAAM,IAE1B7H,KAAK0E,KAAKmD,GAAM,GAAMzE,KAAK,UAAWK,GACtCzD,KAAK0E,KAAK,MAAMtB,KAAK,UAAWK,EAAA,IAEpCzD,KAAKsE,aAAavB,OAAO,aAAa+D,IAClC,IAAInC,GAACA,EAAEH,KAACA,GAAQsC,EAChB9G,KAAKiG,KAAKtB,GAAIvB,KAAK,UAAWoB,EAAA,IAElCxE,KAAKsE,aAAavB,OAAO,eAAe+D,IACpC,IAAIrE,GAACA,EAAEuF,OAACA,GAAUlB,EACdb,EAAOjG,KAAKiG,KAAK+B,GACjBtD,EAAO1E,KAAK0E,KAAKjC,GAAI,GACzBwD,EAAK7C,KAAK,OAAQsB,EAAA,IAEtB1E,KAAKsE,aAAavB,OAAO,gBAAgB+D,IACrC,IAAIrE,GAACA,EAAEuF,OAACA,GAAUlB,EACdb,EAAOjG,KAAKiG,KAAK+B,GACjBtD,EAAO1E,KAAK0E,KAAKjC,GACrBwD,EAAK7C,KAAK,QAASsB,EAAA,IAEvB1E,KAAKsE,aAAavB,OAAO,eAAe+D,IACpC,IAAIkB,OAACA,GAAUlB,EACJ9G,KAAKiG,KAAK+B,GAChB5E,KAAK,SACVpD,KAAKkG,MAAMc,OAAOgB,EAAA,GAE1B,CACO/B,KAAKlG,GAER,GAAqB,iBAAXA,GAEHC,KAAKkG,MAAM+B,IAAIlI,GAEd,OAAOC,KAAKkG,MAAMhD,IAAInD,GAG9B,IAAIkG,EAAO,IAAIpB,EAAK7E,MAIpB,OAHAiG,EAAKlB,eAAehF,GAEpBC,KAAKoD,KAAK,QACH6C,CACX,CACOvB,KAAK3E,EAAgCmI,GAAW,GAEnD,GAAqB,iBAAXnI,EACV,CACI,GAAGC,KAAK8E,MAAMmD,IAAIlI,GAEd,OAAOC,KAAK8E,MAAM5B,IAAInD,GAE1B,GAAGC,KAAKsH,MAAMW,IAAIlI,GAEd,OAAOC,KAAKsH,MAAMpE,IAAInD,EAE9B,CACA,IAAI2E,EAAO,IAAIf,EAAK3D,MAKpB,OAJA0E,EAAKV,eAAejE,GACpB2E,EAAKb,OAASqE,EACdlI,KAAK8E,MAAMlC,IAAI8B,EAAKP,SAAoBO,GACxC1E,KAAKoD,KAAK,OAAQsB,GACXA,CACX,E","sources":["frontend/Connection.ts","frontend/EventPool.ts","frontend/EventTarget.ts","frontend/Peer.ts","frontend/Room.ts","frontend/WSTSProtocol.ts","frontend/index.ts"],"sourcesContent":["export interface IConnection{\r\n endpoint: string;\r\n autoPair?: boolean;\r\n}\r\nexport class Connection\r\n{\r\n public ws! : WebSocket;\r\n public endpoint : URL;\r\n public autoPair : boolean = false;\r\n public connected : boolean = false;\r\n constructor(options: IConnection){\r\n this.endpoint = new URL(options.endpoint);\r\n this.autoPair = options.autoPair || false;\r\n }\r\n public connect()\r\n {\r\n this.ws = new WebSocket(this.endpoint.href);\r\n this.addWSEvents();\r\n }\r\n public disconnect()\r\n {\r\n this.ws.close();\r\n }\r\n public addWSEvents()\r\n {\r\n this.ws.addEventListener(\"open\", () => this.eventOpen());\r\n this.ws.addEventListener(\"close\", () => this.eventClose());\r\n this.ws.addEventListener(\"error\", () => this.eventError());\r\n this.ws.addEventListener(\"message\", ({data}) => this.eventMessage(data as string | ArrayBuffer));\r\n }\r\n private eventOpen()\r\n {\r\n this.connected = true;\r\n for (const callback of this.activeConnectionEvent) {\r\n callback(void 0);\r\n }\r\n }\r\n private eventClose()\r\n {\r\n this.connected = false;\r\n }\r\n private eventError()\r\n {\r\n this.connected = false;\r\n }\r\n private recaivePackEvent : ((data:any) => any)[] = [];\r\n public onRecaivePack(func:(data:any) => any)\r\n {\r\n this.recaivePackEvent.push(func);\r\n }\r\n private activeConnectionEvent : Function[] = [];\r\n public onActive(func:Function)\r\n {\r\n if(this.connected)\r\n {\r\n func()\r\n }else{\r\n this.activeConnectionEvent.push(func);\r\n }\r\n }\r\n private eventMessage(data: string | ArrayBuffer)\r\n {\r\n if(typeof data == \"string\")\r\n {\r\n let $data = JSON.parse(data);\r\n for (const callback of this.recaivePackEvent) {\r\n callback($data);\r\n }\r\n }\r\n }\r\n public tranferToServer(data:any)\r\n {\r\n if(this.connected)\r\n {\r\n this.ws.send(JSON.stringify(data));\r\n }\r\n }\r\n}","import MWSE from \"./index\";\r\nimport { Message } from \"./WSTSProtocol\";\r\n\r\nexport default class EventPool\r\n{\r\n public wsts : MWSE;\r\n public events : Map = new Map();\r\n public signals : Map = new Map();\r\n\r\n public requests : Map = new Map();\r\n\r\n public count = 0;\r\n constructor(wsts:MWSE){\r\n this.wsts = wsts;\r\n }\r\n public request(msg: Message) : Promise\r\n {\r\n return new Promise((ok,rej) => {\r\n let id = ++this.count;\r\n this.wsts.WSTSProtocol.SendRequest(msg, id);\r\n this.events.set(id,[\r\n (data:any) => {\r\n ok(data);\r\n },\r\n (data:any) => {\r\n rej(data);\r\n }\r\n ]);\r\n })\r\n }\r\n public stream(msg: Message, callback: Function)\r\n {\r\n let id = ++this.count;\r\n this.wsts.WSTSProtocol.StartStream(msg, id);\r\n this.events.set(id,[\r\n (data:any) => {\r\n callback(data);\r\n },\r\n () => { }\r\n ]);\r\n }\r\n public signal(event: string, callback: Function)\r\n {\r\n let T = this.signals.get(event);\r\n if(!T)\r\n {\r\n this.signals.set(event, [callback]);\r\n }else{\r\n T.push(callback);\r\n }\r\n }\r\n}","export default class EventTarget\r\n{\r\n private events : {[key:string]:Function[]} = {};\r\n public emit(eventName :string, ...args:any[])\r\n {\r\n if(this.events[eventName])\r\n {\r\n for (const callback of this.events[eventName]) {\r\n callback(...args);\r\n }\r\n }\r\n }\r\n public on(eventName :string, callback:Function)\r\n {\r\n if(this.events[eventName])\r\n {\r\n this.events[eventName].push(callback)\r\n }else{\r\n this.events[eventName] = [callback];\r\n }\r\n }\r\n public activeScope : boolean = false;\r\n scope(f:Function)\r\n {\r\n if(this.activeScope)\r\n {\r\n f()\r\n }else{\r\n this.on('scope', f)\r\n }\r\n }\r\n}","import EventTarget from \"./EventTarget\";\r\nimport MWSE from \"./index\";\r\n\r\ninterface IPeerOptions{\r\n\r\n};\r\n\r\n\r\nexport default class Peer extends EventTarget\r\n{\r\n public mwse : MWSE;\r\n public options : IPeerOptions = {};\r\n public socketId? : string;\r\n public selfSocket : boolean = false;\r\n public active : boolean = false;\r\n constructor(wsts:MWSE){\r\n super();\r\n this.mwse = wsts;\r\n }\r\n setPeerOptions(options: string | IPeerOptions){\r\n if(typeof options == \"string\")\r\n {\r\n this.setSocketId(options)\r\n }else{\r\n this.options = options;\r\n }\r\n }\r\n setSocketId(uuid: string){\r\n this.socketId = uuid;\r\n }\r\n async metadata() : Promise\r\n {\r\n if(this.socketId == 'me')\r\n {\r\n let result = await this.mwse.EventPooling.request({\r\n type:'my/socketid'\r\n });\r\n this.selfSocket = true;\r\n this.active ||= true;\r\n this.socketId = result;\r\n this.emit('scope');\r\n this.activeScope = true;\r\n return result;\r\n }\r\n };\r\n \r\n async request(pack:any){\r\n if(this.active)\r\n {\r\n return await this.mwse.request(this.socketId as string, pack);\r\n }\r\n };\r\n equalTo(peer : Peer | {socketId: string})\r\n {\r\n return this.socketId == peer.socketId;\r\n }\r\n async isReachable()\r\n {\r\n return await this.mwse.EventPooling.request({\r\n type:'is/reachable',\r\n to: this.socketId\r\n });\r\n }\r\n async enablePairAuth(){\r\n await this.mwse.EventPooling.request({\r\n type:'auth/pair-system',\r\n value: 'everybody'\r\n });\r\n }\r\n async disablePairAuth(){\r\n await this.mwse.EventPooling.request({\r\n type:'auth/pair-system',\r\n value: 'disable'\r\n });\r\n }\r\n async send(pack: any){\r\n await this.mwse.EventPooling.request({\r\n type:'pack/to',\r\n pack,\r\n to: this.socketId\r\n });\r\n }\r\n}","import EventTarget from \"./EventTarget\";\r\nimport MWSE from \"./index\";\r\nimport Peer from \"./Peer\";\r\n\r\nexport interface IRoomOptions\r\n{\r\n name: string;\r\n description?:string;\r\n joinType: \"free\"|\"invite\"|\"password\"|\"lock\";\r\n credential?: string;\r\n ifexistsJoin?: boolean;\r\n accessType?: \"public\"|\"private\";\r\n notifyActionInvite?: boolean;\r\n notifyActionJoined?: boolean;\r\n notifyActionEjected?: boolean;\r\n}\r\n\r\n\r\nexport default class Room extends EventTarget\r\n{\r\n public mwse : MWSE;\r\n public options! : IRoomOptions;\r\n public roomId? : string;\r\n public accessType? : \"public\"|\"private\";\r\n public description? : string;\r\n public joinType? : \"free\"|\"invite\"|\"password\"|\"lock\";\r\n public name? : string;\r\n public owner? : string;\r\n public peers : Map = new Map();\r\n\r\n constructor(wsts:MWSE){\r\n super();\r\n this.mwse = wsts;\r\n }\r\n public setRoomOptions(options : IRoomOptions | string)\r\n {\r\n if(typeof options == \"string\")\r\n {\r\n this.roomId = options;\r\n }else{\r\n let defaultOptions = {\r\n joinType: \"free\",\r\n ifexistsJoin: true,\r\n accessType: \"private\",\r\n notifyActionInvite: true,\r\n notifyActionJoined: true,\r\n notifyActionEjected: true\r\n };\r\n Object.assign(defaultOptions,options);\r\n this.options = defaultOptions as IRoomOptions;\r\n }\r\n }\r\n \r\n setRoomId(uuid: string){\r\n this.roomId = uuid;\r\n }\r\n async createRoom(roomOptions : IRoomOptions){\r\n let options = this.options || roomOptions;\r\n let result = await this.mwse.EventPooling.request({\r\n type:'create-room',\r\n ...options\r\n });\r\n if(result.status == 'fail')\r\n {\r\n if(result.message == \"ALREADY-EXISTS\" && this.options.ifexistsJoin)\r\n {\r\n return this.join();\r\n }\r\n throw new Error(result.message || result.messages);\r\n }else{\r\n this.options = {\r\n ...this.options,\r\n ...result.room\r\n };\r\n this.roomId = result.room.id;\r\n this.mwse.rooms.set(this.roomId as string, this);\r\n }\r\n }\r\n async join(){\r\n let result = await this.mwse.EventPooling.request({\r\n type:'joinroom',\r\n name: this.options.name,\r\n credential: this.options.credential\r\n });\r\n if(result.status == 'fail')\r\n {\r\n throw new Error(result.message);\r\n }else{\r\n this.options = {\r\n ...this.options,\r\n ...result.room\r\n };\r\n this.roomId = result.room.id;\r\n this.mwse.rooms.set(this.roomId as string, this);\r\n }\r\n }\r\n async send(pack: any, wom:boolean = false){\r\n await this.mwse.EventPooling.request({\r\n type:'pack/room',\r\n pack,\r\n to: this.roomId,\r\n wom\r\n });\r\n }\r\n async fetchAllPeers(){\r\n let {status, peers} = await this.mwse.EventPooling.request({\r\n type:'room-peers',\r\n roomId: this.roomId\r\n }) as {status:\"success\"|\"fail\", peers: string[]};\r\n\r\n let cup : Peer[] = [];\r\n\r\n if(status == 'fail')\r\n {\r\n throw new Error(\"Cant using peers on room\")\r\n }else if(status == 'success'){\r\n for (const peerid of peers) {\r\n let peer = this.mwse.peer(peerid);\r\n cup.push(peer);\r\n this.peers.set(peerid, peer);\r\n }\r\n };\r\n return cup;\r\n }\r\n}","import MWSE from \"./index\";\r\n\r\nexport interface Message {\r\n [key:string|number]:any;\r\n}\r\nexport default class WSTSProtocol\r\n{\r\n public mwse : MWSE;\r\n constructor(wsts:MWSE){\r\n this.mwse = wsts;\r\n this.addListener();\r\n }\r\n public addListener()\r\n {\r\n this.mwse.server?.onRecaivePack((pack)=>{\r\n this.PackAnalyze(pack)\r\n })\r\n }\r\n public SendRaw(pack: Message)\r\n {\r\n this.mwse.server.tranferToServer(pack);\r\n }\r\n public SendOnly(pack: Message)\r\n {\r\n this.mwse.server.tranferToServer([pack,'R']);\r\n }\r\n public SendRequest(pack: Message, id: number)\r\n {\r\n this.mwse.server.tranferToServer([pack, id, 'R']);\r\n }\r\n public StartStream(pack: Message, id: number)\r\n {\r\n this.mwse.server.tranferToServer([pack, id, 'S']);\r\n }\r\n public PackAnalyze(data:any)\r\n {\r\n let [payload, id, action] = data;\r\n if(typeof id === 'number')\r\n {\r\n let callback = this.mwse.EventPooling.events.get(id);\r\n if(callback)\r\n {\r\n callback[0](payload, action);\r\n switch(action)\r\n {\r\n case 'E':{ // [E]ND flag\r\n this.mwse.EventPooling.events.delete(id);\r\n break;\r\n }\r\n case 'S': // [S]TREAM flag\r\n default:{\r\n break;\r\n }\r\n }\r\n }else console.warn(\"Missing event sended from server\");\r\n }else{\r\n let signals = this.mwse.EventPooling.signals.get(id);\r\n if(signals)\r\n {\r\n for (const callback of signals) {\r\n callback(payload);\r\n }\r\n }else console.warn(\"Missing event sended from server\");\r\n }\r\n }\r\n}","import {Connection,IConnection} from \"./Connection\";\r\nimport EventPool from \"./EventPool\";\r\nimport EventTarget from \"./EventTarget\";\r\nimport Peer from \"./Peer\";\r\nimport Room, { IRoomOptions } from \"./Room\";\r\nimport WSTSProtocol, { Message } from \"./WSTSProtocol\";\r\nexport default class MWSE extends EventTarget {\r\n public server! : Connection;\r\n public WSTSProtocol! : WSTSProtocol;\r\n public EventPooling! : EventPool;\r\n public rooms : Map = new Map();\r\n public pairs : Map = new Map();\r\n public peers : Map = new Map();\r\n public me! : Peer;\r\n constructor(options: IConnection){\r\n super();\r\n this.server = new Connection(options);\r\n this.server.connect();\r\n this.WSTSProtocol = new WSTSProtocol(this);\r\n this.EventPooling = new EventPool(this);\r\n this.me = new Peer(this);\r\n this.me.scope(()=>{\r\n this.peers.set('me', this.me);\r\n this.peers.set(this.me.socketId as string, this.me);\r\n })\r\n this.server.onActive(async ()=>{\r\n this.me.setSocketId('me');\r\n await this.me.metadata();\r\n this.emit('scope');\r\n this.activeScope = true;\r\n });\r\n this.packMessagingSystem();\r\n }\r\n public async request(peerId: string, pack:Message)\r\n {\r\n let {pack:answer} = await this.EventPooling.request({\r\n type: 'request/to',\r\n to: peerId,\r\n pack\r\n });\r\n return answer;\r\n }\r\n public async response(peerId: string, requestId:number, pack:Message)\r\n {\r\n this.WSTSProtocol.SendOnly({\r\n type: 'response/to',\r\n to: peerId,\r\n pack,\r\n id: requestId\r\n })\r\n }\r\n private packMessagingSystem()\r\n {\r\n this.EventPooling.signal('pack',(payload : {from:string,pack:any}) => {\r\n let {from,pack} = payload;\r\n this.peer(from, true).emit('message', pack);\r\n })\r\n this.EventPooling.signal('request',(payload : {from:string,pack:any,id:number}) => {\r\n let {from,pack, id} = payload;\r\n let scope = {\r\n body: pack,\r\n response: (pack: Message) => {\r\n this.response(from, id, pack);\r\n },\r\n peer: this.peer(from, true)\r\n };\r\n this.peer(from, true).emit('request', scope);\r\n this.peer('me').emit('request', scope);\r\n })\r\n this.EventPooling.signal('pack/room',(payload : {to:string,pack:any}) => {\r\n let {to,pack} = payload;\r\n this.room(to).emit('message', pack);\r\n })\r\n this.EventPooling.signal('room/joined',(payload : {id:string,roomid:any,ownerid:string}) => {\r\n let {id,roomid} = payload;\r\n let room = this.room(roomid);\r\n let peer = this.peer(id, true);\r\n room.emit('join', peer);\r\n })\r\n this.EventPooling.signal('room/ejected',(payload : {id:string,roomid:any,ownerid:string}) => {\r\n let {id,roomid} = payload;\r\n let room = this.room(roomid);\r\n let peer = this.peer(id);\r\n room.emit('eject', peer);\r\n })\r\n this.EventPooling.signal('room/closed',(payload : {roomid:any}) => {\r\n let {roomid} = payload;\r\n let room = this.room(roomid);\r\n room.emit('close');\r\n this.rooms.delete(roomid);\r\n })\r\n }\r\n public room(options: IRoomOptions | string) : Room\r\n {\r\n if(typeof options == \"string\")\r\n {\r\n if(this.rooms.has(options))\r\n {\r\n return this.rooms.get(options) as Room\r\n }\r\n }\r\n let room = new Room(this);\r\n room.setRoomOptions(options);\r\n // this.rooms.set(room.roomId as string, room);\r\n this.emit('room');\r\n return room;\r\n }\r\n public peer(options: string | IRoomOptions, isActive = false) : Peer\r\n {\r\n if(typeof options == \"string\")\r\n {\r\n if(this.peers.has(options))\r\n {\r\n return this.peers.get(options) as Peer\r\n }\r\n if(this.pairs.has(options))\r\n {\r\n return this.pairs.get(options) as Peer\r\n }\r\n }\r\n let peer = new Peer(this);\r\n peer.setPeerOptions(options);\r\n peer.active = isActive;\r\n this.peers.set(peer.socketId as string, peer);\r\n this.emit('peer', peer);\r\n return peer;\r\n }\r\n};\r\n\r\ndeclare global {\r\n interface Window {\r\n MWSE: any;\r\n }\r\n}\r\n\r\nwindow.MWSE = MWSE;"],"names":["$201ddc79d766b86c$export$98b66c25bb38499d","autoPair","connected","constructor","options","this","endpoint","URL","connect","ws","WebSocket","href","addWSEvents","disconnect","close","addEventListener","eventOpen","eventClose","eventError","data","eventMessage","callback","activeConnectionEvent","recaivePackEvent","onRecaivePack","func","push","onActive","$data","JSON","parse","tranferToServer","send","stringify","$7bc29f3852fca8a1$export$2e2bcd8739ae039","events","Map","signals","requests","count","wsts","request","msg","Promise","ok","rej","id","WSTSProtocol","SendRequest","set","stream","StartStream","signal","event","T","get","$639a7a490074f3f2$export$2e2bcd8739ae039","emit","eventName","args","on","activeScope","scope","f","$9f6c30de484136d4$export$2e2bcd8739ae039","selfSocket","active","super","mwse","setPeerOptions","setSocketId","uuid","socketId","async","result","EventPooling","type","pack","equalTo","peer","to","value","$4415e33c9749fde6$export$2e2bcd8739ae039","peers","setRoomOptions","roomId","defaultOptions","joinType","ifexistsJoin","accessType","notifyActionInvite","notifyActionJoined","notifyActionEjected","Object","assign","setRoomId","roomOptions","status","message","join","Error","messages","room","rooms","name","credential","wom","cup","peerid","$023568b0c88ffd16$export$2e2bcd8739ae039","addListener","server","PackAnalyze","SendRaw","SendOnly","payload","action","delete","console","warn","callback1","window","MWSE","pairs","me","metadata","packMessagingSystem","peerId","answer","requestId","from","body","response","roomid","has","isActive"],"version":3,"file":"index.js.map"} \ No newline at end of file diff --git a/script/status.xml b/script/status.xml index 78ea849..8e89bfc 100644 --- a/script/status.xml +++ b/script/status.xml @@ -26,4 +26,56 @@ fb7d736ac8ee7a3a74f952551e8856a34c05d564ee0408ca0eea47a86e833b5b30a732b9d3ca954e56231908beb9022aec02c756c3e075bd9086f9ade0381b953185b4d3ed332d5c4b454abe5d2ccbeb48b473f956d543bde4f48c1978f129da7bf481b629a8da09941e5ea66d069617f6c82ac3a685b9e6cf75d8d4faf0b2ca0b52df201372c6e2d08dbcb2b724da94c733590165282e6faefd7bb89bb5be76d452f84b50a557d4b0f45192fc562f3682aba1098818ed3ddfaf72181d66f1f7b59be2b31759b66c + + + 304e17d899c067afe3c439f92c5bd29869dfbde06ceca4f65e2128a93e7366c078bb0af1b14cb516008683df14c00107cadcce4d980f149da932bdba4a9892841b004ae877b2c7733e2d326d5586a4b2225384afbab6d00900852f5feb47ebd234ad95ec6957dbbbe585c86126f02e47cff3dc6d4ac9d321efbbd39a28655110fa850caca24a9b82984b60d0c517f3d8400594a17ba4a5fd0fcf19711c4b0ef503d698e8597c841eb099118d23e8cc8bc4db907d5093ca73e68f85c3dae629876b5d2fa49ed283591972559ae7da1b99489715c355f068c689c7cb4690ea4d4f3d1f364367b352bd74a0a57a541bfac90fe69d9b6d2fe941707c7316b067f5287c6aff01c86cbb23c2ac5e202cb497c203437c80159454b20dcadec7f2080b286c6b4e76826952b963f856e3c7e9ad89e50b76e2dd22f7bc1fbc8366a965cb76dc862d5c9b5b52802e431d2490079a7396db1bc279099a68a9b250135020e3906bc8c159b773a7dbb3d5beb54a30746fc776a07aeeb4f1f170d688b15742f530901959e4a4cd8ed869249e95a58c3cc45bc323aee66aec9090f4c938411c348b72d6ae4c3169c0049d84e88f4c26318136353db77519d7c060df07f7da78df71f13ed7be5916b2973fa712b4d826527911a04923dc763630306d04e09229584370e670c24d6af48bee2ead5525f55b8bd66083314b11d1dede385bfbdcaacd0b577c1d37f7bbcbb8d24f461723713570537abbcdfd8b96c9dcfc0f8c0afd7e6e43620dbfb88442cacd15a6cb28ee2d318e56d023af40a832010e8e2cb1d2d5223fd465616094fca6fecd92ff66e398f3ac8ac091beb3635dfacea5147848514c94ecdc011180cda61f977f9c59265682c77dc7af662e1c50386ac50835c6802adb86f941ec3d05316e505f7183bf8dc048685af48f6514726d993e789cfe13e28bd0ce7ea0e0e97f19364ec8567e63f28afcdf07de02fa8c79a850ffc4e9da3786ecec269aff4995ed5e3029a2abcba65ba62990e0842714688ca48162510449ebaf80878405c7373534aa6e688f4c56569f15e349272db874f3846eb3cea77f8de261628c285e93ff7c38aba3d65df19bf8dd8732068e817e90b92ddf7be29ec844f6b90af2547daf00093e4f2241c2d419e60c9b6d64e4278a2baa0a0396e98ccafebd131a6c5374baaf4a3e715c6c4d2c647de1cd0610cf9bcf3a9e857bef77a0ed51dc297ba914a5c41c5243cc72308b9de7908ec8955b52c9328b1d8efdd28d570c010f1329b7f0c40669004dc77cc87a34348310f444ba799fb0ed00687ae16681dc7eab7d1884213b59ff1e2e3cefa64676587fd37db308f4de795cb46b468948e38d340981e32ca2222cbff42bc3852f1657a690bfba8b918cfa05bd3f6a7bbc284e15ba39b114e8619b666748325e0b87514eff2b48a70ea906ca0ecf6f0f2c6438ffa8106239b94231f008339069fd420978e0f8103c94fcfb8a48018353443e8cbe131dc4261ef79945471cdaec9868954e420f4f43f738c098e3ee3378c5890409bc9e4f191e85f3318c5a125f48e8bc3a9eb67f413742c2b030847b3461bd9659e62af48aca3a456ae4f99beacd3df943608956fbadde816733edc9f2a107a8d92592b9690aeb69b48bfd9231ba345f1c71dcb6aae1c13cf1ab91942938db056a1569c6399cf57dd02032ef43f64f6e3ee3de56d11b7dc07f3bdb899714b912d6e8a45be8e2f6413ad51ef93aa75c5bd9c4a8c86231b31a5e68892bc8ec01de40db5d6ec87160c8d5d14b3725160407a9a7484bb794dee73e0a87cceeb874ed6d96941406f18b8634886c23d5be' + + + 304e17d899c067afe3c439f92c5bd29869dfbde06ceca4f65e2128a93e7366c078bb0af1b14cb516008683df14c00107cadcce4d980f149da932bdba4a9892841b004ae877b2c7733e2d326d5586a4b2225384afbab6d00900852f5feb47ebd234ad95ec6957dbbbe585c86126f02e47cff3dc6d4ac9d321efbbd39a28655110fa850caca24a9b82984b60d0c517f3d8400594a17ba4a5fd0fcf19711c4b0ef503d698e8597c841eb099118d23e8cc8bc4db907d5093ca73e68f85c3dae629876b5d2fa49ed283591972559ae7da1b99489715c355f068c689c7cb4690ea4d4f3d1f364367b352bd74a0a57a541bfac90fe69d9b6d2fe941707c7316b067f5287c6aff01c86cbb23c2ac5e202cb497c203437c80159454b20dcadec7f2080b286c6b4e76826952b963f856e3c7e9ad89e50b76e2dd22f7bc1fbc8366a965cb76dc862d5c9b5b52802e431d2490079a7396db1bc279099a68a9b250135020e3906bc8c159b773a7dbb3d5beb54a30746fc776a07aeeb4f1f170d688b15742f530901959e4a4cd8ed869249e95a58c3cc45bc323aee66aec9090f4c938411c348b72d6ae4c3169c0049d84e88f4c26318136353db77519d7c060df07f7da78df71f13ed7be5916b2973fa712b4d826527911a04923dc763630306d04e09229584370e670c24d6af48bee2ead5525f55b8bd66083314b11d1dede385bfbdcaacd0b577c1d37f7bbcbb8d24f461723713570537abbcdfd8b96c9dcfc0f8c0afd7e6e43620dbfb88442cacd15a6cb28ee2d318e56d023af40a832010e8e2cb1d2d5223fd465616094fca6fecd92ff66e398f3ac8ac091beb3635dfacea5147848514c94ecdc011180cda61f977f9c59265682c77dc7af662e1c50386ac50835c6802adb86f941ec3d05316e505f7183bf8dc048685af48f6514726d993e789cfe13e28bd0ce7ea0e0e97f19364ec8567e63f28afcdf07de02fa8c79a850ffc4e9da3786ecec269aff4995ed5e3029a2abcba65ba62990e0842714688ca48162510449ebaf80878405c7373534aa6e688f4c56569f15e349272db874f3846eb3cea77f8de261628c285e93ff7c38aba3d65df19bf8dd8732068e817e90b92ddf7be29ec844f6b90af2547daf00093e4f2241c2d419e60c9b6d64e4278a2baa0a0396e98ccafebd131a6c5374baaf4a3e715c6c4d2c647de1cd0610cf9bcf3a9e857bef77a0ed51dc297ba914a5c41c5243cc72308b9de7908ec8955b52c9328b1d8efdd28d570c010f1329b7f0c40669004dc77cc87a34348310f444ba799fb0ed00687ae16681dc7eab7d1884213b59ff1e2e3cefa64676587fd37db308f4de795cb46b468948e38d340981e32ca2222cbff42bc3852f1657a690bfba8b918cfa05bd3f6a7bbc284e15ba39b114e8619b666748325e0b87514eff2b48a70ea906ca0ecf6f0f2c6438ffa8106239b94231f008339069fd420978e0f8103c94fcfb8a48018353443e8cbe131dc4261ef79945471cdaec9868954e420f4f43f738c098e3ee3378c5890409bc9e4f191e85f3318c5a125f48e8bc3a9eb67f413742c2b030847b3461bd9659e62af48aca3a456ae4f99beacd3df943608956fbadde816733edc9f2a107a8d92592b9690aeb69b48bfd9231ba345f1c71dcb6aae1c13cf1ab91942938db056a1569c6399cf57dd02032ef43f64f6e3ee3de56d11b7dc07f3bdb899714b912d6e8a45be8e2f6413ad51ef93aa75c5bd9c4a8c86231b31a5e68892bc8ec01de40db5d6ec87160c8d5d14b3725160407a9a7484bb794dee73e0a87cceeb874ed6d96941406f18b8634886c23d5be' + + + 35b9ea4d98445d6fda595e42c921269e0699ed78a2655b169fcaffef66521e649c1818cb71fb5a2ef4c0f453786de08c9cf81cdc4f6bcb8a7af68f23d9a4b3dc4a84950a13261e929ef4aa41a53819b8fc98582250533b476e46d6d0894a0003f315a6d8612d2d46eebe367330ae4587635daa4d4b929a33de91dfdb30b1aa3b3bded0ab06741786b19564b74e3b0d86a3d056bf9662fa004d2609a62b862caea7f6448a5257689a0de69798ac8eaf6186799c1e5de7ba124493365a76ded957d0f133190608b49c940cd7db6bdcb6b98739dfe6dc44b4736ebb10a3563ac7a4c6c63177cb292f32be6be3041cd2c27fef4c9f3ec2005041f80df142941185c57114d90500c744d9442f4507e43c91bbacc4205ee8dc4dbbc0656a6bf948309c446ffc67844f8e49171672ebbf380368979e20dcd114f889936f5a6ae0fdc393d4292659ee8f00070c0b6f01781e9c9d64a1ef7dc43912de5666d2f3495d9e4f3b478621e0e7e2ade6728e2de162aaf06b000ef5c514ba8004ed28cdbb9893a2b9e024a3ffedf98b920ff94130f31775cbc6a4f7a0dd361c40a8ca0956bf7fa4047bb00ab51c8aae729cce29a5427b8f80e28fcd5163a6f070c654ef05b85671fd1c9a2a2e52e8737b3cc04d6e95e0690b5e7d711b23c45a065f66193ab6d070a23efa56654f9427ec05e4e32a79e43869db3f3b61ca5c4fed04f2926e4bdb99367b15068868d0fb232359ea3c9e9c64150b4058a592b59943a7e23b69813bf08e637cca4ea1e5e996613a1db2684386a5e5f0dcbbea04b312f69512bab31db7e9ef94b6905a79690193f7289851821d135974af3696a2e0439585a960b3d8a31568bca8de1271a14cd30ed1a7b85adf23f9d76f5b62149242296677fea61288a4b58d2e38889b2bbd9926672df36b46fd6463bf0c0f7b1db1a7312071ef8e39a5a7deea4e47b6cda985de2cc5133337633b3db6d0cb54d56795a8a76fef2edf93debc3cbea6d0b902a0c710e73fa443c4842ec1646b4934514d2700eaa48b1320f0477f992ac0849bfd1fa628fd2b85a8997c5c2128bcb8135718b62180ede1ee8d4bf375c053a5419173b6adf54ab6f5943a377f7b2b4b81807fba3460b6acd28ef6d4be2bb015d9d5ea9b3c2d22389d7c688dd871e0a9fe295389711bf19804eeb68a86204fed691fe7493db9e0d2bce3f6ae4df5debe4cd4b4c668111146dc82b638080da9fa26d47d00f37538ee2a4a2930d39d1f734537a79d0d34f6cfab7893e2ebe71ec110e82f63a7d5c246737acadf1fc75c777faaa150164fc204c7ad3261fc9563a1b5bac908905d53fb7f37060dc1c5750634b200b31fbfaf4de1fefbc687b4c808968065e9cb567f003e1bd06b77e6442a7e5d3f54ff98d12d03d3f8705fdeb9614764acd153fc15a8763e5dc95e2c19ce478b8da93744680f2bfca75e50bebabc0cbb609575bb1000141dc35da3f4b5f5141899ff9ef856b7904baf5a828d2e4f576a58e505c5c9f3e5bc0e1ecfaf4ef36a7dee842aaf155db65912cd8dfccd11b188f5da5ea10035d47f17e0996791b0aacefa38799708198e4780846c7b1cf60aa9172a3a5935338bdb71e33a20b96181e487dd5caeeeff0446bc945ac2a83c3ca0ded82939d314073711c2afce8cc2a94fc6d46e28ea5bbafcd6adb517dedc9fa99446be727718bc41122214b6b788641e785ba0bee6530c61f9a9a58c14c6a5c477fd6f2117c67b1a2d8ca20e3aaef5c2d4e1f2b525fc8516ac90654880e72b4d87916e76592691d154a89f4125db6d9635e553955797f77ec00797f130f43b6245bf97cb88c93a641c78cbc352cf4816b075c81133cff364f4120399e3beb8cb6aae362a33de38c0d14d919a1939c00d46cd7ec2368620378fa490dd7d746361df3ee49b19a848035f619b08a66271fd97cb805ec834d85355495f003e39b6284b1ff52d5fbfeca7f7676f2a780c0b649abe6574da5867b2949af7d01e33fb9ffdee + + + 2fe9827b8286e6e5329cc9af2bb910f78b57ec5d073e6ef061360d7103f1c38245e04f804f431da3b51887a6e16cfee2a69534f4ab8ded57b74029beba7ccd2347b962d8f0d2d8bc93771a52ef4688fdf9759d33be9ba18b306a86fd3848b8ca8fe61abdd9ea2b9018c31554122172488166517e67276384b23239f02f4b5c4d8290dc542f0af54a66874a34bb8cd6114d7d5bce7404294f2c41ec20b85b942e5dca6e7b94fdea2e3dcd98777d0d7b631246c2222b69bd0547dc56d4c7990e0f803c32593cd218f4d655998ddd90e488a5d12aa7ef868f7641dc6a6df0bb0abfc0e76335ab682d909d117d863c90f6e21ebdb3ff8a7126bde4b14c524afe31fad20d1b000356cd25ab2276a2adf82638a5bf20304e2ad1a2f28cd7490e818fbec3566514cdeb412ce63d421738b038e40f70073d50352307de058b40d6215f6af1ce09cf6b954be69c7ef0f8030449a20faa5c2dd9b8d0f1adf911371156dc65b470fb02a092975af2f9080f689dd56cc3cd0f4c0434537e32b80cc22bd19743b1145d713422fed681b3bb9a09c5e5ec8f739631a8ffe2a49cebb2f13634b9414da48845948473616f18814447f63e018015b3d385cc592cc80c1f5a54d04029766572be94991d3e96b952961813e35fdc3f86a2d5fbfcd48a12d531be0f68ffcf48f1eb0e14623a6cfbdea026dd766fab9bbbc442468e6559d934959f0643c963c0799fcc3f98ccfa38b84cfb962a77cf5008037c81934425f0d7f4d1b7093adfc109918a7a130f1b3d5073a1517ac1c5b6dfe962917c8704e0d94d68795355f4ac341f84124bddd270c1da1a180ca101fb5f0bd4204e11461dce54d96827dcaa3e3a3889a621734268cf27ac18fe8c0df23108f3ef949fc68fd54122f3ea5fd5b2131b1ab7264006d730a7c4b90493b6858d78f5dfcf2cddbe8f1aa2b5da1de0580862ae16e01c5bce21a537ce0a8dfec8379c5152c0a3af41e09b7d35ed8920ad0f01abf1495b6e3e565cc8734ecf22a839212626f8f46cee5b90a742d43c2de2a280a2b1ffbe7e8285d8632bbf1137c28590f0420b3e75809c71f8b0e9bd8ed8995ba81003386d9c206ff5d3db014353d9565d1ac859f9335146cd3d2c8a04b4c3a1e7fa2e37a067ea2cb8fd4826010ecc5915114301fd7b2c7c72a222618c424797fe690cc9af7bc0a609c17a1dc8de4603df8ecbcc08d09bdd382b440fb29d11c822319b8572727592915fdcc1d9f7f3a025bec58834d5c55505c8013a5daf7f6e312b509500c2adc8e664c56031666124ab3f997185ae4f9286e7e6760ca8a106484fc68e50da961819fce231fca20330729b80be767c75006b1f8b796d60da0636d8fec8bd4c69671a8681f11f21f2b104ab4961c50b50f6b2b5fc59f78b674de891652d91f32ba60deaabf554158a38989438b67fb1713a14b4a2b58843a8b2df832d0969309f23ce4e07504a6be8aba05d8d79af93f41cf70fe0ef7b20ad603e4bd4c9261b0c3a007b46663c7b16ad77e8b8029d4d76fc4941205134d4cc9b7b7f9cc961ce5651afe8b308fa982cfdd57e9c21e1c65b2e906001f98f63cea267c44032c28348655541242b2092bfe8cb521bc491d376d989baa75c8f3c588089956f0736a71245c7acf0654dbaaad04803f8d8096d9a2c786a4c96ab99e4bc38119171839b718cffba4f8503d624cdfc2209597505da520878e2a10a9a7b0cd1e54ca09cf8c1ec9898735ea38e0886c940d8390d4581d205e4d9eb03d280071c6428bcee962122094af10e3784150651c5c4a583d8814c9e14810e021c659bf8cb66f82141d9a87248b20cba5cc212b2c0cd6dd085e690e549b31376babf1f3b19581956e26b1107f198975502 + + + 74f4e96bbc0f84de1f5f481c7e3257243edfcec173663557469a90ef23c067b8606774b867568db7dfe5209aada24cc96fcf93faa7a95180ffe2a20154898e82b27e27d01358c42c1857f9bdcb4a83ee1709226e2fc117c3a93cd3cb139777fc9295b4602c5d7c76f5a47d2f574009959a274f49d36e7435ed61e755768551859dfc34277df224c2dc9365112b9459e26235e7ce8619d0d1457954de93f604a200b0e9368b53aa7a3313b4f020d28625c646b6ca7bc6feadc7297b5a51f7eeb77adb016f346ca3bd2f4878a92dcef4abad57b0e5c8a10087f717e813892f55ed4e248cc6bdf0ea1edcaa1d42adbec7d2832c184d2185fdb66f0ee0043ce0a6035a151b22d81eafcf4cf9a8ce962e6ce1f6571b6df0a86dc221b770974f5bbfe960efbfb8c148f590584fbefae0b5cb95545bf69e4e5c9a39b431155649468ef093127aba424654ee0bb46d194ad17e61b022c43671dfef0eae98ec6ba6cd2924279fb592ac1d3babb61c0befddf6521efc38d4d75007499864cced0c8ee14cb5fd37b79626f636753b585ccfcf583ee92784850f0cacd3389c3546827bf3e7ef2719b25819f0208dcf7c3493edfc048a6fa3d35511e6f9c2a367cb87ad74c0f41bf853b6ba35f51fadfd5632012bde0180585dff6a7f114a2a958ce7ecbe484304dba2f138a86c4b0aad337c0047b1cb9dcd358300155d09b72d6c0ed4c53778e86fbdc7674d37a1441c1d38bf8f4c9976540090575863c41a8211c9b9450f28edd514ed8d51e3565de2fd30d6f0bf02fcfb79319ff04e7c4ad452be372fd9fe64021c8af6e566076b78f9c6d553848f9e1bf2ad3955c94470cfb8b6ba4aa81c53acc82395870ef9677b634515c4e4bd8de971292c3aa0c150516c546f8b172613dd1e314d4caf46ebd1770bb0d73b6ea2d53969 + + + 8305f8dd0b412a4b95ef71a44a2cb069890895668054436640b9dffd2b0db4d84e21788b2cf8d609eb95773b4ef3c926335bc93bdc4df971a95f4c4c68ee627402c8935aa619ad276a6994004babf0bb41a8ca9fd5d22e76ec68f662eeb449ad9cdbd37f78b52fb88101e86a54323be7cd4777fdab26ada1cbba1ff0b08b6f451aa45daadcf9ef35a0a24039f2b1d5ca88ad64057afdbfe7c2bba6033380208d8d7c6c5f822a5f8bf19b5ee4f16efe068bd914d2e6ca831af24d53fa330c5d8150eb52fdd29518c14ecbc9af7e68a6e5f7a866150ecccf2b598fd6ba78521d5fe815797a6430ea09d6b394abe630df9510046bc983d9c41e3213868aeaa9dd531220959dd6305a1c582bde1a3e01d9b4be5d09150c1f4a84aa35c995103e6c6e3b6bb5345759b2219a31d05626373653d8151130ba1abef2aa78494f736792c0a462f54ebd86d2a110ae27ad1ad413baca5c7c4a302252da1423e44647cd57399e92cc805a60ce43bbda7a74797be1ad0275c0b270be2f117bd9ccc07bee42e247d178b15ba233535bffbb1c641cdd9ca3d387985b7980e8aed9752dbe30313f8a4b911f0ac7d8fd9352e3be80cdfaa3fd20ac5771c9f918d456b88cd3155de13a3f71bbcc627e766a16a86cac17f83fde98a2e7742bee4144ad235e23c76459522a96812819585155b6fcb6a08dafb19ccf93de37cb6738c803f73b0876e583d47ea3c59d6aba7b168c8de113a8f04cb813847a79682574ee71f6d9a5987b5e3be7169bf3bd82fbda4f5899e31b55b8c257f989516bbc879e60a49a4c5370230b4f728dd9389a059b481ea61046230e1382046955dae636005db580ec4a0540ee382fbc74b78b00ec821a19778fc119b673496df2bc2f11639922141d4cbb8fe22833f6fb210801419ab1b43f77a2baf892055a41c57e529026d4784aad469a4d2b530e81780f2aaea6b37b44243fa0f5e60a99391c6cf2e8a0f263a38566bfa56f761684b754bb8fa95aed80511332bff4673d600b6a09852cba34faca550f0652241a9eb04ca9652c4a19c20d37d6772604c3bbd34c82fa913a1a95e33b811f33952f4618d3600165574e29c44f7f748c05f90105791906e5920b356c4a8ce133dc2a809f0e47aa0ca2537a09688d2b92d49fa6b1f25165b6d2905ea99d1d6d56b2c39b08167df0cf18ce0f593228abbdbba718f05de4700ffa54067cb01fa65d9e378c0bc88d5f4d7bc153db964920e3c0dab30c02e87d957c369c6492bba7b240c27541d80bf0d39cbe62c077bdf6b1fb252d470cc39f9e43a13a95c08788dd5fe4e62fa3b07be01496bc977c6e1fe62977a2a8b72197fb3ad812369e96e3dd2ad329f134aaa4baee81c2ebd1b2c39e55fd9afcc554633ffb04a827ac75f7b26e49bcc341ea062ba13f672cd0a1dfd79a093273a5187e3adb6ece0e460555dc872c49b95e5054ffb772a4301feecdb072d6087345814b4af54de55d413eee562be25741a041bbdcb2850281 + + + 8305f8dd0b412a4b95ef71a44a2cb069890895668054436640b9dffd2b0db4d84e21788b2cf8d609eb95773b4ef3c926335bc93bdc4df971a95f4c4c68ee627402c8935aa619ad276a6994004babf0bb41a8ca9fd5d22e76ec68f662eeb449ad9cdbd37f78b52fb88101e86a54323be7cd4777fdab26ada1cbba1ff0b08b6f451aa45daadcf9ef35a0a24039f2b1d5ca88ad64057afdbfe7c2bba6033380208d8d7c6c5f822a5f8bf19b5ee4f16efe068bd914d2e6ca831af24d53fa330c5d8150eb52fdd29518c14ecbc9af7e68a6e5f7a866150ecccf2b598fd6ba78521d5fe815797a6430ea09d6b394abe630df9510046bc983d9c41e3213868aeaa9dd531220959dd6305a1c582bde1a3e01d9b4be5d09150c1f4a84aa35c995103e6c6e3b6bb5345759b2219a31d05626373653d8151130ba1abef2aa78494f736792c0a462f54ebd86d2a110ae27ad1ad413baca5c7c4a302252da1423e44647cd57399e92cc805a60ce43bbda7a74797be1ad0275c0b270be2f117bd9ccc07bee42e247d178b15ba233535bffbb1c641cdd9ca3d387985b7980e8aed9752dbe30313f8a4b911f0ac7d8fd9352e3be80cdfaa3fd20ac5771c9f918d456b88cd3155de13a3f71bbcc627e766a16a86cac17f83fde98a2e7742bee4144ad235e23c76459522a96812819585155b6fcb6a08dafb19ccf93de37cb6738c803f73b0876e583d47ea3c59d6aba7b168c8de113a8f04cb813847a79682574ee71f6d9a5987b5e3be7169bf3bd82fbda4f5899e31b55b8c257f989516bbc879e60a49a4c5370230b4f728dd9389a059b481ea61046230e1382046955dae636005db580ec4a0540ee382fbc74b78b00ec821a19778fc119b673496df2bc2f11639922141d4cbb8fe22833f6fb210801419ab1b43f77a2baf892055a41c57e529026d4784aad469a4d2b530e81780f2aaea6b37b44243fa0f5e60a99391c6cf2e8a0f263a38566bfa56f761684b754bb8fa95aed80511332bff4673d600b6a09852cba34faca550f0652241a9eb04ca9652c4a19c20d37d6772604c3bbd34c82fa913a1a95e33b811f33952f4618d3600165574e29c44f7f748c05f90105791906e5920b356c4a8ce133dc2a809f0e47aa0ca2537a09688d2b92d49fa6b1f25165b6d2905ea99d1d6d56b2c39b08167df0cf18ce0f593228abbdbba718f05de4700ffa54067cb01fa65d9e378c0bc88d5f4d7bc153db964920e3c0dab30c02e87d957c369c6492bba7b240c27541d80bf0d39cbe62c077bdf6b1fb252d470cc39f9e43a13a95c08788dd5fe4e62fa3b07be01496bc977c6e1fe62977a2a8b72197fb3ad812369e96e3dd2ad329f134aaa4baee81c2ebd1b2c39e55fd9afcc554633ffb04a827ac75f7b26e49bcc341ea062ba13f672cd0a1dfd79a093273a5187e3adb6ece0e460555dc872c49b95e5054ffb772a4301feecdb072d6087345814b4af54de55d413eee562be25741a041bbdcb2850281 + + + fb7d736ac8ee7a3a74f952551e8856a34c05d564ee0408ca0eea47a86e833b5b30a732b9d3ca954e56231908beb9022aec02c756c3e075bd9086f9ade0381b953185b4d3ed332d5c4b454abe5d2ccbeb48b473f956d543bde4f48c1978f129da7bf481b629a8da09941e5ea66d069617f6c82ac3a685b9e6cf75d8d4faf0b2ca0b52df201372c6e2d08dbcb2b724da94c733590165282e6faefd7bb89bb5be76d452f84b50a557d4b0f45192fc562f3682aba1098818ed3ddfaf72181d66f1f7b59be2b31759b66c + + + + + 304e17d899c067afe3c439f92c5bd29869dfbde06ceca4f65e2128a93e7366c078bb0af1b14cb516008683df14c00107cadcce4d980f149da932bdba4a9892841b004ae877b2c7733e2d326d5586a4b2225384afbab6d00900852f5feb47ebd234ad95ec6957dbbbe585c86126f02e47cff3dc6d4ac9d321efbbd39a28655110fa850caca24a9b82984b60d0c517f3d8400594a17ba4a5fd0fcf19711c4b0ef503d698e8597c841eb099118d23e8cc8bc4db907d5093ca73e68f85c3dae629876b5d2fa49ed283591972559ae7da1b99489715c355f068c689c7cb4690ea4d4f3d1f364367b352bd74a0a57a541bfac90fe69d9b6d2fe941707c7316b067f5287c6aff01c86cbb23c2ac5e202cb497c203437c80159454b20dcadec7f2080b286c6b4e76826952b963f856e3c7e9ad89e50b76e2dd22f7bc1fbc8366a965cb76dc862d5c9b5b52802e431d2490079a7396db1bc279099a68a9b250135020e3906bc8c159b773a7dbb3d5beb54a30746fc776a07aeeb4f1f170d688b15742f530901959e4a4cd8ed869249e95a58c3cc45bc323aee66aec9090f4c938411c348b72d6ae4c3169c0049d84e88f4c26318136353db77519d7c060df07f7da78df71f13ed7be5916b2973fa712b4d826527911a04923dc763630306d04e09229584370e670c24d6af48bee2ead5525f55b8bd66083314b11d1dede385bfbdcaacd0b577c1d37f7bbcbb8d24f461723713570537abbcdfd8b96c9dcfc0f8c0afd7e6e43620dbfb88442cacd15a6cb28ee2d318e56d023af40a832010e8e2cb1d2d5223fd465616094fca6fecd92ff66e398f3ac8ac091beb3635dfacea5147848514c94ecdc011180cda61f977f9c59265682c77dc7af662e1c50386ac50835c6802adb86f941ec3d05316e505f7183bf8dc048685af48f6514726d993e789cfe13e28bd0ce7ea0e0e97f19364ec8567e63f28afcdf07de02fa8c79a850ffc4e9da3786ecec269aff4995ed5e3029a2abcba65ba62990e0842714688ca48162510449ebaf80878405c7373534aa6e688f4c56569f15e349272db874f3846eb3cea77f8de261628c285e93ff7c38aba3d65df19bf8dd8732068e817e90b92ddf7be29ec844f6b90af2547daf00093e4f2241c2d419e60c9b6d64e4278a2baa0a0396e98ccafebd131a6c5374baaf4a3e715c6c4d2c647de1cd0610cf9bcf3a9e857bef77a0ed51dc297ba914a5c41c5243cc72308b9de7908ec8955b52c9328b1d8efdd28d570c010f1329b7f0c40669004dc77cc87a34348310f444ba799fb0ed00687ae16681dc7eab7d1884213b59ff1e2e3cefa64676587fd37db308f4de795cb46b468948e38d340981e32ca2222cbff42bc3852f1657a690bfba8b918cfa05bd3f6a7bbc284e15ba39b114e8619b666748325e0b87514eff2b48a70ea906ca0ecf6f0f2c6438ffa8106239b94231f008339069fd420978e0f8103c94fcfb8a48018353443e8cbe131dc4261ef79945471cdaec9868954e420f4f43f738c098e3ee3378c5890409bc9e4f191e85f3318c5a125f48e8bc3a9eb67f413742c2b030847b3461bd9659e62af48aca3a456ae4f99beacd3df943608956fbadde816733edc9f2a107a8d92592b9690aeb69b48bfd9231ba345f1c71dcb6aae1c13cf1ab91942938db056a1569c6399cf57dd02032ef43f64f6e3ee3de56d11b7dc07f3bdb899714b912d6e8a45be8e2f6413ad51ef93aa75c5bd9c4a8c86231b31a5e68892bc8ec01de40db5d6ec87160c8d5d14b3725160407a9a7484bb794dee73e0a87cceeb874ed6d96941406f18b8634886c23d5be' + + + 304e17d899c067afe3c439f92c5bd29869dfbde06ceca4f65e2128a93e7366c078bb0af1b14cb516008683df14c00107cadcce4d980f149da932bdba4a9892841b004ae877b2c7733e2d326d5586a4b2225384afbab6d00900852f5feb47ebd234ad95ec6957dbbbe585c86126f02e47cff3dc6d4ac9d321efbbd39a28655110fa850caca24a9b82984b60d0c517f3d8400594a17ba4a5fd0fcf19711c4b0ef503d698e8597c841eb099118d23e8cc8bc4db907d5093ca73e68f85c3dae629876b5d2fa49ed283591972559ae7da1b99489715c355f068c689c7cb4690ea4d4f3d1f364367b352bd74a0a57a541bfac90fe69d9b6d2fe941707c7316b067f5287c6aff01c86cbb23c2ac5e202cb497c203437c80159454b20dcadec7f2080b286c6b4e76826952b963f856e3c7e9ad89e50b76e2dd22f7bc1fbc8366a965cb76dc862d5c9b5b52802e431d2490079a7396db1bc279099a68a9b250135020e3906bc8c159b773a7dbb3d5beb54a30746fc776a07aeeb4f1f170d688b15742f530901959e4a4cd8ed869249e95a58c3cc45bc323aee66aec9090f4c938411c348b72d6ae4c3169c0049d84e88f4c26318136353db77519d7c060df07f7da78df71f13ed7be5916b2973fa712b4d826527911a04923dc763630306d04e09229584370e670c24d6af48bee2ead5525f55b8bd66083314b11d1dede385bfbdcaacd0b577c1d37f7bbcbb8d24f461723713570537abbcdfd8b96c9dcfc0f8c0afd7e6e43620dbfb88442cacd15a6cb28ee2d318e56d023af40a832010e8e2cb1d2d5223fd465616094fca6fecd92ff66e398f3ac8ac091beb3635dfacea5147848514c94ecdc011180cda61f977f9c59265682c77dc7af662e1c50386ac50835c6802adb86f941ec3d05316e505f7183bf8dc048685af48f6514726d993e789cfe13e28bd0ce7ea0e0e97f19364ec8567e63f28afcdf07de02fa8c79a850ffc4e9da3786ecec269aff4995ed5e3029a2abcba65ba62990e0842714688ca48162510449ebaf80878405c7373534aa6e688f4c56569f15e349272db874f3846eb3cea77f8de261628c285e93ff7c38aba3d65df19bf8dd8732068e817e90b92ddf7be29ec844f6b90af2547daf00093e4f2241c2d419e60c9b6d64e4278a2baa0a0396e98ccafebd131a6c5374baaf4a3e715c6c4d2c647de1cd0610cf9bcf3a9e857bef77a0ed51dc297ba914a5c41c5243cc72308b9de7908ec8955b52c9328b1d8efdd28d570c010f1329b7f0c40669004dc77cc87a34348310f444ba799fb0ed00687ae16681dc7eab7d1884213b59ff1e2e3cefa64676587fd37db308f4de795cb46b468948e38d340981e32ca2222cbff42bc3852f1657a690bfba8b918cfa05bd3f6a7bbc284e15ba39b114e8619b666748325e0b87514eff2b48a70ea906ca0ecf6f0f2c6438ffa8106239b94231f008339069fd420978e0f8103c94fcfb8a48018353443e8cbe131dc4261ef79945471cdaec9868954e420f4f43f738c098e3ee3378c5890409bc9e4f191e85f3318c5a125f48e8bc3a9eb67f413742c2b030847b3461bd9659e62af48aca3a456ae4f99beacd3df943608956fbadde816733edc9f2a107a8d92592b9690aeb69b48bfd9231ba345f1c71dcb6aae1c13cf1ab91942938db056a1569c6399cf57dd02032ef43f64f6e3ee3de56d11b7dc07f3bdb899714b912d6e8a45be8e2f6413ad51ef93aa75c5bd9c4a8c86231b31a5e68892bc8ec01de40db5d6ec87160c8d5d14b3725160407a9a7484bb794dee73e0a87cceeb874ed6d96941406f18b8634886c23d5be' + + + 35b9ea4d98445d6fda595e42c921269e0699ed78a2655b169fcaffef66521e649c1818cb71fb5a2ef4c0f453786de08c9cf81cdc4f6bcb8a7af68f23d9a4b3dc4a84950a13261e929ef4aa41a53819b8fc98582250533b476e46d6d0894a0003f315a6d8612d2d46eebe367330ae4587635daa4d4b929a33de91dfdb30b1aa3b3bded0ab06741786b19564b74e3b0d86a3d056bf9662fa004d2609a62b862caea7f6448a5257689a0de69798ac8eaf6186799c1e5de7ba124493365a76ded957d0f133190608b49c940cd7db6bdcb6b98739dfe6dc44b4736ebb10a3563ac7a4c6c63177cb292f32be6be3041cd2c27fef4c9f3ec2005041f80df142941185c57114d90500c744d9442f4507e43c91bbacc4205ee8dc4dbbc0656a6bf948309c446ffc67844f8e49171672ebbf380368979e20dcd114f889936f5a6ae0fdc393d4292659ee8f00070c0b6f01781e9c9d64a1ef7dc43912de5666d2f3495d9e4f3b478621e0e7e2ade6728e2de162aaf06b000ef5c514ba8004ed28cdbb9893a2b9e024a3ffedf98b920ff94130f31775cbc6a4f7a0dd361c40a8ca0956bf7fa4047bb00ab51c8aae729cce29a5427b8f80e28fcd5163a6f070c654ef05b85671fd1c9a2a2e52e8737b3cc04d6e95e0690b5e7d711b23c45a065f66193ab6d070a23efa56654f9427ec05e4e32a79e43869db3f3b61ca5c4fed04f2926e4bdb99367b15068868d0fb232359ea3c9e9c64150b4058a592b59943a7e23b69813bf08e637cca4ea1e5e996613a1db2684386a5e5f0dcbbea04b312f69512bab31db7e9ef94b6905a79690193f7289851821d135974af3696a2e0439585a960b3d8a31568bca8de1271a14cd30ed1a7b85adf23f9d76f5b62149242296677fea61288a4b58d2e38889b2bbd9926672df36b46fd6463bf0c0f7b1db1a7312071ef8e39a5a7deea4e47b6cda985de2cc5133337633b3db6d0cb54d56795a8a76fef2edf93debc3cbea6d0b902a0c710e73fa443c4842ec1646b4934514d2700eaa48b1320f0477f992ac0849bfd1fa628fd2b85a8997c5c2128bcb8135718b62180ede1ee8d4bf375c053a5419173b6adf54ab6f5943a377f7b2b4b81807fba3460b6acd28ef6d4be2bb015d9d5ea9b3c2d22389d7c688dd871e0a9fe295389711bf19804eeb68a86204fed691fe7493db9e0d2bce3f6ae4df5debe4cd4b4c668111146dc82b638080da9fa26d47d00f37538ee2a4a2930d39d1f734537a79d0d34f6cfab7893e2ebe71ec110e82f63a7d5c246737acadf1fc75c777faaa150164fc204c7ad3261fc9563a1b5bac908905d53fb7f37060dc1c5750634b200b31fbfaf4de1fefbc687b4c808968065e9cb567f003e1bd06b77e6442a7e5d3f54ff98d12d03d3f8705fdeb9614764acd153fc15a8763e5dc95e2c19ce478b8da93744680f2bfca75e50bebabc0cbb609575bb1000141dc35da3f4b5f5141899ff9ef856b7904baf5a828d2e4f576a58e505c5c9f3e5bc0e1ecfaf4ef36a7dee842aaf155db65912cd8dfccd11b188f5da5ea10035d47f17e0996791b0aacefa38799708198e4780846c7b1cf60aa9172a3a5935338bdb71e33a20b96181e487dd5caeeeff0446bc945ac2a83c3ca0ded82939d314073711c2afce8cc2a94fc6d46e28ea5bbafcd6adb517dedc9fa99446be727718bc41122214b6b788641e785ba0bee6530c61f9a9a58c14c6a5c477fd6f2117c67b1a2d8ca20e3aaef5c2d4e1f2b525fc8516ac90654880e72b4d87916e76592691d154a89f4125db6d9635e553955797f77ec00797f130f43b6245bf97cb88c93a641c78cbc352cf4816b075c81133cff364f4120399e3beb8cb6aae362a33de38c0d14d919a1939c00d46cd7ec2368620378fa490dd7d746361df3ee49b19a848035f619b08a66271fd97cb805ec834d85355495f003e39b6284b1ff52d5fbfeca7f7676f2a780c0b649abe6574da5867b2949af7d01e33fb9ffdee + + + 2fe9827b8286e6e5329cc9af2bb910f78b57ec5d073e6ef061360d7103f1c38245e04f804f431da3b51887a6e16cfee2a69534f4ab8ded57b74029beba7ccd2347b962d8f0d2d8bc93771a52ef4688fdf9759d33be9ba18b306a86fd3848b8ca8fe61abdd9ea2b9018c31554122172488166517e67276384b23239f02f4b5c4d8290dc542f0af54a66874a34bb8cd6114d7d5bce7404294f2c41ec20b85b942e5dca6e7b94fdea2e3dcd98777d0d7b631246c2222b69bd0547dc56d4c7990e0f803c32593cd218f4d655998ddd90e488a5d12aa7ef868f7641dc6a6df0bb0abfc0e76335ab682d909d117d863c90f6e21ebdb3ff8a7126bde4b14c524afe31fad20d1b000356cd25ab2276a2adf82638a5bf20304e2ad1a2f28cd7490e818fbec3566514cdeb412ce63d421738b038e40f70073d50352307de058b40d6215f6af1ce09cf6b954be69c7ef0f8030449a20faa5c2dd9b8d0f1adf911371156dc65b470fb02a092975af2f9080f689dd56cc3cd0f4c0434537e32b80cc22bd19743b1145d713422fed681b3bb9a09c5e5ec8f739631a8ffe2a49cebb2f13634b9414da48845948473616f18814447f63e018015b3d385cc592cc80c1f5a54d04029766572be94991d3e96b952961813e35fdc3f86a2d5fbfcd48a12d531be0f68ffcf48f1eb0e14623a6cfbdea026dd766fab9bbbc442468e6559d934959f0643c963c0799fcc3f98ccfa38b84cfb962a77cf5008037c81934425f0d7f4d1b7093adfc109918a7a130f1b3d5073a1517ac1c5b6dfe962917c8704e0d94d68795355f4ac341f84124bddd270c1da1a180ca101fb5f0bd4204e11461dce54d96827dcaa3e3a3889a621734268cf27ac18fe8c0df23108f3ef949fc68fd54122f3ea5fd5b2131b1ab7264006d730a7c4b90493b6858d78f5dfcf2cddbe8f1aa2b5da1de0580862ae16e01c5bce21a537ce0a8dfec8379c5152c0a3af41e09b7d35ed8920ad0f01abf1495b6e3e565cc8734ecf22a839212626f8f46cee5b90a742d43c2de2a280a2b1ffbe7e8285d8632bbf1137c28590f0420b3e75809c71f8b0e9bd8ed8995ba81003386d9c206ff5d3db014353d9565d1ac859f9335146cd3d2c8a04b4c3a1e7fa2e37a067ea2cb8fd4826010ecc5915114301fd7b2c7c72a222618c424797fe690cc9af7bc0a609c17a1dc8de4603df8ecbcc08d09bdd382b440fb29d11c822319b8572727592915fdcc1d9f7f3a025bec58834d5c55505c8013a5daf7f6e312b509500c2adc8e664c56031666124ab3f997185ae4f9286e7e6760ca8a106484fc68e50da961819fce231fca20330729b80be767c75006b1f8b796d60da0636d8fec8bd4c69671a8681f11f21f2b104ab4961c50b50f6b2b5fc59f78b674de891652d91f32ba60deaabf554158a38989438b67fb1713a14b4a2b58843a8b2df832d0969309f23ce4e07504a6be8aba05d8d79af93f41cf70fe0ef7b20ad603e4bd4c9261b0c3a007b46663c7b16ad77e8b8029d4d76fc4941205134d4cc9b7b7f9cc961ce5651afe8b308fa982cfdd57e9c21e1c65b2e906001f98f63cea267c44032c28348655541242b2092bfe8cb521bc491d376d989baa75c8f3c588089956f0736a71245c7acf0654dbaaad04803f8d8096d9a2c786a4c96ab99e4bc38119171839b718cffba4f8503d624cdfc2209597505da520878e2a10a9a7b0cd1e54ca09cf8c1ec9898735ea38e0886c940d8390d4581d205e4d9eb03d280071c6428bcee962122094af10e3784150651c5c4a583d8814c9e14810e021c659bf8cb66f82141d9a87248b20cba5cc212b2c0cd6dd085e690e549b31376babf1f3b19581956e26b1107f198975502 + + + 74f4e96bbc0f84de1f5f481c7e3257243edfcec173663557469a90ef23c067b8606774b867568db7dfe5209aada24cc96fcf93faa7a95180ffe2a20154898e82b27e27d01358c42c1857f9bdcb4a83ee1709226e2fc117c3a93cd3cb139777fc9295b4602c5d7c76f5a47d2f574009959a274f49d36e7435ed61e755768551859dfc34277df224c2dc9365112b9459e26235e7ce8619d0d1457954de93f604a200b0e9368b53aa7a3313b4f020d28625c646b6ca7bc6feadc7297b5a51f7eeb77adb016f346ca3bd2f4878a92dcef4abad57b0e5c8a10087f717e813892f55ed4e248cc6bdf0ea1edcaa1d42adbec7d2832c184d2185fdb66f0ee0043ce0a6035a151b22d81eafcf4cf9a8ce962e6ce1f6571b6df0a86dc221b770974f5bbfe960efbfb8c148f590584fbefae0b5cb95545bf69e4e5c9a39b431155649468ef093127aba424654ee0bb46d194ad17e61b022c43671dfef0eae98ec6ba6cd2924279fb592ac1d3babb61c0befddf6521efc38d4d75007499864cced0c8ee14cb5fd37b79626f636753b585ccfcf583ee92784850f0cacd3389c3546827bf3e7ef2719b25819f0208dcf7c3493edfc048a6fa3d35511e6f9c2a367cb87ad74c0f41bf853b6ba35f51fadfd5632012bde0180585dff6a7f114a2a958ce7ecbe484304dba2f138a86c4b0aad337c0047b1cb9dcd358300155d09b72d6c0ed4c53778e86fbdc7674d37a1441c1d38bf8f4c9976540090575863c41a8211c9b9450f28edd514ed8d51e3565de2fd30d6f0bf02fcfb79319ff04e7c4ad452be372fd9fe64021c8af6e566076b78f9c6d553848f9e1bf2ad3955c94470cfb8b6ba4aa81c53acc82395870ef9677b634515c4e4bd8de971292c3aa0c150516c546f8b172613dd1e314d4caf46ebd1770bb0d73b6ea2d53969 + + + 8305f8dd0b412a4b95ef71a44a2cb069890895668054436640b9dffd2b0db4d84e21788b2cf8d609eb95773b4ef3c926335bc93bdc4df971a95f4c4c68ee627402c8935aa619ad276a6994004babf0bb41a8ca9fd5d22e76ec68f662eeb449ad9cdbd37f78b52fb88101e86a54323be7cd4777fdab26ada1cbba1ff0b08b6f451aa45daadcf9ef35a0a24039f2b1d5ca88ad64057afdbfe7c2bba6033380208d8d7c6c5f822a5f8bf19b5ee4f16efe068bd914d2e6ca831af24d53fa330c5d8150eb52fdd29518c14ecbc9af7e68a6e5f7a866150ecccf2b598fd6ba78521d5fe815797a6430ea09d6b394abe630df9510046bc983d9c41e3213868aeaa9dd531220959dd6305a1c582bde1a3e01d9b4be5d09150c1f4a84aa35c995103e6c6e3b6bb5345759b2219a31d05626373653d8151130ba1abef2aa78494f736792c0a462f54ebd86d2a110ae27ad1ad413baca5c7c4a302252da1423e44647cd57399e92cc805a60ce43bbda7a74797be1ad0275c0b270be2f117bd9ccc07bee42e247d178b15ba233535bffbb1c641cdd9ca3d387985b7980e8aed9752dbe30313f8a4b911f0ac7d8fd9352e3be80cdfaa3fd20ac5771c9f918d456b88cd3155de13a3f71bbcc627e766a16a86cac17f83fde98a2e7742bee4144ad235e23c76459522a96812819585155b6fcb6a08dafb19ccf93de37cb6738c803f73b0876e583d47ea3c59d6aba7b168c8de113a8f04cb813847a79682574ee71f6d9a5987b5e3be7169bf3bd82fbda4f5899e31b55b8c257f989516bbc879e60a49a4c5370230b4f728dd9389a059b481ea61046230e1382046955dae636005db580ec4a0540ee382fbc74b78b00ec821a19778fc119b673496df2bc2f11639922141d4cbb8fe22833f6fb210801419ab1b43f77a2baf892055a41c57e529026d4784aad469a4d2b530e81780f2aaea6b37b44243fa0f5e60a99391c6cf2e8a0f263a38566bfa56f761684b754bb8fa95aed80511332bff4673d600b6a09852cba34faca550f0652241a9eb04ca9652c4a19c20d37d6772604c3bbd34c82fa913a1a95e33b811f33952f4618d3600165574e29c44f7f748c05f90105791906e5920b356c4a8ce133dc2a809f0e47aa0ca2537a09688d2b92d49fa6b1f25165b6d2905ea99d1d6d56b2c39b08167df0cf18ce0f593228abbdbba718f05de4700ffa54067cb01fa65d9e378c0bc88d5f4d7bc153db964920e3c0dab30c02e87d957c369c6492bba7b240c27541d80bf0d39cbe62c077bdf6b1fb252d470cc39f9e43a13a95c08788dd5fe4e62fa3b07be01496bc977c6e1fe62977a2a8b72197fb3ad812369e96e3dd2ad329f134aaa4baee81c2ebd1b2c39e55fd9afcc554633ffb04a827ac75f7b26e49bcc341ea062ba13f672cd0a1dfd79a093273a5187e3adb6ece0e460555dc872c49b95e5054ffb772a4301feecdb072d6087345814b4af54de55d413eee562be25741a041bbdcb2850281 + + + 8305f8dd0b412a4b95ef71a44a2cb069890895668054436640b9dffd2b0db4d84e21788b2cf8d609eb95773b4ef3c926335bc93bdc4df971a95f4c4c68ee627402c8935aa619ad276a6994004babf0bb41a8ca9fd5d22e76ec68f662eeb449ad9cdbd37f78b52fb88101e86a54323be7cd4777fdab26ada1cbba1ff0b08b6f451aa45daadcf9ef35a0a24039f2b1d5ca88ad64057afdbfe7c2bba6033380208d8d7c6c5f822a5f8bf19b5ee4f16efe068bd914d2e6ca831af24d53fa330c5d8150eb52fdd29518c14ecbc9af7e68a6e5f7a866150ecccf2b598fd6ba78521d5fe815797a6430ea09d6b394abe630df9510046bc983d9c41e3213868aeaa9dd531220959dd6305a1c582bde1a3e01d9b4be5d09150c1f4a84aa35c995103e6c6e3b6bb5345759b2219a31d05626373653d8151130ba1abef2aa78494f736792c0a462f54ebd86d2a110ae27ad1ad413baca5c7c4a302252da1423e44647cd57399e92cc805a60ce43bbda7a74797be1ad0275c0b270be2f117bd9ccc07bee42e247d178b15ba233535bffbb1c641cdd9ca3d387985b7980e8aed9752dbe30313f8a4b911f0ac7d8fd9352e3be80cdfaa3fd20ac5771c9f918d456b88cd3155de13a3f71bbcc627e766a16a86cac17f83fde98a2e7742bee4144ad235e23c76459522a96812819585155b6fcb6a08dafb19ccf93de37cb6738c803f73b0876e583d47ea3c59d6aba7b168c8de113a8f04cb813847a79682574ee71f6d9a5987b5e3be7169bf3bd82fbda4f5899e31b55b8c257f989516bbc879e60a49a4c5370230b4f728dd9389a059b481ea61046230e1382046955dae636005db580ec4a0540ee382fbc74b78b00ec821a19778fc119b673496df2bc2f11639922141d4cbb8fe22833f6fb210801419ab1b43f77a2baf892055a41c57e529026d4784aad469a4d2b530e81780f2aaea6b37b44243fa0f5e60a99391c6cf2e8a0f263a38566bfa56f761684b754bb8fa95aed80511332bff4673d600b6a09852cba34faca550f0652241a9eb04ca9652c4a19c20d37d6772604c3bbd34c82fa913a1a95e33b811f33952f4618d3600165574e29c44f7f748c05f90105791906e5920b356c4a8ce133dc2a809f0e47aa0ca2537a09688d2b92d49fa6b1f25165b6d2905ea99d1d6d56b2c39b08167df0cf18ce0f593228abbdbba718f05de4700ffa54067cb01fa65d9e378c0bc88d5f4d7bc153db964920e3c0dab30c02e87d957c369c6492bba7b240c27541d80bf0d39cbe62c077bdf6b1fb252d470cc39f9e43a13a95c08788dd5fe4e62fa3b07be01496bc977c6e1fe62977a2a8b72197fb3ad812369e96e3dd2ad329f134aaa4baee81c2ebd1b2c39e55fd9afcc554633ffb04a827ac75f7b26e49bcc341ea062ba13f672cd0a1dfd79a093273a5187e3adb6ece0e460555dc872c49b95e5054ffb772a4301feecdb072d6087345814b4af54de55d413eee562be25741a041bbdcb2850281 + + + fb7d736ac8ee7a3a74f952551e8856a34c05d564ee0408ca0eea47a86e833b5b30a732b9d3ca954e56231908beb9022aec02c756c3e075bd9086f9ade0381b953185b4d3ed332d5c4b454abe5d2ccbeb48b473f956d543bde4f48c1978f129da7bf481b629a8da09941e5ea66d069617f6c82ac3a685b9e6cf75d8d4faf0b2ca0b52df201372c6e2d08dbcb2b724da94c733590165282e6faefd7bb89bb5be76d452f84b50a557d4b0f45192fc562f3682aba1098818ed3ddfaf72181d66f1f7b59be2b31759b66c + + \ No newline at end of file diff --git a/test.html b/test.html index aaa0108..d0ecd7a 100644 --- a/test.html +++ b/test.html @@ -7,123 +7,40 @@ Document - + \ No newline at end of file diff --git a/tsconfig.json b/tsconfig.json new file mode 100644 index 0000000..0e7a88c --- /dev/null +++ b/tsconfig.json @@ -0,0 +1,107 @@ +{ + "include": [ + "./frontend/**/*.ts", + "./frontend/*.ts" + ], + "compilerOptions": { + /* Visit https://aka.ms/tsconfig to read more about this file */ + + /* Projects */ + // "incremental": true, /* Save .tsbuildinfo files to allow for incremental compilation of projects. */ + // "composite": true, /* Enable constraints that allow a TypeScript project to be used with project references. */ + // "tsBuildInfoFile": "./.tsbuildinfo", /* Specify the path to .tsbuildinfo incremental compilation file. */ + // "disableSourceOfProjectReferenceRedirect": true, /* Disable preferring source files instead of declaration files when referencing composite projects. */ + // "disableSolutionSearching": true, /* Opt a project out of multi-project reference checking when editing. */ + // "disableReferencedProjectLoad": true, /* Reduce the number of projects loaded automatically by TypeScript. */ + + /* Language and Environment */ + "target": "ES6", /* Set the JavaScript language version for emitted JavaScript and include compatible library declarations. */ + "lib": ["DOM","ES6","ES2015.Promise"], /* Specify a set of bundled library declaration files that describe the target runtime environment. */ + // "jsx": "preserve", /* Specify what JSX code is generated. */ + // "experimentalDecorators": true, /* Enable experimental support for TC39 stage 2 draft decorators. */ + // "emitDecoratorMetadata": true, /* Emit design-type metadata for decorated declarations in source files. */ + // "jsxFactory": "", /* Specify the JSX factory function used when targeting React JSX emit, e.g. 'React.createElement' or 'h'. */ + // "jsxFragmentFactory": "", /* Specify the JSX Fragment reference used for fragments when targeting React JSX emit e.g. 'React.Fragment' or 'Fragment'. */ + // "jsxImportSource": "", /* Specify module specifier used to import the JSX factory functions when using 'jsx: react-jsx*'. */ + // "reactNamespace": "", /* Specify the object invoked for 'createElement'. This only applies when targeting 'react' JSX emit. */ + // "noLib": true, /* Disable including any library files, including the default lib.d.ts. */ + // "useDefineForClassFields": true, /* Emit ECMAScript-standard-compliant class fields. */ + // "moduleDetection": "auto", /* Control what method is used to detect module-format JS files. */ + + /* Modules */ + "module": "ES2015", /* Specify what module code is generated. */ + "rootDir": "./frontend", /* Specify the root folder within your source files. */ + "moduleResolution": "node", /* Specify how TypeScript looks up a file from a given module specifier. */ + "baseUrl": "./", /* Specify the base directory to resolve non-relative module names. */ + // "paths": {}, /* Specify a set of entries that re-map imports to additional lookup locations. */ + // "rootDirs": [], /* Allow multiple folders to be treated as one when resolving modules. */ + // "typeRoots": [], /* Specify multiple folders that act like './node_modules/@types'. */ + // "types": [], /* Specify type package names to be included without being referenced in a source file. */ + // "allowUmdGlobalAccess": true, /* Allow accessing UMD globals from modules. */ + // "moduleSuffixes": [], /* List of file name suffixes to search when resolving a module. */ + // "resolveJsonModule": true, /* Enable importing .json files. */ + // "noResolve": true, /* Disallow 'import's, 'require's or ''s from expanding the number of files TypeScript should add to a project. */ + + /* JavaScript Support */ + "allowJs": true, /* Allow JavaScript files to be a part of your program. Use the 'checkJS' option to get errors from these files. */ + "checkJs": true, /* Enable error reporting in type-checked JavaScript files. */ + // "maxNodeModuleJsDepth": 1, /* Specify the maximum folder depth used for checking JavaScript files from 'node_modules'. Only applicable with 'allowJs'. */ + + /* Emit */ + "declaration": true, /* Generate .d.ts files from TypeScript and JavaScript files in your project. */ + "declarationMap": true, /* Create sourcemaps for d.ts files. */ + // "emitDeclarationOnly": true, /* Only output d.ts files and not JavaScript files. */ + // "sourceMap": true, /* Create source map files for emitted JavaScript files. */ + // "outFile": "./script", /* Specify a file that bundles all outputs into one JavaScript file. If 'declaration' is true, also designates a file that bundles all .d.ts output. */ + "outDir": "./script", /* Specify an output folder for all emitted files. */ + "removeComments": true, /* Disable emitting comments. */ + // "noEmit": true, /* Disable emitting files from a compilation. */ + "importHelpers": false, /* Allow importing helper functions from tslib once per project, instead of including them per-file. */ + "importsNotUsedAsValues": "remove", /* Specify emit/checking behavior for imports that are only used for types. */ + // "downlevelIteration": true, /* Emit more compliant, but verbose and less performant JavaScript for iteration. */ + // "sourceRoot": "", /* Specify the root path for debuggers to find the reference source code. */ + // "mapRoot": "", /* Specify the location where debugger should locate map files instead of generated locations. */ + "inlineSourceMap": true, /* Include sourcemap files inside the emitted JavaScript. */ + "inlineSources": true, /* Include source code in the sourcemaps inside the emitted JavaScript. */ + // "emitBOM": true, /* Emit a UTF-8 Byte Order Mark (BOM) in the beginning of output files. */ + // "newLine": "crlf", /* Set the newline character for emitting files. */ + // "stripInternal": true, /* Disable emitting declarations that have '@internal' in their JSDoc comments. */ + // "noEmitHelpers": true, /* Disable generating custom helper functions like '__extends' in compiled output. */ + // "noEmitOnError": true, /* Disable emitting files if any type checking errors are reported. */ + // "preserveConstEnums": true, /* Disable erasing 'const enum' declarations in generated code. */ + "declarationDir": "./script", /* Specify the output directory for generated declaration files. */ + // "preserveValueImports": true, /* Preserve unused imported values in the JavaScript output that would otherwise be removed. */ + + /* Interop Constraints */ + // "isolatedModules": true, /* Ensure that each file can be safely transpiled without relying on other imports. */ + "allowSyntheticDefaultImports": true, /* Allow 'import x from y' when a module doesn't have a default export. */ + "esModuleInterop": true, /* Emit additional JavaScript to ease support for importing CommonJS modules. This enables 'allowSyntheticDefaultImports' for type compatibility. */ + // "preserveSymlinks": true, /* Disable resolving symlinks to their realpath. This correlates to the same flag in node. */ + "forceConsistentCasingInFileNames": true, /* Ensure that casing is correct in imports. */ + + /* Type Checking */ + "strict": true, /* Enable all strict type-checking options. */ + "noImplicitAny": true, /* Enable error reporting for expressions and declarations with an implied 'any' type. */ + "strictNullChecks": true, /* When type checking, take into account 'null' and 'undefined'. */ + "strictFunctionTypes": true, /* When assigning functions, check to ensure parameters and the return values are subtype-compatible. */ + "strictBindCallApply": true, /* Check that the arguments for 'bind', 'call', and 'apply' methods match the original function. */ + "strictPropertyInitialization": true, /* Check for class properties that are declared but not set in the constructor. */ + "noImplicitThis": true, /* Enable error reporting when 'this' is given the type 'any'. */ + // "useUnknownInCatchVariables": true, /* Default catch clause variables as 'unknown' instead of 'any'. */ + "alwaysStrict": true, /* Ensure 'use strict' is always emitted. */ + "noUnusedLocals": true, /* Enable error reporting when local variables aren't read. */ + "noUnusedParameters": true, /* Raise an error when a function parameter isn't read. */ + // "exactOptionalPropertyTypes": true, /* Interpret optional property types as written, rather than adding 'undefined'. */ + // "noImplicitReturns": true, /* Enable error reporting for codepaths that do not explicitly return in a function. */ + // "noFallthroughCasesInSwitch": true, /* Enable error reporting for fallthrough cases in switch statements. */ + // "noUncheckedIndexedAccess": true, /* Add 'undefined' to a type when accessed using an index. */ + // "noImplicitOverride": true, /* Ensure overriding members in derived classes are marked with an override modifier. */ + // "noPropertyAccessFromIndexSignature": true, /* Enforces using indexed accessors for keys declared using an indexed type. */ + "allowUnusedLabels": false, /* Disable error reporting for unused labels. */ + "allowUnreachableCode": false, /* Disable error reporting for unreachable code. */ + + /* Completeness */ + // "skipDefaultLibCheck": true, /* Skip type checking .d.ts files that are included with TypeScript. */ + "skipLibCheck": true /* Skip type checking all .d.ts files. */ + } +}