Compare commits

...

2 Commits

Author SHA1 Message Date
Colin 5b422a67b2
Add UTM URL Generator tool with live preview and pre-generated PDFs
ci/woodpecker/push/woodpecker Pipeline was successful Details
- Add utm-tool.html and utm-tool.js for UTM URL generation
- Live URL generation as user types (no button required)
- Support for all standard UTM parameters plus custom parameters
- Add UTM Builder to nav dropdown and index.html tools section
- Pre-generate all PDFs for faster Docker builds
- Update git hooks for PDF generation
2025-12-02 11:18:49 -05:00
Colin 7a3665abae
bump 2025-12-02 09:20:41 -05:00
70 changed files with 2869 additions and 72 deletions

2
.gitignore vendored
View File

@ -14,5 +14,3 @@ node_modules/
.DS_Store .DS_Store
Thumbs.db Thumbs.db
# Generated PDFs (created at deploy time)
docker/resume/pdfs/

1139
docker/package-lock.json generated

File diff suppressed because it is too large Load Diff

View File

@ -31,8 +31,12 @@ RUN cd /srv && \
chmod +x update-all.sh && \ chmod +x update-all.sh && \
./update-all.sh ./update-all.sh
# Generate PDFs for all pages # Generate PDFs for all pages (only if they don't already exist)
RUN cd /srv && npm run generate-pdfs RUN if [ ! -d "/srv/pdfs" ] || [ -z "$(ls -A /srv/pdfs 2>/dev/null)" ]; then \
cd /srv && npm run generate-pdfs; \
else \
echo "PDFs already exist, skipping generation"; \
fi
# Expose port # Expose port
EXPOSE 8080 EXPOSE 8080

View File

@ -1,5 +1,15 @@
# Resume Website # Resume Website
## Initial Setup
After cloning the repository, run the setup script from the repository root to install git hooks:
```bash
./setup-git-hooks.sh
```
This installs a pre-push hook that automatically generates PDFs before pushing.
## Local Development ## Local Development
To run the local development server: To run the local development server:

View File

@ -6,9 +6,9 @@
<meta name="robots" content="noindex, nofollow"> <meta name="robots" content="noindex, nofollow">
<meta name="description" content="Colin Knapp - Private Consulting Packs"> <meta name="description" content="Colin Knapp - Private Consulting Packs">
<title>Consulting Packs (Private) - Colin Knapp</title> <title>Consulting Packs (Private) - Colin Knapp</title>
<link rel="stylesheet" href="styles.css" integrity="sha256-mjzh8Lh0zDbg3xduiLiH6jR4dfkgwJKGGoF2jAOY/AI="> <link rel="stylesheet" href="styles.css" integrity="sha256-nsutlmVxvyIyABk8i0fzVyO+ram8rkuTntoETIGcou8=">
<script src="theme.js" integrity="sha256-+dDNTo7WAOmn2YC875+vn9oH4UkMwlVOGlARp2uq3A4="></script> <script src="theme.js" integrity="sha256-+dDNTo7WAOmn2YC875+vn9oH4UkMwlVOGlARp2uq3A4="></script>
<script src="includes.js" integrity="sha256-0VPPSi+jVc1DuyZaSYTq+fnpIfv7ft+ZDenYE6pDPqA="></script> <script src="includes.js" integrity="sha256-CJbyPP0VWE+XrarLtjHMffGrI2GlTXXAXOce+NE+aQg="></script>
<style> <style>
.pricing-section { .pricing-section {
padding: 2rem 0; padding: 2rem 0;

View File

@ -6,10 +6,10 @@
<meta name="description" content="Colin Knapp - CSV Processing Tool"> <meta name="description" content="Colin Knapp - CSV Processing Tool">
<title>CSV Viewer - Colin Knapp</title> <title>CSV Viewer - Colin Knapp</title>
<link rel="stylesheet" href="../styles.css"> <link rel="stylesheet" href="../styles.css">
<link rel="stylesheet" href="tool-styles.css" integrity="sha256-mjzh8Lh0zDbg3xduiLiH6jR4dfkgwJKGGoF2jAOY/AI="> <link rel="stylesheet" href="tool-styles.css" integrity="sha256-nsutlmVxvyIyABk8i0fzVyO+ram8rkuTntoETIGcou8=">
<link rel="stylesheet" href="csv-tool-fix.css?v=2" integrity="sha256-5oTxos9Qxwhor3qIwHSM12YyIZi5E+tHuFdYER0hXoI="> <link rel="stylesheet" href="csv-tool-fix.css?v=2" integrity="sha256-5oTxos9Qxwhor3qIwHSM12YyIZi5E+tHuFdYER0hXoI=">
<script src="../theme.js" integrity="sha256-+dDNTo7WAOmn2YC875+vn9oH4UkMwlVOGlARp2uq3A4="></script> <script src="../theme.js" integrity="sha256-+dDNTo7WAOmn2YC875+vn9oH4UkMwlVOGlARp2uq3A4="></script>
<script src="../includes.js" integrity="sha256-0VPPSi+jVc1DuyZaSYTq+fnpIfv7ft+ZDenYE6pDPqA="></script> <script src="../includes.js" integrity="sha256-CJbyPP0VWE+XrarLtjHMffGrI2GlTXXAXOce+NE+aQg="></script>
<script src="../utils.js" integrity="sha256-ryQsJ+aghKKD/CeXgx8jtsnZT3Epp3EjIw8RyHIq544="></script> <script src="../utils.js" integrity="sha256-ryQsJ+aghKKD/CeXgx8jtsnZT3Epp3EjIw8RyHIq544="></script>
<style> <style>
/* Additional inline styles to fix layout */ /* Additional inline styles to fix layout */

View File

@ -63,6 +63,7 @@
<a href="/one-pager-tools/csv-tool.html" id="nav-tools">Tools</a> <a href="/one-pager-tools/csv-tool.html" id="nav-tools">Tools</a>
<div class="dropdown-content"> <div class="dropdown-content">
<a href="/one-pager-tools/csv-tool.html" id="nav-csv">CSV Tool</a> <a href="/one-pager-tools/csv-tool.html" id="nav-csv">CSV Tool</a>
<a href="/one-pager-tools/utm-tool.html" id="nav-utm">UTM Builder</a>
<a href="https://md.colinknapp.com" id="nav-markdown" target="_blank" rel="noopener noreferrer">Markdown Tool</a> <a href="https://md.colinknapp.com" id="nav-markdown" target="_blank" rel="noopener noreferrer">Markdown Tool</a>
<a href="https://nix.colinknapp.com" id="nav-nix" target="_blank" rel="noopener noreferrer">NixOS Validator</a> <a href="https://nix.colinknapp.com" id="nav-nix" target="_blank" rel="noopener noreferrer">NixOS Validator</a>
<a href="https://qr.colinknapp.com" id="nav-qrcode" target="_blank" rel="noopener noreferrer">QR Code Tool</a> <a href="https://qr.colinknapp.com" id="nav-qrcode" target="_blank" rel="noopener noreferrer">QR Code Tool</a>

View File

@ -5,9 +5,9 @@
<meta name="viewport" content="width=device-width, initial-scale=1.0"> <meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta name="description" content="Colin Knapp - DevSecOps consultant, cybersecurity expert, and open-source advocate. Explore resumes, project stories, and free tools."> <meta name="description" content="Colin Knapp - DevSecOps consultant, cybersecurity expert, and open-source advocate. Explore resumes, project stories, and free tools.">
<title>Colin Knapp - DevSecOps & Cybersecurity Expert</title> <title>Colin Knapp - DevSecOps & Cybersecurity Expert</title>
<link rel="stylesheet" href="styles.css" integrity="sha256-mjzh8Lh0zDbg3xduiLiH6jR4dfkgwJKGGoF2jAOY/AI="> <link rel="stylesheet" href="styles.css" integrity="sha256-nsutlmVxvyIyABk8i0fzVyO+ram8rkuTntoETIGcou8=">
<script src="theme.js" integrity="sha256-+dDNTo7WAOmn2YC875+vn9oH4UkMwlVOGlARp2uq3A4="></script> <script src="theme.js" integrity="sha256-+dDNTo7WAOmn2YC875+vn9oH4UkMwlVOGlARp2uq3A4="></script>
<script src="includes.js" integrity="sha256-0VPPSi+jVc1DuyZaSYTq+fnpIfv7ft+ZDenYE6pDPqA="></script> <script src="includes.js" integrity="sha256-CJbyPP0VWE+XrarLtjHMffGrI2GlTXXAXOce+NE+aQg="></script>
<style> <style>
.hero { .hero {
text-align: center; text-align: center;
@ -241,6 +241,11 @@
<span>Process and analyze CSV files directly in your browser</span> <span>Process and analyze CSV files directly in your browser</span>
</a> </a>
<a href="/one-pager-tools/utm-tool.html" class="tool-link">
<strong>UTM Builder</strong>
<span>Generate campaign tracking URLs with UTM parameters</span>
</a>
<a href="https://md.colinknapp.com" target="_blank" rel="noopener noreferrer" class="tool-link"> <a href="https://md.colinknapp.com" target="_blank" rel="noopener noreferrer" class="tool-link">
<strong>Markdown Tool</strong> <strong>Markdown Tool</strong>
<span>Live markdown editor and previewer</span> <span>Live markdown editor and previewer</span>

View File

@ -6,10 +6,10 @@
<meta name="description" content="Free browser-based CSV viewer tool. Paste CSV data to instantly view as formatted table with sorting, customizable delimiters, and client-side processing for privacy."> <meta name="description" content="Free browser-based CSV viewer tool. Paste CSV data to instantly view as formatted table with sorting, customizable delimiters, and client-side processing for privacy.">
<title>CSV Viewer Tool - Free Online CSV Parser</title> <title>CSV Viewer Tool - Free Online CSV Parser</title>
<link rel="stylesheet" href="../styles.css"> <link rel="stylesheet" href="../styles.css">
<link rel="stylesheet" href="tool-styles.css?v=2" integrity="sha256-mjzh8Lh0zDbg3xduiLiH6jR4dfkgwJKGGoF2jAOY/AI="> <link rel="stylesheet" href="tool-styles.css?v=2" integrity="sha256-nsutlmVxvyIyABk8i0fzVyO+ram8rkuTntoETIGcou8=">
<link rel="stylesheet" href="csv-tool-fix.css?v=2" integrity="sha256-5oTxos9Qxwhor3qIwHSM12YyIZi5E+tHuFdYER0hXoI="> <link rel="stylesheet" href="csv-tool-fix.css?v=2" integrity="sha256-5oTxos9Qxwhor3qIwHSM12YyIZi5E+tHuFdYER0hXoI=">
<script src="../theme.js" integrity="sha256-+dDNTo7WAOmn2YC875+vn9oH4UkMwlVOGlARp2uq3A4="></script> <script src="../theme.js" integrity="sha256-+dDNTo7WAOmn2YC875+vn9oH4UkMwlVOGlARp2uq3A4="></script>
<script src="../includes.js" integrity="sha256-0VPPSi+jVc1DuyZaSYTq+fnpIfv7ft+ZDenYE6pDPqA="></script> <script src="../includes.js" integrity="sha256-CJbyPP0VWE+XrarLtjHMffGrI2GlTXXAXOce+NE+aQg="></script>
<script src="../utils.js" integrity="sha256-ryQsJ+aghKKD/CeXgx8jtsnZT3Epp3EjIw8RyHIq544="></script> <script src="../utils.js" integrity="sha256-ryQsJ+aghKKD/CeXgx8jtsnZT3Epp3EjIw8RyHIq544="></script>
<style> <style>
/* Additional inline styles to fix layout */ /* Additional inline styles to fix layout */

View File

@ -5,10 +5,10 @@
<meta name="viewport" content="width=device-width, initial-scale=1.0"> <meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta name="description" content="Colin Knapp - One Pager Tools"> <meta name="description" content="Colin Knapp - One Pager Tools">
<title>Colin Knapp Tools</title> <title>Colin Knapp Tools</title>
<link rel="stylesheet" href="../styles.css" integrity="sha256-mjzh8Lh0zDbg3xduiLiH6jR4dfkgwJKGGoF2jAOY/AI=" crossorigin="anonymous"> <link rel="stylesheet" href="../styles.css" integrity="sha256-nsutlmVxvyIyABk8i0fzVyO+ram8rkuTntoETIGcou8=" crossorigin="anonymous">
<link rel="stylesheet" href="tool-styles.css" integrity="sha256-mjzh8Lh0zDbg3xduiLiH6jR4dfkgwJKGGoF2jAOY/AI="> <link rel="stylesheet" href="tool-styles.css" integrity="sha256-nsutlmVxvyIyABk8i0fzVyO+ram8rkuTntoETIGcou8=">
<script src="../theme.js" integrity="sha256-+dDNTo7WAOmn2YC875+vn9oH4UkMwlVOGlARp2uq3A4=" crossorigin="anonymous"></script> <script src="../theme.js" integrity="sha256-+dDNTo7WAOmn2YC875+vn9oH4UkMwlVOGlARp2uq3A4=" crossorigin="anonymous"></script>
<script src="../includes.js" integrity="sha256-0VPPSi+jVc1DuyZaSYTq+fnpIfv7ft+ZDenYE6pDPqA=" crossorigin="anonymous"></script> <script src="../includes.js" integrity="sha256-CJbyPP0VWE+XrarLtjHMffGrI2GlTXXAXOce+NE+aQg=" crossorigin="anonymous"></script>
<script src="../utils.js" integrity="sha256-ryQsJ+aghKKD/CeXgx8jtsnZT3Epp3EjIw8RyHIq544=" crossorigin="anonymous"></script> <script src="../utils.js" integrity="sha256-ryQsJ+aghKKD/CeXgx8jtsnZT3Epp3EjIw8RyHIq544=" crossorigin="anonymous"></script>
<!-- Add tool-specific scripts here --> <!-- Add tool-specific scripts here -->
</head> </head>

View File

@ -6,10 +6,10 @@
<meta name="description" content="Colin Knapp - Tool Example"> <meta name="description" content="Colin Knapp - Tool Example">
<title>Tool Example - Colin Knapp</title> <title>Tool Example - Colin Knapp</title>
<link rel="stylesheet" href="../styles.css"> <link rel="stylesheet" href="../styles.css">
<link rel="stylesheet" href="tool-styles.css" integrity="sha256-mjzh8Lh0zDbg3xduiLiH6jR4dfkgwJKGGoF2jAOY/AI="> <link rel="stylesheet" href="tool-styles.css" integrity="sha256-nsutlmVxvyIyABk8i0fzVyO+ram8rkuTntoETIGcou8=">
<script src="../theme.js" integrity="sha256-+dDNTo7WAOmn2YC875+vn9oH4UkMwlVOGlARp2uq3A4="></script> <script src="../theme.js" integrity="sha256-+dDNTo7WAOmn2YC875+vn9oH4UkMwlVOGlARp2uq3A4="></script>
<script src="../utils.js" integrity="sha256-ryQsJ+aghKKD/CeXgx8jtsnZT3Epp3EjIw8RyHIq544="></script> <script src="../utils.js" integrity="sha256-ryQsJ+aghKKD/CeXgx8jtsnZT3Epp3EjIw8RyHIq544="></script>
<script src="../includes.js" integrity="sha256-0VPPSi+jVc1DuyZaSYTq+fnpIfv7ft+ZDenYE6pDPqA="></script> <script src="../includes.js" integrity="sha256-CJbyPP0VWE+XrarLtjHMffGrI2GlTXXAXOce+NE+aQg="></script>
<script src="tool-example.js" defer></script> <script src="tool-example.js" defer></script>
</head> </head>
<body> <body>

View File

@ -0,0 +1,353 @@
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta name="description" content="Free UTM URL builder tool. Generate tracking URLs with UTM parameters for marketing campaigns. Client-side processing for privacy.">
<title>UTM URL Generator - Free Campaign URL Builder</title>
<link rel="stylesheet" href="../styles.css">
<link rel="stylesheet" href="tool-styles.css" integrity="sha256-nsutlmVxvyIyABk8i0fzVyO+ram8rkuTntoETIGcou8=">
<script src="../theme.js" integrity="sha256-+dDNTo7WAOmn2YC875+vn9oH4UkMwlVOGlARp2uq3A4="></script>
<script src="../includes.js" integrity="sha256-CJbyPP0VWE+XrarLtjHMffGrI2GlTXXAXOce+NE+aQg="></script>
<style>
.utm-form {
display: grid;
gap: 1rem;
max-width: 600px;
}
.form-group {
display: flex;
flex-direction: column;
gap: 0.25rem;
}
.form-group label {
font-weight: 600;
color: var(--text-color);
}
.form-group label .required {
color: #e63946;
}
.form-group label .optional {
color: var(--date-color);
font-weight: normal;
font-size: 0.85em;
}
.form-group input {
padding: 0.75rem;
border: 1px solid var(--border-color);
border-radius: 4px;
background: var(--bg-color);
color: var(--text-color);
font-size: 1rem;
}
.form-group input:focus {
outline: none;
border-color: var(--accent-color);
box-shadow: 0 0 0 2px rgba(69, 123, 157, 0.2);
}
.form-group input.error {
border-color: #e63946;
}
.form-group .hint {
font-size: 0.8rem;
color: var(--date-color);
}
.custom-params-section {
margin-top: 1rem;
padding-top: 1rem;
border-top: 1px solid var(--border-color);
}
.custom-params-section h3 {
margin-bottom: 0.75rem;
font-size: 1rem;
}
.custom-param-row {
display: flex;
gap: 0.5rem;
margin-bottom: 0.5rem;
align-items: center;
}
.custom-param-row input {
flex: 1;
padding: 0.5rem;
border: 1px solid var(--border-color);
border-radius: 4px;
background: var(--bg-color);
color: var(--text-color);
}
.custom-param-row input:focus {
outline: none;
border-color: var(--accent-color);
}
.btn-remove-param {
padding: 0.5rem 0.75rem;
background: #e63946;
color: white;
border: none;
border-radius: 4px;
cursor: pointer;
font-size: 1rem;
}
.btn-remove-param:hover {
background: #c1121f;
}
.btn-add-param {
padding: 0.5rem 1rem;
background: var(--accent-color);
color: white;
border: none;
border-radius: 4px;
cursor: pointer;
font-size: 0.9rem;
}
.btn-add-param:hover {
opacity: 0.9;
}
.output-section {
margin-top: 2rem;
padding: 1.5rem;
background: var(--bg-secondary);
border: 1px solid var(--border-color);
border-radius: 8px;
}
.output-section h2 {
margin-top: 0;
margin-bottom: 1rem;
}
.generated-url {
word-break: break-all;
padding: 1rem;
background: var(--bg-color);
border: 1px solid var(--border-color);
border-radius: 4px;
font-family: 'Courier New', monospace;
font-size: 0.9rem;
min-height: 3rem;
}
.generated-url.empty {
color: var(--date-color);
font-style: italic;
}
.generated-url.valid {
border-color: #2a9d8f;
}
.generated-url.invalid {
border-color: #e63946;
}
.copy-section {
margin-top: 1rem;
display: flex;
gap: 1rem;
align-items: center;
}
.btn-copy {
padding: 0.75rem 1.5rem;
background: var(--accent-color);
color: white;
border: none;
border-radius: 4px;
cursor: pointer;
font-size: 1rem;
font-weight: 600;
}
.btn-copy:hover {
opacity: 0.9;
}
.btn-copy:disabled {
background: var(--border-color);
cursor: not-allowed;
}
.copy-feedback {
color: #2a9d8f;
font-weight: 600;
opacity: 0;
transition: opacity 0.2s;
}
.copy-feedback.show {
opacity: 1;
}
.url-breakdown {
margin-top: 1.5rem;
}
.url-breakdown h3 {
margin-bottom: 0.5rem;
font-size: 1rem;
}
.url-breakdown table {
width: 100%;
border-collapse: collapse;
font-size: 0.9rem;
}
.url-breakdown th,
.url-breakdown td {
padding: 0.5rem;
text-align: left;
border-bottom: 1px solid var(--border-color);
}
.url-breakdown th {
font-weight: 600;
width: 30%;
}
.url-breakdown td {
font-family: 'Courier New', monospace;
word-break: break-all;
}
.validation-message {
margin-top: 0.5rem;
padding: 0.5rem;
border-radius: 4px;
font-size: 0.9rem;
}
.validation-message.error {
background: rgba(230, 57, 70, 0.1);
color: #e63946;
}
.validation-message.success {
background: rgba(42, 157, 143, 0.1);
color: #2a9d8f;
}
.validation-message.info {
background: rgba(69, 123, 157, 0.1);
color: var(--accent-color);
}
</style>
</head>
<body>
<!-- Header Include -->
<div id="header-include"></div>
<div class="container-fluid" role="main" id="main-content">
<h1>UTM URL Generator</h1>
<p>Build tracking URLs with UTM parameters for your marketing campaigns.</p>
<div class="tool-container">
<div class="utm-form">
<div class="form-group">
<label for="baseUrl">Website URL <span class="required">*</span></label>
<input type="url" id="baseUrl" placeholder="https://example.com/page" aria-required="true">
<span class="hint">The full URL of the page you want to track</span>
</div>
<div class="form-group">
<label for="utmSource">Campaign Source <span class="required">*</span></label>
<input type="text" id="utmSource" placeholder="google, newsletter, facebook" aria-required="true">
<span class="hint">utm_source: Identifies which site sent the traffic</span>
</div>
<div class="form-group">
<label for="utmMedium">Campaign Medium <span class="required">*</span></label>
<input type="text" id="utmMedium" placeholder="cpc, email, social" aria-required="true">
<span class="hint">utm_medium: The marketing medium (e.g., cpc, email, social)</span>
</div>
<div class="form-group">
<label for="utmCampaign">Campaign Name <span class="required">*</span></label>
<input type="text" id="utmCampaign" placeholder="spring_sale, product_launch" aria-required="true">
<span class="hint">utm_campaign: The specific campaign name</span>
</div>
<div class="form-group">
<label for="utmTerm">Campaign Term <span class="optional">(optional)</span></label>
<input type="text" id="utmTerm" placeholder="running+shoes, marketing+software">
<span class="hint">utm_term: Paid search keywords</span>
</div>
<div class="form-group">
<label for="utmContent">Campaign Content <span class="optional">(optional)</span></label>
<input type="text" id="utmContent" placeholder="logolink, textlink, banner_v1">
<span class="hint">utm_content: Differentiate ads or links pointing to the same URL</span>
</div>
<div class="custom-params-section">
<h3>Custom Parameters <span class="optional">(optional)</span></h3>
<div id="customParams"></div>
<button type="button" class="btn-add-param" id="addParamBtn" aria-label="Add custom parameter">+ Add Parameter</button>
</div>
</div>
<div class="output-section">
<h2>Generated URL</h2>
<div id="validationMessage" class="validation-message" aria-live="polite"></div>
<div id="generatedUrl" class="generated-url empty" aria-live="polite">
Enter a URL and required parameters to generate your tracking URL
</div>
<div class="copy-section">
<button type="button" class="btn-copy" id="copyBtn" disabled aria-label="Copy URL to clipboard">Copy URL</button>
<span class="copy-feedback" id="copyFeedback">Copied!</span>
</div>
<div class="url-breakdown" id="urlBreakdown" style="display: none;">
<h3>URL Parameters</h3>
<table>
<thead>
<tr>
<th>Parameter</th>
<th>Value</th>
</tr>
</thead>
<tbody id="breakdownBody"></tbody>
</table>
</div>
</div>
</div>
<hr>
<h2>About This Tool</h2>
<p>This UTM URL Generator helps you create campaign tracking URLs with:</p>
<ul>
<li>All standard UTM parameters (source, medium, campaign, term, content)</li>
<li>Custom parameters for additional tracking needs</li>
<li>Live URL preview as you type</li>
<li>Proper URL encoding for special characters</li>
<li>One-click copy to clipboard</li>
</ul>
<p>The tool processes everything in your browser - no data is sent to any server.</p>
</div>
<!-- Footer Include -->
<div id="footer-include"></div>
<script src="utm-tool.js" integrity="sha256-f5yZtBrRofKWD/H5Hth5syEYPun+WicrCGxKzyzwZ6A="></script>
</body>
</html>

View File

@ -0,0 +1,294 @@
/**
* UTM URL Generator functionality
* Builds tracking URLs with UTM parameters
* Client-side only - no data sent to server
*/
document.addEventListener('DOMContentLoaded', function() {
// DOM Elements
const baseUrlInput = document.getElementById('baseUrl');
const utmSourceInput = document.getElementById('utmSource');
const utmMediumInput = document.getElementById('utmMedium');
const utmCampaignInput = document.getElementById('utmCampaign');
const utmTermInput = document.getElementById('utmTerm');
const utmContentInput = document.getElementById('utmContent');
const customParamsContainer = document.getElementById('customParams');
const addParamBtn = document.getElementById('addParamBtn');
const generatedUrlDiv = document.getElementById('generatedUrl');
const validationMessage = document.getElementById('validationMessage');
const copyBtn = document.getElementById('copyBtn');
const copyFeedback = document.getElementById('copyFeedback');
const urlBreakdown = document.getElementById('urlBreakdown');
const breakdownBody = document.getElementById('breakdownBody');
// Current generated URL
let currentUrl = '';
let customParamCount = 0;
// Debounce timer
let debounceTimer;
// Add input listeners to all UTM fields
const utmInputs = [
baseUrlInput,
utmSourceInput,
utmMediumInput,
utmCampaignInput,
utmTermInput,
utmContentInput
];
utmInputs.forEach(input => {
input.addEventListener('input', debounceGenerate);
});
// Add custom parameter button
addParamBtn.addEventListener('click', addCustomParam);
// Copy button
copyBtn.addEventListener('click', copyToClipboard);
/**
* Debounced URL generation
*/
function debounceGenerate() {
clearTimeout(debounceTimer);
debounceTimer = setTimeout(generateUrl, 150);
}
/**
* Add a custom parameter row
*/
function addCustomParam() {
customParamCount++;
const row = document.createElement('div');
row.className = 'custom-param-row';
row.id = `customParam${customParamCount}`;
row.innerHTML = `
<input type="text" placeholder="Parameter name" class="custom-key" aria-label="Custom parameter name">
<input type="text" placeholder="Value" class="custom-value" aria-label="Custom parameter value">
<button type="button" class="btn-remove-param" aria-label="Remove parameter">&times;</button>
`;
// Add input listeners
const keyInput = row.querySelector('.custom-key');
const valueInput = row.querySelector('.custom-value');
keyInput.addEventListener('input', debounceGenerate);
valueInput.addEventListener('input', debounceGenerate);
// Add remove listener
const removeBtn = row.querySelector('.btn-remove-param');
removeBtn.addEventListener('click', function() {
row.remove();
debounceGenerate();
});
customParamsContainer.appendChild(row);
keyInput.focus();
}
/**
* Validate URL format
*/
function isValidUrl(string) {
try {
const url = new URL(string);
return url.protocol === 'http:' || url.protocol === 'https:';
} catch (_) {
return false;
}
}
/**
* Get all custom parameters
*/
function getCustomParams() {
const params = [];
const rows = customParamsContainer.querySelectorAll('.custom-param-row');
rows.forEach(row => {
const key = row.querySelector('.custom-key').value.trim();
const value = row.querySelector('.custom-value').value.trim();
if (key && value) {
params.push({ key, value });
}
});
return params;
}
/**
* Generate the UTM URL
*/
function generateUrl() {
const baseUrl = baseUrlInput.value.trim();
const source = utmSourceInput.value.trim();
const medium = utmMediumInput.value.trim();
const campaign = utmCampaignInput.value.trim();
const term = utmTermInput.value.trim();
const content = utmContentInput.value.trim();
const customParams = getCustomParams();
// Clear previous state
validationMessage.textContent = '';
validationMessage.className = 'validation-message';
generatedUrlDiv.className = 'generated-url';
// Check if we have any input at all
if (!baseUrl) {
generatedUrlDiv.textContent = 'Enter a URL to start generating your tracking URL';
generatedUrlDiv.classList.add('empty');
copyBtn.disabled = true;
urlBreakdown.style.display = 'none';
currentUrl = '';
return;
}
// Validate base URL format
if (!isValidUrl(baseUrl)) {
generatedUrlDiv.textContent = baseUrl;
generatedUrlDiv.classList.add('invalid');
showValidation('Enter a valid URL (starting with http:// or https://)', 'error');
copyBtn.disabled = true;
urlBreakdown.style.display = 'none';
currentUrl = '';
return;
}
// Build the URL with whatever parameters are filled in
try {
const url = new URL(baseUrl);
// Add UTM parameters only if they have values
if (source) {
url.searchParams.set('utm_source', source);
}
if (medium) {
url.searchParams.set('utm_medium', medium);
}
if (campaign) {
url.searchParams.set('utm_campaign', campaign);
}
if (term) {
url.searchParams.set('utm_term', term);
}
if (content) {
url.searchParams.set('utm_content', content);
}
// Add custom parameters
customParams.forEach(param => {
url.searchParams.set(param.key, param.value);
});
currentUrl = url.toString();
generatedUrlDiv.textContent = currentUrl;
generatedUrlDiv.classList.add('valid');
copyBtn.disabled = false;
// Show hint about missing recommended fields
const missing = [];
if (!source) missing.push('source');
if (!medium) missing.push('medium');
if (!campaign) missing.push('campaign');
if (missing.length > 0) {
showValidation(`Tip: Add ${missing.join(', ')} for complete tracking`, 'info');
} else {
showValidation('URL ready to copy', 'success');
}
// Update breakdown
updateBreakdown(url, customParams);
} catch (error) {
showValidation('Error generating URL: ' + error.message, 'error');
generatedUrlDiv.classList.add('invalid');
copyBtn.disabled = true;
urlBreakdown.style.display = 'none';
currentUrl = '';
}
}
/**
* Show validation message
*/
function showValidation(message, type) {
validationMessage.textContent = message;
validationMessage.className = `validation-message ${type}`;
}
/**
* Update the URL breakdown table
*/
function updateBreakdown(url, customParams) {
urlBreakdown.style.display = 'block';
const rows = [];
// Base URL
rows.push({ param: 'Base URL', value: url.origin + url.pathname });
// UTM parameters
const utmParams = ['utm_source', 'utm_medium', 'utm_campaign', 'utm_term', 'utm_content'];
utmParams.forEach(param => {
const value = url.searchParams.get(param);
if (value) {
rows.push({ param, value });
}
});
// Custom parameters
customParams.forEach(param => {
rows.push({ param: param.key, value: param.value });
});
breakdownBody.innerHTML = rows.map(row => `
<tr>
<th>${escapeHtml(row.param)}</th>
<td>${escapeHtml(row.value)}</td>
</tr>
`).join('');
}
/**
* Escape HTML to prevent XSS
*/
function escapeHtml(text) {
const div = document.createElement('div');
div.textContent = text;
return div.innerHTML;
}
/**
* Copy URL to clipboard
*/
async function copyToClipboard() {
if (!currentUrl) return;
try {
await navigator.clipboard.writeText(currentUrl);
copyFeedback.classList.add('show');
setTimeout(() => {
copyFeedback.classList.remove('show');
}, 2000);
} catch (err) {
// Fallback for older browsers
const textArea = document.createElement('textarea');
textArea.value = currentUrl;
textArea.style.position = 'fixed';
textArea.style.left = '-9999px';
document.body.appendChild(textArea);
textArea.select();
try {
document.execCommand('copy');
copyFeedback.classList.add('show');
setTimeout(() => {
copyFeedback.classList.remove('show');
}, 2000);
} catch (e) {
console.error('Failed to copy:', e);
}
document.body.removeChild(textArea);
}
}
});

Binary file not shown.

Binary file not shown.

Binary file not shown.

View File

@ -0,0 +1,847 @@
%PDF-1.4
%Óëéá
1 0 obj
<</Title (localhost:8765/includes/header.html)
/Creator (Mozilla/5.0 \(Macintosh; Intel Mac OS X 10_15_7\) AppleWebKit/537.36 \(KHTML, like Gecko\) HeadlessChrome/142.0.0.0 Safari/537.36)
/Producer (Skia/PDF m142)
/CreationDate (D:20251202161508+00'00')
/ModDate (D:20251202161508+00'00')>>
endobj
3 0 obj
<</ca 1
/BM /Normal>>
endobj
5 0 obj
<</CA 1
/ca 1
/LC 0
/LJ 0
/LW 1
/ML 4
/SA true
/BM /Normal>>
endobj
8 0 obj
<</Type /Annot
/Subtype /Link
/F 4
/Border [0 0 0]
/Rect [78 725.88 120.75 739.38]
/A <</Type /Action
/S /URI
/URI (http://localhost:8765/)>>>>
endobj
9 0 obj
<</Type /Annot
/Subtype /Link
/F 4
/Border [0 0 0]
/Rect [78 712.38 121.5 725.88]
/A <</Type /Action
/S /URI
/URI (http://localhost:8765/resumes/business-development.html)>>>>
endobj
10 0 obj
<</Type /Annot
/Subtype /Link
/F 4
/Border [0 0 0]
/Rect [78 698.88 188.25 712.38]
/A <</Type /Action
/S /URI
/URI (http://localhost:8765/resumes/business-development.html)>>>>
endobj
11 0 obj
<</Type /Annot
/Subtype /Link
/F 4
/Border [0 0 0]
/Rect [191.25 698.88 248.25 712.38]
/A <</Type /Action
/S /URI
/URI (http://localhost:8765/resumes/devsecops.html)>>>>
endobj
12 0 obj
<</Type /Annot
/Subtype /Link
/F 4
/Border [0 0 0]
/Rect [251.25 698.88 333.75 712.38]
/A <</Type /Action
/S /URI
/URI (http://localhost:8765/resumes/team-leadership.html)>>>>
endobj
13 0 obj
<</Type /Annot
/Subtype /Link
/F 4
/Border [0 0 0]
/Rect [336.75 698.88 403.5 712.38]
/A <</Type /Action
/S /URI
/URI (http://localhost:8765/resumes/tool-building.html)>>>>
endobj
14 0 obj
<</Type /Annot
/Subtype /Link
/F 4
/Border [0 0 0]
/Rect [78 685.38 111 698.88]
/A <</Type /Action
/S /URI
/URI (http://localhost:8765/stories/)>>>>
endobj
15 0 obj
<</Type /Annot
/Subtype /Link
/F 4
/Border [0 0 0]
/Rect [78 671.88 138.75 685.38]
/A <</Type /Action
/S /URI
/URI (http://localhost:8765/stories/airport-dns.html)>>>>
endobj
16 0 obj
<</Type /Annot
/Subtype /Link
/F 4
/Border [0 0 0]
/Rect [138.75 671.88 144.75 685.38]
/A <</Type /Action
/S /URI
/URI (http://localhost:8765/stories/airport-dns.html)>>>>
endobj
17 0 obj
<</Type /Annot
/Subtype /Link
/F 4
/Border [0 0 0]
/Rect [147 671.88 238.5 685.38]
/A <</Type /Action
/S /URI
/URI (http://localhost:8765/stories/app-development.html)>>>>
endobj
18 0 obj
<</Type /Annot
/Subtype /Link
/F 4
/Border [0 0 0]
/Rect [238.5 671.88 244.5 685.38]
/A <</Type /Action
/S /URI
/URI (http://localhost:8765/stories/app-development.html)>>>>
endobj
19 0 obj
<</Type /Annot
/Subtype /Link
/F 4
/Border [0 0 0]
/Rect [246.75 671.88 342 685.38]
/A <</Type /Action
/S /URI
/URI (http://localhost:8765/stories/athion-turnaround.html)>>>>
endobj
20 0 obj
<</Type /Annot
/Subtype /Link
/F 4
/Border [0 0 0]
/Rect [342 671.88 348 685.38]
/A <</Type /Action
/S /URI
/URI (http://localhost:8765/stories/athion-turnaround.html)>>>>
endobj
21 0 obj
<</Type /Annot
/Subtype /Link
/F 4
/Border [0 0 0]
/Rect [351 671.88 439.5 685.38]
/A <</Type /Action
/S /URI
/URI (http://localhost:8765/stories/fawe-plotsquared.html)>>>>
endobj
22 0 obj
<</Type /Annot
/Subtype /Link
/F 4
/Border [0 0 0]
/Rect [439.5 671.88 445.5 685.38]
/A <</Type /Action
/S /URI
/URI (http://localhost:8765/stories/fawe-plotsquared.html)>>>>
endobj
23 0 obj
<</Type /Annot
/Subtype /Link
/F 4
/Border [0 0 0]
/Rect [448.5 671.88 546 685.38]
/A <</Type /Action
/S /URI
/URI (http://localhost:8765/stories/healthcare-platform.html)>>>>
endobj
24 0 obj
<</Type /Annot
/Subtype /Link
/F 4
/Border [0 0 0]
/Rect [78 658.38 84 671.88]
/A <</Type /Action
/S /URI
/URI (http://localhost:8765/stories/healthcare-platform.html)>>>>
endobj
25 0 obj
<</Type /Annot
/Subtype /Link
/F 4
/Border [0 0 0]
/Rect [87 658.38 187.5 671.88]
/A <</Type /Action
/S /URI
/URI (http://localhost:8765/stories/home-infrastructure.html)>>>>
endobj
26 0 obj
<</Type /Annot
/Subtype /Link
/F 4
/Border [0 0 0]
/Rect [187.5 658.38 193.5 671.88]
/A <</Type /Action
/S /URI
/URI (http://localhost:8765/stories/home-infrastructure.html)>>>>
endobj
27 0 obj
<</Type /Annot
/Subtype /Link
/F 4
/Border [0 0 0]
/Rect [196.5 658.38 297 671.88]
/A <</Type /Action
/S /URI
/URI (http://localhost:8765/stories/motherboard-repair.html)>>>>
endobj
28 0 obj
<</Type /Annot
/Subtype /Link
/F 4
/Border [0 0 0]
/Rect [297 658.38 303 671.88]
/A <</Type /Action
/S /URI
/URI (http://localhost:8765/stories/motherboard-repair.html)>>>>
endobj
29 0 obj
<</Type /Annot
/Subtype /Link
/F 4
/Border [0 0 0]
/Rect [306 658.38 393.75 671.88]
/A <</Type /Action
/S /URI
/URI (http://localhost:8765/stories/nitric-leadership.html)>>>>
endobj
30 0 obj
<</Type /Annot
/Subtype /Link
/F 4
/Border [0 0 0]
/Rect [393.75 658.38 399.75 671.88]
/A <</Type /Action
/S /URI
/URI (http://localhost:8765/stories/nitric-leadership.html)>>>>
endobj
31 0 obj
<</Type /Annot
/Subtype /Link
/F 4
/Border [0 0 0]
/Rect [402.75 658.38 470.25 671.88]
/A <</Type /Action
/S /URI
/URI (http://localhost:8765/stories/nuclear-dns.html)>>>>
endobj
32 0 obj
<</Type /Annot
/Subtype /Link
/F 4
/Border [0 0 0]
/Rect [470.25 658.38 476.25 671.88]
/A <</Type /Action
/S /URI
/URI (http://localhost:8765/stories/nuclear-dns.html)>>>>
endobj
33 0 obj
<</Type /Annot
/Subtype /Link
/F 4
/Border [0 0 0]
/Rect [479.25 658.38 542.25 671.88]
/A <</Type /Action
/S /URI
/URI (http://localhost:8765/stories/open-source-success.html)>>>>
endobj
34 0 obj
<</Type /Annot
/Subtype /Link
/F 4
/Border [0 0 0]
/Rect [78 644.88 119.25 658.38]
/A <</Type /Action
/S /URI
/URI (http://localhost:8765/stories/open-source-success.html)>>>>
endobj
35 0 obj
<</Type /Annot
/Subtype /Link
/F 4
/Border [0 0 0]
/Rect [119.25 644.88 125.25 658.38]
/A <</Type /Action
/S /URI
/URI (http://localhost:8765/stories/open-source-success.html)>>>>
endobj
36 0 obj
<</Type /Annot
/Subtype /Link
/F 4
/Border [0 0 0]
/Rect [128.25 644.88 189 658.38]
/A <</Type /Action
/S /URI
/URI (http://localhost:8765/stories/showerloop.html)>>>>
endobj
37 0 obj
<</Type /Annot
/Subtype /Link
/F 4
/Border [0 0 0]
/Rect [189 644.88 195 658.38]
/A <</Type /Action
/S /URI
/URI (http://localhost:8765/stories/showerloop.html)>>>>
endobj
38 0 obj
<</Type /Annot
/Subtype /Link
/F 4
/Border [0 0 0]
/Rect [198 644.88 249 658.38]
/A <</Type /Action
/S /URI
/URI (http://localhost:8765/stories/viperwire.html)>>>>
endobj
39 0 obj
<</Type /Annot
/Subtype /Link
/F 4
/Border [0 0 0]
/Rect [249 644.88 255 658.38]
/A <</Type /Action
/S /URI
/URI (http://localhost:8765/stories/viperwire.html)>>>>
endobj
40 0 obj
<</Type /Annot
/Subtype /Link
/F 4
/Border [0 0 0]
/Rect [257.25 644.88 343.5 658.38]
/A <</Type /Action
/S /URI
/URI (http://localhost:8765/stories/web-design-java.html)>>>>
endobj
41 0 obj
<</Type /Annot
/Subtype /Link
/F 4
/Border [0 0 0]
/Rect [343.5 644.88 349.5 658.38]
/A <</Type /Action
/S /URI
/URI (http://localhost:8765/stories/web-design-java.html)>>>>
endobj
42 0 obj
<</Type /Annot
/Subtype /Link
/F 4
/Border [0 0 0]
/Rect [352.5 644.88 449.25 658.38]
/A <</Type /Action
/S /URI
/URI (http://localhost:8765/stories/wordpress-security.html)>>>>
endobj
43 0 obj
<</Type /Annot
/Subtype /Link
/F 4
/Border [0 0 0]
/Rect [449.25 644.88 455.25 658.38]
/A <</Type /Action
/S /URI
/URI (http://localhost:8765/stories/wordpress-security.html)>>>>
endobj
44 0 obj
<</Type /Annot
/Subtype /Link
/F 4
/Border [0 0 0]
/Rect [458.25 644.88 529.5 658.38]
/A <</Type /Action
/S /URI
/URI (http://localhost:8765/stories/youtube-game-dev.html)>>>>
endobj
45 0 obj
<</Type /Annot
/Subtype /Link
/F 4
/Border [0 0 0]
/Rect [78 631.38 101.25 644.88]
/A <</Type /Action
/S /URI
/URI (http://localhost:8765/stories/youtube-game-dev.html)>>>>
endobj
46 0 obj
<</Type /Annot
/Subtype /Link
/F 4
/Border [0 0 0]
/Rect [101.25 631.38 107.25 644.88]
/A <</Type /Action
/S /URI
/URI (http://localhost:8765/stories/youtube-game-dev.html)>>>>
endobj
47 0 obj
<</Type /Annot
/Subtype /Link
/F 4
/Border [0 0 0]
/Rect [78 617.88 104.25 631.38]
/A <</Type /Action
/S /URI
/URI (http://localhost:8765/one-pager-tools/csv-tool.html)>>>>
endobj
48 0 obj
<</Type /Annot
/Subtype /Link
/F 4
/Border [0 0 0]
/Rect [78 604.38 126 617.88]
/A <</Type /Action
/S /URI
/URI (http://localhost:8765/one-pager-tools/csv-tool.html)>>>>
endobj
49 0 obj
<</Type /Annot
/Subtype /Link
/F 4
/Border [0 0 0]
/Rect [129 604.38 194.25 617.88]
/A <</Type /Action
/S /URI
/URI (http://localhost:8765/one-pager-tools/utm-tool.html)>>>>
endobj
50 0 obj
<</Type /Annot
/Subtype /Link
/F 4
/Border [0 0 0]
/Rect [197.25 604.38 274.5 617.88]
/A <</Type /Action
/S /URI
/URI (https://md.colinknapp.com/)>>>>
endobj
51 0 obj
<</Type /Annot
/Subtype /Link
/F 4
/Border [0 0 0]
/Rect [277.5 604.38 357.75 617.88]
/A <</Type /Action
/S /URI
/URI (https://nix.colinknapp.com/)>>>>
endobj
52 0 obj
<</Type /Annot
/Subtype /Link
/F 4
/Border [0 0 0]
/Rect [360.75 604.38 430.5 617.88]
/A <</Type /Action
/S /URI
/URI (https://qr.colinknapp.com/)>>>>
endobj
53 0 obj
<</Type /Annot
/Subtype /Link
/F 4
/Border [0 0 0]
/Rect [78 590.88 102.75 604.38]
/A <</Type /Action
/S /URI
/URI (https://meet.colinknapp.com/)>>>>
endobj
54 0 obj
<</Filter /FlateDecode
/Length 3809>> stream
xœí\[<5B>· ~?¿BÏ¢ˆ7]€ €íÄyNj ?ÀmëIÿ?PPWjgœsv½[ñÃzg¤á凤8ãJýç î+o~fFŸ³ûøéòû8$ö¤ÿ'.ÑQ`ñ¹dvüëò“ûír;5.þ´ }¨¿˜ˆÝƒqN]#½`*>æXoìc®ÓcÏ’“!>X" Ï€•¸†Ÿ×ð_/?ýÍývùýB^¯RÍ´#+ËÇO ¹¿wëÇ¿\¾þžÜ/ÿ¹d‡äJô¹„¨ÃUO?_~¸üp£J_†·._¿gÑ}øùÍÐà²Ct>]¾ <09>bü]ü.¡… )Áv̱ 4:çqüw÷áß—ï>t0G ¾Ê*Ñ£¸Ø~Ý,Œ/”ÈÙ¿?~ïŽD£b/ŽÙ+ôõÏÃ%{n0Æì8epÙ„ÄÑaò%•(ÑeJVZ"ŽXÜÇKöI(Õ+9)Åeµ rNJÃDɲ¤,Eiõ<69>ÜÇK©§ÐalƒôJÎ%RR<52>\©÷#¥5.ê`å,*­2„Æ?ÖùDK;úxÇzœ¢ P#Hôš©Ô Q(â¸%ƒN½@ •¬3GzeÂc12HôCÚ¤•ä!@b4zä#
ýIòÄ)ñ®iIž¹ ±‰ÒÔrјNÒ°lÓ þpY×2ñל,Cëî,Cu¦Î'KÓ»%<4B>ÉYÆQÕ[×Ç1féc;­s¬\¶Ñ<C2B6><37>ßâ •Öäª&æfîjznæ6°Xô¬)ÊìÍ' µKš…o+÷Z KCkÅ,M®µÕu.¹Žîpg.Õeù¦?^~½ü|ñ19ûW}Â<>X}‚üåþò ù„ÿsŸð<C5B8>׈¡ÂˆŸÂãØ): OØX²1DÇЃ¨ïr †g .I#èÿtß„ðöM=¡J
¥Î×ãB#°¢äVOFÑ—fÓ„>:%Q”ˆ. Œ ´J,•ÆSÐ5IÑÇŒ“RSÄE¯”€<E2809D>Ñ%ö<>ôŸÒ0¦EiõÚh=ÏJÔ!WK¦(M§†¨´~ÃÄ•‰¬Ö"©¬ARª²+숫+Mÿ¡ÒÄ¥:=ÄÌi;K>svò„YöûGJ¡q18C_•h%@Ÿ`=õ/F'è ¨NîÐC ¨Æ°ZF"±N¹ìM„l̆ͦ/ÛI•9;3 ÍÝ ‰Œínƒ/PÝâ=Tqy2Œ£:r¨#ô!Fk¡M[¬~ƒ2@M»Ãa0jìºC3ã0rpkÜÂËšájñ1á7¹]0µb-@/,àw%­õau¹VÒÒº]pÝ8iXNãÏ'^œ]ªn~OüÎ1½8<C2BD>LŒz¦%=Ó*í7¿ïÙÇpôX”\ <09>\E ÍÖWh¦`£‹jŠXâæ+
Tc¤l|EÁ£¯(xâ+
}EÁ£¯(xæ+
}…ÒŒ¯(´ù
svbÔÌ2±¼Ýo¢Þp6‡‘`.£MÔ±ÞŒNæš4º«wÓò\çÆÓ»a³ªu%4¡Ñx\ªÐÍýr9ó¹ìÞ"ç!ð3ç3osȸœÛ¼hTœsã7‡óÑaäÜl©u&ã0”<¡`ÆMÐlw˜ð2¼ '\7á&°<>檚ëdÓè\QF÷vå ¥aÁ«N£ÔX7ÕÚÔ5ŸQdø é­ÒèÿaüÞ«3wQà }L<05>äâ«oüt‰= ”E{0´<´²Ü{F[c_¬|ÇÙ°N>tW¼Êu tãÇþ ŠØÊx8Jw¥ý¯•ú°!š­¬w|ÈTVÒcV ÈÐÐä(ÐÂBŸ$2X–œ¼`°(2Ä7;þœú
0„R¦vÙ%ñµP}Wh´LNPÀÕsnµd OjLÏ!ÒÝ<03>Rò9D 4 H^RÎÑÅR ¨Ì çÔW€&ͳ«ÓÓrÂ<72>alpW-ÿ•®â<C2AE>¤™Rϳõ™¼ÈtÜ<\õ‚ï<17>@¥{ηcä©À$ *îßýÅŒ¾Èîý
¨©-"Éo =%¾IƒòP¨=…k|vwnÏòø$XÖoÏì*,û\áW³½däoþ4ëƒZÞµiŸR4”bò>ÀTCêM@«DÍIZ>_%×ôÅd~€¹Õ(&Vâ1÷Sjµ¢s%²?%*+)méŸù_%j$-i€Z0^É„=?³;ÓLPö»Î\Ær8“+ËÌ<C38B>v±G&e54Ó-£Ê™˜íZŸ9œµÐLö¬-±ÛÚ&ƒJy\:”cíH‰Uþ²¥ƒJFŠ5q^p¿¥‰Sf®‡È[R¨d.)qV“\ç¤u>Ë •|H y™·Ô°ž08ácr¸ßÇàoñ´€º˜7˜ü/¥˜…²´g•œ¥‰Ö*ÛR<C39B>Å¥aÝ«‰"è.{º%U³Ó?vöõ¡W½Í½æŠ¬”Pk<50>à¥=­¨ÏZG_ć<C384>XF~JœÃ_4a”àr¸ËŽåŽËˆÍ¹?_¤Çâ¦ê8Åš FËTÇÙESAÿzöêyãð퓳KŠ'ÓÜc|#øÈºÁeY÷„b 9Kœà´ÃO‰<4F>ûÊÒäx"MÂi q1n†Ÿÿ·Ò䘽`Î7ÉžÈæ,q2n‡Ÿ‡éá%8@ðÖÝ߇S±L¶Åù•g<E280A2>rºêhªƒ¡§V¡ì"ǨõtÑÄÿºß1<>ÛÁX޳l‰á¹º0é†nêV>…ë<E280A6>i3êójL&Eíýx<C3BD>ZaäQÞQ<Ödmæ#Ý…žKŸ««<C2AB>7µs>L^Q»¹ø ÔÎ!g¹GgÕ
Ä"žHõ8}‡~J|…ðÐX { ÷çQ —+Z)­ošƒPG¢{¥Óy¤^êæžEwdW³!Z¨¶ÉP¾Ñæâ/@´P>Îrƒ#FÃ*`ñx}gÈ ZÚ{kJ^ï<>‰»¦¬V™÷èê'Âô ÙAÌW^•ž¯·h‡ß °*W idS+:g¯^žŒŽªœaéGý¥tqGYêúèõìú;[=Îx¹4VnR—½øùZÀÇYîÒBO!¹$©5亀î¶ú°Q£øÒïnf8§®^®D¢1iÅÚÝU%-<2D>³µ$,WÉoWÝ{0AOç¶2uÇѓŅ%âàIjíó:¸íÅÏ7q>Îr—àŽ ž„KÞÀËnC5063œS_Ü$hL
=ß_Ã29Ñ ¡É¶âSv|¶°7æúßð”3?Ùœâqžyœƒaµ„º=z½&7S Ž<1B>µ5ßò6½†¶<C2B6>$¹®){ñ©g¹G<>S}¡Îºmpö0Úõkˆá§ÄWXþÉZ“î±íÅò8±Ûë£vPŸ_Ñ$¶Òq<C392>m«ûíܷ宯±Yl }¬“ø¸Ëf~ÇÌ9^ üÌÅòü2)„ã,÷¸.RԶ̤¯Ð<00>]èÄÙ'Ñ,ql:á§Ä5üå*qÀÖšP+5÷öX´LZ°òÈlÞ˜ ïýÚ<C3BD>Þ}ÚÊUrÍo®¹øùÀÅ@ÇYî¸9XàæX|ÒnÑ…<C\5ÃO‰¯\ ÉçZGTkÆTŸú÷\ˤœ÷P”ö¦Lð1ÀÞÝóÎx~é wŠcÑ©qØöâ/v¦ã,÷lÀ"žSÖï…lÀH>%æ ›–º`lg8§¾ºsò½2Çêÿî±3Òrùx¿/‚åö\Ùz×äѾIïðå7+ÖÁo{¬Þˤ¶€<C2B6>^— Ýz{ñóQÏ޳Ü%꥟R;ê%E/Œiì¥|ΩÔ¿²HYÀ'Òw0ŒD™À'З<E28094>@h8_ÃO‰¯°†YQ?V0ŽÝª»ZÀÅ'.ßÙe“úö¦òm_ôLUF!ãÝjóÌÇ®/e{ñó—²g¹eçB¸å¦Ê©>ðz5ÞŒéjÆ­ãs*ú]ßÒ,±qµ):¯B< |³ú·üëG_nÌÿ0œ5µ/]¤Ñß©³^±<>¹n0 %‡ð¸ÃS)Úgú;Ó‰¦´Úh¸uw*õqw'Bë]´/J)MÅöv*QLjiíTZ̘ŠéÂSšr·ÆN¥*¿¶¯³Òj/cíøCØÛ:ÍéÙ3h¦™í…Û g'¢am¶,fwã&ëèƒ4J™ýFy³µrSóìÂ4™ÝšËnØ­j{9•R¥vvÖ5˜·ûµý“S©Û}­c79{sãÖÄ©T®/+ÅõvÉMÅ­³2o œ½ ÓY£ñ°æÞ¿YO8Ì¡8æ&b“<62>…ÄÁ´Î`{êÁ¬<C381>Ö¸™·ÕÒÔš¶¶Ía€èöå× •¦¯vm*_$<24>ŠŸw98»6¯·<C2AF>¯NÉÁEòñ†=P½šæ>qlÏ£žnQèiÙ¸awwäÓÖRr•½§W²`0¿˜»å¹úñ©><3E>ƒÓ7¸¶„às…9ÞŽ²
Ö¶Í>ÛŸ_Ÿ×Ï)wà3„Ó4§lÈßÒV´-Ñ‚Ùíû®‡'½@dZŠùúίghj/=M\U%Äsýùæc²T0¶Þ¶â±ÙÔÐNªGø.=ìH{rÆë½üж½ÕOΚ|HÚÿu¦<75>»ÊšÔ Ô×ë3Î<33>MñI È¢>lÔæ¦™áœºfx¹<eè—CýÀp “ ªÜöâ«ê{Ãùt€ÄôÈú<“Ç_œQÊãhSèm
<EFBFBD>EÒ>b¿8ƒÒ>¯b?å¡´c´)ýƒ-6Ú”öa3Ÿ›ÂÇ`Sx 6eÿâŒ9½â õæ=Øœœ­Èj °b0+é ÖJVD·T·b?«ä%.s¬hrZ »M·XSÚWM¢<4D>5¥}ýd¿_ûNJÜcM}A<>b±Ñ¦´¯®À&iû>Ëþ ¥Ö·nl¸)í{/[D/á,Ü”p 7% {©' Â1Ü´71›ì,(N® f<>|ÝSfL…™õbTkVÖ4¶»±Ò´åõx³% 7<05>bû„jA"?þÀçœ
endstream
endobj
2 0 obj
<</Type /Page
/Resources <</ProcSet [/PDF /Text /ImageB /ImageC /ImageI]
/ExtGState <</G3 3 0 R
/G5 5 0 R>>
/Font <</F4 4 0 R
/F6 6 0 R
/F7 7 0 R>>>>
/MediaBox [0 0 595.91998 842.88]
/Annots [8 0 R 9 0 R 10 0 R 11 0 R 12 0 R 13 0 R 14 0 R 15 0 R 16 0 R 17 0 R 18 0 R 19 0 R 20 0 R 21 0 R 22 0 R 23 0 R 24 0 R 25 0 R 26 0 R 27 0 R 28 0 R 29 0 R 30 0 R 31 0 R 32 0 R 33 0 R 34 0 R 35 0 R 36 0 R 37 0 R 38 0 R 39 0 R 40 0 R 41 0 R 42 0 R 43 0 R 44 0 R 45 0 R 46 0 R 47 0 R 48 0 R 49 0 R 50 0 R 51 0 R 52 0 R 53 0 R]
/Contents 54 0 R
/StructParents 0
/Tabs /S
/Parent 55 0 R>>
endobj
55 0 obj
<</Type /Pages
/Count 1
/Kids [2 0 R]>>
endobj
56 0 obj
<</Type /Catalog
/Pages 55 0 R
/ViewerPreferences <</Type /ViewerPreferences
/DisplayDocTitle true>>>>
endobj
57 0 obj
<</Length1 22332
/Filter /FlateDecode
/Length 15956>> stream
xœ½¼ ˜Õ¹7þžS{õV½ïkuWwO¯3=3==ôÌÔ¬ ›ÀÀ ( Dq#Šæ*ŠÑënD5.ñ2 jãJÄ…“«&qM"¯q|7hèžÿ­êÀ\sïÿùž¯æé:§êœz«Ï{~ïy·Óô°X6wA¦î†ô±kЃ°lùÚáuXÄÌÀŠå£w­n+<00>w<03>¾³×<C2B3>³öî ×Óì3ÔÕ眷éìå…e]n X³jÅÚþÞºþÏú.š]µrxÅšß qÕª•ÃÆ2šáUk7\ôv…ˆZÞùˇwýzÿ!|<³vø¢uì}Ìûð9¾5¼v%šGí@ZåzÝùl˜X+PR½^¿rÝ^¹ôYô ŒuF€†[<5B> 0 €ù”~<15> @¤Òª€ù°Î<> á<†õ@€zL¬TÞñ5 ¡ºƒ•e•eº;Uš§gLÝÙ§ÿѦ¥†âÈȪ×?h9]-?øujoeÙñuwòʸò)´(ü Þ×UKô>ÌÃ&¥¥œðÔ÷8y¬Û´þ<02>!ªß<C2AA>Ok€vÌEÄNªOáÔ‰§”j<>0<>`@ tÁLX ƒ°6ML¨OÔ@;ôÀ,„a8wbb⣯þý·W<E28098>ú÷ÖÿæíÆçàcĕĕ¤‰|žšMÝCS4E¯aXæÖÉ>Í­ç³·æz­Iû²žÐú{¾úg¸R <E280A6>ƒÆ¿™Î3Ï3ÿÙr†å «Ëz¶m¾í¸}ƒCtüÂ9à
»®rÜ»<7yG}Vê§<06>¿vhÿý ¶~îÿëƒ:>jˆÔ"ÈM}7ò°S‡ V¹ÆC<>ðU½ÿدڦ|ZÈ ¨”Ô"°“@?ùx¨Cê'È\Ü$ýÔÿô~âzèû¯ñ1Äõ<C384>!j‰ë!† ÐH˜pb“< q"t$¨Ÿz€SžÁGxa.€Sy†ˆP‡ Á@m<4C>—êq˜&>˜˜ø¬Ò ´<55>xðÀ^åƒ+mE<6D>Àáv `3| `‡|„Z<E2809E>€½ð|³` €™ðšÛ``-j<>0ú94B7ÜÏ<>6ÁùðôÀw!{ᩉÀ<0E>ð”àKàÀ -0Kà:¸Ü ŸÂ;'>ƒ\ %xkâ·<C3A2><C2B7>-p`pAºa ¬C)¼ab+´Â¸ž‚<0F>¬Ps`¬…oÁ¿Àíð,¼¿@HAZ õp3Üò£o£ïÜΉ5°–ÀX x~ÿÑóèЄgbïÄ`¡ :Ôö»á{°¾¯ŒÁ!8ãhZLˆDý„n¢nâØÄÀ2ôÁ°ÖÂ%p%Üá5x >D~C<>¨­C[Ð6twf¡æL\,HÐ-0¾Àµ°n<>{àAxáßá#Ä!·ã-ø(a$dò4jtⲉ]ÏMü @èƒ>˜à"¸®<>à&x^€_‡ð'(# ÈŽüh/zý6â8Þ_%Î'¶»H ï&ß§Z©­*G&Ι¸eⵉ¿ D yÈC 0+`œ«âãØ»a¼oÁ;ð>”¡‚|¨åQZ.F?@ÐaôŒ±€ý8Žãx+Þ<>wàýø0~p^"FÔg·;ˆÉ›©Ôõ¯Ônú÷ÌÕ•å••ÑÊ%•g&ú&nøÑÄ~` 1uN{aÌ‚Ó`!,³áb•×Û,Á.x ‡Çá ØOÃ3pÞ€ßÀQøŽCq*È<>²¨€Š¨u NÔ…f >4-Dýh1@Ãh ÚŒ.EÿîFw£ï¡<C3AF>èh/Úö¡§Ñkè ô ô t}Ž>GÁXÂ2îÃ}x1^Œ‡ñr¼
¯ÆkñõøzüÞ…÷âD+ÑC ÃıŸxøñ!ñ7ÒEn ¿Mþ˜<L¾C!ÿ“ü’¨,ÕO-¢t<>¥ï£cÎe<65>ü<ý•%d9l·â¿Ã¥x:|^À¯â^x6£ÇÐ}<7D>ûán¨‡zxÞd¨…Zà<5A>‡+ 5P G¥HX ×ãv9vÕb6ƒ^§ÕðËÐI`Én±gY`LZ6FJbooJ¹cÒð)7<37>c=_í3X¦v |µ§<zÊÕžò‰žH¡˜JºÅÀØOºÄ@ -9m@ Œ]ß%ÆÆÕúlµ¾]­ëºÄÁ`0• º«ºchY {¬gtÕ¶îe]©$Ú'+Ú;•„}2hÂcÐ9¼y•c :•Ýc.±«{Ì)v©mD¤{xÅØ¼Óº»ÜÁà`*9†:—g<E280B9><67>Ø1fHL>®<#"óÄÁ`*¹Zùþp­v…¸âÚ g-SjÃg ŒÃcx™òcbÌ.v<>Ù/þØqòrªÖ}Ý)<29>c8Ò3¼r[Ϙ¼ìÚÞêå2åjøºÞT²oAàŒ<C3A0>1|åàÀºr°ú%Ôï^ÅJ±[¹³lM`Œ;ÄUÛÖ,ŒÁü<C381>=.ÙÕ-w ŽÁ¼<C381>=NÙ©^¤’û—N jRÉ}©öT»RN :.­¿ûNõþÏ÷kÔ~~­I%ûæŸà RÞ$Γ—<E2809C>–«/Çp¤I9­lÜAåD©d÷ê1®sÙ6¡9•DcTDÛ¾€1´Lÿü«w†'ïÐá PªÊtž@Äž¬— šì+7o`7B7 –ÐÄ•%èòg¦JSà°ºk -K• ž,A¬&˜*AM2Ð3FDz”y l l±b[ '°jxÅQËùâÊmƒ™À,Xƒ…Á1yÐ}¢ºrp°9U„B‡Tél ôÖLRX£RØ6˜)§J<C2A7>ÆiÞÀic[ºÜcr× ; t<>íŸ70¶¿ËL• uâÝW;&¿s:YTMª™*•c[Ücòà¶mÕ+18¶Û6÷6Eª×%ÿxCž¼Qé.¡-óÔ¦-bЭ܃bpÐìJ• ›ì[05½%¨ýŸ9\w*‡sÉÔ©®ÿ¿Äá†oÂáÆoÄáü×s¸)Y¼ÂáÂÿ;7ŸÂacéS<C3A9>cêë-Gš¦ <20>f†bhŠb”[“í$ER$AQPCQE<ÇÀ”öÏé3 Ã]¥Ï1 Í04ÍÐ0ÿ”¾rÅPhxöTúÌ×ÓgšeIžei¡=I_qD(’¦   ަiš$ šbh´ÚoD_%Æq$Œ†ãŽeŽÕþô)¦Xš<06>ÿô9Ž¢Ïjú\•>75? ÍÐ$ÃÀœÂL"†gÐk5ªAÿ?Óç9ŽçI
8-ϳ<Dz<÷õô5
}jоÁð<C381>èó¼X<>†¢<E280A0>Ói4¬†g9 o8AŸa!Y–Ô²,ËR4É2Á ýôµ<1A>8­¢<E28093>×kµœVÃqZÍ7¡o4èþ7ôà Sôy=h&ÛYŽåXãHàH½2Y4Cq
ÀdÔ<64>ŠzþŸÐ×juÀët4A§ãuZ^£ÓA{*}êèsz޳Iÿ èëu:=hôzš­×èu<1A>^g:IŸgyæy
xÊÀó<Ï0Ïx,fÃÿ†> ZS•¾V¯3«áåàxŽç¨Sé³t•¾Õú<C395>èëõÐ 4 :³Á 5èµZƒÁz¾†Óp´FCƒ†4<1A>†ai oÐhÀfÏÔ¡ùzúƒA­ Ðè,  Z­p
}^Ãkø¯Ðçh<C3A7>V¡o·O¥¯ýzúÁ`<04>ÑÈp ·<18>:£A§5l'éky-Okµ4hi“V«Õ²­Õš´Zp8¾ }£ LÑ7XúNo4:Ô%^¶V£Õ|•>£ÕšµZ(Am¢Ñ„là~º¢¶7âhÇB$·ëÐ1@<40>õ,¨g@Çd<C387>rk;ƒ¶ÓèOís±‡û#&Á~Œþë¡14cÁó˜va»0 v`å£Ô.×a¥dáF p#ưSp#f<><66>ó1ÀùÃù˜ó1 $,Åæa–ªçb Ê[çªWYŒ¡ “<>U¯2ÿõ¶ &!£^ù1»±òSèc4ÍÜàaDïõ¡ÙpøQíž«æúŸC@tèFõ|…¬è>èÞ èn è. èžC×Â<СóÔ3õót¿œ§ëœ§k§kž§{è![bºgcºRL÷Øî˜n4¦KÅtÏ¡Ý0tè‡êù_åÀLÝ_fê^ž©»}¦îÊ™ºgêΞ© ÎÔ<C38E>åÑ…=:·GWB—>a¸É°Ý\ ]ºw»î¦íºúâ±ÚŒ¿½„þüxΟH6úKèš= “þúΞ…<C5BE>øÛ­èrˆüh ıR^]j¹ eÕò"”UÛ7îÉÄý%tÁžÖ{ü%4²§õˆÿt.¤ÕÆ5{rGü%Ô´gá™þvå&iÖA«”©=­7ûK¨fOò'þv#ŠB<45>Â<EFBFBD>SEÈ©ÝC“%½g¡ä/!jï¤"^Bh<42>¿ru £'üÇ2óý_¦K$Úãÿ"]bÑÿoâ%üÈÿû™~D¶ûßÍœéÿUëLÿ<4C>ÿÅ…GüÏgÎó?•Tx¨ë…:<ˆ²èNYã¿?s³ÿ¾Ì5þï·ªÍ÷æTz·.T[â%=á¿f¡ä¿ ]Böø×ç”7hüçfÎó¯Iöù—§KèNÙàO'óþ™§ý§eÖûçVß4£K-z3O©Ãù³¬k÷úÛ3^KëOüÓºJíñ”Ç÷øë«/¯K«Ã«m<C2AB>åO¤K$ù„¿fa­?”+a$§üýç0K™~&Ï40YFb"Œ<>ñ2ÖÄ
¬žÕ²<«&$Y`-¥‰_Ë %¼k¡¥ IåLªu+g\<5C>þbÄb˜ Š…<†®·<C2AE>¶9ÚL­ÆBO×ל_wxÇní[00ö°wp¬N©LxûƇoúú¸»kúD)ö¡ ú]÷|õ~°kpÐÑ76kÞ@ }Ò½º„~×½zxLV?AŸt<C5B8>ÉÃ]ƒƒ}cT:GŸtw탅J18°7B\¡qܨv»¦Ú-ƒ~§tëR
¥ÛȨÝ2øˆÚí'J·ÝWÇ»»vÇãj* W«]®¦ÒJ—FÕož…Lw×îLFíÅ<C3AD>¡¬ú½³ü˜JÈ«Ê庻v·æ”.»ërÝóvçêÔæÌÉædµy~µy¾Ú|úÉætµùÞjó½]ƒƒ_ËãÿÇÊŽoÖï±ÓïºünÅ_&v¯\&v/»vt•clËY<C38B>ÀîËïštÍ¥eg-_¥”Ã+ÇîWv<57>].vvŸ~÷×­4Ÿ.v톻»ì¾[^ÙµçtùtÕqìªëGº¿ò®kN¼käú¯!v½BlDy×UÝ_ÓÜ­4_¥¼«[yW·ò®«ä«Ôw)cë^½ ã¯96\xá™\p¦â¿¨Û¨> €<>νÍ èZ${€dfÀSä ‚À.Žff p²Üïƒ=ó‰Äœ£ÅÙåâáËâl¡\„¶b¹(-µÙœ1hŒƒÆ 5Z:öwªïï<C3AF>ˆw<CB86>GÁVì#ΧVÁtØXBò´\;áÒ9¢aiÎt}Ðl ðX ­}FRŽv¹žöW<>®'Øl±Ø<C2B1> =ßnl9ÈLï½èG"óAqöñåå¢ÑThÉp}®—ð<E28094>pÚŽ…÷ŽWŠ®÷ŠÂ{ÅÚì•€LùƼêsu6{CýdÍj¡í­(ߊÔ:C3v[£Å<C2A3>”AVËdµ¡¾1ƒôH©m]yß?«Æ¿b]CÂ'Fšðü°³WôûâKn]fœ{Ç@½³fû,}!J]¢ÿ_Óa°‰¹L<C2B9>³%$ÝÖîZð@(OöG6½žyÍhã3~SwD|Tbô£ß3÷ ú̃5ÅÓñP÷SËÕUå‡ !8 'i2˜·ßH 2NˆY þb Ÿï·_G\G^Í^Å}G÷ýw ß®ó_¸¸“¼Yw³þfÃÍÂ<C38D>þ;á.]—3,KƒÝfCØá@Øát"ÒMü<4D>Ü<06>[ãƒ~wÀ°9±ƒ»]„X.ÀÒtÒät"Žçã& ÑNÂÆsl<73>Ò#§<>§IG±€“vG õËZNr,0è Vlç0ztê…˜ƒPæ¨ËY.;><3E>¶b±ØV,ºh•ÆÑd/ åd*¶êÓ j³pp«>íP+ £© 48”2ã(£„ <E2809E>RS*[<6A>âV¡ÈÅâVA_¬Í¢!¤A¨¡åQù<>ÝlhE õRõÈj±ÛìVDÜ4þYeùܹËÐ#1Tɵôÿ²¤Þbê/:Ï_ãêEQ¬ÇõåÃåÿŒpgÿ?¶qCž<43>DX{Ê0«æà+ƒ®zŽPË•yÈg©>ÐBêà yÞUî+}¸‰è%NwŸæ{½„ÞF¿L|Œ>MðiVêÜt[S¢7ç­¥ŒÑT]_íš)ôS
QTÄšJÛ¬X‡#l¼„r²É9€Ê<>-<2D>çD >ËÅ<C38B>B »ës™ÃŠ\
o<0E>‡¶¢0ÞV
™¡‘òc¡PåRŠD¢6Û¹IÔ$ƒ¢Ý(!…¤¤=Þ<>@Äý¨ÆêG(¨í‡D)kËå—_~9 ¡¡pcC½$Ö ¨ÑbËQ­¨ÁX/Eu¤*J>¤bò<> õQI ÑVcWÞüëþŒÓU\[~á’3.Á­_¢àÊÂúë_þàÂGÊ+ðó]Wܺà!Ù÷âÌ‹ýÑ¥¨‚ü¦íâÆvZºçÇßíKxB;nüÓ þ£¿xד²h«­ÔÊjø€¨å B~$»~åùÄþ‘ƒt¬vàk³SnúR™u¦„Úå}©ŒwJ6Æ`³´ŠˆšÒn.ö3Ã;ìÏÛj'ì%L?&úK˜Ú-E2‡<32>Ž •¡#¦BÚTF<54>«åS—ãè8\-ã×Ñq^Qyéñ„tFo$(=†<èB†<>Sôm<1E>à£ÂE°åêó9³()L£¹º|cÞN3´ˆJF!ß +?Ó{ëù„9ï¸ô­_Tþˆüïí¸R×ʽRyâ…Çž=„ÚjyG T©¿fá=•UÞ®ü¡²oVb±´¨ý[ÿþ"
£ÄkoM®ú©>ÐCî<>ë¹Ñƒl‰-¹wÿ<77>¥YSÐàÇÂæ ÛMf̧;ÆiQ ³ôÂç=ÈSÂôãN7˜©¬Q`Vš 0gR1gˆà|^¿7à zIšŒ¸"¬D„è<âœtQ^œÆÍŸ`I¢fZ6… F!*ÜœWÀN-X ­ˆAtíì?Ýõ‡V~ß][¹d]WÇz£36_:oÑ÷>.:/°ô&4Œ¦í¸Ú—;öÇMÚÂâÆu2+<2B>q•Ï—ýÍŠEh ‡©>ÃCòýË·<>Gü%zïí.·Á‰œ)/1®<>A7-·ÛÝà@Ž”Åt1ÑkÑN?á÷…I³Þ<C2B3>f-æ¤×çYY§ãï\_ŸÇ¿Á| ó<>K&œ$¾Â¹/‡f=ªhÒ6S!£Ü/UéTW¾„ðÅÿ<1YBµ¨ÍæO°Ä,¦‘¨²)¨É¨^-6»5hß4­c=Ùɬ©|·£ØwzmÙ¬½÷ŠÊ/»7”_ˆèÚ®$6®íd¥Ê;×÷yâ•üœ<C3BC>iãìŠ<ÒÆECíÄGÔNj9d ÏËîO0бâÅnß ÛO+F®­ŠU&": “×çjÓÙ aJG9fXt:âál6Þ!þTÄq®ø¼Hˆ%L>VgX˜P¤¬®V•²/‡†Š¦BF(…#UYSØb²×犈!¡Å5®Ý$Æ<±´Î<18>¤$cLµ´"j5Ѝ%¿*j_'h<>'Ùh¥Új´<6A>'„N$Ö~bLFt)!Óֹ酃•·PÍ»©áÎÌÏrÖTvü òæë=~ÍRË;B<>Êi·ÌØRy«òPåãÊ zƒC ¡é£ÍŒ$QÀŠÊÚðE»~Œºïðo<00>°¾p‡<Øãî‰b]ÐÍžZc!q¦Û )°KLÁNº-1Ñtûb¢t×ÄDItd$át$ÉôÉp$â³Z8'jü>VãNW “<>§tÒ$äRÉIÈ)ÚuJÙ*ÌVL:£]U·SÆqmFNaŽY<>ÁSê*¼åiœ„Zð¢bç.Œtáµëqa¤³s¤|hÓ´òÍ]#åCUœ}«ƒ•$¶ã[•tãTýøÈº6>ÑÊW¢*KÖÉ*ê‚ø2ªÌ`<60>9¦0&"à6§Tf¤D}ÐmJ‰zI<>feÄfk±•0)szžÐéã$±`Í(Ã5š
Â'EÀŠ
ŽfW‡÷ƒS<07>gÎÜŒÏTÎåï£L„+l¬ê‰n9>²±ÀE¨>@`<60>ø<49> ¾-×ÖmìbMA·>ân]J$HÖÅ™tËð:ü!þ#&q<>]¯ÃTÚÎqlÜlz“àæv{Ü™ÃG„/ÕùPÖÎÑCŽIÝ2µ†
ÍÐ6v©¢P­ÔRH ¡¨"Zµ[su<73>_£š¬Ö±»#óÏÜ€gmœ¾|ùMËÎ}4óHÏbbÇz™$fúš²ðúò<03>Sëß+êhFä•Î <0B>W9oqÞï|ÜIŸd½k
‡N»<EFBFBD>Ð6 ©c»,iÇb Ž€cžƒp(KœGe¿7ep“K´µg ãŠjP‡§­6†þû4øP.ИÏAûHgÇzÜ92Ûµçz<C3A7>qÿúÇöDÔU\Y³$ºõìã±P”"ð’}•ïMŽ„þ”êƒ</¯þ$ˆŽÓЧÆî‰k
šÏ"Ï9žW9 ÏñMÒäv{xŽ|>¯ÏÍÀè·VñD;aqÛ<Þp„²²²'èµÆ´1£-æ
Çül,#8^ãõP.¿ÛŒŠ”E}þduÔQijÔ*öìáóÏ…Ï…qáóÏ[2®—]ËvUöª(FH<46>B¡„„À*vêœÂý£È!Uc5h¿¬·çt zD·¯ïèX_~áòQO¹\8¿â<C2BF>è¿OÈçwÒÒ±¿<C2B1>œÄv®<76>”7¾û
âöcëÉ3<EFBFBD>ÿôÁ\PQ,(ûħԃTŸâcÀírǯhÀ¹Êù¾æ3ýgÖ<67>=´F1õ<31>N‡Sã`<60>$ f<>uM<ö<>ÛÏ:¸`<60>°9ì¼KcŒi5I»ÝSåQ+:ý1Wäb<C3A4>˜Ê1”9|ôóÏåÏ—Ÿ«NäçFSÁ¤h¼ ´µWøR.*B[PÝ8#P <09>,ÖfÃ@eK4<4B>¢ Ad¬<64>žÀÍ Ž ûe½žT[ZJXë#è7Î<11><>ªÜÀ¯«üØlpbé¸}(ä%I»dç±WÉåÇ«rBÙ(H@ËÄGÔ·©U 7xà~¹þ%Ó«W]ÄÛ¦w,︈×ô…ƒ¶×ä»ú·„·lï:ÈNM{ NÛ9<C39B>ÇM-\fF榟¼MóC Ö,t+
ÎçUÜЗCã'ÌHUÀëÀåŒX%<25>dŒ ‡&<>Ê#N¯É#PyÒóÀkÙ<¢Ml^Õihj©¾ ÁИruŠVˆó<CB86>Á€Ýf:¨è3„"•}<7D>#T9¾§4ñéëÏ" ²>û“7Ÿ«ü¹òëç~Œw ³*¯¡”ºÁ¦¦òZåÔûÒãO¬”*<2A>jÂ/NF È~ÕvŒÂA¹÷%׫ü„ó/6ɼ/ÁšfÜÑ)Û1tK)ÑòEÍLûÒ|3<>ì„jPF%V¿PpgÝóÜ„[Y4âthÒ¢ŒÇN,ãêš-(^ËhÆqt\©TÆêÊèsz5:ÀÚ4^}?ÂN}?Òyø~ÑR÷_3n9ÎÏ, Pü¯T2˜tL|H±7ÐI;“´ZH1$‰U±#F¿¿øÊ6o>$\ÚÍǹ°¹ý[؃Hd©¼þIðçôo—_$oògŽÍxùøÍôˈ<C38B>çvqÒ«÷ÿì¢r݆"§JYKåfêY1øPÎDh^Õ¿ ¼`{5ü“È»ú7…7mï†ß<E280A0>h_µ¼ý•åý(y+»ÝA<C39D><41>Mü
Aye<79><65>•íbÛELi<ÃÔB¿y‡ùyóOÍfJÁÝc5š…1s5ñI׈¹BKƵùða‡ Ú¾oÞsµŒ»*3¡(ؤh$Žô$Ã_ƒÆèmö“x„DB(ž„ä¤ÿOICáhe<>¤Àó¿¡SxîgWn¯üõ±å.| 2±zõc¼ëá¡G¿§<>¬<^ùûã/æ뫱Dó<>û)íÜ•O£Œ²¦PÓ¨>Ð@ üI¾¨×õ¶G=ûă¡7CGBõ 1dȲŠ5žHˆò°{ŸòbÃL­»&®\†H¸F`4b(7y½o8äñ„5H“ç…—…·„ÇÂd8¬5ÝLÚÚ˜;b=Þ<>èAT0B,t®•ƒ(¨ <ÉGâAAx2qáGÇ•õ¿%ãPiŶñª‡~ ¼ù€£ºúM…­<C2AD>Ø,aýŽD†Ô)3Ù$m<>Pm#úé`ú‘:—_ŽFpŸâyŸDv<44>ábªáÄTñ<54>7,ýÁMs._­lmn?çw<C3A7>þúÐ#è<>èœÊÇúî åCø Ô¹oO»èLW˜ò*MÏbãy<C3A3>œ”ê?rÇ}®òß²I:G©ÊÚõ-¼Šôþ‰<C3BE>‰qj4BedÉ(n⿭٦٦ý]øãÓÇòý¬á™È5ü5º­wù7#L£âFè.•kW×âÚ<C3A2>É´[¹ãw]*/²<>mö<C383>9Ññ$éOçÍ™Nsr½»¡„VËp7ê>й™¼Óí*¡Õ<C2A1>{Ü>÷£DI <79>Mü11 …Æ<E280A6>P ]ò$Y …¦Ìá7‡6<E280A1>qoM…ÙÇG®ñ£ãU/Œaüè¸kÒï·WËçCŠÿq¢2²^<5E>Žú@Š2…õ¡~àâL?¢RL?
˜Žèul ß<>â1ާ“d?<04>þþªäÅê鄯b¶ÙUî>*©R WNú/i¤L©Ånó£áJ1D3"<22>þ¥¾çâÇϺ±7sÛ®¹™Å¯?ÜsP/yÙšTmÝûç-ܜͮÜûPwןŸ]úSCØI¦ZÐÇèîmóo¼äü33g®­Ë _x×ëÝá`eÖÁ»—Ìm*´ž¿jñÀE;Ùt¢½ÄaÅÂò<00>ìpÜJ¿L¸ñ.´ ãhÆKÑRŒýÈ<C3BD>±q¦[—
±A·6%š_¶¹±Ýl±¬QGÓ°NË:K˜ßƒûP ±²žaã&¿q©q‡q—4»úìû0ŽÌÑ£G‡ŠåâÑ£Ÿ¨ê@qUª²y¯¨:ÇhhhhHPüb³ê'Ð)æ’Ê›y¥¦6|þžõ37—¹B^ÿð·ýuT_å¾ûûT1ë#|Ç•$œu¿\ÏÄGÔT+RïÊgô»º‡¼ƒ¾Û5·ûîw?íý»Ÿ0M#Ó¨éfº5\«Ý«½«}yòiÉ b!ûÙns*¤?[qRAw$&íz”"f`.íá$)àÐë’»b:ÆH**+C,úÓqÒJ(U¿¬j¡ª5hWC$ÿ`ú+Ê~òíIÎÿøØ¢ì¼uè<75><C3A8>3Ú/ªŒUö^ÔÞ½¿BõIlÛHydçû¶þ°_#IºÁ<C2BA>åß¿¹ñÝ_nxoYׯIŠ—:ñ)uÕ~(Ë<>kœk\ØîÜè¼ÊyÈwÈÿ¶ïmÿßÍ·pœ™³8ÍNK̳Ð,Ç1¼FÃÁ àsÊašnâ4#ò¹ý—¸åÒÄUr-çrNgÒÄq·Ë7qãv9Ò¯q˜9·CÃ1”˯°Êåä Õå󱻃
í{ì.q%4GÖæù·ø±ìWòŒ~)<29>ÌÑ¡¡!—³<Tr|2Tõ÷ŠÕr¡`²¶ÎN'ô…ƒÔÖ´C­$\á (ET51<35>ðÅdM ŸÃ<>SÒI»SÙáƒD¤£¸c¶§VÌ"‰fKÎ×<C38E>~ÐîϤ+ÓüFž=“ê“'Ô:—¬)ç 2×cfÕbIä\ÑÑc[ȳoì¡D@ÀM|Êl ú  í“oËrH Ÿ‡<jâêÎq®vot^ä¾nA; ;„ûá~ô€n—áQá<51>ÈÒ^Øž6<-<yRz)ò’R3žF0Œ“qa&‹²ÙÚŸH¦R5<Ïe²ÙÚtZ“«oh¨CneMnã³NÉùa<C3B9>Á-Ä4¢;<êλb r2âJB]ibãc\]m 4±Q^èJ§ÙZ_­2|M*•4¹\nM:7¹\Άº:ebÙ†ºZlʦSN Os«![ãv9•}Ë|]S$l×Õ¦S\³ÝPÏÞ¸<>ëiÔ [€C/È|š¶4á&g¡¹„~ûXpÝjjÈåœ]v9ÊÊŒ;æt¯ì:>øê¬¿fâ¿ZI(PH(êUyFÅD5…ðu'FЋŒÀõE¶¨^l­ºl#C§â™£Ò ”T<E2809D>ÓXUÇSÈ!HÔ ,EÐD+­Ñ Ø;ÃîÆ@;Ïö¦YÅØXªÑWD·æ½õ®wú¿í_p´óØÚþ%TŸ„9cÊ"ùŽWpÇ_ºìz$Iˆ76˜Ü5eÀONK»„M‡%‰5z§—wü¾rÝ8=þ=ô0úŶR²Ö¥¨{¨>ˆAgÔ°¶ÛÕ$o°ÝÁ,Ãr\ÒdwØY†‰Âa1̰œ<C2B0>ŠŠŽé¢#ì<>"ÁLDÝq#`¿Çíe휉u0a1O<…y0¡¿ÉÜô¸ˆûbâ3èo0b˜ƒšÌÑÑ£Žñòxa´ìødvFõõU meÕý³«î_KfT±ìÕ1&OúÇ04¬Ò×Ëã©n²ê&â5½½Z«bhš4OÚßZ;kiåg³¯*ßpmgåèµëæáÂIWB T
èu¯Ä%õ$"Ô°½RWÙ8<C399>‰DØÎ«Ð
tÍk<17>Ð7ñˆkˆ½ ÚV>û3阄™h<0F>µâ<C2B5>ü<EFBFBD>…‡ø‡4êžá^å^˼–}<7D>{/ûNíçÜxÖ°˜MÖÖØ=~r2̨K7j“h kÉE˜tk£†mmÑ´3í…¨ É´×ȵ♚]5¸¦„Aæ;QwW¨ƒìKíîìP ü£å#—CÅOŒ¦B¹xDñ£Ç•?…yêz6ä?<R.¨¶Ê´Ö61¦µ#Gt-™$¤'%`ZIXÃvØìfIð¡hŒÐè TëcÔâ;a² Õl™rB«I¡¾j¾„ó<E2809E>ª ª
<EFBFBD>u28¥3vÛ¤kÌ+'†¤hµh@¸ï¾íÅh¶cS¾{2[BçæÒi>bõ¦²<C2A6>þð…î«‹Û}@¤©¹«…˜ÕxúüE—¢Í¸FJŽœžðÌ,œ;\<§ÿìX§Ë<C2A7>ÑØ&nZ¸çŽK»ÿ¥r~³-ªw×G<C397>Ò@KG Wd€™'ž¥6€"p½\ó…ÑZt§‰,zÇ:<h»HG1覭­ƽܨñuéKË|4¥3ýVd-¡‰jôg¨¨ÌÇ8¨³P dTÓE_ŒG_¨àð´B@ë“<C3AB>GðIȯ JÈkpKPͲM2ÓÜЊr6«±1_MWƒÂ c½$BÕ<¬÷Ìú'ìª?㢛ߨüç{ç¿hFܶúë¶^zýô«É¿†\2M—wd}}éÍÊÏd°¹öØpêç·ÜR^ÜYÁ
2ãD± B ÂCòŒkí÷±ŒoßvüÖø‰<C3B8>iÐtkiÖpkøÕÖÕ¶¹MüÅÖkw0¼`w`»ÃÌð:J—CÌÍfdn÷hDÜ!ú]~©p5¾o*(j+O…UC{2uæöy “W<E2809C>@<>†€NR lª÷~"W/UÝídîLÁäD|ñã鬨 ÕêÁÆõß{ôæU§¥=…¶M;îþ¢_N».Ÿ,dÓÙ›õÐý·ý©+Úo¼¨çª/ÿý§¨Ô È81N<31>B
šá]yíí±‡b¯Å^I~”<š¤amúôµé»Ò<C2BB>$~”~*ñtú'‰Ãé—šÞK¼~«IO$fűÈjÞ!çñÍv£/`Ÿçõøn
ÖÕf3¤<EFBFBD> Eë2¢<32> êISʈês)¦¹5 jBdÆ•íÈ^ÂðD1ßuO ªQXœ¦@KÉ<4B>UÃ÷ tÙ«™\{a“Eh …X²!™— ËKИ¨—PS¼ù <>(H»ÍnTñÄ4ä[ÂEF<45>¬„eRD (Ú ²r&Õðœd9N·Ä"îœÖ䟟Z"4Fº56 }í÷˜¦øŒeÿ{ùÉ ]Ûqéu·ü+±;`<60> Ö4&V­KKéñê¦iÇÚ^<5E>pg§qßnq¥óè¯PþøƒgÄÑ£WœûávbŸgƒ<à…_ÉC«Ù5ÚóMçY¿Ílb/Ön6^fÚlÙl=®ÿÒ ëgÏf—<0F>‡LoŸp¿5°-,ÇÛÇcŽ'h{A 1<> =žå^3sý}Óí:<3A>×^á§<âìú‰w…õ~ßdnÊT8:>‰ÞñÉ•µ<%ÝJž¡
á½(kÄ%YLêZê9”ž<E2809D>Àfôø<C3B4>y|ˆ4Ðê,$Pbj%<25>J [ƒJDª1oW¶<57>¨W”[P<>yŸõfùJþ¹+Vooã¿ùÁ3?ùÃó?*ôè<01>»öñð<C3B0>}úæ·Vj/û%òì{…g¬lœ¿¢v` å—ª„@<40>å|žG,çäã<AKDÂÁ6OäRÙæ0ÞâÈi<C388>Ÿ*ø¼ MKžðb(VM²xƒ&C bš€hFõÏ1T&<26>î²É(Lë<>C8à8%ª-6äê'׳ªô*-C{QÎ:n­é|äÄüw®Í†¼5^£^
ÍrŽý­åòòï=T÷ùøŠÎ{Öþ¬gZ°^Lº¬Þ¾XûxgùÒ$4V:ˆˆ]`†^X‹á yxFGoçµ×t>즨•ç:]<5D>…Î5ÄyMXppíf!ÝL¸HrciÐ^Çõ&D|wZ]]/ÊõúãsãÏljøô¹¹Å®€“Á­ýâÅmÖiÛ¥{%,)ŠY;Håƒé–î¨Í\B?—õÅ} º[Ö¶Ýv¯<76>´)Úap s¸¬lÈŽŽ ‡ß,+AÎ)?ïp±X}ohTÁS¦<©º«b­~
ŠêV˜
(qð4Š*ÊÕt2D0 YÅ©¸@´”k²ª{Ûp5 <35>W Ò)Ýœ#^yöâÞXXÿÝÈü<C388>í,‡6“<36>®|êác§YûÍÚGM¼ñÙ{<7B>íÞ¥=é&„θ­²cï}ûs}Ú´=Ö=òE¤8<rVÄ<z&[ù³|ÁÂN##=Õ&7âè<C3A2>Ë.üy7qZ<71>¿¹~ýóÜYþ€<C3BE>÷fîºç™+g„»»¦iMF,2¸ÂâËn\ú‡¡ÚÞ_À}ê(âcjdá ÙÖmC³#Îî²c+düY,¶yü%tLž „]m_@L´y2qjÑ<6A>‰D\t :š%«¢­V&ñûø°˜QÒ£ðD<C3B0>MdHB™5­ªîùÑ ìIõ­ÆÞ‡ šH6‡d û<>ݱG}h*7§¬©“)uImEmÈ^UãªåsÂH<C382>Táê Óüœ·IcÕ%/w.ÃmµgZ vVeîâºö%snªï¯L÷h¦}‹ØßÔ@à°.Âú˜ò<CB9C>½¡âÕ½VV­y<E28098>GÛü-tËðEëŒóº&­GÑ_1¬§6€"0$K¢ÖЦõDa1p„yv<79>ã&OÀ/HO„½ƒ‡‰„ù¨jg4·PQà}Á H¹¤¦R<C2A6>Ž j¦m¶j[VÕŒðEB(ÖfM'Eº<45>P‡<16>T'ʰ§ý`1™hiI$[Îmâ Y<>µ.±«ÛÃâüpÅE5¶¶¨­ÇŒ|Ã…èývgœÔûõ¯aËuëY<E280BA>º£˜ F  ~.<2E>ö„£Ö«¬X? ÿ=Ì<>) ùà e0{N`Mö+
&KH´<5A>Z`
ÖZ¬µYkÖR[CA«…|U¸ÀçöxhhŒ’§)å­µ¡ •ðŠY­ó.n‰î<E280B0>Ñæ¼‚;<3B>¥6Óм³Ÿ@*xš Šv>r¤\<"¼9t@UÊJhW<68>íªù¾r±íèøñjÀ7“É8Vp%\Ba<>§¤ýNò­Îf5FÔMjÕ0<C395>Ù«×òÕSy/rYK6eö—œÓdhY}ÖT3Ú¹îêOÛwÃöÓ*<2A>¢ÑÃs•Ws¾• ‡©[@|6]ÂØãp; wüÉ£î€Ö®%<¦owãŸJ#­^cÖ¢Û+7tÛõÈ"*š.;Ì”V :Ác„m“ö²YãÑn7I´ëÝÆ;KöMTðãPñ£GÉÁŸ
œü©`iÌ×MA¥f¨CciÑ<07>[Ÿcˆâ™<15>‡+, ~Öᬡé`¸¨µ;mqŽQ1 ë‰aü]ö4:ëØø¡Ï<>Ï-baš0Û?‡h˧:=ñçÐ1<08>Œ”@f“g…ÈfðÌ „ÃÍžX@Ì·y¦ÄÍžÙQ æi<Ú› <0C>3ÜyyFo§œoL…ÝŠÔvÏ1êº[íu­~¿ÝÀÌ™]œ<16>ñó±ÑˆáLúÆÔ)Ü›*¡é²®GnÌgÚo”ß<E2809D>q¯\BÓŸì!ÍÑJåÊÜŒºÞŒr(q¿©J5¡F3f ãB5ñeŸ4”'­»ªßeL£¡¡ÉÜhc¾±á.Wgó"¥°Ûì_·òTý2æoMÝ ÎqÅ¢)«UßÝCQxùöYç´¬3óK—ïlô·Í¯´,Î[#çµË‘ÆÂ•†¥õ–à¹-£©†ÁJÁŘ½153MR¢C×Åë·.éîÚû­ߙyoexzŽuyØÆh×pz~™¯Ài —KÛu%rÜÙ|VgcùýYÍÈ5™q$>"þ rPOʃN×l¾Uÿ€»XP¨óç2Á¶ !Œ¹@ØÓì Ät³§N™Â** éTÄc& &g2Ä[íQ“« øz¦^ŠdêI·§„áÉFS4<53>!RæÆEª*P\jÅ£V¦ãè¸Q (<28>œjˆ¬*hÌáŠ9$rº¢ÎøIE04òUx·!eVþ‰"81(2½ 5OãÌúøg2Äõsv5<76>×ÜUéŸÑ,/šÖj”»+}è=×p:&»$ŒEm<45>Ÿçn^¨<>Îz±ê•Ç÷œ<C2B7>Y4³7”ßè­Åâ߀€ú‰ß/ƒà„ääKÜǾU¸Ãv¯ðˆí ž²<C5BE>´Ûûù…ÕÌ:rN̘r¬Æiírj¨ÆO¸ ] Ò(v±Û5é˜
㧦´“`×E´È <20><>°JÈÈ$03V éÁ!!é<><C3A9>À$°Ð& N&³U½9äB¹:°Z°“jï`1__>ô"<22>¿¼¿ò%l^±óÆuî¼)oCæÊñ_ª¼ƒ\o¡{êOÿpOåðë?|Õ qª=¸´<>ƒò`#×¼ÕyGäáÈýÑ#Ñ/¢,¡¢3#ÄF!VèÔyrï„Ó<E2809E>žºDGÀ¨ªH·VÃTZHÇs)¿QËSØçf[EÆÍàåqM®NOuIj0 ÁMgŒû$(0j¨?5 XmU<00>°ìNÈrÕW LjQb”„È(–€Ž°štÕ?mDÝyÂ÷G_U'ÀeS•¢“€>§ç¼;v¬žyqå…3sœÆlZJ ¨Žº%K·úããMq¹±ãüŠqCç/ö—ž8=YáÊ<C3A1>Ð]3ˆý³˜úQGoí4ýþðË•§ô֦ʾ•iVTýãJñ)± ÈÂÏä~>áJäÄ-ɇÒû҇ӿŸ¦¿L2³“¨‰<C2A8>tz„ܪxlDç°[7mϺ#5Aɤàtð¹,ã`„ÖM0 §£ŒKv#·j¦éºv¤PJ<01>j¦©~p±|俱՘CS¶óÔ&ÔD†1"¬dHè$ÐdtpFÚ‡Ì}R<>@›æ%ĘA4К4áÂ<C3A1>§H¯b%ì6{¾1ï«f`¦d÷d¼ÃibÖâHm¾aë5—ž^/N?Ÿ£(lö.¨x÷ä®ÞüB?9W0»byôÀÜä¼ßß¶û¢Ë¬<C38B>u<EFBFBD>ˆ$5ÇäW”õ
´¹ÛWû»_¿Ž2ІãðnbÄájyÖʇ<C38A>?Ž”5/‡;å¥ <09>m¼Gs“òûˆD8" 2nñš[¼(àÍz±÷¯µ3ñ¿Å…\ s4\5|÷îJ DMæð<C3A6>ªŒ¨©“ÙG<0E><> ·ÃþPEC§ìÅ9aßNoò·“9Ie<49>Ë[ƒÜÅH-4×50„¼QÎɵi¶M<{ÞPÅdkç¡—÷SdÐRÙ¼pßàŠt¼©g¤XiYÔ‰• <0A>°jb¿Bì†Z¨C„Ùp\WЭҮÖmÒlÒ^­åãlÖSû3y%ôÝÇj&§J((B5<0E>óg²Ûtù]È¥´9&[•¶DФž I¢Ž')®ÎÄP¹M<>Á…þèšpaWÛ^Ù(ŠÖ‡JèϲÑu†{ û „¡ꑲÑ~hôMÇÐqáÍ!Sa|ôÀЈ#s"]<¥³«»W?R·¯V·Š·¸>w9Ž~¬nWòÈ“ÛYã<59>  @*ÎúPÀò£|üjèMÅZ͹©$±êB%E<ó£SóÃhMÐíÙÚ·¸®mÝ·7Ü»©á2Ö$ÐÆo µ^Ø3oÛ¿¼µûÆâíz­‰r¡š¶¾eÝŽš9¹ãªÓ×m<C397>ñšÊ 7®XÔ|Fïô wŽÞ3j‰}€À91ާ;!‹åΈÜ!lÁ_ˆ5A~:ÓjÐÈ|P}AáŒÅí<C385><C3AD>IKXÌ~Ïõ²ë½–¡|à°ëe—ð¶ëe´•Gßt9^vµV3 µY¤dUDb2V¬¥”e­AÙæ¬8±­H…æc<>£'ÜrÙê74ŽÖØ×RçènÑQÄ<51>½åý³¢Ý¡ˆÍ×Ó¼º°ŸIЯ±¦ßNê¾T°eš'Þ"$áAyNÓç_Â,ñ¯eÖú71w1wù9¿Î¯Ç^oöè¢ÔìIDK@˜göX¶;=NÉ+ð•ÐíÔP­AMñDùŒ!™Œ¡„áñ4 LDRtB:u"ÇkT÷9Q£õmJ×XøŠ:0…˜$$2„| †±Hùª{?Õð'šJç«_UÖôˆ¡™<C2A1>ÔÔ5IÍ+Ù‘j1GwµG¤âÔY;7_ßâ pWSÿÒųç„l½è<C2BD>Ä=å-]ñY)g‡gg©`YîʃÁÂ…8zçiÑbkËvÌÌs<19>VY"ãÄÄNá~ų̀&jÍkòÖv±°Ø¸Ø>èô­Î1žc_åÝÈm´]äÛÊmµ]í»î@v5±T0Ùì6Önc˜êL†³±”3ÌòVFX†ãlØTBÇŸ˜n÷1"öÐñǧoμ44zÜa7Þ-;Ôÿ%ÅJS“G“9#öÔ=•jÞÜb³»OIéSýeW©é:TªOpš7öê웄<µ‰xåCçx=[y=RãÌ;ý´%$x=åcèÕ`¯9j俟,œSΚõv#~o0`¢ý
wj&>§n vB3bå«$Fʬw!Ø¢9†Õ³ÖÂe¡xh£e«…â(%ó8OäIº®Á•ÍL©¬Ûãö4¸,VõoL¥F/0Õ¹\ÙTj<54>)
†RÙ†:7Ͱ Çªs#±&ÐSFOsT ýMÑÂb«<62>¢ %T­tC<74>,¸²ê2¨Ü PAò„R8(K¨üøô€„¤i™—FF<46>«é·÷%*5R­<52>ªÖÞ®ÆúNewH…çVqm•ÚTýTþKцÜû¥(Q-ª;ëäo±Ü(_/U÷z¥b³NóÄ­'<27>¬8ÞÊ~¦µø·•¿a†ÒâÊ[µ<> ZŸ®<C5B8>;"ë÷â„Å<4B>ÄŒ+jMù*´Çsº=⢽^Jš~ü÷K“8SþwŠ¡IüM Æï'<27>qïHûPåºBkYH‰¤:"ñqLC¼ïw "<22>D`Šã Îz¡qÔ¶•ÜJ=áyÂ{<7B>þ$jêaz ½Ât;ÙØ<C399>”Ñ@ÛYžo°Y­qÚn³Óö¸5ÏqkLŒ[ó |^´L|¼`jø¯n·Ò÷ÓOÐoÓ¤=céŒIÌù|C\´[yš­kFÑìŒÓ ½™:Âåñdk 7Ÿ§y+9Íhœ1Mé;ÍH»kã©¥¶˜yé½—†”YÊŒfÔ¹Sv ·«gåF:ÍP !1”N3 !¡Ìœ:yŠ,£Léä|
'·DLNS5Œ8<15>@§D'ªJ¦:íª©”7Ê|¢w¤†Obš·¶FB¹÷#ˆÍMOW{í~É6vÚwzõþúÊ/ëÿ±¿99“¸ÍƒÌ>ó@ºó´ôLËDx<d&ú—ʺ9iìñ`ì0™Ûy÷²Ð±”<C2B1>7k<19>GjE <0B>¸8Àx”=™x<E284A2>xXýË÷åo-q"†·;b5ñäL®Ë=3¹È½*y5uòöä¾ä/’úÞ$Š&ødBÝ'^09œžã˜ÉDÓ8œÑÏf"Ød%23СH—GŸe²SmYÎ[,ÈRçßkõí¡Âä @[[ù@Û?Š<>²F±Â<C2B1>)I1ŸØ60),têb5¥êMj(<28>¢z ÎæuŸ=CèÂ?2Çã†ÊÁù·^ÐtÖ´”ë[Ó%4YÙÊÕ¡÷ˆÛüˆÕIz¯·ü7¬ax—c¿ŸJÇ<4A>?÷ËšZb9 IÎÅã½33Lþ?m &?
endstream
endobj
58 0 obj
<</Type /FontDescriptor
/FontName /AAAAAA+Times-Roman
/Flags 6
/Ascent 750
/Descent 250
/StemV 108.886719
/CapHeight 661.62109
/ItalicAngle 0
/FontBBox [-203.125 -428.22266 1700.1953 1271.48438]
/FontFile2 57 0 R>>
endobj
59 0 obj
<</Type /Font
/FontDescriptor 58 0 R
/BaseFont /AAAAAA+Times-Roman
/Subtype /CIDFontType2
/CIDToGIDMap /Identity
/CIDSystemInfo <</Registry (Adobe)
/Ordering (Identity)
/Supplement 0>>
/W [0 [722.16797 0 0 250] 36 [722.16797 666.99219 666.99219 722.16797 0 556.15234 722.16797 722.16797 333.00781 389.16016 0 610.83984 889.16016 722.16797 722.16797 556.15234 722.16797 666.99219 556.15234 610.83984 722.16797 722.16797 943.84766 0 722.16797] 68 [443.84766] 70 [443.84766] 72 [443.84766 333.00781] 76 [277.83203] 79 [277.83203 777.83203] 85 [333.00781 389.16016 277.83203] 90 [722.16797]]
/DW 500>>
endobj
60 0 obj
<</Filter /FlateDecode
/Length 291>> stream
xœ]QËjÃ0¼ë+ö˜äGRÆ<>*5øÐŽ´vµ,dåà¿/^9)ô -3ÚÙ]ÍrYŸkkðtÆj<C386>Óxó
ኽ±,IAVD·¸¬ÏÍ<<6A>¬(ø'öf
~†ÍI<C38D>WÜ2þî5zc{Ø\d³e¼¹9÷ƒÚ‚•%hì—¯­{kN²]­ÑæÝE6_³CH 'q5jœ\«Ð·¶GV!D EUUUÉÐêïYT];õÝzÊÎJ(„HEIèщP& í<>TiÕìï Ó<Šž(ä iÓc$cÁüÉŠPvФ$2Ïïh ‡(Ï_bë•|^'ˆ=—o-ö?<S7ïÑÚù´8d,>ÖèF·¨ó ä0Ú
endstream
endobj
4 0 obj
<</Type /Font
/Subtype /Type0
/BaseFont /AAAAAA+Times-Roman
/Encoding /Identity-H
/DescendantFonts [59 0 R]
/ToUnicode 60 0 R>>
endobj
61 0 obj
<</Length1 20688
/Filter /FlateDecode
/Length 8344>> stream
xœí| |SUöÿ÷Þû²5]Ò5i6/M i)¤….DšnV¤@Á[i<>JA<4A>BAQŠ#u<>qÇeFÔGÔQ^1 NÁ<>E@;€"P
n J{ÿ¼—BaÄ?Cq~óó÷ñ„|Ϲ÷|ï;çÝwïyi^ `ØÈçÔWË~P@ùèü¡%Eè/?µ¢:×q0 ^׎¿u¦ø”yÇç@P .¾©zâÔw®z$Ðåª/&VÔTÃ@üå(§Ü~Só-;Ó€ðE€fSÕ„©³øVÈZDô¬ª¬˜°ã<C2B0>kR  UUeEHª® ¥â«¦ÎœWCoTOì/S¦<53>¯¨K¿À6¤ejÅìj5T{b ÞR1µ2º8­7@'ä¦êi53y"ˆKöWϨ¬NØ>´ˆ)ôÀ E0ç`<60>çæ¾‚ ¤`4 T 1P<31>AÞC>æE„š<>×!Ï€ïW~‡Aé¹@Ž(=*ºÄ_*¨äúV­UOÒ#QÖë„ê¥ß¯lŸh€VžCÝyG J¾@Xg¦a<10>ÀO9Šãd™-š9ºlþ/ã¹­¸ Æ¥PA«zL•
<EFBFBD>hŸfÛp Ѫ¨^-PY„Z@}~úÅCóD¸q\4«>èNR5Iƒ[ž<vÕ«ò,Ë+ Œ‘³t&ãéNÀ<0F><14>¨ë´nDR§-œÇQ!<16><><1A>r0“P<E2809C>)ŠbŒF%f “0 ·@D?ôFôEo81C•Þi˜‰ÛQ<C39B>Jd<4A>7ZÄTb"fa
*0Y?y,=1“030 5˜0½þe|בŸƒ'ú úCD1ªP ñG¹ˆÈÃ4Ì@µ‚˜Ù·7Dä`Jg†“0U˜‰šÎ|k”oE%& ·rAÂÿK¯Ãÿû_$æJ_´Wçëï¼>üϽاꕌÿÛ¢}a…ùUº'ôy\õßÎA Ì?¿MŸÇÈŸâþR¯»Pƒ!î¼QÅ9îì<C3AE>def¤÷KKuöí“Ò;9ÉØ«g{B¼-Î*ZbcÌÑQ&cDxXhH°!(0À_ï§ÓjÔ*<2A>Q¤Û rQ²—KÝ6xp²Ü¶Uˆ½â¼ŽrI¬¥Ar$±\¡‰¢tÓ¿0Ý>¦ûD\ÉIb<49>M”6çÛD/3¼Ä&JäÛ<¢Ô¦ØC{©bäÛ<Vkr(˜ªòE‰”Ò [«ê
Êó““H½Þ/ÏWé—œ„z?}ž-OŸœÉh«®'Æ<>D1¨± «žB<1B>œT EÙò ¤H[¾œ<C2BE>Ä
*&HEÃK
ò£­VOrDòÆÛÆI°åJA…‚<%Œ¤Î“4Jq|6¸O¬OZ[w¿×€qåÿ ¶ ¥%«ðÈ1’Ñ–/ï8`êj&'I!y% Ï÷F³ºÓ$QnÖÕ-¥'‡—œïµÊèñ˜’“’“$š0¨¼n<C2BC>䮸prRáH±´ <%YàINå3ÏÊw~•¶¹§|²(él¹¶ªºÉå¢U'aÄíÖ†¨(÷jÞŠ¨±®¸Äf•²£mžŠ|s}êFÜÞé#/ô$'Õ}[ÔiøœoTžó)B—­ÂçfÈÙ†HîrI/JQb“hB† ¨Ÿm•ÅC
¥ ÃK
&Iº¼ò:CÜ/<2F>—T X÷-$Rnk;zaOEg<45>:Áð-dS^'çšD*ÎÚ’Ã!%&ÊKD“'©å3¨´û%'Ýê¥6[µAôRyúPT"
OVŠ)9Éj•/ð}^7Æ%'Y¥Úá%¾¶ˆqÑ p§8<-—=kÏzÂGÉžÚ³žsÃËmÖä¤&å.iíçþ"B ª²$ñÿqWúü…#m…ÃÇ”ˆ<75>s[X|AËçÏ8ç봤мM;-ͯWzŽ,7Jü%!AÔÊ¢žàÕh‡—øzˆ8H2”ö¡ÇÏjý7yùqy”¢º†u¦)e9.l¸ }Azþu¬°Xì´°xL]<5D>ß¾Â<11>‡tª
QBq‰UÌ“0ªDb KðòµòÛKdOqÉ™Eèëêl^@Œî´=<1E>G^<5E>ÉIƒlƒÊëêÙÄAuåu^^;Î&lu«éô<>ºêò³ ÇË×Ü- ºß#Ê«HVrR=En½<6E>,^ï&FŽ)YmÄEÅ% ”мò\<5C><¸äü«§l O2 ZƒHÕD©žE¤`‡ à‡~XÖ“øaÙ/kúX<>É$¼ˆf¼AŽÃ„•X<E280A2>#òñGÌÁ2,„cF@…|,#‘¼ )x
Oa3Œ¸ÄÄ<C384>`°° €8ä Óð¹ÏB)ö
¿A:®Å-¨&µ¼„?ÈâÁ3XÍÞáíÐ#
ã1›ùª<>üc$£¿Ç£ØKÒ½ 7®G-V³?aceáù÷g2°â6l†€¡ØLÖR®=ó3Ï!b"sXžj'ÿ3—øz0˜Q†*<†5¤¹šZU¥|(ߌ$c6jñ(°
«àÅëøˆø«Žó¿ðãˆD†`šðYË:ÚçwdË
`B/db¦áïx[‰<>üƒNSù«œ*·êÞ0ôÅ(\<5C>gÑ„OÉI:—Î¥óØ[ ž‹@,ÀoåÙÆØG¢H
FFÓ^t}‚Í€¾˜€IXŒGð6öYEýéögááuLG+v<Ž?á$€˜ˆHjÈÝd;ù„æÑ±ôqºŸ-žÞ×TÀŒ1àœ$!$ƒ '7<>*2‡,$¿%<25>Íd+9Lsh1½™cUl:{]Èr…B<E28098>ðÕ½ªûÔ‡;J:Öwlë8É<38>ü^ ÇÌÇoñ{<<3C>&¬Æ|ˆ±û‰ŠèI $"±QäNr'™K O“ä9ÒD¶­d?9B¾"ß’ä/¨šFS+<2B>£qÔFgÐÛè2úGº…n¡[éQzŠYs°~ÌÅ<l›Î²¥l){™í¢„-W9UNÕê媪To¨Ž«ý5wk¡ÝtúÏí‰í{:б¨ãᎆŽ&¾áˆD̰À…á¨@&c6Æ3X‰ˆ?1(HkÉp2L&ÓÉlr7¹‡<FžQr‰¼F6“ä  f%çÞ´Í¥Ãè0z#­¤ÓéRúm¢Ûé÷LÃô,ˆ…³Dv5+c•l&»<>=Ì$¶‰ífûÙ vš<76>f\ð,Bœ`ÂÕÂXað„pH8¤*UmTTû©§ªïU{Õ_júkjŠ4Ã5eš%šUšm9Va^Æ+çÎ#­l>+`/ãAš*DÒ÷è{HÆXL`Ci6@W<>Eô.ÒDãU³ÕèrŽ vºŒ¾E—ÓtJ
ÉHL¦}}GS‡ Ïp ëÐ&¼F+é{ìeÌVû“¹ô˜Ú 4 o²>ƒmÄGl/ÑOa—àGŒ¤<C592>>ËŠˆž¼. T•ÀÊþˆ—Øtr€ßÚû‰ƒ\GžÇB'ùŽq0zš<>Î>Áop3݉6܆Eø™ LăH%sp¥O°^ª[Ô‰êpò.<2E>$ÔÑPÒ*<ÐLO˜* ÷<>˜úý³°EðÃö7á5º…¾Ä†
ÇU#H¦â.Ü‹é|>nW•`d4„V,Ãæ¬X†y˜<79>R¤`LX/rØPÌ€ \K&“Qx<14>á1<˜<>IÃõ¸ï¡I]L½˜¨
$•8;F` ÿ+åq ɼ ù±+È‚Ž;Q<>X|ˆ=äZÕ ºE5ˆ'Ó:ú!I¾ðú$<24>˜ð>ÃKª^E<>°#ÍïçÿD8z"<0E>b®Á8ˆÁl-R;®£õ|«Æíª½Οåâ‡*>ÃðžÑ¨P¡q M<C2A0>ÈûX…;QIG𙬲ca JáÆ½˜…ÅX ª|•ü<E280A2>ž°¬ÁV§E¶ö´[…
kåïÕ€j<E282AC>j üÉäUZ]è¼üPcˆ1Mëå‡Ü<E280A1>!Æ4!2ĘÆdÐyùÎF“Uvít0YÓ„ž&kZˆ]è¥MôK ªH•ºJ¿G-¨ÆÔZ<C394>N­Ö©™ÎÏß@GéD?}˜ŸŸ^ÍÔ:æå'Ür/) £”¨ýõjÂ(ˆÞK#Ý:??£Ú@/5¹uþºn¿Z?êç%/»ôzlÄ0º„R*÷èA˜Á@GA>¬>(ˆŽ‚@€ÒÞßäï/Ô´* ð kù
“ÃqÂáp8\†oÊÚ í>õ)²³].—áWpˆ1“„d.ìíphï2¬W-ìmòY ׯ_h\¿¾P2Ž,”ÌÃÇ”4iýuþÂþ ÿ†ddddxúöA)Ë+-qëtq™Ú¸ÈLÁË÷ÔGf:<0E>ã¬XƒI*‰0öO'©$˜hßx”X
ro$æýí¯Ð©lhÇ 9sj•§Ûå¯Ðq•pÞ¢Z§\ÏÁnÕ¸T*
µF%PF q Ë™k,¦a âI¨à¥ñ<C2A5>ÚêLŽë ß” m?Ñnpù^ÈvÚ33ûö í—žÚ/5üª×V¿&œØ¼yófPÌç‡4ͪ`D<yÄ]-FÇ «õñÂñxZ5>–ö‰ìKÅH1Þ®!ªrHO^Q¿¥§KXm ½Y Õ<>d¾&€ÎesjuÁt”ÕË[d#ÐËO»SõÁt0†„…ÆFD„‡Ó S¬? ‰5Qc ÕZbUº¸ä bô“/±ÑË¿i¯°Q¹ÖòU6FÈ—Øèåß5éõç<6A>êQÆ¥ý<C2A5>»·^¯eìc,2RÑXn¤Æ{xqð5}à-B9¨ˆjPDͳ»Ù®óò¯šä°:åXr\<5C> Ñyùá&ƒA-9œìP<C3AC>uD™à%©õ<C2A9>ú¦ÞwÁ‡¶]g(;QVV6ôÁ!™ee)çÖ«ÝuÙmÙ®v—òn ÉLqÚ]Á™Á!™}ûÀáp”ùd:é4­ýÔV±‡=Ø«hìg ·Ëo§¦á†<C3A1>TgH°<48>jšO?½°ãdÇ<07>/"fF´Xvû­ôúöçÚ×wèɧzñŶÃIÉ% {ßz±Ãý·añÝ'wulëØObÈâ$Ñò
ɾ¦cT@#vºK—G®Œ¤Ç4ÇBé^ÍÞPºE³%”6kšCéJÍÊPº\³<”.Ñ, ¥s5sCéÚÂèí”0:F;&ŒúkýÃhX¨VcôÒƒ<05>
d§h`%þ®¸ˆ—¹SB§iæih˜†„f„¹ü]AA<41>ncTZà,¢Éк(<28>±%”ÐHÓôg}sí*oèö—ÏBv™«ÝÕfhSÖ~¡<E280BA>‡ÈÓ
û†wûöÁŒéÓ§“é<EFBFBD>BÊH¸­_Zzÿt£Z­±žg“°ˆ‰7$¥§1²ì¬%¬ßö̽®¢^ƒŒ7\ßeqê}Ô@4x<34>XD»õ”ë1ØA( [C­èE&,€ƒ8úõ“çw?$XUk`FOò<4F>{jP¤%2<>eÅŽfefµ€0$ªâMeP9µ”1b2E¨ÕšÈHUt4¢cDÖQ9:&c¸šªblá!¢É¨¦"££"¹DØTÚ˜è()šÅ<C5A1>>!4dI¤@€H/_ë ¤£"5v³^¯õò£Ê.Ózù‰&y“iåR*¯|­—oWºÖË<C396>4É»Kéw€ÖË?u÷—·š6*Ñä'!(VÞ<56>Aaò<61> h™¤•7N<37>(-A$(²WZú¿î•޳¶¼5Ù.—áDYRœƒC2CŒ™<C592>íà¹iÌÔ]ƒÖ¥u-Ôº´w­×ºä¾zµüs×*<2A>)Êä11”yúö1åÝöÔ$Xƒm1Hð·Å ‡_L ‰3ˆ1$>Ѓž:{ ämGäæÏ'e(#©Æt£Áa°Åõ°÷3 Õa´Û{¨z¤ÛIšÝ§Huö'iî·=ùoÄÝñÙ¾¤ŒÐ7²Jrãû§u´%« ë_¾çîçWþ¦¶Qµ¦ŸnÙ±´cv{Ç®7æí&*b6Ù† 0oâÔ1§Ÿ^»qã¶7ÖoY<6F>bÖ³Ñn²l}<7D>õB+ëÊz58b,«YÓ0Àâö2[cH¸3('™‰ HQPd"¦1+™ˆf&?7ËbA``±˜ÇbQËb±Å¢™Åb+‹•×,U¼"Å4‹å,­²‡Å0sƒh1äô`‘˜Ç"AÄŒ8ÆŒàÌ 3"…1±„±œ¡VxrÏ´3ÜÿffÄqÅãfƆ‡RÝ^fl¸OQ<4F>“§8•f…¯YZ¦4¯÷øôÐá><3E>?ÄGËòÑú¦ùº{çút<C3BA>IpÖÊÚ/À¹6'E`+E5¡ëD,x…Cbá LÝÙãf!<21>ñvçòf&€0ùÆ:¾–‘†€`gŽåôB`¡_Ð6Ÿ‡¶5;—ç\C÷c%Ý<>Œî§ûé>ºóh«<ç´Ù´ËÏèfÚŠ-´Çh+Ô´•¶Ò½t/ÝC÷ ˆîF
Ý<EFBFBD>cén,?c7ÓÝ8FwCCwÓÝ0Ð<30>åï<C3A5>”ílú1(ý˜~ ÝBwÑ]¢<1F>Ð<EFBFBD>èG|-ý !=Ó¹Z1)<29>†%¡Ó0Fw!N/}¿áT/ËjfgfyE½Êâ0©,®!¡¯ÅËL ®I/ý¤QtXžÌéC[ Ñù‰1m<31><6D>¶@¤-(¢-(§-¨¦-P£œnG5ÝŽZºKév<I·C¢ÛåUv¦Çp¦G¤ ÒMÏxúÐípÓí(¢Û¡¥[D‡ÅK·4Øs-9ô=ú6Œ°ÐÍôEo¢o)z#}SÑïÒ7 Ý@ßjˆµ GOßèÛ0з` o#…¾ ýGc|ˆ…çÓfXh3Rh3²i3†ÑfŒ¥ÍXB¡¦Í4®a%$GO_Å-`¡ 8¢è¿âi-Ü“-n{Þ§[”Ážu•Ó-f]å\..·S·ýáG<C3A1>nQûƒ9Ý¢ ö{îwºEìwÌwºEìSnuºEì&;Ý¢ ö1c<31>nQû°b§[VìôÒ'^‰ïaIv3sèmèCoƒÞ†"zzüÂ)AÎíñ†ÄD—>ævôJ´Ô®!µ¯‘Ú¤öiR[IjçÚù¤ÖEjo$µRk&µ±¤ÖMj_%gS-q7]ÐÌtRû"©­!µvR@jãI­HÒÝ^jm’ª¨E5æÈŽZ¯è Ê ¢VdS+æQ+š©´¸ÒrSk£ç#GÆÊ:®11Û×î<C397>åœ3˜®Ã<ºKè:ì¥ë …®C9]‡-TþÐD×!ûŒo,]‡µtŽ<>ásºjì¥q X¢`<10>C
<EFBFBD>C6<EFBFBD>ÃX‡y4ÇhÔJ:ǨÓ:S\©$Ò™ô0¹E×ÑuÊ—VjuÇ̇a0[b&A±dX,<2C>¥éˆˆ¬ ö€U'¾;]ŽŽ>H— º´S/i8Gì¯ZrÂÉ+XH&ì$<>¥Ýf­¬Ó`¦/ÀBœ æÑ/ j°'YÖ<59>@yÔ*Ë)ó˳—UÃæW-;D¯@,ÿ4{é «,-æÅwS¼ZÒ`yÍî%¤Á²FT¨«Í7(Ôùv/y¬Á2WV«,w™¯¶ÜlV•>Ç<>5^<5E>¸ƒ,#ìc,ƒÍ‹-ùæqw<>WKVY²Í7Z\>V?yÌ*Kó«‡ÏL4<4C>¶ô2+Am±ÊG¥{I•;Ió°¦D3LÓ_ãÔ$i¬&F­ Ó†h Ú@­¿ÖO«Õªµj¡ óòV·Cþ)4L­üBZ<E280B9>QPl•‘ú~õ…-Å5<C385>BY!-™K
¥µãQ8N”NŒ´y‰ßð1Ê<EFBFBD>BçJŽB¯†<C2AF><E280A0>Ò¦è†zBôH‰.ò—x —»DËÏmVƒ<56>àD˺ç<˜"nÍ6e‡ Δ(ïDG—˜.°c¤‡ GHÏÇx$§lðO¡ô;ùÁÎjò9^<5E>¿š|)+OÉj6<6A>|U0Bîgó=žB/­ð / òWÃ.+OÉjm,D™Qëã=æã%<25>¯d^¼¬<%«u:$(¼<04>Ná DæÕ×Ää×ÇÇ+£ˆ…ScÏçlH(ȯOHP8µØ p6DÔÊi B1 òëcÍ
…DÁ¬PÌ$J¡Œî¢¤tRŸ£,V"1ÒÅ1û8­g9­ù<1E>ãß•Ê\‡ƒ4ðŒ/•Š•Û
*ËmåÒ}·V™¤Úq¢X?ÞÓù´Ì^>n|•¬+*%<25>­2_ë”^Ä]*»ØòëQZP\R_ê®ÌoàP`«È÷4^]”–~A¬Åçb¥]ä`EòÁÒäXW§_Ä<5F>.»¯c¥Ë±ÒåXW»¯VbAYãE%õZäzòJ}ºêýBòJÊ£­žÜCõ@eñ°šæF¯@V@ïðHþ¶\)À«¸ssd—Å(?ùìt™æ°F¯!+:]lË…c欚Y0LÊ÷ý«©©©™9«fæ,yÂ}è¨ù)q8’»"¿f&P(%Ž,”²‡<C2B2>×h
$w¹|JRÖÙ>½¾ÀË×ú:{<7B>,”²äNÆÎå>—ܧÓu|ýguê<yÔÒW‰;ÌD<C38C>‡I±…ÅT
),î|Ä´Ë•ÛC<C39B>Ž™5ÄAjΣ3m‡¾6äs>ûž9«Óêœ<E280B9>Ú7ÒGÍÙ)9'òd9ÎÍØL‡Cù2<C3B9><32>YTŒJLª£úµøNË¡…w@o‡ü”g)zÞøóv €·#PÁ òvÄÛŒ ~!æ§Š~aå§ŽPþ"Æ€áü˜οG$ŒüD!<E28099>hDñïaV0Ñü{ÄÂÌOÁ¢ ˆ~
VXø)ÄAä§`ƒÈ¿C<¬ü;$ Ž;âøIô€<C3B4>ŸDOÄó“è;?‰DèÁO =ù $+؉üRàà'ÐÉüú"™ 'zóoŠþ-ÒЇƒ~
öG_þ ÒÊ¿AÒø×ÈT0 ýø×   ýù׸
éük DÿÙÈä_Á<5F>r0€…\¸øWȃ‰|\Å¿Dò/1Ùü8®†Ç`äðã\~×(Xˆ<~×ÇP âÇp<C387>Ãp5?†" æÇ0¡àH\ÿ@1
yFa(oÃh¯Çu¼ %Æ<>ƒ"~cPÄÛp†ó£(ÅH~e(æGq£c1ŠŽrŒæŸ£×óÏ1×óÏ0þ&` ÿ ¸<E280A2><50>U(ãG0 7òØŒr~7+8ü¦b?Œ[0žÆ4«1<C2AB>ÂtTòC˜<43>‰üjœ‰*þ)faÿ·b2ÿ·a2?ˆÙ¸™Äí˜ÊâÜÂâNç`?ˆ»PÍb.¦ó˜§`-jøÌÇL~wc—ŸÜÊ?Á=
.Àm|?îÅl¾ q;ß<>E¸ƒïÇbÜÉ÷¡sø>܇»ø~Ü<>»ø><€¹|Ä<¾K0ŸïÃRÌç­ø-îæ­x¿á­øîá{±LÁßc߇±<E280A1>ïŰˆ·â,â{ñ(ó½x u|Ç}|þˆûùüIÁ'ð ߃åXÂ÷àI,å{ðòÝx¿å»ñg<Äwã/øß<>g°ŒŒ¿â÷|žÅÃ||žSðy<Âwá<ÊwáoxœïÂ
¾„?ò]X‰?ñ]<5D>ðß…z<Á?Bó<E28093>Ј'ùGhÂÓüC¼Œ?ó<>X¥à+ø ß /žá;±å;±FÁW±ïÄkxŽïÀëxžïÀß |Öâo|þ<>ù¼<>—ø¬ÃJ¾ë!ñíxõüŸxKÁ·ÑÀÿ‰wÐÈ[ð.šx 6àeÞ<C39E>XÅ[° ¯ðl†—·à=¬æ-Ø¢àV¬á-؆×x ÞÇëü|€×ùûhÁßùûø'šùûØŽµ|v(¸oðmøëø6|„õ|v)ø1ÞäÛ°oñm؃·ùVìU°ïò-؇ | öc#ßO<€M| b3ßßCØÊßÃa<05>`Ÿá}¾Ÿã¾GlC ߌ/°<>oÂ1ìàp\Á/±“oÂWø<57>×øˆoÂ7
~<>ùFœÀn¾'±‡oÄwØÃ7àöò ø­|~À>¾§lÇ'ü]tàù»¿Öôÿ<C3B4>šþå/¼¦þo×ô#?QÓ<51>ü¨¦þ‰š~èG5ýÓ£¦8WÓg\PÓ?ù‰šþ‰RÓ?ùQM߯ÔôýçÕôýJM߯ÔôýçÕô}?ªé­JMoUjzë/°¦ø_ªé-¿Öô_kú/®¦ÿÒ?§ÿrkúO}Nÿµ¦ÿZÓ/^Óßù?PÓ!ÿž-ŽêõÚ+øk<C3B8>+{q.EÐw./ºþþºnç%ÿÉåÏ-—<Wÿ.ÒåE× À¯ÛyÉûsË%Ï5 tyÑ5
Òw;¯ÿĹª.Eê"]^t- ÁþÝÎë¿r®ÁÝ=W‚ƒº<>—¯Pü¼rÉ?¨ î"]^tBC»<>—¯Pü¼rÉs í*J—]<5D>ðpC·ó®dž..—¬­á]¤Ë‹î“)¤ÛyW2O—KÞ3M]¤Ë‹€èè°nç\É<]\.Yo¢»H—=11ÝÎË·y~^¹äÝ>¦tyÑ ES·óòmžŸW.Y[Å.ÒåE<0F>ÕÙí¼þ+çjíþ¹&$˜»<CB9C>`¼‚±—KÞGºH—=‰‰b·ó®dž..—¼<E28094>$v./º½{Ûº<C39B>{c/.A—"ôî"]^ô(8<>önçåÛ<?¯_Šàì"]^t3ú÷ïÕí¼€+Y—KÞ3ûw./z,²²º<E28099>p%kâârÉ{fVéò¢ÈËsv;/ ù
Æ^\.ùÉ&¯tyÑPX˜Ñí¼€¾W0öârÉ»}aéò¢'bäÈ<C3A4>ÝÎË·y~^¹ä}ddéò¢÷FiiA·óÂà¿Ö±\ŠPÚEº¼è©˜0¡°Ûy¹W0öârÉûÈ„.ÒåEÏÀÿ‡>
endstream
endobj
62 0 obj
<</Type /FontDescriptor
/FontName /BAAAAA+ArialMT
/Flags 12
/Ascent 905.27344
/Descent 211.91406
/StemV 87.890625
/CapHeight 716.30859
/ItalicAngle 0
/FontBBox [-664.55078 -324.70703 2000 1005.85938]
/FontFile2 61 0 R>>
endobj
63 0 obj
<</Type /Font
/FontDescriptor 62 0 R
/BaseFont /BAAAAA+ArialMT
/Subtype /CIDFontType2
/CIDToGIDMap /Identity
/CIDSystemInfo <</Registry (Adobe)
/Ordering (Identity)
/Supplement 0>>
/W [175 [1000 0 0 0 333.00781] 186 [666.99219] 232 [556.15234]]
/DW 750>>
endobj
64 0 obj
<</Filter /FlateDecode
/Length 254>> stream
xœ]<5D>MjÃ0…÷:Å,“E<E2809C>ì¶4 #p”
¼èusY»Z²¼ðí<E280B9>B3ð1óf<1E>ŠîÜ9€~D¯{L0Zg".~<7E>aÀÉ:RÕ`¬N7*]Ï**ºs¿- çÎ<C3A7>ž4 ýÄÉ.)n°k<C2B0>pOè{4­`wýžÐ~ ágt á Ž„ŠWÞÔŒ@‹ìÐtɦípý߯×êÂÕÕ<C395>ö 4Få&$ cŒqh¤”tæßüñª­bÞn%‡†UO5ÏtzàÐÔ¬WjËìùXè嘉IVîÞ.ä9‰»}½Æˆ.•¸ŠålÖ:¼'|Ȫ\¿i]wÑ
endstream
endobj
6 0 obj
<</Type /Font
/Subtype /Type0
/BaseFont /BAAAAA+ArialMT
/Encoding /Identity-H
/DescendantFonts [63 0 R]
/ToUnicode 64 0 R>>
endobj
65 0 obj
<</Length1 5040
/Filter /FlateDecode
/Length 3289>> stream
xœ½W pTUþÎ}¯’ð’¢B|¯}$$¤;ÿ„ðÝÒü„$@7XÐMH"‘¿È‚#<18>¡<><C2A1><EFBFBD><19>¢£ã¸Ëº¼4<C2BC>zDF™evÔjvYf™A<E284A2>ajÄYgGpV$o¹·3(SÔµµµ·«ÏwÏùÎ=çÜsow¿ÈD$Äf×F~·äz)@Ÿˆ5´ÅW"sÚÀ×°¶]{¶eòx@
ò½KW.këlßá\<5C>€c˲åë—fÖ·ç¬@kscÛº4ÇO¸~Àæ¦xã&üË*€,âÙ7Ò‡Ô `hs[û:×ixü€gùІ8ZÑ
à
€ô¶øº•î°ë@nÚCñ¶&ªq$*äúÊkÚíf44Mè«VþáŸ6žú]œoÝ÷‚#•G ÆUpb/ÒÀà<C380>×ïœoA,¡?$<24>ÌÙLµhÂ2<Œåˆc5¤T,»‰ç¿Ã À‰^ÊO{c½1åóëC°¥rk¶<6B>ö‡}ëúVßÿ䣳ʯR¶[è/MZ(ð½üݽ±/÷(Ϥû¤ÝÊ&ÉGiüLXâf¦í)¤ ¨aý¹ƒãVKn¯påúÕk`@ƒÚGºOjÓ@ûg ½èóúÄJ/àxÚ¦v3šîpZ4ÏÙ5]BºCž.IlpšÓ5<C393><30>ö±·ª6§¸xÖgå3o”Ïò\+Ÿé¹QŽÉå7Ê=Ÿ•ß(QZíÍ–íÍö:ÖZ׿p„¿8lI¿þ2_å¹y¯ÜiN§¨8ÝåÝËp»öëC%=]`fF†èrVzúõ˜­(ûstwef
<1C>•%ðî>¼Çãᇈ<E280A1>ÙÙsúÐÑæFŽô4îìûÀþ}ï€s½¯Ûÿ*Ý  ¿Yïär`6`$lÀ{<18><>(ćT Ý8ƒ÷1 p
Õ8@÷#<23>Y<18>6š„¡ôKŒAÏãb=Và ªð=xÑ<78>£öˆ18 ×<>†<LB °?°Oáüíߣ `á¬ýï ÛÁ0ù¡+ÉÏÚí'Q<>Y؇£x<C2A3>î±+p7F¡A,C3Úð¾ƒ}xgqކð£“P…ù؆=x='§ÙÍv+æaZцÝ8…3¸Œ?R6½A§í!v·mƒAÇ8L|'žÃ‹ø!ß Nã4.⪣ù’.<2E>²{¤}ݶ‘…!0ÆhCÅ&ìÃOñ6ÞÆû¤R!<21>¡¹´:(A§Ùé.Ùå˜e?Áo
0 “0a ¶ažÂóx¯á5¼…Ƈ”F:«dì3)[2ä9޵öcöAû„ý Hp ãF3ÐŽuØ­Ø<C2AD>Ý87ñ+¼<>Oqƒ\ä¡<C3A4>¤R7] <>X6+bìçÒ
)!”!wÊŽ'{_é½h/³Ÿ²ß¶ÿ òQˆ±q<18>ɘƒ:Dшf<(îÇp]èÁœÅy\À ôÒ½4†ÆÒZ@<40>ÐKtŠÞ¡Ïc¦²"VÄždûÙ~v½ÃÎJƒ¥<©P!-öJû¥Wå=ŽFÇ*Ç÷<>][zz{×ö>Ú{ÜÛOÛoŸ„ ^Š3<C5A0>†é˜<C3A9>9¨Ç<,Å#¢× ~—p‡p‡q=8†ãxgð[|†kø7(Mô!‡T*¥ñTN4…¦R<C2A6>¦S˜fS=Í¥ù¡8µÒÚHß¡Nê¤çèEz‰º©½Mgè<1C>£t…®ÐçÌÁ\,‡é¬€,ÌÂl>Ïâ¬<C3A2>ÖÆv°ìv<>u3KT!UIq).™ÒIé¬tNz_ú/y°Ü.Kþ‰üŽ|^¾(ÿ§|Íáq”:æ:æ9sœã<C593>k<EFBFBD>/;¹t½æ:<3A>$Îâpì¶ïå¬g{ÙØÈîÇ÷ð3€ýœMÃyl Cô2üø:1
£ðü ŒÀ¤#O Ã10†äÕïójê½yCrÊxÏÝîêŸíÉÊTúe¤§¹]N‡,1/¤WÅ4³ fÊú´i~®ëqÍ,ˆÍ¸fVÝîcj1á¦ÝîiÄ5sé_y)Oã'y´r”û}ZH×ÌwƒºfÑ9]3wõ¨f~"æ3Å|—˜+A=êõú}šÊij&Å´<C385>Yµ¶9Šý>ê1ø¯ƒß‡À@lbj|Csމ©Ü#dÖƒ!s<>œ”Š7š5s"¡`®×õûLšÚ /1¡O1³Šûóuš)å×Fô¨×ïkáõc[¿F½qe`IŒÏâDL)5YŒçÈ.6êAsà#å|¥þeÚþ5ÒdùUñ¦D•iĶMK©1®Å·OóûÂuÚ“mŠFLÚM!jOí¢IqK¬U3Óô)zs¢5×LÔFƒ<E28099>Á!=Œš¨‰$ƒ„â÷õälœèÍðûzü•þJ޽9SxùÛ)û/Of¿Sdø}áÚ[}!žIŸn1SkIt“å<E2809C>ã¢i ãr½|DÉï µ˜iSc Ï¿<>LG¾G×WaRLÿäÊíxŸÅ™ï¹
>åÇyëF˜ï›[æ [H«‰t}7j½ÉB0¯i<>/ò[(äס%hRÌo¡Èg¡p¸×oa¸O«2¥ü*~nZBKLoLhUZs¼Ñ”óÖFô¦D4 ™¨´h&ê#^ÓˆæÞš6E£üŠyYÄIDµ*­µ/B«ˆ<C2AB>ˆnø-ø|aÍ”
j"s"fG0×4Ñ\¯W ™'k"æÉ`®7õ[ðߪTÓBZrúj.ñYð÷[¤¢ÔEÌŽ\Óˆ&)M÷š'‰Üÿ¤tð×£Ï`A<04>òCªC÷ærƒîÕ½Ñ\o4è·Pê ×ýåx-ŒøŸ;<òë.óY):<êÿ¨Ã£¿I‡Ç|£<0E>½s‡Çù,Œåÿÿ×á ·w¸ØÂ°b#+íõ”UO“ÏÑþz2*º<42>š<EFBFBD>!A×<41> nÚå¢]Nú´r6ãÏãÿÁ$N2º¹È$&#¼ÁÜ<C381>p<EFBFBD>27ö3þæ³ÇðãèÆNìd Ì<><C38C>Ì V0`cXÁXÁÜ<C381>±˜1Ô0 EÄÙŒ<C399>g<EFBFBD>-´RÆ0™É(Zàf¶šÊÜIrGé#šIµ‡³Ô7WeªÇ)L3±*<2A>Hnž­ž W <41>B>adjÊ{šr^SvjÊcšr¶¡
-’ŒÌåW5ÊÔer<65>2¡F9FQ…$c@¡òz¡b*?.T-TÖ*þBå
ýXÈïZµòyµò³je_µ²©Zy¤ZYZ­x«•%C”¡C”Ü!ŠE<1B>díÎÚ•…46vïRvïR,ºzhD@­´èO‡ËÔbßÕ¢­ÉzŸjÑ·“õÔÊ»éqÉ•:PÄ8>Š ÀõT*p
þo<EFBFBD>"Õ¢5ÉŠçUV%+.ªÇéA”²5YvQµh\²~Z™Fe}1G"èæèOVìQ-žô½«VfÓ0”P>TŠ2Aë(î÷õ¡3Y_ Zäè®÷©vE”T{·XŒŽ¨×µêµK¦¤zµÄrSRýmÅ 0ª¿,Rÿ­¢Z=U_ ¾UQ}#°\=ê þ6xœGÇ«TJÏê<>{Ô—Vú…2oo½€§Š,™Ž¨[ë Ô5%ÍKª«Ëx† õÁÀrµÕVJ,zÆÈRK|cÕºÀ1uN`µ:;•izPÀ´ÀQ±<51>?JežZÈS'U¼«N êx¾<©ŽJ%Y"¶7¢b†Z\bÉòuxýõ¾2áWç.s-vÍu<C38D>u<EFBFBD>v•º
\ù®{]y®îþn<C3BE>;ÓÝÏ<C39D>îv»<76>nÙÍÜp°ìŒbþgs€ÓÃÁ)s)¹‡qÉRÿE¹ªÁ¿MÚqÏÚÉ9“ûWd<57>¯
ÞAÄúdñ<EFBFBD>Fž¹7\1ÿ./jŽä;/6GóúºL…‚=t‰C4ÒC^ºªvo0Í 3j"]
µXt9Ô7 N^¢K!Óˆ£Ñ°9OÄA]
{PÏ!éacPÄã ˆ<C2A0>n[SnºÌÝ‚¸ÛE„[€]nïr·®-E¡`WQpq”`pÙâ(á.£T奄‚]<5D>€ðJ7©TÔ]šnŠ@y"PYY(ØUQÆ]ºF…j#]e#øŠö¥èÚ]+è…_Ñ%)ú…ýB0½c<C2BD>ÿ£iÊ7ó;´ðÙÇ;ù“WL5ÅôPÌܶöæÃeÇMëzüÙ¾G²Ø†fŽñ&óY½)h>®µ®…<C2AE>w ;9½Pv¡3Téê4šÉ…ÆBñÀvhóŽU¡Ûrm½•kÕŽ;ÛÁƒ­â¹6‡î@‡8½™ç
ñ\!žk³±Yäâ{ µÔMYs‡ÑþðÃÖ¬Y„ÿ¨Ûý
endstream
endobj
66 0 obj
<</Type /FontDescriptor
/FontName /AAAAAA+Times-Roman
/Flags 6
/Ascent 750
/Descent 250
/StemV 108.886719
/CapHeight 661.62109
/ItalicAngle 0
/FontBBox [-203.125 -428.22266 1700.1953 1271.48438]
/FontFile2 65 0 R>>
endobj
67 0 obj
<</Type /Font
/FontDescriptor 66 0 R
/BaseFont /AAAAAA+Times-Roman
/Subtype /CIDFontType2
/CIDToGIDMap /Identity
/CIDSystemInfo <</Registry (Adobe)
/Ordering (Identity)
/Supplement 0>>
/W [0 [722.16797]]
/DW 250>>
endobj
68 0 obj
<</Filter /FlateDecode
/Length 228>> stream
xœ]<5D>MjÄ0 …÷>…3Ážtk %CÀþPwàØJjhdã8Ü¾Ø SèBIÇ{}Ó
ð÷<1C>ÁS Ÿq<C5B8>[v<>ص\9¦ÖÝbã½¾™}-¸hš"“€àÖw8=û8â™ñ·ì1šátïÍ™q³¥ô<C2A5> RÁ”<02>ãýM¯vAà »h<C2BB>TBÙ/÷Þü)>÷„еùúëÆE<C386>³¥Br†A1$ÿï~Pãä¾lnê'RˆN4õ±¯\ýïaÊm9#•B3R-ÂGN)¦JÕú@co9
endstream
endobj
7 0 obj
<</Type /Font
/Subtype /Type0
/BaseFont /AAAAAA+Times-Roman
/Encoding /Identity-H
/DescendantFonts [67 0 R]
/ToUnicode 68 0 R>>
endobj
xref
0 69
0000000000 65535 f
0000000015 00000 n
0000012891 00000 n
0000000321 00000 n
0000030905 00000 n
0000000358 00000 n
0000040311 00000 n
0000044585 00000 n
0000000434 00000 n
0000000593 00000 n
0000000784 00000 n
0000000977 00000 n
0000001163 00000 n
0000001355 00000 n
0000001544 00000 n
0000001709 00000 n
0000001893 00000 n
0000002081 00000 n
0000002269 00000 n
0000002459 00000 n
0000002650 00000 n
0000002838 00000 n
0000003027 00000 n
0000003218 00000 n
0000003410 00000 n
0000003598 00000 n
0000003789 00000 n
0000003983 00000 n
0000004174 00000 n
0000004363 00000 n
0000004554 00000 n
0000004748 00000 n
0000004936 00000 n
0000005124 00000 n
0000005320 00000 n
0000005512 00000 n
0000005708 00000 n
0000005892 00000 n
0000006073 00000 n
0000006253 00000 n
0000006433 00000 n
0000006624 00000 n
0000006814 00000 n
0000007008 00000 n
0000007203 00000 n
0000007395 00000 n
0000007584 00000 n
0000007777 00000 n
0000007966 00000 n
0000008152 00000 n
0000008342 00000 n
0000008509 00000 n
0000008677 00000 n
0000008844 00000 n
0000009010 00000 n
0000013479 00000 n
0000013535 00000 n
0000013654 00000 n
0000029698 00000 n
0000029929 00000 n
0000030543 00000 n
0000031048 00000 n
0000039479 00000 n
0000039715 00000 n
0000039986 00000 n
0000040450 00000 n
0000043825 00000 n
0000044056 00000 n
0000044286 00000 n
trailer
<</Size 69
/Root 56 0 R
/Info 1 0 R>>
startxref
44728
%%EOF

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

View File

@ -5,9 +5,9 @@
<meta name="viewport" content="width=device-width, initial-scale=1.0"> <meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta name="description" content="Colin Knapp - Business Development Resume: Revenue growth, client relations, and entrepreneurship experience."> <meta name="description" content="Colin Knapp - Business Development Resume: Revenue growth, client relations, and entrepreneurship experience.">
<title>Business Development - Colin Knapp Resume</title> <title>Business Development - Colin Knapp Resume</title>
<link rel="stylesheet" href="../styles.css" integrity="sha256-mjzh8Lh0zDbg3xduiLiH6jR4dfkgwJKGGoF2jAOY/AI="> <link rel="stylesheet" href="../styles.css" integrity="sha256-nsutlmVxvyIyABk8i0fzVyO+ram8rkuTntoETIGcou8=">
<script src="../theme.js" integrity="sha256-+dDNTo7WAOmn2YC875+vn9oH4UkMwlVOGlARp2uq3A4="></script> <script src="../theme.js" integrity="sha256-+dDNTo7WAOmn2YC875+vn9oH4UkMwlVOGlARp2uq3A4="></script>
<script src="../includes.js" integrity="sha256-0VPPSi+jVc1DuyZaSYTq+fnpIfv7ft+ZDenYE6pDPqA="></script> <script src="../includes.js" integrity="sha256-CJbyPP0VWE+XrarLtjHMffGrI2GlTXXAXOce+NE+aQg="></script>
</head> </head>
<body> <body>
<!-- Header Include --> <!-- Header Include -->

View File

@ -5,9 +5,9 @@
<meta name="viewport" content="width=device-width, initial-scale=1.0"> <meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta name="description" content="Colin Knapp - DevSecOps Resume: Infrastructure, security automation, and compliance expertise."> <meta name="description" content="Colin Knapp - DevSecOps Resume: Infrastructure, security automation, and compliance expertise.">
<title>DevSecOps - Colin Knapp Resume</title> <title>DevSecOps - Colin Knapp Resume</title>
<link rel="stylesheet" href="../styles.css" integrity="sha256-mjzh8Lh0zDbg3xduiLiH6jR4dfkgwJKGGoF2jAOY/AI="> <link rel="stylesheet" href="../styles.css" integrity="sha256-nsutlmVxvyIyABk8i0fzVyO+ram8rkuTntoETIGcou8=">
<script src="../theme.js" integrity="sha256-+dDNTo7WAOmn2YC875+vn9oH4UkMwlVOGlARp2uq3A4="></script> <script src="../theme.js" integrity="sha256-+dDNTo7WAOmn2YC875+vn9oH4UkMwlVOGlARp2uq3A4="></script>
<script src="../includes.js" integrity="sha256-0VPPSi+jVc1DuyZaSYTq+fnpIfv7ft+ZDenYE6pDPqA="></script> <script src="../includes.js" integrity="sha256-CJbyPP0VWE+XrarLtjHMffGrI2GlTXXAXOce+NE+aQg="></script>
</head> </head>
<body> <body>
<!-- Header Include --> <!-- Header Include -->

View File

@ -5,9 +5,9 @@
<meta name="viewport" content="width=device-width, initial-scale=1.0"> <meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta name="description" content="DevSecOps consultant and cybersecurity expert. Led teams of 45+, built open-source tools with 10M+ downloads, and architected resilient infrastructure for government and healthcare clients."> <meta name="description" content="DevSecOps consultant and cybersecurity expert. Led teams of 45+, built open-source tools with 10M+ downloads, and architected resilient infrastructure for government and healthcare clients.">
<title>Full Portfolio - Colin Knapp Resume</title> <title>Full Portfolio - Colin Knapp Resume</title>
<link rel="stylesheet" href="../styles.css" integrity="sha256-mjzh8Lh0zDbg3xduiLiH6jR4dfkgwJKGGoF2jAOY/AI="> <link rel="stylesheet" href="../styles.css" integrity="sha256-nsutlmVxvyIyABk8i0fzVyO+ram8rkuTntoETIGcou8=">
<script src="../theme.js" integrity="sha256-+dDNTo7WAOmn2YC875+vn9oH4UkMwlVOGlARp2uq3A4="></script> <script src="../theme.js" integrity="sha256-+dDNTo7WAOmn2YC875+vn9oH4UkMwlVOGlARp2uq3A4="></script>
<script src="../includes.js" integrity="sha256-0VPPSi+jVc1DuyZaSYTq+fnpIfv7ft+ZDenYE6pDPqA="></script> <script src="../includes.js" integrity="sha256-CJbyPP0VWE+XrarLtjHMffGrI2GlTXXAXOce+NE+aQg="></script>
</head> </head>
<body> <body>
<!-- Header Include --> <!-- Header Include -->

View File

@ -5,9 +5,9 @@
<meta name="viewport" content="width=device-width, initial-scale=1.0"> <meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta name="description" content="Colin Knapp - Team Leadership Resume: Management, mentorship, and distributed team coordination experience."> <meta name="description" content="Colin Knapp - Team Leadership Resume: Management, mentorship, and distributed team coordination experience.">
<title>Team Leadership - Colin Knapp Resume</title> <title>Team Leadership - Colin Knapp Resume</title>
<link rel="stylesheet" href="../styles.css" integrity="sha256-mjzh8Lh0zDbg3xduiLiH6jR4dfkgwJKGGoF2jAOY/AI="> <link rel="stylesheet" href="../styles.css" integrity="sha256-nsutlmVxvyIyABk8i0fzVyO+ram8rkuTntoETIGcou8=">
<script src="../theme.js" integrity="sha256-+dDNTo7WAOmn2YC875+vn9oH4UkMwlVOGlARp2uq3A4="></script> <script src="../theme.js" integrity="sha256-+dDNTo7WAOmn2YC875+vn9oH4UkMwlVOGlARp2uq3A4="></script>
<script src="../includes.js" integrity="sha256-0VPPSi+jVc1DuyZaSYTq+fnpIfv7ft+ZDenYE6pDPqA="></script> <script src="../includes.js" integrity="sha256-CJbyPP0VWE+XrarLtjHMffGrI2GlTXXAXOce+NE+aQg="></script>
</head> </head>
<body> <body>
<!-- Header Include --> <!-- Header Include -->

View File

@ -5,9 +5,9 @@
<meta name="viewport" content="width=device-width, initial-scale=1.0"> <meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta name="description" content="Colin Knapp - Tool Building Resume: Open source development, CI/CD, and custom software solutions."> <meta name="description" content="Colin Knapp - Tool Building Resume: Open source development, CI/CD, and custom software solutions.">
<title>Tool Building - Colin Knapp Resume</title> <title>Tool Building - Colin Knapp Resume</title>
<link rel="stylesheet" href="../styles.css" integrity="sha256-mjzh8Lh0zDbg3xduiLiH6jR4dfkgwJKGGoF2jAOY/AI="> <link rel="stylesheet" href="../styles.css" integrity="sha256-nsutlmVxvyIyABk8i0fzVyO+ram8rkuTntoETIGcou8=">
<script src="../theme.js" integrity="sha256-+dDNTo7WAOmn2YC875+vn9oH4UkMwlVOGlARp2uq3A4="></script> <script src="../theme.js" integrity="sha256-+dDNTo7WAOmn2YC875+vn9oH4UkMwlVOGlARp2uq3A4="></script>
<script src="../includes.js" integrity="sha256-0VPPSi+jVc1DuyZaSYTq+fnpIfv7ft+ZDenYE6pDPqA="></script> <script src="../includes.js" integrity="sha256-CJbyPP0VWE+XrarLtjHMffGrI2GlTXXAXOce+NE+aQg="></script>
</head> </head>
<body> <body>
<!-- Header Include --> <!-- Header Include -->

View File

@ -5,9 +5,9 @@
<meta name="viewport" content="width=device-width, initial-scale=1.0"> <meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta name="description" content="Architected geographically redundant DNS infrastructure for Flint Bishop International Airport, achieving A+ resilience standards for critical aviation infrastructure."> <meta name="description" content="Architected geographically redundant DNS infrastructure for Flint Bishop International Airport, achieving A+ resilience standards for critical aviation infrastructure.">
<title>Airport DNS Infrastructure - Resilient DNS Design</title> <title>Airport DNS Infrastructure - Resilient DNS Design</title>
<link rel="stylesheet" href="../styles.css" integrity="sha256-mjzh8Lh0zDbg3xduiLiH6jR4dfkgwJKGGoF2jAOY/AI=" crossorigin="anonymous"> <link rel="stylesheet" href="../styles.css" integrity="sha256-nsutlmVxvyIyABk8i0fzVyO+ram8rkuTntoETIGcou8=" crossorigin="anonymous">
<script src="../theme.js" integrity="sha256-+dDNTo7WAOmn2YC875+vn9oH4UkMwlVOGlARp2uq3A4=" crossorigin="anonymous"></script> <script src="../theme.js" integrity="sha256-+dDNTo7WAOmn2YC875+vn9oH4UkMwlVOGlARp2uq3A4=" crossorigin="anonymous"></script>
<script src="../includes.js" integrity="sha256-0VPPSi+jVc1DuyZaSYTq+fnpIfv7ft+ZDenYE6pDPqA=" crossorigin="anonymous"></script> <script src="../includes.js" integrity="sha256-CJbyPP0VWE+XrarLtjHMffGrI2GlTXXAXOce+NE+aQg=" crossorigin="anonymous"></script>
<link rel="stylesheet" href="stories.css" integrity="sha256-O+OMb48leSKvekhMTDUK1y6+WG9x33kA0eDw00wUwkY="> <link rel="stylesheet" href="stories.css" integrity="sha256-O+OMb48leSKvekhMTDUK1y6+WG9x33kA0eDw00wUwkY=">
<script src="../markdown-loader.js" integrity="sha256-qK8mCx0LUZwMtstjbkCOweh/Y+84XwFjcUQSEH4lCws="></script> <script src="../markdown-loader.js" integrity="sha256-qK8mCx0LUZwMtstjbkCOweh/Y+84XwFjcUQSEH4lCws="></script>
</head> </head>

View File

@ -5,9 +5,9 @@
<meta name="viewport" content="width=device-width, initial-scale=1.0"> <meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta name="description" content="Developed ad revenue tracking application for content creators with real-time analytics, secure API integrations, and data-driven content optimization tools."> <meta name="description" content="Developed ad revenue tracking application for content creators with real-time analytics, secure API integrations, and data-driven content optimization tools.">
<title>Ad Revenue Tracking App for Influencers</title> <title>Ad Revenue Tracking App for Influencers</title>
<link rel="stylesheet" href="../styles.css" integrity="sha256-mjzh8Lh0zDbg3xduiLiH6jR4dfkgwJKGGoF2jAOY/AI=" crossorigin="anonymous"> <link rel="stylesheet" href="../styles.css" integrity="sha256-nsutlmVxvyIyABk8i0fzVyO+ram8rkuTntoETIGcou8=" crossorigin="anonymous">
<script src="../theme.js" integrity="sha256-+dDNTo7WAOmn2YC875+vn9oH4UkMwlVOGlARp2uq3A4=" crossorigin="anonymous"></script> <script src="../theme.js" integrity="sha256-+dDNTo7WAOmn2YC875+vn9oH4UkMwlVOGlARp2uq3A4=" crossorigin="anonymous"></script>
<script src="../includes.js" integrity="sha256-0VPPSi+jVc1DuyZaSYTq+fnpIfv7ft+ZDenYE6pDPqA=" crossorigin="anonymous"></script> <script src="../includes.js" integrity="sha256-CJbyPP0VWE+XrarLtjHMffGrI2GlTXXAXOce+NE+aQg=" crossorigin="anonymous"></script>
<link rel="stylesheet" href="stories.css" integrity="sha256-O+OMb48leSKvekhMTDUK1y6+WG9x33kA0eDw00wUwkY="> <link rel="stylesheet" href="stories.css" integrity="sha256-O+OMb48leSKvekhMTDUK1y6+WG9x33kA0eDw00wUwkY=">
<script src="../markdown-loader.js" integrity="sha256-qK8mCx0LUZwMtstjbkCOweh/Y+84XwFjcUQSEH4lCws="></script> <script src="../markdown-loader.js" integrity="sha256-qK8mCx0LUZwMtstjbkCOweh/Y+84XwFjcUQSEH4lCws="></script>
</head> </head>

View File

@ -5,9 +5,9 @@
<meta name="viewport" content="width=device-width, initial-scale=1.0"> <meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta name="description" content="Revitalized struggling business into profitable operation in two weeks, developing revolutionary open-source tooling that powered major Minecraft projects."> <meta name="description" content="Revitalized struggling business into profitable operation in two weeks, developing revolutionary open-source tooling that powered major Minecraft projects.">
<title>Athion.net Business Turnaround - Colin Knapp</title> <title>Athion.net Business Turnaround - Colin Knapp</title>
<link rel="stylesheet" href="../styles.css" integrity="sha256-mjzh8Lh0zDbg3xduiLiH6jR4dfkgwJKGGoF2jAOY/AI=" crossorigin="anonymous"> <link rel="stylesheet" href="../styles.css" integrity="sha256-nsutlmVxvyIyABk8i0fzVyO+ram8rkuTntoETIGcou8=" crossorigin="anonymous">
<script src="../theme.js" integrity="sha256-+dDNTo7WAOmn2YC875+vn9oH4UkMwlVOGlARp2uq3A4=" crossorigin="anonymous"></script> <script src="../theme.js" integrity="sha256-+dDNTo7WAOmn2YC875+vn9oH4UkMwlVOGlARp2uq3A4=" crossorigin="anonymous"></script>
<script src="../includes.js" integrity="sha256-0VPPSi+jVc1DuyZaSYTq+fnpIfv7ft+ZDenYE6pDPqA=" crossorigin="anonymous"></script> <script src="../includes.js" integrity="sha256-CJbyPP0VWE+XrarLtjHMffGrI2GlTXXAXOce+NE+aQg=" crossorigin="anonymous"></script>
<link rel="stylesheet" href="stories.css" integrity="sha256-O+OMb48leSKvekhMTDUK1y6+WG9x33kA0eDw00wUwkY="> <link rel="stylesheet" href="stories.css" integrity="sha256-O+OMb48leSKvekhMTDUK1y6+WG9x33kA0eDw00wUwkY=">
<script src="../markdown-loader.js" integrity="sha256-qK8mCx0LUZwMtstjbkCOweh/Y+84XwFjcUQSEH4lCws="></script> <script src="../markdown-loader.js" integrity="sha256-qK8mCx0LUZwMtstjbkCOweh/Y+84XwFjcUQSEH4lCws="></script>
</head> </head>

View File

@ -5,9 +5,9 @@
<meta name="viewport" content="width=device-width, initial-scale=1.0"> <meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta name="description" content="Co-created FastAsyncWorldEdit and PlotSquared, scaling Minecraft world editing from 50K server-crashing edits to billions seamlessly, powering a $2B game brand."> <meta name="description" content="Co-created FastAsyncWorldEdit and PlotSquared, scaling Minecraft world editing from 50K server-crashing edits to billions seamlessly, powering a $2B game brand.">
<title>FastAsyncWorldEdit & PlotSquared - Minecraft Tools</title> <title>FastAsyncWorldEdit & PlotSquared - Minecraft Tools</title>
<link rel="stylesheet" href="../styles.css" integrity="sha256-mjzh8Lh0zDbg3xduiLiH6jR4dfkgwJKGGoF2jAOY/AI=" crossorigin="anonymous"> <link rel="stylesheet" href="../styles.css" integrity="sha256-nsutlmVxvyIyABk8i0fzVyO+ram8rkuTntoETIGcou8=" crossorigin="anonymous">
<script src="../theme.js" integrity="sha256-+dDNTo7WAOmn2YC875+vn9oH4UkMwlVOGlARp2uq3A4=" crossorigin="anonymous"></script> <script src="../theme.js" integrity="sha256-+dDNTo7WAOmn2YC875+vn9oH4UkMwlVOGlARp2uq3A4=" crossorigin="anonymous"></script>
<script src="../includes.js" integrity="sha256-0VPPSi+jVc1DuyZaSYTq+fnpIfv7ft+ZDenYE6pDPqA=" crossorigin="anonymous"></script> <script src="../includes.js" integrity="sha256-CJbyPP0VWE+XrarLtjHMffGrI2GlTXXAXOce+NE+aQg=" crossorigin="anonymous"></script>
<link rel="stylesheet" href="stories.css" integrity="sha256-O+OMb48leSKvekhMTDUK1y6+WG9x33kA0eDw00wUwkY="> <link rel="stylesheet" href="stories.css" integrity="sha256-O+OMb48leSKvekhMTDUK1y6+WG9x33kA0eDw00wUwkY=">
<script src="../markdown-loader.js" integrity="sha256-qK8mCx0LUZwMtstjbkCOweh/Y+84XwFjcUQSEH4lCws="></script> <script src="../markdown-loader.js" integrity="sha256-qK8mCx0LUZwMtstjbkCOweh/Y+84XwFjcUQSEH4lCws="></script>
</head> </head>

View File

@ -5,9 +5,9 @@
<meta name="viewport" content="width=device-width, initial-scale=1.0"> <meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta name="description" content="Designed secure, scalable infrastructure for Improving MI Practices healthcare education platform with CIS Level 1-2 security standards and high availability."> <meta name="description" content="Designed secure, scalable infrastructure for Improving MI Practices healthcare education platform with CIS Level 1-2 security standards and high availability.">
<title>Healthcare Platform Infrastructure - Secure Design</title> <title>Healthcare Platform Infrastructure - Secure Design</title>
<link rel="stylesheet" href="../styles.css" integrity="sha256-mjzh8Lh0zDbg3xduiLiH6jR4dfkgwJKGGoF2jAOY/AI=" crossorigin="anonymous"> <link rel="stylesheet" href="../styles.css" integrity="sha256-nsutlmVxvyIyABk8i0fzVyO+ram8rkuTntoETIGcou8=" crossorigin="anonymous">
<script src="../theme.js" integrity="sha256-+dDNTo7WAOmn2YC875+vn9oH4UkMwlVOGlARp2uq3A4=" crossorigin="anonymous"></script> <script src="../theme.js" integrity="sha256-+dDNTo7WAOmn2YC875+vn9oH4UkMwlVOGlARp2uq3A4=" crossorigin="anonymous"></script>
<script src="../includes.js" integrity="sha256-0VPPSi+jVc1DuyZaSYTq+fnpIfv7ft+ZDenYE6pDPqA=" crossorigin="anonymous"></script> <script src="../includes.js" integrity="sha256-CJbyPP0VWE+XrarLtjHMffGrI2GlTXXAXOce+NE+aQg=" crossorigin="anonymous"></script>
<link rel="stylesheet" href="stories.css" integrity="sha256-O+OMb48leSKvekhMTDUK1y6+WG9x33kA0eDw00wUwkY="> <link rel="stylesheet" href="stories.css" integrity="sha256-O+OMb48leSKvekhMTDUK1y6+WG9x33kA0eDw00wUwkY=">
<script src="../markdown-loader.js" integrity="sha256-qK8mCx0LUZwMtstjbkCOweh/Y+84XwFjcUQSEH4lCws="></script> <script src="../markdown-loader.js" integrity="sha256-qK8mCx0LUZwMtstjbkCOweh/Y+84XwFjcUQSEH4lCws="></script>
</head> </head>

View File

@ -5,10 +5,10 @@
<meta name="viewport" content="width=device-width, initial-scale=1.0"> <meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta name="description" content="Built self-hosted infrastructure cluster with 100+ services for data sovereignty and developed WireGuard mesh networking tool for quantum-resistant networking."> <meta name="description" content="Built self-hosted infrastructure cluster with 100+ services for data sovereignty and developed WireGuard mesh networking tool for quantum-resistant networking.">
<title>Home Infrastructure & WireGuard Mesh Networking</title> <title>Home Infrastructure & WireGuard Mesh Networking</title>
<link rel="stylesheet" href="../styles.css" integrity="sha256-mjzh8Lh0zDbg3xduiLiH6jR4dfkgwJKGGoF2jAOY/AI="> <link rel="stylesheet" href="../styles.css" integrity="sha256-nsutlmVxvyIyABk8i0fzVyO+ram8rkuTntoETIGcou8=">
<link rel="stylesheet" href="stories.css" integrity="sha256-O+OMb48leSKvekhMTDUK1y6+WG9x33kA0eDw00wUwkY="> <link rel="stylesheet" href="stories.css" integrity="sha256-O+OMb48leSKvekhMTDUK1y6+WG9x33kA0eDw00wUwkY=">
<script src="../theme.js" integrity="sha256-+dDNTo7WAOmn2YC875+vn9oH4UkMwlVOGlARp2uq3A4="></script> <script src="../theme.js" integrity="sha256-+dDNTo7WAOmn2YC875+vn9oH4UkMwlVOGlARp2uq3A4="></script>
<script src="../includes.js" integrity="sha256-0VPPSi+jVc1DuyZaSYTq+fnpIfv7ft+ZDenYE6pDPqA="></script> <script src="../includes.js" integrity="sha256-CJbyPP0VWE+XrarLtjHMffGrI2GlTXXAXOce+NE+aQg="></script>
</head> </head>
<body> <body>
<!-- Header Include --> <!-- Header Include -->

View File

@ -5,9 +5,9 @@
<meta name="viewport" content="width=device-width, initial-scale=1.0"> <meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta name="description" content="Explore detailed case studies and project stories from Colin Knapp's portfolio: cybersecurity, infrastructure, open source development, and team leadership."> <meta name="description" content="Explore detailed case studies and project stories from Colin Knapp's portfolio: cybersecurity, infrastructure, open source development, and team leadership.">
<title>Project Stories & Case Studies - Colin Knapp</title> <title>Project Stories & Case Studies - Colin Knapp</title>
<link rel="stylesheet" href="../styles.css" integrity="sha256-mjzh8Lh0zDbg3xduiLiH6jR4dfkgwJKGGoF2jAOY/AI=" crossorigin="anonymous"> <link rel="stylesheet" href="../styles.css" integrity="sha256-nsutlmVxvyIyABk8i0fzVyO+ram8rkuTntoETIGcou8=" crossorigin="anonymous">
<script src="../theme.js" integrity="sha256-+dDNTo7WAOmn2YC875+vn9oH4UkMwlVOGlARp2uq3A4=" crossorigin="anonymous"></script> <script src="../theme.js" integrity="sha256-+dDNTo7WAOmn2YC875+vn9oH4UkMwlVOGlARp2uq3A4=" crossorigin="anonymous"></script>
<script src="../includes.js" integrity="sha256-0VPPSi+jVc1DuyZaSYTq+fnpIfv7ft+ZDenYE6pDPqA=" crossorigin="anonymous"></script> <script src="../includes.js" integrity="sha256-CJbyPP0VWE+XrarLtjHMffGrI2GlTXXAXOce+NE+aQg=" crossorigin="anonymous"></script>
<link rel="stylesheet" href="stories.css" integrity="sha256-O+OMb48leSKvekhMTDUK1y6+WG9x33kA0eDw00wUwkY="> <link rel="stylesheet" href="stories.css" integrity="sha256-O+OMb48leSKvekhMTDUK1y6+WG9x33kA0eDw00wUwkY=">
</head> </head>
<body> <body>

View File

@ -5,9 +5,9 @@
<meta name="viewport" content="width=device-width, initial-scale=1.0"> <meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta name="description" content="Co-founded sustainable electronics repair company reducing e-waste through circuit board repairs and promoting environmental responsibility in tech industry."> <meta name="description" content="Co-founded sustainable electronics repair company reducing e-waste through circuit board repairs and promoting environmental responsibility in tech industry.">
<title>MotherboardRepair.ca - Sustainable Tech Solutions</title> <title>MotherboardRepair.ca - Sustainable Tech Solutions</title>
<link rel="stylesheet" href="../styles.css" integrity="sha256-mjzh8Lh0zDbg3xduiLiH6jR4dfkgwJKGGoF2jAOY/AI=" crossorigin="anonymous"> <link rel="stylesheet" href="../styles.css" integrity="sha256-nsutlmVxvyIyABk8i0fzVyO+ram8rkuTntoETIGcou8=" crossorigin="anonymous">
<script src="../theme.js" integrity="sha256-+dDNTo7WAOmn2YC875+vn9oH4UkMwlVOGlARp2uq3A4=" crossorigin="anonymous"></script> <script src="../theme.js" integrity="sha256-+dDNTo7WAOmn2YC875+vn9oH4UkMwlVOGlARp2uq3A4=" crossorigin="anonymous"></script>
<script src="../includes.js" integrity="sha256-0VPPSi+jVc1DuyZaSYTq+fnpIfv7ft+ZDenYE6pDPqA=" crossorigin="anonymous"></script> <script src="../includes.js" integrity="sha256-CJbyPP0VWE+XrarLtjHMffGrI2GlTXXAXOce+NE+aQg=" crossorigin="anonymous"></script>
<link rel="stylesheet" href="stories.css" integrity="sha256-O+OMb48leSKvekhMTDUK1y6+WG9x33kA0eDw00wUwkY="> <link rel="stylesheet" href="stories.css" integrity="sha256-O+OMb48leSKvekhMTDUK1y6+WG9x33kA0eDw00wUwkY=">
<script src="../markdown-loader.js" integrity="sha256-qK8mCx0LUZwMtstjbkCOweh/Y+84XwFjcUQSEH4lCws="></script> <script src="../markdown-loader.js" integrity="sha256-qK8mCx0LUZwMtstjbkCOweh/Y+84XwFjcUQSEH4lCws="></script>
</head> </head>

View File

@ -5,9 +5,9 @@
<meta name="viewport" content="width=device-width, initial-scale=1.0"> <meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta name="description" content="Led distributed team of 45 contractors at Nitric Concepts, bootstrapping company to $4M revenue while implementing DevSecOps practices across timezones."> <meta name="description" content="Led distributed team of 45 contractors at Nitric Concepts, bootstrapping company to $4M revenue while implementing DevSecOps practices across timezones.">
<title>Nitric Concepts Leadership - Team Management</title> <title>Nitric Concepts Leadership - Team Management</title>
<link rel="stylesheet" href="../styles.css" integrity="sha256-mjzh8Lh0zDbg3xduiLiH6jR4dfkgwJKGGoF2jAOY/AI=" crossorigin="anonymous"> <link rel="stylesheet" href="../styles.css" integrity="sha256-nsutlmVxvyIyABk8i0fzVyO+ram8rkuTntoETIGcou8=" crossorigin="anonymous">
<script src="../theme.js" integrity="sha256-+dDNTo7WAOmn2YC875+vn9oH4UkMwlVOGlARp2uq3A4=" crossorigin="anonymous"></script> <script src="../theme.js" integrity="sha256-+dDNTo7WAOmn2YC875+vn9oH4UkMwlVOGlARp2uq3A4=" crossorigin="anonymous"></script>
<script src="../includes.js" integrity="sha256-0VPPSi+jVc1DuyZaSYTq+fnpIfv7ft+ZDenYE6pDPqA=" crossorigin="anonymous"></script> <script src="../includes.js" integrity="sha256-CJbyPP0VWE+XrarLtjHMffGrI2GlTXXAXOce+NE+aQg=" crossorigin="anonymous"></script>
<link rel="stylesheet" href="stories.css" integrity="sha256-O+OMb48leSKvekhMTDUK1y6+WG9x33kA0eDw00wUwkY="> <link rel="stylesheet" href="stories.css" integrity="sha256-O+OMb48leSKvekhMTDUK1y6+WG9x33kA0eDw00wUwkY=">
<script src="../markdown-loader.js" integrity="sha256-qK8mCx0LUZwMtstjbkCOweh/Y+84XwFjcUQSEH4lCws="></script> <script src="../markdown-loader.js" integrity="sha256-qK8mCx0LUZwMtstjbkCOweh/Y+84XwFjcUQSEH4lCws="></script>
</head> </head>

View File

@ -5,10 +5,10 @@
<meta name="viewport" content="width=device-width, initial-scale=1.0"> <meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta name="description" content="Architected georedundant, nuclear war-resistant DNS cluster for government clients, ensuring extreme resilience and A+ security standards for critical infrastructure."> <meta name="description" content="Architected georedundant, nuclear war-resistant DNS cluster for government clients, ensuring extreme resilience and A+ security standards for critical infrastructure.">
<title>Nuclear War-Resistant DNS Infrastructure</title> <title>Nuclear War-Resistant DNS Infrastructure</title>
<link rel="stylesheet" href="../styles.css" integrity="sha256-mjzh8Lh0zDbg3xduiLiH6jR4dfkgwJKGGoF2jAOY/AI="> <link rel="stylesheet" href="../styles.css" integrity="sha256-nsutlmVxvyIyABk8i0fzVyO+ram8rkuTntoETIGcou8=">
<link rel="stylesheet" href="stories.css" integrity="sha256-O+OMb48leSKvekhMTDUK1y6+WG9x33kA0eDw00wUwkY="> <link rel="stylesheet" href="stories.css" integrity="sha256-O+OMb48leSKvekhMTDUK1y6+WG9x33kA0eDw00wUwkY=">
<script src="../theme.js" integrity="sha256-+dDNTo7WAOmn2YC875+vn9oH4UkMwlVOGlARp2uq3A4="></script> <script src="../theme.js" integrity="sha256-+dDNTo7WAOmn2YC875+vn9oH4UkMwlVOGlARp2uq3A4="></script>
<script src="../includes.js" integrity="sha256-0VPPSi+jVc1DuyZaSYTq+fnpIfv7ft+ZDenYE6pDPqA="></script> <script src="../includes.js" integrity="sha256-CJbyPP0VWE+XrarLtjHMffGrI2GlTXXAXOce+NE+aQg="></script>
<script src="../markdown-loader.js" integrity="sha256-qK8mCx0LUZwMtstjbkCOweh/Y+84XwFjcUQSEH4lCws="></script> <script src="../markdown-loader.js" integrity="sha256-qK8mCx0LUZwMtstjbkCOweh/Y+84XwFjcUQSEH4lCws="></script>
</head> </head>
<body> <body>

View File

@ -5,9 +5,9 @@
<meta name="viewport" content="width=device-width, initial-scale=1.0"> <meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta name="description" content="Transformed OhMyForm from abandoned project to thriving community with 32K+ Discord members, 10M+ Docker pulls, and sustainable funding model."> <meta name="description" content="Transformed OhMyForm from abandoned project to thriving community with 32K+ Discord members, 10M+ Docker pulls, and sustainable funding model.">
<title>Open Source Community Success - OhMyForm</title> <title>Open Source Community Success - OhMyForm</title>
<link rel="stylesheet" href="../styles.css" integrity="sha256-mjzh8Lh0zDbg3xduiLiH6jR4dfkgwJKGGoF2jAOY/AI="> <link rel="stylesheet" href="../styles.css" integrity="sha256-nsutlmVxvyIyABk8i0fzVyO+ram8rkuTntoETIGcou8=">
<script src="../theme.js" integrity="sha256-+dDNTo7WAOmn2YC875+vn9oH4UkMwlVOGlARp2uq3A4="></script> <script src="../theme.js" integrity="sha256-+dDNTo7WAOmn2YC875+vn9oH4UkMwlVOGlARp2uq3A4="></script>
<script src="../includes.js" integrity="sha256-0VPPSi+jVc1DuyZaSYTq+fnpIfv7ft+ZDenYE6pDPqA="></script> <script src="../includes.js" integrity="sha256-CJbyPP0VWE+XrarLtjHMffGrI2GlTXXAXOce+NE+aQg="></script>
<link rel="stylesheet" href="stories.css" integrity="sha256-O+OMb48leSKvekhMTDUK1y6+WG9x33kA0eDw00wUwkY="> <link rel="stylesheet" href="stories.css" integrity="sha256-O+OMb48leSKvekhMTDUK1y6+WG9x33kA0eDw00wUwkY=">
<script src="../markdown-loader.js" integrity="sha256-qK8mCx0LUZwMtstjbkCOweh/Y+84XwFjcUQSEH4lCws="></script> <script src="../markdown-loader.js" integrity="sha256-qK8mCx0LUZwMtstjbkCOweh/Y+84XwFjcUQSEH4lCws="></script>
</head> </head>

View File

@ -5,9 +5,9 @@
<meta name="viewport" content="width=device-width, initial-scale=1.0"> <meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta name="description" content="Built high-performance ScanSnap scanner service processing ~1 receipt/second with batch capacity up to 50 documents, featuring automatic cleanup and WebDAV access."> <meta name="description" content="Built high-performance ScanSnap scanner service processing ~1 receipt/second with batch capacity up to 50 documents, featuring automatic cleanup and WebDAV access.">
<title>ScanSnap Scanner Service - Receipt Digitization</title> <title>ScanSnap Scanner Service - Receipt Digitization</title>
<link rel="stylesheet" href="../styles.css" integrity="sha256-mjzh8Lh0zDbg3xduiLiH6jR4dfkgwJKGGoF2jAOY/AI="> <link rel="stylesheet" href="../styles.css" integrity="sha256-nsutlmVxvyIyABk8i0fzVyO+ram8rkuTntoETIGcou8=">
<script src="../theme.js" integrity="sha256-+dDNTo7WAOmn2YC875+vn9oH4UkMwlVOGlARp2uq3A4="></script> <script src="../theme.js" integrity="sha256-+dDNTo7WAOmn2YC875+vn9oH4UkMwlVOGlARp2uq3A4="></script>
<script src="../includes.js" integrity="sha256-0VPPSi+jVc1DuyZaSYTq+fnpIfv7ft+ZDenYE6pDPqA="></script> <script src="../includes.js" integrity="sha256-CJbyPP0VWE+XrarLtjHMffGrI2GlTXXAXOce+NE+aQg="></script>
</head> </head>
<body> <body>
<!-- Header Include --> <!-- Header Include -->

View File

@ -5,9 +5,9 @@
<meta name="viewport" content="width=device-width, initial-scale=1.0"> <meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta name="description" content="Revitalized ShowerLoop website with WCAG 2.0 AA compliance, modern responsive design, and improved accessibility for innovative eco-friendly recirculating shower system."> <meta name="description" content="Revitalized ShowerLoop website with WCAG 2.0 AA compliance, modern responsive design, and improved accessibility for innovative eco-friendly recirculating shower system.">
<title>ShowerLoop Project - Web Development & Accessibility</title> <title>ShowerLoop Project - Web Development & Accessibility</title>
<link rel="stylesheet" href="../styles.css" integrity="sha256-mjzh8Lh0zDbg3xduiLiH6jR4dfkgwJKGGoF2jAOY/AI=" crossorigin="anonymous"> <link rel="stylesheet" href="../styles.css" integrity="sha256-nsutlmVxvyIyABk8i0fzVyO+ram8rkuTntoETIGcou8=" crossorigin="anonymous">
<script src="../theme.js" integrity="sha256-+dDNTo7WAOmn2YC875+vn9oH4UkMwlVOGlARp2uq3A4=" crossorigin="anonymous"></script> <script src="../theme.js" integrity="sha256-+dDNTo7WAOmn2YC875+vn9oH4UkMwlVOGlARp2uq3A4=" crossorigin="anonymous"></script>
<script src="../includes.js" integrity="sha256-0VPPSi+jVc1DuyZaSYTq+fnpIfv7ft+ZDenYE6pDPqA=" crossorigin="anonymous"></script> <script src="../includes.js" integrity="sha256-CJbyPP0VWE+XrarLtjHMffGrI2GlTXXAXOce+NE+aQg=" crossorigin="anonymous"></script>
<link rel="stylesheet" href="stories.css" integrity="sha256-O+OMb48leSKvekhMTDUK1y6+WG9x33kA0eDw00wUwkY="> <link rel="stylesheet" href="stories.css" integrity="sha256-O+OMb48leSKvekhMTDUK1y6+WG9x33kA0eDw00wUwkY=">
<script src="../markdown-loader.js" integrity="sha256-qK8mCx0LUZwMtstjbkCOweh/Y+84XwFjcUQSEH4lCws="></script> <script src="../markdown-loader.js" integrity="sha256-qK8mCx0LUZwMtstjbkCOweh/Y+84XwFjcUQSEH4lCws="></script>
</head> </head>

View File

@ -5,10 +5,10 @@
<meta name="viewport" content="width=device-width, initial-scale=1.0"> <meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta name="description" content="Colin Knapp - Story Example"> <meta name="description" content="Colin Knapp - Story Example">
<title>Story Example - Colin Knapp</title> <title>Story Example - Colin Knapp</title>
<link rel="stylesheet" href="../styles.css" integrity="sha256-mjzh8Lh0zDbg3xduiLiH6jR4dfkgwJKGGoF2jAOY/AI="> <link rel="stylesheet" href="../styles.css" integrity="sha256-nsutlmVxvyIyABk8i0fzVyO+ram8rkuTntoETIGcou8=">
<link rel="stylesheet" href="stories.css" integrity="sha256-O+OMb48leSKvekhMTDUK1y6+WG9x33kA0eDw00wUwkY="> <link rel="stylesheet" href="stories.css" integrity="sha256-O+OMb48leSKvekhMTDUK1y6+WG9x33kA0eDw00wUwkY=">
<script src="../theme.js" integrity="sha256-+dDNTo7WAOmn2YC875+vn9oH4UkMwlVOGlARp2uq3A4="></script> <script src="../theme.js" integrity="sha256-+dDNTo7WAOmn2YC875+vn9oH4UkMwlVOGlARp2uq3A4="></script>
<script src="../includes.js" integrity="sha256-0VPPSi+jVc1DuyZaSYTq+fnpIfv7ft+ZDenYE6pDPqA="></script> <script src="../includes.js" integrity="sha256-CJbyPP0VWE+XrarLtjHMffGrI2GlTXXAXOce+NE+aQg="></script>
<script src="../markdown-loader.js" integrity="sha256-qK8mCx0LUZwMtstjbkCOweh/Y+84XwFjcUQSEH4lCws="></script> <script src="../markdown-loader.js" integrity="sha256-qK8mCx0LUZwMtstjbkCOweh/Y+84XwFjcUQSEH4lCws="></script>
</head> </head>
<body> <body>

View File

@ -5,9 +5,9 @@
<meta name="viewport" content="width=device-width, initial-scale=1.0"> <meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta name="description" content="Colin Knapp - [Story Title] Case Study"> <meta name="description" content="Colin Knapp - [Story Title] Case Study">
<title>[Story Title] - Colin Knapp Case Study</title> <title>[Story Title] - Colin Knapp Case Study</title>
<link rel="stylesheet" href="../styles.css" integrity="sha256-mjzh8Lh0zDbg3xduiLiH6jR4dfkgwJKGGoF2jAOY/AI=" crossorigin="anonymous"> <link rel="stylesheet" href="../styles.css" integrity="sha256-nsutlmVxvyIyABk8i0fzVyO+ram8rkuTntoETIGcou8=" crossorigin="anonymous">
<script src="../theme.js" integrity="sha256-+dDNTo7WAOmn2YC875+vn9oH4UkMwlVOGlARp2uq3A4=" crossorigin="anonymous"></script> <script src="../theme.js" integrity="sha256-+dDNTo7WAOmn2YC875+vn9oH4UkMwlVOGlARp2uq3A4=" crossorigin="anonymous"></script>
<script src="../includes.js" integrity="sha256-0VPPSi+jVc1DuyZaSYTq+fnpIfv7ft+ZDenYE6pDPqA=" crossorigin="anonymous"></script> <script src="../includes.js" integrity="sha256-CJbyPP0VWE+XrarLtjHMffGrI2GlTXXAXOce+NE+aQg=" crossorigin="anonymous"></script>
<link rel="stylesheet" href="stories.css" integrity="sha256-O+OMb48leSKvekhMTDUK1y6+WG9x33kA0eDw00wUwkY="> <link rel="stylesheet" href="stories.css" integrity="sha256-O+OMb48leSKvekhMTDUK1y6+WG9x33kA0eDw00wUwkY=">
<script src="../markdown-loader.js" integrity="sha256-qK8mCx0LUZwMtstjbkCOweh/Y+84XwFjcUQSEH4lCws="></script> <script src="../markdown-loader.js" integrity="sha256-qK8mCx0LUZwMtstjbkCOweh/Y+84XwFjcUQSEH4lCws="></script>
</head> </head>

View File

@ -5,9 +5,9 @@
<meta name="viewport" content="width=device-width, initial-scale=1.0"> <meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta name="description" content="Built AI-powered cybersecurity consultancy ViperWire, delivering enterprise-grade security to SMBs with automated threat detection, reducing incident response time to 15 minutes."> <meta name="description" content="Built AI-powered cybersecurity consultancy ViperWire, delivering enterprise-grade security to SMBs with automated threat detection, reducing incident response time to 15 minutes.">
<title>ViperWire - AI-Powered Cybersecurity Consultancy</title> <title>ViperWire - AI-Powered Cybersecurity Consultancy</title>
<link rel="stylesheet" href="../styles.css" integrity="sha256-mjzh8Lh0zDbg3xduiLiH6jR4dfkgwJKGGoF2jAOY/AI=" crossorigin="anonymous"> <link rel="stylesheet" href="../styles.css" integrity="sha256-nsutlmVxvyIyABk8i0fzVyO+ram8rkuTntoETIGcou8=" crossorigin="anonymous">
<script src="../theme.js" integrity="sha256-+dDNTo7WAOmn2YC875+vn9oH4UkMwlVOGlARp2uq3A4=" crossorigin="anonymous"></script> <script src="../theme.js" integrity="sha256-+dDNTo7WAOmn2YC875+vn9oH4UkMwlVOGlARp2uq3A4=" crossorigin="anonymous"></script>
<script src="../includes.js" integrity="sha256-0VPPSi+jVc1DuyZaSYTq+fnpIfv7ft+ZDenYE6pDPqA=" crossorigin="anonymous"></script> <script src="../includes.js" integrity="sha256-CJbyPP0VWE+XrarLtjHMffGrI2GlTXXAXOce+NE+aQg=" crossorigin="anonymous"></script>
<link rel="stylesheet" href="stories.css" integrity="sha256-O+OMb48leSKvekhMTDUK1y6+WG9x33kA0eDw00wUwkY="> <link rel="stylesheet" href="stories.css" integrity="sha256-O+OMb48leSKvekhMTDUK1y6+WG9x33kA0eDw00wUwkY=">
<script src="../markdown-loader.js" integrity="sha256-qK8mCx0LUZwMtstjbkCOweh/Y+84XwFjcUQSEH4lCws="></script> <script src="../markdown-loader.js" integrity="sha256-qK8mCx0LUZwMtstjbkCOweh/Y+84XwFjcUQSEH4lCws="></script>
</head> </head>

View File

@ -5,9 +5,9 @@
<meta name="viewport" content="width=device-width, initial-scale=1.0"> <meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta name="description" content="Developed web solutions and Java plugins with Jenkins/GitLab CI/CD, WCAG 2.0 AA compliance, and comprehensive documentation for diverse client environments."> <meta name="description" content="Developed web solutions and Java plugins with Jenkins/GitLab CI/CD, WCAG 2.0 AA compliance, and comprehensive documentation for diverse client environments.">
<title>Web Design & Java Plugin Development</title> <title>Web Design & Java Plugin Development</title>
<link rel="stylesheet" href="../styles.css" integrity="sha256-mjzh8Lh0zDbg3xduiLiH6jR4dfkgwJKGGoF2jAOY/AI=" crossorigin="anonymous"> <link rel="stylesheet" href="../styles.css" integrity="sha256-nsutlmVxvyIyABk8i0fzVyO+ram8rkuTntoETIGcou8=" crossorigin="anonymous">
<script src="../theme.js" integrity="sha256-+dDNTo7WAOmn2YC875+vn9oH4UkMwlVOGlARp2uq3A4=" crossorigin="anonymous"></script> <script src="../theme.js" integrity="sha256-+dDNTo7WAOmn2YC875+vn9oH4UkMwlVOGlARp2uq3A4=" crossorigin="anonymous"></script>
<script src="../includes.js" integrity="sha256-0VPPSi+jVc1DuyZaSYTq+fnpIfv7ft+ZDenYE6pDPqA=" crossorigin="anonymous"></script> <script src="../includes.js" integrity="sha256-CJbyPP0VWE+XrarLtjHMffGrI2GlTXXAXOce+NE+aQg=" crossorigin="anonymous"></script>
<link rel="stylesheet" href="stories.css" integrity="sha256-O+OMb48leSKvekhMTDUK1y6+WG9x33kA0eDw00wUwkY="> <link rel="stylesheet" href="stories.css" integrity="sha256-O+OMb48leSKvekhMTDUK1y6+WG9x33kA0eDw00wUwkY=">
<script src="../markdown-loader.js" integrity="sha256-qK8mCx0LUZwMtstjbkCOweh/Y+84XwFjcUQSEH4lCws="></script> <script src="../markdown-loader.js" integrity="sha256-qK8mCx0LUZwMtstjbkCOweh/Y+84XwFjcUQSEH4lCws="></script>
</head> </head>

View File

@ -5,9 +5,9 @@
<meta name="viewport" content="width=device-width, initial-scale=1.0"> <meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta name="description" content="Created Docker-based automated WordPress malware removal tool that eliminated persistent attacks, reducing infection frequency from daily to zero for MLPP."> <meta name="description" content="Created Docker-based automated WordPress malware removal tool that eliminated persistent attacks, reducing infection frequency from daily to zero for MLPP.">
<title>WordPress Security Automation - Malware Removal</title> <title>WordPress Security Automation - Malware Removal</title>
<link rel="stylesheet" href="../styles.css" integrity="sha256-mjzh8Lh0zDbg3xduiLiH6jR4dfkgwJKGGoF2jAOY/AI=" crossorigin="anonymous"> <link rel="stylesheet" href="../styles.css" integrity="sha256-nsutlmVxvyIyABk8i0fzVyO+ram8rkuTntoETIGcou8=" crossorigin="anonymous">
<script src="../theme.js" integrity="sha256-+dDNTo7WAOmn2YC875+vn9oH4UkMwlVOGlARp2uq3A4=" crossorigin="anonymous"></script> <script src="../theme.js" integrity="sha256-+dDNTo7WAOmn2YC875+vn9oH4UkMwlVOGlARp2uq3A4=" crossorigin="anonymous"></script>
<script src="../includes.js" integrity="sha256-0VPPSi+jVc1DuyZaSYTq+fnpIfv7ft+ZDenYE6pDPqA=" crossorigin="anonymous"></script> <script src="../includes.js" integrity="sha256-CJbyPP0VWE+XrarLtjHMffGrI2GlTXXAXOce+NE+aQg=" crossorigin="anonymous"></script>
<link rel="stylesheet" href="stories.css" integrity="sha256-O+OMb48leSKvekhMTDUK1y6+WG9x33kA0eDw00wUwkY="> <link rel="stylesheet" href="stories.css" integrity="sha256-O+OMb48leSKvekhMTDUK1y6+WG9x33kA0eDw00wUwkY=">
<script src="../markdown-loader.js" integrity="sha256-qK8mCx0LUZwMtstjbkCOweh/Y+84XwFjcUQSEH4lCws="></script> <script src="../markdown-loader.js" integrity="sha256-qK8mCx0LUZwMtstjbkCOweh/Y+84XwFjcUQSEH4lCws="></script>
</head> </head>

View File

@ -5,9 +5,9 @@
<meta name="viewport" content="width=device-width, initial-scale=1.0"> <meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta name="description" content="Developed custom Minecraft games for YouTube creators with 15M+ subscriber reach, implementing DDoS defense, anti-phishing protocols, and data privacy measures."> <meta name="description" content="Developed custom Minecraft games for YouTube creators with 15M+ subscriber reach, implementing DDoS defense, anti-phishing protocols, and data privacy measures.">
<title>YouTube Game Development & Cybersecurity</title> <title>YouTube Game Development & Cybersecurity</title>
<link rel="stylesheet" href="../styles.css" integrity="sha256-mjzh8Lh0zDbg3xduiLiH6jR4dfkgwJKGGoF2jAOY/AI=" crossorigin="anonymous"> <link rel="stylesheet" href="../styles.css" integrity="sha256-nsutlmVxvyIyABk8i0fzVyO+ram8rkuTntoETIGcou8=" crossorigin="anonymous">
<script src="../theme.js" integrity="sha256-+dDNTo7WAOmn2YC875+vn9oH4UkMwlVOGlARp2uq3A4=" crossorigin="anonymous"></script> <script src="../theme.js" integrity="sha256-+dDNTo7WAOmn2YC875+vn9oH4UkMwlVOGlARp2uq3A4=" crossorigin="anonymous"></script>
<script src="../includes.js" integrity="sha256-0VPPSi+jVc1DuyZaSYTq+fnpIfv7ft+ZDenYE6pDPqA=" crossorigin="anonymous"></script> <script src="../includes.js" integrity="sha256-CJbyPP0VWE+XrarLtjHMffGrI2GlTXXAXOce+NE+aQg=" crossorigin="anonymous"></script>
<link rel="stylesheet" href="stories.css" integrity="sha256-O+OMb48leSKvekhMTDUK1y6+WG9x33kA0eDw00wUwkY="> <link rel="stylesheet" href="stories.css" integrity="sha256-O+OMb48leSKvekhMTDUK1y6+WG9x33kA0eDw00wUwkY=">
</head> </head>
<body> <body>

View File

@ -376,6 +376,11 @@ html[data-theme='dark'] .main-nav a.active {
color: #dc3545 !important; /* Red for unwritten stories */ color: #dc3545 !important; /* Red for unwritten stories */
} }
/* Bold story links that are written */
.main-nav .dropdown-content a:has(.nav-status.written) {
font-weight: 700;
}
/* Dark theme support for status indicators */ /* Dark theme support for status indicators */
@media (prefers-color-scheme: dark) { @media (prefers-color-scheme: dark) {
.main-nav .dropdown-content a .nav-status.written { .main-nav .dropdown-content a .nav-status.written {

View File

@ -5,9 +5,9 @@
<meta name="viewport" content="width=device-width, initial-scale=1.0"> <meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta name="description" content="Colin Knapp - Template with Includes"> <meta name="description" content="Colin Knapp - Template with Includes">
<title>Template with Includes - Colin Knapp</title> <title>Template with Includes - Colin Knapp</title>
<link rel="stylesheet" href="styles.css" integrity="sha256-mjzh8Lh0zDbg3xduiLiH6jR4dfkgwJKGGoF2jAOY/AI="> <link rel="stylesheet" href="styles.css" integrity="sha256-nsutlmVxvyIyABk8i0fzVyO+ram8rkuTntoETIGcou8=">
<script src="theme.js" integrity="sha256-+dDNTo7WAOmn2YC875+vn9oH4UkMwlVOGlARp2uq3A4="></script> <script src="theme.js" integrity="sha256-+dDNTo7WAOmn2YC875+vn9oH4UkMwlVOGlARp2uq3A4="></script>
<script src="includes.js" integrity="sha256-0VPPSi+jVc1DuyZaSYTq+fnpIfv7ft+ZDenYE6pDPqA="></script> <script src="includes.js" integrity="sha256-CJbyPP0VWE+XrarLtjHMffGrI2GlTXXAXOce+NE+aQg="></script>
</head> </head>
<body> <body>
<!-- Header Include --> <!-- Header Include -->

106
git-hooks/pre-push Executable file
View File

@ -0,0 +1,106 @@
#!/bin/bash
# Pre-push hook to generate PDFs before pushing
# This ensures PDFs are always up to date when code is pushed
# Don't exit on error immediately - we want to report issues but not break the push
set +e
REPO_ROOT="$(git rev-parse --show-toplevel)"
DOCKER_DIR="$REPO_ROOT/docker"
PDFS_DIR="$REPO_ROOT/docker/resume/pdfs"
GENERATE_PDFS_SCRIPT="$DOCKER_DIR/generate-pdfs.js"
# Check if we're in a git repository
if [ -z "$REPO_ROOT" ]; then
echo "Warning: Not in a git repository, skipping PDF generation"
exit 0
fi
# Check if docker directory exists
if [ ! -d "$DOCKER_DIR" ]; then
echo "Warning: docker directory not found, skipping PDF generation"
exit 0
fi
# Check if generate-pdfs.js exists
if [ ! -f "$GENERATE_PDFS_SCRIPT" ]; then
echo "Warning: generate-pdfs.js not found, skipping PDF generation"
exit 0
fi
# Check if PDFs already exist and are up to date
if [ -d "$PDFS_DIR" ]; then
PDF_COUNT=$(find "$PDFS_DIR" -name "*.pdf" -type f 2>/dev/null | wc -l | tr -d ' ')
if [ "$PDF_COUNT" -gt 0 ]; then
echo "PDFs already exist ($PDF_COUNT files), skipping generation"
echo "To regenerate PDFs, run: cd docker && PUPPETEER_EXECUTABLE_PATH=\"/Applications/Google Chrome.app/Contents/MacOS/Google Chrome\" npm run generate-pdfs"
exit 0
fi
fi
echo "Running pre-push hook: Generating PDFs..."
# Navigate to docker directory
cd "$DOCKER_DIR" || {
echo "Error: Could not navigate to docker directory"
exit 1
}
# Check if node_modules exists, install if not
if [ ! -d "node_modules" ]; then
echo "Installing npm dependencies..."
if ! PUPPETEER_SKIP_DOWNLOAD=true npm install; then
echo "Error: Failed to install npm dependencies"
exit 1
fi
fi
# Check if npm is available
if ! command -v npm &> /dev/null; then
echo "Error: npm is not installed or not in PATH"
exit 1
fi
# Try to find Chrome executable
CHROME_PATH=""
if [ -f "/Applications/Google Chrome.app/Contents/MacOS/Google Chrome" ]; then
CHROME_PATH="/Applications/Google Chrome.app/Contents/MacOS/Google Chrome"
elif command -v google-chrome &> /dev/null; then
CHROME_PATH=$(which google-chrome)
elif command -v chromium &> /dev/null; then
CHROME_PATH=$(which chromium)
fi
if [ -z "$CHROME_PATH" ]; then
echo "Warning: Chrome not found, skipping PDF generation"
echo "PDFs will be generated during Docker build instead"
exit 0
fi
# Generate PDFs
echo "Generating PDFs using Chrome at: $CHROME_PATH"
if PUPPETEER_EXECUTABLE_PATH="$CHROME_PATH" npm run generate-pdfs; then
echo "✓ PDFs generated successfully"
# Stage the PDFs directory if it exists and has changes
cd "$REPO_ROOT" || exit 1
if [ -d "$PDFS_DIR" ]; then
# Check if there are any PDF files
PDF_COUNT=$(find "$PDFS_DIR" -name "*.pdf" -type f 2>/dev/null | wc -l | tr -d ' ')
if [ "$PDF_COUNT" -gt 0 ]; then
# Add all PDFs to staging
git add "$PDFS_DIR" 2>/dev/null
# Check if there are changes staged
if ! git diff --cached --quiet --exit-code "$PDFS_DIR" 2>/dev/null; then
echo "✓ PDFs updated and staged for commit"
fi
fi
fi
else
echo "Warning: PDF generation failed, continuing with push"
echo "PDFs will be generated during Docker build instead"
fi
exit 0

45
setup-git-hooks.sh Executable file
View File

@ -0,0 +1,45 @@
#!/bin/bash
# Setup script to install git hooks
# Run this after cloning the repository
set -e
SCRIPT_DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" &> /dev/null && pwd )"
GIT_HOOKS_DIR="$SCRIPT_DIR/.git/hooks"
SOURCE_HOOKS_DIR="$SCRIPT_DIR/git-hooks"
# Check if we're in a git repository
if [ ! -d "$SCRIPT_DIR/.git" ]; then
echo "Error: Not in a git repository. Please run this from the repository root."
exit 1
fi
echo "Setting up git hooks..."
# Create .git/hooks directory if it doesn't exist
mkdir -p "$GIT_HOOKS_DIR"
# Copy pre-push hook
if [ -f "$SOURCE_HOOKS_DIR/pre-push" ]; then
cp "$SOURCE_HOOKS_DIR/pre-push" "$GIT_HOOKS_DIR/pre-push"
chmod +x "$GIT_HOOKS_DIR/pre-push"
echo "✓ Installed pre-push hook"
else
echo "✗ pre-push hook not found in git-hooks/"
exit 1
fi
# Verify installation
if [ -x "$GIT_HOOKS_DIR/pre-push" ]; then
echo "✓ Hook is executable and ready"
else
echo "✗ Hook installation verification failed"
exit 1
fi
echo ""
echo "Git hooks installed successfully!"
echo "PDFs will be automatically generated before each push."
echo ""
echo "To test the hook, try: git push --dry-run"