├── .breakpoints
├── .github
└── workflows
│ └── npm-publish.yml
├── .replit
├── README.md
├── app.json
├── examples
├── aero-troll
│ ├── index.html
│ └── index.js
├── express-server
│ ├── index.html
│ └── index.js
├── http-server
│ ├── index.html
│ └── index.js
└── middleware-server
│ ├── index.html
│ └── index.js
├── lib
├── client
│ ├── client.js
│ ├── element.js
│ ├── index.js
│ ├── location.js
│ └── xml.js
├── decompress.js
├── encoding.js
├── rewrites
│ ├── base.js
│ ├── cookie.js
│ ├── css.js
│ ├── header.js
│ ├── html.js
│ └── javascript.js
└── server
│ ├── compile.js
│ ├── gateway.js
│ ├── handleRequest.js
│ ├── headers.js
│ ├── index.js
│ ├── request.js
│ ├── utility.js
│ └── websocket.js
├── package-lock.json
└── package.json
/.breakpoints:
--------------------------------------------------------------------------------
1 | {
2 | "files": {
3 | "lib/client/element.js": [
4 | {
5 | "id": "528dfe71-d350-4b21-96cb-8309f7d45896",
6 | "line": 188,
7 | "version": 1,
8 | "index": 7934
9 | }
10 | ],
11 | "lib/client/xml.js": [
12 | {
13 | "id": "50ac4516-a4cd-4977-bc66-32bdb2d88228",
14 | "line": 93,
15 | "version": 1,
16 | "index": 2590
17 | }
18 | ],
19 | "lib/rewrites/base.js": [
20 | {
21 | "id": "8edd9089-a8e0-403c-bce3-e8d7866ebdc2",
22 | "line": 79,
23 | "version": 2,
24 | "index": 2585
25 | },
26 | {
27 | "id": "9266e5f1-752c-4a35-889a-dc389fd29be1",
28 | "line": 79,
29 | "version": 2,
30 | "index": 2585
31 | }
32 | ],
33 | "lib/server/handleRequest.js": [
34 | {
35 | "id": "7ec93281-3fc2-47d1-a02b-5635fece6d5d",
36 | "line": 176,
37 | "version": 129,
38 | "index": 7162
39 | }
40 | ],
41 | "lib/server/websocket.js": [
42 | {
43 | "id": "7d6a30b1-36ea-4fa7-a50e-41152a3f5065",
44 | "line": 94,
45 | "version": 1,
46 | "index": 3736
47 | }
48 | ]
49 | }
50 | }
--------------------------------------------------------------------------------
/.github/workflows/npm-publish.yml:
--------------------------------------------------------------------------------
1 | # This workflow will run tests using node and then publish a package to GitHub Packages when a release is created
2 | # For more information see: https://help.github.com/actions/language-and-framework-guides/publishing-nodejs-packages
3 |
4 | name: Node.js Package
5 |
6 | on:
7 | release:
8 | types: [created]
9 |
10 | jobs:
11 | build:
12 | runs-on: ubuntu-latest
13 | steps:
14 | - uses: actions/checkout@v2
15 | - uses: actions/setup-node@v2
16 | with:
17 | node-version: 14
18 | - run: npm ci
19 | - run: npm test
20 |
21 | publish-npm:
22 | needs: build
23 | runs-on: ubuntu-latest
24 | steps:
25 | - uses: actions/checkout@v2
26 | - uses: actions/setup-node@v2
27 | with:
28 | node-version: 14
29 | registry-url: https://registry.npmjs.org/
30 | - run: npm ci
31 | - run: npm publish
32 | env:
33 | NODE_AUTH_TOKEN: ${{secrets.npm_token}}
34 |
35 | publish-gpr:
36 | needs: build
37 | runs-on: ubuntu-latest
38 | permissions:
39 | contents: read
40 | packages: write
41 | steps:
42 | - uses: actions/checkout@v2
43 | - uses: actions/setup-node@v2
44 | with:
45 | node-version: 14
46 | registry-url: https://npm.pkg.github.com/
47 | - run: npm ci
48 | - run: npm publish
49 | env:
50 | NODE_AUTH_TOKEN: ${{secrets.GITHUB_TOKEN}}
51 |
--------------------------------------------------------------------------------
/.replit:
--------------------------------------------------------------------------------
1 | run = "node ./examples/middleware-server"
2 | language = "nodejs"
--------------------------------------------------------------------------------
/README.md:
--------------------------------------------------------------------------------
1 | # This Proxy has been Archived.
2 |
3 | Please visit the new and better proxy, [Rhodium](https://github.com/LudicrousDevelopment/Rhodium)
4 |
5 | # Palladium
6 | Secondary Web Proxy to the Likes of Womginx and Corrosion.
7 |
8 | Made by EnderKingJ
9 |
10 | ## Hosting Services
11 | 
12 | 
13 | 
14 |
15 | ## Speed (Discord)
16 | ### Palladium is the fastest proxy, severely beating Corrosion by 3x, Alloy - No Discord Support, Womginx - 1.3x
17 |
18 | ## Done
19 | - hCaptcha Support
20 | - Discord Support
21 | - Reddit Support
22 | - Websocket Support
23 | - Cookie Rewrites
24 |
25 | ## To-Do
26 | - Better HTML Rewriter
27 | - Better JS Rewriter
28 | - Better Cookie Support
29 | - LocalStorage Proxying
30 | - More Native Browser Functions
31 | - Better Headers Code
32 | - Single File Version
33 | - Youtube UI Fix
34 |
35 | ## Supported Sites
36 | ### Github
37 | Supported + Login (Some Parts of Dashboard Unsupported
38 | ### Discord
39 | Supported
40 | ### Reddit
41 | Mostly Supported
42 | ### Youtube
43 | Somewhat Supported, Errors: Reddit bug, can play video but navigating to other pages requires opening in new tab
44 |
45 | ## Setup
46 | ### Importing and Initiating
47 | ```js
48 | const Palladium = require("palladiumub"); //Outdated package, change to lib/server folder path
49 |
50 | const proxy = new Palladium(); //default config
51 |
52 | const http = require("http");
53 | ```
54 | ### Config
55 | ```js
56 | {
57 | "prefix": "/service/",
58 | "ssl": true,
59 | "encode": "xor",
60 | "title": "Service",
61 | "requestMiddleware": [
62 | Palladium.blackList(["discord.com", "accounts.google.com"], "Page is Blocked by Host")
63 | ],
64 | Corrosion: [false, {}]
65 | server: your-http-server
66 | }
67 | ```
68 | ### Server
69 | ```js
70 | var server = http.createServer();
71 |
72 | proxy.init();
73 |
74 | server.on("request", (req, res) => {
75 | if (req.url.startsWith(proxy.prefix)) return proxy.request(req, res)
76 | res.end("
")
77 | })
78 | ```
79 | ### End Result
80 | `index.js`
81 | ```js
82 | const Palladium = require("palladiumub");
83 |
84 | const http = require("http");
85 |
86 | var server = http.createServer();
87 |
88 | const proxy = new Palladium({
89 | "prefix": "/service/",
90 | "encode": "xor",
91 | "title": "Service",
92 | "requestMiddleware": [
93 | Palladium.blackList(["any-link.com", "accounts.google.com"], "Page is Blocked by Host")
94 | ],
95 | server: server,
96 | });
97 |
98 | proxy.init();
99 |
100 | server.on("request", (req, res) => {
101 | if (req.url.startsWith(proxy.prefix)) return proxy.request(req, res)
102 | res.writeHead(200, {'content-type': 'text/html'}).end("")
103 | })
104 |
105 | server.listen(8080)
106 | ```
107 |
--------------------------------------------------------------------------------
/app.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "Palladium",
3 | "description": "A Simple Web Proxy Made by EnderKingJ",
4 | "repository": "https://github.com/LudicrousDevelopment/Palladium",
5 | "logo": "https://raw.githubusercontent.com/FogNetwork/Smoke/22a012c8292b1750f078af0bb5890c604edfcedd/public/assets/logo.svg",
6 | "keywords": ["palladium", "web-proxy", "web proxy", "proxy", "web-unblocker", "internet", "palladiumproxy"]
7 | }
--------------------------------------------------------------------------------
/examples/aero-troll/index.js:
--------------------------------------------------------------------------------
1 | const http = require("http");
2 | const https = require("https");
3 | const fs = require("fs");
4 | const config = {
5 | "prefix": "/service/"
6 | }
7 |
8 | const Palladium = require("../../lib/server");
9 | const Server = http.Server()
10 |
11 | const proxy = new Palladium({
12 | prefix: config.prefix,
13 | encode: "xor",
14 | ssl: true,
15 | debug: false,
16 | server: Server,
17 | })
18 |
19 | proxy.init()
20 |
21 | Server.on('request', (req, res) => {if(req.url.startsWith(proxy.prefix)){return proxy.request(req, res)}else{return res.end(fs.readFileSync(__dirname+'/index.html'))}}).listen((process.env['PORT'] || config.port || 8080), () => {console.log((proxy.ssl ? 'https' : 'http')+'://localhost:'+(process.env['PORT'] || config.port || 8080))});
--------------------------------------------------------------------------------
/examples/express-server/index.html:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 | Palladium
7 |
8 |
9 |
134 |
135 |
136 |
162 |
163 |
--------------------------------------------------------------------------------
/examples/express-server/index.js:
--------------------------------------------------------------------------------
1 | const express = require('express')
2 | const app = express()
3 |
4 | const Server = require('http').Server(app)
5 |
6 | const Smoke = new (require('../../lib/server'))({
7 | prefix: '/service/',
8 | encode: 'plain',
9 | ssl: true,
10 | })
11 |
12 | app.use(express.static(__dirname+'/', {extensions: ['html']}))
13 |
14 | app.use(Smoke.express(Smoke, Server))
15 |
16 | Server.listen(8080)
--------------------------------------------------------------------------------
/examples/http-server/index.html:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 | Palladium
7 |
8 |
9 |
134 |
135 |
136 |
162 |
163 |
--------------------------------------------------------------------------------
/examples/http-server/index.js:
--------------------------------------------------------------------------------
1 | const http = require("http");
2 | const https = require("https");
3 | const fs = require("fs");
4 | const config = {
5 | "prefix": "/service/"
6 | }
7 |
8 | const Palladium = require("../../lib/server");
9 | const Server = http.Server()
10 |
11 | const proxy = new Palladium({
12 | prefix: config.prefix,
13 | encode: "xor",
14 | ssl: true,
15 | debug: false,
16 | server: Server,
17 | })
18 |
19 | proxy.init()
20 |
21 | Server.on('request', (req, res) => {if(req.url.startsWith(proxy.prefix)){return proxy.request(req, res)}else{return res.end(fs.readFileSync(__dirname+'/index.html'))}}).listen((process.env['PORT'] || config.port || 8080), () => {console.log((proxy.ssl ? 'https' : 'http')+'://localhost:'+(process.env['PORT'] || config.port || 8080))});
--------------------------------------------------------------------------------
/examples/middleware-server/index.html:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 | Palladium
7 |
8 |
9 |
134 |
135 |
136 |
162 |
163 |
--------------------------------------------------------------------------------
/examples/middleware-server/index.js:
--------------------------------------------------------------------------------
1 | const http = require("http");
2 | const https = require("https");
3 | const fs = require("fs");
4 | const config = {
5 | "prefix": "/service/"
6 | }
7 |
8 | const Palladium = require("../../lib/server");
9 | const Server = http.Server()
10 |
11 | const proxy = new Palladium({
12 | prefix: config.prefix,
13 | encode: "xor",
14 | ssl: true,
15 | requestMiddleware: [
16 | Palladium.blackList(['example.org', 'among.us'], 'Site is Blocked by Host')
17 | ],
18 | debug: false,
19 | Corrosion: [false, {}],
20 | server: Server,
21 | })
22 |
23 | /*proxy.onrequest((ctx) => {
24 | console.log('request', ctx.url)
25 | })
26 |
27 | proxy.onrequest((ctx) => {
28 | console.log('response', ctx.httpResponse.headers['content-type'] || '')
29 | })*/
30 |
31 | proxy.init()
32 |
33 | Server.on('request', (req, res) => {if(req.url.startsWith(proxy.prefix)){return proxy.request(req, res)}else{return res.end(fs.readFileSync(__dirname+'/index.html'))}})/*.on('upgrade', (req, socket, head) => proxy.upgrade(req, socket, head))*/.listen((process.env['PORT'] || config.port || 8080), () => {console.log((proxy.ssl ? 'https' : 'http')+'://localhost:'+(process.env['PORT'] || config.port || 8080))});
--------------------------------------------------------------------------------
/lib/client/client.js:
--------------------------------------------------------------------------------
1 | var config = JSON.parse(document.currentScript.getAttribute('data-config'))
2 |
3 | var module = {}
4 |
5 | if (config.title) {
6 | document.title = config.title
7 | setInterval(() => {if (document.title!==config.title) document.title = config.title}, 100)
8 | }
9 |
10 |
--------------------------------------------------------------------------------
/lib/client/element.js:
--------------------------------------------------------------------------------
1 | var proxify = {}
2 |
3 | proxify.elementHTML = element_array => {
4 | element_array.forEach(element => {
5 | Object.defineProperty(element.prototype, 'innerHTML', {
6 | set(value) {
7 | const elem = new DOMParser().parseFromString(Object.getOwnPropertyDescriptor(window.Element.prototype, "outerHTML").get.call(this), 'text/html').body.querySelectorAll('*')[0];
8 | Object.getOwnPropertyDescriptor(window.Element.prototype, "innerHTML").set.call(elem, value);
9 | elem.querySelectorAll("script[src], iframe[src], embed[src], audio[src], img[src], input[src], source[src], track[src], video[src]").forEach(node => node.setAttribute('src', node.getAttribute('src')));
10 | elem.querySelectorAll("object[data]").forEach(node => node.setAttribute('data', node.getAttribute('data')));
11 | elem.querySelectorAll("a[href], link[href], area[href").forEach(node => node.setAttribute('href', node.getAttribute('href')));
12 | return Object.getOwnPropertyDescriptor(window.Element.prototype, "innerHTML").set.call(this, elem.innerHTML);
13 | },
14 | get() {
15 | return Object.getOwnPropertyDescriptor(window.Element.prototype, "innerHTML").get.call(this);
16 | }
17 | });
18 | Object.defineProperty(element.prototype, 'outerHTML', {
19 | set(value) {
20 | const elem = new DOMParser().parseFromString(Object.getOwnPropertyDescriptor(window.Element.prototype, "outerHTML").get.call(this), 'text/html').body;
21 | Object.getOwnPropertyDescriptor(window.Element.prototype, "outerHTML").set.call(elem.querySelectorAll('*')[0], value);
22 | elem.querySelectorAll("script[src], iframe[src], embed[src], audio[src], img[src], input[src], source[src], track[src], video[src]").forEach(node => node.setAttribute('src', node.getAttribute('src')));
23 | elem.querySelectorAll("object[data]").forEach(node => node.setAttribute('data', node.getAttribute('data')));
24 | elem.querySelectorAll("a[href], link[href], area[href").forEach(node => node.setAttribute('href', node.getAttribute('href')));
25 | return Object.getOwnPropertyDescriptor(window.Element.prototype, "outerHTML").set.call(this, elem.innerHTML);
26 | },
27 | get() {
28 | return Object.getOwnPropertyDescriptor(window.Element.prototype, "outerHTML").get.call(this);
29 | }
30 | });
31 | });
32 | };
33 |
34 | proxify.elementAttribute = (element_array, attribute_array) => {
35 | element_array.forEach(element => {
36 |
37 | if (element == window.HTMLScriptElement) {
38 | Object.defineProperty(element.prototype, 'integrity', {
39 | set(value) {
40 | return this.removeAttribute('integrity')
41 | },
42 | get() {
43 | return this.getAttribute('integrity');
44 | }
45 | });
46 | Object.defineProperty(element.prototype, 'nonce', {
47 | set(value) {
48 | return this.removeAttribute('nonce')
49 | },
50 | get() {
51 | return this.getAttribute('nonce');
52 | }
53 | });
54 | }
55 |
56 | element.prototype.setAttribute = new Proxy(element.prototype.setAttribute, {
57 | apply(target, thisArg, [ element_attribute, value ]) {
58 | attribute_array.forEach(array_attribute => {
59 |
60 | if (array_attribute == 'srcset' && element_attribute.toLowerCase() == array_attribute) {
61 | var arr = [];
62 |
63 | value.split(',').forEach(url => {
64 | url = url.trimStart().split(' ');
65 | url[0] = new Base(ctx).url(url[0] || '');
66 | arr.push(url.join(' '));
67 | });
68 |
69 | return Reflect.apply(target, thisArg, [ element_attribute, arr.join(', ') ]);
70 | };
71 |
72 | if (array_attribute == 'http-equiv' && element_attribute.toLowerCase() == array_attribute) {
73 | value = 'No-U-Content-Security-Policy'
74 | return Reflect.apply(target, thisArg, [ element_attribute, value ])
75 | }
76 |
77 | if (element_attribute.toLowerCase() == array_attribute) value = new Base(ctx).url(value || '');
78 | });
79 | return Reflect.apply(target, thisArg, [ element_attribute, value ]);
80 | }
81 | });
82 |
83 | attribute_array.forEach(attribute => {
84 |
85 | Object.defineProperty(element.prototype, attribute, {
86 | set(value) {
87 | return this.setAttribute(attribute, value);
88 | },
89 | get() {
90 | return this.getAttribute(attribute);
91 | }
92 | });
93 |
94 | });
95 |
96 | });
97 | };
98 |
99 | proxify.elementHTML([ window.HTMLDivElement ]);
100 |
101 | proxify.elementAttribute([ window.HTMLAnchorElement, window.HTMLAreaElement, window.HTMLLinkElement ], [ 'href' ]);
102 |
103 | proxify.elementAttribute([ window.HTMLScriptElement, window.HTMLIFrameElement, window.HTMLEmbedElement, window.HTMLAudioElement, window.HTMLInputElement, window.HTMLTrackElement ], [ 'src' ]);
104 |
105 | proxify.elementAttribute([ window.HTMLImageElement, HTMLSourceElement ], [ 'src', 'srcset' ]);
106 |
107 | proxify.elementAttribute([ window.HTMLObjectElement ], [ 'data' ]);
108 |
109 | proxify.elementAttribute([ window.HTMLFormElement ], [ 'action' ]);
110 |
111 | //if (new URL(config.url).hostname===ctx.encoding.decode('hvtrs8%2F-dksaopd%2Ccmm').replace('https://', '')) myScript = {src: '//'}
112 |
113 | setInterval(() => {
114 | document.querySelectorAll('a').forEach(node => {
115 | if (!node.getAttribute('data-palladium')) {
116 | if (node.href) node.setAttribute('href', new Base(ctx).url(node.href))
117 | node.setAttribute('data-palladium', true)
118 | }
119 | })
120 | }, 100)
121 |
122 | var inserthtmlproto = Element.prototype.insertAdjacentHTML
123 |
124 | Element.prototype.insertAdjacentHTML = function(place, text) {
125 | var regex = /(srcset|src|href|action|integrity|nonce|http-equiv)\s*=\s*['`"](.*?)['"`]/gi
126 | text = text.toString()
127 | text = text.replace(regex, (match, p1, p2) => {
128 | if (p1=='integrity' || p1=='nonce' || p1=='http-equiv') return ''
129 | if (p1=='srcset') {
130 | const src_arr = [];
131 |
132 | p2.split(',').forEach(url => {
133 | url = url.trimStart().split(' ');
134 | url[0] = new Base(ctx).url(url[0]);
135 | src_arr.push(url.join(' '));
136 | });
137 |
138 | p2 = src_arr.join(', ')
139 | return `${p1}="${p2}"`
140 | }
141 | return `${p1}="${new Base(ctx).url(p2)}"`
142 | })
143 | return inserthtmlproto.apply(this, arguments)
144 | }
145 |
146 | window.Document.prototype.writeln = new Proxy(window.Document.prototype.writeln, {
147 | apply: (target, that , args) => {
148 | if (args.length) args = [ ctx.html.process(args.join(''), ctx.meta) ];
149 | return Reflect.apply(target, that, args);
150 | },
151 | });
152 |
153 | var docWriteHTML = document.write
154 |
155 | window.Document.prototype.write = function() {
156 | if (arguments[0]) {
157 | var regex = /(srcset|src|href|action|integrity|nonce|http-equiv)\s*=\s*['`"](.*?)['"`]/gi
158 | arguments[0] = arguments[0].toString()
159 | arguments[0] = arguments[0].replace(regex, (match, p1, p2) => {
160 | if (p1=='integrity' || p1=='nonce' || p1=='http-equiv') return ''
161 | if (p1=='srcset') {
162 | const src_arr = [];
163 |
164 | p2.split(',').forEach(url => {
165 | url = url.trimStart().split(' ');
166 | url[0] = new Base(ctx).url(url[0]);
167 | src_arr.push(url.join(' '));
168 | });
169 |
170 | p2 = src_arr.join(', ')
171 | return `${p1}="${p2}"`
172 | }
173 | return `${p1}="${new Base(ctx).url(p2)}"`
174 | })
175 | }
176 | return docWriteHTML.apply(this, arguments)
177 | }
178 |
179 | window.Audio = new Proxy(window.Audio, {
180 | construct: (target, args) => {
181 | if (args[0]) args[0] = new Base(ctx).url(args[0])
182 | return Reflect.construct(target, args);
183 | },
184 | });
185 |
186 | //Function.prototype.apply.call = function() {return Function.prototype.call.apply(this, arguments)}
187 |
188 | document.currentScript.remove()
--------------------------------------------------------------------------------
/lib/client/index.js:
--------------------------------------------------------------------------------
1 | var config = JSON.parse(document.currentScript.getAttribute('data-config'))
2 |
3 | var module = {}
4 |
5 | if (config.title) {
6 | document.title = config.title
7 | setInterval(() => {if (document.title!==config.title) document.title = config.title}, 100)
8 | }
9 |
10 |
11 | var encoding = (ctx) => {
12 | switch(ctx.encode) {
13 | case "plain":
14 | return {
15 | encode(str) {
16 | return str;
17 | },
18 | decode(str) {
19 | return str;
20 | }
21 | }
22 | break;
23 | case "xor":
24 | return {
25 | encode(str) {
26 | str = str.replace('https://', 'https:/').replace('https:/', 'https://')
27 | return (encodeURIComponent(str.split('').map((char,ind)=>ind%2?String.fromCharCode(char.charCodeAt()^2):char).join('')));
28 | },
29 | decode(str) {
30 | if (!str.startsWith('hvtrs')) return str
31 | return (decodeURIComponent(str).split('').map((char, ind) => ind % 2 ? String.fromCharCode(char.charCodeAt() ^ 2) : char).join(''))
32 | }
33 | }
34 | break;
35 | case "base64":
36 | if (typeof window == 'undefined') return {
37 | encode(str) {
38 | return new Buffer.from(str).toString("base64");
39 | },
40 | decode(str) {
41 | if (new Buffer.from(str).toString("base64").startsWith('http')) {
42 | return str
43 | }
44 | return new Buffer.from(str, "base64").toString("utf-8");
45 | }
46 | }; else return {
47 | encode(str) {
48 | return btoa(str)
49 | },
50 | decode(str) {
51 | if (btoa(str).startsWith('http')) {
52 | return str
53 | }
54 | return atob(str.split('/')[0])+str.split('/')[1]
55 | }
56 | };
57 | break;
58 | default:
59 | return {
60 | encode(str) {
61 | return str;
62 | },
63 | decode(str) {
64 | return (str.split('https:/').startsWith('/') ? str : str.replace('https:/', 'https://'));
65 | }
66 | }
67 | }
68 | }
69 |
70 | if (typeof module !== undefined) module.exports = encoding;
71 | const oFetch = window.fetch,
72 | XHR = window.XMLHttpRequest,
73 | oXHR = window.XMLHttpRequest.prototype.open,
74 | oPMessage = window.postMessage,
75 | oSBeacon = window.Navigator.prototype.sendBeacon;
76 |
77 | var ctx = {
78 | prefix: config.prefix,
79 | url: config.url,
80 | config: {
81 | encode: config.encode,
82 | },
83 | encode: config.encode,
84 | getRequestUrl: (req) => {return this.encoding.decode(req.url.split(this.prefix)[1].replace(/\/$/g, ''))},
85 | }
86 |
87 | ctx.encoding = encoding(ctx)
88 |
89 | window.fetch = function(url, opts) {
90 | if (typeof url == 'object') {
91 | opts = url
92 | url = url.url
93 | return oFetch.apply(this, arguments)
94 | }
95 | if (url) url = new Base(ctx).url(url)
96 | return oFetch.apply(this, arguments)
97 | }
98 |
99 | window.XMLHttpRequest.prototype.open = function(method, url, async, user, password) {
100 | if (url) url = new Base(ctx).url(url)
101 | return oXHR.apply(this, arguments)
102 | }
103 |
104 | window.postMessage = function(msg, origin, transfer) {
105 | if (origin) origin = location.origin;
106 | return oPMessage.apply(this, arguments);
107 | };
108 | window.Navigator.prototype.sendBeacon = function(url, data) {
109 | if (url) url = new Base(ctx).url(url);
110 | return oSBeacon.apply(this, arguments);
111 | };
112 |
113 | window.WebSocket = new Proxy(window.WebSocket, {
114 | construct(target, args) {
115 | if (args[0].includes('?')) var todo = '&'; else var todo = '?'
116 | args[0] = (location.protocol=='https:' ? 'wss:' : 'ws:') + '//' + location.origin.split('/').splice(2).join('/') + config.prefix + '?ws='+args[0].replace(location.origin.split('/').splice(2).join('/'), pLocation.origin.split('/').splice(2).join('/'))+ todo+'origin=' + new URL(config.url).origin;
117 | return Reflect.construct(target, args);
118 | }
119 | });
120 |
121 | /*var lStorageOrigin = window.localStorage
122 |
123 | window._localStorage = new Proxy({}, {
124 | set(value, prop) {
125 | if (prop=='getItem') {
126 | return ''
127 | }
128 | if (prop=='setItem') {
129 | return ''
130 | }
131 | return localStorage[new URL(config.url).hostname+prop] = value
132 | },
133 | get(value, prop) {
134 | if (prop=='getItem') {
135 | return function() {
136 | var args = arguments
137 | return localStorage[new URL(config.url).hostname+args[0]]
138 | }
139 | }
140 | if (prop=='setItem') {
141 | return function() {
142 | var args = arguments
143 | return localStorage[new URL(config.url).hostname+args[0]] = args[1]
144 | }
145 | }
146 | return localStorage[new URL(config.url).hostname+prop]
147 | }
148 | })
149 |
150 | /*
151 |
152 | Object.defineProperty(window, 'localStorage', {
153 | get() {
154 | return lStorageOrigin
155 | },
156 | set(value) {
157 | lStorageOrigin = value
158 | }
159 | })
160 |
161 | Object.keys(window.localStorage).forEach(key => {
162 | if (key.startsWith(new URL(config.url).hostname)) {
163 | localStorage[key] = localStorage[key]
164 | } else {
165 | var nkey = localStorage[key]
166 | //localStorage.removeItem(key)
167 | window.addEventListener('beforeunload', () => {
168 | localStorage[key] = nkey
169 | })
170 | }
171 | })
172 | /*
173 | Object.defineProperty(window.localStorage, 'setItem', {
174 |
175 | })
176 |
177 | window.RTCPeerConnection = new Proxy(RTCPeerConnection, {
178 | construct(target, args) {
179 | if (args[1].urls.startsWith('turns:')) {
180 | args[1].username += `|${args[1].urls}`;
181 | args[1].urls = `turns:${location.host}`;
182 | return Reflect.apply(...arguments);
183 | } else if (args[1].urls.startsWith('stuns'))
184 | console.warn("STUN connections aren't supported!");
185 | }
186 | });*/
187 |
188 | window.Worker = new Proxy(window.Worker, {
189 | construct: (target, args) => {
190 | if (args[0]) {
191 | if (args[0].trim().startsWith(`blob:${pLocation.origin}`)) {
192 | const xhr = new XHR
193 | xhr.open('GET', args[0], false);
194 | xhr.send();
195 | const script = new JSRewriter(ctx)(xhr.responseText, ctx.location.origin + args[0].trim().slice(`blob:${ctx.window.location.origin}`.length), ctx);
196 | const blob = new Blob([ script ], { type: 'application/javascript' });
197 | args[0] = URL.createObjectURL(blob);
198 | } else {
199 | args[0] = new Base(ctx).url(args[0]);
200 | };
201 | };
202 | return Reflect.construct(target, args);
203 | },
204 | });
205 | function blackList(list, reason = 'Website Blocked') {
206 | return (ctx) => {
207 | try {if(list.indexOf(new URL(ctx.url).hostname)>-1) {
208 | ctx.response.end(reason)
209 | }} catch {}
210 | }
211 | }
212 |
213 | function allow(list, config) {
214 | return function(ctx) {
215 | try {if(list.indexOf(new URL(ctx.url).hostname)==-1) {
216 | if (config[0]=='redirect') {
217 | ctx.response.writeHead(301, {location: ctx.prefix+'gateway?url='+config[1]}).end('')
218 | } else {
219 | ctx.response.end(config[1])
220 | }
221 | }} catch {}
222 | }
223 | }
224 |
225 | function force(ctx) {
226 | return ctx.url.replace(/http:\/\//g, 'https://');
227 | }
228 |
229 | if (!typeof module !== undefined) module.exports.blackList = blackList;
230 | if (typeof module !== undefined) module.exports.force = force;
231 | module.exports.allow = allow;
232 | class JSRewriter {
233 | constructor(data, ctx) {
234 | return function JS(data, ctx) {
235 | return data.toString().replace(/(,| |=|\()document.location(,| |=|\)|\.)/gi, str => { return str.replace('.location', `.pLocation`); }).replace(/(,| |=|\()window.location(,| |=|\)|\.)/gi, str => { return str.replace('.location', `.pLocation`); })/*.replace(/(,| |=|\()location(,| |=|\)|\.)/gi, str => { return str.replace('location', `pLocation`); })*/.replace('myScript=scripts[index]||', 'myScript=')//.replace(/(localStorage|sessionStorage)/g, '_$1')//.replace(/location\s*=\s*/gi, 'PLocation = ')//.replace(/location\.([a-zA-Z0-9]*)/gi, 'pLocation.$1')//.replace(/\.href\s*=(["'` ]*)([a-zA-Z0-9]*)(['`" ]*)/gi, (match, p1, p2, p3) => {return '.phref = '+p1+new ctx.rewrite.Base(ctx).url(p2)+p3})
236 | }
237 | }
238 | }
239 |
240 | if (typeof module !== undefined) module.exports = JSRewriter
241 | //Client and Server Side
242 |
243 | class Base {
244 | constructor(ctx) {
245 | this.ctx = ctx
246 | }
247 | url(url, ext) {
248 | if (typeof window == 'undefined') {
249 | function co(num) { return (num % 2)==1;}
250 | var headers = this.ctx.req.rawHeaders || []
251 | var fullHeaders = {}
252 | headers.map((e, ind) => {
253 | if (co(ind+1)) {
254 | fullHeaders[e] = headers[ind+1]
255 | }
256 | })
257 | }
258 | var hostname = ((fullHeaders||{})['Host']||location.hostname)
259 | if (!url) return url
260 | /*
261 | if (typeof url == 'object') {
262 | throw new Error('no')
263 | var object = url
264 | console.log(object)
265 | url = url.url
266 | }*/
267 | url = (url).toString()
268 | if (url.match(/^(javascript:|about:|mailto:|data:|blob:|#)/gi)) return url
269 | url = url.replace(/^\/\//, 'https://')
270 |
271 | try{url = url.replace(location.origin, new URL(ctx.url).origin)}catch{}
272 |
273 | /*if (url.includes('https://')) {
274 | url = url.replace('https://', '')
275 | url = url.split('/')
276 | url[0] = ''
277 | Object.keys(url).forEach((e) => {
278 | if (!e==0||!e==1) url[e]='/'+url[e]
279 | })
280 | url = url.join('')
281 | console.log(url)
282 | }*/
283 | if (!this.ctx.encode==='base64') {
284 | url = this.ctx.encoding.decode(url)
285 | }
286 | if (url.startsWith(this.ctx.prefix)) return url;
287 | if (!url.startsWith('http')) {
288 | try {
289 | var host = new URL(this.ctx.url).hostname
290 | } catch(err) {
291 | try {var host = new URL(this.ctx.encoding.decode(this.ctx)).hostname} catch(e) {}
292 | }
293 | url = 'https://'+ host + (url.startsWith('/') ? '' : '/') + url
294 | }
295 | if(new URL(url).protocol.startsWith('ws')) {
296 | console.log(new URLSearchParams(new URL(url).search))
297 | }
298 | if (url.includes('https://')) url = url.replace('https://', 'https:/')
299 | /*var test = 'https://'+hostname+this.ctx.prefix + this.ctx.encoding.encode(url.replace('../', '').replace('./', '').replace('http://', 'https://'))
300 | test = this.ctx.encoding.decode(test.split(this.ctx.prefix)[1])
301 | if (test.includes(this.ctx.prefix)) {
302 | url = this.ctx.encoding.decode(test.split(this.ctx.prefix)[1])
303 | }*/
304 | var eslash = url.endsWith('/') ? '/' : ''
305 | if (!ext) return /*'https://'+hostname+*/this.ctx.prefix + this.ctx.encoding.encode(url.replace('../', '').replace('./', '').replace('http://', 'https://'))+eslash
306 | return this.ctx.prefix + ext + this.ctx.encoding.encode(url)
307 | }
308 | element(attr, ext) {
309 | if (ext==='_plain/') {
310 | var url = this.url(attr)
311 | } else {
312 | var url = this.url(attr, ext)
313 | }
314 |
315 | return url
316 | }
317 | }
318 |
319 | if (typeof module !== undefined) module.exports = Base;
320 | window.pLocation = new Proxy({}, {
321 | set(obj, prop, value) {
322 |
323 | if (prop == 'assign' || prop == 'reload' || prop == 'replace' || prop == 'toString' || prop == 'hash' || prop == 'search') return;
324 |
325 | return location[prop] = new Base(ctx).url(new URL(config.url).href.replace(new URL(config.url)[prop], value));
326 | },
327 | get(obj, prop) {
328 | // Had to be done in order to fix Discord.
329 | if (new URL(config.url).origin == atob('aHR0cHM6Ly9kaXNjb3JkLmNvbQ==') && new URL(config.url).pathname == '/app') return window.location[prop];
330 |
331 | if (prop == 'assign' || prop == 'reload' || prop == 'replace' || prop == 'toString' || prop == 'hash' || prop == 'search') return {
332 | assign: arg => window.location.assign(new Base(ctx).url(arg)),
333 | replace: arg => window.location.replace(new Base(ctx).url(arg)),
334 | reload: (arg) => window.location.reload(arg ? arg : null),
335 | toString: () => { return new URL(config.url).href },
336 | hash: window.location.hash,
337 | search: window.location.search
338 | }[prop];
339 | else return new URL(config.url)[prop];
340 | }
341 | })
342 |
343 | var oOpen = window.open;
344 | document.pLocation = pLocation
345 |
346 | window.open = function(url, opts) {
347 | if (url) url = new Base(ctx).url(url)
348 | oOpen.apply(this, arguments)
349 | }
350 |
351 | Object.defineProperty(window, "PLocation", {
352 | set: function(newValue){
353 | if (!newValue) return;
354 | pLocation.href = (newValue)
355 | },
356 | get: function(){
357 | return this.location;
358 | }
359 | });
360 |
361 | var pushstates = history.pushState;
362 |
363 | window.history.pushState = new Proxy(history.pushState, {
364 | apply(target, thisArg, args) {
365 | args[2] = new Base(ctx).url(args[2])
366 | return Reflect.apply(target, thisArg, args)
367 | }
368 | });
369 |
370 | window.history.replaceState = new Proxy(history.replaceState, {
371 | apply(target, thisArg, args) {
372 | args[2] = new Base(ctx).url(args[2])
373 | return Reflect.apply(target, thisArg, args)
374 | }
375 | });
376 |
377 | Object.defineProperty(document, 'domain', {
378 | get() {
379 | return new URL(ctx.url).hostname;
380 | },
381 | set(val) {
382 | return val;
383 | }
384 | });
385 |
386 | var oCookie = document.cookie
387 |
388 | Object.defineProperty(document, 'cookie', {
389 | get() {
390 | var cookie = Object.getOwnPropertyDescriptor(window.Document.prototype, 'cookie').get.call(this),
391 | new_cookie = [],
392 | cookie_array = cookie.split('; ');
393 | cookie_array.forEach(cookie => {
394 | const cookie_name = cookie.split('=').splice(0, 1).join(),
395 | cookie_value = cookie.split('=').splice(1).join();
396 | if (new URL(ctx.url).hostname.includes(cookie_name.split('@').splice(1).join())) new_cookie.push(cookie_name.split('@').splice(0, 1).join() + '=' + cookie_value);
397 | });
398 | return new_cookie.join('; ');;
399 | },
400 | set(val) {
401 | Object.getOwnPropertyDescriptor(Document.prototype, 'cookie').set.call(this, val);
402 | }
403 | })
404 |
405 | window.Worker = new Proxy(window.Worker, {
406 | construct(target, args) {
407 | if (args[0]) args[0] = new Base(ctx).url(args[0]);
408 | return Reflect.construct(target, args);
409 | }
410 | });
411 |
412 | if (config.title) {
413 | var oTitle = Object.getOwnPropertyDescriptor(Document.prototype, 'title');
414 | document.title = config.title
415 | Object.defineProperty(Document.prototype, 'title', {
416 | set(value) {
417 | oTitle = config.title
418 | return value
419 | },
420 | get() {
421 | return config.title
422 | }
423 | })
424 | }
425 |
426 | if (location.search && !(new URLSearchParams(location.search).get('palladium-redir'))) {
427 | var p1 = ctx.encoding.decode(location.pathname.split(config.prefix)[1])
428 | console.log(p1+location.search+'&palladium-redir=true')
429 | location.href = config.prefix+ctx.encoding.encode(p1+location.search+'&palladium-redir=true')
430 | }
431 | var proxify = {}
432 |
433 | proxify.elementHTML = element_array => {
434 | element_array.forEach(element => {
435 | Object.defineProperty(element.prototype, 'innerHTML', {
436 | set(value) {
437 | const elem = new DOMParser().parseFromString(Object.getOwnPropertyDescriptor(window.Element.prototype, "outerHTML").get.call(this), 'text/html').body.querySelectorAll('*')[0];
438 | Object.getOwnPropertyDescriptor(window.Element.prototype, "innerHTML").set.call(elem, value);
439 | elem.querySelectorAll("script[src], iframe[src], embed[src], audio[src], img[src], input[src], source[src], track[src], video[src]").forEach(node => node.setAttribute('src', node.getAttribute('src')));
440 | elem.querySelectorAll("object[data]").forEach(node => node.setAttribute('data', node.getAttribute('data')));
441 | elem.querySelectorAll("a[href], link[href], area[href").forEach(node => node.setAttribute('href', node.getAttribute('href')));
442 | return Object.getOwnPropertyDescriptor(window.Element.prototype, "innerHTML").set.call(this, elem.innerHTML);
443 | },
444 | get() {
445 | return Object.getOwnPropertyDescriptor(window.Element.prototype, "innerHTML").get.call(this);
446 | }
447 | });
448 | Object.defineProperty(element.prototype, 'outerHTML', {
449 | set(value) {
450 | const elem = new DOMParser().parseFromString(Object.getOwnPropertyDescriptor(window.Element.prototype, "outerHTML").get.call(this), 'text/html').body;
451 | Object.getOwnPropertyDescriptor(window.Element.prototype, "outerHTML").set.call(elem.querySelectorAll('*')[0], value);
452 | elem.querySelectorAll("script[src], iframe[src], embed[src], audio[src], img[src], input[src], source[src], track[src], video[src]").forEach(node => node.setAttribute('src', node.getAttribute('src')));
453 | elem.querySelectorAll("object[data]").forEach(node => node.setAttribute('data', node.getAttribute('data')));
454 | elem.querySelectorAll("a[href], link[href], area[href").forEach(node => node.setAttribute('href', node.getAttribute('href')));
455 | return Object.getOwnPropertyDescriptor(window.Element.prototype, "outerHTML").set.call(this, elem.innerHTML);
456 | },
457 | get() {
458 | return Object.getOwnPropertyDescriptor(window.Element.prototype, "outerHTML").get.call(this);
459 | }
460 | });
461 | });
462 | };
463 |
464 | proxify.elementAttribute = (element_array, attribute_array) => {
465 | element_array.forEach(element => {
466 |
467 | if (element == window.HTMLScriptElement) {
468 | Object.defineProperty(element.prototype, 'integrity', {
469 | set(value) {
470 | return this.removeAttribute('integrity')
471 | },
472 | get() {
473 | return this.getAttribute('integrity');
474 | }
475 | });
476 | Object.defineProperty(element.prototype, 'nonce', {
477 | set(value) {
478 | return this.removeAttribute('nonce')
479 | },
480 | get() {
481 | return this.getAttribute('nonce');
482 | }
483 | });
484 | }
485 |
486 | element.prototype.setAttribute = new Proxy(element.prototype.setAttribute, {
487 | apply(target, thisArg, [ element_attribute, value ]) {
488 | attribute_array.forEach(array_attribute => {
489 |
490 | if (array_attribute == 'srcset' && element_attribute.toLowerCase() == array_attribute) {
491 | var arr = [];
492 |
493 | value.split(',').forEach(url => {
494 | url = url.trimStart().split(' ');
495 | url[0] = new Base(ctx).url(url[0] || '');
496 | arr.push(url.join(' '));
497 | });
498 |
499 | return Reflect.apply(target, thisArg, [ element_attribute, arr.join(', ') ]);
500 | };
501 |
502 | if (array_attribute == 'http-equiv' && element_attribute.toLowerCase() == array_attribute) {
503 | value = 'No-U-Content-Security-Policy'
504 | return Reflect.apply(target, thisArg, [ element_attribute, value ])
505 | }
506 |
507 | if (element_attribute.toLowerCase() == array_attribute) value = new Base(ctx).url(value || '');
508 | });
509 | return Reflect.apply(target, thisArg, [ element_attribute, value ]);
510 | }
511 | });
512 |
513 | attribute_array.forEach(attribute => {
514 |
515 | Object.defineProperty(element.prototype, attribute, {
516 | set(value) {
517 | return this.setAttribute(attribute, value);
518 | },
519 | get() {
520 | return this.getAttribute(attribute);
521 | }
522 | });
523 |
524 | });
525 |
526 | });
527 | };
528 |
529 | proxify.elementHTML([ window.HTMLDivElement ]);
530 |
531 | proxify.elementAttribute([ window.HTMLAnchorElement, window.HTMLAreaElement, window.HTMLLinkElement ], [ 'href' ]);
532 |
533 | proxify.elementAttribute([ window.HTMLScriptElement, window.HTMLIFrameElement, window.HTMLEmbedElement, window.HTMLAudioElement, window.HTMLInputElement, window.HTMLTrackElement ], [ 'src' ]);
534 |
535 | proxify.elementAttribute([ window.HTMLImageElement, HTMLSourceElement ], [ 'src', 'srcset' ]);
536 |
537 | proxify.elementAttribute([ window.HTMLObjectElement ], [ 'data' ]);
538 |
539 | proxify.elementAttribute([ window.HTMLFormElement ], [ 'action' ]);
540 |
541 | //if (new URL(config.url).hostname===ctx.encoding.decode('hvtrs8%2F-dksaopd%2Ccmm').replace('https://', '')) myScript = {src: '//'}
542 |
543 | setInterval(() => {
544 | document.querySelectorAll('a').forEach(node => {
545 | if (!node.getAttribute('data-palladium')) {
546 | if (node.href) node.setAttribute('href', new Base(ctx).url(node.href))
547 | node.setAttribute('data-palladium', true)
548 | }
549 | })
550 | }, 100)
551 |
552 | var inserthtmlproto = Element.prototype.insertAdjacentHTML
553 |
554 | Element.prototype.insertAdjacentHTML = function(place, text) {
555 | var regex = /(srcset|src|href|action|integrity|nonce|http-equiv)\s*=\s*['`"](.*?)['"`]/gi
556 | text = text.toString()
557 | text = text.replace(regex, (match, p1, p2) => {
558 | if (p1=='integrity' || p1=='nonce' || p1=='http-equiv') return ''
559 | if (p1=='srcset') {
560 | const src_arr = [];
561 |
562 | p2.split(',').forEach(url => {
563 | url = url.trimStart().split(' ');
564 | url[0] = new Base(ctx).url(url[0]);
565 | src_arr.push(url.join(' '));
566 | });
567 |
568 | p2 = src_arr.join(', ')
569 | return `${p1}="${p2}"`
570 | }
571 | return `${p1}="${new Base(ctx).url(p2)}"`
572 | })
573 | return inserthtmlproto.apply(this, arguments)
574 | }
575 |
576 | window.Document.prototype.writeln = new Proxy(window.Document.prototype.writeln, {
577 | apply: (target, that , args) => {
578 | if (args.length) args = [ ctx.html.process(args.join(''), ctx.meta) ];
579 | return Reflect.apply(target, that, args);
580 | },
581 | });
582 |
583 | var docWriteHTML = document.write
584 |
585 | window.Document.prototype.write = function() {
586 | if (arguments[0]) {
587 | var regex = /(srcset|src|href|action|integrity|nonce|http-equiv)\s*=\s*['`"](.*?)['"`]/gi
588 | arguments[0] = arguments[0].toString()
589 | arguments[0] = arguments[0].replace(regex, (match, p1, p2) => {
590 | if (p1=='integrity' || p1=='nonce' || p1=='http-equiv') return ''
591 | if (p1=='srcset') {
592 | const src_arr = [];
593 |
594 | p2.split(',').forEach(url => {
595 | url = url.trimStart().split(' ');
596 | url[0] = new Base(ctx).url(url[0]);
597 | src_arr.push(url.join(' '));
598 | });
599 |
600 | p2 = src_arr.join(', ')
601 | return `${p1}="${p2}"`
602 | }
603 | return `${p1}="${new Base(ctx).url(p2)}"`
604 | })
605 | }
606 | return docWriteHTML.apply(this, arguments)
607 | }
608 |
609 | window.Audio = new Proxy(window.Audio, {
610 | construct: (target, args) => {
611 | if (args[0]) args[0] = new Base(ctx).url(args[0])
612 | return Reflect.construct(target, args);
613 | },
614 | });
615 |
616 | //Function.prototype.apply.call = function() {return Function.prototype.call.apply(this, arguments)}
617 |
618 | document.currentScript.remove()
--------------------------------------------------------------------------------
/lib/client/location.js:
--------------------------------------------------------------------------------
1 | window.pLocation = new Proxy({}, {
2 | set(obj, prop, value) {
3 |
4 | if (prop == 'assign' || prop == 'reload' || prop == 'replace' || prop == 'toString' || prop == 'hash' || prop == 'search') return;
5 |
6 | return location[prop] = new Base(ctx).url(new URL(config.url).href.replace(new URL(config.url)[prop], value));
7 | },
8 | get(obj, prop) {
9 | // Had to be done in order to fix Discord.
10 | if (new URL(config.url).origin == atob('aHR0cHM6Ly9kaXNjb3JkLmNvbQ==') && new URL(config.url).pathname == '/app') return window.location[prop];
11 |
12 | if (prop == 'assign' || prop == 'reload' || prop == 'replace' || prop == 'toString' || prop == 'hash' || prop == 'search') return {
13 | assign: arg => window.location.assign(new Base(ctx).url(arg)),
14 | replace: arg => window.location.replace(new Base(ctx).url(arg)),
15 | reload: (arg) => window.location.reload(arg ? arg : null),
16 | toString: () => { return new URL(config.url).href },
17 | hash: window.location.hash,
18 | search: window.location.search
19 | }[prop];
20 | else return new URL(config.url)[prop];
21 | }
22 | })
23 |
24 | var oOpen = window.open;
25 | document.pLocation = pLocation
26 |
27 | window.open = function(url, opts) {
28 | if (url) url = new Base(ctx).url(url)
29 | oOpen.apply(this, arguments)
30 | }
31 |
32 | Object.defineProperty(window, "PLocation", {
33 | set: function(newValue){
34 | if (!newValue) return;
35 | pLocation.href = (newValue)
36 | },
37 | get: function(){
38 | return this.location;
39 | }
40 | });
41 |
42 | var pushstates = history.pushState;
43 |
44 | window.history.pushState = new Proxy(history.pushState, {
45 | apply(target, thisArg, args) {
46 | args[2] = new Base(ctx).url(args[2])
47 | return Reflect.apply(target, thisArg, args)
48 | }
49 | });
50 |
51 | window.history.replaceState = new Proxy(history.replaceState, {
52 | apply(target, thisArg, args) {
53 | args[2] = new Base(ctx).url(args[2])
54 | return Reflect.apply(target, thisArg, args)
55 | }
56 | });
57 |
58 | Object.defineProperty(document, 'domain', {
59 | get() {
60 | return new URL(ctx.url).hostname;
61 | },
62 | set(val) {
63 | return val;
64 | }
65 | });
66 |
67 | var oCookie = document.cookie
68 |
69 | Object.defineProperty(document, 'cookie', {
70 | get() {
71 | var cookie = Object.getOwnPropertyDescriptor(window.Document.prototype, 'cookie').get.call(this),
72 | new_cookie = [],
73 | cookie_array = cookie.split('; ');
74 | cookie_array.forEach(cookie => {
75 | const cookie_name = cookie.split('=').splice(0, 1).join(),
76 | cookie_value = cookie.split('=').splice(1).join();
77 | if (new URL(ctx.url).hostname.includes(cookie_name.split('@').splice(1).join())) new_cookie.push(cookie_name.split('@').splice(0, 1).join() + '=' + cookie_value);
78 | });
79 | return new_cookie.join('; ');;
80 | },
81 | set(val) {
82 | Object.getOwnPropertyDescriptor(Document.prototype, 'cookie').set.call(this, val);
83 | }
84 | })
85 |
86 | window.Worker = new Proxy(window.Worker, {
87 | construct(target, args) {
88 | if (args[0]) args[0] = new Base(ctx).url(args[0]);
89 | return Reflect.construct(target, args);
90 | }
91 | });
92 |
93 | if (config.title) {
94 | var oTitle = Object.getOwnPropertyDescriptor(Document.prototype, 'title');
95 | document.title = config.title
96 | Object.defineProperty(Document.prototype, 'title', {
97 | set(value) {
98 | oTitle = config.title
99 | return value
100 | },
101 | get() {
102 | return config.title
103 | }
104 | })
105 | }
106 |
107 | if (location.search && !(new URLSearchParams(location.search).get('palladium-redir'))) {
108 | var p1 = ctx.encoding.decode(location.pathname.split(config.prefix)[1])
109 | console.log(p1+location.search+'&palladium-redir=true')
110 | location.href = config.prefix+ctx.encoding.encode(p1+location.search+'&palladium-redir=true')
111 | }
--------------------------------------------------------------------------------
/lib/client/xml.js:
--------------------------------------------------------------------------------
1 | const oFetch = window.fetch,
2 | XHR = window.XMLHttpRequest,
3 | oXHR = window.XMLHttpRequest.prototype.open,
4 | oPMessage = window.postMessage,
5 | oSBeacon = window.Navigator.prototype.sendBeacon;
6 |
7 | var ctx = {
8 | prefix: config.prefix,
9 | url: config.url,
10 | config: {
11 | encode: config.encode,
12 | },
13 | encode: config.encode,
14 | getRequestUrl: (req) => {return this.encoding.decode(req.url.split(this.prefix)[1].replace(/\/$/g, ''))},
15 | }
16 |
17 | ctx.encoding = encoding(ctx)
18 |
19 | window.fetch = function(url, opts) {
20 | if (typeof url == 'object') {
21 | opts = url
22 | url = url.url
23 | return oFetch.apply(this, arguments)
24 | }
25 | if (url) url = new Base(ctx).url(url)
26 | return oFetch.apply(this, arguments)
27 | }
28 |
29 | window.XMLHttpRequest.prototype.open = function(method, url, async, user, password) {
30 | if (url) url = new Base(ctx).url(url)
31 | return oXHR.apply(this, arguments)
32 | }
33 |
34 | window.postMessage = function(msg, origin, transfer) {
35 | if (origin) origin = location.origin;
36 | return oPMessage.apply(this, arguments);
37 | };
38 | window.Navigator.prototype.sendBeacon = function(url, data) {
39 | if (url) url = new Base(ctx).url(url);
40 | return oSBeacon.apply(this, arguments);
41 | };
42 |
43 | window.WebSocket = new Proxy(window.WebSocket, {
44 | construct(target, args) {
45 | if (args[0].includes('?')) var todo = '&'; else var todo = '?'
46 | args[0] = (location.protocol=='https:' ? 'wss:' : 'ws:') + '//' + location.origin.split('/').splice(2).join('/') + config.prefix + '?ws='+args[0].replace(location.origin.split('/').splice(2).join('/'), pLocation.origin.split('/').splice(2).join('/'))+ todo+'origin=' + new URL(config.url).origin;
47 | return Reflect.construct(target, args);
48 | }
49 | });
50 |
51 | /*var lStorageOrigin = window.localStorage
52 |
53 | window._localStorage = new Proxy({}, {
54 | set(value, prop) {
55 | if (prop=='getItem') {
56 | return ''
57 | }
58 | if (prop=='setItem') {
59 | return ''
60 | }
61 | return localStorage[new URL(config.url).hostname+prop] = value
62 | },
63 | get(value, prop) {
64 | if (prop=='getItem') {
65 | return function() {
66 | var args = arguments
67 | return localStorage[new URL(config.url).hostname+args[0]]
68 | }
69 | }
70 | if (prop=='setItem') {
71 | return function() {
72 | var args = arguments
73 | return localStorage[new URL(config.url).hostname+args[0]] = args[1]
74 | }
75 | }
76 | return localStorage[new URL(config.url).hostname+prop]
77 | }
78 | })
79 |
80 | /*
81 |
82 | Object.defineProperty(window, 'localStorage', {
83 | get() {
84 | return lStorageOrigin
85 | },
86 | set(value) {
87 | lStorageOrigin = value
88 | }
89 | })
90 |
91 | Object.keys(window.localStorage).forEach(key => {
92 | if (key.startsWith(new URL(config.url).hostname)) {
93 | localStorage[key] = localStorage[key]
94 | } else {
95 | var nkey = localStorage[key]
96 | //localStorage.removeItem(key)
97 | window.addEventListener('beforeunload', () => {
98 | localStorage[key] = nkey
99 | })
100 | }
101 | })
102 | /*
103 | Object.defineProperty(window.localStorage, 'setItem', {
104 |
105 | })
106 |
107 | window.RTCPeerConnection = new Proxy(RTCPeerConnection, {
108 | construct(target, args) {
109 | if (args[1].urls.startsWith('turns:')) {
110 | args[1].username += `|${args[1].urls}`;
111 | args[1].urls = `turns:${location.host}`;
112 | return Reflect.apply(...arguments);
113 | } else if (args[1].urls.startsWith('stuns'))
114 | console.warn("STUN connections aren't supported!");
115 | }
116 | });*/
117 |
118 | window.Worker = new Proxy(window.Worker, {
119 | construct: (target, args) => {
120 | if (args[0]) {
121 | if (args[0].trim().startsWith(`blob:${pLocation.origin}`)) {
122 | const xhr = new XHR
123 | xhr.open('GET', args[0], false);
124 | xhr.send();
125 | const script = new JSRewriter(ctx)(xhr.responseText, ctx.location.origin + args[0].trim().slice(`blob:${ctx.window.location.origin}`.length), ctx);
126 | const blob = new Blob([ script ], { type: 'application/javascript' });
127 | args[0] = URL.createObjectURL(blob);
128 | } else {
129 | args[0] = new Base(ctx).url(args[0]);
130 | };
131 | };
132 | return Reflect.construct(target, args);
133 | },
134 | });
--------------------------------------------------------------------------------
/lib/decompress.js:
--------------------------------------------------------------------------------
1 | const zlib = require('zlib')
2 |
3 | module.exports = class {
4 | constructor(ctx) {
5 | return function(response, data) {
6 | var sendData = ''
7 | switch(response.headers['content-encoding']) {
8 | case 'gzip':
9 | sendData = zlib.gunzipSync(Buffer.concat(data));
10 | break;
11 | case 'deflate':
12 | sendData = zlib.inflateSync(Buffer.concat(data));
13 | break;
14 | case 'br':
15 | sendData = zlib.brotliDecompressSync(Buffer.concat(data));
16 | break;
17 | default: sendData = Buffer.concat(data); break;
18 | };
19 | return sendData
20 | }
21 | }
22 | }
--------------------------------------------------------------------------------
/lib/encoding.js:
--------------------------------------------------------------------------------
1 | var encoding = (ctx) => {
2 | switch(ctx.encode) {
3 | case "plain":
4 | return {
5 | encode(str) {
6 | return str;
7 | },
8 | decode(str) {
9 | return str;
10 | }
11 | }
12 | break;
13 | case "xor":
14 | return {
15 | encode(str) {
16 | str = str.replace('https://', 'https:/').replace('https:/', 'https://')
17 | return (encodeURIComponent(str.split('').map((char,ind)=>ind%2?String.fromCharCode(char.charCodeAt()^2):char).join('')));
18 | },
19 | decode(str) {
20 | if (!str.startsWith('hvtrs')) return str
21 | return (decodeURIComponent(str).split('').map((char, ind) => ind % 2 ? String.fromCharCode(char.charCodeAt() ^ 2) : char).join(''))
22 | }
23 | }
24 | break;
25 | case "base64":
26 | if (typeof window == 'undefined') return {
27 | encode(str) {
28 | return new Buffer.from(str).toString("base64");
29 | },
30 | decode(str) {
31 | if (new Buffer.from(str).toString("base64").startsWith('http')) {
32 | return str
33 | }
34 | return new Buffer.from(str, "base64").toString("utf-8");
35 | }
36 | }; else return {
37 | encode(str) {
38 | return btoa(str)
39 | },
40 | decode(str) {
41 | if (btoa(str).startsWith('http')) {
42 | return str
43 | }
44 | return atob(str.split('/')[0])+str.split('/')[1]
45 | }
46 | };
47 | break;
48 | default:
49 | return {
50 | encode(str) {
51 | return str;
52 | },
53 | decode(str) {
54 | return (str.split('https:/').startsWith('/') ? str : str.replace('https:/', 'https://'));
55 | }
56 | }
57 | }
58 | }
59 |
60 | if (typeof module !== undefined) module.exports = encoding;
--------------------------------------------------------------------------------
/lib/rewrites/base.js:
--------------------------------------------------------------------------------
1 | //Client and Server Side
2 |
3 | class Base {
4 | constructor(ctx) {
5 | this.ctx = ctx
6 | }
7 | url(url, ext) {
8 | if (typeof window == 'undefined') {
9 | function co(num) { return (num % 2)==1;}
10 | var headers = this.ctx.req.rawHeaders || []
11 | var fullHeaders = {}
12 | headers.map((e, ind) => {
13 | if (co(ind+1)) {
14 | fullHeaders[e] = headers[ind+1]
15 | }
16 | })
17 | }
18 | var hostname = ((fullHeaders||{})['Host']||location.hostname)
19 | if (!url) return url
20 | /*
21 | if (typeof url == 'object') {
22 | throw new Error('no')
23 | var object = url
24 | console.log(object)
25 | url = url.url
26 | }*/
27 | url = (url).toString()
28 | if (url.match(/^(javascript:|about:|mailto:|data:|blob:|#)/gi)) return url
29 | url = url.replace(/^\/\//, 'https://')
30 |
31 | try{url = url.replace(location.origin, new URL(ctx.url).origin)}catch{}
32 |
33 | /*if (url.includes('https://')) {
34 | url = url.replace('https://', '')
35 | url = url.split('/')
36 | url[0] = ''
37 | Object.keys(url).forEach((e) => {
38 | if (!e==0||!e==1) url[e]='/'+url[e]
39 | })
40 | url = url.join('')
41 | console.log(url)
42 | }*/
43 | if (!this.ctx.encode==='base64') {
44 | url = this.ctx.encoding.decode(url)
45 | }
46 | if (url.startsWith(this.ctx.prefix)) return url;
47 | if (!url.startsWith('http')) {
48 | try {
49 | var host = new URL(this.ctx.url).hostname
50 | } catch(err) {
51 | try {var host = new URL(this.ctx.encoding.decode(this.ctx)).hostname} catch(e) {}
52 | }
53 | url = 'https://'+ host + (url.startsWith('/') ? '' : '/') + url
54 | }
55 | if(new URL(url).protocol.startsWith('ws')) {
56 | console.log(new URLSearchParams(new URL(url).search))
57 | }
58 | if (url.includes('https://')) url = url.replace('https://', 'https:/')
59 | /*var test = 'https://'+hostname+this.ctx.prefix + this.ctx.encoding.encode(url.replace('../', '').replace('./', '').replace('http://', 'https://'))
60 | test = this.ctx.encoding.decode(test.split(this.ctx.prefix)[1])
61 | if (test.includes(this.ctx.prefix)) {
62 | url = this.ctx.encoding.decode(test.split(this.ctx.prefix)[1])
63 | }*/
64 | var eslash = url.endsWith('/') ? '/' : ''
65 | if (!ext) return /*'https://'+hostname+*/this.ctx.prefix + this.ctx.encoding.encode(url.replace('../', '').replace('./', '').replace('http://', 'https://'))+eslash
66 | return this.ctx.prefix + ext + this.ctx.encoding.encode(url)
67 | }
68 | element(attr, ext) {
69 | if (ext==='_plain/') {
70 | var url = this.url(attr)
71 | } else {
72 | var url = this.url(attr, ext)
73 | }
74 |
75 | return url
76 | }
77 | }
78 |
79 | if (typeof module !== undefined) module.exports = Base;
--------------------------------------------------------------------------------
/lib/rewrites/cookie.js:
--------------------------------------------------------------------------------
1 | module.exports = class CookieRewriter {
2 | constructor(ctx) {
3 | if (!ctx.requestResponse.headers['cookie']) return {};
4 | else console.log(ctx.requestResponse.headers['cookie'])
5 | }
6 | }
--------------------------------------------------------------------------------
/lib/rewrites/css.js:
--------------------------------------------------------------------------------
1 | module.exports = class CSSRewriter {
2 | constructor(data, ctx) {
3 | return function CSS(data, ctx) {
4 | return data.toString().replace(/url\("(.*?)"\)/gi, str => {var url = str.replace(/url\("(.*?)"\)/gi, '$1');return `url("${new ctx.rewrite.Base(ctx).url(url)}")`;}).replace(/url\('(.*?)'\)/gi, str => {var url = str.replace(/url\('(.*?)'\)/gi, '$1');return `url('${new ctx.rewrite.Base(ctx).url(url)}')`;}).replace(/url\((.*?)\)/gi, str => {var url = str.replace(/url\((.*?)\)/gi, '$1');if (url.startsWith(`"`) || url.startsWith(`'`)) return str;return `url("${new ctx.rewrite.Base(ctx).url(url)}")`;}).replace(/@import (.*?)"(.*?)";/gi, str => {var url = str.replace(/@import (.*?)"(.*?)";/, '$2');return `@import "${new ctx.rewrite.Base(ctx).url(url)}";`}).replace(/@import (.*?)'(.*?)';/gi, str => {var url = str.replace(/@import (.*?)'(.*?)';/, '$2');return `@import '${new ctx.rewrite.Base(ctx).url(url)}';`})
5 | };
6 | }
7 | }
--------------------------------------------------------------------------------
/lib/rewrites/header.js:
--------------------------------------------------------------------------------
1 | module.exports = class RewriteHeaders {
2 | constructor(ctx) {
3 | if (ctx.requestResponse.headers.location) ctx.requestResponse.headers.location = new ctx.rewrite.Base(ctx).url(ctx.requestResponse.headers.location);
4 | ['content-length','content-security-policy','content-security-policy-report-only','strict-transport-security','x-frame-options'].forEach(name => delete ctx.requestResponse.headers[name]);
5 | return ctx.requestResponse.headers
6 | }
7 | }
--------------------------------------------------------------------------------
/lib/rewrites/html.js:
--------------------------------------------------------------------------------
1 | var { JSDOM } = require('jsdom')
2 | var regex = /(srcset|src|href|action|integrity|nonce|http-equiv)\s*=\s*['`"](.*?)['"`]/gi
3 |
4 | module.exports = class HTMLRewriter {
5 | constructor(data, ctx) {
6 | return function HTML(data, ctx) {
7 | ctx.responseText = data.toString()
8 |
9 | var HTML_REWRITE_CONFIG = [
10 | {
11 | tags: ['http-equiv'],
12 | action: ['replace'],
13 | new: 'No-U-Content-Security-Policy',
14 | },
15 | {
16 | tags: ['href', 'src', 'action'],
17 | action: ['rewrite'],
18 | },
19 | {
20 | tags: ['srcset'],
21 | action: ['srcset'],
22 | },
23 | {
24 | tags: ['integrity'],
25 | action: ['replace'],
26 | newtag: 'nointegrity',
27 | },
28 | {
29 | tags: ['nonce'],
30 | action: ['replace'],
31 | newtag: 'nononce'
32 | }
33 | ]
34 |
35 | var injectData = {
36 | prefix: ctx.prefix,
37 | //encurl: ctx.encoding.decode(new ctx.rewrite.Base(ctx).url(ctx.url).replace(ctx.prefix, '')),
38 | url: ctx.url,
39 | title: ctx.title,
40 | encode: ctx.encode,
41 | req: {
42 | url: ctx.req.url,
43 | },
44 | }
45 |
46 | JSDOM.prototype.removeAttribute=function(attr) {}
47 |
48 | var html = new JSDOM(ctx.responseText, {'content-type': 'text/html'}), document = html.window.document;
49 |
50 | var sample = `https://github.githubassets.com/images/modules/site/home/globe-700.jpg 700w,https://github.githubassets.com/images/modules/site/home/globe.jpg 1400w`
51 |
52 | HTML_REWRITE_CONFIG.forEach((_config) => {
53 | if (_config.action[0]=='rewrite') {
54 | _config.tags.forEach((tag) => {
55 | document.querySelectorAll(`*[${tag}]`).forEach(node => {
56 | node.setAttribute(tag, new ctx.rewrite.Base(ctx).url(node.getAttribute(tag)))
57 | })
58 | })
59 | }
60 | if (_config.action[0]=='srcset') {
61 | _config.tags.forEach((tag) => {
62 | document.querySelectorAll(`*[${tag}]`).forEach(node => {
63 | node.setAttribute(tag, RewriteSrcset(node.getAttribute(tag)))
64 | })
65 | })
66 | }
67 | if (_config.action[0]=='replace') {
68 | _config.tags.forEach((tag) => {
69 | document.querySelectorAll(`*[${tag}]`).forEach(node => {
70 | if (_config.new) {
71 | node.setAttribute(tag, _config.new)
72 | node.removeAttribute(tag)
73 | }
74 | if (_config.newtag) {
75 | node.setAttribute(_config.newtag, node.getAttribute(tag))
76 | node.removeAttribute(tag)
77 | }
78 | })
79 | })
80 | }
81 | })
82 |
83 | function RewriteSrcset(sample) {
84 | return sample.split(',').map(e => {
85 | return(e.split(' ').map(a => {
86 | if (a.startsWith('http')) {
87 | var url = new ctx.rewrite.Base(ctx).url(a)
88 | }
89 | return a.replace(a, (url||a))
90 | }).join(' '))
91 | }).join(',')
92 | }
93 |
94 | function InjectScript(){
95 | var e = document.createElement('script')
96 | e.setAttribute('data-config', JSON.stringify(injectData))
97 | e.src = injectData.prefix + 'index'
98 | document.querySelector('head').insertBefore(e, document.querySelector('head').childNodes[0])
99 | }
100 |
101 | InjectScript()
102 |
103 | ctx.responseText = html.serialize()
104 |
105 | ctx.httpResponse.text = ctx.responseText
106 |
107 | return html.serialize()
108 | }
109 | }
110 | }
--------------------------------------------------------------------------------
/lib/rewrites/javascript.js:
--------------------------------------------------------------------------------
1 | class JSRewriter {
2 | constructor(data, ctx) {
3 | return function JS(data, ctx) {
4 | return data.toString().replace(/(,| |=|\()document.location(,| |=|\)|\.)/gi, str => { return str.replace('.location', `.pLocation`); }).replace(/(,| |=|\()window.location(,| |=|\)|\.)/gi, str => { return str.replace('.location', `.pLocation`); })/*.replace(/(,| |=|\()location(,| |=|\)|\.)/gi, str => { return str.replace('location', `pLocation`); })*/.replace('myScript=scripts[index]||', 'myScript=')//.replace(/(localStorage|sessionStorage)/g, '_$1')//.replace(/location\s*=\s*/gi, 'PLocation = ')//.replace(/location\.([a-zA-Z0-9]*)/gi, 'pLocation.$1')//.replace(/\.href\s*=(["'` ]*)([a-zA-Z0-9]*)(['`" ]*)/gi, (match, p1, p2, p3) => {return '.phref = '+p1+new ctx.rewrite.Base(ctx).url(p2)+p3})
5 | }
6 | }
7 | }
8 |
9 | if (typeof module !== undefined) module.exports = JSRewriter
--------------------------------------------------------------------------------
/lib/server/compile.js:
--------------------------------------------------------------------------------
1 | module.exports = class {
2 | constructor(ctx) {
3 | return {
4 | Base: require('../rewrites/base'),
5 | HTMLRewriter: new (require('../rewrites/html'))(ctx),
6 | CSSRewriter: new (require('../rewrites/css'))(ctx),
7 | JSRewriter: new (require('../rewrites/javascript'))(ctx),
8 | CookieRewriter: require('../rewrites/cookie'),
9 | RewriteHeaders: require('../rewrites/header'),
10 | }
11 | }
12 | }
--------------------------------------------------------------------------------
/lib/server/gateway.js:
--------------------------------------------------------------------------------
1 | const urlp = require('url');
2 |
3 | module.exports = class {
4 | constructor(ctx) {
5 | Object.entries(ctx).forEach((entry) => {
6 | this[entry[0]] = entry[1]
7 | })
8 | this.ctx = ctx
9 | }
10 | create(req, res) {
11 | if (req.url.startsWith(this.config.prefix+'gateway')) {
12 | var pdata = []
13 | req.on('data', data => pdata.push(data))
14 | req.on('end', () => {
15 | var string = Buffer.concat(pdata).toString()
16 | if (string==='') {
17 | if (!new URLSearchParams(urlp.parse(req.url, true).query).get('url')) return res.writeHead(500, {refresh: '5; /'}).end('Missing Parameter: URL')
18 | var url = new URLSearchParams(urlp.parse(req.url, true).query).get('url')
19 | } else {
20 | if (!new URLSearchParams(string).get('url')) return res.writeHead(500, {refresh: '5; /'}).end('Missing Parameter: URL')
21 | var url = new URLSearchParams(string).get('url')
22 | }
23 | if (!url.startsWith('http')) url = 'https:\/'+url
24 |
25 | url = url.replace(/http(s|):\/([a-zA-Z0-9]+)/g, 'https://$2')
26 | url = this.ctx.encoding.encode(url);
27 | res.writeHead(301, {location: `${this.prefix}${url}/`}).end('')
28 | })
29 | } else {
30 | res.writeHead(500, {refresh: '5; /'}).end('Unknown Error')
31 | }
32 | }
33 | }
--------------------------------------------------------------------------------
/lib/server/handleRequest.js:
--------------------------------------------------------------------------------
1 | var fs = require('fs')
2 | var http = require('http');
3 | var https = require('https');
4 |
5 | module.exports = function Request(req, res, ctx) {
6 |
7 | //req.headers['user-agent']=='googlebot' && return(res.writeHead(403).end('Unauthorized'))
8 |
9 | ctx.requestMiddlewares.forEach((func) => {
10 | var octx = ctx
11 | try {ctx = eval(func)(ctx);if(!ctx)ctx=octx;} catch(err) {ctx=octx;console.log('Request Middleware Error: '+err)}
12 | })
13 |
14 | Object.assign(this, ctx)
15 | var proxy = {host: (this.getRequestUrl(req).replace(/(https:\/\/|http:\/\/|\/$)/g, '')).split('/')[0],path: (this.getRequestUrl(req)).split('/')[(this.getRequestUrl(req)).split('/').length - 1],url: this.getRequestUrl(req),docTitle: this.config.docTitle}
16 |
17 | try {new URL(ctx.url)} catch(err) {return res.end('Invalid URL: '+proxy.url+', '+err)}
18 |
19 | proxy.options = {
20 | headers: {},
21 | method: req.method,
22 | };
23 |
24 | if (req.headers['referer']) proxy.options.headers['referer'] = ctx.headers.referer(req.headers['referer'])
25 |
26 | if (req.headers['origin']) proxy.options.headers['origin'] = ctx.headers.origin(req.headers['origin'], ctx.url)
27 |
28 | if (req.headers['user-agent']) proxy.options.headers['user-agent'] = req.headers['user-agent']
29 |
30 | if (req.headers['authorization']) proxy.options.headers['authorization'] =req.headers['authorization']
31 |
32 | if (req.headers['cookie']) proxy.options.headers['cookie'] = ctx.headers.cookie(req.headers['cookie'])
33 |
34 | if (req.headers['accept']) proxy.options.headers['accept'] = req.headers['accept']
35 |
36 | if (req.headers['content-type']) proxy.options.headers['content-type'] = req.headers['content-type']
37 |
38 | if (req.headers['content-length']) proxy.options.headers['content-length'] = req.headers['content-length']
39 |
40 | if (req.headers['accept-language']) proxy.options.headers['accept-language'] = req.headers['accept-language']
41 |
42 | Object.entries(req.headers).forEach(([header, value]) => {
43 | if (header.startsWith('x-')||header.startsWith('sec-')) proxy.options.headers[header] = value
44 | })
45 | var newheaders = req.headers
46 | Object.entries(proxy.options.headers).forEach(([header, v]) => {
47 | delete newheaders[header]
48 | })
49 | delete newheaders['host']
50 | delete newheaders['accept-encoding']
51 | delete newheaders['cache-control']
52 | delete newheaders['upgrade-insecure-requests']
53 | Object.keys(newheaders).forEach(key => proxy.options.headers[key]=newheaders[key])
54 |
55 | if (req.headers.referer) {
56 | try {
57 | var ourl = req.url
58 | req.url = req.headers.referer
59 | req.headers.referer = new URL(ctx.getRequestUrl(req)).href;
60 | req.url = ourl
61 | } catch(err) {
62 | req.headers.referer = new URL(ctx.url).href;
63 | };
64 | };
65 |
66 | if (req.headers['cookie']) proxy.options['cookie'] = req.headers['cookie']
67 |
68 | if (!req.url.startsWith(ctx.prefix)) return (res.writeHead(308, { location: ctx.prefix + `${ctx.encoding.encode(new URL(proxy.url).origin.replace('https:/', 'https:'))}`}), res.end(''));
69 |
70 | proxy.spliceURL = new URL(proxy.url)
71 |
72 | var inject = {url: ctx.url,prefix: ctx.prefix,host: new URL(ctx.url).hostname}
73 |
74 | /*if (proxy.options.headers['cookie']) {
75 | var array = [],
76 | newCookie = proxy.options.headers['cookie'].split('; ');
77 | newCookie.forEach(cookie => {
78 | var cname = cookie.split('=')+''
79 | var cvalue = cookie.split('=')+''
80 | if (proxy.spliceURL.hostname.includes(cookie.split('@').splice(1).join())) array.push(cname.split('@').splice(0, 1).join() + '=' + cvalue);
81 | });
82 | proxy.options.headers['cookie'] = array.join('; ');
83 | };*/
84 |
85 | if (ctx.url.endsWith(',jq.oar')) {
86 | ctx.url = ctx.url.replace(ctx.url.split('/')[ctx.url.split('/').length - 1], '').replace(/\/$/, '')
87 | }
88 |
89 | if(ctx.url.endsWith('.asq.oar')) {
90 | ctx.url = ctx.url.split('-')[0]
91 | }
92 |
93 | var requestProtocol = proxy.url.startsWith('https:/') ? https : http
94 |
95 | ctx.requestMiddleware.forEach((e) => {
96 | e(ctx)
97 | });
98 |
99 | delete proxy.options.headers['host']
100 |
101 | var requestMain = requestProtocol.request(ctx.url.replace(/pLocation/gi, 'location'), proxy.options, response => {
102 | let pData = []
103 | let sendData = ''
104 | response.on('data', (data) => {pData.push(data)}).on('end', () => {
105 |
106 | ctx.httpResponse = response
107 |
108 | Object.entries(response.headers).forEach(([header_name, header_value]) => {
109 | /*if (header_name == 'set-cookie') {
110 | const cookie_array = [];
111 | header_value.forEach(cookie => cookie_array.push(cookie.replace(/Domain=(.*?);/gi, `Domain=` + req.headers['host'] + ';').replace(/(.*?)=(.*?);/, '$1' + '@' + new URL(proxy.url).hostname + `=` + '$2' + ';')));
112 | response.headers[header_name] = cookie_array;
113 |
114 | };*/
115 |
116 | if (header_name.startsWith('content-encoding') || header_name.startsWith('x-') || header_name.startsWith('cf-') || header_name.startsWith('strict-transport-security') || header_name.startsWith('content-security-policy') || header_name.startsWith('content-length')) delete response.headers[header_name];
117 |
118 | if (header_name == 'location') response.headers[header_name] = new ctx.rewrite.Base(ctx).url(header_value)
119 | });
120 |
121 | var con = (response.headers['content-type']||'').split(';')[0]
122 |
123 | switch(response.headers['content-encoding']) {
124 | case 'gzip':
125 | sendData = zlib.gunzipSync(Buffer.concat(pData));
126 | break;
127 | case 'deflate':
128 | sendData = zlib.inflateSync(Buffer.concat(pData));
129 | break;
130 | case 'br':
131 | sendData = zlib.brotliDecompressSync(Buffer.concat(pData));
132 | break;
133 | default: sendData = Buffer.concat(pData); break;
134 | };
135 |
136 | if (con=='text/css') {
137 | sendData = ctx.rewrite.CSSRewriter(sendData.toString('utf-8'), ctx)
138 | } else if (response.headers['content-type']) {
139 | if (response.headers['content-type'].startsWith('application/javascript')) {
140 | sendData = ctx.rewrite.JSRewriter(sendData.toString('utf-8'), ctx)
141 | }
142 | if (response.headers['content-type'].startsWith('text/html')) {
143 | sendData = ctx.rewrite.HTMLRewriter(sendData.toString('utf-8'), ctx)
144 | }
145 | }
146 |
147 | if(response.headers['content-type'] && response.headers['content-type'].match(/text\/html\s*$/g)) {
148 | response.headers['content-type'] += '; charset=UTF-8'
149 | }
150 |
151 | //if (req.method==='POST') delete response.headers['content-type']
152 |
153 | ctx.responseMiddlewares.forEach((func) => {
154 | var octx = ctx
155 | try {ctx = eval(func)(ctx);if(!ctx)ctx=octx;} catch(err) {ctx=octx;console.log('Response Middleware Error: '+err)}
156 | });
157 |
158 | [
159 | 'content-length',
160 | 'content-security-policy',
161 | 'content-security-policy-report-only',
162 | 'strict-transport-security',
163 | 'x-frame-options',
164 | ].forEach(name => delete response.headers[name]);
165 |
166 | //try {sendData = sendData.replace(/Function\.prototype\.apply\.call/gi, 'Function.prototype.call')} catch {}
167 |
168 | return res.writeHead(response.statusCode, response.headers).end(sendData)
169 | })
170 | }).on('error', err => res.end('Error: '+err))
171 | if (!res.writableEnded) {
172 | req.on('data', (data) => requestMain.write(data)).on('end', () => requestMain.end())
173 | } else {
174 | requestMain.end()
175 | }
176 | }
--------------------------------------------------------------------------------
/lib/server/headers.js:
--------------------------------------------------------------------------------
1 | module.exports = class Headers {
2 | constructor(ctx) {
3 | return {
4 | origin(header, url) {
5 | var newHeader = ctx.headersURL(`/${ctx.req.headers['origin'].split('/').splice(3).join('/')}`.replace(ctx.prefix, ''), true);
6 | if (newHeader.startsWith('https://') || newHeader.startsWith('http://')) newHeader = newHeader.split('/').splice(0, 3).join('/');
7 | else newHeader = new URL(ctx.url).origin;
8 | return newHeader;
9 | },
10 | referer(header) {
11 | var proxified_header = ctx.headersURL(`/${ctx.req.headers['referer'].split('/').splice(3).join('/')}`.replace(ctx.prefix, ''), true);
12 | if (proxified_header.startsWith('https://') || proxified_header.startsWith('http://')) proxified_header = proxified_header;
13 | else proxified_header = ctx.url;
14 | return proxified_header;
15 | },
16 | cookie(header) {
17 | return header
18 | }
19 | }
20 | }
21 | }
--------------------------------------------------------------------------------
/lib/server/index.js:
--------------------------------------------------------------------------------
1 | var request = require('./request'),
2 | gateway = require('./gateway'),
3 | utilities = require('./utility'),
4 | fs = require('fs'),
5 | Compile = require('./compile'),
6 | handleRequest = require('./handleRequest'),
7 | qs = require('querystring'),
8 | path = require('path')
9 | ws = require('ws'),
10 | WebSocket = require('./websocket'),
11 | zlib = require('zlib'),
12 | decompress = require('../decompress'),
13 | btoa = str => new Buffer.from(str).toString('base64'),
14 | atob = str => new Buffer.from(str, 'base64').toString('utf-8');
15 |
16 | module.exports = class Smoke {
17 | constructor(config) {
18 | var server = config.server || {}
19 | delete config.server
20 | if (server!={}) server.on('request', (req, res) => {if(req.headers.useragent === 'googlebot') return res.writeHead(403).end('');})
21 | var defaults = {
22 | prefix: '/service/',
23 | encode: 'plain',
24 | ssl: false,
25 | requestMiddleware: [],
26 | responseMiddleware: [],
27 | requestMiddlewares: [],
28 | responseMiddlewares: [],
29 | title: 'Service',
30 | debug: false,
31 | Corrosion: [false, {}],
32 | }
33 | this.config = defaults
34 | if (config.prefix) {
35 | if (config.prefix.startsWith('/') && config.prefix.endsWith('/'));
36 | else {
37 | config.prefix = config.prefix.replace(/\//g, '')
38 | config.prefix = '/'+config.prefix+'/'
39 | }
40 | }
41 | defaults = Object.assign(defaults, config);
42 | Object.entries(defaults).forEach((entry) => {
43 | this[entry[0]] = entry[1]
44 | })
45 | this.headersURL = (url) => {return this.encoding.decode(url.replace(this.prefix, ''))}
46 | this.getRequestUrl = (req) => {
47 | return this.encoding.decode(req.url.split(this.prefix)[1].replace(/\/$/g, '').replace(/^https:\/([a-z1-9A-Z])/g, "https://$1")).replace('../', '').replace('./', '')
48 | }
49 | this.encoding = require('../encoding.js')(this)
50 | this.make = new request(this)
51 | this.handleRequest = handleRequest
52 | this.gateway = gateway
53 | this.middleware = {force: utilities.force,blackList: utilities.blackList}
54 | this.decompress = new decompress(this)
55 | this.rewrite = new Compile(this)
56 | this.websocket = new WebSocket(this)
57 | this.headers = (require('./headers'))
58 | if (server!={}) this.websocket(server)
59 | }
60 | request(req, res, next = function() {res.end('')}) {
61 | if (!req.url.startsWith(this.prefix)) return next()
62 |
63 | req.headers.useragent === 'googlebot' && next();
64 |
65 | if (this.debug==true) console.log('Request', this.getRequestUrl(req))
66 |
67 | if (req.url.startsWith(this.prefix+'gateway')) return new this.gateway(this).create(req, res)
68 |
69 | var requestConfig = {}
70 | Object.entries(this).forEach((entry) => {
71 | requestConfig[entry[0]] = entry[1]
72 | })
73 |
74 | Object.assign(this, {host: (this.getRequestUrl(req).replace(/(https:\/\/|http:\/\/|\/$)/g, '')).split('/')[0],path: (this.getRequestUrl(req)).split('/')[(this.getRequestUrl(req)).split('/').length - 1],url: this.getRequestUrl(req),docTitle: this.config.docTitle})
75 |
76 | /*if (req.url.replace(this.prefix, '')==('index')) {
77 | return res.writeHead(200, {'content-type': 'application/javascript'}).end(fs.readFileSync('./lib/client/index.js', 'utf-8'))
78 | }*/
79 |
80 | //try {new URL(this.url)} catch(err) {return res.end('Invalid URL: '+this.url+', '+err)}
81 |
82 | //if (!this.url.endsWith('/')) return res.writeHead(301, {location: req.url+'/'}).end('')
83 |
84 | this.req = req
85 | this.response = res
86 |
87 | this.headers = new (require('./headers'))(this)
88 |
89 | if (req.url.replace(this.prefix, '').startsWith('index')) {
90 | return res.writeHead(200, {'content-type': 'application/javascript'}).end(fs.readFileSync(path.join(path.parse(__dirname).dir, 'client/index.js'), 'utf-8'))
91 | }
92 |
93 | //this.options = this.handle(this)
94 |
95 | //this.handleRequest(this)
96 |
97 | this.handleRequest(req, res, this)
98 | }
99 | express(smoke, server) {
100 | smoke.clientScript()
101 | smoke.ws(server)
102 | return function(req, res, next) {
103 | return smoke.request(req, res, next)
104 | }
105 | }
106 | init(ctx) {
107 | var base = path.parse(__dirname).dir
108 | var data1 = fs.readFileSync(path.join(base, 'encoding.js'))
109 | var data2 = fs.readFileSync(path.join(base,'client/xml.js'))
110 | var data3 = fs.readFileSync(path.join(base, 'server/utility.js'))
111 | var data4 = fs.readFileSync(path.join(base, 'client/client.js'))
112 | var data5 = fs.readFileSync(path.join(base, 'rewrites/base.js'))
113 | var data6 = fs.readFileSync(path.join(base, 'client/location.js'))
114 | var data7 = fs.readFileSync(path.join(base, 'client/element.js'))
115 | var data8 = fs.readFileSync(path.join(base, 'rewrites/javascript.js'))
116 |
117 | var fullData = [data4, data1, data2, data3, data8, data5, data6, data7]
118 | fs.writeFileSync(path.join(base, 'client/index.js'), fullData.join('\n'))
119 | return ctx
120 | }
121 | ws(http) {
122 | try {
123 | var wss = new ws.Server({server: http})
124 | wss.on('connection', (cli, req) => {
125 | try {
126 | var proxyURL = req.url.split('?ws=')[1].replace(this.prefix, '')
127 | try {new URL(proxyURL)} catch(err) {return cli.close(err)}
128 | var wsProxy = new ws(proxyURL, {
129 | origin: proxyURL.split('&origin=')[1]
130 | })
131 | wsProxy.on('error', () => cli.terminate())
132 | cli.on('error', () => wsProxy.terminate())
133 | wsProxy.on('close', () => cli.close())
134 | cli.on('close', () => wsProxy.close())
135 | wsProxy.on('open', () => {
136 | cli.on('message', message => {
137 | wsProxy.send(message.toString())
138 | })
139 | wsProxy.on('message', message => {
140 | message = message.toString().includes('�') ? message : message.toString()
141 | cli.send(message)
142 | })
143 | })
144 | } catch {
145 | cli.close()
146 | }
147 | });
148 | if (this.debug==true) console.log('Websocket Loaded')
149 | } catch(err) {
150 | throw new Error('Error: Unknown Websocket Error\n\n'+err)
151 | }
152 | return this
153 | }
154 | onrequest(func) {
155 | this.requestMiddlewares.push(func)
156 | }
157 | onresponse(func) {
158 | this.requestMiddlewares.push(func)
159 | }
160 | }
161 |
162 | module.exports.blackList = utilities.blackList
163 |
164 | //module.exports = Smoke
--------------------------------------------------------------------------------
/lib/server/request.js:
--------------------------------------------------------------------------------
1 | var https = require('https'),
2 | http = require('http')
3 |
4 | module.exports = class {
5 | constructor(con) {
6 | return function(ctx) {
7 | var requestProtocol = ctx.url.startsWith('https') ? https : http
8 | var requestMain = requestProtocol.request(ctx.url.replace(/pLocation/gi, 'location'), ctx.options, response => {
9 | let pData = []
10 | let sendData = ''
11 | response.on('data', (data) => {pData.push(data)}).on('end', () => {
12 | ctx.arrayData = pData
13 | ctx.httpResponse = response
14 | return ctx.respond(ctx)
15 | })
16 | }).on('error', err => ctx.response.end('Error: '+err))
17 | if (!ctx.response.writableEnded) {
18 | ctx.req.on('data', (data) => requestMain.write(data)).on('end', () => requestMain.end())
19 | } else {
20 | requestMain.end()
21 | }
22 | }
23 | }
24 | }
--------------------------------------------------------------------------------
/lib/server/utility.js:
--------------------------------------------------------------------------------
1 | function blackList(list, reason = 'Website Blocked') {
2 | return (ctx) => {
3 | try {if(list.indexOf(new URL(ctx.url).hostname)>-1) {
4 | ctx.response.end(reason)
5 | }} catch {}
6 | }
7 | }
8 |
9 | function allow(list, config) {
10 | return function(ctx) {
11 | try {if(list.indexOf(new URL(ctx.url).hostname)==-1) {
12 | if (config[0]=='redirect') {
13 | ctx.response.writeHead(301, {location: ctx.prefix+'gateway?url='+config[1]}).end('')
14 | } else {
15 | ctx.response.end(config[1])
16 | }
17 | }} catch {}
18 | }
19 | }
20 |
21 | function force(ctx) {
22 | return ctx.url.replace(/http:\/\//g, 'https://');
23 | }
24 |
25 | if (!typeof module !== undefined) module.exports.blackList = blackList;
26 | if (typeof module !== undefined) module.exports.force = force;
27 | module.exports.allow = allow;
--------------------------------------------------------------------------------
/lib/server/websocket.js:
--------------------------------------------------------------------------------
1 | const http = require('http')
2 | const https = require('https')
3 | const rurl = require('url')
4 | const ws = require('ws')
5 |
6 | module.exports = class WebSocket {
7 | constructor(ctx) {
8 | this.ctx = ctx
9 | return (http) => {
10 | if (ctx.Corrosion[0]==false) {
11 | try {
12 | var wss = new ws.Server({server: http})
13 | wss.on('connection', (cli, req) => {
14 | try {
15 | var proxyURL = req.url.split('?ws=')[1].replace(this.prefix, '')
16 | try {new URL(proxyURL)} catch(err) {return cli.close()}
17 | var wsProxy = new ws(proxyURL, {
18 | origin: proxyURL.split('&origin=')[1]
19 | })
20 | wsProxy.on('error', () => cli.terminate())
21 | cli.on('error', () => wsProxy.terminate())
22 | wsProxy.on('close', () => cli.close())
23 | cli.on('close', () => wsProxy.close())
24 | wsProxy.on('open', () => {
25 | cli.on('message', message => {
26 | wsProxy.send(message.toString())
27 | })
28 | wsProxy.on('message', message => {
29 | message = message.toString().includes('�') ? message : message.toString()
30 | cli.send(message)
31 | })
32 | })
33 | } catch {
34 | cli.close()
35 | }
36 | });
37 | if (this.debug==true) console.log('Websocket Loaded')
38 | } catch(err) {
39 | throw new Error('Error: Unknown Websocket Error\n\n'+err)
40 | }
41 | } else {
42 | try {
43 | var wss = new ws.Server({server: http})
44 | wss.on('connection', (cli, req) => {
45 | if (req.url.startsWith(ctx.prefix)) {
46 | try {
47 | var proxyURL = req.url.split('?ws=')[1].replace(this.prefix, '')
48 | try {new URL(proxyURL)} catch(err) {return cli.close()}
49 | var wsProxy = new ws(proxyURL, {
50 | origin: proxyURL.split('&origin=')[1]
51 | })
52 | wsProxy.on('error', () => cli.terminate())
53 | cli.on('error', () => wsProxy.terminate())
54 | wsProxy.on('close', () => cli.close())
55 | cli.on('close', () => wsProxy.close())
56 | wsProxy.on('open', () => {
57 | cli.on('message', message => {
58 | wsProxy.send(message.toString())
59 | })
60 | wsProxy.on('message', message => {
61 | message = message.toString().includes('�') ? message : message.toString()
62 | cli.send(message)
63 | })
64 | })
65 | } catch {
66 | cli.close()
67 | }
68 | } else if (req.url.startsWith(ctx.Corrosion[1].prefix)) {
69 | try {new URL(ctx.Corrosion[1].url.unwrap(req.url))} catch(err) {return cli.close()}
70 | var url = ctx.Corrosion[1].url.unwrap(req.url).replace(/^http/g, 'ws')
71 | var wsProxy = new ws(url)
72 | wsProxy.on('error', () => cli.terminate())
73 | cli.on('error', () => wsProxy.terminate())
74 | wsProxy.on('close', () => cli.close())
75 | cli.on('close', () => wsProxy.close())
76 | wsProxy.on('open', () => {
77 | cli.on('message', message => {
78 | wsProxy.send(message.toString())
79 | })
80 | wsProxy.on('message', message => {
81 | message = message.toString().includes('�') ? message : message.toString()
82 | cli.send(message)
83 | })
84 | })
85 | }
86 | });
87 | if (this.debug==true) console.log('Websocket Loaded')
88 | } catch(err) {
89 | throw new Error('Error: Unknown Websocket Error\n\n'+err)
90 | }
91 | }
92 | }
93 | }
94 | }
--------------------------------------------------------------------------------
/package-lock.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "palladiumub",
3 | "version": "1.2.0",
4 | "lockfileVersion": 1,
5 | "requires": true,
6 | "dependencies": {
7 | "@tootallnate/once": {
8 | "version": "2.0.0",
9 | "resolved": "https://registry.npmjs.org/@tootallnate/once/-/once-2.0.0.tgz",
10 | "integrity": "sha512-XCuKFP5PS55gnMVu3dty8KPatLqUoy/ZYzDzAGCQ8JNFCkLXzmI7vNHCR+XpbZaMWQK/vQubr7PkYq8g470J/A=="
11 | },
12 | "@types/eslint": {
13 | "version": "8.2.0",
14 | "resolved": "https://registry.npmjs.org/@types/eslint/-/eslint-8.2.0.tgz",
15 | "integrity": "sha512-74hbvsnc+7TEDa1z5YLSe4/q8hGYB3USNvCuzHUJrjPV6hXaq8IXcngCrHkuvFt0+8rFz7xYXrHgNayIX0UZvQ==",
16 | "requires": {
17 | "@types/estree": "*",
18 | "@types/json-schema": "*"
19 | }
20 | },
21 | "@types/eslint-scope": {
22 | "version": "3.7.1",
23 | "resolved": "https://registry.npmjs.org/@types/eslint-scope/-/eslint-scope-3.7.1.tgz",
24 | "integrity": "sha512-SCFeogqiptms4Fg29WpOTk5nHIzfpKCemSN63ksBQYKTcXoJEmJagV+DhVmbapZzY4/5YaOV1nZwrsU79fFm1g==",
25 | "requires": {
26 | "@types/eslint": "*",
27 | "@types/estree": "*"
28 | }
29 | },
30 | "@types/estree": {
31 | "version": "0.0.46",
32 | "resolved": "https://registry.npmjs.org/@types/estree/-/estree-0.0.46.tgz",
33 | "integrity": "sha512-laIjwTQaD+5DukBZaygQ79K1Z0jb1bPEMRrkXSLjtCcZm+abyp5YbrqpSLzD42FwWW6gK/aS4NYpJ804nG2brg=="
34 | },
35 | "@types/json-schema": {
36 | "version": "7.0.9",
37 | "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.9.tgz",
38 | "integrity": "sha512-qcUXuemtEu+E5wZSJHNxUXeCZhAfXKQ41D+duX+VYPde7xyEVZci+/oXKJL13tnRs9lR2pr4fod59GT6/X1/yQ=="
39 | },
40 | "@types/node": {
41 | "version": "16.11.11",
42 | "resolved": "https://registry.npmjs.org/@types/node/-/node-16.11.11.tgz",
43 | "integrity": "sha512-KB0sixD67CeecHC33MYn+eYARkqTheIRNuu97y2XMjR7Wu3XibO1vaY6VBV6O/a89SPI81cEUIYT87UqUWlZNw=="
44 | },
45 | "@webassemblyjs/ast": {
46 | "version": "1.11.1",
47 | "resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.11.1.tgz",
48 | "integrity": "sha512-ukBh14qFLjxTQNTXocdyksN5QdM28S1CxHt2rdskFyL+xFV7VremuBLVbmCePj+URalXBENx/9Lm7lnhihtCSw==",
49 | "requires": {
50 | "@webassemblyjs/helper-numbers": "1.11.1",
51 | "@webassemblyjs/helper-wasm-bytecode": "1.11.1"
52 | }
53 | },
54 | "@webassemblyjs/floating-point-hex-parser": {
55 | "version": "1.11.1",
56 | "resolved": "https://registry.npmjs.org/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.11.1.tgz",
57 | "integrity": "sha512-iGRfyc5Bq+NnNuX8b5hwBrRjzf0ocrJPI6GWFodBFzmFnyvrQ83SHKhmilCU/8Jv67i4GJZBMhEzltxzcNagtQ=="
58 | },
59 | "@webassemblyjs/helper-api-error": {
60 | "version": "1.11.1",
61 | "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-api-error/-/helper-api-error-1.11.1.tgz",
62 | "integrity": "sha512-RlhS8CBCXfRUR/cwo2ho9bkheSXG0+NwooXcc3PAILALf2QLdFyj7KGsKRbVc95hZnhnERon4kW/D3SZpp6Tcg=="
63 | },
64 | "@webassemblyjs/helper-buffer": {
65 | "version": "1.11.1",
66 | "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-buffer/-/helper-buffer-1.11.1.tgz",
67 | "integrity": "sha512-gwikF65aDNeeXa8JxXa2BAk+REjSyhrNC9ZwdT0f8jc4dQQeDQ7G4m0f2QCLPJiMTTO6wfDmRmj/pW0PsUvIcA=="
68 | },
69 | "@webassemblyjs/helper-numbers": {
70 | "version": "1.11.1",
71 | "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-numbers/-/helper-numbers-1.11.1.tgz",
72 | "integrity": "sha512-vDkbxiB8zfnPdNK9Rajcey5C0w+QJugEglN0of+kmO8l7lDb77AnlKYQF7aarZuCrv+l0UvqL+68gSDr3k9LPQ==",
73 | "requires": {
74 | "@webassemblyjs/floating-point-hex-parser": "1.11.1",
75 | "@webassemblyjs/helper-api-error": "1.11.1",
76 | "@xtuc/long": "4.2.2"
77 | }
78 | },
79 | "@webassemblyjs/helper-wasm-bytecode": {
80 | "version": "1.11.1",
81 | "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.11.1.tgz",
82 | "integrity": "sha512-PvpoOGiJwXeTrSf/qfudJhwlvDQxFgelbMqtq52WWiXC6Xgg1IREdngmPN3bs4RoO83PnL/nFrxucXj1+BX62Q=="
83 | },
84 | "@webassemblyjs/helper-wasm-section": {
85 | "version": "1.11.1",
86 | "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.11.1.tgz",
87 | "integrity": "sha512-10P9No29rYX1j7F3EVPX3JvGPQPae+AomuSTPiF9eBQeChHI6iqjMIwR9JmOJXwpnn/oVGDk7I5IlskuMwU/pg==",
88 | "requires": {
89 | "@webassemblyjs/ast": "1.11.1",
90 | "@webassemblyjs/helper-buffer": "1.11.1",
91 | "@webassemblyjs/helper-wasm-bytecode": "1.11.1",
92 | "@webassemblyjs/wasm-gen": "1.11.1"
93 | }
94 | },
95 | "@webassemblyjs/ieee754": {
96 | "version": "1.11.1",
97 | "resolved": "https://registry.npmjs.org/@webassemblyjs/ieee754/-/ieee754-1.11.1.tgz",
98 | "integrity": "sha512-hJ87QIPtAMKbFq6CGTkZYJivEwZDbQUgYd3qKSadTNOhVY7p+gfP6Sr0lLRVTaG1JjFj+r3YchoqRYxNH3M0GQ==",
99 | "requires": {
100 | "@xtuc/ieee754": "^1.2.0"
101 | }
102 | },
103 | "@webassemblyjs/leb128": {
104 | "version": "1.11.1",
105 | "resolved": "https://registry.npmjs.org/@webassemblyjs/leb128/-/leb128-1.11.1.tgz",
106 | "integrity": "sha512-BJ2P0hNZ0u+Th1YZXJpzW6miwqQUGcIHT1G/sf72gLVD9DZ5AdYTqPNbHZh6K1M5VmKvFXwGSWZADz+qBWxeRw==",
107 | "requires": {
108 | "@xtuc/long": "4.2.2"
109 | }
110 | },
111 | "@webassemblyjs/utf8": {
112 | "version": "1.11.1",
113 | "resolved": "https://registry.npmjs.org/@webassemblyjs/utf8/-/utf8-1.11.1.tgz",
114 | "integrity": "sha512-9kqcxAEdMhiwQkHpkNiorZzqpGrodQQ2IGrHHxCy+Ozng0ofyMA0lTqiLkVs1uzTRejX+/O0EOT7KxqVPuXosQ=="
115 | },
116 | "@webassemblyjs/wasm-edit": {
117 | "version": "1.11.1",
118 | "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-edit/-/wasm-edit-1.11.1.tgz",
119 | "integrity": "sha512-g+RsupUC1aTHfR8CDgnsVRVZFJqdkFHpsHMfJuWQzWU3tvnLC07UqHICfP+4XyL2tnr1amvl1Sdp06TnYCmVkA==",
120 | "requires": {
121 | "@webassemblyjs/ast": "1.11.1",
122 | "@webassemblyjs/helper-buffer": "1.11.1",
123 | "@webassemblyjs/helper-wasm-bytecode": "1.11.1",
124 | "@webassemblyjs/helper-wasm-section": "1.11.1",
125 | "@webassemblyjs/wasm-gen": "1.11.1",
126 | "@webassemblyjs/wasm-opt": "1.11.1",
127 | "@webassemblyjs/wasm-parser": "1.11.1",
128 | "@webassemblyjs/wast-printer": "1.11.1"
129 | }
130 | },
131 | "@webassemblyjs/wasm-gen": {
132 | "version": "1.11.1",
133 | "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-gen/-/wasm-gen-1.11.1.tgz",
134 | "integrity": "sha512-F7QqKXwwNlMmsulj6+O7r4mmtAlCWfO/0HdgOxSklZfQcDu0TpLiD1mRt/zF25Bk59FIjEuGAIyn5ei4yMfLhA==",
135 | "requires": {
136 | "@webassemblyjs/ast": "1.11.1",
137 | "@webassemblyjs/helper-wasm-bytecode": "1.11.1",
138 | "@webassemblyjs/ieee754": "1.11.1",
139 | "@webassemblyjs/leb128": "1.11.1",
140 | "@webassemblyjs/utf8": "1.11.1"
141 | }
142 | },
143 | "@webassemblyjs/wasm-opt": {
144 | "version": "1.11.1",
145 | "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-opt/-/wasm-opt-1.11.1.tgz",
146 | "integrity": "sha512-VqnkNqnZlU5EB64pp1l7hdm3hmQw7Vgqa0KF/KCNO9sIpI6Fk6brDEiX+iCOYrvMuBWDws0NkTOxYEb85XQHHw==",
147 | "requires": {
148 | "@webassemblyjs/ast": "1.11.1",
149 | "@webassemblyjs/helper-buffer": "1.11.1",
150 | "@webassemblyjs/wasm-gen": "1.11.1",
151 | "@webassemblyjs/wasm-parser": "1.11.1"
152 | }
153 | },
154 | "@webassemblyjs/wasm-parser": {
155 | "version": "1.11.1",
156 | "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-parser/-/wasm-parser-1.11.1.tgz",
157 | "integrity": "sha512-rrBujw+dJu32gYB7/Lup6UhdkPx9S9SnobZzRVL7VcBH9Bt9bCBLEuX/YXOOtBsOZ4NQrRykKhffRWHvigQvOA==",
158 | "requires": {
159 | "@webassemblyjs/ast": "1.11.1",
160 | "@webassemblyjs/helper-api-error": "1.11.1",
161 | "@webassemblyjs/helper-wasm-bytecode": "1.11.1",
162 | "@webassemblyjs/ieee754": "1.11.1",
163 | "@webassemblyjs/leb128": "1.11.1",
164 | "@webassemblyjs/utf8": "1.11.1"
165 | }
166 | },
167 | "@webassemblyjs/wast-printer": {
168 | "version": "1.11.1",
169 | "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-printer/-/wast-printer-1.11.1.tgz",
170 | "integrity": "sha512-IQboUWM4eKzWW+N/jij2sRatKMh99QEelo3Eb2q0qXkvPRISAj8Qxtmw5itwqK+TTkBuUIE45AxYPToqPtL5gg==",
171 | "requires": {
172 | "@webassemblyjs/ast": "1.11.1",
173 | "@xtuc/long": "4.2.2"
174 | }
175 | },
176 | "@xtuc/ieee754": {
177 | "version": "1.2.0",
178 | "resolved": "https://registry.npmjs.org/@xtuc/ieee754/-/ieee754-1.2.0.tgz",
179 | "integrity": "sha512-DX8nKgqcGwsc0eJSqYt5lwP4DH5FlHnmuWWBRy7X0NcaGR0ZtuyeESgMwTYVEtxmsNGY+qit4QYT/MIYTOTPeA=="
180 | },
181 | "@xtuc/long": {
182 | "version": "4.2.2",
183 | "resolved": "https://registry.npmjs.org/@xtuc/long/-/long-4.2.2.tgz",
184 | "integrity": "sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ=="
185 | },
186 | "abab": {
187 | "version": "2.0.5",
188 | "resolved": "https://registry.npmjs.org/abab/-/abab-2.0.5.tgz",
189 | "integrity": "sha512-9IK9EadsbHo6jLWIpxpR6pL0sazTXV6+SQv25ZB+F7Bj9mJNaOc4nCRabwd5M/JwmUa8idz6Eci6eKfJryPs6Q=="
190 | },
191 | "accepts": {
192 | "version": "1.3.7",
193 | "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.7.tgz",
194 | "integrity": "sha512-Il80Qs2WjYlJIBNzNkK6KYqlVMTbZLXgHx2oT0pU/fjRHyEp+PEfEPY0R3WCwAGVOtauxh1hOxNgIf5bv7dQpA==",
195 | "requires": {
196 | "mime-types": "~2.1.24",
197 | "negotiator": "0.6.2"
198 | }
199 | },
200 | "acorn": {
201 | "version": "8.5.0",
202 | "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.5.0.tgz",
203 | "integrity": "sha512-yXbYeFy+jUuYd3/CDcg2NkIYE991XYX/bje7LmjJigUciaeO1JR4XxXgCIV1/Zc/dRuFEyw1L0pbA+qynJkW5Q=="
204 | },
205 | "acorn-globals": {
206 | "version": "6.0.0",
207 | "resolved": "https://registry.npmjs.org/acorn-globals/-/acorn-globals-6.0.0.tgz",
208 | "integrity": "sha512-ZQl7LOWaF5ePqqcX4hLuv/bLXYQNfNWw2c0/yX/TsPRKamzHcTGQnlCjHT3TsmkOUVEPS3crCxiPfdzE/Trlhg==",
209 | "requires": {
210 | "acorn": "^7.1.1",
211 | "acorn-walk": "^7.1.1"
212 | },
213 | "dependencies": {
214 | "acorn": {
215 | "version": "7.4.1",
216 | "resolved": "https://registry.npmjs.org/acorn/-/acorn-7.4.1.tgz",
217 | "integrity": "sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A=="
218 | }
219 | }
220 | },
221 | "acorn-hammerhead": {
222 | "version": "0.5.0",
223 | "resolved": "https://registry.npmjs.org/acorn-hammerhead/-/acorn-hammerhead-0.5.0.tgz",
224 | "integrity": "sha512-TI9TFfJBfduhcM2GggayNhdYvdJ3UgS/Bu3sB7FB2AUmNCmCJ+TSOT6GXu+bodG5/xL74D5zE4XRaqyjgjsYVQ==",
225 | "requires": {
226 | "@types/estree": "0.0.46"
227 | }
228 | },
229 | "acorn-import-assertions": {
230 | "version": "1.8.0",
231 | "resolved": "https://registry.npmjs.org/acorn-import-assertions/-/acorn-import-assertions-1.8.0.tgz",
232 | "integrity": "sha512-m7VZ3jwz4eK6A4Vtt8Ew1/mNbP24u0FhdyfA7fSvnJR6LMdfOYnmuIrrJAgrYfYJ10F/otaHTtrtrtmHdMNzEw=="
233 | },
234 | "acorn-walk": {
235 | "version": "7.2.0",
236 | "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-7.2.0.tgz",
237 | "integrity": "sha512-OPdCF6GsMIP+Az+aWfAAOEt2/+iVDKE7oy6lJ098aoe59oAmK76qV6Gw60SbZ8jHuG2wH058GF4pLFbYamYrVA=="
238 | },
239 | "agent-base": {
240 | "version": "6.0.2",
241 | "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz",
242 | "integrity": "sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==",
243 | "requires": {
244 | "debug": "4"
245 | }
246 | },
247 | "ajv": {
248 | "version": "6.12.6",
249 | "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz",
250 | "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==",
251 | "requires": {
252 | "fast-deep-equal": "^3.1.1",
253 | "fast-json-stable-stringify": "^2.0.0",
254 | "json-schema-traverse": "^0.4.1",
255 | "uri-js": "^4.2.2"
256 | }
257 | },
258 | "ajv-keywords": {
259 | "version": "3.5.2",
260 | "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.5.2.tgz",
261 | "integrity": "sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ=="
262 | },
263 | "array-flatten": {
264 | "version": "1.1.1",
265 | "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz",
266 | "integrity": "sha1-ml9pkFGx5wczKPKgCJaLZOopVdI="
267 | },
268 | "asynckit": {
269 | "version": "0.4.0",
270 | "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz",
271 | "integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k="
272 | },
273 | "body-parser": {
274 | "version": "1.19.0",
275 | "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.19.0.tgz",
276 | "integrity": "sha512-dhEPs72UPbDnAQJ9ZKMNTP6ptJaionhP5cBb541nXPlW60Jepo9RV/a4fX4XWW9CuFNK22krhrj1+rgzifNCsw==",
277 | "requires": {
278 | "bytes": "3.1.0",
279 | "content-type": "~1.0.4",
280 | "debug": "2.6.9",
281 | "depd": "~1.1.2",
282 | "http-errors": "1.7.2",
283 | "iconv-lite": "0.4.24",
284 | "on-finished": "~2.3.0",
285 | "qs": "6.7.0",
286 | "raw-body": "2.4.0",
287 | "type-is": "~1.6.17"
288 | },
289 | "dependencies": {
290 | "debug": {
291 | "version": "2.6.9",
292 | "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
293 | "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
294 | "requires": {
295 | "ms": "2.0.0"
296 | }
297 | },
298 | "iconv-lite": {
299 | "version": "0.4.24",
300 | "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz",
301 | "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==",
302 | "requires": {
303 | "safer-buffer": ">= 2.1.2 < 3"
304 | }
305 | },
306 | "ms": {
307 | "version": "2.0.0",
308 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
309 | "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g="
310 | }
311 | }
312 | },
313 | "browser-process-hrtime": {
314 | "version": "1.0.0",
315 | "resolved": "https://registry.npmjs.org/browser-process-hrtime/-/browser-process-hrtime-1.0.0.tgz",
316 | "integrity": "sha512-9o5UecI3GhkpM6DrXr69PblIuWxPKk9Y0jHBRhdocZ2y7YECBFCsHm79Pr3OyR2AvjhDkabFJaDJMYRazHgsow=="
317 | },
318 | "browserslist": {
319 | "version": "4.18.1",
320 | "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.18.1.tgz",
321 | "integrity": "sha512-8ScCzdpPwR2wQh8IT82CA2VgDwjHyqMovPBZSNH54+tm4Jk2pCuv90gmAdH6J84OCRWi0b4gMe6O6XPXuJnjgQ==",
322 | "requires": {
323 | "caniuse-lite": "^1.0.30001280",
324 | "electron-to-chromium": "^1.3.896",
325 | "escalade": "^3.1.1",
326 | "node-releases": "^2.0.1",
327 | "picocolors": "^1.0.0"
328 | }
329 | },
330 | "buffer-from": {
331 | "version": "1.1.2",
332 | "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz",
333 | "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ=="
334 | },
335 | "bytes": {
336 | "version": "3.1.0",
337 | "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.0.tgz",
338 | "integrity": "sha512-zauLjrfCG+xvoyaqLoV8bLVXXNGC4JqlxFCutSDWA6fJrTo2ZuvLYTqZ7aHBLZSMOopbzwv8f+wZcVzfVTI2Dg=="
339 | },
340 | "caniuse-lite": {
341 | "version": "1.0.30001283",
342 | "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001283.tgz",
343 | "integrity": "sha512-9RoKo841j1GQFSJz/nCXOj0sD7tHBtlowjYlrqIUS812x9/emfBLBt6IyMz1zIaYc/eRL8Cs6HPUVi2Hzq4sIg=="
344 | },
345 | "chrome-trace-event": {
346 | "version": "1.0.3",
347 | "resolved": "https://registry.npmjs.org/chrome-trace-event/-/chrome-trace-event-1.0.3.tgz",
348 | "integrity": "sha512-p3KULyQg4S7NIHixdwbGX+nFHkoBiA4YQmyWtjb8XngSKV124nJmRysgAeujbUVb15vh+RvFUfCPqU7rXk+hZg=="
349 | },
350 | "combined-stream": {
351 | "version": "1.0.8",
352 | "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz",
353 | "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==",
354 | "requires": {
355 | "delayed-stream": "~1.0.0"
356 | }
357 | },
358 | "commander": {
359 | "version": "2.20.3",
360 | "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz",
361 | "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ=="
362 | },
363 | "content-disposition": {
364 | "version": "0.5.3",
365 | "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.3.tgz",
366 | "integrity": "sha512-ExO0774ikEObIAEV9kDo50o+79VCUdEB6n6lzKgGwupcVeRlhrj3qGAfwq8G6uBJjkqLrhT0qEYFcWng8z1z0g==",
367 | "requires": {
368 | "safe-buffer": "5.1.2"
369 | }
370 | },
371 | "content-type": {
372 | "version": "1.0.4",
373 | "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.4.tgz",
374 | "integrity": "sha512-hIP3EEPs8tB9AT1L+NUqtwOAps4mk2Zob89MWXMHjHWg9milF/j4osnnQLXBCBFBk/tvIG/tUc9mOUJiPBhPXA=="
375 | },
376 | "cookie": {
377 | "version": "0.4.0",
378 | "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.4.0.tgz",
379 | "integrity": "sha512-+Hp8fLp57wnUSt0tY0tHEXh4voZRDnoIrZPqlo3DPiI4y9lwg/jqx+1Om94/W6ZaPDOUbnjOt/99w66zk+l1Xg=="
380 | },
381 | "cookie-signature": {
382 | "version": "1.0.6",
383 | "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz",
384 | "integrity": "sha1-4wOogrNCzD7oylE6eZmXNNqzriw="
385 | },
386 | "css-tree": {
387 | "version": "1.1.3",
388 | "resolved": "https://registry.npmjs.org/css-tree/-/css-tree-1.1.3.tgz",
389 | "integrity": "sha512-tRpdppF7TRazZrjJ6v3stzv93qxRcSsFmW6cX0Zm2NVKpxE1WV1HblnghVv9TreireHkqI/VDEsfolRF1p6y7Q==",
390 | "requires": {
391 | "mdn-data": "2.0.14",
392 | "source-map": "^0.6.1"
393 | }
394 | },
395 | "cssom": {
396 | "version": "0.5.0",
397 | "resolved": "https://registry.npmjs.org/cssom/-/cssom-0.5.0.tgz",
398 | "integrity": "sha512-iKuQcq+NdHqlAcwUY0o/HL69XQrUaQdMjmStJ8JFmUaiiQErlhrmuigkg/CU4E2J0IyUKUrMAgl36TvN67MqTw=="
399 | },
400 | "cssstyle": {
401 | "version": "2.3.0",
402 | "resolved": "https://registry.npmjs.org/cssstyle/-/cssstyle-2.3.0.tgz",
403 | "integrity": "sha512-AZL67abkUzIuvcHqk7c09cezpGNcxUxU4Ioi/05xHk4DQeTkWmGYftIE6ctU6AEt+Gn4n1lDStOtj7FKycP71A==",
404 | "requires": {
405 | "cssom": "~0.3.6"
406 | },
407 | "dependencies": {
408 | "cssom": {
409 | "version": "0.3.8",
410 | "resolved": "https://registry.npmjs.org/cssom/-/cssom-0.3.8.tgz",
411 | "integrity": "sha512-b0tGHbfegbhPJpxpiBPU2sCkigAqtM9O121le6bbOlgyV+NyGyCmVfJ6QW9eRjz8CpNfWEOYBIMIGRYkLwsIYg=="
412 | }
413 | }
414 | },
415 | "data-urls": {
416 | "version": "3.0.1",
417 | "resolved": "https://registry.npmjs.org/data-urls/-/data-urls-3.0.1.tgz",
418 | "integrity": "sha512-Ds554NeT5Gennfoo9KN50Vh6tpgtvYEwraYjejXnyTpu1C7oXKxdFk75REooENHE8ndTVOJuv+BEs4/J/xcozw==",
419 | "requires": {
420 | "abab": "^2.0.3",
421 | "whatwg-mimetype": "^3.0.0",
422 | "whatwg-url": "^10.0.0"
423 | }
424 | },
425 | "debug": {
426 | "version": "4.3.2",
427 | "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.2.tgz",
428 | "integrity": "sha512-mOp8wKcvj7XxC78zLgw/ZA+6TSgkoE2C/ienthhRD298T7UNwAg9diBpLRxC0mOezLl4B0xV7M0cCO6P/O0Xhw==",
429 | "requires": {
430 | "ms": "2.1.2"
431 | }
432 | },
433 | "decimal.js": {
434 | "version": "10.3.1",
435 | "resolved": "https://registry.npmjs.org/decimal.js/-/decimal.js-10.3.1.tgz",
436 | "integrity": "sha512-V0pfhfr8suzyPGOx3nmq4aHqabehUZn6Ch9kyFpV79TGDTWFmHqUqXdabR7QHqxzrYolF4+tVmJhUG4OURg5dQ=="
437 | },
438 | "deep-is": {
439 | "version": "0.1.4",
440 | "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz",
441 | "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ=="
442 | },
443 | "delayed-stream": {
444 | "version": "1.0.0",
445 | "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz",
446 | "integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk="
447 | },
448 | "depd": {
449 | "version": "1.1.2",
450 | "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz",
451 | "integrity": "sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak="
452 | },
453 | "destroy": {
454 | "version": "1.0.4",
455 | "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.0.4.tgz",
456 | "integrity": "sha1-l4hXRCxEdJ5CBmE+N5RiBYJqvYA="
457 | },
458 | "domexception": {
459 | "version": "4.0.0",
460 | "resolved": "https://registry.npmjs.org/domexception/-/domexception-4.0.0.tgz",
461 | "integrity": "sha512-A2is4PLG+eeSfoTMA95/s4pvAoSo2mKtiM5jlHkAVewmiO8ISFTFKZjH7UAM1Atli/OT/7JHOrJRJiMKUZKYBw==",
462 | "requires": {
463 | "webidl-conversions": "^7.0.0"
464 | }
465 | },
466 | "ee-first": {
467 | "version": "1.1.1",
468 | "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz",
469 | "integrity": "sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0="
470 | },
471 | "electron-to-chromium": {
472 | "version": "1.4.5",
473 | "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.5.tgz",
474 | "integrity": "sha512-YKaB+t8ul5crdh6OeqT2qXdxJGI0fAYb6/X8pDIyye+c3a7ndOCk5gVeKX+ABwivCGNS56vOAif3TN0qJMpEHw=="
475 | },
476 | "encodeurl": {
477 | "version": "1.0.2",
478 | "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz",
479 | "integrity": "sha1-rT/0yG7C0CkyL1oCw6mmBslbP1k="
480 | },
481 | "enhanced-resolve": {
482 | "version": "5.8.3",
483 | "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.8.3.tgz",
484 | "integrity": "sha512-EGAbGvH7j7Xt2nc0E7D99La1OiEs8LnyimkRgwExpUMScN6O+3x9tIWs7PLQZVNx4YD+00skHXPXi1yQHpAmZA==",
485 | "requires": {
486 | "graceful-fs": "^4.2.4",
487 | "tapable": "^2.2.0"
488 | }
489 | },
490 | "es-module-lexer": {
491 | "version": "0.9.3",
492 | "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-0.9.3.tgz",
493 | "integrity": "sha512-1HQ2M2sPtxwnvOvT1ZClHyQDiggdNjURWpY2we6aMKCQiUVxTmVs2UYPLIrD84sS+kMdUwfBSylbJPwNnBrnHQ=="
494 | },
495 | "escalade": {
496 | "version": "3.1.1",
497 | "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz",
498 | "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw=="
499 | },
500 | "escape-html": {
501 | "version": "1.0.3",
502 | "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz",
503 | "integrity": "sha1-Aljq5NPQwJdN4cFpGI7wBR0dGYg="
504 | },
505 | "escodegen": {
506 | "version": "2.0.0",
507 | "resolved": "https://registry.npmjs.org/escodegen/-/escodegen-2.0.0.tgz",
508 | "integrity": "sha512-mmHKys/C8BFUGI+MAWNcSYoORYLMdPzjrknd2Vc+bUsjN5bXcr8EhrNB+UTqfL1y3I9c4fw2ihgtMPQLBRiQxw==",
509 | "requires": {
510 | "esprima": "^4.0.1",
511 | "estraverse": "^5.2.0",
512 | "esutils": "^2.0.2",
513 | "optionator": "^0.8.1",
514 | "source-map": "~0.6.1"
515 | }
516 | },
517 | "eslint-scope": {
518 | "version": "5.1.1",
519 | "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz",
520 | "integrity": "sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==",
521 | "requires": {
522 | "esrecurse": "^4.3.0",
523 | "estraverse": "^4.1.1"
524 | },
525 | "dependencies": {
526 | "estraverse": {
527 | "version": "4.3.0",
528 | "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz",
529 | "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw=="
530 | }
531 | }
532 | },
533 | "esprima": {
534 | "version": "4.0.1",
535 | "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz",
536 | "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A=="
537 | },
538 | "esrecurse": {
539 | "version": "4.3.0",
540 | "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz",
541 | "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==",
542 | "requires": {
543 | "estraverse": "^5.2.0"
544 | }
545 | },
546 | "estraverse": {
547 | "version": "5.3.0",
548 | "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz",
549 | "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA=="
550 | },
551 | "esutils": {
552 | "version": "2.0.3",
553 | "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz",
554 | "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g=="
555 | },
556 | "etag": {
557 | "version": "1.8.1",
558 | "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz",
559 | "integrity": "sha1-Qa4u62XvpiJorr/qg6x9eSmbCIc="
560 | },
561 | "events": {
562 | "version": "3.3.0",
563 | "resolved": "https://registry.npmjs.org/events/-/events-3.3.0.tgz",
564 | "integrity": "sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q=="
565 | },
566 | "express": {
567 | "version": "4.17.1",
568 | "resolved": "https://registry.npmjs.org/express/-/express-4.17.1.tgz",
569 | "integrity": "sha512-mHJ9O79RqluphRrcw2X/GTh3k9tVv8YcoyY4Kkh4WDMUYKRZUq0h1o0w2rrrxBqM7VoeUVqgb27xlEMXTnYt4g==",
570 | "requires": {
571 | "accepts": "~1.3.7",
572 | "array-flatten": "1.1.1",
573 | "body-parser": "1.19.0",
574 | "content-disposition": "0.5.3",
575 | "content-type": "~1.0.4",
576 | "cookie": "0.4.0",
577 | "cookie-signature": "1.0.6",
578 | "debug": "2.6.9",
579 | "depd": "~1.1.2",
580 | "encodeurl": "~1.0.2",
581 | "escape-html": "~1.0.3",
582 | "etag": "~1.8.1",
583 | "finalhandler": "~1.1.2",
584 | "fresh": "0.5.2",
585 | "merge-descriptors": "1.0.1",
586 | "methods": "~1.1.2",
587 | "on-finished": "~2.3.0",
588 | "parseurl": "~1.3.3",
589 | "path-to-regexp": "0.1.7",
590 | "proxy-addr": "~2.0.5",
591 | "qs": "6.7.0",
592 | "range-parser": "~1.2.1",
593 | "safe-buffer": "5.1.2",
594 | "send": "0.17.1",
595 | "serve-static": "1.14.1",
596 | "setprototypeof": "1.1.1",
597 | "statuses": "~1.5.0",
598 | "type-is": "~1.6.18",
599 | "utils-merge": "1.0.1",
600 | "vary": "~1.1.2"
601 | },
602 | "dependencies": {
603 | "debug": {
604 | "version": "2.6.9",
605 | "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
606 | "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
607 | "requires": {
608 | "ms": "2.0.0"
609 | }
610 | },
611 | "ms": {
612 | "version": "2.0.0",
613 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
614 | "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g="
615 | }
616 | }
617 | },
618 | "fast-deep-equal": {
619 | "version": "3.1.3",
620 | "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz",
621 | "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q=="
622 | },
623 | "fast-json-stable-stringify": {
624 | "version": "2.1.0",
625 | "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz",
626 | "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw=="
627 | },
628 | "fast-levenshtein": {
629 | "version": "2.0.6",
630 | "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz",
631 | "integrity": "sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc="
632 | },
633 | "finalhandler": {
634 | "version": "1.1.2",
635 | "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.1.2.tgz",
636 | "integrity": "sha512-aAWcW57uxVNrQZqFXjITpW3sIUQmHGG3qSb9mUah9MgMC4NeWhNOlNjXEYq3HjRAvL6arUviZGGJsBg6z0zsWA==",
637 | "requires": {
638 | "debug": "2.6.9",
639 | "encodeurl": "~1.0.2",
640 | "escape-html": "~1.0.3",
641 | "on-finished": "~2.3.0",
642 | "parseurl": "~1.3.3",
643 | "statuses": "~1.5.0",
644 | "unpipe": "~1.0.0"
645 | },
646 | "dependencies": {
647 | "debug": {
648 | "version": "2.6.9",
649 | "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
650 | "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
651 | "requires": {
652 | "ms": "2.0.0"
653 | }
654 | },
655 | "ms": {
656 | "version": "2.0.0",
657 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
658 | "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g="
659 | }
660 | }
661 | },
662 | "form-data": {
663 | "version": "4.0.0",
664 | "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.0.tgz",
665 | "integrity": "sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==",
666 | "requires": {
667 | "asynckit": "^0.4.0",
668 | "combined-stream": "^1.0.8",
669 | "mime-types": "^2.1.12"
670 | }
671 | },
672 | "forwarded": {
673 | "version": "0.2.0",
674 | "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz",
675 | "integrity": "sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow=="
676 | },
677 | "fresh": {
678 | "version": "0.5.2",
679 | "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz",
680 | "integrity": "sha1-PYyt2Q2XZWn6g1qx+OSyOhBWBac="
681 | },
682 | "glob-to-regexp": {
683 | "version": "0.4.1",
684 | "resolved": "https://registry.npmjs.org/glob-to-regexp/-/glob-to-regexp-0.4.1.tgz",
685 | "integrity": "sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw=="
686 | },
687 | "graceful-fs": {
688 | "version": "4.2.8",
689 | "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.8.tgz",
690 | "integrity": "sha512-qkIilPUYcNhJpd33n0GBXTB1MMPp14TxEsEs0pTrsSVucApsYzW5V+Q8Qxhik6KU3evy+qkAAowTByymK0avdg=="
691 | },
692 | "has-flag": {
693 | "version": "4.0.0",
694 | "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz",
695 | "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ=="
696 | },
697 | "html-encoding-sniffer": {
698 | "version": "3.0.0",
699 | "resolved": "https://registry.npmjs.org/html-encoding-sniffer/-/html-encoding-sniffer-3.0.0.tgz",
700 | "integrity": "sha512-oWv4T4yJ52iKrufjnyZPkrN0CH3QnrUqdB6In1g5Fe1mia8GmF36gnfNySxoZtxD5+NmYw1EElVXiBk93UeskA==",
701 | "requires": {
702 | "whatwg-encoding": "^2.0.0"
703 | }
704 | },
705 | "http-errors": {
706 | "version": "1.7.2",
707 | "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.7.2.tgz",
708 | "integrity": "sha512-uUQBt3H/cSIVfch6i1EuPNy/YsRSOUBXTVfZ+yR7Zjez3qjBz6i9+i4zjNaoqcoFVI4lQJ5plg63TvGfRSDCRg==",
709 | "requires": {
710 | "depd": "~1.1.2",
711 | "inherits": "2.0.3",
712 | "setprototypeof": "1.1.1",
713 | "statuses": ">= 1.5.0 < 2",
714 | "toidentifier": "1.0.0"
715 | }
716 | },
717 | "http-proxy-agent": {
718 | "version": "5.0.0",
719 | "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-5.0.0.tgz",
720 | "integrity": "sha512-n2hY8YdoRE1i7r6M0w9DIw5GgZN0G25P8zLCRQ8rjXtTU3vsNFBI/vWK/UIeE6g5MUUz6avwAPXmL6Fy9D/90w==",
721 | "requires": {
722 | "@tootallnate/once": "2",
723 | "agent-base": "6",
724 | "debug": "4"
725 | }
726 | },
727 | "https-proxy-agent": {
728 | "version": "5.0.0",
729 | "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.0.tgz",
730 | "integrity": "sha512-EkYm5BcKUGiduxzSt3Eppko+PiNWNEpa4ySk9vTC6wDsQJW9rHSa+UhGNJoRYp7bz6Ht1eaRIa6QaJqO5rCFbA==",
731 | "requires": {
732 | "agent-base": "6",
733 | "debug": "4"
734 | }
735 | },
736 | "iconv-lite": {
737 | "version": "0.6.3",
738 | "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz",
739 | "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==",
740 | "requires": {
741 | "safer-buffer": ">= 2.1.2 < 3.0.0"
742 | }
743 | },
744 | "inherits": {
745 | "version": "2.0.3",
746 | "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz",
747 | "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4="
748 | },
749 | "ipaddr.js": {
750 | "version": "1.9.1",
751 | "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz",
752 | "integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g=="
753 | },
754 | "is-potential-custom-element-name": {
755 | "version": "1.0.1",
756 | "resolved": "https://registry.npmjs.org/is-potential-custom-element-name/-/is-potential-custom-element-name-1.0.1.tgz",
757 | "integrity": "sha512-bCYeRA2rVibKZd+s2625gGnGF/t7DSqDs4dP7CrLA1m7jKWz6pps0LpYLJN8Q64HtmPKJ1hrN3nzPNKFEKOUiQ=="
758 | },
759 | "jest-worker": {
760 | "version": "27.4.2",
761 | "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-27.4.2.tgz",
762 | "integrity": "sha512-0QMy/zPovLfUPyHuOuuU4E+kGACXXE84nRnq6lBVI9GJg5DCBiA97SATi+ZP8CpiJwEQy1oCPjRBf8AnLjN+Ag==",
763 | "requires": {
764 | "@types/node": "*",
765 | "merge-stream": "^2.0.0",
766 | "supports-color": "^8.0.0"
767 | }
768 | },
769 | "jsdom": {
770 | "version": "18.0.0",
771 | "resolved": "https://registry.npmjs.org/jsdom/-/jsdom-18.0.0.tgz",
772 | "integrity": "sha512-HVLuBcFmwdWulStv5U+J59b1AyzXhM92KXlM8HQ3ecYtRM2OQEUCPMa4oNuDeCBmtRcC7tJvb0Xz5OeFXMOKTA==",
773 | "requires": {
774 | "abab": "^2.0.5",
775 | "acorn": "^8.5.0",
776 | "acorn-globals": "^6.0.0",
777 | "cssom": "^0.5.0",
778 | "cssstyle": "^2.3.0",
779 | "data-urls": "^3.0.1",
780 | "decimal.js": "^10.3.1",
781 | "domexception": "^4.0.0",
782 | "escodegen": "^2.0.0",
783 | "form-data": "^4.0.0",
784 | "html-encoding-sniffer": "^3.0.0",
785 | "http-proxy-agent": "^5.0.0",
786 | "https-proxy-agent": "^5.0.0",
787 | "is-potential-custom-element-name": "^1.0.1",
788 | "nwsapi": "^2.2.0",
789 | "parse5": "6.0.1",
790 | "saxes": "^5.0.1",
791 | "symbol-tree": "^3.2.4",
792 | "tough-cookie": "^4.0.0",
793 | "w3c-hr-time": "^1.0.2",
794 | "w3c-xmlserializer": "^3.0.0",
795 | "webidl-conversions": "^7.0.0",
796 | "whatwg-encoding": "^2.0.0",
797 | "whatwg-mimetype": "^3.0.0",
798 | "whatwg-url": "^10.0.0",
799 | "ws": "^8.2.3",
800 | "xml-name-validator": "^4.0.0"
801 | }
802 | },
803 | "json-parse-better-errors": {
804 | "version": "1.0.2",
805 | "resolved": "https://registry.npmjs.org/json-parse-better-errors/-/json-parse-better-errors-1.0.2.tgz",
806 | "integrity": "sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw=="
807 | },
808 | "json-schema-traverse": {
809 | "version": "0.4.1",
810 | "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz",
811 | "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg=="
812 | },
813 | "levn": {
814 | "version": "0.3.0",
815 | "resolved": "https://registry.npmjs.org/levn/-/levn-0.3.0.tgz",
816 | "integrity": "sha1-OwmSTt+fCDwEkP3UwLxEIeBHZO4=",
817 | "requires": {
818 | "prelude-ls": "~1.1.2",
819 | "type-check": "~0.3.2"
820 | }
821 | },
822 | "loader-runner": {
823 | "version": "4.2.0",
824 | "resolved": "https://registry.npmjs.org/loader-runner/-/loader-runner-4.2.0.tgz",
825 | "integrity": "sha512-92+huvxMvYlMzMt0iIOukcwYBFpkYJdpl2xsZ7LrlayO7E8SOv+JJUEK17B/dJIHAOLMfh2dZZ/Y18WgmGtYNw=="
826 | },
827 | "mdn-data": {
828 | "version": "2.0.14",
829 | "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.0.14.tgz",
830 | "integrity": "sha512-dn6wd0uw5GsdswPFfsgMp5NSB0/aDe6fK94YJV/AJDYXL6HVLWBsxeq7js7Ad+mU2K9LAlwpk6kN2D5mwCPVow=="
831 | },
832 | "media-typer": {
833 | "version": "0.3.0",
834 | "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz",
835 | "integrity": "sha1-hxDXrwqmJvj/+hzgAWhUUmMlV0g="
836 | },
837 | "merge-descriptors": {
838 | "version": "1.0.1",
839 | "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz",
840 | "integrity": "sha1-sAqqVW3YtEVoFQ7J0blT8/kMu2E="
841 | },
842 | "merge-stream": {
843 | "version": "2.0.0",
844 | "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz",
845 | "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w=="
846 | },
847 | "methods": {
848 | "version": "1.1.2",
849 | "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz",
850 | "integrity": "sha1-VSmk1nZUE07cxSZmVoNbD4Ua/O4="
851 | },
852 | "mime": {
853 | "version": "2.5.2",
854 | "resolved": "https://registry.npmjs.org/mime/-/mime-2.5.2.tgz",
855 | "integrity": "sha512-tqkh47FzKeCPD2PUiPB6pkbMzsCasjxAfC62/Wap5qrUWcb+sFasXUC5I3gYM5iBM8v/Qpn4UK0x+j0iHyFPDg=="
856 | },
857 | "mime-db": {
858 | "version": "1.50.0",
859 | "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.50.0.tgz",
860 | "integrity": "sha512-9tMZCDlYHqeERXEHO9f/hKfNXhre5dK2eE/krIvUjZbS2KPcqGDfNShIWS1uW9XOTKQKqK6qbeOci18rbfW77A=="
861 | },
862 | "mime-types": {
863 | "version": "2.1.33",
864 | "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.33.tgz",
865 | "integrity": "sha512-plLElXp7pRDd0bNZHw+nMd52vRYjLwQjygaNg7ddJ2uJtTlmnTCjWuPKxVu6//AdaRuME84SvLW91sIkBqGT0g==",
866 | "requires": {
867 | "mime-db": "1.50.0"
868 | }
869 | },
870 | "ms": {
871 | "version": "2.1.2",
872 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz",
873 | "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w=="
874 | },
875 | "negotiator": {
876 | "version": "0.6.2",
877 | "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.2.tgz",
878 | "integrity": "sha512-hZXc7K2e+PgeI1eDBe/10Ard4ekbfrrqG8Ep+8Jmf4JID2bNg7NvCPOZN+kfF574pFQI7mum2AUqDidoKqcTOw=="
879 | },
880 | "neo-async": {
881 | "version": "2.6.2",
882 | "resolved": "https://registry.npmjs.org/neo-async/-/neo-async-2.6.2.tgz",
883 | "integrity": "sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw=="
884 | },
885 | "node-releases": {
886 | "version": "2.0.1",
887 | "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.1.tgz",
888 | "integrity": "sha512-CqyzN6z7Q6aMeF/ktcMVTzhAHCEpf8SOarwpzpf8pNBY2k5/oM34UHldUwp8VKI7uxct2HxSRdJjBaZeESzcxA=="
889 | },
890 | "nwsapi": {
891 | "version": "2.2.0",
892 | "resolved": "https://registry.npmjs.org/nwsapi/-/nwsapi-2.2.0.tgz",
893 | "integrity": "sha512-h2AatdwYH+JHiZpv7pt/gSX1XoRGb7L/qSIeuqA6GwYoF9w1vP1cw42TO0aI2pNyshRK5893hNSl+1//vHK7hQ=="
894 | },
895 | "on-finished": {
896 | "version": "2.3.0",
897 | "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.3.0.tgz",
898 | "integrity": "sha1-IPEzZIGwg811M3mSoWlxqi2QaUc=",
899 | "requires": {
900 | "ee-first": "1.1.1"
901 | }
902 | },
903 | "optionator": {
904 | "version": "0.8.3",
905 | "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.8.3.tgz",
906 | "integrity": "sha512-+IW9pACdk3XWmmTXG8m3upGUJst5XRGzxMRjXzAuJ1XnIFNvfhjjIuYkDvysnPQ7qzqVzLt78BCruntqRhWQbA==",
907 | "requires": {
908 | "deep-is": "~0.1.3",
909 | "fast-levenshtein": "~2.0.6",
910 | "levn": "~0.3.0",
911 | "prelude-ls": "~1.1.2",
912 | "type-check": "~0.3.2",
913 | "word-wrap": "~1.2.3"
914 | }
915 | },
916 | "parse5": {
917 | "version": "6.0.1",
918 | "resolved": "https://registry.npmjs.org/parse5/-/parse5-6.0.1.tgz",
919 | "integrity": "sha512-Ofn/CTFzRGTTxwpNEs9PP93gXShHcTq255nzRYSKe8AkVpZY7e1fpmTfOyoIvjP5HG7Z2ZM7VS9PPhQGW2pOpw=="
920 | },
921 | "parseurl": {
922 | "version": "1.3.3",
923 | "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz",
924 | "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ=="
925 | },
926 | "path-to-regexp": {
927 | "version": "0.1.7",
928 | "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz",
929 | "integrity": "sha1-32BBeABfUi8V60SQ5yR6G/qmf4w="
930 | },
931 | "picocolors": {
932 | "version": "1.0.0",
933 | "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz",
934 | "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ=="
935 | },
936 | "prelude-ls": {
937 | "version": "1.1.2",
938 | "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.1.2.tgz",
939 | "integrity": "sha1-IZMqVJ9eUv/ZqCf1cOBL5iqX2lQ="
940 | },
941 | "proxy-addr": {
942 | "version": "2.0.7",
943 | "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.7.tgz",
944 | "integrity": "sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==",
945 | "requires": {
946 | "forwarded": "0.2.0",
947 | "ipaddr.js": "1.9.1"
948 | }
949 | },
950 | "psl": {
951 | "version": "1.8.0",
952 | "resolved": "https://registry.npmjs.org/psl/-/psl-1.8.0.tgz",
953 | "integrity": "sha512-RIdOzyoavK+hA18OGGWDqUTsCLhtA7IcZ/6NCs4fFJaHBDab+pDDmDIByWFRQJq2Cd7r1OoQxBGKOaztq+hjIQ=="
954 | },
955 | "punycode": {
956 | "version": "2.1.1",
957 | "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz",
958 | "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A=="
959 | },
960 | "qs": {
961 | "version": "6.7.0",
962 | "resolved": "https://registry.npmjs.org/qs/-/qs-6.7.0.tgz",
963 | "integrity": "sha512-VCdBRNFTX1fyE7Nb6FYoURo/SPe62QCaAyzJvUjwRaIsc+NePBEniHlvxFmmX56+HZphIGtV0XeCirBtpDrTyQ=="
964 | },
965 | "randombytes": {
966 | "version": "2.1.0",
967 | "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz",
968 | "integrity": "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==",
969 | "requires": {
970 | "safe-buffer": "^5.1.0"
971 | }
972 | },
973 | "range-parser": {
974 | "version": "1.2.1",
975 | "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz",
976 | "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg=="
977 | },
978 | "raw-body": {
979 | "version": "2.4.0",
980 | "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.4.0.tgz",
981 | "integrity": "sha512-4Oz8DUIwdvoa5qMJelxipzi/iJIi40O5cGV1wNYp5hvZP8ZN0T+jiNkL0QepXs+EsQ9XJ8ipEDoiH70ySUJP3Q==",
982 | "requires": {
983 | "bytes": "3.1.0",
984 | "http-errors": "1.7.2",
985 | "iconv-lite": "0.4.24",
986 | "unpipe": "1.0.0"
987 | },
988 | "dependencies": {
989 | "iconv-lite": {
990 | "version": "0.4.24",
991 | "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz",
992 | "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==",
993 | "requires": {
994 | "safer-buffer": ">= 2.1.2 < 3"
995 | }
996 | }
997 | }
998 | },
999 | "safe-buffer": {
1000 | "version": "5.1.2",
1001 | "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz",
1002 | "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g=="
1003 | },
1004 | "safer-buffer": {
1005 | "version": "2.1.2",
1006 | "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz",
1007 | "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg=="
1008 | },
1009 | "saxes": {
1010 | "version": "5.0.1",
1011 | "resolved": "https://registry.npmjs.org/saxes/-/saxes-5.0.1.tgz",
1012 | "integrity": "sha512-5LBh1Tls8c9xgGjw3QrMwETmTMVk0oFgvrFSvWx62llR2hcEInrKNZ2GZCCuuy2lvWrdl5jhbpeqc5hRYKFOcw==",
1013 | "requires": {
1014 | "xmlchars": "^2.2.0"
1015 | }
1016 | },
1017 | "schema-utils": {
1018 | "version": "3.1.1",
1019 | "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.1.1.tgz",
1020 | "integrity": "sha512-Y5PQxS4ITlC+EahLuXaY86TXfR7Dc5lw294alXOq86JAHCihAIZfqv8nNCWvaEJvaC51uN9hbLGeV0cFBdH+Fw==",
1021 | "requires": {
1022 | "@types/json-schema": "^7.0.8",
1023 | "ajv": "^6.12.5",
1024 | "ajv-keywords": "^3.5.2"
1025 | }
1026 | },
1027 | "send": {
1028 | "version": "0.17.1",
1029 | "resolved": "https://registry.npmjs.org/send/-/send-0.17.1.tgz",
1030 | "integrity": "sha512-BsVKsiGcQMFwT8UxypobUKyv7irCNRHk1T0G680vk88yf6LBByGcZJOTJCrTP2xVN6yI+XjPJcNuE3V4fT9sAg==",
1031 | "requires": {
1032 | "debug": "2.6.9",
1033 | "depd": "~1.1.2",
1034 | "destroy": "~1.0.4",
1035 | "encodeurl": "~1.0.2",
1036 | "escape-html": "~1.0.3",
1037 | "etag": "~1.8.1",
1038 | "fresh": "0.5.2",
1039 | "http-errors": "~1.7.2",
1040 | "mime": "1.6.0",
1041 | "ms": "2.1.1",
1042 | "on-finished": "~2.3.0",
1043 | "range-parser": "~1.2.1",
1044 | "statuses": "~1.5.0"
1045 | },
1046 | "dependencies": {
1047 | "debug": {
1048 | "version": "2.6.9",
1049 | "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
1050 | "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
1051 | "requires": {
1052 | "ms": "2.0.0"
1053 | },
1054 | "dependencies": {
1055 | "ms": {
1056 | "version": "2.0.0",
1057 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
1058 | "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g="
1059 | }
1060 | }
1061 | },
1062 | "mime": {
1063 | "version": "1.6.0",
1064 | "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz",
1065 | "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg=="
1066 | },
1067 | "ms": {
1068 | "version": "2.1.1",
1069 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.1.tgz",
1070 | "integrity": "sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg=="
1071 | }
1072 | }
1073 | },
1074 | "serialize-javascript": {
1075 | "version": "6.0.0",
1076 | "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-6.0.0.tgz",
1077 | "integrity": "sha512-Qr3TosvguFt8ePWqsvRfrKyQXIiW+nGbYpy8XK24NQHE83caxWt+mIymTT19DGFbNWNLfEwsrkSmN64lVWB9ag==",
1078 | "requires": {
1079 | "randombytes": "^2.1.0"
1080 | }
1081 | },
1082 | "serve-static": {
1083 | "version": "1.14.1",
1084 | "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.14.1.tgz",
1085 | "integrity": "sha512-JMrvUwE54emCYWlTI+hGrGv5I8dEwmco/00EvkzIIsR7MqrHonbD9pO2MOfFnpFntl7ecpZs+3mW+XbQZu9QCg==",
1086 | "requires": {
1087 | "encodeurl": "~1.0.2",
1088 | "escape-html": "~1.0.3",
1089 | "parseurl": "~1.3.3",
1090 | "send": "0.17.1"
1091 | }
1092 | },
1093 | "setprototypeof": {
1094 | "version": "1.1.1",
1095 | "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.1.tgz",
1096 | "integrity": "sha512-JvdAWfbXeIGaZ9cILp38HntZSFSo3mWg6xGcJJsd+d4aRMOqauag1C63dJfDw7OaMYwEbHMOxEZ1lqVRYP2OAw=="
1097 | },
1098 | "source-map": {
1099 | "version": "0.6.1",
1100 | "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
1101 | "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g=="
1102 | },
1103 | "source-map-support": {
1104 | "version": "0.5.21",
1105 | "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.21.tgz",
1106 | "integrity": "sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==",
1107 | "requires": {
1108 | "buffer-from": "^1.0.0",
1109 | "source-map": "^0.6.0"
1110 | }
1111 | },
1112 | "statuses": {
1113 | "version": "1.5.0",
1114 | "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz",
1115 | "integrity": "sha1-Fhx9rBd2Wf2YEfQ3cfqZOBR4Yow="
1116 | },
1117 | "supports-color": {
1118 | "version": "8.1.1",
1119 | "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz",
1120 | "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==",
1121 | "requires": {
1122 | "has-flag": "^4.0.0"
1123 | }
1124 | },
1125 | "symbol-tree": {
1126 | "version": "3.2.4",
1127 | "resolved": "https://registry.npmjs.org/symbol-tree/-/symbol-tree-3.2.4.tgz",
1128 | "integrity": "sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw=="
1129 | },
1130 | "tapable": {
1131 | "version": "2.2.1",
1132 | "resolved": "https://registry.npmjs.org/tapable/-/tapable-2.2.1.tgz",
1133 | "integrity": "sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ=="
1134 | },
1135 | "terser": {
1136 | "version": "5.10.0",
1137 | "resolved": "https://registry.npmjs.org/terser/-/terser-5.10.0.tgz",
1138 | "integrity": "sha512-AMmF99DMfEDiRJfxfY5jj5wNH/bYO09cniSqhfoyxc8sFoYIgkJy86G04UoZU5VjlpnplVu0K6Tx6E9b5+DlHA==",
1139 | "requires": {
1140 | "commander": "^2.20.0",
1141 | "source-map": "~0.7.2",
1142 | "source-map-support": "~0.5.20"
1143 | },
1144 | "dependencies": {
1145 | "source-map": {
1146 | "version": "0.7.3",
1147 | "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.3.tgz",
1148 | "integrity": "sha512-CkCj6giN3S+n9qrYiBTX5gystlENnRW5jZeNLHpe6aue+SrHcG5VYwujhW9s4dY31mEGsxBDrHR6oI69fTXsaQ=="
1149 | }
1150 | }
1151 | },
1152 | "terser-webpack-plugin": {
1153 | "version": "5.2.5",
1154 | "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-5.2.5.tgz",
1155 | "integrity": "sha512-3luOVHku5l0QBeYS8r4CdHYWEGMmIj3H1U64jgkdZzECcSOJAyJ9TjuqcQZvw1Y+4AOBN9SeYJPJmFn2cM4/2g==",
1156 | "requires": {
1157 | "jest-worker": "^27.0.6",
1158 | "schema-utils": "^3.1.1",
1159 | "serialize-javascript": "^6.0.0",
1160 | "source-map": "^0.6.1",
1161 | "terser": "^5.7.2"
1162 | }
1163 | },
1164 | "toidentifier": {
1165 | "version": "1.0.0",
1166 | "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.0.tgz",
1167 | "integrity": "sha512-yaOH/Pk/VEhBWWTlhI+qXxDFXlejDGcQipMlyxda9nthulaxLZUNcUqFxokp0vcYnvteJln5FNQDRrxj3YcbVw=="
1168 | },
1169 | "tough-cookie": {
1170 | "version": "4.0.0",
1171 | "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-4.0.0.tgz",
1172 | "integrity": "sha512-tHdtEpQCMrc1YLrMaqXXcj6AxhYi/xgit6mZu1+EDWUn+qhUf8wMQoFIy9NXuq23zAwtcB0t/MjACGR18pcRbg==",
1173 | "requires": {
1174 | "psl": "^1.1.33",
1175 | "punycode": "^2.1.1",
1176 | "universalify": "^0.1.2"
1177 | }
1178 | },
1179 | "tr46": {
1180 | "version": "3.0.0",
1181 | "resolved": "https://registry.npmjs.org/tr46/-/tr46-3.0.0.tgz",
1182 | "integrity": "sha512-l7FvfAHlcmulp8kr+flpQZmVwtu7nfRV7NZujtN0OqES8EL4O4e0qqzL0DC5gAvx/ZC/9lk6rhcUwYvkBnBnYA==",
1183 | "requires": {
1184 | "punycode": "^2.1.1"
1185 | }
1186 | },
1187 | "type-check": {
1188 | "version": "0.3.2",
1189 | "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.3.2.tgz",
1190 | "integrity": "sha1-WITKtRLPHTVeP7eE8wgEsrUg23I=",
1191 | "requires": {
1192 | "prelude-ls": "~1.1.2"
1193 | }
1194 | },
1195 | "type-is": {
1196 | "version": "1.6.18",
1197 | "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz",
1198 | "integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==",
1199 | "requires": {
1200 | "media-typer": "0.3.0",
1201 | "mime-types": "~2.1.24"
1202 | }
1203 | },
1204 | "universalify": {
1205 | "version": "0.1.2",
1206 | "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz",
1207 | "integrity": "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg=="
1208 | },
1209 | "unpipe": {
1210 | "version": "1.0.0",
1211 | "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz",
1212 | "integrity": "sha1-sr9O6FFKrmFltIF4KdIbLvSZBOw="
1213 | },
1214 | "uri-js": {
1215 | "version": "4.4.1",
1216 | "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz",
1217 | "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==",
1218 | "requires": {
1219 | "punycode": "^2.1.0"
1220 | }
1221 | },
1222 | "utils-merge": {
1223 | "version": "1.0.1",
1224 | "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz",
1225 | "integrity": "sha1-n5VxD1CiZ5R7LMwSR0HBAoQn5xM="
1226 | },
1227 | "vary": {
1228 | "version": "1.1.2",
1229 | "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz",
1230 | "integrity": "sha1-IpnwLG3tMNSllhsLn3RSShj2NPw="
1231 | },
1232 | "w3c-hr-time": {
1233 | "version": "1.0.2",
1234 | "resolved": "https://registry.npmjs.org/w3c-hr-time/-/w3c-hr-time-1.0.2.tgz",
1235 | "integrity": "sha512-z8P5DvDNjKDoFIHK7q8r8lackT6l+jo/Ye3HOle7l9nICP9lf1Ci25fy9vHd0JOWewkIFzXIEig3TdKT7JQ5fQ==",
1236 | "requires": {
1237 | "browser-process-hrtime": "^1.0.0"
1238 | }
1239 | },
1240 | "w3c-xmlserializer": {
1241 | "version": "3.0.0",
1242 | "resolved": "https://registry.npmjs.org/w3c-xmlserializer/-/w3c-xmlserializer-3.0.0.tgz",
1243 | "integrity": "sha512-3WFqGEgSXIyGhOmAFtlicJNMjEps8b1MG31NCA0/vOF9+nKMUW1ckhi9cnNHmf88Rzw5V+dwIwsm2C7X8k9aQg==",
1244 | "requires": {
1245 | "xml-name-validator": "^4.0.0"
1246 | }
1247 | },
1248 | "watchpack": {
1249 | "version": "2.3.0",
1250 | "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-2.3.0.tgz",
1251 | "integrity": "sha512-MnN0Q1OsvB/GGHETrFeZPQaOelWh/7O+EiFlj8sM9GPjtQkis7k01aAxrg/18kTfoIVcLL+haEVFlXDaSRwKRw==",
1252 | "requires": {
1253 | "glob-to-regexp": "^0.4.1",
1254 | "graceful-fs": "^4.1.2"
1255 | }
1256 | },
1257 | "webidl-conversions": {
1258 | "version": "7.0.0",
1259 | "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-7.0.0.tgz",
1260 | "integrity": "sha512-VwddBukDzu71offAQR975unBIGqfKZpM+8ZX6ySk8nYhVoo5CYaZyzt3YBvYtRtO+aoGlqxPg/B87NGVZ/fu6g=="
1261 | },
1262 | "webpack": {
1263 | "version": "5.64.4",
1264 | "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.64.4.tgz",
1265 | "integrity": "sha512-LWhqfKjCLoYJLKJY8wk2C3h77i8VyHowG3qYNZiIqD6D0ZS40439S/KVuc/PY48jp2yQmy0mhMknq8cys4jFMw==",
1266 | "requires": {
1267 | "@types/eslint-scope": "^3.7.0",
1268 | "@types/estree": "^0.0.50",
1269 | "@webassemblyjs/ast": "1.11.1",
1270 | "@webassemblyjs/wasm-edit": "1.11.1",
1271 | "@webassemblyjs/wasm-parser": "1.11.1",
1272 | "acorn": "^8.4.1",
1273 | "acorn-import-assertions": "^1.7.6",
1274 | "browserslist": "^4.14.5",
1275 | "chrome-trace-event": "^1.0.2",
1276 | "enhanced-resolve": "^5.8.3",
1277 | "es-module-lexer": "^0.9.0",
1278 | "eslint-scope": "5.1.1",
1279 | "events": "^3.2.0",
1280 | "glob-to-regexp": "^0.4.1",
1281 | "graceful-fs": "^4.2.4",
1282 | "json-parse-better-errors": "^1.0.2",
1283 | "loader-runner": "^4.2.0",
1284 | "mime-types": "^2.1.27",
1285 | "neo-async": "^2.6.2",
1286 | "schema-utils": "^3.1.0",
1287 | "tapable": "^2.1.1",
1288 | "terser-webpack-plugin": "^5.1.3",
1289 | "watchpack": "^2.3.0",
1290 | "webpack-sources": "^3.2.2"
1291 | },
1292 | "dependencies": {
1293 | "@types/estree": {
1294 | "version": "0.0.50",
1295 | "resolved": "https://registry.npmjs.org/@types/estree/-/estree-0.0.50.tgz",
1296 | "integrity": "sha512-C6N5s2ZFtuZRj54k2/zyRhNDjJwwcViAM3Nbm8zjBpbqAdZ00mr0CFxvSKeO8Y/e03WVFLpQMdHYVfUd6SB+Hw=="
1297 | }
1298 | }
1299 | },
1300 | "webpack-sources": {
1301 | "version": "3.2.2",
1302 | "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-3.2.2.tgz",
1303 | "integrity": "sha512-cp5qdmHnu5T8wRg2G3vZZHoJPN14aqQ89SyQ11NpGH5zEMDCclt49rzo+MaRazk7/UeILhAI+/sEtcM+7Fr0nw=="
1304 | },
1305 | "whatwg-encoding": {
1306 | "version": "2.0.0",
1307 | "resolved": "https://registry.npmjs.org/whatwg-encoding/-/whatwg-encoding-2.0.0.tgz",
1308 | "integrity": "sha512-p41ogyeMUrw3jWclHWTQg1k05DSVXPLcVxRTYsXUk+ZooOCZLcoYgPZ/HL/D/N+uQPOtcp1me1WhBEaX02mhWg==",
1309 | "requires": {
1310 | "iconv-lite": "0.6.3"
1311 | }
1312 | },
1313 | "whatwg-mimetype": {
1314 | "version": "3.0.0",
1315 | "resolved": "https://registry.npmjs.org/whatwg-mimetype/-/whatwg-mimetype-3.0.0.tgz",
1316 | "integrity": "sha512-nt+N2dzIutVRxARx1nghPKGv1xHikU7HKdfafKkLNLindmPU/ch3U31NOCGGA/dmPcmb1VlofO0vnKAcsm0o/Q=="
1317 | },
1318 | "whatwg-url": {
1319 | "version": "10.0.0",
1320 | "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-10.0.0.tgz",
1321 | "integrity": "sha512-CLxxCmdUby142H5FZzn4D8ikO1cmypvXVQktsgosNy4a4BHrDHeciBBGZhb0bNoR5/MltoCatso+vFjjGx8t0w==",
1322 | "requires": {
1323 | "tr46": "^3.0.0",
1324 | "webidl-conversions": "^7.0.0"
1325 | }
1326 | },
1327 | "word-wrap": {
1328 | "version": "1.2.3",
1329 | "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.3.tgz",
1330 | "integrity": "sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ=="
1331 | },
1332 | "ws": {
1333 | "version": "8.2.3",
1334 | "resolved": "https://registry.npmjs.org/ws/-/ws-8.2.3.tgz",
1335 | "integrity": "sha512-wBuoj1BDpC6ZQ1B7DWQBYVLphPWkm8i9Y0/3YdHjHKHiohOJ1ws+3OccDWtH+PoC9DZD5WOTrJvNbWvjS6JWaA=="
1336 | },
1337 | "xml-name-validator": {
1338 | "version": "4.0.0",
1339 | "resolved": "https://registry.npmjs.org/xml-name-validator/-/xml-name-validator-4.0.0.tgz",
1340 | "integrity": "sha512-ICP2e+jsHvAj2E2lIHxa5tjXRlKDJo4IdvPvCXbXQGdzSfmSpNVyIKMvoZHjDY9DP0zV17iI85o90vRFXNccRw=="
1341 | },
1342 | "xmlchars": {
1343 | "version": "2.2.0",
1344 | "resolved": "https://registry.npmjs.org/xmlchars/-/xmlchars-2.2.0.tgz",
1345 | "integrity": "sha512-JZnDKK8B0RCDw84FNdDAIpZK+JuJw+s7Lz8nksI7SIuU3UXJJslUthsi+uWBUYOwPFwW7W7PRLRfUKpxjtjFCw=="
1346 | }
1347 | }
1348 | }
1349 |
--------------------------------------------------------------------------------
/package.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "palladiumub",
3 | "version": "1.2.0",
4 | "description": "",
5 | "main": "index.js",
6 | "directories": {
7 | "example": "example",
8 | "lib": "lib"
9 | },
10 | "scripts": {
11 | "start": "node ./examples/http-server"
12 | },
13 | "keywords": [],
14 | "author": "EnderKingJ",
15 | "license": "ISC",
16 | "dependencies": {
17 | "acorn-hammerhead": "^0.5.0",
18 | "css-tree": "^1.1.3",
19 | "express": "^4.17.1",
20 | "jsdom": "^18.0.0",
21 | "mime": "^2.5.2",
22 | "parse5": "^6.0.1",
23 | "webpack": "^5.64.4",
24 | "ws": "^8.2.3"
25 | },
26 | "repository": {
27 | "type": "git",
28 | "url": "https://github.com/LudicrousDevelopment/Palladium"
29 | }
30 | }
31 |
--------------------------------------------------------------------------------