textmode.js 0.1.2 → 0.1.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +39 -9
- package/dist/textmode.esm.js +1181 -742
- package/dist/textmode.esm.min.js +1287 -848
- package/dist/textmode.umd.js +14 -14
- package/dist/textmode.umd.min.js +14 -14
- package/dist/types/export/base/FileHandler.d.ts +1 -15
- package/dist/types/export/image/ImageDataExtractor.d.ts +3 -2
- package/dist/types/export/image/ImageExporter.d.ts +7 -6
- package/dist/types/export/image/ImageFileHandler.d.ts +0 -6
- package/dist/types/export/image/index.d.ts +1 -1
- package/dist/types/export/image/types.d.ts +2 -4
- package/dist/types/export/svg/SVGFileHandler.d.ts +0 -18
- package/dist/types/export/txt/TXTFileHandler.d.ts +0 -5
- package/dist/types/index.d.ts +1 -0
- package/dist/types/rendering/index.d.ts +4 -0
- package/dist/types/rendering/webgl/Framebuffer.d.ts +1 -1
- package/dist/types/rendering/webgl/Renderer.d.ts +63 -21
- package/dist/types/rendering/webgl/Shader.d.ts +12 -0
- package/dist/types/rendering/webgl/geometries/Line.d.ts +31 -0
- package/dist/types/rendering/webgl/geometries/Rectangle.d.ts +8 -14
- package/dist/types/rendering/webgl/shapes/LineShape.d.ts +20 -0
- package/dist/types/rendering/webgl/shapes/RectangleShape.d.ts +20 -0
- package/dist/types/rendering/webgl/shapes/Shape.d.ts +21 -0
- package/dist/types/textmode/ConversionPipeline.d.ts +9 -10
- package/dist/types/textmode/Textmodifier.d.ts +267 -3
- package/dist/types/textmode/font/TextmodeFont.d.ts +1 -1
- package/package.json +1 -1
- package/dist/types/rendering/webgl/primitives/SolidRectangle.d.ts +0 -1
- package/dist/types/textmode/font/typr/Typr.min.d.ts +0 -19
package/dist/textmode.esm.js
CHANGED
|
@@ -1,12 +1,12 @@
|
|
|
1
|
-
var
|
|
2
|
-
var
|
|
3
|
-
var
|
|
4
|
-
class
|
|
1
|
+
var iA = Object.defineProperty;
|
|
2
|
+
var sA = (n, A, e) => A in n ? iA(n, A, { enumerable: !0, configurable: !0, writable: !0, value: e }) : n[A] = e;
|
|
3
|
+
var a = (n, A, e) => sA(n, typeof A != "symbol" ? A + "" : A, e);
|
|
4
|
+
class P extends Error {
|
|
5
5
|
constructor(e, t, r = {}) {
|
|
6
|
-
const i =
|
|
6
|
+
const i = P.createFormattedMessage(e, r);
|
|
7
7
|
super(i);
|
|
8
|
-
|
|
9
|
-
|
|
8
|
+
a(this, "originalError");
|
|
9
|
+
a(this, "context");
|
|
10
10
|
this.name = "TextmodeError", this.originalError = t, this.context = r;
|
|
11
11
|
}
|
|
12
12
|
/**
|
|
@@ -18,10 +18,10 @@ class D extends Error {
|
|
|
18
18
|
r += `
|
|
19
19
|
|
|
20
20
|
📋 Context:`;
|
|
21
|
-
for (const [i,
|
|
22
|
-
const
|
|
21
|
+
for (const [i, s] of Object.entries(t)) {
|
|
22
|
+
const o = P.formatValue(s);
|
|
23
23
|
r += `
|
|
24
|
-
- ${i}: ${
|
|
24
|
+
- ${i}: ${o}`;
|
|
25
25
|
}
|
|
26
26
|
}
|
|
27
27
|
return r += `
|
|
@@ -38,24 +38,24 @@ class D extends Error {
|
|
|
38
38
|
if (typeof e == "string") return `"${e}"`;
|
|
39
39
|
if (typeof e == "number" || typeof e == "boolean") return String(e);
|
|
40
40
|
if (Array.isArray(e))
|
|
41
|
-
return e.length === 0 ? "[]" : e.length <= 5 ? `[${e.map((t) =>
|
|
41
|
+
return e.length === 0 ? "[]" : e.length <= 5 ? `[${e.map((t) => P.formatValue(t)).join(", ")}]` : `[${e.slice(0, 3).map((t) => P.formatValue(t)).join(", ")}, ... +${e.length - 3} more]`;
|
|
42
42
|
if (typeof e == "object") {
|
|
43
43
|
const t = Object.keys(e);
|
|
44
|
-
return t.length === 0 ? "{}" : t.length <= 3 ? `{ ${t.map((
|
|
44
|
+
return t.length === 0 ? "{}" : t.length <= 3 ? `{ ${t.map((s) => `${s}: ${P.formatValue(e[s])}`).join(", ")} }` : `{ ${t.slice(0, 2).map((i) => `${i}: ${P.formatValue(e[i])}`).join(", ")}, ... +${t.length - 2} more }`;
|
|
45
45
|
}
|
|
46
46
|
return String(e);
|
|
47
47
|
}
|
|
48
48
|
}
|
|
49
|
-
var
|
|
50
|
-
const
|
|
49
|
+
var oA = /* @__PURE__ */ ((n) => (n[n.SILENT = 0] = "SILENT", n[n.WARNING = 1] = "WARNING", n[n.ERROR = 2] = "ERROR", n[n.THROW = 3] = "THROW", n))(oA || {});
|
|
50
|
+
const v = class v {
|
|
51
51
|
constructor() {
|
|
52
|
-
|
|
52
|
+
a(this, "_options", {
|
|
53
53
|
globalLevel: 3
|
|
54
54
|
/* THROW */
|
|
55
55
|
});
|
|
56
56
|
}
|
|
57
57
|
static getInstance() {
|
|
58
|
-
return
|
|
58
|
+
return v._instance || (v._instance = new v()), v._instance;
|
|
59
59
|
}
|
|
60
60
|
/**
|
|
61
61
|
* Handle an error based on the configured settings
|
|
@@ -71,15 +71,15 @@ const x = class x {
|
|
|
71
71
|
return console.group(
|
|
72
72
|
`%c${r} Oops! (╯°□°)╯︵ Something went wrong in your code.`,
|
|
73
73
|
"color: #f44336; font-weight: bold; background: #ffebee; padding: 2px 6px; border-radius: 3px;"
|
|
74
|
-
), console.warn(
|
|
74
|
+
), console.warn(P.createFormattedMessage(A, e)), console.groupEnd(), !1;
|
|
75
75
|
case 2:
|
|
76
76
|
return console.group(
|
|
77
77
|
`%c${r} Oops! (╯°□°)╯︵ Something went wrong in your code.`,
|
|
78
78
|
"color: #f44336; font-weight: bold; background: #ffebee; padding: 2px 6px; border-radius: 3px;"
|
|
79
|
-
), console.error(
|
|
79
|
+
), console.error(P.createFormattedMessage(A, e)), console.groupEnd(), !1;
|
|
80
80
|
case 3:
|
|
81
81
|
default:
|
|
82
|
-
const i = new
|
|
82
|
+
const i = new P(A, t, e);
|
|
83
83
|
throw console.group(
|
|
84
84
|
`%c${r} Oops! (╯°□°)╯︵ Something went wrong in your code.`,
|
|
85
85
|
"color: #d32f2f; font-weight: bold; background: #ffcdd2; padding: 2px 6px; border-radius: 3px;"
|
|
@@ -103,19 +103,19 @@ const x = class x {
|
|
|
103
103
|
this._options.globalLevel = A;
|
|
104
104
|
}
|
|
105
105
|
};
|
|
106
|
-
|
|
107
|
-
let
|
|
108
|
-
const
|
|
109
|
-
class
|
|
106
|
+
a(v, "_instance", null);
|
|
107
|
+
let V = v;
|
|
108
|
+
const C = V.getInstance();
|
|
109
|
+
class aA {
|
|
110
110
|
constructor(A, e, t = e, r = {}) {
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
111
|
+
a(this, "gl");
|
|
112
|
+
a(this, "_framebuffer");
|
|
113
|
+
a(this, "_texture");
|
|
114
|
+
a(this, "_width");
|
|
115
|
+
a(this, "_height");
|
|
116
|
+
a(this, "options");
|
|
117
|
+
a(this, "previousState", null);
|
|
118
|
+
a(this, "_pixels", null);
|
|
119
119
|
this.gl = A, this._width = e, this._height = t, this.options = {
|
|
120
120
|
filter: "nearest",
|
|
121
121
|
wrap: "clamp",
|
|
@@ -156,7 +156,8 @@ class W {
|
|
|
156
156
|
* Resize the framebuffer
|
|
157
157
|
*/
|
|
158
158
|
resize(A, e) {
|
|
159
|
-
|
|
159
|
+
const { gl: t } = this;
|
|
160
|
+
this._width = A, this._height = e, t.bindTexture(t.TEXTURE_2D, this._texture), this.updateTextureSize(), t.bindTexture(t.TEXTURE_2D, null);
|
|
160
161
|
}
|
|
161
162
|
/**
|
|
162
163
|
* Begin rendering to this framebuffer
|
|
@@ -188,19 +189,18 @@ class W {
|
|
|
188
189
|
get(A, e, t, r) {
|
|
189
190
|
const { gl: i } = this;
|
|
190
191
|
if (A === void 0 && e === void 0) {
|
|
191
|
-
const
|
|
192
|
-
return i.bindFramebuffer(i.FRAMEBUFFER, this._framebuffer), i.readPixels(0, 0, this._width, this._height, i.RGBA, i.UNSIGNED_BYTE,
|
|
192
|
+
const s = new Uint8Array(this._width * this._height * 4), o = i.getParameter(i.FRAMEBUFFER_BINDING);
|
|
193
|
+
return i.bindFramebuffer(i.FRAMEBUFFER, this._framebuffer), i.readPixels(0, 0, this._width, this._height, i.RGBA, i.UNSIGNED_BYTE, s), i.bindFramebuffer(i.FRAMEBUFFER, o), s;
|
|
193
194
|
} else if (t === void 0 && r === void 0) {
|
|
194
195
|
(A < 0 || e < 0 || A >= this._width || e >= this._height) && (console.warn("The x and y values passed to Framebuffer.get are outside of its range and will be clamped."), A = Math.max(0, Math.min(A, this._width - 1)), e = Math.max(0, Math.min(e, this._height - 1)));
|
|
195
|
-
const
|
|
196
|
-
return i.bindFramebuffer(i.FRAMEBUFFER, this._framebuffer), i.readPixels(A, e, 1, 1, i.RGBA, i.UNSIGNED_BYTE,
|
|
196
|
+
const s = new Uint8Array(4), o = i.getParameter(i.FRAMEBUFFER_BINDING);
|
|
197
|
+
return i.bindFramebuffer(i.FRAMEBUFFER, this._framebuffer), i.readPixels(A, e, 1, 1, i.RGBA, i.UNSIGNED_BYTE, s), i.bindFramebuffer(i.FRAMEBUFFER, o), [s[0], s[1], s[2], s[3]];
|
|
197
198
|
} else {
|
|
198
199
|
A = Math.max(0, Math.min(A, this._width - 1)), e = Math.max(0, Math.min(e, this._height - 1)), t = Math.max(1, Math.min(t, this._width - A)), r = Math.max(1, Math.min(r, this._height - e));
|
|
199
|
-
const
|
|
200
|
-
return i.bindFramebuffer(i.FRAMEBUFFER, this._framebuffer), i.readPixels(A, e, t, r, i.RGBA, i.UNSIGNED_BYTE,
|
|
200
|
+
const s = new Uint8Array(t * r * 4), o = i.getParameter(i.FRAMEBUFFER_BINDING);
|
|
201
|
+
return i.bindFramebuffer(i.FRAMEBUFFER, this._framebuffer), i.readPixels(A, e, t, r, i.RGBA, i.UNSIGNED_BYTE, s), i.bindFramebuffer(i.FRAMEBUFFER, o), s;
|
|
201
202
|
}
|
|
202
203
|
}
|
|
203
|
-
// Getters
|
|
204
204
|
get framebuffer() {
|
|
205
205
|
return this._framebuffer;
|
|
206
206
|
}
|
|
@@ -217,33 +217,39 @@ class W {
|
|
|
217
217
|
return this._pixels;
|
|
218
218
|
}
|
|
219
219
|
}
|
|
220
|
-
class
|
|
221
|
-
constructor(A, e, t
|
|
220
|
+
class K {
|
|
221
|
+
constructor(A, e, t) {
|
|
222
|
+
a(this, "gl");
|
|
223
|
+
a(this, "x");
|
|
224
|
+
a(this, "y");
|
|
225
|
+
this.gl = A, this.x = e, this.y = t;
|
|
226
|
+
}
|
|
227
|
+
}
|
|
228
|
+
class y {
|
|
229
|
+
constructor(A, e, t, r, i) {
|
|
222
230
|
/** The WebGL rendering context */
|
|
223
|
-
|
|
224
|
-
/** The vertex buffer containing position and
|
|
225
|
-
|
|
231
|
+
a(this, "gl");
|
|
232
|
+
/** The vertex buffer containing position and texture coordinates */
|
|
233
|
+
a(this, "vertexBuffer");
|
|
226
234
|
/** The number of vertices in this geometry (always 6 for two triangles) */
|
|
227
|
-
|
|
228
|
-
/**
|
|
229
|
-
|
|
230
|
-
|
|
231
|
-
o(
|
|
232
|
-
|
|
233
|
-
|
|
234
|
-
|
|
235
|
-
|
|
236
|
-
|
|
237
|
-
l ? (C = t / E * 2 - 1, c = (t + i) / E * 2 - 1) : (C = 1 - t / E * 2, c = 1 - (t + i) / E * 2);
|
|
238
|
-
const f = this.generateVertices(h, C, d, c, s);
|
|
235
|
+
a(this, "vertexCount", 6);
|
|
236
|
+
/** Bytes per vertex: depends on position format (vec2 vs vec3) */
|
|
237
|
+
a(this, "bytesPerVertex");
|
|
238
|
+
this.gl = A, this.bytesPerVertex = 16;
|
|
239
|
+
const s = A.getParameter(A.VIEWPORT), o = s[2], g = s[3], B = A.getParameter(A.FRAMEBUFFER_BINDING) !== null, E = e / o * 2 - 1, Q = (e + r) / o * 2 - 1;
|
|
240
|
+
let l, c;
|
|
241
|
+
B ? (l = t / g * 2 - 1, c = (t + i) / g * 2 - 1) : (l = 1 - t / g * 2, c = 1 - (t + i) / g * 2);
|
|
242
|
+
let d, u, D, m;
|
|
243
|
+
d = E, D = Q, u = l, m = c;
|
|
244
|
+
const f = this.generateVertices(d, u, D, m);
|
|
239
245
|
this.vertexBuffer = A.createBuffer(), A.bindBuffer(A.ARRAY_BUFFER, this.vertexBuffer), A.bufferData(A.ARRAY_BUFFER, f, A.STATIC_DRAW);
|
|
240
246
|
}
|
|
241
247
|
/**
|
|
242
|
-
* Generate vertex data for the rectangle
|
|
248
|
+
* Generate vertex data for the rectangle with texture coordinates
|
|
243
249
|
* @private
|
|
244
250
|
*/
|
|
245
|
-
generateVertices(A, e, t, r
|
|
246
|
-
return
|
|
251
|
+
generateVertices(A, e, t, r) {
|
|
252
|
+
return new Float32Array([
|
|
247
253
|
A,
|
|
248
254
|
r,
|
|
249
255
|
0,
|
|
@@ -274,50 +280,197 @@ class O {
|
|
|
274
280
|
1,
|
|
275
281
|
0
|
|
276
282
|
// top-right
|
|
277
|
-
])
|
|
283
|
+
]);
|
|
284
|
+
}
|
|
285
|
+
/**
|
|
286
|
+
* Render the rectangle using position and texture coordinate attributes
|
|
287
|
+
*/
|
|
288
|
+
render() {
|
|
289
|
+
this.gl.bindBuffer(this.gl.ARRAY_BUFFER, this.vertexBuffer);
|
|
290
|
+
const A = this.gl.getParameter(this.gl.CURRENT_PROGRAM);
|
|
291
|
+
let e = this.gl.getAttribLocation(A, "a_position"), t = this.gl.getAttribLocation(A, "a_texCoord");
|
|
292
|
+
this.gl.enableVertexAttribArray(e), this.gl.vertexAttribPointer(e, 2, this.gl.FLOAT, !1, this.bytesPerVertex, 0), this.gl.enableVertexAttribArray(t), this.gl.vertexAttribPointer(t, 2, this.gl.FLOAT, !1, this.bytesPerVertex, 8), this.gl.drawArrays(this.gl.TRIANGLES, 0, this.vertexCount), this.gl.disableVertexAttribArray(e), this.gl.disableVertexAttribArray(t);
|
|
293
|
+
}
|
|
294
|
+
}
|
|
295
|
+
class nA extends K {
|
|
296
|
+
constructor(e, t, r, i, s) {
|
|
297
|
+
super(e, t, r);
|
|
298
|
+
a(this, "width");
|
|
299
|
+
a(this, "height");
|
|
300
|
+
this.width = i, this.height = s;
|
|
301
|
+
}
|
|
302
|
+
/**
|
|
303
|
+
* Render the filled rectangle using the existing Rectangle geometry.
|
|
304
|
+
*/
|
|
305
|
+
renderFill() {
|
|
306
|
+
new y(this.gl, this.x, this.y, this.width, this.height).render();
|
|
307
|
+
}
|
|
308
|
+
/**
|
|
309
|
+
* Render the stroke rectangle as four separate Rectangle instances for each edge.
|
|
310
|
+
* This approach ensures clean corners with proper overlap and leverages existing geometry.
|
|
311
|
+
* @param weight The stroke thickness in pixels
|
|
312
|
+
*/
|
|
313
|
+
renderStroke(e) {
|
|
314
|
+
if (e <= 0) return;
|
|
315
|
+
const t = new y(this.gl, this.x, this.y, this.width, e), r = new y(this.gl, this.x + this.width - e, this.y, e, this.height), i = new y(this.gl, this.x, this.y + this.height - e, this.width, e), s = new y(this.gl, this.x, this.y, e, this.height);
|
|
316
|
+
t.render(), r.render(), i.render(), s.render();
|
|
317
|
+
}
|
|
318
|
+
}
|
|
319
|
+
class gA {
|
|
320
|
+
constructor(A, e, t, r, i, s) {
|
|
321
|
+
/** The WebGL rendering context */
|
|
322
|
+
a(this, "gl");
|
|
323
|
+
/** The vertex buffer containing position and texture coordinates */
|
|
324
|
+
a(this, "vertexBuffer");
|
|
325
|
+
/** The number of vertices in this geometry (always 6 for two triangles) */
|
|
326
|
+
a(this, "vertexCount", 6);
|
|
327
|
+
/** Bytes per vertex: vec2+vec2 = 16 bytes */
|
|
328
|
+
a(this, "bytesPerVertex");
|
|
329
|
+
this.gl = A, this.bytesPerVertex = 16;
|
|
330
|
+
const o = A.getParameter(A.VIEWPORT), g = o[2], B = o[3], E = A.getParameter(A.FRAMEBUFFER_BINDING) !== null, Q = r - e, l = i - t, c = Math.sqrt(Q * Q + l * l);
|
|
331
|
+
if (c === 0) {
|
|
332
|
+
const rA = this.generateVertices(0, 0, 0, 0);
|
|
333
|
+
this.vertexBuffer = A.createBuffer(), A.bindBuffer(A.ARRAY_BUFFER, this.vertexBuffer), A.bufferData(A.ARRAY_BUFFER, rA, A.STATIC_DRAW);
|
|
334
|
+
return;
|
|
335
|
+
}
|
|
336
|
+
const d = Q / c, D = -(l / c), m = d, f = s / 2, I = e + D * f, F = t + m * f, x = e - D * f, w = t - m * f, M = r + D * f, T = i + m * f, j = r - D * f, N = i - m * f, Z = I / g * 2 - 1, q = x / g * 2 - 1, AA = M / g * 2 - 1, eA = j / g * 2 - 1;
|
|
337
|
+
let G, R, U, Y;
|
|
338
|
+
E ? (G = F / B * 2 - 1, R = w / B * 2 - 1, U = T / B * 2 - 1, Y = N / B * 2 - 1) : (G = 1 - F / B * 2, R = 1 - w / B * 2, U = 1 - T / B * 2, Y = 1 - N / B * 2);
|
|
339
|
+
const tA = this.generateLineVertices(
|
|
340
|
+
Z,
|
|
341
|
+
G,
|
|
342
|
+
q,
|
|
343
|
+
R,
|
|
344
|
+
AA,
|
|
345
|
+
U,
|
|
346
|
+
eA,
|
|
347
|
+
Y
|
|
348
|
+
);
|
|
349
|
+
this.vertexBuffer = A.createBuffer(), A.bindBuffer(A.ARRAY_BUFFER, this.vertexBuffer), A.bufferData(A.ARRAY_BUFFER, tA, A.STATIC_DRAW);
|
|
350
|
+
}
|
|
351
|
+
/**
|
|
352
|
+
* Generate vertex data for a rectangle representing the line with texture coordinates
|
|
353
|
+
* @private
|
|
354
|
+
*/
|
|
355
|
+
generateVertices(A, e, t, r) {
|
|
356
|
+
return new Float32Array([
|
|
278
357
|
A,
|
|
279
358
|
r,
|
|
359
|
+
0,
|
|
360
|
+
1,
|
|
280
361
|
// bottom-left
|
|
281
362
|
t,
|
|
282
363
|
r,
|
|
364
|
+
1,
|
|
365
|
+
1,
|
|
283
366
|
// bottom-right
|
|
284
367
|
A,
|
|
285
368
|
e,
|
|
369
|
+
0,
|
|
370
|
+
0,
|
|
286
371
|
// top-left
|
|
287
372
|
A,
|
|
288
373
|
e,
|
|
374
|
+
0,
|
|
375
|
+
0,
|
|
289
376
|
// top-left
|
|
290
377
|
t,
|
|
291
378
|
r,
|
|
379
|
+
1,
|
|
380
|
+
1,
|
|
292
381
|
// bottom-right
|
|
293
382
|
t,
|
|
294
|
-
e
|
|
383
|
+
e,
|
|
384
|
+
1,
|
|
385
|
+
0
|
|
295
386
|
// top-right
|
|
296
387
|
]);
|
|
297
388
|
}
|
|
298
389
|
/**
|
|
299
|
-
*
|
|
390
|
+
* Generate vertex data for the line rectangle with texture coordinates
|
|
391
|
+
* Uses the four corners calculated based on line direction and thickness
|
|
392
|
+
* @private
|
|
393
|
+
*/
|
|
394
|
+
generateLineVertices(A, e, t, r, i, s, o, g) {
|
|
395
|
+
return new Float32Array([
|
|
396
|
+
A,
|
|
397
|
+
e,
|
|
398
|
+
0,
|
|
399
|
+
0,
|
|
400
|
+
// corner1 (start + perpendicular)
|
|
401
|
+
t,
|
|
402
|
+
r,
|
|
403
|
+
0,
|
|
404
|
+
1,
|
|
405
|
+
// corner2 (start - perpendicular)
|
|
406
|
+
i,
|
|
407
|
+
s,
|
|
408
|
+
1,
|
|
409
|
+
0,
|
|
410
|
+
// corner3 (end + perpendicular)
|
|
411
|
+
t,
|
|
412
|
+
r,
|
|
413
|
+
0,
|
|
414
|
+
1,
|
|
415
|
+
// corner2 (start - perpendicular)
|
|
416
|
+
o,
|
|
417
|
+
g,
|
|
418
|
+
1,
|
|
419
|
+
1,
|
|
420
|
+
// corner4 (end - perpendicular)
|
|
421
|
+
i,
|
|
422
|
+
s,
|
|
423
|
+
1,
|
|
424
|
+
0
|
|
425
|
+
// corner3 (end + perpendicular)
|
|
426
|
+
]);
|
|
427
|
+
}
|
|
428
|
+
/**
|
|
429
|
+
* Render the line using position and texture coordinate attributes
|
|
300
430
|
*/
|
|
301
431
|
render() {
|
|
302
432
|
this.gl.bindBuffer(this.gl.ARRAY_BUFFER, this.vertexBuffer);
|
|
303
|
-
const A =
|
|
304
|
-
|
|
433
|
+
const A = this.gl.getParameter(this.gl.CURRENT_PROGRAM);
|
|
434
|
+
let e = this.gl.getAttribLocation(A, "a_position"), t = this.gl.getAttribLocation(A, "a_texCoord");
|
|
435
|
+
this.gl.enableVertexAttribArray(e), this.gl.vertexAttribPointer(e, 2, this.gl.FLOAT, !1, this.bytesPerVertex, 0), this.gl.enableVertexAttribArray(t), this.gl.vertexAttribPointer(t, 2, this.gl.FLOAT, !1, this.bytesPerVertex, 8), this.gl.drawArrays(this.gl.TRIANGLES, 0, this.vertexCount), this.gl.disableVertexAttribArray(e), this.gl.disableVertexAttribArray(t);
|
|
436
|
+
}
|
|
437
|
+
}
|
|
438
|
+
class BA extends K {
|
|
439
|
+
constructor(e, t, r, i, s) {
|
|
440
|
+
super(e, t, r);
|
|
441
|
+
a(this, "x2");
|
|
442
|
+
a(this, "y2");
|
|
443
|
+
this.x2 = i, this.y2 = s;
|
|
444
|
+
}
|
|
445
|
+
/**
|
|
446
|
+
* Lines don't support fill rendering - this method does nothing.
|
|
447
|
+
* Lines are rendered only with stroke properties.
|
|
448
|
+
*/
|
|
449
|
+
renderFill() {
|
|
450
|
+
}
|
|
451
|
+
/**
|
|
452
|
+
* Render the line with the specified stroke weight.
|
|
453
|
+
* @param weight The stroke thickness in pixels
|
|
454
|
+
*/
|
|
455
|
+
renderStroke(e) {
|
|
456
|
+
if (e <= 0) return;
|
|
457
|
+
new gA(this.gl, this.x, this.y, this.x2, this.y2, e).render();
|
|
305
458
|
}
|
|
306
459
|
}
|
|
307
|
-
class
|
|
460
|
+
class p {
|
|
308
461
|
constructor(A, e, t) {
|
|
309
|
-
|
|
310
|
-
|
|
311
|
-
|
|
312
|
-
|
|
313
|
-
|
|
462
|
+
a(this, "gl");
|
|
463
|
+
a(this, "program");
|
|
464
|
+
a(this, "uniformLocations", /* @__PURE__ */ new Map());
|
|
465
|
+
a(this, "attributeLocations", /* @__PURE__ */ new Map());
|
|
466
|
+
a(this, "textureUnitCounter", 0);
|
|
314
467
|
this.gl = A, this.program = this.createProgram(e, t), this.cacheLocations();
|
|
315
468
|
}
|
|
316
469
|
createProgram(A, e) {
|
|
317
470
|
const t = this.createShader(this.gl.VERTEX_SHADER, A), r = this.createShader(this.gl.FRAGMENT_SHADER, e), i = this.gl.createProgram();
|
|
318
471
|
if (this.gl.attachShader(i, t), this.gl.attachShader(i, r), this.gl.linkProgram(i), !this.gl.getProgramParameter(i, this.gl.LINK_STATUS)) {
|
|
319
|
-
const
|
|
320
|
-
throw new Error(`Shader program link error: ${
|
|
472
|
+
const s = this.gl.getProgramInfoLog(i);
|
|
473
|
+
throw new Error(`Shader program link error: ${s}`);
|
|
321
474
|
}
|
|
322
475
|
return this.gl.deleteShader(t), this.gl.deleteShader(r), i;
|
|
323
476
|
}
|
|
@@ -358,10 +511,8 @@ class w {
|
|
|
358
511
|
*/
|
|
359
512
|
setUniform(A, e) {
|
|
360
513
|
const t = this.uniformLocations.get(A);
|
|
361
|
-
if (!t)
|
|
362
|
-
console.warn(`Uniform '${A}' not found in shader`);
|
|
514
|
+
if (!t)
|
|
363
515
|
return;
|
|
364
|
-
}
|
|
365
516
|
const r = this.getUniformInfo(A);
|
|
366
517
|
if (typeof e == "number")
|
|
367
518
|
r && r.type === this.gl.INT ? this.gl.uniform1i(t, Math.floor(e)) : this.gl.uniform1f(t, e);
|
|
@@ -369,7 +520,7 @@ class w {
|
|
|
369
520
|
this.gl.uniform1i(t, e ? 1 : 0);
|
|
370
521
|
else if (Array.isArray(e))
|
|
371
522
|
if (r && (r.type === this.gl.INT_VEC2 || r.type === this.gl.INT_VEC3 || r.type === this.gl.INT_VEC4)) {
|
|
372
|
-
const i = e.map((
|
|
523
|
+
const i = e.map((s) => Math.floor(s));
|
|
373
524
|
switch (i.length) {
|
|
374
525
|
case 2:
|
|
375
526
|
this.gl.uniform2iv(t, i);
|
|
@@ -421,6 +572,24 @@ class w {
|
|
|
421
572
|
getNextTextureUnit() {
|
|
422
573
|
return this.textureUnitCounter++;
|
|
423
574
|
}
|
|
575
|
+
/**
|
|
576
|
+
* Check if this shader has a specific uniform
|
|
577
|
+
*/
|
|
578
|
+
hasUniform(A) {
|
|
579
|
+
return this.uniformLocations.has(A);
|
|
580
|
+
}
|
|
581
|
+
/**
|
|
582
|
+
* Check if this shader has a specific attribute
|
|
583
|
+
*/
|
|
584
|
+
hasAttribute(A) {
|
|
585
|
+
return this.attributeLocations.has(A);
|
|
586
|
+
}
|
|
587
|
+
/**
|
|
588
|
+
* Get the WebGL program
|
|
589
|
+
*/
|
|
590
|
+
get glProgram() {
|
|
591
|
+
return this.program;
|
|
592
|
+
}
|
|
424
593
|
/**
|
|
425
594
|
* Reset texture unit counter (useful when starting a new frame)
|
|
426
595
|
*/
|
|
@@ -428,31 +597,39 @@ class w {
|
|
|
428
597
|
this.textureUnitCounter = 0;
|
|
429
598
|
}
|
|
430
599
|
}
|
|
431
|
-
var
|
|
432
|
-
class
|
|
600
|
+
var _ = "attribute vec2 a_position;attribute vec2 a_texCoord;varying vec2 v_uv;uniform float u_rotation;uniform vec2 u_center;uniform float u_aspectRatio;mat2 rotate2D(float angle){float s=sin(angle);float c=cos(angle);return mat2(c,-s,s,c);}void main(){v_uv=a_texCoord;vec2 pos=a_position;pos-=u_center;pos.x*=u_aspectRatio;pos=rotate2D(-u_rotation)*pos;pos.x/=u_aspectRatio;pos+=u_center;gl_Position=vec4(pos,0.0,1.0);}", EA = "precision lowp float;uniform sampler2D u_texture;varying vec2 v_uv;void main(){gl_FragColor=texture2D(u_texture,v_uv);}", QA = "precision lowp float;uniform vec4 u_color;void main(){gl_FragColor=u_color;}";
|
|
601
|
+
class lA {
|
|
433
602
|
constructor(A) {
|
|
434
|
-
|
|
435
|
-
|
|
436
|
-
|
|
437
|
-
|
|
438
|
-
|
|
439
|
-
|
|
440
|
-
|
|
441
|
-
|
|
442
|
-
|
|
443
|
-
|
|
444
|
-
|
|
445
|
-
|
|
603
|
+
a(this, "gl");
|
|
604
|
+
a(this, "imageShader");
|
|
605
|
+
a(this, "solidColorShader");
|
|
606
|
+
a(this, "currentShader", null);
|
|
607
|
+
// Fill state management - default: white fill enabled
|
|
608
|
+
a(this, "currentFillColor", [1, 1, 1, 1]);
|
|
609
|
+
a(this, "fillMode", !0);
|
|
610
|
+
// Stroke state management - default: black stroke enabled, weight 1
|
|
611
|
+
a(this, "currentStrokeColor", [0, 0, 0, 1]);
|
|
612
|
+
a(this, "currentStrokeWeight", 1);
|
|
613
|
+
a(this, "strokeMode", !0);
|
|
614
|
+
// Transformation state management
|
|
615
|
+
a(this, "currentRotation", 0);
|
|
616
|
+
// in degrees
|
|
617
|
+
// State stack for push/pop functionality
|
|
618
|
+
a(this, "stateStack", []);
|
|
619
|
+
this.gl = A, this.imageShader = new p(this.gl, _, EA), this.solidColorShader = new p(this.gl, _, QA), this.gl.enable(this.gl.BLEND), this.gl.blendEquation(this.gl.FUNC_ADD), this.gl.blendFunc(this.gl.ONE, this.gl.ONE_MINUS_SRC_ALPHA);
|
|
620
|
+
}
|
|
621
|
+
/**
|
|
622
|
+
* Set the current shader
|
|
446
623
|
*/
|
|
447
624
|
shader(A) {
|
|
448
625
|
this.currentShader = A, A.use();
|
|
449
626
|
}
|
|
450
627
|
/**
|
|
451
628
|
* Sets the fill color for subsequent rendering operations
|
|
452
|
-
* @param r Red component (0-255)
|
|
453
|
-
* @param g Green component (0-255, optional)
|
|
454
|
-
* @param b Blue component (0-255, optional)
|
|
455
|
-
* @param a Alpha component (0-255, optional)
|
|
629
|
+
* @param r Red component *(0-255)*
|
|
630
|
+
* @param g Green component *(0-255, optional)*
|
|
631
|
+
* @param b Blue component *(0-255, optional)*
|
|
632
|
+
* @param a Alpha component *(0-255, optional)*
|
|
456
633
|
*/
|
|
457
634
|
fill(A, e, t, r) {
|
|
458
635
|
if (this.fillMode = !0, e === void 0 && t === void 0 && r === void 0) {
|
|
@@ -466,42 +643,146 @@ class j {
|
|
|
466
643
|
throw new Error("Invalid fill parameters. Use fill(gray), fill(r,g,b), or fill(r,g,b,a)");
|
|
467
644
|
}
|
|
468
645
|
/**
|
|
469
|
-
*
|
|
646
|
+
* Sets the stroke color for subsequent rendering operations
|
|
647
|
+
* @param r Red component *(0-255)*
|
|
648
|
+
* @param g Green component *(0-255, optional)*
|
|
649
|
+
* @param b Blue component *(0-255, optional)*
|
|
650
|
+
* @param a Alpha component *(0-255, optional)*
|
|
470
651
|
*/
|
|
471
|
-
|
|
652
|
+
stroke(A, e, t, r) {
|
|
653
|
+
if (this.strokeMode = !0, e === void 0 && t === void 0 && r === void 0) {
|
|
654
|
+
const i = A / 255;
|
|
655
|
+
this.currentStrokeColor = [i, i, i, 1];
|
|
656
|
+
} else if (t !== void 0 && r === void 0)
|
|
657
|
+
this.currentStrokeColor = [A / 255, e / 255, t / 255, 1];
|
|
658
|
+
else if (t !== void 0 && r !== void 0)
|
|
659
|
+
this.currentStrokeColor = [A / 255, e / 255, t / 255, r / 255];
|
|
660
|
+
else
|
|
661
|
+
throw new Error("Invalid stroke parameters. Use stroke(gray), stroke(r,g,b), or stroke(r,g,b,a)");
|
|
662
|
+
}
|
|
663
|
+
/**
|
|
664
|
+
* Sets the stroke weight (thickness) for subsequent stroke operations
|
|
665
|
+
* @param weight The stroke thickness in pixels
|
|
666
|
+
*/
|
|
667
|
+
strokeWeight(A) {
|
|
668
|
+
if (A < 0)
|
|
669
|
+
throw new Error("Stroke weight must be non-negative");
|
|
670
|
+
this.currentStrokeWeight = A;
|
|
671
|
+
}
|
|
672
|
+
/**
|
|
673
|
+
* Disables stroke rendering for subsequent operations
|
|
674
|
+
*/
|
|
675
|
+
noStroke() {
|
|
676
|
+
this.strokeMode = !1;
|
|
677
|
+
}
|
|
678
|
+
/**
|
|
679
|
+
* Disables fill rendering for subsequent operations
|
|
680
|
+
*/
|
|
681
|
+
noFill() {
|
|
472
682
|
this.fillMode = !1;
|
|
473
683
|
}
|
|
684
|
+
/**
|
|
685
|
+
* Sets the rotation angle for subsequent rendering operations
|
|
686
|
+
* @param degrees The rotation angle in degrees
|
|
687
|
+
*/
|
|
688
|
+
rotate(A) {
|
|
689
|
+
this.currentRotation = A;
|
|
690
|
+
}
|
|
691
|
+
/**
|
|
692
|
+
* Save the current rendering state (fill, stroke, etc.) to the state stack
|
|
693
|
+
*/
|
|
694
|
+
push() {
|
|
695
|
+
this.stateStack.push({
|
|
696
|
+
fillColor: [...this.currentFillColor],
|
|
697
|
+
fillMode: this.fillMode,
|
|
698
|
+
strokeColor: [...this.currentStrokeColor],
|
|
699
|
+
strokeWeight: this.currentStrokeWeight,
|
|
700
|
+
strokeMode: this.strokeMode,
|
|
701
|
+
rotation: this.currentRotation
|
|
702
|
+
});
|
|
703
|
+
}
|
|
704
|
+
/**
|
|
705
|
+
* Restore the most recently saved rendering state from the state stack
|
|
706
|
+
*/
|
|
707
|
+
pop() {
|
|
708
|
+
const A = this.stateStack.pop();
|
|
709
|
+
A ? (this.currentFillColor = A.fillColor, this.fillMode = A.fillMode, this.currentStrokeColor = A.strokeColor, this.currentStrokeWeight = A.strokeWeight, this.strokeMode = A.strokeMode, this.currentRotation = A.rotation) : console.warn("pop() called without matching push()");
|
|
710
|
+
}
|
|
711
|
+
/**
|
|
712
|
+
* Reset frame-specific state - called automatically after each frame.
|
|
713
|
+
* Note: This does not reset fill/stroke state as that should persist
|
|
714
|
+
* across frames and be managed by push/pop or explicit calls.
|
|
715
|
+
*/
|
|
716
|
+
reset() {
|
|
717
|
+
this.currentShader = null, this.stateStack = [], this.currentRotation = 0, this.fillMode = !0, this.strokeMode = !0, this.currentFillColor = [1, 1, 1, 1], this.currentStrokeColor = [0, 0, 0, 1], this.currentStrokeWeight = 1;
|
|
718
|
+
}
|
|
474
719
|
createShader(A, e) {
|
|
475
|
-
return new
|
|
720
|
+
return new p(this.gl, A, e);
|
|
476
721
|
}
|
|
477
722
|
/**
|
|
478
|
-
* Set a uniform value for the current shader
|
|
723
|
+
* Set a uniform value for the current shader
|
|
479
724
|
*/
|
|
480
725
|
setUniform(A, e) {
|
|
481
726
|
this.currentShader.setUniform(A, e);
|
|
482
727
|
}
|
|
483
728
|
/**
|
|
484
|
-
* Draw a rectangle with the current
|
|
729
|
+
* Draw a rectangle with the current fill and/or stroke settings
|
|
485
730
|
*/
|
|
486
731
|
rect(A, e, t, r) {
|
|
487
|
-
|
|
488
|
-
|
|
489
|
-
this.
|
|
490
|
-
|
|
491
|
-
|
|
492
|
-
|
|
493
|
-
|
|
494
|
-
|
|
495
|
-
|
|
732
|
+
const i = new nA(this.gl, A, e, t, r);
|
|
733
|
+
if (this.currentShader !== null) {
|
|
734
|
+
if (this.currentRotation !== 0) {
|
|
735
|
+
const { centerX: Q, centerY: l, radians: c, aspectRatio: d } = this.calculateRotationParams(A, e, t, r);
|
|
736
|
+
this.setUniform("u_rotation", c), this.setUniform("u_center", [Q, l]), this.setUniform("u_aspectRatio", d);
|
|
737
|
+
} else
|
|
738
|
+
this.setUniform("u_rotation", 0), this.setUniform("u_center", [0, 0]), this.setUniform("u_aspectRatio", 1);
|
|
739
|
+
i.renderFill(), this.currentShader = null;
|
|
740
|
+
return;
|
|
741
|
+
}
|
|
742
|
+
const s = this.solidColorShader, { centerX: o, centerY: g, radians: B, aspectRatio: E } = this.calculateRotationParams(A, e, t, r);
|
|
743
|
+
this.fillMode && (this.shader(s), this.setUniform("u_color", this.currentFillColor), this.setUniform("u_rotation", B), this.setUniform("u_center", [o, g]), this.setUniform("u_aspectRatio", E), i.renderFill()), this.strokeMode && (this.shader(s), this.setUniform("u_color", this.currentStrokeColor), this.setUniform("u_rotation", B), this.setUniform("u_center", [o, g]), this.setUniform("u_aspectRatio", E), i.renderStroke(this.currentStrokeWeight)), this.currentShader = null;
|
|
744
|
+
}
|
|
745
|
+
/**
|
|
746
|
+
* Draw a line from (x1, y1) to (x2, y2) with the current stroke settings.
|
|
747
|
+
* Lines only support stroke rendering - fill properties are ignored.
|
|
748
|
+
* @param x1 X-coordinate of the line start point
|
|
749
|
+
* @param y1 Y-coordinate of the line start point
|
|
750
|
+
* @param x2 X-coordinate of the line end point
|
|
751
|
+
* @param y2 Y-coordinate of the line end point
|
|
752
|
+
*/
|
|
753
|
+
line(A, e, t, r) {
|
|
754
|
+
if (!this.strokeMode) return;
|
|
755
|
+
const i = new BA(this.gl, A, e, t, r);
|
|
756
|
+
if (this.currentShader !== null) {
|
|
757
|
+
if (this.currentRotation !== 0) {
|
|
758
|
+
const u = (A + t) / 2, D = (e + r) / 2, m = Math.abs(t - A), f = Math.abs(r - e), { centerX: I, centerY: F, radians: x, aspectRatio: w } = this.calculateRotationParams(u - m / 2, D - f / 2, m, f);
|
|
759
|
+
this.setUniform("u_rotation", x), this.setUniform("u_center", [I, F]), this.setUniform("u_aspectRatio", w);
|
|
760
|
+
} else
|
|
761
|
+
this.setUniform("u_rotation", 0), this.setUniform("u_center", [0, 0]), this.setUniform("u_aspectRatio", 1);
|
|
762
|
+
i.renderStroke(this.currentStrokeWeight), this.currentShader = null;
|
|
763
|
+
return;
|
|
764
|
+
}
|
|
765
|
+
const s = this.solidColorShader, o = (A + t) / 2, g = (e + r) / 2, B = Math.abs(t - A), E = Math.abs(r - e), { centerX: Q, centerY: l, radians: c, aspectRatio: d } = this.calculateRotationParams(o - B / 2, g - E / 2, B, E);
|
|
766
|
+
this.shader(s), this.setUniform("u_color", this.currentStrokeColor), this.setUniform("u_rotation", c), this.setUniform("u_center", [Q, l]), this.setUniform("u_aspectRatio", d), i.renderStroke(this.currentStrokeWeight), this.currentShader = null;
|
|
767
|
+
}
|
|
768
|
+
/**
|
|
769
|
+
* Calculate rotation parameters for built-in shaders (NDC coordinates)
|
|
770
|
+
*/
|
|
771
|
+
calculateRotationParams(A, e, t, r) {
|
|
772
|
+
const i = this.gl.getParameter(this.gl.VIEWPORT), s = i[2], o = i[3], g = s / o, B = this.gl.getParameter(this.gl.FRAMEBUFFER_BINDING) !== null, E = A + t / 2, Q = e + r / 2, l = E / s * 2 - 1;
|
|
773
|
+
let c;
|
|
774
|
+
B ? c = Q / o * 2 - 1 : c = 1 - Q / o * 2;
|
|
775
|
+
const d = this.currentRotation * Math.PI / 180;
|
|
776
|
+
return { centerX: l, centerY: c, radians: d, aspectRatio: g };
|
|
496
777
|
}
|
|
497
778
|
/**
|
|
498
779
|
* Create a new framebuffer
|
|
499
780
|
*/
|
|
500
781
|
createFramebuffer(A, e, t = {}) {
|
|
501
|
-
return new
|
|
782
|
+
return new aA(this.gl, A, e, t);
|
|
502
783
|
}
|
|
503
784
|
/**
|
|
504
|
-
* Fill the current framebuffer with a solid color
|
|
785
|
+
* Fill the current framebuffer with a solid color
|
|
505
786
|
*/
|
|
506
787
|
background(A, e = A, t = A, r = 255) {
|
|
507
788
|
this.clear(A / 255, e / 255, t / 255, r / 255);
|
|
@@ -524,193 +805,146 @@ class j {
|
|
|
524
805
|
get context() {
|
|
525
806
|
return this.gl;
|
|
526
807
|
}
|
|
527
|
-
/**
|
|
528
|
-
* Set the blend mode for different rendering contexts
|
|
529
|
-
*/
|
|
530
|
-
setBlendMode(A) {
|
|
531
|
-
if (this.currentBlendMode !== A)
|
|
532
|
-
switch (this.currentBlendMode = A, A) {
|
|
533
|
-
case "normal":
|
|
534
|
-
this.gl.blendFunc(this.gl.SRC_ALPHA, this.gl.ONE_MINUS_SRC_ALPHA);
|
|
535
|
-
break;
|
|
536
|
-
case "premultiplied":
|
|
537
|
-
this.gl.blendFunc(this.gl.ONE, this.gl.ONE_MINUS_SRC_ALPHA);
|
|
538
|
-
break;
|
|
539
|
-
}
|
|
540
|
-
}
|
|
541
808
|
/**
|
|
542
809
|
* Render a framebuffer at a specific position with optional scaling
|
|
543
810
|
*/
|
|
544
811
|
image(A, e, t, r, i) {
|
|
545
|
-
|
|
546
|
-
this.
|
|
547
|
-
|
|
548
|
-
|
|
549
|
-
|
|
812
|
+
this.shader(this.imageShader), this.setUniform("u_texture", A.texture);
|
|
813
|
+
const { centerX: s, centerY: o, radians: g, aspectRatio: B } = this.calculateRotationParams(
|
|
814
|
+
e,
|
|
815
|
+
t,
|
|
816
|
+
r ?? A.width,
|
|
817
|
+
i ?? A.height
|
|
818
|
+
);
|
|
819
|
+
this.setUniform("u_rotation", g), this.setUniform("u_center", [s, o]), this.setUniform("u_aspectRatio", B), this.rect(e, t, r ?? A.width, i ?? A.height);
|
|
550
820
|
}
|
|
551
821
|
}
|
|
552
|
-
var
|
|
553
|
-
|
|
554
|
-
var A =
|
|
555
|
-
var
|
|
556
|
-
cmap:
|
|
557
|
-
head:
|
|
558
|
-
hhea:
|
|
559
|
-
maxp:
|
|
560
|
-
hmtx:
|
|
561
|
-
loca:
|
|
562
|
-
glyf:
|
|
563
|
-
},
|
|
564
|
-
for (var
|
|
565
|
-
var
|
|
566
|
-
if (
|
|
567
|
-
var
|
|
568
|
-
|
|
822
|
+
var h = {};
|
|
823
|
+
h.parse = function(n) {
|
|
824
|
+
var A = function(i, s, o, g) {
|
|
825
|
+
var B = h.T, E = {
|
|
826
|
+
cmap: B.cmap,
|
|
827
|
+
head: B.head,
|
|
828
|
+
hhea: B.hhea,
|
|
829
|
+
maxp: B.maxp,
|
|
830
|
+
hmtx: B.hmtx,
|
|
831
|
+
loca: B.loca,
|
|
832
|
+
glyf: B.glyf
|
|
833
|
+
}, Q = { _data: i, _index: s, _offset: o };
|
|
834
|
+
for (var l in E) {
|
|
835
|
+
var c = h.findTable(i, l, o);
|
|
836
|
+
if (c) {
|
|
837
|
+
var d = c[0], u = g[d];
|
|
838
|
+
u == null && (u = E[l].parseTab(i, d, c[1], Q)), Q[l] = g[d] = u;
|
|
569
839
|
}
|
|
570
840
|
}
|
|
571
|
-
return
|
|
572
|
-
},
|
|
573
|
-
|
|
574
|
-
var a = 4;
|
|
575
|
-
A.readUshort(t, a), a += 2, A.readUshort(t, a), a += 2;
|
|
576
|
-
var s = A.readUint(t, a);
|
|
577
|
-
a += 4;
|
|
578
|
-
for (var B = [], g = 0; g < s; g++) {
|
|
579
|
-
var E = A.readUint(t, a);
|
|
580
|
-
a += 4, B.push(e(t, g, E, r));
|
|
581
|
-
}
|
|
582
|
-
return B;
|
|
583
|
-
}
|
|
584
|
-
var l = e(t, 0, 0, r);
|
|
585
|
-
return [l];
|
|
841
|
+
return Q;
|
|
842
|
+
}, e = new Uint8Array(n), t = {}, r = A(e, 0, 0, t);
|
|
843
|
+
return [r];
|
|
586
844
|
};
|
|
587
|
-
|
|
588
|
-
for (var t =
|
|
589
|
-
var
|
|
845
|
+
h.findTable = function(n, A, e) {
|
|
846
|
+
for (var t = h.B, r = t.readUshort(n, e + 4), i = e + 12, s = 0; s < r; s++) {
|
|
847
|
+
var o = t.readASCII(n, i, 4);
|
|
590
848
|
t.readUint(n, i + 4);
|
|
591
|
-
var
|
|
592
|
-
if (
|
|
849
|
+
var g = t.readUint(n, i + 8), B = t.readUint(n, i + 12);
|
|
850
|
+
if (o == A) return [g, B];
|
|
593
851
|
i += 16;
|
|
594
852
|
}
|
|
595
853
|
return null;
|
|
596
854
|
};
|
|
597
|
-
|
|
598
|
-
|
|
599
|
-
readFixed: function(n, A) {
|
|
600
|
-
return (n[A] << 8 | n[A + 1]) + (n[A + 2] << 8 | n[A + 3]) / (256 * 256 + 4);
|
|
601
|
-
},
|
|
602
|
-
readF2dot14: function(n, A) {
|
|
603
|
-
var e = Q.B.readShort(n, A);
|
|
604
|
-
return e / 16384;
|
|
605
|
-
},
|
|
606
|
-
readInt: function(n, A) {
|
|
607
|
-
var e = Q.B.t.uint8;
|
|
608
|
-
return e[0] = n[A + 3], e[1] = n[A + 2], e[2] = n[A + 1], e[3] = n[A], Q.B.t.int32[0];
|
|
609
|
-
},
|
|
610
|
-
readInt8: function(n, A) {
|
|
611
|
-
var e = Q.B.t.uint8;
|
|
612
|
-
return e[0] = n[A], Q.B.t.int8[0];
|
|
613
|
-
},
|
|
855
|
+
h.T = {};
|
|
856
|
+
h.B = {
|
|
614
857
|
readShort: function(n, A) {
|
|
615
|
-
var e =
|
|
616
|
-
return e[0] = n[A] << 8 | n[A + 1],
|
|
858
|
+
var e = h.B.t.uint16;
|
|
859
|
+
return e[0] = n[A] << 8 | n[A + 1], h.B.t.int16[0];
|
|
617
860
|
},
|
|
618
861
|
readUshort: function(n, A) {
|
|
619
862
|
return n[A] << 8 | n[A + 1];
|
|
620
863
|
},
|
|
621
864
|
readUshorts: function(n, A, e) {
|
|
622
865
|
for (var t = [], r = 0; r < e; r++)
|
|
623
|
-
t.push(
|
|
866
|
+
t.push(h.B.readUshort(n, A + r * 2));
|
|
624
867
|
return t;
|
|
625
868
|
},
|
|
626
869
|
readUint: function(n, A) {
|
|
627
|
-
var e =
|
|
628
|
-
return e[3] = n[A], e[2] = n[A + 1], e[1] = n[A + 2], e[0] = n[A + 3],
|
|
629
|
-
},
|
|
630
|
-
readUint64: function(n, A) {
|
|
631
|
-
return Q.B.readUint(n, A) * 4294967296 + Q.B.readUint(n, A + 4);
|
|
870
|
+
var e = h.B.t.uint8;
|
|
871
|
+
return e[3] = n[A], e[2] = n[A + 1], e[1] = n[A + 2], e[0] = n[A + 3], h.B.t.uint32[0];
|
|
632
872
|
},
|
|
633
873
|
readASCII: function(n, A, e) {
|
|
634
874
|
for (var t = "", r = 0; r < e; r++) t += String.fromCharCode(n[A + r]);
|
|
635
875
|
return t;
|
|
636
876
|
},
|
|
637
|
-
|
|
638
|
-
for (var t = [], r = 0; r < e; r++) t.push(n[A + r]);
|
|
639
|
-
return t;
|
|
640
|
-
},
|
|
877
|
+
// Simplified typed array buffer - only what's needed
|
|
641
878
|
t: function() {
|
|
642
879
|
var n = new ArrayBuffer(8);
|
|
643
880
|
return {
|
|
644
|
-
buff: n,
|
|
645
|
-
int8: new Int8Array(n),
|
|
646
881
|
uint8: new Uint8Array(n),
|
|
647
882
|
int16: new Int16Array(n),
|
|
648
883
|
uint16: new Uint16Array(n),
|
|
649
|
-
int32: new Int32Array(n),
|
|
650
884
|
uint32: new Uint32Array(n)
|
|
651
885
|
};
|
|
652
886
|
}()
|
|
653
887
|
};
|
|
654
|
-
|
|
888
|
+
h.T.cmap = {
|
|
655
889
|
parseTab: function(n, A, e) {
|
|
656
890
|
var t = { tables: [], ids: {}, off: A };
|
|
657
891
|
n = new Uint8Array(n.buffer, A, e), A = 0;
|
|
658
|
-
var r =
|
|
892
|
+
var r = h.B, i = r.readUshort, s = h.T.cmap;
|
|
659
893
|
i(n, A), A += 2;
|
|
660
|
-
var
|
|
894
|
+
var o = i(n, A);
|
|
661
895
|
A += 2;
|
|
662
|
-
for (var
|
|
896
|
+
for (var g = [], B = 0; B < o; B++) {
|
|
663
897
|
var E = i(n, A);
|
|
664
898
|
A += 2;
|
|
665
|
-
var
|
|
899
|
+
var Q = i(n, A);
|
|
666
900
|
A += 2;
|
|
667
|
-
var
|
|
901
|
+
var l = r.readUint(n, A);
|
|
668
902
|
A += 4;
|
|
669
|
-
var
|
|
670
|
-
if (
|
|
671
|
-
|
|
672
|
-
var
|
|
673
|
-
|
|
674
|
-
var
|
|
675
|
-
|
|
903
|
+
var c = "p" + E + "e" + Q, d = g.indexOf(l);
|
|
904
|
+
if (d == -1) {
|
|
905
|
+
d = t.tables.length;
|
|
906
|
+
var u = {};
|
|
907
|
+
g.push(l);
|
|
908
|
+
var D = u.format = i(n, l);
|
|
909
|
+
D == 4 ? u = s.parse4(n, l, u) : D == 12 && (u = s.parse12(n, l, u)), t.tables.push(u);
|
|
676
910
|
}
|
|
677
|
-
t.ids[
|
|
911
|
+
t.ids[c] != null && console.log("multiple tables for one platform+encoding: " + c), t.ids[c] = d;
|
|
678
912
|
}
|
|
679
913
|
return t;
|
|
680
914
|
},
|
|
681
915
|
parse4: function(n, A, e) {
|
|
682
|
-
var t =
|
|
916
|
+
var t = h.B, r = t.readUshort, i = t.readUshorts, s = A;
|
|
683
917
|
A += 2;
|
|
684
|
-
var
|
|
918
|
+
var o = r(n, A);
|
|
685
919
|
A += 2, r(n, A), A += 2;
|
|
686
|
-
var
|
|
920
|
+
var g = r(n, A);
|
|
687
921
|
A += 2;
|
|
688
|
-
var
|
|
689
|
-
e.searchRange = r(n, A), A += 2, e.entrySelector = r(n, A), A += 2, e.rangeShift = r(n, A), A += 2, e.endCount = i(n, A,
|
|
690
|
-
for (var E = 0; E <
|
|
922
|
+
var B = g >>> 1;
|
|
923
|
+
e.searchRange = r(n, A), A += 2, e.entrySelector = r(n, A), A += 2, e.rangeShift = r(n, A), A += 2, e.endCount = i(n, A, B), A += B * 2, A += 2, e.startCount = i(n, A, B), A += B * 2, e.idDelta = [];
|
|
924
|
+
for (var E = 0; E < B; E++)
|
|
691
925
|
e.idDelta.push(t.readShort(n, A)), A += 2;
|
|
692
|
-
return e.idRangeOffset = i(n, A,
|
|
926
|
+
return e.idRangeOffset = i(n, A, B), A += B * 2, e.glyphIdArray = i(n, A, s + o - A >> 1), e;
|
|
693
927
|
},
|
|
694
928
|
parse12: function(n, A, e) {
|
|
695
|
-
var t =
|
|
929
|
+
var t = h.B, r = t.readUint;
|
|
696
930
|
A += 4, r(n, A), A += 4, r(n, A), A += 4;
|
|
697
931
|
var i = r(n, A) * 3;
|
|
698
932
|
A += 4;
|
|
699
|
-
for (var
|
|
700
|
-
|
|
933
|
+
for (var s = e.groups = new Uint32Array(i), o = 0; o < i; o += 3)
|
|
934
|
+
s[o] = r(n, A + (o << 2)), s[o + 1] = r(n, A + (o << 2) + 4), s[o + 2] = r(n, A + (o << 2) + 8);
|
|
701
935
|
return e;
|
|
702
936
|
}
|
|
703
937
|
};
|
|
704
|
-
|
|
938
|
+
h.T.head = {
|
|
705
939
|
parseTab: function(n, A, e) {
|
|
706
|
-
var t =
|
|
707
|
-
return
|
|
940
|
+
var t = h.B, r = {};
|
|
941
|
+
return A += 18, r.unitsPerEm = t.readUshort(n, A), A += 2, A += 16, r.xMin = t.readShort(n, A), A += 2, r.yMin = t.readShort(n, A), A += 2, r.xMax = t.readShort(n, A), A += 2, r.yMax = t.readShort(n, A), A += 2, A += 6, r.indexToLocFormat = t.readShort(n, A), r;
|
|
708
942
|
}
|
|
709
943
|
};
|
|
710
|
-
|
|
944
|
+
h.T.hhea = {
|
|
711
945
|
parseTab: function(n, A, e) {
|
|
712
|
-
var t =
|
|
713
|
-
|
|
946
|
+
var t = h.B, r = {};
|
|
947
|
+
A += 4;
|
|
714
948
|
for (var i = [
|
|
715
949
|
"ascender",
|
|
716
950
|
"descender",
|
|
@@ -728,85 +962,85 @@ Q.T.hhea = {
|
|
|
728
962
|
"res3",
|
|
729
963
|
"metricDataFormat",
|
|
730
964
|
"numberOfHMetrics"
|
|
731
|
-
],
|
|
732
|
-
var
|
|
733
|
-
r[
|
|
965
|
+
], s = 0; s < i.length; s++) {
|
|
966
|
+
var o = i[s], g = o == "advanceWidthMax" || o == "numberOfHMetrics" ? t.readUshort : t.readShort;
|
|
967
|
+
r[o] = g(n, A + s * 2);
|
|
734
968
|
}
|
|
735
969
|
return r;
|
|
736
970
|
}
|
|
737
971
|
};
|
|
738
|
-
|
|
972
|
+
h.T.hmtx = {
|
|
739
973
|
parseTab: function(n, A, e, t) {
|
|
740
|
-
for (var r =
|
|
741
|
-
|
|
742
|
-
for (;
|
|
743
|
-
i.push(
|
|
744
|
-
return { aWidth: i, lsBearing:
|
|
974
|
+
for (var r = h.B, i = [], s = [], o = t.maxp.numGlyphs, g = t.hhea.numberOfHMetrics, B = 0, E = 0, Q = 0; Q < g; )
|
|
975
|
+
B = r.readUshort(n, A + (Q << 2)), E = r.readShort(n, A + (Q << 2) + 2), i.push(B), s.push(E), Q++;
|
|
976
|
+
for (; Q < o; )
|
|
977
|
+
i.push(B), s.push(E), Q++;
|
|
978
|
+
return { aWidth: i, lsBearing: s };
|
|
745
979
|
}
|
|
746
980
|
};
|
|
747
|
-
|
|
981
|
+
h.T.maxp = {
|
|
748
982
|
parseTab: function(n, A, e) {
|
|
749
|
-
var t =
|
|
983
|
+
var t = h.B, r = t.readUshort, i = {};
|
|
750
984
|
return t.readUint(n, A), A += 4, i.numGlyphs = r(n, A), A += 2, i;
|
|
751
985
|
}
|
|
752
986
|
};
|
|
753
|
-
|
|
987
|
+
h.T.loca = {
|
|
754
988
|
parseTab: function(n, A, e, t) {
|
|
755
|
-
var r =
|
|
756
|
-
if (
|
|
757
|
-
if (
|
|
989
|
+
var r = h.B, i = [], s = t.head.indexToLocFormat, o = t.maxp.numGlyphs + 1;
|
|
990
|
+
if (s == 0) for (var g = 0; g < o; g++) i.push(r.readUshort(n, A + (g << 1)) << 1);
|
|
991
|
+
if (s == 1) for (var g = 0; g < o; g++) i.push(r.readUint(n, A + (g << 2)));
|
|
758
992
|
return i;
|
|
759
993
|
}
|
|
760
994
|
};
|
|
761
|
-
|
|
995
|
+
h.T.glyf = {
|
|
762
996
|
parseTab: function(n, A, e, t) {
|
|
763
|
-
for (var r = [], i = t.maxp.numGlyphs,
|
|
997
|
+
for (var r = [], i = t.maxp.numGlyphs, s = 0; s < i; s++) r.push(null);
|
|
764
998
|
return r;
|
|
765
999
|
},
|
|
766
1000
|
_parseGlyf: function(n, A) {
|
|
767
|
-
var e =
|
|
1001
|
+
var e = h.B, t = n._data, r = n.loca;
|
|
768
1002
|
if (r[A] == r[A + 1]) return null;
|
|
769
|
-
var i =
|
|
770
|
-
if (
|
|
771
|
-
if (
|
|
772
|
-
|
|
773
|
-
for (var
|
|
774
|
-
|
|
775
|
-
var
|
|
776
|
-
if (i += 2, t.length - i <
|
|
777
|
-
|
|
778
|
-
var
|
|
779
|
-
|
|
780
|
-
for (var
|
|
1003
|
+
var i = h.findTable(t, "glyf", n._offset)[0] + r[A], s = {};
|
|
1004
|
+
if (s.noc = e.readShort(t, i), i += 2, s.xMin = e.readShort(t, i), i += 2, s.yMin = e.readShort(t, i), i += 2, s.xMax = e.readShort(t, i), i += 2, s.yMax = e.readShort(t, i), i += 2, s.xMin >= s.xMax || s.yMin >= s.yMax) return null;
|
|
1005
|
+
if (s.noc > 0) {
|
|
1006
|
+
s.endPts = [];
|
|
1007
|
+
for (var o = 0; o < s.noc; o++)
|
|
1008
|
+
s.endPts.push(e.readUshort(t, i)), i += 2;
|
|
1009
|
+
var g = e.readUshort(t, i);
|
|
1010
|
+
if (i += 2, t.length - i < g) return null;
|
|
1011
|
+
i += g;
|
|
1012
|
+
var B = s.endPts[s.noc - 1] + 1;
|
|
1013
|
+
s.flags = [];
|
|
1014
|
+
for (var o = 0; o < B; o++) {
|
|
781
1015
|
var E = t[i];
|
|
782
|
-
if (i++,
|
|
783
|
-
var
|
|
1016
|
+
if (i++, s.flags.push(E), E & 8) {
|
|
1017
|
+
var Q = t[i];
|
|
784
1018
|
i++;
|
|
785
|
-
for (var
|
|
786
|
-
|
|
1019
|
+
for (var l = 0; l < Q; l++)
|
|
1020
|
+
s.flags.push(E), o++;
|
|
787
1021
|
}
|
|
788
1022
|
}
|
|
789
|
-
|
|
790
|
-
for (var
|
|
791
|
-
var
|
|
792
|
-
|
|
1023
|
+
s.xs = [];
|
|
1024
|
+
for (var o = 0; o < B; o++) {
|
|
1025
|
+
var c = (s.flags[o] & 2) != 0, d = (s.flags[o] & 16) != 0;
|
|
1026
|
+
c ? (s.xs.push(d ? t[i] : -t[i]), i++) : d ? s.xs.push(0) : (s.xs.push(e.readShort(t, i)), i += 2);
|
|
793
1027
|
}
|
|
794
|
-
|
|
795
|
-
for (var
|
|
796
|
-
var
|
|
797
|
-
|
|
1028
|
+
s.ys = [];
|
|
1029
|
+
for (var o = 0; o < B; o++) {
|
|
1030
|
+
var c = (s.flags[o] & 4) != 0, d = (s.flags[o] & 32) != 0;
|
|
1031
|
+
c ? (s.ys.push(d ? t[i] : -t[i]), i++) : d ? s.ys.push(0) : (s.ys.push(e.readShort(t, i)), i += 2);
|
|
798
1032
|
}
|
|
799
|
-
for (var
|
|
800
|
-
|
|
1033
|
+
for (var u = 0, D = 0, o = 0; o < B; o++)
|
|
1034
|
+
u += s.xs[o], D += s.ys[o], s.xs[o] = u, s.ys[o] = D;
|
|
801
1035
|
} else
|
|
802
|
-
|
|
803
|
-
return
|
|
1036
|
+
s.parts = [];
|
|
1037
|
+
return s;
|
|
804
1038
|
}
|
|
805
1039
|
};
|
|
806
|
-
typeof module < "u" && module.exports ? module.exports =
|
|
807
|
-
const Z = `data:font/truetype;charset=utf-8;base64,AAEAAAAKAIAAAwAgT1MvMs+QEyQAAAEoAAAAYGNtYXAg7yVJAAAFjAAACSBnbHlmuHLTdAAAErQAAGi0aGVhZFvXdUwAAACsAAAANmhoZWELAQUCAAAA5AAAACRobXR4BACDgAAAAYgAAAQEbG9jYQAy54AAAA6sAAAECG1heHABIgCCAAABCAAAACBuYW1lVs/OSgAAe2gAAAOicG9zdABpADQAAH8MAAAAIAABAAAAAQAAzOWHqV8PPPUAAAQAAAAAAHxiGCcAAAAAfGIYJwAAAAAEAAQAAAAACAACAAEAAAAAAAEAAAQAAAAAAAQAAAAAAAcAAAEAAAAAAAAAAAAAAAAAAAEBAAEAAAEBAIAAIAAAAAAAAgAAAAAAAAAAAAAAAAAAAAAAAgQAAZAABQAEAgACAAAAAAACAAIAAAACAAAzAMwAAAAABAAAAAAAAACAAACLAABw4wAAAAAAAAAAWUFMLgBAACAmawQAAAAAAAQAAAAAAAFRAAAAAAMABAAAAAAgAAAEAAAABAAAAAQAAAAEAAGABAABAAQAAIAEAACABAAAgAQAAIAEAAGABAABAAQAAQAEAACABAABAAQAAIAEAACABAABAAQAAIAEAACABAAAgAQAAIAEAACABAAAgAQAAIAEAACABAAAgAQAAIAEAACABAABAAQAAIAEAAEABAAAgAQAAIAEAACABAAAgAQAAIAEAACABAAAgAQAAIAEAACABAAAgAQAAIAEAACABAAAgAQAAIAEAACABAAAgAQAAIAEAACABAAAgAQAAIAEAACABAAAgAQAAIAEAACABAAAgAQAAIAEAACABAAAgAQAAIAEAACABAABAAQAAIAEAAEABAAAgAQAAIAEAAEABAAAgAQAAIAEAACABAAAgAQAAIAEAAEABAAAgAQAAIAEAAGABAAAgAQAAIAEAAGABAAAgAQAAIAEAACABAAAgAQAAIAEAAEABAAAgAQAAIAEAACABAAAgAQAAIAEAACABAAAgAQAAIAEAACABAABgAQAAQAEAACABAAAAAQAAgAEAACABAAAgAQAAIAEAACABAACAAQAAAAEAAIABAABgAQAAgAEAACABAAAgAQAAAAEAACABAAAAAQAAAAEAAAABAAAAAQAAAAEAAIABAADAAQAAAAEAAAABAAAgAQAAYAEAAAABAAAAAQAAIAEAAAABAAAgAQAAIAEAACABAAAAAQAAIAEAAAABAAAAAQAAIAEAAGABAAAAAQAAAAEAAAABAAAAAQAAIAEAACABAAAAAQAAIAEAACABAAAAAQAAIAEAACABAAAgAQAAAAEAACABAAAAAQAAAAEAAEABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAACAAQAAIAEAAAABAAAAAQAAAAEAACABAABAAQAAQAEAAEABAABAAQAAIAEAACABAAAAAQAAAAEAAAABAABAAQAAAAEAACABAAAAAQAAAAEAAIABAAAgAQAAAAEAAAABAAAAAQAAAAEAAAABAABgAQAAAAEAAAABAABgAQAAAAEAAGABAABgAQAAYAEAAAABAAAAAQAAAAEAAAABAABgAQAAYAEAAAABAAAAAQAAAAEAAAABAABgAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAABgAQAAAAEAAGABAABgAQAAAAEAAAABAABgAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAYAEAAAABAAAAAQAAQAEAACABAAAAAQAAAAEAAAABAAAgAQAAIAEAACABAAAgAQAAIAEAAAABAABAAQAAIAEAACABAAAgAQAAIAEAAEABAAAgAQAAIAEAACABAAAgAQAAIAEAAEABAAAgAAAAAIAAAADAAAAFAADAAEAAASaAAQEhgAAAJ4AgAAGAB4AfgCjAKUApwCsALIAtwC9AL8AxwDJANEA1gDcAOIA7wD0APcA/AD/AZIDkwOYA6MDpgOpA7EDtQPAA8QDxiAiIDwgfyCnIZUhqCIaIh8iKSJIImEiZSMCIxAjISUAJQIlDCUQJRQlGCUcJSQlLCU0JTwlbCWAJYQliCWMJZMloSWsJbIluiW8JcQlyyXZJjwmQCZCJmAmYyZmJmv//wAAACAAoQClAKcAqgCwALUAugC/AMQAyQDRANYA3ADfAOQA8QD2APkA/wGSA5MDmAOjA6YDqQOxA7QDwAPDA8YgIiA8IH8gpyGQIagiGSIeIikiSCJhImQjAiMQIyAlACUCJQwlECUUJRglHCUkJSwlNCU8JVAlgCWEJYgljCWQJaAlrCWyJbolvCXEJcsl2CY6JkAmQiZgJmMmZSZq////4v/A/7//vv+8/7n/t/+1/7T/sP+v/6j/pP+f/53/nP+b/5r/mf+X/wX9Bf0B/Pf89fzz/Oz86vzg/N783eCC4GngJ+AA3xjfBt6W3pPeit5s3lTeUt223andmtu827vbstuv26zbqdum25/bmNuR24rbd9tk22HbXttb21jbTNtC2z3bNts12y7bKNsc2rzaudq42pvamdqY2pUAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQEhgAAAJ4AgAAGAB4AfgCjAKUApwCsALIAtwC9AL8AxwDJANEA1gDcAOIA7wD0APcA/AD/AZIDkwOYA6MDpgOpA7EDtQPAA8QDxiAiIDwgfyCnIZUhqCIaIh8iKSJIImEiZSMCIxAjISUAJQIlDCUQJRQlGCUcJSQlLCU0JTwlbCWAJYQliCWMJZMloSWsJbIluiW8JcQlyyXZJjwmQCZCJmAmYyZmJmv//wAAACAAoQClAKcAqgCwALUAugC/AMQAyQDRANYA3ADfAOQA8QD2APkA/wGSA5MDmAOjA6YDqQOxA7QDwAPDA8YgIiA8IH8gpyGQIagiGSIeIikiSCJhImQjAiMQIyAlACUCJQwlECUUJRglHCUkJSwlNCU8JVAlgCWEJYgljCWQJaAlrCWyJbolvCXEJcsl2CY6JkAmQiZgJmMmZSZq////4v/A/7//vv+8/7n/t/+1/7T/sP+v/6j/pP+f/53/nP+b/5r/mf+X/wX9Bf0B/Pf89fzz/Oz86vzg/N783eCC4GngJ+AA3xjfBt6W3pPeit5s3lTeUt223andmtu827vbstuv26zbqdum25/bmNuR24rbd9tk22HbXttb21jbTNtC2z3bNts12y7bKNsc2rzaudq42pvamdqY2pUAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADgAAABwAAABIAAAAegAAALwAAADuAAAA9wAAARQAAAExAAABWgAAAW0AAAF7AAABhAAAAY0AAAGvAAAB0gAAAecAAAIOAAACNQAAAk8AAAJsAAACjgAAAqYAAALOAAAC5gAAAvQAAAMHAAADLgAAAzwAAANjAAADhQAAA6UAAAPCAAAD4AAAA/0AAAQaAAAEPAAABEwAAARrAAAEfgAABJEAAASpAAAE0AAABNsAAAT4AAAFFQAABS0AAAVDAAAFZQAABYcAAAWuAAAFvAAABc8AAAXnAAAGBAAABisAAAZDAAAGZQAABnMAAAaVAAAGowAABsUAAAbOAAAG3gAABvYAAAcMAAAHKQAABz8AAAdaAAAHbQAAB4oAAAedAAAHqwAAB8MAAAfgAAAH7gAACAsAAAgjAAAIOwAACFEAAAhsAAAIfAAACJkAAAi2AAAIzgAACOYAAAkDAAAJKgAACUIAAAlfAAAJfAAACYUAAAmiAAAJugAACdcAAAngAAAKBwAACi4AAApgAAAKeQAACokAAAq4AAAKwQAACs8AAArYAAAK8QAACw4AAAshAAALSAAAC1gAAAt1AAALjQAAC5sAAAu0AAALzQAAC9YAAAvhAAAL6gAAC/4AAAwRAAAMJAAADDQAAAxHAAAMUgAADGoAAAyCAAAMlwAADKUAAAy/AAAM0gAADN0AAAz8AAANDwAADSkAAA0yAAANTAAADVUAAA1jAAANfAAADYcAAA2VAAANqQAADcIAAA3mAAAN7wAADg4AAA4XAAAOQQAADloAAA5qAAAOcwAADoYAAA6PAAAOogAADrIAAA7FAAAPCwAADxsAAA8uAAAPRwAAD1AAAA+HAAAPoAAAD6kAAA/CAAAP3wAAD/wAABAZAAAQNgAAEE4AABBfAAAQlQAAEJ4AABCxAAAQugAAEOEAABEnAAARUwAAEWYAABF+AAARlgAAEbgAABJrAAASfgAAEpEAABKpAAASwQAAEswAABLcAAATCAAAExMAABMrAAATQwAAE1sAABNzAAATmgAAE8YAABPeAAAT5wAAE/AAABQSAAAUKgAAFEIAABRaAAAUYwAAFGwAABSOAAAUngAAFLsAABTYAAAU/wAAFSEAABVNAAAVZQAAFX0AABWVAAAVngAAFacAABXTAAAWBAAAFg0AABYvAAAWOgAAFkUAABZxAAAWhAAAFpIAABagAAAWrgAAFrwAABbVAAAW7QAAFxkAABd0AAAXzwAAF/wAABgUAAAYJQAAGC4AABhBAAAYXgAAGHEAABiYAAAYvAAAGOAAABkYAAAZPwAAGWYAABmNAAAZtAAAGdYAABn9AAAaEAAAGi0AAIBgACAAoAEAAADAAcAAAEBAQEBAQEBAYABAAAA/wAAAAEAAAD/AAQAAAD+AAAA/4AAAP8AAAAAAgEAAoADgAQAAAMABwAAAQEBAQEBAQEBAAEAAAD/AAGAAQAAAP8ABAAAAP6AAAABgAAA/oAAAAACAIAAgAQAA4AAGwAfAAABAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEAAQAAAACAAAABAAAAAIAAAP+AAAAAgAAA/4AAAP8AAAD/gAAA/wAAAP+AAAAAgAAA/4AAAACAAQAAAACAAAADgAAA/4AAAACAAAD/gAAA/4AAAP8AAAD/gAAA/4AAAACAAAD/gAAAAIAAAACAAAABAAAAAIAAAP+A/wAAAAEAAAMAgACABAAEAAAbAB8AIwAAAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAgAAgAAAAQAAAP8AAAABAAAAAIAAAP+AAAD/AAAA/4AAAP8AAAABAAAA/wAAAP+AAAAAgAAAAQD/gAAAAIAAAACAAAAAgAAABAAAAP+AAAD/gAAA/4AAAP+AAAD/gAAA/4AAAP+AAAAAgAAAAIAAAACAAAAAgAAAAIAAAACAAAD/gP+AAAAAgP8A/4AAAACAAAAABQCAAIAEAAOAAAUAHQAjACkALwAAAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQABAAAA/4AAAP+AAgABAAAA/4AAAP+AAAD/gAAA/4AAAP+AAAD/AAAAAIAAAACAAAAAgAAAAIAAAACA/YAAgAAAAIAAAP8AAoABAAAA/4AAAP+A/4AAgAAAAIAAAP8AA4AAAP8AAAAAgAAAAIAAAP+AAAD/gAAA/4AAAP+AAAD/gAAA/4AAAACAAAAAgAAAAIAAAACAAAAAgAAAAAAAAP+AAAD/gAAAAAAAAP8AAAAAgAAAAAAAAP+AAAD/gAAAAAAAAwCAAIAEAAQAABcAHQAjAAABAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAAIAAAAAgAAA/4AAAACAAAAAgAAA/4AAAACAAAD9AAAA/4AAAACAAAD/gAAAAIAAgAAAAIAAAACAAAD/AAAAAQAAAP+AAAAEAAAA/4AAAP8AAAD/gAAAAIAAAP8AAAD/gAAA/4AAAACAAAABAAAAAIAAAAEAAAAAAP+AAAD/gAAAAQD+gP8AAAAAgAAAAIAAAAABAYACgAKABAAAAwAAAQEBAQGAAQAAAP8ABAAAAP6AAAAAAAABAQAAgAMABAAAEwAAAQEBAQEBAQEBAQEBAQEBAQEBAQECAAEAAAD/gAAA/4AAAACAAAAAgAAA/wAAAP+AAAD/gAAAAIAAAACABAAAAP+AAAD/gAAA/oAAAP+AAAD/gAAAAIAAAACAAAABgAAAAIAAAAAAAAEBAACAAwAEAAATAAABAQEBAQEBAQEBAQEBAQEBAQEBAQEAAQAAAACAAAAAgAAA/4AAAP+AAAD/AAAAAIAAAACAAAD/gAAA/4AEAAAA/4AAAP+AAAD+gAAA/4AAAP+AAAAAgAAAAIAAAAGAAAAAgAAAAAAABQCAAYADgAQAAAMABwATABcAGwAAAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEAAIAAAP+AAYAAgAAA/4D/AAEAAAABAAAA/wAAAP8AAAD/AAAAAQD/gACAAAD/gAGAAIAAAP+ABAAAAP+AAAAAgAAA/4AAAAAAAAD/gAAA/4AAAP+AAAAAgAAAAIAAAP8AAAD/gAAAAIAAAP+AAAAAAAABAQAAgAOAAwAACwAAAQEBAQEBAQEBAQEBAgAAgAAAAQAAAP8AAAD/gAAA/wAAAAEAAwAAAP8AAAD/gAAA/wAAAAEAAAAAgAAAAAAAAQCAAAACAAGAAAcAAAEBAQEBAQEBAQABAAAA/4AAAP8AAAAAgAGAAAD/AAAA/4AAAACAAAAAAAABAIABgAOAAgAAAwAAAQEBAQCAAwAAAP0AAgAAAP+AAAAAAAABAQAAgAIAAYAAAwAAAQEBAQEAAQAAAP8AAYAAAP8AAAAAAAABAIAAgAQAA4AAFwAAAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAwABAAAA/4AAAP+AAAD/gAAA/4AAAP+AAAD/AAAAAIAAAACAAAAAgAAAAIAAAACAA4AAAP+AAAD/gAAA/4AAAP+AAAD/gAAA/4AAAACAAAAAgAAAAIAAAACAAAAAgAAAAAAAAwCAAIADgAQAAAsAEQAXAAABAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAAIAAAAAgAAA/4AAAP4AAAD/gAAAAIAAgAAAAIAAAACAAAD/gAAA/4AAAAEAAAAEAAAA/4AAAP2AAAD/gAAAAIAAAAKAAAAAAP8AAAAAgAAAAID/AP+AAAD/AAAAAYAAAAABAIAAgAOABAAADQAAAQEBAQEBAQEBAQEBAQEBgAEAAAABAAAA/QAAAAEAAAD/AAAAAIAAAACABAAAAP0AAAD/gAAAAIAAAAGAAAAAgAAAAIAAAAABAIAAgAOABAAAGwAAAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEAAgAAAACAAAD/gAAA/4AAAP+AAAABgAAA/QAAAACAAAAAgAAAAIAAAACAAAD/AAAA/wAAAACABAAAAP+AAAD/AAAA/4AAAP+AAAD/gAAA/4AAAACAAAAAgAAAAIAAAACAAAABAAAA/wAAAAEAAAAAAAABAIAAgAOABAAAGwAAAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEAAgAAAACAAAD/gAAAAIAAAP+AAAD+AAAA/4AAAAEAAAABAAAA/wAAAAEAAAD/AAAA/wAAAACABAAAAP+AAAD/AAAA/4AAAP8AAAD/gAAAAIAAAACAAAD/gAAAAQAAAACAAAABAAAA/4AAAACAAAAAAAABAIAAgAOABAAAEQAAAQEBAQEBAQEBAQEBAQEBAQEBAYABAAAA/4AAAP+AAAABAAAAAQAAAP8AAAD+AAAAAIAAAACABAAAAP+AAAD/gAAA/wAAAAEAAAD9gAAAAQAAAAGAAAAAgAAAAAEAgACAA4AEAAATAAABAQEBAQEBAQEBAQEBAQEBAQEBAQCAAwAAAP4AAAABgAAAAIAAAP+AAAD+AAAA/4AAAAEAAAABAAAA/gAEAAAA/4AAAP8AAAD/gAAA/wAAAP+AAAAAgAAAAIAAAP+AAAABAAAAAAAAAgCAAIADgAQAABMAFwAAAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQACAAAAAIAAAP8AAAD/AAAAAYAAAACAAAD/gAAA/gAAAP+AAAAAgACAAAABAAAABAAAAP+AAAD/gAAAAIAAAP8AAAD/gAAA/wAAAP+AAAAAgAAAAoAAAP6A/wAAAAEAAAEAgACAA4AEAAAPAAABAQEBAQEBAQEBAQEBAQEBAIADAAAA/4AAAP+AAAD/AAAAAIAAAACAAAD+gAAA/4AEAAAA/oAAAP+AAAD+gAAAAYAAAACAAAABAAAA/4AAAAAAAAMAgACAA4AEAAATABcAGwAAAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEAAgAAAACAAAD/gAAAAIAAAP+AAAD+AAAA/4AAAACAAAD/gAAAAIAAgAAAAQAAAP8AAAABAAAABAAAAP+AAAD/AAAA/4AAAP8AAAD/gAAAAIAAAAEAAAAAgAAAAQAAAAAA/wAAAAEA/oD/AAAAAQAAAAACAIAAgAOABAAACwAPAAABAQEBAQEBAQEBAQEBAQEBAQACAAAAAIAAAP8AAAD+gAAA/4AAAACAAIAAAAEAAAAEAAAA/4AAAP0AAAABAAAAAIAAAAGAAAAAAP6AAAABgAACAQABAAIAA4AAAwAHAAABAQEBAQEBAQEAAQAAAP8AAAABAAAA/wADgAAA/wAAAP+AAAD/AAAAAAIAgACAAgADgAADAAsAAAEBAQEBAQEBAQEBAQEAAQAAAP8AAAABAAAA/4AAAP8AAAAAgAOAAAD/AAAA/4AAAP8AAAD/gAAAAIAAAAABAQAAgAOABAAAGwAAAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQKAAQAAAP+AAAD/gAAA/4AAAACAAAAAgAAAAIAAAP8AAAD/gAAA/4AAAP+AAAAAgAAAAIAAAACABAAAAP+AAAD/gAAA/4AAAP+AAAD/gAAA/4AAAP+AAAAAgAAAAIAAAACAAAAAgAAAAIAAAACAAAAAAAACAIABgAOAAwAAAwAHAAABAQEBAQEBAQCAAwAAAP0AAAADAAAA/QADAAAA/4AAAP+AAAD/gAAAAAEAgACAAwAEAAAbAAABAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAIABAAAAAIAAAACAAAAAgAAA/4AAAP+AAAD/gAAA/wAAAACAAAAAgAAAAIAAAP+AAAD/gAAA/4AEAAAA/4AAAP+AAAD/gAAA/4AAAP+AAAD/gAAA/4AAAACAAAAAgAAAAIAAAACAAAAAgAAAAIAAAAAAAAIAgACAA4AEAAATABcAAAEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEAAgAAAACAAAD/gAAA/4AAAP8AAAAAgAAAAIAAAP8AAAD/AAAAAIAAgAEAAAD/AAQAAAD/gAAA/4AAAP+AAAD/gAAAAIAAAACAAAAAgAAA/4AAAACAAAD+AAAA/wAAAAACAIAAgAOABAAAEQAVAAABAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQACAAAAAIAAAP6AAAAAgAAA/wAAAAGAAAD+AAAA/4AAAACAAgAAgAAA/4AEAAAA/4AAAP6AAAABAAAAAIAAAP2AAAD/gAAAAIAAAAKAAAD+AAAA/4AAAAAAAAIAgACAA4AEAAAPABMAAAEBAQEBAQEBAQEBAQEBAQEBAQEBAYABAAAAAIAAAACAAAD/AAAA/wAAAP8AAAAAgAAAAIAAAAAAAQAAAAQAAAD/gAAA/4AAAP2AAAABAAAA/wAAAAKAAAAAgAAA/4D/AAAAAQAAAwCAAIADgAQAAAsADwATAAABAQEBAQEBAQEBAQEBAQEBAQEBAQCAAoAAAACAAAD/gAAAAIAAAP+AAAD9gAEAAAABAAAA/wAAAAEAAAAEAAAA/4AAAP8AAAD/gAAA/wAAAP+AAAADAP8AAAABAP6A/wAAAAEAAAAAAQCAAIADgAQAABMAAAEBAQEBAQEBAQEBAQEBAQEBAQEBAQACAAAAAIAAAP8AAAD/AAAAAQAAAAEAAAD/gAAA/gAAAP+AAAAAgAQAAAD/gAAA/4AAAACAAAD9gAAAAIAAAP+AAAD/gAAAAIAAAAKAAAAAAAACAIAAgAOABAAACwATAAABAQEBAQEBAQEBAQEBAQEBAQEBAQCAAgAAAACAAAAAgAAA/4AAAP+AAAD+AAEAAAAAgAAAAIAAAP+AAAAEAAAA/4AAAP+AAAD+gAAA/4AAAP+AAAADAP2AAAAAgAAAAYAAAACAAAEAgACAA4AEAAAXAAABAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAAIAAAAAgAAA/wAAAP8AAAABAAAA/wAAAAEAAAABAAAA/4AAAP4AAAD/gAAAAIAEAAAA/4AAAP+AAAAAgAAA/wAAAP+AAAD/AAAAAIAAAP+AAAD/gAAAAIAAAAKAAAAAAAABAIAAgAOABAAACQAAAQEBAQEBAQEBAQCAAwAAAP4AAAABAAAA/wAAAP8ABAAAAP+AAAD/AAAA/4AAAP6AAAAAAQCAAIADgAQAABUAAAEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAAIAAAAAgAAA/wAAAP8AAAABAAAA/4AAAAGAAAD/gAAA/gAAAP+AAAAAgAQAAAD/gAAA/4AAAACAAAD9gAAAAQAAAACAAAD+gAAA/4AAAACAAAACgAAAAAEAgACAA4AEAAALAAABAQEBAQEBAQEBAQEAgAEAAAABAAAAAQAAAP8AAAD/AAAA/wAEAAAA/gAAAAIAAAD8gAAAAQAAAP8AAAAAAAABAIAAgAOABAAACwAAAQEBAQEBAQEBAQEBAIADAAAA/wAAAAEAAAD9AAAAAQAAAP8ABAAAAP+AAAD9gAAA/4AAAACAAAACgAAAAAAAAQCAAIAEAAQAAA8AAAEBAQEBAQEBAQEBAQEBAQEBAAMAAAD/gAAA/4AAAP4AAAD/gAAAAQAAAAEAAAD+gAQAAAD/gAAA/YAAAP+AAAAAgAAAAQAAAP8AAAACgAAAAAAAAQCAAIADgAQAABsAAAEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEAgAEAAAAAgAAAAIAAAAEAAAD/gAAA/4AAAP+AAAAAgAAAAIAAAACAAAD/AAAA/4AAAP+AAAD/AAQAAAD/AAAAAIAAAACAAAD/gAAA/4AAAP+AAAD/gAAA/4AAAP+AAAD/gAAAAIAAAACAAAD/AAAAAAAAAQCAAIADgAQAAAUAAAEBAQEBAQCAAQAAAAIAAAD9AAQAAAD9AAAA/4AAAAABAIAAgAQABAAAEwAAAQEBAQEBAQEBAQEBAQEBAQEBAQEAgAEAAAAAgAAAAIAAAACAAAABAAAA/wAAAP+AAAD/gAAA/4AAAP8ABAAAAP+AAAD/gAAAAIAAAACAAAD8gAAAAgAAAP+AAAAAgAAA/gAAAAAAAAEAgACABAAEAAATAAABAQEBAQEBAQEBAQEBAQEBAQEBAQCAAQAAAACAAAAAgAAAAIAAAAEAAAD/AAAA/4AAAP+AAAD/gAAA/wAEAAAA/4AAAP+AAAD/gAAAAYAAAPyAAAABAAAAAIAAAACAAAD+AAAAAAAAAgCAAIADgAQAAAsADwAAAQEBAQEBAQEBAQEBAQEBAQEAAgAAAACAAAD/gAAA/gAAAP+AAAAAgACAAAABAAAABAAAAP+AAAD9gAAA/4AAAACAAAACgAAAAAD9gAAAAoAAAgCAAIADgAQAAAkADQAAAQEBAQEBAQEBAQEBAQEAgAKAAAAAgAAA/4AAAP6AAAD/AAEAAAABAAAABAAAAP+AAAD+gAAA/4AAAP8AAAADAP6AAAABgAAAAAIAgACABAAEAAAPABcAAAEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEAAgAAAACAAAAAgAAA/4AAAP+AAAD+AAAA/4AAAACAAIAAAAEAAAD/gAAAAIAAAAQAAAD/gAAA/gAAAP8AAAAAgAAA/4AAAACAAAACgAAAAAD9gAAAAIAAAACAAAABgAACAIAAgAOABAAAEwAXAAABAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEAgAKAAAAAgAAA/4AAAP+AAAAAgAAAAIAAAP8AAAD/gAAA/4AAAP8AAQAAAAEAAAAEAAAA/4AAAP8AAAD/gAAA/4AAAP+AAAD/gAAAAIAAAACAAAD/AAAAAwD/AAAAAQAAAQCAAIADgAQAABsAAAEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAAIAAAAAgAAA/wAAAP8AAAABgAAAAIAAAP+AAAD+AAAA/4AAAAEAAAABAAAA/oAAAP+AAAAAgAQAAAD/gAAA/4AAAACAAAD/AAAA/4AAAP8AAAD/gAAAAIAAAACAAAD/gAAAAQAAAACAAAABAAAAAAAAAQCAAIADgAQAAAcAAAEBAQEBAQEBAIADAAAA/wAAAP8AAAD/AAQAAAD/gAAA/QAAAAMAAAAAAAABAIAAgAOABAAACwAAAQEBAQEBAQEBAQEBAIABAAAAAQAAAAEAAAD/gAAA/gAAAP+ABAAAAP0AAAADAAAA/QAAAP+AAAAAgAAAAAAAAQCAAIADgAQAAA8AAAEBAQEBAQEBAQEBAQEBAQEAgAEAAAABAAAAAQAAAP+AAAD/gAAA/wAAAP+AAAD/gAQAAAD+AAAAAgAAAP4AAAD/AAAA/4AAAACAAAABAAAAAAAAAQCAAIAEAAQAABMAAAEBAQEBAQEBAQEBAQEBAQEBAQEBAIABAAAAAIAAAACAAAAAgAAAAQAAAP8AAAD/gAAA/4AAAP+AAAD/AAQAAAD+AAAAAIAAAP+AAAACAAAA/IAAAACAAAAAgAAA/4AAAP+AAAAAAAABAIAAgAOABAAAGwAAAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQCAAQAAAAEAAAABAAAA/4AAAP+AAAAAgAAAAIAAAP8AAAD/AAAA/wAAAACAAAAAgAAA/4AAAP+ABAAAAP8AAAABAAAA/wAAAP+AAAD/gAAA/4AAAP8AAAABAAAA/wAAAAEAAAAAgAAAAIAAAACAAAAAAAABAIAAgAOABAAADwAAAQEBAQEBAQEBAQEBAQEBAQCAAQAAAAEAAAABAAAA/4AAAP+AAAD/AAAA/4AAAP+ABAAAAP6AAAABgAAA/oAAAP+AAAD+gAAAAYAAAACAAAAAAAABAIAAgAOABAAAFwAAAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAIADAAAA/4AAAP+AAAD/gAAA/4AAAAIAAAD9AAAAAIAAAACAAAAAgAAAAIAAAP4ABAAAAP8AAAD/gAAA/4AAAP+AAAD/gAAA/4AAAAEAAAAAgAAAAIAAAACAAAAAgAAAAAAAAQEAAIADAAQAAAcAAAEBAQEBAQEBAQACAAAA/wAAAAEAAAD+AAQAAAD/gAAA/YAAAP+AAAAAAAABAIAAgAQAA4AAFwAAAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAIABAAAAAIAAAACAAAAAgAAAAIAAAACAAAD/AAAA/4AAAP+AAAD/gAAA/4AAAP+AA4AAAP+AAAD/gAAA/4AAAP+AAAD/gAAA/4AAAACAAAAAgAAAAIAAAACAAAAAgAAAAAAAAQEAAIADAAQAAAcAAAEBAQEBAQEBAQACAAAA/gAAAAEAAAD/AAQAAAD8gAAAAIAAAAKAAAAAAAABAIACAAQABAAAFwAAAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAgAAgAAAAIAAAACAAAAAgAAA/wAAAP+AAAD/gAAA/4AAAP8AAAAAgAAAAIAAAACABAAAAP+AAAD/gAAA/4AAAP+AAAAAgAAAAIAAAP+AAAD/gAAAAIAAAACAAAAAgAAAAAAAAQCAAIADgAEAAAMAAAEBAQEAgAMAAAD9AAEAAAD/gAAAAAAAAQEAAoACgAQAAAkAAAEBAQEBAQEBAQEBAAEAAAAAgAAA/4AAAP+AAAD/gAQAAAD/gAAA/wAAAACAAAAAgAAAAAEAgACAA4ADAAAPAAABAQEBAQEBAQEBAQEBAQEBAQACgAAA/4AAAP+AAAD/AAAAAQAAAP6AAAD/gAAAAIADAAAA/YAAAACAAAABgAAA/oAAAP+AAAAAgAAAAYAAAAAAAAIAgACAA4AEAAAJAA0AAAEBAQEBAQEBAQEBAQEBAIABAAAAAYAAAACAAAD/gAAA/YABAAAAAQAAAAQAAAD/AAAA/4AAAP6AAAD/gAAAAgD+gAAAAYAAAAABAIAAgAOAAwAAEwAAAQEBAQEBAQEBAQEBAQEBAQEBAQEBAAIAAAAAgAAA/wAAAP8AAAABAAAAAQAAAP+AAAD+AAAA/4AAAACAAwAAAP+AAAD/gAAAAIAAAP6AAAAAgAAA/4AAAP+AAAAAgAAAAYAAAAAAAAIAgACAA4AEAAAJAA0AAAEBAQEBAQEBAQEBAQEBAoABAAAA/YAAAP+AAAAAgAAAAYD/AAAAAQAAAAQAAAD8gAAAAIAAAAGAAAAAgAAA/4D+gAAAAYAAAAACAIAAgAOAAwAADQARAAABAQEBAQEBAQEBAQEBAQEBAQEBAAIAAAAAgAAA/gAAAAGAAAD+AAAA/4AAAACAAIAAAAEAAAADAAAA/4AAAP8AAAD/gAAA/4AAAACAAAABgAAAAAD/gAAAAIAAAAABAQAAgAOAA4AACwAAAQEBAQEBAQEBAQEBAYACAAAA/oAAAAEAAAD/AAAA/wAAAACAA4AAAP+AAAD/AAAA/4AAAP8AAAACgAAAAAAAAgCAAIADgAOAAA8AEwAAAQEBAQEBAQEBAQEBAQEBAQEBAQEBAAIAAAAAgAAA/4AAAP4AAAABgAAA/oAAAP+AAAAAgACAAAABAAAAA4AAAP+AAAD+AAAA/4AAAACAAAAAgAAAAIAAAAEAAAAAAP8AAAABAAABAIAAgAOABAAACwAAAQEBAQEBAQEBAQEBAIABAAAAAYAAAACAAAD/AAAA/wAAAP8ABAAAAP8AAAD/gAAA/gAAAAIAAAD+AAAAAAAAAgGAAIACgAQAAAMABwAAAQEBAQEBAQEBgAEAAAD/AAAAAQAAAP8ABAAAAP+AAAD/gAAA/YAAAAACAIAAgAOABAAAAwAPAAABAQEBAQEBAQEBAQEBAQEBAoABAAAA/wAAAAEAAAD/gAAA/gAAAP+AAAABAAAAAQAEAAAA/4AAAP+AAAD+AAAA/4AAAACAAAABAAAA/wAAAAABAIAAgAOAA4AAEwAAAQEBAQEBAQEBAQEBAQEBAQEBAQEAgAEAAAAAgAAAAQAAAP+AAAAAgAAAAIAAAP8AAAD/gAAA/4AAAP8AA4AAAP8AAAAAgAAA/4AAAP8AAAD/gAAA/4AAAACAAAAAgAAA/wAAAAAAAAEBgACAAwAEAAAHAAABAQEBAQEBAQGAAQAAAACAAAD/AAAA/4AEAAAA/QAAAP+AAAAAgAAAAAAAAQCAAIAEAAMAABMAAAEBAQEBAQEBAQEBAQEBAQEBAQEBAQABAAAAAIAAAAEAAAAAgAAA/wAAAP+AAAD/gAAA/4AAAP8AAAAAgAMAAAD/gAAAAIAAAP+AAAD+AAAAAYAAAP+AAAAAgAAA/oAAAAIAAAAAAAABAIAAgAOAAwAADwAAAQEBAQEBAQEBAQEBAQEBAQCAAQAAAACAAAABAAAAAIAAAP8AAAD/gAAA/4AAAP8AAwAAAP+AAAAAgAAA/4AAAP4AAAABgAAA/4AAAP8AAAAAAAACAIAAgAOAAwAACwAPAAABAQEBAQEBAQEBAQEBAQEBAQACAAAAAIAAAP+AAAD+AAAA/4AAAACAAIAAAAEAAAADAAAA/4AAAP6AAAD/gAAAAIAAAAGAAAAAAP6AAAABgAACAIAAgAOAAwAACQANAAABAQEBAQEBAQEBAQEBAQCAAoAAAACAAAD/gAAA/oAAAP8AAQAAAAEAAAADAAAA/4AAAP+AAAD/gAAA/wAAAAIA/4AAAACAAAAAAgCAAIAEAAMAAA0AEQAAAQEBAQEBAQEBAQEBAQEBAQEBAQACgAAAAIAAAP+AAAD/AAAA/oAAAP+AAAAAgACAAAABAAAAAwAAAP6AAAD/gAAA/4AAAAEAAAAAgAAAAIAAAAAA/4AAAACAAAAAAQEAAIADgAMAAAkAAAEBAQEBAQEBAQEBAAIAAAAAgAAA/wAAAP+AAAD/AAMAAAD/gAAA/wAAAAEAAAD+AAAAAAEAgACABAADAAATAAABAQEBAQEBAQEBAQEBAQEBAQEBAQEAAoAAAP6AAAABgAAAAIAAAP+AAAD9AAAAAgAAAP6AAAD/gAAAAIADAAAA/4AAAP+AAAD/gAAA/4AAAP+AAAAAgAAAAIAAAACAAAAAgAAAAAAAAQCAAIADgAOAABMAAAEBAQEBAQEBAQEBAQEBAQEBAQEBAQABAAAAAQAAAP8AAAAAgAAAAQAAAP+AAAD+gAAA/4AAAP+AAAAAgAOAAAD/gAAA/4AAAP6AAAAAgAAA/4AAAP+AAAAAgAAAAYAAAACAAAAAAAABAIAAgAOAAwAADwAAAQEBAQEBAQEBAQEBAQEBAQCAAQAAAACAAAAAgAAAAQAAAP+AAAD/gAAA/oAAAP+AAwAAAP4AAAAAgAAAAYAAAP2AAAAAgAAA/4AAAACAAAAAAAABAIAAgAOAAwAADwAAAQEBAQEBAQEBAQEBAQEBAQCAAQAAAAEAAAABAAAA/4AAAP+AAAD/AAAA/4AAAP+AAwAAAP6AAAABgAAA/oAAAP+AAAD/gAAAAIAAAACAAAAAAAABAIAAgAQAAwAAEwAAAQEBAQEBAQEBAQEBAQEBAQEBAQEAgAEAAAAAgAAAAIAAAACAAAABAAAA/4AAAP8AAAD/gAAA/wAAAP+AAwAAAP6AAAAAgAAA/4AAAAGAAAD+AAAA/4AAAACAAAD/gAAAAIAAAAAAAAEAgACAA4ADAAAbAAABAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAIABAAAAAQAAAAEAAAD/gAAA/4AAAACAAAAAgAAA/wAAAP8AAAD/AAAAAIAAAACAAAD/gAAA/4ADAAAA/4AAAACAAAD/gAAA/4AAAP+AAAD/gAAA/4AAAACAAAD/gAAAAIAAAACAAAAAgAAAAIAAAAAAAAEAgACAA4ADAAAPAAABAQEBAQEBAQEBAQEBAQEBAIABAAAAAQAAAAEAAAD/gAAA/gAAAAGAAAD+gAAA/4ADAAAA/wAAAAEAAAD+AAAA/4AAAACAAAAAgAAAAIAAAAAAAAEAgACAA4ADAAATAAABAQEBAQEBAQEBAQEBAQEBAQEBAQCAAwAAAP+AAAD/gAAA/4AAAAGAAAD9AAAAAIAAAACAAAAAgAAA/oADAAAA/4AAAP+AAAD/gAAA/4AAAP+AAAAAgAAAAIAAAACAAAAAgAAAAAAAAQCAAIADAAQAABMAAAEBAQEBAQEBAQEBAQEBAQEBAQEBAYABgAAA/wAAAP+AAAAAgAAAAQAAAP6AAAD/gAAA/4AAAACAAAAAgAQAAAD/gAAA/wAAAP+AAAD/AAAA/4AAAACAAAABAAAAAIAAAAEAAAAAAAABAYAAgAKABAAAAwAAAQEBAQGAAQAAAP8ABAAAAPyAAAAAAAABAQAAgAOABAAAEwAAAQEBAQEBAQEBAQEBAQEBAQEBAQEBAAGAAAAAgAAAAIAAAP+AAAD/gAAA/oAAAAEAAAAAgAAA/4AAAP8ABAAAAP+AAAD/AAAA/4AAAP8AAAD/gAAAAIAAAAEAAAAAgAAAAQAAAAAAAAEAgAGAA4ADAAAPAAABAQEBAQEBAQEBAQEBAQEBAQABAAAAAQAAAACAAAD/gAAA/wAAAP8AAAD/gAAAAIADAAAA/4AAAACAAAD/AAAA/4AAAACAAAD/gAAAAQAAAAAAAAEAAAAABAAEAAATAAABAQEBAQEBAQEBAQEBAQEBAQEBAQAAAYAAAAEAAAAAgAAAAIAAAACAAAD/AAAA/4AAAP+AAAD/AAAA/wAEAAAA/4AAAP+AAAD/gAAA/wAAAP6AAAABAAAAAQAAAACAAAAAgAAAAAAAAQIAAAAEAAQAAAMAAAEBAQECAAIAAAD+AAQAAAD8AAAAAAAAAgCAAIADgAQAABcAGwAAAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQGAAYAAAP8AAAABAAAA/4AAAP+AAAABgAAA/QAAAACAAAAAgAAA/wAAAACAAAAAgAGAAIAAAP+ABAAAAP+AAAD/AAAA/4AAAP+AAAD/gAAA/4AAAACAAAAAgAAAAIAAAACAAAABAAAAAAAAAP+AAAAAAQCAAIADgAQAABsAAAEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEAgAEAAAABAAAAAQAAAP+AAAAAgAAA/wAAAAEAAAD/AAAA/wAAAP8AAAABAAAA/wAAAACAAAD/gAQAAAD+gAAAAYAAAP8AAAD/gAAA/4AAAP+AAAD/gAAA/4AAAACAAAAAgAAAAIAAAACAAAAAgAAAAAAABACAAIAEAAQAABcAGwAfACMAAAEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEAAoAAAP4AAAABgAAAAIAAAACAAAD/gAAA/YAAAAIAAAD+gAAA/4AAAP+AAAAAgAEAAAAAgAAAAQAAgAAA/4D9AACAAAD/gAQAAAD/gAAA/4AAAP+AAAD/gAAA/wAAAP+AAAAAgAAAAIAAAACAAAAAgAAAAQAAAP8A/4AAAACAAQAAAP+AAAD+gAAA/4AAAAAEAIAAgAQAA4AAAwAHAAsADwAAAQEBAQEBAQEBAQEBAQEBAQCAAIAAAP+AAQAAgAAA/4ABAACAAAD/gAEAAIAAAP+AA4AAAP0AAAADAAAA/QAAAAMAAAD9AAAAAwAAAP0AAAAAAQIAAAAEAAQAAAkAAAEBAQEBAQEBAQEDgACAAAD+AAAAAIAAAACAAAAAgAQAAAD8AAAAAQAAAAEAAAABAAAAAAgAAAAABAAEAAADAAcACwAPABMAFwAbAB8AAAEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAAABAAAA/wACAAEAAAD/AP8AAQAAAP8AAgABAAAA/wD9AAEAAAD/AAIAAQAAAP8A/wABAAAA/wACAAEAAAD/AAQAAAD/AAAAAQAAAP8AAAAAAAAA/wAAAAEAAAD/AAAAAAAAAP8AAAABAAAA/wAAAAAAAAD/AAAAAQAAAP8AAAAAAQIAAAADAAQAAAMAAAEBAQECAAEAAAD/AAQAAAD8AAAAAAAAAgGAAIACgAQAAAMABwAAAQEBAQEBAQEBgAEAAAD/AAAAAQAAAP8ABAAAAP6AAAD/gAAA/oAAAAABAgAAAAQAAgAAAwAAAQEBAQIAAgAAAP4AAgAAAP4AAAAAAAAEAIAAAAQABAAAAwAHAAsADwAAAQEBAQEBAQEBAQEBAQEBAQCAAIAAAP+AAQAAgAAA/4ABAACAAAD/gAEAAIAAAP+ABAAAAPwAAAAEAAAA/AAAAAQAAAD8AAAABAAAAPwAAAAAAQCAAIADgAOAABMAAAEBAQEBAQEBAQEBAQEBAQEBAQEBAoABAAAA/oAAAP+AAAD/gAAA/4AAAACAAAAAgAAAAIAAAAEAAAD/gAOAAAD+AAAA/wAAAACAAAAAgAAAAIAAAACAAAAAgAAA/wAAAAEAAAAAAAABAAAAAAQABAAACwAAAQEBAQEBAQEBAQEBAAAEAAAA/gAAAP+AAAD/gAAA/4AAAP+ABAAAAPwAAAAAgAAAAIAAAACAAAAAgAAAAAAAAQCAAIAEAAOAABsAAAEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEAgACAAAAAgAAAAIAAAACAAAAAgAAAAIAAAACAAAD/gAAA/4AAAP+AAAD/gAAA/4AAAP+AAAD/gAOAAAD/gAAAAIAAAP8AAAABAAAA/oAAAAGAAAD9AAAAAIAAAP+AAAABAAAA/wAAAAGAAAD+gAAAAAAAAQAAAAACAAQAAAkAAAEBAQEBAQEBAQEAAACAAAAAgAAAAIAAAACAAAD+AAQAAAD/AAAA/wAAAP8AAAD/AAAAAAEAAAAABAAEAAATAAABAQEBAQEBAQEBAQEBAQEBAQEBAQKAAYAAAP8AAAD/AAAA/4AAAP+AAAD/AAAAAIAAAACAAAAAgAAAAQAEAAAA/wAAAP+AAAD/gAAA/wAAAP8AAAABgAAAAQAAAACAAAAAgAAAAAAAAQAAAAAEAAIAAA8AAAEBAQEBAQEBAQEBAQEBAQEBgAEAAAAAgAAAAIAAAACAAAD8AAAAAIAAAACAAAAAgAIAAAD/gAAA/4AAAP+AAAD/gAAAAIAAAACAAAAAgAAAAAAAAgAAAAAEAAQAAAMABwAAAQEBAQEBAQEAAAIAAAD+AAIAAgAAAP4ABAAAAP4AAAAAAAAA/gAAAAAEAAACAAQABAAAAwAHAAsADwAAAQEBAQEBAQEBAQEBAQEBAQAAAQAAAP8AAgABAAAA/wD/AAEAAAD/AAIAAQAAAP8ABAAAAP8AAAABAAAA/wAAAAAAAAD/AAAAAQAAAP8AAAAABAIAAAAEAAQAAAMABwALAA8AAAEBAQEBAQEBAQEBAQEBAQECAAEAAAD/AAEAAQAAAP8A/wABAAAA/wABAAEAAAD/AAQAAAD/AAAAAAAAAP8AAAAAAAAA/wAAAAAAAAD/AAAAAAEDAAAABAAEAAADAAABAQEBAwABAAAA/wAEAAAA/AAAAAAAAAEAAAAABAAEAAAFAAABAQEBAQEAAAQAAAD9AAAA/wAEAAAA/wAAAP0AAAAAAQAAAAABAAQAAAMAAAEBAQEAAAEAAAD/AAQAAAD8AAAAAAAAAwCAAIADAAOAAAMABwALAAABAQEBAQEBAQEBAQEAgACAAAD/gAEAAIAAAP+AAQAAgAAA/4ADgAAA/QAAAAMAAAD9AAAAAwAAAP0AAAAAAAABAYABgAQABAAACwAAAQEBAQEBAQEBAQEBAYABAAAAAIAAAAEAAAD+gAAA/4AAAP+ABAAAAP8AAAD/gAAA/wAAAACAAAAAgAAAAAAAAQAAAYACgAQAAAsAAAEBAQEBAQEBAQEBAQGAAQAAAP+AAAD/gAAA/oAAAAEAAAAAgAQAAAD+gAAA/4AAAP+AAAABAAAAAIAAAAAAAAEAAAAABAAEAAAJAAABAQEBAQEBAQEBAwABAAAA/AAAAAEAAAABAAAAAQAEAAAA/AAAAAKAAAAAgAAAAIAAAAABAIAAgAMABAAACwAAAQEBAQEBAQEBAQEBAgABAAAA/4AAAP6AAAD/gAAAAIAAAAEABAAAAP0AAAD/gAAAAIAAAAEAAAAAgAAAAAAAAQAAAAAEAAQAAAUAAAEBAQEBAQAAAQAAAAMAAAD8AAQAAAD9AAAA/wAAAAACAIAAgAMAAoAACwAPAAABAQEBAQEBAQEBAQEBAQEBAQABgAAAAIAAAP+AAAD+gAAAAQAAAP8A/4AAgAAA/4ACgAAA/4AAAP8AAAD/gAAAAIAAAAEAAAAAAAAA/wAAAAACAIAAgAMABAAACwAPAAABAQEBAQEBAQEBAQEBAQEBAgABAAAA/4AAAP6AAAABAAAA/wAAAAEA/oAAgAAA/4AEAAAA/QAAAP+AAAAAgAAAAQAAAACAAAD/gAAA/wAAAAABAIAAgAQABAAADQAAAQEBAQEBAQEBAQEBAQECAAIAAAD/AAAA/4AAAP6AAAD/gAAAAIAAAAEABAAAAP+AAAD9gAAA/4AAAACAAAABAAAAAIAAAAACAAAAAAQABAAAAwAHAAABAQEBAQEBAQAABAAAAPwAAQAAAAIAAAAEAAAA/AAAAAMA/gAAAAIAAAEAgACABAAEAAARAAABAQEBAQEBAQEBAQEBAQEBAQECAAIAAAD/AAAAAQAAAP8AAAD/gAAA/oAAAP+AAAAAgAAAAQAEAAAA/4AAAP+AAAD/gAAA/oAAAP+AAAAAgAAAAQAAAACAAAAAAQAAAAACgAKAAAsAAAEBAQEBAQEBAQEBAQAAAYAAAACAAAAAgAAA/wAAAP+AAAD/AAKAAAD/gAAA/4AAAP6AAAABAAAAAIAAAAAAAAEAAAAABAAEAAAFAAABAQEBAQEAAAQAAAD/AAAA/QAEAAAA/AAAAAMAAAAAAQCAAIAEAAQAABUAAAEBAQEBAQEBAQEBAQEBAQEBAQEBAQECAAIAAAD/AAAAAQAAAP8AAAABAAAA/wAAAP+AAAD+gAAA/4AAAACAAAABAAQAAAD/gAAA/4AAAP+AAAD/gAAA/4AAAP+AAAD/gAAAAIAAAAEAAAAAgAAAAAEBgAAABAACgAALAAABAQEBAQEBAQEBAQECgAGAAAD/AAAA/4AAAP8AAAAAgAAAAIACgAAA/wAAAP+AAAD/AAAAAYAAAACAAAAAAAABAAAAAAQABAAAEQAAAQEBAQEBAQEBAQEBAQEBAQEBAAAAgAAAAIAAAACAAAAAgAAAAIAAAACAAAAAgAAAAIAAAPwABAAAAP+AAAD/gAAA/4AAAP+AAAD/gAAA/4AAAP+AAAD/gAAAAAEAAAAABAABAAADAAABAQEBAAAEAAAA/AABAAAA/wAAAAAAAAEAAAAABAAEAAARAAABAQEBAQEBAQEBAQEBAQEBAQEDgACAAAD8AAAAAIAAAACAAAAAgAAAAIAAAACAAAAAgAAAAIAEAAAA/AAAAACAAAAAgAAAAIAAAACAAAAAgAAAAIAAAACAAAAAAQAAAgAEAAQAAAMAAAEBAQEAAAQAAAD8AAQAAAD+AAAAAAAAAgCAAIACAAOAAAMABwAAAQEBAQEBAQEAgACAAAD/gAEAAIAAAP+AA4AAAP0AAAADAAAA/QAAAAAEAIAAgAQABAAAAwAHAAsADwAAAQEBAQEBAQEBAQEBAQEBAQCAA4AAAPyAAIAAAACAAAAAgAAAAIAAAACAAAAAgAAABAAAAPyAAAADAP+AAAAAgP8A/4AAAACA/wD/gAAAAIAAAQAAAAAEAAQAAAUAAAEBAQEBAQMAAQAAAPwAAAADAAQAAAD8AAAAAQAAAAACAIAAgAQABAAAAwAHAAABAQEBAQEBAQCAA4AAAPyAAYAAAACAAAAEAAAA/IAAAAIA/4AAAACAAAMAgACABAAEAAADAAcACwAAAQEBAQEBAQEBAQEBAIADgAAA/IAAgAAAAIAAAAGAAAAAgAAABAAAAPyAAAADAP+AAAAAgP4A/4AAAACAAAAABAAAAIAEAAQAAAMABwALAA8AAAEBAQEBAQEBAQEBAQEBAQEAAAQAAAD8AAAABAAAAPwAAAAEAAAA/AAAAAQAAAD8AAQAAAD/gAAA/4AAAP+AAAD/gAAA/4AAAP+AAAD/gAAAAAYAgACABAAEAAADAAcACwAPABMAFwAAAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAIADgAAA/IAAgAAAAIAAAAGAAAAAgAAA/oAAAACAAAD+gAAAAIAAAAGAAAAAgAAABAAAAPyAAAADAP+AAAAAgAAA/4AAAACA/wD/gAAAAID/AP+AAAAAgAAA/4AAAACAAAEAgACAAQADgAADAAABAQEBAIAAgAAA/4ADgAAA/QAAAAAAAAUAgACABAAEAAADAAcACwAPABMAAAEBAQEBAQEBAQEBAQEBAQEBAQEBAIADgAAA/IAAgAAAAIAAAAGAAAAAgAAA/YAAAACAAAABgAAAAIAAAAQAAAD8gAAAAwD/gAAAAIAAAP+AAAAAgP4A/4AAAACAAAD/gAAAAIAAAAABAAADAAQABAAAAwAAAQEBAQAABAAAAPwABAAAAP8AAAAAAAAHAIAAgAQABAAAAwAHAAsADwATABcAGwAAAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQCAA4AAAPyAAIAAAACAAAABgAAAAIAAAP2AAAAAgAAAAYAAAACAAAD9gAAAAIAAAAGAAAAAgAAABAAAAPyAAAADAP+AAAAAgAAA/4AAAACA/wD/gAAAAIAAAP+AAAAAgP8A/4AAAACAAAD/gAAAAIAAAAAEAAAAAAQAAgAAAwAHAAsADwAAAQEBAQEBAQEBAQEBAQEBAQAAAQAAAP8AAgABAAAA/wD/AAEAAAD/AAIAAQAAAP8AAgAAAP8AAAABAAAA/wAAAAAAAAD/AAAAAQAAAP8AAAAAAQAAAAAEAAQAAAkAAAEBAQEBAQEBAQEAAAEAAAABAAAAAQAAAAEAAAD8AAQAAAD/gAAA/4AAAP+AAAD9gAAAAAEBAAAAAgAEAAADAAABAQEBAQABAAAA/wAEAAAA/AAAAAAAAAEAAAAABAAEAAALAAABAQEBAQEBAQEBAQECgAGAAAD8AAAAAIAAAACAAAAAgAAAAQAEAAAA/AAAAAGAAAABAAAAAIAAAACAAAAAAAABAAABAAQAAgAAAwAAAQEBAQAABAAAAPwAAgAAAP8AAAAAAAABAAAAAAQABAAACwAAAQEBAQEBAQEBAQEBAgACAAAA/AAAAACAAAAAgAAAAIAAAACABAAAAPwAAAACAAAAAIAAAACAAAAAgAAAAAAAAQAAAAAEAAIAAAkAAAEBAQEBAQEBAQEDAAEAAAD8AAAAAQAAAAEAAAABAAIAAAD+AAAAAIAAAACAAAAAgAAAAAEAAAAABAAEAAALAAABAQEBAQEBAQEBAQEAAAIAAAAAgAAAAIAAAACAAAAAgAAA/AAEAAAA/4AAAP+AAAD/gAAA/4AAAP4AAAAAAAADAAAAAAQABAAAGwAnADMAAAEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEAAAEAAAAAgAAAAIAAAACAAAAAgAAAAIAAAACAAAD/AAAA/4AAAP+AAAD/gAAA/4AAAP+AAAD/gAIAAYAAAACAAAD/gAAA/4AAAP+AAAD/gP4AAIAAAACAAAAAgAAAAIAAAP6AAAD/gAQAAAD/gAAA/4AAAP+AAAD/gAAA/4AAAP+AAAD/AAAAAIAAAACAAAAAgAAAAIAAAACAAAAAgAAAAQAAAP+AAAD+gAAAAIAAAACAAAAAgAAA/oAAAP+AAAD/gAAA/4AAAP+AAAAAgAAAAAAAAQAAAAAEAAIAAAkAAAEBAQEBAQEBAQEAAAEAAAABAAAAAQAAAAEAAAD8AAIAAAD/gAAA/4AAAP+AAAD/gAAAAAEAAAAABAAEAAALAAABAQEBAQEBAQEBAQEAAAGAAAABAAAAAIAAAACAAAAAgAAA/AAEAAAA/4AAAP+AAAD/gAAA/wAAAP6AAAAAAAAEAAAAgAQABAAAAwAHAAsADwAAAQEBAQEBAQEBAQEBAQEBAQCAAYAAAP6AAgABgAAA/oD9gAGAAAD+gAIAAYAAAP6ABAAAAP6AAAABgAAA/oAAAP+AAAD+gAAAAYAAAP6AAAAAAQIAAgAEAAQAAAMAAAEBAQECAAIAAAD+AAQAAAD+AAAAAAAABACAAIAEAAQAAAMABwAjACcAAAEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAAEAAAD/AAGAAQAAAP8A/gAAgAAAAIAAAACAAAAAgAAAAIAAAACAAAAAgAAA/4AAAP+AAAD/gAAA/4AAAP+AAAD/gAAA/4ABgACAAAD/gAQAAAD/gAAAAIAAAP+AAAAAAAAA/wAAAP+AAAD/gAAAAIAAAACAAAABAAAA/oAAAP+AAAD/gAAA/4AAAACAAAAAgAAAAIAAAAGAAAD/gAAAAAQAAAAABAAEAAADAAcACwAPAAABAQEBAQEBAQEBAQEBAQEBAAAAgAAA/4ADgACAAAD/gPyAAIAAAP+AA4AAgAAA/4AEAAAA/4AAAACAAAD/gAAA/QAAAP+AAAAAgAAA/4AAAAABAAAAAAIAAgAAAwAAAQEBAQAAAgAAAP4AAgAAAP4AAAAAAAAEAAAAAAIABAAAAwAHAAsADwAAAQEBAQEBAQEBAQEBAQEBAQAAAQAAAP8AAQABAAAA/wD/AAEAAAD/AAEAAQAAAP8ABAAAAP8AAAAAAAAA/wAAAAAAAAD/AAAAAAAAAP8AAAAAAQCAAQADgAOAABMAAAEBAQEBAQEBAQEBAQEBAQEBAQEBAYABAAAA/4AAAAGAAAD+gAAAAIAAAP8AAAD/gAAA/4AAAACAAAAAgAOAAAD/gAAA/4AAAP+AAAD/gAAA/4AAAACAAAAAgAAAAIAAAACAAAAAAAABAQABAAOABAAAEwAAAQEBAQEBAQEBAQEBAQEBAQEBAQECAACAAAAAgAAAAIAAAP+AAAD/gAAA/4AAAP+AAAD/gAAAAIAAAACABAAAAP+AAAD/gAAA/wAAAACAAAD+gAAAAYAAAP+AAAABAAAAAIAAAAAAAAEBAAEABAADgAATAAABAQEBAQEBAQEBAQEBAQEBAQEBAQIAAQAAAACAAAAAgAAA/4AAAP+AAAD/AAAAAIAAAP6AAAABgAAA/4ADgAAA/4AAAP+AAAD/gAAA/4AAAP+AAAAAgAAAAIAAAACAAAAAgAAAAAAAAQEAAIADgAOAABMAAAEBAQEBAQEBAQEBAQEBAQEBAQEBAgAAgAAAAIAAAACAAAD/gAAA/4AAAP+AAAD/gAAA/4AAAACAAAAAgAOAAAD+gAAAAIAAAP8AAAD/gAAA/4AAAACAAAAAgAAAAQAAAP+AAAAAAAABAQAAgAOABAAADwAAAQEBAQEBAQEBAQEBAQEBAQIAAIAAAACAAAAAgAAA/4AAAP6AAAD/gAAAAIAAAACABAAAAP8AAAD/AAAA/wAAAP+AAAAAgAAAAQAAAAEAAAAAAAACAIAAgAOAA4AAAwAJAAABAQEBAQEBAQEBAIADAAAA/QAAgAAAAgAAAP8AAAADgAAA/QAAAAKA/gAAAAEAAAABAAAAAAIAgACABAAEAAAbACcAAAEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQECAACAAAAAgAAAAIAAAACAAAD/gAAA/4AAAP+AAAD/gAAA/4AAAP+AAAD/gAAAAIAAAACAAAAAgAAAAAD/gAAAAIAAAACAAAAAgAAA/4AAAAQAAAD/gAAA/4AAAP+AAAD/gAAA/4AAAP+AAAD/gAAAAIAAAACAAAAAgAAAAIAAAACAAAAAgAAA/4D/gAAA/4AAAP+AAAAAgAAAAIAAAACAAAEAAAIABAADAAADAAABAQEBAAAEAAAA/AADAAAA/wAAAAAAAAEAAAAABAAEAAALAAABAQEBAQEBAQEBAQEAAAQAAAD/gAAA/4AAAP+AAAD/gAAA/gAEAAAA/gAAAP+AAAD/gAAA/4AAAP+AAAAAAAABAAACAAIABAAAAwAAAQEBAQAAAgAAAP4ABAAAAP4AAAAAAAACAQAAgAOAA4AAFwAbAAABAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAYABgAAAAIAAAP8AAAAAgAAAAIAAAP8AAAD/gAAA/wAAAACAAAAAgAAA/wAAAACAAIAAAACAAAADgAAA/wAAAP+AAAD/gAAA/4AAAP+AAAAAgAAA/4AAAACAAAAAgAAAAIAAAACAAAAAgP+AAAAAgAADAAAAAAQABAAACwAnADMAAAEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEAgAGAAAD/gAAA/4AAAP+AAAD/gAAAAIACgAEAAAD/gAAA/4AAAP+AAAD/gAAA/4AAAP+AAAD/AAAAAIAAAACAAAAAgAAAAIAAAACAAAAAgACAAIAAAP+AAAD+gAAAAIAAAACAAAAAgAQAAAD/gAAA/4AAAP+AAAD/gAAAAYAAAACAAAD/AAAA/4AAAP+AAAD/gAAA/4AAAP+AAAD/gAAAAQAAAACAAAAAgAAAAIAAAACAAAAAgAAA/oAAAP6AAAD/gAAAAIAAAACAAAAAgAAAAAAAAgCAAIADgAQAAA8AHwAAAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAAEAAAABAAAAAIAAAP+AAAD/AAAA/wAAAP+AAAAAgAAAAQAAAAEAAAAAgAAA/4AAAP8AAAD/AAAA/4AAAACABAAAAP+AAAAAgAAA/wAAAP+AAAAAgAAA/4AAAAEAAAD+gAAA/4AAAACAAAD/AAAA/4AAAACAAAD/gAAAAQAAAAABAAAAAAQAA4AACwAAAQEBAQEBAQEBAQEBAQACAAAAAIAAAACAAAD8AAAAAIAAAACAA4AAAP+AAAD/gAAA/YAAAAKAAAAAgAAAAAAAAQAAAAACAAQAAA8AAAEBAQEBAQEBAQEBAQEBAQEAAACAAAAAgAAAAIAAAACAAAD/gAAA/4AAAP+AAAD/gAQAAAD/gAAA/4AAAP+AAAD/AAAA/4AAAP+AAAD/gAAAAAAAAQIAAAAEAAQAAA8AAAEBAQEBAQEBAQEBAQEBAQEDgACAAAD/gAAA/4AAAP+AAAD/gAAAAIAAAACAAAAAgAQAAAD8AAAAAIAAAACAAAAAgAAAAQAAAACAAAAAgAAAAAAAAQCAAIAEAAQAABcAAAEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQIAAIAAAACAAAAAgAAAAIAAAP+AAAD/AAAA/4AAAP8AAAD/gAAAAIAAAACAAAAAgAQAAAD/gAAA/4AAAP+AAAD/gAAA/oAAAAEAAAD/AAAAAYAAAACAAAAAgAAAAIAAAAAAACAAAAAABAAEAAADAAcACwAPABMAFwAbAB8AIwAnACsALwAzADcAOwA/AEMARwBLAE8AUwBXAFsAXwBjAGcAawBvAHMAdwB7AH8AAAEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAAAAgAAA/4ABAACAAAD/gAEAAIAAAP+AAQAAgAAA/4D9gACAAAD/gAEAAIAAAP+AAQAAgAAA/4ABAACAAAD/gPyAAIAAAP+AAQAAgAAA/4ABAACAAAD/gAEAAIAAAP+A/YAAgAAA/4ABAACAAAD/gAEAAIAAAP+AAQAAgAAA/4D8gACAAAD/gAEAAIAAAP+AAQAAgAAA/4ABAACAAAD/gP2AAIAAAP+AAQAAgAAA/4ABAACAAAD/gAEAAIAAAP+A/IAAgAAA/4ABAACAAAD/gAEAAIAAAP+AAQAAgAAA/4D9gACAAAD/gAEAAIAAAP+AAQAAgAAA/4ABAACAAAD/gAQAAAD/gAAAAIAAAP+AAAAAgAAA/4AAAACAAAD/gAAAAAAAAP+AAAAAgAAA/4AAAACAAAD/gAAAAIAAAP+AAAAAAAAA/4AAAACAAAD/gAAAAIAAAP+AAAAAgAAA/4AAAAAAAAD/gAAAAIAAAP+AAAAAgAAA/4AAAACAAAD/gAAAAAAAAP+AAAAAgAAA/4AAAACAAAD/gAAAAIAAAP+AAAAAAAAA/4AAAACAAAD/gAAAAIAAAP+AAAAAgAAA/4AAAAAAAAD/gAAAAIAAAP+AAAAAgAAA/4AAAACAAAD/gAAAAAAAAP+AAAAAgAAA/4AAAACAAAD/gAAAAIAAAP+AAAAAAQAAAAAEAAQAAAsAAAEBAQEBAQEBAQEBAQAABAAAAP6AAAD/AAAA/4AAAP+AAAD/gAQAAAD8AAAAAIAAAACAAAAAgAAAAQAAAAAAAAEAAAAABAAEAAALAAABAQEBAQEBAQEBAQEAAAQAAAD/gAAA/4AAAP+AAAD/AAAA/oAEAAAA/oAAAP8AAAD/gAAA/4AAAP+AAAAAAAABAAABgAKABAAADwAAAQEBAQEBAQEBAQEBAQEBAQAAAQAAAACAAAAAgAAAAIAAAP8AAAD/gAAA/4AAAP+ABAAAAP+AAAD/gAAA/4AAAP8AAAAAgAAAAIAAAACAAAAAAAABAAAAAAKABAAADwAAAQEBAQEBAQEBAQEBAQEBAQAAAQAAAACAAAAAgAAAAIAAAP8AAAD/gAAA/4AAAP+ABAAAAP+AAAD/gAAA/4AAAP2AAAACAAAAAIAAAACAAAAAAAABAYAAAAQAAoAABQAAAQEBAQEBAYACgAAA/oAAAP8AAoAAAP8AAAD+gAAAAAEAAAAABAAEAAAJAAABAQEBAQEBAQEBAAACgAAAAIAAAACAAAAAgAAA/AAEAAAA/wAAAP8AAAD/AAAA/wAAAAACAAAAAAQABAAAGwAfAAABAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQGAAQAAAACAAAAAgAAAAIAAAP+AAAD/gAAA/4AAAP8AAAD/gAAA/4AAAP+AAAAAgAAAAIAAAACAAAAAAAEAAAAEAAAA/4AAAP+AAAD/gAAA/wAAAP+AAAD/gAAA/4AAAACAAAAAgAAAAIAAAAEAAAAAgAAAAIAAAP8A/wAAAAEAAAEBgAGABAAEAAAFAAABAQEBAQEBgAEAAAABgAAA/YAEAAAA/oAAAP8AAAAAAQAAAAACgAKAAA8AAAEBAQEBAQEBAQEBAQEBAQEBgAEAAAD/gAAA/4AAAP+AAAD/AAAAAIAAAACAAAAAgAKAAAD/AAAA/4AAAP+AAAD/gAAAAQAAAACAAAAAgAAAAAAAAQGAAAAEAAQAAA8AAAEBAQEBAQEBAQEBAQEBAQEDAAEAAAD/gAAA/4AAAP+AAAD/AAAAAIAAAACAAAAAgAQAAAD/AAAA/4AAAP+AAAD+AAAAAoAAAACAAAAAgAAAAAAAAQGAAAAEAAKAAA8AAAEBAQEBAQEBAQEBAQEBAQEBgAEAAAAAgAAAAIAAAACAAAD/AAAA/4AAAP+AAAD/gAKAAAD/gAAA/4AAAP+AAAD/AAAAAIAAAACAAAAAgAAAAAAAAQGAAYAEAAQAAA8AAAEBAQEBAQEBAQEBAQEBAQEDAAEAAAD/gAAA/4AAAP+AAAD/AAAAAIAAAACAAAAAgAQAAAD/AAAA/4AAAP+AAAD/gAAAAQAAAACAAAAAgAAAAAAAAQAAAAAEAAQAABsAAAEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEAAAEAAAAAgAAAAIAAAACAAAAAgAAAAIAAAACAAAD/AAAA/4AAAP+AAAD/gAAA/4AAAP+AAAD/gAQAAAD/gAAA/4AAAP+AAAD/gAAA/4AAAP+AAAD/AAAAAIAAAACAAAAAgAAAAIAAAACAAAAAgAAAAAAAAQAAAAAEAAQAAB8AAAEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAAABAAAAAIAAAAEAAAAAgAAAAQAAAP+AAAD/gAAA/4AAAP+AAAD/gAAA/4AAAP8AAAAAgAAAAIAAAP+AAAD/gAQAAAD/gAAA/4AAAACAAAAAgAAA/wAAAP+AAAD/gAAA/4AAAP+AAAD/gAAA/4AAAAEAAAAAgAAAAQAAAACAAAAAAAABAAABgAQABAAADwAAAQEBAQEBAQEBAQEBAQEBAQAAAQAAAACAAAAAgAAAAgAAAP2AAAD/gAAA/4AAAP+ABAAAAP+AAAD/gAAA/4AAAP8AAAAAgAAAAIAAAACAAAAAAAABAAABgAQAAoAAAwAAAQEBAQAABAAAAPwAAoAAAP8AAAAAAAABAYAAAAKABAAAAwAAAQEBAQGAAQAAAP8ABAAAAPwAAAAAAAABAYAAAAQABAAAFwAAAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAwABAAAA/4AAAP+AAAAAgAAAAIAAAP8AAAD/gAAA/4AAAP+AAAAAgAAAAIAAAACABAAAAP8AAAD/gAAA/wAAAP+AAAD/AAAAAIAAAACAAAAAgAAAAQAAAACAAAAAgAAAAAAAAQAAAAAEAAKAAA8AAAEBAQEBAQEBAQEBAQEBAQEAAAKAAAAAgAAAAIAAAACAAAD/AAAA/4AAAP+AAAD+AAKAAAD/gAAA/4AAAP+AAAD/AAAAAIAAAACAAAAAgAAAAAAAAQAAAYAEAAQAAA8AAAEBAQEBAQEBAQEBAQEBAQEDAAEAAAD/gAAA/4AAAP+AAAD9gAAAAgAAAACAAAAAgAQAAAD/AAAA/4AAAP+AAAD/gAAAAQAAAACAAAAAgAAAAAAAAQAAAgAEAAQAAA8AAAEBAQEBAQEBAQEBAQEBAQEAAAQAAAD/gAAA/4AAAP+AAAD/AAAA/4AAAP+AAAD/gAQAAAD/gAAA/4AAAP+AAAD/gAAAAIAAAACAAAAAgAAAAAAAAQAAAYACgAKAAAMAAAEBAQEAAAKAAAD9gAKAAAD/AAAAAAAAAQGAAAACgAKAAAMAAAEBAQEBgAEAAAD/AAKAAAD9gAAAAAAAAQAAAYAEAAQAABcAAAEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQAAAQAAAACAAAABAAAAAIAAAAEAAAD/gAAA/4AAAP+AAAD/AAAA/4AAAP+AAAD/gAQAAAD/gAAA/4AAAACAAAAAgAAA/wAAAP+AAAD/gAAA/4AAAACAAAAAgAAAAIAAAAAAAAEAAAAABAAEAAAJAAABAQEBAQEBAQEBAYACgAAA/AAAAACAAAAAgAAAAIAEAAAA/AAAAAEAAAABAAAAAQAAAAABAAAAAAQABAAAEwAAAQEBAQEBAQEBAQEBAQEBAQEBAQEDAAEAAAD/gAAA/4AAAP+AAAD/AAAA/oAAAAEAAAABAAAAAIAAAACABAAAAP6AAAD/AAAA/4AAAP+AAAD/gAAAAQAAAACAAAAAgAAAAQAAAAAAAAEAAAAABAAEAAATAAABAQEBAQEBAQEBAQEBAQEBAQEBAQAAAQAAAACAAAAAgAAAAQAAAAEAAAD+gAAA/wAAAP+AAAD/gAAA/4AEAAAA/wAAAP8AAAD/gAAA/4AAAP8AAAAAgAAAAIAAAACAAAABAAAAAAAAAQAAAAAEAAQAABsAAAEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEDAAEAAAD/gAAA/4AAAP+AAAD/gAAA/4AAAP+AAAD/AAAAAIAAAACAAAAAgAAAAIAAAACAAAAAgAQAAAD/AAAA/4AAAP+AAAD/gAAA/4AAAP+AAAD/gAAAAQAAAACAAAAAgAAAAIAAAACAAAAAgAAAAAAAAQAAAAACgAQAABcAAAEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQAAAQAAAACAAAAAgAAAAIAAAP+AAAD/gAAA/4AAAP8AAAAAgAAAAIAAAP+AAAD/gAQAAAD/gAAA/4AAAP+AAAD/AAAA/4AAAP+AAAD/gAAAAQAAAACAAAABAAAAAIAAAAAAAAEAAAAABAAEAAAfAAABAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQAAAQAAAACAAAAAgAAAAIAAAACAAAAAgAAAAIAAAP8AAAD/gAAA/wAAAP+AAAD/AAAAAIAAAACAAAD/gAAA/4AEAAAA/4AAAP+AAAD/gAAA/4AAAP+AAAD/gAAA/wAAAACAAAAAgAAA/4AAAP+AAAABAAAAAIAAAAEAAAAAgAAAAAAAAQAAAAACgAQAAA8AAAEBAQEBAQEBAQEBAQEBAQEBgAEAAAD/gAAA/4AAAP+AAAD/AAAAAIAAAACAAAAAgAQAAAD9gAAA/4AAAP+AAAD/gAAAAQAAAACAAAAAgAAAAAAAAQGAAAAEAAQAAA8AAAEBAQEBAQEBAQEBAQEBAQEBgAEAAAAAgAAAAIAAAACAAAD/AAAA/4AAAP+AAAD/gAQAAAD+AAAA/4AAAP+AAAD/AAAAAIAAAACAAAAAgAAAAAAAAQAAAAAEAAKAAA8AAAEBAQEBAQEBAQEBAQEBAQEBgAKAAAD+AAAA/4AAAP+AAAD/AAAAAIAAAACAAAAAgAKAAAD/AAAA/4AAAP+AAAD/gAAAAQAAAACAAAAAgAAAAAAAAQGAAYACgAQAAAMAAAEBAQEBgAEAAAD/AAQAAAD9gAAAAAAAAQGAAYAEAAKAAAMAAAEBAQEBgAKAAAD9gAKAAAD/AAAAAAAAAQAAAAAEAAQAAB8AAAEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAwABAAAA/4AAAP+AAAAAgAAAAIAAAP8AAAD/gAAA/wAAAP+AAAD/AAAAAIAAAACAAAAAgAAAAIAAAACAAAAAgAQAAAD/AAAA/4AAAP8AAAD/gAAA/wAAAACAAAAAgAAA/4AAAP+AAAABAAAAAIAAAACAAAAAgAAAAIAAAACAAAAAAAABAAAAAAQABAAAIwAAAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAAABAAAAAIAAAAEAAAAAgAAAAQAAAP+AAAD/gAAAAIAAAACAAAD/AAAA/4AAAP8AAAD/gAAA/wAAAACAAAAAgAAA/4AAAP+ABAAAAP+AAAD/gAAAAIAAAACAAAD/AAAA/4AAAP8AAAD/gAAA/wAAAACAAAAAgAAA/4AAAP+AAAABAAAAAIAAAAEAAAAAgAAAAAAAAQGAAYACgAKAAAMAAAEBAQEBgAEAAAD/AAKAAAD/AAAAAAAAAQAAAAAEAAKAABcAAAEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQGAAQAAAACAAAAAgAAAAIAAAP8AAAD/gAAA/wAAAP+AAAD/AAAAAIAAAACAAAAAgAKAAAD/gAAA/4AAAP+AAAD/AAAAAIAAAACAAAD/gAAA/4AAAAEAAAAAgAAAAIAAAAAAAAEAAAGAAoAEAAAFAAABAQEBAQEBgAEAAAD9gAAAAYAEAAAA/YAAAAEAAAAAAQAAAAACgAKAAAUAAAEBAQEBAQAAAoAAAP8AAAD+gAKAAAD9gAAAAYAAAAABAAAAAAQABAAAHwAAAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEAAAEAAAAAgAAAAQAAAACAAAABAAAA/4AAAP+AAAAAgAAAAIAAAP8AAAD/gAAA/4AAAP+AAAD/gAAA/4AAAP+ABAAAAP+AAAD/gAAAAIAAAACAAAD/AAAA/4AAAP8AAAD/gAAA/wAAAACAAAAAgAAAAIAAAACAAAAAgAAAAIAAAAAAAAEAAAAABAAEAAALAAABAQEBAQEBAQEBAQEBgAEAAAABgAAA/oAAAP8AAAD+gAAAAYAEAAAA/oAAAP8AAAD+gAAAAYAAAAEAAAAAAAABAAAAAAQAAoAABwAAAQEBAQEBAQEAAAQAAAD+gAAA/wAAAP6AAoAAAP8AAAD+gAAAAYAAAAAAAAEBgAAABAAEAAAHAAABAQEBAQEBAQGAAQAAAAGAAAD+gAAA/wAEAAAA/oAAAP8AAAD+gAAAAAAAAQAAAAACgAQAAAcAAAEBAQEBAQEBAYABAAAA/wAAAP6AAAABgAQAAAD8AAAAAYAAAAEAAAAAAAABAAABgAQABAAABwAAAQEBAQEBAQEBgAEAAAABgAAA/AAAAAGABAAAAP6AAAD/AAAAAQAAAAAAAAQBAAEAAwADAAADAAcACwAPAAABAQEBAQEBAQEBAQEBAQEBAYABAAAA/wD/gACAAAD/gAGAAIAAAP+A/wABAAAA/wADAAAA/4AAAAAAAAD/AAAAAQAAAP8AAAAAAAAA/4AAAAACAIAAgAOAA4AACwAPAAABAQEBAQEBAQEBAQEBAQEBAQACAAAAAIAAAP+AAAD+AAAA/4AAAACAAIAAAAEAAAADgAAA/4AAAP4AAAD/gAAAAIAAAAIAAAD/gP8AAAABAAACAAAAAAQABAAAEwAfAAABAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEAAgAAAACAAAAAgAAA/4AAAP+AAAD+AAAA/4AAAP+AAAAAgAAAAIAAgAAA/4AAAACAAAABAAAAAIAAAP+AAAAEAAAA/4AAAP+AAAD+AAAA/4AAAP+AAAAAgAAAAIAAAAIAAAAAgAAA/4D/gAAA/wAAAP+AAAAAgAAAAQAAAACAABAAAAAABAAEAAADAAcACwAPABMAFwAbAB8AIwAnACsALwAzADcAOwA/AAABAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAYAAgAAA/4ACAACAAAD/gP2AAIAAAP+AAgAAgAAA/4D9gACAAAD/gAIAAIAAAP+A/YAAgAAA/4ACAACAAAD/gP+AAIAAAP+AAgAAgAAA/4D9gACAAAD/gAIAAIAAAP+A/YAAgAAA/4ACAACAAAD/gP2AAIAAAP+AAgAAgAAA/4AEAAAA/4AAAACAAAD/gAAAAAAAAP+AAAAAgAAA/4AAAAAAAAD/gAAAAIAAAP+AAAAAAAAA/4AAAACAAAD/gAAAAAAAAP+AAAAAgAAA/4AAAAAAAAD/gAAAAIAAAP+AAAAAAAAA/4AAAACAAAD/gAAAAAAAAP+AAAAAgAAA/4AAAAAQAAAAAAQABAAAAwAHAAsADwATABcAGwAfACMAJwArAC8AMwA3ADsAPwAAAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQAAAIAAAP+AAgAAgAAA/4D+gACAAAD/gAIAAIAAAP+A/oAAgAAA/4ACAACAAAD/gP6AAIAAAP+AAgAAgAAA/4D8gACAAAD/gAIAAIAAAP+A/oAAgAAA/4ACAACAAAD/gP6AAIAAAP+AAgAAgAAA/4D+gACAAAD/gAIAAIAAAP+ABAAAAP+AAAAAgAAA/4AAAAAAAAD/gAAAAIAAAP+AAAAAAAAA/4AAAACAAAD/gAAAAAAAAP+AAAAAgAAA/4AAAAAAAAD/gAAAAIAAAP+AAAAAAAAA/4AAAACAAAD/gAAAAAAAAP+AAAAAgAAA/4AAAAAAAAD/gAAAAIAAAP+AAAAAAwCAAIADgAQAABcAGwAfAAABAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQIAAIAAAAEAAAD/AAAAAIAAAP+AAAABAAAA/wAAAP+AAAD/AAAA/4AAAACAAAABAP+AAAAAgAAA/4AAAACAAAAEAAAA/4AAAP+AAAD/gAAA/4AAAP+AAAD/gAAA/4AAAACAAAAAgAAAAYAAAACAAAD/gP+AAAAAgP8A/4AAAACAAAAAAQCAAIADgAOAAA8AAAEBAQEBAQEBAQEBAQEBAQEBAAIAAAAAgAAA/4AAAP+AAAD/AAAA/4AAAP+AAAAAgAOAAAD/gAAA/wAAAP+AAAD/AAAAAQAAAACAAAABAAAAAAAAAgCAAIADgAOAAAMACQAAAQEBAQEBAQEBAQCAAwAAAP0AAYAAAP8AAAACAAAAA4AAAP0AAAACgP8AAAD/AAAAAgAAAAABAIAAgAOAA4AAAwAAAQEBAQCAAwAAAP0AA4AAAP0AAAAAAAACAIAAgAOAA4AAAwALAAABAQEBAQEBAQEBAQEAgAMAAAD9AACAAAACAAAA/4AAAP8AAAADgAAA/QAAAAKA/gAAAAIAAAD/AAAAAQAAAQAAAAAEAAQAABMAAAEBAQEBAQEBAQEBAQEBAQEBAQEBAQACAAAAAIAAAACAAAD/gAAA/4AAAP4AAAD/gAAA/4AAAACAAAAAgAQAAAD/gAAA/4AAAP4AAAD/gAAA/4AAAACAAAAAgAAAAgAAAACAAAAAAAABAQABAAMAAwAACwAAAQEBAQEBAQEBAQEBAYABAAAAAIAAAP+AAAD/AAAA/4AAAACAAwAAAP+AAAD/AAAA/4AAAACAAAABAAAAAAAAAQCAAQAEAAQAABsAAAEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQECAACAAAAAgAAAAQAAAP+AAAD/gAAAAIAAAP8AAAD/gAAA/wAAAACAAAD/gAAA/4AAAAEAAAAAgAQAAAD/gAAA/4AAAP+AAAD/gAAA/4AAAP+AAAAAgAAA/4AAAACAAAAAgAAAAIAAAACAAAAAgAAAAAAABgCAAIAEAAQAAAMABwALAA8AEwAXAAABAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEAgAOAAAD8gAEAAAAAgAAAAIAAAACAAAD+AAAAAIAAAAGAAAAAgAAA/gAAAAGAAAAEAAAA/IAAAAMA/wAAAAEAAAD/AAAAAQD+gP+AAAAAgAAA/4AAAACA/4D/gAAAAIAABgCAAIAEAAQAAAMABwALAA8AEwAXAAABAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEAgAOAAAD8gAEAAAAAgAAAAIAAAACAAAD+gAAAAYAAAP4AAAAAgAAAAYAAAACAAAAEAAAA/IAAAAMA/wAAAAEAAAD/AAAAAQD+gP+AAAAAgP+A/4AAAACAAAD/gAAAAIAABgCAAIAEAAQAABMAFwAbAB8AIwAnAAABAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAgAAgAAAAIAAAAEAAAD/AAAA/4AAAP+AAAD/gAAA/wAAAAEAAAAAgAAAAAAAgAAA/oAAgAAA/4ACAACAAAD/gP4AAIAAAP+AAgAAgAAA/4AEAAAA/wAAAP+AAAD/gAAA/4AAAP8AAAABAAAAAIAAAACAAAAAgAAA/4D/gAAAAIABAAAA/4AAAACAAAD/gAAA/oAAAP+AAAAAgAAA/4AAAAACAQAAgAOABAAAFwAbAAABAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAYABgAAAAIAAAP+AAAD/gAAAAIAAAP+AAAD/gAAA/4AAAACAAAD/gAAAAQAAAP8A/4AAgAAA/4AEAAAA/4AAAP8AAAD/gAAA/4AAAP+AAAD/gAAAAIAAAACAAAAAgAAAAIAAAAEAAAAAAAAA/wAAAAACAIAAgAQABAAAFwAbAAABAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAYACgAAA/4AAAP+AAAD/gAAAAIAAAP+AAAD+gAAAAQAAAP8AAAABAAAAAIAAAP8A/wAAgAAA/4AEAAAA/gAAAAEAAAD/gAAA/4AAAP8AAAD/gAAAAIAAAAEAAAAAgAAAAIAAAACAAAD+gAAA/wAAAAABAIAAgAQABAAAGwAAAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQIAAIAAAACAAAAAgAAAAIAAAP8AAAD/gAAAAIAAAP6AAAAAgAAA/4AAAP8AAAAAgAAAAIAAAACABAAAAP+AAAD/gAAA/4AAAP8AAAAAgAAA/wAAAP+AAAAAgAAAAQAAAP+AAAABAAAAAIAAAACAAAAAAAABAIAAgAQABAAAGwAAAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQGAAYAAAP+AAAAAgAAAAQAAAP8AAAD/gAAAAIAAAP6AAAAAgAAA/4AAAP8AAAABAAAAAIAAAP+ABAAAAP8AAAD/gAAAAIAAAP6AAAAAgAAA/wAAAP+AAAAAgAAAAQAAAP+AAAABgAAA/4AAAACAAAAAAAABAIAAgAQABAAAFwAAAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQABAAAAAIAAAAEAAAAAgAAA/4AAAP+AAAD/gAAA/4AAAP+AAAD/gAAA/4AAAACABAAAAP+AAAAAgAAA/4AAAP6AAAD/gAAA/4AAAP+AAAAAgAAAAIAAAACAAAABgAAAAAAAAQCAAIAEAAQAABsAAAEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQECAACAAAAAgAAAAIAAAACAAAD/gAAA/4AAAP+AAAD/gAAA/4AAAP+AAAD/gAAAAIAAAACAAAAAgAQAAAD/gAAA/4AAAP+AAAD/gAAA/4AAAP+AAAD/gAAAAIAAAACAAAAAgAAAAIAAAACAAAAAgAAAAAAAAQEAAIADgAQAAAsAAAEBAQEBAQEBAQEBAQIAAYAAAP8AAAD/gAAA/wAAAACAAAAAgAQAAAD/AAAA/gAAAP+AAAABAAAAAIAAAAAAAAEAgACABAAEAAATAAABAQEBAQEBAQEBAQEBAQEBAQEBAQGAAoAAAP+AAAD/AAAAAIAAAACAAAD+gAAA/4AAAP8AAAAAgAAAAIAEAAAA/QAAAP+AAAABAAAAAIAAAAEAAAD+AAAA/4AAAAEAAAAAgAAAAAAAAAAYASYAAQAAAAAAAAAIAAAAAQAAAAAAAQAIAAgAAQAAAAAAAgAHABAAAQAAAAAAAwAIABcAAQAAAAAABAAQAB8AAQAAAAAABQALAC8AAQAAAAAABgAIADoAAQAAAAAACQAJAEIAAQAAAAAACgA6AEsAAQAAAAAADQARAIUAAQAAAAAADgAyAJYAAQAAAAAAEwAMAMgAAwABBAkAAAAQANQAAwABBAkAAQAQAOQAAwABBAkAAgAOAPQAAwABBAkAAwAQAQIAAwABBAkABAAgARIAAwABBAkABQAWATIAAwABBAkABgAQAUgAAwABBAkACQASAVgAAwABBAkACgB0AWoAAwABBAkADQAiAd4AAwABBAkADgBkAgAAAwABBAkAEwAYAmQoYykgMjAyMlVyc2FGb250UmVndWxhclVyc2FGb250VXJzYUZvbnQgUmVndWxhclZlcnNpb24gMS4wVXJzYUZvbnRVcnNhRnJhbmtBbiBvcGVuIGxpY2VuY2UgZ2VuZXJhbCBwdXJwb3NlIHRleHRtb2RlIGZvbnQgYnkgVXJzYUZyYW5rQ0MwIDEuMCBVbml2ZXJzYWxodHRwczovL2NyZWF0aXZlY29tbW9ucy5vcmcvcHVibGljZG9tYWluL3plcm8vMS4wL0hlbGxvIFdvcmxkIQAoAGMAKQAgADIAMAAyADIAVQByAHMAYQBGAG8AbgB0AFIAZQBnAHUAbABhAHIAVQByAHMAYQBGAG8AbgB0AFUAcgBzAGEARgBvAG4AdAAgAFIAZQBnAHUAbABhAHIAVgBlAHIAcwBpAG8AbgAgADEALgAwAFUAcgBzAGEARgBvAG4AdABVAHIAcwBhAEYAcgBhAG4AawBBAG4AIABvAHAAZQBuACAAbABpAGMAZQBuAGMAZQAgAGcAZQBuAGUAcgBhAGwAIABwAHUAcgBwAG8AcwBlACAAdABlAHgAdABtAG8AZABlACAAZgBvAG4AdAAgAGIAeQAgAFUAcgBzAGEARgByAGEAbgBrAEMAQwAwACAAMQAuADAAIABVAG4AaQB2AGUAcgBzAGEAbABoAHQAdABwAHMAOgAvAC8AYwByAGUAYQB0AGkAdgBlAGMAbwBtAG0AbwBuAHMALgBvAHIAZwAvAHAAdQBiAGwAaQBjAGQAbwBtAGEAaQBuAC8AegBlAHIAbwAvADEALgAwAC8ASABlAGwAbABvACAAVwBvAHIAbABkACEAAAADAAAAAAAAAGYAMwAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA==\r
|
|
1040
|
+
typeof module < "u" && module.exports ? module.exports = h : typeof window < "u" && (window.Typr = h);
|
|
1041
|
+
const hA = `data:font/truetype;charset=utf-8;base64,AAEAAAAKAIAAAwAgT1MvMs+QEyQAAAEoAAAAYGNtYXAg7yVJAAAFjAAACSBnbHlmuHLTdAAAErQAAGi0aGVhZFvXdUwAAACsAAAANmhoZWELAQUCAAAA5AAAACRobXR4BACDgAAAAYgAAAQEbG9jYQAy54AAAA6sAAAECG1heHABIgCCAAABCAAAACBuYW1lVs/OSgAAe2gAAAOicG9zdABpADQAAH8MAAAAIAABAAAAAQAAzOWHqV8PPPUAAAQAAAAAAHxiGCcAAAAAfGIYJwAAAAAEAAQAAAAACAACAAEAAAAAAAEAAAQAAAAAAAQAAAAAAAcAAAEAAAAAAAAAAAAAAAAAAAEBAAEAAAEBAIAAIAAAAAAAAgAAAAAAAAAAAAAAAAAAAAAAAgQAAZAABQAEAgACAAAAAAACAAIAAAACAAAzAMwAAAAABAAAAAAAAACAAACLAABw4wAAAAAAAAAAWUFMLgBAACAmawQAAAAAAAQAAAAAAAFRAAAAAAMABAAAAAAgAAAEAAAABAAAAAQAAAAEAAGABAABAAQAAIAEAACABAAAgAQAAIAEAAGABAABAAQAAQAEAACABAABAAQAAIAEAACABAABAAQAAIAEAACABAAAgAQAAIAEAACABAAAgAQAAIAEAACABAAAgAQAAIAEAACABAABAAQAAIAEAAEABAAAgAQAAIAEAACABAAAgAQAAIAEAACABAAAgAQAAIAEAACABAAAgAQAAIAEAACABAAAgAQAAIAEAACABAAAgAQAAIAEAACABAAAgAQAAIAEAACABAAAgAQAAIAEAACABAAAgAQAAIAEAACABAAAgAQAAIAEAACABAABAAQAAIAEAAEABAAAgAQAAIAEAAEABAAAgAQAAIAEAACABAAAgAQAAIAEAAEABAAAgAQAAIAEAAGABAAAgAQAAIAEAAGABAAAgAQAAIAEAACABAAAgAQAAIAEAAEABAAAgAQAAIAEAACABAAAgAQAAIAEAACABAAAgAQAAIAEAACABAABgAQAAQAEAACABAAAAAQAAgAEAACABAAAgAQAAIAEAACABAACAAQAAAAEAAIABAABgAQAAgAEAACABAAAgAQAAAAEAACABAAAAAQAAAAEAAAABAAAAAQAAAAEAAIABAADAAQAAAAEAAAABAAAgAQAAYAEAAAABAAAAAQAAIAEAAAA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AIAAAACA/YAAgAAAAIAAAP8AAoABAAAA/4AAAP+A/4AAgAAAAIAAAP8AA4AAAP8AAAAAgAAAAIAAAP+AAAD/gAAA/4AAAP+AAAD/gAAA/4AAAACAAAAAgAAAAIAAAACAAAAAgAAAAAAAAP+AAAD/gAAAAAAAAP8AAAAAgAAAAAAAAP+AAAD/gAAAAAAAAwCAAIAEAAQAABcAHQAjAAABAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAAIAAAAAgAAA/4AAAACAAAAAgAAA/4AAAACAAAD9AAAA/4AAAACAAAD/gAAAAIAAgAAAAIAAAACAAAD/AAAAAQAAAP+AAAAEAAAA/4AAAP8AAAD/gAAAAIAAAP8AAAD/gAAA/4AAAACAAAABAAAAAIAAAAEAAAAAAP+AAAD/gAAAAQD+gP8AAAAAgAAAAIAAAAABAYACgAKABAAAAwAAAQEBAQGAAQAAAP8ABAAAAP6AAAAAAAABAQAAgAMABAAAEwAAAQEBAQEBAQEBAQEBAQEBAQEBAQECAAEAAAD/gAAA/4AAAACAAAAAgAAA/wAAAP+AAAD/gAAAAIAAAACABAAAAP+AAAD/gAAA/oAAAP+AAAD/gAAAAIAAAACAAAABgAAAAIAAAAAAAAEBAACAAwAEAAATAAABAQEBAQEBAQEBAQEBAQEBAQEBAQEAAQAAAACAAAAAgAAA/4AAAP+AAAD/AAAAAIAAAACAAAD/gAAA/4AEAAAA/4AAAP+AAAD+gAAA/4AAAP+AAAAAgAAAAIAAAAGAAAAAgAAAAAAABQCAAYADgAQAAAMABwATABcAGwAAAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEAAIAAAP+AAYAAgAAA/4D/AAEAAAABAAAA/wAAAP8AAAD/AAAAAQD/gACAAAD/gAGAAIAAAP+ABAAAAP+AAAAAgAAA/4AAAAAAAAD/gAAA/4AAAP+AAAAAgAAAAIAAAP8AAAD/gAAAAIAAAP+AAAAAAAABAQAAgAOAAwAACwAAAQEBAQEBAQEBAQEBAgAAgAAAAQAAAP8AAAD/gAAA/wAAAAEAAwAAAP8AAAD/gAAA/wAAAAEAAAAAgAAAAAAAAQCAAAACAAGAAAcAAAEBAQEBAQEBAQABAAAA/4AAAP8AAAAAgAGAAAD/AAAA/4AAAACAAAAAAAABAIABgAOAAgAAAwAAAQEBAQCAAwAAAP0AAgAAAP+AAAAAAAABAQAAgAIAAYAAAwAAAQEBAQEAAQAAAP8AAYAAAP8AAAAAAAABAIAAgAQAA4AAFwAAAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAwABAAAA/4AAAP+AAAD/gAAA/4AAAP+AAAD/AAAAAIAAAACAAAAAgAAAAIAAAACAA4AAAP+AAAD/gAAA/4AAAP+AAAD/gAAA/4AAAACAAAAAgAAAAIAAAACAAAAAgAAAAAAAAwCAAIADgAQAAAsAEQAXAAABAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAAIAAAAAgAAA/4AAAP4AAAD/gAAAAIAAgAAAAIAAAACAAAD/gAAA/4AAAAEAAAAEAAAA/4AAAP2AAAD/gAAAAIAAAAKAAAAAAP8AAAAAgAAAAID/AP+AAAD/AAAAAYAAAAABAIAAgAOABAAADQAAAQEBAQEBAQEBAQEBAQEBgAEAAAABAAAA/QAAAAEAAAD/AAAAAIAAAACABAAAAP0AAAD/gAAAAIAAAAGAAAAAgAAAAIAAAAABAIAAgAOABAAAGwAAAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEAAgAAAACAAAD/gAAA/4AAAP+AAAABgAAA/QAAAACAAAAAgAAAAIAAAACAAAD/AAAA/wAAAACABAAAAP+AAAD/AAAA/4AAAP+AAAD/gAAA/4AAAACAAAAAgAAAAIAAAACAAAABAAAA/wAAAAEAAAAAAAABAIAAgAOABAAAGwAAAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEAAgAAAACAAAD/gAAAAIAAAP+AAAD+AAAA/4AAAAEAAAABAAAA/wAAAAEAAAD/AAAA/wAAAACABAAAAP+AAAD/AAAA/4AAAP8AAAD/gAAAAIAAAACAAAD/gAAAAQAAAACAAAABAAAA/4AAAACAAAAAAAABAIAAgAOABAAAEQAAAQEBAQEBAQEBAQEBAQEBAQEBAYABAAAA/4AAAP+AAAABAAAAAQAAAP8AAAD+AAAAAIAAAACABAAAAP+AAAD/gAAA/wAAAAEAAAD9gAAAAQAAAAGAAAAAgAAAAAEAgACAA4AEAAATAAABAQEBAQEBAQEBAQEBAQEBAQEBAQCAAwAAAP4AAAABgAAAAIAAAP+AAAD+AAAA/4AAAAEAAAABAAAA/gAEAAAA/4AAAP8AAAD/gAAA/wAAAP+AAAAAgAAAAIAAAP+AAAABAAAAAAAAAgCAAIADgAQAABMAFwAAAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQACAAAAAIAAAP8AAAD/AAAAAYAAAACAAAD/gAAA/gAAAP+AAAAAgACAAAABAAAABAAAAP+AAAD/gAAAAIAAAP8AAAD/gAAA/wAAAP+AAAAAgAAAAoAAAP6A/wAAAAEAAAEAgACAA4AEAAAPAAABAQEBAQEBAQEBAQEBAQEBAIADAAAA/4AAAP+AAAD/AAAAAIAAAACAAAD+gAAA/4AEAAAA/oAAAP+AAAD+gAAAAYAAAACAAAABAAAA/4AAAAAAAAMAgACAA4AEAAATABcAGwAAAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEAAgAAAACAAAD/gAAAAIAAAP+AAAD+AAAA/4AAAACAAAD/gAAAAIAAgAAAAQAAAP8AAAABAAAABAAAAP+AAAD/AAAA/4AAAP8AAAD/gAAAAIAAAAEAAAAAgAAAAQAAAAAA/wAAAAEA/oD/AAAAAQAAAAACAIAAgAOABAAACwAPAAABAQEBAQEBAQEBAQEBAQEBAQACAAAAAIAAAP8AAAD+gAAA/4AAAACAAIAAAAEAAAAEAAAA/4AAAP0AAAABAAAAAIAAAAGAAAAAAP6AAAABgAACAQABAAIAA4AAAwAHAAABAQEBAQEBAQEAAQAAAP8AAAABAAAA/wADgAAA/wAAAP+AAAD/AAAAAAIAgACAAgADgAADAAsAAAEBAQEBAQEBAQEBAQEAAQAAAP8AAAABAAAA/4AAAP8AAAAAgAOAAAD/AAAA/4AAAP8AAAD/gAAAAIAAAAABAQAAgAOABAAAGwAAAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQKAAQAAAP+AAAD/gAAA/4AAAACAAAAAgAAAAIAAAP8AAAD/gAAA/4AAAP+AAAAAgAAAAIAAAACABAAAAP+AAAD/gAAA/4AAAP+AAAD/gAAA/4AAAP+AAAAAgAAAAIAAAACAAAAAgAAAAIAAAACAAAAAAAACAIABgAOAAwAAAwAHAAABAQEBAQEBAQCAAwAAAP0AAAADAAAA/QADAAAA/4AAAP+AAAD/gAAAAAEAgACAAwAEAAAbAAABAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAIABAAAAAIAAAACAAAAAgAAA/4AAAP+AAAD/gAAA/wAAAACAAAAAgAAAAIAAAP+AAAD/gAAA/4AEAAAA/4AAAP+AAAD/gAAA/4AAAP+AAAD/gAAA/4AAAACAAAAAgAAAAIAAAACAAAAAgAAAAIAAAAAAAAIAgACAA4AEAAATABcAAAEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEAAgAAAACAAAD/gAAA/4AAAP8AAAAAgAAAAIAAAP8AAAD/AAAAAIAAgAEAAAD/AAQAAAD/gAAA/4AAAP+AAAD/gAAAAIAAAACAAAAAgAAA/4AAAACAAAD+AAAA/wAAAAACAIAAgAOABAAAEQAVAAABAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQACAAAAAIAAAP6AAAAAgAAA/wAAAAGAAAD+AAAA/4AAAACAAgAAgAAA/4AEAAAA/4AAAP6AAAABAAAAAIAAAP2AAAD/gAAAAIAAAAKAAAD+AAAA/4AAAAAAAAIAgACAA4AEAAAPABMAAAEBAQEBAQEBAQEBAQEBAQEBAQEBAYABAAAAAIAAAACAAAD/AAAA/wAAAP8AAAAAgAAAAIAAAAAAAQAAAAQAAAD/gAAA/4AAAP2AAAABAAAA/wAAAAKAAAAAgAAA/4D/AAAAAQAAAwCAAIADgAQAAAsADwATAAABAQEBAQEBAQEBAQEBAQEBAQEBAQCAAoAAAACAAAD/gAAAAIAAAP+AAAD9gAEAAAABAAAA/wAAAAEAAAAEAAAA/4AAAP8AAAD/gAAA/wAAAP+AAAADAP8AAAABAP6A/wAAAAEAAAAAAQCAAIADgAQAABMAAAEBAQEBAQEBAQEBAQEBAQEBAQEBAQACAAAAAIAAAP8AAAD/AAAAAQAAAAEAAAD/gAAA/gAAAP+AAAAAgAQAAAD/gAAA/4AAAACAAAD9gAAAAIAAAP+AAAD/gAAAAIAAAAKAAAAAAAACAIAAgAOABAAACwATAAABAQEBAQEBAQEBAQEBAQEBAQEBAQCAAgAAAACAAAAAgAAA/4AAAP+AAAD+AAEAAAAAgAAAAIAAAP+AAAAEAAAA/4AAAP+AAAD+gAAA/4AAAP+AAAADAP2AAAAAgAAAAYAAAACAAAEAgACAA4AEAAAXAAABAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAAIAAAAAgAAA/wAAAP8AAAABAAAA/wAAAAEAAAABAAAA/4AAAP4AAAD/gAAAAIAEAAAA/4AAAP+AAAAAgAAA/wAAAP+AAAD/AAAAAIAAAP+AAAD/gAAAAIAAAAKAAAAAAAABAIAAgAOABAAACQAAAQEBAQEBAQEBAQCAAwAAAP4AAAABAAAA/wAAAP8ABAAAAP+AAAD/AAAA/4AAAP6AAAAAAQCAAIADgAQAABUAAAEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAAIAAAAAgAAA/wAAAP8AAAABAAAA/4AAAAGAAAD/gAAA/gAAAP+AAAAAgAQAAAD/gAAA/4AAAACAAAD9gAAAAQAAAACAAAD+gAAA/4AAAACAAAACgAAAAAEAgACAA4AEAAALAAABAQEBAQEBAQEBAQEAgAEAAAABAAAAAQAAAP8AAAD/AAAA/wAEAAAA/gAAAAIAAAD8gAAAAQAAAP8AAAAAAAABAIAAgAOABAAACwAAAQEBAQEBAQEBAQEBAIADAAAA/wAAAAEAAAD9AAAAAQAAAP8ABAAAAP+AAAD9gAAA/4AAAACAAAACgAAAAAAAAQCAAIAEAAQAAA8AAAEBAQEBAQEBAQEBAQEBAQEBAAMAAAD/gAAA/4AAAP4AAAD/gAAAAQAAAAEAAAD+gAQAAAD/gAAA/YAAAP+AAAAAgAAAAQAAAP8AAAACgAAAAAAAAQCAAIADgAQAABsAAAEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEAgAEAAAAAgAAAAIAAAAEAAAD/gAAA/4AAAP+AAAAAgAAAAIAAAACAAAD/AAAA/4AAAP+AAAD/AAQAAAD/AAAAAIAAAACAAAD/gAAA/4AAAP+AAAD/gAAA/4AAAP+AAAD/gAAAAIAAAACAAAD/AAAAAAAAAQCAAIADgAQAAAUAAAEBAQEBAQCAAQAAAAIAAAD9AAQAAAD9AAAA/4AAAAABAIAAgAQABAAAEwAAAQEBAQEBAQEBAQEBAQEBAQEBAQEAgAEAAAAAgAAAAIAAAACAAAABAAAA/wAAAP+AAAD/gAAA/4AAAP8ABAAAAP+AAAD/gAAAAIAAAACAAAD8gAAAAgAAAP+AAAAAgAAA/gAAAAAAAAEAgACABAAEAAATAAABAQEBAQEBAQEBAQEBAQEBAQEBAQCAAQAAAACAAAAAgAAAAIAAAAEAAAD/AAAA/4AAAP+AAAD/gAAA/wAEAAAA/4AAAP+AAAD/gAAAAYAAAPyAAAABAAAAAIAAAACAAAD+AAAAAAAAAgCAAIADgAQAAAsADwAAAQEBAQEBAQEBAQEBAQEBAQEAAgAAAACAAAD/gAAA/gAAAP+AAAAAgACAAAABAAAABAAAAP+AAAD9gAAA/4AAAACAAAACgAAAAAD9gAAAAoAAAgCAAIADgAQAAAkADQAAAQEBAQEBAQEBAQEBAQEAgAKAAAAAgAAA/4AAAP6AAAD/AAEAAAABAAAABAAAAP+AAAD+gAAA/4AAAP8AAAADAP6AAAABgAAAAAIAgACABAAEAAAPABcAAAEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEAAgAAAACAAAAAgAAA/4AAAP+AAAD+AAAA/4AAAACAAIAAAAEAAAD/gAAAAIAAAAQAAAD/gAAA/gAAAP8AAAAAgAAA/4AAAACAAAACgAAAAAD9gAAAAIAAAACAAAABgAACAIAAgAOABAAAEwAXAAABAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEAgAKAAAAAgAAA/4AAAP+AAAAAgAAAAIAAAP8AAAD/gAAA/4AAAP8AAQAAAAEAAAAEAAAA/4AAAP8AAAD/gAAA/4AAAP+AAAD/gAAAAIAAAACAAAD/AAAAAwD/AAAAAQAAAQCAAIADgAQAABsAAAEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAAIAAAAAgAAA/wAAAP8AAAABgAAAAIAAAP+AAAD+AAAA/4AAAAEAAAABAAAA/oAAAP+AAAAAgAQAAAD/gAAA/4AAAACAAAD/AAAA/4AAAP8AAAD/gAAAAIAAAACAAAD/gAAAAQAAAACAAAABAAAAAAAAAQCAAIADgAQAAAcAAAEBAQEBAQEBAIADAAAA/wAAAP8AAAD/AAQAAAD/gAAA/QAAAAMAAAAAAAABAIAAgAOABAAACwAAAQEBAQEBAQEBAQEBAIABAAAAAQAAAAEAAAD/gAAA/gAAAP+ABAAAAP0AAAADAAAA/QAAAP+AAAAAgAAAAAAAAQCAAIADgAQAAA8AAAEBAQEBAQEBAQEBAQEBAQEAgAEAAAABAAAAAQAAAP+AAAD/gAAA/wAAAP+AAAD/gAQAAAD+AAAAAgAAAP4AAAD/AAAA/4AAAACAAAABAAAAAAAAAQCAAIAEAAQAABMAAAEBAQEBAQEBAQEBAQEBAQEBAQEBAIABAAAAAIAAAACAAAAAgAAAAQAAAP8AAAD/gAAA/4AAAP+AAAD/AAQAAAD+AAAAAIAAAP+AAAACAAAA/IAAAACAAAAAgAAA/4AAAP+AAAAAAAABAIAAgAOABAAAGwAAAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQCAAQAAAAEAAAABAAAA/4AAAP+AAAAAgAAAAIAAAP8AAAD/AAAA/wAAAACAAAAAgAAA/4AAAP+ABAAAAP8AAAABAAAA/wAAAP+AAAD/gAAA/4AAAP8AAAABAAAA/wAAAAEAAAAAgAAAAIAAAACAAAAAAAABAIAAgAOABAAADwAAAQEBAQEBAQEBAQEBAQEBAQCAAQAAAAEAAAABAAAA/4AAAP+AAAD/AAAA/4AAAP+ABAAAAP6AAAABgAAA/oAAAP+AAAD+gAAAAYAAAACAAAAAAAABAIAAgAOABAAAFwAAAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAIADAAAA/4AAAP+AAAD/gAAA/4AAAAIAAAD9AAAAAIAAAACAAAAAgAAAAIAAAP4ABAAAAP8AAAD/gAAA/4AAAP+AAAD/gAAA/4AAAAEAAAAAgAAAAIAAAACAAAAAgAAAAAAAAQEAAIADAAQAAAcAAAEBAQEBAQEBAQACAAAA/wAAAAEAAAD+AAQAAAD/gAAA/YAAAP+AAAAAAAABAIAAgAQAA4AAFwAAAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAIABAAAAAIAAAACAAAAAgAAAAIAAAACAAAD/AAAA/4AAAP+AAAD/gAAA/4AAAP+AA4AAAP+AAAD/gAAA/4AAAP+AAAD/gAAA/4AAAACAAAAAgAAAAIAAAACAAAAAgAAAAAAAAQEAAIADAAQAAAcAAAEBAQEBAQEBAQACAAAA/gAAAAEAAAD/AAQAAAD8gAAAAIAAAAKAAAAAAAABAIACAAQABAAAFwAAAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAgAAgAAAAIAAAACAAAAAgAAA/wAAAP+AAAD/gAAA/4AAAP8AAAAAgAAAAIAAAACABAAAAP+AAAD/gAAA/4AAAP+AAAAAgAAAAIAAAP+AAAD/gAAAAIAAAACAAAAAgAAAAAAAAQCAAIADgAEAAAMAAAEBAQEAgAMAAAD9AAEAAAD/gAAAAAAAAQEAAoACgAQAAAkAAAEBAQEBAQEBAQEBAAEAAAAAgAAA/4AAAP+AAAD/gAQAAAD/gAAA/wAAAACAAAAAgAAAAAEAgACAA4ADAAAPAAABAQEBAQEBAQEBAQEBAQEBAQACgAAA/4AAAP+AAAD/AAAAAQAAAP6AAAD/gAAAAIADAAAA/YAAAACAAAABgAAA/oAAAP+AAAAAgAAAAYAAAAAAAAIAgACAA4AEAAAJAA0AAAEBAQEBAQEBAQEBAQEBAIABAAAAAYAAAACAAAD/gAAA/YABAAAAAQAAAAQAAAD/AAAA/4AAAP6AAAD/gAAAAgD+gAAAAYAAAAABAIAAgAOAAwAAEwAAAQEBAQEBAQEBAQEBAQEBAQEBAQEBAAIAAAAAgAAA/wAAAP8AAAABAAAAAQAAAP+AAAD+AAAA/4AAAACAAwAAAP+AAAD/gAAAAIAAAP6AAAAAgAAA/4AAAP+AAAAAgAAAAYAAAAAAAAIAgACAA4AEAAAJAA0AAAEBAQEBAQEBAQEBAQEBAoABAAAA/YAAAP+AAAAAgAAAAYD/AAAAAQAAAAQAAAD8gAAAAIAAAAGAAAAAgAAA/4D+gAAAAYAAAAACAIAAgAOAAwAADQARAAABAQEBAQEBAQEBAQEBAQEBAQEBAAIAAAAAgAAA/gAAAAGAAAD+AAAA/4AAAACAAIAAAAEAAAADAAAA/4AAAP8AAAD/gAAA/4AAAACAAAABgAAAAAD/gAAAAIAAAAABAQAAgAOAA4AACwAAAQEBAQEBAQEBAQEBAYACAAAA/oAAAAEAAAD/AAAA/wAAAACAA4AAAP+AAAD/AAAA/4AAAP8AAAACgAAAAAAAAgCAAIADgAOAAA8AEwAAAQEBAQEBAQEBAQEBAQEBAQEBAQEBAAIAAAAAgAAA/4AAAP4AAAABgAAA/oAAAP+AAAAAgACAAAABAAAAA4AAAP+AAAD+AAAA/4AAAACAAAAAgAAAAIAAAAEAAAAAAP8AAAABAAABAIAAgAOABAAACwAAAQEBAQEBAQEBAQEBAIABAAAAAYAAAACAAAD/AAAA/wAAAP8ABAAAAP8AAAD/gAAA/gAAAAIAAAD+AAAAAAAAAgGAAIACgAQAAAMABwAAAQEBAQEBAQEBgAEAAAD/AAAAAQAAAP8ABAAAAP+AAAD/gAAA/YAAAAACAIAAgAOABAAAAwAPAAABAQEBAQEBAQEBAQEBAQEBAoABAAAA/wAAAAEAAAD/gAAA/gAAAP+AAAABAAAAAQAEAAAA/4AAAP+AAAD+AAAA/4AAAACAAAABAAAA/wAAAAABAIAAgAOAA4AAEwAAAQEBAQEBAQEBAQEBAQEBAQEBAQEAgAEAAAAAgAAAAQAAAP+AAAAAgAAAAIAAAP8AAAD/gAAA/4AAAP8AA4AAAP8AAAAAgAAA/4AAAP8AAAD/gAAA/4AAAACAAAAAgAAA/wAAAAAAAAEBgACAAwAEAAAHAAABAQEBAQEBAQGAAQAAAACAAAD/AAAA/4AEAAAA/QAAAP+AAAAAgAAAAAAAAQCAAIAEAAMAABMAAAEBAQEBAQEBAQEBAQEBAQEBAQEBAQABAAAAAIAAAAEAAAAAgAAA/wAAAP+AAAD/gAAA/4AAAP8AAAAAgAMAAAD/gAAAAIAAAP+AAAD+AAAAAYAAAP+AAAAAgAAA/oAAAAIAAAAAAAABAIAAgAOAAwAADwAAAQEBAQEBAQEBAQEBAQEBAQCAAQAAAACAAAABAAAAAIAAAP8AAAD/gAAA/4AAAP8AAwAAAP+AAAAAgAAA/4AAAP4AAAABgAAA/4AAAP8AAAAAAAACAIAAgAOAAwAACwAPAAABAQEBAQEBAQEBAQEBAQEBAQACAAAAAIAAAP+AAAD+AAAA/4AAAACAAIAAAAEAAAADAAAA/4AAAP6AAAD/gAAAAIAAAAGAAAAAAP6AAAABgAACAIAAgAOAAwAACQANAAABAQEBAQEBAQEBAQEBAQCAAoAAAACAAAD/gAAA/oAAAP8AAQAAAAEAAAADAAAA/4AAAP+AAAD/gAAA/wAAAAIA/4AAAACAAAAAAgCAAIAEAAMAAA0AEQAAAQEBAQEBAQEBAQEBAQEBAQEBAQACgAAAAIAAAP+AAAD/AAAA/oAAAP+AAAAAgACAAAABAAAAAwAAAP6AAAD/gAAA/4AAAAEAAAAAgAAAAIAAAAAA/4AAAACAAAAAAQEAAIADgAMAAAkAAAEBAQEBAQEBAQEBAAIAAAAAgAAA/wAAAP+AAAD/AAMAAAD/gAAA/wAAAAEAAAD+AAAAAAEAgACABAADAAATAAABAQEBAQEBAQEBAQEBAQEBAQEBAQEAAoAAAP6AAAABgAAAAIAAAP+AAAD9AAAAAgAAAP6AAAD/gAAAAIADAAAA/4AAAP+AAAD/gAAA/4AAAP+AAAAAgAAAAIAAAACAAAAAgAAAAAAAAQCAAIADgAOAABMAAAEBAQEBAQEBAQEBAQEBAQEBAQEBAQABAAAAAQAAAP8AAAAAgAAAAQAAAP+AAAD+gAAA/4AAAP+AAAAAgAOAAAD/gAAA/4AAAP6AAAAAgAAA/4AAAP+AAAAAgAAAAYAAAACAAAAAAAABAIAAgAOAAwAADwAAAQEBAQEBAQEBAQEBAQEBAQCAAQAAAACAAAAAgAAAAQAAAP+AAAD/gAAA/oAAAP+AAwAAAP4AAAAAgAAAAYAAAP2AAAAAgAAA/4AAAACAAAAAAAABAIAAgAOAAwAADwAAAQEBAQEBAQEBAQEBAQEBAQCAAQAAAAEAAAABAAAA/4AAAP+AAAD/AAAA/4AAAP+AAwAAAP6AAAABgAAA/oAAAP+AAAD/gAAAAIAAAACAAAAAAAABAIAAgAQAAwAAEwAAAQEBAQEBAQEBAQEBAQEBAQEBAQEAgAEAAAAAgAAAAIAAAACAAAABAAAA/4AAAP8AAAD/gAAA/wAAAP+AAwAAAP6AAAAAgAAA/4AAAAGAAAD+AAAA/4AAAACAAAD/gAAAAIAAAAAAAAEAgACAA4ADAAAbAAABAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAIABAAAAAQAAAAEAAAD/gAAA/4AAAACAAAAAgAAA/wAAAP8AAAD/AAAAAIAAAACAAAD/gAAA/4ADAAAA/4AAAACAAAD/gAAA/4AAAP+AAAD/gAAA/4AAAACAAAD/gAAAAIAAAACAAAAAgAAAAIAAAAAAAAEAgACAA4ADAAAPAAABAQEBAQEBAQEBAQEBAQEBAIABAAAAAQAAAAEAAAD/gAAA/gAAAAGAAAD+gAAA/4ADAAAA/wAAAAEAAAD+AAAA/4AAAACAAAAAgAAAAIAAAAAAAAEAgACAA4ADAAATAAABAQEBAQEBAQEBAQEBAQEBAQEBAQCAAwAAAP+AAAD/gAAA/4AAAAGAAAD9AAAAAIAAAACAAAAAgAAA/oADAAAA/4AAAP+AAAD/gAAA/4AAAP+AAAAAgAAAAIAAAACAAAAAgAAAAAAAAQCAAIADAAQAABMAAAEBAQEBAQEBAQEBAQEBAQEBAQEBAYABgAAA/wAAAP+AAAAAgAAAAQAAAP6AAAD/gAAA/4AAAACAAAAAgAQAAAD/gAAA/wAAAP+AAAD/AAAA/4AAAACAAAABAAAAAIAAAAEAAAAAAAABAYAAgAKABAAAAwAAAQEBAQGAAQAAAP8ABAAAAPyAAAAAAAABAQAAgAOABAAAEwAAAQEBAQEBAQEBAQEBAQEBAQEBAQEBAAGAAAAAgAAAAIAAAP+AAAD/gAAA/oAAAAEAAAAAgAAA/4AAAP8ABAAAAP+AAAD/AAAA/4AAAP8AAAD/gAAAAIAAAAEAAAAAgAAAAQAAAAAAAAEAgAGAA4ADAAAPAAABAQEBAQEBAQEBAQEBAQEBAQABAAAAAQAAAACAAAD/gAAA/wAAAP8AAAD/gAAAAIADAAAA/4AAAACAAAD/AAAA/4AAAACAAAD/gAAAAQAAAAAAAAEAAAAABAAEAAATAAABAQEBAQEBAQEBAQEBAQEBAQEBAQAAAYAAAAEAAAAAgAAAAIAAAACAAAD/AAAA/4AAAP+AAAD/AAAA/wAEAAAA/4AAAP+AAAD/gAAA/wAAAP6AAAABAAAAAQAAAACAAAAAgAAAAAAAAQIAAAAEAAQAAAMAAAEBAQECAAIAAAD+AAQAAAD8AAAAAAAAAgCAAIADgAQAABcAGwAAAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQGAAYAAAP8AAAABAAAA/4AAAP+AAAABgAAA/QAAAACAAAAAgAAA/wAAAACAAAAAgAGAAIAAAP+ABAAAAP+AAAD/AAAA/4AAAP+AAAD/gAAA/4AAAACAAAAAgAAAAIAAAACAAAABAAAAAAAAAP+AAAAAAQCAAIADgAQAABsAAAEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEAgAEAAAABAAAAAQAAAP+AAAAAgAAA/wAAAAEAAAD/AAAA/wAAAP8AAAABAAAA/wAAAACAAAD/gAQAAAD+gAAAAYAAAP8AAAD/gAAA/4AAAP+AAAD/gAAA/4AAAACAAAAAgAAAAIAAAACAAAAAgAAAAAAABACAAIAEAAQAABcAGwAfACMAAAEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEAAoAAAP4AAAABgAAAAIAAAACAAAD/gAAA/YAAAAIAAAD+gAAA/4AAAP+AAAAAgAEAAAAAgAAAAQAAgAAA/4D9AACAAAD/gAQAAAD/gAAA/4AAAP+AAAD/gAAA/wAAAP+AAAAAgAAAAIAAAACAAAAAgAAAAQAAAP8A/4AAAACAAQAAAP+AAAD+gAAA/4AAAAAEAIAAgAQAA4AAAwAHAAsADwAAAQEBAQEBAQEBAQEBAQEBAQCAAIAAAP+AAQAAgAAA/4ABAACAAAD/gAEAAIAAAP+AA4AAAP0AAAADAAAA/QAAAAMAAAD9AAAAAwAAAP0AAAAAAQIAAAAEAAQAAAkAAAEBAQEBAQEBAQEDgACAAAD+AAAAAIAAAACAAAAAgAQAAAD8AAAAAQAAAAEAAAABAAAAAAgAAAAABAAEAAADAAcACwAPABMAFwAbAB8AAAEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAAABAAAA/wACAAEAAAD/AP8AAQAAAP8AAgABAAAA/wD9AAEAAAD/AAIAAQAAAP8A/wABAAAA/wACAAEAAAD/AAQAAAD/AAAAAQAAAP8AAAAAAAAA/wAAAAEAAAD/AAAAAAAAAP8AAAABAAAA/wAAAAAAAAD/AAAAAQAAAP8AAAAAAQIAAAADAAQAAAMAAAEBAQECAAEAAAD/AAQAAAD8AAAAAAAAAgGAAIACgAQAAAMABwAAAQEBAQEBAQEBgAEAAAD/AAAAAQAAAP8ABAAAAP6AAAD/gAAA/oAAAAABAgAAAAQAAgAAAwAAAQEBAQIAAgAAAP4AAgAAAP4AAAAAAAAEAIAAAAQABAAAAwAHAAsADwAAAQEBAQEBAQEBAQEBAQEBAQCAAIAAAP+AAQAAgAAA/4ABAACAAAD/gAEAAIAAAP+ABAAAAPwAAAAEAAAA/AAAAAQAAAD8AAAABAAAAPwAAAAAAQCAAIADgAOAABMAAAEBAQEBAQEBAQEBAQEBAQEBAQEBAoABAAAA/oAAAP+AAAD/gAAA/4AAAACAAAAAgAAAAIAAAAEAAAD/gAOAAAD+AAAA/wAAAACAAAAAgAAAAIAAAACAAAAAgAAA/wAAAAEAAAAAAAABAAAAAAQABAAACwAAAQEBAQEBAQEBAQEBAAAEAAAA/gAAAP+AAAD/gAAA/4AAAP+ABAAAAPwAAAAAgAAAAIAAAACAAAAAgAAAAAAAAQCAAIAEAAOAABsAAAEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEAgACAAAAAgAAAAIAAAACAAAAAgAAAAIAAAACAAAD/gAAA/4AAAP+AAAD/gAAA/4AAAP+AAAD/gAOAAAD/gAAAAIAAAP8AAAABAAAA/oAAAAGAAAD9AAAAAIAAAP+AAAABAAAA/wAAAAGAAAD+gAAAAAAAAQAAAAACAAQAAAkAAAEBAQEBAQEBAQEAAACAAAAAgAAAAIAAAACAAAD+AAQAAAD/AAAA/wAAAP8AAAD/AAAAAAEAAAAABAAEAAATAAABAQEBAQEBAQEBAQEBAQEBAQEBAQKAAYAAAP8AAAD/AAAA/4AAAP+AAAD/AAAAAIAAAACAAAAAgAAAAQAEAAAA/wAAAP+AAAD/gAAA/wAAAP8AAAABgAAAAQAAAACAAAAAgAAAAAAAAQAAAAAEAAIAAA8AAAEBAQEBAQEBAQEBAQEBAQEBgAEAAAAAgAAAAIAAAACAAAD8AAAAAIAAAACAAAAAgAIAAAD/gAAA/4AAAP+AAAD/gAAAAIAAAACAAAAAgAAAAAAAAgAAAAAEAAQAAAMABwAAAQEBAQEBAQEAAAIAAAD+AAIAAgAAAP4ABAAAAP4AAAAAAAAA/gAAAAAEAAACAAQABAAAAwAHAAsADwAAAQEBAQEBAQEBAQEBAQEBAQAAAQAAAP8AAgABAAAA/wD/AAEAAAD/AAIAAQAAAP8ABAAAAP8AAAABAAAA/wAAAAAAAAD/AAAAAQAAAP8AAAAABAIAAAAEAAQAAAMABwALAA8AAAEBAQEBAQEBAQEBAQEBAQECAAEAAAD/AAEAAQAAAP8A/wABAAAA/wABAAEAAAD/AAQAAAD/AAAAAAAAAP8AAAAAAAAA/wAAAAAAAAD/AAAAAAEDAAAABAAEAAADAAABAQEBAwABAAAA/wAEAAAA/AAAAAAAAAEAAAAABAAEAAAFAAABAQEBAQEAAAQAAAD9AAAA/wAEAAAA/wAAAP0AAAAAAQAAAAABAAQAAAMAAAEBAQEAAAEAAAD/AAQAAAD8AAAAAAAAAwCAAIADAAOAAAMABwALAAABAQEBAQEBAQEBAQEAgACAAAD/gAEAAIAAAP+AAQAAgAAA/4ADgAAA/QAAAAMAAAD9AAAAAwAAAP0AAAAAAAABAYABgAQABAAACwAAAQEBAQEBAQEBAQEBAYABAAAAAIAAAAEAAAD+gAAA/4AAAP+ABAAAAP8AAAD/gAAA/wAAAACAAAAAgAAAAAAAAQAAAYACgAQAAAsAAAEBAQEBAQEBAQEBAQGAAQAAAP+AAAD/gAAA/oAAAAEAAAAAgAQAAAD+gAAA/4AAAP+AAAABAAAAAIAAAAAAAAEAAAAABAAEAAAJAAABAQEBAQEBAQEBAwABAAAA/AAAAAEAAAABAAAAAQAEAAAA/AAAAAKAAAAAgAAAAIAAAAABAIAAgAMABAAACwAAAQEBAQEBAQEBAQEBAgABAAAA/4AAAP6AAAD/gAAAAIAAAAEABAAAAP0AAAD/gAAAAIAAAAEAAAAAgAAAAAAAAQAAAAAEAAQAAAUAAAEBAQEBAQAAAQAAAAMAAAD8AAQAAAD9AAAA/wAAAAACAIAAgAMAAoAACwAPAAABAQEBAQEBAQEBAQEBAQEBAQABgAAAAIAAAP+AAAD+gAAAAQAAAP8A/4AAgAAA/4ACgAAA/4AAAP8AAAD/gAAAAIAAAAEAAAAAAAAA/wAAAAACAIAAgAMABAAACwAPAAABAQEBAQEBAQEBAQEBAQEBAgABAAAA/4AAAP6AAAABAAAA/wAAAAEA/oAAgAAA/4AEAAAA/QAAAP+AAAAAgAAAAQAAAACAAAD/gAAA/wAAAAABAIAAgAQABAAADQAAAQEBAQEBAQEBAQEBAQECAAIAAAD/AAAA/4AAAP6AAAD/gAAAAIAAAAEABAAAAP+AAAD9gAAA/4AAAACAAAABAAAAAIAAAAACAAAAAAQABAAAAwAHAAABAQEBAQEBAQAABAAAAPwAAQAAAAIAAAAEAAAA/AAAAAMA/gAAAAIAAAEAgACABAAEAAARAAABAQEBAQEBAQEBAQEBAQEBAQECAAIAAAD/AAAAAQAAAP8AAAD/gAAA/oAAAP+AAAAAgAAAAQAEAAAA/4AAAP+AAAD/gAAA/oAAAP+AAAAAgAAAAQAAAACAAAAAAQAAAAACgAKAAAsAAAEBAQEBAQEBAQEBAQAAAYAAAACAAAAAgAAA/wAAAP+AAAD/AAKAAAD/gAAA/4AAAP6AAAABAAAAAIAAAAAAAAEAAAAABAAEAAAFAAABAQEBAQEAAAQAAAD/AAAA/QAEAAAA/AAAAAMAAAAAAQCAAIAEAAQAABUAAAEBAQEBAQEBAQEBAQEBAQEBAQEBAQECAAIAAAD/AAAAAQAAAP8AAAABAAAA/wAAAP+AAAD+gAAA/4AAAACAAAABAAQAAAD/gAAA/4AAAP+AAAD/gAAA/4AAAP+AAAD/gAAAAIAAAAEAAAAAgAAAAAEBgAAABAACgAALAAABAQEBAQEBAQEBAQECgAGAAAD/AAAA/4AAAP8AAAAAgAAAAIACgAAA/wAAAP+AAAD/AAAAAYAAAACAAAAAAAABAAAAAAQABAAAEQAAAQEBAQEBAQEBAQEBAQEBAQEBAAAAgAAAAIAAAACAAAAAgAAAAIAAAACAAAAAgAAAAIAAAPwABAAAAP+AAAD/gAAA/4AAAP+AAAD/gAAA/4AAAP+AAAD/gAAAAAEAAAAABAABAAADAAABAQEBAAAEAAAA/AABAAAA/wAAAAAAAAEAAAAABAAEAAARAAABAQEBAQEBAQEBAQEBAQEBAQEDgACAAAD8AAAAAIAAAACAAAAAgAAAAIAAAACAAAAAgAAAAIAEAAAA/AAAAACAAAAAgAAAAIAAAACAAAAAgAAAAIAAAACAAAAAAQAAAgAEAAQAAAMAAAEBAQEAAAQAAAD8AAQAAAD+AAAAAAAAAgCAAIACAAOAAAMABwAAAQEBAQEBAQEAgACAAAD/gAEAAIAAAP+AA4AAAP0AAAADAAAA/QAAAAAEAIAAgAQABAAAAwAHAAsADwAAAQEBAQEBAQEBAQEBAQEBAQCAA4AAAPyAAIAAAACAAAAAgAAAAIAAAACAAAAAgAAABAAAAPyAAAADAP+AAAAAgP8A/4AAAACA/wD/gAAAAIAAAQAAAAAEAAQAAAUAAAEBAQEBAQMAAQAAAPwAAAADAAQAAAD8AAAAAQAAAAACAIAAgAQABAAAAwAHAAABAQEBAQEBAQCAA4AAAPyAAYAAAACAAAAEAAAA/IAAAAIA/4AAAACAAAMAgACABAAEAAADAAcACwAAAQEBAQEBAQEBAQEBAIADgAAA/IAAgAAAAIAAAAGAAAAAgAAABAAAAPyAAAADAP+AAAAAgP4A/4AAAACAAAAABAAAAIAEAAQAAAMABwALAA8AAAEBAQEBAQEBAQEBAQEBAQEAAAQAAAD8AAAABAAAAPwAAAAEAAAA/AAAAAQAAAD8AAQAAAD/gAAA/4AAAP+AAAD/gAAA/4AAAP+AAAD/gAAAAAYAgACABAAEAAADAAcACwAPABMAFwAAAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAIADgAAA/IAAgAAAAIAAAAGAAAAAgAAA/oAAAACAAAD+gAAAAIAAAAGAAAAAgAAABAAAAPyAAAADAP+AAAAAgAAA/4AAAACA/wD/gAAAAID/AP+AAAAAgAAA/4AAAACAAAEAgACAAQADgAADAAABAQEBAIAAgAAA/4ADgAAA/QAAAAAAAAUAgACABAAEAAADAAcACwAPABMAAAEBAQEBAQEBAQEBAQEBAQEBAQEBAIADgAAA/IAAgAAAAIAAAAGAAAAAgAAA/YAAAACAAAABgAAAAIAAAAQAAAD8gAAAAwD/gAAAAIAAAP+AAAAAgP4A/4AAAACAAAD/gAAAAIAAAAABAAADAAQABAAAAwAAAQEBAQAABAAAAPwABAAAAP8AAAAAAAAHAIAAgAQABAAAAwAHAAsADwATABcAGwAAAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQCAA4AAAPyAAIAAAACAAAABgAAAAIAAAP2AAAAAgAAAAYAAAACAAAD9gAAAAIAAAAGAAAAAgAAABAAAAPyAAAADAP+AAAAAgAAA/4AAAACA/wD/gAAAAIAAAP+AAAAAgP8A/4AAAACAAAD/gAAAAIAAAAAEAAAAAAQAAgAAAwAHAAsADwAAAQEBAQEBAQEBAQEBAQEBAQAAAQAAAP8AAgABAAAA/wD/AAEAAAD/AAIAAQAAAP8AAgAAAP8AAAABAAAA/wAAAAAAAAD/AAAAAQAAAP8AAAAAAQAAAAAEAAQAAAkAAAEBAQEBAQEBAQEAAAEAAAABAAAAAQAAAAEAAAD8AAQAAAD/gAAA/4AAAP+AAAD9gAAAAAEBAAAAAgAEAAADAAABAQEBAQABAAAA/wAEAAAA/AAAAAAAAAEAAAAABAAEAAALAAABAQEBAQEBAQEBAQECgAGAAAD8AAAAAIAAAACAAAAAgAAAAQAEAAAA/AAAAAGAAAABAAAAAIAAAACAAAAAAAABAAABAAQAAgAAAwAAAQEBAQAABAAAAPwAAgAAAP8AAAAAAAABAAAAAAQABAAACwAAAQEBAQEBAQEBAQEBAgACAAAA/AAAAACAAAAAgAAAAIAAAACABAAAAPwAAAACAAAAAIAAAACAAAAAgAAAAAAAAQAAAAAEAAIAAAkAAAEBAQEBAQEBAQEDAAEAAAD8AAAAAQAAAAEAAAABAAIAAAD+AAAAAIAAAACAAAAAgAAAAAEAAAAABAAEAAALAAABAQEBAQEBAQEBAQEAAAIAAAAAgAAAAIAAAACAAAAAgAAA/AAEAAAA/4AAAP+AAAD/gAAA/4AAAP4AAAAAAAADAAAAAAQABAAAGwAnADMAAAEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEAAAEAAAAAgAAAAIAAAACAAAAAgAAAAIAAAACAAAD/AAAA/4AAAP+AAAD/gAAA/4AAAP+AAAD/gAIAAYAAAACAAAD/gAAA/4AAAP+AAAD/gP4AAIAAAACAAAAAgAAAAIAAAP6AAAD/gAQAAAD/gAAA/4AAAP+AAAD/gAAA/4AAAP+AAAD/AAAAAIAAAACAAAAAgAAAAIAAAACAAAAAgAAAAQAAAP+AAAD+gAAAAIAAAACAAAAAgAAA/oAAAP+AAAD/gAAA/4AAAP+AAAAAgAAAAAAAAQAAAAAEAAIAAAkAAAEBAQEBAQEBAQEAAAEAAAABAAAAAQAAAAEAAAD8AAIAAAD/gAAA/4AAAP+AAAD/gAAAAAEAAAAABAAEAAALAAABAQEBAQEBAQEBAQEAAAGAAAABAAAAAIAAAACAAAAAgAAA/AAEAAAA/4AAAP+AAAD/gAAA/wAAAP6AAAAAAAAEAAAAgAQABAAAAwAHAAsADwAAAQEBAQEBAQEBAQEBAQEBAQCAAYAAAP6AAgABgAAA/oD9gAGAAAD+gAIAAYAAAP6ABAAAAP6AAAABgAAA/oAAAP+AAAD+gAAAAYAAAP6AAAAAAQIAAgAEAAQAAAMAAAEBAQECAAIAAAD+AAQAAAD+AAAAAAAABACAAIAEAAQAAAMABwAjACcAAAEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAAEAAAD/AAGAAQAAAP8A/gAAgAAAAIAAAACAAAAAgAAAAIAAAACAAAAAgAAA/4AAAP+AAAD/gAAA/4AAAP+AAAD/gAAA/4ABgACAAAD/gAQAAAD/gAAAAIAAAP+AAAAAAAAA/wAAAP+AAAD/gAAAAIAAAACAAAABAAAA/oAAAP+AAAD/gAAA/4AAAACAAAAAgAAAAIAAAAGAAAD/gAAAAAQAAAAABAAEAAADAAcACwAPAAABAQEBAQEBAQEBAQEBAQEBAAAAgAAA/4ADgACAAAD/gPyAAIAAAP+AA4AAgAAA/4AEAAAA/4AAAACAAAD/gAAA/QAAAP+AAAAAgAAA/4AAAAABAAAAAAIAAgAAAwAAAQEBAQAAAgAAAP4AAgAAAP4AAAAAAAAEAAAAAAIABAAAAwAHAAsADwAAAQEBAQEBAQEBAQEBAQEBAQAAAQAAAP8AAQABAAAA/wD/AAEAAAD/AAEAAQAAAP8ABAAAAP8AAAAAAAAA/wAAAAAAAAD/AAAAAAAAAP8AAAAAAQCAAQADgAOAABMAAAEBAQEBAQEBAQEBAQEBAQEBAQEBAYABAAAA/4AAAAGAAAD+gAAAAIAAAP8AAAD/gAAA/4AAAACAAAAAgAOAAAD/gAAA/4AAAP+AAAD/gAAA/4AAAACAAAAAgAAAAIAAAACAAAAAAAABAQABAAOABAAAEwAAAQEBAQEBAQEBAQEBAQEBAQEBAQECAACAAAAAgAAAAIAAAP+AAAD/gAAA/4AAAP+AAAD/gAAAAIAAAACABAAAAP+AAAD/gAAA/wAAAACAAAD+gAAAAYAAAP+AAAABAAAAAIAAAAAAAAEBAAEABAADgAATAAABAQEBAQEBAQEBAQEBAQEBAQEBAQIAAQAAAACAAAAAgAAA/4AAAP+AAAD/AAAAAIAAAP6AAAABgAAA/4ADgAAA/4AAAP+AAAD/gAAA/4AAAP+AAAAAgAAAAIAAAACAAAAAgAAAAAAAAQEAAIADgAOAABMAAAEBAQEBAQEBAQEBAQEBAQEBAQEBAgAAgAAAAIAAAACAAAD/gAAA/4AAAP+AAAD/gAAA/4AAAACAAAAAgAOAAAD+gAAAAIAAAP8AAAD/gAAA/4AAAACAAAAAgAAAAQAAAP+AAAAAAAABAQAAgAOABAAADwAAAQEBAQEBAQEBAQEBAQEBAQIAAIAAAACAAAAAgAAA/4AAAP6AAAD/gAAAAIAAAACABAAAAP8AAAD/AAAA/wAAAP+AAAAAgAAAAQAAAAEAAAAAAAACAIAAgAOAA4AAAwAJAAABAQEBAQEBAQEBAIADAAAA/QAAgAAAAgAAAP8AAAADgAAA/QAAAAKA/gAAAAEAAAABAAAAAAIAgACABAAEAAAbACcAAAEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQECAACAAAAAgAAAAIAAAACAAAD/gAAA/4AAAP+AAAD/gAAA/4AAAP+AAAD/gAAAAIAAAACAAAAAgAAAAAD/gAAAAIAAAACAAAAAgAAA/4AAAAQAAAD/gAAA/4AAAP+AAAD/gAAA/4AAAP+AAAD/gAAAAIAAAACAAAAAgAAAAIAAAACAAAAAgAAA/4D/gAAA/4AAAP+AAAAAgAAAAIAAAACAAAEAAAIABAADAAADAAABAQEBAAAEAAAA/AADAAAA/wAAAAAAAAEAAAAABAAEAAALAAABAQEBAQEBAQEBAQEAAAQAAAD/gAAA/4AAAP+AAAD/gAAA/gAEAAAA/gAAAP+AAAD/gAAA/4AAAP+AAAAAAAABAAACAAIABAAAAwAAAQEBAQAAAgAAAP4ABAAAAP4AAAAAAAACAQAAgAOAA4AAFwAbAAABAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAYABgAAAAIAAAP8AAAAAgAAAAIAAAP8AAAD/gAAA/wAAAACAAAAAgAAA/wAAAACAAIAAAACAAAADgAAA/wAAAP+AAAD/gAAA/4AAAP+AAAAAgAAA/4AAAACAAAAAgAAAAIAAAACAAAAAgP+AAAAAgAADAAAAAAQABAAACwAnADMAAAEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEAgAGAAAD/gAAA/4AAAP+AAAD/gAAAAIACgAEAAAD/gAAA/4AAAP+AAAD/gAAA/4AAAP+AAAD/AAAAAIAAAACAAAAAgAAAAIAAAACAAAAAgACAAIAAAP+AAAD+gAAAAIAAAACAAAAAgAQAAAD/gAAA/4AAAP+AAAD/gAAAAYAAAACAAAD/AAAA/4AAAP+AAAD/gAAA/4AAAP+AAAD/gAAAAQAAAACAAAAAgAAAAIAAAACAAAAAgAAA/oAAAP6AAAD/gAAAAIAAAACAAAAAgAAAAAAAAgCAAIADgAQAAA8AHwAAAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAAEAAAABAAAAAIAAAP+AAAD/AAAA/wAAAP+AAAAAgAAAAQAAAAEAAAAAgAAA/4AAAP8AAAD/AAAA/4AAAACABAAAAP+AAAAAgAAA/wAAAP+AAAAAgAAA/4AAAAEAAAD+gAAA/4AAAACAAAD/AAAA/4AAAACAAAD/gAAAAQAAAAABAAAAAAQAA4AACwAAAQEBAQEBAQEBAQEBAQACAAAAAIAAAACAAAD8AAAAAIAAAACAA4AAAP+AAAD/gAAA/YAAAAKAAAAAgAAAAAAAAQAAAAACAAQAAA8AAAEBAQEBAQEBAQEBAQEBAQEAAACAAAAAgAAAAIAAAACAAAD/gAAA/4AAAP+AAAD/gAQAAAD/gAAA/4AAAP+AAAD/AAAA/4AAAP+AAAD/gAAAAAAAAQIAAAAEAAQAAA8AAAEBAQEBAQEBAQEBAQEBAQEDgACAAAD/gAAA/4AAAP+AAAD/gAAAAIAAAACAAAAAgAQAAAD8AAAAAIAAAACAAAAAgAAAAQAAAACAAAAAgAAAAAAAAQCAAIAEAAQAABcAAAEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQIAAIAAAACAAAAAgAAAAIAAAP+AAAD/AAAA/4AAAP8AAAD/gAAAAIAAAACAAAAAgAQAAAD/gAAA/4AAAP+AAAD/gAAA/oAAAAEAAAD/AAAAAYAAAACAAAAAgAAAAIAAAAAAACAAAAAABAAEAAADAAcACwAPABMAFwAbAB8AIwAnACsALwAzADcAOwA/AEMARwBLAE8AUwBXAFsAXwBjAGcAawBvAHMAdwB7AH8AAAEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAAAAgAAA/4ABAACAAAD/gAEAAIAAAP+AAQAAgAAA/4D9gACAAAD/gAEAAIAAAP+AAQAAgAAA/4ABAACAAAD/gPyAAIAAAP+AAQAAgAAA/4ABAACAAAD/gAEAAIAAAP+A/YAAgAAA/4ABAACAAAD/gAEAAIAAAP+AAQAAgAAA/4D8gACAAAD/gAEAAIAAAP+AAQAAgAAA/4ABAACAAAD/gP2AAIAAAP+AAQAAgAAA/4ABAACAAAD/gAEAAIAAAP+A/IAAgAAA/4ABAACAAAD/gAEAAIAAAP+AAQAAgAAA/4D9gACAAAD/gAEAAIAAAP+AAQAAgAAA/4ABAACAAAD/gAQAAAD/gAAAAIAAAP+AAAAAgAAA/4AAAACAAAD/gAAAAAAAAP+AAAAAgAAA/4AAAACAAAD/gAAAAIAAAP+AAAAAAAAA/4AAAACAAAD/gAAAAIAAAP+AAAAAgAAA/4AAAAAAAAD/gAAAAIAAAP+AAAAAgAAA/4AAAACAAAD/gAAAAAAAAP+AAAAAgAAA/4AAAACAAAD/gAAAAIAAAP+AAAAAAAAA/4AAAACAAAD/gAAAAIAAAP+AAAAAgAAA/4AAAAAAAAD/gAAAAIAAAP+AAAAAgAAA/4AAAACAAAD/gAAAAAAAAP+AAAAAgAAA/4AAAACAAAD/gAAAAIAAAP+AAAAAAQAAAAAEAAQAAAsAAAEBAQEBAQEBAQEBAQAABAAAAP6AAAD/AAAA/4AAAP+AAAD/gAQAAAD8AAAAAIAAAACAAAAAgAAAAQAAAAAAAAEAAAAABAAEAAALAAABAQEBAQEBAQEBAQEAAAQAAAD/gAAA/4AAAP+AAAD/AAAA/oAEAAAA/oAAAP8AAAD/gAAA/4AAAP+AAAAAAAABAAABgAKABAAADwAAAQEBAQEBAQEBAQEBAQEBAQAAAQAAAACAAAAAgAAAAIAAAP8AAAD/gAAA/4AAAP+ABAAAAP+AAAD/gAAA/4AAAP8AAAAAgAAAAIAAAACAAAAAAAABAAAAAAKABAAADwAAAQEBAQEBAQEBAQEBAQEBAQAAAQAAAACAAAAAgAAAAIAAAP8AAAD/gAAA/4AAAP+ABAAAAP+AAAD/gAAA/4AAAP2AAAACAAAAAIAAAACAAAAAAAABAYAAAAQAAoAABQAAAQEBAQEBAYACgAAA/oAAAP8AAoAAAP8AAAD+gAAAAAEAAAAABAAEAAAJAAABAQEBAQEBAQEBAAACgAAAAIAAAACAAAAAgAAA/AAEAAAA/wAAAP8AAAD/AAAA/wAAAAACAAAAAAQABAAAGwAfAAABAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQGAAQAAAACAAAAAgAAAAIAAAP+AAAD/gAAA/4AAAP8AAAD/gAAA/4AAAP+AAAAAgAAAAIAAAACAAAAAAAEAAAAEAAAA/4AAAP+AAAD/gAAA/wAAAP+AAAD/gAAA/4AAAACAAAAAgAAAAIAAAAEAAAAAgAAAAIAAAP8A/wAAAAEAAAEBgAGABAAEAAAFAAABAQEBAQEBgAEAAAABgAAA/YAEAAAA/oAAAP8AAAAAAQAAAAACgAKAAA8AAAEBAQEBAQEBAQEBAQEBAQEBgAEAAAD/gAAA/4AAAP+AAAD/AAAAAIAAAACAAAAAgAKAAAD/AAAA/4AAAP+AAAD/gAAAAQAAAACAAAAAgAAAAAAAAQGAAAAEAAQAAA8AAAEBAQEBAQEBAQEBAQEBAQEDAAEAAAD/gAAA/4AAAP+AAAD/AAAAAIAAAACAAAAAgAQAAAD/AAAA/4AAAP+AAAD+AAAAAoAAAACAAAAAgAAAAAAAAQGAAAAEAAKAAA8AAAEBAQEBAQEBAQEBAQEBAQEBgAEAAAAAgAAAAIAAAACAAAD/AAAA/4AAAP+AAAD/gAKAAAD/gAAA/4AAAP+AAAD/AAAAAIAAAACAAAAAgAAAAAAAAQGAAYAEAAQAAA8AAAEBAQEBAQEBAQEBAQEBAQEDAAEAAAD/gAAA/4AAAP+AAAD/AAAAAIAAAACAAAAAgAQAAAD/AAAA/4AAAP+AAAD/gAAAAQAAAACAAAAAgAAAAAAAAQAAAAAEAAQAABsAAAEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEAAAEAAAAAgAAAAIAAAACAAAAAgAAAAIAAAACAAAD/AAAA/4AAAP+AAAD/gAAA/4AAAP+AAAD/gAQAAAD/gAAA/4AAAP+AAAD/gAAA/4AAAP+AAAD/AAAAAIAAAACAAAAAgAAAAIAAAACAAAAAgAAAAAAAAQAAAAAEAAQAAB8AAAEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAAABAAAAAIAAAAEAAAAAgAAAAQAAAP+AAAD/gAAA/4AAAP+AAAD/gAAA/4AAAP8AAAAAgAAAAIAAAP+AAAD/gAQAAAD/gAAA/4AAAACAAAAAgAAA/wAAAP+AAAD/gAAA/4AAAP+AAAD/gAAA/4AAAAEAAAAAgAAAAQAAAACAAAAAAAABAAABgAQABAAADwAAAQEBAQEBAQEBAQEBAQEBAQAAAQAAAACAAAAAgAAAAgAAAP2AAAD/gAAA/4AAAP+ABAAAAP+AAAD/gAAA/4AAAP8AAAAAgAAAAIAAAACAAAAAAAABAAABgAQAAoAAAwAAAQEBAQAABAAAAPwAAoAAAP8AAAAAAAABAYAAAAKABAAAAwAAAQEBAQGAAQAAAP8ABAAAAPwAAAAAAAABAYAAAAQABAAAFwAAAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAwABAAAA/4AAAP+AAAAAgAAAAIAAAP8AAAD/gAAA/4AAAP+AAAAAgAAAAIAAAACABAAAAP8AAAD/gAAA/wAAAP+AAAD/AAAAAIAAAACAAAAAgAAAAQAAAACAAAAAgAAAAAAAAQAAAAAEAAKAAA8AAAEBAQEBAQEBAQEBAQEBAQEAAAKAAAAAgAAAAIAAAACAAAD/AAAA/4AAAP+AAAD+AAKAAAD/gAAA/4AAAP+AAAD/AAAAAIAAAACAAAAAgAAAAAAAAQAAAYAEAAQAAA8AAAEBAQEBAQEBAQEBAQEBAQEDAAEAAAD/gAAA/4AAAP+AAAD9gAAAAgAAAACAAAAAgAQAAAD/AAAA/4AAAP+AAAD/gAAAAQAAAACAAAAAgAAAAAAAAQAAAgAEAAQAAA8AAAEBAQEBAQEBAQEBAQEBAQEAAAQAAAD/gAAA/4AAAP+AAAD/AAAA/4AAAP+AAAD/gAQAAAD/gAAA/4AAAP+AAAD/gAAAAIAAAACAAAAAgAAAAAAAAQAAAYACgAKAAAMAAAEBAQEAAAKAAAD9gAKAAAD/AAAAAAAAAQGAAAACgAKAAAMAAAEBAQEBgAEAAAD/AAKAAAD9gAAAAAAAAQAAAYAEAAQAABcAAAEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQAAAQAAAACAAAABAAAAAIAAAAEAAAD/gAAA/4AAAP+AAAD/AAAA/4AAAP+AAAD/gAQAAAD/gAAA/4AAAACAAAAAgAAA/wAAAP+AAAD/gAAA/4AAAACAAAAAgAAAAIAAAAAAAAEAAAAABAAEAAAJAAABAQEBAQEBAQEBAYACgAAA/AAAAACAAAAAgAAAAIAEAAAA/AAAAAEAAAABAAAAAQAAAAABAAAAAAQABAAAEwAAAQEBAQEBAQEBAQEBAQEBAQEBAQEDAAEAAAD/gAAA/4AAAP+AAAD/AAAA/oAAAAEAAAABAAAAAIAAAACABAAAAP6AAAD/AAAA/4AAAP+AAAD/gAAAAQAAAACAAAAAgAAAAQAAAAAAAAEAAAAABAAEAAATAAABAQEBAQEBAQEBAQEBAQEBAQEBAQAAAQAAAACAAAAAgAAAAQAAAAEAAAD+gAAA/wAAAP+AAAD/gAAA/4AEAAAA/wAAAP8AAAD/gAAA/4AAAP8AAAAAgAAAAIAAAACAAAABAAAAAAAAAQAAAAAEAAQAABsAAAEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEDAAEAAAD/gAAA/4AAAP+AAAD/gAAA/4AAAP+AAAD/AAAAAIAAAACAAAAAgAAAAIAAAACAAAAAgAQAAAD/AAAA/4AAAP+AAAD/gAAA/4AAAP+AAAD/gAAAAQAAAACAAAAAgAAAAIAAAACAAAAAgAAAAAAAAQAAAAACgAQAABcAAAEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQAAAQAAAACAAAAAgAAAAIAAAP+AAAD/gAAA/4AAAP8AAAAAgAAAAIAAAP+AAAD/gAQAAAD/gAAA/4AAAP+AAAD/AAAA/4AAAP+AAAD/gAAAAQAAAACAAAABAAAAAIAAAAAAAAEAAAAABAAEAAAfAAABAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQAAAQAAAACAAAAAgAAAAIAAAACAAAAAgAAAAIAAAP8AAAD/gAAA/wAAAP+AAAD/AAAAAIAAAACAAAD/gAAA/4AEAAAA/4AAAP+AAAD/gAAA/4AAAP+AAAD/gAAA/wAAAACAAAAAgAAA/4AAAP+AAAABAAAAAIAAAAEAAAAAgAAAAAAAAQAAAAACgAQAAA8AAAEBAQEBAQEBAQEBAQEBAQEBgAEAAAD/gAAA/4AAAP+AAAD/AAAAAIAAAACAAAAAgAQAAAD9gAAA/4AAAP+AAAD/gAAAAQAAAACAAAAAgAAAAAAAAQGAAAAEAAQAAA8AAAEBAQEBAQEBAQEBAQEBAQEBgAEAAAAAgAAAAIAAAACAAAD/AAAA/4AAAP+AAAD/gAQAAAD+AAAA/4AAAP+AAAD/AAAAAIAAAACAAAAAgAAAAAAAAQAAAAAEAAKAAA8AAAEBAQEBAQEBAQEBAQEBAQEBgAKAAAD+AAAA/4AAAP+AAAD/AAAAAIAAAACAAAAAgAKAAAD/AAAA/4AAAP+AAAD/gAAAAQAAAACAAAAAgAAAAAAAAQGAAYACgAQAAAMAAAEBAQEBgAEAAAD/AAQAAAD9gAAAAAAAAQGAAYAEAAKAAAMAAAEBAQEBgAKAAAD9gAKAAAD/AAAAAAAAAQAAAAAEAAQAAB8AAAEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAwABAAAA/4AAAP+AAAAAgAAAAIAAAP8AAAD/gAAA/wAAAP+AAAD/AAAAAIAAAACAAAAAgAAAAIAAAACAAAAAgAQAAAD/AAAA/4AAAP8AAAD/gAAA/wAAAACAAAAAgAAA/4AAAP+AAAABAAAAAIAAAACAAAAAgAAAAIAAAACAAAAAAAABAAAAAAQABAAAIwAAAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAAABAAAAAIAAAAEAAAAAgAAAAQAAAP+AAAD/gAAAAIAAAACAAAD/AAAA/4AAAP8AAAD/gAAA/wAAAACAAAAAgAAA/4AAAP+ABAAAAP+AAAD/gAAAAIAAAACAAAD/AAAA/4AAAP8AAAD/gAAA/wAAAACAAAAAgAAA/4AAAP+AAAABAAAAAIAAAAEAAAAAgAAAAAAAAQGAAYACgAKAAAMAAAEBAQEBgAEAAAD/AAKAAAD/AAAAAAAAAQAAAAAEAAKAABcAAAEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQGAAQAAAACAAAAAgAAAAIAAAP8AAAD/gAAA/wAAAP+AAAD/AAAAAIAAAACAAAAAgAKAAAD/gAAA/4AAAP+AAAD/AAAAAIAAAACAAAD/gAAA/4AAAAEAAAAAgAAAAIAAAAAAAAEAAAGAAoAEAAAFAAABAQEBAQEBgAEAAAD9gAAAAYAEAAAA/YAAAAEAAAAAAQAAAAACgAKAAAUAAAEBAQEBAQAAAoAAAP8AAAD+gAKAAAD9gAAAAYAAAAABAAAAAAQABAAAHwAAAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEAAAEAAAAAgAAAAQAAAACAAAABAAAA/4AAAP+AAAAAgAAAAIAAAP8AAAD/gAAA/4AAAP+AAAD/gAAA/4AAAP+ABAAAAP+AAAD/gAAAAIAAAACAAAD/AAAA/4AAAP8AAAD/gAAA/wAAAACAAAAAgAAAAIAAAACAAAAAgAAAAIAAAAAAAAEAAAAABAAEAAALAAABAQEBAQEBAQEBAQEBgAEAAAABgAAA/oAAAP8AAAD+gAAAAYAEAAAA/oAAAP8AAAD+gAAAAYAAAAEAAAAAAAABAAAAAAQAAoAABwAAAQEBAQEBAQEAAAQAAAD+gAAA/wAAAP6AAoAAAP8AAAD+gAAAAYAAAAAAAAEBgAAABAAEAAAHAAABAQEBAQEBAQGAAQAAAAGAAAD+gAAA/wAEAAAA/oAAAP8AAAD+gAAAAAAAAQAAAAACgAQAAAcAAAEBAQEBAQEBAYABAAAA/wAAAP6AAAABgAQAAAD8AAAAAYAAAAEAAAAAAAABAAABgAQABAAABwAAAQEBAQEBAQEBgAEAAAABgAAA/AAAAAGABAAAAP6AAAD/AAAAAQAAAAAAAAQBAAEAAwADAAADAAcACwAPAAABAQEBAQEBAQEBAQEBAQEBAYABAAAA/wD/gACAAAD/gAGAAIAAAP+A/wABAAAA/wADAAAA/4AAAAAAAAD/AAAAAQAAAP8AAAAAAAAA/4AAAAACAIAAgAOAA4AACwAPAAABAQEBAQEBAQEBAQEBAQEBAQACAAAAAIAAAP+AAAD+AAAA/4AAAACAAIAAAAEAAAADgAAA/4AAAP4AAAD/gAAAAIAAAAIAAAD/gP8AAAABAAACAAAAAAQABAAAEwAfAAABAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEAAgAAAACAAAAAgAAA/4AAAP+AAAD+AAAA/4AAAP+AAAAAgAAAAIAAgAAA/4AAAACAAAABAAAAAIAAAP+AAAAEAAAA/4AAAP+AAAD+AAAA/4AAAP+AAAAAgAAAAIAAAAIAAAAAgAAA/4D/gAAA/wAAAP+AAAAAgAAAAQAAAACAABAAAAAABAAEAAADAAcACwAPABMAFwAbAB8AIwAnACsALwAzADcAOwA/AAABAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAYAAgAAA/4ACAACAAAD/gP2AAIAAAP+AAgAAgAAA/4D9gACAAAD/gAIAAIAAAP+A/YAAgAAA/4ACAACAAAD/gP+AAIAAAP+AAgAAgAAA/4D9gACAAAD/gAIAAIAAAP+A/YAAgAAA/4ACAACAAAD/gP2AAIAAAP+AAgAAgAAA/4AEAAAA/4AAAACAAAD/gAAAAAAAAP+AAAAAgAAA/4AAAAAAAAD/gAAAAIAAAP+AAAAAAAAA/4AAAACAAAD/gAAAAAAAAP+AAAAAgAAA/4AAAAAAAAD/gAAAAIAAAP+AAAAAAAAA/4AAAACAAAD/gAAAAAAAAP+AAAAAgAAA/4AAAAAQAAAAAAQABAAAAwAHAAsADwATABcAGwAfACMAJwArAC8AMwA3ADsAPwAAAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQAAAIAAAP+AAgAAgAAA/4D+gACAAAD/gAIAAIAAAP+A/oAAgAAA/4ACAACAAAD/gP6AAIAAAP+AAgAAgAAA/4D8gACAAAD/gAIAAIAAAP+A/oAAgAAA/4ACAACAAAD/gP6AAIAAAP+AAgAAgAAA/4D+gACAAAD/gAIAAIAAAP+ABAAAAP+AAAAAgAAA/4AAAAAAAAD/gAAAAIAAAP+AAAAAAAAA/4AAAACAAAD/gAAAAAAAAP+AAAAAgAAA/4AAAAAAAAD/gAAAAIAAAP+AAAAAAAAA/4AAAACAAAD/gAAAAAAAAP+AAAAAgAAA/4AAAAAAAAD/gAAAAIAAAP+AAAAAAwCAAIADgAQAABcAGwAfAAABAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQIAAIAAAAEAAAD/AAAAAIAAAP+AAAABAAAA/wAAAP+AAAD/AAAA/4AAAACAAAABAP+AAAAAgAAA/4AAAACAAAAEAAAA/4AAAP+AAAD/gAAA/4AAAP+AAAD/gAAA/4AAAACAAAAAgAAAAYAAAACAAAD/gP+AAAAAgP8A/4AAAACAAAAAAQCAAIADgAOAAA8AAAEBAQEBAQEBAQEBAQEBAQEBAAIAAAAAgAAA/4AAAP+AAAD/AAAA/4AAAP+AAAAAgAOAAAD/gAAA/wAAAP+AAAD/AAAAAQAAAACAAAABAAAAAAAAAgCAAIADgAOAAAMACQAAAQEBAQEBAQEBAQCAAwAAAP0AAYAAAP8AAAACAAAAA4AAAP0AAAACgP8AAAD/AAAAAgAAAAABAIAAgAOAA4AAAwAAAQEBAQCAAwAAAP0AA4AAAP0AAAAAAAACAIAAgAOAA4AAAwALAAABAQEBAQEBAQEBAQEAgAMAAAD9AACAAAACAAAA/4AAAP8AAAADgAAA/QAAAAKA/gAAAAIAAAD/AAAAAQAAAQAAAAAEAAQAABMAAAEBAQEBAQEBAQEBAQEBAQEBAQEBAQACAAAAAIAAAACAAAD/gAAA/4AAAP4AAAD/gAAA/4AAAACAAAAAgAQAAAD/gAAA/4AAAP4AAAD/gAAA/4AAAACAAAAAgAAAAgAAAACAAAAAAAABAQABAAMAAwAACwAAAQEBAQEBAQEBAQEBAYABAAAAAIAAAP+AAAD/AAAA/4AAAACAAwAAAP+AAAD/AAAA/4AAAACAAAABAAAAAAAAAQCAAQAEAAQAABsAAAEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQECAACAAAAAgAAAAQAAAP+AAAD/gAAAAIAAAP8AAAD/gAAA/wAAAACAAAD/gAAA/4AAAAEAAAAAgAQAAAD/gAAA/4AAAP+AAAD/gAAA/4AAAP+AAAAAgAAA/4AAAACAAAAAgAAAAIAAAACAAAAAgAAAAAAABgCAAIAEAAQAAAMABwALAA8AEwAXAAABAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEAgAOAAAD8gAEAAAAAgAAAAIAAAACAAAD+AAAAAIAAAAGAAAAAgAAA/gAAAAGAAAAEAAAA/IAAAAMA/wAAAAEAAAD/AAAAAQD+gP+AAAAAgAAA/4AAAACA/4D/gAAAAIAABgCAAIAEAAQAAAMABwALAA8AEwAXAAABAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEAgAOAAAD8gAEAAAAAgAAAAIAAAACAAAD+gAAAAYAAAP4AAAAAgAAAAYAAAACAAAAEAAAA/IAAAAMA/wAAAAEAAAD/AAAAAQD+gP+AAAAAgP+A/4AAAACAAAD/gAAAAIAABgCAAIAEAAQAABMAFwAbAB8AIwAnAAABAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAgAAgAAAAIAAAAEAAAD/AAAA/4AAAP+AAAD/gAAA/wAAAAEAAAAAgAAAAAAAgAAA/oAAgAAA/4ACAACAAAD/gP4AAIAAAP+AAgAAgAAA/4AEAAAA/wAAAP+AAAD/gAAA/4AAAP8AAAABAAAAAIAAAACAAAAAgAAA/4D/gAAAAIABAAAA/4AAAACAAAD/gAAA/oAAAP+AAAAAgAAA/4AAAAACAQAAgAOABAAAFwAbAAABAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAYABgAAAAIAAAP+AAAD/gAAAAIAAAP+AAAD/gAAA/4AAAACAAAD/gAAAAQAAAP8A/4AAgAAA/4AEAAAA/4AAAP8AAAD/gAAA/4AAAP+AAAD/gAAAAIAAAACAAAAAgAAAAIAAAAEAAAAAAAAA/wAAAAACAIAAgAQABAAAFwAbAAABAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAYACgAAA/4AAAP+AAAD/gAAAAIAAAP+AAAD+gAAAAQAAAP8AAAABAAAAAIAAAP8A/wAAgAAA/4AEAAAA/gAAAAEAAAD/gAAA/4AAAP8AAAD/gAAAAIAAAAEAAAAAgAAAAIAAAACAAAD+gAAA/wAAAAABAIAAgAQABAAAGwAAAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQIAAIAAAACAAAAAgAAAAIAAAP8AAAD/gAAAAIAAAP6AAAAAgAAA/4AAAP8AAAAAgAAAAIAAAACABAAAAP+AAAD/gAAA/4AAAP8AAAAAgAAA/wAAAP+AAAAAgAAAAQAAAP+AAAABAAAAAIAAAACAAAAAAAABAIAAgAQABAAAGwAAAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQGAAYAAAP+AAAAAgAAAAQAAAP8AAAD/gAAAAIAAAP6AAAAAgAAA/4AAAP8AAAABAAAAAIAAAP+ABAAAAP8AAAD/gAAAAIAAAP6AAAAAgAAA/wAAAP+AAAAAgAAAAQAAAP+AAAABgAAA/4AAAACAAAAAAAABAIAAgAQABAAAFwAAAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQABAAAAAIAAAAEAAAAAgAAA/4AAAP+AAAD/gAAA/4AAAP+AAAD/gAAA/4AAAACABAAAAP+AAAAAgAAA/4AAAP6AAAD/gAAA/4AAAP+AAAAAgAAAAIAAAACAAAABgAAAAAAAAQCAAIAEAAQAABsAAAEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQECAACAAAAAgAAAAIAAAACAAAD/gAAA/4AAAP+AAAD/gAAA/4AAAP+AAAD/gAAAAIAAAACAAAAAgAQAAAD/gAAA/4AAAP+AAAD/gAAA/4AAAP+AAAD/gAAAAIAAAACAAAAAgAAAAIAAAACAAAAAgAAAAAAAAQEAAIADgAQAAAsAAAEBAQEBAQEBAQEBAQIAAYAAAP8AAAD/gAAA/wAAAACAAAAAgAQAAAD/AAAA/gAAAP+AAAABAAAAAIAAAAAAAAEAgACABAAEAAATAAABAQEBAQEBAQEBAQEBAQEBAQEBAQGAAoAAAP+AAAD/AAAAAIAAAACAAAD+gAAA/4AAAP8AAAAAgAAAAIAEAAAA/QAAAP+AAAABAAAAAIAAAAEAAAD+AAAA/4AAAAEAAAAAgAAAAAAAAAAYASYAAQAAAAAAAAAIAAAAAQAAAAAAAQAIAAgAAQAAAAAAAgAHABAAAQAAAAAAAwAIABcAAQAAAAAABAAQAB8AAQAAAAAABQALAC8AAQAAAAAABgAIADoAAQAAAAAACQAJAEIAAQAAAAAACgA6AEsAAQAAAAAADQARAIUAAQAAAAAADgAyAJYAAQAAAAAAEwAMAMgAAwABBAkAAAAQANQAAwABBAkAAQAQAOQAAwABBAkAAgAOAPQAAwABBAkAAwAQAQIAAwABBAkABAAgARIAAwABBAkABQAWATIAAwABBAkABgAQAUgAAwABBAkACQASAVgAAwABBAkACgB0AWoAAwABBAkADQAiAd4AAwABBAkADgBkAgAAAwABBAkAEwAYAmQoYykgMjAyMlVyc2FGb250UmVndWxhclVyc2FGb250VXJzYUZvbnQgUmVndWxhclZlcnNpb24gMS4wVXJzYUZvbnRVcnNhRnJhbmtBbiBvcGVuIGxpY2VuY2UgZ2VuZXJhbCBwdXJwb3NlIHRleHRtb2RlIGZvbnQgYnkgVXJzYUZyYW5rQ0MwIDEuMCBVbml2ZXJzYWxodHRwczovL2NyZWF0aXZlY29tbW9ucy5vcmcvcHVibGljZG9tYWluL3plcm8vMS4wL0hlbGxvIFdvcmxkIQAoAGMAKQAgADIAMAAyADIAVQByAHMAYQBGAG8AbgB0AFIAZQBnAHUAbABhAHIAVQByAHMAYQBGAG8AbgB0AFUAcgBzAGEARgBvAG4AdAAgAFIAZQBnAHUAbABhAHIAVgBlAHIAcwBpAG8AbgAgADEALgAwAFUAcgBzAGEARgBvAG4AdABVAHIAcwBhAEYAcgBhAG4AawBBAG4AIABvAHAAZQBuACAAbABpAGMAZQBuAGMAZQAgAGcAZQBuAGUAcgBhAGwAIABwAHUAcgBwAG8AcwBlACAAdABlAHgAdABtAG8AZABlACAAZgBvAG4AdAAgAGIAeQAgAFUAcgBzAGEARgByAGEAbgBrAEMAQwAwACAAMQAuADAAIABVAG4AaQB2AGUAcgBzAGEAbABoAHQAdABwAHMAOgAvAC8AYwByAGUAYQB0AGkAdgBlAGMAbwBtAG0AbwBuAHMALgBvAHIAZwAvAHAAdQBiAGwAaQBjAGQAbwBtAGEAaQBuAC8AegBlAHIAbwAvADEALgAwAC8ASABlAGwAbABvACAAVwBvAHIAbABkACEAAAADAAAAAAAAAGYAMwAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA==\r
|
|
808
1042
|
`;
|
|
809
|
-
class
|
|
1043
|
+
class cA {
|
|
810
1044
|
/**
|
|
811
1045
|
* Extracts all available characters from a font's cmap tables.
|
|
812
1046
|
* @param font The parsed font object from Typr
|
|
@@ -837,10 +1071,10 @@ class q {
|
|
|
837
1071
|
for (let t = 0; t < A.startCount.length; t++) {
|
|
838
1072
|
const r = A.startCount[t], i = A.endCount[t];
|
|
839
1073
|
if (!(r === 65535 && i === 65535)) {
|
|
840
|
-
for (let
|
|
841
|
-
if (this._calculateGlyphIndexFormat4(A,
|
|
842
|
-
const
|
|
843
|
-
e.push(
|
|
1074
|
+
for (let s = r; s <= i; s++)
|
|
1075
|
+
if (this._calculateGlyphIndexFormat4(A, s, t) > 0) {
|
|
1076
|
+
const g = String.fromCodePoint(s);
|
|
1077
|
+
e.push(g);
|
|
844
1078
|
}
|
|
845
1079
|
}
|
|
846
1080
|
}
|
|
@@ -856,11 +1090,11 @@ class q {
|
|
|
856
1090
|
if (!A.groups)
|
|
857
1091
|
return e;
|
|
858
1092
|
for (let t = 0; t < A.groups.length; t += 3) {
|
|
859
|
-
const r = A.groups[t], i = A.groups[t + 1],
|
|
860
|
-
for (let
|
|
861
|
-
if (
|
|
862
|
-
const
|
|
863
|
-
e.push(
|
|
1093
|
+
const r = A.groups[t], i = A.groups[t + 1], s = A.groups[t + 2];
|
|
1094
|
+
for (let o = r; o <= i; o++)
|
|
1095
|
+
if (s + (o - r) > 0) {
|
|
1096
|
+
const B = String.fromCodePoint(o);
|
|
1097
|
+
e.push(B);
|
|
864
1098
|
}
|
|
865
1099
|
}
|
|
866
1100
|
return e;
|
|
@@ -903,15 +1137,15 @@ class q {
|
|
|
903
1137
|
return !(e >= 0 && e <= 31 && e !== 9 && e !== 10 && e !== 13 || e >= 127 && e <= 159);
|
|
904
1138
|
}
|
|
905
1139
|
}
|
|
906
|
-
class
|
|
1140
|
+
class uA {
|
|
907
1141
|
/**
|
|
908
1142
|
* Creates a new TextureAtlasCreation instance.
|
|
909
1143
|
* @param renderer The WebGL renderer instance
|
|
910
1144
|
*/
|
|
911
1145
|
constructor(A) {
|
|
912
|
-
|
|
913
|
-
|
|
914
|
-
|
|
1146
|
+
a(this, "_textureCanvas");
|
|
1147
|
+
a(this, "_textureContext");
|
|
1148
|
+
a(this, "_renderer");
|
|
915
1149
|
this._renderer = A, this._textureCanvas = document.createElement("canvas"), this._textureContext = this._textureCanvas.getContext("2d", { willReadFrequently: !0, alpha: !1 });
|
|
916
1150
|
}
|
|
917
1151
|
/**
|
|
@@ -923,13 +1157,13 @@ class AA {
|
|
|
923
1157
|
* @returns Object containing framebuffer, columns, and rows
|
|
924
1158
|
*/
|
|
925
1159
|
createTextureAtlas(A, e, t, r) {
|
|
926
|
-
const i = A.length,
|
|
927
|
-
this._setupCanvas(
|
|
928
|
-
const E = this._renderer.createFramebuffer(
|
|
1160
|
+
const i = A.length, s = Math.ceil(Math.sqrt(i)), o = Math.ceil(i / s), g = e.width * s, B = e.height * o;
|
|
1161
|
+
this._setupCanvas(g, B, t, r), this._renderCharactersToCanvas(A, e, s, t), this._applyBlackWhiteThreshold();
|
|
1162
|
+
const E = this._renderer.createFramebuffer(g, B, { filter: "nearest" });
|
|
929
1163
|
return E.update(this._textureCanvas), {
|
|
930
1164
|
framebuffer: E,
|
|
931
|
-
columns:
|
|
932
|
-
rows:
|
|
1165
|
+
columns: s,
|
|
1166
|
+
rows: o
|
|
933
1167
|
};
|
|
934
1168
|
}
|
|
935
1169
|
/**
|
|
@@ -953,8 +1187,8 @@ class AA {
|
|
|
953
1187
|
*/
|
|
954
1188
|
_renderCharactersToCanvas(A, e, t, r) {
|
|
955
1189
|
for (let i = 0; i < A.length; i++) {
|
|
956
|
-
const
|
|
957
|
-
this._textureContext.fillText(A[i].character, E,
|
|
1190
|
+
const s = i % t, o = Math.floor(i / t), g = s * e.width + e.width * 0.5, B = o * e.height + e.height * 0.5, E = Math.round(g - e.width * 0.5), Q = Math.round(B - r * 0.5);
|
|
1191
|
+
this._textureContext.fillText(A[i].character, E, Q);
|
|
958
1192
|
}
|
|
959
1193
|
}
|
|
960
1194
|
/**
|
|
@@ -966,19 +1200,19 @@ class AA {
|
|
|
966
1200
|
_applyBlackWhiteThreshold(A = 128) {
|
|
967
1201
|
const e = this._textureContext.getImageData(0, 0, this._textureCanvas.width, this._textureCanvas.height), t = e.data;
|
|
968
1202
|
for (let r = 0; r < t.length; r += 4) {
|
|
969
|
-
const i = 0.299 * t[r] + 0.587 * t[r + 1] + 0.114 * t[r + 2],
|
|
970
|
-
t[r] =
|
|
1203
|
+
const i = 0.299 * t[r] + 0.587 * t[r + 1] + 0.114 * t[r + 2], s = A + 32, o = i > s ? 255 : 0;
|
|
1204
|
+
t[r] = o, t[r + 1] = o, t[r + 2] = o;
|
|
971
1205
|
}
|
|
972
1206
|
this._textureContext.putImageData(e, 0, 0);
|
|
973
1207
|
}
|
|
974
1208
|
}
|
|
975
|
-
class
|
|
1209
|
+
class dA {
|
|
976
1210
|
/**
|
|
977
1211
|
* Creates a new MetricsCalculation instance.
|
|
978
1212
|
*/
|
|
979
1213
|
constructor() {
|
|
980
|
-
|
|
981
|
-
|
|
1214
|
+
a(this, "_tempCanvas");
|
|
1215
|
+
a(this, "_tempContext");
|
|
982
1216
|
this._tempCanvas = document.createElement("canvas"), this._tempContext = this._tempCanvas.getContext("2d");
|
|
983
1217
|
}
|
|
984
1218
|
/**
|
|
@@ -992,9 +1226,9 @@ class eA {
|
|
|
992
1226
|
calculateMaxGlyphDimensions(A, e, t) {
|
|
993
1227
|
this._tempContext.font = `${e}px ${t}`;
|
|
994
1228
|
let r = 0, i = 0;
|
|
995
|
-
for (const
|
|
996
|
-
const
|
|
997
|
-
|
|
1229
|
+
for (const s of A) {
|
|
1230
|
+
const o = this._tempContext.measureText(s), g = o.width, B = o.actualBoundingBoxAscent + o.actualBoundingBoxDescent;
|
|
1231
|
+
g > 0 && (r = Math.max(r, g), i = Math.max(i, B));
|
|
998
1232
|
}
|
|
999
1233
|
return {
|
|
1000
1234
|
width: Math.ceil(r),
|
|
@@ -1002,7 +1236,7 @@ class eA {
|
|
|
1002
1236
|
};
|
|
1003
1237
|
}
|
|
1004
1238
|
}
|
|
1005
|
-
class
|
|
1239
|
+
class CA {
|
|
1006
1240
|
/**
|
|
1007
1241
|
* Creates TextmodeCharacter objects with unique color assignments.
|
|
1008
1242
|
* @param characters Array of character strings
|
|
@@ -1011,17 +1245,17 @@ class tA {
|
|
|
1011
1245
|
*/
|
|
1012
1246
|
createCharacterObjects(A, e) {
|
|
1013
1247
|
return A.map((t, r) => {
|
|
1014
|
-
const i = t.codePointAt(0) || 0,
|
|
1015
|
-
let
|
|
1248
|
+
const i = t.codePointAt(0) || 0, s = this._generateCharacterColor(r);
|
|
1249
|
+
let o = 0;
|
|
1016
1250
|
if (e.hmtx && e.hmtx.aWidth) {
|
|
1017
|
-
const
|
|
1018
|
-
|
|
1251
|
+
const g = this._getGlyphIndex(e, i);
|
|
1252
|
+
g > 0 && e.hmtx.aWidth[g] !== void 0 && (o = e.hmtx.aWidth[g]);
|
|
1019
1253
|
}
|
|
1020
1254
|
return {
|
|
1021
1255
|
character: t,
|
|
1022
1256
|
unicode: i,
|
|
1023
|
-
color:
|
|
1024
|
-
advanceWidth:
|
|
1257
|
+
color: s,
|
|
1258
|
+
advanceWidth: o
|
|
1025
1259
|
};
|
|
1026
1260
|
});
|
|
1027
1261
|
}
|
|
@@ -1042,11 +1276,11 @@ class tA {
|
|
|
1042
1276
|
if (r.idRangeOffset[i] === 0)
|
|
1043
1277
|
return e + r.idDelta[i] & 65535;
|
|
1044
1278
|
{
|
|
1045
|
-
const
|
|
1046
|
-
if (
|
|
1047
|
-
const
|
|
1048
|
-
if (
|
|
1049
|
-
return
|
|
1279
|
+
const s = r.idRangeOffset[i] / 2 + (e - r.startCount[i]) - (r.startCount.length - i);
|
|
1280
|
+
if (s >= 0 && s < r.glyphIdArray.length) {
|
|
1281
|
+
const o = r.glyphIdArray[s];
|
|
1282
|
+
if (o !== 0)
|
|
1283
|
+
return o + r.idDelta[i] & 65535;
|
|
1050
1284
|
}
|
|
1051
1285
|
}
|
|
1052
1286
|
}
|
|
@@ -1069,7 +1303,7 @@ class tA {
|
|
|
1069
1303
|
* @returns RGB color as a tuple [r, g, b], or [0, 0, 0] if not found
|
|
1070
1304
|
*/
|
|
1071
1305
|
getCharacterColor(A, e) {
|
|
1072
|
-
if (!
|
|
1306
|
+
if (!C.validate(
|
|
1073
1307
|
typeof A == "string" && A.length === 1,
|
|
1074
1308
|
"Character must be a single character string.",
|
|
1075
1309
|
{ method: "getCharacterColor", providedValue: A }
|
|
@@ -1085,14 +1319,14 @@ class tA {
|
|
|
1085
1319
|
* @returns Array of RGB colors for each character
|
|
1086
1320
|
*/
|
|
1087
1321
|
getCharacterColors(A, e) {
|
|
1088
|
-
return
|
|
1322
|
+
return C.validate(
|
|
1089
1323
|
typeof A == "string" && A.length > 0,
|
|
1090
1324
|
"Characters must be a string with at least one character.",
|
|
1091
1325
|
{ method: "getCharacterColors", providedValue: A }
|
|
1092
1326
|
) ? A.split("").map((t) => this.getCharacterColor(t, e) || [0, 0, 0]) : [[0, 0, 0]];
|
|
1093
1327
|
}
|
|
1094
1328
|
}
|
|
1095
|
-
class
|
|
1329
|
+
class fA {
|
|
1096
1330
|
/**
|
|
1097
1331
|
* Creates a new TextmodeFont instance.
|
|
1098
1332
|
* @param renderer Renderer instance for texture creation
|
|
@@ -1100,21 +1334,21 @@ class rA {
|
|
|
1100
1334
|
* @ignore
|
|
1101
1335
|
*/
|
|
1102
1336
|
constructor(A, e = 16) {
|
|
1103
|
-
|
|
1104
|
-
|
|
1105
|
-
|
|
1106
|
-
|
|
1107
|
-
|
|
1108
|
-
|
|
1109
|
-
|
|
1110
|
-
|
|
1111
|
-
|
|
1337
|
+
a(this, "_font");
|
|
1338
|
+
a(this, "_characters", []);
|
|
1339
|
+
a(this, "_fontFramebuffer");
|
|
1340
|
+
a(this, "_fontSize", 16);
|
|
1341
|
+
a(this, "_textureColumns", 0);
|
|
1342
|
+
a(this, "_textureRows", 0);
|
|
1343
|
+
a(this, "_maxGlyphDimensions", { width: 0, height: 0 });
|
|
1344
|
+
a(this, "_fontFace");
|
|
1345
|
+
a(this, "_fontFamilyName", "UrsaFont");
|
|
1112
1346
|
// Component classes
|
|
1113
|
-
|
|
1114
|
-
|
|
1115
|
-
|
|
1116
|
-
|
|
1117
|
-
this._fontSize = e, this._characterExtractor = new
|
|
1347
|
+
a(this, "_characterExtractor");
|
|
1348
|
+
a(this, "_textureAtlas");
|
|
1349
|
+
a(this, "_metricsCalculator");
|
|
1350
|
+
a(this, "_characterColorMapper");
|
|
1351
|
+
this._fontSize = e, this._characterExtractor = new cA(), this._textureAtlas = new uA(A), this._metricsCalculator = new dA(), this._characterColorMapper = new CA();
|
|
1118
1352
|
}
|
|
1119
1353
|
/**
|
|
1120
1354
|
* Initializes the font manager by loading the font and creating the texture atlas.
|
|
@@ -1127,11 +1361,11 @@ class rA {
|
|
|
1127
1361
|
if (A) {
|
|
1128
1362
|
const t = await fetch(A);
|
|
1129
1363
|
if (!t.ok)
|
|
1130
|
-
throw new
|
|
1364
|
+
throw new P(`Failed to load font file: ${t.status} ${t.statusText}`);
|
|
1131
1365
|
e = await t.arrayBuffer();
|
|
1132
1366
|
} else
|
|
1133
|
-
e = await (await fetch(
|
|
1134
|
-
await this._loadFontFace(e), this._font =
|
|
1367
|
+
e = await (await fetch(hA)).arrayBuffer();
|
|
1368
|
+
await this._loadFontFace(e), this._font = h.parse(e)[0], await this._initializeFont();
|
|
1135
1369
|
}
|
|
1136
1370
|
/**
|
|
1137
1371
|
* Sets the font size for rendering.
|
|
@@ -1163,15 +1397,15 @@ class rA {
|
|
|
1163
1397
|
try {
|
|
1164
1398
|
const e = await fetch(A);
|
|
1165
1399
|
if (!e.ok)
|
|
1166
|
-
throw new
|
|
1400
|
+
throw new P(`Failed to load font file: ${e.status} ${e.statusText}`);
|
|
1167
1401
|
const t = await e.arrayBuffer();
|
|
1168
1402
|
await this._loadFontFace(t);
|
|
1169
|
-
const r =
|
|
1403
|
+
const r = h.parse(t);
|
|
1170
1404
|
if (!r || r.length === 0)
|
|
1171
1405
|
throw new Error("Failed to parse font file");
|
|
1172
1406
|
this._font = r[0], await this._initializeFont();
|
|
1173
1407
|
} catch (e) {
|
|
1174
|
-
throw new
|
|
1408
|
+
throw new P(`Failed to load font: ${e instanceof Error ? e.message : "Unknown error"}`, e);
|
|
1175
1409
|
}
|
|
1176
1410
|
}
|
|
1177
1411
|
/**
|
|
@@ -1261,7 +1495,7 @@ class rA {
|
|
|
1261
1495
|
return this._font;
|
|
1262
1496
|
}
|
|
1263
1497
|
}
|
|
1264
|
-
class
|
|
1498
|
+
class DA {
|
|
1265
1499
|
/**
|
|
1266
1500
|
* Create a new grid instance.
|
|
1267
1501
|
* @param canvas The canvas element used to determine the grid dimensions.
|
|
@@ -1271,25 +1505,25 @@ class iA {
|
|
|
1271
1505
|
*/
|
|
1272
1506
|
constructor(A, e, t) {
|
|
1273
1507
|
/** The number of columns in the grid. */
|
|
1274
|
-
|
|
1508
|
+
a(this, "_cols");
|
|
1275
1509
|
/** The number of rows in the grid. */
|
|
1276
|
-
|
|
1510
|
+
a(this, "_rows");
|
|
1277
1511
|
/** The total width of the grid in pixels. */
|
|
1278
|
-
|
|
1512
|
+
a(this, "_width");
|
|
1279
1513
|
/** The total height of the grid in pixels. */
|
|
1280
|
-
|
|
1514
|
+
a(this, "_height");
|
|
1281
1515
|
/** The offset to the outer canvas on the x-axis when centering the grid. */
|
|
1282
|
-
|
|
1516
|
+
a(this, "_offsetX");
|
|
1283
1517
|
/** The offset to the outer canvas on the y-axis when centering the grid. */
|
|
1284
|
-
|
|
1518
|
+
a(this, "_offsetY");
|
|
1285
1519
|
/** Whether the grid dimensions are fixed, or responsive based on the canvas dimensions. */
|
|
1286
|
-
|
|
1520
|
+
a(this, "_fixedDimensions", !1);
|
|
1287
1521
|
/** The canvas element used to determine the grid dimensions. */
|
|
1288
|
-
|
|
1522
|
+
a(this, "_canvas");
|
|
1289
1523
|
/** The width of each cell in the grid. */
|
|
1290
|
-
|
|
1524
|
+
a(this, "_cellWidth");
|
|
1291
1525
|
/** The height of each cell in the grid. */
|
|
1292
|
-
|
|
1526
|
+
a(this, "_cellHeight");
|
|
1293
1527
|
this._canvas = A, this._cellWidth = e, this._cellHeight = t, this.reset();
|
|
1294
1528
|
}
|
|
1295
1529
|
/**
|
|
@@ -1300,7 +1534,7 @@ class iA {
|
|
|
1300
1534
|
if (!this._fixedDimensions) {
|
|
1301
1535
|
const A = this._canvas.getBoundingClientRect();
|
|
1302
1536
|
let e = Math.round(A.width), t = Math.round(A.height);
|
|
1303
|
-
|
|
1537
|
+
[this._cols, this._rows] = [Math.floor(e / this._cellWidth), Math.floor(t / this._cellHeight)];
|
|
1304
1538
|
}
|
|
1305
1539
|
this._resizeGrid();
|
|
1306
1540
|
}
|
|
@@ -1310,7 +1544,7 @@ class iA {
|
|
|
1310
1544
|
_resizeGrid() {
|
|
1311
1545
|
const A = this._canvas.getBoundingClientRect();
|
|
1312
1546
|
let e = Math.round(A.width), t = Math.round(A.height);
|
|
1313
|
-
|
|
1547
|
+
this._width = this._cols * this._cellWidth, this._height = this._rows * this._cellHeight, this._offsetX = Math.floor((e - this._width) / 2), this._offsetY = Math.floor((t - this._height) / 2);
|
|
1314
1548
|
}
|
|
1315
1549
|
/**
|
|
1316
1550
|
* Re-assign the grid cell dimensions and `reset()` the grid.
|
|
@@ -1391,11 +1625,11 @@ class iA {
|
|
|
1391
1625
|
return this._offsetY;
|
|
1392
1626
|
}
|
|
1393
1627
|
}
|
|
1394
|
-
class
|
|
1628
|
+
class mA {
|
|
1395
1629
|
constructor(A, e = !1, t = {}) {
|
|
1396
|
-
|
|
1397
|
-
|
|
1398
|
-
|
|
1630
|
+
a(this, "_canvas");
|
|
1631
|
+
a(this, "captureSource");
|
|
1632
|
+
a(this, "_isStandalone");
|
|
1399
1633
|
this.captureSource = A, this._isStandalone = e, this._canvas = this.createCanvas(t.width, t.height);
|
|
1400
1634
|
}
|
|
1401
1635
|
createCanvas(A, e) {
|
|
@@ -1405,15 +1639,15 @@ class aA {
|
|
|
1405
1639
|
t.width = A || 800, t.height = e || 600, t.style.width = A + "px", t.style.height = e + "px", document.body.appendChild(t);
|
|
1406
1640
|
else {
|
|
1407
1641
|
const i = this.captureSource.getBoundingClientRect();
|
|
1408
|
-
let
|
|
1642
|
+
let s = Math.round(i.width), o = Math.round(i.height);
|
|
1409
1643
|
if (this.captureSource instanceof HTMLVideoElement) {
|
|
1410
1644
|
const E = this.captureSource;
|
|
1411
|
-
(
|
|
1645
|
+
(s === 0 || o === 0) && E.videoWidth > 0 && E.videoHeight > 0 && (s = E.videoWidth, o = E.videoHeight);
|
|
1412
1646
|
}
|
|
1413
|
-
t.width =
|
|
1414
|
-
const
|
|
1415
|
-
let
|
|
1416
|
-
isNaN(
|
|
1647
|
+
t.width = s, t.height = o, t.style.width = s + "px", t.style.height = o + "px", t.style.position = "absolute", t.style.pointerEvents = "none";
|
|
1648
|
+
const g = window.getComputedStyle(this.captureSource);
|
|
1649
|
+
let B = parseInt(g.zIndex || "0", 10);
|
|
1650
|
+
isNaN(B) && (B = 0), t.style.zIndex = (B + 1).toString(), this.positionOverlayCanvas(t), (r = this.captureSource.parentNode) == null || r.insertBefore(t, this.captureSource.nextSibling);
|
|
1417
1651
|
}
|
|
1418
1652
|
return t;
|
|
1419
1653
|
}
|
|
@@ -1433,8 +1667,8 @@ class aA {
|
|
|
1433
1667
|
const t = this.captureSource.getBoundingClientRect();
|
|
1434
1668
|
let r = Math.round(t.width), i = Math.round(t.height);
|
|
1435
1669
|
if (this.captureSource instanceof HTMLVideoElement) {
|
|
1436
|
-
const
|
|
1437
|
-
(r === 0 || i === 0) &&
|
|
1670
|
+
const s = this.captureSource;
|
|
1671
|
+
(r === 0 || i === 0) && s.videoWidth > 0 && s.videoHeight > 0 && (r = s.videoWidth, i = s.videoHeight);
|
|
1438
1672
|
}
|
|
1439
1673
|
this._canvas.width = r, this._canvas.height = i, this._canvas.style.width = r + "px", this._canvas.style.height = i + "px", this.positionOverlayCanvas(this._canvas);
|
|
1440
1674
|
}
|
|
@@ -1444,7 +1678,7 @@ class aA {
|
|
|
1444
1678
|
*/
|
|
1445
1679
|
getWebGLContext() {
|
|
1446
1680
|
const A = {
|
|
1447
|
-
alpha: !
|
|
1681
|
+
alpha: !1,
|
|
1448
1682
|
premultipliedAlpha: !1,
|
|
1449
1683
|
preserveDrawingBuffer: !0,
|
|
1450
1684
|
antialias: !1,
|
|
@@ -1453,10 +1687,9 @@ class aA {
|
|
|
1453
1687
|
powerPreference: "high-performance"
|
|
1454
1688
|
}, e = this._canvas.getContext("webgl2", A) || this._canvas.getContext("webgl", A);
|
|
1455
1689
|
if (!e)
|
|
1456
|
-
throw new
|
|
1690
|
+
throw new P("WebGL context could not be created. Ensure your browser supports WebGL.");
|
|
1457
1691
|
return e;
|
|
1458
1692
|
}
|
|
1459
|
-
// Getters
|
|
1460
1693
|
get canvas() {
|
|
1461
1694
|
return this._canvas;
|
|
1462
1695
|
}
|
|
@@ -1477,15 +1710,15 @@ class b {
|
|
|
1477
1710
|
* @ignore
|
|
1478
1711
|
*/
|
|
1479
1712
|
constructor(A, e, t, r = {}) {
|
|
1480
|
-
|
|
1481
|
-
|
|
1482
|
-
|
|
1483
|
-
|
|
1484
|
-
|
|
1485
|
-
|
|
1486
|
-
|
|
1487
|
-
|
|
1488
|
-
|
|
1713
|
+
a(this, "renderer");
|
|
1714
|
+
a(this, "fontManager");
|
|
1715
|
+
a(this, "grid");
|
|
1716
|
+
a(this, "_characterFramebuffer");
|
|
1717
|
+
a(this, "_primaryColorFramebuffer");
|
|
1718
|
+
a(this, "_secondaryColorFramebuffer");
|
|
1719
|
+
a(this, "_rotationFramebuffer");
|
|
1720
|
+
a(this, "_transformFramebuffer");
|
|
1721
|
+
a(this, "_options");
|
|
1489
1722
|
this.renderer = A, this.fontManager = e, this.grid = t, this._options = r, this._characterFramebuffer = this.renderer.createFramebuffer(this.grid.cols, this.grid.rows), this._primaryColorFramebuffer = this.renderer.createFramebuffer(this.grid.cols, this.grid.rows), this._secondaryColorFramebuffer = this.renderer.createFramebuffer(this.grid.cols, this.grid.rows), this._rotationFramebuffer = this.renderer.createFramebuffer(this.grid.cols, this.grid.rows), this._transformFramebuffer = this.renderer.createFramebuffer(this.grid.cols, this.grid.rows);
|
|
1490
1723
|
}
|
|
1491
1724
|
/**
|
|
@@ -1539,7 +1772,7 @@ class b {
|
|
|
1539
1772
|
return this._options;
|
|
1540
1773
|
}
|
|
1541
1774
|
}
|
|
1542
|
-
class
|
|
1775
|
+
class PA {
|
|
1543
1776
|
/**
|
|
1544
1777
|
* Create a new color palette instance.
|
|
1545
1778
|
* @param renderer The renderer instance.
|
|
@@ -1547,9 +1780,9 @@ class nA {
|
|
|
1547
1780
|
*/
|
|
1548
1781
|
constructor(A, e) {
|
|
1549
1782
|
/** The framebuffer used to store the color palette. */
|
|
1550
|
-
|
|
1551
|
-
|
|
1552
|
-
|
|
1783
|
+
a(this, "_framebuffer");
|
|
1784
|
+
a(this, "_renderer");
|
|
1785
|
+
a(this, "_colors");
|
|
1553
1786
|
this._renderer = A, this._colors = e;
|
|
1554
1787
|
const t = Math.max(this._colors.length, 1);
|
|
1555
1788
|
this._framebuffer = this._renderer.createFramebuffer(t, 1), this._updateFramebuffer();
|
|
@@ -1563,8 +1796,8 @@ class nA {
|
|
|
1563
1796
|
this._framebuffer.width !== A && this._framebuffer.resize(A, e);
|
|
1564
1797
|
const t = new Uint8Array(A * e * 4);
|
|
1565
1798
|
for (let r = 0; r < A; r++) {
|
|
1566
|
-
const i = r < this._colors.length ? this._colors[r] : [0, 0, 0],
|
|
1567
|
-
t[
|
|
1799
|
+
const i = r < this._colors.length ? this._colors[r] : [0, 0, 0], s = r * 4;
|
|
1800
|
+
t[s] = i[0], t[s + 1] = i[1], t[s + 2] = i[2], t[s + 3] = 255;
|
|
1568
1801
|
}
|
|
1569
1802
|
this._framebuffer.updatePixels(t, A, e);
|
|
1570
1803
|
}
|
|
@@ -1594,18 +1827,18 @@ class nA {
|
|
|
1594
1827
|
return this._framebuffer.texture;
|
|
1595
1828
|
}
|
|
1596
1829
|
}
|
|
1597
|
-
class
|
|
1830
|
+
class z extends b {
|
|
1598
1831
|
constructor(e, t, r, i = {}) {
|
|
1599
1832
|
super(e, t, r, i);
|
|
1600
|
-
|
|
1601
|
-
this.palette = new
|
|
1833
|
+
a(this, "palette");
|
|
1834
|
+
this.palette = new PA(this.renderer, this.fontManager.getCharacterColors(" .:-=+*%@#"));
|
|
1602
1835
|
}
|
|
1603
1836
|
/**
|
|
1604
1837
|
* Sets the characters used for mapping.
|
|
1605
1838
|
* @param characters The characters to use for mapping, usually ordered from darkest to brightest.
|
|
1606
1839
|
*/
|
|
1607
1840
|
characters(e) {
|
|
1608
|
-
|
|
1841
|
+
C.validate(
|
|
1609
1842
|
this.fontManager.hasAllCharacters(e),
|
|
1610
1843
|
"One or more characters do not exist in the current font.",
|
|
1611
1844
|
{ method: "characters", providedValue: e }
|
|
@@ -1620,8 +1853,8 @@ class S extends b {
|
|
|
1620
1853
|
* @param a Alpha component (0-255).
|
|
1621
1854
|
*/
|
|
1622
1855
|
characterColor(e, t = e, r = e, i = 255) {
|
|
1623
|
-
|
|
1624
|
-
[e, t, r, i].every((
|
|
1856
|
+
C.validate(
|
|
1857
|
+
[e, t, r, i].every((s) => s >= 0 && s <= 255),
|
|
1625
1858
|
"Character color values must be between 0 and 255",
|
|
1626
1859
|
{ method: "characterColor", providedValues: { r: e, g: t, b: r, a: i } }
|
|
1627
1860
|
) && (this._options.characterColor = [e, t, r, i]);
|
|
@@ -1633,7 +1866,7 @@ class S extends b {
|
|
|
1633
1866
|
* @param mode The color mode to use for characters.
|
|
1634
1867
|
*/
|
|
1635
1868
|
characterColorMode(e) {
|
|
1636
|
-
|
|
1869
|
+
C.validate(
|
|
1637
1870
|
["sampled", "fixed"].includes(e),
|
|
1638
1871
|
"Invalid character color mode. Must be 'sampled' or 'fixed'.",
|
|
1639
1872
|
{ method: "characterColorMode", providedValue: e }
|
|
@@ -1648,8 +1881,8 @@ class S extends b {
|
|
|
1648
1881
|
* @param a Alpha component (0-255).
|
|
1649
1882
|
*/
|
|
1650
1883
|
cellColor(e, t = e, r = e, i = 255) {
|
|
1651
|
-
|
|
1652
|
-
[e, t, r, i].every((
|
|
1884
|
+
C.validate(
|
|
1885
|
+
[e, t, r, i].every((s) => s >= 0 && s <= 255),
|
|
1653
1886
|
"Cell color values must be between 0 and 255",
|
|
1654
1887
|
{ method: "cellColor", providedValues: { r: e, g: t, b: r, a: i } }
|
|
1655
1888
|
) && (this._options.cellColor = [e, t, r, i]);
|
|
@@ -1661,7 +1894,7 @@ class S extends b {
|
|
|
1661
1894
|
* @param mode The color mode to use for background cells.
|
|
1662
1895
|
*/
|
|
1663
1896
|
cellColorMode(e) {
|
|
1664
|
-
|
|
1897
|
+
C.validate(
|
|
1665
1898
|
["sampled", "fixed"].includes(e),
|
|
1666
1899
|
"Invalid cell color mode. Must be 'sampled' or 'fixed'.",
|
|
1667
1900
|
{ method: "cellColorMode", providedValue: e }
|
|
@@ -1672,7 +1905,7 @@ class S extends b {
|
|
|
1672
1905
|
* @param invert If `true`, the character color becomes the cell color and vice versa.
|
|
1673
1906
|
*/
|
|
1674
1907
|
invert(e) {
|
|
1675
|
-
|
|
1908
|
+
C.validate(
|
|
1676
1909
|
typeof e == "boolean" || typeof e == "number" && Number.isInteger(e),
|
|
1677
1910
|
"Invert must be a boolean value or an integer (0 for false, any other number for true).",
|
|
1678
1911
|
{ method: "invert", providedValue: e }
|
|
@@ -1683,7 +1916,7 @@ class S extends b {
|
|
|
1683
1916
|
* @param angle The rotation angle in degrees.
|
|
1684
1917
|
*/
|
|
1685
1918
|
rotation(e) {
|
|
1686
|
-
if (!
|
|
1919
|
+
if (!C.validate(
|
|
1687
1920
|
typeof e == "number",
|
|
1688
1921
|
"Rotation angle must be a number.",
|
|
1689
1922
|
{ method: "rotation", providedValue: e }
|
|
@@ -1698,7 +1931,7 @@ class S extends b {
|
|
|
1698
1931
|
* @param flip If `true`, characters are flipped horizontally. If `false`, no flip is applied.
|
|
1699
1932
|
*/
|
|
1700
1933
|
flipHorizontally(e) {
|
|
1701
|
-
|
|
1934
|
+
C.validate(
|
|
1702
1935
|
typeof e == "boolean" || typeof e == "number" && Number.isInteger(e),
|
|
1703
1936
|
"Flip horizontally must be a boolean value or an integer (0 for false, any other number for true).",
|
|
1704
1937
|
{ method: "flipHorizontally", providedValue: e }
|
|
@@ -1709,15 +1942,15 @@ class S extends b {
|
|
|
1709
1942
|
* @param flip If `true`, characters are flipped vertically. If `false`, no flip is applied.
|
|
1710
1943
|
*/
|
|
1711
1944
|
flipVertically(e) {
|
|
1712
|
-
|
|
1945
|
+
C.validate(
|
|
1713
1946
|
typeof e == "boolean" || typeof e == "number" && Number.isInteger(e),
|
|
1714
1947
|
"Flip vertically must be a boolean value or an integer (0 for false, any other number for true).",
|
|
1715
1948
|
{ method: "flipVertically", providedValue: e }
|
|
1716
1949
|
) && (this._options.flipVertically = !!e);
|
|
1717
1950
|
}
|
|
1718
1951
|
}
|
|
1719
|
-
var
|
|
1720
|
-
const
|
|
1952
|
+
var IA = "precision lowp float;uniform sampler2D u_sketchTexture;uniform vec2 u_gridCellDimensions;uniform vec2 u_brightnessRange;varying vec2 v_uv;void main(){vec2 cellCenter=(floor(v_uv*u_gridCellDimensions)+vec2(0.5))/u_gridCellDimensions;vec4 color=texture2D(u_sketchTexture,cellCenter);float brightness=dot(color.rgb,vec3(0.299,0.587,0.114));float brightnessValue=brightness*255.0;if(brightnessValue>=u_brightnessRange.x&&brightnessValue<=u_brightnessRange.y){gl_FragColor=color;}else{gl_FragColor=vec4(0.0);}}", wA = "precision lowp float;uniform sampler2D u_sampleTexture;uniform vec4 u_fillColor;uniform bool u_useFixedColor;varying vec2 v_uv;void main(){vec4 sampleColor=texture2D(u_sampleTexture,v_uv);if(sampleColor.a>0.0){if(u_useFixedColor){gl_FragColor=u_fillColor;}else{gl_FragColor=sampleColor;}}else{gl_FragColor=vec4(0.0);}}", pA = "precision lowp float;uniform sampler2D u_sampleTexture;uniform bool u_invert;uniform bool u_flipHorizontally;uniform bool u_flipVertically;varying vec2 v_uv;void main(){vec4 sampleColor=texture2D(u_sampleTexture,v_uv);if(sampleColor.a>0.0){float invertValue=u_invert ? 1.0 : 0.0;float flipHValue=u_flipHorizontally ? 1.0 : 0.0;float flipVValue=u_flipVertically ? 1.0 : 0.0;gl_FragColor=vec4(invertValue,flipHValue,flipVValue,1.0);}else{gl_FragColor=vec4(0.0);}}", _A = "precision lowp float;uniform sampler2D u_sampleTexture;uniform vec4 u_rotationColor;varying vec2 v_uv;void main(){vec4 sampleColor=texture2D(u_sampleTexture,v_uv);if(sampleColor.a>0.0){gl_FragColor=u_rotationColor;}else{gl_FragColor=vec4(0.0);}}", xA = "precision lowp float;uniform sampler2D u_colorSampleFramebuffer;uniform sampler2D u_charPaletteTexture;uniform vec2 u_charPaletteSize;uniform vec2 u_brightnessRange;varying vec2 v_uv;void main(){vec4 color=texture2D(u_colorSampleFramebuffer,v_uv);if(color.a==0.0){gl_FragColor=vec4(0.0);return;}float brightness=dot(color.rgb,vec3(0.299,0.587,0.114))*255.0;vec2 range=u_brightnessRange;if(brightness<range.x||brightness>range.y){gl_FragColor=vec4(0.0);return;}float t=(brightness-range.x)/(range.y-range.x);float idx=clamp(floor(t*u_charPaletteSize.x),0.0,u_charPaletteSize.x-1.0);vec3 charColor=texture2D(u_charPaletteTexture,vec2((idx+0.5)/u_charPaletteSize.x,0.0)).rgb;gl_FragColor=vec4(charColor,1.0);}";
|
|
1953
|
+
const vA = {
|
|
1721
1954
|
/** Enable/disable the renderer */
|
|
1722
1955
|
enabled: !0,
|
|
1723
1956
|
/** Characters used for brightness mapping (from darkest to brightest) */
|
|
@@ -1741,7 +1974,7 @@ const QA = {
|
|
|
1741
1974
|
/** Range of brightness values to map to ASCII characters */
|
|
1742
1975
|
brightnessRange: [0, 255]
|
|
1743
1976
|
};
|
|
1744
|
-
class
|
|
1977
|
+
class O extends z {
|
|
1745
1978
|
/**
|
|
1746
1979
|
* Creates a new TextmodeBrightnessConverter instance.
|
|
1747
1980
|
* @param renderer Renderer instance for texture creation
|
|
@@ -1750,17 +1983,17 @@ class M extends S {
|
|
|
1750
1983
|
* @ignore
|
|
1751
1984
|
*/
|
|
1752
1985
|
constructor(e, t, r) {
|
|
1753
|
-
super(e, t, r, { ...
|
|
1754
|
-
|
|
1755
|
-
|
|
1756
|
-
|
|
1757
|
-
|
|
1758
|
-
|
|
1759
|
-
|
|
1760
|
-
this.sampleShader = new
|
|
1986
|
+
super(e, t, r, { ...vA });
|
|
1987
|
+
a(this, "sampleShader");
|
|
1988
|
+
a(this, "colorFillShader");
|
|
1989
|
+
a(this, "charMappingShader");
|
|
1990
|
+
a(this, "transformFillShader");
|
|
1991
|
+
a(this, "rotationFillShader");
|
|
1992
|
+
a(this, "sampleFramebuffer");
|
|
1993
|
+
this.sampleShader = new p(e.context, _, IA), this.colorFillShader = new p(e.context, _, wA), this.transformFillShader = new p(e.context, _, pA), this.rotationFillShader = new p(e.context, _, _A), this.charMappingShader = new p(e.context, _, xA), this.sampleFramebuffer = this.renderer.createFramebuffer(this.grid.cols, this.grid.rows);
|
|
1761
1994
|
}
|
|
1762
1995
|
convert(e) {
|
|
1763
|
-
this.sampleFramebuffer.begin(), this.renderer.clear(), this.renderer.shader(this.sampleShader), this.renderer.setUniform("u_sketchTexture", e), this.renderer.setUniform("u_gridCellDimensions", [this.grid.cols, this.grid.rows]), this.renderer.setUniform("u_brightnessRange", this._options.brightnessRange), this.renderer.rect(0, 0, this.grid.cols, this.grid.rows), this.sampleFramebuffer.end(), this._primaryColorFramebuffer.begin(), this.renderer.clear(), this.renderer.shader(this.colorFillShader), this.renderer.setUniform("u_sampleTexture", this.sampleFramebuffer.texture), this.renderer.setUniform("u_fillColor", this._options.characterColor), this.renderer.setUniform("u_useFixedColor", this._options.characterColorMode === "fixed"), this.renderer.rect(0, 0, this.grid.cols, this.grid.rows), this._primaryColorFramebuffer.end(), this._secondaryColorFramebuffer.begin(), this.renderer.clear(), this.renderer.shader(this.colorFillShader), this.renderer.setUniform("u_sampleTexture", this.sampleFramebuffer.texture), this.renderer.setUniform("u_fillColor", this._options.cellColor), this.renderer.setUniform("u_useFixedColor", this._options.cellColorMode === "fixed"), this.renderer.rect(0, 0, this.grid.cols, this.grid.rows), this._secondaryColorFramebuffer.end(), this._transformFramebuffer.begin(), this.renderer.clear(), this.renderer.shader(this.transformFillShader), this.renderer.setUniform("u_sampleTexture", this.sampleFramebuffer.texture), this.renderer.setUniform("u_invert", this._options.invert), this.renderer.setUniform("u_flipHorizontally", this._options.flipHorizontally), this.renderer.setUniform("u_flipVertically", this._options.flipVertically), this.renderer.rect(0, 0, this.grid.cols, this.grid.rows), this._transformFramebuffer.end(), this._rotationFramebuffer.begin(), this.renderer.clear(), this.renderer.shader(this.rotationFillShader), this.renderer.setUniform("u_sampleTexture", this.sampleFramebuffer.texture), this.renderer.setUniform("
|
|
1996
|
+
this.sampleFramebuffer.begin(), this.renderer.clear(), this.renderer.shader(this.sampleShader), this.renderer.setUniform("u_sketchTexture", e), this.renderer.setUniform("u_gridCellDimensions", [this.grid.cols, this.grid.rows]), this.renderer.setUniform("u_brightnessRange", this._options.brightnessRange), this.renderer.rect(0, 0, this.grid.cols, this.grid.rows), this.sampleFramebuffer.end(), this._primaryColorFramebuffer.begin(), this.renderer.clear(), this.renderer.shader(this.colorFillShader), this.renderer.setUniform("u_sampleTexture", this.sampleFramebuffer.texture), this.renderer.setUniform("u_fillColor", this._options.characterColor), this.renderer.setUniform("u_useFixedColor", this._options.characterColorMode === "fixed"), this.renderer.rect(0, 0, this.grid.cols, this.grid.rows), this._primaryColorFramebuffer.end(), this._secondaryColorFramebuffer.begin(), this.renderer.clear(), this.renderer.shader(this.colorFillShader), this.renderer.setUniform("u_sampleTexture", this.sampleFramebuffer.texture), this.renderer.setUniform("u_fillColor", this._options.cellColor), this.renderer.setUniform("u_useFixedColor", this._options.cellColorMode === "fixed"), this.renderer.rect(0, 0, this.grid.cols, this.grid.rows), this._secondaryColorFramebuffer.end(), this._transformFramebuffer.begin(), this.renderer.clear(), this.renderer.shader(this.transformFillShader), this.renderer.setUniform("u_sampleTexture", this.sampleFramebuffer.texture), this.renderer.setUniform("u_invert", this._options.invert), this.renderer.setUniform("u_flipHorizontally", this._options.flipHorizontally), this.renderer.setUniform("u_flipVertically", this._options.flipVertically), this.renderer.rect(0, 0, this.grid.cols, this.grid.rows), this._transformFramebuffer.end(), this._rotationFramebuffer.begin(), this.renderer.clear(), this.renderer.shader(this.rotationFillShader), this.renderer.setUniform("u_sampleTexture", this.sampleFramebuffer.texture), this.renderer.setUniform("u_rotationColor", this._options.rotation), this.renderer.rect(0, 0, this.grid.cols, this.grid.rows), this._rotationFramebuffer.end(), this._characterFramebuffer.begin(), this.renderer.clear(0, 0, 0, 0), this.renderer.shader(this.charMappingShader), this.renderer.setUniform("u_colorSampleFramebuffer", this.sampleFramebuffer.texture), this.renderer.setUniform("u_charPaletteTexture", this.palette.texture), this.renderer.setUniform("u_charPaletteSize", [this.palette.colors.length, 1]), this.renderer.setUniform("u_brightnessRange", this._options.brightnessRange), this.renderer.rect(0, 0, this.grid.cols, this.grid.rows), this._characterFramebuffer.end();
|
|
1764
1997
|
}
|
|
1765
1998
|
resize() {
|
|
1766
1999
|
super.resize(), this.sampleFramebuffer.resize(this.grid.cols, this.grid.rows);
|
|
@@ -1773,21 +2006,21 @@ class M extends S {
|
|
|
1773
2006
|
* @param range Array of two numbers `[min, max]`, where `min` is darkest and `max` is brightest.
|
|
1774
2007
|
*/
|
|
1775
2008
|
brightnessRange(e) {
|
|
1776
|
-
|
|
2009
|
+
C.validate(
|
|
1777
2010
|
Array.isArray(e) && e.length === 2 && e.every((t) => typeof t == "number" && t >= 0 && t <= 255),
|
|
1778
2011
|
"Brightness range must be an array of two numbers between 0 and 255.",
|
|
1779
2012
|
{ method: "brightnessRange", providedValue: e }
|
|
1780
2013
|
) && (this._options.brightnessRange = e);
|
|
1781
2014
|
}
|
|
1782
2015
|
}
|
|
1783
|
-
const
|
|
2016
|
+
const HA = /* @__PURE__ */ Object.freeze(/* @__PURE__ */ Object.defineProperty({
|
|
1784
2017
|
__proto__: null,
|
|
1785
|
-
TextmodeBrightnessConverter:
|
|
2018
|
+
TextmodeBrightnessConverter: O,
|
|
1786
2019
|
TextmodeConverter: b,
|
|
1787
|
-
TextmodeFeatureConverter:
|
|
2020
|
+
TextmodeFeatureConverter: z
|
|
1788
2021
|
}, Symbol.toStringTag, { value: "Module" }));
|
|
1789
|
-
var
|
|
1790
|
-
class
|
|
2022
|
+
var bA = "precision mediump float;uniform sampler2D u_characterTexture;uniform vec2 u_charsetDimensions;uniform sampler2D u_primaryColorTexture;uniform sampler2D u_secondaryColorTexture;uniform sampler2D u_transformTexture;uniform sampler2D u_asciiCharacterTexture;uniform sampler2D u_rotationTexture;uniform sampler2D u_captureTexture;uniform vec2 u_captureDimensions;uniform int u_backgroundMode;uniform vec2 u_gridCellDimensions;uniform vec2 u_gridPixelDimensions;mat2 rotate2D(float angle){float s=sin(angle);float c=cos(angle);return mat2(c,-s,s,c);}void main(){vec2 adjustedCoord=gl_FragCoord.xy/u_gridPixelDimensions;vec2 gridCoord=adjustedCoord*u_gridCellDimensions;vec2 cellCoord=floor(gridCoord);vec2 charIndexTexCoord=(cellCoord+0.5)/u_gridCellDimensions;vec4 primaryColor=texture2D(u_primaryColorTexture,charIndexTexCoord);vec4 secondaryColor=texture2D(u_secondaryColorTexture,charIndexTexCoord);vec4 transformColor=texture2D(u_transformTexture,charIndexTexCoord);bool isInverted=transformColor.r>0.5;bool flipHorizontal=transformColor.g>0.5;bool flipVertical=transformColor.b>0.5;vec4 encodedIndexVec=texture2D(u_asciiCharacterTexture,charIndexTexCoord);if(encodedIndexVec.a<0.01){gl_FragColor=(u_backgroundMode==0)? vec4(0.0):texture2D(u_captureTexture,gl_FragCoord.xy/u_captureDimensions);return;}int charIndex=int(encodedIndexVec.r*255.0+0.5)+int(encodedIndexVec.g*255.0+0.5)*256;int charCol=int(mod(float(charIndex),u_charsetDimensions.x));int charRow=charIndex/int(u_charsetDimensions.x);vec2 charCoord=vec2(charCol,charRow)/u_charsetDimensions;vec4 rotationColor=texture2D(u_rotationTexture,charIndexTexCoord);float scaledAngle=rotationColor.r*255.0+rotationColor.g;float rotationAngle=(scaledAngle*360.0/255.0)*0.017453292;vec2 fractionalPart=fract(gridCoord)-0.5;if(flipHorizontal)fractionalPart.x=-fractionalPart.x;if(flipVertical)fractionalPart.y=-fractionalPart.y;fractionalPart=rotate2D(rotationAngle)*fractionalPart+0.5;vec2 cellSize=1.0/u_charsetDimensions;vec2 texCoord=charCoord+fractionalPart*cellSize;vec2 cellMax=charCoord+cellSize;if(any(lessThan(texCoord,charCoord))||any(greaterThan(texCoord,cellMax))){gl_FragColor=isInverted ? primaryColor : secondaryColor;return;}vec4 charTexel=texture2D(u_characterTexture,texCoord);if(isInverted)charTexel.rgb=1.0-charTexel.rgb;gl_FragColor=mix(secondaryColor,primaryColor,charTexel);}";
|
|
2023
|
+
class FA {
|
|
1791
2024
|
/**
|
|
1792
2025
|
* Creates an instance of TextmodeConversionPipeline.
|
|
1793
2026
|
* @param renderer The renderer to use for the pipeline.
|
|
@@ -1796,19 +2029,19 @@ class hA {
|
|
|
1796
2029
|
* @ignore
|
|
1797
2030
|
*/
|
|
1798
2031
|
constructor(A, e, t) {
|
|
1799
|
-
|
|
1800
|
-
|
|
1801
|
-
|
|
1802
|
-
|
|
1803
|
-
|
|
1804
|
-
|
|
1805
|
-
|
|
1806
|
-
|
|
1807
|
-
|
|
1808
|
-
|
|
1809
|
-
|
|
1810
|
-
this.renderer = A, this.font = e, this.grid = t, this._asciiShader = this.renderer.createShader(
|
|
1811
|
-
{ name: "brightness", converter: new
|
|
2032
|
+
a(this, "renderer");
|
|
2033
|
+
a(this, "font");
|
|
2034
|
+
a(this, "grid");
|
|
2035
|
+
a(this, "converters");
|
|
2036
|
+
a(this, "_resultFramebuffer");
|
|
2037
|
+
a(this, "_asciiShader");
|
|
2038
|
+
a(this, "_characterFramebuffer");
|
|
2039
|
+
a(this, "_primaryColorFramebuffer");
|
|
2040
|
+
a(this, "_secondaryColorFramebuffer");
|
|
2041
|
+
a(this, "_rotationFramebuffer");
|
|
2042
|
+
a(this, "_transformFramebuffer");
|
|
2043
|
+
this.renderer = A, this.font = e, this.grid = t, this._asciiShader = this.renderer.createShader(_, bA), this.converters = [
|
|
2044
|
+
{ name: "brightness", converter: new O(A, e, t) },
|
|
1812
2045
|
{ name: "custom", converter: new b(A, e, t) }
|
|
1813
2046
|
], this._characterFramebuffer = this.renderer.createFramebuffer(t.cols, t.rows), this._primaryColorFramebuffer = this.renderer.createFramebuffer(t.cols, t.rows), this._secondaryColorFramebuffer = this.renderer.createFramebuffer(t.cols, t.rows), this._rotationFramebuffer = this.renderer.createFramebuffer(t.cols, t.rows), this._transformFramebuffer = this.renderer.createFramebuffer(t.cols, t.rows), this._resultFramebuffer = this.renderer.createFramebuffer(this.grid.width, this.grid.height);
|
|
1814
2047
|
}
|
|
@@ -1820,13 +2053,13 @@ class hA {
|
|
|
1820
2053
|
render(A) {
|
|
1821
2054
|
for (const t of this.converters) {
|
|
1822
2055
|
const r = t.converter;
|
|
1823
|
-
r.options.enabled && r instanceof
|
|
2056
|
+
r.options.enabled && r instanceof z && r.convert(A);
|
|
1824
2057
|
}
|
|
1825
2058
|
const e = (t, r) => {
|
|
1826
2059
|
t.begin(), this.renderer.clear();
|
|
1827
2060
|
for (const i of this.converters) {
|
|
1828
|
-
const
|
|
1829
|
-
|
|
2061
|
+
const s = i.converter;
|
|
2062
|
+
s.options.enabled && this.renderer.image(r(s), 0, 0);
|
|
1830
2063
|
}
|
|
1831
2064
|
t.end();
|
|
1832
2065
|
};
|
|
@@ -1838,14 +2071,14 @@ class hA {
|
|
|
1838
2071
|
* @returns The requested `TextmodeConverter` instance.
|
|
1839
2072
|
*/
|
|
1840
2073
|
get(A) {
|
|
1841
|
-
if (!
|
|
2074
|
+
if (!C.validate(
|
|
1842
2075
|
typeof A == "string" && A.length > 0,
|
|
1843
2076
|
"Converter name must be a non-empty string.",
|
|
1844
2077
|
{ method: "converter", providedValue: A }
|
|
1845
2078
|
))
|
|
1846
2079
|
return;
|
|
1847
2080
|
const e = this.converters.find((r) => r.name === A), t = e == null ? void 0 : e.converter;
|
|
1848
|
-
if (
|
|
2081
|
+
if (C.validate(
|
|
1849
2082
|
t instanceof b,
|
|
1850
2083
|
`Converter "${A}" is not a valid TextmodeConverter.`,
|
|
1851
2084
|
{ method: "converter", providedValue: A, converterInstance: t }
|
|
@@ -1859,47 +2092,46 @@ class hA {
|
|
|
1859
2092
|
* @returns The newly created {@link TextmodeConverter} instance or `void` if the addition failed.
|
|
1860
2093
|
*/
|
|
1861
2094
|
add(A, e) {
|
|
1862
|
-
if (!
|
|
2095
|
+
if (!C.validate(
|
|
1863
2096
|
typeof A == "string" && A.length > 0,
|
|
1864
2097
|
"Converter name must be a non-empty string.",
|
|
1865
2098
|
{ method: "add", providedValue: A }
|
|
1866
|
-
) || !
|
|
2099
|
+
) || !C.validate(
|
|
1867
2100
|
e === "brightness" || e === "custom",
|
|
1868
2101
|
`Converter type must be either "brightness" or "custom". Provided: ${e}`,
|
|
1869
2102
|
{ method: "add", providedValue: e }
|
|
1870
2103
|
))
|
|
1871
2104
|
return;
|
|
1872
2105
|
let t;
|
|
1873
|
-
return e === "brightness" ? t = new
|
|
2106
|
+
return e === "brightness" ? t = new O(this.renderer, this.font, this.grid) : t = new b(this.renderer, this.font, this.grid), this.converters.push({ name: A, converter: t }), t;
|
|
1874
2107
|
}
|
|
1875
2108
|
/**
|
|
1876
|
-
|
|
1877
|
-
|
|
1878
|
-
|
|
1879
|
-
*/
|
|
2109
|
+
* Removes a converter from the pipeline by name or instance.
|
|
2110
|
+
* @param nameOrInstance The unique name of the converter or the converter instance to remove.
|
|
2111
|
+
*/
|
|
1880
2112
|
remove(A) {
|
|
1881
|
-
if (!
|
|
2113
|
+
if (!C.validate(
|
|
1882
2114
|
typeof A == "string" || A instanceof b,
|
|
1883
2115
|
"Parameter must be either a string (converter name) or a TextmodeConverter instance.",
|
|
1884
2116
|
{ method: "remove", providedValue: A }
|
|
1885
2117
|
))
|
|
1886
|
-
return
|
|
2118
|
+
return;
|
|
1887
2119
|
let e = -1;
|
|
1888
2120
|
if (typeof A == "string") {
|
|
1889
|
-
if (!
|
|
2121
|
+
if (!C.validate(
|
|
1890
2122
|
A.length > 0,
|
|
1891
2123
|
"Converter name must be a non-empty string.",
|
|
1892
2124
|
{ method: "remove", providedValue: A }
|
|
1893
2125
|
))
|
|
1894
|
-
return
|
|
2126
|
+
return;
|
|
1895
2127
|
e = this.converters.findIndex((t) => t.name === A);
|
|
1896
2128
|
} else
|
|
1897
2129
|
e = this.converters.findIndex((t) => t.converter === A);
|
|
1898
|
-
|
|
2130
|
+
C.validate(
|
|
1899
2131
|
e !== -1,
|
|
1900
2132
|
typeof A == "string" ? `Converter with name "${A}" not found in pipeline.` : "Converter instance not found in pipeline.",
|
|
1901
2133
|
{ method: "remove", providedValue: A, convertersCount: this.converters.length }
|
|
1902
|
-
)
|
|
2134
|
+
) && this.converters.splice(e, 1);
|
|
1903
2135
|
}
|
|
1904
2136
|
/**
|
|
1905
2137
|
* Returns the framebuffer containing the textmode conversion result.
|
|
@@ -1937,41 +2169,41 @@ class hA {
|
|
|
1937
2169
|
for (const A of this.converters)
|
|
1938
2170
|
A.converter.enable();
|
|
1939
2171
|
}
|
|
1940
|
-
/** Returns the character framebuffer containing the combined result of all converters.
|
|
2172
|
+
/** Returns the character framebuffer containing the combined result of all converters. */
|
|
1941
2173
|
get characterFramebuffer() {
|
|
1942
2174
|
return this._characterFramebuffer;
|
|
1943
2175
|
}
|
|
1944
|
-
/** Returns the primary color framebuffer containing the combined result of all converters.
|
|
2176
|
+
/** Returns the primary color framebuffer containing the combined result of all converters. */
|
|
1945
2177
|
get primaryColorFramebuffer() {
|
|
1946
2178
|
return this._primaryColorFramebuffer;
|
|
1947
2179
|
}
|
|
1948
|
-
/** Returns the secondary color framebuffer containing the combined result of all converters.
|
|
2180
|
+
/** Returns the secondary color framebuffer containing the combined result of all converters. */
|
|
1949
2181
|
get secondaryColorFramebuffer() {
|
|
1950
2182
|
return this._secondaryColorFramebuffer;
|
|
1951
2183
|
}
|
|
1952
|
-
/** Returns the rotation framebuffer containing the combined result of all converters.
|
|
2184
|
+
/** Returns the rotation framebuffer containing the combined result of all converters. */
|
|
1953
2185
|
get rotationFramebuffer() {
|
|
1954
2186
|
return this._rotationFramebuffer;
|
|
1955
2187
|
}
|
|
1956
|
-
/** Returns the transform framebuffer containing the combined result of all converters.
|
|
2188
|
+
/** Returns the transform framebuffer containing the combined result of all converters. */
|
|
1957
2189
|
get transformFramebuffer() {
|
|
1958
2190
|
return this._transformFramebuffer;
|
|
1959
2191
|
}
|
|
1960
2192
|
}
|
|
1961
|
-
class
|
|
2193
|
+
class H {
|
|
1962
2194
|
/**
|
|
1963
2195
|
* Extracts pixel data from all framebuffers needed for export
|
|
1964
2196
|
* @param pipeline The conversion pipeline containing framebuffers
|
|
1965
2197
|
* @returns Object containing all pixel data arrays
|
|
1966
2198
|
*/
|
|
1967
2199
|
extractFramebufferData(A) {
|
|
1968
|
-
const e = A.get("brightness"), t = e == null ? void 0 : e.characterFramebuffer, r = e == null ? void 0 : e.primaryColorFramebuffer, i = e == null ? void 0 : e.secondaryColorFramebuffer,
|
|
1969
|
-
return t == null || t.loadPixels(), r == null || r.loadPixels(), i == null || i.loadPixels(),
|
|
2200
|
+
const e = A.get("brightness"), t = e == null ? void 0 : e.characterFramebuffer, r = e == null ? void 0 : e.primaryColorFramebuffer, i = e == null ? void 0 : e.secondaryColorFramebuffer, s = e == null ? void 0 : e.transformFramebuffer, o = e == null ? void 0 : e.rotationFramebuffer;
|
|
2201
|
+
return t == null || t.loadPixels(), r == null || r.loadPixels(), i == null || i.loadPixels(), s == null || s.loadPixels(), o == null || o.loadPixels(), {
|
|
1970
2202
|
characterPixels: (t == null ? void 0 : t.pixels) || new Uint8Array(0),
|
|
1971
2203
|
primaryColorPixels: (r == null ? void 0 : r.pixels) || new Uint8Array(0),
|
|
1972
2204
|
secondaryColorPixels: (i == null ? void 0 : i.pixels) || new Uint8Array(0),
|
|
1973
|
-
transformPixels: (
|
|
1974
|
-
rotationPixels: (
|
|
2205
|
+
transformPixels: (s == null ? void 0 : s.pixels) || new Uint8Array(0),
|
|
2206
|
+
rotationPixels: (o == null ? void 0 : o.pixels) || new Uint8Array(0)
|
|
1975
2207
|
};
|
|
1976
2208
|
}
|
|
1977
2209
|
/**
|
|
@@ -2000,7 +2232,7 @@ class U {
|
|
|
2000
2232
|
};
|
|
2001
2233
|
}
|
|
2002
2234
|
}
|
|
2003
|
-
class
|
|
2235
|
+
class L {
|
|
2004
2236
|
/**
|
|
2005
2237
|
* Creates a downloadable blob from content
|
|
2006
2238
|
* @param content The content to include in the blob
|
|
@@ -2010,16 +2242,6 @@ class R {
|
|
|
2010
2242
|
createBlob(A, e) {
|
|
2011
2243
|
return new Blob([A], { type: e });
|
|
2012
2244
|
}
|
|
2013
|
-
/**
|
|
2014
|
-
* Creates a data URL from content
|
|
2015
|
-
* @param content The content to convert
|
|
2016
|
-
* @param mimeType The MIME type for the blob
|
|
2017
|
-
* @returns Data URL string
|
|
2018
|
-
*/
|
|
2019
|
-
createDataURL(A, e) {
|
|
2020
|
-
const t = this.createBlob(A, e);
|
|
2021
|
-
return URL.createObjectURL(t);
|
|
2022
|
-
}
|
|
2023
2245
|
/**
|
|
2024
2246
|
* Downloads content as a file
|
|
2025
2247
|
* @param content The content to download
|
|
@@ -2028,8 +2250,8 @@ class R {
|
|
|
2028
2250
|
*/
|
|
2029
2251
|
downloadFile(A, e, t) {
|
|
2030
2252
|
try {
|
|
2031
|
-
const r = this.createBlob(A, t), i = URL.createObjectURL(r),
|
|
2032
|
-
|
|
2253
|
+
const r = this.createBlob(A, t), i = URL.createObjectURL(r), s = document.createElement("a");
|
|
2254
|
+
s.href = i, s.download = e, s.style.display = "none", s.rel = "noopener", document.body.appendChild(s), s.click(), document.body.removeChild(s), URL.revokeObjectURL(i);
|
|
2033
2255
|
} catch (r) {
|
|
2034
2256
|
throw console.error("Failed to download file:", r), new Error(`File download failed: ${r instanceof Error ? r.message : "Unknown error"}`);
|
|
2035
2257
|
}
|
|
@@ -2057,27 +2279,17 @@ class R {
|
|
|
2057
2279
|
sanitizeFilename(A) {
|
|
2058
2280
|
return A.replace(/[<>:"/\\|?*]/g, "_").replace(/\s+/g, "_").replace(/_{2,}/g, "_").replace(/^_+|_+$/g, "").substring(0, 255);
|
|
2059
2281
|
}
|
|
2060
|
-
/**
|
|
2061
|
-
* Ensures filename has the correct extension
|
|
2062
|
-
* @param filename The filename to check
|
|
2063
|
-
* @param expectedExtension The expected file extension (with dot)
|
|
2064
|
-
* @returns Filename with correct extension
|
|
2065
|
-
*/
|
|
2066
|
-
ensureFileExtension(A, e) {
|
|
2067
|
-
return A.toLowerCase().endsWith(e.toLowerCase()) ? A : A + e;
|
|
2068
|
-
}
|
|
2069
2282
|
/**
|
|
2070
2283
|
* Generates a default filename with prefix and timestamp
|
|
2071
2284
|
* @param prefix The prefix for the filename
|
|
2072
2285
|
* @param extension The file extension (with dot)
|
|
2073
2286
|
* @returns Generated filename
|
|
2074
2287
|
*/
|
|
2075
|
-
generateDefaultFilename(
|
|
2076
|
-
|
|
2077
|
-
return `${A}-${t}${e}`;
|
|
2288
|
+
generateDefaultFilename() {
|
|
2289
|
+
return `'textmode-export'-${this.generateTimestamp()}`;
|
|
2078
2290
|
}
|
|
2079
2291
|
}
|
|
2080
|
-
class
|
|
2292
|
+
class yA extends H {
|
|
2081
2293
|
/**
|
|
2082
2294
|
* Extracts transform data from transform pixels
|
|
2083
2295
|
* @param transformPixels Transform framebuffer pixels
|
|
@@ -2086,12 +2298,12 @@ class cA extends U {
|
|
|
2086
2298
|
* @returns Transform data object
|
|
2087
2299
|
*/
|
|
2088
2300
|
extractTransformData(A, e, t) {
|
|
2089
|
-
const r = A[t], i = A[t + 1],
|
|
2301
|
+
const r = A[t], i = A[t + 1], s = A[t + 2], o = r === 255, g = i === 255, B = s === 255, E = e[t], Q = e[t + 1], l = E + Q / 255, c = Math.round(l * 360 / 255 * 100) / 100;
|
|
2090
2302
|
return {
|
|
2091
|
-
isInverted:
|
|
2092
|
-
flipHorizontal:
|
|
2093
|
-
flipVertical:
|
|
2094
|
-
rotation:
|
|
2303
|
+
isInverted: o,
|
|
2304
|
+
flipHorizontal: g,
|
|
2305
|
+
flipVertical: B,
|
|
2306
|
+
rotation: c
|
|
2095
2307
|
};
|
|
2096
2308
|
}
|
|
2097
2309
|
/**
|
|
@@ -2120,34 +2332,34 @@ class cA extends U {
|
|
|
2120
2332
|
const t = [];
|
|
2121
2333
|
let r = 0;
|
|
2122
2334
|
for (let i = 0; i < e.rows; i++)
|
|
2123
|
-
for (let
|
|
2124
|
-
const
|
|
2335
|
+
for (let s = 0; s < e.cols; s++) {
|
|
2336
|
+
const o = r * 4, g = this.getCharacterIndex(
|
|
2125
2337
|
A.characterPixels,
|
|
2126
|
-
|
|
2338
|
+
o
|
|
2127
2339
|
);
|
|
2128
|
-
let
|
|
2129
|
-
const
|
|
2340
|
+
let B = this.pixelsToRGBA(A.primaryColorPixels, o), E = this.pixelsToRGBA(A.secondaryColorPixels, o);
|
|
2341
|
+
const Q = this.extractTransformData(
|
|
2130
2342
|
A.transformPixels,
|
|
2131
2343
|
A.rotationPixels,
|
|
2132
|
-
|
|
2344
|
+
o
|
|
2133
2345
|
);
|
|
2134
|
-
if (
|
|
2135
|
-
const
|
|
2136
|
-
|
|
2346
|
+
if (Q.isInverted) {
|
|
2347
|
+
const c = B;
|
|
2348
|
+
B = E, E = c;
|
|
2137
2349
|
}
|
|
2138
|
-
const
|
|
2350
|
+
const l = this.calculateCellPosition(s, i, e);
|
|
2139
2351
|
t.push({
|
|
2140
|
-
charIndex:
|
|
2141
|
-
primaryColor:
|
|
2352
|
+
charIndex: g,
|
|
2353
|
+
primaryColor: B,
|
|
2142
2354
|
secondaryColor: E,
|
|
2143
|
-
transform:
|
|
2144
|
-
position:
|
|
2355
|
+
transform: Q,
|
|
2356
|
+
position: l
|
|
2145
2357
|
}), r++;
|
|
2146
2358
|
}
|
|
2147
2359
|
return t;
|
|
2148
2360
|
}
|
|
2149
2361
|
}
|
|
2150
|
-
class
|
|
2362
|
+
class TA {
|
|
2151
2363
|
/**
|
|
2152
2364
|
* Gets the glyph index for a given Unicode code point in a Typr.js font
|
|
2153
2365
|
* @param fontData The Typr.js font data
|
|
@@ -2164,11 +2376,11 @@ class uA {
|
|
|
2164
2376
|
if (r.idRangeOffset[i] === 0)
|
|
2165
2377
|
return e + r.idDelta[i] & 65535;
|
|
2166
2378
|
{
|
|
2167
|
-
const
|
|
2168
|
-
if (
|
|
2169
|
-
const
|
|
2170
|
-
if (
|
|
2171
|
-
return
|
|
2379
|
+
const s = r.idRangeOffset[i] / 2 + (e - r.startCount[i]) - (r.startCount.length - i);
|
|
2380
|
+
if (s >= 0 && s < r.glyphIdArray.length) {
|
|
2381
|
+
const o = r.glyphIdArray[s];
|
|
2382
|
+
if (o !== 0)
|
|
2383
|
+
return o + r.idDelta[i] & 65535;
|
|
2172
2384
|
}
|
|
2173
2385
|
}
|
|
2174
2386
|
}
|
|
@@ -2197,15 +2409,15 @@ class uA {
|
|
|
2197
2409
|
createGlyphPath(A, e, t, r, i) {
|
|
2198
2410
|
if (!e || !e.xs || e.xs.length === 0)
|
|
2199
2411
|
return this.createEmptyPath();
|
|
2200
|
-
const
|
|
2412
|
+
const s = i / A.head.unitsPerEm;
|
|
2201
2413
|
return {
|
|
2202
2414
|
getBoundingBox: () => ({
|
|
2203
|
-
x1: t + e.xMin *
|
|
2204
|
-
y1: r + -e.yMax *
|
|
2205
|
-
x2: t + e.xMax *
|
|
2206
|
-
y2: r + -e.yMin *
|
|
2415
|
+
x1: t + e.xMin * s,
|
|
2416
|
+
y1: r + -e.yMax * s,
|
|
2417
|
+
x2: t + e.xMax * s,
|
|
2418
|
+
y2: r + -e.yMin * s
|
|
2207
2419
|
}),
|
|
2208
|
-
toSVG: () => this.glyphToSVGPath(e, t, r,
|
|
2420
|
+
toSVG: () => this.glyphToSVGPath(e, t, r, s)
|
|
2209
2421
|
};
|
|
2210
2422
|
}
|
|
2211
2423
|
/**
|
|
@@ -2218,37 +2430,37 @@ class uA {
|
|
|
2218
2430
|
*/
|
|
2219
2431
|
glyphToSVGPath(A, e, t, r) {
|
|
2220
2432
|
if (!A || !A.xs) return "";
|
|
2221
|
-
const { xs: i, ys:
|
|
2222
|
-
if (!i || !
|
|
2223
|
-
let
|
|
2224
|
-
for (let
|
|
2225
|
-
const
|
|
2226
|
-
if (!(
|
|
2227
|
-
if (
|
|
2228
|
-
const
|
|
2229
|
-
|
|
2230
|
-
let
|
|
2231
|
-
for (;
|
|
2232
|
-
if ((
|
|
2233
|
-
const
|
|
2234
|
-
|
|
2433
|
+
const { xs: i, ys: s, endPts: o, flags: g } = A;
|
|
2434
|
+
if (!i || !s || !o || !g) return "";
|
|
2435
|
+
let B = "", E = 0;
|
|
2436
|
+
for (let Q = 0; Q < o.length; Q++) {
|
|
2437
|
+
const l = o[Q];
|
|
2438
|
+
if (!(l < E)) {
|
|
2439
|
+
if (l >= E) {
|
|
2440
|
+
const c = e + i[E] * r, d = t - s[E] * r;
|
|
2441
|
+
B += `M${c.toFixed(2)},${d.toFixed(2)}`;
|
|
2442
|
+
let u = E + 1;
|
|
2443
|
+
for (; u <= l; )
|
|
2444
|
+
if ((g[u] & 1) !== 0) {
|
|
2445
|
+
const m = e + i[u] * r, f = t - s[u] * r;
|
|
2446
|
+
B += `L${m.toFixed(2)},${f.toFixed(2)}`, u++;
|
|
2235
2447
|
} else {
|
|
2236
|
-
const
|
|
2237
|
-
let
|
|
2238
|
-
if ((
|
|
2239
|
-
const
|
|
2240
|
-
|
|
2448
|
+
const m = e + i[u] * r, f = t - s[u] * r;
|
|
2449
|
+
let I = u + 1 > l ? E : u + 1;
|
|
2450
|
+
if ((g[I] & 1) !== 0) {
|
|
2451
|
+
const x = e + i[I] * r, w = t - s[I] * r;
|
|
2452
|
+
B += `Q${m.toFixed(2)},${f.toFixed(2)} ${x.toFixed(2)},${w.toFixed(2)}`, u = I + 1;
|
|
2241
2453
|
} else {
|
|
2242
|
-
const
|
|
2243
|
-
|
|
2454
|
+
const x = e + i[I] * r, w = t - s[I] * r, M = (m + x) / 2, T = (f + w) / 2;
|
|
2455
|
+
B += `Q${m.toFixed(2)},${f.toFixed(2)} ${M.toFixed(2)},${T.toFixed(2)}`, u = I;
|
|
2244
2456
|
}
|
|
2245
2457
|
}
|
|
2246
|
-
|
|
2458
|
+
B += "Z";
|
|
2247
2459
|
}
|
|
2248
|
-
E =
|
|
2460
|
+
E = l + 1;
|
|
2249
2461
|
}
|
|
2250
2462
|
}
|
|
2251
|
-
return
|
|
2463
|
+
return B;
|
|
2252
2464
|
}
|
|
2253
2465
|
/**
|
|
2254
2466
|
* Generates an SVG path for a character glyph
|
|
@@ -2261,18 +2473,18 @@ class uA {
|
|
|
2261
2473
|
*/
|
|
2262
2474
|
generateCharacterPath(A, e, t, r, i) {
|
|
2263
2475
|
try {
|
|
2264
|
-
const
|
|
2265
|
-
if (
|
|
2476
|
+
const s = A.codePointAt(0) || 0, o = this.getGlyphIndex(e, s);
|
|
2477
|
+
if (o === 0)
|
|
2266
2478
|
return this.createEmptyPath();
|
|
2267
|
-
let
|
|
2479
|
+
let g = null;
|
|
2268
2480
|
try {
|
|
2269
|
-
e.glyf && e.glyf[
|
|
2270
|
-
} catch (
|
|
2271
|
-
console.warn(`Failed to parse glyph ${
|
|
2481
|
+
e.glyf && e.glyf[o] !== null ? g = e.glyf[o] : h && h.T && h.T.glyf && h.T.glyf._parseGlyf && (g = h.T.glyf._parseGlyf(e, o), e.glyf && g && (e.glyf[o] = g));
|
|
2482
|
+
} catch (B) {
|
|
2483
|
+
console.warn(`Failed to parse glyph ${o}:`, B);
|
|
2272
2484
|
}
|
|
2273
|
-
return
|
|
2274
|
-
} catch (
|
|
2275
|
-
return console.warn(`Failed to generate path for character "${A}":`,
|
|
2485
|
+
return g ? this.createGlyphPath(e, g, t, r, i) : this.createEmptyPath();
|
|
2486
|
+
} catch (s) {
|
|
2487
|
+
return console.warn(`Failed to generate path for character "${A}":`, s), this.createEmptyPath();
|
|
2276
2488
|
}
|
|
2277
2489
|
}
|
|
2278
2490
|
/**
|
|
@@ -2287,19 +2499,19 @@ class uA {
|
|
|
2287
2499
|
* @param advanceWidth Character advance width
|
|
2288
2500
|
* @returns SVG path data string or null if generation fails
|
|
2289
2501
|
*/
|
|
2290
|
-
generatePositionedCharacterPath(A, e, t, r, i,
|
|
2502
|
+
generatePositionedCharacterPath(A, e, t, r, i, s, o, g) {
|
|
2291
2503
|
try {
|
|
2292
|
-
const
|
|
2293
|
-
return this.generateCharacterPath(A, e,
|
|
2294
|
-
} catch (
|
|
2295
|
-
return console.warn(`Failed to generate positioned character path for "${A}":`,
|
|
2504
|
+
const B = o / e.head.unitsPerEm, E = g * B, Q = t + (i - E) / 2, l = r + (s + o * 0.7) / 2;
|
|
2505
|
+
return this.generateCharacterPath(A, e, Q, l, o).toSVG() || null;
|
|
2506
|
+
} catch (B) {
|
|
2507
|
+
return console.warn(`Failed to generate positioned character path for "${A}":`, B), null;
|
|
2296
2508
|
}
|
|
2297
2509
|
}
|
|
2298
2510
|
}
|
|
2299
|
-
class
|
|
2511
|
+
class SA {
|
|
2300
2512
|
constructor() {
|
|
2301
|
-
|
|
2302
|
-
this.pathGenerator = new
|
|
2513
|
+
a(this, "pathGenerator");
|
|
2514
|
+
this.pathGenerator = new TA();
|
|
2303
2515
|
}
|
|
2304
2516
|
/**
|
|
2305
2517
|
* Generates the SVG header with metadata
|
|
@@ -2351,12 +2563,12 @@ class dA {
|
|
|
2351
2563
|
* @returns Transform attribute string or empty string
|
|
2352
2564
|
*/
|
|
2353
2565
|
generateTransformAttribute(A, e) {
|
|
2354
|
-
const { transform: t, position: r } = A, i = r.cellX + e.cellWidth / 2,
|
|
2566
|
+
const { transform: t, position: r } = A, i = r.cellX + e.cellWidth / 2, s = r.cellY + e.cellHeight / 2, o = [];
|
|
2355
2567
|
if (t.flipHorizontal || t.flipVertical) {
|
|
2356
|
-
const
|
|
2357
|
-
|
|
2568
|
+
const g = t.flipHorizontal ? -1 : 1, B = t.flipVertical ? -1 : 1;
|
|
2569
|
+
o.push(`translate(${i} ${s})`), o.push(`scale(${g} ${B})`), o.push(`translate(${-i} ${-s})`);
|
|
2358
2570
|
}
|
|
2359
|
-
return t.rotation &&
|
|
2571
|
+
return t.rotation && o.push(`rotate(${t.rotation} ${i} ${s})`), o.length ? ` transform="${o.join(" ")}"` : "";
|
|
2360
2572
|
}
|
|
2361
2573
|
/**
|
|
2362
2574
|
* Generates background rectangle for a cell
|
|
@@ -2385,7 +2597,7 @@ class dA {
|
|
|
2385
2597
|
const i = t.characters[A.charIndex];
|
|
2386
2598
|
if (!i)
|
|
2387
2599
|
return "";
|
|
2388
|
-
const
|
|
2600
|
+
const s = this.pathGenerator.generatePositionedCharacterPath(
|
|
2389
2601
|
i.character,
|
|
2390
2602
|
t.font,
|
|
2391
2603
|
A.position.cellX,
|
|
@@ -2395,12 +2607,12 @@ class dA {
|
|
|
2395
2607
|
t.fontSize,
|
|
2396
2608
|
i.advanceWidth
|
|
2397
2609
|
);
|
|
2398
|
-
if (!
|
|
2610
|
+
if (!s)
|
|
2399
2611
|
return "";
|
|
2400
|
-
const
|
|
2612
|
+
const o = this.rgbaToColorString(A.primaryColor);
|
|
2401
2613
|
return r.drawMode === "stroke" ? `
|
|
2402
|
-
<path id="${`path-${A.charIndex}-${A.position.cellX}-${A.position.cellY}`.replace(/\./g, "-")}" d="${
|
|
2403
|
-
<path d="${
|
|
2614
|
+
<path id="${`path-${A.charIndex}-${A.position.cellX}-${A.position.cellY}`.replace(/\./g, "-")}" d="${s}" stroke="${o}" stroke-width="${r.strokeWidth}" fill="none" />` : `
|
|
2615
|
+
<path d="${s}" fill="${o}" />`;
|
|
2404
2616
|
}
|
|
2405
2617
|
/**
|
|
2406
2618
|
* Generates complete SVG content for a single cell
|
|
@@ -2413,10 +2625,10 @@ class dA {
|
|
|
2413
2625
|
generateCellContent(A, e, t, r) {
|
|
2414
2626
|
let i = "";
|
|
2415
2627
|
i += this.generateCellBackground(A, e, r);
|
|
2416
|
-
const
|
|
2417
|
-
return
|
|
2418
|
-
<g${
|
|
2419
|
-
</g>`) : i +=
|
|
2628
|
+
const s = this.generateTransformAttribute(A, e), o = this.generateCharacterPath(A, e, t, r);
|
|
2629
|
+
return o && (s ? (i += `
|
|
2630
|
+
<g${s}>`, i += o, i += `
|
|
2631
|
+
</g>`) : i += o), i;
|
|
2420
2632
|
}
|
|
2421
2633
|
/**
|
|
2422
2634
|
* Generates the complete SVG content from cell data
|
|
@@ -2430,8 +2642,8 @@ class dA {
|
|
|
2430
2642
|
let i = this.generateSVGHeader(e);
|
|
2431
2643
|
i += this.generateBackground(e, r), i += `
|
|
2432
2644
|
<g id="ascii-cells">`;
|
|
2433
|
-
for (const
|
|
2434
|
-
i += this.generateCellContent(
|
|
2645
|
+
for (const s of A)
|
|
2646
|
+
i += this.generateCellContent(s, e, t, r);
|
|
2435
2647
|
return i += this.generateSVGFooter(), i;
|
|
2436
2648
|
}
|
|
2437
2649
|
/**
|
|
@@ -2444,24 +2656,7 @@ class dA {
|
|
|
2444
2656
|
`).replace(/[ \t]+$/gm, "");
|
|
2445
2657
|
}
|
|
2446
2658
|
}
|
|
2447
|
-
class
|
|
2448
|
-
/**
|
|
2449
|
-
* Generates a default filename for SVG export
|
|
2450
|
-
* @param prefix Optional prefix for the filename
|
|
2451
|
-
* @returns Generated filename without extension
|
|
2452
|
-
*/
|
|
2453
|
-
generateDefaultFilename(A = "textmode_output") {
|
|
2454
|
-
const { date: e, time: t } = this.generateDateTimeString();
|
|
2455
|
-
return `${A}_${e}_${t}`;
|
|
2456
|
-
}
|
|
2457
|
-
/**
|
|
2458
|
-
* Validates filename for safety and compatibility
|
|
2459
|
-
* @param filename The filename to validate
|
|
2460
|
-
* @returns Sanitized filename
|
|
2461
|
-
*/
|
|
2462
|
-
sanitizeFilename(A) {
|
|
2463
|
-
return super.sanitizeFilename(A);
|
|
2464
|
-
}
|
|
2659
|
+
class MA extends L {
|
|
2465
2660
|
/**
|
|
2466
2661
|
* Creates a downloadable blob from SVG content
|
|
2467
2662
|
* @param svgContent The SVG content string
|
|
@@ -2470,14 +2665,6 @@ class CA extends R {
|
|
|
2470
2665
|
createSVGBlob(A) {
|
|
2471
2666
|
return this.createBlob(A, "image/svg+xml;charset=utf-8");
|
|
2472
2667
|
}
|
|
2473
|
-
/**
|
|
2474
|
-
* Creates a data URL from SVG content
|
|
2475
|
-
* @param svgContent The SVG content string
|
|
2476
|
-
* @returns Data URL string
|
|
2477
|
-
*/
|
|
2478
|
-
createDataURL(A) {
|
|
2479
|
-
return super.createDataURL(A, "image/svg+xml;charset=utf-8");
|
|
2480
|
-
}
|
|
2481
2668
|
/**
|
|
2482
2669
|
* Downloads SVG content as a file
|
|
2483
2670
|
* @param svgContent The SVG content to download
|
|
@@ -2485,8 +2672,7 @@ class CA extends R {
|
|
|
2485
2672
|
*/
|
|
2486
2673
|
downloadSVG(A, e) {
|
|
2487
2674
|
try {
|
|
2488
|
-
|
|
2489
|
-
this.downloadFile(A, r, "image/svg+xml;charset=utf-8");
|
|
2675
|
+
this.downloadFile(A, this.sanitizeFilename(e) + ".svg", "image/svg+xml;charset=utf-8");
|
|
2490
2676
|
} catch (t) {
|
|
2491
2677
|
throw console.error("Failed to download SVG file:", t), new Error(`SVG download failed: ${t instanceof Error ? t.message : "Unknown error"}`);
|
|
2492
2678
|
}
|
|
@@ -2497,16 +2683,15 @@ class CA extends R {
|
|
|
2497
2683
|
* @param filename Optional filename (will generate if not provided)
|
|
2498
2684
|
*/
|
|
2499
2685
|
saveSVG(A, e) {
|
|
2500
|
-
|
|
2501
|
-
this.downloadSVG(A, t);
|
|
2686
|
+
this.downloadSVG(A, e || this.generateDefaultFilename());
|
|
2502
2687
|
}
|
|
2503
2688
|
}
|
|
2504
|
-
class
|
|
2689
|
+
class W {
|
|
2505
2690
|
constructor() {
|
|
2506
|
-
|
|
2507
|
-
|
|
2508
|
-
|
|
2509
|
-
this.dataExtractor = new
|
|
2691
|
+
a(this, "dataExtractor");
|
|
2692
|
+
a(this, "contentGenerator");
|
|
2693
|
+
a(this, "fileHandler");
|
|
2694
|
+
this.dataExtractor = new yA(), this.contentGenerator = new SA(), this.fileHandler = new MA();
|
|
2510
2695
|
}
|
|
2511
2696
|
/**
|
|
2512
2697
|
* Applies default values to SVG export options
|
|
@@ -2531,13 +2716,13 @@ class V {
|
|
|
2531
2716
|
const t = this.applyDefaultOptions(e), r = this.dataExtractor.extractFramebufferData(A.pipeline), i = this.dataExtractor.extractSVGCellData(
|
|
2532
2717
|
r,
|
|
2533
2718
|
A.grid
|
|
2534
|
-
),
|
|
2719
|
+
), s = this.contentGenerator.generateSVGContent(
|
|
2535
2720
|
i,
|
|
2536
2721
|
A.grid,
|
|
2537
2722
|
A.font,
|
|
2538
2723
|
t
|
|
2539
2724
|
);
|
|
2540
|
-
return this.contentGenerator.optimizeSVGContent(
|
|
2725
|
+
return this.contentGenerator.optimizeSVGContent(s);
|
|
2541
2726
|
}
|
|
2542
2727
|
/**
|
|
2543
2728
|
* Exports SVG content to a downloadable file
|
|
@@ -2553,7 +2738,7 @@ class V {
|
|
|
2553
2738
|
}
|
|
2554
2739
|
}
|
|
2555
2740
|
}
|
|
2556
|
-
class
|
|
2741
|
+
class GA extends H {
|
|
2557
2742
|
/**
|
|
2558
2743
|
* Extracts character data for TXT generation
|
|
2559
2744
|
* @param framebufferData Framebuffer pixel data
|
|
@@ -2563,24 +2748,24 @@ class fA extends U {
|
|
|
2563
2748
|
* @returns 2D array of characters (rows x columns)
|
|
2564
2749
|
*/
|
|
2565
2750
|
extractCharacterGrid(A, e, t, r = " ") {
|
|
2566
|
-
var
|
|
2751
|
+
var o;
|
|
2567
2752
|
const i = [];
|
|
2568
|
-
let
|
|
2569
|
-
for (let
|
|
2570
|
-
const
|
|
2753
|
+
let s = 0;
|
|
2754
|
+
for (let g = 0; g < e.rows; g++) {
|
|
2755
|
+
const B = [];
|
|
2571
2756
|
for (let E = 0; E < e.cols; E++) {
|
|
2572
|
-
const
|
|
2757
|
+
const Q = s * 4, l = this.getCharacterIndex(
|
|
2573
2758
|
A.characterPixels,
|
|
2574
|
-
|
|
2575
|
-
),
|
|
2576
|
-
|
|
2759
|
+
Q
|
|
2760
|
+
), c = ((o = t.characters[l]) == null ? void 0 : o.character) || r;
|
|
2761
|
+
B.push(c), s++;
|
|
2577
2762
|
}
|
|
2578
|
-
i.push(
|
|
2763
|
+
i.push(B);
|
|
2579
2764
|
}
|
|
2580
2765
|
return i;
|
|
2581
2766
|
}
|
|
2582
2767
|
}
|
|
2583
|
-
class
|
|
2768
|
+
class RA {
|
|
2584
2769
|
/**
|
|
2585
2770
|
* Generates TXT content from a 2D character array
|
|
2586
2771
|
* @param characterGrid 2D array of characters (rows x columns)
|
|
@@ -2590,8 +2775,8 @@ class DA {
|
|
|
2590
2775
|
generateTXTContent(A, e) {
|
|
2591
2776
|
const t = [];
|
|
2592
2777
|
for (const i of A) {
|
|
2593
|
-
let
|
|
2594
|
-
e.preserveTrailingSpaces || (
|
|
2778
|
+
let s = i.join("");
|
|
2779
|
+
e.preserveTrailingSpaces || (s = s.replace(/\s+$/, "")), t.push(s);
|
|
2595
2780
|
}
|
|
2596
2781
|
const r = e.lineEnding === "crlf" ? `\r
|
|
2597
2782
|
` : `
|
|
@@ -2599,7 +2784,7 @@ class DA {
|
|
|
2599
2784
|
return t.join(r);
|
|
2600
2785
|
}
|
|
2601
2786
|
}
|
|
2602
|
-
class
|
|
2787
|
+
class UA extends L {
|
|
2603
2788
|
/**
|
|
2604
2789
|
* Saves TXT content as a downloadable file
|
|
2605
2790
|
* @param content The TXT content to save
|
|
@@ -2613,13 +2798,6 @@ class mA extends R {
|
|
|
2613
2798
|
throw console.error("Failed to save TXT file:", t), new Error(`TXT file save failed: ${t instanceof Error ? t.message : "Unknown error"}`);
|
|
2614
2799
|
}
|
|
2615
2800
|
}
|
|
2616
|
-
/**
|
|
2617
|
-
* Generates a default filename for TXT export
|
|
2618
|
-
* @returns Default filename with timestamp
|
|
2619
|
-
*/
|
|
2620
|
-
generateDefaultFilename() {
|
|
2621
|
-
return super.generateDefaultFilename("textmode-export", ".txt");
|
|
2622
|
-
}
|
|
2623
2801
|
/**
|
|
2624
2802
|
* Ensures filename has proper extension and is valid
|
|
2625
2803
|
* @param filename The filename to validate and fix
|
|
@@ -2627,15 +2805,15 @@ class mA extends R {
|
|
|
2627
2805
|
*/
|
|
2628
2806
|
ensureValidFilename(A) {
|
|
2629
2807
|
let e = this.sanitizeFilename(A);
|
|
2630
|
-
return e
|
|
2808
|
+
return e === ".txt" || e.length <= 4 ? this.generateDefaultFilename() : e;
|
|
2631
2809
|
}
|
|
2632
2810
|
}
|
|
2633
|
-
class
|
|
2811
|
+
class $ {
|
|
2634
2812
|
constructor() {
|
|
2635
|
-
|
|
2636
|
-
|
|
2637
|
-
|
|
2638
|
-
this.dataExtractor = new
|
|
2813
|
+
a(this, "dataExtractor");
|
|
2814
|
+
a(this, "contentGenerator");
|
|
2815
|
+
a(this, "fileHandler");
|
|
2816
|
+
this.dataExtractor = new GA(), this.contentGenerator = new RA(), this.fileHandler = new UA();
|
|
2639
2817
|
}
|
|
2640
2818
|
/**
|
|
2641
2819
|
* Applies default values to TXT export options
|
|
@@ -2681,10 +2859,10 @@ class H {
|
|
|
2681
2859
|
}
|
|
2682
2860
|
}
|
|
2683
2861
|
}
|
|
2684
|
-
class
|
|
2862
|
+
class YA extends H {
|
|
2685
2863
|
/**
|
|
2686
2864
|
* Captures the current state of the textmode canvas as image data
|
|
2687
|
-
* @param
|
|
2865
|
+
* @param canvas The canvas data containing the rendered textmode graphics
|
|
2688
2866
|
* @param scale Scale factor for the output image
|
|
2689
2867
|
* @param backgroundColor Background color for formats that don't support transparency
|
|
2690
2868
|
* @returns Canvas element containing the captured image data
|
|
@@ -2693,11 +2871,8 @@ class PA extends U {
|
|
|
2693
2871
|
const r = A.canvas;
|
|
2694
2872
|
if (e === 1 && t === "transparent")
|
|
2695
2873
|
return r;
|
|
2696
|
-
const i = document.createElement("canvas"),
|
|
2697
|
-
|
|
2698
|
-
throw new Error("Failed to get 2D rendering context for image capture");
|
|
2699
|
-
const s = Math.round(r.width * e), B = Math.round(r.height * e);
|
|
2700
|
-
return i.width = s, i.height = B, t !== "transparent" && (a.fillStyle = t, a.fillRect(0, 0, s, B)), a.imageSmoothingEnabled = !1, a.drawImage(
|
|
2874
|
+
const i = document.createElement("canvas"), s = i.getContext("2d"), o = Math.round(r.width * e), g = Math.round(r.height * e);
|
|
2875
|
+
return i.width = o, i.height = g, t !== "transparent" && (s.fillStyle = t, s.fillRect(0, 0, o, g)), s.imageSmoothingEnabled = !1, s.drawImage(
|
|
2701
2876
|
r,
|
|
2702
2877
|
0,
|
|
2703
2878
|
0,
|
|
@@ -2705,12 +2880,12 @@ class PA extends U {
|
|
|
2705
2880
|
r.height,
|
|
2706
2881
|
0,
|
|
2707
2882
|
0,
|
|
2708
|
-
|
|
2709
|
-
|
|
2883
|
+
o,
|
|
2884
|
+
g
|
|
2710
2885
|
), i;
|
|
2711
2886
|
}
|
|
2712
2887
|
}
|
|
2713
|
-
class
|
|
2888
|
+
class kA {
|
|
2714
2889
|
/**
|
|
2715
2890
|
* Generates image data from canvas
|
|
2716
2891
|
* @param canvas The canvas containing the image data
|
|
@@ -2729,10 +2904,10 @@ class IA {
|
|
|
2729
2904
|
*/
|
|
2730
2905
|
async generateImageBlob(A, e) {
|
|
2731
2906
|
return new Promise((t, r) => {
|
|
2732
|
-
const i = this.getMimeType(e.format),
|
|
2733
|
-
|
|
2907
|
+
const i = this.getMimeType(e.format), s = (o) => {
|
|
2908
|
+
o ? t(o) : r(new Error(`Failed to generate ${e.format.toUpperCase()} blob`));
|
|
2734
2909
|
};
|
|
2735
|
-
e.format === "png" ? A.toBlob(
|
|
2910
|
+
e.format === "png" ? A.toBlob(s, i) : A.toBlob(s, i, e.quality);
|
|
2736
2911
|
});
|
|
2737
2912
|
}
|
|
2738
2913
|
/**
|
|
@@ -2753,16 +2928,16 @@ class IA {
|
|
|
2753
2928
|
}
|
|
2754
2929
|
}
|
|
2755
2930
|
}
|
|
2756
|
-
const
|
|
2931
|
+
const J = {
|
|
2757
2932
|
png: "image/png",
|
|
2758
2933
|
jpg: "image/jpeg",
|
|
2759
2934
|
webp: "image/webp"
|
|
2760
|
-
},
|
|
2935
|
+
}, k = {
|
|
2761
2936
|
png: ".png",
|
|
2762
2937
|
jpg: ".jpg",
|
|
2763
2938
|
webp: ".webp"
|
|
2764
2939
|
};
|
|
2765
|
-
class
|
|
2940
|
+
class VA extends L {
|
|
2766
2941
|
/**
|
|
2767
2942
|
* Saves image content as a downloadable file
|
|
2768
2943
|
* @param content The image content (data URL or blob)
|
|
@@ -2771,8 +2946,8 @@ class wA extends R {
|
|
|
2771
2946
|
*/
|
|
2772
2947
|
saveImage(A, e, t) {
|
|
2773
2948
|
try {
|
|
2774
|
-
const r =
|
|
2775
|
-
typeof A == "string" ? this.saveImageFromDataURL(A,
|
|
2949
|
+
const r = k[t];
|
|
2950
|
+
typeof A == "string" ? this.saveImageFromDataURL(A, this.sanitizeFilename(e) + r) : this.saveImageFromBlob(A, this.sanitizeFilename(e) + r);
|
|
2776
2951
|
} catch (r) {
|
|
2777
2952
|
throw console.error(`Failed to save ${t.toUpperCase()} image:`, r), new Error(`Image save failed: ${r instanceof Error ? r.message : "Unknown error"}`);
|
|
2778
2953
|
}
|
|
@@ -2800,22 +2975,13 @@ class wA extends R {
|
|
|
2800
2975
|
URL.revokeObjectURL(t);
|
|
2801
2976
|
}
|
|
2802
2977
|
}
|
|
2803
|
-
/**
|
|
2804
|
-
* Generates a default filename for image export
|
|
2805
|
-
* @param format The image format for the file extension
|
|
2806
|
-
* @returns Generated filename with timestamp
|
|
2807
|
-
*/
|
|
2808
|
-
generateDefaultImageFilename(A = "png") {
|
|
2809
|
-
const e = y[A];
|
|
2810
|
-
return super.generateDefaultFilename("textmode-export", e);
|
|
2811
|
-
}
|
|
2812
2978
|
/**
|
|
2813
2979
|
* Validates if the browser supports saving files in the specified format
|
|
2814
2980
|
* @param format The image format to validate
|
|
2815
2981
|
* @returns True if the format is supported for saving
|
|
2816
2982
|
*/
|
|
2817
2983
|
validateSaveSupport(A) {
|
|
2818
|
-
return A in
|
|
2984
|
+
return A in J && A in k;
|
|
2819
2985
|
}
|
|
2820
2986
|
/**
|
|
2821
2987
|
* Gets the MIME type for the specified image format
|
|
@@ -2823,7 +2989,7 @@ class wA extends R {
|
|
|
2823
2989
|
* @returns The MIME type string
|
|
2824
2990
|
*/
|
|
2825
2991
|
getMimeType(A) {
|
|
2826
|
-
return
|
|
2992
|
+
return J[A];
|
|
2827
2993
|
}
|
|
2828
2994
|
/**
|
|
2829
2995
|
* Gets the file extension for the specified image format
|
|
@@ -2831,15 +2997,15 @@ class wA extends R {
|
|
|
2831
2997
|
* @returns The file extension (including the dot)
|
|
2832
2998
|
*/
|
|
2833
2999
|
getFileExtension(A) {
|
|
2834
|
-
return
|
|
3000
|
+
return k[A];
|
|
2835
3001
|
}
|
|
2836
3002
|
}
|
|
2837
|
-
class
|
|
3003
|
+
class OA {
|
|
2838
3004
|
constructor() {
|
|
2839
|
-
|
|
2840
|
-
|
|
2841
|
-
|
|
2842
|
-
this.dataExtractor = new
|
|
3005
|
+
a(this, "dataExtractor");
|
|
3006
|
+
a(this, "contentGenerator");
|
|
3007
|
+
a(this, "fileHandler");
|
|
3008
|
+
this.dataExtractor = new YA(), this.contentGenerator = new kA(), this.fileHandler = new VA();
|
|
2843
3009
|
}
|
|
2844
3010
|
/**
|
|
2845
3011
|
* Applies default values to image export options
|
|
@@ -2870,18 +3036,16 @@ class pA {
|
|
|
2870
3036
|
}
|
|
2871
3037
|
/**
|
|
2872
3038
|
* Generates image data from textmode rendering without saving to file
|
|
2873
|
-
* @param
|
|
3039
|
+
* @param canvas The canvas data containing the rendered textmode graphics
|
|
2874
3040
|
* @param options Export options (excluding filename)
|
|
2875
3041
|
* @returns Data URL string containing the image data
|
|
2876
3042
|
*/
|
|
2877
3043
|
generateImage(A, e = {}) {
|
|
2878
3044
|
const t = this.applyDefaultOptions(e);
|
|
2879
|
-
if (this.validateOptions(t), t.scale === 1 && t.backgroundColor === "transparent")
|
|
2880
|
-
|
|
2881
|
-
return this.contentGenerator.generateImageData(a, t);
|
|
2882
|
-
}
|
|
3045
|
+
if (this.validateOptions(t), t.scale === 1 && t.backgroundColor === "transparent")
|
|
3046
|
+
return this.contentGenerator.generateImageData(A.canvas, t);
|
|
2883
3047
|
const r = this.dataExtractor.captureCanvasData(
|
|
2884
|
-
A
|
|
3048
|
+
A,
|
|
2885
3049
|
t.scale,
|
|
2886
3050
|
t.backgroundColor
|
|
2887
3051
|
);
|
|
@@ -2892,18 +3056,16 @@ class pA {
|
|
|
2892
3056
|
}
|
|
2893
3057
|
/**
|
|
2894
3058
|
* Generates image blob from textmode rendering without saving to file
|
|
2895
|
-
* @param
|
|
3059
|
+
* @param canvasData The canvas data containing the rendered textmode graphics
|
|
2896
3060
|
* @param options Export options (excluding filename)
|
|
2897
3061
|
* @returns Promise that resolves to a Blob containing the image data
|
|
2898
3062
|
*/
|
|
2899
3063
|
async generateImageBlob(A, e = {}) {
|
|
2900
3064
|
const t = this.applyDefaultOptions(e);
|
|
2901
|
-
if (this.validateOptions(t), t.scale === 1 && t.backgroundColor === "transparent")
|
|
2902
|
-
|
|
2903
|
-
return await this.contentGenerator.generateImageBlob(a, t);
|
|
2904
|
-
}
|
|
3065
|
+
if (this.validateOptions(t), t.scale === 1 && t.backgroundColor === "transparent")
|
|
3066
|
+
return await this.contentGenerator.generateImageBlob(A.canvas, t);
|
|
2905
3067
|
const r = this.dataExtractor.captureCanvasData(
|
|
2906
|
-
A
|
|
3068
|
+
A,
|
|
2907
3069
|
t.scale,
|
|
2908
3070
|
t.backgroundColor
|
|
2909
3071
|
);
|
|
@@ -2914,48 +3076,48 @@ class pA {
|
|
|
2914
3076
|
}
|
|
2915
3077
|
/**
|
|
2916
3078
|
* Exports image to a downloadable file
|
|
2917
|
-
* @param
|
|
3079
|
+
* @param canvas The canvas data containing the rendered textmode graphics
|
|
2918
3080
|
* @param options Export options including filename
|
|
2919
3081
|
*/
|
|
2920
3082
|
async saveImage(A, e = {}) {
|
|
2921
3083
|
try {
|
|
2922
|
-
const t = await this.generateImageBlob(A, e), r = e.format ?? "png", i = e.filename || this.fileHandler.
|
|
3084
|
+
const t = await this.generateImageBlob(A, e), r = e.format ?? "png", i = e.filename || this.fileHandler.generateDefaultFilename();
|
|
2923
3085
|
this.fileHandler.saveImage(t, i, r);
|
|
2924
3086
|
} catch (t) {
|
|
2925
3087
|
throw console.error("Failed to save image:", t), new Error(`Image save failed: ${t instanceof Error ? t.message : "Unknown error"}`);
|
|
2926
3088
|
}
|
|
2927
3089
|
}
|
|
2928
3090
|
}
|
|
2929
|
-
class
|
|
3091
|
+
class S {
|
|
2930
3092
|
constructor(A = null, e = {}) {
|
|
2931
3093
|
/** The element to capture content from (optional for standalone mode) */
|
|
2932
|
-
|
|
3094
|
+
a(this, "captureSource");
|
|
2933
3095
|
/** Our WebGL overlay canvas manager */
|
|
2934
|
-
|
|
3096
|
+
a(this, "textmodeCanvas");
|
|
2935
3097
|
/** Core WebGL renderer */
|
|
2936
|
-
|
|
2937
|
-
|
|
2938
|
-
|
|
2939
|
-
|
|
2940
|
-
|
|
3098
|
+
a(this, "_renderer");
|
|
3099
|
+
a(this, "_canvasFramebuffer");
|
|
3100
|
+
a(this, "_font");
|
|
3101
|
+
a(this, "_grid");
|
|
3102
|
+
a(this, "resizeObserver");
|
|
2941
3103
|
// Auto-rendering properties
|
|
2942
|
-
|
|
2943
|
-
|
|
2944
|
-
|
|
2945
|
-
|
|
2946
|
-
|
|
2947
|
-
|
|
2948
|
-
|
|
2949
|
-
|
|
3104
|
+
a(this, "_mode");
|
|
3105
|
+
a(this, "_frameRateLimit");
|
|
3106
|
+
a(this, "animationFrameId", null);
|
|
3107
|
+
a(this, "lastFrameTime", 0);
|
|
3108
|
+
a(this, "frameInterval");
|
|
3109
|
+
a(this, "_frameRate", 0);
|
|
3110
|
+
a(this, "lastRenderTime", 0);
|
|
3111
|
+
a(this, "_frameCount", 0);
|
|
2950
3112
|
// Frame rate measurement smoothing
|
|
2951
|
-
|
|
2952
|
-
|
|
2953
|
-
|
|
3113
|
+
a(this, "frameTimeHistory", []);
|
|
3114
|
+
a(this, "frameTimeHistorySize", 10);
|
|
3115
|
+
a(this, "_pipeline");
|
|
2954
3116
|
// Standalone canvas properties
|
|
2955
|
-
|
|
2956
|
-
|
|
3117
|
+
a(this, "_standalone", !1);
|
|
3118
|
+
a(this, "_drawCallback", () => {
|
|
2957
3119
|
});
|
|
2958
|
-
|
|
3120
|
+
a(this, "_resizedCallback", () => {
|
|
2959
3121
|
});
|
|
2960
3122
|
this.captureSource = A, this._standalone = A === null, this._mode = e.renderMode ?? "auto", this._frameRateLimit = e.frameRate ?? 60, this.frameInterval = 1e3 / this._frameRateLimit;
|
|
2961
3123
|
}
|
|
@@ -2966,12 +3128,12 @@ class T {
|
|
|
2966
3128
|
* @ignore
|
|
2967
3129
|
*/
|
|
2968
3130
|
static async create(A = null, e = {}) {
|
|
2969
|
-
const t = new
|
|
2970
|
-
t.textmodeCanvas = new
|
|
2971
|
-
let i,
|
|
2972
|
-
t._standalone ? (i = e.width || 800,
|
|
2973
|
-
const
|
|
2974
|
-
return t._grid = new
|
|
3131
|
+
const t = new S(A, e), r = t._standalone ? e : void 0;
|
|
3132
|
+
t.textmodeCanvas = new mA(t.captureSource, t._standalone, r), t._renderer = new lA(t.textmodeCanvas.getWebGLContext());
|
|
3133
|
+
let i, s;
|
|
3134
|
+
t._standalone ? (i = e.width || 800, s = e.height || 600) : (i = t.textmodeCanvas.width || 800, s = t.textmodeCanvas.height || 600), t._canvasFramebuffer = t._renderer.createFramebuffer(i, s), t._font = new fA(t._renderer, e.fontSize ?? 16), await t._font.initialize(e.fontSource);
|
|
3135
|
+
const o = t._font.maxGlyphDimensions;
|
|
3136
|
+
return t._grid = new DA(t.textmodeCanvas.canvas, o.width, o.height), t._pipeline = new FA(t._renderer, t._font, t._grid), t.setupEventListeners(), t.startAutoRendering(), t;
|
|
2975
3137
|
}
|
|
2976
3138
|
setupEventListeners() {
|
|
2977
3139
|
window.addEventListener("resize", () => {
|
|
@@ -3019,7 +3181,7 @@ class T {
|
|
|
3019
3181
|
* ```
|
|
3020
3182
|
*/
|
|
3021
3183
|
toString(A = {}) {
|
|
3022
|
-
return new
|
|
3184
|
+
return new $().generateTXT(this, A);
|
|
3023
3185
|
}
|
|
3024
3186
|
/**
|
|
3025
3187
|
* Export the current textmode rendering to a TXT file.
|
|
@@ -3044,7 +3206,7 @@ class T {
|
|
|
3044
3206
|
* ```
|
|
3045
3207
|
*/
|
|
3046
3208
|
saveStrings(A = {}) {
|
|
3047
|
-
new
|
|
3209
|
+
new $().saveTXT(this, A);
|
|
3048
3210
|
}
|
|
3049
3211
|
/**
|
|
3050
3212
|
* Generate the current textmode rendering as an SVG string.
|
|
@@ -3073,7 +3235,7 @@ class T {
|
|
|
3073
3235
|
* ```
|
|
3074
3236
|
*/
|
|
3075
3237
|
toSVG(A = {}) {
|
|
3076
|
-
return new
|
|
3238
|
+
return new W().generateSVG(this, A);
|
|
3077
3239
|
}
|
|
3078
3240
|
/**
|
|
3079
3241
|
* Export the current textmode rendering to an SVG file.
|
|
@@ -3097,7 +3259,7 @@ class T {
|
|
|
3097
3259
|
* ```
|
|
3098
3260
|
*/
|
|
3099
3261
|
saveSVG(A = {}) {
|
|
3100
|
-
new
|
|
3262
|
+
new W().saveSVG(this, A);
|
|
3101
3263
|
}
|
|
3102
3264
|
/**
|
|
3103
3265
|
* Export the current textmode rendering to an image file.
|
|
@@ -3127,8 +3289,8 @@ class T {
|
|
|
3127
3289
|
* });
|
|
3128
3290
|
* ```
|
|
3129
3291
|
*/
|
|
3130
|
-
async saveCanvas(A, e, t = {}) {
|
|
3131
|
-
await new
|
|
3292
|
+
async saveCanvas(A, e = "png", t = {}) {
|
|
3293
|
+
await new OA().saveImage(this.textmodeCanvas, {
|
|
3132
3294
|
...t,
|
|
3133
3295
|
filename: A,
|
|
3134
3296
|
format: e
|
|
@@ -3198,7 +3360,7 @@ class T {
|
|
|
3198
3360
|
* ```
|
|
3199
3361
|
*/
|
|
3200
3362
|
render() {
|
|
3201
|
-
this.measureFrameRate(), this._frameCount++, this._standalone
|
|
3363
|
+
this.measureFrameRate(), this._frameCount++, this._standalone || this._canvasFramebuffer.update(this.captureSource), this._canvasFramebuffer.begin(), this._drawCallback(), this._renderer.reset(), this._canvasFramebuffer.end(), this._pipeline.render(this._canvasFramebuffer), this._pipeline.hasEnabledConverters() ? (this._renderer.background(0), this._renderer.image(this._pipeline.texture, this._grid.offsetX, this._grid.offsetY, this._pipeline.texture.width, this._pipeline.texture.height)) : (this._renderer.clear(), this._renderer.image(this._canvasFramebuffer, this._grid.offsetX, this._grid.offsetY, this._canvasFramebuffer.width, this._canvasFramebuffer.height));
|
|
3202
3364
|
}
|
|
3203
3365
|
resize() {
|
|
3204
3366
|
this.textmodeCanvas.resize(), this._canvasFramebuffer.resize(this.textmodeCanvas.width, this.textmodeCanvas.height), this._grid.resize(), this._pipeline.resize(), this._renderer.resetViewport(), this._mode !== "manual" && this.render();
|
|
@@ -3260,11 +3422,7 @@ class T {
|
|
|
3260
3422
|
* ```
|
|
3261
3423
|
*/
|
|
3262
3424
|
renderMode(A) {
|
|
3263
|
-
|
|
3264
|
-
if (A === void 0)
|
|
3265
|
-
return this._mode;
|
|
3266
|
-
this.stopAutoRendering(), this._mode = A, A === "auto" && this.startAutoRendering();
|
|
3267
|
-
}
|
|
3425
|
+
this._mode !== A && (this.stopAutoRendering(), this._mode = A, A === "auto" && this.startAutoRendering());
|
|
3268
3426
|
}
|
|
3269
3427
|
/**
|
|
3270
3428
|
* Set the maximum frame rate for auto rendering. If called without arguments, returns the current measured frame rate.
|
|
@@ -3304,7 +3462,7 @@ class T {
|
|
|
3304
3462
|
* ```
|
|
3305
3463
|
*/
|
|
3306
3464
|
fontSize(A) {
|
|
3307
|
-
|
|
3465
|
+
C.validate(
|
|
3308
3466
|
typeof A == "number" && A > 0,
|
|
3309
3467
|
"Font size must be a positive number greater than 0.",
|
|
3310
3468
|
{ method: "fontSize", providedValue: A }
|
|
@@ -3437,6 +3595,240 @@ class T {
|
|
|
3437
3595
|
fill(A, e, t, r) {
|
|
3438
3596
|
this._renderer.fill(A, e, t, r);
|
|
3439
3597
|
}
|
|
3598
|
+
/**
|
|
3599
|
+
* Sets the stroke color for subsequent rendering operations
|
|
3600
|
+
* @param r Red component (0-255)
|
|
3601
|
+
* @param g Green component (0-255, optional)
|
|
3602
|
+
* @param b Blue component (0-255, optional)
|
|
3603
|
+
* @param a Alpha component (0-255, optional)
|
|
3604
|
+
*
|
|
3605
|
+
* @example
|
|
3606
|
+
* ```javascript
|
|
3607
|
+
* const t = await textmode.create({
|
|
3608
|
+
* width: 800,
|
|
3609
|
+
* height: 600,
|
|
3610
|
+
* })
|
|
3611
|
+
*
|
|
3612
|
+
* t.draw(() => {
|
|
3613
|
+
* // Set the background color to black
|
|
3614
|
+
* t.background(0);
|
|
3615
|
+
*
|
|
3616
|
+
* // Set stroke color to red and stroke weight to 4 pixels
|
|
3617
|
+
* t.stroke(255, 0, 0);
|
|
3618
|
+
* t.strokeWeight(4);
|
|
3619
|
+
*
|
|
3620
|
+
* // Draw a rectangle with red stroke
|
|
3621
|
+
* t.rect(100, 100, 200, 150);
|
|
3622
|
+
*
|
|
3623
|
+
* // Rectangle with both fill and stroke
|
|
3624
|
+
* t.fill(0, 255, 0);
|
|
3625
|
+
* t.stroke(0, 0, 255);
|
|
3626
|
+
* t.strokeWeight(2);
|
|
3627
|
+
* t.rect(350, 100, 200, 150);
|
|
3628
|
+
* });
|
|
3629
|
+
* ```
|
|
3630
|
+
*/
|
|
3631
|
+
stroke(A, e, t, r) {
|
|
3632
|
+
this._renderer.stroke(A, e, t, r);
|
|
3633
|
+
}
|
|
3634
|
+
/**
|
|
3635
|
+
* Sets the stroke weight (thickness) for subsequent stroke operations
|
|
3636
|
+
* @param weight The stroke thickness in pixels
|
|
3637
|
+
*
|
|
3638
|
+
* @example
|
|
3639
|
+
* ```javascript
|
|
3640
|
+
* const t = await textmode.create({
|
|
3641
|
+
* width: 800,
|
|
3642
|
+
* height: 600,
|
|
3643
|
+
* })
|
|
3644
|
+
*
|
|
3645
|
+
* t.draw(() => {
|
|
3646
|
+
* t.background(0);
|
|
3647
|
+
*
|
|
3648
|
+
* // Thin stroke
|
|
3649
|
+
* t.stroke(255);
|
|
3650
|
+
* t.strokeWeight(1);
|
|
3651
|
+
* t.rect(50, 50, 100, 100);
|
|
3652
|
+
*
|
|
3653
|
+
* // Thick stroke
|
|
3654
|
+
* t.strokeWeight(8);
|
|
3655
|
+
* t.rect(200, 50, 100, 100);
|
|
3656
|
+
* });
|
|
3657
|
+
* ```
|
|
3658
|
+
*/
|
|
3659
|
+
strokeWeight(A) {
|
|
3660
|
+
this._renderer.strokeWeight(A);
|
|
3661
|
+
}
|
|
3662
|
+
/**
|
|
3663
|
+
* Disables stroke rendering for subsequent operations
|
|
3664
|
+
*
|
|
3665
|
+
* @example
|
|
3666
|
+
* ```javascript
|
|
3667
|
+
* const t = await textmode.create({
|
|
3668
|
+
* width: 800,
|
|
3669
|
+
* height: 600,
|
|
3670
|
+
* })
|
|
3671
|
+
*
|
|
3672
|
+
* t.draw(() => {
|
|
3673
|
+
* t.background(0);
|
|
3674
|
+
*
|
|
3675
|
+
* // Rectangle with stroke
|
|
3676
|
+
* t.fill(255, 0, 0);
|
|
3677
|
+
* t.stroke(0, 255, 0);
|
|
3678
|
+
* t.strokeWeight(4);
|
|
3679
|
+
* t.rect(100, 100, 150, 100);
|
|
3680
|
+
*
|
|
3681
|
+
* // Rectangle without stroke (fill only)
|
|
3682
|
+
* t.noStroke();
|
|
3683
|
+
* t.rect(300, 100, 150, 100);
|
|
3684
|
+
* });
|
|
3685
|
+
* ```
|
|
3686
|
+
*/
|
|
3687
|
+
noStroke() {
|
|
3688
|
+
this._renderer.noStroke();
|
|
3689
|
+
}
|
|
3690
|
+
/**
|
|
3691
|
+
* Disables fill rendering for subsequent operations
|
|
3692
|
+
*
|
|
3693
|
+
* @example
|
|
3694
|
+
* ```javascript
|
|
3695
|
+
* const t = await textmode.create({
|
|
3696
|
+
* width: 800,
|
|
3697
|
+
* height: 600,
|
|
3698
|
+
* })
|
|
3699
|
+
*
|
|
3700
|
+
* t.draw(() => {
|
|
3701
|
+
* t.background(0);
|
|
3702
|
+
*
|
|
3703
|
+
* // Rectangle with fill
|
|
3704
|
+
* t.fill(255, 0, 0);
|
|
3705
|
+
* t.stroke(0, 255, 0);
|
|
3706
|
+
* t.strokeWeight(4);
|
|
3707
|
+
* t.rect(100, 100, 150, 100);
|
|
3708
|
+
*
|
|
3709
|
+
* // Rectangle without fill (stroke only)
|
|
3710
|
+
* t.noFill();
|
|
3711
|
+
* t.rect(300, 100, 150, 100);
|
|
3712
|
+
* });
|
|
3713
|
+
* ```
|
|
3714
|
+
*/
|
|
3715
|
+
noFill() {
|
|
3716
|
+
this._renderer.noFill();
|
|
3717
|
+
}
|
|
3718
|
+
/**
|
|
3719
|
+
* Sets the rotation angle for subsequent rendering operations
|
|
3720
|
+
* @param degrees The rotation angle in degrees
|
|
3721
|
+
*
|
|
3722
|
+
* @example
|
|
3723
|
+
* ```javascript
|
|
3724
|
+
* const t = await textmode.create({
|
|
3725
|
+
* width: 800,
|
|
3726
|
+
* height: 600,
|
|
3727
|
+
* })
|
|
3728
|
+
*
|
|
3729
|
+
* t.draw(() => {
|
|
3730
|
+
* t.background(0);
|
|
3731
|
+
*
|
|
3732
|
+
* // Normal rectangle
|
|
3733
|
+
* t.fill(255, 0, 0);
|
|
3734
|
+
* t.rect(100, 100, 150, 100);
|
|
3735
|
+
*
|
|
3736
|
+
* // Rotated rectangle
|
|
3737
|
+
* t.push(); // Save current state
|
|
3738
|
+
* t.rotate(45); // Rotate 45 degrees
|
|
3739
|
+
* t.fill(0, 255, 0);
|
|
3740
|
+
* t.rect(300, 100, 150, 100);
|
|
3741
|
+
* t.pop(); // Restore state (no rotation)
|
|
3742
|
+
*
|
|
3743
|
+
* // Back to normal (no rotation)
|
|
3744
|
+
* t.fill(0, 0, 255);
|
|
3745
|
+
* t.rect(500, 100, 150, 100);
|
|
3746
|
+
* });
|
|
3747
|
+
* ```
|
|
3748
|
+
*/
|
|
3749
|
+
rotate(A) {
|
|
3750
|
+
this._renderer.rotate(A);
|
|
3751
|
+
}
|
|
3752
|
+
/**
|
|
3753
|
+
* Save the current rendering state (fill, stroke, etc.) to the state stack.
|
|
3754
|
+
* Use with {@link pop} to isolate style changes within a block.
|
|
3755
|
+
*
|
|
3756
|
+
* @example
|
|
3757
|
+
* ```javascript
|
|
3758
|
+
* const t = await textmode.create({
|
|
3759
|
+
* width: 800,
|
|
3760
|
+
* height: 600,
|
|
3761
|
+
* })
|
|
3762
|
+
*
|
|
3763
|
+
* t.draw(() => {
|
|
3764
|
+
* t.background(0);
|
|
3765
|
+
*
|
|
3766
|
+
* // Set initial styles
|
|
3767
|
+
* t.fill(255, 0, 0); // Red fill
|
|
3768
|
+
* t.stroke(0, 255, 0); // Green stroke
|
|
3769
|
+
* t.strokeWeight(4); // Thick stroke
|
|
3770
|
+
*
|
|
3771
|
+
* t.push(); // Save current state
|
|
3772
|
+
*
|
|
3773
|
+
* // Change styles temporarily
|
|
3774
|
+
* t.fill(0, 0, 255); // Blue fill
|
|
3775
|
+
* t.stroke(255, 255, 0); // Yellow stroke
|
|
3776
|
+
* t.strokeWeight(2); // Thin stroke
|
|
3777
|
+
* t.rect(100, 100, 150, 100);
|
|
3778
|
+
*
|
|
3779
|
+
* t.pop(); // Restore previous state
|
|
3780
|
+
*
|
|
3781
|
+
* // Back to red fill, green stroke, thick stroke
|
|
3782
|
+
* t.rect(300, 100, 150, 100);
|
|
3783
|
+
* });
|
|
3784
|
+
* ```
|
|
3785
|
+
*/
|
|
3786
|
+
push() {
|
|
3787
|
+
this._renderer.push();
|
|
3788
|
+
}
|
|
3789
|
+
/**
|
|
3790
|
+
* Restore the most recently saved rendering state from the state stack.
|
|
3791
|
+
* Use with {@link push} to isolate style changes within a block.
|
|
3792
|
+
*
|
|
3793
|
+
* @example
|
|
3794
|
+
* ```javascript
|
|
3795
|
+
* const t = await textmode.create({
|
|
3796
|
+
* width: 800,
|
|
3797
|
+
* height: 600,
|
|
3798
|
+
* })
|
|
3799
|
+
*
|
|
3800
|
+
* t.draw(() => {
|
|
3801
|
+
* t.background(0);
|
|
3802
|
+
*
|
|
3803
|
+
* // Default styles
|
|
3804
|
+
* t.fill(255); // White fill
|
|
3805
|
+
* t.stroke(0); // Black stroke
|
|
3806
|
+
* t.strokeWeight(1); // Thin stroke
|
|
3807
|
+
*
|
|
3808
|
+
* t.push(); // Save current state
|
|
3809
|
+
*
|
|
3810
|
+
* // Temporary style changes
|
|
3811
|
+
* t.fill(255, 0, 0); // Red fill
|
|
3812
|
+
* t.strokeWeight(8); // Thick stroke
|
|
3813
|
+
* t.rect(50, 50, 100, 100);
|
|
3814
|
+
*
|
|
3815
|
+
* t.push(); // Save red style state
|
|
3816
|
+
*
|
|
3817
|
+
* t.fill(0, 255, 0); // Green fill
|
|
3818
|
+
* t.noStroke(); // No stroke
|
|
3819
|
+
* t.rect(200, 50, 100, 100);
|
|
3820
|
+
*
|
|
3821
|
+
* t.pop(); // Back to red fill, thick stroke
|
|
3822
|
+
* t.rect(350, 50, 100, 100);
|
|
3823
|
+
*
|
|
3824
|
+
* t.pop(); // Back to white fill, black stroke, thin stroke
|
|
3825
|
+
* t.rect(500, 50, 100, 100);
|
|
3826
|
+
* });
|
|
3827
|
+
* ```
|
|
3828
|
+
*/
|
|
3829
|
+
pop() {
|
|
3830
|
+
this._renderer.pop();
|
|
3831
|
+
}
|
|
3440
3832
|
/**
|
|
3441
3833
|
* Draw a rectangle with the current shader or fill color.
|
|
3442
3834
|
* @param x X-coordinate of the rectangle
|
|
@@ -3475,6 +3867,52 @@ class T {
|
|
|
3475
3867
|
rect(A, e, t = 1, r = 1) {
|
|
3476
3868
|
this._renderer.rect(A, e, t, r);
|
|
3477
3869
|
}
|
|
3870
|
+
/**
|
|
3871
|
+
* Draw a line from point (x1, y1) to point (x2, y2) with the current stroke settings.
|
|
3872
|
+
* Lines respect stroke color, stroke weight, and rotation, but ignore fill properties.
|
|
3873
|
+
* @param x1 X-coordinate of the line start point
|
|
3874
|
+
* @param y1 Y-coordinate of the line start point
|
|
3875
|
+
* @param x2 X-coordinate of the line end point
|
|
3876
|
+
* @param y2 Y-coordinate of the line end point
|
|
3877
|
+
*
|
|
3878
|
+
* @example
|
|
3879
|
+
* ```javascript
|
|
3880
|
+
* const t = await textmode.create({
|
|
3881
|
+
* width: 800,
|
|
3882
|
+
* height: 600,
|
|
3883
|
+
* })
|
|
3884
|
+
*
|
|
3885
|
+
* t.draw(() => {
|
|
3886
|
+
* // Set the background color to black
|
|
3887
|
+
* t.background(0);
|
|
3888
|
+
*
|
|
3889
|
+
* // Draw a simple line
|
|
3890
|
+
* t.stroke(255, 0, 0); // Red stroke
|
|
3891
|
+
* t.strokeWeight(2); // 2px thick
|
|
3892
|
+
* t.line(100, 100, 300, 200);
|
|
3893
|
+
*
|
|
3894
|
+
* // Draw an animated rotating line
|
|
3895
|
+
* t.push();
|
|
3896
|
+
* t.stroke(0, 255, 0); // Green stroke
|
|
3897
|
+
* t.strokeWeight(4); // 4px thick
|
|
3898
|
+
* t.rotate(t.frameCount * 2); // Rotate based on frame count
|
|
3899
|
+
* t.line(400, 300, 600, 300);
|
|
3900
|
+
* t.pop();
|
|
3901
|
+
*
|
|
3902
|
+
* // Draw a thick yellow line
|
|
3903
|
+
* t.stroke(255, 255, 0); // Yellow stroke
|
|
3904
|
+
* t.strokeWeight(8); // 8px thick
|
|
3905
|
+
* t.line(200, 400, 400, 500);
|
|
3906
|
+
*
|
|
3907
|
+
* // Line with no stroke won't be visible
|
|
3908
|
+
* t.noStroke();
|
|
3909
|
+
* t.line(500, 100, 700, 200); // This won't render
|
|
3910
|
+
* });
|
|
3911
|
+
* ```
|
|
3912
|
+
*/
|
|
3913
|
+
line(A, e, t, r) {
|
|
3914
|
+
this._renderer.line(A, e, t, r);
|
|
3915
|
+
}
|
|
3478
3916
|
/**
|
|
3479
3917
|
* Set the background color for the canvas.
|
|
3480
3918
|
* @param r Red component (0-255)
|
|
@@ -3566,7 +4004,7 @@ class T {
|
|
|
3566
4004
|
return this.textmodeCanvas.height;
|
|
3567
4005
|
}
|
|
3568
4006
|
}
|
|
3569
|
-
class
|
|
4007
|
+
class X {
|
|
3570
4008
|
/**
|
|
3571
4009
|
* Create a {@link Textmodifier} instance for textmode rendering.
|
|
3572
4010
|
*
|
|
@@ -3614,10 +4052,10 @@ class Y {
|
|
|
3614
4052
|
*/
|
|
3615
4053
|
static async create(A, e = {}) {
|
|
3616
4054
|
if (A instanceof HTMLCanvasElement || A instanceof HTMLVideoElement)
|
|
3617
|
-
return
|
|
4055
|
+
return S.create(A, e);
|
|
3618
4056
|
{
|
|
3619
4057
|
const t = A || {};
|
|
3620
|
-
return
|
|
4058
|
+
return S.create(null, t);
|
|
3621
4059
|
}
|
|
3622
4060
|
}
|
|
3623
4061
|
/**
|
|
@@ -3631,7 +4069,7 @@ class Y {
|
|
|
3631
4069
|
* ```
|
|
3632
4070
|
*/
|
|
3633
4071
|
static setErrorLevel(A) {
|
|
3634
|
-
|
|
4072
|
+
C.setGlobalLevel(A);
|
|
3635
4073
|
}
|
|
3636
4074
|
/**
|
|
3637
4075
|
* Returns the current version of the `textmode.js` library.
|
|
@@ -3642,26 +4080,27 @@ class Y {
|
|
|
3642
4080
|
* ```
|
|
3643
4081
|
*/
|
|
3644
4082
|
static get version() {
|
|
3645
|
-
return "0.1.2
|
|
4083
|
+
return "0.1.2";
|
|
3646
4084
|
}
|
|
3647
4085
|
constructor() {
|
|
3648
4086
|
throw new Error("Textmode is a static class and cannot be instantiated.");
|
|
3649
4087
|
}
|
|
3650
4088
|
}
|
|
3651
|
-
const
|
|
4089
|
+
const LA = /* @__PURE__ */ Object.freeze(/* @__PURE__ */ Object.defineProperty({
|
|
3652
4090
|
__proto__: null
|
|
3653
|
-
}, Symbol.toStringTag, { value: "Module" })),
|
|
4091
|
+
}, Symbol.toStringTag, { value: "Module" })), XA = X.create, NA = X.setErrorLevel, WA = X.version;
|
|
3654
4092
|
export {
|
|
3655
|
-
|
|
3656
|
-
|
|
3657
|
-
|
|
3658
|
-
|
|
3659
|
-
|
|
3660
|
-
|
|
3661
|
-
|
|
3662
|
-
|
|
3663
|
-
|
|
3664
|
-
|
|
3665
|
-
|
|
3666
|
-
|
|
4093
|
+
mA as TextmodeCanvas,
|
|
4094
|
+
FA as TextmodeConversionPipeline,
|
|
4095
|
+
oA as TextmodeErrorLevel,
|
|
4096
|
+
fA as TextmodeFont,
|
|
4097
|
+
DA as TextmodeGrid,
|
|
4098
|
+
S as Textmodifier,
|
|
4099
|
+
HA as converters,
|
|
4100
|
+
XA as create,
|
|
4101
|
+
X as default,
|
|
4102
|
+
LA as export,
|
|
4103
|
+
NA as setErrorLevel,
|
|
4104
|
+
X as textmode,
|
|
4105
|
+
WA as version
|
|
3667
4106
|
};
|