├── .gitignore ├── README.md ├── app.js ├── package.json ├── public ├── client.js └── sw.js ├── views └── index.pug └── yarn.lock /.gitignore: -------------------------------------------------------------------------------- 1 | node_modules -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # Minimal Web Push Example 2 | 3 | A minimal example of implementing Web Push notifications for the related blog post explanation: 4 | 5 | http://pqvst.com/2023/11/21/web-push-notifications/ 6 | 7 | Points of interest: 8 | 9 | - [app.js](https://github.com/pqvst/minimal-web-push/blob/main/app.js) - Node.js Backend 10 | - [public/client.js](https://github.com/pqvst/minimal-web-push/blob/main/public/client.js) - Client app 11 | - [public/sw.js](https://github.com/pqvst/minimal-web-push/blob/main/public/sw.js) - Service worker 12 | -------------------------------------------------------------------------------- /app.js: -------------------------------------------------------------------------------- 1 | import bodyParser from 'body-parser'; 2 | import express from 'express'; 3 | import morgan from 'morgan'; 4 | import path from 'path'; 5 | import webPush from 'web-push'; 6 | 7 | const app = express(); 8 | const port = process.env.PORT || 3000; 9 | 10 | app.use(bodyParser.json()); 11 | app.set('views', path.resolve('views')); 12 | app.set('view engine', 'pug'); 13 | app.use(morgan('dev')); 14 | app.use(express.static('public')); 15 | 16 | // TODO: Generate VAPID keys (e.g. https://vapidkeys.com/) 17 | const vapid = { 18 | publicKey: '...', 19 | privateKey: '...', 20 | }; 21 | 22 | webPush.setVapidDetails( 23 | 'mailto:', 24 | vapid.publicKey, 25 | vapid.privateKey 26 | ); 27 | 28 | app.get('/', (req, res) => { 29 | res.render('index', { vapidPublicKey: vapid.publicKey }); 30 | }); 31 | 32 | // TODO: Persist subscriptions (e.g. to db) 33 | const subscriptions = []; 34 | 35 | app.post('/subscribe', (req, res) => { 36 | const sub = req.body; 37 | console.log('New subscription:', sub.endpoint); 38 | subscriptions.push(sub); 39 | res.status(200).end(); 40 | }); 41 | 42 | async function pushNotification(payload) { 43 | await Promise.all(subscriptions.map(async (sub) => { 44 | try { 45 | await webPush.sendNotification(sub, payload); // throws if not successful 46 | } catch (err) { 47 | console.log(sub.endpoint, '->', err.message); 48 | // TODO: Delete subscription (e.g. from db) 49 | } 50 | })); 51 | } 52 | 53 | // Send test notification every 10 seconds 54 | setInterval(() => { 55 | pushNotification('This is a test notification!'); 56 | }, 10 * 1000); 57 | 58 | app.listen(port, () => { 59 | console.log(`Server is running on port ${port}`); 60 | }); 61 | 62 | process.on('SIGTERM', () => { 63 | process.exit(); 64 | }); 65 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "minimal-web-push", 3 | "version": "0.0.0", 4 | "main": "index.js", 5 | "license": "MIT", 6 | "scripts": { 7 | "start": "node app.js" 8 | }, 9 | "type": "module", 10 | "dependencies": { 11 | "body-parser": "^1.20.2", 12 | "express": "^4.18.2", 13 | "morgan": "^1.10.0", 14 | "pug": "^3.0.2", 15 | "web-push": "^3.6.6" 16 | } 17 | } 18 | -------------------------------------------------------------------------------- /public/client.js: -------------------------------------------------------------------------------- 1 | 2 | window.addEventListener('load', () => { 3 | initServiceWorker(); 4 | updatePrompt(); 5 | }); 6 | 7 | //------------------------------------------------------------------------ 8 | // Notification Prompt 9 | //------------------------------------------------------------------------ 10 | 11 | function updatePrompt() { 12 | if ('Notification' in window) { 13 | if (Notification.permission == 'granted' || Notification.permission == 'denied') { 14 | promptLink.style.display = 'none'; 15 | } else { 16 | promptLink.style.display = 'block'; 17 | } 18 | } 19 | } 20 | 21 | function onPromptClick() { 22 | if ('Notification' in window) { 23 | Notification.requestPermission().then((permission) => { 24 | updatePrompt(); 25 | if (permission === 'granted') { 26 | console.log('Notification permission granted.'); 27 | init(); 28 | } else if (permission === 'denied') { 29 | console.warn('Notification permission denied.'); 30 | } 31 | }); 32 | } 33 | } 34 | 35 | //------------------------------------------------------------------------ 36 | // Init Service Worker 37 | //------------------------------------------------------------------------ 38 | 39 | const vapidPublicKey = VAPID_PUBLIC_KEY; 40 | 41 | async function initServiceWorker() { 42 | if ('serviceWorker' in navigator) { 43 | const swRegistration = await navigator.serviceWorker.register('sw.js'); 44 | const subscription = await swRegistration.pushManager.getSubscription(); 45 | if (subscription) { 46 | console.log('User is already subscribed:', subscription); 47 | sendSubscriptionToServer(subscription); 48 | } else { 49 | const subscription = await swRegistration.pushManager.subscribe({ 50 | userVisibleOnly: true, 51 | applicationServerKey: vapidPublicKey 52 | }); 53 | console.log('User subscribed:', subscription); 54 | sendSubscriptionToServer(subscription); 55 | } 56 | } else { 57 | console.warn('Service worker is not supported'); 58 | } 59 | } 60 | 61 | function sendSubscriptionToServer(subscription) { 62 | fetch('/subscribe', { 63 | method: 'post', 64 | body: JSON.stringify(subscription), 65 | headers: { 'content-type': 'application/json' } 66 | }); 67 | } 68 | -------------------------------------------------------------------------------- /public/sw.js: -------------------------------------------------------------------------------- 1 | 2 | //------------------------------------------------------------------------ 3 | // Notification Callback 4 | //------------------------------------------------------------------------ 5 | 6 | self.addEventListener('push', (event) => { 7 | const options = { 8 | body: event.data.text(), 9 | icon: '/apple-touch-icon.png', 10 | badge: '/badge.png', 11 | }; 12 | event.waitUntil(self.registration.showNotification('My App', options)); 13 | }); 14 | 15 | //------------------------------------------------------------------------ 16 | // Clickable Notifications 17 | //------------------------------------------------------------------------ 18 | 19 | const targetUrl = 'http://localhost:3000'; 20 | 21 | self.addEventListener('notificationclick', (event) => { 22 | self.console.log('notificationclick'); 23 | event.notification.close(); // Android needs explicit close. 24 | event.waitUntil( 25 | clients.matchAll({type: 'window'}).then( windowClients => { 26 | // Check if there is already a window/tab open with the target URL 27 | for (var i = 0; i < windowClients.length; i++) { 28 | var client = windowClients[i]; 29 | // If so, just focus it. 30 | if (client.url === targetUrl && 'focus' in client) { 31 | return client.focus(); 32 | } 33 | } 34 | // If not, then open the target URL in a new window/tab. 35 | if (clients.openWindow) { 36 | return clients.openWindow(targetUrl); 37 | } 38 | }) 39 | ); 40 | }); 41 | -------------------------------------------------------------------------------- /views/index.pug: -------------------------------------------------------------------------------- 1 | script. 2 | const VAPID_PUBLIC_KEY = '#{vapidPublicKey}'; 3 | 4 | script(src="/client.js") 5 | 6 | h1 Minimal Web Push Example 7 | 8 | a(href="#" id="promptLink" onclick="onPromptClick()") Enable notifications 9 | -------------------------------------------------------------------------------- /yarn.lock: -------------------------------------------------------------------------------- 1 | # THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY. 2 | # yarn lockfile v1 3 | 4 | 5 | "@babel/helper-string-parser@^7.23.4": 6 | version "7.23.4" 7 | resolved "https://registry.yarnpkg.com/@babel/helper-string-parser/-/helper-string-parser-7.23.4.tgz#9478c707febcbbe1ddb38a3d91a2e054ae622d83" 8 | integrity sha512-803gmbQdqwdf4olxrX4AJyFBV/RTr3rSmOj0rKwesmzlfhYNDEs+/iOcznzpNWlJlIlTJC2QfPFcHB6DlzdVLQ== 9 | 10 | "@babel/helper-validator-identifier@^7.22.20": 11 | version "7.22.20" 12 | resolved "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.22.20.tgz#c4ae002c61d2879e724581d96665583dbc1dc0e0" 13 | integrity sha512-Y4OZ+ytlatR8AI+8KZfKuL5urKp7qey08ha31L8b3BwewJAoJamTzyvxPR/5D+KkdJCGPq/+8TukHBlY10FX9A== 14 | 15 | "@babel/parser@^7.6.0", "@babel/parser@^7.9.6": 16 | version "7.23.4" 17 | resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.23.4.tgz#409fbe690c333bb70187e2de4021e1e47a026661" 18 | integrity sha512-vf3Xna6UEprW+7t6EtOmFpHNAuxw3xqPZghy+brsnusscJRW5BMUzzHZc5ICjULee81WeUV2jjakG09MDglJXQ== 19 | 20 | "@babel/types@^7.6.1", "@babel/types@^7.9.6": 21 | version "7.23.4" 22 | resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.23.4.tgz#7206a1810fc512a7f7f7d4dace4cb4c1c9dbfb8e" 23 | integrity sha512-7uIFwVYpoplT5jp/kVv6EF93VaJ8H+Yn5IczYiaAi98ajzjfoZfslet/e0sLh+wVBjb2qqIut1b0S26VSafsSQ== 24 | dependencies: 25 | "@babel/helper-string-parser" "^7.23.4" 26 | "@babel/helper-validator-identifier" "^7.22.20" 27 | to-fast-properties "^2.0.0" 28 | 29 | accepts@~1.3.8: 30 | version "1.3.8" 31 | resolved "https://registry.yarnpkg.com/accepts/-/accepts-1.3.8.tgz#0bf0be125b67014adcb0b0921e62db7bffe16b2e" 32 | integrity sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw== 33 | dependencies: 34 | mime-types "~2.1.34" 35 | negotiator "0.6.3" 36 | 37 | acorn@^7.1.1: 38 | version "7.4.1" 39 | resolved "https://registry.yarnpkg.com/acorn/-/acorn-7.4.1.tgz#feaed255973d2e77555b83dbc08851a6c63520fa" 40 | integrity sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A== 41 | 42 | agent-base@^7.0.2: 43 | version "7.1.0" 44 | resolved "https://registry.yarnpkg.com/agent-base/-/agent-base-7.1.0.tgz#536802b76bc0b34aa50195eb2442276d613e3434" 45 | integrity sha512-o/zjMZRhJxny7OyEF+Op8X+efiELC7k7yOjMzgfzVqOzXqkBkWI79YoTdOtsuWd5BWhAGAuOY/Xa6xpiaWXiNg== 46 | dependencies: 47 | debug "^4.3.4" 48 | 49 | array-flatten@1.1.1: 50 | version "1.1.1" 51 | resolved "https://registry.yarnpkg.com/array-flatten/-/array-flatten-1.1.1.tgz#9a5f699051b1e7073328f2a008968b64ea2955d2" 52 | integrity sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg== 53 | 54 | asap@~2.0.3: 55 | version "2.0.6" 56 | resolved "https://registry.yarnpkg.com/asap/-/asap-2.0.6.tgz#e50347611d7e690943208bbdafebcbc2fb866d46" 57 | integrity sha512-BSHWgDSAiKs50o2Re8ppvp3seVHXSRM44cdSsT9FfNEUUZLOGWVCsiWaRPWM1Znn+mqZ1OfVZ3z3DWEzSp7hRA== 58 | 59 | asn1.js@^5.3.0: 60 | version "5.4.1" 61 | resolved "https://registry.yarnpkg.com/asn1.js/-/asn1.js-5.4.1.tgz#11a980b84ebb91781ce35b0fdc2ee294e3783f07" 62 | integrity sha512-+I//4cYPccV8LdmBLiX8CYvf9Sp3vQsrqu2QNXRcrbiWvcx/UdlFiqUJJzxRQxgsZmvhXhn4cSKeSmoFjVdupA== 63 | dependencies: 64 | bn.js "^4.0.0" 65 | inherits "^2.0.1" 66 | minimalistic-assert "^1.0.0" 67 | safer-buffer "^2.1.0" 68 | 69 | assert-never@^1.2.1: 70 | version "1.2.1" 71 | resolved "https://registry.yarnpkg.com/assert-never/-/assert-never-1.2.1.tgz#11f0e363bf146205fb08193b5c7b90f4d1cf44fe" 72 | integrity sha512-TaTivMB6pYI1kXwrFlEhLeGfOqoDNdTxjCdwRfFFkEA30Eu+k48W34nlok2EYWJfFFzqaEmichdNM7th6M5HNw== 73 | 74 | babel-walk@3.0.0-canary-5: 75 | version "3.0.0-canary-5" 76 | resolved "https://registry.yarnpkg.com/babel-walk/-/babel-walk-3.0.0-canary-5.tgz#f66ecd7298357aee44955f235a6ef54219104b11" 77 | integrity sha512-GAwkz0AihzY5bkwIY5QDR+LvsRQgB/B+1foMPvi0FZPMl5fjD7ICiznUiBdLYMH1QYe6vqu4gWYytZOccLouFw== 78 | dependencies: 79 | "@babel/types" "^7.9.6" 80 | 81 | basic-auth@~2.0.1: 82 | version "2.0.1" 83 | resolved "https://registry.yarnpkg.com/basic-auth/-/basic-auth-2.0.1.tgz#b998279bf47ce38344b4f3cf916d4679bbf51e3a" 84 | integrity sha512-NF+epuEdnUYVlGuhaxbbq+dvJttwLnGY+YixlXlME5KpQ5W3CnXA5cVTneY3SPbPDRkcjMbifrwmFYcClgOZeg== 85 | dependencies: 86 | safe-buffer "5.1.2" 87 | 88 | bn.js@^4.0.0: 89 | version "4.12.0" 90 | resolved "https://registry.yarnpkg.com/bn.js/-/bn.js-4.12.0.tgz#775b3f278efbb9718eec7361f483fb36fbbfea88" 91 | integrity sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA== 92 | 93 | body-parser@1.20.1: 94 | version "1.20.1" 95 | resolved "https://registry.yarnpkg.com/body-parser/-/body-parser-1.20.1.tgz#b1812a8912c195cd371a3ee5e66faa2338a5c668" 96 | integrity sha512-jWi7abTbYwajOytWCQc37VulmWiRae5RyTpaCyDcS5/lMdtwSz5lOpDE67srw/HYe35f1z3fDQw+3txg7gNtWw== 97 | dependencies: 98 | bytes "3.1.2" 99 | content-type "~1.0.4" 100 | debug "2.6.9" 101 | depd "2.0.0" 102 | destroy "1.2.0" 103 | http-errors "2.0.0" 104 | iconv-lite "0.4.24" 105 | on-finished "2.4.1" 106 | qs "6.11.0" 107 | raw-body "2.5.1" 108 | type-is "~1.6.18" 109 | unpipe "1.0.0" 110 | 111 | body-parser@^1.20.2: 112 | version "1.20.2" 113 | resolved "https://registry.yarnpkg.com/body-parser/-/body-parser-1.20.2.tgz#6feb0e21c4724d06de7ff38da36dad4f57a747fd" 114 | integrity sha512-ml9pReCu3M61kGlqoTm2umSXTlRTuGTx0bfYj+uIUKKYycG5NtSbeetV3faSU6R7ajOPw0g/J1PvK4qNy7s5bA== 115 | dependencies: 116 | bytes "3.1.2" 117 | content-type "~1.0.5" 118 | debug "2.6.9" 119 | depd "2.0.0" 120 | destroy "1.2.0" 121 | http-errors "2.0.0" 122 | iconv-lite "0.4.24" 123 | on-finished "2.4.1" 124 | qs "6.11.0" 125 | raw-body "2.5.2" 126 | type-is "~1.6.18" 127 | unpipe "1.0.0" 128 | 129 | buffer-equal-constant-time@1.0.1: 130 | version "1.0.1" 131 | resolved "https://registry.yarnpkg.com/buffer-equal-constant-time/-/buffer-equal-constant-time-1.0.1.tgz#f8e71132f7ffe6e01a5c9697a4c6f3e48d5cc819" 132 | integrity sha512-zRpUiDwd/xk6ADqPMATG8vc9VPrkck7T07OIx0gnjmJAnHnTVXNQG3vfvWNuiZIkwu9KrKdA1iJKfsfTVxE6NA== 133 | 134 | bytes@3.1.2: 135 | version "3.1.2" 136 | resolved "https://registry.yarnpkg.com/bytes/-/bytes-3.1.2.tgz#8b0beeb98605adf1b128fa4386403c009e0221a5" 137 | integrity sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg== 138 | 139 | call-bind@^1.0.0, call-bind@^1.0.2: 140 | version "1.0.5" 141 | resolved "https://registry.yarnpkg.com/call-bind/-/call-bind-1.0.5.tgz#6fa2b7845ce0ea49bf4d8b9ef64727a2c2e2e513" 142 | integrity sha512-C3nQxfFZxFRVoJoGKKI8y3MOEo129NQ+FgQ08iye+Mk4zNZZGdjfs06bVTr+DBSlA66Q2VEcMki/cUCP4SercQ== 143 | dependencies: 144 | function-bind "^1.1.2" 145 | get-intrinsic "^1.2.1" 146 | set-function-length "^1.1.1" 147 | 148 | character-parser@^2.2.0: 149 | version "2.2.0" 150 | resolved "https://registry.yarnpkg.com/character-parser/-/character-parser-2.2.0.tgz#c7ce28f36d4bcd9744e5ffc2c5fcde1c73261fc0" 151 | integrity sha512-+UqJQjFEFaTAs3bNsF2j2kEN1baG/zghZbdqoYEDxGZtJo9LBzl1A+m0D4n3qKx8N2FNv8/Xp6yV9mQmBuptaw== 152 | dependencies: 153 | is-regex "^1.0.3" 154 | 155 | constantinople@^4.0.1: 156 | version "4.0.1" 157 | resolved "https://registry.yarnpkg.com/constantinople/-/constantinople-4.0.1.tgz#0def113fa0e4dc8de83331a5cf79c8b325213151" 158 | integrity sha512-vCrqcSIq4//Gx74TXXCGnHpulY1dskqLTFGDmhrGxzeXL8lF8kvXv6mpNWlJj1uD4DW23D4ljAqbY4RRaaUZIw== 159 | dependencies: 160 | "@babel/parser" "^7.6.0" 161 | "@babel/types" "^7.6.1" 162 | 163 | content-disposition@0.5.4: 164 | version "0.5.4" 165 | resolved "https://registry.yarnpkg.com/content-disposition/-/content-disposition-0.5.4.tgz#8b82b4efac82512a02bb0b1dcec9d2c5e8eb5bfe" 166 | integrity sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ== 167 | dependencies: 168 | safe-buffer "5.2.1" 169 | 170 | content-type@~1.0.4, content-type@~1.0.5: 171 | version "1.0.5" 172 | resolved "https://registry.yarnpkg.com/content-type/-/content-type-1.0.5.tgz#8b773162656d1d1086784c8f23a54ce6d73d7918" 173 | integrity sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA== 174 | 175 | cookie-signature@1.0.6: 176 | version "1.0.6" 177 | resolved "https://registry.yarnpkg.com/cookie-signature/-/cookie-signature-1.0.6.tgz#e303a882b342cc3ee8ca513a79999734dab3ae2c" 178 | integrity sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ== 179 | 180 | cookie@0.5.0: 181 | version "0.5.0" 182 | resolved "https://registry.yarnpkg.com/cookie/-/cookie-0.5.0.tgz#d1f5d71adec6558c58f389987c366aa47e994f8b" 183 | integrity sha512-YZ3GUyn/o8gfKJlnlX7g7xq4gyO6OSuhGPKaaGssGB2qgDUS0gPgtTvoyZLTt9Ab6dC4hfc9dV5arkvc/OCmrw== 184 | 185 | debug@2.6.9: 186 | version "2.6.9" 187 | resolved "https://registry.yarnpkg.com/debug/-/debug-2.6.9.tgz#5d128515df134ff327e90a4c93f4e077a536341f" 188 | integrity sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA== 189 | dependencies: 190 | ms "2.0.0" 191 | 192 | debug@4, debug@^4.3.4: 193 | version "4.3.4" 194 | resolved "https://registry.yarnpkg.com/debug/-/debug-4.3.4.tgz#1319f6579357f2338d3337d2cdd4914bb5dcc865" 195 | integrity sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ== 196 | dependencies: 197 | ms "2.1.2" 198 | 199 | define-data-property@^1.1.1: 200 | version "1.1.1" 201 | resolved "https://registry.yarnpkg.com/define-data-property/-/define-data-property-1.1.1.tgz#c35f7cd0ab09883480d12ac5cb213715587800b3" 202 | integrity sha512-E7uGkTzkk1d0ByLeSc6ZsFS79Axg+m1P/VsgYsxHgiuc3tFSj+MjMIwe90FC4lOAZzNBdY7kkO2P2wKdsQ1vgQ== 203 | dependencies: 204 | get-intrinsic "^1.2.1" 205 | gopd "^1.0.1" 206 | has-property-descriptors "^1.0.0" 207 | 208 | depd@2.0.0, depd@~2.0.0: 209 | version "2.0.0" 210 | resolved "https://registry.yarnpkg.com/depd/-/depd-2.0.0.tgz#b696163cc757560d09cf22cc8fad1571b79e76df" 211 | integrity sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw== 212 | 213 | destroy@1.2.0: 214 | version "1.2.0" 215 | resolved "https://registry.yarnpkg.com/destroy/-/destroy-1.2.0.tgz#4803735509ad8be552934c67df614f94e66fa015" 216 | integrity sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg== 217 | 218 | doctypes@^1.1.0: 219 | version "1.1.0" 220 | resolved "https://registry.yarnpkg.com/doctypes/-/doctypes-1.1.0.tgz#ea80b106a87538774e8a3a4a5afe293de489e0a9" 221 | integrity sha512-LLBi6pEqS6Do3EKQ3J0NqHWV5hhb78Pi8vvESYwyOy2c31ZEZVdtitdzsQsKb7878PEERhzUk0ftqGhG6Mz+pQ== 222 | 223 | ecdsa-sig-formatter@1.0.11: 224 | version "1.0.11" 225 | resolved "https://registry.yarnpkg.com/ecdsa-sig-formatter/-/ecdsa-sig-formatter-1.0.11.tgz#ae0f0fa2d85045ef14a817daa3ce9acd0489e5bf" 226 | integrity sha512-nagl3RYrbNv6kQkeJIpt6NJZy8twLB/2vtz6yN9Z4vRKHN4/QZJIEbqohALSgwKdnksuY3k5Addp5lg8sVoVcQ== 227 | dependencies: 228 | safe-buffer "^5.0.1" 229 | 230 | ee-first@1.1.1: 231 | version "1.1.1" 232 | resolved "https://registry.yarnpkg.com/ee-first/-/ee-first-1.1.1.tgz#590c61156b0ae2f4f0255732a158b266bc56b21d" 233 | integrity sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow== 234 | 235 | encodeurl@~1.0.2: 236 | version "1.0.2" 237 | resolved "https://registry.yarnpkg.com/encodeurl/-/encodeurl-1.0.2.tgz#ad3ff4c86ec2d029322f5a02c3a9a606c95b3f59" 238 | integrity sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w== 239 | 240 | escape-html@~1.0.3: 241 | version "1.0.3" 242 | resolved "https://registry.yarnpkg.com/escape-html/-/escape-html-1.0.3.tgz#0258eae4d3d0c0974de1c169188ef0051d1d1988" 243 | integrity sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow== 244 | 245 | etag@~1.8.1: 246 | version "1.8.1" 247 | resolved "https://registry.yarnpkg.com/etag/-/etag-1.8.1.tgz#41ae2eeb65efa62268aebfea83ac7d79299b0887" 248 | integrity sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg== 249 | 250 | express@^4.18.2: 251 | version "4.18.2" 252 | resolved "https://registry.yarnpkg.com/express/-/express-4.18.2.tgz#3fabe08296e930c796c19e3c516979386ba9fd59" 253 | integrity sha512-5/PsL6iGPdfQ/lKM1UuielYgv3BUoJfz1aUwU9vHZ+J7gyvwdQXFEBIEIaxeGf0GIcreATNyBExtalisDbuMqQ== 254 | dependencies: 255 | accepts "~1.3.8" 256 | array-flatten "1.1.1" 257 | body-parser "1.20.1" 258 | content-disposition "0.5.4" 259 | content-type "~1.0.4" 260 | cookie "0.5.0" 261 | cookie-signature "1.0.6" 262 | debug "2.6.9" 263 | depd "2.0.0" 264 | encodeurl "~1.0.2" 265 | escape-html "~1.0.3" 266 | etag "~1.8.1" 267 | finalhandler "1.2.0" 268 | fresh "0.5.2" 269 | http-errors "2.0.0" 270 | merge-descriptors "1.0.1" 271 | methods "~1.1.2" 272 | on-finished "2.4.1" 273 | parseurl "~1.3.3" 274 | path-to-regexp "0.1.7" 275 | proxy-addr "~2.0.7" 276 | qs "6.11.0" 277 | range-parser "~1.2.1" 278 | safe-buffer "5.2.1" 279 | send "0.18.0" 280 | serve-static "1.15.0" 281 | setprototypeof "1.2.0" 282 | statuses "2.0.1" 283 | type-is "~1.6.18" 284 | utils-merge "1.0.1" 285 | vary "~1.1.2" 286 | 287 | finalhandler@1.2.0: 288 | version "1.2.0" 289 | resolved "https://registry.yarnpkg.com/finalhandler/-/finalhandler-1.2.0.tgz#7d23fe5731b207b4640e4fcd00aec1f9207a7b32" 290 | integrity sha512-5uXcUVftlQMFnWC9qu/svkWv3GTd2PfUhK/3PLkYNAe7FbqJMt3515HaxE6eRL74GdsriiwujiawdaB1BpEISg== 291 | dependencies: 292 | debug "2.6.9" 293 | encodeurl "~1.0.2" 294 | escape-html "~1.0.3" 295 | on-finished "2.4.1" 296 | parseurl "~1.3.3" 297 | statuses "2.0.1" 298 | unpipe "~1.0.0" 299 | 300 | forwarded@0.2.0: 301 | version "0.2.0" 302 | resolved "https://registry.yarnpkg.com/forwarded/-/forwarded-0.2.0.tgz#2269936428aad4c15c7ebe9779a84bf0b2a81811" 303 | integrity sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow== 304 | 305 | fresh@0.5.2: 306 | version "0.5.2" 307 | resolved "https://registry.yarnpkg.com/fresh/-/fresh-0.5.2.tgz#3d8cadd90d976569fa835ab1f8e4b23a105605a7" 308 | integrity sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q== 309 | 310 | function-bind@^1.1.2: 311 | version "1.1.2" 312 | resolved "https://registry.yarnpkg.com/function-bind/-/function-bind-1.1.2.tgz#2c02d864d97f3ea6c8830c464cbd11ab6eab7a1c" 313 | integrity sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA== 314 | 315 | get-intrinsic@^1.0.2, get-intrinsic@^1.1.3, get-intrinsic@^1.2.1, get-intrinsic@^1.2.2: 316 | version "1.2.2" 317 | resolved "https://registry.yarnpkg.com/get-intrinsic/-/get-intrinsic-1.2.2.tgz#281b7622971123e1ef4b3c90fd7539306da93f3b" 318 | integrity sha512-0gSo4ml/0j98Y3lngkFEot/zhiCeWsbYIlZ+uZOVgzLyLaUw7wxUL+nCTP0XJvJg1AXulJRI3UJi8GsbDuxdGA== 319 | dependencies: 320 | function-bind "^1.1.2" 321 | has-proto "^1.0.1" 322 | has-symbols "^1.0.3" 323 | hasown "^2.0.0" 324 | 325 | gopd@^1.0.1: 326 | version "1.0.1" 327 | resolved "https://registry.yarnpkg.com/gopd/-/gopd-1.0.1.tgz#29ff76de69dac7489b7c0918a5788e56477c332c" 328 | integrity sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA== 329 | dependencies: 330 | get-intrinsic "^1.1.3" 331 | 332 | has-property-descriptors@^1.0.0: 333 | version "1.0.1" 334 | resolved "https://registry.yarnpkg.com/has-property-descriptors/-/has-property-descriptors-1.0.1.tgz#52ba30b6c5ec87fd89fa574bc1c39125c6f65340" 335 | integrity sha512-VsX8eaIewvas0xnvinAe9bw4WfIeODpGYikiWYLH+dma0Jw6KHYqWiWfhQlgOVK8D6PvjubK5Uc4P0iIhIcNVg== 336 | dependencies: 337 | get-intrinsic "^1.2.2" 338 | 339 | has-proto@^1.0.1: 340 | version "1.0.1" 341 | resolved "https://registry.yarnpkg.com/has-proto/-/has-proto-1.0.1.tgz#1885c1305538958aff469fef37937c22795408e0" 342 | integrity sha512-7qE+iP+O+bgF9clE5+UoBFzE65mlBiVj3tKCrlNQ0Ogwm0BjpT/gK4SlLYDMybDh5I3TCTKnPPa0oMG7JDYrhg== 343 | 344 | has-symbols@^1.0.2, has-symbols@^1.0.3: 345 | version "1.0.3" 346 | resolved "https://registry.yarnpkg.com/has-symbols/-/has-symbols-1.0.3.tgz#bb7b2c4349251dce87b125f7bdf874aa7c8b39f8" 347 | integrity sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A== 348 | 349 | has-tostringtag@^1.0.0: 350 | version "1.0.0" 351 | resolved "https://registry.yarnpkg.com/has-tostringtag/-/has-tostringtag-1.0.0.tgz#7e133818a7d394734f941e73c3d3f9291e658b25" 352 | integrity sha512-kFjcSNhnlGV1kyoGk7OXKSawH5JOb/LzUc5w9B02hOTO0dfFRjbHQKvg1d6cf3HbeUmtU9VbbV3qzZ2Teh97WQ== 353 | dependencies: 354 | has-symbols "^1.0.2" 355 | 356 | hasown@^2.0.0: 357 | version "2.0.0" 358 | resolved "https://registry.yarnpkg.com/hasown/-/hasown-2.0.0.tgz#f4c513d454a57b7c7e1650778de226b11700546c" 359 | integrity sha512-vUptKVTpIJhcczKBbgnS+RtcuYMB8+oNzPK2/Hp3hanz8JmpATdmmgLgSaadVREkDm+e2giHwY3ZRkyjSIDDFA== 360 | dependencies: 361 | function-bind "^1.1.2" 362 | 363 | http-errors@2.0.0: 364 | version "2.0.0" 365 | resolved "https://registry.yarnpkg.com/http-errors/-/http-errors-2.0.0.tgz#b7774a1486ef73cf7667ac9ae0858c012c57b9d3" 366 | integrity sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ== 367 | dependencies: 368 | depd "2.0.0" 369 | inherits "2.0.4" 370 | setprototypeof "1.2.0" 371 | statuses "2.0.1" 372 | toidentifier "1.0.1" 373 | 374 | http_ece@1.1.0: 375 | version "1.1.0" 376 | resolved "https://registry.yarnpkg.com/http_ece/-/http_ece-1.1.0.tgz#74780c6eb32d8ddfe9e36a83abcd81fe0cd4fb75" 377 | integrity sha512-bptAfCDdPJxOs5zYSe7Y3lpr772s1G346R4Td5LgRUeCwIGpCGDUTJxRrhTNcAXbx37spge0kWEIH7QAYWNTlA== 378 | dependencies: 379 | urlsafe-base64 "~1.0.0" 380 | 381 | https-proxy-agent@^7.0.0: 382 | version "7.0.2" 383 | resolved "https://registry.yarnpkg.com/https-proxy-agent/-/https-proxy-agent-7.0.2.tgz#e2645b846b90e96c6e6f347fb5b2e41f1590b09b" 384 | integrity sha512-NmLNjm6ucYwtcUmL7JQC1ZQ57LmHP4lT15FQ8D61nak1rO6DH+fz5qNK2Ap5UN4ZapYICE3/0KodcLYSPsPbaA== 385 | dependencies: 386 | agent-base "^7.0.2" 387 | debug "4" 388 | 389 | iconv-lite@0.4.24: 390 | version "0.4.24" 391 | resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.4.24.tgz#2022b4b25fbddc21d2f524974a474aafe733908b" 392 | integrity sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA== 393 | dependencies: 394 | safer-buffer ">= 2.1.2 < 3" 395 | 396 | inherits@2.0.4, inherits@^2.0.1: 397 | version "2.0.4" 398 | resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.4.tgz#0fa2c64f932917c3433a0ded55363aae37416b7c" 399 | integrity sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ== 400 | 401 | ipaddr.js@1.9.1: 402 | version "1.9.1" 403 | resolved "https://registry.yarnpkg.com/ipaddr.js/-/ipaddr.js-1.9.1.tgz#bff38543eeb8984825079ff3a2a8e6cbd46781b3" 404 | integrity sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g== 405 | 406 | is-core-module@^2.13.0: 407 | version "2.13.1" 408 | resolved "https://registry.yarnpkg.com/is-core-module/-/is-core-module-2.13.1.tgz#ad0d7532c6fea9da1ebdc82742d74525c6273384" 409 | integrity sha512-hHrIjvZsftOsvKSn2TRYl63zvxsgE0K+0mYMoH6gD4omR5IWB2KynivBQczo3+wF1cCkjzvptnI9Q0sPU66ilw== 410 | dependencies: 411 | hasown "^2.0.0" 412 | 413 | is-expression@^4.0.0: 414 | version "4.0.0" 415 | resolved "https://registry.yarnpkg.com/is-expression/-/is-expression-4.0.0.tgz#c33155962abf21d0afd2552514d67d2ec16fd2ab" 416 | integrity sha512-zMIXX63sxzG3XrkHkrAPvm/OVZVSCPNkwMHU8oTX7/U3AL78I0QXCEICXUM13BIa8TYGZ68PiTKfQz3yaTNr4A== 417 | dependencies: 418 | acorn "^7.1.1" 419 | object-assign "^4.1.1" 420 | 421 | is-promise@^2.0.0: 422 | version "2.2.2" 423 | resolved "https://registry.yarnpkg.com/is-promise/-/is-promise-2.2.2.tgz#39ab959ccbf9a774cf079f7b40c7a26f763135f1" 424 | integrity sha512-+lP4/6lKUBfQjZ2pdxThZvLUAafmZb8OAxFb8XXtiQmS35INgr85hdOGoEs124ez1FCnZJt6jau/T+alh58QFQ== 425 | 426 | is-regex@^1.0.3: 427 | version "1.1.4" 428 | resolved "https://registry.yarnpkg.com/is-regex/-/is-regex-1.1.4.tgz#eef5663cd59fa4c0ae339505323df6854bb15958" 429 | integrity sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg== 430 | dependencies: 431 | call-bind "^1.0.2" 432 | has-tostringtag "^1.0.0" 433 | 434 | js-stringify@^1.0.2: 435 | version "1.0.2" 436 | resolved "https://registry.yarnpkg.com/js-stringify/-/js-stringify-1.0.2.tgz#1736fddfd9724f28a3682adc6230ae7e4e9679db" 437 | integrity sha512-rtS5ATOo2Q5k1G+DADISilDA6lv79zIiwFd6CcjuIxGKLFm5C+RLImRscVap9k55i+MOZwgliw+NejvkLuGD5g== 438 | 439 | jstransformer@1.0.0: 440 | version "1.0.0" 441 | resolved "https://registry.yarnpkg.com/jstransformer/-/jstransformer-1.0.0.tgz#ed8bf0921e2f3f1ed4d5c1a44f68709ed24722c3" 442 | integrity sha512-C9YK3Rf8q6VAPDCCU9fnqo3mAfOH6vUGnMcP4AQAYIEpWtfGLpwOTmZ+igtdK5y+VvI2n3CyYSzy4Qh34eq24A== 443 | dependencies: 444 | is-promise "^2.0.0" 445 | promise "^7.0.1" 446 | 447 | jwa@^2.0.0: 448 | version "2.0.0" 449 | resolved "https://registry.yarnpkg.com/jwa/-/jwa-2.0.0.tgz#a7e9c3f29dae94027ebcaf49975c9345593410fc" 450 | integrity sha512-jrZ2Qx916EA+fq9cEAeCROWPTfCwi1IVHqT2tapuqLEVVDKFDENFw1oL+MwrTvH6msKxsd1YTDVw6uKEcsrLEA== 451 | dependencies: 452 | buffer-equal-constant-time "1.0.1" 453 | ecdsa-sig-formatter "1.0.11" 454 | safe-buffer "^5.0.1" 455 | 456 | jws@^4.0.0: 457 | version "4.0.0" 458 | resolved "https://registry.yarnpkg.com/jws/-/jws-4.0.0.tgz#2d4e8cf6a318ffaa12615e9dec7e86e6c97310f4" 459 | integrity sha512-KDncfTmOZoOMTFG4mBlG0qUIOlc03fmzH+ru6RgYVZhPkyiy/92Owlt/8UEN+a4TXR1FQetfIpJE8ApdvdVxTg== 460 | dependencies: 461 | jwa "^2.0.0" 462 | safe-buffer "^5.0.1" 463 | 464 | media-typer@0.3.0: 465 | version "0.3.0" 466 | resolved "https://registry.yarnpkg.com/media-typer/-/media-typer-0.3.0.tgz#8710d7af0aa626f8fffa1ce00168545263255748" 467 | integrity sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ== 468 | 469 | merge-descriptors@1.0.1: 470 | version "1.0.1" 471 | resolved "https://registry.yarnpkg.com/merge-descriptors/-/merge-descriptors-1.0.1.tgz#b00aaa556dd8b44568150ec9d1b953f3f90cbb61" 472 | integrity sha512-cCi6g3/Zr1iqQi6ySbseM1Xvooa98N0w31jzUYrXPX2xqObmFGHJ0tQ5u74H3mVh7wLouTseZyYIq39g8cNp1w== 473 | 474 | methods@~1.1.2: 475 | version "1.1.2" 476 | resolved "https://registry.yarnpkg.com/methods/-/methods-1.1.2.tgz#5529a4d67654134edcc5266656835b0f851afcee" 477 | integrity sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w== 478 | 479 | mime-db@1.52.0: 480 | version "1.52.0" 481 | resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.52.0.tgz#bbabcdc02859f4987301c856e3387ce5ec43bf70" 482 | integrity sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg== 483 | 484 | mime-types@~2.1.24, mime-types@~2.1.34: 485 | version "2.1.35" 486 | resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.35.tgz#381a871b62a734450660ae3deee44813f70d959a" 487 | integrity sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw== 488 | dependencies: 489 | mime-db "1.52.0" 490 | 491 | mime@1.6.0: 492 | version "1.6.0" 493 | resolved "https://registry.yarnpkg.com/mime/-/mime-1.6.0.tgz#32cd9e5c64553bd58d19a568af452acff04981b1" 494 | integrity sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg== 495 | 496 | minimalistic-assert@^1.0.0: 497 | version "1.0.1" 498 | resolved "https://registry.yarnpkg.com/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz#2e194de044626d4a10e7f7fbc00ce73e83e4d5c7" 499 | integrity sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A== 500 | 501 | minimist@^1.2.5: 502 | version "1.2.8" 503 | resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.8.tgz#c1a464e7693302e082a075cee0c057741ac4772c" 504 | integrity sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA== 505 | 506 | morgan@^1.10.0: 507 | version "1.10.0" 508 | resolved "https://registry.yarnpkg.com/morgan/-/morgan-1.10.0.tgz#091778abc1fc47cd3509824653dae1faab6b17d7" 509 | integrity sha512-AbegBVI4sh6El+1gNwvD5YIck7nSA36weD7xvIxG4in80j/UoK8AEGaWnnz8v1GxonMCltmlNs5ZKbGvl9b1XQ== 510 | dependencies: 511 | basic-auth "~2.0.1" 512 | debug "2.6.9" 513 | depd "~2.0.0" 514 | on-finished "~2.3.0" 515 | on-headers "~1.0.2" 516 | 517 | ms@2.0.0: 518 | version "2.0.0" 519 | resolved "https://registry.yarnpkg.com/ms/-/ms-2.0.0.tgz#5608aeadfc00be6c2901df5f9861788de0d597c8" 520 | integrity sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A== 521 | 522 | ms@2.1.2: 523 | version "2.1.2" 524 | resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.2.tgz#d09d1f357b443f493382a8eb3ccd183872ae6009" 525 | integrity sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w== 526 | 527 | ms@2.1.3: 528 | version "2.1.3" 529 | resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.3.tgz#574c8138ce1d2b5861f0b44579dbadd60c6615b2" 530 | integrity sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA== 531 | 532 | negotiator@0.6.3: 533 | version "0.6.3" 534 | resolved "https://registry.yarnpkg.com/negotiator/-/negotiator-0.6.3.tgz#58e323a72fedc0d6f9cd4d31fe49f51479590ccd" 535 | integrity sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg== 536 | 537 | object-assign@^4.1.1: 538 | version "4.1.1" 539 | resolved "https://registry.yarnpkg.com/object-assign/-/object-assign-4.1.1.tgz#2109adc7965887cfc05cbbd442cac8bfbb360863" 540 | integrity sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg== 541 | 542 | object-inspect@^1.9.0: 543 | version "1.13.1" 544 | resolved "https://registry.yarnpkg.com/object-inspect/-/object-inspect-1.13.1.tgz#b96c6109324ccfef6b12216a956ca4dc2ff94bc2" 545 | integrity sha512-5qoj1RUiKOMsCCNLV1CBiPYE10sziTsnmNxkAI/rZhiD63CF7IqdFGC/XzjWjpSgLf0LxXX3bDFIh0E18f6UhQ== 546 | 547 | on-finished@2.4.1: 548 | version "2.4.1" 549 | resolved "https://registry.yarnpkg.com/on-finished/-/on-finished-2.4.1.tgz#58c8c44116e54845ad57f14ab10b03533184ac3f" 550 | integrity sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg== 551 | dependencies: 552 | ee-first "1.1.1" 553 | 554 | on-finished@~2.3.0: 555 | version "2.3.0" 556 | resolved "https://registry.yarnpkg.com/on-finished/-/on-finished-2.3.0.tgz#20f1336481b083cd75337992a16971aa2d906947" 557 | integrity sha512-ikqdkGAAyf/X/gPhXGvfgAytDZtDbr+bkNUJ0N9h5MI/dmdgCs3l6hoHrcUv41sRKew3jIwrp4qQDXiK99Utww== 558 | dependencies: 559 | ee-first "1.1.1" 560 | 561 | on-headers@~1.0.2: 562 | version "1.0.2" 563 | resolved "https://registry.yarnpkg.com/on-headers/-/on-headers-1.0.2.tgz#772b0ae6aaa525c399e489adfad90c403eb3c28f" 564 | integrity sha512-pZAE+FJLoyITytdqK0U5s+FIpjN0JP3OzFi/u8Rx+EV5/W+JTWGXG8xFzevE7AjBfDqHv/8vL8qQsIhHnqRkrA== 565 | 566 | parseurl@~1.3.3: 567 | version "1.3.3" 568 | resolved "https://registry.yarnpkg.com/parseurl/-/parseurl-1.3.3.tgz#9da19e7bee8d12dff0513ed5b76957793bc2e8d4" 569 | integrity sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ== 570 | 571 | path-parse@^1.0.7: 572 | version "1.0.7" 573 | resolved "https://registry.yarnpkg.com/path-parse/-/path-parse-1.0.7.tgz#fbc114b60ca42b30d9daf5858e4bd68bbedb6735" 574 | integrity sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw== 575 | 576 | path-to-regexp@0.1.7: 577 | version "0.1.7" 578 | resolved "https://registry.yarnpkg.com/path-to-regexp/-/path-to-regexp-0.1.7.tgz#df604178005f522f15eb4490e7247a1bfaa67f8c" 579 | integrity sha512-5DFkuoqlv1uYQKxy8omFBeJPQcdoE07Kv2sferDCrAq1ohOU+MSDswDIbnx3YAM60qIOnYa53wBhXW0EbMonrQ== 580 | 581 | promise@^7.0.1: 582 | version "7.3.1" 583 | resolved "https://registry.yarnpkg.com/promise/-/promise-7.3.1.tgz#064b72602b18f90f29192b8b1bc418ffd1ebd3bf" 584 | integrity sha512-nolQXZ/4L+bP/UGlkfaIujX9BKxGwmQ9OT4mOt5yvy8iK1h3wqTEJCijzGANTCCl9nWjY41juyAn2K3Q1hLLTg== 585 | dependencies: 586 | asap "~2.0.3" 587 | 588 | proxy-addr@~2.0.7: 589 | version "2.0.7" 590 | resolved "https://registry.yarnpkg.com/proxy-addr/-/proxy-addr-2.0.7.tgz#f19fe69ceab311eeb94b42e70e8c2070f9ba1025" 591 | integrity sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg== 592 | dependencies: 593 | forwarded "0.2.0" 594 | ipaddr.js "1.9.1" 595 | 596 | pug-attrs@^3.0.0: 597 | version "3.0.0" 598 | resolved "https://registry.yarnpkg.com/pug-attrs/-/pug-attrs-3.0.0.tgz#b10451e0348165e31fad1cc23ebddd9dc7347c41" 599 | integrity sha512-azINV9dUtzPMFQktvTXciNAfAuVh/L/JCl0vtPCwvOA21uZrC08K/UnmrL+SXGEVc1FwzjW62+xw5S/uaLj6cA== 600 | dependencies: 601 | constantinople "^4.0.1" 602 | js-stringify "^1.0.2" 603 | pug-runtime "^3.0.0" 604 | 605 | pug-code-gen@^3.0.2: 606 | version "3.0.2" 607 | resolved "https://registry.yarnpkg.com/pug-code-gen/-/pug-code-gen-3.0.2.tgz#ad190f4943133bf186b60b80de483100e132e2ce" 608 | integrity sha512-nJMhW16MbiGRiyR4miDTQMRWDgKplnHyeLvioEJYbk1RsPI3FuA3saEP8uwnTb2nTJEKBU90NFVWJBk4OU5qyg== 609 | dependencies: 610 | constantinople "^4.0.1" 611 | doctypes "^1.1.0" 612 | js-stringify "^1.0.2" 613 | pug-attrs "^3.0.0" 614 | pug-error "^2.0.0" 615 | pug-runtime "^3.0.0" 616 | void-elements "^3.1.0" 617 | with "^7.0.0" 618 | 619 | pug-error@^2.0.0: 620 | version "2.0.0" 621 | resolved "https://registry.yarnpkg.com/pug-error/-/pug-error-2.0.0.tgz#5c62173cb09c34de2a2ce04f17b8adfec74d8ca5" 622 | integrity sha512-sjiUsi9M4RAGHktC1drQfCr5C5eriu24Lfbt4s+7SykztEOwVZtbFk1RRq0tzLxcMxMYTBR+zMQaG07J/btayQ== 623 | 624 | pug-filters@^4.0.0: 625 | version "4.0.0" 626 | resolved "https://registry.yarnpkg.com/pug-filters/-/pug-filters-4.0.0.tgz#d3e49af5ba8472e9b7a66d980e707ce9d2cc9b5e" 627 | integrity sha512-yeNFtq5Yxmfz0f9z2rMXGw/8/4i1cCFecw/Q7+D0V2DdtII5UvqE12VaZ2AY7ri6o5RNXiweGH79OCq+2RQU4A== 628 | dependencies: 629 | constantinople "^4.0.1" 630 | jstransformer "1.0.0" 631 | pug-error "^2.0.0" 632 | pug-walk "^2.0.0" 633 | resolve "^1.15.1" 634 | 635 | pug-lexer@^5.0.1: 636 | version "5.0.1" 637 | resolved "https://registry.yarnpkg.com/pug-lexer/-/pug-lexer-5.0.1.tgz#ae44628c5bef9b190b665683b288ca9024b8b0d5" 638 | integrity sha512-0I6C62+keXlZPZkOJeVam9aBLVP2EnbeDw3An+k0/QlqdwH6rv8284nko14Na7c0TtqtogfWXcRoFE4O4Ff20w== 639 | dependencies: 640 | character-parser "^2.2.0" 641 | is-expression "^4.0.0" 642 | pug-error "^2.0.0" 643 | 644 | pug-linker@^4.0.0: 645 | version "4.0.0" 646 | resolved "https://registry.yarnpkg.com/pug-linker/-/pug-linker-4.0.0.tgz#12cbc0594fc5a3e06b9fc59e6f93c146962a7708" 647 | integrity sha512-gjD1yzp0yxbQqnzBAdlhbgoJL5qIFJw78juN1NpTLt/mfPJ5VgC4BvkoD3G23qKzJtIIXBbcCt6FioLSFLOHdw== 648 | dependencies: 649 | pug-error "^2.0.0" 650 | pug-walk "^2.0.0" 651 | 652 | pug-load@^3.0.0: 653 | version "3.0.0" 654 | resolved "https://registry.yarnpkg.com/pug-load/-/pug-load-3.0.0.tgz#9fd9cda52202b08adb11d25681fb9f34bd41b662" 655 | integrity sha512-OCjTEnhLWZBvS4zni/WUMjH2YSUosnsmjGBB1An7CsKQarYSWQ0GCVyd4eQPMFJqZ8w9xgs01QdiZXKVjk92EQ== 656 | dependencies: 657 | object-assign "^4.1.1" 658 | pug-walk "^2.0.0" 659 | 660 | pug-parser@^6.0.0: 661 | version "6.0.0" 662 | resolved "https://registry.yarnpkg.com/pug-parser/-/pug-parser-6.0.0.tgz#a8fdc035863a95b2c1dc5ebf4ecf80b4e76a1260" 663 | integrity sha512-ukiYM/9cH6Cml+AOl5kETtM9NR3WulyVP2y4HOU45DyMim1IeP/OOiyEWRr6qk5I5klpsBnbuHpwKmTx6WURnw== 664 | dependencies: 665 | pug-error "^2.0.0" 666 | token-stream "1.0.0" 667 | 668 | pug-runtime@^3.0.0, pug-runtime@^3.0.1: 669 | version "3.0.1" 670 | resolved "https://registry.yarnpkg.com/pug-runtime/-/pug-runtime-3.0.1.tgz#f636976204723f35a8c5f6fad6acda2a191b83d7" 671 | integrity sha512-L50zbvrQ35TkpHwv0G6aLSuueDRwc/97XdY8kL3tOT0FmhgG7UypU3VztfV/LATAvmUfYi4wNxSajhSAeNN+Kg== 672 | 673 | pug-strip-comments@^2.0.0: 674 | version "2.0.0" 675 | resolved "https://registry.yarnpkg.com/pug-strip-comments/-/pug-strip-comments-2.0.0.tgz#f94b07fd6b495523330f490a7f554b4ff876303e" 676 | integrity sha512-zo8DsDpH7eTkPHCXFeAk1xZXJbyoTfdPlNR0bK7rpOMuhBYb0f5qUVCO1xlsitYd3w5FQTK7zpNVKb3rZoUrrQ== 677 | dependencies: 678 | pug-error "^2.0.0" 679 | 680 | pug-walk@^2.0.0: 681 | version "2.0.0" 682 | resolved "https://registry.yarnpkg.com/pug-walk/-/pug-walk-2.0.0.tgz#417aabc29232bb4499b5b5069a2b2d2a24d5f5fe" 683 | integrity sha512-yYELe9Q5q9IQhuvqsZNwA5hfPkMJ8u92bQLIMcsMxf/VADjNtEYptU+inlufAFYcWdHlwNfZOEnOOQrZrcyJCQ== 684 | 685 | pug@^3.0.2: 686 | version "3.0.2" 687 | resolved "https://registry.yarnpkg.com/pug/-/pug-3.0.2.tgz#f35c7107343454e43bc27ae0ff76c731b78ea535" 688 | integrity sha512-bp0I/hiK1D1vChHh6EfDxtndHji55XP/ZJKwsRqrz6lRia6ZC2OZbdAymlxdVFwd1L70ebrVJw4/eZ79skrIaw== 689 | dependencies: 690 | pug-code-gen "^3.0.2" 691 | pug-filters "^4.0.0" 692 | pug-lexer "^5.0.1" 693 | pug-linker "^4.0.0" 694 | pug-load "^3.0.0" 695 | pug-parser "^6.0.0" 696 | pug-runtime "^3.0.1" 697 | pug-strip-comments "^2.0.0" 698 | 699 | qs@6.11.0: 700 | version "6.11.0" 701 | resolved "https://registry.yarnpkg.com/qs/-/qs-6.11.0.tgz#fd0d963446f7a65e1367e01abd85429453f0c37a" 702 | integrity sha512-MvjoMCJwEarSbUYk5O+nmoSzSutSsTwF85zcHPQ9OrlFoZOYIjaqBAJIqIXjptyD5vThxGq52Xu/MaJzRkIk4Q== 703 | dependencies: 704 | side-channel "^1.0.4" 705 | 706 | range-parser@~1.2.1: 707 | version "1.2.1" 708 | resolved "https://registry.yarnpkg.com/range-parser/-/range-parser-1.2.1.tgz#3cf37023d199e1c24d1a55b84800c2f3e6468031" 709 | integrity sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg== 710 | 711 | raw-body@2.5.1: 712 | version "2.5.1" 713 | resolved "https://registry.yarnpkg.com/raw-body/-/raw-body-2.5.1.tgz#fe1b1628b181b700215e5fd42389f98b71392857" 714 | integrity sha512-qqJBtEyVgS0ZmPGdCFPWJ3FreoqvG4MVQln/kCgF7Olq95IbOp0/BWyMwbdtn4VTvkM8Y7khCQ2Xgk/tcrCXig== 715 | dependencies: 716 | bytes "3.1.2" 717 | http-errors "2.0.0" 718 | iconv-lite "0.4.24" 719 | unpipe "1.0.0" 720 | 721 | raw-body@2.5.2: 722 | version "2.5.2" 723 | resolved "https://registry.yarnpkg.com/raw-body/-/raw-body-2.5.2.tgz#99febd83b90e08975087e8f1f9419a149366b68a" 724 | integrity sha512-8zGqypfENjCIqGhgXToC8aB2r7YrBX+AQAfIPs/Mlk+BtPTztOvTS01NRW/3Eh60J+a48lt8qsCzirQ6loCVfA== 725 | dependencies: 726 | bytes "3.1.2" 727 | http-errors "2.0.0" 728 | iconv-lite "0.4.24" 729 | unpipe "1.0.0" 730 | 731 | resolve@^1.15.1: 732 | version "1.22.8" 733 | resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.22.8.tgz#b6c87a9f2aa06dfab52e3d70ac8cde321fa5a48d" 734 | integrity sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw== 735 | dependencies: 736 | is-core-module "^2.13.0" 737 | path-parse "^1.0.7" 738 | supports-preserve-symlinks-flag "^1.0.0" 739 | 740 | safe-buffer@5.1.2: 741 | version "5.1.2" 742 | resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.1.2.tgz#991ec69d296e0313747d59bdfd2b745c35f8828d" 743 | integrity sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g== 744 | 745 | safe-buffer@5.2.1, safe-buffer@^5.0.1: 746 | version "5.2.1" 747 | resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.2.1.tgz#1eaf9fa9bdb1fdd4ec75f58f9cdb4e6b7827eec6" 748 | integrity sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ== 749 | 750 | "safer-buffer@>= 2.1.2 < 3", safer-buffer@^2.1.0: 751 | version "2.1.2" 752 | resolved "https://registry.yarnpkg.com/safer-buffer/-/safer-buffer-2.1.2.tgz#44fa161b0187b9549dd84bb91802f9bd8385cd6a" 753 | integrity sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg== 754 | 755 | send@0.18.0: 756 | version "0.18.0" 757 | resolved "https://registry.yarnpkg.com/send/-/send-0.18.0.tgz#670167cc654b05f5aa4a767f9113bb371bc706be" 758 | integrity sha512-qqWzuOjSFOuqPjFe4NOsMLafToQQwBSOEpS+FwEt3A2V3vKubTquT3vmLTQpFgMXp8AlFWFuP1qKaJZOtPpVXg== 759 | dependencies: 760 | debug "2.6.9" 761 | depd "2.0.0" 762 | destroy "1.2.0" 763 | encodeurl "~1.0.2" 764 | escape-html "~1.0.3" 765 | etag "~1.8.1" 766 | fresh "0.5.2" 767 | http-errors "2.0.0" 768 | mime "1.6.0" 769 | ms "2.1.3" 770 | on-finished "2.4.1" 771 | range-parser "~1.2.1" 772 | statuses "2.0.1" 773 | 774 | serve-static@1.15.0: 775 | version "1.15.0" 776 | resolved "https://registry.yarnpkg.com/serve-static/-/serve-static-1.15.0.tgz#faaef08cffe0a1a62f60cad0c4e513cff0ac9540" 777 | integrity sha512-XGuRDNjXUijsUL0vl6nSD7cwURuzEgglbOaFuZM9g3kwDXOWVTck0jLzjPzGD+TazWbboZYu52/9/XPdUgne9g== 778 | dependencies: 779 | encodeurl "~1.0.2" 780 | escape-html "~1.0.3" 781 | parseurl "~1.3.3" 782 | send "0.18.0" 783 | 784 | set-function-length@^1.1.1: 785 | version "1.1.1" 786 | resolved "https://registry.yarnpkg.com/set-function-length/-/set-function-length-1.1.1.tgz#4bc39fafb0307224a33e106a7d35ca1218d659ed" 787 | integrity sha512-VoaqjbBJKiWtg4yRcKBQ7g7wnGnLV3M8oLvVWwOk2PdYY6PEFegR1vezXR0tw6fZGF9csVakIRjrJiy2veSBFQ== 788 | dependencies: 789 | define-data-property "^1.1.1" 790 | get-intrinsic "^1.2.1" 791 | gopd "^1.0.1" 792 | has-property-descriptors "^1.0.0" 793 | 794 | setprototypeof@1.2.0: 795 | version "1.2.0" 796 | resolved "https://registry.yarnpkg.com/setprototypeof/-/setprototypeof-1.2.0.tgz#66c9a24a73f9fc28cbe66b09fed3d33dcaf1b424" 797 | integrity sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw== 798 | 799 | side-channel@^1.0.4: 800 | version "1.0.4" 801 | resolved "https://registry.yarnpkg.com/side-channel/-/side-channel-1.0.4.tgz#efce5c8fdc104ee751b25c58d4290011fa5ea2cf" 802 | integrity sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw== 803 | dependencies: 804 | call-bind "^1.0.0" 805 | get-intrinsic "^1.0.2" 806 | object-inspect "^1.9.0" 807 | 808 | statuses@2.0.1: 809 | version "2.0.1" 810 | resolved "https://registry.yarnpkg.com/statuses/-/statuses-2.0.1.tgz#55cb000ccf1d48728bd23c685a063998cf1a1b63" 811 | integrity sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ== 812 | 813 | supports-preserve-symlinks-flag@^1.0.0: 814 | version "1.0.0" 815 | resolved "https://registry.yarnpkg.com/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz#6eda4bd344a3c94aea376d4cc31bc77311039e09" 816 | integrity sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w== 817 | 818 | to-fast-properties@^2.0.0: 819 | version "2.0.0" 820 | resolved "https://registry.yarnpkg.com/to-fast-properties/-/to-fast-properties-2.0.0.tgz#dc5e698cbd079265bc73e0377681a4e4e83f616e" 821 | integrity sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog== 822 | 823 | toidentifier@1.0.1: 824 | version "1.0.1" 825 | resolved "https://registry.yarnpkg.com/toidentifier/-/toidentifier-1.0.1.tgz#3be34321a88a820ed1bd80dfaa33e479fbb8dd35" 826 | integrity sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA== 827 | 828 | token-stream@1.0.0: 829 | version "1.0.0" 830 | resolved "https://registry.yarnpkg.com/token-stream/-/token-stream-1.0.0.tgz#cc200eab2613f4166d27ff9afc7ca56d49df6eb4" 831 | integrity sha512-VSsyNPPW74RpHwR8Fc21uubwHY7wMDeJLys2IX5zJNih+OnAnaifKHo+1LHT7DAdloQ7apeaaWg8l7qnf/TnEg== 832 | 833 | type-is@~1.6.18: 834 | version "1.6.18" 835 | resolved "https://registry.yarnpkg.com/type-is/-/type-is-1.6.18.tgz#4e552cd05df09467dcbc4ef739de89f2cf37c131" 836 | integrity sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g== 837 | dependencies: 838 | media-typer "0.3.0" 839 | mime-types "~2.1.24" 840 | 841 | unpipe@1.0.0, unpipe@~1.0.0: 842 | version "1.0.0" 843 | resolved "https://registry.yarnpkg.com/unpipe/-/unpipe-1.0.0.tgz#b2bf4ee8514aae6165b4817829d21b2ef49904ec" 844 | integrity sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ== 845 | 846 | urlsafe-base64@~1.0.0: 847 | version "1.0.0" 848 | resolved "https://registry.yarnpkg.com/urlsafe-base64/-/urlsafe-base64-1.0.0.tgz#23f89069a6c62f46cf3a1d3b00169cefb90be0c6" 849 | integrity sha512-RtuPeMy7c1UrHwproMZN9gN6kiZ0SvJwRaEzwZY0j9MypEkFqyBaKv176jvlPtg58Zh36bOkS0NFABXMHvvGCA== 850 | 851 | utils-merge@1.0.1: 852 | version "1.0.1" 853 | resolved "https://registry.yarnpkg.com/utils-merge/-/utils-merge-1.0.1.tgz#9f95710f50a267947b2ccc124741c1028427e713" 854 | integrity sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA== 855 | 856 | vary@~1.1.2: 857 | version "1.1.2" 858 | resolved "https://registry.yarnpkg.com/vary/-/vary-1.1.2.tgz#2299f02c6ded30d4a5961b0b9f74524a18f634fc" 859 | integrity sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg== 860 | 861 | void-elements@^3.1.0: 862 | version "3.1.0" 863 | resolved "https://registry.yarnpkg.com/void-elements/-/void-elements-3.1.0.tgz#614f7fbf8d801f0bb5f0661f5b2f5785750e4f09" 864 | integrity sha512-Dhxzh5HZuiHQhbvTW9AMetFfBHDMYpo23Uo9btPXgdYP+3T5S+p+jgNy7spra+veYhBP2dCSgxR/i2Y02h5/6w== 865 | 866 | web-push@^3.6.6: 867 | version "3.6.6" 868 | resolved "https://registry.yarnpkg.com/web-push/-/web-push-3.6.6.tgz#592facb26116187136b0d543768ef85675791ac8" 869 | integrity sha512-SyteEck9fiCskNmPxs/GFhJsZrIyLfRvjWNmcUwULLJyCU0f1oxo2sWTokXA1mDAq9vxk4e4gVcb/8agq73NkQ== 870 | dependencies: 871 | asn1.js "^5.3.0" 872 | http_ece "1.1.0" 873 | https-proxy-agent "^7.0.0" 874 | jws "^4.0.0" 875 | minimist "^1.2.5" 876 | 877 | with@^7.0.0: 878 | version "7.0.2" 879 | resolved "https://registry.yarnpkg.com/with/-/with-7.0.2.tgz#ccee3ad542d25538a7a7a80aad212b9828495bac" 880 | integrity sha512-RNGKj82nUPg3g5ygxkQl0R937xLyho1J24ItRCBTr/m1YnZkzJy1hUiHUJrc/VlsDQzsCnInEGSg3bci0Lmd4w== 881 | dependencies: 882 | "@babel/parser" "^7.9.6" 883 | "@babel/types" "^7.9.6" 884 | assert-never "^1.2.1" 885 | babel-walk "3.0.0-canary-5" 886 | --------------------------------------------------------------------------------