textmode.js 0.0.5 → 0.0.6
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/dist/textmode.esm.js +624 -394
- package/dist/textmode.umd.js +4 -4
- package/dist/types/ColorPalette.d.ts +2 -2
- package/dist/types/Textmode.d.ts +2 -2
- package/dist/types/index.d.ts +9 -2
- package/dist/types/rendering/core/AbstractFramebuffer.d.ts +1 -0
- package/dist/types/rendering/core/AbstractGeometry.d.ts +1 -0
- package/dist/types/rendering/core/AbstractShader.d.ts +1 -0
- package/dist/types/rendering/core/AbstractTexture.d.ts +1 -0
- package/dist/types/rendering/core/GraphicsContext.d.ts +1 -0
- package/dist/types/rendering/{Framebuffer.d.ts → webgl/Framebuffer.d.ts} +4 -0
- package/dist/types/textmode/ConversionPipeline.d.ts +3 -3
- package/dist/types/textmode/Grid.d.ts +13 -32
- package/dist/types/textmode/Textmodifier.d.ts +2 -2
- package/dist/types/textmode/converters/BrightnessConverter.d.ts +13 -3
- package/dist/types/textmode/converters/Converter.d.ts +16 -4
- package/dist/types/textmode/converters/FeatureConverter.d.ts +54 -5
- package/dist/types/textmode/font/CharacterColorMapper.d.ts +33 -0
- package/dist/types/textmode/font/CharacterExtractor.d.ts +45 -0
- package/dist/types/textmode/font/MetricsCalculator.d.ts +22 -0
- package/dist/types/textmode/{Font.d.ts → font/TextmodeFont.d.ts} +24 -39
- package/dist/types/textmode/font/TextureAtlas.d.ts +53 -0
- package/dist/types/textmode/font/index.d.ts +6 -0
- package/dist/types/textmode/font/types.d.ts +42 -0
- package/package.json +1 -1
- /package/dist/types/rendering/{Renderer.d.ts → webgl/Renderer.d.ts} +0 -0
- /package/dist/types/rendering/{Shader.d.ts → webgl/Shader.d.ts} +0 -0
- /package/dist/types/rendering/{geometries → webgl/geometries}/Rectangle.d.ts +0 -0
package/dist/textmode.esm.js
CHANGED
|
@@ -1,12 +1,12 @@
|
|
|
1
1
|
var F = Object.defineProperty;
|
|
2
|
-
var y = (
|
|
3
|
-
var
|
|
4
|
-
class
|
|
2
|
+
var y = (s, e, A) => e in s ? F(s, e, { enumerable: !0, configurable: !0, writable: !0, value: A }) : s[e] = A;
|
|
3
|
+
var Q = (s, e, A) => y(s, typeof e != "symbol" ? e + "" : e, A);
|
|
4
|
+
class l extends Error {
|
|
5
5
|
constructor(A, t, r = {}) {
|
|
6
|
-
const B =
|
|
6
|
+
const B = l.createFormattedMessage(A, r);
|
|
7
7
|
super(B);
|
|
8
|
-
|
|
9
|
-
|
|
8
|
+
Q(this, "originalError");
|
|
9
|
+
Q(this, "context");
|
|
10
10
|
this.name = "TextmodeError", this.originalError = t, this.context = r;
|
|
11
11
|
}
|
|
12
12
|
/**
|
|
@@ -18,8 +18,8 @@ class C extends Error {
|
|
|
18
18
|
r += `
|
|
19
19
|
|
|
20
20
|
📋 Context:`;
|
|
21
|
-
for (const [B,
|
|
22
|
-
const g =
|
|
21
|
+
for (const [B, E] of Object.entries(t)) {
|
|
22
|
+
const g = l.formatValue(E);
|
|
23
23
|
r += `
|
|
24
24
|
- ${B}: ${g}`;
|
|
25
25
|
}
|
|
@@ -38,24 +38,24 @@ class C extends Error {
|
|
|
38
38
|
if (typeof A == "string") return `"${A}"`;
|
|
39
39
|
if (typeof A == "number" || typeof A == "boolean") return String(A);
|
|
40
40
|
if (Array.isArray(A))
|
|
41
|
-
return A.length === 0 ? "[]" : A.length <= 5 ? `[${A.map((t) =>
|
|
41
|
+
return A.length === 0 ? "[]" : A.length <= 5 ? `[${A.map((t) => l.formatValue(t)).join(", ")}]` : `[${A.slice(0, 3).map((t) => l.formatValue(t)).join(", ")}, ... +${A.length - 3} more]`;
|
|
42
42
|
if (typeof A == "object") {
|
|
43
43
|
const t = Object.keys(A);
|
|
44
|
-
return t.length === 0 ? "{}" : t.length <= 3 ? `{ ${t.map((
|
|
44
|
+
return t.length === 0 ? "{}" : t.length <= 3 ? `{ ${t.map((E) => `${E}: ${l.formatValue(A[E])}`).join(", ")} }` : `{ ${t.slice(0, 2).map((B) => `${B}: ${l.formatValue(A[B])}`).join(", ")}, ... +${t.length - 2} more }`;
|
|
45
45
|
}
|
|
46
46
|
return String(A);
|
|
47
47
|
}
|
|
48
48
|
}
|
|
49
|
-
var
|
|
50
|
-
const
|
|
49
|
+
var T = /* @__PURE__ */ ((s) => (s[s.SILENT = 0] = "SILENT", s[s.WARNING = 1] = "WARNING", s[s.ERROR = 2] = "ERROR", s[s.THROW = 3] = "THROW", s))(T || {});
|
|
50
|
+
const D = class D {
|
|
51
51
|
constructor() {
|
|
52
|
-
|
|
52
|
+
Q(this, "_options", {
|
|
53
53
|
globalLevel: 3
|
|
54
54
|
/* THROW */
|
|
55
55
|
});
|
|
56
56
|
}
|
|
57
57
|
static getInstance() {
|
|
58
|
-
return
|
|
58
|
+
return D._instance || (D._instance = new D()), D._instance;
|
|
59
59
|
}
|
|
60
60
|
/**
|
|
61
61
|
* Handle an error based on the configured settings
|
|
@@ -71,15 +71,15 @@ const l = class l {
|
|
|
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(l.createFormattedMessage(e, A)), 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(l.createFormattedMessage(e, A)), console.groupEnd(), !1;
|
|
80
80
|
case 3:
|
|
81
81
|
default:
|
|
82
|
-
const B = new
|
|
82
|
+
const B = new l(e, t, A);
|
|
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 l = class l {
|
|
|
103
103
|
this._options.globalLevel = e;
|
|
104
104
|
}
|
|
105
105
|
};
|
|
106
|
-
|
|
107
|
-
let I =
|
|
108
|
-
const
|
|
106
|
+
Q(D, "_instance", null);
|
|
107
|
+
let I = D;
|
|
108
|
+
const C = I.getInstance();
|
|
109
109
|
class M {
|
|
110
110
|
constructor(e, A, t, r = {}) {
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
111
|
+
Q(this, "gl");
|
|
112
|
+
Q(this, "_framebuffer");
|
|
113
|
+
Q(this, "_texture");
|
|
114
|
+
Q(this, "_width");
|
|
115
|
+
Q(this, "_height");
|
|
116
|
+
Q(this, "options");
|
|
117
|
+
Q(this, "previousFramebuffer", null);
|
|
118
|
+
Q(this, "previousViewport", [0, 0, 0, 0]);
|
|
119
119
|
this.gl = e, this._width = A, this._height = t, this.options = {
|
|
120
120
|
filter: "nearest",
|
|
121
121
|
wrap: "clamp",
|
|
@@ -164,6 +164,22 @@ class M {
|
|
|
164
164
|
e
|
|
165
165
|
), this.gl.bindTexture(this.gl.TEXTURE_2D, null);
|
|
166
166
|
}
|
|
167
|
+
/**
|
|
168
|
+
* Update the framebuffer texture with pixel data
|
|
169
|
+
*/
|
|
170
|
+
updateWithPixelData(e, A, t) {
|
|
171
|
+
this.gl.bindTexture(this.gl.TEXTURE_2D, this._texture), this.gl.texImage2D(
|
|
172
|
+
this.gl.TEXTURE_2D,
|
|
173
|
+
0,
|
|
174
|
+
this.gl.RGBA,
|
|
175
|
+
A,
|
|
176
|
+
t,
|
|
177
|
+
0,
|
|
178
|
+
this.gl.RGBA,
|
|
179
|
+
this.gl.UNSIGNED_BYTE,
|
|
180
|
+
e
|
|
181
|
+
), this.gl.bindTexture(this.gl.TEXTURE_2D, null);
|
|
182
|
+
}
|
|
167
183
|
/**
|
|
168
184
|
* Resize the framebuffer
|
|
169
185
|
*/
|
|
@@ -219,22 +235,22 @@ class M {
|
|
|
219
235
|
return this._height;
|
|
220
236
|
}
|
|
221
237
|
}
|
|
222
|
-
class
|
|
238
|
+
class G {
|
|
223
239
|
constructor(e, A, t, r, B) {
|
|
224
240
|
/** The WebGL rendering context */
|
|
225
|
-
|
|
241
|
+
Q(this, "gl");
|
|
226
242
|
/** The buffer containing the rectangle vertices */
|
|
227
|
-
|
|
243
|
+
Q(this, "buffer");
|
|
228
244
|
/** The number of vertices in the rectangle */
|
|
229
|
-
|
|
245
|
+
Q(this, "numVertices");
|
|
230
246
|
this.gl = e;
|
|
231
|
-
const
|
|
247
|
+
const E = e.getParameter(e.VIEWPORT), g = E[2], i = E[3];
|
|
232
248
|
if (g <= 0 || i <= 0)
|
|
233
249
|
throw new Error(`Invalid viewport dimensions: ${g}x${i}`);
|
|
234
|
-
const
|
|
235
|
-
(
|
|
236
|
-
const
|
|
237
|
-
|
|
250
|
+
const o = A / g * 2 - 1, n = 1 - t / i * 2, a = (A + r) / g * 2 - 1, h = 1 - (t + B) / i * 2;
|
|
251
|
+
(o < -1 || o > 1 || a < -1 || a > 1 || n < -1 || n > 1 || h < -1 || h > 1) && console.warn(`Rectangle coordinates outside NDC range: x1=${o}, y1=${n}, x2=${a}, y2=${h}`);
|
|
252
|
+
const P = e.getParameter(e.FRAMEBUFFER_BINDING) !== null ? new Float32Array([
|
|
253
|
+
o,
|
|
238
254
|
h,
|
|
239
255
|
0,
|
|
240
256
|
0,
|
|
@@ -244,13 +260,13 @@ class U {
|
|
|
244
260
|
1,
|
|
245
261
|
0,
|
|
246
262
|
// bottom-right
|
|
247
|
-
s,
|
|
248
263
|
o,
|
|
264
|
+
n,
|
|
249
265
|
0,
|
|
250
266
|
1,
|
|
251
267
|
// top-left
|
|
252
|
-
s,
|
|
253
268
|
o,
|
|
269
|
+
n,
|
|
254
270
|
0,
|
|
255
271
|
1,
|
|
256
272
|
// top-left
|
|
@@ -260,12 +276,12 @@ class U {
|
|
|
260
276
|
0,
|
|
261
277
|
// bottom-right
|
|
262
278
|
a,
|
|
263
|
-
|
|
279
|
+
n,
|
|
264
280
|
1,
|
|
265
281
|
1
|
|
266
282
|
// top-right
|
|
267
283
|
]) : new Float32Array([
|
|
268
|
-
|
|
284
|
+
o,
|
|
269
285
|
h,
|
|
270
286
|
0,
|
|
271
287
|
1,
|
|
@@ -275,13 +291,13 @@ class U {
|
|
|
275
291
|
1,
|
|
276
292
|
1,
|
|
277
293
|
// bottom-right
|
|
278
|
-
s,
|
|
279
294
|
o,
|
|
295
|
+
n,
|
|
280
296
|
0,
|
|
281
297
|
0,
|
|
282
298
|
// top-left
|
|
283
|
-
s,
|
|
284
299
|
o,
|
|
300
|
+
n,
|
|
285
301
|
0,
|
|
286
302
|
0,
|
|
287
303
|
// top-left
|
|
@@ -291,12 +307,12 @@ class U {
|
|
|
291
307
|
1,
|
|
292
308
|
// bottom-right
|
|
293
309
|
a,
|
|
294
|
-
|
|
310
|
+
n,
|
|
295
311
|
1,
|
|
296
312
|
0
|
|
297
313
|
// top-right
|
|
298
314
|
]);
|
|
299
|
-
this.numVertices = 6, this.buffer = e.createBuffer(), e.bindBuffer(e.ARRAY_BUFFER, this.buffer), e.bufferData(e.ARRAY_BUFFER,
|
|
315
|
+
this.numVertices = 6, this.buffer = e.createBuffer(), e.bindBuffer(e.ARRAY_BUFFER, this.buffer), e.bufferData(e.ARRAY_BUFFER, P, e.STATIC_DRAW);
|
|
300
316
|
}
|
|
301
317
|
/**
|
|
302
318
|
* Draw the quad using attribute locations from the current shader
|
|
@@ -307,20 +323,20 @@ class U {
|
|
|
307
323
|
this.gl.enableVertexAttribArray(e), this.gl.vertexAttribPointer(e, 2, this.gl.FLOAT, !1, 16, 0), this.gl.enableVertexAttribArray(A), this.gl.vertexAttribPointer(A, 2, this.gl.FLOAT, !1, 16, 8), this.gl.drawArrays(this.gl.TRIANGLES, 0, this.numVertices), this.gl.disableVertexAttribArray(e), this.gl.disableVertexAttribArray(A);
|
|
308
324
|
}
|
|
309
325
|
}
|
|
310
|
-
class
|
|
326
|
+
class c {
|
|
311
327
|
constructor(e, A, t) {
|
|
312
|
-
|
|
313
|
-
|
|
314
|
-
|
|
315
|
-
|
|
316
|
-
|
|
328
|
+
Q(this, "gl");
|
|
329
|
+
Q(this, "program");
|
|
330
|
+
Q(this, "uniformLocations", /* @__PURE__ */ new Map());
|
|
331
|
+
Q(this, "attributeLocations", /* @__PURE__ */ new Map());
|
|
332
|
+
Q(this, "textureUnitCounter", 0);
|
|
317
333
|
this.gl = e, this.program = this.createProgram(A, t), this.cacheLocations();
|
|
318
334
|
}
|
|
319
335
|
createProgram(e, A) {
|
|
320
336
|
const t = this.createShader(this.gl.VERTEX_SHADER, e), r = this.createShader(this.gl.FRAGMENT_SHADER, A), B = this.gl.createProgram();
|
|
321
337
|
if (this.gl.attachShader(B, t), this.gl.attachShader(B, r), this.gl.linkProgram(B), !this.gl.getProgramParameter(B, this.gl.LINK_STATUS)) {
|
|
322
|
-
const
|
|
323
|
-
throw new Error(`Shader program link error: ${
|
|
338
|
+
const E = this.gl.getProgramInfoLog(B);
|
|
339
|
+
throw new Error(`Shader program link error: ${E}`);
|
|
324
340
|
}
|
|
325
341
|
return this.gl.deleteShader(t), this.gl.deleteShader(r), B;
|
|
326
342
|
}
|
|
@@ -394,16 +410,16 @@ class P {
|
|
|
394
410
|
this.textureUnitCounter = 0;
|
|
395
411
|
}
|
|
396
412
|
}
|
|
397
|
-
var u = "attribute vec2 a_position;attribute vec2 a_texCoord;varying vec2 v_uv;void main(){v_uv=a_texCoord;gl_Position=vec4(a_position,0.0,1.0);}",
|
|
413
|
+
var u = "attribute vec2 a_position;attribute vec2 a_texCoord;varying vec2 v_uv;void main(){v_uv=a_texCoord;gl_Position=vec4(a_position,0.0,1.0);}", U = "precision lowp float;uniform sampler2D u_texture;varying vec2 v_uv;void main(){gl_FragColor=texture2D(u_texture,v_uv);}";
|
|
398
414
|
class R {
|
|
399
415
|
constructor(e) {
|
|
400
|
-
|
|
401
|
-
|
|
402
|
-
|
|
403
|
-
this.gl = e, this.imageShader = new
|
|
416
|
+
Q(this, "gl");
|
|
417
|
+
Q(this, "imageShader");
|
|
418
|
+
Q(this, "currentShader", null);
|
|
419
|
+
this.gl = e, this.imageShader = new c(this.gl, u, U), this.setupDefaultState();
|
|
404
420
|
}
|
|
405
421
|
setupDefaultState() {
|
|
406
|
-
this.gl.enable(this.gl.BLEND), this.gl.blendFunc(this.gl.
|
|
422
|
+
this.gl.enable(this.gl.BLEND), this.gl.blendFunc(this.gl.ONE, this.gl.ONE_MINUS_SRC_ALPHA), this.gl.disable(this.gl.DEPTH_TEST), this.gl.disable(this.gl.CULL_FACE), this.gl.disable(this.gl.STENCIL_TEST), this.gl.disable(this.gl.SCISSOR_TEST), this.gl.disable(this.gl.DITHER), this.gl.depthFunc(this.gl.ALWAYS), this.gl.depthMask(!1);
|
|
407
423
|
}
|
|
408
424
|
/**
|
|
409
425
|
* Set the current shader (p5.js-like API)
|
|
@@ -412,7 +428,7 @@ class R {
|
|
|
412
428
|
this.currentShader = e, e.use();
|
|
413
429
|
}
|
|
414
430
|
createShader(e, A) {
|
|
415
|
-
return new
|
|
431
|
+
return new c(this.gl, e, A);
|
|
416
432
|
}
|
|
417
433
|
/**
|
|
418
434
|
* Set a uniform value for the current shader (p5.js-like API)
|
|
@@ -424,7 +440,7 @@ class R {
|
|
|
424
440
|
* Draw a rectangle with the current shader (p5.js-like API)
|
|
425
441
|
*/
|
|
426
442
|
rect(e, A, t, r) {
|
|
427
|
-
new
|
|
443
|
+
new G(this.gl, e, A, t, r).draw();
|
|
428
444
|
}
|
|
429
445
|
/**
|
|
430
446
|
* Create a new framebuffer
|
|
@@ -465,7 +481,7 @@ class R {
|
|
|
465
481
|
}
|
|
466
482
|
class Y {
|
|
467
483
|
constructor() {
|
|
468
|
-
|
|
484
|
+
Q(this, "bin");
|
|
469
485
|
this.bin = this.createBinaryReader();
|
|
470
486
|
}
|
|
471
487
|
/**
|
|
@@ -477,12 +493,12 @@ class Y {
|
|
|
477
493
|
if (this.bin.readASCII(A, t, 4) === "ttcf") {
|
|
478
494
|
const B = this.bin.readUint(A, t + 8);
|
|
479
495
|
t += 12;
|
|
480
|
-
const
|
|
496
|
+
const E = [];
|
|
481
497
|
for (let g = 0; g < B; g++) {
|
|
482
498
|
const i = this.bin.readUint(A, t);
|
|
483
|
-
t += 4,
|
|
499
|
+
t += 4, E.push(this.readFont(A, g, i));
|
|
484
500
|
}
|
|
485
|
-
return
|
|
501
|
+
return E;
|
|
486
502
|
} else
|
|
487
503
|
return [this.readFont(A, 0, 0)];
|
|
488
504
|
}
|
|
@@ -492,10 +508,10 @@ class Y {
|
|
|
492
508
|
findTable(e, A, t) {
|
|
493
509
|
const r = this.bin.readUshort(e, t + 4);
|
|
494
510
|
let B = t + 12;
|
|
495
|
-
for (let
|
|
496
|
-
const g = this.bin.readASCII(e, B, 4), i = this.bin.readUint(e, B + 8),
|
|
511
|
+
for (let E = 0; E < r; E++) {
|
|
512
|
+
const g = this.bin.readASCII(e, B, 4), i = this.bin.readUint(e, B + 8), o = this.bin.readUint(e, B + 12);
|
|
497
513
|
if (g === A)
|
|
498
|
-
return [i,
|
|
514
|
+
return [i, o];
|
|
499
515
|
B += 16;
|
|
500
516
|
}
|
|
501
517
|
return null;
|
|
@@ -508,13 +524,13 @@ class Y {
|
|
|
508
524
|
_data: e,
|
|
509
525
|
_index: A,
|
|
510
526
|
_offset: t
|
|
511
|
-
}, B = /* @__PURE__ */ new Map(),
|
|
512
|
-
for (const g of
|
|
527
|
+
}, B = /* @__PURE__ */ new Map(), E = ["cmap", "head", "hhea", "maxp", "hmtx"];
|
|
528
|
+
for (const g of E) {
|
|
513
529
|
const i = this.findTable(e, g, t);
|
|
514
530
|
if (i) {
|
|
515
|
-
const [
|
|
516
|
-
let a = B.get(
|
|
517
|
-
a || (a = this.parseTable(g, e,
|
|
531
|
+
const [o, n] = i;
|
|
532
|
+
let a = B.get(o);
|
|
533
|
+
a || (a = this.parseTable(g, e, o, n, r), B.set(o, a)), r[g] = a;
|
|
518
534
|
}
|
|
519
535
|
}
|
|
520
536
|
return r;
|
|
@@ -545,26 +561,26 @@ class Y {
|
|
|
545
561
|
const r = new Uint8Array(e.buffer, A, t);
|
|
546
562
|
let B = 0;
|
|
547
563
|
B += 2;
|
|
548
|
-
const
|
|
564
|
+
const E = this.bin.readUshort(r, B);
|
|
549
565
|
B += 2;
|
|
550
566
|
const g = {
|
|
551
567
|
tables: [],
|
|
552
568
|
ids: {},
|
|
553
569
|
off: A
|
|
554
570
|
}, i = /* @__PURE__ */ new Set();
|
|
555
|
-
for (let
|
|
556
|
-
const
|
|
571
|
+
for (let o = 0; o < E; o++) {
|
|
572
|
+
const n = this.bin.readUshort(r, B);
|
|
557
573
|
B += 2;
|
|
558
574
|
const a = this.bin.readUshort(r, B);
|
|
559
575
|
B += 2;
|
|
560
576
|
const h = this.bin.readUint(r, B);
|
|
561
577
|
B += 4;
|
|
562
|
-
const
|
|
578
|
+
const P = `p${n}e${a}`;
|
|
563
579
|
if (!i.has(h)) {
|
|
564
580
|
const x = this.bin.readUshort(r, h), v = this.parseCmapSubtable(r, h, x);
|
|
565
581
|
g.tables.push(v), i.add(h);
|
|
566
582
|
}
|
|
567
|
-
g.ids[
|
|
583
|
+
g.ids[P] = Array.from(i).indexOf(h);
|
|
568
584
|
}
|
|
569
585
|
return g;
|
|
570
586
|
}
|
|
@@ -593,8 +609,8 @@ class Y {
|
|
|
593
609
|
let r = A + 2;
|
|
594
610
|
const B = this.bin.readUshort(e, r);
|
|
595
611
|
r += 2, r += 2, t.map = [];
|
|
596
|
-
for (let
|
|
597
|
-
t.map.push(e[r +
|
|
612
|
+
for (let E = 0; E < B - 6; E++)
|
|
613
|
+
t.map.push(e[r + E]);
|
|
598
614
|
return t;
|
|
599
615
|
}
|
|
600
616
|
/**
|
|
@@ -603,15 +619,15 @@ class Y {
|
|
|
603
619
|
parseCmapFormat4(e, A, t) {
|
|
604
620
|
const r = A;
|
|
605
621
|
let B = A + 2;
|
|
606
|
-
const
|
|
622
|
+
const E = this.bin.readUshort(e, B);
|
|
607
623
|
B += 2, B += 2;
|
|
608
624
|
const g = this.bin.readUshort(e, B);
|
|
609
625
|
B += 2;
|
|
610
626
|
const i = g >>> 1;
|
|
611
627
|
t.searchRange = this.bin.readUshort(e, B), B += 2, t.entrySelector = this.bin.readUshort(e, B), B += 2, t.rangeShift = this.bin.readUshort(e, B), B += 2, t.endCount = this.bin.readUshorts(e, B, i), B += i * 2, B += 2, t.startCount = this.bin.readUshorts(e, B, i), B += i * 2, t.idDelta = [];
|
|
612
|
-
for (let
|
|
628
|
+
for (let o = 0; o < i; o++)
|
|
613
629
|
t.idDelta.push(this.bin.readShort(e, B)), B += 2;
|
|
614
|
-
return t.idRangeOffset = this.bin.readUshorts(e, B, i), B += i * 2, t.glyphIdArray = this.bin.readUshorts(e, B, r +
|
|
630
|
+
return t.idRangeOffset = this.bin.readUshorts(e, B, i), B += i * 2, t.glyphIdArray = this.bin.readUshorts(e, B, r + E - B >> 1), t;
|
|
615
631
|
}
|
|
616
632
|
/**
|
|
617
633
|
* Parse cmap format 6
|
|
@@ -621,7 +637,7 @@ class Y {
|
|
|
621
637
|
r += 2, r += 2, t.firstCode = this.bin.readUshort(e, r), r += 2;
|
|
622
638
|
const B = this.bin.readUshort(e, r);
|
|
623
639
|
r += 2, t.glyphIdArray = [];
|
|
624
|
-
for (let
|
|
640
|
+
for (let E = 0; E < B; E++)
|
|
625
641
|
t.glyphIdArray.push(this.bin.readUshort(e, r)), r += 2;
|
|
626
642
|
return t;
|
|
627
643
|
}
|
|
@@ -633,8 +649,8 @@ class Y {
|
|
|
633
649
|
r += 4, r += 4;
|
|
634
650
|
const B = this.bin.readUint(e, r) * 3;
|
|
635
651
|
r += 4, t.groups = new Uint32Array(B);
|
|
636
|
-
for (let
|
|
637
|
-
t.groups[
|
|
652
|
+
for (let E = 0; E < B; E += 3)
|
|
653
|
+
t.groups[E] = this.bin.readUint(e, r + (E << 2)), t.groups[E + 1] = this.bin.readUint(e, r + (E << 2) + 4), t.groups[E + 2] = this.bin.readUint(e, r + (E << 2) + 8);
|
|
638
654
|
return t;
|
|
639
655
|
}
|
|
640
656
|
/**
|
|
@@ -682,23 +698,23 @@ class Y {
|
|
|
682
698
|
"res3",
|
|
683
699
|
"metricDataFormat",
|
|
684
700
|
"numberOfHMetrics"
|
|
685
|
-
],
|
|
701
|
+
], E = {};
|
|
686
702
|
for (let g = 0; g < B.length; g++) {
|
|
687
|
-
const i = B[g],
|
|
688
|
-
|
|
703
|
+
const i = B[g], n = i === "advanceWidthMax" || i === "numberOfHMetrics" ? this.bin.readUshort : this.bin.readShort;
|
|
704
|
+
E[i] = n(e, r + g * 2);
|
|
689
705
|
}
|
|
690
|
-
return
|
|
706
|
+
return E;
|
|
691
707
|
}
|
|
692
708
|
/**
|
|
693
709
|
* Parse hmtx table
|
|
694
710
|
*/
|
|
695
711
|
parseHmtxTable(e, A, t, r) {
|
|
696
|
-
const B = r.maxp.numGlyphs,
|
|
697
|
-
let
|
|
698
|
-
for (let h = 0; h <
|
|
699
|
-
|
|
700
|
-
for (let h =
|
|
701
|
-
g.push(
|
|
712
|
+
const B = r.maxp.numGlyphs, E = r.hhea.numberOfHMetrics, g = [], i = [];
|
|
713
|
+
let o = A, n = 0, a = 0;
|
|
714
|
+
for (let h = 0; h < E; h++)
|
|
715
|
+
n = this.bin.readUshort(e, o), a = this.bin.readShort(e, o + 2), g.push(n), i.push(a), o += 4;
|
|
716
|
+
for (let h = E; h < B; h++)
|
|
717
|
+
g.push(n), i.push(a);
|
|
702
718
|
return { aWidth: g, lsBearing: i };
|
|
703
719
|
}
|
|
704
720
|
/**
|
|
@@ -729,141 +745,349 @@ class Y {
|
|
|
729
745
|
readShort: (t, r) => (A.uint16[0] = t[r] << 8 | t[r + 1], A.int16[0]),
|
|
730
746
|
readUshort: (t, r) => t[r] << 8 | t[r + 1],
|
|
731
747
|
readUshorts: (t, r, B) => {
|
|
732
|
-
const
|
|
748
|
+
const E = new Array(B);
|
|
733
749
|
for (let g = 0; g < B; g++)
|
|
734
|
-
|
|
735
|
-
return
|
|
750
|
+
E[g] = t[r + g * 2] << 8 | t[r + g * 2 + 1];
|
|
751
|
+
return E;
|
|
736
752
|
},
|
|
737
753
|
readUint: (t, r) => (A.uint8[3] = t[r], A.uint8[2] = t[r + 1], A.uint8[1] = t[r + 2], A.uint8[0] = t[r + 3], A.uint32[0]),
|
|
738
754
|
readUint64: (t, r) => {
|
|
739
|
-
const B = A.uint32[0] = t[r] << 24 | t[r + 1] << 16 | t[r + 2] << 8 | t[r + 3],
|
|
740
|
-
return B * 4294967296 +
|
|
755
|
+
const B = A.uint32[0] = t[r] << 24 | t[r + 1] << 16 | t[r + 2] << 8 | t[r + 3], E = A.uint32[0] = t[r + 4] << 24 | t[r + 5] << 16 | t[r + 6] << 8 | t[r + 7];
|
|
756
|
+
return B * 4294967296 + E;
|
|
741
757
|
},
|
|
742
758
|
readASCII: (t, r, B) => {
|
|
743
|
-
let
|
|
759
|
+
let E = "";
|
|
744
760
|
for (let g = 0; g < B; g++)
|
|
745
|
-
|
|
746
|
-
return
|
|
761
|
+
E += String.fromCharCode(t[r + g]);
|
|
762
|
+
return E;
|
|
747
763
|
},
|
|
748
764
|
t: A
|
|
749
765
|
};
|
|
750
766
|
}
|
|
751
767
|
}
|
|
752
|
-
const
|
|
753
|
-
parse: (
|
|
754
|
-
findTable: (
|
|
768
|
+
const w = new Y(), m = {
|
|
769
|
+
parse: (s) => w.parse(s),
|
|
770
|
+
findTable: (s, e, A) => w.findTable(s, e, A)
|
|
755
771
|
}, S = `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
|
|
756
772
|
`;
|
|
757
773
|
class O {
|
|
758
774
|
/**
|
|
759
|
-
*
|
|
775
|
+
* Extracts all available characters from a font's cmap tables.
|
|
776
|
+
* @param font The parsed font object from Typr
|
|
777
|
+
* @returns Array of unique character strings
|
|
778
|
+
*/
|
|
779
|
+
extractCharacters(e) {
|
|
780
|
+
var t;
|
|
781
|
+
const A = [];
|
|
782
|
+
return (t = e == null ? void 0 : e.cmap) != null && t.tables ? (e.cmap.tables.forEach((r) => {
|
|
783
|
+
if (r.format === 4) {
|
|
784
|
+
const B = this._extractCharactersFromFormat4Table(r);
|
|
785
|
+
A.push(...B);
|
|
786
|
+
} else if (r.format === 12) {
|
|
787
|
+
const B = this._extractCharactersFromFormat12Table(r);
|
|
788
|
+
A.push(...B);
|
|
789
|
+
}
|
|
790
|
+
}), [...new Set(A)]) : [];
|
|
791
|
+
}
|
|
792
|
+
/**
|
|
793
|
+
* Extracts characters from a Format 4 cmap table (Basic Multilingual Plane).
|
|
794
|
+
* @param table The Format 4 cmap table
|
|
795
|
+
* @returns Array of character strings
|
|
796
|
+
*/
|
|
797
|
+
_extractCharactersFromFormat4Table(e) {
|
|
798
|
+
const A = [];
|
|
799
|
+
if (!e.startCount || !e.endCount || !e.idRangeOffset || !e.idDelta)
|
|
800
|
+
return A;
|
|
801
|
+
for (let t = 0; t < e.startCount.length; t++) {
|
|
802
|
+
const r = e.startCount[t], B = e.endCount[t];
|
|
803
|
+
if (!(r === 65535 && B === 65535)) {
|
|
804
|
+
for (let E = r; E <= B; E++)
|
|
805
|
+
if (this._calculateGlyphIndexFormat4(e, E, t) > 0) {
|
|
806
|
+
const i = String.fromCodePoint(E);
|
|
807
|
+
A.push(i);
|
|
808
|
+
}
|
|
809
|
+
}
|
|
810
|
+
}
|
|
811
|
+
return A;
|
|
812
|
+
}
|
|
813
|
+
/**
|
|
814
|
+
* Extracts characters from a Format 12 cmap table (Extended Unicode ranges).
|
|
815
|
+
* @param table The Format 12 cmap table
|
|
816
|
+
* @returns Array of character strings
|
|
817
|
+
*/
|
|
818
|
+
_extractCharactersFromFormat12Table(e) {
|
|
819
|
+
const A = [];
|
|
820
|
+
if (!e.groups)
|
|
821
|
+
return A;
|
|
822
|
+
for (let t = 0; t < e.groups.length; t += 3) {
|
|
823
|
+
const r = e.groups[t], B = e.groups[t + 1], E = e.groups[t + 2];
|
|
824
|
+
for (let g = r; g <= B; g++)
|
|
825
|
+
if (E + (g - r) > 0) {
|
|
826
|
+
const o = String.fromCodePoint(g);
|
|
827
|
+
A.push(o);
|
|
828
|
+
}
|
|
829
|
+
}
|
|
830
|
+
return A;
|
|
831
|
+
}
|
|
832
|
+
/**
|
|
833
|
+
* Calculates the glyph index for a character in a Format 4 cmap table.
|
|
834
|
+
* @param table The Format 4 cmap table
|
|
835
|
+
* @param codePoint The Unicode code point
|
|
836
|
+
* @param rangeIndex The index of the character range
|
|
837
|
+
* @returns The glyph index, or 0 if not found
|
|
838
|
+
*/
|
|
839
|
+
_calculateGlyphIndexFormat4(e, A, t) {
|
|
840
|
+
if (e.idRangeOffset[t] === 0)
|
|
841
|
+
return A + e.idDelta[t] & 65535;
|
|
842
|
+
{
|
|
843
|
+
const r = e.idRangeOffset[t] / 2 + (A - e.startCount[t]) - (e.startCount.length - t);
|
|
844
|
+
if (r >= 0 && e.glyphIdArray && r < e.glyphIdArray.length) {
|
|
845
|
+
const B = e.glyphIdArray[r];
|
|
846
|
+
if (B !== 0)
|
|
847
|
+
return B + e.idDelta[t] & 65535;
|
|
848
|
+
}
|
|
849
|
+
}
|
|
850
|
+
return 0;
|
|
851
|
+
}
|
|
852
|
+
/**
|
|
853
|
+
* Filters out problematic characters that might cause rendering issues.
|
|
854
|
+
* @param characters Array of character strings to filter
|
|
855
|
+
* @returns Filtered array of character strings
|
|
856
|
+
*/
|
|
857
|
+
filterProblematicCharacters(e) {
|
|
858
|
+
return e.filter((A) => this._isValidCharacter(A));
|
|
859
|
+
}
|
|
860
|
+
/**
|
|
861
|
+
* Checks if a character is valid for rendering.
|
|
862
|
+
* @param char The character to check
|
|
863
|
+
* @returns True if the character is valid, false otherwise
|
|
864
|
+
*/
|
|
865
|
+
_isValidCharacter(e) {
|
|
866
|
+
const A = e.codePointAt(0) || 0;
|
|
867
|
+
return !(A >= 0 && A <= 31 && A !== 9 && A !== 10 && A !== 13 || A >= 127 && A <= 159);
|
|
868
|
+
}
|
|
869
|
+
}
|
|
870
|
+
class H {
|
|
871
|
+
/**
|
|
872
|
+
* Creates a new TextureAtlasCreation instance.
|
|
873
|
+
* @param renderer The WebGL renderer instance
|
|
874
|
+
*/
|
|
875
|
+
constructor(e) {
|
|
876
|
+
Q(this, "_textureCanvas");
|
|
877
|
+
Q(this, "_textureContext");
|
|
878
|
+
Q(this, "_renderer");
|
|
879
|
+
this._renderer = e, this._textureCanvas = document.createElement("canvas"), this._textureContext = this._textureCanvas.getContext("2d", { willReadFrequently: !0 });
|
|
880
|
+
}
|
|
881
|
+
/**
|
|
882
|
+
* Creates a texture atlas from the given characters.
|
|
883
|
+
* @param characters Array of TextmodeCharacter objects
|
|
884
|
+
* @param maxGlyphDimensions Maximum dimensions of glyphs
|
|
885
|
+
* @param fontSize Font size for rendering
|
|
886
|
+
* @param fontFamilyName Font family name to use
|
|
887
|
+
* @returns Object containing framebuffer, columns, and rows
|
|
888
|
+
*/
|
|
889
|
+
async createTextureAtlas(e, A, t, r) {
|
|
890
|
+
const B = e.length, E = Math.ceil(Math.sqrt(B)), g = Math.ceil(B / E), i = A.width * E, o = A.height * g;
|
|
891
|
+
this._setupCanvas(i, o, t, r), this._renderCharactersToCanvas(e, A, E, t), this._applyBlackWhiteThreshold();
|
|
892
|
+
const n = this._renderer.createFramebuffer(i, o, { filter: "nearest" });
|
|
893
|
+
return n.update(this._textureCanvas), {
|
|
894
|
+
framebuffer: n,
|
|
895
|
+
columns: E,
|
|
896
|
+
rows: g
|
|
897
|
+
};
|
|
898
|
+
}
|
|
899
|
+
/**
|
|
900
|
+
* Sets up the canvas for rendering.
|
|
901
|
+
* @param width Canvas width
|
|
902
|
+
* @param height Canvas height
|
|
903
|
+
* @param fontSize Font size
|
|
904
|
+
* @param fontFamilyName Font family name
|
|
905
|
+
*/
|
|
906
|
+
_setupCanvas(e, A, t, r) {
|
|
907
|
+
this._textureCanvas.width = e, this._textureCanvas.height = A, this._textureContext.imageSmoothingEnabled = !0, this._textureContext.imageSmoothingQuality = "high", this._textureContext.fillStyle = "black", this._textureContext.fillRect(0, 0, e, A), this._textureContext.font = `${t}px ${r}`, this._textureContext.textBaseline = "top", this._textureContext.textAlign = "left", this._textureContext.fillStyle = "white";
|
|
908
|
+
}
|
|
909
|
+
/**
|
|
910
|
+
* Renders all characters to the canvas in a grid layout.
|
|
911
|
+
* @param characters Array of characters to render
|
|
912
|
+
* @param maxGlyphDimensions Maximum glyph dimensions
|
|
913
|
+
* @param textureColumns Number of columns in the texture
|
|
914
|
+
* @param fontSize Font size
|
|
915
|
+
*/
|
|
916
|
+
_renderCharactersToCanvas(e, A, t, r) {
|
|
917
|
+
for (let B = 0; B < e.length; B++) {
|
|
918
|
+
const E = B % t, g = Math.floor(B / t), i = E * A.width + A.width / 2, o = g * A.height + A.height / 2, n = i - A.width / 2, a = o - r / 2;
|
|
919
|
+
this._textureContext.fillText(e[B].character, n, a);
|
|
920
|
+
}
|
|
921
|
+
}
|
|
922
|
+
/**
|
|
923
|
+
* Applies a black and white threshold filter to the canvas.
|
|
924
|
+
* This converts antialiased grayscale pixels to pure black or white,
|
|
925
|
+
* ensuring crisp text rendering suitable for NEAREST texture filtering.
|
|
926
|
+
* @param threshold Threshold value (0-255) for black/white conversion
|
|
927
|
+
*/
|
|
928
|
+
_applyBlackWhiteThreshold(e = 128) {
|
|
929
|
+
const A = this._textureContext.getImageData(0, 0, this._textureCanvas.width, this._textureCanvas.height), t = A.data;
|
|
930
|
+
for (let r = 0; r < t.length; r += 4) {
|
|
931
|
+
const E = 0.299 * t[r] + 0.587 * t[r + 1] + 0.114 * t[r + 2] > e ? 255 : 0;
|
|
932
|
+
t[r] = E, t[r + 1] = E, t[r + 2] = E;
|
|
933
|
+
}
|
|
934
|
+
this._textureContext.putImageData(A, 0, 0);
|
|
935
|
+
}
|
|
936
|
+
}
|
|
937
|
+
class z {
|
|
938
|
+
/**
|
|
939
|
+
* Creates a new MetricsCalculation instance.
|
|
940
|
+
*/
|
|
941
|
+
constructor() {
|
|
942
|
+
Q(this, "_tempCanvas");
|
|
943
|
+
Q(this, "_tempContext");
|
|
944
|
+
this._tempCanvas = document.createElement("canvas"), this._tempContext = this._tempCanvas.getContext("2d");
|
|
945
|
+
}
|
|
946
|
+
/**
|
|
947
|
+
* Calculates the maximum glyph dimensions for a given set of characters.
|
|
948
|
+
* @param characters Array of character strings
|
|
949
|
+
* @param fontSize Font size to use for measurement
|
|
950
|
+
* @param fontFamilyName Font family name
|
|
951
|
+
* @param fontFace FontFace object (optional, for validation)
|
|
952
|
+
* @returns Object containing width and height dimensions
|
|
953
|
+
*/
|
|
954
|
+
calculateMaxGlyphDimensions(e, A, t) {
|
|
955
|
+
this._tempContext.font = `${A}px ${t}`;
|
|
956
|
+
let r = 0, B = 0;
|
|
957
|
+
for (const E of e) {
|
|
958
|
+
const g = this._tempContext.measureText(E), i = g.width, o = g.actualBoundingBoxAscent + g.actualBoundingBoxDescent;
|
|
959
|
+
i > 0 && (r = Math.max(r, i), B = Math.max(B, o));
|
|
960
|
+
}
|
|
961
|
+
return {
|
|
962
|
+
width: Math.ceil(r),
|
|
963
|
+
height: Math.ceil(B)
|
|
964
|
+
};
|
|
965
|
+
}
|
|
966
|
+
}
|
|
967
|
+
class L {
|
|
968
|
+
/**
|
|
969
|
+
* Creates TextmodeCharacter objects with unique color assignments.
|
|
970
|
+
* @param characters Array of character strings
|
|
971
|
+
* @returns Array of TextmodeCharacter objects with colors
|
|
972
|
+
*/
|
|
973
|
+
createCharacterObjects(e) {
|
|
974
|
+
return e.map((A, t) => {
|
|
975
|
+
const r = A.codePointAt(0) || 0, B = this._generateCharacterColor(t);
|
|
976
|
+
return {
|
|
977
|
+
character: A,
|
|
978
|
+
unicode: r,
|
|
979
|
+
color: B
|
|
980
|
+
};
|
|
981
|
+
});
|
|
982
|
+
}
|
|
983
|
+
/**
|
|
984
|
+
* Generates a unique RGB color for a character based on its index.
|
|
985
|
+
* @param index The index of the character
|
|
986
|
+
* @returns RGB color as a tuple [r, g, b]
|
|
987
|
+
*/
|
|
988
|
+
_generateCharacterColor(e) {
|
|
989
|
+
const A = e % 256, t = Math.floor(e / 256) % 256, r = Math.floor(e / 65536) % 256;
|
|
990
|
+
return [A, t, r];
|
|
991
|
+
}
|
|
992
|
+
/**
|
|
993
|
+
* Gets the color for a specific character.
|
|
994
|
+
* @param character The character to get the color for
|
|
995
|
+
* @param characters Array of TextmodeCharacter objects
|
|
996
|
+
* @returns RGB color as a tuple [r, g, b], or [0, 0, 0] if not found
|
|
997
|
+
*/
|
|
998
|
+
getCharacterColor(e, A) {
|
|
999
|
+
const t = A.find((r) => r.character === e);
|
|
1000
|
+
return t ? t.color : [0, 0, 0];
|
|
1001
|
+
}
|
|
1002
|
+
/**
|
|
1003
|
+
* Gets colors for multiple characters.
|
|
1004
|
+
* @param characterString String of characters to get colors for
|
|
1005
|
+
* @param characters Array of TextmodeCharacter objects
|
|
1006
|
+
* @returns Array of RGB colors for each character
|
|
1007
|
+
*/
|
|
1008
|
+
getCharacterColors(e, A) {
|
|
1009
|
+
return e.split("").map((t) => this.getCharacterColor(t, A) || [0, 0, 0]);
|
|
1010
|
+
}
|
|
1011
|
+
}
|
|
1012
|
+
class V {
|
|
1013
|
+
/**
|
|
1014
|
+
* Creates a new TextmodeFont instance.
|
|
760
1015
|
* @param renderer Renderer instance for texture creation
|
|
761
1016
|
* @param fontSize Font size to use for the texture atlas
|
|
762
1017
|
* @ignore
|
|
763
1018
|
*/
|
|
764
1019
|
constructor(e, A = 16) {
|
|
765
|
-
|
|
766
|
-
|
|
767
|
-
|
|
768
|
-
|
|
769
|
-
|
|
770
|
-
|
|
771
|
-
|
|
772
|
-
|
|
773
|
-
|
|
774
|
-
|
|
775
|
-
|
|
776
|
-
|
|
777
|
-
this
|
|
778
|
-
|
|
779
|
-
|
|
780
|
-
|
|
1020
|
+
Q(this, "_font");
|
|
1021
|
+
Q(this, "_characters", []);
|
|
1022
|
+
Q(this, "_fontFramebuffer");
|
|
1023
|
+
Q(this, "_fontSize", 16);
|
|
1024
|
+
Q(this, "_textureColumns", 0);
|
|
1025
|
+
Q(this, "_textureRows", 0);
|
|
1026
|
+
Q(this, "_maxGlyphDimensions", { width: 0, height: 0 });
|
|
1027
|
+
Q(this, "_fontFace");
|
|
1028
|
+
Q(this, "_fontFamilyName", "UrsaFont");
|
|
1029
|
+
// Component classes
|
|
1030
|
+
Q(this, "_characterExtractor");
|
|
1031
|
+
Q(this, "_textureAtlas");
|
|
1032
|
+
Q(this, "_metricsCalculator");
|
|
1033
|
+
Q(this, "_characterColorMapper");
|
|
1034
|
+
this._fontSize = A, this._characterExtractor = new O(), this._textureAtlas = new H(e), this._metricsCalculator = new z(), this._characterColorMapper = new L();
|
|
1035
|
+
}
|
|
1036
|
+
/**
|
|
1037
|
+
* Initializes the font manager by loading the font and creating the texture atlas.
|
|
781
1038
|
* @returns Promise that resolves when initialization is complete
|
|
782
1039
|
* @ignore
|
|
783
1040
|
*/
|
|
784
1041
|
async initialize() {
|
|
785
1042
|
const A = await (await fetch(S)).arrayBuffer();
|
|
786
|
-
|
|
787
|
-
}
|
|
788
|
-
/**
|
|
789
|
-
* Initializes the characters array from the font's cmap table
|
|
790
|
-
*/
|
|
791
|
-
_initializeCharacters() {
|
|
792
|
-
const e = [], A = /* @__PURE__ */ new Map();
|
|
793
|
-
this._font && this._font.cmap && this._font.cmap.tables && this._font.cmap.tables.forEach((B) => {
|
|
794
|
-
if (B.format === 4 && B.startCount && B.endCount && B.idRangeOffset && B.idDelta)
|
|
795
|
-
for (let Q = 0; Q < B.startCount.length; Q++) {
|
|
796
|
-
const g = B.startCount[Q], i = B.endCount[Q];
|
|
797
|
-
if (!(g === 65535 && i === 65535))
|
|
798
|
-
for (let s = g; s <= i; s++) {
|
|
799
|
-
const o = String.fromCodePoint(s);
|
|
800
|
-
let a = 0;
|
|
801
|
-
if (B.idRangeOffset[Q] === 0)
|
|
802
|
-
a = s + B.idDelta[Q] & 65535;
|
|
803
|
-
else {
|
|
804
|
-
const h = B.idRangeOffset[Q] / 2 + (s - B.startCount[Q]) - (B.startCount.length - Q);
|
|
805
|
-
if (h >= 0 && B.glyphIdArray && h < B.glyphIdArray.length) {
|
|
806
|
-
const c = B.glyphIdArray[h];
|
|
807
|
-
c !== 0 && (a = c + B.idDelta[Q] & 65535);
|
|
808
|
-
}
|
|
809
|
-
}
|
|
810
|
-
a && a > 0 && (e.push(o), A.set(o, a));
|
|
811
|
-
}
|
|
812
|
-
}
|
|
813
|
-
else if (B.format === 12 && B.groups)
|
|
814
|
-
for (let Q = 0; Q < B.groups.length; Q += 3) {
|
|
815
|
-
const g = B.groups[Q], i = B.groups[Q + 1], s = B.groups[Q + 2];
|
|
816
|
-
for (let o = g; o <= i; o++) {
|
|
817
|
-
const a = String.fromCodePoint(o), h = s + (o - g);
|
|
818
|
-
h > 0 && (e.push(a), A.set(a, h));
|
|
819
|
-
}
|
|
820
|
-
}
|
|
821
|
-
});
|
|
822
|
-
const r = [...new Set(e)].filter((B) => {
|
|
823
|
-
const Q = B.codePointAt(0) || 0;
|
|
824
|
-
return !(Q >= 0 && Q <= 31 && Q !== 9 && Q !== 10 && Q !== 13 || Q >= 127 && Q <= 159);
|
|
825
|
-
});
|
|
826
|
-
this._characters = r.map((B, Q) => {
|
|
827
|
-
const g = B.codePointAt(0) || 0, i = Q % 256, s = Math.floor(Q / 256) % 256, o = Math.floor(Q / 65536) % 256;
|
|
828
|
-
return {
|
|
829
|
-
character: B,
|
|
830
|
-
unicode: g,
|
|
831
|
-
color: [i, s, o]
|
|
832
|
-
};
|
|
833
|
-
});
|
|
1043
|
+
await this._loadFontFace(A), this._font = m.parse(A)[0], await this._initializeFont();
|
|
834
1044
|
}
|
|
835
1045
|
/**
|
|
836
|
-
*
|
|
1046
|
+
* Loads a new font from a file path.
|
|
1047
|
+
* @param fontPath Path to the .otf or .ttf font file
|
|
1048
|
+
* @returns Promise that resolves when font loading is complete
|
|
1049
|
+
* @ignore
|
|
837
1050
|
*/
|
|
838
|
-
|
|
839
|
-
|
|
840
|
-
|
|
841
|
-
|
|
842
|
-
|
|
843
|
-
|
|
844
|
-
|
|
845
|
-
|
|
846
|
-
|
|
847
|
-
|
|
1051
|
+
async loadFont(e) {
|
|
1052
|
+
try {
|
|
1053
|
+
const A = await fetch(e);
|
|
1054
|
+
if (!A.ok)
|
|
1055
|
+
throw new l(`Failed to load font file: ${A.status} ${A.statusText}`);
|
|
1056
|
+
const t = await A.arrayBuffer();
|
|
1057
|
+
await this._loadFontFace(t);
|
|
1058
|
+
const r = m.parse(t);
|
|
1059
|
+
if (!r || r.length === 0)
|
|
1060
|
+
throw new Error("Failed to parse font file");
|
|
1061
|
+
this._font = r[0], await this._initializeFont();
|
|
1062
|
+
} catch (A) {
|
|
1063
|
+
throw new l(`Failed to load font: ${A instanceof Error ? A.message : "Unknown error"}`, A);
|
|
848
1064
|
}
|
|
849
|
-
this._maxGlyphDimensions = {
|
|
850
|
-
width: Math.ceil(e),
|
|
851
|
-
height: Math.ceil(A)
|
|
852
|
-
};
|
|
853
1065
|
}
|
|
854
1066
|
/**
|
|
855
|
-
*
|
|
1067
|
+
* Loads a FontFace from a font buffer.
|
|
1068
|
+
* @param fontBuffer ArrayBuffer containing font data
|
|
856
1069
|
*/
|
|
857
|
-
async
|
|
858
|
-
const
|
|
859
|
-
this.
|
|
860
|
-
|
|
861
|
-
|
|
862
|
-
|
|
863
|
-
|
|
864
|
-
|
|
865
|
-
|
|
866
|
-
this.
|
|
1070
|
+
async _loadFontFace(e) {
|
|
1071
|
+
const A = Date.now();
|
|
1072
|
+
this._fontFamilyName = this._fontFamilyName === "UrsaFont" ? "UrsaFont" : `CustomFont_${A}`, this._fontFace = new FontFace(this._fontFamilyName, e), await this._fontFace.load(), document.fonts.add(this._fontFace);
|
|
1073
|
+
}
|
|
1074
|
+
/**
|
|
1075
|
+
* Initializes all font-dependent properties using the component classes.
|
|
1076
|
+
*/
|
|
1077
|
+
async _initializeFont() {
|
|
1078
|
+
const e = this._characterExtractor.extractCharacters(this._font), A = this._characterExtractor.filterProblematicCharacters(e);
|
|
1079
|
+
this._characters = this._characterColorMapper.createCharacterObjects(A), this._maxGlyphDimensions = this._metricsCalculator.calculateMaxGlyphDimensions(
|
|
1080
|
+
A,
|
|
1081
|
+
this._fontSize,
|
|
1082
|
+
this._fontFamilyName
|
|
1083
|
+
);
|
|
1084
|
+
const t = await this._textureAtlas.createTextureAtlas(
|
|
1085
|
+
this._characters,
|
|
1086
|
+
this._maxGlyphDimensions,
|
|
1087
|
+
this._fontSize,
|
|
1088
|
+
this._fontFamilyName
|
|
1089
|
+
);
|
|
1090
|
+
this._fontFramebuffer = t.framebuffer, this._textureColumns = t.columns, this._textureRows = t.rows;
|
|
867
1091
|
}
|
|
868
1092
|
/**
|
|
869
1093
|
* Get the color associated with a character.
|
|
@@ -871,14 +1095,11 @@ class O {
|
|
|
871
1095
|
* @returns The RGB color as an array `[r, g, b]`.
|
|
872
1096
|
*/
|
|
873
1097
|
getCharacterColor(e) {
|
|
874
|
-
|
|
1098
|
+
return C.validate(
|
|
875
1099
|
typeof e == "string" && e.length === 1,
|
|
876
1100
|
"Character must be a single character string.",
|
|
877
1101
|
{ providedValue: e, method: "getCharacterColor" }
|
|
878
|
-
))
|
|
879
|
-
return [0, 0, 0];
|
|
880
|
-
const t = this._characters.find((r) => r.character === e);
|
|
881
|
-
return t ? t.color : [0, 0, 0];
|
|
1102
|
+
) ? this._characterColorMapper.getCharacterColor(e, this._characters) : [0, 0, 0];
|
|
882
1103
|
}
|
|
883
1104
|
/**
|
|
884
1105
|
* Get the colors associated with a string of characters.
|
|
@@ -887,11 +1108,11 @@ class O {
|
|
|
887
1108
|
* Each color is represented as an array `[r, g, b]`.
|
|
888
1109
|
*/
|
|
889
1110
|
getCharacterColors(e) {
|
|
890
|
-
return
|
|
1111
|
+
return C.validate(
|
|
891
1112
|
typeof e == "string" && e.length > 0,
|
|
892
1113
|
"Characters must be a string with at least one character.",
|
|
893
1114
|
{ providedValue: e, method: "getCharacterColors" }
|
|
894
|
-
) ?
|
|
1115
|
+
) ? this._characterColorMapper.getCharacterColors(e, this._characters) : [[0, 0, 0]];
|
|
895
1116
|
}
|
|
896
1117
|
/**
|
|
897
1118
|
* Checks if all characters in the given string exist in the font.
|
|
@@ -905,28 +1126,6 @@ class O {
|
|
|
905
1126
|
if (!A.has(t)) return !1;
|
|
906
1127
|
return !0;
|
|
907
1128
|
}
|
|
908
|
-
/**
|
|
909
|
-
* Updates the font by loading a new font file and regenerating all related properties
|
|
910
|
-
* @param fontPath Path to the .otf or .ttf font file
|
|
911
|
-
* @param fontSize Optional new font size (defaults to current fontSize)
|
|
912
|
-
* @returns Promise that resolves when font update is complete
|
|
913
|
-
* @ignore
|
|
914
|
-
*/
|
|
915
|
-
async loadFont(e) {
|
|
916
|
-
try {
|
|
917
|
-
const A = await fetch(e);
|
|
918
|
-
if (!A.ok)
|
|
919
|
-
throw new C(`Failed to load font file: ${A.status} ${A.statusText}`);
|
|
920
|
-
const t = await A.arrayBuffer(), r = Date.now();
|
|
921
|
-
this._fontFamilyName = `CustomFont_${r}`, this._fontFace = new FontFace(this._fontFamilyName, t), await this._fontFace.load(), document.fonts.add(this._fontFace);
|
|
922
|
-
const B = m.parse(t);
|
|
923
|
-
if (!B || B.length === 0)
|
|
924
|
-
throw new Error("Failed to parse font file");
|
|
925
|
-
this._font = B[0], this._initializeCharacters(), this._calculateMaxGlyphDimensions(), await this._createTextureAtlas();
|
|
926
|
-
} catch (A) {
|
|
927
|
-
throw new C(`Failed to load font: ${A instanceof Error ? A.message : "Unknown error"}`, A);
|
|
928
|
-
}
|
|
929
|
-
}
|
|
930
1129
|
/**
|
|
931
1130
|
* Returns the WebGL framebuffer containing the font texture atlas.
|
|
932
1131
|
* @ignore
|
|
@@ -938,11 +1137,11 @@ class O {
|
|
|
938
1137
|
get characters() {
|
|
939
1138
|
return this._characters;
|
|
940
1139
|
}
|
|
941
|
-
/** Returns a string representation of all characters in the font
|
|
1140
|
+
/** Returns a string representation of all characters in the font. */
|
|
942
1141
|
get charactersString() {
|
|
943
1142
|
return this._characters.map((e) => e.character).join("");
|
|
944
1143
|
}
|
|
945
|
-
/** Returns the number of columns in the texture atlas
|
|
1144
|
+
/** Returns the number of columns in the texture atlas. */
|
|
946
1145
|
get textureColumns() {
|
|
947
1146
|
return this._textureColumns;
|
|
948
1147
|
}
|
|
@@ -959,7 +1158,7 @@ class O {
|
|
|
959
1158
|
return this._fontSize;
|
|
960
1159
|
}
|
|
961
1160
|
}
|
|
962
|
-
class
|
|
1161
|
+
class k {
|
|
963
1162
|
/**
|
|
964
1163
|
* Create a new grid instance.
|
|
965
1164
|
* @param canvas The canvas element used to determine the grid dimensions.
|
|
@@ -969,25 +1168,25 @@ class z {
|
|
|
969
1168
|
*/
|
|
970
1169
|
constructor(e, A, t) {
|
|
971
1170
|
/** The number of columns in the grid. */
|
|
972
|
-
|
|
1171
|
+
Q(this, "_cols");
|
|
973
1172
|
/** The number of rows in the grid. */
|
|
974
|
-
|
|
1173
|
+
Q(this, "_rows");
|
|
975
1174
|
/** The total width of the grid in pixels. */
|
|
976
|
-
|
|
1175
|
+
Q(this, "_width");
|
|
977
1176
|
/** The total height of the grid in pixels. */
|
|
978
|
-
|
|
1177
|
+
Q(this, "_height");
|
|
979
1178
|
/** The offset to the outer canvas on the x-axis when centering the grid. */
|
|
980
|
-
|
|
1179
|
+
Q(this, "_offsetX");
|
|
981
1180
|
/** The offset to the outer canvas on the y-axis when centering the grid. */
|
|
982
|
-
|
|
1181
|
+
Q(this, "_offsetY");
|
|
983
1182
|
/** Whether the grid dimensions are fixed, or responsive based on the canvas dimensions. */
|
|
984
|
-
|
|
1183
|
+
Q(this, "_fixedDimensions", !1);
|
|
985
1184
|
/** The canvas element used to determine the grid dimensions. */
|
|
986
|
-
|
|
1185
|
+
Q(this, "_canvas");
|
|
987
1186
|
/** The width of each cell in the grid. */
|
|
988
|
-
|
|
1187
|
+
Q(this, "_cellWidth");
|
|
989
1188
|
/** The height of each cell in the grid. */
|
|
990
|
-
|
|
1189
|
+
Q(this, "_cellHeight");
|
|
991
1190
|
this._canvas = e, this._cellWidth = A, this._cellHeight = t, this.reset();
|
|
992
1191
|
}
|
|
993
1192
|
/**
|
|
@@ -1039,72 +1238,53 @@ class z {
|
|
|
1039
1238
|
this._canvas = e, this._fixedDimensions ? this._resizeGrid() : this.reset();
|
|
1040
1239
|
}
|
|
1041
1240
|
/**
|
|
1042
|
-
*
|
|
1241
|
+
* Gets or sets whether the grid dimensions *(columns and rows)* are fixed or responsive based on the canvas dimensions.
|
|
1242
|
+
* @param value Optional. `true` to make the grid dimensions fixed, or `false` to make them responsive. If not provided, returns the current state.
|
|
1243
|
+
* @returns If no parameter is provided, returns `true` if the grid dimensions are fixed, or `false` if they are responsive.
|
|
1244
|
+
* @ignore
|
|
1043
1245
|
*/
|
|
1246
|
+
fixedDimensions(e) {
|
|
1247
|
+
if (e === void 0)
|
|
1248
|
+
return this._fixedDimensions;
|
|
1249
|
+
this._fixedDimensions = e;
|
|
1250
|
+
}
|
|
1251
|
+
/** Returns the width of each cell in the grid. */
|
|
1044
1252
|
get cellWidth() {
|
|
1045
1253
|
return this._cellWidth;
|
|
1046
1254
|
}
|
|
1047
|
-
/**
|
|
1048
|
-
* Returns the height of each cell in the grid.
|
|
1049
|
-
*/
|
|
1255
|
+
/** Returns the height of each cell in the grid. */
|
|
1050
1256
|
get cellHeight() {
|
|
1051
1257
|
return this._cellHeight;
|
|
1052
1258
|
}
|
|
1053
|
-
/**
|
|
1054
|
-
* Returns the number of columns in the grid.
|
|
1055
|
-
*/
|
|
1259
|
+
/** Returns the number of columns in the grid. */
|
|
1056
1260
|
get cols() {
|
|
1057
1261
|
return this._cols;
|
|
1058
1262
|
}
|
|
1059
|
-
/**
|
|
1060
|
-
* Returns the number of rows in the grid.
|
|
1061
|
-
*/
|
|
1263
|
+
/** Returns the number of rows in the grid. */
|
|
1062
1264
|
get rows() {
|
|
1063
1265
|
return this._rows;
|
|
1064
1266
|
}
|
|
1065
|
-
/**
|
|
1066
|
-
* Returns the total width of the grid.
|
|
1067
|
-
*/
|
|
1267
|
+
/** Returns the total width of the grid. */
|
|
1068
1268
|
get width() {
|
|
1069
1269
|
return this._width;
|
|
1070
1270
|
}
|
|
1071
|
-
/**
|
|
1072
|
-
* Returns the total height of the grid.
|
|
1073
|
-
*/
|
|
1271
|
+
/** Returns the total height of the grid. */
|
|
1074
1272
|
get height() {
|
|
1075
1273
|
return this._height;
|
|
1076
1274
|
}
|
|
1077
|
-
/**
|
|
1078
|
-
* Returns the offset to the outer canvas borders on the x-axis when centering the grid.
|
|
1079
|
-
*/
|
|
1275
|
+
/** Returns the offset to the outer canvas borders on the x-axis when centering the grid. */
|
|
1080
1276
|
get offsetX() {
|
|
1081
1277
|
return this._offsetX;
|
|
1082
1278
|
}
|
|
1083
|
-
/**
|
|
1084
|
-
* Returns the offset to the outer canvas borders on the y-axis when centering the grid.
|
|
1085
|
-
*/
|
|
1279
|
+
/** Returns the offset to the outer canvas borders on the y-axis when centering the grid. */
|
|
1086
1280
|
get offsetY() {
|
|
1087
1281
|
return this._offsetY;
|
|
1088
1282
|
}
|
|
1089
|
-
/**
|
|
1090
|
-
* Returns `true` if the grid dimensions *(columns and rows)* are fixed, or `false` if they are responsive based on the canvas dimensions.
|
|
1091
|
-
*/
|
|
1092
|
-
get fixedDimensions() {
|
|
1093
|
-
return this._fixedDimensions;
|
|
1094
|
-
}
|
|
1095
|
-
/**
|
|
1096
|
-
* Sets whether the grid dimensions *(columns and rows)* are fixed or responsive based on the canvas dimensions.
|
|
1097
|
-
* @param value `true` to make the grid dimensions fixed, or `false` to make them responsive.
|
|
1098
|
-
* @ignore
|
|
1099
|
-
*/
|
|
1100
|
-
set fixedDimensions(e) {
|
|
1101
|
-
this._fixedDimensions = e;
|
|
1102
|
-
}
|
|
1103
1283
|
}
|
|
1104
|
-
class
|
|
1284
|
+
class N {
|
|
1105
1285
|
constructor(e) {
|
|
1106
|
-
|
|
1107
|
-
|
|
1286
|
+
Q(this, "webglCanvas");
|
|
1287
|
+
Q(this, "captureCanvas");
|
|
1108
1288
|
this.captureCanvas = e, this.webglCanvas = this.createOverlayCanvas();
|
|
1109
1289
|
}
|
|
1110
1290
|
generateUniqueCanvasId() {
|
|
@@ -1141,9 +1321,17 @@ class H {
|
|
|
1141
1321
|
* Get the WebGL context for the overlay canvas
|
|
1142
1322
|
*/
|
|
1143
1323
|
getWebGLContext() {
|
|
1144
|
-
const e = {
|
|
1324
|
+
const e = {
|
|
1325
|
+
alpha: !0,
|
|
1326
|
+
premultipliedAlpha: !1,
|
|
1327
|
+
preserveDrawingBuffer: !0,
|
|
1328
|
+
antialias: !1,
|
|
1329
|
+
depth: !1,
|
|
1330
|
+
stencil: !1,
|
|
1331
|
+
powerPreference: "high-performance"
|
|
1332
|
+
}, A = this.webglCanvas.getContext("webgl2", e) || this.webglCanvas.getContext("webgl", e);
|
|
1145
1333
|
if (!A)
|
|
1146
|
-
throw new
|
|
1334
|
+
throw new l("WebGL context could not be created. Ensure your browser supports WebGL.");
|
|
1147
1335
|
return A;
|
|
1148
1336
|
}
|
|
1149
1337
|
// Getters
|
|
@@ -1159,17 +1347,21 @@ class H {
|
|
|
1159
1347
|
}
|
|
1160
1348
|
class p {
|
|
1161
1349
|
constructor(e, A, t, r = {}) {
|
|
1162
|
-
|
|
1163
|
-
|
|
1164
|
-
|
|
1165
|
-
|
|
1166
|
-
|
|
1167
|
-
|
|
1168
|
-
|
|
1169
|
-
|
|
1170
|
-
|
|
1350
|
+
Q(this, "renderer");
|
|
1351
|
+
Q(this, "fontManager");
|
|
1352
|
+
Q(this, "grid");
|
|
1353
|
+
Q(this, "_characterFramebuffer");
|
|
1354
|
+
Q(this, "_primaryColorFramebuffer");
|
|
1355
|
+
Q(this, "_secondaryColorFramebuffer");
|
|
1356
|
+
Q(this, "_rotationFramebuffer");
|
|
1357
|
+
Q(this, "_transformFramebuffer");
|
|
1358
|
+
Q(this, "options");
|
|
1171
1359
|
this.renderer = e, this.fontManager = A, 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);
|
|
1172
1360
|
}
|
|
1361
|
+
/**
|
|
1362
|
+
* Resizes all internal framebuffers to match the grid dimensions.
|
|
1363
|
+
* @ignore
|
|
1364
|
+
*/
|
|
1173
1365
|
resize() {
|
|
1174
1366
|
this._characterFramebuffer.resize(this.grid.cols, this.grid.rows), this._primaryColorFramebuffer.resize(this.grid.cols, this.grid.rows), this._secondaryColorFramebuffer.resize(this.grid.cols, this.grid.rows), this._rotationFramebuffer.resize(this.grid.cols, this.grid.rows), this._transformFramebuffer.resize(this.grid.cols, this.grid.rows);
|
|
1175
1367
|
}
|
|
@@ -1189,7 +1381,7 @@ class p {
|
|
|
1189
1381
|
return this._transformFramebuffer;
|
|
1190
1382
|
}
|
|
1191
1383
|
}
|
|
1192
|
-
class
|
|
1384
|
+
class J {
|
|
1193
1385
|
/**
|
|
1194
1386
|
* Create a new color palette instance.
|
|
1195
1387
|
* @param renderer The renderer instance.
|
|
@@ -1197,41 +1389,26 @@ class L {
|
|
|
1197
1389
|
*/
|
|
1198
1390
|
constructor(e, A) {
|
|
1199
1391
|
/** The framebuffer used to store the color palette. */
|
|
1200
|
-
|
|
1201
|
-
|
|
1202
|
-
|
|
1392
|
+
Q(this, "_framebuffer");
|
|
1393
|
+
Q(this, "_renderer");
|
|
1394
|
+
Q(this, "_colors");
|
|
1203
1395
|
this._renderer = e, this._colors = A;
|
|
1204
1396
|
const t = Math.max(this._colors.length, 1);
|
|
1205
|
-
this._framebuffer = this._renderer.createFramebuffer(t, 1,
|
|
1206
|
-
filter: "nearest",
|
|
1207
|
-
wrap: "clamp",
|
|
1208
|
-
format: "rgba"
|
|
1209
|
-
}), this._updateFramebuffer();
|
|
1397
|
+
this._framebuffer = this._renderer.createFramebuffer(t, 1), this._updateFramebuffer();
|
|
1210
1398
|
}
|
|
1211
1399
|
/**
|
|
1212
1400
|
* Update the framebuffer with the currently selected colors.
|
|
1213
1401
|
*/
|
|
1214
1402
|
_updateFramebuffer() {
|
|
1215
|
-
if (!this._framebuffer
|
|
1403
|
+
if (!this._framebuffer) return;
|
|
1216
1404
|
const e = Math.max(this._colors.length, 1), A = 1;
|
|
1217
1405
|
this._framebuffer.width !== e && this._framebuffer.resize(e, A);
|
|
1218
1406
|
const t = new Uint8Array(e * A * 4);
|
|
1219
|
-
for (let
|
|
1220
|
-
const
|
|
1221
|
-
t[
|
|
1407
|
+
for (let r = 0; r < e; r++) {
|
|
1408
|
+
const B = r < this._colors.length ? this._colors[r] : [0, 0, 0], E = r * 4;
|
|
1409
|
+
t[E] = B[0], t[E + 1] = B[1], t[E + 2] = B[2], t[E + 3] = 255;
|
|
1222
1410
|
}
|
|
1223
|
-
|
|
1224
|
-
r.bindTexture(r.TEXTURE_2D, this._framebuffer.texture), r.texImage2D(
|
|
1225
|
-
r.TEXTURE_2D,
|
|
1226
|
-
0,
|
|
1227
|
-
r.RGBA,
|
|
1228
|
-
e,
|
|
1229
|
-
A,
|
|
1230
|
-
0,
|
|
1231
|
-
r.RGBA,
|
|
1232
|
-
r.UNSIGNED_BYTE,
|
|
1233
|
-
t
|
|
1234
|
-
), r.bindTexture(r.TEXTURE_2D, null);
|
|
1411
|
+
this._framebuffer.updateWithPixelData(t, e, A);
|
|
1235
1412
|
}
|
|
1236
1413
|
/**
|
|
1237
1414
|
* Sets the colors of the palette and updates the framebuffer.
|
|
@@ -1259,78 +1436,124 @@ class L {
|
|
|
1259
1436
|
return this._framebuffer.texture;
|
|
1260
1437
|
}
|
|
1261
1438
|
}
|
|
1262
|
-
class
|
|
1439
|
+
class _ extends p {
|
|
1263
1440
|
constructor(A, t, r, B = {}) {
|
|
1264
1441
|
super(A, t, r, B);
|
|
1265
|
-
|
|
1266
|
-
this.palette = new
|
|
1442
|
+
Q(this, "palette");
|
|
1443
|
+
this.palette = new J(this.renderer, this.fontManager.getCharacterColors(" .:-=+*%@#"));
|
|
1267
1444
|
}
|
|
1445
|
+
/**
|
|
1446
|
+
* Sets the characters used for brightness mapping.
|
|
1447
|
+
* @param characters The characters to use for brightness mapping, ordered from darkest to brightest.
|
|
1448
|
+
*/
|
|
1268
1449
|
characters(A) {
|
|
1269
|
-
|
|
1450
|
+
C.validate(
|
|
1270
1451
|
this.fontManager.hasAllCharacters(A),
|
|
1271
1452
|
"One or more characters do not exist in the current font.",
|
|
1272
1453
|
{ method: "characters", providedValue: A }
|
|
1273
1454
|
) && (this.options.characters = A, this.palette.setColors(this.fontManager.getCharacterColors(A)));
|
|
1274
1455
|
}
|
|
1456
|
+
/**
|
|
1457
|
+
* Sets a fixed color for characters if `characterColorMode` is `fixed`.
|
|
1458
|
+
* @param r Red component (0-255).
|
|
1459
|
+
* @param g Green component (0-255).
|
|
1460
|
+
* @param b Blue component (0-255).
|
|
1461
|
+
* @param a Alpha component (0-255).
|
|
1462
|
+
*/
|
|
1275
1463
|
characterColor(A, t = A, r = A, B = 255) {
|
|
1276
|
-
|
|
1277
|
-
[A, t, r, B].every((
|
|
1464
|
+
C.validate(
|
|
1465
|
+
[A, t, r, B].every((E) => E >= 0 && E <= 255),
|
|
1278
1466
|
"Character color values must be between 0 and 255",
|
|
1279
1467
|
{ method: "characterColor", providedValues: { r: A, g: t, b: r, a: B } }
|
|
1280
1468
|
) && (this.options.characterColor = [A, t, r, B]);
|
|
1281
1469
|
}
|
|
1470
|
+
/**
|
|
1471
|
+
* Sets the character color mode.
|
|
1472
|
+
* - `'sampled'`: Uses sampled colors from the source texture.
|
|
1473
|
+
* - `'fixed'`: Uses a fixed color set by `characterColor()`.
|
|
1474
|
+
* @param mode The color mode to use for characters.
|
|
1475
|
+
*/
|
|
1282
1476
|
characterColorMode(A) {
|
|
1283
|
-
|
|
1477
|
+
C.validate(
|
|
1284
1478
|
["sampled", "fixed"].includes(A),
|
|
1285
1479
|
"Invalid character color mode. Must be 'sampled' or 'fixed'.",
|
|
1286
1480
|
{ method: "characterColorMode", providedValue: A }
|
|
1287
1481
|
) && (this.options.characterColorMode = A);
|
|
1288
1482
|
}
|
|
1289
|
-
|
|
1290
|
-
|
|
1291
|
-
|
|
1292
|
-
|
|
1293
|
-
|
|
1483
|
+
/**
|
|
1484
|
+
* Sets the cell color if `backgroundColorMode` is `fixed`.
|
|
1485
|
+
* @param r Red component (0-255).
|
|
1486
|
+
* @param g Green component (0-255).
|
|
1487
|
+
* @param b Blue component (0-255).
|
|
1488
|
+
* @param a Alpha component (0-255).
|
|
1489
|
+
*/
|
|
1490
|
+
cellColor(A, t = A, r = A, B = 255) {
|
|
1491
|
+
C.validate(
|
|
1492
|
+
[A, t, r, B].every((E) => E >= 0 && E <= 255),
|
|
1493
|
+
"Cell color values must be between 0 and 255",
|
|
1494
|
+
{ method: "cellColor", providedValues: { r: A, g: t, b: r, a: B } }
|
|
1294
1495
|
) && (this.options.backgroundColor = [A, t, r, B]);
|
|
1295
1496
|
}
|
|
1296
|
-
|
|
1297
|
-
|
|
1497
|
+
/**
|
|
1498
|
+
* Sets the background color mode.
|
|
1499
|
+
* - `'sampled'`: Uses sampled colors from the source texture.
|
|
1500
|
+
* - `'fixed'`: Uses a fixed color set by `backgroundColor()`.
|
|
1501
|
+
* @param mode The color mode to use for background cells.
|
|
1502
|
+
*/
|
|
1503
|
+
cellColorMode(A) {
|
|
1504
|
+
C.validate(
|
|
1298
1505
|
["sampled", "fixed"].includes(A),
|
|
1299
|
-
"Invalid
|
|
1300
|
-
{ method: "
|
|
1506
|
+
"Invalid cell color mode. Must be 'sampled' or 'fixed'.",
|
|
1507
|
+
{ method: "cellColorMode", providedValue: A }
|
|
1301
1508
|
) && (this.options.backgroundColorMode = A);
|
|
1302
1509
|
}
|
|
1510
|
+
/**
|
|
1511
|
+
* Swaps the character and cell color.
|
|
1512
|
+
* @param invert If `true`, the character color becomes the cell color and vice versa.
|
|
1513
|
+
*/
|
|
1303
1514
|
invert(A) {
|
|
1304
|
-
|
|
1515
|
+
C.validate(
|
|
1305
1516
|
typeof A == "boolean" || typeof A == "number" && Number.isInteger(A),
|
|
1306
1517
|
"Invert must be a boolean value or an integer (0 for false, any other number for true).",
|
|
1307
1518
|
{ method: "invert", providedValue: A }
|
|
1308
1519
|
) && (this.options.invert = !!A);
|
|
1309
1520
|
}
|
|
1521
|
+
/**
|
|
1522
|
+
* Sets the rotation angle for the characters.
|
|
1523
|
+
* @param angle The rotation angle in degrees.
|
|
1524
|
+
*/
|
|
1310
1525
|
rotation(A) {
|
|
1311
|
-
|
|
1526
|
+
C.validate(
|
|
1312
1527
|
typeof A == "number",
|
|
1313
1528
|
"Rotation angle must be a number.",
|
|
1314
1529
|
{ method: "rotation", providedValue: A }
|
|
1315
1530
|
) && (this.options.rotation = A);
|
|
1316
1531
|
}
|
|
1532
|
+
/**
|
|
1533
|
+
* Flips the characters horizontally.
|
|
1534
|
+
* @param flip If `true`, characters are flipped horizontally. If `false`, no flip is applied.
|
|
1535
|
+
*/
|
|
1317
1536
|
flipHorizontally(A) {
|
|
1318
|
-
|
|
1537
|
+
C.validate(
|
|
1319
1538
|
typeof A == "boolean" || typeof A == "number" && Number.isInteger(A),
|
|
1320
1539
|
"Flip horizontally must be a boolean value or an integer (0 for false, any other number for true).",
|
|
1321
1540
|
{ method: "flipHorizontally", providedValue: A }
|
|
1322
1541
|
) && (this.options.flipHorizontally = !!A);
|
|
1323
1542
|
}
|
|
1543
|
+
/**
|
|
1544
|
+
* Flips the characters vertically.
|
|
1545
|
+
* @param flip If `true`, characters are flipped vertically. If `false`, no flip is applied.
|
|
1546
|
+
*/
|
|
1324
1547
|
flipVertically(A) {
|
|
1325
|
-
|
|
1548
|
+
C.validate(
|
|
1326
1549
|
typeof A == "boolean" || typeof A == "number" && Number.isInteger(A),
|
|
1327
1550
|
"Flip vertically must be a boolean value or an integer (0 for false, any other number for true).",
|
|
1328
1551
|
{ method: "flipVertically", providedValue: A }
|
|
1329
1552
|
) && (this.options.flipVertically = !!A);
|
|
1330
1553
|
}
|
|
1331
1554
|
}
|
|
1332
|
-
var
|
|
1333
|
-
const
|
|
1555
|
+
var W = "precision lowp float;uniform sampler2D u_sketchTexture;uniform vec2 u_gridCellDimensions;varying vec2 v_uv;void main(){vec2 cellCenter=(floor(v_uv*u_gridCellDimensions)+vec2(0.5))/u_gridCellDimensions;gl_FragColor=texture2D(u_sketchTexture,cellCenter);}", X = "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;if(brightness<u_brightnessRange.x||brightness>u_brightnessRange.y){gl_FragColor=vec4(0.0);return;}float t=(brightness-u_brightnessRange.x)/(u_brightnessRange.y-u_brightnessRange.x);float idx=clamp(floor(t*u_charPaletteSize.x),0.0,u_charPaletteSize.x-1.0);float u=(idx+0.5)/u_charPaletteSize.x;vec3 charColor=texture2D(u_charPaletteTexture,vec2(u,0.0)).rgb;gl_FragColor=vec4(charColor,color.a);}";
|
|
1556
|
+
const K = {
|
|
1334
1557
|
/** Enable/disable the renderer */
|
|
1335
1558
|
enabled: !0,
|
|
1336
1559
|
/** Characters used for brightness mapping (from darkest to brightest) */
|
|
@@ -1354,16 +1577,16 @@ const N = {
|
|
|
1354
1577
|
/** Range of brightness values to map to ASCII characters */
|
|
1355
1578
|
brightnessRange: [0, 255]
|
|
1356
1579
|
};
|
|
1357
|
-
class
|
|
1580
|
+
class b extends _ {
|
|
1358
1581
|
constructor(A, t, r) {
|
|
1359
|
-
super(A, t, r, { ...
|
|
1360
|
-
|
|
1361
|
-
|
|
1362
|
-
|
|
1363
|
-
this.sampleShader = new
|
|
1582
|
+
super(A, t, r, { ...K });
|
|
1583
|
+
Q(this, "sampleShader");
|
|
1584
|
+
Q(this, "charMappingShader");
|
|
1585
|
+
Q(this, "sampleFramebuffer");
|
|
1586
|
+
this.sampleShader = new c(A.context, u, W), this.charMappingShader = new c(A.context, u, X), this.sampleFramebuffer = this.renderer.createFramebuffer(this.grid.cols, this.grid.rows);
|
|
1364
1587
|
}
|
|
1365
1588
|
convert(A) {
|
|
1366
|
-
this.sampleFramebuffer.begin(), this.renderer.clear(
|
|
1589
|
+
this.sampleFramebuffer.begin(), this.renderer.clear(), this.renderer.shader(this.sampleShader), this.renderer.setUniform("u_sketchTexture", A), this.renderer.setUniform("u_gridCellDimensions", [this.grid.cols, this.grid.rows]), this.renderer.rect(0, 0, this.grid.cols, this.grid.rows), this.sampleFramebuffer.end(), this._primaryColorFramebuffer.begin(), this.options.characterColorMode === "fixed" ? this.renderer.background(this.options.characterColor[0], this.options.characterColor[1], this.options.characterColor[2], this.options.characterColor[3]) : (this.renderer.clear(), this.renderer.image(this.sampleFramebuffer, 0, 0, this.grid.cols, this.grid.rows)), this._primaryColorFramebuffer.end(), this._secondaryColorFramebuffer.begin(), this.options.backgroundColorMode === "fixed" ? this.renderer.background(this.options.backgroundColor[0], this.options.backgroundColor[1], this.options.backgroundColor[2], this.options.backgroundColor[3]) : (this.renderer.clear(), this.renderer.image(this.sampleFramebuffer, 0, 0, this.grid.cols, this.grid.rows)), this._secondaryColorFramebuffer.end(), this._transformFramebuffer.begin(), this.renderer.background(
|
|
1367
1590
|
this.options.invert ? 255 : 0,
|
|
1368
1591
|
this.options.flipHorizontally ? 255 : 0,
|
|
1369
1592
|
this.options.flipVertically ? 255 : 0
|
|
@@ -1372,37 +1595,44 @@ class _ extends b {
|
|
|
1372
1595
|
resize() {
|
|
1373
1596
|
super.resize(), this.sampleFramebuffer.resize(this.grid.cols, this.grid.rows);
|
|
1374
1597
|
}
|
|
1598
|
+
/**
|
|
1599
|
+
* Sets the brightness range for ASCII character mapping.
|
|
1600
|
+
*
|
|
1601
|
+
* Cells that sample outside this range are rendered as transparent.
|
|
1602
|
+
*
|
|
1603
|
+
* @param range Array of two numbers `[min, max]`, where `min` is darkest and `max` is brightest.
|
|
1604
|
+
*/
|
|
1375
1605
|
brightnessRange(A) {
|
|
1376
|
-
|
|
1606
|
+
C.validate(
|
|
1377
1607
|
Array.isArray(A) && A.length === 2 && A.every((t) => typeof t == "number" && t >= 0 && t <= 255),
|
|
1378
1608
|
"Brightness range must be an array of two numbers between 0 and 255.",
|
|
1379
1609
|
{ method: "brightnessRange", providedValue: A }
|
|
1380
1610
|
) && (this.options.brightnessRange = A);
|
|
1381
1611
|
}
|
|
1382
1612
|
}
|
|
1383
|
-
const
|
|
1613
|
+
const q = /* @__PURE__ */ Object.freeze(/* @__PURE__ */ Object.defineProperty({
|
|
1384
1614
|
__proto__: null,
|
|
1385
|
-
TextmodeBrightnessConverter:
|
|
1615
|
+
TextmodeBrightnessConverter: b,
|
|
1386
1616
|
TextmodeConverter: p,
|
|
1387
|
-
TextmodeFeatureConverter:
|
|
1617
|
+
TextmodeFeatureConverter: _
|
|
1388
1618
|
}, Symbol.toStringTag, { value: "Module" }));
|
|
1389
|
-
var
|
|
1390
|
-
class
|
|
1619
|
+
var Z = "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;uniform float u_pixelRatio;mat2 rotate2D(float angle){float s=sin(angle);float c=cos(angle);return mat2(c,-s,s,c);}void main(){vec2 logicalFragCoord=gl_FragCoord.xy/u_pixelRatio;vec2 adjustedCoord=(logicalFragCoord)/u_gridPixelDimensions;vec2 gridCoord=adjustedCoord*u_gridCellDimensions;vec2 cellCoord=floor(gridCoord);vec2 charIndexTexCoord=(cellCoord+vec2(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){if(u_backgroundMode==0){gl_FragColor=vec4(0.0,0.0,0.0,0.0);}else if(u_backgroundMode==1){vec2 captureTexCoord=logicalFragCoord/u_captureDimensions;gl_FragColor=texture2D(u_captureTexture,captureTexCoord);}return;}int charIndex=int(encodedIndexVec.r*255.0+0.5)+int(encodedIndexVec.g*255.0+0.5)*256;int charCol=charIndex-(charIndex/int(u_charsetDimensions.x))*int(u_charsetDimensions.x);int charRow=charIndex/int(u_charsetDimensions.x);vec2 charCoord=vec2(float(charCol)/u_charsetDimensions.x,float(charRow)/u_charsetDimensions.y);vec4 rotationColor=texture2D(u_rotationTexture,charIndexTexCoord);float redValue=rotationColor.r*255.0;float greenValue=rotationColor.g*255.0;float scaledAngle=redValue+(greenValue/255.0);float angleDegrees=(scaledAngle*360.0)/255.0;float rotationAngle=angleDegrees*3.14159265359/180.0;vec2 fractionalPart=fract(gridCoord)-0.5;if(flipHorizontal){fractionalPart.x=-fractionalPart.x;}if(flipVertical){fractionalPart.y=-fractionalPart.y;}fractionalPart=rotate2D(rotationAngle)*fractionalPart;fractionalPart+=0.5;vec2 cellMin=charCoord;vec2 cellMax=charCoord+vec2(1.0/u_charsetDimensions.x,1.0/u_charsetDimensions.y);vec2 texCoord=charCoord+fractionalPart*vec2(1.0/u_charsetDimensions.x,1.0/u_charsetDimensions.y);bool outsideBounds=any(lessThan(texCoord,cellMin))||any(greaterThan(texCoord,cellMax));if(outsideBounds){gl_FragColor=isInverted ? primaryColor : secondaryColor;return;}vec4 charTexel=texture2D(u_characterTexture,texCoord);float inv=isInverted ? 1.0 : 0.0;charTexel.rgb=mix(charTexel.rgb,1.0-charTexel.rgb,inv);gl_FragColor=mix(secondaryColor,primaryColor,charTexel);}";
|
|
1620
|
+
class j {
|
|
1391
1621
|
constructor(e, A, t) {
|
|
1392
|
-
|
|
1393
|
-
|
|
1394
|
-
|
|
1395
|
-
|
|
1396
|
-
|
|
1397
|
-
|
|
1398
|
-
this.renderer = e, this.font = A, this.grid = t, this._asciiShader = this.renderer.createShader(u,
|
|
1399
|
-
brightness: new
|
|
1622
|
+
Q(this, "renderer");
|
|
1623
|
+
Q(this, "font");
|
|
1624
|
+
Q(this, "grid");
|
|
1625
|
+
Q(this, "converters");
|
|
1626
|
+
Q(this, "_resultFramebuffer");
|
|
1627
|
+
Q(this, "_asciiShader");
|
|
1628
|
+
this.renderer = e, this.font = A, this.grid = t, this._asciiShader = this.renderer.createShader(u, Z), this.converters = {
|
|
1629
|
+
brightness: new b(e, A, t)
|
|
1400
1630
|
}, this._resultFramebuffer = this.renderer.createFramebuffer(this.grid.width, this.grid.height);
|
|
1401
1631
|
}
|
|
1402
1632
|
render(e) {
|
|
1403
1633
|
for (const A of Object.values(this.converters))
|
|
1404
1634
|
A.convert(e);
|
|
1405
|
-
this._resultFramebuffer.begin(), this.renderer.clear(), this.renderer.shader(this._asciiShader), this.renderer.setUniform("u_characterTexture", this.font.fontFramebuffer), this.renderer.setUniform("u_charsetDimensions", [this.font.textureColumns, this.font.textureRows]), this.renderer.setUniform("u_asciiCharacterTexture", this.converters.brightness.characterFramebuffer.texture), this.renderer.setUniform("u_primaryColorTexture", this.converters.brightness.primaryColorFramebuffer.texture), this.renderer.setUniform("u_secondaryColorTexture", this.converters.brightness.secondaryColorFramebuffer.texture), this.renderer.setUniform("u_transformTexture", this.converters.brightness.transformFramebuffer.texture), this.renderer.setUniform("u_rotationTexture", this.converters.brightness.rotationFramebuffer.texture), this.renderer.setUniform("u_captureTexture", e.texture), this.renderer.setUniform("u_backgroundMode", !1), this.renderer.setUniform("u_captureDimensions", [
|
|
1635
|
+
this._resultFramebuffer.begin(), this.renderer.clear(), this.renderer.shader(this._asciiShader), this.renderer.setUniform("u_characterTexture", this.font.fontFramebuffer), this.renderer.setUniform("u_charsetDimensions", [this.font.textureColumns, this.font.textureRows]), this.renderer.setUniform("u_asciiCharacterTexture", this.converters.brightness.characterFramebuffer.texture), this.renderer.setUniform("u_primaryColorTexture", this.converters.brightness.primaryColorFramebuffer.texture), this.renderer.setUniform("u_secondaryColorTexture", this.converters.brightness.secondaryColorFramebuffer.texture), this.renderer.setUniform("u_transformTexture", this.converters.brightness.transformFramebuffer.texture), this.renderer.setUniform("u_rotationTexture", this.converters.brightness.rotationFramebuffer.texture), this.renderer.setUniform("u_captureTexture", e.texture), this.renderer.setUniform("u_backgroundMode", !1), this.renderer.setUniform("u_captureDimensions", [e.width, e.height]), this.renderer.setUniform("u_gridCellDimensions", [this.grid.cols, this.grid.rows]), this.renderer.setUniform("u_gridPixelDimensions", [this.grid.width, this.grid.height]), this.renderer.setUniform("u_pixelRatio", 1), this.renderer.rect(0, 0, this._resultFramebuffer.width, this._resultFramebuffer.height), this._resultFramebuffer.end();
|
|
1406
1636
|
}
|
|
1407
1637
|
get(e) {
|
|
1408
1638
|
const A = this.converters[e];
|
|
@@ -1419,28 +1649,28 @@ class W {
|
|
|
1419
1649
|
e.resize();
|
|
1420
1650
|
}
|
|
1421
1651
|
}
|
|
1422
|
-
class
|
|
1652
|
+
class d {
|
|
1423
1653
|
constructor(e, A = {}) {
|
|
1424
1654
|
/** The canvas element to capture content from */
|
|
1425
|
-
|
|
1655
|
+
Q(this, "captureCanvas");
|
|
1426
1656
|
/** Our WebGL overlay canvas manager */
|
|
1427
|
-
|
|
1657
|
+
Q(this, "textmodeCanvas");
|
|
1428
1658
|
/** Core WebGL renderer */
|
|
1429
|
-
|
|
1430
|
-
|
|
1431
|
-
|
|
1432
|
-
|
|
1433
|
-
|
|
1659
|
+
Q(this, "renderer");
|
|
1660
|
+
Q(this, "canvasFramebuffer");
|
|
1661
|
+
Q(this, "_font");
|
|
1662
|
+
Q(this, "_grid");
|
|
1663
|
+
Q(this, "resizeObserver");
|
|
1434
1664
|
// Auto-rendering properties
|
|
1435
|
-
|
|
1436
|
-
|
|
1437
|
-
|
|
1438
|
-
|
|
1439
|
-
|
|
1440
|
-
|
|
1441
|
-
|
|
1442
|
-
|
|
1443
|
-
this.captureCanvas = e, this.textmodeCanvas = new
|
|
1665
|
+
Q(this, "_mode");
|
|
1666
|
+
Q(this, "_frameRateLimit");
|
|
1667
|
+
Q(this, "animationFrameId", null);
|
|
1668
|
+
Q(this, "lastFrameTime", 0);
|
|
1669
|
+
Q(this, "frameInterval");
|
|
1670
|
+
Q(this, "_frameRate", 0);
|
|
1671
|
+
Q(this, "lastRenderTime", 0);
|
|
1672
|
+
Q(this, "_pipeline");
|
|
1673
|
+
this.captureCanvas = e, this.textmodeCanvas = new N(e), this._mode = A.renderMode ?? "auto", this._frameRateLimit = A.frameRate ?? 120, this.frameInterval = 1e3 / this._frameRateLimit, this.renderer = new R(this.textmodeCanvas.getWebGLContext()), this.canvasFramebuffer = this.renderer.createFramebuffer(e.width, e.height), this._font = new V(this.renderer, A.fontSize ?? 16);
|
|
1444
1674
|
}
|
|
1445
1675
|
/**
|
|
1446
1676
|
* Static factory method for creating and initializing a Textmodifier instance.
|
|
@@ -1449,10 +1679,10 @@ class f {
|
|
|
1449
1679
|
* @ignore
|
|
1450
1680
|
*/
|
|
1451
1681
|
static async create(e, A = {}) {
|
|
1452
|
-
const t = new
|
|
1682
|
+
const t = new d(e, A);
|
|
1453
1683
|
await t._font.initialize();
|
|
1454
1684
|
const r = t._font.maxGlyphDimensions;
|
|
1455
|
-
return t._grid = new
|
|
1685
|
+
return t._grid = new k(t.captureCanvas, r.width, r.height), t._pipeline = new j(t.renderer, t._font, t._grid), t.setupEventListeners(), t.startAutoRendering(), t;
|
|
1456
1686
|
}
|
|
1457
1687
|
setupEventListeners() {
|
|
1458
1688
|
window.addEventListener("resize", this.resize.bind(this)), window.ResizeObserver && (this.resizeObserver = new ResizeObserver(() => {
|
|
@@ -1476,7 +1706,7 @@ class f {
|
|
|
1476
1706
|
* In `'manual'` mode, you need to call this method when you want to update the rendering.
|
|
1477
1707
|
*/
|
|
1478
1708
|
render() {
|
|
1479
|
-
this.measureFrameRate(), this.canvasFramebuffer.update(this.captureCanvas), this._pipeline.render(this.canvasFramebuffer), this.renderer.
|
|
1709
|
+
this.measureFrameRate(), this.canvasFramebuffer.update(this.captureCanvas), this._pipeline.render(this.canvasFramebuffer), this.renderer.background(0), this.renderer.image(this._pipeline.texture, this._grid.offsetX, this._grid.offsetY, this._pipeline.texture.width, this._pipeline.texture.height);
|
|
1480
1710
|
}
|
|
1481
1711
|
resize() {
|
|
1482
1712
|
this.textmodeCanvas.resize(), this.canvasFramebuffer.resize(this.textmodeCanvas.width, this.textmodeCanvas.height), this._grid.updateCanvas(this.textmodeCanvas.canvas), this._pipeline.resize(), this.renderer.resetViewport(), this._mode !== "manual" && this.render();
|
|
@@ -1547,7 +1777,7 @@ class f {
|
|
|
1547
1777
|
return this._pipeline;
|
|
1548
1778
|
}
|
|
1549
1779
|
}
|
|
1550
|
-
class
|
|
1780
|
+
class f {
|
|
1551
1781
|
/**
|
|
1552
1782
|
* Create a {@link Textmodifier} instance to apply textmode rendering to a given canvas.
|
|
1553
1783
|
* @param canvas The HTML canvas element to capture content from.
|
|
@@ -1555,35 +1785,35 @@ class w {
|
|
|
1555
1785
|
* @returns A Promise that resolves to a Textmodifier instance.
|
|
1556
1786
|
*/
|
|
1557
1787
|
static async create(e, A = {}) {
|
|
1558
|
-
return
|
|
1788
|
+
return d.create(e, A);
|
|
1559
1789
|
}
|
|
1560
1790
|
/**
|
|
1561
1791
|
* Set the global error handling level for the library. This applies to all `Textmodifier` instances.
|
|
1562
1792
|
* @param level The error handling level to set.
|
|
1563
1793
|
*/
|
|
1564
1794
|
static setErrorLevel(e) {
|
|
1565
|
-
|
|
1795
|
+
C.setGlobalLevel(e);
|
|
1566
1796
|
}
|
|
1567
1797
|
/**
|
|
1568
1798
|
* The current version of the library.
|
|
1569
1799
|
*/
|
|
1570
1800
|
static get version() {
|
|
1571
|
-
return "0.0.
|
|
1801
|
+
return "0.0.6";
|
|
1572
1802
|
}
|
|
1573
1803
|
constructor() {
|
|
1574
1804
|
throw new Error("Textmode is a static class and cannot be instantiated.");
|
|
1575
1805
|
}
|
|
1576
1806
|
}
|
|
1577
|
-
const
|
|
1807
|
+
const AA = f.create, eA = f.setErrorLevel, tA = f.version;
|
|
1578
1808
|
export {
|
|
1579
|
-
|
|
1580
|
-
|
|
1581
|
-
|
|
1582
|
-
|
|
1583
|
-
|
|
1584
|
-
|
|
1585
|
-
|
|
1586
|
-
|
|
1587
|
-
|
|
1588
|
-
|
|
1809
|
+
N as TextmodeCanvas,
|
|
1810
|
+
q as TextmodeConverters,
|
|
1811
|
+
T as TextmodeErrorLevel,
|
|
1812
|
+
V as TextmodeFont,
|
|
1813
|
+
k as TextmodeGrid,
|
|
1814
|
+
d as Textmodifier,
|
|
1815
|
+
AA as create,
|
|
1816
|
+
eA as setErrorLevel,
|
|
1817
|
+
f as textmode,
|
|
1818
|
+
tA as version
|
|
1589
1819
|
};
|