-
Notifications
You must be signed in to change notification settings - Fork 255
/
contact.php
484 lines (442 loc) · 31.9 KB
/
contact.php
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
<?php include('contact_secrets.php'); ?>
<!DOCTYPE html>
<html lang="en">
<head>
<title>Jameson Lopp :: Contact</title>
<meta name="viewport" content="width=device-width, initial-scale=1">
<meta name="keywords" content="jameson, lopp, bitcoin, crypto, cypherpunk">
<meta name="Robots" content="index,follow">
<meta name="description" content="Contact form for reaching Jameson Lopp.">
<meta name="twitter:card" content="summary">
<meta name="twitter:description" content="Contact Jameson Lopp">
<meta name="twitter:title" content="Jameson Lopp's Contact Information">
<meta name="twitter:site" content="@lopp">
<meta name="twitter:creator" content="@lopp">
<meta name="twitter:image" content="https://www.lopp.net/images/avatar.jpg">
<meta property="og:type" content="website">
<meta property="og:description" content="Contact Jameson Lopp">
<meta property="og:image" content="https://www.lopp.net/images/avatar.jpg">
<meta property="og:url" content="https://www.lopp.net/contact.php">
<meta property="og:title" content="Contact Jameson Lopp">
<link rel="shortcut icon" href="/favicon.ico">
<link rel="apple-touch-icon" href="/images/apple-touch-icon.png">
<link href="https://www.google-analytics.com" rel="preconnect" crossorigin>
<link href="https://stats.g.doubleclick.net" rel="preconnect" crossorigin>
<style>
html{font-family: -apple-system,system-ui,BlinkMacSystemFont,"Segoe UI",Roboto,Oxygen-Sans,Ubuntu,Cantarell,"Helvetica Neue",Helvetica,"Apple Color Emoji",Arial,sans-serif,"Segoe UI Emoji","Segoe UI Symbol";-webkit-font-smoothing: subpixel-antialiased;-ms-text-size-adjust:100%}body{margin:0}footer,nav,section{display:block}a{background-color:transparent}h1{margin:.67em 0;font-size:2em}hr{height:0;-webkit-box-sizing:content-box;-moz-box-sizing:content-box;box-sizing:content-box}button,input{margin:0;font:inherit;color:inherit}button{overflow:visible}button{text-transform:none}button{-webkit-appearance:button}button::-moz-focus-inner,input::-moz-focus-inner{padding:0;border:0}input{line-height:normal}input[type=checkbox]{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;padding:0}*{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}*:before,*:after{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}html{font-size:10px}body{font-family:helvetica neue,Helvetica,Arial,sans-serif;font-size:14px;line-height:1.42857143;color:#333;background-color:#fff}input,button{font-family:inherit;font-size:inherit;line-height:inherit}a{color:#337ab7;text-decoration:none}hr{margin-top:20px;margin-bottom:20px;border:0;border-top:1px solid #eee}.sr-only{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0,0,0,0);border:0}h1,h2{font-family:inherit;font-weight:500;line-height:1.1;color:inherit}h1,h2{margin-top:20px;margin-bottom:10px}h1{font-size:36px}h2{font-size:30px}p{margin:0 0 10px}.text-left{text-align:left}.text-right{text-align:right}.text-center{text-align:center}ul{margin-top:0;margin-bottom:10px}.container{padding-right:15px;padding-left:15px;margin-right:auto;margin-left:auto}@media (min-width:768px){.container{width:750px}}@media (min-width:992px){.container{width:970px}}@media (min-width:1200px){.container{width:1170px}}.row{margin-right:-15px;margin-left:-15px}.col-sm-6,.col-md-6,.col-lg-6,.col-lg-8,.col-sm-10,.col-md-10,.col-lg-10,.col-xs-12,.col-sm-12,.col-md-12,.col-lg-12{position:relative;min-height:1px;padding-right:15px;padding-left:15px}.col-xs-12{float:left}.col-xs-12{width:100%}.col-xs-offset-0{margin-left:0}@media (min-width:768px){.col-sm-6,.col-sm-10,.col-sm-12{float:left}.col-sm-12{width:100%}.col-sm-10{width:83.33333333%}.col-sm-6{width:50%}.col-sm-offset-1{margin-left:8.33333333%}.col-sm-offset-0{margin-left:0}}@media (min-width:992px){.col-md-6,.col-md-10,.col-md-12{float:left}.col-md-12{width:100%}.col-md-10{width:83.33333333%}.col-md-6{width:50%}.col-md-offset-1{margin-left:8.33333333%}.col-md-offset-0{margin-left:0}}@media (min-width:1200px){.col-lg-6,.col-lg-8,.col-lg-10,.col-lg-12{float:left}.col-lg-12{width:100%}.col-lg-10{width:83.33333333%}.col-lg-8{width:66.66666667%}.col-lg-6{width:50%}.col-lg-offset-1{margin-left:8.33333333%}.col-lg-offset-0{margin-left:0}}input[type=checkbox]{margin:4px 0 0;margin-top:1px;line-height:normal}.collapse{display:none}.nav{padding-left:0;margin-bottom:0;list-style:none}.nav>li{position:relative;display:block}.nav>li>a{position:relative;display:block;padding:10px 15px}.navbar{position:relative;min-height:50px;margin-bottom:20px;border:1px solid transparent;padding-left:30px;padding-right:30px}@media (min-width:768px){.navbar{border-radius:4px}}@media (min-width:768px){.navbar-header{float:left}}.navbar-collapse{padding-right:30px;padding-left:30px;overflow-x:visible;-webkit-overflow-scrolling:touch;border-top:1px solid transparent;-webkit-box-shadow:inset 0 1px 0 rgba(255,255,255,.1);box-shadow:inset 0 1px 0 rgba(255,255,255,.1)}@media (min-width:768px){.navbar-collapse{width:auto;border-top:0;-webkit-box-shadow:none;box-shadow:none}.navbar-collapse.collapse{display:block!important;height:auto!important;padding-bottom:0;overflow:visible!important}}.container>.navbar-header,.container>.navbar-collapse{margin-right:-15px;margin-left:-15px}@media (min-width:768px){.container>.navbar-header,.container>.navbar-collapse{margin-right:0;margin-left:0}}.navbar-brand{float:left;height:50px;padding:15px;font-size:20px;line-height:20px}@media (min-width:768px){.navbar>.container .navbar-brand{margin-left:45px}}.navbar-toggle{position:relative;float:right;padding:9px 10px;margin-top:8px;margin-right:15px;margin-bottom:8px;background-color:transparent;background-image:none;border:1px solid transparent;border-radius:4px}.navbar-toggle .icon-bar{display:block;width:22px;height:2px;border-radius:1px}.navbar-toggle .icon-bar+.icon-bar{margin-top:4px}@media (min-width:768px){.navbar-toggle{display:none}}.navbar-nav{margin:7.5px -15px}.navbar-nav>li>a{padding-top:10px;padding-bottom:10px;line-height:20px}@media (min-width:768px){.navbar-nav{float:left;margin:0}.navbar-nav>li{float:left}.navbar-nav>li>a{padding-top:15px;padding-bottom:15px}}.navbar-default{background-color:#fff;border-color:#fff;text-align:center}.navbar-default .navbar-brand{color:#000;font-weight:500}.navbar-default .navbar-nav>li>a{color:#000}.navbar-default .navbar-nav>.active>a{color:#CC4C00;background-color:rgba(0,0,0,.05);font-weight:700}.navbar-default .navbar-toggle{border-color:#ddd}.navbar-default .navbar-toggle .icon-bar{background-color:#888}.navbar-default .navbar-collapse{border-color:#fff}.well{min-height:20px;padding:19px;margin-bottom:20px;background-color:#f5f5f5;border:1px solid #e3e3e3;border-radius:4px;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.05);box-shadow:inset 0 1px 1px rgba(0,0,0,.05)}.container:before,.container:after,.row:before,.row:after,.nav:before,.nav:after,.navbar:before,.navbar:after,.navbar-header:before,.navbar-header:after,.navbar-collapse:before,.navbar-collapse:after{display:table;content:" "}.container:after,.row:after,.nav:after,.navbar:after,.navbar-header:after,.navbar-collapse:after{clear:both}.navbar{font-weight:300;text-transform:uppercase}.navbar-brand{padding-left:0}#myDefaultNavbar1 a:link{font-weight:400}#myDefaultNavbar1 .active a:link{font-weight:700}h1{font-weight:600;text-transform:uppercase;border-bottom:solid 4px}.footer{font-size:10px}.inner-background{width:100%;height:auto;background-image:url(https://www.lopp.net/images/bkg-1.webp)}.well{font-size:11px}li a{line-height:1.8}@media (min-width:60em){li a{line-height:1.2}}a:link{color:#CC4C00;text-decoration:none;font-weight:700}a:visited{color:red;text-decoration:none}.wrapper{text-align:center}.toggle{position:relative;display:inline-block;width:120px;height:60px;margin-left:100px;padding:4px;border-radius:40px}.toggle:before,.toggle:after{content:'';display:table}.toggle:after{clear:both}.toggle-bg{position:absolute;top:-4px;left:-4px;width:100%;height:100%;background-color:#c0e6f6;border-radius:40px;border:4px solid #81c0d5}.toggle-input{position:absolute;top:0;left:0;width:100%;height:100%;border:1px solid red;border-radius:40px;z-index:2;opacity:0}.toggle-switch{position:relative;width:40px;height:40px;margin-left:60px;background-color:#f5eb42;border:4px solid #e4c74d;border-radius:50%}.toggle-switch-figure{position:absolute;bottom:-14px;left:-50px;display:block;width:80px;height:40px;border:8px solid #d4d4d2;border-radius:20px;background-color:#fff;transform:scale(.6)}.toggle-switch-figure:after{content:'';display:block;position:relative;top:-45px;right:-32px;width:25px;height:15px;border:8px solid #d4d4d2;border-radius:100%;border-right-color:transparent;border-bottom-color:transparent;transform:rotateZ(50deg);background-color:#fff}.toggle-switch-figure:before{content:'';display:block;position:relative;top:-20px;right:-5px;width:35px;height:30px;border:8px solid #d4d4d2;border-radius:100%;border-right-color:transparent;border-bottom-color:transparent;transform:rotateZ(30deg);background-color:#fff}.toggle-switch-figureAlt{content:'';position:absolute;top:5px;left:2px;width:2px;height:2px;background-color:#efeeda;border-radius:100%;border:4px solid #dee1c5;box-shadow:42px -7px 0 -2px #fcfcfc,75px -10px 0 -2px #fcfcfc,54px 4px 0 -3px #fcfcfc,83px 7px 0 -1px #fcfcfc,63px 18px 0 -3px #fcfcfc,44px 28px 0 -1px #fcfcfc,78px 23px 0 -2px #fcfcfc;transform:scale(0)}.toggle-switch-figureAlt:before{content:'';position:absolute;top:-6px;left:18px;width:7px;height:7px;background-color:#efeeda;border-radius:100%;border:4px solid #dee1c5}.toggle-switch-figureAlt:after{content:'';position:absolute;top:19px;left:15px;width:2px;height:2px;background-color:#efeeda;border-radius:100%;border:4px solid #dee1c5}
</style>
<link rel="stylesheet" href="/css/bootstrap.css">
<link id="mystyle" rel="stylesheet" href="/css/style.css">
<script src="js/jquery-3.5.0.slim.min.js"></script>
<script>
function sha256(ascii) {
function rightRotate(value, amount) {
return (value>>>amount) | (value<<(32 - amount));
};
var mathPow = Math.pow;
var maxWord = mathPow(2, 32);
var lengthProperty = 'length'
var i, j; // Used as a counter across the whole file
var result = ''
var words = [];
var asciiBitLength = ascii[lengthProperty]*8;
//* caching results is optional - remove/add slash from front of this line to toggle
// Initial hash value: first 32 bits of the fractional parts of the square roots of the first 8 primes
// (we actually calculate the first 64, but extra values are just ignored)
var hash = sha256.h = sha256.h || [];
// Round constants: first 32 bits of the fractional parts of the cube roots of the first 64 primes
var k = sha256.k = sha256.k || [];
var primeCounter = k[lengthProperty];
var isComposite = {};
for (var candidate = 2; primeCounter < 64; candidate++) {
if (!isComposite[candidate]) {
for (i = 0; i < 313; i += candidate) {
isComposite[i] = candidate;
}
hash[primeCounter] = (mathPow(candidate, .5)*maxWord)|0;
k[primeCounter++] = (mathPow(candidate, 1/3)*maxWord)|0;
}
}
ascii += '\x80' // Append Ƈ' bit (plus zero padding)
while (ascii[lengthProperty]%64 - 56) ascii += '\x00' // More zero padding
for (i = 0; i < ascii[lengthProperty]; i++) {
j = ascii.charCodeAt(i);
if (j>>8) return; // ASCII check: only accept characters in range 0-255
words[i>>2] |= j << ((3 - i)%4)*8;
}
words[words[lengthProperty]] = ((asciiBitLength/maxWord)|0);
words[words[lengthProperty]] = (asciiBitLength)
// process each chunk
for (j = 0; j < words[lengthProperty];) {
var w = words.slice(j, j += 16); // The message is expanded into 64 words as part of the iteration
var oldHash = hash;
// This is now the undefinedworking hash", often labelled as variables a...g
// (we have to truncate as well, otherwise extra entries at the end accumulate
hash = hash.slice(0, 8);
for (i = 0; i < 64; i++) {
var i2 = i + j;
// Expand the message into 64 words
var w15 = w[i - 15], w2 = w[i - 2];
// Iterate
var a = hash[0], e = hash[4];
var temp1 = hash[7]
+ (rightRotate(e, 6) ^ rightRotate(e, 11) ^ rightRotate(e, 25)) // S1
+ ((e&hash[5])^((~e)&hash[6])) // ch
+ k[i]
// Expand the message schedule if needed
+ (w[i] = (i < 16) ? w[i] : (
w[i - 16]
+ (rightRotate(w15, 7) ^ rightRotate(w15, 18) ^ (w15>>>3)) // s0
+ w[i - 7]
+ (rightRotate(w2, 17) ^ rightRotate(w2, 19) ^ (w2>>>10)) // s1
)|0
);
// This is only used once, so *could* be moved below, but it only saves 4 bytes and makes things unreadble
var temp2 = (rightRotate(a, 2) ^ rightRotate(a, 13) ^ rightRotate(a, 22)) // S0
+ ((a&hash[1])^(a&hash[2])^(hash[1]&hash[2])); // maj
hash = [(temp1 + temp2)|0].concat(hash); // We don't bother trimming off the extra ones, they're harmless as long as we're truncating when we do the slice()
hash[4] = (hash[4] + temp1)|0;
}
for (i = 0; i < 8; i++) {
hash[i] = (hash[i] + oldHash[i])|0;
}
}
for (i = 0; i < 8; i++) {
for (j = 3; j + 1; j--) {
var b = (hash[i]>>(j*8))&255;
result += ((b < 16) ? 0 : '') + b.toString(16);
}
}
return result;
}
function hc_HashFunc(x) { return sha256(x); }
function hc_SetFormData(x, y)
{
var z = document.getElementById(x);
if(z) z.value = y;
}
function hc_GetFormData(x)
{
var z = document.getElementById(x);
if(z)
return z.value;
else
return '';
}
// convert hex numbers to binary strings
function hc_HexInBin(x)
{
var ret = '';
switch(x.toUpperCase())
{ case '0': ret = '0000'; break; case '1': ret = '0001'; break;
case '2': ret = '0010'; break; case '3': ret = '0011'; break;
case '4': ret = '0100'; break; case '5': ret = '0101'; break;
case '6': ret = '0110'; break; case '7': ret = '0111'; break;
case '8': ret = '1000'; break; case '9': ret = '1001'; break;
case 'A': ret = '1010'; break; case 'B': ret = '1011'; break;
case 'C': ret = '1100'; break; case 'D': ret = '1101'; break;
case 'E': ret = '1110'; break; case 'F': ret = '1111'; break;
default : ret = '0000'; }
return ret;
}
function hc_ExtractBits(hex_string, num_bits)
{
var bit_string = "";
var num_chars = Math.ceil(num_bits / 4);
for(var i = 0; i < num_chars; i++)
bit_string = bit_string + "" + hc_HexInBin(hex_string.charAt(i));
bit_string = bit_string.substr(0, num_bits);
return bit_string;
}
function hc_CheckContract(difficulty, stamp, nonce)
{
var col_hash = hc_HashFunc(stamp + nonce);
var check_bits = hc_ExtractBits(col_hash, difficulty);
return (check_bits == 0);
}
function sleep(ms) {
return new Promise(resolve => setTimeout(resolve, ms));
}
async function hc_findHash()
{
document.getElementById('freesubmitbutton').disabled = true;
document.getElementById('freeencryptbutton').disabled = true;
var hc_stamp = hc_GetFormData('hc_stamp');
var hc_difficulty = hc_GetFormData('hc_difficulty');
// check to see if we already found a solution
var form_nonce = hc_GetFormData('hc_nonce');
if (form_nonce && hc_CheckContract(hc_difficulty, hc_stamp, form_nonce)) {
document.getElementById('freeform').submit();
return true;
}
var nonce = 1;
while(!hc_CheckContract(hc_difficulty, hc_stamp, nonce))
{
nonce++;
if (nonce % 10000 == 0)
{
let remaining = Math.round((Math.pow(2, hc_difficulty) - nonce) / 10000) * 3;
document.getElementById('countdown').innerHTML = " Please wait... form submits after ~" + remaining + " work units.";
await sleep(100); // don't peg the CPU and prevent the browser from rendering these updates
}
}
hc_SetFormData('hc_nonce', nonce);
document.getElementById('countdown').innerHTML = "";
document.getElementById('freeform').submit();
return true;
}
</script>
<!-- PGP encryption -->
<script src="js/openpgp.min.js" async></script>
<script>
function showFreeForm() {
document.getElementById("freeform").style.display = "block";
document.getElementById("paidform").style.display = "none";
}
function showPaidForm() {
document.getElementById("freeform").style.display = "none";
document.getElementById("paidform").style.display = "block";
}
async function encrypt(elementId) {
if (window.crypto.getRandomValues) {
// don't allow message to be encrypted multiple times
if (document.getElementById(elementId).value.startsWith("-----BEGIN PGP MESSAGE-----")) {
return true;
}
var pub_key = await openpgp.readKey({ armoredKey:
`-----BEGIN PGP PUBLIC KEY BLOCK-----
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
NjT4rMUesCnjTVHVM9KXvMemwAhhYbM=
=QGZJ
-----END PGP PUBLIC KEY BLOCK-----`
});
var options = {
message: await openpgp.createMessage({ text: document.getElementById(elementId).value}), // input as Message object
encryptionKeys: pub_key
}
var pgp_message = await openpgp.encrypt(options);
$('#'+elementId).val(pgp_message);
} else {
$("#freeencryptbutton").val("Error");
$("#paidencryptbutton").val("Error");
window.alert("This browser isn't supported!");
return false;
}
}
</script>
<script async src="/js/ga4.js"></script>
<script>
window.dataLayer = window.dataLayer || [];
function gtag(){dataLayer.push(arguments);}
gtag('js', new Date());
gtag('config', 'G-V9T1MNTG7V');
</script>
<script type = "application/ld+json">
{
"@context": "https://schema.org",
"@type": "BreadcrumbList",
"itemListElement": [{
"@type": "ListItem",
"position": "1",
"name": "Contact Jameson Lopp",
"item": "https://www.lopp.net/contact"
}
]
}
</script>
<script async src="https://cse.google.com/cse.js?cx=02dc0a61dc7b64b05"></script>
</head>
<body>
<nav class="navbar navbar-default col-sm-offset-0 col-sm-12 col-md-offset-0 col-md-12 col-lg-offset-0 col-lg-12">
<div class="container">
<!-- Brand and toggle get grouped for better mobile display -->
<div class="navbar-header">
<button type="button" class="navbar-toggle collapsed" data-toggle="collapse" data-target="#myDefaultNavbar1" aria-expanded="false"> <span class="sr-only">Toggle navigation</span> <span class="icon-bar"></span> <span class="icon-bar"></span> <span class="icon-bar"></span> </button>
<a class="navbar-brand" href="/">Jameson Lopp</a> </div>
<div class="collapse navbar-collapse" id="myDefaultNavbar1">
<ul class="nav navbar-nav">
<li><a href="articles" title="articles">Articles</a></li>
<li><a href="presentations" title="presentations">Presentations</a></li>
<li><a href="interviews" title="interviews">Interviews</a></li>
<li><a href="projects" title="projects">Projects</a></li>
<li><a href="bitcoin-information" title="bitcoin info">Bitcoin Info</a></li>
<li><a href="lightning-information" title="lightning info">Lightning Info</a></li>
<li class="active"><a href="#" title="contact">Contact<span class="sr-only">(current)</span></a></li>
<li><input class="toggle-input" type="checkbox" aria-label="toggle dark mode" id="permanent"><label for="permanent"></label></li>
</ul>
</div>
</div>
<!-- /.container-fluid -->
</nav>
<section class="inner-background">
<div class="container">
<div class="row">
<div class="col-xs-12 text-left col-lg-offset-1 col-lg-8 col-md-offset-1 col-md-10 col-sm-offset-1 col-sm-10">
<h1>Contact</h1>
<p>Jameson's goal is to spread knowledge of crypto systems and liberating technologies. If you can offer an opportunity to reach a large audience, please use the low priority form. If you're seeking specific answers for your own understanding, please check the <a href="/bitcoin-information">educational resources page.</a> For consulting questions or high priority requests, please use the paid form.</p>
<br>
<p>Do you have a question about Bitcoin? Try <a href="https://www.delphi.ai/jameson-lopp">asking my AI bot</a> first; it has been trained upon a decade of my essays, interviews, and presentations.</p>
</div>
</div>
</div>
</section>
<div class="container">
<div class="row">
<div class="col-xs-12 col-lg-offset-1 col-lg-10 col-md-offset-1 col-md-10 col-sm-10 col-sm-offset-1">
<div style="margin: 20px;text-align:center"><button style="margin-left: 20px; margin-top: 20px" type="button" class="btn btn-success" onclick="showFreeForm()">Send Low Priority Message (Free)</button><button style="margin-left: 20px; margin-top: 20px" type="button" class="btn btn-success" onclick="showPaidForm()">Send High Priority Message ($100)</button></div>
<form id="freeform" action="contact.php" method="POST" <? if(!isset($_POST["formType"]) || $_POST["formType"] == "paid") echo 'style="display:none"';?>>
<p><span class="error">Do not contact me regarding paid promotions / press releases / reviews / social media marketing. My reputation is not for sale. Messages sent via this form are heavily filtered and may not be read, much less responded to - use the paid form if you want a guaranteed response.</span></p>
<label for="freeName">Name </label><span class="error"> <?= $nameErr; ?></span>
<input type="text" id="freeName" name="name" placeholder="Your name..." value="<?=$_POST["name"]?>">
<label for="freeEmail">Email</label><span class="error"> <?= $emailErr; ?></span>
<input type="text" id="freeEmail" name="email" placeholder="Your email address..." value="<?=$_POST["email"]?>">
<label for="freeSubject">Subject</label><span class="error"> <?= $subjectErr; ?></span>
<input type="text" id="freeSubject" name="subject" placeholder="Subject..." value="<?=$_POST["subject"]?>">
<label for="freeEmailBody">Message</label><span class="error"> <?= $messageErr; ?></span>
<textarea id="freeEmailBody" name="emailBody" placeholder="Write your message here. If it contains sensitive information, click the Encrypt Message button before submitting." style="height:200px"><?=$_POST["emailBody"]?></textarea>
<input type="hidden" name="formType" value="free">
<? hc_CreateStamp(); ?>
<button type="button" class="btn btn-success" id="freeencryptbutton" onClick="encrypt('freeEmailBody')">Encrypt Message</button>
<input type="submit" value="Submit" id="freesubmitbutton" onClick="hc_findHash();return false;"><span id="countdown" class="error"> <?= $captchaErr; ?></span>
</form>
<form id="paidform" method="POST" action="contact.php" <? if(!isset($_POST["formType"]) || $_POST["formType"] == "free") echo 'style="display:none"';?>>
<p><span class="error">Upon submitting this form you will be directed to pay an invoice for $100 USD in BTC. <b>I will not receive your message until after the payment has been confirmed</b>. After receiving your message I will strive to respond to it within 24 hours.</span></p>
<label for="paidName">Name </label><span class="error"> <?= $nameErr; ?></span>
<input type="text" id="paidName" name="name" placeholder="Your name..." value="<?=$_POST["name"]?>">
<label for="paidEmail">Email</label><span class="error"> <?= $emailErr; ?></span>
<input type="text" id="paidEmail" name="email" placeholder="Your email address..." value="<?=$_POST["email"]?>">
<label for="paidSubject">Subject</label><span class="error"> <?= $subjectErr; ?></span>
<input type="text" id="paidSubject" name="subject" placeholder="Subject..." value="<?=$_POST["subject"]?>">
<label for="paidEmailBody">Message</label><span class="error"> <?= $messageErr; ?></span>
<textarea id="paidEmailBody" name="emailBody" placeholder="Write your message here. If it contains sensitive information, click the Encrypt Message button before submitting." style="height:200px"><?=$_POST["emailBody"]?></textarea>
<input type="hidden" name="formType" value="paid">
<button type="button" class="btn btn-success" id="paidencryptbutton" onClick="encrypt('paidEmailBody')">Encrypt Message</button>
<input type="submit" value="Submit">
</form>
<br>
<br>
</div>
</div>
<div class="row">
<div class="col-lg-offset-0 col-lg-4">
</div>
<div class="col-lg-4"> </div>
</div>
</div>
<div class="section well">
<div class="container">
<div class="row">
<div class="text-left col-xs-12 col-sm-6 col-lg-6 col-md-6">
<div id="cse" style="width: 300px; height:25px; overflow:hidden">
<div class="gcse-search"></div>
</div>
</div>
<div class="text-right col-xs-12 col-sm-6 col-lg-6 col-md-6">
<a href="/contact" aria-label="Contact Jameson" class="icon-email"></a>
<a href="/pgpkey" target="_blank" rel="noopener" aria-label="Jameson's PGP Key" class="icon-pgp"></a>
<a href="https://t.me/statoshi" target="_blank" rel="noopener" aria-label="Jameson's Telegram Account" class="icon-telegram"></a>
<a href="https://keybase.io/lopp" target="_blank" rel="noopener" aria-label="Jameson's Keybase Account" class="icon-keybase"></a>
<a href="https://github.com/jlopp" target="_blank" rel="noopener" aria-label="Jameson's Github Account" class="icon-github"></a>
<a href="https://nostr.directory/p/lopp" target="_blank" rel="noopener" aria-label="Jameson's nostr Account" class="icon-nostr"></a>
<a href="https://x.com/lopp" target="_blank" rel="noopener" aria-label="Jameson's X Account" class="icon-x"></a>
<a href="https://lopp.social/" target="_blank" rel="noopener" aria-label="Jameson's Mastodon Account" class="icon-mastodon"></a>
<a href="https://www.reddit.com/user/statoshi/" target="_blank" rel="noopener" aria-label="Jameson's Reddit Account" class="icon-reddit"></a>
</div>
</div>
</div>
</div>
<footer class="text-center">
<div class="container">
<div class="row">
<div class="col-xs-12">
<p class="footer">No copyright ever. No rights reserved.</p>
</div>
</div>
</div>
</footer>
<script src="js/combined.js"></script>
</body>
</html>