@hyperframes/producer 0.3.0 → 0.3.2
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/index.js +222 -149
- package/dist/index.js.map +4 -4
- package/dist/public-server.js +222 -149
- package/dist/public-server.js.map +4 -4
- package/dist/services/deterministicFonts.d.ts +1 -1
- package/dist/services/deterministicFonts.d.ts.map +1 -1
- package/package.json +3 -3
package/dist/index.js
CHANGED
|
@@ -57894,7 +57894,7 @@ var require_util2 = __commonJS({
|
|
|
57894
57894
|
return path12;
|
|
57895
57895
|
}
|
|
57896
57896
|
exports.normalize = normalize2;
|
|
57897
|
-
function
|
|
57897
|
+
function join18(aRoot, aPath) {
|
|
57898
57898
|
if (aRoot === "") {
|
|
57899
57899
|
aRoot = ".";
|
|
57900
57900
|
}
|
|
@@ -57926,7 +57926,7 @@ var require_util2 = __commonJS({
|
|
|
57926
57926
|
}
|
|
57927
57927
|
return joined;
|
|
57928
57928
|
}
|
|
57929
|
-
exports.join =
|
|
57929
|
+
exports.join = join18;
|
|
57930
57930
|
exports.isAbsolute = function(aPath) {
|
|
57931
57931
|
return aPath.charAt(0) === "/" || urlRegexp.test(aPath);
|
|
57932
57932
|
};
|
|
@@ -58099,7 +58099,7 @@ var require_util2 = __commonJS({
|
|
|
58099
58099
|
parsed.path = parsed.path.substring(0, index + 1);
|
|
58100
58100
|
}
|
|
58101
58101
|
}
|
|
58102
|
-
sourceURL =
|
|
58102
|
+
sourceURL = join18(urlGenerate(parsed), sourceURL);
|
|
58103
58103
|
}
|
|
58104
58104
|
return normalize2(sourceURL);
|
|
58105
58105
|
}
|
|
@@ -59901,7 +59901,7 @@ var require_escodegen = __commonJS({
|
|
|
59901
59901
|
function noEmptySpace() {
|
|
59902
59902
|
return space ? space : " ";
|
|
59903
59903
|
}
|
|
59904
|
-
function
|
|
59904
|
+
function join18(left2, right2) {
|
|
59905
59905
|
var leftSource, rightSource, leftCharCode, rightCharCode;
|
|
59906
59906
|
leftSource = toSourceNodeWhenNeeded(left2).toString();
|
|
59907
59907
|
if (leftSource.length === 0) {
|
|
@@ -60232,8 +60232,8 @@ var require_escodegen = __commonJS({
|
|
|
60232
60232
|
} else {
|
|
60233
60233
|
result.push(that.generateExpression(stmt.left, Precedence.Call, E_TTT));
|
|
60234
60234
|
}
|
|
60235
|
-
result =
|
|
60236
|
-
result = [
|
|
60235
|
+
result = join18(result, operator);
|
|
60236
|
+
result = [join18(
|
|
60237
60237
|
result,
|
|
60238
60238
|
that.generateExpression(stmt.right, Precedence.Assignment, E_TTT)
|
|
60239
60239
|
), ")"];
|
|
@@ -60376,11 +60376,11 @@ var require_escodegen = __commonJS({
|
|
|
60376
60376
|
var result, fragment;
|
|
60377
60377
|
result = ["class"];
|
|
60378
60378
|
if (stmt.id) {
|
|
60379
|
-
result =
|
|
60379
|
+
result = join18(result, this.generateExpression(stmt.id, Precedence.Sequence, E_TTT));
|
|
60380
60380
|
}
|
|
60381
60381
|
if (stmt.superClass) {
|
|
60382
|
-
fragment =
|
|
60383
|
-
result =
|
|
60382
|
+
fragment = join18("extends", this.generateExpression(stmt.superClass, Precedence.Unary, E_TTT));
|
|
60383
|
+
result = join18(result, fragment);
|
|
60384
60384
|
}
|
|
60385
60385
|
result.push(space);
|
|
60386
60386
|
result.push(this.generateStatement(stmt.body, S_TFFT));
|
|
@@ -60393,9 +60393,9 @@ var require_escodegen = __commonJS({
|
|
|
60393
60393
|
return escapeDirective(stmt.directive) + this.semicolon(flags);
|
|
60394
60394
|
},
|
|
60395
60395
|
DoWhileStatement: function(stmt, flags) {
|
|
60396
|
-
var result =
|
|
60396
|
+
var result = join18("do", this.maybeBlock(stmt.body, S_TFFF));
|
|
60397
60397
|
result = this.maybeBlockSuffix(stmt.body, result);
|
|
60398
|
-
return
|
|
60398
|
+
return join18(result, [
|
|
60399
60399
|
"while" + space + "(",
|
|
60400
60400
|
this.generateExpression(stmt.test, Precedence.Sequence, E_TTT),
|
|
60401
60401
|
")" + this.semicolon(flags)
|
|
@@ -60431,11 +60431,11 @@ var require_escodegen = __commonJS({
|
|
|
60431
60431
|
ExportDefaultDeclaration: function(stmt, flags) {
|
|
60432
60432
|
var result = ["export"], bodyFlags;
|
|
60433
60433
|
bodyFlags = flags & F_SEMICOLON_OPT ? S_TFFT : S_TFFF;
|
|
60434
|
-
result =
|
|
60434
|
+
result = join18(result, "default");
|
|
60435
60435
|
if (isStatement(stmt.declaration)) {
|
|
60436
|
-
result =
|
|
60436
|
+
result = join18(result, this.generateStatement(stmt.declaration, bodyFlags));
|
|
60437
60437
|
} else {
|
|
60438
|
-
result =
|
|
60438
|
+
result = join18(result, this.generateExpression(stmt.declaration, Precedence.Assignment, E_TTT) + this.semicolon(flags));
|
|
60439
60439
|
}
|
|
60440
60440
|
return result;
|
|
60441
60441
|
},
|
|
@@ -60443,15 +60443,15 @@ var require_escodegen = __commonJS({
|
|
|
60443
60443
|
var result = ["export"], bodyFlags, that = this;
|
|
60444
60444
|
bodyFlags = flags & F_SEMICOLON_OPT ? S_TFFT : S_TFFF;
|
|
60445
60445
|
if (stmt.declaration) {
|
|
60446
|
-
return
|
|
60446
|
+
return join18(result, this.generateStatement(stmt.declaration, bodyFlags));
|
|
60447
60447
|
}
|
|
60448
60448
|
if (stmt.specifiers) {
|
|
60449
60449
|
if (stmt.specifiers.length === 0) {
|
|
60450
|
-
result =
|
|
60450
|
+
result = join18(result, "{" + space + "}");
|
|
60451
60451
|
} else if (stmt.specifiers[0].type === Syntax.ExportBatchSpecifier) {
|
|
60452
|
-
result =
|
|
60452
|
+
result = join18(result, this.generateExpression(stmt.specifiers[0], Precedence.Sequence, E_TTT));
|
|
60453
60453
|
} else {
|
|
60454
|
-
result =
|
|
60454
|
+
result = join18(result, "{");
|
|
60455
60455
|
withIndent(function(indent2) {
|
|
60456
60456
|
var i, iz;
|
|
60457
60457
|
result.push(newline);
|
|
@@ -60469,7 +60469,7 @@ var require_escodegen = __commonJS({
|
|
|
60469
60469
|
result.push(base + "}");
|
|
60470
60470
|
}
|
|
60471
60471
|
if (stmt.source) {
|
|
60472
|
-
result =
|
|
60472
|
+
result = join18(result, [
|
|
60473
60473
|
"from" + space,
|
|
60474
60474
|
// ModuleSpecifier
|
|
60475
60475
|
this.generateExpression(stmt.source, Precedence.Sequence, E_TTT),
|
|
@@ -60557,7 +60557,7 @@ var require_escodegen = __commonJS({
|
|
|
60557
60557
|
];
|
|
60558
60558
|
cursor = 0;
|
|
60559
60559
|
if (stmt.specifiers[cursor].type === Syntax.ImportDefaultSpecifier) {
|
|
60560
|
-
result =
|
|
60560
|
+
result = join18(result, [
|
|
60561
60561
|
this.generateExpression(stmt.specifiers[cursor], Precedence.Sequence, E_TTT)
|
|
60562
60562
|
]);
|
|
60563
60563
|
++cursor;
|
|
@@ -60567,7 +60567,7 @@ var require_escodegen = __commonJS({
|
|
|
60567
60567
|
result.push(",");
|
|
60568
60568
|
}
|
|
60569
60569
|
if (stmt.specifiers[cursor].type === Syntax.ImportNamespaceSpecifier) {
|
|
60570
|
-
result =
|
|
60570
|
+
result = join18(result, [
|
|
60571
60571
|
space,
|
|
60572
60572
|
this.generateExpression(stmt.specifiers[cursor], Precedence.Sequence, E_TTT)
|
|
60573
60573
|
]);
|
|
@@ -60596,7 +60596,7 @@ var require_escodegen = __commonJS({
|
|
|
60596
60596
|
}
|
|
60597
60597
|
}
|
|
60598
60598
|
}
|
|
60599
|
-
result =
|
|
60599
|
+
result = join18(result, [
|
|
60600
60600
|
"from" + space,
|
|
60601
60601
|
// ModuleSpecifier
|
|
60602
60602
|
this.generateExpression(stmt.source, Precedence.Sequence, E_TTT),
|
|
@@ -60650,7 +60650,7 @@ var require_escodegen = __commonJS({
|
|
|
60650
60650
|
return result;
|
|
60651
60651
|
},
|
|
60652
60652
|
ThrowStatement: function(stmt, flags) {
|
|
60653
|
-
return [
|
|
60653
|
+
return [join18(
|
|
60654
60654
|
"throw",
|
|
60655
60655
|
this.generateExpression(stmt.argument, Precedence.Sequence, E_TTT)
|
|
60656
60656
|
), this.semicolon(flags)];
|
|
@@ -60661,7 +60661,7 @@ var require_escodegen = __commonJS({
|
|
|
60661
60661
|
result = this.maybeBlockSuffix(stmt.block, result);
|
|
60662
60662
|
if (stmt.handlers) {
|
|
60663
60663
|
for (i = 0, iz = stmt.handlers.length; i < iz; ++i) {
|
|
60664
|
-
result =
|
|
60664
|
+
result = join18(result, this.generateStatement(stmt.handlers[i], S_TFFF));
|
|
60665
60665
|
if (stmt.finalizer || i + 1 !== iz) {
|
|
60666
60666
|
result = this.maybeBlockSuffix(stmt.handlers[i].body, result);
|
|
60667
60667
|
}
|
|
@@ -60669,7 +60669,7 @@ var require_escodegen = __commonJS({
|
|
|
60669
60669
|
} else {
|
|
60670
60670
|
guardedHandlers = stmt.guardedHandlers || [];
|
|
60671
60671
|
for (i = 0, iz = guardedHandlers.length; i < iz; ++i) {
|
|
60672
|
-
result =
|
|
60672
|
+
result = join18(result, this.generateStatement(guardedHandlers[i], S_TFFF));
|
|
60673
60673
|
if (stmt.finalizer || i + 1 !== iz) {
|
|
60674
60674
|
result = this.maybeBlockSuffix(guardedHandlers[i].body, result);
|
|
60675
60675
|
}
|
|
@@ -60677,13 +60677,13 @@ var require_escodegen = __commonJS({
|
|
|
60677
60677
|
if (stmt.handler) {
|
|
60678
60678
|
if (Array.isArray(stmt.handler)) {
|
|
60679
60679
|
for (i = 0, iz = stmt.handler.length; i < iz; ++i) {
|
|
60680
|
-
result =
|
|
60680
|
+
result = join18(result, this.generateStatement(stmt.handler[i], S_TFFF));
|
|
60681
60681
|
if (stmt.finalizer || i + 1 !== iz) {
|
|
60682
60682
|
result = this.maybeBlockSuffix(stmt.handler[i].body, result);
|
|
60683
60683
|
}
|
|
60684
60684
|
}
|
|
60685
60685
|
} else {
|
|
60686
|
-
result =
|
|
60686
|
+
result = join18(result, this.generateStatement(stmt.handler, S_TFFF));
|
|
60687
60687
|
if (stmt.finalizer) {
|
|
60688
60688
|
result = this.maybeBlockSuffix(stmt.handler.body, result);
|
|
60689
60689
|
}
|
|
@@ -60691,7 +60691,7 @@ var require_escodegen = __commonJS({
|
|
|
60691
60691
|
}
|
|
60692
60692
|
}
|
|
60693
60693
|
if (stmt.finalizer) {
|
|
60694
|
-
result =
|
|
60694
|
+
result = join18(result, ["finally", this.maybeBlock(stmt.finalizer, S_TFFF)]);
|
|
60695
60695
|
}
|
|
60696
60696
|
return result;
|
|
60697
60697
|
},
|
|
@@ -60725,7 +60725,7 @@ var require_escodegen = __commonJS({
|
|
|
60725
60725
|
withIndent(function() {
|
|
60726
60726
|
if (stmt.test) {
|
|
60727
60727
|
result = [
|
|
60728
|
-
|
|
60728
|
+
join18("case", that.generateExpression(stmt.test, Precedence.Sequence, E_TTT)),
|
|
60729
60729
|
":"
|
|
60730
60730
|
];
|
|
60731
60731
|
} else {
|
|
@@ -60773,9 +60773,9 @@ var require_escodegen = __commonJS({
|
|
|
60773
60773
|
result.push(this.maybeBlock(stmt.consequent, S_TFFF));
|
|
60774
60774
|
result = this.maybeBlockSuffix(stmt.consequent, result);
|
|
60775
60775
|
if (stmt.alternate.type === Syntax.IfStatement) {
|
|
60776
|
-
result =
|
|
60776
|
+
result = join18(result, ["else ", this.generateStatement(stmt.alternate, bodyFlags)]);
|
|
60777
60777
|
} else {
|
|
60778
|
-
result =
|
|
60778
|
+
result = join18(result, join18("else", this.maybeBlock(stmt.alternate, bodyFlags)));
|
|
60779
60779
|
}
|
|
60780
60780
|
} else {
|
|
60781
60781
|
result.push(this.maybeBlock(stmt.consequent, bodyFlags));
|
|
@@ -60876,7 +60876,7 @@ var require_escodegen = __commonJS({
|
|
|
60876
60876
|
},
|
|
60877
60877
|
ReturnStatement: function(stmt, flags) {
|
|
60878
60878
|
if (stmt.argument) {
|
|
60879
|
-
return [
|
|
60879
|
+
return [join18(
|
|
60880
60880
|
"return",
|
|
60881
60881
|
this.generateExpression(stmt.argument, Precedence.Sequence, E_TTT)
|
|
60882
60882
|
), this.semicolon(flags)];
|
|
@@ -60965,14 +60965,14 @@ var require_escodegen = __commonJS({
|
|
|
60965
60965
|
if (leftSource.charCodeAt(leftSource.length - 1) === 47 && esutils.code.isIdentifierPartES5(expr.operator.charCodeAt(0))) {
|
|
60966
60966
|
result = [fragment, noEmptySpace(), expr.operator];
|
|
60967
60967
|
} else {
|
|
60968
|
-
result =
|
|
60968
|
+
result = join18(fragment, expr.operator);
|
|
60969
60969
|
}
|
|
60970
60970
|
fragment = this.generateExpression(expr.right, rightPrecedence, flags);
|
|
60971
60971
|
if (expr.operator === "/" && fragment.toString().charAt(0) === "/" || expr.operator.slice(-1) === "<" && fragment.toString().slice(0, 3) === "!--") {
|
|
60972
60972
|
result.push(noEmptySpace());
|
|
60973
60973
|
result.push(fragment);
|
|
60974
60974
|
} else {
|
|
60975
|
-
result =
|
|
60975
|
+
result = join18(result, fragment);
|
|
60976
60976
|
}
|
|
60977
60977
|
if (expr.operator === "in" && !(flags & F_ALLOW_IN)) {
|
|
60978
60978
|
return ["(", result, ")"];
|
|
@@ -61012,7 +61012,7 @@ var require_escodegen = __commonJS({
|
|
|
61012
61012
|
var result, length, i, iz, itemFlags;
|
|
61013
61013
|
length = expr["arguments"].length;
|
|
61014
61014
|
itemFlags = flags & F_ALLOW_UNPARATH_NEW && !parentheses && length === 0 ? E_TFT : E_TFF;
|
|
61015
|
-
result =
|
|
61015
|
+
result = join18(
|
|
61016
61016
|
"new",
|
|
61017
61017
|
this.generateExpression(expr.callee, Precedence.New, itemFlags)
|
|
61018
61018
|
);
|
|
@@ -61062,11 +61062,11 @@ var require_escodegen = __commonJS({
|
|
|
61062
61062
|
var result, fragment, rightCharCode, leftSource, leftCharCode;
|
|
61063
61063
|
fragment = this.generateExpression(expr.argument, Precedence.Unary, E_TTT);
|
|
61064
61064
|
if (space === "") {
|
|
61065
|
-
result =
|
|
61065
|
+
result = join18(expr.operator, fragment);
|
|
61066
61066
|
} else {
|
|
61067
61067
|
result = [expr.operator];
|
|
61068
61068
|
if (expr.operator.length > 2) {
|
|
61069
|
-
result =
|
|
61069
|
+
result = join18(result, fragment);
|
|
61070
61070
|
} else {
|
|
61071
61071
|
leftSource = toSourceNodeWhenNeeded(result).toString();
|
|
61072
61072
|
leftCharCode = leftSource.charCodeAt(leftSource.length - 1);
|
|
@@ -61089,7 +61089,7 @@ var require_escodegen = __commonJS({
|
|
|
61089
61089
|
result = "yield";
|
|
61090
61090
|
}
|
|
61091
61091
|
if (expr.argument) {
|
|
61092
|
-
result =
|
|
61092
|
+
result = join18(
|
|
61093
61093
|
result,
|
|
61094
61094
|
this.generateExpression(expr.argument, Precedence.Yield, E_TTT)
|
|
61095
61095
|
);
|
|
@@ -61097,7 +61097,7 @@ var require_escodegen = __commonJS({
|
|
|
61097
61097
|
return parenthesize(result, Precedence.Yield, precedence);
|
|
61098
61098
|
},
|
|
61099
61099
|
AwaitExpression: function(expr, precedence, flags) {
|
|
61100
|
-
var result =
|
|
61100
|
+
var result = join18(
|
|
61101
61101
|
expr.all ? "await*" : "await",
|
|
61102
61102
|
this.generateExpression(expr.argument, Precedence.Await, E_TTT)
|
|
61103
61103
|
);
|
|
@@ -61180,11 +61180,11 @@ var require_escodegen = __commonJS({
|
|
|
61180
61180
|
var result, fragment;
|
|
61181
61181
|
result = ["class"];
|
|
61182
61182
|
if (expr.id) {
|
|
61183
|
-
result =
|
|
61183
|
+
result = join18(result, this.generateExpression(expr.id, Precedence.Sequence, E_TTT));
|
|
61184
61184
|
}
|
|
61185
61185
|
if (expr.superClass) {
|
|
61186
|
-
fragment =
|
|
61187
|
-
result =
|
|
61186
|
+
fragment = join18("extends", this.generateExpression(expr.superClass, Precedence.Unary, E_TTT));
|
|
61187
|
+
result = join18(result, fragment);
|
|
61188
61188
|
}
|
|
61189
61189
|
result.push(space);
|
|
61190
61190
|
result.push(this.generateStatement(expr.body, S_TFFT));
|
|
@@ -61199,7 +61199,7 @@ var require_escodegen = __commonJS({
|
|
|
61199
61199
|
}
|
|
61200
61200
|
if (expr.kind === "get" || expr.kind === "set") {
|
|
61201
61201
|
fragment = [
|
|
61202
|
-
|
|
61202
|
+
join18(expr.kind, this.generatePropertyKey(expr.key, expr.computed)),
|
|
61203
61203
|
this.generateFunctionBody(expr.value)
|
|
61204
61204
|
];
|
|
61205
61205
|
} else {
|
|
@@ -61209,7 +61209,7 @@ var require_escodegen = __commonJS({
|
|
|
61209
61209
|
this.generateFunctionBody(expr.value)
|
|
61210
61210
|
];
|
|
61211
61211
|
}
|
|
61212
|
-
return
|
|
61212
|
+
return join18(result, fragment);
|
|
61213
61213
|
},
|
|
61214
61214
|
Property: function(expr, precedence, flags) {
|
|
61215
61215
|
if (expr.kind === "get" || expr.kind === "set") {
|
|
@@ -61404,7 +61404,7 @@ var require_escodegen = __commonJS({
|
|
|
61404
61404
|
for (i = 0, iz = expr.blocks.length; i < iz; ++i) {
|
|
61405
61405
|
fragment = that.generateExpression(expr.blocks[i], Precedence.Sequence, E_TTT);
|
|
61406
61406
|
if (i > 0 || extra.moz.comprehensionExpressionStartsWithAssignment) {
|
|
61407
|
-
result =
|
|
61407
|
+
result = join18(result, fragment);
|
|
61408
61408
|
} else {
|
|
61409
61409
|
result.push(fragment);
|
|
61410
61410
|
}
|
|
@@ -61412,13 +61412,13 @@ var require_escodegen = __commonJS({
|
|
|
61412
61412
|
});
|
|
61413
61413
|
}
|
|
61414
61414
|
if (expr.filter) {
|
|
61415
|
-
result =
|
|
61415
|
+
result = join18(result, "if" + space);
|
|
61416
61416
|
fragment = this.generateExpression(expr.filter, Precedence.Sequence, E_TTT);
|
|
61417
|
-
result =
|
|
61417
|
+
result = join18(result, ["(", fragment, ")"]);
|
|
61418
61418
|
}
|
|
61419
61419
|
if (!extra.moz.comprehensionExpressionStartsWithAssignment) {
|
|
61420
61420
|
fragment = this.generateExpression(expr.body, Precedence.Assignment, E_TTT);
|
|
61421
|
-
result =
|
|
61421
|
+
result = join18(result, fragment);
|
|
61422
61422
|
}
|
|
61423
61423
|
result.push(expr.type === Syntax.GeneratorExpression ? ")" : "]");
|
|
61424
61424
|
return result;
|
|
@@ -61434,8 +61434,8 @@ var require_escodegen = __commonJS({
|
|
|
61434
61434
|
} else {
|
|
61435
61435
|
fragment = this.generateExpression(expr.left, Precedence.Call, E_TTT);
|
|
61436
61436
|
}
|
|
61437
|
-
fragment =
|
|
61438
|
-
fragment =
|
|
61437
|
+
fragment = join18(fragment, expr.of ? "of" : "in");
|
|
61438
|
+
fragment = join18(fragment, this.generateExpression(expr.right, Precedence.Sequence, E_TTT));
|
|
61439
61439
|
return ["for" + space + "(", fragment, ")"];
|
|
61440
61440
|
},
|
|
61441
61441
|
SpreadElement: function(expr, precedence, flags) {
|
|
@@ -87597,9 +87597,9 @@ async function getConnectionTransport(options) {
|
|
|
87597
87597
|
throw new Error("Could not detect required browser platform");
|
|
87598
87598
|
}
|
|
87599
87599
|
const { convertPuppeteerChannelToBrowsersChannel: convertPuppeteerChannelToBrowsersChannel2 } = await Promise.resolve().then(() => (init_LaunchOptions(), LaunchOptions_exports));
|
|
87600
|
-
const { join:
|
|
87600
|
+
const { join: join18 } = await import("node:path");
|
|
87601
87601
|
const userDataDir = resolveDefaultUserDataDir3(Browser4.CHROME, platform, convertPuppeteerChannelToBrowsersChannel2(options.channel));
|
|
87602
|
-
const portPath =
|
|
87602
|
+
const portPath = join18(userDataDir, "DevToolsActivePort");
|
|
87603
87603
|
try {
|
|
87604
87604
|
const fileContent = await environment.value.fs.promises.readFile(portPath, "ascii");
|
|
87605
87605
|
const [rawPort, rawPath] = fileContent.split("\n").map((line) => {
|
|
@@ -89417,11 +89417,11 @@ var init_puppeteer_core = __esm({
|
|
|
89417
89417
|
|
|
89418
89418
|
// src/services/renderOrchestrator.ts
|
|
89419
89419
|
import {
|
|
89420
|
-
existsSync as
|
|
89421
|
-
mkdirSync as
|
|
89420
|
+
existsSync as existsSync15,
|
|
89421
|
+
mkdirSync as mkdirSync10,
|
|
89422
89422
|
rmSync as rmSync3,
|
|
89423
|
-
readFileSync as
|
|
89424
|
-
writeFileSync as
|
|
89423
|
+
readFileSync as readFileSync9,
|
|
89424
|
+
writeFileSync as writeFileSync4,
|
|
89425
89425
|
copyFileSync as copyFileSync2,
|
|
89426
89426
|
appendFileSync
|
|
89427
89427
|
} from "fs";
|
|
@@ -105679,7 +105679,7 @@ var serve = (options, listeningListener) => {
|
|
|
105679
105679
|
};
|
|
105680
105680
|
|
|
105681
105681
|
// src/services/renderOrchestrator.ts
|
|
105682
|
-
import { join as
|
|
105682
|
+
import { join as join14, dirname as dirname10, resolve as resolve9 } from "path";
|
|
105683
105683
|
import { randomUUID } from "crypto";
|
|
105684
105684
|
import { freemem as freemem2 } from "os";
|
|
105685
105685
|
import { fileURLToPath as fileURLToPath3 } from "url";
|
|
@@ -106038,10 +106038,15 @@ function createFileServer2(options) {
|
|
|
106038
106038
|
}
|
|
106039
106039
|
|
|
106040
106040
|
// src/services/htmlCompiler.ts
|
|
106041
|
-
import { readFileSync as
|
|
106042
|
-
import { join as
|
|
106041
|
+
import { readFileSync as readFileSync8, existsSync as existsSync14, mkdirSync as mkdirSync9 } from "fs";
|
|
106042
|
+
import { join as join13, dirname as dirname9, resolve as resolve8 } from "path";
|
|
106043
106043
|
import postcss from "postcss";
|
|
106044
106044
|
|
|
106045
|
+
// src/services/deterministicFonts.ts
|
|
106046
|
+
import { existsSync as existsSync13, mkdirSync as mkdirSync8, readFileSync as readFileSync7, writeFileSync as writeFileSync3 } from "node:fs";
|
|
106047
|
+
import { homedir as homedir2 } from "node:os";
|
|
106048
|
+
import { join as join12 } from "node:path";
|
|
106049
|
+
|
|
106045
106050
|
// src/services/fontData.generated.ts
|
|
106046
106051
|
var EMBEDDED_FONT_DATA = /* @__PURE__ */ new Map([
|
|
106047
106052
|
["@fontsource/inter:400:normal", "data:font/woff2;base64,d09GMgABAAAAAFxwABAAAAABBWAAAFwNAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGoFQG4GvRhzVcAZgP1NUQVReAIU2EQgKgbtAgaEUC4gOAAE2AiQDkBgEIAWEXAehBAwHGw7zJ5huOl475bYBtOPXkPVLdAHVazeH0HNrHDdaqtTZgdrjQMa0T/b//2ckqDEGwlsHomq1bYbCsDBcZiTWsxNV1a1G2qzqFdVZ6UNgIaKzpsNF5bDt1lmK+4wJAuaM6cYjQYIECc2vCjsyLghJw2P1Eb2H+sS5+Wk9BoiB3CSejPblcoR+3ffTTvu8/ve22xfN0DQ85cPFRX+v6vG6z7bljR/7xPmXScNKt68ouQqMXTYjYtVJX3rAuh7+66STnrmP1E7SN3YCVwSnf56v259z35sxmzEGQ7KMYU+S7PklhdolRUQb2oQ0DBOTtMuv+b5la5Lk+6Xla1o22j+jVcumkt/XLmNLG0Og5/+VmlXaGqU1ahZdRkpqRrasQUJEkIREEBIhEYmVCLGrVtWsGKWLDtTqmr/RVsd8Y63PP3z7Pez3GXkXT5AISTwkGnQWVURDshJo5df4053//92se+ER6L1RoHLOsGPmXzuRppkpdaZD6yNJ3gr80t9VFWRNfPs1e6tcO75VdVWAcAuc5C+wcP4wslWW59soiILr/522W/u3vZ10zaQzt6dGKIzioZASo5Eo/BnDWH/pvv3rECuvT4dWnqFdxIP4YtVDNNsvJTM7/UN00eqlPPIQPZPFTjQfC7N3nkPsf6fN87AoixIohdMo5NrdI7dy7U+a9nZuT2iGwmr7AElOl1FUJ9bKOYx/qAv91ZQ6c5qdw+Vg/MY7fl4qhyNSsYxHrCj7oh6qOBiI3u3svWAaiNV4U2FFJ4hmnqBAcgtlAAcjt3+u+f2jlywXje1kE5ZsbAFYu7tStUqnRaIW0FmsI+8810rvbKq7N8YH6cdjAAGDIbQgSN0TpHhHroe4erkz5Jo6YqndorjvvCHXUuesDZI3PvrU+ujz8Ez0zqbxp/Gn0cPz/Vqf+v5Tk7dAXR0Yl1qhI0xXTyL9QP9NvTkDAe6E1V9AhdAL5X/FAikCR45AhXWMidARlq3/zbTsztsri7qQVoVx8DcNJvWTjjuXUlWzMv83VanHvCRthYILS+BYAxHbJ71f6XpR54RrAJLvfyd5SO7YC8C+Pl4KS5lk5LB2y8WkBNSVaV79rM1jr/HzvKCxgI7nEQnBxoKfSEAwdRbQ4+H75Tu7J6WqLyNv3JsY16TMzNufBLg8Wl+qXD50FUer44mxKGSMxP9v2u9TajK0prrtxhDhWKExZjN3XibtbfbM7vzej6e0WVoSqvyLQ+KQYNG4qgyeg0VpjsdriCbHv98RBMItjMg5dReew084VSidCjFOzP+cKrX9rKyl66kDrUGIzQofDKKR5ChD/wrXxL0C2rKUFRqzwteW8ObNgF7MQSSVjyxhsRL+sdR3+yL3vWzPY5AiYQgiIYjYIEOZnt9l/b8R/b/TsEHDjG+MtdZIkitJkiQZGVlrjb8NZ4hW2WUMq1jGmxxjM7fBslyUGwroEWV+GqpLXVxw5Vq/hQCGEf8qFIIPwLciTBFKKF89pPYYeuol1O479MsQjCABjEYGYDzkAcZHPcAsE8Nss4MFhYHNigRTag8r1hNWpi+swomww06FHXE67IIrYQ2Ww5q6iaqrLzBtWlT99aMgAtwKuBbErKnmNLWkrR/CbkLgGkLko5/0lPUZnp9FCcHpqxk7hNP3/ZnAFA04DhswUAJV2GEc9ebXJgLvw3L4vu4O8Q9l/sCmQBhusXfbQBuvLmC/3b9xpl/Dbz/UAnxMAogD4Z6TK9yn4GGwYEKIt5nBwWBoYe/XfZjquUFfUcNYlQ07+mHB3W/lhGsILw4jeYkXf3E/4cVZN2Vn2iIs9IJBjOq+XKY4LEnabImko5lgcRiS57xwYXf5C0Z0LQrEgCojP8JBg2QEVeCsP8VJBoyn30MHTUXo+RhV9DArpkJOoZdH9q1ySOEUTcGB9BOYwkIl8pKK7wL7seHqbIZo0ZjnaSRC/SwmX8OogW02q95gbQQrWJCUlxfMmjK14Khau6qZFSuaUs1dRbMtU/w79riSSa4NCcdb2hgjDfvA4YGeeFwuoppaSYeNDPKFm5WXu/g8i/Xi6SdbOKqcRzEpIP/jcKsrE85lNpXy5qIjcSDVe4WG7zGcKXg2+1GnRqUyBeI1WrrbDjlM8C2ipiAlxsflyLHQEKDBxBgKuXQiR/+B2zVSB9e3FrhCtv2w/GuGyV8oscN8SznYUdzaj3K9+Lza4/pOHH9eMyXISWZbEbc8bb0wahdNZ0zlv37U9ZqAWkSDY6qOyVsQGqtFgBN9nFi7aGue6MQ7Jmvl3nDcRZJMOpwQXUwCSxpSkibiOvXHGNZGqwbZXXZ7bvCUe0Rtv502qjch0CrZR79TvZoWCzM6mtHjZyVvG6OIKEQhClGzoOXOOItxJ62cbAfS4Xc9SJcIcWlU7kRFgYctXyNi/HD6EwAYKLQxGjx36s7VyaYN0dwQ/nDUQhzSNDfIIlB5gpK7iF3Mq5p3sqJbwS+lA7mI07RokLZAkz6hlKVBuKSXfFNMMogDccjVtOiNDWD0G3sk2GQ3KDuqjScBMFBoY4BrfNRzQE835+Vyah4NDqu9shKRizhNazYDYSi2XgJkz99bjrvjMU3VxH08RR8G8BXf+L064qcOOQDO0m121plNXfwRC5jAw4Y8QO4ld5HbvdwCxs2bmJVR9l5VE1+JOXf1vLOe9LfVG9iwxTy3T6NrjXfRMbitfDTuohn0iGs0cDmdv2PT2WSHQF903t4Wvks7oqZOjWKQNMTw67kla9AgDEaXsBHTc8clzRzMj+C5RFszIKoXwLmB3ohDdYMrPd9glPmmztp7NhrCsSco7htH6fTq9siIIxNW27xFoB9jXgjiRGhMXwbUcXX7clmcfcV8yw4QCgncS+PtxW8HjV4dyZfgsumIYhzwJ0cDCpzWc+WmxQ8WAfl68GSpARRs0JaCNV6Cg5DhOgZuBFJ2xZXfY9BD8IDr0cdlxI0ud/OMssAuM+yhtEm+ApsVq7ct46niAtdpsTOzfdfKPvYBtonR17SrC5JzH0OABjam6188olpdfhJY8+U9QoC60X8YqsAHxnW3RIMbvC2YDaO4WCZ32U5IunP1vtL59UGVcFua6WlFMSWT6i/hqL/wpxMzzPYvHba4G8NF7ep+6zW+70ebhFv3LLp8mSfKJrhVZaR18iJyQbmuBVorzc4VcMhTez7eI0yiv5otb05YUnkbYUREeCsT4kptWCzBCWNacyLKS5an9yY0zWX1QgQTlSzFtrhr+/Kx5nARvSzdJnLtIhKXYdePFy3b0ywzrv5Taech/fJ5WLR0l/OVFwBtG5FE8nELnYzfahqAOP4BOcHBQhDDCHg/i0aXPa1nk/mroD01vDAI+i166ra3SaTJUrRwwu6DyxW1UBDv8+hAboUbHW5PK0ziHWyxzq/dWBj5Iqr/K5djVwlWu9H/2jJVHfFxv21E/Ho5auu73oUpPS6FI0z7uX7iF47SZ6qwKT59sm7zMzdEwacZg1kjv0nbu8mJKC0IyXcuTfwZ2A9WXvUpXIlFMYGKjVxgZQXcrOFli24Od/HzyI9eAeEZN+vCqjmHJIXFdCg8lk9FxWHf4nI5troCbiUl55msSn5l0ze5Bq1Nr1Nnc+vSV2j9KLwBRTSshY1GFNmkqaKavhTd7NvFtGCxxZl7aGkfeiMOEeJF3KFG3tpQjhcBwihgGg2cYwDLmMAwFhDGBo5xlmDjXRyjPJA884J5A50PmC+k8WB+0AWg32RMCoRfMPymwW86zMIY1XyowpEUARYF3SKwxdAtgdvSm9gtKwen2PivfFyCR+LLxWp1EjqtrQijZMDWISoF49bXV16aPFpWGVJ6Spgc6DaAZULKAsuuk9+kprcZ0W0RtrWe5bepP9ypMd12Ibo8WfS7mO2WoD3LdCMYG1FD5hVrdCWyqlT2lcmgco1sr8SpZFRlzc0o75yq0jJblIoeZh9u16OewJ72DMGZ8cUGK/gYQ+GAkSMii+3wtYeLXDBOaViwZMW6ibIkvk1kIYiONG9KSAIcrl9QaIJptIqpYcexRv8hXjP6vVhZAUtW9Kv26sRdEnEIunDgogsHdjDXCtAlIQ1GYsZIzJpYS6I8ie9qZCUxbaKJHgQxPAzRg8ISJxhYa5KrOGKKHSYIsUCSHNWghyr25sgh5IIGbqD9rd1whdrRma2Wv/K8Vb5NpjSxFnDISBgihTrIQjbOL7WnuMEMOvU6ZcZ5epOK4IaTdSzoOwMz7zArOzZVE0xicZKw0iyQCBlkF8a+DGHzBaLTGS7HHR7LH/TzwCj8uKIUqMbA1uqD5Q8kGZZOFMANdRhIiO0M+nTxOb4ZBKDzWSIADdwqlR4d6ojrgS3moV3okCSWx9d61JQGSKDbIZUqjXPHLVeHooiSAjLzKrL4+rk4sUnhSo1X1mUhZaQgaYoMW51Ak2YtWg07bYXyJYeWdaj4Ewno+sqUl+6bogOjDGniwQxpM/3IsGU5HMRwzHrYsOG2AnvYUo47SOoh48H5xBpG1cibF7Sanfth0bGHoQJA6IUwlFNMr46ViE87Sr0351mRGxrHROgp4QEYeOCZqC+chQfiJ2IF0J4oW6GcIydqGtfuIbNjY6Yz7OPKnKhhaIdRunUNvyvB418idxTYYt4UsPqMlhx4czzzSL2RwY3tL7vU0fv8n9NDMz4MQ3z9GbnjFwMN7vrhUjgEmQRJnmPPX6an9MPTRR4Icp4XR7bHQ0QOtu6bZX1Q23ld16T6S4I55wCghu66/jl47UAMxvWth2g/pz8RZBhWp7KT2Dxmrt7otztP6sWUS+fJS/wm71oEhfKpjDJtJAtyhHB3OxUBOzpzP8MFRgPiaxXjltXrvhDgWAw45cb9bXiM57OXQ5PXf9yuvRcoN005dkhBiHQdWcsyQOX7svD/ADsr7V27hUTeNSbWC08c2fW2J+TIfjAdqzL5Jvhp/kt/yaNbc0wy7eo7S3ozUV7S/xnVMIlqdYhMsUTD9AqSbkQSjNUj8FlHJBiUU5cOafWxk1QtJDFzDHgqGC3PHdlS03ZCM9CwW590kPFSZJGjLtj6MWa50dae0CezSr/9/lCT3HAG0ekC526uVgk2i4WQCaykCAzXDditxozRlsB/MNXshtdKG12QeV009+hcgmAynnwiJAQpjuoY4CvV0Tlx1vxVcXQLVU8cl81XX3ZJAkQ+6eOgh20Zagh8TrqmzSWdZAh+t7qlG9oxEwCUKNDydVQvf8TlEEF2CVwKeJlfNNEmFnqTqM53bhE3lSLN/IB+qm4pIiTORWVXjlUf4XffFzHxLdzDldV+6TPTDxwF6V5C1ZMbhaLMBAUd7D0Joc9WUVmQrub4xzXWXtPLW9U1Qdh36xXDHnT/wBYIP7xdgpcpsNA4bEpP3oU69Kto66vlq1Zmf6rfRbGlmKLb6bH+v3jUWrBzJER4FpqrJz/wG9U0C+2cx+BEXvuf7QqlkpCOkoRGHRF5bF1g6XXMEwy4TKnWcx33NuIkAwFyZFurxYhbB4f2hrvZGPs/FQvJJIbEygM+2ZUPjbnxk43NriBbdBrGgLhLT2/1CkcH0o/sMflP+u0+1e48ZF/PVh8268z3NWnzi1516Weyv+8Ij14OuxucR2PD6C5WqVoAMOjSFFH2rd/7w2UwWDAc2FMiFXhDnH4lRF84AKef8oDkfWZQB898hQp45jtmTbr2jexmJ4+476v/ZzXL/YW0yPuecrSWq4qz6CoC55gEV5ZOtkdgJjn/r1f8j87Vk3eGi2HER3h/Pu4t/udBdOFrr6H7ffSBG1i9C7ifDt9Cd+pi1Tuof4mwXyy4JLMuFuAkFt3lMqhR3X+/owGqzsQUlJtXiOLwcmXsUp1Ct7xaeDpEh1mPVbLvhsnELfB08OSKbbZ74N0aAMZicz2ZlEIdRiK+f/n/GfItghT8jIFMGIqNXAS8fTcotDZotDUY6OAwR1lZOiwnlgdrF2s3y4vlw/JlhbIOsiBlsYc6wevCIDXrkEdTWSEHC+s7/ldFILYg9DAI6ENChmhGJJA1WzQ7jpCTUQw5Gw25cGVoLDdonHGsuZsEBZiHFmY+tMACtHALoUiL6IsWQ9diCdjWSjJCMilzqdIIySjwbLSJSI7ddOzxB5RvH6JSJRv7HUBUq4H+UkvP3w6xcNgReo46ysIx/9BT7wQTaueg866gXHUbccddlHvuIVo9QHnoMa4nnkBPPcfU5iWWV16ZoN3/WDq9w/HeZ2a6fGGq21ccg74z9sMP6KefiF9+8TVkiGMECYyJQgo8YiADvGIiE1xjIQvGxEY2TIyDHBifJAmrbLJhlV12rEaau0nrQTDwCx8j+AjgY4SL40ZCGYUzo3BmFM4PWTbTfVbNHj1FSJQxwx8DfYaC4WMEHyMcsMUOB2yRIGYkfMbixljcEMDHCD4C+AjgYwQfAXycMMITS0Yf6ZTS0ewHSXUfG/W3YVD9RnrhTwV5sZF3bA/eHl16dLIDYYzIIj7OmBUdEhKjM0XzHNFk0mQKVvY8XPPiw1QRmud1dXKkaltvCAsbJFXjsPh2uxB5drO3RwFUbB/MFCwxg8DGDnbYDQl2eYooSHsXZgdmcOBXhVBMhoKLFWK4GuQFyCTG4Ys13o7PCKboPRaNL7qgUCmrAgCuAgBmxpoRY0aMGTE2HpeGQqGcMCQAwAAYRkgEI8TXG53G1c0OgCUrltUVAK5CFQBwglL/AEMwW2ImDEmmRuXY9GyCKs8+C48xLo1VvP30H2NoWsuUeWIcVUV46C0AmMm6J+gPMRe/b3wlOcD39sMfAnh79iMmdHgfonzzhV/cV6iMdVMk33+w6eItvy/v0Ct8oXLy/rYM8GhdE9yKJvRq2Wh9XiYxyL+jYyGZgthOO41RqIhrDnG3suIJ7k47Z0J+eAGG+17mnpwNCCqV4KRMTbE0LTK76Rm40QxzCATSr7Z1sbaOrp4+BBNJZAqVRmdzuDy+QIIZGhmbmJqZW1haWdvY2kGOMPOFi7DQHkp/qHZQjb/UOqzOEccc9w+1k0457YyzzjnvgosaNLrksivuuKvVfQ888aMkUk9aWslHgM207E7OrlzDNV3LtV3Hdcsh+kgxJcvac6VESZF8TOukWE9aUp4Cv+N3f+/s8yUyrn013TMwAd/QDukDMIBvNQHgNHDQpwauUcytw2F1jjjmuH/UO9FoSkfPmO3t/IhySPcwBCAAbev/7zw323VOqTvVsKwjDUs+OErX0X05OpBbXxzs+3H+rkjmNrNGpygEHyhKtCNisXBIlVOqUK1GHb16z2x0z6+F7vW31LNFZT3Oo4+9otZNh5PkZLhP+/f93a45ea7sF3rdUewunz6Rbayeda3GdC6mUwt5cFvGwn0DUFeUTktcipaglmym+1JXXd9tk7dnW+UWb5xPChpNo+Hu6Umtf8+cPDt+riiERPkOHMkwjg9mY/FtdIVZwEK0TaxUqhRU84tgR5xW5x+e7oyLWRq/zWzXXDfHEy/N1e6ziLptfEv7UGKJ6ksq6V7JRc11VcuU0kaqabXoYVn1mF43lH+T52gFFtnh0gcnkUFuw7vJcvCJxUj56OSOJ53Nhb8AgeAQkFDQMLCS4eAREJGQUVDR0KVExv/zcDNzJQ9ZsuXgExDKlUdELJ8kCmhIR0qUFPWuO5Gd5Fu8002rR68+/QZ8vUysXzYuPrUAAAAA1aSRekxpITtCugxyG2TKooiNR5dtU6lr7aESJUXqsaWF7GDpMshtkCmL4nsqJhNd0RlDdB7srXe6afXo1affgK9TA6oSaw+XKCllMdORQW6DTFkUl+1CUj/QdFUkH2qdFOtJQ3ZAugxyG2TKoojOw731znsffPTJZ920evTq02+g+1poG9Kuozv6JEukJgUaA5MOFjYOLh5dfHrGveMRhBNso+y26YMlyFSF8Cj1+njTsag1XcJBXtzlqDVApR8A/SlRnwMlhlk10pLPqJpKLvgcw7oqkeg0BR0yF1FfnEjCYeVKojfnZpgyUuivKi3/YtMcI/HQH5b1G/h0UfLDFupb6Wj02j5M6sU28zaQJqqOA66th7qeT6eTcAfTo4Tzpn39AUvzY8p509w1ouRg11yPtsO98NIr7V7r8J83/s8PZ7QGfeu+TwP+BOPAOkQVWvp7mWFMelbyZXzw6iwi+UTDRkkPfRxCOjUxpe18ZSyf/PpxZ8vG0bVejU6+t4cfMnX7FC20K8SoHdiO+6NsGCXI+LikL/iWrYguX+39fD4b+MTHn1uAA47DudIuqC+Yj/lEmk7N4zdivfqVlCHtM5MjJH4uirHyy0Q3Mf17ZRKm/Jhzggk//3kE3r9vupnqBBxhhgLUyb02Fg4ePgEhQyImTJmxIAayaw9xxkwS1uzYG/VSnWOR5I2kSpIjWbbY2uoHLfMtt1jGLoBY8i/FohvuwlHIhVjwQ0LFvNO8cvo/BOaV5vk8yjVfXvPSNVX/mwkfczlABATCQiQYFw91kY96KEg/YQYZZtTIzLJMnHkWWSXJNruss8k+h0QZZ9KITHPMqVE5NzqXxuTa2MblnkeeeeWdT76Nzy2/fmsCghNBLkBPKhmnGVEIiohF1KI4jFtdPpPWVsS01PSZl8vYmG5121h3aZexHWn908wMB7mm0QoqPGkhQ4UtOXSY8BEiR4kYKVacqrlfVnnKuv6K1FXWSJO2qhMlKaPr6OgZLSLyAePhBGC5OJtNmwnJrzFSTtWHnxG3zApJ/lj6UEf/9ab/6+xt73rfhz72qc8IHV26QE8KB4soHau1FeCVWiXdcjUmqrWXjDGBJ1/L38hn+ApPjFPMicns2dv2a/uh1/TK9+wdt4ftQkH9ayIsQQcl8M+CJgiBIQwo4EMhBh1VLlF9ay/Y10qmmHCEhXlXcDzJk4gmhiqHnaF+KikzbpDkStDtmStqKVHIVcWrOHQGmQXPRuBuNtTMfHV9xKFKZK6Uppc9sQjZbXDXxHAkhRIPI9MfDQfV/V7GI/To7m+pmt1T3sEfXtkw54rfWfZZ7QYpmA4Y6jz4+HYEdSFIFHIBujYa3RWKzrq0Huhy4LxxQLE3c1UhcbF519o+xtqGxE1tXfMy9EpA4lxalxSMvMISJ2rXsDdyLdgsF0reDAieaZkCCJR15xCAgMLMNwACse15EyA4c/ec1+ZxAIH2wZkPIHglTwMQrEkXAQjmxVMAglJIMOMDIKGGw6dmYDYj6kEvKfN0SqzwuCnSH68nenxuLU9kQ9XXwd3hcHoZ1jr0JOZ24eADEYa0WUMNzK76DqeRWtFq0PnajrLGDama14eeK8wQqjRz+tDhNEQRu3D4kT+P6bVXZFDdn3mkoKchYLcVvxuCgwZCj1HoOl4lLXrfzBvj74Uvvi0x46/ig3GAxEG3xwc0ALPIHmjq/AbxpuuBDUPrNP8U5JX6HWRp5+Cp4JNFHRIsqOY7GlSHbmYJZbYLZeEQYAGWcYXtmncoesVE4AJs8Reh2HX7cRqQfOhTEUL3woDdqi6HMO5sIRAxWo7jxe/00pivrCq5qGerLJnGxRdABy48jIY4in+7CZwaPz7br27u40qOiU1W1jF1XzfxyMquWGn/6fAi6cEceq2VK5W4BDi/YTa7I9LVHELbzZPdIQDyA8IkBrxhu2NGfQs6M8mPDB5jWPA2HoSqLFq4Voc8EC6sC3Bh1MBBCOTIPweYxtSuFDmRVL2MxIEwKBfzAGQ/UorOyHakRdmELCRNdUpsDyVpQf+uHd0D+vjPg7oXe1KtqJR5pWFhIdBlsvVIwYnqTa3GEtlzqU6PhROxcRQsXTElDclqVr22G8KMofzzAiNA7CJil1Z6G9Eqq6HrrP229g9OgZVfPFhgtil8ORAheJh9RNq4zdMOfOCrA4iu7cnzH0J56RENoTpVSuy2hVyyeDHU3y/IBJ5c2EVgoDeoslXtlM1l7yHzG9lcy1DMZSxk7bdo06X2uXrcrmxVZ3uyJEuyFdkRGByI49/yeuflyov7+tKFyR4yXn66gg5vrhxImBERBClm0RkO8Rji/zn3qIe+2G9cnvfWmo9Ypf6M1FTF3P12riIqCN21oMNrsUjURihDOUVE1yoF5qpTCDdi/N+JqH7cBwLufJgWYrp0p6wJQeIJSBs1Ik4OUyhUMdVCYHLClNGNs4gv2Gre60qJ/r8S/0v/9vTo78vv/R/ht/p0SHHldV3T1Vz5FR7/0o5y6Is7du7J17rKNdHALpYv2+p6q+zZNW3/dqxhNStf8fI2ZQkLX+iGay5abgtX/ze7mUx7YNBYI8z0jEzPtEzdqEY6wuEMbbCTMMMho05nalfj/F9dddCiuEG1nu9EB9rZxlZVUUmzyyqpyMY0rl2xQkunSw6ZpRuacpxIOZ2T6Utb9FGnJHnhhhFcYImKHz29NE5z/x9vPHLTiSMbnvOUh9zlJte43IXmO80Uox1nZteyW67sUgNaiIup2jW9aZyVSf3qkEEaySUWTykiCC6oQplC4lSY/8eOCW0AhIXANCP00EIdKqQI4UADSwJDCCodalM3hBrcaoMVwwumXQGdqVOtYLnLXtokyx5rpCEXMzYyfWjCKhQh3+3M8HrxJhCHot4hVcrky5VDroRYtjQ0OHAxGEKHtDQIixDsONKeddtzdCXdNuV2I7T56ZqZGUmSAACoqqqKiEgyHzgPNDcboZXNZ2ZmZiRJAgCgqqoqIiLJO3eYEXphZmZGkiQAAKqqqiIikowhJkmSJEmSJEmSJEmSJAkAAAAAAAAAAAAAAAAA5CVJkiRJkiRJkiRJkiQJAAAAAAAAAAB4/DJL2FWjXwcDTfLE8UqJEDxoLtlkmiAm/NTjnZce0LjklDpVyuTLlUMuxWrLRAozu3UkwLetTvOUy9UdWUoRy6wEmGVXIUFMpJIkSQAAUbS5GY1MN2reDbuEDUemrrMaRciglYECFtDUq6VSIFe2NBLZWEiQYsRsIkEJhzoElfPSUleX5O45vm2MNCUiBvXw1x/XRfLkSFeILw0FWhzGJWupEMD/aBGPVc1L6Xg1VZSZPEn8ODHCnvf4tTPRBhCLoE6VErttISclxEGDlWCIUHXUCMHBVg0qwgVp1VebqoJyyy4tSdmxIoUsrmF+ZmKtakjDT+lS+uxIG9s4Utp5jydyYjwpCOCgQiaEU8Cf7ZrUDkJZCdVVVUm725I8acI40cKW0DCSWqcaEhjU5Y1n7rqhwSlH1VApsts2Csuhxb/i1T+AHxzdpUlKSIXAewoeUiG4+9/c93M2QpOZmZmZkSQJAACNSZIAKP071B9T2XwKCTrjin6KAmJNDJtW9kBpGtjN2SdBYb7tpeAM6PttLOf9wO0h7JZyA+EzUwzwR2+LwEpNBfMHB20/cfJbVRpc7dZ6r3YXOwEzVtTd0prx/jPZvfnq1N38ZQo6GnBvO0TdTQ9EYCqBn0Tdjfe5Y5DCJlF3wz1CtFBYI2quf8joQXHDbaLuuj4Yb3Wl8NqBLA5b7LVGxtH0307/AvHPd8ZZ55w3a85l8xYtuOSCi4QzRYz6wDXH0Tkj2rcOB4H/bzJMG6y7QQS4HqOuVM1AEi1o4ljQo00TtSpK2ZItE2YqP85wbcHVJJkDwBaQBdXw2M7BoRse85wcxi4e6zw8MRse+3k5OmdxTuflPdZZPJ3PwxP7LJ6uzsuDc14e17hgDve8PF3zvPyxCnuXMcAQOEVJRlUytLAHk6VUj3xGAm7k0JY5/lPOHzZg0JBhI0aNmzBlkslJYxE0JSCHDF6XT/P2OjMo39GEzqTmv3oBflSkhcCD3xV0p5MwvpjsxTW9VNudueU05h4Owk4jky+e1gLGj8Ar5xGvziL/ibu/cfvn+rDa16N1cymWZKUtt0XTPbN9NvRHn5ZMwRx+P96whRtn89sEPwQ9/tw6u0xLMtLakZN5+L13PUrdDnw2I3hhBrxxxRkKCV36jb4XN317rSY63LlcDmzUW2h8LVoMtP36NaOvbaa9ZLLHaOyPX97ntFnL8VnPDxI/afjRpLHJu3hb3+L/dnjjf/Z56QsaXlfbfS6LZ/ObBx+/8iN6TTxY3nd0efd57Vt+e9M+LWi8ZiGuty2awL9neMsVL0u8hGjstXCxe8EdznXPHjjFSZmXfeOLjD2G+I65EkcLjUNli7+t0/OwvZcj2vEAWKPsHjx4wPTaVd66j1CVDffqW6FpCaMslVI0fkYBTd0OtM00D27RQI+eBnQarVvLqG9orJ6vXQVVpmqMrKREbQVTiWW5c1dTpCdyZJRUiymCNpb45TyxFgkz0xQTeHOLjAkWWWPcTCzLWcqStdWoNO+8au5sqcnKrM1cgWEkXo2T3ZgwuujVjUoRFi4jfFrOfxK6XlfiBeZ6f74Bc66rhDDNyU7GlLZFMAhizrDF7NDErNxyNJ/peszILZ5Pd/mMkDIp/MtmE2NCrwW/7nhf8Ol6H/DE42EWv7LPlRObH/3rpnCsF7q67xhqnZijGc4xaqkl1EHVtQ9r2JYaNs/GFhTX1pAVpWIrWppopu1IxghMwiI0mu9NhiRRMqzqw78ePQ/lzXBhQ0HDhLHkJE1ovyvHIXQJCBkxZs2OI3defP0mQKAw4SJFW2ytZKlkNsqRZ498hYrtV+0vtdROO6/BVTfc0eqhp9p0eq9Lt8Fa7EnRpwf8R/2wBKZk0zEiTeCAAdxk1aqeHfQR00U11XJPhRDSh6BrtoeOd5VyYnu6fCWSBam84068DpmeHSljgPXAeQv4wr3T+Hl5Y7AfYwMgW/Vjg9cDb7Kcb896f3PCJXA5dC5dhADn3x8FQV8WMF+2zMDt8GBLLG60XTz3Qt7+jrTRoOD9X3mZtgnwje/RSYMh7IgwUQjSJICADR6Qsnf8MC+OfPCVoaERC9xVelTlnsS/Jbh23pcPhTrDjW3euLJujmejbUOKptiU9e2I+Ep8TfGNxKZiC7FEbCceJ/YVT1k4bSWx+sPqT4lwaHj4gNtx5avS0cILHYsEc4HaKNbMG4pNxGaP3U3sAyV/xaIe73fHl/8f+nR5p+XlG/741kDNQPWAAPjj914f8dDXUa+9X89v7+ePpJ3UTnyVS36EwBOAl+k0BPpSQwH0xS+Gp6vPDw6yn8+/nGh+1SixZa1coUbltZ9VfoyxWVLo0MIgPBySB7aE147jjyPMAqvP+g6MqYHBmpyssCt5lxOEddxDf1Nj9iHg5fuwSYYCfLbhFnTM1X7XRla9JjfaQ123HqteVUDarYq0k7fkimWIkeybPoVFlwETI5gaydloLpzqMkGQYFNNMTmVQEsstcxy6X54YrvNtthlq1x5/lSqTLkSh9U54m8/NfpXk2bXXWuDG9q91uGFHn/Qmuf2AHxld7JTSSP6f/nCc/meh8d/1wWMHYB5LYCeCW74L8Bt3wG4ztPANSYArgGMY9Eksi2pZ2gMRLGtUsJGoUgBsBX1ZbPhzXUbYsr/0RNtQcRIdX7Q0ks2fD/HcEdRVECTRxzbtrY6/vviLR+XVgATGBMogatNOJOvUUSo0fPrWACzpa0SAlWPaKkTE7AH0T0F36qHZFvplgCphUlooAIsp2sYjgXdqx6qgGtr4rWhfKhWhXGNRQ+KsYeo15ZG24lzyNhsahXkFfTnDHqXFkFCqAoJRdWFKfJEyzuESitVkaW0UNYXTLND7cq4VZfYkunQly80u1ZmnU7T5nLblPmVwlqehgotLYRYPbXMV/n82rXCHORyfWlhnio6xDxTbBHLxXr7girMhYjyzMJtpKxYYmUK9lj5IpPPC5E+JNQbLDatbf3RPW1mEvlD95AN5qiKQuSqKmekeJlsF25Gx8J8Po1bZalRrrZr4kA2c936oUFm3jpSlizQMgtL3yJNLB1V3OSsTu/23VUotClCHIjJbN2qrNijqbpim6nq+cLYgp7TXcIEOomzIEcv0qURgobkoQrck9CSNmG8PAEjA6H7wQX3jr5PQNKwZy1RX0zMkiOKm9TlOthhgMaqmAM9YexypqTFMGOONKBynoLGqSkNaHMZVmmTVJREEpqPavw3Xmj8z3MIz6GmK6Ua/AKVvMEdpqrHdWGkRr/Hi4xb7v0KFfZPHJFkaRVrXJ8bwbEfj6loUB9lliysFEeUMoWMSI7XKCJDZVCKbZypQAlb7iDPlfhyRyg50e0I46oXyU/zymvRvYRFF9H9GV8w8yhdTWIJ3BGFkOL7qI6sB1W3lPT2s0BcTOvP+gizZAOqLlXcVdMQt8f6lNNAfSR5PMlta7qu0CzFn51Zdg755B62uY+Jdj/GJR4dr4G0OclxXcABF2rYpENjVMcsd8z51M5FiTlQTWlxSVNKJSO7jIB/jJijJV4UPcmhdscwmQevNWGIpVkCBnx1E71sBvtLMaKRj+zdbuYXoH5wyEjZwwxRqSAYZSrdVAfSMQdhcOzN8yIb0F8Tm+zvq5V9j1hdJNa6K+YpQ0AQ0jPUcqGm8RZwqaV1xQyqhZyzW+NeAKkSW5wLFploXpFJCrI6YVLXTebiOufHVt2sK64mIMmCn06kttEKZuTaXCN5QAV1cLzl87J9n/GalaT2BU4ghbuKAz+N9AQdO6MPF8BEy67KfMcSdIzaqoVl9m3CaR4y07Vr2cPekyQCWdukO61AC6vVi6r3LkVZOUGIOiGZqr52uA1pSosaGSJktlwJucSX6WIZzFzyrlRack7+d0alxUHqwMIsa4wDP/A+aJDqZn0jXzKYPU72qFcmyUaUUlTjZPTqhT2F2ygq+u1wW5AgRBUTHiIiiNrtl4hIOc7YZm3Tm14bKm2KMJt2opi5gVqnEHCmQueHK5xHhi6OL3IpFr7ZIcUZSrLry8duPFqp6MxAzaFd8e5VmsiKFvOFcoaKZCb5tcE5G1JPw0dqVrG7uWxfYid5pMcXcZTcPqH9tu8t+zQhyFAraL2MEnW0IAQDOpwXK/trqHeUU+5sGFh967ipxTf3669QCem3seTIrc+EkWWNq9bEMrLjSHLoKZQeBxMjcDzscm5vk3nYzjgXGmmLNlpzZpvTDChGC6RtehHgUOe9Nss94BjE6NSqBWuwOadl4hPSEA4yllvy11DQYPmmh8CApl0LHSN1xKaW0ZJ/wQFKBgrBgqGk18YRA4OqfK9btEDv5vcr9SUlYYCDRt4H+GPuQVdpetU9wB53b9LDOAinqpXrFe81eDp6AfqgPjIdwYzHpsH+mpl3gNGC2MRuEZs51jk40GRWoryEIloJBcq/YqJC+CoyXEualASwQtpwEtXbYIm00VHZ855OP5iB5jsRXeVQ6coXPNsXiKzEOiv38hFBzGF3bUgwLlQq+AtG8b0ocR6Lta1vYAQoxTWvMYqg384MPVpenkkM0ghKXyhWG7+fWsxQy/3qULPwWw3jZX9zuWr+F5LZvtSAIgYfWRJqkQ77ohp3I/0CRBc65FdaTC+0TNl1jHWiNqc43rWz9e/jq1nhvNFmmYbaTxh7OTuMqbUYNkK+imcOSNdzwh30zpchydKaDli0WJWmxmOOJOjIIfsmYpytOXmBLPL5Xrw3ru13zkkfHCnx0LBXGuHhoSJKmOqEjmmQIc7msX0Go2JFItyfTLMyw9crwUQZe1HoSudaO8qntrdneZ5OYNlUikXQjGWcbyvdTZIbZvTc76rdco5M6mglLI5HhoGGyjxKPdxdDvrcwQGvPzcZdPr67QF/Mji15CD5SclPS47ytT3jz5ruE3ouO2pKm2v3UA1VX1yiXIfjeYWPjh8NAVahrX84M1zR4DRvyF72Az6vplho8InMJCdGUANpher9nnJF3amVvW213yxrXkBi6fC5KbM7ysU0K3EtwWrKc3WoYJmgNAO/jIkSyRz2kaoSwB9UCyVH018lFjV3D3wHSnTGpE7rghj73l39Wu6z8++eksUnAZg/1YinZof44y6pUIps9CSW3k9flmsvIM+g7TiHn4bVsHCv8S1ER+MLbYiGTFWMC4NWuISaON15IdbrvHl4qiPof2yL+c5QMunh8NFD9LDMQN2ggY1LUqxkNITcUs1b7gYaqDbfbgVyHPhKAPexbkpHhqBNPyg8QLiMKhpwEc9Qdgd+FhsAxKu9oHy1wTXerzWjYzIQqWEY9eRaCx7Gyw+mWAygAbPf60jgU8ADJK1nU1DxfOGEM61lNXPXOv7zjn7A3cV7CFhQG1jHgIQCPDfRJ1r3WZJHtof9egtjne++2s9+de1q6Ldf8tznguNDrKvXHPuH4J1d8/pmOgdZtrS5ffWbxL2IfU7yo0uIIeofuhluGj4VLl8ZcccST0LO9d7P+Ddpz8pXoE5ZzM2RxrZV39Hm9a53RQ4eI0Y59Ea3dBPePMLzkXvtqv8kIUo7xpxzV0+KEqQdd5lvQMS1nl4vsFsqsKs/D5HXrtjuTzXbH151bwYy9BPAXbDmV2TJXltevuo5P24tO7T6Ptr856JQL6x8XpsHqipLWK163YP8FAkD9oHc+i1YIReQd/dDJfPJh/W1flhZxapC5DEsLbJ73POl6vk9p0EyL9WNjUb3qedksD8mXxMjRY1RmTHRPC+DIqxAbLp0zjmTEQCOK53dAqlQWh+ZHvZb3YYHqo8vQPtp6/1ZHwOAufzGM02Sb/58QwtgIHFltWr1/2bCimzjkl5N1LL8e9jQ/0VydeixjLcHxoNpE99nb2hFu/LaeG3+jyQpD0B8n5pf+6HMt52vyT2phF+ilgIOr5D+8MA7R8pRg6Z/TQDZf8OcPXH/m4GJge82JpqBVWrG3k9TdYMDpwfAHLAyb+u/K84+X8BDqAuTYdsdUZaN4ZzhUqlw9lXe2exx7ukOXRYeX9mI5+UNYSnVCfgSYpZe104CYT+4rIRenkr55tuplND5leLbSYMa8ZxzybITgSArJOv2Jus36iutVxo01ht6XbIuuJBEkDvhl3cUi2cHtbfhQJc3wbn4XWOp5YUTcvBZw4xiovYl5NxJwudfjpHiZ30EZmBlXgZWZgE30DTx8LMTEyd+2Zi4XaqbuPVfLbZhHQinuNzaNz+e8vW3cDHsnV9R3EcNV4vPO+dfd8Pgi/OotaHk2qf6SuvVZY3Vi/oGzYpYfF3fuGiKG50/4bSjgE//cp1jXUN8AJOjCXYG5tlij/ON3z9/RlmmGIwtshJ+UgzBy8HPfvscHJ68F4Hia0XKiivv/6yYbPO+FkJ+CP9Z+Ftwop7s+rX0aHBOI9eFwCq0HuzVyNGtd/rSnuwAmW/JaugbX2mA3Few5jY67QSszIv0g6DUopro+NsMkQdb9tftLVh3WaePufrTzYHi/TWH2tyxO3ZaVGMdqsLpvaP0PvDjeTlCRmoPpO22Zdr0Y61LB+Cj+pHvNQoOp86cQlf6by60WaSNDjQQDpwEp9pODV0JmZ9K+fYbaBRyefmM7pleY718ieAQ1ek36qMrDRqrUrDz+oGFKdLbD7Txgfnreyb2tL1oVlqcO0rSL1rapuvAOuOHvf+dbtdInup0ko132tOicZ6ilQJrYrFgjW3ksihgtQ8eP7459qL39+Sbwy+6l3rB6PxVheTR0bj3ruT0sckmRQsySZPKTqppxUa3J2W5A88KBkCbx/A3uboFW/U1G3qWpAeSKhhKyigjYyls3RGy62zEbMStpU5N/ZXPc9uOfsitOW8pXXCQXFDoeG0JZAmaxOPWQbidwStt0bUcRkueSnPtx2JgHeg0IZxYB1ahDcAqFP7aeda6Yc/3vRvLt/O5pjOZKtXpzAxT/u3ljd7W7zc3AKs8bnRWvgtP+ffwfODhZXJ0hO/6fmoGdz0E5quO1zp2YH27fPq2Unc6Uh+Of9e0sZNz/nPHnzsMsH5dvn0b8V2TG9d2rONs/nUPnfnNNsuzJukHnrs2B7vqQsyeIqefz8KRAFlSs1+O9+tnsYdQcZkR6f+3uiPSE3iHUC9jN/zobk0BzthXm5UnjrDCWd+GvIxgxaQtWysBK9sPIX0d9D6cQugILiIEFxM7DxIC379SJzob1OhDRt/thwv0EUnEdKt5wtkywTM4Wj46hBY3Q5AGXbw5OE7AMw/xNFnQW8jDl2mQvb5EuxyHyq1rIdboSF5uJIlSHI7GuU1DQwXtJWcOpUBbdtWRU/prP5zrcQiaR9NFJw7wG4gYNfL4dLIL14ll3+FvIw1C4GAxscTcvWDDQzzD97d6ptaIG99DY9ATtkqSZpoFAkF7NnEgXaBmnuplCxD5gSQC9vR+D0ZF1SWsXLVKrWh3yfSGBFDlZQMwPvtUjLGG9vQ4fpGsD6bRYak1LD7fQESrkZmoiCwhwOtXUrdfjdhH7Dfu4kilyRIa/MHJneJqLIpz0GXmNLAyz+11PDA5TYspaHpiLLc4V19m+aTZNCRqkqKXS+WohaYCca4xF31ZrcYsNYnpngkdyXPARt6Iv7Pnk1at5fQx7eZw+9RDbQ1RkJglbtjpsIVwDBqS7hktbZWjlqSFqCutMik0wwsbFY6/cirMFZciL6O1hwLYTuPT5jLL8/+UWzw1Ggu0GGSal+NeNbAyn55x8UZzqrDkIaFRjFlSq9GXjbm54qYC1IK8FL3cLAWynSNftWo2TddVWH10tIc9HdNUQ396HM/vsaRHFyKn6nkCQWs23vy7T/exhHBEvEnPHPKgV2gvYkAon9vX0bf1OvfnrLTq9iQqjO4CDe99ci+IjmdQ74HsefVcQlnu/vYMLZpYHpWtn9Y2vt9+CJlaBZfon2oqfj5zRPnfM6NRUoVGpR/YPnumoq364mtmU77QyMGcVpWh54zCXHGzBH1BKsOcac4G1BMDMl0L52p9IvquVGuLpzjchZabFy5V69tLKVpUsg4McOe4wO4J98JpIErubicXBJh8SRgWHaDb3/m++ebd5h2GBThgZZ4DVmanUxKtZscwcA00P5FnL74z4E9HUWS2oi4Wq+o65qp0d6aLlF1J7KxBOney5qe5z8r63DS8JCGmAPNy7v8fWZyZVBKHKmOvAlvGnQGOHig02WVudS5O937aGqJn6rSWX2DPUHG7DHWlsAi13C4vdvSnDk4MA2twetYlkHqafO0lig71qVHI6pE5sqPr15HvHR8hl9nT3tee+sRt+wD39LSDd9iAkO+S9cOFdb8HUDRwjJxwBXjslJ2Hy2qdM6eCd6bXMfmljTmoGAqBtmN+X7f/0S4FL79jgVYmG0Lyy91JIyH54iwJvy4dncDGZblN7O32b++SZRf23EwFc/TKwrnrvCrNTY7sVLlac1oc4Nime+5anyJ//rqobmx8TN7YkF/c215bPZWOzcNC5fDc+haFtKNOTAGBfG4fvG/cbi4IH4fEbMfQA7rn0Xb+fwz3NAD3rZG72Kx3qEeajeozBy5wTzu5j+tf1urzRjlnysPWquLwBEU8sibPNJcV/Vec1/EAY4O2QhBaFN/Co4j3HDgg3pNJiW8pCrYAH3bNcW982xUohNz3zIR7ZkLuBwi/7bqxa44Lel0h3JX6z3fnJP7jPejj1RP/r6dI9/lq7ee7hXH/ePXv8elL+Mczr/7zFcxVeLbtT1dCyODecZeUYGdm8ETIsCuu7U+QdLkGNAzxzY3PD9NJ7SEIbigC3R5Fb37+cESimyt9PPoXhEpoCoZlBsNQTYepY38BY+eB4wEFbAcMfhfZh7Nrjg8skht57/8m+77ruvcFK98IbkllFDkMtRVo9Hsjg7ZkjmNag5y9tpSOA3td6yqwMq9aze3XgqFX8pI1RVnJ1VeyoSpTlbApHiOj0TBlTTBhFYgrrU/zP1jA9ncJ2tr1oqH8x35V2Q9369UM9REmQ7VtT3rt47cPJ5lYtTru57VbmxXI1TnV/9vqOwbzjFmYMSEXdqGxXCpqFCPP5GYnnmoUA8YLYKNPBzb68Ssdt+8DrMwKeDkeGmtQzwTHX807ZdDWpN21Km9/6M5aqHn3URW44LjEB4EGjAFSvKe/JQAFZYfYBIEFz+WUZU3CowflLSUX0xWmbdLp3TvEdZX5mRWEI9WbKC6Tm+CRaYzoTE+GnYds3PbgggMJk4d06jp9mN9A174uAP/4GqLtIqQNkuUP74BCOjB+M9iBS/y4Yj+Yak1fZLW2UmS9plMlSX2zjlTj+vGYe1jprOvl/pRvvmUnzHV+tvgOAeicTV/OVjB+/knN/PLC2NhXFyqYP/2kKq1mTWMF3c1k+6UGskP37wWkYwt5y/JFsn0GBD9t9NDiP3z9OLn29xHfgb6G79xp7IL6aBWKlFxcGUdhqpEINeNinfLW40Kd7n6hfLGUeqSnfa3WiEpzOPMXUDl3fMipO7e5dNUKzRA2RjG5bTB6KZFKUfWiipRjytS6hORiIg5WUBZHJdRFMQQW2EuW8tpzz3NqjbeL8i+INXVnin0duI76pehjXFXtyqeFoOzg8eDrtrLviN4yC4eSce3BDIDdfwFYmQHdufaRsOL85uLLVknEXHUMPq2JTj7K5dG721K4qOZ95865pn7YNi6NOG/71BhGFE4na/XoC5LWqnfvqoDOOWMe0TOYvv3hDVxYi/mORFt5I6fy3Hb5gjvPWC0vOalL/WeWV1nEajhIrFqv1LxtM1Z89EHfbUprZdO7MtIpnc2paUg5JJUTpkhiUbtaOeB2iMDH4Z/xq+dCmL6g3Ln7M3HVopKLH6rNpznaSnZr5xUlpecfCHW1D4SK8yWKqnnRbluKY+0a4hBXWbP4mfjYyZxWGElOptM17VgOtx1L19DJRHk7LGeZrExAF+PxiAJVHJWmikMU4PHI4ooEkOasvZFTObtdccUt21irKBnVsf6d46mLWIYwUtVTjeZtq7Hyk4/0PRbp4BKy+0S608ObuPBm8x1JwTKy9HAqJ1wBT6F1tnA4aS0sehcnndJpTAXdftNZyfzppwrmF+qXF1SmkrHeHTeRtiw1kraYzVRZufgp5YEPQ71DLr/6zlWTqstUZfIVnwmDj6ZxOw/kd2sAV671PuLFoSK6ArzpJ/I796dxg4/mflKWKVBlKrsCqUivDKinlluqzTh3cfYieKBTdgVQEV6cI96aDHlVd/7RA8QnVfiZgsdXBX78z7HsjFKtJ9Qrg4rsClRmqkCmQPFJbl63Akf3+0RiZ8HFWQAQzkefSkouy7LJzU1KVtLrkdHf9xMhGG46Fco8cJASBY0QpBZEI0I/hr2AjJF5mh7sMXYOu/sks1A6nJLaxkZGyFhZfSGv0xE4OSoZVVgZT2OPYqvr8SvlM52IpZSCe3FY0ksiuPcWXPv5Plj/OfVrKIkUDdtDoUQU7YHVvC0+e1SwlpqjW9wCERFx+ekJNKtbGtw7c1KQwUl72apUNIxfEI2MlYRhcq1oy5srFWfWOIqaZb7oXIlSdIoX8xsJ65fL3pL6gP8Guvu3GNyP5TCRITw6oWCCwmiEis3drKoVZ2dVrwhEZ0fD9hIxfnks3E6E6qCuXeAFdxTOl+FwqjOEfik9FtehgzgVHmSeO6N5XrMGMt1YFwvCIrZW5cfiiujE/jM4lRyXJBh5V7emfgI+uAEbZEvvR8B6R0cvULmdecvOyxe0+sKD/PmtXFKS8V2q8quvylJeP1VSv/iGqH7yMKru8Ucir55812fI8waJHKL04SQ32w5u5RXrztemvW/Wi9cXVGW8KtSYPWPgaBycDUsm5ng9GlXTvhif/z89O701b/FWlvfFy1nea9d3CxYoPV5lAXdCjea2wJPuJ7BZCmJUv6I8Vq+ISqXJGPFNDE74cFE2uOUkMHc7ocyRH467H+O4H4vbfnxGn47Q1tF97t1pbt3gg7N6I3NkKv1jnQ6ajUxucNUVz7mjk5wuz/lkdKqUqobLr2pK1rXVrMFVdXnZdbV8vVpLWlzX+P7slFpx64Gywuak3A4vVd67h65Sr5x7SsffNM0q7j0A+9Du3tZ/mODuwK7o88CuY+9hwUrH5KlJ+64P45PjYOu7t6XhHz0ytZgAzGJEAKoSVUA3StzOamcy21lsZluIsthtzCibxWxfHthbHi+PakyN6kXDox4e7+hYW+4addV1fdY5lyJ33a3YBYIcgq5ytxT80qrcUNs/bNjIAHLrynr40BjM2GhiN72+/oCR7snu/Ksg2Ww7H3L1IUPkmU/59VIOPtw3GUzQ6vP+hABKzs3Jm1FHB28MAsz5E9OT0wA2JI2shcpK2bCYyCq5TBbwhBwcgf6pySkzPZpIjI4iEqKjCYQoSBOjfl3IBCgQMTehG+XgAXLi7ESsBdFfmPsCf53sB+MXN1XQjunhOJwynoIm/hqUgGanntykoh/TwXGEChgBzv0kKAZPBVwQfS7W6fg+5Glgcg2Bp44CwUNKn+2X39Ktz332i9ObX8Blo0Mcdyq40qP95mC0Cc/yyi1xHBvSmpUMsyMEqP/sz8QqfiQaWu7FND8i18t+4TNTZU1pxBPMzZgtvJ1W/CgfqoYwyS43pw0OppnLyweeeLnlSg3sMLukSXVLobilUhk7p1LeFswF/stMzr81W/594L7NjxgQhYuJhdIoIYHX2IMehWFhJW6Fa+D/43LZteuysrzTrJLurbyzjsl1mQxsGRpTlozFKOYJxDLkXEfcWQdefq+JlVd2XS67Nl4/6KpYX1e4Dg4ODF71BnWjgZmKZ+mjo+nPKiqMjV2vQi4QcDhy4eud2SP6UX3Wlzsj3DPdpe5Z7u1fZH1hcY0xxgBeiPiMHnZ6DycjvbcnLYPTnZbW+6TTerrfJcci6eHh9EhIc+gRchgR1YFE6gbCCAfFeqYhhlJMyxQKTuyn25Jts+2/8tqMTMWnpAqRsUNBPvgSTlsI4XCZuzgBUZx2wCSzq95Ew+pwuZAoRph4gb49w/4ayU4ETYjhxYFv6ysXJcK16lrh1cX8ysqF/NyrtdUXZiJ1C11MgtSQyZG1+WQ6baVrKeSIdfUAWZ+7D7tv/rkyiBngzwgKQPoHIYDTL8++G3TvrbI+IU2mFre0a50G+4hMFgbDSQdJzP3CzYzBV8riJ/X6YvMr1eDCln9TYfH3QBBxoGQ4ObvRlTcU4p6WJy7MKKaQo8OTMZE7PEZ/5QkgpXHx0VIBHmUZEABFFJNb7p00jZ4bDu3qDvblpQuFPBEz+XA4DhsZ4DGWFMQVRhTHJMYUCjFJVkG9cUSv1AhuVsMMbqvxNdsdSYWHeKOu3PYa/Ym+O56WFOyFfvc38Ik6vX+m1/ZlVc/DCmCTU1NBd/j1z0+8ozISUBhWQpSp5KKhrXuuLs/XGX4YL0inxvYU2lzYBTxHy7MHj3DzNqHO7hRFJJOy4w+Fi+M5hAoCMScu7AATikRnR3mOA1SaqCeWm9UWR85NQgrSaPbWYofiLCKKkz8SB9pgVubJJPCfa1Bv27PffO/uyNPu7pFnd+4OrffoCbjW+gZcO4GA6zAYcC1gd87+/cMn7VY7h0bUQCxxCpoawzh4CBd5KOLX8OMFA2qZ6lhtRqAPhV2WkimS26PrQYstvfYgKQU3mkfxCYshQw9CMEgiQ8OIRiZA9teF70sNjOiLo6ZXRxKYJYmx/Gg0NuONPdOOJiTlnKoFaepqxAHRKuJ2xpaH+n/Uo6Gk7v2gxp5YHoXK2Hc8HBm6L5aMj09gMhDb5oqbfY4ob9ajdl20eY3eGUhQoJBKIomg0mFAi+3BxN05lMT+6i72alc6m6CMJQnsYYOfJIVH4jPV6i0BcdEwtAyBKiMrRk8aaxIZzMQ4MhMWBAs4jRalZAFNSt+Wlm3QJtYgqLblNMYQhPDwvXT0kct2AwH8uERMljqaSqmEYrIS4hE5GrvuwCOh9Ag4SdgYk6ZG4uIhUCoyPpGChEKS41EiCDImIiIJGg2FQSMi4DFAYUdUxhLz7JOGnsIiIRGE6H1FdHtkbmwCuhSJKifRSTWNyWyLqtUefCK8v66HvXY0nXl0f1LoXoQfksFDwmgpCfFEJiBog6uC6c+Ue5WgZ70usA7oHmsdtVstq/hVUNeRGnQLubAP3pGox+8pRXga401h+R3YUtIvIJYUWRQ3scsAK8Xtgek79iUhFvbeYpUSfsGVga/tDnQdQCVA4I2+Pqa+vrNHbajxSII9s4mZNTR4A41EQxhqaFxeFS3JMMErs4p+a9QQ4vMQJHisiISHieAkREJeEuId6eNbTYPtnbhNGKKN7eu6jbZ31gKBq/yH1YiMZ+KhT9dbQltAsM43EO3+Huu8q9pTY8EmlVL2Jnm0JXt4HMNVWGTQikGK0X1/IpOZH/vVFFXnRa300LbSbEOIiYSE2tIcuxslnOQcGocmMD8mK6wbAiaoQlo4vGrdznE/8t7dHVIATHucK1618vHy8TnmeXKshgJMNVRuJ5cDFxCYNxRwaDk0TrJkpZ7mqP1QYiKhXelWQ2NQTV51UYTCFz4soxEoYIBQF6Uq8Zva4Q6sp3iKuyEAWWUtK5aOl9esZWt7RrWlKeQ9GBtDV3NNeQ8PlL4/UX18fKLt7a2bOuZQwMmx8k2JctCPRSfrDs8f62rCovC1oumXTR7g+LDyQFCNVyGCdzghXT4E7lbhTPCVesEpWMqHdmJEmQHKyLn2Hl6fw2gMjEaPzf5F1Xk12X8bdE0nWqiLySW0SCv/+2YyPDPlcDHg+skJ795PWpNbnfO30hFCUMijb6U1lIBIK9exKFQ4IGQb8kWhnt03Bk6lrpHJqPCIZGQkhDoR4eWIg+2lFufYX9mf+mhvN/v7aeDsMoYtQ6CL0c6UhjQ2WcFAKhcrnMrD1odAsNjDQPgvPsnAhf+DIcgwetXFqDAmkPZAbfGToG9YpIieDgw8FU3z+jQzLCXLMo1AZRVSy8GhTy+1hLY86DY631lzBpGb/wT6MqExU7235/6ucqoa7pfIXHW+Y3QW4qX5Wk/6loNgnXULuBFSftjpMs5uVhnJxai8VAFPXiZ8ptCovFhOPRg8d9i4l6tV9EQu4rskzl2bvCf+6e8+hO9rmVuXLF93kFu7oxZh+2ubFsL+n5xngwuvrvb7J2NED+h/cK69aJVGqrU4mz/Iv8b+V5bvi9wFAU5pxSVX3OIiN2fDTbVwbyNPf/VHUNd4ate/WY3Tnm7/d9BDf6cB3bpmC4Ruml4i8KAYwq+BQQ8XeGgaJhCjLmRH4/m7XivjzR3CvZ6wloQ0iqYGDcWmr9yo4i7uT6pbyMV6xk0htSZxtAvoDlrs5kB5dOTVyykevJzn5kNxEzPuPRK45ZjFmmOu6cea0WUp7nmhWdwXxc3fXqPEy4ZMfIkq8V0NB+W3TDCsfoOuF9NcvAUEKgAnEFBriasuDYQrwAcgxYObxgjubRVrsudvzvBwhaD8szQ0NWh0GPbVz180M/2Dsb7rxD+mi2HSqbAvvFlgE8Y/EmmjVEVCJdFElSxOA9FqMWi1eDMMrKXiFgOsScjfHCgPlr/zTz/MjwxsNtDJF3frvl57GwWGmwPJunnM8+Cm8d1oK7Dh+CWpqyEasnpTl8hakaxx2zQ3ws6BqyKbGHVKhnrZGC6/i/cgV3LsFy9A02v7x572l59XjqIPN1Nyf9ZG82So9/lldlrujjyt6ZwX3TTqZM8Y7EO+HijKQzeVKIVdWByLZ80uUjwdLnrhpmJNL/VM63e9raKaK+xKCEFxp+V5sh+Ij/vd2XtUNVZJ9a2J8nUtOj1Das0/FRS3XPp087HXO4pN3HuE1jXHnJ5B/z+s7jLE3aFgoHau0vrlzieQu1A/Byp1MjeB0/trihhJjlWXgwsDJef3h535+e7Iiw25ZS9oNnwTatYY3qVXk/3mDG+HLa/Qg2Dlxb9euKnErV4NbkPZR9RVrPM47i8SLO/yyyFE2VM8mXJnAPbHVjHUQh75w25u+cNuHvEpBra6qzA+m31sWzpV1W7LC0JS/l1IMcD0OjW/jqotXe3gFkVo7AxeP6JWPZiB9yttCco0V2v3jDnqPULR1dH+Sux+iz+tJsU0bxrN88E0q7JBiJVuwiPvzh4pg+/gLoNzr8rF2GabaeuezBhxOBNdx81Z5s4Oc45F5prL49Kj8X+GwmTNP/EuLE5fjpHNkf2Laxe1dEZfwiXW7pHZlDuDxwOv50GPG4L/HSxwJ9xENofCItr41gw6RVz2ePfVGsxSr4+c9svisn/x9H9GBuTYgEzJ+nIqtwLcS6XvQJV2tFWyY6xKP0Ytw+S2QTKlWLK+VWC2awPCbIoYBCIIwZgq0z7b4HTgj8J9hDVgoUTWqUQ9fx67lk31uCwGMJZUS5JiKZamTKU9vSO2JLTDB1g5W9lVORX9aT+rwF2HQbInzjs0GbGVAvphr/g7L1ZhbhC+QGu2C+tuPMMHrBvW1TURUroU1Y08C5BxUEwm6fJFpxn6VA7bIJnyeZIlX7xXFoyvtXKrsL2msn1Wafutyg5YtR20GvtLa7eyr3woXcSV/lGxnwFWpdq48V774eTbXz1xVEczWnppQUPffOBOC1izxlbRcJ8HPOQRj3nCU57xnDZe5Imglz47Ri+23QejA0he17bb/9902x+RR9OPffa87//H3/n/+0OXV/9Rdiz9mOa3w//KH/Lr4sfwQB0/j+Hzf5b/07N8+x3Uf4DbnuZjCsDHnBLwILCeeVIUSXT/NEp/hTHyWSTfUS+0zD3u6a0txnRjapR5e6j8nrfy1mfIx2uWsgj9ajCfrqtTUoQxkfMG+Y5avVeIoiFdo8CMCCdgoqe0o14ZL4GWlV953sAFvcvrjJujjIPnwEjsIadVxz//bqdgCSfw9QOld1SdUfZdV5D2xu+k8dSw9f7JGL039+yTCJMaqRfodNZc9acgiJDrfUA/J40IYx7an0jamDcIA/IdRXdgRAhHSulb7b9aAb7ISs9ni0sjP/3FXrZLR302lj+rF0khicKYbc6i+2dDDGYBMEbjygWvWPvpW4PFUrQwBOTTux51lcUjQGxoKVjkRkFMsIdmngfzs00zwpPsPrTI83lr30VABIN5CWYCetd9LVW09bt7r0WFnLRS3VFTs8xW3jHz4ExAPl+JYSVgqc4F7Ra8P9ySa71XoL0BC37FhePMCjkB1VCv1XpQwEk+pckEvX+3HE6C8YTdYvg9GLda/YcW9KzZCOiQjyplPAI++tdh3Beaoc9ej8w7KtVuCRtRNrnH50tMiriqCsynnRpTrUBIjT+SRJcMZW1deWp/TQZYyVni6bvV6gexAfmO0lfDp3ELEu133nkzZdNoPQdu1LMJ8Rk1j9ZKnMq1THXHTM0oZfw6yuowns5ECc52HzzlOyo6ExjezShdeUfTMRY9OYBq52m+k61XPzmtju7snzVjLMvzriJfuKcguRAE9v+1Xrq4YWMI6iSAiHwvMBB2exFrXT/65GIjlirA9vdgy3cU2TW/COa71meKjp9KeIZj33vN6rkMKOal5qcy+CCU8GJrOOQvJdyldXSX8oynsqnIJ1RxXHze4hddPnz563H8HZAsZPUCSSA3tIPh411kJIBvbSjQwwfjp/TfcNII2drGHVBn081XI+eVNLM1TEg8MQ8aORdtMmqxSzlDXU07E8aJrko+4d74U5dkYr5A4IazFNd2urYDMknenY0zdKewrKDBkDj0QQ2HM93UIhs6Yz5wdRQcyQajQwYzaa45PsZO8yuN2k7MH4rH/lm0J7pheK6a656dVcP4jC0BtkMHSGED2IHS/g7worX8bD/Bdg3l6Nzemy9g6wPgb/0BfsOuOiFaZ/m6m81KHnxHdU6/SzdHuNusrIHuiZ+XdlCGspVMIyvP+D69TYh29ITKbiXv5pZ1V8sjvunGi6Vc7AkTIkDd/VF3Vsyygs+w94zoqOGIp5urhueOc0PrKDgVG0xrBlMx17T6SKf5ldvajuIfasb+eXBPNHucWFfXczOGyVUzlyux2sRjM1hBUcq660vH8TUt2gvLKLh3aQUuYfH+7Mx4J2MGjcpLIp2/jdKjsm3KR+f53daR2pmXwg8Q3vEMsL9umeFGEEsjymvXD/3aRYpAHyfIcBltNc8C4rcFeeeT2rGtNofV78EOHP+t+5zWwQXdKyq/Y/qT66+I9VZ6rKER/Ri5pdzqyYUZ4c/LUxUkehWBHXquBNAPSkBMWfB8JhjWy1pU2p+NMoSHR6xnG4L1+j81CAiPtSngr9+Z8WIj7t9ZFAsAf/LndmVZde9/8kWcP8TaePpdFYjDfwB1bvz7Rvm/yDrg49eQsTP8w86zwfqk3L9Erl47bT/qyHPyyTepH1nrEZrfbf9BPv0n6vYRpBz1qKUXV4PjI6B/ioT7LF3txW4edWTpi1wxHtbD5knqTS4/Yb/j9qTGkAVB3Yz4kU4JteyJ/gt1cA/r6MBOO5XP45/IfToL5M/w0oiMXKl2W59RRTpaKX32AE7d1/iN4Xpn5dTFVJ2G/CATqZTjODyytRrOoDe9Qtuw0erkrjOWiva5431hnJN1WYDqYa2FR79vZb15OmjL1/8rVx9YOS1BJXOz1hEJd/od9RjI0J2mtQzA2ftncbqW51N75BXE/kxgYO2xYvoaiuW2m9o12crrx3Z0VgtZrP8kbib3zQP5TLJkfVC2fpS190lfK2Wv38hXfcvWz+S1sMPsNryGi1AEGVAPxXDKKoH+41irZCxh7jEMyfHQ0p5kTNbCHdZsKhqhAR6AetJVzebFJw8E5gg3hh3gPay7WjmIKndYO4XG4sfXnsES6IhtmCLK93jDtZCcR2lvJ9k3pY+PuIy/WRNHl+qXdB5NuQA4A/NjAb2A3ESlxIRa57kp26qMcaX33e63xc/G6CDJjqp8fEWkIS4+F6azWGIha7LYWMjGOwqfoQOudm2F28+LmvZNq33WBNuPC10WkLJDXN1hYi+K2vWx0DlWzhxu8nxtdseKmBWWLLPE1ZR8FFk+G0qe7a2o4Ze8bTN77DZj/Gj53Aqx01fU+It0OsDscVPwtILZtTA9ZOzKpXOXbX1tq2N+PZH9fI/3d3jcMuOR3/RyhNjrlc5RWC0npGgtcNlmi1/20DFbPRjLOA1b5cAyIMCv3eOf9IV8wMDRnUDvAXD6yjRPnUvzghQKjjIgA3shqNRa/BzAz0jqUfdlrfvO0v2a4cpODaAbAR8CXgfcA3gN8EXAr63jXNaistzWqnoB+JM2wfrh+p0zbClWf8zZLLR8kcCvzVXcIBg7ROKIxIA+ik1nrq3q2yqTDeBzC5XZiJN4NsFPOJviqmM2zVTTbAZP+ZyZSenADwcUEIF3a5ztzYTFbB8sIu6/lzh8Ujvp4FmSrLVUommklkqwynJjuUsmNeegJ2aegLti89YoFyd8bF1lhZWktZTJ1vM1JpM0xkkUXx4kkoZNT7n+SZdklmKFafbxOClGCxXnMVWCpbQFMqy3ytvET1yQrn0ca7wVTulx82RNJ16W5zLeidpG/L53DDXPrPGr40e/r97taZOXepQhZelBzI2GMj1/Muwl7j0XMuR5O8lqcZZrDpOkhqol+XaymEPYDpErT2bLuFgelzZGs85cX73XYhXxnCNiud7lq+X5rrEDiI1ljjqi2b+W3xjEgJK3wbZ+N9iJ9Yt9bHDQIk4TTRzk3odkFhw53YnEGMU/w9ntDN1x062M7kAyazSXe5AYY+5LYrg+5owVf3OSL7PiZoVj/nDfXfeSZJ3NPUrG7XPAJxw3LmfuPG5QYnjyP8qrsbw98sBDK4u4UclJPo03fPk/qon5G98kfj46HzxEyFCh/VZwWFOsskZCyVaHCy/RWpURIgqMpEuQJEOCI5tqvXWSpUSJGi26aabHiGlGKaWa6TFZLKmk0u4pMGwW1rllmvNfMRgh/CcyV3qChOUKlSnLfnIZNpSXKHH5/jEviTDzK6jQgoqS2im84kpE2JQsuY0Usu9qYizkgyL5PlHvscg5n+5aYormP9xnH+jYosjW9BkwZETE+PvxE2Zt/38dCiMfa9P+S6W1Tsd0fZX+2b2/a1o7aYzpp03JZH3oD5hWL7jo0m+YfvHYaAdIVOHimcBfjCWsO2fRFUuWrVjFdJHQYu9MJFDvhO2tdaWrXXPKaRwMaiddd63r3aBH32Hm/cvCVQ0a/e0QS1bE+L7odsaflv53dunNO6z8ZXanu6oFmES3e3LtkmezvVSZu2+HbT3pYY9caKMnPe1Zz2vrRS97VfvdVfC/5P2fu9PWU2999TfQ1wb16TeA5XeT7fbEU8+88LJvfe9HP/uFaqi/FyDJiqrphmnZjuv5eIKmlraOrp4+BBNJITcoVBqdwWSxOVwegvIFQpFYghlQwl4GPJ3fzieUy5a0Ie7n2mhJTmXtSE92TsafjyUs4dOERxNTsF0tmC8POy1s7qk4TZYSJriQvxFhkW0PiyVavGXc1mv49jAjGymsC2aZhB9jfuRtKWXWdhsl2pV8glIrsfeK4MfDgvj0sPe3xWKXHqb3TfLk3cfhqL/WwslKSsY9XMpYvXQAC0Go3AlWafj2cOQsndjjhgg39zZ9LQVSfDe7Wdvl4wGrX6s1QdArCGUUHsrOJi4IuVHDM+fCWNuijyGdJTFW7GEiRENAtnWGCMehbSiopa0QGccV+DVV9YeDMNaVJB2dSYgqxWoQcEs+yP6SdX4AFU17++ktzkAGijDNsaqyFOHNqVAd3yAgaXCQCkaR54yCvFQQ9hPnpNJ8liRWhAMmU1Z2aRfKrvZK6lg2hEMz9DGoO1gIoRoMNIb9famRFL0L3vBjBTxdiiYrDRm+a2tYU3QFV0gd/+V1IvU/uGqsZLg3rGQnxD+18BNMhuTZlVyV+fjhfMoryFu3ho5LP3jc2uflY1/K27XKINDxLVFTGpeAjQiECLvrif3y8cuNPuKlboyUXdFLVJuzbmKuD1hccD9Rh/PA6vK1zKsvm0bhWiHbFF1gNpyc3/xWNgkuWyudT0T0nMPsn+RW8To66TcxdblaNE/4N5H7eqWn8+1Ykb6bM/NYXgVX+kEmlCY3aUXGrMpO/uvEtL2Kl1B00idTXhdB15nOicYDhdEx6DwRMnzVWlkHmATGklh7dFBdQ2s79V7fpTV1+9U1tIt0qVx0RlzQeCF4o13F0cNUeo/s332B8+KauFtKee8tsgaulLSU0yKjpZxWK1ouaE1N6xparego+N3zV3VAxBRP25X783LHFXKWc/AsG93y/FbwAzkEUADPslEOBRxBJAfAlQqufEkOoJxQAGKoB+CB9oXegTRyMU8gApYOAIXWpYMsASiAo9BQAABAEABQAAMAAApADAAeAPQOpJEAjYAEscSG0cyy2RgKluc5RnjWndIyhy31uJcwo5EgpZhKphBm2WV6ckPIHMAyq5KodfKdUlLryJR2dO4LeSNmZGN4kGWVe99idvjLTeLyPsRkGVRlkAc/By3qPi9+5U2IizpfahpQ0YCafg4dV08XTV7diJ7MBk69WKVXcDeEZ4q6Co6zp1rdaD0/nh3+u7b2qLE5tBRrSShBP2YrT53309m5XXO6xS4Gzwcbtu4Di6PDfGij1n1i2p8cIhrKPbInIat6DeILA+eFmBs95wPbXgG9npuNOiDMOlf+nsZQ7WdJ559R9o5qd1d5XpFEfsq6l4mOZ5ey8UsZ3vqc//d/XUIz"],
|
|
@@ -106261,32 +106266,40 @@ function extractRequestedFontFamilies(html) {
|
|
|
106261
106266
|
}
|
|
106262
106267
|
return requested;
|
|
106263
106268
|
}
|
|
106264
|
-
function
|
|
106269
|
+
function buildFontFaceRule(familyName, src, weight, style) {
|
|
106270
|
+
return [
|
|
106271
|
+
"@font-face {",
|
|
106272
|
+
` font-family: "${familyName}";`,
|
|
106273
|
+
` src: url("${src}") format("woff2");`,
|
|
106274
|
+
` font-style: ${style};`,
|
|
106275
|
+
` font-weight: ${weight};`,
|
|
106276
|
+
" font-display: block;",
|
|
106277
|
+
"}"
|
|
106278
|
+
].join("\n");
|
|
106279
|
+
}
|
|
106280
|
+
async function buildFontFaceCss(requestedFamilies) {
|
|
106265
106281
|
const rules = [];
|
|
106266
106282
|
const unresolved = [];
|
|
106267
106283
|
for (const [normalizedFamily, originalCaseFamily] of requestedFamilies) {
|
|
106268
106284
|
const canonicalKey = FONT_ALIASES[normalizedFamily];
|
|
106269
|
-
if (
|
|
106270
|
-
|
|
106285
|
+
if (canonicalKey) {
|
|
106286
|
+
const canonical = CANONICAL_FONTS[canonicalKey];
|
|
106287
|
+
if (!canonical) continue;
|
|
106288
|
+
for (const face of canonical.faces) {
|
|
106289
|
+
const style = face.style || "normal";
|
|
106290
|
+
const src = fontDataUri(canonical.packageName, face.weight, style);
|
|
106291
|
+
rules.push(buildFontFaceRule(originalCaseFamily, src, face.weight, style));
|
|
106292
|
+
}
|
|
106271
106293
|
continue;
|
|
106272
106294
|
}
|
|
106273
|
-
const
|
|
106274
|
-
if (
|
|
106275
|
-
|
|
106276
|
-
|
|
106277
|
-
|
|
106278
|
-
|
|
106279
|
-
[
|
|
106280
|
-
"@font-face {",
|
|
106281
|
-
` font-family: "${originalCaseFamily}";`,
|
|
106282
|
-
` src: url("${src}") format("woff2");`,
|
|
106283
|
-
` font-style: ${style};`,
|
|
106284
|
-
` font-weight: ${face.weight};`,
|
|
106285
|
-
" font-display: block;",
|
|
106286
|
-
"}"
|
|
106287
|
-
].join("\n")
|
|
106288
|
-
);
|
|
106295
|
+
const googleFaces = await fetchGoogleFont(originalCaseFamily);
|
|
106296
|
+
if (googleFaces.length > 0) {
|
|
106297
|
+
for (const face of googleFaces) {
|
|
106298
|
+
rules.push(buildFontFaceRule(originalCaseFamily, face.dataUri, face.weight, face.style));
|
|
106299
|
+
}
|
|
106300
|
+
continue;
|
|
106289
106301
|
}
|
|
106302
|
+
unresolved.push(originalCaseFamily);
|
|
106290
106303
|
}
|
|
106291
106304
|
return {
|
|
106292
106305
|
css: rules.join("\n\n").trim(),
|
|
@@ -106310,7 +106323,67 @@ function warnUnresolvedFonts(unresolved) {
|
|
|
106310
106323
|
Docs: https://hyperframes.heygen.com/docs/fonts`
|
|
106311
106324
|
);
|
|
106312
106325
|
}
|
|
106313
|
-
|
|
106326
|
+
var GOOGLE_FONTS_CACHE_DIR = join12(homedir2(), ".cache", "hyperframes", "fonts");
|
|
106327
|
+
var WOFF2_USER_AGENT = "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/131.0.0.0 Safari/537.36";
|
|
106328
|
+
function fontSlug(familyName) {
|
|
106329
|
+
return familyName.toLowerCase().replace(/[^a-z0-9]+/g, "-").replace(/^-|-$/g, "");
|
|
106330
|
+
}
|
|
106331
|
+
function fontCacheDir(slug) {
|
|
106332
|
+
const dir = join12(GOOGLE_FONTS_CACHE_DIR, slug);
|
|
106333
|
+
if (!existsSync13(dir)) {
|
|
106334
|
+
mkdirSync8(dir, { recursive: true });
|
|
106335
|
+
}
|
|
106336
|
+
return dir;
|
|
106337
|
+
}
|
|
106338
|
+
function cachedWoff2Path(slug, weight, style) {
|
|
106339
|
+
return join12(fontCacheDir(slug), `${weight}-${style}.woff2`);
|
|
106340
|
+
}
|
|
106341
|
+
async function fetchGoogleFont(familyName) {
|
|
106342
|
+
const slug = fontSlug(familyName);
|
|
106343
|
+
const encodedFamily = encodeURIComponent(familyName);
|
|
106344
|
+
const url = `https://fonts.googleapis.com/css2?family=${encodedFamily}:ital,wght@0,100;0,200;0,300;0,400;0,500;0,600;0,700;0,800;0,900;1,400;1,700`;
|
|
106345
|
+
let cssText;
|
|
106346
|
+
try {
|
|
106347
|
+
const res = await fetch(url, {
|
|
106348
|
+
headers: { "User-Agent": WOFF2_USER_AGENT }
|
|
106349
|
+
});
|
|
106350
|
+
if (!res.ok) {
|
|
106351
|
+
return [];
|
|
106352
|
+
}
|
|
106353
|
+
cssText = await res.text();
|
|
106354
|
+
} catch {
|
|
106355
|
+
return [];
|
|
106356
|
+
}
|
|
106357
|
+
const faceRegex = /@font-face\s*\{[^}]*font-style:\s*(normal|italic)[^}]*font-weight:\s*(\d+)[^}]*src:\s*url\(([^)]+)\)\s*format\(['"]woff2['"]\)[^}]*\}/gi;
|
|
106358
|
+
const faces = [];
|
|
106359
|
+
for (const match2 of cssText.matchAll(faceRegex)) {
|
|
106360
|
+
const style = match2[1] || "normal";
|
|
106361
|
+
const weight = match2[2] || "400";
|
|
106362
|
+
const woff2Url = match2[3] || "";
|
|
106363
|
+
if (!woff2Url) continue;
|
|
106364
|
+
const cachePath = cachedWoff2Path(slug, weight, style);
|
|
106365
|
+
if (!existsSync13(cachePath)) {
|
|
106366
|
+
try {
|
|
106367
|
+
const fontRes = await fetch(woff2Url);
|
|
106368
|
+
if (!fontRes.ok) continue;
|
|
106369
|
+
const buffer = Buffer.from(await fontRes.arrayBuffer());
|
|
106370
|
+
writeFileSync3(cachePath, buffer);
|
|
106371
|
+
} catch {
|
|
106372
|
+
continue;
|
|
106373
|
+
}
|
|
106374
|
+
}
|
|
106375
|
+
const fontBytes = readFileSync7(cachePath);
|
|
106376
|
+
const dataUri = `data:font/woff2;base64,${fontBytes.toString("base64")}`;
|
|
106377
|
+
faces.push({ weight, style, dataUri });
|
|
106378
|
+
}
|
|
106379
|
+
if (faces.length > 0) {
|
|
106380
|
+
console.log(
|
|
106381
|
+
`[Compiler] Fetched ${faces.length} font face(s) for "${familyName}" from Google Fonts (cached to ${fontCacheDir(slug)})`
|
|
106382
|
+
);
|
|
106383
|
+
}
|
|
106384
|
+
return faces;
|
|
106385
|
+
}
|
|
106386
|
+
async function injectDeterministicFontFaces(html) {
|
|
106314
106387
|
const existingFaces = extractExistingFontFaces(html);
|
|
106315
106388
|
const requestedFamilies = extractRequestedFontFamilies(html);
|
|
106316
106389
|
const pendingFamilies = /* @__PURE__ */ new Map();
|
|
@@ -106322,7 +106395,7 @@ function injectDeterministicFontFaces(html) {
|
|
|
106322
106395
|
if (pendingFamilies.size === 0) {
|
|
106323
106396
|
return html;
|
|
106324
106397
|
}
|
|
106325
|
-
const { css, unresolved } = buildFontFaceCss(pendingFamilies);
|
|
106398
|
+
const { css, unresolved } = await buildFontFaceCss(pendingFamilies);
|
|
106326
106399
|
if (!css) {
|
|
106327
106400
|
if (unresolved.length > 0) {
|
|
106328
106401
|
warnUnresolvedFonts(unresolved);
|
|
@@ -106358,16 +106431,16 @@ function dedupeElementsById(elements) {
|
|
|
106358
106431
|
async function resolveMediaDuration(src, mediaStart, baseDir, downloadDir, tagName19) {
|
|
106359
106432
|
let filePath = src;
|
|
106360
106433
|
if (isHttpUrl(src)) {
|
|
106361
|
-
if (!
|
|
106434
|
+
if (!existsSync14(downloadDir)) mkdirSync9(downloadDir, { recursive: true });
|
|
106362
106435
|
try {
|
|
106363
106436
|
filePath = await downloadToTemp(src, downloadDir);
|
|
106364
106437
|
} catch {
|
|
106365
106438
|
return { duration: 0, resolvedPath: src };
|
|
106366
106439
|
}
|
|
106367
106440
|
} else if (!filePath.startsWith("/")) {
|
|
106368
|
-
filePath =
|
|
106441
|
+
filePath = join13(baseDir, filePath);
|
|
106369
106442
|
}
|
|
106370
|
-
if (!
|
|
106443
|
+
if (!existsSync14(filePath)) {
|
|
106371
106444
|
return { duration: 0, resolvedPath: filePath };
|
|
106372
106445
|
}
|
|
106373
106446
|
const metadata = tagName19 === "video" ? await extractVideoMetadata(filePath) : await extractAudioMetadata(filePath);
|
|
@@ -106435,10 +106508,10 @@ async function parseSubCompositions(html, projectDir, downloadDir, parentOffset
|
|
|
106435
106508
|
if (visited.has(filePath)) {
|
|
106436
106509
|
continue;
|
|
106437
106510
|
}
|
|
106438
|
-
if (!
|
|
106511
|
+
if (!existsSync14(filePath)) {
|
|
106439
106512
|
continue;
|
|
106440
106513
|
}
|
|
106441
|
-
const rawSubHtml =
|
|
106514
|
+
const rawSubHtml = readFileSync8(filePath, "utf-8");
|
|
106442
106515
|
const nestedVisited = new Set(visited);
|
|
106443
106516
|
nestedVisited.add(filePath);
|
|
106444
106517
|
workItems.push({ srcPath, absoluteStart, absoluteEnd, filePath, rawSubHtml, nestedVisited });
|
|
@@ -106632,8 +106705,8 @@ function inlineSubCompositions(html, subCompositions, projectDir) {
|
|
|
106632
106705
|
let compHtml = subCompositions.get(srcPath) || null;
|
|
106633
106706
|
if (!compHtml) {
|
|
106634
106707
|
const filePath = resolve8(projectDir, srcPath);
|
|
106635
|
-
if (
|
|
106636
|
-
compHtml =
|
|
106708
|
+
if (existsSync14(filePath)) {
|
|
106709
|
+
compHtml = readFileSync8(filePath, "utf-8");
|
|
106637
106710
|
}
|
|
106638
106711
|
}
|
|
106639
106712
|
if (!compHtml) {
|
|
@@ -106856,7 +106929,7 @@ function collectExternalAssets(html, projectDir) {
|
|
|
106856
106929
|
if (absPath.startsWith(absProjectDir + "/") || absPath === absProjectDir) {
|
|
106857
106930
|
return null;
|
|
106858
106931
|
}
|
|
106859
|
-
if (!
|
|
106932
|
+
if (!existsSync14(absPath)) return null;
|
|
106860
106933
|
const safeKey = "hf-ext/" + absPath.replace(/^\//, "");
|
|
106861
106934
|
externalAssets.set(safeKey, absPath);
|
|
106862
106935
|
return safeKey;
|
|
@@ -106901,7 +106974,7 @@ function collectExternalAssets(html, projectDir) {
|
|
|
106901
106974
|
};
|
|
106902
106975
|
}
|
|
106903
106976
|
async function compileForRender(projectDir, htmlPath, downloadDir) {
|
|
106904
|
-
const rawHtml =
|
|
106977
|
+
const rawHtml = readFileSync8(htmlPath, "utf-8");
|
|
106905
106978
|
const { html: compiledHtml, unresolvedCompositions } = await compileHtmlFile(
|
|
106906
106979
|
rawHtml,
|
|
106907
106980
|
projectDir,
|
|
@@ -106918,7 +106991,7 @@ async function compileForRender(projectDir, htmlPath, downloadDir) {
|
|
|
106918
106991
|
/(<(?:video|audio)\b[^>]*?)\s+preload\s*=\s*["']none["']/gi,
|
|
106919
106992
|
"$1"
|
|
106920
106993
|
);
|
|
106921
|
-
const coalescedHtml = injectDeterministicFontFaces(
|
|
106994
|
+
const coalescedHtml = await injectDeterministicFontFaces(
|
|
106922
106995
|
coalesceHeadStylesAndBodyScripts(promoteCssImportsToLinkTags(sanitizedHtml))
|
|
106923
106996
|
);
|
|
106924
106997
|
const assembledHtml = await inlineExternalScripts(coalescedHtml);
|
|
@@ -107156,21 +107229,21 @@ function installDebugLogger(logPath, log = defaultLogger) {
|
|
|
107156
107229
|
};
|
|
107157
107230
|
}
|
|
107158
107231
|
function writeCompiledArtifacts(compiled, workDir, includeSummary) {
|
|
107159
|
-
const compileDir =
|
|
107160
|
-
|
|
107161
|
-
|
|
107232
|
+
const compileDir = join14(workDir, "compiled");
|
|
107233
|
+
mkdirSync10(compileDir, { recursive: true });
|
|
107234
|
+
writeFileSync4(join14(compileDir, "index.html"), compiled.html, "utf-8");
|
|
107162
107235
|
for (const [srcPath, html] of compiled.subCompositions) {
|
|
107163
|
-
const outPath =
|
|
107164
|
-
|
|
107165
|
-
|
|
107236
|
+
const outPath = join14(compileDir, srcPath);
|
|
107237
|
+
mkdirSync10(dirname10(outPath), { recursive: true });
|
|
107238
|
+
writeFileSync4(outPath, html, "utf-8");
|
|
107166
107239
|
}
|
|
107167
107240
|
for (const [relativePath, absolutePath] of compiled.externalAssets) {
|
|
107168
|
-
const outPath = resolve9(
|
|
107241
|
+
const outPath = resolve9(join14(compileDir, relativePath));
|
|
107169
107242
|
if (!outPath.startsWith(compileDir + "/")) {
|
|
107170
107243
|
console.warn(`[Render] Skipping external asset with unsafe path: ${relativePath}`);
|
|
107171
107244
|
continue;
|
|
107172
107245
|
}
|
|
107173
|
-
|
|
107246
|
+
mkdirSync10(dirname10(outPath), { recursive: true });
|
|
107174
107247
|
copyFileSync2(absolutePath, outPath);
|
|
107175
107248
|
}
|
|
107176
107249
|
if (includeSummary) {
|
|
@@ -107194,7 +107267,7 @@ function writeCompiledArtifacts(compiled, workDir, includeSummary) {
|
|
|
107194
107267
|
})),
|
|
107195
107268
|
subCompositions: Array.from(compiled.subCompositions.keys())
|
|
107196
107269
|
};
|
|
107197
|
-
|
|
107270
|
+
writeFileSync4(join14(compileDir, "summary.json"), JSON.stringify(summary, null, 2), "utf-8");
|
|
107198
107271
|
}
|
|
107199
107272
|
}
|
|
107200
107273
|
function createRenderJob(config2) {
|
|
@@ -107239,8 +107312,8 @@ function extractStandaloneEntryFromIndex(indexHtml, entryFile) {
|
|
|
107239
107312
|
async function executeRenderJob(job, projectDir, outputPath, onProgress, abortSignal) {
|
|
107240
107313
|
const moduleDir = dirname10(fileURLToPath3(import.meta.url));
|
|
107241
107314
|
const producerRoot = process.env.PRODUCER_RENDERS_DIR ? resolve9(process.env.PRODUCER_RENDERS_DIR, "..") : resolve9(moduleDir, "../..");
|
|
107242
|
-
const debugDir =
|
|
107243
|
-
const workDir = job.config.debug ?
|
|
107315
|
+
const debugDir = join14(producerRoot, ".debug");
|
|
107316
|
+
const workDir = job.config.debug ? join14(debugDir, job.id) : join14(dirname10(outputPath), `work-${job.id}`);
|
|
107244
107317
|
const pipelineStart = Date.now();
|
|
107245
107318
|
const log = job.config.logger ?? defaultLogger;
|
|
107246
107319
|
let fileServer = null;
|
|
@@ -107248,7 +107321,7 @@ async function executeRenderJob(job, projectDir, outputPath, onProgress, abortSi
|
|
|
107248
107321
|
let lastBrowserConsole = [];
|
|
107249
107322
|
let restoreLogger = null;
|
|
107250
107323
|
const perfStages = {};
|
|
107251
|
-
const perfOutputPath =
|
|
107324
|
+
const perfOutputPath = join14(workDir, "perf-summary.json");
|
|
107252
107325
|
const cfg = { ...job.config.producerConfig ?? resolveConfig() };
|
|
107253
107326
|
const outputFormat = job.config.format ?? "mp4";
|
|
107254
107327
|
const isWebm = outputFormat === "webm";
|
|
@@ -107268,28 +107341,28 @@ async function executeRenderJob(job, projectDir, outputPath, onProgress, abortSi
|
|
|
107268
107341
|
};
|
|
107269
107342
|
job.startedAt = /* @__PURE__ */ new Date();
|
|
107270
107343
|
assertNotAborted();
|
|
107271
|
-
if (!
|
|
107344
|
+
if (!existsSync15(workDir)) mkdirSync10(workDir, { recursive: true });
|
|
107272
107345
|
if (job.config.debug) {
|
|
107273
|
-
const logPath =
|
|
107346
|
+
const logPath = join14(workDir, "render.log");
|
|
107274
107347
|
restoreLogger = installDebugLogger(logPath, log);
|
|
107275
107348
|
}
|
|
107276
107349
|
const entryFile = job.config.entryFile || "index.html";
|
|
107277
|
-
let htmlPath =
|
|
107278
|
-
if (!
|
|
107350
|
+
let htmlPath = join14(projectDir, entryFile);
|
|
107351
|
+
if (!existsSync15(htmlPath)) {
|
|
107279
107352
|
throw new Error(`Entry file not found: ${htmlPath}`);
|
|
107280
107353
|
}
|
|
107281
107354
|
assertNotAborted();
|
|
107282
|
-
const rawEntry =
|
|
107355
|
+
const rawEntry = readFileSync9(htmlPath, "utf-8");
|
|
107283
107356
|
if (entryFile !== "index.html" && rawEntry.trimStart().startsWith("<template")) {
|
|
107284
|
-
const wrapperPath =
|
|
107285
|
-
const projectIndexPath =
|
|
107286
|
-
if (!
|
|
107357
|
+
const wrapperPath = join14(workDir, "standalone-entry.html");
|
|
107358
|
+
const projectIndexPath = join14(projectDir, "index.html");
|
|
107359
|
+
if (!existsSync15(projectIndexPath)) {
|
|
107287
107360
|
throw new Error(
|
|
107288
107361
|
`Template entry file "${entryFile}" requires a project index.html to extract its render shell.`
|
|
107289
107362
|
);
|
|
107290
107363
|
}
|
|
107291
107364
|
const standaloneHtml = extractStandaloneEntryFromIndex(
|
|
107292
|
-
|
|
107365
|
+
readFileSync9(projectIndexPath, "utf-8"),
|
|
107293
107366
|
entryFile
|
|
107294
107367
|
);
|
|
107295
107368
|
if (!standaloneHtml) {
|
|
@@ -107297,7 +107370,7 @@ async function executeRenderJob(job, projectDir, outputPath, onProgress, abortSi
|
|
|
107297
107370
|
`Entry file "${entryFile}" is not mounted from index.html via data-composition-src, so it cannot be rendered independently.`
|
|
107298
107371
|
);
|
|
107299
107372
|
}
|
|
107300
|
-
|
|
107373
|
+
writeFileSync4(wrapperPath, standaloneHtml, "utf-8");
|
|
107301
107374
|
htmlPath = wrapperPath;
|
|
107302
107375
|
log.info("Extracted standalone entry from index.html host context", {
|
|
107303
107376
|
entryFile
|
|
@@ -107306,7 +107379,7 @@ async function executeRenderJob(job, projectDir, outputPath, onProgress, abortSi
|
|
|
107306
107379
|
const stage1Start = Date.now();
|
|
107307
107380
|
updateJobStatus(job, "preprocessing", "Compiling composition", 5, onProgress);
|
|
107308
107381
|
const compileStart = Date.now();
|
|
107309
|
-
let compiled = await compileForRender(projectDir, htmlPath,
|
|
107382
|
+
let compiled = await compileForRender(projectDir, htmlPath, join14(workDir, "downloads"));
|
|
107310
107383
|
assertNotAborted();
|
|
107311
107384
|
perfStages.compileOnlyMs = Date.now() - compileStart;
|
|
107312
107385
|
writeCompiledArtifacts(compiled, workDir, Boolean(job.config.debug));
|
|
@@ -107335,7 +107408,7 @@ async function executeRenderJob(job, projectDir, outputPath, onProgress, abortSi
|
|
|
107335
107408
|
reasons.push(`${compiled.unresolvedCompositions.length} unresolved composition(s)`);
|
|
107336
107409
|
fileServer = await createFileServer2({
|
|
107337
107410
|
projectDir,
|
|
107338
|
-
compiledDir:
|
|
107411
|
+
compiledDir: join14(workDir, "compiled"),
|
|
107339
107412
|
port: 0
|
|
107340
107413
|
});
|
|
107341
107414
|
assertNotAborted();
|
|
@@ -107348,7 +107421,7 @@ async function executeRenderJob(job, projectDir, outputPath, onProgress, abortSi
|
|
|
107348
107421
|
};
|
|
107349
107422
|
probeSession = await createCaptureSession(
|
|
107350
107423
|
fileServer.url,
|
|
107351
|
-
|
|
107424
|
+
join14(workDir, "probe"),
|
|
107352
107425
|
captureOpts,
|
|
107353
107426
|
null,
|
|
107354
107427
|
cfg
|
|
@@ -107380,7 +107453,7 @@ async function executeRenderJob(job, projectDir, outputPath, onProgress, abortSi
|
|
|
107380
107453
|
compiled,
|
|
107381
107454
|
resolutions,
|
|
107382
107455
|
projectDir,
|
|
107383
|
-
|
|
107456
|
+
join14(workDir, "downloads")
|
|
107384
107457
|
);
|
|
107385
107458
|
assertNotAborted();
|
|
107386
107459
|
composition.videos = compiled.videos;
|
|
@@ -107515,12 +107588,12 @@ async function executeRenderJob(job, projectDir, outputPath, onProgress, abortSi
|
|
|
107515
107588
|
const stage2Start = Date.now();
|
|
107516
107589
|
updateJobStatus(job, "preprocessing", "Extracting video frames", 10, onProgress);
|
|
107517
107590
|
let frameLookup = null;
|
|
107518
|
-
const compiledDir =
|
|
107591
|
+
const compiledDir = join14(workDir, "compiled");
|
|
107519
107592
|
if (composition.videos.length > 0) {
|
|
107520
107593
|
const extractionResult = await extractAllVideoFrames(
|
|
107521
107594
|
composition.videos,
|
|
107522
107595
|
projectDir,
|
|
107523
|
-
{ fps: job.config.fps, outputDir:
|
|
107596
|
+
{ fps: job.config.fps, outputDir: join14(workDir, "video-frames") },
|
|
107524
107597
|
abortSignal,
|
|
107525
107598
|
void 0,
|
|
107526
107599
|
compiledDir
|
|
@@ -107554,13 +107627,13 @@ async function executeRenderJob(job, projectDir, outputPath, onProgress, abortSi
|
|
|
107554
107627
|
}
|
|
107555
107628
|
const stage3Start = Date.now();
|
|
107556
107629
|
updateJobStatus(job, "preprocessing", "Processing audio tracks", 20, onProgress);
|
|
107557
|
-
const audioOutputPath =
|
|
107630
|
+
const audioOutputPath = join14(workDir, "audio.aac");
|
|
107558
107631
|
let hasAudio = false;
|
|
107559
107632
|
if (composition.audios.length > 0) {
|
|
107560
107633
|
const audioResult = await processCompositionAudio(
|
|
107561
107634
|
composition.audios,
|
|
107562
107635
|
projectDir,
|
|
107563
|
-
|
|
107636
|
+
join14(workDir, "audio-work"),
|
|
107564
107637
|
audioOutputPath,
|
|
107565
107638
|
job.duration,
|
|
107566
107639
|
abortSignal,
|
|
@@ -107578,13 +107651,13 @@ async function executeRenderJob(job, projectDir, outputPath, onProgress, abortSi
|
|
|
107578
107651
|
if (!fileServer) {
|
|
107579
107652
|
fileServer = await createFileServer2({
|
|
107580
107653
|
projectDir,
|
|
107581
|
-
compiledDir:
|
|
107654
|
+
compiledDir: join14(workDir, "compiled"),
|
|
107582
107655
|
port: 0
|
|
107583
107656
|
});
|
|
107584
107657
|
assertNotAborted();
|
|
107585
107658
|
}
|
|
107586
|
-
const framesDir =
|
|
107587
|
-
if (!
|
|
107659
|
+
const framesDir = join14(workDir, "captured-frames");
|
|
107660
|
+
if (!existsSync15(framesDir)) mkdirSync10(framesDir, { recursive: true });
|
|
107588
107661
|
const captureOptions = {
|
|
107589
107662
|
width,
|
|
107590
107663
|
height,
|
|
@@ -107595,7 +107668,7 @@ async function executeRenderJob(job, projectDir, outputPath, onProgress, abortSi
|
|
|
107595
107668
|
const workerCount = calculateOptimalWorkers(job.totalFrames, job.config.workers, cfg);
|
|
107596
107669
|
const FORMAT_EXT = { mp4: ".mp4", webm: ".webm", mov: ".mov" };
|
|
107597
107670
|
const videoExt = FORMAT_EXT[outputFormat] ?? ".mp4";
|
|
107598
|
-
const videoOnlyPath =
|
|
107671
|
+
const videoOnlyPath = join14(workDir, `video-only${videoExt}`);
|
|
107599
107672
|
const preset = getEncoderPreset(job.config.quality, outputFormat);
|
|
107600
107673
|
job.framesRendered = 0;
|
|
107601
107674
|
let streamingEncoder = null;
|
|
@@ -107864,7 +107937,7 @@ async function executeRenderJob(job, projectDir, outputPath, onProgress, abortSi
|
|
|
107864
107937
|
job.perfSummary = perfSummary;
|
|
107865
107938
|
if (job.config.debug) {
|
|
107866
107939
|
try {
|
|
107867
|
-
|
|
107940
|
+
writeFileSync4(perfOutputPath, JSON.stringify(perfSummary, null, 2), "utf-8");
|
|
107868
107941
|
} catch (err) {
|
|
107869
107942
|
log.debug("Failed to write perf summary", {
|
|
107870
107943
|
perfOutputPath,
|
|
@@ -107873,8 +107946,8 @@ async function executeRenderJob(job, projectDir, outputPath, onProgress, abortSi
|
|
|
107873
107946
|
}
|
|
107874
107947
|
}
|
|
107875
107948
|
if (job.config.debug) {
|
|
107876
|
-
if (
|
|
107877
|
-
const debugOutput =
|
|
107949
|
+
if (existsSync15(outputPath)) {
|
|
107950
|
+
const debugOutput = join14(workDir, `output${videoExt}`);
|
|
107878
107951
|
copyFileSync2(outputPath, debugOutput);
|
|
107879
107952
|
}
|
|
107880
107953
|
} else {
|
|
@@ -107957,7 +108030,7 @@ async function executeRenderJob(job, projectDir, outputPath, onProgress, abortSi
|
|
|
107957
108030
|
await safeCleanup(
|
|
107958
108031
|
"remove workDir (error)",
|
|
107959
108032
|
() => {
|
|
107960
|
-
if (
|
|
108033
|
+
if (existsSync15(workDir)) rmSync3(workDir, { recursive: true, force: true });
|
|
107961
108034
|
},
|
|
107962
108035
|
log
|
|
107963
108036
|
);
|
|
@@ -107969,15 +108042,15 @@ async function executeRenderJob(job, projectDir, outputPath, onProgress, abortSi
|
|
|
107969
108042
|
|
|
107970
108043
|
// src/server.ts
|
|
107971
108044
|
import {
|
|
107972
|
-
existsSync as
|
|
107973
|
-
mkdirSync as
|
|
108045
|
+
existsSync as existsSync17,
|
|
108046
|
+
mkdirSync as mkdirSync11,
|
|
107974
108047
|
statSync as statSync7,
|
|
107975
108048
|
mkdtempSync,
|
|
107976
|
-
writeFileSync as
|
|
108049
|
+
writeFileSync as writeFileSync5,
|
|
107977
108050
|
rmSync as rmSync4,
|
|
107978
108051
|
createReadStream as createReadStream2
|
|
107979
108052
|
} from "node:fs";
|
|
107980
|
-
import { resolve as resolve12, dirname as dirname11, join as
|
|
108053
|
+
import { resolve as resolve12, dirname as dirname11, join as join17 } from "node:path";
|
|
107981
108054
|
import { tmpdir as tmpdir2 } from "node:os";
|
|
107982
108055
|
import { parseArgs } from "node:util";
|
|
107983
108056
|
import crypto2 from "node:crypto";
|
|
@@ -108132,8 +108205,8 @@ var streamSSE = (c, cb, onError) => {
|
|
|
108132
108205
|
};
|
|
108133
108206
|
|
|
108134
108207
|
// src/services/hyperframeLint.ts
|
|
108135
|
-
import { existsSync as
|
|
108136
|
-
import { resolve as resolve10, join as
|
|
108208
|
+
import { existsSync as existsSync16, readFileSync as readFileSync10, statSync as statSync6 } from "node:fs";
|
|
108209
|
+
import { resolve as resolve10, join as join15 } from "node:path";
|
|
108137
108210
|
function isStringRecord(value) {
|
|
108138
108211
|
if (!value || typeof value !== "object" || Array.isArray(value)) {
|
|
108139
108212
|
return false;
|
|
@@ -108161,7 +108234,7 @@ function pickEntryFile(files, preferredEntryFile) {
|
|
|
108161
108234
|
}
|
|
108162
108235
|
function readProjectEntryFile(projectDir, preferredEntryFile) {
|
|
108163
108236
|
const absProjectDir = resolve10(projectDir);
|
|
108164
|
-
if (!
|
|
108237
|
+
if (!existsSync16(absProjectDir) || !statSync6(absProjectDir).isDirectory()) {
|
|
108165
108238
|
return { error: `Project directory not found: ${absProjectDir}` };
|
|
108166
108239
|
}
|
|
108167
108240
|
const entryCandidates = [preferredEntryFile, "index.html", "src/index.html"].filter(
|
|
@@ -108172,16 +108245,16 @@ function readProjectEntryFile(projectDir, preferredEntryFile) {
|
|
|
108172
108245
|
if (!absoluteEntryPath.startsWith(absProjectDir)) {
|
|
108173
108246
|
return { error: `Entry file must stay inside project directory: ${entryFile}` };
|
|
108174
108247
|
}
|
|
108175
|
-
if (
|
|
108248
|
+
if (existsSync16(absoluteEntryPath) && statSync6(absoluteEntryPath).isFile()) {
|
|
108176
108249
|
return {
|
|
108177
108250
|
entryFile,
|
|
108178
|
-
html:
|
|
108251
|
+
html: readFileSync10(absoluteEntryPath, "utf-8"),
|
|
108179
108252
|
source: "projectDir"
|
|
108180
108253
|
};
|
|
108181
108254
|
}
|
|
108182
108255
|
}
|
|
108183
108256
|
return {
|
|
108184
|
-
error: `No HTML entry file found in project directory: ${
|
|
108257
|
+
error: `No HTML entry file found in project directory: ${join15(absProjectDir, preferredEntryFile || "index.html")}`
|
|
108185
108258
|
};
|
|
108186
108259
|
}
|
|
108187
108260
|
function prepareHyperframeLintBody(body) {
|
|
@@ -108222,12 +108295,12 @@ function runHyperframeLint(prepared) {
|
|
|
108222
108295
|
}
|
|
108223
108296
|
|
|
108224
108297
|
// src/utils/paths.ts
|
|
108225
|
-
import { resolve as resolve11, basename as basename2, join as
|
|
108298
|
+
import { resolve as resolve11, basename as basename2, join as join16 } from "node:path";
|
|
108226
108299
|
var DEFAULT_RENDERS_DIR = process.env.PRODUCER_RENDERS_DIR ?? resolve11(new URL(import.meta.url).pathname, "../../..", "renders");
|
|
108227
108300
|
function resolveRenderPaths(projectDir, outputPath, rendersDir = DEFAULT_RENDERS_DIR) {
|
|
108228
108301
|
const absoluteProjectDir = resolve11(projectDir);
|
|
108229
108302
|
const projectName = basename2(absoluteProjectDir);
|
|
108230
|
-
const resolvedOutputPath = outputPath ??
|
|
108303
|
+
const resolvedOutputPath = outputPath ?? join16(rendersDir, `${projectName}.mp4`);
|
|
108231
108304
|
const absoluteOutputPath = resolve11(resolvedOutputPath);
|
|
108232
108305
|
return { absoluteProjectDir, absoluteOutputPath };
|
|
108233
108306
|
}
|
|
@@ -108283,11 +108356,11 @@ async function prepareRenderBody(body) {
|
|
|
108283
108356
|
const projectDir = typeof body.projectDir === "string" ? body.projectDir : void 0;
|
|
108284
108357
|
if (projectDir) {
|
|
108285
108358
|
const absProjectDir = resolve12(projectDir);
|
|
108286
|
-
if (!
|
|
108359
|
+
if (!existsSync17(absProjectDir) || !statSync7(absProjectDir).isDirectory()) {
|
|
108287
108360
|
return { error: `Project directory not found: ${absProjectDir}` };
|
|
108288
108361
|
}
|
|
108289
108362
|
const entry = options.entryFile || "index.html";
|
|
108290
|
-
if (!
|
|
108363
|
+
if (!existsSync17(resolve12(absProjectDir, entry))) {
|
|
108291
108364
|
return { error: `Entry file "${entry}" not found in project directory: ${absProjectDir}` };
|
|
108292
108365
|
}
|
|
108293
108366
|
return { prepared: { input: { projectDir: absProjectDir, ...options } } };
|
|
@@ -108312,8 +108385,8 @@ async function prepareRenderBody(body) {
|
|
|
108312
108385
|
}
|
|
108313
108386
|
}
|
|
108314
108387
|
const tempRoot = process.env.PRODUCER_TMP_PROJECT_DIR || tmpdir2();
|
|
108315
|
-
const tempProjectDir = mkdtempSync(
|
|
108316
|
-
|
|
108388
|
+
const tempProjectDir = mkdtempSync(join17(tempRoot, "producer-project-"));
|
|
108389
|
+
writeFileSync5(join17(tempProjectDir, "index.html"), htmlContent, "utf-8");
|
|
108317
108390
|
return {
|
|
108318
108391
|
prepared: {
|
|
108319
108392
|
input: {
|
|
@@ -108436,7 +108509,7 @@ function createRenderHandlers(options = {}) {
|
|
|
108436
108509
|
log
|
|
108437
108510
|
);
|
|
108438
108511
|
const outputDir = dirname11(absoluteOutputPath);
|
|
108439
|
-
if (!
|
|
108512
|
+
if (!existsSync17(outputDir)) mkdirSync11(outputDir, { recursive: true });
|
|
108440
108513
|
const release = await renderSemaphore.acquire();
|
|
108441
108514
|
log.info("render started", {
|
|
108442
108515
|
requestId,
|
|
@@ -108463,7 +108536,7 @@ function createRenderHandlers(options = {}) {
|
|
|
108463
108536
|
log.info(`render progress ${pct}%`, { requestId, stage: j.currentStage, message });
|
|
108464
108537
|
}
|
|
108465
108538
|
});
|
|
108466
|
-
const fileSize =
|
|
108539
|
+
const fileSize = existsSync17(absoluteOutputPath) ? statSync7(absoluteOutputPath).size : 0;
|
|
108467
108540
|
const durationMs = Date.now() - t0;
|
|
108468
108541
|
const outputToken = store.register(absoluteOutputPath);
|
|
108469
108542
|
const outputUrl = `${outputUrlPrefix}/${outputToken}`;
|
|
@@ -108547,7 +108620,7 @@ function createRenderHandlers(options = {}) {
|
|
|
108547
108620
|
log
|
|
108548
108621
|
);
|
|
108549
108622
|
const outputDir = dirname11(absoluteOutputPath);
|
|
108550
|
-
if (!
|
|
108623
|
+
if (!existsSync17(outputDir)) mkdirSync11(outputDir, { recursive: true });
|
|
108551
108624
|
log.info("render-stream started", { requestId, projectDir: input2.projectDir });
|
|
108552
108625
|
const job = createRenderJob({
|
|
108553
108626
|
fps: input2.fps,
|
|
@@ -108592,7 +108665,7 @@ function createRenderHandlers(options = {}) {
|
|
|
108592
108665
|
},
|
|
108593
108666
|
abortController.signal
|
|
108594
108667
|
);
|
|
108595
|
-
const fileSize =
|
|
108668
|
+
const fileSize = existsSync17(absoluteOutputPath) ? statSync7(absoluteOutputPath).size : 0;
|
|
108596
108669
|
const outputToken = store.register(absoluteOutputPath);
|
|
108597
108670
|
const outputUrl = `${outputUrlPrefix}/${outputToken}`;
|
|
108598
108671
|
log.info("render-stream completed", { requestId, fileSize, perf: job.perfSummary ?? null });
|
|
@@ -108651,7 +108724,7 @@ function createRenderHandlers(options = {}) {
|
|
|
108651
108724
|
if (!artifact) {
|
|
108652
108725
|
return c.json({ success: false, error: "Output artifact not found or expired" }, 404);
|
|
108653
108726
|
}
|
|
108654
|
-
if (!
|
|
108727
|
+
if (!existsSync17(artifact.path)) {
|
|
108655
108728
|
store.delete(token);
|
|
108656
108729
|
return c.json({ success: false, error: "Output artifact file missing" }, 404);
|
|
108657
108730
|
}
|