Full Code of shuttle-hq/shuttlings for AI

main f53061d2f98a cached
46 files
692.6 KB
251.4k tokens
69 symbols
1 requests
Download .txt
Showing preview only (721K chars total). Download the full file or copy to clipboard to get everything.
Repository: shuttle-hq/shuttlings
Branch: main
Commit: f53061d2f98a
Files: 46
Total size: 692.6 KB

Directory structure:
gitextract_hjr_jxke/

├── .gitignore
├── LICENSE
├── README.md
├── _shuttlings/
│   ├── .gitignore
│   ├── Cargo.toml
│   └── src/
│       └── lib.rs
├── cch23/
│   ├── README.md
│   ├── challenges/
│   │   ├── -1.md
│   │   ├── 1.md
│   │   ├── 11.md
│   │   ├── 12.md
│   │   ├── 13.md
│   │   ├── 14.md
│   │   ├── 15.md
│   │   ├── 18.md
│   │   ├── 19.md
│   │   ├── 20.md
│   │   ├── 21.md
│   │   ├── 22.md
│   │   ├── 4.md
│   │   ├── 5.md
│   │   ├── 6.md
│   │   ├── 7.md
│   │   └── 8.md
│   └── validator/
│       ├── Cargo.toml
│       ├── README.md
│       ├── assets/
│       │   └── numbers.txt
│       └── src/
│           ├── args.rs
│           ├── lib.rs
│           └── main.rs
└── cch24/
    ├── README.md
    ├── challenges/
    │   ├── -1.md
    │   ├── 12.md
    │   ├── 16.md
    │   ├── 19.md
    │   ├── 2.md
    │   ├── 23.md
    │   ├── 5.md
    │   └── 9.md
    └── validator/
        ├── Cargo.toml
        ├── README.md
        ├── assets/
        │   ├── 23.html
        │   └── day16_santa_public_key.pem
        └── src/
            ├── args.rs
            ├── lib.rs
            └── main.rs

================================================
FILE CONTENTS
================================================

================================================
FILE: .gitignore
================================================
target/


================================================
FILE: LICENSE
================================================
MIT License

Copyright (c) 2024 shuttle

Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:

The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.


================================================
FILE: README.md
================================================
# Shuttlings

This is [Shuttle](https://www.shuttle.dev/)'s collection of code challenges for learning backend development with Rust. The name is derived from [rustlings](https://github.com/rust-lang/rustlings), which is also a great resource for learning Rust basics.

Looking to chat with other Shuttlings? Join the [Discord server](https://discord.gg/shuttle) to meet others, provide feedback and discuss the challenges.

## Why did we create this repo?

After the success of our [Christmas Code Hunt](https://shuttle.dev/cch) in December 2023, we realized the positive impact that practical coding challenges could have on learning Rust. This repo was created to continue that momentum, offering a collection of real-world problems for developers to solve and learn from all year round. It serves as a permanent, go-to resource for honing web backend skills through hands-on practice with Rust.

We've seen the challenges used in numerous cases, such as educating team members at companies or educating students at a university. Now, we are making them available to everyone and continue to refine and expand this collection to offer challenges that cater to all skill levels, supporting the growth of Rust developers on their learning journey.

## Editions

- [Shuttle's Christmas Code Hunt 2023](cch23/README.md)
- [Shuttle's Christmas Code Hunt 2024](cch24/README.md)


================================================
FILE: _shuttlings/.gitignore
================================================
Cargo.lock


================================================
FILE: _shuttlings/Cargo.toml
================================================
[package]
name = "shuttlings"
description = "Types for Shuttlings libraries"
repository = "https://github.com/shuttle-hq/shuttlings"
version = "0.1.0"
edition = "2021"
license = "MIT"
publish = true

[dependencies]


================================================
FILE: _shuttlings/src/lib.rs
================================================
#[derive(Debug)]
pub enum SubmissionState {
    Waiting,
    Running,
    Done,
    Error,
}
impl std::fmt::Display for SubmissionState {
    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
        write!(f, "{self:?}")
    }
}

#[derive(Debug)]
pub enum SubmissionUpdate {
    /// State update
    State(SubmissionState),
    /// bool is true if this task was the last core task, int is amount of bonus points
    TaskCompleted(bool, i32),
    /// Append line to log
    LogLine(String),
    /// Save changes to db
    Save,
}
impl From<SubmissionState> for SubmissionUpdate {
    fn from(value: SubmissionState) -> Self {
        Self::State(value)
    }
}
impl From<(bool, i32)> for SubmissionUpdate {
    fn from((b, i): (bool, i32)) -> Self {
        Self::TaskCompleted(b, i)
    }
}
impl From<String> for SubmissionUpdate {
    fn from(value: String) -> Self {
        Self::LogLine(value)
    }
}


================================================
FILE: cch23/README.md
================================================
# Shuttle's Christmas Code Hunt 2023

The Shuttle Christmas Code Hunt is a set of Rust challenges that were released throughout December 2023.

## Prerequistites

If you haven't yet, [install Rust](https://rustup.rs/) and [install Shuttle CLI](https://docs.shuttle.dev/getting-started/installation).

You can check the versions with `cargo -V` and `shuttle -V`.

## How to get started

Open [Challenge -1](challenges/-1.md) for a guide to get started with using Shuttle, and follow along the journey to build a web server for solving all of Santa's problems!

You can also read the challenges on the [Shuttle Console](https://console.shuttle.dev/).

## How to validate my solutions

Locally, you can use the [validator](validator/README.md).

You can also deploy your solution to Shuttle and validate it there. Go to the challenge pages on [Shuttle Console](https://console.shuttle.dev/) for instructions.


================================================
FILE: cch23/challenges/-1.md
================================================
# 🎄 Day -1: Get your winter boots on!

Welcome to Shuttle's Christmas Code Hunt 2023!

This challenge is a warmup challenge made to familiarize you with deploying your CCH23 project on Shuttle,
and it does not count towards your score.

---

## 🔔 Challenge layout

Every challenge is split into one or more *Core Tasks* (marked with ⭐) and one or more *Bonus Tasks* (marked with 🎁).

To **complete** a challenge, you only need to pass the tests for the *Core Tasks* ⭐.

*Bonus Tasks* 🎁 are harder to complete but give even more points. Their tests contain more edge cases and curveballs.

You can complete the *Core Tasks* ⭐ first (submit at the bottom of the page), and then work on *Bonus Tasks* 🎁.

---

## ⭐ Task 1: Everything is OK

Deploy a minimal working web app to your CCH23 Shuttle project.

The root endpoint `/` should respond with a `200 OK` status code to GET requests.
Responding with a "Hello, world!" string, like the starter templates do, is enough to accomplish this.

### 🔔 Tips

Navigate to your CCH23 project folder. It should have code for a "Hello, world!" app.

In your project directory, you can use `shuttle run` to test your Shuttle app locally (see below).

**More reading:**

- [Shuttle docs: Quick start](https://docs.shuttle.rs/getting-started/quick-start)
- [Shuttle docs: Local run](https://docs.shuttle.rs/getting-started/local-run)
- [Shuttle docs: Axum](https://docs.shuttle.rs/examples/axum)
- [Shuttle docs: Actix Web](https://docs.shuttle.rs/examples/actix)
- [Shuttle docs: Rocket](https://docs.shuttle.rs/examples/rocket)
- [Shuttle docs: Tower, Warp, Salvo, Poem, Thruster, Tide](https://docs.shuttle.rs/examples/other)
- [MDN web docs: 200 OK](https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/200)

### 💠 Example Input

Many tasks throughout CCH23 can easily be tested with a `curl` command.
You can use it when testing locally, and then verify that the deployed app works.

```bash
# On a local run with `shuttle run`
curl -I -X GET http://localhost:8000/
```

### 💠 Example Output

```text
HTTP/1.1 200 OK
...
```

With that done, you can now get your first passing task!

You can at this point scroll to the bottom of this page to submit and see if your Hello World app is working,
or keep going with the bonus task.

---

## 🎁 Task 2: Fake error (0 bonus points)

For this bonus task, add an endpoint on `/-1/error` that responds with the status code `500 Internal Server Error` to GET requests.
The response body content does not matter.

### 🔔 Tips

- [Axum Responses](https://docs.rs/axum/latest/axum/response/index.html)
- [Actix Web Responses](https://actix.rs/docs/response)
- [Rocket Responses](https://rocket.rs/v0.5/guide/responses/)
- [MDN web docs: 500 Internal Server Error](https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/500)

### 💠 Example Input

```bash
curl -I -X GET http://localhost:8000/-1/error
```

### 💠 Example Output

```text
HTTP/1.1 500 Internal Server Error
...
```

---

Author: [jonaro00](https://github.com/jonaro00)


================================================
FILE: cch23/challenges/1.md
================================================
# 🎄 Day 1: Packet "exclusive-cube" not found

*In the frosty expanses of the North Pole, Santa's advanced packet management system has encountered a glitch. This system, known for its robustness and magical speed, is responsible for sorting and dispatching all the Christmas gifts. However, a sudden aurora borealis storm has scattered bits of data across the snowy landscape, leaving Santa in dire need of a digital handyman to restore order.*

## ⭐ Task 1: Cube the bits

Santa needs your programming expertise to recalibrate the packet IDs in his packet management system.

Implement a GET endpoint `/1/<num1>/<num2>` that takes 2 integers in the path, `num1` and `num2`, and returns the result of `(num1 XOR num2) POW 3`, where *XOR* is the exclusive OR operation, and *POW* is exponentiation.

### 🔔 Tips

Check your web framework's docs for clues how to match the URI path pattern:

- [Axum Routing](https://docs.rs/axum/latest/axum/#routing)
- [Axum Extractors](https://docs.rs/axum/latest/axum/extract/index.html)
- [Actix Web Extractors](https://actix.rs/docs/extractors)
- [Rocket Dynamic Paths](https://rocket.rs/v0.5/guide/requests/#dynamic-paths)

### 💠 Example

```bash
curl http://localhost:8000/1/4/8

1728
```

---

## 🎁 Task 2: The sled ID system (100 bonus points)

After the packet IDs are calibrated and the packets are packed into sleds,
Santa needs to calibrate the sled ID.

The formula is very similar: All packet IDs (integers) are *XOR*'ed with each other, and then the result is (again) raised to the power of 3. The catch is that there can be between 1 and 20 packets in a sled!

Adapt the endpoint from Task 1 so that it can also be used to calculate sled IDs.

### 💠 Examples

```bash
curl http://localhost:8000/1/10

1000
```

```bash
curl http://localhost:8000/1/4/5/8/10

27
```

---

Authors: [jonaro00](https://github.com/jonaro00), [orhun](https://github.com/orhun)


================================================
FILE: cch23/challenges/11.md
================================================
# 🎄 Day 11: Imagery from the North Pole

*Decked out in his signature red coat, Santa's eyes sparkle brighter than the Northern Star as he navigates through tall shelves packed with newly produced Christmas decorations for the season. Handcrafted glass balls, ornate stars, whimsical snowflakes, festive tinsel - you name it, they have it all.*

## ⭐ Task 1: Served on a silver platter

The time has come to decorate our surroundings! The elves are getting tired of working with just strings and numbers and bytes, and are in need of some fancy christmas ornaments on the computer screens.

![decoration](../validator/assets/decoration.png)

Download the image above and serve it as a static file so that a GET request to `/11/assets/decoration.png` responds with the image file and correct headers for MIME type (`Content-Type: image/png`) and response length (`Content-Length: ...`).

### 🔔 Tips

Web frameworks usually provide an easy way to serve files and automatically setting the type and length headers based on the file served.

- [Shuttle examples: Axum static files](https://github.com/shuttle-hq/shuttle-examples/tree/main/axum/static-files)
- [Shuttle examples: Actix Web static files](https://github.com/shuttle-hq/shuttle-examples/tree/main/actix-web/static-files)
- [Shuttle examples: Rocket static files](https://github.com/shuttle-hq/shuttle-examples/tree/main/rocket/static-files)
- [MDN Wed docs: Content-Type](https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Content-Type)
- [MDN Wed docs: MIME types](https://developer.mozilla.org/en-US/docs/Web/HTTP/Basics_of_HTTP/MIME_types)

### 💠 Example Input

```bash
curl -I -X GET http://localhost:8000/11/assets/decoration.png
```

### 💠 Example Output

```text
HTTP/1.1 200 OK
content-type: image/png
content-length: 787297
...
```

---

## 🎁 Task 2: Bull mode activated (200 bonus points)

Add a POST endpoint `/11/red_pixels`, that takes in a PNG image in the `image` field of a multipart POST request, and returns the number of pixels in the image that are perceived as "magical red" when viewed with Santa's night vision goggles.
The goggles considers a pixel "magical red" if the color values of the pixel fulfill the formula `red > blue + green`.

### 💠 Example

```bash
curl -X POST http://localhost:8000/11/red_pixels \
  -H 'Content-Type: multipart/form-data' \
  -F 'image=@decoration.png' # the image from Task 1

73034
```

---

Authors: [orhun](https://github.com/orhun), [jonaro00](https://github.com/jonaro00)


================================================
FILE: cch23/challenges/12.md
================================================
# 🎄 Day 12: Timekeeper

*One frosty night, Santa, dressed warmly in his favorite red coat, decided to take a midnight stroll around the elf workshop. As he pushed open the heavy wooden doors of the workshop, his eyes widened in surprise. He was completely stunned by the sight that greeted him.*

*Rows upon rows of conveyor belts had been set up, zipping toys from one corner to the other, resembling an intricate dance of festivity and efficiency. The elves were operating with military precision, organizing toys into specific categories and sending them down the right pathways.*

## ⭐ Task 1: How To Time Persist? (HTTP)

Presents are being packed and wrapped at *blazingly fast* speeds in the workshop.
In order to gather data on the production of presents, Santa needs a multi-stopwatch that can keep the time of many packet IDs at once.

Create two endpoints:

- POST `/12/save/<string>`: takes a string and stores it.
- GET `/12/load/<string>`: takes the same string and returns the number of whole seconds elapsed since the last time it was stored.

### 🔔 Tips

Find a suitable way to store data (pairs of strings and timestamps), either with an in-memory data structure or in a persistent fashion.

- [Sharing state in Axum](https://docs.rs/axum/latest/axum/#sharing-state-with-handlers)
- [Application State in Actix Web](https://actix.rs/docs/application#state)
- [State in Rocket](https://rocket.rs/v0.5/guide/state/)
- [Shuttle Persist](https://docs.shuttle.rs/resources/shuttle-persist)

### 💠 Example

```bash
curl -X POST http://localhost:8000/12/save/packet20231212
sleep 2
curl http://localhost:8000/12/load/packet20231212
echo
sleep 2
curl http://localhost:8000/12/load/packet20231212
echo
curl -X POST http://localhost:8000/12/save/packet20231212
curl http://localhost:8000/12/load/packet20231212

# After ~4 seconds:
2
4
0
```

## 🎁 Task 2: Unanimously Legendary IDentifier (ULID) (100 bonus points)

Santa, who likes old-school tech, now sees that some packets use modern ULIDs.
Help him rewind time a little bit by showing him them in an older format that he understands.

Make a POST endpoint `/12/ulids` that takes a JSON array of ULIDs.
Convert all the ULIDs to UUIDs and return a new array but in reverse order.

### 💠 Example

```bash
curl -X POST http://localhost:8000/12/ulids \
  -H 'Content-Type: application/json' \
  -d '[
    "01BJQ0E1C3Z56ABCD0E11HYX4M",
    "01BJQ0E1C3Z56ABCD0E11HYX5N",
    "01BJQ0E1C3Z56ABCD0E11HYX6Q",
    "01BJQ0E1C3Z56ABCD0E11HYX7R",
    "01BJQ0E1C3Z56ABCD0E11HYX8P"
  ]'

[
  "015cae07-0583-f94c-a5b1-a070431f7516",
  "015cae07-0583-f94c-a5b1-a070431f74f8",
  "015cae07-0583-f94c-a5b1-a070431f74d7",
  "015cae07-0583-f94c-a5b1-a070431f74b5",
  "015cae07-0583-f94c-a5b1-a070431f7494"
]
```

## 🎁 Task 3: Let Santa Broil (LSB) (200 bonus points)

Now that Santa is up to date on some newer data formats, he needs help with analyzing the manufacturing date of some packets he found in the corner of the workshop.

Create another variant of the same endpoint `/12/ulids/<weekday>` that counts the number of ULIDs that fulfill the following criteria (in the UTC timezone):

- How many of the ULIDs were generated on a Christmas Eve?
- How many were generated on a `<weekday>`? (A number in the path between 0 (Monday) and 6 (Sunday))
- How many were generated in the future? (has a date later than the current time)
- How many have entropy bits where the Least Significant Bit (LSB) is 1?

### 💠 Example

```bash
curl -X POST http://localhost:8000/12/ulids/5 \
  -H 'Content-Type: application/json' \
  -d '[
    "00WEGGF0G0J5HEYXS3D7RWZGV8",
    "76EP4G39R8JD1N8AQNYDVJBRCF",
    "018CJ7KMG0051CDCS3B7BFJ3AK",
    "00Y986KPG0AMGB78RD45E9109K",
    "010451HTG0NYWMPWCEXG6AJ8F2",
    "01HH9SJEG0KY16H81S3N1BMXM4",
    "01HH9SJEG0P9M22Z9VGHH9C8CX",
    "017F8YY0G0NQA16HHC2QT5JD6X",
    "03QCPC7P003V1NND3B3QJW72QJ"
  ]'

{
  "christmas eve": 3,
  "weekday": 1,
  "in the future": 2,
  "LSB is 1": 5
}
```

---

Authors: [orhun](https://github.com/orhun), [jonaro00](https://github.com/jonaro00)


================================================
FILE: cch23/challenges/13.md
================================================
# 🎄 Day 13: Santa's Gift Orders

*Santa Claus has started facing a pressing issue at the North Pole. The existing database, written in a legacy language, is becoming insufficient for handling the tidal wave of gift requests from children worldwide. This ancient system is not only slowing down operations, but it is also proving harder to maintain.*

*To ensure that not a single child's wish is overlooked and operations run as efficiently as possible, an immediate upgrade is a necessity.*

## ⭐ Task 1: SQL? Sequel? Squeel??

Santa's gift order database is written in an ancient language and needs to be oxidized.
Let's show him the power of Rust with your backend combined with a Postgres database.

Add a Postgres database with the [Shuttle Shared Database](https://docs.shuttle.rs/resources/shuttle-shared-db) plugin, and add the pool to your application state.
Add a GET endpoint `/13/sql` that executes the SQL query `SELECT 20231213` and responds with the query result (an `i32` turned into a string).

### 🔔 Tips

- [sqlx](https://docs.rs/sqlx/latest/sqlx/)
- [Shuttle Examples: Axum Postgres](https://github.com/shuttle-hq/shuttle-examples/tree/main/axum/postgres)
- [Shuttle Examples: Actix Web Postgres](https://github.com/shuttle-hq/shuttle-examples/tree/main/actix-web/postgres)
- [Shuttle Examples: Rocket Postgres](https://github.com/shuttle-hq/shuttle-examples/tree/main/rocket/postgres)

### 💠 Example

```bash
curl http://localhost:8000/13/sql

20231213
```

## ⭐ Task 2: Use code NorthPole2023 for 2023% off???

Now that the data can be migrated over to the new database, we see that Santa's workshop has received numerous gift orders from different regions. Time to do some basic analysis.

Create a POST endpoint `/13/reset` that (re-)creates the following schema in your database upon being called, and returns a plain `200 OK`.
It will be used at the start of each test to ensure a clean starting point.

```sql
DROP TABLE IF EXISTS orders;
CREATE TABLE orders (
  id INT PRIMARY KEY,
  region_id INT,
  gift_name VARCHAR(50),
  quantity INT
);
```

Then, create a POST endpoint `/13/orders` that takes a JSON array of order objects and inserts them into the table (see below). Return a plain `200 OK`.

Lastly, create a GET endpoint `/13/orders/total` that queries the table and returns the total number of gifts ordered (the sum of all quantities).

### 🔔 Tips

Use a `SELECT` statement and the `SUM()` function. The result can be extracted as one row with an `i64` on the Rust side.

### 💠 Example

```bash
curl -X POST http://localhost:8000/13/reset
curl -X POST http://localhost:8000/13/orders \
  -H 'Content-Type: application/json' \
  -d '[
    {"id":1,"region_id":2,"gift_name":"Toy Train","quantity":5},
    {"id":2,"region_id":2,"gift_name":"Doll","quantity":8},
    {"id":3,"region_id":3,"gift_name":"Action Figure","quantity":12},
    {"id":4,"region_id":4,"gift_name":"Board Game","quantity":10},
    {"id":5,"region_id":2,"gift_name":"Teddy Bear","quantity":6},
    {"id":6,"region_id":3,"gift_name":"Toy Train","quantity":3}
  ]'
curl http://localhost:8000/13/orders/total

{"total":44}
```

## 🎁 Task 3: Truly one of the gifts of all time (100 bonus points)

Add a GET endpoint `/13/orders/popular` that returns the name of the most popular gift.
If there is no most popular gift, use `null` instead of a string.

```bash
curl -X POST http://localhost:8000/13/reset
curl -X POST http://localhost:8000/13/orders \
  -H 'Content-Type: application/json' \
  -d '[
    {"id":1,"region_id":2,"gift_name":"Toy Train","quantity":5},
    {"id":2,"region_id":2,"gift_name":"Doll","quantity":8},
    {"id":3,"region_id":3,"gift_name":"Toy Train","quantity":4}
  ]'
curl http://localhost:8000/13/orders/popular

{"popular":"Toy Train"}
```

---

Authors: [orhun](https://github.com/orhun), [jonaro00](https://github.com/jonaro00)


================================================
FILE: cch23/challenges/14.md
================================================
# 🎄 Day 14: Reindeering HTML

*Did you hear about the time when Santa became a web designer? He picked up coding with great enthusiasm. Each tag told a story, every element was a toy, and every attribute was a wish from a child around the world. He soon managed to build a website where children could easily send their letters filled with Christmas wishes, and the elves could more efficiently organize the toymaking process.*

## ⭐ Task 1: Ho-ho, Toymaking Magic Land! (HTML)

Today we are simulating an incident that happened shortly after Santa joined the web dev team at the North Pole.

Implement a POST endpoint `/14/unsafe` that takes some HTML content and *unsafely* renders it on a small HTML page.

### 🔔 Tips

If you choose to use a templating engine for this task, make sure you disable escaping to allow unsafe rendering.

### 💠 Example Input

```bash
curl -X POST http://localhost:8000/14/unsafe \
  -H "Content-Type: application/json" \
  -d '{"content": "<h1>Welcome to the North Pole!</h1>"}'
```

### 💠 Example Output

Make sure that no extra whitespace is rendered. The response content below is 124 bytes long.

```html
<html>
  <head>
    <title>CCH23 Day 14</title>
  </head>
  <body>
    <h1>Welcome to the North Pole!</h1>
  </body>
</html>
```

---

## 🎁 Task 2: Safety 2nd (100 bonus points)

Time to clean up the mess that Santa caused in Task 1.
Show him how it's done in `/14/safe` by securely rendering the HTML against script injection.

### 💠 Example Input

```bash
curl -X POST http://localhost:8000/14/safe \
  -H "Content-Type: application/json" \
  -d '{"content": "<script>alert(\"XSS Attack!\")</script>"}'
```

### 💠 Example Output

```html
<html>
  <head>
    <title>CCH23 Day 14</title>
  </head>
  <body>
    &lt;script&gt;alert(&quot;XSS Attack!&quot;)&lt;/script&gt;
  </body>
</html>
```

---

Authors: [orhun](https://github.com/orhun), [jonaro00](https://github.com/jonaro00)


================================================
FILE: cch23/challenges/15.md
================================================
# 🎄 Day 15: The Password Validator

*There had been a few naughty incidents where mischievous users had tinkered with other children's wish lists, not respecting the goodwill and spirit of the platform. It was clear: the website needed to add a layer of security to protect the integrity of each child's wish list.*

*The team behind the scenes, a dedicated crew of Santa's tech-savvy elves (led by you), rolled up their sleeves. They decided to implement a homemade password validation system that ensured that no Grinch could easily guess or crack the password.*

## ⭐ Task 1: Naughty or Nice Strings

Now that children can sign up to the letter sending website, we need an endpoint for validating their passwords.

Create an endpoint at `/15/nice` that accepts POST requests with a JSON payload containing a password string to validate.

The rules at this endpoint are:

- **Nice Strings**: Must contain at least three vowels (`aeiouy`), at least one letter that appears twice in a row, and must not contain the substrings: `ab`, `cd`, `pq`, or `xy`.
- **Naughty Strings**: Do not meet the criteria for nice strings.

Return an appropriate HTTP status code and message (see below) indicating whether the provided string is nice or naughty.

### 🔔 Tips

Use Rust's string and char methods or [regex](https://crates.io/crates/regex) for validation.

### 💠 Examples

```bash
curl -X POST http://localhost:8000/15/nice \
  -H 'Content-Type: application/json' \
  -d '{"input": "hello there"}'

# 200 OK
{"result":"nice"}
```

```bash
curl -X POST http://localhost:8000/15/nice \
  -H 'Content-Type: application/json' \
  -d '{"input": "abcd"}'

# 400 Bad Request
{"result":"naughty"}
```

```bash
curl -X POST http://localhost:8000/15/nice \
  -H 'Content-Type: application/json' \
  -d '{Grinch? GRINCH!}'

# 400 Bad Request
# response body does not matter
```

---

## 🎁 Task 2: Game of the Year (400 bonus points)

Santa thought this validation thing was so fun that it could be turned into a game!

Add a similar endpoint, POST `/15/game`, that has this set of rules:

- **Nice Strings**: Must adhere to all the rules:
  - Rule 1: must be at least 8 characters long
  - Rule 2: must contain uppercase letters, lowercase letters, and digits
  - Rule 3: must contain at least 5 digits
  - Rule 4: all *integers* (sequences of consecutive digits) in the string must add up to 2023
  - Rule 5: must contain the letters `j`, `o`, and `y` in that order and in no other order
  - Rule 6: must contain a letter that repeats with exactly one other letter between them (like `xyx`)
  - Rule 7: must contain at least one unicode character in the range `[U+2980, U+2BFF]`
  - Rule 8: must contain at least one emoji
  - Rule 9: the hexadecimal representation of the sha256 hash of the string must end with an `a`
- **Naughty Strings**: Do not meet the criteria for nice strings.

Check the string for the rules in the listed order. Return the corresponding status code and reason (and naughty/nice result) based on which rule was violated:

| Rule broken | Status Code | Reason |
|-------------|-------------|--------|
| 1 | 400 | `8 chars` |
| 2 | 400 | `more types of chars` |
| 3 | 400 | `55555` |
| 4 | 400 | `math is hard` |
| 5 | 406 | `not joyful enough` |
| 6 | 451 | `illegal: no sandwich` |
| 7 | 416 | `outranged` |
| 8 | 426 | `😳` |
| 9 | 418 | `not a coffee brewer` |
| None | 200 | `that's a nice password` |

### 💠 Examples

```bash
curl -X POST http://localhost:8000/15/game \
  -H 'Content-Type: application/json' \
  -d '{"input": "password"}'

# 400 Bad Request
{"result":"naughty","reason":"more types of chars"}
```

```bash
curl -X POST http://localhost:8000/15/game \
  -H 'Content-Type: application/json' \
  -d '{"input": "Password12345"}'

# 400 Bad Request
{"result":"naughty","reason":"math is hard"}
```

```bash
curl -X POST http://localhost:8000/15/game \
  -H 'Content-Type: application/json' \
  -d '{"input": "23jPassword2000y"}'

# 451 Unavailable For Legal Reasons
{"result":"naughty","reason":"illegal: no sandwich"}
```

---

Authors: [orhun](https://github.com/orhun), [jonaro00](https://github.com/jonaro00)


================================================
FILE: cch23/challenges/18.md
================================================
# 🎄 Day 18: Santa's Gift Orders: Data Analytics Edition

*Santa sat back in his plush seat, a mug of hot cocoa in his hand, and a smile on his jolly face. The database upgrade from the previous week had indeed worked out exceptionally well; the operations were running smoother than ever, the reports were accurate, and morale among his helpers was at an all-time high. This modern marvel of technology had infused a new spirit into the North Pole operations.*

## ⭐ Task 1: Mr. Worldwide

*This challenge continues from what was built for the Core tasks on Day 13.*

Santa is stoked about the speed and reliability of the new gift order database backend!
He wants you to expand it to support per-region analytics.

Copy the `/13/reset` endpoint from Day 13 to `/18/reset`, but modify the query like this:

```sql
DROP TABLE IF EXISTS regions;
DROP TABLE IF EXISTS orders;

CREATE TABLE regions (
  id INT PRIMARY KEY,
  name VARCHAR(50)
);

CREATE TABLE orders (
  id INT PRIMARY KEY,
  region_id INT,
  gift_name VARCHAR(50),
  quantity INT
);
```

We want to re-use the POST endpoint `/13/orders` at `/18/orders` for adding new orders.
You can either add the same handler under the new route, or just copy+paste the entire thing, as long as both endpoints are doing the same thing.

Now, add a POST endpoint `/18/regions` that inserts regions in the same way the orders endpoint does.

Lastly, add a GET endpoint `/18/regions/total` that returns the total number of orders per region.
To make it easier for Santa to find a location, the output should be alphabetically sorted on the region name.
Regions with no orders should not be listed in the result.

### 🔔 Tips

You can `JOIN` the tables and use `GROUP BY` and `SUM()`.

### 💠 Example

```bash
curl -X POST http://localhost:8000/18/reset
curl -X POST http://localhost:8000/18/regions \
  -H 'Content-Type: application/json' \
  -d '[
    {"id":1,"name":"North Pole"},
    {"id":2,"name":"Europe"},
    {"id":3,"name":"North America"},
    {"id":4,"name":"South America"},
    {"id":5,"name":"Africa"},
    {"id":6,"name":"Asia"},
    {"id":7,"name":"Oceania"}
  ]'
curl -X POST http://localhost:8000/18/orders \
  -H 'Content-Type: application/json' \
  -d '[
    {"id":1,"region_id":2,"gift_name":"Board Game","quantity":5},
    {"id":2,"region_id":2,"gift_name":"Origami Set","quantity":8},
    {"id":3,"region_id":3,"gift_name":"Action Figure","quantity":12},
    {"id":4,"region_id":4,"gift_name":"Teddy Bear","quantity":10},
    {"id":5,"region_id":2,"gift_name":"Yarn Ball","quantity":6},
    {"id":6,"region_id":3,"gift_name":"Art Set","quantity":3},
    {"id":7,"region_id":5,"gift_name":"Robot Lego Kit","quantity":5},
    {"id":8,"region_id":6,"gift_name":"Drone","quantity":9}
  ]'
curl http://localhost:8000/18/regions/total

[
  {"region":"Africa","total":5},
  {"region":"Asia","total":9},
  {"region":"Europe","total":19},
  {"region":"North America","total":15},
  {"region":"South America","total":10}
]
```

## 🎁 Task 2: West Pole to East Pole - Santa wants ALL the data (600 bonus points)

To optimize production of gifts for next year, Santa needs detailed insights into the best performing gifts in every region.

Create a GET endpoint `/18/regions/top_list/<number>` that retrieves the names of the regions along with the top `<number>` most ordered gifts in each region, considering the quantity of orders placed for each gift.

If there are less than `<number>` unique gifts in a region, the top list will be shorter.
If there are no gifts in a region, show that with an empty top list.

If there is a tie among gifts, use alphabetical ordering of the gift name to break it.
The final output shall once again be ordered by region name.

### 💠 Example

```bash
curl -X POST http://localhost:8000/18/reset
curl -X POST http://localhost:8000/18/regions \
  -H 'Content-Type: application/json' \
  -d '[
    {"id":1,"name":"North Pole"},
    {"id":2,"name":"South Pole"},
    {"id":3,"name":"Kiribati"},
    {"id":4,"name":"Baker Island"}
  ]'
curl -X POST http://localhost:8000/18/orders \
  -H 'Content-Type: application/json' \
  -d '[
    {"id":1,"region_id":2,"gift_name":"Toy Train","quantity":5},
    {"id":2,"region_id":2,"gift_name":"Toy Train","quantity":3},
    {"id":3,"region_id":2,"gift_name":"Doll","quantity":8},
    {"id":4,"region_id":3,"gift_name":"Toy Train","quantity":3},
    {"id":5,"region_id":2,"gift_name":"Teddy Bear","quantity":6},
    {"id":6,"region_id":3,"gift_name":"Action Figure","quantity":12},
    {"id":7,"region_id":4,"gift_name":"Board Game","quantity":10},
    {"id":8,"region_id":3,"gift_name":"Teddy Bear","quantity":1},
    {"id":9,"region_id":3,"gift_name":"Teddy Bear","quantity":2}
  ]'
curl http://localhost:8000/18/regions/top_list/2

[
  {"region":"Baker Island","top_gifts":["Board Game"]},
  {"region":"Kiribati","top_gifts":["Action Figure","Teddy Bear"]},
  {"region":"North Pole","top_gifts":[]},
  {"region":"South Pole","top_gifts":["Doll","Toy Train"]}
]
```

---

Authors: [jonaro00](https://github.com/jonaro00), [orhun](https://github.com/orhun)


================================================
FILE: cch23/challenges/19.md
================================================
# 🎄 Day 19: Christmas Sockets on the Chimney

*On a cold and snowy winter day, Santa Claus was busy with his annual routine when he spotted a new delivery of vibrant socks hanging on his chimney. The hues and prints on these socks were unlike anything he had seen before - intricate patterns with tiny paddles embroidered on them. He chuckled, remembering how he used to juggle between writing protocols for his websocket apps and practising his backhand strokes on his virtual table tennis game.*

## ⭐ Task 1: Table Tennis Server 🏓

Write a WebSocket GET endpoint `/19/ws/ping` that listens for messages of type Text.

- If the incoming string is `serve`, the game starts in this WebSocket.
- If and only if the game has started, respond with a string `pong` whenever the incoming string is `ping`.
- All other incoming messages should be ignored.

### 🔔 Tips

Check your web framework's documentation for how to use WebSockets.

### 💠 Example

curl is not sufficient for testing WebSocket behavior with simple commands.
Use the official validator (link at bottom of page) to run local tests for this challenge.

## 🎁 Task 2: Bird App Simulator (500 bonus points)

To improve internal communications at the North Pole, Santa is trying out a real-time variant of Twitter (sometimes referred to as a "chat app").
*(Santa is old-school & cool - still calls it Twitter instead of X).*

In order to know how much the elves are using the platform, Santa wants some metrics.
He thinks it is sufficient to just count the total number of views on all tweets.

Here are the required endpoints:

- POST endpoint `/19/reset` that resets the counter of tweet views.
- GET endpoint `/19/views` that returns the current count of tweet views.
- GET endpoint `/19/ws/room/<number>/user/<string>` that opens a WebSocket and connects a user to a room.

This is how the app should work:

- A user can at any time send a tweet as a Text WebSocket message in the format `{"message":"Hello North Pole!"}`.
- When a tweet is received, broadcast it to everyone in the same room (including the sender).
- Tweets with more than 128 characters are too long and should be ignored by the server.
- Tweets sent out to room members should have the format `{"user":"xX_f4th3r_0f_chr1stm4s_Xx","message":"Hello North Pole!"}` where user is the author of the tweet (the username that the sender used in the endpoint's URL path).
- Every time a tweet is successfully sent out to a user, it counts as one view.
- Keep a running count of the number of views that happen, and return the current view count from the `/19/views` endpoint whenever requested.
- When a websocket closes, that user leaves the room and should no longer receive tweets.
- When the reset endpoint is called, the counter is set to 0.

The view counter can be in-memory and does not need to persist.

---

Author: [jonaro00](https://github.com/jonaro00)


================================================
FILE: cch23/challenges/20.md
================================================
# 🎄 Day 20: Git good

*Santa frowned, his usually merry eyes scanning the data on the screen before him. Something wasn't right. He pulled up the database of gift orders worldwide, but there was a noticeable gap in the records. This was a serious issue, and Santa knew the implications immediately - missing orders meant missing gifts and unhappy children. Just the thought of it made his jolly cheer fade a bit, replaced by a hint of worry.*

*"Time for a trip down memory lane," Santa mumbled to himself as he trudged his way towards the archives. The archives were a labyrinth of shelves, filled to the brim with old records and endless stacks of papers detailing all past Christmases. It was a treasure trove of information that had slowly been digitized, but the older records, the ones that were now in question, still lay tucked in the musty corners of the archive.*

*It wouldn't be an easy task, and even Santa knew it could take hours, maybe even days. But every child mattered, and Santa would not rest until every record was found and every child got their rightful gift. With a deep breath, Santa began his journey in the archives, determined to fill in the gaps and ensure a merry Christmas for all.*

## ⭐ Task 1: Archive Analysis

To find some very old gift order records, Santa needs to dig deep into the archives.
You offer to help him parse and analyze the archive files.

Create a POST endpoint `/20/archive_files` that receives a `tar` archive file in binary format and returns the number of files inside, and another POST endpoint `/20/archive_files_size` that does the same thing but instead returns the sum of all file sizes.

### 🔔 Tips

- [tar](https://crates.io/crates/tar)

### 💠 Example

Download the test file [northpole20231220.tar](../validator/assets/northpole20231220.tar) and use it like this:

```bash
curl -X POST http://localhost:8000/20/archive_files \
  -H 'Content-Type: application/x-tar' \
  --data-binary '@northpole20231220.tar'

6
```

```bash
curl -X POST http://localhost:8000/20/archive_files_size \
  -H 'Content-Type: application/x-tar' \
  --data-binary '@northpole20231220.tar'

1196282
```

---

## 🎁 Task 2: Git Santa his cookie back (350 bonus points)

Santa lost his cookie recently, and can't find it anymore.
Good thing that everything in the north pole is logged in the git logs!
By using them, we can figure out the last one that saw it.

Add the endpoint POST `/20/cookie`.
It will receive a tar archive just like before, but this time it contains a `.git` directory with a repository structure inside.
Extract the archive to somewhere on the file system (for example in a temporary directory with the crate [tempfile](https://crates.io/crates/tempfile)) and find the answer to the following instruction that Santa wrote down:

*Find the name of the commit author and the commit hash of the most recent commit on the branch `christmas` that has a tree that contains a file called `santa.txt` (in any directory) with the string `COOKIE` anywhere inside of it.*

- There are no merge commits in the repo (all commits have one parent, except the root commit).

### 💠 Example

Test file: [cookiejar.tar](../validator/assets/cookiejar.tar)

```bash
curl -X POST http://localhost:8000/20/cookie \
  -H 'Content-Type: application/x-tar' \
  --data-binary '@cookiejar.tar'

Grinch 71dfab551a1958b35b7436c54b7455dcec99a12c
```

---

Authors: [jonaro00](https://github.com/jonaro00), [orhun](https://github.com/orhun)


================================================
FILE: cch23/challenges/21.md
================================================
# 🎄 Day 21: Around the Globe

*Once upon a frosty night in Christmas' season, ol' Santa was tidying up his archives. With his rosy cheeks and a finer air of mystery, he stumbled upon a pile of old, dusty tape drives. Intrigued, he gave a mighty tug and dust flew in the air, making him sneeze in the most jolly way possible.*

*As he dusted them off, memories flooded back. Such mirth and jingle echoed in his mind. They were his old present delivery logs and routes, the ones he hadn't seen in years!*

## ⭐ Task 1: Flat Squares on a Round Sphere?

Santa found a bunch of old tape drives in the archives.
Reading their contents revealed a bunch of coordinates in a strange format encoded with ones and zeroes.
He needs some help with parsing them.

Make a GET endpoint `/21/coords/<binary>` that takes a `u64` in binary representation representing an S2 cell ID.
Return the cell's center coordinates in DMS format rounded to 3 decimals (see format below).

### 🔔 Tips

- [S2 Cells](http://s2geometry.io/devguide/s2cell_hierarchy)
- [Decimal degrees](https://en.wikipedia.org/wiki/Decimal_degrees)

### 💠 Examples

```bash
curl http://localhost:8000/21/coords/0100111110010011000110011001010101011111000010100011110001011011

83°39'54.324''N 30°37'40.584''W
```

```bash
curl http://localhost:8000/21/coords/0010000111110000011111100000111010111100000100111101111011000101

18°54'55.944''S 47°31'17.976''E
```

## 🎁 Task 2: Turbo-fast Country Lookup (300 bonus points)

When Santa rides his sleigh across the world, he crosses so many country borders that he sometimes forgets which country he is in.
He needs a handy little API for quickly checking where he has ended up.

Make a GET endpoint `/21/country/<binary>` with the same type of input as in Task 1, that returns the english name of the country that the corresponding coordinates are in.

The input is guaranteed to represent coordinates that are within one country's borders.

Hint for an API that *can* be used to solve this task: *"In a tunnel? Closed. On a street? Open. In a tunnel? Slow. Passing over? Turbo."*

### 💠 Example

```bash
curl http://localhost:8000/21/country/0010000111110000011111100000111010111100000100111101111011000101

Madagascar
```

---

Author: [jonaro00](https://github.com/jonaro00)


================================================
FILE: cch23/challenges/22.md
================================================
# 🎄 Day 22: Dawn of the day before the day before the final day

*When Christmas Eve rolls around, it's game time. Santa, decked out in his jolly red suit, strides over to his fully-stacked sleigh. His eyes twinkle as he checks his list one last time on his high-tech sleigh dashboard. The backend has been working like a charm after the recent upgrades.*

*With a crack of his whip and a hearty "Ho ho ho," off they go into the snowy night. The reindeers take off like an orange space rocket, disappearing into the starry sky, on a journey to deliver joy to the world!*

## ⭐ Task 1: Leave no gift behind!

During a last minute database migration in the gift order database, Santa noticed that a small de-sync happened.
One gift order slipped through the cracks and only ended up in one of the database replicas.
Since it's already Dec 22nd, Santa tells you we need to recover the lost record immediately.
No child must be left without a gift this Christmas!

When Santa started extracting all gift order IDs from the database replicas, something got jumbled up and caused them to print in a random order.
Great... now we have two long lists of random numbers with just one number differing between them. Santa knows you are good at coding, so he concatenates the two files, scrambles the order again and lets you find the integer without a pair.

Make a POST endpoint `/22/integers` that takes in a text body with one positive `u64` integer on each line.
All integers appear twice, except for one. Find it and respond with a string consisting of that number of Present emojis (🎁).

*Food for thought: How memory efficient can you make your solution? Is it possible to make the integer filtering non-allocating?*

### 💠 Example

```bash
curl -X POST http://localhost:8000/22/integers \
  -H 'Content-Type: text/plain' \
  -d '888
77
888
22
77
'

🎁🎁🎁🎁🎁🎁🎁🎁🎁🎁🎁🎁🎁🎁🎁🎁🎁🎁🎁🎁🎁🎁
```

## 🎁 Task 2: The Shuttle Rocket (600 bonus points)

When Santa speeds across Earth to deliver presents, he looks up to the skies and sees the Shuttle Rocket taking off to the stars.
The crew on the rocket, in their quest to visit the stars at the edge of the CCH23 galaxy, has discovered that some magical portals have opened near every star.
The portals allow instant bidirectional travel between stars.
This saves the crew a lot of flight time to the outer edge, but now they need to figure out which portals to take in order to get to the destination.

The input is sent as text in a POST request to `/22/rocket` in this format:

- The first line has a number *N* (`2 <= N <= 100`), the number of stars in the galaxy.
- On the following *N* lines are the 3D coordinates of each star in the galaxy as three `i32`s.
- Then follows a line with the number *K* (`1 <= K <= 100`), the number of portals in the galaxy.
- On the following *K* lines are the stars that each portal connects as two star indices.

The crew wants to travel from star *0* to star *N-1* on the path that goes through the least amount of portals, since going through portals make them feel dizzy.

After the path with the least portals has been found, the crew wants to know:

- How many portals did they have to go through?
- How long would the path they took have been if no portals existed? (as an `f32` rounded to 3 decimals)

Remember to not get stuck in an infinite portal loop!

### 💠 Example

```bash
curl -X POST http://localhost:8000/22/rocket \
  -H 'Content-Type: text/plain' \
  -d '5
0 1 0
-2 2 3
3 -3 -5
1 1 5
4 3 5
4
0 1
2 4
3 4
1 2
'

3 26.123
```

Explanation:

There are 5 stars and 4 portals.
We can get from star 0 to star 4 by going through these portals:

- portal 0 from star 0 to star 1
- portal 3 from star 1 to star 2
- portal 1 from star 2 to star 4

The path is 0 -> 1 -> 2 -> 4. 3 portals were used.
The length of this path without taking any portals would have been `distance(star 0, star 1) + distance(star 1, star 2) + distance(star 2, star 4)` where `distance()` is the distance between two stars.

## 🎁 Bonus challenge

*The mischievous elves have been hard at work hiding words! Santa has noticed that 4 words from the manuscript for his grand Christmas Speech have been erased. The speech will be held on Christmas Eve (before the big trip) in front of everyone at the North Pole, so it would be a great embarrassment to not have the words right.*

The **4 secret words** have been hidden in various places across the CCH23 realm.
Search for them **everywhere** in the published CCH23 pages and resources.

- The answers are single english words.
- The elves are no amateurs - some words are hidden far outside of direct sight!

- Word 1
  - Hint 1: Santa's night vision goggles received a software update
  - Hint 2: The update is called "V11.0.0.PX module 8: Enhanced bull vision"
  - Hint 3: Red, module 8
- Word 2
  - Hint 1: Santa dropped a bag of toys on the floor
  - Hint 2: They landed in an interesting way
  - Hint 3: They landed in a line in a specific order
- Word 3
  - Hint 1: Elf Twitter is under a spam attack
- Word 4
  - Hint 1: The elves have been busy rigging a lottery
  - Hint 2: They left some weird traces

---

Author: [jonaro00](https://github.com/jonaro00)


================================================
FILE: cch23/challenges/4.md
================================================
# 🎄 Day 4: What do you call a serialized reindeer? Serdeer!

*Under the soft glow of the Northern Lights, Santa's reindeer are training for the big night. But, oh deer! The reindeer's stats have been serialized into an unknown format after a playful elf accidentally spilled hot cocoa on the central computer. The data needs to be deserialized so the reindeer team can be assembled based on their combined strength.*

## ⭐ Task 1: Reindeer cheer

The task is to create a POST endpoint `/4/strength` that calculates the combined strength of a group of reindeer, so that Santa knows if they can pull his sled through the skies.

The input to the endpoint is a JSON array containing information about each reindeer. Each reindeer is represented as an object with two attributes: `"name"` (string) and `"strength"` (integer). Collect the strength of each reindeer and respond with the sum.

### 🔔 Tips

- [serde](https://docs.rs/serde/latest/serde/)
- [serde_json](https://docs.rs/serde_json/latest/serde_json/)
- [JSON in Axum](https://docs.rs/axum/latest/axum/struct.Json.html)
- [JSON in Actix Web](https://actix.rs/docs/request)
- [JSON in Rocket](https://rocket.rs/v0.5/guide/requests/#json)

### 💠 Example

```bash
curl -X POST http://localhost:8000/4/strength \
  -H 'Content-Type: application/json' \
  -d '[
    { "name": "Dasher", "strength": 5 },
    { "name": "Dancer", "strength": 6 },
    { "name": "Prancer", "strength": 4 },
    { "name": "Vixen", "strength": 7 }
  ]'

22
```

---

## 🎁 Task 2: Cursed candy eating contest (150 bonus points)

This time, there is some more data for each reindeer (see example).
The endpoint is called `/4/contest`, because the reindeer are now  going to compare the attributes of the reindeer and present a summary of the winners.

There is at least one reindeer participating in the contest, and there is never a tie for first place.

For some reason, one of the field names in the input seems to still be a bit corrupted from the incident. Guess we just have to deal with it anyways.

The output should be a JSON object containing a summary of the winners (see example).

### 💠 Example Input

```bash
curl -X POST http://localhost:8000/4/contest \
  -H 'Content-Type: application/json' \
  -d '[
    {
      "name": "Dasher",
      "strength": 5,
      "speed": 50.4,
      "height": 80,
      "antler_width": 36,
      "snow_magic_power": 9001,
      "favorite_food": "hay",
      "cAnD13s_3ATeN-yesT3rdAy": 2
    },
    {
      "name": "Dancer",
      "strength": 6,
      "speed": 48.2,
      "height": 65,
      "antler_width": 37,
      "snow_magic_power": 4004,
      "favorite_food": "grass",
      "cAnD13s_3ATeN-yesT3rdAy": 5
    }
  ]'
```

### 💠 Example Output

*Note: JSON output examples are sometimes formatted. Output from your endpoint does not need to be formatted. The output is parsed and checked as a value.*

```json
{
  "fastest": "Speeding past the finish line with a strength of 5 is Dasher",
  "tallest": "Dasher is standing tall with his 36 cm wide antlers",
  "magician": "Dasher could blast you away with a snow magic power of 9001",
  "consumer": "Dancer ate lots of candies, but also some grass"
}
```

---

## 🔔 Bonus Content: Rust Crossword

To keep the Christmas spirit alive, we have created a [Rust-themed crossword](https://crosswordlabs.com/view/shuttle-rust-crossword) for you to enjoy.

---

Authors: [jonaro00](https://github.com/jonaro00), [orhun](https://github.com/orhun)


================================================
FILE: cch23/challenges/5.md
================================================
# 🎄 Day 5: Why did Santa's URL query go haywire on Christmas? Too many "present" parameters!

*In the technologically advanced North Pole, Santa decided to streamline his gift-tracking system using URL query parameters, entrusting the elves with entering present requests. However, the mischievous Grinch added duplicate parameters like "present=puzzle" and "present=unicorn" as a prank. On Christmas Eve, as Santa set out to deliver gifts, the excess parameters caused a glitch: the list of names entered an infinite loop.*

## ⭐ Task 1: Slicing the Loop

Santa has some lists of names that are becoming too long to deal with.
Help him by adding URL query parameters for paginating the list.

The task is to create a POST endpoint `/5` that takes a JSON list of names, and query parameters `offset` and `limit` as numbers.
Then, return the sub-slice of the list between index `offset` and `offset + limit`.

### 🔔 Tips

- [Query parameters in Axum](https://docs.rs/axum/latest/axum/extract/struct.Query.html)
- [Query strings in Actix Web](https://actix.rs/docs/extractors/)
- [Query strings in Rocket](https://rocket.rs/v0.5/guide/requests/#query-strings)

### 💠 Example

```bash
curl -X POST "http://localhost:8000/5?offset=3&limit=5" \
  -H 'Content-Type: application/json' \
  -d '[
    "Ava", "Caleb", "Mia", "Owen", "Lily", "Ethan", "Zoe",
    "Nolan", "Harper", "Lucas", "Stella", "Mason", "Olivia"
  ]'

["Owen", "Lily", "Ethan", "Zoe", "Nolan"]
```

---

## 🎁 Task 2: Time to Page Some Names (150 bonus points)

This time, Santa also needs to be able to get all pages at once.

Modify the same endpoint, so that it can also handle a `split` parameter.
All parameters should now be optional.
If not given, `offset` defaults to 0, and `limit` defaults to including all remaining items in the list.
If `split` is not given, no splitting will happen, but if given, the output list should be split into sub-lists with length according the the value.

### 💠 Example

```bash
curl -X POST http://localhost:8000/5?split=4 \
  -H 'Content-Type: application/json' \
  -d '[
    "Ava", "Caleb", "Mia", "Owen", "Lily", "Ethan", "Zoe",
    "Nolan", "Harper", "Lucas", "Stella", "Mason", "Olivia"
  ]'

[
  ["Ava", "Caleb", "Mia", "Owen"],
  ["Lily", "Ethan", "Zoe", "Nolan"],
  ["Harper", "Lucas", "Stella", "Mason"],
  ["Olivia"]
]
```

```bash
curl -X POST "http://localhost:8000/5?offset=5&split=2" \
  -H 'Content-Type: application/json' \
  -d '[
    "Ava", "Caleb", "Mia", "Owen", "Lily", "Ethan", "Zoe",
    "Nolan", "Harper", "Lucas", "Stella", "Mason", "Olivia"
  ]'

[
  ["Ethan", "Zoe"],
  ["Nolan", "Harper"],
  ["Lucas", "Stella"],
  ["Mason", "Olivia"]
]
```

---

Authors: [joshua-mo-143](https://github.com/joshua-mo-143), [jonaro00](https://github.com/jonaro00)


================================================
FILE: cch23/challenges/6.md
================================================
# 🎄 Day 6: Elf on a shelf

*It's that time of year when the elves hide on shelves to watch over the children of the world, reporting back to Santa on who's been naughty or nice. However, this year's reports have been mixed up with the rest of the letters to Santa, and the word "elf" is hidden throughout a mountain of text.*

## ⭐ Task 1: Never count on an elf

Elves are notorious for their hide-and-seek skills,
and now they've hidden themselves in strings of text!

Create an endpoint `/6` that takes a POST request with a raw string as input and count how many times the substring `"elf"` appears.

The output should be a JSON object containing the count of the string `"elf"`.

### 🔔 Tips

- [Rust Primitive Type str](https://doc.rust-lang.org/std/primitive.str.html)
- [Rust String struct](https://doc.rust-lang.org/std/string/struct.String.html)

### 💠 Examples

```bash
curl -X POST http://localhost:8000/6 \
  -H 'Content-Type: text/plain' \
  -d 'The mischievous elf peeked out from behind the toy workshop,
      and another elf joined in the festive dance.
      Look, there is also an elf on that shelf!'

{"elf":4}
```

---

## 🎁 Task 2: Shelf under an elf? (200 bonus points)

Add two fields to the response that counts:

- The number of occurrences of the string `"elf on a shelf"` in a field with the same name.
- The number of shelves that don't have an elf on it. That is, the number of strings `"shelf"` that are not preceded by the string `"elf on a "`. Put this count in the field `"shelf with no elf on it"`.

### 💠 Example

```bash
curl -X POST http://localhost:8000/6 \
  -H 'Content-Type: text/plain' \
  -d 'there is an elf on a shelf on an elf.
      there is also another shelf in Belfast.'

{"elf":5,"elf on a shelf":1,"shelf with no elf on it":1}
```

---

Authors: [orhun](https://github.com/orhun), [jonaro00](https://github.com/jonaro00)


================================================
FILE: cch23/challenges/7.md
================================================
# 🎄 Day 7: GET Santa some cookies

*At Santa's base near the North Pole (64 km away to be precise), the scent of freshly baked cookies fills the air, a sign that Christmas is near. Santa, however, has forgotten the encoding method that was used to hide his favorite cookie recipe in web browsers around the world. He needs this super-secret recipe (based on his grandfather's recipe made in 1964!) to fuel his late-night toy-making sessions.*

## ⭐ Task 1: Based encoding, 64th edition

Santa's secret cookie recipe is hidden in an encoded message,
and he's looking to you for help. He's sending a GET request to your
server with a `Cookie` header.

What you need to do is parse the Cookie header, decode the value in the *recipe* field, and return it.

Make an endpoint `/7/decode` that extracts the `Cookie` HTTP header.
The header in the request will look something like this:

```text
Cookie: recipe=eyJmbG91ciI6MTAwLCJjaG9jb2xhdGUgY2hpcHMiOjIwfQ==
```

After decoding the recipe value to bytes, convert it to a string and return it as the response to the GET request.

### 🔔 Tips

*"Which encoding?"* you might ask. Look around this page and the links below to get some hints!

- [Binary-to-text encoding standards](https://en.wikipedia.org/wiki/Binary-to-text_encoding#Encoding_standards)
- [Crates.io: Encoding](https://crates.io/categories/encoding?sort=downloads)
- [MDN Web docs: Cookie](https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Cookie)

### 💠 Example

```bash
curl http://localhost:8000/7/decode \
  -H 'Cookie: recipe=eyJmbG91ciI6MTAwLCJjaG9jb2xhdGUgY2hpcHMiOjIwfQ=='

{"flour":100,"chocolate chips":20}
```

---

## 🎁 Task 2: The secret cookie recipe (120 bonus points)

Now that the recipe is decoded, Santa can get back to baking cookies! Santa is not sure, however, if he has enough of each ingredient to bake a cookie for every elf.

The same type of request as in Task 1 will be sent to a new endpoint, `/7/bake`, but this time Santa needs your help to calculate the amount of cookies he can bake with the ingredients he has in the pantry.

After decoding, parse the bytes as a JSON object (shape and keys can be seen in the example below) and use that to calculate how many cookies can be baked with the provided recipe and ingredients. Additionally, return the amount of ingredients that would remain in the pantry after the cookies have been baked.

### 💠 Example Input

```bash
curl http://localhost:8000/7/bake \
  -H 'Cookie: recipe=eyJyZWNpcGUiOnsiZmxvdXIiOjk1LCJzdWdhciI6NTAsImJ1dHRlciI6MzAsImJha2luZyBwb3dkZXIiOjEwLCJjaG9jb2xhdGUgY2hpcHMiOjUwfSwicGFudHJ5Ijp7ImZsb3VyIjozODUsInN1Z2FyIjo1MDcsImJ1dHRlciI6MjEyMiwiYmFraW5nIHBvd2RlciI6ODY1LCJjaG9jb2xhdGUgY2hpcHMiOjQ1N319'
```

After decoding, the recipe above will look like this JSON object:

```text
{
  "recipe": {
    "flour": 95,
    "sugar": 50,
    "butter": 30,
    "baking powder": 10,
    "chocolate chips": 50
  },
  "pantry": {
    "flour": 385,
    "sugar": 507,
    "butter": 2122,
    "baking powder": 865,
    "chocolate chips": 457
  }
}
```

### 💠 Example Output

```text
{
  "cookies": 4,
  "pantry": {
    "flour": 5,
    "sugar": 307,
    "butter": 2002,
    "baking powder": 825,
    "chocolate chips": 257
  }
}
```

Explanation: The recipe represents the required ingredients to make one cookie. After baking 4 cookies, we have 5 units of flour left and can't bake any more.

---

## 🎁 Task 3: Questionable cookie recipes (100 bonus points)

Some mischievous elves have now found your endpoint, and are trying their "innovative" cookie recipes on it, without even knowing what ingredients are available in the pantry!

Update the endpoint from Task 2 so that any set of ingredients can be present in the recipe and the pantry, respectively.

The number of cookies in the answer will always be finite.

### 💠 Example

```text
curl http://localhost:8000/7/bake \
  -H 'Cookie: recipe=eyJyZWNpcGUiOnsic2xpbWUiOjl9LCJwYW50cnkiOnsiY29iYmxlc3RvbmUiOjY0LCJzdGljayI6IDR9fQ=='

{
  "cookies": 0,
  "pantry": {
    "cobblestone": 64,
    "stick": 4
  }
}
```

---

Authors: [jonaro00](https://github.com/jonaro00), [orhun](https://github.com/orhun)


================================================
FILE: cch23/challenges/8.md
================================================
# 🎄 Day 8: PokéPhysics

*In the heart of the North Pole, Santa's workshop buzzes with a new type of magic. A portal has opened, and Pokémon from another world have tumbled into the snow-dusted realm of elves and reindeer. Santa, ever the innovator, sees an opportunity: why not enlist these charming creatures in his annual gift-giving campaign?*

*But before the sleigh bells ring and the Pokémon can join the flight, Santa needs to understand their unique properties and figure out how many can fit into his sleigh, given their weight.*

## ⭐ Task 1: IT'S PIKACHU!

Your quest is to add a GET endpoint `/8/weight/<pokedex_number>` that, given a pokédex number, responds with the corresponding Pokémon's weight in kilograms as a number in plain text.

### 🔔 Tips

- [PokéAPI](https://pokeapi.co/)
- [reqwest](https://docs.rs/reqwest/latest/reqwest/)

### 💠 Example

```bash
curl http://localhost:8000/8/weight/25

6
```

---

## 🎁 Task 2: That's gonna leave a dent (160 bonus points)

Once the Pokémon's weight is retrieved, Santa needs you to calculate the momentum it would have at the time of impact with the floor if dropped from a 10-meter high chimney *(so that he knows if he needs to climb down or if he can just drop it)*.

Keep in mind that the gravity of Earth that Santa has in his physics book was measured close to the North Pole. This could explain why his calculations are a bit off sometimes, but he still wants you to use it.

The momentum, measured in Newton-seconds, signifies the force the Pokémon would exert upon meeting the floor beneath the 10-meter high chimney.

The GET endpoint `/8/drop/<pokedex_number>` shall respond with a plain text floating point number.

*Use gravitational acceleration `g = 9.825 m/s²`. Ignore air resistance.*

### 💠 Example

```text
curl http://localhost:8000/8/drop/25

84.10707461325713
```

*Validation has a fault tolerance of 0.001*

---

Authors: [orhun](https://github.com/orhun), [jonaro00](https://github.com/jonaro00)


================================================
FILE: cch23/validator/Cargo.toml
================================================
[package]
name = "cch23-validator"
description = "Validate solutions to challenges from Shuttle's Christmas Code Hunt 2023"
homepage = "https://www.shuttle.rs/cch"
repository = "https://github.com/shuttle-hq/shuttlings"
authors = ["Santa"]
version = "22.0.5"
edition = "2021"
license = "MIT"
publish = true

[dependencies]
base64 = "0.22"
chrono = { version = "0.4", features = ["clock", "serde"] }
clap = { version = "4", features = ["derive", "cargo"] }
futures-util = "0.3"
reqwest = { version = "0.12", default-features = false, features = ["rustls-tls", "json", "multipart", "stream"] }
serde = { version = "1", features = ["derive"] }
serde_json = "1"
shuttlings = "0.1.0"
tokio = { version = "1", features = ["full"] }
tokio-tungstenite = { version = "0.24", features = ["rustls-tls-native-roots"] }
tracing = "0.1.40"
uuid = "1.5"


================================================
FILE: cch23/validator/README.md
================================================
# Shuttle's Christmas Code Hunt 2023 - Validator

Use this binary to run the official tests against your solution to challenges from [Shuttle's Christmas Code Hunt 2023](https://www.shuttle.dev/cch).

## Installation / Upgrading

```sh
cargo install cch23-validator
```

## Usage

```text
Usage: cch23-validator [OPTIONS] <NUMBERS|--all>

Arguments:
  [NUMBERS]...  The challenge numbers to validate

Options:
      --all        Validate all challenges
  -u, --url <URL>  The base URL to test against [default: http://127.0.0.1:8000]
  -h, --help       Print help
  -V, --version    Print version
```

## Examples

```sh
cch23-validator -1
cch23-validator 6 7
cch23-validator --all
```


================================================
FILE: cch23/validator/assets/numbers.txt
================================================
11278171056114273519
3751442393314989019
18347682815989091752
16318073259550480003
11276777143002031408
3882912681273177065
6407502318670531206
14679298581959679857
16903611537127535966
9214154110562003567
18186514007264586093
9615526638090035209
8176172219945405989
6470947202872026205
15874481059901440675
14127624162970323371
3159485207117124136
7162264774097111556
13174839173917326199
10972994107288435596
2792991963846843708
6483606630233278031
8505100407492325365
1520896786972515541
881725608211970747
5790337390461613720
7701802565278373506
1997081620107619885
5488682244950930151
15284605999820833956
17123163966830615799
17498369517464686513
6990713930724471719
4704573208608869729
1305182981955380555
6399728084992713417
8682788813994392285
4207040649719514736
9395626239211612653
10995383067948893247
7392519818250487158
9763625904863613823
15995933892742883208
16840104810367977109
14984307382067943985
15256331074011979111
8861581059561092187
6233556276658524476
17659516433336498919
7902155618953046362
9331506743283462146
823415564412786543
5079730260571146267
17954479059202753810
4191291082655515328
11913675369183495024
4909693062022507927
4630876459419428174
11021256825166570882
16562493312131086680
1497898312002768161
17703685559758032725
8742020013877659941
10291635553276897686
6401526899110416173
16043244962178410443
2896707729570284962
13852688362220147904
2957420751707797427
3417056834420894359
6897774613792429343
6889341150547674183
13922482948373759016
8759025454769053589
7122569313360318064
14149066662869843475
2962439647579749906
6841017561439894278
5034098092390393466
1193701105112228558
10963694387488825063
10489722066268082137
5618579261616538298
95413231391348313
7914161817657342810
9017030269661971479
13771052281209476662
7539376834766117274
5343274308479372858
1212279659217817815
2423721150054573160
11469115951191405540
4123320312972914377
681971196677626449
11971037917976172894
10637029032014105227
11941160057560583596
13780244628259586365
10533531189168132936
3629390900157270981
17087688215828147329
13578073247413785580
1490005507474061829
3883371645131873473
12263391745146778040
7801132818819914269
4948457359247665181
2078542560824193202
3394872861804295911
16689861136420156528
7110462516856664949
4458796764810705524
16237285944896317390
10521491349218267676
12724323537355529778
14039794476637099496
13705675493163153202
16932416317852511678
8873432876878377085
8900717522923401236
11294199949679367448
15086138196866070287
18022682054880634797
10492174919841101289
3975962974182961935
17340445566150283344
11385368897781350312
18205829946649243338
4605182033486152819
14856167620669339410
18187284833661701506
7143966098553468117
4951749968341303051
15958802952230303427
17550024067652137260
16415472041294125775
9268320731006177555
15270673067450636960
5444469974529026808
12627006486082370810
15663746086902308913
10105190730381910870
2191671188227177797
3225214667213521091
2617885913636748228
9140674932897736208
12221533944344764618
1747617644991251404
10391168944689122352
7809005271932882889
13315267215328755068
13594491820901212239
13688461552626486477
6161279484237089403
14184536956275709278
7353128450034344150
17898632979463811048
6479741063082408437
13356117318120935013
5961665972682879894
4001034987493628882
6397600805752232592
2333615476034270743
162215541305641057
13545058223961409091
8227048128891273652
15092656122023683632
17223686676761467488
5119989549544378979
12905703268129671267
5993856626611489899
15745132728104916409
14400876787716890772
7496754786008718680
1776562263643713856
4759570989273927148
15096436164577985503
5887687619912298522
13914387122674072685
1936707732265792360
1923002259898913468
7319025258497963116
4219336280641557403
17519841451216391026
10639919262766709592
15793467648461370073
10158562383050462031
8066258050698580069
8644982129759239367
299561846510567674
2089839819355289633
8209061483315392684
7176860445847534722
12757179870644180856
12237819110608923915
14408598604393266294
13249138192794988535
15618650892753865917
15109575164197650444
1658373394370047946
8485017783746442909
16782167037170269555
15896610935349016483
15647060499961671775
12262663265992276840
4122248459762158217
2958599192007136953
14208563630454323949
3770417294339158535
3581219915900828159
6624248654771060784
17930201880379879071
772240435293427820
13922190456276139695
1661007502798918651
11573672580068740264
15875891504300200463
4574517383568586465
11445053339564295504
5965770171517787918
10734590853506398460
1247653373229207840
6954435759843609754
7159358110535689756
276814041883908860
15306690074138495155
14005127796340284889
7516287003735792081
7203560265286761543
16357978367359789271
1861570217754133639
9720408652117864580
760828118539923654
6651930238017542197
521880954100851319
4097125177510788209
330272594908966086
1843908984209648059
912444500454052640
9284981118775085538
914347863417776026
3034027226363971643
13539180034488842113
17864482754113637837
2089839819355289633
5480288541366243035
5811597766581449130
6890631659552898694
4039692914396988402
17865300438951513358
7670300649053105634
14610894555359348434
6270594933163270115
11154138563397873110
9279711253745708618
8985147971826821256
10241470445878520595
8389840367103709574
3839776210273286164
3477001680218503192
13144100591692962440
5700330172150548363
13187843925148795305
18250997717879562980
12722726049699965166
3776985349296233258
15789507646064215206
6359352834054497216
6959625016381647138
16808150075518290981
18393786735323900933
7696264919289618419
11172579685586783039
572923994136796612
1461468821250923955
15039705479864020326
2762863117089314183
9262993542088977008
9977054735783399023
15694356453558378743
4278390492009283969
3151315081333722292
18062444972703115013
16288636616561036370
14448477209480068204
16566178804004546156
6329003081577202773
14200419799605227426
5584978628899906301
9021777196836583183
583440345030401612
12074153285940316516
6317637559568653005
12657007543615882237
2055639459498619271
3100013713648861936
13576183877131743047
12114979319972035785
11263555027838906406
3718060012356837655
994198448043828925
15273308928307019961
6103331539890858270
9021564549964937370
3517064603117319739
2583204993037233532
18253331924077000431
13661071463567512702
15364525219316410447
13832110904471386281
9307847380749891957
7226061763685135643
11548431911649878238
9025565024578725027
10259956859046183648
17686846064231799831
17654866536305984476
5587592933218900228
16562136758104465189
6979164518082235634
15737210243667059626
1145053081623077428
4960766825915777225
17533332552267492059
3087091280502715308
7428310909325635833
6956870366258906639
14787043904934800948
13260971022230431925
10815452863258259342
16677883258051580531
14206499685988491056
1724017784125406146
649090718333193560
14064013388990204371
904737834165828696
4790654346342576537
7283102653666706277
13789184402320839756
3285717728537625271
2935189382528221268
9455763178180447579
9912350475397535267
15884456604966635979
4283203119319775267
3390957352027422363
14936301577017080597
1031230234184664678
6378227765251001337
15103392826420048367
17868657142183991703
16855631037003966296
303002278070257072
16519749389945642630
4660855856512690282
14414868528997896919
10625116666215912006
13439127268097928266
11534107170231651789
13585097909484760993
15520850526371615874
4193953745505248000
838670693346738263
3238151140826945864
2580084793903126873
2697332232564800576
2547180481474461073
2807812234733879252
17801401792849912085
12271038148699722202
8797122824279663657
4632938134258709286
6843968473617995
1730344102097589389
11303167101104896804
13891384157546245554
18073592186035102870
10710777996449962154
5999176365781644272
10952254095573086731
1709401906294632660
12945191103519309853
6427406708158362266
16139422430982064570
11166559373958677042
15020636581385363420
929718047577267059
13948831231765767447
11789344193592869712
10840826182988365096
12920508175872523551
14725803548500388596
15492967761366086006
8815483522355778886
12885048857449888928
4330751346318391899
5229830364073525891
14227003970446648763
5176159371824023301
635210990323719356
8811163479650755164
1728219986178414653
14415277956997930958
6134889782532357464
14190762167118985847
9585274734213971900
4710992773296222824
10737360427995158327
14613897644568366219
11349745958651530997
1300196501908582817
699258519105271124
11421136323545171105
10820575656908689510
13165060186929980104
12006449451084980231
4746899760222132459
11561217540858088711
7192573926950398717
10513117679053179942
8864654607073192937
11759745253208062992
8677524884845416370
7776111079177573056
8642887215113259819
9986868514285337078
3454576085629482056
12199941114162471924
15825793662688709004
4367877646216816114
6232080323900003754
3002001886978332333
7506202300330124786
18107653834195538030
11886036443304612834
1251908231051874849
7283102653666706277
17841924566544064153
4827357209171263481
14653139845988526977
517197483647225279
18277479294890738848
4996310566014731451
3229578769404233457
10297522553509695152
12977886042722479881
4419971197080674723
2589331741677700670
15187433010850447977
2542120513109645803
492696584014496896
11458035012393992963
17397172579809132471
3215960192784356718
15609698410444305853
11623785214688130
2219787796877033502
4047930318561921837
2554416983359722193
1294255699754400923
2500982044877191975
8515582270400862517
11938949529061227436
16836957333058393013
18010391343853483111
4914657848748852957
7610707685239047469
7888565645628155955
5536572326046534812
3286413158491138707
4386359583518947495
2562047194752652805
16084632435662893599
12660687639316428067
16345023128634041992
1227045305207811917
10689851714763920730
15497392986878172107
7719797426150545335
17242987744208488155
7482591977385050153
2657343103907234697
999694281642359548
14581736440664115674
9570878600407924330
15602552518891249417
16106616251153267372
17345830192101384528
5839733465577238390
1555954914622828982
11551910476750762632
10970915017206913252
14843783101340448795
11701033290222296734
7703679526146141223
6353053920054809116
6775367741225632462
12242665744720741360
7245597895960439390
2025036480346181736
15460611449321921853
16328309432362318504
7415577208015742502
8983449127494935759
3467387625207593039
3522101495558523178
162215541305641057
10263415208515960965
16255462347806079738
11527692483263157359
10759908214812281898
10327835851051028320
319146597929849925
1248354092844841833
13637760542483778621
9700115938205077256
12321599687151768135
10928857691045206286
14621340669769748276
18069174692654806682
11979437837046106983
9746034687256946599
10437617346914976332
17784725371680753075
11333190758006323533
2119263508785614828
12800066795611064307
17740058157839988844
9611205661388584909
17948484948391727708
3902148576847872159
9410523710342076091
14829671482196012880
14276726417029738312
13057379870569168632
7611124095577493852
10673693559053300566
8008379871380158994
201900647467760184
14924170036066137175
17264547021661416436
6881166073888290706
2159958472120605811
15202218348780815539
14911155983283016493
2737310413673734095
17136642208823758299
18040323983876388027
2607530669254888575
29846174210578563
3834337311011699565
2311169221315687022
11146055437158941697
3623651457841806502
3777040938095390732
9390217602591528886
16882114890948454063
16234924760361303134
11283400160856416728
10416141460677819459
18089343284380772009
5197474343311662712
11066683420633952511
3971520667169558534
6039950632951157952
12568082877174731206
9273746577480397890
1839172145636136210
2290423613487970140
17162382036940053649
5869377827469867607
11514801442648597842
9859394103020129337
12823372931644506965
9331021337727644560
7395893089736248897
5565260200912508096
4125482166434248872
4439391539546524596
10023145889107537938
3014132540738927105
9695793092686937199
3715633590520799487
15256331074011979111
9970428922921514349
7708015999108787783
7455978143929349715
16885391630392902912
15406074692571026126
10001308057586933589
5417262184293837233
2871801466588109391
1709426537052113212
9560017661866342355
10675696802074496976
5374011275233924539
11512794531243297075
13286426583297405729
14197260962786419507
2234441354983508876
17415882076306604415
10673693559053300566
14778331508638284751
10202143874764772751
4145465072229267582
10883476614037517647
5419511754667495451
8042049423437581436
13961006347614932365
7643784810354162396
15713568456719534280
8837976757550832228
7111180640487082025
5451355090686942417
9072509312707973146
6127160028243281900
5660263823040088244
15776896697695669348
142178144297815880
17975243221356615270
15187433010850447977
10498983213366328427
13547888396000660901
3403581621352410586
572561136045458605
107555067249634519
5194812685508444444
6617786327159950987
1288340154641124490
15686781282881019487
13622550225996624366
18237010196698423178
3308848975104226576
12052729189143195939
15366661690691414140
11345520738046873247
2501200304800168507
5666762048737617123
3081826479417258532
8327137636459911903
11506002556071870831
13390055752459006563
2754711293985799133
8960034619844886310
8028052587229879328
6895841149902732686
10942460962878845019
3469554805433994956
4489347248659953973
9096559152154933202
6414576814485873572
10909361261222188035
10410894244393648455
16416299932856122186
14481586030514895640
266370749732816257
3402288886302844099
9132622035038615219
18413938404097957486
4778406265868043880
18173529397337040201
12142334935692588674
10270752284359690775
10402155769984656404
2913904492564002291
921814946226230290
12966328372334541687
9093438165277988634
16944672502968187040
4826681246629239587
6493745714870440043
18230680630774867787
9899923394743179138
5980452431533076414
13442205780209344333
4828484671583780662
960892423900251268
13065600209115765068
10794646106825715479
7050950562017608211
9956833409119172110
8212790770114426300
4574517383568586465
15603271364652543904
4501282384701660912
10225804963819861035
9247393093472092889
12657631513796752556
15624286206466909213
11358556171139673782
16468489254539357644
17892033338613346354
12909869839441569974
8697513470973721386
7459190770099108991
11794130045415532309
17512558056373303924
16458703020283988049
7955584698161355674
7563406252612965189
3259411684258714003
15998809144831570776
11794130045415532309
4691533966623223350
15925523189764699004
4434067970225445256
14234178327260482810
9105999171221990459
10969102453928007890
16298626761706222319
17510815492800519819
16643601106254241773
2583204993037233532
832608308602339532
6378015591549911703
7178637927273167859
8093264909799424427
4949406541361370888
16278092541016474994
7406085459588881329
3411671842989745927
9006127792802955166
16161627811257097076
3600432482581432923
11350432358444908162
6885463396613865548
912983662196164034
16154649169084705960
10173644468931336832
4709666226075195170
12074109985653315279
14707306127916729046
13703105568403905570
10543963507961964296
9841113082419688829
10694052875111452653
8106840502779619902
16697301913592060426
9247379268519299310
16102918872562035977
12520096053415708705
10972994107288435596
1200827519022313598
8294394889954363933
5471791839450823710
5729979083687500644
1361952000944955902
1782797937321700986
11237552771651491082
3547390460980277926
2914720655152715469
2633288762409192863
10664876608758315103
10278518055398716084
5174228918914143705
4427743302177313628
16344700358319309611
13412650760353747166
2018157668787117882
6775587044992752778
7764152852215584507
16261111194186098037
8732997809584898797
9071405941023490277
9348521634538877696
2506974844848596964
4795776371251122866
11763379470736882128
12442509340579496437
5286713361636540849
6852346512869396809
1131877675207168375
15279657130598345381
4993883963395254208
7147143087510819449
16507436111319540680
14011001978430842119
4310839308791657552
8182479885433205946
18356346237449553432
5443192322657767612
9495260365858183339
18205829946649243338
1357885771595192605
16406374952294475744
18297515897727348493
5666696133068840761
1517298419798250310
5900592184648736695
17625587130180253314
11476212681280527854
5581095820580299123
17267492087429193336
16303220098268747793
11529426607764862709
1598448895427611708
10445773855405410519
3007761314210976572
8176172219945405989
17065444102048912913
14760686936703361569
8348770358268697894
10414188989306380753
2735109764353599551
6782225208728194602
10226437172389362202
15273607316104336557
8572445443415791682
13362190025254324716
12245109568288598282
11263348062016359407
7935796528269614297
13506546140222585691
12003680613373681929
9743764372091098674
3421420212964245673
12653134276957037012
6067666988648823149
9339931788502227843
182291667461137302
6898568018942336798
10951195238774466495
9928298800900906058
635210990323719356
13330442940669200262
5535011045276822559
12748802276743445982
8818881109018610195
14179982348033388464
5937220396445439887
7011579185273189499
1958376386903356434
16310229033767499758
2991239997182903585
4709906054320992502
8373797487172677027
11683440345011347673
5141606151392068813
16073294886823601223
8002497183738127036
9986868514285337078
11173033799466440050
3357254933008209056
13991000583922510615
10454638693425212416
1210889458853104443
16847086868074003590
17666149874669870365
18322394611983922550
14859988667995003008
7176106739067124644
15572568842446317879
15236113217263404680
16007222744596068574
3425942349794067789
13651585187584643886
18392190021574867232
10268925443886761492
15432544735555256872
5691988227476662041
14423824349302834036
15503602821751165242
7249601475112971241
5927719683331976395
13610447083680554767
7670421984914774491
14667599366443403498
17577690511529067791
15347976078888850733
16585096623815012822
5443983615453854153
10306803820756497294
3668952564648926019
12229349860419130584
8882179713914391815
10622404045510891866
11615146358750854259
3682583462353988646
5719270191274423237
17230447492916725246
10306803820756497294
12614431623072685772
7918212628599201736
12836939292822856347
9277620082839846803
16647435796743956582
13550148562265029106
5140293719693188936
11285633147187790272
2679807911083396327
15636749127653109355
8801642904302304440
7074863116239460120
17768966742972653329
13369751642652635602
6798279480903092396
12354918616403130843
7274831531279278149
12029313611388862964
7596640047143064929
3505415239186581592
8550595271373930629
1058714069052075903
1484104605587255024
14820018308717929725
10240874702978179234
14573410653385968758
18333577225516373767
14225721366777455650
15274553852720134908
13242109157344654805
5644137499384205230
9407880755168732358
10612996555018523585
17569555293609564414
18056992994778248255
8401130019067915153
4814403168589857203
10290162149688774956
6740730492331186143
1366641169432435725
4356505295058394268
17895857385085551079
108074834984636915
13280838641628408649
6857871416231327430
3451597686465626882
9411534442477850892
12214639979301734950
15487629072338719917
17868178858809704579
12258343822696221827
12421956845409738369
16607523899507782533
11821620625555541968
6482299896394625630
16172879748955132362
7276405684028961641
4193206194903022143
13723716962056357889
8723395899599072483
877674488534263773
7679839664027578910
17845975553251788777
16242520985340085024
16922926874295331228
2452999297715370369
3542602358419722101
1751522412228803989
5185905792335243196
6131510748576652475
5393335167522524275
5369869188317039818
11387005372495622343
11475717517947644506
10445773855405410519
3956615961198627894
7299401580075424868
15565174974229636824
17830502692574675616
13861327240259843319
2031726326826750010
9174758584601938325
11773076417957189559
2856692613996627531
1839139241041486425
9098811646221647043
4147027156481849780
14215035827137268333
9273383611215959648
14976972871771170484
9155752776529718368
5023563242453945354
10784973946085835287
8734717483788178420
17645224795015763041
18126039382698055839
16800163418977341213
10037317165083039348
6419113766473983703
441217033987222086
6233098432593858421
51097929371773067
7564537002885173543
16339117924960133367
5895656330623392805
6240557748465204865
3499991572875104230
15380790974400552373
8662052968596755741
7990211421109604107
13350815822591134970
6641753026481641300
13352129943664748750
1566273465307063646
13468863835005260207
3556874557414750363
13455261248571555664
8158149317509337255
302781934444005160
16520664653548093547
5504018863192625075
8133571520860480514
388043187116991840
3570586791703581576
14810267208405188803
15661336660437108280
17469414008998898104
1517489643287556345
8755222394700166626
10105190730381910870
5515797029321319171
18068670605668162482
1484549029410631098
8950046202132225703
11623899362510334511
11064823609717100611
11097845764605564153
13115118584827662300
7197466758495880812
6389061566542534016
1707285542355890107
12452098796274073136
12107520990147052890
3020057142875730131
4089791676022691396
60103094028234583
12179409957836917228
11472639639632150505
7143966098553468117
323577450553876253
13809751938147092427
3704703231487843012
8964886046236568209
18370541413248204894
4933932417684914548
1512962638870007633
8854063887338644979
12698920803961201177
6751110731392400966
17191737580195679954
1910287380050633986
15221128039558990711
1933144867089449798
3873897904725815759
13875655531137462600
13186167650714614436
13348820480142434181
9134703104016536857
2869665204318440887
9021564549964937370
8635504586127357633
709508449721551014
1443275774636892300
6572548114121337433
5090493491333729939
7147403927711684380
265031188052935464
1992612825881504232
4976429483291695578
13570469509066530630
8533316222034060106
6903430597893215789
6524479443594935068
8809125763670405798
10115109704165423762
2915095815996143605
17895786592119485756
10877767231471429562
9302398969628185631
13022514221049453859
1958165850903953873
8143605521897381323
12353560218200065692
3311506585352227509
9411894793255325745
27347143499350559
17128367426728683392
18045025520922068674
10329663906100247497
4122248459762158217
5855789831023178209
5316871757954836441
1250264076970036985
13781241225497486113
5168532814922324202
14034409742229283906
14482935195607601544
13911213737309984885
13529646603918343900
16255462347806079738
5016550450497750008
5880228023673931947
1724017784125406146
7382472514991907724
15573572361549290863
8869859706907521646
799325264913259398
17469414008998898104
844257175678683180
12011597232481368705
14928871000275535597
8914396725053956216
7437809122981519036
13898834112127610521
14803072729925716320
14999902106724197594
12923112291621016585
16340151605259272015
11600752800398540975
2082193937008688367
9973253470216010664
5226530405570000872
355656557234829386
7538589519254699883
3677673356845726690
7190207083390737591
4310839308791657552
14965339450195976418
13836391347649410211
8161319495806156410
17663495300458759643
3883371645131873473
379434941107873571
18397959558652477457
13562410175686020638
5844792504701056738
7814397728576265079
13545464385358785957
16838853958995227937
3364839479047976068
2607832993626558004
585768448370577482
3717218550291891076
304622507309520741
2654052698615623760
1052754703044431548
15133736423245558757
3562119753592365896
13399133950160942661
14588300429682406006
12082351045398733873
16721156326081793613
9694119672089113847
13309004209577980031
8749677887604026725
14576299879703257479
17886442533702307713
6236596459702416350
9500334384940346745
11910982864874280691
8189999621639413243
3638930871575090162
2437601194510772122
16918680098800645247
4258982456533819116
12331511114380684018
5698726162403178728
11644864708508590512
12159927038331361858
11680406053365966748
10073235541244582588
2112645945753985528
10824161831106996747
16083162754862717587
1291749864428926498
3371318370539489960
1374840882106243837
11545546604947264202
18418547564684797483
6328972314692457698
14670690596439832091
17294300865849159583
553470255793403280
8070876262113975473
11744206458878797518
16009160286980762186
11577221945963682075
5739127236364731276
3716816954413318576
18129673584999825485
8636496245543593147
379434941107873571
5185714514595148369
15093522620658220865
14594234285686136960
14639870226379152776
13522272283668835384
15259878356941973958
10768970218298922755
4907970019695749544
17174453121254120906
3548088551076108378
2784160414331899876
16246696712745224074
1245242497108006793
4904682536517629425
4450419140938725194
5363148833215162975
15819138558812136443
14810267208405188803
6191544803260203870
6950108192358588515
13507213265869006134
9232424802697013579
2159958472120605811
16174818136905273166
11294199949679367448
13587490523244867477
17137748493630504386
1443078560946738771
7780514681070981439
4766546816437660904
3661832218508975982
16571393886478076804
16537803078673380214
17722937129425228314
618546680790133196
3636724249504074665
738053537399329987
2517629320551317226
15780308101501094920
11066683420633952511
9942828828858405830
5952822886842739827
11781493257593596777
9721056744604483328
2011422995462318593
7386291115137004152
2545163178111522540
7809512832263517817
1551792649086678205
7762880703773131807
2892125069458890142
9059191981376568203
17786876470638506365
951707777457729665
14346440503140738051
10202752833523241255
3264911859863952807
15714139612734255787
13452099038736062025
17952489172638654753
10525059786321482165
11750445213533395715
2560022832319866103
2887747438236292942
141751017934205544
12274073079362430587
13891232992420710183
1497898312002768161
2655466076161870735
1484856415319834932
4956474757701580815
387899697041810423
5783396042105917359
5692033367628087791
7738164285669838229
13922190456276139695
8365862704736513156
8693075474006011293
7951888287065581683
11283400160856416728
18359829965110882004
11368959991394300949
12428946110679290175
5016550450497750008
11623785214688130
15696465904703587170
8235284642450564793
570872052808351307
3316646277040432797
10611058491571735843
4468223090592895727
18173561656462020693
470069062795117371
14614782388939189870
8834548541779022987
7913041269614602272
13903857453620149056
6238783108631664552
7610198665592558342
13896116386713218281
5905750854001771357
1066810939866907298
11155422446095977676
13976047789860110245
12794074384072935672
8273744656306690685
9522826370556599337
8869859706907521646
17316410479402739876
12949224348925450137
10545901901812467159
5339366529268464230
1843908984209648059
5922303975002625915
4909601139602405221
6463419096957538907
13155810675918612775
4886850017673623337
8329037320118876651
2630023154112595792
4590467671448225628
8240766313353025698
16222684608956491300
13004313851875165006
11534107170231651789
243160247546022856
16014396331752365705
10919971531386080905
15125281726306582194
9749168619636122524
10236407640371150521
16299222063380360716
12305900269223887751
16638818276881337441
15236593155303700515
12654975672887243321
15475797177756651397
12977886042722479881
11136871488281635031
11752636517379838318
14987783061881630046
2983081471512537108
7982017036796982993
15396232559441446302
4083373341166128360
2944353726335265800
18039237864979795670
15009126464697208336
16950531893332455163
1802336873851343461
14179964488823887185
17093698712153313376
13443399319801525062
11122851558244947619
13129242719998564631
13230459626579005568
9407880755168732358
18306772163271390226
15873522692054446469
9205396080483547024
14810187217401714676
4688318730336882845
1400231975062891862
4805425753314510459
2034266388524820209
15259361644186426438
14813069061893655192
17076487457362938957
9180539871826159046
3338698547389676478
11391885908047523765
3547390460980277926
12945894335765207912
9021777196836583183
11501969880870933774
13183602722192661697
5640005003821127103
3026146478898473899
6235280725849875974
8252818995019208570
18369036212838404689
5587389729688607489
11783206175245256888
14522570796377937815
12451031375968759528
1487180280167043759
14428922313043563606
12355748698286447233
12643295533725307297
7799742730792211435
11276777143002031408
1620058860624972155
1928857573457398126
5152477688609060209
8214831544388552564
14405986335632596631
9478404316439766381
7861320491091728359
1451849523373689604
3387095362882758426
3320709611077468380
7669642579961636153
17462981434997105618
17228795833416603044
1850719485997215932
14150706134515452908
5772783437700746907
3178146088567683882
8705409405587350861
12220353232036644250
2817169949769730158
4804115133538749317
8440858277967143526
5278735539248806230
8656516121895738936
9166954585311288036
1478890313439404796
12848326807531980820
7226983372608992233
8264181885406180174
12166708172797889864
13063896969094033954
5398290388619447260
9080880900428375213
9105999171221990459
3737372973672987268
17242987744208488155
5607208783085641172
2207022554923227139
9879394366678314776
5999176365781644272
15803968692662866587
11859792406561840733
16576420841968636596
1608638869068696557
12125858126487342484
18104349756507147895
6860536317922333311
8488408171031646020
11218711102414467491
5738553394604814654
6124744938669132236
4335042997872497679
15510199138015698049
7114120368535207686
3810150857385444855
16822503225115493200
9014049988766586497
4799842381348407109
13898834112127610521
16419395429322406271
4165030247146766835
8454717612869429086
10722969682380621623
2985428233356392927
7130959809044218232
349828455523589225
17052031795515241108
17199688195429180740
13411386411876521515
8465869688700561220
11154138563397873110
15496975951641265527
13447067903019977459
4521560687739831979
11752965975483746635
1041650248723829684
18146546693164685547
5521857770464685779
2997809167053978831
2860169031786615962
691165152994612861
14800882442539796799
14971677401887196868
7957969245418471862
3582821268457996241
4194709501071183562
960892423900251268
13639940075507717903
7192573926950398717
11978069832690359460
9537646772788526176
709235337894404149
18101679679980295228
1674326105544508257
8174518561559861373
11322270069702876328
14021843845168383846
3155721875969161664
15335634033511681300
8449206541294457674
10469345541012051484
16974902978135765291
17475422708018409699
12558303678812211371
911581710896579296
5171102478294835470
14262145707902429546
1760290556652070086
2644188207246118812
17824951314502303877
4828552403023601115
14184536956275709278
7984935630290590845
13709392975207944120
11733504701675984166
2872615454923001737
10744321138070901100
11146055437158941697
15845737715369355080
9633354141389119323
5851819321727466020
129449907865176938
15113045035371781816
3467784852123351927
15327541219995187552
463707120969608656
10967453577709591360
4602665098919589195
11545546604947264202
3662370749224840115
12411533545658591311
10143861861983206984
17830502692574675616
5235769130097791655
17320509488358908006
10533531189168132936
6875516676191829139
2700181435289245871
16227924763373308405
4228753635343825028
15652150145056454154
13866874337174715724
13570469509066530630
2237387718233868268
9110576934218113337
7862819864947994160
4021596622232744745
16962226301137495672
4792594073360598979
14397693739564684031
12616792865982767988
8578024835719033270
10960934178818611516
17986577657709367714
4112803993885133353
7946086322799567984
15010621300645759954
3076308342828774312
17570201155824213287
1481069421952837257
6156392473360546601
6632470095963168954
456948325694675339
4605182033486152819
1172979146861910227
11275610181183080494
3995990936028920590
17232551080836262134
8899144553314543199
8282599151959806590
17723096772492120557
5403987949437054631
802949419283725329
8172952320476947191
4327135238514028674
15300319063941439023
6245914843828066868
18090560875556001866
2152643989533937963
4705408962365242418
1175392854731212939
3593368970808272907
6119630425896465281
1679133585036142553
17042416102218053860
11677638328864527682
9974529405430294584
5468242491190295231
6641753026481641300
15826650526637384873
1087941277846558915
5600705314673517365
7487313815518969274
1544210578744245229
11802369012778562810
16172010069175982337
3458858555463497748
12269117493102446309
3451914374120952503
13920791205070514569
3499028693300366484
12722726049699965166
7657489275530730160
7383232984686284962
13628328980608964909
12167155554393078056
9720408652117864580
1025820224499903574
4340663582713897016
7042333832340230983
11532717204269743368
2415036798095384091
9194223226339722874
10009706283899957070
14005127796340284889
7827679016620778386
8295792112567978370
6253726167752550756
4408912438835695389
3706326394328219504
13312443236074804328
13129242719998564631
18078385316874037148
9997035832768610678
6887759873838586743
7841351359146263547
6118646779962994423
13086495115160050496
9648841790520163925
14217049417831590769
13260971022230431925
1400231975062891862
14605110544926051806
9301473691251101256
9395626239211612653
1850719485997215932
10692608916306548182
1862399599986074174
1291749864428926498
8762757393399373774
11735576937877348778
17660769354461985220
17642068816317438247
8734717483788178420
14695287825791552024
10836864029527810209
1544210578744245229
11876909393145196844
15497392986878172107
905140352409187283
11603507316346394344
11941129771006520831
15914273519893413220
11399401147782522489
5915098909266812218
18248839597222557685
1571472648563492980
14046343162367181487
15145252635793120820
13357892983848221076
14646421110532183431
4348457906108696736
111196387430106683
10258843031026142709
17616268553150321711
8160428471919827376
15792374302191736606
293634704908324457
8803100686083037166
15124180042173771189
5843346907311289099
13049781677935483578
6115090376490608986
7393570815334726796
12476682556982830438
1131330879110421938
13505018785345357756
17366663987007087693
5111667957469811778
17697377431359526622
17616226114978287756
13903857453620149056
3093860920666366058
12451031375968759528
721370571098851302
13816781646815631242
2408187786618791756
1639573834097138810
1831203627894132176
13758744267614124930
13723582814549394504
11191661791820455158
16760511177595740003
1890758963880619584
14860194321240555481
10503585740087842568
8667697558927048886
3883322796380397418
6722560943258296200
1092022431727232625
109126615180779661
14780116598844675378
6980832331272844463
4662890120562480315
5798055711420156007
5212759163019084142
10926252826016398759
10354762484854216674
7940704857340525193
16097779527990115885
5733843279366035554
6788422847026614759
9778259378884750787
10599408158519924772
13729589981569675363
5745199509975308915
7912879029739607489
2753605858409815973
3429817402327504188
17026465581188079083
841945184249864722
17225399245216118698
15180789932768745866
2666260743438706053
16009160286980762186
8839743802003319172
15797566488952265185
8094666317460247028
1822031909412571639
288898209695906711
6155390385846311744
6960150859772028802
491498193806541601
6556641296314802082
2501386171564778394
4312385096204422171
10639961830539358216
14074004604280392272
16247722323949514055
8609417829188947511
10211915901430063596
12753800595887764609
8761077759397297545
15724525404529198483
13422895052038226368
12417681055284095532
2653822828166335040
8230421561028930246
13719449438976623926
15046908249942630688
1906947891451272738
18090560875556001866
2605959523767019034
12879510905666202716
15259361644186426438
12998582031460830356
1585828884713142637
15248565169372333492
9641388481773274977
1709665623725108874
3293174477512104586
532553130157278576
7079581664048748386
8166646371454166180
13727240559233600232
13438927909590058422
16420515418261479290
13928176509957622163
13861327240259843319
1696338958245866507
7437809122981519036
13657423573830161446
18163742146047806227
15504825423074468653
2440973376618490066
8423823455829724943
17915611371057276688
2940759257990198854
16386281474456620736
4454456623747812239
17710749294542812801
13382457870491111366
5249175943457346855
18237407187779942437
15210956367548530370
13493692698966714966
17423690924666960721
16879693528284549943
10778752744638120022
1168971788222092201
7888940804397945053
9116498679053876522
7069719535917297134
6124744938669132236
1027046839357124498
7265077122087759042
5028423523867440912
14576092569036284324
9234823060209861480
16775426497690113291
14233944932985874614
8630600559582568402
17282783904814171380
6520576766878140053
14631992309136812058
1722196695011472721
13070865072570863624
10402555302972915626
12439683014498765600
6079305266293299967
9816478060777193365
11891968614589459684
13084811082305023446
10483542731104853631
14951977989407322350
17257956828921433024
3798288244340421674
9753464553891173347
4010033019166014433
13878647307054236754
1420160859346121810
15783371857293743449
7076401029982058130
15504298825522049508
16454037241960280067
1905090645922269905
5053045980396929329
10105006513428679499
13766368121241611683
767107670802736080
10174346297202747233
656607617809965909
9374828781084513425
6171879751367973369
1533772114256001368
3804273208319445013
17975675967093191561
7738892483651487655
5076452216877218413
15630672601720539986
5531539347078950013
9305628866009374319
2143420442988845788
12052291406751101805
2958133965434528175
3704703231487843012
2624521813750220030
2804400584003181204
14365030650538285993
15236861719824719459
10069921897157903941
3902763513217036702
14535626687873389905
10922519644455244168
5729636980258250231
14526622906084138440
11828255638218311191
12828326443644169422
13476226047394975803
16288447522004951499
12506487608784466594
9229017207603602318
13230459626579005568
12524956808396141151
16310229033767499758
9088182451613181110
13084811082305023446
10818757740460603179
5844792504701056738
5793445933899715300
5063291165723595766
4265284390554644972
12645551977680731424
1444875000337250799
13363486542149531818
13711257169237796119
4084778572820033509
13381340863043233019
5305644102542937210
16257382875906252671
10187802578965173299
6301545919494071015
12635911497847748416
5203688384634491496
7758842930936080220
7809005271932882889
16275067303270068216
14874249662435329523
12584579210815432066
2481225588848755748
3762814186831795882
18249489601511413376
17058833504559649129
1490389339197715273
14215572345649976188
3839103178425836484
15556528939892649722
6626495789893118500
15014911514959723426
7117365419411251528
12057192344377982709
6232341421205603798
16989888509696819871
8005898641041703201
9800871374365251384
7520955495442221929
1331430693043707961
653753437874553937
8355693810356350169
17631041490286078859
16183840176961302715
15773754875206193331
6079305266293299967
4960566712638913773
5212759163019084142
16012173134958930348
606242064063704501
14195027548641001150
2179168282310163452
17045648032769244812
14293789418279334280
4501282384701660912
8744820990728933162
1710707572704860025
15950168854509983850
1442931666365003015
11828776583358509094
12846093022480104483
11244065228506178989
18444216137502480613
13300313381060251829
805093476182931748
12733307911737264577
9232893463425087760
14533179982295231562
15872275019937586435
7758388643793597955
6687966178720683288
1010948181029915916
12216193561844074858
18250997717879562980
3893319518126162549
8273966730262347393
5315668325578605504
1777732351474808455
4039692914396988402
16338060559485745933
5996305510318315886
8563950127714861173
2128289595262066126
7447662333165328619
2078542560824193202
9071405941023490277
17388958888799198625
11199904688073531318
7134676155066643840
1229866271550524509
4396929939202348079
12619517561104650698
16439172119772771558
2592823355493542539
14218346233387312998
14933162876239088580
14691932769216436537
1637181197340898569
13539180034488842113
5574420414855747487
5274923127600966676
2709559810047251679
1046920790792201021
9660796119612569819
5943208646094547446
12821268210982511550
1955642624057478971
17757334399178450965
6463462053187028136
18430461488928217431
15522658370414750531
6153293156805647411
3877236967032034787
12750406962693118829
8641678249380574798
14719915205582116683
10014913888039553743
9088182451613181110
9202810773615709644
6838822336925659938
8344811610792662291
2219526570090240593
16018882256074386936
4265950692810867162
6134889782532357464
4842252435441447220
8485830180883041736
1730344102097589389
5171719913407462175
17283638692574195403
3038503310048131073
4814403168589857203
1430394834248296510
6231249139257835764
9961340295669655499
101371001981089658
4173628817469879329
11914705239687305488
2336934651385496476
17462508637712267202
18140544209248185204
1742717430606491174
12238440164506292187
6530503683739612260
11658992310707777281
12665281787372648464
1208780568879694661
4585541136291260467
13411286464180226271
2535331854622523066
17584152849828012444
305451296986384355
14896062576785550601
12936986905781525471
5176159371824023301
1069596978227020227
13308485524662744805
12384610028886647947
4805425753314510459
9488986371843030634
12426242118831755235
16112192059743392029
15197329563680254815
805601194906380757
2833580188887098891
12055738798134332962
6392641372911939566
15218911760751447378
9458724831106483405
1769193187164805800
10545464768117572715
10639919262766709592
2355243159310511070
995862214242104773
17199670522810419419
6336827270028213711
665929335530840815
15442345545965524656
16847086868074003590
15113045035371781816
11014049886379145246
10047967308980573461
18368919566549131059
4123320312972914377
12197144132453598222
15301809780424659307
3040601856516540719
1934747921463793249
1906947891451272738
11807994680750894615
10269697238107186633
5549691560016783383
13941388688573999225
17254074348225203972
13471182089301754871
15170586395365004956
6556641296314802082
4172791632611980368
16702821786364239102
4353645559055281729
16194036215715942732
17882790882784698992
13188093152460810785
133388065114012459
16717964659912897811
15004119093918669503
6700332852844901138
15252935928197740344
10997744886701911530
6255227884558178984
10818757740460603179
6239655372278670672
13610794603928364843
8780433104376569663
10470676407929654513
11329662868249521613
7564487459460135113
12035431828312081858
11591341791334889418
10001317627008668986
8993741474844270513
16814236562019112111
2991631776950176078
18006228336963978334
1977765095559103842
5117999980773621115
16289620874615326238
15504298825522049508
17542541252630623402
9765131671805198916
9463748920454450913
11903996980119113891
16477545402736360790
13541015553453095681
11268355452703492714
2611822710425475571
5986041090204320537
7496754786008718680
11899148315946462883
1532048516787593802
699961678358067228
1570837452751946810
9394309826607863141
5714042315870326473
10485666008742427484
13098459210771980203
3715633590520799487
15818610842924276540
2184135433622060294
3396297530010864683
17174326313433179588
12498843089509549961
15926798316787518202
14902425206815094229
14531156770793439548
17510815492800519819
17532465422488923190
5926234726406017899
12841171610707828664
10713486377301023348
16972402391070790274
10402155769984656404
1368321537586114672
13545058223961409091
9214154110562003567
6427406708158362266
4755611578656644181
7644566783069015632
5997292517765696676
14021044691340681190
7820753501014450235
1587489684846706208
13764953990220580376
5898165555114429553
2798182091179764026
12987671980611161028
192918345908506354
11425753227620135474
6871193780527183041
7512999343397086570
13149736230603746122
16214695542262001803
17046489358498787474
17075019405448406168
5535689445498324408
14686845654500599538
13470541910857886601
6144197052529353589
4310451261733425004
13007894296728061420
15260397471841274116
10301312906065045388
5076690070277844837
16501925111035880094
5156379343119973750
15792465796785103347
3682709437633383413
2024414779072497023
5786174684380270151
3915333864545243302
15549878563340353549
5795874064982821998
9478404316439766381
4960518094651677229
15184978550294256807
7149506235454261978
14570528327398540979
3736550362950486587
1997199966116886093
11399401147782522489
9437135190722877651
3285719482714431
13130344678117160653
16257864248103347494
5206943638063402469
14395708493680358310
4302620541414712169
14496384423962231421
5231173893778276010
13372470948036951552
3209353083583452260
13771072712800662804
1900408659240558906
15086138196866070287
1412542083363987028
1639834277366949336
15560813100570707959
2257934640718573379
15797566488952265185
5616798848009949725
15284158535095264608
13943373058095867336
8943034378847619702
11625126825294858284
9096559152154933202
6328972314692457698
10753941599491519303
5994706744607794819
6728617815346554379
7724392241536295685
6236536826369270368
2025203302824565127
18059857014416742352
8189999621639413243
1413347998225128026
15782154002189930635
6419113766473983703
17848502329351788037
15813773306574163116
6100680014138224812
7788648001714133912
17880283359214561531
7510380921624605938
17199798005972428140
13678964049412451748
11699608655635893248
9792239531361938353
129675662793004026
9283749369479903544
6938582522847689686
7891385712610720131
17064898294206436582
1747617644991251404
7022110813575161313
11859800528028220648
2580941834681335861
7122569313360318064
4069695786755924649
2705884807167763414
3962438146473236610
5593695366477891188
16146448014353717726
16933700641351363752
11628472654135404328
5698726162403178728
1175392854731212939
14127624162970323371
13017329066345875958
4691533966623223350
16883112380432327052
3091939383400999999
17651497327684624657
5326922459620469234
17530655888341620260
15731494826008524908
18362467979474763118
11892489944004272311
12864667621645393904
16272455374606094464
6871031157539153886
5645898591410761354
6535235301430598899
14037668488328198289
7008755903864992250
12873735784055312675
16565155857298934065
10212990304916496605
2887747438236292942
3547884480100819920
16228563614438631770
18063066788374699187
13739773979621923638
1272246110809017921
12610343981955807151
12561026879393902632
12058312369535265709
16438511468838283973
15032344642504493339
3805145232294035869
17186295631445180312
6718141123113394452
14546167527806298251
7140110483994167741
9014472394179942693
2786685490935387239
3540118745492693723
16091465997751058169
8875253993041387015
17654630781937901948
16977880762448238269
12305900269223887751
4024121552752687588
13131456151170229793
11766419882191254966
17510964252353159035
13061383542318963748
5519138907214851929
17566289948335664214
15513155882596513873
192070601676505584
6266390873894137039
10824161831106996747
14813069061893655192
17101070136325620971
13789184402320839756
12892778920160368729
12284991545081558254
9293391783070989121
10187802578965173299
16822959352464116832
14025576675826870521
1246420245301636479
13482461498672081961
8782564286735126222
10344425155617591765
10189968084046018245
2776962958942416551
1335720592351261152
13711257169237796119
11502525683066151545
12909869839441569974
13611519936343528027
15078169276762562453
11268355452703492714
1456496186530612569
14043838322988763580
7662365420303853861
15471473288021651024
276927931206773055
15064335762087083198
14813783887454627121
7123964052736342542
4496766027844338100
10581443379467228241
9189324121673496112
1637181197340898569
6202941522189875739
6399586441396228018
2246703347911045760
6799255500142152141
14197260962786419507
2368607988042521486
78373184045552940
8213315293091822292
5168532814922324202
11207705646100069086
7995061728487763274
11629820619519170221
7536695720906182667
7116139959017077111
14687686273607357570
3101299126474605312
4666074054028728789
11551087420034093598
15974124714844178814
1896639646962904788
3822856732005045298
17556517250120741418
12467434374877312966
2272437483685065927
7294859493998264701
11608124290252891188
7694679156776159897
13917241182735067087
17071271759607301240
13929039880771550505
15516163276263277322
7960069469184523871
4740026081330341819
4663462116049612620
11358099197502606649
6861287962206386232
11742431622142571196
4552588284212421809
16254757771777335642
7157357273280750083
9307018145187341489
6767151308125441051
15722357680067788793
15957007361971497821
18419551063340523256
11752965975483746635
6295354203702264423
14428922313043563606
8542385087575098968
9956454213277028830
10374399007575064410
18059857014416742352
14631042198817209836
387899697041810423
4010026851158931577
14137689926591432715
4061593751010869432
2740182751517037218
6208897111922663745
18142567982985176968
12053520003133302661
7136833185832477871
9100979589437120319
1089726053130008000
17607607650871738638
17543950492194009543
17631041490286078859
7738892483651487655
8848574688215927399
4406632254848790533
13520842065347434536
9051537975233309380
1357509491414940652
10713486377301023348
497832767343480275
7567656272468367643
313444966883405994
9957956948748065575
5018609360451455170
2219526570090240593
802949419283725329
1029546877296997163
6902943515208271202
5297467944348431938
7191834101427575039
5907624794671743463
517545671008551478
18354381154112511999
4287880532953419442
8317775897571659243
681328060270787977
11329662868249521613
7505123344218388304
6088677929383634537
13113980386498641261
13042211195933784970
15400861193812844965
1610857986010919778
7111105190663991043
16721363183224618600
14496186804988119258
12945191103519309853
6136659425395354575
10152094374988614291
11387014717188063134
7926170682954210199
3884983559465320023
1702613013620101691
15396134650020963212
6885995092194305162
15581982551852813763
13195063916453137402
8683594137492817024
267164020148255769
9174758584601938325
1389233523977502064
10384652304514566792
12688210174703057141
7491531105310088108
18067059293465904669
9329278659146005795
18234572248544357635
9695793092686937199
2234994276410788797
1643149689918082037
15930635321553945249
13395140373977131873
2327738025915905116
3002001886978332333
17042416102218053860
17975811501502182606
7851692570211838261
12647177030484371149
4436515707995345997
5941628463220215468
7951332641173246396
16738111725577947786
7325348943403347207
6770947153236277192
9948448198886300909
6295709327753308448
1379167483683124506
2397258743469995111
10616584145281799436
14880047148634526667
12735606628677917095
7020907054769687502
17859150748412516913
2402948633649561410
16142876286265332433
11954817080329350140
5067884441784025301
3576753429462117175
16418905201760946057
3300360661952586543
5587592933218900228
2654662336318153625
5177792336317683199
13130344678117160653
229387500894431592
17813863307468563132
7470469666827243263
13363486542149531818
77314549849646858
1777732351474808455
15212290389212849473
17424473094171348071
15826650526637384873
9131998150346111937
14439268928714517382
753753198248346397
5389325329538242953
15762194486658191803
13814482993120368757
13313378814872393737
16250594889500632899
14956561146071190101
4585541136291260467
2491019752651238608
5234567144359252336
8267667347154575595
8330071669687802285
12709485539972876193
131875973461833186
1662187011430118247
3857063384349225323
10217243654849473656
2503462551854892852
3297773098015756881
5596171104293562779
1856962667564631167
9648841790520163925
11065248528909859268
10492092636248650820
7415998200326404511
8861922047590573108
8705409405587350861
3483747011437719395
939150359192521060
17140699157142205256
10131743675161816295
5773097153320206014
5572345961318331820
5256256385623080907
7263291976412971918
4141006222699680695
7479298284422595469
16981773618769130438
11461508478986239723
6580669987661771827
10419826510349578145
17659516433336498919
17705974675630407424
1928857573457398126
3689106678318323107
8027423135105690362
6956870366258906639
15353366063976704690
16040301735537075080
10202143874764772751
2633288762409192863
2935189382528221268
5643744786126648906
7738164285669838229
12891999564056186274
17861060818425274818
644534565861485845
18180032399988942389
7669642579961636153
15883064639029061560
7485957962639931002
5160687303729239666
17424628495413966125
563986740041635572
5417559075242806210
4933932417684914548
5447854946334267661
8687379744975611381
16247722323949514055
13804491873511901702
9777555259735756451
889882240689370526
14830620208392291174
15780308101501094920
16432693855289797795
7279463107747304025
8522519153333683550
10242317406378630445
5325616234425573739
159501844497698337
2988588220820926888
9302398969628185631
5605381684918646533
11506838790138103502
2996921107876906469
2159210615743819621
6720613656444654795
2126832155069424368
4769362227039779002
2135011976875939616
8662754794636654617
8465869688700561220
14393847414227178345
10462411552902077221
14649335038094038862
16580469069733251892
5397531441173038581
13012000916665696667
131066924388819138
9918024891803763225
11473151371107808972
17673635029034443478
2411827014619979615
6414576814485873572
9460882818254956264
27543536543036010
6722485160882783380
1931887211377070411
9956454213277028830
12062110981090917995
12295780633015965188
14825295908937966519
17411263906714527692
3368006437037384918
2001339334766524902
6589959433521724044
11651027803099351148
9286946024096445544
11914854407181465065
532553130157278576
5504018863192625075
2920594386202824039
8079484248328101628
12421956845409738369
18322394611983922550
8780433104376569663
12397533140860197956
8303486296157098602
7058476054530745656
3253073878167984340
8282599151959806590
15011576203050257578
8895374656773093040
5277004205212824578
12922291440015218698
9766887706120406020
7536695720906182667
12920749223904840522
5210828633379506321
17393927669786148930
7106623707991346578
17578436902288890847
3101742310953160709
15048216802551508740
9659043904728439496
18186514007264586093
2057702766725736311
13152392770153234967
8761884391389240643
9039805072384859195
7301349756724264708
15982879171223804755
14391212889525512654
17630112368984579337
14799683901774366900
9858041029179132190
15840288758340853541
10704604757882077693
14719915205582116683
16660383508731243233
2352157488521421558
15527297782434769599
8814530002695525361
9382904477910064155
3225214667213521091
10972232631384679191
1804101675485052258
2431807876004305837
14037938014664161606
12701094082914416563
8296973004362800385
17387079612355865529
37277171649934582
5288114411253178122
14797416614028916213
569077190649641510
6064236621006980744
229387500894431592
6556471207600475727
18212053352386343635
2737166043412730661
16097233321368740435
16840104810367977109
4517833701745767524
8709171847670190703
17014095089994210989
6032532839858403960
16044293928951317196
18325359612174341659
12771026986363057454
6860167366671430189
1444875000337250799
1370948491008981953
6275276397171337480
17850078206009659432
6270701034091689505
12333365806768137732
303333395198854433
5601434072661106709
7046757668856370545
475671116122787393
2125253082440939630
884321528290968776
2258401822873401489
14340834885884774570
2714065190686934944
731174268295796659
12846733913516196421
10763477998200455449
2572156789002190059
4342298502028476335
8916636060148689757
3163226888087608063
542873641573958456
2353635350932890608
2709559810047251679
7128189284548439382
10255145455219260919
3301424365747090490
4312385096204422171
9518047164248290297
12284991545081558254
8373797487172677027
4409791221505412756
15650773015890784586
5069687496488879857
11305945662022898874
7006258969054498232
4710992773296222824
15213151340787309319
13969791773093325954
14787043904934800948
16844054208212165153
1929590253347425635
1484549029410631098
8897814493293016085
14908867391407005713
15452343209952203975
17485968229662578359
1522721638018196645
16957798858864648897
3721497349416936578
13837836194805252589
18085228899735596446
2003562974494518801
14532903576941658685
7964040994980441365
1524275346772316367
2986669465909557668
8301127369497147512
14815130009162485795
1174594734972800651
7615174495302946326
17007378123921922580
8865260746603237816
11783206175245256888
4150632595731394674
4161477986419924684
5159007752045056315
16448162068280907833
7776931942147550016
11844401942640486770
4652111299363815507
9541403516769024425
8682788813994392285
4790654346342576537
2459873639390367512
6403895198095066876
7301973722100852902
8482049504553763340
12417681055284095532
4625238067112986572
6497181016072588197
17223686676761467488
12277247620220889373
16209979925390148490
7383666280375914157
13638284211164576308
11983205449713074356
16944672502968187040
7544198339498694860
13816781646815631242
6525076611656576301
8951600043373241492
15364525219316410447
11375362583548810639
16589043869189968890
13173092171860256074
14299973417045845962
8386448035412367445
2778394389678005832
13674541211203067628
1004013880874257562
4729995279873967000
9710792387054053419
18167992709384056771
16855631037003966296
4709666226075195170
5540266503780298035
17174460973908019068
5925028123107857677
12164667494616919110
996087570143634202
13738693316985641913
16335388478750439019
14952298657969049599
18105238156740200154
18123733525194227468
13562244515853985499
10230216089736814407
13222749584153550119
8212790770114426300
10581443379467228241
9406885482208610382
15272737668889922569
15369315923801312514
10202650704521885035
7323951906155175486
6489882656498285517
2990119661031437678
6019165720469168506
966110382437332186
2790046991269885737
17766284345215533200
4660076301591461092
2016325601178621311
4768991195460224920
4367877646216816114
11725032615455231046
9290483314813802035
7034505971590914431
2440494720255367918
9581359993291984577
2839437817450987352
17877941802045872789
13404778749427356465
11449381731851681287
3377700098847559019
2290423613487970140
13530049907899097656
6860536317922333311
12299308580591811172
11816180655768072390
17481750972178460872
11160510714599885260
13809751938147092427
6959566435062378349
5474013940805325000
3317328634719165201
7857891183662293112
5407657570805057681
11582085217226044726
6406626153897239170
4689879982933487699
15125281726306582194
5042054591598306957
492696584014496896
11878341253495804538
5370152151921960594
12704647485624280302
3057833616673118516
3438481811777521851
14180926974760476895
6035631692618830439
3004771364710990478
9850058243774937436
17603070000762350061
10413663694958687743
8453531828327618255
2286719663712739934
7147403927711684380
4994356112683879037
11553475546933871336
10139017522571525767
3090120274927339622
11925235733194816930
420953221133915346
4525879573225314210
5295674471232402776
6496541577635943454
16571724368714636486
4515410025158476278
12459870392782373524
14125550484775057036
9973253470216010664
2893674108959110748
13350815822591134970
18359829965110882004
17861927795095710916
17646875767125599393
6370072360418110608
17868657142183991703
13906626779026578436
15034244668586636805
656607617809965909
12381608973890883183
14807339990197789418
8125990534460897656
3701733155189856043
18410345286674066564
13529372750198177734
6292895228750858722
3982473645421342999
5897845242504884610
11923932004591693680
8677439518603184279
955238323066257077
17598958966527197297
2920467764947888621
658071498434925280
10492738007137352371
12656894698927202844
5031878685718600421
6693309498747652945
286796854153308539
6181139464735538763
963713441111153910
10057969914868563681
18294321584719702043
10523395959317933684
14571052027188223077
15503180530583238996
18157532234602896246
15964929651636110005
5608042361269609689
5197474343311662712
2587519891525349550
16988943236884355027
18156849758194724958
2881314635034004454
4422839332656036645
7420085752422620246
1678321286901118870
15925760651382838342
12826147207179964033
12125858126487342484
7632894256941328439
2734571184147912363
2506521831527123557
12726211863256127541
1737612740294142854
9460882818254956264
5999282304600912042
8027114441470558569
1209692801728010008
14773629643209004533
8486708602826629338
5333088179768505206
13290128327167434406
1131877675207168375
290543546890715981
16415327907634070800
926468937278903384
5098663120346892536
17461411276060573703
157621864415968188
2563793006624515095
11313675203740871179
16630678373998151520
11475717517947644506
6524479443594935068
15240189299639412896
7167552422065364896
369188239617093081
17528079224903246403
9155992571854279158
1609620265455370628
18048110982954372084
8020894911165393021
12368188584880775779
4365577752203594498
18073476293338335765
18370541413248204894
5444073886903063908
16853306641239783759
7698885734610476989
5185905792335243196
11470434111228307729
11623801860273914465
10420346243062503267
15450922332014572301
2848881825507971690
16977880762448238269
12684685325973300905
18064134801598499049
13622258494798327841
9101820275953680126
2104715584355237645
13697480679572316272
17784725371680753075
15248565169372333492
11569105592668401070
7749266583504096476
9958913500599039866
1491345663052222084
3246889023590643715
18415753091840880249
15314802078292360384
6890631659552898694
14369934727944777154
11403469827660957614
109126615180779661
7094714631117118609
4894629063809964413
11435863156228945456
466683895198402101
3772307418283534972
5986041090204320537
9488986371843030634
7389554858281925689
17814926375094318655
13920791205070514569
7497010324452162069
11524530854144411399
13390055752459006563
14843783101340448795
8829915881562684877
13640032274705201965
15925523189764699004
17304677434543375872
9949613683003807750
8303486296157098602
16593290901982247934
17760657476259385533
1400419672026743389
9838017266908461425
12295434656830794158
5515797029321319171
14960530923995368167
16571724368714636486
10101032416737730008
17966927421652443636
11433047015663472788
10242317406378630445
15294818425976640698
10249055030817011899
9925634054151381909
961100659341301172
520307909761130919
2013923941471053031
16972402391070790274
8252818995019208570
8828131611441127817
2049146111789154292
5834952720355032933
6784194572818836922
9266782194140648952
14139198054243546817
12838579474408964767
815555033615652199
13001982391210391217
12164667494616919110
14213554064325762726
5989156609019534762
17399959879550575465
12426242118831755235
5277004205212824578
17815490169946000859
15044832385391843093
15165361936824622082
8386448035412367445
5560453525044220762
9098122799663351485
2110514294718467932
8325689935321617251
7720806922737209088
2998062791782967469
5363148833215162975
8490759380056370619
1136309135678212281
2495112372447734742
12358084741614060491
9194001338610324702
13381524700992217659
15686781282881019487
14902066760930679097
657222614336747343
2299649666271633813
7093568642586510136
9793580557551062425
4605069094832739545
14956541785670214294
11569641517853334213
11941624661428944864
10973925056204874516
8983449127494935759
5062626774209017793
7640096676919136988
13176584028382530775
11216554765928891673
7918626358176595133
6950194017648452256
16882114890948454063
8823130947541158043
15054219889129538427
3597366304701209927
12747716454704493467
18430461488928217431
12167670984523137810
11331337174472693257
15640899449969454636
6386327863339807996
11027453303620553543
6709721155687645698
8809125763670405798
6240557748465204865
4409544623490886986
9101820275953680126
12173109620292099941
14805453909469810765
15806201682218462469
17844362997852294199
14971564413293701502
3484442849126811465
15252935928197740344
2868513292005229914
492212060117053904
1933847284282878352
4008175697199605189
6397600805752232592
6981888791496225056
13570668507601416603
3510378067453194649
18082313552073039339
15750762568361858290
13997123475162922427
2246249140375719087
2891389058823416106
17244012968447370008
8870720430361202798
9301473691251101256
2974866964854643122
7650180424035864696
6866686810786932196
12627624302095767411
475671116122787393
14111839772266489455
889882240689370526
18141479076136748105
13469872219526872991
11506002556071870831
9177362847905677680
578830621101962864
12915995176838548696
14676621697529743949
13895216456441569165
15951161734007376260
4541903217020891020
1251908231051874849
6236536826369270368
4110465924077370185
7801132818819914269
7502354663184064852
2201419911584797162
10846174515266323517
15276535940919258744
3763199126755148
15578082582494887480
11213726787725504328
11462248870106499804
8093691042381860529
15874481059901440675
8926509494202077087
15959667987899755220
926482977962751531
17432719535168582908
3841231917149345600
5009106781575408620
2378292627372123686
4857467481772291844
16489829370132169101
7084571184351405672
15021199929280631132
12879510905666202716
16957798858864648897
12135096788828186985
5064008965282223366
3475188664199900770
1483543024521534347
5736591768119373124
15645572434855274878
2413112912529071192
5922303975002625915
12179409957836917228
5078248791394646404
1696338958245866507
317720724607113479
8169691076395815236
8137870380495893414
4125580803312587390
3647161871885124807
4886923695227897886
7611124095577493852
14421553600388580976
14108036233205000400
9766887706120406020
10961664452595673789
1333880128053293032
17610478790890130243
3839319891828458931
1479663636476216909
1587489684846706208
7591766673885331312
14748792747115485979
7839707457603689616
12343039147989204180
17028503937428005658
15440076391758992904
3738864490560531419
11821620625555541968
6700439030137064640
11136871488281635031
10961733690532301548
10561153641499424797
1701578124032324499
1298382097905922808
1862697026494271055
12043839799953035355
4428850940990886266
10722381637309297427
8079484248328101628
13242109157344654805
8907930176227995545
5244109320088223028
15660811433119497577
1346048055144745053
7184939210017750427
9159483609925781606
10437617346914976332
6580669987661771827
15556528939892649722
7657489275530730160
7094457696473691077
11505016113068334673
3076308342828774312
10454711887356714980
3289912589818046459
7804646474182939468
14799493652772888951
6500728583166347574
301439010037845143
5729500254064506307
1533772114256001368
18296626038366348120
16417004123830825715
5574420414855747487
298674131798050064
10883186590896219040
7994004833739835710
17073029011184162216
16022811644395626275
11207705646100069086
3578710800407030524
12724707472833652757
10630398179454663496
10092752211480902567
5843346907311289099
15440831503657572248
13260844554118908475
17923498535079216560
9190572495564709335
4926015247913622563
15276535940919258744
13301201953141085134
15965692347256022345
1960393251680867368
11253537747964153145
16327155801118556658
10965562980301297537
2538100561338832394
13068528137572579835
5994706744607794819
15344818122000506041
7349911860419284195
11480915553983002866
17430490531624209407
10973925056204874516
16780274096992046304
14481586030514895640
1110321451056361755
17973089647342644595
2706724710654274423
6174376031897579907
9394309826607863141
11254129733905647985
5501755751599531014
2361591654721039353
8172223558737478663
15395739582157515806
6359352834054497216
11291197335087188184
17441699098541914948
1029546877296997163
17767897328326122300
5952822886842739827
9098122799663351485
1291879938505408519
6174376031897579907
12682962697741064351
7468906333653678824
11752636517379838318
520307909761130919
7205605378328289653
9768484784098553136
10713968265383559605
11636540293647779522
8182998036612822498
12352585507759811926
14369173278124497704
10562507611529268502
3014132540738927105
15356132704265989074
13760659367213172868
7288028370420152422
17345860788376397883
15773754875206193331
9894808659314673215
12017649043869344127
9013620938296806446
2666008231795006
4769362227039779002
16781694077716947113
13564606498536258420
17124701017812707992
7443134344729344061
13061113701423809396
12561026879393902632
655310518076846319
4781102654410718982
7635163514383052446
7729138404998930622
6572916447179156076
17720397853982998870
6599275465636564878
13260844554118908475
13442480337759220663
10726873574556659209
6820836000462863193
1712312205850969504
5617845213919609112
10704604757882077693
9382648595796918520
14134283809306450212
4845947201325900329
6020012777590964501
17611130636841355941
1986029515595876970
10537070798828764677
6628546482346787261
2786685490935387239
14961826436009953219
6399560148446876708
15816613701971669827
1165622703168940006
9244819929514310465
157320242000255334
2990119661031437678
4471604275399905196
1406833347486841479
9727858156037752399
6904373728104128677
15632221937870369452
5982887510608644252
16515366786937077323
560012088837029921
5616798848009949725
16754536173579285477
4519186703344869713
10132769335119620657
12205581521811593701
4493420532691612648
5082372838649248610
13399537876515867690
509465043787919851
7081784969753343430
17963758574010884622
16796625289615017494
6238783108631664552
2240729809891753003
4160349028416651461
7383666280375914157
4145465072229267582
8719434445736397435
6857871416231327430
6106131075209099054
12695769338949701714
4002422272041320992
6690379462907966527
16575368786825323686
9104576090249274653
14793238490884555279
4937177054340656300
13621072576251293767
9764003451591167947
1782797937321700986
14534409038295679456
560124214442136010
14357994161086803817
7183132720768330406
17490257661653706234
6906867582985042693
8972520272316106082
529463602506644823
3359757733413956633
12705009090110291340
1597747233143155564
1061391502131689666
14306077372328463752
718319462647064174
14387761630868062324
10520651367223629203
9363728576480379270
2576129022083497589
4113500306076431780
10114088402330915736
15846970355090500143
6859115509938049182
1524275346772316367
5487740839011598622
17368331593345562740
13899192944144030871
10618791453893857254
5748430931155785974
16528685411403513949
16777280759983099470
14315127045682904357
11907564453864350638
1335227292523191798
6583233237940298474
2587353103074860169
11220813356188352248
12196090592742328228
9124015703999861420
10051738372976269674
11105153524541524436
14960530923995368167
11198437554999442297
15380587543238805844
7532466643457806197
11309853902729196928
7382624243844487620
718604579314043466
12673708895932667713
4721026661978525115
13068528137572579835
11467410418868848999
8604202478180469188
6628880687953841185
5599479989898605235
11938617334002250423
17438694905259373979
7063384858893698802
10332937371634187510
2970705149665092900
17660769354461985220
3747940374059127686
7539376834766117274
12272680357095610727
12798368461846020494
17882790882784698992
10270781007623830975
6882088592578754558
12775594102775449801
14245766801110365797
3062395875712395631
14733596618754001367
6788480851158123409
12062110981090917995
16792122631668600697
18410345286674066564
11229928094314816179
9980234160532744569
1707285542355890107
10335800889744742649
14485241613554276399
17136642208823758299
9124569467350423962
13222749584153550119
13951498240460309419
5127848075467146720
1056064548361925694
448865448614268364
6460559482845639426
16702473268422910616
13229083034342066530
5312641865488573069
7181723681307928937
2923903540181860387
9142476883955128193
15513155882596513873
9551631899558252378
6234630088073567475
2731876728699408197
15304430055089871039
2097710292043233431
17710896156854165072
17927360465337471576
15124180042173771189
13580343264528829243
939150359192521060
5636547862080799995
15193579631380282889
12425837002017680802
8958985377527283604
7141872010628359556
3293174477512104586
16892671194373330073
2620380960756548565
12599384099961606572
4260848219847154851
11770200687782283663
13046881207557700048
11229515053201668478
11525504284225445252
16560407592083938583
17276977821816592833
16996741473368862448
3180497229130793356
2914720655152715469
316527670296115344
7218902309195362653
10742061274711129153
8661512798552603715
11426666846603375200
17368331593345562740
918810717943326828
15054219889129538427
3614870642804067378
18093142458137242302
4887156406330540696
7520955495442221929
3660605034142291198
11619526300694528901
8895427687746572016
6801708595033520960
8085144326499210503
18240126654025735874
15405008580761111521
172689804935585259
17334920886854440762
15789507646064215206
11744206458878797518
17257956828921433024
16109293385262382617
12211750390317846139
6455850408099484989
8213194170135959957
17894987767369527780
16983876025345002303
3952519747175126517
1090144127723340532
13796224114866544097
10206130451080086977
331443683730340193
9239137637521081391
7960069469184523871
10935489849472750858
10230216089736814407
13086495115160050496
17616268553150321711
8672520340337955751
11556549611108587522
722141004665369219
17556599267448010470
11638183032908730188
4024657899219223160
12271038148699722202
14877329476891774465
6899646372059622847
13216100458611257857
13732688980154951567
10074016197450860323
5985922541945899067
265031188052935464
520806793725369465
7747193772962134372
11759820329054085503
6734893117681607709
3259994264546216631
8339548701890409788
5618886634143637516
17496583270845040562
10485016715405925384
5177792336317683199
16753443768368162749
18082753223449915811
14234520585309308330
4549069110117430298
17927360465337471576
4768991195460224920
1568602342738674944
11032977349149956498
778390164297183189
3857063384349225323
2029243045210897567
12132742056714210639
10577377851437954198
10393491497689241869
319833879614644109
126282059583787521
15284158535095264608
16989888509696819871
16278042993215235247
15444293333986169820
2154851598827797161
848031407464619085
7317062599856835690
8227048128891273652
491498193806541601
45411992842151100
8926509494202077087
13361491427439083102
4839156821483365451
2720950261276073760
1596969894439161666
3111129301420255468
14025576675826870521
12252472315047967888
815555033615652199
17602566584096525159
10523264902056853600
11650211861198539635
18378007497717003174
6637936515404487715
13621488296755156578
2055238995047011978
593141322119469766
8349925397491682112
2428763910892696563
12044709685083916300
12493294048350611542
13580675062476031783
10143861861983206984
1769721388770685583
143019830663439604
10263415208515960965
5568643617820274275
8363132383017981284
6667405730298123892
15599593770435064495
1677865806198879520
8742359259492332748
7257008864054703912
4219336280641557403
7310775413733460595
3728482408625645057
570872052808351307
8930292711312014194
17127057813834936642
8886030858879446134
5515145696273593672
1782641453254425298
3592203068441707994
4886850017673623337
4164048543542795620
12011906364497177294
3367868134953599550
16838853958995227937
13842488372821990923
8081386764630911759
17893886754884802689
13536206324435692459
8592546673661161050
4823466991610600145
4552466138091182253
9918367988800860598
1753149640419399044
371356467113946825
2874375086882765733
13248128313818858995
1887090196042847581
922078369736870333
8199074711754258903
2219241902556607144
2644074565518405587
10616584145281799436
15010621300645759954
15442529827256722595
1307132675799817448
5834487180679297519
15989086720722518149
1843163123869686220
17131094403043974425
8217947264727913440
14035504332012264220
721695721204106929
14653837373184524144
9059191981376568203
17174460973908019068
8604832755591647509
12208344612356400727
1007502382434642599
197709030609238138
18039237864979795670
5970454510639958460
1308242554601685864
9133351020800895853
17952354440117180502
17747525210776296919
3810244103382184483
15290469446851007572
17300153418272528703
13654553865788259822
13650538724446643591
7573388064759856457
5433913080792031706
9794598996045580266
15194547041720424121
881725608211970747
325843755571611337
1476574489053771350
11347465691270291885
17551628446037399354
6924371182715434792
14269530326124945621
15838922577847905066
6109690441767194564
2806644836848067481
8713720073357381660
13642548275153619002
4020696554630210870
7455978143929349715
16304726875156415934
1379167483683124506
6295181371611727767
4366099330781778891
7495976377374695416
4062985618834192864
18315243083685633592
17304677434543375872
15212290389212849473
10430728171687923494
7662365420303853861
1312067615642477927
4287880532953419442
7113105560470280805
8041479943137190587
3264358861105019574
16721363183224618600
6776790654811711335
201900647467760184
10903289887182680779
4826681246629239587
8158771192314543423
711370822933819195
3895306549725418919
8862985398296939983
15015397214114498241
13786555111271880873
18001896163843909445
17824600625850819865
177053830718852901
10730444554245431722
2769884254693043541
2526326948150317841
3484469398610060744
2988588220820926888
17911728816476182984
10929666160941637427
14369320143554385873
182278169881607422
15844741723651388263
935835389551276654
12885048857449888928
4371875012546663817
11448234117341615039
16500601803628870850
12965624778421219321
13528984906890609185
6823950760209850016
17675122665841358774
5024503809808357116
14494934338432187648
1824624471661267814
4809765533800803766
16934947354056229925
15129344040106124796
7283766869137486032
13602587522406085461
11129551403760100982
218029367336894531
4936368358510516469
17497466358881134428
16285022622420113196
3554753324681949387
17520387408062909499
16565155857298934065
8659319034684368914
3888783797404708718
17413841230803220592
4021596622232744745
824675788589045637
2225174874520067459
1640583716975349987
7419584421718995238
9207056885708047524
1328089983715343111
9113529369850719420
11278978247702257403
1673395551044310687
16724014760768198434
14015549011132347147
14757704585843594299
4532527256929013737
11781493257593596777
3471076118669100078
18196340326991920337
3348586638848948608
2670840200565573839
8020050722936049274
16782976482439699647
12915995176838548696
6740874091206387414
3081826479417258532
3548677854724277948
18329012727634849156
7495976377374695416
3472175347036398695
15535055177365877990
12008354475079636998
12381438988870758048
6465814152452001347
17519572206809077313
16760511177595740003
5943208646094547446
14215418609059514768
3494962156190426590
12272680357095610727
16250594889500632899
3315386220178631415
16865807697661844537
16265697735207718240
4904947566452776577
8578024835719033270
8804858218525680087
15236861719824719459
15145252635793120820
2658267448506460064
4508813324017092651
12975148014809035907
16078596864946289747
18423607523052477580
13638284211164576308
5755528863405107437
5586514011042057253
17940837500615000120
16944004758162850511
6068943461510332849
1639651082028337600
2658267448506460064
10907831572143971558
4656567321241934494
14952298657969049599
16421299637793291551
13459016780534940942
5853469365513940293
14137119139198239023
10774047365211412893
10333418998884539720
11770763403560277409
157621864415968188
17715529680389398994
4010026851158931577
3051855551379333533
8029142023571048479
1832929734942420005
10918977730648007986
4289238485000411175
13744787786717435921
142178144297815880
8741015807180261550
4141006222699680695
15923784093508190695
11982529865998770226
1779624071008043590
13729835828178652106
4899371387835633681
9302514616115083981
11186063709961329089
6752216943664571981
17477450998008376077
3128043861452740990
603800635003780169
578632051564987212
3525388992519917043
14775127605269414518
17290991340668357231
1142104679197000358
661864967579742594
17227649846751758967
6843198997831922695
18019355406790638975
14834257354262711769
7123964052736342542
8748681894300266840
10367441074290314011
9840207814889346985
17358522971118812335
11173459448486289037
12491220470807797430
2113820440908572158
4587589535920235949
6796736957048457696
6725166713774778759
7614642826723278423
6303935495324851701
3893608198033392265
3814847370826333592
18067059293465904669
1106218759348811558
17944744109210233064
729577929082043605
1791562590548565819
16110915047770022504
7650180424035864696
17316410479402739876
2557578841514868274
12236945689636128323
9793092308678732522
3053579305608852622
2037524574354789645
18356346237449553432
6895755891453216702
15278784925442610033
7741388607621169538
15080832926040060544
12331511114380684018
14667004205940743615
15786931652622195977
13058314833405557383
16816199099620296772
5480288541366243035
12054091061977243301
456758730325319250
10015851046015348457
9498538174466269503
4553670514763683140
7612643830718559721
1537851684852690007
17623988552885978535
15492103378925319680
5729500254064506307
18082753223449915811
6468256130268165278
16702277359113358419
4975877360858412059
7052808560106447974
561339543551773937
2634010063631075739
15044832385391843093
5254927583731337438
16139422430982064570
10158108595535097942
6648976187838191167
10430728171687923494
11383869676559437662
5029520981616634815
7008755903864992250
14325178949366187488
13238151510944437098
9994981866123233528
14855104057865071027
13388683833883542265
1404755219644435937
1751052177062758177
17282371072644342341
15327541219995187552
17210933966371372250
8427994464031207684
14491074615313793891
12166708172797889864
7795571022554718442
2848124898191936270
13073781207571188491
10226437172389362202
15399112058879006610
5059159885769759172
7343233402684916810
2962201590828145906
9590612130434450319
13241126729749919541
13694897990203571174
3526152711561739647
952073322291295437
17961096681917551050
13153522759144445889
5798055711420156007
7218902309195362653
12745453441983155648
13902570852990529634
9686696793951822982
18370169524482463752
1487180280167043759
8041479943137190587
8197726202857310062
14928871000275535597
10814430563743076081
2833933949201378232
16234311024129480987
17219908860198389217
3011265658066712524
7896577301731332969
11387032036102266799
14102769349880638796
3964479802863542127
17556599267448010470
7541387647795331383
15475842481779570550
10731271226269216580
12628865618903808905
6139457429443091969
10960882686308637266
11601462396334460714
1839139241041486425
7257008864054703912
13193653977804209447
4409544623490886986
13162529662392769427
5927719683331976395
3557283612699903580
13703105568403905570
11379128706198378597
15863209204615495986
7440474343478960828
1890929151822452123
10516552631625585780
4977327283439369031
11980486626243279433
4894629063809964413
3865253563002294618
2525813954191957713
18371619414053506816
6214548114654295829
5795272324508037651
2445104326018494084
16732952053401626447
5206943638063402469
16265697735207718240
3417528958021458571
12975610044733978941
6050856727115360509
15549878563340353549
2001339334766524902
589399041100564511
4666074054028728789
12610204061373736098
494609810686180644
5447766120181255420
114492311168072360
14247625159725837914
5496201411719684492
17160249918655285082
11312306261004666922
1862399599986074174
15055277115026934567
17603920983641763416
9628847071669774468
8648011225207315649
14312379723369725422
2496306075770465549
17067819286011782188
11629820619519170221
3588459972613925535
1705211980505113673
16762523931519581508
10737417971589660460
716623209738740552
15301809780424659307
8064201638912904153
14793238490884555279
4079104457021862303
17307534990209556263
13951498240460309419
2099160610503455716
7005646584384242860
1539071115383368999
799325264913259398
6998522217440368613
5938129833144221405
15977144533299735152
9711282286987660511
14597371628962298518
2118875897073868979
9193192433659398851
12349073930688650062
13932368179691562024
1922995864265558017
349175694093835032
4215523935549933081
9446734525530739579
12298571110350176794
2241318368345707829
4719942348388086458
8407410899016493124
15380790974400552373
10780672929226546574
7926170682954210199
12409307469426949965
7279947129820021974
18103370070457514620
1545748835555624416
14451160557422174074
18076275076149743818
10485016715405925384
3134032151411792400
7149506235454261978
3238598966708789106
5093280401571969483
7134474746133606563
13480003443571643800
15765201779125659199
1052596627541033766
13505018785345357756
7270641548653962145
2700181435289245871
6107781751729535301
7260046083757448721
14800882794950865440
5200615822537085575
6366294158886780693
9927094618907441362
13216100458611257857
12476201829059740837
17044597768798391717
5023563242453945354
9747309772542065203
9569801708073302435
12972908527759680898
3837191031535451551
3704404972126093379
17216861388208835590
4371835669696892914
2382644385687526973
16673620083541558549
15926825013130640495
5119989549544378979
3084281644617320508
12134156944020148703
1691671436515606336
9925634054151381909
11035483471288482504
1470130401073103094
8475950426767803826
9979232666136756598
17785662858401941718
10236407640371150521
3522101495558523178
2906118899565209061
16969598090320184595
11009662230098592390
17664569204519469618
9831121925783033064
1104978598601332338
430649717360290018
12436719136806894535
6147006426634666479
12878628868192174906
12629733456043428833
2133380087560274740
6423291063267190624
5646117973041790321
6690520061822491789
6196748444916916810
6868907619032746030
10419698507465224410
7578924754740010439
16263924498209187039
17153811928200947150
12653696491945188735
15006003239253802594
477379265811711457
5215778064014381334
5583972578064877093
16721156326081793613
14173960408661702913
13842990360525640598
13261351816688237698
2924484990843149142
15460611449321921853
7020907054769687502
5000355727502345792
2378292627372123686
12650918653501267
8150480413986898132
16345023128634041992
5439652219497854
17824600625850819865
13692237606027235662
13467315128445840421
3740445483565059823
18307570993856727488
3455906178039114106
8636248911998104690
16263421091572155801
1551792649086678205
7054011196337010257
17900524610824303707
922078369736870333
11625126825294858284
9318057685861647833
17526345900640356291
16076771292281126389
6530274127131258135
4193953745505248000
11763683719243488767
4430131797963281665
1079817305417252148
12636069929676403511
7062304169419111723
9911991950704985495
11126948767782844702
17970436686901618043
16433234512508577713
14503363992047836142
10558071807415610010
16046330711038523225
5735761582809677651
8345398642441940452
12998582031460830356
16574794996301818609
4375652349917238546
8008379871380158994
8530634549749179583
8997629757496069770
2839437817450987352
3321113637448678530
17455987166046900804
15191448169967809010
10290162149688774956
7983689866305945296
15632708747444274604
5472932564194080246
17374647064134847725
13120231437122899735
10023169429098069515
16381185354067302999
2479735589994161741
4330126125365031290
12948024071888227496
4396929939202348079
1231097926237916233
10808159670144736009
7643353866694692976
11462466285272864414
963713441111153910
760828118539923654
17669045215068905958
7776111079177573056
310777361849106795
8524611887276791508
8325595684605605393
5817439559009734032
5697204263654444347
3785088883664778004
2916697913127091501
14272060831742792043
6361876051637709789
5212415694590147160
4429899099816260191
6566058289137590473
16273768746108040356
8796447306099745300
11724236963005827989
14461184400537095211
18056323349576055839
8522519153333683550
14559475691367743160
929718047577267059
9265940574281317560
13439127268097928266
10974661560262265764
5745199509975308915
2303637905369731428
13798625029067608127
14570528327398540979
13903459001206053141
12472796036947604484
16400036097096400701
7853624192080471928
17556517250120741418
12585548922041978630
14699324822050553603
6247031645266403605
6212291922626751455
13414988140408624113
9735925535663508359
9177126036076591439
15198620432534955013
13349379069760604123
2965037428621990078
10710777996449962154
17569555293609564414
2756811835614387575
9488236098370319234
12945631796188912447
8319528108931319823
2946461033474768016
2650688537286143406
2689981581037678554
7835073437651980894
3660605034142291198
3285717728537625271
16580557843113484199
10436137325523930968
18345781860920406256
11435804917532373956
2986669465909557668
5076452216877218413
8195843935835767436
3673881661095829638
15170586395365004956
14182716129989584521
14864089095957249496
1570837452751946810
10994476047017175891
5318707510335384671
5159007752045056315
2389992823041645015
11569105592668401070
10751275815498968774
12142334935692588674
8118005168082358345
15194795010009620114
17577183266491063996
1439148870364617226
11955442665200767523
9359265163852402442
11758316798560566360
14503739627470593892
9116498679053876522
16479868901495097019
2112645945753985528
9311679020175697063
7130959809044218232
1312067615642477927
14951977989407322350
10462411552902077221
14803072729925716320
11658992310707777281
10835653457794615593
8023441095601271940
8532294574935931318
9888776228385804697
17057483671320237269
7963466567614127420
8309367242379697887
11414433927280029269
2326973603001393665
602394350717843212
11326218193575048835
18116129117131086262
13564606498536258420
667659619127853060
4704573208608869729
10465698732076089184
6704027661204345052
117458432396962726
9230971234839597965
1303247252890532126
16842457510010893748
14717912490465898618
9541403516769024425
10562507611529268502
1960968428340784092
5254927583731337438
12115078775557668575
3779480430769090489
15724525404529198483
17009921026585637314
2056309640419992736
13804491873511901702
16156538616693001128
13680849466821682295
2607832993626558004
7823328067258628015
3659260103241791521
9897874727601829468
15658957156498876380
661864967579742594
13510442832999295494
15610348170178117448
7951888287065581683
3888817461037488554
17531843596019503509
7134006060039176042
16910959392503338203
8539596622052487224
11698835657667933399
14971677401887196868
2068817953143129486
7719638840806268929
5473389415191369351
2810985040786899602
7140970782786717759
11489163479872785580
11005962146065493210
9333738276189937276
14041909985417261008
18083923800302639795
5617957928704373661
12381764322357404691
13404826377443106566
15682952486544923440
14312158968224832205
16774830952835813068
3567573318103235019
12073996261861600729
2671937858843578934
6757923483102540240
8985742934919715127
10259891798535693125
2834932863034803183
11929224377631002419
10445253756698472
18219559565866083394
17621349792600218126
2933618839871883608
8214987976558631155
3229578769404233457
7763179771981094971
8405488170200668955
14572566962524856076
18403086151514705979
13889576930692494684
39033485076119984
10398644738803113564
3123382004457761770
17348069791173232355
18215167286919466252
11005962146065493210
5990815123951391747
9012846000154801352
17542582883120954292
1260141140645412178
11801631084021275143
12389445117747889920
4666520526711046838
9188920841732089086
15158519384777937800
6270701034091689505
14232968509670334
14382251187754020635
3115713874633833687
11248004212680386636
11461508478986239723
4555593064912999363
5023194609106177444
16943820117049461347
2993281334006787889
8585187321889160552
4699659876842061539
2335271866586086492
15704941582519027869
4646370136966623610
17719462479526500154
14862581021587731888
4667340211623342011
15888294888673179185
2601369390943522247
884321528290968776
1616651422401810926
12984127465480103876
16250172505400443933
4394134438080674494
8023709185118947307
14182716129989584521
17012381682863233398
12164261643217295774
9868989808589914673
6745007220820726128
4878476243524909741
12828326443644169422
10731271226269216580
9421676877508943778
800857523808831093
17783003789219881861
11952618308167049089
11886036443304612834
1880659324732673351
7613242356210034453
8257736826523435945
1525613069594234685
10056275450866050380
3863613738506447833
185250761715279778
8355693810356350169
7758388643793597955
11734497748721594950
6016053418263048535
3382695877707424345
7783851456214662614
13637760542483778621
8339548701890409788
4781102654410718982
9192281843548103188
10024029150976503794
7123483956791095277
1406833347486841479
12208162942681811321
2925640908677184068
8559986335776750091
11998982220095062736
1867278674012661125
5980452431533076414
12786603737616922265
4391725488681149407
2514037321826491017
8690025448682997981
1518543659868642359
11889287549030188180
6077874994014072119
12254798167990331568
6276629007770663522
13012000916665696667
11865014239361525217
15736741123922638130
6530932447494959214
3995990936028920590
11345351196152061165
15694356453558378743
3477001680218503192
6736034056292109860
8667377259806477547
4004768222927699542
14597114128109532779
10980276405057296134
17321943981653663938
8170537887805590803
14924548970469532925
15300319063941439023
12111809612796852644
15466509322122603984
13824339635609032009
5607208783085641172
13576480678754397955
15359033654149226066
8762716803345010692
6949323475830076741
12037160098346246090
3313089424187063460
12225315746289939147
16105577804284925158
4463404723530037587
12081134389651739979
5091211906645214560
14561332208939456831
13144100591692962440
12416237175343371804
7436414658966690195
5005117584068138741
12821268210982511550
7195713364820485606
12747427433346771017
17425233090456592715
12280284161983475515
15845737715369355080
5792619485770166561
11824305125616343054
14910591409478770504
16016645509241507917
18193189872413836801
14791085000766218241
8681144277303010509
17039938375370962616
7467559151233985643
7763469924867193637
1985080322759983586
5902757476974301596
12695769338949701714
8798938274853518066
5736516153833537067
10327835851051028320
13193755041005798564
491177911681605752
12333365806768137732
18423607523052477580
4571040147889804988
1958376386903356434
14010446547038633511
13225178241182043469
14924170036066137175
2058539246428270392
2735109764353599551
16360108222797411141
3760148830219105626
6310608112759839552
6715998042131505833
1891566158087173731
4646862896883247533
11059476909794312940
14425289427973041355
11616496690328546879
2335271866586086492
8122970060722118771
767107670802736080
10412054975271165657
5453917572982932169
16762570776506816412
2022971660828729865
4385014454822579458
13784431604827168147
4882646585316842697
7136833185832477871
17330403580344403408
10172306664461830073
13915315579177206521
8689979354698919310
5451355090686942417
10492174919841101289
15751305630680763797
8793996208038611013
16796625289615017494
6601009842684272754
9198241425849607620
10815452863258259342
1840731413781765902
2054616806174969096
6280460645626878813
8162335900231845547
12413244037653872094
16533475630462192456
738825372586140051
4290956364698345525
7382198090326843437
5114051058207735187
1812195389759232482
17069410936929580562
5993856626611489899
5591080492137782143
16349753797083521465
16183840176961302715
3157569754426249124
4612647124675320285
2851432950945245058
10416141460677819459
16035283549058341190
5067884441784025301
7679839664027578910
5700795453020390233
2752469427072474715
10011316204743505067
17424473094171348071
7894454422302236940
18037910326905526523
6785642929145938781
2576129022083497589
9046272642167433139
1188579611328643233
13909170214415280875
16729323486609451559
5373370471537616148
6035631692618830439
9456556491452215581
12052729189143195939
5716983583095821729
9012846000154801352
15193579631380282889
17429100430299452245
17501417300662509576
8407431456187495762
17324775735765758958
16102918872562035977
10127341150644473684
4196776173550635904
17777648987796919462
12504263206582553380
11770763403560277409
16201963762232020169
2975862790175518183
13744406523179921275
11523242716246002599
3467185983422446874
12684685325973300905
4253329946215272530
14800960596288263228
17441699098541914948
7381236086022320641
10088199924069210029
11834129626735838654
11003850892147169556
6233098432593858421
10547183264912262562
2491844703238075002
5725465454712978319
5551405411879655223
10846174515266323517
13150435678457077294
9363728576480379270
16316597180145620368
12175802680378583957
15844741723651388263
3597366304701209927
5773097153320206014
8916788406830255526
12237819110608923915
3445057090273837338
5315668325578605504
9559531031761643507
12196090592742328228
16996741473368862448
4612138343770350861
17534208526087055247
4002422272041320992
6569230419499488390
4342298502028476335
7851692570211838261
2179168282310163452
16332834192167630033
12789625372988331296
7827679016620778386
17533332552267492059
3955837149706683949
9899923394743179138
13208799016288069201
10929488199040174128
11455591038119682133
100384076492967461
15833882314655552614
15897900819287007581
8470070636210653733
4977237561352848608
17956995654211419027
15565174974229636824
3647161871885124807
6514837438705709501
11445234484708126026
15358880444430560874
17741220254406149309
11979437837046106983
16933700641351363752
6406626153897239170
11795287063647148077
9230971234839597965
5172957657746084908
12781319907986783260
17206530954869298208
16425998698211312271
15188241520066508096
17428919516951959130
13902869055867536375
16692103384613028257
12422894965348612308
9765131671805198916
2924484990843149142
574929933700710396
16139084769255512573
9455763178180447579
8875308092708894784
11176299997982893085
8053369115904842131
1787442879607483489
2925640908677184068
3301424365747090490
9520566171229515221
1957833100793430810
2525813954191957713
1754969299475426039
17213882209503444852
11968245821514747334
4336940643743493603
11542842787890663367
10686426838751491049
5930501203554320740
12167155554393078056
7153719026325935522
7914570151299486991
477017734490163461
17876514749597024994
17117510349379773692
15709573819266429974
7111180640487082025
16257382875906252671
15713568456719534280
9554886096184934272
7947024723706855557
7823513224266955224
6470357563898968873
4488734793195029639
1685455958204922961
2601454506369326803
1900408659240558906
6757476953127772528
11830350391292326570
12391529206304563408
14455759643374367627
753000771350930851
9729122058075625440
426843250260881410
4909693062022507927
16736777843524721373
13562011252413579654
8533316222034060106
14261413424768251132
3999330844246270338
13884379403491974952
4375652349917238546
18052850851626622257
2496306075770465549
17945168697861681026
12053048794179856894
2617885913636748228
17614764978590854344
7764152852215584507
8755222394700166626
13710619140416846291
16659313059727896049
9746034687256946599
1404755219644435937
6583233237940298474
5803709518481345843
13596657164971300343
18131216709846412362
8143134025833656226
15810617950910229419
9331021337727644560
6016053418263048535
1096730130432804805
13170158401061119608
14831186394742353263
7156876110094609913
7715583375122285577
8187625797350553970
2702050204428717308
1326982472242840407
14270132964567426299
13032316100081014746
5587389729688607489
9557507956659746700
5845088577016160077
177053830718852901
6655214394311657318
14423824349302834036
14156088754035226735
7743664455319762315
18074392507455389783
525605073677544750
8161336252187423171
15838886960453594614
7749409507418051037
10744826821718727520
12216967752349282137
10103526973492423554
14651653157331808981
13102908184891268672
8108369767510631207
5533981769586990593
13568522640819949525
2517271880894300337
5800548105665827171
4801745846211149975
16459219961864939673
13121188592175984711
5011715128729472859
4823466991610600145
2126832155069424368
11638097234298026636
13348909916748672406
7832282556996566883
15096494227030089579
11857076760390642403
7279463107747304025
7420085752422620246
10245894916771624615
15885540506678917319
15194795010009620114
4884894195264582976
13447067903019977459
4811300029309799318
15735845448086380450
13065600209115765068
7344957653646740999
561887390485012142
16638818276881337441
6530274127131258135
5844749401749425801
15514365491500731748
1846549560524757316
2768583925208526302
4069695786755924649
14234716252033302978
16767862013479328748
13938122074403537035
9154831755213836411
349828455523589225
2750338564895308892
15737210243667059626
2660458952984080447
15926825013130640495
8936520929311547303
10928857691045206286
905140352409187283
3091939383400999999
11462309229550864720
6541265831056447677
4459161718336039808
17036422299712457113
15067497455739836860
11229928094314816179
701280827470541342
14683396937249943974
10113523182426872093
17915611371057276688
2554323275096941797
12790794875664619048
1955590705678543978
14053724190065752200
15288008850310671011
13576183877131743047
5443192322657767612
3284872058545146289
2642058242308624824
2833933949201378232
886145686728613479
7620748694074838694
1273259516166641732
11473151371107808972
13990284671012890592
2469838066249038299
6779176625068449069
6725175359317270670
16743160103200188419
8870455428705968728
10677461517945542925
18370169524482463752
11538207713927098586
9583214786255183131
5477861031872178670
6281273492885290448
14422704260780840200
17193888120164658527
16922817131227610817
6813571923832436025
12220353232036644250
3168976593510273474
11218866860512751646
5533981769586990593
16288636616561036370
8768407081960479498
2939085181017355441
14641136386810472762
9281981575139870146
12360879013630923437
2260217546573200561
466683895198402101
18371553758611051959
7664868072822881390
11548192571854650567
706887455683360300
15522658370414750531
9104576090249274653
751401328641141437
509269483460457595
8814693194751226713
7271884638387845663
5062143164814524305
7913041269614602272
15231454395938292260
8977522943482117465
12627006486082370810
9569801708073302435
2240729809891753003
11828776583358509094
2110514294718467932
13657423573830161446
2982231841747287323
10244192098775740627
13563957296597228045
618546680790133196
6292749921445668149
8363551000426413142
13422895052038226368
9189324121673496112
14654067621887397494
14381667063807041436
13508271643373057762
9180589457704661795
13656600816185110031
5354443163434711610
8321498680799606930
4699938055280436093
4853021516196807734
14651653157331808981
10388101636166176200
2037446055821832572
17430563423718216937
13520247816010460974
8291622727971720453
934176171864525950
1312524122003452261
14412372446375226715
4261180921715457685
17710896156854165072
16020272116339116258
3279884555964004485
17634856203779677109
5297200482686630977
926468937278903384
8683101056933411739
9283749369479903544
10023145889107537938
8714844664951466223
14829671482196012880
15036340732492574286
1689395829926777799
17421029076341168479
6465814152452001347
9869746207154218468
10149545045677696666
164897249633784033
6728267295768155001
10200107661441820195
9171358940566793713
15184978550294256807
5928242029205298135
18173561656462020693
4125580803312587390
9112492076800453980
4333165536194748067
3371673549585833450
16612939250725448470
8787272954048723856
13113767715940485586
3020549586974155431
16469784778470942702
13367691756441682341
6381656848848947085
597897846136762883
13584181953401935723
14569965583877694562
11448234117341615039
3293441915994385460
4310451261733425004
185280358154807221
1147253370324508047
6230167383661604407
9517932671247342288
1751522412228803989
3437474301135176417
17530655888341620260
5652166159779397612
7567656272468367643
10699704696444055349
1061769337375467229
9133301292808148398
143019830663439604
11254129733905647985
16630678373998151520
8740530469591545421
17532010835487570192
11514801442648597842
1000397254495042565
7781895987714430096
4039930203221884183
3181829525956153399
4543381494375307018
11721044486429273487
12871767632880267759
2737310413673734095
7100501623911451825
13834712279797741037
9043644435238844936
11952618308167049089
8991596628572381387
15352380353468275846
7141536898648046437
9629645896159244239
1861835248924852644
8657505885658228262
1720543413794118741
15977358788769139233
15596813912960889455
6470357563898968873
2985428233356392927
16111401518294189961
9000229713547470589
5708117654504342064
13867201682284436322
1885490084088585284
1031230234184664678
14173960408661702913
12176086886948999627
11509303017699976411
5851238723280970133
3181829525956153399
4475012019951967548
15564937377805532263
5152521400174793002
12060418855541795500
1553862782870374759
17492761589929535495
3582402652011661108
6859115509938049182
850699889917048985
15646304756369878699
12610343981955807151
1421173689471691218
15011766004633027403
17711059704581460090
4733269084491180130
9743136408661204819
1159888091038791991
18131343984605219969
6487929067505316332
5314811031964818846
17209087404859916881
9064963144072344889
12012569736474677812
14367512394981503186
13007894296728061420
3832960521714447936
11342076202821805099
1977756850518431247
1485182793244233185
11777715807617542983
10598566078909826547
12497026230158285587
6623380976373292029
3998370278572308568
7279947129820021974
5447603431030601494
11538207713927098586
15210956367548530370
3517064603117319739
18369036212838404689
3032603954284521176
4646765567637491969
3425942349794067789
11126948767782844702
7504306147291093207
13627741743924314269
17876514749597024994
8465454918509538139
5678209021720941012
10751275815498968774
1346214739153447178
14861061992441764422
1299863275304855645
15602783378665211018
10839993423269324181
12533944066478200584
5945759401129735697
8397232198996257501
2563793006624515095
4072250039901499431
9989365439952533442
1007200021423146052
14066921255481015120
16619862902662175495
2889563323119114310
18116129117131086262
17540441034209800924
13640032274705201965
165485341210163322
3355712671651170457
14864194483343939899
12394053478942489110
12153370341302206901
17975811501502182606
18266185650625509615
6837398743538591866
251441926727679765
3522497903137405073
13810302091905574533
5603557411307373692
9616089861543640946
7750172546859908813
10609828078547430052
469672818808383519
8887216312376713071
822375074938868519
6899646372059622847
14770502669213815317
14686845654500599538
13113912694560926998
3493719666075232441
14526955560812079445
10520651367223629203
9160382268526763997
6106131075209099054
11430557270312676454
11449381731851681287
14502929161395031750
16507436111319540680
16684654738994626924
14813738382071115824
14079022398270775510
5824607467466632327
13310352905789519184
8737105576138085752
267934469722184177
8197726202857310062
6139794438658268608
17719462479526500154
9602691899341810804
15790888908179783900
8683119908149988007
3117544576648116399
3525388992519917043
10603932884885017326
12182550381933777423
1828704507629611788
10256719238529004659
2920467764947888621
2706724710654274423
7110606169110564283
5937220396445439887
12433853123335157554
8396704552133666000
14610894555359348434
3959553131359034177
15009126464697208336
14335193942807415369
8029142023571048479
18262877724007580607
5416281085780045334
11755062424194605579
7753747471565835002
11435804917532373956
9109146359590558319
11923932004591693680
5174228918914143705
12236419883493569392
8452384648954476885
8552966243049957434
13821042261644924195
13310352905789519184
2436574728528211431
6963077285580506956
9046272642167433139
431909101629403241
3278119694089950064
5247281516536955742
12615097682920201780
12655044169054620870
8083137702765883630
13245662954029787742
18104349756507147895
6207540811485628564
1598448895427611708
4918167680412789018
18120062436946806680
75576306532669618
11102977964652954463
15663746086902308913
9411534442477850892
16572290095526714986
12420199657810103727
8434565279220671500
18022682054880634797
1539071115383368999
16520664653548093547
9558478293281319053
17237699648500363065
14667599366443403498
10895105236672640405
9604848504605885852
4171089623731442848
16702473268422910616
1749119696752366592
12280284161983475515
17904218639497994011
3278815525578941821
6868907619032746030
15783034488315598768
2907713320783999131
3580903147364113701
13052591383085694226
390533303037226174
7436414658966690195
17877343976617093443
4125482166434248872
5063291165723595766
7266862051078878453
16304798386782027492
13919241012632096773
18259730237980192180
12540247791402368537
15878562320910760569
7549897366842867041
2962439647579749906
2045830408128119402
8174518561559861373
11845357336131491829
15926798316787518202
13823558881464414479
17853550431263983815
16698200607366380052
6720081779873394801
16704432177570915735
7544198339498694860
15637850563274996758
14466148254943156045
15407317856275431101
3556874557414750363
12883227476141420584
552633528442390520
7422747308397745685
14845116573907907728
14013366998308903881
9255053011877581507
6378660855538406541
2767451637429668228
10656178043848148953
6795061819466993928
12340714501123494459
3889302001110941125
665185768437851432
12144159904406125979
12948596384794058555
10543963507961964296
754172930320912447
11250369598985965557
18082223490421321982
17892033338613346354
1257365004112976901
6527694422784367147
8938844185916196483
10855597993103771317
16263888549194907021
15088304755337792953
1981255008781185520
6034142651429273579
14871893514033862522
16784140386560957624
3740554745241086972
13229443125107231799
1325964133856689768
6929972456156375907
16782976482439699647
3751442393314989019
9519027888258751813
5011114552863517014
7703679526146141223
8702830561245705634
2506521831527123557
15147926383100312682
4711083342202851914
12218807219904996715
1524295522360257599
5476284555389779001
17646875767125599393
13607461644970741473
2653822828166335040
12381438988870758048
10675696802074496976
6206825546361676762
6115090376490608986
16651371786178299679
6815627460838659012
15875891504300200463
12368362934760558196
8864832226496750235
12354918616403130843
5425489462398726573
2661834271291623969
1608638869068696557
14810970791399796513
820674564903005788
17748503125419825258
10440963074548769013
10374538614508675729
16148421260739053955
9052956889385879969
8458176843839112802
7496342752547084973
18443582816141476096
8704758505879271535
1151720988337338126
16094315188118949301
15959667987899755220
8070876262113975473
3244020065734105922
718931799378362985
7935796528269614297
7081784969753343430
3731055254099289474
15946178246992242506
564049118347937212
17625587130180253314
2723352677502249106
18390875543502894132
2624071890399235284
7803029644386054433
11248581254526180716
15563301938119732536
4676754000472284520
5502306080318434042
6593919290564588438
12317891137496144190
13813478904735061154
9949385154012309995
1335227292523191798
13227816907312680055
10287959317997817084
5599479989898605235
12429309935960936386
13272156547778583867
13741702909764245828
10664876608758315103
1456094068145579675
6615509269635389442
8741526973612482999
2915095815996143605
7420067656436729450
5774092032995124696
11151263715525598417
7736852407040078686
12690238507145852765
2362433953599687252
2345238395920707006
3437474301135176417
9196467138015357693
9068328692502145881
8737553391232578551
15442568703456225247
10204994756481619007
16882226717684491202
16443344311964435942
17377285940888651698
9207056885708047524
10470676407929654513
15914273519893413220
5521857770464685779
12320625609565566296
6606479147339594817
13832110904471386281
2628535958322936952
12857716478265603902
17543107119886977045
11699916884094843837
1955642624057478971
14979239692466710652
1517298419798250310
3395124268628573714
3257534462972248898
9043546042496777231
6889594347208677572
4195655949879663122
9097874486041506345
13815155635020780874
9404070187180994222
2122197885785145497
8214831544388552564
5005835208297368580
9199862350467116311
12743266896775625147
8978867021110162562
4553670514763683140
4839156821483365451
9807201085565491982
17179462853181559816
2978575776728879752
16473378930796384604
5644137499384205230
4586333965747321288
13926397878952327256
8291622727971720453
17978349869923454277
7750172546859908813
11661456873031041259
13638784265662907055
2654662336318153625
1804101675485052258
7940101177627558659
7620748694074838694
277628002352607872
16320104504872301649
14797164258751282284
4210449922358792797
5915098909266812218
8971463316959603975
9590951681523654861
16743160103200188419
5730244331288784577
16722032087721919020
4791304164880444912
12836939292822856347
12788791805881853272
12474888395822257522
11445920516729413708
13741702909764245828
852684303915887687
11643608906991658710
13176584028382530775
7141872010628359556
3021877260795065824
15570332903227677278
5192652367207111203
15032344642504493339
7724163810817759304
15399112058879006610
8488828994353338291
7117365419411251528
13014780788566459630
13796224114866544097
13545211032508856246
6919169290888527793
17804605157226121269
6737722112436848575
10768970218298922755
15970032088146308792
9587213407092814769
13659955540385927809
8526720948009706770
12076850203733776848
3453776001711752753
14470836559221475559
5532508482842805304
9194624639823663345
13631061828454721853
4255399506083803986
4498757651799465709
17113030484822690883
7114120368535207686
16289620874615326238
15162371359709637319
10561153641499424797
14178317669330152338
7957969245418471862
4543381494375307018
17808814823170099480
6062583236200827251
7633676009810743258
14895662201111632043
12208162942681811321
5593695366477891188
7230660918750078566
9184648803263461704
17638002699639979106
9041341377874582773
16405492462119019894
5531539347078950013
312387846484700601
8846049892774005508
3857475034417481701
15331574922420912903
16041911026278217346
17137748493630504386
11433047015663472788
5095682716689385006
16486799095039082525
1476574489053771350
16930359168852808809
4274477716847058967
17904877246139315136
16911058947853703193
4158566641517688620
4981809828309522868
8017263397783113045
13562011252413579654
3483747011437719395
6776790654811711335
16660383508731243233
1010948181029915916
424678892269867869
13503124150487661384
4391508797162728460
11305945662022898874
292097966495803465
15345725434995900412
16451584398401037691
1126389132112917068
18383630854760582799
13286426583297405729
4050334060980875869
754041173107222884
3878020880530744950
7260046083757448721
5042418534868185438
11595087669307771791
9632042806602912266
14368231957005610912
10730444554245431722
16948330219183509481
3309251642737397842
1570363986982570315
10426589218910747457
14206499685988491056
15508709154161903111
9894808659314673215
13152392770153234967
11494211030306399720
10081431217518753048
2157244319030360442
11564766907702385426
1077659242831232163
8950046202132225703
12891232062361298949
16702277359113358419
6996654206467760985
11065248528909859268
11517224359673495319
1659571244505098005
684608817604547691
14496861509853076601
792475605585972421
1236544842276088810
8025446195770047446
8773590407081495331
15197186934349332171
11983464496683801624
5300945965908797239
6740121843070026898
7861320491091728359
5800548105665827171
4926015247913622563
16448162068280907833
18263250829669017836
16249551865518587637
14009693583573247704
15519276584420910523
13889380295782680862
12534451424526152649
11313675203740871179
12030698790184649653
59457088832460229
10275893639937853274
8023441095601271940
3299700162760957922
10737417971589660460
16460140301321496162
1800671857144332878
1470130401073103094
8188702016007028475
6131510748576652475
10376816630955602565
4046368573992709830
2913904492564002291
15455439669377980321
13366419655154151518
7042743113063285602
719786535099457142
4365577752203594498
2976238452082949403
12710068903588525191
9014049988766586497
15638586707020213502
16615901554591043617
15018709018695495396
4047930318561921837
4353645559055281729
7332431759578467882
12907369029534379014
3610000840753826543
6573184040647626954
5542124340464565685
48957410564769028
9794598996045580266
7236285269602950415
8597552716632901882
3902639792974818886
6813571923832436025
13977700398161735777
10683540940094219133
8742020013877659941
12170935133309034184
6511074577804868113
589399041100564511
3050522070442745221
1891929659070279234
1437915755268530755
112549307299890366
13227816907312680055
4255399506083803986
3753798980697544541
7269540128078716221
8791135087270497909
5599706262051671184
778805089897817544
5728032432300918145
4337703199552336954
16152423081206570879
2605959523767019034
6470947202872026205
12807890093253221212
7377439879156041975
7011990499285628475
2535331854622523066
1861570217754133639
12606979892540176963
17787854812868477248
10980795810985972841
999694281642359548
1123852686451063019
6464514352147505310
5076036065801942017
11108604271732883327
17247376297449526990
9840207814889346985
456758730325319250
15735845448086380450
16763544657859224366
12972908527759680898
14862581021587731888
14621340669769748276
778481422229078962
911581710896579296
5300388162591909345
13894412207604539661
15955196303791553351
4989735446151055469
12041922375619867163
11366065067875177340
2934338354724788515
5062190907226633786
1585740375137476671
9273383611215959648
13850596937522056508
8681479284275966572
3728482408625645057
15260397471841274116
15444142472578209816
7490113694725386254
2685505212397200457
15923787141582045935
2089953942494166233
4649880856783137489
1490389339197715273
12983601251374943834
8639366506093276749
12301048493360262365
18294321584719702043
16385257837331041127
1759897170707363873
6552977300783547659
645058298102214573
1221379004191916043
3902763513217036702
11975808655962601615
10513960618656733316
11391885908047523765
4420996909324711018
9452365211132825389
14425289427973041355
8955378152644970054
16910959392503338203
8843794858863982663
14295437827860550798
13858825709932731779
3956246364796326236
2627930676495953937
3038503310048131073
9822430106444383919
8972520272316106082
3180497229130793356
816297177277304268
17266024661952859068
9983794587885521064
7414978604647541239
12654975672887243321
10812309604452042481
9838017266908461425
8823486493110143601
10625116666215912006
16741207462072209399
9060237507415631696
8354673248134829883
15658957156498876380
15682952486544923440
5229571334038984654
5121988962387618031
667659619127853060
4202786888034586683
10220936406614071486
11790568407825430560
11495629679389284488
10631023308179798172
11437471320737271719
17493743561977970753
3065378661418762806
16172010069175982337
5519138907214851929
281520586087823064
9268262412985020327
6193690939462948735
13375114291985568560
14050531077534344971
17214168002765959272
589440217112064854
15290802916718900828
9113529369850719420
10430260503586736915
10931880506002241616
14871893514033862522
2605464835748926854
16913723711152431695
2342172068312783302
6349476291605604752
6669649789844295071
4365625970229860704
16884434276278296451
6099039060808011571
1123852686451063019
10204174796404595149
3528778277023303689
9986120386215028993
17393927669786148930
12417281657022684012
2450087513924848413
1622552155693969949
7928042517556734920
4606093462953809932
2025036480346181736
16470470271223906519
8432281160725374598
11608124290252891188
4646488506069888414
10213652582397149993
5556916879659426068
1920492306246998546
5972089473780190260
3882912681273177065
8558105518260449288
11268275953304602041
519839864774129012
12016448672105391411
8423823455829724943
1228332755606884694
14455759643374367627
3325071364556295184
11543439471308534851
5365749257447599185
11437471320737271719
3590011453018299353
6202688440650623466
16849444959830757529
18443067790954392363
6569230419499488390
9795472354135648325
7947024723706855557
13231057159260839880
13254000904102770980
10283215425977341500
7783851456214662614
17358522971118812335
14227003970446648763
10925238510132712090
10231203858713354515
7928042517556734920
11424319453394300699
13262813820704579911
1307132675799817448
16133001830720161821
1709426537052113212
5755401475059411286
3839103178425836484
7719638840806268929
9800871374365251384
10907831572143971558
7915489896893550642
17397559877777340534
9470881935527844647
15982879171223804755
9721056744604483328
3775471423706465305
11289787335146666073
8213315293091822292
14974725778912993749
10774047365211412893
3866213612773535109
2294680138908947920
5771334368405154666
13899825249574577400
14856167620669339410
1750065723947341757
14795597209536118568
2547180481474461073
7414978604647541239
8906422282574636645
9500020445162057414
3297442975506555530
520833151937192780
7528757605760298150
4239405413129793045
14895577362620784937
9865476702151052111
1126389132112917068
10459418760260376659
6399167761810143009
18425603494235092691
5955105497783333255
9302372111393202709
6898482623178588851
11221278622117458842
17358313365052240735
10445253756698472
8532294574935931318
17460081342691718934
17507426477215526829
15650773015890784586
11458309691684632733
38841874825718982
8055324425058806299
965366776590234352
14021957506924461656
8339239376455951730
8864654607073192937
12629733456043428833
3925675780616390764
9819166993050144622
1466570142892776535
13740060459903397918
1120745254586356461
6628880687953841185
3956615961198627894
12148978078911426874
9446516174940646482
10368993883094741795
18071744085148483560
17417694607380926611
12645551977680731424
722141004665369219
9557507956659746700
5011114552863517014
13727544290512172160
16152775583530296516
16763147287551726220
14575317824854100088
16030541830345684166
1340446170723960275
16214695542262001803
16020272116339116258
9198590746726727074
663299340113154010
10189968084046018245
18327021380133808278
4103065713697417353
8697220432188166124
6556471207600475727
4202786888034586683
9660796119612569819
9154985568680973734
12386398003397661735
364148883356239012
7871910997919099780
3115713874633833687
10326219172001448435
15633771496294694775
8719311181499350704
11655350942117242999
11443013878760314743
8146365165803162502
6592842889342214136
17045648032769244812
3790644552158709323
12962051892790824912
2514037321826491017
11498601343471586899
210298025280192070
3511108534181463632
1920568839628417420
707968055001599374
16528685411403513949
12396726560461891043
15927242381175999533
4827804292069643638
578752530742131630
17942963706226906974
2345001124231627267
18156849758194724958
7212952191320142457
15935576670110205463
9181925433223300107
6732329521391783550
9911408942834613922
3084575203050198083
7093568642586510136
7151786302216861095
13120231437122899735
11551077775707455770
2396698581433186755
17741943068216870673
11207898627407656574
4417013530628457156
3810244103382184483
14494934338432187648
1302064845070672319
12864667621645393904
5961665972682879894
3084575203050198083
9231871808819725148
11121160550377270658
1975159500515981452
6347948613932596146
14011001978430842119
10024029150976503794
9585274734213971900
8030110193502905653
5795874064982821998
15410083158220025958
9043546042496777231
4744408794771901587
3664075509573411749
12409835908278892901
16589702633475067087
16213298442287645336
4998477086011689265
13855208480493017745
10363882923154662236
14239157990226877553
5398290388619447260
1400419672026743389
16655495380638596187
14807339990197789418
3802060110676108911
16996777815047976848
16685939342579672273
11866615618041647236
1817487164037868926
17200379783766073156
8670853471134823121
9044972957365363276
1395462793612869249
12919457959537008830
12170935133309034184
13373963980570749003
15982775338373030252
3606256970209604106
5061109940844778606
17360664555396615616
4341856860340234575
17266024661952859068
13930185922687274919
17302344694427564718
11638183032908730188
5428369121097011569
4162277175067751447
14679298581959679857
5888694039022262897
1366641169432435725
11469773995871443146
17119764970377772659
17579781790598040800
9000229713547470589
15284605999820833956
12390729229778865134
10353933654441033836
563986740041635572
4214258999405083532
15762194486658191803
6954497324421721433
15974307718525827626
8694703430729554199
10954741197668243000
11790248140749946384
18123733525194227468
17548629095969382144
14780116598844675378
12182550381933777423
4838612009919366821
823415564412786543
12717712156741098111
7674885583914498436
3321113637448678530
9948661595979879827
8950562544413133306
18073476293338335765
3483148858510597739
2920594386202824039
2439671753956658922
9850058243774937436
14022220286287060497
10427065537361864937
8916557679176799471
561887390485012142
5700844870655777851
9918024891803763225
10759049523444411670
18365556381748794754
15155079960956177521
12719089239576022837
16816774630777509720
12424600750629086378
230969272525490209
14990399760536082727
11077146637125425279
2988424833690603428
11178082245625311375
10415615689892967717
7478286807622479717
10742061274711129153
18249489601511413376
10539464057382056221
17477450998008376077
5575707476855514428
13626165185132291319
7119093525620710940
1174407866668015805
11735402854662873442
492212060117053904
17015021360577276386
9100979589437120319
9063619454503307683
7539242659669432517
13369751642652635602
8407410899016493124
7062304169419111723
9052956889385879969
6602651918097020932
12295589613577500268
17700472086574207078
16035283549058341190
10257415254063834806
10535763134470275117
8791071045709777395
15213151340787309319
17179462853181559816
18150978664333495570
17253988888947043029
481429404789003452
2809233327648276382
2792465692209529398
6875516676191829139
15573572361549290863
9519509122616718107
1130628822381423034
7280036244651819885
11693905536455764155
15496975951641265527
11899528450577274392
15960784677545574745
12017949110242496090
7680936879666111512
3630334998361111565
5340530002653815495
14030210075470381690
4695558820011210323
16921190622061084551
72578787106782662
17446360339992911062
12953838391815437217
15076857764949547654
10354762484854216674
13140415027871275798
6728617815346554379
1687769384815721267
15602783378665211018
11342076202821805099
11138731892917993915
8752429295463825406
5247281516536955742
15246477472512587307
14971564413293701502
8188702016007028475
12442406735180567903
11733820121111864948
8977522943482117465
6171879751367973369
17877343976617093443
6882350861716238900
8886030858879446134
6832344248850620776
13096474681332339817
17243209106656946114
5141606151392068813
12524956808396141151
17248898952362240797
7315574421044494761
13998270066656018139
4022696209770861981
7670595039858430707
12107520990147052890
8863444795319011152
7349911860419284195
4976105138747440615
3959199428767199549
2338986522575928426
14156198624763805195
16528535167816700178
4975430107944343921
3042215614335372603
11525504284225445252
14559475691367743160
15308342646161764167
17550024067652137260
13331470196853977781
7482591977385050153
13555050284269480730
4890864497900889313
15776896697695669348
599924135341447101
11510203084053103635
2939085181017355441
7563406252612965189
293634704908324457
11258574898754999490
3043777201253511407
12225918088776982013
17314611712612507827
6574086393862529617
7110462516856664949
10470542824327691386
9748828197623532412
3564497361759348516
17428919516951959130
6871193780527183041
3163226888087608063
12823372931644506965
17318574744107052639
1008205359427064372
7198353362434055033
4113500306076431780
8505203471806341670
13763325729683965995
17228795833416603044
3940937224306470996
7309116448481825859
11957417998181866739
5730244331288784577
17969206723589310902
9387567162011720719
12086000010837700822
12180134105482379255
2523235780951910588
3359757733413956633
6820836000462863193
11263555027838906406
17396162778963428480
9295011244138265198
16638918733323812296
9793580557551062425
12683066142147166168
4835527511667370520
3217507432233878279
10492018583677376368
3677216090747676756
9540815985977848349
3537067906809916093
5708073435259288420
15417790537774057605
7708015999108787783
1993251265172381837
2011422995462318593
18019355406790638975
16421299637793291551
10221793442213742140
11390273655631067182
7809512832263517817
11147922037337410274
13273494027930288624
14712775166285803473
6482299896394625630
1749119696752366592
12601405667356331420
14408598604393266294
15877153087375226742
1658677712638109445
1094149792222986643
16016669480317137194
14858533626309199126
3080562649309717035
4528663706434723985
5840159527805093044
16434688243654932415
3095682005579675794
7152308972898953030
12814438266383364412
912444500454052640
16375291017096135549
14365030650538285993
8250880919248314941
4998973318438534794
1705926246253318354
2624521813750220030
4122578628792329259
13976047789860110245
3889302001110941125
15885665697433185397
11828255638218311191
9160382268526763997
14750364650168037337
6566058289137590473
1361952000944955902
16217016454080401173
3604574554726679637
17656854276197636210
2052951885748105498
12795076990329982431
4259427416220224795
18053352930551713298
7427559966900600808
14276510743474683052
14685643417248532325
107915393494433983
5107895830478281986
2981460650559446939
4459876873388523898
17805425953352328356
13880215855819101382
10214161221653817914
16293771381549635737
5929732804687836023
101371001981089658
8235284642450564793
14115188671574361396
11479730326014413149
12269616606805501542
7005089938403835
13106727635138899583
6653550767036171248
12367245952246978962
4423734111580468459
3084281644617320508
7644566783069015632
3399804547061382061
15816613701971669827
1685455958204922961
12520096053415708705
473689837291821912
13546585723358488330
8152278207550207137
5326830329312190973
4913697084476582898
14262418138109560951
15290966590348762705
12839383390186936300
7542437877916769153
9810492673269563482
7758842930936080220
4812571108324290908
5029520981616634815
15840288758340853541
2092167525858979776
18327021380133808278
17632125695290280680
12211750390317846139
6843968473617995
10188822277283446706
14720444444495653362
9238345581608110158
17042537243640066571
7422747308397745685
561339543551773937
17815490169946000859
7725376327635216993
12299115522411630855
5929732804687836023
5114625486228116199
14150706134515452908
11255919402395988332
2935378256375593766
17191737580195679954
10920064304920925661
3731055254099289474
12319346710319849009
12506487608784466594
18322710104415563982
6248532738633440646
4360474079712230873
8970438545861074999
15245302593847570973
2613084265826226277
290860095631812876
2012332944879013684
11284594856235644401
4351384563800590795
12060418855541795500
7287651022231059029
15493612563428500636
17321326645720608511
15878435959982935288
11603207067476522857
11624896867823998948
14721759329058006311
16159669703962678394
2907069029604674288
6722485160882783380
14421553600388580976
4266271407317422008
1838772287344865102
1061769337375467229
3110778535939275380
7022073982804972033
14646421110532183431
5789376894991844608
8465454918509538139
1068187524961752193
18157532234602896246
12251956320560431379
15923660062204629863
11583532874533499835
15511210516557241203
16903611537127535966
3064366918473189383
2822891649644144007
7276405684028961641
4887116503517718740
13884379403491974952
17076487457362938957
13679547485050900753
15930788057323553468
15602664842872115185
633308877076369447
13065732540110549474
2846361377570642182
681971196677626449
8012576328612141316
12311271862838835786
2100030313490210609
3812417007566063356
9771739541777144799
8929192631802592783
1583882117698122642
11426666846603375200
11914638195268756198
12065639644359096517
9289926538835158248
4561683589822663481
379375080057843439
16080493850661598802
2331456598217589131
6798279480903092396
662703854024049960
13482461498672081961
6178133446194667859
17760084789641521126
16439143035826505874
13049781677935483578
5378517889627026440
18172933393803773422
9020487865114742578
930850900585171713
14687908480156632537
13241309948857238172
9370921634953667535
3308104058347198759
14764648814608956069
13774232152489324670
2554416983359722193
1326689261255409830
8453531828327618255
16618511115949449329
15745887332503217240
18372424846695308145
13467315128445840421
3364839479047976068
190504467300062359
5792619485770166561
244909990955214160
3031729755434687197
16497173753445591629
17035173143605713370
9531274020820826781
5849028693978478215
16181105402962622441
12134156944020148703
1621986658238822084
13140867875770646407
12245109568288598282
9921327798797578367
5216627896688102211
1456496186530612569
12153370341302206901
5503865873759224893
12927885775496976036
17710749294542812801
4960566712638913773
16357637368415219014
2658779111716362622
11853711756501387523
2670840200565573839
7549239590252294658
15854715559409739344
7683593684903450212
5444469974529026808
17887584561723862556
11960101731905309921
478074557366143133
15652150145056454154
12891999564056186274
4941318372998254406
9266782194140648952
15946178246992242506
5578269654806667788
15020636581385363420
9265940574281317560
9617201679941881553
7635727188475583399
2214723172814724399
7992569959469189424
2332837321589993090
6009478794588531508
5928242029205298135
1291879938505408519
14510877454180605462
3257534462972248898
4935968071840522138
10834888515190079310
14565764790217723962
17333182863595378752
1048861480725927086
7382198090326843437
18269663839489594904
4855474356735943163
8319712931809382606
11332125668967122789
14928968839586834300
10621667220199672096
5650130865616094226
684131177886271852
4769616916701037928
6949323475830076741
6887759873838586743
12606609368945118373
16106616251153267372
5278735539248806230
5318707510335384671
9711282286987660511
4945702025796790058
10185672056197538661
161594449176109758
7749409507418051037
10523395959317933684
1172979146861910227
2685505212397200457
11723071209671775930
7802232855195446498
1835866573367246471
13906626779026578436
11115098603064446492
2111285770747781409
16263120649680269924
3184327694943544619
1862697026494271055
3085607207291717919
14686889156981620845
9660507236680314567
2644188207246118812
17261869088524945807
11491768274396748289
18298408266193597084
15989086720722518149
8911523991552305381
11432120404584216242
13183602722192661697
14936301577017080597
2346433177858122979
17094268739305384798
3869593960543493991
753753198248346397
3601071704098406145
11614025704504033512
14510877454180605462
17975675967093191561
8134169145128605432
8085144326499210503
14279024344427790315
15419963040361826339
2689981581037678554
11795287063647148077
6882088592578754558
6427156811143104054
16314763041941254268
5643744786126648906
1284329352972489426
1299863275304855645
9015849370085649417
7537659418559252934
14232968509670334
12212791721401898948
1221379004191916043
12221533944344764618
16030541830345684166
1875385436725233013
12750001182590928658
6945090986495750097
3515739297278057908
8973757122895703540
8068580678361853570
12244204631272143543
9551631899558252378
14196805007953532473
14969611448191205722
14122443612526805272
5456491853112898189
16816021462572050283
2506595502797268076
6687982354071097927
18277479294890738848
16558208046815685888
17399959879550575465
6844818230187214246
12309121985500777510
17957179517519805720
8122098561598269901
11481626123267876320
9210853897680594890
11947460167354802895
6822365653093023224
5471159954018142509
8273966730262347393
15483382360971328459
6151815287161386786
2634010063631075739
17086565445217308369
2042318482884865315
2342143134051515982
1933144867089449798
12670511146499990540
17246345627708439381
14623600296857326262
6284633127832655181
14152805261830489758
7987943842600170137
16523418150709930748
11893093672646038667
15858012511252427997
10079070413844692488
14987783061881630046
12248915540576480532
16912166919422836877
12558303678812211371
11844401942640486770
2870961443632410315
18089343284380772009
13977511021243066196
13507433103965154477
362764726524705292
1722196695011472721
2329672420692833128
8823130947541158043
9410456995303352656
11264870872109038279
16451260958017400398
9628847071669774468
5714195420842868474
17342209983812292723
1792400941091005516
4887156406330540696
3935026727022532070
17579781790598040800
15398599001871438830
1512962638870007633
13911213737309984885
12496778146578689336
11804871038007586944
4266271407317422008
604240182522058864
13542040154512136518
1529018025169321127
6407502318670531206
3797669403639807243
7908334173433989326
5970454510639958460
3718060012356837655
701280827470541342
15057246885723121222
9702535204140748434
5996305510318315886
16263924498209187039
68582657721753774
9140386042170313651
6155390385846311744
9432871312493668326
13021630530054326169
3250243241771088912
17282466740789266479
3412396136468935027
2907069029604674288
2755296976931198904
5274923127600966676
15380509353227890732
1227045305207811917
13757391838987177137
10546935928903415204
410505197199568472
9333738276189937276
15262932513447035028
10294022143928128131
9928941501609801018
14278957220095286592
13113130542976541483
15601053163806139419
6265324015100021505
17655316335618222109
11125058379341890857
50847090111711150
10211915901430063596
8452384648954476885
7541387647795331383
8973757122895703540
13075728693304713075
12330689032669502118
4410456143263457517
8997629757496069770
9793656148793618165
1554672912833326247
1257365004112976901
11098989287072576675
149722219950919713
Download .txt
gitextract_hjr_jxke/

├── .gitignore
├── LICENSE
├── README.md
├── _shuttlings/
│   ├── .gitignore
│   ├── Cargo.toml
│   └── src/
│       └── lib.rs
├── cch23/
│   ├── README.md
│   ├── challenges/
│   │   ├── -1.md
│   │   ├── 1.md
│   │   ├── 11.md
│   │   ├── 12.md
│   │   ├── 13.md
│   │   ├── 14.md
│   │   ├── 15.md
│   │   ├── 18.md
│   │   ├── 19.md
│   │   ├── 20.md
│   │   ├── 21.md
│   │   ├── 22.md
│   │   ├── 4.md
│   │   ├── 5.md
│   │   ├── 6.md
│   │   ├── 7.md
│   │   └── 8.md
│   └── validator/
│       ├── Cargo.toml
│       ├── README.md
│       ├── assets/
│       │   └── numbers.txt
│       └── src/
│           ├── args.rs
│           ├── lib.rs
│           └── main.rs
└── cch24/
    ├── README.md
    ├── challenges/
    │   ├── -1.md
    │   ├── 12.md
    │   ├── 16.md
    │   ├── 19.md
    │   ├── 2.md
    │   ├── 23.md
    │   ├── 5.md
    │   └── 9.md
    └── validator/
        ├── Cargo.toml
        ├── README.md
        ├── assets/
        │   ├── 23.html
        │   └── day16_santa_public_key.pem
        └── src/
            ├── args.rs
            ├── lib.rs
            └── main.rs
Download .txt
SYMBOL INDEX (69 symbols across 7 files)

FILE: _shuttlings/src/lib.rs
  type SubmissionState (line 2) | pub enum SubmissionState {
    method fmt (line 9) | fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
  type SubmissionUpdate (line 15) | pub enum SubmissionUpdate {
    method from (line 26) | fn from(value: SubmissionState) -> Self {
    method from (line 31) | fn from((b, i): (bool, i32)) -> Self {
    method from (line 36) | fn from(value: String) -> Self {

FILE: cch23/validator/src/args.rs
  type ValidatorArgs (line 5) | pub struct ValidatorArgs {
  type ChallengeArgs (line 15) | pub struct ChallengeArgs {

FILE: cch23/validator/src/lib.rs
  constant SUPPORTED_CHALLENGES (line 27) | pub const SUPPORTED_CHALLENGES: &[i32] =
  constant SUBMISSION_TIMEOUT (line 29) | pub const SUBMISSION_TIMEOUT: u64 = 60;
  function run (line 31) | pub async fn run(url: String, id: Uuid, number: i32, tx: Sender<Submissi...
  type TaskTest (line 51) | type TaskTest = (i32, i32);
  type ValidateResult (line 53) | type ValidateResult = std::result::Result<(), TaskTest>;
  function validate (line 55) | pub async fn validate(url: &str, number: i32, tx: Sender<SubmissionUpdat...
  function new_client (line 95) | fn new_client() -> reqwest::Client {
  function validate_minus1 (line 106) | async fn validate_minus1(base_url: &str, tx: Sender<SubmissionUpdate>) -...
  function validate_1 (line 133) | async fn validate_1(base_url: &str, tx: Sender<SubmissionUpdate>) -> Val...
  function validate_4 (line 189) | async fn validate_4(base_url: &str, tx: Sender<SubmissionUpdate>) -> Val...
  function validate_5 (line 306) | async fn validate_5(base_url: &str, tx: Sender<SubmissionUpdate>) -> Val...
  function validate_6 (line 412) | async fn validate_6(base_url: &str, tx: Sender<SubmissionUpdate>) -> Val...
  function validate_7 (line 501) | async fn validate_7(base_url: &str, tx: Sender<SubmissionUpdate>) -> Val...
  function validate_8 (line 726) | async fn validate_8(base_url: &str, tx: Sender<SubmissionUpdate>) -> Val...
  function validate_11 (line 790) | async fn validate_11(base_url: &str, tx: Sender<SubmissionUpdate>) -> Va...
  function validate_12 (line 878) | async fn validate_12(base_url: &str, tx: Sender<SubmissionUpdate>) -> Va...
  function validate_13 (line 1050) | async fn validate_13(base_url: &str, tx: Sender<SubmissionUpdate>) -> Va...
  function validate_14 (line 1203) | async fn validate_14(base_url: &str, tx: Sender<SubmissionUpdate>) -> Va...
  type JSONTester (line 1283) | struct JSONTester {
    method new (line 1289) | fn new(url: String) -> Self {
    method test (line 1295) | async fn test(
  function validate_15 (line 1320) | async fn validate_15(base_url: &str, tx: Sender<SubmissionUpdate>) -> Va...
  type RegionGiftTester (line 1507) | struct RegionGiftTester {
    method test (line 1516) | async fn test(
  function validate_18 (line 1569) | async fn validate_18(base_url: &str, tx: Sender<SubmissionUpdate>) -> Va...
  type WS (line 1796) | struct WS {
    method new (line 1803) | async fn new(test: TaskTest, url: String) -> Result<Self, TaskTest> {
    method send (line 1812) | async fn send(&mut self, msg: impl Into<String>) -> ValidateResult {
    method send_tweet (line 1819) | async fn send_tweet(&mut self, msg: impl Into<String>) -> ValidateResu...
    method recv (line 1824) | async fn recv(&mut self) -> Result<String, TaskTest> {
    method recv_str (line 1832) | async fn recv_str(&mut self, exp: &str) -> ValidateResult {
    method recv_json (line 1841) | async fn recv_json(&mut self, exp: &serde_json::Value) -> ValidateResu...
    method close (line 1851) | async fn close(mut self) -> ValidateResult {
  function validate_19 (line 1858) | async fn validate_19(base_url: &str, tx: Sender<SubmissionUpdate>) -> Va...
  function validate_20 (line 2184) | async fn validate_20(base_url: &str, tx: Sender<SubmissionUpdate>) -> Va...
  function validate_21 (line 2247) | async fn validate_21(base_url: &str, tx: Sender<SubmissionUpdate>) -> Va...
  type TextTester (line 2362) | struct TextTester {
    method new (line 2368) | fn new(url: String) -> Self {
    method test (line 2374) | async fn test(&self, test: TaskTest, i: &str, code: StatusCode, o: &st...
  function validate_22 (line 2393) | async fn validate_22(base_url: &str, tx: Sender<SubmissionUpdate>) -> Va...

FILE: cch23/validator/src/main.rs
  function main (line 11) | async fn main() {

FILE: cch24/validator/src/args.rs
  type ValidatorArgs (line 5) | pub struct ValidatorArgs {
  type ChallengeArgs (line 15) | pub struct ChallengeArgs {

FILE: cch24/validator/src/lib.rs
  constant SUPPORTED_CHALLENGES (line 21) | pub const SUPPORTED_CHALLENGES: &[&str] = &["-1", "2", "5", "9", "12", "...
  constant SUBMISSION_TIMEOUT (line 22) | pub const SUBMISSION_TIMEOUT: u64 = 60;
  function run (line 24) | pub async fn run(url: String, id: Uuid, number: &str, tx: Sender<Submiss...
  type TaskTest (line 44) | type TaskTest = (i32, i32);
  type ValidateResult (line 46) | type ValidateResult = std::result::Result<(), TaskTest>;
  function validate (line 48) | pub async fn validate(url: &str, number: &str, tx: Sender<SubmissionUpda...
  function new_client_base (line 78) | fn new_client_base() -> reqwest::ClientBuilder {
  function new_client (line 86) | fn new_client() -> reqwest::Client {
  function new_client_with_cookies (line 89) | fn new_client_with_cookies() -> reqwest::Client {
  function validate_minus1 (line 154) | async fn validate_minus1(base_url: &str, tx: Sender<SubmissionUpdate>) -...
  function validate_2 (line 193) | async fn validate_2(base_url: &str, tx: Sender<SubmissionUpdate>) -> Val...
  function validate_5 (line 274) | async fn validate_5(base_url: &str, tx: Sender<SubmissionUpdate>) -> Val...
  function validate_9 (line 763) | async fn validate_9(base_url: &str, tx: Sender<SubmissionUpdate>) -> Val...
  function validate_12 (line 1081) | async fn validate_12(base_url: &str, tx: Sender<SubmissionUpdate>) -> Va...
  function validate_16 (line 1513) | async fn validate_16(base_url: &str, tx: Sender<SubmissionUpdate>) -> Va...
  function validate_19 (line 1669) | async fn validate_19(base_url: &str, tx: Sender<SubmissionUpdate>) -> Va...
  function validate_23 (line 2045) | async fn validate_23(base_url: &str, tx: Sender<SubmissionUpdate>) -> Va...

FILE: cch24/validator/src/main.rs
  function main (line 7) | async fn main() {
Condensed preview — 46 files, each showing path, character count, and a content snippet. Download the .json file or copy for the full structured content (751K chars).
[
  {
    "path": ".gitignore",
    "chars": 8,
    "preview": "target/\n"
  },
  {
    "path": "LICENSE",
    "chars": 1064,
    "preview": "MIT License\n\nCopyright (c) 2024 shuttle\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof"
  },
  {
    "path": "README.md",
    "chars": 1375,
    "preview": "# Shuttlings\n\nThis is [Shuttle](https://www.shuttle.dev/)'s collection of code challenges for learning backend developme"
  },
  {
    "path": "_shuttlings/.gitignore",
    "chars": 11,
    "preview": "Cargo.lock\n"
  },
  {
    "path": "_shuttlings/Cargo.toml",
    "chars": 215,
    "preview": "[package]\nname = \"shuttlings\"\ndescription = \"Types for Shuttlings libraries\"\nrepository = \"https://github.com/shuttle-hq"
  },
  {
    "path": "_shuttlings/src/lib.rs",
    "chars": 926,
    "preview": "#[derive(Debug)]\npub enum SubmissionState {\n    Waiting,\n    Running,\n    Done,\n    Error,\n}\nimpl std::fmt::Display for "
  },
  {
    "path": "cch23/README.md",
    "chars": 906,
    "preview": "# Shuttle's Christmas Code Hunt 2023\n\nThe Shuttle Christmas Code Hunt is a set of Rust challenges that were released thr"
  },
  {
    "path": "cch23/challenges/-1.md",
    "chars": 3014,
    "preview": "# 🎄 Day -1: Get your winter boots on!\n\nWelcome to Shuttle's Christmas Code Hunt 2023!\n\nThis challenge is a warmup challe"
  },
  {
    "path": "cch23/challenges/1.md",
    "chars": 1903,
    "preview": "# 🎄 Day 1: Packet \"exclusive-cube\" not found\n\n*In the frosty expanses of the North Pole, Santa's advanced packet managem"
  },
  {
    "path": "cch23/challenges/11.md",
    "chars": 2500,
    "preview": "# 🎄 Day 11: Imagery from the North Pole\n\n*Decked out in his signature red coat, Santa's eyes sparkle brighter than the N"
  },
  {
    "path": "cch23/challenges/12.md",
    "chars": 4051,
    "preview": "# 🎄 Day 12: Timekeeper\n\n*One frosty night, Santa, dressed warmly in his favorite red coat, decided to take a midnight st"
  },
  {
    "path": "cch23/challenges/13.md",
    "chars": 3861,
    "preview": "# 🎄 Day 13: Santa's Gift Orders\n\n*Santa Claus has started facing a pressing issue at the North Pole. The existing databa"
  },
  {
    "path": "cch23/challenges/14.md",
    "chars": 1924,
    "preview": "# 🎄 Day 14: Reindeering HTML\n\n*Did you hear about the time when Santa became a web designer? He picked up coding with gr"
  },
  {
    "path": "cch23/challenges/15.md",
    "chars": 4139,
    "preview": "# 🎄 Day 15: The Password Validator\n\n*There had been a few naughty incidents where mischievous users had tinkered with ot"
  },
  {
    "path": "cch23/challenges/18.md",
    "chars": 5085,
    "preview": "# 🎄 Day 18: Santa's Gift Orders: Data Analytics Edition\n\n*Santa sat back in his plush seat, a mug of hot cocoa in his ha"
  },
  {
    "path": "cch23/challenges/19.md",
    "chars": 2890,
    "preview": "# 🎄 Day 19: Christmas Sockets on the Chimney\n\n*On a cold and snowy winter day, Santa Claus was busy with his annual rout"
  },
  {
    "path": "cch23/challenges/20.md",
    "chars": 3470,
    "preview": "# 🎄 Day 20: Git good\n\n*Santa frowned, his usually merry eyes scanning the data on the screen before him. Something wasn'"
  },
  {
    "path": "cch23/challenges/21.md",
    "chars": 2273,
    "preview": "# 🎄 Day 21: Around the Globe\n\n*Once upon a frosty night in Christmas' season, ol' Santa was tidying up his archives. Wit"
  },
  {
    "path": "cch23/challenges/22.md",
    "chars": 5168,
    "preview": "# 🎄 Day 22: Dawn of the day before the day before the final day\n\n*When Christmas Eve rolls around, it's game time. Santa"
  },
  {
    "path": "cch23/challenges/4.md",
    "chars": 3463,
    "preview": "# 🎄 Day 4: What do you call a serialized reindeer? Serdeer!\n\n*Under the soft glow of the Northern Lights, Santa's reinde"
  },
  {
    "path": "cch23/challenges/5.md",
    "chars": 2776,
    "preview": "# 🎄 Day 5: Why did Santa's URL query go haywire on Christmas? Too many \"present\" parameters!\n\n*In the technologically ad"
  },
  {
    "path": "cch23/challenges/6.md",
    "chars": 1873,
    "preview": "# 🎄 Day 6: Elf on a shelf\n\n*It's that time of year when the elves hide on shelves to watch over the children of the worl"
  },
  {
    "path": "cch23/challenges/7.md",
    "chars": 4153,
    "preview": "# 🎄 Day 7: GET Santa some cookies\n\n*At Santa's base near the North Pole (64 km away to be precise), the scent of freshly"
  },
  {
    "path": "cch23/challenges/8.md",
    "chars": 1984,
    "preview": "# 🎄 Day 8: PokéPhysics\n\n*In the heart of the North Pole, Santa's workshop buzzes with a new type of magic. A portal has "
  },
  {
    "path": "cch23/validator/Cargo.toml",
    "chars": 839,
    "preview": "[package]\nname = \"cch23-validator\"\ndescription = \"Validate solutions to challenges from Shuttle's Christmas Code Hunt 20"
  },
  {
    "path": "cch23/validator/README.md",
    "chars": 686,
    "preview": "# Shuttle's Christmas Code Hunt 2023 - Validator\n\nUse this binary to run the official tests against your solution to cha"
  },
  {
    "path": "cch23/validator/assets/numbers.txt",
    "chars": 408076,
    "preview": "11278171056114273519\n3751442393314989019\n18347682815989091752\n16318073259550480003\n11276777143002031408\n3882912681273177"
  },
  {
    "path": "cch23/validator/src/args.rs",
    "chars": 523,
    "preview": "use clap::{Args, Parser};\n\n#[derive(Debug, Parser)]\n#[command(version)]\npub struct ValidatorArgs {\n    #[command(flatten"
  },
  {
    "path": "cch23/validator/src/lib.rs",
    "chars": 87996,
    "preview": "pub mod args;\n\nuse std::{ops::Deref, sync::Arc};\n\nuse base64::{engine::general_purpose, Engine};\nuse futures_util::{\n   "
  },
  {
    "path": "cch23/validator/src/main.rs",
    "chars": 2738,
    "preview": "use cch23_validator::{\n    args::ValidatorArgs,\n    run,\n    shuttlings::{SubmissionState, SubmissionUpdate},\n    SUPPOR"
  },
  {
    "path": "cch24/README.md",
    "chars": 906,
    "preview": "# Shuttle's Christmas Code Hunt 2024\n\nThe Shuttle Christmas Code Hunt is a set of Rust challenges that were released thr"
  },
  {
    "path": "cch24/challenges/-1.md",
    "chars": 4636,
    "preview": "# 🎄 Day -1: We are so back!!\n\nWelcome to Shuttle's Christmas Code Hunt 2024!\n\nSanta is excited beyond belief to have you"
  },
  {
    "path": "cch24/challenges/12.md",
    "chars": 6885,
    "preview": "# 🎄 Day 12: The *Cookies and Milk* Factory (part 2)\n\n*As Santa's additional factories thrived globally, his innovative 4"
  },
  {
    "path": "cch24/challenges/16.md",
    "chars": 5824,
    "preview": "# 🎄 Day 16: A mystery gift wrapped in a cookie\n\n*In the heart of the North Pole, Santa was renowned not only for his joy"
  },
  {
    "path": "cch24/challenges/19.md",
    "chars": 4790,
    "preview": "# 🎄 Day 19: Santa's Quote Book\n\n*Santa Claus, always inspired by the great thinkers and everyday heroes, started a quote"
  },
  {
    "path": "cch24/challenges/2.md",
    "chars": 3300,
    "preview": "# 🎄 Day 2: Ridiculous Routing\n\n*Back in the early days of the Internet, Santa joyfully built a magical data center igloo"
  },
  {
    "path": "cch24/challenges/23.md",
    "chars": 7329,
    "preview": "# 🎄 Day 23: Dinner at the Christmas Tree\n\n*In the snowy North Pole, Santa Claus beamed with joy as he gazed at his gleam"
  },
  {
    "path": "cch24/challenges/5.md",
    "chars": 5288,
    "preview": "# 🎄 Day 5: The dangerous open Internet\n\n*Ho ho ho! Santa's got his hands full this year with the grand Christmas present"
  },
  {
    "path": "cch24/challenges/9.md",
    "chars": 5669,
    "preview": "# 🎄 Day 9: The *Cookies and Milk* Factory (part 1)\n\n*Wanting to spread the joy of sweet treats beyond the holidays, Sant"
  },
  {
    "path": "cch24/validator/Cargo.toml",
    "chars": 807,
    "preview": "[package]\nname = \"cch24-validator\"\ndescription = \"Validate solutions to challenges from Shuttle's Christmas Code Hunt 20"
  },
  {
    "path": "cch24/validator/README.md",
    "chars": 686,
    "preview": "# Shuttle's Christmas Code Hunt 2024 - Validator\n\nUse this binary to run the official tests against your solution to cha"
  },
  {
    "path": "cch24/validator/assets/23.html",
    "chars": 7163,
    "preview": "<html>\n    <head>\n        <script src=\"https://unpkg.com/htmx.org@2.0.4\"></script>\n        <style>\nbody {\n    --darkgrey"
  },
  {
    "path": "cch24/validator/assets/day16_santa_public_key.pem",
    "chars": 451,
    "preview": "-----BEGIN PUBLIC KEY-----\nMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAs5BlLjDtKuEY2NV3+xhH\nWWlKrZDWkIOV+HoLURIBEpAHa11x"
  },
  {
    "path": "cch24/validator/src/args.rs",
    "chars": 526,
    "preview": "use clap::{Args, Parser};\n\n#[derive(Debug, Parser)]\n#[command(version)]\npub struct ValidatorArgs {\n    #[command(flatten"
  },
  {
    "path": "cch24/validator/src/lib.rs",
    "chars": 92086,
    "preview": "pub mod args;\n\nuse chrono::{DateTime, TimeDelta, Utc};\nuse html_compare_rs::{HtmlCompareOptions, HtmlComparer};\nuse json"
  },
  {
    "path": "cch24/validator/src/main.rs",
    "chars": 2986,
    "preview": "use cch24_validator::{args::ValidatorArgs, run, SUPPORTED_CHALLENGES};\nuse clap::{CommandFactory, FromArgMatches};\nuse s"
  }
]

About this extraction

This page contains the full source code of the shuttle-hq/shuttlings GitHub repository, extracted and formatted as plain text for AI agents and large language models (LLMs). The extraction includes 46 files (692.6 KB), approximately 251.4k tokens, and a symbol index with 69 extracted functions, classes, methods, constants, and types. Use this with OpenClaw, Claude, ChatGPT, Cursor, Windsurf, or any other AI tool that accepts text input. You can copy the full output to your clipboard or download it as a .txt file.

Extracted by GitExtract — free GitHub repo to text converter for AI. Built by Nikandr Surkov.

Copied to clipboard!