11 |
12 | **⚠️⚠️⚠️ NOTE:** Starting version 2.0, CJK and emoji support is gone.
13 |
14 | ## 🚧🚧🚧 PLEASE READ THIS 🚧🚧🚧
15 |
16 | **Do NOT use this for production use-cases.**
17 |
18 | This is just a demo site of what cool things that `Puppeteer` can do. Under any circumstances, this site may be down any time or be heavily rate-limited to prevent abuse.
19 |
20 | Please check out what [Puppeteer](https://github.com/GoogleChrome/puppeteer) can do for your own use case and host on your own servers.
21 |
22 | ## API
23 |
24 | The API can perform 3 actions:
25 |
26 | - [Screenshot](#screenshot) - take a screenshot of the web page
27 | - [Render](#render) - render and serialize a HTML copy of the web page
28 | - [PDF](#pdf) - generate a PDF of the web page
29 |
30 | **`URL`** - the URL with encoded `pathname`, `search` and `hash`.
31 |
32 | Global parameters:
33 |
34 | - `width` - width of viewport/screenshot (default: `1024`)
35 | - `height` - height of viewport/screenshot (default: `768`)
36 |
37 | ### Screenshot
38 |
39 | ```
40 | /screenshot/{URL}
41 | ...or
42 | /{URL}
43 | ```
44 |
45 | Parameters:
46 |
47 | - `thumbWidth` - width of thumbnail, respecting aspect ratio (no default, has to be smaller than `width`)
48 | - `fullPage` - takes a screenshot of the full scrollable page (default: `false`). If the page is too long, it may time out.
49 | - `clipSelector` - CSS selector of element to be clipped (no default). E.g.: `.weather-forecast`.
50 |
51 | ### Render
52 |
53 | ```
54 | /render/{URL}
55 | ```
56 |
57 | Notes:
58 |
59 | - `script` tags except `JSON-LD` will be removed
60 | - `link[rel=import]` tags will be removed
61 | - HTML comments will be removed
62 | - `base` tag will be added for loading relative resources
63 | - Elements with absolute paths like `src="/xxx"` or `href="/xxx"` will be prepended with the origin URL.
64 |
65 | Parameters: _None_
66 |
67 | ### PDF
68 |
69 | ```
70 | /pdf/{URL}
71 | ```
72 |
73 | Parameters:
74 |
75 | - `format`: Paper format that [Puppeteer supports](https://github.com/GoogleChrome/puppeteer/blob/master/docs/api.md#pagepdfoptions). E.g.: `Letter`, `Legal`, `A4`, etc. (default: `Letter`)
76 | - `pageRanges`: Paper ranges to print. E.g., `1-5`, `8`, `11-13` (default all pages)
77 |
78 | ## Development
79 |
80 | ### Requirements
81 |
82 | - [Node.js](https://nodejs.org/en/)
83 | - [Vercel](https://vercel.com/download)
84 |
85 | #### Steps
86 |
87 | 1. `npm i`
88 | 2. `npm start`
89 | 3. Load `localhost:3000`
90 |
91 | ## Credits
92 |
93 | Block list from [Prerender](https://github.com/prerender/prerender/blob/master/lib/resources/blocked-resources.json).
94 |
95 | For version 1.0, this uses [`cheeaun/puppeteer`](https://hub.docker.com/r/cheeaun/puppeteer/) Docker image.
96 |
97 | For version 2.0, this uses some parts from [Zeit's now-examples: misc-screenshot](https://github.com/zeit/now-examples/blob/master/misc-screenshot/Dockerfile).
98 |
99 | Inspired by [`zenato/puppeteer`](<(https://hub.docker.com/r/zenato/puppeteer/)>), [`puppeteer-renderer`](https://github.com/zenato/puppeteer-renderer) and [Rendertron](https://render-tron.appspot.com/).
100 |
--------------------------------------------------------------------------------
/api/index.js:
--------------------------------------------------------------------------------
1 | const { CAPTCHA_SECRET, NOW_REGION, VERCEL_REGION } = process.env;
2 | const fs = require('fs');
3 | const http = require('http');
4 | const { URL } = require('url');
5 |
6 | const chrome = require('chrome-aws-lambda');
7 | const puppeteer = require('puppeteer-core');
8 |
9 | const { verify } = require('hcaptcha');
10 |
11 | const isDev =
12 | NOW_REGION === 'dev1' ||
13 | VERCEL_REGION === 'dev1' ||
14 | (!NOW_REGION && !VERCEL_REGION);
15 | // console.log({ isDev });
16 |
17 | const jimp = require('jimp');
18 | const pTimeout = require('p-timeout');
19 | const LRU = require('lru-cache');
20 |
21 | const cache = new LRU({
22 | max: process.env.CACHE_SIZE || Infinity,
23 | maxAge: 1000 * 60, // 1 minute
24 | noDisposeOnSet: true,
25 | dispose: async (url, page) => {
26 | try {
27 | if (page && page.close) {
28 | console.log('🗑 Disposing ' + url);
29 | page.removeAllListeners();
30 | await page.deleteCookie(await page.cookies());
31 | await page.close();
32 | }
33 | } catch (e) {}
34 | },
35 | });
36 | setInterval(() => cache.prune(), 1000 * 60); // Prune every minute
37 |
38 | const blocked = require('../blocked.json');
39 | const blockedRegExp = new RegExp('(' + blocked.join('|') + ')', 'i');
40 |
41 | const truncate = (str, len) =>
42 | str.length > len ? str.slice(0, len) + '…' : str;
43 |
44 | let browser;
45 | const localChrome = isDev ? require('chrome-finder')() : null;
46 | if (isDev) console.log(localChrome);
47 |
48 | async function handler(req, res) {
49 | const { host } = req.headers;
50 |
51 | if (req.url == '/') {
52 | res.writeHead(200, {
53 | 'content-type': 'text/html; charset=utf-8',
54 | 'cache-control': 'public,max-age=31536000',
55 | });
56 | res.end(fs.readFileSync('index.html'));
57 | return;
58 | }
59 |
60 | if (req.url == '/favicon.ico') {
61 | res.writeHead(204);
62 | res.end();
63 | return;
64 | }
65 |
66 | if (req.url == '/status') {
67 | res.writeHead(200, {
68 | 'content-type': 'application/json',
69 | });
70 | res.end(
71 | JSON.stringify(
72 | {
73 | pages: cache.keys(),
74 | process: {
75 | versions: process.versions,
76 | memoryUsage: process.memoryUsage(),
77 | },
78 | },
79 | null,
80 | '\t',
81 | ),
82 | );
83 | return;
84 | }
85 |
86 | const [_, action] = req.url.match(/^\/(screenshot|render|pdf)/i) || [
87 | '',
88 | '',
89 | '',
90 | ];
91 |
92 | if (!action) {
93 | res.writeHead(400, {
94 | 'content-type': 'text/plain',
95 | });
96 | res.end('Something is wrong. Invalid URL.');
97 | return;
98 | }
99 |
100 | if (cache.itemCount > 20) {
101 | res.writeHead(420, {
102 | 'content-type': 'text/plain',
103 | });
104 | res.end(
105 | `There are ${cache.itemCount} pages in the current instance now. Please try again in few minutes.`,
106 | );
107 | return;
108 | }
109 |
110 | let page, pageURL;
111 | try {
112 | const { searchParams } = new URL(req.url, 'http://test.com');
113 | pageURL = searchParams.get('url');
114 |
115 | if (!/^https?:\/\//i.test(pageURL)) {
116 | throw new Error('Invalid URL');
117 | }
118 |
119 | const token = searchParams.get('token');
120 | if (!token) throw new Error('No token');
121 | await verify(CAPTCHA_SECRET, token);
122 |
123 | const { hostname, pathname } = new URL(pageURL);
124 | const path = decodeURIComponent(pathname);
125 |
126 | await new Promise((resolve, reject) => {
127 | const req = http.request(
128 | {
129 | method: 'HEAD',
130 | host: hostname,
131 | path,
132 | },
133 | ({ statusCode, headers }) => {
134 | if (
135 | !headers ||
136 | (statusCode == 200 && !/text\/html/i.test(headers['content-type']))
137 | ) {
138 | reject(new Error('Not a HTML page'));
139 | } else {
140 | resolve();
141 | }
142 | },
143 | );
144 | req.on('error', reject);
145 | req.end();
146 | });
147 |
148 | let actionDone = false;
149 | const width = parseInt(searchParams.get('width'), 10) || 1024;
150 | const height = parseInt(searchParams.get('height'), 10) || 768;
151 |
152 | page = cache.get(pageURL);
153 | if (!page) {
154 | if (!browser) {
155 | console.log('🚀 Launch browser!');
156 | const config = {
157 | ignoreHTTPSErrors: true,
158 | ...(isDev
159 | ? {
160 | headless: false,
161 | executablePath: localChrome,
162 | }
163 | : {
164 | args: chrome.args,
165 | executablePath: await chrome.executablePath,
166 | headless: chrome.headless,
167 | }),
168 | };
169 | browser = await puppeteer.launch(config);
170 | }
171 | page = await browser.newPage();
172 |
173 | const nowTime = +new Date();
174 | let reqCount = 0;
175 | await page.setRequestInterception(true);
176 | page.on('request', (request) => {
177 | const url = request.url();
178 | const method = request.method();
179 | const resourceType = request.resourceType();
180 |
181 | // Skip data URIs
182 | if (/^data:/i.test(url)) {
183 | request.continue();
184 | return;
185 | }
186 |
187 | const seconds = (+new Date() - nowTime) / 1000;
188 | const shortURL = truncate(url, 70);
189 | const otherResources = /^(manifest|other)$/i.test(resourceType);
190 | // Abort requests that exceeds 15 seconds
191 | // Also abort if more than 100 requests
192 | if (seconds > 15 || reqCount > 100 || actionDone) {
193 | console.log(`❌⏳ ${method} ${shortURL}`);
194 | request.abort();
195 | } else if (blockedRegExp.test(url) || otherResources) {
196 | console.log(`❌ ${method} ${shortURL}`);
197 | request.abort();
198 | } else {
199 | console.log(`✅ ${method} ${shortURL}`);
200 | request.continue();
201 | reqCount++;
202 | }
203 | });
204 |
205 | let responseReject;
206 | const responsePromise = new Promise((_, reject) => {
207 | responseReject = reject;
208 | });
209 | page.on('response', ({ headers }) => {
210 | const location = headers['location'];
211 | if (location && location.includes(host)) {
212 | responseReject(new Error('Possible infinite redirects detected.'));
213 | }
214 | });
215 |
216 | await page.setViewport({
217 | width,
218 | height,
219 | });
220 |
221 | console.log('⬇️ Fetching ' + pageURL);
222 | await Promise.race([
223 | responsePromise,
224 | page.goto(pageURL, {
225 | waitUntil: 'networkidle2',
226 | }),
227 | ]);
228 |
229 | // Pause all media and stop buffering
230 | page.frames().forEach((frame) => {
231 | frame.evaluate(() => {
232 | document.querySelectorAll('video, audio').forEach((m) => {
233 | if (!m) return;
234 | if (m.pause) m.pause();
235 | m.preload = 'none';
236 | });
237 | });
238 | });
239 | } else {
240 | await page.setViewport({
241 | width,
242 | height,
243 | });
244 | }
245 |
246 | console.log('💥 Perform action: ' + action);
247 |
248 | switch (action) {
249 | case 'render': {
250 | const raw = searchParams.get('raw') || false;
251 |
252 | const content = await pTimeout(
253 | raw
254 | ? page.content()
255 | : page.evaluate(() => {
256 | let content = '';
257 | if (document.doctype) {
258 | content = new XMLSerializer().serializeToString(
259 | document.doctype,
260 | );
261 | }
262 |
263 | const doc = document.documentElement.cloneNode(true);
264 |
265 | // Remove scripts except JSON-LD
266 | const scripts = doc.querySelectorAll(
267 | 'script:not([type="application/ld+json"])',
268 | );
269 | scripts.forEach((s) => s.parentNode.removeChild(s));
270 |
271 | // Remove import tags
272 | const imports = doc.querySelectorAll('link[rel=import]');
273 | imports.forEach((i) => i.parentNode.removeChild(i));
274 |
275 | const { origin, pathname } = location;
276 | // Inject for loading relative resources
277 | if (!doc.querySelector('base')) {
278 | const base = document.createElement('base');
279 | base.href = origin + pathname;
280 | doc.querySelector('head').appendChild(base);
281 | }
282 |
283 | // Try to fix absolute paths
284 | const absEls = doc.querySelectorAll(
285 | 'link[href^="/"], script[src^="/"], img[src^="/"]',
286 | );
287 | absEls.forEach((el) => {
288 | const href = el.getAttribute('href');
289 | const src = el.getAttribute('src');
290 | if (src && /^\/[^/]/i.test(src)) {
291 | el.src = origin + src;
292 | } else if (href && /^\/[^/]/i.test(href)) {
293 | el.href = origin + href;
294 | }
295 | });
296 |
297 | content += doc.outerHTML;
298 |
299 | // Remove comments
300 | content = content.replace(//g, '');
301 |
302 | return content;
303 | }),
304 | 10 * 1000,
305 | 'Render timed out',
306 | );
307 |
308 | res.writeHead(200, {
309 | 'content-type': 'text/html; charset=UTF-8',
310 | 'cache-control': 'public,max-age=31536000',
311 | });
312 | res.end(content);
313 | break;
314 | }
315 | case 'pdf': {
316 | const format = searchParams.get('format') || null;
317 | const pageRanges = searchParams.get('pageRanges') || '';
318 |
319 | const pdf = await pTimeout(
320 | page.pdf({
321 | format,
322 | pageRanges,
323 | }),
324 | 10 * 1000,
325 | 'PDF timed out',
326 | );
327 |
328 | res.writeHead(200, {
329 | 'content-type': 'application/pdf',
330 | 'cache-control': 'public,max-age=31536000',
331 | });
332 | res.end(pdf, 'binary');
333 | break;
334 | }
335 | default: {
336 | const thumbWidth = parseInt(searchParams.get('thumbWidth'), 10) || null;
337 | const fullPage = searchParams.get('fullPage') == 'true' || false;
338 | const clipSelector = searchParams.get('clipSelector');
339 |
340 | let screenshot;
341 | if (clipSelector) {
342 | const handle = await page.$(clipSelector);
343 | if (handle) {
344 | screenshot = await pTimeout(
345 | handle.screenshot({
346 | type: 'jpeg',
347 | }),
348 | 20 * 1000,
349 | 'Screenshot timed out',
350 | );
351 | }
352 | } else {
353 | screenshot = await pTimeout(
354 | page.screenshot({
355 | type: 'jpeg',
356 | fullPage,
357 | }),
358 | 20 * 1000,
359 | 'Screenshot timed out',
360 | );
361 | }
362 |
363 | res.writeHead(200, {
364 | 'content-type': 'image/jpeg',
365 | 'cache-control': 'public,max-age=31536000',
366 | });
367 |
368 | if (thumbWidth && thumbWidth < width) {
369 | const image = await jimp.read(screenshot);
370 | image
371 | .resize(thumbWidth, jimp.AUTO)
372 | .quality(90)
373 | .getBuffer(jimp.MIME_JPEG, (err, buffer) => {
374 | res.end(buffer, 'binary');
375 | });
376 | } else {
377 | res.end(screenshot, 'binary');
378 | }
379 | }
380 | }
381 |
382 | actionDone = true;
383 | console.log('💥 Done action: ' + action);
384 | if (!cache.has(pageURL)) {
385 | cache.set(pageURL, page);
386 |
387 | // Try to stop all execution
388 | page.frames().forEach((frame) => {
389 | frame.evaluate(() => {
390 | // Clear all timer intervals https://stackoverflow.com/a/6843415/20838
391 | for (var i = 1; i < 99999; i++) window.clearInterval(i);
392 | // Disable all XHR requests
393 | XMLHttpRequest.prototype.send = (_) => _;
394 | // Disable all RAFs
395 | requestAnimationFrame = (_) => _;
396 | });
397 | });
398 | }
399 | } catch (e) {
400 | if (page) {
401 | console.error(e);
402 | console.log('💔 Force close ' + pageURL);
403 | page.removeAllListeners();
404 | page.close();
405 | }
406 | cache.del(pageURL);
407 | const { message = '' } = e;
408 | res.writeHead(400, {
409 | 'content-type': 'text/plain',
410 | });
411 | res.end('Oops. Something is wrong.\n\n' + message);
412 |
413 | // Handle websocket not opened error
414 | if (/not opened/i.test(message) && browser) {
415 | console.error('🕸 Web socket failed');
416 | try {
417 | browser.close();
418 | browser = null;
419 | } catch (err) {
420 | console.warn(`Chrome could not be killed ${err.message}`);
421 | browser = null;
422 | }
423 | }
424 | }
425 | }
426 |
427 | module.exports = handler;
428 |
429 | if (isDev) {
430 | const PORT = process.env.PORT || 3000;
431 | const listen = () => console.log(`Listening on ${PORT}...`);
432 | require('http').createServer(handler).listen(PORT, listen);
433 | }
434 |
435 | process.on('SIGINT', () => {
436 | if (browser) browser.close();
437 | process.exit();
438 | });
439 |
440 | process.on('unhandledRejection', (reason, p) => {
441 | console.log('Unhandled Rejection at:', p, 'reason:', reason);
442 | });
443 |
--------------------------------------------------------------------------------
/assets/logo.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/cheeaun/puppetron/c05a6d7b98852f5fef292818727759c0e1a9f72d/assets/logo.png
--------------------------------------------------------------------------------
/assets/puppetron-favicon.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/cheeaun/puppetron/c05a6d7b98852f5fef292818727759c0e1a9f72d/assets/puppetron-favicon.png
--------------------------------------------------------------------------------
/assets/puppetron-favicon.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/blocked.json:
--------------------------------------------------------------------------------
1 | [
2 | "google-analytics.com",
3 | "api.mixpanel.com",
4 | "stats.g.doubleclick.net",
5 | "mc.yandex.ru",
6 | "beacon.tapfiliate.com",
7 | "js-agent.newrelic.com",
8 | "api.segment.io",
9 | "woopra.com",
10 | "static.olark.com",
11 | "static.getclicky.com",
12 | "cdn.heapanalytics.com",
13 | "googleads.g.doubleclick.net",
14 | "pagead2.googlesyndication.com",
15 | "fullstory.com/rec",
16 | "navilytics.com/nls_ajax.php",
17 | "log.optimizely.com/event",
18 | "hn.inspectlet.com",
19 | "tpc.googlesyndication.com",
20 | "partner.googleadservices.com",
21 | "pixel.quantserve.com",
22 | "pixel.mathtag.com",
23 | "pixel.rubiconproject.com",
24 | "logx.optimizely.com",
25 | "akstat.io",
26 | "go-mpulse.net",
27 | "doubleclick.net/pixel",
28 | "cx.atdmt.com",
29 | "sb.scorecardresearch.com"
30 | ]
31 |
--------------------------------------------------------------------------------
/index.html:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 | Puppetron
5 |
6 |
71 |
72 | Puppetron
73 |
81 |
82 |
135 |
--------------------------------------------------------------------------------
/package-lock.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "puppetron",
3 | "version": "6.0.0",
4 | "lockfileVersion": 1,
5 | "requires": true,
6 | "dependencies": {
7 | "@babel/runtime": {
8 | "version": "7.9.6",
9 | "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.9.6.tgz",
10 | "integrity": "sha512-64AF1xY3OAkFHqOb9s4jpgk1Mm5vDZ4L3acHvAml+53nO1XbXLuDodsVpO4OIUsmemlUHMxNdYMNJmsvOwLrvQ==",
11 | "requires": {
12 | "regenerator-runtime": "^0.13.4"
13 | }
14 | },
15 | "@jimp/bmp": {
16 | "version": "0.12.1",
17 | "resolved": "https://registry.npmjs.org/@jimp/bmp/-/bmp-0.12.1.tgz",
18 | "integrity": "sha512-t16IamuBMv4GiGa1VAMzsgrVKVANxXG81wXECzbikOUkUv7pKJ2vHZDgkLBEsZQ9sAvFCneM1+yoSRpuENrfVQ==",
19 | "requires": {
20 | "@babel/runtime": "^7.7.2",
21 | "@jimp/utils": "^0.12.1",
22 | "bmp-js": "^0.1.0"
23 | }
24 | },
25 | "@jimp/core": {
26 | "version": "0.12.1",
27 | "resolved": "https://registry.npmjs.org/@jimp/core/-/core-0.12.1.tgz",
28 | "integrity": "sha512-mWfjExYEjHxBal+1gPesGChOQBSpxO7WUQkrO9KM7orboitOdQ15G5UA75ce7XVZ+5t+FQPOLmVkVZzzTQSEJA==",
29 | "requires": {
30 | "@babel/runtime": "^7.7.2",
31 | "@jimp/utils": "^0.12.1",
32 | "any-base": "^1.1.0",
33 | "buffer": "^5.2.0",
34 | "exif-parser": "^0.1.12",
35 | "file-type": "^9.0.0",
36 | "load-bmfont": "^1.3.1",
37 | "mkdirp": "^0.5.1",
38 | "phin": "^2.9.1",
39 | "pixelmatch": "^4.0.2",
40 | "tinycolor2": "^1.4.1"
41 | }
42 | },
43 | "@jimp/custom": {
44 | "version": "0.12.1",
45 | "resolved": "https://registry.npmjs.org/@jimp/custom/-/custom-0.12.1.tgz",
46 | "integrity": "sha512-bVClp8FEJ/11GFTKeRTrfH7NgUWvVO5/tQzO/68aOwMIhbz9BOYQGh533K9+mSy29VjZJo8jxZ0C9ZwYHuFwfA==",
47 | "requires": {
48 | "@babel/runtime": "^7.7.2",
49 | "@jimp/core": "^0.12.1"
50 | }
51 | },
52 | "@jimp/gif": {
53 | "version": "0.12.1",
54 | "resolved": "https://registry.npmjs.org/@jimp/gif/-/gif-0.12.1.tgz",
55 | "integrity": "sha512-cGn/AcvMGUGcqR6ByClGSnrja4AYmTwsGVXTQ1+EmfAdTiy6ztGgZCTDpZ/tq4SpdHXwm9wDHez7damKhTrH0g==",
56 | "requires": {
57 | "@babel/runtime": "^7.7.2",
58 | "@jimp/utils": "^0.12.1",
59 | "omggif": "^1.0.9"
60 | }
61 | },
62 | "@jimp/jpeg": {
63 | "version": "0.12.1",
64 | "resolved": "https://registry.npmjs.org/@jimp/jpeg/-/jpeg-0.12.1.tgz",
65 | "integrity": "sha512-UoCUHbKLj2CDCETd7LrJnmK/ExDsSfJXmc1pKkfgomvepjXogdl2KTHf141wL6D+9CfSD2VBWQLC5TvjMvcr9A==",
66 | "requires": {
67 | "@babel/runtime": "^7.7.2",
68 | "@jimp/utils": "^0.12.1",
69 | "jpeg-js": "^0.4.0"
70 | }
71 | },
72 | "@jimp/plugin-blit": {
73 | "version": "0.12.1",
74 | "resolved": "https://registry.npmjs.org/@jimp/plugin-blit/-/plugin-blit-0.12.1.tgz",
75 | "integrity": "sha512-VRBB6bx6EpQuaH0WX8ytlGNqUQcmuxXBbzL3e+cD0W6MluYibzQy089okvXcyUS72Q+qpSMmUDCVr3pDqLAsSA==",
76 | "requires": {
77 | "@babel/runtime": "^7.7.2",
78 | "@jimp/utils": "^0.12.1"
79 | }
80 | },
81 | "@jimp/plugin-blur": {
82 | "version": "0.12.1",
83 | "resolved": "https://registry.npmjs.org/@jimp/plugin-blur/-/plugin-blur-0.12.1.tgz",
84 | "integrity": "sha512-rTFY0yrwVJFNgNsAlYGn2GYCRLVEcPQ6cqAuhNylXuR/7oH3Acul+ZWafeKtvN8D8uMlth/6VP74gruXvwffZw==",
85 | "requires": {
86 | "@babel/runtime": "^7.7.2",
87 | "@jimp/utils": "^0.12.1"
88 | }
89 | },
90 | "@jimp/plugin-circle": {
91 | "version": "0.12.1",
92 | "resolved": "https://registry.npmjs.org/@jimp/plugin-circle/-/plugin-circle-0.12.1.tgz",
93 | "integrity": "sha512-+/OiBDjby7RBbQoDX8ZsqJRr1PaGPdTaaKUVGAsrE7KCNO9ODYNFAizB9lpidXkGgJ4Wx5R4mJy21i22oY/a4Q==",
94 | "requires": {
95 | "@babel/runtime": "^7.7.2",
96 | "@jimp/utils": "^0.12.1"
97 | }
98 | },
99 | "@jimp/plugin-color": {
100 | "version": "0.12.1",
101 | "resolved": "https://registry.npmjs.org/@jimp/plugin-color/-/plugin-color-0.12.1.tgz",
102 | "integrity": "sha512-xlnK/msWN4uZ+Bu7+UrCs9oMzTSA9QE0jWFnF3h0aBsD8t1LGxozkckHe8nHtC/y/sxIa8BGKSfkiaW+r6FbnA==",
103 | "requires": {
104 | "@babel/runtime": "^7.7.2",
105 | "@jimp/utils": "^0.12.1",
106 | "tinycolor2": "^1.4.1"
107 | }
108 | },
109 | "@jimp/plugin-contain": {
110 | "version": "0.12.1",
111 | "resolved": "https://registry.npmjs.org/@jimp/plugin-contain/-/plugin-contain-0.12.1.tgz",
112 | "integrity": "sha512-WZ/D6G0jhnBh2bkBh610PEh/caGhAUIAxYLsQsfSSlOxPsDhbj3S6hMbFKRgnDvf0hsd5zTIA0j1B0UG4kh18A==",
113 | "requires": {
114 | "@babel/runtime": "^7.7.2",
115 | "@jimp/utils": "^0.12.1"
116 | }
117 | },
118 | "@jimp/plugin-cover": {
119 | "version": "0.12.1",
120 | "resolved": "https://registry.npmjs.org/@jimp/plugin-cover/-/plugin-cover-0.12.1.tgz",
121 | "integrity": "sha512-ddWwTQO40GcabJ2UwUYCeuNxnjV4rBTiLprnjGMqAJCzdz3q3Sp20FkRf+H+E22k2v2LHss8dIOFOF4i6ycr9Q==",
122 | "requires": {
123 | "@babel/runtime": "^7.7.2",
124 | "@jimp/utils": "^0.12.1"
125 | }
126 | },
127 | "@jimp/plugin-crop": {
128 | "version": "0.12.1",
129 | "resolved": "https://registry.npmjs.org/@jimp/plugin-crop/-/plugin-crop-0.12.1.tgz",
130 | "integrity": "sha512-CKjVkrNO8FDZKYVpMireQW4SgKBSOdF+Ip/1sWssHHe77+jGEKqOjhYju+VhT3dZJ3+75rJNI9II7Kethp+rTw==",
131 | "requires": {
132 | "@babel/runtime": "^7.7.2",
133 | "@jimp/utils": "^0.12.1"
134 | }
135 | },
136 | "@jimp/plugin-displace": {
137 | "version": "0.12.1",
138 | "resolved": "https://registry.npmjs.org/@jimp/plugin-displace/-/plugin-displace-0.12.1.tgz",
139 | "integrity": "sha512-MQAw2iuf1/bVJ6P95WWTLA+WBjvIZ7TeGBerkvBaTK8oWdj+NSLNRIYOIoyPbZ7DTL8f1SN4Vd6KD6BZaoWrwg==",
140 | "requires": {
141 | "@babel/runtime": "^7.7.2",
142 | "@jimp/utils": "^0.12.1"
143 | }
144 | },
145 | "@jimp/plugin-dither": {
146 | "version": "0.12.1",
147 | "resolved": "https://registry.npmjs.org/@jimp/plugin-dither/-/plugin-dither-0.12.1.tgz",
148 | "integrity": "sha512-mCrBHdx2ViTLJDLcrobqGLlGhZF/Mq41bURWlElQ2ArvrQ3/xR52We9DNDfC08oQ2JVb6q3v1GnCCdn0KNojGQ==",
149 | "requires": {
150 | "@babel/runtime": "^7.7.2",
151 | "@jimp/utils": "^0.12.1"
152 | }
153 | },
154 | "@jimp/plugin-fisheye": {
155 | "version": "0.12.1",
156 | "resolved": "https://registry.npmjs.org/@jimp/plugin-fisheye/-/plugin-fisheye-0.12.1.tgz",
157 | "integrity": "sha512-CHvYSXtHNplzkkYzB44tENPDmvfUHiYCnAETTY+Hx58kZ0w8ERZ+OiLhUmiBcvH/QHm/US1iiNjgGUAfeQX6dg==",
158 | "requires": {
159 | "@babel/runtime": "^7.7.2",
160 | "@jimp/utils": "^0.12.1"
161 | }
162 | },
163 | "@jimp/plugin-flip": {
164 | "version": "0.12.1",
165 | "resolved": "https://registry.npmjs.org/@jimp/plugin-flip/-/plugin-flip-0.12.1.tgz",
166 | "integrity": "sha512-xi+Yayrnln8A/C9E3yQBExjxwBSeCkt/ZQg1CxLgszVyX/3Zo8+nkV8MJYpkTpj8LCZGTOKlsE05mxu/a3lbJQ==",
167 | "requires": {
168 | "@babel/runtime": "^7.7.2",
169 | "@jimp/utils": "^0.12.1"
170 | }
171 | },
172 | "@jimp/plugin-gaussian": {
173 | "version": "0.12.1",
174 | "resolved": "https://registry.npmjs.org/@jimp/plugin-gaussian/-/plugin-gaussian-0.12.1.tgz",
175 | "integrity": "sha512-7O6eKlhL37hsLfV6WAX1Cvce7vOqSwL1oWbBveC1agutDlrtvcTh1s2mQ4Pde654hCJu55mq1Ur10+ote5j3qw==",
176 | "requires": {
177 | "@babel/runtime": "^7.7.2",
178 | "@jimp/utils": "^0.12.1"
179 | }
180 | },
181 | "@jimp/plugin-invert": {
182 | "version": "0.12.1",
183 | "resolved": "https://registry.npmjs.org/@jimp/plugin-invert/-/plugin-invert-0.12.1.tgz",
184 | "integrity": "sha512-JTAs7A1Erbxwl+7ph7tgcb2PZ4WzB+3nb2WbfiWU8iCrKj17mMDSc5soaCCycn8wfwqvgB1vhRfGpseOLWxsuQ==",
185 | "requires": {
186 | "@babel/runtime": "^7.7.2",
187 | "@jimp/utils": "^0.12.1"
188 | }
189 | },
190 | "@jimp/plugin-mask": {
191 | "version": "0.12.1",
192 | "resolved": "https://registry.npmjs.org/@jimp/plugin-mask/-/plugin-mask-0.12.1.tgz",
193 | "integrity": "sha512-bnDdY0RO/x5Mhqoy+056SN1wEj++sD4muAKqLD2CIT8Zq5M/0TA4hkdf/+lwFy3H2C0YTK39PSE9xyb4jPX3kA==",
194 | "requires": {
195 | "@babel/runtime": "^7.7.2",
196 | "@jimp/utils": "^0.12.1"
197 | }
198 | },
199 | "@jimp/plugin-normalize": {
200 | "version": "0.12.1",
201 | "resolved": "https://registry.npmjs.org/@jimp/plugin-normalize/-/plugin-normalize-0.12.1.tgz",
202 | "integrity": "sha512-4kSaI4JLM/PNjHwbnAHgyh51V5IlPfPxYvsZyZ1US32pebWtocxSMaSuOaJUg7OGSkwSDBv81UR2h5D+Dz1b5A==",
203 | "requires": {
204 | "@babel/runtime": "^7.7.2",
205 | "@jimp/utils": "^0.12.1"
206 | }
207 | },
208 | "@jimp/plugin-print": {
209 | "version": "0.12.1",
210 | "resolved": "https://registry.npmjs.org/@jimp/plugin-print/-/plugin-print-0.12.1.tgz",
211 | "integrity": "sha512-T0lNS3qU9SwCHOEz7AGrdp50+gqiWGZibOL3350/X/dqoFs1EvGDjKVeWncsGCyLlpfd7M/AibHZgu8Fx2bWng==",
212 | "requires": {
213 | "@babel/runtime": "^7.7.2",
214 | "@jimp/utils": "^0.12.1",
215 | "load-bmfont": "^1.4.0"
216 | }
217 | },
218 | "@jimp/plugin-resize": {
219 | "version": "0.12.1",
220 | "resolved": "https://registry.npmjs.org/@jimp/plugin-resize/-/plugin-resize-0.12.1.tgz",
221 | "integrity": "sha512-sbNn4tdBGcgGlPt9XFxCuDl4ZOoxa8/Re8nAikyxYhRss2Dqz91ARbBQxOf1vlUGeicQMsjEuWbPQAogTSJRug==",
222 | "requires": {
223 | "@babel/runtime": "^7.7.2",
224 | "@jimp/utils": "^0.12.1"
225 | }
226 | },
227 | "@jimp/plugin-rotate": {
228 | "version": "0.12.1",
229 | "resolved": "https://registry.npmjs.org/@jimp/plugin-rotate/-/plugin-rotate-0.12.1.tgz",
230 | "integrity": "sha512-RYkLzwG2ervG6hHy8iepbIVeWdT1kz4Qz044eloqo6c66MK0KAqp228YI8+CAKm0joQnVDC/A0FgRIj/K8uyAw==",
231 | "requires": {
232 | "@babel/runtime": "^7.7.2",
233 | "@jimp/utils": "^0.12.1"
234 | }
235 | },
236 | "@jimp/plugin-scale": {
237 | "version": "0.12.1",
238 | "resolved": "https://registry.npmjs.org/@jimp/plugin-scale/-/plugin-scale-0.12.1.tgz",
239 | "integrity": "sha512-zjNVI1fUj+ywfG78T1ZU33g9a5sk4rhEQkkhtny8koAscnVsDN2YaZEKoFli54kqaWh5kSS5DDL7a/9pEfXnFQ==",
240 | "requires": {
241 | "@babel/runtime": "^7.7.2",
242 | "@jimp/utils": "^0.12.1"
243 | }
244 | },
245 | "@jimp/plugin-shadow": {
246 | "version": "0.12.1",
247 | "resolved": "https://registry.npmjs.org/@jimp/plugin-shadow/-/plugin-shadow-0.12.1.tgz",
248 | "integrity": "sha512-Z82IwvunXWQ2jXegd3W3TYUXpfJcEvNbHodr7Z+oVnwhM1OoQ5QC6RSRQwsj2qXIhbGffQjH8eguHgEgAV+u5w==",
249 | "requires": {
250 | "@babel/runtime": "^7.7.2",
251 | "@jimp/utils": "^0.12.1"
252 | }
253 | },
254 | "@jimp/plugin-threshold": {
255 | "version": "0.12.1",
256 | "resolved": "https://registry.npmjs.org/@jimp/plugin-threshold/-/plugin-threshold-0.12.1.tgz",
257 | "integrity": "sha512-PFezt5fSk0q+xKvdpuv0eLggy2I7EgYotrK8TRZOT0jimuYFXPF0Z514c6szumoW5kEsRz04L1HkPT1FqI97Yg==",
258 | "requires": {
259 | "@babel/runtime": "^7.7.2",
260 | "@jimp/utils": "^0.12.1"
261 | }
262 | },
263 | "@jimp/plugins": {
264 | "version": "0.12.1",
265 | "resolved": "https://registry.npmjs.org/@jimp/plugins/-/plugins-0.12.1.tgz",
266 | "integrity": "sha512-7+Yp29T6BbYo+Oqnc+m7A5AH+O+Oy5xnxvxlfmsp48+SuwEZ4akJp13Gu2PSmRlylENzR7MlWOxzhas5ERNlIg==",
267 | "requires": {
268 | "@babel/runtime": "^7.7.2",
269 | "@jimp/plugin-blit": "^0.12.1",
270 | "@jimp/plugin-blur": "^0.12.1",
271 | "@jimp/plugin-circle": "^0.12.1",
272 | "@jimp/plugin-color": "^0.12.1",
273 | "@jimp/plugin-contain": "^0.12.1",
274 | "@jimp/plugin-cover": "^0.12.1",
275 | "@jimp/plugin-crop": "^0.12.1",
276 | "@jimp/plugin-displace": "^0.12.1",
277 | "@jimp/plugin-dither": "^0.12.1",
278 | "@jimp/plugin-fisheye": "^0.12.1",
279 | "@jimp/plugin-flip": "^0.12.1",
280 | "@jimp/plugin-gaussian": "^0.12.1",
281 | "@jimp/plugin-invert": "^0.12.1",
282 | "@jimp/plugin-mask": "^0.12.1",
283 | "@jimp/plugin-normalize": "^0.12.1",
284 | "@jimp/plugin-print": "^0.12.1",
285 | "@jimp/plugin-resize": "^0.12.1",
286 | "@jimp/plugin-rotate": "^0.12.1",
287 | "@jimp/plugin-scale": "^0.12.1",
288 | "@jimp/plugin-shadow": "^0.12.1",
289 | "@jimp/plugin-threshold": "^0.12.1",
290 | "timm": "^1.6.1"
291 | }
292 | },
293 | "@jimp/png": {
294 | "version": "0.12.1",
295 | "resolved": "https://registry.npmjs.org/@jimp/png/-/png-0.12.1.tgz",
296 | "integrity": "sha512-tOUSJMJzcMAN82F9/Q20IToquIVWzvOe/7NIpVQJn6m+Lq6TtVmd7d8gdcna9AEFm2FIza5lhq2Kta6Xj0KXhQ==",
297 | "requires": {
298 | "@babel/runtime": "^7.7.2",
299 | "@jimp/utils": "^0.12.1",
300 | "pngjs": "^3.3.3"
301 | }
302 | },
303 | "@jimp/tiff": {
304 | "version": "0.12.1",
305 | "resolved": "https://registry.npmjs.org/@jimp/tiff/-/tiff-0.12.1.tgz",
306 | "integrity": "sha512-bzWDgv3202TKhaBGzV9OFF0PVQWEb4194h9kv5js348SSnbCusz/tzTE1EwKrnbDZThZPgTB1ryKs7D+Q9Mhmg==",
307 | "requires": {
308 | "@babel/runtime": "^7.7.2",
309 | "utif": "^2.0.1"
310 | }
311 | },
312 | "@jimp/types": {
313 | "version": "0.12.1",
314 | "resolved": "https://registry.npmjs.org/@jimp/types/-/types-0.12.1.tgz",
315 | "integrity": "sha512-hg5OKXpWWeKGuDrfibrjWWhr7hqb7f552wqnPWSLQpVrdWgjH+hpOv6cOzdo9bsU78qGTelZJPxr0ERRoc+MhQ==",
316 | "requires": {
317 | "@babel/runtime": "^7.7.2",
318 | "@jimp/bmp": "^0.12.1",
319 | "@jimp/gif": "^0.12.1",
320 | "@jimp/jpeg": "^0.12.1",
321 | "@jimp/png": "^0.12.1",
322 | "@jimp/tiff": "^0.12.1",
323 | "timm": "^1.6.1"
324 | }
325 | },
326 | "@jimp/utils": {
327 | "version": "0.12.1",
328 | "resolved": "https://registry.npmjs.org/@jimp/utils/-/utils-0.12.1.tgz",
329 | "integrity": "sha512-EjPkDQOzV/oZfbolEUgFT6SE++PtCccVBvjuACkttyCfl0P2jnpR49SwstyVLc2u8AwBAZEHHAw9lPYaMjtbXQ==",
330 | "requires": {
331 | "@babel/runtime": "^7.7.2",
332 | "regenerator-runtime": "^0.13.3"
333 | }
334 | },
335 | "@types/node": {
336 | "version": "14.0.5",
337 | "resolved": "https://registry.npmjs.org/@types/node/-/node-14.0.5.tgz",
338 | "integrity": "sha512-90hiq6/VqtQgX8Sp0EzeIsv3r+ellbGj4URKj5j30tLlZvRUpnAe9YbYnjl3pJM93GyXU0tghHhvXHq+5rnCKA==",
339 | "optional": true
340 | },
341 | "@types/yauzl": {
342 | "version": "2.9.1",
343 | "resolved": "https://registry.npmjs.org/@types/yauzl/-/yauzl-2.9.1.tgz",
344 | "integrity": "sha512-A1b8SU4D10uoPjwb0lnHmmu8wZhR9d+9o2PKBQT2jU5YPTKsxac6M2qGAdY7VcL+dHHhARVUDmeg0rOrcd9EjA==",
345 | "optional": true,
346 | "requires": {
347 | "@types/node": "*"
348 | }
349 | },
350 | "agent-base": {
351 | "version": "5.1.1",
352 | "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-5.1.1.tgz",
353 | "integrity": "sha512-TMeqbNl2fMW0nMjTEPOwe3J/PRFP4vqeoNuQMG0HlMrtm5QxKqdvAkZ1pRBQ/ulIyDD5Yq0nJ7YbdD8ey0TO3g=="
354 | },
355 | "any-base": {
356 | "version": "1.1.0",
357 | "resolved": "https://registry.npmjs.org/any-base/-/any-base-1.1.0.tgz",
358 | "integrity": "sha512-uMgjozySS8adZZYePpaWs8cxB9/kdzmpX6SgJZ+wbz1K5eYk5QMYDVJaZKhxyIHUdnnJkfR7SVgStgH7LkGUyg=="
359 | },
360 | "balanced-match": {
361 | "version": "1.0.0",
362 | "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz",
363 | "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c="
364 | },
365 | "base64-js": {
366 | "version": "1.3.1",
367 | "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.3.1.tgz",
368 | "integrity": "sha512-mLQ4i2QO1ytvGWFWmcngKO//JXAQueZvwEKtjgQFM4jIK0kU+ytMfplL8j+n5mspOfjHwoAg+9yhb7BwAHm36g=="
369 | },
370 | "bl": {
371 | "version": "4.0.2",
372 | "resolved": "https://registry.npmjs.org/bl/-/bl-4.0.2.tgz",
373 | "integrity": "sha512-j4OH8f6Qg2bGuWfRiltT2HYGx0e1QcBTrK9KAHNMwMZdQnDZFk0ZSYIpADjYCB3U12nicC5tVJwSIhwOWjb4RQ==",
374 | "requires": {
375 | "buffer": "^5.5.0",
376 | "inherits": "^2.0.4",
377 | "readable-stream": "^3.4.0"
378 | }
379 | },
380 | "bmp-js": {
381 | "version": "0.1.0",
382 | "resolved": "https://registry.npmjs.org/bmp-js/-/bmp-js-0.1.0.tgz",
383 | "integrity": "sha1-4Fpj95amwf8l9Hcex62twUjAcjM="
384 | },
385 | "brace-expansion": {
386 | "version": "1.1.11",
387 | "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz",
388 | "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==",
389 | "requires": {
390 | "balanced-match": "^1.0.0",
391 | "concat-map": "0.0.1"
392 | }
393 | },
394 | "buffer": {
395 | "version": "5.6.0",
396 | "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.6.0.tgz",
397 | "integrity": "sha512-/gDYp/UtU0eA1ys8bOs9J6a+E/KWIY+DZ+Q2WESNUA0jFRsJOc0SNUO6xJ5SGA1xueg3NL65W6s+NY5l9cunuw==",
398 | "requires": {
399 | "base64-js": "^1.0.2",
400 | "ieee754": "^1.1.4"
401 | }
402 | },
403 | "buffer-crc32": {
404 | "version": "0.2.13",
405 | "resolved": "https://registry.npmjs.org/buffer-crc32/-/buffer-crc32-0.2.13.tgz",
406 | "integrity": "sha1-DTM+PwDqxQqhRUq9MO+MKl2ackI="
407 | },
408 | "buffer-equal": {
409 | "version": "0.0.1",
410 | "resolved": "https://registry.npmjs.org/buffer-equal/-/buffer-equal-0.0.1.tgz",
411 | "integrity": "sha1-kbx0sR6kBbyRa8aqkI+q+ltKrEs="
412 | },
413 | "chownr": {
414 | "version": "1.1.4",
415 | "resolved": "https://registry.npmjs.org/chownr/-/chownr-1.1.4.tgz",
416 | "integrity": "sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg=="
417 | },
418 | "chrome-aws-lambda": {
419 | "version": "3.1.1",
420 | "resolved": "https://registry.npmjs.org/chrome-aws-lambda/-/chrome-aws-lambda-3.1.1.tgz",
421 | "integrity": "sha512-ikOcpFgobiiUvDXtBft+jxVz2CsauRV58owDtVyF1ocl/YN+/eqdIrrmbItm3yeJGnb9RtKxzFAqGcpBTQbTCA==",
422 | "requires": {
423 | "lambdafs": "^1.3.0"
424 | }
425 | },
426 | "chrome-finder": {
427 | "version": "git+https://github.com/simplemerchant/chrome-finder.git#511a5a19e389c59161cdfba9cfc3100d0a77ff7f",
428 | "from": "git+https://github.com/simplemerchant/chrome-finder.git",
429 | "dev": true
430 | },
431 | "concat-map": {
432 | "version": "0.0.1",
433 | "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz",
434 | "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s="
435 | },
436 | "debug": {
437 | "version": "4.1.1",
438 | "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz",
439 | "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==",
440 | "requires": {
441 | "ms": "^2.1.1"
442 | }
443 | },
444 | "dom-walk": {
445 | "version": "0.1.2",
446 | "resolved": "https://registry.npmjs.org/dom-walk/-/dom-walk-0.1.2.tgz",
447 | "integrity": "sha512-6QvTW9mrGeIegrFXdtQi9pk7O/nSK6lSdXW2eqUspN5LWD7UTji2Fqw5V2YLjBpHEoU9Xl/eUWNpDeZvoyOv2w=="
448 | },
449 | "end-of-stream": {
450 | "version": "1.4.4",
451 | "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz",
452 | "integrity": "sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==",
453 | "requires": {
454 | "once": "^1.4.0"
455 | }
456 | },
457 | "exif-parser": {
458 | "version": "0.1.12",
459 | "resolved": "https://registry.npmjs.org/exif-parser/-/exif-parser-0.1.12.tgz",
460 | "integrity": "sha1-WKnS1ywCwfbwKg70qRZicrd2CSI="
461 | },
462 | "extract-zip": {
463 | "version": "2.0.0",
464 | "resolved": "https://registry.npmjs.org/extract-zip/-/extract-zip-2.0.0.tgz",
465 | "integrity": "sha512-i42GQ498yibjdvIhivUsRslx608whtGoFIhF26Z7O4MYncBxp8CwalOs1lnHy21A9sIohWO2+uiE4SRtC9JXDg==",
466 | "requires": {
467 | "@types/yauzl": "^2.9.1",
468 | "debug": "^4.1.1",
469 | "get-stream": "^5.1.0",
470 | "yauzl": "^2.10.0"
471 | }
472 | },
473 | "fd-slicer": {
474 | "version": "1.1.0",
475 | "resolved": "https://registry.npmjs.org/fd-slicer/-/fd-slicer-1.1.0.tgz",
476 | "integrity": "sha1-JcfInLH5B3+IkbvmHY85Dq4lbx4=",
477 | "requires": {
478 | "pend": "~1.2.0"
479 | }
480 | },
481 | "file-type": {
482 | "version": "9.0.0",
483 | "resolved": "https://registry.npmjs.org/file-type/-/file-type-9.0.0.tgz",
484 | "integrity": "sha512-Qe/5NJrgIOlwijpq3B7BEpzPFcgzggOTagZmkXQY4LA6bsXKTUstK7Wp12lEJ/mLKTpvIZxmIuRcLYWT6ov9lw=="
485 | },
486 | "fs-constants": {
487 | "version": "1.0.0",
488 | "resolved": "https://registry.npmjs.org/fs-constants/-/fs-constants-1.0.0.tgz",
489 | "integrity": "sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow=="
490 | },
491 | "fs.realpath": {
492 | "version": "1.0.0",
493 | "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz",
494 | "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8="
495 | },
496 | "get-stream": {
497 | "version": "5.1.0",
498 | "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-5.1.0.tgz",
499 | "integrity": "sha512-EXr1FOzrzTfGeL0gQdeFEvOMm2mzMOglyiOXSTpPC+iAjAKftbr3jpCMWynogwYnM+eSj9sHGc6wjIcDvYiygw==",
500 | "requires": {
501 | "pump": "^3.0.0"
502 | }
503 | },
504 | "glob": {
505 | "version": "7.1.6",
506 | "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.6.tgz",
507 | "integrity": "sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==",
508 | "requires": {
509 | "fs.realpath": "^1.0.0",
510 | "inflight": "^1.0.4",
511 | "inherits": "2",
512 | "minimatch": "^3.0.4",
513 | "once": "^1.3.0",
514 | "path-is-absolute": "^1.0.0"
515 | }
516 | },
517 | "global": {
518 | "version": "4.3.2",
519 | "resolved": "https://registry.npmjs.org/global/-/global-4.3.2.tgz",
520 | "integrity": "sha1-52mJJopsdMOJCLEwWxD8DjlOnQ8=",
521 | "requires": {
522 | "min-document": "^2.19.0",
523 | "process": "~0.5.1"
524 | }
525 | },
526 | "hcaptcha": {
527 | "version": "0.0.2",
528 | "resolved": "https://registry.npmjs.org/hcaptcha/-/hcaptcha-0.0.2.tgz",
529 | "integrity": "sha512-wWOncj/sY+q8s7tV12tjn3cFNoQhSu3l/7nTJi4QkFKALQi9XnduoXrV/KFzLg5lnB+5560zSAoi9YdYPDw6Eg=="
530 | },
531 | "https-proxy-agent": {
532 | "version": "4.0.0",
533 | "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-4.0.0.tgz",
534 | "integrity": "sha512-zoDhWrkR3of1l9QAL8/scJZyLu8j/gBkcwcaQOZh7Gyh/+uJQzGVETdgT30akuwkpL8HTRfssqI3BZuV18teDg==",
535 | "requires": {
536 | "agent-base": "5",
537 | "debug": "4"
538 | }
539 | },
540 | "ieee754": {
541 | "version": "1.1.13",
542 | "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.1.13.tgz",
543 | "integrity": "sha512-4vf7I2LYV/HaWerSo3XmlMkp5eZ83i+/CDluXi/IGTs/O1sejBNhTtnxzmRZfvOUqj7lZjqHkeTvpgSFDlWZTg=="
544 | },
545 | "inflight": {
546 | "version": "1.0.6",
547 | "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz",
548 | "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=",
549 | "requires": {
550 | "once": "^1.3.0",
551 | "wrappy": "1"
552 | }
553 | },
554 | "inherits": {
555 | "version": "2.0.4",
556 | "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz",
557 | "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ=="
558 | },
559 | "is-function": {
560 | "version": "1.0.2",
561 | "resolved": "https://registry.npmjs.org/is-function/-/is-function-1.0.2.tgz",
562 | "integrity": "sha512-lw7DUp0aWXYg+CBCN+JKkcE0Q2RayZnSvnZBlwgxHBQhqt5pZNVy4Ri7H9GmmXkdu7LUthszM+Tor1u/2iBcpQ=="
563 | },
564 | "jimp": {
565 | "version": "0.12.1",
566 | "resolved": "https://registry.npmjs.org/jimp/-/jimp-0.12.1.tgz",
567 | "integrity": "sha512-0soPJif+yjmzmOF+4cF2hyhxUWWpXpQntsm2joJXFFoRcQiPzsG4dbLKYqYPT3Fc6PjZ8MaLtCkDqqckVSfmRw==",
568 | "requires": {
569 | "@babel/runtime": "^7.7.2",
570 | "@jimp/custom": "^0.12.1",
571 | "@jimp/plugins": "^0.12.1",
572 | "@jimp/types": "^0.12.1",
573 | "regenerator-runtime": "^0.13.3"
574 | }
575 | },
576 | "jpeg-js": {
577 | "version": "0.4.0",
578 | "resolved": "https://registry.npmjs.org/jpeg-js/-/jpeg-js-0.4.0.tgz",
579 | "integrity": "sha512-960VHmtN1vTpasX/1LupLohdP5odwAT7oK/VSm6mW0M58LbrBnowLAPWAZhWGhDAGjzbMnPXZxzB/QYgBwkN0w=="
580 | },
581 | "lambdafs": {
582 | "version": "1.3.0",
583 | "resolved": "https://registry.npmjs.org/lambdafs/-/lambdafs-1.3.0.tgz",
584 | "integrity": "sha512-HqRPmEgtkTW4sCYDUjTEuTGkjCHuLvtZU8iM8GkhD7SpjW4AJJbBk86YU4K43sWGuW5Vmzp1lVCx4ab/kJsuBw==",
585 | "requires": {
586 | "tar-fs": "^2.0.0"
587 | },
588 | "dependencies": {
589 | "bl": {
590 | "version": "3.0.0",
591 | "bundled": true,
592 | "requires": {
593 | "readable-stream": "^3.0.1"
594 | }
595 | },
596 | "chownr": {
597 | "version": "1.1.2",
598 | "bundled": true
599 | },
600 | "end-of-stream": {
601 | "version": "1.4.1",
602 | "bundled": true,
603 | "requires": {
604 | "once": "^1.4.0"
605 | }
606 | },
607 | "fs-constants": {
608 | "version": "1.0.0",
609 | "bundled": true
610 | },
611 | "inherits": {
612 | "version": "2.0.4",
613 | "bundled": true
614 | },
615 | "minimist": {
616 | "version": "0.0.8",
617 | "bundled": true
618 | },
619 | "mkdirp": {
620 | "version": "0.5.1",
621 | "bundled": true,
622 | "requires": {
623 | "minimist": "0.0.8"
624 | }
625 | },
626 | "once": {
627 | "version": "1.4.0",
628 | "bundled": true,
629 | "requires": {
630 | "wrappy": "1"
631 | }
632 | },
633 | "pump": {
634 | "version": "3.0.0",
635 | "bundled": true,
636 | "requires": {
637 | "end-of-stream": "^1.1.0",
638 | "once": "^1.3.1"
639 | }
640 | },
641 | "readable-stream": {
642 | "version": "3.4.0",
643 | "bundled": true,
644 | "requires": {
645 | "inherits": "^2.0.3",
646 | "string_decoder": "^1.1.1",
647 | "util-deprecate": "^1.0.1"
648 | }
649 | },
650 | "safe-buffer": {
651 | "version": "5.2.0",
652 | "bundled": true
653 | },
654 | "string_decoder": {
655 | "version": "1.3.0",
656 | "bundled": true,
657 | "requires": {
658 | "safe-buffer": "~5.2.0"
659 | }
660 | },
661 | "tar-fs": {
662 | "version": "2.0.0",
663 | "bundled": true,
664 | "requires": {
665 | "chownr": "^1.1.1",
666 | "mkdirp": "^0.5.1",
667 | "pump": "^3.0.0",
668 | "tar-stream": "^2.0.0"
669 | }
670 | },
671 | "tar-stream": {
672 | "version": "2.1.0",
673 | "bundled": true,
674 | "requires": {
675 | "bl": "^3.0.0",
676 | "end-of-stream": "^1.4.1",
677 | "fs-constants": "^1.0.0",
678 | "inherits": "^2.0.3",
679 | "readable-stream": "^3.1.1"
680 | }
681 | },
682 | "util-deprecate": {
683 | "version": "1.0.2",
684 | "bundled": true
685 | },
686 | "wrappy": {
687 | "version": "1.0.2",
688 | "bundled": true
689 | }
690 | }
691 | },
692 | "load-bmfont": {
693 | "version": "1.4.0",
694 | "resolved": "https://registry.npmjs.org/load-bmfont/-/load-bmfont-1.4.0.tgz",
695 | "integrity": "sha512-kT63aTAlNhZARowaNYcY29Fn/QYkc52M3l6V1ifRcPewg2lvUZDAj7R6dXjOL9D0sict76op3T5+odumDSF81g==",
696 | "requires": {
697 | "buffer-equal": "0.0.1",
698 | "mime": "^1.3.4",
699 | "parse-bmfont-ascii": "^1.0.3",
700 | "parse-bmfont-binary": "^1.0.5",
701 | "parse-bmfont-xml": "^1.1.4",
702 | "phin": "^2.9.1",
703 | "xhr": "^2.0.1",
704 | "xtend": "^4.0.0"
705 | }
706 | },
707 | "lru-cache": {
708 | "version": "5.1.1",
709 | "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz",
710 | "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==",
711 | "requires": {
712 | "yallist": "^3.0.2"
713 | }
714 | },
715 | "mime": {
716 | "version": "1.6.0",
717 | "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz",
718 | "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg=="
719 | },
720 | "min-document": {
721 | "version": "2.19.0",
722 | "resolved": "https://registry.npmjs.org/min-document/-/min-document-2.19.0.tgz",
723 | "integrity": "sha1-e9KC4/WELtKVu3SM3Z8f+iyCRoU=",
724 | "requires": {
725 | "dom-walk": "^0.1.0"
726 | }
727 | },
728 | "minimatch": {
729 | "version": "3.0.4",
730 | "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz",
731 | "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==",
732 | "requires": {
733 | "brace-expansion": "^1.1.7"
734 | }
735 | },
736 | "minimist": {
737 | "version": "1.2.5",
738 | "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz",
739 | "integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw=="
740 | },
741 | "mkdirp": {
742 | "version": "0.5.5",
743 | "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.5.tgz",
744 | "integrity": "sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ==",
745 | "requires": {
746 | "minimist": "^1.2.5"
747 | }
748 | },
749 | "mkdirp-classic": {
750 | "version": "0.5.3",
751 | "resolved": "https://registry.npmjs.org/mkdirp-classic/-/mkdirp-classic-0.5.3.tgz",
752 | "integrity": "sha512-gKLcREMhtuZRwRAfqP3RFW+TK4JqApVBtOIftVgjuABpAtpxhPGaDcfvbhNvD0B8iD1oUr/txX35NjcaY6Ns/A=="
753 | },
754 | "ms": {
755 | "version": "2.1.2",
756 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz",
757 | "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w=="
758 | },
759 | "omggif": {
760 | "version": "1.0.10",
761 | "resolved": "https://registry.npmjs.org/omggif/-/omggif-1.0.10.tgz",
762 | "integrity": "sha512-LMJTtvgc/nugXj0Vcrrs68Mn2D1r0zf630VNtqtpI1FEO7e+O9FP4gqs9AcnBaSEeoHIPm28u6qgPR0oyEpGSw=="
763 | },
764 | "once": {
765 | "version": "1.4.0",
766 | "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz",
767 | "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=",
768 | "requires": {
769 | "wrappy": "1"
770 | }
771 | },
772 | "p-finally": {
773 | "version": "1.0.0",
774 | "resolved": "https://registry.npmjs.org/p-finally/-/p-finally-1.0.0.tgz",
775 | "integrity": "sha1-P7z7FbiZpEEjs0ttzBi3JDNqLK4="
776 | },
777 | "p-timeout": {
778 | "version": "3.2.0",
779 | "resolved": "https://registry.npmjs.org/p-timeout/-/p-timeout-3.2.0.tgz",
780 | "integrity": "sha512-rhIwUycgwwKcP9yTOOFK/AKsAopjjCakVqLHePO3CC6Mir1Z99xT+R63jZxAT5lFZLa2inS5h+ZS2GvR99/FBg==",
781 | "requires": {
782 | "p-finally": "^1.0.0"
783 | }
784 | },
785 | "pako": {
786 | "version": "1.0.11",
787 | "resolved": "https://registry.npmjs.org/pako/-/pako-1.0.11.tgz",
788 | "integrity": "sha512-4hLB8Py4zZce5s4yd9XzopqwVv/yGNhV1Bl8NTmCq1763HeK2+EwVTv+leGeL13Dnh2wfbqowVPXCIO0z4taYw=="
789 | },
790 | "parse-bmfont-ascii": {
791 | "version": "1.0.6",
792 | "resolved": "https://registry.npmjs.org/parse-bmfont-ascii/-/parse-bmfont-ascii-1.0.6.tgz",
793 | "integrity": "sha1-Eaw8P/WPfCAgqyJ2kHkQjU36AoU="
794 | },
795 | "parse-bmfont-binary": {
796 | "version": "1.0.6",
797 | "resolved": "https://registry.npmjs.org/parse-bmfont-binary/-/parse-bmfont-binary-1.0.6.tgz",
798 | "integrity": "sha1-0Di0dtPp3Z2x4RoLDlOiJ5K2kAY="
799 | },
800 | "parse-bmfont-xml": {
801 | "version": "1.1.4",
802 | "resolved": "https://registry.npmjs.org/parse-bmfont-xml/-/parse-bmfont-xml-1.1.4.tgz",
803 | "integrity": "sha512-bjnliEOmGv3y1aMEfREMBJ9tfL3WR0i0CKPj61DnSLaoxWR3nLrsQrEbCId/8rF4NyRF0cCqisSVXyQYWM+mCQ==",
804 | "requires": {
805 | "xml-parse-from-string": "^1.0.0",
806 | "xml2js": "^0.4.5"
807 | }
808 | },
809 | "parse-headers": {
810 | "version": "2.0.3",
811 | "resolved": "https://registry.npmjs.org/parse-headers/-/parse-headers-2.0.3.tgz",
812 | "integrity": "sha512-QhhZ+DCCit2Coi2vmAKbq5RGTRcQUOE2+REgv8vdyu7MnYx2eZztegqtTx99TZ86GTIwqiy3+4nQTWZ2tgmdCA=="
813 | },
814 | "path-is-absolute": {
815 | "version": "1.0.1",
816 | "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz",
817 | "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18="
818 | },
819 | "pend": {
820 | "version": "1.2.0",
821 | "resolved": "https://registry.npmjs.org/pend/-/pend-1.2.0.tgz",
822 | "integrity": "sha1-elfrVQpng/kRUzH89GY9XI4AelA="
823 | },
824 | "phin": {
825 | "version": "2.9.3",
826 | "resolved": "https://registry.npmjs.org/phin/-/phin-2.9.3.tgz",
827 | "integrity": "sha512-CzFr90qM24ju5f88quFC/6qohjC144rehe5n6DH900lgXmUe86+xCKc10ev56gRKC4/BkHUoG4uSiQgBiIXwDA=="
828 | },
829 | "pixelmatch": {
830 | "version": "4.0.2",
831 | "resolved": "https://registry.npmjs.org/pixelmatch/-/pixelmatch-4.0.2.tgz",
832 | "integrity": "sha1-j0fc7FARtHe2fbA8JDvB8wheiFQ=",
833 | "requires": {
834 | "pngjs": "^3.0.0"
835 | }
836 | },
837 | "pngjs": {
838 | "version": "3.4.0",
839 | "resolved": "https://registry.npmjs.org/pngjs/-/pngjs-3.4.0.tgz",
840 | "integrity": "sha512-NCrCHhWmnQklfH4MtJMRjZ2a8c80qXeMlQMv2uVp9ISJMTt562SbGd6n2oq0PaPgKm7Z6pL9E2UlLIhC+SHL3w=="
841 | },
842 | "process": {
843 | "version": "0.5.2",
844 | "resolved": "https://registry.npmjs.org/process/-/process-0.5.2.tgz",
845 | "integrity": "sha1-FjjYqONML0QKkduVq5rrZ3/Bhc8="
846 | },
847 | "progress": {
848 | "version": "2.0.3",
849 | "resolved": "https://registry.npmjs.org/progress/-/progress-2.0.3.tgz",
850 | "integrity": "sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA=="
851 | },
852 | "proxy-from-env": {
853 | "version": "1.1.0",
854 | "resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.1.0.tgz",
855 | "integrity": "sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg=="
856 | },
857 | "pump": {
858 | "version": "3.0.0",
859 | "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz",
860 | "integrity": "sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==",
861 | "requires": {
862 | "end-of-stream": "^1.1.0",
863 | "once": "^1.3.1"
864 | }
865 | },
866 | "puppeteer-core": {
867 | "version": "3.1.0",
868 | "resolved": "https://registry.npmjs.org/puppeteer-core/-/puppeteer-core-3.1.0.tgz",
869 | "integrity": "sha512-o0dlA3g+Dzc8mrKvCrlmn79upNhLfTQwtnPbS4hxuH6tWOwFFEbet8WHtYjQbUPZOqIt0GmoyM93VQKm6ogO+Q==",
870 | "requires": {
871 | "debug": "^4.1.0",
872 | "extract-zip": "^2.0.0",
873 | "https-proxy-agent": "^4.0.0",
874 | "mime": "^2.0.3",
875 | "progress": "^2.0.1",
876 | "proxy-from-env": "^1.0.0",
877 | "rimraf": "^3.0.2",
878 | "tar-fs": "^2.0.0",
879 | "unbzip2-stream": "^1.3.3",
880 | "ws": "^7.2.3"
881 | },
882 | "dependencies": {
883 | "mime": {
884 | "version": "2.4.5",
885 | "resolved": "https://registry.npmjs.org/mime/-/mime-2.4.5.tgz",
886 | "integrity": "sha512-3hQhEUF027BuxZjQA3s7rIv/7VCQPa27hN9u9g87sEkWaKwQPuXOkVKtOeiyUrnWqTDiOs8Ed2rwg733mB0R5w=="
887 | }
888 | }
889 | },
890 | "readable-stream": {
891 | "version": "3.6.0",
892 | "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz",
893 | "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==",
894 | "requires": {
895 | "inherits": "^2.0.3",
896 | "string_decoder": "^1.1.1",
897 | "util-deprecate": "^1.0.1"
898 | }
899 | },
900 | "regenerator-runtime": {
901 | "version": "0.13.5",
902 | "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.5.tgz",
903 | "integrity": "sha512-ZS5w8CpKFinUzOwW3c83oPeVXoNsrLsaCoLtJvAClH135j/R77RuymhiSErhm2lKcwSCIpmvIWSbDkIfAqKQlA=="
904 | },
905 | "rimraf": {
906 | "version": "3.0.2",
907 | "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz",
908 | "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==",
909 | "requires": {
910 | "glob": "^7.1.3"
911 | }
912 | },
913 | "safe-buffer": {
914 | "version": "5.2.1",
915 | "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz",
916 | "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ=="
917 | },
918 | "sax": {
919 | "version": "1.2.4",
920 | "resolved": "https://registry.npmjs.org/sax/-/sax-1.2.4.tgz",
921 | "integrity": "sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw=="
922 | },
923 | "string_decoder": {
924 | "version": "1.3.0",
925 | "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz",
926 | "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==",
927 | "requires": {
928 | "safe-buffer": "~5.2.0"
929 | }
930 | },
931 | "tar-fs": {
932 | "version": "2.1.0",
933 | "resolved": "https://registry.npmjs.org/tar-fs/-/tar-fs-2.1.0.tgz",
934 | "integrity": "sha512-9uW5iDvrIMCVpvasdFHW0wJPez0K4JnMZtsuIeDI7HyMGJNxmDZDOCQROr7lXyS+iL/QMpj07qcjGYTSdRFXUg==",
935 | "requires": {
936 | "chownr": "^1.1.1",
937 | "mkdirp-classic": "^0.5.2",
938 | "pump": "^3.0.0",
939 | "tar-stream": "^2.0.0"
940 | }
941 | },
942 | "tar-stream": {
943 | "version": "2.1.2",
944 | "resolved": "https://registry.npmjs.org/tar-stream/-/tar-stream-2.1.2.tgz",
945 | "integrity": "sha512-UaF6FoJ32WqALZGOIAApXx+OdxhekNMChu6axLJR85zMMjXKWFGjbIRe+J6P4UnRGg9rAwWvbTT0oI7hD/Un7Q==",
946 | "requires": {
947 | "bl": "^4.0.1",
948 | "end-of-stream": "^1.4.1",
949 | "fs-constants": "^1.0.0",
950 | "inherits": "^2.0.3",
951 | "readable-stream": "^3.1.1"
952 | }
953 | },
954 | "through": {
955 | "version": "2.3.8",
956 | "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz",
957 | "integrity": "sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU="
958 | },
959 | "timm": {
960 | "version": "1.6.2",
961 | "resolved": "https://registry.npmjs.org/timm/-/timm-1.6.2.tgz",
962 | "integrity": "sha512-IH3DYDL1wMUwmIlVmMrmesw5lZD6N+ZOAFWEyLrtpoL9Bcrs9u7M/vyOnHzDD2SMs4irLkVjqxZbHrXStS/Nmw=="
963 | },
964 | "tinycolor2": {
965 | "version": "1.4.1",
966 | "resolved": "https://registry.npmjs.org/tinycolor2/-/tinycolor2-1.4.1.tgz",
967 | "integrity": "sha1-9PrTM0R7wLB9TcjpIJ2POaisd+g="
968 | },
969 | "unbzip2-stream": {
970 | "version": "1.4.2",
971 | "resolved": "https://registry.npmjs.org/unbzip2-stream/-/unbzip2-stream-1.4.2.tgz",
972 | "integrity": "sha512-pZMVAofMrrHX6Ik39hCk470kulCbmZ2SWfQLPmTWqfJV/oUm0gn1CblvHdUu4+54Je6Jq34x8kY6XjTy6dMkOg==",
973 | "requires": {
974 | "buffer": "^5.2.1",
975 | "through": "^2.3.8"
976 | }
977 | },
978 | "utif": {
979 | "version": "2.0.1",
980 | "resolved": "https://registry.npmjs.org/utif/-/utif-2.0.1.tgz",
981 | "integrity": "sha512-Z/S1fNKCicQTf375lIP9G8Sa1H/phcysstNrrSdZKj1f9g58J4NMgb5IgiEZN9/nLMPDwF0W7hdOe9Qq2IYoLg==",
982 | "requires": {
983 | "pako": "^1.0.5"
984 | }
985 | },
986 | "util-deprecate": {
987 | "version": "1.0.2",
988 | "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz",
989 | "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8="
990 | },
991 | "wrappy": {
992 | "version": "1.0.2",
993 | "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz",
994 | "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8="
995 | },
996 | "ws": {
997 | "version": "7.3.0",
998 | "resolved": "https://registry.npmjs.org/ws/-/ws-7.3.0.tgz",
999 | "integrity": "sha512-iFtXzngZVXPGgpTlP1rBqsUK82p9tKqsWRPg5L56egiljujJT3vGAYnHANvFxBieXrTFavhzhxW52jnaWV+w2w=="
1000 | },
1001 | "xhr": {
1002 | "version": "2.5.0",
1003 | "resolved": "https://registry.npmjs.org/xhr/-/xhr-2.5.0.tgz",
1004 | "integrity": "sha512-4nlO/14t3BNUZRXIXfXe+3N6w3s1KoxcJUUURctd64BLRe67E4gRwp4PjywtDY72fXpZ1y6Ch0VZQRY/gMPzzQ==",
1005 | "requires": {
1006 | "global": "~4.3.0",
1007 | "is-function": "^1.0.1",
1008 | "parse-headers": "^2.0.0",
1009 | "xtend": "^4.0.0"
1010 | }
1011 | },
1012 | "xml-parse-from-string": {
1013 | "version": "1.0.1",
1014 | "resolved": "https://registry.npmjs.org/xml-parse-from-string/-/xml-parse-from-string-1.0.1.tgz",
1015 | "integrity": "sha1-qQKekp09vN7RafPG4oI42VpdWig="
1016 | },
1017 | "xml2js": {
1018 | "version": "0.4.23",
1019 | "resolved": "https://registry.npmjs.org/xml2js/-/xml2js-0.4.23.tgz",
1020 | "integrity": "sha512-ySPiMjM0+pLDftHgXY4By0uswI3SPKLDw/i3UXbnO8M/p28zqexCUoPmQFrYD+/1BzhGJSs2i1ERWKJAtiLrug==",
1021 | "requires": {
1022 | "sax": ">=0.6.0",
1023 | "xmlbuilder": "~11.0.0"
1024 | }
1025 | },
1026 | "xmlbuilder": {
1027 | "version": "11.0.1",
1028 | "resolved": "https://registry.npmjs.org/xmlbuilder/-/xmlbuilder-11.0.1.tgz",
1029 | "integrity": "sha512-fDlsI/kFEx7gLvbecc0/ohLG50fugQp8ryHzMTuW9vSa1GJ0XYWKnhsUx7oie3G98+r56aTQIUB4kht42R3JvA=="
1030 | },
1031 | "xtend": {
1032 | "version": "4.0.2",
1033 | "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz",
1034 | "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ=="
1035 | },
1036 | "yallist": {
1037 | "version": "3.1.1",
1038 | "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz",
1039 | "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g=="
1040 | },
1041 | "yauzl": {
1042 | "version": "2.10.0",
1043 | "resolved": "https://registry.npmjs.org/yauzl/-/yauzl-2.10.0.tgz",
1044 | "integrity": "sha1-x+sXyT4RLLEIb6bY5R+wZnt5pfk=",
1045 | "requires": {
1046 | "buffer-crc32": "~0.2.3",
1047 | "fd-slicer": "~1.1.0"
1048 | }
1049 | }
1050 | }
1051 | }
1052 |
--------------------------------------------------------------------------------
/package.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "puppetron",
3 | "version": "6.0.0",
4 | "license": "MIT",
5 | "dependencies": {
6 | "chrome-aws-lambda": "~3.1.1",
7 | "hcaptcha": "0.0.2",
8 | "jimp": "~0.12.1",
9 | "lru-cache": "~5.1.1",
10 | "p-timeout": "~3.2.0",
11 | "puppeteer-core": "~3.1.0"
12 | },
13 | "devDependencies": {
14 | "chrome-finder": "https://github.com/simplemerchant/chrome-finder.git"
15 | },
16 | "scripts": {
17 | "start": "vercel dev"
18 | }
19 | }
20 |
--------------------------------------------------------------------------------
/vercel.json:
--------------------------------------------------------------------------------
1 | {
2 | "alias": "puppetron.now.sh",
3 | "version": 2,
4 | "public": true,
5 | "rewrites": [
6 | { "source": "/", "destination": "/index.html" },
7 | { "source": "/(.+)", "destination": "/api/index" }
8 | ]
9 | }
10 |
--------------------------------------------------------------------------------