├── .gitignore ├── README.md ├── nodemon.json ├── package.json ├── public ├── css │ └── main.css ├── img │ ├── anonymous_user_identification.png │ ├── api_webhooks.png │ ├── article-1.jpg │ ├── article-2.jpg │ ├── article-3.jpg │ ├── article-4.jpg │ ├── article-5.jpg │ ├── article-6.jpg │ ├── browser_fingerprinting.png │ ├── geolocation.png │ ├── github.svg │ ├── incognito_detection.png │ └── logo.png └── js │ └── main.js ├── sql └── create_article_reads.sql ├── src └── index.js ├── views ├── articles │ ├── article-1.pug │ ├── article-2.pug │ ├── article-3.pug │ ├── article-4.pug │ ├── article-5.pug │ └── article-6.pug ├── home.pug ├── layout.pug └── modal.pug └── yarn.lock /.gitignore: -------------------------------------------------------------------------------- 1 | dist 2 | node_modules 3 | .DS_Store 4 | 5 | # Elastic Beanstalk Files 6 | .elasticbeanstalk/* 7 | !.elasticbeanstalk/*.cfg.yml 8 | !.elasticbeanstalk/*.global.yml 9 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # paywall demo (Archived) 2 | 3 | This is the archived version of our metered paywall demo, which was built using Fingerprint PRO, Node, Express, and PG. It was designed for newspapers and content publishers as a demonstration of how to implement a metered paywall. 4 | 5 | **New Demo Link:** 6 | For the latest version of our paywall demo, please visit [Fingerprint Paywall Demo](https://demo.fingerprint.com/paywall). 7 | 8 | **Use Case Repository:** 9 | The use case for this demo, along with other examples, can now be found in our [Fingerprint Pro Use Cases repository](https://github.com/fingerprintjs/fingerprintjs-pro-use-cases). 10 | 11 | **Original Technology Stack:** 12 | - Fingerprint PRO (modern user identification) - [Fingerprint.com](https://fingerprint.com) 13 | - Node.js 14 | - Express.js 15 | - PG (PostgreSQL) 16 | -------------------------------------------------------------------------------- /nodemon.json: -------------------------------------------------------------------------------- 1 | { 2 | "watch": "src", 3 | "exec": "yarn start" 4 | } -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "paywall", 3 | "version": "1.0.0", 4 | "description": "A demo paywall app built with Fingerprint PRO, Express and Typescript", 5 | "main": "index.js", 6 | "repository": "https://github.com/fingerprintjs/paywall-demo", 7 | "author": "Valentin Vasilyev", 8 | "license": "MIT", 9 | "private": false, 10 | "devDependencies": { 11 | "nodemon": "^2.0.22" 12 | }, 13 | "dependencies": { 14 | "express": "^4.18.2", 15 | "pg": "^8.10.0", 16 | "pug": "^3.0.2" 17 | }, 18 | "scripts": { 19 | "start": "node src/index.js", 20 | "start:dev": "nodemon" 21 | } 22 | } 23 | -------------------------------------------------------------------------------- /public/css/main.css: -------------------------------------------------------------------------------- 1 | .hide { display: none } 2 | .miriam { 3 | font-family: 'Miriam Libre', sans-serif; 4 | } -------------------------------------------------------------------------------- /public/img/anonymous_user_identification.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/fingerprintjs/fingerprintjs-paywall-example/fb9b8c64b28493f598f40e96fad696339c9560f5/public/img/anonymous_user_identification.png -------------------------------------------------------------------------------- /public/img/api_webhooks.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/fingerprintjs/fingerprintjs-paywall-example/fb9b8c64b28493f598f40e96fad696339c9560f5/public/img/api_webhooks.png -------------------------------------------------------------------------------- /public/img/article-1.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/fingerprintjs/fingerprintjs-paywall-example/fb9b8c64b28493f598f40e96fad696339c9560f5/public/img/article-1.jpg -------------------------------------------------------------------------------- /public/img/article-2.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/fingerprintjs/fingerprintjs-paywall-example/fb9b8c64b28493f598f40e96fad696339c9560f5/public/img/article-2.jpg -------------------------------------------------------------------------------- /public/img/article-3.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/fingerprintjs/fingerprintjs-paywall-example/fb9b8c64b28493f598f40e96fad696339c9560f5/public/img/article-3.jpg -------------------------------------------------------------------------------- /public/img/article-4.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/fingerprintjs/fingerprintjs-paywall-example/fb9b8c64b28493f598f40e96fad696339c9560f5/public/img/article-4.jpg -------------------------------------------------------------------------------- /public/img/article-5.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/fingerprintjs/fingerprintjs-paywall-example/fb9b8c64b28493f598f40e96fad696339c9560f5/public/img/article-5.jpg -------------------------------------------------------------------------------- /public/img/article-6.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/fingerprintjs/fingerprintjs-paywall-example/fb9b8c64b28493f598f40e96fad696339c9560f5/public/img/article-6.jpg -------------------------------------------------------------------------------- /public/img/browser_fingerprinting.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/fingerprintjs/fingerprintjs-paywall-example/fb9b8c64b28493f598f40e96fad696339c9560f5/public/img/browser_fingerprinting.png -------------------------------------------------------------------------------- /public/img/geolocation.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/fingerprintjs/fingerprintjs-paywall-example/fb9b8c64b28493f598f40e96fad696339c9560f5/public/img/geolocation.png -------------------------------------------------------------------------------- /public/img/github.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /public/img/incognito_detection.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/fingerprintjs/fingerprintjs-paywall-example/fb9b8c64b28493f598f40e96fad696339c9560f5/public/img/incognito_detection.png -------------------------------------------------------------------------------- /public/img/logo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/fingerprintjs/fingerprintjs-paywall-example/fb9b8c64b28493f598f40e96fad696339c9560f5/public/img/logo.png -------------------------------------------------------------------------------- /public/js/main.js: -------------------------------------------------------------------------------- 1 | function fpAgentLoaded() { 2 | var match = location.href.match(/articles\/(\d+)$/) 3 | if(!match){ 4 | return 5 | } 6 | FingerprintJS.load() 7 | .then(function (fp) { 8 | return fp.get() 9 | }) 10 | .then(function (res) { 11 | var query = { 12 | visitorId: res.visitorId, 13 | articleId: match[1] 14 | }; 15 | $.getJSON("/paywall", query, function (res) { 16 | if(res.enabled){ 17 | $("#paywall-modal").modal({ keyboard: false, show: true, backdrop: "static" }); 18 | } 19 | }); 20 | }) 21 | } 22 | -------------------------------------------------------------------------------- /sql/create_article_reads.sql: -------------------------------------------------------------------------------- 1 | create table article_reads ( 2 | id serial primary key, 3 | visitor_id text not null, 4 | article_id int not null, 5 | created_at timestamp default now() 6 | ); 7 | create index idx_article_reads_on_visitor_id on article_reads(visitor_id); -------------------------------------------------------------------------------- /src/index.js: -------------------------------------------------------------------------------- 1 | const express = require("express"); 2 | const { Pool } = require("pg"); 3 | 4 | const connectionString = process.env["PAYWALL_DATABASE_URL"]; 5 | const pgPool = new Pool({ connectionString: connectionString }); 6 | 7 | const app = express(); 8 | app.set("views", "./views"); 9 | app.set("view engine", "pug"); 10 | app.use(express.static("public")) 11 | 12 | app.locals.fpjsCdnUrl = process.env["PAYWALL_FPJS_CDN_URL"] || 'https://fpcdn.io/'; 13 | app.locals.fpjsToken = process.env["PAYWALL_FPJS_TOKEN"] || ""; 14 | 15 | app.get("/", (req, res) => { 16 | res.render("home"); 17 | }); 18 | 19 | app.get("/articles/:id", (req, res) => { 20 | let id = req.params['id'] 21 | res.render(`articles/article-${id}`) 22 | }); 23 | 24 | app.get("/paywall", async (req, res) => { 25 | let visitorId = req.query['visitorId']; 26 | let articleId = parseInt(req.query['articleId']); 27 | let articleIds = await getAlreadyReadArticleIds(visitorId); 28 | let paywallEnabled = true; 29 | // paywall is enabled only in one scenario: 30 | // visitor already read 2 distinct articles in the last 7 days 31 | // and current article is not the one that was read in the last 7 days 32 | if (articleIds.length < 2 || articleIds.includes(articleId)) { 33 | paywallEnabled = false; 34 | // if no paywall, we need to register current event of reading in the DB 35 | insertArticleReadRow(visitorId, articleId); 36 | } 37 | res.json({ enabled: paywallEnabled }); 38 | }); 39 | 40 | const port = process.env.PORT || 8080; 41 | app.listen(port, () => { 42 | console.log(`Started the server on ${port}`); 43 | }); 44 | 45 | let getAlreadyReadArticleIds = async (visitorId) => { 46 | let sql = "select distinct(article_id) as article_id from article_reads where visitor_id = $1 and created_at > $2"; 47 | let currentTimestamp = new Date().getTime(); 48 | let weekAgoTimestamp = currentTimestamp - 7 * 24 * 3600 * 1000; 49 | let queryParams = [visitorId, new Date(weekAgoTimestamp)]; 50 | let res = await pgPool.query(sql, queryParams); 51 | let articleIds = res.rows.map(r => r.article_id); 52 | return articleIds; 53 | } 54 | 55 | let insertArticleReadRow = async (visitorId, articleId) => { 56 | let sql = "insert into article_reads(visitor_id, article_id) values ($1, $2)"; 57 | let insertParams = [visitorId, articleId]; 58 | await pgPool.query(sql, insertParams); 59 | } 60 | -------------------------------------------------------------------------------- /views/articles/article-1.pug: -------------------------------------------------------------------------------- 1 | extends ../layout 2 | block content 3 | .container.py-5 4 | h1.title1 US Open 2021 5 | p.lead 6 | | Johanna Konta loses to Elina Svitolina in quarter-finals 7 | p 8 | img.img-fluid(src="/img/article-1.jpg") 9 | p 10 | | British number one Johanna Konta missed out on the US Open semi-finals after she was worn down by Ukrainian fifth seed Elina Svitolina. 11 | 12 | p 13 | | Konta, 28, was unable to impose herself in a 6-4 6-4 defeat on Arthur Ashe Stadium. 14 | p 15 | | The 16th seed, aiming to complete the set of major semi-final appearances, was forced into errors by 24-year-old Svitolina's impressive retrieving. 16 | p 17 | | She saved two match points before rock-solid Svitolina served out the win. 18 | p 19 | | Svitolina, the highest seed left in the draw, will play American 23-time Grand Slam champion Serena Williams or China's Wang Qiang in the last four. 20 | p 21 | | Despite being outclassed by a superior opponent at the final Grand Slam of the season, Konta can reflect on a successful year at the majors after reaching the French Open semi-finals - on a clay surface on which she had previously struggled - and another run to the Wimbledon quarter-finals. 22 | | Former world number four Konta was on the verge of dropping out of the top 50 earlier this year before a change of fortunes under new coach Dimitri Zavialoff - who enjoyed success with Swiss pair Stan Wawrinka and Timea Bacsinszky - has lifted her back to the cusp of the world's top 10. 23 | p 24 | | The Frenchman has given Konta more "autonomy" to solve the problems put forward by her opponents, although her valiant attempts to play with variation could not unsettle Svitolina. 25 | | Konta was the first British woman to reach the US Open quarter-finals since Jo Durie in 1983, but could not match her feat by going one step further as Svitolina maintained her record of not dropping a set during the tournament. 26 | p 27 | . 28 | The Ukrainian, who reached the Wimbledon semi-finals and also won the WTA Tour Finals last year, is one of the most consistent ball-strikers in the women's game and her ability to keep putting the ball back into play proved Konta's downfall. 29 | It led to Konta trying to force the points with her aggressive returns, leading to 35 unforced errors - and 20 more forced by her opponent - outweighing 24 winners. 30 | By contrast, Svitolina only made 13 unforced errors in a high-quality performance. 31 | "I do feel that was the best I've felt her play against me," Konta said. 32 | "I didn't play badly at all, I was doing a lot of bright things. She just made me play that extra ball, it's frustrating." 33 | p 34 | b 35 | | By Terrence Block from Miami, FL. 36 | p 37 | | Tennis Chronicles, January 8th, 2021. 38 | .album.py-3.bg-light 39 | .container 40 | .row.text-center 41 | .col 42 | h3 Recommended articles 43 | .row 44 | .col-md-3 45 | .card.mb-4.shadow-sm 46 | .card-body 47 | h4 48 | a(href="/articles/2") 49 | | US Open 2021: Rafael Nadal beats Marin Cilic to make quarter-finals 50 | p.card-text 51 | | Spanish second seed Rafael Nadal responded to the challenge thrown down by 2014 champion Marin Cilic as he battled to reach the US Open quarter-finals with a four-set win. 52 | small 53 | | 6 hours ago 54 | .col-md-3 55 | .card.mb-4.shadow-sm 56 | .card-body 57 | h4 58 | a(href="/articles/3") 59 | | French Open 2021: Simona Halep loses to unseeded teenager Amanda Anisimova 60 | p.card-text 61 | | American teenager Amanda Anisimova reached the semi-finals of the French Open with a straight-set win over defending champion Simona Halep. 62 | small 63 | | 3 days ago 64 | .col-md-3 65 | .card.mb-4.shadow-sm 66 | .card-body 67 | h4 68 | a(href="/articles/4") 69 | | Edmund eases past Kyrgios in Rogers Cup 70 | p.card-text 71 | | British number one Kyle Edmund beats Australian Nick Kyrgios in straight sets to reach the second round of the Rogers Cup in Montreal. 72 | small 73 | | 1 week ago 74 | .col-md-3 75 | .card.mb-4.shadow-sm 76 | .card-body 77 | h4 78 | a(href="/articles/5") 79 | | Highlights: Djokovic beats Federer in historic fifth set 80 | p.card-text 81 | | Watch highlights as Novak Djokovic becomes the first player to win a Wimbledon singles title with a fifth-set tie-break against Roger Federer. 82 | small 83 | | 2 weeks ago -------------------------------------------------------------------------------- /views/articles/article-2.pug: -------------------------------------------------------------------------------- 1 | extends ../layout 2 | block content 3 | .container.py-5 4 | h1.title1 US Open 2021 5 | p.lead 6 | | US Open 2021: Rafael Nadal beats Marin Cilic to make quarter-finals 7 | p 8 | img.img-fluid(src="/img/article-2.jpg") 9 | p 10 | b 11 | | Spanish second seed Rafael Nadal responded to the challenge thrown down by 2014 champion Marin Cilic as he battled to reach the US Open quarter-finals with a four-set win. 12 | p 13 | | Nadal, 33, ultimately had too much quality for the Croatian 22nd seed in a 6-3 3-6 6-1 6-2 victory in New York. 14 | | Cilic, 30, briefly rediscovered his best form to level before wilting. 15 | p 16 | | Nadal, the 18-time Grand Slam champion, will play Argentine 20th seed Diego Schwartzman in the last eight. 17 | p 18 | | "For some moments in the second set I felt there were too many points in his hands, he was pushing me back, more aggression than me and he hit every ball very strong," said Nadal. 19 | p 20 | | "After that second set I thought something needs to change or I would be in his hands. I started to return the second serve inside the court and that created a different perspective." 21 | p 22 | | Nadal is aiming to close the gap to 20-time major winner Federer with his fourth title at Flushing Meadows. 23 | p 24 | | The illustrious pair remain on course to meet in Sunday's final which, remarkably, would be the first meeting in New York of their enduring rivalry. 25 | p 26 | | First Nadal must see off Schwartzman, who reached the last eight for the second time by beating German sixth seed Alexander Zverev. 27 | p 28 | | Federer, 38, plays his quarter-final against Bulgaria's Grigor Dimitrov at about 02:00 BST on Wednesday. 29 | 30 | p 31 | b 32 | | By Terrence Block from Miami, FL 33 | p 34 | | Tennis Chronicles, January 4th, 2021. 35 | .album.py-3.bg-light 36 | .container 37 | .row.text-center 38 | .col 39 | h3 Recommended articles 40 | .row 41 | .col-md-3 42 | .card.mb-4.shadow-sm 43 | .card-body 44 | h4 45 | a(href="/articles/1") 46 | | US Open 2021: Johanna Konta loses to Elina Svitolina in quarter-finals 47 | p.card-text 48 | | British number one Johanna Konta missed out on the US Open semi-finals after she was worn down by Ukrainian fifth seed Elina Svitolina. 49 | small 50 | | 1 hour ago 51 | .col-md-3 52 | .card.mb-4.shadow-sm 53 | .card-body 54 | h4 55 | a(href="/articles/3") 56 | | French Open 2021: Simona Halep loses to unseeded teenager Amanda Anisimova 57 | p.card-text 58 | | American teenager Amanda Anisimova reached the semi-finals of the French Open with a straight-set win over defending champion Simona Halep. 59 | small 60 | | 3 days ago 61 | .col-md-3 62 | .card.mb-4.shadow-sm 63 | .card-body 64 | h4 65 | a(href="/articles/4") 66 | | Edmund eases past Kyrgios in Rogers Cup 67 | p.card-text 68 | | British number one Kyle Edmund beats Australian Nick Kyrgios in straight sets to reach the second round of the Rogers Cup in Montreal. 69 | small 70 | | 1 week ago 71 | .col-md-3 72 | .card.mb-4.shadow-sm 73 | .card-body 74 | h4 75 | a(href="/articles/5") 76 | | Highlights: Djokovic beats Federer in historic fifth set 77 | p.card-text 78 | | Watch highlights as Novak Djokovic becomes the first player to win a Wimbledon singles title with a fifth-set tie-break against Roger Federer. 79 | small 80 | | 2 weeks ago -------------------------------------------------------------------------------- /views/articles/article-3.pug: -------------------------------------------------------------------------------- 1 | extends ../layout 2 | block content 3 | .container.py-5 4 | h1.title1 French Open 2021 5 | p.lead 6 | | Simona Halep loses to unseeded teenager Amanda Anisimova 7 | p 8 | img.img-fluid(src="/img/article-3.jpg") 9 | p 10 | b 11 | | American teenager Amanda Anisimova reached the semi-finals of the French Open with a straight-set win over defending champion Simona Halep. 12 | p 13 | | Romanian third seed Halep, 27, lost 6-2 6-4 to the unseeded 17-year-old. 14 | p 15 | | Anisimova had never won a match at Roland Garros before this year but is yet to drop a set on the way to her first Grand Slam semi-final. 16 | p 17 | | The world number 51 will face Australian eighth seed Ashleigh Barty, who beat American Madison Keys 6-3 7-5. 18 | p 19 | | Anisimova is the youngest player to reach a major semi-final since Nicole Vaidisova at the 2007 Australian Open. 20 | p 21 | | "This is honestly more than I could ever have asked for," she said. "If I didn't look nervous it's because I wasn't. 22 | p 23 | | "I don't think it will sink in, at least not for today. It's crazy. I really can't believe the result. Getting the opportunity to play against Simona, that's amazing, but how it ended is even crazier to me." 24 | p 25 | | As well as winning her solitary Grand Slam title in Paris, former world number one Halep, 27, was runner-up at this tournament in 2017 and 2014. 26 | p 27 | | But her defeat means there are no Grand Slam champions left in the women's draw and ensures that Saturday's winner will be the ninth different Grand Slam champion in the last 10 majors. 28 | p 29 | | "I feel sad because every time when I lose, I'm sad," said Halep. "And I'm a little bit upset because I couldn't make my game. I couldn't move normally." 30 | p 31 | | Anisimova hails from Russian parentage, although her mother and father emigrated to America before she was born, ironically because of the tennis potential of her older sister. 32 | p 33 | | She is one of two teenagers in the last four as Czech 19-year-old Marketa Vondrousova will face Britain's Johanna Konta in Friday's other semi-final. 34 | p 35 | | The defeat of Halep is not Anisimova's first upset at Roland Garros. She also beat 11th seed Aryna Sabalenka in straight sets in the second round. 36 | p 37 | | The American missed the entire 2018 clay season with a right foot injury but has made up for it this year, winning her first WTA title in Bogota two months ago. 38 | p 39 | | That made her the youngest American to win a tour title since Serena Williams did so aged 17 at Indian Wells in 1999. 40 | p 41 | | Anisimova's previous longest run at a Grand Slam came at her maiden Australian Open earlier this year, where she reached the fourth round. 42 | p 43 | | If she goes on to win the title, she will become the first teenager to win a Grand Slam since Maria Sharapova claimed the 2006 US Open aged 19 and the first at Roland Garros since Croatia's Iva Majoli in 1997. 44 | 45 | p 46 | b 47 | | By Julien August from Nantes, France. 48 | p 49 | | Tennis Chronicles, January 6th, 2021 50 | .album.py-3.bg-light 51 | .container 52 | .row.text-center 53 | .col 54 | h3 Recommended articles 55 | .row 56 | .col-md-3 57 | .card.mb-4.shadow-sm 58 | .card-body 59 | h4 60 | a(href="/articles/2") 61 | | US Open 2021: Rafael Nadal beats Marin Cilic to make quarter-finals 62 | p.card-text 63 | | Spanish second seed Rafael Nadal responded to the challenge thrown down by 2014 champion Marin Cilic as he battled to reach the US Open quarter-finals with a four-set win. 64 | small 65 | | 6 hours ago 66 | .col-md-3 67 | .card.mb-4.shadow-sm 68 | .card-body 69 | h4 70 | a(href="/articles/4") 71 | | Edmund eases past Kyrgios in Rogers Cup 72 | p.card-text 73 | | British number one Kyle Edmund beats Australian Nick Kyrgios in straight sets to reach the second round of the Rogers Cup in Montreal. 74 | small 75 | | 1 week ago 76 | .col-md-3 77 | .card.mb-4.shadow-sm 78 | .card-body 79 | h4 80 | a(href="/articles/5") 81 | | Highlights: Djokovic beats Federer in historic fifth set 82 | p.card-text 83 | | Watch highlights as Novak Djokovic becomes the first player to win a Wimbledon singles title with a fifth-set tie-break against Roger Federer. 84 | small 85 | | 2 weeks ago 86 | .col-md-3 87 | .card.mb-4.shadow-sm 88 | .card-body 89 | h4 90 | a(href="/articles/6") 91 | | Schwartzman beats Alexander Zverev to reach quarter-finals 92 | p.card-text 93 | | Argentine Diego Schwartzman came from a set down to beat German sixth seed Alexander Zverev and reach the US Open quarter-finals at Flushing Meadows. 94 | small 95 | | 1 week ago -------------------------------------------------------------------------------- /views/articles/article-4.pug: -------------------------------------------------------------------------------- 1 | extends ../layout 2 | block content 3 | .container.py-5 4 | h1.title1 Rogers Cup 5 | p.lead 6 | | Kyle Edmund beats Nick Kyrgios, Dan Evans to meet Rafael Nadal 7 | p 8 | img.img-fluid(src="/img/article-4.jpg") 9 | p 10 | b 11 | | British number one Kyle Edmund beat Australian Nick Kyrgios in straight sets to reach the second round of the Rogers Cup in Montreal. 12 | p 13 | | Edmund, 24, beat Kyrgios - who won the Washington title on Sunday - 6-3 6-4 and will play Russian eighth seed Daniil Medvedev in the next round. 14 | p 15 | | In the doubles, Andy Murray and Spain's Feliciano Lopez beat Lukasz Kubot and Marcelo Melo 6-7 (5-7) 6-3 11-9. 16 | p Elsewhere, Dan Evans will play Rafael Nadal in the second round. 17 | p 18 | | It will be the first meeting between Evans and Spain's 18-time Grand Slam champion at tour level after the Briton beat Australian Alex de Minaur 6-4 7-6 (8-6). 19 | p 20 | | Nadal, who is the top seed and defending champion at the ATP 1,000 event, received a first-round bye in his first tournament since losing to Roger Federer in the Wimbledon semi-finals in July. 21 | p 22 | | Edmund never faced a break point against Kyrgios in a rain-affected match, staying calm as the world number 27 argued with the chair umpire for much of the first set about the towels provided courtside. 23 | p 24 | | Kyrgios wanted a white towel as opposed to tournament-branded ones, and after being handed a code violation for an obscenity, was delivered a white towel 20 minutes later. 25 | p 26 | | He was broken midway through the first set, before world number 33 Edmund served out the opener to love. 27 | p 28 | | In the second set, Kyrgios twice saved break point before Edmund finally broke his serve to love to go 5-4 up, going on to seal the win on his second match point with his 15th ace. 29 | p 30 | | Elsewhere, British number two Cameron Norrie was beaten in straight sets by German third seed Alexander Zverev. 31 | p 32 | | Zverev, who won the title in Montreal two years ago, won 7-6 (7-4) 6-4 to set up a third-round clash with Georgia's 13th seed Nikoloz Basilashvili. 33 | p 34 | b 35 | | By Jake Clinck from Montreal, Quebec 36 | p 37 | | Tennis Chronicles, January 12th, 2021 38 | .album.py-3.bg-light 39 | .container 40 | .row.text-center 41 | .col 42 | h3 Recommended articles 43 | .row 44 | .col-md-3 45 | .card.mb-4.shadow-sm 46 | .card-body 47 | h4 48 | a(href="/articles/2") 49 | | US Open 2021: Rafael Nadal beats Marin Cilic to make quarter-finals 50 | p.card-text 51 | | Spanish second seed Rafael Nadal responded to the challenge thrown down by 2014 champion Marin Cilic as he battled to reach the US Open quarter-finals with a four-set win. 52 | small 53 | | 6 hours ago 54 | .col-md-3 55 | .card.mb-4.shadow-sm 56 | .card-body 57 | h4 58 | a(href="/articles/3") 59 | | French Open 2021: Simona Halep loses to unseeded teenager Amanda Anisimova 60 | p.card-text 61 | | American teenager Amanda Anisimova reached the semi-finals of the French Open with a straight-set win over defending champion Simona Halep. 62 | small 63 | | 3 days ago 64 | .col-md-3 65 | .card.mb-4.shadow-sm 66 | .card-body 67 | h4 68 | a(href="/articles/5") 69 | | Highlights: Djokovic beats Federer in historic fifth set 70 | p.card-text 71 | | Watch highlights as Novak Djokovic becomes the first player to win a Wimbledon singles title with a fifth-set tie-break against Roger Federer. 72 | small 73 | | 2 weeks ago 74 | .col-md-3 75 | .card.mb-4.shadow-sm 76 | .card-body 77 | h4 78 | a(href="/articles/6") 79 | | Schwartzman beats Alexander Zverev to reach quarter-finals 80 | p.card-text 81 | | Argentine Diego Schwartzman came from a set down to beat German sixth seed Alexander Zverev and reach the US Open quarter-finals at Flushing Meadows. 82 | small 83 | | 1 week ago -------------------------------------------------------------------------------- /views/articles/article-5.pug: -------------------------------------------------------------------------------- 1 | extends ../layout 2 | block content 3 | .container.py-5 4 | h1.title1 Wimbledon 2021 5 | p.lead 6 | | Highlights: Djokovic beats Federer in historic fifth set 7 | p 8 | img.img-fluid(src="/img/article-5.jpg") 9 | p 10 | b 11 | | Novak Djokovic celebrates championship point after claiming his second straight Wimbledon title. 12 | p 13 | | Novak Djokovic may not have been the better player from first ball to last in Sunday’s Wimbledon final. 14 | p 15 | | But he summoned nerves of steel when it mattered most, blasting the shots, avoiding the costly errors and saving the two match points required to defeat eight-time Wimbledon champion Roger Federer, who had artistry and the Centre Court crowd on his side in his pursuit of a 21st Grand Slam title. 16 | p 17 | | The 37-year-old Federer was the aggressor, hitting 94 winners to Djokovic’s 54, and he ultimately won more points (218 to 204). But it was Djokovic’s trophy to raise at the end of an exceptionally contested match that lasted 4 hours 57 minutes — the longest final in Wimbledon history. 18 | p 19 | | With his 7-6 (7-5), 1-6, 7-6 (7-4), 4-6, 13-12 (7-3) victory, Djokovic claimed his fifth Wimbledon championship and the 16th major title of his career to pull within two of Rafael Nadal’s total and four of Federer’s all-time mark, which for now is paused at 20. It was Wimbledon’s first singles championship settled under the tournament’s new tiebreak format, which was instituted this year and kicks in if the fifth set is knotted at 12 games each. The format was instituted to prevent soul-sapping marathons such as the three-day affair between John Isner and Nicolas Mahut in 2010, which dragged on until 70-68 in the fifth set, and last year’s semifinal between Isner and Kevin Anderson, which lasted to 26-24. 20 | p 21 | | Djokovic called it the most mentally demanding match he had ever been part of and credited the victory, which he acknowledged easily could have been Federer’s, to will power and the mental and emotional aspects of his game that he has worked so hard to strengthen. 22 | p 23 | | “Most of the match I was on the back foot, actually,” said Djokovic, 32. “I was defending; he was dictating the play. I just tried to fight and find a way when it mattered the most.” 24 | 25 | p 26 | b 27 | | By Jim Gray from London, UK 28 | p 29 | | January 14th, 2021 30 | .album.py-3.bg-light 31 | .container 32 | .row.text-center 33 | .col 34 | h3 Recommended articles 35 | .row 36 | .col-md-3 37 | .card.mb-4.shadow-sm 38 | .card-body 39 | h4 40 | a(href="/articles/2") 41 | | US Open 2021: Rafael Nadal beats Marin Cilic to make quarter-finals 42 | p.card-text 43 | | Spanish second seed Rafael Nadal responded to the challenge thrown down by 2014 champion Marin Cilic as he battled to reach the US Open quarter-finals with a four-set win. 44 | small 45 | | 6 hours ago 46 | .col-md-3 47 | .card.mb-4.shadow-sm 48 | .card-body 49 | h4 50 | a(href="/articles/3") 51 | | French Open 2021: Simona Halep loses to unseeded teenager Amanda Anisimova 52 | p.card-text 53 | | American teenager Amanda Anisimova reached the semi-finals of the French Open with a straight-set win over defending champion Simona Halep. 54 | small 55 | | 3 days ago 56 | .col-md-3 57 | .card.mb-4.shadow-sm 58 | .card-body 59 | h4 60 | a(href="/articles/4") 61 | | Edmund eases past Kyrgios in Rogers Cup 62 | p.card-text 63 | | British number one Kyle Edmund beats Australian Nick Kyrgios in straight sets to reach the second round of the Rogers Cup in Montreal. 64 | small 65 | | 1 week ago 66 | .col-md-3 67 | .card.mb-4.shadow-sm 68 | .card-body 69 | h4 70 | a(href="/articles/6") 71 | | Schwartzman beats Alexander Zverev to reach quarter-finals 72 | p.card-text 73 | | Argentine Diego Schwartzman came from a set down to beat German sixth seed Alexander Zverev and reach the US Open quarter-finals at Flushing Meadows. 74 | small 75 | | 1 week ago -------------------------------------------------------------------------------- /views/articles/article-6.pug: -------------------------------------------------------------------------------- 1 | extends ../layout 2 | block content 3 | .container.py-5 4 | h1.title1 Highlights 5 | p.lead 6 | | Diego Schwartzman beats Alexander Zverev to reach quarter-finals 7 | p 8 | img.img-fluid(src="/img/article-6.jpg") 9 | p 10 | b 11 | | Argentine Diego Schwartzman came from a set down to beat German sixth seed Alexander Zverev and reach the US Open quarter-finals at Flushing Meadows. 12 | p 13 | | Argentine Diego Schwartzman came from a set down to beat German sixth seed Alexander Zverev and reach the US Open quarter-finals at Flushing Meadows. 14 | p 15 | | Schwartzman, the 20th seed, won 3-6 6-2 6-4 6-3 and will next face Rafael Nadal who overcame Marin Cilic in four sets. 16 | p 17 | | A frustrated Zverev was docked a point for an obscenity in the final set after earlier hitting a ball into the crowd. 18 | p 19 | | French 13th seed Gael Monfils cruised past unseeded Spaniard Pablo Andujar 6-1 6-2 6-2 to make the last eight. 20 | p 21 | | Monfils, 33, broke serve six times and did not face a break point as he won in one hour and 26 minutes to set up a meeting with Matteo Berrettini. 22 | p 23 | | Italian Berrettini, seeded 24th, saw off Russian Andrey Rublev 6-1 6-4 7-6 (8-6) to reach a Grand Slam quarter-final for the first time. 24 | p 25 | | Berrettini, 23, had failed to progress beyond the first round in two previous attempts in New York. 26 | p 27 | | He served for the match at 6-5 in the third set and, though unseeded Rublev was able to break him for the first time, the Italian secured victory in the resulting tie-break. 28 | p 29 | | After three lengthy sets featuring 10 breaks of serve, Schwartzman, 27, stormed into a 4-0 lead in the fourth against an out-of-sorts Zverev, who served 17 double faults and made 65 unforced errors. 30 | p 31 | | Zverev clawed a break back but, following a previous code violation for hitting the ball into the crowd, he was then docked a point for an audible obscenity on game point, which gave Schwartzman a 5-2 lead. 32 | p 33 | | The 22-year-old remonstrated with umpire James Keothavong, saying he had not heard the earlier violation because of the noise of the rain falling on the Arthur Ashe Stadium roof. 34 | p 35 | | Zverev found some composure to win his next service game but Schwartzman was able to convert the second of two match points with a forehand winner. 36 | p 37 | | The defeat means Zverev, the winner of last year's ATP Finals and seen by many as the leader of the next generation in the men's game, has still only made two Grand Slam quarter-finals - at the French Open in 2018 and 2019. 38 | p 39 | | "Alex today had many problems with the serve, I am a big returner and I took many chances with that. I think I played great tennis," said Schwartzman. 40 | p 41 | | The Argentine, who has lost all seven previous meetings with Nadal, added: "Rafa is my friend. It's always great to play against him in a quarter-final of a Grand Slam." 42 | 43 | p 44 | b 45 | | Jake Clinck from Montreal, Quebec 46 | p 47 | | Tennis Chronicles, January 10th, 2021. 48 | .album.py-3.bg-light 49 | .container 50 | .row.text-center 51 | .col 52 | h3 Recommended articles 53 | .row 54 | .col-md-3 55 | .card.mb-4.shadow-sm 56 | .card-body 57 | h4 58 | a(href="/articles/2") 59 | | US Open 2021: Rafael Nadal beats Marin Cilic to make quarter-finals 60 | p.card-text 61 | | Spanish second seed Rafael Nadal responded to the challenge thrown down by 2014 champion Marin Cilic as he battled to reach the US Open quarter-finals with a four-set win. 62 | small 63 | | 6 hours ago 64 | .col-md-3 65 | .card.mb-4.shadow-sm 66 | .card-body 67 | h4 68 | a(href="/articles/3") 69 | | French Open 2021: Simona Halep loses to unseeded teenager Amanda Anisimova 70 | p.card-text 71 | | American teenager Amanda Anisimova reached the semi-finals of the French Open with a straight-set win over defending champion Simona Halep. 72 | small 73 | | 3 days ago 74 | .col-md-3 75 | .card.mb-4.shadow-sm 76 | .card-body 77 | h4 78 | a(href="/articles/4") 79 | | Edmund eases past Kyrgios in Rogers Cup 80 | p.card-text 81 | | British number one Kyle Edmund beats Australian Nick Kyrgios in straight sets to reach the second round of the Rogers Cup in Montreal. 82 | small 83 | | 1 week ago 84 | .col-md-3 85 | .card.mb-4.shadow-sm 86 | .card-body 87 | h4 88 | a(href="/articles/5") 89 | | Highlights: Djokovic beats Federer in historic fifth set 90 | p.card-text 91 | | Watch highlights as Novak Djokovic becomes the first player to win a Wimbledon singles title with a fifth-set tie-break against Roger Federer. 92 | small 93 | | 2 weeks ago -------------------------------------------------------------------------------- /views/home.pug: -------------------------------------------------------------------------------- 1 | extends layout 2 | block content 3 | .container.pb-1.pt-4 4 | h1.title1 Fingerprint Pro Paywall Demo 5 | p.lead 6 | | US Open 2021: Johanna Konta loses to Elina Svitolina in quarter-finals 7 | p 8 | img.img-fluid(src="/img/article-1.jpg") 9 | p 10 | a.btn.btn-primary.my-2(href='/articles/1') 11 | | See full article 12 | sup * 13 | div 14 | small 15 | i * You can read 2 free articles per week (powered by Fingerprint Pro Paywall). 16 | .album.py-5.bg-light 17 | .container 18 | .row 19 | .col-md-4 20 | .card.mb-4.shadow-sm 21 | .card-body 22 | h4 23 | a(href="/articles/1") 24 | | US Open 2021: Johanna Konta loses to Elina Svitolina in quarter-finals 25 | p.card-text 26 | | British number one Johanna Konta missed out on the US Open semi-finals after she was worn down by Ukrainian fifth seed Elina Svitolina. 27 | | Konta, 28, was unable to impose herself in a 6-4 6-4 defeat on Arthur Ashe Stadium. 28 | small 29 | | 1 hour ago 30 | .col-md-4 31 | .card.mb-4.shadow-sm 32 | .card-body 33 | h4 34 | a(href="/articles/2") 35 | | US Open 2021: Rafael Nadal beats Marin Cilic to make quarter-finals 36 | p.card-text 37 | | Spanish second seed Rafael Nadal responded to the challenge thrown down by 2014 champion Marin Cilic as he battled to reach the US Open quarter-finals with a four-set win. 38 | | Nadal, 33, ultimately had too much quality for the Croatian 22nd seed in a 6-3 3-6 6-1 6-2 victory in New York. 39 | small 40 | | 6 hours ago 41 | .col-md-4 42 | .card.mb-4.shadow-sm 43 | .card-body 44 | h4 45 | a(href="/articles/3") 46 | | French Open 2021: Simona Halep loses to unseeded teenager Amanda Anisimova 47 | p.card-text 48 | | American teenager Amanda Anisimova reached the semi-finals of the French Open with a straight-set win over defending champion Simona Halep. 49 | | Romanian third seed Halep, 27, lost 6-2 6-4 to the unseeded 17-year-old. 50 | small 51 | | 3 days ago 52 | .col-md-4 53 | .card.mb-4.shadow-sm 54 | .card-body 55 | h4 56 | a(href="/articles/4") 57 | | Edmund eases past Kyrgios in Rogers Cup 58 | p.card-text 59 | | British number one Kyle Edmund beats Australian Nick Kyrgios in straight sets to reach the second round of the Rogers Cup in Montreal. 60 | small 61 | | 1 week ago 62 | .col-md-4 63 | .card.mb-4.shadow-sm 64 | .card-body 65 | h4 66 | a(href="/articles/5") 67 | | Highlights: Djokovic beats Federer in historic fifth set 68 | p.card-text 69 | | Watch highlights as Novak Djokovic becomes the first player to win a Wimbledon singles title with a fifth-set tie-break against Roger Federer. 70 | small 71 | | 2 weeks ago 72 | .col-md-4 73 | .card.mb-4.shadow-sm 74 | .card-body 75 | h4 76 | a(href="/articles/6") 77 | | Diego Schwartzman beats Alexander Zverev to reach quarter-finals 78 | p.card-text 79 | | Argentine Diego Schwartzman came from a set down to beat German sixth seed Alexander Zverev and reach the US Open quarter-finals at Flushing Meadows. 80 | small 81 | | 1 week ago -------------------------------------------------------------------------------- /views/layout.pug: -------------------------------------------------------------------------------- 1 | doctype html 2 | head 3 | meta(charset='utf-8') 4 | meta(name='viewport' content='width=device-width, initial-scale=1, shrink-to-fit=no') 5 | meta(name='robots' content='noindex') 6 | title Tennis Chronicles 7 | link(href="https://fonts.googleapis.com/css?family=Miriam+Libre&display=swap" rel="stylesheet") 8 | link(href='https://stackpath.bootstrapcdn.com/bootstrap/4.3.1/css/bootstrap.min.css' rel='stylesheet') 9 | link(href='/css/main.css' rel='stylesheet') 10 | script(async src="https://www.googletagmanager.com/gtag/js?id=UA-144459549-2") 11 | script. 12 | window.dataLayer = window.dataLayer || []; 13 | function gtag(){dataLayer.push(arguments);} 14 | gtag('js', new Date()); 15 | gtag('config', 'UA-144459549-2'); 16 | body 17 | header 18 | .navbar.navbar-dark.bg-dark 19 | .container 20 | a.navbar-brand(href='/') 21 | img.img-fluid(src="/img/logo.png") 22 | main 23 | block content 24 | footer.text-center.py2 25 | .container 26 | .row 27 | .col 28 | | © Tennis Chronicles, 2023 29 | p 30 | b Disclaimer:  31 | | Not a real newspaper. Created to demonstrate the 32 | a(href="https://fingerprint.com" target="_blank") Fingerprint Pro Paywall technology 33 | | , provided by 34 | a(href="https://fingerprint.com" target="_blank") fingerprint.com 35 | .row.mb-2 36 | .col.text-center 37 | a(href="https://github.com/fingerprintjs/paywall-demo" target="_blank") 38 | img(src="/img/github.svg" height="30px") 39 | 40 | include modal 41 | script(src="https://code.jquery.com/jquery-3.3.1.min.js") 42 | script(src="https://stackpath.bootstrapcdn.com/bootstrap/4.3.1/js/bootstrap.min.js") 43 | script(src="/js/main.js") 44 | script( 45 | async 46 | src=`${fpjsCdnUrl}v3/${encodeURIComponent(fpjsToken)}/iife.min.js` 47 | onload="fpAgentLoaded()" 48 | ) 49 | -------------------------------------------------------------------------------- /views/modal.pug: -------------------------------------------------------------------------------- 1 | #paywall-modal.modal.fade 2 | .modal-dialog.modal-dialog-centered.modal-lg 3 | .modal-content 4 | .modal-body.miriam 5 | #paywall-1.text-center 6 | .container 7 | .alert.alert-success.my-4 8 | h3 9 | | You have reached your limit of 2 articles this week. 10 | br 11 | | The paywall is working! 12 | small 13 | | Try to get around this paywall by opening this article in incognito mode (copy and paste the URL). 14 | .row 15 | .col.mt-2 16 | h5(style="line-height: 1.6") 17 | | Set up your own next gen paywall solution with 18 | a(href="https://fingerprint.com" target="_blank") 19 | | Fingerprint Pro 20 | |, the most accurate user identification API available. 21 | .row.my-4 22 | .col-sm(style="text-align:left") 23 | h6.pl-5.pb-2 24 | img(src="/img/browser_fingerprinting.png") 25 | | Browser Fingerprinting 26 | h6.pl-5 27 | img(src="/img/anonymous_user_identification.png") 28 | | Anonymous User Identification 29 | .col-sm(style="text-align:left") 30 | h6.pl-5.pb-2 31 | img(src="/img/incognito_detection.png") 32 | | Incognito Mode Detection 33 | h6.pl-5 34 | img(src="/img/api_webhooks.png") 35 | | API & Webhooks 36 | .row 37 | .col.mt-2 38 | a#start-trial-btn.btn.btn-danger.btn-lg.my-1(style="background-color:#f04405" href="https://dashboard.fingerprintjs.com/signup/?utm_source=paywall" target="_blank") 39 | strong 40 | | Get Started -------------------------------------------------------------------------------- /yarn.lock: -------------------------------------------------------------------------------- 1 | # THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY. 2 | # yarn lockfile v1 3 | 4 | 5 | "@babel/helper-validator-identifier@^7.12.11": 6 | version "7.12.11" 7 | resolved "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.12.11.tgz#c9a1f021917dcb5ccf0d4e453e399022981fc9ed" 8 | 9 | "@babel/parser@^7.6.0", "@babel/parser@^7.9.6": 10 | version "7.13.9" 11 | resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.13.9.tgz#ca34cb95e1c2dd126863a84465ae8ef66114be99" 12 | 13 | "@babel/types@^7.6.1", "@babel/types@^7.9.6": 14 | version "7.13.0" 15 | resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.13.0.tgz#74424d2816f0171b4100f0ab34e9a374efdf7f80" 16 | dependencies: 17 | "@babel/helper-validator-identifier" "^7.12.11" 18 | lodash "^4.17.19" 19 | to-fast-properties "^2.0.0" 20 | 21 | abbrev@1: 22 | version "1.1.1" 23 | resolved "https://registry.yarnpkg.com/abbrev/-/abbrev-1.1.1.tgz#f8f2c887ad10bf67f634f005b6987fed3179aac8" 24 | 25 | accepts@~1.3.8: 26 | version "1.3.8" 27 | resolved "https://registry.yarnpkg.com/accepts/-/accepts-1.3.8.tgz#0bf0be125b67014adcb0b0921e62db7bffe16b2e" 28 | integrity sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw== 29 | dependencies: 30 | mime-types "~2.1.34" 31 | negotiator "0.6.3" 32 | 33 | acorn@^7.1.1: 34 | version "7.4.1" 35 | resolved "https://registry.yarnpkg.com/acorn/-/acorn-7.4.1.tgz#feaed255973d2e77555b83dbc08851a6c63520fa" 36 | 37 | anymatch@~3.1.2: 38 | version "3.1.3" 39 | resolved "https://registry.yarnpkg.com/anymatch/-/anymatch-3.1.3.tgz#790c58b19ba1720a84205b57c618d5ad8524973e" 40 | integrity sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw== 41 | dependencies: 42 | normalize-path "^3.0.0" 43 | picomatch "^2.0.4" 44 | 45 | array-flatten@1.1.1: 46 | version "1.1.1" 47 | resolved "https://registry.yarnpkg.com/array-flatten/-/array-flatten-1.1.1.tgz#9a5f699051b1e7073328f2a008968b64ea2955d2" 48 | 49 | asap@~2.0.3: 50 | version "2.0.6" 51 | resolved "https://registry.yarnpkg.com/asap/-/asap-2.0.6.tgz#e50347611d7e690943208bbdafebcbc2fb866d46" 52 | 53 | assert-never@^1.2.1: 54 | version "1.2.1" 55 | resolved "https://registry.yarnpkg.com/assert-never/-/assert-never-1.2.1.tgz#11f0e363bf146205fb08193b5c7b90f4d1cf44fe" 56 | 57 | babel-walk@3.0.0-canary-5: 58 | version "3.0.0-canary-5" 59 | resolved "https://registry.yarnpkg.com/babel-walk/-/babel-walk-3.0.0-canary-5.tgz#f66ecd7298357aee44955f235a6ef54219104b11" 60 | dependencies: 61 | "@babel/types" "^7.9.6" 62 | 63 | balanced-match@^1.0.0: 64 | version "1.0.0" 65 | resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.0.tgz#89b4d199ab2bee49de164ea02b89ce462d71b767" 66 | 67 | binary-extensions@^2.0.0: 68 | version "2.2.0" 69 | resolved "https://registry.yarnpkg.com/binary-extensions/-/binary-extensions-2.2.0.tgz#75f502eeaf9ffde42fc98829645be4ea76bd9e2d" 70 | integrity sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA== 71 | 72 | body-parser@1.20.1: 73 | version "1.20.1" 74 | resolved "https://registry.yarnpkg.com/body-parser/-/body-parser-1.20.1.tgz#b1812a8912c195cd371a3ee5e66faa2338a5c668" 75 | integrity sha512-jWi7abTbYwajOytWCQc37VulmWiRae5RyTpaCyDcS5/lMdtwSz5lOpDE67srw/HYe35f1z3fDQw+3txg7gNtWw== 76 | dependencies: 77 | bytes "3.1.2" 78 | content-type "~1.0.4" 79 | debug "2.6.9" 80 | depd "2.0.0" 81 | destroy "1.2.0" 82 | http-errors "2.0.0" 83 | iconv-lite "0.4.24" 84 | on-finished "2.4.1" 85 | qs "6.11.0" 86 | raw-body "2.5.1" 87 | type-is "~1.6.18" 88 | unpipe "1.0.0" 89 | 90 | brace-expansion@^1.1.7: 91 | version "1.1.11" 92 | resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-1.1.11.tgz#3c7fcbf529d87226f3d2f52b966ff5271eb441dd" 93 | dependencies: 94 | balanced-match "^1.0.0" 95 | concat-map "0.0.1" 96 | 97 | braces@~3.0.2: 98 | version "3.0.2" 99 | resolved "https://registry.yarnpkg.com/braces/-/braces-3.0.2.tgz#3454e1a462ee8d599e236df336cd9ea4f8afe107" 100 | integrity sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A== 101 | dependencies: 102 | fill-range "^7.0.1" 103 | 104 | buffer-writer@2.0.0: 105 | version "2.0.0" 106 | resolved "https://registry.yarnpkg.com/buffer-writer/-/buffer-writer-2.0.0.tgz#ce7eb81a38f7829db09c873f2fbb792c0c98ec04" 107 | 108 | bytes@3.1.2: 109 | version "3.1.2" 110 | resolved "https://registry.yarnpkg.com/bytes/-/bytes-3.1.2.tgz#8b0beeb98605adf1b128fa4386403c009e0221a5" 111 | integrity sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg== 112 | 113 | call-bind@^1.0.0: 114 | version "1.0.2" 115 | resolved "https://registry.yarnpkg.com/call-bind/-/call-bind-1.0.2.tgz#b1d4e89e688119c3c9a903ad30abb2f6a919be3c" 116 | integrity sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA== 117 | dependencies: 118 | function-bind "^1.1.1" 119 | get-intrinsic "^1.0.2" 120 | 121 | character-parser@^2.2.0: 122 | version "2.2.0" 123 | resolved "https://registry.yarnpkg.com/character-parser/-/character-parser-2.2.0.tgz#c7ce28f36d4bcd9744e5ffc2c5fcde1c73261fc0" 124 | dependencies: 125 | is-regex "^1.0.3" 126 | 127 | chokidar@^3.5.2: 128 | version "3.5.3" 129 | resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-3.5.3.tgz#1cf37c8707b932bd1af1ae22c0432e2acd1903bd" 130 | integrity sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw== 131 | dependencies: 132 | anymatch "~3.1.2" 133 | braces "~3.0.2" 134 | glob-parent "~5.1.2" 135 | is-binary-path "~2.1.0" 136 | is-glob "~4.0.1" 137 | normalize-path "~3.0.0" 138 | readdirp "~3.6.0" 139 | optionalDependencies: 140 | fsevents "~2.3.2" 141 | 142 | concat-map@0.0.1: 143 | version "0.0.1" 144 | resolved "https://registry.yarnpkg.com/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b" 145 | 146 | constantinople@^4.0.1: 147 | version "4.0.1" 148 | resolved "https://registry.yarnpkg.com/constantinople/-/constantinople-4.0.1.tgz#0def113fa0e4dc8de83331a5cf79c8b325213151" 149 | dependencies: 150 | "@babel/parser" "^7.6.0" 151 | "@babel/types" "^7.6.1" 152 | 153 | content-disposition@0.5.4: 154 | version "0.5.4" 155 | resolved "https://registry.yarnpkg.com/content-disposition/-/content-disposition-0.5.4.tgz#8b82b4efac82512a02bb0b1dcec9d2c5e8eb5bfe" 156 | integrity sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ== 157 | dependencies: 158 | safe-buffer "5.2.1" 159 | 160 | content-type@~1.0.4: 161 | version "1.0.4" 162 | resolved "https://registry.yarnpkg.com/content-type/-/content-type-1.0.4.tgz#e138cc75e040c727b1966fe5e5f8c9aee256fe3b" 163 | 164 | cookie-signature@1.0.6: 165 | version "1.0.6" 166 | resolved "https://registry.yarnpkg.com/cookie-signature/-/cookie-signature-1.0.6.tgz#e303a882b342cc3ee8ca513a79999734dab3ae2c" 167 | 168 | cookie@0.5.0: 169 | version "0.5.0" 170 | resolved "https://registry.yarnpkg.com/cookie/-/cookie-0.5.0.tgz#d1f5d71adec6558c58f389987c366aa47e994f8b" 171 | integrity sha512-YZ3GUyn/o8gfKJlnlX7g7xq4gyO6OSuhGPKaaGssGB2qgDUS0gPgtTvoyZLTt9Ab6dC4hfc9dV5arkvc/OCmrw== 172 | 173 | debug@2.6.9: 174 | version "2.6.9" 175 | resolved "https://registry.yarnpkg.com/debug/-/debug-2.6.9.tgz#5d128515df134ff327e90a4c93f4e077a536341f" 176 | dependencies: 177 | ms "2.0.0" 178 | 179 | debug@^3.2.7: 180 | version "3.2.7" 181 | resolved "https://registry.yarnpkg.com/debug/-/debug-3.2.7.tgz#72580b7e9145fb39b6676f9c5e5fb100b934179a" 182 | integrity sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ== 183 | dependencies: 184 | ms "^2.1.1" 185 | 186 | depd@2.0.0: 187 | version "2.0.0" 188 | resolved "https://registry.yarnpkg.com/depd/-/depd-2.0.0.tgz#b696163cc757560d09cf22cc8fad1571b79e76df" 189 | integrity sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw== 190 | 191 | destroy@1.2.0: 192 | version "1.2.0" 193 | resolved "https://registry.yarnpkg.com/destroy/-/destroy-1.2.0.tgz#4803735509ad8be552934c67df614f94e66fa015" 194 | integrity sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg== 195 | 196 | doctypes@^1.1.0: 197 | version "1.1.0" 198 | resolved "https://registry.yarnpkg.com/doctypes/-/doctypes-1.1.0.tgz#ea80b106a87538774e8a3a4a5afe293de489e0a9" 199 | 200 | ee-first@1.1.1: 201 | version "1.1.1" 202 | resolved "https://registry.yarnpkg.com/ee-first/-/ee-first-1.1.1.tgz#590c61156b0ae2f4f0255732a158b266bc56b21d" 203 | 204 | encodeurl@~1.0.2: 205 | version "1.0.2" 206 | resolved "https://registry.yarnpkg.com/encodeurl/-/encodeurl-1.0.2.tgz#ad3ff4c86ec2d029322f5a02c3a9a606c95b3f59" 207 | 208 | escape-html@~1.0.3: 209 | version "1.0.3" 210 | resolved "https://registry.yarnpkg.com/escape-html/-/escape-html-1.0.3.tgz#0258eae4d3d0c0974de1c169188ef0051d1d1988" 211 | 212 | etag@~1.8.1: 213 | version "1.8.1" 214 | resolved "https://registry.yarnpkg.com/etag/-/etag-1.8.1.tgz#41ae2eeb65efa62268aebfea83ac7d79299b0887" 215 | 216 | express@^4.18.2: 217 | version "4.18.2" 218 | resolved "https://registry.yarnpkg.com/express/-/express-4.18.2.tgz#3fabe08296e930c796c19e3c516979386ba9fd59" 219 | integrity sha512-5/PsL6iGPdfQ/lKM1UuielYgv3BUoJfz1aUwU9vHZ+J7gyvwdQXFEBIEIaxeGf0GIcreATNyBExtalisDbuMqQ== 220 | dependencies: 221 | accepts "~1.3.8" 222 | array-flatten "1.1.1" 223 | body-parser "1.20.1" 224 | content-disposition "0.5.4" 225 | content-type "~1.0.4" 226 | cookie "0.5.0" 227 | cookie-signature "1.0.6" 228 | debug "2.6.9" 229 | depd "2.0.0" 230 | encodeurl "~1.0.2" 231 | escape-html "~1.0.3" 232 | etag "~1.8.1" 233 | finalhandler "1.2.0" 234 | fresh "0.5.2" 235 | http-errors "2.0.0" 236 | merge-descriptors "1.0.1" 237 | methods "~1.1.2" 238 | on-finished "2.4.1" 239 | parseurl "~1.3.3" 240 | path-to-regexp "0.1.7" 241 | proxy-addr "~2.0.7" 242 | qs "6.11.0" 243 | range-parser "~1.2.1" 244 | safe-buffer "5.2.1" 245 | send "0.18.0" 246 | serve-static "1.15.0" 247 | setprototypeof "1.2.0" 248 | statuses "2.0.1" 249 | type-is "~1.6.18" 250 | utils-merge "1.0.1" 251 | vary "~1.1.2" 252 | 253 | fill-range@^7.0.1: 254 | version "7.0.1" 255 | resolved "https://registry.yarnpkg.com/fill-range/-/fill-range-7.0.1.tgz#1919a6a7c75fe38b2c7c77e5198535da9acdda40" 256 | integrity sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ== 257 | dependencies: 258 | to-regex-range "^5.0.1" 259 | 260 | finalhandler@1.2.0: 261 | version "1.2.0" 262 | resolved "https://registry.yarnpkg.com/finalhandler/-/finalhandler-1.2.0.tgz#7d23fe5731b207b4640e4fcd00aec1f9207a7b32" 263 | integrity sha512-5uXcUVftlQMFnWC9qu/svkWv3GTd2PfUhK/3PLkYNAe7FbqJMt3515HaxE6eRL74GdsriiwujiawdaB1BpEISg== 264 | dependencies: 265 | debug "2.6.9" 266 | encodeurl "~1.0.2" 267 | escape-html "~1.0.3" 268 | on-finished "2.4.1" 269 | parseurl "~1.3.3" 270 | statuses "2.0.1" 271 | unpipe "~1.0.0" 272 | 273 | forwarded@0.2.0: 274 | version "0.2.0" 275 | resolved "https://registry.yarnpkg.com/forwarded/-/forwarded-0.2.0.tgz#2269936428aad4c15c7ebe9779a84bf0b2a81811" 276 | integrity sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow== 277 | 278 | fresh@0.5.2: 279 | version "0.5.2" 280 | resolved "https://registry.yarnpkg.com/fresh/-/fresh-0.5.2.tgz#3d8cadd90d976569fa835ab1f8e4b23a105605a7" 281 | 282 | fsevents@~2.3.2: 283 | version "2.3.2" 284 | resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-2.3.2.tgz#8a526f78b8fdf4623b709e0b975c52c24c02fd1a" 285 | integrity sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA== 286 | 287 | function-bind@^1.1.1: 288 | version "1.1.1" 289 | resolved "https://registry.yarnpkg.com/function-bind/-/function-bind-1.1.1.tgz#a56899d3ea3c9bab874bb9773b7c5ede92f4895d" 290 | 291 | get-intrinsic@^1.0.2: 292 | version "1.2.0" 293 | resolved "https://registry.yarnpkg.com/get-intrinsic/-/get-intrinsic-1.2.0.tgz#7ad1dc0535f3a2904bba075772763e5051f6d05f" 294 | integrity sha512-L049y6nFOuom5wGyRc3/gdTLO94dySVKRACj1RmJZBQXlbTMhtNIgkWkUHq+jYmZvKf14EW1EoJnnjbmoHij0Q== 295 | dependencies: 296 | function-bind "^1.1.1" 297 | has "^1.0.3" 298 | has-symbols "^1.0.3" 299 | 300 | glob-parent@~5.1.2: 301 | version "5.1.2" 302 | resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-5.1.2.tgz#869832c58034fe68a4093c17dc15e8340d8401c4" 303 | integrity sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow== 304 | dependencies: 305 | is-glob "^4.0.1" 306 | 307 | has-flag@^3.0.0: 308 | version "3.0.0" 309 | resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-3.0.0.tgz#b5d454dc2199ae225699f3467e5a07f3b955bafd" 310 | 311 | has-symbols@^1.0.3: 312 | version "1.0.3" 313 | resolved "https://registry.yarnpkg.com/has-symbols/-/has-symbols-1.0.3.tgz#bb7b2c4349251dce87b125f7bdf874aa7c8b39f8" 314 | integrity sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A== 315 | 316 | has@^1.0.1, has@^1.0.3: 317 | version "1.0.3" 318 | resolved "https://registry.yarnpkg.com/has/-/has-1.0.3.tgz#722d7cbfc1f6aa8241f16dd814e011e1f41e8796" 319 | dependencies: 320 | function-bind "^1.1.1" 321 | 322 | http-errors@2.0.0: 323 | version "2.0.0" 324 | resolved "https://registry.yarnpkg.com/http-errors/-/http-errors-2.0.0.tgz#b7774a1486ef73cf7667ac9ae0858c012c57b9d3" 325 | integrity sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ== 326 | dependencies: 327 | depd "2.0.0" 328 | inherits "2.0.4" 329 | setprototypeof "1.2.0" 330 | statuses "2.0.1" 331 | toidentifier "1.0.1" 332 | 333 | iconv-lite@0.4.24: 334 | version "0.4.24" 335 | resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.4.24.tgz#2022b4b25fbddc21d2f524974a474aafe733908b" 336 | dependencies: 337 | safer-buffer ">= 2.1.2 < 3" 338 | 339 | ignore-by-default@^1.0.1: 340 | version "1.0.1" 341 | resolved "https://registry.yarnpkg.com/ignore-by-default/-/ignore-by-default-1.0.1.tgz#48ca6d72f6c6a3af00a9ad4ae6876be3889e2b09" 342 | 343 | inherits@2.0.4: 344 | version "2.0.4" 345 | resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.4.tgz#0fa2c64f932917c3433a0ded55363aae37416b7c" 346 | 347 | ipaddr.js@1.9.1: 348 | version "1.9.1" 349 | resolved "https://registry.yarnpkg.com/ipaddr.js/-/ipaddr.js-1.9.1.tgz#bff38543eeb8984825079ff3a2a8e6cbd46781b3" 350 | integrity sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g== 351 | 352 | is-binary-path@~2.1.0: 353 | version "2.1.0" 354 | resolved "https://registry.yarnpkg.com/is-binary-path/-/is-binary-path-2.1.0.tgz#ea1f7f3b80f064236e83470f86c09c254fb45b09" 355 | integrity sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw== 356 | dependencies: 357 | binary-extensions "^2.0.0" 358 | 359 | is-core-module@^2.2.0: 360 | version "2.2.0" 361 | resolved "https://registry.yarnpkg.com/is-core-module/-/is-core-module-2.2.0.tgz#97037ef3d52224d85163f5597b2b63d9afed981a" 362 | dependencies: 363 | has "^1.0.3" 364 | 365 | is-expression@^4.0.0: 366 | version "4.0.0" 367 | resolved "https://registry.yarnpkg.com/is-expression/-/is-expression-4.0.0.tgz#c33155962abf21d0afd2552514d67d2ec16fd2ab" 368 | dependencies: 369 | acorn "^7.1.1" 370 | object-assign "^4.1.1" 371 | 372 | is-extglob@^2.1.1: 373 | version "2.1.1" 374 | resolved "https://registry.yarnpkg.com/is-extglob/-/is-extglob-2.1.1.tgz#a88c02535791f02ed37c76a1b9ea9773c833f8c2" 375 | 376 | is-glob@^4.0.1, is-glob@~4.0.1: 377 | version "4.0.3" 378 | resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-4.0.3.tgz#64f61e42cbbb2eec2071a9dac0b28ba1e65d5084" 379 | integrity sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg== 380 | dependencies: 381 | is-extglob "^2.1.1" 382 | 383 | is-number@^7.0.0: 384 | version "7.0.0" 385 | resolved "https://registry.yarnpkg.com/is-number/-/is-number-7.0.0.tgz#7535345b896734d5f80c4d06c50955527a14f12b" 386 | integrity sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng== 387 | 388 | is-promise@^2.0.0: 389 | version "2.1.0" 390 | resolved "https://registry.yarnpkg.com/is-promise/-/is-promise-2.1.0.tgz#79a2a9ece7f096e80f36d2b2f3bc16c1ff4bf3fa" 391 | 392 | is-regex@^1.0.3: 393 | version "1.0.4" 394 | resolved "https://registry.yarnpkg.com/is-regex/-/is-regex-1.0.4.tgz#5517489b547091b0930e095654ced25ee97e9491" 395 | dependencies: 396 | has "^1.0.1" 397 | 398 | js-stringify@^1.0.2: 399 | version "1.0.2" 400 | resolved "https://registry.yarnpkg.com/js-stringify/-/js-stringify-1.0.2.tgz#1736fddfd9724f28a3682adc6230ae7e4e9679db" 401 | 402 | jstransformer@1.0.0: 403 | version "1.0.0" 404 | resolved "https://registry.yarnpkg.com/jstransformer/-/jstransformer-1.0.0.tgz#ed8bf0921e2f3f1ed4d5c1a44f68709ed24722c3" 405 | dependencies: 406 | is-promise "^2.0.0" 407 | promise "^7.0.1" 408 | 409 | lodash@^4.17.19: 410 | version "4.17.21" 411 | resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.21.tgz#679591c564c3bffaae8454cf0b3df370c3d6911c" 412 | 413 | media-typer@0.3.0: 414 | version "0.3.0" 415 | resolved "https://registry.yarnpkg.com/media-typer/-/media-typer-0.3.0.tgz#8710d7af0aa626f8fffa1ce00168545263255748" 416 | 417 | merge-descriptors@1.0.1: 418 | version "1.0.1" 419 | resolved "https://registry.yarnpkg.com/merge-descriptors/-/merge-descriptors-1.0.1.tgz#b00aaa556dd8b44568150ec9d1b953f3f90cbb61" 420 | 421 | methods@~1.1.2: 422 | version "1.1.2" 423 | resolved "https://registry.yarnpkg.com/methods/-/methods-1.1.2.tgz#5529a4d67654134edcc5266656835b0f851afcee" 424 | 425 | mime-db@1.40.0: 426 | version "1.40.0" 427 | resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.40.0.tgz#a65057e998db090f732a68f6c276d387d4126c32" 428 | 429 | mime-db@1.52.0: 430 | version "1.52.0" 431 | resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.52.0.tgz#bbabcdc02859f4987301c856e3387ce5ec43bf70" 432 | integrity sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg== 433 | 434 | mime-types@~2.1.24: 435 | version "2.1.24" 436 | resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.24.tgz#b6f8d0b3e951efb77dedeca194cff6d16f676f81" 437 | dependencies: 438 | mime-db "1.40.0" 439 | 440 | mime-types@~2.1.34: 441 | version "2.1.35" 442 | resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.35.tgz#381a871b62a734450660ae3deee44813f70d959a" 443 | integrity sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw== 444 | dependencies: 445 | mime-db "1.52.0" 446 | 447 | mime@1.6.0: 448 | version "1.6.0" 449 | resolved "https://registry.yarnpkg.com/mime/-/mime-1.6.0.tgz#32cd9e5c64553bd58d19a568af452acff04981b1" 450 | 451 | minimatch@^3.1.2: 452 | version "3.1.2" 453 | resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.1.2.tgz#19cd194bfd3e428f049a70817c038d89ab4be35b" 454 | integrity sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw== 455 | dependencies: 456 | brace-expansion "^1.1.7" 457 | 458 | ms@2.0.0: 459 | version "2.0.0" 460 | resolved "https://registry.yarnpkg.com/ms/-/ms-2.0.0.tgz#5608aeadfc00be6c2901df5f9861788de0d597c8" 461 | 462 | ms@2.1.3: 463 | version "2.1.3" 464 | resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.3.tgz#574c8138ce1d2b5861f0b44579dbadd60c6615b2" 465 | integrity sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA== 466 | 467 | ms@^2.1.1: 468 | version "2.1.2" 469 | resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.2.tgz#d09d1f357b443f493382a8eb3ccd183872ae6009" 470 | 471 | negotiator@0.6.3: 472 | version "0.6.3" 473 | resolved "https://registry.yarnpkg.com/negotiator/-/negotiator-0.6.3.tgz#58e323a72fedc0d6f9cd4d31fe49f51479590ccd" 474 | integrity sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg== 475 | 476 | nodemon@^2.0.22: 477 | version "2.0.22" 478 | resolved "https://registry.yarnpkg.com/nodemon/-/nodemon-2.0.22.tgz#182c45c3a78da486f673d6c1702e00728daf5258" 479 | integrity sha512-B8YqaKMmyuCO7BowF1Z1/mkPqLk6cs/l63Ojtd6otKjMx47Dq1utxfRxcavH1I7VSaL8n5BUaoutadnsX3AAVQ== 480 | dependencies: 481 | chokidar "^3.5.2" 482 | debug "^3.2.7" 483 | ignore-by-default "^1.0.1" 484 | minimatch "^3.1.2" 485 | pstree.remy "^1.1.8" 486 | semver "^5.7.1" 487 | simple-update-notifier "^1.0.7" 488 | supports-color "^5.5.0" 489 | touch "^3.1.0" 490 | undefsafe "^2.0.5" 491 | 492 | nopt@~1.0.10: 493 | version "1.0.10" 494 | resolved "https://registry.yarnpkg.com/nopt/-/nopt-1.0.10.tgz#6ddd21bd2a31417b92727dd585f8a6f37608ebee" 495 | dependencies: 496 | abbrev "1" 497 | 498 | normalize-path@^3.0.0, normalize-path@~3.0.0: 499 | version "3.0.0" 500 | resolved "https://registry.yarnpkg.com/normalize-path/-/normalize-path-3.0.0.tgz#0dcd69ff23a1c9b11fd0978316644a0388216a65" 501 | 502 | object-assign@^4.1.1: 503 | version "4.1.1" 504 | resolved "https://registry.yarnpkg.com/object-assign/-/object-assign-4.1.1.tgz#2109adc7965887cfc05cbbd442cac8bfbb360863" 505 | 506 | object-inspect@^1.9.0: 507 | version "1.12.3" 508 | resolved "https://registry.yarnpkg.com/object-inspect/-/object-inspect-1.12.3.tgz#ba62dffd67ee256c8c086dfae69e016cd1f198b9" 509 | integrity sha512-geUvdk7c+eizMNUDkRpW1wJwgfOiOeHbxBR/hLXK1aT6zmVSO0jsQcs7fj6MGw89jC/cjGfLcNOrtMYtGqm81g== 510 | 511 | on-finished@2.4.1: 512 | version "2.4.1" 513 | resolved "https://registry.yarnpkg.com/on-finished/-/on-finished-2.4.1.tgz#58c8c44116e54845ad57f14ab10b03533184ac3f" 514 | integrity sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg== 515 | dependencies: 516 | ee-first "1.1.1" 517 | 518 | packet-reader@1.0.0: 519 | version "1.0.0" 520 | resolved "https://registry.yarnpkg.com/packet-reader/-/packet-reader-1.0.0.tgz#9238e5480dedabacfe1fe3f2771063f164157d74" 521 | 522 | parseurl@~1.3.3: 523 | version "1.3.3" 524 | resolved "https://registry.yarnpkg.com/parseurl/-/parseurl-1.3.3.tgz#9da19e7bee8d12dff0513ed5b76957793bc2e8d4" 525 | 526 | path-parse@^1.0.6: 527 | version "1.0.7" 528 | resolved "https://registry.yarnpkg.com/path-parse/-/path-parse-1.0.7.tgz#fbc114b60ca42b30d9daf5858e4bd68bbedb6735" 529 | 530 | path-to-regexp@0.1.7: 531 | version "0.1.7" 532 | resolved "https://registry.yarnpkg.com/path-to-regexp/-/path-to-regexp-0.1.7.tgz#df604178005f522f15eb4490e7247a1bfaa67f8c" 533 | 534 | pg-connection-string@^2.5.0: 535 | version "2.5.0" 536 | resolved "https://registry.yarnpkg.com/pg-connection-string/-/pg-connection-string-2.5.0.tgz#538cadd0f7e603fc09a12590f3b8a452c2c0cf34" 537 | integrity sha512-r5o/V/ORTA6TmUnyWZR9nCj1klXCO2CEKNRlVuJptZe85QuhFayC7WeMic7ndayT5IRIR0S0xFxFi2ousartlQ== 538 | 539 | pg-int8@1.0.1: 540 | version "1.0.1" 541 | resolved "https://registry.yarnpkg.com/pg-int8/-/pg-int8-1.0.1.tgz#943bd463bf5b71b4170115f80f8efc9a0c0eb78c" 542 | 543 | pg-pool@^3.6.0: 544 | version "3.6.0" 545 | resolved "https://registry.yarnpkg.com/pg-pool/-/pg-pool-3.6.0.tgz#3190df3e4747a0d23e5e9e8045bcd99bda0a712e" 546 | integrity sha512-clFRf2ksqd+F497kWFyM21tMjeikn60oGDmqMT8UBrynEwVEX/5R5xd2sdvdo1cZCFlguORNpVuqxIj+aK4cfQ== 547 | 548 | pg-protocol@^1.6.0: 549 | version "1.6.0" 550 | resolved "https://registry.yarnpkg.com/pg-protocol/-/pg-protocol-1.6.0.tgz#4c91613c0315349363af2084608db843502f8833" 551 | integrity sha512-M+PDm637OY5WM307051+bsDia5Xej6d9IR4GwJse1qA1DIhiKlksvrneZOYQq42OM+spubpcNYEo2FcKQrDk+Q== 552 | 553 | pg-types@^2.1.0: 554 | version "2.2.0" 555 | resolved "https://registry.yarnpkg.com/pg-types/-/pg-types-2.2.0.tgz#2d0250d636454f7cfa3b6ae0382fdfa8063254a3" 556 | dependencies: 557 | pg-int8 "1.0.1" 558 | postgres-array "~2.0.0" 559 | postgres-bytea "~1.0.0" 560 | postgres-date "~1.0.4" 561 | postgres-interval "^1.1.0" 562 | 563 | pg@^8.10.0: 564 | version "8.10.0" 565 | resolved "https://registry.yarnpkg.com/pg/-/pg-8.10.0.tgz#5b8379c9b4a36451d110fc8cd98fc325fe62ad24" 566 | integrity sha512-ke7o7qSTMb47iwzOSaZMfeR7xToFdkE71ifIipOAAaLIM0DYzfOAXlgFFmYUIE2BcJtvnVlGCID84ZzCegE8CQ== 567 | dependencies: 568 | buffer-writer "2.0.0" 569 | packet-reader "1.0.0" 570 | pg-connection-string "^2.5.0" 571 | pg-pool "^3.6.0" 572 | pg-protocol "^1.6.0" 573 | pg-types "^2.1.0" 574 | pgpass "1.x" 575 | 576 | pgpass@1.x: 577 | version "1.0.2" 578 | resolved "https://registry.yarnpkg.com/pgpass/-/pgpass-1.0.2.tgz#2a7bb41b6065b67907e91da1b07c1847c877b306" 579 | dependencies: 580 | split "^1.0.0" 581 | 582 | picomatch@^2.0.4, picomatch@^2.2.1: 583 | version "2.3.1" 584 | resolved "https://registry.yarnpkg.com/picomatch/-/picomatch-2.3.1.tgz#3ba3833733646d9d3e4995946c1365a67fb07a42" 585 | integrity sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA== 586 | 587 | postgres-array@~2.0.0: 588 | version "2.0.0" 589 | resolved "https://registry.yarnpkg.com/postgres-array/-/postgres-array-2.0.0.tgz#48f8fce054fbc69671999329b8834b772652d82e" 590 | 591 | postgres-bytea@~1.0.0: 592 | version "1.0.0" 593 | resolved "https://registry.yarnpkg.com/postgres-bytea/-/postgres-bytea-1.0.0.tgz#027b533c0aa890e26d172d47cf9ccecc521acd35" 594 | 595 | postgres-date@~1.0.4: 596 | version "1.0.4" 597 | resolved "https://registry.yarnpkg.com/postgres-date/-/postgres-date-1.0.4.tgz#1c2728d62ef1bff49abdd35c1f86d4bdf118a728" 598 | 599 | postgres-interval@^1.1.0: 600 | version "1.2.0" 601 | resolved "https://registry.yarnpkg.com/postgres-interval/-/postgres-interval-1.2.0.tgz#b460c82cb1587507788819a06aa0fffdb3544695" 602 | dependencies: 603 | xtend "^4.0.0" 604 | 605 | promise@^7.0.1: 606 | version "7.3.1" 607 | resolved "https://registry.yarnpkg.com/promise/-/promise-7.3.1.tgz#064b72602b18f90f29192b8b1bc418ffd1ebd3bf" 608 | dependencies: 609 | asap "~2.0.3" 610 | 611 | proxy-addr@~2.0.7: 612 | version "2.0.7" 613 | resolved "https://registry.yarnpkg.com/proxy-addr/-/proxy-addr-2.0.7.tgz#f19fe69ceab311eeb94b42e70e8c2070f9ba1025" 614 | integrity sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg== 615 | dependencies: 616 | forwarded "0.2.0" 617 | ipaddr.js "1.9.1" 618 | 619 | pstree.remy@^1.1.8: 620 | version "1.1.8" 621 | resolved "https://registry.yarnpkg.com/pstree.remy/-/pstree.remy-1.1.8.tgz#c242224f4a67c21f686839bbdb4ac282b8373d3a" 622 | integrity sha512-77DZwxQmxKnu3aR542U+X8FypNzbfJ+C5XQDk3uWjWxn6151aIMGthWYRXTqT1E5oJvg+ljaa2OJi+VfvCOQ8w== 623 | 624 | pug-attrs@^3.0.0: 625 | version "3.0.0" 626 | resolved "https://registry.yarnpkg.com/pug-attrs/-/pug-attrs-3.0.0.tgz#b10451e0348165e31fad1cc23ebddd9dc7347c41" 627 | dependencies: 628 | constantinople "^4.0.1" 629 | js-stringify "^1.0.2" 630 | pug-runtime "^3.0.0" 631 | 632 | pug-code-gen@^3.0.2: 633 | version "3.0.2" 634 | resolved "https://registry.yarnpkg.com/pug-code-gen/-/pug-code-gen-3.0.2.tgz#ad190f4943133bf186b60b80de483100e132e2ce" 635 | dependencies: 636 | constantinople "^4.0.1" 637 | doctypes "^1.1.0" 638 | js-stringify "^1.0.2" 639 | pug-attrs "^3.0.0" 640 | pug-error "^2.0.0" 641 | pug-runtime "^3.0.0" 642 | void-elements "^3.1.0" 643 | with "^7.0.0" 644 | 645 | pug-error@^2.0.0: 646 | version "2.0.0" 647 | resolved "https://registry.yarnpkg.com/pug-error/-/pug-error-2.0.0.tgz#5c62173cb09c34de2a2ce04f17b8adfec74d8ca5" 648 | 649 | pug-filters@^4.0.0: 650 | version "4.0.0" 651 | resolved "https://registry.yarnpkg.com/pug-filters/-/pug-filters-4.0.0.tgz#d3e49af5ba8472e9b7a66d980e707ce9d2cc9b5e" 652 | dependencies: 653 | constantinople "^4.0.1" 654 | jstransformer "1.0.0" 655 | pug-error "^2.0.0" 656 | pug-walk "^2.0.0" 657 | resolve "^1.15.1" 658 | 659 | pug-lexer@^5.0.1: 660 | version "5.0.1" 661 | resolved "https://registry.yarnpkg.com/pug-lexer/-/pug-lexer-5.0.1.tgz#ae44628c5bef9b190b665683b288ca9024b8b0d5" 662 | integrity sha512-0I6C62+keXlZPZkOJeVam9aBLVP2EnbeDw3An+k0/QlqdwH6rv8284nko14Na7c0TtqtogfWXcRoFE4O4Ff20w== 663 | dependencies: 664 | character-parser "^2.2.0" 665 | is-expression "^4.0.0" 666 | pug-error "^2.0.0" 667 | 668 | pug-linker@^4.0.0: 669 | version "4.0.0" 670 | resolved "https://registry.yarnpkg.com/pug-linker/-/pug-linker-4.0.0.tgz#12cbc0594fc5a3e06b9fc59e6f93c146962a7708" 671 | dependencies: 672 | pug-error "^2.0.0" 673 | pug-walk "^2.0.0" 674 | 675 | pug-load@^3.0.0: 676 | version "3.0.0" 677 | resolved "https://registry.yarnpkg.com/pug-load/-/pug-load-3.0.0.tgz#9fd9cda52202b08adb11d25681fb9f34bd41b662" 678 | dependencies: 679 | object-assign "^4.1.1" 680 | pug-walk "^2.0.0" 681 | 682 | pug-parser@^6.0.0: 683 | version "6.0.0" 684 | resolved "https://registry.yarnpkg.com/pug-parser/-/pug-parser-6.0.0.tgz#a8fdc035863a95b2c1dc5ebf4ecf80b4e76a1260" 685 | dependencies: 686 | pug-error "^2.0.0" 687 | token-stream "1.0.0" 688 | 689 | pug-runtime@^3.0.0, pug-runtime@^3.0.1: 690 | version "3.0.1" 691 | resolved "https://registry.yarnpkg.com/pug-runtime/-/pug-runtime-3.0.1.tgz#f636976204723f35a8c5f6fad6acda2a191b83d7" 692 | 693 | pug-strip-comments@^2.0.0: 694 | version "2.0.0" 695 | resolved "https://registry.yarnpkg.com/pug-strip-comments/-/pug-strip-comments-2.0.0.tgz#f94b07fd6b495523330f490a7f554b4ff876303e" 696 | dependencies: 697 | pug-error "^2.0.0" 698 | 699 | pug-walk@^2.0.0: 700 | version "2.0.0" 701 | resolved "https://registry.yarnpkg.com/pug-walk/-/pug-walk-2.0.0.tgz#417aabc29232bb4499b5b5069a2b2d2a24d5f5fe" 702 | 703 | pug@^3.0.2: 704 | version "3.0.2" 705 | resolved "https://registry.yarnpkg.com/pug/-/pug-3.0.2.tgz#f35c7107343454e43bc27ae0ff76c731b78ea535" 706 | integrity sha512-bp0I/hiK1D1vChHh6EfDxtndHji55XP/ZJKwsRqrz6lRia6ZC2OZbdAymlxdVFwd1L70ebrVJw4/eZ79skrIaw== 707 | dependencies: 708 | pug-code-gen "^3.0.2" 709 | pug-filters "^4.0.0" 710 | pug-lexer "^5.0.1" 711 | pug-linker "^4.0.0" 712 | pug-load "^3.0.0" 713 | pug-parser "^6.0.0" 714 | pug-runtime "^3.0.1" 715 | pug-strip-comments "^2.0.0" 716 | 717 | qs@6.11.0: 718 | version "6.11.0" 719 | resolved "https://registry.yarnpkg.com/qs/-/qs-6.11.0.tgz#fd0d963446f7a65e1367e01abd85429453f0c37a" 720 | integrity sha512-MvjoMCJwEarSbUYk5O+nmoSzSutSsTwF85zcHPQ9OrlFoZOYIjaqBAJIqIXjptyD5vThxGq52Xu/MaJzRkIk4Q== 721 | dependencies: 722 | side-channel "^1.0.4" 723 | 724 | range-parser@~1.2.1: 725 | version "1.2.1" 726 | resolved "https://registry.yarnpkg.com/range-parser/-/range-parser-1.2.1.tgz#3cf37023d199e1c24d1a55b84800c2f3e6468031" 727 | 728 | raw-body@2.5.1: 729 | version "2.5.1" 730 | resolved "https://registry.yarnpkg.com/raw-body/-/raw-body-2.5.1.tgz#fe1b1628b181b700215e5fd42389f98b71392857" 731 | integrity sha512-qqJBtEyVgS0ZmPGdCFPWJ3FreoqvG4MVQln/kCgF7Olq95IbOp0/BWyMwbdtn4VTvkM8Y7khCQ2Xgk/tcrCXig== 732 | dependencies: 733 | bytes "3.1.2" 734 | http-errors "2.0.0" 735 | iconv-lite "0.4.24" 736 | unpipe "1.0.0" 737 | 738 | readdirp@~3.6.0: 739 | version "3.6.0" 740 | resolved "https://registry.yarnpkg.com/readdirp/-/readdirp-3.6.0.tgz#74a370bd857116e245b29cc97340cd431a02a6c7" 741 | integrity sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA== 742 | dependencies: 743 | picomatch "^2.2.1" 744 | 745 | resolve@^1.15.1: 746 | version "1.20.0" 747 | resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.20.0.tgz#629a013fb3f70755d6f0b7935cc1c2c5378b1975" 748 | dependencies: 749 | is-core-module "^2.2.0" 750 | path-parse "^1.0.6" 751 | 752 | safe-buffer@5.2.1: 753 | version "5.2.1" 754 | resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.2.1.tgz#1eaf9fa9bdb1fdd4ec75f58f9cdb4e6b7827eec6" 755 | integrity sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ== 756 | 757 | "safer-buffer@>= 2.1.2 < 3": 758 | version "2.1.2" 759 | resolved "https://registry.yarnpkg.com/safer-buffer/-/safer-buffer-2.1.2.tgz#44fa161b0187b9549dd84bb91802f9bd8385cd6a" 760 | 761 | semver@^5.7.1: 762 | version "5.7.1" 763 | resolved "https://registry.yarnpkg.com/semver/-/semver-5.7.1.tgz#a954f931aeba508d307bbf069eff0c01c96116f7" 764 | integrity sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ== 765 | 766 | semver@~7.0.0: 767 | version "7.0.0" 768 | resolved "https://registry.yarnpkg.com/semver/-/semver-7.0.0.tgz#5f3ca35761e47e05b206c6daff2cf814f0316b8e" 769 | integrity sha512-+GB6zVA9LWh6zovYQLALHwv5rb2PHGlJi3lfiqIHxR0uuwCgefcOJc59v9fv1w8GbStwxuuqqAjI9NMAOOgq1A== 770 | 771 | send@0.18.0: 772 | version "0.18.0" 773 | resolved "https://registry.yarnpkg.com/send/-/send-0.18.0.tgz#670167cc654b05f5aa4a767f9113bb371bc706be" 774 | integrity sha512-qqWzuOjSFOuqPjFe4NOsMLafToQQwBSOEpS+FwEt3A2V3vKubTquT3vmLTQpFgMXp8AlFWFuP1qKaJZOtPpVXg== 775 | dependencies: 776 | debug "2.6.9" 777 | depd "2.0.0" 778 | destroy "1.2.0" 779 | encodeurl "~1.0.2" 780 | escape-html "~1.0.3" 781 | etag "~1.8.1" 782 | fresh "0.5.2" 783 | http-errors "2.0.0" 784 | mime "1.6.0" 785 | ms "2.1.3" 786 | on-finished "2.4.1" 787 | range-parser "~1.2.1" 788 | statuses "2.0.1" 789 | 790 | serve-static@1.15.0: 791 | version "1.15.0" 792 | resolved "https://registry.yarnpkg.com/serve-static/-/serve-static-1.15.0.tgz#faaef08cffe0a1a62f60cad0c4e513cff0ac9540" 793 | integrity sha512-XGuRDNjXUijsUL0vl6nSD7cwURuzEgglbOaFuZM9g3kwDXOWVTck0jLzjPzGD+TazWbboZYu52/9/XPdUgne9g== 794 | dependencies: 795 | encodeurl "~1.0.2" 796 | escape-html "~1.0.3" 797 | parseurl "~1.3.3" 798 | send "0.18.0" 799 | 800 | setprototypeof@1.2.0: 801 | version "1.2.0" 802 | resolved "https://registry.yarnpkg.com/setprototypeof/-/setprototypeof-1.2.0.tgz#66c9a24a73f9fc28cbe66b09fed3d33dcaf1b424" 803 | integrity sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw== 804 | 805 | side-channel@^1.0.4: 806 | version "1.0.4" 807 | resolved "https://registry.yarnpkg.com/side-channel/-/side-channel-1.0.4.tgz#efce5c8fdc104ee751b25c58d4290011fa5ea2cf" 808 | integrity sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw== 809 | dependencies: 810 | call-bind "^1.0.0" 811 | get-intrinsic "^1.0.2" 812 | object-inspect "^1.9.0" 813 | 814 | simple-update-notifier@^1.0.7: 815 | version "1.1.0" 816 | resolved "https://registry.yarnpkg.com/simple-update-notifier/-/simple-update-notifier-1.1.0.tgz#67694c121de354af592b347cdba798463ed49c82" 817 | integrity sha512-VpsrsJSUcJEseSbMHkrsrAVSdvVS5I96Qo1QAQ4FxQ9wXFcB+pjj7FB7/us9+GcgfW4ziHtYMc1J0PLczb55mg== 818 | dependencies: 819 | semver "~7.0.0" 820 | 821 | split@^1.0.0: 822 | version "1.0.1" 823 | resolved "https://registry.yarnpkg.com/split/-/split-1.0.1.tgz#605bd9be303aa59fb35f9229fbea0ddec9ea07d9" 824 | dependencies: 825 | through "2" 826 | 827 | statuses@2.0.1: 828 | version "2.0.1" 829 | resolved "https://registry.yarnpkg.com/statuses/-/statuses-2.0.1.tgz#55cb000ccf1d48728bd23c685a063998cf1a1b63" 830 | integrity sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ== 831 | 832 | supports-color@^5.5.0: 833 | version "5.5.0" 834 | resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-5.5.0.tgz#e2e69a44ac8772f78a1ec0b35b689df6530efc8f" 835 | integrity sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow== 836 | dependencies: 837 | has-flag "^3.0.0" 838 | 839 | through@2: 840 | version "2.3.8" 841 | resolved "https://registry.yarnpkg.com/through/-/through-2.3.8.tgz#0dd4c9ffaabc357960b1b724115d7e0e86a2e1f5" 842 | 843 | to-fast-properties@^2.0.0: 844 | version "2.0.0" 845 | resolved "https://registry.yarnpkg.com/to-fast-properties/-/to-fast-properties-2.0.0.tgz#dc5e698cbd079265bc73e0377681a4e4e83f616e" 846 | 847 | to-regex-range@^5.0.1: 848 | version "5.0.1" 849 | resolved "https://registry.yarnpkg.com/to-regex-range/-/to-regex-range-5.0.1.tgz#1648c44aae7c8d988a326018ed72f5b4dd0392e4" 850 | integrity sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ== 851 | dependencies: 852 | is-number "^7.0.0" 853 | 854 | toidentifier@1.0.1: 855 | version "1.0.1" 856 | resolved "https://registry.yarnpkg.com/toidentifier/-/toidentifier-1.0.1.tgz#3be34321a88a820ed1bd80dfaa33e479fbb8dd35" 857 | integrity sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA== 858 | 859 | token-stream@1.0.0: 860 | version "1.0.0" 861 | resolved "https://registry.yarnpkg.com/token-stream/-/token-stream-1.0.0.tgz#cc200eab2613f4166d27ff9afc7ca56d49df6eb4" 862 | 863 | touch@^3.1.0: 864 | version "3.1.0" 865 | resolved "https://registry.yarnpkg.com/touch/-/touch-3.1.0.tgz#fe365f5f75ec9ed4e56825e0bb76d24ab74af83b" 866 | dependencies: 867 | nopt "~1.0.10" 868 | 869 | type-is@~1.6.18: 870 | version "1.6.18" 871 | resolved "https://registry.yarnpkg.com/type-is/-/type-is-1.6.18.tgz#4e552cd05df09467dcbc4ef739de89f2cf37c131" 872 | dependencies: 873 | media-typer "0.3.0" 874 | mime-types "~2.1.24" 875 | 876 | undefsafe@^2.0.5: 877 | version "2.0.5" 878 | resolved "https://registry.yarnpkg.com/undefsafe/-/undefsafe-2.0.5.tgz#38733b9327bdcd226db889fb723a6efd162e6e2c" 879 | integrity sha512-WxONCrssBM8TSPRqN5EmsjVrsv4A8X12J4ArBiiayv3DyyG3ZlIg6yysuuSYdZsVz3TKcTg2fd//Ujd4CHV1iA== 880 | 881 | unpipe@1.0.0, unpipe@~1.0.0: 882 | version "1.0.0" 883 | resolved "https://registry.yarnpkg.com/unpipe/-/unpipe-1.0.0.tgz#b2bf4ee8514aae6165b4817829d21b2ef49904ec" 884 | 885 | utils-merge@1.0.1: 886 | version "1.0.1" 887 | resolved "https://registry.yarnpkg.com/utils-merge/-/utils-merge-1.0.1.tgz#9f95710f50a267947b2ccc124741c1028427e713" 888 | 889 | vary@~1.1.2: 890 | version "1.1.2" 891 | resolved "https://registry.yarnpkg.com/vary/-/vary-1.1.2.tgz#2299f02c6ded30d4a5961b0b9f74524a18f634fc" 892 | 893 | void-elements@^3.1.0: 894 | version "3.1.0" 895 | resolved "https://registry.yarnpkg.com/void-elements/-/void-elements-3.1.0.tgz#614f7fbf8d801f0bb5f0661f5b2f5785750e4f09" 896 | 897 | with@^7.0.0: 898 | version "7.0.2" 899 | resolved "https://registry.yarnpkg.com/with/-/with-7.0.2.tgz#ccee3ad542d25538a7a7a80aad212b9828495bac" 900 | dependencies: 901 | "@babel/parser" "^7.9.6" 902 | "@babel/types" "^7.9.6" 903 | assert-never "^1.2.1" 904 | babel-walk "3.0.0-canary-5" 905 | 906 | xtend@^4.0.0: 907 | version "4.0.2" 908 | resolved "https://registry.yarnpkg.com/xtend/-/xtend-4.0.2.tgz#bb72779f5fa465186b1f438f674fa347fdb5db54" 909 | --------------------------------------------------------------------------------