514 lines
27 KiB
HTML
514 lines
27 KiB
HTML
<!doctype html>
|
|
<html lang=en-us>
|
|
<head>
|
|
<style>
|
|
html {
|
|
font-family: sans-serif;
|
|
font-size: 10pt;
|
|
color: rgba(2, 2, 41, 1);
|
|
}
|
|
|
|
a {
|
|
text-decoration: none;
|
|
color: rgba(2, 2, 41, 1);
|
|
background-color: rgba(0, 0, 0, 0.07)
|
|
}
|
|
|
|
a:visited {
|
|
color: rgba(2, 2, 41, 0.75);
|
|
}
|
|
|
|
a:hover {
|
|
color: rgba(2, 2, 41, 1);
|
|
background-color: rgba(0, 0, 0, 0.3)
|
|
}
|
|
|
|
body {
|
|
margin: 2rem 2rem;
|
|
max-width: 80ch;
|
|
background: #fbfbfd;
|
|
}
|
|
|
|
img {
|
|
max-width: 100%;
|
|
}
|
|
|
|
h1,
|
|
h2,
|
|
h3,
|
|
h4,
|
|
h5,
|
|
h6 {
|
|
padding: 0;
|
|
margin: 0;
|
|
}
|
|
|
|
p {
|
|
margin: 0.75em 0;
|
|
}
|
|
|
|
section {
|
|
margin-top: 0.5em;
|
|
margin-bottom: 0.5em;
|
|
}
|
|
|
|
.divider {
|
|
height: 0.1rem;
|
|
width: 100%;
|
|
background: #020229;
|
|
}
|
|
|
|
.contact-links: {
|
|
margin-bottom: 0.5em;
|
|
}
|
|
|
|
.citations {
|
|
border-radius: 0.2em;
|
|
padding: 0.5em;
|
|
color: rgba(0, 0, 0, 0.8);
|
|
border-style: dotted;
|
|
border-color: rgba(0, 0, 0, 0.07);
|
|
}
|
|
|
|
.row {
|
|
display: flex;
|
|
flex-direction: row;
|
|
}
|
|
|
|
.row p {
|
|
margin: 0;
|
|
padding: 0;
|
|
}
|
|
|
|
.row-key {
|
|
width: 9ch;
|
|
}
|
|
|
|
.job-role {
|
|
display: flex;
|
|
flex-direction: row;
|
|
border-left: 0.3em;
|
|
border-right: 0;
|
|
border-top: 0;
|
|
border-bottom: 0.1em;
|
|
border-style: solid;
|
|
padding-bottom: 0.6em;
|
|
padding-left: 0.4em;
|
|
background-color: rgba(0,0,0,0.03);
|
|
}
|
|
|
|
ul {
|
|
list-style: none;
|
|
padding: 0;
|
|
}
|
|
|
|
.job-role p {
|
|
margin-bottom: 0;
|
|
font-weight: bold;
|
|
}
|
|
|
|
.job-role-year {
|
|
width: 13ch;
|
|
}
|
|
|
|
.title-note {
|
|
font-size: 1.4rem;
|
|
font-style: normal;
|
|
font-family: monospace;
|
|
vertical-align: middle;
|
|
}
|
|
|
|
.favicon {
|
|
width: 1em;
|
|
height: 1em;
|
|
vertical-align: text-bottom;
|
|
}
|
|
|
|
.milestones {
|
|
list-style: circle;
|
|
font-size: 1rem;
|
|
margin-left: 1.5rem;
|
|
}
|
|
|
|
@media print {
|
|
.pagebreak {
|
|
page-break-before: always;
|
|
}
|
|
}
|
|
|
|
|
|
</style>
|
|
</head>
|
|
<body>
|
|
<!--
|
|
Color palette
|
|
#C16358
|
|
#BEBF5E
|
|
#8DBCA2
|
|
#519A8B
|
|
#DBAE55
|
|
-->
|
|
<header>
|
|
<div style="">
|
|
<h1><a href="https://doy-lee.github.io">doy<u style="text-decoration: none; color: #6BBAE4">-</u>lee <em class=title-note>// TODO: Doyle T.</em> </a></h1>
|
|
<p>G'day, I'm a software developer that enjoys low-level programming.</p>
|
|
</div>
|
|
<div class=divider style="margin-bottom: 0.5em"></div>
|
|
</header>
|
|
<main>
|
|
<section aria-label="Contact Links">
|
|
<div class=row>
|
|
<p class=row-key>Print Me!</p>
|
|
<p><a href="doy-lee.github.io/doylet_cv.pdf">doy-lee.github.io/doylet_cv.pdf</a></p>
|
|
</div>
|
|
<div class=row>
|
|
<p class=row-key>Email</p>
|
|
<p><a href="cv.doylet.2380i@simplelogin.com">cv.doylet.2380i@simplelogin.com</a></p>
|
|
</div>
|
|
<div class=row>
|
|
<p class=row-key>GitHub</p>
|
|
<p><a href="https://github.com/doy-lee">https://github.com/doy-lee</a></p>
|
|
</div>
|
|
</section>
|
|
<section aria-label="Work">
|
|
<h2>Work</h2>
|
|
<div class=divider style="margin-bottom: 0.5em"></div>
|
|
<div>
|
|
<div class=job-role style="border-color: #C16358">
|
|
<p class=job-role-year>2022 - Present</p>
|
|
<p>C++ Senior Software Engineer, Agent Orientated Software <img class=favicon src="aos-favicon.ico"> (AI)</p>
|
|
</div>
|
|
<div class=job-role style="border-color: #BEBF5E">
|
|
<p class=job-role-year>2020 - 2022</p>
|
|
<p>C++ Software Engineer, Agent Orientated Software <img class=favicon src="aos-favicon.ico"> (AI)</p>
|
|
</div>
|
|
<sub><i>C++17, CMake, Docker, DDS+Kafka (distribution), discrete event simulators (game engine-esque)</i></sub>
|
|
<p>
|
|
AOS creates creating trustable and explainable
|
|
AI using <i>multi-agent systems</i> with the cognitive
|
|
framework, <i>Beliefs, Desires and Intentions</i> (BDI).
|
|
My role involves improving the AI toolchain such as
|
|
improving cross-agent collaboration, forward planning,
|
|
scheduling and de-conflicting of agent intentionality,
|
|
its execution and distributed agent communication to
|
|
improve resilience in adversarial situations.
|
|
</p>
|
|
<ul class=milestones>
|
|
<li>Coordinating multiple toolchain upgrades of our in-house AI frameworks, end-to-end</li>
|
|
<li>Added virtual-memory backed allocators for cache locality, reduced sys-calls and memory profiling</li>
|
|
<li>Co-implement protocol to distribute agents onto different routing technologies (DDS & Kafka)</li>
|
|
<li>Responsible for the docs website with APIs & manuals, end-to-end for production releases</li>
|
|
<li>Implement multiple discrete event simulators for verification of agent behaviours</li>
|
|
<li>Documenting best practices, patterns and tutorials for designing effective multi-agent systems</li>
|
|
<li>Implement real-world system specs in a multi-agent architecture to highlight deficiencies in the development methodology leading to new protocols, e.g. researching interfaces for humans to effectively contribute into the agent decision making.</li>
|
|
</ul>
|
|
<small>
|
|
<ul class=citations>
|
|
<li>Agent Orientated Software <a href="https://aosgrp.com">aosgrp.com</a></li>
|
|
</ul>
|
|
</small>
|
|
</div>
|
|
<div>
|
|
</div>
|
|
<div>
|
|
<div class=job-role style="border-color: #8DBCA2">
|
|
<p class=job-role-year>2018 - 2020</p>
|
|
<p>C++ Software Engineer, Oxen <img class=favicon src="oxen-favicon-32x32.png"> (Blockchain)</p>
|
|
</div>
|
|
<sub><i>C++14, Boost, CMake, Docker, Android+Windows+Mac+Linux clients, Qt5, Monero Cryptonote & EPEE Levin P2P Protocol, Open Source Maintainer (Oxen), Libsodium (EC Cryptography)</i></sub>
|
|
<p>
|
|
Oxen is a non-for-profit, open-source company developing
|
|
privacy protocols and tools. I
|
|
implemented[<a href="#oxen-git-commits">1</a>]
|
|
a decentralized layer of servers known as the Service
|
|
Node[<a href="#oxen-service-nodes">2</a>] network that
|
|
distributes the blockchain and maintains layer
|
|
access-control. They coordinate peer-to-peer to evict
|
|
underperforming and malicious peers whilst generating
|
|
entropy for securing blocks using
|
|
checkpointing[<a href="#oxen-checkpointing">3</a>] and
|
|
a commit-reveal scheme known as
|
|
Pulse[<a href="#oxen-pulse#">4</a>].
|
|
</p>
|
|
<p>
|
|
With over 1k+ servers and growing, the Service Node
|
|
network provides a sybil-resistant foundation to
|
|
facilitate a privacy preserving onion routing network,
|
|
Lokinet, and, a privacy preserving messenger, Session.
|
|
</p>
|
|
<ul class=milestones>
|
|
<li>Rapidly learning & up-skilling as their first developer in the startup to form a development methodology and hiring practices</li>
|
|
<li>Implement a resilient server layer over new P2P gossip protocols: node de/registration & rewards, service metrics & voting</li>
|
|
<li>Form immutable checkpoints to secure blocks using shared consensus to provide faster finalization of transfers on the network</li>
|
|
<li>Create an on-chain DNS registry to map cryptographic keys to human readable aliases (e.g. Lokinet domains, Oxen wallets and Session aliases)</li>
|
|
<li>Transition from Proof of Work to Proof of Stake live in production, deprecates miners for a commit-reveal scheme to generate entropy for minting blocks</li>
|
|
<li>Ownership of release process (build/package/distribute) end to end.</li>
|
|
<li>Patching of 0-days and exploits & recovering from consensus failure on a live production network</li>
|
|
<li>Improved the test framework for including re-write of Monero's framework and adding integration tests using IPC over named pipes</li>
|
|
</ul>
|
|
<small>
|
|
<ul class=citations>
|
|
<li>Oxen Website <a href="https://oxen.io">oxen.io</a></li>
|
|
<li id="oxen-git-commits">[1] Git Commits <a href="https://github.com/oxen-io/oxen-core/pulls?q=is%3Apr+author%3Adoy-lee+is%3Aclosed+">github.com/oxen-io/oxen-core/pulls?q=is%3Apr+author%3Adoy-lee+is%3Aclosed</a></li>
|
|
<li id="oxen-service-nodes">[2] Service Nodes <a href="https://oxen.gitbook.io/oxen-docs/about-the-oxen-blockchain/oxen-service-nodes">oxen.gitbook.io/oxen-docs/about-the-oxen-blockchain/oxen-service-nodes</a></li>
|
|
<li id="oxen-checkpointing">[3] Checkpointing <a href="https://github.com/oxen-io/oxen-improvement-proposals/blob/master/LIPS/LIP-3.md">github.com/oxen-io/oxen-improvement-proposals/blob/master/LIPS/LIP-3.md</a></li>
|
|
<li id="oxen-pulse">[4] Pulse <a href="https://github.com/oxen-io/oxen-improvement-proposals/blob/master/LIPS/LIP-5.md">github.com/oxen-io/oxen-improvement-proposals/blob/master/LIPS/LIP-5.md</a></li>
|
|
</ul>
|
|
</small>
|
|
</div>
|
|
<div>
|
|
<div class=job-role style="border-color: #519A8B">
|
|
<p class=job-role-year>2017 - 2017</p>
|
|
<p>C++ Intern Software Engineer, Wargaming Sydney <img class=favicon src="wargaming-favicon.ico"> (Game Dev)</p>
|
|
</div>
|
|
<p>
|
|
Game development company most popular for developing
|
|
World of Tanks. I was in the tools team assisting with
|
|
the development of the editor for the asset pipeline.
|
|
</p>
|
|
<small>
|
|
<ul class=citations>
|
|
<li>Wargaming Sydney <a href="https://wargaming.com/">wargaming.com</a></li>
|
|
</ul>
|
|
</small>
|
|
</div>
|
|
<div>
|
|
<div class=job-role style="border-color: #DBAE55">
|
|
<p class=job-role-year>2014 - 2017</p>
|
|
<p>B. Computer Science, University of New South Wales <img class=favicon src="unsw-icon-192x192.png"></p>
|
|
</div>
|
|
<small>
|
|
<ul class=citations>
|
|
<li>UNSW <a href="https://unsw.edu.au">unsw.edu.au</a></li>
|
|
</ul>
|
|
</small>
|
|
</div>
|
|
</section>
|
|
<section aria-label="Projects Summary">
|
|
<h2>Projects Summary</h2>
|
|
<div class=divider style="margin-bottom: 0.5em"></div>
|
|
<div class=job-role style="border-color: #C16358">
|
|
<p class=job-role-year>2018 - Present</p>
|
|
<p><a href="#dqn-project">Dqn</a>: C/C++ personal standard library <a href="https://github.com/doy-lee/dqn">github.com/doy-lee/dqn</a></p>
|
|
</div>
|
|
<div class=job-role style="border-color: #BEBF5E">
|
|
<p class=job-role-year>2021</p>
|
|
<p><a href="#intc-project">intc</a>: Software u128/256 bit port to C <a href="https://github.com/doy-lee/intc">github.com/doy-lee/intc</a></p>
|
|
</div>
|
|
<div class=job-role style="border-color: #8DBCA2">
|
|
<p class=job-role-year>2020</p>
|
|
<p><a href="#raylibsimd-project">RaylibSIMD</a>: SIMD Software rendering in C <a href="https://github.com/doy-lee/RaylibSIMD">github.com/doy-lee/RaylibSIMD</a></p>
|
|
</div>
|
|
<div class=job-role style="border-color: #519A8B">
|
|
<p class=job-role-year>2017</p>
|
|
<p><a href="#dtrenderer-project">DTRenderer</a>: 3D Software rendering in C++ <a href="https://github.com/doy-lee/DTRenderer">github.com/doy-lee/DTRenderer</a></p>
|
|
</div>
|
|
<div class=job-role style="border-color: #DBAE55">
|
|
<p class=job-role-year>2017</p>
|
|
<p><a href="#mathmasher-project">Math Masher</a>: Math game for mobile <a href="https://doy-lee.github.io/luneaustralia">doy-lee.github.io/luneaustralia</a></p>
|
|
</div>
|
|
<div class=job-role style="border-color: #C16358">
|
|
<p class=job-role-year>2017</p>
|
|
<p><a href="#dchip8-project">DCHIP8</a>: Chip8 interpreter <a href="https://github.com/doy-lee/dchip-8">github.com/doy-lee/dchip-8</a></p>
|
|
</div>
|
|
<div class=job-role style="border-color: #C16358">
|
|
<p class=job-role-year>2016</p>
|
|
<p><a href="#dengine-project">Dengine</a>: 2D engine for asteroids <a href="https://github.com/doy-lee/dengine">github.com/doy-lee/dengine</a></p>
|
|
</div>
|
|
</section>
|
|
<section class=pagebreak aria-label="Projects">
|
|
<h2>Projects</h2>
|
|
<div class=divider style="margin-bottom: 0.5em"></div>
|
|
<div id=dqn-project>
|
|
<div class=job-role style="border-color: #C16358">
|
|
<p class=job-role-year>2018 - Present</p>
|
|
<p>Dqn: C/C++ personal standard library <a href="https://github.com/doy-lee/dqn">github.com/doy-lee/dqn</a></p>
|
|
</div>
|
|
<p>
|
|
My personal standard library used in personal projects
|
|
that focuses on simplicity, transparent data
|
|
structures void of crazy C++ features with minimal
|
|
dependencies on the standard libraries. The library is
|
|
orientated around avoiding unnecessary allocations e.g.
|
|
minimal calls to malloc and non-pessimized
|
|
implementations.
|
|
</p>
|
|
<ul class=milestones>
|
|
<li>Custom memory routines: arena allocator, virtual memory containers, TLS scratch allocators</li>
|
|
<li>Allocation-less string slices and string manipulation routines</li>
|
|
<li>Linear probed and chained hash tables in 400~ LOC</li>
|
|
<li>Fixed sized arrays and strings containers</li>
|
|
</ul>
|
|
</div>
|
|
<div id=intc-project>
|
|
<div class=job-role style="border-color: #BEBF5E">
|
|
<p class=job-role-year>2020</p>
|
|
<p>intc: Software u128/256 bit port to C <a href="https://github.com/doy-lee/intc">github.com/doy-lee/intc</a></p>
|
|
</div>
|
|
<sub><i>C99/C++, Open Source, Single File Library Port</i></sub>
|
|
<p>
|
|
intc is a port of calccrypto's uint128/256 library into
|
|
a single header file library to allow u128/256
|
|
calculations. This port is primarily C first and
|
|
provides C++ helpers like operator overloads that are
|
|
opt in.
|
|
</p>
|
|
<small>
|
|
<ul class=citations>
|
|
<li>calccrypto's uint256_t <a href="https://github.com/calccrypto/uint256_t">github.com/calccrypto/uint256_t</a></li>
|
|
</ul>
|
|
</small>
|
|
</div>
|
|
<div id=raylibsimd-project>
|
|
<div class=job-role style="border-color: #8DBCA2">
|
|
<p class=job-role-year>2020</p>
|
|
<p>RaylibSIMD: SIMD Software rendering in C <a href="https://github.com/doy-lee/RaylibSIMD">github.com/doy-lee/RaylibSIMD</a></p>
|
|
</div>
|
|
<sub><i>C99, SSE2, Graphics Programming</i></sub>
|
|
<p>
|
|
Raylib is a game-engine by Raysan5 whose main focus is
|
|
to make game engine programming simple and enjoyable.
|
|
In this project, I rewrote the software-rendering
|
|
routine to use SSE2/3 instructions to attain the
|
|
expected 4x speed-up by taking advantage of
|
|
data-parallelism offered by SIMD.
|
|
</p>
|
|
<small>
|
|
<ul class=citations>
|
|
<li>Raylib Website <a href="https://raylib.com/">raylib.com</a></li>
|
|
</ul>
|
|
</small>
|
|
</div>
|
|
<div id=dtrenderer-project>
|
|
<div class=job-role style="border-color: #519A8B">
|
|
<p class=job-role-year>2017</p>
|
|
<p>DTRenderer: 3D Software rendering in C++ <a href="https://github.com/doy-lee/DTRenderer">github.com/doy-lee/DTRenderer</a></p>
|
|
</div>
|
|
<a href="img/projects_dtrenderer.gif"><img src="img/projects_dtrenderer.gif"></a>
|
|
<p>
|
|
DTRenderer is an attempt to build a simple software
|
|
renderer from the ground up. The main goal is to build
|
|
an intuitive understanding of graphics mathematics,
|
|
rendering pipeline and core concepts. It runs as a Win32
|
|
program with minimal dependencies.
|
|
</p>
|
|
<ul class=milestones>
|
|
<li>2D Software Rendering</li>
|
|
<li>Alpha Blending</li>
|
|
<li>Bilinear Filtering</li>
|
|
<li>Correct Color Space Pipeline (SRGB <-> Linear)</li>
|
|
<li>Rasterisation</li>
|
|
<li>Texture Mapping</li>
|
|
<li>Translation, Rotation, Scale</li>
|
|
<li>3D Software Rendering</li>
|
|
<li>Full Bright, Flat, Gouraud Shading</li>
|
|
<li>Orthogaphic, Perspective Projections</li>
|
|
<li>Translation Rotation Scale</li>
|
|
<li>Custom Wavefront Obj Loader (minimal subset)</li>
|
|
<li>Hot Reloadable DLL for Renderer Code (taken from Handmade Hero)</li>
|
|
</ul>
|
|
</div>
|
|
<div id=mathmasher-project>
|
|
<div class=job-role style="border-color: #DBAE55">
|
|
<p class=job-role-year>2017</p>
|
|
<p>Math Masher: Math game for mobile <a href="https://doy-lee.github.io/luneaustralia">doy-lee.github.io/luneaustralia</a></p>
|
|
</div>
|
|
<div class=row>
|
|
<a href="img/projects_math_masher_screen_1.png"><img src="img/projects_math_masher_screen_1.jpg"></a>
|
|
<a href="img/projects_math_masher_screen_2.png"><img src="img/projects_math_masher_screen_2.jpg"></a>
|
|
<a href="img/projects_math_masher_screen_3.png"><img src="img/projects_math_masher_screen_3.jpg"></a>
|
|
</div>
|
|
<p>
|
|
Math Masher is a cross-platform mobile app that aims to
|
|
teach basic arithmetic skills including addition,
|
|
subtraction and multiplication by gamifying the learning
|
|
experience. The app was developed in a team using the
|
|
Cocos2DX framework in C++.
|
|
|
|
My role in the project is as the lead developer and
|
|
assisting role with asset design.
|
|
</p>
|
|
<ul class=milestones>
|
|
<li>Project management (Trello, minutes meeting, code review etc.)</li>
|
|
<li>Game engine architecture (Gameplay, UI, shopping mechanics, debug)</li>
|
|
<li>Basic sound editing (Compressor, EQuing, normalisation)</li>
|
|
<li>Asset designs (Creating graphical assets with Photoshop)</li>
|
|
</ul>
|
|
<small>
|
|
<ul class=citations>
|
|
<li>Trailer <a href="https://youtube.com/watch?v=AUozUZ8aY7g">youtube.com/watch?v=AUozUZ8aY7g</a></li>
|
|
</ul>
|
|
</small>
|
|
</div>
|
|
<div id=dchip8-project>
|
|
<div class=job-role style="border-color: #C16358">
|
|
<p class=job-role-year>2017</p>
|
|
<p>DCHIP8: Chip8 interpreter <a href="https://github.com/doy-lee/dchip-8">github.com/doy-lee/dchip-8</a></p>
|
|
</div>
|
|
<div class="row">
|
|
<a href="img/projects_dchip8_screen_1.png"><img src="img/projects_dchip8_screen_1.png"></a>
|
|
<a href="img/projects_dchip8_screen_2.png"><img src="img/projects_dchip8_screen_2.png"></a>
|
|
</div>
|
|
<p>
|
|
DCHIP8 aims to emulate the CHIP8 architecture to better
|
|
understand at a lower level operations between memory,
|
|
cpu, input and output.
|
|
</p>
|
|
<ul class=milestones>
|
|
<li>Fetch, Decode, Execute Opcodes</li>
|
|
<li>Modelling memory, registers and basic CPU architecture</li>
|
|
<li>Software Rendering and interaction with Win32</li>
|
|
<li>Minimal dependencies, single file executable</li>
|
|
</ul>
|
|
<small>
|
|
<ul class=citations>
|
|
<li>Specification Sheet <a href="http://devernay.free.fr/hacks/chip8/C8TECH10.HTM">devernay.free.fr/hacks/chip8/C8TECH10.HTM</a></li>
|
|
</ul>
|
|
</small>
|
|
</div>
|
|
<div id=dengine-project>
|
|
<div class=job-role style="border-color: #C16358">
|
|
<p class=job-role-year>2016</p>
|
|
<p>Dengine: 2D engine for asteroids <a href="https://github.com/doy-lee/dengine">github.com/doy-lee/dengine</a></p>
|
|
</div>
|
|
<div class="row">
|
|
<a href="img/projects_dengine_screen_1.png"><img src="img/projects_dengine_screen_1.png"></a>
|
|
<a href="img/projects_dengine_demo.gif"><img src="img/projects_dengine_demo.gif"></a>
|
|
</div>
|
|
<p>
|
|
Dengine is a solo project, 2D game engine developed with
|
|
OpenGL and low-level libraries in C. The main goal of
|
|
Dengine is to facilitate learning from many aspects of
|
|
Computer Science. Alongside Dengine, Asteroids is being
|
|
built which guides the development of features for the
|
|
game. Dengine is inspired by Handmade Hero, with a focus
|
|
on developing as many features with minimal libraries,
|
|
such that it is not too time-consuming and
|
|
counter-productive to do so.
|
|
</p>
|
|
<ul class=milestones>
|
|
<li>Asset Management (load data into intermediate representations)</li>
|
|
<li>Audio API from OpenAL</li>
|
|
<li>Basic 2D Game Mathematics/Physics (Vector, Trig, Explicit Euler)</li>
|
|
<li>Collision Detection (Single Axis Theorem, Minkowski Sum/Diff, AABB)</li>
|
|
<li>Debug Services & Displays</li>
|
|
<li>Entity Component Systems</li>
|
|
<li>IMGUI Systems</li>
|
|
<li>Input Parsing</li>
|
|
<li>Push-Buffer Memory Systems</li>
|
|
<li>Small Size Array Optimisations</li>
|
|
<li>Standard Library Replacements (e.g. atoi, strlen, itoa, string)</li>
|
|
<li>Texture Atlas Support, Runtime Font Packing</li>
|
|
<li>OpenGL 2D Rendering Pipeline & Batching Render Calls</li>
|
|
</ul>
|
|
<small>
|
|
<ul class=citations>
|
|
<li>Handmade Hero <a href="https://handmadehero.org/">handmadehero.org</a></li>
|
|
</ul>
|
|
</small>
|
|
</div>
|
|
</section>
|
|
</main>
|
|
</body>
|
|
</html>
|