├── .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 |
137 |
138 |
139 | Palladium 140 |
141 |

Please Enter a Search Term or Url


142 |
143 | 144 | 145 | 146 | 147 | 148 |
149 |

Palladium is a web proxy developed by EnderKingJ 150 |

151 | 152 |
153 | 154 | 155 | 156 | 157 | 158 | 159 | 160 |
161 |
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 |
137 |
138 |
139 | Palladium 140 |
141 |

Please Enter a Search Term or Url


142 |
143 | 144 | 145 | 146 | 147 | 148 |
149 |

Palladium is a web proxy developed by EnderKingJ 150 |

151 | 152 |
153 | 154 | 155 | 156 | 157 | 158 | 159 | 160 |
161 |
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 |
137 |
138 |
139 | Palladium 140 |
141 |

Please Enter a Search Term or Url


142 |
143 | 144 | 145 | 146 | 147 | 148 |
149 |

Palladium is a web proxy developed by EnderKingJ 150 |

151 | 152 |
153 | 154 | 155 | 156 | 157 | 158 | 159 | 160 |
161 |
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 | --------------------------------------------------------------------------------