diff --git a/.Jules/palette.md b/.Jules/palette.md
index 018831f..96bd45d 100644
--- a/.Jules/palette.md
+++ b/.Jules/palette.md
@@ -1,3 +1,7 @@
## 2024-05-23 - CLI UX Enhancement
**Learning:** Even in CLI apps, visual distinction (colors, emojis) significantly reduces cognitive load when scanning logs.
**Action:** Use ANSI colors and consistent emojis for key events (success/failure) in future CLI tools.
+
+## 2025-02-28 - Structured CLI Reports
+**Learning:** Dense numerical data in CLI output is hard to parse. Using ASCII box-drawing characters and alignment to create a "dashboard" or "invoice" style summary significantly improves readability and perceived quality.
+**Action:** When summarizing simulation or batch job results, always format the final report as a structured table or box rather than a list of print statements.
diff --git a/.github/workflows/publish-package.yml b/.github/workflows/publish-package.yml
new file mode 100644
index 0000000..24be36a
--- /dev/null
+++ b/.github/workflows/publish-package.yml
@@ -0,0 +1,34 @@
+name: Create Container Package
+
+on:
+ push:
+ branches: ['main']
+
+env:
+ REGISTRY: ghcr.io
+ IMAGE_NAME: ${{ github.repository }}
+
+jobs:
+ build-and-push-image:
+ runs-on: ubuntu-latest
+ permissions:
+ contents: read
+ packages: write
+
+ steps:
+ - name: Checkout repository
+ uses: actions/checkout@v4
+
+ - name: Log in to the Container registry
+ uses: docker/login-action@v3
+ with:
+ registry: ${{ env.REGISTRY }}
+ username: ${{ github.actor }}
+ password: ${{ secrets.GITHUB_TOKEN }}
+
+ - name: Build and push Docker image
+ uses: docker/build-push-action@v5
+ with:
+ context: .
+ push: true
+ tags: ghcr.io/${{ github.repository }}:latest
diff --git a/.github/workflows/rust.yml b/.github/workflows/rust.yml
new file mode 100644
index 0000000..9fd45e0
--- /dev/null
+++ b/.github/workflows/rust.yml
@@ -0,0 +1,22 @@
+name: Rust
+
+on:
+ push:
+ branches: [ "main" ]
+ pull_request:
+ branches: [ "main" ]
+
+env:
+ CARGO_TERM_COLOR: always
+
+jobs:
+ build:
+
+ runs-on: ubuntu-latest
+
+ steps:
+ - uses: actions/checkout@v4
+ - name: Build
+ run: cargo build --verbose
+ - name: Run tests
+ run: cargo test --verbose
diff --git a/.gitignore b/.gitignore
index 907591b..86c056e 100644
--- a/.gitignore
+++ b/.gitignore
@@ -1,45 +1,2 @@
-# Prerequisites
-*.d
-# Compiled Object files
-*.slo
-*.lo
-*.o
-*.obj
-
-# Precompiled Headers
-*.gch
-*.pch
-
-# Linker files
-*.ilk
-
-# Debugger Files
-*.pdb
-
-# Compiled Dynamic libraries
-*.so
-*.dylib
-*.dll
-
-# Fortran module files
-*.mod
-*.smod
-
-# Compiled Static libraries
-*.lai
-*.la
-*.a
-*.lib
-
-# Executables
-*.exe
-*.out
-*.app
-
-# debug information files
-*.dwo
-
-# Python
-__pycache__/
-*.pyc
+target/
diff --git a/CODE_OF_CONDUCT.md b/CODE_OF_CONDUCT.md
new file mode 100644
index 0000000..7082a2e
--- /dev/null
+++ b/CODE_OF_CONDUCT.md
@@ -0,0 +1,32 @@
+# Code Code of Conduct
+
+Like the technical community as a whole, the Code team and community is made up of a mixture of professionals and volunteers from all over the world, working on every aspect of the mission - including mentorship, teaching, and connecting people.
+
+Diversity is one of our huge strengths, but it can also lead to communication issues and unhappiness. To that end, we have a few ground rules that we ask people to adhere to. This code applies equally to founders, mentors and those seeking help and guidance.
+
+This isn’t an exhaustive list of things that you can’t do. Rather, take it in the spirit in which it’s intended - a guide to make it easier to enrich all of us and the technical communities in which we participate.
+
+This code of conduct applies to all spaces managed by the Code project or Parteon. This includes IRC, the mailing lists, the issue tracker, DSF events, and any other forums created by the project team which the community uses for communication. In addition, violations of this code outside these spaces may affect a person's ability to participate within them.
+
+If you believe someone is violating the code of conduct, we ask that you report it by emailing [rahmatnaim48@gmail.com](mailto:rahmatnaim.48@gmail.com). For more details please see our [Reporting guidelines](https://docs.github.com/en/communities/setting-up-your-project-for-healthy-contributions/setting-guidelines-for-repository-contributors)
+
+- **Be friendly and patient.**
+- **Be welcoming.** We strive to be a community that welcomes and supports people of all backgrounds and identities. This includes, but is not limited to members of any race, ethnicity, culture, national origin, colour, immigration status, social and economic class, educational level, sex, sexual orientation, gender identity and expression, age, size, family status, political belief, religion, and mental and physical ability.
+- **Be considerate.** Your work will be used by other people, and you in turn will depend on the work of others. Any decision you take will affect users and colleagues, and you should take those consequences into account when making decisions. Remember that we're a world-wide community, so you might not be communicating in someone else's primary language.
+- **Be respectful.** Not all of us will agree all the time, but disagreement is no excuse for poor behavior and poor manners. We might all experience some frustration now and then, but we cannot allow that frustration to turn into a personal attack. It’s important to remember that a community where people feel uncomfortable or threatened is not a productive one. Members of the Code community should be respectful when dealing with other members as well as with people outside the Code community.
+- **Be careful in the words that you choose.** We are a community of professionals, and we conduct ourselves professionally. Be kind to others. Do not insult or put down other participants. Harassment and other exclusionary behavior aren't acceptable. This includes, but is not limited to:
+ - Violent threats or language directed against another person.
+ - Discriminatory jokes and language.
+ - Posting sexually explicit or violent material.
+ - Posting (or threatening to post) other people's personally identifying information ("doxing").
+ - Personal insults, especially those using racist or sexist terms.
+ - Unwelcome sexual attention.
+ - Advocating for, or encouraging, any of the above behavior.
+ - Repeated harassment of others. In general, if someone asks you to stop, then stop.
+- **When we disagree, try to understand why.** Disagreements, both social and technical, happen all the time and Code is no exception. It is important that we resolve disagreements and differing views constructively. Remember that we’re different. The strength of Code comes from its varied community, people from a wide range of backgrounds. Different people have different perspectives on issues. Being unable to understand why someone holds a viewpoint doesn’t mean that they’re wrong. Don’t forget that it is human to err and blaming each other doesn’t get us anywhere. Instead, focus on helping to resolve issues and learning from mistakes.
+
+Original text courtesy of the [Speak Up! project](http://web.archive.org/web/20141109123859/http://speakup.io/coc.html).
+
+## Questions?
+
+If you have questions, please see [Faq](https://support.github.com/?tags=dotcom-footer). If that doesn't answer your questions, feel free to [contact us](mailto:rahmatnaim48@gmail.com).
diff --git a/Cargo.lock b/Cargo.lock
new file mode 100644
index 0000000..13cf4d6
--- /dev/null
+++ b/Cargo.lock
@@ -0,0 +1,223 @@
+# This file is automatically @generated by Cargo.
+# It is not intended for manual editing.
+version = 4
+
+[[package]]
+name = "cfg-if"
+version = "1.0.4"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "9330f8b2ff13f34540b44e946ef35111825727b38d33286ef986142615121801"
+
+[[package]]
+name = "colored"
+version = "2.2.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "117725a109d387c937a1533ce01b450cbde6b88abceea8473c4d7a85853cda3c"
+dependencies = [
+ "lazy_static",
+ "windows-sys",
+]
+
+[[package]]
+name = "eijack-lab-rust"
+version = "0.1.0"
+dependencies = [
+ "colored",
+ "rand",
+]
+
+[[package]]
+name = "getrandom"
+version = "0.2.17"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "ff2abc00be7fca6ebc474524697ae276ad847ad0a6b3faa4bcb027e9a4614ad0"
+dependencies = [
+ "cfg-if",
+ "libc",
+ "wasi",
+]
+
+[[package]]
+name = "lazy_static"
+version = "1.5.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "bbd2bcb4c963f2ddae06a2efc7e9f3591312473c50c6685e1f298068316e66fe"
+
+[[package]]
+name = "libc"
+version = "0.2.182"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "6800badb6cb2082ffd7b6a67e6125bb39f18782f793520caee8cb8846be06112"
+
+[[package]]
+name = "ppv-lite86"
+version = "0.2.21"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "85eae3c4ed2f50dcfe72643da4befc30deadb458a9b590d720cde2f2b1e97da9"
+dependencies = [
+ "zerocopy",
+]
+
+[[package]]
+name = "proc-macro2"
+version = "1.0.106"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "8fd00f0bb2e90d81d1044c2b32617f68fcb9fa3bb7640c23e9c748e53fb30934"
+dependencies = [
+ "unicode-ident",
+]
+
+[[package]]
+name = "quote"
+version = "1.0.44"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "21b2ebcf727b7760c461f091f9f0f539b77b8e87f2fd88131e7f1b433b3cece4"
+dependencies = [
+ "proc-macro2",
+]
+
+[[package]]
+name = "rand"
+version = "0.8.5"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "34af8d1a0e25924bc5b7c43c079c942339d8f0a8b57c39049bef581b46327404"
+dependencies = [
+ "libc",
+ "rand_chacha",
+ "rand_core",
+]
+
+[[package]]
+name = "rand_chacha"
+version = "0.3.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "e6c10a63a0fa32252be49d21e7709d4d4baf8d231c2dbce1eaa8141b9b127d88"
+dependencies = [
+ "ppv-lite86",
+ "rand_core",
+]
+
+[[package]]
+name = "rand_core"
+version = "0.6.4"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "ec0be4795e2f6a28069bec0b5ff3e2ac9bafc99e6a9a7dc3547996c5c816922c"
+dependencies = [
+ "getrandom",
+]
+
+[[package]]
+name = "syn"
+version = "2.0.117"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "e665b8803e7b1d2a727f4023456bbbbe74da67099c585258af0ad9c5013b9b99"
+dependencies = [
+ "proc-macro2",
+ "quote",
+ "unicode-ident",
+]
+
+[[package]]
+name = "unicode-ident"
+version = "1.0.24"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "e6e4313cd5fcd3dad5cafa179702e2b244f760991f45397d14d4ebf38247da75"
+
+[[package]]
+name = "wasi"
+version = "0.11.1+wasi-snapshot-preview1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "ccf3ec651a847eb01de73ccad15eb7d99f80485de043efb2f370cd654f4ea44b"
+
+[[package]]
+name = "windows-sys"
+version = "0.59.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "1e38bc4d79ed67fd075bcc251a1c39b32a1776bbe92e5bef1f0bf1f8c531853b"
+dependencies = [
+ "windows-targets",
+]
+
+[[package]]
+name = "windows-targets"
+version = "0.52.6"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "9b724f72796e036ab90c1021d4780d4d3d648aca59e491e6b98e725b84e99973"
+dependencies = [
+ "windows_aarch64_gnullvm",
+ "windows_aarch64_msvc",
+ "windows_i686_gnu",
+ "windows_i686_gnullvm",
+ "windows_i686_msvc",
+ "windows_x86_64_gnu",
+ "windows_x86_64_gnullvm",
+ "windows_x86_64_msvc",
+]
+
+[[package]]
+name = "windows_aarch64_gnullvm"
+version = "0.52.6"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "32a4622180e7a0ec044bb555404c800bc9fd9ec262ec147edd5989ccd0c02cd3"
+
+[[package]]
+name = "windows_aarch64_msvc"
+version = "0.52.6"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "09ec2a7bb152e2252b53fa7803150007879548bc709c039df7627cabbd05d469"
+
+[[package]]
+name = "windows_i686_gnu"
+version = "0.52.6"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "8e9b5ad5ab802e97eb8e295ac6720e509ee4c243f69d781394014ebfe8bbfa0b"
+
+[[package]]
+name = "windows_i686_gnullvm"
+version = "0.52.6"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "0eee52d38c090b3caa76c563b86c3a4bd71ef1a819287c19d586d7334ae8ed66"
+
+[[package]]
+name = "windows_i686_msvc"
+version = "0.52.6"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "240948bc05c5e7c6dabba28bf89d89ffce3e303022809e73deaefe4f6ec56c66"
+
+[[package]]
+name = "windows_x86_64_gnu"
+version = "0.52.6"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "147a5c80aabfbf0c7d901cb5895d1de30ef2907eb21fbbab29ca94c5b08b1a78"
+
+[[package]]
+name = "windows_x86_64_gnullvm"
+version = "0.52.6"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "24d5b23dc417412679681396f2b49f3de8c1473deb516bd34410872eff51ed0d"
+
+[[package]]
+name = "windows_x86_64_msvc"
+version = "0.52.6"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "589f6da84c646204747d1270a2a5661ea66ed1cced2631d546fdfb155959f9ec"
+
+[[package]]
+name = "zerocopy"
+version = "0.8.40"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "a789c6e490b576db9f7e6b6d661bcc9799f7c0ac8352f56ea20193b2681532e5"
+dependencies = [
+ "zerocopy-derive",
+]
+
+[[package]]
+name = "zerocopy-derive"
+version = "0.8.40"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "f65c489a7071a749c849713807783f70672b28094011623e200cb86dcb835953"
+dependencies = [
+ "proc-macro2",
+ "quote",
+ "syn",
+]
diff --git a/Cargo.toml b/Cargo.toml
new file mode 100644
index 0000000..87c7552
--- /dev/null
+++ b/Cargo.toml
@@ -0,0 +1,24 @@
+[package]
+name = "eijack-lab-rust"
+version = "0.1.0"
+authors = ["EiJackGH rahmatnaim.48@gmail.com"]
+edition = "2021"
+description = "High-performance experiments for the Code & Commit 2026 initiative."
+
+# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html
+
+[dependencies]
+# For generating random numbers (like in your NumberGuess game)
+rand = "0.8.5"
+
+# For colorful terminal output (perfect for your "Zen" Easter Egg)
+colored = "2.1.0"
+
+# If you decide to port your Bitcoin test, you'll need this:
+# reqwest = { version = "0.11", features = ["json"] }
+# tokio = { version = "1", features = ["full"] }
+
+[profile.release]
+# This makes your "Lab" code run at maximum speed (Saying YES to optimization!)
+opt-level = 3
+lto = true
diff --git a/Dockerfile b/Dockerfile
new file mode 100644
index 0000000..ff6e936
--- /dev/null
+++ b/Dockerfile
@@ -0,0 +1,14 @@
+# Use a lightweight C++ compiler image
+FROM gcc:latest
+
+# Set the working directory inside the container
+WORKDIR /usr/src/app
+
+# Copy your C++ file into the container
+COPY NumberGuess.cpp .
+
+# Compile the code
+RUN g++ -o NumberGuess NumberGuess.cpp
+
+# Command to run the game
+CMD ["./NumberGuess"]
diff --git a/GitHub-Badges.md b/GitHub-Badges.md
new file mode 100644
index 0000000..5e40814
--- /dev/null
+++ b/GitHub-Badges.md
@@ -0,0 +1,12 @@
+# 🏅 GitHub Achievements Tracker
+
+| Badge | Achievement | Description | Status |
+| :---: | :--- | :--- | :---: |
+|
| **YOLO** | Merged a PR without a code review. | [ ] |
+|
| **Pull Shark** | Opened pull requests that have been merged. | [ ] |
+|
| **Quickdraw** | Closed an issue/PR within 5 mins of opening. | [ ] |
+|
| **Galaxy Brain** | Answer was accepted in a Discussion. | [ ] |
+|
| **Pair Extraordinaire** | Co-authored a commit in a merged PR. | [ ] |
+|
| **Heart on Sleeve** | Contributed to a project that hit a sponsor goal. | [ ] |
+|
| **Starstruck** | Created a repository has so many stars. | [ ] |
+|
| **Arctic Code Vault Contributor** | Contributed code to several repositories in the 2020 GitHub Archive Program. | [ ] |
diff --git a/NumberGuess/NumberGuess.cpp b/NumberGuess/NumberGuess.cpp
new file mode 100644
index 0000000..c82e2f8
--- /dev/null
+++ b/NumberGuess/NumberGuess.cpp
@@ -0,0 +1,61 @@
+#include
+#include // For rand() and srand()
+#include // For time()
+#include
+
+using namespace std;
+
+void showEasterEgg() {
+ cout << "\n[!] EASTER EGG ACTIVATED: THE ZEN MODE" << endl;
+ cout << "Inspired by the Word 1.1a secret found 29 years later." << endl;
+ cout << "EiJackGH Lab - Saying YES in 2026." << endl;
+ cout << "========================================" << endl;
+}
+
+int main() {
+ // Seed the randomizer
+ srand(static_cast(time(0)));
+
+ int secretNumber = rand() % 100 + 1;
+ string input;
+ int guess = 0;
+ int attempts = 0;
+
+ cout << "--- EI-JACK LAB: NUMBER GUESSER V1.0 ---" << endl;
+ cout << "I'm thinking of a number between 1 and 100." << endl;
+ cout << "(Hint: Type 'zen' to see the credits)" << endl << endl;
+
+ while (guess != secretNumber) {
+ cout << "Enter your guess: ";
+ cin >> input;
+
+ // Check for Easter Egg
+ if (input == "zen" || input == "ZEN") {
+ showEasterEgg();
+ continue;
+ }
+
+ // Convert string to integer for the game logic
+ try {
+ guess = stoi(input);
+ } catch (...) {
+ cout << "Invalid input. Please enter a number." << endl;
+ continue;
+ }
+
+ attempts++;
+
+ if (guess > secretNumber) {
+ cout << ">>> Too high! Try again." << endl;
+ } else if (guess < secretNumber) {
+ cout << ">>> Too low! Try again." << endl;
+ } else {
+ cout << "\nCONGRATULATIONS!" << endl;
+ cout << "You found it in " << attempts << " attempts." << endl;
+ }
+ }
+
+ cout << "----------------------------------------" << endl;
+ system("pause"); // Essential for Dev-C++ to keep the window open
+ return 0;
+}
diff --git a/SECURITY.md b/SECURITY.md
new file mode 100644
index 0000000..d28bbf3
--- /dev/null
+++ b/SECURITY.md
@@ -0,0 +1,25 @@
+# Security Policy
+
+## 🛡️ Our Commitment
+At the **EiJackGH Lab**, we believe that transparency is the foundation of security. While these projects are largely experimental, we take the safety of our contributors and users seriously.
+
+## Supported Versions
+We currently provide security updates for the following versions:
+
+| Version | Supported |
+| ------- | ------------------ |
+| 2.0.x | ✅ Yes |
+| 1.5.x | 🔄 Critical Only |
+| < 1.0.x | ❌ No |
+
+## Reporting a Vulnerability
+**Please do not report security vulnerabilities through public GitHub issues.** If you discover a potential security flaw (e.g., an API key leak in the `bitcoin_test.py` or a buffer overflow in the C++ game), please follow these steps:
+
+1. **Email us:** Send a detailed report to `rahmatnaim.48@gmail.com` (replace with your real contact).
+2. **Details:** Include a description of the vulnerability, steps to reproduce, and the potential impact.
+3. **Response:** We aim to acknowledge all reports within **48 hours**.
+
+## 🚀 Saying YES to Safety in 2026
+As part of our **Code & Commit 2026** initiative, we use automated tools to keep our code clean:
+* **Dependabot:** Monitors our dependencies.
+* **CodeQL:** Performs static analysis on our C++ and Python logic.
diff --git a/__pycache__/bitcoin.cpython-312.pyc b/__pycache__/bitcoin.cpython-312.pyc
new file mode 100644
index 0000000..c4cf697
Binary files /dev/null and b/__pycache__/bitcoin.cpython-312.pyc differ
diff --git a/__pycache__/bitcoin_trading_simulation.cpython-312.pyc b/__pycache__/bitcoin_trading_simulation.cpython-312.pyc
index 52abfc2..77edb71 100644
Binary files a/__pycache__/bitcoin_trading_simulation.cpython-312.pyc and b/__pycache__/bitcoin_trading_simulation.cpython-312.pyc differ
diff --git a/__pycache__/test_bitcoin.cpython-312-pytest-9.0.2.pyc b/__pycache__/test_bitcoin.cpython-312-pytest-9.0.2.pyc
new file mode 100644
index 0000000..57c9363
Binary files /dev/null and b/__pycache__/test_bitcoin.cpython-312-pytest-9.0.2.pyc differ
diff --git a/__pycache__/test_bitcoin_trading.cpython-312-pytest-9.0.2.pyc b/__pycache__/test_bitcoin_trading.cpython-312-pytest-9.0.2.pyc
new file mode 100644
index 0000000..7e42478
Binary files /dev/null and b/__pycache__/test_bitcoin_trading.cpython-312-pytest-9.0.2.pyc differ
diff --git a/__pycache__/test_bitcoin_trading.cpython-312.pyc b/__pycache__/test_bitcoin_trading.cpython-312.pyc
deleted file mode 100644
index ecc297a..0000000
Binary files a/__pycache__/test_bitcoin_trading.cpython-312.pyc and /dev/null differ
diff --git a/__pycache__/test_cli_args.cpython-312-pytest-9.0.2.pyc b/__pycache__/test_cli_args.cpython-312-pytest-9.0.2.pyc
new file mode 100644
index 0000000..75886d8
Binary files /dev/null and b/__pycache__/test_cli_args.cpython-312-pytest-9.0.2.pyc differ
diff --git a/__pycache__/test_simulation.cpython-312-pytest-9.0.2.pyc b/__pycache__/test_simulation.cpython-312-pytest-9.0.2.pyc
new file mode 100644
index 0000000..b2d17a4
Binary files /dev/null and b/__pycache__/test_simulation.cpython-312-pytest-9.0.2.pyc differ
diff --git a/bitcoin.py b/bitcoin.py
new file mode 100644
index 0000000..03b3371
--- /dev/null
+++ b/bitcoin.py
@@ -0,0 +1,24 @@
+import requests
+
+
+def get_bitcoin_price():
+ """
+ Fetches the current Bitcoin price from CoinDesk API.
+ """
+ url = "https://api.coindesk.com/v1/bpi/currentprice.json"
+ try:
+ response = requests.get(url)
+ if response.status_code == 200:
+ data = response.json()
+ return data["bpi"]["USD"]["rate_float"]
+ else:
+ raise ConnectionError(f"API returned status code {response.status_code}")
+ except requests.RequestException:
+ raise ConnectionError("Failed to fetch Bitcoin price")
+
+
+def calculate_value(amount, price):
+ """
+ Calculates the total value of Bitcoin based on the amount and current price.
+ """
+ return float(amount) * float(price)
diff --git a/bitcoin_trading_simulation.py b/bitcoin_trading_simulation.py
index c86be3e..7911477 100644
--- a/bitcoin_trading_simulation.py
+++ b/bitcoin_trading_simulation.py
@@ -1,38 +1,34 @@
import argparse
+import time
+import sys
import numpy as np
import pandas as pd
-import argparse
class Colors:
HEADER = '\033[95m'
BLUE = '\033[94m'
+ CYAN = '\033[96m'
GREEN = '\033[92m'
- RED = '\033[91m'
+ WARNING = '\033[93m'
+ FAIL = '\033[91m'
ENDC = '\033[0m'
BOLD = '\033[1m'
+ UNDERLINE = '\033[4m'
@classmethod
def disable(cls):
cls.HEADER = ''
cls.BLUE = ''
+ cls.CYAN = ''
cls.GREEN = ''
- cls.RED = ''
+ cls.WARNING = ''
+ cls.FAIL = ''
cls.ENDC = ''
cls.BOLD = ''
+ cls.UNDERLINE = ''
-class Colors:
- HEADER = '\033[95m'
- BLUE = '\033[94m'
- CYAN = '\033[96m'
- GREEN = '\033[92m'
- WARNING = '\033[93m'
- FAIL = '\033[91m'
- ENDC = '\033[0m'
- BOLD = '\033[1m'
- UNDERLINE = '\033[4m'
-
def simulate_bitcoin_prices(days=60, initial_price=50000, volatility=0.02):
"""
Simulates Bitcoin prices for a given number of days using Geometric Brownian Motion.
@@ -87,9 +83,7 @@ def simulate_trading(signals, initial_cash=10000, quiet=False):
portfolio['total_value'] = float(initial_cash)
if not quiet:
- print(f"{Colors.HEADER}{Colors.BOLD}------ Daily Trading Ledger ------{Colors.ENDC}")
-
- print(f"\n{Colors.HEADER}{Colors.BOLD}------ Daily Trading Ledger ------{Colors.ENDC}")
+ print(f"\n{Colors.HEADER}{Colors.BOLD}------ Daily Trading Ledger ------{Colors.ENDC}")
for i, row in signals.iterrows():
if i > 0:
portfolio.loc[i, 'cash'] = portfolio.loc[i-1, 'cash']
@@ -119,6 +113,21 @@ def simulate_trading(signals, initial_cash=10000, quiet=False):
return portfolio
+def countdown(quiet=False):
+ """
+ Displays a countdown before the simulation starts.
+ """
+ if quiet or not sys.stdout.isatty():
+ return
+
+ print(f"\n{Colors.BLUE}{Colors.BOLD}Simulation starting in...{Colors.ENDC}")
+ print("(", end="", flush=True)
+ for i in range(3, 0, -1):
+ print(f"{Colors.CYAN}{i}.. {Colors.ENDC}", end="", flush=True)
+ time.sleep(1)
+ print(f"{Colors.GREEN}{Colors.BOLD}GO!{Colors.ENDC})\n")
+
+
if __name__ == "__main__":
parser = argparse.ArgumentParser(description="Bitcoin Trading Simulation")
parser.add_argument("--days", type=int, default=60, help="Number of days to simulate")
@@ -133,6 +142,23 @@ def simulate_trading(signals, initial_cash=10000, quiet=False):
if args.no_color:
Colors.disable()
+ # Input Validation
+ if args.days <= 0:
+ print(f"{Colors.FAIL}Error: Days must be a positive integer.{Colors.ENDC}", file=sys.stderr)
+ sys.exit(1)
+
+ if args.initial_cash <= 0:
+ print(f"{Colors.FAIL}Error: Initial cash must be greater than 0.{Colors.ENDC}", file=sys.stderr)
+ sys.exit(1)
+
+ if args.initial_price <= 0:
+ print(f"{Colors.FAIL}Error: Initial price must be greater than 0.{Colors.ENDC}", file=sys.stderr)
+ sys.exit(1)
+
+ if args.volatility < 0:
+ print(f"{Colors.FAIL}Error: Volatility must be non-negative.{Colors.ENDC}", file=sys.stderr)
+ sys.exit(1)
+
# Simulate prices
prices = simulate_bitcoin_prices(days=args.days, initial_price=args.initial_price, volatility=args.volatility)
@@ -142,6 +168,9 @@ def simulate_trading(signals, initial_cash=10000, quiet=False):
# Generate trading signals
signals = generate_trading_signals(signals)
+ # Display countdown
+ countdown(args.quiet)
+
# Simulate trading
portfolio = simulate_trading(signals, initial_cash=args.initial_cash, quiet=args.quiet)
@@ -153,13 +182,51 @@ def simulate_trading(signals, initial_cash=10000, quiet=False):
# Compare with buy and hold strategy
buy_and_hold_btc = args.initial_cash / prices.iloc[0]
buy_and_hold_value = buy_and_hold_btc * prices.iloc[-1]
-
- print(f"\n{Colors.HEADER}{Colors.BOLD}------ Final Portfolio Performance ------{Colors.ENDC}")
- print(f"Initial Cash: ${initial_cash:.2f}")
- print(f"Final Portfolio Value: ${final_value:.2f}")
- if profit >= 0:
- print(f"{Colors.GREEN}💰 Profit/Loss: ${profit:.2f}{Colors.ENDC}")
- else:
- print(f"{Colors.FAIL}📉 Profit/Loss: ${profit:.2f}{Colors.ENDC}")
- print(f"Buy and Hold Strategy Value: ${buy_and_hold_value:.2f}")
- print(f"{Colors.HEADER}-----------------------------------------{Colors.ENDC}")
+
+ # Calculate additional statistics
+ roi = (profit / initial_cash) * 100
+ trade_count_buys = int(portfolio['btc'].diff().fillna(0).gt(0).sum())
+ trade_count_sells = int(portfolio['btc'].diff().fillna(0).lt(0).sum())
+ total_trades = trade_count_buys + trade_count_sells
+ vs_buy_hold = final_value - buy_and_hold_value
+
+ # Format the final report
+ width = 44
+ border = "═" * width
+
+ print(f"\n{Colors.HEADER}{Colors.BOLD}╔{border}╗{Colors.ENDC}")
+ title = "Final Portfolio Performance"
+ print(f"{Colors.HEADER}{Colors.BOLD}║{title:^{width}}║{Colors.ENDC}")
+ print(f"{Colors.HEADER}{Colors.BOLD}╠{border}╣{Colors.ENDC}")
+
+ def print_line(label, value_str, color=Colors.ENDC):
+ left_border = f"{Colors.HEADER}{Colors.BOLD}║{Colors.ENDC}"
+ right_border = f"{Colors.HEADER}{Colors.BOLD}║{Colors.ENDC}"
+ print(f"{left_border} {label:<24}{color}{value_str:>18}{Colors.ENDC} {right_border}")
+
+ print_line("Initial Cash:", f"${initial_cash:,.2f}")
+ print_line("Final Portfolio Value:", f"${final_value:,.2f}")
+
+ profit_color = Colors.GREEN if profit >= 0 else Colors.FAIL
+ profit_sign = "+" if profit >= 0 else "-"
+ print_line("Profit/Loss:", f"{profit_sign}${abs(profit):,.2f}", profit_color)
+
+ roi_color = Colors.GREEN if roi >= 0 else Colors.FAIL
+ roi_sign = "+" if roi >= 0 else "-"
+ print_line("ROI:", f"{roi_sign}{abs(roi):.2f}%", roi_color)
+
+ print(f"{Colors.HEADER}{Colors.BOLD}╠{border}╣{Colors.ENDC}")
+
+ print_line("Total Trades:", f"{total_trades}")
+ print_line(" - Buys:", f"{trade_count_buys}")
+ print_line(" - Sells:", f"{trade_count_sells}")
+
+ print(f"{Colors.HEADER}{Colors.BOLD}╠{border}╣{Colors.ENDC}")
+
+ print_line("Buy & Hold Value:", f"${buy_and_hold_value:,.2f}")
+
+ vs_color = Colors.GREEN if vs_buy_hold >= 0 else Colors.FAIL
+ vs_sign = "+" if vs_buy_hold >= 0 else "-"
+ print_line("vs Buy & Hold:", f"{vs_sign}${abs(vs_buy_hold):,.2f}", vs_color)
+
+ print(f"{Colors.HEADER}{Colors.BOLD}╚{border}╝{Colors.ENDC}")
diff --git a/requirements.txt b/requirements.txt
index 5da331c..4ad1501 100644
--- a/requirements.txt
+++ b/requirements.txt
@@ -1,2 +1,3 @@
numpy
pandas
+requests
diff --git a/src/main.rs b/src/main.rs
new file mode 100644
index 0000000..a3e978a
--- /dev/null
+++ b/src/main.rs
@@ -0,0 +1 @@
+fn main() { println!("Hello, world!"); }
diff --git a/target/.rustc_info.json b/target/.rustc_info.json
new file mode 100644
index 0000000..747eff8
--- /dev/null
+++ b/target/.rustc_info.json
@@ -0,0 +1 @@
+{"rustc_fingerprint":11990908473491073401,"outputs":{"7971740275564407648":{"success":true,"status":"","code":0,"stdout":"___\nlib___.rlib\nlib___.so\nlib___.so\nlib___.a\nlib___.so\n/home/jules/.rustup/toolchains/stable-x86_64-unknown-linux-gnu\noff\npacked\nunpacked\n___\ndebug_assertions\npanic=\"unwind\"\nproc_macro\ntarget_abi=\"\"\ntarget_arch=\"x86_64\"\ntarget_endian=\"little\"\ntarget_env=\"gnu\"\ntarget_family=\"unix\"\ntarget_feature=\"fxsr\"\ntarget_feature=\"sse\"\ntarget_feature=\"sse2\"\ntarget_has_atomic=\"16\"\ntarget_has_atomic=\"32\"\ntarget_has_atomic=\"64\"\ntarget_has_atomic=\"8\"\ntarget_has_atomic=\"ptr\"\ntarget_os=\"linux\"\ntarget_pointer_width=\"64\"\ntarget_vendor=\"unknown\"\nunix\n","stderr":""},"17747080675513052775":{"success":true,"status":"","code":0,"stdout":"rustc 1.92.0 (ded5c06cf 2025-12-08)\nbinary: rustc\ncommit-hash: ded5c06cf21d2b93bffd5d884aa6e96934ee4234\ncommit-date: 2025-12-08\nhost: x86_64-unknown-linux-gnu\nrelease: 1.92.0\nLLVM version: 21.1.3\n","stderr":""}},"successes":{}}
\ No newline at end of file
diff --git a/target/CACHEDIR.TAG b/target/CACHEDIR.TAG
new file mode 100644
index 0000000..20d7c31
--- /dev/null
+++ b/target/CACHEDIR.TAG
@@ -0,0 +1,3 @@
+Signature: 8a477f597d28d172789f06886806bc55
+# This file is a cache directory tag created by cargo.
+# For information about cache directory tags see https://bford.info/cachedir/
diff --git a/target/debug/.cargo-lock b/target/debug/.cargo-lock
new file mode 100644
index 0000000..e69de29
diff --git a/target/debug/.fingerprint/cfg-if-2d20780be38939e6/dep-lib-cfg_if b/target/debug/.fingerprint/cfg-if-2d20780be38939e6/dep-lib-cfg_if
new file mode 100644
index 0000000..ec3cb8b
Binary files /dev/null and b/target/debug/.fingerprint/cfg-if-2d20780be38939e6/dep-lib-cfg_if differ
diff --git a/target/debug/.fingerprint/cfg-if-2d20780be38939e6/invoked.timestamp b/target/debug/.fingerprint/cfg-if-2d20780be38939e6/invoked.timestamp
new file mode 100644
index 0000000..e00328d
--- /dev/null
+++ b/target/debug/.fingerprint/cfg-if-2d20780be38939e6/invoked.timestamp
@@ -0,0 +1 @@
+This file has an mtime of when this was started.
\ No newline at end of file
diff --git a/target/debug/.fingerprint/cfg-if-2d20780be38939e6/lib-cfg_if b/target/debug/.fingerprint/cfg-if-2d20780be38939e6/lib-cfg_if
new file mode 100644
index 0000000..117f269
--- /dev/null
+++ b/target/debug/.fingerprint/cfg-if-2d20780be38939e6/lib-cfg_if
@@ -0,0 +1 @@
+fb18494944273c29
\ No newline at end of file
diff --git a/target/debug/.fingerprint/cfg-if-2d20780be38939e6/lib-cfg_if.json b/target/debug/.fingerprint/cfg-if-2d20780be38939e6/lib-cfg_if.json
new file mode 100644
index 0000000..1156ac1
--- /dev/null
+++ b/target/debug/.fingerprint/cfg-if-2d20780be38939e6/lib-cfg_if.json
@@ -0,0 +1 @@
+{"rustc":4758242423518056681,"features":"[]","declared_features":"[\"core\", \"rustc-dep-of-std\"]","target":13840298032947503755,"profile":15657897354478470176,"path":828088505969299709,"deps":[],"local":[{"CheckDepInfo":{"dep_info":"debug/.fingerprint/cfg-if-2d20780be38939e6/dep-lib-cfg_if","checksum":false}}],"rustflags":[],"config":2069994364910194474,"compile_kind":0}
\ No newline at end of file
diff --git a/target/debug/.fingerprint/colored-0832305205b4f75d/dep-lib-colored b/target/debug/.fingerprint/colored-0832305205b4f75d/dep-lib-colored
new file mode 100644
index 0000000..ec3cb8b
Binary files /dev/null and b/target/debug/.fingerprint/colored-0832305205b4f75d/dep-lib-colored differ
diff --git a/target/debug/.fingerprint/colored-0832305205b4f75d/invoked.timestamp b/target/debug/.fingerprint/colored-0832305205b4f75d/invoked.timestamp
new file mode 100644
index 0000000..e00328d
--- /dev/null
+++ b/target/debug/.fingerprint/colored-0832305205b4f75d/invoked.timestamp
@@ -0,0 +1 @@
+This file has an mtime of when this was started.
\ No newline at end of file
diff --git a/target/debug/.fingerprint/colored-0832305205b4f75d/lib-colored b/target/debug/.fingerprint/colored-0832305205b4f75d/lib-colored
new file mode 100644
index 0000000..a072ffb
--- /dev/null
+++ b/target/debug/.fingerprint/colored-0832305205b4f75d/lib-colored
@@ -0,0 +1 @@
+352ba7ccf97bd44e
\ No newline at end of file
diff --git a/target/debug/.fingerprint/colored-0832305205b4f75d/lib-colored.json b/target/debug/.fingerprint/colored-0832305205b4f75d/lib-colored.json
new file mode 100644
index 0000000..04b0add
--- /dev/null
+++ b/target/debug/.fingerprint/colored-0832305205b4f75d/lib-colored.json
@@ -0,0 +1 @@
+{"rustc":4758242423518056681,"features":"[]","declared_features":"[\"no-color\"]","target":10635017557502881088,"profile":15657897354478470176,"path":4587278367410923654,"deps":[[17917672826516349275,"lazy_static",false,8423304046068410946]],"local":[{"CheckDepInfo":{"dep_info":"debug/.fingerprint/colored-0832305205b4f75d/dep-lib-colored","checksum":false}}],"rustflags":[],"config":2069994364910194474,"compile_kind":0}
\ No newline at end of file
diff --git a/target/debug/.fingerprint/eijack-lab-rust-694e13ac6608183a/bin-eijack-lab-rust b/target/debug/.fingerprint/eijack-lab-rust-694e13ac6608183a/bin-eijack-lab-rust
new file mode 100644
index 0000000..15a3c41
--- /dev/null
+++ b/target/debug/.fingerprint/eijack-lab-rust-694e13ac6608183a/bin-eijack-lab-rust
@@ -0,0 +1 @@
+eaa81b302d8c79b7
\ No newline at end of file
diff --git a/target/debug/.fingerprint/eijack-lab-rust-694e13ac6608183a/bin-eijack-lab-rust.json b/target/debug/.fingerprint/eijack-lab-rust-694e13ac6608183a/bin-eijack-lab-rust.json
new file mode 100644
index 0000000..68299ae
--- /dev/null
+++ b/target/debug/.fingerprint/eijack-lab-rust-694e13ac6608183a/bin-eijack-lab-rust.json
@@ -0,0 +1 @@
+{"rustc":4758242423518056681,"features":"[]","declared_features":"[]","target":16337832459791398879,"profile":8731458305071235362,"path":4942398508502643691,"deps":[[13208667028893622512,"rand",false,16627439250970250203],[13731153033113646547,"colored",false,5680301342831618869]],"local":[{"CheckDepInfo":{"dep_info":"debug/.fingerprint/eijack-lab-rust-694e13ac6608183a/dep-bin-eijack-lab-rust","checksum":false}}],"rustflags":[],"config":2069994364910194474,"compile_kind":0}
\ No newline at end of file
diff --git a/target/debug/.fingerprint/eijack-lab-rust-694e13ac6608183a/dep-bin-eijack-lab-rust b/target/debug/.fingerprint/eijack-lab-rust-694e13ac6608183a/dep-bin-eijack-lab-rust
new file mode 100644
index 0000000..5c54f74
Binary files /dev/null and b/target/debug/.fingerprint/eijack-lab-rust-694e13ac6608183a/dep-bin-eijack-lab-rust differ
diff --git a/target/debug/.fingerprint/eijack-lab-rust-694e13ac6608183a/invoked.timestamp b/target/debug/.fingerprint/eijack-lab-rust-694e13ac6608183a/invoked.timestamp
new file mode 100644
index 0000000..e00328d
--- /dev/null
+++ b/target/debug/.fingerprint/eijack-lab-rust-694e13ac6608183a/invoked.timestamp
@@ -0,0 +1 @@
+This file has an mtime of when this was started.
\ No newline at end of file
diff --git a/target/debug/.fingerprint/getrandom-8727cd4f494f15ae/dep-lib-getrandom b/target/debug/.fingerprint/getrandom-8727cd4f494f15ae/dep-lib-getrandom
new file mode 100644
index 0000000..ec3cb8b
Binary files /dev/null and b/target/debug/.fingerprint/getrandom-8727cd4f494f15ae/dep-lib-getrandom differ
diff --git a/target/debug/.fingerprint/getrandom-8727cd4f494f15ae/invoked.timestamp b/target/debug/.fingerprint/getrandom-8727cd4f494f15ae/invoked.timestamp
new file mode 100644
index 0000000..e00328d
--- /dev/null
+++ b/target/debug/.fingerprint/getrandom-8727cd4f494f15ae/invoked.timestamp
@@ -0,0 +1 @@
+This file has an mtime of when this was started.
\ No newline at end of file
diff --git a/target/debug/.fingerprint/getrandom-8727cd4f494f15ae/lib-getrandom b/target/debug/.fingerprint/getrandom-8727cd4f494f15ae/lib-getrandom
new file mode 100644
index 0000000..47ae407
--- /dev/null
+++ b/target/debug/.fingerprint/getrandom-8727cd4f494f15ae/lib-getrandom
@@ -0,0 +1 @@
+2d9f943c01b1af4a
\ No newline at end of file
diff --git a/target/debug/.fingerprint/getrandom-8727cd4f494f15ae/lib-getrandom.json b/target/debug/.fingerprint/getrandom-8727cd4f494f15ae/lib-getrandom.json
new file mode 100644
index 0000000..734ae3d
--- /dev/null
+++ b/target/debug/.fingerprint/getrandom-8727cd4f494f15ae/lib-getrandom.json
@@ -0,0 +1 @@
+{"rustc":4758242423518056681,"features":"[\"std\"]","declared_features":"[\"compiler_builtins\", \"core\", \"custom\", \"js\", \"js-sys\", \"linux_disable_fallback\", \"rdrand\", \"rustc-dep-of-std\", \"std\", \"test-in-browser\", \"wasm-bindgen\"]","target":16244099637825074703,"profile":15657897354478470176,"path":59692596234819462,"deps":[[7667230146095136825,"cfg_if",false,2971293028398471419],[18365559012052052344,"libc",false,16544904380361567079]],"local":[{"CheckDepInfo":{"dep_info":"debug/.fingerprint/getrandom-8727cd4f494f15ae/dep-lib-getrandom","checksum":false}}],"rustflags":[],"config":2069994364910194474,"compile_kind":0}
\ No newline at end of file
diff --git a/target/debug/.fingerprint/lazy_static-722897d89f2060da/dep-lib-lazy_static b/target/debug/.fingerprint/lazy_static-722897d89f2060da/dep-lib-lazy_static
new file mode 100644
index 0000000..ec3cb8b
Binary files /dev/null and b/target/debug/.fingerprint/lazy_static-722897d89f2060da/dep-lib-lazy_static differ
diff --git a/target/debug/.fingerprint/lazy_static-722897d89f2060da/invoked.timestamp b/target/debug/.fingerprint/lazy_static-722897d89f2060da/invoked.timestamp
new file mode 100644
index 0000000..e00328d
--- /dev/null
+++ b/target/debug/.fingerprint/lazy_static-722897d89f2060da/invoked.timestamp
@@ -0,0 +1 @@
+This file has an mtime of when this was started.
\ No newline at end of file
diff --git a/target/debug/.fingerprint/lazy_static-722897d89f2060da/lib-lazy_static b/target/debug/.fingerprint/lazy_static-722897d89f2060da/lib-lazy_static
new file mode 100644
index 0000000..d11da81
--- /dev/null
+++ b/target/debug/.fingerprint/lazy_static-722897d89f2060da/lib-lazy_static
@@ -0,0 +1 @@
+42aa04bd6696e574
\ No newline at end of file
diff --git a/target/debug/.fingerprint/lazy_static-722897d89f2060da/lib-lazy_static.json b/target/debug/.fingerprint/lazy_static-722897d89f2060da/lib-lazy_static.json
new file mode 100644
index 0000000..5828400
--- /dev/null
+++ b/target/debug/.fingerprint/lazy_static-722897d89f2060da/lib-lazy_static.json
@@ -0,0 +1 @@
+{"rustc":4758242423518056681,"features":"[]","declared_features":"[\"spin\", \"spin_no_std\"]","target":8659156474882058145,"profile":15657897354478470176,"path":14186808162164221862,"deps":[],"local":[{"CheckDepInfo":{"dep_info":"debug/.fingerprint/lazy_static-722897d89f2060da/dep-lib-lazy_static","checksum":false}}],"rustflags":[],"config":2069994364910194474,"compile_kind":0}
\ No newline at end of file
diff --git a/target/debug/.fingerprint/libc-43b08553b7e99b31/dep-lib-libc b/target/debug/.fingerprint/libc-43b08553b7e99b31/dep-lib-libc
new file mode 100644
index 0000000..ec3cb8b
Binary files /dev/null and b/target/debug/.fingerprint/libc-43b08553b7e99b31/dep-lib-libc differ
diff --git a/target/debug/.fingerprint/libc-43b08553b7e99b31/invoked.timestamp b/target/debug/.fingerprint/libc-43b08553b7e99b31/invoked.timestamp
new file mode 100644
index 0000000..e00328d
--- /dev/null
+++ b/target/debug/.fingerprint/libc-43b08553b7e99b31/invoked.timestamp
@@ -0,0 +1 @@
+This file has an mtime of when this was started.
\ No newline at end of file
diff --git a/target/debug/.fingerprint/libc-43b08553b7e99b31/lib-libc b/target/debug/.fingerprint/libc-43b08553b7e99b31/lib-libc
new file mode 100644
index 0000000..42769be
--- /dev/null
+++ b/target/debug/.fingerprint/libc-43b08553b7e99b31/lib-libc
@@ -0,0 +1 @@
+676b4112e04e9be5
\ No newline at end of file
diff --git a/target/debug/.fingerprint/libc-43b08553b7e99b31/lib-libc.json b/target/debug/.fingerprint/libc-43b08553b7e99b31/lib-libc.json
new file mode 100644
index 0000000..1faa332
--- /dev/null
+++ b/target/debug/.fingerprint/libc-43b08553b7e99b31/lib-libc.json
@@ -0,0 +1 @@
+{"rustc":4758242423518056681,"features":"[]","declared_features":"[\"align\", \"const-extern-fn\", \"default\", \"extra_traits\", \"rustc-dep-of-std\", \"rustc-std-workspace-core\", \"std\", \"use_std\"]","target":17682796336736096309,"profile":6200076328592068522,"path":15371363379775449269,"deps":[[18365559012052052344,"build_script_build",false,5662575024077545023]],"local":[{"CheckDepInfo":{"dep_info":"debug/.fingerprint/libc-43b08553b7e99b31/dep-lib-libc","checksum":false}}],"rustflags":[],"config":2069994364910194474,"compile_kind":0}
\ No newline at end of file
diff --git a/target/debug/.fingerprint/libc-9c599bdfe2e6e8b5/build-script-build-script-build b/target/debug/.fingerprint/libc-9c599bdfe2e6e8b5/build-script-build-script-build
new file mode 100644
index 0000000..9f62750
--- /dev/null
+++ b/target/debug/.fingerprint/libc-9c599bdfe2e6e8b5/build-script-build-script-build
@@ -0,0 +1 @@
+901ab8cd676b0076
\ No newline at end of file
diff --git a/target/debug/.fingerprint/libc-9c599bdfe2e6e8b5/build-script-build-script-build.json b/target/debug/.fingerprint/libc-9c599bdfe2e6e8b5/build-script-build-script-build.json
new file mode 100644
index 0000000..6df1866
--- /dev/null
+++ b/target/debug/.fingerprint/libc-9c599bdfe2e6e8b5/build-script-build-script-build.json
@@ -0,0 +1 @@
+{"rustc":4758242423518056681,"features":"[]","declared_features":"[\"align\", \"const-extern-fn\", \"default\", \"extra_traits\", \"rustc-dep-of-std\", \"rustc-std-workspace-core\", \"std\", \"use_std\"]","target":5408242616063297496,"profile":1565149285177326037,"path":6665272496194606373,"deps":[],"local":[{"CheckDepInfo":{"dep_info":"debug/.fingerprint/libc-9c599bdfe2e6e8b5/dep-build-script-build-script-build","checksum":false}}],"rustflags":[],"config":2069994364910194474,"compile_kind":0}
\ No newline at end of file
diff --git a/target/debug/.fingerprint/libc-9c599bdfe2e6e8b5/dep-build-script-build-script-build b/target/debug/.fingerprint/libc-9c599bdfe2e6e8b5/dep-build-script-build-script-build
new file mode 100644
index 0000000..ec3cb8b
Binary files /dev/null and b/target/debug/.fingerprint/libc-9c599bdfe2e6e8b5/dep-build-script-build-script-build differ
diff --git a/target/debug/.fingerprint/libc-9c599bdfe2e6e8b5/invoked.timestamp b/target/debug/.fingerprint/libc-9c599bdfe2e6e8b5/invoked.timestamp
new file mode 100644
index 0000000..e00328d
--- /dev/null
+++ b/target/debug/.fingerprint/libc-9c599bdfe2e6e8b5/invoked.timestamp
@@ -0,0 +1 @@
+This file has an mtime of when this was started.
\ No newline at end of file
diff --git a/target/debug/.fingerprint/libc-db946e1a6607099d/run-build-script-build-script-build b/target/debug/.fingerprint/libc-db946e1a6607099d/run-build-script-build-script-build
new file mode 100644
index 0000000..e409f54
--- /dev/null
+++ b/target/debug/.fingerprint/libc-db946e1a6607099d/run-build-script-build-script-build
@@ -0,0 +1 @@
+3f1e2498fb81954e
\ No newline at end of file
diff --git a/target/debug/.fingerprint/libc-db946e1a6607099d/run-build-script-build-script-build.json b/target/debug/.fingerprint/libc-db946e1a6607099d/run-build-script-build-script-build.json
new file mode 100644
index 0000000..905bf4d
--- /dev/null
+++ b/target/debug/.fingerprint/libc-db946e1a6607099d/run-build-script-build-script-build.json
@@ -0,0 +1 @@
+{"rustc":4758242423518056681,"features":"","declared_features":"","target":0,"profile":0,"path":0,"deps":[[18365559012052052344,"build_script_build",false,8502914190052694672]],"local":[{"RerunIfChanged":{"output":"debug/build/libc-db946e1a6607099d/output","paths":["build.rs"]}},{"RerunIfEnvChanged":{"var":"RUST_LIBC_UNSTABLE_FREEBSD_VERSION","val":null}},{"RerunIfEnvChanged":{"var":"RUST_LIBC_UNSTABLE_MUSL_V1_2_3","val":null}},{"RerunIfEnvChanged":{"var":"RUST_LIBC_UNSTABLE_LINUX_TIME_BITS64","val":null}},{"RerunIfEnvChanged":{"var":"RUST_LIBC_UNSTABLE_GNU_FILE_OFFSET_BITS","val":null}},{"RerunIfEnvChanged":{"var":"RUST_LIBC_UNSTABLE_GNU_TIME_BITS","val":null}}],"rustflags":[],"config":0,"compile_kind":0}
\ No newline at end of file
diff --git a/target/debug/.fingerprint/ppv-lite86-e98734d0c5de5b29/dep-lib-ppv_lite86 b/target/debug/.fingerprint/ppv-lite86-e98734d0c5de5b29/dep-lib-ppv_lite86
new file mode 100644
index 0000000..ec3cb8b
Binary files /dev/null and b/target/debug/.fingerprint/ppv-lite86-e98734d0c5de5b29/dep-lib-ppv_lite86 differ
diff --git a/target/debug/.fingerprint/ppv-lite86-e98734d0c5de5b29/invoked.timestamp b/target/debug/.fingerprint/ppv-lite86-e98734d0c5de5b29/invoked.timestamp
new file mode 100644
index 0000000..e00328d
--- /dev/null
+++ b/target/debug/.fingerprint/ppv-lite86-e98734d0c5de5b29/invoked.timestamp
@@ -0,0 +1 @@
+This file has an mtime of when this was started.
\ No newline at end of file
diff --git a/target/debug/.fingerprint/ppv-lite86-e98734d0c5de5b29/lib-ppv_lite86 b/target/debug/.fingerprint/ppv-lite86-e98734d0c5de5b29/lib-ppv_lite86
new file mode 100644
index 0000000..2e1fa4c
--- /dev/null
+++ b/target/debug/.fingerprint/ppv-lite86-e98734d0c5de5b29/lib-ppv_lite86
@@ -0,0 +1 @@
+bea6f7245d2719fd
\ No newline at end of file
diff --git a/target/debug/.fingerprint/ppv-lite86-e98734d0c5de5b29/lib-ppv_lite86.json b/target/debug/.fingerprint/ppv-lite86-e98734d0c5de5b29/lib-ppv_lite86.json
new file mode 100644
index 0000000..36f0b00
--- /dev/null
+++ b/target/debug/.fingerprint/ppv-lite86-e98734d0c5de5b29/lib-ppv_lite86.json
@@ -0,0 +1 @@
+{"rustc":4758242423518056681,"features":"[\"simd\", \"std\"]","declared_features":"[\"default\", \"no_simd\", \"simd\", \"std\"]","target":2607852365283500179,"profile":15657897354478470176,"path":13675546687387606575,"deps":[[17375358419629610217,"zerocopy",false,6221313426439170667]],"local":[{"CheckDepInfo":{"dep_info":"debug/.fingerprint/ppv-lite86-e98734d0c5de5b29/dep-lib-ppv_lite86","checksum":false}}],"rustflags":[],"config":2069994364910194474,"compile_kind":0}
\ No newline at end of file
diff --git a/target/debug/.fingerprint/rand-8c96806fecc70ae1/dep-lib-rand b/target/debug/.fingerprint/rand-8c96806fecc70ae1/dep-lib-rand
new file mode 100644
index 0000000..ec3cb8b
Binary files /dev/null and b/target/debug/.fingerprint/rand-8c96806fecc70ae1/dep-lib-rand differ
diff --git a/target/debug/.fingerprint/rand-8c96806fecc70ae1/invoked.timestamp b/target/debug/.fingerprint/rand-8c96806fecc70ae1/invoked.timestamp
new file mode 100644
index 0000000..e00328d
--- /dev/null
+++ b/target/debug/.fingerprint/rand-8c96806fecc70ae1/invoked.timestamp
@@ -0,0 +1 @@
+This file has an mtime of when this was started.
\ No newline at end of file
diff --git a/target/debug/.fingerprint/rand-8c96806fecc70ae1/lib-rand b/target/debug/.fingerprint/rand-8c96806fecc70ae1/lib-rand
new file mode 100644
index 0000000..00cc157
--- /dev/null
+++ b/target/debug/.fingerprint/rand-8c96806fecc70ae1/lib-rand
@@ -0,0 +1 @@
+db0b781ee787c0e6
\ No newline at end of file
diff --git a/target/debug/.fingerprint/rand-8c96806fecc70ae1/lib-rand.json b/target/debug/.fingerprint/rand-8c96806fecc70ae1/lib-rand.json
new file mode 100644
index 0000000..0cf48f8
--- /dev/null
+++ b/target/debug/.fingerprint/rand-8c96806fecc70ae1/lib-rand.json
@@ -0,0 +1 @@
+{"rustc":4758242423518056681,"features":"[\"alloc\", \"default\", \"getrandom\", \"libc\", \"rand_chacha\", \"std\", \"std_rng\"]","declared_features":"[\"alloc\", \"default\", \"getrandom\", \"libc\", \"log\", \"min_const_gen\", \"nightly\", \"packed_simd\", \"rand_chacha\", \"serde\", \"serde1\", \"simd_support\", \"small_rng\", \"std\", \"std_rng\"]","target":8827111241893198906,"profile":15657897354478470176,"path":10385015244823701454,"deps":[[1573238666360410412,"rand_chacha",false,11991201559265771079],[18130209639506977569,"rand_core",false,9973978111316723004],[18365559012052052344,"libc",false,16544904380361567079]],"local":[{"CheckDepInfo":{"dep_info":"debug/.fingerprint/rand-8c96806fecc70ae1/dep-lib-rand","checksum":false}}],"rustflags":[],"config":2069994364910194474,"compile_kind":0}
\ No newline at end of file
diff --git a/target/debug/.fingerprint/rand_chacha-06e631e3ab9dff9f/dep-lib-rand_chacha b/target/debug/.fingerprint/rand_chacha-06e631e3ab9dff9f/dep-lib-rand_chacha
new file mode 100644
index 0000000..ec3cb8b
Binary files /dev/null and b/target/debug/.fingerprint/rand_chacha-06e631e3ab9dff9f/dep-lib-rand_chacha differ
diff --git a/target/debug/.fingerprint/rand_chacha-06e631e3ab9dff9f/invoked.timestamp b/target/debug/.fingerprint/rand_chacha-06e631e3ab9dff9f/invoked.timestamp
new file mode 100644
index 0000000..e00328d
--- /dev/null
+++ b/target/debug/.fingerprint/rand_chacha-06e631e3ab9dff9f/invoked.timestamp
@@ -0,0 +1 @@
+This file has an mtime of when this was started.
\ No newline at end of file
diff --git a/target/debug/.fingerprint/rand_chacha-06e631e3ab9dff9f/lib-rand_chacha b/target/debug/.fingerprint/rand_chacha-06e631e3ab9dff9f/lib-rand_chacha
new file mode 100644
index 0000000..fd9dba8
--- /dev/null
+++ b/target/debug/.fingerprint/rand_chacha-06e631e3ab9dff9f/lib-rand_chacha
@@ -0,0 +1 @@
+477e253a494e69a6
\ No newline at end of file
diff --git a/target/debug/.fingerprint/rand_chacha-06e631e3ab9dff9f/lib-rand_chacha.json b/target/debug/.fingerprint/rand_chacha-06e631e3ab9dff9f/lib-rand_chacha.json
new file mode 100644
index 0000000..49723c7
--- /dev/null
+++ b/target/debug/.fingerprint/rand_chacha-06e631e3ab9dff9f/lib-rand_chacha.json
@@ -0,0 +1 @@
+{"rustc":4758242423518056681,"features":"[\"std\"]","declared_features":"[\"default\", \"serde\", \"serde1\", \"simd\", \"std\"]","target":15766068575093147603,"profile":15657897354478470176,"path":16898388428857554433,"deps":[[12919011715531272606,"ppv_lite86",false,18237651447019185854],[18130209639506977569,"rand_core",false,9973978111316723004]],"local":[{"CheckDepInfo":{"dep_info":"debug/.fingerprint/rand_chacha-06e631e3ab9dff9f/dep-lib-rand_chacha","checksum":false}}],"rustflags":[],"config":2069994364910194474,"compile_kind":0}
\ No newline at end of file
diff --git a/target/debug/.fingerprint/rand_core-1dea1b5cd4602ac8/dep-lib-rand_core b/target/debug/.fingerprint/rand_core-1dea1b5cd4602ac8/dep-lib-rand_core
new file mode 100644
index 0000000..ec3cb8b
Binary files /dev/null and b/target/debug/.fingerprint/rand_core-1dea1b5cd4602ac8/dep-lib-rand_core differ
diff --git a/target/debug/.fingerprint/rand_core-1dea1b5cd4602ac8/invoked.timestamp b/target/debug/.fingerprint/rand_core-1dea1b5cd4602ac8/invoked.timestamp
new file mode 100644
index 0000000..e00328d
--- /dev/null
+++ b/target/debug/.fingerprint/rand_core-1dea1b5cd4602ac8/invoked.timestamp
@@ -0,0 +1 @@
+This file has an mtime of when this was started.
\ No newline at end of file
diff --git a/target/debug/.fingerprint/rand_core-1dea1b5cd4602ac8/lib-rand_core b/target/debug/.fingerprint/rand_core-1dea1b5cd4602ac8/lib-rand_core
new file mode 100644
index 0000000..b57507a
--- /dev/null
+++ b/target/debug/.fingerprint/rand_core-1dea1b5cd4602ac8/lib-rand_core
@@ -0,0 +1 @@
+3c058e723fb06a8a
\ No newline at end of file
diff --git a/target/debug/.fingerprint/rand_core-1dea1b5cd4602ac8/lib-rand_core.json b/target/debug/.fingerprint/rand_core-1dea1b5cd4602ac8/lib-rand_core.json
new file mode 100644
index 0000000..8119c97
--- /dev/null
+++ b/target/debug/.fingerprint/rand_core-1dea1b5cd4602ac8/lib-rand_core.json
@@ -0,0 +1 @@
+{"rustc":4758242423518056681,"features":"[\"alloc\", \"getrandom\", \"std\"]","declared_features":"[\"alloc\", \"getrandom\", \"serde\", \"serde1\", \"std\"]","target":13770603672348587087,"profile":15657897354478470176,"path":5059078334079509975,"deps":[[11023519408959114924,"getrandom",false,5381714698600488749]],"local":[{"CheckDepInfo":{"dep_info":"debug/.fingerprint/rand_core-1dea1b5cd4602ac8/dep-lib-rand_core","checksum":false}}],"rustflags":[],"config":2069994364910194474,"compile_kind":0}
\ No newline at end of file
diff --git a/target/debug/.fingerprint/zerocopy-0c726811dd96422b/dep-lib-zerocopy b/target/debug/.fingerprint/zerocopy-0c726811dd96422b/dep-lib-zerocopy
new file mode 100644
index 0000000..ec3cb8b
Binary files /dev/null and b/target/debug/.fingerprint/zerocopy-0c726811dd96422b/dep-lib-zerocopy differ
diff --git a/target/debug/.fingerprint/zerocopy-0c726811dd96422b/invoked.timestamp b/target/debug/.fingerprint/zerocopy-0c726811dd96422b/invoked.timestamp
new file mode 100644
index 0000000..e00328d
--- /dev/null
+++ b/target/debug/.fingerprint/zerocopy-0c726811dd96422b/invoked.timestamp
@@ -0,0 +1 @@
+This file has an mtime of when this was started.
\ No newline at end of file
diff --git a/target/debug/.fingerprint/zerocopy-0c726811dd96422b/lib-zerocopy b/target/debug/.fingerprint/zerocopy-0c726811dd96422b/lib-zerocopy
new file mode 100644
index 0000000..95fd8ce
--- /dev/null
+++ b/target/debug/.fingerprint/zerocopy-0c726811dd96422b/lib-zerocopy
@@ -0,0 +1 @@
+6b6a4673998b5656
\ No newline at end of file
diff --git a/target/debug/.fingerprint/zerocopy-0c726811dd96422b/lib-zerocopy.json b/target/debug/.fingerprint/zerocopy-0c726811dd96422b/lib-zerocopy.json
new file mode 100644
index 0000000..7ad8a87
--- /dev/null
+++ b/target/debug/.fingerprint/zerocopy-0c726811dd96422b/lib-zerocopy.json
@@ -0,0 +1 @@
+{"rustc":4758242423518056681,"features":"[\"simd\"]","declared_features":"[\"__internal_use_only_features_that_work_on_stable\", \"alloc\", \"derive\", \"float-nightly\", \"simd\", \"simd-nightly\", \"std\", \"zerocopy-derive\"]","target":3084901215544504908,"profile":15657897354478470176,"path":9721087258936554607,"deps":[[17375358419629610217,"build_script_build",false,7447620231246918782]],"local":[{"CheckDepInfo":{"dep_info":"debug/.fingerprint/zerocopy-0c726811dd96422b/dep-lib-zerocopy","checksum":false}}],"rustflags":[],"config":2069994364910194474,"compile_kind":0}
\ No newline at end of file
diff --git a/target/debug/.fingerprint/zerocopy-30c85b0c603db08e/run-build-script-build-script-build b/target/debug/.fingerprint/zerocopy-30c85b0c603db08e/run-build-script-build-script-build
new file mode 100644
index 0000000..19b75c1
--- /dev/null
+++ b/target/debug/.fingerprint/zerocopy-30c85b0c603db08e/run-build-script-build-script-build
@@ -0,0 +1 @@
+7e347c2124435b67
\ No newline at end of file
diff --git a/target/debug/.fingerprint/zerocopy-30c85b0c603db08e/run-build-script-build-script-build.json b/target/debug/.fingerprint/zerocopy-30c85b0c603db08e/run-build-script-build-script-build.json
new file mode 100644
index 0000000..7b81793
--- /dev/null
+++ b/target/debug/.fingerprint/zerocopy-30c85b0c603db08e/run-build-script-build-script-build.json
@@ -0,0 +1 @@
+{"rustc":4758242423518056681,"features":"","declared_features":"","target":0,"profile":0,"path":0,"deps":[[17375358419629610217,"build_script_build",false,17805900089940872276]],"local":[{"RerunIfChanged":{"output":"debug/build/zerocopy-30c85b0c603db08e/output","paths":["build.rs","Cargo.toml"]}}],"rustflags":[],"config":0,"compile_kind":0}
\ No newline at end of file
diff --git a/target/debug/.fingerprint/zerocopy-88913a0a0ea1f7ec/build-script-build-script-build b/target/debug/.fingerprint/zerocopy-88913a0a0ea1f7ec/build-script-build-script-build
new file mode 100644
index 0000000..b46addd
--- /dev/null
+++ b/target/debug/.fingerprint/zerocopy-88913a0a0ea1f7ec/build-script-build-script-build
@@ -0,0 +1 @@
+548c05c7ca431bf7
\ No newline at end of file
diff --git a/target/debug/.fingerprint/zerocopy-88913a0a0ea1f7ec/build-script-build-script-build.json b/target/debug/.fingerprint/zerocopy-88913a0a0ea1f7ec/build-script-build-script-build.json
new file mode 100644
index 0000000..ed60d76
--- /dev/null
+++ b/target/debug/.fingerprint/zerocopy-88913a0a0ea1f7ec/build-script-build-script-build.json
@@ -0,0 +1 @@
+{"rustc":4758242423518056681,"features":"[\"simd\"]","declared_features":"[\"__internal_use_only_features_that_work_on_stable\", \"alloc\", \"derive\", \"float-nightly\", \"simd\", \"simd-nightly\", \"std\", \"zerocopy-derive\"]","target":5408242616063297496,"profile":2225463790103693989,"path":3740372662056961748,"deps":[],"local":[{"CheckDepInfo":{"dep_info":"debug/.fingerprint/zerocopy-88913a0a0ea1f7ec/dep-build-script-build-script-build","checksum":false}}],"rustflags":[],"config":2069994364910194474,"compile_kind":0}
\ No newline at end of file
diff --git a/target/debug/.fingerprint/zerocopy-88913a0a0ea1f7ec/dep-build-script-build-script-build b/target/debug/.fingerprint/zerocopy-88913a0a0ea1f7ec/dep-build-script-build-script-build
new file mode 100644
index 0000000..ec3cb8b
Binary files /dev/null and b/target/debug/.fingerprint/zerocopy-88913a0a0ea1f7ec/dep-build-script-build-script-build differ
diff --git a/target/debug/.fingerprint/zerocopy-88913a0a0ea1f7ec/invoked.timestamp b/target/debug/.fingerprint/zerocopy-88913a0a0ea1f7ec/invoked.timestamp
new file mode 100644
index 0000000..e00328d
--- /dev/null
+++ b/target/debug/.fingerprint/zerocopy-88913a0a0ea1f7ec/invoked.timestamp
@@ -0,0 +1 @@
+This file has an mtime of when this was started.
\ No newline at end of file
diff --git a/target/debug/build/libc-9c599bdfe2e6e8b5/build-script-build b/target/debug/build/libc-9c599bdfe2e6e8b5/build-script-build
new file mode 100755
index 0000000..bbf4a10
Binary files /dev/null and b/target/debug/build/libc-9c599bdfe2e6e8b5/build-script-build differ
diff --git a/target/debug/build/libc-9c599bdfe2e6e8b5/build_script_build-9c599bdfe2e6e8b5 b/target/debug/build/libc-9c599bdfe2e6e8b5/build_script_build-9c599bdfe2e6e8b5
new file mode 100755
index 0000000..bbf4a10
Binary files /dev/null and b/target/debug/build/libc-9c599bdfe2e6e8b5/build_script_build-9c599bdfe2e6e8b5 differ
diff --git a/target/debug/build/libc-db946e1a6607099d/invoked.timestamp b/target/debug/build/libc-db946e1a6607099d/invoked.timestamp
new file mode 100644
index 0000000..e00328d
--- /dev/null
+++ b/target/debug/build/libc-db946e1a6607099d/invoked.timestamp
@@ -0,0 +1 @@
+This file has an mtime of when this was started.
\ No newline at end of file
diff --git a/target/debug/build/libc-db946e1a6607099d/output b/target/debug/build/libc-db946e1a6607099d/output
new file mode 100644
index 0000000..89a43b5
--- /dev/null
+++ b/target/debug/build/libc-db946e1a6607099d/output
@@ -0,0 +1,25 @@
+cargo:rerun-if-changed=build.rs
+cargo:rerun-if-env-changed=RUST_LIBC_UNSTABLE_FREEBSD_VERSION
+cargo:rustc-cfg=freebsd12
+cargo:rerun-if-env-changed=RUST_LIBC_UNSTABLE_MUSL_V1_2_3
+cargo:rerun-if-env-changed=RUST_LIBC_UNSTABLE_LINUX_TIME_BITS64
+cargo:rerun-if-env-changed=RUST_LIBC_UNSTABLE_GNU_FILE_OFFSET_BITS
+cargo:rerun-if-env-changed=RUST_LIBC_UNSTABLE_GNU_TIME_BITS
+cargo:rustc-check-cfg=cfg(emscripten_old_stat_abi)
+cargo:rustc-check-cfg=cfg(espidf_time32)
+cargo:rustc-check-cfg=cfg(freebsd10)
+cargo:rustc-check-cfg=cfg(freebsd11)
+cargo:rustc-check-cfg=cfg(freebsd12)
+cargo:rustc-check-cfg=cfg(freebsd13)
+cargo:rustc-check-cfg=cfg(freebsd14)
+cargo:rustc-check-cfg=cfg(freebsd15)
+cargo:rustc-check-cfg=cfg(gnu_file_offset_bits64)
+cargo:rustc-check-cfg=cfg(gnu_time_bits64)
+cargo:rustc-check-cfg=cfg(libc_deny_warnings)
+cargo:rustc-check-cfg=cfg(linux_time_bits64)
+cargo:rustc-check-cfg=cfg(musl_v1_2_3)
+cargo:rustc-check-cfg=cfg(musl32_time64)
+cargo:rustc-check-cfg=cfg(vxworks_lt_25_09)
+cargo:rustc-check-cfg=cfg(target_os,values("switch","aix","ohos","hurd","rtems","visionos","nuttx","cygwin","qurt"))
+cargo:rustc-check-cfg=cfg(target_env,values("illumos","wasi","aix","ohos","nto71_iosock","nto80"))
+cargo:rustc-check-cfg=cfg(target_arch,values("loongarch64","mips32r6","mips64r6","csky"))
diff --git a/target/debug/build/libc-db946e1a6607099d/root-output b/target/debug/build/libc-db946e1a6607099d/root-output
new file mode 100644
index 0000000..afe4d54
--- /dev/null
+++ b/target/debug/build/libc-db946e1a6607099d/root-output
@@ -0,0 +1 @@
+/app/target/debug/build/libc-db946e1a6607099d/out
\ No newline at end of file
diff --git a/target/debug/build/libc-db946e1a6607099d/stderr b/target/debug/build/libc-db946e1a6607099d/stderr
new file mode 100644
index 0000000..e69de29
diff --git a/target/debug/build/zerocopy-30c85b0c603db08e/invoked.timestamp b/target/debug/build/zerocopy-30c85b0c603db08e/invoked.timestamp
new file mode 100644
index 0000000..e00328d
--- /dev/null
+++ b/target/debug/build/zerocopy-30c85b0c603db08e/invoked.timestamp
@@ -0,0 +1 @@
+This file has an mtime of when this was started.
\ No newline at end of file
diff --git a/target/debug/build/zerocopy-30c85b0c603db08e/output b/target/debug/build/zerocopy-30c85b0c603db08e/output
new file mode 100644
index 0000000..deda5f6
--- /dev/null
+++ b/target/debug/build/zerocopy-30c85b0c603db08e/output
@@ -0,0 +1,21 @@
+cargo:rerun-if-changed=build.rs
+cargo:rerun-if-changed=Cargo.toml
+cargo:rustc-check-cfg=cfg(no_zerocopy_simd_x86_avx12_1_89_0)
+cargo:rustc-check-cfg=cfg(rust, values("1.89.0"))
+cargo:rustc-check-cfg=cfg(no_zerocopy_core_error_1_81_0)
+cargo:rustc-check-cfg=cfg(rust, values("1.81.0"))
+cargo:rustc-check-cfg=cfg(no_zerocopy_diagnostic_on_unimplemented_1_78_0)
+cargo:rustc-check-cfg=cfg(rust, values("1.78.0"))
+cargo:rustc-check-cfg=cfg(no_zerocopy_generic_bounds_in_const_fn_1_61_0)
+cargo:rustc-check-cfg=cfg(rust, values("1.61.0"))
+cargo:rustc-check-cfg=cfg(no_zerocopy_target_has_atomics_1_60_0)
+cargo:rustc-check-cfg=cfg(rust, values("1.60.0"))
+cargo:rustc-check-cfg=cfg(no_zerocopy_aarch64_simd_1_59_0)
+cargo:rustc-check-cfg=cfg(rust, values("1.59.0"))
+cargo:rustc-check-cfg=cfg(no_zerocopy_panic_in_const_and_vec_try_reserve_1_57_0)
+cargo:rustc-check-cfg=cfg(rust, values("1.57.0"))
+cargo:rustc-check-cfg=cfg(doc_cfg)
+cargo:rustc-check-cfg=cfg(kani)
+cargo:rustc-check-cfg=cfg(__ZEROCOPY_INTERNAL_USE_ONLY_NIGHTLY_FEATURES_IN_TESTS)
+cargo:rustc-check-cfg=cfg(__ZEROCOPY_INTERNAL_USE_ONLY_DEV_MODE)
+cargo:rustc-check-cfg=cfg(coverage_nightly)
diff --git a/target/debug/build/zerocopy-30c85b0c603db08e/root-output b/target/debug/build/zerocopy-30c85b0c603db08e/root-output
new file mode 100644
index 0000000..7559a80
--- /dev/null
+++ b/target/debug/build/zerocopy-30c85b0c603db08e/root-output
@@ -0,0 +1 @@
+/app/target/debug/build/zerocopy-30c85b0c603db08e/out
\ No newline at end of file
diff --git a/target/debug/build/zerocopy-30c85b0c603db08e/stderr b/target/debug/build/zerocopy-30c85b0c603db08e/stderr
new file mode 100644
index 0000000..e69de29
diff --git a/target/debug/build/zerocopy-88913a0a0ea1f7ec/build-script-build b/target/debug/build/zerocopy-88913a0a0ea1f7ec/build-script-build
new file mode 100755
index 0000000..198579a
Binary files /dev/null and b/target/debug/build/zerocopy-88913a0a0ea1f7ec/build-script-build differ
diff --git a/target/debug/build/zerocopy-88913a0a0ea1f7ec/build_script_build-88913a0a0ea1f7ec b/target/debug/build/zerocopy-88913a0a0ea1f7ec/build_script_build-88913a0a0ea1f7ec
new file mode 100755
index 0000000..198579a
Binary files /dev/null and b/target/debug/build/zerocopy-88913a0a0ea1f7ec/build_script_build-88913a0a0ea1f7ec differ
diff --git a/target/debug/deps/eijack_lab_rust-694e13ac6608183a b/target/debug/deps/eijack_lab_rust-694e13ac6608183a
new file mode 100755
index 0000000..9b53f5a
Binary files /dev/null and b/target/debug/deps/eijack_lab_rust-694e13ac6608183a differ
diff --git a/target/debug/deps/libcfg_if-2d20780be38939e6.rlib b/target/debug/deps/libcfg_if-2d20780be38939e6.rlib
new file mode 100644
index 0000000..2dd8ed6
Binary files /dev/null and b/target/debug/deps/libcfg_if-2d20780be38939e6.rlib differ
diff --git a/target/debug/deps/libcfg_if-2d20780be38939e6.rmeta b/target/debug/deps/libcfg_if-2d20780be38939e6.rmeta
new file mode 100644
index 0000000..bfb273f
Binary files /dev/null and b/target/debug/deps/libcfg_if-2d20780be38939e6.rmeta differ
diff --git a/target/debug/deps/libcolored-0832305205b4f75d.rlib b/target/debug/deps/libcolored-0832305205b4f75d.rlib
new file mode 100644
index 0000000..7f77dfb
Binary files /dev/null and b/target/debug/deps/libcolored-0832305205b4f75d.rlib differ
diff --git a/target/debug/deps/libcolored-0832305205b4f75d.rmeta b/target/debug/deps/libcolored-0832305205b4f75d.rmeta
new file mode 100644
index 0000000..941dead
Binary files /dev/null and b/target/debug/deps/libcolored-0832305205b4f75d.rmeta differ
diff --git a/target/debug/deps/libgetrandom-8727cd4f494f15ae.rlib b/target/debug/deps/libgetrandom-8727cd4f494f15ae.rlib
new file mode 100644
index 0000000..4bafbb0
Binary files /dev/null and b/target/debug/deps/libgetrandom-8727cd4f494f15ae.rlib differ
diff --git a/target/debug/deps/libgetrandom-8727cd4f494f15ae.rmeta b/target/debug/deps/libgetrandom-8727cd4f494f15ae.rmeta
new file mode 100644
index 0000000..02d489e
Binary files /dev/null and b/target/debug/deps/libgetrandom-8727cd4f494f15ae.rmeta differ
diff --git a/target/debug/deps/liblazy_static-722897d89f2060da.rlib b/target/debug/deps/liblazy_static-722897d89f2060da.rlib
new file mode 100644
index 0000000..0077569
Binary files /dev/null and b/target/debug/deps/liblazy_static-722897d89f2060da.rlib differ
diff --git a/target/debug/deps/liblazy_static-722897d89f2060da.rmeta b/target/debug/deps/liblazy_static-722897d89f2060da.rmeta
new file mode 100644
index 0000000..d501a72
Binary files /dev/null and b/target/debug/deps/liblazy_static-722897d89f2060da.rmeta differ
diff --git a/target/debug/deps/liblibc-43b08553b7e99b31.rlib b/target/debug/deps/liblibc-43b08553b7e99b31.rlib
new file mode 100644
index 0000000..559c74c
Binary files /dev/null and b/target/debug/deps/liblibc-43b08553b7e99b31.rlib differ
diff --git a/target/debug/deps/liblibc-43b08553b7e99b31.rmeta b/target/debug/deps/liblibc-43b08553b7e99b31.rmeta
new file mode 100644
index 0000000..dfcf25a
Binary files /dev/null and b/target/debug/deps/liblibc-43b08553b7e99b31.rmeta differ
diff --git a/target/debug/deps/libppv_lite86-e98734d0c5de5b29.rlib b/target/debug/deps/libppv_lite86-e98734d0c5de5b29.rlib
new file mode 100644
index 0000000..52fa81b
Binary files /dev/null and b/target/debug/deps/libppv_lite86-e98734d0c5de5b29.rlib differ
diff --git a/target/debug/deps/libppv_lite86-e98734d0c5de5b29.rmeta b/target/debug/deps/libppv_lite86-e98734d0c5de5b29.rmeta
new file mode 100644
index 0000000..d7d7844
Binary files /dev/null and b/target/debug/deps/libppv_lite86-e98734d0c5de5b29.rmeta differ
diff --git a/target/debug/deps/librand-8c96806fecc70ae1.rlib b/target/debug/deps/librand-8c96806fecc70ae1.rlib
new file mode 100644
index 0000000..bcde2c7
Binary files /dev/null and b/target/debug/deps/librand-8c96806fecc70ae1.rlib differ
diff --git a/target/debug/deps/librand-8c96806fecc70ae1.rmeta b/target/debug/deps/librand-8c96806fecc70ae1.rmeta
new file mode 100644
index 0000000..10e4683
Binary files /dev/null and b/target/debug/deps/librand-8c96806fecc70ae1.rmeta differ
diff --git a/target/debug/deps/librand_chacha-06e631e3ab9dff9f.rlib b/target/debug/deps/librand_chacha-06e631e3ab9dff9f.rlib
new file mode 100644
index 0000000..8dbd67e
Binary files /dev/null and b/target/debug/deps/librand_chacha-06e631e3ab9dff9f.rlib differ
diff --git a/target/debug/deps/librand_chacha-06e631e3ab9dff9f.rmeta b/target/debug/deps/librand_chacha-06e631e3ab9dff9f.rmeta
new file mode 100644
index 0000000..10d86e8
Binary files /dev/null and b/target/debug/deps/librand_chacha-06e631e3ab9dff9f.rmeta differ
diff --git a/target/debug/deps/librand_core-1dea1b5cd4602ac8.rlib b/target/debug/deps/librand_core-1dea1b5cd4602ac8.rlib
new file mode 100644
index 0000000..7880486
Binary files /dev/null and b/target/debug/deps/librand_core-1dea1b5cd4602ac8.rlib differ
diff --git a/target/debug/deps/librand_core-1dea1b5cd4602ac8.rmeta b/target/debug/deps/librand_core-1dea1b5cd4602ac8.rmeta
new file mode 100644
index 0000000..18c0a81
Binary files /dev/null and b/target/debug/deps/librand_core-1dea1b5cd4602ac8.rmeta differ
diff --git a/target/debug/deps/libzerocopy-0c726811dd96422b.rlib b/target/debug/deps/libzerocopy-0c726811dd96422b.rlib
new file mode 100644
index 0000000..dbff8b9
Binary files /dev/null and b/target/debug/deps/libzerocopy-0c726811dd96422b.rlib differ
diff --git a/target/debug/deps/libzerocopy-0c726811dd96422b.rmeta b/target/debug/deps/libzerocopy-0c726811dd96422b.rmeta
new file mode 100644
index 0000000..8ded133
Binary files /dev/null and b/target/debug/deps/libzerocopy-0c726811dd96422b.rmeta differ
diff --git a/target/debug/eijack-lab-rust b/target/debug/eijack-lab-rust
new file mode 100755
index 0000000..9b53f5a
Binary files /dev/null and b/target/debug/eijack-lab-rust differ
diff --git a/target/debug/incremental/eijack_lab_rust-11rbgacjp2asi/s-hg6wrjagcr-0bc3gcv-0j9dye9parlitnbkrjdze8d5r/dep-graph.bin b/target/debug/incremental/eijack_lab_rust-11rbgacjp2asi/s-hg6wrjagcr-0bc3gcv-0j9dye9parlitnbkrjdze8d5r/dep-graph.bin
new file mode 100644
index 0000000..2ae9581
Binary files /dev/null and b/target/debug/incremental/eijack_lab_rust-11rbgacjp2asi/s-hg6wrjagcr-0bc3gcv-0j9dye9parlitnbkrjdze8d5r/dep-graph.bin differ
diff --git a/target/debug/incremental/eijack_lab_rust-11rbgacjp2asi/s-hg6wrjagcr-0bc3gcv-0j9dye9parlitnbkrjdze8d5r/query-cache.bin b/target/debug/incremental/eijack_lab_rust-11rbgacjp2asi/s-hg6wrjagcr-0bc3gcv-0j9dye9parlitnbkrjdze8d5r/query-cache.bin
new file mode 100644
index 0000000..2504e29
Binary files /dev/null and b/target/debug/incremental/eijack_lab_rust-11rbgacjp2asi/s-hg6wrjagcr-0bc3gcv-0j9dye9parlitnbkrjdze8d5r/query-cache.bin differ
diff --git a/target/debug/incremental/eijack_lab_rust-11rbgacjp2asi/s-hg6wrjagcr-0bc3gcv-0j9dye9parlitnbkrjdze8d5r/work-products.bin b/target/debug/incremental/eijack_lab_rust-11rbgacjp2asi/s-hg6wrjagcr-0bc3gcv-0j9dye9parlitnbkrjdze8d5r/work-products.bin
new file mode 100644
index 0000000..83bbd48
Binary files /dev/null and b/target/debug/incremental/eijack_lab_rust-11rbgacjp2asi/s-hg6wrjagcr-0bc3gcv-0j9dye9parlitnbkrjdze8d5r/work-products.bin differ
diff --git a/target/debug/incremental/eijack_lab_rust-11rbgacjp2asi/s-hg6wrjagcr-0bc3gcv.lock b/target/debug/incremental/eijack_lab_rust-11rbgacjp2asi/s-hg6wrjagcr-0bc3gcv.lock
new file mode 100644
index 0000000..e69de29
diff --git a/test_bitcoin.py b/test_bitcoin.py
index 163248c..4785f33 100644
--- a/test_bitcoin.py
+++ b/test_bitcoin.py
@@ -2,6 +2,7 @@
from unittest.mock import patch
from bitcoin import get_bitcoin_price, calculate_value
+
# Test 1: Verify the calculation logic
def test_calculate_value():
"""Ensure BTC to USD conversion math is correct."""
@@ -10,10 +11,12 @@ def test_calculate_value():
expected = 125000.0
assert calculate_value(amount, price) == expected
+
# Test 2: Verify handling of zero amount
def test_calculate_value_zero():
assert calculate_value(0, 50000.0) == 0.0
+
# Test 3: Mocking an API response
@patch('bitcoin.requests.get')
def test_get_bitcoin_price(mock_get):
@@ -23,10 +26,11 @@ def test_get_bitcoin_price(mock_get):
"bpi": {"USD": {"rate_float": 62000.50}}
}
mock_get.return_value.status_code = 200
-
+
price = get_bitcoin_price()
assert price == 62000.50
+
# Test 4: Handling API failure
@patch('bitcoin.requests.get')
def test_get_price_api_error(mock_get):
diff --git a/test_bitcoin_trading.py b/test_bitcoin_trading.py
index e7eac6f..6c480ea 100644
--- a/test_bitcoin_trading.py
+++ b/test_bitcoin_trading.py
@@ -13,7 +13,7 @@ def reset_colors():
'HEADER': Colors.HEADER,
'BLUE': Colors.BLUE,
'GREEN': Colors.GREEN,
- 'RED': Colors.RED,
+ 'FAIL': Colors.FAIL,
'ENDC': Colors.ENDC,
'BOLD': Colors.BOLD,
}
@@ -22,7 +22,7 @@ def reset_colors():
Colors.HEADER = original_colors['HEADER']
Colors.BLUE = original_colors['BLUE']
Colors.GREEN = original_colors['GREEN']
- Colors.RED = original_colors['RED']
+ Colors.FAIL = original_colors['FAIL']
Colors.ENDC = original_colors['ENDC']
Colors.BOLD = original_colors['BOLD']
@@ -58,7 +58,7 @@ def test_colors_disable(reset_colors):
Colors.disable()
assert Colors.HEADER == ""
assert Colors.GREEN == ""
- assert Colors.RED == ""
+ assert Colors.FAIL == ""
def test_simulation_integration():
diff --git a/test_cli_args.py b/test_cli_args.py
new file mode 100644
index 0000000..3acb4b1
--- /dev/null
+++ b/test_cli_args.py
@@ -0,0 +1,58 @@
+import sys
+import subprocess
+import pytest
+
+def run_simulation(args):
+ """
+ Helper function to run the simulation script as a subprocess.
+ """
+ cmd = [sys.executable, "bitcoin_trading_simulation.py"] + args
+ result = subprocess.run(cmd, capture_output=True, text=True)
+ return result
+
+def test_cli_invalid_days():
+ """Test that non-positive days results in error."""
+ result = run_simulation(["--days", "-5"])
+ assert result.returncode == 1
+ assert "Error: Days must be a positive integer." in result.stderr
+
+ result = run_simulation(["--days", "0"])
+ assert result.returncode == 1
+ assert "Error: Days must be a positive integer." in result.stderr
+
+def test_cli_invalid_initial_cash():
+ """Test that non-positive initial cash results in error."""
+ result = run_simulation(["--initial-cash", "-1000"])
+ assert result.returncode == 1
+ assert "Error: Initial cash must be greater than 0." in result.stderr
+
+ result = run_simulation(["--initial-cash", "0"])
+ assert result.returncode == 1
+ assert "Error: Initial cash must be greater than 0." in result.stderr
+
+def test_cli_invalid_initial_price():
+ """Test that non-positive initial price results in error."""
+ result = run_simulation(["--initial-price", "-500"])
+ assert result.returncode == 1
+ assert "Error: Initial price must be greater than 0." in result.stderr
+
+def test_cli_invalid_volatility():
+ """Test that negative volatility results in error."""
+ result = run_simulation(["--volatility", "-0.1"])
+ assert result.returncode == 1
+ assert "Error: Volatility must be non-negative." in result.stderr
+
+def test_cli_valid_args():
+ """Test that valid arguments run successfully."""
+ # Run with small days to keep test fast
+ result = run_simulation(["--days", "5", "--quiet"])
+ assert result.returncode == 0
+ assert "Final Portfolio Performance" in result.stdout
+
+def test_cli_no_color_error():
+ """Test that error messages respect --no-color flag (no ANSI codes)."""
+ result = run_simulation(["--days", "-5", "--no-color"])
+ assert result.returncode == 1
+ # Check that the ANSI fail code is NOT in the output
+ assert "\033[91m" not in result.stderr
+ assert "Error: Days must be a positive integer." in result.stderr
diff --git a/test_simulation.py b/test_simulation.py
index 0f4f1f8..8fddb57 100644
--- a/test_simulation.py
+++ b/test_simulation.py
@@ -1,8 +1,8 @@
-import pytest
import pandas as pd
import numpy as np
from bitcoin_trading_simulation import simulate_bitcoin_prices, calculate_moving_averages, generate_trading_signals
+
def test_simulate_bitcoin_prices():
days = 10
prices = simulate_bitcoin_prices(days=days, initial_price=50000)
@@ -10,6 +10,7 @@ def test_simulate_bitcoin_prices():
assert isinstance(prices, pd.Series)
assert prices.name == 'Price'
+
def test_calculate_moving_averages():
prices = pd.Series([100, 101, 102, 103, 104, 105, 106, 107, 108, 109], name='Price')
signals = calculate_moving_averages(prices, short_window=3, long_window=5)
@@ -17,6 +18,7 @@ def test_calculate_moving_averages():
assert 'long_mavg' in signals.columns
assert not signals['short_mavg'].isnull().all()
+
def test_generate_trading_signals():
# Create dummy signals DataFrame
data = {
diff --git a/track.md b/track.md
new file mode 100644
index 0000000..66ee99b
--- /dev/null
+++ b/track.md
@@ -0,0 +1,7 @@
+## 📅 The 30-Day Roadmap
+- [x] Day 1: #10 (Space Invaders Fix)
+- [ ] Day 2: #11 (I Wanna Be The Guy C++ Port)
+- [ ] Day 3: #12 (Bitcoin API Test)
+- [ ] Day 4: #13 (Home Coffee Shop Site)
+
+> **Pro-Tip:** Closing an issue with a commit message (e.g., `closes #10`) will automatically update the milestone progress bar!