cloudflare
tcp/443 tcp/80
Open service 2606:4700:3030::ac43:c94a:8443 · alpagt.org
2026-01-24 05:38
Open service 2606:4700:3030::ac43:c94a:443 · alpagt.org
2026-01-24 05:38
HTTP/1.1 200 OK
Date: Sat, 24 Jan 2026 05:38:57 GMT
Content-Type: text/html; charset=utf-8
Transfer-Encoding: chunked
Connection: close
Server: cloudflare
last-modified: Tue, 19 Aug 2025 23:22:57 GMT
access-control-allow-origin: *
expires: Sat, 24 Jan 2026 05:48:57 GMT
Cache-Control: max-age=600
Report-To: {"group":"cf-nel","max_age":604800,"endpoints":[{"url":"https://a.nel.cloudflare.com/report/v4?s=1e%2Bue2GsAJWH9Wc9jUDLERO9Q%2FAzBF4E3q5RUFqGcrbiy2t4DLrSbIVQmz7eidrwRxkRkZb9f4IJ6IFDjuPv7jiQ4MaURZSwaBROGk40eWavseYIVrU%3D"}]}
x-proxy-cache: MISS
x-github-request-id: B8E2:28B011:8A466E:8E2DA2:69745AF0
Nel: {"report_to":"cf-nel","success_fraction":0.0,"max_age":604800}
Age: 0
via: 1.1 varnish
x-served-by: cache-sin-wsat1880064-SIN
x-cache: MISS
x-cache-hits: 0
x-timer: S1769233137.891410,VS0,VE242
vary: Accept-Encoding
x-fastly-request-id: 79faac44b54c2d8858a2499312972e6dda7a3358
cf-cache-status: DYNAMIC
CF-RAY: 9c2d30017fc4f930-SIN
alt-svc: h3=":443"; ma=86400
Page title: ALPAGT
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>ALPAGT</title>
<link rel="icon" type="image/x-icon" href="images/favicon-32x32.png">
<style>
body {
display: flex;
flex-direction: column;
justify-content: center;
align-items: center;
height: 100vh;
margin: 0;
padding: 0;
overflow: hidden; /* Prevents the scroll bar */
font-family: Arial, sans-serif;
background-color: #000000;
}
.image-container {
max-width: 260px;
margin-bottom: 20px;
}
.gif-container {
max-width: 300px;
margin-top: 20px;
}
.centered-text {
font-size: 4rem;
font-weight: bold;
color: #f0f0f0;
margin-top: 80px;
}
</style>
</head>
<body>
<div class="centered-text">ALPAGT</div>
<script>
(function () {
class ParametricTubeViewer {
constructor(options = {}) {
const {
baseScale = 80,
radius = 50,
steps = 1000,
segments = 80,
backgroundColor = '#000000',
tubeColor = '#ffffff'
} = options;
this.canvas = document.createElement('canvas');
document.body.appendChild(this.canvas);
this.ctx = this.canvas.getContext('2d');
this.params = { baseScale, radius, steps, segments };
this.state = {
rotation: { x: 0, y: 0 },
scale: 0.7,
isInteracting: false,
lastPos: { x: 0, y: 0 },
pinchStartDistance: 0
};
this.backgroundColor = backgroundColor;
this.tubeColor = tubeColor;
this.tube = this.generateTube();
this.setupEventListeners();
this.resizeCanvas();
this.animate();
}
// Memoized trigonometric function to reduce repeated calculations
static trigCache = new Map();
static memoizedTrig(fn, angle) {
const key = `${fn.name}-${angle}`;
if (!this.trigCache.has(key)) {
this.trigCache.set(key, fn(angle));
}
return this.trigCache.get(key);
}
generateTube() {
const { baseScale, radius, steps, segments } = this.params;
const tube = new Array(steps + 1);
for (let t = 0; t <= steps; t++) {
const angle = (2 * Math.PI * t) / steps;
const cx = baseScale * (
Math.sin(angle) +
2 * Math.sin(2 * angle)
);
const cy = baseScale * (
Math.cos(angle) -
2 * Math.cos(2 * angle)
);
const cz = baseScale * (-Math.sin(3 * angle));
const tangent = this.computeTangent(angle, baseScale);
const { normal, binormal } = this.computeOrthogonalVectors(tangent);
tube[t] = new Array(segments);
for (let i = 0; i < segments; i++) {
const theta = (2 * Math.PI * i) / segments;
const cosTheta = Math.cos(theta);
const sinTheta = Math.sin(theta);
tube[t][i] = {
x: cx + radius * (cosTheta * normal.x + sinTheta * binormal.x),
y: cy + radius * (cosTheta * normal.y + sinTheta * binormal.y),
z: cz + radius * (cosTheta * normal.z + sinTheta * binormal.z)
};
Open service 2606:4700:3031::6815:3a3f:8443 · alpagt.org
2026-01-24 05:38
Open service 2606:4700:3031::6815:3a3f:443 · alpagt.org
2026-01-24 05:38
HTTP/1.1 200 OK
Date: Sat, 24 Jan 2026 05:38:56 GMT
Content-Type: text/html; charset=utf-8
Transfer-Encoding: chunked
Connection: close
Server: cloudflare
last-modified: Tue, 19 Aug 2025 23:22:57 GMT
access-control-allow-origin: *
expires: Sat, 24 Jan 2026 05:48:55 GMT
Cache-Control: max-age=600
Report-To: {"group":"cf-nel","max_age":604800,"endpoints":[{"url":"https://a.nel.cloudflare.com/report/v4?s=jHjnrLFqPvtMCHewSkIWsgVze81FUB34USaxRoQ2dMufQxuSKCAmRmcqubtUp7d2pNyFdqJElZEPcITgw47Ub7t0BbQkJH%2BgD8E91y6whoikxMwLrSw%3D"}]}
x-proxy-cache: MISS
x-github-request-id: 65EC:15818D:15089A7:174A602:69745AEE
Nel: {"report_to":"cf-nel","success_fraction":0.0,"max_age":604800}
via: 1.1 varnish
Age: 1
x-served-by: cache-lga21957-LGA
x-cache: HIT
x-cache-hits: 1
x-timer: S1769233137.586660,VS0,VE1
vary: Accept-Encoding
x-fastly-request-id: 6977f5199f8a72fc8b117beeb777bb7aba5dc6ca
cf-cache-status: DYNAMIC
CF-RAY: 9c2d2fff9ebcf4bf-EWR
alt-svc: h3=":443"; ma=86400
Page title: ALPAGT
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>ALPAGT</title>
<link rel="icon" type="image/x-icon" href="images/favicon-32x32.png">
<style>
body {
display: flex;
flex-direction: column;
justify-content: center;
align-items: center;
height: 100vh;
margin: 0;
padding: 0;
overflow: hidden; /* Prevents the scroll bar */
font-family: Arial, sans-serif;
background-color: #000000;
}
.image-container {
max-width: 260px;
margin-bottom: 20px;
}
.gif-container {
max-width: 300px;
margin-top: 20px;
}
.centered-text {
font-size: 4rem;
font-weight: bold;
color: #f0f0f0;
margin-top: 80px;
}
</style>
</head>
<body>
<div class="centered-text">ALPAGT</div>
<script>
(function () {
class ParametricTubeViewer {
constructor(options = {}) {
const {
baseScale = 80,
radius = 50,
steps = 1000,
segments = 80,
backgroundColor = '#000000',
tubeColor = '#ffffff'
} = options;
this.canvas = document.createElement('canvas');
document.body.appendChild(this.canvas);
this.ctx = this.canvas.getContext('2d');
this.params = { baseScale, radius, steps, segments };
this.state = {
rotation: { x: 0, y: 0 },
scale: 0.7,
isInteracting: false,
lastPos: { x: 0, y: 0 },
pinchStartDistance: 0
};
this.backgroundColor = backgroundColor;
this.tubeColor = tubeColor;
this.tube = this.generateTube();
this.setupEventListeners();
this.resizeCanvas();
this.animate();
}
// Memoized trigonometric function to reduce repeated calculations
static trigCache = new Map();
static memoizedTrig(fn, angle) {
const key = `${fn.name}-${angle}`;
if (!this.trigCache.has(key)) {
this.trigCache.set(key, fn(angle));
}
return this.trigCache.get(key);
}
generateTube() {
const { baseScale, radius, steps, segments } = this.params;
const tube = new Array(steps + 1);
for (let t = 0; t <= steps; t++) {
const angle = (2 * Math.PI * t) / steps;
const cx = baseScale * (
Math.sin(angle) +
2 * Math.sin(2 * angle)
);
const cy = baseScale * (
Math.cos(angle) -
2 * Math.cos(2 * angle)
);
const cz = baseScale * (-Math.sin(3 * angle));
const tangent = this.computeTangent(angle, baseScale);
const { normal, binormal } = this.computeOrthogonalVectors(tangent);
tube[t] = new Array(segments);
for (let i = 0; i < segments; i++) {
const theta = (2 * Math.PI * i) / segments;
const cosTheta = Math.cos(theta);
const sinTheta = Math.sin(theta);
tube[t][i] = {
x: cx + radius * (cosTheta * normal.x + sinTheta * binormal.x),
y: cy + radius * (cosTheta * normal.y + sinTheta * binormal.y),
z: cz + radius * (cosTheta * normal.z + sinTheta * binormal.z)
};
Open service 2606:4700:3030::ac43:c94a:80 · alpagt.org
2026-01-24 05:38
HTTP/1.1 301 Moved Permanently
Date: Sat, 24 Jan 2026 05:38:56 GMT
Content-Length: 0
Connection: close
Location: https://alpagt.org/
Report-To: {"group":"cf-nel","max_age":604800,"endpoints":[{"url":"https://a.nel.cloudflare.com/report/v4?s=KZ%2BHeGsCcLimKYdYlpfpVIJ%2FoKp6kM0RKl9otH%2FKQQgGJHIbqXLuAG3NpTdcZ%2FyK1AteRmZHsq9owriaq0Fn7M7czj7gy2ufOxWqpafhDL4cyeZtKy0%3D"}]}
Nel: {"report_to":"cf-nel","success_fraction":0.0,"max_age":604800}
Server: cloudflare
CF-RAY: 9c2d2fff79d04413-BOM
alt-svc: h3=":443"; ma=86400
Open service 104.21.58.63:443 · alpagt.org
2026-01-24 05:38
HTTP/1.1 200 OK
Date: Sat, 24 Jan 2026 05:38:56 GMT
Content-Type: text/html; charset=utf-8
Transfer-Encoding: chunked
Connection: close
Server: cloudflare
last-modified: Tue, 19 Aug 2025 23:22:57 GMT
access-control-allow-origin: *
expires: Sat, 24 Jan 2026 05:26:11 GMT
Cache-Control: max-age=600
Report-To: {"group":"cf-nel","max_age":604800,"endpoints":[{"url":"https://a.nel.cloudflare.com/report/v4?s=dfBQm5%2BkzPBH4sE71fMSkYyAxavAvbPzlwHj%2FX3EjIQQoGBgZ7xeFoqQy%2FFm1R0MvH4hXifaC01y4kb%2FAtmaj5DcRPNNww0D"}]}
x-proxy-cache: MISS
x-github-request-id: 9F29:1578E:1E5AE13:1ECACE1:6974559B
Nel: {"report_to":"cf-nel","success_fraction":0.0,"max_age":604800}
via: 1.1 varnish
Age: 1
x-served-by: cache-rtm-ehrd2290037-RTM
x-cache: HIT
x-cache-hits: 1
x-timer: S1769233137.702476,VS0,VE4
vary: Accept-Encoding
x-fastly-request-id: 8a688f0d24a64f1ffc54455dc7b63f05527f7855
cf-cache-status: DYNAMIC
CF-RAY: 9c2d30005fdcf5b8-AMS
alt-svc: h3=":443"; ma=86400
Page title: ALPAGT
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>ALPAGT</title>
<link rel="icon" type="image/x-icon" href="images/favicon-32x32.png">
<style>
body {
display: flex;
flex-direction: column;
justify-content: center;
align-items: center;
height: 100vh;
margin: 0;
padding: 0;
overflow: hidden; /* Prevents the scroll bar */
font-family: Arial, sans-serif;
background-color: #000000;
}
.image-container {
max-width: 260px;
margin-bottom: 20px;
}
.gif-container {
max-width: 300px;
margin-top: 20px;
}
.centered-text {
font-size: 4rem;
font-weight: bold;
color: #f0f0f0;
margin-top: 80px;
}
</style>
</head>
<body>
<div class="centered-text">ALPAGT</div>
<script>
(function () {
class ParametricTubeViewer {
constructor(options = {}) {
const {
baseScale = 80,
radius = 50,
steps = 1000,
segments = 80,
backgroundColor = '#000000',
tubeColor = '#ffffff'
} = options;
this.canvas = document.createElement('canvas');
document.body.appendChild(this.canvas);
this.ctx = this.canvas.getContext('2d');
this.params = { baseScale, radius, steps, segments };
this.state = {
rotation: { x: 0, y: 0 },
scale: 0.7,
isInteracting: false,
lastPos: { x: 0, y: 0 },
pinchStartDistance: 0
};
this.backgroundColor = backgroundColor;
this.tubeColor = tubeColor;
this.tube = this.generateTube();
this.setupEventListeners();
this.resizeCanvas();
this.animate();
}
// Memoized trigonometric function to reduce repeated calculations
static trigCache = new Map();
static memoizedTrig(fn, angle) {
const key = `${fn.name}-${angle}`;
if (!this.trigCache.has(key)) {
this.trigCache.set(key, fn(angle));
}
return this.trigCache.get(key);
}
generateTube() {
const { baseScale, radius, steps, segments } = this.params;
const tube = new Array(steps + 1);
for (let t = 0; t <= steps; t++) {
const angle = (2 * Math.PI * t) / steps;
const cx = baseScale * (
Math.sin(angle) +
2 * Math.sin(2 * angle)
);
const cy = baseScale * (
Math.cos(angle) -
2 * Math.cos(2 * angle)
);
const cz = baseScale * (-Math.sin(3 * angle));
const tangent = this.computeTangent(angle, baseScale);
const { normal, binormal } = this.computeOrthogonalVectors(tangent);
tube[t] = new Array(segments);
for (let i = 0; i < segments; i++) {
const theta = (2 * Math.PI * i) / segments;
const cosTheta = Math.cos(theta);
const sinTheta = Math.sin(theta);
tube[t][i] = {
x: cx + radius * (cosTheta * normal.x + sinTheta * binormal.x),
y: cy + radius * (cosTheta * normal.y + sinTheta * binormal.y),
z: cz + radius * (cosTheta * normal.z + sinTheta * binormal.z)
};
Open service 104.21.58.63:8443 · alpagt.org
2026-01-24 05:38
Open service 104.21.58.63:80 · alpagt.org
2026-01-24 05:38
HTTP/1.1 301 Moved Permanently
Date: Sat, 24 Jan 2026 05:38:56 GMT
Content-Length: 0
Connection: close
Location: https://alpagt.org/
Report-To: {"group":"cf-nel","max_age":604800,"endpoints":[{"url":"https://a.nel.cloudflare.com/report/v4?s=1pncT4Ndw3mb7hVj6IK0ck6S%2FzwfujsgPMosD2lG482YoCqZtOZNjCXHGqjj8g8PpDbvBLZ7CUtF0v4lv5d2BVNwgiiYmY8oPQk%3D"}]}
Nel: {"report_to":"cf-nel","success_fraction":0.0,"max_age":604800}
Server: cloudflare
CF-RAY: 9c2d2fff4819dba5-FRA
alt-svc: h3=":443"; ma=86400
Open service 172.67.201.74:80 · alpagt.org
2026-01-24 05:38
HTTP/1.1 301 Moved Permanently
Date: Sat, 24 Jan 2026 05:38:56 GMT
Content-Length: 0
Connection: close
Location: https://alpagt.org/
Report-To: {"group":"cf-nel","max_age":604800,"endpoints":[{"url":"https://a.nel.cloudflare.com/report/v4?s=ugn%2F8gAZYl19w%2Fe39388GnhSueNgFWNcb3IlU3TQ8jG2zfB2Q%2BmJ0oLh50%2BtuQPx41e78M1gtU7G4%2Bxgbo8ctE8GtJ1ap%2FskJgk%3D"}]}
Nel: {"report_to":"cf-nel","success_fraction":0.0,"max_age":604800}
Server: cloudflare
CF-RAY: 9c2d2fff3fc2a037-FRA
alt-svc: h3=":443"; ma=86400
Open service 172.67.201.74:443 · alpagt.org
2026-01-24 05:38
HTTP/1.1 200 OK
Date: Sat, 24 Jan 2026 05:38:56 GMT
Content-Type: text/html; charset=utf-8
Transfer-Encoding: chunked
Connection: close
Server: cloudflare
last-modified: Tue, 19 Aug 2025 23:22:57 GMT
access-control-allow-origin: *
expires: Sat, 24 Jan 2026 05:48:46 GMT
Cache-Control: max-age=600
Report-To: {"group":"cf-nel","max_age":604800,"endpoints":[{"url":"https://a.nel.cloudflare.com/report/v4?s=mhqr3IGBx086FkhjxghVjlQog9VuLFSIvZyNyrv%2FeTaXG3Qv8wVTsFYfv1RrY6SCMcI56DDPko4kXFgCAoym2T3qchfMCtjOUh8%3D"}]}
x-proxy-cache: MISS
x-github-request-id: 4183:3C8C9:1E0DB5F:1E7E76C:69745AE6
Nel: {"report_to":"cf-nel","success_fraction":0.0,"max_age":604800}
via: 1.1 varnish
Age: 10
x-served-by: cache-fra-eddf8230050-FRA
x-cache: HIT
x-cache-hits: 1
x-timer: S1769233137.524359,VS0,VE2
vary: Accept-Encoding
x-fastly-request-id: 4147f48fb84a6b18a1ba24fb0141a317171daa47
cf-cache-status: DYNAMIC
CF-RAY: 9c2d2fff3beb4f95-FRA
alt-svc: h3=":443"; ma=86400
Page title: ALPAGT
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>ALPAGT</title>
<link rel="icon" type="image/x-icon" href="images/favicon-32x32.png">
<style>
body {
display: flex;
flex-direction: column;
justify-content: center;
align-items: center;
height: 100vh;
margin: 0;
padding: 0;
overflow: hidden; /* Prevents the scroll bar */
font-family: Arial, sans-serif;
background-color: #000000;
}
.image-container {
max-width: 260px;
margin-bottom: 20px;
}
.gif-container {
max-width: 300px;
margin-top: 20px;
}
.centered-text {
font-size: 4rem;
font-weight: bold;
color: #f0f0f0;
margin-top: 80px;
}
</style>
</head>
<body>
<div class="centered-text">ALPAGT</div>
<script>
(function () {
class ParametricTubeViewer {
constructor(options = {}) {
const {
baseScale = 80,
radius = 50,
steps = 1000,
segments = 80,
backgroundColor = '#000000',
tubeColor = '#ffffff'
} = options;
this.canvas = document.createElement('canvas');
document.body.appendChild(this.canvas);
this.ctx = this.canvas.getContext('2d');
this.params = { baseScale, radius, steps, segments };
this.state = {
rotation: { x: 0, y: 0 },
scale: 0.7,
isInteracting: false,
lastPos: { x: 0, y: 0 },
pinchStartDistance: 0
};
this.backgroundColor = backgroundColor;
this.tubeColor = tubeColor;
this.tube = this.generateTube();
this.setupEventListeners();
this.resizeCanvas();
this.animate();
}
// Memoized trigonometric function to reduce repeated calculations
static trigCache = new Map();
static memoizedTrig(fn, angle) {
const key = `${fn.name}-${angle}`;
if (!this.trigCache.has(key)) {
this.trigCache.set(key, fn(angle));
}
return this.trigCache.get(key);
}
generateTube() {
const { baseScale, radius, steps, segments } = this.params;
const tube = new Array(steps + 1);
for (let t = 0; t <= steps; t++) {
const angle = (2 * Math.PI * t) / steps;
const cx = baseScale * (
Math.sin(angle) +
2 * Math.sin(2 * angle)
);
const cy = baseScale * (
Math.cos(angle) -
2 * Math.cos(2 * angle)
);
const cz = baseScale * (-Math.sin(3 * angle));
const tangent = this.computeTangent(angle, baseScale);
const { normal, binormal } = this.computeOrthogonalVectors(tangent);
tube[t] = new Array(segments);
for (let i = 0; i < segments; i++) {
const theta = (2 * Math.PI * i) / segments;
const cosTheta = Math.cos(theta);
const sinTheta = Math.sin(theta);
tube[t][i] = {
x: cx + radius * (cosTheta * normal.x + sinTheta * binormal.x),
y: cy + radius * (cosTheta * normal.y + sinTheta * binormal.y),
z: cz + radius * (cosTheta * normal.z + sinTheta * binormal.z)
};
Open service 2606:4700:3031::6815:3a3f:80 · alpagt.org
2026-01-24 05:38
HTTP/1.1 301 Moved Permanently
Date: Sat, 24 Jan 2026 05:38:56 GMT
Content-Length: 0
Connection: close
Location: https://alpagt.org/
Report-To: {"group":"cf-nel","max_age":604800,"endpoints":[{"url":"https://a.nel.cloudflare.com/report/v4?s=bFfa4kmqU1G3ZzGDrNQT2zRtVSt6aNRDQep7H%2FEQt4eseS367sqfPKGoKrc3TYle8qNyIhyaLJnplyAqvIKN1HMyBoCNLnMGA25MMghW0bpa0pbhETo%3D"}]}
Nel: {"report_to":"cf-nel","success_fraction":0.0,"max_age":604800}
Server: cloudflare
CF-RAY: 9c2d2fff1a47c10f-FRA
alt-svc: h3=":443"; ma=86400
Open service 172.67.201.74:8443 · alpagt.org
2026-01-24 05:38