PageSourceSearch

https://aeroscreen.ru/bitrix/js/ui/pdfjs/dist/pdfjs.worker.bundle.js

js aeroscreen.ru collected 2026-10-08 23:51:10 UTC 2,202,563 bytes, 62,202 lines download raw bytes

vendor: 53,456 bytes, lines 1-1943
1/**
2 * @licstart The following is the entire license notice for the
3 * JavaScript code in this page
4 *
5 * Copyright 2024 Mozilla Foundation
6 *
7 * Licensed under the Apache License, Version 2.0 (the "License");
8 * you may not use this file except in compliance with the License.
9 * You may obtain a copy of the License at
10 *
11 *     http://www.apache.org/licenses/LICENSE-2.0
12 *
13 * Unless required by applicable law or agreed to in writing, software
14 * distributed under the License is distributed on an "AS IS" BASIS,
15 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
16 * See the License for the specific language governing permissions and
17 * limitations under the License.
18 *
19 * @licend The above is the entire license notice for the
20 * JavaScript code in this page
21 */
22
23/******/ var __webpack_modules__ = ({
24
25/***/ 9306:
26/***/ ((module, __unused_webpack_exports, __webpack_require__) => {
27
28
29var isCallable = __webpack_require__(4901);
30var tryToString = __webpack_require__(6823);
31
32var $TypeError = TypeError;
33
34// `Assert: IsCallable(argument) is true`
35module.exports = function (argument) {
36	if (isCallable(argument)) return argument;
37	throw new $TypeError(tryToString(argument) + ' is not a function');
38};
39
40
41/***/ }),
42
43/***/ 3506:
44/***/ ((module, __unused_webpack_exports, __webpack_require__) => {
45
46
47var isPossiblePrototype = __webpack_require__(3925);
48
49var $String = String;
50var $TypeError = TypeError;
51
52module.exports = function (argument) {
53	if (isPossiblePrototype(argument)) return argument;
54	throw new $TypeError("Can't set " + $String(argument) + ' as a prototype');
55};
56
57
58/***/ }),
59
60/***/ 7080:
61/***/ ((module, __unused_webpack_exports, __webpack_require__) => {
62
63
64var has = (__webpack_require__(4402).has);
65
66// Perform ? RequireInternalSlot(M, [[SetData]])
67module.exports = function (it) {
68	has(it);
69	return it;
70};
71
72
73/***/ }),
74
75/***/ 679:
76/***/ ((module, __unused_webpack_exports, __webpack_require__) => {
77
78
79var isPrototypeOf = __webpack_require__(1625);
80
81var $TypeError = TypeError;
82
83module.exports = function (it, Prototype) {
84	if (isPrototypeOf(Prototype, it)) return it;
85	throw new $TypeError('Incorrect invocation');
86};
87
88
89/***/ }),
90
91/***/ 8551:
92/***/ ((module, __unused_webpack_exports, __webpack_require__) => {
93
94
95var isObject = __webpack_require__(34);
96
97var $String = String;
98var $TypeError = TypeError;
99
100// `Assert: Type(argument) is Object`
101module.exports = function (argument) {
102	if (isObject(argument)) return argument;
103	throw new $TypeError($String(argument) + ' is not an object');
104};
105
106
107/***/ }),
108
109/***/ 7811:
110/***/ ((module) => {
111
112
113// eslint-disable-next-line es/no-typed-arrays -- safe
114module.exports = typeof ArrayBuffer != 'undefined' && typeof DataView != 'undefined';
115
116
117/***/ }),
118
119/***/ 7394:
120/***/ ((module, __unused_webpack_exports, __webpack_require__) => {
121
122
123var globalThis = __webpack_require__(4576);
124var uncurryThisAccessor = __webpack_require__(6706);
125var classof = __webpack_require__(2195);
126
127var ArrayBuffer = globalThis.ArrayBuffer;
128var TypeError = globalThis.TypeError;
129
130// Includes
131// - Perform ? RequireInternalSlot(O, [[ArrayBufferData]]).
132// - If IsSharedArrayBuffer(O) is true, throw a TypeError exception.
133module.exports = ArrayBuffer && uncurryThisAccessor(ArrayBuffer.prototype, 'byteLength', 'get') || function (O) {
134	if (classof(O) !== 'ArrayBuffer') throw new TypeError('ArrayBuffer expected');
135	return O.byteLength;
136};
137
138
139/***/ }),
140
141/***/ 3238:
142/***/ ((module, __unused_webpack_exports, __webpack_require__) => {
143
144
145var globalThis = __webpack_require__(4576);
146var uncurryThis = __webpack_require__(7476);
147var arrayBufferByteLength = __webpack_require__(7394);
148
149var ArrayBuffer = globalThis.ArrayBuffer;
150var ArrayBufferPrototype = ArrayBuffer && ArrayBuffer.prototype;
151var slice = ArrayBufferPrototype && uncurryThis(ArrayBufferPrototype.slice);
152
153module.exports = function (O) {
154	if (arrayBufferByteLength(O) !== 0) return false;
155	if (!slice) return false;
156	try {
157		slice(O, 0, 0);
158		return false;
159	} catch (error) {
160		return true;
161	}
162};
163
164
165/***/ }),
166
167/***/ 5169:
168/***/ ((module, __unused_webpack_exports, __webpack_require__) => {
169
170
171var isDetached = __webpack_require__(3238);
172
173var $TypeError = TypeError;
174
175module.exports = function (it) {
176	if (isDetached(it)) throw new $TypeError('ArrayBuffer is detached');
177	return it;
178};
179
180
181/***/ }),
182
183/***/ 5636:
184/***/ ((module, __unused_webpack_exports, __webpack_require__) => {
185
186
187var globalThis = __webpack_require__(4576);
188var uncurryThis = __webpack_require__(9504);
189var uncurryThisAccessor = __webpack_require__(6706);
190var toIndex = __webpack_require__(7696);
191var notDetached = __webpack_require__(5169);
192var arrayBufferByteLength = __webpack_require__(7394);
193var detachTransferable = __webpack_require__(4483);
194var PROPER_STRUCTURED_CLONE_TRANSFER = __webpack_require__(1548);
195
196var structuredClone = globalThis.structuredClone;
197var ArrayBuffer = globalThis.ArrayBuffer;
198var DataView = globalThis.DataView;
199var min = Math.min;
200var ArrayBufferPrototype = ArrayBuffer.prototype;
201var DataViewPrototype = DataView.prototype;
202var slice = uncurryThis(ArrayBufferPrototype.slice);
203var isResizable = uncurryThisAccessor(ArrayBufferPrototype, 'resizable', 'get');
204var maxByteLength = uncurryThisAccessor(ArrayBufferPrototype, 'maxByteLength', 'get');
205var getInt8 = uncurryThis(DataViewPrototype.getInt8);
206var setInt8 = uncurryThis(DataViewPrototype.setInt8);
207
208module.exports = (PROPER_STRUCTURED_CLONE_TRANSFER || detachTransferable) && function (arrayBuffer, newLength, preserveResizability) {
209	var byteLength = arrayBufferByteLength(arrayBuffer);
210	var newByteLength = newLength === undefined ? byteLength : toIndex(newLength);
211	var fixedLength = !isResizable || !isResizable(arrayBuffer);
212	var newBuffer;
213	notDetached(arrayBuffer);
214	if (PROPER_STRUCTURED_CLONE_TRANSFER) {
215		arrayBuffer = structuredClone(arrayBuffer, { transfer: [arrayBuffer] });
216		if (byteLength === newByteLength && (preserveResizability || fixedLength)) return arrayBuffer;
217	}
218	if (byteLength >= newByteLength && (!preserveResizability || fixedLength)) {
219		newBuffer = slice(arrayBuffer, 0, newByteLength);
220	} else {
221		var options = preserveResizability && !fixedLength && maxByteLength ? { maxByteLength: maxByteLength(arrayBuffer) } : undefined;
222		newBuffer = new ArrayBuffer(newByteLength, options);
223		var a = new DataView(arrayBuffer);
224		var b = new DataView(newBuffer);
225		var copyLength = min(newByteLength, byteLength);
226		for (var i = 0; i < copyLength; i++) setInt8(b, i, getInt8(a, i));
227	}
228	if (!PROPER_STRUCTURED_CLONE_TRANSFER) detachTransferable(arrayBuffer);
229	return newBuffer;
230};
231
232
233/***/ }),
234
235/***/ 4644:
236/***/ ((module, __unused_webpack_exports, __webpack_require__) => {
237
238
239var NATIVE_ARRAY_BUFFER = __webpack_require__(7811);
240var DESCRIPTORS = __webpack_require__(3724);
241var globalThis = __webpack_require__(4576);
242var isCallable = __webpack_require__(4901);
243var isObject = __webpack_require__(34);
244var hasOwn = __webpack_require__(9297);
245var classof = __webpack_require__(6955);
246var tryToString = __webpack_require__(6823);
247var createNonEnumerableProperty = __webpack_require__(6699);
248var defineBuiltIn = __webpack_require__(6840);
249var defineBuiltInAccessor = __webpack_require__(2106);
250var isPrototypeOf = __webpack_require__(1625);
251var getPrototypeOf = __webpack_require__(2787);
252var setPrototypeOf = __webpack_require__(2967);
253var wellKnownSymbol = __webpack_require__(8227);
254var uid = __webpack_require__(3392);
255var InternalStateModule = __webpack_require__(1181);
256
257var enforceInternalState = InternalStateModule.enforce;
258var getInternalState = InternalStateModule.get;
259var Int8Array = globalThis.Int8Array;
260var Int8ArrayPrototype = Int8Array && Int8Array.prototype;
261var Uint8ClampedArray = globalThis.Uint8ClampedArray;
262var Uint8ClampedArrayPrototype = Uint8ClampedArray && Uint8ClampedArray.prototype;
263var TypedArray = Int8Array && getPrototypeOf(Int8Array);
264var TypedArrayPrototype = Int8ArrayPrototype && getPrototypeOf(Int8ArrayPrototype);
265var ObjectPrototype = Object.prototype;
266var TypeError = globalThis.TypeError;
267
268var TO_STRING_TAG = wellKnownSymbol('toStringTag');
269var TYPED_ARRAY_TAG = uid('TYPED_ARRAY_TAG');
270var TYPED_ARRAY_CONSTRUCTOR = 'TypedArrayConstructor';
271// Fixing native typed arrays in Opera Presto crashes the browser, see #595
272var NATIVE_ARRAY_BUFFER_VIEWS = NATIVE_ARRAY_BUFFER && !!setPrototypeOf && classof(globalThis.opera) !== 'Opera';
273var TYPED_ARRAY_TAG_REQUIRED = false;
274var NAME, Constructor, Prototype;
275
276var TypedArrayConstructorsList = {
277	Int8Array: 1,
278	Uint8Array: 1,
279	Uint8ClampedArray: 1,
280	Int16Array: 2,
281	Uint16Array: 2,
282	Int32Array: 4,
283	Uint32Array: 4,
284	Float32Array: 4,
285	Float64Array: 8
286};
287
288var BigIntArrayConstructorsList = {
289	BigInt64Array: 8,
290	BigUint64Array: 8
291};
292
293var isView = function isView(it) {
294	if (!isObject(it)) return false;
295	var klass = classof(it);
296	return klass === 'DataView'
297		|| hasOwn(TypedArrayConstructorsList, klass)
298		|| hasOwn(BigIntArrayConstructorsList, klass);
299};
300
301var getTypedArrayConstructor = function (it) {
302	var proto = getPrototypeOf(it);
303	if (!isObject(proto)) return;
304	var state = getInternalState(proto);
305	return (state && hasOwn(state, TYPED_ARRAY_CONSTRUCTOR)) ? state[TYPED_ARRAY_CONSTRUCTOR] : getTypedArrayConstructor(proto);
306};
307
308var isTypedArray = function (it) {
309	if (!isObject(it)) return false;
310	var klass = classof(it);
311	return hasOwn(TypedArrayConstructorsList, klass)
312		|| hasOwn(BigIntArrayConstructorsList, klass);
313};
314
315var aTypedArray = function (it) {
316	if (isTypedArray(it)) return it;
317	throw new TypeError('Target is not a typed array');
318};
319
320var aTypedArrayConstructor = function (C) {
321	if (isCallable(C) && (!setPrototypeOf || isPrototypeOf(TypedArray, C))) return C;
322	throw new TypeError(tryToString(C) + ' is not a typed array constructor');
323};
324
325var exportTypedArrayMethod = function (KEY, property, forced, options) {
326	if (!DESCRIPTORS) return;
327	if (forced) for (var ARRAY in TypedArrayConstructorsList) {
328		var TypedArrayConstructor = globalThis[ARRAY];
329		if (TypedArrayConstructor && hasOwn(TypedArrayConstructor.prototype, KEY)) try {
330			delete TypedArrayConstructor.prototype[KEY];
331		} catch (error) {
332			// old WebKit bug - some methods are non-configurable
333			try {
334				TypedArrayConstructor.prototype[KEY] = property;
335			} catch (error2) { /* empty */ }
336		}
337	}
338	if (!TypedArrayPrototype[KEY] || forced) {
339		defineBuiltIn(TypedArrayPrototype, KEY, forced ? property
340			: NATIVE_ARRAY_BUFFER_VIEWS && Int8ArrayPrototype[KEY] || property, options);
341	}
342};
343
344var exportTypedArrayStaticMethod = function (KEY, property, forced) {
345	var ARRAY, TypedArrayConstructor;
346	if (!DESCRIPTORS) return;
347	if (setPrototypeOf) {
348		if (forced) for (ARRAY in TypedArrayConstructorsList) {
349			TypedArrayConstructor = globalThis[ARRAY];
350			if (TypedArrayConstructor && hasOwn(TypedArrayConstructor, KEY)) try {
351				delete TypedArrayConstructor[KEY];
352			} catch (error) { /* empty */ }
353		}
354		if (!TypedArray[KEY] || forced) {
355			// V8 ~ Chrome 49-50 `%TypedArray%` methods are non-writable non-configurable
356			try {
357				return defineBuiltIn(TypedArray, KEY, forced ? property : NATIVE_ARRAY_BUFFER_VIEWS && TypedArray[KEY] || property);
358			} catch (error) { /* empty */ }
359		} else return;
360	}
361	for (ARRAY in TypedArrayConstructorsList) {
362		TypedArrayConstructor = globalThis[ARRAY];
363		if (TypedArrayConstructor && (!TypedArrayConstructor[KEY] || forced)) {
364			defineBuiltIn(TypedArrayConstructor, KEY, property);
365		}
366	}
367};
368
369for (NAME in TypedArrayConstructorsList) {
370	Constructor = globalThis[NAME];
371	Prototype = Constructor && Constructor.prototype;
372	if (Prototype) enforceInternalState(Prototype)[TYPED_ARRAY_CONSTRUCTOR] = Constructor;
373	else NATIVE_ARRAY_BUFFER_VIEWS = false;
374}
375
376for (NAME in BigIntArrayConstructorsList) {
377	Constructor = globalThis[NAME];
378	Prototype = Constructor && Constructor.prototype;
379	if (Prototype) enforceInternalState(Prototype)[TYPED_ARRAY_CONSTRUCTOR] = Constructor;
380}
381
382// WebKit bug - typed arrays constructors prototype is Object.prototype
383if (!NATIVE_ARRAY_BUFFER_VIEWS || !isCallable(TypedArray) || TypedArray === Function.prototype) {
384	// eslint-disable-next-line no-shadow -- safe
385	TypedArray = function TypedArray() {
386		throw new TypeError('Incorrect invocation');
387	};
388	if (NATIVE_ARRAY_BUFFER_VIEWS) for (NAME in TypedArrayConstructorsList) {
389		if (globalThis[NAME]) setPrototypeOf(globalThis[NAME], TypedArray);
390	}
391}
392
393if (!NATIVE_ARRAY_BUFFER_VIEWS || !TypedArrayPrototype || TypedArrayPrototype === ObjectPrototype) {
394	TypedArrayPrototype = TypedArray.prototype;
395	if (NATIVE_ARRAY_BUFFER_VIEWS) for (NAME in TypedArrayConstructorsList) {
396		if (globalThis[NAME]) setPrototypeOf(globalThis[NAME].prototype, TypedArrayPrototype);
397	}
398}
399
400// WebKit bug - one more object in Uint8ClampedArray prototype chain
401if (NATIVE_ARRAY_BUFFER_VIEWS && getPrototypeOf(Uint8ClampedArrayPrototype) !== TypedArrayPrototype) {
402	setPrototypeOf(Uint8ClampedArrayPrototype, TypedArrayPrototype);
403}
404
405if (DESCRIPTORS && !hasOwn(TypedArrayPrototype, TO_STRING_TAG)) {
406	TYPED_ARRAY_TAG_REQUIRED = true;
407	defineBuiltInAccessor(TypedArrayPrototype, TO_STRING_TAG, {
408		configurable: true,
409		get: function () {
410			return isObject(this) ? this[TYPED_ARRAY_TAG] : undefined;
411		}
412	});
413	for (NAME in TypedArrayConstructorsList) if (globalThis[NAME]) {
414		createNonEnumerableProperty(globalThis[NAME], TYPED_ARRAY_TAG, NAME);
415	}
416}
417
418module.exports = {
419	NATIVE_ARRAY_BUFFER_VIEWS: NATIVE_ARRAY_BUFFER_VIEWS,
420	TYPED_ARRAY_TAG: TYPED_ARRAY_TAG_REQUIRED && TYPED_ARRAY_TAG,
421	aTypedArray: aTypedArray,
422	aTypedArrayConstructor: aTypedArrayConstructor,
423	exportTypedArrayMethod: exportTypedArrayMethod,
424	exportTypedArrayStaticMethod: exportTypedArrayStaticMethod,
425	getTypedArrayConstructor: getTypedArrayConstructor,
426	isView: isView,
427	isTypedArray: isTypedArray,
428	TypedArray: TypedArray,
429	TypedArrayPrototype: TypedArrayPrototype
430};
431
432
433/***/ }),
434
435/***/ 5370:
436/***/ ((module, __unused_webpack_exports, __webpack_require__) => {
437
438
439var lengthOfArrayLike = __webpack_require__(6198);
440
441module.exports = function (Constructor, list, $length) {
442	var index = 0;
443	var length = arguments.length > 2 ? $length : lengthOfArrayLike(list);
444	var result = new Constructor(length);
445	while (length > index) result[index] = list[index++];
446	return result;
447};
448
449
450/***/ }),
451
452/***/ 9617:
453/***/ ((module, __unused_webpack_exports, __webpack_require__) => {
454
455
456var toIndexedObject = __webpack_require__(5397);
457var toAbsoluteIndex = __webpack_require__(5610);
458var lengthOfArrayLike = __webpack_require__(6198);
459
460// `Array.prototype.{ indexOf, includes }` methods implementation
461var createMethod = function (IS_INCLUDES) {
462	return function ($this, el, fromIndex) {
463		var O = toIndexedObject($this);
464		var length = lengthOfArrayLike(O);
465		if (length === 0) return !IS_INCLUDES && -1;
466		var index = toAbsoluteIndex(fromIndex, length);
467		var value;
468		// Array#includes uses SameValueZero equality algorithm
469		// eslint-disable-next-line no-self-compare -- NaN check
470		if (IS_INCLUDES && el !== el) while (length > index) {
471			value = O[index++];
472			// eslint-disable-next-line no-self-compare -- NaN check
473			if (value !== value) return true;
474		// Array#indexOf ignores holes, Array#includes - not
475		} else for (;length > index; index++) {
476			if ((IS_INCLUDES || index in O) && O[index] === el) return IS_INCLUDES || index || 0;
477		} return !IS_INCLUDES && -1;
478	};
479};
480
481module.exports = {
482	// `Array.prototype.includes` method
483	// https://tc39.es/ecma262/#sec-array.prototype.includes
484	includes: createMethod(true),
485	// `Array.prototype.indexOf` method
486	// https://tc39.es/ecma262/#sec-array.prototype.indexof
487	indexOf: createMethod(false)
488};
489
490
491/***/ }),
492
493/***/ 4527:
494/***/ ((module, __unused_webpack_exports, __webpack_require__) => {
495
496
497var DESCRIPTORS = __webpack_require__(3724);
498var isArray = __webpack_require__(4376);
499
500var $TypeError = TypeError;
501// eslint-disable-next-line es/no-object-getownpropertydescriptor -- safe
502var getOwnPropertyDescriptor = Object.getOwnPropertyDescriptor;
503
504// Safari < 13 does not throw an error in this case
505var SILENT_ON_NON_WRITABLE_LENGTH_SET = DESCRIPTORS && !function () {
506	// makes no sense without proper strict mode support
507	if (this !== undefined) return true;
508	try {
509		// eslint-disable-next-line es/no-object-defineproperty -- safe
510		Object.defineProperty([], 'length', { writable: false }).length = 1;
511	} catch (error) {
512		return error instanceof TypeError;
513	}
514}();
515
516module.exports = SILENT_ON_NON_WRITABLE_LENGTH_SET ? function (O, length) {
517	if (isArray(O) && !getOwnPropertyDescriptor(O, 'length').writable) {
518		throw new $TypeError('Cannot set read only .length');
519	} return O.length = length;
520} : function (O, length) {
521	return O.length = length;
522};
523
524
525/***/ }),
526
527/***/ 7680:
528/***/ ((module, __unused_webpack_exports, __webpack_require__) => {
529
530
531var uncurryThis = __webpack_require__(9504);
532
533module.exports = uncurryThis([].slice);
534
535
536/***/ }),
537
538/***/ 7628:
539/***/ ((module, __unused_webpack_exports, __webpack_require__) => {
540
541
542var lengthOfArrayLike = __webpack_require__(6198);
543
544// https://tc39.es/proposal-change-array-by-copy/#sec-array.prototype.toReversed
545// https://tc39.es/proposal-change-array-by-copy/#sec-%typedarray%.prototype.toReversed
546module.exports = function (O, C) {
547	var len = lengthOfArrayLike(O);
548	var A = new C(len);
549	var k = 0;
550	for (; k < len; k++) A[k] = O[len - k - 1];
551	return A;
552};
553
554
555/***/ }),
556
557/***/ 9928:
558/***/ ((module, __unused_webpack_exports, __webpack_require__) => {
559
560
561var lengthOfArrayLike = __webpack_require__(6198);
562var toIntegerOrInfinity = __webpack_require__(1291);
563
564var $RangeError = RangeError;
565
566// https://tc39.es/proposal-change-array-by-copy/#sec-array.prototype.with
567// https://tc39.es/proposal-change-array-by-copy/#sec-%typedarray%.prototype.with
568module.exports = function (O, C, index, value) {
569	var len = lengthOfArrayLike(O);
570	var relativeIndex = toIntegerOrInfinity(index);
571	var actualIndex = relativeIndex < 0 ? len + relativeIndex : relativeIndex;
572	if (actualIndex >= len || actualIndex < 0) throw new $RangeError('Incorrect index');
573	var A = new C(len);
574	var k = 0;
575	for (; k < len; k++) A[k] = k === actualIndex ? value : O[k];
576	return A;
577};
578
579
580/***/ }),
581
582/***/ 6319:
583/***/ ((module, __unused_webpack_exports, __webpack_require__) => {
584
585
586var anObject = __webpack_require__(8551);
587var iteratorClose = __webpack_require__(9539);
588
589// call something on iterator step with safe closing on error
590module.exports = function (iterator, fn, value, ENTRIES) {
591	try {
592		return ENTRIES ? fn(anObject(value)[0], value[1]) : fn(value);
593	} catch (error) {
594		iteratorClose(iterator, 'throw', error);
595	}
596};
597
598
599/***/ }),
600
601/***/ 2195:
602/***/ ((module, __unused_webpack_exports, __webpack_require__) => {
603
604
605var uncurryThis = __webpack_require__(9504);
606
607var toString = uncurryThis({}.toString);
608var stringSlice = uncurryThis(''.slice);
609
610module.exports = function (it) {
611	return stringSlice(toString(it), 8, -1);
612};
613
614
615/***/ }),
616
617/***/ 6955:
618/***/ ((module, __unused_webpack_exports, __webpack_require__) => {
619
620
621var TO_STRING_TAG_SUPPORT = __webpack_require__(2140);
622var isCallable = __webpack_require__(4901);
623var classofRaw = __webpack_require__(2195);
624var wellKnownSymbol = __webpack_require__(8227);
625
626var TO_STRING_TAG = wellKnownSymbol('toStringTag');
627var $Object = Object;
628
629// ES3 wrong here
630var CORRECT_ARGUMENTS = classofRaw(function () { return arguments; }()) === 'Arguments';
631
632// fallback for IE11 Script Access Denied error
633var tryGet = function (it, key) {
634	try {
635		return it[key];
636	} catch (error) { /* empty */ }
637};
638
639// getting tag from ES6+ `Object.prototype.toString`
640module.exports = TO_STRING_TAG_SUPPORT ? classofRaw : function (it) {
641	var O, tag, result;
642	return it === undefined ? 'Undefined' : it === null ? 'Null'
643		// @@toStringTag case
644		: typeof (tag = tryGet(O = $Object(it), TO_STRING_TAG)) == 'string' ? tag
645		// builtinTag case
646		: CORRECT_ARGUMENTS ? classofRaw(O)
647		// ES3 arguments fallback
648		: (result = classofRaw(O)) === 'Object' && isCallable(O.callee) ? 'Arguments' : result;
649};
650
651
652/***/ }),
653
654/***/ 7740:
655/***/ ((module, __unused_webpack_exports, __webpack_require__) => {
656
657
658var hasOwn = __webpack_require__(9297);
659var ownKeys = __webpack_require__(5031);
660var getOwnPropertyDescriptorModule = __webpack_require__(7347);
661var definePropertyModule = __webpack_require__(4913);
662
663module.exports = function (target, source, exceptions) {
664	var keys = ownKeys(source);
665	var defineProperty = definePropertyModule.f;
666	var getOwnPropertyDescriptor = getOwnPropertyDescriptorModule.f;
667	for (var i = 0; i < keys.length; i++) {
668		var key = keys[i];
669		if (!hasOwn(target, key) && !(exceptions && hasOwn(exceptions, key))) {
670			defineProperty(target, key, getOwnPropertyDescriptor(source, key));
671		}
672	}
673};
674
675
676/***/ }),
677
678/***/ 2211:
679/***/ ((module, __unused_webpack_exports, __webpack_require__) => {
680
681
682var fails = __webpack_require__(9039);
683
684module.exports = !fails(function () {
685	function F() { /* empty */ }
686	F.prototype.constructor = null;
687	// eslint-disable-next-line es/no-object-getprototypeof -- required for testing
688	return Object.getPrototypeOf(new F()) !== F.prototype;
689});
690
691
692/***/ }),
693
694/***/ 2529:
695/***/ ((module) => {
696
697
698// `CreateIterResultObject` abstract operation
699// https://tc39.es/ecma262/#sec-createiterresultobject
700module.exports = function (value, done) {
701	return { value: value, done: done };
702};
703
704
705/***/ }),
706
707/***/ 6699:
708/***/ ((module, __unused_webpack_exports, __webpack_require__) => {
709
710
711var DESCRIPTORS = __webpack_require__(3724);
712var definePropertyModule = __webpack_require__(4913);
713var createPropertyDescriptor = __webpack_require__(6980);
714
715module.exports = DESCRIPTORS ? function (object, key, value) {
716	return definePropertyModule.f(object, key, createPropertyDescriptor(1, value));
717} : function (object, key, value) {
718	object[key] = value;
719	return object;
720};
721
722
723/***/ }),
724
725/***/ 6980:
726/***/ ((module) => {
727
728
729module.exports = function (bitmap, value) {
730	return {
731		enumerable: !(bitmap & 1),
732		configurable: !(bitmap & 2),
733		writable: !(bitmap & 4),
734		value: value
735	};
736};
737
738
739/***/ }),
740
741/***/ 4659:
742/***/ ((module, __unused_webpack_exports, __webpack_require__) => {
743
744
745var DESCRIPTORS = __webpack_require__(3724);
746var definePropertyModule = __webpack_require__(4913);
747var createPropertyDescriptor = __webpack_require__(6980);
748
749module.exports = function (object, key, value) {
750	if (DESCRIPTORS) definePropertyModule.f(object, key, createPropertyDescriptor(0, value));
751	else object[key] = value;
752};
753
754
755/***/ }),
756
757/***/ 2106:
758/***/ ((module, __unused_webpack_exports, __webpack_require__) => {
759
760
761var makeBuiltIn = __webpack_require__(283);
762var defineProperty = __webpack_require__(4913);
763
764module.exports = function (target, name, descriptor) {
765	if (descriptor.get) makeBuiltIn(descriptor.get, name, { getter: true });
766	if (descriptor.set) makeBuiltIn(descriptor.set, name, { setter: true });
767	return defineProperty.f(target, name, descriptor);
768};
769
770
771/***/ }),
772
773/***/ 6840:
774/***/ ((module, __unused_webpack_exports, __webpack_require__) => {
775
776
777var isCallable = __webpack_require__(4901);
778var definePropertyModule = __webpack_require__(4913);
779var makeBuiltIn = __webpack_require__(283);
780var defineGlobalProperty = __webpack_require__(9433);
781
782module.exports = function (O, key, value, options) {
783	if (!options) options = {};
784	var simple = options.enumerable;
785	var name = options.name !== undefined ? options.name : key;
786	if (isCallable(value)) makeBuiltIn(value, name, options);
787	if (options.global) {
788		if (simple) O[key] = value;
789		else defineGlobalProperty(key, value);
790	} else {
791		try {
792			if (!options.unsafe) delete O[key];
793			else if (O[key]) simple = true;
794		} catch (error) { /* empty */ }
795		if (simple) O[key] = value;
796		else definePropertyModule.f(O, key, {
797			value: value,
798			enumerable: false,
799			configurable: !options.nonConfigurable,
800			writable: !options.nonWritable
801		});
802	} return O;
803};
804
805
806/***/ }),
807
808/***/ 6279:
809/***/ ((module, __unused_webpack_exports, __webpack_require__) => {
810
811
812var defineBuiltIn = __webpack_require__(6840);
813
814module.exports = function (target, src, options) {
815	for (var key in src) defineBuiltIn(target, key, src[key], options);
816	return target;
817};
818
819
820/***/ }),
821
822/***/ 9433:
823/***/ ((module, __unused_webpack_exports, __webpack_require__) => {
824
825
826var globalThis = __webpack_require__(4576);
827
828// eslint-disable-next-line es/no-object-defineproperty -- safe
829var defineProperty = Object.defineProperty;
830
831module.exports = function (key, value) {
832	try {
833		defineProperty(globalThis, key, { value: value, configurable: true, writable: true });
834	} catch (error) {
835		globalThis[key] = value;
836	} return value;
837};
838
839
840/***/ }),
841
842/***/ 3724:
843/***/ ((module, __unused_webpack_exports, __webpack_require__) => {
844
845
846var fails = __webpack_require__(9039);
847
848// Detect IE8's incomplete defineProperty implementation
849module.exports = !fails(function () {
850	// eslint-disable-next-line es/no-object-defineproperty -- required for testing
851	return Object.defineProperty({}, 1, { get: function () { return 7; } })[1] !== 7;
852});
853
854
855/***/ }),
856
857/***/ 4483:
858/***/ ((module, __unused_webpack_exports, __webpack_require__) => {
859
860
861var globalThis = __webpack_require__(4576);
862var getBuiltInNodeModule = __webpack_require__(9429);
863var PROPER_STRUCTURED_CLONE_TRANSFER = __webpack_require__(1548);
864
865var structuredClone = globalThis.structuredClone;
866var $ArrayBuffer = globalThis.ArrayBuffer;
867var $MessageChannel = globalThis.MessageChannel;
868var detach = false;
869var WorkerThreads, channel, buffer, $detach;
870
871if (PROPER_STRUCTURED_CLONE_TRANSFER) {
872	detach = function (transferable) {
873		structuredClone(transferable, { transfer: [transferable] });
874	};
875} else if ($ArrayBuffer) try {
876	if (!$MessageChannel) {
877		WorkerThreads = getBuiltInNodeModule('worker_threads');
878		if (WorkerThreads) $MessageChannel = WorkerThreads.MessageChannel;
879	}
880
881	if ($MessageChannel) {
882		channel = new $MessageChannel();
883		buffer = new $ArrayBuffer(2);
884
885		$detach = function (transferable) {
886			channel.port1.postMessage(null, [transferable]);
887		};
888
889		if (buffer.byteLength === 2) {
890			$detach(buffer);
891			if (buffer.byteLength === 0) detach = $detach;
892		}
893	}
894} catch (error) { /* empty */ }
895
896module.exports = detach;
897
898
899/***/ }),
900
901/***/ 4055:
902/***/ ((module, __unused_webpack_exports, __webpack_require__) => {
903
904
905var globalThis = __webpack_require__(4576);
906var isObject = __webpack_require__(34);
907
908var document = globalThis.document;
909// typeof document.createElement is 'object' in old IE
910var EXISTS = isObject(document) && isObject(document.createElement);
911
912module.exports = function (it) {
913	return EXISTS ? document.createElement(it) : {};
914};
915
916
917/***/ }),
918
919/***/ 6837:
920/***/ ((module) => {
921
922
923var $TypeError = TypeError;
924var MAX_SAFE_INTEGER = 0x1FFFFFFFFFFFFF; // 2 ** 53 - 1 == 9007199254740991
925
926module.exports = function (it) {
927	if (it > MAX_SAFE_INTEGER) throw $TypeError('Maximum allowed index exceeded');
928	return it;
929};
930
931
932/***/ }),
933
934/***/ 5002:
935/***/ ((module) => {
936
937
938module.exports = {
939	IndexSizeError: { s: 'INDEX_SIZE_ERR', c: 1, m: 1 },
940	DOMStringSizeError: { s: 'DOMSTRING_SIZE_ERR', c: 2, m: 0 },
941	HierarchyRequestError: { s: 'HIERARCHY_REQUEST_ERR', c: 3, m: 1 },
942	WrongDocumentError: { s: 'WRONG_DOCUMENT_ERR', c: 4, m: 1 },
943	InvalidCharacterError: { s: 'INVALID_CHARACTER_ERR', c: 5, m: 1 },
944	NoDataAllowedError: { s: 'NO_DATA_ALLOWED_ERR', c: 6, m: 0 },
945	NoModificationAllowedError: { s: 'NO_MODIFICATION_ALLOWED_ERR', c: 7, m: 1 },
946	NotFoundError: { s: 'NOT_FOUND_ERR', c: 8, m: 1 },
947	NotSupportedError: { s: 'NOT_SUPPORTED_ERR', c: 9, m: 1 },
948	InUseAttributeError: { s: 'INUSE_ATTRIBUTE_ERR', c: 10, m: 1 },
949	InvalidStateError: { s: 'INVALID_STATE_ERR', c: 11, m: 1 },
950	SyntaxError: { s: 'SYNTAX_ERR', c: 12, m: 1 },
951	InvalidModificationError: { s: 'INVALID_MODIFICATION_ERR', c: 13, m: 1 },
952	NamespaceError: { s: 'NAMESPACE_ERR', c: 14, m: 1 },
953	InvalidAccessError: { s: 'INVALID_ACCESS_ERR', c: 15, m: 1 },
954	ValidationError: { s: 'VALIDATION_ERR', c: 16, m: 0 },
955	TypeMismatchError: { s: 'TYPE_MISMATCH_ERR', c: 17, m: 1 },
956	SecurityError: { s: 'SECURITY_ERR', c: 18, m: 1 },
957	NetworkError: { s: 'NETWORK_ERR', c: 19, m: 1 },
958	AbortError: { s: 'ABORT_ERR', c: 20, m: 1 },
959	URLMismatchError: { s: 'URL_MISMATCH_ERR', c: 21, m: 1 },
960	QuotaExceededError: { s: 'QUOTA_EXCEEDED_ERR', c: 22, m: 1 },
961	TimeoutError: { s: 'TIMEOUT_ERR', c: 23, m: 1 },
962	InvalidNodeTypeError: { s: 'INVALID_NODE_TYPE_ERR', c: 24, m: 1 },
963	DataCloneError: { s: 'DATA_CLONE_ERR', c: 25, m: 1 }
964};
965
966
967/***/ }),
968
969/***/ 8727:
970/***/ ((module) => {
971
972
973// IE8- don't enum bug keys
974module.exports = [
975	'constructor',
976	'hasOwnProperty',
977	'isPrototypeOf',
978	'propertyIsEnumerable',
979	'toLocaleString',
980	'toString',
981	'valueOf'
982];
983
984
985/***/ }),
986
987/***/ 6193:
988/***/ ((module, __unused_webpack_exports, __webpack_require__) => {
989
990
991var ENVIRONMENT = __webpack_require__(4215);
992
993module.exports = ENVIRONMENT === 'NODE';
994
995
996/***/ }),
997
998/***/ 2839:
999/***/ ((module, __unused_webpack_exports, __webpack_require__) => {
1000
1001
1002var globalThis = __webpack_require__(4576);
1003
1004var navigator = globalThis.navigator;
1005var userAgent = navigator && navigator.userAgent;
1006
1007module.exports = userAgent ? String(userAgent) : '';
1008
1009
1010/***/ }),
1011
1012/***/ 9519:
1013/***/ ((module, __unused_webpack_exports, __webpack_require__) => {
1014
1015
1016var globalThis = __webpack_require__(4576);
1017var userAgent = __webpack_require__(2839);
1018
1019var process = globalThis.process;
1020var Deno = globalThis.Deno;
1021var versions = process && process.versions || Deno && Deno.version;
1022var v8 = versions && versions.v8;
1023var match, version;
1024
1025if (v8) {
1026	match = v8.split('.');
1027	// in old Chrome, versions of V8 isn't V8 = Chrome / 10
1028	// but their correct versions are not interesting for us
1029	version = match[0] > 0 && match[0] < 4 ? 1 : +(match[0] + match[1]);
1030}
1031
1032// BrowserFS NodeJS `process` polyfill incorrectly set `.v8` to `0.0`
1033// so check `userAgent` even if `.v8` exists, but 0
1034if (!version && userAgent) {
1035	match = userAgent.match(/Edge\/(\d+)/);
1036	if (!match || match[1] >= 74) {
1037		match = userAgent.match(/Chrome\/(\d+)/);
1038		if (match) version = +match[1];
1039	}
1040}
1041
1042module.exports = version;
1043
1044
1045/***/ }),
1046
1047/***/ 4215:
1048/***/ ((module, __unused_webpack_exports, __webpack_require__) => {
1049
1050
1051/* global Bun, Deno -- detection */
1052var globalThis = __webpack_require__(4576);
1053var userAgent = __webpack_require__(2839);
1054var classof = __webpack_require__(2195);
1055
1056var userAgentStartsWith = function (string) {
1057	return userAgent.slice(0, string.length) === string;
1058};
1059
1060module.exports = (function () {
1061	if (userAgentStartsWith('Bun/')) return 'BUN';
1062	if (userAgentStartsWith('Cloudflare-Workers')) return 'CLOUDFLARE';
1063	if (userAgentStartsWith('Deno/')) return 'DENO';
1064	if (userAgentStartsWith('Node.js/')) return 'NODE';
1065	if (globalThis.Bun && typeof Bun.version == 'string') return 'BUN';
1066	if (globalThis.Deno && typeof Deno.version == 'object') return 'DENO';
1067	if (classof(globalThis.process) === 'process') return 'NODE';
1068	if (globalThis.window && globalThis.document) return 'BROWSER';
1069	return 'REST';
1070})();
1071
1072
1073/***/ }),
1074
1075/***/ 8574:
1076/***/ ((module, __unused_webpack_exports, __webpack_require__) => {
1077
1078
1079var uncurryThis = __webpack_require__(9504);
1080
1081var $Error = Error;
1082var replace = uncurryThis(''.replace);
1083
1084var TEST = (function (arg) { return String(new $Error(arg).stack); })('zxcasd');
1085// eslint-disable-next-line redos/no-vulnerable, sonarjs/slow-regex -- safe
1086var V8_OR_CHAKRA_STACK_ENTRY = /\n\s*at [^:]*:[^\n]*/;
1087var IS_V8_OR_CHAKRA_STACK = V8_OR_CHAKRA_STACK_ENTRY.test(TEST);
1088
1089module.exports = function (stack, dropEntries) {
1090	if (IS_V8_OR_CHAKRA_STACK && typeof stack == 'string' && !$Error.prepareStackTrace) {
1091		while (dropEntries--) stack = replace(stack, V8_OR_CHAKRA_STACK_ENTRY, '');
1092	} return stack;
1093};
1094
1095
1096/***/ }),
1097
1098/***/ 6518:
1099/***/ ((module, __unused_webpack_exports, __webpack_require__) => {
1100
1101
1102var globalThis = __webpack_require__(4576);
1103var getOwnPropertyDescriptor = (__webpack_require__(7347).f);
1104var createNonEnumerableProperty = __webpack_require__(6699);
1105var defineBuiltIn = __webpack_require__(6840);
1106var defineGlobalProperty = __webpack_require__(9433);
1107var copyConstructorProperties = __webpack_require__(7740);
1108var isForced = __webpack_require__(2796);
1109
1110/*
1111	options.target         - name of the target object
1112	options.global         - target is the global object
1113	options.stat           - export as static methods of target
1114	options.proto          - export as prototype methods of target
1115	options.real           - real prototype method for the `pure` version
1116	options.forced         - export even if the native feature is available
1117	options.bind           - bind methods to the target, required for the `pure` version
1118	options.wrap           - wrap constructors to preventing global pollution, required for the `pure` version
1119	options.unsafe         - use the simple assignment of property instead of delete + defineProperty
1120	options.sham           - add a flag to not completely full polyfills
1121	options.enumerable     - export as enumerable property
1122	options.dontCallGetSet - prevent calling a getter on target
1123	options.name           - the .name of the function if it does not match the key
1124*/
1125module.exports = function (options, source) {
1126	var TARGET = options.target;
1127	var GLOBAL = options.global;
1128	var STATIC = options.stat;
1129	var FORCED, target, key, targetProperty, sourceProperty, descriptor;
1130	if (GLOBAL) {
1131		target = globalThis;
1132	} else if (STATIC) {
1133		target = globalThis[TARGET] || defineGlobalProperty(TARGET, {});
1134	} else {
1135		target = globalThis[TARGET] && globalThis[TARGET].prototype;
1136	}
1137	if (target) for (key in source) {
1138		sourceProperty = source[key];
1139		if (options.dontCallGetSet) {
1140			descriptor = getOwnPropertyDescriptor(target, key);
1141			targetProperty = descriptor && descriptor.value;
1142		} else targetProperty = target[key];
1143		FORCED = isForced(GLOBAL ? key : TARGET + (STATIC ? '.' : '#') + key, options.forced);
1144		// contained in target
1145		if (!FORCED && targetProperty !== undefined) {
1146			if (typeof sourceProperty == typeof targetProperty) continue;
1147			copyConstructorProperties(sourceProperty, targetProperty);
1148		}
1149		// add a flag to not completely full polyfills
1150		if (options.sham || (targetProperty && targetProperty.sham)) {
1151			createNonEnumerableProperty(sourceProperty, 'sham', true);
1152		}
1153		defineBuiltIn(target, key, sourceProperty, options);
1154	}
1155};
1156
1157
1158/***/ }),
1159
1160/***/ 9039:
1161/***/ ((module) => {
1162
1163
1164module.exports = function (exec) {
1165	try {
1166		return !!exec();
1167	} catch (error) {
1168		return true;
1169	}
1170};
1171
1172
1173/***/ }),
1174
1175/***/ 8745:
1176/***/ ((module, __unused_webpack_exports, __webpack_require__) => {
1177
1178
1179var NATIVE_BIND = __webpack_require__(616);
1180
1181var FunctionPrototype = Function.prototype;
1182var apply = FunctionPrototype.apply;
1183var call = FunctionPrototype.call;
1184
1185// eslint-disable-next-line es/no-reflect -- safe
1186module.exports = typeof Reflect == 'object' && Reflect.apply || (NATIVE_BIND ? call.bind(apply) : function () {
1187	return call.apply(apply, arguments);
1188});
1189
1190
1191/***/ }),
1192
1193/***/ 6080:
1194/***/ ((module, __unused_webpack_exports, __webpack_require__) => {
1195
1196
1197var uncurryThis = __webpack_require__(7476);
1198var aCallable = __webpack_require__(9306);
1199var NATIVE_BIND = __webpack_require__(616);
1200
1201var bind = uncurryThis(uncurryThis.bind);
1202
1203// optional / simple context binding
1204module.exports = function (fn, that) {
1205	aCallable(fn);
1206	return that === undefined ? fn : NATIVE_BIND ? bind(fn, that) : function (/* ...args */) {
1207		return fn.apply(that, arguments);
1208	};
1209};
1210
1211
1212/***/ }),
1213
1214/***/ 616:
1215/***/ ((module, __unused_webpack_exports, __webpack_require__) => {
1216
1217
1218var fails = __webpack_require__(9039);
1219
1220module.exports = !fails(function () {
1221	// eslint-disable-next-line es/no-function-prototype-bind -- safe
1222	var test = (function () { /* empty */ }).bind();
1223	// eslint-disable-next-line no-prototype-builtins -- safe
1224	return typeof test != 'function' || test.hasOwnProperty('prototype');
1225});
1226
1227
1228/***/ }),
1229
1230/***/ 9565:
1231/***/ ((module, __unused_webpack_exports, __webpack_require__) => {
1232
1233
1234var NATIVE_BIND = __webpack_require__(616);
1235
1236var call = Function.prototype.call;
1237
1238module.exports = NATIVE_BIND ? call.bind(call) : function () {
1239	return call.apply(call, arguments);
1240};
1241
1242
1243/***/ }),
1244
1245/***/ 350:
1246/***/ ((module, __unused_webpack_exports, __webpack_require__) => {
1247
1248
1249var DESCRIPTORS = __webpack_require__(3724);
1250var hasOwn = __webpack_require__(9297);
1251
1252var FunctionPrototype = Function.prototype;
1253// eslint-disable-next-line es/no-object-getownpropertydescriptor -- safe
1254var getDescriptor = DESCRIPTORS && Object.getOwnPropertyDescriptor;
1255
1256var EXISTS = hasOwn(FunctionPrototype, 'name');
1257// additional protection from minified / mangled / dropped function names
1258var PROPER = EXISTS && (function something() { /* empty */ }).name === 'something';
1259var CONFIGURABLE = EXISTS && (!DESCRIPTORS || (DESCRIPTORS && getDescriptor(FunctionPrototype, 'name').configurable));
1260
1261module.exports = {
1262	EXISTS: EXISTS,
1263	PROPER: PROPER,
1264	CONFIGURABLE: CONFIGURABLE
1265};
1266
1267
1268/***/ }),
1269
1270/***/ 6706:
1271/***/ ((module, __unused_webpack_exports, __webpack_require__) => {
1272
1273
1274var uncurryThis = __webpack_require__(9504);
1275var aCallable = __webpack_require__(9306);
1276
1277module.exports = function (object, key, method) {
1278	try {
1279		// eslint-disable-next-line es/no-object-getownpropertydescriptor -- safe
1280		return uncurryThis(aCallable(Object.getOwnPropertyDescriptor(object, key)[method]));
1281	} catch (error) { /* empty */ }
1282};
1283
1284
1285/***/ }),
1286
1287/***/ 7476:
1288/***/ ((module, __unused_webpack_exports, __webpack_require__) => {
1289
1290
1291var classofRaw = __webpack_require__(2195);
1292var uncurryThis = __webpack_require__(9504);
1293
1294module.exports = function (fn) {
1295	// Nashorn bug:
1296	//   https://github.com/zloirock/core-js/issues/1128
1297	//   https://github.com/zloirock/core-js/issues/1130
1298	if (classofRaw(fn) === 'Function') return uncurryThis(fn);
1299};
1300
1301
1302/***/ }),
1303
1304/***/ 9504:
1305/***/ ((module, __unused_webpack_exports, __webpack_require__) => {
1306
1307
1308var NATIVE_BIND = __webpack_require__(616);
1309
1310var FunctionPrototype = Function.prototype;
1311var call = FunctionPrototype.call;
1312var uncurryThisWithBind = NATIVE_BIND && FunctionPrototype.bind.bind(call, call);
1313
1314module.exports = NATIVE_BIND ? uncurryThisWithBind : function (fn) {
1315	return function () {
1316		return call.apply(fn, arguments);
1317	};
1318};
1319
1320
1321/***/ }),
1322
1323/***/ 9429:
1324/***/ ((module, __unused_webpack_exports, __webpack_require__) => {
1325
1326
1327var globalThis = __webpack_require__(4576);
1328var IS_NODE = __webpack_require__(6193);
1329
1330module.exports = function (name) {
1331	if (IS_NODE) {
1332		try {
1333			return globalThis.process.getBuiltinModule(name);
1334		} catch (error) { /* empty */ }
1335		try {
1336			// eslint-disable-next-line no-new-func -- safe
1337			return Function('return require("' + name + '")')();
1338		} catch (error) { /* empty */ }
1339	}
1340};
1341
1342
1343/***/ }),
1344
1345/***/ 7751:
1346/***/ ((module, __unused_webpack_exports, __webpack_require__) => {
1347
1348
1349var globalThis = __webpack_require__(4576);
1350var isCallable = __webpack_require__(4901);
1351
1352var aFunction = function (argument) {
1353	return isCallable(argument) ? argument : undefined;
1354};
1355
1356module.exports = function (namespace, method) {
1357	return arguments.length < 2 ? aFunction(globalThis[namespace]) : globalThis[namespace] && globalThis[namespace][method];
1358};
1359
1360
1361/***/ }),
1362
1363/***/ 1767:
1364/***/ ((module) => {
1365
1366
1367// `GetIteratorDirect(obj)` abstract operation
1368// https://tc39.es/proposal-iterator-helpers/#sec-getiteratordirect
1369module.exports = function (obj) {
1370	return {
1371		iterator: obj,
1372		next: obj.next,
1373		done: false
1374	};
1375};
1376
1377
1378/***/ }),
1379
1380/***/ 851:
1381/***/ ((module, __unused_webpack_exports, __webpack_require__) => {
1382
1383
1384var classof = __webpack_require__(6955);
1385var getMethod = __webpack_require__(5966);
1386var isNullOrUndefined = __webpack_require__(4117);
1387var Iterators = __webpack_require__(6269);
1388var wellKnownSymbol = __webpack_require__(8227);
1389
1390var ITERATOR = wellKnownSymbol('iterator');
1391
1392module.exports = function (it) {
1393	if (!isNullOrUndefined(it)) return getMethod(it, ITERATOR)
1394		|| getMethod(it, '@@iterator')
1395		|| Iterators[classof(it)];
1396};
1397
1398
1399/***/ }),
1400
1401/***/ 81:
1402/***/ ((module, __unused_webpack_exports, __webpack_require__) => {
1403
1404
1405var call = __webpack_require__(9565);
1406var aCallable = __webpack_require__(9306);
1407var anObject = __webpack_require__(8551);
1408var tryToString = __webpack_require__(6823);
1409var getIteratorMethod = __webpack_require__(851);
1410
1411var $TypeError = TypeError;
1412
1413module.exports = function (argument, usingIterator) {
1414	var iteratorMethod = arguments.length < 2 ? getIteratorMethod(argument) : usingIterator;
1415	if (aCallable(iteratorMethod)) return anObject(call(iteratorMethod, argument));
1416	throw new $TypeError(tryToString(argument) + ' is not iterable');
1417};
1418
1419
1420/***/ }),
1421
1422/***/ 5966:
1423/***/ ((module, __unused_webpack_exports, __webpack_require__) => {
1424
1425
1426var aCallable = __webpack_require__(9306);
1427var isNullOrUndefined = __webpack_require__(4117);
1428
1429// `GetMethod` abstract operation
1430// https://tc39.es/ecma262/#sec-getmethod
1431module.exports = function (V, P) {
1432	var func = V[P];
1433	return isNullOrUndefined(func) ? undefined : aCallable(func);
1434};
1435
1436
1437/***/ }),
1438
1439/***/ 3789:
1440/***/ ((module, __unused_webpack_exports, __webpack_require__) => {
1441
1442
1443var aCallable = __webpack_require__(9306);
1444var anObject = __webpack_require__(8551);
1445var call = __webpack_require__(9565);
1446var toIntegerOrInfinity = __webpack_require__(1291);
1447var getIteratorDirect = __webpack_require__(1767);
1448
1449var INVALID_SIZE = 'Invalid size';
1450var $RangeError = RangeError;
1451var $TypeError = TypeError;
1452var max = Math.max;
1453
1454var SetRecord = function (set, intSize) {
1455	this.set = set;
1456	this.size = max(intSize, 0);
1457	this.has = aCallable(set.has);
1458	this.keys = aCallable(set.keys);
1459};
1460
1461SetRecord.prototype = {
1462	getIterator: function () {
1463		return getIteratorDirect(anObject(call(this.keys, this.set)));
1464	},
1465	includes: function (it) {
1466		return call(this.has, this.set, it);
1467	}
1468};
1469
1470// `GetSetRecord` abstract operation
1471// https://tc39.es/proposal-set-methods/#sec-getsetrecord
1472module.exports = function (obj) {
1473	anObject(obj);
1474	var numSize = +obj.size;
1475	// NOTE: If size is undefined, then numSize will be NaN
1476	// eslint-disable-next-line no-self-compare -- NaN check
1477	if (numSize !== numSize) throw new $TypeError(INVALID_SIZE);
1478	var intSize = toIntegerOrInfinity(numSize);
1479	if (intSize < 0) throw new $RangeError(INVALID_SIZE);
1480	return new SetRecord(obj, intSize);
1481};
1482
1483
1484/***/ }),
1485
1486/***/ 4576:
1487/***/ (function(module) {
1488
1489
1490var check = function (it) {
1491	return it && it.Math === Math && it;
1492};
1493
1494// https://github.com/zloirock/core-js/issues/86#issuecomment-115759028
1495module.exports =
1496	// eslint-disable-next-line es/no-global-this -- safe
1497	check(typeof globalThis == 'object' && globalThis) ||
1498	check(typeof window == 'object' && window) ||
1499	// eslint-disable-next-line no-restricted-globals -- safe
1500	check(typeof self == 'object' && self) ||
1501	check(typeof global == 'object' && global) ||
1502	check(typeof this == 'object' && this) ||
1503	// eslint-disable-next-line no-new-func -- fallback
1504	(function () { return this; })() || Function('return this')();
1505
1506
1507/***/ }),
1508
1509/***/ 9297:
1510/***/ ((module, __unused_webpack_exports, __webpack_require__) => {
1511
1512
1513var uncurryThis = __webpack_require__(9504);
1514var toObject = __webpack_require__(8981);
1515
1516var hasOwnProperty = uncurryThis({}.hasOwnProperty);
1517
1518// `HasOwnProperty` abstract operation
1519// https://tc39.es/ecma262/#sec-hasownproperty
1520// eslint-disable-next-line es/no-object-hasown -- safe
1521module.exports = Object.hasOwn || function hasOwn(it, key) {
1522	return hasOwnProperty(toObject(it), key);
1523};
1524
1525
1526/***/ }),
1527
1528/***/ 421:
1529/***/ ((module) => {
1530
1531
1532module.exports = {};
1533
1534
1535/***/ }),
1536
1537/***/ 397:
1538/***/ ((module, __unused_webpack_exports, __webpack_require__) => {
1539
1540
1541var getBuiltIn = __webpack_require__(7751);
1542
1543module.exports = getBuiltIn('document', 'documentElement');
1544
1545
1546/***/ }),
1547
1548/***/ 5917:
1549/***/ ((module, __unused_webpack_exports, __webpack_require__) => {
1550
1551
1552var DESCRIPTORS = __webpack_require__(3724);
1553var fails = __webpack_require__(9039);
1554var createElement = __webpack_require__(4055);
1555
1556// Thanks to IE8 for its funny defineProperty
1557module.exports = !DESCRIPTORS && !fails(function () {
1558	// eslint-disable-next-line es/no-object-defineproperty -- required for testing
1559	return Object.defineProperty(createElement('div'), 'a', {
1560		get: function () { return 7; }
1561	}).a !== 7;
1562});
1563
1564
1565/***/ }),
1566
1567/***/ 7055:
1568/***/ ((module, __unused_webpack_exports, __webpack_require__) => {
1569
1570
1571var uncurryThis = __webpack_require__(9504);
1572var fails = __webpack_require__(9039);
1573var classof = __webpack_require__(2195);
1574
1575var $Object = Object;
1576var split = uncurryThis(''.split);
1577
1578// fallback for non-array-like ES3 and non-enumerable old V8 strings
1579module.exports = fails(function () {
1580	// throws an error in rhino, see https://github.com/mozilla/rhino/issues/346
1581	// eslint-disable-next-line no-prototype-builtins -- safe
1582	return !$Object('z').propertyIsEnumerable(0);
1583}) ? function (it) {
1584	return classof(it) === 'String' ? split(it, '') : $Object(it);
1585} : $Object;
1586
1587
1588/***/ }),
1589
1590/***/ 3167:
1591/***/ ((module, __unused_webpack_exports, __webpack_require__) => {
1592
1593
1594var isCallable = __webpack_require__(4901);
1595var isObject = __webpack_require__(34);
1596var setPrototypeOf = __webpack_require__(2967);
1597
1598// makes subclassing work correct for wrapped built-ins
1599module.exports = function ($this, dummy, Wrapper) {
1600	var NewTarget, NewTargetPrototype;
1601	if (
1602		// it can work only with native `setPrototypeOf`
1603		setPrototypeOf &&
1604		// we haven't completely correct pre-ES6 way for getting `new.target`, so use this
1605		isCallable(NewTarget = dummy.constructor) &&
1606		NewTarget !== Wrapper &&
1607		isObject(NewTargetPrototype = NewTarget.prototype) &&
1608		NewTargetPrototype !== Wrapper.prototype
1609	) setPrototypeOf($this, NewTargetPrototype);
1610	return $this;
1611};
1612
1613
1614/***/ }),
1615
1616/***/ 3706:
1617/***/ ((module, __unused_webpack_exports, __webpack_require__) => {
1618
1619
1620var uncurryThis = __webpack_require__(9504);
1621var isCallable = __webpack_require__(4901);
1622var store = __webpack_require__(7629);
1623
1624var functionToString = uncurryThis(Function.toString);
1625
1626// this helper broken in `[email protected]`, so we can't use `shared` helper
1627if (!isCallable(store.inspectSource)) {
1628	store.inspectSource = function (it) {
1629		return functionToString(it);
1630	};
1631}
1632
1633module.exports = store.inspectSource;
1634
1635
1636/***/ }),
1637
1638/***/ 1181:
1639/***/ ((module, __unused_webpack_exports, __webpack_require__) => {
1640
1641
1642var NATIVE_WEAK_MAP = __webpack_require__(8622);
1643var globalThis = __webpack_require__(4576);
1644var isObject = __webpack_require__(34);
1645var createNonEnumerableProperty = __webpack_require__(6699);
1646var hasOwn = __webpack_require__(9297);
1647var shared = __webpack_require__(7629);
1648var sharedKey = __webpack_require__(6119);
1649var hiddenKeys = __webpack_require__(421);
1650
1651var OBJECT_ALREADY_INITIALIZED = 'Object already initialized';
1652var TypeError = globalThis.TypeError;
1653var WeakMap = globalThis.WeakMap;
1654var set, get, has;
1655
1656var enforce = function (it) {
1657	return has(it) ? get(it) : set(it, {});
1658};
1659
1660var getterFor = function (TYPE) {
1661	return function (it) {
1662		var state;
1663		if (!isObject(it) || (state = get(it)).type !== TYPE) {
1664			throw new TypeError('Incompatible receiver, ' + TYPE + ' required');
1665		} return state;
1666	};
1667};
1668
1669if (NATIVE_WEAK_MAP || shared.state) {
1670	var store = shared.state || (shared.state = new WeakMap());
1671	/* eslint-disable no-self-assign -- prototype methods protection */
1672	store.get = store.get;
1673	store.has = store.has;
1674	store.set = store.set;
1675	/* eslint-enable no-self-assign -- prototype methods protection */
1676	set = function (it, metadata) {
1677		if (store.has(it)) throw new TypeError(OBJECT_ALREADY_INITIALIZED);
1678		metadata.facade = it;
1679		store.set(it, metadata);
1680		return metadata;
1681	};
1682	get = function (it) {
1683		return store.get(it) || {};
1684	};
1685	has = function (it) {
1686		return store.has(it);
1687	};
1688} else {
1689	var STATE = sharedKey('state');
1690	hiddenKeys[STATE] = true;
1691	set = function (it, metadata) {
1692		if (hasOwn(it, STATE)) throw new TypeError(OBJECT_ALREADY_INITIALIZED);
1693		metadata.facade = it;
1694		createNonEnumerableProperty(it, STATE, metadata);
1695		return metadata;
1696	};
1697	get = function (it) {
1698		return hasOwn(it, STATE) ? it[STATE] : {};
1699	};
1700	has = function (it) {
1701		return hasOwn(it, STATE);
1702	};
1703}
1704
1705module.exports = {
1706	set: set,
1707	get: get,
1708	has: has,
1709	enforce: enforce,
1710	getterFor: getterFor
1711};
1712
1713
1714/***/ }),
1715
1716/***/ 4209:
1717/***/ ((module, __unused_webpack_exports, __webpack_require__) => {
1718
1719
1720var wellKnownSymbol = __webpack_require__(8227);
1721var Iterators = __webpack_require__(6269);
1722
1723var ITERATOR = wellKnownSymbol('iterator');
1724var ArrayPrototype = Array.prototype;
1725
1726// check on default Array iterator
1727module.exports = function (it) {
1728	return it !== undefined && (Iterators.Array === it || ArrayPrototype[ITERATOR] === it);
1729};
1730
1731
1732/***/ }),
1733
1734/***/ 4376:
1735/***/ ((module, __unused_webpack_exports, __webpack_require__) => {
1736
1737
1738var classof = __webpack_require__(2195);
1739
1740// `IsArray` abstract operation
1741// https://tc39.es/ecma262/#sec-isarray
1742// eslint-disable-next-line es/no-array-isarray -- safe
1743module.exports = Array.isArray || function isArray(argument) {
1744	return classof(argument) === 'Array';
1745};
1746
1747
1748/***/ }),
1749
1750/***/ 1108:
1751/***/ ((module, __unused_webpack_exports, __webpack_require__) => {
1752
1753
1754var classof = __webpack_require__(6955);
1755
1756module.exports = function (it) {
1757	var klass = classof(it);
1758	return klass === 'BigInt64Array' || klass === 'BigUint64Array';
1759};
1760
1761
1762/***/ }),
1763
1764/***/ 4901:
1765/***/ ((module) => {
1766
1767
1768// https://tc39.es/ecma262/#sec-IsHTMLDDA-internal-slot
1769var documentAll = typeof document == 'object' && document.all;
1770
1771// `IsCallable` abstract operation
1772// https://tc39.es/ecma262/#sec-iscallable
1773// eslint-disable-next-line unicorn/no-typeof-undefined -- required for testing
1774module.exports = typeof documentAll == 'undefined' && documentAll !== undefined ? function (argument) {
1775	return typeof argument == 'function' || argument === documentAll;
1776} : function (argument) {
1777	return typeof argument == 'function';
1778};
1779
1780
1781/***/ }),
1782
1783/***/ 2796:
1784/***/ ((module, __unused_webpack_exports, __webpack_require__) => {
1785
1786
1787var fails = __webpack_require__(9039);
1788var isCallable = __webpack_require__(4901);
1789
1790var replacement = /#|\.prototype\./;
1791
1792var isForced = function (feature, detection) {
1793	var value = data[normalize(feature)];
1794	return value === POLYFILL ? true
1795		: value === NATIVE ? false
1796		: isCallable(detection) ? fails(detection)
1797		: !!detection;
1798};
1799
1800var normalize = isForced.normalize = function (string) {
1801	return String(string).replace(replacement, '.').toLowerCase();
1802};
1803
1804var data = isForced.data = {};
1805var NATIVE = isForced.NATIVE = 'N';
1806var POLYFILL = isForced.POLYFILL = 'P';
1807
1808module.exports = isForced;
1809
1810
1811/***/ }),
1812
1813/***/ 4117:
1814/***/ ((module) => {
1815
1816
1817// we can't use just `it == null` since of `document.all` special case
1818// https://tc39.es/ecma262/#sec-IsHTMLDDA-internal-slot-aec
1819module.exports = function (it) {
1820	return it === null || it === undefined;
1821};
1822
1823
1824/***/ }),
1825
1826/***/ 34:
1827/***/ ((module, __unused_webpack_exports, __webpack_require__) => {
1828
1829
1830var isCallable = __webpack_require__(4901);
1831
1832module.exports = function (it) {
1833	return typeof it == 'object' ? it !== null : isCallable(it);
1834};
1835
1836
1837/***/ }),
1838
1839/***/ 3925:
1840/***/ ((module, __unused_webpack_exports, __webpack_require__) => {
1841
1842
1843var isObject = __webpack_require__(34);
1844
1845module.exports = function (argument) {
1846	return isObject(argument) || argument === null;
1847};
1848
1849
1850/***/ }),
1851
1852/***/ 6395:
1853/***/ ((module) => {
1854
1855
1856module.exports = false;
1857
1858
1859/***/ }),
1860
1861/***/ 757:
1862/***/ ((module, __unused_webpack_exports, __webpack_require__) => {
1863
1864
1865var getBuiltIn = __webpack_require__(7751);
1866var isCallable = __webpack_require__(4901);
1867var isPrototypeOf = __webpack_require__(1625);
1868var USE_SYMBOL_AS_UID = __webpack_require__(7040);
1869
1870var $Object = Object;
1871
1872module.exports = USE_SYMBOL_AS_UID ? function (it) {
1873	return typeof it == 'symbol';
1874} : function (it) {
1875	var $Symbol = getBuiltIn('Symbol');
1876	return isCallable($Symbol) && isPrototypeOf($Symbol.prototype, $Object(it));
1877};
1878
1879
1880/***/ }),
1881
1882/***/ 507:
1883/***/ ((module, __unused_webpack_exports, __webpack_require__) => {
1884
1885
1886var call = __webpack_require__(9565);
1887
1888module.exports = function (record, fn, ITERATOR_INSTEAD_OF_RECORD) {
1889	var iterator = ITERATOR_INSTEAD_OF_RECORD ? record : record.iterator;
1890	var next = record.next;
1891	var step, result;
1892	while (!(step = call(next, iterator)).done) {
1893		result = fn(step.value);
1894		if (result !== undefined) return result;
1895	}
1896};
1897
1898
1899/***/ }),
1900
1901/***/ 2652:
1902/***/ ((module, __unused_webpack_exports, __webpack_require__) => {
1903
1904
1905var bind = __webpack_require__(6080);
1906var call = __webpack_require__(9565);
1907var anObject = __webpack_require__(8551);
1908var tryToString = __webpack_require__(6823);
1909var isArrayIteratorMethod = __webpack_require__(4209);
1910var lengthOfArrayLike = __webpack_require__(6198);
1911var isPrototypeOf = __webpack_require__(1625);
1912var getIterator = __webpack_require__(81);
1913var getIteratorMethod = __webpack_require__(851);
1914var iteratorClose = __webpack_require__(9539);
1915
1916var $TypeError = TypeError;
1917
1918var Result = function (stopped, result) {
1919	this.stopped = stopped;
1920	this.result = result;
1921};
1922
1923var ResultPrototype = Result.prototype;
1924
1925module.exports = function (iterable, unboundFunction, options) {
1926	var that = options && options.that;
1927	var AS_ENTRIES = !!(options && options.AS_ENTRIES);
1928	var IS_RECORD = !!(options && options.IS_RECORD);
1929	var IS_ITERATOR = !!(options && options.IS_ITERATOR);
1930	var INTERRUPTED = !!(options && options.INTERRUPTED);
1931	var fn = bind(unboundFunction, that);
1932	var iterator, iterFn, index, length, result, next, step;
1933
1934	var stop = function (condition) {
1935		if (iterator) iteratorClose(iterator, 'normal', condition);
1936		return new Result(true, condition);
1937	};
1938
1939	var callFn = function (value) {
1940		if (AS_ENTRIES) {
1941			anObject(value);
1942			return INTERRUPTED ? fn(value[0], value[1], stop) : fn(value[0], value[1]);
1943		}
vendor: 8,546 bytes, lines 1943-2227
1943 return INTERRUPTED ? fn(value, stop) : fn(value);
1944	};
1945
1946	if (IS_RECORD) {
1947		iterator = iterable.iterator;
1948	} else if (IS_ITERATOR) {
1949		iterator = iterable;
1950	} else {
1951		iterFn = getIteratorMethod(iterable);
1952		if (!iterFn) throw new $TypeError(tryToString(iterable) + ' is not iterable');
1953		// optimisation for array iterators
1954		if (isArrayIteratorMethod(iterFn)) {
1955			for (index = 0, length = lengthOfArrayLike(iterable); length > index; index++) {
1956				result = callFn(iterable[index]);
1957				if (result && isPrototypeOf(ResultPrototype, result)) return result;
1958			} return new Result(false);
1959		}
1960		iterator = getIterator(iterable, iterFn);
1961	}
1962
1963	next = IS_RECORD ? iterable.next : iterator.next;
1964	while (!(step = call(next, iterator)).done) {
1965		try {
1966			result = callFn(step.value);
1967		} catch (error) {
1968			iteratorClose(iterator, 'throw', error);
1969		}
1970		if (typeof result == 'object' && result && isPrototypeOf(ResultPrototype, result)) return result;
1971	} return new Result(false);
1972};
1973
1974
1975/***/ }),
1976
1977/***/ 9539:
1978/***/ ((module, __unused_webpack_exports, __webpack_require__) => {
1979
1980
1981var call = __webpack_require__(9565);
1982var anObject = __webpack_require__(8551);
1983var getMethod = __webpack_require__(5966);
1984
1985module.exports = function (iterator, kind, value) {
1986	var innerResult, innerError;
1987	anObject(iterator);
1988	try {
1989		innerResult = getMethod(iterator, 'return');
1990		if (!innerResult) {
1991			if (kind === 'throw') throw value;
1992			return value;
1993		}
1994		innerResult = call(innerResult, iterator);
1995	} catch (error) {
1996		innerError = true;
1997		innerResult = error;
1998	}
1999	if (kind === 'throw') throw value;
2000	if (innerError) throw innerResult;
2001	anObject(innerResult);
2002	return value;
2003};
2004
2005
2006/***/ }),
2007
2008/***/ 9462:
2009/***/ ((module, __unused_webpack_exports, __webpack_require__) => {
2010
2011
2012var call = __webpack_require__(9565);
2013var create = __webpack_require__(2360);
2014var createNonEnumerableProperty = __webpack_require__(6699);
2015var defineBuiltIns = __webpack_require__(6279);
2016var wellKnownSymbol = __webpack_require__(8227);
2017var InternalStateModule = __webpack_require__(1181);
2018var getMethod = __webpack_require__(5966);
2019var IteratorPrototype = (__webpack_require__(7657).IteratorPrototype);
2020var createIterResultObject = __webpack_require__(2529);
2021var iteratorClose = __webpack_require__(9539);
2022
2023var TO_STRING_TAG = wellKnownSymbol('toStringTag');
2024var ITERATOR_HELPER = 'IteratorHelper';
2025var WRAP_FOR_VALID_ITERATOR = 'WrapForValidIterator';
2026var setInternalState = InternalStateModule.set;
2027
2028var createIteratorProxyPrototype = function (IS_ITERATOR) {
2029	var getInternalState = InternalStateModule.getterFor(IS_ITERATOR ? WRAP_FOR_VALID_ITERATOR : ITERATOR_HELPER);
2030
2031	return defineBuiltIns(create(IteratorPrototype), {
2032		next: function next() {
2033			var state = getInternalState(this);
2034			// for simplification:
2035			//   for `%WrapForValidIteratorPrototype%.next` our `nextHandler` returns `IterResultObject`
2036			//   for `%IteratorHelperPrototype%.next` - just a value
2037			if (IS_ITERATOR) return state.nextHandler();
2038			try {
2039				var result = state.done ? undefined : state.nextHandler();
2040				return createIterResultObject(result, state.done);
2041			} catch (error) {
2042				state.done = true;
2043				throw error;
2044			}
2045		},
2046		'return': function () {
2047			var state = getInternalState(this);
2048			var iterator = state.iterator;
2049			state.done = true;
2050			if (IS_ITERATOR) {
2051				var returnMethod = getMethod(iterator, 'return');
2052				return returnMethod ? call(returnMethod, iterator) : createIterResultObject(undefined, true);
2053			}
2054			if (state.inner) try {
2055				iteratorClose(state.inner.iterator, 'normal');
2056			} catch (error) {
2057				return iteratorClose(iterator, 'throw', error);
2058			}
2059			if (iterator) iteratorClose(iterator, 'normal');
2060			return createIterResultObject(undefined, true);
2061		}
2062	});
2063};
2064
2065var WrapForValidIteratorPrototype = createIteratorProxyPrototype(true);
2066var IteratorHelperPrototype = createIteratorProxyPrototype(false);
2067
2068createNonEnumerableProperty(IteratorHelperPrototype, TO_STRING_TAG, 'Iterator Helper');
2069
2070module.exports = function (nextHandler, IS_ITERATOR) {
2071	var IteratorProxy = function Iterator(record, state) {
2072		if (state) {
2073			state.iterator = record.iterator;
2074			state.next = record.next;
2075		} else state = record;
2076		state.type = IS_ITERATOR ? WRAP_FOR_VALID_ITERATOR : ITERATOR_HELPER;
2077		state.nextHandler = nextHandler;
2078		state.counter = 0;
2079		state.done = false;
2080		setInternalState(this, state);
2081	};
2082
2083	IteratorProxy.prototype = IS_ITERATOR ? WrapForValidIteratorPrototype : IteratorHelperPrototype;
2084
2085	return IteratorProxy;
2086};
2087
2088
2089/***/ }),
2090
2091/***/ 713:
2092/***/ ((module, __unused_webpack_exports, __webpack_require__) => {
2093
2094
2095var call = __webpack_require__(9565);
2096var aCallable = __webpack_require__(9306);
2097var anObject = __webpack_require__(8551);
2098var getIteratorDirect = __webpack_require__(1767);
2099var createIteratorProxy = __webpack_require__(9462);
2100var callWithSafeIterationClosing = __webpack_require__(6319);
2101
2102var IteratorProxy = createIteratorProxy(function () {
2103	var iterator = this.iterator;
2104	var result = anObject(call(this.next, iterator));
2105	var done = this.done = !!result.done;
2106	if (!done) return callWithSafeIterationClosing(iterator, this.mapper, [result.value, this.counter++], true);
2107});
2108
2109// `Iterator.prototype.map` method
2110// https://github.com/tc39/proposal-iterator-helpers
2111module.exports = function map(mapper) {
2112	anObject(this);
2113	aCallable(mapper);
2114	return new IteratorProxy(getIteratorDirect(this), {
2115		mapper: mapper
2116	});
2117};
2118
2119
2120/***/ }),
2121
2122/***/ 7657:
2123/***/ ((module, __unused_webpack_exports, __webpack_require__) => {
2124
2125
2126var fails = __webpack_require__(9039);
2127var isCallable = __webpack_require__(4901);
2128var isObject = __webpack_require__(34);
2129var create = __webpack_require__(2360);
2130var getPrototypeOf = __webpack_require__(2787);
2131var defineBuiltIn = __webpack_require__(6840);
2132var wellKnownSymbol = __webpack_require__(8227);
2133var IS_PURE = __webpack_require__(6395);
2134
2135var ITERATOR = wellKnownSymbol('iterator');
2136var BUGGY_SAFARI_ITERATORS = false;
2137
2138// `%IteratorPrototype%` object
2139// https://tc39.es/ecma262/#sec-%iteratorprototype%-object
2140var IteratorPrototype, PrototypeOfArrayIteratorPrototype, arrayIterator;
2141
2142/* eslint-disable es/no-array-prototype-keys -- safe */
2143if ([].keys) {
2144	arrayIterator = [].keys();
2145	// Safari 8 has buggy iterators w/o `next`
2146	if (!('next' in arrayIterator)) BUGGY_SAFARI_ITERATORS = true;
2147	else {
2148		PrototypeOfArrayIteratorPrototype = getPrototypeOf(getPrototypeOf(arrayIterator));
2149		if (PrototypeOfArrayIteratorPrototype !== Object.prototype) IteratorPrototype = PrototypeOfArrayIteratorPrototype;
2150	}
2151}
2152
2153var NEW_ITERATOR_PROTOTYPE = !isObject(IteratorPrototype) || fails(function () {
2154	var test = {};
2155	// FF44- legacy iterators case
2156	return IteratorPrototype[ITERATOR].call(test) !== test;
2157});
2158
2159if (NEW_ITERATOR_PROTOTYPE) IteratorPrototype = {};
2160else if (IS_PURE) IteratorPrototype = create(IteratorPrototype);
2161
2162// `%IteratorPrototype%[@@iterator]()` method
2163// https://tc39.es/ecma262/#sec-%iteratorprototype%-@@iterator
2164if (!isCallable(IteratorPrototype[ITERATOR])) {
2165	defineBuiltIn(IteratorPrototype, ITERATOR, function () {
2166		return this;
2167	});
2168}
2169
2170module.exports = {
2171	IteratorPrototype: IteratorPrototype,
2172	BUGGY_SAFARI_ITERATORS: BUGGY_SAFARI_ITERATORS
2173};
2174
2175
2176/***/ }),
2177
2178/***/ 6269:
2179/***/ ((module) => {
2180
2181
2182module.exports = {};
2183
2184
2185/***/ }),
2186
2187/***/ 6198:
2188/***/ ((module, __unused_webpack_exports, __webpack_require__) => {
2189
2190
2191var toLength = __webpack_require__(8014);
2192
2193// `LengthOfArrayLike` abstract operation
2194// https://tc39.es/ecma262/#sec-lengthofarraylike
2195module.exports = function (obj) {
2196	return toLength(obj.length);
2197};
2198
2199
2200/***/ }),
2201
2202/***/ 283:
2203/***/ ((module, __unused_webpack_exports, __webpack_require__) => {
2204
2205
2206var uncurryThis = __webpack_require__(9504);
2207var fails = __webpack_require__(9039);
2208var isCallable = __webpack_require__(4901);
2209var hasOwn = __webpack_require__(9297);
2210var DESCRIPTORS = __webpack_require__(3724);
2211var CONFIGURABLE_FUNCTION_NAME = (__webpack_require__(350).CONFIGURABLE);
2212var inspectSource = __webpack_require__(3706);
2213var InternalStateModule = __webpack_require__(1181);
2214
2215var enforceInternalState = InternalStateModule.enforce;
2216var getInternalState = InternalStateModule.get;
2217var $String = String;
2218// eslint-disable-next-line es/no-object-defineproperty -- safe
2219var defineProperty = Object.defineProperty;
2220var stringSlice = uncurryThis(''.slice);
2221var replace = uncurryThis(''.replace);
2222var join = uncurryThis([].join);
2223
2224var CONFIGURABLE_LENGTH = DESCRIPTORS && !fails(function () {
2225	return defineProperty(function () { /* empty */ }, 'length', { value: 8 }).length !== 8;
2226});
2227
vendor: 4,088 bytes, lines 2228-2359
2228var TEMPLATE = String(String).split('String');
2229
2230var makeBuiltIn = module.exports = function (value, name, options) {
2231	if (stringSlice($String(name), 0, 7) === 'Symbol(') {
2232		name = '[' + replace($String(name), /^Symbol\(([^)]*)\).*$/, '$1') + ']';
2233	}
2234	if (options && options.getter) name = 'get ' + name;
2235	if (options && options.setter) name = 'set ' + name;
2236	if (!hasOwn(value, 'name') || (CONFIGURABLE_FUNCTION_NAME && value.name !== name)) {
2237		if (DESCRIPTORS) defineProperty(value, 'name', { value: name, configurable: true });
2238		else value.name = name;
2239	}
2240	if (CONFIGURABLE_LENGTH && options && hasOwn(options, 'arity') && value.length !== options.arity) {
2241		defineProperty(value, 'length', { value: options.arity });
2242	}
2243	try {
2244		if (options && hasOwn(options, 'constructor') && options.constructor) {
2245			if (DESCRIPTORS) defineProperty(value, 'prototype', { writable: false });
2246		// in V8 ~ Chrome 53, prototypes of some methods, like `Array.prototype.values`, are non-writable
2247		} else if (value.prototype) value.prototype = undefined;
2248	} catch (error) { /* empty */ }
2249	var state = enforceInternalState(value);
2250	if (!hasOwn(state, 'source')) {
2251		state.source = join(TEMPLATE, typeof name == 'string' ? name : '');
2252	} return value;
2253};
2254
2255// add fake Function#toString for correct work wrapped methods / constructors with methods like LoDash isNative
2256// eslint-disable-next-line no-extend-native -- required
2257Function.prototype.toString = makeBuiltIn(function toString() {
2258	return isCallable(this) && getInternalState(this).source || inspectSource(this);
2259}, 'toString');
2260
2261
2262/***/ }),
2263
2264/***/ 741:
2265/***/ ((module) => {
2266
2267
2268var ceil = Math.ceil;
2269var floor = Math.floor;
2270
2271// `Math.trunc` method
2272// https://tc39.es/ecma262/#sec-math.trunc
2273// eslint-disable-next-line es/no-math-trunc -- safe
2274module.exports = Math.trunc || function trunc(x) {
2275	var n = +x;
2276	return (n > 0 ? floor : ceil)(n);
2277};
2278
2279
2280/***/ }),
2281
2282/***/ 6043:
2283/***/ ((module, __unused_webpack_exports, __webpack_require__) => {
2284
2285
2286var aCallable = __webpack_require__(9306);
2287
2288var $TypeError = TypeError;
2289
2290var PromiseCapability = function (C) {
2291	var resolve, reject;
2292	this.promise = new C(function ($$resolve, $$reject) {
2293		if (resolve !== undefined || reject !== undefined) throw new $TypeError('Bad Promise constructor');
2294		resolve = $$resolve;
2295		reject = $$reject;
2296	});
2297	this.resolve = aCallable(resolve);
2298	this.reject = aCallable(reject);
2299};
2300
2301// `NewPromiseCapability` abstract operation
2302// https://tc39.es/ecma262/#sec-newpromisecapability
2303module.exports.f = function (C) {
2304	return new PromiseCapability(C);
2305};
2306
2307
2308/***/ }),
2309
2310/***/ 2603:
2311/***/ ((module, __unused_webpack_exports, __webpack_require__) => {
2312
2313
2314var toString = __webpack_require__(655);
2315
2316module.exports = function (argument, $default) {
2317	return argument === undefined ? arguments.length < 2 ? '' : $default : toString(argument);
2318};
2319
2320
2321/***/ }),
2322
2323/***/ 2360:
2324/***/ ((module, __unused_webpack_exports, __webpack_require__) => {
2325
2326
2327/* global ActiveXObject -- old IE, WSH */
2328var anObject = __webpack_require__(8551);
2329var definePropertiesModule = __webpack_require__(6801);
2330var enumBugKeys = __webpack_require__(8727);
2331var hiddenKeys = __webpack_require__(421);
2332var html = __webpack_require__(397);
2333var documentCreateElement = __webpack_require__(4055);
2334var sharedKey = __webpack_require__(6119);
2335
2336var GT = '>';
2337var LT = '<';
2338var PROTOTYPE = 'prototype';
2339var SCRIPT = 'script';
2340var IE_PROTO = sharedKey('IE_PROTO');
2341
2342var EmptyConstructor = function () { /* empty */ };
2343
2344var scriptTag = function (content) {
2345	return LT + SCRIPT + GT + content + LT + '/' + SCRIPT + GT;
2346};
2347
2348// Create object with fake `null` prototype: use ActiveX Object with cleared prototype
2349var NullProtoObjectViaActiveX = function (activeXDocument) {
2350	activeXDocument.write(scriptTag(''));
2351	activeXDocument.close();
2352	var temp = activeXDocument.parentWindow.Object;
2353	// eslint-disable-next-line no-useless-assignment -- avoid memory leak
2354	activeXDocument = null;
2355	return temp;
2356};
2357
2358// Create object with fake `null` prototype: use iframe Object with cleared prototype
2359var NullProtoObjectViaIFrame = function () {
vendor: 6,261 bytes, lines 2360-2543
2360	// Thrash, waste and sodomy: IE GC bug
2361	var iframe = documentCreateElement('iframe');
2362	var JS = 'java' + SCRIPT + ':';
2363	var iframeDocument;
2364	iframe.style.display = 'none';
2365	html.appendChild(iframe);
2366	// https://github.com/zloirock/core-js/issues/475
2367	iframe.src = String(JS);
2368	iframeDocument = iframe.contentWindow.document;
2369	iframeDocument.open();
2370	iframeDocument.write(scriptTag('document.F=Object'));
2371	iframeDocument.close();
2372	return iframeDocument.F;
2373};
2374
2375// Check for document.domain and active x support
2376// No need to use active x approach when document.domain is not set
2377// see https://github.com/es-shims/es5-shim/issues/150
2378// variation of https://github.com/kitcambridge/es5-shim/commit/4f738ac066346
2379// avoid IE GC bug
2380var activeXDocument;
2381var NullProtoObject = function () {
2382	try {
2383		activeXDocument = new ActiveXObject('htmlfile');
2384	} catch (error) { /* ignore */ }
2385	NullProtoObject = typeof document != 'undefined'
2386		? document.domain && activeXDocument
2387			? NullProtoObjectViaActiveX(activeXDocument) // old IE
2388			: NullProtoObjectViaIFrame()
2389		: NullProtoObjectViaActiveX(activeXDocument); // WSH
2390	var length = enumBugKeys.length;
2391	while (length--) delete NullProtoObject[PROTOTYPE][enumBugKeys[length]];
2392	return NullProtoObject();
2393};
2394
2395hiddenKeys[IE_PROTO] = true;
2396
2397// `Object.create` method
2398// https://tc39.es/ecma262/#sec-object.create
2399// eslint-disable-next-line es/no-object-create -- safe
2400module.exports = Object.create || function create(O, Properties) {
2401	var result;
2402	if (O !== null) {
2403		EmptyConstructor[PROTOTYPE] = anObject(O);
2404		result = new EmptyConstructor();
2405		EmptyConstructor[PROTOTYPE] = null;
2406		// add "__proto__" for Object.getPrototypeOf polyfill
2407		result[IE_PROTO] = O;
2408	} else result = NullProtoObject();
2409	return Properties === undefined ? result : definePropertiesModule.f(result, Properties);
2410};
2411
2412
2413/***/ }),
2414
2415/***/ 6801:
2416/***/ ((__unused_webpack_module, exports, __webpack_require__) => {
2417
2418
2419var DESCRIPTORS = __webpack_require__(3724);
2420var V8_PROTOTYPE_DEFINE_BUG = __webpack_require__(8686);
2421var definePropertyModule = __webpack_require__(4913);
2422var anObject = __webpack_require__(8551);
2423var toIndexedObject = __webpack_require__(5397);
2424var objectKeys = __webpack_require__(1072);
2425
2426// `Object.defineProperties` method
2427// https://tc39.es/ecma262/#sec-object.defineproperties
2428// eslint-disable-next-line es/no-object-defineproperties -- safe
2429exports.f = DESCRIPTORS && !V8_PROTOTYPE_DEFINE_BUG ? Object.defineProperties : function defineProperties(O, Properties) {
2430	anObject(O);
2431	var props = toIndexedObject(Properties);
2432	var keys = objectKeys(Properties);
2433	var length = keys.length;
2434	var index = 0;
2435	var key;
2436	while (length > index) definePropertyModule.f(O, key = keys[index++], props[key]);
2437	return O;
2438};
2439
2440
2441/***/ }),
2442
2443/***/ 4913:
2444/***/ ((__unused_webpack_module, exports, __webpack_require__) => {
2445
2446
2447var DESCRIPTORS = __webpack_require__(3724);
2448var IE8_DOM_DEFINE = __webpack_require__(5917);
2449var V8_PROTOTYPE_DEFINE_BUG = __webpack_require__(8686);
2450var anObject = __webpack_require__(8551);
2451var toPropertyKey = __webpack_require__(6969);
2452
2453var $TypeError = TypeError;
2454// eslint-disable-next-line es/no-object-defineproperty -- safe
2455var $defineProperty = Object.defineProperty;
2456// eslint-disable-next-line es/no-object-getownpropertydescriptor -- safe
2457var $getOwnPropertyDescriptor = Object.getOwnPropertyDescriptor;
2458var ENUMERABLE = 'enumerable';
2459var CONFIGURABLE = 'configurable';
2460var WRITABLE = 'writable';
2461
2462// `Object.defineProperty` method
2463// https://tc39.es/ecma262/#sec-object.defineproperty
2464exports.f = DESCRIPTORS ? V8_PROTOTYPE_DEFINE_BUG ? function defineProperty(O, P, Attributes) {
2465	anObject(O);
2466	P = toPropertyKey(P);
2467	anObject(Attributes);
2468	if (typeof O === 'function' && P === 'prototype' && 'value' in Attributes && WRITABLE in Attributes && !Attributes[WRITABLE]) {
2469		var current = $getOwnPropertyDescriptor(O, P);
2470		if (current && current[WRITABLE]) {
2471			O[P] = Attributes.value;
2472			Attributes = {
2473				configurable: CONFIGURABLE in Attributes ? Attributes[CONFIGURABLE] : current[CONFIGURABLE],
2474				enumerable: ENUMERABLE in Attributes ? Attributes[ENUMERABLE] : current[ENUMERABLE],
2475				writable: false
2476			};
2477		}
2478	} return $defineProperty(O, P, Attributes);
2479} : $defineProperty : function defineProperty(O, P, Attributes) {
2480	anObject(O);
2481	P = toPropertyKey(P);
2482	anObject(Attributes);
2483	if (IE8_DOM_DEFINE) try {
2484		return $defineProperty(O, P, Attributes);
2485	} catch (error) { /* empty */ }
2486	if ('get' in Attributes || 'set' in Attributes) throw new $TypeError('Accessors not supported');
2487	if ('value' in Attributes) O[P] = Attributes.value;
2488	return O;
2489};
2490
2491
2492/***/ }),
2493
2494/***/ 7347:
2495/***/ ((__unused_webpack_module, exports, __webpack_require__) => {
2496
2497
2498var DESCRIPTORS = __webpack_require__(3724);
2499var call = __webpack_require__(9565);
2500var propertyIsEnumerableModule = __webpack_require__(8773);
2501var createPropertyDescriptor = __webpack_require__(6980);
2502var toIndexedObject = __webpack_require__(5397);
2503var toPropertyKey = __webpack_require__(6969);
2504var hasOwn = __webpack_require__(9297);
2505var IE8_DOM_DEFINE = __webpack_require__(5917);
2506
2507// eslint-disable-next-line es/no-object-getownpropertydescriptor -- safe
2508var $getOwnPropertyDescriptor = Object.getOwnPropertyDescriptor;
2509
2510// `Object.getOwnPropertyDescriptor` method
2511// https://tc39.es/ecma262/#sec-object.getownpropertydescriptor
2512exports.f = DESCRIPTORS ? $getOwnPropertyDescriptor : function getOwnPropertyDescriptor(O, P) {
2513	O = toIndexedObject(O);
2514	P = toPropertyKey(P);
2515	if (IE8_DOM_DEFINE) try {
2516		return $getOwnPropertyDescriptor(O, P);
2517	} catch (error) { /* empty */ }
2518	if (hasOwn(O, P)) return createPropertyDescriptor(!call(propertyIsEnumerableModule.f, O, P), O[P]);
2519};
2520
2521
2522/***/ }),
2523
2524/***/ 8480:
2525/***/ ((__unused_webpack_module, exports, __webpack_require__) => {
2526
2527
2528var internalObjectKeys = __webpack_require__(1828);
2529var enumBugKeys = __webpack_require__(8727);
2530
2531var hiddenKeys = enumBugKeys.concat('length', 'prototype');
2532
2533// `Object.getOwnPropertyNames` method
2534// https://tc39.es/ecma262/#sec-object.getownpropertynames
2535// eslint-disable-next-line es/no-object-getownpropertynames -- safe
2536exports.f = Object.getOwnPropertyNames || function getOwnPropertyNames(O) {
2537	return internalObjectKeys(O, hiddenKeys);
2538};
2539
2540
2541/***/ }),
2542
2543/***/ 3717:
vendor: 5,343 bytes, lines 2544-2727
2544/***/ ((__unused_webpack_module, exports) => {
2545
2546
2547// eslint-disable-next-line es/no-object-getownpropertysymbols -- safe
2548exports.f = Object.getOwnPropertySymbols;
2549
2550
2551/***/ }),
2552
2553/***/ 2787:
2554/***/ ((module, __unused_webpack_exports, __webpack_require__) => {
2555
2556
2557var hasOwn = __webpack_require__(9297);
2558var isCallable = __webpack_require__(4901);
2559var toObject = __webpack_require__(8981);
2560var sharedKey = __webpack_require__(6119);
2561var CORRECT_PROTOTYPE_GETTER = __webpack_require__(2211);
2562
2563var IE_PROTO = sharedKey('IE_PROTO');
2564var $Object = Object;
2565var ObjectPrototype = $Object.prototype;
2566
2567// `Object.getPrototypeOf` method
2568// https://tc39.es/ecma262/#sec-object.getprototypeof
2569// eslint-disable-next-line es/no-object-getprototypeof -- safe
2570module.exports = CORRECT_PROTOTYPE_GETTER ? $Object.getPrototypeOf : function (O) {
2571	var object = toObject(O);
2572	if (hasOwn(object, IE_PROTO)) return object[IE_PROTO];
2573	var constructor = object.constructor;
2574	if (isCallable(constructor) && object instanceof constructor) {
2575		return constructor.prototype;
2576	} return object instanceof $Object ? ObjectPrototype : null;
2577};
2578
2579
2580/***/ }),
2581
2582/***/ 1625:
2583/***/ ((module, __unused_webpack_exports, __webpack_require__) => {
2584
2585
2586var uncurryThis = __webpack_require__(9504);
2587
2588module.exports = uncurryThis({}.isPrototypeOf);
2589
2590
2591/***/ }),
2592
2593/***/ 1828:
2594/***/ ((module, __unused_webpack_exports, __webpack_require__) => {
2595
2596
2597var uncurryThis = __webpack_require__(9504);
2598var hasOwn = __webpack_require__(9297);
2599var toIndexedObject = __webpack_require__(5397);
2600var indexOf = (__webpack_require__(9617).indexOf);
2601var hiddenKeys = __webpack_require__(421);
2602
2603var push = uncurryThis([].push);
2604
2605module.exports = function (object, names) {
2606	var O = toIndexedObject(object);
2607	var i = 0;
2608	var result = [];
2609	var key;
2610	for (key in O) !hasOwn(hiddenKeys, key) && hasOwn(O, key) && push(result, key);
2611	// Don't enum bug & hidden keys
2612	while (names.length > i) if (hasOwn(O, key = names[i++])) {
2613		~indexOf(result, key) || push(result, key);
2614	}
2615	return result;
2616};
2617
2618
2619/***/ }),
2620
2621/***/ 1072:
2622/***/ ((module, __unused_webpack_exports, __webpack_require__) => {
2623
2624
2625var internalObjectKeys = __webpack_require__(1828);
2626var enumBugKeys = __webpack_require__(8727);
2627
2628// `Object.keys` method
2629// https://tc39.es/ecma262/#sec-object.keys
2630// eslint-disable-next-line es/no-object-keys -- safe
2631module.exports = Object.keys || function keys(O) {
2632	return internalObjectKeys(O, enumBugKeys);
2633};
2634
2635
2636/***/ }),
2637
2638/***/ 8773:
2639/***/ ((__unused_webpack_module, exports) => {
2640
2641
2642var $propertyIsEnumerable = {}.propertyIsEnumerable;
2643// eslint-disable-next-line es/no-object-getownpropertydescriptor -- safe
2644var getOwnPropertyDescriptor = Object.getOwnPropertyDescriptor;
2645
2646// Nashorn ~ JDK8 bug
2647var NASHORN_BUG = getOwnPropertyDescriptor && !$propertyIsEnumerable.call({ 1: 2 }, 1);
2648
2649// `Object.prototype.propertyIsEnumerable` method implementation
2650// https://tc39.es/ecma262/#sec-object.prototype.propertyisenumerable
2651exports.f = NASHORN_BUG ? function propertyIsEnumerable(V) {
2652	var descriptor = getOwnPropertyDescriptor(this, V);
2653	return !!descriptor && descriptor.enumerable;
2654} : $propertyIsEnumerable;
2655
2656
2657/***/ }),
2658
2659/***/ 2967:
2660/***/ ((module, __unused_webpack_exports, __webpack_require__) => {
2661
2662
2663/* eslint-disable no-proto -- safe */
2664var uncurryThisAccessor = __webpack_require__(6706);
2665var isObject = __webpack_require__(34);
2666var requireObjectCoercible = __webpack_require__(7750);
2667var aPossiblePrototype = __webpack_require__(3506);
2668
2669// `Object.setPrototypeOf` method
2670// https://tc39.es/ecma262/#sec-object.setprototypeof
2671// Works with __proto__ only. Old v8 can't work with null proto objects.
2672// eslint-disable-next-line es/no-object-setprototypeof -- safe
2673module.exports = Object.setPrototypeOf || ('__proto__' in {} ? function () {
2674	var CORRECT_SETTER = false;
2675	var test = {};
2676	var setter;
2677	try {
2678		setter = uncurryThisAccessor(Object.prototype, '__proto__', 'set');
2679		setter(test, []);
2680		CORRECT_SETTER = test instanceof Array;
2681	} catch (error) { /* empty */ }
2682	return function setPrototypeOf(O, proto) {
2683		requireObjectCoercible(O);
2684		aPossiblePrototype(proto);
2685		if (!isObject(O)) return O;
2686		if (CORRECT_SETTER) setter(O, proto);
2687		else O.__proto__ = proto;
2688		return O;
2689	};
2690}() : undefined);
2691
2692
2693/***/ }),
2694
2695/***/ 4270:
2696/***/ ((module, __unused_webpack_exports, __webpack_require__) => {
2697
2698
2699var call = __webpack_require__(9565);
2700var isCallable = __webpack_require__(4901);
2701var isObject = __webpack_require__(34);
2702
2703var $TypeError = TypeError;
2704
2705// `OrdinaryToPrimitive` abstract operation
2706// https://tc39.es/ecma262/#sec-ordinarytoprimitive
2707module.exports = function (input, pref) {
2708	var fn, val;
2709	if (pref === 'string' && isCallable(fn = input.toString) && !isObject(val = call(fn, input))) return val;
2710	if (isCallable(fn = input.valueOf) && !isObject(val = call(fn, input))) return val;
2711	if (pref !== 'string' && isCallable(fn = input.toString) && !isObject(val = call(fn, input))) return val;
2712	throw new $TypeError("Can't convert object to primitive value");
2713};
2714
2715
2716/***/ }),
2717
2718/***/ 5031:
2719/***/ ((module, __unused_webpack_exports, __webpack_require__) => {
2720
2721
2722var getBuiltIn = __webpack_require__(7751);
2723var uncurryThis = __webpack_require__(9504);
2724var getOwnPropertyNamesModule = __webpack_require__(8480);
2725var getOwnPropertySymbolsModule = __webpack_require__(3717);
2726var anObject = __webpack_require__(8551);
2727
vendor: 24,154 bytes, lines 2728-3682
2728var concat = uncurryThis([].concat);
2729
2730// all object keys, includes non-enumerable and symbols
2731module.exports = getBuiltIn('Reflect', 'ownKeys') || function ownKeys(it) {
2732	var keys = getOwnPropertyNamesModule.f(anObject(it));
2733	var getOwnPropertySymbols = getOwnPropertySymbolsModule.f;
2734	return getOwnPropertySymbols ? concat(keys, getOwnPropertySymbols(it)) : keys;
2735};
2736
2737
2738/***/ }),
2739
2740/***/ 1103:
2741/***/ ((module) => {
2742
2743
2744module.exports = function (exec) {
2745	try {
2746		return { error: false, value: exec() };
2747	} catch (error) {
2748		return { error: true, value: error };
2749	}
2750};
2751
2752
2753/***/ }),
2754
2755/***/ 7979:
2756/***/ ((module, __unused_webpack_exports, __webpack_require__) => {
2757
2758
2759var anObject = __webpack_require__(8551);
2760
2761// `RegExp.prototype.flags` getter implementation
2762// https://tc39.es/ecma262/#sec-get-regexp.prototype.flags
2763module.exports = function () {
2764	var that = anObject(this);
2765	var result = '';
2766	if (that.hasIndices) result += 'd';
2767	if (that.global) result += 'g';
2768	if (that.ignoreCase) result += 'i';
2769	if (that.multiline) result += 'm';
2770	if (that.dotAll) result += 's';
2771	if (that.unicode) result += 'u';
2772	if (that.unicodeSets) result += 'v';
2773	if (that.sticky) result += 'y';
2774	return result;
2775};
2776
2777
2778/***/ }),
2779
2780/***/ 7750:
2781/***/ ((module, __unused_webpack_exports, __webpack_require__) => {
2782
2783
2784var isNullOrUndefined = __webpack_require__(4117);
2785
2786var $TypeError = TypeError;
2787
2788// `RequireObjectCoercible` abstract operation
2789// https://tc39.es/ecma262/#sec-requireobjectcoercible
2790module.exports = function (it) {
2791	if (isNullOrUndefined(it)) throw new $TypeError("Can't call method on " + it);
2792	return it;
2793};
2794
2795
2796/***/ }),
2797
2798/***/ 9286:
2799/***/ ((module, __unused_webpack_exports, __webpack_require__) => {
2800
2801
2802var SetHelpers = __webpack_require__(4402);
2803var iterate = __webpack_require__(8469);
2804
2805var Set = SetHelpers.Set;
2806var add = SetHelpers.add;
2807
2808module.exports = function (set) {
2809	var result = new Set();
2810	iterate(set, function (it) {
2811		add(result, it);
2812	});
2813	return result;
2814};
2815
2816
2817/***/ }),
2818
2819/***/ 3440:
2820/***/ ((module, __unused_webpack_exports, __webpack_require__) => {
2821
2822
2823var aSet = __webpack_require__(7080);
2824var SetHelpers = __webpack_require__(4402);
2825var clone = __webpack_require__(9286);
2826var size = __webpack_require__(5170);
2827var getSetRecord = __webpack_require__(3789);
2828var iterateSet = __webpack_require__(8469);
2829var iterateSimple = __webpack_require__(507);
2830
2831var has = SetHelpers.has;
2832var remove = SetHelpers.remove;
2833
2834// `Set.prototype.difference` method
2835// https://github.com/tc39/proposal-set-methods
2836module.exports = function difference(other) {
2837	var O = aSet(this);
2838	var otherRec = getSetRecord(other);
2839	var result = clone(O);
2840	if (size(O) <= otherRec.size) iterateSet(O, function (e) {
2841		if (otherRec.includes(e)) remove(result, e);
2842	});
2843	else iterateSimple(otherRec.getIterator(), function (e) {
2844		if (has(O, e)) remove(result, e);
2845	});
2846	return result;
2847};
2848
2849
2850/***/ }),
2851
2852/***/ 4402:
2853/***/ ((module, __unused_webpack_exports, __webpack_require__) => {
2854
2855
2856var uncurryThis = __webpack_require__(9504);
2857
2858// eslint-disable-next-line es/no-set -- safe
2859var SetPrototype = Set.prototype;
2860
2861module.exports = {
2862	// eslint-disable-next-line es/no-set -- safe
2863	Set: Set,
2864	add: uncurryThis(SetPrototype.add),
2865	has: uncurryThis(SetPrototype.has),
2866	remove: uncurryThis(SetPrototype['delete']),
2867	proto: SetPrototype
2868};
2869
2870
2871/***/ }),
2872
2873/***/ 8750:
2874/***/ ((module, __unused_webpack_exports, __webpack_require__) => {
2875
2876
2877var aSet = __webpack_require__(7080);
2878var SetHelpers = __webpack_require__(4402);
2879var size = __webpack_require__(5170);
2880var getSetRecord = __webpack_require__(3789);
2881var iterateSet = __webpack_require__(8469);
2882var iterateSimple = __webpack_require__(507);
2883
2884var Set = SetHelpers.Set;
2885var add = SetHelpers.add;
2886var has = SetHelpers.has;
2887
2888// `Set.prototype.intersection` method
2889// https://github.com/tc39/proposal-set-methods
2890module.exports = function intersection(other) {
2891	var O = aSet(this);
2892	var otherRec = getSetRecord(other);
2893	var result = new Set();
2894
2895	if (size(O) > otherRec.size) {
2896		iterateSimple(otherRec.getIterator(), function (e) {
2897			if (has(O, e)) add(result, e);
2898		});
2899	} else {
2900		iterateSet(O, function (e) {
2901			if (otherRec.includes(e)) add(result, e);
2902		});
2903	}
2904
2905	return result;
2906};
2907
2908
2909/***/ }),
2910
2911/***/ 4449:
2912/***/ ((module, __unused_webpack_exports, __webpack_require__) => {
2913
2914
2915var aSet = __webpack_require__(7080);
2916var has = (__webpack_require__(4402).has);
2917var size = __webpack_require__(5170);
2918var getSetRecord = __webpack_require__(3789);
2919var iterateSet = __webpack_require__(8469);
2920var iterateSimple = __webpack_require__(507);
2921var iteratorClose = __webpack_require__(9539);
2922
2923// `Set.prototype.isDisjointFrom` method
2924// https://tc39.github.io/proposal-set-methods/#Set.prototype.isDisjointFrom
2925module.exports = function isDisjointFrom(other) {
2926	var O = aSet(this);
2927	var otherRec = getSetRecord(other);
2928	if (size(O) <= otherRec.size) return iterateSet(O, function (e) {
2929		if (otherRec.includes(e)) return false;
2930	}, true) !== false;
2931	var iterator = otherRec.getIterator();
2932	return iterateSimple(iterator, function (e) {
2933		if (has(O, e)) return iteratorClose(iterator, 'normal', false);
2934	}) !== false;
2935};
2936
2937
2938/***/ }),
2939
2940/***/ 3838:
2941/***/ ((module, __unused_webpack_exports, __webpack_require__) => {
2942
2943
2944var aSet = __webpack_require__(7080);
2945var size = __webpack_require__(5170);
2946var iterate = __webpack_require__(8469);
2947var getSetRecord = __webpack_require__(3789);
2948
2949// `Set.prototype.isSubsetOf` method
2950// https://tc39.github.io/proposal-set-methods/#Set.prototype.isSubsetOf
2951module.exports = function isSubsetOf(other) {
2952	var O = aSet(this);
2953	var otherRec = getSetRecord(other);
2954	if (size(O) > otherRec.size) return false;
2955	return iterate(O, function (e) {
2956		if (!otherRec.includes(e)) return false;
2957	}, true) !== false;
2958};
2959
2960
2961/***/ }),
2962
2963/***/ 8527:
2964/***/ ((module, __unused_webpack_exports, __webpack_require__) => {
2965
2966
2967var aSet = __webpack_require__(7080);
2968var has = (__webpack_require__(4402).has);
2969var size = __webpack_require__(5170);
2970var getSetRecord = __webpack_require__(3789);
2971var iterateSimple = __webpack_require__(507);
2972var iteratorClose = __webpack_require__(9539);
2973
2974// `Set.prototype.isSupersetOf` method
2975// https://tc39.github.io/proposal-set-methods/#Set.prototype.isSupersetOf
2976module.exports = function isSupersetOf(other) {
2977	var O = aSet(this);
2978	var otherRec = getSetRecord(other);
2979	if (size(O) < otherRec.size) return false;
2980	var iterator = otherRec.getIterator();
2981	return iterateSimple(iterator, function (e) {
2982		if (!has(O, e)) return iteratorClose(iterator, 'normal', false);
2983	}) !== false;
2984};
2985
2986
2987/***/ }),
2988
2989/***/ 8469:
2990/***/ ((module, __unused_webpack_exports, __webpack_require__) => {
2991
2992
2993var uncurryThis = __webpack_require__(9504);
2994var iterateSimple = __webpack_require__(507);
2995var SetHelpers = __webpack_require__(4402);
2996
2997var Set = SetHelpers.Set;
2998var SetPrototype = SetHelpers.proto;
2999var forEach = uncurryThis(SetPrototype.forEach);
3000var keys = uncurryThis(SetPrototype.keys);
3001var next = keys(new Set()).next;
3002
3003module.exports = function (set, fn, interruptible) {
3004	return interruptible ? iterateSimple({ iterator: keys(set), next: next }, fn) : forEach(set, fn);
3005};
3006
3007
3008/***/ }),
3009
3010/***/ 4916:
3011/***/ ((module, __unused_webpack_exports, __webpack_require__) => {
3012
3013
3014var getBuiltIn = __webpack_require__(7751);
3015
3016var createSetLike = function (size) {
3017	return {
3018		size: size,
3019		has: function () {
3020			return false;
3021		},
3022		keys: function () {
3023			return {
3024				next: function () {
3025					return { done: true };
3026				}
3027			};
3028		}
3029	};
3030};
3031
3032module.exports = function (name) {
3033	var Set = getBuiltIn('Set');
3034	try {
3035		new Set()[name](createSetLike(0));
3036		try {
3037			// late spec change, early WebKit ~ Safari 17.0 beta implementation does not pass it
3038			// https://github.com/tc39/proposal-set-methods/pull/88
3039			new Set()[name](createSetLike(-1));
3040			return false;
3041		} catch (error2) {
3042			return true;
3043		}
3044	} catch (error) {
3045		return false;
3046	}
3047};
3048
3049
3050/***/ }),
3051
3052/***/ 5170:
3053/***/ ((module, __unused_webpack_exports, __webpack_require__) => {
3054
3055
3056var uncurryThisAccessor = __webpack_require__(6706);
3057var SetHelpers = __webpack_require__(4402);
3058
3059module.exports = uncurryThisAccessor(SetHelpers.proto, 'size', 'get') || function (set) {
3060	return set.size;
3061};
3062
3063
3064/***/ }),
3065
3066/***/ 3650:
3067/***/ ((module, __unused_webpack_exports, __webpack_require__) => {
3068
3069
3070var aSet = __webpack_require__(7080);
3071var SetHelpers = __webpack_require__(4402);
3072var clone = __webpack_require__(9286);
3073var getSetRecord = __webpack_require__(3789);
3074var iterateSimple = __webpack_require__(507);
3075
3076var add = SetHelpers.add;
3077var has = SetHelpers.has;
3078var remove = SetHelpers.remove;
3079
3080// `Set.prototype.symmetricDifference` method
3081// https://github.com/tc39/proposal-set-methods
3082module.exports = function symmetricDifference(other) {
3083	var O = aSet(this);
3084	var keysIter = getSetRecord(other).getIterator();
3085	var result = clone(O);
3086	iterateSimple(keysIter, function (e) {
3087		if (has(O, e)) remove(result, e);
3088		else add(result, e);
3089	});
3090	return result;
3091};
3092
3093
3094/***/ }),
3095
3096/***/ 4204:
3097/***/ ((module, __unused_webpack_exports, __webpack_require__) => {
3098
3099
3100var aSet = __webpack_require__(7080);
3101var add = (__webpack_require__(4402).add);
3102var clone = __webpack_require__(9286);
3103var getSetRecord = __webpack_require__(3789);
3104var iterateSimple = __webpack_require__(507);
3105
3106// `Set.prototype.union` method
3107// https://github.com/tc39/proposal-set-methods
3108module.exports = function union(other) {
3109	var O = aSet(this);
3110	var keysIter = getSetRecord(other).getIterator();
3111	var result = clone(O);
3112	iterateSimple(keysIter, function (it) {
3113		add(result, it);
3114	});
3115	return result;
3116};
3117
3118
3119/***/ }),
3120
3121/***/ 6119:
3122/***/ ((module, __unused_webpack_exports, __webpack_require__) => {
3123
3124
3125var shared = __webpack_require__(5745);
3126var uid = __webpack_require__(3392);
3127
3128var keys = shared('keys');
3129
3130module.exports = function (key) {
3131	return keys[key] || (keys[key] = uid(key));
3132};
3133
3134
3135/***/ }),
3136
3137/***/ 7629:
3138/***/ ((module, __unused_webpack_exports, __webpack_require__) => {
3139
3140
3141var IS_PURE = __webpack_require__(6395);
3142var globalThis = __webpack_require__(4576);
3143var defineGlobalProperty = __webpack_require__(9433);
3144
3145var SHARED = '__core-js_shared__';
3146var store = module.exports = globalThis[SHARED] || defineGlobalProperty(SHARED, {});
3147
3148(store.versions || (store.versions = [])).push({
3149	version: '3.39.0',
3150	mode: IS_PURE ? 'pure' : 'global',
3151	copyright: '© 2014-2024 Denis Pushkarev (zloirock.ru)',
3152	license: 'https://github.com/zloirock/core-js/blob/v3.39.0/LICENSE',
3153	source: 'https://github.com/zloirock/core-js'
3154});
3155
3156
3157/***/ }),
3158
3159/***/ 5745:
3160/***/ ((module, __unused_webpack_exports, __webpack_require__) => {
3161
3162
3163var store = __webpack_require__(7629);
3164
3165module.exports = function (key, value) {
3166	return store[key] || (store[key] = value || {});
3167};
3168
3169
3170/***/ }),
3171
3172/***/ 1548:
3173/***/ ((module, __unused_webpack_exports, __webpack_require__) => {
3174
3175
3176var globalThis = __webpack_require__(4576);
3177var fails = __webpack_require__(9039);
3178var V8 = __webpack_require__(9519);
3179var ENVIRONMENT = __webpack_require__(4215);
3180
3181var structuredClone = globalThis.structuredClone;
3182
3183module.exports = !!structuredClone && !fails(function () {
3184	// prevent V8 ArrayBufferDetaching protector cell invalidation and performance degradation
3185	// https://github.com/zloirock/core-js/issues/679
3186	if ((ENVIRONMENT === 'DENO' && V8 > 92) || (ENVIRONMENT === 'NODE' && V8 > 94) || (ENVIRONMENT === 'BROWSER' && V8 > 97)) return false;
3187	var buffer = new ArrayBuffer(8);
3188	var clone = structuredClone(buffer, { transfer: [buffer] });
3189	return buffer.byteLength !== 0 || clone.byteLength !== 8;
3190});
3191
3192
3193/***/ }),
3194
3195/***/ 4495:
3196/***/ ((module, __unused_webpack_exports, __webpack_require__) => {
3197
3198
3199/* eslint-disable es/no-symbol -- required for testing */
3200var V8_VERSION = __webpack_require__(9519);
3201var fails = __webpack_require__(9039);
3202var globalThis = __webpack_require__(4576);
3203
3204var $String = globalThis.String;
3205
3206// eslint-disable-next-line es/no-object-getownpropertysymbols -- required for testing
3207module.exports = !!Object.getOwnPropertySymbols && !fails(function () {
3208	var symbol = Symbol('symbol detection');
3209	// Chrome 38 Symbol has incorrect toString conversion
3210	// `get-own-property-symbols` polyfill symbols converted to object are not Symbol instances
3211	// nb: Do not call `String` directly to avoid this being optimized out to `symbol+''` which will,
3212	// of course, fail.
3213	return !$String(symbol) || !(Object(symbol) instanceof Symbol) ||
3214		// Chrome 38-40 symbols are not inherited from DOM collections prototypes to instances
3215		!Symbol.sham && V8_VERSION && V8_VERSION < 41;
3216});
3217
3218
3219/***/ }),
3220
3221/***/ 5610:
3222/***/ ((module, __unused_webpack_exports, __webpack_require__) => {
3223
3224
3225var toIntegerOrInfinity = __webpack_require__(1291);
3226
3227var max = Math.max;
3228var min = Math.min;
3229
3230// Helper for a popular repeating case of the spec:
3231// Let integer be ? ToInteger(index).
3232// If integer < 0, let result be max((length + integer), 0); else let result be min(integer, length).
3233module.exports = function (index, length) {
3234	var integer = toIntegerOrInfinity(index);
3235	return integer < 0 ? max(integer + length, 0) : min(integer, length);
3236};
3237
3238
3239/***/ }),
3240
3241/***/ 5854:
3242/***/ ((module, __unused_webpack_exports, __webpack_require__) => {
3243
3244
3245var toPrimitive = __webpack_require__(2777);
3246
3247var $TypeError = TypeError;
3248
3249// `ToBigInt` abstract operation
3250// https://tc39.es/ecma262/#sec-tobigint
3251module.exports = function (argument) {
3252	var prim = toPrimitive(argument, 'number');
3253	if (typeof prim == 'number') throw new $TypeError("Can't convert number to bigint");
3254	// eslint-disable-next-line es/no-bigint -- safe
3255	return BigInt(prim);
3256};
3257
3258
3259/***/ }),
3260
3261/***/ 7696:
3262/***/ ((module, __unused_webpack_exports, __webpack_require__) => {
3263
3264
3265var toIntegerOrInfinity = __webpack_require__(1291);
3266var toLength = __webpack_require__(8014);
3267
3268var $RangeError = RangeError;
3269
3270// `ToIndex` abstract operation
3271// https://tc39.es/ecma262/#sec-toindex
3272module.exports = function (it) {
3273	if (it === undefined) return 0;
3274	var number = toIntegerOrInfinity(it);
3275	var length = toLength(number);
3276	if (number !== length) throw new $RangeError('Wrong length or index');
3277	return length;
3278};
3279
3280
3281/***/ }),
3282
3283/***/ 5397:
3284/***/ ((module, __unused_webpack_exports, __webpack_require__) => {
3285
3286
3287// toObject with fallback for non-array-like ES3 strings
3288var IndexedObject = __webpack_require__(7055);
3289var requireObjectCoercible = __webpack_require__(7750);
3290
3291module.exports = function (it) {
3292	return IndexedObject(requireObjectCoercible(it));
3293};
3294
3295
3296/***/ }),
3297
3298/***/ 1291:
3299/***/ ((module, __unused_webpack_exports, __webpack_require__) => {
3300
3301
3302var trunc = __webpack_require__(741);
3303
3304// `ToIntegerOrInfinity` abstract operation
3305// https://tc39.es/ecma262/#sec-tointegerorinfinity
3306module.exports = function (argument) {
3307	var number = +argument;
3308	// eslint-disable-next-line no-self-compare -- NaN check
3309	return number !== number || number === 0 ? 0 : trunc(number);
3310};
3311
3312
3313/***/ }),
3314
3315/***/ 8014:
3316/***/ ((module, __unused_webpack_exports, __webpack_require__) => {
3317
3318
3319var toIntegerOrInfinity = __webpack_require__(1291);
3320
3321var min = Math.min;
3322
3323// `ToLength` abstract operation
3324// https://tc39.es/ecma262/#sec-tolength
3325module.exports = function (argument) {
3326	var len = toIntegerOrInfinity(argument);
3327	return len > 0 ? min(len, 0x1FFFFFFFFFFFFF) : 0; // 2 ** 53 - 1 == 9007199254740991
3328};
3329
3330
3331/***/ }),
3332
3333/***/ 8981:
3334/***/ ((module, __unused_webpack_exports, __webpack_require__) => {
3335
3336
3337var requireObjectCoercible = __webpack_require__(7750);
3338
3339var $Object = Object;
3340
3341// `ToObject` abstract operation
3342// https://tc39.es/ecma262/#sec-toobject
3343module.exports = function (argument) {
3344	return $Object(requireObjectCoercible(argument));
3345};
3346
3347
3348/***/ }),
3349
3350/***/ 2777:
3351/***/ ((module, __unused_webpack_exports, __webpack_require__) => {
3352
3353
3354var call = __webpack_require__(9565);
3355var isObject = __webpack_require__(34);
3356var isSymbol = __webpack_require__(757);
3357var getMethod = __webpack_require__(5966);
3358var ordinaryToPrimitive = __webpack_require__(4270);
3359var wellKnownSymbol = __webpack_require__(8227);
3360
3361var $TypeError = TypeError;
3362var TO_PRIMITIVE = wellKnownSymbol('toPrimitive');
3363
3364// `ToPrimitive` abstract operation
3365// https://tc39.es/ecma262/#sec-toprimitive
3366module.exports = function (input, pref) {
3367	if (!isObject(input) || isSymbol(input)) return input;
3368	var exoticToPrim = getMethod(input, TO_PRIMITIVE);
3369	var result;
3370	if (exoticToPrim) {
3371		if (pref === undefined) pref = 'default';
3372		result = call(exoticToPrim, input, pref);
3373		if (!isObject(result) || isSymbol(result)) return result;
3374		throw new $TypeError("Can't convert object to primitive value");
3375	}
3376	if (pref === undefined) pref = 'number';
3377	return ordinaryToPrimitive(input, pref);
3378};
3379
3380
3381/***/ }),
3382
3383/***/ 6969:
3384/***/ ((module, __unused_webpack_exports, __webpack_require__) => {
3385
3386
3387var toPrimitive = __webpack_require__(2777);
3388var isSymbol = __webpack_require__(757);
3389
3390// `ToPropertyKey` abstract operation
3391// https://tc39.es/ecma262/#sec-topropertykey
3392module.exports = function (argument) {
3393	var key = toPrimitive(argument, 'string');
3394	return isSymbol(key) ? key : key + '';
3395};
3396
3397
3398/***/ }),
3399
3400/***/ 2140:
3401/***/ ((module, __unused_webpack_exports, __webpack_require__) => {
3402
3403
3404var wellKnownSymbol = __webpack_require__(8227);
3405
3406var TO_STRING_TAG = wellKnownSymbol('toStringTag');
3407var test = {};
3408
3409test[TO_STRING_TAG] = 'z';
3410
3411module.exports = String(test) === '[object z]';
3412
3413
3414/***/ }),
3415
3416/***/ 655:
3417/***/ ((module, __unused_webpack_exports, __webpack_require__) => {
3418
3419
3420var classof = __webpack_require__(6955);
3421
3422var $String = String;
3423
3424module.exports = function (argument) {
3425	if (classof(argument) === 'Symbol') throw new TypeError('Cannot convert a Symbol value to a string');
3426	return $String(argument);
3427};
3428
3429
3430/***/ }),
3431
3432/***/ 6823:
3433/***/ ((module) => {
3434
3435
3436var $String = String;
3437
3438module.exports = function (argument) {
3439	try {
3440		return $String(argument);
3441	} catch (error) {
3442		return 'Object';
3443	}
3444};
3445
3446
3447/***/ }),
3448
3449/***/ 3392:
3450/***/ ((module, __unused_webpack_exports, __webpack_require__) => {
3451
3452
3453var uncurryThis = __webpack_require__(9504);
3454
3455var id = 0;
3456var postfix = Math.random();
3457var toString = uncurryThis(1.0.toString);
3458
3459module.exports = function (key) {
3460	return 'Symbol(' + (key === undefined ? '' : key) + ')_' + toString(++id + postfix, 36);
3461};
3462
3463
3464/***/ }),
3465
3466/***/ 7040:
3467/***/ ((module, __unused_webpack_exports, __webpack_require__) => {
3468
3469
3470/* eslint-disable es/no-symbol -- required for testing */
3471var NATIVE_SYMBOL = __webpack_require__(4495);
3472
3473module.exports = NATIVE_SYMBOL &&
3474	!Symbol.sham &&
3475	typeof Symbol.iterator == 'symbol';
3476
3477
3478/***/ }),
3479
3480/***/ 8686:
3481/***/ ((module, __unused_webpack_exports, __webpack_require__) => {
3482
3483
3484var DESCRIPTORS = __webpack_require__(3724);
3485var fails = __webpack_require__(9039);
3486
3487// V8 ~ Chrome 36-
3488// https://bugs.chromium.org/p/v8/issues/detail?id=3334
3489module.exports = DESCRIPTORS && fails(function () {
3490	// eslint-disable-next-line es/no-object-defineproperty -- required for testing
3491	return Object.defineProperty(function () { /* empty */ }, 'prototype', {
3492		value: 42,
3493		writable: false
3494	}).prototype !== 42;
3495});
3496
3497
3498/***/ }),
3499
3500/***/ 2812:
3501/***/ ((module) => {
3502
3503
3504var $TypeError = TypeError;
3505
3506module.exports = function (passed, required) {
3507	if (passed < required) throw new $TypeError('Not enough arguments');
3508	return passed;
3509};
3510
3511
3512/***/ }),
3513
3514/***/ 8622:
3515/***/ ((module, __unused_webpack_exports, __webpack_require__) => {
3516
3517
3518var globalThis = __webpack_require__(4576);
3519var isCallable = __webpack_require__(4901);
3520
3521var WeakMap = globalThis.WeakMap;
3522
3523module.exports = isCallable(WeakMap) && /native code/.test(String(WeakMap));
3524
3525
3526/***/ }),
3527
3528/***/ 8227:
3529/***/ ((module, __unused_webpack_exports, __webpack_require__) => {
3530
3531
3532var globalThis = __webpack_require__(4576);
3533var shared = __webpack_require__(5745);
3534var hasOwn = __webpack_require__(9297);
3535var uid = __webpack_require__(3392);
3536var NATIVE_SYMBOL = __webpack_require__(4495);
3537var USE_SYMBOL_AS_UID = __webpack_require__(7040);
3538
3539var Symbol = globalThis.Symbol;
3540var WellKnownSymbolsStore = shared('wks');
3541var createWellKnownSymbol = USE_SYMBOL_AS_UID ? Symbol['for'] || Symbol : Symbol && Symbol.withoutSetter || uid;
3542
3543module.exports = function (name) {
3544	if (!hasOwn(WellKnownSymbolsStore, name)) {
3545		WellKnownSymbolsStore[name] = NATIVE_SYMBOL && hasOwn(Symbol, name)
3546			? Symbol[name]
3547			: createWellKnownSymbol('Symbol.' + name);
3548	} return WellKnownSymbolsStore[name];
3549};
3550
3551
3552/***/ }),
3553
3554/***/ 6573:
3555/***/ ((__unused_webpack_module, __unused_webpack_exports, __webpack_require__) => {
3556
3557
3558var DESCRIPTORS = __webpack_require__(3724);
3559var defineBuiltInAccessor = __webpack_require__(2106);
3560var isDetached = __webpack_require__(3238);
3561
3562var ArrayBufferPrototype = ArrayBuffer.prototype;
3563
3564// `ArrayBuffer.prototype.detached` getter
3565// https://tc39.es/ecma262/#sec-get-arraybuffer.prototype.detached
3566if (DESCRIPTORS && !('detached' in ArrayBufferPrototype)) {
3567	defineBuiltInAccessor(ArrayBufferPrototype, 'detached', {
3568		configurable: true,
3569		get: function detached() {
3570			return isDetached(this);
3571		}
3572	});
3573}
3574
3575
3576/***/ }),
3577
3578/***/ 7936:
3579/***/ ((__unused_webpack_module, __unused_webpack_exports, __webpack_require__) => {
3580
3581
3582var $ = __webpack_require__(6518);
3583var $transfer = __webpack_require__(5636);
3584
3585// `ArrayBuffer.prototype.transferToFixedLength` method
3586// https://tc39.es/proposal-arraybuffer-transfer/#sec-arraybuffer.prototype.transfertofixedlength
3587if ($transfer) $({ target: 'ArrayBuffer', proto: true }, {
3588	transferToFixedLength: function transferToFixedLength() {
3589		return $transfer(this, arguments.length ? arguments[0] : undefined, false);
3590	}
3591});
3592
3593
3594/***/ }),
3595
3596/***/ 8100:
3597/***/ ((__unused_webpack_module, __unused_webpack_exports, __webpack_require__) => {
3598
3599
3600var $ = __webpack_require__(6518);
3601var $transfer = __webpack_require__(5636);
3602
3603// `ArrayBuffer.prototype.transfer` method
3604// https://tc39.es/proposal-arraybuffer-transfer/#sec-arraybuffer.prototype.transfer
3605if ($transfer) $({ target: 'ArrayBuffer', proto: true }, {
3606	transfer: function transfer() {
3607		return $transfer(this, arguments.length ? arguments[0] : undefined, true);
3608	}
3609});
3610
3611
3612/***/ }),
3613
3614/***/ 4114:
3615/***/ ((__unused_webpack_module, __unused_webpack_exports, __webpack_require__) => {
3616
3617
3618var $ = __webpack_require__(6518);
3619var toObject = __webpack_require__(8981);
3620var lengthOfArrayLike = __webpack_require__(6198);
3621var setArrayLength = __webpack_require__(4527);
3622var doesNotExceedSafeInteger = __webpack_require__(6837);
3623var fails = __webpack_require__(9039);
3624
3625var INCORRECT_TO_LENGTH = fails(function () {
3626	return [].push.call({ length: 0x100000000 }, 1) !== 4294967297;
3627});
3628
3629// V8 <= 121 and Safari <= 15.4; FF < 23 throws InternalError
3630// https://bugs.chromium.org/p/v8/issues/detail?id=12681
3631var properErrorOnNonWritableLength = function () {
3632	try {
3633		// eslint-disable-next-line es/no-object-defineproperty -- safe
3634		Object.defineProperty([], 'length', { writable: false }).push();
3635	} catch (error) {
3636		return error instanceof TypeError;
3637	}
3638};
3639
3640var FORCED = INCORRECT_TO_LENGTH || !properErrorOnNonWritableLength();
3641
3642// `Array.prototype.push` method
3643// https://tc39.es/ecma262/#sec-array.prototype.push
3644$({ target: 'Array', proto: true, arity: 1, forced: FORCED }, {
3645	// eslint-disable-next-line no-unused-vars -- required for `.length`
3646	push: function push(item) {
3647		var O = toObject(this);
3648		var len = lengthOfArrayLike(O);
3649		var argCount = arguments.length;
3650		doesNotExceedSafeInteger(len + argCount);
3651		for (var i = 0; i < argCount; i++) {
3652			O[len] = arguments[i];
3653			len++;
3654		}
3655		setArrayLength(O, len);
3656		return len;
3657	}
3658});
3659
3660
3661/***/ }),
3662
3663/***/ 8111:
3664/***/ ((__unused_webpack_module, __unused_webpack_exports, __webpack_require__) => {
3665
3666
3667var $ = __webpack_require__(6518);
3668var globalThis = __webpack_require__(4576);
3669var anInstance = __webpack_require__(679);
3670var anObject = __webpack_require__(8551);
3671var isCallable = __webpack_require__(4901);
3672var getPrototypeOf = __webpack_require__(2787);
3673var defineBuiltInAccessor = __webpack_require__(2106);
3674var createProperty = __webpack_require__(4659);
3675var fails = __webpack_require__(9039);
3676var hasOwn = __webpack_require__(9297);
3677var wellKnownSymbol = __webpack_require__(8227);
3678var IteratorPrototype = (__webpack_require__(7657).IteratorPrototype);
3679var DESCRIPTORS = __webpack_require__(3724);
3680var IS_PURE = __webpack_require__(6395);
3681
3682var CONSTRUCTOR = 'constructor';
vendor: 4,231 bytes, lines 3683-3821
3683var ITERATOR = 'Iterator';
3684var TO_STRING_TAG = wellKnownSymbol('toStringTag');
3685
3686var $TypeError = TypeError;
3687var NativeIterator = globalThis[ITERATOR];
3688
3689// FF56- have non-standard global helper `Iterator`
3690var FORCED = IS_PURE
3691	|| !isCallable(NativeIterator)
3692	|| NativeIterator.prototype !== IteratorPrototype
3693	// FF44- non-standard `Iterator` passes previous tests
3694	|| !fails(function () { NativeIterator({}); });
3695
3696var IteratorConstructor = function Iterator() {
3697	anInstance(this, IteratorPrototype);
3698	if (getPrototypeOf(this) === IteratorPrototype) throw new $TypeError('Abstract class Iterator not directly constructable');
3699};
3700
3701var defineIteratorPrototypeAccessor = function (key, value) {
3702	if (DESCRIPTORS) {
3703		defineBuiltInAccessor(IteratorPrototype, key, {
3704			configurable: true,
3705			get: function () {
3706				return value;
3707			},
3708			set: function (replacement) {
3709				anObject(this);
3710				if (this === IteratorPrototype) throw new $TypeError("You can't redefine this property");
3711				if (hasOwn(this, key)) this[key] = replacement;
3712				else createProperty(this, key, replacement);
3713			}
3714		});
3715	} else IteratorPrototype[key] = value;
3716};
3717
3718if (!hasOwn(IteratorPrototype, TO_STRING_TAG)) defineIteratorPrototypeAccessor(TO_STRING_TAG, ITERATOR);
3719
3720if (FORCED || !hasOwn(IteratorPrototype, CONSTRUCTOR) || IteratorPrototype[CONSTRUCTOR] === Object) {
3721	defineIteratorPrototypeAccessor(CONSTRUCTOR, IteratorConstructor);
3722}
3723
3724IteratorConstructor.prototype = IteratorPrototype;
3725
3726// `Iterator` constructor
3727// https://tc39.es/ecma262/#sec-iterator
3728$({ global: true, constructor: true, forced: FORCED }, {
3729	Iterator: IteratorConstructor
3730});
3731
3732
3733/***/ }),
3734
3735/***/ 1148:
3736/***/ ((__unused_webpack_module, __unused_webpack_exports, __webpack_require__) => {
3737
3738
3739var $ = __webpack_require__(6518);
3740var iterate = __webpack_require__(2652);
3741var aCallable = __webpack_require__(9306);
3742var anObject = __webpack_require__(8551);
3743var getIteratorDirect = __webpack_require__(1767);
3744
3745// `Iterator.prototype.every` method
3746// https://tc39.es/ecma262/#sec-iterator.prototype.every
3747$({ target: 'Iterator', proto: true, real: true }, {
3748	every: function every(predicate) {
3749		anObject(this);
3750		aCallable(predicate);
3751		var record = getIteratorDirect(this);
3752		var counter = 0;
3753		return !iterate(record, function (value, stop) {
3754			if (!predicate(value, counter++)) return stop();
3755		}, { IS_RECORD: true, INTERRUPTED: true }).stopped;
3756	}
3757});
3758
3759
3760/***/ }),
3761
3762/***/ 2489:
3763/***/ ((__unused_webpack_module, __unused_webpack_exports, __webpack_require__) => {
3764
3765
3766var $ = __webpack_require__(6518);
3767var call = __webpack_require__(9565);
3768var aCallable = __webpack_require__(9306);
3769var anObject = __webpack_require__(8551);
3770var getIteratorDirect = __webpack_require__(1767);
3771var createIteratorProxy = __webpack_require__(9462);
3772var callWithSafeIterationClosing = __webpack_require__(6319);
3773var IS_PURE = __webpack_require__(6395);
3774
3775var IteratorProxy = createIteratorProxy(function () {
3776	var iterator = this.iterator;
3777	var predicate = this.predicate;
3778	var next = this.next;
3779	var result, done, value;
3780	while (true) {
3781		result = anObject(call(next, iterator));
3782		done = this.done = !!result.done;
3783		if (done) return;
3784		value = result.value;
3785		if (callWithSafeIterationClosing(iterator, predicate, [value, this.counter++], true)) return value;
3786	}
3787});
3788
3789// `Iterator.prototype.filter` method
3790// https://tc39.es/ecma262/#sec-iterator.prototype.filter
3791$({ target: 'Iterator', proto: true, real: true, forced: IS_PURE }, {
3792	filter: function filter(predicate) {
3793		anObject(this);
3794		aCallable(predicate);
3795		return new IteratorProxy(getIteratorDirect(this), {
3796			predicate: predicate
3797		});
3798	}
3799});
3800
3801
3802/***/ }),
3803
3804/***/ 116:
3805/***/ ((__unused_webpack_module, __unused_webpack_exports, __webpack_require__) => {
3806
3807
3808var $ = __webpack_require__(6518);
3809var iterate = __webpack_require__(2652);
3810var aCallable = __webpack_require__(9306);
3811var anObject = __webpack_require__(8551);
3812var getIteratorDirect = __webpack_require__(1767);
3813
3814// `Iterator.prototype.find` method
3815// https://tc39.es/ecma262/#sec-iterator.prototype.find
3816$({ target: 'Iterator', proto: true, real: true }, {
3817	find: function find(predicate) {
3818		anObject(this);
3819		aCallable(predicate);
3820		var record = getIteratorDirect(this);
3821		var counter = 0;
vendor: 4,219 bytes, lines 3822-3979
3822		return iterate(record, function (value, stop) {
3823			if (predicate(value, counter++)) return stop(value);
3824		}, { IS_RECORD: true, INTERRUPTED: true }).result;
3825	}
3826});
3827
3828
3829/***/ }),
3830
3831/***/ 7588:
3832/***/ ((__unused_webpack_module, __unused_webpack_exports, __webpack_require__) => {
3833
3834
3835var $ = __webpack_require__(6518);
3836var iterate = __webpack_require__(2652);
3837var aCallable = __webpack_require__(9306);
3838var anObject = __webpack_require__(8551);
3839var getIteratorDirect = __webpack_require__(1767);
3840
3841// `Iterator.prototype.forEach` method
3842// https://tc39.es/ecma262/#sec-iterator.prototype.foreach
3843$({ target: 'Iterator', proto: true, real: true }, {
3844	forEach: function forEach(fn) {
3845		anObject(this);
3846		aCallable(fn);
3847		var record = getIteratorDirect(this);
3848		var counter = 0;
3849		iterate(record, function (value) {
3850			fn(value, counter++);
3851		}, { IS_RECORD: true });
3852	}
3853});
3854
3855
3856/***/ }),
3857
3858/***/ 1701:
3859/***/ ((__unused_webpack_module, __unused_webpack_exports, __webpack_require__) => {
3860
3861
3862var $ = __webpack_require__(6518);
3863var map = __webpack_require__(713);
3864var IS_PURE = __webpack_require__(6395);
3865
3866// `Iterator.prototype.map` method
3867// https://tc39.es/ecma262/#sec-iterator.prototype.map
3868$({ target: 'Iterator', proto: true, real: true, forced: IS_PURE }, {
3869	map: map
3870});
3871
3872
3873/***/ }),
3874
3875/***/ 8237:
3876/***/ ((__unused_webpack_module, __unused_webpack_exports, __webpack_require__) => {
3877
3878
3879var $ = __webpack_require__(6518);
3880var iterate = __webpack_require__(2652);
3881var aCallable = __webpack_require__(9306);
3882var anObject = __webpack_require__(8551);
3883var getIteratorDirect = __webpack_require__(1767);
3884
3885var $TypeError = TypeError;
3886
3887// `Iterator.prototype.reduce` method
3888// https://tc39.es/ecma262/#sec-iterator.prototype.reduce
3889$({ target: 'Iterator', proto: true, real: true }, {
3890	reduce: function reduce(reducer /* , initialValue */) {
3891		anObject(this);
3892		aCallable(reducer);
3893		var record = getIteratorDirect(this);
3894		var noInitial = arguments.length < 2;
3895		var accumulator = noInitial ? undefined : arguments[1];
3896		var counter = 0;
3897		iterate(record, function (value) {
3898			if (noInitial) {
3899				noInitial = false;
3900				accumulator = value;
3901			} else {
3902				accumulator = reducer(accumulator, value, counter);
3903			}
3904			counter++;
3905		}, { IS_RECORD: true });
3906		if (noInitial) throw new $TypeError('Reduce of empty iterator with no initial value');
3907		return accumulator;
3908	}
3909});
3910
3911
3912/***/ }),
3913
3914/***/ 3579:
3915/***/ ((__unused_webpack_module, __unused_webpack_exports, __webpack_require__) => {
3916
3917
3918var $ = __webpack_require__(6518);
3919var iterate = __webpack_require__(2652);
3920var aCallable = __webpack_require__(9306);
3921var anObject = __webpack_require__(8551);
3922var getIteratorDirect = __webpack_require__(1767);
3923
3924// `Iterator.prototype.some` method
3925// https://tc39.es/ecma262/#sec-iterator.prototype.some
3926$({ target: 'Iterator', proto: true, real: true }, {
3927	some: function some(predicate) {
3928		anObject(this);
3929		aCallable(predicate);
3930		var record = getIteratorDirect(this);
3931		var counter = 0;
3932		return iterate(record, function (value, stop) {
3933			if (predicate(value, counter++)) return stop();
3934		}, { IS_RECORD: true, INTERRUPTED: true }).stopped;
3935	}
3936});
3937
3938
3939/***/ }),
3940
3941/***/ 1806:
3942/***/ ((__unused_webpack_module, __unused_webpack_exports, __webpack_require__) => {
3943
3944
3945var $ = __webpack_require__(6518);
3946var anObject = __webpack_require__(8551);
3947var iterate = __webpack_require__(2652);
3948var getIteratorDirect = __webpack_require__(1767);
3949
3950var push = [].push;
3951
3952// `Iterator.prototype.toArray` method
3953// https://tc39.es/ecma262/#sec-iterator.prototype.toarray
3954$({ target: 'Iterator', proto: true, real: true }, {
3955	toArray: function toArray() {
3956		var result = [];
3957		iterate(getIteratorDirect(anObject(this)), push, { that: result, IS_RECORD: true });
3958		return result;
3959	}
3960});
3961
3962
3963/***/ }),
3964
3965/***/ 1689:
3966/***/ ((__unused_webpack_module, __unused_webpack_exports, __webpack_require__) => {
3967
3968
3969var $ = __webpack_require__(6518);
3970var globalThis = __webpack_require__(4576);
3971var apply = __webpack_require__(8745);
3972var slice = __webpack_require__(7680);
3973var newPromiseCapabilityModule = __webpack_require__(6043);
3974var aCallable = __webpack_require__(9306);
3975var perform = __webpack_require__(1103);
3976
3977var Promise = globalThis.Promise;
3978
3979var ACCEPT_ARGUMENTS = false;
3980// Avoiding the use of polyfills of the previous iteration of this proposal
3981// that does not accept arguments of the callback
3982var FORCED = !Promise || !Promise['try'] || perform(function () {
3983	Promise['try'](function (argument) {
3984		ACCEPT_ARGUMENTS = argument === 8;
3985	}, 8);
3986}).error || !ACCEPT_ARGUMENTS;
3987
3988// `Promise.try` method
3989// https://tc39.es/ecma262/#sec-promise.try
3990$({ target: 'Promise', stat: true, forced: FORCED }, {
3991	'try': function (callbackfn /* , ...args */) {
3992		var args = arguments.length > 1 ? slice(arguments, 1) : [];
3993		var promiseCapability = newPromiseCapabilityModule.f(this);
3994		var result = perform(function () {
3995			return apply(aCallable(callbackfn), undefined, args);
3996		});
3997		(result.error ? promiseCapability.reject : promiseCapability.resolve)(result.value);
3998		return promiseCapability.promise;
3999	}
4000});
4001
4002
4003/***/ }),
4004
4005/***/ 4628:
4006/***/ ((__unused_webpack_module, __unused_webpack_exports, __webpack_require__) => {
4007
4008
4009var $ = __webpack_require__(6518);
4010var newPromiseCapabilityModule = __webpack_require__(6043);
4011
4012// `Promise.withResolvers` method
4013// https://tc39.es/ecma262/#sec-promise.withResolvers
4014$({ target: 'Promise', stat: true }, {
4015	withResolvers: function withResolvers() {
4016		var promiseCapability = newPromiseCapabilityModule.f(this);
4017		return {
4018			promise: promiseCapability.promise,
4019			resolve: promiseCapability.resolve,
4020			reject: promiseCapability.reject
4021		};
4022	}
4023});
4024
4025
4026/***/ }),
4027
4028/***/ 9479:
4029/***/ ((__unused_webpack_module, __unused_webpack_exports, __webpack_require__) => {
4030
4031
4032var globalThis = __webpack_require__(4576);
4033var DESCRIPTORS = __webpack_require__(3724);
4034var defineBuiltInAccessor = __webpack_require__(2106);
4035var regExpFlags = __webpack_require__(7979);
4036var fails = __webpack_require__(9039);
4037
4038// babel-minify and Closure Compiler transpiles RegExp('.', 'd') -> /./d and it causes SyntaxError
4039var RegExp = globalThis.RegExp;
4040var RegExpPrototype = RegExp.prototype;
4041
4042var FORCED = DESCRIPTORS && fails(function () {
4043	var INDICES_SUPPORT = true;
4044	try {
4045		RegExp('.', 'd');
4046	} catch (error) {
4047		INDICES_SUPPORT = false;
4048	}
4049
4050	var O = {};
4051	// modern V8 bug
4052	var calls = '';
4053	var expected = INDICES_SUPPORT ? 'dgimsy' : 'gimsy';
4054
4055	var addGetter = function (key, chr) {
4056		// eslint-disable-next-line es/no-object-defineproperty -- safe
4057		Object.defineProperty(O, key, { get: function () {
4058			calls += chr;
4059			return true;
4060		} });
4061	};
4062
4063	var pairs = {
4064		dotAll: 's',
4065		global: 'g',
4066		ignoreCase: 'i',
4067		multiline: 'm',
4068		sticky: 'y'
4069	};
4070
4071	if (INDICES_SUPPORT) pairs.hasIndices = 'd';
4072
4073	for (var key in pairs) addGetter(key, pairs[key]);
4074
4075	// eslint-disable-next-line es/no-object-getownpropertydescriptor -- safe
4076	var result = Object.getOwnPropertyDescriptor(RegExpPrototype, 'flags').get.call(O);
4077
4078	return result !== expected || calls !== expected;
4079});
4080
4081// `RegExp.prototype.flags` getter
4082// https://tc39.es/ecma262/#sec-get-regexp.prototype.flags
4083if (FORCED) defineBuiltInAccessor(RegExpPrototype, 'flags', {
4084	configurable: true,
4085	get: regExpFlags
4086});
4087
4088
4089/***/ }),
4090
4091/***/ 7642:
4092/***/ ((__unused_webpack_module, __unused_webpack_exports, __webpack_require__) => {
4093
4094
4095var $ = __webpack_require__(6518);
4096var difference = __webpack_require__(3440);
4097var setMethodAcceptSetLike = __webpack_require__(4916);
4098
4099// `Set.prototype.difference` method
4100// https://tc39.es/ecma262/#sec-set.prototype.difference
4101$({ target: 'Set', proto: true, real: true, forced: !setMethodAcceptSetLike('difference') }, {
4102	difference: difference
4103});
4104
4105
4106/***/ }),
4107
4108/***/ 8004:
4109/***/ ((__unused_webpack_module, __unused_webpack_exports, __webpack_require__) => {
4110
4111
4112var $ = __webpack_require__(6518);
4113var fails = __webpack_require__(9039);
4114var intersection = __webpack_require__(8750);
4115var setMethodAcceptSetLike = __webpack_require__(4916);
4116
4117var INCORRECT = !setMethodAcceptSetLike('intersection') || fails(function () {
4118	// eslint-disable-next-line es/no-array-from, es/no-set -- testing
4119	return String(Array.from(new Set([1, 2, 3]).intersection(new Set([3, 2])))) !== '3,2';
4120});
4121
4122// `Set.prototype.intersection` method
4123// https://tc39.es/ecma262/#sec-set.prototype.intersection
4124$({ target: 'Set', proto: true, real: true, forced: INCORRECT }, {
4125	intersection: intersection
4126});
4127
4128
4129/***/ }),
4130
4131/***/ 3853:
4132/***/ ((__unused_webpack_module, __unused_webpack_exports, __webpack_require__) => {
4133
4134
4135var $ = __webpack_require__(6518);
4136var isDisjointFrom = __webpack_require__(4449);
4137var setMethodAcceptSetLike = __webpack_require__(4916);
4138
4139// `Set.prototype.isDisjointFrom` method
4140// https://tc39.es/ecma262/#sec-set.prototype.isdisjointfrom
4141$({ target: 'Set', proto: true, real: true, forced: !setMethodAcceptSetLike('isDisjointFrom') }, {
4142	isDisjointFrom: isDisjointFrom
4143});
4144
4145
4146/***/ }),
4147
4148/***/ 5876:
4149/***/ ((__unused_webpack_module, __unused_webpack_exports, __webpack_require__) => {
4150
4151
4152var $ = __webpack_require__(6518);
4153var isSubsetOf = __webpack_require__(3838);
4154var setMethodAcceptSetLike = __webpack_require__(4916);
4155
4156// `Set.prototype.isSubsetOf` method
4157// https://tc39.es/ecma262/#sec-set.prototype.issubsetof
4158$({ target: 'Set', proto: true, real: true, forced: !setMethodAcceptSetLike('isSubsetOf') }, {
4159	isSubsetOf: isSubsetOf
4160});
4161
4162
4163/***/ }),
4164
4165/***/ 2475:
4166/***/ ((__unused_webpack_module, __unused_webpack_exports, __webpack_require__) => {
4167
4168
4169var $ = __webpack_require__(6518);
4170var isSupersetOf = __webpack_require__(8527);
4171var setMethodAcceptSetLike = __webpack_require__(4916);
4172
4173// `Set.prototype.isSupersetOf` method
4174// https://tc39.es/ecma262/#sec-set.prototype.issupersetof
4175$({ target: 'Set', proto: true, real: true, forced: !setMethodAcceptSetLike('isSupersetOf') }, {
4176	isSupersetOf: isSupersetOf
4177});
4178
4179
4180/***/ }),
4181
4182/***/ 5024:
4183/***/ ((__unused_webpack_module, __unused_webpack_exports, __webpack_require__) => {
4184
4185
4186var $ = __webpack_require__(6518);
4187var symmetricDifference = __webpack_require__(3650);
4188var setMethodAcceptSetLike = __webpack_require__(4916);
4189
4190// `Set.prototype.symmetricDifference` method
4191// https://tc39.es/ecma262/#sec-set.prototype.symmetricdifference
4192$({ target: 'Set', proto: true, real: true, forced: !setMethodAcceptSetLike('symmetricDifference') }, {
4193	symmetricDifference: symmetricDifference
4194});
4195
4196
4197/***/ }),
4198
4199/***/ 1698:
4200/***/ ((__unused_webpack_module, __unused_webpack_exports, __webpack_require__) => {
4201
4202
4203var $ = __webpack_require__(6518);
4204var union = __webpack_require__(4204);
4205var setMethodAcceptSetLike = __webpack_require__(4916);
4206
4207// `Set.prototype.union` method
4208// https://tc39.es/ecma262/#sec-set.prototype.union
4209$({ target: 'Set', proto: true, real: true, forced: !setMethodAcceptSetLike('union') }, {
4210	union: union
4211});
4212
4213
4214/***/ }),
4215
4216/***/ 7467:
4217/***/ ((__unused_webpack_module, __unused_webpack_exports, __webpack_require__) => {
4218
4219
4220var arrayToReversed = __webpack_require__(7628);
4221var ArrayBufferViewCore = __webpack_require__(4644);
4222
4223var aTypedArray = ArrayBufferViewCore.aTypedArray;
4224var exportTypedArrayMethod = ArrayBufferViewCore.exportTypedArrayMethod;
4225var getTypedArrayConstructor = ArrayBufferViewCore.getTypedArrayConstructor;
4226
4227// `%TypedArray%.prototype.toReversed` method
4228// https://tc39.es/ecma262/#sec-%typedarray%.prototype.toreversed
4229exportTypedArrayMethod('toReversed', function toReversed() {
4230	return arrayToReversed(aTypedArray(this), getTypedArrayConstructor(this));
4231});
4232
4233
4234/***/ }),
4235
4236/***/ 4732:
4237/***/ ((__unused_webpack_module, __unused_webpack_exports, __webpack_require__) => {
4238
4239
4240var ArrayBufferViewCore = __webpack_require__(4644);
4241var uncurryThis = __webpack_require__(9504);
4242var aCallable = __webpack_require__(9306);
4243var arrayFromConstructorAndList = __webpack_require__(5370);
4244
4245var aTypedArray = ArrayBufferViewCore.aTypedArray;
4246var getTypedArrayConstructor = ArrayBufferViewCore.getTypedArrayConstructor;
4247var exportTypedArrayMethod = ArrayBufferViewCore.exportTypedArrayMethod;
4248var sort = uncurryThis(ArrayBufferViewCore.TypedArrayPrototype.sort);
4249
4250// `%TypedArray%.prototype.toSorted` method
4251// https://tc39.es/ecma262/#sec-%typedarray%.prototype.tosorted
4252exportTypedArrayMethod('toSorted', function toSorted(compareFn) {
4253	if (compareFn !== undefined) aCallable(compareFn);
4254	var O = aTypedArray(this);
4255	var A = arrayFromConstructorAndList(getTypedArrayConstructor(O), O);
4256	return sort(A, compareFn);
4257});
4258
4259
4260/***/ }),
4261
4262/***/ 9577:
4263/***/ ((__unused_webpack_module, __unused_webpack_exports, __webpack_require__) => {
4264
4265
4266var arrayWith = __webpack_require__(9928);
4267var ArrayBufferViewCore = __webpack_require__(4644);
4268var isBigIntArray = __webpack_require__(1108);
4269var toIntegerOrInfinity = __webpack_require__(1291);
4270var toBigInt = __webpack_require__(5854);
4271
4272var aTypedArray = ArrayBufferViewCore.aTypedArray;
4273var getTypedArrayConstructor = ArrayBufferViewCore.getTypedArrayConstructor;
4274var exportTypedArrayMethod = ArrayBufferViewCore.exportTypedArrayMethod;
4275
4276var PROPER_ORDER = !!function () {
4277	try {
4278		// eslint-disable-next-line no-throw-literal, es/no-typed-arrays, es/no-array-prototype-with -- required for testing
vendor: 17,013 bytes, lines 4279-4789
4279		new Int8Array(1)['with'](2, { valueOf: function () { throw 8; } });
4280	} catch (error) {
4281		// some early implementations, like WebKit, does not follow the final semantic
4282		// https://github.com/tc39/proposal-change-array-by-copy/pull/86
4283		return error === 8;
4284	}
4285}();
4286
4287// `%TypedArray%.prototype.with` method
4288// https://tc39.es/ecma262/#sec-%typedarray%.prototype.with
4289exportTypedArrayMethod('with', { 'with': function (index, value) {
4290	var O = aTypedArray(this);
4291	var relativeIndex = toIntegerOrInfinity(index);
4292	var actualValue = isBigIntArray(O) ? toBigInt(value) : +value;
4293	return arrayWith(O, getTypedArrayConstructor(O), relativeIndex, actualValue);
4294} }['with'], !PROPER_ORDER);
4295
4296
4297/***/ }),
4298
4299/***/ 8992:
4300/***/ ((__unused_webpack_module, __unused_webpack_exports, __webpack_require__) => {
4301
4302
4303// TODO: Remove from `core-js@4`
4304__webpack_require__(8111);
4305
4306
4307/***/ }),
4308
4309/***/ 3215:
4310/***/ ((__unused_webpack_module, __unused_webpack_exports, __webpack_require__) => {
4311
4312
4313// TODO: Remove from `core-js@4`
4314__webpack_require__(1148);
4315
4316
4317/***/ }),
4318
4319/***/ 4520:
4320/***/ ((__unused_webpack_module, __unused_webpack_exports, __webpack_require__) => {
4321
4322
4323// TODO: Remove from `core-js@4`
4324__webpack_require__(2489);
4325
4326
4327/***/ }),
4328
4329/***/ 2577:
4330/***/ ((__unused_webpack_module, __unused_webpack_exports, __webpack_require__) => {
4331
4332
4333// TODO: Remove from `core-js@4`
4334__webpack_require__(116);
4335
4336
4337/***/ }),
4338
4339/***/ 3949:
4340/***/ ((__unused_webpack_module, __unused_webpack_exports, __webpack_require__) => {
4341
4342
4343// TODO: Remove from `core-js@4`
4344__webpack_require__(7588);
4345
4346
4347/***/ }),
4348
4349/***/ 1454:
4350/***/ ((__unused_webpack_module, __unused_webpack_exports, __webpack_require__) => {
4351
4352
4353// TODO: Remove from `core-js@4`
4354__webpack_require__(1701);
4355
4356
4357/***/ }),
4358
4359/***/ 8872:
4360/***/ ((__unused_webpack_module, __unused_webpack_exports, __webpack_require__) => {
4361
4362
4363// TODO: Remove from `core-js@4`
4364__webpack_require__(8237);
4365
4366
4367/***/ }),
4368
4369/***/ 7550:
4370/***/ ((__unused_webpack_module, __unused_webpack_exports, __webpack_require__) => {
4371
4372
4373// TODO: Remove from `core-js@4`
4374__webpack_require__(3579);
4375
4376
4377/***/ }),
4378
4379/***/ 1795:
4380/***/ ((__unused_webpack_module, __unused_webpack_exports, __webpack_require__) => {
4381
4382
4383// TODO: Remove from `core-js@4`
4384__webpack_require__(1806);
4385
4386
4387/***/ }),
4388
4389/***/ 5247:
4390/***/ ((__unused_webpack_module, __unused_webpack_exports, __webpack_require__) => {
4391
4392
4393// TODO: Remove from `core-js@4`
4394__webpack_require__(1689);
4395
4396
4397/***/ }),
4398
4399/***/ 4979:
4400/***/ ((__unused_webpack_module, __unused_webpack_exports, __webpack_require__) => {
4401
4402
4403var $ = __webpack_require__(6518);
4404var globalThis = __webpack_require__(4576);
4405var getBuiltIn = __webpack_require__(7751);
4406var createPropertyDescriptor = __webpack_require__(6980);
4407var defineProperty = (__webpack_require__(4913).f);
4408var hasOwn = __webpack_require__(9297);
4409var anInstance = __webpack_require__(679);
4410var inheritIfRequired = __webpack_require__(3167);
4411var normalizeStringArgument = __webpack_require__(2603);
4412var DOMExceptionConstants = __webpack_require__(5002);
4413var clearErrorStack = __webpack_require__(8574);
4414var DESCRIPTORS = __webpack_require__(3724);
4415var IS_PURE = __webpack_require__(6395);
4416
4417var DOM_EXCEPTION = 'DOMException';
4418var Error = getBuiltIn('Error');
4419var NativeDOMException = getBuiltIn(DOM_EXCEPTION);
4420
4421var $DOMException = function DOMException() {
4422	anInstance(this, DOMExceptionPrototype);
4423	var argumentsLength = arguments.length;
4424	var message = normalizeStringArgument(argumentsLength < 1 ? undefined : arguments[0]);
4425	var name = normalizeStringArgument(argumentsLength < 2 ? undefined : arguments[1], 'Error');
4426	var that = new NativeDOMException(message, name);
4427	var error = new Error(message);
4428	error.name = DOM_EXCEPTION;
4429	defineProperty(that, 'stack', createPropertyDescriptor(1, clearErrorStack(error.stack, 1)));
4430	inheritIfRequired(that, this, $DOMException);
4431	return that;
4432};
4433
4434var DOMExceptionPrototype = $DOMException.prototype = NativeDOMException.prototype;
4435
4436var ERROR_HAS_STACK = 'stack' in new Error(DOM_EXCEPTION);
4437var DOM_EXCEPTION_HAS_STACK = 'stack' in new NativeDOMException(1, 2);
4438
4439// eslint-disable-next-line es/no-object-getownpropertydescriptor -- safe
4440var descriptor = NativeDOMException && DESCRIPTORS && Object.getOwnPropertyDescriptor(globalThis, DOM_EXCEPTION);
4441
4442// Bun ~ 0.1.1 DOMException have incorrect descriptor and we can't redefine it
4443// https://github.com/Jarred-Sumner/bun/issues/399
4444var BUGGY_DESCRIPTOR = !!descriptor && !(descriptor.writable && descriptor.configurable);
4445
4446var FORCED_CONSTRUCTOR = ERROR_HAS_STACK && !BUGGY_DESCRIPTOR && !DOM_EXCEPTION_HAS_STACK;
4447
4448// `DOMException` constructor patch for `.stack` where it's required
4449// https://webidl.spec.whatwg.org/#es-DOMException-specialness
4450$({ global: true, constructor: true, forced: IS_PURE || FORCED_CONSTRUCTOR }, { // TODO: fix export logic
4451	DOMException: FORCED_CONSTRUCTOR ? $DOMException : NativeDOMException
4452});
4453
4454var PolyfilledDOMException = getBuiltIn(DOM_EXCEPTION);
4455var PolyfilledDOMExceptionPrototype = PolyfilledDOMException.prototype;
4456
4457if (PolyfilledDOMExceptionPrototype.constructor !== PolyfilledDOMException) {
4458	if (!IS_PURE) {
4459		defineProperty(PolyfilledDOMExceptionPrototype, 'constructor', createPropertyDescriptor(1, PolyfilledDOMException));
4460	}
4461
4462	for (var key in DOMExceptionConstants) if (hasOwn(DOMExceptionConstants, key)) {
4463		var constant = DOMExceptionConstants[key];
4464		var constantName = constant.s;
4465		if (!hasOwn(PolyfilledDOMException, constantName)) {
4466			defineProperty(PolyfilledDOMException, constantName, createPropertyDescriptor(6, constant.c));
4467		}
4468	}
4469}
4470
4471
4472/***/ }),
4473
4474/***/ 3611:
4475/***/ ((__unused_webpack_module, __unused_webpack_exports, __webpack_require__) => {
4476
4477
4478var $ = __webpack_require__(6518);
4479var globalThis = __webpack_require__(4576);
4480var defineBuiltInAccessor = __webpack_require__(2106);
4481var DESCRIPTORS = __webpack_require__(3724);
4482
4483var $TypeError = TypeError;
4484// eslint-disable-next-line es/no-object-defineproperty -- safe
4485var defineProperty = Object.defineProperty;
4486var INCORRECT_VALUE = globalThis.self !== globalThis;
4487
4488// `self` getter
4489// https://html.spec.whatwg.org/multipage/window-object.html#dom-self
4490try {
4491	if (DESCRIPTORS) {
4492		// eslint-disable-next-line es/no-object-getownpropertydescriptor -- safe
4493		var descriptor = Object.getOwnPropertyDescriptor(globalThis, 'self');
4494		// some engines have `self`, but with incorrect descriptor
4495		// https://github.com/denoland/deno/issues/15765
4496		if (INCORRECT_VALUE || !descriptor || !descriptor.get || !descriptor.enumerable) {
4497			defineBuiltInAccessor(globalThis, 'self', {
4498				get: function self() {
4499					return globalThis;
4500				},
4501				set: function self(value) {
4502					if (this !== globalThis) throw new $TypeError('Illegal invocation');
4503					defineProperty(globalThis, 'self', {
4504						value: value,
4505						writable: true,
4506						configurable: true,
4507						enumerable: true
4508					});
4509				},
4510				configurable: true,
4511				enumerable: true
4512			});
4513		}
4514	} else $({ global: true, simple: true, forced: INCORRECT_VALUE }, {
4515		self: globalThis
4516	});
4517} catch (error) { /* empty */ }
4518
4519
4520/***/ }),
4521
4522/***/ 4603:
4523/***/ ((__unused_webpack_module, __unused_webpack_exports, __webpack_require__) => {
4524
4525
4526var defineBuiltIn = __webpack_require__(6840);
4527var uncurryThis = __webpack_require__(9504);
4528var toString = __webpack_require__(655);
4529var validateArgumentsLength = __webpack_require__(2812);
4530
4531var $URLSearchParams = URLSearchParams;
4532var URLSearchParamsPrototype = $URLSearchParams.prototype;
4533var append = uncurryThis(URLSearchParamsPrototype.append);
4534var $delete = uncurryThis(URLSearchParamsPrototype['delete']);
4535var forEach = uncurryThis(URLSearchParamsPrototype.forEach);
4536var push = uncurryThis([].push);
4537var params = new $URLSearchParams('a=1&a=2&b=3');
4538
4539params['delete']('a', 1);
4540// `undefined` case is a Chromium 117 bug
4541// https://bugs.chromium.org/p/v8/issues/detail?id=14222
4542params['delete']('b', undefined);
4543
4544if (params + '' !== 'a=2') {
4545	defineBuiltIn(URLSearchParamsPrototype, 'delete', function (name /* , value */) {
4546		var length = arguments.length;
4547		var $value = length < 2 ? undefined : arguments[1];
4548		if (length && $value === undefined) return $delete(this, name);
4549		var entries = [];
4550		forEach(this, function (v, k) { // also validates `this`
4551			push(entries, { key: k, value: v });
4552		});
4553		validateArgumentsLength(length, 1);
4554		var key = toString(name);
4555		var value = toString($value);
4556		var index = 0;
4557		var dindex = 0;
4558		var found = false;
4559		var entriesLength = entries.length;
4560		var entry;
4561		while (index < entriesLength) {
4562			entry = entries[index++];
4563			if (found || entry.key === key) {
4564				found = true;
4565				$delete(this, entry.key);
4566			} else dindex++;
4567		}
4568		while (dindex < entriesLength) {
4569			entry = entries[dindex++];
4570			if (!(entry.key === key && entry.value === value)) append(this, entry.key, entry.value);
4571		}
4572	}, { enumerable: true, unsafe: true });
4573}
4574
4575
4576/***/ }),
4577
4578/***/ 7566:
4579/***/ ((__unused_webpack_module, __unused_webpack_exports, __webpack_require__) => {
4580
4581
4582var defineBuiltIn = __webpack_require__(6840);
4583var uncurryThis = __webpack_require__(9504);
4584var toString = __webpack_require__(655);
4585var validateArgumentsLength = __webpack_require__(2812);
4586
4587var $URLSearchParams = URLSearchParams;
4588var URLSearchParamsPrototype = $URLSearchParams.prototype;
4589var getAll = uncurryThis(URLSearchParamsPrototype.getAll);
4590var $has = uncurryThis(URLSearchParamsPrototype.has);
4591var params = new $URLSearchParams('a=1');
4592
4593// `undefined` case is a Chromium 117 bug
4594// https://bugs.chromium.org/p/v8/issues/detail?id=14222
4595if (params.has('a', 2) || !params.has('a', undefined)) {
4596	defineBuiltIn(URLSearchParamsPrototype, 'has', function has(name /* , value */) {
4597		var length = arguments.length;
4598		var $value = length < 2 ? undefined : arguments[1];
4599		if (length && $value === undefined) return $has(this, name);
4600		var values = getAll(this, name); // also validates `this`
4601		validateArgumentsLength(length, 1);
4602		var value = toString($value);
4603		var index = 0;
4604		while (index < values.length) {
4605			if (values[index++] === value) return true;
4606		} return false;
4607	}, { enumerable: true, unsafe: true });
4608}
4609
4610
4611/***/ }),
4612
4613/***/ 8721:
4614/***/ ((__unused_webpack_module, __unused_webpack_exports, __webpack_require__) => {
4615
4616
4617var DESCRIPTORS = __webpack_require__(3724);
4618var uncurryThis = __webpack_require__(9504);
4619var defineBuiltInAccessor = __webpack_require__(2106);
4620
4621var URLSearchParamsPrototype = URLSearchParams.prototype;
4622var forEach = uncurryThis(URLSearchParamsPrototype.forEach);
4623
4624// `URLSearchParams.prototype.size` getter
4625// https://github.com/whatwg/url/pull/734
4626if (DESCRIPTORS && !('size' in URLSearchParamsPrototype)) {
4627	defineBuiltInAccessor(URLSearchParamsPrototype, 'size', {
4628		get: function size() {
4629			var count = 0;
4630			forEach(this, function () { count++; });
4631			return count;
4632		},
4633		configurable: true,
4634		enumerable: true
4635	});
4636}
4637
4638
4639/***/ })
4640
4641/******/ });
4642/************************************************************************/
4643/******/ // The module cache
4644/******/ var __webpack_module_cache__ = {};
4645/******/ 
4646/******/ // The require function
4647/******/ function __webpack_require__(moduleId) {
4648/******/ 	// Check if module is in cache
4649/******/ 	var cachedModule = __webpack_module_cache__[moduleId];
4650/******/ 	if (cachedModule !== undefined) {
4651/******/ 		return cachedModule.exports;
4652/******/ 	}
4653/******/ 	// Create a new module (and put it into the cache)
4654/******/ 	var module = __webpack_module_cache__[moduleId] = {
4655/******/ 		// no module.id needed
4656/******/ 		// no module.loaded needed
4657/******/ 		exports: {}
4658/******/ 	};
4659/******/ 
4660/******/ 	// Execute the module function
4661/******/ 	__webpack_modules__[moduleId].call(module.exports, module, module.exports, __webpack_require__);
4662/******/ 
4663/******/ 	// Return the exports of the module
4664/******/ 	return module.exports;
4665/******/ }
4666/******/ 
4667/************************************************************************/
4668/******/ /* webpack/runtime/define property getters */
4669/******/ (() => {
4670/******/ 	// define getter functions for harmony exports
4671/******/ 	__webpack_require__.d = (exports, definition) => {
4672/******/ 		for(var key in definition) {
4673/******/ 			if(__webpack_require__.o(definition, key) && !__webpack_require__.o(exports, key)) {
4674/******/ 				Object.defineProperty(exports, key, { enumerable: true, get: definition[key] });
4675/******/ 			}
4676/******/ 		}
4677/******/ 	};
4678/******/ })();
4679/******/ 
4680/******/ /* webpack/runtime/hasOwnProperty shorthand */
4681/******/ (() => {
4682/******/ 	__webpack_require__.o = (obj, prop) => (Object.prototype.hasOwnProperty.call(obj, prop))
4683/******/ })();
4684/******/ 
4685/************************************************************************/
4686var __webpack_exports__ = globalThis.pdfjsWorker = {};
4687
4688// EXPORTS
4689__webpack_require__.d(__webpack_exports__, {
4690	WorkerMessageHandler: () => (/* reexport */ WorkerMessageHandler)
4691});
4692
4693// EXTERNAL MODULE: ./node_modules/core-js/modules/es.array.push.js
4694var es_array_push = __webpack_require__(4114);
4695// EXTERNAL MODULE: ./node_modules/core-js/modules/es.array-buffer.detached.js
4696var es_array_buffer_detached = __webpack_require__(6573);
4697// EXTERNAL MODULE: ./node_modules/core-js/modules/es.array-buffer.transfer.js
4698var es_array_buffer_transfer = __webpack_require__(8100);
4699// EXTERNAL MODULE: ./node_modules/core-js/modules/es.array-buffer.transfer-to-fixed-length.js
4700var es_array_buffer_transfer_to_fixed_length = __webpack_require__(7936);
4701// EXTERNAL MODULE: ./node_modules/core-js/modules/es.promise.with-resolvers.js
4702var es_promise_with_resolvers = __webpack_require__(4628);
4703// EXTERNAL MODULE: ./node_modules/core-js/modules/es.set.difference.v2.js
4704var es_set_difference_v2 = __webpack_require__(7642);
4705// EXTERNAL MODULE: ./node_modules/core-js/modules/es.set.intersection.v2.js
4706var es_set_intersection_v2 = __webpack_require__(8004);
4707// EXTERNAL MODULE: ./node_modules/core-js/modules/es.set.is-disjoint-from.v2.js
4708var es_set_is_disjoint_from_v2 = __webpack_require__(3853);
4709// EXTERNAL MODULE: ./node_modules/core-js/modules/es.set.is-subset-of.v2.js
4710var es_set_is_subset_of_v2 = __webpack_require__(5876);
4711// EXTERNAL MODULE: ./node_modules/core-js/modules/es.set.is-superset-of.v2.js
4712var es_set_is_superset_of_v2 = __webpack_require__(2475);
4713// EXTERNAL MODULE: ./node_modules/core-js/modules/es.set.symmetric-difference.v2.js
4714var es_set_symmetric_difference_v2 = __webpack_require__(5024);
4715// EXTERNAL MODULE: ./node_modules/core-js/modules/es.set.union.v2.js
4716var es_set_union_v2 = __webpack_require__(1698);
4717// EXTERNAL MODULE: ./node_modules/core-js/modules/es.typed-array.to-reversed.js
4718var es_typed_array_to_reversed = __webpack_require__(7467);
4719// EXTERNAL MODULE: ./node_modules/core-js/modules/es.typed-array.to-sorted.js
4720var es_typed_array_to_sorted = __webpack_require__(4732);
4721// EXTERNAL MODULE: ./node_modules/core-js/modules/es.typed-array.with.js
4722var es_typed_array_with = __webpack_require__(9577);
4723// EXTERNAL MODULE: ./node_modules/core-js/modules/esnext.iterator.constructor.js
4724var esnext_iterator_constructor = __webpack_require__(8992);
4725// EXTERNAL MODULE: ./node_modules/core-js/modules/esnext.iterator.map.js
4726var esnext_iterator_map = __webpack_require__(1454);
4727// EXTERNAL MODULE: ./node_modules/core-js/modules/esnext.iterator.some.js
4728var esnext_iterator_some = __webpack_require__(7550);
4729// EXTERNAL MODULE: ./node_modules/core-js/modules/web.self.js
4730var web_self = __webpack_require__(3611);
4731// EXTERNAL MODULE: ./node_modules/core-js/modules/esnext.promise.try.js
4732var esnext_promise_try = __webpack_require__(5247);
4733// EXTERNAL MODULE: ./node_modules/core-js/modules/web.dom-exception.stack.js
4734var web_dom_exception_stack = __webpack_require__(4979);
4735// EXTERNAL MODULE: ./node_modules/core-js/modules/web.url-search-params.delete.js
4736var web_url_search_params_delete = __webpack_require__(4603);
4737// EXTERNAL MODULE: ./node_modules/core-js/modules/web.url-search-params.has.js
4738var web_url_search_params_has = __webpack_require__(7566);
4739// EXTERNAL MODULE: ./node_modules/core-js/modules/web.url-search-params.size.js
4740var web_url_search_params_size = __webpack_require__(8721);
4741;// ./src/shared/util.js
4742
4743
4744
4745
4746
4747
4748
4749
4750
4751
4752
4753
4754const isNodeJS = typeof process === "object" && process + "" === "[object process]" && !process.versions.nw && !(process.versions.electron && process.type && process.type !== "browser");
4755const IDENTITY_MATRIX = [1, 0, 0, 1, 0, 0];
4756const FONT_IDENTITY_MATRIX = [0.001, 0, 0, 0.001, 0, 0];
4757const MAX_IMAGE_SIZE_TO_CACHE = 10e6;
4758const LINE_FACTOR = 1.35;
4759const LINE_DESCENT_FACTOR = 0.35;
4760const BASELINE_FACTOR = LINE_DESCENT_FACTOR / LINE_FACTOR;
4761const RenderingIntentFlag = {
4762	ANY: 0x01,
4763	DISPLAY: 0x02,
4764	PRINT: 0x04,
4765	SAVE: 0x08,
4766	ANNOTATIONS_FORMS: 0x10,
4767	ANNOTATIONS_STORAGE: 0x20,
4768	ANNOTATIONS_DISABLE: 0x40,
4769	IS_EDITING: 0x80,
4770	OPLIST: 0x100
4771};
4772const AnnotationMode = {
4773	DISABLE: 0,
4774	ENABLE: 1,
4775	ENABLE_FORMS: 2,
4776	ENABLE_STORAGE: 3
4777};
4778const AnnotationEditorPrefix = "pdfjs_internal_editor_";
4779const AnnotationEditorType = {
4780	DISABLE: -1,
4781	NONE: 0,
4782	FREETEXT: 3,
4783	HIGHLIGHT: 9,
4784	STAMP: 13,
4785	INK: 15
4786};
4787const AnnotationEditorParamsType = {
4788	RESIZE: 1,
4789	CREATE: 2,
vendor: 5,098 bytes, lines 4790-5066
4790	FREETEXT_SIZE: 11,
4791	FREETEXT_COLOR: 12,
4792	FREETEXT_OPACITY: 13,
4793	INK_COLOR: 21,
4794	INK_THICKNESS: 22,
4795	INK_OPACITY: 23,
4796	HIGHLIGHT_COLOR: 31,
4797	HIGHLIGHT_DEFAULT_COLOR: 32,
4798	HIGHLIGHT_THICKNESS: 33,
4799	HIGHLIGHT_FREE: 34,
4800	HIGHLIGHT_SHOW_ALL: 35,
4801	DRAW_STEP: 41
4802};
4803const PermissionFlag = {
4804	PRINT: 0x04,
4805	MODIFY_CONTENTS: 0x08,
4806	COPY: 0x10,
4807	MODIFY_ANNOTATIONS: 0x20,
4808	FILL_INTERACTIVE_FORMS: 0x100,
4809	COPY_FOR_ACCESSIBILITY: 0x200,
4810	ASSEMBLE: 0x400,
4811	PRINT_HIGH_QUALITY: 0x800
4812};
4813const TextRenderingMode = {
4814	FILL: 0,
4815	STROKE: 1,
4816	FILL_STROKE: 2,
4817	INVISIBLE: 3,
4818	FILL_ADD_TO_PATH: 4,
4819	STROKE_ADD_TO_PATH: 5,
4820	FILL_STROKE_ADD_TO_PATH: 6,
4821	ADD_TO_PATH: 7,
4822	FILL_STROKE_MASK: 3,
4823	ADD_TO_PATH_FLAG: 4
4824};
4825const ImageKind = {
4826	GRAYSCALE_1BPP: 1,
4827	RGB_24BPP: 2,
4828	RGBA_32BPP: 3
4829};
4830const AnnotationType = {
4831	TEXT: 1,
4832	LINK: 2,
4833	FREETEXT: 3,
4834	LINE: 4,
4835	SQUARE: 5,
4836	CIRCLE: 6,
4837	POLYGON: 7,
4838	POLYLINE: 8,
4839	HIGHLIGHT: 9,
4840	UNDERLINE: 10,
4841	SQUIGGLY: 11,
4842	STRIKEOUT: 12,
4843	STAMP: 13,
4844	CARET: 14,
4845	INK: 15,
4846	POPUP: 16,
4847	FILEATTACHMENT: 17,
4848	SOUND: 18,
4849	MOVIE: 19,
4850	WIDGET: 20,
4851	SCREEN: 21,
4852	PRINTERMARK: 22,
4853	TRAPNET: 23,
4854	WATERMARK: 24,
4855	THREED: 25,
4856	REDACT: 26
4857};
4858const AnnotationReplyType = {
4859	GROUP: "Group",
4860	REPLY: "R"
4861};
4862const AnnotationFlag = {
4863	INVISIBLE: 0x01,
4864	HIDDEN: 0x02,
4865	PRINT: 0x04,
4866	NOZOOM: 0x08,
4867	NOROTATE: 0x10,
4868	NOVIEW: 0x20,
4869	READONLY: 0x40,
4870	LOCKED: 0x80,
4871	TOGGLENOVIEW: 0x100,
4872	LOCKEDCONTENTS: 0x200
4873};
4874const AnnotationFieldFlag = {
4875	READONLY: 0x0000001,
4876	REQUIRED: 0x0000002,
4877	NOEXPORT: 0x0000004,
4878	MULTILINE: 0x0001000,
4879	PASSWORD: 0x0002000,
4880	NOTOGGLETOOFF: 0x0004000,
4881	RADIO: 0x0008000,
4882	PUSHBUTTON: 0x0010000,
4883	COMBO: 0x0020000,
4884	EDIT: 0x0040000,
4885	SORT: 0x0080000,
4886	FILESELECT: 0x0100000,
4887	MULTISELECT: 0x0200000,
4888	DONOTSPELLCHECK: 0x0400000,
4889	DONOTSCROLL: 0x0800000,
4890	COMB: 0x1000000,
4891	RICHTEXT: 0x2000000,
4892	RADIOSINUNISON: 0x2000000,
4893	COMMITONSELCHANGE: 0x4000000
4894};
4895const AnnotationBorderStyleType = {
4896	SOLID: 1,
4897	DASHED: 2,
4898	BEVELED: 3,
4899	INSET: 4,
4900	UNDERLINE: 5
4901};
4902const AnnotationActionEventType = {
4903	E: "Mouse Enter",
4904	X: "Mouse Exit",
4905	D: "Mouse Down",
4906	U: "Mouse Up",
4907	Fo: "Focus",
4908	Bl: "Blur",
4909	PO: "PageOpen",
4910	PC: "PageClose",
4911	PV: "PageVisible",
4912	PI: "PageInvisible",
4913	K: "Keystroke",
4914	F: "Format",
4915	V: "Validate",
4916	C: "Calculate"
4917};
4918const DocumentActionEventType = {
4919	WC: "WillClose",
4920	WS: "WillSave",
4921	DS: "DidSave",
4922	WP: "WillPrint",
4923	DP: "DidPrint"
4924};
4925const PageActionEventType = {
4926	O: "PageOpen",
4927	C: "PageClose"
4928};
4929const VerbosityLevel = {
4930	ERRORS: 0,
4931	WARNINGS: 1,
4932	INFOS: 5
4933};
4934const OPS = {
4935	dependency: 1,
4936	setLineWidth: 2,
4937	setLineCap: 3,
4938	setLineJoin: 4,
4939	setMiterLimit: 5,
4940	setDash: 6,
4941	setRenderingIntent: 7,
4942	setFlatness: 8,
4943	setGState: 9,
4944	save: 10,
4945	restore: 11,
4946	transform: 12,
4947	moveTo: 13,
4948	lineTo: 14,
4949	curveTo: 15,
4950	curveTo2: 16,
4951	curveTo3: 17,
4952	closePath: 18,
4953	rectangle: 19,
4954	stroke: 20,
4955	closeStroke: 21,
4956	fill: 22,
4957	eoFill: 23,
4958	fillStroke: 24,
4959	eoFillStroke: 25,
4960	closeFillStroke: 26,
4961	closeEOFillStroke: 27,
4962	endPath: 28,
4963	clip: 29,
4964	eoClip: 30,
4965	beginText: 31,
4966	endText: 32,
4967	setCharSpacing: 33,
4968	setWordSpacing: 34,
4969	setHScale: 35,
4970	setLeading: 36,
4971	setFont: 37,
4972	setTextRenderingMode: 38,
4973	setTextRise: 39,
4974	moveText: 40,
4975	setLeadingMoveText: 41,
4976	setTextMatrix: 42,
4977	nextLine: 43,
4978	showText: 44,
4979	showSpacedText: 45,
4980	nextLineShowText: 46,
4981	nextLineSetSpacingShowText: 47,
4982	setCharWidth: 48,
4983	setCharWidthAndBounds: 49,
4984	setStrokeColorSpace: 50,
4985	setFillColorSpace: 51,
4986	setStrokeColor: 52,
4987	setStrokeColorN: 53,
4988	setFillColor: 54,
4989	setFillColorN: 55,
4990	setStrokeGray: 56,
4991	setFillGray: 57,
4992	setStrokeRGBColor: 58,
4993	setFillRGBColor: 59,
4994	setStrokeCMYKColor: 60,
4995	setFillCMYKColor: 61,
4996	shadingFill: 62,
4997	beginInlineImage: 63,
4998	beginImageData: 64,
4999	endInlineImage: 65,
5000	paintXObject: 66,
5001	markPoint: 67,
5002	markPointProps: 68,
5003	beginMarkedContent: 69,
5004	beginMarkedContentProps: 70,
5005	endMarkedContent: 71,
5006	beginCompat: 72,
5007	endCompat: 73,
5008	paintFormXObjectBegin: 74,
5009	paintFormXObjectEnd: 75,
5010	beginGroup: 76,
5011	endGroup: 77,
5012	beginAnnotation: 80,
5013	endAnnotation: 81,
5014	paintImageMaskXObject: 83,
5015	paintImageMaskXObjectGroup: 84,
5016	paintImageXObject: 85,
5017	paintInlineImageXObject: 86,
5018	paintInlineImageXObjectGroup: 87,
5019	paintImageXObjectRepeat: 88,
5020	paintImageMaskXObjectRepeat: 89,
5021	paintSolidColorImageMask: 90,
5022	constructPath: 91,
5023	setStrokeTransparent: 92,
5024	setFillTransparent: 93
5025};
5026const PasswordResponses = {
5027	NEED_PASSWORD: 1,
5028	INCORRECT_PASSWORD: 2
5029};
5030let verbosity = VerbosityLevel.WARNINGS;
5031function setVerbosityLevel(level) {
5032	if (Number.isInteger(level)) {
5033		verbosity = level;
5034	}
5035}
5036function getVerbosityLevel() {
5037	return verbosity;
5038}
5039function info(msg) {
5040	if (verbosity >= VerbosityLevel.INFOS) {
5041		console.log(`Info: ${msg}`);
5042	}
5043}
5044function warn(msg) {
5045	if (verbosity >= VerbosityLevel.WARNINGS) {
5046		console.log(`Warning: ${msg}`);
5047	}
5048}
5049function unreachable(msg) {
5050	throw new Error(msg);
5051}
5052function assert(cond, msg) {
5053	if (!cond) {
5054		unreachable(msg);
5055	}
5056}
5057function _isValidProtocol(url) {
5058	switch (url?.protocol) {
5059		case "http:":
5060		case "https:":
5061		case "ftp:":
5062		case "mailto:":
5063		case "tel:":
5064			return true;
5065		default:
5066			return false;
5067	}
5068}
5069function createValidAbsoluteUrl(url, baseUrl = null, options = null) {
5070	if (!url) {
5071		return null;
5072	}
5073	try {
5074		if (options && typeof url === "string") {
5075			if (options.addDefaultProtocol && url.startsWith("www.")) {
5076				const dots = url.match(/\./g);
5077				if (dots?.length >= 2) {
5078					url = `http://${url}`;
5079				}
5080			}
5081			if (options.tryConvertEncoding) {
5082				try {
5083					url = stringToUTF8String(url);
5084				} catch {}
5085			}
5086		}
5087		const absoluteUrl = baseUrl ? new URL(url, baseUrl) : new URL(url);
5088		if (_isValidProtocol(absoluteUrl)) {
5089			return absoluteUrl;
5090		}
5091	} catch {}
5092	return null;
5093}
5094function shadow(obj, prop, value, nonSerializable = false) {
5095	Object.defineProperty(obj, prop, {
5096		value,
5097		enumerable: !nonSerializable,
5098		configurable: true,
5099		writable: false
5100	});
5101	return value;
5102}
5103const BaseException = function BaseExceptionClosure() {
5104	function BaseException(message, name) {
5105		this.message = message;
5106		this.name = name;
5107	}
5108	BaseException.prototype = new Error();
5109	BaseException.constructor = BaseException;
5110	return BaseException;
5111}();
5112class PasswordException extends BaseException {
5113	constructor(msg, code) {
5114		super(msg, "PasswordException");
5115		this.code = code;
5116	}
5117}
5118class UnknownErrorException extends BaseException {
5119	constructor(msg, details) {
5120		super(msg, "UnknownErrorException");
5121		this.details = details;
5122	}
5123}
5124class InvalidPDFException extends BaseException {
5125	constructor(msg) {
5126		super(msg, "InvalidPDFException");
5127	}
5128}
5129class MissingPDFException extends BaseException {
5130	constructor(msg) {
5131		super(msg, "MissingPDFException");
5132	}
5133}
5134class UnexpectedResponseException extends BaseException {
5135	constructor(msg, status) {
5136		super(msg, "UnexpectedResponseException");
5137		this.status = status;
5138	}
5139}
5140class FormatError extends BaseException {
5141	constructor(msg) {
5142		super(msg, "FormatError");
5143	}
5144}
5145class AbortException extends BaseException {
5146	constructor(msg) {
5147		super(msg, "AbortException");
5148	}
5149}
5150function bytesToString(bytes) {
5151	if (typeof bytes !== "object" || bytes?.length === undefined) {
5152		unreachable("Invalid argument for bytesToString");
5153	}
5154	const length = bytes.length;
5155	const MAX_ARGUMENT_COUNT = 8192;
5156	if (length < MAX_ARGUMENT_COUNT) {
5157		return String.fromCharCode.apply(null, bytes);
5158	}
5159	const strBuf = [];
5160	for (let i = 0; i < length; i += MAX_ARGUMENT_COUNT) {
5161		const chunkEnd = Math.min(i + MAX_ARGUMENT_COUNT, length);
5162		const chunk = bytes.subarray(i, chunkEnd);
5163		strBuf.push(String.fromCharCode.apply(null, chunk));
5164	}
5165	return strBuf.join("");
5166}
5167function stringToBytes(str) {
5168	if (typeof str !== "string") {
5169		unreachable("Invalid argument for stringToBytes");
5170	}
5171	const length = str.length;
5172	const bytes = new Uint8Array(length);
5173	for (let i = 0; i < length; ++i) {
5174		bytes[i] = str.charCodeAt(i) & 0xff;
5175	}
5176	return bytes;
5177}
5178function string32(value) {
5179	return String.fromCharCode(value >> 24 & 0xff, value >> 16 & 0xff, value >> 8 & 0xff, value & 0xff);
5180}
5181function objectSize(obj) {
5182	return Object.keys(obj).length;
5183}
5184function objectFromMap(map) {
5185	const obj = Object.create(null);
5186	for (const [key, value] of map) {
5187		obj[key] = value;
5188	}
5189	return obj;
5190}
5191function isLittleEndian() {
5192	const buffer8 = new Uint8Array(4);
5193	buffer8[0] = 1;
5194	const view32 = new Uint32Array(buffer8.buffer, 0, 1);
5195	return view32[0] === 1;
5196}
5197function isEvalSupported() {
5198	try {
5199		new Function("");
5200		return true;
5201	} catch {
5202		return false;
5203	}
5204}
5205class FeatureTest {
5206	static get isLittleEndian() {
5207		return shadow(this, "isLittleEndian", isLittleEndian());
5208	}
5209	static get isEvalSupported() {
5210		return shadow(this, "isEvalSupported", isEvalSupported());
5211	}
5212	static get isOffscreenCanvasSupported() {
5213		return shadow(this, "isOffscreenCanvasSupported", typeof OffscreenCanvas !== "undefined");
5214	}
5215	static get isImageDecoderSupported() {
5216		return shadow(this, "isImageDecoderSupported", typeof ImageDecoder !== "undefined");
5217	}
5218	static get platform() {
5219		if (typeof navigator !== "undefined" && typeof navigator?.platform === "string") {
5220			return shadow(this, "platform", {
5221				isMac: navigator.platform.includes("Mac"),
5222				isWindows: navigator.platform.includes("Win"),
5223				isFirefox: typeof navigator?.userAgent === "string" && navigator.userAgent.includes("Firefox")
5224			});
5225		}
5226		return shadow(this, "platform", {
5227			isMac: false,
5228			isWindows: false,
5229			isFirefox: false
5230		});
5231	}
5232	static get isCSSRoundSupported() {
5233		return shadow(this, "isCSSRoundSupported", globalThis.CSS?.supports?.("width: round(1.5px, 1px)"));
5234	}
5235}
5236const hexNumbers = Array.from(Array(256).keys(), n => n.toString(16).padStart(2, "0"));
5237class Util {
5238	static makeHexColor(r, g, b) {
5239		return `#${hexNumbers[r]}${hexNumbers[g]}${hexNumbers[b]}`;
5240	}
5241	static scaleMinMax(transform, minMax) {
5242		let temp;
5243		if (transform[0]) {
5244			if (transform[0] < 0) {
5245				temp = minMax[0];
5246				minMax[0] = minMax[2];
5247				minMax[2] = temp;
5248			}
5249			minMax[0] *= transform[0];
5250			minMax[2] *= transform[0];
5251			if (transform[3] < 0) {
5252				temp = minMax[1];
5253				minMax[1] = minMax[3];
5254				minMax[3] = temp;
5255			}
5256			minMax[1] *= transform[3];
5257			minMax[3] *= transform[3];
5258		} else {
5259			temp = minMax[0];
5260			minMax[0] = minMax[1];
5261			minMax[1] = temp;
5262			temp = minMax[2];
5263			minMax[2] = minMax[3];
5264			minMax[3] = temp;
5265			if (transform[1] < 0) {
5266				temp = minMax[1];
5267				minMax[1] = minMax[3];
5268				minMax[3] = temp;
5269			}
5270			minMax[1] *= transform[1];
5271			minMax[3] *= transform[1];
5272			if (transform[2] < 0) {
5273				temp = minMax[0];
5274				minMax[0] = minMax[2];
5275				minMax[2] = temp;
5276			}
5277			minMax[0] *= transform[2];
5278			minMax[2] *= transform[2];
5279		}
5280		minMax[0] += transform[4];
5281		minMax[1] += transform[5];
5282		minMax[2] += transform[4];
5283		minMax[3] += transform[5];
5284	}
5285	static transform(m1, m2) {
5286		return [m1[0] * m2[0] + m1[2] * m2[1], m1[1] * m2[0] + m1[3] * m2[1], m1[0] * m2[2] + m1[2] * m2[3], m1[1] * m2[2] + m1[3] * m2[3], m1[0] * m2[4] + m1[2] * m2[5] + m1[4], m1[1] * m2[4] + m1[3] * m2[5] + m1[5]];
5287	}
5288	static applyTransform(p, m) {
5289		const xt = p[0] * m[0] + p[1] * m[2] + m[4];
5290		const yt = p[0] * m[1] + p[1] * m[3] + m[5];
5291		return [xt, yt];
5292	}
5293	static applyInverseTransform(p, m) {
5294		const d = m[0] * m[3] - m[1] * m[2];
5295		const xt = (p[0] * m[3] - p[1] * m[2] + m[2] * m[5] - m[4] * m[3]) / d;
5296		const yt = (-p[0] * m[1] + p[1] * m[0] + m[4] * m[1] - m[5] * m[0]) / d;
5297		return [xt, yt];
5298	}
5299	static getAxialAlignedBoundingBox(r, m) {
5300		const p1 = this.applyTransform(r, m);
5301		const p2 = this.applyTransform(r.slice(2, 4), m);
5302		const p3 = this.applyTransform([r[0], r[3]], m);
5303		const p4 = this.applyTransform([r[2], r[1]], m);
5304		return [Math.min(p1[0], p2[0], p3[0], p4[0]), Math.min(p1[1], p2[1], p3[1], p4[1]), Math.max(p1[0], p2[0], p3[0], p4[0]), Math.max(p1[1], p2[1], p3[1], p4[1])];
5305	}
5306	static inverseTransform(m) {
5307		const d = m[0] * m[3] - m[1] * m[2];
5308		return [m[3] / d, -m[1] / d, -m[2] / d, m[0] / d, (m[2] * m[5] - m[4] * m[3]) / d, (m[4] * m[1] - m[5] * m[0]) / d];
5309	}
5310	static singularValueDecompose2dScale(m) {
5311		const transpose = [m[0], m[2], m[1], m[3]];
5312		const a = m[0] * transpose[0] + m[1] * transpose[2];
5313		const b = m[0] * transpose[1] + m[1] * transpose[3];
5314		const c = m[2] * transpose[0] + m[3] * transpose[2];
5315		const d = m[2] * transpose[1] + m[3] * transpose[3];
5316		const first = (a + d) / 2;
5317		const second = Math.sqrt((a + d) ** 2 - 4 * (a * d - c * b)) / 2;
5318		const sx = first + second || 1;
5319		const sy = first - second || 1;
5320		return [Math.sqrt(sx), Math.sqrt(sy)];
5321	}
5322	static normalizeRect(rect) {
5323		const r = rect.slice(0);
5324		if (rect[0] > rect[2]) {
5325			r[0] = rect[2];
5326			r[2] = rect[0];
5327		}
5328		if (rect[1] > rect[3]) {
5329			r[1] = rect[3];
5330			r[3] = rect[1];
5331		}
5332		return r;
5333	}
5334	static intersect(rect1, rect2) {
5335		const xLow = Math.max(Math.min(rect1[0], rect1[2]), Math.min(rect2[0], rect2[2]));
5336		const xHigh = Math.min(Math.max(rect1[0], rect1[2]), Math.max(rect2[0], rect2[2]));
5337		if (xLow > xHigh) {
5338			return null;
5339		}
5340		const yLow = Math.max(Math.min(rect1[1], rect1[3]), Math.min(rect2[1], rect2[3]));
5341		const yHigh = Math.min(Math.max(rect1[1], rect1[3]), Math.max(rect2[1], rect2[3]));
5342		if (yLow > yHigh) {
5343			return null;
5344		}
5345		return [xLow, yLow, xHigh, yHigh];
5346	}
5347	static #getExtremumOnCurve(x0, x1, x2, x3, y0, y1, y2, y3, t, minMax) {
5348		if (t <= 0 || t >= 1) {
5349			return;
5350		}
5351		const mt = 1 - t;
5352		const tt = t * t;
5353		const ttt = tt * t;
5354		const x = mt * (mt * (mt * x0 + 3 * t * x1) + 3 * tt * x2) + ttt * x3;
5355		const y = mt * (mt * (mt * y0 + 3 * t * y1) + 3 * tt * y2) + ttt * y3;
5356		minMax[0] = Math.min(minMax[0], x);
5357		minMax[1] = Math.min(minMax[1], y);
5358		minMax[2] = Math.max(minMax[2], x);
5359		minMax[3] = Math.max(minMax[3], y);
5360	}
5361	static #getExtremum(x0, x1, x2, x3, y0, y1, y2, y3, a, b, c, minMax) {
5362		if (Math.abs(a) < 1e-12) {
5363			if (Math.abs(b) >= 1e-12) {
5364				this.#getExtremumOnCurve(x0, x1, x2, x3, y0, y1, y2, y3, -c / b, minMax);
5365			}
5366			return;
5367		}
5368		const delta = b ** 2 - 4 * c * a;
5369		if (delta < 0) {
5370			return;
5371		}
5372		const sqrtDelta = Math.sqrt(delta);
5373		const a2 = 2 * a;
5374		this.#getExtremumOnCurve(x0, x1, x2, x3, y0, y1, y2, y3, (-b + sqrtDelta) / a2, minMax);
5375		this.#getExtremumOnCurve(x0, x1, x2, x3, y0, y1, y2, y3, (-b - sqrtDelta) / a2, minMax);
5376	}
5377	static bezierBoundingBox(x0, y0, x1, y1, x2, y2, x3, y3, minMax) {
5378		if (minMax) {
5379			minMax[0] = Math.min(minMax[0], x0, x3);
5380			minMax[1] = Math.min(minMax[1], y0, y3);
5381			minMax[2] = Math.max(minMax[2], x0, x3);
5382			minMax[3] = Math.max(minMax[3], y0, y3);
5383		} else {
5384			minMax = [Math.min(x0, x3), Math.min(y0, y3), Math.max(x0, x3), Math.max(y0, y3)];
5385		}
5386		this.#getExtremum(x0, x1, x2, x3, y0, y1, y2, y3, 3 * (-x0 + 3 * (x1 - x2) + x3), 6 * (x0 - 2 * x1 + x2), 3 * (x1 - x0), minMax);
5387		this.#getExtremum(x0, x1, x2, x3, y0, y1, y2, y3, 3 * (-y0 + 3 * (y1 - y2) + y3), 6 * (y0 - 2 * y1 + y2), 3 * (y1 - y0), minMax);
5388		return minMax;
5389	}
5390}
5391const PDFStringTranslateTable = [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0x2d8, 0x2c7, 0x2c6, 0x2d9, 0x2dd, 0x2db, 0x2da, 0x2dc, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0x2022, 0x2020, 0x2021, 0x2026, 0x2014, 0x2013, 0x192, 0x2044, 0x2039, 0x203a, 0x2212, 0x2030, 0x201e, 0x201c, 0x201d, 0x2018, 0x2019, 0x201a, 0x2122, 0xfb01, 0xfb02, 0x141, 0x152, 0x160, 0x178, 0x17d, 0x131, 0x142, 0x153, 0x161, 0x17e, 0, 0x20ac];
5392function stringToPDFString(str) {
5393	if (str[0] >= "\xEF") {
5394		let encoding;
5395		if (str[0] === "\xFE" && str[1] === "\xFF") {
5396			encoding = "utf-16be";
5397			if (str.length % 2 === 1) {
5398				str = str.slice(0, -1);
5399			}
5400		} else if (str[0] === "\xFF" && str[1] === "\xFE") {
5401			encoding = "utf-16le";
5402			if (str.length % 2 === 1) {
5403				str = str.slice(0, -1);
5404			}
5405		} else if (str[0] === "\xEF" && str[1] === "\xBB" && str[2] === "\xBF") {
5406			encoding = "utf-8";
5407		}
5408		if (encoding) {
5409			try {
5410				const decoder = new TextDecoder(encoding, {
5411					fatal: true
5412				});
5413				const buffer = stringToBytes(str);
5414				const decoded = decoder.decode(buffer);
5415				if (!decoded.includes("\x1b")) {
5416					return decoded;
5417				}
5418				return decoded.replaceAll(/\x1b[^\x1b]*(?:\x1b|$)/g, "");
5419			} catch (ex) {
5420				warn(`stringToPDFString: "${ex}".`);
5421			}
5422		}
5423	}
5424	const strBuf = [];
5425	for (let i = 0, ii = str.length; i < ii; i++) {
vendor: 43,008 bytes, lines 5426-7082
5426		const charCode = str.charCodeAt(i);
5427		if (charCode === 0x1b) {
5428			while (++i < ii && str.charCodeAt(i) !== 0x1b) {}
5429			continue;
5430		}
5431		const code = PDFStringTranslateTable[charCode];
5432		strBuf.push(code ? String.fromCharCode(code) : str.charAt(i));
5433	}
5434	return strBuf.join("");
5435}
5436function stringToUTF8String(str) {
5437	return decodeURIComponent(escape(str));
5438}
5439function utf8StringToString(str) {
5440	return unescape(encodeURIComponent(str));
5441}
5442function isArrayEqual(arr1, arr2) {
5443	if (arr1.length !== arr2.length) {
5444		return false;
5445	}
5446	for (let i = 0, ii = arr1.length; i < ii; i++) {
5447		if (arr1[i] !== arr2[i]) {
5448			return false;
5449		}
5450	}
5451	return true;
5452}
5453function getModificationDate(date = new Date()) {
5454	const buffer = [date.getUTCFullYear().toString(), (date.getUTCMonth() + 1).toString().padStart(2, "0"), date.getUTCDate().toString().padStart(2, "0"), date.getUTCHours().toString().padStart(2, "0"), date.getUTCMinutes().toString().padStart(2, "0"), date.getUTCSeconds().toString().padStart(2, "0")];
5455	return buffer.join("");
5456}
5457let NormalizeRegex = null;
5458let NormalizationMap = null;
5459function normalizeUnicode(str) {
5460	if (!NormalizeRegex) {
5461		NormalizeRegex = /([\u00a0\u00b5\u037e\u0eb3\u2000-\u200a\u202f\u2126\ufb00-\ufb04\ufb06\ufb20-\ufb36\ufb38-\ufb3c\ufb3e\ufb40-\ufb41\ufb43-\ufb44\ufb46-\ufba1\ufba4-\ufba9\ufbae-\ufbb1\ufbd3-\ufbdc\ufbde-\ufbe7\ufbea-\ufbf8\ufbfc-\ufbfd\ufc00-\ufc5d\ufc64-\ufcf1\ufcf5-\ufd3d\ufd88\ufdf4\ufdfa-\ufdfb\ufe71\ufe77\ufe79\ufe7b\ufe7d]+)|(\ufb05+)/gu;
5462		NormalizationMap = new Map([["ſt", "ſt"]]);
5463	}
5464	return str.replaceAll(NormalizeRegex, (_, p1, p2) => p1 ? p1.normalize("NFKC") : NormalizationMap.get(p2));
5465}
5466function getUuid() {
5467	if (typeof crypto.randomUUID === "function") {
5468		return crypto.randomUUID();
5469	}
5470	const buf = new Uint8Array(32);
5471	crypto.getRandomValues(buf);
5472	return bytesToString(buf);
5473}
5474const AnnotationPrefix = "pdfjs_internal_id_";
5475function toHexUtil(arr) {
5476	if (Uint8Array.prototype.toHex) {
5477		return arr.toHex();
5478	}
5479	return Array.from(arr, num => hexNumbers[num]).join("");
5480}
5481function toBase64Util(arr) {
5482	if (Uint8Array.prototype.toBase64) {
5483		return arr.toBase64();
5484	}
5485	return btoa(bytesToString(arr));
5486}
5487function fromBase64Util(str) {
5488	if (Uint8Array.fromBase64) {
5489		return Uint8Array.fromBase64(str);
5490	}
5491	return stringToBytes(atob(str));
5492}
5493
5494// EXTERNAL MODULE: ./node_modules/core-js/modules/esnext.iterator.every.js
5495var esnext_iterator_every = __webpack_require__(3215);
5496;// ./src/core/primitives.js
5497
5498
5499
5500
5501
5502
5503
5504
5505
5506const CIRCULAR_REF = Symbol("CIRCULAR_REF");
5507const EOF = Symbol("EOF");
5508let CmdCache = Object.create(null);
5509let NameCache = Object.create(null);
5510let RefCache = Object.create(null);
5511function clearPrimitiveCaches() {
5512	CmdCache = Object.create(null);
5513	NameCache = Object.create(null);
5514	RefCache = Object.create(null);
5515}
5516class Name {
5517	constructor(name) {
5518		this.name = name;
5519	}
5520	static get(name) {
5521		return NameCache[name] ||= new Name(name);
5522	}
5523}
5524class Cmd {
5525	constructor(cmd) {
5526		this.cmd = cmd;
5527	}
5528	static get(cmd) {
5529		return CmdCache[cmd] ||= new Cmd(cmd);
5530	}
5531}
5532const nonSerializable = function nonSerializableClosure() {
5533	return nonSerializable;
5534};
5535class Dict {
5536	constructor(xref = null) {
5537		this._map = new Map();
5538		this.xref = xref;
5539		this.objId = null;
5540		this.suppressEncryption = false;
5541		this.__nonSerializable__ = nonSerializable;
5542	}
5543	assignXref(newXref) {
5544		this.xref = newXref;
5545	}
5546	get size() {
5547		return this._map.size;
5548	}
5549	get(key1, key2, key3) {
5550		let value = this._map.get(key1);
5551		if (value === undefined && key2 !== undefined) {
5552			value = this._map.get(key2);
5553			if (value === undefined && key3 !== undefined) {
5554				value = this._map.get(key3);
5555			}
5556		}
5557		if (value instanceof Ref && this.xref) {
5558			return this.xref.fetch(value, this.suppressEncryption);
5559		}
5560		return value;
5561	}
5562	async getAsync(key1, key2, key3) {
5563		let value = this._map.get(key1);
5564		if (value === undefined && key2 !== undefined) {
5565			value = this._map.get(key2);
5566			if (value === undefined && key3 !== undefined) {
5567				value = this._map.get(key3);
5568			}
5569		}
5570		if (value instanceof Ref && this.xref) {
5571			return this.xref.fetchAsync(value, this.suppressEncryption);
5572		}
5573		return value;
5574	}
5575	getArray(key1, key2, key3) {
5576		let value = this._map.get(key1);
5577		if (value === undefined && key2 !== undefined) {
5578			value = this._map.get(key2);
5579			if (value === undefined && key3 !== undefined) {
5580				value = this._map.get(key3);
5581			}
5582		}
5583		if (value instanceof Ref && this.xref) {
5584			value = this.xref.fetch(value, this.suppressEncryption);
5585		}
5586		if (Array.isArray(value)) {
5587			value = value.slice();
5588			for (let i = 0, ii = value.length; i < ii; i++) {
5589				if (value[i] instanceof Ref && this.xref) {
5590					value[i] = this.xref.fetch(value[i], this.suppressEncryption);
5591				}
5592			}
5593		}
5594		return value;
5595	}
5596	getRaw(key) {
5597		return this._map.get(key);
5598	}
5599	getKeys() {
5600		return [...this._map.keys()];
5601	}
5602	getRawValues() {
5603		return [...this._map.values()];
5604	}
5605	set(key, value) {
5606		this._map.set(key, value);
5607	}
5608	has(key) {
5609		return this._map.has(key);
5610	}
5611	*[Symbol.iterator]() {
5612		for (const [key, value] of this._map) {
5613			yield [key, value instanceof Ref && this.xref ? this.xref.fetch(value, this.suppressEncryption) : value];
5614		}
5615	}
5616	static get empty() {
5617		const emptyDict = new Dict(null);
5618		emptyDict.set = (key, value) => {
5619			unreachable("Should not call `set` on the empty dictionary.");
5620		};
5621		return shadow(this, "empty", emptyDict);
5622	}
5623	static merge({
5624		xref,
5625		dictArray,
5626		mergeSubDicts = false
5627	}) {
5628		const mergedDict = new Dict(xref),
5629			properties = new Map();
5630		for (const dict of dictArray) {
5631			if (!(dict instanceof Dict)) {
5632				continue;
5633			}
5634			for (const [key, value] of dict._map) {
5635				let property = properties.get(key);
5636				if (property === undefined) {
5637					property = [];
5638					properties.set(key, property);
5639				} else if (!mergeSubDicts || !(value instanceof Dict)) {
5640					continue;
5641				}
5642				property.push(value);
5643			}
5644		}
5645		for (const [name, values] of properties) {
5646			if (values.length === 1 || !(values[0] instanceof Dict)) {
5647				mergedDict._map.set(name, values[0]);
5648				continue;
5649			}
5650			const subDict = new Dict(xref);
5651			for (const dict of values) {
5652				for (const [key, value] of dict._map) {
5653					if (!subDict._map.has(key)) {
5654						subDict._map.set(key, value);
5655					}
5656				}
5657			}
5658			if (subDict.size > 0) {
5659				mergedDict._map.set(name, subDict);
5660			}
5661		}
5662		properties.clear();
5663		return mergedDict.size > 0 ? mergedDict : Dict.empty;
5664	}
5665	clone() {
5666		const dict = new Dict(this.xref);
5667		for (const key of this.getKeys()) {
5668			dict.set(key, this.getRaw(key));
5669		}
5670		return dict;
5671	}
5672	delete(key) {
5673		delete this._map[key];
5674	}
5675}
5676class Ref {
5677	constructor(num, gen) {
5678		this.num = num;
5679		this.gen = gen;
5680	}
5681	toString() {
5682		if (this.gen === 0) {
5683			return `${this.num}R`;
5684		}
5685		return `${this.num}R${this.gen}`;
5686	}
5687	static fromString(str) {
5688		const ref = RefCache[str];
5689		if (ref) {
5690			return ref;
5691		}
5692		const m = /^(\d+)R(\d*)$/.exec(str);
5693		if (!m || m[1] === "0") {
5694			return null;
5695		}
5696		return RefCache[str] = new Ref(parseInt(m[1]), !m[2] ? 0 : parseInt(m[2]));
5697	}
5698	static get(num, gen) {
5699		const key = gen === 0 ? `${num}R` : `${num}R${gen}`;
5700		return RefCache[key] ||= new Ref(num, gen);
5701	}
5702}
5703class RefSet {
5704	constructor(parent = null) {
5705		this._set = new Set(parent?._set);
5706	}
5707	has(ref) {
5708		return this._set.has(ref.toString());
5709	}
5710	put(ref) {
5711		this._set.add(ref.toString());
5712	}
5713	remove(ref) {
5714		this._set.delete(ref.toString());
5715	}
5716	[Symbol.iterator]() {
5717		return this._set.values();
5718	}
5719	clear() {
5720		this._set.clear();
5721	}
5722}
5723class RefSetCache {
5724	constructor() {
5725		this._map = new Map();
5726	}
5727	get size() {
5728		return this._map.size;
5729	}
5730	get(ref) {
5731		return this._map.get(ref.toString());
5732	}
5733	has(ref) {
5734		return this._map.has(ref.toString());
5735	}
5736	put(ref, obj) {
5737		this._map.set(ref.toString(), obj);
5738	}
5739	putAlias(ref, aliasRef) {
5740		this._map.set(ref.toString(), this.get(aliasRef));
5741	}
5742	[Symbol.iterator]() {
5743		return this._map.values();
5744	}
5745	clear() {
5746		this._map.clear();
5747	}
5748	*values() {
5749		yield* this._map.values();
5750	}
5751	*items() {
5752		for (const [ref, value] of this._map) {
5753			yield [Ref.fromString(ref), value];
5754		}
5755	}
5756}
5757function isName(v, name) {
5758	return v instanceof Name && (name === undefined || v.name === name);
5759}
5760function isCmd(v, cmd) {
5761	return v instanceof Cmd && (cmd === undefined || v.cmd === cmd);
5762}
5763function isDict(v, type) {
5764	return v instanceof Dict && (type === undefined || isName(v.get("Type"), type));
5765}
5766function isRefsEqual(v1, v2) {
5767	return v1.num === v2.num && v1.gen === v2.gen;
5768}
5769
5770;// ./src/core/base_stream.js
5771
5772class BaseStream {
5773	get length() {
5774		unreachable("Abstract getter `length` accessed");
5775	}
5776	get isEmpty() {
5777		unreachable("Abstract getter `isEmpty` accessed");
5778	}
5779	get isDataLoaded() {
5780		return shadow(this, "isDataLoaded", true);
5781	}
5782	getByte() {
5783		unreachable("Abstract method `getByte` called");
5784	}
5785	getBytes(length) {
5786		unreachable("Abstract method `getBytes` called");
5787	}
5788	async getImageData(length, decoderOptions) {
5789		return this.getBytes(length, decoderOptions);
5790	}
5791	async asyncGetBytes() {
5792		unreachable("Abstract method `asyncGetBytes` called");
5793	}
5794	get isAsync() {
5795		return false;
5796	}
5797	get canAsyncDecodeImageFromBuffer() {
5798		return false;
5799	}
5800	async getTransferableImage() {
5801		return null;
5802	}
5803	peekByte() {
5804		const peekedByte = this.getByte();
5805		if (peekedByte !== -1) {
5806			this.pos--;
5807		}
5808		return peekedByte;
5809	}
5810	peekBytes(length) {
5811		const bytes = this.getBytes(length);
5812		this.pos -= bytes.length;
5813		return bytes;
5814	}
5815	getUint16() {
5816		const b0 = this.getByte();
5817		const b1 = this.getByte();
5818		if (b0 === -1 || b1 === -1) {
5819			return -1;
5820		}
5821		return (b0 << 8) + b1;
5822	}
5823	getInt32() {
5824		const b0 = this.getByte();
5825		const b1 = this.getByte();
5826		const b2 = this.getByte();
5827		const b3 = this.getByte();
5828		return (b0 << 24) + (b1 << 16) + (b2 << 8) + b3;
5829	}
5830	getByteRange(begin, end) {
5831		unreachable("Abstract method `getByteRange` called");
5832	}
5833	getString(length) {
5834		return bytesToString(this.getBytes(length));
5835	}
5836	skip(n) {
5837		this.pos += n || 1;
5838	}
5839	reset() {
5840		unreachable("Abstract method `reset` called");
5841	}
5842	moveStart() {
5843		unreachable("Abstract method `moveStart` called");
5844	}
5845	makeSubStream(start, length, dict = null) {
5846		unreachable("Abstract method `makeSubStream` called");
5847	}
5848	getBaseStreams() {
5849		return null;
5850	}
5851}
5852
5853;// ./src/core/core_utils.js
5854
5855
5856
5857
5858
5859
5860
5861
5862
5863
5864
5865
5866
5867
5868
5869
5870
5871
5872
5873
5874const PDF_VERSION_REGEXP = /^[1-9]\.\d$/;
5875const MAX_INT_32 = 2 ** 31 - 1;
5876const MIN_INT_32 = -(2 ** 31);
5877function getLookupTableFactory(initializer) {
5878	let lookup;
5879	return function () {
5880		if (initializer) {
5881			lookup = Object.create(null);
5882			initializer(lookup);
5883			initializer = null;
5884		}
5885		return lookup;
5886	};
5887}
5888class MissingDataException extends BaseException {
5889	constructor(begin, end) {
5890		super(`Missing data [${begin}, ${end})`, "MissingDataException");
5891		this.begin = begin;
5892		this.end = end;
5893	}
5894}
5895class ParserEOFException extends BaseException {
5896	constructor(msg) {
5897		super(msg, "ParserEOFException");
5898	}
5899}
5900class XRefEntryException extends BaseException {
5901	constructor(msg) {
5902		super(msg, "XRefEntryException");
5903	}
5904}
5905class XRefParseException extends BaseException {
5906	constructor(msg) {
5907		super(msg, "XRefParseException");
5908	}
5909}
5910function arrayBuffersToBytes(arr) {
5911	const length = arr.length;
5912	if (length === 0) {
5913		return new Uint8Array(0);
5914	}
5915	if (length === 1) {
5916		return new Uint8Array(arr[0]);
5917	}
5918	let dataLength = 0;
5919	for (let i = 0; i < length; i++) {
5920		dataLength += arr[i].byteLength;
5921	}
5922	const data = new Uint8Array(dataLength);
5923	let pos = 0;
5924	for (let i = 0; i < length; i++) {
5925		const item = new Uint8Array(arr[i]);
5926		data.set(item, pos);
5927		pos += item.byteLength;
5928	}
5929	return data;
5930}
5931function getInheritableProperty({
5932	dict,
5933	key,
5934	getArray = false,
5935	stopWhenFound = true
5936}) {
5937	let values;
5938	const visited = new RefSet();
5939	while (dict instanceof Dict && !(dict.objId && visited.has(dict.objId))) {
5940		if (dict.objId) {
5941			visited.put(dict.objId);
5942		}
5943		const value = getArray ? dict.getArray(key) : dict.get(key);
5944		if (value !== undefined) {
5945			if (stopWhenFound) {
5946				return value;
5947			}
5948			(values ||= []).push(value);
5949		}
5950		dict = dict.get("Parent");
5951	}
5952	return values;
5953}
5954function getParentToUpdate(dict, ref, xref) {
5955	const visited = new RefSet();
5956	const firstDict = dict;
5957	const result = {
5958		dict: null,
5959		ref: null
5960	};
5961	while (dict instanceof Dict && !visited.has(ref)) {
5962		visited.put(ref);
5963		if (dict.has("T")) {
5964			break;
5965		}
5966		ref = dict.getRaw("Parent");
5967		if (!(ref instanceof Ref)) {
5968			return result;
5969		}
5970		dict = xref.fetch(ref);
5971	}
5972	if (dict instanceof Dict && dict !== firstDict) {
5973		result.dict = dict;
5974		result.ref = ref;
5975	}
5976	return result;
5977}
5978const ROMAN_NUMBER_MAP = ["", "C", "CC", "CCC", "CD", "D", "DC", "DCC", "DCCC", "CM", "", "X", "XX", "XXX", "XL", "L", "LX", "LXX", "LXXX", "XC", "", "I", "II", "III", "IV", "V", "VI", "VII", "VIII", "IX"];
5979function toRomanNumerals(number, lowerCase = false) {
5980	assert(Number.isInteger(number) && number > 0, "The number should be a positive integer.");
5981	const roman = "M".repeat(number / 1000 | 0) + ROMAN_NUMBER_MAP[number % 1000 / 100 | 0] + ROMAN_NUMBER_MAP[10 + (number % 100 / 10 | 0)] + ROMAN_NUMBER_MAP[20 + number % 10];
5982	return lowerCase ? roman.toLowerCase() : roman;
5983}
5984function log2(x) {
5985	return x > 0 ? Math.ceil(Math.log2(x)) : 0;
5986}
5987function readInt8(data, offset) {
5988	return data[offset] << 24 >> 24;
5989}
5990function readUint16(data, offset) {
5991	return data[offset] << 8 | data[offset + 1];
5992}
5993function readUint32(data, offset) {
5994	return (data[offset] << 24 | data[offset + 1] << 16 | data[offset + 2] << 8 | data[offset + 3]) >>> 0;
5995}
5996function isWhiteSpace(ch) {
5997	return ch === 0x20 || ch === 0x09 || ch === 0x0d || ch === 0x0a;
5998}
5999function isBooleanArray(arr, len) {
6000	return Array.isArray(arr) && (len === null || arr.length === len) && arr.every(x => typeof x === "boolean");
6001}
6002function isNumberArray(arr, len) {
6003	if (Array.isArray(arr)) {
6004		return (len === null || arr.length === len) && arr.every(x => typeof x === "number");
6005	}
6006	return ArrayBuffer.isView(arr) && (arr.length === 0 || typeof arr[0] === "number") && (len === null || arr.length === len);
6007}
6008function lookupMatrix(arr, fallback) {
6009	return isNumberArray(arr, 6) ? arr : fallback;
6010}
6011function lookupRect(arr, fallback) {
6012	return isNumberArray(arr, 4) ? arr : fallback;
6013}
6014function lookupNormalRect(arr, fallback) {
6015	return isNumberArray(arr, 4) ? Util.normalizeRect(arr) : fallback;
6016}
6017function parseXFAPath(path) {
6018	const positionPattern = /(.+)\[(\d+)\]$/;
6019	return path.split(".").map(component => {
6020		const m = component.match(positionPattern);
6021		if (m) {
6022			return {
6023				name: m[1],
6024				pos: parseInt(m[2], 10)
6025			};
6026		}
6027		return {
6028			name: component,
6029			pos: 0
6030		};
6031	});
6032}
6033function escapePDFName(str) {
6034	const buffer = [];
6035	let start = 0;
6036	for (let i = 0, ii = str.length; i < ii; i++) {
6037		const char = str.charCodeAt(i);
6038		if (char < 0x21 || char > 0x7e || char === 0x23 || char === 0x28 || char === 0x29 || char === 0x3c || char === 0x3e || char === 0x5b || char === 0x5d || char === 0x7b || char === 0x7d || char === 0x2f || char === 0x25) {
6039			if (start < i) {
6040				buffer.push(str.substring(start, i));
6041			}
6042			buffer.push(`#${char.toString(16)}`);
6043			start = i + 1;
6044		}
6045	}
6046	if (buffer.length === 0) {
6047		return str;
6048	}
6049	if (start < str.length) {
6050		buffer.push(str.substring(start, str.length));
6051	}
6052	return buffer.join("");
6053}
6054function escapeString(str) {
6055	return str.replaceAll(/([()\\\n\r])/g, match => {
6056		if (match === "\n") {
6057			return "\\n";
6058		} else if (match === "\r") {
6059			return "\\r";
6060		}
6061		return `\\${match}`;
6062	});
6063}
6064function _collectJS(entry, xref, list, parents) {
6065	if (!entry) {
6066		return;
6067	}
6068	let parent = null;
6069	if (entry instanceof Ref) {
6070		if (parents.has(entry)) {
6071			return;
6072		}
6073		parent = entry;
6074		parents.put(parent);
6075		entry = xref.fetch(entry);
6076	}
6077	if (Array.isArray(entry)) {
6078		for (const element of entry) {
6079			_collectJS(element, xref, list, parents);
6080		}
6081	} else if (entry instanceof Dict) {
6082		if (isName(entry.get("S"), "JavaScript")) {
6083			const js = entry.get("JS");
6084			let code;
6085			if (js instanceof BaseStream) {
6086				code = js.getString();
6087			} else if (typeof js === "string") {
6088				code = js;
6089			}
6090			code &&= stringToPDFString(code).replaceAll("\x00", "");
6091			if (code) {
6092				list.push(code);
6093			}
6094		}
6095		_collectJS(entry.getRaw("Next"), xref, list, parents);
6096	}
6097	if (parent) {
6098		parents.remove(parent);
6099	}
6100}
6101function collectActions(xref, dict, eventType) {
6102	const actions = Object.create(null);
6103	const additionalActionsDicts = getInheritableProperty({
6104		dict,
6105		key: "AA",
6106		stopWhenFound: false
6107	});
6108	if (additionalActionsDicts) {
6109		for (let i = additionalActionsDicts.length - 1; i >= 0; i--) {
6110			const additionalActions = additionalActionsDicts[i];
6111			if (!(additionalActions instanceof Dict)) {
6112				continue;
6113			}
6114			for (const key of additionalActions.getKeys()) {
6115				const action = eventType[key];
6116				if (!action) {
6117					continue;
6118				}
6119				const actionDict = additionalActions.getRaw(key);
6120				const parents = new RefSet();
6121				const list = [];
6122				_collectJS(actionDict, xref, list, parents);
6123				if (list.length > 0) {
6124					actions[action] = list;
6125				}
6126			}
6127		}
6128	}
6129	if (dict.has("A")) {
6130		const actionDict = dict.get("A");
6131		const parents = new RefSet();
6132		const list = [];
6133		_collectJS(actionDict, xref, list, parents);
6134		if (list.length > 0) {
6135			actions.Action = list;
6136		}
6137	}
6138	return objectSize(actions) > 0 ? actions : null;
6139}
6140const XMLEntities = {
6141	0x3c: "&lt;",
6142	0x3e: "&gt;",
6143	0x26: "&amp;",
6144	0x22: "&quot;",
6145	0x27: "&apos;"
6146};
6147function* codePointIter(str) {
6148	for (let i = 0, ii = str.length; i < ii; i++) {
6149		const char = str.codePointAt(i);
6150		if (char > 0xd7ff && (char < 0xe000 || char > 0xfffd)) {
6151			i++;
6152		}
6153		yield char;
6154	}
6155}
6156function encodeToXmlString(str) {
6157	const buffer = [];
6158	let start = 0;
6159	for (let i = 0, ii = str.length; i < ii; i++) {
6160		const char = str.codePointAt(i);
6161		if (0x20 <= char && char <= 0x7e) {
6162			const entity = XMLEntities[char];
6163			if (entity) {
6164				if (start < i) {
6165					buffer.push(str.substring(start, i));
6166				}
6167				buffer.push(entity);
6168				start = i + 1;
6169			}
6170		} else {
6171			if (start < i) {
6172				buffer.push(str.substring(start, i));
6173			}
6174			buffer.push(`&#x${char.toString(16).toUpperCase()};`);
6175			if (char > 0xd7ff && (char < 0xe000 || char > 0xfffd)) {
6176				i++;
6177			}
6178			start = i + 1;
6179		}
6180	}
6181	if (buffer.length === 0) {
6182		return str;
6183	}
6184	if (start < str.length) {
6185		buffer.push(str.substring(start, str.length));
6186	}
6187	return buffer.join("");
6188}
6189function validateFontName(fontFamily, mustWarn = false) {
6190	const m = /^("|').*("|')$/.exec(fontFamily);
6191	if (m && m[1] === m[2]) {
6192		const re = new RegExp(`[^\\\\]${m[1]}`);
6193		if (re.test(fontFamily.slice(1, -1))) {
6194			if (mustWarn) {
6195				warn(`FontFamily contains unescaped ${m[1]}: ${fontFamily}.`);
6196			}
6197			return false;
6198		}
6199	} else {
6200		for (const ident of fontFamily.split(/[ \t]+/)) {
6201			if (/^(\d|(-(\d|-)))/.test(ident) || !/^[\w-\\]+$/.test(ident)) {
6202				if (mustWarn) {
6203					warn(`FontFamily contains invalid <custom-ident>: ${fontFamily}.`);
6204				}
6205				return false;
6206			}
6207		}
6208	}
6209	return true;
6210}
6211function validateCSSFont(cssFontInfo) {
6212	const DEFAULT_CSS_FONT_OBLIQUE = "14";
6213	const DEFAULT_CSS_FONT_WEIGHT = "400";
6214	const CSS_FONT_WEIGHT_VALUES = new Set(["100", "200", "300", "400", "500", "600", "700", "800", "900", "1000", "normal", "bold", "bolder", "lighter"]);
6215	const {
6216		fontFamily,
6217		fontWeight,
6218		italicAngle
6219	} = cssFontInfo;
6220	if (!validateFontName(fontFamily, true)) {
6221		return false;
6222	}
6223	const weight = fontWeight ? fontWeight.toString() : "";
6224	cssFontInfo.fontWeight = CSS_FONT_WEIGHT_VALUES.has(weight) ? weight : DEFAULT_CSS_FONT_WEIGHT;
6225	const angle = parseFloat(italicAngle);
6226	cssFontInfo.italicAngle = isNaN(angle) || angle < -90 || angle > 90 ? DEFAULT_CSS_FONT_OBLIQUE : italicAngle.toString();
6227	return true;
6228}
6229function recoverJsURL(str) {
6230	const URL_OPEN_METHODS = ["app.launchURL", "window.open", "xfa.host.gotoURL"];
6231	const regex = new RegExp("^\\s*(" + URL_OPEN_METHODS.join("|").replaceAll(".", "\\.") + ")\\((?:'|\")([^'\"]*)(?:'|\")(?:,\\s*(\\w+)\\)|\\))", "i");
6232	const jsUrl = regex.exec(str);
6233	if (jsUrl?.[2]) {
6234		return {
6235			url: jsUrl[2],
6236			newWindow: jsUrl[1] === "app.launchURL" && jsUrl[3] === "true"
6237		};
6238	}
6239	return null;
6240}
6241function numberToString(value) {
6242	if (Number.isInteger(value)) {
6243		return value.toString();
6244	}
6245	const roundedValue = Math.round(value * 100);
6246	if (roundedValue % 100 === 0) {
6247		return (roundedValue / 100).toString();
6248	}
6249	if (roundedValue % 10 === 0) {
6250		return value.toFixed(1);
6251	}
6252	return value.toFixed(2);
6253}
6254function getNewAnnotationsMap(annotationStorage) {
6255	if (!annotationStorage) {
6256		return null;
6257	}
6258	const newAnnotationsByPage = new Map();
6259	for (const [key, value] of annotationStorage) {
6260		if (!key.startsWith(AnnotationEditorPrefix)) {
6261			continue;
6262		}
6263		let annotations = newAnnotationsByPage.get(value.pageIndex);
6264		if (!annotations) {
6265			annotations = [];
6266			newAnnotationsByPage.set(value.pageIndex, annotations);
6267		}
6268		annotations.push(value);
6269	}
6270	return newAnnotationsByPage.size > 0 ? newAnnotationsByPage : null;
6271}
6272function stringToAsciiOrUTF16BE(str) {
6273	return isAscii(str) ? str : stringToUTF16String(str, true);
6274}
6275function isAscii(str) {
6276	return /^[\x00-\x7F]*$/.test(str);
6277}
6278function stringToUTF16HexString(str) {
6279	const buf = [];
6280	for (let i = 0, ii = str.length; i < ii; i++) {
6281		const char = str.charCodeAt(i);
6282		buf.push(hexNumbers[char >> 8 & 0xff], hexNumbers[char & 0xff]);
6283	}
6284	return buf.join("");
6285}
6286function stringToUTF16String(str, bigEndian = false) {
6287	const buf = [];
6288	if (bigEndian) {
6289		buf.push("\xFE\xFF");
6290	}
6291	for (let i = 0, ii = str.length; i < ii; i++) {
6292		const char = str.charCodeAt(i);
6293		buf.push(String.fromCharCode(char >> 8 & 0xff), String.fromCharCode(char & 0xff));
6294	}
6295	return buf.join("");
6296}
6297function getRotationMatrix(rotation, width, height) {
6298	switch (rotation) {
6299		case 90:
6300			return [0, 1, -1, 0, width, 0];
6301		case 180:
6302			return [-1, 0, 0, -1, width, height];
6303		case 270:
6304			return [0, -1, 1, 0, 0, height];
6305		default:
6306			throw new Error("Invalid rotation");
6307	}
6308}
6309function getSizeInBytes(x) {
6310	return Math.ceil(Math.ceil(Math.log2(1 + x)) / 8);
6311}
6312
6313;// ./src/core/stream.js
6314
6315
6316
6317
6318
6319
6320
6321
6322class Stream extends BaseStream {
6323	constructor(arrayBuffer, start, length, dict) {
6324		super();
6325		this.bytes = arrayBuffer instanceof Uint8Array ? arrayBuffer : new Uint8Array(arrayBuffer);
6326		this.start = start || 0;
6327		this.pos = this.start;
6328		this.end = start + length || this.bytes.length;
6329		this.dict = dict;
6330	}
6331	get length() {
6332		return this.end - this.start;
6333	}
6334	get isEmpty() {
6335		return this.length === 0;
6336	}
6337	getByte() {
6338		if (this.pos >= this.end) {
6339			return -1;
6340		}
6341		return this.bytes[this.pos++];
6342	}
6343	getBytes(length) {
6344		const bytes = this.bytes;
6345		const pos = this.pos;
6346		const strEnd = this.end;
6347		if (!length) {
6348			return bytes.subarray(pos, strEnd);
6349		}
6350		let end = pos + length;
6351		if (end > strEnd) {
6352			end = strEnd;
6353		}
6354		this.pos = end;
6355		return bytes.subarray(pos, end);
6356	}
6357	getByteRange(begin, end) {
6358		if (begin < 0) {
6359			begin = 0;
6360		}
6361		if (end > this.end) {
6362			end = this.end;
6363		}
6364		return this.bytes.subarray(begin, end);
6365	}
6366	reset() {
6367		this.pos = this.start;
6368	}
6369	moveStart() {
6370		this.start = this.pos;
6371	}
6372	makeSubStream(start, length, dict = null) {
6373		return new Stream(this.bytes.buffer, start, length, dict);
6374	}
6375}
6376class StringStream extends Stream {
6377	constructor(str) {
6378		super(stringToBytes(str));
6379	}
6380}
6381class NullStream extends Stream {
6382	constructor() {
6383		super(new Uint8Array(0));
6384	}
6385}
6386
6387;// ./src/core/chunked_stream.js
6388
6389
6390
6391
6392
6393
6394
6395
6396
6397
6398
6399
6400
6401
6402
6403
6404
6405
6406class ChunkedStream extends Stream {
6407	constructor(length, chunkSize, manager) {
6408		super(new Uint8Array(length), 0, length, null);
6409		this.chunkSize = chunkSize;
6410		this._loadedChunks = new Set();
6411		this.numChunks = Math.ceil(length / chunkSize);
6412		this.manager = manager;
6413		this.progressiveDataLength = 0;
6414		this.lastSuccessfulEnsureByteChunk = -1;
6415	}
6416	getMissingChunks() {
6417		const chunks = [];
6418		for (let chunk = 0, n = this.numChunks; chunk < n; ++chunk) {
6419			if (!this._loadedChunks.has(chunk)) {
6420				chunks.push(chunk);
6421			}
6422		}
6423		return chunks;
6424	}
6425	get numChunksLoaded() {
6426		return this._loadedChunks.size;
6427	}
6428	get isDataLoaded() {
6429		return this.numChunksLoaded === this.numChunks;
6430	}
6431	onReceiveData(begin, chunk) {
6432		const chunkSize = this.chunkSize;
6433		if (begin % chunkSize !== 0) {
6434			throw new Error(`Bad begin offset: ${begin}`);
6435		}
6436		const end = begin + chunk.byteLength;
6437		if (end % chunkSize !== 0 && end !== this.bytes.length) {
6438			throw new Error(`Bad end offset: ${end}`);
6439		}
6440		this.bytes.set(new Uint8Array(chunk), begin);
6441		const beginChunk = Math.floor(begin / chunkSize);
6442		const endChunk = Math.floor((end - 1) / chunkSize) + 1;
6443		for (let curChunk = beginChunk; curChunk < endChunk; ++curChunk) {
6444			this._loadedChunks.add(curChunk);
6445		}
6446	}
6447	onReceiveProgressiveData(data) {
6448		let position = this.progressiveDataLength;
6449		const beginChunk = Math.floor(position / this.chunkSize);
6450		this.bytes.set(new Uint8Array(data), position);
6451		position += data.byteLength;
6452		this.progressiveDataLength = position;
6453		const endChunk = position >= this.end ? this.numChunks : Math.floor(position / this.chunkSize);
6454		for (let curChunk = beginChunk; curChunk < endChunk; ++curChunk) {
6455			this._loadedChunks.add(curChunk);
6456		}
6457	}
6458	ensureByte(pos) {
6459		if (pos < this.progressiveDataLength) {
6460			return;
6461		}
6462		const chunk = Math.floor(pos / this.chunkSize);
6463		if (chunk > this.numChunks) {
6464			return;
6465		}
6466		if (chunk === this.lastSuccessfulEnsureByteChunk) {
6467			return;
6468		}
6469		if (!this._loadedChunks.has(chunk)) {
6470			throw new MissingDataException(pos, pos + 1);
6471		}
6472		this.lastSuccessfulEnsureByteChunk = chunk;
6473	}
6474	ensureRange(begin, end) {
6475		if (begin >= end) {
6476			return;
6477		}
6478		if (end <= this.progressiveDataLength) {
6479			return;
6480		}
6481		const beginChunk = Math.floor(begin / this.chunkSize);
6482		if (beginChunk > this.numChunks) {
6483			return;
6484		}
6485		const endChunk = Math.min(Math.floor((end - 1) / this.chunkSize) + 1, this.numChunks);
6486		for (let chunk = beginChunk; chunk < endChunk; ++chunk) {
6487			if (!this._loadedChunks.has(chunk)) {
6488				throw new MissingDataException(begin, end);
6489			}
6490		}
6491	}
6492	nextEmptyChunk(beginChunk) {
6493		const numChunks = this.numChunks;
6494		for (let i = 0; i < numChunks; ++i) {
6495			const chunk = (beginChunk + i) % numChunks;
6496			if (!this._loadedChunks.has(chunk)) {
6497				return chunk;
6498			}
6499		}
6500		return null;
6501	}
6502	hasChunk(chunk) {
6503		return this._loadedChunks.has(chunk);
6504	}
6505	getByte() {
6506		const pos = this.pos;
6507		if (pos >= this.end) {
6508			return -1;
6509		}
6510		if (pos >= this.progressiveDataLength) {
6511			this.ensureByte(pos);
6512		}
6513		return this.bytes[this.pos++];
6514	}
6515	getBytes(length) {
6516		const bytes = this.bytes;
6517		const pos = this.pos;
6518		const strEnd = this.end;
6519		if (!length) {
6520			if (strEnd > this.progressiveDataLength) {
6521				this.ensureRange(pos, strEnd);
6522			}
6523			return bytes.subarray(pos, strEnd);
6524		}
6525		let end = pos + length;
6526		if (end > strEnd) {
6527			end = strEnd;
6528		}
6529		if (end > this.progressiveDataLength) {
6530			this.ensureRange(pos, end);
6531		}
6532		this.pos = end;
6533		return bytes.subarray(pos, end);
6534	}
6535	getByteRange(begin, end) {
6536		if (begin < 0) {
6537			begin = 0;
6538		}
6539		if (end > this.end) {
6540			end = this.end;
6541		}
6542		if (end > this.progressiveDataLength) {
6543			this.ensureRange(begin, end);
6544		}
6545		return this.bytes.subarray(begin, end);
6546	}
6547	makeSubStream(start, length, dict = null) {
6548		if (length) {
6549			if (start + length > this.progressiveDataLength) {
6550				this.ensureRange(start, start + length);
6551			}
6552		} else if (start >= this.progressiveDataLength) {
6553			this.ensureByte(start);
6554		}
6555		function ChunkedStreamSubstream() {}
6556		ChunkedStreamSubstream.prototype = Object.create(this);
6557		ChunkedStreamSubstream.prototype.getMissingChunks = function () {
6558			const chunkSize = this.chunkSize;
6559			const beginChunk = Math.floor(this.start / chunkSize);
6560			const endChunk = Math.floor((this.end - 1) / chunkSize) + 1;
6561			const missingChunks = [];
6562			for (let chunk = beginChunk; chunk < endChunk; ++chunk) {
6563				if (!this._loadedChunks.has(chunk)) {
6564					missingChunks.push(chunk);
6565				}
6566			}
6567			return missingChunks;
6568		};
6569		Object.defineProperty(ChunkedStreamSubstream.prototype, "isDataLoaded", {
6570			get() {
6571				if (this.numChunksLoaded === this.numChunks) {
6572					return true;
6573				}
6574				return this.getMissingChunks().length === 0;
6575			},
6576			configurable: true
6577		});
6578		const subStream = new ChunkedStreamSubstream();
6579		subStream.pos = subStream.start = start;
6580		subStream.end = start + length || this.end;
6581		subStream.dict = dict;
6582		return subStream;
6583	}
6584	getBaseStreams() {
6585		return [this];
6586	}
6587}
6588class ChunkedStreamManager {
6589	constructor(pdfNetworkStream, args) {
6590		this.length = args.length;
6591		this.chunkSize = args.rangeChunkSize;
6592		this.stream = new ChunkedStream(this.length, this.chunkSize, this);
6593		this.pdfNetworkStream = pdfNetworkStream;
6594		this.disableAutoFetch = args.disableAutoFetch;
6595		this.msgHandler = args.msgHandler;
6596		this.currRequestId = 0;
6597		this._chunksNeededByRequest = new Map();
6598		this._requestsByChunk = new Map();
6599		this._promisesByRequest = new Map();
6600		this.progressiveDataLength = 0;
6601		this.aborted = false;
6602		this._loadedStreamCapability = Promise.withResolvers();
6603	}
6604	sendRequest(begin, end) {
6605		const rangeReader = this.pdfNetworkStream.getRangeReader(begin, end);
6606		if (!rangeReader.isStreamingSupported) {
6607			rangeReader.onProgress = this.onProgress.bind(this);
6608		}
6609		let chunks = [],
6610			loaded = 0;
6611		return new Promise((resolve, reject) => {
6612			const readChunk = ({
6613				value,
6614				done
6615			}) => {
6616				try {
6617					if (done) {
6618						const chunkData = arrayBuffersToBytes(chunks);
6619						chunks = null;
6620						resolve(chunkData);
6621						return;
6622					}
6623					loaded += value.byteLength;
6624					if (rangeReader.isStreamingSupported) {
6625						this.onProgress({
6626							loaded
6627						});
6628					}
6629					chunks.push(value);
6630					rangeReader.read().then(readChunk, reject);
6631				} catch (e) {
6632					reject(e);
6633				}
6634			};
6635			rangeReader.read().then(readChunk, reject);
6636		}).then(data => {
6637			if (this.aborted) {
6638				return;
6639			}
6640			this.onReceiveData({
6641				chunk: data,
6642				begin
6643			});
6644		});
6645	}
6646	requestAllChunks(noFetch = false) {
6647		if (!noFetch) {
6648			const missingChunks = this.stream.getMissingChunks();
6649			this._requestChunks(missingChunks);
6650		}
6651		return this._loadedStreamCapability.promise;
6652	}
6653	_requestChunks(chunks) {
6654		const requestId = this.currRequestId++;
6655		const chunksNeeded = new Set();
6656		this._chunksNeededByRequest.set(requestId, chunksNeeded);
6657		for (const chunk of chunks) {
6658			if (!this.stream.hasChunk(chunk)) {
6659				chunksNeeded.add(chunk);
6660			}
6661		}
6662		if (chunksNeeded.size === 0) {
6663			return Promise.resolve();
6664		}
6665		const capability = Promise.withResolvers();
6666		this._promisesByRequest.set(requestId, capability);
6667		const chunksToRequest = [];
6668		for (const chunk of chunksNeeded) {
6669			let requestIds = this._requestsByChunk.get(chunk);
6670			if (!requestIds) {
6671				requestIds = [];
6672				this._requestsByChunk.set(chunk, requestIds);
6673				chunksToRequest.push(chunk);
6674			}
6675			requestIds.push(requestId);
6676		}
6677		if (chunksToRequest.length > 0) {
6678			const groupedChunksToRequest = this.groupChunks(chunksToRequest);
6679			for (const groupedChunk of groupedChunksToRequest) {
6680				const begin = groupedChunk.beginChunk * this.chunkSize;
6681				const end = Math.min(groupedChunk.endChunk * this.chunkSize, this.length);
6682				this.sendRequest(begin, end).catch(capability.reject);
6683			}
6684		}
6685		return capability.promise.catch(reason => {
6686			if (this.aborted) {
6687				return;
6688			}
6689			throw reason;
6690		});
6691	}
6692	getStream() {
6693		return this.stream;
6694	}
6695	requestRange(begin, end) {
6696		end = Math.min(end, this.length);
6697		const beginChunk = this.getBeginChunk(begin);
6698		const endChunk = this.getEndChunk(end);
6699		const chunks = [];
6700		for (let chunk = beginChunk; chunk < endChunk; ++chunk) {
6701			chunks.push(chunk);
6702		}
6703		return this._requestChunks(chunks);
6704	}
6705	requestRanges(ranges = []) {
6706		const chunksToRequest = [];
6707		for (const range of ranges) {
6708			const beginChunk = this.getBeginChunk(range.begin);
6709			const endChunk = this.getEndChunk(range.end);
6710			for (let chunk = beginChunk; chunk < endChunk; ++chunk) {
6711				if (!chunksToRequest.includes(chunk)) {
6712					chunksToRequest.push(chunk);
6713				}
6714			}
6715		}
6716		chunksToRequest.sort(function (a, b) {
6717			return a - b;
6718		});
6719		return this._requestChunks(chunksToRequest);
6720	}
6721	groupChunks(chunks) {
6722		const groupedChunks = [];
6723		let beginChunk = -1;
6724		let prevChunk = -1;
6725		for (let i = 0, ii = chunks.length; i < ii; ++i) {
6726			const chunk = chunks[i];
6727			if (beginChunk < 0) {
6728				beginChunk = chunk;
6729			}
6730			if (prevChunk >= 0 && prevChunk + 1 !== chunk) {
6731				groupedChunks.push({
6732					beginChunk,
6733					endChunk: prevChunk + 1
6734				});
6735				beginChunk = chunk;
6736			}
6737			if (i + 1 === chunks.length) {
6738				groupedChunks.push({
6739					beginChunk,
6740					endChunk: chunk + 1
6741				});
6742			}
6743			prevChunk = chunk;
6744		}
6745		return groupedChunks;
6746	}
6747	onProgress(args) {
6748		this.msgHandler.send("DocProgress", {
6749			loaded: this.stream.numChunksLoaded * this.chunkSize + args.loaded,
6750			total: this.length
6751		});
6752	}
6753	onReceiveData(args) {
6754		const chunk = args.chunk;
6755		const isProgressive = args.begin === undefined;
6756		const begin = isProgressive ? this.progressiveDataLength : args.begin;
6757		const end = begin + chunk.byteLength;
6758		const beginChunk = Math.floor(begin / this.chunkSize);
6759		const endChunk = end < this.length ? Math.floor(end / this.chunkSize) : Math.ceil(end / this.chunkSize);
6760		if (isProgressive) {
6761			this.stream.onReceiveProgressiveData(chunk);
6762			this.progressiveDataLength = end;
6763		} else {
6764			this.stream.onReceiveData(begin, chunk);
6765		}
6766		if (this.stream.isDataLoaded) {
6767			this._loadedStreamCapability.resolve(this.stream);
6768		}
6769		const loadedRequests = [];
6770		for (let curChunk = beginChunk; curChunk < endChunk; ++curChunk) {
6771			const requestIds = this._requestsByChunk.get(curChunk);
6772			if (!requestIds) {
6773				continue;
6774			}
6775			this._requestsByChunk.delete(curChunk);
6776			for (const requestId of requestIds) {
6777				const chunksNeeded = this._chunksNeededByRequest.get(requestId);
6778				if (chunksNeeded.has(curChunk)) {
6779					chunksNeeded.delete(curChunk);
6780				}
6781				if (chunksNeeded.size > 0) {
6782					continue;
6783				}
6784				loadedRequests.push(requestId);
6785			}
6786		}
6787		if (!this.disableAutoFetch && this._requestsByChunk.size === 0) {
6788			let nextEmptyChunk;
6789			if (this.stream.numChunksLoaded === 1) {
6790				const lastChunk = this.stream.numChunks - 1;
6791				if (!this.stream.hasChunk(lastChunk)) {
6792					nextEmptyChunk = lastChunk;
6793				}
6794			} else {
6795				nextEmptyChunk = this.stream.nextEmptyChunk(endChunk);
6796			}
6797			if (Number.isInteger(nextEmptyChunk)) {
6798				this._requestChunks([nextEmptyChunk]);
6799			}
6800		}
6801		for (const requestId of loadedRequests) {
6802			const capability = this._promisesByRequest.get(requestId);
6803			this._promisesByRequest.delete(requestId);
6804			capability.resolve();
6805		}
6806		this.msgHandler.send("DocProgress", {
6807			loaded: this.stream.numChunksLoaded * this.chunkSize,
6808			total: this.length
6809		});
6810	}
6811	onError(err) {
6812		this._loadedStreamCapability.reject(err);
6813	}
6814	getBeginChunk(begin) {
6815		return Math.floor(begin / this.chunkSize);
6816	}
6817	getEndChunk(end) {
6818		return Math.floor((end - 1) / this.chunkSize) + 1;
6819	}
6820	abort(reason) {
6821		this.aborted = true;
6822		this.pdfNetworkStream?.cancelAllRequests(reason);
6823		for (const capability of this._promisesByRequest.values()) {
6824			capability.reject(reason);
6825		}
6826	}
6827}
6828
6829// EXTERNAL MODULE: ./node_modules/core-js/modules/esnext.iterator.filter.js
6830var esnext_iterator_filter = __webpack_require__(4520);
6831// EXTERNAL MODULE: ./node_modules/core-js/modules/es.regexp.flags.js
6832var es_regexp_flags = __webpack_require__(9479);
6833// EXTERNAL MODULE: ./node_modules/core-js/modules/esnext.iterator.find.js
6834var esnext_iterator_find = __webpack_require__(2577);
6835// EXTERNAL MODULE: ./node_modules/core-js/modules/esnext.iterator.reduce.js
6836var esnext_iterator_reduce = __webpack_require__(8872);
6837;// ./src/core/colorspace.js
6838
6839
6840
6841
6842
6843
6844
6845
6846
6847
6848function resizeRgbImage(src, dest, w1, h1, w2, h2, alpha01) {
6849	const COMPONENTS = 3;
6850	alpha01 = alpha01 !== 1 ? 0 : alpha01;
6851	const xRatio = w1 / w2;
6852	const yRatio = h1 / h2;
6853	let newIndex = 0,
6854		oldIndex;
6855	const xScaled = new Uint16Array(w2);
6856	const w1Scanline = w1 * COMPONENTS;
6857	for (let i = 0; i < w2; i++) {
6858		xScaled[i] = Math.floor(i * xRatio) * COMPONENTS;
6859	}
6860	for (let i = 0; i < h2; i++) {
6861		const py = Math.floor(i * yRatio) * w1Scanline;
6862		for (let j = 0; j < w2; j++) {
6863			oldIndex = py + xScaled[j];
6864			dest[newIndex++] = src[oldIndex++];
6865			dest[newIndex++] = src[oldIndex++];
6866			dest[newIndex++] = src[oldIndex++];
6867			newIndex += alpha01;
6868		}
6869	}
6870}
6871function resizeRgbaImage(src, dest, w1, h1, w2, h2, alpha01) {
6872	const xRatio = w1 / w2;
6873	const yRatio = h1 / h2;
6874	let newIndex = 0;
6875	const xScaled = new Uint16Array(w2);
6876	if (alpha01 === 1) {
6877		for (let i = 0; i < w2; i++) {
6878			xScaled[i] = Math.floor(i * xRatio);
6879		}
6880		const src32 = new Uint32Array(src.buffer);
6881		const dest32 = new Uint32Array(dest.buffer);
6882		const rgbMask = FeatureTest.isLittleEndian ? 0x00ffffff : 0xffffff00;
6883		for (let i = 0; i < h2; i++) {
6884			const buf = src32.subarray(Math.floor(i * yRatio) * w1);
6885			for (let j = 0; j < w2; j++) {
6886				dest32[newIndex++] |= buf[xScaled[j]] & rgbMask;
6887			}
6888		}
6889	} else {
6890		const COMPONENTS = 4;
6891		const w1Scanline = w1 * COMPONENTS;
6892		for (let i = 0; i < w2; i++) {
6893			xScaled[i] = Math.floor(i * xRatio) * COMPONENTS;
6894		}
6895		for (let i = 0; i < h2; i++) {
6896			const buf = src.subarray(Math.floor(i * yRatio) * w1Scanline);
6897			for (let j = 0; j < w2; j++) {
6898				const oldIndex = xScaled[j];
6899				dest[newIndex++] = buf[oldIndex];
6900				dest[newIndex++] = buf[oldIndex + 1];
6901				dest[newIndex++] = buf[oldIndex + 2];
6902			}
6903		}
6904	}
6905}
6906function copyRgbaImage(src, dest, alpha01) {
6907	if (alpha01 === 1) {
6908		const src32 = new Uint32Array(src.buffer);
6909		const dest32 = new Uint32Array(dest.buffer);
6910		const rgbMask = FeatureTest.isLittleEndian ? 0x00ffffff : 0xffffff00;
6911		for (let i = 0, ii = src32.length; i < ii; i++) {
6912			dest32[i] |= src32[i] & rgbMask;
6913		}
6914	} else {
6915		let j = 0;
6916		for (let i = 0, ii = src.length; i < ii; i += 4) {
6917			dest[j++] = src[i];
6918			dest[j++] = src[i + 1];
6919			dest[j++] = src[i + 2];
6920		}
6921	}
6922}
6923class ColorSpace {
6924	constructor(name, numComps) {
6925		this.name = name;
6926		this.numComps = numComps;
6927	}
6928	getRgb(src, srcOffset) {
6929		const rgb = new Uint8ClampedArray(3);
6930		this.getRgbItem(src, srcOffset, rgb, 0);
6931		return rgb;
6932	}
6933	getRgbItem(src, srcOffset, dest, destOffset) {
6934		unreachable("Should not call ColorSpace.getRgbItem");
6935	}
6936	getRgbBuffer(src, srcOffset, count, dest, destOffset, bits, alpha01) {
6937		unreachable("Should not call ColorSpace.getRgbBuffer");
6938	}
6939	getOutputLength(inputLength, alpha01) {
6940		unreachable("Should not call ColorSpace.getOutputLength");
6941	}
6942	isPassthrough(bits) {
6943		return false;
6944	}
6945	isDefaultDecode(decodeMap, bpc) {
6946		return ColorSpace.isDefaultDecode(decodeMap, this.numComps);
6947	}
6948	fillRgb(dest, originalWidth, originalHeight, width, height, actualHeight, bpc, comps, alpha01) {
6949		const count = originalWidth * originalHeight;
6950		let rgbBuf = null;
6951		const numComponentColors = 1 << bpc;
6952		const needsResizing = originalHeight !== height || originalWidth !== width;
6953		if (this.isPassthrough(bpc)) {
6954			rgbBuf = comps;
6955		} else if (this.numComps === 1 && count > numComponentColors && this.name !== "DeviceGray" && this.name !== "DeviceRGB") {
6956			const allColors = bpc <= 8 ? new Uint8Array(numComponentColors) : new Uint16Array(numComponentColors);
6957			for (let i = 0; i < numComponentColors; i++) {
6958				allColors[i] = i;
6959			}
6960			const colorMap = new Uint8ClampedArray(numComponentColors * 3);
6961			this.getRgbBuffer(allColors, 0, numComponentColors, colorMap, 0, bpc, 0);
6962			if (!needsResizing) {
6963				let destPos = 0;
6964				for (let i = 0; i < count; ++i) {
6965					const key = comps[i] * 3;
6966					dest[destPos++] = colorMap[key];
6967					dest[destPos++] = colorMap[key + 1];
6968					dest[destPos++] = colorMap[key + 2];
6969					destPos += alpha01;
6970				}
6971			} else {
6972				rgbBuf = new Uint8Array(count * 3);
6973				let rgbPos = 0;
6974				for (let i = 0; i < count; ++i) {
6975					const key = comps[i] * 3;
6976					rgbBuf[rgbPos++] = colorMap[key];
6977					rgbBuf[rgbPos++] = colorMap[key + 1];
6978					rgbBuf[rgbPos++] = colorMap[key + 2];
6979				}
6980			}
6981		} else if (!needsResizing) {
6982			this.getRgbBuffer(comps, 0, width * actualHeight, dest, 0, bpc, alpha01);
6983		} else {
6984			rgbBuf = new Uint8ClampedArray(count * 3);
6985			this.getRgbBuffer(comps, 0, count, rgbBuf, 0, bpc, 0);
6986		}
6987		if (rgbBuf) {
6988			if (needsResizing) {
6989				resizeRgbImage(rgbBuf, dest, originalWidth, originalHeight, width, height, alpha01);
6990			} else {
6991				let destPos = 0,
6992					rgbPos = 0;
6993				for (let i = 0, ii = width * actualHeight; i < ii; i++) {
6994					dest[destPos++] = rgbBuf[rgbPos++];
6995					dest[destPos++] = rgbBuf[rgbPos++];
6996					dest[destPos++] = rgbBuf[rgbPos++];
6997					destPos += alpha01;
6998				}
6999			}
7000		}
7001	}
7002	get usesZeroToOneRange() {
7003		return shadow(this, "usesZeroToOneRange", true);
7004	}
7005	static _cache(cacheKey, xref, localColorSpaceCache, parsedColorSpace) {
7006		if (!localColorSpaceCache) {
7007			throw new Error('ColorSpace._cache - expected "localColorSpaceCache" argument.');
7008		}
7009		if (!parsedColorSpace) {
7010			throw new Error('ColorSpace._cache - expected "parsedColorSpace" argument.');
7011		}
7012		let csName, csRef;
7013		if (cacheKey instanceof Ref) {
7014			csRef = cacheKey;
7015			cacheKey = xref.fetch(cacheKey);
7016		}
7017		if (cacheKey instanceof Name) {
7018			csName = cacheKey.name;
7019		}
7020		if (csName || csRef) {
7021			localColorSpaceCache.set(csName, csRef, parsedColorSpace);
7022		}
7023	}
7024	static getCached(cacheKey, xref, localColorSpaceCache) {
7025		if (!localColorSpaceCache) {
7026			throw new Error('ColorSpace.getCached - expected "localColorSpaceCache" argument.');
7027		}
7028		if (cacheKey instanceof Ref) {
7029			const localColorSpace = localColorSpaceCache.getByRef(cacheKey);
7030			if (localColorSpace) {
7031				return localColorSpace;
7032			}
7033			try {
7034				cacheKey = xref.fetch(cacheKey);
7035			} catch (ex) {
7036				if (ex instanceof MissingDataException) {
7037					throw ex;
7038				}
7039			}
7040		}
7041		if (cacheKey instanceof Name) {
7042			const localColorSpace = localColorSpaceCache.getByName(cacheKey.name);
7043			if (localColorSpace) {
7044				return localColorSpace;
7045			}
7046		}
7047		return null;
7048	}
7049	static async parseAsync({
7050		cs,
7051		xref,
7052		resources = null,
7053		pdfFunctionFactory,
7054		localColorSpaceCache
7055	}) {
7056		const parsedColorSpace = this._parse(cs, xref, resources, pdfFunctionFactory);
7057		this._cache(cs, xref, localColorSpaceCache, parsedColorSpace);
7058		return parsedColorSpace;
7059	}
7060	static parse({
7061		cs,
7062		xref,
7063		resources = null,
7064		pdfFunctionFactory,
7065		localColorSpaceCache
7066	}) {
7067		const cachedColorSpace = this.getCached(cs, xref, localColorSpaceCache);
7068		if (cachedColorSpace) {
7069			return cachedColorSpace;
7070		}
7071		const parsedColorSpace = this._parse(cs, xref, resources, pdfFunctionFactory);
7072		this._cache(cs, xref, localColorSpaceCache, parsedColorSpace);
7073		return parsedColorSpace;
7074	}
7075	static _parse(cs, xref, resources = null, pdfFunctionFactory) {
7076		cs = xref.fetchIfRef(cs);
7077		if (cs instanceof Name) {
7078			switch (cs.name) {
7079				case "G":
7080				case "DeviceGray":
7081					return this.singletons.gray;
7082				case "RGB":
7083				case "DeviceRGB":
7084					return this.singletons.rgb;
7085				case "DeviceRGBA":
7086					return this.singletons.rgba;
7087				case "CMYK":
7088				case "DeviceCMYK":
7089					return this.singletons.cmyk;
7090				case "Pattern":
7091					return new PatternCS(null);
7092				default:
7093					if (resources instanceof Dict) {
7094						const colorSpaces = resources.get("ColorSpace");
7095						if (colorSpaces instanceof Dict) {
7096							const resourcesCS = colorSpaces.get(cs.name);
7097							if (resourcesCS) {
7098								if (resourcesCS instanceof Name) {
7099									return this._parse(resourcesCS, xref, resources, pdfFunctionFactory);
7100								}
7101								cs = resourcesCS;
7102								break;
7103							}
7104						}
7105					}
7106					warn(`Unrecognized ColorSpace: ${cs.name}`);
7107					return this.singletons.gray;
7108			}
7109		}
7110		if (Array.isArray(cs)) {
7111			const mode = xref.fetchIfRef(cs[0]).name;
7112			let params, numComps, baseCS, whitePoint, blackPoint, gamma;
7113			switch (mode) {
7114				case "G":
7115				case "DeviceGray":
7116					return this.singletons.gray;
7117				case "RGB":
7118				case "DeviceRGB":
7119					return this.singletons.rgb;
7120				case "CMYK":
7121				case "DeviceCMYK":
7122					return this.singletons.cmyk;
7123				case "CalGray":
7124					params = xref.fetchIfRef(cs[1]);
7125					whitePoint = params.getArray("WhitePoint");
7126					blackPoint = params.getArray("BlackPoint");
7127					gamma = params.get("Gamma");
7128					return new CalGrayCS(whitePoint, blackPoint, gamma);
7129				case "CalRGB":
7130					params = xref.fetchIfRef(cs[1]);
7131					whitePoint = params.getArray("WhitePoint");
7132					blackPoint = params.getArray("BlackPoint");
7133					gamma = params.getArray("Gamma");
7134					const matrix = params.getArray("Matrix");
7135					return new CalRGBCS(whitePoint, blackPoint, gamma, matrix);
7136				case "ICCBased":
7137					const stream = xref.fetchIfRef(cs[1]);
7138					const dict = stream.dict;
7139					numComps = dict.get("N");
7140					const alt = dict.get("Alternate");
7141					if (alt) {
7142						const altCS = this._parse(alt, xref, resources, pdfFunctionFactory);
7143						if (altCS.numComps === numComps) {
7144							return altCS;
7145						}
7146						warn("ICCBased color space: Ignoring incorrect /Alternate entry.");
7147					}
7148					if (numComps === 1) {
7149						return this.singletons.gray;
7150					} else if (numComps === 3) {
7151						return this.singletons.rgb;
7152					} else if (numComps === 4) {
7153						return this.singletons.cmyk;
7154					}
7155					break;
7156				case "Pattern":
7157					baseCS = cs[1] || null;
7158					if (baseCS) {
7159						baseCS = this._parse(baseCS, xref, resources, pdfFunctionFactory);
7160					}
7161					return new PatternCS(baseCS);
7162				case "I":
7163				case "Indexed":
7164					baseCS = this._parse(cs[1], xref, resources, pdfFunctionFactory);
7165					const hiVal = Math.max(0, Math.min(xref.fetchIfRef(cs[2]), 255));
7166					const lookup = xref.fetchIfRef(cs[3]);
7167					return new IndexedCS(baseCS, hiVal, lookup);
7168				case "Separation":
7169				case "DeviceN":
7170					const name = xref.fetchIfRef(cs[1]);
7171					numComps = Array.isArray(name) ? name.length : 1;
7172					baseCS = this._parse(cs[2], xref, resources, pdfFunctionFactory);
7173					const tintFn = pdfFunctionFactory.create(cs[3]);
7174					return new AlternateCS(numComps, baseCS, tintFn);
7175				case "Lab":
7176					params = xref.fetchIfRef(cs[1]);
7177					whitePoint = params.getArray("WhitePoint");
7178					blackPoint = params.getArray("BlackPoint");
7179					const range = params.getArray("Range");
7180					return new LabCS(whitePoint, blackPoint, range);
7181				default:
7182					warn(`Unimplemented ColorSpace object: ${mode}`);
7183					return this.singletons.gray;
7184			}
7185		}
7186		warn(`Unrecognized ColorSpace object: ${cs}`);
7187		return this.singletons.gray;
7188	}
7189	static isDefaultDecode(decode, numComps) {
7190		if (!Array.isArray(decode)) {
7191			return true;
7192		}
7193		if (numComps * 2 !== decode.length) {
7194			warn("The decode map is not the correct length");
7195			return true;
7196		}
7197		for (let i = 0, ii = decode.length; i < ii; i += 2) {
7198			if (decode[i] !== 0 || decode[i + 1] !== 1) {
7199				return false;
7200			}
7201		}
7202		return true;
7203	}
7204	static get singletons() {
7205		return shadow(this, "singletons", {
7206			get gray() {
7207				return shadow(this, "gray", new DeviceGrayCS());
7208			},
7209			get rgb() {
7210				return shadow(this, "rgb", new DeviceRgbCS());
7211			},
7212			get rgba() {
7213				return shadow(this, "rgba", new DeviceRgbaCS());
7214			},
7215			get cmyk() {
7216				return shadow(this, "cmyk", new DeviceCmykCS());
7217			}
7218		});
7219	}
7220}
7221class AlternateCS extends ColorSpace {
7222	constructor(numComps, base, tintFn) {
7223		super("Alternate", numComps);
7224		this.base = base;
7225		this.tintFn = tintFn;
7226		this.tmpBuf = new Float32Array(base.numComps);
7227	}
vendor: 31,362 bytes, lines 7228-8269
7228	getRgbItem(src, srcOffset, dest, destOffset) {
7229		const tmpBuf = this.tmpBuf;
7230		this.tintFn(src, srcOffset, tmpBuf, 0);
7231		this.base.getRgbItem(tmpBuf, 0, dest, destOffset);
7232	}
7233	getRgbBuffer(src, srcOffset, count, dest, destOffset, bits, alpha01) {
7234		const tintFn = this.tintFn;
7235		const base = this.base;
7236		const scale = 1 / ((1 << bits) - 1);
7237		const baseNumComps = base.numComps;
7238		const usesZeroToOneRange = base.usesZeroToOneRange;
7239		const isPassthrough = (base.isPassthrough(8) || !usesZeroToOneRange) && alpha01 === 0;
7240		let pos = isPassthrough ? destOffset : 0;
7241		const baseBuf = isPassthrough ? dest : new Uint8ClampedArray(baseNumComps * count);
7242		const numComps = this.numComps;
7243		const scaled = new Float32Array(numComps);
7244		const tinted = new Float32Array(baseNumComps);
7245		let i, j;
7246		for (i = 0; i < count; i++) {
7247			for (j = 0; j < numComps; j++) {
7248				scaled[j] = src[srcOffset++] * scale;
7249			}
7250			tintFn(scaled, 0, tinted, 0);
7251			if (usesZeroToOneRange) {
7252				for (j = 0; j < baseNumComps; j++) {
7253					baseBuf[pos++] = tinted[j] * 255;
7254				}
7255			} else {
7256				base.getRgbItem(tinted, 0, baseBuf, pos);
7257				pos += baseNumComps;
7258			}
7259		}
7260		if (!isPassthrough) {
7261			base.getRgbBuffer(baseBuf, 0, count, dest, destOffset, 8, alpha01);
7262		}
7263	}
7264	getOutputLength(inputLength, alpha01) {
7265		return this.base.getOutputLength(inputLength * this.base.numComps / this.numComps, alpha01);
7266	}
7267}
7268class PatternCS extends ColorSpace {
7269	constructor(baseCS) {
7270		super("Pattern", null);
7271		this.base = baseCS;
7272	}
7273	isDefaultDecode(decodeMap, bpc) {
7274		unreachable("Should not call PatternCS.isDefaultDecode");
7275	}
7276}
7277class IndexedCS extends ColorSpace {
7278	constructor(base, highVal, lookup) {
7279		super("Indexed", 1);
7280		this.base = base;
7281		const length = base.numComps * (highVal + 1);
7282		this.lookup = new Uint8Array(length);
7283		if (lookup instanceof BaseStream) {
7284			const bytes = lookup.getBytes(length);
7285			this.lookup.set(bytes);
7286		} else if (typeof lookup === "string") {
7287			for (let i = 0; i < length; ++i) {
7288				this.lookup[i] = lookup.charCodeAt(i) & 0xff;
7289			}
7290		} else {
7291			throw new FormatError(`IndexedCS - unrecognized lookup table: ${lookup}`);
7292		}
7293	}
7294	getRgbItem(src, srcOffset, dest, destOffset) {
7295		const numComps = this.base.numComps;
7296		const start = src[srcOffset] * numComps;
7297		this.base.getRgbBuffer(this.lookup, start, 1, dest, destOffset, 8, 0);
7298	}
7299	getRgbBuffer(src, srcOffset, count, dest, destOffset, bits, alpha01) {
7300		const base = this.base;
7301		const numComps = base.numComps;
7302		const outputDelta = base.getOutputLength(numComps, alpha01);
7303		const lookup = this.lookup;
7304		for (let i = 0; i < count; ++i) {
7305			const lookupPos = src[srcOffset++] * numComps;
7306			base.getRgbBuffer(lookup, lookupPos, 1, dest, destOffset, 8, alpha01);
7307			destOffset += outputDelta;
7308		}
7309	}
7310	getOutputLength(inputLength, alpha01) {
7311		return this.base.getOutputLength(inputLength * this.base.numComps, alpha01);
7312	}
7313	isDefaultDecode(decodeMap, bpc) {
7314		if (!Array.isArray(decodeMap)) {
7315			return true;
7316		}
7317		if (decodeMap.length !== 2) {
7318			warn("Decode map length is not correct");
7319			return true;
7320		}
7321		if (!Number.isInteger(bpc) || bpc < 1) {
7322			warn("Bits per component is not correct");
7323			return true;
7324		}
7325		return decodeMap[0] === 0 && decodeMap[1] === (1 << bpc) - 1;
7326	}
7327}
7328class DeviceGrayCS extends ColorSpace {
7329	constructor() {
7330		super("DeviceGray", 1);
7331	}
7332	getRgbItem(src, srcOffset, dest, destOffset) {
7333		const c = src[srcOffset] * 255;
7334		dest[destOffset] = dest[destOffset + 1] = dest[destOffset + 2] = c;
7335	}
7336	getRgbBuffer(src, srcOffset, count, dest, destOffset, bits, alpha01) {
7337		const scale = 255 / ((1 << bits) - 1);
7338		let j = srcOffset,
7339			q = destOffset;
7340		for (let i = 0; i < count; ++i) {
7341			const c = scale * src[j++];
7342			dest[q++] = c;
7343			dest[q++] = c;
7344			dest[q++] = c;
7345			q += alpha01;
7346		}
7347	}
7348	getOutputLength(inputLength, alpha01) {
7349		return inputLength * (3 + alpha01);
7350	}
7351}
7352class DeviceRgbCS extends ColorSpace {
7353	constructor() {
7354		super("DeviceRGB", 3);
7355	}
7356	getRgbItem(src, srcOffset, dest, destOffset) {
7357		dest[destOffset] = src[srcOffset] * 255;
7358		dest[destOffset + 1] = src[srcOffset + 1] * 255;
7359		dest[destOffset + 2] = src[srcOffset + 2] * 255;
7360	}
7361	getRgbBuffer(src, srcOffset, count, dest, destOffset, bits, alpha01) {
7362		if (bits === 8 && alpha01 === 0) {
7363			dest.set(src.subarray(srcOffset, srcOffset + count * 3), destOffset);
7364			return;
7365		}
7366		const scale = 255 / ((1 << bits) - 1);
7367		let j = srcOffset,
7368			q = destOffset;
7369		for (let i = 0; i < count; ++i) {
7370			dest[q++] = scale * src[j++];
7371			dest[q++] = scale * src[j++];
7372			dest[q++] = scale * src[j++];
7373			q += alpha01;
7374		}
7375	}
7376	getOutputLength(inputLength, alpha01) {
7377		return inputLength * (3 + alpha01) / 3 | 0;
7378	}
7379	isPassthrough(bits) {
7380		return bits === 8;
7381	}
7382}
7383class DeviceRgbaCS extends ColorSpace {
7384	constructor() {
7385		super("DeviceRGBA", 4);
7386	}
7387	getOutputLength(inputLength, _alpha01) {
7388		return inputLength * 4;
7389	}
7390	isPassthrough(bits) {
7391		return bits === 8;
7392	}
7393	fillRgb(dest, originalWidth, originalHeight, width, height, actualHeight, bpc, comps, alpha01) {
7394		if (originalHeight !== height || originalWidth !== width) {
7395			resizeRgbaImage(comps, dest, originalWidth, originalHeight, width, height, alpha01);
7396		} else {
7397			copyRgbaImage(comps, dest, alpha01);
7398		}
7399	}
7400}
7401class DeviceCmykCS extends ColorSpace {
7402	constructor() {
7403		super("DeviceCMYK", 4);
7404	}
7405	#toRgb(src, srcOffset, srcScale, dest, destOffset) {
7406		const c = src[srcOffset] * srcScale;
7407		const m = src[srcOffset + 1] * srcScale;
7408		const y = src[srcOffset + 2] * srcScale;
7409		const k = src[srcOffset + 3] * srcScale;
7410		dest[destOffset] = 255 + c * (-4.387332384609988 * c + 54.48615194189176 * m + 18.82290502165302 * y + 212.25662451639585 * k + -285.2331026137004) + m * (1.7149763477362134 * m - 5.6096736904047315 * y + -17.873870861415444 * k - 5.497006427196366) + y * (-2.5217340131683033 * y - 21.248923337353073 * k + 17.5119270841813) + k * (-21.86122147463605 * k - 189.48180835922747);
7411		dest[destOffset + 1] = 255 + c * (8.841041422036149 * c + 60.118027045597366 * m + 6.871425592049007 * y + 31.159100130055922 * k + -79.2970844816548) + m * (-15.310361306967817 * m + 17.575251261109482 * y + 131.35250912493976 * k - 190.9453302588951) + y * (4.444339102852739 * y + 9.8632861493405 * k - 24.86741582555878) + k * (-20.737325471181034 * k - 187.80453709719578);
7412		dest[destOffset + 2] = 255 + c * (0.8842522430003296 * c + 8.078677503112928 * m + 30.89978309703729 * y - 0.23883238689178934 * k + -14.183576799673286) + m * (10.49593273432072 * m + 63.02378494754052 * y + 50.606957656360734 * k - 112.23884253719248) + y * (0.03296041114873217 * y + 115.60384449646641 * k + -193.58209356861505) + k * (-22.33816807309886 * k - 180.12613974708367);
7413	}
7414	getRgbItem(src, srcOffset, dest, destOffset) {
7415		this.#toRgb(src, srcOffset, 1, dest, destOffset);
7416	}
7417	getRgbBuffer(src, srcOffset, count, dest, destOffset, bits, alpha01) {
7418		const scale = 1 / ((1 << bits) - 1);
7419		for (let i = 0; i < count; i++) {
7420			this.#toRgb(src, srcOffset, scale, dest, destOffset);
7421			srcOffset += 4;
7422			destOffset += 3 + alpha01;
7423		}
7424	}
7425	getOutputLength(inputLength, alpha01) {
7426		return inputLength / 4 * (3 + alpha01) | 0;
7427	}
7428}
7429class CalGrayCS extends ColorSpace {
7430	constructor(whitePoint, blackPoint, gamma) {
7431		super("CalGray", 1);
7432		if (!whitePoint) {
7433			throw new FormatError("WhitePoint missing - required for color space CalGray");
7434		}
7435		[this.XW, this.YW, this.ZW] = whitePoint;
7436		[this.XB, this.YB, this.ZB] = blackPoint || [0, 0, 0];
7437		this.G = gamma || 1;
7438		if (this.XW < 0 || this.ZW < 0 || this.YW !== 1) {
7439			throw new FormatError(`Invalid WhitePoint components for ${this.name}, no fallback available`);
7440		}
7441		if (this.XB < 0 || this.YB < 0 || this.ZB < 0) {
7442			info(`Invalid BlackPoint for ${this.name}, falling back to default.`);
7443			this.XB = this.YB = this.ZB = 0;
7444		}
7445		if (this.XB !== 0 || this.YB !== 0 || this.ZB !== 0) {
7446			warn(`${this.name}, BlackPoint: XB: ${this.XB}, YB: ${this.YB}, ` + `ZB: ${this.ZB}, only default values are supported.`);
7447		}
7448		if (this.G < 1) {
7449			info(`Invalid Gamma: ${this.G} for ${this.name}, falling back to default.`);
7450			this.G = 1;
7451		}
7452	}
7453	#toRgb(src, srcOffset, dest, destOffset, scale) {
7454		const A = src[srcOffset] * scale;
7455		const AG = A ** this.G;
7456		const L = this.YW * AG;
7457		const val = Math.max(295.8 * L ** 0.3333333333333333 - 40.8, 0);
7458		dest[destOffset] = val;
7459		dest[destOffset + 1] = val;
7460		dest[destOffset + 2] = val;
7461	}
7462	getRgbItem(src, srcOffset, dest, destOffset) {
7463		this.#toRgb(src, srcOffset, dest, destOffset, 1);
7464	}
7465	getRgbBuffer(src, srcOffset, count, dest, destOffset, bits, alpha01) {
7466		const scale = 1 / ((1 << bits) - 1);
7467		for (let i = 0; i < count; ++i) {
7468			this.#toRgb(src, srcOffset, dest, destOffset, scale);
7469			srcOffset += 1;
7470			destOffset += 3 + alpha01;
7471		}
7472	}
7473	getOutputLength(inputLength, alpha01) {
7474		return inputLength * (3 + alpha01);
7475	}
7476}
7477class CalRGBCS extends ColorSpace {
7478	static #BRADFORD_SCALE_MATRIX = new Float32Array([0.8951, 0.2664, -0.1614, -0.7502, 1.7135, 0.0367, 0.0389, -0.0685, 1.0296]);
7479	static #BRADFORD_SCALE_INVERSE_MATRIX = new Float32Array([0.9869929, -0.1470543, 0.1599627, 0.4323053, 0.5183603, 0.0492912, -0.0085287, 0.0400428, 0.9684867]);
7480	static #SRGB_D65_XYZ_TO_RGB_MATRIX = new Float32Array([3.2404542, -1.5371385, -0.4985314, -0.9692660, 1.8760108, 0.0415560, 0.0556434, -0.2040259, 1.0572252]);
7481	static #FLAT_WHITEPOINT_MATRIX = new Float32Array([1, 1, 1]);
7482	static #tempNormalizeMatrix = new Float32Array(3);
7483	static #tempConvertMatrix1 = new Float32Array(3);
7484	static #tempConvertMatrix2 = new Float32Array(3);
7485	static #DECODE_L_CONSTANT = ((8 + 16) / 116) ** 3 / 8.0;
7486	constructor(whitePoint, blackPoint, gamma, matrix) {
7487		super("CalRGB", 3);
7488		if (!whitePoint) {
7489			throw new FormatError("WhitePoint missing - required for color space CalRGB");
7490		}
7491		const [XW, YW, ZW] = this.whitePoint = whitePoint;
7492		const [XB, YB, ZB] = this.blackPoint = blackPoint || new Float32Array(3);
7493		[this.GR, this.GG, this.GB] = gamma || new Float32Array([1, 1, 1]);
7494		[this.MXA, this.MYA, this.MZA, this.MXB, this.MYB, this.MZB, this.MXC, this.MYC, this.MZC] = matrix || new Float32Array([1, 0, 0, 0, 1, 0, 0, 0, 1]);
7495		if (XW < 0 || ZW < 0 || YW !== 1) {
7496			throw new FormatError(`Invalid WhitePoint components for ${this.name}, no fallback available`);
7497		}
7498		if (XB < 0 || YB < 0 || ZB < 0) {
7499			info(`Invalid BlackPoint for ${this.name} [${XB}, ${YB}, ${ZB}], ` + "falling back to default.");
7500			this.blackPoint = new Float32Array(3);
7501		}
7502		if (this.GR < 0 || this.GG < 0 || this.GB < 0) {
7503			info(`Invalid Gamma [${this.GR}, ${this.GG}, ${this.GB}] for ` + `${this.name}, falling back to default.`);
7504			this.GR = this.GG = this.GB = 1;
7505		}
7506	}
7507	#matrixProduct(a, b, result) {
7508		result[0] = a[0] * b[0] + a[1] * b[1] + a[2] * b[2];
7509		result[1] = a[3] * b[0] + a[4] * b[1] + a[5] * b[2];
7510		result[2] = a[6] * b[0] + a[7] * b[1] + a[8] * b[2];
7511	}
7512	#toFlat(sourceWhitePoint, LMS, result) {
7513		result[0] = LMS[0] * 1 / sourceWhitePoint[0];
7514		result[1] = LMS[1] * 1 / sourceWhitePoint[1];
7515		result[2] = LMS[2] * 1 / sourceWhitePoint[2];
7516	}
7517	#toD65(sourceWhitePoint, LMS, result) {
7518		const D65X = 0.95047;
7519		const D65Y = 1;
7520		const D65Z = 1.08883;
7521		result[0] = LMS[0] * D65X / sourceWhitePoint[0];
7522		result[1] = LMS[1] * D65Y / sourceWhitePoint[1];
7523		result[2] = LMS[2] * D65Z / sourceWhitePoint[2];
7524	}
7525	#sRGBTransferFunction(color) {
7526		if (color <= 0.0031308) {
7527			return this.#adjustToRange(0, 1, 12.92 * color);
7528		}
7529		if (color >= 0.99554525) {
7530			return 1;
7531		}
7532		return this.#adjustToRange(0, 1, (1 + 0.055) * color ** (1 / 2.4) - 0.055);
7533	}
7534	#adjustToRange(min, max, value) {
7535		return Math.max(min, Math.min(max, value));
7536	}
7537	#decodeL(L) {
7538		if (L < 0) {
7539			return -this.#decodeL(-L);
7540		}
7541		if (L > 8.0) {
7542			return ((L + 16) / 116) ** 3;
7543		}
7544		return L * CalRGBCS.#DECODE_L_CONSTANT;
7545	}
7546	#compensateBlackPoint(sourceBlackPoint, XYZ_Flat, result) {
7547		if (sourceBlackPoint[0] === 0 && sourceBlackPoint[1] === 0 && sourceBlackPoint[2] === 0) {
7548			result[0] = XYZ_Flat[0];
7549			result[1] = XYZ_Flat[1];
7550			result[2] = XYZ_Flat[2];
7551			return;
7552		}
7553		const zeroDecodeL = this.#decodeL(0);
7554		const X_DST = zeroDecodeL;
7555		const X_SRC = this.#decodeL(sourceBlackPoint[0]);
7556		const Y_DST = zeroDecodeL;
7557		const Y_SRC = this.#decodeL(sourceBlackPoint[1]);
7558		const Z_DST = zeroDecodeL;
7559		const Z_SRC = this.#decodeL(sourceBlackPoint[2]);
7560		const X_Scale = (1 - X_DST) / (1 - X_SRC);
7561		const X_Offset = 1 - X_Scale;
7562		const Y_Scale = (1 - Y_DST) / (1 - Y_SRC);
7563		const Y_Offset = 1 - Y_Scale;
7564		const Z_Scale = (1 - Z_DST) / (1 - Z_SRC);
7565		const Z_Offset = 1 - Z_Scale;
7566		result[0] = XYZ_Flat[0] * X_Scale + X_Offset;
7567		result[1] = XYZ_Flat[1] * Y_Scale + Y_Offset;
7568		result[2] = XYZ_Flat[2] * Z_Scale + Z_Offset;
7569	}
7570	#normalizeWhitePointToFlat(sourceWhitePoint, XYZ_In, result) {
7571		if (sourceWhitePoint[0] === 1 && sourceWhitePoint[2] === 1) {
7572			result[0] = XYZ_In[0];
7573			result[1] = XYZ_In[1];
7574			result[2] = XYZ_In[2];
7575			return;
7576		}
7577		const LMS = result;
7578		this.#matrixProduct(CalRGBCS.#BRADFORD_SCALE_MATRIX, XYZ_In, LMS);
7579		const LMS_Flat = CalRGBCS.#tempNormalizeMatrix;
7580		this.#toFlat(sourceWhitePoint, LMS, LMS_Flat);
7581		this.#matrixProduct(CalRGBCS.#BRADFORD_SCALE_INVERSE_MATRIX, LMS_Flat, result);
7582	}
7583	#normalizeWhitePointToD65(sourceWhitePoint, XYZ_In, result) {
7584		const LMS = result;
7585		this.#matrixProduct(CalRGBCS.#BRADFORD_SCALE_MATRIX, XYZ_In, LMS);
7586		const LMS_D65 = CalRGBCS.#tempNormalizeMatrix;
7587		this.#toD65(sourceWhitePoint, LMS, LMS_D65);
7588		this.#matrixProduct(CalRGBCS.#BRADFORD_SCALE_INVERSE_MATRIX, LMS_D65, result);
7589	}
7590	#toRgb(src, srcOffset, dest, destOffset, scale) {
7591		const A = this.#adjustToRange(0, 1, src[srcOffset] * scale);
7592		const B = this.#adjustToRange(0, 1, src[srcOffset + 1] * scale);
7593		const C = this.#adjustToRange(0, 1, src[srcOffset + 2] * scale);
7594		const AGR = A === 1 ? 1 : A ** this.GR;
7595		const BGG = B === 1 ? 1 : B ** this.GG;
7596		const CGB = C === 1 ? 1 : C ** this.GB;
7597		const X = this.MXA * AGR + this.MXB * BGG + this.MXC * CGB;
7598		const Y = this.MYA * AGR + this.MYB * BGG + this.MYC * CGB;
7599		const Z = this.MZA * AGR + this.MZB * BGG + this.MZC * CGB;
7600		const XYZ = CalRGBCS.#tempConvertMatrix1;
7601		XYZ[0] = X;
7602		XYZ[1] = Y;
7603		XYZ[2] = Z;
7604		const XYZ_Flat = CalRGBCS.#tempConvertMatrix2;
7605		this.#normalizeWhitePointToFlat(this.whitePoint, XYZ, XYZ_Flat);
7606		const XYZ_Black = CalRGBCS.#tempConvertMatrix1;
7607		this.#compensateBlackPoint(this.blackPoint, XYZ_Flat, XYZ_Black);
7608		const XYZ_D65 = CalRGBCS.#tempConvertMatrix2;
7609		this.#normalizeWhitePointToD65(CalRGBCS.#FLAT_WHITEPOINT_MATRIX, XYZ_Black, XYZ_D65);
7610		const SRGB = CalRGBCS.#tempConvertMatrix1;
7611		this.#matrixProduct(CalRGBCS.#SRGB_D65_XYZ_TO_RGB_MATRIX, XYZ_D65, SRGB);
7612		dest[destOffset] = this.#sRGBTransferFunction(SRGB[0]) * 255;
7613		dest[destOffset + 1] = this.#sRGBTransferFunction(SRGB[1]) * 255;
7614		dest[destOffset + 2] = this.#sRGBTransferFunction(SRGB[2]) * 255;
7615	}
7616	getRgbItem(src, srcOffset, dest, destOffset) {
7617		this.#toRgb(src, srcOffset, dest, destOffset, 1);
7618	}
7619	getRgbBuffer(src, srcOffset, count, dest, destOffset, bits, alpha01) {
7620		const scale = 1 / ((1 << bits) - 1);
7621		for (let i = 0; i < count; ++i) {
7622			this.#toRgb(src, srcOffset, dest, destOffset, scale);
7623			srcOffset += 3;
7624			destOffset += 3 + alpha01;
7625		}
7626	}
7627	getOutputLength(inputLength, alpha01) {
7628		return inputLength * (3 + alpha01) / 3 | 0;
7629	}
7630}
7631class LabCS extends ColorSpace {
7632	constructor(whitePoint, blackPoint, range) {
7633		super("Lab", 3);
7634		if (!whitePoint) {
7635			throw new FormatError("WhitePoint missing - required for color space Lab");
7636		}
7637		[this.XW, this.YW, this.ZW] = whitePoint;
7638		[this.amin, this.amax, this.bmin, this.bmax] = range || [-100, 100, -100, 100];
7639		[this.XB, this.YB, this.ZB] = blackPoint || [0, 0, 0];
7640		if (this.XW < 0 || this.ZW < 0 || this.YW !== 1) {
7641			throw new FormatError("Invalid WhitePoint components, no fallback available");
7642		}
7643		if (this.XB < 0 || this.YB < 0 || this.ZB < 0) {
7644			info("Invalid BlackPoint, falling back to default");
7645			this.XB = this.YB = this.ZB = 0;
7646		}
7647		if (this.amin > this.amax || this.bmin > this.bmax) {
7648			info("Invalid Range, falling back to defaults");
7649			this.amin = -100;
7650			this.amax = 100;
7651			this.bmin = -100;
7652			this.bmax = 100;
7653		}
7654	}
7655	#fn_g(x) {
7656		return x >= 6 / 29 ? x ** 3 : 108 / 841 * (x - 4 / 29);
7657	}
7658	#decode(value, high1, low2, high2) {
7659		return low2 + value * (high2 - low2) / high1;
7660	}
7661	#toRgb(src, srcOffset, maxVal, dest, destOffset) {
7662		let Ls = src[srcOffset];
7663		let as = src[srcOffset + 1];
7664		let bs = src[srcOffset + 2];
7665		if (maxVal !== false) {
7666			Ls = this.#decode(Ls, maxVal, 0, 100);
7667			as = this.#decode(as, maxVal, this.amin, this.amax);
7668			bs = this.#decode(bs, maxVal, this.bmin, this.bmax);
7669		}
7670		if (as > this.amax) {
7671			as = this.amax;
7672		} else if (as < this.amin) {
7673			as = this.amin;
7674		}
7675		if (bs > this.bmax) {
7676			bs = this.bmax;
7677		} else if (bs < this.bmin) {
7678			bs = this.bmin;
7679		}
7680		const M = (Ls + 16) / 116;
7681		const L = M + as / 500;
7682		const N = M - bs / 200;
7683		const X = this.XW * this.#fn_g(L);
7684		const Y = this.YW * this.#fn_g(M);
7685		const Z = this.ZW * this.#fn_g(N);
7686		let r, g, b;
7687		if (this.ZW < 1) {
7688			r = X * 3.1339 + Y * -1.617 + Z * -0.4906;
7689			g = X * -0.9785 + Y * 1.916 + Z * 0.0333;
7690			b = X * 0.072 + Y * -0.229 + Z * 1.4057;
7691		} else {
7692			r = X * 3.2406 + Y * -1.5372 + Z * -0.4986;
7693			g = X * -0.9689 + Y * 1.8758 + Z * 0.0415;
7694			b = X * 0.0557 + Y * -0.204 + Z * 1.057;
7695		}
7696		dest[destOffset] = Math.sqrt(r) * 255;
7697		dest[destOffset + 1] = Math.sqrt(g) * 255;
7698		dest[destOffset + 2] = Math.sqrt(b) * 255;
7699	}
7700	getRgbItem(src, srcOffset, dest, destOffset) {
7701		this.#toRgb(src, srcOffset, false, dest, destOffset);
7702	}
7703	getRgbBuffer(src, srcOffset, count, dest, destOffset, bits, alpha01) {
7704		const maxVal = (1 << bits) - 1;
7705		for (let i = 0; i < count; i++) {
7706			this.#toRgb(src, srcOffset, maxVal, dest, destOffset);
7707			srcOffset += 3;
7708			destOffset += 3 + alpha01;
7709		}
7710	}
7711	getOutputLength(inputLength, alpha01) {
7712		return inputLength * (3 + alpha01) / 3 | 0;
7713	}
7714	isDefaultDecode(decodeMap, bpc) {
7715		return true;
7716	}
7717	get usesZeroToOneRange() {
7718		return shadow(this, "usesZeroToOneRange", false);
7719	}
7720}
7721
7722// EXTERNAL MODULE: ./node_modules/core-js/modules/esnext.iterator.for-each.js
7723var esnext_iterator_for_each = __webpack_require__(3949);
7724;// ./src/core/binary_cmap.js
7725
7726
7727
7728
7729
7730
7731
7732function hexToInt(a, size) {
7733	let n = 0;
7734	for (let i = 0; i <= size; i++) {
7735		n = n << 8 | a[i];
7736	}
7737	return n >>> 0;
7738}
7739function hexToStr(a, size) {
7740	if (size === 1) {
7741		return String.fromCharCode(a[0], a[1]);
7742	}
7743	if (size === 3) {
7744		return String.fromCharCode(a[0], a[1], a[2], a[3]);
7745	}
7746	return String.fromCharCode(...a.subarray(0, size + 1));
7747}
7748function addHex(a, b, size) {
7749	let c = 0;
7750	for (let i = size; i >= 0; i--) {
7751		c += a[i] + b[i];
7752		a[i] = c & 255;
7753		c >>= 8;
7754	}
7755}
7756function incHex(a, size) {
7757	let c = 1;
7758	for (let i = size; i >= 0 && c > 0; i--) {
7759		c += a[i];
7760		a[i] = c & 255;
7761		c >>= 8;
7762	}
7763}
7764const MAX_NUM_SIZE = 16;
7765const MAX_ENCODED_NUM_SIZE = 19;
7766class BinaryCMapStream {
7767	constructor(data) {
7768		this.buffer = data;
7769		this.pos = 0;
7770		this.end = data.length;
7771		this.tmpBuf = new Uint8Array(MAX_ENCODED_NUM_SIZE);
7772	}
7773	readByte() {
7774		if (this.pos >= this.end) {
7775			return -1;
7776		}
7777		return this.buffer[this.pos++];
7778	}
7779	readNumber() {
7780		let n = 0;
7781		let last;
7782		do {
7783			const b = this.readByte();
7784			if (b < 0) {
7785				throw new FormatError("unexpected EOF in bcmap");
7786			}
7787			last = !(b & 0x80);
7788			n = n << 7 | b & 0x7f;
7789		} while (!last);
7790		return n;
7791	}
7792	readSigned() {
7793		const n = this.readNumber();
7794		return n & 1 ? ~(n >>> 1) : n >>> 1;
7795	}
7796	readHex(num, size) {
7797		num.set(this.buffer.subarray(this.pos, this.pos + size + 1));
7798		this.pos += size + 1;
7799	}
7800	readHexNumber(num, size) {
7801		let last;
7802		const stack = this.tmpBuf;
7803		let sp = 0;
7804		do {
7805			const b = this.readByte();
7806			if (b < 0) {
7807				throw new FormatError("unexpected EOF in bcmap");
7808			}
7809			last = !(b & 0x80);
7810			stack[sp++] = b & 0x7f;
7811		} while (!last);
7812		let i = size,
7813			buffer = 0,
7814			bufferSize = 0;
7815		while (i >= 0) {
7816			while (bufferSize < 8 && stack.length > 0) {
7817				buffer |= stack[--sp] << bufferSize;
7818				bufferSize += 7;
7819			}
7820			num[i] = buffer & 255;
7821			i--;
7822			buffer >>= 8;
7823			bufferSize -= 8;
7824		}
7825	}
7826	readHexSigned(num, size) {
7827		this.readHexNumber(num, size);
7828		const sign = num[size] & 1 ? 255 : 0;
7829		let c = 0;
7830		for (let i = 0; i <= size; i++) {
7831			c = (c & 1) << 8 | num[i];
7832			num[i] = c >> 1 ^ sign;
7833		}
7834	}
7835	readString() {
7836		const len = this.readNumber(),
7837			buf = new Array(len);
7838		for (let i = 0; i < len; i++) {
7839			buf[i] = this.readNumber();
7840		}
7841		return String.fromCharCode(...buf);
7842	}
7843}
7844class BinaryCMapReader {
7845	async process(data, cMap, extend) {
7846		const stream = new BinaryCMapStream(data);
7847		const header = stream.readByte();
7848		cMap.vertical = !!(header & 1);
7849		let useCMap = null;
7850		const start = new Uint8Array(MAX_NUM_SIZE);
7851		const end = new Uint8Array(MAX_NUM_SIZE);
7852		const char = new Uint8Array(MAX_NUM_SIZE);
7853		const charCode = new Uint8Array(MAX_NUM_SIZE);
7854		const tmp = new Uint8Array(MAX_NUM_SIZE);
7855		let code;
7856		let b;
7857		while ((b = stream.readByte()) >= 0) {
7858			const type = b >> 5;
7859			if (type === 7) {
7860				switch (b & 0x1f) {
7861					case 0:
7862						stream.readString();
7863						break;
7864					case 1:
7865						useCMap = stream.readString();
7866						break;
7867				}
7868				continue;
7869			}
7870			const sequence = !!(b & 0x10);
7871			const dataSize = b & 15;
7872			if (dataSize + 1 > MAX_NUM_SIZE) {
7873				throw new Error("BinaryCMapReader.process: Invalid dataSize.");
7874			}
7875			const ucs2DataSize = 1;
7876			const subitemsCount = stream.readNumber();
7877			switch (type) {
7878				case 0:
7879					stream.readHex(start, dataSize);
7880					stream.readHexNumber(end, dataSize);
7881					addHex(end, start, dataSize);
7882					cMap.addCodespaceRange(dataSize + 1, hexToInt(start, dataSize), hexToInt(end, dataSize));
7883					for (let i = 1; i < subitemsCount; i++) {
7884						incHex(end, dataSize);
7885						stream.readHexNumber(start, dataSize);
7886						addHex(start, end, dataSize);
7887						stream.readHexNumber(end, dataSize);
7888						addHex(end, start, dataSize);
7889						cMap.addCodespaceRange(dataSize + 1, hexToInt(start, dataSize), hexToInt(end, dataSize));
7890					}
7891					break;
7892				case 1:
7893					stream.readHex(start, dataSize);
7894					stream.readHexNumber(end, dataSize);
7895					addHex(end, start, dataSize);
7896					stream.readNumber();
7897					for (let i = 1; i < subitemsCount; i++) {
7898						incHex(end, dataSize);
7899						stream.readHexNumber(start, dataSize);
7900						addHex(start, end, dataSize);
7901						stream.readHexNumber(end, dataSize);
7902						addHex(end, start, dataSize);
7903						stream.readNumber();
7904					}
7905					break;
7906				case 2:
7907					stream.readHex(char, dataSize);
7908					code = stream.readNumber();
7909					cMap.mapOne(hexToInt(char, dataSize), code);
7910					for (let i = 1; i < subitemsCount; i++) {
7911						incHex(char, dataSize);
7912						if (!sequence) {
7913							stream.readHexNumber(tmp, dataSize);
7914							addHex(char, tmp, dataSize);
7915						}
7916						code = stream.readSigned() + (code + 1);
7917						cMap.mapOne(hexToInt(char, dataSize), code);
7918					}
7919					break;
7920				case 3:
7921					stream.readHex(start, dataSize);
7922					stream.readHexNumber(end, dataSize);
7923					addHex(end, start, dataSize);
7924					code = stream.readNumber();
7925					cMap.mapCidRange(hexToInt(start, dataSize), hexToInt(end, dataSize), code);
7926					for (let i = 1; i < subitemsCount; i++) {
7927						incHex(end, dataSize);
7928						if (!sequence) {
7929							stream.readHexNumber(start, dataSize);
7930							addHex(start, end, dataSize);
7931						} else {
7932							start.set(end);
7933						}
7934						stream.readHexNumber(end, dataSize);
7935						addHex(end, start, dataSize);
7936						code = stream.readNumber();
7937						cMap.mapCidRange(hexToInt(start, dataSize), hexToInt(end, dataSize), code);
7938					}
7939					break;
7940				case 4:
7941					stream.readHex(char, ucs2DataSize);
7942					stream.readHex(charCode, dataSize);
7943					cMap.mapOne(hexToInt(char, ucs2DataSize), hexToStr(charCode, dataSize));
7944					for (let i = 1; i < subitemsCount; i++) {
7945						incHex(char, ucs2DataSize);
7946						if (!sequence) {
7947							stream.readHexNumber(tmp, ucs2DataSize);
7948							addHex(char, tmp, ucs2DataSize);
7949						}
7950						incHex(charCode, dataSize);
7951						stream.readHexSigned(tmp, dataSize);
7952						addHex(charCode, tmp, dataSize);
7953						cMap.mapOne(hexToInt(char, ucs2DataSize), hexToStr(charCode, dataSize));
7954					}
7955					break;
7956				case 5:
7957					stream.readHex(start, ucs2DataSize);
7958					stream.readHexNumber(end, ucs2DataSize);
7959					addHex(end, start, ucs2DataSize);
7960					stream.readHex(charCode, dataSize);
7961					cMap.mapBfRange(hexToInt(start, ucs2DataSize), hexToInt(end, ucs2DataSize), hexToStr(charCode, dataSize));
7962					for (let i = 1; i < subitemsCount; i++) {
7963						incHex(end, ucs2DataSize);
7964						if (!sequence) {
7965							stream.readHexNumber(start, ucs2DataSize);
7966							addHex(start, end, ucs2DataSize);
7967						} else {
7968							start.set(end);
7969						}
7970						stream.readHexNumber(end, ucs2DataSize);
7971						addHex(end, start, ucs2DataSize);
7972						stream.readHex(charCode, dataSize);
7973						cMap.mapBfRange(hexToInt(start, ucs2DataSize), hexToInt(end, ucs2DataSize), hexToStr(charCode, dataSize));
7974					}
7975					break;
7976				default:
7977					throw new Error(`BinaryCMapReader.process - unknown type: ${type}`);
7978			}
7979		}
7980		if (useCMap) {
7981			return extend(useCMap);
7982		}
7983		return cMap;
7984	}
7985}
7986
7987;// ./src/core/decode_stream.js
7988
7989
7990
7991
7992
7993
7994
7995
7996
7997
7998
7999const emptyBuffer = new Uint8Array(0);
8000class DecodeStream extends BaseStream {
8001	constructor(maybeMinBufferLength) {
8002		super();
8003		this._rawMinBufferLength = maybeMinBufferLength || 0;
8004		this.pos = 0;
8005		this.bufferLength = 0;
8006		this.eof = false;
8007		this.buffer = emptyBuffer;
8008		this.minBufferLength = 512;
8009		if (maybeMinBufferLength) {
8010			while (this.minBufferLength < maybeMinBufferLength) {
8011				this.minBufferLength *= 2;
8012			}
8013		}
8014	}
8015	get isEmpty() {
8016		while (!this.eof && this.bufferLength === 0) {
8017			this.readBlock();
8018		}
8019		return this.bufferLength === 0;
8020	}
8021	ensureBuffer(requested) {
8022		const buffer = this.buffer;
8023		if (requested <= buffer.byteLength) {
8024			return buffer;
8025		}
8026		let size = this.minBufferLength;
8027		while (size < requested) {
8028			size *= 2;
8029		}
8030		const buffer2 = new Uint8Array(size);
8031		buffer2.set(buffer);
8032		return this.buffer = buffer2;
8033	}
8034	getByte() {
8035		const pos = this.pos;
8036		while (this.bufferLength <= pos) {
8037			if (this.eof) {
8038				return -1;
8039			}
8040			this.readBlock();
8041		}
8042		return this.buffer[this.pos++];
8043	}
8044	getBytes(length, decoderOptions = null) {
8045		const pos = this.pos;
8046		let end;
8047		if (length) {
8048			this.ensureBuffer(pos + length);
8049			end = pos + length;
8050			while (!this.eof && this.bufferLength < end) {
8051				this.readBlock(decoderOptions);
8052			}
8053			const bufEnd = this.bufferLength;
8054			if (end > bufEnd) {
8055				end = bufEnd;
8056			}
8057		} else {
8058			while (!this.eof) {
8059				this.readBlock(decoderOptions);
8060			}
8061			end = this.bufferLength;
8062		}
8063		this.pos = end;
8064		return this.buffer.subarray(pos, end);
8065	}
8066	async getImageData(length, decoderOptions = null) {
8067		if (!this.canAsyncDecodeImageFromBuffer) {
8068			return this.getBytes(length, decoderOptions);
8069		}
8070		const data = await this.stream.asyncGetBytes();
8071		return this.decodeImage(data, decoderOptions);
8072	}
8073	reset() {
8074		this.pos = 0;
8075	}
8076	makeSubStream(start, length, dict = null) {
8077		if (length === undefined) {
8078			while (!this.eof) {
8079				this.readBlock();
8080			}
8081		} else {
8082			const end = start + length;
8083			while (this.bufferLength <= end && !this.eof) {
8084				this.readBlock();
8085			}
8086		}
8087		return new Stream(this.buffer, start, length, dict);
8088	}
8089	getBaseStreams() {
8090		return this.str ? this.str.getBaseStreams() : null;
8091	}
8092}
8093class StreamsSequenceStream extends DecodeStream {
8094	constructor(streams, onError = null) {
8095		streams = streams.filter(s => s instanceof BaseStream);
8096		let maybeLength = 0;
8097		for (const stream of streams) {
8098			maybeLength += stream instanceof DecodeStream ? stream._rawMinBufferLength : stream.length;
8099		}
8100		super(maybeLength);
8101		this.streams = streams;
8102		this._onError = onError;
8103	}
8104	readBlock() {
8105		const streams = this.streams;
8106		if (streams.length === 0) {
8107			this.eof = true;
8108			return;
8109		}
8110		const stream = streams.shift();
8111		let chunk;
8112		try {
8113			chunk = stream.getBytes();
8114		} catch (reason) {
8115			if (this._onError) {
8116				this._onError(reason, stream.dict?.objId);
8117				return;
8118			}
8119			throw reason;
8120		}
8121		const bufferLength = this.bufferLength;
8122		const newLength = bufferLength + chunk.length;
8123		const buffer = this.ensureBuffer(newLength);
8124		buffer.set(chunk, bufferLength);
8125		this.bufferLength = newLength;
8126	}
8127	getBaseStreams() {
8128		const baseStreamsBuf = [];
8129		for (const stream of this.streams) {
8130			const baseStreams = stream.getBaseStreams();
8131			if (baseStreams) {
8132				baseStreamsBuf.push(...baseStreams);
8133			}
8134		}
8135		return baseStreamsBuf.length > 0 ? baseStreamsBuf : null;
8136	}
8137}
8138
8139;// ./src/core/ascii_85_stream.js
8140
8141
8142
8143
8144
8145
8146
8147
8148class Ascii85Stream extends DecodeStream {
8149	constructor(str, maybeLength) {
8150		if (maybeLength) {
8151			maybeLength *= 0.8;
8152		}
8153		super(maybeLength);
8154		this.str = str;
8155		this.dict = str.dict;
8156		this.input = new Uint8Array(5);
8157	}
8158	readBlock() {
8159		const TILDA_CHAR = 0x7e;
8160		const Z_LOWER_CHAR = 0x7a;
8161		const EOF = -1;
8162		const str = this.str;
8163		let c = str.getByte();
8164		while (isWhiteSpace(c)) {
8165			c = str.getByte();
8166		}
8167		if (c === EOF || c === TILDA_CHAR) {
8168			this.eof = true;
8169			return;
8170		}
8171		const bufferLength = this.bufferLength;
8172		let buffer, i;
8173		if (c === Z_LOWER_CHAR) {
8174			buffer = this.ensureBuffer(bufferLength + 4);
8175			for (i = 0; i < 4; ++i) {
8176				buffer[bufferLength + i] = 0;
8177			}
8178			this.bufferLength += 4;
8179		} else {
8180			const input = this.input;
8181			input[0] = c;
8182			for (i = 1; i < 5; ++i) {
8183				c = str.getByte();
8184				while (isWhiteSpace(c)) {
8185					c = str.getByte();
8186				}
8187				input[i] = c;
8188				if (c === EOF || c === TILDA_CHAR) {
8189					break;
8190				}
8191			}
8192			buffer = this.ensureBuffer(bufferLength + i - 1);
8193			this.bufferLength += i - 1;
8194			if (i < 5) {
8195				for (; i < 5; ++i) {
8196					input[i] = 0x21 + 84;
8197				}
8198				this.eof = true;
8199			}
8200			let t = 0;
8201			for (i = 0; i < 5; ++i) {
8202				t = t * 85 + (input[i] - 0x21);
8203			}
8204			for (i = 3; i >= 0; --i) {
8205				buffer[bufferLength + i] = t & 0xff;
8206				t >>= 8;
8207			}
8208		}
8209	}
8210}
8211
8212;// ./src/core/ascii_hex_stream.js
8213
8214class AsciiHexStream extends DecodeStream {
8215	constructor(str, maybeLength) {
8216		if (maybeLength) {
8217			maybeLength *= 0.5;
8218		}
8219		super(maybeLength);
8220		this.str = str;
8221		this.dict = str.dict;
8222		this.firstDigit = -1;
8223	}
8224	readBlock() {
8225		const UPSTREAM_BLOCK_SIZE = 8000;
8226		const bytes = this.str.getBytes(UPSTREAM_BLOCK_SIZE);
8227		if (!bytes.length) {
8228			this.eof = true;
8229			return;
8230		}
8231		const maxDecodeLength = bytes.length + 1 >> 1;
8232		const buffer = this.ensureBuffer(this.bufferLength + maxDecodeLength);
8233		let bufferLength = this.bufferLength;
8234		let firstDigit = this.firstDigit;
8235		for (const ch of bytes) {
8236			let digit;
8237			if (ch >= 0x30 && ch <= 0x39) {
8238				digit = ch & 0x0f;
8239			} else if (ch >= 0x41 && ch <= 0x46 || ch >= 0x61 && ch <= 0x66) {
8240				digit = (ch & 0x0f) + 9;
8241			} else if (ch === 0x3e) {
8242				this.eof = true;
8243				break;
8244			} else {
8245				continue;
8246			}
8247			if (firstDigit < 0) {
8248				firstDigit = digit;
8249			} else {
8250				buffer[bufferLength++] = firstDigit << 4 | digit;
8251				firstDigit = -1;
8252			}
8253		}
8254		if (firstDigit >= 0 && this.eof) {
8255			buffer[bufferLength++] = firstDigit << 4;
8256			firstDigit = -1;
8257		}
8258		this.firstDigit = firstDigit;
8259		this.bufferLength = bufferLength;
8260	}
8261}
8262
8263;// ./src/core/ccitt.js
8264
8265
8266
8267
8268
8269
vendor: 11,245 bytes, lines 8270-8288
8270
8271const ccittEOL = -2;
8272const ccittEOF = -1;
8273const twoDimPass = 0;
8274const twoDimHoriz = 1;
8275const twoDimVert0 = 2;
8276const twoDimVertR1 = 3;
8277const twoDimVertL1 = 4;
8278const twoDimVertR2 = 5;
8279const twoDimVertL2 = 6;
8280const twoDimVertR3 = 7;
8281const twoDimVertL3 = 8;
8282const twoDimTable = [[-1, -1], [-1, -1], [7, twoDimVertL3], [7, twoDimVertR3], [6, twoDimVertL2], [6, twoDimVertL2], [6, twoDimVertR2], [6, twoDimVertR2], [4, twoDimPass], [4, twoDimPass], [4, twoDimPass], [4, twoDimPass], [4, twoDimPass], [4, twoDimPass], [4, twoDimPass], [4, twoDimPass], [3, twoDimHoriz], [3, twoDimHoriz], [3, twoDimHoriz], [3, twoDimHoriz], [3, twoDimHoriz], [3, twoDimHoriz], [3, twoDimHoriz], [3, twoDimHoriz], [3, twoDimHoriz], [3, twoDimHoriz], [3, twoDimHoriz], [3, twoDimHoriz], [3, twoDimHoriz], [3, twoDimHoriz], [3, twoDimHoriz], [3, twoDimHoriz], [3, twoDimVertL1], [3, twoDimVertL1], [3, twoDimVertL1], [3, twoDimVertL1], [3, twoDimVertL1], [3, twoDimVertL1], [3, twoDimVertL1], [3, twoDimVertL1], [3, twoDimVertL1], [3, twoDimVertL1], [3, twoDimVertL1], [3, twoDimVertL1], [3, twoDimVertL1], [3, twoDimVertL1], [3, twoDimVertL1], [3, twoDimVertL1], [3, twoDimVertR1], [3, twoDimVertR1], [3, twoDimVertR1], [3, twoDimVertR1], [3, twoDimVertR1], [3, twoDimVertR1], [3, twoDimVertR1], [3, twoDimVertR1], [3, twoDimVertR1], [3, twoDimVertR1], [3, twoDimVertR1], [3, twoDimVertR1], [3, twoDimVertR1], [3, twoDimVertR1], [3, twoDimVertR1], [3, twoDimVertR1], [1, twoDimVert0], [1, twoDimVert0], [1, twoDimVert0], [1, twoDimVert0], [1, twoDimVert0], [1, twoDimVert0], [1, twoDimVert0], [1, twoDimVert0], [1, twoDimVert0], [1, twoDimVert0], [1, twoDimVert0], [1, twoDimVert0], [1, twoDimVert0], [1, twoDimVert0], [1, twoDimVert0], [1, twoDimVert0], [1, twoDimVert0], [1, twoDimVert0], [1, twoDimVert0], [1, twoDimVert0], [1, twoDimVert0], [1, twoDimVert0], [1, twoDimVert0], [1, twoDimVert0], [1, twoDimVert0], [1, twoDimVert0], [1, twoDimVert0], [1, twoDimVert0], [1, twoDimVert0], [1, twoDimVert0], [1, twoDimVert0], [1, twoDimVert0], [1, twoDimVert0], [1, twoDimVert0], [1, twoDimVert0], [1, twoDimVert0], [1, twoDimVert0], [1, twoDimVert0], [1, twoDimVert0], [1, twoDimVert0], [1, twoDimVert0], [1, twoDimVert0], [1, twoDimVert0], [1, twoDimVert0], [1, twoDimVert0], [1, twoDimVert0], [1, twoDimVert0], [1, twoDimVert0], [1, twoDimVert0], [1, twoDimVert0], [1, twoDimVert0], [1, twoDimVert0], [1, twoDimVert0], [1, twoDimVert0], [1, twoDimVert0], [1, twoDimVert0], [1, twoDimVert0], [1, twoDimVert0], [1, twoDimVert0], [1, twoDimVert0], [1, twoDimVert0], [1, twoDimVert0], [1, twoDimVert0], [1, twoDimVert0]];
8283const whiteTable1 = [[-1, -1], [12, ccittEOL], [-1, -1], [-1, -1], [-1, -1], [-1, -1], [-1, -1], [-1, -1], [-1, -1], [-1, -1], [-1, -1], [-1, -1], [-1, -1], [-1, -1], [-1, -1], [-1, -1], [11, 1792], [11, 1792], [12, 1984], [12, 2048], [12, 2112], [12, 2176], [12, 2240], [12, 2304], [11, 1856], [11, 1856], [11, 1920], [11, 1920], [12, 2368], [12, 2432], [12, 2496], [12, 2560]];
8284const whiteTable2 = [[-1, -1], [-1, -1], [-1, -1], [-1, -1], [8, 29], [8, 29], [8, 30], [8, 30], [8, 45], [8, 45], [8, 46], [8, 46], [7, 22], [7, 22], [7, 22], [7, 22], [7, 23], [7, 23], [7, 23], [7, 23], [8, 47], [8, 47], [8, 48], [8, 48], [6, 13], [6, 13], [6, 13], [6, 13], [6, 13], [6, 13], [6, 13], [6, 13], [7, 20], [7, 20], [7, 20], [7, 20], [8, 33], [8, 33], [8, 34], [8, 34], [8, 35], [8, 35], [8, 36], [8, 36], [8, 37], [8, 37], [8, 38], [8, 38], [7, 19], [7, 19], [7, 19], [7, 19], [8, 31], [8, 31], [8, 32], [8, 32], [6, 1], [6, 1], [6, 1], [6, 1], [6, 1], [6, 1], [6, 1], [6, 1], [6, 12], [6, 12], [6, 12], [6, 12], [6, 12], [6, 12], [6, 12], [6, 12], [8, 53], [8, 53], [8, 54], [8, 54], [7, 26], [7, 26], [7, 26], [7, 26], [8, 39], [8, 39], [8, 40], [8, 40], [8, 41], [8, 41], [8, 42], [8, 42], [8, 43], [8, 43], [8, 44], [8, 44], [7, 21], [7, 21], [7, 21], [7, 21], [7, 28], [7, 28], [7, 28], [7, 28], [8, 61], [8, 61], [8, 62], [8, 62], [8, 63], [8, 63], [8, 0], [8, 0], [8, 320], [8, 320], [8, 384], [8, 384], [5, 10], [5, 10], [5, 10], [5, 10], [5, 10], [5, 10], [5, 10], [5, 10], [5, 10], [5, 10], [5, 10], [5, 10], [5, 10], [5, 10], [5, 10], [5, 10], [5, 11], [5, 11], [5, 11], [5, 11], [5, 11], [5, 11], [5, 11], [5, 11], [5, 11], [5, 11], [5, 11], [5, 11], [5, 11], [5, 11], [5, 11], [5, 11], [7, 27], [7, 27], [7, 27], [7, 27], [8, 59], [8, 59], [8, 60], [8, 60], [9, 1472], [9, 1536], [9, 1600], [9, 1728], [7, 18], [7, 18], [7, 18], [7, 18], [7, 24], [7, 24], [7, 24], [7, 24], [8, 49], [8, 49], [8, 50], [8, 50], [8, 51], [8, 51], [8, 52], [8, 52], [7, 25], [7, 25], [7, 25], [7, 25], [8, 55], [8, 55], [8, 56], [8, 56], [8, 57], [8, 57], [8, 58], [8, 58], [6, 192], [6, 192], [6, 192], [6, 192], [6, 192], [6, 192], [6, 192], [6, 192], [6, 1664], [6, 1664], [6, 1664], [6, 1664], [6, 1664], [6, 1664], [6, 1664], [6, 1664], [8, 448], [8, 448], [8, 512], [8, 512], [9, 704], [9, 768], [8, 640], [8, 640], [8, 576], [8, 576], [9, 832], [9, 896], [9, 960], [9, 1024], [9, 1088], [9, 1152], [9, 1216], [9, 1280], [9, 1344], [9, 1408], [7, 256], [7, 256], [7, 256], [7, 256], [4, 2], [4, 2], [4, 2], [4, 2], [4, 2], [4, 2], [4, 2], [4, 2], [4, 2], [4, 2], [4, 2], [4, 2], [4, 2], [4, 2], [4, 2], [4, 2], [4, 2], [4, 2], [4, 2], [4, 2], [4, 2], [4, 2], [4, 2], [4, 2], [4, 2], [4, 2], [4, 2], [4, 2], [4, 2], [4, 2], [4, 2], [4, 2], [4, 3], [4, 3], [4, 3], [4, 3], [4, 3], [4, 3], [4, 3], [4, 3], [4, 3], [4, 3], [4, 3], [4, 3], [4, 3], [4, 3], [4, 3], [4, 3], [4, 3], [4, 3], [4, 3], [4, 3], [4, 3], [4, 3], [4, 3], [4, 3], [4, 3], [4, 3], [4, 3], [4, 3], [4, 3], [4, 3], [4, 3], [4, 3], [5, 128], [5, 128], [5, 128], [5, 128], [5, 128], [5, 128], [5, 128], [5, 128], [5, 128], [5, 128], [5, 128], [5, 128], [5, 128], [5, 128], [5, 128], [5, 128], [5, 8], [5, 8], [5, 8], [5, 8], [5, 8], [5, 8], [5, 8], [5, 8], [5, 8], [5, 8], [5, 8], [5, 8], [5, 8], [5, 8], [5, 8], [5, 8], [5, 9], [5, 9], [5, 9], [5, 9], [5, 9], [5, 9], [5, 9], [5, 9], [5, 9], [5, 9], [5, 9], [5, 9], [5, 9], [5, 9], [5, 9], [5, 9], [6, 16], [6, 16], [6, 16], [6, 16], [6, 16], [6, 16], [6, 16], [6, 16], [6, 17], [6, 17], [6, 17], [6, 17], [6, 17], [6, 17], [6, 17], [6, 17], [4, 4], [4, 4], [4, 4], [4, 4], [4, 4], [4, 4], [4, 4], [4, 4], [4, 4], [4, 4], [4, 4], [4, 4], [4, 4], [4, 4], [4, 4], [4, 4], [4, 4], [4, 4], [4, 4], [4, 4], [4, 4], [4, 4], [4, 4], [4, 4], [4, 4], [4, 4], [4, 4], [4, 4], [4, 4], [4, 4], [4, 4], [4, 4], [4, 5], [4, 5], [4, 5], [4, 5], [4, 5], [4, 5], [4, 5], [4, 5], [4, 5], [4, 5], [4, 5], [4, 5], [4, 5], [4, 5], [4, 5], [4, 5], [4, 5], [4, 5], [4, 5], [4, 5], [4, 5], [4, 5], [4, 5], [4, 5], [4, 5], [4, 5], [4, 5], [4, 5], [4, 5], [4, 5], [4, 5], [4, 5], [6, 14], [6, 14], [6, 14], [6, 14], [6, 14], [6, 14], [6, 14], [6, 14], [6, 15], [6, 15], [6, 15], [6, 15], [6, 15], [6, 15], [6, 15], [6, 15], [5, 64], [5, 64], [5, 64], [5, 64], [5, 64], [5, 64], [5, 64], [5, 64], [5, 64], [5, 64], [5, 64], [5, 64], [5, 64], [5, 64], [5, 64], [5, 64], [4, 6], [4, 6], [4, 6], [4, 6], [4, 6], [4, 6], [4, 6], [4, 6], [4, 6], [4, 6], [4, 6], [4, 6], [4, 6], [4, 6], [4, 6], [4, 6], [4, 6], [4, 6], [4, 6], [4, 6], [4, 6], [4, 6], [4, 6], [4, 6], [4, 6], [4, 6], [4, 6], [4, 6], [4, 6], [4, 6], [4, 6], [4, 6], [4, 7], [4, 7], [4, 7], [4, 7], [4, 7], [4, 7], [4, 7], [4, 7], [4, 7], [4, 7], [4, 7], [4, 7], [4, 7], [4, 7], [4, 7], [4, 7], [4, 7], [4, 7], [4, 7], [4, 7], [4, 7], [4, 7], [4, 7], [4, 7], [4, 7], [4, 7], [4, 7], [4, 7], [4, 7], [4, 7], [4, 7], [4, 7]];
8285const blackTable1 = [[-1, -1], [-1, -1], [12, ccittEOL], [12, ccittEOL], [-1, -1], [-1, -1], [-1, -1], [-1, -1], [-1, -1], [-1, -1], [-1, -1], [-1, -1], [-1, -1], [-1, -1], [-1, -1], [-1, -1], [-1, -1], [-1, -1], [-1, -1], [-1, -1], [-1, -1], [-1, -1], [-1, -1], [-1, -1], [-1, -1], [-1, -1], [-1, -1], [-1, -1], [-1, -1], [-1, -1], [-1, -1], [-1, -1], [11, 1792], [11, 1792], [11, 1792], [11, 1792], [12, 1984], [12, 1984], [12, 2048], [12, 2048], [12, 2112], [12, 2112], [12, 2176], [12, 2176], [12, 2240], [12, 2240], [12, 2304], [12, 2304], [11, 1856], [11, 1856], [11, 1856], [11, 1856], [11, 1920], [11, 1920], [11, 1920], [11, 1920], [12, 2368], [12, 2368], [12, 2432], [12, 2432], [12, 2496], [12, 2496], [12, 2560], [12, 2560], [10, 18], [10, 18], [10, 18], [10, 18], [10, 18], [10, 18], [10, 18], [10, 18], [12, 52], [12, 52], [13, 640], [13, 704], [13, 768], [13, 832], [12, 55], [12, 55], [12, 56], [12, 56], [13, 1280], [13, 1344], [13, 1408], [13, 1472], [12, 59], [12, 59], [12, 60], [12, 60], [13, 1536], [13, 1600], [11, 24], [11, 24], [11, 24], [11, 24], [11, 25], [11, 25], [11, 25], [11, 25], [13, 1664], [13, 1728], [12, 320], [12, 320], [12, 384], [12, 384], [12, 448], [12, 448], [13, 512], [13, 576], [12, 53], [12, 53], [12, 54], [12, 54], [13, 896], [13, 960], [13, 1024], [13, 1088], [13, 1152], [13, 1216], [10, 64], [10, 64], [10, 64], [10, 64], [10, 64], [10, 64], [10, 64], [10, 64]];
8286const blackTable2 = [[8, 13], [8, 13], [8, 13], [8, 13], [8, 13], [8, 13], [8, 13], [8, 13], [8, 13], [8, 13], [8, 13], [8, 13], [8, 13], [8, 13], [8, 13], [8, 13], [11, 23], [11, 23], [12, 50], [12, 51], [12, 44], [12, 45], [12, 46], [12, 47], [12, 57], [12, 58], [12, 61], [12, 256], [10, 16], [10, 16], [10, 16], [10, 16], [10, 17], [10, 17], [10, 17], [10, 17], [12, 48], [12, 49], [12, 62], [12, 63], [12, 30], [12, 31], [12, 32], [12, 33], [12, 40], [12, 41], [11, 22], [11, 22], [8, 14], [8, 14], [8, 14], [8, 14], [8, 14], [8, 14], [8, 14], [8, 14], [8, 14], [8, 14], [8, 14], [8, 14], [8, 14], [8, 14], [8, 14], [8, 14], [7, 10], [7, 10], [7, 10], [7, 10], [7, 10], [7, 10], [7, 10], [7, 10], [7, 10], [7, 10], [7, 10], [7, 10], [7, 10], [7, 10], [7, 10], [7, 10], [7, 10], [7, 10], [7, 10], [7, 10], [7, 10], [7, 10], [7, 10], [7, 10], [7, 10], [7, 10], [7, 10], [7, 10], [7, 10], [7, 10], [7, 10], [7, 10], [7, 11], [7, 11], [7, 11], [7, 11], [7, 11], [7, 11], [7, 11], [7, 11], [7, 11], [7, 11], [7, 11], [7, 11], [7, 11], [7, 11], [7, 11], [7, 11], [7, 11], [7, 11], [7, 11], [7, 11], [7, 11], [7, 11], [7, 11], [7, 11], [7, 11], [7, 11], [7, 11], [7, 11], [7, 11], [7, 11], [7, 11], [7, 11], [9, 15], [9, 15], [9, 15], [9, 15], [9, 15], [9, 15], [9, 15], [9, 15], [12, 128], [12, 192], [12, 26], [12, 27], [12, 28], [12, 29], [11, 19], [11, 19], [11, 20], [11, 20], [12, 34], [12, 35], [12, 36], [12, 37], [12, 38], [12, 39], [11, 21], [11, 21], [12, 42], [12, 43], [10, 0], [10, 0], [10, 0], [10, 0], [7, 12], [7, 12], [7, 12], [7, 12], [7, 12], [7, 12], [7, 12], [7, 12], [7, 12], [7, 12], [7, 12], [7, 12], [7, 12], [7, 12], [7, 12], [7, 12], [7, 12], [7, 12], [7, 12], [7, 12], [7, 12], [7, 12], [7, 12], [7, 12], [7, 12], [7, 12], [7, 12], [7, 12], [7, 12], [7, 12], [7, 12], [7, 12]];
8287const blackTable3 = [[-1, -1], [-1, -1], [-1, -1], [-1, -1], [6, 9], [6, 8], [5, 7], [5, 7], [4, 6], [4, 6], [4, 6], [4, 6], [4, 5], [4, 5], [4, 5], [4, 5], [3, 1], [3, 1], [3, 1], [3, 1], [3, 1], [3, 1], [3, 1], [3, 1], [3, 4], [3, 4], [3, 4], [3, 4], [3, 4], [3, 4], [3, 4], [3, 4], [2, 3], [2, 3], [2, 3], [2, 3], [2, 3], [2, 3], [2, 3], [2, 3], [2, 3], [2, 3], [2, 3], [2, 3], [2, 3], [2, 3], [2, 3], [2, 3], [2, 2], [2, 2], [2, 2], [2, 2], [2, 2], [2, 2], [2, 2], [2, 2], [2, 2], [2, 2], [2, 2], [2, 2], [2, 2], [2, 2], [2, 2], [2, 2]];
8288class CCITTFaxDecoder {
vendor: 13,332 bytes, lines 8289-8825
8289	constructor(source, options = {}) {
8290		if (typeof source?.next !== "function") {
8291			throw new Error('CCITTFaxDecoder - invalid "source" parameter.');
8292		}
8293		this.source = source;
8294		this.eof = false;
8295		this.encoding = options.K || 0;
8296		this.eoline = options.EndOfLine || false;
8297		this.byteAlign = options.EncodedByteAlign || false;
8298		this.columns = options.Columns || 1728;
8299		this.rows = options.Rows || 0;
8300		this.eoblock = options.EndOfBlock ?? true;
8301		this.black = options.BlackIs1 || false;
8302		this.codingLine = new Uint32Array(this.columns + 1);
8303		this.refLine = new Uint32Array(this.columns + 2);
8304		this.codingLine[0] = this.columns;
8305		this.codingPos = 0;
8306		this.row = 0;
8307		this.nextLine2D = this.encoding < 0;
8308		this.inputBits = 0;
8309		this.inputBuf = 0;
8310		this.outputBits = 0;
8311		this.rowsDone = false;
8312		let code1;
8313		while ((code1 = this._lookBits(12)) === 0) {
8314			this._eatBits(1);
8315		}
8316		if (code1 === 1) {
8317			this._eatBits(12);
8318		}
8319		if (this.encoding > 0) {
8320			this.nextLine2D = !this._lookBits(1);
8321			this._eatBits(1);
8322		}
8323	}
8324	readNextChar() {
8325		if (this.eof) {
8326			return -1;
8327		}
8328		const refLine = this.refLine;
8329		const codingLine = this.codingLine;
8330		const columns = this.columns;
8331		let refPos, blackPixels, bits, i;
8332		if (this.outputBits === 0) {
8333			if (this.rowsDone) {
8334				this.eof = true;
8335			}
8336			if (this.eof) {
8337				return -1;
8338			}
8339			this.err = false;
8340			let code1, code2, code3;
8341			if (this.nextLine2D) {
8342				for (i = 0; codingLine[i] < columns; ++i) {
8343					refLine[i] = codingLine[i];
8344				}
8345				refLine[i++] = columns;
8346				refLine[i] = columns;
8347				codingLine[0] = 0;
8348				this.codingPos = 0;
8349				refPos = 0;
8350				blackPixels = 0;
8351				while (codingLine[this.codingPos] < columns) {
8352					code1 = this._getTwoDimCode();
8353					switch (code1) {
8354						case twoDimPass:
8355							this._addPixels(refLine[refPos + 1], blackPixels);
8356							if (refLine[refPos + 1] < columns) {
8357								refPos += 2;
8358							}
8359							break;
8360						case twoDimHoriz:
8361							code1 = code2 = 0;
8362							if (blackPixels) {
8363								do {
8364									code1 += code3 = this._getBlackCode();
8365								} while (code3 >= 64);
8366								do {
8367									code2 += code3 = this._getWhiteCode();
8368								} while (code3 >= 64);
8369							} else {
8370								do {
8371									code1 += code3 = this._getWhiteCode();
8372								} while (code3 >= 64);
8373								do {
8374									code2 += code3 = this._getBlackCode();
8375								} while (code3 >= 64);
8376							}
8377							this._addPixels(codingLine[this.codingPos] + code1, blackPixels);
8378							if (codingLine[this.codingPos] < columns) {
8379								this._addPixels(codingLine[this.codingPos] + code2, blackPixels ^ 1);
8380							}
8381							while (refLine[refPos] <= codingLine[this.codingPos] && refLine[refPos] < columns) {
8382								refPos += 2;
8383							}
8384							break;
8385						case twoDimVertR3:
8386							this._addPixels(refLine[refPos] + 3, blackPixels);
8387							blackPixels ^= 1;
8388							if (codingLine[this.codingPos] < columns) {
8389								++refPos;
8390								while (refLine[refPos] <= codingLine[this.codingPos] && refLine[refPos] < columns) {
8391									refPos += 2;
8392								}
8393							}
8394							break;
8395						case twoDimVertR2:
8396							this._addPixels(refLine[refPos] + 2, blackPixels);
8397							blackPixels ^= 1;
8398							if (codingLine[this.codingPos] < columns) {
8399								++refPos;
8400								while (refLine[refPos] <= codingLine[this.codingPos] && refLine[refPos] < columns) {
8401									refPos += 2;
8402								}
8403							}
8404							break;
8405						case twoDimVertR1:
8406							this._addPixels(refLine[refPos] + 1, blackPixels);
8407							blackPixels ^= 1;
8408							if (codingLine[this.codingPos] < columns) {
8409								++refPos;
8410								while (refLine[refPos] <= codingLine[this.codingPos] && refLine[refPos] < columns) {
8411									refPos += 2;
8412								}
8413							}
8414							break;
8415						case twoDimVert0:
8416							this._addPixels(refLine[refPos], blackPixels);
8417							blackPixels ^= 1;
8418							if (codingLine[this.codingPos] < columns) {
8419								++refPos;
8420								while (refLine[refPos] <= codingLine[this.codingPos] && refLine[refPos] < columns) {
8421									refPos += 2;
8422								}
8423							}
8424							break;
8425						case twoDimVertL3:
8426							this._addPixelsNeg(refLine[refPos] - 3, blackPixels);
8427							blackPixels ^= 1;
8428							if (codingLine[this.codingPos] < columns) {
8429								if (refPos > 0) {
8430									--refPos;
8431								} else {
8432									++refPos;
8433								}
8434								while (refLine[refPos] <= codingLine[this.codingPos] && refLine[refPos] < columns) {
8435									refPos += 2;
8436								}
8437							}
8438							break;
8439						case twoDimVertL2:
8440							this._addPixelsNeg(refLine[refPos] - 2, blackPixels);
8441							blackPixels ^= 1;
8442							if (codingLine[this.codingPos] < columns) {
8443								if (refPos > 0) {
8444									--refPos;
8445								} else {
8446									++refPos;
8447								}
8448								while (refLine[refPos] <= codingLine[this.codingPos] && refLine[refPos] < columns) {
8449									refPos += 2;
8450								}
8451							}
8452							break;
8453						case twoDimVertL1:
8454							this._addPixelsNeg(refLine[refPos] - 1, blackPixels);
8455							blackPixels ^= 1;
8456							if (codingLine[this.codingPos] < columns) {
8457								if (refPos > 0) {
8458									--refPos;
8459								} else {
8460									++refPos;
8461								}
8462								while (refLine[refPos] <= codingLine[this.codingPos] && refLine[refPos] < columns) {
8463									refPos += 2;
8464								}
8465							}
8466							break;
8467						case ccittEOF:
8468							this._addPixels(columns, 0);
8469							this.eof = true;
8470							break;
8471						default:
8472							info("bad 2d code");
8473							this._addPixels(columns, 0);
8474							this.err = true;
8475					}
8476				}
8477			} else {
8478				codingLine[0] = 0;
8479				this.codingPos = 0;
8480				blackPixels = 0;
8481				while (codingLine[this.codingPos] < columns) {
8482					code1 = 0;
8483					if (blackPixels) {
8484						do {
8485							code1 += code3 = this._getBlackCode();
8486						} while (code3 >= 64);
8487					} else {
8488						do {
8489							code1 += code3 = this._getWhiteCode();
8490						} while (code3 >= 64);
8491					}
8492					this._addPixels(codingLine[this.codingPos] + code1, blackPixels);
8493					blackPixels ^= 1;
8494				}
8495			}
8496			let gotEOL = false;
8497			if (this.byteAlign) {
8498				this.inputBits &= ~7;
8499			}
8500			if (!this.eoblock && this.row === this.rows - 1) {
8501				this.rowsDone = true;
8502			} else {
8503				code1 = this._lookBits(12);
8504				if (this.eoline) {
8505					while (code1 !== ccittEOF && code1 !== 1) {
8506						this._eatBits(1);
8507						code1 = this._lookBits(12);
8508					}
8509				} else {
8510					while (code1 === 0) {
8511						this._eatBits(1);
8512						code1 = this._lookBits(12);
8513					}
8514				}
8515				if (code1 === 1) {
8516					this._eatBits(12);
8517					gotEOL = true;
8518				} else if (code1 === ccittEOF) {
8519					this.eof = true;
8520				}
8521			}
8522			if (!this.eof && this.encoding > 0 && !this.rowsDone) {
8523				this.nextLine2D = !this._lookBits(1);
8524				this._eatBits(1);
8525			}
8526			if (this.eoblock && gotEOL && this.byteAlign) {
8527				code1 = this._lookBits(12);
8528				if (code1 === 1) {
8529					this._eatBits(12);
8530					if (this.encoding > 0) {
8531						this._lookBits(1);
8532						this._eatBits(1);
8533					}
8534					if (this.encoding >= 0) {
8535						for (i = 0; i < 4; ++i) {
8536							code1 = this._lookBits(12);
8537							if (code1 !== 1) {
8538								info("bad rtc code: " + code1);
8539							}
8540							this._eatBits(12);
8541							if (this.encoding > 0) {
8542								this._lookBits(1);
8543								this._eatBits(1);
8544							}
8545						}
8546					}
8547					this.eof = true;
8548				}
8549			} else if (this.err && this.eoline) {
8550				while (true) {
8551					code1 = this._lookBits(13);
8552					if (code1 === ccittEOF) {
8553						this.eof = true;
8554						return -1;
8555					}
8556					if (code1 >> 1 === 1) {
8557						break;
8558					}
8559					this._eatBits(1);
8560				}
8561				this._eatBits(12);
8562				if (this.encoding > 0) {
8563					this._eatBits(1);
8564					this.nextLine2D = !(code1 & 1);
8565				}
8566			}
8567			this.outputBits = codingLine[0] > 0 ? codingLine[this.codingPos = 0] : codingLine[this.codingPos = 1];
8568			this.row++;
8569		}
8570		let c;
8571		if (this.outputBits >= 8) {
8572			c = this.codingPos & 1 ? 0 : 0xff;
8573			this.outputBits -= 8;
8574			if (this.outputBits === 0 && codingLine[this.codingPos] < columns) {
8575				this.codingPos++;
8576				this.outputBits = codingLine[this.codingPos] - codingLine[this.codingPos - 1];
8577			}
8578		} else {
8579			bits = 8;
8580			c = 0;
8581			do {
8582				if (typeof this.outputBits !== "number") {
8583					throw new FormatError('Invalid /CCITTFaxDecode data, "outputBits" must be a number.');
8584				}
8585				if (this.outputBits > bits) {
8586					c <<= bits;
8587					if (!(this.codingPos & 1)) {
8588						c |= 0xff >> 8 - bits;
8589					}
8590					this.outputBits -= bits;
8591					bits = 0;
8592				} else {
8593					c <<= this.outputBits;
8594					if (!(this.codingPos & 1)) {
8595						c |= 0xff >> 8 - this.outputBits;
8596					}
8597					bits -= this.outputBits;
8598					this.outputBits = 0;
8599					if (codingLine[this.codingPos] < columns) {
8600						this.codingPos++;
8601						this.outputBits = codingLine[this.codingPos] - codingLine[this.codingPos - 1];
8602					} else if (bits > 0) {
8603						c <<= bits;
8604						bits = 0;
8605					}
8606				}
8607			} while (bits);
8608		}
8609		if (this.black) {
8610			c ^= 0xff;
8611		}
8612		return c;
8613	}
8614	_addPixels(a1, blackPixels) {
8615		const codingLine = this.codingLine;
8616		let codingPos = this.codingPos;
8617		if (a1 > codingLine[codingPos]) {
8618			if (a1 > this.columns) {
8619				info("row is wrong length");
8620				this.err = true;
8621				a1 = this.columns;
8622			}
8623			if (codingPos & 1 ^ blackPixels) {
8624				++codingPos;
8625			}
8626			codingLine[codingPos] = a1;
8627		}
8628		this.codingPos = codingPos;
8629	}
8630	_addPixelsNeg(a1, blackPixels) {
8631		const codingLine = this.codingLine;
8632		let codingPos = this.codingPos;
8633		if (a1 > codingLine[codingPos]) {
8634			if (a1 > this.columns) {
8635				info("row is wrong length");
8636				this.err = true;
8637				a1 = this.columns;
8638			}
8639			if (codingPos & 1 ^ blackPixels) {
8640				++codingPos;
8641			}
8642			codingLine[codingPos] = a1;
8643		} else if (a1 < codingLine[codingPos]) {
8644			if (a1 < 0) {
8645				info("invalid code");
8646				this.err = true;
8647				a1 = 0;
8648			}
8649			while (codingPos > 0 && a1 < codingLine[codingPos - 1]) {
8650				--codingPos;
8651			}
8652			codingLine[codingPos] = a1;
8653		}
8654		this.codingPos = codingPos;
8655	}
8656	_findTableCode(start, end, table, limit) {
8657		const limitValue = limit || 0;
8658		for (let i = start; i <= end; ++i) {
8659			let code = this._lookBits(i);
8660			if (code === ccittEOF) {
8661				return [true, 1, false];
8662			}
8663			if (i < end) {
8664				code <<= end - i;
8665			}
8666			if (!limitValue || code >= limitValue) {
8667				const p = table[code - limitValue];
8668				if (p[0] === i) {
8669					this._eatBits(i);
8670					return [true, p[1], true];
8671				}
8672			}
8673		}
8674		return [false, 0, false];
8675	}
8676	_getTwoDimCode() {
8677		let code = 0;
8678		let p;
8679		if (this.eoblock) {
8680			code = this._lookBits(7);
8681			p = twoDimTable[code];
8682			if (p?.[0] > 0) {
8683				this._eatBits(p[0]);
8684				return p[1];
8685			}
8686		} else {
8687			const result = this._findTableCode(1, 7, twoDimTable);
8688			if (result[0] && result[2]) {
8689				return result[1];
8690			}
8691		}
8692		info("Bad two dim code");
8693		return ccittEOF;
8694	}
8695	_getWhiteCode() {
8696		let code = 0;
8697		let p;
8698		if (this.eoblock) {
8699			code = this._lookBits(12);
8700			if (code === ccittEOF) {
8701				return 1;
8702			}
8703			p = code >> 5 === 0 ? whiteTable1[code] : whiteTable2[code >> 3];
8704			if (p[0] > 0) {
8705				this._eatBits(p[0]);
8706				return p[1];
8707			}
8708		} else {
8709			let result = this._findTableCode(1, 9, whiteTable2);
8710			if (result[0]) {
8711				return result[1];
8712			}
8713			result = this._findTableCode(11, 12, whiteTable1);
8714			if (result[0]) {
8715				return result[1];
8716			}
8717		}
8718		info("bad white code");
8719		this._eatBits(1);
8720		return 1;
8721	}
8722	_getBlackCode() {
8723		let code, p;
8724		if (this.eoblock) {
8725			code = this._lookBits(13);
8726			if (code === ccittEOF) {
8727				return 1;
8728			}
8729			if (code >> 7 === 0) {
8730				p = blackTable1[code];
8731			} else if (code >> 9 === 0 && code >> 7 !== 0) {
8732				p = blackTable2[(code >> 1) - 64];
8733			} else {
8734				p = blackTable3[code >> 7];
8735			}
8736			if (p[0] > 0) {
8737				this._eatBits(p[0]);
8738				return p[1];
8739			}
8740		} else {
8741			let result = this._findTableCode(2, 6, blackTable3);
8742			if (result[0]) {
8743				return result[1];
8744			}
8745			result = this._findTableCode(7, 12, blackTable2, 64);
8746			if (result[0]) {
8747				return result[1];
8748			}
8749			result = this._findTableCode(10, 13, blackTable1);
8750			if (result[0]) {
8751				return result[1];
8752			}
8753		}
8754		info("bad black code");
8755		this._eatBits(1);
8756		return 1;
8757	}
8758	_lookBits(n) {
8759		let c;
8760		while (this.inputBits < n) {
8761			if ((c = this.source.next()) === -1) {
8762				if (this.inputBits === 0) {
8763					return ccittEOF;
8764				}
8765				return this.inputBuf << n - this.inputBits & 0xffff >> 16 - n;
8766			}
8767			this.inputBuf = this.inputBuf << 8 | c;
8768			this.inputBits += 8;
8769		}
8770		return this.inputBuf >> this.inputBits - n & 0xffff >> 16 - n;
8771	}
8772	_eatBits(n) {
8773		if ((this.inputBits -= n) < 0) {
8774			this.inputBits = 0;
8775		}
8776	}
8777}
8778
8779;// ./src/core/ccitt_stream.js
8780
8781
8782
8783class CCITTFaxStream extends DecodeStream {
8784	constructor(str, maybeLength, params) {
8785		super(maybeLength);
8786		this.str = str;
8787		this.dict = str.dict;
8788		if (!(params instanceof Dict)) {
8789			params = Dict.empty;
8790		}
8791		const source = {
8792			next() {
8793				return str.getByte();
8794			}
8795		};
8796		this.ccittFaxDecoder = new CCITTFaxDecoder(source, {
8797			K: params.get("K"),
8798			EndOfLine: params.get("EndOfLine"),
8799			EncodedByteAlign: params.get("EncodedByteAlign"),
8800			Columns: params.get("Columns"),
8801			Rows: params.get("Rows"),
8802			EndOfBlock: params.get("EndOfBlock"),
8803			BlackIs1: params.get("BlackIs1")
8804		});
8805	}
8806	readBlock() {
8807		while (!this.eof) {
8808			const c = this.ccittFaxDecoder.readNextChar();
8809			if (c === -1) {
8810				this.eof = true;
8811				return;
8812			}
8813			this.ensureBuffer(this.bufferLength + 1);
8814			this.buffer[this.bufferLength++] = c;
8815		}
8816	}
8817}
8818
8819;// ./src/core/flate_stream.js
8820
8821
8822
8823
8824
8825
vendor: 5,768 bytes, lines 8826-8835
8826
8827
8828
8829
8830const codeLenCodeMap = new Int32Array([16, 17, 18, 0, 8, 7, 9, 6, 10, 5, 11, 4, 12, 3, 13, 2, 14, 1, 15]);
8831const lengthDecode = new Int32Array([0x00003, 0x00004, 0x00005, 0x00006, 0x00007, 0x00008, 0x00009, 0x0000a, 0x1000b, 0x1000d, 0x1000f, 0x10011, 0x20013, 0x20017, 0x2001b, 0x2001f, 0x30023, 0x3002b, 0x30033, 0x3003b, 0x40043, 0x40053, 0x40063, 0x40073, 0x50083, 0x500a3, 0x500c3, 0x500e3, 0x00102, 0x00102, 0x00102]);
8832const distDecode = new Int32Array([0x00001, 0x00002, 0x00003, 0x00004, 0x10005, 0x10007, 0x20009, 0x2000d, 0x30011, 0x30019, 0x40021, 0x40031, 0x50041, 0x50061, 0x60081, 0x600c1, 0x70101, 0x70181, 0x80201, 0x80301, 0x90401, 0x90601, 0xa0801, 0xa0c01, 0xb1001, 0xb1801, 0xc2001, 0xc3001, 0xd4001, 0xd6001]);
8833const fixedLitCodeTab = [new Int32Array([0x70100, 0x80050, 0x80010, 0x80118, 0x70110, 0x80070, 0x80030, 0x900c0, 0x70108, 0x80060, 0x80020, 0x900a0, 0x80000, 0x80080, 0x80040, 0x900e0, 0x70104, 0x80058, 0x80018, 0x90090, 0x70114, 0x80078, 0x80038, 0x900d0, 0x7010c, 0x80068, 0x80028, 0x900b0, 0x80008, 0x80088, 0x80048, 0x900f0, 0x70102, 0x80054, 0x80014, 0x8011c, 0x70112, 0x80074, 0x80034, 0x900c8, 0x7010a, 0x80064, 0x80024, 0x900a8, 0x80004, 0x80084, 0x80044, 0x900e8, 0x70106, 0x8005c, 0x8001c, 0x90098, 0x70116, 0x8007c, 0x8003c, 0x900d8, 0x7010e, 0x8006c, 0x8002c, 0x900b8, 0x8000c, 0x8008c, 0x8004c, 0x900f8, 0x70101, 0x80052, 0x80012, 0x8011a, 0x70111, 0x80072, 0x80032, 0x900c4, 0x70109, 0x80062, 0x80022, 0x900a4, 0x80002, 0x80082, 0x80042, 0x900e4, 0x70105, 0x8005a, 0x8001a, 0x90094, 0x70115, 0x8007a, 0x8003a, 0x900d4, 0x7010d, 0x8006a, 0x8002a, 0x900b4, 0x8000a, 0x8008a, 0x8004a, 0x900f4, 0x70103, 0x80056, 0x80016, 0x8011e, 0x70113, 0x80076, 0x80036, 0x900cc, 0x7010b, 0x80066, 0x80026, 0x900ac, 0x80006, 0x80086, 0x80046, 0x900ec, 0x70107, 0x8005e, 0x8001e, 0x9009c, 0x70117, 0x8007e, 0x8003e, 0x900dc, 0x7010f, 0x8006e, 0x8002e, 0x900bc, 0x8000e, 0x8008e, 0x8004e, 0x900fc, 0x70100, 0x80051, 0x80011, 0x80119, 0x70110, 0x80071, 0x80031, 0x900c2, 0x70108, 0x80061, 0x80021, 0x900a2, 0x80001, 0x80081, 0x80041, 0x900e2, 0x70104, 0x80059, 0x80019, 0x90092, 0x70114, 0x80079, 0x80039, 0x900d2, 0x7010c, 0x80069, 0x80029, 0x900b2, 0x80009, 0x80089, 0x80049, 0x900f2, 0x70102, 0x80055, 0x80015, 0x8011d, 0x70112, 0x80075, 0x80035, 0x900ca, 0x7010a, 0x80065, 0x80025, 0x900aa, 0x80005, 0x80085, 0x80045, 0x900ea, 0x70106, 0x8005d, 0x8001d, 0x9009a, 0x70116, 0x8007d, 0x8003d, 0x900da, 0x7010e, 0x8006d, 0x8002d, 0x900ba, 0x8000d, 0x8008d, 0x8004d, 0x900fa, 0x70101, 0x80053, 0x80013, 0x8011b, 0x70111, 0x80073, 0x80033, 0x900c6, 0x70109, 0x80063, 0x80023, 0x900a6, 0x80003, 0x80083, 0x80043, 0x900e6, 0x70105, 0x8005b, 0x8001b, 0x90096, 0x70115, 0x8007b, 0x8003b, 0x900d6, 0x7010d, 0x8006b, 0x8002b, 0x900b6, 0x8000b, 0x8008b, 0x8004b, 0x900f6, 0x70103, 0x80057, 0x80017, 0x8011f, 0x70113, 0x80077, 0x80037, 0x900ce, 0x7010b, 0x80067, 0x80027, 0x900ae, 0x80007, 0x80087, 0x80047, 0x900ee, 0x70107, 0x8005f, 0x8001f, 0x9009e, 0x70117, 0x8007f, 0x8003f, 0x900de, 0x7010f, 0x8006f, 0x8002f, 0x900be, 0x8000f, 0x8008f, 0x8004f, 0x900fe, 0x70100, 0x80050, 0x80010, 0x80118, 0x70110, 0x80070, 0x80030, 0x900c1, 0x70108, 0x80060, 0x80020, 0x900a1, 0x80000, 0x80080, 0x80040, 0x900e1, 0x70104, 0x80058, 0x80018, 0x90091, 0x70114, 0x80078, 0x80038, 0x900d1, 0x7010c, 0x80068, 0x80028, 0x900b1, 0x80008, 0x80088, 0x80048, 0x900f1, 0x70102, 0x80054, 0x80014, 0x8011c, 0x70112, 0x80074, 0x80034, 0x900c9, 0x7010a, 0x80064, 0x80024, 0x900a9, 0x80004, 0x80084, 0x80044, 0x900e9, 0x70106, 0x8005c, 0x8001c, 0x90099, 0x70116, 0x8007c, 0x8003c, 0x900d9, 0x7010e, 0x8006c, 0x8002c, 0x900b9, 0x8000c, 0x8008c, 0x8004c, 0x900f9, 0x70101, 0x80052, 0x80012, 0x8011a, 0x70111, 0x80072, 0x80032, 0x900c5, 0x70109, 0x80062, 0x80022, 0x900a5, 0x80002, 0x80082, 0x80042, 0x900e5, 0x70105, 0x8005a, 0x8001a, 0x90095, 0x70115, 0x8007a, 0x8003a, 0x900d5, 0x7010d, 0x8006a, 0x8002a, 0x900b5, 0x8000a, 0x8008a, 0x8004a, 0x900f5, 0x70103, 0x80056, 0x80016, 0x8011e, 0x70113, 0x80076, 0x80036, 0x900cd, 0x7010b, 0x80066, 0x80026, 0x900ad, 0x80006, 0x80086, 0x80046, 0x900ed, 0x70107, 0x8005e, 0x8001e, 0x9009d, 0x70117, 0x8007e, 0x8003e, 0x900dd, 0x7010f, 0x8006e, 0x8002e, 0x900bd, 0x8000e, 0x8008e, 0x8004e, 0x900fd, 0x70100, 0x80051, 0x80011, 0x80119, 0x70110, 0x80071, 0x80031, 0x900c3, 0x70108, 0x80061, 0x80021, 0x900a3, 0x80001, 0x80081, 0x80041, 0x900e3, 0x70104, 0x80059, 0x80019, 0x90093, 0x70114, 0x80079, 0x80039, 0x900d3, 0x7010c, 0x80069, 0x80029, 0x900b3, 0x80009, 0x80089, 0x80049, 0x900f3, 0x70102, 0x80055, 0x80015, 0x8011d, 0x70112, 0x80075, 0x80035, 0x900cb, 0x7010a, 0x80065, 0x80025, 0x900ab, 0x80005, 0x80085, 0x80045, 0x900eb, 0x70106, 0x8005d, 0x8001d, 0x9009b, 0x70116, 0x8007d, 0x8003d, 0x900db, 0x7010e, 0x8006d, 0x8002d, 0x900bb, 0x8000d, 0x8008d, 0x8004d, 0x900fb, 0x70101, 0x80053, 0x80013, 0x8011b, 0x70111, 0x80073, 0x80033, 0x900c7, 0x70109, 0x80063, 0x80023, 0x900a7, 0x80003, 0x80083, 0x80043, 0x900e7, 0x70105, 0x8005b, 0x8001b, 0x90097, 0x70115, 0x8007b, 0x8003b, 0x900d7, 0x7010d, 0x8006b, 0x8002b, 0x900b7, 0x8000b, 0x8008b, 0x8004b, 0x900f7, 0x70103, 0x80057, 0x80017, 0x8011f, 0x70113, 0x80077, 0x80037, 0x900cf, 0x7010b, 0x80067, 0x80027, 0x900af, 0x80007, 0x80087, 0x80047, 0x900ef, 0x70107, 0x8005f, 0x8001f, 0x9009f, 0x70117, 0x8007f, 0x8003f, 0x900df, 0x7010f, 0x8006f, 0x8002f, 0x900bf, 0x8000f, 0x8008f, 0x8004f, 0x900ff]), 9];
8834const fixedDistCodeTab = [new Int32Array([0x50000, 0x50010, 0x50008, 0x50018, 0x50004, 0x50014, 0x5000c, 0x5001c, 0x50002, 0x50012, 0x5000a, 0x5001a, 0x50006, 0x50016, 0x5000e, 0x00000, 0x50001, 0x50011, 0x50009, 0x50019, 0x50005, 0x50015, 0x5000d, 0x5001d, 0x50003, 0x50013, 0x5000b, 0x5001b, 0x50007, 0x50017, 0x5000f, 0x00000]), 5];
8835class FlateStream extends DecodeStream {
vendor: 22,988 bytes, lines 8836-9923
8836	constructor(str, maybeLength) {
8837		super(maybeLength);
8838		this.str = str;
8839		this.dict = str.dict;
8840		const cmf = str.getByte();
8841		const flg = str.getByte();
8842		if (cmf === -1 || flg === -1) {
8843			throw new FormatError(`Invalid header in flate stream: ${cmf}, ${flg}`);
8844		}
8845		if ((cmf & 0x0f) !== 0x08) {
8846			throw new FormatError(`Unknown compression method in flate stream: ${cmf}, ${flg}`);
8847		}
8848		if (((cmf << 8) + flg) % 31 !== 0) {
8849			throw new FormatError(`Bad FCHECK in flate stream: ${cmf}, ${flg}`);
8850		}
8851		if (flg & 0x20) {
8852			throw new FormatError(`FDICT bit set in flate stream: ${cmf}, ${flg}`);
8853		}
8854		this.codeSize = 0;
8855		this.codeBuf = 0;
8856	}
8857	async getImageData(length, _decoderOptions) {
8858		const data = await this.asyncGetBytes();
8859		return data?.subarray(0, length) || this.getBytes(length);
8860	}
8861	async asyncGetBytes() {
8862		this.str.reset();
8863		const bytes = this.str.getBytes();
8864		try {
8865			const {
8866				readable,
8867				writable
8868			} = new DecompressionStream("deflate");
8869			const writer = writable.getWriter();
8870			await writer.ready;
8871			writer.write(bytes).then(async () => {
8872				await writer.ready;
8873				await writer.close();
8874			}).catch(() => {});
8875			const chunks = [];
8876			let totalLength = 0;
8877			for await (const chunk of readable) {
8878				chunks.push(chunk);
8879				totalLength += chunk.byteLength;
8880			}
8881			const data = new Uint8Array(totalLength);
8882			let offset = 0;
8883			for (const chunk of chunks) {
8884				data.set(chunk, offset);
8885				offset += chunk.byteLength;
8886			}
8887			return data;
8888		} catch {
8889			this.str = new Stream(bytes, 2, bytes.length, this.str.dict);
8890			this.reset();
8891			return null;
8892		}
8893	}
8894	get isAsync() {
8895		return true;
8896	}
8897	getBits(bits) {
8898		const str = this.str;
8899		let codeSize = this.codeSize;
8900		let codeBuf = this.codeBuf;
8901		let b;
8902		while (codeSize < bits) {
8903			if ((b = str.getByte()) === -1) {
8904				throw new FormatError("Bad encoding in flate stream");
8905			}
8906			codeBuf |= b << codeSize;
8907			codeSize += 8;
8908		}
8909		b = codeBuf & (1 << bits) - 1;
8910		this.codeBuf = codeBuf >> bits;
8911		this.codeSize = codeSize -= bits;
8912		return b;
8913	}
8914	getCode(table) {
8915		const str = this.str;
8916		const codes = table[0];
8917		const maxLen = table[1];
8918		let codeSize = this.codeSize;
8919		let codeBuf = this.codeBuf;
8920		let b;
8921		while (codeSize < maxLen) {
8922			if ((b = str.getByte()) === -1) {
8923				break;
8924			}
8925			codeBuf |= b << codeSize;
8926			codeSize += 8;
8927		}
8928		const code = codes[codeBuf & (1 << maxLen) - 1];
8929		const codeLen = code >> 16;
8930		const codeVal = code & 0xffff;
8931		if (codeLen < 1 || codeSize < codeLen) {
8932			throw new FormatError("Bad encoding in flate stream");
8933		}
8934		this.codeBuf = codeBuf >> codeLen;
8935		this.codeSize = codeSize - codeLen;
8936		return codeVal;
8937	}
8938	generateHuffmanTable(lengths) {
8939		const n = lengths.length;
8940		let maxLen = 0;
8941		let i;
8942		for (i = 0; i < n; ++i) {
8943			if (lengths[i] > maxLen) {
8944				maxLen = lengths[i];
8945			}
8946		}
8947		const size = 1 << maxLen;
8948		const codes = new Int32Array(size);
8949		for (let len = 1, code = 0, skip = 2; len <= maxLen; ++len, code <<= 1, skip <<= 1) {
8950			for (let val = 0; val < n; ++val) {
8951				if (lengths[val] === len) {
8952					let code2 = 0;
8953					let t = code;
8954					for (i = 0; i < len; ++i) {
8955						code2 = code2 << 1 | t & 1;
8956						t >>= 1;
8957					}
8958					for (i = code2; i < size; i += skip) {
8959						codes[i] = len << 16 | val;
8960					}
8961					++code;
8962				}
8963			}
8964		}
8965		return [codes, maxLen];
8966	}
8967	#endsStreamOnError(err) {
8968		info(err);
8969		this.eof = true;
8970	}
8971	readBlock() {
8972		let buffer, hdr, len;
8973		const str = this.str;
8974		try {
8975			hdr = this.getBits(3);
8976		} catch (ex) {
8977			this.#endsStreamOnError(ex.message);
8978			return;
8979		}
8980		if (hdr & 1) {
8981			this.eof = true;
8982		}
8983		hdr >>= 1;
8984		if (hdr === 0) {
8985			let b;
8986			if ((b = str.getByte()) === -1) {
8987				this.#endsStreamOnError("Bad block header in flate stream");
8988				return;
8989			}
8990			let blockLen = b;
8991			if ((b = str.getByte()) === -1) {
8992				this.#endsStreamOnError("Bad block header in flate stream");
8993				return;
8994			}
8995			blockLen |= b << 8;
8996			if ((b = str.getByte()) === -1) {
8997				this.#endsStreamOnError("Bad block header in flate stream");
8998				return;
8999			}
9000			let check = b;
9001			if ((b = str.getByte()) === -1) {
9002				this.#endsStreamOnError("Bad block header in flate stream");
9003				return;
9004			}
9005			check |= b << 8;
9006			if (check !== (~blockLen & 0xffff) && (blockLen !== 0 || check !== 0)) {
9007				throw new FormatError("Bad uncompressed block length in flate stream");
9008			}
9009			this.codeBuf = 0;
9010			this.codeSize = 0;
9011			const bufferLength = this.bufferLength,
9012				end = bufferLength + blockLen;
9013			buffer = this.ensureBuffer(end);
9014			this.bufferLength = end;
9015			if (blockLen === 0) {
9016				if (str.peekByte() === -1) {
9017					this.eof = true;
9018				}
9019			} else {
9020				const block = str.getBytes(blockLen);
9021				buffer.set(block, bufferLength);
9022				if (block.length < blockLen) {
9023					this.eof = true;
9024				}
9025			}
9026			return;
9027		}
9028		let litCodeTable;
9029		let distCodeTable;
9030		if (hdr === 1) {
9031			litCodeTable = fixedLitCodeTab;
9032			distCodeTable = fixedDistCodeTab;
9033		} else if (hdr === 2) {
9034			const numLitCodes = this.getBits(5) + 257;
9035			const numDistCodes = this.getBits(5) + 1;
9036			const numCodeLenCodes = this.getBits(4) + 4;
9037			const codeLenCodeLengths = new Uint8Array(codeLenCodeMap.length);
9038			let i;
9039			for (i = 0; i < numCodeLenCodes; ++i) {
9040				codeLenCodeLengths[codeLenCodeMap[i]] = this.getBits(3);
9041			}
9042			const codeLenCodeTab = this.generateHuffmanTable(codeLenCodeLengths);
9043			len = 0;
9044			i = 0;
9045			const codes = numLitCodes + numDistCodes;
9046			const codeLengths = new Uint8Array(codes);
9047			let bitsLength, bitsOffset, what;
9048			while (i < codes) {
9049				const code = this.getCode(codeLenCodeTab);
9050				if (code === 16) {
9051					bitsLength = 2;
9052					bitsOffset = 3;
9053					what = len;
9054				} else if (code === 17) {
9055					bitsLength = 3;
9056					bitsOffset = 3;
9057					what = len = 0;
9058				} else if (code === 18) {
9059					bitsLength = 7;
9060					bitsOffset = 11;
9061					what = len = 0;
9062				} else {
9063					codeLengths[i++] = len = code;
9064					continue;
9065				}
9066				let repeatLength = this.getBits(bitsLength) + bitsOffset;
9067				while (repeatLength-- > 0) {
9068					codeLengths[i++] = what;
9069				}
9070			}
9071			litCodeTable = this.generateHuffmanTable(codeLengths.subarray(0, numLitCodes));
9072			distCodeTable = this.generateHuffmanTable(codeLengths.subarray(numLitCodes, codes));
9073		} else {
9074			throw new FormatError("Unknown block type in flate stream");
9075		}
9076		buffer = this.buffer;
9077		let limit = buffer ? buffer.length : 0;
9078		let pos = this.bufferLength;
9079		while (true) {
9080			let code1 = this.getCode(litCodeTable);
9081			if (code1 < 256) {
9082				if (pos + 1 >= limit) {
9083					buffer = this.ensureBuffer(pos + 1);
9084					limit = buffer.length;
9085				}
9086				buffer[pos++] = code1;
9087				continue;
9088			}
9089			if (code1 === 256) {
9090				this.bufferLength = pos;
9091				return;
9092			}
9093			code1 -= 257;
9094			code1 = lengthDecode[code1];
9095			let code2 = code1 >> 16;
9096			if (code2 > 0) {
9097				code2 = this.getBits(code2);
9098			}
9099			len = (code1 & 0xffff) + code2;
9100			code1 = this.getCode(distCodeTable);
9101			code1 = distDecode[code1];
9102			code2 = code1 >> 16;
9103			if (code2 > 0) {
9104				code2 = this.getBits(code2);
9105			}
9106			const dist = (code1 & 0xffff) + code2;
9107			if (pos + len >= limit) {
9108				buffer = this.ensureBuffer(pos + len);
9109				limit = buffer.length;
9110			}
9111			for (let k = 0; k < len; ++k, ++pos) {
9112				buffer[pos] = buffer[pos - dist];
9113			}
9114		}
9115	}
9116}
9117
9118;// ./src/core/arithmetic_decoder.js
9119const QeTable = [{
9120	qe: 0x5601,
9121	nmps: 1,
9122	nlps: 1,
9123	switchFlag: 1
9124}, {
9125	qe: 0x3401,
9126	nmps: 2,
9127	nlps: 6,
9128	switchFlag: 0
9129}, {
9130	qe: 0x1801,
9131	nmps: 3,
9132	nlps: 9,
9133	switchFlag: 0
9134}, {
9135	qe: 0x0ac1,
9136	nmps: 4,
9137	nlps: 12,
9138	switchFlag: 0
9139}, {
9140	qe: 0x0521,
9141	nmps: 5,
9142	nlps: 29,
9143	switchFlag: 0
9144}, {
9145	qe: 0x0221,
9146	nmps: 38,
9147	nlps: 33,
9148	switchFlag: 0
9149}, {
9150	qe: 0x5601,
9151	nmps: 7,
9152	nlps: 6,
9153	switchFlag: 1
9154}, {
9155	qe: 0x5401,
9156	nmps: 8,
9157	nlps: 14,
9158	switchFlag: 0
9159}, {
9160	qe: 0x4801,
9161	nmps: 9,
9162	nlps: 14,
9163	switchFlag: 0
9164}, {
9165	qe: 0x3801,
9166	nmps: 10,
9167	nlps: 14,
9168	switchFlag: 0
9169}, {
9170	qe: 0x3001,
9171	nmps: 11,
9172	nlps: 17,
9173	switchFlag: 0
9174}, {
9175	qe: 0x2401,
9176	nmps: 12,
9177	nlps: 18,
9178	switchFlag: 0
9179}, {
9180	qe: 0x1c01,
9181	nmps: 13,
9182	nlps: 20,
9183	switchFlag: 0
9184}, {
9185	qe: 0x1601,
9186	nmps: 29,
9187	nlps: 21,
9188	switchFlag: 0
9189}, {
9190	qe: 0x5601,
9191	nmps: 15,
9192	nlps: 14,
9193	switchFlag: 1
9194}, {
9195	qe: 0x5401,
9196	nmps: 16,
9197	nlps: 14,
9198	switchFlag: 0
9199}, {
9200	qe: 0x5101,
9201	nmps: 17,
9202	nlps: 15,
9203	switchFlag: 0
9204}, {
9205	qe: 0x4801,
9206	nmps: 18,
9207	nlps: 16,
9208	switchFlag: 0
9209}, {
9210	qe: 0x3801,
9211	nmps: 19,
9212	nlps: 17,
9213	switchFlag: 0
9214}, {
9215	qe: 0x3401,
9216	nmps: 20,
9217	nlps: 18,
9218	switchFlag: 0
9219}, {
9220	qe: 0x3001,
9221	nmps: 21,
9222	nlps: 19,
9223	switchFlag: 0
9224}, {
9225	qe: 0x2801,
9226	nmps: 22,
9227	nlps: 19,
9228	switchFlag: 0
9229}, {
9230	qe: 0x2401,
9231	nmps: 23,
9232	nlps: 20,
9233	switchFlag: 0
9234}, {
9235	qe: 0x2201,
9236	nmps: 24,
9237	nlps: 21,
9238	switchFlag: 0
9239}, {
9240	qe: 0x1c01,
9241	nmps: 25,
9242	nlps: 22,
9243	switchFlag: 0
9244}, {
9245	qe: 0x1801,
9246	nmps: 26,
9247	nlps: 23,
9248	switchFlag: 0
9249}, {
9250	qe: 0x1601,
9251	nmps: 27,
9252	nlps: 24,
9253	switchFlag: 0
9254}, {
9255	qe: 0x1401,
9256	nmps: 28,
9257	nlps: 25,
9258	switchFlag: 0
9259}, {
9260	qe: 0x1201,
9261	nmps: 29,
9262	nlps: 26,
9263	switchFlag: 0
9264}, {
9265	qe: 0x1101,
9266	nmps: 30,
9267	nlps: 27,
9268	switchFlag: 0
9269}, {
9270	qe: 0x0ac1,
9271	nmps: 31,
9272	nlps: 28,
9273	switchFlag: 0
9274}, {
9275	qe: 0x09c1,
9276	nmps: 32,
9277	nlps: 29,
9278	switchFlag: 0
9279}, {
9280	qe: 0x08a1,
9281	nmps: 33,
9282	nlps: 30,
9283	switchFlag: 0
9284}, {
9285	qe: 0x0521,
9286	nmps: 34,
9287	nlps: 31,
9288	switchFlag: 0
9289}, {
9290	qe: 0x0441,
9291	nmps: 35,
9292	nlps: 32,
9293	switchFlag: 0
9294}, {
9295	qe: 0x02a1,
9296	nmps: 36,
9297	nlps: 33,
9298	switchFlag: 0
9299}, {
9300	qe: 0x0221,
9301	nmps: 37,
9302	nlps: 34,
9303	switchFlag: 0
9304}, {
9305	qe: 0x0141,
9306	nmps: 38,
9307	nlps: 35,
9308	switchFlag: 0
9309}, {
9310	qe: 0x0111,
9311	nmps: 39,
9312	nlps: 36,
9313	switchFlag: 0
9314}, {
9315	qe: 0x0085,
9316	nmps: 40,
9317	nlps: 37,
9318	switchFlag: 0
9319}, {
9320	qe: 0x0049,
9321	nmps: 41,
9322	nlps: 38,
9323	switchFlag: 0
9324}, {
9325	qe: 0x0025,
9326	nmps: 42,
9327	nlps: 39,
9328	switchFlag: 0
9329}, {
9330	qe: 0x0015,
9331	nmps: 43,
9332	nlps: 40,
9333	switchFlag: 0
9334}, {
9335	qe: 0x0009,
9336	nmps: 44,
9337	nlps: 41,
9338	switchFlag: 0
9339}, {
9340	qe: 0x0005,
9341	nmps: 45,
9342	nlps: 42,
9343	switchFlag: 0
9344}, {
9345	qe: 0x0001,
9346	nmps: 45,
9347	nlps: 43,
9348	switchFlag: 0
9349}, {
9350	qe: 0x5601,
9351	nmps: 46,
9352	nlps: 46,
9353	switchFlag: 0
9354}];
9355class ArithmeticDecoder {
9356	constructor(data, start, end) {
9357		this.data = data;
9358		this.bp = start;
9359		this.dataEnd = end;
9360		this.chigh = data[start];
9361		this.clow = 0;
9362		this.byteIn();
9363		this.chigh = this.chigh << 7 & 0xffff | this.clow >> 9 & 0x7f;
9364		this.clow = this.clow << 7 & 0xffff;
9365		this.ct -= 7;
9366		this.a = 0x8000;
9367	}
9368	byteIn() {
9369		const data = this.data;
9370		let bp = this.bp;
9371		if (data[bp] === 0xff) {
9372			if (data[bp + 1] > 0x8f) {
9373				this.clow += 0xff00;
9374				this.ct = 8;
9375			} else {
9376				bp++;
9377				this.clow += data[bp] << 9;
9378				this.ct = 7;
9379				this.bp = bp;
9380			}
9381		} else {
9382			bp++;
9383			this.clow += bp < this.dataEnd ? data[bp] << 8 : 0xff00;
9384			this.ct = 8;
9385			this.bp = bp;
9386		}
9387		if (this.clow > 0xffff) {
9388			this.chigh += this.clow >> 16;
9389			this.clow &= 0xffff;
9390		}
9391	}
9392	readBit(contexts, pos) {
9393		let cx_index = contexts[pos] >> 1,
9394			cx_mps = contexts[pos] & 1;
9395		const qeTableIcx = QeTable[cx_index];
9396		const qeIcx = qeTableIcx.qe;
9397		let d;
9398		let a = this.a - qeIcx;
9399		if (this.chigh < qeIcx) {
9400			if (a < qeIcx) {
9401				a = qeIcx;
9402				d = cx_mps;
9403				cx_index = qeTableIcx.nmps;
9404			} else {
9405				a = qeIcx;
9406				d = 1 ^ cx_mps;
9407				if (qeTableIcx.switchFlag === 1) {
9408					cx_mps = d;
9409				}
9410				cx_index = qeTableIcx.nlps;
9411			}
9412		} else {
9413			this.chigh -= qeIcx;
9414			if ((a & 0x8000) !== 0) {
9415				this.a = a;
9416				return cx_mps;
9417			}
9418			if (a < qeIcx) {
9419				d = 1 ^ cx_mps;
9420				if (qeTableIcx.switchFlag === 1) {
9421					cx_mps = d;
9422				}
9423				cx_index = qeTableIcx.nlps;
9424			} else {
9425				d = cx_mps;
9426				cx_index = qeTableIcx.nmps;
9427			}
9428		}
9429		do {
9430			if (this.ct === 0) {
9431				this.byteIn();
9432			}
9433			a <<= 1;
9434			this.chigh = this.chigh << 1 & 0xffff | this.clow >> 15 & 1;
9435			this.clow = this.clow << 1 & 0xffff;
9436			this.ct--;
9437		} while ((a & 0x8000) === 0);
9438		this.a = a;
9439		contexts[pos] = cx_index << 1 | cx_mps;
9440		return d;
9441	}
9442}
9443
9444;// ./src/core/jbig2.js
9445
9446
9447
9448
9449
9450
9451
9452
9453
9454
9455
9456class Jbig2Error extends BaseException {
9457	constructor(msg) {
9458		super(msg, "Jbig2Error");
9459	}
9460}
9461class ContextCache {
9462	getContexts(id) {
9463		if (id in this) {
9464			return this[id];
9465		}
9466		return this[id] = new Int8Array(1 << 16);
9467	}
9468}
9469class DecodingContext {
9470	constructor(data, start, end) {
9471		this.data = data;
9472		this.start = start;
9473		this.end = end;
9474	}
9475	get decoder() {
9476		const decoder = new ArithmeticDecoder(this.data, this.start, this.end);
9477		return shadow(this, "decoder", decoder);
9478	}
9479	get contextCache() {
9480		const cache = new ContextCache();
9481		return shadow(this, "contextCache", cache);
9482	}
9483}
9484function decodeInteger(contextCache, procedure, decoder) {
9485	const contexts = contextCache.getContexts(procedure);
9486	let prev = 1;
9487	function readBits(length) {
9488		let v = 0;
9489		for (let i = 0; i < length; i++) {
9490			const bit = decoder.readBit(contexts, prev);
9491			prev = prev < 256 ? prev << 1 | bit : (prev << 1 | bit) & 511 | 256;
9492			v = v << 1 | bit;
9493		}
9494		return v >>> 0;
9495	}
9496	const sign = readBits(1);
9497	const value = readBits(1) ? readBits(1) ? readBits(1) ? readBits(1) ? readBits(1) ? readBits(32) + 4436 : readBits(12) + 340 : readBits(8) + 84 : readBits(6) + 20 : readBits(4) + 4 : readBits(2);
9498	let signedValue;
9499	if (sign === 0) {
9500		signedValue = value;
9501	} else if (value > 0) {
9502		signedValue = -value;
9503	}
9504	if (signedValue >= MIN_INT_32 && signedValue <= MAX_INT_32) {
9505		return signedValue;
9506	}
9507	return null;
9508}
9509function decodeIAID(contextCache, decoder, codeLength) {
9510	const contexts = contextCache.getContexts("IAID");
9511	let prev = 1;
9512	for (let i = 0; i < codeLength; i++) {
9513		const bit = decoder.readBit(contexts, prev);
9514		prev = prev << 1 | bit;
9515	}
9516	if (codeLength < 31) {
9517		return prev & (1 << codeLength) - 1;
9518	}
9519	return prev & 0x7fffffff;
9520}
9521const SegmentTypes = ["SymbolDictionary", null, null, null, "IntermediateTextRegion", null, "ImmediateTextRegion", "ImmediateLosslessTextRegion", null, null, null, null, null, null, null, null, "PatternDictionary", null, null, null, "IntermediateHalftoneRegion", null, "ImmediateHalftoneRegion", "ImmediateLosslessHalftoneRegion", null, null, null, null, null, null, null, null, null, null, null, null, "IntermediateGenericRegion", null, "ImmediateGenericRegion", "ImmediateLosslessGenericRegion", "IntermediateGenericRefinementRegion", null, "ImmediateGenericRefinementRegion", "ImmediateLosslessGenericRefinementRegion", null, null, null, null, "PageInformation", "EndOfPage", "EndOfStripe", "EndOfFile", "Profiles", "Tables", null, null, null, null, null, null, null, null, "Extension"];
9522const CodingTemplates = [[{
9523	x: -1,
9524	y: -2
9525}, {
9526	x: 0,
9527	y: -2
9528}, {
9529	x: 1,
9530	y: -2
9531}, {
9532	x: -2,
9533	y: -1
9534}, {
9535	x: -1,
9536	y: -1
9537}, {
9538	x: 0,
9539	y: -1
9540}, {
9541	x: 1,
9542	y: -1
9543}, {
9544	x: 2,
9545	y: -1
9546}, {
9547	x: -4,
9548	y: 0
9549}, {
9550	x: -3,
9551	y: 0
9552}, {
9553	x: -2,
9554	y: 0
9555}, {
9556	x: -1,
9557	y: 0
9558}], [{
9559	x: -1,
9560	y: -2
9561}, {
9562	x: 0,
9563	y: -2
9564}, {
9565	x: 1,
9566	y: -2
9567}, {
9568	x: 2,
9569	y: -2
9570}, {
9571	x: -2,
9572	y: -1
9573}, {
9574	x: -1,
9575	y: -1
9576}, {
9577	x: 0,
9578	y: -1
9579}, {
9580	x: 1,
9581	y: -1
9582}, {
9583	x: 2,
9584	y: -1
9585}, {
9586	x: -3,
9587	y: 0
9588}, {
9589	x: -2,
9590	y: 0
9591}, {
9592	x: -1,
9593	y: 0
9594}], [{
9595	x: -1,
9596	y: -2
9597}, {
9598	x: 0,
9599	y: -2
9600}, {
9601	x: 1,
9602	y: -2
9603}, {
9604	x: -2,
9605	y: -1
9606}, {
9607	x: -1,
9608	y: -1
9609}, {
9610	x: 0,
9611	y: -1
9612}, {
9613	x: 1,
9614	y: -1
9615}, {
9616	x: -2,
9617	y: 0
9618}, {
9619	x: -1,
9620	y: 0
9621}], [{
9622	x: -3,
9623	y: -1
9624}, {
9625	x: -2,
9626	y: -1
9627}, {
9628	x: -1,
9629	y: -1
9630}, {
9631	x: 0,
9632	y: -1
9633}, {
9634	x: 1,
9635	y: -1
9636}, {
9637	x: -4,
9638	y: 0
9639}, {
9640	x: -3,
9641	y: 0
9642}, {
9643	x: -2,
9644	y: 0
9645}, {
9646	x: -1,
9647	y: 0
9648}]];
9649const RefinementTemplates = [{
9650	coding: [{
9651		x: 0,
9652		y: -1
9653	}, {
9654		x: 1,
9655		y: -1
9656	}, {
9657		x: -1,
9658		y: 0
9659	}],
9660	reference: [{
9661		x: 0,
9662		y: -1
9663	}, {
9664		x: 1,
9665		y: -1
9666	}, {
9667		x: -1,
9668		y: 0
9669	}, {
9670		x: 0,
9671		y: 0
9672	}, {
9673		x: 1,
9674		y: 0
9675	}, {
9676		x: -1,
9677		y: 1
9678	}, {
9679		x: 0,
9680		y: 1
9681	}, {
9682		x: 1,
9683		y: 1
9684	}]
9685}, {
9686	coding: [{
9687		x: -1,
9688		y: -1
9689	}, {
9690		x: 0,
9691		y: -1
9692	}, {
9693		x: 1,
9694		y: -1
9695	}, {
9696		x: -1,
9697		y: 0
9698	}],
9699	reference: [{
9700		x: 0,
9701		y: -1
9702	}, {
9703		x: -1,
9704		y: 0
9705	}, {
9706		x: 0,
9707		y: 0
9708	}, {
9709		x: 1,
9710		y: 0
9711	}, {
9712		x: 0,
9713		y: 1
9714	}, {
9715		x: 1,
9716		y: 1
9717	}]
9718}];
9719const ReusedContexts = [0x9b25, 0x0795, 0x00e5, 0x0195];
9720const RefinementReusedContexts = [0x0020, 0x0008];
9721function decodeBitmapTemplate0(width, height, decodingContext) {
9722	const decoder = decodingContext.decoder;
9723	const contexts = decodingContext.contextCache.getContexts("GB");
9724	const bitmap = [];
9725	let contextLabel, i, j, pixel, row, row1, row2;
9726	const OLD_PIXEL_MASK = 0x7bf7;
9727	for (i = 0; i < height; i++) {
9728		row = bitmap[i] = new Uint8Array(width);
9729		row1 = i < 1 ? row : bitmap[i - 1];
9730		row2 = i < 2 ? row : bitmap[i - 2];
9731		contextLabel = row2[0] << 13 | row2[1] << 12 | row2[2] << 11 | row1[0] << 7 | row1[1] << 6 | row1[2] << 5 | row1[3] << 4;
9732		for (j = 0; j < width; j++) {
9733			row[j] = pixel = decoder.readBit(contexts, contextLabel);
9734			contextLabel = (contextLabel & OLD_PIXEL_MASK) << 1 | (j + 3 < width ? row2[j + 3] << 11 : 0) | (j + 4 < width ? row1[j + 4] << 4 : 0) | pixel;
9735		}
9736	}
9737	return bitmap;
9738}
9739function decodeBitmap(mmr, width, height, templateIndex, prediction, skip, at, decodingContext) {
9740	if (mmr) {
9741		const input = new Reader(decodingContext.data, decodingContext.start, decodingContext.end);
9742		return decodeMMRBitmap(input, width, height, false);
9743	}
9744	if (templateIndex === 0 && !skip && !prediction && at.length === 4 && at[0].x === 3 && at[0].y === -1 && at[1].x === -3 && at[1].y === -1 && at[2].x === 2 && at[2].y === -2 && at[3].x === -2 && at[3].y === -2) {
9745		return decodeBitmapTemplate0(width, height, decodingContext);
9746	}
9747	const useskip = !!skip;
9748	const template = CodingTemplates[templateIndex].concat(at);
9749	template.sort(function (a, b) {
9750		return a.y - b.y || a.x - b.x;
9751	});
9752	const templateLength = template.length;
9753	const templateX = new Int8Array(templateLength);
9754	const templateY = new Int8Array(templateLength);
9755	const changingTemplateEntries = [];
9756	let reuseMask = 0,
9757		minX = 0,
9758		maxX = 0,
9759		minY = 0;
9760	let c, k;
9761	for (k = 0; k < templateLength; k++) {
9762		templateX[k] = template[k].x;
9763		templateY[k] = template[k].y;
9764		minX = Math.min(minX, template[k].x);
9765		maxX = Math.max(maxX, template[k].x);
9766		minY = Math.min(minY, template[k].y);
9767		if (k < templateLength - 1 && template[k].y === template[k + 1].y && template[k].x === template[k + 1].x - 1) {
9768			reuseMask |= 1 << templateLength - 1 - k;
9769		} else {
9770			changingTemplateEntries.push(k);
9771		}
9772	}
9773	const changingEntriesLength = changingTemplateEntries.length;
9774	const changingTemplateX = new Int8Array(changingEntriesLength);
9775	const changingTemplateY = new Int8Array(changingEntriesLength);
9776	const changingTemplateBit = new Uint16Array(changingEntriesLength);
9777	for (c = 0; c < changingEntriesLength; c++) {
9778		k = changingTemplateEntries[c];
9779		changingTemplateX[c] = template[k].x;
9780		changingTemplateY[c] = template[k].y;
9781		changingTemplateBit[c] = 1 << templateLength - 1 - k;
9782	}
9783	const sbb_left = -minX;
9784	const sbb_top = -minY;
9785	const sbb_right = width - maxX;
9786	const pseudoPixelContext = ReusedContexts[templateIndex];
9787	let row = new Uint8Array(width);
9788	const bitmap = [];
9789	const decoder = decodingContext.decoder;
9790	const contexts = decodingContext.contextCache.getContexts("GB");
9791	let ltp = 0,
9792		j,
9793		i0,
9794		j0,
9795		contextLabel = 0,
9796		bit,
9797		shift;
9798	for (let i = 0; i < height; i++) {
9799		if (prediction) {
9800			const sltp = decoder.readBit(contexts, pseudoPixelContext);
9801			ltp ^= sltp;
9802			if (ltp) {
9803				bitmap.push(row);
9804				continue;
9805			}
9806		}
9807		row = new Uint8Array(row);
9808		bitmap.push(row);
9809		for (j = 0; j < width; j++) {
9810			if (useskip && skip[i][j]) {
9811				row[j] = 0;
9812				continue;
9813			}
9814			if (j >= sbb_left && j < sbb_right && i >= sbb_top) {
9815				contextLabel = contextLabel << 1 & reuseMask;
9816				for (k = 0; k < changingEntriesLength; k++) {
9817					i0 = i + changingTemplateY[k];
9818					j0 = j + changingTemplateX[k];
9819					bit = bitmap[i0][j0];
9820					if (bit) {
9821						bit = changingTemplateBit[k];
9822						contextLabel |= bit;
9823					}
9824				}
9825			} else {
9826				contextLabel = 0;
9827				shift = templateLength - 1;
9828				for (k = 0; k < templateLength; k++, shift--) {
9829					j0 = j + templateX[k];
9830					if (j0 >= 0 && j0 < width) {
9831						i0 = i + templateY[k];
9832						if (i0 >= 0) {
9833							bit = bitmap[i0][j0];
9834							if (bit) {
9835								contextLabel |= bit << shift;
9836							}
9837						}
9838					}
9839				}
9840			}
9841			const pixel = decoder.readBit(contexts, contextLabel);
9842			row[j] = pixel;
9843		}
9844	}
9845	return bitmap;
9846}
9847function decodeRefinement(width, height, templateIndex, referenceBitmap, offsetX, offsetY, prediction, at, decodingContext) {
9848	let codingTemplate = RefinementTemplates[templateIndex].coding;
9849	if (templateIndex === 0) {
9850		codingTemplate = codingTemplate.concat([at[0]]);
9851	}
9852	const codingTemplateLength = codingTemplate.length;
9853	const codingTemplateX = new Int32Array(codingTemplateLength);
9854	const codingTemplateY = new Int32Array(codingTemplateLength);
9855	let k;
9856	for (k = 0; k < codingTemplateLength; k++) {
9857		codingTemplateX[k] = codingTemplate[k].x;
9858		codingTemplateY[k] = codingTemplate[k].y;
9859	}
9860	let referenceTemplate = RefinementTemplates[templateIndex].reference;
9861	if (templateIndex === 0) {
9862		referenceTemplate = referenceTemplate.concat([at[1]]);
9863	}
9864	const referenceTemplateLength = referenceTemplate.length;
9865	const referenceTemplateX = new Int32Array(referenceTemplateLength);
9866	const referenceTemplateY = new Int32Array(referenceTemplateLength);
9867	for (k = 0; k < referenceTemplateLength; k++) {
9868		referenceTemplateX[k] = referenceTemplate[k].x;
9869		referenceTemplateY[k] = referenceTemplate[k].y;
9870	}
9871	const referenceWidth = referenceBitmap[0].length;
9872	const referenceHeight = referenceBitmap.length;
9873	const pseudoPixelContext = RefinementReusedContexts[templateIndex];
9874	const bitmap = [];
9875	const decoder = decodingContext.decoder;
9876	const contexts = decodingContext.contextCache.getContexts("GR");
9877	let ltp = 0;
9878	for (let i = 0; i < height; i++) {
9879		if (prediction) {
9880			const sltp = decoder.readBit(contexts, pseudoPixelContext);
9881			ltp ^= sltp;
9882			if (ltp) {
9883				throw new Jbig2Error("prediction is not supported");
9884			}
9885		}
9886		const row = new Uint8Array(width);
9887		bitmap.push(row);
9888		for (let j = 0; j < width; j++) {
9889			let i0, j0;
9890			let contextLabel = 0;
9891			for (k = 0; k < codingTemplateLength; k++) {
9892				i0 = i + codingTemplateY[k];
9893				j0 = j + codingTemplateX[k];
9894				if (i0 < 0 || j0 < 0 || j0 >= width) {
9895					contextLabel <<= 1;
9896				} else {
9897					contextLabel = contextLabel << 1 | bitmap[i0][j0];
9898				}
9899			}
9900			for (k = 0; k < referenceTemplateLength; k++) {
9901				i0 = i + referenceTemplateY[k] - offsetY;
9902				j0 = j + referenceTemplateX[k] - offsetX;
9903				if (i0 < 0 || i0 >= referenceHeight || j0 < 0 || j0 >= referenceWidth) {
9904					contextLabel <<= 1;
9905				} else {
9906					contextLabel = contextLabel << 1 | referenceBitmap[i0][j0];
9907				}
9908			}
9909			const pixel = decoder.readBit(contexts, contextLabel);
9910			row[j] = pixel;
9911		}
9912	}
9913	return bitmap;
9914}
9915function decodeSymbolDictionary(huffman, refinement, symbols, numberOfNewSymbols, numberOfExportedSymbols, huffmanTables, templateIndex, at, refinementTemplateIndex, refinementAt, decodingContext, huffmanInput) {
9916	if (huffman && refinement) {
9917		throw new Jbig2Error("symbol refinement with Huffman is not supported");
9918	}
9919	const newSymbols = [];
9920	let currentHeight = 0;
9921	let symbolCodeLength = log2(symbols.length + numberOfNewSymbols);
9922	const decoder = decodingContext.decoder;
9923	const contextCache = decodingContext.contextCache;
vendor: 5,404 bytes, lines 9924-10059
9924	let tableB1, symbolWidths;
9925	if (huffman) {
9926		tableB1 = getStandardTable(1);
9927		symbolWidths = [];
9928		symbolCodeLength = Math.max(symbolCodeLength, 1);
9929	}
9930	while (newSymbols.length < numberOfNewSymbols) {
9931		const deltaHeight = huffman ? huffmanTables.tableDeltaHeight.decode(huffmanInput) : decodeInteger(contextCache, "IADH", decoder);
9932		currentHeight += deltaHeight;
9933		let currentWidth = 0,
9934			totalWidth = 0;
9935		const firstSymbol = huffman ? symbolWidths.length : 0;
9936		while (true) {
9937			const deltaWidth = huffman ? huffmanTables.tableDeltaWidth.decode(huffmanInput) : decodeInteger(contextCache, "IADW", decoder);
9938			if (deltaWidth === null) {
9939				break;
9940			}
9941			currentWidth += deltaWidth;
9942			totalWidth += currentWidth;
9943			let bitmap;
9944			if (refinement) {
9945				const numberOfInstances = decodeInteger(contextCache, "IAAI", decoder);
9946				if (numberOfInstances > 1) {
9947					bitmap = decodeTextRegion(huffman, refinement, currentWidth, currentHeight, 0, numberOfInstances, 1, symbols.concat(newSymbols), symbolCodeLength, 0, 0, 1, 0, huffmanTables, refinementTemplateIndex, refinementAt, decodingContext, 0, huffmanInput);
9948				} else {
9949					const symbolId = decodeIAID(contextCache, decoder, symbolCodeLength);
9950					const rdx = decodeInteger(contextCache, "IARDX", decoder);
9951					const rdy = decodeInteger(contextCache, "IARDY", decoder);
9952					const symbol = symbolId < symbols.length ? symbols[symbolId] : newSymbols[symbolId - symbols.length];
9953					bitmap = decodeRefinement(currentWidth, currentHeight, refinementTemplateIndex, symbol, rdx, rdy, false, refinementAt, decodingContext);
9954				}
9955				newSymbols.push(bitmap);
9956			} else if (huffman) {
9957				symbolWidths.push(currentWidth);
9958			} else {
9959				bitmap = decodeBitmap(false, currentWidth, currentHeight, templateIndex, false, null, at, decodingContext);
9960				newSymbols.push(bitmap);
9961			}
9962		}
9963		if (huffman && !refinement) {
9964			const bitmapSize = huffmanTables.tableBitmapSize.decode(huffmanInput);
9965			huffmanInput.byteAlign();
9966			let collectiveBitmap;
9967			if (bitmapSize === 0) {
9968				collectiveBitmap = readUncompressedBitmap(huffmanInput, totalWidth, currentHeight);
9969			} else {
9970				const originalEnd = huffmanInput.end;
9971				const bitmapEnd = huffmanInput.position + bitmapSize;
9972				huffmanInput.end = bitmapEnd;
9973				collectiveBitmap = decodeMMRBitmap(huffmanInput, totalWidth, currentHeight, false);
9974				huffmanInput.end = originalEnd;
9975				huffmanInput.position = bitmapEnd;
9976			}
9977			const numberOfSymbolsDecoded = symbolWidths.length;
9978			if (firstSymbol === numberOfSymbolsDecoded - 1) {
9979				newSymbols.push(collectiveBitmap);
9980			} else {
9981				let i,
9982					y,
9983					xMin = 0,
9984					xMax,
9985					bitmapWidth,
9986					symbolBitmap;
9987				for (i = firstSymbol; i < numberOfSymbolsDecoded; i++) {
9988					bitmapWidth = symbolWidths[i];
9989					xMax = xMin + bitmapWidth;
9990					symbolBitmap = [];
9991					for (y = 0; y < currentHeight; y++) {
9992						symbolBitmap.push(collectiveBitmap[y].subarray(xMin, xMax));
9993					}
9994					newSymbols.push(symbolBitmap);
9995					xMin = xMax;
9996				}
9997			}
9998		}
9999	}
10000	const exportedSymbols = [],
10001		flags = [];
10002	let currentFlag = false,
10003		i,
10004		ii;
10005	const totalSymbolsLength = symbols.length + numberOfNewSymbols;
10006	while (flags.length < totalSymbolsLength) {
10007		let runLength = huffman ? tableB1.decode(huffmanInput) : decodeInteger(contextCache, "IAEX", decoder);
10008		while (runLength--) {
10009			flags.push(currentFlag);
10010		}
10011		currentFlag = !currentFlag;
10012	}
10013	for (i = 0, ii = symbols.length; i < ii; i++) {
10014		if (flags[i]) {
10015			exportedSymbols.push(symbols[i]);
10016		}
10017	}
10018	for (let j = 0; j < numberOfNewSymbols; i++, j++) {
10019		if (flags[i]) {
10020			exportedSymbols.push(newSymbols[j]);
10021		}
10022	}
10023	return exportedSymbols;
10024}
10025function decodeTextRegion(huffman, refinement, width, height, defaultPixelValue, numberOfSymbolInstances, stripSize, inputSymbols, symbolCodeLength, transposed, dsOffset, referenceCorner, combinationOperator, huffmanTables, refinementTemplateIndex, refinementAt, decodingContext, logStripSize, huffmanInput) {
10026	if (huffman && refinement) {
10027		throw new Jbig2Error("refinement with Huffman is not supported");
10028	}
10029	const bitmap = [];
10030	let i, row;
10031	for (i = 0; i < height; i++) {
10032		row = new Uint8Array(width);
10033		if (defaultPixelValue) {
10034			for (let j = 0; j < width; j++) {
10035				row[j] = defaultPixelValue;
10036			}
10037		}
10038		bitmap.push(row);
10039	}
10040	const decoder = decodingContext.decoder;
10041	const contextCache = decodingContext.contextCache;
10042	let stripT = huffman ? -huffmanTables.tableDeltaT.decode(huffmanInput) : -decodeInteger(contextCache, "IADT", decoder);
10043	let firstS = 0;
10044	i = 0;
10045	while (i < numberOfSymbolInstances) {
10046		const deltaT = huffman ? huffmanTables.tableDeltaT.decode(huffmanInput) : decodeInteger(contextCache, "IADT", decoder);
10047		stripT += deltaT;
10048		const deltaFirstS = huffman ? huffmanTables.tableFirstS.decode(huffmanInput) : decodeInteger(contextCache, "IAFS", decoder);
10049		firstS += deltaFirstS;
10050		let currentS = firstS;
10051		do {
10052			let currentT = 0;
10053			if (stripSize > 1) {
10054				currentT = huffman ? huffmanInput.readBits(logStripSize) : decodeInteger(contextCache, "IAIT", decoder);
10055			}
10056			const t = stripSize * stripT + currentT;
10057			const symbolId = huffman ? huffmanTables.symbolIDTable.decode(huffmanInput) : decodeIAID(contextCache, decoder, symbolCodeLength);
10058			const applyRefinement = refinement && (huffman ? huffmanInput.readBit() : decodeInteger(contextCache, "IARI", decoder));
10059			let symbolBitmap = inputSymbols[symbolId];
vendor: 52,301 bytes, lines 10060-11753
10060			let symbolWidth = symbolBitmap[0].length;
10061			let symbolHeight = symbolBitmap.length;
10062			if (applyRefinement) {
10063				const rdw = decodeInteger(contextCache, "IARDW", decoder);
10064				const rdh = decodeInteger(contextCache, "IARDH", decoder);
10065				const rdx = decodeInteger(contextCache, "IARDX", decoder);
10066				const rdy = decodeInteger(contextCache, "IARDY", decoder);
10067				symbolWidth += rdw;
10068				symbolHeight += rdh;
10069				symbolBitmap = decodeRefinement(symbolWidth, symbolHeight, refinementTemplateIndex, symbolBitmap, (rdw >> 1) + rdx, (rdh >> 1) + rdy, false, refinementAt, decodingContext);
10070			}
10071			let increment = 0;
10072			if (!transposed) {
10073				if (referenceCorner > 1) {
10074					currentS += symbolWidth - 1;
10075				} else {
10076					increment = symbolWidth - 1;
10077				}
10078			} else if (!(referenceCorner & 1)) {
10079				currentS += symbolHeight - 1;
10080			} else {
10081				increment = symbolHeight - 1;
10082			}
10083			const offsetT = t - (referenceCorner & 1 ? 0 : symbolHeight - 1);
10084			const offsetS = currentS - (referenceCorner & 2 ? symbolWidth - 1 : 0);
10085			let s2, t2, symbolRow;
10086			if (transposed) {
10087				for (s2 = 0; s2 < symbolHeight; s2++) {
10088					row = bitmap[offsetS + s2];
10089					if (!row) {
10090						continue;
10091					}
10092					symbolRow = symbolBitmap[s2];
10093					const maxWidth = Math.min(width - offsetT, symbolWidth);
10094					switch (combinationOperator) {
10095						case 0:
10096							for (t2 = 0; t2 < maxWidth; t2++) {
10097								row[offsetT + t2] |= symbolRow[t2];
10098							}
10099							break;
10100						case 2:
10101							for (t2 = 0; t2 < maxWidth; t2++) {
10102								row[offsetT + t2] ^= symbolRow[t2];
10103							}
10104							break;
10105						default:
10106							throw new Jbig2Error(`operator ${combinationOperator} is not supported`);
10107					}
10108				}
10109			} else {
10110				for (t2 = 0; t2 < symbolHeight; t2++) {
10111					row = bitmap[offsetT + t2];
10112					if (!row) {
10113						continue;
10114					}
10115					symbolRow = symbolBitmap[t2];
10116					switch (combinationOperator) {
10117						case 0:
10118							for (s2 = 0; s2 < symbolWidth; s2++) {
10119								row[offsetS + s2] |= symbolRow[s2];
10120							}
10121							break;
10122						case 2:
10123							for (s2 = 0; s2 < symbolWidth; s2++) {
10124								row[offsetS + s2] ^= symbolRow[s2];
10125							}
10126							break;
10127						default:
10128							throw new Jbig2Error(`operator ${combinationOperator} is not supported`);
10129					}
10130				}
10131			}
10132			i++;
10133			const deltaS = huffman ? huffmanTables.tableDeltaS.decode(huffmanInput) : decodeInteger(contextCache, "IADS", decoder);
10134			if (deltaS === null) {
10135				break;
10136			}
10137			currentS += increment + deltaS + dsOffset;
10138		} while (true);
10139	}
10140	return bitmap;
10141}
10142function decodePatternDictionary(mmr, patternWidth, patternHeight, maxPatternIndex, template, decodingContext) {
10143	const at = [];
10144	if (!mmr) {
10145		at.push({
10146			x: -patternWidth,
10147			y: 0
10148		});
10149		if (template === 0) {
10150			at.push({
10151				x: -3,
10152				y: -1
10153			}, {
10154				x: 2,
10155				y: -2
10156			}, {
10157				x: -2,
10158				y: -2
10159			});
10160		}
10161	}
10162	const collectiveWidth = (maxPatternIndex + 1) * patternWidth;
10163	const collectiveBitmap = decodeBitmap(mmr, collectiveWidth, patternHeight, template, false, null, at, decodingContext);
10164	const patterns = [];
10165	for (let i = 0; i <= maxPatternIndex; i++) {
10166		const patternBitmap = [];
10167		const xMin = patternWidth * i;
10168		const xMax = xMin + patternWidth;
10169		for (let y = 0; y < patternHeight; y++) {
10170			patternBitmap.push(collectiveBitmap[y].subarray(xMin, xMax));
10171		}
10172		patterns.push(patternBitmap);
10173	}
10174	return patterns;
10175}
10176function decodeHalftoneRegion(mmr, patterns, template, regionWidth, regionHeight, defaultPixelValue, enableSkip, combinationOperator, gridWidth, gridHeight, gridOffsetX, gridOffsetY, gridVectorX, gridVectorY, decodingContext) {
10177	const skip = null;
10178	if (enableSkip) {
10179		throw new Jbig2Error("skip is not supported");
10180	}
10181	if (combinationOperator !== 0) {
10182		throw new Jbig2Error(`operator "${combinationOperator}" is not supported in halftone region`);
10183	}
10184	const regionBitmap = [];
10185	let i, j, row;
10186	for (i = 0; i < regionHeight; i++) {
10187		row = new Uint8Array(regionWidth);
10188		if (defaultPixelValue) {
10189			for (j = 0; j < regionWidth; j++) {
10190				row[j] = defaultPixelValue;
10191			}
10192		}
10193		regionBitmap.push(row);
10194	}
10195	const numberOfPatterns = patterns.length;
10196	const pattern0 = patterns[0];
10197	const patternWidth = pattern0[0].length,
10198		patternHeight = pattern0.length;
10199	const bitsPerValue = log2(numberOfPatterns);
10200	const at = [];
10201	if (!mmr) {
10202		at.push({
10203			x: template <= 1 ? 3 : 2,
10204			y: -1
10205		});
10206		if (template === 0) {
10207			at.push({
10208				x: -3,
10209				y: -1
10210			}, {
10211				x: 2,
10212				y: -2
10213			}, {
10214				x: -2,
10215				y: -2
10216			});
10217		}
10218	}
10219	const grayScaleBitPlanes = [];
10220	let mmrInput, bitmap;
10221	if (mmr) {
10222		mmrInput = new Reader(decodingContext.data, decodingContext.start, decodingContext.end);
10223	}
10224	for (i = bitsPerValue - 1; i >= 0; i--) {
10225		if (mmr) {
10226			bitmap = decodeMMRBitmap(mmrInput, gridWidth, gridHeight, true);
10227		} else {
10228			bitmap = decodeBitmap(false, gridWidth, gridHeight, template, false, skip, at, decodingContext);
10229		}
10230		grayScaleBitPlanes[i] = bitmap;
10231	}
10232	let mg, ng, bit, patternIndex, patternBitmap, x, y, patternRow, regionRow;
10233	for (mg = 0; mg < gridHeight; mg++) {
10234		for (ng = 0; ng < gridWidth; ng++) {
10235			bit = 0;
10236			patternIndex = 0;
10237			for (j = bitsPerValue - 1; j >= 0; j--) {
10238				bit ^= grayScaleBitPlanes[j][mg][ng];
10239				patternIndex |= bit << j;
10240			}
10241			patternBitmap = patterns[patternIndex];
10242			x = gridOffsetX + mg * gridVectorY + ng * gridVectorX >> 8;
10243			y = gridOffsetY + mg * gridVectorX - ng * gridVectorY >> 8;
10244			if (x >= 0 && x + patternWidth <= regionWidth && y >= 0 && y + patternHeight <= regionHeight) {
10245				for (i = 0; i < patternHeight; i++) {
10246					regionRow = regionBitmap[y + i];
10247					patternRow = patternBitmap[i];
10248					for (j = 0; j < patternWidth; j++) {
10249						regionRow[x + j] |= patternRow[j];
10250					}
10251				}
10252			} else {
10253				let regionX, regionY;
10254				for (i = 0; i < patternHeight; i++) {
10255					regionY = y + i;
10256					if (regionY < 0 || regionY >= regionHeight) {
10257						continue;
10258					}
10259					regionRow = regionBitmap[regionY];
10260					patternRow = patternBitmap[i];
10261					for (j = 0; j < patternWidth; j++) {
10262						regionX = x + j;
10263						if (regionX >= 0 && regionX < regionWidth) {
10264							regionRow[regionX] |= patternRow[j];
10265						}
10266					}
10267				}
10268			}
10269		}
10270	}
10271	return regionBitmap;
10272}
10273function readSegmentHeader(data, start) {
10274	const segmentHeader = {};
10275	segmentHeader.number = readUint32(data, start);
10276	const flags = data[start + 4];
10277	const segmentType = flags & 0x3f;
10278	if (!SegmentTypes[segmentType]) {
10279		throw new Jbig2Error("invalid segment type: " + segmentType);
10280	}
10281	segmentHeader.type = segmentType;
10282	segmentHeader.typeName = SegmentTypes[segmentType];
10283	segmentHeader.deferredNonRetain = !!(flags & 0x80);
10284	const pageAssociationFieldSize = !!(flags & 0x40);
10285	const referredFlags = data[start + 5];
10286	let referredToCount = referredFlags >> 5 & 7;
10287	const retainBits = [referredFlags & 31];
10288	let position = start + 6;
10289	if (referredFlags === 7) {
10290		referredToCount = readUint32(data, position - 1) & 0x1fffffff;
10291		position += 3;
10292		let bytes = referredToCount + 7 >> 3;
10293		retainBits[0] = data[position++];
10294		while (--bytes > 0) {
10295			retainBits.push(data[position++]);
10296		}
10297	} else if (referredFlags === 5 || referredFlags === 6) {
10298		throw new Jbig2Error("invalid referred-to flags");
10299	}
10300	segmentHeader.retainBits = retainBits;
10301	let referredToSegmentNumberSize = 4;
10302	if (segmentHeader.number <= 256) {
10303		referredToSegmentNumberSize = 1;
10304	} else if (segmentHeader.number <= 65536) {
10305		referredToSegmentNumberSize = 2;
10306	}
10307	const referredTo = [];
10308	let i, ii;
10309	for (i = 0; i < referredToCount; i++) {
10310		let number;
10311		if (referredToSegmentNumberSize === 1) {
10312			number = data[position];
10313		} else if (referredToSegmentNumberSize === 2) {
10314			number = readUint16(data, position);
10315		} else {
10316			number = readUint32(data, position);
10317		}
10318		referredTo.push(number);
10319		position += referredToSegmentNumberSize;
10320	}
10321	segmentHeader.referredTo = referredTo;
10322	if (!pageAssociationFieldSize) {
10323		segmentHeader.pageAssociation = data[position++];
10324	} else {
10325		segmentHeader.pageAssociation = readUint32(data, position);
10326		position += 4;
10327	}
10328	segmentHeader.length = readUint32(data, position);
10329	position += 4;
10330	if (segmentHeader.length === 0xffffffff) {
10331		if (segmentType === 38) {
10332			const genericRegionInfo = readRegionSegmentInformation(data, position);
10333			const genericRegionSegmentFlags = data[position + RegionSegmentInformationFieldLength];
10334			const genericRegionMmr = !!(genericRegionSegmentFlags & 1);
10335			const searchPatternLength = 6;
10336			const searchPattern = new Uint8Array(searchPatternLength);
10337			if (!genericRegionMmr) {
10338				searchPattern[0] = 0xff;
10339				searchPattern[1] = 0xac;
10340			}
10341			searchPattern[2] = genericRegionInfo.height >>> 24 & 0xff;
10342			searchPattern[3] = genericRegionInfo.height >> 16 & 0xff;
10343			searchPattern[4] = genericRegionInfo.height >> 8 & 0xff;
10344			searchPattern[5] = genericRegionInfo.height & 0xff;
10345			for (i = position, ii = data.length; i < ii; i++) {
10346				let j = 0;
10347				while (j < searchPatternLength && searchPattern[j] === data[i + j]) {
10348					j++;
10349				}
10350				if (j === searchPatternLength) {
10351					segmentHeader.length = i + searchPatternLength;
10352					break;
10353				}
10354			}
10355			if (segmentHeader.length === 0xffffffff) {
10356				throw new Jbig2Error("segment end was not found");
10357			}
10358		} else {
10359			throw new Jbig2Error("invalid unknown segment length");
10360		}
10361	}
10362	segmentHeader.headerEnd = position;
10363	return segmentHeader;
10364}
10365function readSegments(header, data, start, end) {
10366	const segments = [];
10367	let position = start;
10368	while (position < end) {
10369		const segmentHeader = readSegmentHeader(data, position);
10370		position = segmentHeader.headerEnd;
10371		const segment = {
10372			header: segmentHeader,
10373			data
10374		};
10375		if (!header.randomAccess) {
10376			segment.start = position;
10377			position += segmentHeader.length;
10378			segment.end = position;
10379		}
10380		segments.push(segment);
10381		if (segmentHeader.type === 51) {
10382			break;
10383		}
10384	}
10385	if (header.randomAccess) {
10386		for (let i = 0, ii = segments.length; i < ii; i++) {
10387			segments[i].start = position;
10388			position += segments[i].header.length;
10389			segments[i].end = position;
10390		}
10391	}
10392	return segments;
10393}
10394function readRegionSegmentInformation(data, start) {
10395	return {
10396		width: readUint32(data, start),
10397		height: readUint32(data, start + 4),
10398		x: readUint32(data, start + 8),
10399		y: readUint32(data, start + 12),
10400		combinationOperator: data[start + 16] & 7
10401	};
10402}
10403const RegionSegmentInformationFieldLength = 17;
10404function processSegment(segment, visitor) {
10405	const header = segment.header;
10406	const data = segment.data,
10407		end = segment.end;
10408	let position = segment.start;
10409	let args, at, i, atLength;
10410	switch (header.type) {
10411		case 0:
10412			const dictionary = {};
10413			const dictionaryFlags = readUint16(data, position);
10414			dictionary.huffman = !!(dictionaryFlags & 1);
10415			dictionary.refinement = !!(dictionaryFlags & 2);
10416			dictionary.huffmanDHSelector = dictionaryFlags >> 2 & 3;
10417			dictionary.huffmanDWSelector = dictionaryFlags >> 4 & 3;
10418			dictionary.bitmapSizeSelector = dictionaryFlags >> 6 & 1;
10419			dictionary.aggregationInstancesSelector = dictionaryFlags >> 7 & 1;
10420			dictionary.bitmapCodingContextUsed = !!(dictionaryFlags & 256);
10421			dictionary.bitmapCodingContextRetained = !!(dictionaryFlags & 512);
10422			dictionary.template = dictionaryFlags >> 10 & 3;
10423			dictionary.refinementTemplate = dictionaryFlags >> 12 & 1;
10424			position += 2;
10425			if (!dictionary.huffman) {
10426				atLength = dictionary.template === 0 ? 4 : 1;
10427				at = [];
10428				for (i = 0; i < atLength; i++) {
10429					at.push({
10430						x: readInt8(data, position),
10431						y: readInt8(data, position + 1)
10432					});
10433					position += 2;
10434				}
10435				dictionary.at = at;
10436			}
10437			if (dictionary.refinement && !dictionary.refinementTemplate) {
10438				at = [];
10439				for (i = 0; i < 2; i++) {
10440					at.push({
10441						x: readInt8(data, position),
10442						y: readInt8(data, position + 1)
10443					});
10444					position += 2;
10445				}
10446				dictionary.refinementAt = at;
10447			}
10448			dictionary.numberOfExportedSymbols = readUint32(data, position);
10449			position += 4;
10450			dictionary.numberOfNewSymbols = readUint32(data, position);
10451			position += 4;
10452			args = [dictionary, header.number, header.referredTo, data, position, end];
10453			break;
10454		case 6:
10455		case 7:
10456			const textRegion = {};
10457			textRegion.info = readRegionSegmentInformation(data, position);
10458			position += RegionSegmentInformationFieldLength;
10459			const textRegionSegmentFlags = readUint16(data, position);
10460			position += 2;
10461			textRegion.huffman = !!(textRegionSegmentFlags & 1);
10462			textRegion.refinement = !!(textRegionSegmentFlags & 2);
10463			textRegion.logStripSize = textRegionSegmentFlags >> 2 & 3;
10464			textRegion.stripSize = 1 << textRegion.logStripSize;
10465			textRegion.referenceCorner = textRegionSegmentFlags >> 4 & 3;
10466			textRegion.transposed = !!(textRegionSegmentFlags & 64);
10467			textRegion.combinationOperator = textRegionSegmentFlags >> 7 & 3;
10468			textRegion.defaultPixelValue = textRegionSegmentFlags >> 9 & 1;
10469			textRegion.dsOffset = textRegionSegmentFlags << 17 >> 27;
10470			textRegion.refinementTemplate = textRegionSegmentFlags >> 15 & 1;
10471			if (textRegion.huffman) {
10472				const textRegionHuffmanFlags = readUint16(data, position);
10473				position += 2;
10474				textRegion.huffmanFS = textRegionHuffmanFlags & 3;
10475				textRegion.huffmanDS = textRegionHuffmanFlags >> 2 & 3;
10476				textRegion.huffmanDT = textRegionHuffmanFlags >> 4 & 3;
10477				textRegion.huffmanRefinementDW = textRegionHuffmanFlags >> 6 & 3;
10478				textRegion.huffmanRefinementDH = textRegionHuffmanFlags >> 8 & 3;
10479				textRegion.huffmanRefinementDX = textRegionHuffmanFlags >> 10 & 3;
10480				textRegion.huffmanRefinementDY = textRegionHuffmanFlags >> 12 & 3;
10481				textRegion.huffmanRefinementSizeSelector = !!(textRegionHuffmanFlags & 0x4000);
10482			}
10483			if (textRegion.refinement && !textRegion.refinementTemplate) {
10484				at = [];
10485				for (i = 0; i < 2; i++) {
10486					at.push({
10487						x: readInt8(data, position),
10488						y: readInt8(data, position + 1)
10489					});
10490					position += 2;
10491				}
10492				textRegion.refinementAt = at;
10493			}
10494			textRegion.numberOfSymbolInstances = readUint32(data, position);
10495			position += 4;
10496			args = [textRegion, header.referredTo, data, position, end];
10497			break;
10498		case 16:
10499			const patternDictionary = {};
10500			const patternDictionaryFlags = data[position++];
10501			patternDictionary.mmr = !!(patternDictionaryFlags & 1);
10502			patternDictionary.template = patternDictionaryFlags >> 1 & 3;
10503			patternDictionary.patternWidth = data[position++];
10504			patternDictionary.patternHeight = data[position++];
10505			patternDictionary.maxPatternIndex = readUint32(data, position);
10506			position += 4;
10507			args = [patternDictionary, header.number, data, position, end];
10508			break;
10509		case 22:
10510		case 23:
10511			const halftoneRegion = {};
10512			halftoneRegion.info = readRegionSegmentInformation(data, position);
10513			position += RegionSegmentInformationFieldLength;
10514			const halftoneRegionFlags = data[position++];
10515			halftoneRegion.mmr = !!(halftoneRegionFlags & 1);
10516			halftoneRegion.template = halftoneRegionFlags >> 1 & 3;
10517			halftoneRegion.enableSkip = !!(halftoneRegionFlags & 8);
10518			halftoneRegion.combinationOperator = halftoneRegionFlags >> 4 & 7;
10519			halftoneRegion.defaultPixelValue = halftoneRegionFlags >> 7 & 1;
10520			halftoneRegion.gridWidth = readUint32(data, position);
10521			position += 4;
10522			halftoneRegion.gridHeight = readUint32(data, position);
10523			position += 4;
10524			halftoneRegion.gridOffsetX = readUint32(data, position) & 0xffffffff;
10525			position += 4;
10526			halftoneRegion.gridOffsetY = readUint32(data, position) & 0xffffffff;
10527			position += 4;
10528			halftoneRegion.gridVectorX = readUint16(data, position);
10529			position += 2;
10530			halftoneRegion.gridVectorY = readUint16(data, position);
10531			position += 2;
10532			args = [halftoneRegion, header.referredTo, data, position, end];
10533			break;
10534		case 38:
10535		case 39:
10536			const genericRegion = {};
10537			genericRegion.info = readRegionSegmentInformation(data, position);
10538			position += RegionSegmentInformationFieldLength;
10539			const genericRegionSegmentFlags = data[position++];
10540			genericRegion.mmr = !!(genericRegionSegmentFlags & 1);
10541			genericRegion.template = genericRegionSegmentFlags >> 1 & 3;
10542			genericRegion.prediction = !!(genericRegionSegmentFlags & 8);
10543			if (!genericRegion.mmr) {
10544				atLength = genericRegion.template === 0 ? 4 : 1;
10545				at = [];
10546				for (i = 0; i < atLength; i++) {
10547					at.push({
10548						x: readInt8(data, position),
10549						y: readInt8(data, position + 1)
10550					});
10551					position += 2;
10552				}
10553				genericRegion.at = at;
10554			}
10555			args = [genericRegion, data, position, end];
10556			break;
10557		case 48:
10558			const pageInfo = {
10559				width: readUint32(data, position),
10560				height: readUint32(data, position + 4),
10561				resolutionX: readUint32(data, position + 8),
10562				resolutionY: readUint32(data, position + 12)
10563			};
10564			if (pageInfo.height === 0xffffffff) {
10565				delete pageInfo.height;
10566			}
10567			const pageSegmentFlags = data[position + 16];
10568			readUint16(data, position + 17);
10569			pageInfo.lossless = !!(pageSegmentFlags & 1);
10570			pageInfo.refinement = !!(pageSegmentFlags & 2);
10571			pageInfo.defaultPixelValue = pageSegmentFlags >> 2 & 1;
10572			pageInfo.combinationOperator = pageSegmentFlags >> 3 & 3;
10573			pageInfo.requiresBuffer = !!(pageSegmentFlags & 32);
10574			pageInfo.combinationOperatorOverride = !!(pageSegmentFlags & 64);
10575			args = [pageInfo];
10576			break;
10577		case 49:
10578			break;
10579		case 50:
10580			break;
10581		case 51:
10582			break;
10583		case 53:
10584			args = [header.number, data, position, end];
10585			break;
10586		case 62:
10587			break;
10588		default:
10589			throw new Jbig2Error(`segment type ${header.typeName}(${header.type}) is not implemented`);
10590	}
10591	const callbackName = "on" + header.typeName;
10592	if (callbackName in visitor) {
10593		visitor[callbackName].apply(visitor, args);
10594	}
10595}
10596function processSegments(segments, visitor) {
10597	for (let i = 0, ii = segments.length; i < ii; i++) {
10598		processSegment(segments[i], visitor);
10599	}
10600}
10601function parseJbig2Chunks(chunks) {
10602	const visitor = new SimpleSegmentVisitor();
10603	for (let i = 0, ii = chunks.length; i < ii; i++) {
10604		const chunk = chunks[i];
10605		const segments = readSegments({}, chunk.data, chunk.start, chunk.end);
10606		processSegments(segments, visitor);
10607	}
10608	return visitor.buffer;
10609}
10610function parseJbig2(data) {
10611	throw new Error("Not implemented: parseJbig2");
10612}
10613class SimpleSegmentVisitor {
10614	onPageInformation(info) {
10615		this.currentPageInfo = info;
10616		const rowSize = info.width + 7 >> 3;
10617		const buffer = new Uint8ClampedArray(rowSize * info.height);
10618		if (info.defaultPixelValue) {
10619			buffer.fill(0xff);
10620		}
10621		this.buffer = buffer;
10622	}
10623	drawBitmap(regionInfo, bitmap) {
10624		const pageInfo = this.currentPageInfo;
10625		const width = regionInfo.width,
10626			height = regionInfo.height;
10627		const rowSize = pageInfo.width + 7 >> 3;
10628		const combinationOperator = pageInfo.combinationOperatorOverride ? regionInfo.combinationOperator : pageInfo.combinationOperator;
10629		const buffer = this.buffer;
10630		const mask0 = 128 >> (regionInfo.x & 7);
10631		let offset0 = regionInfo.y * rowSize + (regionInfo.x >> 3);
10632		let i, j, mask, offset;
10633		switch (combinationOperator) {
10634			case 0:
10635				for (i = 0; i < height; i++) {
10636					mask = mask0;
10637					offset = offset0;
10638					for (j = 0; j < width; j++) {
10639						if (bitmap[i][j]) {
10640							buffer[offset] |= mask;
10641						}
10642						mask >>= 1;
10643						if (!mask) {
10644							mask = 128;
10645							offset++;
10646						}
10647					}
10648					offset0 += rowSize;
10649				}
10650				break;
10651			case 2:
10652				for (i = 0; i < height; i++) {
10653					mask = mask0;
10654					offset = offset0;
10655					for (j = 0; j < width; j++) {
10656						if (bitmap[i][j]) {
10657							buffer[offset] ^= mask;
10658						}
10659						mask >>= 1;
10660						if (!mask) {
10661							mask = 128;
10662							offset++;
10663						}
10664					}
10665					offset0 += rowSize;
10666				}
10667				break;
10668			default:
10669				throw new Jbig2Error(`operator ${combinationOperator} is not supported`);
10670		}
10671	}
10672	onImmediateGenericRegion(region, data, start, end) {
10673		const regionInfo = region.info;
10674		const decodingContext = new DecodingContext(data, start, end);
10675		const bitmap = decodeBitmap(region.mmr, regionInfo.width, regionInfo.height, region.template, region.prediction, null, region.at, decodingContext);
10676		this.drawBitmap(regionInfo, bitmap);
10677	}
10678	onImmediateLosslessGenericRegion() {
10679		this.onImmediateGenericRegion(...arguments);
10680	}
10681	onSymbolDictionary(dictionary, currentSegment, referredSegments, data, start, end) {
10682		let huffmanTables, huffmanInput;
10683		if (dictionary.huffman) {
10684			huffmanTables = getSymbolDictionaryHuffmanTables(dictionary, referredSegments, this.customTables);
10685			huffmanInput = new Reader(data, start, end);
10686		}
10687		let symbols = this.symbols;
10688		if (!symbols) {
10689			this.symbols = symbols = {};
10690		}
10691		const inputSymbols = [];
10692		for (const referredSegment of referredSegments) {
10693			const referredSymbols = symbols[referredSegment];
10694			if (referredSymbols) {
10695				inputSymbols.push(...referredSymbols);
10696			}
10697		}
10698		const decodingContext = new DecodingContext(data, start, end);
10699		symbols[currentSegment] = decodeSymbolDictionary(dictionary.huffman, dictionary.refinement, inputSymbols, dictionary.numberOfNewSymbols, dictionary.numberOfExportedSymbols, huffmanTables, dictionary.template, dictionary.at, dictionary.refinementTemplate, dictionary.refinementAt, decodingContext, huffmanInput);
10700	}
10701	onImmediateTextRegion(region, referredSegments, data, start, end) {
10702		const regionInfo = region.info;
10703		let huffmanTables, huffmanInput;
10704		const symbols = this.symbols;
10705		const inputSymbols = [];
10706		for (const referredSegment of referredSegments) {
10707			const referredSymbols = symbols[referredSegment];
10708			if (referredSymbols) {
10709				inputSymbols.push(...referredSymbols);
10710			}
10711		}
10712		const symbolCodeLength = log2(inputSymbols.length);
10713		if (region.huffman) {
10714			huffmanInput = new Reader(data, start, end);
10715			huffmanTables = getTextRegionHuffmanTables(region, referredSegments, this.customTables, inputSymbols.length, huffmanInput);
10716		}
10717		const decodingContext = new DecodingContext(data, start, end);
10718		const bitmap = decodeTextRegion(region.huffman, region.refinement, regionInfo.width, regionInfo.height, region.defaultPixelValue, region.numberOfSymbolInstances, region.stripSize, inputSymbols, symbolCodeLength, region.transposed, region.dsOffset, region.referenceCorner, region.combinationOperator, huffmanTables, region.refinementTemplate, region.refinementAt, decodingContext, region.logStripSize, huffmanInput);
10719		this.drawBitmap(regionInfo, bitmap);
10720	}
10721	onImmediateLosslessTextRegion() {
10722		this.onImmediateTextRegion(...arguments);
10723	}
10724	onPatternDictionary(dictionary, currentSegment, data, start, end) {
10725		let patterns = this.patterns;
10726		if (!patterns) {
10727			this.patterns = patterns = {};
10728		}
10729		const decodingContext = new DecodingContext(data, start, end);
10730		patterns[currentSegment] = decodePatternDictionary(dictionary.mmr, dictionary.patternWidth, dictionary.patternHeight, dictionary.maxPatternIndex, dictionary.template, decodingContext);
10731	}
10732	onImmediateHalftoneRegion(region, referredSegments, data, start, end) {
10733		const patterns = this.patterns[referredSegments[0]];
10734		const regionInfo = region.info;
10735		const decodingContext = new DecodingContext(data, start, end);
10736		const bitmap = decodeHalftoneRegion(region.mmr, patterns, region.template, regionInfo.width, regionInfo.height, region.defaultPixelValue, region.enableSkip, region.combinationOperator, region.gridWidth, region.gridHeight, region.gridOffsetX, region.gridOffsetY, region.gridVectorX, region.gridVectorY, decodingContext);
10737		this.drawBitmap(regionInfo, bitmap);
10738	}
10739	onImmediateLosslessHalftoneRegion() {
10740		this.onImmediateHalftoneRegion(...arguments);
10741	}
10742	onTables(currentSegment, data, start, end) {
10743		let customTables = this.customTables;
10744		if (!customTables) {
10745			this.customTables = customTables = {};
10746		}
10747		customTables[currentSegment] = decodeTablesSegment(data, start, end);
10748	}
10749}
10750class HuffmanLine {
10751	constructor(lineData) {
10752		if (lineData.length === 2) {
10753			this.isOOB = true;
10754			this.rangeLow = 0;
10755			this.prefixLength = lineData[0];
10756			this.rangeLength = 0;
10757			this.prefixCode = lineData[1];
10758			this.isLowerRange = false;
10759		} else {
10760			this.isOOB = false;
10761			this.rangeLow = lineData[0];
10762			this.prefixLength = lineData[1];
10763			this.rangeLength = lineData[2];
10764			this.prefixCode = lineData[3];
10765			this.isLowerRange = lineData[4] === "lower";
10766		}
10767	}
10768}
10769class HuffmanTreeNode {
10770	constructor(line) {
10771		this.children = [];
10772		if (line) {
10773			this.isLeaf = true;
10774			this.rangeLength = line.rangeLength;
10775			this.rangeLow = line.rangeLow;
10776			this.isLowerRange = line.isLowerRange;
10777			this.isOOB = line.isOOB;
10778		} else {
10779			this.isLeaf = false;
10780		}
10781	}
10782	buildTree(line, shift) {
10783		const bit = line.prefixCode >> shift & 1;
10784		if (shift <= 0) {
10785			this.children[bit] = new HuffmanTreeNode(line);
10786		} else {
10787			let node = this.children[bit];
10788			if (!node) {
10789				this.children[bit] = node = new HuffmanTreeNode(null);
10790			}
10791			node.buildTree(line, shift - 1);
10792		}
10793	}
10794	decodeNode(reader) {
10795		if (this.isLeaf) {
10796			if (this.isOOB) {
10797				return null;
10798			}
10799			const htOffset = reader.readBits(this.rangeLength);
10800			return this.rangeLow + (this.isLowerRange ? -htOffset : htOffset);
10801		}
10802		const node = this.children[reader.readBit()];
10803		if (!node) {
10804			throw new Jbig2Error("invalid Huffman data");
10805		}
10806		return node.decodeNode(reader);
10807	}
10808}
10809class HuffmanTable {
10810	constructor(lines, prefixCodesDone) {
10811		if (!prefixCodesDone) {
10812			this.assignPrefixCodes(lines);
10813		}
10814		this.rootNode = new HuffmanTreeNode(null);
10815		for (let i = 0, ii = lines.length; i < ii; i++) {
10816			const line = lines[i];
10817			if (line.prefixLength > 0) {
10818				this.rootNode.buildTree(line, line.prefixLength - 1);
10819			}
10820		}
10821	}
10822	decode(reader) {
10823		return this.rootNode.decodeNode(reader);
10824	}
10825	assignPrefixCodes(lines) {
10826		const linesLength = lines.length;
10827		let prefixLengthMax = 0;
10828		for (let i = 0; i < linesLength; i++) {
10829			prefixLengthMax = Math.max(prefixLengthMax, lines[i].prefixLength);
10830		}
10831		const histogram = new Uint32Array(prefixLengthMax + 1);
10832		for (let i = 0; i < linesLength; i++) {
10833			histogram[lines[i].prefixLength]++;
10834		}
10835		let currentLength = 1,
10836			firstCode = 0,
10837			currentCode,
10838			currentTemp,
10839			line;
10840		histogram[0] = 0;
10841		while (currentLength <= prefixLengthMax) {
10842			firstCode = firstCode + histogram[currentLength - 1] << 1;
10843			currentCode = firstCode;
10844			currentTemp = 0;
10845			while (currentTemp < linesLength) {
10846				line = lines[currentTemp];
10847				if (line.prefixLength === currentLength) {
10848					line.prefixCode = currentCode;
10849					currentCode++;
10850				}
10851				currentTemp++;
10852			}
10853			currentLength++;
10854		}
10855	}
10856}
10857function decodeTablesSegment(data, start, end) {
10858	const flags = data[start];
10859	const lowestValue = readUint32(data, start + 1) & 0xffffffff;
10860	const highestValue = readUint32(data, start + 5) & 0xffffffff;
10861	const reader = new Reader(data, start + 9, end);
10862	const prefixSizeBits = (flags >> 1 & 7) + 1;
10863	const rangeSizeBits = (flags >> 4 & 7) + 1;
10864	const lines = [];
10865	let prefixLength,
10866		rangeLength,
10867		currentRangeLow = lowestValue;
10868	do {
10869		prefixLength = reader.readBits(prefixSizeBits);
10870		rangeLength = reader.readBits(rangeSizeBits);
10871		lines.push(new HuffmanLine([currentRangeLow, prefixLength, rangeLength, 0]));
10872		currentRangeLow += 1 << rangeLength;
10873	} while (currentRangeLow < highestValue);
10874	prefixLength = reader.readBits(prefixSizeBits);
10875	lines.push(new HuffmanLine([lowestValue - 1, prefixLength, 32, 0, "lower"]));
10876	prefixLength = reader.readBits(prefixSizeBits);
10877	lines.push(new HuffmanLine([highestValue, prefixLength, 32, 0]));
10878	if (flags & 1) {
10879		prefixLength = reader.readBits(prefixSizeBits);
10880		lines.push(new HuffmanLine([prefixLength, 0]));
10881	}
10882	return new HuffmanTable(lines, false);
10883}
10884const standardTablesCache = {};
10885function getStandardTable(number) {
10886	let table = standardTablesCache[number];
10887	if (table) {
10888		return table;
10889	}
10890	let lines;
10891	switch (number) {
10892		case 1:
10893			lines = [[0, 1, 4, 0x0], [16, 2, 8, 0x2], [272, 3, 16, 0x6], [65808, 3, 32, 0x7]];
10894			break;
10895		case 2:
10896			lines = [[0, 1, 0, 0x0], [1, 2, 0, 0x2], [2, 3, 0, 0x6], [3, 4, 3, 0xe], [11, 5, 6, 0x1e], [75, 6, 32, 0x3e], [6, 0x3f]];
10897			break;
10898		case 3:
10899			lines = [[-256, 8, 8, 0xfe], [0, 1, 0, 0x0], [1, 2, 0, 0x2], [2, 3, 0, 0x6], [3, 4, 3, 0xe], [11, 5, 6, 0x1e], [-257, 8, 32, 0xff, "lower"], [75, 7, 32, 0x7e], [6, 0x3e]];
10900			break;
10901		case 4:
10902			lines = [[1, 1, 0, 0x0], [2, 2, 0, 0x2], [3, 3, 0, 0x6], [4, 4, 3, 0xe], [12, 5, 6, 0x1e], [76, 5, 32, 0x1f]];
10903			break;
10904		case 5:
10905			lines = [[-255, 7, 8, 0x7e], [1, 1, 0, 0x0], [2, 2, 0, 0x2], [3, 3, 0, 0x6], [4, 4, 3, 0xe], [12, 5, 6, 0x1e], [-256, 7, 32, 0x7f, "lower"], [76, 6, 32, 0x3e]];
10906			break;
10907		case 6:
10908			lines = [[-2048, 5, 10, 0x1c], [-1024, 4, 9, 0x8], [-512, 4, 8, 0x9], [-256, 4, 7, 0xa], [-128, 5, 6, 0x1d], [-64, 5, 5, 0x1e], [-32, 4, 5, 0xb], [0, 2, 7, 0x0], [128, 3, 7, 0x2], [256, 3, 8, 0x3], [512, 4, 9, 0xc], [1024, 4, 10, 0xd], [-2049, 6, 32, 0x3e, "lower"], [2048, 6, 32, 0x3f]];
10909			break;
10910		case 7:
10911			lines = [[-1024, 4, 9, 0x8], [-512, 3, 8, 0x0], [-256, 4, 7, 0x9], [-128, 5, 6, 0x1a], [-64, 5, 5, 0x1b], [-32, 4, 5, 0xa], [0, 4, 5, 0xb], [32, 5, 5, 0x1c], [64, 5, 6, 0x1d], [128, 4, 7, 0xc], [256, 3, 8, 0x1], [512, 3, 9, 0x2], [1024, 3, 10, 0x3], [-1025, 5, 32, 0x1e, "lower"], [2048, 5, 32, 0x1f]];
10912			break;
10913		case 8:
10914			lines = [[-15, 8, 3, 0xfc], [-7, 9, 1, 0x1fc], [-5, 8, 1, 0xfd], [-3, 9, 0, 0x1fd], [-2, 7, 0, 0x7c], [-1, 4, 0, 0xa], [0, 2, 1, 0x0], [2, 5, 0, 0x1a], [3, 6, 0, 0x3a], [4, 3, 4, 0x4], [20, 6, 1, 0x3b], [22, 4, 4, 0xb], [38, 4, 5, 0xc], [70, 5, 6, 0x1b], [134, 5, 7, 0x1c], [262, 6, 7, 0x3c], [390, 7, 8, 0x7d], [646, 6, 10, 0x3d], [-16, 9, 32, 0x1fe, "lower"], [1670, 9, 32, 0x1ff], [2, 0x1]];
10915			break;
10916		case 9:
10917			lines = [[-31, 8, 4, 0xfc], [-15, 9, 2, 0x1fc], [-11, 8, 2, 0xfd], [-7, 9, 1, 0x1fd], [-5, 7, 1, 0x7c], [-3, 4, 1, 0xa], [-1, 3, 1, 0x2], [1, 3, 1, 0x3], [3, 5, 1, 0x1a], [5, 6, 1, 0x3a], [7, 3, 5, 0x4], [39, 6, 2, 0x3b], [43, 4, 5, 0xb], [75, 4, 6, 0xc], [139, 5, 7, 0x1b], [267, 5, 8, 0x1c], [523, 6, 8, 0x3c], [779, 7, 9, 0x7d], [1291, 6, 11, 0x3d], [-32, 9, 32, 0x1fe, "lower"], [3339, 9, 32, 0x1ff], [2, 0x0]];
10918			break;
10919		case 10:
10920			lines = [[-21, 7, 4, 0x7a], [-5, 8, 0, 0xfc], [-4, 7, 0, 0x7b], [-3, 5, 0, 0x18], [-2, 2, 2, 0x0], [2, 5, 0, 0x19], [3, 6, 0, 0x36], [4, 7, 0, 0x7c], [5, 8, 0, 0xfd], [6, 2, 6, 0x1], [70, 5, 5, 0x1a], [102, 6, 5, 0x37], [134, 6, 6, 0x38], [198, 6, 7, 0x39], [326, 6, 8, 0x3a], [582, 6, 9, 0x3b], [1094, 6, 10, 0x3c], [2118, 7, 11, 0x7d], [-22, 8, 32, 0xfe, "lower"], [4166, 8, 32, 0xff], [2, 0x2]];
10921			break;
10922		case 11:
10923			lines = [[1, 1, 0, 0x0], [2, 2, 1, 0x2], [4, 4, 0, 0xc], [5, 4, 1, 0xd], [7, 5, 1, 0x1c], [9, 5, 2, 0x1d], [13, 6, 2, 0x3c], [17, 7, 2, 0x7a], [21, 7, 3, 0x7b], [29, 7, 4, 0x7c], [45, 7, 5, 0x7d], [77, 7, 6, 0x7e], [141, 7, 32, 0x7f]];
10924			break;
10925		case 12:
10926			lines = [[1, 1, 0, 0x0], [2, 2, 0, 0x2], [3, 3, 1, 0x6], [5, 5, 0, 0x1c], [6, 5, 1, 0x1d], [8, 6, 1, 0x3c], [10, 7, 0, 0x7a], [11, 7, 1, 0x7b], [13, 7, 2, 0x7c], [17, 7, 3, 0x7d], [25, 7, 4, 0x7e], [41, 8, 5, 0xfe], [73, 8, 32, 0xff]];
10927			break;
10928		case 13:
10929			lines = [[1, 1, 0, 0x0], [2, 3, 0, 0x4], [3, 4, 0, 0xc], [4, 5, 0, 0x1c], [5, 4, 1, 0xd], [7, 3, 3, 0x5], [15, 6, 1, 0x3a], [17, 6, 2, 0x3b], [21, 6, 3, 0x3c], [29, 6, 4, 0x3d], [45, 6, 5, 0x3e], [77, 7, 6, 0x7e], [141, 7, 32, 0x7f]];
10930			break;
10931		case 14:
10932			lines = [[-2, 3, 0, 0x4], [-1, 3, 0, 0x5], [0, 1, 0, 0x0], [1, 3, 0, 0x6], [2, 3, 0, 0x7]];
10933			break;
10934		case 15:
10935			lines = [[-24, 7, 4, 0x7c], [-8, 6, 2, 0x3c], [-4, 5, 1, 0x1c], [-2, 4, 0, 0xc], [-1, 3, 0, 0x4], [0, 1, 0, 0x0], [1, 3, 0, 0x5], [2, 4, 0, 0xd], [3, 5, 1, 0x1d], [5, 6, 2, 0x3d], [9, 7, 4, 0x7d], [-25, 7, 32, 0x7e, "lower"], [25, 7, 32, 0x7f]];
10936			break;
10937		default:
10938			throw new Jbig2Error(`standard table B.${number} does not exist`);
10939	}
10940	for (let i = 0, ii = lines.length; i < ii; i++) {
10941		lines[i] = new HuffmanLine(lines[i]);
10942	}
10943	table = new HuffmanTable(lines, true);
10944	standardTablesCache[number] = table;
10945	return table;
10946}
10947class Reader {
10948	constructor(data, start, end) {
10949		this.data = data;
10950		this.start = start;
10951		this.end = end;
10952		this.position = start;
10953		this.shift = -1;
10954		this.currentByte = 0;
10955	}
10956	readBit() {
10957		if (this.shift < 0) {
10958			if (this.position >= this.end) {
10959				throw new Jbig2Error("end of data while reading bit");
10960			}
10961			this.currentByte = this.data[this.position++];
10962			this.shift = 7;
10963		}
10964		const bit = this.currentByte >> this.shift & 1;
10965		this.shift--;
10966		return bit;
10967	}
10968	readBits(numBits) {
10969		let result = 0,
10970			i;
10971		for (i = numBits - 1; i >= 0; i--) {
10972			result |= this.readBit() << i;
10973		}
10974		return result;
10975	}
10976	byteAlign() {
10977		this.shift = -1;
10978	}
10979	next() {
10980		if (this.position >= this.end) {
10981			return -1;
10982		}
10983		return this.data[this.position++];
10984	}
10985}
10986function getCustomHuffmanTable(index, referredTo, customTables) {
10987	let currentIndex = 0;
10988	for (let i = 0, ii = referredTo.length; i < ii; i++) {
10989		const table = customTables[referredTo[i]];
10990		if (table) {
10991			if (index === currentIndex) {
10992				return table;
10993			}
10994			currentIndex++;
10995		}
10996	}
10997	throw new Jbig2Error("can't find custom Huffman table");
10998}
10999function getTextRegionHuffmanTables(textRegion, referredTo, customTables, numberOfSymbols, reader) {
11000	const codes = [];
11001	for (let i = 0; i <= 34; i++) {
11002		const codeLength = reader.readBits(4);
11003		codes.push(new HuffmanLine([i, codeLength, 0, 0]));
11004	}
11005	const runCodesTable = new HuffmanTable(codes, false);
11006	codes.length = 0;
11007	for (let i = 0; i < numberOfSymbols;) {
11008		const codeLength = runCodesTable.decode(reader);
11009		if (codeLength >= 32) {
11010			let repeatedLength, numberOfRepeats, j;
11011			switch (codeLength) {
11012				case 32:
11013					if (i === 0) {
11014						throw new Jbig2Error("no previous value in symbol ID table");
11015					}
11016					numberOfRepeats = reader.readBits(2) + 3;
11017					repeatedLength = codes[i - 1].prefixLength;
11018					break;
11019				case 33:
11020					numberOfRepeats = reader.readBits(3) + 3;
11021					repeatedLength = 0;
11022					break;
11023				case 34:
11024					numberOfRepeats = reader.readBits(7) + 11;
11025					repeatedLength = 0;
11026					break;
11027				default:
11028					throw new Jbig2Error("invalid code length in symbol ID table");
11029			}
11030			for (j = 0; j < numberOfRepeats; j++) {
11031				codes.push(new HuffmanLine([i, repeatedLength, 0, 0]));
11032				i++;
11033			}
11034		} else {
11035			codes.push(new HuffmanLine([i, codeLength, 0, 0]));
11036			i++;
11037		}
11038	}
11039	reader.byteAlign();
11040	const symbolIDTable = new HuffmanTable(codes, false);
11041	let customIndex = 0,
11042		tableFirstS,
11043		tableDeltaS,
11044		tableDeltaT;
11045	switch (textRegion.huffmanFS) {
11046		case 0:
11047		case 1:
11048			tableFirstS = getStandardTable(textRegion.huffmanFS + 6);
11049			break;
11050		case 3:
11051			tableFirstS = getCustomHuffmanTable(customIndex, referredTo, customTables);
11052			customIndex++;
11053			break;
11054		default:
11055			throw new Jbig2Error("invalid Huffman FS selector");
11056	}
11057	switch (textRegion.huffmanDS) {
11058		case 0:
11059		case 1:
11060		case 2:
11061			tableDeltaS = getStandardTable(textRegion.huffmanDS + 8);
11062			break;
11063		case 3:
11064			tableDeltaS = getCustomHuffmanTable(customIndex, referredTo, customTables);
11065			customIndex++;
11066			break;
11067		default:
11068			throw new Jbig2Error("invalid Huffman DS selector");
11069	}
11070	switch (textRegion.huffmanDT) {
11071		case 0:
11072		case 1:
11073		case 2:
11074			tableDeltaT = getStandardTable(textRegion.huffmanDT + 11);
11075			break;
11076		case 3:
11077			tableDeltaT = getCustomHuffmanTable(customIndex, referredTo, customTables);
11078			customIndex++;
11079			break;
11080		default:
11081			throw new Jbig2Error("invalid Huffman DT selector");
11082	}
11083	if (textRegion.refinement) {
11084		throw new Jbig2Error("refinement with Huffman is not supported");
11085	}
11086	return {
11087		symbolIDTable,
11088		tableFirstS,
11089		tableDeltaS,
11090		tableDeltaT
11091	};
11092}
11093function getSymbolDictionaryHuffmanTables(dictionary, referredTo, customTables) {
11094	let customIndex = 0,
11095		tableDeltaHeight,
11096		tableDeltaWidth;
11097	switch (dictionary.huffmanDHSelector) {
11098		case 0:
11099		case 1:
11100			tableDeltaHeight = getStandardTable(dictionary.huffmanDHSelector + 4);
11101			break;
11102		case 3:
11103			tableDeltaHeight = getCustomHuffmanTable(customIndex, referredTo, customTables);
11104			customIndex++;
11105			break;
11106		default:
11107			throw new Jbig2Error("invalid Huffman DH selector");
11108	}
11109	switch (dictionary.huffmanDWSelector) {
11110		case 0:
11111		case 1:
11112			tableDeltaWidth = getStandardTable(dictionary.huffmanDWSelector + 2);
11113			break;
11114		case 3:
11115			tableDeltaWidth = getCustomHuffmanTable(customIndex, referredTo, customTables);
11116			customIndex++;
11117			break;
11118		default:
11119			throw new Jbig2Error("invalid Huffman DW selector");
11120	}
11121	let tableBitmapSize, tableAggregateInstances;
11122	if (dictionary.bitmapSizeSelector) {
11123		tableBitmapSize = getCustomHuffmanTable(customIndex, referredTo, customTables);
11124		customIndex++;
11125	} else {
11126		tableBitmapSize = getStandardTable(1);
11127	}
11128	if (dictionary.aggregationInstancesSelector) {
11129		tableAggregateInstances = getCustomHuffmanTable(customIndex, referredTo, customTables);
11130	} else {
11131		tableAggregateInstances = getStandardTable(1);
11132	}
11133	return {
11134		tableDeltaHeight,
11135		tableDeltaWidth,
11136		tableBitmapSize,
11137		tableAggregateInstances
11138	};
11139}
11140function readUncompressedBitmap(reader, width, height) {
11141	const bitmap = [];
11142	for (let y = 0; y < height; y++) {
11143		const row = new Uint8Array(width);
11144		bitmap.push(row);
11145		for (let x = 0; x < width; x++) {
11146			row[x] = reader.readBit();
11147		}
11148		reader.byteAlign();
11149	}
11150	return bitmap;
11151}
11152function decodeMMRBitmap(input, width, height, endOfBlock) {
11153	const params = {
11154		K: -1,
11155		Columns: width,
11156		Rows: height,
11157		BlackIs1: true,
11158		EndOfBlock: endOfBlock
11159	};
11160	const decoder = new CCITTFaxDecoder(input, params);
11161	const bitmap = [];
11162	let currentByte,
11163		eof = false;
11164	for (let y = 0; y < height; y++) {
11165		const row = new Uint8Array(width);
11166		bitmap.push(row);
11167		let shift = -1;
11168		for (let x = 0; x < width; x++) {
11169			if (shift < 0) {
11170				currentByte = decoder.readNextChar();
11171				if (currentByte === -1) {
11172					currentByte = 0;
11173					eof = true;
11174				}
11175				shift = 7;
11176			}
11177			row[x] = currentByte >> shift & 1;
11178			shift--;
11179		}
11180	}
11181	if (endOfBlock && !eof) {
11182		const lookForEOFLimit = 5;
11183		for (let i = 0; i < lookForEOFLimit; i++) {
11184			if (decoder.readNextChar() === -1) {
11185				break;
11186			}
11187		}
11188	}
11189	return bitmap;
11190}
11191class Jbig2Image {
11192	parseChunks(chunks) {
11193		return parseJbig2Chunks(chunks);
11194	}
11195	parse(data) {
11196		throw new Error("Not implemented: Jbig2Image.parse");
11197	}
11198}
11199
11200;// ./src/core/jbig2_stream.js
11201
11202
11203
11204
11205
11206
11207class Jbig2Stream extends DecodeStream {
11208	constructor(stream, maybeLength, params) {
11209		super(maybeLength);
11210		this.stream = stream;
11211		this.dict = stream.dict;
11212		this.maybeLength = maybeLength;
11213		this.params = params;
11214	}
11215	get bytes() {
11216		return shadow(this, "bytes", this.stream.getBytes(this.maybeLength));
11217	}
11218	ensureBuffer(requested) {}
11219	readBlock() {
11220		this.decodeImage();
11221	}
11222	decodeImage(bytes) {
11223		if (this.eof) {
11224			return this.buffer;
11225		}
11226		bytes ||= this.bytes;
11227		const jbig2Image = new Jbig2Image();
11228		const chunks = [];
11229		if (this.params instanceof Dict) {
11230			const globalsStream = this.params.get("JBIG2Globals");
11231			if (globalsStream instanceof BaseStream) {
11232				const globals = globalsStream.getBytes();
11233				chunks.push({
11234					data: globals,
11235					start: 0,
11236					end: globals.length
11237				});
11238			}
11239		}
11240		chunks.push({
11241			data: bytes,
11242			start: 0,
11243			end: bytes.length
11244		});
11245		const data = jbig2Image.parseChunks(chunks);
11246		const dataLength = data.length;
11247		for (let i = 0; i < dataLength; i++) {
11248			data[i] ^= 0xff;
11249		}
11250		this.buffer = data;
11251		this.bufferLength = dataLength;
11252		this.eof = true;
11253		return this.buffer;
11254	}
11255	get canAsyncDecodeImageFromBuffer() {
11256		return this.stream.isAsync;
11257	}
11258}
11259
11260;// ./src/shared/image_utils.js
11261
11262
11263
11264
11265
11266
11267
11268function convertToRGBA(params) {
11269	switch (params.kind) {
11270		case ImageKind.GRAYSCALE_1BPP:
11271			return convertBlackAndWhiteToRGBA(params);
11272		case ImageKind.RGB_24BPP:
11273			return convertRGBToRGBA(params);
11274	}
11275	return null;
11276}
11277function convertBlackAndWhiteToRGBA({
11278	src,
11279	srcPos = 0,
11280	dest,
11281	width,
11282	height,
11283	nonBlackColor = 0xffffffff,
11284	inverseDecode = false
11285}) {
11286	const black = FeatureTest.isLittleEndian ? 0xff000000 : 0x000000ff;
11287	const [zeroMapping, oneMapping] = inverseDecode ? [nonBlackColor, black] : [black, nonBlackColor];
11288	const widthInSource = width >> 3;
11289	const widthRemainder = width & 7;
11290	const srcLength = src.length;
11291	dest = new Uint32Array(dest.buffer);
11292	let destPos = 0;
11293	for (let i = 0; i < height; i++) {
11294		for (const max = srcPos + widthInSource; srcPos < max; srcPos++) {
11295			const elem = srcPos < srcLength ? src[srcPos] : 255;
11296			dest[destPos++] = elem & 0b10000000 ? oneMapping : zeroMapping;
11297			dest[destPos++] = elem & 0b1000000 ? oneMapping : zeroMapping;
11298			dest[destPos++] = elem & 0b100000 ? oneMapping : zeroMapping;
11299			dest[destPos++] = elem & 0b10000 ? oneMapping : zeroMapping;
11300			dest[destPos++] = elem & 0b1000 ? oneMapping : zeroMapping;
11301			dest[destPos++] = elem & 0b100 ? oneMapping : zeroMapping;
11302			dest[destPos++] = elem & 0b10 ? oneMapping : zeroMapping;
11303			dest[destPos++] = elem & 0b1 ? oneMapping : zeroMapping;
11304		}
11305		if (widthRemainder === 0) {
11306			continue;
11307		}
11308		const elem = srcPos < srcLength ? src[srcPos++] : 255;
11309		for (let j = 0; j < widthRemainder; j++) {
11310			dest[destPos++] = elem & 1 << 7 - j ? oneMapping : zeroMapping;
11311		}
11312	}
11313	return {
11314		srcPos,
11315		destPos
11316	};
11317}
11318function convertRGBToRGBA({
11319	src,
11320	srcPos = 0,
11321	dest,
11322	destPos = 0,
11323	width,
11324	height
11325}) {
11326	let i = 0;
11327	const len = width * height * 3;
11328	const len32 = len >> 2;
11329	const src32 = new Uint32Array(src.buffer, srcPos, len32);
11330	if (FeatureTest.isLittleEndian) {
11331		for (; i < len32 - 2; i += 3, destPos += 4) {
11332			const s1 = src32[i];
11333			const s2 = src32[i + 1];
11334			const s3 = src32[i + 2];
11335			dest[destPos] = s1 | 0xff000000;
11336			dest[destPos + 1] = s1 >>> 24 | s2 << 8 | 0xff000000;
11337			dest[destPos + 2] = s2 >>> 16 | s3 << 16 | 0xff000000;
11338			dest[destPos + 3] = s3 >>> 8 | 0xff000000;
11339		}
11340		for (let j = i * 4, jj = srcPos + len; j < jj; j += 3) {
11341			dest[destPos++] = src[j] | src[j + 1] << 8 | src[j + 2] << 16 | 0xff000000;
11342		}
11343	} else {
11344		for (; i < len32 - 2; i += 3, destPos += 4) {
11345			const s1 = src32[i];
11346			const s2 = src32[i + 1];
11347			const s3 = src32[i + 2];
11348			dest[destPos] = s1 | 0xff;
11349			dest[destPos + 1] = s1 << 24 | s2 >>> 8 | 0xff;
11350			dest[destPos + 2] = s2 << 16 | s3 >>> 16 | 0xff;
11351			dest[destPos + 3] = s3 << 8 | 0xff;
11352		}
11353		for (let j = i * 4, jj = srcPos + len; j < jj; j += 3) {
11354			dest[destPos++] = src[j] << 24 | src[j + 1] << 16 | src[j + 2] << 8 | 0xff;
11355		}
11356	}
11357	return {
11358		srcPos: srcPos + len,
11359		destPos
11360	};
11361}
11362function grayToRGBA(src, dest) {
11363	if (FeatureTest.isLittleEndian) {
11364		for (let i = 0, ii = src.length; i < ii; i++) {
11365			dest[i] = src[i] * 0x10101 | 0xff000000;
11366		}
11367	} else {
11368		for (let i = 0, ii = src.length; i < ii; i++) {
11369			dest[i] = src[i] * 0x1010100 | 0x000000ff;
11370		}
11371	}
11372}
11373
11374;// ./src/core/jpg.js
11375
11376
11377
11378
11379
11380
11381
11382
11383
11384
11385class JpegError extends BaseException {
11386	constructor(msg) {
11387		super(msg, "JpegError");
11388	}
11389}
11390class DNLMarkerError extends BaseException {
11391	constructor(message, scanLines) {
11392		super(message, "DNLMarkerError");
11393		this.scanLines = scanLines;
11394	}
11395}
11396class EOIMarkerError extends BaseException {
11397	constructor(msg) {
11398		super(msg, "EOIMarkerError");
11399	}
11400}
11401const dctZigZag = new Uint8Array([0, 1, 8, 16, 9, 2, 3, 10, 17, 24, 32, 25, 18, 11, 4, 5, 12, 19, 26, 33, 40, 48, 41, 34, 27, 20, 13, 6, 7, 14, 21, 28, 35, 42, 49, 56, 57, 50, 43, 36, 29, 22, 15, 23, 30, 37, 44, 51, 58, 59, 52, 45, 38, 31, 39, 46, 53, 60, 61, 54, 47, 55, 62, 63]);
11402const dctCos1 = 4017;
11403const dctSin1 = 799;
11404const dctCos3 = 3406;
11405const dctSin3 = 2276;
11406const dctCos6 = 1567;
11407const dctSin6 = 3784;
11408const dctSqrt2 = 5793;
11409const dctSqrt1d2 = 2896;
11410function buildHuffmanTable(codeLengths, values) {
11411	let k = 0,
11412		i,
11413		j,
11414		length = 16;
11415	while (length > 0 && !codeLengths[length - 1]) {
11416		length--;
11417	}
11418	const code = [{
11419		children: [],
11420		index: 0
11421	}];
11422	let p = code[0],
11423		q;
11424	for (i = 0; i < length; i++) {
11425		for (j = 0; j < codeLengths[i]; j++) {
11426			p = code.pop();
11427			p.children[p.index] = values[k];
11428			while (p.index > 0) {
11429				p = code.pop();
11430			}
11431			p.index++;
11432			code.push(p);
11433			while (code.length <= i) {
11434				code.push(q = {
11435					children: [],
11436					index: 0
11437				});
11438				p.children[p.index] = q.children;
11439				p = q;
11440			}
11441			k++;
11442		}
11443		if (i + 1 < length) {
11444			code.push(q = {
11445				children: [],
11446				index: 0
11447			});
11448			p.children[p.index] = q.children;
11449			p = q;
11450		}
11451	}
11452	return code[0].children;
11453}
11454function getBlockBufferOffset(component, row, col) {
11455	return 64 * ((component.blocksPerLine + 1) * row + col);
11456}
11457function decodeScan(data, offset, frame, components, resetInterval, spectralStart, spectralEnd, successivePrev, successive, parseDNLMarker = false) {
11458	const mcusPerLine = frame.mcusPerLine;
11459	const progressive = frame.progressive;
11460	const startOffset = offset;
11461	let bitsData = 0,
11462		bitsCount = 0;
11463	function readBit() {
11464		if (bitsCount > 0) {
11465			bitsCount--;
11466			return bitsData >> bitsCount & 1;
11467		}
11468		bitsData = data[offset++];
11469		if (bitsData === 0xff) {
11470			const nextByte = data[offset++];
11471			if (nextByte) {
11472				if (nextByte === 0xdc && parseDNLMarker) {
11473					offset += 2;
11474					const scanLines = readUint16(data, offset);
11475					offset += 2;
11476					if (scanLines > 0 && scanLines !== frame.scanLines) {
11477						throw new DNLMarkerError("Found DNL marker (0xFFDC) while parsing scan data", scanLines);
11478					}
11479				} else if (nextByte === 0xd9) {
11480					if (parseDNLMarker) {
11481						const maybeScanLines = blockRow * (frame.precision === 8 ? 8 : 0);
11482						if (maybeScanLines > 0 && Math.round(frame.scanLines / maybeScanLines) >= 5) {
11483							throw new DNLMarkerError("Found EOI marker (0xFFD9) while parsing scan data, " + "possibly caused by incorrect `scanLines` parameter", maybeScanLines);
11484						}
11485					}
11486					throw new EOIMarkerError("Found EOI marker (0xFFD9) while parsing scan data");
11487				}
11488				throw new JpegError(`unexpected marker ${(bitsData << 8 | nextByte).toString(16)}`);
11489			}
11490		}
11491		bitsCount = 7;
11492		return bitsData >>> 7;
11493	}
11494	function decodeHuffman(tree) {
11495		let node = tree;
11496		while (true) {
11497			node = node[readBit()];
11498			switch (typeof node) {
11499				case "number":
11500					return node;
11501				case "object":
11502					continue;
11503			}
11504			throw new JpegError("invalid huffman sequence");
11505		}
11506	}
11507	function receive(length) {
11508		let n = 0;
11509		while (length > 0) {
11510			n = n << 1 | readBit();
11511			length--;
11512		}
11513		return n;
11514	}
11515	function receiveAndExtend(length) {
11516		if (length === 1) {
11517			return readBit() === 1 ? 1 : -1;
11518		}
11519		const n = receive(length);
11520		if (n >= 1 << length - 1) {
11521			return n;
11522		}
11523		return n + (-1 << length) + 1;
11524	}
11525	function decodeBaseline(component, blockOffset) {
11526		const t = decodeHuffman(component.huffmanTableDC);
11527		const diff = t === 0 ? 0 : receiveAndExtend(t);
11528		component.blockData[blockOffset] = component.pred += diff;
11529		let k = 1;
11530		while (k < 64) {
11531			const rs = decodeHuffman(component.huffmanTableAC);
11532			const s = rs & 15,
11533				r = rs >> 4;
11534			if (s === 0) {
11535				if (r < 15) {
11536					break;
11537				}
11538				k += 16;
11539				continue;
11540			}
11541			k += r;
11542			const z = dctZigZag[k];
11543			component.blockData[blockOffset + z] = receiveAndExtend(s);
11544			k++;
11545		}
11546	}
11547	function decodeDCFirst(component, blockOffset) {
11548		const t = decodeHuffman(component.huffmanTableDC);
11549		const diff = t === 0 ? 0 : receiveAndExtend(t) << successive;
11550		component.blockData[blockOffset] = component.pred += diff;
11551	}
11552	function decodeDCSuccessive(component, blockOffset) {
11553		component.blockData[blockOffset] |= readBit() << successive;
11554	}
11555	let eobrun = 0;
11556	function decodeACFirst(component, blockOffset) {
11557		if (eobrun > 0) {
11558			eobrun--;
11559			return;
11560		}
11561		let k = spectralStart;
11562		const e = spectralEnd;
11563		while (k <= e) {
11564			const rs = decodeHuffman(component.huffmanTableAC);
11565			const s = rs & 15,
11566				r = rs >> 4;
11567			if (s === 0) {
11568				if (r < 15) {
11569					eobrun = receive(r) + (1 << r) - 1;
11570					break;
11571				}
11572				k += 16;
11573				continue;
11574			}
11575			k += r;
11576			const z = dctZigZag[k];
11577			component.blockData[blockOffset + z] = receiveAndExtend(s) * (1 << successive);
11578			k++;
11579		}
11580	}
11581	let successiveACState = 0,
11582		successiveACNextValue;
11583	function decodeACSuccessive(component, blockOffset) {
11584		let k = spectralStart;
11585		const e = spectralEnd;
11586		let r = 0;
11587		let s;
11588		let rs;
11589		while (k <= e) {
11590			const offsetZ = blockOffset + dctZigZag[k];
11591			const sign = component.blockData[offsetZ] < 0 ? -1 : 1;
11592			switch (successiveACState) {
11593				case 0:
11594					rs = decodeHuffman(component.huffmanTableAC);
11595					s = rs & 15;
11596					r = rs >> 4;
11597					if (s === 0) {
11598						if (r < 15) {
11599							eobrun = receive(r) + (1 << r);
11600							successiveACState = 4;
11601						} else {
11602							r = 16;
11603							successiveACState = 1;
11604						}
11605					} else {
11606						if (s !== 1) {
11607							throw new JpegError("invalid ACn encoding");
11608						}
11609						successiveACNextValue = receiveAndExtend(s);
11610						successiveACState = r ? 2 : 3;
11611					}
11612					continue;
11613				case 1:
11614				case 2:
11615					if (component.blockData[offsetZ]) {
11616						component.blockData[offsetZ] += sign * (readBit() << successive);
11617					} else {
11618						r--;
11619						if (r === 0) {
11620							successiveACState = successiveACState === 2 ? 3 : 0;
11621						}
11622					}
11623					break;
11624				case 3:
11625					if (component.blockData[offsetZ]) {
11626						component.blockData[offsetZ] += sign * (readBit() << successive);
11627					} else {
11628						component.blockData[offsetZ] = successiveACNextValue << successive;
11629						successiveACState = 0;
11630					}
11631					break;
11632				case 4:
11633					if (component.blockData[offsetZ]) {
11634						component.blockData[offsetZ] += sign * (readBit() << successive);
11635					}
11636					break;
11637			}
11638			k++;
11639		}
11640		if (successiveACState === 4) {
11641			eobrun--;
11642			if (eobrun === 0) {
11643				successiveACState = 0;
11644			}
11645		}
11646	}
11647	let blockRow = 0;
11648	function decodeMcu(component, decode, mcu, row, col) {
11649		const mcuRow = mcu / mcusPerLine | 0;
11650		const mcuCol = mcu % mcusPerLine;
11651		blockRow = mcuRow * component.v + row;
11652		const blockCol = mcuCol * component.h + col;
11653		const blockOffset = getBlockBufferOffset(component, blockRow, blockCol);
11654		decode(component, blockOffset);
11655	}
11656	function decodeBlock(component, decode, mcu) {
11657		blockRow = mcu / component.blocksPerLine | 0;
11658		const blockCol = mcu % component.blocksPerLine;
11659		const blockOffset = getBlockBufferOffset(component, blockRow, blockCol);
11660		decode(component, blockOffset);
11661	}
11662	const componentsLength = components.length;
11663	let component, i, j, k, n;
11664	let decodeFn;
11665	if (progressive) {
11666		if (spectralStart === 0) {
11667			decodeFn = successivePrev === 0 ? decodeDCFirst : decodeDCSuccessive;
11668		} else {
11669			decodeFn = successivePrev === 0 ? decodeACFirst : decodeACSuccessive;
11670		}
11671	} else {
11672		decodeFn = decodeBaseline;
11673	}
11674	let mcu = 0,
11675		fileMarker;
11676	const mcuExpected = componentsLength === 1 ? components[0].blocksPerLine * components[0].blocksPerColumn : mcusPerLine * frame.mcusPerColumn;
11677	let h, v;
11678	while (mcu <= mcuExpected) {
11679		const mcuToRead = resetInterval ? Math.min(mcuExpected - mcu, resetInterval) : mcuExpected;
11680		if (mcuToRead > 0) {
11681			for (i = 0; i < componentsLength; i++) {
11682				components[i].pred = 0;
11683			}
11684			eobrun = 0;
11685			if (componentsLength === 1) {
11686				component = components[0];
11687				for (n = 0; n < mcuToRead; n++) {
11688					decodeBlock(component, decodeFn, mcu);
11689					mcu++;
11690				}
11691			} else {
11692				for (n = 0; n < mcuToRead; n++) {
11693					for (i = 0; i < componentsLength; i++) {
11694						component = components[i];
11695						h = component.h;
11696						v = component.v;
11697						for (j = 0; j < v; j++) {
11698							for (k = 0; k < h; k++) {
11699								decodeMcu(component, decodeFn, mcu, j, k);
11700							}
11701						}
11702					}
11703					mcu++;
11704				}
11705			}
11706		}
11707		bitsCount = 0;
11708		fileMarker = findNextFileMarker(data, offset);
11709		if (!fileMarker) {
11710			break;
11711		}
11712		if (fileMarker.invalid) {
11713			const partialMsg = mcuToRead > 0 ? "unexpected" : "excessive";
11714			warn(`decodeScan - ${partialMsg} MCU data, current marker is: ${fileMarker.invalid}`);
11715			offset = fileMarker.offset;
11716		}
11717		if (fileMarker.marker >= 0xffd0 && fileMarker.marker <= 0xffd7) {
11718			offset += 2;
11719		} else {
11720			break;
11721		}
11722	}
11723	return offset - startOffset;
11724}
11725function quantizeAndInverse(component, blockBufferOffset, p) {
11726	const qt = component.quantizationTable,
11727		blockData = component.blockData;
11728	let v0, v1, v2, v3, v4, v5, v6, v7;
11729	let p0, p1, p2, p3, p4, p5, p6, p7;
11730	let t;
11731	if (!qt) {
11732		throw new JpegError("missing required Quantization Table.");
11733	}
11734	for (let row = 0; row < 64; row += 8) {
11735		p0 = blockData[blockBufferOffset + row];
11736		p1 = blockData[blockBufferOffset + row + 1];
11737		p2 = blockData[blockBufferOffset + row + 2];
11738		p3 = blockData[blockBufferOffset + row + 3];
11739		p4 = blockData[blockBufferOffset + row + 4];
11740		p5 = blockData[blockBufferOffset + row + 5];
11741		p6 = blockData[blockBufferOffset + row + 6];
11742		p7 = blockData[blockBufferOffset + row + 7];
11743		p0 *= qt[row];
11744		if ((p1 | p2 | p3 | p4 | p5 | p6 | p7) === 0) {
11745			t = dctSqrt2 * p0 + 512 >> 10;
11746			p[row] = t;
11747			p[row + 1] = t;
11748			p[row + 2] = t;
11749			p[row + 3] = t;
11750			p[row + 4] = t;
11751			p[row + 5] = t;
11752			p[row + 6] = t;
11753			p[row + 7] = t;
vendor: 2,429 bytes, lines 11754-11848
11754			continue;
11755		}
11756		p1 *= qt[row + 1];
11757		p2 *= qt[row + 2];
11758		p3 *= qt[row + 3];
11759		p4 *= qt[row + 4];
11760		p5 *= qt[row + 5];
11761		p6 *= qt[row + 6];
11762		p7 *= qt[row + 7];
11763		v0 = dctSqrt2 * p0 + 128 >> 8;
11764		v1 = dctSqrt2 * p4 + 128 >> 8;
11765		v2 = p2;
11766		v3 = p6;
11767		v4 = dctSqrt1d2 * (p1 - p7) + 128 >> 8;
11768		v7 = dctSqrt1d2 * (p1 + p7) + 128 >> 8;
11769		v5 = p3 << 4;
11770		v6 = p5 << 4;
11771		v0 = v0 + v1 + 1 >> 1;
11772		v1 = v0 - v1;
11773		t = v2 * dctSin6 + v3 * dctCos6 + 128 >> 8;
11774		v2 = v2 * dctCos6 - v3 * dctSin6 + 128 >> 8;
11775		v3 = t;
11776		v4 = v4 + v6 + 1 >> 1;
11777		v6 = v4 - v6;
11778		v7 = v7 + v5 + 1 >> 1;
11779		v5 = v7 - v5;
11780		v0 = v0 + v3 + 1 >> 1;
11781		v3 = v0 - v3;
11782		v1 = v1 + v2 + 1 >> 1;
11783		v2 = v1 - v2;
11784		t = v4 * dctSin3 + v7 * dctCos3 + 2048 >> 12;
11785		v4 = v4 * dctCos3 - v7 * dctSin3 + 2048 >> 12;
11786		v7 = t;
11787		t = v5 * dctSin1 + v6 * dctCos1 + 2048 >> 12;
11788		v5 = v5 * dctCos1 - v6 * dctSin1 + 2048 >> 12;
11789		v6 = t;
11790		p[row] = v0 + v7;
11791		p[row + 7] = v0 - v7;
11792		p[row + 1] = v1 + v6;
11793		p[row + 6] = v1 - v6;
11794		p[row + 2] = v2 + v5;
11795		p[row + 5] = v2 - v5;
11796		p[row + 3] = v3 + v4;
11797		p[row + 4] = v3 - v4;
11798	}
11799	for (let col = 0; col < 8; ++col) {
11800		p0 = p[col];
11801		p1 = p[col + 8];
11802		p2 = p[col + 16];
11803		p3 = p[col + 24];
11804		p4 = p[col + 32];
11805		p5 = p[col + 40];
11806		p6 = p[col + 48];
11807		p7 = p[col + 56];
11808		if ((p1 | p2 | p3 | p4 | p5 | p6 | p7) === 0) {
11809			t = dctSqrt2 * p0 + 8192 >> 14;
11810			if (t < -2040) {
11811				t = 0;
11812			} else if (t >= 2024) {
11813				t = 255;
11814			} else {
11815				t = t + 2056 >> 4;
11816			}
11817			blockData[blockBufferOffset + col] = t;
11818			blockData[blockBufferOffset + col + 8] = t;
11819			blockData[blockBufferOffset + col + 16] = t;
11820			blockData[blockBufferOffset + col + 24] = t;
11821			blockData[blockBufferOffset + col + 32] = t;
11822			blockData[blockBufferOffset + col + 40] = t;
11823			blockData[blockBufferOffset + col + 48] = t;
11824			blockData[blockBufferOffset + col + 56] = t;
11825			continue;
11826		}
11827		v0 = dctSqrt2 * p0 + 2048 >> 12;
11828		v1 = dctSqrt2 * p4 + 2048 >> 12;
11829		v2 = p2;
11830		v3 = p6;
11831		v4 = dctSqrt1d2 * (p1 - p7) + 2048 >> 12;
11832		v7 = dctSqrt1d2 * (p1 + p7) + 2048 >> 12;
11833		v5 = p3;
11834		v6 = p5;
11835		v0 = (v0 + v1 + 1 >> 1) + 4112;
11836		v1 = v0 - v1;
11837		t = v2 * dctSin6 + v3 * dctCos6 + 2048 >> 12;
11838		v2 = v2 * dctCos6 - v3 * dctSin6 + 2048 >> 12;
11839		v3 = t;
11840		v4 = v4 + v6 + 1 >> 1;
11841		v6 = v4 - v6;
11842		v7 = v7 + v5 + 1 >> 1;
11843		v5 = v7 - v5;
11844		v0 = v0 + v3 + 1 >> 1;
11845		v3 = v0 - v3;
11846		v1 = v1 + v2 + 1 >> 1;
11847		v2 = v1 - v2;
11848		t = v4 * dctSin3 + v7 * dctCos3 + 2048 >>
vendor: 13,813 bytes, lines 11848-12321
11848 12;
11849		v4 = v4 * dctCos3 - v7 * dctSin3 + 2048 >> 12;
11850		v7 = t;
11851		t = v5 * dctSin1 + v6 * dctCos1 + 2048 >> 12;
11852		v5 = v5 * dctCos1 - v6 * dctSin1 + 2048 >> 12;
11853		v6 = t;
11854		p0 = v0 + v7;
11855		p7 = v0 - v7;
11856		p1 = v1 + v6;
11857		p6 = v1 - v6;
11858		p2 = v2 + v5;
11859		p5 = v2 - v5;
11860		p3 = v3 + v4;
11861		p4 = v3 - v4;
11862		if (p0 < 16) {
11863			p0 = 0;
11864		} else if (p0 >= 4080) {
11865			p0 = 255;
11866		} else {
11867			p0 >>= 4;
11868		}
11869		if (p1 < 16) {
11870			p1 = 0;
11871		} else if (p1 >= 4080) {
11872			p1 = 255;
11873		} else {
11874			p1 >>= 4;
11875		}
11876		if (p2 < 16) {
11877			p2 = 0;
11878		} else if (p2 >= 4080) {
11879			p2 = 255;
11880		} else {
11881			p2 >>= 4;
11882		}
11883		if (p3 < 16) {
11884			p3 = 0;
11885		} else if (p3 >= 4080) {
11886			p3 = 255;
11887		} else {
11888			p3 >>= 4;
11889		}
11890		if (p4 < 16) {
11891			p4 = 0;
11892		} else if (p4 >= 4080) {
11893			p4 = 255;
11894		} else {
11895			p4 >>= 4;
11896		}
11897		if (p5 < 16) {
11898			p5 = 0;
11899		} else if (p5 >= 4080) {
11900			p5 = 255;
11901		} else {
11902			p5 >>= 4;
11903		}
11904		if (p6 < 16) {
11905			p6 = 0;
11906		} else if (p6 >= 4080) {
11907			p6 = 255;
11908		} else {
11909			p6 >>= 4;
11910		}
11911		if (p7 < 16) {
11912			p7 = 0;
11913		} else if (p7 >= 4080) {
11914			p7 = 255;
11915		} else {
11916			p7 >>= 4;
11917		}
11918		blockData[blockBufferOffset + col] = p0;
11919		blockData[blockBufferOffset + col + 8] = p1;
11920		blockData[blockBufferOffset + col + 16] = p2;
11921		blockData[blockBufferOffset + col + 24] = p3;
11922		blockData[blockBufferOffset + col + 32] = p4;
11923		blockData[blockBufferOffset + col + 40] = p5;
11924		blockData[blockBufferOffset + col + 48] = p6;
11925		blockData[blockBufferOffset + col + 56] = p7;
11926	}
11927}
11928function buildComponentData(frame, component) {
11929	const blocksPerLine = component.blocksPerLine;
11930	const blocksPerColumn = component.blocksPerColumn;
11931	const computationBuffer = new Int16Array(64);
11932	for (let blockRow = 0; blockRow < blocksPerColumn; blockRow++) {
11933		for (let blockCol = 0; blockCol < blocksPerLine; blockCol++) {
11934			const offset = getBlockBufferOffset(component, blockRow, blockCol);
11935			quantizeAndInverse(component, offset, computationBuffer);
11936		}
11937	}
11938	return component.blockData;
11939}
11940function findNextFileMarker(data, currentPos, startPos = currentPos) {
11941	const maxPos = data.length - 1;
11942	let newPos = startPos < currentPos ? startPos : currentPos;
11943	if (currentPos >= maxPos) {
11944		return null;
11945	}
11946	const currentMarker = readUint16(data, currentPos);
11947	if (currentMarker >= 0xffc0 && currentMarker <= 0xfffe) {
11948		return {
11949			invalid: null,
11950			marker: currentMarker,
11951			offset: currentPos
11952		};
11953	}
11954	let newMarker = readUint16(data, newPos);
11955	while (!(newMarker >= 0xffc0 && newMarker <= 0xfffe)) {
11956		if (++newPos >= maxPos) {
11957			return null;
11958		}
11959		newMarker = readUint16(data, newPos);
11960	}
11961	return {
11962		invalid: currentMarker.toString(16),
11963		marker: newMarker,
11964		offset: newPos
11965	};
11966}
11967function prepareComponents(frame) {
11968	const mcusPerLine = Math.ceil(frame.samplesPerLine / 8 / frame.maxH);
11969	const mcusPerColumn = Math.ceil(frame.scanLines / 8 / frame.maxV);
11970	for (const component of frame.components) {
11971		const blocksPerLine = Math.ceil(Math.ceil(frame.samplesPerLine / 8) * component.h / frame.maxH);
11972		const blocksPerColumn = Math.ceil(Math.ceil(frame.scanLines / 8) * component.v / frame.maxV);
11973		const blocksPerLineForMcu = mcusPerLine * component.h;
11974		const blocksPerColumnForMcu = mcusPerColumn * component.v;
11975		const blocksBufferSize = 64 * blocksPerColumnForMcu * (blocksPerLineForMcu + 1);
11976		component.blockData = new Int16Array(blocksBufferSize);
11977		component.blocksPerLine = blocksPerLine;
11978		component.blocksPerColumn = blocksPerColumn;
11979	}
11980	frame.mcusPerLine = mcusPerLine;
11981	frame.mcusPerColumn = mcusPerColumn;
11982}
11983function readDataBlock(data, offset) {
11984	const length = readUint16(data, offset);
11985	offset += 2;
11986	let endOffset = offset + length - 2;
11987	const fileMarker = findNextFileMarker(data, endOffset, offset);
11988	if (fileMarker?.invalid) {
11989		warn("readDataBlock - incorrect length, current marker is: " + fileMarker.invalid);
11990		endOffset = fileMarker.offset;
11991	}
11992	const array = data.subarray(offset, endOffset);
11993	offset += array.length;
11994	return {
11995		appData: array,
11996		newOffset: offset
11997	};
11998}
11999function skipData(data, offset) {
12000	const length = readUint16(data, offset);
12001	offset += 2;
12002	const endOffset = offset + length - 2;
12003	const fileMarker = findNextFileMarker(data, endOffset, offset);
12004	if (fileMarker?.invalid) {
12005		return fileMarker.offset;
12006	}
12007	return endOffset;
12008}
12009class JpegImage {
12010	constructor({
12011		decodeTransform = null,
12012		colorTransform = -1
12013	} = {}) {
12014		this._decodeTransform = decodeTransform;
12015		this._colorTransform = colorTransform;
12016	}
12017	static canUseImageDecoder(data, colorTransform = -1) {
12018		let offset = 0;
12019		let numComponents = null;
12020		let fileMarker = readUint16(data, offset);
12021		offset += 2;
12022		if (fileMarker !== 0xffd8) {
12023			throw new JpegError("SOI not found");
12024		}
12025		fileMarker = readUint16(data, offset);
12026		offset += 2;
12027		markerLoop: while (fileMarker !== 0xffd9) {
12028			switch (fileMarker) {
12029				case 0xffc0:
12030				case 0xffc1:
12031				case 0xffc2:
12032					numComponents = data[offset + (2 + 1 + 2 + 2)];
12033					break markerLoop;
12034				case 0xffff:
12035					if (data[offset] !== 0xff) {
12036						offset--;
12037					}
12038					break;
12039			}
12040			offset = skipData(data, offset);
12041			fileMarker = readUint16(data, offset);
12042			offset += 2;
12043		}
12044		if (numComponents === 4) {
12045			return false;
12046		}
12047		if (numComponents === 3 && colorTransform === 0) {
12048			return false;
12049		}
12050		return true;
12051	}
12052	parse(data, {
12053		dnlScanLines = null
12054	} = {}) {
12055		let offset = 0;
12056		let jfif = null;
12057		let adobe = null;
12058		let frame, resetInterval;
12059		let numSOSMarkers = 0;
12060		const quantizationTables = [];
12061		const huffmanTablesAC = [],
12062			huffmanTablesDC = [];
12063		let fileMarker = readUint16(data, offset);
12064		offset += 2;
12065		if (fileMarker !== 0xffd8) {
12066			throw new JpegError("SOI not found");
12067		}
12068		fileMarker = readUint16(data, offset);
12069		offset += 2;
12070		markerLoop: while (fileMarker !== 0xffd9) {
12071			let i, j, l;
12072			switch (fileMarker) {
12073				case 0xffe0:
12074				case 0xffe1:
12075				case 0xffe2:
12076				case 0xffe3:
12077				case 0xffe4:
12078				case 0xffe5:
12079				case 0xffe6:
12080				case 0xffe7:
12081				case 0xffe8:
12082				case 0xffe9:
12083				case 0xffea:
12084				case 0xffeb:
12085				case 0xffec:
12086				case 0xffed:
12087				case 0xffee:
12088				case 0xffef:
12089				case 0xfffe:
12090					const {
12091						appData,
12092						newOffset
12093					} = readDataBlock(data, offset);
12094					offset = newOffset;
12095					if (fileMarker === 0xffe0) {
12096						if (appData[0] === 0x4a && appData[1] === 0x46 && appData[2] === 0x49 && appData[3] === 0x46 && appData[4] === 0) {
12097							jfif = {
12098								version: {
12099									major: appData[5],
12100									minor: appData[6]
12101								},
12102								densityUnits: appData[7],
12103								xDensity: appData[8] << 8 | appData[9],
12104								yDensity: appData[10] << 8 | appData[11],
12105								thumbWidth: appData[12],
12106								thumbHeight: appData[13],
12107								thumbData: appData.subarray(14, 14 + 3 * appData[12] * appData[13])
12108							};
12109						}
12110					}
12111					if (fileMarker === 0xffee) {
12112						if (appData[0] === 0x41 && appData[1] === 0x64 && appData[2] === 0x6f && appData[3] === 0x62 && appData[4] === 0x65) {
12113							adobe = {
12114								version: appData[5] << 8 | appData[6],
12115								flags0: appData[7] << 8 | appData[8],
12116								flags1: appData[9] << 8 | appData[10],
12117								transformCode: appData[11]
12118							};
12119						}
12120					}
12121					break;
12122				case 0xffdb:
12123					const quantizationTablesLength = readUint16(data, offset);
12124					offset += 2;
12125					const quantizationTablesEnd = quantizationTablesLength + offset - 2;
12126					let z;
12127					while (offset < quantizationTablesEnd) {
12128						const quantizationTableSpec = data[offset++];
12129						const tableData = new Uint16Array(64);
12130						if (quantizationTableSpec >> 4 === 0) {
12131							for (j = 0; j < 64; j++) {
12132								z = dctZigZag[j];
12133								tableData[z] = data[offset++];
12134							}
12135						} else if (quantizationTableSpec >> 4 === 1) {
12136							for (j = 0; j < 64; j++) {
12137								z = dctZigZag[j];
12138								tableData[z] = readUint16(data, offset);
12139								offset += 2;
12140							}
12141						} else {
12142							throw new JpegError("DQT - invalid table spec");
12143						}
12144						quantizationTables[quantizationTableSpec & 15] = tableData;
12145					}
12146					break;
12147				case 0xffc0:
12148				case 0xffc1:
12149				case 0xffc2:
12150					if (frame) {
12151						throw new JpegError("Only single frame JPEGs supported");
12152					}
12153					offset += 2;
12154					frame = {};
12155					frame.extended = fileMarker === 0xffc1;
12156					frame.progressive = fileMarker === 0xffc2;
12157					frame.precision = data[offset++];
12158					const sofScanLines = readUint16(data, offset);
12159					offset += 2;
12160					frame.scanLines = dnlScanLines || sofScanLines;
12161					frame.samplesPerLine = readUint16(data, offset);
12162					offset += 2;
12163					frame.components = [];
12164					frame.componentIds = {};
12165					const componentsCount = data[offset++];
12166					let maxH = 0,
12167						maxV = 0;
12168					for (i = 0; i < componentsCount; i++) {
12169						const componentId = data[offset];
12170						const h = data[offset + 1] >> 4;
12171						const v = data[offset + 1] & 15;
12172						if (maxH < h) {
12173							maxH = h;
12174						}
12175						if (maxV < v) {
12176							maxV = v;
12177						}
12178						const qId = data[offset + 2];
12179						l = frame.components.push({
12180							h,
12181							v,
12182							quantizationId: qId,
12183							quantizationTable: null
12184						});
12185						frame.componentIds[componentId] = l - 1;
12186						offset += 3;
12187					}
12188					frame.maxH = maxH;
12189					frame.maxV = maxV;
12190					prepareComponents(frame);
12191					break;
12192				case 0xffc4:
12193					const huffmanLength = readUint16(data, offset);
12194					offset += 2;
12195					for (i = 2; i < huffmanLength;) {
12196						const huffmanTableSpec = data[offset++];
12197						const codeLengths = new Uint8Array(16);
12198						let codeLengthSum = 0;
12199						for (j = 0; j < 16; j++, offset++) {
12200							codeLengthSum += codeLengths[j] = data[offset];
12201						}
12202						const huffmanValues = new Uint8Array(codeLengthSum);
12203						for (j = 0; j < codeLengthSum; j++, offset++) {
12204							huffmanValues[j] = data[offset];
12205						}
12206						i += 17 + codeLengthSum;
12207						(huffmanTableSpec >> 4 === 0 ? huffmanTablesDC : huffmanTablesAC)[huffmanTableSpec & 15] = buildHuffmanTable(codeLengths, huffmanValues);
12208					}
12209					break;
12210				case 0xffdd:
12211					offset += 2;
12212					resetInterval = readUint16(data, offset);
12213					offset += 2;
12214					break;
12215				case 0xffda:
12216					const parseDNLMarker = ++numSOSMarkers === 1 && !dnlScanLines;
12217					offset += 2;
12218					const selectorsCount = data[offset++],
12219						components = [];
12220					for (i = 0; i < selectorsCount; i++) {
12221						const index = data[offset++];
12222						const componentIndex = frame.componentIds[index];
12223						const component = frame.components[componentIndex];
12224						component.index = index;
12225						const tableSpec = data[offset++];
12226						component.huffmanTableDC = huffmanTablesDC[tableSpec >> 4];
12227						component.huffmanTableAC = huffmanTablesAC[tableSpec & 15];
12228						components.push(component);
12229					}
12230					const spectralStart = data[offset++],
12231						spectralEnd = data[offset++],
12232						successiveApproximation = data[offset++];
12233					try {
12234						const processed = decodeScan(data, offset, frame, components, resetInterval, spectralStart, spectralEnd, successiveApproximation >> 4, successiveApproximation & 15, parseDNLMarker);
12235						offset += processed;
12236					} catch (ex) {
12237						if (ex instanceof DNLMarkerError) {
12238							warn(`${ex.message} -- attempting to re-parse the JPEG image.`);
12239							return this.parse(data, {
12240								dnlScanLines: ex.scanLines
12241							});
12242						} else if (ex instanceof EOIMarkerError) {
12243							warn(`${ex.message} -- ignoring the rest of the image data.`);
12244							break markerLoop;
12245						}
12246						throw ex;
12247					}
12248					break;
12249				case 0xffdc:
12250					offset += 4;
12251					break;
12252				case 0xffff:
12253					if (data[offset] !== 0xff) {
12254						offset--;
12255					}
12256					break;
12257				default:
12258					const nextFileMarker = findNextFileMarker(data, offset - 2, offset - 3);
12259					if (nextFileMarker?.invalid) {
12260						warn("JpegImage.parse - unexpected data, current marker is: " + nextFileMarker.invalid);
12261						offset = nextFileMarker.offset;
12262						break;
12263					}
12264					if (!nextFileMarker || offset >= data.length - 1) {
12265						warn("JpegImage.parse - reached the end of the image data " + "without finding an EOI marker (0xFFD9).");
12266						break markerLoop;
12267					}
12268					throw new JpegError("JpegImage.parse - unknown marker: " + fileMarker.toString(16));
12269			}
12270			fileMarker = readUint16(data, offset);
12271			offset += 2;
12272		}
12273		if (!frame) {
12274			throw new JpegError("JpegImage.parse - no frame data found.");
12275		}
12276		this.width = frame.samplesPerLine;
12277		this.height = frame.scanLines;
12278		this.jfif = jfif;
12279		this.adobe = adobe;
12280		this.components = [];
12281		for (const component of frame.components) {
12282			const quantizationTable = quantizationTables[component.quantizationId];
12283			if (quantizationTable) {
12284				component.quantizationTable = quantizationTable;
12285			}
12286			this.components.push({
12287				index: component.index,
12288				output: buildComponentData(frame, component),
12289				scaleX: component.h / frame.maxH,
12290				scaleY: component.v / frame.maxV,
12291				blocksPerLine: component.blocksPerLine,
12292				blocksPerColumn: component.blocksPerColumn
12293			});
12294		}
12295		this.numComponents = this.components.length;
12296		return undefined;
12297	}
12298	_getLinearizedBlockData(width, height, isSourcePDF = false) {
12299		const scaleX = this.width / width,
12300			scaleY = this.height / height;
12301		let component, componentScaleX, componentScaleY, blocksPerScanline;
12302		let x, y, i, j, k;
12303		let index;
12304		let offset = 0;
12305		let output;
12306		const numComponents = this.components.length;
12307		const dataLength = width * height * numComponents;
12308		const data = new Uint8ClampedArray(dataLength);
12309		const xScaleBlockOffset = new Uint32Array(width);
12310		const mask3LSB = 0xfffffff8;
12311		let lastComponentScaleX;
12312		for (i = 0; i < numComponents; i++) {
12313			component = this.components[i];
12314			componentScaleX = component.scaleX * scaleX;
12315			componentScaleY = component.scaleY * scaleY;
12316			offset = i;
12317			output = component.output;
12318			blocksPerScanline = component.blocksPerLine + 1 << 3;
12319			if (componentScaleX !== lastComponentScaleX) {
12320				for (x = 0; x < width; x++) {
12321					j = 0 | x * componentScaleX;
vendor: 5,873 bytes, lines 12322-12437
12322					xScaleBlockOffset[x] = (j & mask3LSB) << 3 | j & 7;
12323				}
12324				lastComponentScaleX = componentScaleX;
12325			}
12326			for (y = 0; y < height; y++) {
12327				j = 0 | y * componentScaleY;
12328				index = blocksPerScanline * (j & mask3LSB) | (j & 7) << 3;
12329				for (x = 0; x < width; x++) {
12330					data[offset] = output[index + xScaleBlockOffset[x]];
12331					offset += numComponents;
12332				}
12333			}
12334		}
12335		let transform = this._decodeTransform;
12336		if (!isSourcePDF && numComponents === 4 && !transform) {
12337			transform = new Int32Array([-256, 255, -256, 255, -256, 255, -256, 255]);
12338		}
12339		if (transform) {
12340			for (i = 0; i < dataLength;) {
12341				for (j = 0, k = 0; j < numComponents; j++, i++, k += 2) {
12342					data[i] = (data[i] * transform[k] >> 8) + transform[k + 1];
12343				}
12344			}
12345		}
12346		return data;
12347	}
12348	get _isColorConversionNeeded() {
12349		if (this.adobe) {
12350			return !!this.adobe.transformCode;
12351		}
12352		if (this.numComponents === 3) {
12353			if (this._colorTransform === 0) {
12354				return false;
12355			} else if (this.components[0].index === 0x52 && this.components[1].index === 0x47 && this.components[2].index === 0x42) {
12356				return false;
12357			}
12358			return true;
12359		}
12360		if (this._colorTransform === 1) {
12361			return true;
12362		}
12363		return false;
12364	}
12365	_convertYccToRgb(data) {
12366		let Y, Cb, Cr;
12367		for (let i = 0, length = data.length; i < length; i += 3) {
12368			Y = data[i];
12369			Cb = data[i + 1];
12370			Cr = data[i + 2];
12371			data[i] = Y - 179.456 + 1.402 * Cr;
12372			data[i + 1] = Y + 135.459 - 0.344 * Cb - 0.714 * Cr;
12373			data[i + 2] = Y - 226.816 + 1.772 * Cb;
12374		}
12375		return data;
12376	}
12377	_convertYccToRgba(data, out) {
12378		for (let i = 0, j = 0, length = data.length; i < length; i += 3, j += 4) {
12379			const Y = data[i];
12380			const Cb = data[i + 1];
12381			const Cr = data[i + 2];
12382			out[j] = Y - 179.456 + 1.402 * Cr;
12383			out[j + 1] = Y + 135.459 - 0.344 * Cb - 0.714 * Cr;
12384			out[j + 2] = Y - 226.816 + 1.772 * Cb;
12385			out[j + 3] = 255;
12386		}
12387		return out;
12388	}
12389	_convertYcckToRgb(data) {
12390		let Y, Cb, Cr, k;
12391		let offset = 0;
12392		for (let i = 0, length = data.length; i < length; i += 4) {
12393			Y = data[i];
12394			Cb = data[i + 1];
12395			Cr = data[i + 2];
12396			k = data[i + 3];
12397			data[offset++] = -122.67195406894 + Cb * (-6.60635669420364e-5 * Cb + 0.000437130475926232 * Cr - 5.4080610064599e-5 * Y + 0.00048449797120281 * k - 0.154362151871126) + Cr * (-0.000957964378445773 * Cr + 0.000817076911346625 * Y - 0.00477271405408747 * k + 1.53380253221734) + Y * (0.000961250184130688 * Y - 0.00266257332283933 * k + 0.48357088451265) + k * (-0.000336197177618394 * k + 0.484791561490776);
12398			data[offset++] = 107.268039397724 + Cb * (2.19927104525741e-5 * Cb - 0.000640992018297945 * Cr + 0.000659397001245577 * Y + 0.000426105652938837 * k - 0.176491792462875) + Cr * (-0.000778269941513683 * Cr + 0.00130872261408275 * Y + 0.000770482631801132 * k - 0.151051492775562) + Y * (0.00126935368114843 * Y - 0.00265090189010898 * k + 0.25802910206845) + k * (-0.000318913117588328 * k - 0.213742400323665);
12399			data[offset++] = -20.810012546947 + Cb * (-0.000570115196973677 * Cb - 2.63409051004589e-5 * Cr + 0.0020741088115012 * Y - 0.00288260236853442 * k + 0.814272968359295) + Cr * (-1.53496057440975e-5 * Cr - 0.000132689043961446 * Y + 0.000560833691242812 * k - 0.195152027534049) + Y * (0.00174418132927582 * Y - 0.00255243321439347 * k + 0.116935020465145) + k * (-0.000343531996510555 * k + 0.24165260232407);
12400		}
12401		return data.subarray(0, offset);
12402	}
12403	_convertYcckToRgba(data) {
12404		for (let i = 0, length = data.length; i < length; i += 4) {
12405			const Y = data[i];
12406			const Cb = data[i + 1];
12407			const Cr = data[i + 2];
12408			const k = data[i + 3];
12409			data[i] = -122.67195406894 + Cb * (-6.60635669420364e-5 * Cb + 0.000437130475926232 * Cr - 5.4080610064599e-5 * Y + 0.00048449797120281 * k - 0.154362151871126) + Cr * (-0.000957964378445773 * Cr + 0.000817076911346625 * Y - 0.00477271405408747 * k + 1.53380253221734) + Y * (0.000961250184130688 * Y - 0.00266257332283933 * k + 0.48357088451265) + k * (-0.000336197177618394 * k + 0.484791561490776);
12410			data[i + 1] = 107.268039397724 + Cb * (2.19927104525741e-5 * Cb - 0.000640992018297945 * Cr + 0.000659397001245577 * Y + 0.000426105652938837 * k - 0.176491792462875) + Cr * (-0.000778269941513683 * Cr + 0.00130872261408275 * Y + 0.000770482631801132 * k - 0.151051492775562) + Y * (0.00126935368114843 * Y - 0.00265090189010898 * k + 0.25802910206845) + k * (-0.000318913117588328 * k - 0.213742400323665);
12411			data[i + 2] = -20.810012546947 + Cb * (-0.000570115196973677 * Cb - 2.63409051004589e-5 * Cr + 0.0020741088115012 * Y - 0.00288260236853442 * k + 0.814272968359295) + Cr * (-1.53496057440975e-5 * Cr - 0.000132689043961446 * Y + 0.000560833691242812 * k - 0.195152027534049) + Y * (0.00174418132927582 * Y - 0.00255243321439347 * k + 0.116935020465145) + k * (-0.000343531996510555 * k + 0.24165260232407);
12412			data[i + 3] = 255;
12413		}
12414		return data;
12415	}
12416	_convertYcckToCmyk(data) {
12417		let Y, Cb, Cr;
12418		for (let i = 0, length = data.length; i < length; i += 4) {
12419			Y = data[i];
12420			Cb = data[i + 1];
12421			Cr = data[i + 2];
12422			data[i] = 434.456 - Y - 1.402 * Cr;
12423			data[i + 1] = 119.541 - Y + 0.344 * Cb + 0.714 * Cr;
12424			data[i + 2] = 481.816 - Y - 1.772 * Cb;
12425		}
12426		return data;
12427	}
12428	_convertCmykToRgb(data) {
12429		let c, m, y, k;
12430		let offset = 0;
12431		for (let i = 0, length = data.length; i < length; i += 4) {
12432			c = data[i];
12433			m = data[i + 1];
12434			y = data[i + 2];
12435			k = data[i + 3];
12436			data[offset++] = 255 + c * (-0.00006747147073602441 * c + 0.0008379262121013727 * m + 0.0002894718188643294 * y + 0.003264231057537806 * k - 1.1185611867203937) + m * (0.000026374107616089405 * m - 0.00008626949158638572 * y - 0.0002748769067499491 * k - 0.02155688794978967) + y * (-0.00003878099212869363 * y - 0.0003267808279485286 * k + 0.0686742238595345) - k * (0.0003361971776183937 * k + 0.7430659151342254);
12437			data[offset++] = 255 + c * (0.00013596372813588848 * c + 0.000924537132573585 * m + 0.0001056
124377359618683593 * y + 0.0004791864687436512 * k - 0.3109689587515875) + m * (-0.00023545346108370344 * m + 0.0002702845253534714 * y + 0.0020200308977307156 * k - 0.7488052167015494) + y * (0.00006834815998235662 * y + 0.00015168452363460973 * k - 0.09751927774728933) - k * (0.0003189131175883281 * k + 0.7364883807733168);
12438			data[offset++] = 255 + c * (0.000013598650411385307 * c + 0.00012423956175490851 * m + 0.0004751985097583589 * y - 0.0000036729317476630422 * k - 0.05562186980264034) + m * (0.00016141380598724676 * m + 0.0009692239130725186 * y + 0.0007782692450036253 * k - 0.44015232367526463) + y * (5.068882914068769e-7 * y + 0.0017778369011375071 * k - 0.7591454649749609) - k * (0.0003435319965105553 * k + 0.7063770186160144);
12439		}
12440		return data.subarray(0, offset);
12441	}
12442	_convertCmykToRgba(data) {
12443		for (let i = 0, length = data.length; i < length; i += 4) {
12444			const c = data[i];
12445			const m = data[i + 1];
12446			const y = data[i + 2];
12447			const k = data[i + 3];
12448			data[i] = 255 + c * (-0.00006747147073602441 * c + 0.0008379262121013727 * m + 0.0002894718188643294 * y + 0.003264231057537806 * k - 1.1185611867203937) + m * (0.000026374107616089405 * m - 0.00008626949158638572 * y - 0.0002748769067499491 * k - 0.02155688794978967) + y * (-0.00003878099212869363 * y - 0.0003267808279485286 * k + 0.0686742238595345) - k * (0.0003361971776183937 * k + 0.7430659151342254);
12449			data[i + 1] = 255 + c * (0.00013596372813588848 * c + 0.000924537132573585 * m + 0.00010567359618683593 * y + 0.0004791864687436512 * k - 0.3109689587515875) + m * (-0.00023545346108370344 * m + 0.0002702845253534714 * y + 0.0020200308977307156 * k - 0.7488052167015494) + y * (0.00006834815998235662 * y + 0.00015168452363460973 * k - 0.09751927774728933) - k * (0.0003189131175883281 * k + 0.7364883807733168);
12450			data[i + 2] = 255 + c * (0.000013598650411385307 * c + 0.00012423956175490851 * m + 0.0004751985097583589 * y - 0.0000036729317476630422 * k - 0.05562186980264034) + m * (0.00016141380598724676 * m + 0.0009692239130725186 * y + 0.0007782692450036253 * k - 0.44015232367526463) + y * (5.068882914068769e-7 * y + 0.0017778369011375071 * k - 0.7591454649749609) - k * (0.0003435319965105553 * k + 0.7063770186160144);
12451			data[i + 3] = 255;
12452		}
12453		return data;
12454	}
12455	getData({
12456		width,
12457		height,
12458		forceRGBA = false,
12459		forceRGB = false,
12460		isSourcePDF = false
12461	}) {
12462		if (this.numComponents > 4) {
12463			throw new JpegError("Unsupported color mode");
12464		}
12465		const data = this._getLinearizedBlockData(width, height, isSourcePDF);
12466		if (this.numComponents === 1 && (forceRGBA || forceRGB)) {
12467			const len = data.length * (forceRGBA ? 4 : 3);
12468			const rgbaData = new Uint8ClampedArray(len);
12469			let offset = 0;
12470			if (forceRGBA) {
12471				grayToRGBA(data, new Uint32Array(rgbaData.buffer));
12472			} else {
12473				for (const grayColor of data) {
12474					rgbaData[offset++] = grayColor;
12475					rgbaData[offset++] = grayColor;
12476					rgbaData[offset++] = grayColor;
12477				}
12478			}
12479			return rgbaData;
12480		} else if (this.numComponents === 3 && this._isColorConversionNeeded) {
12481			if (forceRGBA) {
12482				const rgbaData = new Uint8ClampedArray(data.length / 3 * 4);
12483				return this._convertYccToRgba(data, rgbaData);
12484			}
12485			return this._convertYccToRgb(data);
12486		} else if (this.numComponents === 4) {
12487			if (this._isColorConversionNeeded) {
12488				if (forceRGBA) {
12489					return this._convertYcckToRgba(data);
12490				}
12491				if (forceRGB) {
12492					return this._convertYcckToRgb(data);
12493				}
12494				return this._convertYcckToCmyk(data);
12495			} else if (forceRGBA) {
12496				return this._convertCmykToRgba(data);
12497			} else if (forceRGB) {
12498				return this._convertCmykToRgb(data);
12499			}
12500		}
12501		return data;
12502	}
12503}
12504
12505;// ./src/core/jpeg_stream.js
12506
12507
12508
12509
12510
12511
12512
12513
12514
12515
12516class JpegStream extends DecodeStream {
12517	static #isImageDecoderSupported = FeatureTest.isImageDecoderSupported;
12518	constructor(stream, maybeLength, params) {
12519		super(maybeLength);
12520		this.stream = stream;
12521		this.dict = stream.dict;
12522		this.maybeLength = maybeLength;
12523		this.params = params;
12524	}
12525	static get canUseImageDecoder() {
12526		return shadow(this, "canUseImageDecoder", this.#isImageDecoderSupported ? ImageDecoder.isTypeSupp
12526orted("image/jpeg") : Promise.resolve(false));
12527	}
12528	static setOptions({
12529		isImageDecoderSupported = false
12530	}) {
12531		this.#isImageDecoderSupported = isImageDecoderSupported;
12532	}
12533	get bytes() {
12534		return shadow(this, "bytes", this.stream.getBytes(this.maybeLength));
12535	}
12536	ensureBuffer(requested) {}
12537	readBlock() {
12538		this.decodeImage();
12539	}
12540	get jpegOptions() {
12541		const jpegOptions = {
12542			decodeTransform: undefined,
12543			colorTransform: undefined
12544		};
12545		const decodeArr = this.dict.getArray("D", "Decode");
12546		if ((this.forceRGBA || this.forceRGB) && Array.isArray(decodeArr)) {
12547			const bitsPerComponent = this.dict.get("BPC", "BitsPerComponent") || 8;
12548			const decodeArrLength = decodeArr.length;
12549			const transform = new Int32Array(decodeArrLength);
12550			let transformNeeded = false;
12551			const maxValue = (1 << bitsPerComponent) - 1;
12552			for (let i = 0; i < decodeArrLength; i += 2) {
12553				transform[i] = (decodeArr[i + 1] - decodeArr[i]) * 256 | 0;
12554				transform[i + 1] = decodeArr[i] * maxValue | 0;
12555				if (transform[i] !== 256 || transform[i + 1] !== 0) {
12556					transformNeeded = true;
12557				}
12558			}
12559			if (transformNeeded) {
12560				jpegOptions.decodeTransform = transform;
12561			}
12562		}
12563		if (this.params instanceof Dict) {
12564			const colorTransform = this.params.get("ColorTransform");
12565			if (Number.isInteger(colorTransform)) {
12566				jpegOptions.colorTransform = colorTransform;
12567			}
12568		}
12569		return shadow(this, "jpegOptions", jpegOptions);
12570	}
12571	#skipUselessBytes(data) {
12572		for (let i = 0, ii = data.length - 1; i < ii; i++) {
12573			if (data[i] === 0xff && data[i + 1] === 0xd8) {
12574				if (i > 0) {
12575					data = data.subarray(i);
12576				}
12577				break;
12578			}
12579		}
12580		return data;
12581	}
12582	decodeImage(bytes) {
12583		if (this.eof) {
12584			return this.buffer;
12585		}
12586		bytes = this.#skipUselessBytes(bytes || this.bytes);
12587		const jpegImage = new JpegImage(this.jpegOptions);
12588		jpegImage.parse(bytes);
12589		const data = jpegImage.getData({
12590			width: this.drawWidth,
12591			height: this.drawHeight,
12592			forceRGBA: this.forceRGBA,
12593			forceRGB: this.forceRGB,
12594			isSourcePDF: true
12595		});
12596		this.buffer = data;
12597		this.bufferLength = data.length;
12598		this.eof = true;
12599		return this.buffer;
12600	}
12601	get canAsyncDecodeImageFromBuffer() {
12602		return this.stream.isAsync;
12603	}
12604	async getTransferableImage() {
12605		if (!(await JpegStream.canUseImageDecoder)) {
12606			return null;
12607		}
12608		const jpegOptions = this.jpegOptions;
12609		if (jpegOptions.decodeTransform) {
12610			return null;
12611		}
12612		let decoder;
12613		try {
12614			const bytes = this.canAsyncDecodeImageFromBuffer && (await this.stream.asyncGetBytes()) || this.bytes;
12615			if (!bytes) {
12616				return null;
12617			}
12618			const data = this.#skipUselessBytes(bytes);
12619			if (!JpegImage.canUseImageDecoder(data, jpegOptions.colorTransform)) {
12620				return null;
12621			}
12622			decoder = new ImageDecoder({
12623				data,
12624				type: "image/jpeg",
12625				preferAnimation: false
12626			});
12627			return (await decoder.decode()).image;
12628		} catch (reason) {
12629			warn(`getTransferableImage - failed: "${reason}".`);
12630			return null;
12631		} finally {
12632			decoder?.close();
12633		}
12634	}
12635}
12636
12637;// ./external/openjpeg/openjpeg.js
12638
12639
12640
12641
12642
12643
12644
12645
12646
12647
12648
12649var OpenJPEG = (() => {
12650	var _scriptName = typeof document != 'undefined' ? document.currentScript?.src : undefined;
12651	return function (moduleArg = {}) {
12652		var moduleRtn;
12653		var Module = moduleArg;
12654		var readyPromiseResolve, readyPromiseReject;
12655		var readyPromise = new Promise((resolve, reject) => {
12656			readyPromiseResolve = resolve;
12657			readyPromiseReject = reject;
12658		});
12659		var ENVIRONMENT_IS_WEB = true;
12660		var ENVIRONMENT_IS_WORKER = false;
12661		Module.decode = function (bytes, {
12662			numComponents = 4,
12663			isIndexedColormap = false,
12664			smaskInData = false
12665		}) {
12666			const size = bytes.length;
12667			const ptr = Module._malloc(size);
12668			Module.HEAPU8.set(bytes, ptr);
12669			const ret = Module._jp2_decode(ptr, size, numComponents > 0 ? numComponents : 0, !!isIndexedColormap, !!smaskInData);
12670			Module._free(ptr);
12671			if (ret) {
12672				const {
12673					errorMessages
12674				} = Module;
12675				if (errorMessages) {
12676					delete Module.errorMessages;
12677					return errorMessages;
12678				}
12679				return "Unknown error";
12680			}
12681			const {
12682				imageData
12683			} = Module;
12684			Module.imageData = null;
12685			return imageData;
12686		};
12687		var moduleOverrides = Object.assign({}, Module);
12688		var arguments_ = [];
12689		var thisProgram = "./this.program";
12690		var quit_ = (status, toThrow) => {
12691			throw toThrow;
12692		};
12693		var scriptDirectory = "";
12694		var readAsync, readBinary;
12695		if (ENVIRONMENT_IS_WEB || ENVIRONMENT_IS_WORKER) {
12696			if (ENVIRONMENT_IS_WORKER) {
12697				scriptDirectory = self.location.href;
12698			} else if (typeof document != "undefined" && document.currentScript) {
12699				scriptDirectory = document.currentScript.src;
12700			}
12701			if (_scriptName) {
12702				scriptDirectory = _scriptName;
12703			}
12704			if (scriptDirectory.startsWith("blob:")) {
12705				scriptDirectory = "";
12706			} else {
12707				scriptDirectory = scriptDirectory.substr(0, scriptDirectory.replace(/[?#].*/, "").lastIndexOf("/") + 1);
12708			}
12709			readAsync = url => fetch(url, {
12710				credentials: "same-origin"
12711			}).then(response => {
12712				if (response.ok) {
12713					return response.arrayBuffer();
12714				}
12715				return Promise.reject(new Error(response.status + " : " + response.url));
12716			});
12717		} else {}
12718		var out = Module["print"] || console.log.bind(console);
12719		var err = Module["printErr"] || console.error.bind(console);
12720		Object.assign(Module, moduleOverrides);
12721		moduleOverrides = null;
12722		if (Module["arguments"]) arguments_ = Module["arguments"];
12723		if (Module["thisProgram"]) thisProgram = Module["thisProgram"];
12724		var wasmBinary = Module["wasmBinary"];
12725		function intArrayFromBase64(s) {
12726			var decoded = atob(s);
12727			var bytes = new Uint8Array(decoded.length);
12728			for (var i = 0; i < decoded.length; ++i) {
12729				bytes[i] = decoded.charCodeAt(i);
12730			}
12731			return bytes;
12732		}
12733		function tryParseAsDataURI(filename) {
12734			if (!isDataURI(filename)) {
12735				return;
12736			}
12737			return intArrayFromBase64(filename.slice(dataURIPrefix.length));
12738		}
12739		var wasmMemory;
12740		var ABORT = false;
vendor: 6,468 bytes, lines 12741-12824
12741		var EXITSTATUS;
12742		var HEAP8, HEAPU8, HEAP16, HEAPU16, HEAP32, HEAPU32, HEAPF32, HEAPF64;
12743		function updateMemoryViews() {
12744			var b = wasmMemory.buffer;
12745			Module["HEAP8"] = HEAP8 = new Int8Array(b);
12746			Module["HEAP16"] = HEAP16 = new Int16Array(b);
12747			Module["HEAPU8"] = HEAPU8 = new Uint8Array(b);
12748			Module["HEAPU16"] = HEAPU16 = new Uint16Array(b);
12749			Module["HEAP32"] = HEAP32 = new Int32Array(b);
12750			Module["HEAPU32"] = HEAPU32 = new Uint32Array(b);
12751			Module["HEAPF32"] = HEAPF32 = new Float32Array(b);
12752			Module["HEAPF64"] = HEAPF64 = new Float64Array(b);
12753		}
12754		var __ATPRERUN__ = [];
12755		var __ATINIT__ = [];
12756		var __ATPOSTRUN__ = [];
12757		var runtimeInitialized = false;
12758		function preRun() {
12759			if (Module["preRun"]) {
12760				if (typeof Module["preRun"] == "function") Module["preRun"] = [Module["preRun"]];
12761				while (Module["preRun"].length) {
12762					addOnPreRun(Module["preRun"].shift());
12763				}
12764			}
12765			callRuntimeCallbacks(__ATPRERUN__);
12766		}
12767		function initRuntime() {
12768			runtimeInitialized = true;
12769			callRuntimeCallbacks(__ATINIT__);
12770		}
12771		function postRun() {
12772			if (Module["postRun"]) {
12773				if (typeof Module["postRun"] == "function") Module["postRun"] = [Module["postRun"]];
12774				while (Module["postRun"].length) {
12775					addOnPostRun(Module["postRun"].shift());
12776				}
12777			}
12778			callRuntimeCallbacks(__ATPOSTRUN__);
12779		}
12780		function addOnPreRun(cb) {
12781			__ATPRERUN__.unshift(cb);
12782		}
12783		function addOnInit(cb) {
12784			__ATINIT__.unshift(cb);
12785		}
12786		function addOnPostRun(cb) {
12787			__ATPOSTRUN__.unshift(cb);
12788		}
12789		var runDependencies = 0;
12790		var runDependencyWatcher = null;
12791		var dependenciesFulfilled = null;
12792		function addRunDependency(id) {
12793			runDependencies++;
12794			Module["monitorRunDependencies"]?.(runDependencies);
12795		}
12796		function removeRunDependency(id) {
12797			runDependencies--;
12798			Module["monitorRunDependencies"]?.(runDependencies);
12799			if (runDependencies == 0) {
12800				if (runDependencyWatcher !== null) {
12801					clearInterval(runDependencyWatcher);
12802					runDependencyWatcher = null;
12803				}
12804				if (dependenciesFulfilled) {
12805					var callback = dependenciesFulfilled;
12806					dependenciesFulfilled = null;
12807					callback();
12808				}
12809			}
12810		}
12811		function abort(what) {
12812			Module["onAbort"]?.(what);
12813			what = "Aborted(" + what + ")";
12814			err(what);
12815			ABORT = true;
12816			what += ". Build with -sASSERTIONS for more info.";
12817			var e = new WebAssembly.RuntimeError(what);
12818			readyPromiseReject(e);
12819			throw e;
12820		}
12821		var dataURIPrefix = "data:application/octet-stream;base64,";
12822		var isDataURI = filename => filename.startsWith(dataURIPrefix);
12823		function findWasmBinary() {
12824			var f = "data:application/octet-stream;base64,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A3FFBEACQCAAQQNxRQRAIAAhAgwBCyACRQRAIAAhAgwBCyAAIQIDQCACIAEtAAA6AAAgAUEBaiEBIAJBAWoiAkEDcUUNASACIANJDQALCyADQXxxIQQCQCADQcAASQ0AIAIgBEFAaiIFSw0AA0AgAiABKAIANgIAIAIgASgCBDYCBCACIAEoAgg2AgggAiABKAIMNgIMIAIgASgCEDYCECACIAEoAhQ2AhQgAiABKAIYNgIYIAIgASgCHDYCHCACIAEoAiA2AiAgAiABKAIkNgIkIAIgASgCKDYCKCACIAEoAiw2AiwgAiABKAIwNgIwIAIgASgCNDYCNCACIAEoAjg2AjggAiABKAI8NgI8IAFBQGshASACQUBrIgIgBU0NAAsLIAIgBE8NAQNAIAIgASgCADYCACABQQRqIQEgAkEEaiICIARJDQALDAELIANBBEkEQCAAIQIMAQsgA0EEayIEIABJBEAgACECDAELIAAhAgNAIAIgAS0AADoAACACIAEtAAE6AAEgAiABLQACOgACIAIgAS0AAzoAAyABQQRqIQEgAkEEaiICIARNDQALCyACIANJBEADQCACIAEtAAA6AAAgAUEBaiEBIAJBAWoiAiADRw0ACwsgAAswAQF/AkAgAEUNACABRQ0AQQggACABbCIBECkiAARAIABBACABEBkaCyAAIQILIAILEQAgAEUEQEEADwtBCCAAECkL8gICAn8BfgJAIAJFDQAgACABOgAAIAAgAmoiA0EBayABOgAAIAJBA0kNACAAIAE6AAIgACABOgABIANBA2sgAToAACADQQJrIAE6AAAgAkEHSQ0AIAAgAToAAyADQQRrIAE6AAAgAkEJSQ0AIABBACAAa0EDcSIEaiIDIAFB/wFxQYGChAhsIgE2AgAgAyACIARrQXxxIgRqIgJBBGsgATYCACAEQQlJDQAgAyABNgIIIAMgATYCBCACQQhrIAE2AgAgAkEMayABNgIAIARBGUkNACADIAE2AhggAyABNgIUIAMgATYCECADIAE2AgwgAkEQayABNgIAIAJBFGsgATYCACACQRhrIAE2AgAgAkEcayABNgIAIAQgA0EEcUEYciIEayICQSBJDQAgAa1CgYCAgBB+IQUgAyAEaiEBA0AgASAFNwMYIAEgBTcDECABIAU3AwggASAFNwMAIAFBIGohASAC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QRAIAAgAUE/cUGAAXI6AAIgACABQQx2QeABcjoAACAAIAFBBnZBP3FBgAFyOgABQQMPCyABQYCABGtB//8/TQRAIAAgAUE/cUGAAXI6AAMgACABQRJ2QfABcjoAACAAIAFBBnZBP3FBgAFyOgACIAAgAUEMdkE/cUGAAXI6AAFBBA8LC0HUzQFBGTYCAEF/DwsgACABOgAAQQELfgIBfwF+IAC9IgNCNIinQf8PcSICQf8PRwR8IAJFBEAgASAARAAAAAAAAAAAYQR/QQAFIABEAAAAAAAA8EOiIAEQcCEAIAEoAgBBQGoLNgIAIAAPCyABIAJB/gdrNgIAIANC/////////4eAf4NCgICAgICAgPA/hL8FIAALC7wCAAJAAkACQAJAAkACQAJAAkACQAJAAkAgAUEJaw4SAAgJCggJAQIDBAoJCgoICQUGBwsgAiACKAIAIgFBBGo2AgAgACABKAIANgIADwsgAiACKAIAIgFBBGo2AgAgACABMgEANwMADwsgAiACKAIAIgFBBGo2AgAgACABMwEANwMADwsgAiACKAIAIgFBBGo2AgAgACABMAAANwMADwsgAiACKAIAIgFBBGo2AgAgACABMQAANwMADwsgAiACKAIAQQdqQXhxIgFBCGo2AgAgACABKwMAOQMADwsgACACIAMRAwALDwsgAiACKAIAIgFBBGo2AgAgACABNAIANwMADwsgAiACKAIAIgFBBGo2AgAgACABNQIANwMADwsgAiACKAIAQQdqQXhxIgFBCGo2AgAgACABKQMANwMAC28BBX8gACgCACIDLAAAQTBrIgFBCUsEQEEADwsDQEF/IQQgAkHMmbPmAE0EQEF/IAEgAkEKbCIFaiABIAVB/////wdzSxshBAsgACADQQFqIgU2AgAgAywAASAEIQIgBSEDQTBrIgFBCkkNAAsgAgtJAQF/AkBBAUEsEBciAQRAIAFBADYCEAJAIABBAEwEQCABQQFBCBAXIgA2AiQgAEUNAQwDCyABQQA2AgwLIAEQFAtBACEBCyABC64UAhJ/An4jAEFAaiIIJAAgCCABNgI8IAhBJ2ohFyAIQShqIRICQAJAAkACQANAQQAhBwNAIAEhDSAHIA5B/////wdzSg0CIAcgDmohDgJAAkACQAJAIAEiBy0AACIMBEADQAJAAkAgDEH/AXEiAUUEQ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CBCAGayIENgIECyAEIAIgAiAESxsiBARAIAUgASAEEBYaIAMgAygCACAEaiIFNgIAIAMgAygCBCAEazYCBAsgBUEAOgAAIAAgACgCLCIBNgIcIAAgATYCFCACC6YFAgZ+BH8gASABKAIAQQdqQXhxIgFBEGo2AgAgACABKQMAIQIgASkDCCEHIwBBIGsiCCQAIAdC////////P4MhBAJ+IAdCMIhC//8BgyIDpyIKQYH4AGtB/Q9NBEAgBEIEhiACQjyIhCEDIApBgPgAa60hBAJAIAJC//////////8PgyICQoGAgICAgICACFoEQCADQgF8IQMMAQsgAkKAgICAgICAgAhSDQAgA0IBgyADfCEDC0IAIAMgA0L/////////B1YiABshAiAArSAEfAwBCwJAIAIgBIRQDQAgA0L//wFSDQAgBEIEhiACQjyIhEKAgICAgICABIQhAkL/DwwBCyAKQf6HAUsEQEIAIQJC/w8MAQtBgPgAQYH4ACADUCIBGyIAIAprIglB8ABKBEBCACECQgAMAQsgAiEDIAQgBEKAgICAgIDAAIQgARsiBSEGAkBBgAEgCWsiAUHAAHEEQCACIAFBQGqthiEGQgAhAwwBCyABRQ0AIAYgAa0iBIYgA0HAACABa62IhCEGIAMgBIYhAwsgCCADNwMQIAggBjcDGAJAIAlBwABxBEAgBSAJQUBqrYghAkIAIQUMAQsgCUUNACAFQcAAIAlrrYYgAiAJrSIDiIQhAiAFIAOIIQULIAggAjcDACAIIAU3AwggCCkDCEIEhiAIKQMAIgNCPIiEIQICQCAAIApHIAgpAxAgCCkDGIRCAFJxrSADQv//////////D4OEIgNCgYCAgICAgIAIWgRAIAJCAXwhAgwBCyADQoCAgICAgICACFINACACQgGDIAJ8IQILIAJCgICAgICAgAiFIAIgAkL/////////B1YiABshAiAArQshAyAIQSBqJAAgB0KAgICAgICAgIB/gyADQjSGhCAChL85AwAL9BcDEn8BfAN+IwBBsARrIgwkACAMQQA2AiwCQCABvSIZQgBTBEBBASEQQboIIRQgAZoiAb0hGQwBCyAEQYAQcQRAQQEhEEG9CCEUDAELQcAIQbsIIARBAXEiEBshFCAQRSEXCwJAIBlCgICAgICAgPj/AINCgICAgICAgPj/AFEEQCAAQSAgAiAQQQNqIgYgBEH//3txECAgACAUIBAQHiAAQZIJQfYKIAVBIHEiAxtB+wlBnwsgAxsgASABYhtBAxAeIABBICACIAYgBEGAwABzECAgAiAGIAIgBkobIQ0MAQsgDEEQaiERAkACQAJAIAEgDEEsahBwIgEgAaAiAUQAAAAAAAAAAGIEQCAMIAwoAiwiBkEBazYCLCAFQSByIhVB4QBHDQEMAwsgBUEgciIVQeEARg0CIAwoAiwhCwwBCyAMIAZBHWsiCzYCLCABRAAAAAAAALBBoiEBC0EGIAMgA0EASBshCiAMQTBqQaACQQAgC0EAThtqIg4hBwNAIAcCfyABRAAAAAAAAPBBYyABRAAAAAAAAAAAZnEEQCABqwwBC0EACyIDNgIAIAdBBGohByABIAO4oUQAAAAAZc3NQaIiAUQAAAAAAAAAAGINAAsCQCALQQBMBEAgCyEJIAchBiAOIQgMAQsgDiEIIAshCQNAQR0gCSAJQR1PGyEDAkAgB0EEayIGIAhJDQAgA60hG0IAIRkDQCAGIBlC/////w+DIAY1AgAgG4Z8IhpCgJTr3AOAIhlCgOyUowx+IBp8PgIAIAZBBGsiBiAITw0ACyAaQoCU69wDVA0AIAhBBGsiCCAZPgIACwNAIAggByIGSQRAIAZBBGsiBygCAEUNAQsLIAwgDCgCLCADayIJNgIsIAYhByAJQQBKDQALCyAJQQBIBEAgCkEZakEJbkEBaiESIBVB5gBGIRMDQEEJQQAgCWsiAyADQQlPGyENAkAgBiAITQRAIAgoAgBFQQJ0IQcMAQtBgJTr3AMgDXYhFkF/IA10QX9zIQ9BACEJIAghBwNAIAcgBygCACIDIA12IAlqNgIAIAMgD3EgFmwhCSAHQQRqIgcgBkkNAAsgCCgCAEVBAnQhByAJRQ0AIAYgCTYCACAGQQRqIQYLIAwgDCgCLCANaiIJNgIsIA4gByAIaiIIIBMbIgMgEkECdGogBiAGIANrQQJ1IBJKGyEGIAlBAEgNAAsLQQAhCQJAIAYgCE0NACAOIAhrQQJ1QQlsIQlBCiEHIAgoAgAiA0EKSQ0AA0AgCUEBaiEJIAMgB0EKbCIHTw0ACwsgCiAJQQAgFUHmAEcbayAVQecARiAKQQBHcWsiAyAGIA5rQQJ1QQlsQQlrSARAIAxBMGpBhGBBpGIgC0EASBtqIANBgMgAaiILQQltIgNBAnRqIQ1BCiEHIANBd2wgC2oiA0EHTARAA0AgB0EKbCEHIANBAWoiA0EIRw0ACwsCQCANKAIAIgsgCyAHbiISIAdsIg9GIA1BBGoiAyAGRnENACALIA9rIQsCQCASQQFxRQRARAAAAAAAAEBDIQEgB0GAlOvcA0cNASAIIA1PDQEgDUEEay0AAEEBcUUNAQtEAQAAAAAAQEMhAQtEAAAAAAAA4D9EAAAAAAAA8D9EAAAAAAAA+D8gAyAGRhtEAAAAAAAA+D8gCyAHQQF2IgNGGyADIAtLGyEYAkAgFw0AIBQtAABBLUcNACAYmiEYIAGaIQELIA0gDzYCACABIBigIAFhDQAgDSAHIA9qIgM2AgAgA0GAlOvcA08EQANAIA1BADYCACAIIA1BBGsiDUsEQCAIQQRrIghBADYCAAsgDSANKAIAQQFqIgM2AgAgA0H/k+vcA0sNAAsLIA4gCGtBAnVBCWwhCUEKIQcgCCgCAC
12824IDQQpJDQADQCAJQQFqIQkgAyAHQQpsIgdPDQALCyANQQRqIgMgBiADIAZJGyEGCwNAIAYiCyAITSIHRQRAIAZBBGsiBigCAEUNAQsLAkAgFUHnAEcEQCAEQQhxIRMMAQsgCUF/c0F/IApBASAKGyIGIAlKIAlBe0pxIgMbIAZqIQpBf0F+IAMbIAVqIQUgBEEIcSITDQBBdyEGAkAgBw0AIAtBBGsoAgAiD0UNAEEKIQNBACEGIA9BCnANAANAIAYiB0EBaiEGIA8gA0EKbCIDcEUNAAsgB0F/cyEGCyALIA5rQQJ1QQlsIQMgBUFfcUHGAEYEQEEAIRMgCiADIAZqQQlrIgNBACADQQBKGyIDIAMgCkobIQoMAQtBACETIAogAyAJaiAGakEJayIDQQAgA0EAShsiAyADIApKGyEKC0F/IQ0gCkH9////B0H+////ByAKIBNyIg8bSg0BIAogD0EAR2pBAWohFgJAIAVBX3EiB0HGAEYEQCAJIBZB/////wdzSg0DIAlBACAJQQBKGyEGDAELIBEgCSAJQR91IgNzIANrrSAREC8iBmtBAUwEQANAIAZBAWsiBkEwOgAAIBEgBmtBAkgNAAsLIAZBAmsiEiAFOgAAIAZBAWtBLUErIAlBAEgbOgAAIBEgEmsiBiAWQf////8Hc0oNAgsgBiAWaiIDIBBB/////wdzSg0BIABBICACIAMgEGoiCSAEECAgACAUIBAQHiAAQTAgAiAJIARBgIAEcxAgAkACQAJAIAdBxgBGBEAgDEEQakEJciEFIA4gCCAIIA5LGyIDIQgDQCAINQIAIAUQLyEGAkAgAyAIRwRAIAYgDEEQak0NAQNAIAZBAWsiBkEwOgAAIAYgDEEQaksNAAsMAQsgBSAGRw0AIAZBAWsiBkEwOgAACyAAIAYgBSAGaxAeIAhBBGoiCCAOTQ0ACyAPBEAgAEHvDEEBEB4LIAggC08NASAKQQBMDQEDQCAINQIAIAUQLyIGIAxBEGpLBEADQCAGQQFrIgZBMDoAACAGIAxBEGpLDQALCyAAIAZBCSAKIApBCU4bEB4gCkEJayEGIAhBBGoiCCALTw0DIApBCUogBiEKDQALDAILAkAgCkEASA0AIAsgCEEEaiAIIAtJGyEDIAxBEGpBCXIhCyAIIQcDQCALIAc1AgAgCxAvIgZGBEAgBkEBayIGQTA6AAALAkAgByAIRwRAIAYgDEEQak0NAQNAIAZBAWsiBkEwOgAAIAYgDEEQaksNAAsMAQsgACAGQQEQHiAGQQFqIQYgCiATckUNACAAQe8MQQEQHgsgACAGIAsgBmsiBSAKIAUgCkgbEB4gCiAFayEKIAdBBGoiByADTw0BIApBAE4NAAsLIABBMCAKQRJqQRJBABAgIAAgEiARIBJrEB4MAgsgCiEGCyAAQTAgBkEJakEJQQAQIAsgAEEgIAIgCSAEQYDAAHMQICACIAkgAiAJShshDQwBCyAUIAVBGnRBH3VBCXFqIQkCQCADQQtLDQBBDCADayEGRAAAAAAAADBAIRgDQCAYRAAAAAAAADBAoiEYIAZBAWsiBg0ACyAJLQAAQS1GBEAgGCABmiAYoaCaIQEMAQsgASAYoCAYoSEBCyARIAwoAiwiByAHQR91IgZzIAZrrSAREC8iBkYEQCAGQQFrIgZBMDoAAAsgEEECciEKIAVBIHEhCyAGQQJrIg4gBUEPajoAACAGQQFrQS1BKyAHQQBIGzoAACAEQQhxRSADQQBMcSEIIAxBEGohBwNAIAciBQJ/IAGZRAAAAAAAAOBBYwRAIAGqDAELQYCAgIB4CyIGQZDJAWotAAAgC3I6AAAgASAGt6FEAAAAAAAAMECiIQECQCAFQQFqIgcgDEEQamtBAUcNACABRAAAAAAAAAAAYSAIcQ0AIAVBLjoAASAFQQJqIQcLIAFEAAAAAAAAAABiDQALQX8hDSADQf3///8HIAogESAOayIIaiIGa0oNACAAQSAgAiAGIANBAmogByAMQRBqIgVrIgcgB0ECayADSBsgByADGyIDaiIGIAQQICAAIAkgChAeIABBMCACIAYgBEGAgARzECAgACAFIAcQHiAAQTAgAyAHa0EAQQAQICAAIA4gCBAeIABBICACIAYgBEGAwABzECAgAiAGIAIgBkobIQ0LIAxBsARqJAAgDQsEAEIACwQAQQALHAAgACgCPBARIgAEf0HUzQEgADYCAEF/BUEACwvKAgEHfyMAQSBrIgMkACADIAAoAhwiBDYCECAAKAIUIQUgAyACNgIcIAMgATYCGCADIAUgBGsiATYCFCABIAJqIQVBAiEGIANBEGohAQJ/A0ACQAJAAkAgACgCPCABIAYgA0EMahABIgQEf0HUzQEgBDYCAEF/BUEAC0UEQCAFIAMoAgwiB0YNASAHQQBODQIMAwsgBUF/Rw0CCyAAIAAoAiwiATYCHCAAIAE2AhQgACABIAAoAjBqNgIQIAIMAwsgASAHIAEoAgQiCEsiCUEDdGoiBCAHIAhBACAJG2siCCAEKAIAajYCACABQQxBBCAJG2oiASABKAIAIAhrNgIAIAUgB2shBSAGIAlrIQYgBCEBDAELCyAAQQA2AhwgAEIANwMQIAAgACgCAEEgcjYCAEEAIAZBAkYNABogAiABKAIEawsgA0EgaiQAC1IBAX8gACgCPCMAQRBrIgAkACABpyABQiCIpyACQf8BcSAAQQhqEAkiAgR/QdTNASACNgIAQX8FQQALIQIgACkDCCEBIABBEGokAEJ/IAEgAhsLBgAgABAACwYAIAAQAwvvgQEFA3wyfwh7A34GfSMAQeDAAGsiGiQAIBpBADYCIEECIQ4CQAJAIAAoAgAiCEGNlJzUAEYNACAIQf+f/Y8FRwRAAkAgCEGAgIDgAEcNACAAKAIEQeqggYECRw0AIAAoAghBjZSc1ABGDQILQc0IEABBASEODAILQQAhDgsCf0EAQQFB4AAQFyIIRQ0AGiAIQQE2AkwCQAJAAkACQCAODgMAAwEDCyAIQcQANgJYIAhBxQA2AlQgCEHGADYCUCAIQccANgIQIAhByAA2AgQgCEHJADYCHCAIQcoANgIYIAhBywA2AhQgCEHMADYCACAIQc0ANgJcIAhBzgA2AiwgCEHPADYCKCAIQdAANgIkIAhB0QA2AiAgCEHSADYCDCAIQdMANgIIIAgQViINNgIwIA0NAQwCCyAIQdQANgJYIAhB1QA2AlQgCEHWADYCUCAIQdcANgIQIAhB2AA2AgQgCEHZADYCXCAIQdoANgIsIAhB2wA2AiggCEHcADYCJCAIQd0ANgIgIAhB3gA2AhwgCEHfADYCGCAIQeAANgIUIAhB4QA2AgwgCEHiADYCCCAIQeMANgIAIAgCf0EBQYgBEBciDQRAIA0QViIUNgIAAkAgFEUNACAN/QwAAAAAAAAAAAAAAAAAAAAA/QsCbCANQQA6AHwgDRA5IhQ2AgQgFEUNACANEDkiFDYCCCAURQ0AIA0MAgsgDRB9C0EACyINNgIwIA1FDQELIAhBATYCSCAIQQE2AkAgCEEANgI8IAhCADcCNCAIQQE2AkQgCAwBCyAIEBRBAAsiDQRAIA1BADYCPCANQeQANgJICyANBEAgDUEANgI4IA1B5QA2AkQLIA0EQCANQQA2AjQgDUHmADYCQAsgGkEkaiIIBEAgCEEAQbjAABAZIghBADYCuEAgCEJ/NwKIQAsgAwRAIBogGigC3EBBAXI2AtxACyAaIAE2AhwgGiAANgIYIBogADYCFEEBIQ5BACEBAkAgGkEUaiIIRQ0AQQFByAAQFyIABH8CfyAAQYCAwAA2AkAgAEGAgMAAEBgiFDYCICAURQRAIAAQFEEADAELIAAgFDYCJCAAQQI2AhwgAEEDNgIYIABBBDYCFCAAQQU2AhAgAEEGNgIsIABBCDYCKCAAIAAoAkRBAnI2AkQgAAsFQQALIgBFDQAgAARAIABBADYCBCAAIAg2AgALIAg1AgghQiAABEAgACBCNwMICwJAIABFDQAgAC0AREECcUUNACAAQcAANgIQCyAABEAgAEHCADYCGAsgAARAIABBwwA2AhwLIAAhAQsgASEAAn8gGkEkaiEBAkAgDUUNACABRQ0AIA0oAkxFBEAgDUE0akEBQYnNAEEAEBNBAAwCCyANKAIwIAEgDSgCGBEDAEEBIQkLIAkLRQRAQdwIEAAgABA9IA0QPgwBCwJ/IBpBIGohAUEAIQgCQCAAR
12824Q0AIA1FDQAgDSgCTEUEQCANQTRqQQFB2s0AQQAQE0EADAILIAAgDSgCMCABIA1BNGogDSgCABEBACEICyAIC0UEQEH4CBAAIAAQPSANED4gGigCIBAlDAELIBooAiAhAUEAIQgCQCANRQ0AIABFDQAgDSgCTEUNACANKAIwIAAgASANQTRqIA0oAgQRAQAhCAsCQCAIBEBBACEIAkAgDUUNACAARQ0AIA0oAkxFDQAgDSgCMCAAIA1BNGogDSgCEBEAACEICyAIDQELQf8JEAAgDRA+IAAQPSAaKAIgECUMAQsgABA9IA0QPiAaKAIgIhQoAhwiAARAIAAQFCAaKAIgIhRCADcCHAsgFCgCECEhAkACQCACRQRAAkAgBEUNACAhQQRHDQBBASEZQQQhIQwDCwJAAkAgFCgCFCIBQQNGDQAgIUEDRw0AIBQoAhgiACgCACAAKAIERw0BIAAoAjRBAUYNASAUQQM2AhQMAwsgIUECSw0AIBRBAjYCFAwDCwJAAkAgAUEDaw4DAwEABAsjAEEQayIJJAACQAJAAkAgFCgCEEEESQ0AIBQoAhgiACgCACIBIAAoAjRHDQAgASAAKAJoRw0AIAEgACgCnAFHDQAgACgCBCIBIAAoAjhHDQAgASAAKAJsRw0AIAEgACgCoAFGDQELIAlBnQg2AgQgCUG4CjYCAEGwywFBzj8gCRAaDAELAkAgACgCDCAAKAIIbCINRQRAIAAoAsgBIQEMAQtDAACAP0F/IAAoArQBdEF/c7OVIUVDAACAP0F/IAAoAoABdEF/c7OVIUdDAACAP0F/IAAoAkx0QX9zs5UhSEMAAIA/QX8gACgCGHRBf3OzlSFGIAAoAsgBIQEgACgClAEhAiAAKAJgIQogACgCLCEIQQAhAAJAIA1BCEkNACAIIAogDUECdCILaiIPSSAKIAggC2oiFklxDQAgAiAWSSAIIAIgC2oiDElxDQAgASAWSSAIIAEgC2oiC0lxDQAgCiAMSSACIA9JcQ0AIAEgD0kgCiALSXENACABIAxJIAIgC0lxDQAgDUF8cSEAIEX9EyE6IEf9EyE7IEj9EyFAIEb9EyE9QQAhCwNAIAIgC0ECdCIPaiIW/QACACE+IAogD2oiDP0AAgAhPyAIIA9qIhD9DAAAgD8AAIA/AACAPwAAgD8gPSAQ/QACAP36Af3mAf3lAf0MAAB/QwAAf0MAAH9DAAB/Q/3mAf0MAACAPwAAgD8AAIA/AACAPyA6IAEgD2r9AAIA/foB/eYB/eUBIjz95gH9+AH9CwIAIAz9DAAAgD8AAIA/AACAPwAAgD8gQCA//foB/eYB/eUB/QwAAH9DAAB/QwAAf0MAAH9D/eYBIDz95gH9+AH9CwIAIBb9DAAAgD8AAIA/AACAPwAAgD8gOyA+/foB/eYB/eUB/QwAAH9DAAB/QwAAf0MAAH9D/eYBIDz95gH9+AH9CwIAIAtBBGoiCyAARw0ACyAAIA1GDQELA0ACf0MAAIA/IEYgCCAAQQJ0IgtqIg8oAgCylJNDAAB/Q5RDAACAPyBFIAEgC2ooAgCylJMiSZQiSotDAAAAT10EQCBKqAwBC0GAgICAeAshFiACIAtqIgwoAgAhECAKIAtqIgsoAgAhDiAPIBY2AgAgCwJ/QwAAgD8gSCAOspSTQwAAf0OUIEmUIkqLQwAAAE9dBEAgSqgMAQtBgICAgHgLNgIAIAwCf0MAAIA/IEcgELKUk0MAAH9DlCBJlCJJi0MAAABPXQRAIEmoDAELQYCAgIB4CzYCACAAQQFqIgAgDUcNAAsLIAEQFCAUKAIYIgBBCDYCgAEgAEEINgJMIABBCDYCGCAAQQA2AsgBIBRBATYCFCAUIBQoAhBBAWsiADYCECAAQQRJDQBBAyEAA0AgFCgCGCAAQTRsaiIBIAEoAmQ2AjAgASAB/QACVP0LAiAgASAB/QACRP0LAhAgASAB/QACNP0LAgAgAEEBaiIAIBQoAhBJDQALCyAJQRBqJAAMAwsjAEEQayIJJAACQAJAAkAgFCgCEEEDSQ0AIBQoAhgiACgCACIBIAAoAjRHDQAgASAAKAJoRw0AIAAoAgQiASAAKAI4Rw0AIAEgACgCbEYNAQsgCUHbCDYCBCAJQbgKNgIAQbDLAUH4PyAJEBoMAQsCQCAAKAIMIAAoAghsIgJFDQBBfyAAKAIYIgp0QX9zIQFBAEEBIApBAWt0IgogACgCiAEbIQ9BACAKIAAoAlQbIRYgACgClAEhCiAAKAJgIQggACgCLCENQQAhAAJAIAJBBEkNACANIAggAkECdCILaiIMSSAIIAsgDWoiEElxDQAgCiAQSSANIAogC2oiC0lxDQAgCCALSSAKIAxJcQ0AIAJBfHEhACAB/REhPCAP/REhPSAW/REhPkEAIQsDQCANIAtBAnQiDGoiECA8IAogDGoiDv0AAgAgPf2xAf36ASI6/QxpdLM/aXSzP2l0sz9pdLM//eYBIAggDGoiDP0AAgAgPv2xAf36ASI7/QyzWRq4s1kauLNZGrizWRq4/eYBIBD9AAIA/foBIkD95AH95AH9DAAAAD8AAAA/AAAAPwAAAD/95AH9+AEiP/0MAAAAAAAAAAAAAAAAAAAAAP24ASA8ID/9Of1S/QsCACAMIDwgOv0MGdA2vxnQNr8Z0Da/GdA2v/3mASBA/QzVCYA/1QmAP9UJgD/VCYA//eYBIDv9DCcxsL4nMbC+JzGwvicxsL795gH95AH95AH9DAAAAD8AAAA/AAAAPwAAAD/95AH9+AEiP/0MAAAAAAAAAAAAAAAAAAAAAP24ASA8ID/9Of1S/QsCACAOIDwgOv0MvTcGt703Bre9Nwa3vTcGt/3mASBA/Qxm9H8/ZvR/P2b0fz9m9H8//eYBIDv9DDXS4j810uI/NdLiPzXS4j/95gH95AH95AH9DAAAAD8AAAA/AAAAPwAAAD/95AH9+AEiOv0MAAAAAAAAAAAAAAAAAAAAAP24ASA8IDr9Of1S/QsCACALQQRqIgsgAEcNAAsgACACRg0BCwNAAn8gCiAAQQJ0IgtqIgwoAgAgD2uyIkVDaXSzP5QgCCALaiIQKAIAIBZrsiJHQ7NZGriUIAsgDWoiDigCALIiSJKSQwAAAD+SIkaLQwAAAE9dBEAgRqgMAQtBgICAgHgLIQsgDiABIAtBACALQQBKGyABIAtIGzYCACAQIAECfyBFQxnQNr+UIEhD1QmAP5QgR0MnMbC+lJKSQwAAAD+SIkaLQwAAAE9dBEAgRqgMAQtBgICAgHgLIgtBACALQQBKGyABIAtIGzYCACAMIAECfyBFQ703BreUIEhDZvR/P5QgR0M10uI/lJKSQwAAAD+SIkWLQwAAAE9dBEAgRagMAQtBgICAgHgLIgtBACALQQBKGyABIAtIGzYCACAAQQFqIgAgAkcNAAsLIBRBATYCFAsgCUEQaiQADAILICEgAiACICFLGyEhQQEhGQwBCwJAAkACfwJAAkAgFCgCGCIBKAIAQQFHDQACQAJAIAEoAjRBAWsOAgEAAgsgASgCaEECRw0BAkAgASgCBEEBRw0AIAEoAjhBAkcNACABKAJsQQJHDQAgFCIWKAIYIgAoAhghASAAKAKUASEOIAAoAmAhCiAAKAIsIRAgACgCPCEfIAAoAggiCSAAKAIMIgJsQQJ0IgAQHCEIIAAQHCENIAAQHCEUAkACQAJAAkACQAJAIAhFDQAgDUUNACAURQ0AQX8gAXRBf3MhDEEBIAFBAWt0IREgAiAWKAIEQQFxIgBrISYgFigCAEEBcSEdIABFDQMgCUUNAwJ/QQAgEWuyuyIFRGq8dJMYBNY/oiAFRAwCK4cW2eY/oqAiBplEAAAAAAAA4EFjBEAgBqoMAQtBgICAgHgLIRMCfyAFRCcxCKwcWvw/oiIGmUQAAAAAAADgQWMEQCAGqgwBC0GAgICAeAshFSAJQQhJAn8gBUQ730+Nl272P6IiBZlEAAAAAAAA4EFjBEAgBaoMAQtBgICAgHgLIRsNASANIAhrQRBJDQEgFCAIa0EQSQ0BIAggEGtBEEkNASAUIA1rQRBJDQEgDSAQa0EQSQ0BIBQgEGtBEEkNASAUIAlBfHEiD0ECdCICaiEAIAIgCGohASAV/REhOyAT/REhQCAM/REhPCAb/REhPQNAIAggF0ECdCILav0MAAAAAAAAAAAAAAAAAAAAACALIBBq/QACACI6ID39rgEiPiA8/bYBID79DAAAAAAAAAAAAAAAAAAAAAD9Of1S/QsCACALIA1q/QwAAAAAAAAAAAAAAAAAAAAAIDogQP2xASI+IDz9tgEgPv
128240MAAAAAAAAAAAAAAAAAAAAAP05/VL9CwIAIAsgFGr9DAAAAAAAAAAAAAAAAAAAAAAgOiA7/a4BIjogPP22ASA6/QwAAAAAAAAAAAAAAAAAAAAA/Tn9Uv0LAgAgF0EEaiIXIA9HDQALIAIgEGohECACIA1qIQIgCSAPRg0EDAILIAgQFCANEBQgFBAUDAQLIAghASANIQIgFCEACwNAIAEgECgCACILIBtqIhcgDCAMIBdKG0EAIBdBAE4bNgIAIAIgCyATayIXIAwgDCAXShtBACAXQQBOGzYCACAAIAsgFWoiCyAMIAsgDEgbQQAgC0EAThs2AgAgAEEEaiEAIAJBBGohAiABQQRqIQEgEEEEaiEQIA9BAWoiDyAJRw0ACwwBCyAUIQAgDSECIAghAQsgCSAdayEiAkAgJkF+cSInBH8Cf0EAIBFrsrsiBURqvHSTGATWP6IgBUQMAiuHFtnmP6KgIgaZRAAAAAAAAOBBYwRAIAaqDAELQYCAgIB4CyEeICJBfnEiKEEBawJ/IAVEJzEIrBxa/D+iIgaZRAAAAAAAAOBBYwRAIAaqDAELQYCAgIB4CyEgQX5xAn8gBUQ730+Nl272P6IiBZlEAAAAAAAA4EFjBEAgBaoMAQtBgICAgHgLISMgJ0EBayEpQQJqIQsgCUECdCEbA0AgACAbaiEXIAIgG2ohFSABIBtqIQ8gECAbaiETIB0EQCABIBAoAgAiCSAjaiISIAwgDCASShtBACASQQBOGzYCACACIAkgHmsiEiAMIAwgEkobQQAgEkEAThs2AgAgACAJICBqIgkgDCAJIAxIG0EAIAlBAE4bNgIAIAooAgAhGCAPAn8gDigCACARa7K7IgVEO99PjZdu9j+iIgaZRAAAAAAAAOBBYwRAIAaqDAELQYCAgIB4CyATKAIAIglqIhIgDCAMIBJKG0EAIBJBAE4bNgIAIBUgCQJ/IBggEWuyuyIGRGq8dJMYBNY/oiAFRAwCK4cW2eY/oqAiBZlEAAAAAAAA4EFjBEAgBaoMAQtBgICAgHgLayISIAwgDCASShtBACASQQBOGzYCACAXAn8gBkQnMQisHFr8P6IiBZlEAAAAAAAA4EFjBEAgBaoMAQtBgICAgHgLIAlqIgkgDCAJIAxIG0EAIAlBAE4bNgIAIBdBBGohFyAVQQRqIRUgD0EEaiEPIBNBBGohEyACQQRqIQIgEEEEaiEQIAFBBGohASAAQQRqIQALQQAhCSAoBEADQCAKKAIAIRwgAQJ/IA4oAgAgEWuyuyIFRDvfT42XbvY/oiIGmUQAAAAAAADgQWMEQCAGqgwBC0GAgICAeAsgECgCACISaiIYIAwgDCAYShtBACAYQQBOGzYCACACIBICfyAcIBFrsrsiBkRqvHSTGATWP6IgBUQMAiuHFtnmP6KgIgWZRAAAAAAAAOBBYwRAIAWqDAELQYCAgIB4C2siGCAMIAwgGEobQQAgGEEAThs2AgAgAAJ/IAZEJzEIrBxa/D+iIgWZRAAAAAAAAOBBYwRAIAWqDAELQYCAgIB4CyASaiISIAwgDCASShtBACASQQBOGzYCACAKKAIAIRwgAQJ/IA4oAgAgEWuyuyIFRDvfT42XbvY/oiIGmUQAAAAAAADgQWMEQCAGqgwBC0GAgICAeAsgECgCBCISaiIYIAwgDCAYShtBACAYQQBOGzYCBCACIBICfyAcIBFrsrsiBkRqvHSTGATWP6IgBUQMAiuHFtnmP6KgIgWZRAAAAAAAAOBBYwRAIAWqDAELQYCAgIB4C2siGCAMIAwgGEobQQAgGEEAThs2AgQgAAJ/IAZEJzEIrBxa/D+iIgWZRAAAAAAAAOBBYwRAIAWqDAELQYCAgIB4CyASaiISIAwgDCASShtBACASQQBOGzYCBCAKKAIAIRwgDwJ/IA4oAgAgEWuyuyIFRDvfT42XbvY/oiIGmUQAAAAAAADgQWMEQCAGqgwBC0GAgICAeAsgEygCACISaiIYIAwgDCAYShtBACAYQQBOGzYCACAVIBICfyAcIBFrsrsiBkRqvHSTGATWP6IgBUQMAiuHFtnmP6KgIgWZRAAAAAAAAOBBYwRAIAWqDAELQYCAgIB4C2siGCAMIAwgGEobQQAgGEEAThs2AgAgFwJ/IAZEJzEIrBxa/D+iIgWZRAAAAAAAAOBBYwRAIAWqDAELQYCAgIB4CyASaiISIAwgDCASShtBACASQQBOGzYCACAKKAIAIRwgDwJ/IA4oAgAgEWuyuyIFRDvfT42XbvY/oiIGmUQAAAAAAADgQWMEQCAGqgwBC0GAgICAeAsgEygCBCISaiIYIAwgDCAYShtBACAYQQBOGzYCBCAVIBICfyAcIBFrsrsiBkRqvHSTGATWP6IgBUQMAiuHFtnmP6KgIgWZRAAAAAAAAOBBYwRAIAWqDAELQYCAgIB4C2siGCAMIAwgGEobQQAgGEEAThs2AgQgFwJ/IAZEJzEIrBxa/D+iIgWZRAAAAAAAAOBBYwRAIAWqDAELQYCAgIB4CyASaiISIAwgDCASShtBACASQQBOGzYCBCAOQQRqIQ4gCkEEaiEKIBdBCGohFyAVQQhqIRUgD0EIaiEPIBNBCGohEyAAQQhqIQAgAkEIaiECIAFBCGohASAQQQhqIRAgCUECaiIJIChJDQALIAshCQsCQCAJICJPDQAgECgCACESIA8CfyAfIAlBAXYiGEYEQCABIBIgI2oiCSAMIAkgDEgbQQAgCUEAThs2AgAgAiASIB5rIgkgDCAJIAxIG0EAIAlBAE4bNgIAIAAgEiAgaiIJIAwgCSAMSBtBACAJQQBOGzYCACATKAIAIgkgHmsiDyAMIAwgD0obQQAgD0EAThshDyAJICBqIRMgCSAjaiIJIAwgCSAMSBtBACAJQQBOGwwBCyAKKAIAIQ8gAQJ/IA4oAgAgEWuyuyIFRDvfT42XbvY/oiIGmUQAAAAAAADgQWMEQCAGqgwBC0GAgICAeAsgEmoiCSAMIAkgDEgbQQAgCUEAThs2AgAgAiASAn8gDyARa7K7IgZEarx0kxgE1j+iIAVEDAIrhxbZ5j+ioCIFmUQAAAAAAADgQWMEQCAFqgwBC0GAgICAeAtrIgkgDCAJIAxIG0EAIAlBAE4bNgIAIAACfyAGRCcxCKwcWvw/oiIFmUQAAAAAAADgQWMEQCAFqgwBC0GAgICAeAsgEmoiCSAMIAkgDEgbQQAgCUEAThs2AgAgEygCACIJAn8gCigCACARa7K7IgVEarx0kxgE1j+iIA4oAgAgEWuyuyIGRAwCK4cW2eY/oqAiB5lEAAAAAAAA4EFjBEAgB6oMAQtBgICAgHgLayIPIAxIIRMgDyAMIBMbIRMgD0EASCESAn8gBkQ730+Nl272P6IiBplEAAAAAAAA4EFjBEAgBqoMAQtBgICAgHgLIAlqIg8gDCAMIA9KGyEcIA9BAEghJEEAIBMgEhshDwJ/IAVEJzEIrBxa/D+iIgWZRAAAAAAAAOBBYwRAIAWqDAELQYCAgIB4CyAJaiETQQAgHCAkGws2AgAgFSAPNgIAIBcgEyAMIAwgE0obQQAgE0EAThs2AgAgAEEEaiEAIAJBBGohAiABQQRqIQEgEEEEaiEQIBggH08NACAOQQRqIQ4gCkEEaiEKCyAAIBtqIQAgAiAbaiECIAEgG2ohASAQIBtqIRAgJUECaiIlICdJDQALIClBfnFBAmoFQQALICZPDQAgHQRAIAECf0EAIBFrsrsiBUQ730+Nl272P6IiBplEAAAAAAAA4EFjBEAgBqoMAQtBgICAgHgLIBAoAgAiCWoiCyAMIAsgDEgbQQAgC0EAThs2AgAgAiAJAn8gBURqvHSTGATWP6IgBUQMAiuHFtnmP6KgIgaZRAAAAAAAAOBBYwRAIAaqDAELQYCAgIB4C2siCyAMIAsgDEgbQQAgC0EAThs2AgAgAAJ/IAVEJzEIrBxa/D+iIgWZRAAAAAAAAOBBYwRAIAWqDAELQYCAgIB4CyAJaiIJIAwgCSAMSBtBACAJQQBOGzYCACACQQRqIQIgEEEEaiEQIAFBBGohASAAQQRqIQALICIgIkF+cSIbBH8gG0EBayIJQX5xAkACf0EAIBtBD0kNABpBACABIAIgCUEBdiIVQQN0QQhqIhNqIglJIAIgASATaiILSXENABpBACAAIAtJIAEgACATaiIPSXENABpBACABIBAgE2oiE0kgCyAQS3ENABpBACAKIAtJIAEgCiAVQQJ0QQRqIhJqIhdJcQ0AGkEAIAsgDksgASAOIBJqIgtJcQ0AGkEAIAIgD0kgACAJSXENABpBACACIBNJIAkgEEtxDQAaQQAgAiAXSSAJIApLcQ0AGkEAIAIgC0kgCSAOS3ENABpBACAAIBNJIA8gEEtxDQAaQQAgACAXSSAKIA9JcQ0AGkEAIAAgC0kgDiAPSXENABogCiAVQQFqIiVB/P///wdxIhdBAnQiJmohCSAAIBdBA3QiEmohCyABIBJqIQ8gDP0RITwgEf0RIUBBACEVA0AgECAVQQN0IhNBGHIiHWoiJyAQIBNBEHIiHmoiKCAQIBNBCHIiIGoiGCAQIBNqIin9XAIA/VYCAAH9VgIAAv1WAgADIToCfyAOIBVBAnQiHGr9AAIAIED9sQH9+gEiO/1fIj39DDvfT42XbvY/O99PjZdu9j/98gEiPv0hASIFmUQAAAAAAADgQWMEQCAFqgwBC0GAgICAeAshJCAKIBxq/QACACE/IAEgE2oiHP0MAAAAAAAAAAAAAAAAAAAAACA6An8gPv0hACIFmUQAAAAAAADgQWMEQCAFqgwBC0GAgICAeAv9ESAk/RwBAn8gOyA7/Q0ICQoLDA0ODwABAgMAAQID/V8iPv0MO99PjZdu9j8730+Nl272P/3yASI7/SEAIgWZRAAAAAAAAOBBYwRAIAWqDAELQYCAgIB4C/0cAgJ/IDv9IQEiBZlEAAAAAAAA4EFjBEAgBaoMAQtBgICAgHgL/RwDIkH9rgEiOyA8/bYBIDv9DAAAAAAAAAAAAAAAAAAAAAD9Of1SIjv9WgIAACABICBqIiQgO/1aAgABIAEgHmoiLCA7/VoCAAIgASAdaiItIDv9WgIAAwJ/ID8gQP2xAf36ASI7/V8iP/0Marx0kxgE1j9qvHSTGATWP/3yASA9/QwMAiuHFtnmPwwCK4cW2eY//fIB/fABIj39IQEiBZlEAAAAAAAA4EFjBEAgBaoMAQtBgICAgHgLISogAiATaiIu/QwAAAAAAAAAAAAAAAAAAAAAIDoCfyA9/SEAIgWZRAAAAAAAAOBBYwRAIAWqDAELQYCAgIB4C/0RICr9HAECfyA7/QwAAAAAAAAAAAAAAAAAAAAA/Q0ICQoLDA0ODwABAgMAAQID/V8iPf0Marx0kxgE1j9qvHSTGATWP/3yASA+/QwMAiuHFtnmPwwCK4cW2eY//fIB/fABIjv9IQAiBZlEAAAAAAAA4EFjBEAgBaoMAQtBgICAgHgL/RwCAn8gO/0hASIFmUQAAAAAAADgQWMEQCAFqgwBC0GAgICAeAv9HAMiPv2xASI7IDz9tgEgO/0MAAAAAAAAAAAAAAAAAAAAAP05/VIiO/1aAgAAIAIgIGoiKiA7/VoCAAEgAiAeaiIvIDv9WgIAAiACIB1qIjAgO/1aAgADAn8gP/0MJzEIrBxa/D8nMQisHFr8P/3yASI7/SEBIgWZRAAAAAAAAOBBYwRAIAWqDAELQYCAgIB4CyErIAAgE2oiE/0MAAAAAAAAAAAAAAAAAAAAACA6An8gO/0hACIFmUQAAAAAAADgQWMEQCAFqgwBC0GAgICAeAv9ESAr/RwBAn8gPf0MJzEIrBxa/D8nMQisHFr8P/3yASI6/SEAIgWZRAAAAAAAAOBBYwRAIAWqDAELQYCAgIB4C/0cAgJ/IDr9IQEiBZlEAAAAAAAA4EFjBEAgBaoMAQtBgICAgHgL/RwDIj39rgEiOiA8/bYBIDr9DAAAAAAAAAAAAAAAAAAAAAD9Of1SIjr9WgIAACAAICBqIiAgOv1aAgABIAAgHmoiHiA6/VoCAAIgACAdaiIdIDr9WgIAAyAc/QwAAAAAAAAAAAAAAAAAAAAAICdBBGogKEEEaiAYQQRqICn9XAIE/VYCAAH9VgIAAv1WAgADIjsgQf2uASI6IDz9tgEgOv0MAAAAAAAAAAAAAAAAAAAAAP05/VIiOv1aAgQAICQgOv1aAgQBICwgOv1aAgQCIC0gOv1aAgQDIC79DAAAAAAAAAAAAAAAAAAAAAAgOyA+/bEBIjogPP22ASA6/QwAAAAAAAAAAAAAAAAAAAAA/Tn9UiI6/VoCBAAgKiA6/VoCBAEgLyA6/VoCBAIgMCA6/VoCBAMgE/0MAAAAAAAAAAAAAAAAAAAAACA7ID39rgEiOiA8/bYBIDr9DAAAAAAAAAAAAAAAAAAAAAD9Of1SIjr9WgIEACAgIDr9WgIEASAeIDr9WgIEAiAdIDr9WgIEAyAVQQRqIhUgF0cNAAsgDiAmaiEOIBAg
12824EmohECACIBJqIQIgFyAlRgRAIA8hASALIQAgCSEKDAILIA8hASALIQAgCSEKIBdBAXQLIQ8DQCAKKAIAIRMgAQJ/IA4oAgAgEWuyuyIFRDvfT42XbvY/oiIGmUQAAAAAAADgQWMEQCAGqgwBC0GAgICAeAsgECgCACIJaiILIAwgCyAMSBtBACALQQBOGzYCACACIAkCfyATIBFrsrsiBkRqvHSTGATWP6IgBUQMAiuHFtnmP6KgIgWZRAAAAAAAAOBBYwRAIAWqDAELQYCAgIB4C2siCyAMIAsgDEgbQQAgC0EAThs2AgAgAAJ/IAZEJzEIrBxa/D+iIgWZRAAAAAAAAOBBYwRAIAWqDAELQYCAgIB4CyAJaiIJIAwgCSAMSBtBACAJQQBOGzYCACAKKAIAIRMgAQJ/IA4oAgAgEWuyuyIFRDvfT42XbvY/oiIGmUQAAAAAAADgQWMEQCAGqgwBC0GAgICAeAsgECgCBCIJaiILIAwgCyAMSBtBACALQQBOGzYCBCACIAkCfyATIBFrsrsiBkRqvHSTGATWP6IgBUQMAiuHFtnmP6KgIgWZRAAAAAAAAOBBYwRAIAWqDAELQYCAgIB4C2siCyAMIAsgDEgbQQAgC0EAThs2AgQgAAJ/IAZEJzEIrBxa/D+iIgWZRAAAAAAAAOBBYwRAIAWqDAELQYCAgIB4CyAJaiIJIAwgCSAMSBtBACAJQQBOGzYCBCAOQQRqIQ4gCkEEaiEKIABBCGohACACQQhqIQIgAUEIaiEBIBBBCGohECAPQQJqIg8gG0kNAAsLQQJqBUEACyILTQ0AIBAoAgAhCQJ8IB8gC0EBdkYEQAJ/QQAgEWuyuyIFRDvfT42XbvY/oiIGmUQAAAAAAADgQWMEQCAGqgwBC0GAgICAeAsgCWoiCiAMIAogDEgbQQAgCkEAThshDiAFDAELAn8gDigCACARa7K7IgVEO99PjZdu9j+iIgaZRAAAAAAAAOBBYwRAIAaqDAELQYCAgIB4CyAJaiILIAwgCyAMSBtBACALQQBOGyEOIAooAgAgEWuyuwshBiABIA42AgAgAiAJAn8gBkRqvHSTGATWP6IgBUQMAiuHFtnmP6KgIgWZRAAAAAAAAOBBYwRAIAWqDAELQYCAgIB4C2siASAMIAEgDEgbQQAgAUEAThs2AgAgAAJ/IAZEJzEIrBxa/D+iIgWZRAAAAAAAAOBBYwRAIAWqDAELQYCAgIB4CyAJaiIAIAwgACAMSBtBACAAQQBOGzYCAAsgFigCGCgCLBAUIBYoAhgiACAINgIsIAAoAmAQFCAWKAIYIgAgDTYCYCAAKAKUARAUIBYoAhgiACAUNgKUASAAIAD9AAIAIjz9CwJoIAAgPP0LAjQgFkEBNgIUCwwHCyABKAIEQQFHDQEgASgCOEEBRw0BIAEoAmxBAUcNASABKAIYIQAgASgClAEhAiABKAJgIQsgASgCLCEOIAEoAjwhICABKAIIIgogASgCDCIjbEECdCIBEBwhDyABEBwhFiABEBwhDCAPRQ0FIBZFDQUgDEUNBSAjBEAgCiAUKAIAQQFxIixrISUCf0EAQQEgAEEBa3QiE2uyuyIFRGq8dJMYBNY/oiAFRAwCK4cW2eY/oqAiBplEAAAAAAAA4EFjBEAgBqoMAQtBgICAgHgLISZBfyAAdCAlQX5xIiJBAWsiCkEBdiIAQQFqIScCfyAFRCcxCKwcWvw/oiIGmUQAAAAAAADgQWMEQCAGqgwBC0GAgICAeAshKCAKQX5xIQogAEECdCEIIABBA3QhACAnQXxxIRdBf3MhEQJ/IAVEO99PjZdu9j+iIgWZRAAAAAAAAOBBYwRAIAWqDAELQYCAgIB4CyEYIApBAmohKSAIQQRqIRwgAEEIaiEbIBdBAnQhJCAXQQN0IRIgF0EBdCEQIBH9ESE8IBP9ESFAICJBB0khLSAPIQogFiEAIAwhCANAICwEQCAKIA4oAgAiASAYaiINIBEgDSARSBtBACANQQBOGzYCACAAIAEgJmsiDSARIA0gEUgbQQAgDUEAThs2AgAgCCABIChqIgEgESABIBFIG0EAIAFBAE4bNgIAIAhBBGohCCAKQQRqIQogDkEEaiEOIABBBGohAAsCfwJ/ICJFBEAgCyEJIAghASAKIQ1BAAwBC0EAIRkCQAJAIC0NACA
12824KIAAgG2oiAUkgACAKIBtqIg1JcQ0AIAggDUkgCiAIIBtqIglJcQ0AIAogDiAbaiIVSSANIA5LcQ0AIAsgDUkgCiALIBxqIh9JcQ0AIAIgDUkgCiACIBxqIg1JcQ0AIAAgCUkgASAIS3ENACAAIBVJIAEgDktxDQAgACAfSSABIAtLcQ0AIAAgDUkgASACS3ENACAIIBVJIAkgDktxDQAgCCAfSSAJIAtLcQ0AIAIgCUkgCCANSXENACALICRqIQkgCCASaiEBIAogEmohDQNAIA4gGUEDdCIVQRhyIh9qIiogDiAVQRByIh1qIi4gDiAVQQhyIh5qIi8gDiAVaiIw/VwCAP1WAgAB/VYCAAL9VgIAAyE6An8gAiAZQQJ0Iitq/QACACBA/bEB/foBIjv9XyI9/Qw730+Nl272PzvfT42XbvY//fIBIj79IQEiBZlEAAAAAAAA4EFjBEAgBaoMAQtBgICAgHgLITEgCyArav0AAgAhPyAKIBVqIiv9DAAAAAAAAAAAAAAAAAAAAAAgOgJ/ID79IQAiBZlEAAAAAAAA4EFjBEAgBaoMAQtBgICAgHgL/REgMf0cAQJ/IDsgO/0NCAkKCwwNDg8AAQIDAAECA/1fIj79DDvfT42XbvY/O99PjZdu9j/98gEiO/0hACIFmUQAAAAAAADgQWMEQCAFqgwBC0GAgICAeAv9HAICfyA7/SEBIgWZRAAAAAAAAOBBYwRAIAWqDAELQYCAgIB4C/0cAyJB/a4BIjsgPP22ASA7/QwAAAAAAAAAAAAAAAAAAAAA/Tn9UiI7/VoCAAAgCiAeaiIxIDv9WgIAASAKIB1qIjMgO/1aAgACIAogH2oiNCA7/VoCAAMCfyA/IED9sQH9+gEiO/1fIj/9DGq8dJMYBNY/arx0kxgE1j/98gEgPf0MDAIrhxbZ5j8MAiuHFtnmP/3yAf3wASI9/SEBIgWZRAAAAAAAAOBBYwRAIAWqDAELQYCAgIB4CyEyIAAgFWoiNf0MAAAAAAAAAAAAAAAAAAAAACA6An8gPf0hACIFmUQAAAAAAADgQWMEQCAFqgwBC0GAgICAeAv9ESAy/RwBAn8gO/0MAAAAAAAAAAAAAAAAAAAAAP0NCAkKCwwNDg8AAQIDAAECA/1fIj39DGq8dJMYBNY/arx0kxgE1j/98gEgPv0MDAIrhxbZ5j8MAiuHFtnmP/3yAf3wASI7/SEAIgWZRAAAAAAAAOBBYwRAIAWqDAELQYCAgIB4C/0cAgJ/IDv9IQEiBZlEAAAAAAAA4EFjBEAgBaoMAQtBgICAgHgL/RwDIj79sQEiOyA8/bYBIDv9DAAAAAAAAAAAAAAAAAAAAAD9Of1SIjv9WgIAACAAIB5qIjIgO/1aAgABIAAgHWoiNiA7/VoCAAIgACAfaiI3IDv9WgIAAwJ/ID/9DCcxCKwcWvw/JzEIrBxa/D/98gEiO/0hASIFmUQAAAAAAADgQWMEQCAFqgwBC0GAgICAeAshOCAIIBVqIhX9DAAAAAAAAAAAAAAAAAAAAAAgOgJ/IDv9IQAiBZlEAAAAAAAA4EFjBEAgBaoMAQtBgICAgHgL/REgOP0cAQJ/ID39DCcxCKwcWvw/JzEIrBxa/D/98gEiOv0hACIFmUQAAAAAAADgQWMEQCAFqgwBC0GAgICAeAv9HAICfyA6/SEBIgWZRAAAAAAAAOBBYwRAIAWqDAELQYCAgIB4C/0cAyI9/a4BIjogPP22ASA6/QwAAAAAAAAAAAAAAAAAAAAA/Tn9UiI6/VoCAAAgCCAeaiIeIDr9WgIAASAIIB1qIh0gOv1aAgACIAggH2oiHyA6/VoCAAMgK/0MAAAAAAAAAAAAAAAAAAAAACAqQQRqIC5BBGogL0EEaiAw/VwCBP1WAgAB/VYCAAL9VgIAAyI7IEH9rgEiOiA8/bYBIDr9DAAAAAAAAAAAAAAAAAAAAAD9Of1SIjr9WgIEACAxIDr9WgIEASAzIDr9WgIEAiA0IDr9WgIEAyA1/QwAAAAAAAAAAAAAAAAAAAAAIDsgPv2xASI6IDz9tgEgOv0MAAAAAAAAAAAAAAAAAAAAAP05/VIiOv1aAgQAIDIgOv1aAgQBIDYgOv1aAgQCIDcgOv1aAgQDIBX9DAAAAAAAAAAAAAAAAAAAAAAgOyA9/a4BIjogPP22ASA6/QwAAAAAAAAAAAAAAAAAAAAA/Tn9UiI6/VoCBAAgHiA6/VoCBAEgHSA6/VoCBAIgHyA6/VoCBAMgGUEEaiIZIBdHDQALIAIgJGohAiAOIBJqIQ4gACASaiEAIBAhGSApIBcgJ0YNAhoMAQsgCiENIAghASALIQkLA0AgCSgCACELIA0CfyACKAIAIBNrsrsiBUQ730+Nl272P6IiBplEAAAAAAAA4EFjBEAgBqoMAQtBgICAgHgLIA4oAgAiCmoiCCARIAggEUgbQQAgCEEAThs2AgAgACAKAn8gCyATa7K7IgZEarx0kxgE1j+iIAVEDAIrhxbZ5j+ioCIFmUQAAAAAAADgQWMEQCAFqgwBC0GAgICAeAtrIgggESAIIBFIG0EAIAhBAE4bNgIAIAECfyAGRCcxCKwcWvw/oiIFmUQAAAAAAADgQWMEQCAFqgwBC0GAgICAeAsgCmoiCiARIAogEUgbQQAgCkEAThs2AgAgCSgCACELIA0CfyACKAIAIBNrsrsiBUQ730+Nl272P6IiBplEAAAAAAAA4EFjBEAgBqoMAQtBgICAgHgLIA4oAgQiCmoiCCARIAggEUgbQQAgCEEAThs2AgQgACAKAn8gCyATa7K7IgZEarx0kxgE1j+iIAVEDAIrhxbZ5j+ioCIFmUQAAAAAAADgQWMEQCAFqgwBC0GAgICAeAtrIgggESAIIBFIG0EAIAhBAE4bNgIEIAECfyAGRCcxCKwcWvw/oiIFmUQAAAAAAADgQWMEQCAFqgwBC0GAgICAeAsgCmoiCiARIAogEUgbQQAgCkEAThs2AgQgAkEEaiECIAlBBGohCSABQQhqIQEgAEEIaiEAIA1BCGohDSAOQQhqIQ4gGUECaiIZICJJDQALICkLIgggJU8EQCABIQggDSEKIAkMAQsgDigCACEKAn8gICAIQQF2IhlGBEAgCiAmayIIIBEgCCARSBtBACAIQQBOGyELIAogGGoiCCARIAggEUgbQQAgCEEAThshCCAoDAELIAoCfyAJKAIAIBNrsrsiBURqvHSTGATWP6IgAigCACATa7K7IgZEDAIrhxbZ5j+ioCIHmUQAAAAAAADgQWMEQCAHqgwBC0GAgICAeAtrIgggEUghCyAIIBEgCxtBACAIQQBOGyELAn8gBkQ730+Nl272P6IiBplEAAAAAAAA4EFjBEAgBqoMAQtBgICAgHgLIApqIgggESAIIBFIG0EAIAhBAE4bIQgCfyAFRCcxCKwcWvw/oiIFmUQAAAAAAADgQWMEQCAFqgwBC0GAgICAeAsLIRUgDSAINgIAIAAgCzYCACABIAogFWoiCiARIAogEUgbQQAgCkEAThs2AgAgAUEEaiEIIABBBGohACANQQRqIQogDkEEaiEOIAkgGSAgTw0AGiACQQRqIQIgCUEEagshCyA5QQFqIjkgI0cNAAsLIBQoAhgoAiwQFCAUKAIYIgAgDzYCLCAAKAJgEBQgFCgCGCIAIBY2AmAgACgClAEQFCAUKAIYIgAgDDYClAEgACAA/QACACI8/QsCaCAAIDz9CwI0IBRBATYCFEEAIRkMBgsgASgCaEEBRw0AIAEoAgRBAUcNACABKAI4QQFHDQAgASgCbEEBRw0AIAEoAhghAiABKAKUASEJIAEoAmAhDiABKAIsIQAgASgCDCABKAIIbCIMQQJ0IgEQHCEIIAEQHCEPIAEQHCELAkAgCEUNACAPRQ0AIAtFDQAgDEUNBEF/IAJ0QX9zIRlBASACQQFrdCETIAxBCEkNAiAPIAhrQRBJDQIgCyAIa0EQSQ0CIAggAGtBEEkNAiAIIA5rQRBJDQIgCCAJa0EQSQ0CIAsgD2tBEEkNAiAPIABrQRBJDQIgDyAOa0EQSQ0CIA8gCWtBEEkNAiALIABrQRBJDQIgCyAOa0EQSQ0CIAsgCWtBEEkNAiAJIAxBfHEiCkECdCIQaiENIAsgEGohASAIIBBqIQIgGf0RITwgE/0RIToDQAJ/IAkgFkECdCIRav0AAgAgOv2xAf36ASI7/V8iPf0MO99PjZdu9j8730+Nl272P/3yASI+/SEBIgWZRAAAAAAAAOBBYwRAIAWqDAELQYCAgIB4CyEVIA4gEWr9AAIAIT8gCCARav0MAAAAAAAAAAAAAAAAAAAAACAAIBFq/QACACJAAn8gPv0hACIFmUQAAAAAAADgQWMEQCAFqgwBC0GAgICAeAv9ESAV/RwBAn8gOyA7/Q0ICQoLDA0ODwABAgMAAQID/V8iO/0MO99PjZdu9j8730+Nl272P/3yASI+/SEAIgWZRAAAAAAAAOBBYwRAIAWqDAELQYCAgIB4C/0cAgJ/ID79IQEiBZlEAAAAAAAA4EFjBEAgBaoMAQtBgICAgHgL/RwD/a4BIj4gPP22ASA+/QwAAAAAAAAAAAAAAAAAAAAA/Tn9Uv0LAgACfyA/IDr9sQH9+gEiPv1fIj/9DGq8dJMYBNY/arx0kxgE1j/98gEgPf0MDAIrhxbZ5j8MAiuHFtnmP/3yAf3wASI9/SEBIgWZRAAAAAAAAOBBYwRAIAWqDAELQYCAgIB4CyEVIA8gEWr9DAAAAAAAAAAAAAAAAAAAAAAgQAJ/ID39IQAiBZlEAAAAAAAA4EFjBEAgBaoMAQtBgICAgHgL/REgFf0cAQJ/ID79DAAAAAAAAAAAAAAAAAAAAAD9DQgJCgsMDQ4PAAECAwABAgP9XyI9/QxqvHSTGATWP2q8dJMYBNY//fIBIDv9DAwCK4cW2eY/DAIrhxbZ5j/98gH98AEiO/0hACIFmUQAAAAAAADgQWMEQCAFqgwBC0GAgICAeAv9HAICfyA7/SEBIgWZRAAAAAAAAOBBYwRAIAWqDAELQYCAgIB4C/0cA/2xASI7IDz9tgEgO/0MAAAAAAAAAAAAAAAAAAAAAP05/VL9CwIAAn8gP/0MJzEIrBxa/D8nMQisHFr8P/3yASI7/SEBIgWZRAAAAAAAAOBBYwRAIAWqDAELQYCAgIB4CyEVIAsgEWr9DAAAAAAAAAAAAAAAAAAAAAAgQAJ/IDv9IQAiBZlEAAAAAAAA4EFjBEAgBaoMAQtBgICAgHgL/REgFf0cAQJ/ID39DCcxCKwcWvw/JzEIrBxa/D/98gEiO/0hACIFmUQAAAAAAADgQWMEQCAFqgwBC0GAgICAeAv9HAICfyA7/SEBIgWZRAAAAAAAAOBBYwRAIAWqDAELQYCAgIB4C/0cA/2uASI7IDz9tgEgO/0MAAAAAAAAAAAAAAAAAAAAAP05/VL9CwIAIBZBBGoiFiAKRw0ACyAKIAxGDQQgDiAQaiEOIAAgEGohACAPIBBqDAMLIAgQFCAPEBQgCxAUDAULIBpBzwM2AgQgGkG4CjYCAEGwywFBo8AAIBoQGgwECyAIIQIgCyEBIAkhDSAPCyEJA0AgDigCACERIAICfyANKAIAIBNrsrsiBUQ730+Nl272P6IiBplEAAAAAAAA4EFjBEAgBqoMAQtBgICAgHgLIAAoAgAiFmoiECAZIBAgGUgbQQAgEEEAThs2AgAgCSAWAn8gESATa7K7IgZEarx0kxgE1j+iIAVEDAIrhxbZ5j+ioCIFmUQAAAAAAADgQWMEQCAFqgwBC0GAgICAeAtrIhAgGSAQIBlIG0EAIBBBAE4bNgIAIAECfyAGRCcxCKwcWvw/oiIFmUQAAAAAAADgQWMEQCAFqgwBC0GAgICAeAsgFmoiFiAZIBYgGUgbQQAgFkEAThs2AgAgAUEEaiEBIAlBBGohCSACQQRqIQIgDUEEaiENIA5BBGohDiAAQQRqIQAgCkEBaiIKIAxHDQALCyAUKAIYKAIsEBQgFCgCGCIAIAg2AiwgA
12824CgCYBAUIBQoAhgiACAPNgJgIAAoApQBEBQgFCgCGCALNgKUASAUQQE2AhRBACEZDAELIA8QFCAWEBQgDBAUCyAaKAIgIQACQCADDQAgIUUNACAAKAIYIRRBACEWA0AgFCAWQTRsaiIDKAIYIgJBCEcEQAJAIAJBB00EQCADKAIMIAMoAghsIQEgAygCLCEIIAMoAiAEQCABRQ0CQQEgAkEBa3StIUJBACEKIAFBBE8EQCABQXxxIQogQv0SITxBACEOA0AgCCAOQQJ0aiICIAL9AAIAIjr9xwFBB/3LASI7/R0AIDz9HQAiQ3/9EiA7/R0BIDz9HQEiRH/9HgEgOiA8/Q0ICQoLDA0ODwABAgMAAQID/ccBQQf9ywEiOv0dACBDf/0SIDr9HQEgRH/9HgH9DQABAgMICQoLEBESExgZGhv9CwIAIA5BBGoiDiAKRw0ACyABIApGDQMLA0AgCCAKQQJ0aiICIAI0AgBCB4YgQn8+AgAgCkEBaiIKIAFHDQALDAILIAFFDQFBfyACdEF/c60hQkEAIQogAUEETwRAIAFBfHEhCiBC/RIhPEEAIQ4DQCAIIA5BAnRqIgIgAv0AAgAiOv3JAf0M/wAAAAAAAAD/AAAAAAAAAP3VASI7/R0AIDz9HQAiQ4D9EiA7/R0BIDz9HQEiRID9HgEgOiA8/Q0ICQoLDA0ODwABAgMAAQID/ckB/Qz/AAAAAAAAAP8AAAAAAAAA/dUBIjr9HQAgQ4D9EiA6/R0BIESA/R4B/Q0AAQIDCAkKCxAREhMYGRob/QsCACAOQQRqIg4gCkcNAAsgASAKRg0CCwNAIAggCkECdGoiAiACNQIAQv8BfiBCgD4CACAKQQFqIgogAUcNAAsMAQsgAkEIayEIIAMoAgwgAygCCGwhASADKAIsIQ0gAygCIARAIAFFDQFBACEKIAFBBE8EQCABQXxxIQpBACECA0AgDSACQQJ0aiIJIAn9AAIAIAj9rAH9CwIAIAJBBGoiAiAKRw0ACyABIApGDQILA0AgDSAKQQJ0aiICIAIoAgAgCHU2AgAgCkEBaiIKIAFHDQALDAELIAFFDQBBACEKIAFBBE8EQCABQXxxIQpBACECA0AgDSACQQJ0aiIJIAn9AAIAIAj9rQH9CwIAIAJBBGoiAiAKRw0ACyABIApGDQELA0AgDSAKQQJ0aiICIAIoAgAgCHY2AgAgCkEBaiIKIAFHDQALCyADQQg2AhgLIBZBAWoiFiAhRw0ACwsgACgCDCAAKAIIbCEBAkAgGUUEQCAAKAIUQQJGBEAgACgCEEEBRgRAIAAoAhgoAiwgARASDAMLIARFDQIgACgCGCIAKAIsIAAoAmAgARAIDAILIAAoAhgiACgCLCAAKAJgIAAoApQBIAEQBwwBCwJAAkACQCAhQQFrDgQAAwECAwsgACgCGCgCLCABEAYMAgsgACgCGCIAKAIsIAAoAmAgACgClAEgARAFDAELIAAoAhgiACgCLCAAKAJgIAAoApQBIAAoAsgBIAEQBAsgGigCIBAlQQAhDgsgGkHgwABqJAAgDgsIAEEIIAAQKQurAgICfgJ/Qn8hAyAALQBEQQhxRQRAIAAgACgCICIGNgIkAkACQAJAIAAgACgCMCIFBH8DQCAGIAUgACgCACAAKAIUEQAAIgVBf0YNAiAAIAAoAiQgBWoiBjYCJCAAIAAoAjAgBWsiBTYCMCAFDQALIAAoAiAFIAYLNgIkIAFCAFUNAUIAIQMMAgsgACAAKAJEQQhyNgJEIAJBBEHP+QBBABATIABBADYCMCAAIAAoAkRBCHI2AkRCfw8LQgAhAwNAIAEgACgCACAAKAIYEQ0AIgRCf1EEQCACQQRBwPkAQQAQEyAAIAAoAkRBCHI2AkQgACAAKQM4IAN8NwM4Qn8gAyADUBsPCyADIAR8IQMgASAEfSIBQgBVDQALCyAAIAApAzggA3w3AzgLIAMLIwEBfyABIAEoAgAgASgCCCIBIACnIgIgASACSRtqNgIEQQELPAICfwF+IAEoAgAgASgCCGoiAyABKAIEIgJGBEBCfw8LIAEgAiAAp2o2AgQgACADIAJrrCIEIAAgBFMbC5sBAQV/QQEgAigCCCIHIAdBAU0bIQQgAigCBCIDIAIoAgBrIQYDQCAEIgVBAXQhBCAFIAZrIAFJDQALIAUgB0cEQCAFEBgiA0UEQEF/DwsgAigCACIEBEAgAyAEIAYQFhogAigCABAUCyACIAU2AgggAiADNgIAIAIgAyAGaiIDNgIECyADIAAgARAWGiACIAIoAgQgAWo2AgQgAQuOAwICfgJ/IAAoAjAiBSABpyIGTwRAIAAgBSAGazYCMCAAIAAoAiQgBmo2AiQgACAAKQM4IAF8NwM4IAEPCyAALQBEQQRxBEAgAEEANgIwIAAgACgCJCAFajYCJCAAIAWtIgEgACkDOHw3AzggAUJ/IAUbDwsCQCAFRQRADAELIABBADYCMCAAIAAoAiA2AiQgASAFrSIDfSEBCyABQgBVBEADQCAAKQMIIAApAzggASADfHxUBEAgAkEEQen5AEEAEBMgAEEANgIwIAAgACgCIDYCJCAAIAApAzggA3wiAzcDOCAAKQMIIgEgA30hBCABIAAoAgAgACgCHBELACAAKAJEIQUEQCAAIAE3AzgLIAAgBUEEcjYCREJ/IAQgASADURsPCyABIAAoAgAgACgCGBENACIEQn9RBEAgAkEEQen5AEEAEBMgACAAKAJEQQRyNgJEIAAgACkDOCADfDcDOEJ/IAMgA1AbDwsgAyAEfCEDIAEgBH0iAUIAVQ0ACwsgACAAKQM4IAN8NwM4IAMLRgECfyACKAIAIAIoAghqIgQgAigCBCIDRgRAQX8PCyAAIAMgBCADayIAIAEgACABSRsiABAWGiACIAIoAgQgAGo2AgQgAAuqAgEEfyMAQRBrIgQkAAJAIAAoAnQNACACQQFNBEAgA0EBQY3FAEEAEBMMAQsgASAEQQxqQQIQFSAEKAIMIgZB//8DcSIHRQRAIANBAUGuxQBBABATDAELIAdBBmxBAmogAksEQCADQQFBjcUAQQAQEwwBCyAGQQZsEBgiA0UNACAAQQgQGCICNgJ0IAJFBEAgAxAUDAELIAIgAzYCACACIAQvAQwiAjsBBCACRQRAQQEhBQwBC0EAIQIDQCABQQJqIARBDGoiBUECEBUgAyACQQZsaiIGIAQoAgw7AQAgAUEEaiAFQQIQFSAGIAQoAgw7AQIgAUEGaiIBIAVBAhAVIAYgBCgCDDsBBEEBIQUgAkEBaiICIAAoAnQvAQRJDQALCyAEQRBqJAAgBQvsAQEEfyMAQRBrIgUkAAJ/IAAoAngiBEUEQCADQQFB38QAQQAQE0EADAELIAQoAgwEQCADQQFBqdoAQQAQE0EADAELIAIgBC0AEiICQQJ0IgRJBEAgA0EBQb7EAEEAEBNBAAwBC0EAIAQQGCIERQ0AGiACBEBBACEDA0AgASAFQQxqIgZBAhAVIAQgA0ECdGoiByAFKAIMOwEAIAFBAmogBkEBEBUgByAFKAIMOgACIAFBA2ogBkEBEBUgByAFKAIMOgADIAFBBGohASADQQFqIgMgAkcNAAsLIAAoAnggBDYCDEEBCyAFQRBqJAAL8AMBCX8jAEEQayIFJAACQCACQQNJDQAgACgCeA0AIAEgBUEMakECEBUgBS8BDCIJQYEIa0H/d00EQCAFIAk2AgAgA0EBQaEbIAUQEwwBCyABQQJqIAVBDGpBARAVIAUvAQwiCEUEQCADQQFBwRhBABATDAELIAIgCEEDakkNACAIIAlsQQJ0EBgiB0UNACAIEBgiCkUEQCAHEBQMAQsgCBAYIgtFBEAgBxAUIAoQFAwBC0EUEBgiBkUEQCAHEBQgChAUIAsQFAwBCyABQQNqIQMgBiAKNgIIIAYgCzYCBCAGIAk7ARAgBiAHNgIAIAUoAgwhDCAGQQA2AgwgBiAMOgASIAAgBjYCeANAIAMgBUEMakEBEBUgBCAKaiAFLQAMQf8AcUEBajoAACAEIAtqIAUoAgxBgAFxQQd2OgAAIANBAWohAyAEQQFqIgQgCEcNAAsgCUUEQEEBIQQMAQtBACEGA0BBACEEQQAhAANAQQQgBCAKai0AAEEHakEDdiIEIARBBE8bIgQgAyABa2ogAkoEQEEAIQQMAwsgAyAFQQxqIAQQFSAHIAUoAgw2AgAgB0EEaiEHIAMgBGohAyAAQQFqIgBB//8DcSIEIAhJDQALQQEhBCAGQQFqIgZB//8DcSAJSQ0ACwsgBUEQaiQAIAQLmAEBAn8jAEEQayIFJAAgACgCGCIEQf8BRwRAIAUgBDYCACADQQJB0RQgBRATCwJAAkAgACgCFCACRgRAIAINAUEBIQQMAgtBACEEIANBAUGJ8QBBABATDAELQQAhAgNAQQEhBCABIAAoAkggAkEMbGpBCGpBARAVIAFBAWo
12824hASACQQFqIgIgACgCFEkNAAsLIAVBEGokACAEC44GAQZ/IwBB0ABrIgQkAAJAIAJBAk0EQCADQQFB6fAAQQAQEwwBCyAALQB8BEAgA0EEQZTXAEEAEBNBASEGDAELQQEhBiABIABBKGpBARAVIAFBAWogAEE0akEBEBUgAUECaiAAQSxqQQEQFSABQQNqIQUCQAJAAkACQAJAIAAoAigiB0EBaw4CAAECCyACQQZNBEAgBCACNgIQIANBAUGO9gAgBEEQahATQQAhBgwFCwJAIAJBB0YNACAAKAIwQQ5GDQAgBCACNgIwIANBAkGO9gAgBEEwahATCyAFIABBMGpBBBAVIAAoAjBBDkcNA0EkEBgiBUUEQEEAIQYgA0EBQZQ+QQAQEwwFCyAFQQ42AgAgBEEANgJAIARBADYCOCAEQQA2AkggBEEANgI8IARBADYCRCAEQQA2AkxBsOqQAiEGIARBsOqQAjYCNCAFQYCMlaIENgIEAn8gAkEHRwRAIAJBI0YEQCABQQdqIARBzABqQQQQFSABQQtqIARByABqQQQQFSABQQ9qIARBxABqQQQQFSABQRNqIARBQGtBBBAVIAFBF2ogBEE8akEEEBUgAUEbaiAEQThqQQQQFSABQR9qIARBNGpBBBAVIAVBADYCBCAEKAI0IQYgBCgCOCECIAQoAkAhAyAEKAI8IQcgBCgCRCEIIAQoAkwhCSAEKAJIDAILIAQgAjYCICADQQJBsvYAIARBIGoQEwtBACECQQAhA0EAIQdBAAshASAFIAc2AhggBSAINgIQIAUgCTYCCCAFIAY2AiAgBSACNgIcIAUgAzYCFCAFIAE2AgwgAEEANgJwIAAgBTYCbAwDCyAAIAJBA2siATYCcCAAQQEgARAXIgM2AmwgA0UNASACQQNMDQJBACECA0AgBSAEQcwAakEBEBUgACgCbCACaiAEKAJMOgAAIAVBAWohBSACQQFqIgIgAUcNAAsMAgsgB0EDSQ0CIAQgBzYCACADQQRBqfwAIAQQEwwCC0EAIQYgAEEANgJwDAELQQEhBiAAQQE6AHwLIARB0ABqJAAgBgu0AwEDfyMAQSBrIgQkAAJAIAAoAkgEQCADQQJBwjZBABATQQEhAgwBCyACQQ5HBEBBACECIANBAUHI8ABBABATDAELIAEgAEEQakEEEBUgAUEEaiAAQQxqQQQQFSABQQhqIABBFGpBAhAVIAAoAgwhBQJAIAQCfyAAKAIQIgZFBEAgACgCFAwBCyAAKAIUIgIgBUUNABogAg0BQQALNgIIIAQgBjYCBCAEIAU2AgAgA0EBQazvACAEEBNBACECDAELIAJBgYABa0H//35NBEBBACECIANBAUHW7gBBABATDAELIAAgAkEMEBciAjYCSCACRQRAQQAhAiADQQFB++4AQQAQEwwBC0EBIQIgAUEKaiAAQRhqQQEQFSABQQtqIABBHGpBARAVIAAoAhwiBUEHRwRAIAQgBTYCECADQQRB6/4AIARBEGoQEwsgAUEMaiAAQSBqQQEQFSABQQ1qIABBJGpBARAVIAAoAgAiASABLQDUAUH7AXEgACgCGEH/AUZBAnRyOgDUASAAKAIAIgEgACgCDDYC8AEgASAAKAIQNgL0ASAAQQE6AIUBCyAEQSBqJAAgAgu3BAEFfyMAQRBrIgYkAAJ/IAAtAGRBAnFFBEAgA0EBQbfYAEEAEBNBAAwBCyAAQQA2AmgCQAJAAkAgAgRAA0AgAkEHTQRAIANBAUGmGkEAEBMMBQsgASAGQQxqIgVBBBAVIAYoAgwhBCABQQRqIAVBBBAVQQghByAGKAIMIQUCQAJAAkACQCAEDgIBAAMLIAJBEEkEQEHOGiEEDAcLIAFBCGogBkEIakEEEBUgBigCCARAQdzBACEEDAcLIAFBDGogBkEMakEEEBUgBigCDCIEDQFBnxkhBAwGCyADQQFBnxlBABATDAYLQRAhBwsgBCAHSQRAIANBAUGXxwBBABATDAULIAIgBEkEQCADQQFBz8YAQQAQE0EADAYLAkACQCAAIAEgB2ogBCAHayADAn8CQAJAAkAgBUHx2L2bBkwEQCAFQePGwZMGRg0BIAVB5sqRmwZGDQMgBUHwwrWbBkcNBUGgxQEMBAsgBUHy2I2DB0YNAUGAxQEgBUHyyKHLBkYNAxogBUHy2L2bBkcNBEGIxQEMAwtBkMUBDAILQZjFAQwBC0GoxQELKAIEEQEADQFBAAwHCyAAIAAoAmhB/////wdyNgJoC0EBIAggBUHyyKHLBkYbIQggASAEaiEBIAIgBGsiAg0ACyAIDQELIANBAUHrxQBBABATQQAMAwsgAEEBOgCEASAAIAAoAmRBBHI2AmRBAQwCCyADQQEgBEEAEBMLIANBAUGLD0EAEBNBAAsgBkEQaiQAC+IBAQF/IAAoAmRBAUcEQCADQQFB5NgAQQAQE0EADwsCQCACQQdNBEAMAQsgASAAQThqQQQQFSABQQRqIABBPGpBBBAVIAJBA3EEQAwBCyAAIAJBCGsiAkECdiIENgJAAkAgAkUNACAAIARBBBAXIgI2AkQgAkUEQCADQQFBlhFBABATQQAPCyAAKAJARQ0AIAFBCGohA0EAIQIDQCADIAAoAkQgAkECdGpBBBAVIANBBGohAyACQQFqIgIgACgCQEkNAAsLIAAgACgCZEECcjYCZEEBDwsgA0EBQZ4uQQAQE0EAC34BAX8jAEEQayIEJAACfyAAKAJkBEAgA0EBQYHYAEEAEBNBAAwBCyACQQRHBEAgA0EBQcIuQQAQE0EADAELIAEgBEEMakEEEBUgBCgCDEGKjqroAEcEQCADQQFB6iZBABATQQAMAQsgACAAKAJkQQFyNgJkQQELIARBEGokAAvEAQECfyAAIAAoAiAiBDYCJAJAIAAoAjAiAwRAA0AgBCADIAAoAgAgACgCFBEAACIDQX9GDQIgACAAKAIkIANqIgQ2AiQgACAAKAIwIANrIgM2AjAgAw0ACyAAKAIgIQQLIABBADYCMCAAIAQ2AiQgASAAKAIAIAAoAhwRCwBFBEAgACAAKAJEQQhyNgJEQQAPCyAAIAE3AzhBAQ8LIAAgACgCREEIcjYCRCACQQRBz/kAQQAQEyAAIAAoAkRBCHI2AkRBAAsNACAAKAIAIAEgAhBOCwkAIAAoAgAQUwsJACAAKAIAEFILDQAgACgCACABIAIQVQtBAQF/IAIEfyADQQJBy88AQQAQEyAAKAIAIAEgAiADIAQQT0UEQCADQQFBnTBBABATQQAPCyAAIAIgAxB+BUEACwsVACAAKAIAIAEgAiADIAQgBSAGEFcLDwAgACgCACABIAIgAxBYCxMAIAAoAgAgASACIAMgBCAFEDELHQAgACgCACABIAIgAyAEIAUgBiAHIAggCSAKECwL5QQBBn8gASgCCEE2IAMQKEUEQEEADwsgASgCBCIIKAIAIQcgCCgCCCEGAkAgBwRAQQEhBSAHQQFxIQkgB0EBRgR/QQAFIAdBfnEhBwNAAn9BACAFRQ0AGkEAIAEgACADIAYoAgARAABFDQAaIAEgACADIAYoAgQRAABBAEcLIQUgBkEIaiEGIARBAmoiBCAHRw0ACyAFRQshBEEAIAUgCRshBQJAIAlFDQAgBA0AIAEgACADIAYoAgARAABBAEchBQsgCEEANgIAIAUNAUEADwsgCEEANgIACyABKAIIIgcoAgAhBCAHKAIIIQYCQCAEBEBBASEFIARBAXEhCCAEQQFGBH9BAAUgBEF+cSEJQQAhBANAAn9BACAFRQ0AGkEAIAEgACADIAYoAgARAABFDQAaIAEgACADIAYoAgQRAABBAEcLIQUgBkEIaiEGIARBAmoiBCAJRw0ACyAFRQshBEEAIAUgCBshBQJAIAhFDQAgBA0AIAEgACADIAYoAgARAABBAEchBQsgB0EANgIAIAUNAUEADwsgB0EANgIACyABLQCEAUUEQCADQQFBi9sAQQAQE0EADwsgAS0AhQFFBEAgA0EBQe7aAEEAEBNBAA8LIAAgASgCACACIAMQWQJAIAJFDQAgAigCACIARQ0AQQEhBAJAAkACQAJAAkACQCABKAIwQQxrDg0DBAQEBQABBAQEBAQCBAtBAiEEDAQLQQMhBAwDC0EEIQQMAgtBBSEEDAELQX8hBAsgACAENgIUIAEoAmwiBUUNACAAIAU2AhwgAigCACABKAJwNgIgIAFBADYCbAsL4gkCCX8BfiMAQfAAayIDJABBgAghCAJ/AkBBAUGACBAXIgYEQCADQdwAaiELIANB7ABqIQkDQAJAAkACQCABIANB6ABqIgRBCCACEB1BCEcNACAEIANB2ABqQQQQFSAJIAtBBBAVQQghBQJAAkACQAJAAkAgAygCWA4CAAEECyABKQMIIgxQBH5CAAUgDCABKQM4fQsiDEL4////D1MNASACQQFB3MEAQQAQEwwECyABIANB6ABqIgRBCCACEB1BCEcNAyAEIANB5ABqQQQQFSADKAJkRQ0BIAJBAUHcwQBBABATDAMLIAMgDKdBCGo2AlgMAQsgCSADQdgAakEEEBVBECEFCyADKAJcIgRB4+TA0wZGBEAgACgCZCIBQQRxBEAgACABQQhyNgJkDAILIAJBAUGhLEEAEBMgBhAUQQAMBwsgAygCWCIHRQRAIAJBAUGfGUEAEBMgBhAUQQAMBwsgBSAHSwRAIAMgBDYCBCADIAc2AgAgAkEBQcjsACADEBMMBgsCQAJ/An8CQAJ/AkACQAJAAkACQCAEQfHYvZsGTARAIARB48bBkwZGDQIgBEHmypGbBkYNBCAEQfDCtZsGRw0BQaDFAQwGCyAEQZ/AwNIGTARAIARB8ti9mwZGDQVBgMUBIARB8sihywZGDQYaIARB8PLRswZHDQFB6MQBDAgLIARB8tiNgwdGDQIgBEGgwMDSBkYNBkHwxAEgBEHo5MDTBkYNBxoLIAAoAmQiBEEBcQ0IIAJBAUHpD0EAEBMgBhAUQQAMDwtBkMUBDAMLQZjFAQwCC0GoxQEMAQtBiMUBCyEKIAMgBEH/AXE2AkwgAyAEQRh2NgJAIAMgBEEIdkH/AXE2AkggAyAEQRB2Qf8BcTYCRCACQQJBtg8gA0FAaxATIAcgBWsiBSAALQBkQQRxDQIaIAMgAygCXCIEQRh2NgIwIAMgBEH/AXE2AjwgAyAEQRB2Qf8BcTYCNCADIARBCHZB/wFxNgI4IAJBAkHONCADQTBqEBMgACAAKAJkQf////8HcjYCZCABIAWtIgwgAiABKAIoEQgAIAxRDQcgAkEBQf8cQQAQEyAGEBRBAAwKC0HgxAELIQogByAFawshBSABKQMIIgxQBH5CAAUgDCABKQM4fQsgBa1TBEAgAygCWCEEIAMoAlwhACADIAEpAwgiDFAEfkIABSAMIAEpAzh9Cz4CKCADIAU2AiQgAyAAQf8BcTYCICADIABBGHY2AhQgAyAENgIQIAMgAEEIdkH/AXE2AhwgAyAAQRB2Qf8BcTYCGCACQQFBm/oAIANBEGoQEwwHCyAFIAhNBEAgBiEEDAQLIAUhCCAGIAUQGyIEDQMgBhAUIAJBAUHsEEEAEBNBAAwHCyAEQQJxRQRAIAJBAUGvEEEAEBMgBhAUQQAMBwsgACAEQf////8HcjYCZCABIAcgBWutIgwgAiABKAIoEQgAIAxRDQMgAC0AZEEIcUUNASACQQJB/xxBABATCyAGEBRBAQwFCyACQQFB/xxBABATIAYQFEEADAQLIAEgBCAFIAIQHSAFRwRAIAJBAUGxHUEAEBMgBBAUQQAMBAsgACAEIgYgBSACIAooAgQRAQANAAsgBBAUQQAMAgsgAkEBQZYmQQAQE0EADAELIAYQFEEACyADQfAAaiQAC+ABAQZ/IAAoAghBNiACEChF
12824BEBBAA8LIAAoAggiBigCACEDIAYoAgghBQJAIAMEQEEBIQQgA0EBcSEHIANBAUYEf0EABSADQX5xIQMDQAJ/QQAgBEUNABpBACAAIAEgAiAFKAIAEQAARQ0AGiAAIAEgAiAFKAIEEQAAQQBHCyEEIAVBCGohBSAIQQJqIgggA0cNAAsgBEULIQNBACAEIAcbIQQCQCAHRQ0AIAMNACAAIAEgAiAFKAIAEQAAQQBHIQQLIAZBADYCACAEDQFBAA8LIAZBADYCAAsgACgCABpBAQsKACAAKAIAGkEACykAAkAgACgCACIARQ0AIAAgATYC0AEgAUUNACAAIAAtAFxBCHI6AFwLCyEAIAAoAgAgARBcIABBADoAfCAAIAEoArhAQQFxNgKAAQsyACACRQRAQQAPCyAAKAIAIAEgAiADEFFFBEAgA0EBQZ0wQQAQE0EADwsgACACIAMQfgtpAgJ/AXwjAEEQayIDJAAgAgRAA0AgACADQQhqEE0gAQJ/IAMrAwgiBZlEAAAAAAAA4EFjBEAgBaoMAQtBgICAgHgLNgIAIAFBBGohASAAQQhqIQAgBEEBaiIEIAJHDQALCyADQRBqJAALhAECAn8BfSMAQRBrIgMkACACBEADQCADIAAtAAA6AA8gAyAALQABOgAOIAMgAC0AAjoADSADIAAtAAM6AAwgAQJ/IAMqAgwiBYtDAAAAT10EQCAFqAwBC0GAgICAeAs2AgAgAUEEaiEBIABBBGohACAEQQFqIgQgAkcNAAsLIANBEGokAAtLAQJ/IwBBEGsiAyQAIAIEQANAIAAgA0EMakEEEBUgASADKAIMNgIAIAFBBGohASAAQQRqIQAgBEEBaiIEIAJHDQALCyADQRBqJAALSwECfyMAQRBrIgMkACACBEADQCAAIANBDGpBAhAVIAEgAygCDDYCACABQQRqIQEgAEECaiEAIARBAWoiBCACRw0ACwsgA0EQaiQAC0oBAn8jAEEQayIDJAAgAgRAA0AgACADQQhqEE0gASADKwMItjgCACABQQRqIQEgAEEIaiEAIARBAWoiBCACRw0ACwsgA0EQaiQAC2gBAn8jAEEQayIDJAAgAgRAA0AgAyAALQAAOgAPIAMgAC0AAToADiADIAAtAAI6AA0gAyAALQADOgAMIAEgAyoCDDgCACABQQRqIQEgAEEEaiEAIARBAWoiBCACRw0ACwsgA0EQaiQAC0wBAn8jAEEQayIDJAAgAgRAA0AgACADQQxqQQQQFSABIAMoAgyzOAIAIAFBBGohASAAQQRqIQAgBEEBaiIEIAJHDQALCyADQRBqJAALTAECfyMAQRBrIgMkACACBEADQCAAIANBDGpBAhAVIAEgAygCDLM4AgAgAUEEaiEBIABBAmohACAEQQFqIgQgAkcNAAsLIANBEGokAAuqCAINfwF7IwBBEGsiCCQAAn8gACgCCEEQRgRAIAAoArQBIAAoAuQBQYwsbGoMAQsgACgCDAshCQJAIAJFBEAgA0EBQf4gQQAQEwwBCyAAKAJgIQZBASEEIAEgCEEIakEBEBUgCCgCCCIFQQJPBEAgA0ECQZvMAEEAEBMMAQsgBUEBaiACRwRAQQAhBCADQQJB/iBBABATDAELAkAgBigCECIDRQ0AIAkoAtArIQQgA0EITwRAIANBeHEhBkEAIQIDQCAEQQA2ArxDIARBADYChDsgBEEANgLMMiAEQQA2ApQqIARBADYC3CEgBEEANgKkGSAEQQA2AuwQIARBADYCtAggBEHAwwBqIQQgAkEIaiICIAZHDQALCyADQQdxIgNFDQBBACECA0AgBEEANgK0CCAEQbgIaiEEIAJBAWoiAiADRw0ACwsgCSgC6CsiAgR/IAIQFCAJQQA2AugrIAgoAggFIAULRQRAQQEhBAwBCwNAIAFBAWoiASAIQQxqQQEQFQJAIAkoAoAsRQ0AIAkoAvwrIgMoAgAgCCgCDEcNACADKAIEIgUgACgCYCIGKAIQRw0AIAMoAggiAgRAQQAhBCACKAIQIAUgBWwiBSACKAIAQQJ0QZDCAWooAgBsRw0DIAkgBUECdBAYIgc2AugrIAdFDQMgAigCDCAHIAUgAigCAEECdEHAxAFqKAIAEQUACyADKAIMIgJFDQBBACEEIAIoAhAgBigCECIDIAIoAgBBAnRBkMIBaigCAGxHDQIgA0ECdBAYIgVFDQIgAigCDCAFIAMgAigCAEECdEHQxAFqKAIAEQUAAkAgBigCECIHRQ0AIAkoAtArIQRBACELAkACQCAHQQRJDQAgBEG0CGoiDCAFIAdBAnRqSQRAIAUgBCAHQbgIbGpJDQELIARB3CFqIQ0gBEGkGWohDiAEQewQaiEPIAUgB0F8cSIGQQJ0aiECIAQgBkG4CGxqIQRBACEDA0AgDCADQbgIbCIKaiAFIANBAnRq/QACACIR/VoCAAAgCiAPaiAR/VoCAAEgCiAOaiAR/VoCAAIgCiANaiAR/VoCAAMgA0EEaiIDIAZHDQALIAYgB0YNAgwBCyAFIQJBACEGCyAHIAYiA2tBB3EiCgRAA0AgBCACKAIANgK0CCADQQFqIQMgBEG4CGohBCACQQRqIQIgC0EBaiILIApHDQALCyAGIAdrQXhLDQADQCAEIAIoAgA2ArQIIAQgAigCBDYC7BAgBCACKAIINgKkGSAEIAIoAgw2AtwhIAQgAigCEDYClCogBCACKAIUNgLMMiAEIAIoAhg2AoQ7IAQgAigCHDYCvEMgBEHAwwBqIQQgAkEgaiECIANBCGoiAyAHRw0ACwsgBRAUC0EBIQQgEEEBaiIQIAgoAghJDQALCyAIQRBqJAAgBAsEAEJ/C7sJAQp/IwBBEGsiBSQAAn8gACgCCEEQRgRAIAAoArQBIAAoAuQBQYwsbGoMAQsgACgCDAshBwJ/IAJBAU0EQCADQQFBzCRBABATQQAMAQsgASAFQQxqQQIQFSAFKAIMBEAgA0ECQeQtQQAQE0EBDAELIAJBBk0EQCADQQFBzCRBABATQQAMAQsgAUECaiAFQQhqQQEQFSAHKAL8KyIJIQACQAJAAkAgBygCgCwiBkUNACAFKAIIIQgDQCAAKAIAIAhGDQEgAEEUaiEAIARBAWoiBCAGRw0ACwwBCyAEIAZHDQELIAcoAoQsIAZGBH8gByAGQQpqIgA2AoQsIAkgAEEUbBAbIgBFBEAgBygC/CsQFCAHQQA2AoQsIAdCADcC/CsgA0EBQeYkQQAQE0EADAMLIAcgADYC/CsgACAHKAKALCIEQRRsakEAIAcoAoQsIARrQRRsEBkaIAcoAvwrIQkgBygCgCwFIAYLQRRsIAlqIQBBASELCyAAIAUoAgg2AgAgAUEDaiAFQQxqQQIQFSAFKAIMBEAgA0ECQeQtQQAQE0EBDAELIAFBBWogBUEEakECEBUgBSgCBCIEQQJPBEAgA0ECQZUYQQAQE0EBDAELIAJBB2shBiAEBEAgAUEHaiECQQAhCQNAIAZBAk0EQCADQQFBzCRBABATQQAMAwsgAiAFQQxqQQEQFSAFKAIMQQFHBEAgA0ECQaYrQQAQE0EBDAMLIAJBAWogBUECEBUgACAFKAIAIgRB//8BcSIBNgIEIAZBA2siCCAEQQ92QQFqIgYgAWxBAmoiCkkEQCADQQFBzCRBABATQQAMAwsgAkEDaiECQQAhBCABBEADQCACIAVBDGogBhAVIAQgBSgCDEcEQCADQQJBzjBBABATQQEMBQsgAiAGaiECIARBAWoiBCAAKAIESQ0ACwsgAiAFQQIQFSAFIAUoAgAiBEH//wFxIgE2AgAgACgCBCABRwRAIANBAkHFGUEAEBNBAQwDCyAIIAprIgogBEEPdkEBaiIGIAFsQQNqIgxJBEAgA0EBQcwkQQAQE0EADAMLIAJBAmohAkEAIQQgAQRAA0AgAiAFQQxqIAYQFSAEIAUoAgxHBEAgA0ECQc4wQQAQE0EBDAULIAIgBmohAiAEQQFqIgQgACgCBEkNAAsLIAIgBUEMakEDEBUgBSgCDCEGIABCADcCCCAAIAZBgIAEcUUgAC0AEEH+AXFyOgAQIAUgBkH/AXEiCDYCCAJAIAhFDQAgBygC9CsiDQRAIAcoAvArIQRBACEBA0AgCCAEKAIIRgRAIAAgBDYCCAwDCyAEQRRqIQQgAUEBaiIBIA1HDQALCyADQQFBzCRBABATQQAMAwsgBSAGQQh2Qf8BcSIGNgIIAkAgBkUNACAHKAL0KyIIBEAgBygC8CshBEEAIQEDQCAGIAQoAghGBEAgACAENgIMDAMLIARBFGohBCABQQFqIgEgCEcNAAsLIANBAUHMJEEAEBNBAAwDCyAKIAxrIQYgAkEDaiECIAlBAWoiCSAFKAIESQ0ACwsgBgRAIANBAUHMJEEAEBNBAAwBC0EBIAtFDQAaIAcgBygCgCxBAWo2AoAsQQELIAVBEGokAAv1AQEFfyMAQRBrIgQkAAJAIAAoAmAoAhAiBkECaiACRwRAIANBAUHkI0EAEBMMAQsgASAEQQxqQQIQFSAGIAQoAgxHBEAgA0EBQeQjQQAQEwwBCyAGRQRAQQEhBQwBCyABQQJqIQIgACgCYCgCGCEAQQAhAQNAIAIgBEEIakEBEBUgACAEKAIIIgVB/wBxIgdBAWoiCDYCGCAAIAVBB3ZBAXE2AiAgB0EfTwRAIAQgCDYCBCAEIAE2AgAgA0EBQYX4ACAEEBNBACEFDAILIABBNGohAEEBIQUgAkEBaiECIAFBAWoiASAGRw0ACwsgBEEQaiQAIAULlAUBCX8jAEEQayIHJAACfyAAKAIIQRBGBEAgACgCtAEgACgC5AFBjCxsagwBCyAAKAIMCyEFAn8gAkEBTQRAIANBAUH/H0EAEBNBAAwBCyABIAdBDGpBAhAVAkAgBygCDARAIANBAkHzG0EAEBMMAQsgAkEGTQRAIANBAUH/H0EAEBNBAAwCCyABQQJqIAdBDGpBAhAVIAUoAvArIQQgBy0ADCEKAkACQAJAIAUoAvQrIgZFBEAgBCEADAELIAQhAANAIAAoAgggCkYNASAAQRRqIQAgCEEBaiIIIAZHDQALDAELIAYgCEcNAQsgBSgC+CsgBkYEQCAFIAZBCmoiADYC+CsgBCAAQRRsEBshACAFKALwKyEEIABFBEAgBBAUIAVBADYC+CsgBUIANwLwKyADQQFBmSBBABATQQAMBAsCQCAAIARGDQAgBSgCgCwiC0UNACAFKAL8KyEMQQAhCANAIAwgCEEUbGoiBigCCCIJBEAgBiAAIAkgBGtqNgIICyAGKAIMIgkEQCAGIAAgCSAEa2o2AgwLIAhBAWoiCCALRw0ACwsgBSAANgLwKyAAIAUoAvQrIgRBFGxqQQAgBSgC+CsgBGtBFGwQGRogBSgC9CshBiAFKALwKyEECyAFIAZBAWo2AvQrIAQgBkEUbGohAAsgACgCDCIEBEAgBBAUIABCADcCDAsgACAKNgIIIAAgBygCDCIEQQp2QQNxNgIAIAAgBEEIdkEDcTYCBCABQQRqIAdBDGpBAhAVIAcoAgwEQCADQQJBqhdBABATDAELIAAgAkEGayICEBgiBDYCDCAERQRAIANBAUH/H0EAEBNBAAwCCyAEIAFBBmogAhAWGiAAIAI2AhALQQELIAdBEGokAAsnAEEBIQEgACgCYCgCEEECdCACRwR/IANBAUHLIkEA
12824EBNBAAVBAQsLpwMBBH8jAEEQayIGJAACfyACQQFNBEAgA0EBQeoeQQAQE0EADAELIAAtANQBQQFxBEAgA0EBQdfiAEEAEBNBAAwBCyAAKAK0ASAAKALkAUGMLGxqIgAgAC0AiCxBAnI6AIgsIAEgBkEMakEBEBUCQCAAKAKsKCIERQRAIAAgBigCDEEBaiIFQQgQFyIENgKsKCAERQRAIANBAUGEH0EAEBNBAAwDCyAAIAU2AqgoDAELIAYoAgwiBSAAKAKoKEkNACAEIAVBAWoiBEEDdBAbIgVFBEAgA0EBQYQfQQAQE0EADAILIAAgBTYCrCggBSAAKAKoKCIHQQN0akEAIAQgB2tBA3QQGRogACAENgKoKCAAKAKsKCEECyAEIAYoAgwiBUEDdGooAgAEQCAGIAU2AgAgA0EBQfI2IAYQE0EADAELIAJBAWsiAhAYIQQgACgCrCgiACAGKAIMIgVBA3RqIAQ2AgAgBEUEQCADQQFBhB9BABATQQAMAQsgACAFQQN0aiACNgIEIAAgBigCDEEDdGooAgAgAUEBaiACEBYaQQELIAZBEGokAAv6AgEEfyMAQRBrIgYkAAJ/IAJBAU0EQCADQQFBsiFBABATQQAMAQsgACAALQDUAUEBcjoA1AEgASAGQQxqQQEQFQJAIAAoAowBIgRFBEAgACAGKAIMQQFqIgVBCBAXIgQ2AowBIARFBEAgA0EBQcwhQQAQE0EADAMLIAAgBTYCiAEMAQsgBigCDCIFIAAoAogBSQ0AIAQgBUEBaiIEQQN0EBsiBUUEQCADQQFBzCFBABATQQAMAgsgACAFNgKMASAFIAAoAogBIgdBA3RqQQAgBCAHa0EDdBAZGiAAIAQ2AogBIAAoAowBIQQLIAQgBigCDCIFQQN0aigCAARAIAYgBTYCACADQQFBiDcgBhATQQAMAQsgAkEBayICEBghBCAAKAKMASIAIAYoAgwiBUEDdGogBDYCACAERQRAIANBAUHMIUEAEBNBAAwBCyAAIAVBA3RqIAI2AgQgACAGKAIMQQN0aigCACABQQFqIAIQFhpBAQsgBkEQaiQAC5wBAQN/IwBBEGsiBCQAAn8gAkUEQCADQQFB5R9BABATQQAMAQsgASAEQQxqQQEQFUEBIAJBAWsiBUUNABpBACEAQQAhAgNAIAFBAWoiASAEQQhqQQEQFSAEKAIIIgZBGHRBH3UgBkH/AHEgAnJBB3RxIQIgAEEBaiIAIAVHDQALQQEgAkUNABogA0EBQeUfQQAQE0EACyAEQRBqJAALGwBBASEAIAIEf0EBBSADQQFB8iFBABATQQALC9oEAQd/IwBBIGsiBCQAQQEhBQJAIAJBAU0EQEEAIQUgA0EBQanOAEEAEBMMAQsgACgCTA0AIAEgBEEcakEBEBUgAUEBaiAEQRhqQQEQFSAEKAIYIgZBBHZBA3EiB0EDRgRAIABBATYCTCADQQJBgdoAQQAQEwwBCyACQQJrIgIgAiAGQQV2QQJxQQJqIgkgB2oiCG4iBiAIbEcEQCAAQQE2AkwgA0ECQd7WAEEAEBMMAQsgAiAISQ0AAkAgACgCRCICIAZBf3NNBEAgAiAGaiICQYCAgIACSQ0BCyAAQQE2AkwgA0ECQZPJAEEAEBMMAQsgACgCSCACQQN0EBsiCEUEQCAAQQE2AkwgA0ECQb7JAEEAEBMMAQsgAUECaiECIAAgCDYCSAJAIAcEQEEBIAYgBkEBTRshCkEAIQYDQCACIARBFGogBxAVIAQoAhQiASAAKAKEASAAKAKAAWxPDQIgAiAHaiIBIARBEGogCRAVIAggACgCRCICQQN0aiIFIAQoAhQ7AQAgBSAEKAIQNgIEQQEhBSAAIAJBAWo2AkQgASAJaiECIAZBAWoiBiAKRw0ACwwCC0EBIAYgBkEBTRshByAAKAJEIQFBACEGA0AgBCABNgIUIAEgACgChAEgACgCgAFsTw0BIAIgBEEQaiAJEBUgCCAAKAJEIgpBA3RqIgUgATsBACAFIAQoAhA2AgRBASEFIAAgCkEBaiIBNgJEIAIgCWohAiAGQQFqIgYgB0cNAAsMAQsgAEEBNgJMIAQgATYCACADQQJB0jwgBBATCyAEQSBqJAAgBQsEAEEACwvLwQEhAEGACAvgmQFjYW5ub3QgYWxsb2NhdGUgb3BqX3RjZF9zZWdfZGF0YV9jaHVua190KiBhcnJheQAtKyAgIDBYMHgALTBYKzBYIDBYLTB4KzB4IDB4AFVua25vd24gZm9ybWF0AEZhaWxlZCB0byBzZXR1cCB0aGUgZGVjb2RlcgBGYWlsZWQgdG8gcmVhZCB0aGUgaGVhZGVyAG5hbgAqbF90aWxlX2xlbiA+IFVJTlRfTUFYIC0gT1BKX0NPTU1PTl9DQkxLX0RBVEFfRVhUUkEgLSBwX2oyay0+bV9zcGVjaWZpY19wYXJhbS5tX2RlY29kZXIubV9zb3RfbGVuZ3RoAGluZgBGYWlsZWQgdG8gZGVjb2RlIHRoZSBpbWFnZQBJbnZhbGlkIGFjY2VzcyB0byBwaS0+aW5jbHVkZQAvdG1wL29wZW5qcGVnL3NyYy9iaW4vY29tbW9uL2NvbG9yLmMAQUxMX0NQVVMAT1BKX05VTV9USFJFQURTAE5BTgBPSlBfRE9fTk9UX0RJU1BMQVlfVElMRV9JTkRFWF9JRl9UTE0ASU5GAHBfajJrLT5tX3NwZWNpZmljX3BhcmFtLm1fZGVjb2Rlci5tX3NvdF9sZW5ndGggPiBVSU5UX01BWCAtIE9QSl9DT01NT05fQ0JMS19EQVRBX0VYVFJBAAkJCSBwcmVjY2ludHNpemUgKHcsaCk9AAkJCSBzdGVwc2l6ZXMgKG0sZSk9AFNPVCBtYXJrZXIgZm9yIHRpbGUgJXUgZGVjbGFyZXMgbW9yZSB0aWxlLXBhcnRzIHRoYW4gZm91bmQgaW4gVExNIG1hcmtlci4AKG51bGwpACglZCwlZCkgACVzfQoACQkgfQoAW0RFVl0gRHVtcCBhbiBpbWFnZV9jb21wX2hlYWRlciBzdHJ1Y3QgewoAW0RFVl0gRHVtcCBhbiBpbWFnZV9oZWFkZXIgc3RydWN0IHsKAEltYWdlIGluZm8gewoACSBkZWZhdWx0IHRpbGUgewoAJXMJIGNvbXBvbmVudCAlZCB7CgAJCSBjb21wICVkIHsKAAkgVGlsZSBpbmRleDogewoACSBNYXJrZXIgbGlzdDogewoAQ29kZXN0cmVhbSBpbmRleCBmcm9tIG1haW4gaGVhZGVyOiB7CgBDb2Rlc3RyZWFtIGluZm8gZnJvbSBtYWluIGhlYWRlcjogewoAU3RyZWFtIGVycm9yIHdoaWxlIHJlYWRpbmcgSlAyIEhlYWRlciBib3gKAEZvdW5kIGEgbWlzcGxhY2VkICclYyVjJWMlYycgYm94IG91dHNpZGUganAyaCBib3gKAE1hbGZvcm1lZCBKUDIgZmlsZSBmb3JtYXQ6IGZpcnN0IGJveCBtdXN0IGJlIEpQRUcgMjAwMCBzaWduYXR1cmUgYm94CgBNYWxmb3JtZWQgSlAyIGZpbGUgZm9ybWF0OiBzZWNvbmQgYm94IG11c3QgYmUgZmlsZSB0eXBlIGJveAoATm90IGVub3VnaCBtZW1vcnkgdG8gaGFuZGxlIGpwZWcyMDAwIGJveAoATm90IGVub3VnaCBtZW1vcnkgd2l0aCBGVFlQIEJveAoAQSBtYXJrZXIgSUQgd2FzIGV4cGVjdGVkICgweGZmLS0pIGluc3RlYWQgb2YgJS44eAoACQkgbWN0PSV4CgAJCQkgY2Jsa3N0eT0lI3gKAAkJCSBjc3R5PSUjeAoACQkgcHJnPSUjeAoASW50ZWdlciBvdmVyZmxvdwoACSB0ZHg9JXUsIHRkeT0ldQoACSB0dz0ldSwgdGg9JXUKAAkgdHgwPSV1LCB0eTA9JXUKAEludmFsaWQgY29tcG9uZW50IGluZGV4OiAldQoAU3RyZWFtIHRvbyBzaG9ydAoATWFya2VyIGhhbmRsZXIgZnVuY3Rpb24gZmFpbGVkIHRvIHJlYWQgdGhlIG1hcmtlciBzZWdtZW50CgBOb3QgZW5vdWdoIG1lbW9yeSBmb3IgY3VycmVudCBwcmVjaW5jdCBjb2RlYmxvY2sgZWxlbWVudAoARXJyb3IgcmVhZGluZyBTUENvZCBTUENvYyBlbGVtZW50CgBFcnJvciByZWFkaW5nIFNRY2Qgb3IgU1FjYyBlbGVtZW50CgBBIEJQQ0MgaGVhZGVyIGJveCBpcyBhdmFpbGFibGUgYWx0aG91Z2ggQlBDIGdpdmVuIGJ5IHRoZSBJSERSIGJveCAoJWQpIGluZGljYXRlIGNvbXBvbmVudHMgYml0IGRlcHR
12824oIGlzIGNvbnN0YW50CgBFcnJvciB3aXRoIFNJWiBtYXJrZXI6IGlsbGVnYWwgdGlsZSBvZmZzZXQKAEludmFsaWQgcHJlY2luY3QKAE5vdCBlbm91Z2ggbWVtb3J5IHRvIGhhbmRsZSBiYW5kIHByZWNpbnRzCgBGYWlsZWQgdG8gZGVjb2RlIGFsbCB1c2VkIGNvbXBvbmVudHMKAFNpemUgb2YgY29kZSBibG9jayBkYXRhIGV4Y2VlZHMgc3lzdGVtIGxpbWl0cwoAU2l6ZSBvZiB0aWxlIGRhdGEgZXhjZWVkcyBzeXN0ZW0gbGltaXRzCgBDYW5ub3QgdGFrZSBpbiBjaGFyZ2UgbXVsdGlwbGUgTUNUIG1hcmtlcnMKAENvcnJ1cHRlZCBQUE0gbWFya2VycwoATm90IGVub3VnaCBtZW1vcnkgZm9yIHRpbGUgcmVzb2x1dGlvbnMKAENhbm5vdCB0YWtlIGluIGNoYXJnZSBtdWx0aXBsZSBjb2xsZWN0aW9ucwoASW52YWxpZCBQQ0xSIGJveC4gUmVwb3J0cyAwIHBhbGV0dGUgY29sdW1ucwoAV2UgZG8gbm90IHN1cHBvcnQgUk9JIGluIGRlY29kaW5nIEhUIGNvZGVibG9ja3MKAENhbm5vdCBoYW5kbGUgYm94IG9mIHVuZGVmaW5lZCBzaXplcwoAQ2Fubm90IHRha2UgaW4gY2hhcmdlIGNvbGxlY3Rpb25zIHdpdGhvdXQgc2FtZSBudW1iZXIgb2YgaW5kaXhlcwoASW52YWxpZCB0aWxlYy0+d2luX3h4eCB2YWx1ZXMKAENhbm5vdCBoYW5kbGUgYm94IG9mIGxlc3MgdGhhbiA4IGJ5dGVzCgBDYW5ub3QgaGFuZGxlIFhMIGJveCBvZiBsZXNzIHRoYW4gMTYgYnl0ZXMKAENvbXBvbmVudCBpbmRleCAldSB1c2VkIHNldmVyYWwgdGltZXMKAEludmFsaWQgUENMUiBib3guIFJlcG9ydHMgJWQgZW50cmllcwoATm90IGVub3VnaCBtZW1vcnkgdG8gY3JlYXRlIFRhZy10cmVlIG5vZGVzCgBDYW5ub3QgdGFrZSBpbiBjaGFyZ2UgbWN0IGRhdGEgd2l0aGluIG11bHRpcGxlIE1DVCByZWNvcmRzCgBDYW5ub3QgZGVjb2RlIHRpbGUsIG1lbW9yeSBlcnJvcgoAb3BqX2oya19hcHBseV9uYl90aWxlX3BhcnRz
12824X2NvcnJlY3Rpb24gZXJyb3IKAFByb2JsZW0gd2l0aCBza2lwcGluZyBKUEVHMjAwMCBib3gsIHN0cmVhbSBlcnJvcgoAUHJvYmxlbSB3aXRoIHJlYWRpbmcgSlBFRzIwMDAgYm94LCBzdHJlYW0gZXJyb3IKAFVua25vd24gbWFya2VyCgBOb3QgZW5vdWdoIG1lbW9yeSB0byBhZGQgdGwgbWFya2VyCgBOb3QgZW5vdWdoIG1lbW9yeSB0byBhZGQgbWggbWFya2VyCgBOb3QgZW5vdWdoIG1lbW9yeSB0byB0YWtlIGluIGNoYXJnZSBTSVogbWFya2VyCgBFcnJvciByZWFkaW5nIFBQVCBtYXJrZXIKAE5vdCBlbm91Z2ggbWVtb3J5IHRvIHJlYWQgUFBUIG1hcmtlcgoARXJyb3IgcmVhZGluZyBTT1QgbWFya2VyCgBEaWQgbm90IGdldCBleHBlY3RlZCBTT1QgbWFya2VyCgBFcnJvciByZWFkaW5nIFBMVCBtYXJrZXIKAEVycm9yIHJlYWRpbmcgTUNUIG1hcmtlcgoATm90IGVub3VnaCBtZW1vcnkgdG8gcmVhZCBNQ1QgbWFya2VyCgBOb3QgZW5vdWdoIHNwYWNlIGZvciBleHBlY3RlZCBTT1AgbWFya2VyCgBFeHBlY3RlZCBTT1AgbWFya2VyCgBFcnJvciByZWFkaW5nIE1DTyBtYXJrZXIKAEVycm9yIHJlYWRpbmcgUkdOIG1hcmtlcgoARXJyb3IgcmVhZGluZyBQUE0gbWFya2VyCgBOb3QgZW5vdWdoIG1lbW9yeSB0byByZWFkIFBQTSBtYXJrZXIKAEVycm9yIHJlYWRpbmcgUExNIG1hcmtlcgoARXhwZWN0ZWQgRVBIIG1hcmtlcgoATm90IGVub3VnaCBzcGFjZSBmb3IgcmVxdWlyZWQgRVBIIG1hcmtlcgoARXJyb3IgcmVhZGluZyBDUkcgbWFya2VyCgBVbmtub3duIHByb2dyZXNzaW9uIG9yZGVyIGluIENPRCBtYXJrZXIKAFVua25vd24gU2NvZCB2YWx1ZSBpbiBDT0QgbWFya2VyCgBFcnJvciByZWFkaW5nIENPRCBtYXJrZXIKAEVycm9yIHJlYWRpbmcgUUNEIG1hcmtlcgoAQ3Jyb3IgcmVhZGluZyBDQkQgbWFya2VyCgBFcnJvciByZWFkaW5nIFBPQyBtYXJrZXIKAEVycm9yIHJlYWRpbmcgQ09DIG1hcmtlcgoARXJyb3IgcmVhZGluZyBRQ0MgbWFya2VyCgBFcnJvciByZWFkaW5nIE1DQyBtYXJrZXIKAE5vdCBlbm91Z2ggbWVtb3J5IHRvIHJlYWQgTUNDIG1hcmtlcgoAcmVxdWlyZWQgU0laIG1hcmtlciBub3QgZm91bmQgaW4gbWFpbiBoZWFkZXIKAHJlcXVpcmVkIENPRCBtYXJrZXIgbm90IGZvdW5kIGluIG1haW4gaGVhZGVyCgByZXF1aXJlZCBRQ0QgbWFya2VyIG5vdCBmb3VuZCBpbiBtYWluIGhlYWRlcgoATm90IGVub3VnaCBtZW1vcnkgdG8gaGFuZGxlIGpwZWcyMDAwIGZpbGUgaGVhZGVyCgBOb3QgZW5vdWdoIG1lbW9yeSB0byByZWFkIGhlYWRlcgoARXJyb3Igd2l0aCBKUCBTaWduYXR1cmUgOiBiYWQgbWFnaWMgbnVtYmVyCgBJbiBTT1QgbWFya2VyLCBUUFNvdCAoJWQpIGlzIG5vdCB2YWxpZCByZWdhcmRzIHRvIHRoZSBjdXJyZW50IG51bWJlciBvZiB0aWxlLXBhcnQgKCVkKSwgZ2l2aW5nIHVwCgBJbiBTT1QgbWFya2VyLCBUUFNvdCAoJWQpIGlzIG5vdCB2YWxpZCByZWdhcmRzIHRvIHRoZSBwcmV2aW91cyBudW1iZXIgb2YgdGlsZS1wYXJ0ICglZCksIGdpdmluZyB1cAoASW4gU09UIG1hcmtlciwgVFBTb3QgKCVkKSBpcyBub3QgdmFsaWQgcmVnYXJkcyB0byB0aGUgY3VycmVudCBudW1iZXIgb2YgdGlsZS1wYXJ0IChoZWFkZXIpICglZCksIGdpdmluZyB1cAoAdGlsZXMgcmVxdWlyZSBhdCBsZWFzdCBvbmUgcmVzb2x1dGlvbgoATWFya2VyIGlzIG5vdCBjb21wbGlhbnQgd2l0aCBpdHMgcG9zaXRpb24KAFByb2JsZW0gd2l0aCBzZWVrIGZ1bmN0aW9uCgBFcnJvciByZWFkaW5nIFNQQ29kIFNQQ29jIGVsZW1lbnQsIEludmFsaWQgY2Jsa3cvY2Jsa2ggY29tYmluYXRpb24KAEludmFsaWQgbXVsdGlwbGUgY29tcG9uZW50IHRyYW5zZm9ybWF0aW9uCgBDYW5ub3QgdGFrZSBpbiBjaGFyZ2UgY29sbGVjdGlvbnMgb3RoZXIgdGhhbiBhcnJheSBkZWNvcnJlbGF0aW9uCgBUb28gbGFyZ2UgdmFsdWUgZm9yIE5wcG0KAE5vdCBlbm91Z2ggYnl0ZXMgdG8gcmVhZCBOcHBtCgBiYWQgcGxhY2VkIGpwZWcgY29kZXN0cmVhbQoACSBNYWluIGhlYWRlciBzdGFydCBwb3NpdGlvbj0lbGxpCgkgTWFpbiBoZWFkZXIgZW5kIHBvc2l0aW9uPSVsbGkKAE1hcmtlciBzaXplIGluY29uc2lzdGVudCB3aXRoIHN0cmVhbSBsZW5ndGgKAFRpbGUgcGFydCBsZW5ndGggc2l6ZSBpbmNvbnNpc3RlbnQgd2l0aCBzdHJlYW0gbGVuZ3RoCgBDYW5ub3QgdGFrZSBpbiBjaGFyZ2UgbXVsdGlwbGUgZGF0YSBzcGFubmluZwoAV3JvbmcgZmxhZwoARXJyb3Igd2l0aCBGVFlQIHNpZ25hdHVyZSBCb3ggc2l6ZQoARXJyb3Igd2l0aCBKUCBzaWduYXR1cmUgQm94IHNpemUKAEludmFsaWQgcHJlY2luY3Qgc2l6ZQoASW5jb25zaXN0ZW50IG1hcmtlciBzaXplCgBJbnZhbGlkIG1hcmtlciBzaXplCgBFcnJvciB3aXRoIFNJWiBtYXJrZXIgc2l6ZQoATm90IGVub3VnaCBtZW1vcnkgdG8gYWRkIGEgbmV3IHZhbGlkYXRpb24gcHJvY2VkdXJlCgBOb3QgZW5vdWdoIG1lbW9yeSB0byBkZWNvZGUgdGlsZQoARmFpbGVkIHRvIGRlY29kZSB0aGUgY29kZXN0cmVhbSBpbiB0aGUgSlAyIGZpbGUKAENhbm5vdCB0YWtlIGluIGNoYXJnZSBjb2xsZWN0aW9ucyB3aXRoIGluZGl4IHNodWZmbGUKAENhbm5vdCBhbGxvY2F0ZSBUaWVyIDEgaGFuZGxlCgBObyBkZWNvZGVkIGFyZWEgcGFyYW1ldGVycywgc2V0IHRoZSBkZWNvZGVkIGFyZWEgdG8gdGhlIHdob2xlIGltYWdlCgBOb3QgZW5vdWdoIG1lbW9yeSB0byBjcmVhdGUgVGFnLXRyZWUKAE5vdCBlbm91Z2ggbWVtb3J5IHRvIHJlaW5pdGlhbGl6ZSB0aGUgdGFnIHRyZWUKAEVycm9yIHJlYWRpbmcgU1BDb2QgU1BDb2MgZWxlbWVudCwgSW52YWxpZCB0cmFuc2Zvcm1hdGlvbiBmb3VuZAoARXJyb3IgcmVhZGluZyBTUENvZCBTUENvYyBlbGVtZW50LiBVbnN1cHBvcnRlZCBNaXhlZCBIVCBjb2RlLWJsb2NrIHN0eWxlIGZvdW5kCgBUaWxlIFkgY29vcmRpbmF0ZXMgYXJlIG5vdCBzdXBwb3J0ZWQKAFRpbGUgWCBjb29yZGluYXRlcyBhcmUgbm90IHN1cHBvcnRlZAoASW1hZ2UgY29vcmRpbmF0ZXMgYWJvdmUgSU5UX01BWCBhcmUgbm90IHN1cHBvcnRlZAoASlBFRzIwMDAgSGVhZGVyIGJveCBub3QgcmVhZCB5ZXQsICclYyVjJWMlYycgYm94IHdpbGwgYmUgaWdub3JlZAoAb3BqX2oya19tZXJnZV9wcHQoKSBoYXMgYWxyZWFkeSBiZWVuIGNhbGxlZAoAb3BqX2oya19idWlsZF90cF9pbmRleF9mcm9tX3RsbSgpOiB0aWxlIGluZGV4IGFsbG9jYXRpb24gZmFpbGVkCgBOb3QgZW5vdWdoIG1lbW9yeSB0byByZWFkIFNPVCBtYXJrZXIuIFRpbGUgaW5kZXggYWxsb2NhdGlvbiBmYWlsZWQKAElnbm9yaW5nIGloZHIgYm94LiBGaXJzdCBpaGRyIGJveCBhbHJlYWR5IHJlYWQKAFpwcHQgJXUgYWxyZWFkeSByZWFkCgBacHBtICV1IGFscmVhZHkgcmVhZAoAUFRFUk0gY2hlY2sgZmFpbHVy
12824ZTogJWQgc3ludGhlc2l6ZWQgMHhGRiBtYXJrZXJzIHJlYWQKAAkJCSBjYmxrdz0yXiVkCgAJCQkgY2Jsa2g9Ml4lZAoACQkJIHFudHN0eT0lZAoAJXMgZHg9JWQsIGR5PSVkCgAJCQkgcm9pc2hpZnQ9JWQKAAkJCSBudW1nYml0cz0lZAoACQkgbnVtbGF5ZXJzPSVkCgAlcyBudW1jb21wcz0lZAoAb3BqX2pwMl9hcHBseV9jZGVmOiBhY249JWQsIG51bWNvbXBzPSVkCgBvcGpfanAyX2FwcGx5X2NkZWY6IGNuPSVkLCBudW1jb21wcz0lZAoACQkJIG51bXJlc29sdXRpb25zPSVkCgAJCSB0eXBlPSUjeCwgcG9zPSVsbGksIGxlbj0lZAoAJXMgc2duZD0lZAoACQkJIHFtZmJpZD0lZAoAJXMgcHJlYz0lZAoACQkgbmIgb2YgdGlsZS1wYXJ0IGluIHRpbGUgWyVkXT0lZAoAJXMgeDE9JWQsIHkxPSVkCgAlcyB4MD0lZCwgeTA9JWQKAEZhaWxlZCB0byBkZWNvZGUgdGlsZSAlZC8lZAoAU2V0dGluZyBkZWNvZGluZyBhcmVhIHRvICVkLCVkLCVkLCVkCgBGYWlsZWQgdG8gZGVjb2RlIGNvbXBvbmVudCAlZAoASW52YWxpZCB2YWx1ZSBmb3IgbnVtcmVzb2x1dGlvbnMgOiAlZCwgbWF4IHZhbHVlIGlzIHNldCBpbiBvcGVuanBlZy5oIGF0ICVkCgBJbnZhbGlkIGNvbXBvbmVudCBudW1iZXI6ICVkLCByZWdhcmRpbmcgdGhlIG51bWJlciBvZiBjb21wb25lbnRzICVkCgBUb28gbWFueSBQT0NzICVkCgBvcGpfajJrX3JlYWRfdGxtKCk6IGludmFsaWQgdGlsZSBudW1iZXIgJWQKAEludmFsaWQgdGlsZSBudW1iZXIgJWQKAEludmFsaWQgdGlsZSBwYXJ0IGluZGV4IGZvciB0aWxlIG51bWJlciAlZC4gR290ICVkLCBleHBlY3RlZCAlZAoARXJyb3Igd2l0aCBTSVogbWFya2VyOiBudW1iZXIgb2YgY29tcG9uZW50IGlzIGlsbGVnYWwgLT4gJWQKAE5vdCBlbm91Z2ggbWVtb3J5IGZvciBjaWVsYWIKAENhbm5vdCBhbGxvY2F0ZSBjYmxrLT5kZWNvZGVkX2RhdGEKAEZhaWxlZCB0byBtZXJnZSBQUFQgZGF0YQoARmFpbGVkIHRvIG1lcmdlIFBQTSBkYXRhCgBJbnZhbGlkIG51bWJlciBvZiBsYXllcnMgaW4gQ09EIG1hcmtlciA6ICVkIG5vdCBpbiByYW5nZSBbMS02NTUzNV0KACVzOiVkOmNvbG9yX2NteWtfdG9fcmdiCglDQU4gTk9UIENPTlZFUlQKACVzOiVkOmNvbG9yX2VzeWNjX3RvX3JnYgoJQ0FOIE5PVCBDT05WRVJUCgAlczolZDpjb2xvcl9zeWNjX3RvX3JnYgoJQ0FOIE5PVCBDT05WRVJUCgBTdHJlYW0gdG9vIHNob3J0LCBleHBlY3RlZCBTT1QKAFVuYWJsZSB0byBzZXQgdDEgaGFuZGxlIGFzIFRMUwoAU290IGxlbmd0aCBpcyBsZXNzIHRoYW4gbWFya2VyIHNpemUgKyBtYXJrZXIgSUQKAFN0cmVhbSBkb2VzIG5vdCBlbmQgd2l0aCBFT0MKAENhbm5vdCBoYW5kbGUgYm94IHNpemVzIGhpZ2hlciB0aGFuIDJeMzIKAG9wal9waV9uZXh0X2xyY3AoKTogaW52YWxpZCBjb21wbm8wL2NvbXBubzEKAG9wal9waV9uZXh0X3JsY3AoKTogaW52YWxpZCBjb21wbm8wL2NvbXBubzEKAG9wal9waV9uZXh0X2NwcmwoKTogaW52YWxpZCBjb21wbm8wL2NvbXBubzEKAG9wal9waV9uZXh0X3BjcmwoKTogaW52YWxpZCBjb21wbm8wL2NvbXBubzEKAG9wal9waV9uZXh0X3JwY2woKTogaW52YWxpZCBjb21wbm8wL2NvbXBubzEKAG9wal90MV9kZWNvZGVfY2JsaygpOiB1bnN1cHBvcnRlZCBicG5vX3BsdXNfb25lID0gJWQgPj0gMzEKAEZhaWxlZCB0byBkZWNvZGUgdGlsZSAxLzEKAEluc3VmZmljaWVudCBkYXRhIGZvciBDTUFQIGJveC4KAE5lZWQgdG8gcmVhZCBhIFBDTFIgYm94IGJlZm9yZSB0aGUgQ01BUCBib3guCgBJbnN1ZmZpY2llbnQgZGF0YSBmb3IgQ0RFRiBib3guCgBOdW1iZXIgb2YgY2hhbm5lbCBkZXNjcmlwdGlvbiBpcyBlcXVhbCB0byB6ZXJvIGluIENERUYgYm94LgoAU3RyZWFtIGVycm9yIHdoaWxlIHJlYWRpbmcgSlAyIEhlYWRlciBib3g6IG5vICdpaGRyJyBib3guCgBOb24gY29uZm9ybWFudCBjb2Rlc3RyZWFtIFRQc290PT1UTnNvdC4KAFN0cmVhbSBlcnJvciB3aGlsZSByZWFkaW5nIEpQMiBIZWFkZXIgYm94OiBib3ggbGVuZ3RoIGlzIGluY29uc2lzdGVudC4KAEJveCBsZW5ndGggaXMgaW5jb25zaXN0ZW50LgoAUmVzb2x1dGlvbiBmYWN0b3IgaXMgZ3JlYXRlciB0aGFuIHRoZSBtYXhpbXVtIHJlc29sdXRpb24gaW4gdGhlIGNvbXBvbmVudC4KAENvbXBvbmVudCBtYXBwaW5nIHNlZW1zIHdyb25nLiBUcnlpbmcgdG8gY29ycmVjdC4KAG9wal9qMmtfYnVpbGRfdHBfaW5kZXhfZnJvbV90bG0oKTogdGlsZSAlZCBoYXMgbm8gcmVnaXN0ZXJlZCB0aWxlLXBhcnQgaW4gVExNIG1hcmtlciBzZWdtZW50cy4KAG9wal9qMmtfcmVhZF90bG0oKTogdG9vIG1hbnkgVExNIG1hcmtlcnMuCgBvcGpfajJrX3JlYWRfdGxtKCk6IGNhbm5vdCBhbGxvY2F0ZSBtX3RpbGVfcGFydF9pbmZvcy4KAEluY29tcGxldGUgY2hhbm5lbCBkZWZpbml0aW9ucy4KAE1hbGZvcm1lZCBIVCBjb2RlYmxvY2suIEludmFsaWQgY29kZWJsb2NrIGxlbmd0aCB2YWx1ZXMuCgBXZSBkbyBub3Qgc3VwcG9ydCBtb3JlIHRoYW4gMyBjb2RpbmcgcGFzc2VzIGluIGFuIEhUIGNvZGVibG9jazsgVGhpcyBjb2RlYmxvY2tzIGhhcyAlZCBwYXNzZXMuCgBNYWxmb3JtZWQgSFQgY29kZWJsb2NrLiBEZWNvZGluZyB0aGlzIGNvZGVibG9jayBpcyBzdG9wcGVkLiBUaGVyZSBhcmUgJWQgemVybyBiaXRwbGFuZXMgaW4gJWQgYml0cGxhbmVzLgoAQ2Fubm90IHRha2UgaW4gY2hhcmdlIG11bHRpcGxlIHRyYW5zZm9ybWF0aW9uIHN0YWdlcy4KAFVua25vd24gbWFya2VyIGhhcyBiZWVuIGRldGVjdGVkIGFuZCBnZW5lcmF0ZWQgZXJyb3IuCgBDb2RlYyBwcm92aWRlZCB0byB0aGUgb3BqX3Nld
12824HVwX2RlY29kZXIgZnVuY3Rpb24gaXMgbm90IGEgZGVjb21wcmVzc29yIGhhbmRsZXIuCgBDb2RlYyBwcm92aWRlZCB0byB0aGUgb3BqX3JlYWRfaGVhZGVyIGZ1bmN0aW9uIGlzIG5vdCBhIGRlY29tcHJlc3NvciBoYW5kbGVyLgoARXJyb3IgcmVhZGluZyBUTE0gbWFya2VyLgoAVGlsZXMgZG9uJ3QgYWxsIGhhdmUgdGhlIHNhbWUgZGltZW5zaW9uLiBTa2lwIHRoZSBNQ1Qgc3RlcC4KAE51bWJlciBvZiBjb21wb25lbnRzICglZCkgaXMgaW5jb25zaXN0ZW50IHdpdGggYSBNQ1QuIFNraXAgdGhlIE1DVCBzdGVwLgoASlAyIGJveCB3aGljaCBhcmUgYWZ0ZXIgdGhlIGNvZGVzdHJlYW0gd2lsbCBub3QgYmUgcmVhZCBieSB0aGlzIGZ1bmN0aW9uLgoATWFsZm9ybWVkIEhUIGNvZGVibG9jay4gV2hlbiB0aGUgbnVtYmVyIG9mIHplcm8gcGxhbmVzIGJpdHBsYW5lcyBpcyBlcXVhbCB0byB0aGUgbnVtYmVyIG9mIGJpdHBsYW5lcywgb25seSB0aGUgY2xlYW51cCBwYXNzIG1ha2VzIHNlbnNlLCBidXQgd2UgaGF2ZSAlZCBwYXNzZXMgaW4gdGhpcyBjb2RlYmxvY2suIFRoZXJlZm9yZSwgb25seSB0aGUgY2xlYW51cCBwYXNzIHdpbGwgYmUgZGVjb2RlZC4gVGhpcyBtZXNzYWdlIHdpbGwgbm90IGJlIGRpc3BsYXllZCBhZ2Fpbi4KAEltYWdlIGhhcyBsZXNzIGNvbXBvbmVudHMgdGhhbiBjb2Rlc3RyZWFtLgoATmVlZCB0byBkZWNvZGUgdGhlIG1haW4gaGVhZGVyIGJlZm9yZSBiZWdpbiB0byBkZWNvZGUgdGhlIHJlbWFpbmluZyBjb2Rlc3RyZWFtLgoAUHNvdCB2YWx1ZSBvZiB0aGUgY3VycmVudCB0aWxlLXBhcnQgaXMgZXF1YWwgdG8gemVybywgd2UgYXNzdW1pbmcgaXQgaXMgdGhlIGxhc3QgdGlsZS1wYXJ0IG9mIHRoZSBjb2Rlc3RyZWFtLgoAQSBtYWxmb3JtZWQgY29kZWJsb2NrIHRoYXQgaGFzIG1vcmUgdGhhbiBvbmUgY29kaW5nIHBhc3MsIGJ1dCB6ZXJvIGxlbmd0aCBmb3IgMm5kIGFuZCBwb3RlbnRpYWxseSB0aGUgM3JkIHBhc3MgaW4gYW4gSFQgY29kZWJsb2NrLgoACQkJIHRpbGUtcGFydFslZF06IHN0YXJfcG9zPSVsbGksIGVuZF9oZWFkZXI9JWxsaSwgZW5kX3Bvcz0lbGxpLgoAVGlsZSAldSBoYXMgVFBzb3QgPT0gMCBhbmQgVE5zb3QgPT0gMCwgYnV0IG5vIG90aGVyIHRpbGUtcGFydHMgd2VyZSBmb3VuZC4gRU9DIGlzIGFsc28gbWlzc2luZy4KAENvbXBvbmVudCAlZCBkb2Vzbid0IGhhdmUgYSBtYXBwaW5nLgoAb3BqX2oya19yZWFkX3RsbSgpOiBUTE0gbWFya2VyIG5vdCBvZiBleHBlY3RlZCBzaXplLgoAQSBjb25mb3JtaW5nIEpQMiByZWFkZXIgc2hhbGwgaWdub3JlIGFsbCBDb2xvdXIgU3BlY2lmaWNhdGlvbiBib3hlcyBhZnRlciB0aGUgZmlyc3QsIHNvIHdlIGlnbm9yZSB0aGlzIG9uZS4KAFRoZSBzaWduYXR1cmUgYm94IG11c3QgYmUgdGhlIGZpcnN0IGJveCBpbiB0aGUgZmlsZS4KAFRoZSAgYm94IG11c3QgYmUgdGhlIGZpcnN0IGJveCBpbiB0aGUgZmlsZS4KAFRoZSBmdHlwIGJveCBtdXN0IGJlIHRoZSBzZWNvbmQgYm94IGluIHRoZSBmaWxlLgoARmFpbGVkIHRvIGRlY29kZS4KAE1hbGZvcm1lZCBIVCBjb2RlYmxvY2suIEluY29ycmVjdCBNRUwgc2VnbWVudCBzZXF1ZW5jZS4KAENvbXBvbmVudCAlZCBpcyBtYXBwZWQgdHdpY2UuCgBvcGpfajJrX3JlYWRfdGxtKCk6IFNUID0gMyBpcyBpbnZhbGlkLgoAT25seSBvbmUgQ01BUCBib3ggaXMgYWxsb3dlZC4KAFdlIG5lZWQgYW4gaW1hZ2UgcHJldmlvdXNseSBjcmVhdGVkLgoASUhEUiBib3hfbWlzc2luZy4gUmVxdWlyZWQuCgBKUDJIIGJveCBtaXNzaW5nLiBSZXF1aXJlZC4KAE5vdCBzdXJlIGhvdyB0aGF0IGhhcHBlbmVkLgoATWFpbiBoZWFkZXIgaGFzIGJlZW4gY29ycmVjdGx5IGRlY29kZWQuCgBUaWxlICVkLyVkIGhhcyBiZWVuIGRlY29kZWQuCgBIZWFkZXIgb2YgdGlsZSAlZCAvICVkIGhhcyBiZWVuIHJlYWQuCgBFbXB0eSBTT1QgbWFya2VyIGRldGVjdGVkOiBQc290PSVkLgoARGlyZWN0IHVzZSBhdCAjJWQgaG93ZXZlciBwY29sPSVkLgoASW1wbGVtZW50YXRpb24gbGltaXRhdGlvbjogZm9yIHBhbGV0dGUgbWFwcGluZywgcGNvbFslZF0gc2hvdWxkIGJlIGVxdWFsIHRvICVkLCBidXQgaXMgZXF1YWwgdG8gJWQuCgBJbnZhbGlkIGNvbXBvbmVudC9wYWxldHRlIGluZGV4IGZvciBkaXJlY3QgbWFwcGluZyAlZC4KAEludmFsaWQgdmFsdWUgZm9yIGNtYXBbJWRdLm10eXAgPSAlZC4KAFBzb3QgdmFsdWUgaXMgbm90IGNvcnJlY3QgcmVnYXJkcyB0byB0aGUgSlBFRzIwMDAgbm9ybTogJWQuCgBNYWxmb3JtZWQgSFQgY29kZWJsb2NrLiBWTEMgY29kZSBwcm9kdWNlcyBzaWduaWZpY2FudCBzYW1wbGVzIG91dHNpZGUgdGhlIGNvZGVibG9jayBhcmVhLgoAVW5leHBlY3RlZCBPT00uCgAzMiBiaXRzIGFyZSBub3QgZW5vdWdoIHRvIGRlY29kZSB0aGlzIGNvZGVibG9jaywgc2luY2UgdGhlIG51bWJlciBvZiBiaXRwbGFuZSwgJWQsIGlzIGxhcmdlciB0aGFuIDMwLgoAQm90dG9tIHBvc2l0aW9uIG9mIHRoZSBkZWNvZGVkIGFyZWEgKHJlZ2lvbl95MT0lZCkgc2hvdWxkIGJlID4gMC4KAFJpZ2h0IHBvc2l0aW9uIG9mIHRoZSBkZWNvZGVkIGFyZWEgKHJlZ2lvbl94MT0lZCkgc2hvdWxkIGJlID4gMC4KAFVwIHBvc2l0aW9uIG9mIHRoZSBkZWNvZGVkIGFyZWEgKHJlZ2lvbl95MD0lZCkgc2hvdWxkIGJlID49IDAuCgBMZWZ0IHBvc2l0aW9uIG9mIHRoZSBkZWNvZGVkIGFyZWEgKHJlZ2lvbl94MD0lZCkgc2hvdWxkIGJlID49IDAuCgBFcnJvciByZWFkaW5nIFBQVCBtYXJrZXI6IHBhY2tldCBoZWFkZXIgaGF2ZSBiZWVuIHByZXZpb3VzbHkgZm91bmQgaW4gdGhlIG1haW4gaGVhZGVyIChQUE0gbWFya2VyKS4KAFN0YXJ0IHRvIHJlYWQgajJrIG1haW4gaGVhZGVyICglbGxkKS4KAEJvdHRvbSBwb3NpdGlvbiBvZiB0aGUgZGVjb2RlZCBhcmVhIChyZWdpb25feTE9JWQpIGlzIG91dHNpZGUgdGhlIGltYWdlIGFyZWEgKFlzaXo9JWQpLgoAVXAgcG9zaXRpb24gb2YgdGhlIGRlY29kZWQgYXJlYSAocmVnaW9uX3kwPSVkKSBpcyBvdXRzaWRlIHRoZSBpbWFnZSBhcmVhIChZc2l6PSVkKS4KAFJpZ2h0IHBvc2l0aW9uIG9mIHRoZSBkZWNvZGVkIGFyZWEgKHJlZ2lvbl94MT0lZCkgaXMgb3V0c2lkZSB0aGUgaW1hZ2UgYXJlYSAoWHNpej0lZCkuCgBMZWZ0IH
12824Bvc2l0aW9uIG9mIHRoZSBkZWNvZGVkIGFyZWEgKHJlZ2lvbl94MD0lZCkgaXMgb3V0c2lkZSB0aGUgaW1hZ2UgYXJlYSAoWHNpej0lZCkuCgBCb3R0b20gcG9zaXRpb24gb2YgdGhlIGRlY29kZWQgYXJlYSAocmVnaW9uX3kxPSVkKSBpcyBvdXRzaWRlIHRoZSBpbWFnZSBhcmVhIChZT3Npej0lZCkuCgBVcCBwb3NpdGlvbiBvZiB0aGUgZGVjb2RlZCBhcmVhIChyZWdpb25feTA9JWQpIGlzIG91dHNpZGUgdGhlIGltYWdlIGFyZWEgKFlPc2l6PSVkKS4KAFJpZ2h0IHBvc2l0aW9uIG9mIHRoZSBkZWNvZGVkIGFyZWEgKHJlZ2lvbl94MT0lZCkgaXMgb3V0c2lkZSB0aGUgaW1hZ2UgYXJlYSAoWE9zaXo9JWQpLgoATGVmdCBwb3NpdGlvbiBvZiB0aGUgZGVjb2RlZCBhcmVhIChyZWdpb25feDA9JWQpIGlzIG91dHNpZGUgdGhlIGltYWdlIGFyZWEgKFhPc2l6PSVkKS4KAFNpemUgeCBvZiB0aGUgZGVjb2RlZCBjb21wb25lbnQgaW1hZ2UgaXMgaW5jb3JyZWN0IChjb21wWyVkXS53PSVkKS4KAFNpemUgeSBvZiB0aGUgZGVjb2RlZCBjb21wb25lbnQgaW1hZ2UgaXMgaW5jb3JyZWN0IChjb21wWyVkXS5oPSVkKS4KAFRpbGUgcmVhZCwgZGVjb2RlZCBhbmQgdXBkYXRlZCBpcyBub3QgdGhlIGRlc2lyZWQgb25lICglZCB2cyAlZCkuCgBJbnZhbGlkIGNvbXBvbmVudCBpbmRleCAlZCAoPj0gJWQpLgoAb3BqX3JlYWRfaGVhZGVyKCkgc2hvdWxkIGJlIGNhbGxlZCBiZWZvcmUgb3BqX3NldF9kZWNvZGVkX2NvbXBvbmVudHMoKS4KAE1lbW9yeSBhbGxvY2F0aW9uIGZhaWx1cmUgaW4gb3BqX2pwMl9hcHBseV9wY2xyKCkuCgBpbWFnZS0+Y29tcHNbJWRdLmRhdGEgPT0gTlVMTCBpbiBvcGpfanAyX2FwcGx5X3BjbHIoKS4KAGludmFsaWQgYm94IHNpemUgJWQgKCV4KQoARmFpbCB0byByZWFkIHRoZSBjdXJyZW50IG1hcmtlciBzZWdtZW50ICglI3gpCgBFcnJvciB3aXRoIFNJWiBtYXJrZXI6IElIRFIgdygldSkgaCgldSkgdnMuIFNJWiB3KCV1KSBoKCV1KQoARXJyb3IgcmVhZGluZyBDT0MgbWFya2VyIChiYWQgbnVtYmVyIG9mIGNvbXBvbmVudHMpCgBJb
12824nZhbGlkIG51bWJlciBvZiB0aWxlcyA6ICV1IHggJXUgKG1heGltdW0gZml4ZWQgYnkganBlZzIwMDAgbm9ybSBpcyA2NTUzNSB0aWxlcykKAEludmFsaWQgbnVtYmVyIG9mIGNvbXBvbmVudHMgKGloZHIpCgBOb3QgZW5vdWdoIG1lbW9yeSB0byBoYW5kbGUgaW1hZ2UgaGVhZGVyIChpaGRyKQoAV3JvbmcgdmFsdWVzIGZvcjogdyglZCkgaCglZCkgbnVtY29tcHMoJWQpIChpaGRyKQoASW52YWxpZCB2YWx1ZXMgZm9yIGNvbXAgPSAlZCA6IGR4PSV1IGR5PSV1IChzaG91bGQgYmUgYmV0d2VlbiAxIGFuZCAyNTUgYWNjb3JkaW5nIHRvIHRoZSBKUEVHMjAwMCBub3JtKQoAQmFkIGltYWdlIGhlYWRlciBib3ggKGJhZCBzaXplKQoAQmFkIENPTFIgaGVhZGVyIGJveCAoYmFkIHNpemUpCgBCYWQgQlBDQyBoZWFkZXIgYm94IChiYWQgc2l6ZSkKAEVycm9yIHdpdGggU0laIG1hcmtlcjogbmVnYXRpdmUgb3IgemVybyBpbWFnZSBzaXplICglbGxkIHggJWxsZCkKAHNraXA6IHNlZ21lbnQgdG9vIGxvbmcgKCVkKSB3aXRoIG1heCAoJWQpIGZvciBjb2RlYmxvY2sgJWQgKHA9JWQsIGI9JWQsIHI9JWQsIGM9JWQpCgByZWFkOiBzZWdtZW50IHRvbyBsb25nICglZCkgd2l0aCBtYXggKCVkKSBmb3IgY29kZWJsb2NrICVkIChwPSVkLCBiPSVkLCByPSVkLCBjPSVkKQoARGVzcGl0ZSBKUDIgQlBDIT0yNTUsIHByZWNpc2lvbiBhbmQvb3Igc2duZCB2YWx1ZXMgZm9yIGNvbXBbJWRdIGlzIGRpZmZlcmVudCB0aGFuIGNvbXBbMF06CiAgICAgICAgWzBdIHByZWMoJWQpIHNnbmQoJWQpIFslZF0gcHJlYyglZCkgc2duZCglZCkKAGJhZCBjb21wb25lbnQgbnVtYmVyIGluIFJHTiAoJWQgd2hlbiB0aGVyZSBhcmUgb25seSAlZCkKAEVycm9yIHdpdGggU0laIG1hcmtlcjogbnVtYmVyIG9mIGNvbXBvbmVudCBpcyBub3QgY29tcGF0aWJsZSB3aXRoIHRoZSByZW1haW5pbmcgbnVtYmVyIG9mIHBhcmFtZXRlcnMgKCAlZCB2cyAlZCkKAEVycm9yIHdpdGggU0laIG1hcmtlcjogaW52YWxpZCB0aWxlIHNpemUgKHRkeDogJWQsIHRkeTogJWQpCgBCYWQgQ09MUiBoZWFkZXIgYm94IChiYWQgc2l6ZTogJWQpCgBCYWQgQ09MUiBoZWFkZXIgYm94IChDSUVMYWIsIGJhZCBzaXplOiAlZCkKAFBURVJNIGNoZWNrIGZhaWx1cmU6ICVkIHJlbWFpbmluZyBieXRlcyBpbiBjb2RlIGJsb2NrICglZCB1c2VkIC8gJWQpCgBNYWxmb3JtZWQgSFQgY29kZWJsb2NrLiBPbmUgb2YgdGhlIGZvbGxvd2luZyBjb25kaXRpb24gaXMgbm90IG1ldDogMiA8PSBTY3VwIDw9IG1pbihMY3VwLCA0MDc5KQoASW52YWxpZCB2YWx1ZXMgZm9yIGNvbXAgPSAlZCA6IHByZWM9JXUgKHNob3VsZCBiZSBiZXR3ZWVuIDEgYW5kIDM4IGFjY29yZGluZyB0byB0aGUgSlBFRzIwMDAgbm9ybS4gT3BlbkpwZWcgb25seSBzdXBwb3J0cyB1cCB0byAzMSkKAEludmFsaWQgYml0IG51bWJlciAlZCBpbiBvcGpfdDJfcmVhZF9wYWNrZXRfaGVhZGVyKCkKAFN0cmVhbSBlcnJvciEKAEVycm9yIG9uIHdyaXRpbmcgc3RyZWFtIQoAU3RyZWFtIHJlYWNoZWQgaXRzIGVuZCAhCgBFeHBlY3RlZCBhIFNPQyBtYXJrZXIgCgBJbnZhbGlkIGJveCBzaXplICVkIGZvciBib3ggJyVjJWMlYyVjJy4gTmVlZCAlZCBieXRlcywgJWQgYnl0ZXMgcmVtYWluaW5nIAoATWFsZm9ybWVkIEhUIGNvZGVibG9jay4gRGVjb2RpbmcgdGhpcyBjb2RlYmxvY2sgaXMgc3RvcHBlZC4gVV9xIGlzIGxhcmdlciB0aGFuIHplcm8gYml0cGxhbmVzICsgMSAKAE1hbGZvcm1lZCBIVCBjb2RlYmxvY2suIERlY29kaW5nIHRoaXMgY29kZWJsb2NrIGlzIHN0b3BwZWQuIFVf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AAQAAAGBSAAAAUwAAATgAAAAAAABwUgAA8FIAAAE4AAABAAAAgFIAAABTAAABMAAAAAAAAJBSAABQUwAAATAAAAEAAACgUgAAYFMAAAEkAAAAAAAAsFIAAHBTAAABJAAAAQAAAMBSAACAUwAAARwAAAAAAADQUgAAsFMAAAEcAAABAAAA4FIAAMBTAAABFgAAAAAAANBUAADQUwAAARYAAAEAAADgVAAA4FMAAAFWAAAAAAAAEFMAAABTAAABVgAAAQAAACBTAADwUgAAAVQAAAAAAAAwUwAA8FIAAAFUAAABAAAAQFMAAABTAAABUQAAAAAAAFBTAAAQUwAAAVEAAAEAAABgUwAAIFMAAAFIAAAAAAAAcFMAADBTAAABSAAAAQAAAIBTAABAUwAAATgAAAAAAACQUwAAUFMAAAE4AAABAAAAoFMAAGBTAAABNAAAAAAAALBTAABwUwAAATQAAAEAAADAUwAAgFMAAAEwAAAAAAAA0FMAAJBTAAABMAAAAQAAAOBTAACgUwAAASgAAAAAAADwUwAAkFMAAAEoAAABAAAAAFQAAKBTAAABJAAAAAAAABBUAACwUwAAASQAAAEAAAAgVAAAwFMAAAEiAAAAAAAAMFQAANBTAAABIgAAAQAAAEBUAADgUwAAARwAAAAAAABQVAAA8FMAAAEcAAABAAAAYFQAAABUAAABGAAAAAAAAHBUAAAQVAAAARgAAAEAAACAVAAAIFQAAAEWAAAAAAAAkFQAADBUAAAB
12824FgAAAQAAAKBUAABAVAAAARQAAAAAAACwVAAAUFQAAAEUAAABAAAAwFQAAGBUAAABEgAAAAAAANBUAABwVAAAARIAAAEAAADgVAAAgFQAAAERAAAAAAAA8FQAAJBUAAABEQAAAQAAAABVAACgVAAAwQoAAAAAAAAQVQAAsFQAAMEKAAABAAAAIFUAAMBUAADBCQAAAAAAADBVAADQVAAAwQkAAAEAAABAVQAA4FQAAKEIAAAAAAAAUFUAAPBUAAChCAAAAQAAAGBVAAAAVQAAIQUAAAAAAABwVQAAEFUAACEFAAABAAAAgFUAACBVAABBBAAAAAAAAJBVAAAwVQAAQQQAAAEAAACgVQAAQFUAAKECAAAAAAAAsFUAAFBVAAChAgAAAQAAAMBVAABgVQAAIQIAAAAAAADQVQAAcFUAACECAAABAAAA4FUAAIBVAABBAQAAAAAAAPBVAACQVQAAQQEAAAEAAAAAVgAAoFUAABEBAAAAAAAAEFYAALBVAAARAQAAAQAAACBWAADAVQAAhQAAAAAAAAAwVgAA0FUAAIUAAAABAAAAQFYAAOBVAABJAAAAAAAAAFBWAADwVQAASQAAAAEAAABgVgAAAFYAACUAAAAAAAAAcFYAABBWAAAlAAAAAQAAAIBWAAAgVgAAFQAAAAAAAACQVgAAMFYAABUAAAABAAAAoFYAAEBWAAAJAAAAAAAAALBWAABQVgAACQAAAAEAAADAVgAAYFYAAAUAAAAAAAAA0FYAAHBWAAAFAAAAAQAAAOBWAACAVgAAAQAAAAAAAADQVgAAkFYAAAEAAAABAAAA4FYAAKBWAAABVgAAAAAAAPBWAADwVgAAAVYAAAEAAAAAVwAAAFcAAAABAwMBAgMDBQYHBwYGBwcAAQMDAQIDAwUGBwcGBgcHBQYHBwYGBwcICAgICAgICAUGBwcGBgcHCAgICAgICAgBAgMDAgIDAwYGBwcGBgcHAQIDAwICAwMGBgcHBgYHBwYGBwcGBgcHCAgICAgICAgGBgcHBgYHBwgICAgICAgIAwMEBAMDBAQHBwcHBwcHBwMDBAQDAwQEBwcHBwcHBwcHBwcHBwcHBwgICAgICAgIBwcHBwcHBwcICAgICAgICAMDBAQDAwQEBwcHBwcHBwcDAwQEAwMEBAcHBwcHBwcHBwcHBwcHBwcICAgICAgICAcHBwcHBwcHCAgICAgICAgBAgMDAgIDAwYGBwcGBgcHAQIDAwICAwMGBgcHBgYHBwYGBwcGBgcHCAgICAgICAgGBgcHBgYHBwgICAgICAgIAgIDAwICAwMGBgcHBgYHBwICAwMCAgMDBgYHBwYGBwcGBgcHBgYHBwgICAgICAgIBgYHBwYGBwcICAgICAgICAMDBAQDAwQEBwcHBwcHBwcDAwQEAwMEBAcHBwcHBwcHBwcHBwcHBwcICAgICAgICAcHBwcHBwcHCAgICAgICAgDAwQEAwMEBAcHBwcHBwcHAwMEBAMDBAQHBwcHBwcHBwcHBwcHBwcHCAgICAgICAgHBwcHBwcHBwgICAgICAgIAAEFBgECBgYDAwcHAwMHBwABBQYBAgYGAwMHBwMDBwcDAwcHAwMHBwQEBwcEBAcHAwMHBwMDBwcEBAcHBAQHBwECBgYCAgYGAwMHBwMDBwcBAgYGAgIGBgMDBwcDAwcHAwMHBwMDBwcEBAcHBAQHBwMDBwcDAwcHBAQHBwQEBwcFBggIBgYICAcHCAgHBwgIBQYICAYGCAgHBwgIBwcICAcHCAgHBwgIBwcICAcHCAgHBwgIBwcICAcHCAgHBwgIBgYICAYGCAgHBwgIBwcICAYGCAgGBggIBwcICAcHCAgHBwgIBwcICAcHCAgHBwgIBwcICAcHCAgHBwgIBwcICAECBgYCAgYGAwMHBwMDBwcBAgYGAgIGBgMDBwcDAwcHAwMHBwMDBwcEBAcHBAQHBwMDBwcDAwcHBAQHBwQEBwcCAgYGAgIGBgMDBwcDAwcHAgIGBgICBgYDAwcHAwMHBwMDBwcDAwcHBAQHBwQEBwcDAwcHAwMHBwQEBwcEBAcHBgYICAYGCAgHBwgIBwcICAYGCAgGBggIBwcICAcHCAgHBwgIBwcICAcHCAgHBwgIBwcICAcHCAgHBwgIBwcICAYGCAgGBggIBwcICAcHCAgGBggIBgYICAcHCAgHBwgIBwcICAcHCAgHBwgIBwcICAcHCAgHBwgIBwcICAcHCAgAAQMDAQIDAwUGBwcGBgcHAAEDAwECAwMFBgcHBgYHBwUGBwcGBgcHCAgICAgICAgFBgcHBgYHBwgICAgICAgIAQIDAwICAwMGBgcHBgYHBwECAwMCAgMDBgYHBwYGBwcGBgcHBgYHBwgICAgICAgIBgYHBwYGBwcICAgICAgICAMDBAQDAwQEBwcHBwcHBwcDAwQEAwMEBAcHBwcHBwcHBwcHBwcHBwcICAgICAgICAcHBwcHBwcHCAgICAgICAgDAwQEAwMEBAcHBwcHBwcHAwMEBAMDBAQHBwcHBwcHBwcHBwcHBwcHCAgICAgICAgHBwcHBwcHBwgICAgICAgIAQIDAwICAwMGBgcHBgYHBwECAwMCAgMDBgYHBwYGBwcGBgcHBgYHBwgICAgICAgIBgYHBwYGBwcICAgICAgICAICAwMCAgMDBgYHBwYGBwcCAgMDAgIDAwYGBwcGBgcHBgYHBwYGBwcICAgICAgICAYGBwcGBgcHCAgICAgICAgDAwQEAwMEBAcHBwcHBwcHAwMEBAMDBAQHBwcHBwcHBwcHBwcHBwcHCAgICAgICAgHBwcHBwcHBwgICAgICAgIAwMEBAMDBAQHBwcHBwcHBwMDBAQDAwQEBwcHBwcHBwcHBwcHBwcHBwgICAgICAgIBwcHBwcHBwcICAgICAgICAADAQQDBgQHAQQCBQQHBQcAAwEEAwYEBwEEAgUEBwUHAQQCBQQHBQcCBQIFBQcFBwEEAgUEBwUHAgUCBQUHBQcDBgQHBggHCAQHBQcHCAcIAwYEBwYIBwgEBwUHBwgHCAQHBQcHCAcIBQcFBwcIBwgEBwUHBwgHCAUHBQcHCAcIAQQCBQQHBQcCBQIFBQcFBwEEAgUEBwUHAgUCBQUHBQcCBQIFBQcFBwIFAgUFBwUHAgUCBQUHBQcCBQIFBQcFBwQHBQcHCAcIBQcFBwcIBwgEBwUHBwgHCAUHBQcHCAcIBQcFBwcIBwgFBwUHBwgHCAUHBQcHCAcIBQcFBwcIBwgDBgQHBggHCAQHBQcHCAcIAwYEBwYIBwgEBwUHBwgHCAQHBQcHCAcIBQcFBwcIBwgEBwUHBwgHCAUHBQcHCAcIBggHCAgICAgHCAcICAgICAYIBwgICAgIBwgHCAgICAgHCAcICAgICAcIBwgICAgIBwgHCAgICAgHCAcICAgICAQHBQcHCAcIBQcFBwcIBwgEBwUHBwgHCAUHBQcHCAcIBQcFBwcIBwgFBwUHBwgHCAUHBQcHCAcIBQcFBwcIBwgHCAcICAgICAcIBwgICAgIBwgHCAgICAgHCAcICAgICAcIBwgICAgIBwgHCAgICAgHCAcICAgICAcIBwgICAgICQkKCgkJCgoMDA0LDAwNCwkJCgoJCQoKDAwLDQwMCw0MDA0NDAwLCwwJDQoJDAoLDAwLCwwMDQ0MCQsKCQwKDQkJCgoJCQoKDAwNCwwMDQsJCQoKCQkKCgwMCw0MDAsNDAwNDQwMCwsMCQ0KCQwKCwwMCwsMDA0NDAkLCgkMCg0KCgoKCgoKCg0LDQsNCw0LCgoJCQoKCQkNCwwMDQsMDA0NDQ0LCwsLDQoNCgoLCgsNDQwMCwsMDA0KDAkKCwkMCgoJCQoKCQkLDQwMCw0MDAoKCgoKCgoKCw0LDQsNCw0LCwwMDQ0MDAsKDAkKDQkMCwsLCw0NDQ0LCgsKCg0KDQBBmcABCzcBAAEAAQABAAABAQAAAQEAAQABAAEAAQAAAAABAQEBAAAAAAABAAEAAAAAAQEBAQAAAAEAAQEBAEHZwAELNwEAAQABAAEAAAEBAAABAQABAAEAAQABAAAAAAEBAQEAAAAAAAEAAQAAAAABAQEBAAAAAQABAQEAQZnBAQsHAQABAAEAAQBBqcEBC5UCAQABAAEAAQAAAAABAQEBAAAAAAABAAEAAAAAAQEBAQAAAAAAAQABAQEAAAEBAAAAAQABAAEAAQEBAQEBAQEBAAEAAQABAAEAAAAAAQEBAQABAAABAQABAAAAAAEBAQEAAQABAQEBAQIAAAAEAAAABAAAAAgAAACQ/wAADAAAABkAAABS/wAAFAAAABoAAABT/wAAFAAAABsAAABe/wAAFAAAABwAAABc/wAAFAAAAB0AAABd/wAAFAAAAB4AAABf/wAAFAAAAB8AAABR/wAAAgAAACAAAABV/wAABAAAACEAAABX/wAABAAAACIAAABY/wAAEAAAACMAAABg/wAABAAAACQAAABh/wAAEAAAACUAAACR/wBByMMBC2Vj/wAABAAAACYAAABk/wAAFAAAACcAAAB0/wAAFAAAACgAAAB4/wAABAAAACkAAABQ/wAABAAAACoAAABZ/wAABAAAACsAAAB1/wAAFAAAACwAAAB3/wAAFAAAAC0AAAAAAAAAFABBwMQBCzUuAAAALwAAADAAAAAxAAAAMgAAADMAAAA0AAAANQAAACAgUGo3AAAAcHl0ZjgAAABoMnBqOQBBgMUBCzJyZGhpOgAAAHJsb2M7AAAAY2NwYjwAAABybGNwPQAAAHBhbWM+AAAAZmVkYz8AAABAZgBBwMUBC0EZAAsAGRkZAAAAAAUAAAAAAAAJAAAAAAsAAAAAAAAAABkACgoZGRkDCgcAAQAJCxgAAAkGCwAACwAGGQAAABkZGQBBkcYBCyEOAAAAAAAAAAAZAAsNGRkZAA0AAAIACQ4AAAAJAA4AAA4AQcvGAQsBDABB18YBCxUTAAAAABMAAAAACQwAAAAAAAwAAAwAQYXHAQsBEABBkccBCxUPAAAABA8AAAAACRAAAAAAABAAABAAQb/HAQsBEgBBy8cBCx4RAAAAABEAAAAACRIAAAAAABIAABIAABoAAAAaGhoAQYLIAQsOGgAAABoaGgAAAAAAAAkAQbPIAQsBFABBv8gBCxUXAAAAABcAAAAACRQAAAAAAB
12824QAABQAQe3IAQsBFgBB+cgBC2QVAAAAABUAAAAACRYAAAAAABYAABYAADAxMjM0NTY3ODlBQkNERUYAAAAAcAAAAHAAAABxAAAAcQAAAHEAAABxAAAAcQAAAHEAAABwAAAAcAAAAHEAAABwAAAAcAAAAHAAAABwAEGAygELHXEAAABxAAAAcAAAAHAAAAAAAAAAcAAAAAAAAABxAEGoywELCVBwAQAAAAAABQBBvMsBCwFrAEHUywELCmwAAABtAAAAuGsAQezLAQsBAgBB/MsBCwj//////////wBBwMwBCwEFAEHMzAELAW4AQeTMAQsObAAAAG8AAADIawAAAAQAQfzMAQsBAQBBjM0BCwX/////Cg==";
12825			return f;
12826		}
12827		var wasmBinaryFile;
12828		function getBinarySync(file) {
12829			if (file == wasmBinaryFile && wasmBinary) {
12830				return new Uint8Array(wasmBinary);
12831			}
12832			var binary = tryParseAsDataURI(file);
12833			if (binary) {
12834				return binary;
12835			}
12836			if (readBinary) {
12837				return readBinary(file);
12838			}
12839			throw 'sync fetching of the wasm failed: you can preload it to Module["wasmBinary"] manually, or emcc.py will do that for you when generating HTML (but not JS)';
12840		}
12841		function instantiateSync(file, info) {
12842			var module;
12843			var binary = getBinarySync(file);
12844			module = new WebAssembly.Module(binary);
12845			var instance = new WebAssembly.Instance(module, info);
12846			return [instance, module];
12847		}
12848		function getWasmImports() {
12849			return {
12850				a: wasmImports
12851			};
12852		}
12853		function createWasm() {
12854			function receiveInstance(instance, module) {
12855				wasmExports = instance.exports;
12856				wasmMemory = wasmExports["t"];
12857				updateMemoryViews();
12858				addOnInit(wasmExports["u"]);
12859				removeRunDependency("wasm-instantiate");
12860				return wasmExports;
12861			}
12862			addRunDependency("wasm-instantiate");
12863			var info = getWasmImports();
12864			if (Module["instantiateWasm"]) {
12865				try {
12866					return Module["instantiateWasm"](info, receiveInstance);
12867				} catch (e) {
12868					err(`Module.instantiateWasm callback failed with error: ${e}`);
12869					readyPromiseReject(e);
12870				}
12871			}
12872			wasmBinaryFile ??= findWasmBinary();
12873			var result = instantiateSync(wasmBinaryFile, info);
12874			return receiveInstance(result[0]);
12875		}
12876		class ExitStatus {
12877			name = "ExitStatus";
12878			constructor(status) {
12879				this.message = `Program terminated with exit(${status})`;
12880				this.status = status;
12881			}
12882		}
12883		var callRuntimeCallbacks = callbacks => {
12884			while (callbacks.length > 0) {
12885				callbacks.shift()(Module);
12886			}
12887		};
12888		var noExitRuntime = Module["noExitRuntime"] || true;
12889		var __abort_js = () => abort("");
12890		var __emscripten_memcpy_js = (dest, src, num) => HEAPU8.copyWithin(dest, src, src + num);
12891		var runtimeKeepaliveCounter = 0;
12892		var __emscripten_runtime_keepalive_clear = () => {
12893			noExitRuntime = false;
12894			runtimeKeepaliveCounter = 0;
12895		};
12896		var timers = {};
12897		var handleException = e => {
12898			if (e instanceof ExitStatus || e == "unwind") {
12899				return EXITSTATUS;
12900			}
12901			quit_(1, e);
12902		};
12903		var keepRuntimeAlive = () => noExitRuntime || runtimeKeepaliveCounter > 0;
12904		var _proc_exit = code => {
12905			EXITSTATUS = code;
12906			if (!keepRuntimeAlive()) {
12907				Module["onExit"]?.(code);
12908				ABORT = true;
12909			}
12910			quit_(code, new ExitStatus(code));
12911		};
12912		var exitJS = (status, implicit) => {
12913			EXITSTATUS = status;
12914			_proc_exit(status);
12915		};
12916		var _exit = exitJS;
12917		var maybeExit = () => {
12918			if (!keepRuntimeAlive()) {
12919				try {
12920					_exit(EXITSTATUS);
12921				} catch (e) {
12922					handleException(e);
12923				}
12924			}
12925		};
12926		var callUserCallback = func => {
12927			if (ABORT) {
12928				return;
12929			}
12930			try {
12931				func();
12932				maybeExit();
12933			} catch (e) {
12934				handleException(e);
12935			}
12936		};
12937		var _emscripten_get_now = () => performance.now();
12938		var __setitimer_js = (which, timeout_ms) => {
12939			if (timers[which]) {
12940				clearTimeout(timers[which].id);
12941				delete timers[which];
12942			}
12943			if (!timeout_ms) return 0;
12944			var id = setTimeout(() => {
12945				delete timers[which];
12946				callUserCallback(() => __emscripten_timeout(which, _emscripten_get_now()));
12947			}, timeout_ms);
12948			timers[which] = {
12949				id,
12950				timeout_ms
12951			};
12952			return 0;
12953		};
12954		function _copy_pixels_1(compG_ptr, nb_pixels) {
12955			compG_ptr >>= 2;
12956			const imageData = Module.imageData = new Uint8ClampedArray(nb_pixels);
12957			const compG = Module.HEAP32.subarray(compG_ptr, compG_ptr + nb_pixels);
12958			imageData.set(compG);
12959		}
12960		function _copy_pixels_3(compR_ptr, compG_ptr, compB_ptr, nb_pixels) {
12961			compR_ptr >>= 2;
12962			compG_ptr >>= 2;
12963			compB_ptr >>= 2;
12964			const imageData = Module.imageData = new Uint8ClampedArray(nb_pixels * 3);
12965			const compR = Module.HEAP32.subarray(compR_ptr, compR_ptr + nb_pixels);
12966			const compG = Module.HEAP32.subarray(compG_ptr, compG_ptr + nb_pixels);
12967			const compB = Module.HEAP32.subarray(compB_ptr, compB_ptr + nb_pixels);
12968			for (let i = 0; i < nb_pixels; i++) {
12969				imageData[3 * i] = compR[i];
12970				imageData[3 * i + 1] = compG[i];
12971				imageData[3 * i + 2] = compB[i];
12972			}
12973		}
12974		function _copy_pixels_4(compR_ptr, compG_ptr, compB_ptr, compA_ptr, nb_pixels) {
12975			compR_ptr >>= 2;
12976			compG_ptr >>= 2;
12977			compB_ptr >>= 2;
12978			compA_ptr >>= 2;
12979			const imageData = Module.imageData = new Uint8ClampedArray(nb_pixels * 4);
12980			const compR = Module.HEAP32.subarray(compR_ptr, compR_ptr + nb_pixels);
12981			const compG = Module.HEAP32.subarray(compG_ptr, compG_ptr + nb_pixels);
12982			const compB = Module.HEAP32.subarray(compB_ptr, compB_ptr + nb_pixels);
12983			const compA = Module.HEAP32.subarray(compA_ptr, compA_ptr + nb_pixels);
12984			for (let i = 0; i < nb_pixels; i++) {
12985				imageData[4 * i] = compR[i];
12986				imageData[4 * i + 1] = compG[i];
12987				imageData[4 * i + 2] = compB[i];
12988				imageData[4 * i + 3] = compA[i];
12989			}
12990		}
12991		var getHeapMax = () => 2147483648;
12992		var alignMemory = (size, alignment) => Math.ceil(size / alignment) * alignment;
12993		var growMemory = size => {
12994			var b = wasmMemory.buffer;
12995			var pages = (size - b.byteLength + 65535) / 65536 | 0;
12996			try {
12997				wasmMemory.grow(pages);
12998				updateMemoryViews();
12999				return 1;
13000			} catch (e) {}
13001		};
13002		var _emscripten_resize_heap = requestedSize => {
13003			var oldSize = HEAPU8.length;
13004			requestedSize >>>= 0;
13005			var maxHeapSize = getHeapMax();
13006			if (requestedSize > maxHeapSize) {
13007				return false;
13008			}
13009			for (var cutDown = 1; cutDown <= 4; cutDown *= 2) {
13010				var overGrownHeapSize = oldSize * (1 + .2 / cutDown);
13011				overGrownHeapSize = Math.min(overGrownHeapSize, requestedSize + 100663296);
13012				var newSize = Math.min(maxHeapSize, alignMemory(Math.max(requestedSize, overGrownHeapSize), 65536));
13013				var replacement = growMemory(newSize);
13014				if (replacement) {
13015					return true;
13016				}
13017			}
13018			return false;
13019		};
13020		var ENV = {};
13021		var getExecutableName = () => thisProgram || "./this.program";
13022		var getEnvStrings = () => {
13023			if (!getEnvStrings.strings) {
13024				var lang = (typeof navigator == "object" && navigator.languages && navigator.languages[0] || "C").replace("-", "_") + ".UTF-8";
13025				var env = {
13026					USER: "web_user",
13027					LOGNAME: "web_user",
13028					PATH: "/",
13029					PWD: "/",
13030					HOME: "/home/web_user",
13031					LANG: lang,
13032					_: getExecutableName()
13033				};
13034				for (var x in ENV) {
13035					if (ENV[x] === undefined) delete env[x];else env[x] = ENV[x];
13036				}
13037				var strings = [];
13038				for (var x in env) {
13039					strings.push(`${x}=${env[x]}`);
13040				}
13041				getEnvStrings.strings = strings;
13042			}
13043			return getEnvStrings.strings;
13044		};
13045		var stringToAscii = (str, buffer) => {
13046			for (var i = 0; i < str.length; ++i) {
13047				HEAP8[buffer++] = str.charCodeAt(i);
13048			}
13049			HEAP8[buffer] = 0;
13050		};
13051		var _environ_get = (__environ, environ_buf) => {
13052			var bufSize = 0;
13053			getEnvStrings().forEach((string, i) => {
13054				var ptr = environ_buf + bufSize;
13055				HEAPU32[__environ + i * 4 >> 2] = ptr;
13056				stringToAscii(string, ptr);
13057				bufSize += string.length + 1;
13058			});
13059			return 0;
13060		};
13061		var _environ_sizes_get = (penviron_count, penviron_buf_size) => {
13062			var strings = getEnvStrings();
13063			HEAPU32[penviron_count >> 2] = strings.length;
13064			var bufSize = 0;
13065			strings.forEach(string => bufSize += string.length + 1);
13066			HEAPU32[penviron_buf_size >> 2] = bufSize;
13067			return 0;
13068		};
13069		var _fd_close = fd => 52;
13070		var convertI32PairToI53Checked = (lo, hi) => hi + 2097152 >>> 0 < 4194305 - !!lo ? (lo >>> 0) + hi * 4294967296 : NaN;
13071		function _fd_seek(fd, offset_low, offset_high, whence, newOffset) {
13072			var offset = convertI32PairToI53Checked(offset_low, offset_high);
13073			return 70;
13074		}
13075		var printCharBuffers = [null, [], []];
13076		var UTF8Decoder = typeof TextDecoder != "undefined" ? new TextDecoder() : undefined;
13077		var UTF8ArrayToString = (heapOrArray, idx = 0, maxBytesToRead = NaN) => {
13078			var endIdx = idx + maxBytesToRead;
13079			var endPtr = idx;
13080			while (heapOrArray[endPtr] && !(endPtr >= endIdx)) ++endPtr;
13081			if (endPtr - idx > 16 && heapOrArray.buffer && UTF8Decoder) {
13082				return UTF8Decoder.decode(heapOrArray.subarray(idx, endPtr));
13083			}
13084			var str = "";
13085			while (idx < endPtr) {
13086				var u0 = heapOrArray[idx++];
13087				if (!(u0 & 128)) {
13088					str += String.fromCharCode(u0);
13089					continue;
13090				}
13091				var u1 = heapOrArray[idx++] & 63;
13092				if ((u0 & 224) == 192) {
13093					str += String.fromCharCode((u0 & 31) << 6 | u1);
13094					continue;
13095				}
13096				var u2 = heapOrArray[idx++] & 63;
13097				if ((u0 & 240) == 224) {
13098					u0 = (u0 & 15) << 12 | u1 << 6 | u2;
13099				} else {
13100					u0 = (u0 & 7) << 18 | u1 << 12 | u2 << 6 | heapOrArray[idx++] & 63;
13101				}
13102				if (u0 < 65536) {
13103					str += String.fromCharCode(u0);
13104				} else {
13105					var ch = u0 - 65536;
13106					str += String.fromCharCode(55296 | ch >> 10, 56320 | ch & 1023);
13107				}
13108			}
13109			return str;
13110		};
13111		var printChar = (stream, curr) => {
13112			var buffer = printCharBuffers[stream];
13113			if (curr === 0 || curr === 10) {
13114				(stream === 1 ? out : err)(UTF8ArrayToString(buffer));
13115				buffer.length = 0;
13116			} else {
13117				buffer.push(curr);
13118			}
13119		};
13120		var UTF8ToString = (ptr, maxBytesToRead) => ptr ? UTF8ArrayToString(HEAPU8, ptr, maxBytesToRead) : "";
13121		var _fd_write = (fd, iov, iovcnt, pnum) => {
13122			var num = 0;
13123			for (var i = 0; i < iovcnt; i++) {
13124				var ptr = HEAPU32[iov >> 2];
13125				var len = HEAPU32[iov + 4 >> 2];
13126				iov += 8;
13127				for (var j = 0; j < len; j++) {
13128					printChar(fd, HEAPU8[ptr + j]);
13129				}
13130				num += len;
13131			}
13132			HEAPU32[pnum >> 2] = num;
13133			return 0;
13134		};
13135		function _gray_to_rgba(compG_ptr, nb_pixels) {
13136			compG_ptr >>= 2;
13137			const imageData = Module.imageData = new Uint8ClampedArray(nb_pixels * 4);
13138			const compG = Module.HEAP32.subarray(compG_ptr, compG_ptr + nb_pixels);
13139			for (let i = 0; i < nb_pixels; i++) {
13140				imageData[4 * i] = imageData[4 * i + 1] = imageData[4 * i + 2] = compG[i];
13141				imageData[4 * i + 3] = 255;
13142			}
13143		}
13144		function _graya_to_rgba(compG_ptr, compA_ptr, nb_pixels) {
13145			compG_ptr >>= 2;
13146			compA_ptr >>= 2;
13147			const imageData = Module.imageData = new Uint8ClampedArray(nb_pixels * 4);
13148			const compG = Module.HEAP32.subarray(compG_ptr, compG_ptr + nb_pixels);
13149			const compA = Module.HEAP32.subarray(compA_ptr, compA_ptr + nb_pixels);
13150			for (let i = 0; i < nb_pixels; i++) {
13151				imageData[4 * i] = imageData[4 * i + 1] = imageData[4 * i + 2] = compG[i];
13152				imageData[4 * i + 3] = compA[i];
13153			}
13154		}
13155		function _jsPrintWarning(message_ptr) {
13156			const message = UTF8ToString(message_ptr);
13157			(Module.warn || console.warn)(`OpenJPEG: ${message}`);
13158		}
13159		function _rgb_to_rgba(compR_ptr, compG_ptr, compB_ptr, nb_pixels) {
13160			compR_ptr >>= 2;
13161			compG_ptr >>= 2;
13162			compB_ptr >>= 2;
13163			const imageData = Module.imageData = new Uint8ClampedArray(nb_pixels * 4);
13164			const compR = Module.HEAP32.subarray(compR_ptr, compR_ptr + nb_pixels);
13165			const compG = Module.HEAP32.subarray(compG_ptr, compG_ptr + nb_pixels);
13166			const compB = Module.HEAP32.subarray(compB_ptr, compB_ptr + nb_pixels);
13167			for (let i = 0; i < nb_pixels; i++) {
13168				imageData[4 * i] = compR[i];
13169				imageData[4 * i + 1] = compG[i];
13170				imageData[4 * i + 2] = compB[i];
13171				imageData[4 * i + 3] = 255;
13172			}
13173		}
13174		function _storeErrorMessage(message_ptr) {
13175			const message = UTF8ToString(message_ptr);
13176			if (!Module.errorMessages) {
13177				Module.errorMessages = message;
13178			} else {
13179				Module.errorMessages += "\n" + message;
13180			}
13181		}
13182		var wasmImports = {
13183			m: __abort_js,
13184			c: __emscripten_memcpy_js,
13185			l: __emscripten_runtime_keepalive_clear,
13186			n: __setitimer_js,
13187			g: _copy_pixels_1,
13188			f: _copy_pixels_3,
13189			e: _copy_pixels_4,
13190			o: _emscripten_resize_heap,
13191			p: _environ_get,
13192			q: _environ_sizes_get,
13193			r: _fd_close,
13194			j: _fd_seek,
13195			b: _fd_write,
13196			s: _gray_to_rgba,
13197			i: _graya_to_rgba,
13198			d: _jsPrintWarning,
13199			k: _proc_exit,
13200			h: _rgb_to_rgba,
13201			a: _storeErrorMessage
13202		};
13203		var wasmExports = createWasm();
13204		var ___wasm_call_ctors = wasmExports["u"];
13205		var _malloc = Module["_malloc"] = wasmExports["v"];
13206		var _free = Module["_free"] = wasmExports["w"];
13207		var _jp2_decode = Module["_jp2_decode"] = wasmExports["y"];
13208		var __emscripten_timeout = wasmExports["z"];
13209		var calledRun;
13210		dependenciesFulfilled = function runCaller() {
13211			if (!calledRun) run();
13212			if (!calledRun) dependenciesFulfilled = runCaller;
13213		};
13214		function run() {
13215			if (runDependencies > 0) {
13216				return;
13217			}
13218			preRun();
13219			if (runDependencies > 0) {
13220				return;
13221			}
13222			function doRun() {
13223				if (calledRun) return;
13224				calledRun = true;
13225				Module["calledRun"] = true;
13226				if (ABORT) return;
13227				initRuntime();
13228				readyPromiseResolve(Module);
13229				Module["onRuntimeInitialized"]?.();
13230				postRun();
13231			}
13232			if (Module["setStatus"]) {
13233				Module["setStatus"]("Running...");
13234				setTimeout(() => {
13235					setTimeout(() => Module["setStatus"](""), 1);
13236					doRun();
13237				}, 1);
13238			} else {
13239				doRun();
13240			}
13241		}
13242		if (Module["preInit"]) {
13243			if (typeof Module["preInit"] == "function") Module["preInit"] = [Module["preInit"]];
13244			while (Module["preInit"].length > 0) {
13245				Module["preInit"].pop()();
13246			}
13247		}
13248		run();
13249		moduleRtn = Module;
13250		return moduleRtn;
13251	};
13252})();
13253/* harmony default export */ const openjpeg = (OpenJPEG);
13254;// ./src/core/jpx.js
13255
13256
13257
13258
13259
13260
13261class JpxError extends BaseException {
13262	constructor(msg) {
13263		super(msg, "JpxError");
13264	}
13265}
13266class JpxImage {
13267	static #module = null;
13268	static decode(data, decoderOptions) {
13269		decoderOptions ||= {};
13270		this.#module ||= openjpeg({
13271			warn: warn
13272		});
13273		const imageData = this.#module.decode(data, decoderOptions);
13274		if (typeof imageData === "string") {
13275			throw new JpxError(imageData);
13276		}
13277		return imageData;
13278	}
13279	static cleanup() {
13280		this.#module = null;
13281	}
13282	static parseImageProperties(stream) {
13283		let newByte = stream.getByte();
13284		while (newByte >= 0) {
13285			const oldByte = newByte;
13286			newByte = stream.getByte();
13287			const code = oldByte << 8 | newByte;
13288			if (code === 0xff51) {
13289				stream.skip(4);
13290				const Xsiz = stream.getInt32() >>> 0;
13291				const Ysiz = stream.getInt32() >>> 0;
13292				const XOsiz = stream.getInt32() >>> 0;
13293				const YOsiz = stream.getInt32() >>> 0;
13294				stream.skip(16);
13295				const Csiz = stream.getUint16();
13296				return {
13297					width: Xsiz - XOsiz,
13298					height: Ysiz - YOsiz,
13299					bitsPerComponent: 8,
13300					componentsCount: Csiz
13301				};
13302			}
13303		}
13304		throw new JpxError("No size marker found in JPX stream");
13305	}
13306}
13307
13308;// ./src/core/jpx_stream.js
13309
13310
13311
13312class JpxStream extends DecodeStream {
13313	constructor(stream, maybeLength, params) {
13314		super(maybeLength);
13315		this.stream = stream;
13316		this.dict = stream.dict;
13317		this.maybeLength = maybeLength;
13318		this.params = params;
13319	}
13320	get bytes() {
13321		return shadow(this, "bytes", this.stream.getBytes(this.maybeLength));
13322	}
13323	ensureBuffer(requested) {}
13324	readBlock(decoderOptions) {
13325		this.decodeImage(null, decoderOptions);
13326	}
13327	decodeImage(bytes, decoderOptions) {
13328		if (this.eof) {
13329			return this.buffer;
13330		}
13331		bytes ||= this.bytes;
13332		this.buffer = JpxImage.decode(bytes, decoderOptions);
13333		this.bufferLength = this.buffer.length;
13334		this.eof = true;
13335		return this.buffer;
13336	}
13337	get canAsyncDecodeImageFromBuffer() {
13338		return this.stream.isAsync;
13339	}
13340}
13341
13342;// ./src/core/lzw_stream.js
13343
13344
13345
13346
13347
13348
13349
13350class LZWStream extends DecodeStream {
13351	constructor(str, maybeLength, earlyChange) {
13352		super(maybeLength);
13353		this.str = str;
13354		this.dict = str.dict;
13355		this.cachedData = 0;
13356		this.bitsCached = 0;
13357		const maxLzwDictionarySize = 4096;
13358		const lzwState = {
13359			earlyChange,
13360			codeLength: 9,
13361			nextCode: 258,
13362			dictionaryValues: new Uint8Array(maxLzwDictionarySize),
13363			dictionaryLengths: new Uint16Array(maxLzwDictionarySize),
13364			dictionaryPrevCodes: new Uint16Array(maxLzwDictionarySize),
13365			currentSequence: new Uint8Array(maxLzwDictionarySize),
13366			currentSequenceLength: 0
13367		};
13368		for (let i = 0; i < 256; ++i) {
13369			lzwState.dictionaryValues[i] = i;
13370			lzwState.dictionaryLengths[i] = 1;
13371		}
13372		this.lzwState = lzwState;
13373	}
13374	readBits(n) {
13375		let bitsCached = this.bitsCached;
13376		let cachedData = this.cachedData;
13377		while (bitsCached < n) {
13378			const c = this.str.getByte();
13379			if (c === -1) {
13380				this.eof = true;
13381				return null;
13382			}
13383			cachedData = cachedData << 8 | c;
13384			bitsCached += 8;
13385		}
13386		this.bitsCached = bitsCached -= n;
13387		this.cachedData = cachedData;
13388		this.lastCode = null;
13389		return cachedData >>> bitsCached & (1 << n) - 1;
13390	}
13391	readBlock() {
13392		const blockSize = 512,
13393			decodedSizeDelta = blockSize;
13394		let estimatedDecodedSize = blockSize * 2;
13395		let i, j, q;
13396		const lzwState = this.lzwState;
13397		if (!lzwState) {
13398			return;
13399		}
13400		const earlyChange = lzwState.earlyChange;
13401		let nextCode = lzwState.nextCode;
13402		const dictionaryValues = lzwState.dictionaryValues;
13403		const dictionaryLengths = lzwState.dictionaryLengths;
13404		const dictionaryPrevCodes = lzwState.dictionaryPrevCodes;
13405		let codeLength = lzwState.codeLength;
13406		let prevCode = lzwState.prevCode;
vendor: 4,124 bytes, lines 13407-13542
13407		const currentSequence = lzwState.currentSequence;
13408		let currentSequenceLength = lzwState.currentSequenceLength;
13409		let decodedLength = 0;
13410		let currentBufferLength = this.bufferLength;
13411		let buffer = this.ensureBuffer(this.bufferLength + estimatedDecodedSize);
13412		for (i = 0; i < blockSize; i++) {
13413			const code = this.readBits(codeLength);
13414			const hasPrev = currentSequenceLength > 0;
13415			if (code < 256) {
13416				currentSequence[0] = code;
13417				currentSequenceLength = 1;
13418			} else if (code >= 258) {
13419				if (code < nextCode) {
13420					currentSequenceLength = dictionaryLengths[code];
13421					for (j = currentSequenceLength - 1, q = code; j >= 0; j--) {
13422						currentSequence[j] = dictionaryValues[q];
13423						q = dictionaryPrevCodes[q];
13424					}
13425				} else {
13426					currentSequence[currentSequenceLength++] = currentSequence[0];
13427				}
13428			} else if (code === 256) {
13429				codeLength = 9;
13430				nextCode = 258;
13431				currentSequenceLength = 0;
13432				continue;
13433			} else {
13434				this.eof = true;
13435				delete this.lzwState;
13436				break;
13437			}
13438			if (hasPrev) {
13439				dictionaryPrevCodes[nextCode] = prevCode;
13440				dictionaryLengths[nextCode] = dictionaryLengths[prevCode] + 1;
13441				dictionaryValues[nextCode] = currentSequence[0];
13442				nextCode++;
13443				codeLength = nextCode + earlyChange & nextCode + earlyChange - 1 ? codeLength : Math.min(Math.log(nextCode + earlyChange) / 0.6931471805599453 + 1, 12) | 0;
13444			}
13445			prevCode = code;
13446			decodedLength += currentSequenceLength;
13447			if (estimatedDecodedSize < decodedLength) {
13448				do {
13449					estimatedDecodedSize += decodedSizeDelta;
13450				} while (estimatedDecodedSize < decodedLength);
13451				buffer = this.ensureBuffer(this.bufferLength + estimatedDecodedSize);
13452			}
13453			for (j = 0; j < currentSequenceLength; j++) {
13454				buffer[currentBufferLength++] = currentSequence[j];
13455			}
13456		}
13457		lzwState.nextCode = nextCode;
13458		lzwState.codeLength = codeLength;
13459		lzwState.prevCode = prevCode;
13460		lzwState.currentSequenceLength = currentSequenceLength;
13461		this.bufferLength = currentBufferLength;
13462	}
13463}
13464
13465;// ./src/core/predictor_stream.js
13466
13467
13468
13469
13470
13471
13472
13473
13474
13475class PredictorStream extends DecodeStream {
13476	constructor(str, maybeLength, params) {
13477		super(maybeLength);
13478		if (!(params instanceof Dict)) {
13479			return str;
13480		}
13481		const predictor = this.predictor = params.get("Predictor") || 1;
13482		if (predictor <= 1) {
13483			return str;
13484		}
13485		if (predictor !== 2 && (predictor < 10 || predictor > 15)) {
13486			throw new FormatError(`Unsupported predictor: ${predictor}`);
13487		}
13488		this.readBlock = predictor === 2 ? this.readBlockTiff : this.readBlockPng;
13489		this.str = str;
13490		this.dict = str.dict;
13491		const colors = this.colors = params.get("Colors") || 1;
13492		const bits = this.bits = params.get("BPC", "BitsPerComponent") || 8;
13493		const columns = this.columns = params.get("Columns") || 1;
13494		this.pixBytes = colors * bits + 7 >> 3;
13495		this.rowBytes = columns * colors * bits + 7 >> 3;
13496		return this;
13497	}
13498	readBlockTiff() {
13499		const rowBytes = this.rowBytes;
13500		const bufferLength = this.bufferLength;
13501		const buffer = this.ensureBuffer(bufferLength + rowBytes);
13502		const bits = this.bits;
13503		const colors = this.colors;
13504		const rawBytes = this.str.getBytes(rowBytes);
13505		this.eof = !rawBytes.length;
13506		if (this.eof) {
13507			return;
13508		}
13509		let inbuf = 0,
13510			outbuf = 0;
13511		let inbits = 0,
13512			outbits = 0;
13513		let pos = bufferLength;
13514		let i;
13515		if (bits === 1 && colors === 1) {
13516			for (i = 0; i < rowBytes; ++i) {
13517				let c = rawBytes[i] ^ inbuf;
13518				c ^= c >> 1;
13519				c ^= c >> 2;
13520				c ^= c >> 4;
13521				inbuf = (c & 1) << 7;
13522				buffer[pos++] = c;
13523			}
13524		} else if (bits === 8) {
13525			for (i = 0; i < colors; ++i) {
13526				buffer[pos++] = rawBytes[i];
13527			}
13528			for (; i < rowBytes; ++i) {
13529				buffer[pos] = buffer[pos - colors] + rawBytes[i];
13530				pos++;
13531			}
13532		} else if (bits === 16) {
13533			const bytesPerPixel = colors * 2;
13534			for (i = 0; i < bytesPerPixel; ++i) {
13535				buffer[pos++] = rawBytes[i];
13536			}
13537			for (; i < rowBytes; i += 2) {
13538				const sum = ((rawBytes[i] & 0xff) << 8) + (rawBytes[i + 1] & 0xff) + ((buffer[pos - bytesPerPixel] & 0xff) << 8) + (buffer[pos - bytesPerPixel + 1] & 0xff);
13539				buffer[pos++] = sum >> 8 & 0xff;
13540				buffer[pos++] = sum & 0xff;
13541			}
13542		} else {
vendor: 4,167 bytes, lines 13543-13739
13543			const compArray = new Uint8Array(colors + 1);
13544			const bitMask = (1 << bits) - 1;
13545			let j = 0,
13546				k = bufferLength;
13547			const columns = this.columns;
13548			for (i = 0; i < columns; ++i) {
13549				for (let kk = 0; kk < colors; ++kk) {
13550					if (inbits < bits) {
13551						inbuf = inbuf << 8 | rawBytes[j++] & 0xff;
13552						inbits += 8;
13553					}
13554					compArray[kk] = compArray[kk] + (inbuf >> inbits - bits) & bitMask;
13555					inbits -= bits;
13556					outbuf = outbuf << bits | compArray[kk];
13557					outbits += bits;
13558					if (outbits >= 8) {
13559						buffer[k++] = outbuf >> outbits - 8 & 0xff;
13560						outbits -= 8;
13561					}
13562				}
13563			}
13564			if (outbits > 0) {
13565				buffer[k++] = (outbuf << 8 - outbits) + (inbuf & (1 << 8 - outbits) - 1);
13566			}
13567		}
13568		this.bufferLength += rowBytes;
13569	}
13570	readBlockPng() {
13571		const rowBytes = this.rowBytes;
13572		const pixBytes = this.pixBytes;
13573		const predictor = this.str.getByte();
13574		const rawBytes = this.str.getBytes(rowBytes);
13575		this.eof = !rawBytes.length;
13576		if (this.eof) {
13577			return;
13578		}
13579		const bufferLength = this.bufferLength;
13580		const buffer = this.ensureBuffer(bufferLength + rowBytes);
13581		let prevRow = buffer.subarray(bufferLength - rowBytes, bufferLength);
13582		if (prevRow.length === 0) {
13583			prevRow = new Uint8Array(rowBytes);
13584		}
13585		let i,
13586			j = bufferLength,
13587			up,
13588			c;
13589		switch (predictor) {
13590			case 0:
13591				for (i = 0; i < rowBytes; ++i) {
13592					buffer[j++] = rawBytes[i];
13593				}
13594				break;
13595			case 1:
13596				for (i = 0; i < pixBytes; ++i) {
13597					buffer[j++] = rawBytes[i];
13598				}
13599				for (; i < rowBytes; ++i) {
13600					buffer[j] = buffer[j - pixBytes] + rawBytes[i] & 0xff;
13601					j++;
13602				}
13603				break;
13604			case 2:
13605				for (i = 0; i < rowBytes; ++i) {
13606					buffer[j++] = prevRow[i] + rawBytes[i] & 0xff;
13607				}
13608				break;
13609			case 3:
13610				for (i = 0; i < pixBytes; ++i) {
13611					buffer[j++] = (prevRow[i] >> 1) + rawBytes[i];
13612				}
13613				for (; i < rowBytes; ++i) {
13614					buffer[j] = (prevRow[i] + buffer[j - pixBytes] >> 1) + rawBytes[i] & 0xff;
13615					j++;
13616				}
13617				break;
13618			case 4:
13619				for (i = 0; i < pixBytes; ++i) {
13620					up = prevRow[i];
13621					c = rawBytes[i];
13622					buffer[j++] = up + c;
13623				}
13624				for (; i < rowBytes; ++i) {
13625					up = prevRow[i];
13626					const upLeft = prevRow[i - pixBytes];
13627					const left = buffer[j - pixBytes];
13628					const p = left + up - upLeft;
13629					let pa = p - left;
13630					if (pa < 0) {
13631						pa = -pa;
13632					}
13633					let pb = p - up;
13634					if (pb < 0) {
13635						pb = -pb;
13636					}
13637					let pc = p - upLeft;
13638					if (pc < 0) {
13639						pc = -pc;
13640					}
13641					c = rawBytes[i];
13642					if (pa <= pb && pa <= pc) {
13643						buffer[j++] = left + c;
13644					} else if (pb <= pc) {
13645						buffer[j++] = up + c;
13646					} else {
13647						buffer[j++] = upLeft + c;
13648					}
13649				}
13650				break;
13651			default:
13652				throw new FormatError(`Unsupported predictor: ${predictor}`);
13653		}
13654		this.bufferLength += rowBytes;
13655	}
13656}
13657
13658;// ./src/core/run_length_stream.js
13659
13660class RunLengthStream extends DecodeStream {
13661	constructor(str, maybeLength) {
13662		super(maybeLength);
13663		this.str = str;
13664		this.dict = str.dict;
13665	}
13666	readBlock() {
13667		const repeatHeader = this.str.getBytes(2);
13668		if (!repeatHeader || repeatHeader.length < 2 || repeatHeader[0] === 128) {
13669			this.eof = true;
13670			return;
13671		}
13672		let buffer;
13673		let bufferLength = this.bufferLength;
13674		let n = repeatHeader[0];
13675		if (n < 128) {
13676			buffer = this.ensureBuffer(bufferLength + n + 1);
13677			buffer[bufferLength++] = repeatHeader[1];
13678			if (n > 0) {
13679				const source = this.str.getBytes(n);
13680				buffer.set(source, bufferLength);
13681				bufferLength += n;
13682			}
13683		} else {
13684			n = 257 - n;
13685			const b = repeatHeader[1];
13686			buffer = this.ensureBuffer(bufferLength + n + 1);
13687			for (let i = 0; i < n; i++) {
13688				buffer[bufferLength++] = b;
13689			}
13690		}
13691		this.bufferLength = bufferLength;
13692	}
13693}
13694
13695;// ./src/core/parser.js
13696
13697
13698
13699
13700
13701
13702
13703
13704
13705
13706
13707
13708
13709
13710
13711
13712
13713
13714
13715
13716
13717
13718
13719const MAX_LENGTH_TO_CACHE = 1000;
13720function getInlineImageCacheKey(bytes) {
13721	const strBuf = [],
13722		ii = bytes.length;
13723	let i = 0;
13724	while (i < ii - 1) {
13725		strBuf.push(bytes[i++] << 8 | bytes[i++]);
13726	}
13727	if (i < ii) {
13728		strBuf.push(bytes[i]);
13729	}
13730	return ii + "_" + String.fromCharCode.apply(null, strBuf);
13731}
13732class Parser {
13733	constructor({
13734		lexer,
13735		xref,
13736		allowStreams = false,
13737		recoveryMode = false
13738	}) {
13739		this.lexer = lexer;
vendor: 22,317 bytes, lines 13740-14605
13740		this.xref = xref;
13741		this.allowStreams = allowStreams;
13742		this.recoveryMode = recoveryMode;
13743		this.imageCache = Object.create(null);
13744		this._imageId = 0;
13745		this.refill();
13746	}
13747	refill() {
13748		this.buf1 = this.lexer.getObj();
13749		this.buf2 = this.lexer.getObj();
13750	}
13751	shift() {
13752		if (this.buf2 instanceof Cmd && this.buf2.cmd === "ID") {
13753			this.buf1 = this.buf2;
13754			this.buf2 = null;
13755		} else {
13756			this.buf1 = this.buf2;
13757			this.buf2 = this.lexer.getObj();
13758		}
13759	}
13760	tryShift() {
13761		try {
13762			this.shift();
13763			return true;
13764		} catch (e) {
13765			if (e instanceof MissingDataException) {
13766				throw e;
13767			}
13768			return false;
13769		}
13770	}
13771	getObj(cipherTransform = null) {
13772		const buf1 = this.buf1;
13773		this.shift();
13774		if (buf1 instanceof Cmd) {
13775			switch (buf1.cmd) {
13776				case "BI":
13777					return this.makeInlineImage(cipherTransform);
13778				case "[":
13779					const array = [];
13780					while (!isCmd(this.buf1, "]") && this.buf1 !== EOF) {
13781						array.push(this.getObj(cipherTransform));
13782					}
13783					if (this.buf1 === EOF) {
13784						if (this.recoveryMode) {
13785							return array;
13786						}
13787						throw new ParserEOFException("End of file inside array.");
13788					}
13789					this.shift();
13790					return array;
13791				case "<<":
13792					const dict = new Dict(this.xref);
13793					while (!isCmd(this.buf1, ">>") && this.buf1 !== EOF) {
13794						if (!(this.buf1 instanceof Name)) {
13795							info("Malformed dictionary: key must be a name object");
13796							this.shift();
13797							continue;
13798						}
13799						const key = this.buf1.name;
13800						this.shift();
13801						if (this.buf1 === EOF) {
13802							break;
13803						}
13804						dict.set(key, this.getObj(cipherTransform));
13805					}
13806					if (this.buf1 === EOF) {
13807						if (this.recoveryMode) {
13808							return dict;
13809						}
13810						throw new ParserEOFException("End of file inside dictionary.");
13811					}
13812					if (isCmd(this.buf2, "stream")) {
13813						return this.allowStreams ? this.makeStream(dict, cipherTransform) : dict;
13814					}
13815					this.shift();
13816					return dict;
13817				default:
13818					return buf1;
13819			}
13820		}
13821		if (Number.isInteger(buf1)) {
13822			if (Number.isInteger(this.buf1) && isCmd(this.buf2, "R")) {
13823				const ref = Ref.get(buf1, this.buf1);
13824				this.shift();
13825				this.shift();
13826				return ref;
13827			}
13828			return buf1;
13829		}
13830		if (typeof buf1 === "string") {
13831			if (cipherTransform) {
13832				return cipherTransform.decryptString(buf1);
13833			}
13834			return buf1;
13835		}
13836		return buf1;
13837	}
13838	findDefaultInlineStreamEnd(stream) {
13839		const E = 0x45,
13840			I = 0x49,
13841			SPACE = 0x20,
13842			LF = 0xa,
13843			CR = 0xd,
13844			NUL = 0x0;
13845		const {
13846				knownCommands
13847			} = this.lexer,
13848			startPos = stream.pos,
13849			n = 15;
13850		let state = 0,
13851			ch,
13852			maybeEIPos;
13853		while ((ch = stream.getByte()) !== -1) {
13854			if (state === 0) {
13855				state = ch === E ? 1 : 0;
13856			} else if (state === 1) {
13857				state = ch === I ? 2 : 0;
13858			} else {
13859				if (ch === SPACE || ch === LF || ch === CR) {
13860					maybeEIPos = stream.pos;
13861					const followingBytes = stream.peekBytes(n);
13862					const ii = followingBytes.length;
13863					if (ii === 0) {
13864						break;
13865					}
13866					for (let i = 0; i < ii; i++) {
13867						ch = followingBytes[i];
13868						if (ch === NUL && followingBytes[i + 1] !== NUL) {
13869							continue;
13870						}
13871						if (ch !== LF && ch !== CR && (ch < SPACE || ch > 0x7f)) {
13872							state = 0;
13873							break;
13874						}
13875					}
13876					if (state !== 2) {
13877						continue;
13878					}
13879					if (!knownCommands) {
13880						warn("findDefaultInlineStreamEnd - `lexer.knownCommands` is undefined.");
13881						continue;
13882					}
13883					const tmpLexer = new Lexer(new Stream(followingBytes.slice()), knownCommands);
13884					tmpLexer._hexStringWarn = () => {};
13885					let numArgs = 0;
13886					while (true) {
13887						const nextObj = tmpLexer.getObj();
13888						if (nextObj === EOF) {
13889							state = 0;
13890							break;
13891						}
13892						if (nextObj instanceof Cmd) {
13893							const knownCommand = knownCommands[nextObj.cmd];
13894							if (!knownCommand) {
13895								state = 0;
13896								break;
13897							} else if (knownCommand.variableArgs ? numArgs <= knownCommand.numArgs : numArgs === knownCommand.numArgs) {
13898								break;
13899							}
13900							numArgs = 0;
13901							continue;
13902						}
13903						numArgs++;
13904					}
13905					if (state === 2) {
13906						break;
13907					}
13908				} else {
13909					state = 0;
13910				}
13911			}
13912		}
13913		if (ch === -1) {
13914			warn("findDefaultInlineStreamEnd: " + "Reached the end of the stream without finding a valid EI marker");
13915			if (maybeEIPos) {
13916				warn('... trying to recover by using the last "EI" occurrence.');
13917				stream.skip(-(stream.pos - maybeEIPos));
13918			}
13919		}
13920		let endOffset = 4;
13921		stream.skip(-endOffset);
13922		ch = stream.peekByte();
13923		stream.skip(endOffset);
13924		if (!isWhiteSpace(ch)) {
13925			endOffset--;
13926		}
13927		return stream.pos - endOffset - startPos;
13928	}
13929	findDCTDecodeInlineStreamEnd(stream) {
13930		const startPos = stream.pos;
13931		let foundEOI = false,
13932			b,
13933			markerLength;
13934		while ((b = stream.getByte()) !== -1) {
13935			if (b !== 0xff) {
13936				continue;
13937			}
13938			switch (stream.getByte()) {
13939				case 0x00:
13940					break;
13941				case 0xff:
13942					stream.skip(-1);
13943					break;
13944				case 0xd9:
13945					foundEOI = true;
13946					break;
13947				case 0xc0:
13948				case 0xc1:
13949				case 0xc2:
13950				case 0xc3:
13951				case 0xc5:
13952				case 0xc6:
13953				case 0xc7:
13954				case 0xc9:
13955				case 0xca:
13956				case 0xcb:
13957				case 0xcd:
13958				case 0xce:
13959				case 0xcf:
13960				case 0xc4:
13961				case 0xcc:
13962				case 0xda:
13963				case 0xdb:
13964				case 0xdc:
13965				case 0xdd:
13966				case 0xde:
13967				case 0xdf:
13968				case 0xe0:
13969				case 0xe1:
13970				case 0xe2:
13971				case 0xe3:
13972				case 0xe4:
13973				case 0xe5:
13974				case 0xe6:
13975				case 0xe7:
13976				case 0xe8:
13977				case 0xe9:
13978				case 0xea:
13979				case 0xeb:
13980				case 0xec:
13981				case 0xed:
13982				case 0xee:
13983				case 0xef:
13984				case 0xfe:
13985					markerLength = stream.getUint16();
13986					if (markerLength > 2) {
13987						stream.skip(markerLength - 2);
13988					} else {
13989						stream.skip(-2);
13990					}
13991					break;
13992			}
13993			if (foundEOI) {
13994				break;
13995			}
13996		}
13997		const length = stream.pos - startPos;
13998		if (b === -1) {
13999			warn("Inline DCTDecode image stream: " + "EOI marker not found, searching for /EI/ instead.");
14000			stream.skip(-length);
14001			return this.findDefaultInlineStreamEnd(stream);
14002		}
14003		this.inlineStreamSkipEI(stream);
14004		return length;
14005	}
14006	findASCII85DecodeInlineStreamEnd(stream) {
14007		const TILDE = 0x7e,
14008			GT = 0x3e;
14009		const startPos = stream.pos;
14010		let ch;
14011		while ((ch = stream.getByte()) !== -1) {
14012			if (ch === TILDE) {
14013				const tildePos = stream.pos;
14014				ch = stream.peekByte();
14015				while (isWhiteSpace(ch)) {
14016					stream.skip();
14017					ch = stream.peekByte();
14018				}
14019				if (ch === GT) {
14020					stream.skip();
14021					break;
14022				}
14023				if (stream.pos > tildePos) {
14024					const maybeEI = stream.peekBytes(2);
14025					if (maybeEI[0] === 0x45 && maybeEI[1] === 0x49) {
14026						break;
14027					}
14028				}
14029			}
14030		}
14031		const length = stream.pos - startPos;
14032		if (ch === -1) {
14033			warn("Inline ASCII85Decode image stream: " + "EOD marker not found, searching for /EI/ instead.");
14034			stream.skip(-length);
14035			return this.findDefaultInlineStreamEnd(stream);
14036		}
14037		this.inlineStreamSkipEI(stream);
14038		return length;
14039	}
14040	findASCIIHexDecodeInlineStreamEnd(stream) {
14041		const GT = 0x3e;
14042		const startPos = stream.pos;
14043		let ch;
14044		while ((ch = stream.getByte()) !== -1) {
14045			if (ch === GT) {
14046				break;
14047			}
14048		}
14049		const length = stream.pos - startPos;
14050		if (ch === -1) {
14051			warn("Inline ASCIIHexDecode image stream: " + "EOD marker not found, searching for /EI/ instead.");
14052			stream.skip(-length);
14053			return this.findDefaultInlineStreamEnd(stream);
14054		}
14055		this.inlineStreamSkipEI(stream);
14056		return length;
14057	}
14058	inlineStreamSkipEI(stream) {
14059		const E = 0x45,
14060			I = 0x49;
14061		let state = 0,
14062			ch;
14063		while ((ch = stream.getByte()) !== -1) {
14064			if (state === 0) {
14065				state = ch === E ? 1 : 0;
14066			} else if (state === 1) {
14067				state = ch === I ? 2 : 0;
14068			} else if (state === 2) {
14069				break;
14070			}
14071		}
14072	}
14073	makeInlineImage(cipherTransform) {
14074		const lexer = this.lexer;
14075		const stream = lexer.stream;
14076		const dictMap = Object.create(null);
14077		let dictLength;
14078		while (!isCmd(this.buf1, "ID") && this.buf1 !== EOF) {
14079			if (!(this.buf1 instanceof Name)) {
14080				throw new FormatError("Dictionary key must be a name object");
14081			}
14082			const key = this.buf1.name;
14083			this.shift();
14084			if (this.buf1 === EOF) {
14085				break;
14086			}
14087			dictMap[key] = this.getObj(cipherTransform);
14088		}
14089		if (lexer.beginInlineImagePos !== -1) {
14090			dictLength = stream.pos - lexer.beginInlineImagePos;
14091		}
14092		const filter = this.xref.fetchIfRef(dictMap.F || dictMap.Filter);
14093		let filterName;
14094		if (filter instanceof Name) {
14095			filterName = filter.name;
14096		} else if (Array.isArray(filter)) {
14097			const filterZero = this.xref.fetchIfRef(filter[0]);
14098			if (filterZero instanceof Name) {
14099				filterName = filterZero.name;
14100			}
14101		}
14102		const startPos = stream.pos;
14103		let length;
14104		switch (filterName) {
14105			case "DCT":
14106			case "DCTDecode":
14107				length = this.findDCTDecodeInlineStreamEnd(stream);
14108				break;
14109			case "A85":
14110			case "ASCII85Decode":
14111				length = this.findASCII85DecodeInlineStreamEnd(stream);
14112				break;
14113			case "AHx":
14114			case "ASCIIHexDecode":
14115				length = this.findASCIIHexDecodeInlineStreamEnd(stream);
14116				break;
14117			default:
14118				length = this.findDefaultInlineStreamEnd(stream);
14119		}
14120		let cacheKey;
14121		if (length < MAX_LENGTH_TO_CACHE && dictLength > 0) {
14122			const initialStreamPos = stream.pos;
14123			stream.pos = lexer.beginInlineImagePos;
14124			cacheKey = getInlineImageCacheKey(stream.getBytes(dictLength + length));
14125			stream.pos = initialStreamPos;
14126			const cacheEntry = this.imageCache[cacheKey];
14127			if (cacheEntry !== undefined) {
14128				this.buf2 = Cmd.get("EI");
14129				this.shift();
14130				cacheEntry.reset();
14131				return cacheEntry;
14132			}
14133		}
14134		const dict = new Dict(this.xref);
14135		for (const key in dictMap) {
14136			dict.set(key, dictMap[key]);
14137		}
14138		let imageStream = stream.makeSubStream(startPos, length, dict);
14139		if (cipherTransform) {
14140			imageStream = cipherTransform.createStream(imageStream, length);
14141		}
14142		imageStream = this.filter(imageStream, dict, length);
14143		imageStream.dict = dict;
14144		if (cacheKey !== undefined) {
14145			imageStream.cacheKey = `inline_img_${++this._imageId}`;
14146			this.imageCache[cacheKey] = imageStream;
14147		}
14148		this.buf2 = Cmd.get("EI");
14149		this.shift();
14150		return imageStream;
14151	}
14152	#findStreamLength(startPos) {
14153		const {
14154			stream
14155		} = this.lexer;
14156		stream.pos = startPos;
14157		const SCAN_BLOCK_LENGTH = 2048;
14158		const signatureLength = "endstream".length;
14159		const END_SIGNATURE = new Uint8Array([0x65, 0x6e, 0x64]);
14160		const endLength = END_SIGNATURE.length;
14161		const PARTIAL_SIGNATURE = [new Uint8Array([0x73, 0x74, 0x72, 0x65, 0x61, 0x6d]), new Uint8Array([0x73, 0x74, 0x65, 0x61, 0x6d]), new Uint8Array([0x73, 0x74, 0x72, 0x65, 0x61])];
14162		const normalLength = signatureLength - endLength;
14163		while (stream.pos < stream.end) {
14164			const scanBytes = stream.peekBytes(SCAN_BLOCK_LENGTH);
14165			const scanLength = scanBytes.length - signatureLength;
14166			if (scanLength <= 0) {
14167				break;
14168			}
14169			let pos = 0;
14170			while (pos < scanLength) {
14171				let j = 0;
14172				while (j < endLength && scanBytes[pos + j] === END_SIGNATURE[j]) {
14173					j++;
14174				}
14175				if (j >= endLength) {
14176					let found = false;
14177					for (const part of PARTIAL_SIGNATURE) {
14178						const partLen = part.length;
14179						let k = 0;
14180						while (k < partLen && scanBytes[pos + j + k] === part[k]) {
14181							k++;
14182						}
14183						if (k >= normalLength) {
14184							found = true;
14185							break;
14186						}
14187						if (k >= partLen) {
14188							const lastByte = scanBytes[pos + j + k];
14189							if (isWhiteSpace(lastByte)) {
14190								info(`Found "${bytesToString([...END_SIGNATURE, ...part])}" when ` + "searching for endstream command.");
14191								found = true;
14192							}
14193							break;
14194						}
14195					}
14196					if (found) {
14197						stream.pos += pos;
14198						return stream.pos - startPos;
14199					}
14200				}
14201				pos++;
14202			}
14203			stream.pos += scanLength;
14204		}
14205		return -1;
14206	}
14207	makeStream(dict, cipherTransform) {
14208		const lexer = this.lexer;
14209		let stream = lexer.stream;
14210		lexer.skipToNextLine();
14211		const startPos = stream.pos - 1;
14212		let length = dict.get("Length");
14213		if (!Number.isInteger(length)) {
14214			info(`Bad length "${length && length.toString()}" in stream.`);
14215			length = 0;
14216		}
14217		stream.pos = startPos + length;
14218		lexer.nextChar();
14219		if (this.tryShift() && isCmd(this.buf2, "endstream")) {
14220			this.shift();
14221		} else {
14222			length = this.#findStreamLength(startPos);
14223			if (length < 0) {
14224				throw new FormatError("Missing endstream command.");
14225			}
14226			lexer.nextChar();
14227			this.shift();
14228			this.shift();
14229		}
14230		this.shift();
14231		stream = stream.makeSubStream(startPos, length, dict);
14232		if (cipherTransform) {
14233			stream = cipherTransform.createStream(stream, length);
14234		}
14235		stream = this.filter(stream, dict, length);
14236		stream.dict = dict;
14237		return stream;
14238	}
14239	filter(stream, dict, length) {
14240		let filter = dict.get("F", "Filter");
14241		let params = dict.get("DP", "DecodeParms");
14242		if (filter instanceof Name) {
14243			if (Array.isArray(params)) {
14244				warn("/DecodeParms should not be an Array, when /Filter is a Name.");
14245			}
14246			return this.makeFilter(stream, filter.name, length, params);
14247		}
14248		let maybeLength = length;
14249		if (Array.isArray(filter)) {
14250			const filterArray = filter;
14251			const paramsArray = params;
14252			for (let i = 0, ii = filterArray.length; i < ii; ++i) {
14253				filter = this.xref.fetchIfRef(filterArray[i]);
14254				if (!(filter instanceof Name)) {
14255					throw new FormatError(`Bad filter name "${filter}"`);
14256				}
14257				params = null;
14258				if (Array.isArray(paramsArray) && i in paramsArray) {
14259					params = this.xref.fetchIfRef(paramsArray[i]);
14260				}
14261				stream = this.makeFilter(stream, filter.name, maybeLength, params);
14262				maybeLength = null;
14263			}
14264		}
14265		return stream;
14266	}
14267	makeFilter(stream, name, maybeLength, params) {
14268		if (maybeLength === 0) {
14269			warn(`Empty "${name}" stream.`);
14270			return new NullStream();
14271		}
14272		try {
14273			switch (name) {
14274				case "Fl":
14275				case "FlateDecode":
14276					if (params) {
14277						return new PredictorStream(new FlateStream(stream, maybeLength), maybeLength, params);
14278					}
14279					return new FlateStream(stream, maybeLength);
14280				case "LZW":
14281				case "LZWDecode":
14282					let earlyChange = 1;
14283					if (params) {
14284						if (params.has("EarlyChange")) {
14285							earlyChange = params.get("EarlyChange");
14286						}
14287						return new PredictorStream(new LZWStream(stream, maybeLength, earlyChange), maybeLength, params);
14288					}
14289					return new LZWStream(stream, maybeLength, earlyChange);
14290				case "DCT":
14291				case "DCTDecode":
14292					return new JpegStream(stream, maybeLength, params);
14293				case "JPX":
14294				case "JPXDecode":
14295					return new JpxStream(stream, maybeLength, params);
14296				case "A85":
14297				case "ASCII85Decode":
14298					return new Ascii85Stream(stream, maybeLength);
14299				case "AHx":
14300				case "ASCIIHexDecode":
14301					return new AsciiHexStream(stream, maybeLength);
14302				case "CCF":
14303				case "CCITTFaxDecode":
14304					return new CCITTFaxStream(stream, maybeLength, params);
14305				case "RL":
14306				case "RunLengthDecode":
14307					return new RunLengthStream(stream, maybeLength);
14308				case "JBIG2Decode":
14309					return new Jbig2Stream(stream, maybeLength, params);
14310			}
14311			warn(`Filter "${name}" is not supported.`);
14312			return stream;
14313		} catch (ex) {
14314			if (ex instanceof MissingDataException) {
14315				throw ex;
14316			}
14317			warn(`Invalid stream: "${ex}"`);
14318			return new NullStream();
14319		}
14320	}
14321}
14322const specialChars = [1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 2, 0, 0, 2, 2, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0];
14323function toHexDigit(ch) {
14324	if (ch >= 0x30 && ch <= 0x39) {
14325		return ch & 0x0f;
14326	}
14327	if (ch >= 0x41 && ch <= 0x46 || ch >= 0x61 && ch <= 0x66) {
14328		return (ch & 0x0f) + 9;
14329	}
14330	return -1;
14331}
14332class Lexer {
14333	constructor(stream, knownCommands = null) {
14334		this.stream = stream;
14335		this.nextChar();
14336		this.strBuf = [];
14337		this.knownCommands = knownCommands;
14338		this._hexStringNumWarn = 0;
14339		this.beginInlineImagePos = -1;
14340	}
14341	nextChar() {
14342		return this.currentChar = this.stream.getByte();
14343	}
14344	peekChar() {
14345		return this.stream.peekByte();
14346	}
14347	getNumber() {
14348		let ch = this.currentChar;
14349		let eNotation = false;
14350		let divideBy = 0;
14351		let sign = 1;
14352		if (ch === 0x2d) {
14353			sign = -1;
14354			ch = this.nextChar();
14355			if (ch === 0x2d) {
14356				ch = this.nextChar();
14357			}
14358		} else if (ch === 0x2b) {
14359			ch = this.nextChar();
14360		}
14361		if (ch === 0x0a || ch === 0x0d) {
14362			do {
14363				ch = this.nextChar();
14364			} while (ch === 0x0a || ch === 0x0d);
14365		}
14366		if (ch === 0x2e) {
14367			divideBy = 10;
14368			ch = this.nextChar();
14369		}
14370		if (ch < 0x30 || ch > 0x39) {
14371			const msg = `Invalid number: ${String.fromCharCode(ch)} (charCode ${ch})`;
14372			if (isWhiteSpace(ch) || ch === -1) {
14373				info(`Lexer.getNumber - "${msg}".`);
14374				return 0;
14375			}
14376			throw new FormatError(msg);
14377		}
14378		let baseValue = ch - 0x30;
14379		let powerValue = 0;
14380		let powerValueSign = 1;
14381		while ((ch = this.nextChar()) >= 0) {
14382			if (ch >= 0x30 && ch <= 0x39) {
14383				const currentDigit = ch - 0x30;
14384				if (eNotation) {
14385					powerValue = powerValue * 10 + currentDigit;
14386				} else {
14387					if (divideBy !== 0) {
14388						divideBy *= 10;
14389					}
14390					baseValue = baseValue * 10 + currentDigit;
14391				}
14392			} else if (ch === 0x2e) {
14393				if (divideBy === 0) {
14394					divideBy = 1;
14395				} else {
14396					break;
14397				}
14398			} else if (ch === 0x2d) {
14399				warn("Badly formatted number: minus sign in the middle");
14400			} else if (ch === 0x45 || ch === 0x65) {
14401				ch = this.peekChar();
14402				if (ch === 0x2b || ch === 0x2d) {
14403					powerValueSign = ch === 0x2d ? -1 : 1;
14404					this.nextChar();
14405				} else if (ch < 0x30 || ch > 0x39) {
14406					break;
14407				}
14408				eNotation = true;
14409			} else {
14410				break;
14411			}
14412		}
14413		if (divideBy !== 0) {
14414			baseValue /= divideBy;
14415		}
14416		if (eNotation) {
14417			baseValue *= 10 ** (powerValueSign * powerValue);
14418		}
14419		return sign * baseValue;
14420	}
14421	getString() {
14422		let numParen = 1;
14423		let done = false;
14424		const strBuf = this.strBuf;
14425		strBuf.length = 0;
14426		let ch = this.nextChar();
14427		while (true) {
14428			let charBuffered = false;
14429			switch (ch | 0) {
14430				case -1:
14431					warn("Unterminated string");
14432					done = true;
14433					break;
14434				case 0x28:
14435					++numParen;
14436					strBuf.push("(");
14437					break;
14438				case 0x29:
14439					if (--numParen === 0) {
14440						this.nextChar();
14441						done = true;
14442					} else {
14443						strBuf.push(")");
14444					}
14445					break;
14446				case 0x5c:
14447					ch = this.nextChar();
14448					switch (ch) {
14449						case -1:
14450							warn("Unterminated string");
14451							done = true;
14452							break;
14453						case 0x6e:
14454							strBuf.push("\n");
14455							break;
14456						case 0x72:
14457							strBuf.push("\r");
14458							break;
14459						case 0x74:
14460							strBuf.push("\t");
14461							break;
14462						case 0x62:
14463							strBuf.push("\b");
14464							break;
14465						case 0x66:
14466							strBuf.push("\f");
14467							break;
14468						case 0x5c:
14469						case 0x28:
14470						case 0x29:
14471							strBuf.push(String.fromCharCode(ch));
14472							break;
14473						case 0x30:
14474						case 0x31:
14475						case 0x32:
14476						case 0x33:
14477						case 0x34:
14478						case 0x35:
14479						case 0x36:
14480						case 0x37:
14481							let x = ch & 0x0f;
14482							ch = this.nextChar();
14483							charBuffered = true;
14484							if (ch >= 0x30 && ch <= 0x37) {
14485								x = (x << 3) + (ch & 0x0f);
14486								ch = this.nextChar();
14487								if (ch >= 0x30 && ch <= 0x37) {
14488									charBuffered = false;
14489									x = (x << 3) + (ch & 0x0f);
14490								}
14491							}
14492							strBuf.push(String.fromCharCode(x));
14493							break;
14494						case 0x0d:
14495							if (this.peekChar() === 0x0a) {
14496								this.nextChar();
14497							}
14498							break;
14499						case 0x0a:
14500							break;
14501						default:
14502							strBuf.push(String.fromCharCode(ch));
14503							break;
14504					}
14505					break;
14506				default:
14507					strBuf.push(String.fromCharCode(ch));
14508					break;
14509			}
14510			if (done) {
14511				break;
14512			}
14513			if (!charBuffered) {
14514				ch = this.nextChar();
14515			}
14516		}
14517		return strBuf.join("");
14518	}
14519	getName() {
14520		let ch, previousCh;
14521		const strBuf = this.strBuf;
14522		strBuf.length = 0;
14523		while ((ch = this.nextChar()) >= 0 && !specialChars[ch]) {
14524			if (ch === 0x23) {
14525				ch = this.nextChar();
14526				if (specialChars[ch]) {
14527					warn("Lexer_getName: " + "NUMBER SIGN (#) should be followed by a hexadecimal number.");
14528					strBuf.push("#");
14529					break;
14530				}
14531				const x = toHexDigit(ch);
14532				if (x !== -1) {
14533					previousCh = ch;
14534					ch = this.nextChar();
14535					const x2 = toHexDigit(ch);
14536					if (x2 === -1) {
14537						warn(`Lexer_getName: Illegal digit (${String.fromCharCode(ch)}) ` + "in hexadecimal number.");
14538						strBuf.push("#", String.fromCharCode(previousCh));
14539						if (specialChars[ch]) {
14540							break;
14541						}
14542						strBuf.push(String.fromCharCode(ch));
14543						continue;
14544					}
14545					strBuf.push(String.fromCharCode(x << 4 | x2));
14546				} else {
14547					strBuf.push("#", String.fromCharCode(ch));
14548				}
14549			} else {
14550				strBuf.push(String.fromCharCode(ch));
14551			}
14552		}
14553		if (strBuf.length > 127) {
14554			warn(`Name token is longer than allowed by the spec: ${strBuf.length}`);
14555		}
14556		return Name.get(strBuf.join(""));
14557	}
14558	_hexStringWarn(ch) {
14559		const MAX_HEX_STRING_NUM_WARN = 5;
14560		if (this._hexStringNumWarn++ === MAX_HEX_STRING_NUM_WARN) {
14561			warn("getHexString - ignoring additional invalid characters.");
14562			return;
14563		}
14564		if (this._hexStringNumWarn > MAX_HEX_STRING_NUM_WARN) {
14565			return;
14566		}
14567		warn(`getHexString - ignoring invalid character: ${ch}`);
14568	}
14569	getHexString() {
14570		const strBuf = this.strBuf;
14571		strBuf.length = 0;
14572		let ch = this.currentChar;
14573		let firstDigit = -1,
14574			digit = -1;
14575		this._hexStringNumWarn = 0;
14576		while (true) {
14577			if (ch < 0) {
14578				warn("Unterminated hex string");
14579				break;
14580			} else if (ch === 0x3e) {
14581				this.nextChar();
14582				break;
14583			} else if (specialChars[ch] === 1) {
14584				ch = this.nextChar();
14585				continue;
14586			} else {
14587				digit = toHexDigit(ch);
14588				if (digit === -1) {
14589					this._hexStringWarn(ch);
14590				} else if (firstDigit === -1) {
14591					firstDigit = digit;
14592				} else {
14593					strBuf.push(String.fromCharCode(firstDigit << 4 | digit));
14594					firstDigit = -1;
14595				}
14596				ch = this.nextChar();
14597			}
14598		}
14599		if (firstDigit !== -1) {
14600			strBuf.push(String.fromCharCode(firstDigit << 4));
14601		}
14602		return strBuf.join("");
14603	}
14604	getObj() {
14605		let comment = false;
vendor: 13,956 bytes, lines 14606-15096
14606		let ch = this.currentChar;
14607		while (true) {
14608			if (ch < 0) {
14609				return EOF;
14610			}
14611			if (comment) {
14612				if (ch === 0x0a || ch === 0x0d) {
14613					comment = false;
14614				}
14615			} else if (ch === 0x25) {
14616				comment = true;
14617			} else if (specialChars[ch] !== 1) {
14618				break;
14619			}
14620			ch = this.nextChar();
14621		}
14622		switch (ch | 0) {
14623			case 0x30:
14624			case 0x31:
14625			case 0x32:
14626			case 0x33:
14627			case 0x34:
14628			case 0x35:
14629			case 0x36:
14630			case 0x37:
14631			case 0x38:
14632			case 0x39:
14633			case 0x2b:
14634			case 0x2d:
14635			case 0x2e:
14636				return this.getNumber();
14637			case 0x28:
14638				return this.getString();
14639			case 0x2f:
14640				return this.getName();
14641			case 0x5b:
14642				this.nextChar();
14643				return Cmd.get("[");
14644			case 0x5d:
14645				this.nextChar();
14646				return Cmd.get("]");
14647			case 0x3c:
14648				ch = this.nextChar();
14649				if (ch === 0x3c) {
14650					this.nextChar();
14651					return Cmd.get("<<");
14652				}
14653				return this.getHexString();
14654			case 0x3e:
14655				ch = this.nextChar();
14656				if (ch === 0x3e) {
14657					this.nextChar();
14658					return Cmd.get(">>");
14659				}
14660				return Cmd.get(">");
14661			case 0x7b:
14662				this.nextChar();
14663				return Cmd.get("{");
14664			case 0x7d:
14665				this.nextChar();
14666				return Cmd.get("}");
14667			case 0x29:
14668				this.nextChar();
14669				throw new FormatError(`Illegal character: ${ch}`);
14670		}
14671		let str = String.fromCharCode(ch);
14672		if (ch < 0x20 || ch > 0x7f) {
14673			const nextCh = this.peekChar();
14674			if (nextCh >= 0x20 && nextCh <= 0x7f) {
14675				this.nextChar();
14676				return Cmd.get(str);
14677			}
14678		}
14679		const knownCommands = this.knownCommands;
14680		let knownCommandFound = knownCommands?.[str] !== undefined;
14681		while ((ch = this.nextChar()) >= 0 && !specialChars[ch]) {
14682			const possibleCommand = str + String.fromCharCode(ch);
14683			if (knownCommandFound && knownCommands[possibleCommand] === undefined) {
14684				break;
14685			}
14686			if (str.length === 128) {
14687				throw new FormatError(`Command token too long: ${str.length}`);
14688			}
14689			str = possibleCommand;
14690			knownCommandFound = knownCommands?.[str] !== undefined;
14691		}
14692		if (str === "true") {
14693			return true;
14694		}
14695		if (str === "false") {
14696			return false;
14697		}
14698		if (str === "null") {
14699			return null;
14700		}
14701		if (str === "BI") {
14702			this.beginInlineImagePos = this.stream.pos;
14703		}
14704		return Cmd.get(str);
14705	}
14706	skipToNextLine() {
14707		let ch = this.currentChar;
14708		while (ch >= 0) {
14709			if (ch === 0x0d) {
14710				ch = this.nextChar();
14711				if (ch === 0x0a) {
14712					this.nextChar();
14713				}
14714				break;
14715			} else if (ch === 0x0a) {
14716				this.nextChar();
14717				break;
14718			}
14719			ch = this.nextChar();
14720		}
14721	}
14722}
14723class Linearization {
14724	static create(stream) {
14725		function getInt(linDict, name, allowZeroValue = false) {
14726			const obj = linDict.get(name);
14727			if (Number.isInteger(obj) && (allowZeroValue ? obj >= 0 : obj > 0)) {
14728				return obj;
14729			}
14730			throw new Error(`The "${name}" parameter in the linearization ` + "dictionary is invalid.");
14731		}
14732		function getHints(linDict) {
14733			const hints = linDict.get("H");
14734			let hintsLength;
14735			if (Array.isArray(hints) && ((hintsLength = hints.length) === 2 || hintsLength === 4)) {
14736				for (let index = 0; index < hintsLength; index++) {
14737					const hint = hints[index];
14738					if (!(Number.isInteger(hint) && hint > 0)) {
14739						throw new Error(`Hint (${index}) in the linearization dictionary is invalid.`);
14740					}
14741				}
14742				return hints;
14743			}
14744			throw new Error("Hint array in the linearization dictionary is invalid.");
14745		}
14746		const parser = new Parser({
14747			lexer: new Lexer(stream),
14748			xref: null
14749		});
14750		const obj1 = parser.getObj();
14751		const obj2 = parser.getObj();
14752		const obj3 = parser.getObj();
14753		const linDict = parser.getObj();
14754		let obj, length;
14755		if (!(Number.isInteger(obj1) && Number.isInteger(obj2) && isCmd(obj3, "obj") && linDict instanceof Dict && typeof (obj = linDict.get("Linearized")) === "number" && obj > 0)) {
14756			return null;
14757		} else if ((length = getInt(linDict, "L")) !== stream.length) {
14758			throw new Error('The "L" parameter in the linearization dictionary ' + "does not equal the stream length.");
14759		}
14760		return {
14761			length,
14762			hints: getHints(linDict),
14763			objectNumberFirst: getInt(linDict, "O"),
14764			endFirst: getInt(linDict, "E"),
14765			numPages: getInt(linDict, "N"),
14766			mainXRefEntriesOffset: getInt(linDict, "T"),
14767			pageFirst: linDict.has("P") ? getInt(linDict, "P", true) : 0
14768		};
14769	}
14770}
14771
14772;// ./src/core/cmap.js
14773
14774
14775
14776
14777
14778
14779
14780
14781
14782
14783const BUILT_IN_CMAPS = ["Adobe-GB1-UCS2", "Adobe-CNS1-UCS2", "Adobe-Japan1-UCS2", "Adobe-Korea1-UCS2", "78-EUC-H", "78-EUC-V", "78-H", "78-RKSJ-H", "78-RKSJ-V", "78-V", "78ms-RKSJ-H", "78ms-RKSJ-V", "83pv-RKSJ-H", "90ms-RKSJ-H", "90ms-RKSJ-V", "90msp-RKSJ-H", "90msp-RKSJ-V", "90pv-RKSJ-H", "90pv-RKSJ-V", "Add-H", "Add-RKSJ-H", "Add-RKSJ-V", "Add-V", "Adobe-CNS1-0", "Adobe-CNS1-1", "Adobe-CNS1-2", "Adobe-CNS1-3", "Adobe-CNS1-4", "Adobe-CNS1-5", "Adobe-CNS1-6", "Adobe-GB1-0", "Adobe-GB1-1", "Adobe-GB1-2", "Adobe-GB1-3", "Adobe-GB1-4", "Adobe-GB1-5", "Adobe-Japan1-0", "Adobe-Japan1-1", "Adobe-Japan1-2", "Adobe-Japan1-3", "Adobe-Japan1-4", "Adobe-Japan1-5", "Adobe-Japan1-6", "Adobe-Korea1-0", "Adobe-Korea1-1", "Adobe-Korea1-2", "B5-H", "B5-V", "B5pc-H", "B5pc-V", "CNS-EUC-H", "CNS-EUC-V", "CNS1-H", "CNS1-V", "CNS2-H", "CNS2-V", "ETHK-B5-H", "ETHK-B5-V", "ETen-B5-H", "ETen-B5-V", "ETenms-B5-H", "ETenms-B5-V", "EUC-H", "EUC-V", "Ext-H", "Ext-RKSJ-H", "Ext-RKSJ-V", "Ext-V", "GB-EUC-H", "GB-EUC-V", "GB-H", "GB-V", "GBK-EUC-H", "GBK-EUC-V", "GBK2K-H", "GBK2K-V", "GBKp-EUC-H", "GBKp-EUC-V", "GBT-EUC-H", "GBT-EUC-V", "GBT-H", "GBT-V", "GBTpc-EUC-H", "GBTpc-EUC-V", "GBpc-EUC-H", "GBpc-EUC-V", "H", "HKdla-B5-H", "HKdla-B5-V", "HKdlb-B5-H", "HKdlb-B5-V", "HKgccs-B5-H", "HKgccs-B5-V", "HKm314-B5-H", "HKm314-B5-V", "HKm471-B5-H", "HKm471-B5-V", "HKscs-B5-H", "HKscs-B5-V", "Hankaku", "Hiragana", "KSC-EUC-H", "KSC-EUC-V", "KSC-H", "KSC-Johab-H", "KSC-Johab-V", "KSC-V", "KSCms-UHC-H", "KSCms-UHC-HW-H", "KSCms-UHC-HW-V", "KSCms-UHC-V", "KSCpc-EUC-H", "KSCpc-EUC-V", "Katakana", "NWP-H", "NWP-V", "RKSJ-H", "RKSJ-V", "Roman", "UniCNS-UCS2-H", "UniCNS-UCS2-V", "UniCNS-UTF16-H", "UniCNS-UTF16-V", "UniCNS-UTF32-H", "UniCNS-UTF32-V", "UniCNS-UTF8-H", "UniCNS-UTF8-V", "UniGB-UCS2-H", "UniGB-UCS2-V", "UniGB-UTF16-H", "UniGB-UTF16-V", "UniGB-UTF32-H", "UniGB-UTF32-V", "UniGB-UTF8-H", "UniGB-UTF8-V", "UniJIS-UCS2-H", "UniJIS-UCS2-HW-H", "UniJIS-UCS2-HW-V", "UniJIS-UCS2-V", "UniJIS-UTF16-H", "UniJIS-UTF16-V", "UniJIS-UTF32-H", "UniJIS-UTF32-V", "UniJIS-UTF8-H", "UniJIS-UTF8-V", "UniJIS2004-UTF16-H", "UniJIS2004-UTF16-V", "UniJIS2004-UTF32-H", "UniJIS2004-UTF32-V", "UniJIS2004-UTF8-H", "UniJIS2004-UTF8-V", "UniJISPro-UCS2-HW-V", "UniJISPro-UCS2-V", "UniJISPro-UTF8-V", "UniJISX0213-UTF32-H", "UniJISX0213-UTF32-V", "UniJISX02132004-UTF32-H", "UniJISX02132004-UTF32-V", "UniKS-UCS2-H", "UniKS-UCS2-V", "UniKS-UTF16-H", "UniKS-UTF16-V", "UniKS-UTF32-H", "UniKS-UTF32-V", "UniKS-UTF8-H", "UniKS-UTF8-V", "V", "WP-Symbol"];
14784const MAX_MAP_RANGE = 2 ** 24 - 1;
14785class CMap {
14786	constructor(builtInCMap = false) {
14787		this.codespaceRanges = [[], [], [], []];
14788		this.numCodespaceRanges = 0;
14789		this._map = [];
14790		this.name = "";
14791		this.vertical = false;
14792		this.useCMap = null;
14793		this.builtInCMap = builtInCMap;
14794	}
14795	addCodespaceRange(n, low, high) {
14796		this.codespaceRanges[n - 1].push(low, high);
14797		this.numCodespaceRanges++;
14798	}
14799	mapCidRange(low, high, dstLow) {
14800		if (high - low > MAX_MAP_RANGE) {
14801			throw new Error("mapCidRange - ignoring data above MAX_MAP_RANGE.");
14802		}
14803		while (low <= high) {
14804			this._map[low++] = dstLow++;
14805		}
14806	}
14807	mapBfRange(low, high, dstLow) {
14808		if (high - low > MAX_MAP_RANGE) {
14809			throw new Error("mapBfRange - ignoring data above MAX_MAP_RANGE.");
14810		}
14811		const lastByte = dstLow.length - 1;
14812		while (low <= high) {
14813			this._map[low++] = dstLow;
14814			const nextCharCode = dstLow.charCodeAt(lastByte) + 1;
14815			if (nextCharCode > 0xff) {
14816				dstLow = dstLow.substring(0, lastByte - 1) + String.fromCharCode(dstLow.charCodeAt(lastByte - 1) + 1) + "\x00";
14817				continue;
14818			}
14819			dstLow = dstLow.substring(0, lastByte) + String.fromCharCode(nextCharCode);
14820		}
14821	}
14822	mapBfRangeToArray(low, high, array) {
14823		if (high - low > MAX_MAP_RANGE) {
14824			throw new Error("mapBfRangeToArray - ignoring data above MAX_MAP_RANGE.");
14825		}
14826		const ii = array.length;
14827		let i = 0;
14828		while (low <= high && i < ii) {
14829			this._map[low] = array[i++];
14830			++low;
14831		}
14832	}
14833	mapOne(src, dst) {
14834		this._map[src] = dst;
14835	}
14836	lookup(code) {
14837		return this._map[code];
14838	}
14839	contains(code) {
14840		return this._map[code] !== undefined;
14841	}
14842	forEach(callback) {
14843		const map = this._map;
14844		const length = map.length;
14845		if (length <= 0x10000) {
14846			for (let i = 0; i < length; i++) {
14847				if (map[i] !== undefined) {
14848					callback(i, map[i]);
14849				}
14850			}
14851		} else {
14852			for (const i in map) {
14853				callback(i, map[i]);
14854			}
14855		}
14856	}
14857	charCodeOf(value) {
14858		const map = this._map;
14859		if (map.length <= 0x10000) {
14860			return map.indexOf(value);
14861		}
14862		for (const charCode in map) {
14863			if (map[charCode] === value) {
14864				return charCode | 0;
14865			}
14866		}
14867		return -1;
14868	}
14869	getMap() {
14870		return this._map;
14871	}
14872	readCharCode(str, offset, out) {
14873		let c = 0;
14874		const codespaceRanges = this.codespaceRanges;
14875		for (let n = 0, nn = codespaceRanges.length; n < nn; n++) {
14876			c = (c << 8 | str.charCodeAt(offset + n)) >>> 0;
14877			const codespaceRange = codespaceRanges[n];
14878			for (let k = 0, kk = codespaceRange.length; k < kk;) {
14879				const low = codespaceRange[k++];
14880				const high = codespaceRange[k++];
14881				if (c >= low && c <= high) {
14882					out.charcode = c;
14883					out.length = n + 1;
14884					return;
14885				}
14886			}
14887		}
14888		out.charcode = 0;
14889		out.length = 1;
14890	}
14891	getCharCodeLength(charCode) {
14892		const codespaceRanges = this.codespaceRanges;
14893		for (let n = 0, nn = codespaceRanges.length; n < nn; n++) {
14894			const codespaceRange = codespaceRanges[n];
14895			for (let k = 0, kk = codespaceRange.length; k < kk;) {
14896				const low = codespaceRange[k++];
14897				const high = codespaceRange[k++];
14898				if (charCode >= low && charCode <= high) {
14899					return n + 1;
14900				}
14901			}
14902		}
14903		return 1;
14904	}
14905	get length() {
14906		return this._map.length;
14907	}
14908	get isIdentityCMap() {
14909		if (!(this.name === "Identity-H" || this.name === "Identity-V")) {
14910			return false;
14911		}
14912		if (this._map.length !== 0x10000) {
14913			return false;
14914		}
14915		for (let i = 0; i < 0x10000; i++) {
14916			if (this._map[i] !== i) {
14917				return false;
14918			}
14919		}
14920		return true;
14921	}
14922}
14923class IdentityCMap extends CMap {
14924	constructor(vertical, n) {
14925		super();
14926		this.vertical = vertical;
14927		this.addCodespaceRange(n, 0, 0xffff);
14928	}
14929	mapCidRange(low, high, dstLow) {
14930		unreachable("should not call mapCidRange");
14931	}
14932	mapBfRange(low, high, dstLow) {
14933		unreachable("should not call mapBfRange");
14934	}
14935	mapBfRangeToArray(low, high, array) {
14936		unreachable("should not call mapBfRangeToArray");
14937	}
14938	mapOne(src, dst) {
14939		unreachable("should not call mapCidOne");
14940	}
14941	lookup(code) {
14942		return Number.isInteger(code) && code <= 0xffff ? code : undefined;
14943	}
14944	contains(code) {
14945		return Number.isInteger(code) && code <= 0xffff;
14946	}
14947	forEach(callback) {
14948		for (let i = 0; i <= 0xffff; i++) {
14949			callback(i, i);
14950		}
14951	}
14952	charCodeOf(value) {
14953		return Number.isInteger(value) && value <= 0xffff ? value : -1;
14954	}
14955	getMap() {
14956		const map = new Array(0x10000);
14957		for (let i = 0; i <= 0xffff; i++) {
14958			map[i] = i;
14959		}
14960		return map;
14961	}
14962	get length() {
14963		return 0x10000;
14964	}
14965	get isIdentityCMap() {
14966		unreachable("should not access .isIdentityCMap");
14967	}
14968}
14969function strToInt(str) {
14970	let a = 0;
14971	for (let i = 0; i < str.length; i++) {
14972		a = a << 8 | str.charCodeAt(i);
14973	}
14974	return a >>> 0;
14975}
14976function expectString(obj) {
14977	if (typeof obj !== "string") {
14978		throw new FormatError("Malformed CMap: expected string.");
14979	}
14980}
14981function expectInt(obj) {
14982	if (!Number.isInteger(obj)) {
14983		throw new FormatError("Malformed CMap: expected int.");
14984	}
14985}
14986function parseBfChar(cMap, lexer) {
14987	while (true) {
14988		let obj = lexer.getObj();
14989		if (obj === EOF) {
14990			break;
14991		}
14992		if (isCmd(obj, "endbfchar")) {
14993			return;
14994		}
14995		expectString(obj);
14996		const src = strToInt(obj);
14997		obj = lexer.getObj();
14998		expectString(obj);
14999		const dst = obj;
15000		cMap.mapOne(src, dst);
15001	}
15002}
15003function parseBfRange(cMap, lexer) {
15004	while (true) {
15005		let obj = lexer.getObj();
15006		if (obj === EOF) {
15007			break;
15008		}
15009		if (isCmd(obj, "endbfrange")) {
15010			return;
15011		}
15012		expectString(obj);
15013		const low = strToInt(obj);
15014		obj = lexer.getObj();
15015		expectString(obj);
15016		const high = strToInt(obj);
15017		obj = lexer.getObj();
15018		if (Number.isInteger(obj) || typeof obj === "string") {
15019			const dstLow = Number.isInteger(obj) ? String.fromCharCode(obj) : obj;
15020			cMap.mapBfRange(low, high, dstLow);
15021		} else if (isCmd(obj, "[")) {
15022			obj = lexer.getObj();
15023			const array = [];
15024			while (!isCmd(obj, "]") && obj !== EOF) {
15025				array.push(obj);
15026				obj = lexer.getObj();
15027			}
15028			cMap.mapBfRangeToArray(low, high, array);
15029		} else {
15030			break;
15031		}
15032	}
15033	throw new FormatError("Invalid bf range.");
15034}
15035function parseCidChar(cMap, lexer) {
15036	while (true) {
15037		let obj = lexer.getObj();
15038		if (obj === EOF) {
15039			break;
15040		}
15041		if (isCmd(obj, "endcidchar")) {
15042			return;
15043		}
15044		expectString(obj);
15045		const src = strToInt(obj);
15046		obj = lexer.getObj();
15047		expectInt(obj);
15048		const dst = obj;
15049		cMap.mapOne(src, dst);
15050	}
15051}
15052function parseCidRange(cMap, lexer) {
15053	while (true) {
15054		let obj = lexer.getObj();
15055		if (obj === EOF) {
15056			break;
15057		}
15058		if (isCmd(obj, "endcidrange")) {
15059			return;
15060		}
15061		expectString(obj);
15062		const low = strToInt(obj);
15063		obj = lexer.getObj();
15064		expectString(obj);
15065		const high = strToInt(obj);
15066		obj = lexer.getObj();
15067		expectInt(obj);
15068		const dstLow = obj;
15069		cMap.mapCidRange(low, high, dstLow);
15070	}
15071}
15072function parseCodespaceRange(cMap, lexer) {
15073	while (true) {
15074		let obj = lexer.getObj();
15075		if (obj === EOF) {
15076			break;
15077		}
15078		if (isCmd(obj, "endcodespacerange")) {
15079			return;
15080		}
15081		if (typeof obj !== "string") {
15082			break;
15083		}
15084		const low = strToInt(obj);
15085		obj = lexer.getObj();
15086		if (typeof obj !== "string") {
15087			break;
15088		}
15089		const high = strToInt(obj);
15090		cMap.addCodespaceRange(obj.length, low, high);
15091	}
15092	throw new FormatError("Invalid codespace range.");
15093}
15094function parseWMode(cMap, lexer) {
15095	const obj = lexer.getObj();
15096	if (Number.isInteger(obj)) {
vendor: 4,375 bytes, lines 15097-15223
15097		cMap.vertical = !!obj;
15098	}
15099}
15100function parseCMapName(cMap, lexer) {
15101	const obj = lexer.getObj();
15102	if (obj instanceof Name) {
15103		cMap.name = obj.name;
15104	}
15105}
15106async function parseCMap(cMap, lexer, fetchBuiltInCMap, useCMap) {
15107	let previous, embeddedUseCMap;
15108	objLoop: while (true) {
15109		try {
15110			const obj = lexer.getObj();
15111			if (obj === EOF) {
15112				break;
15113			} else if (obj instanceof Name) {
15114				if (obj.name === "WMode") {
15115					parseWMode(cMap, lexer);
15116				} else if (obj.name === "CMapName") {
15117					parseCMapName(cMap, lexer);
15118				}
15119				previous = obj;
15120			} else if (obj instanceof Cmd) {
15121				switch (obj.cmd) {
15122					case "endcmap":
15123						break objLoop;
15124					case "usecmap":
15125						if (previous instanceof Name) {
15126							embeddedUseCMap = previous.name;
15127						}
15128						break;
15129					case "begincodespacerange":
15130						parseCodespaceRange(cMap, lexer);
15131						break;
15132					case "beginbfchar":
15133						parseBfChar(cMap, lexer);
15134						break;
15135					case "begincidchar":
15136						parseCidChar(cMap, lexer);
15137						break;
15138					case "beginbfrange":
15139						parseBfRange(cMap, lexer);
15140						break;
15141					case "begincidrange":
15142						parseCidRange(cMap, lexer);
15143						break;
15144				}
15145			}
15146		} catch (ex) {
15147			if (ex instanceof MissingDataException) {
15148				throw ex;
15149			}
15150			warn("Invalid cMap data: " + ex);
15151			continue;
15152		}
15153	}
15154	if (!useCMap && embeddedUseCMap) {
15155		useCMap = embeddedUseCMap;
15156	}
15157	if (useCMap) {
15158		return extendCMap(cMap, fetchBuiltInCMap, useCMap);
15159	}
15160	return cMap;
15161}
15162async function extendCMap(cMap, fetchBuiltInCMap, useCMap) {
15163	cMap.useCMap = await createBuiltInCMap(useCMap, fetchBuiltInCMap);
15164	if (cMap.numCodespaceRanges === 0) {
15165		const useCodespaceRanges = cMap.useCMap.codespaceRanges;
15166		for (let i = 0; i < useCodespaceRanges.length; i++) {
15167			cMap.codespaceRanges[i] = useCodespaceRanges[i].slice();
15168		}
15169		cMap.numCodespaceRanges = cMap.useCMap.numCodespaceRanges;
15170	}
15171	cMap.useCMap.forEach(function (key, value) {
15172		if (!cMap.contains(key)) {
15173			cMap.mapOne(key, value);
15174		}
15175	});
15176	return cMap;
15177}
15178async function createBuiltInCMap(name, fetchBuiltInCMap) {
15179	if (name === "Identity-H") {
15180		return new IdentityCMap(false, 2);
15181	} else if (name === "Identity-V") {
15182		return new IdentityCMap(true, 2);
15183	}
15184	if (!BUILT_IN_CMAPS.includes(name)) {
15185		throw new Error("Unknown CMap name: " + name);
15186	}
15187	if (!fetchBuiltInCMap) {
15188		throw new Error("Built-in CMap parameters are not provided.");
15189	}
15190	const {
15191		cMapData,
15192		isCompressed
15193	} = await fetchBuiltInCMap(name);
15194	const cMap = new CMap(true);
15195	if (isCompressed) {
15196		return new BinaryCMapReader().process(cMapData, cMap, useCMap => extendCMap(cMap, fetchBuiltInCMap, useCMap));
15197	}
15198	const lexer = new Lexer(new Stream(cMapData));
15199	return parseCMap(cMap, lexer, fetchBuiltInCMap, null);
15200}
15201class CMapFactory {
15202	static async create({
15203		encoding,
15204		fetchBuiltInCMap,
15205		useCMap
15206	}) {
15207		if (encoding instanceof Name) {
15208			return createBuiltInCMap(encoding.name, fetchBuiltInCMap);
15209		} else if (encoding instanceof BaseStream) {
15210			const parsedCMap = await parseCMap(new CMap(), new Lexer(encoding), fetchBuiltInCMap, useCMap);
15211			if (parsedCMap.isIdentityCMap) {
15212				return createBuiltInCMap(parsedCMap.name, fetchBuiltInCMap);
15213			}
15214			return parsedCMap;
15215		}
15216		throw new Error("Encoding required.");
15217	}
15218}
15219
15220// EXTERNAL MODULE: ./node_modules/core-js/modules/esnext.iterator.to-array.js
15221var esnext_iterator_to_array = __webpack_require__(1795);
15222;// ./src/core/charsets.js
15223const ISOAdobeCharset = [".notdef", "space", "exclam", "quotedbl", "numbersign", "dollar", "percent", "ampersand", "quoteright", "parenleft", "parenright", "asterisk", "plus", "comma", "hyphen", "period", "slash", "zero", "one", "two", "three", "four", "five", "six", "seven", "eight", "nine", "colon", "semicolon", "less", "equal", "greater", "question", "at", "A", "B", "C", "D", "E", "F", "G", "H", "I", "J", "K", "L", "M", "N", "O", "P", "Q", "R", "S", "T", "U", "V", "W", "X", "Y", "Z", "bracketleft", "backslash", "bracketright", "asciicircum", "underscore", "quoteleft", "a", "b", "c", "d", "e", "f", "g", "h", "i", "j", "k", "l", "m", "n", "o", "p", "q", "r", "s", "t", "u", "v", "w", "x", "y", "z", "braceleft", "bar", "braceright", "asciitilde", "exclamdown", "cent", "sterling", "fraction", "yen", "florin", "section", "currency", "quotesingle", "quotedblleft", "guillemotleft", "guilsinglleft", "guilsinglright", "fi", "fl", "endash", "dagger", "daggerdbl", "periodce
15223ntered", "paragraph", "bullet", "quotesinglbase", "quotedblbase", "quotedblright", "guillemotright", "ellipsis", "perthousand", "questiondown", "grave", "acute", "circumflex", "tilde", "macron", "breve", "dotaccent", "dieresis", "ring", "cedilla", "hungarumlaut", "ogonek", "caron", "emdash", "AE", "ordfeminine", "Lslash", "Oslash", "OE", "ordmasculine", "ae", "dotlessi", "lslash", "oslash", "oe", "germandbls", "onesuperior", "logicalnot", "mu", "trademark", "Eth", "onehalf", "plusminus", "Thorn", "onequarter", "divide", "brokenbar", "degree", "thorn", "threequarters", "twosuperior", "registered", "minus", "eth", "multiply", "threesuperior", "copyright", "Aacute", "Acircumflex", "Adieresis", "Agrave", "Aring", "Atilde", "Ccedilla", "Eacute", "Ecircumflex", "Edieresis", "Egrave", "Iacute", "Icircumflex", "Idieresis", "Igrave", "Ntilde", "Oacute", "Ocircumflex", "Odieresis", "Ograve", "Otilde", "Scaron", "Uacute", "Ucircumflex", "Udieresis", "Ugrave", "Yacute", "Ydieresis", "Zcaron", "aacute", "acircumflex", "adieresis", "agrave", "aring", "atilde", "ccedilla", "eacute", "ecircumflex", "edieresis", "egrave", "iacute", "icircumflex", "idieresis", "igrave", "ntilde", "oacute", "ocircumflex", "odieresis", "ograve", "otilde", "scaron", "uacute", "ucircumflex", "udieresis", "ugrave", "yacute", "ydieresis", "zcaron"];
15224const ExpertCharset = [".notdef", "space", "exclamsmall", "Hungarumlautsmall", "dollaroldstyle", "dollarsuperior", "ampersandsmall", "Acutesmall", "parenleftsuperior", "parenrightsuperior", "twodotenleader", "onedotenleader", "comma", "hyphen", "period", "fraction", "zerooldstyle", "oneoldstyle", "twooldstyle", "threeoldstyle", "fouroldstyle", "fiveoldstyle", "sixoldstyle", "sevenoldstyle", "eightoldstyle", "nineoldstyle", "colon", "semicolon", "commasuperior", "threequartersemdash", "periodsuperior", "questionsmall", "asuperior", "bsuperior", "centsuperior", "dsuperior", "esuperior", "isuperior", "lsuperior", "msuperior", "nsuperior", "osuperior", "rsuperior", "ssuperior", "tsuperior", "ff", "fi", "fl", "ffi", "ffl", "parenleftinferior", "parenrightinferior", "Circumflexsmall", "hyphensuperior", "Gravesmall", "Asmall", "Bsmall", "Csmall", "Dsmall", "Esmall", "Fsmall", "Gsmall", "Hsmall", "Ismall", "Jsmall", "Ksmall", "Lsmall", "Msmall", "Nsmall", "Osmall", "Psmall", "Qsmall", "Rsmall", "Ssmall", "Tsmall", "Usmall", "Vsmall", "Wsmall", "Xsmall", "Ysmall", "Zsmall", "colonmonetary", "onefitted", "rupiah", "Tildesmall", "exclamdownsmall", "centoldstyle", "Lslashsmall", "Scaronsmall", "Zcaronsmall", "Dieresissmall", "Brevesmall", "Caronsmall", "Dotaccentsmall", "Macronsmall", "figuredash", "hypheninferior", "Ogoneksmall", "Ringsmall", "Cedillasmall", "onequarter", "onehalf", "threequarters", "questiondownsmall", "oneeighth", "threeeighths", "fiveeighths", "seveneighths", "onethird", "twothirds", "zerosuperior", "onesuperior", "twosuperior", "threesuperior", "foursuperior", "fivesuperior", "sixsuperior", "sevensuperior", "eightsuperior", "ninesuperior", "zeroinferior", "oneinferior", "twoinferior", "threeinferior", "fourinferior", "fiveinferior", "sixinferior", "seveninferior", "eightinferior", "nineinferior", "centinferior", "dollarinferior", "periodinferior", "commainferior", "Agravesmall", "Aacutesmall", "Acircumflexsmall", "Atildesmall", "Adieresissmall", "Aringsmall", "AEsmall", "Ccedillasmall", "Egravesmall", "Eacutesmall", "Ecircumflexsmall", "Edieresissmall", "Igravesmall", "Iacutesmall", "Icircumflexsmall", "Idieresissmall", "Ethsmall", "Ntildesmall", "Ogravesmall", "Oacutesmall", "Ocircumflexsmall", "Otildesmall", "Odieresissmall", "OEsmall", "Oslashsmall", "Ugravesmall", "Uacutesmall", "Ucircumflexsmall", "Udieresissmall", "Yacutesmall", "Thornsmall", "Ydieresissmall"];
15225const ExpertSubsetCharset = [".notdef", "space", "dollaroldstyle", "dollarsuperior", "parenleftsuperior", "parenrightsuperior", "twodotenleader", "onedotenleader", "comma", "hyphen", "period", "fraction", "zerooldstyle", "oneoldstyle", "twooldstyle", "threeoldstyle", "fouroldstyle", "fiveoldstyle", "sixoldstyle", "sevenoldstyle", "eightoldstyle", "nineoldstyle", "colon", "semicolon", "commasuperior", "threequartersemdash", "periodsuperior", "asuperior", "bsuperior", "centsuperior", "dsuperior", "esuperior", "isuperior", "lsuperior", "msuperior", "nsuperior", "osuperior", "rsuperior", "ssuperior", "tsuperior", "ff", "fi", "fl", "ffi", "ffl", "parenleftinferior", "parenrightinferior", "hyphensuperior", "colonmonetary", "onefitted", "rupiah", "centoldstyle", "figuredash", "hypheninferior", "onequarter", "onehalf", "threequarters", "oneeighth", "threeeighths", "fiveeighths", "seveneighths", "onethird", "twothirds", "zerosuperior", "onesuperior", "twosuperior", "threesuperior", "foursuperior", "fivesuperior", "sixsuperior", "sevensuperior", "eightsuperior", "ninesuperior", "zeroinferior", "oneinferior", "twoinferior", "threeinferior", "fourinferior", "fiveinferior", "sixinferior", "seveninferior", "eightinferior", "nineinferior", "centinferior", "dollarinferior", "periodinferior", "commainferior"];
vendor: 16,452 bytes, lines 15225-15235
15225
15226
15227;// ./src/core/encodings.js
15228const ExpertEncoding = ["", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "space", "exclamsmall", "Hungarumlautsmall", "", "dollaroldstyle", "dollarsuperior", "ampersandsmall", "Acutesmall", "parenleftsuperior", "parenrightsuperior", "twodotenleader", "onedotenleader", "comma", "hyphen", "period", "fraction", "zerooldstyle", "oneoldstyle", "twooldstyle", "threeoldstyle", "fouroldstyle", "fiveoldstyle", "sixoldstyle", "sevenoldstyle", "eightoldstyle", "nineoldstyle", "colon", "semicolon", "commasuperior", "threequartersemdash", "periodsuperior", "questionsmall", "", "asuperior", "bsuperior", "centsuperior", "dsuperior", "esuperior", "", "", "", "isuperior", "", "", "lsuperior", "msuperior", "nsuperior", "osuperior", "", "", "rsuperior", "ssuperior", "tsuperior", "", "ff", "fi", "fl", "ffi", "ffl", "parenleftinferior", "", "parenrightinferior", "Circumflexsmall", "hyphensuperior", "Gravesmall", "Asmall", "Bsmall", "Csmall", "Dsmall", "Esmall", "Fsmall", "Gsmall", "Hsmall", "Ismall", "Jsmall", "Ksmall", "Lsmall", "Msmall", "Nsmall", "Osmall", "Psmall", "Qsmall", "Rsmall", "Ssmall", "Tsmall", "Usmall", "Vsmall", "Wsmall", "Xsmall", "Ysmall", "Zsmall", "colonmonetary", "onefitted", "rupiah", "Tildesmall", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "exclamdownsmall", "centoldstyle", "Lslashsmall", "", "", "Scaronsmall", "Zcaronsmall", "Dieresissmall", "Brevesmall", "Caronsmall", "", "Dotaccentsmall", "", "", "Macronsmall", "", "", "figuredash", "hypheninferior", "", "", "Ogoneksmall", "Ringsmall", "Cedillasmall", "", "", "", "onequarter", "onehalf", "threequarters", "questiondownsmall", "oneeighth", "threeeighths", "fiveeighths", "seveneighths", "onethird", "twothirds", "", "", "zerosuperior", "onesuperior", "twosuperior", "threesuperior", "foursuperior", "fivesuperior", "sixsuperior", "sevensuperior", "eightsuperior", "ninesuperior", "zeroinferior", "oneinferior", "twoinferior", "threeinferior", "fourinferior", "fiveinferior", "sixinferior", "seveninferior", "eightinferior", "nineinferior", "centinferior", "dollarinferior", "periodinferior", "commainferior", "Agravesmall", "Aacutesmall", "Acircumflexsmall", "Atildesmall", "Adieresissmall", "Aringsmall", "AEsmall", "Ccedillasmall", "Egravesmall", "Eacutesmall", "Ecircumflexsmall", "Edieresissmall", "Igravesmall", "Iacutesmall", "Icircumflexsmall", "Idieresissmall", "Ethsmall", "Ntildesmall", "Ogravesmall", "Oacutesmall", "Ocircumflexsmall", "Otildesmall", "Odieresissmall", "OEsmall", "Oslashsmall", "Ugravesmall", "Uacutesmall", "Ucircumflexsmall", "Udieresissmall", "Yacutesmall", "Thornsmall", "Ydieresissmall"];
15229const MacExpertEncoding = ["", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "space", "exclamsmall", "Hungarumlautsmall", "centoldstyle", "dollaroldstyle", "dollarsuperior", "ampersandsmall", "Acutesmall", "parenleftsuperior", "parenrightsuperior", "twodotenleader", "onedotenleader", "comma", "hyphen", "period", "fraction", "zerooldstyle", "oneoldstyle", "twooldstyle", "threeoldstyle", "fouroldstyle", "fiveoldstyle", "sixoldstyle", "sevenoldstyle", "eightoldstyle", "nineoldstyle", "colon", "semicolon", "", "threequartersemdash", "", "questionsmall", "", "", "", "", "Ethsmall", "", "", "onequarter", "onehalf", "threequarters", "oneeighth", "threeeighths", "fiveeighths", "seveneighths", "onethird", "twothirds", "", "", "", "", "", "", "ff", "fi", "fl", "ffi", "ffl", "parenleftinferior", "", "parenrightinferior", "Circumflexsmall", "hypheninferior", "Gravesmall", "Asmall", "Bsmall", "Csmall", "Dsmall", "Esmall", "Fsmall", "Gsmall", "Hsmall", "Ismall", "Jsmall", "Ksmall", "Lsmall", "Msmall", "Nsmall", "Osmall", "Psmall", "Qsmall", "Rsmall", "Ssmall", "Tsmall", "Usmall", "Vsmall", "Wsmall", "Xsmall", "Ysmall", "Zsmall", "colonmonetary", "onefitted", "rupiah", "Tildesmall", "", "", "asuperior", "centsuperior", "", "", "", "", "Aacutesmall", "Agravesmall", "Acircumflexsmall", "Adieresissmall", "Atildesmall", "Aringsmall", "Ccedillasmall", "Eacutesmall", "Egravesmall", "Ecircumflexsmall", "Edieresissmall", "Iacutesmall", "Igravesmall", "Icircumflexsmall", "Idieresissmall", "Ntildesmall", "Oacutesmall", "Ogravesmall", "Ocircumflexsmall", "Odieresissmall", "Otildesmall", "Uacutesmall", "Ugravesmall", "Ucircumflexsmall", "Udieresissmall", "", "eightsuperior", "fourinferior", "threeinferior", "sixinferior", "eightinferior", "seveninferior", "Scaronsmall", "", "centinferior", "twoinferior", "", "Dieresissmall", "", "Caronsmall", "osuperior", "fiveinferior", "", "commainferior", "periodinferior", "Yacutesmall", "", "dollarinferior", "", "", "Thornsmall", "", "nineinferior", "zeroinferior", "Zcaronsmall", "AEsmall", "Oslashsmall", "questiondownsmall", "oneinferior", "Lslashsmall", "", "", "", "", "", "", "Cedillasmall", "", "", "", "", "", "OEsmall", "figuredash", "hyphensuperior", "", "", "", "", "exclamdownsmall", "", "Ydieresissmall", "", "onesuperior", "twosuperior", "threesuperior", "foursuperior", "fivesuperior", "sixsuperior", "sevensuperior", "ninesuperior", "zerosuperior", "", "esuperior", "rsuperior", "tsuperior", "", "", "isuperior", "ssuperior", "dsuperior", "", "", "", "", "", "lsuperior", "Ogoneksmall", "Brevesmall", "Macronsmall", "bsuperior", "nsuperior", "msuperior", "commasuperior", "periodsuperior", "Dotaccentsmall", "Ringsmall", "", "", "", ""];
15230const MacRomanEncoding = ["", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "space", "exclam", "quotedbl", "numbersign", "dollar", "percent", "ampersand", "quotesingle", "parenleft", "parenright", "asterisk", "plus", "comma", "hyphen", "period", "slash", "zero", "one", "two", "three", "four", "five", "six", "seven", "eight", "nine", "colon", "semicolon", "less", "equal", "greater", "question", "at", "A", "B", "C", "D", "E", "F", "G", "H", "I", "J", "K", "L", "M", "N", "O", "P", "Q", "R", "S", "T", "U", "V", "W", "X", "Y", "Z", "bracketleft", "backslash", "bracketright", "asciicircum", "underscore", "grave", "a", "b", "c", "d", "e", "f", "g", "h", "i", "j", "k", "l", "m", "n", "o", "p", "q", "r", "s", "t", "u", "v", "w", "x", "y", "z", "braceleft", "bar", "braceright", "asciitilde", "", "Adieresis", "Aring", "Ccedilla", "Eacute", "Ntilde", "Odieresis", "Udieresis", "aacute", "agrave", "acircumflex", "adieresis", "atilde", "aring", "ccedilla", "eacute", "egrave", "ecircumflex", "edieresis", "iacute", "igrave", "icircumflex", "idieresis", "ntilde", "oacute", "ograve", "ocircumflex", "odieresis", "otilde", "uacute", "ugrave", "ucircumflex", "udieresis", "dagger", "degree", "cent", "sterling", "section", "bullet", "paragraph", "germandbls", "registered", "copyright", "trademark", "acute", "dieresis", "notequal", "AE", "Oslash", "infinity", "plusminus", "lessequal", "greaterequal", "yen", "mu", "partialdiff", "summation", "product", "pi", "integral", "ordfeminine", "ordmasculine", "Omega", "ae", "oslash", "questiondown", "exclamdown", "logicalnot", "radical", "florin", "approxequal", "Delta", "guillemotleft", "guillemotright", "ellipsis", "space", "Agrave", "Atilde", "Otilde", "OE", "oe", "endash", "emdash", "quotedblleft", "quotedblright", "quoteleft", "quoteright", "divide", "lozenge", "ydieresis", "Ydieresis", "fraction", "currency", "guilsinglleft", "guilsinglright", "fi", "fl", "daggerdbl", "periodcentered", "quotesinglbase", "quotedblbase", "perthousand", "Acircumflex", "Ecircumflex", "Aacute", "Edieresis", "Egrave", "Iacute", "Icircumflex", "Idieresis", "Igrave", "Oacute", "Ocircumflex", "apple", "Ograve", "Uacute", "Ucircumflex", "Ugrave", "dotlessi", "circumflex", "tilde", "macron", "breve", "dotaccent", "ring", "cedilla", "hungarumlaut", "ogonek", "caron"];
15231const StandardEncoding = ["", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "space", "exclam", "quotedbl", "numbersign", "dollar", "percent", "ampersand", "quoteright", "parenleft", "parenright", "asterisk", "plus", "comma", "hyphen", "period", "slash", "zero", "one", "two", "three", "four", "five", "six", "seven", "eight", "nine", "colon", "semicolon", "less", "equal", "greater", "question", "at", "A", "B", "C", "D", "E", "F", "G", "H", "I", "J", "K", "L", "M", "N", "O", "P", "Q", "R", "S", "T", "U", "V", "W", "X", "Y", "Z", "bracketleft", "backslash", "bracketright", "asciicircum", "underscore", "quoteleft", "a", "b", "c", "d", "e", "f", "g", "h", "i", "j", "k", "l", "m", "n", "o", "p", "q", "r", "s", "t", "u", "v", "w", "x", "y", "z", "braceleft", "bar", "braceright", "asciitilde", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "exclamdown", "cent", "sterling", "fraction", "yen", "florin", "section", "currency", "quotesingle", "quotedblleft", "guillemotleft", "guilsinglleft", "guilsinglright", "fi", "fl", "", "endash", "dagger", "daggerdbl", "periodcentered", "", "paragraph", "bullet", "quotesinglbase", "quotedblbase", "quotedblright", "guillemotright", "ellipsis", "perthousand", "", "questiondown", "", "grave", "acute", "circumflex", "tilde", "macron", "breve", "dotaccent", "dieresis", "", "ring", "cedilla", "", "hungarumlaut", "ogonek", "caron", "emdash", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "AE", "", "ordfeminine", "", "", "", "", "Lslash", "Oslash", "OE", "ordmasculine", "", "", "", "", "", "ae", "", "", "", "dotlessi", "", "", "lslash", "oslash", "oe", "germandbls", "", "", "", ""];
15232const WinAnsiEncoding = ["", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "space", "exclam", "quotedbl", "numbersign", "dollar", "percent", "ampersand", "quotesingle", "parenleft", "parenright", "asterisk", "plus", "comma", "hyphen", "period", "slash", "zero", "one", "two", "three", "four", "five", "six", "seven", "eight", "nine", "colon", "semicolon", "less", "equal", "greater", "question", "at", "A", "B", "C", "D", "E", "F", "G", "H", "I", "J", "K", "L", "M", "N", "O", "P", "Q", "R", "S", "T", "U", "V", "W", "X", "Y", "Z", "bracketleft", "backslash", "bracketright", "asciicircum", "underscore", "grave", "a", "b", "c", "d", "e", "f", "g", "h", "i", "j", "k", "l", "m", "n", "o", "p", "q", "r", "s", "t", "u", "v", "w", "x", "y", "z", "braceleft", "bar", "braceright", "asciitilde", "bullet", "Euro", "bullet", "quotesinglbase", "florin", "quotedblbase", "ellipsis", "dagger", "daggerdbl", "circumflex", "perthousand", "Scaron", "guilsinglleft", "OE", "bullet", "Zcaron", "bullet", "bullet", "quoteleft", "quoteright", "quotedblleft", "quotedblright", "bullet", "endash", "emdash", "tilde", "trademark", "scaron", "guilsinglright", "oe", "bullet", "zcaron", "Ydieresis", "space", "exclamdown", "cent", "sterling", "currency", "yen", "brokenbar", "section", "dieresis", "copyright", "ordfeminine", "guillemotleft", "logicalnot", "hyphen", "registered", "macron", "degree", "plusminus", "twosuperior", "threesuperior", "acute", "mu", "paragraph", "periodcentered", "cedilla", "onesuperior", "ordmasculine", "guillemotright", "onequarter", "onehalf", "threequarters", "questiondown", "Agrave", "Aacute", "Acircumflex", "Atilde", "Adieresis", "Aring", "AE", "Ccedilla", "Egrave", "Eacute", "Ecircumflex", "Edieresis", "Igrave", "Iacute", "Icircumflex", "Idieresis", "Eth", "Ntilde", "Ograve", "Oacute", "Ocircumflex", "Otilde", "Odieresis", "multiply", "Oslash", "Ugrave", "Uacute", "Ucircumflex", "Udieresis", "Yacute", "Thorn", "germandbls", "agrave", "aacute", "acircumflex", "atilde", "adieresis", "aring", "ae", "ccedilla", "egrave", "eacute", "ecircumflex", "edieresis", "igrave", "iacute", "icircumflex", "idieresis", "eth", "ntilde", "ograve", "oacute", "ocircumflex", "otilde", "odieresis", "divide", "oslash", "ugrave", "uacute", "ucircumflex", "udieresis", "yacute", "thorn", "ydieresis"];
15233const SymbolSetEncoding = ["", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "space", "exclam", "universal", "numbersign", "existential", "percent", "ampersand", "suchthat", "parenleft", "parenright", "asteriskmath", "plus", "comma", "minus", "period", "slash", "zero", "one", "two", "three", "four", "five", "six", "seven", "eight", "nine", "colon", "semicolon", "less", "equal", "greater", "question", "congruent", "Alpha", "Beta", "Chi", "Delta", "Epsilon", "Phi", "Gamma", "Eta", "Iota", "theta1", "Kappa", "Lambda", "Mu", "Nu", "Omicron", "Pi", "Theta", "Rho", "Sigma", "Tau", "Upsilon", "sigma1", "Omega", "Xi", "Psi", "Zeta", "bracketleft", "therefore", "bracketright", "perpendicular", "underscore", "radicalex", "alpha", "beta", "chi", "delta", "epsilon", "phi", "gamma", "eta", "iota", "phi1", "kappa", "lambda", "mu", "nu", "omicron", "pi", "theta", "rho", "sigma", "tau", "upsilon", "omega1", "omega", "xi", "psi", "zeta", "braceleft", "bar", "braceright", "similar", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "Euro", "Upsilon1", "minute", "lessequal", "fraction", "infinity", "florin", "club", "diamond", "heart", "spade", "arrowboth", "arrowleft", "arrowup", "arrowright", "arrowdown", "degree", "plusminus", "second", "greaterequal", "multiply", "proportional", "partialdiff", "bullet", "divide", "notequal", "equivalence", "approxequal", "ellipsis", "arrowvertex", "arrowhorizex", "carriagereturn", "aleph", "Ifraktur", "Rfraktur", "weierstrass", "circlemultiply", "circleplus", "emptyset", "intersection", "union", "propersuperset", "reflexsuperset", "notsubset", "propersubset", "reflexsubset", "element", "notelement", "angle", "gradient", "registerserif", "copyrightserif", "trademarkserif", "product", "radical", "dotmath", "logicalnot", "logicaland", "logicalor", "arrowdblboth", "arrowdblleft", "arrowdblup", "arrowdblright", "arrowdbldown", "lozenge", "angleleft", "registersans", "copyrightsans", "trademarksans", "summation", "parenlefttp", "parenleftex", "parenleftbt", "bracketlefttp", "bracketleftex", "bracketleftbt", "bracelefttp", "braceleftmid", "braceleftbt", "braceex", "", "angleright", "integral", "integraltp", "integralex", "integralbt", "parenrighttp", "parenrightex", "parenrightbt", "bracketrighttp", "bracketrightex", "bracketrightbt", "bracerighttp", "bracerightmid", "bracerightbt", ""];
15234const ZapfDingbatsEncoding = ["", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "space", "a1", "a2", "a202", "a3", "a4", "a5", "a119", "a118", "a117", "a11", "a12", "a13", "a14", "a15", "a16", "a105", "a17", "a18", "a19", "a20", "a21", "a22", "a23", "a24", "a25", "a26", "a27", "a28", "a6", "a7", "a8", "a9", "a10", "a29", "a30", "a31", "a32", "a33", "a34", "a35", "a36", "a37", "a38", "a39", "a40", "a41", "a42", "a43", "a44", "a45", "a46", "a47", "a48", "a49", "a50", "a51", "a52", "a53", "a54", "a55", "a56", "a57", "a58", "a59", "a60", "a61", "a62", "a63", "a64", "a65", "a66", "a67", "a68", "a69", "a70", "a71", "a72", "a73", "a74", "a203", "a75", "a204", "a76", "a77", "a78", "a79", "a81", "a82", "a83", "a84", "a97", "a98", "a99", "a100", "", "a89", "a90", "a93", "a94", "a91", "a92", "a205", "a85", "a206", "a86", "a87", "a88", "a95", "a96", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "a101", "a102", "a103", "a104", "a106", "a107", "a108", "a112", "a111", "a110", "a109", "a120", "a121", "a122", "a123", "a124", "a125", "a126", "a127", "a128", "a129", "a130", "a131", "a132", "a133", "a134", "a135", "a136", "a137", "a138", "a139", "a140", "a141", "a142", "a143", "a144", "a145", "a146", "a147", "a148", "a149", "a150", "a151", "a152", "a153", "a154", "a155", "a156", "a157", "a158", "a159", "a160", "a161", "a163", "a164", "a196", "a165", "a192", "a166", "a167", "a168", "a169", "a170", "a171", "a172", "a173", "a162", "a174", "a175", "a176", "a177", "a178", "a179", "a193", "a180", "a199", "a181", "a200", "a182", "", "a201", "a183", "a184", "a197", "a185", "a194", "a198", "a186", "a195", "a187", "a188", "a189", "a190", "a191", ""];
15235function getEncoding(encodingName) {
15236	switch (encodingName) {
15237		case "WinAnsiEncoding":
15238			return WinAnsiEncoding;
15239		case "StandardEncoding":
15240			return StandardEncoding;
15241		case "MacRomanEncoding":
15242			return MacRomanEncoding;
15243		case "SymbolSetEncoding":
15244			return SymbolSetEncoding;
15245		case "ZapfDingbatsEncoding":
15246			return ZapfDingbatsEncoding;
15247		case "ExpertEncoding":
15248			return ExpertEncoding;
15249		case "MacExpertEncoding":
15250			return MacExpertEncoding;
15251		default:
15252			return null;
15253	}
15254}
15255
15256;// ./src/core/cff_parser.js
15257
15258
15259
15260
15261
15262
15263
15264
15265
15266
15267const MAX_SUBR_NESTING = 10;
15268const CFFStandardStrings = [".notdef", "space", "exclam", "quotedbl", "numbersign", "dollar", "percent", "ampersand", "quoteright", "parenleft", "parenright", "asterisk", "plus", "comma", "hyphen", "period", "slash", "zero", "one", "two", "three", "four", "five", "six", "seven", "eight", "nine", "colon", "semicolon", "less", "equal", "greater", "question", "at", "A", "B", "C", "D", "E", "F", "G", "H", "I", "J", "K", "L", "M", "N", "O", "P", "Q", "R", "S", "T", "U", "V", "W", "X", "Y", "Z", "bracketleft", "backslash", "bracketright", "asciicircum", "underscore", "quoteleft", "a", "b", "c", "d", "e", "f", "g", "h", "i", "j", "k", "l", "m", "n", "o", "p", "q", "r", "s", "t", "u", "v", "w", "x", "y", "z", "braceleft", "bar", "braceright", "asciitilde", "exclamdown", "cent", "sterling", "fraction", "yen", "florin", "section", "currency", "quotesingle", "quotedblleft", "guillemotleft", "guilsinglleft", "guilsinglright", "fi", "fl", "endash", "dagger", "daggerdbl", "periodce
vendor: 36,833 bytes, lines 15268-16469
15268ntered", "paragraph", "bullet", "quotesinglbase", "quotedblbase", "quotedblright", "guillemotright", "ellipsis", "perthousand", "questiondown", "grave", "acute", "circumflex", "tilde", "macron", "breve", "dotaccent", "dieresis", "ring", "cedilla", "hungarumlaut", "ogonek", "caron", "emdash", "AE", "ordfeminine", "Lslash", "Oslash", "OE", "ordmasculine", "ae", "dotlessi", "lslash", "oslash", "oe", "germandbls", "onesuperior", "logicalnot", "mu", "trademark", "Eth", "onehalf", "plusminus", "Thorn", "onequarter", "divide", "brokenbar", "degree", "thorn", "threequarters", "twosuperior", "registered", "minus", "eth", "multiply", "threesuperior", "copyright", "Aacute", "Acircumflex", "Adieresis", "Agrave", "Aring", "Atilde", "Ccedilla", "Eacute", "Ecircumflex", "Edieresis", "Egrave", "Iacute", "Icircumflex", "Idieresis", "Igrave", "Ntilde", "Oacute", "Ocircumflex", "Odieresis", "Ograve", "Otilde", "Scaron", "Uacute", "Ucircumflex", "Udieresis", "Ugrave", "Yacute", "Ydieresis", "Zcaron", "aacute", "acircumflex", "adieresis", "agrave", "aring", "atilde", "ccedilla", "eacute", "ecircumflex", "edieresis", "egrave", "iacute", "icircumflex", "idieresis", "igrave", "ntilde", "oacute", "ocircumflex", "odieresis", "ograve", "otilde", "scaron", "uacute", "ucircumflex", "udieresis", "ugrave", "yacute", "ydieresis", "zcaron", "exclamsmall", "Hungarumlautsmall", "dollaroldstyle", "dollarsuperior", "ampersandsmall", "Acutesmall", "parenleftsuperior", "parenrightsuperior", "twodotenleader", "onedotenleader", "zerooldstyle", "oneoldstyle", "twooldstyle", "threeoldstyle", "fouroldstyle", "fiveoldstyle", "sixoldstyle", "sevenoldstyle", "eightoldstyle", "nineoldstyle", "commasuperior", "threequartersemdash", "periodsuperior", "questionsmall", "asuperior", "bsuperior", "centsuperior", "dsuperior", "esuperior", "isuperior", "lsuperior", "msuperior", "nsuperior", "osuperior", "rsuperior", "ssuperior", "tsuperior", "ff", "ffi", "ffl", "parenleftinferior", "parenrightinferior", "Circumflexsmall", "hyphensuperior", "Gravesmall", "Asmall", "Bsmall", "Csmall", "Dsmall", "Esmall", "Fsmall", "Gsmall", "Hsmall", "Ismall", "Jsmall", "Ksmall", "Lsmall", "Msmall", "Nsmall", "Osmall", "Psmall", "Qsmall", "Rsmall", "Ssmall", "Tsmall", "Usmall", "Vsmall", "Wsmall", "Xsmall", "Ysmall", "Zsmall", "colonmonetary", "onefitted", "rupiah", "Tildesmall", "exclamdownsmall", "centoldstyle", "Lslashsmall", "Scaronsmall", "Zcaronsmall", "Dieresissmall", "Brevesmall", "Caronsmall", "Dotaccentsmall", "Macronsmall", "figuredash", "hypheninferior", "Ogoneksmall", "Ringsmall", "Cedillasmall", "questiondownsmall", "oneeighth", "threeeighths", "fiveeighths", "seveneighths", "onethird", "twothirds", "zerosuperior", "foursuperior", "fivesuperior", "sixsuperior", "sevensuperior", "eightsuperior", "ninesuperior", "zeroinferior", "oneinferior", "twoinferior", "threeinferior", "fourinferior", "fiveinferior", "sixinferior", "seveninferior", "eightinferior", "nineinferior", "centinferior", "dollarinferior", "periodinferior", "commainferior", "Agravesmall", "Aacutesmall", "Acircumflexsmall", "Atildesmall", "Adieresissmall", "Aringsmall", "AEsmall", "Ccedillasmall", "Egravesmall", "Eacutesmall", "Ecircumflexsmall", "Edieresissmall", "Igravesmall", "Iacutesmall", "Icircumflexsmall", "Idieresissmall", "Ethsmall", "Ntildesmall", "Ogravesmall", "Oacutesmall", "Ocircumflexsmall", "Otildesmall", "Odieresissmall", "OEsmall", "Oslashsmall", "Ugravesmall", "Uacutesmall", "Ucircumflexsmall", "Udieresissmall", "Yacutesmall", "Thornsmall", "Ydieresissmall", "001.000", "001.001", "001.002", "001.003", "Black", "Bold", "Book", "Light", "Medium", "Regular", "Roman", "Semibold"];
15269const NUM_STANDARD_CFF_STRINGS = 391;
15270const CharstringValidationData = [null, {
15271	id: "hstem",
15272	min: 2,
15273	stackClearing: true,
15274	stem: true
15275}, null, {
15276	id: "vstem",
15277	min: 2,
15278	stackClearing: true,
15279	stem: true
15280}, {
15281	id: "vmoveto",
15282	min: 1,
15283	stackClearing: true
15284}, {
15285	id: "rlineto",
15286	min: 2,
15287	resetStack: true
15288}, {
15289	id: "hlineto",
15290	min: 1,
15291	resetStack: true
15292}, {
15293	id: "vlineto",
15294	min: 1,
15295	resetStack: true
15296}, {
15297	id: "rrcurveto",
15298	min: 6,
15299	resetStack: true
15300}, null, {
15301	id: "callsubr",
15302	min: 1,
15303	undefStack: true
15304}, {
15305	id: "return",
15306	min: 0,
15307	undefStack: true
15308}, null, null, {
15309	id: "endchar",
15310	min: 0,
15311	stackClearing: true
15312}, null, null, null, {
15313	id: "hstemhm",
15314	min: 2,
15315	stackClearing: true,
15316	stem: true
15317}, {
15318	id: "hintmask",
15319	min: 0,
15320	stackClearing: true
15321}, {
15322	id: "cntrmask",
15323	min: 0,
15324	stackClearing: true
15325}, {
15326	id: "rmoveto",
15327	min: 2,
15328	stackClearing: true
15329}, {
15330	id: "hmoveto",
15331	min: 1,
15332	stackClearing: true
15333}, {
15334	id: "vstemhm",
15335	min: 2,
15336	stackClearing: true,
15337	stem: true
15338}, {
15339	id: "rcurveline",
15340	min: 8,
15341	resetStack: true
15342}, {
15343	id: "rlinecurve",
15344	min: 8,
15345	resetStack: true
15346}, {
15347	id: "vvcurveto",
15348	min: 4,
15349	resetStack: true
15350}, {
15351	id: "hhcurveto",
15352	min: 4,
15353	resetStack: true
15354}, null, {
15355	id: "callgsubr",
15356	min: 1,
15357	undefStack: true
15358}, {
15359	id: "vhcurveto",
15360	min: 4,
15361	resetStack: true
15362}, {
15363	id: "hvcurveto",
15364	min: 4,
15365	resetStack: true
15366}];
15367const CharstringValidationData12 = [null, null, null, {
15368	id: "and",
15369	min: 2,
15370	stackDelta: -1
15371}, {
15372	id: "or",
15373	min: 2,
15374	stackDelta: -1
15375}, {
15376	id: "not",
15377	min: 1,
15378	stackDelta: 0
15379}, null, null, null, {
15380	id: "abs",
15381	min: 1,
15382	stackDelta: 0
15383}, {
15384	id: "add",
15385	min: 2,
15386	stackDelta: -1,
15387	stackFn(stack, index) {
15388		stack[index - 2] = stack[index - 2] + stack[index - 1];
15389	}
15390}, {
15391	id: "sub",
15392	min: 2,
15393	stackDelta: -1,
15394	stackFn(stack, index) {
15395		stack[index - 2] = stack[index - 2] - stack[index - 1];
15396	}
15397}, {
15398	id: "div",
15399	min: 2,
15400	stackDelta: -1,
15401	stackFn(stack, index) {
15402		stack[index - 2] = stack[index - 2] / stack[index - 1];
15403	}
15404}, null, {
15405	id: "neg",
15406	min: 1,
15407	stackDelta: 0,
15408	stackFn(stack, index) {
15409		stack[index - 1] = -stack[index - 1];
15410	}
15411}, {
15412	id: "eq",
15413	min: 2,
15414	stackDelta: -1
15415}, null, null, {
15416	id: "drop",
15417	min: 1,
15418	stackDelta: -1
15419}, null, {
15420	id: "put",
15421	min: 2,
15422	stackDelta: -2
15423}, {
15424	id: "get",
15425	min: 1,
15426	stackDelta: 0
15427}, {
15428	id: "ifelse",
15429	min: 4,
15430	stackDelta: -3
15431}, {
15432	id: "random",
15433	min: 0,
15434	stackDelta: 1
15435}, {
15436	id: "mul",
15437	min: 2,
15438	stackDelta: -1,
15439	stackFn(stack, index) {
15440		stack[index - 2] = stack[index - 2] * stack[index - 1];
15441	}
15442}, null, {
15443	id: "sqrt",
15444	min: 1,
15445	stackDelta: 0
15446}, {
15447	id: "dup",
15448	min: 1,
15449	stackDelta: 1
15450}, {
15451	id: "exch",
15452	min: 2,
15453	stackDelta: 0
15454}, {
15455	id: "index",
15456	min: 2,
15457	stackDelta: 0
15458}, {
15459	id: "roll",
15460	min: 3,
15461	stackDelta: -2
15462}, null, null, null, {
15463	id: "hflex",
15464	min: 7,
15465	resetStack: true
15466}, {
15467	id: "flex",
15468	min: 13,
15469	resetStack: true
15470}, {
15471	id: "hflex1",
15472	min: 9,
15473	resetStack: true
15474}, {
15475	id: "flex1",
15476	min: 11,
15477	resetStack: true
15478}];
15479class CFFParser {
15480	constructor(file, properties, seacAnalysisEnabled) {
15481		this.bytes = file.getBytes();
15482		this.properties = properties;
15483		this.seacAnalysisEnabled = !!seacAnalysisEnabled;
15484	}
15485	parse() {
15486		const properties = this.properties;
15487		const cff = new CFF();
15488		this.cff = cff;
15489		const header = this.parseHeader();
15490		const nameIndex = this.parseIndex(header.endPos);
15491		const topDictIndex = this.parseIndex(nameIndex.endPos);
15492		const stringIndex = this.parseIndex(topDictIndex.endPos);
15493		const globalSubrIndex = this.parseIndex(stringIndex.endPos);
15494		const topDictParsed = this.parseDict(topDictIndex.obj.get(0));
15495		const topDict = this.createDict(CFFTopDict, topDictParsed, cff.strings);
15496		cff.header = header.obj;
15497		cff.names = this.parseNameIndex(nameIndex.obj);
15498		cff.strings = this.parseStringIndex(stringIndex.obj);
15499		cff.topDict = topDict;
15500		cff.globalSubrIndex = globalSubrIndex.obj;
15501		this.parsePrivateDict(cff.topDict);
15502		cff.isCIDFont = topDict.hasName("ROS");
15503		const charStringOffset = topDict.getByName("CharStrings");
15504		const charStringIndex = this.parseIndex(charStringOffset).obj;
15505		const fontMatrix = topDict.getByName("FontMatrix");
15506		if (fontMatrix) {
15507			properties.fontMatrix = fontMatrix;
15508		}
15509		const fontBBox = topDict.getByName("FontBBox");
15510		if (fontBBox) {
15511			properties.ascent = Math.max(fontBBox[3], fontBBox[1]);
15512			properties.descent = Math.min(fontBBox[1], fontBBox[3]);
15513			properties.ascentScaled = true;
15514		}
15515		let charset, encoding;
15516		if (cff.isCIDFont) {
15517			const fdArrayIndex = this.parseIndex(topDict.getByName("FDArray")).obj;
15518			for (let i = 0, ii = fdArrayIndex.count; i < ii; ++i) {
15519				const dictRaw = fdArrayIndex.get(i);
15520				const fontDict = this.createDict(CFFTopDict, this.parseDict(dictRaw), cff.strings);
15521				this.parsePrivateDict(fontDict);
15522				cff.fdArray.push(fontDict);
15523			}
15524			encoding = null;
15525			charset = this.parseCharsets(topDict.getByName("charset"), charStringIndex.count, cff.strings, true);
15526			cff.fdSelect = this.parseFDSelect(topDict.getByName("FDSelect"), charStringIndex.count);
15527		} else {
15528			charset = this.parseCharsets(topDict.getByName("charset"), charStringIndex.count, cff.strings, false);
15529			encoding = this.parseEncoding(topDict.getByName("Encoding"), properties, cff.strings, charset.charset);
15530		}
15531		cff.charset = charset;
15532		cff.encoding = encoding;
15533		const charStringsAndSeacs = this.parseCharStrings({
15534			charStrings: charStringIndex,
15535			localSubrIndex: topDict.privateDict.subrsIndex,
15536			globalSubrIndex: globalSubrIndex.obj,
15537			fdSelect: cff.fdSelect,
15538			fdArray: cff.fdArray,
15539			privateDict: topDict.privateDict
15540		});
15541		cff.charStrings = charStringsAndSeacs.charStrings;
15542		cff.seacs = charStringsAndSeacs.seacs;
15543		cff.widths = charStringsAndSeacs.widths;
15544		return cff;
15545	}
15546	parseHeader() {
15547		let bytes = this.bytes;
15548		const bytesLength = bytes.length;
15549		let offset = 0;
15550		while (offset < bytesLength && bytes[offset] !== 1) {
15551			++offset;
15552		}
15553		if (offset >= bytesLength) {
15554			throw new FormatError("Invalid CFF header");
15555		}
15556		if (offset !== 0) {
15557			info("cff data is shifted");
15558			bytes = bytes.subarray(offset);
15559			this.bytes = bytes;
15560		}
15561		const major = bytes[0];
15562		const minor = bytes[1];
15563		const hdrSize = bytes[2];
15564		const offSize = bytes[3];
15565		const header = new CFFHeader(major, minor, hdrSize, offSize);
15566		return {
15567			obj: header,
15568			endPos: hdrSize
15569		};
15570	}
15571	parseDict(dict) {
15572		let pos = 0;
15573		function parseOperand() {
15574			let value = dict[pos++];
15575			if (value === 30) {
15576				return parseFloatOperand();
15577			} else if (value === 28) {
15578				value = dict[pos++];
15579				value = (value << 24 | dict[pos++] << 16) >> 16;
15580				return value;
15581			} else if (value === 29) {
15582				value = dict[pos++];
15583				value = value << 8 | dict[pos++];
15584				value = value << 8 | dict[pos++];
15585				value = value << 8 | dict[pos++];
15586				return value;
15587			} else if (value >= 32 && value <= 246) {
15588				return value - 139;
15589			} else if (value >= 247 && value <= 250) {
15590				return (value - 247) * 256 + dict[pos++] + 108;
15591			} else if (value >= 251 && value <= 254) {
15592				return -((value - 251) * 256) - dict[pos++] - 108;
15593			}
15594			warn('CFFParser_parseDict: "' + value + '" is a reserved command.');
15595			return NaN;
15596		}
15597		function parseFloatOperand() {
15598			let str = "";
15599			const eof = 15;
15600			const lookup = ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", ".", "E", "E-", null, "-"];
15601			const length = dict.length;
15602			while (pos < length) {
15603				const b = dict[pos++];
15604				const b1 = b >> 4;
15605				const b2 = b & 15;
15606				if (b1 === eof) {
15607					break;
15608				}
15609				str += lookup[b1];
15610				if (b2 === eof) {
15611					break;
15612				}
15613				str += lookup[b2];
15614			}
15615			return parseFloat(str);
15616		}
15617		let operands = [];
15618		const entries = [];
15619		pos = 0;
15620		const end = dict.length;
15621		while (pos < end) {
15622			let b = dict[pos];
15623			if (b <= 21) {
15624				if (b === 12) {
15625					b = b << 8 | dict[++pos];
15626				}
15627				entries.push([b, operands]);
15628				operands = [];
15629				++pos;
15630			} else {
15631				operands.push(parseOperand());
15632			}
15633		}
15634		return entries;
15635	}
15636	parseIndex(pos) {
15637		const cffIndex = new CFFIndex();
15638		const bytes = this.bytes;
15639		const count = bytes[pos++] << 8 | bytes[pos++];
15640		const offsets = [];
15641		let end = pos;
15642		let i, ii;
15643		if (count !== 0) {
15644			const offsetSize = bytes[pos++];
15645			const startPos = pos + (count + 1) * offsetSize - 1;
15646			for (i = 0, ii = count + 1; i < ii; ++i) {
15647				let offset = 0;
15648				for (let j = 0; j < offsetSize; ++j) {
15649					offset <<= 8;
15650					offset += bytes[pos++];
15651				}
15652				offsets.push(startPos + offset);
15653			}
15654			end = offsets[count];
15655		}
15656		for (i = 0, ii = offsets.length - 1; i < ii; ++i) {
15657			const offsetStart = offsets[i];
15658			const offsetEnd = offsets[i + 1];
15659			cffIndex.add(bytes.subarray(offsetStart, offsetEnd));
15660		}
15661		return {
15662			obj: cffIndex,
15663			endPos: end
15664		};
15665	}
15666	parseNameIndex(index) {
15667		const names = [];
15668		for (let i = 0, ii = index.count; i < ii; ++i) {
15669			const name = index.get(i);
15670			names.push(bytesToString(name));
15671		}
15672		return names;
15673	}
15674	parseStringIndex(index) {
15675		const strings = new CFFStrings();
15676		for (let i = 0, ii = index.count; i < ii; ++i) {
15677			const data = index.get(i);
15678			strings.add(bytesToString(data));
15679		}
15680		return strings;
15681	}
15682	createDict(Type, dict, strings) {
15683		const cffDict = new Type(strings);
15684		for (const [key, value] of dict) {
15685			cffDict.setByKey(key, value);
15686		}
15687		return cffDict;
15688	}
15689	parseCharString(state, data, localSubrIndex, globalSubrIndex) {
15690		if (!data || state.callDepth > MAX_SUBR_NESTING) {
15691			return false;
15692		}
15693		let stackSize = state.stackSize;
15694		const stack = state.stack;
15695		let length = data.length;
15696		for (let j = 0; j < length;) {
15697			const value = data[j++];
15698			let validationCommand = null;
15699			if (value === 12) {
15700				const q = data[j++];
15701				if (q === 0) {
15702					data[j - 2] = 139;
15703					data[j - 1] = 22;
15704					stackSize = 0;
15705				} else {
15706					validationCommand = CharstringValidationData12[q];
15707				}
15708			} else if (value === 28) {
15709				stack[stackSize] = (data[j] << 24 | data[j + 1] << 16) >> 16;
15710				j += 2;
15711				stackSize++;
15712			} else if (value === 14) {
15713				if (stackSize >= 4) {
15714					stackSize -= 4;
15715					if (this.seacAnalysisEnabled) {
15716						state.seac = stack.slice(stackSize, stackSize + 4);
15717						return false;
15718					}
15719				}
15720				validationCommand = CharstringValidationData[value];
15721			} else if (value >= 32 && value <= 246) {
15722				stack[stackSize] = value - 139;
15723				stackSize++;
15724			} else if (value >= 247 && value <= 254) {
15725				stack[stackSize] = value < 251 ? (value - 247 << 8) + data[j] + 108 : -(value - 251 << 8) - data[j] - 108;
15726				j++;
15727				stackSize++;
15728			} else if (value === 255) {
15729				stack[stackSize] = (data[j] << 24 | data[j + 1] << 16 | data[j + 2] << 8 | data[j + 3]) / 65536;
15730				j += 4;
15731				stackSize++;
15732			} else if (value === 19 || value === 20) {
15733				state.hints += stackSize >> 1;
15734				if (state.hints === 0) {
15735					data.copyWithin(j - 1, j, -1);
15736					j -= 1;
15737					length -= 1;
15738					continue;
15739				}
15740				j += state.hints + 7 >> 3;
15741				stackSize %= 2;
15742				validationCommand = CharstringValidationData[value];
15743			} else if (value === 10 || value === 29) {
15744				const subrsIndex = value === 10 ? localSubrIndex : globalSubrIndex;
15745				if (!subrsIndex) {
15746					validationCommand = CharstringValidationData[value];
15747					warn("Missing subrsIndex for " + validationCommand.id);
15748					return false;
15749				}
15750				let bias = 32768;
15751				if (subrsIndex.count < 1240) {
15752					bias = 107;
15753				} else if (subrsIndex.count < 33900) {
15754					bias = 1131;
15755				}
15756				const subrNumber = stack[--stackSize] + bias;
15757				if (subrNumber < 0 || subrNumber >= subrsIndex.count || isNaN(subrNumber)) {
15758					validationCommand = CharstringValidationData[value];
15759					warn("Out of bounds subrIndex for " + validationCommand.id);
15760					return false;
15761				}
15762				state.stackSize = stackSize;
15763				state.callDepth++;
15764				const valid = this.parseCharString(state, subrsIndex.get(subrNumber), localSubrIndex, globalSubrIndex);
15765				if (!valid) {
15766					return false;
15767				}
15768				state.callDepth--;
15769				stackSize = state.stackSize;
15770				continue;
15771			} else if (value === 11) {
15772				state.stackSize = stackSize;
15773				return true;
15774			} else if (value === 0 && j === data.length) {
15775				data[j - 1] = 14;
15776				validationCommand = CharstringValidationData[14];
15777			} else if (value === 9) {
15778				data.copyWithin(j - 1, j, -1);
15779				j -= 1;
15780				length -= 1;
15781				continue;
15782			} else {
15783				validationCommand = CharstringValidationData[value];
15784			}
15785			if (validationCommand) {
15786				if (validationCommand.stem) {
15787					state.hints += stackSize >> 1;
15788					if (value === 3 || value === 23) {
15789						state.hasVStems = true;
15790					} else if (state.hasVStems && (value === 1 || value === 18)) {
15791						warn("CFF stem hints are in wrong order");
15792						data[j - 1] = value === 1 ? 3 : 23;
15793					}
15794				}
15795				if ("min" in validationCommand) {
15796					if (!state.undefStack && stackSize < validationCommand.min) {
15797						warn("Not enough parameters for " + validationCommand.id + "; actual: " + stackSize + ", expected: " + validationCommand.min);
15798						if (stackSize === 0) {
15799							data[j - 1] = 14;
15800							return true;
15801						}
15802						return false;
15803					}
15804				}
15805				if (state.firstStackClearing && validationCommand.stackClearing) {
15806					state.firstStackClearing = false;
15807					stackSize -= validationCommand.min;
15808					if (stackSize >= 2 && validationCommand.stem) {
15809						stackSize %= 2;
15810					} else if (stackSize > 1) {
15811						warn("Found too many parameters for stack-clearing command");
15812					}
15813					if (stackSize > 0) {
15814						state.width = stack[stackSize - 1];
15815					}
15816				}
15817				if ("stackDelta" in validationCommand) {
15818					if ("stackFn" in validationCommand) {
15819						validationCommand.stackFn(stack, stackSize);
15820					}
15821					stackSize += validationCommand.stackDelta;
15822				} else if (validationCommand.stackClearing) {
15823					stackSize = 0;
15824				} else if (validationCommand.resetStack) {
15825					stackSize = 0;
15826					state.undefStack = false;
15827				} else if (validationCommand.undefStack) {
15828					stackSize = 0;
15829					state.undefStack = true;
15830					state.firstStackClearing = false;
15831				}
15832			}
15833		}
15834		if (length < data.length) {
15835			data.fill(14, length);
15836		}
15837		state.stackSize = stackSize;
15838		return true;
15839	}
15840	parseCharStrings({
15841		charStrings,
15842		localSubrIndex,
15843		globalSubrIndex,
15844		fdSelect,
15845		fdArray,
15846		privateDict
15847	}) {
15848		const seacs = [];
15849		const widths = [];
15850		const count = charStrings.count;
15851		for (let i = 0; i < count; i++) {
15852			const charstring = charStrings.get(i);
15853			const state = {
15854				callDepth: 0,
15855				stackSize: 0,
15856				stack: [],
15857				undefStack: true,
15858				hints: 0,
15859				firstStackClearing: true,
15860				seac: null,
15861				width: null,
15862				hasVStems: false
15863			};
15864			let valid = true;
15865			let localSubrToUse = null;
15866			let privateDictToUse = privateDict;
15867			if (fdSelect && fdArray.length) {
15868				const fdIndex = fdSelect.getFDIndex(i);
15869				if (fdIndex === -1) {
15870					warn("Glyph index is not in fd select.");
15871					valid = false;
15872				}
15873				if (fdIndex >= fdArray.length) {
15874					warn("Invalid fd index for glyph index.");
15875					valid = false;
15876				}
15877				if (valid) {
15878					privateDictToUse = fdArray[fdIndex].privateDict;
15879					localSubrToUse = privateDictToUse.subrsIndex;
15880				}
15881			} else if (localSubrIndex) {
15882				localSubrToUse = localSubrIndex;
15883			}
15884			if (valid) {
15885				valid = this.parseCharString(state, charstring, localSubrToUse, globalSubrIndex);
15886			}
15887			if (state.width !== null) {
15888				const nominalWidth = privateDictToUse.getByName("nominalWidthX");
15889				widths[i] = nominalWidth + state.width;
15890			} else {
15891				const defaultWidth = privateDictToUse.getByName("defaultWidthX");
15892				widths[i] = defaultWidth;
15893			}
15894			if (state.seac !== null) {
15895				seacs[i] = state.seac;
15896			}
15897			if (!valid) {
15898				charStrings.set(i, new Uint8Array([14]));
15899			}
15900		}
15901		return {
15902			charStrings,
15903			seacs,
15904			widths
15905		};
15906	}
15907	emptyPrivateDictionary(parentDict) {
15908		const privateDict = this.createDict(CFFPrivateDict, [], parentDict.strings);
15909		parentDict.setByKey(18, [0, 0]);
15910		parentDict.privateDict = privateDict;
15911	}
15912	parsePrivateDict(parentDict) {
15913		if (!parentDict.hasName("Private")) {
15914			this.emptyPrivateDictionary(parentDict);
15915			return;
15916		}
15917		const privateOffset = parentDict.getByName("Private");
15918		if (!Array.isArray(privateOffset) || privateOffset.length !== 2) {
15919			parentDict.removeByName("Private");
15920			return;
15921		}
15922		const size = privateOffset[0];
15923		const offset = privateOffset[1];
15924		if (size === 0 || offset >= this.bytes.length) {
15925			this.emptyPrivateDictionary(parentDict);
15926			return;
15927		}
15928		const privateDictEnd = offset + size;
15929		const dictData = this.bytes.subarray(offset, privateDictEnd);
15930		const dict = this.parseDict(dictData);
15931		const privateDict = this.createDict(CFFPrivateDict, dict, parentDict.strings);
15932		parentDict.privateDict = privateDict;
15933		if (privateDict.getByName("ExpansionFactor") === 0) {
15934			privateDict.setByName("ExpansionFactor", 0.06);
15935		}
15936		if (!privateDict.getByName("Subrs")) {
15937			return;
15938		}
15939		const subrsOffset = privateDict.getByName("Subrs");
15940		const relativeOffset = offset + subrsOffset;
15941		if (subrsOffset === 0 || relativeOffset >= this.bytes.length) {
15942			this.emptyPrivateDictionary(parentDict);
15943			return;
15944		}
15945		const subrsIndex = this.parseIndex(relativeOffset);
15946		privateDict.subrsIndex = subrsIndex.obj;
15947	}
15948	parseCharsets(pos, length, strings, cid) {
15949		if (pos === 0) {
15950			return new CFFCharset(true, CFFCharsetPredefinedTypes.ISO_ADOBE, ISOAdobeCharset);
15951		} else if (pos === 1) {
15952			return new CFFCharset(true, CFFCharsetPredefinedTypes.EXPERT, ExpertCharset);
15953		} else if (pos === 2) {
15954			return new CFFCharset(true, CFFCharsetPredefinedTypes.EXPERT_SUBSET, ExpertSubsetCharset);
15955		}
15956		const bytes = this.bytes;
15957		const start = pos;
15958		const format = bytes[pos++];
15959		const charset = [cid ? 0 : ".notdef"];
15960		let id, count, i;
15961		length -= 1;
15962		switch (format) {
15963			case 0:
15964				for (i = 0; i < length; i++) {
15965					id = bytes[pos++] << 8 | bytes[pos++];
15966					charset.push(cid ? id : strings.get(id));
15967				}
15968				break;
15969			case 1:
15970				while (charset.length <= length) {
15971					id = bytes[pos++] << 8 | bytes[pos++];
15972					count = bytes[pos++];
15973					for (i = 0; i <= count; i++) {
15974						charset.push(cid ? id++ : strings.get(id++));
15975					}
15976				}
15977				break;
15978			case 2:
15979				while (charset.length <= length) {
15980					id = bytes[pos++] << 8 | bytes[pos++];
15981					count = bytes[pos++] << 8 | bytes[pos++];
15982					for (i = 0; i <= count; i++) {
15983						charset.push(cid ? id++ : strings.get(id++));
15984					}
15985				}
15986				break;
15987			default:
15988				throw new FormatError("Unknown charset format");
15989		}
15990		const end = pos;
15991		const raw = bytes.subarray(start, end);
15992		return new CFFCharset(false, format, charset, raw);
15993	}
15994	parseEncoding(pos, properties, strings, charset) {
15995		const encoding = Object.create(null);
15996		const bytes = this.bytes;
15997		let predefined = false;
15998		let format, i, ii;
15999		let raw = null;
16000		function readSupplement() {
16001			const supplementsCount = bytes[pos++];
16002			for (i = 0; i < supplementsCount; i++) {
16003				const code = bytes[pos++];
16004				const sid = (bytes[pos++] << 8) + (bytes[pos++] & 0xff);
16005				encoding[code] = charset.indexOf(strings.get(sid));
16006			}
16007		}
16008		if (pos === 0 || pos === 1) {
16009			predefined = true;
16010			format = pos;
16011			const baseEncoding = pos ? ExpertEncoding : StandardEncoding;
16012			for (i = 0, ii = charset.length; i < ii; i++) {
16013				const index = baseEncoding.indexOf(charset[i]);
16014				if (index !== -1) {
16015					encoding[index] = i;
16016				}
16017			}
16018		} else {
16019			const dataStart = pos;
16020			format = bytes[pos++];
16021			switch (format & 0x7f) {
16022				case 0:
16023					const glyphsCount = bytes[pos++];
16024					for (i = 1; i <= glyphsCount; i++) {
16025						encoding[bytes[pos++]] = i;
16026					}
16027					break;
16028				case 1:
16029					const rangesCount = bytes[pos++];
16030					let gid = 1;
16031					for (i = 0; i < rangesCount; i++) {
16032						const start = bytes[pos++];
16033						const left = bytes[pos++];
16034						for (let j = start; j <= start + left; j++) {
16035							encoding[j] = gid++;
16036						}
16037					}
16038					break;
16039				default:
16040					throw new FormatError(`Unknown encoding format: ${format} in CFF`);
16041			}
16042			const dataEnd = pos;
16043			if (format & 0x80) {
16044				bytes[dataStart] &= 0x7f;
16045				readSupplement();
16046			}
16047			raw = bytes.subarray(dataStart, dataEnd);
16048		}
16049		format &= 0x7f;
16050		return new CFFEncoding(predefined, format, encoding, raw);
16051	}
16052	parseFDSelect(pos, length) {
16053		const bytes = this.bytes;
16054		const format = bytes[pos++];
16055		const fdSelect = [];
16056		let i;
16057		switch (format) {
16058			case 0:
16059				for (i = 0; i < length; ++i) {
16060					const id = bytes[pos++];
16061					fdSelect.push(id);
16062				}
16063				break;
16064			case 3:
16065				const rangesCount = bytes[pos++] << 8 | bytes[pos++];
16066				for (i = 0; i < rangesCount; ++i) {
16067					let first = bytes[pos++] << 8 | bytes[pos++];
16068					if (i === 0 && first !== 0) {
16069						warn("parseFDSelect: The first range must have a first GID of 0" + " -- trying to recover.");
16070						first = 0;
16071					}
16072					const fdIndex = bytes[pos++];
16073					const next = bytes[pos] << 8 | bytes[pos + 1];
16074					for (let j = first; j < next; ++j) {
16075						fdSelect.push(fdIndex);
16076					}
16077				}
16078				pos += 2;
16079				break;
16080			default:
16081				throw new FormatError(`parseFDSelect: Unknown format "${format}".`);
16082		}
16083		if (fdSelect.length !== length) {
16084			throw new FormatError("parseFDSelect: Invalid font data.");
16085		}
16086		return new CFFFDSelect(format, fdSelect);
16087	}
16088}
16089class CFF {
16090	constructor() {
16091		this.header = null;
16092		this.names = [];
16093		this.topDict = null;
16094		this.strings = new CFFStrings();
16095		this.globalSubrIndex = null;
16096		this.encoding = null;
16097		this.charset = null;
16098		this.charStrings = null;
16099		this.fdArray = [];
16100		this.fdSelect = null;
16101		this.isCIDFont = false;
16102	}
16103	duplicateFirstGlyph() {
16104		if (this.charStrings.count >= 65535) {
16105			warn("Not enough space in charstrings to duplicate first glyph.");
16106			return;
16107		}
16108		const glyphZero = this.charStrings.get(0);
16109		this.charStrings.add(glyphZero);
16110		if (this.isCIDFont) {
16111			this.fdSelect.fdSelect.push(this.fdSelect.fdSelect[0]);
16112		}
16113	}
16114	hasGlyphId(id) {
16115		if (id < 0 || id >= this.charStrings.count) {
16116			return false;
16117		}
16118		const glyph = this.charStrings.get(id);
16119		return glyph.length > 0;
16120	}
16121}
16122class CFFHeader {
16123	constructor(major, minor, hdrSize, offSize) {
16124		this.major = major;
16125		this.minor = minor;
16126		this.hdrSize = hdrSize;
16127		this.offSize = offSize;
16128	}
16129}
16130class CFFStrings {
16131	constructor() {
16132		this.strings = [];
16133	}
16134	get(index) {
16135		if (index >= 0 && index <= NUM_STANDARD_CFF_STRINGS - 1) {
16136			return CFFStandardStrings[index];
16137		}
16138		if (index - NUM_STANDARD_CFF_STRINGS <= this.strings.length) {
16139			return this.strings[index - NUM_STANDARD_CFF_STRINGS];
16140		}
16141		return CFFStandardStrings[0];
16142	}
16143	getSID(str) {
16144		let index = CFFStandardStrings.indexOf(str);
16145		if (index !== -1) {
16146			return index;
16147		}
16148		index = this.strings.indexOf(str);
16149		if (index !== -1) {
16150			return index + NUM_STANDARD_CFF_STRINGS;
16151		}
16152		return -1;
16153	}
16154	add(value) {
16155		this.strings.push(value);
16156	}
16157	get count() {
16158		return this.strings.length;
16159	}
16160}
16161class CFFIndex {
16162	constructor() {
16163		this.objects = [];
16164		this.length = 0;
16165	}
16166	add(data) {
16167		this.length += data.length;
16168		this.objects.push(data);
16169	}
16170	set(index, data) {
16171		this.length += data.length - this.objects[index].length;
16172		this.objects[index] = data;
16173	}
16174	get(index) {
16175		return this.objects[index];
16176	}
16177	get count() {
16178		return this.objects.length;
16179	}
16180}
16181class CFFDict {
16182	constructor(tables, strings) {
16183		this.keyToNameMap = tables.keyToNameMap;
16184		this.nameToKeyMap = tables.nameToKeyMap;
16185		this.defaults = tables.defaults;
16186		this.types = tables.types;
16187		this.opcodes = tables.opcodes;
16188		this.order = tables.order;
16189		this.strings = strings;
16190		this.values = Object.create(null);
16191	}
16192	setByKey(key, value) {
16193		if (!(key in this.keyToNameMap)) {
16194			return false;
16195		}
16196		if (value.length === 0) {
16197			return true;
16198		}
16199		for (const val of value) {
16200			if (isNaN(val)) {
16201				warn(`Invalid CFFDict value: "${value}" for key "${key}".`);
16202				return true;
16203			}
16204		}
16205		const type = this.types[key];
16206		if (type === "num" || type === "sid" || type === "offset") {
16207			value = value[0];
16208		}
16209		this.values[key] = value;
16210		return true;
16211	}
16212	setByName(name, value) {
16213		if (!(name in this.nameToKeyMap)) {
16214			throw new FormatError(`Invalid dictionary name "${name}"`);
16215		}
16216		this.values[this.nameToKeyMap[name]] = value;
16217	}
16218	hasName(name) {
16219		return this.nameToKeyMap[name] in this.values;
16220	}
16221	getByName(name) {
16222		if (!(name in this.nameToKeyMap)) {
16223			throw new FormatError(`Invalid dictionary name ${name}"`);
16224		}
16225		const key = this.nameToKeyMap[name];
16226		if (!(key in this.values)) {
16227			return this.defaults[key];
16228		}
16229		return this.values[key];
16230	}
16231	removeByName(name) {
16232		delete this.values[this.nameToKeyMap[name]];
16233	}
16234	static createTables(layout) {
16235		const tables = {
16236			keyToNameMap: {},
16237			nameToKeyMap: {},
16238			defaults: {},
16239			types: {},
16240			opcodes: {},
16241			order: []
16242		};
16243		for (const entry of layout) {
16244			const key = Array.isArray(entry[0]) ? (entry[0][0] << 8) + entry[0][1] : entry[0];
16245			tables.keyToNameMap[key] = entry[1];
16246			tables.nameToKeyMap[entry[1]] = key;
16247			tables.types[key] = entry[2];
16248			tables.defaults[key] = entry[3];
16249			tables.opcodes[key] = Array.isArray(entry[0]) ? entry[0] : [entry[0]];
16250			tables.order.push(key);
16251		}
16252		return tables;
16253	}
16254}
16255const CFFTopDictLayout = [[[12, 30], "ROS", ["sid", "sid", "num"], null], [[12, 20], "SyntheticBase", "num", null], [0, "version", "sid", null], [1, "Notice", "sid", null], [[12, 0], "Copyright", "sid", null], [2, "FullName", "sid", null], [3, "FamilyName", "sid", null], [4, "Weight", "sid", null], [[12, 1], "isFixedPitch", "num", 0], [[12, 2], "ItalicAngle", "num", 0], [[12, 3], "UnderlinePosition", "num", -100], [[12, 4], "UnderlineThickness", "num", 50], [[12, 5], "PaintType", "num", 0], [[12, 6], "CharstringType", "num", 2], [[12, 7], "FontMatrix", ["num", "num", "num", "num", "num", "num"], [0.001, 0, 0, 0.001, 0, 0]], [13, "UniqueID", "num", null], [5, "FontBBox", ["num", "num", "num", "num"], [0, 0, 0, 0]], [[12, 8], "StrokeWidth", "num", 0], [14, "XUID", "array", null], [15, "charset", "offset", 0], [16, "Encoding", "offset", 0], [17, "CharStrings", "offset", 0], [18, "Private", ["offset", "offset"], null], [[12, 21], "PostScript", "sid", null], [[12, 22], "BaseFontName", "sid", null], [[12, 23], "BaseFontBlend", "delta", null], [[12, 31], "CIDFontVersion", "num", 0], [[12, 32], "CIDFontRevision", "num", 0], [[12, 33], "CIDFontType", "num", 0], [[12, 34], "CIDCount", "num", 8720], [[12, 35], "UIDBase", "num", null], [[12, 37], "FDSelect", "offset", null], [[12, 36], "FDArray", "offset", null], [[12, 38], "FontName", "sid", null]];
16256class CFFTopDict extends CFFDict {
16257	static get tables() {
16258		return shadow(this, "tables", this.createTables(CFFTopDictLayout));
16259	}
16260	constructor(strings) {
16261		super(CFFTopDict.tables, strings);
16262		this.privateDict = null;
16263	}
16264}
16265const CFFPrivateDictLayout = [[6, "BlueValues", "delta", null], [7, "OtherBlues", "delta", null], [8, "FamilyBlues", "delta", null], [9, "FamilyOtherBlues", "delta", null], [[12, 9], "BlueScale", "num", 0.039625], [[12, 10], "BlueShift", "num", 7], [[12, 11], "BlueFuzz", "num", 1], [10, "StdHW", "num", null], [11, "StdVW", "num", null], [[12, 12], "StemSnapH", "delta", null], [[12, 13], "StemSnapV", "delta", null], [[12, 14], "ForceBold", "num", 0], [[12, 17], "LanguageGroup", "num", 0], [[12, 18], "ExpansionFactor", "num", 0.06], [[12, 19], "initialRandomSeed", "num", 0], [20, "defaultWidthX", "num", 0], [21, "nominalWidthX", "num", 0], [19, "Subrs", "offset", null]];
16266class CFFPrivateDict extends CFFDict {
16267	static get tables() {
16268		return shadow(this, "tables", this.createTables(CFFPrivateDictLayout));
16269	}
16270	constructor(strings) {
16271		super(CFFPrivateDict.tables, strings);
16272		this.subrsIndex = null;
16273	}
16274}
16275const CFFCharsetPredefinedTypes = {
16276	ISO_ADOBE: 0,
16277	EXPERT: 1,
16278	EXPERT_SUBSET: 2
16279};
16280class CFFCharset {
16281	constructor(predefined, format, charset, raw) {
16282		this.predefined = predefined;
16283		this.format = format;
16284		this.charset = charset;
16285		this.raw = raw;
16286	}
16287}
16288class CFFEncoding {
16289	constructor(predefined, format, encoding, raw) {
16290		this.predefined = predefined;
16291		this.format = format;
16292		this.encoding = encoding;
16293		this.raw = raw;
16294	}
16295}
16296class CFFFDSelect {
16297	constructor(format, fdSelect) {
16298		this.format = format;
16299		this.fdSelect = fdSelect;
16300	}
16301	getFDIndex(glyphIndex) {
16302		if (glyphIndex < 0 || glyphIndex >= this.fdSelect.length) {
16303			return -1;
16304		}
16305		return this.fdSelect[glyphIndex];
16306	}
16307}
16308class CFFOffsetTracker {
16309	constructor() {
16310		this.offsets = Object.create(null);
16311	}
16312	isTracking(key) {
16313		return key in this.offsets;
16314	}
16315	track(key, location) {
16316		if (key in this.offsets) {
16317			throw new FormatError(`Already tracking location of ${key}`);
16318		}
16319		this.offsets[key] = location;
16320	}
16321	offset(value) {
16322		for (const key in this.offsets) {
16323			this.offsets[key] += value;
16324		}
16325	}
16326	setEntryLocation(key, values, output) {
16327		if (!(key in this.offsets)) {
16328			throw new FormatError(`Not tracking location of ${key}`);
16329		}
16330		const data = output.data;
16331		const dataOffset = this.offsets[key];
16332		const size = 5;
16333		for (let i = 0, ii = values.length; i < ii; ++i) {
16334			const offset0 = i * size + dataOffset;
16335			const offset1 = offset0 + 1;
16336			const offset2 = offset0 + 2;
16337			const offset3 = offset0 + 3;
16338			const offset4 = offset0 + 4;
16339			if (data[offset0] !== 0x1d || data[offset1] !== 0 || data[offset2] !== 0 || data[offset3] !== 0 || data[offset4] !== 0) {
16340				throw new FormatError("writing to an offset that is not empty");
16341			}
16342			const value = values[i];
16343			data[offset0] = 0x1d;
16344			data[offset1] = value >> 24 & 0xff;
16345			data[offset2] = value >> 16 & 0xff;
16346			data[offset3] = value >> 8 & 0xff;
16347			data[offset4] = value & 0xff;
16348		}
16349	}
16350}
16351class CFFCompiler {
16352	constructor(cff) {
16353		this.cff = cff;
16354	}
16355	compile() {
16356		const cff = this.cff;
16357		const output = {
16358			data: [],
16359			length: 0,
16360			add(data) {
16361				try {
16362					this.data.push(...data);
16363				} catch {
16364					this.data = this.data.concat(data);
16365				}
16366				this.length = this.data.length;
16367			}
16368		};
16369		const header = this.compileHeader(cff.header);
16370		output.add(header);
16371		const nameIndex = this.compileNameIndex(cff.names);
16372		output.add(nameIndex);
16373		if (cff.isCIDFont) {
16374			if (cff.topDict.hasName("FontMatrix")) {
16375				const base = cff.topDict.getByName("FontMatrix");
16376				cff.topDict.removeByName("FontMatrix");
16377				for (const subDict of cff.fdArray) {
16378					let matrix = base.slice(0);
16379					if (subDict.hasName("FontMatrix")) {
16380						matrix = Util.transform(matrix, subDict.getByName("FontMatrix"));
16381					}
16382					subDict.setByName("FontMatrix", matrix);
16383				}
16384			}
16385		}
16386		const xuid = cff.topDict.getByName("XUID");
16387		if (xuid?.length > 16) {
16388			cff.topDict.removeByName("XUID");
16389		}
16390		cff.topDict.setByName("charset", 0);
16391		let compiled = this.compileTopDicts([cff.topDict], output.length, cff.isCIDFont);
16392		output.add(compiled.output);
16393		const topDictTracker = compiled.trackers[0];
16394		const stringIndex = this.compileStringIndex(cff.strings.strings);
16395		output.add(stringIndex);
16396		const globalSubrIndex = this.compileIndex(cff.globalSubrIndex);
16397		output.add(globalSubrIndex);
16398		if (cff.encoding && cff.topDict.hasName("Encoding")) {
16399			if (cff.encoding.predefined) {
16400				topDictTracker.setEntryLocation("Encoding", [cff.encoding.format], output);
16401			} else {
16402				const encoding = this.compileEncoding(cff.encoding);
16403				topDictTracker.setEntryLocation("Encoding", [output.length], output);
16404				output.add(encoding);
16405			}
16406		}
16407		const charset = this.compileCharset(cff.charset, cff.charStrings.count, cff.strings, cff.isCIDFont);
16408		topDictTracker.setEntryLocation("charset", [output.length], output);
16409		output.add(charset);
16410		const charStrings = this.compileCharStrings(cff.charStrings);
16411		topDictTracker.setEntryLocation("CharStrings", [output.length], output);
16412		output.add(charStrings);
16413		if (cff.isCIDFont) {
16414			topDictTracker.setEntryLocation("FDSelect", [output.length], output);
16415			const fdSelect = this.compileFDSelect(cff.fdSelect);
16416			output.add(fdSelect);
16417			compiled = this.compileTopDicts(cff.fdArray, output.length, true);
16418			topDictTracker.setEntryLocation("FDArray", [output.length], output);
16419			output.add(compiled.output);
16420			const fontDictTrackers = compiled.trackers;
16421			this.compilePrivateDicts(cff.fdArray, fontDictTrackers, output);
16422		}
16423		this.compilePrivateDicts([cff.topDict], [topDictTracker], output);
16424		output.add([0]);
16425		return output.data;
16426	}
16427	encodeNumber(value) {
16428		if (Number.isInteger(value)) {
16429			return this.encodeInteger(value);
16430		}
16431		return this.encodeFloat(value);
16432	}
16433	static get EncodeFloatRegExp() {
16434		return shadow(this, "EncodeFloatRegExp", /\.(\d*?)(?:9{5,20}|0{5,20})\d{0,2}(?:e(.+)|$)/);
16435	}
16436	encodeFloat(num) {
16437		let value = num.toString();
16438		const m = CFFCompiler.EncodeFloatRegExp.exec(value);
16439		if (m) {
16440			const epsilon = parseFloat("1e" + ((m[2] ? +m[2] : 0) + m[1].length));
16441			value = (Math.round(num * epsilon) / epsilon).toString();
16442		}
16443		let nibbles = "";
16444		let i, ii;
16445		for (i = 0, ii = value.length; i < ii; ++i) {
16446			const a = value[i];
16447			if (a === "e") {
16448				nibbles += value[++i] === "-" ? "c" : "b";
16449			} else if (a === ".") {
16450				nibbles += "a";
16451			} else if (a === "-") {
16452				nibbles += "e";
16453			} else {
16454				nibbles += a;
16455			}
16456		}
16457		nibbles += nibbles.length & 1 ? "f" : "ff";
16458		const out = [30];
16459		for (i = 0, ii = nibbles.length; i < ii; i += 2) {
16460			out.push(parseInt(nibbles.substring(i, i + 2), 16));
16461		}
16462		return out;
16463	}
16464	encodeInteger(value) {
16465		let code;
16466		if (value >= -107 && value <= 107) {
16467			code = [value + 139];
16468		} else if (value >= 108 && value <= 1131) {
16469			value -= 108;
vendor: 4,838 bytes, lines 16470-16621
16470			code = [(value >> 8) + 247, value & 0xff];
16471		} else if (value >= -1131 && value <= -108) {
16472			value = -value - 108;
16473			code = [(value >> 8) + 251, value & 0xff];
16474		} else if (value >= -32768 && value <= 32767) {
16475			code = [0x1c, value >> 8 & 0xff, value & 0xff];
16476		} else {
16477			code = [0x1d, value >> 24 & 0xff, value >> 16 & 0xff, value >> 8 & 0xff, value & 0xff];
16478		}
16479		return code;
16480	}
16481	compileHeader(header) {
16482		return [header.major, header.minor, 4, header.offSize];
16483	}
16484	compileNameIndex(names) {
16485		const nameIndex = new CFFIndex();
16486		for (const name of names) {
16487			const length = Math.min(name.length, 127);
16488			let sanitizedName = new Array(length);
16489			for (let j = 0; j < length; j++) {
16490				let char = name[j];
16491				if (char < "!" || char > "~" || char === "[" || char === "]" || char === "(" || char === ")" || char === "{" || char === "}" || char === "<" || char === ">" || char === "/" || char === "%") {
16492					char = "_";
16493				}
16494				sanitizedName[j] = char;
16495			}
16496			sanitizedName = sanitizedName.join("");
16497			if (sanitizedName === "") {
16498				sanitizedName = "Bad_Font_Name";
16499			}
16500			nameIndex.add(stringToBytes(sanitizedName));
16501		}
16502		return this.compileIndex(nameIndex);
16503	}
16504	compileTopDicts(dicts, length, removeCidKeys) {
16505		const fontDictTrackers = [];
16506		let fdArrayIndex = new CFFIndex();
16507		for (const fontDict of dicts) {
16508			if (removeCidKeys) {
16509				fontDict.removeByName("CIDFontVersion");
16510				fontDict.removeByName("CIDFontRevision");
16511				fontDict.removeByName("CIDFontType");
16512				fontDict.removeByName("CIDCount");
16513				fontDict.removeByName("UIDBase");
16514			}
16515			const fontDictTracker = new CFFOffsetTracker();
16516			const fontDictData = this.compileDict(fontDict, fontDictTracker);
16517			fontDictTrackers.push(fontDictTracker);
16518			fdArrayIndex.add(fontDictData);
16519			fontDictTracker.offset(length);
16520		}
16521		fdArrayIndex = this.compileIndex(fdArrayIndex, fontDictTrackers);
16522		return {
16523			trackers: fontDictTrackers,
16524			output: fdArrayIndex
16525		};
16526	}
16527	compilePrivateDicts(dicts, trackers, output) {
16528		for (let i = 0, ii = dicts.length; i < ii; ++i) {
16529			const fontDict = dicts[i];
16530			const privateDict = fontDict.privateDict;
16531			if (!privateDict || !fontDict.hasName("Private")) {
16532				throw new FormatError("There must be a private dictionary.");
16533			}
16534			const privateDictTracker = new CFFOffsetTracker();
16535			const privateDictData = this.compileDict(privateDict, privateDictTracker);
16536			let outputLength = output.length;
16537			privateDictTracker.offset(outputLength);
16538			if (!privateDictData.length) {
16539				outputLength = 0;
16540			}
16541			trackers[i].setEntryLocation("Private", [privateDictData.length, outputLength], output);
16542			output.add(privateDictData);
16543			if (privateDict.subrsIndex && privateDict.hasName("Subrs")) {
16544				const subrs = this.compileIndex(privateDict.subrsIndex);
16545				privateDictTracker.setEntryLocation("Subrs", [privateDictData.length], output);
16546				output.add(subrs);
16547			}
16548		}
16549	}
16550	compileDict(dict, offsetTracker) {
16551		const out = [];
16552		for (const key of dict.order) {
16553			if (!(key in dict.values)) {
16554				continue;
16555			}
16556			let values = dict.values[key];
16557			let types = dict.types[key];
16558			if (!Array.isArray(types)) {
16559				types = [types];
16560			}
16561			if (!Array.isArray(values)) {
16562				values = [values];
16563			}
16564			if (values.length === 0) {
16565				continue;
16566			}
16567			for (let j = 0, jj = types.length; j < jj; ++j) {
16568				const type = types[j];
16569				const value = values[j];
16570				switch (type) {
16571					case "num":
16572					case "sid":
16573						out.push(...this.encodeNumber(value));
16574						break;
16575					case "offset":
16576						const name = dict.keyToNameMap[key];
16577						if (!offsetTracker.isTracking(name)) {
16578							offsetTracker.track(name, out.length);
16579						}
16580						out.push(0x1d, 0, 0, 0, 0);
16581						break;
16582					case "array":
16583					case "delta":
16584						out.push(...this.encodeNumber(value));
16585						for (let k = 1, kk = values.length; k < kk; ++k) {
16586							out.push(...this.encodeNumber(values[k]));
16587						}
16588						break;
16589					default:
16590						throw new FormatError(`Unknown data type of ${type}`);
16591				}
16592			}
16593			out.push(...dict.opcodes[key]);
16594		}
16595		return out;
16596	}
16597	compileStringIndex(strings) {
16598		const stringIndex = new CFFIndex();
16599		for (const string of strings) {
16600			stringIndex.add(stringToBytes(string));
16601		}
16602		return this.compileIndex(stringIndex);
16603	}
16604	compileCharStrings(charStrings) {
16605		const charStringsIndex = new CFFIndex();
16606		for (let i = 0; i < charStrings.count; i++) {
16607			const glyph = charStrings.get(i);
16608			if (glyph.length === 0) {
16609				charStringsIndex.add(new Uint8Array([0x8b, 0x0e]));
16610				continue;
16611			}
16612			charStringsIndex.add(glyph);
16613		}
16614		return this.compileIndex(charStringsIndex);
16615	}
16616	compileCharset(charset, numGlyphs, strings, isCIDFont) {
16617		let out;
16618		const numGlyphsLessNotDef = numGlyphs - 1;
16619		if (isCIDFont) {
16620			out = new Uint8Array([2, 0, 0, numGlyphsLessNotDef >> 8 & 0xff, numGlyphsLessNotDef & 0xff]);
16621		} else {
vendor: 4,947 bytes, lines 16622-16815
16622			const length = 1 + numGlyphsLessNotDef * 2;
16623			out = new Uint8Array(length);
16624			out[0] = 0;
16625			let charsetIndex = 0;
16626			const numCharsets = charset.charset.length;
16627			let warned = false;
16628			for (let i = 1; i < out.length; i += 2) {
16629				let sid = 0;
16630				if (charsetIndex < numCharsets) {
16631					const name = charset.charset[charsetIndex++];
16632					sid = strings.getSID(name);
16633					if (sid === -1) {
16634						sid = 0;
16635						if (!warned) {
16636							warned = true;
16637							warn(`Couldn't find ${name} in CFF strings`);
16638						}
16639					}
16640				}
16641				out[i] = sid >> 8 & 0xff;
16642				out[i + 1] = sid & 0xff;
16643			}
16644		}
16645		return this.compileTypedArray(out);
16646	}
16647	compileEncoding(encoding) {
16648		return this.compileTypedArray(encoding.raw);
16649	}
16650	compileFDSelect(fdSelect) {
16651		const format = fdSelect.format;
16652		let out, i;
16653		switch (format) {
16654			case 0:
16655				out = new Uint8Array(1 + fdSelect.fdSelect.length);
16656				out[0] = format;
16657				for (i = 0; i < fdSelect.fdSelect.length; i++) {
16658					out[i + 1] = fdSelect.fdSelect[i];
16659				}
16660				break;
16661			case 3:
16662				const start = 0;
16663				let lastFD = fdSelect.fdSelect[0];
16664				const ranges = [format, 0, 0, start >> 8 & 0xff, start & 0xff, lastFD];
16665				for (i = 1; i < fdSelect.fdSelect.length; i++) {
16666					const currentFD = fdSelect.fdSelect[i];
16667					if (currentFD !== lastFD) {
16668						ranges.push(i >> 8 & 0xff, i & 0xff, currentFD);
16669						lastFD = currentFD;
16670					}
16671				}
16672				const numRanges = (ranges.length - 3) / 3;
16673				ranges[1] = numRanges >> 8 & 0xff;
16674				ranges[2] = numRanges & 0xff;
16675				ranges.push(i >> 8 & 0xff, i & 0xff);
16676				out = new Uint8Array(ranges);
16677				break;
16678		}
16679		return this.compileTypedArray(out);
16680	}
16681	compileTypedArray(data) {
16682		return Array.from(data);
16683	}
16684	compileIndex(index, trackers = []) {
16685		const objects = index.objects;
16686		const count = objects.length;
16687		if (count === 0) {
16688			return [0, 0];
16689		}
16690		const data = [count >> 8 & 0xff, count & 0xff];
16691		let lastOffset = 1,
16692			i;
16693		for (i = 0; i < count; ++i) {
16694			lastOffset += objects[i].length;
16695		}
16696		let offsetSize;
16697		if (lastOffset < 0x100) {
16698			offsetSize = 1;
16699		} else if (lastOffset < 0x10000) {
16700			offsetSize = 2;
16701		} else if (lastOffset < 0x1000000) {
16702			offsetSize = 3;
16703		} else {
16704			offsetSize = 4;
16705		}
16706		data.push(offsetSize);
16707		let relativeOffset = 1;
16708		for (i = 0; i < count + 1; i++) {
16709			if (offsetSize === 1) {
16710				data.push(relativeOffset & 0xff);
16711			} else if (offsetSize === 2) {
16712				data.push(relativeOffset >> 8 & 0xff, relativeOffset & 0xff);
16713			} else if (offsetSize === 3) {
16714				data.push(relativeOffset >> 16 & 0xff, relativeOffset >> 8 & 0xff, relativeOffset & 0xff);
16715			} else {
16716				data.push(relativeOffset >>> 24 & 0xff, relativeOffset >> 16 & 0xff, relativeOffset >> 8 & 0xff, relativeOffset & 0xff);
16717			}
16718			if (objects[i]) {
16719				relativeOffset += objects[i].length;
16720			}
16721		}
16722		for (i = 0; i < count; i++) {
16723			if (trackers[i]) {
16724				trackers[i].offset(data.length);
16725			}
16726			data.push(...objects[i]);
16727		}
16728		return data;
16729	}
16730}
16731
16732;// ./src/core/glyphlist.js
16733
16734const getGlyphsUnicode = getLookupTableFactory(function (t) {
16735	t.A = 0x0041;
16736	t.AE = 0x00c6;
16737	t.AEacute = 0x01fc;
16738	t.AEmacron = 0x01e2;
16739	t.AEsmall = 0xf7e6;
16740	t.Aacute = 0x00c1;
16741	t.Aacutesmall = 0xf7e1;
16742	t.Abreve = 0x0102;
16743	t.Abreveacute = 0x1eae;
16744	t.Abrevecyrillic = 0x04d0;
16745	t.Abrevedotbelow = 0x1eb6;
16746	t.Abrevegrave = 0x1eb0;
16747	t.Abrevehookabove = 0x1eb2;
16748	t.Abrevetilde = 0x1eb4;
16749	t.Acaron = 0x01cd;
16750	t.Acircle = 0x24b6;
16751	t.Acircumflex = 0x00c2;
16752	t.Acircumflexacute = 0x1ea4;
16753	t.Acircumflexdotbelow = 0x1eac;
16754	t.Acircumflexgrave = 0x1ea6;
16755	t.Acircumflexhookabove = 0x1ea8;
16756	t.Acircumflexsmall = 0xf7e2;
16757	t.Acircumflextilde = 0x1eaa;
16758	t.Acute = 0xf6c9;
16759	t.Acutesmall = 0xf7b4;
16760	t.Acyrillic = 0x0410;
16761	t.Adblgrave = 0x0200;
16762	t.Adieresis = 0x00c4;
16763	t.Adieresiscyrillic = 0x04d2;
16764	t.Adieresismacron = 0x01de;
16765	t.Adieresissmall = 0xf7e4;
16766	t.Adotbelow = 0x1ea0;
16767	t.Adotmacron = 0x01e0;
16768	t.Agrave = 0x00c0;
16769	t.Agravesmall = 0xf7e0;
16770	t.Ahookabove = 0x1ea2;
16771	t.Aiecyrillic = 0x04d4;
16772	t.Ainvertedbreve = 0x0202;
16773	t.Alpha = 0x0391;
16774	t.Alphatonos = 0x0386;
16775	t.Amacron = 0x0100;
16776	t.Amonospace = 0xff21;
16777	t.Aogonek = 0x0104;
16778	t.Aring = 0x00c5;
16779	t.Aringacute = 0x01fa;
16780	t.Aringbelow = 0x1e00;
16781	t.Aringsmall = 0xf7e5;
16782	t.Asmall = 0xf761;
16783	t.Atilde = 0x00c3;
16784	t.Atildesmall = 0xf7e3;
16785	t.Aybarmenian = 0x0531;
16786	t.B = 0x0042;
16787	t.Bcircle = 0x24b7;
16788	t.Bdotaccent = 0x1e02;
16789	t.Bdotbelow = 0x1e04;
16790	t.Becyrillic = 0x0411;
16791	t.Benarmenian = 0x0532;
16792	t.Beta = 0x0392;
16793	t.Bhook = 0x0181;
16794	t.Blinebelow = 0x1e06;
16795	t.Bmonospace = 0xff22;
16796	t.Brevesmall = 0xf6f4;
16797	t.Bsmall = 0xf762;
16798	t.Btopbar = 0x0182;
16799	t.C = 0x0043;
16800	t.Caarmenian = 0x053e;
16801	t.Cacute = 0x0106;
16802	t.Caron = 0xf6ca;
16803	t.Caronsmall = 0xf6f5;
16804	t.Ccaron = 0x010c;
16805	t.Ccedilla = 0x00c7;
16806	t.Ccedillaacute = 0x1e08;
16807	t.Ccedillasmall = 0xf7e7;
16808	t.Ccircle = 0x24b8;
16809	t.Ccircumflex = 0x0108;
16810	t.Cdot = 0x010a;
16811	t.Cdotaccent = 0x010a;
16812	t.Cedillasmall = 0xf7b8;
16813	t.Chaarmenian = 0x0549;
16814	t.Cheabkhasiancyrillic = 0x04bc;
16815	t.Checyrillic = 0x0427;
16816	t.Chedescenderabkhasiancyrillic = 0x04be;
16817	t.Chedescendercyrillic = 0x04b6;
16818	t.Chedieresiscyrillic = 0x04f4;
16819	t.Cheharmenian = 0x0543;
16820	t.Chekhakassiancyrillic = 0x04cb;
16821	t.Cheverticalstrokecyrillic = 0x04b8;
16822	t.Chi = 0x03a7;
16823	t.Chook = 0x0187;
16824	t.Circumflexsmall = 0xf6f6;
16825	t.Cmonospace = 0xff23;
16826	t.Coarmenian = 0x0551;
16827	t.Csmall = 0xf763;
16828	t.D = 0x0044;
16829	t.DZ = 0x01f1;
16830	t.DZcaron = 0x01c4;
16831	t.Daarmenian = 0x0534;
16832	t.Dafrican = 0x0189;
16833	t.Dcaron = 0x010e;
16834	t.Dcedilla = 0x1e10;
16835	t.Dcircle = 0x24b9;
16836	t.Dcircumflexbelow = 0x1e12;
16837	t.Dcroat = 0x0110;
16838	t.Ddotaccent = 0x1e0a;
16839	t.Ddotbelow = 0x1e0c;
16840	t.Decyrillic = 0x0414;
16841	t.Deicoptic = 0x03ee;
16842	t.Delta = 0x2206;
16843	t.Deltagreek = 0x0394;
16844	t.Dhook = 0x018a;
16845	t.Dieresis = 0xf6cb;
16846	t.DieresisAcute = 0xf6cc;
16847	t.DieresisGrave = 0xf6cd;
16848	t.Dieresissmall = 0xf7a8;
16849	t.Digammagreek = 0x03dc;
16850	t.Djecyrillic = 0x0402;
16851	t.Dlinebelow = 0x1e0e;
16852	t.Dmonospace = 0xff24;
16853	t.Dotaccentsmall = 0xf6f7;
16854	t.Dslash = 0x0110;
16855	t.Dsmall = 0xf764;
16856	t.Dtopbar = 0x018b;
16857	t.Dz = 0x01f2;
16858	t.Dzcaron = 0x01c5;
16859	t.Dzeabkhasiancyrillic = 0x04e0;
16860	t.Dzecyrillic = 0x0405;
16861	t.Dzhecyrillic = 0x040f;
16862	t.E = 0x0045;
16863	t.Eacute = 0x00c9;
16864	t.Eacutesmall = 0xf7e9;
16865	t.Ebreve = 0x0114;
16866	t.Ecaron = 0x011a;
16867	t.Ecedillabreve = 0x1e1c;
16868	t.Echarmenian = 0x0535;
16869	t.Ecircle = 0x24ba;
16870	t.Ecircumflex = 0x00ca;
16871	t.Ecircumflexacute = 0x1ebe;
16872	t.Ecircumflexbelow = 0x1e18;
16873	t.Ecircumflexdotbelow = 0x1ec6;
16874	t.Ecircumflexgrave = 0x1ec0;
16875	t.Ecircumflexhookabove = 0x1ec2;
16876	t.Ecircumflexsmall = 0xf7ea;
16877	t.Ecircumflextilde = 0x1ec4;
16878	t.Ecyrillic = 0x0404;
16879	t.Edblgrave = 0x0204;
16880	t.Edieresis = 0x00cb;
16881	t.Edieresissmall = 0xf7eb;
16882	t.Edot = 0x0116;
16883	t.Edotaccent = 0x0116;
16884	t.Edotbelow = 0x1eb8;
16885	t.Efcyrillic = 0x0424;
16886	t.Egrave = 0x00c8;
16887	t.Egravesmall = 0xf7e8;
16888	t.Eharmenian = 0x0537;
16889	t.Ehookabove = 0x1eba;
16890	t.Eightroman = 0x2167;
16891	t.Einvertedbreve = 0x0206;
16892	t.Eiotifiedcyrillic = 0x0464;
16893	t.Elcyrillic = 0x041b;
16894	t.Elevenroman = 0x216a;
16895	t.Emacron = 0x0112;
16896	t.Emacronacute = 0x1e16;
16897	t.Emacrongrave = 0x1e14;
16898	t.Emcyrillic = 0x041c;
16899	t.Emonospace = 0xff25;
16900	t.Encyrillic = 0x041d;
16901	t.Endescendercyrillic = 0x04a2;
16902	t.Eng = 0x014a;
16903	t.Enghecyrillic = 0x04a4;
16904	t.Enhookcyrillic = 0x04c7;
16905	t.Eogonek = 0x0118;
16906	t.Eopen = 0x0190;
16907	t.Epsilon = 0x0395;
16908	t.Epsilontonos = 0x0388;
16909	t.Ercyrillic = 0x0420;
16910	t.Ereversed = 0x018e;
16911	t.Ereversedcyrillic = 0x042d;
16912	t.Escyrillic = 0x0421;
16913	t.Esdescendercyrillic = 0x04aa;
16914	t.Esh = 0x01a9;
16915	t.Esmall = 0xf765;
16916	t.Eta = 0x0397;
16917	t.Etarmenian = 0x0538;
16918	t.Etatonos = 0x0389;
16919	t.Eth = 0x00d0;
16920	t.Ethsmall = 0xf7f0;
16921	t.Etilde = 0x1ebc;
16922	t.Etildebelow = 0x1e1a;
16923	t.Euro = 0x20ac;
16924	t.Ezh = 0x01b7;
16925	t.Ezhcaron = 0x01ee;
16926	t.Ezhreversed = 0x01b8;
16927	t.F = 0x0046;
16928	t.Fcircle = 0x24bb;
16929	t.Fdotaccent = 0x1e1e;
16930	t.Feharmenian = 0x0556;
16931	t.Feicoptic = 0x03e4;
16932	t.Fhook = 0x0191;
16933	t.Fitacyrillic = 0x0472;
16934	t.Fiveroman = 0x2164;
16935	t.Fmonospace = 0xff26;
16936	t.Fourroman = 0x2163;
16937	t.Fsmall = 0xf766;
16938	t.G = 0x0047;
16939	t.GBsquare = 0x3387;
16940	t.Gacute = 0x01f4;
16941	t.Gamma = 0x0393;
16942	t.Gammaafrican = 0x0194;
16943	t.Gangiacoptic = 0x03ea;
16944	t.Gbreve = 0x011e;
16945	t.Gcaron = 0x01e6;
16946	t.Gcedilla = 0x0122;
16947	t.Gcircle = 0x24bc;
16948	t.Gcircumflex = 0x011c;
16949	t.Gcommaaccent = 0x0122;
16950	t.Gdot = 0x0120;
16951	t.Gdotaccent = 0x0120;
16952	t.Gecyrillic = 0x0413;
16953	t.Ghadarmenian = 0x0542;
16954	t.Ghemiddlehookcyrillic = 0x0494;
16955	t.Ghestrokecyrillic = 0x0492;
16956	t.Gheupturncyrillic = 0x0490;
16957	t.Ghook = 0x0193;
16958	t.Gimarmenian = 0x0533;
16959	t.Gjecyrillic = 0x0403;
16960	t.Gmacron = 0x1e20;
16961	t.Gmonospace = 0xff27;
16962	t.Grave = 0xf6ce;
16963	t.Gravesmall = 0xf760;
16964	t.Gsmall = 0xf767;
16965	t.Gsmallhook = 0x029b;
16966	t.Gstroke = 0x01e4;
16967	t.H = 0x0048;
16968	t.H18533 = 0x25cf;
16969	t.H18543 = 0x25aa;
16970	t.H18551 = 0x25ab;
16971	t.H22073 = 0x25a1;
16972	t.HPsquare = 0x33cb;
16973	t.Haabkhasiancyrillic = 0x04a8;
16974	t.Hadescendercyrillic = 0x04b2;
16975	t.Hardsigncyrillic = 0x042a;
16976	t.Hbar = 0x0126;
16977	t.Hbrevebelow = 0x1e2a;
16978	t.Hcedilla = 0x1e28;
16979	t.Hcircle = 0x24bd;
16980	t.Hcircumflex = 0x0124;
16981	t.Hdieresis = 0x1e26;
16982	t.Hdotaccent = 0x1e22;
16983	t.Hdotbelow = 0x1e24;
16984	t.Hmonospace = 0xff28;
16985	t.Hoarmenian = 0x0540;
16986	t.Horicoptic = 0x03e8;
16987	t.Hsmall = 0xf768;
16988	t.Hungarumlaut = 0xf6cf;
16989	t.Hungarumlautsmall = 0xf6f8;
16990	t.Hzsquare = 0x3390;
16991	t.I = 0x0049;
16992	t.IAcyrillic = 0x042f;
16993	t.IJ = 0x0132;
16994	t.IUcyrillic = 0x042e;
16995	t.Iacute = 0x00cd;
16996	t.Iacutesmall = 0xf7ed;
16997	t.Ibreve = 0x012c;
16998	t.Icaron = 0x01cf;
16999	t.Icircle = 0x24be;
17000	t.Icircumflex = 0x00ce;
17001	t.Icircumflexsmall = 0xf7ee;
17002	t.Icyrillic = 0x0406;
17003	t.Idblgrave = 0x0208;
17004	t.Idieresis = 0x00cf;
17005	t.Idieresisacute = 0x1e2e;
17006	t.Idieresiscyrillic = 0x04e4;
17007	t.Idieresissmall = 0xf7ef;
17008	t.Idot = 0x0130;
17009	t.Idotaccent = 0x0130;
17010	t.Idotbelow = 0x1eca;
17011	t.Iebrevecyrillic = 0x04d6;
17012	t.Iecyrillic = 0x0415;
17013	t.Ifraktur = 0x2111;
17014	t.Igrave = 0x00cc;
17015	t.Igravesmall = 0xf7ec;
17016	t.Ihookabove = 0x1ec8;
17017	t.Iicyrillic = 0x0418;
17018	t.Iinvertedbreve = 0x020a;
17019	t.Iishortcyrillic = 0x0419;
17020	t.Imacron = 0x012a;
17021	t.Imacroncyrillic = 0x04e2;
17022	t.Imonospace = 0xff29;
17023	t.Iniarmenian = 0x053b;
17024	t.Iocyrillic = 0x0401;
17025	t.Iogonek = 0x012e;
17026	t.Iota = 0x0399;
17027	t.Iotaafrican = 0x0196;
17028	t.Iotadieresis = 0x03aa;
17029	t.Iotatonos = 0x038a;
17030	t.Ismall = 0xf769;
17031	t.Istroke = 0x0197;
17032	t.Itilde = 0x0128;
17033	t.Itildebelow = 0x1e2c;
17034	t.Izhitsacyrillic = 0x0474;
17035	t.Izhitsadblgravecyrillic = 0x0476;
17036	t.J = 0x004a;
17037	t.Jaarmenian = 0x0541;
17038	t.Jcircle = 0x24bf;
17039	t.Jcircumflex = 0x0134;
17040	t.Jecyrillic = 0x0408;
17041	t.Jheharmenian = 0x054b;
17042	t.Jmonospace = 0xff2a;
17043	t.Jsmall = 0xf76a;
17044	t.K = 0x004b;
17045	t.KBsquare = 0x3385;
17046	t.KKsquare = 0x33cd;
17047	t.Kabashkircyrillic = 0x04a0;
17048	t.Kacute = 0x1e30;
17049	t.Kacyrillic = 0x041a;
17050	t.Kadescendercyrillic = 0x049a;
17051	t.Kahookcyrillic = 0x04c3;
17052	t.Kappa = 0x039a;
17053	t.Kastrokecyrillic = 0x049e;
17054	t.Kaverticalstrokecyrillic = 0x049c;
17055	t.Kcaron = 0x01e8;
17056	t.Kcedilla = 0x0136;
17057	t.Kcircle = 0x24c0;
17058	t.Kcommaaccent = 0x0136;
17059	t.Kdotbelow = 0x1e32;
17060	t.Keharmenian = 0x0554;
17061	t.Kenarmenian = 0x053f;
17062	t.Khacyrillic = 0x0425;
17063	t.Kheicoptic = 0x03e6;
17064	t.Khook = 0x0198;
17065	t.Kjecyrillic = 0x040c;
17066	t.Klinebelow = 0x1e34;
17067	t.Kmonospace = 0xff2b;
17068	t.Koppacyrillic = 0x0480;
17069	t.Koppagreek = 0x03de;
17070	t.Ksicyrillic = 0x046e;
17071	t.Ksmall = 0xf76b;
17072	t.L = 0x004c;
17073	t.LJ = 0x01c7;
17074	t.LL = 0xf6bf;
17075	t.Lacute = 0x0139;
17076	t.Lambda = 0x039b;
17077	t.Lcaron = 0x013d;
17078	t.Lcedilla = 0x013b;
17079	t.Lcircle = 0x24c1;
17080	t.Lcircumflexbelow = 0x1e3c;
17081	t.Lcommaaccent = 0x013b;
17082	t.Ldot = 0x013f;
17083	t.Ldotaccent = 0x013f;
17084	t.Ldotbelow = 0x1e36;
17085	t.Ldotbelowmacron = 0x1e38;
17086	t.Liwnarmenian = 0x053c;
17087	t.Lj = 0x01c8;
17088	t.Ljecyrillic = 0x0409;
17089	t.Llinebelow = 0x1e3a;
17090	t.Lmonospace = 0xff2c;
17091	t.Lslash = 0x0141;
17092	t.Lslashsmall = 0xf6f9;
17093	t.Lsmall = 0xf76c;
17094	t.M = 0x004d;
17095	t.MBsquare = 0x3386;
17096	t.Macron = 0xf6d0;
17097	t.Macronsmall = 0xf7af;
17098	t.Macute = 0x1e3e;
17099	t.Mcircle = 0x24c2;
17100	t.Mdotaccent = 0x1e40;
17101	t.Mdotbelow = 0x1e42;
17102	t.Menarmenian = 0x0544;
17103	t.Mmonospace = 0xff2d;
17104	t.Msmall = 0xf76d;
17105	t.Mturned = 0x019c;
17106	t.Mu = 0x039c;
17107	t.N = 0x004e;
17108	t.NJ = 0x01ca;
17109	t.Nacute = 0x0143;
17110	t.Ncaron = 0x0147;
17111	t.Ncedilla = 0x0145;
17112	t.Ncircle = 0x24c3;
17113	t.Ncircumflexbelow = 0x1e4a;
17114	t.Ncommaaccent = 0x0145;
17115	t.Ndotaccent = 0x1e44;
17116	t.Ndotbelow = 0x1e46;
17117	t.Nhookleft = 0x019d;
17118	t.Nineroman = 0x2168;
17119	t.Nj = 0x01cb;
17120	t.Njecyrillic = 0x040a;
17121	t.Nlinebelow = 0x1e48;
17122	t.Nmonospace = 0xff2e;
17123	t.Nowarmenian = 0x0546;
17124	t.Nsmall = 0xf76e;
17125	t.Ntilde = 0x00d1;
17126	t.Ntildesmall = 0xf7f1;
17127	t.Nu = 0x039d;
17128	t.O = 0x004f;
17129	t.OE = 0x0152;
17130	t.OEsmall = 0xf6fa;
17131	t.Oacute = 0x00d3;
17132	t.Oacutesmall = 0xf7f3;
17133	t.Obarredcyrillic = 0x04e8;
17134	t.Obarreddieresiscyrillic = 0x04ea;
17135	t.Obreve = 0x014e;
17136	t.Ocaron = 0x01d1;
17137	t.Ocenteredtilde = 0x019f;
17138	t.Ocircle = 0x24c4;
17139	t.Ocircumflex = 0x00d4;
17140	t.Ocircumflexacute = 0x1ed0;
17141	t.Ocircumflexdotbelow = 0x1ed8;
17142	t.Ocircumflexgrave = 0x1ed2;
17143	t.Ocircumflexhookabove = 0x1ed4;
17144	t.Ocircumflexsmall = 0xf7f4;
17145	t.Ocircumflextilde = 0x1ed6;
17146	t.Ocyrillic = 0x041e;
17147	t.Odblacute = 0x0150;
17148	t.Odblgrave = 0x020c;
17149	t.Odieresis = 0x00d6;
17150	t.Odieresiscyrillic = 0x04e6;
17151	t.Odieresissmall = 0xf7f6;
17152	t.Odotbelow = 0x1ecc;
17153	t.Ogoneksmall = 0xf6fb;
17154	t.Ograve = 0x00d2;
17155	t.Ogravesmall = 0xf7f2;
17156	t.Oharmenian = 0x0555;
17157	t.Ohm = 0x2126;
17158	t.Ohookabove = 0x1ece;
17159	t.Ohorn = 0x01a0;
17160	t.Ohornacute = 0x1eda;
17161	t.Ohorndotbelow = 0x1ee2;
17162	t.Ohorngrave = 0x1edc;
17163	t.Ohornhookabove = 0x1ede;
17164	t.Ohorntilde = 0x1ee0;
17165	t.Ohungarumlaut = 0x0150;
17166	t.Oi = 0x01a2;
17167	t.Oinvertedbreve = 0x020e;
17168	t.Omacron = 0x014c;
17169	t.Omacronacute = 0x1e52;
17170	t.Omacrongrave = 0x1e50;
17171	t.Omega = 0x2126;
17172	t.Omegacyrillic = 0x0460;
17173	t.Omegagreek = 0x03a9;
17174	t.Omegaroundcyrillic = 0x047a;
17175	t.Omegatitlocyrillic = 0x047c;
17176	t.Omegatonos = 0x038f;
17177	t.Omicron = 0x039f;
17178	t.Omicrontonos = 0x038c;
17179	t.Omonospace = 0xff2f;
17180	t.Oneroman = 0x2160;
17181	t.Oogonek = 0x01ea;
17182	t.Oogonekmacron = 0x01ec;
17183	t.Oopen = 0x0186;
17184	t.Oslash = 0x00d8;
17185	t.Oslashacute = 0x01fe;
17186	t.Oslashsmall = 0xf7f8;
17187	t.Osmall = 0xf76f;
17188	t.Ostrokeacute = 0x01fe;
17189	t.Otcyrillic = 0x047e;
17190	t.Otilde = 0x00d5;
17191	t.Otildeacute = 0x1e4c;
17192	t.Otildedieresis = 0x1e4e;
17193	t.Otildesmall = 0xf7f5;
17194	t.P = 0x0050;
17195	t.Pacute = 0x1e54;
17196	t.Pcircle = 0x24c5;
17197	t.Pdotaccent = 0x1e56;
17198	t.Pecyrillic = 0x041f;
17199	t.Peharmenian = 0x054a;
17200	t.Pemiddlehookcyrillic = 0x04a6;
17201	t.Phi = 0x03a6;
17202	t.Phook = 0x01a4;
17203	t.Pi = 0x03a0;
17204	t.Piwrarmenian = 0x0553;
17205	t.Pmonospace = 0xff30;
17206	t.Psi = 0x03a8;
17207	t.Psicyrillic = 0x0470;
17208	t.Psmall = 0xf770;
17209	t.Q = 0x0051;
17210	t.Qcircle = 0x24c6;
17211	t.Qmonospace = 0xff31;
17212	t.Qsmall = 0xf771;
17213	t.R = 0x0052;
17214	t.Raarmenian = 0x054c;
17215	t.Racute = 0x0154;
17216	t.Rcaron = 0x0158;
17217	t.Rcedilla = 0x0156;
17218	t.Rcircle = 0x24c7;
17219	t.Rcommaaccent = 0x0156;
17220	t.Rdblgrave = 0x0210;
17221	t.Rdotaccent = 0x1e58;
17222	t.Rdotbelow = 0x1e5a;
17223	t.Rdotbelowmacron = 0x1e5c;
17224	t.Reharmenian = 0x0550;
17225	t.Rfraktur = 0x211c;
17226	t.Rho = 0x03a1;
17227	t.Ringsmall = 0xf6fc;
17228	t.Rinvertedbreve = 0x0212;
17229	t.Rlinebelow = 0x1e5e;
17230	t.Rmonospace = 0xff32;
17231	t.Rsmall = 0xf772;
17232	t.Rsmallinverted = 0x0281;
17233	t.Rsmallinvertedsuperior = 0x02b6;
17234	t.S = 0x0053;
17235	t.SF010000 = 0x250c;
17236	t.SF020000 = 0x2514;
17237	t.SF030000 = 0x2510;
17238	t.SF040000 = 0x2518;
17239	t.SF050000 = 0x253c;
17240	t.SF060000 = 0x252c;
17241	t.SF070000 = 0x2534;
17242	t.SF080000 = 0x251c;
17243	t.SF090000 = 0x2524;
17244	t.SF100000 = 0x2500;
17245	t.SF110000 = 0x2502;
17246	t.SF190000 = 0x2561;
17247	t.SF200000 = 0x2562;
17248	t.SF210000 = 0x2556;
17249	t.SF220000 = 0x2555;
17250	t.SF230000 = 0x2563;
17251	t.SF240000 = 0x2551;
17252	t.SF250000 = 0x2557;
17253	t.SF260000 = 0x255d;
17254	t.SF270000 = 0x255c;
17255	t.SF280000 = 0x255b;
17256	t.SF360000 = 0x255e;
17257	t.SF370000 = 0x255f;
17258	t.SF380000 = 0x255a;
17259	t.SF390000 = 0x2554;
17260	t.SF400000 = 0x2569;
17261	t.SF410000 = 0x2566;
17262	t.SF420000 = 0x2560;
17263	t.SF430000 = 0x2550;
17264	t.SF440000 = 0x256c;
17265	t.SF450000 = 0x2567;
17266	t.SF460000 = 0x2568;
17267	t.SF470000 = 0x2564;
17268	t.SF480000 = 0x2565;
17269	t.SF490000 = 0x2559;
17270	t.SF500000 = 0x2558;
17271	t.SF510000 = 0x2552;
17272	t.SF520000 = 0x2553;
17273	t.SF530000 = 0x256b;
17274	t.SF540000 = 0x256a;
17275	t.Sacute = 0x015a;
17276	t.Sacutedotaccent = 0x1e64;
17277	t.Sampigreek = 0x03e0;
17278	t.Scaron = 0x0160;
17279	t.Scarondotaccent = 0x1e66;
17280	t.Scaronsmall = 0xf6fd;
17281	t.Scedilla = 0x015e;
17282	t.Schwa = 0x018f;
17283	t.Schwacyrillic = 0x04d8;
17284	t.Schwadieresiscyrillic = 0x04da;
17285	t.Scircle = 0x24c8;
17286	t.Scircumflex = 0x015c;
17287	t.Scommaaccent = 0x0218;
17288	t.Sdotaccent = 0x1e60;
17289	t.Sdotbelow = 0x1e62;
17290	t.Sdotbelowdotaccent = 0x1e68;
17291	t.Seharmenian = 0x054d;
17292	t.Sevenroman = 0x2166;
17293	t.Shaarmenian = 0x0547;
17294	t.Shacyrillic = 0x0428;
17295	t.Shchacyrillic = 0x0429;
17296	t.Sheicoptic = 0x03e2;
17297	t.Shhacyrillic = 0x04ba;
17298	t.Shimacoptic = 0x03ec;
17299	t.Sigma = 0x03a3;
17300	t.Sixroman = 0x2165;
17301	t.Smonospace = 0xff33;
17302	t.Softsigncyrillic = 0x042c;
17303	t.Ssmall = 0xf773;
17304	t.Stigmagreek = 0x03da;
17305	t.T = 0x0054;
17306	t.Tau = 0x03a4;
17307	t.Tbar = 0x0166;
17308	t.Tcaron = 0x0164;
17309	t.Tcedilla = 0x0162;
17310	t.Tcircle = 0x24c9;
17311	t.Tcircumflexbelow = 0x1e70;
17312	t.Tcommaaccent = 0x0162;
17313	t.Tdotaccent = 0x1e6a;
17314	t.Tdotbelow = 0x1e6c;
17315	t.Tecyrillic = 0x0422;
17316	t.Tedescendercyrillic = 0x04ac;
17317	t.Tenroman = 0x2169;
17318	t.Tetsecyrillic = 0x04b4;
17319	t.Theta = 0x0398;
17320	t.Thook = 0x01ac;
17321	t.Thorn = 0x00de;
17322	t.Thornsmall = 0xf7fe;
17323	t.Threeroman = 0x2162;
17324	t.Tildesmall = 0xf6fe;
17325	t.Tiwnarmenian = 0x054f;
17326	t.Tlinebelow = 0x1e6e;
17327	t.Tmonospace = 0xff34;
17328	t.Toarmenian = 0x0539;
17329	t.Tonefive = 0x01bc;
17330	t.Tonesix = 0x0184;
17331	t.Tonetwo = 0x01a7;
17332	t.Tretroflexhook = 0x01ae;
17333	t.Tsecyrillic = 0x0426;
17334	t.Tshecyrillic = 0x040b;
17335	t.Tsmall = 0xf774;
17336	t.Twelveroman = 0x216b;
17337	t.Tworoman = 0x2161;
17338	t.U = 0x0055;
17339	t.Uacute = 0x00da;
17340	t.Uacutesmall = 0xf7fa;
17341	t.Ubreve = 0x016c;
17342	t.Ucaron = 0x01d3;
17343	t.Ucircle = 0x24ca;
17344	t.Ucircumflex = 0x00db;
17345	t.Ucircumflexbelow = 0x1e76;
17346	t.Ucircumflexsmall = 0xf7fb;
17347	t.Ucyrillic = 0x0423;
17348	t.Udblacute = 0x0170;
17349	t.Udblgrave = 0x0214;
17350	t.Udieresis = 0x00dc;
17351	t.Udieresisacute = 0x01d7;
17352	t.Udieresisbelow = 0x1e72;
17353	t.Udieresiscaron = 0x01d9;
17354	t.Udieresiscyrillic = 0x04f0;
17355	t.Udieresisgrave = 0x01db;
17356	t.Udieresismacron = 0x01d5;
17357	t.Udieresissmall = 0xf7fc;
17358	t.Udotbelow = 0x1ee4;
17359	t.Ugrave = 0x00d9;
17360	t.Ugravesmall = 0xf7f9;
17361	t.Uhookabove = 0x1ee6;
17362	t.Uhorn = 0x01af;
17363	t.Uhornacute = 0x1ee8;
17364	t.Uhorndotbelow = 0x1ef0;
17365	t.Uhorngrave = 0x1eea;
17366	t.Uhornhookabove = 0x1eec;
17367	t.Uhorntilde = 0x1eee;
17368	t.Uhungarumlaut = 0x0170;
17369	t.Uhungarumlautcyrillic = 0x04f2;
17370	t.Uinvertedbreve = 0x0216;
17371	t.Ukcyrillic = 0x0478;
17372	t.Umacron = 0x016a;
17373	t.Umacroncyrillic = 0x04ee;
17374	t.Umacrondieresis = 0x1e7a;
17375	t.Umonospace = 0xff35;
17376	t.Uogonek = 0x0172;
17377	t.Upsilon = 0x03a5;
17378	t.Upsilon1 = 0x03d2;
17379	t.Upsilonacutehooksymbolgreek = 0x03d3;
17380	t.Upsilonafrican = 0x01b1;
17381	t.Upsilondieresis = 0x03ab;
17382	t.Upsilondieresishooksymbolgreek = 0x03d4;
17383	t.Upsilonhooksymbol = 0x03d2;
17384	t.Upsilontonos = 0x038e;
17385	t.Uring = 0x016e;
17386	t.Ushortcyrillic = 0x040e;
17387	t.Usmall = 0xf775;
17388	t.Ustraightcyrillic = 0x04ae;
17389	t.Ustraightstrokecyrillic = 0x04b0;
17390	t.Utilde = 0x0168;
17391	t.Utildeacute = 0x1e78;
17392	t.Utildebelow = 0x1e74;
17393	t.V = 0x0056;
17394	t.Vcircle = 0x24cb;
17395	t.Vdotbelow = 0x1e7e;
17396	t.Vecyrillic = 0x0412;
17397	t.Vewarmenian = 0x054e;
17398	t.Vhook = 0x01b2;
17399	t.Vmonospace = 0xff36;
17400	t.Voarmenian = 0x0548;
17401	t.Vsmall = 0xf776;
17402	t.Vtilde = 0x1e7c;
17403	t.W = 0x0057;
17404	t.Wacute = 0x1e82;
17405	t.Wcircle = 0x24cc;
17406	t.Wcircumflex = 0x0174;
17407	t.Wdieresis = 0x1e84;
17408	t.Wdotaccent = 0x1e86;
17409	t.Wdotbelow = 0x1e88;
17410	t.Wgrave = 0x1e80;
17411	t.Wmonospace = 0xff37;
17412	t.Wsmall = 0xf777;
17413	t.X = 0x0058;
17414	t.Xcircle = 0x24cd;
17415	t.Xdieresis = 0x1e8c;
17416	t.Xdotaccent = 0x1e8a;
17417	t.Xeharmenian = 0x053d;
17418	t.Xi = 0x039e;
17419	t.Xmonospace = 0xff38;
17420	t.Xsmall = 0xf778;
17421	t.Y = 0x0059;
17422	t.Yacute = 0x00dd;
17423	t.Yacutesmall = 0xf7fd;
17424	t.Yatcyrillic = 0x0462;
17425	t.Ycircle = 0x24ce;
17426	t.Ycircumflex = 0x0176;
17427	t.Ydieresis = 0x0178;
17428	t.Ydieresissmall = 0xf7ff;
17429	t.Ydotaccent = 0x1e8e;
17430	t.Ydotbelow = 0x1ef4;
17431	t.Yericyrillic = 0x042b;
17432	t.Yerudieresiscyrillic = 0x04f8;
17433	t.Ygrave = 0x1ef2;
17434	t.Yhook = 0x01b3;
17435	t.Yhookabove = 0x1ef6;
17436	t.Yiarmenian = 0x0545;
17437	t.Yicyrillic = 0x0407;
17438	t.Yiwnarmenian = 0x0552;
17439	t.Ymonospace = 0xff39;
17440	t.Ysmall = 0xf779;
17441	t.Ytilde = 0x1ef8;
17442	t.Yusbigcyrillic = 0x046a;
17443	t.Yusbigiotifiedcyrillic = 0x046c;
17444	t.Yuslittlecyrillic = 0x0466;
17445	t.Yuslittleiotifiedcyrillic = 0x0468;
17446	t.Z = 0x005a;
17447	t.Zaarmenian = 0x0536;
17448	t.Zacute = 0x0179;
17449	t.Zcaron = 0x017d;
17450	t.Zcaronsmall = 0xf6ff;
17451	t.Zcircle = 0x24cf;
17452	t.Zcircumflex = 0x1e90;
17453	t.Zdot = 0x017b;
17454	t.Zdotaccent = 0x017b;
17455	t.Zdotbelow = 0x1e92;
17456	t.Zecyrillic = 0x0417;
17457	t.Zedescendercyrillic = 0x0498;
17458	t.Zedieresiscyrillic = 0x04de;
17459	t.Zeta = 0x0396;
17460	t.Zhearmenian = 0x053a;
17461	t.Zhebrevecyrillic = 0x04c1;
17462	t.Zhecyrillic = 0x0416;
17463	t.Zhedescendercyrillic = 0x0496;
17464	t.Zhedieresiscyrillic = 0x04dc;
17465	t.Zlinebelow = 0x1e94;
17466	t.Zmonospace = 0xff3a;
17467	t.Zsmall = 0xf77a;
17468	t.Zstroke = 0x01b5;
17469	t.a = 0x0061;
17470	t.aabengali = 0x0986;
17471	t.aacute = 0x00e1;
17472	t.aadeva = 0x0906;
17473	t.aagujarati = 0x0a86;
17474	t.aagurmukhi = 0x0a06;
17475	t.aamatragurmukhi = 0x0a3e;
17476	t.aarusquare = 0x3303;
17477	t.aavowelsignbengali = 0x09be;
17478	t.aavowelsigndeva = 0x093e;
17479	t.aavowelsigngujarati = 0x0abe;
17480	t.abbreviationmarkarmenian = 0x055f;
17481	t.abbreviationsigndeva = 0x0970;
17482	t.abengali = 0x0985;
17483	t.abopomofo = 0x311a;
17484	t.abreve = 0x0103;
17485	t.abreveacute = 0x1eaf;
17486	t.abrevecyrillic = 0x04d1;
17487	t.abrevedotbelow = 0x1eb7;
17488	t.abrevegrave = 0x1eb1;
17489	t.abrevehookabove = 0x1eb3;
17490	t.abrevetilde = 0x1eb5;
17491	t.acaron = 0x01ce;
17492	t.acircle = 0x24d0;
17493	t.acircumflex = 0x00e2;
17494	t.acircumflexacute = 0x1ea5;
17495	t.acircumflexdotbelow = 0x1ead;
17496	t.acircumflexgrave = 0x1ea7;
17497	t.acircumflexhookabove = 0x1ea9;
17498	t.acircumflextilde = 0x1eab;
17499	t.acute = 0x00b4;
17500	t.acutebelowcmb = 0x0317;
17501	t.acutecmb = 0x0301;
17502	t.acutecomb = 0x0301;
17503	t.acutedeva = 0x0954;
17504	t.acutelowmod = 0x02cf;
17505	t.acutetonecmb = 0x0341;
17506	t.acyrillic = 0x0430;
17507	t.adblgrave = 0x0201;
17508	t.addakgurmukhi = 0x0a71;
17509	t.adeva = 0x0905;
17510	t.adieresis = 0x00e4;
17511	t.adieresiscyrillic = 0x04d3;
17512	t.adieresismacron = 0x01df;
17513	t.adotbelow = 0x1ea1;
17514	t.adotmacron = 0x01e1;
17515	t.ae = 0x00e6;
17516	t.aeacute = 0x01fd;
17517	t.aekorean = 0x3150;
17518	t.aemacron = 0x01e3;
17519	t.afii00208 = 0x2015;
17520	t.afii08941 = 0x20a4;
17521	t.afii10017 = 0x0410;
17522	t.afii10018 = 0x0411;
17523	t.afii10019 = 0x0412;
17524	t.afii10020 = 0x0413;
17525	t.afii10021 = 0x0414;
17526	t.afii10022 = 0x0415;
17527	t.afii10023 = 0x0401;
17528	t.afii10024 = 0x0416;
17529	t.afii10025 = 0x0417;
17530	t.afii10026 = 0x0418;
17531	t.afii10027 = 0x0419;
17532	t.afii10028 = 0x041a;
17533	t.afii10029 = 0x041b;
17534	t.afii10030 = 0x041c;
17535	t.afii10031 = 0x041d;
17536	t.afii10032 = 0x041e;
17537	t.afii10033 = 0x041f;
17538	t.afii10034 = 0x0420;
17539	t.afii10035 = 0x0421;
17540	t.afii10036 = 0x0422;
17541	t.afii10037 = 0x0423;
17542	t.afii10038 = 0x0424;
17543	t.afii10039 = 0x0425;
17544	t.afii10040 = 0x0426;
17545	t.afii10041 = 0x0427;
17546	t.afii10042 = 0x0428;
17547	t.afii10043 = 0x0429;
17548	t.afii10044 = 0x042a;
17549	t.afii10045 = 0x042b;
17550	t.afii10046 = 0x042c;
17551	t.afii10047 = 0x042d;
17552	t.afii10048 = 0x042e;
17553	t.afii10049 = 0x042f;
17554	t.afii10050 = 0x0490;
17555	t.afii10051 = 0x0402;
17556	t.afii10052 = 0x0403;
17557	t.afii10053 = 0x0404;
17558	t.afii10054 = 0x0405;
17559	t.afii10055 = 0x0406;
17560	t.afii10056 = 0x0407;
17561	t.afii10057 = 0x0408;
17562	t.afii10058 = 0x0409;
17563	t.afii10059 = 0x040a;
17564	t.afii10060 = 0x040b;
17565	t.afii10061 = 0x040c;
17566	t.afii10062 = 0x040e;
17567	t.afii10063 = 0xf6c4;
17568	t.afii10064 = 0xf6c5;
17569	t.afii10065 = 0x0430;
17570	t.afii10066 = 0x0431;
17571	t.afii10067 = 0x0432;
17572	t.afii10068 = 0x0433;
17573	t.afii10069 = 0x0434;
17574	t.afii10070 = 0x0435;
17575	t.afii10071 = 0x0451;
17576	t.afii10072 = 0x0436;
17577	t.afii10073 = 0x0437;
17578	t.afii10074 = 0x0438;
17579	t.afii10075 = 0x0439;
17580	t.afii10076 = 0x043a;
17581	t.afii10077 = 0x043b;
17582	t.afii10078 = 0x043c;
17583	t.afii10079 = 0x043d;
17584	t.afii10080 = 0x043e;
17585	t.afii10081 = 0x043f;
17586	t.afii10082 = 0x0440;
17587	t.afii10083 = 0x0441;
17588	t.afii10084 = 0x0442;
17589	t.afii10085 = 0x0443;
17590	t.afii10086 = 0x0444;
17591	t.afii10087 = 0x0445;
17592	t.afii10088 = 0x0446;
17593	t.afii10089 = 0x0447;
17594	t.afii10090 = 0x0448;
17595	t.afii10091 = 0x0449;
17596	t.afii10092 = 0x044a;
17597	t.afii10093 = 0x044b;
17598	t.afii10094 = 0x044c;
17599	t.afii10095 = 0x044d;
17600	t.afii10096 = 0x044e;
17601	t.afii10097 = 0x044f;
17602	t.afii10098 = 0x0491;
17603	t.afii10099 = 0x0452;
17604	t.afii10100 = 0x0453;
17605	t.afii10101 = 0x0454;
17606	t.afii10102 = 0x0455;
17607	t.afii10103 = 0x0456;
17608	t.afii10104 = 0x0457;
17609	t.afii10105 = 0x0458;
17610	t.afii10106 = 0x0459;
17611	t.afii10107 = 0x045a;
17612	t.afii10108 = 0x045b;
17613	t.afii10109 = 0x045c;
17614	t.afii10110 = 0x045e;
17615	t.afii10145 = 0x040f;
17616	t.afii10146 = 0x0462;
17617	t.afii10147 = 0x0472;
17618	t.afii10148 = 0x0474;
17619	t.afii10192 = 0xf6c6;
17620	t.afii10193 = 0x045f;
17621	t.afii10194 = 0x0463;
17622	t.afii10195 = 0x0473;
17623	t.afii10196 = 0x0475;
17624	t.afii10831 = 0xf6c7;
17625	t.afii10832 = 0xf6c8;
17626	t.afii10846 = 0x04d9;
17627	t.afii299 = 0x200e;
17628	t.afii300 = 0x200f;
17629	t.afii301 = 0x200d;
17630	t.afii57381 = 0x066a;
17631	t.afii57388 = 0x060c;
17632	t.afii57392 = 0x0660;
17633	t.afii57393 = 0x0661;
17634	t.afii57394 = 0x0662;
17635	t.afii57395 = 0x0663;
17636	t.afii57396 = 0x0664;
17637	t.afii57397 = 0x0665;
17638	t.afii57398 = 0x0666;
17639	t.afii57399 = 0x0667;
17640	t.afii57400 = 0x0668;
17641	t.afii57401 = 0x0669;
17642	t.afii57403 = 0x061b;
17643	t.afii57407 = 0x061f;
17644	t.afii57409 = 0x0621;
17645	t.afii57410 = 0x0622;
17646	t.afii57411 = 0x0623;
17647	t.afii57412 = 0x0624;
17648	t.afii57413 = 0x0625;
17649	t.afii57414 = 0x0626;
17650	t.afii57415 = 0x0627;
17651	t.afii57416 = 0x0628;
17652	t.afii57417 = 0x0629;
17653	t.afii57418 = 0x062a;
17654	t.afii57419 = 0x062b;
17655	t.afii57420 = 0x062c;
17656	t.afii57421 = 0x062d;
17657	t.afii57422 = 0x062e;
17658	t.afii57423 = 0x062f;
17659	t.afii57424 = 0x0630;
17660	t.afii57425 = 0x0631;
17661	t.afii57426 = 0x0632;
17662	t.afii57427 = 0x0633;
17663	t.afii57428 = 0x0634;
17664	t.afii57429 = 0x0635;
17665	t.afii57430 = 0x0636;
17666	t.afii57431 = 0x0637;
17667	t.afii57432 = 0x0638;
17668	t.afii57433 = 0x0639;
17669	t.afii57434 = 0x063a;
17670	t.afii57440 = 0x0640;
17671	t.afii57441 = 0x0641;
17672	t.afii57442 = 0x0642;
17673	t.afii57443 = 0x0643;
17674	t.afii57444 = 0x0644;
17675	t.afii57445 = 0x0645;
17676	t.afii57446 = 0x0646;
17677	t.afii57448 = 0x0648;
17678	t.afii57449 = 0x0649;
17679	t.afii57450 = 0x064a;
17680	t.afii57451 = 0x064b;
17681	t.afii57452 = 0x064c;
17682	t.afii57453 = 0x064d;
17683	t.afii57454 = 0x064e;
17684	t.afii57455 = 0x064f;
17685	t.afii57456 = 0x0650;
17686	t.afii57457 = 0x0651;
17687	t.afii57458 = 0x0652;
17688	t.afii57470 = 0x0647;
17689	t.afii57505 = 0x06a4;
17690	t.afii57506 = 0x067e;
17691	t.afii57507 = 0x0686;
17692	t.afii57508 = 0x0698;
17693	t.afii57509 = 0x06af;
17694	t.afii57511 = 0x0679;
17695	t.afii57512 = 0x0688;
17696	t.afii57513 = 0x0691;
17697	t.afii57514 = 0x06ba;
17698	t.afii57519 = 0x06d2;
17699	t.afii57534 = 0x06d5;
17700	t.afii57636 = 0x20aa;
17701	t.afii57645 = 0x05be;
17702	t.afii57658 = 0x05c3;
17703	t.afii57664 = 0x05d0;
17704	t.afii57665 = 0x05d1;
17705	t.afii57666 = 0x05d2;
17706	t.afii57667 = 0x05d3;
17707	t.afii57668 = 0x05d4;
17708	t.afii57669 = 0x05d5;
17709	t.afii57670 = 0x05d6;
17710	t.afii57671 = 0x05d7;
17711	t.afii57672 = 0x05d8;
17712	t.afii57673 = 0x05d9;
17713	t.afii57674 = 0x05da;
17714	t.afii57675 = 0x05db;
17715	t.afii57676 = 0x05dc;
17716	t.afii57677 = 0x05dd;
17717	t.afii57678 = 0x05de;
17718	t.afii57679 = 0x05df;
17719	t.afii57680 = 0x05e0;
17720	t.afii57681 = 0x05e1;
17721	t.afii57682 = 0x05e2;
17722	t.afii57683 = 0x05e3;
17723	t.afii57684 = 0x05e4;
17724	t.afii57685 = 0x05e5;
17725	t.afii57686 = 0x05e6;
17726	t.afii57687 = 0x05e7;
17727	t.afii57688 = 0x05e8;
17728	t.afii57689 = 0x05e9;
17729	t.afii57690 = 0x05ea;
17730	t.afii57694 = 0xfb2a;
17731	t.afii57695 = 0xfb2b;
17732	t.afii57700 = 0xfb4b;
17733	t.afii57705 = 0xfb1f;
17734	t.afii57716 = 0x05f0;
17735	t.afii57717 = 0x05f1;
17736	t.afii57718 = 0x05f2;
17737	t.afii57723 = 0xfb35;
17738	t.afii57793 = 0x05b4;
17739	t.afii57794 = 0x05b5;
17740	t.afii57795 = 0x05b6;
17741	t.afii57796 = 0x05bb;
17742	t.afii57797 = 0x05b8;
17743	t.afii57798 = 0x05b7;
17744	t.afii57799 = 0x05b0;
17745	t.afii57800 = 0x05b2;
17746	t.afii57801 = 0x05b1;
17747	t.afii57802 = 0x05b3;
17748	t.afii57803 = 0x05c2;
17749	t.afii57804 = 0x05c1;
17750	t.afii57806 = 0x05b9;
17751	t.afii57807 = 0x05bc;
17752	t.afii57839 = 0x05bd;
17753	t.afii57841 = 0x05bf;
17754	t.afii57842 = 0x05c0;
17755	t.afii57929 = 0x02bc;
17756	t.afii61248 = 0x2105;
17757	t.afii61289 = 0x2113;
17758	t.afii61352 = 0x2116;
17759	t.afii61573 = 0x202c;
17760	t.afii61574 = 0x202d;
17761	t.afii61575 = 0x202e;
17762	t.afii61664 = 0x200c;
17763	t.afii63167 = 0x066d;
17764	t.afii64937 = 0x02bd;
17765	t.agrave = 0x00e0;
17766	t.agujarati = 0x0a85;
17767	t.agurmukhi = 0x0a05;
17768	t.ahiragana = 0x3042;
17769	t.ahookabove = 0x1ea3;
17770	t.aibengali = 0x0990;
17771	t.aibopomofo = 0x311e;
17772	t.aideva = 0x0910;
17773	t.aiecyrillic = 0x04d5;
17774	t.aigujarati = 0x0a90;
17775	t.aigurmukhi = 0x0a10;
17776	t.aimatragurmukhi = 0x0a48;
17777	t.ainarabic = 0x0639;
17778	t.ainfinalarabic = 0xfeca;
17779	t.aininitialarabic = 0xfecb;
17780	t.ainmedialarabic = 0xfecc;
17781	t.ainvertedbreve = 0x0203;
17782	t.aivowelsignbengali = 0x09c8;
17783	t.aivowelsigndeva = 0x0948;
17784	t.aivowelsigngujarati = 0x0ac8;
17785	t.akatakana = 0x30a2;
17786	t.akatakanahalfwidth = 0xff71;
17787	t.akorean = 0x314f;
17788	t.alef = 0x05d0;
17789	t.alefarabic = 0x0627;
17790	t.alefdageshhebrew = 0xfb30;
17791	t.aleffinalarabic = 0xfe8e;
17792	t.alefhamzaabovearabic = 0x0623;
17793	t.alefhamzaabovefinalarabic = 0xfe84;
17794	t.alefhamzabelowarabic = 0x0625;
17795	t.alefhamzabelowfinalarabic = 0xfe88;
17796	t.alefhebrew = 0x05d0;
17797	t.aleflamedhebrew = 0xfb4f;
17798	t.alefmaddaabovearabic = 0x0622;
17799	t.alefmaddaabovefinalarabic = 0xfe82;
17800	t.alefmaksuraarabic = 0x0649;
17801	t.alefmaksurafinalarabic = 0xfef0;
17802	t.alefmaksurainitialarabic = 0xfef3;
17803	t.alefmaksuramedialarabic = 0xfef4;
17804	t.alefpatahhebrew = 0xfb2e;
17805	t.alefqamatshebrew = 0xfb2f;
17806	t.aleph = 0x2135;
17807	t.allequal = 0x224c;
17808	t.alpha = 0x03b1;
17809	t.alphatonos = 0x03ac;
17810	t.amacron = 0x0101;
17811	t.amonospace = 0xff41;
17812	t.ampersand = 0x0026;
17813	t.ampersandmonospace = 0xff06;
17814	t.ampersandsmall = 0xf726;
17815	t.amsquare = 0x33c2;
17816	t.anbopomofo = 0x3122;
17817	t.angbopomofo = 0x3124;
17818	t.angbracketleft = 0x3008;
17819	t.angbracketright = 0x3009;
17820	t.angkhankhuthai = 0x0e5a;
17821	t.angle = 0x2220;
17822	t.anglebracketleft = 0x3008;
17823	t.anglebracketleftvertical = 0xfe3f;
17824	t.anglebracketright = 0x3009;
17825	t.anglebracketrightvertical = 0xfe40;
17826	t.angleleft = 0x2329;
17827	t.angleright = 0x232a;
17828	t.angstrom = 0x212b;
17829	t.anoteleia = 0x0387;
17830	t.anudattadeva = 0x0952;
17831	t.anusvarabengali = 0x0982;
17832	t.anusvaradeva = 0x0902;
17833	t.anusvaragujarati = 0x0a82;
17834	t.aogonek = 0x0105;
17835	t.apaatosquare = 0x3300;
17836	t.aparen = 0x249c;
17837	t.apostrophearmenian = 0x055a;
17838	t.apostrophemod = 0x02bc;
17839	t.apple = 0xf8ff;
17840	t.approaches = 0x2250;
17841	t.approxequal = 0x2248;
17842	t.approxequalorimage = 0x2252;
17843	t.approximatelyequal = 0x2245;
17844	t.araeaekorean = 0x318e;
17845	t.araeakorean = 0x318d;
17846	t.arc = 0x2312;
17847	t.arighthalfring = 0x1e9a;
17848	t.aring = 0x00e5;
17849	t.aringacute = 0x01fb;
17850	t.aringbelow = 0x1e01;
17851	t.arrowboth = 0x2194;
17852	t.arrowdashdown = 0x21e3;
17853	t.arrowdashleft = 0x21e0;
17854	t.arrowdashright = 0x21e2;
17855	t.arrowdashup = 0x21e1;
17856	t.arrowdblboth = 0x21d4;
17857	t.arrowdbldown = 0x21d3;
17858	t.arrowdblleft = 0x21d0;
17859	t.arrowdblright = 0x21d2;
17860	t.arrowdblup = 0x21d1;
17861	t.arrowdown = 0x2193;
17862	t.arrowdownleft = 0x2199;
17863	t.arrowdownright = 0x2198;
17864	t.arrowdownwhite = 0x21e9;
17865	t.arrowheaddownmod = 0x02c5;
17866	t.arrowheadleftmod = 0x02c2;
17867	t.arrowheadrightmod = 0x02c3;
17868	t.arrowheadupmod = 0x02c4;
17869	t.arrowhorizex = 0xf8e7;
17870	t.arrowleft = 0x2190;
17871	t.arrowleftdbl = 0x21d0;
17872	t.arrowleftdblstroke = 0x21cd;
17873	t.arrowleftoverright = 0x21c6;
17874	t.arrowleftwhite = 0x21e6;
17875	t.arrowright = 0x2192;
17876	t.arrowrightdblstroke = 0x21cf;
17877	t.arrowrightheavy = 0x279e;
17878	t.arrowrightoverleft = 0x21c4;
17879	t.arrowrightwhite = 0x21e8;
17880	t.arrowtableft = 0x21e4;
17881	t.arrowtabright = 0x21e5;
17882	t.arrowup = 0x2191;
17883	t.arrowupdn = 0x2195;
17884	t.arrowupdnbse = 0x21a8;
17885	t.arrowupdownbase = 0x21a8;
17886	t.arrowupleft = 0x2196;
17887	t.arrowupleftofdown = 0x21c5;
17888	t.arrowupright = 0x2197;
17889	t.arrowupwhite = 0x21e7;
17890	t.arrowvertex = 0xf8e6;
17891	t.asciicircum = 0x005e;
17892	t.asciicircummonospace = 0xff3e;
17893	t.asciitilde = 0x007e;
17894	t.asciitildemonospace = 0xff5e;
17895	t.ascript = 0x0251;
17896	t.ascriptturned = 0x0252;
17897	t.asmallhiragana = 0x3041;
17898	t.asmallkatakana = 0x30a1;
17899	t.asmallkatakanahalfwidth = 0xff67;
17900	t.asterisk = 0x002a;
17901	t.asteriskaltonearabic = 0x066d;
17902	t.asteriskarabic = 0x066d;
17903	t.asteriskmath = 0x2217;
17904	t.asteriskmonospace = 0xff0a;
17905	t.asterisksmall = 0xfe61;
17906	t.asterism = 0x2042;
17907	t.asuperior = 0xf6e9;
17908	t.asymptoticallyequal = 0x2243;
17909	t.at = 0x0040;
17910	t.atilde = 0x00e3;
17911	t.atmonospace = 0xff20;
17912	t.atsmall = 0xfe6b;
17913	t.aturned = 0x0250;
17914	t.aubengali = 0x0994;
17915	t.aubopomofo = 0x3120;
17916	t.audeva = 0x0914;
17917	t.augujarati = 0x0a94;
17918	t.augurmukhi = 0x0a14;
17919	t.aulengthmarkbengali = 0x09d7;
17920	t.aumatragurmukhi = 0x0a4c;
17921	t.auvowelsignbengali = 0x09cc;
17922	t.auvowelsigndeva = 0x094c;
17923	t.auvowelsigngujarati = 0x0acc;
17924	t.avagrahadeva = 0x093d;
17925	t.aybarmenian = 0x0561;
17926	t.ayin = 0x05e2;
17927	t.ayinaltonehebrew = 0xfb20;
17928	t.ayinhebrew = 0x05e2;
17929	t.b = 0x0062;
17930	t.babengali = 0x09ac;
17931	t.backslash = 0x005c;
17932	t.backslashmonospace = 0xff3c;
17933	t.badeva = 0x092c;
17934	t.bagujarati = 0x0aac;
17935	t.bagurmukhi = 0x0a2c;
17936	t.bahiragana = 0x3070;
17937	t.bahtthai = 0x0e3f;
17938	t.bakatakana = 0x30d0;
17939	t.bar = 0x007c;
17940	t.barmonospace = 0xff5c;
17941	t.bbopomofo = 0x3105;
17942	t.bcircle = 0x24d1;
17943	t.bdotaccent = 0x1e03;
17944	t.bdotbelow = 0x1e05;
17945	t.beamedsixteenthnotes = 0x266c;
17946	t.because = 0x2235;
17947	t.becyrillic = 0x0431;
17948	t.beharabic = 0x0628;
17949	t.behfinalarabic = 0xfe90;
17950	t.behinitialarabic = 0xfe91;
17951	t.behiragana = 0x3079;
17952	t.behmedialarabic = 0xfe92;
17953	t.behmeeminitialarabic = 0xfc9f;
17954	t.behmeemisolatedarabic = 0xfc08;
17955	t.behnoonfinalarabic = 0xfc6d;
17956	t.bekatakana = 0x30d9;
17957	t.benarmenian = 0x0562;
17958	t.bet = 0x05d1;
17959	t.beta = 0x03b2;
17960	t.betasymbolgreek = 0x03d0;
17961	t.betdagesh = 0xfb31;
17962	t.betdageshhebrew = 0xfb31;
17963	t.bethebrew = 0x05d1;
17964	t.betrafehebrew = 0xfb4c;
17965	t.bhabengali = 0x09ad;
17966	t.bhadeva = 0x092d;
17967	t.bhagujarati = 0x0aad;
17968	t.bhagurmukhi = 0x0a2d;
17969	t.bhook = 0x0253;
17970	t.bihiragana = 0x3073;
17971	t.bikatakana = 0x30d3;
17972	t.bilabialclick = 0x0298;
17973	t.bindigurmukhi = 0x0a02;
17974	t.birusquare = 0x3331;
17975	t.blackcircle = 0x25cf;
17976	t.blackdiamond = 0x25c6;
17977	t.blackdownpointingtriangle = 0x25bc;
17978	t.blackleftpointingpointer = 0x25c4;
17979	t.blackleftpointingtriangle = 0x25c0;
17980	t.blacklenticularbracketleft = 0x3010;
17981	t.blacklenticularbracketleftvertical = 0xfe3b;
17982	t.blacklenticularbracketright = 0x3011;
17983	t.blacklenticularbracketrightvertical = 0xfe3c;
17984	t.blacklowerlefttriangle = 0x25e3;
17985	t.blacklowerrighttriangle = 0x25e2;
17986	t.blackrectangle = 0x25ac;
17987	t.blackrightpointingpointer = 0x25ba;
17988	t.blackrightpointingtriangle = 0x25b6;
17989	t.blacksmallsquare = 0x25aa;
17990	t.blacksmilingface = 0x263b;
17991	t.blacksquare = 0x25a0;
17992	t.blackstar = 0x2605;
17993	t.blackupperlefttriangle = 0x25e4;
17994	t.blackupperrighttriangle = 0x25e5;
17995	t.blackuppointingsmalltriangle = 0x25b4;
17996	t.blackuppointingtriangle = 0x25b2;
17997	t.blank = 0x2423;
17998	t.blinebelow = 0x1e07;
17999	t.block = 0x2588;
18000	t.bmonospace = 0xff42;
18001	t.bobaimaithai = 0x0e1a;
18002	t.bohiragana = 0x307c;
18003	t.bokatakana = 0x30dc;
18004	t.bparen = 0x249d;
18005	t.bqsquare = 0x33c3;
18006	t.braceex = 0xf8f4;
18007	t.braceleft = 0x007b;
18008	t.braceleftbt = 0xf8f3;
18009	t.braceleftmid = 0xf8f2;
18010	t.braceleftmonospace = 0xff5b;
18011	t.braceleftsmall = 0xfe5b;
18012	t.bracelefttp = 0xf8f1;
18013	t.braceleftvertical = 0xfe37;
18014	t.braceright = 0x007d;
18015	t.bracerightbt = 0xf8fe;
18016	t.bracerightmid = 0xf8fd;
18017	t.bracerightmonospace = 0xff5d;
18018	t.bracerightsmall = 0xfe5c;
18019	t.bracerighttp = 0xf8fc;
18020	t.bracerightvertical = 0xfe38;
18021	t.bracketleft = 0x005b;
18022	t.bracketleftbt = 0xf8f0;
18023	t.bracketleftex = 0xf8ef;
18024	t.bracketleftmonospace = 0xff3b;
18025	t.bracketlefttp = 0xf8ee;
18026	t.bracketright = 0x005d;
18027	t.bracketrightbt = 0xf8fb;
18028	t.bracketrightex = 0xf8fa;
18029	t.bracketrightmonospace = 0xff3d;
18030	t.bracketrighttp = 0xf8f9;
18031	t.breve = 0x02d8;
18032	t.brevebelowcmb = 0x032e;
18033	t.brevecmb = 0x0306;
18034	t.breveinvertedbelowcmb = 0x032f;
18035	t.breveinvertedcmb = 0x0311;
18036	t.breveinverteddoublecmb = 0x0361;
18037	t.bridgebelowcmb = 0x032a;
18038	t.bridgeinvertedbelowcmb = 0x033a;
18039	t.brokenbar = 0x00a6;
18040	t.bstroke = 0x0180;
18041	t.bsuperior = 0xf6ea;
18042	t.btopbar = 0x0183;
18043	t.buhiragana = 0x3076;
18044	t.bukatakana = 0x30d6;
18045	t.bullet = 0x2022;
18046	t.bulletinverse = 0x25d8;
18047	t.bulletoperator = 0x2219;
18048	t.bullseye = 0x25ce;
18049	t.c = 0x0063;
18050	t.caarmenian = 0x056e;
18051	t.cabengali = 0x099a;
18052	t.cacute = 0x0107;
18053	t.cadeva = 0x091a;
18054	t.cagujarati = 0x0a9a;
18055	t.cagurmukhi = 0x0a1a;
18056	t.calsquare = 0x3388;
18057	t.candrabindubengali = 0x0981;
18058	t.candrabinducmb = 0x0310;
18059	t.candrabindudeva = 0x0901;
18060	t.candrabindugujarati = 0x0a81;
18061	t.capslock = 0x21ea;
18062	t.careof = 0x2105;
18063	t.caron = 0x02c7;
18064	t.caronbelowcmb = 0x032c;
18065	t.caroncmb = 0x030c;
18066	t.carriagereturn = 0x21b5;
18067	t.cbopomofo = 0x3118;
18068	t.ccaron = 0x010d;
18069	t.ccedilla = 0x00e7;
18070	t.ccedillaacute = 0x1e09;
18071	t.ccircle = 0x24d2;
18072	t.ccircumflex = 0x0109;
18073	t.ccurl = 0x0255;
18074	t.cdot = 0x010b;
18075	t.cdotaccent = 0x010b;
18076	t.cdsquare = 0x33c5;
18077	t.cedilla = 0x00b8;
18078	t.cedillacmb = 0x0327;
18079	t.cent = 0x00a2;
18080	t.centigrade = 0x2103;
18081	t.centinferior = 0xf6df;
18082	t.centmonospace = 0xffe0;
18083	t.centoldstyle = 0xf7a2;
18084	t.centsuperior = 0xf6e0;
18085	t.chaarmenian = 0x0579;
18086	t.chabengali = 0x099b;
18087	t.chadeva = 0x091b;
18088	t.chagujarati = 0x0a9b;
18089	t.chagurmukhi = 0x0a1b;
18090	t.chbopomofo = 0x3114;
18091	t.cheabkhasiancyrillic = 0x04bd;
18092	t.checkmark = 0x2713;
18093	t.checyrillic = 0x0447;
18094	t.chedescenderabkhasiancyrillic = 0x04bf;
18095	t.chedescendercyrillic = 0x04b7;
18096	t.chedieresiscyrillic = 0x04f5;
18097	t.cheharmenian = 0x0573;
18098	t.chekhakassiancyrillic = 0x04cc;
18099	t.cheverticalstrokecyrillic = 0x04b9;
18100	t.chi = 0x03c7;
18101	t.chieuchacirclekorean = 0x3277;
18102	t.chieuchaparenkorean = 0x3217;
18103	t.chieuchcirclekorean = 0x3269;
18104	t.chieuchkorean = 0x314a;
18105	t.chieuchparenkorean = 0x3209;
18106	t.chochangthai = 0x0e0a;
18107	t.chochanthai = 0x0e08;
18108	t.chochingthai = 0x0e09;
18109	t.chochoethai = 0x0e0c;
18110	t.chook = 0x0188;
18111	t.cieucacirclekorean = 0x3276;
18112	t.cieucaparenkorean = 0x3216;
18113	t.cieuccirclekorean = 0x3268;
18114	t.cieuckorean = 0x3148;
18115	t.cieucparenkorean = 0x3208;
18116	t.cieucuparenkorean = 0x321c;
18117	t.circle = 0x25cb;
18118	t.circlecopyrt = 0x00a9;
18119	t.circlemultiply = 0x2297;
18120	t.circleot = 0x2299;
18121	t.circleplus = 0x2295;
18122	t.circlepostalmark = 0x3036;
18123	t.circlewithlefthalfblack = 0x25d0;
18124	t.circlewithrighthalfblack = 0x25d1;
18125	t.circumflex = 0x02c6;
18126	t.circumflexbelowcmb = 0x032d;
18127	t.circumflexcmb = 0x0302;
18128	t.clear = 0x2327;
18129	t.clickalveolar = 0x01c2;
18130	t.clickdental = 0x01c0;
18131	t.clicklateral = 0x01c1;
18132	t.clickretroflex = 0x01c3;
18133	t.club = 0x2663;
18134	t.clubsuitblack = 0x2663;
18135	t.clubsuitwhite = 0x2667;
18136	t.cmcubedsquare = 0x33a4;
18137	t.cmonospace = 0xff43;
18138	t.cmsquaredsquare = 0x33a0;
18139	t.coarmenian = 0x0581;
18140	t.colon = 0x003a;
18141	t.colonmonetary = 0x20a1;
18142	t.colonmonospace = 0xff1a;
18143	t.colonsign = 0x20a1;
18144	t.colonsmall = 0xfe55;
18145	t.colontriangularhalfmod = 0x02d1;
18146	t.colontriangularmod = 0x02d0;
18147	t.comma = 0x002c;
18148	t.commaabovecmb = 0x0313;
18149	t.commaaboverightcmb = 0x0315;
18150	t.commaaccent = 0xf6c3;
18151	t.commaarabic = 0x060c;
18152	t.commaarmenian = 0x055d;
18153	t.commainferior = 0xf6e1;
18154	t.commamonospace = 0xff0c;
18155	t.commareversedabovecmb = 0x0314;
18156	t.commareversedmod = 0x02bd;
18157	t.commasmall = 0xfe50;
18158	t.commasuperior = 0xf6e2;
18159	t.commaturnedabovecmb = 0x0312;
18160	t.commaturnedmod = 0x02bb;
18161	t.compass = 0x263c;
18162	t.congruent = 0x2245;
18163	t.contourintegral = 0x222e;
18164	t.control = 0x2303;
18165	t.controlACK = 0x0006;
18166	t.controlBEL = 0x0007;
18167	t.controlBS = 0x0008;
18168	t.controlCAN = 0x0018;
18169	t.controlCR = 0x000d;
18170	t.controlDC1 = 0x0011;
18171	t.controlDC2 = 0x0012;
18172	t.controlDC3 = 0x0013;
18173	t.controlDC4 = 0x0014;
18174	t.controlDEL = 0x007f;
18175	t.controlDLE = 0x0010;
18176	t.controlEM = 0x0019;
18177	t.controlENQ = 0x0005;
18178	t.controlEOT = 0x0004;
18179	t.controlESC = 0x001b;
18180	t.controlETB = 0x0017;
18181	t.controlETX = 0x0003;
18182	t.controlFF = 0x000c;
18183	t.controlFS = 0x001c;
18184	t.controlGS = 0x001d;
18185	t.controlHT = 0x0009;
18186	t.controlLF = 0x000a;
18187	t.controlNAK = 0x0015;
18188	t.controlNULL = 0x0000;
18189	t.controlRS = 0x001e;
18190	t.controlSI = 0x000f;
18191	t.controlSO = 0x000e;
18192	t.controlSOT = 0x0002;
18193	t.controlSTX = 0x0001;
18194	t.controlSUB = 0x001a;
18195	t.controlSYN = 0x0016;
18196	t.controlUS = 0x001f;
18197	t.controlVT = 0x000b;
18198	t.copyright = 0x00a9;
18199	t.copyrightsans = 0xf8e9;
18200	t.copyrightserif = 0xf6d9;
18201	t.cornerbracketleft = 0x300c;
18202	t.cornerbracketlefthalfwidth = 0xff62;
18203	t.cornerbracketleftvertical = 0xfe41;
18204	t.cornerbracketright = 0x300d;
18205	t.cornerbracketrighthalfwidth = 0xff63;
18206	t.cornerbracketrightvertical = 0xfe42;
18207	t.corporationsquare = 0x337f;
18208	t.cosquare = 0x33c7;
18209	t.coverkgsquare = 0x33c6;
18210	t.cparen = 0x249e;
18211	t.cruzeiro = 0x20a2;
18212	t.cstretched = 0x0297;
18213	t.curlyand = 0x22cf;
18214	t.curlyor = 0x22ce;
18215	t.currency = 0x00a4;
18216	t.cyrBreve = 0xf6d1;
18217	t.cyrFlex = 0xf6d2;
18218	t.cyrbreve = 0xf6d4;
18219	t.cyrflex = 0xf6d5;
18220	t.d = 0x0064;
18221	t.daarmenian = 0x0564;
18222	t.dabengali = 0x09a6;
18223	t.dadarabic = 0x0636;
18224	t.dadeva = 0x0926;
18225	t.dadfinalarabic = 0xfebe;
18226	t.dadinitialarabic = 0xfebf;
18227	t.dadmedialarabic = 0xfec0;
18228	t.dagesh = 0x05bc;
18229	t.dageshhebrew = 0x05bc;
18230	t.dagger = 0x2020;
18231	t.daggerdbl = 0x2021;
18232	t.dagujarati = 0x0aa6;
18233	t.dagurmukhi = 0x0a26;
18234	t.dahiragana = 0x3060;
18235	t.dakatakana = 0x30c0;
18236	t.dalarabic = 0x062f;
18237	t.dalet = 0x05d3;
18238	t.daletdagesh = 0xfb33;
18239	t.daletdageshhebrew = 0xfb33;
18240	t.dalethebrew = 0x05d3;
18241	t.dalfinalarabic = 0xfeaa;
18242	t.dammaarabic = 0x064f;
18243	t.dammalowarabic = 0x064f;
18244	t.dammatanaltonearabic = 0x064c;
18245	t.dammatanarabic = 0x064c;
18246	t.danda = 0x0964;
18247	t.dargahebrew = 0x05a7;
18248	t.dargalefthebrew = 0x05a7;
18249	t.dasiapneumatacyrilliccmb = 0x0485;
18250	t.dblGrave = 0xf6d3;
18251	t.dblanglebracketleft = 0x300a;
18252	t.dblanglebracketleftvertical = 0xfe3d;
18253	t.dblanglebracketright = 0x300b;
18254	t.dblanglebracketrightvertical = 0xfe3e;
18255	t.dblarchinvertedbelowcmb = 0x032b;
18256	t.dblarrowleft = 0x21d4;
18257	t.dblarrowright = 0x21d2;
18258	t.dbldanda = 0x0965;
18259	t.dblgrave = 0xf6d6;
18260	t.dblgravecmb = 0x030f;
18261	t.dblintegral = 0x222c;
18262	t.dbllowline = 0x2017;
18263	t.dbllowlinecmb = 0x0333;
18264	t.dbloverlinecmb = 0x033f;
18265	t.dblprimemod = 0x02ba;
18266	t.dblverticalbar = 0x2016;
18267	t.dblverticallineabovecmb = 0x030e;
18268	t.dbopomofo = 0x3109;
18269	t.dbsquare = 0x33c8;
18270	t.dcaron = 0x010f;
18271	t.dcedilla = 0x1e11;
18272	t.dcircle = 0x24d3;
18273	t.dcircumflexbelow = 0x1e13;
18274	t.dcroat = 0x0111;
18275	t.ddabengali = 0x09a1;
18276	t.ddadeva = 0x0921;
18277	t.ddagujarati = 0x0aa1;
18278	t.ddagurmukhi = 0x0a21;
18279	t.ddalarabic = 0x0688;
18280	t.ddalfinalarabic = 0xfb89;
18281	t.dddhadeva = 0x095c;
18282	t.ddhabengali = 0x09a2;
18283	t.ddhadeva = 0x0922;
18284	t.ddhagujarati = 0x0aa2;
18285	t.ddhagurmukhi = 0x0a22;
18286	t.ddotaccent = 0x1e0b;
18287	t.ddotbelow = 0x1e0d;
18288	t.decimalseparatorarabic = 0x066b;
18289	t.decimalseparatorpersian = 0x066b;
18290	t.decyrillic = 0x0434;
18291	t.degree = 0x00b0;
18292	t.dehihebrew = 0x05ad;
18293	t.dehiragana = 0x3067;
18294	t.deicoptic = 0x03ef;
18295	t.dekatakana = 0x30c7;
18296	t.deleteleft = 0x232b;
18297	t.deleteright = 0x2326;
18298	t.delta = 0x03b4;
18299	t.deltaturned = 0x018d;
18300	t.denominatorminusonenumeratorbengali = 0x09f8;
18301	t.dezh = 0x02a4;
18302	t.dhabengali = 0x09a7;
18303	t.dhadeva = 0x0927;
18304	t.dhagujarati = 0x0aa7;
18305	t.dhagurmukhi = 0x0a27;
18306	t.dhook = 0x0257;
18307	t.dialytikatonos = 0x0385;
18308	t.dialytikatonoscmb = 0x0344;
18309	t.diamond = 0x2666;
18310	t.diamondsuitwhite = 0x2662;
18311	t.dieresis = 0x00a8;
18312	t.dieresisacute = 0xf6d7;
18313	t.dieresisbelowcmb = 0x0324;
18314	t.dieresiscmb = 0x0308;
18315	t.dieresisgrave = 0xf6d8;
18316	t.dieresistonos = 0x0385;
18317	t.dihiragana = 0x3062;
18318	t.dikatakana = 0x30c2;
18319	t.dittomark = 0x3003;
18320	t.divide = 0x00f7;
18321	t.divides = 0x2223;
18322	t.divisionslash = 0x2215;
18323	t.djecyrillic = 0x0452;
18324	t.dkshade = 0x2593;
18325	t.dlinebelow = 0x1e0f;
18326	t.dlsquare = 0x3397;
18327	t.dmacron = 0x0111;
18328	t.dmonospace = 0xff44;
18329	t.dnblock = 0x2584;
18330	t.dochadathai = 0x0e0e;
18331	t.dodekthai = 0x0e14;
18332	t.dohiragana = 0x3069;
18333	t.dokatakana = 0x30c9;
18334	t.dollar = 0x0024;
18335	t.dollarinferior = 0xf6e3;
18336	t.dollarmonospace = 0xff04;
18337	t.dollaroldstyle = 0xf724;
18338	t.dollarsmall = 0xfe69;
18339	t.dollarsuperior = 0xf6e4;
18340	t.dong = 0x20ab;
18341	t.dorusquare = 0x3326;
18342	t.dotaccent = 0x02d9;
18343	t.dotaccentcmb = 0x0307;
18344	t.dotbelowcmb = 0x0323;
18345	t.dotbelowcomb = 0x0323;
18346	t.dotkatakana = 0x30fb;
18347	t.dotlessi = 0x0131;
18348	t.dotlessj = 0xf6be;
18349	t.dotlessjstrokehook = 0x0284;
18350	t.dotmath = 0x22c5;
18351	t.dottedcircle = 0x25cc;
18352	t.doubleyodpatah = 0xfb1f;
18353	t.doubleyodpatahhebrew = 0xfb1f;
18354	t.downtackbelowcmb = 0x031e;
18355	t.downtackmod = 0x02d5;
18356	t.dparen = 0x249f;
18357	t.dsuperior = 0xf6eb;
18358	t.dtail = 0x0256;
18359	t.dtopbar = 0x018c;
18360	t.duhiragana = 0x3065;
18361	t.dukatakana = 0x30c5;
18362	t.dz = 0x01f3;
18363	t.dzaltone = 0x02a3;
18364	t.dzcaron = 0x01c6;
18365	t.dzcurl = 0x02a5;
18366	t.dzeabkhasiancyrillic = 0x04e1;
18367	t.dzecyrillic = 0x0455;
18368	t.dzhecyrillic = 0x045f;
18369	t.e = 0x0065;
18370	t.eacute = 0x00e9;
18371	t.earth = 0x2641;
18372	t.ebengali = 0x098f;
18373	t.ebopomofo = 0x311c;
18374	t.ebreve = 0x0115;
18375	t.ecandradeva = 0x090d;
18376	t.ecandragujarati = 0x0a8d;
18377	t.ecandravowelsigndeva = 0x0945;
18378	t.ecandravowelsigngujarati = 0x0ac5;
18379	t.ecaron = 0x011b;
18380	t.ecedillabreve = 0x1e1d;
18381	t.echarmenian = 0x0565;
18382	t.echyiwnarmenian = 0x0587;
18383	t.ecircle = 0x24d4;
18384	t.ecircumflex = 0x00ea;
18385	t.ecircumflexacute = 0x1ebf;
18386	t.ecircumflexbelow = 0x1e19;
18387	t.ecircumflexdotbelow = 0x1ec7;
18388	t.ecircumflexgrave = 0x1ec1;
18389	t.ecircumflexhookabove = 0x1ec3;
18390	t.ecircumflextilde = 0x1ec5;
18391	t.ecyrillic = 0x0454;
18392	t.edblgrave = 0x0205;
18393	t.edeva = 0x090f;
18394	t.edieresis = 0x00eb;
18395	t.edot = 0x0117;
18396	t.edotaccent = 0x0117;
18397	t.edotbelow = 0x1eb9;
18398	t.eegurmukhi = 0x0a0f;
18399	t.eematragurmukhi = 0x0a47;
18400	t.efcyrillic = 0x0444;
18401	t.egrave = 0x00e8;
18402	t.egujarati = 0x0a8f;
18403	t.eharmenian = 0x0567;
18404	t.ehbopomofo = 0x311d;
18405	t.ehiragana = 0x3048;
18406	t.ehookabove = 0x1ebb;
18407	t.eibopomofo = 0x311f;
18408	t.eight = 0x0038;
18409	t.eightarabic = 0x0668;
18410	t.eightbengali = 0x09ee;
18411	t.eightcircle = 0x2467;
18412	t.eightcircleinversesansserif = 0x2791;
18413	t.eightdeva = 0x096e;
18414	t.eighteencircle = 0x2471;
18415	t.eighteenparen = 0x2485;
18416	t.eighteenperiod = 0x2499;
18417	t.eightgujarati = 0x0aee;
18418	t.eightgurmukhi = 0x0a6e;
18419	t.eighthackarabic = 0x0668;
18420	t.eighthangzhou = 0x3028;
18421	t.eighthnotebeamed = 0x266b;
18422	t.eightideographicparen = 0x3227;
18423	t.eightinferior = 0x2088;
18424	t.eightmonospace = 0xff18;
18425	t.eightoldstyle = 0xf738;
18426	t.eightparen = 0x247b;
18427	t.eightperiod = 0x248f;
18428	t.eightpersian = 0x06f8;
18429	t.eightroman = 0x2177;
18430	t.eightsuperior = 0x2078;
18431	t.eightthai = 0x0e58;
18432	t.einvertedbreve = 0x0207;
18433	t.eiotifiedcyrillic = 0x0465;
18434	t.ekatakana = 0x30a8;
18435	t.ekatakanahalfwidth = 0xff74;
18436	t.ekonkargurmukhi = 0x0a74;
18437	t.ekorean = 0x3154;
18438	t.elcyrillic = 0x043b;
18439	t.element = 0x2208;
18440	t.elevencircle = 0x246a;
18441	t.elevenparen = 0x247e;
18442	t.elevenperiod = 0x2492;
18443	t.elevenroman = 0x217a;
18444	t.ellipsis = 0x2026;
18445	t.ellipsisvertical = 0x22ee;
18446	t.emacron = 0x0113;
18447	t.emacronacute = 0x1e17;
18448	t.emacrongrave = 0x1e15;
18449	t.emcyrillic = 0x043c;
18450	t.emdash = 0x2014;
18451	t.emdashvertical = 0xfe31;
18452	t.emonospace = 0xff45;
18453	t.emphasismarkarmenian = 0x055b;
18454	t.emptyset = 0x2205;
18455	t.enbopomofo = 0x3123;
18456	t.encyrillic = 0x043d;
18457	t.endash = 0x2013;
18458	t.endashvertical = 0xfe32;
18459	t.endescendercyrillic = 0x04a3;
18460	t.eng = 0x014b;
18461	t.engbopomofo = 0x3125;
18462	t.enghecyrillic = 0x04a5;
18463	t.enhookcyrillic = 0x04c8;
18464	t.enspace = 0x2002;
18465	t.eogonek = 0x0119;
18466	t.eokorean = 0x3153;
18467	t.eopen = 0x025b;
18468	t.eopenclosed = 0x029a;
18469	t.eopenreversed = 0x025c;
18470	t.eopenreversedclosed = 0x025e;
18471	t.eopenreversedhook = 0x025d;
18472	t.eparen = 0x24a0;
18473	t.epsilon = 0x03b5;
18474	t.epsilontonos = 0x03ad;
18475	t.equal = 0x003d;
18476	t.equalmonospace = 0xff1d;
18477	t.equalsmall = 0xfe66;
18478	t.equalsuperior = 0x207c;
18479	t.equivalence = 0x2261;
18480	t.erbopomofo = 0x3126;
18481	t.ercyrillic = 0x0440;
18482	t.ereversed = 0x0258;
18483	t.ereversedcyrillic = 0x044d;
18484	t.escyrillic = 0x0441;
18485	t.esdescendercyrillic = 0x04ab;
18486	t.esh = 0x0283;
18487	t.eshcurl = 0x0286;
18488	t.eshortdeva = 0x090e;
18489	t.eshortvowelsigndeva = 0x0946;
18490	t.eshreversedloop = 0x01aa;
18491	t.eshsquatreversed = 0x0285;
18492	t.esmallhiragana = 0x3047;
18493	t.esmallkatakana = 0x30a7;
18494	t.esmallkatakanahalfwidth = 0xff6a;
18495	t.estimated = 0x212e;
18496	t.esuperior = 0xf6ec;
18497	t.eta = 0x03b7;
18498	t.etarmenian = 0x0568;
18499	t.etatonos = 0x03ae;
18500	t.eth = 0x00f0;
18501	t.etilde = 0x1ebd;
18502	t.etildebelow = 0x1e1b;
18503	t.etnahtafoukhhebrew = 0x0591;
18504	t.etnahtafoukhlefthebrew = 0x0591;
18505	t.etnahtahebrew = 0x0591;
18506	t.etnahtalefthebrew = 0x0591;
18507	t.eturned = 0x01dd;
18508	t.eukorean = 0x3161;
18509	t.euro = 0x20ac;
18510	t.evowelsignbengali = 0x09c7;
18511	t.evowelsigndeva = 0x0947;
18512	t.evowelsigngujarati = 0x0ac7;
18513	t.exclam = 0x0021;
18514	t.exclamarmenian = 0x055c;
18515	t.exclamdbl = 0x203c;
18516	t.exclamdown = 0x00a1;
18517	t.exclamdownsmall = 0xf7a1;
18518	t.exclammonospace = 0xff01;
18519	t.exclamsmall = 0xf721;
18520	t.existential = 0x2203;
18521	t.ezh = 0x0292;
18522	t.ezhcaron = 0x01ef;
18523	t.ezhcurl = 0x0293;
18524	t.ezhreversed = 0x01b9;
18525	t.ezhtail = 0x01ba;
18526	t.f = 0x0066;
18527	t.fadeva = 0x095e;
18528	t.fagurmukhi = 0x0a5e;
18529	t.fahrenheit = 0x2109;
18530	t.fathaarabic = 0x064e;
18531	t.fathalowarabic = 0x064e;
18532	t.fathatanarabic = 0x064b;
18533	t.fbopomofo = 0x3108;
18534	t.fcircle = 0x24d5;
18535	t.fdotaccent = 0x1e1f;
18536	t.feharabic = 0x0641;
18537	t.feharmenian = 0x0586;
18538	t.fehfinalarabic = 0xfed2;
18539	t.fehinitialarabic = 0xfed3;
18540	t.fehmedialarabic = 0xfed4;
18541	t.feicoptic = 0x03e5;
18542	t.female = 0x2640;
18543	t.ff = 0xfb00;
18544	t.f_f = 0xfb00;
18545	t.ffi = 0xfb03;
18546	t.f_f_i = 0xfb03;
18547	t.ffl = 0xfb04;
18548	t.f_f_l = 0xfb04;
18549	t.fi = 0xfb01;
18550	t.f_i = 0xfb01;
18551	t.fifteencircle = 0x246e;
18552	t.fifteenparen = 0x2482;
18553	t.fifteenperiod = 0x2496;
18554	t.figuredash = 0x2012;
18555	t.filledbox = 0x25a0;
18556	t.filledrect = 0x25ac;
18557	t.finalkaf = 0x05da;
18558	t.finalkafdagesh = 0xfb3a;
18559	t.finalkafdageshhebrew = 0xfb3a;
18560	t.finalkafhebrew = 0x05da;
18561	t.finalmem = 0x05dd;
18562	t.finalmemhebrew = 0x05dd;
18563	t.finalnun = 0x05df;
18564	t.finalnunhebrew = 0x05df;
18565	t.finalpe = 0x05e3;
18566	t.finalpehebrew = 0x05e3;
18567	t.finaltsadi = 0x05e5;
18568	t.finaltsadihebrew = 0x05e5;
18569	t.firsttonechinese = 0x02c9;
18570	t.fisheye = 0x25c9;
18571	t.fitacyrillic = 0x0473;
18572	t.five = 0x0035;
18573	t.fivearabic = 0x0665;
18574	t.fivebengali = 0x09eb;
18575	t.fivecircle = 0x2464;
18576	t.fivecircleinversesansserif = 0x278e;
18577	t.fivedeva = 0x096b;
18578	t.fiveeighths = 0x215d;
18579	t.fivegujarati = 0x0aeb;
18580	t.fivegurmukhi = 0x0a6b;
18581	t.fivehackarabic = 0x0665;
18582	t.fivehangzhou = 0x3025;
18583	t.fiveideographicparen = 0x3224;
18584	t.fiveinferior = 0x2085;
18585	t.fivemonospace = 0xff15;
18586	t.fiveoldstyle = 0xf735;
18587	t.fiveparen = 0x2478;
18588	t.fiveperiod = 0x248c;
18589	t.fivepersian = 0x06f5;
18590	t.fiveroman = 0x2174;
18591	t.fivesuperior = 0x2075;
18592	t.fivethai = 0x0e55;
18593	t.fl = 0xfb02;
18594	t.f_l = 0xfb02;
18595	t.florin = 0x0192;
18596	t.fmonospace = 0xff46;
18597	t.fmsquare = 0x3399;
18598	t.fofanthai = 0x0e1f;
18599	t.fofathai = 0x0e1d;
18600	t.fongmanthai = 0x0e4f;
18601	t.forall = 0x2200;
18602	t.four = 0x0034;
18603	t.fourarabic = 0x0664;
18604	t.fourbengali = 0x09ea;
18605	t.fourcircle = 0x2463;
18606	t.fourcircleinversesansserif = 0x278d;
18607	t.fourdeva = 0x096a;
18608	t.fourgujarati = 0x0aea;
18609	t.fourgurmukhi = 0x0a6a;
18610	t.fourhackarabic = 0x0664;
18611	t.fourhangzhou = 0x3024;
18612	t.fourideographicparen = 0x3223;
18613	t.fourinferior = 0x2084;
18614	t.fourmonospace = 0xff14;
18615	t.fournumeratorbengali = 0x09f7;
18616	t.fouroldstyle = 0xf734;
18617	t.fourparen = 0x2477;
18618	t.fourperiod = 0x248b;
18619	t.fourpersian = 0x06f4;
18620	t.fourroman = 0x2173;
18621	t.foursuperior = 0x2074;
18622	t.fourteencircle = 0x246d;
18623	t.fourteenparen = 0x2481;
18624	t.fourteenperiod = 0x2495;
18625	t.fourthai = 0x0e54;
18626	t.fourthtonechinese = 0x02cb;
18627	t.fparen = 0x24a1;
18628	t.fraction = 0x2044;
18629	t.franc = 0x20a3;
18630	t.g = 0x0067;
18631	t.gabengali = 0x0997;
18632	t.gacute = 0x01f5;
18633	t.gadeva = 0x0917;
18634	t.gafarabic = 0x06af;
18635	t.gaffinalarabic = 0xfb93;
18636	t.gafinitialarabic = 0xfb94;
18637	t.gafmedialarabic = 0xfb95;
18638	t.gagujarati = 0x0a97;
18639	t.gagurmukhi = 0x0a17;
18640	t.gahiragana = 0x304c;
18641	t.gakatakana = 0x30ac;
18642	t.gamma = 0x03b3;
18643	t.gammalatinsmall = 0x0263;
18644	t.gammasuperior = 0x02e0;
18645	t.gangiacoptic = 0x03eb;
18646	t.gbopomofo = 0x310d;
18647	t.gbreve = 0x011f;
18648	t.gcaron = 0x01e7;
18649	t.gcedilla = 0x0123;
18650	t.gcircle = 0x24d6;
18651	t.gcircumflex = 0x011d;
18652	t.gcommaaccent = 0x0123;
18653	t.gdot = 0x0121;
18654	t.gdotaccent = 0x0121;
18655	t.gecyrillic = 0x0433;
18656	t.gehiragana = 0x3052;
18657	t.gekatakana = 0x30b2;
18658	t.geometricallyequal = 0x2251;
18659	t.gereshaccenthebrew = 0x059c;
18660	t.gereshhebrew = 0x05f3;
18661	t.gereshmuqdamhebrew = 0x059d;
18662	t.germandbls = 0x00df;
18663	t.gershayimaccenthebrew = 0x059e;
18664	t.gershayimhebrew = 0x05f4;
18665	t.getamark = 0x3013;
18666	t.ghabengali = 0x0998;
18667	t.ghadarmenian = 0x0572;
18668	t.ghadeva = 0x0918;
18669	t.ghagujarati = 0x0a98;
18670	t.ghagurmukhi = 0x0a18;
18671	t.ghainarabic = 0x063a;
18672	t.ghainfinalarabic = 0xfece;
18673	t.ghaininitialarabic = 0xfecf;
18674	t.ghainmedialarabic = 0xfed0;
18675	t.ghemiddlehookcyrillic = 0x0495;
18676	t.ghestrokecyrillic = 0x0493;
18677	t.gheupturncyrillic = 0x0491;
18678	t.ghhadeva = 0x095a;
18679	t.ghhagurmukhi = 0x0a5a;
18680	t.ghook = 0x0260;
18681	t.ghzsquare = 0x3393;
18682	t.gihiragana = 0x304e;
18683	t.gikatakana = 0x30ae;
18684	t.gimarmenian = 0x0563;
18685	t.gimel = 0x05d2;
18686	t.gimeldagesh = 0xfb32;
18687	t.gimeldageshhebrew = 0xfb32;
18688	t.gimelhebrew = 0x05d2;
18689	t.gjecyrillic = 0x0453;
18690	t.glottalinvertedstroke = 0x01be;
18691	t.glottalstop = 0x0294;
18692	t.glottalstopinverted = 0x0296;
18693	t.glottalstopmod = 0x02c0;
18694	t.glottalstopreversed = 0x0295;
18695	t.glottalstopreversedmod = 0x02c1;
18696	t.glottalstopreversedsuperior = 0x02e4;
18697	t.glottalstopstroke = 0x02a1;
18698	t.glottalstopstrokereversed = 0x02a2;
18699	t.gmacron = 0x1e21;
18700	t.gmonospace = 0xff47;
18701	t.gohiragana = 0x3054;
18702	t.gokatakana = 0x30b4;
18703	t.gparen = 0x24a2;
18704	t.gpasquare = 0x33ac;
18705	t.gradient = 0x2207;
18706	t.grave = 0x0060;
18707	t.gravebelowcmb = 0x0316;
18708	t.gravecmb = 0x0300;
18709	t.gravecomb = 0x0300;
18710	t.gravedeva = 0x0953;
18711	t.gravelowmod = 0x02ce;
18712	t.gravemonospace = 0xff40;
18713	t.gravetonecmb = 0x0340;
18714	t.greater = 0x003e;
18715	t.greaterequal = 0x2265;
18716	t.greaterequalorless = 0x22db;
18717	t.greatermonospace = 0xff1e;
18718	t.greaterorequivalent = 0x2273;
18719	t.greaterorless = 0x2277;
18720	t.greateroverequal = 0x2267;
18721	t.greatersmall = 0xfe65;
18722	t.gscript = 0x0261;
18723	t.gstroke = 0x01e5;
18724	t.guhiragana = 0x3050;
18725	t.guillemotleft = 0x00ab;
18726	t.guillemotright = 0x00bb;
18727	t.guilsinglleft = 0x2039;
18728	t.guilsinglright = 0x203a;
18729	t.gukatakana = 0x30b0;
18730	t.guramusquare = 0x3318;
18731	t.gysquare = 0x33c9;
18732	t.h = 0x0068;
18733	t.haabkhasiancyrillic = 0x04a9;
18734	t.haaltonearabic = 0x06c1;
18735	t.habengali = 0x09b9;
18736	t.hadescendercyrillic = 0x04b3;
18737	t.hadeva = 0x0939;
18738	t.hagujarati = 0x0ab9;
18739	t.hagurmukhi = 0x0a39;
18740	t.haharabic = 0x062d;
18741	t.hahfinalarabic = 0xfea2;
18742	t.hahinitialarabic = 0xfea3;
18743	t.hahiragana = 0x306f;
18744	t.hahmedialarabic = 0xfea4;
18745	t.haitusquare = 0x332a;
18746	t.hakatakana = 0x30cf;
18747	t.hakatakanahalfwidth = 0xff8a;
18748	t.halantgurmukhi = 0x0a4d;
18749	t.hamzaarabic = 0x0621;
18750	t.hamzalowarabic = 0x0621;
18751	t.hangulfiller = 0x3164;
18752	t.hardsigncyrillic = 0x044a;
18753	t.harpoonleftbarbup = 0x21bc;
18754	t.harpoonrightbarbup = 0x21c0;
18755	t.hasquare = 0x33ca;
18756	t.hatafpatah = 0x05b2;
18757	t.hatafpatah16 = 0x05b2;
18758	t.hatafpatah23 = 0x05b2;
18759	t.hatafpatah2f = 0x05b2;
18760	t.hatafpatahhebrew = 0x05b2;
18761	t.hatafpatahnarrowhebrew = 0x05b2;
18762	t.hatafpatahquarterhebrew = 0x05b2;
18763	t.hatafpatahwidehebrew = 0x05b2;
18764	t.hatafqamats = 0x05b3;
18765	t.hatafqamats1b = 0x05b3;
18766	t.hatafqamats28 = 0x05b3;
18767	t.hatafqamats34 = 0x05b3;
18768	t.hatafqamatshebrew = 0x05b3;
18769	t.hatafqamatsnarrowhebrew = 0x05b3;
18770	t.hatafqamatsquarterhebrew = 0x05b3;
18771	t.hatafqamatswidehebrew = 0x05b3;
18772	t.hatafsegol = 0x05b1;
18773	t.hatafsegol17 = 0x05b1;
18774	t.hatafsegol24 = 0x05b1;
18775	t.hatafsegol30 = 0x05b1;
18776	t.hatafsegolhebrew = 0x05b1;
18777	t.hatafsegolnarrowhebrew = 0x05b1;
18778	t.hatafsegolquarterhebrew = 0x05b1;
18779	t.hatafsegolwidehebrew = 0x05b1;
18780	t.hbar = 0x0127;
18781	t.hbopomofo = 0x310f;
18782	t.hbrevebelow = 0x1e2b;
18783	t.hcedilla = 0x1e29;
18784	t.hcircle = 0x24d7;
18785	t.hcircumflex = 0x0125;
18786	t.hdieresis = 0x1e27;
18787	t.hdotaccent = 0x1e23;
18788	t.hdotbelow = 0x1e25;
18789	t.he = 0x05d4;
18790	t.heart = 0x2665;
18791	t.heartsuitblack = 0x2665;
18792	t.heartsuitwhite = 0x2661;
18793	t.hedagesh = 0xfb34;
18794	t.hedageshhebrew = 0xfb34;
18795	t.hehaltonearabic = 0x06c1;
18796	t.heharabic = 0x0647;
18797	t.hehebrew = 0x05d4;
18798	t.hehfinalaltonearabic = 0xfba7;
18799	t.hehfinalalttwoarabic = 0xfeea;
18800	t.hehfinalarabic = 0xfeea;
18801	t.hehhamzaabovefinalarabic = 0xfba5;
18802	t.hehhamzaaboveisolatedarabic = 0xfba4;
18803	t.hehinitialaltonearabic = 0xfba8;
18804	t.hehinitialarabic = 0xfeeb;
18805	t.hehiragana = 0x3078;
18806	t.hehmedialaltonearabic = 0xfba9;
18807	t.hehmedialarabic = 0xfeec;
18808	t.heiseierasquare = 0x337b;
18809	t.hekatakana = 0x30d8;
18810	t.hekatakanahalfwidth = 0xff8d;
18811	t.hekutaarusquare = 0x3336;
18812	t.henghook = 0x0267;
18813	t.herutusquare = 0x3339;
18814	t.het = 0x05d7;
18815	t.hethebrew = 0x05d7;
18816	t.hhook = 0x0266;
18817	t.hhooksuperior = 0x02b1;
18818	t.hieuhacirclekorean = 0x327b;
18819	t.hieuhaparenkorean = 0x321b;
18820	t.hieuhcirclekorean = 0x326d;
18821	t.hieuhkorean = 0x314e;
18822	t.hieuhparenkorean = 0x320d;
18823	t.hihiragana = 0x3072;
18824	t.hikatakana = 0x30d2;
18825	t.hikatakanahalfwidth = 0xff8b;
18826	t.hiriq = 0x05b4;
18827	t.hiriq14 = 0x05b4;
18828	t.hiriq21 = 0x05b4;
18829	t.hiriq2d = 0x05b4;
18830	t.hiriqhebrew = 0x05b4;
18831	t.hiriqnarrowhebrew = 0x05b4;
18832	t.hiriqquarterhebrew = 0x05b4;
18833	t.hiriqwidehebrew = 0x05b4;
18834	t.hlinebelow = 0x1e96;
18835	t.hmonospace = 0xff48;
18836	t.hoarmenian = 0x0570;
18837	t.hohipthai = 0x0e2b;
18838	t.hohiragana = 0x307b;
18839	t.hokatakana = 0x30db;
18840	t.hokatakanahalfwidth = 0xff8e;
18841	t.holam = 0x05b9;
18842	t.holam19 = 0x05b9;
18843	t.holam26 = 0x05b9;
18844	t.holam32 = 0x05b9;
18845	t.holamhebrew = 0x05b9;
18846	t.holamnarrowhebrew = 0x05b9;
18847	t.holamquarterhebrew = 0x05b9;
18848	t.holamwidehebrew = 0x05b9;
18849	t.honokhukthai = 0x0e2e;
18850	t.hookabovecomb = 0x0309;
18851	t.hookcmb = 0x0309;
18852	t.hookpalatalizedbelowcmb = 0x0321;
18853	t.hookretroflexbelowcmb = 0x0322;
18854	t.hoonsquare = 0x3342;
18855	t.horicoptic = 0x03e9;
18856	t.horizontalbar = 0x2015;
18857	t.horncmb = 0x031b;
18858	t.hotsprings = 0x2668;
18859	t.house = 0x2302;
18860	t.hparen = 0x24a3;
18861	t.hsuperior = 0x02b0;
18862	t.hturned = 0x0265;
18863	t.huhiragana = 0x3075;
18864	t.huiitosquare = 0x3333;
18865	t.hukatakana = 0x30d5;
18866	t.hukatakanahalfwidth = 0xff8c;
18867	t.hungarumlaut = 0x02dd;
18868	t.hungarumlautcmb = 0x030b;
18869	t.hv = 0x0195;
18870	t.hyphen = 0x002d;
18871	t.hypheninferior = 0xf6e5;
18872	t.hyphenmonospace = 0xff0d;
18873	t.hyphensmall = 0xfe63;
18874	t.hyphensuperior = 0xf6e6;
18875	t.hyphentwo = 0x2010;
18876	t.i = 0x0069;
18877	t.iacute = 0x00ed;
18878	t.iacyrillic = 0x044f;
18879	t.ibengali = 0x0987;
18880	t.ibopomofo = 0x3127;
18881	t.ibreve = 0x012d;
18882	t.icaron = 0x01d0;
18883	t.icircle = 0x24d8;
18884	t.icircumflex = 0x00ee;
18885	t.icyrillic = 0x0456;
18886	t.idblgrave = 0x0209;
18887	t.ideographearthcircle = 0x328f;
18888	t.ideographfirecircle = 0x328b;
18889	t.ideographicallianceparen = 0x323f;
18890	t.ideographiccallparen = 0x323a;
18891	t.ideographiccentrecircle = 0x32a5;
18892	t.ideographicclose = 0x3006;
18893	t.ideographiccomma = 0x3001;
18894	t.ideographiccommaleft = 0xff64;
18895	t.ideographiccongratulationparen = 0x3237;
18896	t.ideographiccorrectcircle = 0x32a3;
18897	t.ideographicearthparen = 0x322f;
18898	t.ideographicenterpriseparen = 0x323d;
18899	t.ideographicexcellentcircle = 0x329d;
18900	t.ideographicfestivalparen = 0x3240;
18901	t.ideographicfinancialcircle = 0x3296;
18902	t.ideographicfinancialparen = 0x3236;
18903	t.ideographicfireparen = 0x322b;
18904	t.ideographichaveparen = 0x3232;
18905	t.ideographichighcircle = 0x32a4;
18906	t.ideographiciterationmark = 0x3005;
18907	t.ideographiclaborcircle = 0x3298;
18908	t.ideographiclaborparen = 0x3238;
18909	t.ideographicleftcircle = 0x32a7;
18910	t.ideographiclowcircle = 0x32a6;
18911	t.ideographicmedicinecircle = 0x32a9;
18912	t.ideographicmetalparen = 0x322e;
18913	t.ideographicmoonparen = 0x322a;
18914	t.ideographicnameparen = 0x3234;
18915	t.ideographicperiod = 0x3002;
18916	t.ideographicprintcircle = 0x329e;
18917	t.ideographicreachparen = 0x3243;
18918	t.ideographicrepresentparen = 0x3239;
18919	t.ideographicresourceparen = 0x323e;
18920	t.ideographicrightcircle = 0x32a8;
18921	t.ideographicsecretcircle = 0x3299;
18922	t.ideographicselfparen = 0x3242;
18923	t.ideographicsocietyparen = 0x3233;
18924	t.ideographicspace = 0x3000;
18925	t.ideographicspecialparen = 0x3235;
18926	t.ideographicstockparen = 0x3231;
18927	t.ideographicstudyparen = 0x323b;
18928	t.ideographicsunparen = 0x3230;
18929	t.ideographicsuperviseparen = 0x323c;
18930	t.ideographicwaterparen = 0x322c;
18931	t.ideographicwoodparen = 0x322d;
18932	t.ideographiczero = 0x3007;
18933	t.ideographmetalcircle = 0x328e;
18934	t.ideographmooncircle = 0x328a;
18935	t.ideographnamecircle = 0x3294;
18936	t.ideographsuncircle = 0x3290;
18937	t.ideographwatercircle = 0x328c;
18938	t.ideographwoodcircle = 0x328d;
18939	t.ideva = 0x0907;
18940	t.idieresis = 0x00ef;
18941	t.idieresisacute = 0x1e2f;
18942	t.idieresiscyrillic = 0x04e5;
18943	t.idotbelow = 0x1ecb;
18944	t.iebrevecyrillic = 0x04d7;
18945	t.iecyrillic = 0x0435;
18946	t.ieungacirclekorean = 0x3275;
18947	t.ieungaparenkorean = 0x3215;
18948	t.ieungcirclekorean = 0x3267;
18949	t.ieungkorean = 0x3147;
18950	t.ieungparenkorean = 0x3207;
18951	t.igrave = 0x00ec;
18952	t.igujarati = 0x0a87;
18953	t.igurmukhi = 0x0a07;
18954	t.ihiragana = 0x3044;
18955	t.ihookabove = 0x1ec9;
18956	t.iibengali = 0x0988;
18957	t.iicyrillic = 0x0438;
18958	t.iideva = 0x0908;
18959	t.iigujarati = 0x0a88;
18960	t.iigurmukhi = 0x0a08;
18961	t.iimatragurmukhi = 0x0a40;
18962	t.iinvertedbreve = 0x020b;
18963	t.iishortcyrillic = 0x0439;
18964	t.iivowelsignbengali = 0x09c0;
18965	t.iivowelsigndeva = 0x0940;
18966	t.iivowelsigngujarati = 0x0ac0;
18967	t.ij = 0x0133;
18968	t.ikatakana = 0x30a4;
18969	t.ikatakanahalfwidth = 0xff72;
18970	t.ikorean = 0x3163;
18971	t.ilde = 0x02dc;
18972	t.iluyhebrew = 0x05ac;
18973	t.imacron = 0x012b;
18974	t.imacroncyrillic = 0x04e3;
18975	t.imageorapproximatelyequal = 0x2253;
18976	t.imatragurmukhi = 0x0a3f;
18977	t.imonospace = 0xff49;
18978	t.increment = 0x2206;
18979	t.infinity = 0x221e;
18980	t.iniarmenian = 0x056b;
18981	t.integral = 0x222b;
18982	t.integralbottom = 0x2321;
18983	t.integralbt = 0x2321;
18984	t.integralex = 0xf8f5;
18985	t.integraltop = 0x2320;
18986	t.integraltp = 0x2320;
18987	t.intersection = 0x2229;
18988	t.intisquare = 0x3305;
18989	t.invbullet = 0x25d8;
18990	t.invcircle = 0x25d9;
18991	t.invsmileface = 0x263b;
18992	t.iocyrillic = 0x0451;
18993	t.iogonek = 0x012f;
18994	t.iota = 0x03b9;
18995	t.iotadieresis = 0x03ca;
18996	t.iotadieresistonos = 0x0390;
18997	t.iotalatin = 0x0269;
18998	t.iotatonos = 0x03af;
18999	t.iparen = 0x24a4;
19000	t.irigurmukhi = 0x0a72;
19001	t.ismallhiragana = 0x3043;
19002	t.ismallkatakana = 0x30a3;
19003	t.ismallkatakanahalfwidth = 0xff68;
19004	t.issharbengali = 0x09fa;
19005	t.istroke = 0x0268;
19006	t.isuperior = 0xf6ed;
19007	t.iterationhiragana = 0x309d;
19008	t.iterationkatakana = 0x30fd;
19009	t.itilde = 0x0129;
19010	t.itildebelow = 0x1e2d;
19011	t.iubopomofo = 0x3129;
19012	t.iucyrillic = 0x044e;
19013	t.ivowelsignbengali = 0x09bf;
19014	t.ivowelsigndeva = 0x093f;
19015	t.ivowelsigngujarati = 0x0abf;
19016	t.izhitsacyrillic = 0x0475;
19017	t.izhitsadblgravecyrillic = 0x0477;
19018	t.j = 0x006a;
19019	t.jaarmenian = 0x0571;
19020	t.jabengali = 0x099c;
19021	t.jadeva = 0x091c;
19022	t.jagujarati = 0x0a9c;
19023	t.jagurmukhi = 0x0a1c;
19024	t.jbopomofo = 0x3110;
19025	t.jcaron = 0x01f0;
19026	t.jcircle = 0x24d9;
19027	t.jcircumflex = 0x0135;
19028	t.jcrossedtail = 0x029d;
19029	t.jdotlessstroke = 0x025f;
19030	t.jecyrillic = 0x0458;
19031	t.jeemarabic = 0x062c;
19032	t.jeemfinalarabic = 0xfe9e;
19033	t.jeeminitialarabic = 0xfe9f;
19034	t.jeemmedialarabic = 0xfea0;
19035	t.jeharabic = 0x0698;
19036	t.jehfinalarabic = 0xfb8b;
19037	t.jhabengali = 0x099d;
19038	t.jhadeva = 0x091d;
19039	t.jhagujarati = 0x0a9d;
19040	t.jhagurmukhi = 0x0a1d;
19041	t.jheharmenian = 0x057b;
19042	t.jis = 0x3004;
19043	t.jmonospace = 0xff4a;
19044	t.jparen = 0x24a5;
19045	t.jsuperior = 0x02b2;
19046	t.k = 0x006b;
19047	t.kabashkircyrillic = 0x04a1;
19048	t.kabengali = 0x0995;
19049	t.kacute = 0x1e31;
19050	t.kacyrillic = 0x043a;
19051	t.kadescendercyrillic = 0x049b;
19052	t.kadeva = 0x0915;
19053	t.kaf = 0x05db;
19054	t.kafarabic = 0x0643;
19055	t.kafdagesh = 0xfb3b;
19056	t.kafdageshhebrew = 0xfb3b;
19057	t.kaffinalarabic = 0xfeda;
19058	t.kafhebrew = 0x05db;
19059	t.kafinitialarabic = 0xfedb;
19060	t.kafmedialarabic = 0xfedc;
19061	t.kafrafehebrew = 0xfb4d;
19062	t.kagujarati = 0x0a95;
19063	t.kagurmukhi = 0x0a15;
19064	t.kahiragana = 0x304b;
19065	t.kahookcyrillic = 0x04c4;
19066	t.kakatakana = 0x30ab;
19067	t.kakatakanahalfwidth = 0xff76;
19068	t.kappa = 0x03ba;
19069	t.kappasymbolgreek = 0x03f0;
19070	t.kapyeounmieumkorean = 0x3171;
19071	t.kapyeounphieuphkorean = 0x3184;
19072	t.kapyeounpieupkorean = 0x3178;
19073	t.kapyeounssangpieupkorean = 0x3179;
19074	t.karoriisquare = 0x330d;
19075	t.kashidaautoarabic = 0x0640;
19076	t.kashidaautonosidebearingarabic = 0x0640;
19077	t.kasmallkatakana = 0x30f5;
19078	t.kasquare = 0x3384;
19079	t.kasraarabic = 0x0650;
19080	t.kasratanarabic = 0x064d;
19081	t.kastrokecyrillic = 0x049f;
19082	t.katahiraprolongmarkhalfwidth = 0xff70;
19083	t.kaverticalstrokecyrillic = 0x049d;
19084	t.kbopomofo = 0x310e;
19085	t.kcalsquare = 0x3389;
19086	t.kcaron = 0x01e9;
19087	t.kcedilla = 0x0137;
19088	t.kcircle = 0x24da;
19089	t.kcommaaccent = 0x0137;
19090	t.kdotbelow = 0x1e33;
19091	t.keharmenian = 0x0584;
19092	t.kehiragana = 0x3051;
19093	t.kekatakana = 0x30b1;
19094	t.kekatakanahalfwidth = 0xff79;
19095	t.kenarmenian = 0x056f;
19096	t.kesmallkatakana = 0x30f6;
19097	t.kgreenlandic = 0x0138;
19098	t.khabengali = 0x0996;
19099	t.khacyrillic = 0x0445;
19100	t.khadeva = 0x0916;
19101	t.khagujarati = 0x0a96;
19102	t.khagurmukhi = 0x0a16;
19103	t.khaharabic = 0x062e;
19104	t.khahfinalarabic = 0xfea6;
19105	t.khahinitialarabic = 0xfea7;
19106	t.khahmedialarabic = 0xfea8;
19107	t.kheicoptic = 0x03e7;
19108	t.khhadeva = 0x0959;
19109	t.khhagurmukhi = 0x0a59;
19110	t.khieukhacirclekorean = 0x3278;
19111	t.khieukhaparenkorean = 0x3218;
19112	t.khieukhcirclekorean = 0x326a;
19113	t.khieukhkorean = 0x314b;
19114	t.khieukhparenkorean = 0x320a;
19115	t.khokhaithai = 0x0e02;
19116	t.khokhonthai = 0x0e05;
19117	t.khokhuatthai = 0x0e03;
19118	t.khokhwaithai = 0x0e04;
19119	t.khomutthai = 0x0e5b;
19120	t.khook = 0x0199;
19121	t.khorakhangthai = 0x0e06;
19122	t.khzsquare = 0x3391;
19123	t.kihiragana = 0x304d;
19124	t.kikatakana = 0x30ad;
19125	t.kikatakanahalfwidth = 0xff77;
19126	t.kiroguramusquare = 0x3315;
19127	t.kiromeetorusquare = 0x3316;
19128	t.kirosquare = 0x3314;
19129	t.kiyeokacirclekorean = 0x326e;
19130	t.kiyeokaparenkorean = 0x320e;
19131	t.kiyeokcirclekorean = 0x3260;
19132	t.kiyeokkorean = 0x3131;
19133	t.kiyeokparenkorean = 0x3200;
19134	t.kiyeoksioskorean = 0x3133;
19135	t.kjecyrillic = 0x045c;
19136	t.klinebelow = 0x1e35;
19137	t.klsquare = 0x3398;
19138	t.kmcubedsquare = 0x33a6;
19139	t.kmonospace = 0xff4b;
19140	t.kmsquaredsquare = 0x33a2;
19141	t.kohiragana = 0x3053;
19142	t.kohmsquare = 0x33c0;
19143	t.kokaithai = 0x0e01;
19144	t.kokatakana = 0x30b3;
19145	t.kokatakanahalfwidth = 0xff7a;
19146	t.kooposquare = 0x331e;
19147	t.koppacyrillic = 0x0481;
19148	t.koreanstandardsymbol = 0x327f;
19149	t.koroniscmb = 0x0343;
19150	t.kparen = 0x24a6;
19151	t.kpasquare = 0x33aa;
19152	t.ksicyrillic = 0x046f;
19153	t.ktsquare = 0x33cf;
19154	t.kturned = 0x029e;
19155	t.kuhiragana = 0x304f;
19156	t.kukatakana = 0x30af;
19157	t.kukatakanahalfwidth = 0xff78;
19158	t.kvsquare = 0x33b8;
19159	t.kwsquare = 0x33be;
19160	t.l = 0x006c;
19161	t.labengali = 0x09b2;
19162	t.lacute = 0x013a;
19163	t.ladeva = 0x0932;
19164	t.lagujarati = 0x0ab2;
19165	t.lagurmukhi = 0x0a32;
19166	t.lakkhangyaothai = 0x0e45;
19167	t.lamaleffinalarabic = 0xfefc;
19168	t.lamalefhamzaabovefinalarabic = 0xfef8;
19169	t.lamalefhamzaaboveisolatedarabic = 0xfef7;
19170	t.lamalefhamzabelowfinalarabic = 0xfefa;
19171	t.lamalefhamzabelowisolatedarabic = 0xfef9;
19172	t.lamalefisolatedarabic = 0xfefb;
19173	t.lamalefmaddaabovefinalarabic = 0xfef6;
19174	t.lamalefmaddaaboveisolatedarabic = 0xfef5;
19175	t.lamarabic = 0x0644;
19176	t.lambda = 0x03bb;
19177	t.lambdastroke = 0x019b;
19178	t.lamed = 0x05dc;
19179	t.lameddagesh = 0xfb3c;
19180	t.lameddageshhebrew = 0xfb3c;
19181	t.lamedhebrew = 0x05dc;
19182	t.lamfinalarabic = 0xfede;
19183	t.lamhahinitialarabic = 0xfcca;
19184	t.laminitialarabic = 0xfedf;
19185	t.lamjeeminitialarabic = 0xfcc9;
19186	t.lamkhahinitialarabic = 0xfccb;
19187	t.lamlamhehisolatedarabic = 0xfdf2;
19188	t.lammedialarabic = 0xfee0;
19189	t.lammeemhahinitialarabic = 0xfd88;
19190	t.lammeeminitialarabic = 0xfccc;
19191	t.largecircle = 0x25ef;
19192	t.lbar = 0x019a;
19193	t.lbelt = 0x026c;
19194	t.lbopomofo = 0x310c;
19195	t.lcaron = 0x013e;
19196	t.lcedilla = 0x013c;
19197	t.lcircle = 0x24db;
19198	t.lcircumflexbelow = 0x1e3d;
19199	t.lcommaaccent = 0x013c;
19200	t.ldot = 0x0140;
19201	t.ldotaccent = 0x0140;
19202	t.ldotbelow = 0x1e37;
19203	t.ldotbelowmacron = 0x1e39;
19204	t.leftangleabovecmb = 0x031a;
19205	t.lefttackbelowcmb = 0x0318;
19206	t.less = 0x003c;
19207	t.lessequal = 0x2264;
19208	t.lessequalorgreater = 0x22da;
19209	t.lessmonospace = 0xff1c;
19210	t.lessorequivalent = 0x2272;
19211	t.lessorgreater = 0x2276;
19212	t.lessoverequal = 0x2266;
19213	t.lesssmall = 0xfe64;
19214	t.lezh = 0x026e;
19215	t.lfblock = 0x258c;
19216	t.lhookretroflex = 0x026d;
19217	t.lira = 0x20a4;
19218	t.liwnarmenian = 0x056c;
19219	t.lj = 0x01c9;
19220	t.ljecyrillic = 0x0459;
19221	t.ll = 0xf6c0;
19222	t.lladeva = 0x0933;
19223	t.llagujarati = 0x0ab3;
19224	t.llinebelow = 0x1e3b;
19225	t.llladeva = 0x0934;
19226	t.llvocalicbengali = 0x09e1;
19227	t.llvocalicdeva = 0x0961;
19228	t.llvocalicvowelsignbengali = 0x09e3;
19229	t.llvocalicvowelsigndeva = 0x0963;
19230	t.lmiddletilde = 0x026b;
19231	t.lmonospace = 0xff4c;
19232	t.lmsquare = 0x33d0;
19233	t.lochulathai = 0x0e2c;
19234	t.logicaland = 0x2227;
19235	t.logicalnot = 0x00ac;
19236	t.logicalnotreversed = 0x2310;
19237	t.logicalor = 0x2228;
19238	t.lolingthai = 0x0e25;
19239	t.longs = 0x017f;
19240	t.lowlinecenterline = 0xfe4e;
19241	t.lowlinecmb = 0x0332;
19242	t.lowlinedashed = 0xfe4d;
19243	t.lozenge = 0x25ca;
19244	t.lparen = 0x24a7;
19245	t.lslash = 0x0142;
19246	t.lsquare = 0x2113;
19247	t.lsuperior = 0xf6ee;
19248	t.ltshade = 0x2591;
19249	t.luthai = 0x0e26;
19250	t.lvocalicbengali = 0x098c;
19251	t.lvocalicdeva = 0x090c;
19252	t.lvocalicvowelsignbengali = 0x09e2;
19253	t.lvocalicvowelsigndeva = 0x0962;
19254	t.lxsquare = 0x33d3;
19255	t.m = 0x006d;
19256	t.mabengali = 0x09ae;
19257	t.macron = 0x00af;
19258	t.macronbelowcmb = 0x0331;
19259	t.macroncmb = 0x0304;
19260	t.macronlowmod = 0x02cd;
19261	t.macronmonospace = 0xffe3;
19262	t.macute = 0x1e3f;
19263	t.madeva = 0x092e;
19264	t.magujarati = 0x0aae;
19265	t.magurmukhi = 0x0a2e;
19266	t.mahapakhhebrew = 0x05a4;
19267	t.mahapakhlefthebrew = 0x05a4;
19268	t.mahiragana = 0x307e;
19269	t.maichattawalowleftthai = 0xf895;
19270	t.maichattawalowrightthai = 0xf894;
19271	t.maichattawathai = 0x0e4b;
19272	t.maichattawaupperleftthai = 0xf893;
19273	t.maieklowleftthai = 0xf88c;
19274	t.maieklowrightthai = 0xf88b;
19275	t.maiekthai = 0x0e48;
19276	t.maiekupperleftthai = 0xf88a;
19277	t.maihanakatleftthai = 0xf884;
19278	t.maihanakatthai = 0x0e31;
19279	t.maitaikhuleftthai = 0xf889;
19280	t.maitaikhuthai = 0x0e47;
19281	t.maitholowleftthai = 0xf88f;
19282	t.maitholowrightthai = 0xf88e;
19283	t.maithothai = 0x0e49;
19284	t.maithoupperleftthai = 0xf88d;
19285	t.maitrilowleftthai = 0xf892;
19286	t.maitrilowrightthai = 0xf891;
19287	t.maitrithai = 0x0e4a;
19288	t.maitriupperleftthai = 0xf890;
19289	t.maiyamokthai = 0x0e46;
19290	t.makatakana = 0x30de;
19291	t.makatakanahalfwidth = 0xff8f;
19292	t.male = 0x2642;
19293	t.mansyonsquare = 0x3347;
19294	t.maqafhebrew = 0x05be;
19295	t.mars = 0x2642;
19296	t.masoracirclehebrew = 0x05af;
19297	t.masquare = 0x3383;
19298	t.mbopomofo = 0x3107;
19299	t.mbsquare = 0x33d4;
19300	t.mcircle = 0x24dc;
19301	t.mcubedsquare = 0x33a5;
19302	t.mdotaccent = 0x1e41;
19303	t.mdotbelow = 0x1e43;
19304	t.meemarabic = 0x0645;
19305	t.meemfinalarabic = 0xfee2;
19306	t.meeminitialarabic = 0xfee3;
19307	t.meemmedialarabic = 0xfee4;
19308	t.meemmeeminitialarabic = 0xfcd1;
19309	t.meemmeemisolatedarabic = 0xfc48;
19310	t.meetorusquare = 0x334d;
19311	t.mehiragana = 0x3081;
19312	t.meizierasquare = 0x337e;
19313	t.mekatakana = 0x30e1;
19314	t.mekatakanahalfwidth = 0xff92;
19315	t.mem = 0x05de;
19316	t.memdagesh = 0xfb3e;
19317	t.memdageshhebrew = 0xfb3e;
19318	t.memhebrew = 0x05de;
19319	t.menarmenian = 0x0574;
19320	t.merkhahebrew = 0x05a5;
19321	t.merkhakefulahebrew = 0x05a6;
19322	t.merkhakefulalefthebrew = 0x05a6;
19323	t.merkhalefthebrew = 0x05a5;
19324	t.mhook = 0x0271;
19325	t.mhzsquare = 0x3392;
19326	t.middledotkatakanahalfwidth = 0xff65;
19327	t.middot = 0x00b7;
19328	t.mieumacirclekorean = 0x3272;
19329	t.mieumaparenkorean = 0x3212;
19330	t.mieumcirclekorean = 0x3264;
19331	t.mieumkorean = 0x3141;
19332	t.mieumpansioskorean = 0x3170;
19333	t.mieumparenkorean = 0x3204;
19334	t.mieumpieupkorean = 0x316e;
19335	t.mieumsioskorean = 0x316f;
19336	t.mihiragana = 0x307f;
19337	t.mikatakana = 0x30df;
19338	t.mikatakanahalfwidth = 0xff90;
19339	t.minus = 0x2212;
19340	t.minusbelowcmb = 0x0320;
19341	t.minuscircle = 0x2296;
19342	t.minusmod = 0x02d7;
19343	t.minusplus = 0x2213;
19344	t.minute = 0x2032;
19345	t.miribaarusquare = 0x334a;
19346	t.mirisquare = 0x3349;
19347	t.mlonglegturned = 0x0270;
19348	t.mlsquare = 0x3396;
19349	t.mmcubedsquare = 0x33a3;
19350	t.mmonospace = 0xff4d;
19351	t.mmsquaredsquare = 0x339f;
19352	t.mohiragana = 0x3082;
19353	t.mohmsquare = 0x33c1;
19354	t.mokatakana = 0x30e2;
19355	t.mokatakanahalfwidth = 0xff93;
19356	t.molsquare = 0x33d6;
19357	t.momathai = 0x0e21;
19358	t.moverssquare = 0x33a7;
19359	t.moverssquaredsquare = 0x33a8;
19360	t.mparen = 0x24a8;
19361	t.mpasquare = 0x33ab;
19362	t.mssquare = 0x33b3;
19363	t.msuperior = 0xf6ef;
19364	t.mturned = 0x026f;
19365	t.mu = 0x00b5;
19366	t.mu1 = 0x00b5;
19367	t.muasquare = 0x3382;
19368	t.muchgreater = 0x226b;
19369	t.muchless = 0x226a;
19370	t.mufsquare = 0x338c;
19371	t.mugreek = 0x03bc;
19372	t.mugsquare = 0x338d;
19373	t.muhiragana = 0x3080;
19374	t.mukatakana = 0x30e0;
19375	t.mukatakanahalfwidth = 0xff91;
19376	t.mulsquare = 0x3395;
19377	t.multiply = 0x00d7;
19378	t.mumsquare = 0x339b;
19379	t.munahhebrew = 0x05a3;
19380	t.munahlefthebrew = 0x05a3;
19381	t.musicalnote = 0x266a;
19382	t.musicalnotedbl = 0x266b;
19383	t.musicflatsign = 0x266d;
19384	t.musicsharpsign = 0x266f;
19385	t.mussquare = 0x33b2;
19386	t.muvsquare = 0x33b6;
19387	t.muwsquare = 0x33bc;
19388	t.mvmegasquare = 0x33b9;
19389	t.mvsquare = 0x33b7;
19390	t.mwmegasquare = 0x33bf;
19391	t.mwsquare = 0x33bd;
19392	t.n = 0x006e;
19393	t.nabengali = 0x09a8;
19394	t.nabla = 0x2207;
19395	t.nacute = 0x0144;
19396	t.nadeva = 0x0928;
19397	t.nagujarati = 0x0aa8;
19398	t.nagurmukhi = 0x0a28;
19399	t.nahiragana = 0x306a;
19400	t.nakatakana = 0x30ca;
19401	t.nakatakanahalfwidth = 0xff85;
19402	t.napostrophe = 0x0149;
19403	t.nasquare = 0x3381;
19404	t.nbopomofo = 0x310b;
19405	t.nbspace = 0x00a0;
19406	t.ncaron = 0x0148;
19407	t.ncedilla = 0x0146;
19408	t.ncircle = 0x24dd;
19409	t.ncircumflexbelow = 0x1e4b;
19410	t.ncommaaccent = 0x0146;
19411	t.ndotaccent = 0x1e45;
19412	t.ndotbelow = 0x1e47;
19413	t.nehiragana = 0x306d;
19414	t.nekatakana = 0x30cd;
19415	t.nekatakanahalfwidth = 0xff88;
19416	t.newsheqelsign = 0x20aa;
19417	t.nfsquare = 0x338b;
19418	t.ngabengali = 0x0999;
19419	t.ngadeva = 0x0919;
19420	t.ngagujarati = 0x0a99;
19421	t.ngagurmukhi = 0x0a19;
19422	t.ngonguthai = 0x0e07;
19423	t.nhiragana = 0x3093;
19424	t.nhookleft = 0x0272;
19425	t.nhookretroflex = 0x0273;
19426	t.nieunacirclekorean = 0x326f;
19427	t.nieunaparenkorean = 0x320f;
19428	t.nieuncieuckorean = 0x3135;
19429	t.nieuncirclekorean = 0x3261;
19430	t.nieunhieuhkorean = 0x3136;
19431	t.nieunkorean = 0x3134;
19432	t.nieunpansioskorean = 0x3168;
19433	t.nieunparenkorean = 0x3201;
19434	t.nieunsioskorean = 0x3167;
19435	t.nieuntikeutkorean = 0x3166;
19436	t.nihiragana = 0x306b;
19437	t.nikatakana = 0x30cb;
19438	t.nikatakanahalfwidth = 0xff86;
19439	t.nikhahitleftthai = 0xf899;
19440	t.nikhahitthai = 0x0e4d;
19441	t.nine = 0x0039;
19442	t.ninearabic = 0x0669;
19443	t.ninebengali = 0x09ef;
19444	t.ninecircle = 0x2468;
19445	t.ninecircleinversesansserif = 0x2792;
19446	t.ninedeva = 0x096f;
19447	t.ninegujarati = 0x0aef;
19448	t.ninegurmukhi = 0x0a6f;
19449	t.ninehackarabic = 0x0669;
19450	t.ninehangzhou = 0x3029;
19451	t.nineideographicparen = 0x3228;
19452	t.nineinferior = 0x2089;
19453	t.ninemonospace = 0xff19;
19454	t.nineoldstyle = 0xf739;
19455	t.nineparen = 0x247c;
19456	t.nineperiod = 0x2490;
19457	t.ninepersian = 0x06f9;
19458	t.nineroman = 0x2178;
19459	t.ninesuperior = 0x2079;
19460	t.nineteencircle = 0x2472;
19461	t.nineteenparen = 0x2486;
19462	t.nineteenperiod = 0x249a;
19463	t.ninethai = 0x0e59;
19464	t.nj = 0x01cc;
19465	t.njecyrillic = 0x045a;
19466	t.nkatakana = 0x30f3;
19467	t.nkatakanahalfwidth = 0xff9d;
19468	t.nlegrightlong = 0x019e;
19469	t.nlinebelow = 0x1e49;
19470	t.nmonospace = 0xff4e;
19471	t.nmsquare = 0x339a;
19472	t.nnabengali = 0x09a3;
19473	t.nnadeva = 0x0923;
19474	t.nnagujarati = 0x0aa3;
19475	t.nnagurmukhi = 0x0a23;
19476	t.nnnadeva = 0x0929;
19477	t.nohiragana = 0x306e;
19478	t.nokatakana = 0x30ce;
19479	t.nokatakanahalfwidth = 0xff89;
19480	t.nonbreakingspace = 0x00a0;
19481	t.nonenthai = 0x0e13;
19482	t.nonuthai = 0x0e19;
19483	t.noonarabic = 0x0646;
19484	t.noonfinalarabic = 0xfee6;
19485	t.noonghunnaarabic = 0x06ba;
19486	t.noonghunnafinalarabic = 0xfb9f;
19487	t.nooninitialarabic = 0xfee7;
19488	t.noonjeeminitialarabic = 0xfcd2;
19489	t.noonjeemisolatedarabic = 0xfc4b;
19490	t.noonmedialarabic = 0xfee8;
19491	t.noonmeeminitialarabic = 0xfcd5;
19492	t.noonmeemisolatedarabic = 0xfc4e;
19493	t.noonnoonfinalarabic = 0xfc8d;
19494	t.notcontains = 0x220c;
19495	t.notelement = 0x2209;
19496	t.notelementof = 0x2209;
19497	t.notequal = 0x2260;
19498	t.notgreater = 0x226f;
19499	t.notgreaternorequal = 0x2271;
19500	t.notgreaternorless = 0x2279;
19501	t.notidentical = 0x2262;
19502	t.notless = 0x226e;
19503	t.notlessnorequal = 0x2270;
19504	t.notparallel = 0x2226;
19505	t.notprecedes = 0x2280;
19506	t.notsubset = 0x2284;
19507	t.notsucceeds = 0x2281;
19508	t.notsuperset = 0x2285;
19509	t.nowarmenian = 0x0576;
19510	t.nparen = 0x24a9;
19511	t.nssquare = 0x33b1;
19512	t.nsuperior = 0x207f;
19513	t.ntilde = 0x00f1;
19514	t.nu = 0x03bd;
19515	t.nuhiragana = 0x306c;
19516	t.nukatakana = 0x30cc;
19517	t.nukatakanahalfwidth = 0xff87;
19518	t.nuktabengali = 0x09bc;
19519	t.nuktadeva = 0x093c;
19520	t.nuktagujarati = 0x0abc;
19521	t.nuktagurmukhi = 0x0a3c;
19522	t.numbersign = 0x0023;
19523	t.numbersignmonospace = 0xff03;
19524	t.numbersignsmall = 0xfe5f;
19525	t.numeralsigngreek = 0x0374;
19526	t.numeralsignlowergreek = 0x0375;
19527	t.numero = 0x2116;
19528	t.nun = 0x05e0;
19529	t.nundagesh = 0xfb40;
19530	t.nundageshhebrew = 0xfb40;
19531	t.nunhebrew = 0x05e0;
19532	t.nvsquare = 0x33b5;
19533	t.nwsquare = 0x33bb;
19534	t.nyabengali = 0x099e;
19535	t.nyadeva = 0x091e;
19536	t.nyagujarati = 0x0a9e;
19537	t.nyagurmukhi = 0x0a1e;
19538	t.o = 0x006f;
19539	t.oacute = 0x00f3;
19540	t.oangthai = 0x0e2d;
19541	t.obarred = 0x0275;
19542	t.obarredcyrillic = 0x04e9;
19543	t.obarreddieresiscyrillic = 0x04eb;
19544	t.obengali = 0x0993;
19545	t.obopomofo = 0x311b;
19546	t.obreve = 0x014f;
19547	t.ocandradeva = 0x0911;
19548	t.ocandragujarati = 0x0a91;
19549	t.ocandravowelsigndeva = 0x0949;
19550	t.ocandravowelsigngujarati = 0x0ac9;
19551	t.ocaron = 0x01d2;
19552	t.ocircle = 0x24de;
19553	t.ocircumflex = 0x00f4;
19554	t.ocircumflexacute = 0x1ed1;
19555	t.ocircumflexdotbelow = 0x1ed9;
19556	t.ocircumflexgrave = 0x1ed3;
19557	t.ocircumflexhookabove = 0x1ed5;
19558	t.ocircumflextilde = 0x1ed7;
19559	t.ocyrillic = 0x043e;
19560	t.odblacute = 0x0151;
19561	t.odblgrave = 0x020d;
19562	t.odeva = 0x0913;
19563	t.odieresis = 0x00f6;
19564	t.odieresiscyrillic = 0x04e7;
19565	t.odotbelow = 0x1ecd;
19566	t.oe = 0x0153;
19567	t.oekorean = 0x315a;
19568	t.ogonek = 0x02db;
19569	t.ogonekcmb = 0x0328;
19570	t.ograve = 0x00f2;
19571	t.ogujarati = 0x0a93;
19572	t.oharmenian = 0x0585;
19573	t.ohiragana = 0x304a;
19574	t.ohookabove = 0x1ecf;
19575	t.ohorn = 0x01a1;
19576	t.ohornacute = 0x1edb;
19577	t.ohorndotbelow = 0x1ee3;
19578	t.ohorngrave = 0x1edd;
19579	t.ohornhookabove = 0x1edf;
19580	t.ohorntilde = 0x1ee1;
19581	t.ohungarumlaut = 0x0151;
19582	t.oi = 0x01a3;
19583	t.oinvertedbreve = 0x020f;
19584	t.okatakana = 0x30aa;
19585	t.okatakanahalfwidth = 0xff75;
19586	t.okorean = 0x3157;
19587	t.olehebrew = 0x05ab;
19588	t.omacron = 0x014d;
19589	t.omacronacute = 0x1e53;
19590	t.omacrongrave = 0x1e51;
19591	t.omdeva = 0x0950;
19592	t.omega = 0x03c9;
19593	t.omega1 = 0x03d6;
19594	t.omegacyrillic = 0x0461;
19595	t.omegalatinclosed = 0x0277;
19596	t.omegaroundcyrillic = 0x047b;
19597	t.omegatitlocyrillic = 0x047d;
19598	t.omegatonos = 0x03ce;
19599	t.omgujarati = 0x0ad0;
19600	t.omicron = 0x03bf;
19601	t.omicrontonos = 0x03cc;
19602	t.omonospace = 0xff4f;
19603	t.one = 0x0031;
19604	t.onearabic = 0x0661;
19605	t.onebengali = 0x09e7;
19606	t.onecircle = 0x2460;
19607	t.onecircleinversesansserif = 0x278a;
19608	t.onedeva = 0x0967;
19609	t.onedotenleader = 0x2024;
19610	t.oneeighth = 0x215b;
19611	t.onefitted = 0xf6dc;
19612	t.onegujarati = 0x0ae7;
19613	t.onegurmukhi = 0x0a67;
19614	t.onehackarabic = 0x0661;
19615	t.onehalf = 0x00bd;
19616	t.onehangzhou = 0x3021;
19617	t.oneideographicparen = 0x3220;
19618	t.oneinferior = 0x2081;
19619	t.onemonospace = 0xff11;
19620	t.onenumeratorbengali = 0x09f4;
19621	t.oneoldstyle = 0xf731;
19622	t.oneparen = 0x2474;
19623	t.oneperiod = 0x2488;
19624	t.onepersian = 0x06f1;
19625	t.onequarter = 0x00bc;
19626	t.oneroman = 0x2170;
19627	t.onesuperior = 0x00b9;
19628	t.onethai = 0x0e51;
19629	t.onethird = 0x2153;
19630	t.oogonek = 0x01eb;
19631	t.oogonekmacron = 0x01ed;
19632	t.oogurmukhi = 0x0a13;
19633	t.oomatragurmukhi = 0x0a4b;
19634	t.oopen = 0x0254;
19635	t.oparen = 0x24aa;
19636	t.openbullet = 0x25e6;
19637	t.option = 0x2325;
19638	t.ordfeminine = 0x00aa;
19639	t.ordmasculine = 0x00ba;
19640	t.orthogonal = 0x221f;
19641	t.oshortdeva = 0x0912;
19642	t.oshortvowelsigndeva = 0x094a;
19643	t.oslash = 0x00f8;
19644	t.oslashacute = 0x01ff;
19645	t.osmallhiragana = 0x3049;
19646	t.osmallkatakana = 0x30a9;
19647	t.osmallkatakanahalfwidth = 0xff6b;
19648	t.ostrokeacute = 0x01ff;
19649	t.osuperior = 0xf6f0;
19650	t.otcyrillic = 0x047f;
19651	t.otilde = 0x00f5;
19652	t.otildeacute = 0x1e4d;
19653	t.otildedieresis = 0x1e4f;
19654	t.oubopomofo = 0x3121;
19655	t.overline = 0x203e;
19656	t.overlinecenterline = 0xfe4a;
19657	t.overlinecmb = 0x0305;
19658	t.overlinedashed = 0xfe49;
19659	t.overlinedblwavy = 0xfe4c;
19660	t.overlinewavy = 0xfe4b;
19661	t.overscore = 0x00af;
19662	t.ovowelsignbengali = 0x09cb;
19663	t.ovowelsigndeva = 0x094b;
19664	t.ovowelsigngujarati = 0x0acb;
19665	t.p = 0x0070;
19666	t.paampssquare = 0x3380;
19667	t.paasentosquare = 0x332b;
19668	t.pabengali = 0x09aa;
19669	t.pacute = 0x1e55;
19670	t.padeva = 0x092a;
19671	t.pagedown = 0x21df;
19672	t.pageup = 0x21de;
19673	t.pagujarati = 0x0aaa;
19674	t.pagurmukhi = 0x0a2a;
19675	t.pahiragana = 0x3071;
19676	t.paiyannoithai = 0x0e2f;
19677	t.pakatakana = 0x30d1;
19678	t.palatalizationcyrilliccmb = 0x0484;
19679	t.palochkacyrillic = 0x04c0;
19680	t.pansioskorean = 0x317f;
19681	t.paragraph = 0x00b6;
19682	t.parallel = 0x2225;
19683	t.parenleft = 0x0028;
19684	t.parenleftaltonearabic = 0xfd3e;
19685	t.parenleftbt = 0xf8ed;
19686	t.parenleftex = 0xf8ec;
19687	t.parenleftinferior = 0x208d;
19688	t.parenleftmonospace = 0xff08;
19689	t.parenleftsmall = 0xfe59;
19690	t.parenleftsuperior = 0x207d;
19691	t.parenlefttp = 0xf8eb;
19692	t.parenleftvertical = 0xfe35;
19693	t.parenright = 0x0029;
19694	t.parenrightaltonearabic = 0xfd3f;
19695	t.parenrightbt = 0xf8f8;
19696	t.parenrightex = 0xf8f7;
19697	t.parenrightinferior = 0x208e;
19698	t.parenrightmonospace = 0xff09;
19699	t.parenrightsmall = 0xfe5a;
19700	t.parenrightsuperior = 0x207e;
19701	t.parenrighttp = 0xf8f6;
19702	t.parenrightvertical = 0xfe36;
19703	t.partialdiff = 0x2202;
19704	t.paseqhebrew = 0x05c0;
19705	t.pashtahebrew = 0x0599;
19706	t.pasquare = 0x33a9;
19707	t.patah = 0x05b7;
19708	t.patah11 = 0x05b7;
19709	t.patah1d = 0x05b7;
19710	t.patah2a = 0x05b7;
19711	t.patahhebrew = 0x05b7;
19712	t.patahnarrowhebrew = 0x05b7;
19713	t.patahquarterhebrew = 0x05b7;
19714	t.patahwidehebrew = 0x05b7;
19715	t.pazerhebrew = 0x05a1;
19716	t.pbopomofo = 0x3106;
19717	t.pcircle = 0x24df;
19718	t.pdotaccent = 0x1e57;
19719	t.pe = 0x05e4;
19720	t.pecyrillic = 0x043f;
19721	t.pedagesh = 0xfb44;
19722	t.pedageshhebrew = 0xfb44;
19723	t.peezisquare = 0x333b;
19724	t.pefinaldageshhebrew = 0xfb43;
19725	t.peharabic = 0x067e;
19726	t.peharmenian = 0x057a;
19727	t.pehebrew = 0x05e4;
19728	t.pehfinalarabic = 0xfb57;
19729	t.pehinitialarabic = 0xfb58;
19730	t.pehiragana = 0x307a;
19731	t.pehmedialarabic = 0xfb59;
19732	t.pekatakana = 0x30da;
19733	t.pemiddlehookcyrillic = 0x04a7;
19734	t.perafehebrew = 0xfb4e;
19735	t.percent = 0x0025;
19736	t.percentarabic = 0x066a;
19737	t.percentmonospace = 0xff05;
19738	t.percentsmall = 0xfe6a;
19739	t.period = 0x002e;
19740	t.periodarmenian = 0x0589;
19741	t.periodcentered = 0x00b7;
19742	t.periodhalfwidth = 0xff61;
19743	t.periodinferior = 0xf6e7;
19744	t.periodmonospace = 0xff0e;
19745	t.periodsmall = 0xfe52;
19746	t.periodsuperior = 0xf6e8;
19747	t.perispomenigreekcmb = 0x0342;
19748	t.perpendicular = 0x22a5;
19749	t.perthousand = 0x2030;
19750	t.peseta = 0x20a7;
19751	t.pfsquare = 0x338a;
19752	t.phabengali = 0x09ab;
19753	t.phadeva = 0x092b;
19754	t.phagujarati = 0x0aab;
19755	t.phagurmukhi = 0x0a2b;
19756	t.phi = 0x03c6;
19757	t.phi1 = 0x03d5;
19758	t.phieuphacirclekorean = 0x327a;
19759	t.phieuphaparenkorean = 0x321a;
19760	t.phieuphcirclekorean = 0x326c;
19761	t.phieuphkorean = 0x314d;
19762	t.phieuphparenkorean = 0x320c;
19763	t.philatin = 0x0278;
19764	t.phinthuthai = 0x0e3a;
19765	t.phisymbolgreek = 0x03d5;
19766	t.phook = 0x01a5;
19767	t.phophanthai = 0x0e1e;
19768	t.phophungthai = 0x0e1c;
19769	t.phosamphaothai = 0x0e20;
19770	t.pi = 0x03c0;
19771	t.pieupacirclekorean = 0x3273;
19772	t.pieupaparenkorean = 0x3213;
19773	t.pieupcieuckorean = 0x3176;
19774	t.pieupcirclekorean = 0x3265;
19775	t.pieupkiyeokkorean = 0x3172;
19776	t.pieupkorean = 0x3142;
19777	t.pieupparenkorean = 0x3205;
19778	t.pieupsioskiyeokkorean = 0x3174;
19779	t.pieupsioskorean = 0x3144;
19780	t.pieupsiostikeutkorean = 0x3175;
19781	t.pieupthieuthkorean = 0x3177;
19782	t.pieuptikeutkorean = 0x3173;
19783	t.pihiragana = 0x3074;
19784	t.pikatakana = 0x30d4;
19785	t.pisymbolgreek = 0x03d6;
19786	t.piwrarmenian = 0x0583;
19787	t.planckover2pi = 0x210f;
19788	t.planckover2pi1 = 0x210f;
19789	t.plus = 0x002b;
19790	t.plusbelowcmb = 0x031f;
19791	t.pluscircle = 0x2295;
19792	t.plusminus = 0x00b1;
19793	t.plusmod = 0x02d6;
19794	t.plusmonospace = 0xff0b;
19795	t.plussmall = 0xfe62;
19796	t.plussuperior = 0x207a;
19797	t.pmonospace = 0xff50;
19798	t.pmsquare = 0x33d8;
19799	t.pohiragana = 0x307d;
19800	t.pointingindexdownwhite = 0x261f;
19801	t.pointingindexleftwhite = 0x261c;
19802	t.pointingindexrightwhite = 0x261e;
19803	t.pointingindexupwhite = 0x261d;
19804	t.pokatakana = 0x30dd;
19805	t.poplathai = 0x0e1b;
19806	t.postalmark = 0x3012;
19807	t.postalmarkface = 0x3020;
19808	t.pparen = 0x24ab;
19809	t.precedes = 0x227a;
19810	t.prescription = 0x211e;
19811	t.primemod = 0x02b9;
19812	t.primereversed = 0x2035;
19813	t.product = 0x220f;
19814	t.projective = 0x2305;
19815	t.prolongedkana = 0x30fc;
19816	t.propellor = 0x2318;
19817	t.propersubset = 0x2282;
19818	t.propersuperset = 0x2283;
19819	t.proportion = 0x2237;
19820	t.proportional = 0x221d;
19821	t.psi = 0x03c8;
19822	t.psicyrillic = 0x0471;
19823	t.psilipneumatacyrilliccmb = 0x0486;
19824	t.pssquare = 0x33b0;
19825	t.puhiragana = 0x3077;
19826	t.pukatakana = 0x30d7;
19827	t.pvsquare = 0x33b4;
19828	t.pwsquare = 0x33ba;
19829	t.q = 0x0071;
19830	t.qadeva = 0x0958;
19831	t.qadmahebrew = 0x05a8;
19832	t.qafarabic = 0x0642;
19833	t.qaffinalarabic = 0xfed6;
19834	t.qafinitialarabic = 0xfed7;
19835	t.qafmedialarabic = 0xfed8;
19836	t.qamats = 0x05b8;
19837	t.qamats10 = 0x05b8;
19838	t.qamats1a = 0x05b8;
19839	t.qamats1c = 0x05b8;
19840	t.qamats27 = 0x05b8;
19841	t.qamats29 = 0x05b8;
19842	t.qamats33 = 0x05b8;
19843	t.qamatsde = 0x05b8;
19844	t.qamatshebrew = 0x05b8;
19845	t.qamatsnarrowhebrew = 0x05b8;
19846	t.qamatsqatanhebrew = 0x05b8;
19847	t.qamatsqatannarrowhebrew = 0x05b8;
19848	t.qamatsqatanquarterhebrew = 0x05b8;
19849	t.qamatsqatanwidehebrew = 0x05b8;
19850	t.qamatsquarterhebrew = 0x05b8;
19851	t.qamatswidehebrew = 0x05b8;
19852	t.qarneyparahebrew = 0x059f;
19853	t.qbopomofo = 0x3111;
19854	t.qcircle = 0x24e0;
19855	t.qhook = 0x02a0;
19856	t.qmonospace = 0xff51;
19857	t.qof = 0x05e7;
19858	t.qofdagesh = 0xfb47;
19859	t.qofdageshhebrew = 0xfb47;
19860	t.qofhebrew = 0x05e7;
19861	t.qparen = 0x24ac;
19862	t.quarternote = 0x2669;
19863	t.qubuts = 0x05bb;
19864	t.qubuts18 = 0x05bb;
19865	t.qubuts25 = 0x05bb;
19866	t.qubuts31 = 0x05bb;
19867	t.qubutshebrew = 0x05bb;
19868	t.qubutsnarrowhebrew = 0x05bb;
19869	t.qubutsquarterhebrew = 0x05bb;
19870	t.qubutswidehebrew = 0x05bb;
19871	t.question = 0x003f;
19872	t.questionarabic = 0x061f;
19873	t.questionarmenian = 0x055e;
19874	t.questiondown = 0x00bf;
19875	t.questiondownsmall = 0xf7bf;
19876	t.questiongreek = 0x037e;
19877	t.questionmonospace = 0xff1f;
19878	t.questionsmall = 0xf73f;
19879	t.quotedbl = 0x0022;
19880	t.quotedblbase = 0x201e;
19881	t.quotedblleft = 0x201c;
19882	t.quotedblmonospace = 0xff02;
19883	t.quotedblprime = 0x301e;
19884	t.quotedblprimereversed = 0x301d;
19885	t.quotedblright = 0x201d;
19886	t.quoteleft = 0x2018;
19887	t.quoteleftreversed = 0x201b;
19888	t.quotereversed = 0x201b;
19889	t.quoteright = 0x2019;
19890	t.quoterightn = 0x0149;
19891	t.quotesinglbase = 0x201a;
19892	t.quotesingle = 0x0027;
19893	t.quotesinglemonospace = 0xff07;
19894	t.r = 0x0072;
19895	t.raarmenian = 0x057c;
19896	t.rabengali = 0x09b0;
19897	t.racute = 0x0155;
19898	t.radeva = 0x0930;
19899	t.radical = 0x221a;
19900	t.radicalex = 0xf8e5;
19901	t.radoverssquare = 0x33ae;
19902	t.radoverssquaredsquare = 0x33af;
19903	t.radsquare = 0x33ad;
19904	t.rafe = 0x05bf;
19905	t.rafehebrew = 0x05bf;
19906	t.ragujarati = 0x0ab0;
19907	t.ragurmukhi = 0x0a30;
19908	t.rahiragana = 0x3089;
19909	t.rakatakana = 0x30e9;
19910	t.rakatakanahalfwidth = 0xff97;
19911	t.ralowerdiagonalbengali = 0x09f1;
19912	t.ramiddlediagonalbengali = 0x09f0;
19913	t.ramshorn = 0x0264;
19914	t.ratio = 0x2236;
19915	t.rbopomofo = 0x3116;
19916	t.rcaron = 0x0159;
19917	t.rcedilla = 0x0157;
19918	t.rcircle = 0x24e1;
19919	t.rcommaaccent = 0x0157;
19920	t.rdblgrave = 0x0211;
19921	t.rdotaccent = 0x1e59;
19922	t.rdotbelow = 0x1e5b;
19923	t.rdotbelowmacron = 0x1e5d;
19924	t.referencemark = 0x203b;
19925	t.reflexsubset = 0x2286;
19926	t.reflexsuperset = 0x2287;
19927	t.registered = 0x00ae;
19928	t.registersans = 0xf8e8;
19929	t.registerserif = 0xf6da;
19930	t.reharabic = 0x0631;
19931	t.reharmenian = 0x0580;
19932	t.rehfinalarabic = 0xfeae;
19933	t.rehiragana = 0x308c;
19934	t.rekatakana = 0x30ec;
19935	t.rekatakanahalfwidth = 0xff9a;
19936	t.resh = 0x05e8;
19937	t.reshdageshhebrew = 0xfb48;
19938	t.reshhebrew = 0x05e8;
19939	t.reversedtilde = 0x223d;
19940	t.reviahebrew = 0x0597;
19941	t.reviamugrashhebrew = 0x0597;
19942	t.revlogicalnot = 0x2310;
19943	t.rfishhook = 0x027e;
19944	t.rfishhookreversed = 0x027f;
19945	t.rhabengali = 0x09dd;
19946	t.rhadeva = 0x095d;
19947	t.rho = 0x03c1;
19948	t.rhook = 0x027d;
19949	t.rhookturned = 0x027b;
19950	t.rhookturnedsuperior = 0x02b5;
19951	t.rhosymbolgreek = 0x03f1;
19952	t.rhotichookmod = 0x02de;
19953	t.rieulacirclekorean = 0x3271;
19954	t.rieulaparenkorean = 0x3211;
19955	t.rieulcirclekorean = 0x3263;
19956	t.rieulhieuhkorean = 0x3140;
19957	t.rieulkiyeokkorean = 0x313a;
19958	t.rieulkiyeoksioskorean = 0x3169;
19959	t.rieulkorean = 0x3139;
19960	t.rieulmieumkorean = 0x313b;
19961	t.rieulpansioskorean = 0x316c;
19962	t.rieulparenkorean = 0x3203;
19963	t.rieulphieuphkorean = 0x313f;
19964	t.rieulpieupkorean = 0x313c;
19965	t.rieulpieupsioskorean = 0x316b;
19966	t.rieulsioskorean = 0x313d;
19967	t.rieulthieuthkorean = 0x313e;
19968	t.rieultikeutkorean = 0x316a;
19969	t.rieulyeorinhieuhkorean = 0x316d;
19970	t.rightangle = 0x221f;
19971	t.righttackbelowcmb = 0x0319;
19972	t.righttriangle = 0x22bf;
19973	t.rihiragana = 0x308a;
19974	t.rikatakana = 0x30ea;
19975	t.rikatakanahalfwidth = 0xff98;
19976	t.ring = 0x02da;
19977	t.ringbelowcmb = 0x0325;
19978	t.ringcmb = 0x030a;
19979	t.ringhalfleft = 0x02bf;
19980	t.ringhalfleftarmenian = 0x0559;
19981	t.ringhalfleftbelowcmb = 0x031c;
19982	t.ringhalfleftcentered = 0x02d3;
19983	t.ringhalfright = 0x02be;
19984	t.ringhalfrightbelowcmb = 0x0339;
19985	t.ringhalfrightcentered = 0x02d2;
19986	t.rinvertedbreve = 0x0213;
19987	t.rittorusquare = 0x3351;
19988	t.rlinebelow = 0x1e5f;
19989	t.rlongleg = 0x027c;
19990	t.rlonglegturned = 0x027a;
19991	t.rmonospace = 0xff52;
19992	t.rohiragana = 0x308d;
19993	t.rokatakana = 0x30ed;
19994	t.rokatakanahalfwidth = 0xff9b;
19995	t.roruathai = 0x0e23;
19996	t.rparen = 0x24ad;
19997	t.rrabengali = 0x09dc;
19998	t.rradeva = 0x0931;
19999	t.rragurmukhi = 0x0a5c;
20000	t.rreharabic = 0x0691;
20001	t.rrehfinalarabic = 0xfb8d;
20002	t.rrvocalicbengali = 0x09e0;
20003	t.rrvocalicdeva = 0x0960;
20004	t.rrvocalicgujarati = 0x0ae0;
20005	t.rrvocalicvowelsignbengali = 0x09c4;
20006	t.rrvocalicvowelsigndeva = 0x0944;
20007	t.rrvocalicvowelsigngujarati = 0x0ac4;
20008	t.rsuperior = 0xf6f1;
20009	t.rtblock = 0x2590;
20010	t.rturned = 0x0279;
20011	t.rturnedsuperior = 0x02b4;
20012	t.ruhiragana = 0x308b;
20013	t.rukatakana = 0x30eb;
20014	t.rukatakanahalfwidth = 0xff99;
20015	t.rupeemarkbengali = 0x09f2;
20016	t.rupeesignbengali = 0x09f3;
20017	t.rupiah = 0xf6dd;
20018	t.ruthai = 0x0e24;
20019	t.rvocalicbengali = 0x098b;
20020	t.rvocalicdeva = 0x090b;
20021	t.rvocalicgujarati = 0x0a8b;
20022	t.rvocalicvowelsignbengali = 0x09c3;
20023	t.rvocalicvowelsigndeva = 0x0943;
20024	t.rvocalicvowelsigngujarati = 0x0ac3;
20025	t.s = 0x0073;
20026	t.sabengali = 0x09b8;
20027	t.sacute = 0x015b;
20028	t.sacutedotaccent = 0x1e65;
20029	t.sadarabic = 0x0635;
20030	t.sadeva = 0x0938;
20031	t.sadfinalarabic = 0xfeba;
20032	t.sadinitialarabic = 0xfebb;
20033	t.sadmedialarabic = 0xfebc;
20034	t.sagujarati = 0x0ab8;
20035	t.sagurmukhi = 0x0a38;
20036	t.sahiragana = 0x3055;
20037	t.sakatakana = 0x30b5;
20038	t.sakatakanahalfwidth = 0xff7b;
20039	t.sallallahoualayhewasallamarabic = 0xfdfa;
20040	t.samekh = 0x05e1;
20041	t.samekhdagesh = 0xfb41;
20042	t.samekhdageshhebrew = 0xfb41;
20043	t.samekhhebrew = 0x05e1;
20044	t.saraaathai = 0x0e32;
20045	t.saraaethai = 0x0e41;
20046	t.saraaimaimalaithai = 0x0e44;
20047	t.saraaimaimuanthai = 0x0e43;
20048	t.saraamthai = 0x0e33;
20049	t.saraathai = 0x0e30;
20050	t.saraethai = 0x0e40;
20051	t.saraiileftthai = 0xf886;
20052	t.saraiithai = 0x0e35;
20053	t.saraileftthai = 0xf885;
20054	t.saraithai = 0x0e34;
20055	t.saraothai = 0x0e42;
20056	t.saraueeleftthai = 0xf888;
20057	t.saraueethai = 0x0e37;
20058	t.saraueleftthai = 0xf887;
20059	t.sarauethai = 0x0e36;
20060	t.sarauthai = 0x0e38;
20061	t.sarauuthai = 0x0e39;
20062	t.sbopomofo = 0x3119;
20063	t.scaron = 0x0161;
20064	t.scarondotaccent = 0x1e67;
20065	t.scedilla = 0x015f;
20066	t.schwa = 0x0259;
20067	t.schwacyrillic = 0x04d9;
20068	t.schwadieresiscyrillic = 0x04db;
20069	t.schwahook = 0x025a;
20070	t.scircle = 0x24e2;
20071	t.scircumflex = 0x015d;
20072	t.scommaaccent = 0x0219;
20073	t.sdotaccent = 0x1e61;
20074	t.sdotbelow = 0x1e63;
20075	t.sdotbelowdotaccent = 0x1e69;
20076	t.seagullbelowcmb = 0x033c;
20077	t.second = 0x2033;
20078	t.secondtonechinese = 0x02ca;
20079	t.section = 0x00a7;
20080	t.seenarabic = 0x0633;
20081	t.seenfinalarabic = 0xfeb2;
20082	t.seeninitialarabic = 0xfeb3;
20083	t.seenmedialarabic = 0xfeb4;
20084	t.segol = 0x05b6;
20085	t.segol13 = 0x05b6;
20086	t.segol1f = 0x05b6;
20087	t.segol2c = 0x05b6;
20088	t.segolhebrew = 0x05b6;
20089	t.segolnarrowhebrew = 0x05b6;
20090	t.segolquarterhebrew = 0x05b6;
20091	t.segoltahebrew = 0x0592;
20092	t.segolwidehebrew = 0x05b6;
20093	t.seharmenian = 0x057d;
20094	t.sehiragana = 0x305b;
20095	t.sekatakana = 0x30bb;
20096	t.sekatakanahalfwidth = 0xff7e;
20097	t.semicolon = 0x003b;
20098	t.semicolonarabic = 0x061b;
20099	t.semicolonmonospace = 0xff1b;
20100	t.semicolonsmall = 0xfe54;
20101	t.semivoicedmarkkana = 0x309c;
20102	t.semivoicedmarkkanahalfwidth = 0xff9f;
20103	t.sentisquare = 0x3322;
20104	t.sentosquare = 0x3323;
20105	t.seven = 0x0037;
20106	t.sevenarabic = 0x0667;
20107	t.sevenbengali = 0x09ed;
20108	t.sevencircle = 0x2466;
20109	t.sevencircleinversesansserif = 0x2790;
20110	t.sevendeva = 0x096d;
20111	t.seveneighths = 0x215e;
20112	t.sevengujarati = 0x0aed;
20113	t.sevengurmukhi = 0x0a6d;
20114	t.sevenhackarabic = 0x0667;
20115	t.sevenhangzhou = 0x3027;
20116	t.sevenideographicparen = 0x3226;
20117	t.seveninferior = 0x2087;
20118	t.sevenmonospace = 0xff17;
20119	t.sevenoldstyle = 0xf737;
20120	t.sevenparen = 0x247a;
20121	t.sevenperiod = 0x248e;
20122	t.sevenpersian = 0x06f7;
20123	t.sevenroman = 0x2176;
20124	t.sevensuperior = 0x2077;
20125	t.seventeencircle = 0x2470;
20126	t.seventeenparen = 0x2484;
20127	t.seventeenperiod = 0x2498;
20128	t.seventhai = 0x0e57;
20129	t.sfthyphen = 0x00ad;
20130	t.shaarmenian = 0x0577;
20131	t.shabengali = 0x09b6;
20132	t.shacyrillic = 0x0448;
20133	t.shaddaarabic = 0x0651;
20134	t.shaddadammaarabic = 0xfc61;
20135	t.shaddadammatanarabic = 0xfc5e;
20136	t.shaddafathaarabic = 0xfc60;
20137	t.shaddakasraarabic = 0xfc62;
20138	t.shaddakasratanarabic = 0xfc5f;
20139	t.shade = 0x2592;
20140	t.shadedark = 0x2593;
20141	t.shadelight = 0x2591;
20142	t.shademedium = 0x2592;
20143	t.shadeva = 0x0936;
20144	t.shagujarati = 0x0ab6;
20145	t.shagurmukhi = 0x0a36;
20146	t.shalshelethebrew = 0x0593;
20147	t.shbopomofo = 0x3115;
20148	t.shchacyrillic = 0x0449;
20149	t.sheenarabic = 0x0634;
20150	t.sheenfinalarabic = 0xfeb6;
20151	t.sheeninitialarabic = 0xfeb7;
20152	t.sheenmedialarabic = 0xfeb8;
20153	t.sheicoptic = 0x03e3;
20154	t.sheqel = 0x20aa;
20155	t.sheqelhebrew = 0x20aa;
20156	t.sheva = 0x05b0;
20157	t.sheva115 = 0x05b0;
20158	t.sheva15 = 0x05b0;
20159	t.sheva22 = 0x05b0;
20160	t.sheva2e = 0x05b0;
20161	t.shevahebrew = 0x05b0;
20162	t.shevanarrowhebrew = 0x05b0;
20163	t.shevaquarterhebrew = 0x05b0;
20164	t.shevawidehebrew = 0x05b0;
20165	t.shhacyrillic = 0x04bb;
20166	t.shimacoptic = 0x03ed;
20167	t.shin = 0x05e9;
20168	t.shindagesh = 0xfb49;
20169	t.shindageshhebrew = 0xfb49;
20170	t.shindageshshindot = 0xfb2c;
20171	t.shindageshshindothebrew = 0xfb2c;
20172	t.shindageshsindot = 0xfb2d;
20173	t.shindageshsindothebrew = 0xfb2d;
20174	t.shindothebrew = 0x05c1;
20175	t.shinhebrew = 0x05e9;
20176	t.shinshindot = 0xfb2a;
20177	t.shinshindothebrew = 0xfb2a;
20178	t.shinsindot = 0xfb2b;
20179	t.shinsindothebrew = 0xfb2b;
20180	t.shook = 0x0282;
20181	t.sigma = 0x03c3;
20182	t.sigma1 = 0x03c2;
20183	t.sigmafinal = 0x03c2;
20184	t.sigmalunatesymbolgreek = 0x03f2;
20185	t.sihiragana = 0x3057;
20186	t.sikatakana = 0x30b7;
20187	t.sikatakanahalfwidth = 0xff7c;
20188	t.siluqhebrew = 0x05bd;
20189	t.siluqlefthebrew = 0x05bd;
20190	t.similar = 0x223c;
20191	t.sindothebrew = 0x05c2;
20192	t.siosacirclekorean = 0x3274;
20193	t.siosaparenkorean = 0x3214;
20194	t.sioscieuckorean = 0x317e;
20195	t.sioscirclekorean = 0x3266;
20196	t.sioskiyeokkorean = 0x317a;
20197	t.sioskorean = 0x3145;
20198	t.siosnieunkorean = 0x317b;
20199	t.siosparenkorean = 0x3206;
20200	t.siospieupkorean = 0x317d;
20201	t.siostikeutkorean = 0x317c;
20202	t.six = 0x0036;
20203	t.sixarabic = 0x0666;
20204	t.sixbengali = 0x09ec;
20205	t.sixcircle = 0x2465;
20206	t.sixcircleinversesansserif = 0x278f;
20207	t.sixdeva = 0x096c;
20208	t.sixgujarati = 0x0aec;
20209	t.sixgurmukhi = 0x0a6c;
20210	t.sixhackarabic = 0x0666;
20211	t.sixhangzhou = 0x3026;
20212	t.sixideographicparen = 0x3225;
20213	t.sixinferior = 0x2086;
20214	t.sixmonospace = 0xff16;
20215	t.sixoldstyle = 0xf736;
20216	t.sixparen = 0x2479;
20217	t.sixperiod = 0x248d;
20218	t.sixpersian = 0x06f6;
20219	t.sixroman = 0x2175;
20220	t.sixsuperior = 0x2076;
20221	t.sixteencircle = 0x246f;
20222	t.sixteencurrencydenominatorbengali = 0x09f9;
20223	t.sixteenparen = 0x2483;
20224	t.sixteenperiod = 0x2497;
20225	t.sixthai = 0x0e56;
20226	t.slash = 0x002f;
20227	t.slashmonospace = 0xff0f;
20228	t.slong = 0x017f;
20229	t.slongdotaccent = 0x1e9b;
20230	t.smileface = 0x263a;
20231	t.smonospace = 0xff53;
20232	t.sofpasuqhebrew = 0x05c3;
20233	t.softhyphen = 0x00ad;
20234	t.softsigncyrillic = 0x044c;
20235	t.sohiragana = 0x305d;
20236	t.sokatakana = 0x30bd;
20237	t.sokatakanahalfwidth = 0xff7f;
20238	t.soliduslongoverlaycmb = 0x0338;
20239	t.solidusshortoverlaycmb = 0x0337;
20240	t.sorusithai = 0x0e29;
20241	t.sosalathai = 0x0e28;
20242	t.sosothai = 0x0e0b;
20243	t.sosuathai = 0x0e2a;
20244	t.space = 0x0020;
20245	t.spacehackarabic = 0x0020;
20246	t.spade = 0x2660;
20247	t.spadesuitblack = 0x2660;
20248	t.spadesuitwhite = 0x2664;
20249	t.sparen = 0x24ae;
20250	t.squarebelowcmb = 0x033b;
20251	t.squarecc = 0x33c4;
20252	t.squarecm = 0x339d;
20253	t.squarediagonalcrosshatchfill = 0x25a9;
20254	t.squarehorizontalfill = 0x25a4;
20255	t.squarekg = 0x338f;
20256	t.squarekm = 0x339e;
20257	t.squarekmcapital = 0x33ce;
20258	t.squareln = 0x33d1;
20259	t.squarelog = 0x33d2;
20260	t.squaremg = 0x338e;
20261	t.squaremil = 0x33d5;
20262	t.squaremm = 0x339c;
20263	t.squaremsquared = 0x33a1;
20264	t.squareorthogonalcrosshatchfill = 0x25a6;
20265	t.squareupperlefttolowerrightfill = 0x25a7;
20266	t.squareupperrighttolowerleftfill = 0x25a8;
20267	t.squareverticalfill = 0x25a5;
20268	t.squarewhitewithsmallblack = 0x25a3;
20269	t.srsquare = 0x33db;
20270	t.ssabengali = 0x09b7;
20271	t.ssadeva = 0x0937;
20272	t.ssagujarati = 0x0ab7;
20273	t.ssangcieuckorean = 0x3149;
20274	t.ssanghieuhkorean = 0x3185;
20275	t.ssangieungkorean = 0x3180;
20276	t.ssangkiyeokkorean = 0x3132;
20277	t.ssangnieunkorean = 0x3165;
20278	t.ssangpieupkorean = 0x3143;
20279	t.ssangsioskorean = 0x3146;
20280	t.ssangtikeutkorean = 0x3138;
20281	t.ssuperior = 0xf6f2;
20282	t.sterling = 0x00a3;
20283	t.sterlingmonospace = 0xffe1;
20284	t.strokelongoverlaycmb = 0x0336;
20285	t.strokeshortoverlaycmb = 0x0335;
20286	t.subset = 0x2282;
20287	t.subsetnotequal = 0x228a;
20288	t.subsetorequal = 0x2286;
20289	t.succeeds = 0x227b;
20290	t.suchthat = 0x220b;
20291	t.suhiragana = 0x3059;
20292	t.sukatakana = 0x30b9;
20293	t.sukatakanahalfwidth = 0xff7d;
20294	t.sukunarabic = 0x0652;
20295	t.summation = 0x2211;
20296	t.sun = 0x263c;
20297	t.superset = 0x2283;
20298	t.supersetnotequal = 0x228b;
20299	t.supersetorequal = 0x2287;
20300	t.svsquare = 0x33dc;
20301	t.syouwaerasquare = 0x337c;
20302	t.t = 0x0074;
20303	t.tabengali = 0x09a4;
20304	t.tackdown = 0x22a4;
20305	t.tackleft = 0x22a3;
20306	t.tadeva = 0x0924;
20307	t.tagujarati = 0x0aa4;
20308	t.tagurmukhi = 0x0a24;
20309	t.taharabic = 0x0637;
20310	t.tahfinalarabic = 0xfec2;
20311	t.tahinitialarabic = 0xfec3;
20312	t.tahiragana = 0x305f;
20313	t.tahmedialarabic = 0xfec4;
20314	t.taisyouerasquare = 0x337d;
20315	t.takatakana = 0x30bf;
20316	t.takatakanahalfwidth = 0xff80;
20317	t.tatweelarabic = 0x0640;
20318	t.tau = 0x03c4;
20319	t.tav = 0x05ea;
20320	t.tavdages = 0xfb4a;
20321	t.tavdagesh = 0xfb4a;
20322	t.tavdageshhebrew = 0xfb4a;
20323	t.tavhebrew = 0x05ea;
20324	t.tbar = 0x0167;
20325	t.tbopomofo = 0x310a;
20326	t.tcaron = 0x0165;
20327	t.tccurl = 0x02a8;
20328	t.tcedilla = 0x0163;
20329	t.tcheharabic = 0x0686;
20330	t.tchehfinalarabic = 0xfb7b;
20331	t.tchehinitialarabic = 0xfb7c;
20332	t.tchehmedialarabic = 0xfb7d;
20333	t.tcircle = 0x24e3;
20334	t.tcircumflexbelow = 0x1e71;
20335	t.tcommaaccent = 0x0163;
20336	t.tdieresis = 0x1e97;
20337	t.tdotaccent = 0x1e6b;
20338	t.tdotbelow = 0x1e6d;
20339	t.tecyrillic = 0x0442;
20340	t.tedescendercyrillic = 0x04ad;
20341	t.teharabic = 0x062a;
20342	t.tehfinalarabic = 0xfe96;
20343	t.tehhahinitialarabic = 0xfca2;
20344	t.tehhahisolatedarabic = 0xfc0c;
20345	t.tehinitialarabic = 0xfe97;
20346	t.tehiragana = 0x3066;
20347	t.tehjeeminitialarabic = 0xfca1;
20348	t.tehjeemisolatedarabic = 0xfc0b;
20349	t.tehmarbutaarabic = 0x0629;
20350	t.tehmarbutafinalarabic = 0xfe94;
20351	t.tehmedialarabic = 0xfe98;
20352	t.tehmeeminitialarabic = 0xfca4;
20353	t.tehmeemisolatedarabic = 0xfc0e;
20354	t.tehnoonfinalarabic = 0xfc73;
20355	t.tekatakana = 0x30c6;
20356	t.tekatakanahalfwidth = 0xff83;
20357	t.telephone = 0x2121;
20358	t.telephoneblack = 0x260e;
20359	t.telishagedolahebrew = 0x05a0;
20360	t.telishaqetanahebrew = 0x05a9;
20361	t.tencircle = 0x2469;
20362	t.tenideographicparen = 0x3229;
20363	t.tenparen = 0x247d;
20364	t.tenperiod = 0x2491;
20365	t.tenroman = 0x2179;
20366	t.tesh = 0x02a7;
20367	t.tet = 0x05d8;
20368	t.tetdagesh = 0xfb38;
20369	t.tetdageshhebrew = 0xfb38;
20370	t.tethebrew = 0x05d8;
20371	t.tetsecyrillic = 0x04b5;
20372	t.tevirhebrew = 0x059b;
20373	t.tevirlefthebrew = 0x059b;
20374	t.thabengali = 0x09a5;
20375	t.thadeva = 0x0925;
20376	t.thagujarati = 0x0aa5;
20377	t.thagurmukhi = 0x0a25;
20378	t.thalarabic = 0x0630;
20379	t.thalfinalarabic = 0xfeac;
20380	t.thanthakhatlowleftthai = 0xf898;
20381	t.thanthakhatlowrightthai = 0xf897;
20382	t.thanthakhatthai = 0x0e4c;
20383	t.thanthakhatupperleftthai = 0xf896;
20384	t.theharabic = 0x062b;
20385	t.thehfinalarabic = 0xfe9a;
20386	t.thehinitialarabic = 0xfe9b;
20387	t.thehmedialarabic = 0xfe9c;
20388	t.thereexists = 0x2203;
20389	t.therefore = 0x2234;
20390	t.theta = 0x03b8;
20391	t.theta1 = 0x03d1;
20392	t.thetasymbolgreek = 0x03d1;
20393	t.thieuthacirclekorean = 0x3279;
20394	t.thieuthaparenkorean = 0x3219;
20395	t.thieuthcirclekorean = 0x326b;
20396	t.thieuthkorean = 0x314c;
20397	t.thieuthparenkorean = 0x320b;
20398	t.thirteencircle = 0x246c;
20399	t.thirteenparen = 0x2480;
20400	t.thirteenperiod = 0x2494;
20401	t.thonangmonthothai = 0x0e11;
20402	t.thook = 0x01ad;
20403	t.thophuthaothai = 0x0e12;
20404	t.thorn = 0x00fe;
20405	t.thothahanthai = 0x0e17;
20406	t.thothanthai = 0x0e10;
20407	t.thothongthai = 0x0e18;
20408	t.thothungthai = 0x0e16;
20409	t.thousandcyrillic = 0x0482;
20410	t.thousandsseparatorarabic = 0x066c;
20411	t.thousandsseparatorpersian = 0x066c;
20412	t.three = 0x0033;
20413	t.threearabic = 0x0663;
20414	t.threebengali = 0x09e9;
20415	t.threecircle = 0x2462;
20416	t.threecircleinversesansserif = 0x278c;
20417	t.threedeva = 0x0969;
20418	t.threeeighths = 0x215c;
20419	t.threegujarati = 0x0ae9;
20420	t.threegurmukhi = 0x0a69;
20421	t.threehackarabic = 0x0663;
20422	t.threehangzhou = 0x3023;
20423	t.threeideographicparen = 0x3222;
20424	t.threeinferior = 0x2083;
20425	t.threemonospace = 0xff13;
20426	t.threenumeratorbengali = 0x09f6;
20427	t.threeoldstyle = 0xf733;
20428	t.threeparen = 0x2476;
20429	t.threeperiod = 0x248a;
20430	t.threepersian = 0x06f3;
20431	t.threequarters = 0x00be;
20432	t.threequartersemdash = 0xf6de;
20433	t.threeroman = 0x2172;
20434	t.threesuperior = 0x00b3;
20435	t.threethai = 0x0e53;
20436	t.thzsquare = 0x3394;
20437	t.tihiragana = 0x3061;
20438	t.tikatakana = 0x30c1;
20439	t.tikatakanahalfwidth = 0xff81;
20440	t.tikeutacirclekorean = 0x3270;
20441	t.tikeutaparenkorean = 0x3210;
20442	t.tikeutcirclekorean = 0x3262;
20443	t.tikeutkorean = 0x3137;
20444	t.tikeutparenkorean = 0x3202;
20445	t.tilde = 0x02dc;
20446	t.tildebelowcmb = 0x0330;
20447	t.tildecmb = 0x0303;
20448	t.tildecomb = 0x0303;
20449	t.tildedoublecmb = 0x0360;
20450	t.tildeoperator = 0x223c;
20451	t.tildeoverlaycmb = 0x0334;
20452	t.tildeverticalcmb = 0x033e;
20453	t.timescircle = 0x2297;
20454	t.tipehahebrew = 0x0596;
20455	t.tipehalefthebrew = 0x0596;
20456	t.tippigurmukhi = 0x0a70;
20457	t.titlocyrilliccmb = 0x0483;
20458	t.tiwnarmenian = 0x057f;
20459	t.tlinebelow = 0x1e6f;
20460	t.tmonospace = 0xff54;
20461	t.toarmenian = 0x0569;
20462	t.tohiragana = 0x3068;
20463	t.tokatakana = 0x30c8;
20464	t.tokatakanahalfwidth = 0xff84;
20465	t.tonebarextrahighmod = 0x02e5;
20466	t.tonebarextralowmod = 0x02e9;
20467	t.tonebarhighmod = 0x02e6;
20468	t.tonebarlowmod = 0x02e8;
20469	t.tonebarmidmod = 0x02e7;
20470	t.tonefive = 0x01bd;
20471	t.tonesix = 0x0185;
20472	t.tonetwo = 0x01a8;
20473	t.tonos = 0x0384;
20474	t.tonsquare = 0x3327;
20475	t.topatakthai = 0x0e0f;
20476	t.tortoiseshellbracketleft = 0x3014;
20477	t.tortoiseshellbracketleftsmall = 0xfe5d;
20478	t.tortoiseshellbracketleftvertical = 0xfe39;
20479	t.tortoiseshellbracketright = 0x3015;
20480	t.tortoiseshellbracketrightsmall = 0xfe5e;
20481	t.tortoiseshellbracketrightvertical = 0xfe3a;
20482	t.totaothai = 0x0e15;
20483	t.tpalatalhook = 0x01ab;
20484	t.tparen = 0x24af;
20485	t.trademark = 0x2122;
20486	t.trademarksans = 0xf8ea;
20487	t.trademarkserif = 0xf6db;
20488	t.tretroflexhook = 0x0288;
20489	t.triagdn = 0x25bc;
20490	t.triaglf = 0x25c4;
20491	t.triagrt = 0x25ba;
20492	t.triagup = 0x25b2;
20493	t.ts = 0x02a6;
20494	t.tsadi = 0x05e6;
20495	t.tsadidagesh = 0xfb46;
20496	t.tsadidageshhebrew = 0xfb46;
20497	t.tsadihebrew = 0x05e6;
20498	t.tsecyrillic = 0x0446;
20499	t.tsere = 0x05b5;
20500	t.tsere12 = 0x05b5;
20501	t.tsere1e = 0x05b5;
20502	t.tsere2b = 0x05b5;
20503	t.tserehebrew = 0x05b5;
20504	t.tserenarrowhebrew = 0x05b5;
20505	t.tserequarterhebrew = 0x05b5;
20506	t.tserewidehebrew = 0x05b5;
20507	t.tshecyrillic = 0x045b;
20508	t.tsuperior = 0xf6f3;
20509	t.ttabengali = 0x099f;
20510	t.ttadeva = 0x091f;
20511	t.ttagujarati = 0x0a9f;
20512	t.ttagurmukhi = 0x0a1f;
20513	t.tteharabic = 0x0679;
20514	t.ttehfinalarabic = 0xfb67;
20515	t.ttehinitialarabic = 0xfb68;
20516	t.ttehmedialarabic = 0xfb69;
20517	t.tthabengali = 0x09a0;
20518	t.tthadeva = 0x0920;
20519	t.tthagujarati = 0x0aa0;
20520	t.tthagurmukhi = 0x0a20;
20521	t.tturned = 0x0287;
20522	t.tuhiragana = 0x3064;
20523	t.tukatakana = 0x30c4;
20524	t.tukatakanahalfwidth = 0xff82;
20525	t.tusmallhiragana = 0x3063;
20526	t.tusmallkatakana = 0x30c3;
20527	t.tusmallkatakanahalfwidth = 0xff6f;
20528	t.twelvecircle = 0x246b;
20529	t.twelveparen = 0x247f;
20530	t.twelveperiod = 0x2493;
20531	t.twelveroman = 0x217b;
20532	t.twentycircle = 0x2473;
20533	t.twentyhangzhou = 0x5344;
20534	t.twentyparen = 0x2487;
20535	t.twentyperiod = 0x249b;
20536	t.two = 0x0032;
20537	t.twoarabic = 0x0662;
20538	t.twobengali = 0x09e8;
20539	t.twocircle = 0x2461;
20540	t.twocircleinversesansserif = 0x278b;
20541	t.twodeva = 0x0968;
20542	t.twodotenleader = 0x2025;
20543	t.twodotleader = 0x2025;
20544	t.twodotleadervertical = 0xfe30;
20545	t.twogujarati = 0x0ae8;
20546	t.twogurmukhi = 0x0a68;
20547	t.twohackarabic = 0x0662;
20548	t.twohangzhou = 0x3022;
20549	t.twoideographicparen = 0x3221;
20550	t.twoinferior = 0x2082;
20551	t.twomonospace = 0xff12;
20552	t.twonumeratorbengali = 0x09f5;
20553	t.twooldstyle = 0xf732;
20554	t.twoparen = 0x2475;
20555	t.twoperiod = 0x2489;
20556	t.twopersian = 0x06f2;
20557	t.tworoman = 0x2171;
20558	t.twostroke = 0x01bb;
20559	t.twosuperior = 0x00b2;
20560	t.twothai = 0x0e52;
20561	t.twothirds = 0x2154;
20562	t.u = 0x0075;
20563	t.uacute = 0x00fa;
20564	t.ubar = 0x0289;
20565	t.ubengali = 0x0989;
20566	t.ubopomofo = 0x3128;
20567	t.ubreve = 0x016d;
20568	t.ucaron = 0x01d4;
20569	t.ucircle = 0x24e4;
20570	t.ucircumflex = 0x00fb;
20571	t.ucircumflexbelow = 0x1e77;
20572	t.ucyrillic = 0x0443;
20573	t.udattadeva = 0x0951;
20574	t.udblacute = 0x0171;
20575	t.udblgrave = 0x0215;
20576	t.udeva = 0x0909;
20577	t.udieresis = 0x00fc;
20578	t.udieresisacute = 0x01d8;
20579	t.udieresisbelow = 0x1e73;
20580	t.udieresiscaron = 0x01da;
20581	t.udieresiscyrillic = 0x04f1;
20582	t.udieresisgrave = 0x01dc;
20583	t.udieresismacron = 0x01d6;
20584	t.udotbelow = 0x1ee5;
20585	t.ugrave = 0x00f9;
20586	t.ugujarati = 0x0a89;
20587	t.ugurmukhi = 0x0a09;
20588	t.uhiragana = 0x3046;
20589	t.uhookabove = 0x1ee7;
20590	t.uhorn = 0x01b0;
20591	t.uhornacute = 0x1ee9;
20592	t.uhorndotbelow = 0x1ef1;
20593	t.uhorngrave = 0x1eeb;
20594	t.uhornhookabove = 0x1eed;
20595	t.uhorntilde = 0x1eef;
20596	t.uhungarumlaut = 0x0171;
20597	t.uhungarumlautcyrillic = 0x04f3;
20598	t.uinvertedbreve = 0x0217;
20599	t.ukatakana = 0x30a6;
20600	t.ukatakanahalfwidth = 0xff73;
20601	t.ukcyrillic = 0x0479;
20602	t.ukorean = 0x315c;
20603	t.umacron = 0x016b;
20604	t.umacroncyrillic = 0x04ef;
20605	t.umacrondieresis = 0x1e7b;
20606	t.umatragurmukhi = 0x0a41;
20607	t.umonospace = 0xff55;
20608	t.underscore = 0x005f;
20609	t.underscoredbl = 0x2017;
20610	t.underscoremonospace = 0xff3f;
20611	t.underscorevertical = 0xfe33;
20612	t.underscorewavy = 0xfe4f;
20613	t.union = 0x222a;
20614	t.universal = 0x2200;
20615	t.uogonek = 0x0173;
20616	t.uparen = 0x24b0;
20617	t.upblock = 0x2580;
20618	t.upperdothebrew = 0x05c4;
20619	t.upsilon = 0x03c5;
20620	t.upsilondieresis = 0x03cb;
20621	t.upsilondieresistonos = 0x03b0;
20622	t.upsilonlatin = 0x028a;
20623	t.upsilontonos = 0x03cd;
20624	t.uptackbelowcmb = 0x031d;
20625	t.uptackmod = 0x02d4;
20626	t.uragurmukhi = 0x0a73;
20627	t.uring = 0x016f;
20628	t.ushortcyrillic = 0x045e;
20629	t.usmallhiragana = 0x3045;
20630	t.usmallkatakana = 0x30a5;
20631	t.usmallkatakanahalfwidth = 0xff69;
20632	t.ustraightcyrillic = 0x04af;
20633	t.ustraightstrokecyrillic = 0x04b1;
20634	t.utilde = 0x0169;
20635	t.utildeacute = 0x1e79;
20636	t.utildebelow = 0x1e75;
20637	t.uubengali = 0x098a;
20638	t.uudeva = 0x090a;
20639	t.uugujarati = 0x0a8a;
20640	t.uugurmukhi = 0x0a0a;
20641	t.uumatragurmukhi = 0x0a42;
20642	t.uuvowelsignbengali = 0x09c2;
20643	t.uuvowelsigndeva = 0x0942;
20644	t.uuvowelsigngujarati = 0x0ac2;
20645	t.uvowelsignbengali = 0x09c1;
20646	t.uvowelsigndeva = 0x0941;
20647	t.uvowelsigngujarati = 0x0ac1;
20648	t.v = 0x0076;
20649	t.vadeva = 0x0935;
20650	t.vagujarati = 0x0ab5;
20651	t.vagurmukhi = 0x0a35;
20652	t.vakatakana = 0x30f7;
20653	t.vav = 0x05d5;
20654	t.vavdagesh = 0xfb35;
20655	t.vavdagesh65 = 0xfb35;
20656	t.vavdageshhebrew = 0xfb35;
20657	t.vavhebrew = 0x05d5;
20658	t.vavholam = 0xfb4b;
20659	t.vavholamhebrew = 0xfb4b;
20660	t.vavvavhebrew = 0x05f0;
20661	t.vavyodhebrew = 0x05f1;
20662	t.vcircle = 0x24e5;
20663	t.vdotbelow = 0x1e7f;
20664	t.vecyrillic = 0x0432;
20665	t.veharabic = 0x06a4;
20666	t.vehfinalarabic = 0xfb6b;
20667	t.vehinitialarabic = 0xfb6c;
20668	t.vehmedialarabic = 0xfb6d;
20669	t.vekatakana = 0x30f9;
20670	t.venus = 0x2640;
20671	t.verticalbar = 0x007c;
20672	t.verticallineabovecmb = 0x030d;
20673	t.verticallinebelowcmb = 0x0329;
20674	t.verticallinelowmod = 0x02cc;
20675	t.verticallinemod = 0x02c8;
20676	t.vewarmenian = 0x057e;
20677	t.vhook = 0x028b;
20678	t.vikatakana = 0x30f8;
20679	t.viramabengali = 0x09cd;
20680	t.viramadeva = 0x094d;
20681	t.viramagujarati = 0x0acd;
20682	t.visargabengali = 0x0983;
20683	t.visargadeva = 0x0903;
20684	t.visargagujarati = 0x0a83;
20685	t.vmonospace = 0xff56;
20686	t.voarmenian = 0x0578;
20687	t.voicediterationhiragana = 0x309e;
20688	t.voicediterationkatakana = 0x30fe;
20689	t.voicedmarkkana = 0x309b;
20690	t.voicedmarkkanahalfwidth = 0xff9e;
20691	t.vokatakana = 0x30fa;
20692	t.vparen = 0x24b1;
20693	t.vtilde = 0x1e7d;
20694	t.vturned = 0x028c;
20695	t.vuhiragana = 0x3094;
20696	t.vukatakana = 0x30f4;
20697	t.w = 0x0077;
20698	t.wacute = 0x1e83;
20699	t.waekorean = 0x3159;
20700	t.wahiragana = 0x308f;
20701	t.wakatakana = 0x30ef;
20702	t.wakatakanahalfwidth = 0xff9c;
20703	t.wakorean = 0x3158;
20704	t.wasmallhiragana = 0x308e;
20705	t.wasmallkatakana = 0x30ee;
20706	t.wattosquare = 0x3357;
20707	t.wavedash = 0x301c;
20708	t.wavyunderscorevertical = 0xfe34;
20709	t.wawarabic = 0x0648;
20710	t.wawfinalarabic = 0xfeee;
20711	t.wawhamzaabovearabic = 0x0624;
20712	t.wawhamzaabovefinalarabic = 0xfe86;
20713	t.wbsquare = 0x33dd;
20714	t.wcircle = 0x24e6;
20715	t.wcircumflex = 0x0175;
20716	t.wdieresis = 0x1e85;
20717	t.wdotaccent = 0x1e87;
20718	t.wdotbelow = 0x1e89;
20719	t.wehiragana = 0x3091;
20720	t.weierstrass = 0x2118;
20721	t.wekatakana = 0x30f1;
20722	t.wekorean = 0x315e;
20723	t.weokorean = 0x315d;
20724	t.wgrave = 0x1e81;
20725	t.whitebullet = 0x25e6;
20726	t.whitecircle = 0x25cb;
20727	t.whitecircleinverse = 0x25d9;
20728	t.whitecornerbracketleft = 0x300e;
20729	t.whitecornerbracketleftvertical = 0xfe43;
20730	t.whitecornerbracketright = 0x300f;
20731	t.whitecornerbracketrightvertical = 0xfe44;
20732	t.whitediamond = 0x25c7;
20733	t.whitediamondcontainingblacksmalldiamond = 0x25c8;
20734	t.whitedownpointingsmalltriangle = 0x25bf;
20735	t.whitedownpointingtriangle = 0x25bd;
20736	t.whiteleftpointingsmalltriangle = 0x25c3;
20737	t.whiteleftpointingtriangle = 0x25c1;
20738	t.whitelenticularbracketleft = 0x3016;
20739	t.whitelenticularbracketright = 0x3017;
20740	t.whiterightpointingsmalltriangle = 0x25b9;
20741	t.whiterightpointingtriangle = 0x25b7;
20742	t.whitesmallsquare = 0x25ab;
20743	t.whitesmilingface = 0x263a;
20744	t.whitesquare = 0x25a1;
20745	t.whitestar = 0x2606;
20746	t.whitetelephone = 0x260f;
20747	t.whitetortoiseshellbracketleft = 0x3018;
20748	t.whitetortoiseshellbracketright = 0x3019;
20749	t.whiteuppointingsmalltriangle = 0x25b5;
20750	t.whiteuppointingtriangle = 0x25b3;
20751	t.wihiragana = 0x3090;
20752	t.wikatakana = 0x30f0;
20753	t.wikorean = 0x315f;
20754	t.wmonospace = 0xff57;
20755	t.wohiragana = 0x3092;
20756	t.wokatakana = 0x30f2;
20757	t.wokatakanahalfwidth = 0xff66;
20758	t.won = 0x20a9;
20759	t.wonmonospace = 0xffe6;
20760	t.wowaenthai = 0x0e27;
20761	t.wparen = 0x24b2;
20762	t.wring = 0x1e98;
20763	t.wsuperior = 0x02b7;
20764	t.wturned = 0x028d;
20765	t.wynn = 0x01bf;
20766	t.x = 0x0078;
20767	t.xabovecmb = 0x033d;
20768	t.xbopomofo = 0x3112;
20769	t.xcircle = 0x24e7;
20770	t.xdieresis = 0x1e8d;
20771	t.xdotaccent = 0x1e8b;
20772	t.xeharmenian = 0x056d;
20773	t.xi = 0x03be;
20774	t.xmonospace = 0xff58;
20775	t.xparen = 0x24b3;
20776	t.xsuperior = 0x02e3;
20777	t.y = 0x0079;
20778	t.yaadosquare = 0x334e;
20779	t.yabengali = 0x09af;
20780	t.yacute = 0x00fd;
20781	t.yadeva = 0x092f;
20782	t.yaekorean = 0x3152;
20783	t.yagujarati = 0x0aaf;
20784	t.yagurmukhi = 0x0a2f;
20785	t.yahiragana = 0x3084;
20786	t.yakatakana = 0x30e4;
20787	t.yakatakanahalfwidth = 0xff94;
20788	t.yakorean = 0x3151;
20789	t.yamakkanthai = 0x0e4e;
20790	t.yasmallhiragana = 0x3083;
20791	t.yasmallkatakana = 0x30e3;
20792	t.yasmallkatakanahalfwidth = 0xff6c;
20793	t.yatcyrillic = 0x0463;
20794	t.ycircle = 0x24e8;
20795	t.ycircumflex = 0x0177;
20796	t.ydieresis = 0x00ff;
20797	t.ydotaccent = 0x1e8f;
20798	t.ydotbelow = 0x1ef5;
20799	t.yeharabic = 0x064a;
20800	t.yehbarreearabic = 0x06d2;
20801	t.yehbarreefinalarabic = 0xfbaf;
20802	t.yehfinalarabic = 0xfef2;
20803	t.yehhamzaabovearabic = 0x0626;
20804	t.yehhamzaabovefinalarabic = 0xfe8a;
20805	t.yehhamzaaboveinitialarabic = 0xfe8b;
20806	t.yehhamzaabovemedialarabic = 0xfe8c;
20807	t.yehinitialarabic = 0xfef3;
20808	t.yehmedialarabic = 0xfef4;
20809	t.yehmeeminitialarabic = 0xfcdd;
20810	t.yehmeemisolatedarabic = 0xfc58;
20811	t.yehnoonfinalarabic = 0xfc94;
20812	t.yehthreedotsbelowarabic = 0x06d1;
20813	t.yekorean = 0x3156;
20814	t.yen = 0x00a5;
20815	t.yenmonospace = 0xffe5;
20816	t.yeokorean = 0x3155;
20817	t.yeorinhieuhkorean = 0x3186;
20818	t.yerahbenyomohebrew = 0x05aa;
20819	t.yerahbenyomolefthebrew = 0x05aa;
20820	t.yericyrillic = 0x044b;
20821	t.yerudieresiscyrillic = 0x04f9;
20822	t.yesieungkorean = 0x3181;
20823	t.yesieungpansioskorean = 0x3183;
20824	t.yesieungsioskorean = 0x3182;
20825	t.yetivhebrew = 0x059a;
20826	t.ygrave = 0x1ef3;
20827	t.yhook = 0x01b4;
20828	t.yhookabove = 0x1ef7;
20829	t.yiarmenian = 0x0575;
20830	t.yicyrillic = 0x0457;
20831	t.yikorean = 0x3162;
20832	t.yinyang = 0x262f;
20833	t.yiwnarmenian = 0x0582;
20834	t.ymonospace = 0xff59;
20835	t.yod = 0x05d9;
20836	t.yoddagesh = 0xfb39;
20837	t.yoddageshhebrew = 0xfb39;
20838	t.yodhebrew = 0x05d9;
20839	t.yodyodhebrew = 0x05f2;
20840	t.yodyodpatahhebrew = 0xfb1f;
20841	t.yohiragana = 0x3088;
20842	t.yoikorean = 0x3189;
20843	t.yokatakana = 0x30e8;
20844	t.yokatakanahalfwidth = 0xff96;
20845	t.yokorean = 0x315b;
20846	t.yosmallhiragana = 0x3087;
20847	t.yosmallkatakana = 0x30e7;
20848	t.yosmallkatakanahalfwidth = 0xff6e;
20849	t.yotgreek = 0x03f3;
20850	t.yoyaekorean = 0x3188;
20851	t.yoyakorean = 0x3187;
20852	t.yoyakthai = 0x0e22;
20853	t.yoyingthai = 0x0e0d;
20854	t.yparen = 0x24b4;
20855	t.ypogegrammeni = 0x037a;
20856	t.ypogegrammenigreekcmb = 0x0345;
20857	t.yr = 0x01a6;
20858	t.yring = 0x1e99;
20859	t.ysuperior = 0x02b8;
20860	t.ytilde = 0x1ef9;
20861	t.yturned = 0x028e;
20862	t.yuhiragana = 0x3086;
20863	t.yuikorean = 0x318c;
20864	t.yukatakana = 0x30e6;
20865	t.yukatakanahalfwidth = 0xff95;
20866	t.yukorean = 0x3160;
20867	t.yusbigcyrillic = 0x046b;
20868	t.yusbigiotifiedcyrillic = 0x046d;
20869	t.yuslittlecyrillic = 0x0467;
20870	t.yuslittleiotifiedcyrillic = 0x0469;
20871	t.yusmallhiragana = 0x3085;
20872	t.yusmallkatakana = 0x30e5;
20873	t.yusmallkatakanahalfwidth = 0xff6d;
20874	t.yuyekorean = 0x318b;
20875	t.yuyeokorean = 0x318a;
20876	t.yyabengali = 0x09df;
20877	t.yyadeva = 0x095f;
20878	t.z = 0x007a;
20879	t.zaarmenian = 0x0566;
20880	t.zacute = 0x017a;
20881	t.zadeva = 0x095b;
20882	t.zagurmukhi = 0x0a5b;
20883	t.zaharabic = 0x0638;
20884	t.zahfinalarabic = 0xfec6;
20885	t.zahinitialarabic = 0xfec7;
20886	t.zahiragana = 0x3056;
20887	t.zahmedialarabic = 0xfec8;
20888	t.zainarabic = 0x0632;
20889	t.zainfinalarabic = 0xfeb0;
20890	t.zakatakana = 0x30b6;
20891	t.zaqefgadolhebrew = 0x0595;
20892	t.zaqefqatanhebrew = 0x0594;
20893	t.zarqahebrew = 0x0598;
20894	t.zayin = 0x05d6;
20895	t.zayindagesh = 0xfb36;
20896	t.zayindageshhebrew = 0xfb36;
20897	t.zayinhebrew = 0x05d6;
20898	t.zbopomofo = 0x3117;
20899	t.zcaron = 0x017e;
20900	t.zcircle = 0x24e9;
20901	t.zcircumflex = 0x1e91;
20902	t.zcurl = 0x0291;
20903	t.zdot = 0x017c;
20904	t.zdotaccent = 0x017c;
20905	t.zdotbelow = 0x1e93;
20906	t.zecyrillic = 0x0437;
20907	t.zedescendercyrillic = 0x0499;
20908	t.zedieresiscyrillic = 0x04df;
20909	t.zehiragana = 0x305c;
20910	t.zekatakana = 0x30bc;
20911	t.zero = 0x0030;
20912	t.zeroarabic = 0x0660;
20913	t.zerobengali = 0x09e6;
20914	t.zerodeva = 0x0966;
20915	t.zerogujarati = 0x0ae6;
20916	t.zerogurmukhi = 0x0a66;
20917	t.zerohackarabic = 0x0660;
20918	t.zeroinferior = 0x2080;
20919	t.zeromonospace = 0xff10;
20920	t.zerooldstyle = 0xf730;
20921	t.zeropersian = 0x06f0;
20922	t.zerosuperior = 0x2070;
20923	t.zerothai = 0x0e50;
20924	t.zerowidthjoiner = 0xfeff;
20925	t.zerowidthnonjoiner = 0x200c;
20926	t.zerowidthspace = 0x200b;
20927	t.zeta = 0x03b6;
20928	t.zhbopomofo = 0x3113;
20929	t.zhearmenian = 0x056a;
20930	t.zhebrevecyrillic = 0x04c2;
20931	t.zhecyrillic = 0x0436;
20932	t.zhedescendercyrillic = 0x0497;
20933	t.zhedieresiscyrillic = 0x04dd;
20934	t.zihiragana = 0x3058;
20935	t.zikatakana = 0x30b8;
20936	t.zinorhebrew = 0x05ae;
20937	t.zlinebelow = 0x1e95;
20938	t.zmonospace = 0xff5a;
20939	t.zohiragana = 0x305e;
20940	t.zokatakana = 0x30be;
20941	t.zparen = 0x24b5;
20942	t.zretroflexhook = 0x0290;
20943	t.zstroke = 0x01b6;
20944	t.zuhiragana = 0x305a;
20945	t.zukatakana = 0x30ba;
20946	t[".notdef"] = 0x0000;
20947	t.angbracketleftbig = 0x2329;
20948	t.angbracketleftBig = 0x2329;
20949	t.angbracketleftbigg = 0x2329;
20950	t.angbracketleftBigg = 0x2329;
20951	t.angbracketrightBig = 0x232a;
20952	t.angbracketrightbig = 0x232a;
20953	t.angbracketrightBigg = 0x232a;
20954	t.angbracketrightbigg = 0x232a;
20955	t.arrowhookleft = 0x21aa;
20956	t.arrowhookright = 0x21a9;
20957	t.arrowlefttophalf = 0x21bc;
20958	t.arrowleftbothalf = 0x21bd;
20959	t.arrownortheast = 0x2197;
20960	t.arrownorthwest = 0x2196;
20961	t.arrowrighttophalf = 0x21c0;
20962	t.arrowrightbothalf = 0x21c1;
20963	t.arrowsoutheast = 0x2198;
20964	t.arrowsouthwest = 0x2199;
20965	t.backslashbig = 0x2216;
20966	t.backslashBig = 0x2216;
20967	t.backslashBigg = 0x2216;
20968	t.backslashbigg = 0x2216;
20969	t.bardbl = 0x2016;
20970	t.bracehtipdownleft = 0xfe37;
20971	t.bracehtipdownright = 0xfe37;
20972	t.bracehtipupleft = 0xfe38;
20973	t.bracehtipupright = 0xfe38;
20974	t.braceleftBig = 0x007b;
20975	t.braceleftbig = 0x007b;
20976	t.braceleftbigg = 0x007b;
20977	t.braceleftBigg = 0x007b;
20978	t.bracerightBig = 0x007d;
20979	t.bracerightbig = 0x007d;
20980	t.bracerightbigg = 0x007d;
20981	t.bracerightBigg = 0x007d;
20982	t.bracketleftbig = 0x005b;
20983	t.bracketleftBig = 0x005b;
20984	t.bracketleftbigg = 0x005b;
20985	t.bracketleftBigg = 0x005b;
20986	t.bracketrightBig = 0x005d;
20987	t.bracketrightbig = 0x005d;
20988	t.bracketrightbigg = 0x005d;
20989	t.bracketrightBigg = 0x005d;
20990	t.ceilingleftbig = 0x2308;
20991	t.ceilingleftBig = 0x2308;
20992	t.ceilingleftBigg = 0x2308;
20993	t.ceilingleftbigg = 0x2308;
20994	t.ceilingrightbig = 0x2309;
20995	t.ceilingrightBig = 0x2309;
20996	t.ceilingrightbigg = 0x2309;
20997	t.ceilingrightBigg = 0x2309;
20998	t.circledotdisplay = 0x2299;
20999	t.circledottext = 0x2299;
21000	t.circlemultiplydisplay = 0x2297;
21001	t.circlemultiplytext = 0x2297;
21002	t.circleplusdisplay = 0x2295;
21003	t.circleplustext = 0x2295;
21004	t.contintegraldisplay = 0x222e;
21005	t.contintegraltext = 0x222e;
21006	t.coproductdisplay = 0x2210;
21007	t.coproducttext = 0x2210;
21008	t.floorleftBig = 0x230a;
21009	t.floorleftbig = 0x230a;
21010	t.floorleftbigg = 0x230a;
21011	t.floorleftBigg = 0x230a;
21012	t.floorrightbig = 0x230b;
21013	t.floorrightBig = 0x230b;
21014	t.floorrightBigg = 0x230b;
21015	t.floorrightbigg = 0x230b;
21016	t.hatwide = 0x0302;
21017	t.hatwider = 0x0302;
21018	t.hatwidest = 0x0302;
21019	t.intercal = 0x1d40;
21020	t.integraldisplay = 0x222b;
21021	t.integraltext = 0x222b;
21022	t.intersectiondisplay = 0x22c2;
21023	t.intersectiontext = 0x22c2;
21024	t.logicalanddisplay = 0x2227;
21025	t.logicalandtext = 0x2227;
21026	t.logicalordisplay = 0x2228;
21027	t.logicalortext = 0x2228;
21028	t.parenleftBig = 0x0028;
21029	t.parenleftbig = 0x0028;
21030	t.parenleftBigg = 0x0028;
21031	t.parenleftbigg = 0x0028;
21032	t.parenrightBig = 0x0029;
21033	t.parenrightbig = 0x0029;
21034	t.parenrightBigg = 0x0029;
21035	t.parenrightbigg = 0x0029;
21036	t.prime = 0x2032;
21037	t.productdisplay = 0x220f;
21038	t.producttext = 0x220f;
21039	t.radicalbig = 0x221a;
21040	t.radicalBig = 0x221a;
21041	t.radicalBigg = 0x221a;
21042	t.radicalbigg = 0x221a;
21043	t.radicalbt = 0x221a;
21044	t.radicaltp = 0x221a;
21045	t.radicalvertex = 0x221a;
21046	t.slashbig = 0x002f;
21047	t.slashBig = 0x002f;
21048	t.slashBigg = 0x002f;
21049	t.slashbigg = 0x002f;
21050	t.summationdisplay = 0x2211;
21051	t.summationtext = 0x2211;
21052	t.tildewide = 0x02dc;
21053	t.tildewider = 0x02dc;
21054	t.tildewidest = 0x02dc;
21055	t.uniondisplay = 0x22c3;
21056	t.unionmultidisplay = 0x228e;
21057	t.unionmultitext = 0x228e;
21058	t.unionsqdisplay = 0x2294;
21059	t.unionsqtext = 0x2294;
21060	t.uniontext = 0x22c3;
21061	t.vextenddouble = 0x2225;
21062	t.vextendsingle = 0x2223;
21063});
21064const getDingbatsGlyphsUnicode = getLookupTableFactory(function (t) {
21065	t.space = 0x0020;
21066	t.a1 = 0x2701;
21067	t.a2 = 0x2702;
21068	t.a202 = 0x2703;
21069	t.a3 = 0x2704;
21070	t.a4 = 0x260e;
21071	t.a5 = 0x2706;
21072	t.a119 = 0x2707;
21073	t.a118 = 0x2708;
21074	t.a117 = 0x2709;
21075	t.a11 = 0x261b;
21076	t.a12 = 0x261e;
21077	t.a13 = 0x270c;
21078	t.a14 = 0x270d;
21079	t.a15 = 0x270e;
21080	t.a16 = 0x270f;
21081	t.a105 = 0x2710;
21082	t.a17 = 0x2711;
21083	t.a18 = 0x2712;
21084	t.a19 = 0x2713;
21085	t.a20 = 0x2714;
21086	t.a21 = 0x2715;
21087	t.a22 = 0x2716;
21088	t.a23 = 0x2717;
21089	t.a24 = 0x2718;
21090	t.a25 = 0x2719;
21091	t.a26 = 0x271a;
21092	t.a27 = 0x271b;
21093	t.a28 = 0x271c;
21094	t.a6 = 0x271d;
21095	t.a7 = 0x271e;
21096	t.a8 = 0x271f;
21097	t.a9 = 0x2720;
21098	t.a10 = 0x2721;
21099	t.a29 = 0x2722;
21100	t.a30 = 0x2723;
21101	t.a31 = 0x2724;
21102	t.a32 = 0x2725;
21103	t.a33 = 0x2726;
21104	t.a34 = 0x2727;
21105	t.a35 = 0x2605;
21106	t.a36 = 0x2729;
21107	t.a37 = 0x272a;
21108	t.a38 = 0x272b;
21109	t.a39 = 0x272c;
21110	t.a40 = 0x272d;
21111	t.a41 = 0x272e;
21112	t.a42 = 0x272f;
21113	t.a43 = 0x2730;
21114	t.a44 = 0x2731;
21115	t.a45 = 0x2732;
21116	t.a46 = 0x2733;
21117	t.a47 = 0x2734;
21118	t.a48 = 0x2735;
21119	t.a49 = 0x2736;
21120	t.a50 = 0x2737;
21121	t.a51 = 0x2738;
21122	t.a52 = 0x2739;
21123	t.a53 = 0x273a;
21124	t.a54 = 0x273b;
21125	t.a55 = 0x273c;
21126	t.a56 = 0x273d;
21127	t.a57 = 0x273e;
21128	t.a58 = 0x273f;
21129	t.a59 = 0x2740;
21130	t.a60 = 0x2741;
21131	t.a61 = 0x2742;
21132	t.a62 = 0x2743;
21133	t.a63 = 0x2744;
21134	t.a64 = 0x2745;
21135	t.a65 = 0x2746;
21136	t.a66 = 0x2747;
21137	t.a67 = 0x2748;
21138	t.a68 = 0x2749;
21139	t.a69 = 0x274a;
21140	t.a70 = 0x274b;
21141	t.a71 = 0x25cf;
21142	t.a72 = 0x274d;
21143	t.a73 = 0x25a0;
21144	t.a74 = 0x274f;
21145	t.a203 = 0x2750;
21146	t.a75 = 0x2751;
21147	t.a204 = 0x2752;
21148	t.a76 = 0x25b2;
21149	t.a77 = 0x25bc;
21150	t.a78 = 0x25c6;
21151	t.a79 = 0x2756;
21152	t.a81 = 0x25d7;
21153	t.a82 = 0x2758;
21154	t.a83 = 0x2759;
21155	t.a84 = 0x275a;
21156	t.a97 = 0x275b;
21157	t.a98 = 0x275c;
21158	t.a99 = 0x275d;
21159	t.a100 = 0x275e;
21160	t.a101 = 0x2761;
21161	t.a102 = 0x2762;
21162	t.a103 = 0x2763;
21163	t.a104 = 0x2764;
21164	t.a106 = 0x2765;
21165	t.a107 = 0x2766;
21166	t.a108 = 0x2767;
21167	t.a112 = 0x2663;
21168	t.a111 = 0x2666;
21169	t.a110 = 0x2665;
21170	t.a109 = 0x2660;
21171	t.a120 = 0x2460;
21172	t.a121 = 0x2461;
21173	t.a122 = 0x2462;
21174	t.a123 = 0x2463;
21175	t.a124 = 0x2464;
21176	t.a125 = 0x2465;
21177	t.a126 = 0x2466;
21178	t.a127 = 0x2467;
21179	t.a128 = 0x2468;
21180	t.a129 = 0x2469;
21181	t.a130 = 0x2776;
21182	t.a131 = 0x2777;
21183	t.a132 = 0x2778;
21184	t.a133 = 0x2779;
21185	t.a134 = 0x277a;
21186	t.a135 = 0x277b;
21187	t.a136 = 0x277c;
21188	t.a137 = 0x277d;
21189	t.a138 = 0x277e;
21190	t.a139 = 0x277f;
21191	t.a140 = 0x2780;
21192	t.a141 = 0x2781;
21193	t.a142 = 0x2782;
21194	t.a143 = 0x2783;
21195	t.a144 = 0x2784;
21196	t.a145 = 0x2785;
21197	t.a146 = 0x2786;
21198	t.a147 = 0x2787;
21199	t.a148 = 0x2788;
21200	t.a149 = 0x2789;
21201	t.a150 = 0x278a;
21202	t.a151 = 0x278b;
21203	t.a152 = 0x278c;
21204	t.a153 = 0x278d;
21205	t.a154 = 0x278e;
21206	t.a155 = 0x278f;
21207	t.a156 = 0x2790;
21208	t.a157 = 0x2791;
21209	t.a158 = 0x2792;
21210	t.a159 = 0x2793;
21211	t.a160 = 0x2794;
21212	t.a161 = 0x2192;
21213	t.a163 = 0x2194;
21214	t.a164 = 0x2195;
21215	t.a196 = 0x2798;
21216	t.a165 = 0x2799;
21217	t.a192 = 0x279a;
21218	t.a166 = 0x279b;
21219	t.a167 = 0x279c;
21220	t.a168 = 0x279d;
21221	t.a169 = 0x279e;
21222	t.a170 = 0x279f;
21223	t.a171 = 0x27a0;
21224	t.a172 = 0x27a1;
21225	t.a173 = 0x27a2;
21226	t.a162 = 0x27a3;
21227	t.a174 = 0x27a4;
21228	t.a175 = 0x27a5;
21229	t.a176 = 0x27a6;
21230	t.a177 = 0x27a7;
21231	t.a178 = 0x27a8;
21232	t.a179 = 0x27a9;
21233	t.a193 = 0x27aa;
21234	t.a180 = 0x27ab;
21235	t.a199 = 0x27ac;
21236	t.a181 = 0x27ad;
21237	t.a200 = 0x27ae;
21238	t.a182 = 0x27af;
21239	t.a201 = 0x27b1;
21240	t.a183 = 0x27b2;
21241	t.a184 = 0x27b3;
21242	t.a197 = 0x27b4;
21243	t.a185 = 0x27b5;
21244	t.a194 = 0x27b6;
21245	t.a198 = 0x27b7;
21246	t.a186 = 0x27b8;
21247	t.a195 = 0x27b9;
21248	t.a187 = 0x27ba;
21249	t.a188 = 0x27bb;
21250	t.a189 = 0x27bc;
21251	t.a190 = 0x27bd;
21252	t.a191 = 0x27be;
21253	t.a89 = 0x2768;
21254	t.a90 = 0x2769;
21255	t.a93 = 0x276a;
21256	t.a94 = 0x276b;
21257	t.a91 = 0x276c;
21258	t.a92 = 0x276d;
21259	t.a205 = 0x276e;
21260	t.a85 = 0x276f;
21261	t.a206 = 0x2770;
21262	t.a86 = 0x2771;
21263	t.a87 = 0x2772;
21264	t.a88 = 0x2773;
21265	t.a95 = 0x2774;
21266	t.a96 = 0x2775;
vendor: 12,545 bytes, lines 21267-21526
21267	t[".notdef"] = 0x0000;
21268});
21269
21270;// ./src/core/unicode.js
21271
21272const getSpecialPUASymbols = getLookupTableFactory(function (t) {
21273	t[63721] = 0x00a9;
21274	t[63193] = 0x00a9;
21275	t[63720] = 0x00ae;
21276	t[63194] = 0x00ae;
21277	t[63722] = 0x2122;
21278	t[63195] = 0x2122;
21279	t[63729] = 0x23a7;
21280	t[63730] = 0x23a8;
21281	t[63731] = 0x23a9;
21282	t[63740] = 0x23ab;
21283	t[63741] = 0x23ac;
21284	t[63742] = 0x23ad;
21285	t[63726] = 0x23a1;
21286	t[63727] = 0x23a2;
21287	t[63728] = 0x23a3;
21288	t[63737] = 0x23a4;
21289	t[63738] = 0x23a5;
21290	t[63739] = 0x23a6;
21291	t[63723] = 0x239b;
21292	t[63724] = 0x239c;
21293	t[63725] = 0x239d;
21294	t[63734] = 0x239e;
21295	t[63735] = 0x239f;
21296	t[63736] = 0x23a0;
21297});
21298function mapSpecialUnicodeValues(code) {
21299	if (code >= 0xfff0 && code <= 0xffff) {
21300		return 0;
21301	} else if (code >= 0xf600 && code <= 0xf8ff) {
21302		return getSpecialPUASymbols()[code] || code;
21303	} else if (code === 0x00ad) {
21304		return 0x002d;
21305	}
21306	return code;
21307}
21308function getUnicodeForGlyph(name, glyphsUnicodeMap) {
21309	let unicode = glyphsUnicodeMap[name];
21310	if (unicode !== undefined) {
21311		return unicode;
21312	}
21313	if (!name) {
21314		return -1;
21315	}
21316	if (name[0] === "u") {
21317		const nameLen = name.length;
21318		let hexStr;
21319		if (nameLen === 7 && name[1] === "n" && name[2] === "i") {
21320			hexStr = name.substring(3);
21321		} else if (nameLen >= 5 && nameLen <= 7) {
21322			hexStr = name.substring(1);
21323		} else {
21324			return -1;
21325		}
21326		if (hexStr === hexStr.toUpperCase()) {
21327			unicode = parseInt(hexStr, 16);
21328			if (unicode >= 0) {
21329				return unicode;
21330			}
21331		}
21332	}
21333	return -1;
21334}
21335const UnicodeRanges = [[0x0000, 0x007f], [0x0080, 0x00ff], [0x0100, 0x017f], [0x0180, 0x024f], [0x0250, 0x02af, 0x1d00, 0x1d7f, 0x1d80, 0x1dbf], [0x02b0, 0x02ff, 0xa700, 0xa71f], [0x0300, 0x036f, 0x1dc0, 0x1dff], [0x0370, 0x03ff], [0x2c80, 0x2cff], [0x0400, 0x04ff, 0x0500, 0x052f, 0x2de0, 0x2dff, 0xa640, 0xa69f], [0x0530, 0x058f], [0x0590, 0x05ff], [0xa500, 0xa63f], [0x0600, 0x06ff, 0x0750, 0x077f], [0x07c0, 0x07ff], [0x0900, 0x097f], [0x0980, 0x09ff], [0x0a00, 0x0a7f], [0x0a80, 0x0aff], [0x0b00, 0x0b7f], [0x0b80, 0x0bff], [0x0c00, 0x0c7f], [0x0c80, 0x0cff], [0x0d00, 0x0d7f], [0x0e00, 0x0e7f], [0x0e80, 0x0eff], [0x10a0, 0x10ff, 0x2d00, 0x2d2f], [0x1b00, 0x1b7f], [0x1100, 0x11ff], [0x1e00, 0x1eff, 0x2c60, 0x2c7f, 0xa720, 0xa7ff], [0x1f00, 0x1fff], [0x2000, 0x206f, 0x2e00, 0x2e7f], [0x2070, 0x209f], [0x20a0, 0x20cf], [0x20d0, 0x20ff], [0x2100, 0x214f], [0x2150, 0x218f], [0x2190, 0x21ff, 0x27f0, 0x27ff, 0x2900, 0x297f, 0x2b00, 0x2bff], [0x2200, 0x22ff, 0x2a00, 0x2aff, 0x27c0, 0x27ef, 0x2980, 0x29ff], [0x2300, 0x23ff], [0x2400, 0x243f], [0x2440, 0x245f], [0x2460, 0x24ff], [0x2500, 0x257f], [0x2580, 0x259f], [0x25a0, 0x25ff], [0x2600, 0x26ff], [0x2700, 0x27bf], [0x3000, 0x303f], [0x3040, 0x309f], [0x30a0, 0x30ff, 0x31f0, 0x31ff], [0x3100, 0x312f, 0x31a0, 0x31bf], [0x3130, 0x318f], [0xa840, 0xa87f], [0x3200, 0x32ff], [0x3300, 0x33ff], [0xac00, 0xd7af], [0xd800, 0xdfff], [0x10900, 0x1091f], [0x4e00, 0x9fff, 0x2e80, 0x2eff, 0x2f00, 0x2fdf, 0x2ff0, 0x2fff, 0x3400, 0x4dbf, 0x20000, 0x2a6df, 0x3190, 0x319f], [0xe000, 0xf8ff], [0x31c0, 0x31ef, 0xf900, 0xfaff, 0x2f800, 0x2fa1f], [0xfb00, 0xfb4f], [0xfb50, 0xfdff], [0xfe20, 0xfe2f], [0xfe10, 0xfe1f], [0xfe50, 0xfe6f], [0xfe70, 0xfeff], [0xff00, 0xffef], [0xfff0, 0xffff], [0x0f00, 0x0fff], [0x0700, 0x074f], [0x0780, 0x07bf], [0x0d80, 0x0dff], [0x1000, 0x109f], [0x1200, 0x137f, 0x1380, 0x139f, 0x2d80, 0x2ddf], [0x13a0, 0x13ff], [0x1400, 0x167f], [0x1680, 0x169f], [0x16a0, 0x16ff], [0x1780, 0x17ff], [0x1800, 0x18af], [0x2800, 0x28ff], [0xa000, 0xa48f], [0x1700, 0x171f, 0x1720, 0x173f, 0x1740, 0x175f, 0x1760, 0x177f], [0x10300, 0x1032f], [0x10330, 0x1034f], [0x10400, 0x1044f], [0x1d000, 0x1d0ff, 0x1d100, 0x1d1ff, 0x1d200, 0x1d24f], [0x1d400, 0x1d7ff], [0xff000, 0xffffd], [0xfe00, 0xfe0f, 0xe0100, 0xe01ef], [0xe0000, 0xe007f], [0x1900, 0x194f], [0x1950, 0x197f], [0x1980, 0x19df], [0x1a00, 0x1a1f], [0x2c00, 0x2c5f], [0x2d30, 0x2d7f], [0x4dc0, 0x4dff], [0xa800, 0xa82f], [0x10000, 0x1007f, 0x10080, 0x100ff, 0x10100, 0x1013f], [0x10140, 0x1018f], [0x10380, 0x1039f], [0x103a0, 0x103df], [0x10450, 0x1047f], [0x10480, 0x104af], [0x10800, 0x1083f], [0x10a00, 0x10a5f], [0x1d300, 0x1d35f], [0x12000, 0x123ff, 0x12400, 0x1247f], [0x1d360, 0x1d37f], [0x1b80, 0x1bbf], [0x1c00, 0x1c4f], [0x1c50, 0x1c7f], [0xa880, 0xa8df], [0xa900, 0xa92f], [0xa930, 0xa95f], [0xaa00, 0xaa5f], [0x10190, 0x101cf], [0x101d0, 0x101ff], [0x102a0, 0x102df, 0x10280, 0x1029f, 0x10920, 0x1093f], [0x1f030, 0x1f09f, 0x1f000, 0x1f02f]];
21336function getUnicodeRangeFor(value, lastPosition = -1) {
21337	if (lastPosition !== -1) {
21338		const range = UnicodeRanges[lastPosition];
21339		for (let i = 0, ii = range.length; i < ii; i += 2) {
21340			if (value >= range[i] && value <= range[i + 1]) {
21341				return lastPosition;
21342			}
21343		}
21344	}
21345	for (let i = 0, ii = UnicodeRanges.length; i < ii; i++) {
21346		const range = UnicodeRanges[i];
21347		for (let j = 0, jj = range.length; j < jj; j += 2) {
21348			if (value >= range[j] && value <= range[j + 1]) {
21349				return i;
21350			}
21351		}
21352	}
21353	return -1;
21354}
21355const SpecialCharRegExp = new RegExp("^(\\s)|(\\p{Mn})|(\\p{Cf})$", "u");
21356const CategoryCache = new Map();
21357function getCharUnicodeCategory(char) {
21358	const cachedCategory = CategoryCache.get(char);
21359	if (cachedCategory) {
21360		return cachedCategory;
21361	}
21362	const groups = char.match(SpecialCharRegExp);
21363	const category = {
21364		isWhitespace: !!groups?.[1],
21365		isZeroWidthDiacritic: !!groups?.[2],
21366		isInvisibleFormatMark: !!groups?.[3]
21367	};
21368	CategoryCache.set(char, category);
21369	return category;
21370}
21371function clearUnicodeCaches() {
21372	CategoryCache.clear();
21373}
21374
21375;// ./src/core/fonts_utils.js
21376
21377
21378
21379
21380
21381
21382const SEAC_ANALYSIS_ENABLED = true;
21383const FontFlags = {
21384	FixedPitch: 1,
21385	Serif: 2,
21386	Symbolic: 4,
21387	Script: 8,
21388	Nonsymbolic: 32,
21389	Italic: 64,
21390	AllCap: 65536,
21391	SmallCap: 131072,
21392	ForceBold: 262144
21393};
21394const MacStandardGlyphOrdering = [".notdef", ".null", "nonmarkingreturn", "space", "exclam", "quotedbl", "numbersign", "dollar", "percent", "ampersand", "quotesingle", "parenleft", "parenright", "asterisk", "plus", "comma", "hyphen", "period", "slash", "zero", "one", "two", "three", "four", "five", "six", "seven", "eight", "nine", "colon", "semicolon", "less", "equal", "greater", "question", "at", "A", "B", "C", "D", "E", "F", "G", "H", "I", "J", "K", "L", "M", "N", "O", "P", "Q", "R", "S", "T", "U", "V", "W", "X", "Y", "Z", "bracketleft", "backslash", "bracketright", "asciicircum", "underscore", "grave", "a", "b", "c", "d", "e", "f", "g", "h", "i", "j", "k", "l", "m", "n", "o", "p", "q", "r", "s", "t", "u", "v", "w", "x", "y", "z", "braceleft", "bar", "braceright", "asciitilde", "Adieresis", "Aring", "Ccedilla", "Eacute", "Ntilde", "Odieresis", "Udieresis", "aacute", "agrave", "acircumflex", "adieresis", "atilde", "aring", "ccedilla", "eacute", "egrave", "ecircumflex", "edieresis", "iacute", "igrave", "icircumflex", "idieresis", "ntilde", "oacute", "ograve", "ocircumflex", "odieresis", "otilde", "uacute", "ugrave", "ucircumflex", "udieresis", "dagger", "degree", "cent", "sterling", "section", "bullet", "paragraph", "germandbls", "registered", "copyright", "trademark", "acute", "dieresis", "notequal", "AE", "Oslash", "infinity", "plusminus", "lessequal", "greaterequal", "yen", "mu", "partialdiff", "summation", "product", "pi", "integral", "ordfeminine", "ordmasculine", "Omega", "ae", "oslash", "questiondown", "exclamdown", "logicalnot", "radical", "florin", "approxequal", "Delta", "guillemotleft", "guillemotright", "ellipsis", "nonbreakingspace", "Agrave", "Atilde", "Otilde", "OE", "oe", "endash", "emdash", "quotedblleft", "quotedblright", "quoteleft", "quoteright", "divide", "lozenge", "ydieresis", "Ydieresis", "fraction", "currency", "guilsinglleft", "guilsinglright", "fi", "fl", "daggerdbl", "periodcentered", "quotesinglbase", "quotedblbase", "perthousand", "Acircumflex", "Ecircumflex", "Aacute", "Edieresis", "Egrave", "Iacute", "Icircumflex", "Idieresis", "Igrave", "Oacute", "Ocircumflex", "apple", "Ograve", "Uacute", "Ucircumflex", "Ugrave", "dotlessi", "circumflex", "tilde", "macron", "breve", "dotaccent", "ring", "cedilla", "hungarumlaut", "ogonek", "caron", "Lslash", "lslash", "Scaron", "scaron", "Zcaron", "zcaron", "brokenbar", "Eth", "eth", "Yacute", "yacute", "Thorn", "thorn", "minus", "multiply", "onesuperior", "twosuperior", "threesuperior", "onehalf", "onequarter", "threequarters", "franc", "Gbreve", "gbreve", "Idotaccent", "Scedilla", "scedilla", "Cacute", "cacute", "Ccaron", "ccaron", "dcroat"];
21395function recoverGlyphName(name, glyphsUnicodeMap) {
21396	if (glyphsUnicodeMap[name] !== undefined) {
21397		return name;
21398	}
21399	const unicode = getUnicodeForGlyph(name, glyphsUnicodeMap);
21400	if (unicode !== -1) {
21401		for (const key in glyphsUnicodeMap) {
21402			if (glyphsUnicodeMap[key] === unicode) {
21403				return key;
21404			}
21405		}
21406	}
21407	info("Unable to recover a standard glyph name for: " + name);
21408	return name;
21409}
21410function type1FontGlyphMapping(properties, builtInEncoding, glyphNames) {
21411	const charCodeToGlyphId = Object.create(null);
21412	let glyphId, charCode, baseEncoding;
21413	const isSymbolicFont = !!(properties.flags & FontFlags.Symbolic);
21414	if (properties.isInternalFont) {
21415		baseEncoding = builtInEncoding;
21416		for (charCode = 0; charCode < baseEncoding.length; charCode++) {
21417			glyphId = glyphNames.indexOf(baseEncoding[charCode]);
21418			charCodeToGlyphId[charCode] = glyphId >= 0 ? glyphId : 0;
21419		}
21420	} else if (properties.baseEncodingName) {
21421		baseEncoding = getEncoding(properties.baseEncodingName);
21422		for (charCode = 0; charCode < baseEncoding.length; charCode++) {
21423			glyphId = glyphNames.indexOf(baseEncoding[charCode]);
21424			charCodeToGlyphId[charCode] = glyphId >= 0 ? glyphId : 0;
21425		}
21426	} else if (isSymbolicFont) {
21427		for (charCode in builtInEncoding) {
21428			charCodeToGlyphId[charCode] = builtInEncoding[charCode];
21429		}
21430	} else {
21431		baseEncoding = StandardEncoding;
21432		for (charCode = 0; charCode < baseEncoding.length; charCode++) {
21433			glyphId = glyphNames.indexOf(baseEncoding[charCode]);
21434			charCodeToGlyphId[charCode] = glyphId >= 0 ? glyphId : 0;
21435		}
21436	}
21437	const differences = properties.differences;
21438	let glyphsUnicodeMap;
21439	if (differences) {
21440		for (charCode in differences) {
21441			const glyphName = differences[charCode];
21442			glyphId = glyphNames.indexOf(glyphName);
21443			if (glyphId === -1) {
21444				if (!glyphsUnicodeMap) {
21445					glyphsUnicodeMap = getGlyphsUnicode();
21446				}
21447				const standardGlyphName = recoverGlyphName(glyphName, glyphsUnicodeMap);
21448				if (standardGlyphName !== glyphName) {
21449					glyphId = glyphNames.indexOf(standardGlyphName);
21450				}
21451			}
21452			charCodeToGlyphId[charCode] = glyphId >= 0 ? glyphId : 0;
21453		}
21454	}
21455	return charCodeToGlyphId;
21456}
21457function normalizeFontName(name) {
21458	return name.replaceAll(/[,_]/g, "-").replaceAll(/\s/g, "");
21459}
21460const getVerticalPresentationForm = getLookupTableFactory(t => {
21461	t[0x2013] = 0xfe32;
21462	t[0x2014] = 0xfe31;
21463	t[0x2025] = 0xfe30;
21464	t[0x2026] = 0xfe19;
21465	t[0x3001] = 0xfe11;
21466	t[0x3002] = 0xfe12;
21467	t[0x3008] = 0xfe3f;
21468	t[0x3009] = 0xfe40;
21469	t[0x300a] = 0xfe3d;
21470	t[0x300b] = 0xfe3e;
21471	t[0x300c] = 0xfe41;
21472	t[0x300d] = 0xfe42;
21473	t[0x300e] = 0xfe43;
21474	t[0x300f] = 0xfe44;
21475	t[0x3010] = 0xfe3b;
21476	t[0x3011] = 0xfe3c;
21477	t[0x3014] = 0xfe39;
21478	t[0x3015] = 0xfe3a;
21479	t[0x3016] = 0xfe17;
21480	t[0x3017] = 0xfe18;
21481	t[0xfe4f] = 0xfe34;
21482	t[0xff01] = 0xfe15;
21483	t[0xff08] = 0xfe35;
21484	t[0xff09] = 0xfe36;
21485	t[0xff0c] = 0xfe10;
21486	t[0xff1a] = 0xfe13;
21487	t[0xff1b] = 0xfe14;
21488	t[0xff1f] = 0xfe16;
21489	t[0xff3b] = 0xfe47;
21490	t[0xff3d] = 0xfe48;
21491	t[0xff3f] = 0xfe33;
21492	t[0xff5b] = 0xfe37;
21493	t[0xff5d] = 0xfe38;
21494});
21495
21496;// ./src/core/standard_fonts.js
21497
21498
21499const getStdFontMap = getLookupTableFactory(function (t) {
21500	t["Times-Roman"] = "Times-Roman";
21501	t.Helvetica = "Helvetica";
21502	t.Courier = "Courier";
21503	t.Symbol = "Symbol";
21504	t["Times-Bold"] = "Times-Bold";
21505	t["Helvetica-Bold"] = "Helvetica-Bold";
21506	t["Courier-Bold"] = "Courier-Bold";
21507	t.ZapfDingbats = "ZapfDingbats";
21508	t["Times-Italic"] = "Times-Italic";
21509	t["Helvetica-Oblique"] = "Helvetica-Oblique";
21510	t["Courier-Oblique"] = "Courier-Oblique";
21511	t["Times-BoldItalic"] = "Times-BoldItalic";
21512	t["Helvetica-BoldOblique"] = "Helvetica-BoldOblique";
21513	t["Courier-BoldOblique"] = "Courier-BoldOblique";
21514	t.ArialNarrow = "Helvetica";
21515	t["ArialNarrow-Bold"] = "Helvetica-Bold";
21516	t["ArialNarrow-BoldItalic"] = "Helvetica-BoldOblique";
21517	t["ArialNarrow-Italic"] = "Helvetica-Oblique";
21518	t.ArialBlack = "Helvetica";
21519	t["ArialBlack-Bold"] = "Helvetica-Bold";
21520	t["ArialBlack-BoldItalic"] = "Helvetica-BoldOblique";
21521	t["ArialBlack-Italic"] = "Helvetica-Oblique";
21522	t["Arial-Black"] = "Helvetica";
21523	t["Arial-Black-Bold"] = "Helvetica-Bold";
21524	t["Arial-Black-BoldItalic"] = "Helvetica-BoldOblique";
21525	t["Arial-Black-Italic"] = "Helvetica-Oblique";
21526	t.Arial = "Helvetica";
21527	t["Arial-Bold"] = "Helvetica-Bold";
21528	t["Arial-BoldItalic"] = "Helvetica-BoldOblique";
21529	t["Arial-Italic"] = "Helvetica-Oblique";
21530	t.ArialMT = "Helvetica";
21531	t["Arial-BoldItalicMT"] = "Helvetica-BoldOblique";
21532	t["Arial-BoldMT"] = "Helvetica-Bold";
21533	t["Arial-ItalicMT"] = "Helvetica-Oblique";
21534	t["Arial-BoldItalicMT-BoldItalic"] = "Helvetica-BoldOblique";
21535	t["Arial-BoldMT-Bold"] = "Helvetica-Bold";
21536	t["Arial-ItalicMT-Italic"] = "Helvetica-Oblique";
21537	t.ArialUnicodeMS = "Helvetica";
21538	t["ArialUnicodeMS-Bold"] = "Helvetica-Bold";
21539	t["ArialUnicodeMS-BoldItalic"] = "Helvetica-BoldOblique";
21540	t["ArialUnicodeMS-Italic"] = "Helvetica-Oblique";
21541	t["Courier-BoldItalic"] = "Courier-BoldOblique";
21542	t["Courier-Italic"] = "Courier-Oblique";
21543	t.CourierNew = "Courier";
21544	t["CourierNew-Bold"] = "Courier-Bold";
21545	t["CourierNew-BoldItalic"] = "Courier-BoldOblique";
21546	t["CourierNew-Italic"] = "Courier-Oblique";
21547	t["CourierNewPS-BoldItalicMT"] = "Courier-BoldOblique";
21548	t["CourierNewPS-BoldMT"] = "Courier-Bold";
21549	t["CourierNewPS-ItalicMT"] = "Courier-Oblique";
21550	t.CourierNewPSMT = "Courier";
21551	t["Helvetica-BoldItalic"] = "Helvetica-BoldOblique";
21552	t["Helvetica-Italic"] = "Helvetica-Oblique";
21553	t["HelveticaLTStd-Bold"] = "Helvetica-Bold";
21554	t["Symbol-Bold"] = "Symbol";
21555	t["Symbol-BoldItalic"] = "Symbol";
21556	t["Symbol-Italic"] = "Symbol";
21557	t.TimesNewRoman = "Times-Roman";
21558	t["TimesNewRoman-Bold"] = "Times-Bold";
21559	t["TimesNewRoman-BoldItalic"] = "Times-BoldItalic";
21560	t["TimesNewRoman-Italic"] = "Times-Italic";
21561	t.TimesNewRomanPS = "Times-Roman";
21562	t["TimesNewRomanPS-Bold"] = "Times-Bold";
21563	t["TimesNewRomanPS-BoldItalic"] = "Times-BoldItalic";
21564	t["TimesNewRomanPS-BoldItalicMT"] = "Times-BoldItalic";
21565	t["TimesNewRomanPS-BoldMT"] = "Times-Bold";
21566	t["TimesNewRomanPS-Italic"] = "Times-Italic";
21567	t["TimesNewRomanPS-ItalicMT"] = "Times-Italic";
21568	t.TimesNewRomanPSMT = "Times-Roman";
21569	t["TimesNewRomanPSMT-Bold"] = "Times-Bold";
21570	t["TimesNewRomanPSMT-BoldItalic"] = "Times-BoldItalic";
21571	t["TimesNewRomanPSMT-Italic"] = "Times-Italic";
21572});
21573const getFontNameToFileMap = getLookupTableFactory(function (t) {
21574	t.Courier = "FoxitFixed.pfb";
21575	t["Courier-Bold"] = "FoxitFixedBold.pfb";
21576	t["Courier-BoldOblique"] = "FoxitFixedBoldItalic.pfb";
21577	t["Courier-Oblique"] = "FoxitFixedItalic.pfb";
21578	t.Helvetica = "LiberationSans-Regular.ttf";
21579	t["Helvetica-Bold"] = "LiberationSans-Bold.ttf";
21580	t["Helvetica-BoldOblique"] = "LiberationSans-BoldItalic.ttf";
21581	t["Helvetica-Oblique"] = "LiberationSans-Italic.ttf";
21582	t["Times-Roman"] = "FoxitSerif.pfb";
21583	t["Times-Bold"] = "FoxitSerifBold.pfb";
21584	t["Times-BoldItalic"] = "FoxitSerifBoldItalic.pfb";
21585	t["Times-Italic"] = "FoxitSerifItalic.pfb";
21586	t.Symbol = "FoxitSymbol.pfb";
21587	t.ZapfDingbats = "FoxitDingbats.pfb";
21588	t["LiberationSans-Regular"] = "LiberationSans-Regular.ttf";
21589	t["LiberationSans-Bold"] = "LiberationSans-Bold.ttf";
21590	t["LiberationSans-Italic"] = "LiberationSans-Italic.ttf";
21591	t["LiberationSans-BoldItalic"] = "LiberationSans-BoldItalic.ttf";
21592});
21593const getNonStdFontMap = getLookupTableFactory(function (t) {
21594	t.Calibri = "Helvetica";
21595	t["Calibri-Bold"] = "Helvetica-Bold";
21596	t["Calibri-BoldItalic"] = "Helvetica-BoldOblique";
21597	t["Calibri-Italic"] = "Helvetica-Oblique";
21598	t.CenturyGothic = "Helvetica";
21599	t["CenturyGothic-Bold"] = "Helvetica-Bold";
21600	t["CenturyGothic-BoldItalic"] = "Helvetica-BoldOblique";
21601	t["CenturyGothic-Italic"] = "Helvetica-Oblique";
21602	t.ComicSansMS = "Comic Sans MS";
21603	t["ComicSansMS-Bold"] = "Comic Sans MS-Bold";
21604	t["ComicSansMS-BoldItalic"] = "Comic Sans MS-BoldItalic";
21605	t["ComicSansMS-Italic"] = "Comic Sans MS-Italic";
21606	t.GillSansMT = "Helvetica";
21607	t["GillSansMT-Bold"] = "Helvetica-Bold";
21608	t["GillSansMT-BoldItalic"] = "Helvetica-BoldOblique";
21609	t["GillSansMT-Italic"] = "Helvetica-Oblique";
21610	t.Impact = "Helvetica";
21611	t["ItcSymbol-Bold"] = "Helvetica-Bold";
21612	t["ItcSymbol-BoldItalic"] = "Helvetica-BoldOblique";
21613	t["ItcSymbol-Book"] = "Helvetica";
21614	t["ItcSymbol-BookItalic"] = "Helvetica-Oblique";
21615	t["ItcSymbol-Medium"] = "Helvetica";
21616	t["ItcSymbol-MediumItalic"] = "Helvetica-Oblique";
21617	t.LucidaConsole = "Courier";
21618	t["LucidaConsole-Bold"] = "Courier-Bold";
21619	t["LucidaConsole-BoldItalic"] = "Courier-BoldOblique";
21620	t["LucidaConsole-Italic"] = "Courier-Oblique";
21621	t["LucidaSans-Demi"] = "Helvetica-Bold";
21622	t["MS-Gothic"] = "MS Gothic";
21623	t["MS-Gothic-Bold"] = "MS Gothic-Bold";
21624	t["MS-Gothic-BoldItalic"] = "MS Gothic-BoldItalic";
21625	t["MS-Gothic-Italic"] = "MS Gothic-Italic";
21626	t["MS-Mincho"] = "MS Mincho";
21627	t["MS-Mincho-Bold"] = "MS Mincho-Bold";
21628	t["MS-Mincho-BoldItalic"] = "MS Mincho-BoldItalic";
21629	t["MS-Mincho-Italic"] = "MS Mincho-Italic";
21630	t["MS-PGothic"] = "MS PGothic";
21631	t["MS-PGothic-Bold"] = "MS PGothic-Bold";
21632	t["MS-PGothic-BoldItalic"] = "MS PGothic-BoldItalic";
21633	t["MS-PGothic-Italic"] = "MS PGothic-Italic";
21634	t["MS-PMincho"] = "MS PMincho";
21635	t["MS-PMincho-Bold"] = "MS PMincho-Bold";
21636	t["MS-PMincho-BoldItalic"] = "MS PMincho-BoldItalic";
21637	t["MS-PMincho-Italic"] = "MS PMincho-Italic";
21638	t.NuptialScript = "Times-Italic";
21639	t.SegoeUISymbol = "Helvetica";
21640});
21641const getSerifFonts = getLookupTableFactory(function (t) {
21642	t["Adobe Jenson"] = true;
21643	t["Adobe Text"] = true;
21644	t.Albertus = true;
21645	t.Aldus = true;
21646	t.Alexandria = true;
21647	t.Algerian = true;
21648	t["American Typewriter"] = true;
21649	t.Antiqua = true;
21650	t.Apex = true;
21651	t.Arno = true;
21652	t.Aster = true;
21653	t.Aurora = true;
21654	t.Baskerville = true;
21655	t.Bell = true;
21656	t.Bembo = true;
21657	t["Bembo Schoolbook"] = true;
21658	t.Benguiat = true;
21659	t["Berkeley Old Style"] = true;
21660	t["Bernhard Modern"] = true;
21661	t["Berthold City"] = true;
21662	t.Bodoni = true;
21663	t["Bauer Bodoni"] = true;
21664	t["Book Antiqua"] = true;
21665	t.Bookman = true;
21666	t["Bordeaux Roman"] = true;
21667	t["Californian FB"] = true;
21668	t.Calisto = true;
21669	t.Calvert = true;
21670	t.Capitals = true;
21671	t.Cambria = true;
21672	t.Cartier = true;
21673	t.Caslon = true;
21674	t.Catull = true;
21675	t.Centaur = true;
21676	t["Century Old Style"] = true;
21677	t["Century Schoolbook"] = true;
21678	t.Chaparral = true;
21679	t["Charis SIL"] = true;
21680	t.Cheltenham = true;
21681	t["Cholla Slab"] = true;
21682	t.Clarendon = true;
21683	t.Clearface = true;
21684	t.Cochin = true;
21685	t.Colonna = true;
21686	t["Computer Modern"] = true;
21687	t["Concrete Roman"] = true;
21688	t.Constantia = true;
21689	t["Cooper Black"] = true;
21690	t.Corona = true;
21691	t.Ecotype = true;
21692	t.Egyptienne = true;
21693	t.Elephant = true;
21694	t.Excelsior = true;
21695	t.Fairfield = true;
21696	t["FF Scala"] = true;
21697	t.Folkard = true;
21698	t.Footlight = true;
21699	t.FreeSerif = true;
21700	t["Friz Quadrata"] = true;
21701	t.Garamond = true;
21702	t.Gentium = true;
21703	t.Georgia = true;
21704	t.Gloucester = true;
21705	t["Goudy Old Style"] = true;
21706	t["Goudy Schoolbook"] = true;
21707	t["Goudy Pro Font"] = true;
21708	t.Granjon = true;
21709	t["Guardian Egyptian"] = true;
21710	t.Heather = true;
21711	t.Hercules = true;
21712	t["High Tower Text"] = true;
21713	t.Hiroshige = true;
21714	t["Hoefler Text"] = true;
21715	t["Humana Serif"] = true;
21716	t.Imprint = true;
21717	t["Ionic No. 5"] = true;
21718	t.Janson = true;
21719	t.Joanna = true;
21720	t.Korinna = true;
21721	t.Lexicon = true;
21722	t.LiberationSerif = true;
21723	t["Liberation Serif"] = true;
21724	t["Linux Libertine"] = true;
21725	t.Literaturnaya = true;
21726	t.Lucida = true;
21727	t["Lucida Bright"] = true;
21728	t.Melior = true;
21729	t.Memphis = true;
21730	t.Miller = true;
21731	t.Minion = true;
21732	t.Modern = true;
21733	t["Mona Lisa"] = true;
21734	t["Mrs Eaves"] = true;
21735	t["MS Serif"] = true;
21736	t["Museo Slab"] = true;
21737	t["New York"] = true;
21738	t["Nimbus Roman"] = true;
21739	t["NPS Rawlinson Roadway"] = true;
21740	t.NuptialScript = true;
21741	t.Palatino = true;
21742	t.Perpetua = true;
21743	t.Plantin = true;
21744	t["Plantin Schoolbook"] = true;
21745	t.Playbill = true;
21746	t["Poor Richard"] = true;
21747	t["Rawlinson Roadway"] = true;
21748	t.Renault = true;
21749	t.Requiem = true;
21750	t.Rockwell = true;
21751	t.Roman = true;
21752	t["Rotis Serif"] = true;
21753	t.Sabon = true;
21754	t.Scala = true;
21755	t.Seagull = true;
21756	t.Sistina = true;
21757	t.Souvenir = true;
21758	t.STIX = true;
21759	t["Stone Informal"] = true;
21760	t["Stone Serif"] = true;
21761	t.Sylfaen = true;
21762	t.Times = true;
21763	t.Trajan = true;
21764	t["Trinité"] = true;
21765	t["Trump Mediaeval"] = true;
21766	t.Utopia = true;
21767	t["Vale Type"] = true;
21768	t["Bitstream Vera"] = true;
21769	t["Vera Serif"] = true;
21770	t.Versailles = true;
21771	t.Wanted = true;
21772	t.Weiss = true;
21773	t["Wide Latin"] = true;
21774	t.Windsor = true;
21775	t.XITS = true;
21776});
21777const getSymbolsFonts = getLookupTableFactory(function (t) {
21778	t.Dingbats = true;
21779	t.Symbol = true;
21780	t.ZapfDingbats = true;
21781	t.Wingdings = true;
21782	t["Wingdings-Bold"] = true;
21783	t["Wingdings-Regular"] = true;
21784});
21785const getGlyphMapForStandardFonts = getLookupTableFactory(function (t) {
21786	t[2] = 10;
21787	t[3] = 32;
21788	t[4] = 33;
21789	t[5] = 34;
21790	t[6] = 35;
21791	t[7] = 36;
21792	t[8] = 37;
21793	t[9] = 38;
21794	t[10] = 39;
21795	t[11] = 40;
21796	t[12] = 41;
21797	t[13] = 42;
21798	t[14] = 43;
21799	t[15] = 44;
21800	t[16] = 45;
21801	t[17] = 46;
21802	t[18] = 47;
21803	t[19] = 48;
21804	t[20] = 49;
21805	t[21] = 50;
21806	t[22] = 51;
21807	t[23] = 52;
21808	t[24] = 53;
21809	t[25] = 54;
21810	t[26] = 55;
21811	t[27] = 56;
21812	t[28] = 57;
21813	t[29] = 58;
21814	t[30] = 894;
21815	t[31] = 60;
21816	t[32] = 61;
21817	t[33] = 62;
21818	t[34] = 63;
21819	t[35] = 64;
21820	t[36] = 65;
21821	t[37] = 66;
21822	t[38] = 67;
21823	t[39] = 68;
21824	t[40] = 69;
21825	t[41] = 70;
21826	t[42] = 71;
21827	t[43] = 72;
21828	t[44] = 73;
21829	t[45] = 74;
21830	t[46] = 75;
21831	t[47] = 76;
21832	t[48] = 77;
21833	t[49] = 78;
21834	t[50] = 79;
21835	t[51] = 80;
21836	t[52] = 81;
21837	t[53] = 82;
21838	t[54] = 83;
21839	t[55] = 84;
21840	t[56] = 85;
21841	t[57] = 86;
21842	t[58] = 87;
21843	t[59] = 88;
21844	t[60] = 89;
21845	t[61] = 90;
21846	t[62] = 91;
21847	t[63] = 92;
21848	t[64] = 93;
21849	t[65] = 94;
21850	t[66] = 95;
21851	t[67] = 96;
21852	t[68] = 97;
21853	t[69] = 98;
21854	t[70] = 99;
21855	t[71] = 100;
21856	t[72] = 101;
21857	t[73] = 102;
21858	t[74] = 103;
21859	t[75] = 104;
21860	t[76] = 105;
21861	t[77] = 106;
21862	t[78] = 107;
21863	t[79] = 108;
21864	t[80] = 109;
21865	t[81] = 110;
21866	t[82] = 111;
21867	t[83] = 112;
21868	t[84] = 113;
21869	t[85] = 114;
21870	t[86] = 115;
21871	t[87] = 116;
21872	t[88] = 117;
21873	t[89] = 118;
21874	t[90] = 119;
21875	t[91] = 120;
21876	t[92] = 121;
21877	t[93] = 122;
21878	t[94] = 123;
21879	t[95] = 124;
21880	t[96] = 125;
21881	t[97] = 126;
21882	t[98] = 196;
21883	t[99] = 197;
21884	t[100] = 199;
21885	t[101] = 201;
21886	t[102] = 209;
21887	t[103] = 214;
21888	t[104] = 220;
21889	t[105] = 225;
21890	t[106] = 224;
21891	t[107] = 226;
21892	t[108] = 228;
21893	t[109] = 227;
21894	t[110] = 229;
21895	t[111] = 231;
21896	t[112] = 233;
21897	t[113] = 232;
21898	t[114] = 234;
21899	t[115] = 235;
21900	t[116] = 237;
21901	t[117] = 236;
21902	t[118] = 238;
21903	t[119] = 239;
21904	t[120] = 241;
21905	t[121] = 243;
21906	t[122] = 242;
21907	t[123] = 244;
21908	t[124] = 246;
21909	t[125] = 245;
21910	t[126] = 250;
21911	t[127] = 249;
21912	t[128] = 251;
21913	t[129] = 252;
21914	t[130] = 8224;
21915	t[131] = 176;
21916	t[132] = 162;
21917	t[133] = 163;
21918	t[134] = 167;
21919	t[135] = 8226;
21920	t[136] = 182;
21921	t[137] = 223;
21922	t[138] = 174;
21923	t[139] = 169;
21924	t[140] = 8482;
21925	t[141] = 180;
21926	t[142] = 168;
21927	t[143] = 8800;
21928	t[144] = 198;
21929	t[145] = 216;
21930	t[146] = 8734;
21931	t[147] = 177;
21932	t[148] = 8804;
21933	t[149] = 8805;
21934	t[150] = 165;
21935	t[151] = 181;
21936	t[152] = 8706;
21937	t[153] = 8721;
21938	t[154] = 8719;
21939	t[156] = 8747;
21940	t[157] = 170;
21941	t[158] = 186;
21942	t[159] = 8486;
21943	t[160] = 230;
21944	t[161] = 248;
21945	t[162] = 191;
21946	t[163] = 161;
21947	t[164] = 172;
21948	t[165] = 8730;
21949	t[166] = 402;
21950	t[167] = 8776;
21951	t[168] = 8710;
21952	t[169] = 171;
21953	t[170] = 187;
21954	t[171] = 8230;
21955	t[179] = 8220;
21956	t[180] = 8221;
21957	t[181] = 8216;
21958	t[182] = 8217;
21959	t[200] = 193;
21960	t[203] = 205;
21961	t[207] = 211;
21962	t[210] = 218;
21963	t[223] = 711;
21964	t[224] = 321;
21965	t[225] = 322;
21966	t[226] = 352;
21967	t[227] = 353;
21968	t[228] = 381;
21969	t[229] = 382;
21970	t[233] = 221;
21971	t[234] = 253;
21972	t[252] = 263;
21973	t[253] = 268;
21974	t[254] = 269;
21975	t[258] = 258;
21976	t[260] = 260;
21977	t[261] = 261;
21978	t[265] = 280;
21979	t[266] = 281;
21980	t[267] = 282;
21981	t[268] = 283;
21982	t[269] = 313;
21983	t[275] = 323;
21984	t[276] = 324;
21985	t[278] = 328;
21986	t[283] = 344;
21987	t[284] = 345;
21988	t[285] = 346;
21989	t[286] = 347;
21990	t[292] = 367;
21991	t[295] = 377;
21992	t[296] = 378;
21993	t[298] = 380;
21994	t[305] = 963;
21995	t[306] = 964;
21996	t[307] = 966;
21997	t[308] = 8215;
21998	t[309] = 8252;
21999	t[310] = 8319;
22000	t[311] = 8359;
22001	t[312] = 8592;
22002	t[313] = 8593;
22003	t[337] = 9552;
22004	t[493] = 1039;
22005	t[494] = 1040;
22006	t[672] = 1488;
22007	t[673] = 1489;
22008	t[674] = 1490;
22009	t[675] = 1491;
22010	t[676] = 1492;
22011	t[677] = 1493;
22012	t[678] = 1494;
22013	t[679] = 1495;
22014	t[680] = 1496;
22015	t[681] = 1497;
22016	t[682] = 1498;
22017	t[683] = 1499;
22018	t[684] = 1500;
22019	t[685] = 1501;
22020	t[686] = 1502;
22021	t[687] = 1503;
22022	t[688] = 1504;
22023	t[689] = 1505;
22024	t[690] = 1506;
22025	t[691] = 1507;
22026	t[692] = 1508;
22027	t[693] = 1509;
22028	t[694] = 1510;
22029	t[695] = 1511;
22030	t[696] = 1512;
22031	t[697] = 1513;
22032	t[698] = 1514;
22033	t[705] = 1524;
22034	t[706] = 8362;
22035	t[710] = 64288;
22036	t[711] = 64298;
22037	t[759] = 1617;
22038	t[761] = 1776;
22039	t[763] = 1778;
22040	t[775] = 1652;
22041	t[777] = 1764;
22042	t[778] = 1780;
22043	t[779] = 1781;
22044	t[780] = 1782;
22045	t[782] = 771;
22046	t[783] = 64726;
22047	t[786] = 8363;
22048	t[788] = 8532;
22049	t[790] = 768;
22050	t[791] = 769;
22051	t[792] = 768;
22052	t[795] = 803;
22053	t[797] = 64336;
22054	t[798] = 64337;
22055	t[799] = 64342;
22056	t[800] = 64343;
22057	t[801] = 64344;
22058	t[802] = 64345;
22059	t[803] = 64362;
22060	t[804] = 64363;
22061	t[805] = 64364;
22062	t[2424] = 7821;
22063	t[2425] = 7822;
22064	t[2426] = 7823;
22065	t[2427] = 7824;
22066	t[2428] = 7825;
22067	t[2429] = 7826;
22068	t[2430] = 7827;
22069	t[2433] = 7682;
22070	t[2678] = 8045;
22071	t[2679] = 8046;
22072	t[2830] = 1552;
22073	t[2838] = 686;
22074	t[2840] = 751;
22075	t[2842] = 753;
22076	t[2843] = 754;
22077	t[2844] = 755;
22078	t[2846] = 757;
22079	t[2856] = 767;
22080	t[2857] = 848;
22081	t[2858] = 849;
22082	t[2862] = 853;
22083	t[2863] = 854;
22084	t[2864] = 855;
22085	t[2865] = 861;
22086	t[2866] = 862;
22087	t[2906] = 7460;
22088	t[2908] = 7462;
22089	t[2909] = 7463;
22090	t[2910] = 7464;
22091	t[2912] = 7466;
22092	t[2913] = 7467;
22093	t[2914] = 7468;
22094	t[2916] = 7470;
22095	t[2917] = 7471;
22096	t[2918] = 7472;
22097	t[2920] = 7474;
22098	t[2921] = 7475;
22099	t[2922] = 7476;
22100	t[2924] = 7478;
22101	t[2925] = 7479;
22102	t[2926] = 7480;
22103	t[2928] = 7482;
vendor: 17,224 bytes, lines 22104-22906
22104	t[2929] = 7483;
22105	t[2930] = 7484;
22106	t[2932] = 7486;
22107	t[2933] = 7487;
22108	t[2934] = 7488;
22109	t[2936] = 7490;
22110	t[2937] = 7491;
22111	t[2938] = 7492;
22112	t[2940] = 7494;
22113	t[2941] = 7495;
22114	t[2942] = 7496;
22115	t[2944] = 7498;
22116	t[2946] = 7500;
22117	t[2948] = 7502;
22118	t[2950] = 7504;
22119	t[2951] = 7505;
22120	t[2952] = 7506;
22121	t[2954] = 7508;
22122	t[2955] = 7509;
22123	t[2956] = 7510;
22124	t[2958] = 7512;
22125	t[2959] = 7513;
22126	t[2960] = 7514;
22127	t[2962] = 7516;
22128	t[2963] = 7517;
22129	t[2964] = 7518;
22130	t[2966] = 7520;
22131	t[2967] = 7521;
22132	t[2968] = 7522;
22133	t[2970] = 7524;
22134	t[2971] = 7525;
22135	t[2972] = 7526;
22136	t[2974] = 7528;
22137	t[2975] = 7529;
22138	t[2976] = 7530;
22139	t[2978] = 1537;
22140	t[2979] = 1538;
22141	t[2980] = 1539;
22142	t[2982] = 1549;
22143	t[2983] = 1551;
22144	t[2984] = 1552;
22145	t[2986] = 1554;
22146	t[2987] = 1555;
22147	t[2988] = 1556;
22148	t[2990] = 1623;
22149	t[2991] = 1624;
22150	t[2995] = 1775;
22151	t[2999] = 1791;
22152	t[3002] = 64290;
22153	t[3003] = 64291;
22154	t[3004] = 64292;
22155	t[3006] = 64294;
22156	t[3007] = 64295;
22157	t[3008] = 64296;
22158	t[3011] = 1900;
22159	t[3014] = 8223;
22160	t[3015] = 8244;
22161	t[3017] = 7532;
22162	t[3018] = 7533;
22163	t[3019] = 7534;
22164	t[3075] = 7590;
22165	t[3076] = 7591;
22166	t[3079] = 7594;
22167	t[3080] = 7595;
22168	t[3083] = 7598;
22169	t[3084] = 7599;
22170	t[3087] = 7602;
22171	t[3088] = 7603;
22172	t[3091] = 7606;
22173	t[3092] = 7607;
22174	t[3095] = 7610;
22175	t[3096] = 7611;
22176	t[3099] = 7614;
22177	t[3100] = 7615;
22178	t[3103] = 7618;
22179	t[3104] = 7619;
22180	t[3107] = 8337;
22181	t[3108] = 8338;
22182	t[3116] = 1884;
22183	t[3119] = 1885;
22184	t[3120] = 1885;
22185	t[3123] = 1886;
22186	t[3124] = 1886;
22187	t[3127] = 1887;
22188	t[3128] = 1887;
22189	t[3131] = 1888;
22190	t[3132] = 1888;
22191	t[3135] = 1889;
22192	t[3136] = 1889;
22193	t[3139] = 1890;
22194	t[3140] = 1890;
22195	t[3143] = 1891;
22196	t[3144] = 1891;
22197	t[3147] = 1892;
22198	t[3148] = 1892;
22199	t[3153] = 580;
22200	t[3154] = 581;
22201	t[3157] = 584;
22202	t[3158] = 585;
22203	t[3161] = 588;
22204	t[3162] = 589;
22205	t[3165] = 891;
22206	t[3166] = 892;
22207	t[3169] = 1274;
22208	t[3170] = 1275;
22209	t[3173] = 1278;
22210	t[3174] = 1279;
22211	t[3181] = 7622;
22212	t[3182] = 7623;
22213	t[3282] = 11799;
22214	t[3316] = 578;
22215	t[3379] = 42785;
22216	t[3393] = 1159;
22217	t[3416] = 8377;
22218});
22219const getSupplementalGlyphMapForArialBlack = getLookupTableFactory(function (t) {
22220	t[227] = 322;
22221	t[264] = 261;
22222	t[291] = 346;
22223});
22224const getSupplementalGlyphMapForCalibri = getLookupTableFactory(function (t) {
22225	t[1] = 32;
22226	t[4] = 65;
22227	t[5] = 192;
22228	t[6] = 193;
22229	t[9] = 196;
22230	t[17] = 66;
22231	t[18] = 67;
22232	t[21] = 268;
22233	t[24] = 68;
22234	t[28] = 69;
22235	t[29] = 200;
22236	t[30] = 201;
22237	t[32] = 282;
22238	t[38] = 70;
22239	t[39] = 71;
22240	t[44] = 72;
22241	t[47] = 73;
22242	t[48] = 204;
22243	t[49] = 205;
22244	t[58] = 74;
22245	t[60] = 75;
22246	t[62] = 76;
22247	t[68] = 77;
22248	t[69] = 78;
22249	t[75] = 79;
22250	t[76] = 210;
22251	t[80] = 214;
22252	t[87] = 80;
22253	t[89] = 81;
22254	t[90] = 82;
22255	t[92] = 344;
22256	t[94] = 83;
22257	t[97] = 352;
22258	t[100] = 84;
22259	t[104] = 85;
22260	t[109] = 220;
22261	t[115] = 86;
22262	t[116] = 87;
22263	t[121] = 88;
22264	t[122] = 89;
22265	t[124] = 221;
22266	t[127] = 90;
22267	t[129] = 381;
22268	t[258] = 97;
22269	t[259] = 224;
22270	t[260] = 225;
22271	t[263] = 228;
22272	t[268] = 261;
22273	t[271] = 98;
22274	t[272] = 99;
22275	t[273] = 263;
22276	t[275] = 269;
22277	t[282] = 100;
22278	t[286] = 101;
22279	t[287] = 232;
22280	t[288] = 233;
22281	t[290] = 283;
22282	t[295] = 281;
22283	t[296] = 102;
22284	t[336] = 103;
22285	t[346] = 104;
22286	t[349] = 105;
22287	t[350] = 236;
22288	t[351] = 237;
22289	t[361] = 106;
22290	t[364] = 107;
22291	t[367] = 108;
22292	t[371] = 322;
22293	t[373] = 109;
22294	t[374] = 110;
22295	t[381] = 111;
22296	t[382] = 242;
22297	t[383] = 243;
22298	t[386] = 246;
22299	t[393] = 112;
22300	t[395] = 113;
22301	t[396] = 114;
22302	t[398] = 345;
22303	t[400] = 115;
22304	t[401] = 347;
22305	t[403] = 353;
22306	t[410] = 116;
22307	t[437] = 117;
22308	t[442] = 252;
22309	t[448] = 118;
22310	t[449] = 119;
22311	t[454] = 120;
22312	t[455] = 121;
22313	t[457] = 253;
22314	t[460] = 122;
22315	t[462] = 382;
22316	t[463] = 380;
22317	t[853] = 44;
22318	t[855] = 58;
22319	t[856] = 46;
22320	t[876] = 47;
22321	t[878] = 45;
22322	t[882] = 45;
22323	t[894] = 40;
22324	t[895] = 41;
22325	t[896] = 91;
22326	t[897] = 93;
22327	t[923] = 64;
22328	t[1004] = 48;
22329	t[1005] = 49;
22330	t[1006] = 50;
22331	t[1007] = 51;
22332	t[1008] = 52;
22333	t[1009] = 53;
22334	t[1010] = 54;
22335	t[1011] = 55;
22336	t[1012] = 56;
22337	t[1013] = 57;
22338	t[1081] = 37;
22339	t[1085] = 43;
22340	t[1086] = 45;
22341});
22342function getStandardFontName(name) {
22343	const fontName = normalizeFontName(name);
22344	const stdFontMap = getStdFontMap();
22345	return stdFontMap[fontName];
22346}
22347function isKnownFontName(name) {
22348	const fontName = normalizeFontName(name);
22349	return !!(getStdFontMap()[fontName] || getNonStdFontMap()[fontName] || getSerifFonts()[fontName] || getSymbolsFonts()[fontName]);
22350}
22351
22352;// ./src/core/to_unicode_map.js
22353
22354class ToUnicodeMap {
22355	constructor(cmap = []) {
22356		this._map = cmap;
22357	}
22358	get length() {
22359		return this._map.length;
22360	}
22361	forEach(callback) {
22362		for (const charCode in this._map) {
22363			callback(charCode, this._map[charCode].codePointAt(0));
22364		}
22365	}
22366	has(i) {
22367		return this._map[i] !== undefined;
22368	}
22369	get(i) {
22370		return this._map[i];
22371	}
22372	charCodeOf(value) {
22373		const map = this._map;
22374		if (map.length <= 0x10000) {
22375			return map.indexOf(value);
22376		}
22377		for (const charCode in map) {
22378			if (map[charCode] === value) {
22379				return charCode | 0;
22380			}
22381		}
22382		return -1;
22383	}
22384	amend(map) {
22385		for (const charCode in map) {
22386			this._map[charCode] = map[charCode];
22387		}
22388	}
22389}
22390class IdentityToUnicodeMap {
22391	constructor(firstChar, lastChar) {
22392		this.firstChar = firstChar;
22393		this.lastChar = lastChar;
22394	}
22395	get length() {
22396		return this.lastChar + 1 - this.firstChar;
22397	}
22398	forEach(callback) {
22399		for (let i = this.firstChar, ii = this.lastChar; i <= ii; i++) {
22400			callback(i, i);
22401		}
22402	}
22403	has(i) {
22404		return this.firstChar <= i && i <= this.lastChar;
22405	}
22406	get(i) {
22407		if (this.firstChar <= i && i <= this.lastChar) {
22408			return String.fromCharCode(i);
22409		}
22410		return undefined;
22411	}
22412	charCodeOf(v) {
22413		return Number.isInteger(v) && v >= this.firstChar && v <= this.lastChar ? v : -1;
22414	}
22415	amend(map) {
22416		unreachable("Should not call amend()");
22417	}
22418}
22419
22420;// ./src/core/cff_font.js
22421
22422
22423
22424class CFFFont {
22425	constructor(file, properties) {
22426		this.properties = properties;
22427		const parser = new CFFParser(file, properties, SEAC_ANALYSIS_ENABLED);
22428		this.cff = parser.parse();
22429		this.cff.duplicateFirstGlyph();
22430		const compiler = new CFFCompiler(this.cff);
22431		this.seacs = this.cff.seacs;
22432		try {
22433			this.data = compiler.compile();
22434		} catch {
22435			warn("Failed to compile font " + properties.loadedName);
22436			this.data = file;
22437		}
22438		this._createBuiltInEncoding();
22439	}
22440	get numGlyphs() {
22441		return this.cff.charStrings.count;
22442	}
22443	getCharset() {
22444		return this.cff.charset.charset;
22445	}
22446	getGlyphMapping() {
22447		const cff = this.cff;
22448		const properties = this.properties;
22449		const {
22450			cidToGidMap,
22451			cMap
22452		} = properties;
22453		const charsets = cff.charset.charset;
22454		let charCodeToGlyphId;
22455		let glyphId;
22456		if (properties.composite) {
22457			let invCidToGidMap;
22458			if (cidToGidMap?.length > 0) {
22459				invCidToGidMap = Object.create(null);
22460				for (let i = 0, ii = cidToGidMap.length; i < ii; i++) {
22461					const gid = cidToGidMap[i];
22462					if (gid !== undefined) {
22463						invCidToGidMap[gid] = i;
22464					}
22465				}
22466			}
22467			charCodeToGlyphId = Object.create(null);
22468			let charCode;
22469			if (cff.isCIDFont) {
22470				for (glyphId = 0; glyphId < charsets.length; glyphId++) {
22471					const cid = charsets[glyphId];
22472					charCode = cMap.charCodeOf(cid);
22473					if (invCidToGidMap?.[charCode] !== undefined) {
22474						charCode = invCidToGidMap[charCode];
22475					}
22476					charCodeToGlyphId[charCode] = glyphId;
22477				}
22478			} else {
22479				for (glyphId = 0; glyphId < cff.charStrings.count; glyphId++) {
22480					charCode = cMap.charCodeOf(glyphId);
22481					charCodeToGlyphId[charCode] = glyphId;
22482				}
22483			}
22484			return charCodeToGlyphId;
22485		}
22486		let encoding = cff.encoding ? cff.encoding.encoding : null;
22487		if (properties.isInternalFont) {
22488			encoding = properties.defaultEncoding;
22489		}
22490		charCodeToGlyphId = type1FontGlyphMapping(properties, encoding, charsets);
22491		return charCodeToGlyphId;
22492	}
22493	hasGlyphId(id) {
22494		return this.cff.hasGlyphId(id);
22495	}
22496	_createBuiltInEncoding() {
22497		const {
22498			charset,
22499			encoding
22500		} = this.cff;
22501		if (!charset || !encoding) {
22502			return;
22503		}
22504		const charsets = charset.charset,
22505			encodings = encoding.encoding;
22506		const map = [];
22507		for (const charCode in encodings) {
22508			const glyphId = encodings[charCode];
22509			if (glyphId >= 0) {
22510				const glyphName = charsets[glyphId];
22511				if (glyphName) {
22512					map[charCode] = glyphName;
22513				}
22514			}
22515		}
22516		if (map.length > 0) {
22517			this.properties.builtInEncoding = map;
22518		}
22519	}
22520}
22521
22522;// ./src/core/font_renderer.js
22523
22524
22525
22526
22527
22528
22529
22530
22531
22532
22533
22534
22535
22536
22537function getUint32(data, offset) {
22538	return (data[offset] << 24 | data[offset + 1] << 16 | data[offset + 2] << 8 | data[offset + 3]) >>> 0;
22539}
22540function getUint16(data, offset) {
22541	return data[offset] << 8 | data[offset + 1];
22542}
22543function getInt16(data, offset) {
22544	return (data[offset] << 24 | data[offset + 1] << 16) >> 16;
22545}
22546function getInt8(data, offset) {
22547	return data[offset] << 24 >> 24;
22548}
22549function getFloat214(data, offset) {
22550	return getInt16(data, offset) / 16384;
22551}
22552function getSubroutineBias(subrs) {
22553	const numSubrs = subrs.length;
22554	let bias = 32768;
22555	if (numSubrs < 1240) {
22556		bias = 107;
22557	} else if (numSubrs < 33900) {
22558		bias = 1131;
22559	}
22560	return bias;
22561}
22562function parseCmap(data, start, end) {
22563	const offset = getUint16(data, start + 2) === 1 ? getUint32(data, start + 8) : getUint32(data, start + 16);
22564	const format = getUint16(data, start + offset);
22565	let ranges, p, i;
22566	if (format === 4) {
22567		getUint16(data, start + offset + 2);
22568		const segCount = getUint16(data, start + offset + 6) >> 1;
22569		p = start + offset + 14;
22570		ranges = [];
22571		for (i = 0; i < segCount; i++, p += 2) {
22572			ranges[i] = {
22573				end: getUint16(data, p)
22574			};
22575		}
22576		p += 2;
22577		for (i = 0; i < segCount; i++, p += 2) {
22578			ranges[i].start = getUint16(data, p);
22579		}
22580		for (i = 0; i < segCount; i++, p += 2) {
22581			ranges[i].idDelta = getUint16(data, p);
22582		}
22583		for (i = 0; i < segCount; i++, p += 2) {
22584			let idOffset = getUint16(data, p);
22585			if (idOffset === 0) {
22586				continue;
22587			}
22588			ranges[i].ids = [];
22589			for (let j = 0, jj = ranges[i].end - ranges[i].start + 1; j < jj; j++) {
22590				ranges[i].ids[j] = getUint16(data, p + idOffset);
22591				idOffset += 2;
22592			}
22593		}
22594		return ranges;
22595	} else if (format === 12) {
22596		const groups = getUint32(data, start + offset + 12);
22597		p = start + offset + 16;
22598		ranges = [];
22599		for (i = 0; i < groups; i++) {
22600			start = getUint32(data, p);
22601			ranges.push({
22602				start,
22603				end: getUint32(data, p + 4),
22604				idDelta: getUint32(data, p + 8) - start
22605			});
22606			p += 12;
22607		}
22608		return ranges;
22609	}
22610	throw new FormatError(`unsupported cmap: ${format}`);
22611}
22612function parseCff(data, start, end, seacAnalysisEnabled) {
22613	const properties = {};
22614	const parser = new CFFParser(new Stream(data, start, end - start), properties, seacAnalysisEnabled);
22615	const cff = parser.parse();
22616	return {
22617		glyphs: cff.charStrings.objects,
22618		subrs: cff.topDict.privateDict?.subrsIndex?.objects,
22619		gsubrs: cff.globalSubrIndex?.objects,
22620		isCFFCIDFont: cff.isCIDFont,
22621		fdSelect: cff.fdSelect,
22622		fdArray: cff.fdArray
22623	};
22624}
22625function parseGlyfTable(glyf, loca, isGlyphLocationsLong) {
22626	let itemSize, itemDecode;
22627	if (isGlyphLocationsLong) {
22628		itemSize = 4;
22629		itemDecode = getUint32;
22630	} else {
22631		itemSize = 2;
22632		itemDecode = (data, offset) => 2 * getUint16(data, offset);
22633	}
22634	const glyphs = [];
22635	let startOffset = itemDecode(loca, 0);
22636	for (let j = itemSize; j < loca.length; j += itemSize) {
22637		const endOffset = itemDecode(loca, j);
22638		glyphs.push(glyf.subarray(startOffset, endOffset));
22639		startOffset = endOffset;
22640	}
22641	return glyphs;
22642}
22643function lookupCmap(ranges, unicode) {
22644	const code = unicode.codePointAt(0);
22645	let gid = 0,
22646		l = 0,
22647		r = ranges.length - 1;
22648	while (l < r) {
22649		const c = l + r + 1 >> 1;
22650		if (code < ranges[c].start) {
22651			r = c - 1;
22652		} else {
22653			l = c;
22654		}
22655	}
22656	if (ranges[l].start <= code && code <= ranges[l].end) {
22657		gid = ranges[l].idDelta + (ranges[l].ids ? ranges[l].ids[code - ranges[l].start] : code) & 0xffff;
22658	}
22659	return {
22660		charCode: code,
22661		glyphId: gid
22662	};
22663}
22664function compileGlyf(code, cmds, font) {
22665	function moveTo(x, y) {
22666		cmds.add("M", [x, y]);
22667	}
22668	function lineTo(x, y) {
22669		cmds.add("L", [x, y]);
22670	}
22671	function quadraticCurveTo(xa, ya, x, y) {
22672		cmds.add("Q", [xa, ya, x, y]);
22673	}
22674	let i = 0;
22675	const numberOfContours = getInt16(code, i);
22676	let flags;
22677	let x = 0,
22678		y = 0;
22679	i += 10;
22680	if (numberOfContours < 0) {
22681		do {
22682			flags = getUint16(code, i);
22683			const glyphIndex = getUint16(code, i + 2);
22684			i += 4;
22685			let arg1, arg2;
22686			if (flags & 0x01) {
22687				if (flags & 0x02) {
22688					arg1 = getInt16(code, i);
22689					arg2 = getInt16(code, i + 2);
22690				} else {
22691					arg1 = getUint16(code, i);
22692					arg2 = getUint16(code, i + 2);
22693				}
22694				i += 4;
22695			} else if (flags & 0x02) {
22696				arg1 = getInt8(code, i++);
22697				arg2 = getInt8(code, i++);
22698			} else {
22699				arg1 = code[i++];
22700				arg2 = code[i++];
22701			}
22702			if (flags & 0x02) {
22703				x = arg1;
22704				y = arg2;
22705			} else {
22706				x = 0;
22707				y = 0;
22708			}
22709			let scaleX = 1,
22710				scaleY = 1,
22711				scale01 = 0,
22712				scale10 = 0;
22713			if (flags & 0x08) {
22714				scaleX = scaleY = getFloat214(code, i);
22715				i += 2;
22716			} else if (flags & 0x40) {
22717				scaleX = getFloat214(code, i);
22718				scaleY = getFloat214(code, i + 2);
22719				i += 4;
22720			} else if (flags & 0x80) {
22721				scaleX = getFloat214(code, i);
22722				scale01 = getFloat214(code, i + 2);
22723				scale10 = getFloat214(code, i + 4);
22724				scaleY = getFloat214(code, i + 6);
22725				i += 8;
22726			}
22727			const subglyph = font.glyphs[glyphIndex];
22728			if (subglyph) {
22729				cmds.save();
22730				cmds.transform([scaleX, scale01, scale10, scaleY, x, y]);
22731				if (!(flags & 0x02)) {}
22732				compileGlyf(subglyph, cmds, font);
22733				cmds.restore();
22734			}
22735		} while (flags & 0x20);
22736	} else {
22737		const endPtsOfContours = [];
22738		let j, jj;
22739		for (j = 0; j < numberOfContours; j++) {
22740			endPtsOfContours.push(getUint16(code, i));
22741			i += 2;
22742		}
22743		const instructionLength = getUint16(code, i);
22744		i += 2 + instructionLength;
22745		const numberOfPoints = endPtsOfContours.at(-1) + 1;
22746		const points = [];
22747		while (points.length < numberOfPoints) {
22748			flags = code[i++];
22749			let repeat = 1;
22750			if (flags & 0x08) {
22751				repeat += code[i++];
22752			}
22753			while (repeat-- > 0) {
22754				points.push({
22755					flags
22756				});
22757			}
22758		}
22759		for (j = 0; j < numberOfPoints; j++) {
22760			switch (points[j].flags & 0x12) {
22761				case 0x00:
22762					x += getInt16(code, i);
22763					i += 2;
22764					break;
22765				case 0x02:
22766					x -= code[i++];
22767					break;
22768				case 0x12:
22769					x += code[i++];
22770					break;
22771			}
22772			points[j].x = x;
22773		}
22774		for (j = 0; j < numberOfPoints; j++) {
22775			switch (points[j].flags & 0x24) {
22776				case 0x00:
22777					y += getInt16(code, i);
22778					i += 2;
22779					break;
22780				case 0x04:
22781					y -= code[i++];
22782					break;
22783				case 0x24:
22784					y += code[i++];
22785					break;
22786			}
22787			points[j].y = y;
22788		}
22789		let startPoint = 0;
22790		for (i = 0; i < numberOfContours; i++) {
22791			const endPoint = endPtsOfContours[i];
22792			const contour = points.slice(startPoint, endPoint + 1);
22793			if (contour[0].flags & 1) {
22794				contour.push(contour[0]);
22795			} else if (contour.at(-1).flags & 1) {
22796				contour.unshift(contour.at(-1));
22797			} else {
22798				const p = {
22799					flags: 1,
22800					x: (contour[0].x + contour.at(-1).x) / 2,
22801					y: (contour[0].y + contour.at(-1).y) / 2
22802				};
22803				contour.unshift(p);
22804				contour.push(p);
22805			}
22806			moveTo(contour[0].x, contour[0].y);
22807			for (j = 1, jj = contour.length; j < jj; j++) {
22808				if (contour[j].flags & 1) {
22809					lineTo(contour[j].x, contour[j].y);
22810				} else if (contour[j + 1].flags & 1) {
22811					quadraticCurveTo(contour[j].x, contour[j].y, contour[j + 1].x, contour[j + 1].y);
22812					j++;
22813				} else {
22814					quadraticCurveTo(contour[j].x, contour[j].y, (contour[j].x + contour[j + 1].x) / 2, (contour[j].y + contour[j + 1].y) / 2);
22815				}
22816			}
22817			startPoint = endPoint + 1;
22818		}
22819	}
22820}
22821function compileCharString(charStringCode, cmds, font, glyphId) {
22822	function moveTo(x, y) {
22823		cmds.add("M", [x, y]);
22824	}
22825	function lineTo(x, y) {
22826		cmds.add("L", [x, y]);
22827	}
22828	function bezierCurveTo(x1, y1, x2, y2, x, y) {
22829		cmds.add("C", [x1, y1, x2, y2, x, y]);
22830	}
22831	const stack = [];
22832	let x = 0,
22833		y = 0;
22834	let stems = 0;
22835	function parse(code) {
22836		let i = 0;
22837		while (i < code.length) {
22838			let stackClean = false;
22839			let v = code[i++];
22840			let xa, xb, ya, yb, y1, y2, y3, n, subrCode;
22841			switch (v) {
22842				case 1:
22843					stems += stack.length >> 1;
22844					stackClean = true;
22845					break;
22846				case 3:
22847					stems += stack.length >> 1;
22848					stackClean = true;
22849					break;
22850				case 4:
22851					y += stack.pop();
22852					moveTo(x, y);
22853					stackClean = true;
22854					break;
22855				case 5:
22856					while (stack.length > 0) {
22857						x += stack.shift();
22858						y += stack.shift();
22859						lineTo(x, y);
22860					}
22861					break;
22862				case 6:
22863					while (stack.length > 0) {
22864						x += stack.shift();
22865						lineTo(x, y);
22866						if (stack.length === 0) {
22867							break;
22868						}
22869						y += stack.shift();
22870						lineTo(x, y);
22871					}
22872					break;
22873				case 7:
22874					while (stack.length > 0) {
22875						y += stack.shift();
22876						lineTo(x, y);
22877						if (stack.length === 0) {
22878							break;
22879						}
22880						x += stack.shift();
22881						lineTo(x, y);
22882					}
22883					break;
22884				case 8:
22885					while (stack.length > 0) {
22886						xa = x + stack.shift();
22887						ya = y + stack.shift();
22888						xb = xa + stack.shift();
22889						yb = ya + stack.shift();
22890						x = xb + stack.shift();
22891						y = yb + stack.shift();
22892						bezierCurveTo(xa, ya, xb, yb, x, y);
22893					}
22894					break;
22895				case 10:
22896					n = stack.pop();
22897					subrCode = null;
22898					if (font.isCFFCIDFont) {
22899						const fdIndex = font.fdSelect.getFDIndex(glyphId);
22900						if (fdIndex >= 0 && fdIndex < font.fdArray.length) {
22901							const fontDict = font.fdArray[fdIndex];
22902							let subrs;
22903							if (fontDict.privateDict?.subrsIndex) {
22904								subrs = fontDict.privateDict.subrsIndex.objects;
22905							}
22906							if (subrs) {
vendor: 6,546 bytes, lines 22907-23154
22907								n += getSubroutineBias(subrs);
22908								subrCode = subrs[n];
22909							}
22910						} else {
22911							warn("Invalid fd index for glyph index.");
22912						}
22913					} else {
22914						subrCode = font.subrs[n + font.subrsBias];
22915					}
22916					if (subrCode) {
22917						parse(subrCode);
22918					}
22919					break;
22920				case 11:
22921					return;
22922				case 12:
22923					v = code[i++];
22924					switch (v) {
22925						case 34:
22926							xa = x + stack.shift();
22927							xb = xa + stack.shift();
22928							y1 = y + stack.shift();
22929							x = xb + stack.shift();
22930							bezierCurveTo(xa, y, xb, y1, x, y1);
22931							xa = x + stack.shift();
22932							xb = xa + stack.shift();
22933							x = xb + stack.shift();
22934							bezierCurveTo(xa, y1, xb, y, x, y);
22935							break;
22936						case 35:
22937							xa = x + stack.shift();
22938							ya = y + stack.shift();
22939							xb = xa + stack.shift();
22940							yb = ya + stack.shift();
22941							x = xb + stack.shift();
22942							y = yb + stack.shift();
22943							bezierCurveTo(xa, ya, xb, yb, x, y);
22944							xa = x + stack.shift();
22945							ya = y + stack.shift();
22946							xb = xa + stack.shift();
22947							yb = ya + stack.shift();
22948							x = xb + stack.shift();
22949							y = yb + stack.shift();
22950							bezierCurveTo(xa, ya, xb, yb, x, y);
22951							stack.pop();
22952							break;
22953						case 36:
22954							xa = x + stack.shift();
22955							y1 = y + stack.shift();
22956							xb = xa + stack.shift();
22957							y2 = y1 + stack.shift();
22958							x = xb + stack.shift();
22959							bezierCurveTo(xa, y1, xb, y2, x, y2);
22960							xa = x + stack.shift();
22961							xb = xa + stack.shift();
22962							y3 = y2 + stack.shift();
22963							x = xb + stack.shift();
22964							bezierCurveTo(xa, y2, xb, y3, x, y);
22965							break;
22966						case 37:
22967							const x0 = x,
22968								y0 = y;
22969							xa = x + stack.shift();
22970							ya = y + stack.shift();
22971							xb = xa + stack.shift();
22972							yb = ya + stack.shift();
22973							x = xb + stack.shift();
22974							y = yb + stack.shift();
22975							bezierCurveTo(xa, ya, xb, yb, x, y);
22976							xa = x + stack.shift();
22977							ya = y + stack.shift();
22978							xb = xa + stack.shift();
22979							yb = ya + stack.shift();
22980							x = xb;
22981							y = yb;
22982							if (Math.abs(x - x0) > Math.abs(y - y0)) {
22983								x += stack.shift();
22984							} else {
22985								y += stack.shift();
22986							}
22987							bezierCurveTo(xa, ya, xb, yb, x, y);
22988							break;
22989						default:
22990							throw new FormatError(`unknown operator: 12 ${v}`);
22991					}
22992					break;
22993				case 14:
22994					if (stack.length >= 4) {
22995						const achar = stack.pop();
22996						const bchar = stack.pop();
22997						y = stack.pop();
22998						x = stack.pop();
22999						cmds.save();
23000						cmds.translate(x, y);
23001						let cmap = lookupCmap(font.cmap, String.fromCharCode(font.glyphNameMap[StandardEncoding[achar]]));
23002						compileCharString(font.glyphs[cmap.glyphId], cmds, font, cmap.glyphId);
23003						cmds.restore();
23004						cmap = lookupCmap(font.cmap, String.fromCharCode(font.glyphNameMap[StandardEncoding[bchar]]));
23005						compileCharString(font.glyphs[cmap.glyphId], cmds, font, cmap.glyphId);
23006					}
23007					return;
23008				case 18:
23009					stems += stack.length >> 1;
23010					stackClean = true;
23011					break;
23012				case 19:
23013					stems += stack.length >> 1;
23014					i += stems + 7 >> 3;
23015					stackClean = true;
23016					break;
23017				case 20:
23018					stems += stack.length >> 1;
23019					i += stems + 7 >> 3;
23020					stackClean = true;
23021					break;
23022				case 21:
23023					y += stack.pop();
23024					x += stack.pop();
23025					moveTo(x, y);
23026					stackClean = true;
23027					break;
23028				case 22:
23029					x += stack.pop();
23030					moveTo(x, y);
23031					stackClean = true;
23032					break;
23033				case 23:
23034					stems += stack.length >> 1;
23035					stackClean = true;
23036					break;
23037				case 24:
23038					while (stack.length > 2) {
23039						xa = x + stack.shift();
23040						ya = y + stack.shift();
23041						xb = xa + stack.shift();
23042						yb = ya + stack.shift();
23043						x = xb + stack.shift();
23044						y = yb + stack.shift();
23045						bezierCurveTo(xa, ya, xb, yb, x, y);
23046					}
23047					x += stack.shift();
23048					y += stack.shift();
23049					lineTo(x, y);
23050					break;
23051				case 25:
23052					while (stack.length > 6) {
23053						x += stack.shift();
23054						y += stack.shift();
23055						lineTo(x, y);
23056					}
23057					xa = x + stack.shift();
23058					ya = y + stack.shift();
23059					xb = xa + stack.shift();
23060					yb = ya + stack.shift();
23061					x = xb + stack.shift();
23062					y = yb + stack.shift();
23063					bezierCurveTo(xa, ya, xb, yb, x, y);
23064					break;
23065				case 26:
23066					if (stack.length % 2) {
23067						x += stack.shift();
23068					}
23069					while (stack.length > 0) {
23070						xa = x;
23071						ya = y + stack.shift();
23072						xb = xa + stack.shift();
23073						yb = ya + stack.shift();
23074						x = xb;
23075						y = yb + stack.shift();
23076						bezierCurveTo(xa, ya, xb, yb, x, y);
23077					}
23078					break;
23079				case 27:
23080					if (stack.length % 2) {
23081						y += stack.shift();
23082					}
23083					while (stack.length > 0) {
23084						xa = x + stack.shift();
23085						ya = y;
23086						xb = xa + stack.shift();
23087						yb = ya + stack.shift();
23088						x = xb + stack.shift();
23089						y = yb;
23090						bezierCurveTo(xa, ya, xb, yb, x, y);
23091					}
23092					break;
23093				case 28:
23094					stack.push((code[i] << 24 | code[i + 1] << 16) >> 16);
23095					i += 2;
23096					break;
23097				case 29:
23098					n = stack.pop() + font.gsubrsBias;
23099					subrCode = font.gsubrs[n];
23100					if (subrCode) {
23101						parse(subrCode);
23102					}
23103					break;
23104				case 30:
23105					while (stack.length > 0) {
23106						xa = x;
23107						ya = y + stack.shift();
23108						xb = xa + stack.shift();
23109						yb = ya + stack.shift();
23110						x = xb + stack.shift();
23111						y = yb + (stack.length === 1 ? stack.shift() : 0);
23112						bezierCurveTo(xa, ya, xb, yb, x, y);
23113						if (stack.length === 0) {
23114							break;
23115						}
23116						xa = x + stack.shift();
23117						ya = y;
23118						xb = xa + stack.shift();
23119						yb = ya + stack.shift();
23120						y = yb + stack.shift();
23121						x = xb + (stack.length === 1 ? stack.shift() : 0);
23122						bezierCurveTo(xa, ya, xb, yb, x, y);
23123					}
23124					break;
23125				case 31:
23126					while (stack.length > 0) {
23127						xa = x + stack.shift();
23128						ya = y;
23129						xb = xa + stack.shift();
23130						yb = ya + stack.shift();
23131						y = yb + stack.shift();
23132						x = xb + (stack.length === 1 ? stack.shift() : 0);
23133						bezierCurveTo(xa, ya, xb, yb, x, y);
23134						if (stack.length === 0) {
23135							break;
23136						}
23137						xa = x;
23138						ya = y + stack.shift();
23139						xb = xa + stack.shift();
23140						yb = ya + stack.shift();
23141						x = xb + stack.shift();
23142						y = yb + (stack.length === 1 ? stack.shift() : 0);
23143						bezierCurveTo(xa, ya, xb, yb, x, y);
23144					}
23145					break;
23146				default:
23147					if (v < 32) {
23148						throw new FormatError(`unknown operator: ${v}`);
23149					}
23150					if (v < 247) {
23151						stack.push(v - 139);
23152					} else if (v < 251) {
23153						stack.push((v - 247) * 256 + code[i++] + 108);
23154					} else if (v < 255) {
vendor: 4,901 bytes, lines 23155-23331
23155						stack.push(-(v - 251) * 256 - code[i++] - 108);
23156					} else {
23157						stack.push((code[i] << 24 | code[i + 1] << 16 | code[i + 2] << 8 | code[i + 3]) / 65536);
23158						i += 4;
23159					}
23160					break;
23161			}
23162			if (stackClean) {
23163				stack.length = 0;
23164			}
23165		}
23166	}
23167	parse(charStringCode);
23168}
23169const NOOP = "";
23170class Commands {
23171	cmds = [];
23172	transformStack = [];
23173	currentTransform = [1, 0, 0, 1, 0, 0];
23174	add(cmd, args) {
23175		if (args) {
23176			const [a, b, c, d, e, f] = this.currentTransform;
23177			for (let i = 0, ii = args.length; i < ii; i += 2) {
23178				const x = args[i];
23179				const y = args[i + 1];
23180				args[i] = a * x + c * y + e;
23181				args[i + 1] = b * x + d * y + f;
23182			}
23183			this.cmds.push(`${cmd}${args.join(" ")}`);
23184		} else {
23185			this.cmds.push(cmd);
23186		}
23187	}
23188	transform(transf) {
23189		this.currentTransform = Util.transform(this.currentTransform, transf);
23190	}
23191	translate(x, y) {
23192		this.transform([1, 0, 0, 1, x, y]);
23193	}
23194	save() {
23195		this.transformStack.push(this.currentTransform.slice());
23196	}
23197	restore() {
23198		this.currentTransform = this.transformStack.pop() || [1, 0, 0, 1, 0, 0];
23199	}
23200	getSVG() {
23201		return this.cmds.join("");
23202	}
23203}
23204class CompiledFont {
23205	constructor(fontMatrix) {
23206		this.fontMatrix = fontMatrix;
23207		this.compiledGlyphs = Object.create(null);
23208		this.compiledCharCodeToGlyphId = Object.create(null);
23209	}
23210	getPathJs(unicode) {
23211		const {
23212			charCode,
23213			glyphId
23214		} = lookupCmap(this.cmap, unicode);
23215		let fn = this.compiledGlyphs[glyphId],
23216			compileEx;
23217		if (fn === undefined) {
23218			try {
23219				fn = this.compileGlyph(this.glyphs[glyphId], glyphId);
23220			} catch (ex) {
23221				fn = NOOP;
23222				compileEx = ex;
23223			}
23224			this.compiledGlyphs[glyphId] = fn;
23225		}
23226		this.compiledCharCodeToGlyphId[charCode] ??= glyphId;
23227		if (compileEx) {
23228			throw compileEx;
23229		}
23230		return fn;
23231	}
23232	compileGlyph(code, glyphId) {
23233		if (!code?.length || code[0] === 14) {
23234			return NOOP;
23235		}
23236		let fontMatrix = this.fontMatrix;
23237		if (this.isCFFCIDFont) {
23238			const fdIndex = this.fdSelect.getFDIndex(glyphId);
23239			if (fdIndex >= 0 && fdIndex < this.fdArray.length) {
23240				const fontDict = this.fdArray[fdIndex];
23241				fontMatrix = fontDict.getByName("FontMatrix") || FONT_IDENTITY_MATRIX;
23242			} else {
23243				warn("Invalid fd index for glyph index.");
23244			}
23245		}
23246		assert(isNumberArray(fontMatrix, 6), "Expected a valid fontMatrix.");
23247		const cmds = new Commands();
23248		cmds.transform(fontMatrix.slice());
23249		this.compileGlyphImpl(code, cmds, glyphId);
23250		cmds.add("Z");
23251		return cmds.getSVG();
23252	}
23253	compileGlyphImpl() {
23254		unreachable("Children classes should implement this.");
23255	}
23256	hasBuiltPath(unicode) {
23257		const {
23258			charCode,
23259			glyphId
23260		} = lookupCmap(this.cmap, unicode);
23261		return this.compiledGlyphs[glyphId] !== undefined && this.compiledCharCodeToGlyphId[charCode] !== undefined;
23262	}
23263}
23264class TrueTypeCompiled extends CompiledFont {
23265	constructor(glyphs, cmap, fontMatrix) {
23266		super(fontMatrix || [0.000488, 0, 0, 0.000488, 0, 0]);
23267		this.glyphs = glyphs;
23268		this.cmap = cmap;
23269	}
23270	compileGlyphImpl(code, cmds) {
23271		compileGlyf(code, cmds, this);
23272	}
23273}
23274class Type2Compiled extends CompiledFont {
23275	constructor(cffInfo, cmap, fontMatrix) {
23276		super(fontMatrix || [0.001, 0, 0, 0.001, 0, 0]);
23277		this.glyphs = cffInfo.glyphs;
23278		this.gsubrs = cffInfo.gsubrs || [];
23279		this.subrs = cffInfo.subrs || [];
23280		this.cmap = cmap;
23281		this.glyphNameMap = getGlyphsUnicode();
23282		this.gsubrsBias = getSubroutineBias(this.gsubrs);
23283		this.subrsBias = getSubroutineBias(this.subrs);
23284		this.isCFFCIDFont = cffInfo.isCFFCIDFont;
23285		this.fdSelect = cffInfo.fdSelect;
23286		this.fdArray = cffInfo.fdArray;
23287	}
23288	compileGlyphImpl(code, cmds, glyphId) {
23289		compileCharString(code, cmds, this, glyphId);
23290	}
23291}
23292class FontRendererFactory {
23293	static create(font, seacAnalysisEnabled) {
23294		const data = new Uint8Array(font.data);
23295		let cmap, glyf, loca, cff, indexToLocFormat, unitsPerEm;
23296		const numTables = getUint16(data, 4);
23297		for (let i = 0, p = 12; i < numTables; i++, p += 16) {
23298			const tag = bytesToString(data.subarray(p, p + 4));
23299			const offset = getUint32(data, p + 8);
23300			const length = getUint32(data, p + 12);
23301			switch (tag) {
23302				case "cmap":
23303					cmap = parseCmap(data, offset, offset + length);
23304					break;
23305				case "glyf":
23306					glyf = data.subarray(offset, offset + length);
23307					break;
23308				case "loca":
23309					loca = data.subarray(offset, offset + length);
23310					break;
23311				case "head":
23312					unitsPerEm = getUint16(data, offset + 18);
23313					indexToLocFormat = getUint16(data, offset + 50);
23314					break;
23315				case "CFF ":
23316					cff = parseCff(data, offset, offset + length, seacAnalysisEnabled);
23317					break;
23318			}
23319		}
23320		if (glyf) {
23321			const fontMatrix = !unitsPerEm ? font.fontMatrix : [1 / unitsPerEm, 0, 0, 1 / unitsPerEm, 0, 0];
23322			return new TrueTypeCompiled(parseGlyfTable(glyf, loca, indexToLocFormat), cmap, fontMatrix);
23323		}
23324		return new Type2Compiled(cff, cmap, font.fontMatrix);
23325	}
23326}
23327
23328;// ./src/core/metrics.js
23329
23330const getMetrics = getLookupTableFactory(function (t) {
23331	t.Courier = 600;
23332	t["Courier-Bold"] = 600;
23333	t["Courier-BoldOblique"] = 600;
23334	t["Courier-Oblique"] = 600;
23335	t.Helvetica = getLookupTableFactory(function (t) {
23336		t.space = 278;
23337		t.exclam = 278;
23338		t.quotedbl = 355;
23339		t.numbersign = 556;
23340		t.dollar = 556;
23341		t.percent = 889;
23342		t.ampersand = 667;
23343		t.quoteright = 222;
23344		t.parenleft = 333;
23345		t.parenright = 333;
23346		t.asterisk = 389;
23347		t.plus = 584;
23348		t.comma = 278;
23349		t.hyphen = 333;
23350		t.period = 278;
23351		t.slash = 278;
23352		t.zero = 556;
23353		t.one = 556;
23354		t.two = 556;
23355		t.three = 556;
23356		t.four = 556;
23357		t.five = 556;
23358		t.six = 556;
23359		t.seven = 556;
23360		t.eight = 556;
23361		t.nine = 556;
23362		t.colon = 278;
23363		t.semicolon = 278;
23364		t.less = 584;
23365		t.equal = 584;
23366		t.greater = 584;
23367		t.question = 556;
23368		t.at = 1015;
23369		t.A = 667;
23370		t.B = 667;
23371		t.C = 722;
23372		t.D = 722;
23373		t.E = 667;
23374		t.F = 611;
23375		t.G = 778;
23376		t.H = 722;
23377		t.I = 278;
23378		t.J = 500;
23379		t.K = 667;
23380		t.L = 556;
23381		t.M = 833;
23382		t.N = 722;
23383		t.O = 778;
23384		t.P = 667;
23385		t.Q = 778;
23386		t.R = 722;
23387		t.S = 667;
23388		t.T = 611;
23389		t.U = 722;
23390		t.V = 667;
23391		t.W = 944;
23392		t.X = 667;
23393		t.Y = 667;
23394		t.Z = 611;
23395		t.bracketleft = 278;
23396		t.backslash = 278;
23397		t.bracketright = 278;
23398		t.asciicircum = 469;
23399		t.underscore = 556;
23400		t.quoteleft = 222;
23401		t.a = 556;
23402		t.b = 556;
23403		t.c = 500;
23404		t.d = 556;
23405		t.e = 556;
23406		t.f = 278;
23407		t.g = 556;
23408		t.h = 556;
23409		t.i = 222;
23410		t.j = 222;
23411		t.k = 500;
23412		t.l = 222;
23413		t.m = 833;
23414		t.n = 556;
23415		t.o = 556;
23416		t.p = 556;
23417		t.q = 556;
23418		t.r = 333;
23419		t.s = 500;
23420		t.t = 278;
23421		t.u = 556;
23422		t.v = 500;
23423		t.w = 722;
23424		t.x = 500;
23425		t.y = 500;
23426		t.z = 500;
23427		t.braceleft = 334;
23428		t.bar = 260;
23429		t.braceright = 334;
23430		t.asciitilde = 584;
23431		t.exclamdown = 333;
23432		t.cent = 556;
23433		t.sterling = 556;
23434		t.fraction = 167;
23435		t.yen = 556;
23436		t.florin = 556;
23437		t.section = 556;
23438		t.currency = 556;
23439		t.quotesingle = 191;
23440		t.quotedblleft = 333;
23441		t.guillemotleft = 556;
23442		t.guilsinglleft = 333;
23443		t.guilsinglright = 333;
23444		t.fi = 500;
23445		t.fl = 500;
23446		t.endash = 556;
23447		t.dagger = 556;
23448		t.daggerdbl = 556;
23449		t.periodcentered = 278;
23450		t.paragraph = 537;
23451		t.bullet = 350;
23452		t.quotesinglbase = 222;
23453		t.quotedblbase = 333;
23454		t.quotedblright = 333;
23455		t.guillemotright = 556;
23456		t.ellipsis = 1000;
23457		t.perthousand = 1000;
23458		t.questiondown = 611;
23459		t.grave = 333;
23460		t.acute = 333;
23461		t.circumflex = 333;
23462		t.tilde = 333;
23463		t.macron = 333;
23464		t.breve = 333;
23465		t.dotaccent = 333;
23466		t.dieresis = 333;
23467		t.ring = 333;
23468		t.cedilla = 333;
23469		t.hungarumlaut = 333;
23470		t.ogonek = 333;
23471		t.caron = 333;
23472		t.emdash = 1000;
23473		t.AE = 1000;
23474		t.ordfeminine = 370;
23475		t.Lslash = 556;
23476		t.Oslash = 778;
23477		t.OE = 1000;
23478		t.ordmasculine = 365;
23479		t.ae = 889;
23480		t.dotlessi = 278;
23481		t.lslash = 222;
23482		t.oslash = 611;
23483		t.oe = 944;
23484		t.germandbls = 611;
23485		t.Idieresis = 278;
23486		t.eacute = 556;
23487		t.abreve = 556;
23488		t.uhungarumlaut = 556;
23489		t.ecaron = 556;
23490		t.Ydieresis = 667;
23491		t.divide = 584;
23492		t.Yacute = 667;
23493		t.Acircumflex = 667;
23494		t.aacute = 556;
23495		t.Ucircumflex = 722;
23496		t.yacute = 500;
23497		t.scommaaccent = 500;
23498		t.ecircumflex = 556;
23499		t.Uring = 722;
23500		t.Udieresis = 722;
23501		t.aogonek = 556;
23502		t.Uacute = 722;
23503		t.uogonek = 556;
23504		t.Edieresis = 667;
23505		t.Dcroat = 722;
23506		t.commaaccent = 250;
23507		t.copyright = 737;
23508		t.Emacron = 667;
23509		t.ccaron = 500;
23510		t.aring = 556;
23511		t.Ncommaaccent = 722;
23512		t.lacute = 222;
23513		t.agrave = 556;
23514		t.Tcommaaccent = 611;
23515		t.Cacute = 722;
23516		t.atilde = 556;
23517		t.Edotaccent = 667;
23518		t.scaron = 500;
23519		t.scedilla = 500;
23520		t.iacute = 278;
23521		t.lozenge = 471;
23522		t.Rcaron = 722;
23523		t.Gcommaaccent = 778;
23524		t.ucircumflex = 556;
23525		t.acircumflex = 556;
23526		t.Amacron = 667;
23527		t.rcaron = 333;
23528		t.ccedilla = 500;
23529		t.Zdotaccent = 611;
23530		t.Thorn = 667;
23531		t.Omacron = 778;
23532		t.Racute = 722;
23533		t.Sacute = 667;
23534		t.dcaron = 643;
23535		t.Umacron = 722;
23536		t.uring = 556;
23537		t.threesuperior = 333;
23538		t.Ograve = 778;
23539		t.Agrave = 667;
23540		t.Abreve = 667;
23541		t.multiply = 584;
23542		t.uacute = 556;
23543		t.Tcaron = 611;
23544		t.partialdiff = 476;
23545		t.ydieresis = 500;
23546		t.Nacute = 722;
23547		t.icircumflex = 278;
23548		t.Ecircumflex = 667;
23549		t.adieresis = 556;
23550		t.edieresis = 556;
23551		t.cacute = 500;
23552		t.nacute = 556;
23553		t.umacron = 556;
23554		t.Ncaron = 722;
23555		t.Iacute = 278;
23556		t.plusminus = 584;
23557		t.brokenbar = 260;
23558		t.registered = 737;
23559		t.Gbreve = 778;
23560		t.Idotaccent = 278;
23561		t.summation = 600;
23562		t.Egrave = 667;
23563		t.racute = 333;
23564		t.omacron = 556;
23565		t.Zacute = 611;
23566		t.Zcaron = 611;
23567		t.greaterequal = 549;
23568		t.Eth = 722;
23569		t.Ccedilla = 722;
23570		t.lcommaaccent = 222;
23571		t.tcaron = 317;
23572		t.eogonek = 556;
23573		t.Uogonek = 722;
23574		t.Aacute = 667;
23575		t.Adieresis = 667;
23576		t.egrave = 556;
23577		t.zacute = 500;
23578		t.iogonek = 222;
23579		t.Oacute = 778;
23580		t.oacute = 556;
23581		t.amacron = 556;
23582		t.sacute = 500;
23583		t.idieresis = 278;
23584		t.Ocircumflex = 778;
23585		t.Ugrave = 722;
23586		t.Delta = 612;
23587		t.thorn = 556;
23588		t.twosuperior = 333;
23589		t.Odieresis = 778;
23590		t.mu = 556;
23591		t.igrave = 278;
23592		t.ohungarumlaut = 556;
23593		t.Eogonek = 667;
23594		t.dcroat = 556;
23595		t.threequarters = 834;
23596		t.Scedilla = 667;
23597		t.lcaron = 299;
23598		t.Kcommaaccent = 667;
23599		t.Lacute = 556;
23600		t.trademark = 1000;
23601		t.edotaccent = 556;
23602		t.Igrave = 278;
23603		t.Imacron = 278;
23604		t.Lcaron = 556;
23605		t.onehalf = 834;
23606		t.lessequal = 549;
23607		t.ocircumflex = 556;
23608		t.ntilde = 556;
23609		t.Uhungarumlaut = 722;
23610		t.Eacute = 667;
23611		t.emacron = 556;
23612		t.gbreve = 556;
23613		t.onequarter = 834;
23614		t.Scaron = 667;
23615		t.Scommaaccent = 667;
23616		t.Ohungarumlaut = 778;
23617		t.degree = 400;
23618		t.ograve = 556;
23619		t.Ccaron = 722;
23620		t.ugrave = 556;
23621		t.radical = 453;
23622		t.Dcaron = 722;
23623		t.rcommaaccent = 333;
23624		t.Ntilde = 722;
23625		t.otilde = 556;
23626		t.Rcommaaccent = 722;
23627		t.Lcommaaccent = 556;
23628		t.Atilde = 667;
23629		t.Aogonek = 667;
23630		t.Aring = 667;
23631		t.Otilde = 778;
23632		t.zdotaccent = 500;
23633		t.Ecaron = 667;
23634		t.Iogonek = 278;
23635		t.kcommaaccent = 500;
23636		t.minus = 584;
23637		t.Icircumflex = 278;
23638		t.ncaron = 556;
23639		t.tcommaaccent = 278;
23640		t.logicalnot = 584;
23641		t.odieresis = 556;
23642		t.udieresis = 556;
23643		t.notequal = 549;
23644		t.gcommaaccent = 556;
23645		t.eth = 556;
23646		t.zcaron = 500;
23647		t.ncommaaccent = 556;
23648		t.onesuperior = 333;
23649		t.imacron = 278;
23650		t.Euro = 556;
23651	});
23652	t["Helvetica-Bold"] = getLookupTableFactory(function (t) {
23653		t.space = 278;
23654		t.exclam = 333;
23655		t.quotedbl = 474;
23656		t.numbersign = 556;
23657		t.dollar = 556;
23658		t.percent = 889;
23659		t.ampersand = 722;
23660		t.quoteright = 278;
23661		t.parenleft = 333;
23662		t.parenright = 333;
23663		t.asterisk = 389;
23664		t.plus = 584;
23665		t.comma = 278;
23666		t.hyphen = 333;
23667		t.period = 278;
23668		t.slash = 278;
23669		t.zero = 556;
23670		t.one = 556;
23671		t.two = 556;
23672		t.three = 556;
23673		t.four = 556;
23674		t.five = 556;
23675		t.six = 556;
23676		t.seven = 556;
23677		t.eight = 556;
23678		t.nine = 556;
23679		t.colon = 333;
23680		t.semicolon = 333;
23681		t.less = 584;
23682		t.equal = 584;
23683		t.greater = 584;
23684		t.question = 611;
23685		t.at = 975;
23686		t.A = 722;
23687		t.B = 722;
23688		t.C = 722;
23689		t.D = 722;
23690		t.E = 667;
23691		t.F = 611;
23692		t.G = 778;
23693		t.H = 722;
23694		t.I = 278;
23695		t.J = 556;
23696		t.K = 722;
23697		t.L = 611;
23698		t.M = 833;
23699		t.N = 722;
23700		t.O = 778;
23701		t.P = 667;
23702		t.Q = 778;
23703		t.R = 722;
23704		t.S = 667;
23705		t.T = 611;
23706		t.U = 722;
23707		t.V = 667;
23708		t.W = 944;
23709		t.X = 667;
23710		t.Y = 667;
23711		t.Z = 611;
23712		t.bracketleft = 333;
23713		t.backslash = 278;
23714		t.bracketright = 333;
23715		t.asciicircum = 584;
23716		t.underscore = 556;
23717		t.quoteleft = 278;
23718		t.a = 556;
23719		t.b = 611;
23720		t.c = 556;
23721		t.d = 611;
23722		t.e = 556;
23723		t.f = 333;
23724		t.g = 611;
23725		t.h = 611;
23726		t.i = 278;
23727		t.j = 278;
23728		t.k = 556;
23729		t.l = 278;
23730		t.m = 889;
23731		t.n = 611;
23732		t.o = 611;
23733		t.p = 611;
23734		t.q = 611;
23735		t.r = 389;
23736		t.s = 556;
23737		t.t = 333;
23738		t.u = 611;
23739		t.v = 556;
23740		t.w = 778;
23741		t.x = 556;
23742		t.y = 556;
23743		t.z = 500;
23744		t.braceleft = 389;
23745		t.bar = 280;
23746		t.braceright = 389;
23747		t.asciitilde = 584;
23748		t.exclamdown = 333;
23749		t.cent = 556;
23750		t.sterling = 556;
23751		t.fraction = 167;
23752		t.yen = 556;
23753		t.florin = 556;
23754		t.section = 556;
23755		t.currency = 556;
23756		t.quotesingle = 238;
23757		t.quotedblleft = 500;
23758		t.guillemotleft = 556;
23759		t.guilsinglleft = 333;
23760		t.guilsinglright = 333;
23761		t.fi = 611;
23762		t.fl = 611;
23763		t.endash = 556;
23764		t.dagger = 556;
23765		t.daggerdbl = 556;
23766		t.periodcentered = 278;
23767		t.paragraph = 556;
23768		t.bullet = 350;
23769		t.quotesinglbase = 278;
23770		t.quotedblbase = 500;
23771		t.quotedblright = 500;
23772		t.guillemotright = 556;
23773		t.ellipsis = 1000;
23774		t.perthousand = 1000;
23775		t.questiondown = 611;
23776		t.grave = 333;
23777		t.acute = 333;
23778		t.circumflex = 333;
23779		t.tilde = 333;
23780		t.macron = 333;
23781		t.breve = 333;
23782		t.dotaccent = 333;
23783		t.dieresis = 333;
23784		t.ring = 333;
23785		t.cedilla = 333;
23786		t.hungarumlaut = 333;
23787		t.ogonek = 333;
23788		t.caron = 333;
23789		t.emdash = 1000;
23790		t.AE = 1000;
23791		t.ordfeminine = 370;
23792		t.Lslash = 611;
23793		t.Oslash = 778;
23794		t.OE = 1000;
23795		t.ordmasculine = 365;
23796		t.ae = 889;
23797		t.dotlessi = 278;
23798		t.lslash = 278;
23799		t.oslash = 611;
23800		t.oe = 944;
23801		t.germandbls = 611;
23802		t.Idieresis = 278;
23803		t.eacute = 556;
23804		t.abreve = 556;
23805		t.uhungarumlaut = 611;
23806		t.ecaron = 556;
23807		t.Ydieresis = 667;
23808		t.divide = 584;
23809		t.Yacute = 667;
23810		t.Acircumflex = 722;
23811		t.aacute = 556;
23812		t.Ucircumflex = 722;
23813		t.yacute = 556;
23814		t.scommaaccent = 556;
23815		t.ecircumflex = 556;
23816		t.Uring = 722;
23817		t.Udieresis = 722;
23818		t.aogonek = 556;
23819		t.Uacute = 722;
23820		t.uogonek = 611;
23821		t.Edieresis = 667;
23822		t.Dcroat = 722;
23823		t.commaaccent = 250;
23824		t.copyright = 737;
23825		t.Emacron = 667;
23826		t.ccaron = 556;
23827		t.aring = 556;
23828		t.Ncommaaccent = 722;
23829		t.lacute = 278;
23830		t.agrave = 556;
23831		t.Tcommaaccent = 611;
23832		t.Cacute = 722;
23833		t.atilde = 556;
23834		t.Edotaccent = 667;
23835		t.scaron = 556;
23836		t.scedilla = 556;
23837		t.iacute = 278;
23838		t.lozenge = 494;
23839		t.Rcaron = 722;
23840		t.Gcommaaccent = 778;
23841		t.ucircumflex = 611;
23842		t.acircumflex = 556;
23843		t.Amacron = 722;
23844		t.rcaron = 389;
23845		t.ccedilla = 556;
23846		t.Zdotaccent = 611;
23847		t.Thorn = 667;
23848		t.Omacron = 778;
23849		t.Racute = 722;
23850		t.Sacute = 667;
23851		t.dcaron = 743;
23852		t.Umacron = 722;
23853		t.uring = 611;
23854		t.threesuperior = 333;
23855		t.Ograve = 778;
23856		t.Agrave = 722;
23857		t.Abreve = 722;
23858		t.multiply = 584;
23859		t.uacute = 611;
23860		t.Tcaron = 611;
23861		t.partialdiff = 494;
23862		t.ydieresis = 556;
23863		t.Nacute = 722;
23864		t.icircumflex = 278;
23865		t.Ecircumflex = 667;
23866		t.adieresis = 556;
23867		t.edieresis = 556;
23868		t.cacute = 556;
23869		t.nacute = 611;
23870		t.umacron = 611;
23871		t.Ncaron = 722;
23872		t.Iacute = 278;
23873		t.plusminus = 584;
23874		t.brokenbar = 280;
23875		t.registered = 737;
23876		t.Gbreve = 778;
23877		t.Idotaccent = 278;
23878		t.summation = 600;
23879		t.Egrave = 667;
23880		t.racute = 389;
23881		t.omacron = 611;
23882		t.Zacute = 611;
23883		t.Zcaron = 611;
23884		t.greaterequal = 549;
23885		t.Eth = 722;
23886		t.Ccedilla = 722;
23887		t.lcommaaccent = 278;
23888		t.tcaron = 389;
23889		t.eogonek = 556;
23890		t.Uogonek = 722;
23891		t.Aacute = 722;
23892		t.Adieresis = 722;
23893		t.egrave = 556;
23894		t.zacute = 500;
23895		t.iogonek = 278;
23896		t.Oacute = 778;
23897		t.oacute = 611;
23898		t.amacron = 556;
23899		t.sacute = 556;
23900		t.idieresis = 278;
23901		t.Ocircumflex = 778;
23902		t.Ugrave = 722;
23903		t.Delta = 612;
23904		t.thorn = 611;
23905		t.twosuperior = 333;
23906		t.Odieresis = 778;
23907		t.mu = 611;
23908		t.igrave = 278;
23909		t.ohungarumlaut = 611;
23910		t.Eogonek = 667;
23911		t.dcroat = 611;
23912		t.threequarters = 834;
23913		t.Scedilla = 667;
23914		t.lcaron = 400;
23915		t.Kcommaaccent = 722;
23916		t.Lacute = 611;
23917		t.trademark = 1000;
23918		t.edotaccent = 556;
23919		t.Igrave = 278;
23920		t.Imacron = 278;
23921		t.Lcaron = 611;
23922		t.onehalf = 834;
23923		t.lessequal = 549;
23924		t.ocircumflex = 611;
23925		t.ntilde = 611;
23926		t.Uhungarumlaut = 722;
23927		t.Eacute = 667;
23928		t.emacron = 556;
23929		t.gbreve = 611;
23930		t.onequarter = 834;
23931		t.Scaron = 667;
23932		t.Scommaaccent = 667;
23933		t.Ohungarumlaut = 778;
23934		t.degree = 400;
23935		t.ograve = 611;
23936		t.Ccaron = 722;
23937		t.ugrave = 611;
23938		t.radical = 549;
23939		t.Dcaron = 722;
23940		t.rcommaaccent = 389;
23941		t.Ntilde = 722;
23942		t.otilde = 611;
23943		t.Rcommaaccent = 722;
23944		t.Lcommaaccent = 611;
23945		t.Atilde = 722;
23946		t.Aogonek = 722;
23947		t.Aring = 722;
23948		t.Otilde = 778;
23949		t.zdotaccent = 500;
23950		t.Ecaron = 667;
23951		t.Iogonek = 278;
23952		t.kcommaaccent = 556;
23953		t.minus = 584;
23954		t.Icircumflex = 278;
23955		t.ncaron = 611;
23956		t.tcommaaccent = 333;
23957		t.logicalnot = 584;
23958		t.odieresis = 611;
23959		t.udieresis = 611;
23960		t.notequal = 549;
23961		t.gcommaaccent = 611;
23962		t.eth = 611;
23963		t.zcaron = 500;
23964		t.ncommaaccent = 611;
23965		t.onesuperior = 333;
23966		t.imacron = 278;
23967		t.Euro = 556;
23968	});
23969	t["Helvetica-BoldOblique"] = getLookupTableFactory(function (t) {
23970		t.space = 278;
23971		t.exclam = 333;
23972		t.quotedbl = 474;
23973		t.numbersign = 556;
23974		t.dollar = 556;
23975		t.percent = 889;
23976		t.ampersand = 722;
23977		t.quoteright = 278;
23978		t.parenleft = 333;
23979		t.parenright = 333;
23980		t.asterisk = 389;
23981		t.plus = 584;
23982		t.comma = 278;
23983		t.hyphen = 333;
23984		t.period = 278;
23985		t.slash = 278;
23986		t.zero = 556;
23987		t.one = 556;
23988		t.two = 556;
23989		t.three = 556;
23990		t.four = 556;
23991		t.five = 556;
23992		t.six = 556;
23993		t.seven = 556;
23994		t.eight = 556;
23995		t.nine = 556;
23996		t.colon = 333;
23997		t.semicolon = 333;
23998		t.less = 584;
23999		t.equal = 584;
24000		t.greater = 584;
24001		t.question = 611;
24002		t.at = 975;
24003		t.A = 722;
24004		t.B = 722;
24005		t.C = 722;
24006		t.D = 722;
24007		t.E = 667;
24008		t.F = 611;
24009		t.G = 778;
24010		t.H = 722;
24011		t.I = 278;
24012		t.J = 556;
24013		t.K = 722;
24014		t.L = 611;
24015		t.M = 833;
24016		t.N = 722;
24017		t.O = 778;
24018		t.P = 667;
24019		t.Q = 778;
24020		t.R = 722;
24021		t.S = 667;
24022		t.T = 611;
24023		t.U = 722;
24024		t.V = 667;
24025		t.W = 944;
24026		t.X = 667;
24027		t.Y = 667;
24028		t.Z = 611;
24029		t.bracketleft = 333;
24030		t.backslash = 278;
24031		t.bracketright = 333;
24032		t.asciicircum = 584;
24033		t.underscore = 556;
24034		t.quoteleft = 278;
24035		t.a = 556;
24036		t.b = 611;
24037		t.c = 556;
24038		t.d = 611;
24039		t.e = 556;
24040		t.f = 333;
24041		t.g = 611;
24042		t.h = 611;
24043		t.i = 278;
24044		t.j = 278;
24045		t.k = 556;
24046		t.l = 278;
24047		t.m = 889;
24048		t.n = 611;
24049		t.o = 611;
24050		t.p = 611;
24051		t.q = 611;
24052		t.r = 389;
24053		t.s = 556;
24054		t.t = 333;
24055		t.u = 611;
24056		t.v = 556;
24057		t.w = 778;
24058		t.x = 556;
24059		t.y = 556;
24060		t.z = 500;
24061		t.braceleft = 389;
24062		t.bar = 280;
24063		t.braceright = 389;
24064		t.asciitilde = 584;
24065		t.exclamdown = 333;
24066		t.cent = 556;
24067		t.sterling = 556;
24068		t.fraction = 167;
24069		t.yen = 556;
24070		t.florin = 556;
24071		t.section = 556;
24072		t.currency = 556;
24073		t.quotesingle = 238;
24074		t.quotedblleft = 500;
24075		t.guillemotleft = 556;
24076		t.guilsinglleft = 333;
24077		t.guilsinglright = 333;
24078		t.fi = 611;
24079		t.fl = 611;
24080		t.endash = 556;
24081		t.dagger = 556;
24082		t.daggerdbl = 556;
24083		t.periodcentered = 278;
24084		t.paragraph = 556;
24085		t.bullet = 350;
24086		t.quotesinglbase = 278;
24087		t.quotedblbase = 500;
24088		t.quotedblright = 500;
24089		t.guillemotright = 556;
24090		t.ellipsis = 1000;
24091		t.perthousand = 1000;
24092		t.questiondown = 611;
24093		t.grave = 333;
24094		t.acute = 333;
24095		t.circumflex = 333;
24096		t.tilde = 333;
24097		t.macron = 333;
24098		t.breve = 333;
24099		t.dotaccent = 333;
24100		t.dieresis = 333;
24101		t.ring = 333;
24102		t.cedilla = 333;
24103		t.hungarumlaut = 333;
24104		t.ogonek = 333;
24105		t.caron = 333;
24106		t.emdash = 1000;
24107		t.AE = 1000;
24108		t.ordfeminine = 370;
24109		t.Lslash = 611;
24110		t.Oslash = 778;
24111		t.OE = 1000;
24112		t.ordmasculine = 365;
24113		t.ae = 889;
24114		t.dotlessi = 278;
24115		t.lslash = 278;
24116		t.oslash = 611;
24117		t.oe = 944;
24118		t.germandbls = 611;
24119		t.Idieresis = 278;
24120		t.eacute = 556;
24121		t.abreve = 556;
24122		t.uhungarumlaut = 611;
24123		t.ecaron = 556;
24124		t.Ydieresis = 667;
24125		t.divide = 584;
24126		t.Yacute = 667;
24127		t.Acircumflex = 722;
24128		t.aacute = 556;
24129		t.Ucircumflex = 722;
24130		t.yacute = 556;
24131		t.scommaaccent = 556;
24132		t.ecircumflex = 556;
24133		t.Uring = 722;
24134		t.Udieresis = 722;
24135		t.aogonek = 556;
24136		t.Uacute = 722;
24137		t.uogonek = 611;
24138		t.Edieresis = 667;
24139		t.Dcroat = 722;
24140		t.commaaccent = 250;
24141		t.copyright = 737;
24142		t.Emacron = 667;
24143		t.ccaron = 556;
24144		t.aring = 556;
24145		t.Ncommaaccent = 722;
24146		t.lacute = 278;
24147		t.agrave = 556;
24148		t.Tcommaaccent = 611;
24149		t.Cacute = 722;
24150		t.atilde = 556;
24151		t.Edotaccent = 667;
24152		t.scaron = 556;
24153		t.scedilla = 556;
24154		t.iacute = 278;
24155		t.lozenge = 494;
24156		t.Rcaron = 722;
24157		t.Gcommaaccent = 778;
24158		t.ucircumflex = 611;
24159		t.acircumflex = 556;
24160		t.Amacron = 722;
24161		t.rcaron = 389;
24162		t.ccedilla = 556;
24163		t.Zdotaccent = 611;
24164		t.Thorn = 667;
24165		t.Omacron = 778;
24166		t.Racute = 722;
24167		t.Sacute = 667;
24168		t.dcaron = 743;
24169		t.Umacron = 722;
24170		t.uring = 611;
24171		t.threesuperior = 333;
24172		t.Ograve = 778;
24173		t.Agrave = 722;
24174		t.Abreve = 722;
24175		t.multiply = 584;
24176		t.uacute = 611;
24177		t.Tcaron = 611;
24178		t.partialdiff = 494;
24179		t.ydieresis = 556;
24180		t.Nacute = 722;
24181		t.icircumflex = 278;
24182		t.Ecircumflex = 667;
24183		t.adieresis = 556;
24184		t.edieresis = 556;
24185		t.cacute = 556;
24186		t.nacute = 611;
24187		t.umacron = 611;
24188		t.Ncaron = 722;
24189		t.Iacute = 278;
24190		t.plusminus = 584;
24191		t.brokenbar = 280;
24192		t.registered = 737;
24193		t.Gbreve = 778;
24194		t.Idotaccent = 278;
24195		t.summation = 600;
24196		t.Egrave = 667;
24197		t.racute = 389;
24198		t.omacron = 611;
24199		t.Zacute = 611;
24200		t.Zcaron = 611;
24201		t.greaterequal = 549;
24202		t.Eth = 722;
24203		t.Ccedilla = 722;
24204		t.lcommaaccent = 278;
24205		t.tcaron = 389;
24206		t.eogonek = 556;
24207		t.Uogonek = 722;
24208		t.Aacute = 722;
24209		t.Adieresis = 722;
24210		t.egrave = 556;
24211		t.zacute = 500;
24212		t.iogonek = 278;
24213		t.Oacute = 778;
24214		t.oacute = 611;
24215		t.amacron = 556;
24216		t.sacute = 556;
24217		t.idieresis = 278;
24218		t.Ocircumflex = 778;
24219		t.Ugrave = 722;
24220		t.Delta = 612;
24221		t.thorn = 611;
24222		t.twosuperior = 333;
24223		t.Odieresis = 778;
24224		t.mu = 611;
24225		t.igrave = 278;
24226		t.ohungarumlaut = 611;
24227		t.Eogonek = 667;
24228		t.dcroat = 611;
24229		t.threequarters = 834;
24230		t.Scedilla = 667;
24231		t.lcaron = 400;
24232		t.Kcommaaccent = 722;
24233		t.Lacute = 611;
24234		t.trademark = 1000;
24235		t.edotaccent = 556;
24236		t.Igrave = 278;
24237		t.Imacron = 278;
24238		t.Lcaron = 611;
24239		t.onehalf = 834;
24240		t.lessequal = 549;
24241		t.ocircumflex = 611;
24242		t.ntilde = 611;
24243		t.Uhungarumlaut = 722;
24244		t.Eacute = 667;
24245		t.emacron = 556;
24246		t.gbreve = 611;
24247		t.onequarter = 834;
24248		t.Scaron = 667;
24249		t.Scommaaccent = 667;
24250		t.Ohungarumlaut = 778;
24251		t.degree = 400;
24252		t.ograve = 611;
24253		t.Ccaron = 722;
24254		t.ugrave = 611;
24255		t.radical = 549;
24256		t.Dcaron = 722;
24257		t.rcommaaccent = 389;
24258		t.Ntilde = 722;
24259		t.otilde = 611;
24260		t.Rcommaaccent = 722;
24261		t.Lcommaaccent = 611;
24262		t.Atilde = 722;
24263		t.Aogonek = 722;
24264		t.Aring = 722;
24265		t.Otilde = 778;
24266		t.zdotaccent = 500;
24267		t.Ecaron = 667;
24268		t.Iogonek = 278;
24269		t.kcommaaccent = 556;
24270		t.minus = 584;
24271		t.Icircumflex = 278;
24272		t.ncaron = 611;
24273		t.tcommaaccent = 333;
24274		t.logicalnot = 584;
24275		t.odieresis = 611;
24276		t.udieresis = 611;
24277		t.notequal = 549;
24278		t.gcommaaccent = 611;
24279		t.eth = 611;
24280		t.zcaron = 500;
24281		t.ncommaaccent = 611;
24282		t.onesuperior = 333;
24283		t.imacron = 278;
24284		t.Euro = 556;
24285	});
24286	t["Helvetica-Oblique"] = getLookupTableFactory(function (t) {
24287		t.space = 278;
24288		t.exclam = 278;
24289		t.quotedbl = 355;
24290		t.numbersign = 556;
24291		t.dollar = 556;
24292		t.percent = 889;
24293		t.ampersand = 667;
24294		t.quoteright = 222;
24295		t.parenleft = 333;
24296		t.parenright = 333;
24297		t.asterisk = 389;
24298		t.plus = 584;
24299		t.comma = 278;
24300		t.hyphen = 333;
24301		t.period = 278;
24302		t.slash = 278;
24303		t.zero = 556;
24304		t.one = 556;
24305		t.two = 556;
24306		t.three = 556;
24307		t.four = 556;
24308		t.five = 556;
24309		t.six = 556;
24310		t.seven = 556;
24311		t.eight = 556;
24312		t.nine = 556;
24313		t.colon = 278;
24314		t.semicolon = 278;
24315		t.less = 584;
24316		t.equal = 584;
24317		t.greater = 584;
24318		t.question = 556;
24319		t.at = 1015;
24320		t.A = 667;
24321		t.B = 667;
24322		t.C = 722;
24323		t.D = 722;
24324		t.E = 667;
24325		t.F = 611;
24326		t.G = 778;
24327		t.H = 722;
24328		t.I = 278;
24329		t.J = 500;
24330		t.K = 667;
24331		t.L = 556;
24332		t.M = 833;
24333		t.N = 722;
24334		t.O = 778;
24335		t.P = 667;
24336		t.Q = 778;
24337		t.R = 722;
24338		t.S = 667;
24339		t.T = 611;
24340		t.U = 722;
24341		t.V = 667;
24342		t.W = 944;
24343		t.X = 667;
24344		t.Y = 667;
24345		t.Z = 611;
24346		t.bracketleft = 278;
24347		t.backslash = 278;
24348		t.bracketright = 278;
24349		t.asciicircum = 469;
24350		t.underscore = 556;
24351		t.quoteleft = 222;
24352		t.a = 556;
24353		t.b = 556;
24354		t.c = 500;
24355		t.d = 556;
24356		t.e = 556;
24357		t.f = 278;
24358		t.g = 556;
24359		t.h = 556;
24360		t.i = 222;
24361		t.j = 222;
24362		t.k = 500;
24363		t.l = 222;
24364		t.m = 833;
24365		t.n = 556;
24366		t.o = 556;
24367		t.p = 556;
24368		t.q = 556;
24369		t.r = 333;
24370		t.s = 500;
24371		t.t = 278;
24372		t.u = 556;
24373		t.v = 500;
24374		t.w = 722;
24375		t.x = 500;
24376		t.y = 500;
24377		t.z = 500;
24378		t.braceleft = 334;
24379		t.bar = 260;
24380		t.braceright = 334;
24381		t.asciitilde = 584;
24382		t.exclamdown = 333;
24383		t.cent = 556;
24384		t.sterling = 556;
24385		t.fraction = 167;
24386		t.yen = 556;
24387		t.florin = 556;
24388		t.section = 556;
24389		t.currency = 556;
24390		t.quotesingle = 191;
24391		t.quotedblleft = 333;
24392		t.guillemotleft = 556;
24393		t.guilsinglleft = 333;
24394		t.guilsinglright = 333;
24395		t.fi = 500;
24396		t.fl = 500;
24397		t.endash = 556;
24398		t.dagger = 556;
24399		t.daggerdbl = 556;
24400		t.periodcentered = 278;
24401		t.paragraph = 537;
24402		t.bullet = 350;
24403		t.quotesinglbase = 222;
24404		t.quotedblbase = 333;
24405		t.quotedblright = 333;
24406		t.guillemotright = 556;
24407		t.ellipsis = 1000;
24408		t.perthousand = 1000;
24409		t.questiondown = 611;
24410		t.grave = 333;
24411		t.acute = 333;
24412		t.circumflex = 333;
24413		t.tilde = 333;
24414		t.macron = 333;
24415		t.breve = 333;
24416		t.dotaccent = 333;
24417		t.dieresis = 333;
24418		t.ring = 333;
24419		t.cedilla = 333;
24420		t.hungarumlaut = 333;
24421		t.ogonek = 333;
24422		t.caron = 333;
24423		t.emdash = 1000;
24424		t.AE = 1000;
24425		t.ordfeminine = 370;
24426		t.Lslash = 556;
24427		t.Oslash = 778;
24428		t.OE = 1000;
24429		t.ordmasculine = 365;
24430		t.ae = 889;
24431		t.dotlessi = 278;
24432		t.lslash = 222;
24433		t.oslash = 611;
24434		t.oe = 944;
24435		t.germandbls = 611;
24436		t.Idieresis = 278;
24437		t.eacute = 556;
24438		t.abreve = 556;
24439		t.uhungarumlaut = 556;
24440		t.ecaron = 556;
24441		t.Ydieresis = 667;
24442		t.divide = 584;
24443		t.Yacute = 667;
24444		t.Acircumflex = 667;
24445		t.aacute = 556;
24446		t.Ucircumflex = 722;
24447		t.yacute = 500;
24448		t.scommaaccent = 500;
24449		t.ecircumflex = 556;
24450		t.Uring = 722;
24451		t.Udieresis = 722;
24452		t.aogonek = 556;
24453		t.Uacute = 722;
24454		t.uogonek = 556;
24455		t.Edieresis = 667;
24456		t.Dcroat = 722;
24457		t.commaaccent = 250;
24458		t.copyright = 737;
24459		t.Emacron = 667;
24460		t.ccaron = 500;
24461		t.aring = 556;
24462		t.Ncommaaccent = 722;
24463		t.lacute = 222;
24464		t.agrave = 556;
24465		t.Tcommaaccent = 611;
24466		t.Cacute = 722;
24467		t.atilde = 556;
24468		t.Edotaccent = 667;
24469		t.scaron = 500;
24470		t.scedilla = 500;
24471		t.iacute = 278;
24472		t.lozenge = 471;
24473		t.Rcaron = 722;
24474		t.Gcommaaccent = 778;
24475		t.ucircumflex = 556;
24476		t.acircumflex = 556;
24477		t.Amacron = 667;
24478		t.rcaron = 333;
24479		t.ccedilla = 500;
24480		t.Zdotaccent = 611;
24481		t.Thorn = 667;
24482		t.Omacron = 778;
24483		t.Racute = 722;
24484		t.Sacute = 667;
24485		t.dcaron = 643;
24486		t.Umacron = 722;
24487		t.uring = 556;
24488		t.threesuperior = 333;
24489		t.Ograve = 778;
24490		t.Agrave = 667;
24491		t.Abreve = 667;
24492		t.multiply = 584;
24493		t.uacute = 556;
24494		t.Tcaron = 611;
24495		t.partialdiff = 476;
24496		t.ydieresis = 500;
24497		t.Nacute = 722;
24498		t.icircumflex = 278;
24499		t.Ecircumflex = 667;
24500		t.adieresis = 556;
24501		t.edieresis = 556;
24502		t.cacute = 500;
24503		t.nacute = 556;
24504		t.umacron = 556;
24505		t.Ncaron = 722;
24506		t.Iacute = 278;
24507		t.plusminus = 584;
24508		t.brokenbar = 260;
24509		t.registered = 737;
24510		t.Gbreve = 778;
24511		t.Idotaccent = 278;
24512		t.summation = 600;
24513		t.Egrave = 667;
24514		t.racute = 333;
24515		t.omacron = 556;
24516		t.Zacute = 611;
24517		t.Zcaron = 611;
24518		t.greaterequal = 549;
24519		t.Eth = 722;
24520		t.Ccedilla = 722;
24521		t.lcommaaccent = 222;
24522		t.tcaron = 317;
24523		t.eogonek = 556;
24524		t.Uogonek = 722;
24525		t.Aacute = 667;
24526		t.Adieresis = 667;
24527		t.egrave = 556;
24528		t.zacute = 500;
24529		t.iogonek = 222;
24530		t.Oacute = 778;
24531		t.oacute = 556;
24532		t.amacron = 556;
24533		t.sacute = 500;
24534		t.idieresis = 278;
24535		t.Ocircumflex = 778;
24536		t.Ugrave = 722;
24537		t.Delta = 612;
24538		t.thorn = 556;
24539		t.twosuperior = 333;
24540		t.Odieresis = 778;
24541		t.mu = 556;
24542		t.igrave = 278;
24543		t.ohungarumlaut = 556;
24544		t.Eogonek = 667;
24545		t.dcroat = 556;
24546		t.threequarters = 834;
24547		t.Scedilla = 667;
24548		t.lcaron = 299;
24549		t.Kcommaaccent = 667;
24550		t.Lacute = 556;
24551		t.trademark = 1000;
24552		t.edotaccent = 556;
24553		t.Igrave = 278;
24554		t.Imacron = 278;
24555		t.Lcaron = 556;
24556		t.onehalf = 834;
24557		t.lessequal = 549;
24558		t.ocircumflex = 556;
24559		t.ntilde = 556;
24560		t.Uhungarumlaut = 722;
24561		t.Eacute = 667;
24562		t.emacron = 556;
24563		t.gbreve = 556;
24564		t.onequarter = 834;
24565		t.Scaron = 667;
24566		t.Scommaaccent = 667;
24567		t.Ohungarumlaut = 778;
24568		t.degree = 400;
24569		t.ograve = 556;
24570		t.Ccaron = 722;
24571		t.ugrave = 556;
24572		t.radical = 453;
24573		t.Dcaron = 722;
24574		t.rcommaaccent = 333;
24575		t.Ntilde = 722;
24576		t.otilde = 556;
24577		t.Rcommaaccent = 722;
24578		t.Lcommaaccent = 556;
24579		t.Atilde = 667;
24580		t.Aogonek = 667;
24581		t.Aring = 667;
24582		t.Otilde = 778;
24583		t.zdotaccent = 500;
24584		t.Ecaron = 667;
24585		t.Iogonek = 278;
24586		t.kcommaaccent = 500;
24587		t.minus = 584;
24588		t.Icircumflex = 278;
24589		t.ncaron = 556;
24590		t.tcommaaccent = 278;
24591		t.logicalnot = 584;
24592		t.odieresis = 556;
24593		t.udieresis = 556;
24594		t.notequal = 549;
24595		t.gcommaaccent = 556;
24596		t.eth = 556;
24597		t.zcaron = 500;
24598		t.ncommaaccent = 556;
24599		t.onesuperior = 333;
24600		t.imacron = 278;
24601		t.Euro = 556;
24602	});
24603	t.Symbol = getLookupTableFactory(function (t) {
24604		t.space = 250;
24605		t.exclam = 333;
24606		t.universal = 713;
24607		t.numbersign = 500;
24608		t.existential = 549;
24609		t.percent = 833;
24610		t.ampersand = 778;
24611		t.suchthat = 439;
24612		t.parenleft = 333;
24613		t.parenright = 333;
24614		t.asteriskmath = 500;
24615		t.plus = 549;
24616		t.comma = 250;
24617		t.minus = 549;
24618		t.period = 250;
24619		t.slash = 278;
24620		t.zero = 500;
24621		t.one = 500;
24622		t.two = 500;
24623		t.three = 500;
24624		t.four = 500;
24625		t.five = 500;
24626		t.six = 500;
24627		t.seven = 500;
24628		t.eight = 500;
24629		t.nine = 500;
24630		t.colon = 278;
24631		t.semicolon = 278;
24632		t.less = 549;
24633		t.equal = 549;
24634		t.greater = 549;
24635		t.question = 444;
24636		t.congruent = 549;
24637		t.Alpha = 722;
24638		t.Beta = 667;
24639		t.Chi = 722;
24640		t.Delta = 612;
24641		t.Epsilon = 611;
24642		t.Phi = 763;
24643		t.Gamma = 603;
24644		t.Eta = 722;
24645		t.Iota = 333;
24646		t.theta1 = 631;
24647		t.Kappa = 722;
24648		t.Lambda = 686;
24649		t.Mu = 889;
24650		t.Nu = 722;
24651		t.Omicron = 722;
24652		t.Pi = 768;
24653		t.Theta = 741;
24654		t.Rho = 556;
24655		t.Sigma = 592;
24656		t.Tau = 611;
24657		t.Upsilon = 690;
24658		t.sigma1 = 439;
24659		t.Omega = 768;
24660		t.Xi = 645;
24661		t.Psi = 795;
24662		t.Zeta = 611;
24663		t.bracketleft = 333;
24664		t.therefore = 863;
24665		t.bracketright = 333;
24666		t.perpendicular = 658;
24667		t.underscore = 500;
24668		t.radicalex = 500;
24669		t.alpha = 631;
24670		t.beta = 549;
24671		t.chi = 549;
24672		t.delta = 494;
24673		t.epsilon = 439;
24674		t.phi = 521;
24675		t.gamma = 411;
24676		t.eta = 603;
24677		t.iota = 329;
24678		t.phi1 = 603;
24679		t.kappa = 549;
24680		t.lambda = 549;
24681		t.mu = 576;
24682		t.nu = 521;
24683		t.omicron = 549;
24684		t.pi = 549;
24685		t.theta = 521;
24686		t.rho = 549;
24687		t.sigma = 603;
24688		t.tau = 439;
24689		t.upsilon = 576;
24690		t.omega1 = 713;
24691		t.omega = 686;
24692		t.xi = 493;
24693		t.psi = 686;
24694		t.zeta = 494;
24695		t.braceleft = 480;
24696		t.bar = 200;
24697		t.braceright = 480;
24698		t.similar = 549;
24699		t.Euro = 750;
24700		t.Upsilon1 = 620;
24701		t.minute = 247;
24702		t.lessequal = 549;
24703		t.fraction = 167;
24704		t.infinity = 713;
24705		t.florin = 500;
24706		t.club = 753;
24707		t.diamond = 753;
24708		t.heart = 753;
24709		t.spade = 753;
24710		t.arrowboth = 1042;
24711		t.arrowleft = 987;
24712		t.arrowup = 603;
24713		t.arrowright = 987;
24714		t.arrowdown = 603;
24715		t.degree = 400;
24716		t.plusminus = 549;
24717		t.second = 411;
24718		t.greaterequal = 549;
24719		t.multiply = 549;
24720		t.proportional = 713;
24721		t.partialdiff = 494;
24722		t.bullet = 460;
24723		t.divide = 549;
24724		t.notequal = 549;
24725		t.equivalence = 549;
24726		t.approxequal = 549;
24727		t.ellipsis = 1000;
24728		t.arrowvertex = 603;
24729		t.arrowhorizex = 1000;
24730		t.carriagereturn = 658;
24731		t.aleph = 823;
24732		t.Ifraktur = 686;
24733		t.Rfraktur = 795;
24734		t.weierstrass = 987;
24735		t.circlemultiply = 768;
24736		t.circleplus = 768;
24737		t.emptyset = 823;
24738		t.intersection = 768;
24739		t.union = 768;
24740		t.propersuperset = 713;
24741		t.reflexsuperset = 713;
24742		t.notsubset = 713;
24743		t.propersubset = 713;
24744		t.reflexsubset = 713;
24745		t.element = 713;
24746		t.notelement = 713;
24747		t.angle = 768;
24748		t.gradient = 713;
24749		t.registerserif = 790;
24750		t.copyrightserif = 790;
24751		t.trademarkserif = 890;
24752		t.product = 823;
24753		t.radical = 549;
24754		t.dotmath = 250;
24755		t.logicalnot = 713;
24756		t.logicaland = 603;
24757		t.logicalor = 603;
24758		t.arrowdblboth = 1042;
24759		t.arrowdblleft = 987;
24760		t.arrowdblup = 603;
24761		t.arrowdblright = 987;
24762		t.arrowdbldown = 603;
24763		t.lozenge = 494;
24764		t.angleleft = 329;
24765		t.registersans = 790;
24766		t.copyrightsans = 790;
24767		t.trademarksans = 786;
24768		t.summation = 713;
24769		t.parenlefttp = 384;
24770		t.parenleftex = 384;
24771		t.parenleftbt = 384;
24772		t.bracketlefttp = 384;
24773		t.bracketleftex = 384;
24774		t.bracketleftbt = 384;
24775		t.bracelefttp = 494;
24776		t.braceleftmid = 494;
24777		t.braceleftbt = 494;
24778		t.braceex = 494;
24779		t.angleright = 329;
24780		t.integral = 274;
24781		t.integraltp = 686;
24782		t.integralex = 686;
24783		t.integralbt = 686;
24784		t.parenrighttp = 384;
24785		t.parenrightex = 384;
24786		t.parenrightbt = 384;
24787		t.bracketrighttp = 384;
24788		t.bracketrightex = 384;
24789		t.bracketrightbt = 384;
24790		t.bracerighttp = 494;
24791		t.bracerightmid = 494;
24792		t.bracerightbt = 494;
24793		t.apple = 790;
24794	});
24795	t["Times-Roman"] = getLookupTableFactory(function (t) {
24796		t.space = 250;
24797		t.exclam = 333;
24798		t.quotedbl = 408;
24799		t.numbersign = 500;
24800		t.dollar = 500;
24801		t.percent = 833;
24802		t.ampersand = 778;
24803		t.quoteright = 333;
24804		t.parenleft = 333;
24805		t.parenright = 333;
24806		t.asterisk = 500;
24807		t.plus = 564;
24808		t.comma = 250;
24809		t.hyphen = 333;
24810		t.period = 250;
24811		t.slash = 278;
24812		t.zero = 500;
24813		t.one = 500;
24814		t.two = 500;
24815		t.three = 500;
24816		t.four = 500;
24817		t.five = 500;
24818		t.six = 500;
24819		t.seven = 500;
24820		t.eight = 500;
24821		t.nine = 500;
24822		t.colon = 278;
24823		t.semicolon = 278;
24824		t.less = 564;
24825		t.equal = 564;
24826		t.greater = 564;
24827		t.question = 444;
24828		t.at = 921;
24829		t.A = 722;
24830		t.B = 667;
24831		t.C = 667;
24832		t.D = 722;
24833		t.E = 611;
24834		t.F = 556;
24835		t.G = 722;
24836		t.H = 722;
24837		t.I = 333;
24838		t.J = 389;
24839		t.K = 722;
24840		t.L = 611;
24841		t.M = 889;
24842		t.N = 722;
24843		t.O = 722;
24844		t.P = 556;
24845		t.Q = 722;
24846		t.R = 667;
24847		t.S = 556;
24848		t.T = 611;
24849		t.U = 722;
24850		t.V = 722;
24851		t.W = 944;
24852		t.X = 722;
24853		t.Y = 722;
24854		t.Z = 611;
24855		t.bracketleft = 333;
24856		t.backslash = 278;
24857		t.bracketright = 333;
24858		t.asciicircum = 469;
24859		t.underscore = 500;
24860		t.quoteleft = 333;
24861		t.a = 444;
24862		t.b = 500;
24863		t.c = 444;
24864		t.d = 500;
24865		t.e = 444;
24866		t.f = 333;
24867		t.g = 500;
24868		t.h = 500;
24869		t.i = 278;
24870		t.j = 278;
24871		t.k = 500;
24872		t.l = 278;
24873		t.m = 778;
24874		t.n = 500;
24875		t.o = 500;
24876		t.p = 500;
24877		t.q = 500;
24878		t.r = 333;
24879		t.s = 389;
24880		t.t = 278;
24881		t.u = 500;
24882		t.v = 500;
24883		t.w = 722;
24884		t.x = 500;
24885		t.y = 500;
24886		t.z = 444;
24887		t.braceleft = 480;
24888		t.bar = 200;
24889		t.braceright = 480;
24890		t.asciitilde = 541;
24891		t.exclamdown = 333;
24892		t.cent = 500;
24893		t.sterling = 500;
24894		t.fraction = 167;
24895		t.yen = 500;
24896		t.florin = 500;
24897		t.section = 500;
24898		t.currency = 500;
24899		t.quotesingle = 180;
24900		t.quotedblleft = 444;
24901		t.guillemotleft = 500;
24902		t.guilsinglleft = 333;
24903		t.guilsinglright = 333;
24904		t.fi = 556;
24905		t.fl = 556;
24906		t.endash = 500;
24907		t.dagger = 500;
24908		t.daggerdbl = 500;
24909		t.periodcentered = 250;
24910		t.paragraph = 453;
24911		t.bullet = 350;
24912		t.quotesinglbase = 333;
24913		t.quotedblbase = 444;
24914		t.quotedblright = 444;
24915		t.guillemotright = 500;
24916		t.ellipsis = 1000;
24917		t.perthousand = 1000;
24918		t.questiondown = 444;
24919		t.grave = 333;
24920		t.acute = 333;
24921		t.circumflex = 333;
24922		t.tilde = 333;
24923		t.macron = 333;
24924		t.breve = 333;
24925		t.dotaccent = 333;
24926		t.dieresis = 333;
24927		t.ring = 333;
24928		t.cedilla = 333;
24929		t.hungarumlaut = 333;
24930		t.ogonek = 333;
24931		t.caron = 333;
24932		t.emdash = 1000;
24933		t.AE = 889;
24934		t.ordfeminine = 276;
24935		t.Lslash = 611;
24936		t.Oslash = 722;
24937		t.OE = 889;
24938		t.ordmasculine = 310;
24939		t.ae = 667;
24940		t.dotlessi = 278;
24941		t.lslash = 278;
24942		t.oslash = 500;
24943		t.oe = 722;
24944		t.germandbls = 500;
24945		t.Idieresis = 333;
24946		t.eacute = 444;
24947		t.abreve = 444;
24948		t.uhungarumlaut = 500;
24949		t.ecaron = 444;
24950		t.Ydieresis = 722;
24951		t.divide = 564;
24952		t.Yacute = 722;
24953		t.Acircumflex = 722;
24954		t.aacute = 444;
24955		t.Ucircumflex = 722;
24956		t.yacute = 500;
24957		t.scommaaccent = 389;
24958		t.ecircumflex = 444;
24959		t.Uring = 722;
24960		t.Udieresis = 722;
24961		t.aogonek = 444;
24962		t.Uacute = 722;
24963		t.uogonek = 500;
24964		t.Edieresis = 611;
24965		t.Dcroat = 722;
24966		t.commaaccent = 250;
24967		t.copyright = 760;
24968		t.Emacron = 611;
24969		t.ccaron = 444;
24970		t.aring = 444;
24971		t.Ncommaaccent = 722;
24972		t.lacute = 278;
24973		t.agrave = 444;
24974		t.Tcommaaccent = 611;
24975		t.Cacute = 667;
24976		t.atilde = 444;
24977		t.Edotaccent = 611;
24978		t.scaron = 389;
24979		t.scedilla = 389;
24980		t.iacute = 278;
24981		t.lozenge = 471;
24982		t.Rcaron = 667;
24983		t.Gcommaaccent = 722;
24984		t.ucircumflex = 500;
24985		t.acircumflex = 444;
24986		t.Amacron = 722;
24987		t.rcaron = 333;
24988		t.ccedilla = 444;
24989		t.Zdotaccent = 611;
24990		t.Thorn = 556;
24991		t.Omacron = 722;
24992		t.Racute = 667;
24993		t.Sacute = 556;
24994		t.dcaron = 588;
24995		t.Umacron = 722;
24996		t.uring = 500;
24997		t.threesuperior = 300;
24998		t.Ograve = 722;
24999		t.Agrave = 722;
25000		t.Abreve = 722;
25001		t.multiply = 564;
25002		t.uacute = 500;
25003		t.Tcaron = 611;
25004		t.partialdiff = 476;
25005		t.ydieresis = 500;
25006		t.Nacute = 722;
25007		t.icircumflex = 278;
25008		t.Ecircumflex = 611;
25009		t.adieresis = 444;
25010		t.edieresis = 444;
25011		t.cacute = 444;
25012		t.nacute = 500;
25013		t.umacron = 500;
25014		t.Ncaron = 722;
25015		t.Iacute = 333;
25016		t.plusminus = 564;
25017		t.brokenbar = 200;
25018		t.registered = 760;
25019		t.Gbreve = 722;
25020		t.Idotaccent = 333;
25021		t.summation = 600;
25022		t.Egrave = 611;
25023		t.racute = 333;
25024		t.omacron = 500;
25025		t.Zacute = 611;
25026		t.Zcaron = 611;
25027		t.greaterequal = 549;
25028		t.Eth = 722;
25029		t.Ccedilla = 667;
25030		t.lcommaaccent = 278;
25031		t.tcaron = 326;
25032		t.eogonek = 444;
25033		t.Uogonek = 722;
25034		t.Aacute = 722;
25035		t.Adieresis = 722;
25036		t.egrave = 444;
25037		t.zacute = 444;
25038		t.iogonek = 278;
25039		t.Oacute = 722;
25040		t.oacute = 500;
25041		t.amacron = 444;
25042		t.sacute = 389;
25043		t.idieresis = 278;
25044		t.Ocircumflex = 722;
25045		t.Ugrave = 722;
25046		t.Delta = 612;
25047		t.thorn = 500;
25048		t.twosuperior = 300;
25049		t.Odieresis = 722;
25050		t.mu = 500;
25051		t.igrave = 278;
25052		t.ohungarumlaut = 500;
25053		t.Eogonek = 611;
25054		t.dcroat = 500;
25055		t.threequarters = 750;
25056		t.Scedilla = 556;
25057		t.lcaron = 344;
25058		t.Kcommaaccent = 722;
25059		t.Lacute = 611;
25060		t.trademark = 980;
25061		t.edotaccent = 444;
25062		t.Igrave = 333;
25063		t.Imacron = 333;
25064		t.Lcaron = 611;
25065		t.onehalf = 750;
25066		t.lessequal = 549;
25067		t.ocircumflex = 500;
25068		t.ntilde = 500;
25069		t.Uhungarumlaut = 722;
25070		t.Eacute = 611;
25071		t.emacron = 444;
25072		t.gbreve = 500;
25073		t.onequarter = 750;
25074		t.Scaron = 556;
25075		t.Scommaaccent = 556;
25076		t.Ohungarumlaut = 722;
25077		t.degree = 400;
25078		t.ograve = 500;
25079		t.Ccaron = 667;
25080		t.ugrave = 500;
25081		t.radical = 453;
25082		t.Dcaron = 722;
25083		t.rcommaaccent = 333;
25084		t.Ntilde = 722;
25085		t.otilde = 500;
25086		t.Rcommaaccent = 667;
25087		t.Lcommaaccent = 611;
25088		t.Atilde = 722;
25089		t.Aogonek = 722;
25090		t.Aring = 722;
25091		t.Otilde = 722;
25092		t.zdotaccent = 444;
25093		t.Ecaron = 611;
25094		t.Iogonek = 333;
25095		t.kcommaaccent = 500;
25096		t.minus = 564;
25097		t.Icircumflex = 333;
25098		t.ncaron = 500;
25099		t.tcommaaccent = 278;
25100		t.logicalnot = 564;
25101		t.odieresis = 500;
25102		t.udieresis = 500;
25103		t.notequal = 549;
25104		t.gcommaaccent = 500;
25105		t.eth = 500;
25106		t.zcaron = 444;
25107		t.ncommaaccent = 500;
25108		t.onesuperior = 300;
25109		t.imacron = 278;
25110		t.Euro = 500;
25111	});
25112	t["Times-Bold"] = getLookupTableFactory(function (t) {
25113		t.space = 250;
25114		t.exclam = 333;
25115		t.quotedbl = 555;
25116		t.numbersign = 500;
25117		t.dollar = 500;
25118		t.percent = 1000;
25119		t.ampersand = 833;
25120		t.quoteright = 333;
25121		t.parenleft = 333;
25122		t.parenright = 333;
25123		t.asterisk = 500;
25124		t.plus = 570;
25125		t.comma = 250;
25126		t.hyphen = 333;
25127		t.period = 250;
25128		t.slash = 278;
25129		t.zero = 500;
25130		t.one = 500;
25131		t.two = 500;
25132		t.three = 500;
25133		t.four = 500;
25134		t.five = 500;
25135		t.six = 500;
25136		t.seven = 500;
25137		t.eight = 500;
25138		t.nine = 500;
25139		t.colon = 333;
25140		t.semicolon = 333;
25141		t.less = 570;
25142		t.equal = 570;
25143		t.greater = 570;
25144		t.question = 500;
25145		t.at = 930;
25146		t.A = 722;
25147		t.B = 667;
25148		t.C = 722;
25149		t.D = 722;
25150		t.E = 667;
25151		t.F = 611;
25152		t.G = 778;
25153		t.H = 778;
25154		t.I = 389;
25155		t.J = 500;
25156		t.K = 778;
25157		t.L = 667;
25158		t.M = 944;
25159		t.N = 722;
25160		t.O = 778;
25161		t.P = 611;
25162		t.Q = 778;
25163		t.R = 722;
25164		t.S = 556;
25165		t.T = 667;
25166		t.U = 722;
25167		t.V = 722;
25168		t.W = 1000;
25169		t.X = 722;
25170		t.Y = 722;
25171		t.Z = 667;
25172		t.bracketleft = 333;
25173		t.backslash = 278;
25174		t.bracketright = 333;
25175		t.asciicircum = 581;
25176		t.underscore = 500;
25177		t.quoteleft = 333;
25178		t.a = 500;
25179		t.b = 556;
25180		t.c = 444;
25181		t.d = 556;
25182		t.e = 444;
25183		t.f = 333;
25184		t.g = 500;
25185		t.h = 556;
25186		t.i = 278;
25187		t.j = 333;
25188		t.k = 556;
25189		t.l = 278;
25190		t.m = 833;
25191		t.n = 556;
25192		t.o = 500;
25193		t.p = 556;
25194		t.q = 556;
25195		t.r = 444;
25196		t.s = 389;
25197		t.t = 333;
25198		t.u = 556;
25199		t.v = 500;
25200		t.w = 722;
25201		t.x = 500;
25202		t.y = 500;
25203		t.z = 444;
25204		t.braceleft = 394;
25205		t.bar = 220;
25206		t.braceright = 394;
25207		t.asciitilde = 520;
25208		t.exclamdown = 333;
25209		t.cent = 500;
25210		t.sterling = 500;
25211		t.fraction = 167;
25212		t.yen = 500;
25213		t.florin = 500;
25214		t.section = 500;
25215		t.currency = 500;
25216		t.quotesingle = 278;
25217		t.quotedblleft = 500;
25218		t.guillemotleft = 500;
25219		t.guilsinglleft = 333;
25220		t.guilsinglright = 333;
25221		t.fi = 556;
25222		t.fl = 556;
25223		t.endash = 500;
25224		t.dagger = 500;
25225		t.daggerdbl = 500;
25226		t.periodcentered = 250;
25227		t.paragraph = 540;
25228		t.bullet = 350;
25229		t.quotesinglbase = 333;
25230		t.quotedblbase = 500;
25231		t.quotedblright = 500;
25232		t.guillemotright = 500;
25233		t.ellipsis = 1000;
25234		t.perthousand = 1000;
25235		t.questiondown = 500;
25236		t.grave = 333;
25237		t.acute = 333;
25238		t.circumflex = 333;
25239		t.tilde = 333;
25240		t.macron = 333;
25241		t.breve = 333;
25242		t.dotaccent = 333;
25243		t.dieresis = 333;
25244		t.ring = 333;
25245		t.cedilla = 333;
25246		t.hungarumlaut = 333;
25247		t.ogonek = 333;
25248		t.caron = 333;
25249		t.emdash = 1000;
25250		t.AE = 1000;
25251		t.ordfeminine = 300;
25252		t.Lslash = 667;
25253		t.Oslash = 778;
25254		t.OE = 1000;
25255		t.ordmasculine = 330;
25256		t.ae = 722;
25257		t.dotlessi = 278;
25258		t.lslash = 278;
25259		t.oslash = 500;
25260		t.oe = 722;
25261		t.germandbls = 556;
25262		t.Idieresis = 389;
25263		t.eacute = 444;
25264		t.abreve = 500;
25265		t.uhungarumlaut = 556;
25266		t.ecaron = 444;
25267		t.Ydieresis = 722;
25268		t.divide = 570;
25269		t.Yacute = 722;
25270		t.Acircumflex = 722;
25271		t.aacute = 500;
25272		t.Ucircumflex = 722;
25273		t.yacute = 500;
25274		t.scommaaccent = 389;
25275		t.ecircumflex = 444;
25276		t.Uring = 722;
25277		t.Udieresis = 722;
25278		t.aogonek = 500;
25279		t.Uacute = 722;
25280		t.uogonek = 556;
25281		t.Edieresis = 667;
25282		t.Dcroat = 722;
25283		t.commaaccent = 250;
25284		t.copyright = 747;
25285		t.Emacron = 667;
25286		t.ccaron = 444;
25287		t.aring = 500;
25288		t.Ncommaaccent = 722;
25289		t.lacute = 278;
25290		t.agrave = 500;
25291		t.Tcommaaccent = 667;
25292		t.Cacute = 722;
25293		t.atilde = 500;
25294		t.Edotaccent = 667;
25295		t.scaron = 389;
25296		t.scedilla = 389;
25297		t.iacute = 278;
25298		t.lozenge = 494;
25299		t.Rcaron = 722;
25300		t.Gcommaaccent = 778;
25301		t.ucircumflex = 556;
25302		t.acircumflex = 500;
25303		t.Amacron = 722;
25304		t.rcaron = 444;
25305		t.ccedilla = 444;
25306		t.Zdotaccent = 667;
25307		t.Thorn = 611;
25308		t.Omacron = 778;
25309		t.Racute = 722;
25310		t.Sacute = 556;
25311		t.dcaron = 672;
25312		t.Umacron = 722;
25313		t.uring = 556;
25314		t.threesuperior = 300;
25315		t.Ograve = 778;
25316		t.Agrave = 722;
25317		t.Abreve = 722;
25318		t.multiply = 570;
25319		t.uacute = 556;
25320		t.Tcaron = 667;
25321		t.partialdiff = 494;
25322		t.ydieresis = 500;
25323		t.Nacute = 722;
25324		t.icircumflex = 278;
25325		t.Ecircumflex = 667;
25326		t.adieresis = 500;
25327		t.edieresis = 444;
25328		t.cacute = 444;
25329		t.nacute = 556;
25330		t.umacron = 556;
25331		t.Ncaron = 722;
25332		t.Iacute = 389;
25333		t.plusminus = 570;
25334		t.brokenbar = 220;
25335		t.registered = 747;
25336		t.Gbreve = 778;
25337		t.Idotaccent = 389;
25338		t.summation = 600;
25339		t.Egrave = 667;
25340		t.racute = 444;
25341		t.omacron = 500;
25342		t.Zacute = 667;
25343		t.Zcaron = 667;
25344		t.greaterequal = 549;
25345		t.Eth = 722;
25346		t.Ccedilla = 722;
25347		t.lcommaaccent = 278;
25348		t.tcaron = 416;
25349		t.eogonek = 444;
25350		t.Uogonek = 722;
25351		t.Aacute = 722;
25352		t.Adieresis = 722;
25353		t.egrave = 444;
25354		t.zacute = 444;
25355		t.iogonek = 278;
25356		t.Oacute = 778;
25357		t.oacute = 500;
25358		t.amacron = 500;
25359		t.sacute = 389;
25360		t.idieresis = 278;
25361		t.Ocircumflex = 778;
25362		t.Ugrave = 722;
25363		t.Delta = 612;
25364		t.thorn = 556;
25365		t.twosuperior = 300;
25366		t.Odieresis = 778;
25367		t.mu = 556;
25368		t.igrave = 278;
25369		t.ohungarumlaut = 500;
25370		t.Eogonek = 667;
25371		t.dcroat = 556;
25372		t.threequarters = 750;
25373		t.Scedilla = 556;
25374		t.lcaron = 394;
25375		t.Kcommaaccent = 778;
25376		t.Lacute = 667;
25377		t.trademark = 1000;
25378		t.edotaccent = 444;
25379		t.Igrave = 389;
25380		t.Imacron = 389;
25381		t.Lcaron = 667;
25382		t.onehalf = 750;
25383		t.lessequal = 549;
25384		t.ocircumflex = 500;
25385		t.ntilde = 556;
25386		t.Uhungarumlaut = 722;
25387		t.Eacute = 667;
25388		t.emacron = 444;
25389		t.gbreve = 500;
25390		t.onequarter = 750;
25391		t.Scaron = 556;
25392		t.Scommaaccent = 556;
25393		t.Ohungarumlaut = 778;
25394		t.degree = 400;
25395		t.ograve = 500;
25396		t.Ccaron = 722;
25397		t.ugrave = 556;
25398		t.radical = 549;
25399		t.Dcaron = 722;
25400		t.rcommaaccent = 444;
25401		t.Ntilde = 722;
25402		t.otilde = 500;
25403		t.Rcommaaccent = 722;
25404		t.Lcommaaccent = 667;
25405		t.Atilde = 722;
25406		t.Aogonek = 722;
25407		t.Aring = 722;
25408		t.Otilde = 778;
25409		t.zdotaccent = 444;
25410		t.Ecaron = 667;
25411		t.Iogonek = 389;
25412		t.kcommaaccent = 556;
25413		t.minus = 570;
25414		t.Icircumflex = 389;
25415		t.ncaron = 556;
25416		t.tcommaaccent = 333;
25417		t.logicalnot = 570;
25418		t.odieresis = 500;
25419		t.udieresis = 556;
25420		t.notequal = 549;
25421		t.gcommaaccent = 500;
25422		t.eth = 500;
25423		t.zcaron = 444;
25424		t.ncommaaccent = 556;
25425		t.onesuperior = 300;
25426		t.imacron = 278;
25427		t.Euro = 500;
25428	});
25429	t["Times-BoldItalic"] = getLookupTableFactory(function (t) {
25430		t.space = 250;
25431		t.exclam = 389;
25432		t.quotedbl = 555;
25433		t.numbersign = 500;
25434		t.dollar = 500;
25435		t.percent = 833;
25436		t.ampersand = 778;
25437		t.quoteright = 333;
25438		t.parenleft = 333;
25439		t.parenright = 333;
25440		t.asterisk = 500;
25441		t.plus = 570;
25442		t.comma = 250;
25443		t.hyphen = 333;
25444		t.period = 250;
25445		t.slash = 278;
25446		t.zero = 500;
25447		t.one = 500;
25448		t.two = 500;
25449		t.three = 500;
25450		t.four = 500;
25451		t.five = 500;
25452		t.six = 500;
25453		t.seven = 500;
25454		t.eight = 500;
25455		t.nine = 500;
25456		t.colon = 333;
25457		t.semicolon = 333;
25458		t.less = 570;
25459		t.equal = 570;
25460		t.greater = 570;
25461		t.question = 500;
25462		t.at = 832;
25463		t.A = 667;
25464		t.B = 667;
25465		t.C = 667;
25466		t.D = 722;
25467		t.E = 667;
25468		t.F = 667;
25469		t.G = 722;
25470		t.H = 778;
25471		t.I = 389;
25472		t.J = 500;
25473		t.K = 667;
25474		t.L = 611;
25475		t.M = 889;
25476		t.N = 722;
25477		t.O = 722;
25478		t.P = 611;
25479		t.Q = 722;
25480		t.R = 667;
25481		t.S = 556;
25482		t.T = 611;
25483		t.U = 722;
25484		t.V = 667;
25485		t.W = 889;
25486		t.X = 667;
25487		t.Y = 611;
25488		t.Z = 611;
25489		t.bracketleft = 333;
25490		t.backslash = 278;
25491		t.bracketright = 333;
25492		t.asciicircum = 570;
25493		t.underscore = 500;
25494		t.quoteleft = 333;
25495		t.a = 500;
25496		t.b = 500;
25497		t.c = 444;
25498		t.d = 500;
25499		t.e = 444;
25500		t.f = 333;
25501		t.g = 500;
25502		t.h = 556;
25503		t.i = 278;
25504		t.j = 278;
25505		t.k = 500;
25506		t.l = 278;
25507		t.m = 778;
25508		t.n = 556;
25509		t.o = 500;
25510		t.p = 500;
25511		t.q = 500;
25512		t.r = 389;
25513		t.s = 389;
25514		t.t = 278;
25515		t.u = 556;
25516		t.v = 444;
25517		t.w = 667;
25518		t.x = 500;
25519		t.y = 444;
25520		t.z = 389;
25521		t.braceleft = 348;
25522		t.bar = 220;
25523		t.braceright = 348;
25524		t.asciitilde = 570;
25525		t.exclamdown = 389;
25526		t.cent = 500;
25527		t.sterling = 500;
25528		t.fraction = 167;
25529		t.yen = 500;
25530		t.florin = 500;
25531		t.section = 500;
25532		t.currency = 500;
25533		t.quotesingle = 278;
25534		t.quotedblleft = 500;
25535		t.guillemotleft = 500;
25536		t.guilsinglleft = 333;
25537		t.guilsinglright = 333;
25538		t.fi = 556;
25539		t.fl = 556;
25540		t.endash = 500;
25541		t.dagger = 500;
25542		t.daggerdbl = 500;
25543		t.periodcentered = 250;
25544		t.paragraph = 500;
25545		t.bullet = 350;
25546		t.quotesinglbase = 333;
25547		t.quotedblbase = 500;
25548		t.quotedblright = 500;
25549		t.guillemotright = 500;
25550		t.ellipsis = 1000;
25551		t.perthousand = 1000;
25552		t.questiondown = 500;
25553		t.grave = 333;
25554		t.acute = 333;
25555		t.circumflex = 333;
25556		t.tilde = 333;
25557		t.macron = 333;
25558		t.breve = 333;
25559		t.dotaccent = 333;
25560		t.dieresis = 333;
25561		t.ring = 333;
25562		t.cedilla = 333;
25563		t.hungarumlaut = 333;
25564		t.ogonek = 333;
25565		t.caron = 333;
25566		t.emdash = 1000;
25567		t.AE = 944;
25568		t.ordfeminine = 266;
25569		t.Lslash = 611;
25570		t.Oslash = 722;
25571		t.OE = 944;
25572		t.ordmasculine = 300;
25573		t.ae = 722;
25574		t.dotlessi = 278;
25575		t.lslash = 278;
25576		t.oslash = 500;
25577		t.oe = 722;
25578		t.germandbls = 500;
25579		t.Idieresis = 389;
25580		t.eacute = 444;
25581		t.abreve = 500;
25582		t.uhungarumlaut = 556;
25583		t.ecaron = 444;
25584		t.Ydieresis = 611;
25585		t.divide = 570;
25586		t.Yacute = 611;
25587		t.Acircumflex = 667;
25588		t.aacute = 500;
25589		t.Ucircumflex = 722;
25590		t.yacute = 444;
25591		t.scommaaccent = 389;
25592		t.ecircumflex = 444;
25593		t.Uring = 722;
25594		t.Udieresis = 722;
25595		t.aogonek = 500;
25596		t.Uacute = 722;
25597		t.uogonek = 556;
25598		t.Edieresis = 667;
25599		t.Dcroat = 722;
25600		t.commaaccent = 250;
25601		t.copyright = 747;
25602		t.Emacron = 667;
25603		t.ccaron = 444;
25604		t.aring = 500;
25605		t.Ncommaaccent = 722;
25606		t.lacute = 278;
25607		t.agrave = 500;
25608		t.Tcommaaccent = 611;
25609		t.Cacute = 667;
25610		t.atilde = 500;
25611		t.Edotaccent = 667;
25612		t.scaron = 389;
25613		t.scedilla = 389;
25614		t.iacute = 278;
25615		t.lozenge = 494;
25616		t.Rcaron = 667;
25617		t.Gcommaaccent = 722;
25618		t.ucircumflex = 556;
25619		t.acircumflex = 500;
25620		t.Amacron = 667;
25621		t.rcaron = 389;
25622		t.ccedilla = 444;
25623		t.Zdotaccent = 611;
25624		t.Thorn = 611;
25625		t.Omacron = 722;
25626		t.Racute = 667;
25627		t.Sacute = 556;
25628		t.dcaron = 608;
25629		t.Umacron = 722;
25630		t.uring = 556;
25631		t.threesuperior = 300;
25632		t.Ograve = 722;
25633		t.Agrave = 667;
25634		t.Abreve = 667;
25635		t.multiply = 570;
25636		t.uacute = 556;
25637		t.Tcaron = 611;
25638		t.partialdiff = 494;
25639		t.ydieresis = 444;
25640		t.Nacute = 722;
25641		t.icircumflex = 278;
25642		t.Ecircumflex = 667;
25643		t.adieresis = 500;
25644		t.edieresis = 444;
25645		t.cacute = 444;
25646		t.nacute = 556;
25647		t.umacron = 556;
25648		t.Ncaron = 722;
25649		t.Iacute = 389;
25650		t.plusminus = 570;
25651		t.brokenbar = 220;
25652		t.registered = 747;
25653		t.Gbreve = 722;
25654		t.Idotaccent = 389;
25655		t.summation = 600;
25656		t.Egrave = 667;
25657		t.racute = 389;
25658		t.omacron = 500;
25659		t.Zacute = 611;
25660		t.Zcaron = 611;
25661		t.greaterequal = 549;
25662		t.Eth = 722;
25663		t.Ccedilla = 667;
25664		t.lcommaaccent = 278;
25665		t.tcaron = 366;
25666		t.eogonek = 444;
25667		t.Uogonek = 722;
25668		t.Aacute = 667;
25669		t.Adieresis = 667;
25670		t.egrave = 444;
25671		t.zacute = 389;
25672		t.iogonek = 278;
25673		t.Oacute = 722;
25674		t.oacute = 500;
25675		t.amacron = 500;
25676		t.sacute = 389;
25677		t.idieresis = 278;
25678		t.Ocircumflex = 722;
25679		t.Ugrave = 722;
25680		t.Delta = 612;
25681		t.thorn = 500;
25682		t.twosuperior = 300;
25683		t.Odieresis = 722;
25684		t.mu = 576;
25685		t.igrave = 278;
25686		t.ohungarumlaut = 500;
25687		t.Eogonek = 667;
25688		t.dcroat = 500;
25689		t.threequarters = 750;
25690		t.Scedilla = 556;
25691		t.lcaron = 382;
25692		t.Kcommaaccent = 667;
25693		t.Lacute = 611;
25694		t.trademark = 1000;
25695		t.edotaccent = 444;
25696		t.Igrave = 389;
25697		t.Imacron = 389;
25698		t.Lcaron = 611;
25699		t.onehalf = 750;
25700		t.lessequal = 549;
25701		t.ocircumflex = 500;
25702		t.ntilde = 556;
25703		t.Uhungarumlaut = 722;
25704		t.Eacute = 667;
25705		t.emacron = 444;
25706		t.gbreve = 500;
25707		t.onequarter = 750;
25708		t.Scaron = 556;
25709		t.Scommaaccent = 556;
25710		t.Ohungarumlaut = 722;
25711		t.degree = 400;
25712		t.ograve = 500;
25713		t.Ccaron = 667;
25714		t.ugrave = 556;
25715		t.radical = 549;
25716		t.Dcaron = 722;
25717		t.rcommaaccent = 389;
25718		t.Ntilde = 722;
25719		t.otilde = 500;
25720		t.Rcommaaccent = 667;
25721		t.Lcommaaccent = 611;
25722		t.Atilde = 667;
25723		t.Aogonek = 667;
25724		t.Aring = 667;
25725		t.Otilde = 722;
25726		t.zdotaccent = 389;
25727		t.Ecaron = 667;
25728		t.Iogonek = 389;
25729		t.kcommaaccent = 500;
25730		t.minus = 606;
25731		t.Icircumflex = 389;
25732		t.ncaron = 556;
25733		t.tcommaaccent = 278;
25734		t.logicalnot = 606;
25735		t.odieresis = 500;
25736		t.udieresis = 556;
25737		t.notequal = 549;
25738		t.gcommaaccent = 500;
25739		t.eth = 500;
25740		t.zcaron = 389;
25741		t.ncommaaccent = 556;
25742		t.onesuperior = 300;
25743		t.imacron = 278;
25744		t.Euro = 500;
25745	});
25746	t["Times-Italic"] = getLookupTableFactory(function (t) {
25747		t.space = 250;
25748		t.exclam = 333;
25749		t.quotedbl = 420;
25750		t.numbersign = 500;
25751		t.dollar = 500;
25752		t.percent = 833;
25753		t.ampersand = 778;
25754		t.quoteright = 333;
25755		t.parenleft = 333;
25756		t.parenright = 333;
25757		t.asterisk = 500;
25758		t.plus = 675;
25759		t.comma = 250;
25760		t.hyphen = 333;
25761		t.period = 250;
25762		t.slash = 278;
25763		t.zero = 500;
25764		t.one = 500;
25765		t.two = 500;
25766		t.three = 500;
25767		t.four = 500;
25768		t.five = 500;
25769		t.six = 500;
25770		t.seven = 500;
25771		t.eight = 500;
25772		t.nine = 500;
25773		t.colon = 333;
25774		t.semicolon = 333;
25775		t.less = 675;
25776		t.equal = 675;
25777		t.greater = 675;
25778		t.question = 500;
25779		t.at = 920;
25780		t.A = 611;
25781		t.B = 611;
25782		t.C = 667;
25783		t.D = 722;
25784		t.E = 611;
25785		t.F = 611;
25786		t.G = 722;
25787		t.H = 722;
25788		t.I = 333;
25789		t.J = 444;
25790		t.K = 667;
25791		t.L = 556;
25792		t.M = 833;
25793		t.N = 667;
25794		t.O = 722;
25795		t.P = 611;
25796		t.Q = 722;
25797		t.R = 611;
25798		t.S = 500;
25799		t.T = 556;
25800		t.U = 722;
25801		t.V = 611;
25802		t.W = 833;
25803		t.X = 611;
25804		t.Y = 556;
25805		t.Z = 556;
25806		t.bracketleft = 389;
25807		t.backslash = 278;
25808		t.bracketright = 389;
25809		t.asciicircum = 422;
25810		t.underscore = 500;
25811		t.quoteleft = 333;
25812		t.a = 500;
25813		t.b = 500;
25814		t.c = 444;
25815		t.d = 500;
25816		t.e = 444;
25817		t.f = 278;
25818		t.g = 500;
25819		t.h = 500;
25820		t.i = 278;
25821		t.j = 278;
25822		t.k = 444;
25823		t.l = 278;
25824		t.m = 722;
25825		t.n = 500;
25826		t.o = 500;
25827		t.p = 500;
25828		t.q = 500;
25829		t.r = 389;
25830		t.s = 389;
25831		t.t = 278;
25832		t.u = 500;
25833		t.v = 444;
25834		t.w = 667;
25835		t.x = 444;
25836		t.y = 444;
25837		t.z = 389;
25838		t.braceleft = 400;
25839		t.bar = 275;
25840		t.braceright = 400;
25841		t.asciitilde = 541;
25842		t.exclamdown = 389;
25843		t.cent = 500;
25844		t.sterling = 500;
25845		t.fraction = 167;
25846		t.yen = 500;
25847		t.florin = 500;
25848		t.section = 500;
25849		t.currency = 500;
25850		t.quotesingle = 214;
25851		t.quotedblleft = 556;
25852		t.guillemotleft = 500;
25853		t.guilsinglleft = 333;
25854		t.guilsinglright = 333;
25855		t.fi = 500;
25856		t.fl = 500;
25857		t.endash = 500;
25858		t.dagger = 500;
25859		t.daggerdbl = 500;
25860		t.periodcentered = 250;
25861		t.paragraph = 523;
25862		t.bullet = 350;
25863		t.quotesinglbase = 333;
25864		t.quotedblbase = 556;
25865		t.quotedblright = 556;
25866		t.guillemotright = 500;
25867		t.ellipsis = 889;
25868		t.perthousand = 1000;
25869		t.questiondown = 500;
25870		t.grave = 333;
25871		t.acute = 333;
25872		t.circumflex = 333;
25873		t.tilde = 333;
25874		t.macron = 333;
25875		t.breve = 333;
25876		t.dotaccent = 333;
25877		t.dieresis = 333;
25878		t.ring = 333;
25879		t.cedilla = 333;
25880		t.hungarumlaut = 333;
25881		t.ogonek = 333;
25882		t.caron = 333;
25883		t.emdash = 889;
25884		t.AE = 889;
25885		t.ordfeminine = 276;
25886		t.Lslash = 556;
25887		t.Oslash = 722;
25888		t.OE = 944;
25889		t.ordmasculine = 310;
25890		t.ae = 667;
25891		t.dotlessi = 278;
25892		t.lslash = 278;
25893		t.oslash = 500;
25894		t.oe = 667;
25895		t.germandbls = 500;
25896		t.Idieresis = 333;
25897		t.eacute = 444;
25898		t.abreve = 500;
25899		t.uhungarumlaut = 500;
25900		t.ecaron = 444;
25901		t.Ydieresis = 556;
25902		t.divide = 675;
25903		t.Yacute = 556;
25904		t.Acircumflex = 611;
25905		t.aacute = 500;
25906		t.Ucircumflex = 722;
25907		t.yacute = 444;
25908		t.scommaaccent = 389;
25909		t.ecircumflex = 444;
25910		t.Uring = 722;
25911		t.Udieresis = 722;
25912		t.aogonek = 500;
25913		t.Uacute = 722;
25914		t.uogonek = 500;
25915		t.Edieresis = 611;
25916		t.Dcroat = 722;
25917		t.commaaccent = 250;
25918		t.copyright = 760;
25919		t.Emacron = 611;
25920		t.ccaron = 444;
25921		t.aring = 500;
25922		t.Ncommaaccent = 667;
25923		t.lacute = 278;
25924		t.agrave = 500;
25925		t.Tcommaaccent = 556;
25926		t.Cacute = 667;
25927		t.atilde = 500;
25928		t.Edotaccent = 611;
25929		t.scaron = 389;
25930		t.scedilla = 389;
25931		t.iacute = 278;
25932		t.lozenge = 471;
25933		t.Rcaron = 611;
25934		t.Gcommaaccent = 722;
25935		t.ucircumflex = 500;
25936		t.acircumflex = 500;
25937		t.Amacron = 611;
25938		t.rcaron = 389;
25939		t.ccedilla = 444;
25940		t.Zdotaccent = 556;
25941		t.Thorn = 611;
25942		t.Omacron = 722;
25943		t.Racute = 611;
25944		t.Sacute = 500;
25945		t.dcaron = 544;
25946		t.Umacron = 722;
25947		t.uring = 500;
25948		t.threesuperior = 300;
25949		t.Ograve = 722;
25950		t.Agrave = 611;
25951		t.Abreve = 611;
25952		t.multiply = 675;
25953		t.uacute = 500;
25954		t.Tcaron = 556;
25955		t.partialdiff = 476;
25956		t.ydieresis = 444;
25957		t.Nacute = 667;
25958		t.icircumflex = 278;
25959		t.Ecircumflex = 611;
25960		t.adieresis = 500;
25961		t.edieresis = 444;
25962		t.cacute = 444;
25963		t.nacute = 500;
25964		t.umacron = 500;
25965		t.Ncaron = 667;
25966		t.Iacute = 333;
25967		t.plusminus = 675;
25968		t.brokenbar = 275;
25969		t.registered = 760;
25970		t.Gbreve = 722;
25971		t.Idotaccent = 333;
25972		t.summation = 600;
25973		t.Egrave = 611;
25974		t.racute = 389;
25975		t.omacron = 500;
25976		t.Zacute = 556;
25977		t.Zcaron = 556;
25978		t.greaterequal = 549;
25979		t.Eth = 722;
25980		t.Ccedilla = 667;
25981		t.lcommaaccent = 278;
25982		t.tcaron = 300;
25983		t.eogonek = 444;
25984		t.Uogonek = 722;
25985		t.Aacute = 611;
25986		t.Adieresis = 611;
25987		t.egrave = 444;
25988		t.zacute = 389;
25989		t.iogonek = 278;
25990		t.Oacute = 722;
25991		t.oacute = 500;
25992		t.amacron = 500;
25993		t.sacute = 389;
25994		t.idieresis = 278;
25995		t.Ocircumflex = 722;
25996		t.Ugrave = 722;
25997		t.Delta = 612;
25998		t.thorn = 500;
25999		t.twosuperior = 300;
26000		t.Odieresis = 722;
26001		t.mu = 500;
26002		t.igrave = 278;
26003		t.ohungarumlaut = 500;
26004		t.Eogonek = 611;
26005		t.dcroat = 500;
26006		t.threequarters = 750;
26007		t.Scedilla = 500;
26008		t.lcaron = 300;
26009		t.Kcommaaccent = 667;
26010		t.Lacute = 556;
26011		t.trademark = 980;
26012		t.edotaccent = 444;
26013		t.Igrave = 333;
26014		t.Imacron = 333;
26015		t.Lcaron = 611;
26016		t.onehalf = 750;
26017		t.lessequal = 549;
26018		t.ocircumflex = 500;
26019		t.ntilde = 500;
26020		t.Uhungarumlaut = 722;
26021		t.Eacute = 611;
26022		t.emacron = 444;
26023		t.gbreve = 500;
26024		t.onequarter = 750;
26025		t.Scaron = 500;
26026		t.Scommaaccent = 500;
26027		t.Ohungarumlaut = 722;
26028		t.degree = 400;
26029		t.ograve = 500;
26030		t.Ccaron = 667;
26031		t.ugrave = 500;
26032		t.radical = 453;
26033		t.Dcaron = 722;
26034		t.rcommaaccent = 389;
vendor: 27,180 bytes, lines 26035-27208
26035		t.Ntilde = 667;
26036		t.otilde = 500;
26037		t.Rcommaaccent = 611;
26038		t.Lcommaaccent = 556;
26039		t.Atilde = 611;
26040		t.Aogonek = 611;
26041		t.Aring = 611;
26042		t.Otilde = 722;
26043		t.zdotaccent = 389;
26044		t.Ecaron = 611;
26045		t.Iogonek = 333;
26046		t.kcommaaccent = 444;
26047		t.minus = 675;
26048		t.Icircumflex = 333;
26049		t.ncaron = 500;
26050		t.tcommaaccent = 278;
26051		t.logicalnot = 675;
26052		t.odieresis = 500;
26053		t.udieresis = 500;
26054		t.notequal = 549;
26055		t.gcommaaccent = 500;
26056		t.eth = 500;
26057		t.zcaron = 389;
26058		t.ncommaaccent = 500;
26059		t.onesuperior = 300;
26060		t.imacron = 278;
26061		t.Euro = 500;
26062	});
26063	t.ZapfDingbats = getLookupTableFactory(function (t) {
26064		t.space = 278;
26065		t.a1 = 974;
26066		t.a2 = 961;
26067		t.a202 = 974;
26068		t.a3 = 980;
26069		t.a4 = 719;
26070		t.a5 = 789;
26071		t.a119 = 790;
26072		t.a118 = 791;
26073		t.a117 = 690;
26074		t.a11 = 960;
26075		t.a12 = 939;
26076		t.a13 = 549;
26077		t.a14 = 855;
26078		t.a15 = 911;
26079		t.a16 = 933;
26080		t.a105 = 911;
26081		t.a17 = 945;
26082		t.a18 = 974;
26083		t.a19 = 755;
26084		t.a20 = 846;
26085		t.a21 = 762;
26086		t.a22 = 761;
26087		t.a23 = 571;
26088		t.a24 = 677;
26089		t.a25 = 763;
26090		t.a26 = 760;
26091		t.a27 = 759;
26092		t.a28 = 754;
26093		t.a6 = 494;
26094		t.a7 = 552;
26095		t.a8 = 537;
26096		t.a9 = 577;
26097		t.a10 = 692;
26098		t.a29 = 786;
26099		t.a30 = 788;
26100		t.a31 = 788;
26101		t.a32 = 790;
26102		t.a33 = 793;
26103		t.a34 = 794;
26104		t.a35 = 816;
26105		t.a36 = 823;
26106		t.a37 = 789;
26107		t.a38 = 841;
26108		t.a39 = 823;
26109		t.a40 = 833;
26110		t.a41 = 816;
26111		t.a42 = 831;
26112		t.a43 = 923;
26113		t.a44 = 744;
26114		t.a45 = 723;
26115		t.a46 = 749;
26116		t.a47 = 790;
26117		t.a48 = 792;
26118		t.a49 = 695;
26119		t.a50 = 776;
26120		t.a51 = 768;
26121		t.a52 = 792;
26122		t.a53 = 759;
26123		t.a54 = 707;
26124		t.a55 = 708;
26125		t.a56 = 682;
26126		t.a57 = 701;
26127		t.a58 = 826;
26128		t.a59 = 815;
26129		t.a60 = 789;
26130		t.a61 = 789;
26131		t.a62 = 707;
26132		t.a63 = 687;
26133		t.a64 = 696;
26134		t.a65 = 689;
26135		t.a66 = 786;
26136		t.a67 = 787;
26137		t.a68 = 713;
26138		t.a69 = 791;
26139		t.a70 = 785;
26140		t.a71 = 791;
26141		t.a72 = 873;
26142		t.a73 = 761;
26143		t.a74 = 762;
26144		t.a203 = 762;
26145		t.a75 = 759;
26146		t.a204 = 759;
26147		t.a76 = 892;
26148		t.a77 = 892;
26149		t.a78 = 788;
26150		t.a79 = 784;
26151		t.a81 = 438;
26152		t.a82 = 138;
26153		t.a83 = 277;
26154		t.a84 = 415;
26155		t.a97 = 392;
26156		t.a98 = 392;
26157		t.a99 = 668;
26158		t.a100 = 668;
26159		t.a89 = 390;
26160		t.a90 = 390;
26161		t.a93 = 317;
26162		t.a94 = 317;
26163		t.a91 = 276;
26164		t.a92 = 276;
26165		t.a205 = 509;
26166		t.a85 = 509;
26167		t.a206 = 410;
26168		t.a86 = 410;
26169		t.a87 = 234;
26170		t.a88 = 234;
26171		t.a95 = 334;
26172		t.a96 = 334;
26173		t.a101 = 732;
26174		t.a102 = 544;
26175		t.a103 = 544;
26176		t.a104 = 910;
26177		t.a106 = 667;
26178		t.a107 = 760;
26179		t.a108 = 760;
26180		t.a112 = 776;
26181		t.a111 = 595;
26182		t.a110 = 694;
26183		t.a109 = 626;
26184		t.a120 = 788;
26185		t.a121 = 788;
26186		t.a122 = 788;
26187		t.a123 = 788;
26188		t.a124 = 788;
26189		t.a125 = 788;
26190		t.a126 = 788;
26191		t.a127 = 788;
26192		t.a128 = 788;
26193		t.a129 = 788;
26194		t.a130 = 788;
26195		t.a131 = 788;
26196		t.a132 = 788;
26197		t.a133 = 788;
26198		t.a134 = 788;
26199		t.a135 = 788;
26200		t.a136 = 788;
26201		t.a137 = 788;
26202		t.a138 = 788;
26203		t.a139 = 788;
26204		t.a140 = 788;
26205		t.a141 = 788;
26206		t.a142 = 788;
26207		t.a143 = 788;
26208		t.a144 = 788;
26209		t.a145 = 788;
26210		t.a146 = 788;
26211		t.a147 = 788;
26212		t.a148 = 788;
26213		t.a149 = 788;
26214		t.a150 = 788;
26215		t.a151 = 788;
26216		t.a152 = 788;
26217		t.a153 = 788;
26218		t.a154 = 788;
26219		t.a155 = 788;
26220		t.a156 = 788;
26221		t.a157 = 788;
26222		t.a158 = 788;
26223		t.a159 = 788;
26224		t.a160 = 894;
26225		t.a161 = 838;
26226		t.a163 = 1016;
26227		t.a164 = 458;
26228		t.a196 = 748;
26229		t.a165 = 924;
26230		t.a192 = 748;
26231		t.a166 = 918;
26232		t.a167 = 927;
26233		t.a168 = 928;
26234		t.a169 = 928;
26235		t.a170 = 834;
26236		t.a171 = 873;
26237		t.a172 = 828;
26238		t.a173 = 924;
26239		t.a162 = 924;
26240		t.a174 = 917;
26241		t.a175 = 930;
26242		t.a176 = 931;
26243		t.a177 = 463;
26244		t.a178 = 883;
26245		t.a179 = 836;
26246		t.a193 = 836;
26247		t.a180 = 867;
26248		t.a199 = 867;
26249		t.a181 = 696;
26250		t.a200 = 696;
26251		t.a182 = 874;
26252		t.a201 = 874;
26253		t.a183 = 760;
26254		t.a184 = 946;
26255		t.a197 = 771;
26256		t.a185 = 865;
26257		t.a194 = 771;
26258		t.a198 = 888;
26259		t.a186 = 967;
26260		t.a195 = 888;
26261		t.a187 = 831;
26262		t.a188 = 873;
26263		t.a189 = 927;
26264		t.a190 = 970;
26265		t.a191 = 918;
26266	});
26267});
26268const getFontBasicMetrics = getLookupTableFactory(function (t) {
26269	t.Courier = {
26270		ascent: 629,
26271		descent: -157,
26272		capHeight: 562,
26273		xHeight: -426
26274	};
26275	t["Courier-Bold"] = {
26276		ascent: 629,
26277		descent: -157,
26278		capHeight: 562,
26279		xHeight: 439
26280	};
26281	t["Courier-Oblique"] = {
26282		ascent: 629,
26283		descent: -157,
26284		capHeight: 562,
26285		xHeight: 426
26286	};
26287	t["Courier-BoldOblique"] = {
26288		ascent: 629,
26289		descent: -157,
26290		capHeight: 562,
26291		xHeight: 426
26292	};
26293	t.Helvetica = {
26294		ascent: 718,
26295		descent: -207,
26296		capHeight: 718,
26297		xHeight: 523
26298	};
26299	t["Helvetica-Bold"] = {
26300		ascent: 718,
26301		descent: -207,
26302		capHeight: 718,
26303		xHeight: 532
26304	};
26305	t["Helvetica-Oblique"] = {
26306		ascent: 718,
26307		descent: -207,
26308		capHeight: 718,
26309		xHeight: 523
26310	};
26311	t["Helvetica-BoldOblique"] = {
26312		ascent: 718,
26313		descent: -207,
26314		capHeight: 718,
26315		xHeight: 532
26316	};
26317	t["Times-Roman"] = {
26318		ascent: 683,
26319		descent: -217,
26320		capHeight: 662,
26321		xHeight: 450
26322	};
26323	t["Times-Bold"] = {
26324		ascent: 683,
26325		descent: -217,
26326		capHeight: 676,
26327		xHeight: 461
26328	};
26329	t["Times-Italic"] = {
26330		ascent: 683,
26331		descent: -217,
26332		capHeight: 653,
26333		xHeight: 441
26334	};
26335	t["Times-BoldItalic"] = {
26336		ascent: 683,
26337		descent: -217,
26338		capHeight: 669,
26339		xHeight: 462
26340	};
26341	t.Symbol = {
26342		ascent: Math.NaN,
26343		descent: Math.NaN,
26344		capHeight: Math.NaN,
26345		xHeight: Math.NaN
26346	};
26347	t.ZapfDingbats = {
26348		ascent: Math.NaN,
26349		descent: Math.NaN,
26350		capHeight: Math.NaN,
26351		xHeight: Math.NaN
26352	};
26353});
26354
26355;// ./src/core/glyf.js
26356
26357
26358
26359
26360
26361
26362
26363
26364
26365
26366const ON_CURVE_POINT = 1 << 0;
26367const X_SHORT_VECTOR = 1 << 1;
26368const Y_SHORT_VECTOR = 1 << 2;
26369const REPEAT_FLAG = 1 << 3;
26370const X_IS_SAME_OR_POSITIVE_X_SHORT_VECTOR = 1 << 4;
26371const Y_IS_SAME_OR_POSITIVE_Y_SHORT_VECTOR = 1 << 5;
26372const OVERLAP_SIMPLE = 1 << 6;
26373const ARG_1_AND_2_ARE_WORDS = 1 << 0;
26374const ARGS_ARE_XY_VALUES = 1 << 1;
26375const WE_HAVE_A_SCALE = 1 << 3;
26376const MORE_COMPONENTS = 1 << 5;
26377const WE_HAVE_AN_X_AND_Y_SCALE = 1 << 6;
26378const WE_HAVE_A_TWO_BY_TWO = 1 << 7;
26379const WE_HAVE_INSTRUCTIONS = 1 << 8;
26380class GlyfTable {
26381	constructor({
26382		glyfTable,
26383		isGlyphLocationsLong,
26384		locaTable,
26385		numGlyphs
26386	}) {
26387		this.glyphs = [];
26388		const loca = new DataView(locaTable.buffer, locaTable.byteOffset, locaTable.byteLength);
26389		const glyf = new DataView(glyfTable.buffer, glyfTable.byteOffset, glyfTable.byteLength);
26390		const offsetSize = isGlyphLocationsLong ? 4 : 2;
26391		let prev = isGlyphLocationsLong ? loca.getUint32(0) : 2 * loca.getUint16(0);
26392		let pos = 0;
26393		for (let i = 0; i < numGlyphs; i++) {
26394			pos += offsetSize;
26395			const next = isGlyphLocationsLong ? loca.getUint32(pos) : 2 * loca.getUint16(pos);
26396			if (next === prev) {
26397				this.glyphs.push(new Glyph({}));
26398				continue;
26399			}
26400			const glyph = Glyph.parse(prev, glyf);
26401			this.glyphs.push(glyph);
26402			prev = next;
26403		}
26404	}
26405	getSize() {
26406		return this.glyphs.reduce((a, g) => {
26407			const size = g.getSize();
26408			return a + (size + 3 & ~3);
26409		}, 0);
26410	}
26411	write() {
26412		const totalSize = this.getSize();
26413		const glyfTable = new DataView(new ArrayBuffer(totalSize));
26414		const isLocationLong = totalSize > 0x1fffe;
26415		const offsetSize = isLocationLong ? 4 : 2;
26416		const locaTable = new DataView(new ArrayBuffer((this.glyphs.length + 1) * offsetSize));
26417		if (isLocationLong) {
26418			locaTable.setUint32(0, 0);
26419		} else {
26420			locaTable.setUint16(0, 0);
26421		}
26422		let pos = 0;
26423		let locaIndex = 0;
26424		for (const glyph of this.glyphs) {
26425			pos += glyph.write(pos, glyfTable);
26426			pos = pos + 3 & ~3;
26427			locaIndex += offsetSize;
26428			if (isLocationLong) {
26429				locaTable.setUint32(locaIndex, pos);
26430			} else {
26431				locaTable.setUint16(locaIndex, pos >> 1);
26432			}
26433		}
26434		return {
26435			isLocationLong,
26436			loca: new Uint8Array(locaTable.buffer),
26437			glyf: new Uint8Array(glyfTable.buffer)
26438		};
26439	}
26440	scale(factors) {
26441		for (let i = 0, ii = this.glyphs.length; i < ii; i++) {
26442			this.glyphs[i].scale(factors[i]);
26443		}
26444	}
26445}
26446class Glyph {
26447	constructor({
26448		header = null,
26449		simple = null,
26450		composites = null
26451	}) {
26452		this.header = header;
26453		this.simple = simple;
26454		this.composites = composites;
26455	}
26456	static parse(pos, glyf) {
26457		const [read, header] = GlyphHeader.parse(pos, glyf);
26458		pos += read;
26459		if (header.numberOfContours < 0) {
26460			const composites = [];
26461			while (true) {
26462				const [n, composite] = CompositeGlyph.parse(pos, glyf);
26463				pos += n;
26464				composites.push(composite);
26465				if (!(composite.flags & MORE_COMPONENTS)) {
26466					break;
26467				}
26468			}
26469			return new Glyph({
26470				header,
26471				composites
26472			});
26473		}
26474		const simple = SimpleGlyph.parse(pos, glyf, header.numberOfContours);
26475		return new Glyph({
26476			header,
26477			simple
26478		});
26479	}
26480	getSize() {
26481		if (!this.header) {
26482			return 0;
26483		}
26484		const size = this.simple ? this.simple.getSize() : this.composites.reduce((a, c) => a + c.getSize(), 0);
26485		return this.header.getSize() + size;
26486	}
26487	write(pos, buf) {
26488		if (!this.header) {
26489			return 0;
26490		}
26491		const spos = pos;
26492		pos += this.header.write(pos, buf);
26493		if (this.simple) {
26494			pos += this.simple.write(pos, buf);
26495		} else {
26496			for (const composite of this.composites) {
26497				pos += composite.write(pos, buf);
26498			}
26499		}
26500		return pos - spos;
26501	}
26502	scale(factor) {
26503		if (!this.header) {
26504			return;
26505		}
26506		const xMiddle = (this.header.xMin + this.header.xMax) / 2;
26507		this.header.scale(xMiddle, factor);
26508		if (this.simple) {
26509			this.simple.scale(xMiddle, factor);
26510		} else {
26511			for (const composite of this.composites) {
26512				composite.scale(xMiddle, factor);
26513			}
26514		}
26515	}
26516}
26517class GlyphHeader {
26518	constructor({
26519		numberOfContours,
26520		xMin,
26521		yMin,
26522		xMax,
26523		yMax
26524	}) {
26525		this.numberOfContours = numberOfContours;
26526		this.xMin = xMin;
26527		this.yMin = yMin;
26528		this.xMax = xMax;
26529		this.yMax = yMax;
26530	}
26531	static parse(pos, glyf) {
26532		return [10, new GlyphHeader({
26533			numberOfContours: glyf.getInt16(pos),
26534			xMin: glyf.getInt16(pos + 2),
26535			yMin: glyf.getInt16(pos + 4),
26536			xMax: glyf.getInt16(pos + 6),
26537			yMax: glyf.getInt16(pos + 8)
26538		})];
26539	}
26540	getSize() {
26541		return 10;
26542	}
26543	write(pos, buf) {
26544		buf.setInt16(pos, this.numberOfContours);
26545		buf.setInt16(pos + 2, this.xMin);
26546		buf.setInt16(pos + 4, this.yMin);
26547		buf.setInt16(pos + 6, this.xMax);
26548		buf.setInt16(pos + 8, this.yMax);
26549		return 10;
26550	}
26551	scale(x, factor) {
26552		this.xMin = Math.round(x + (this.xMin - x) * factor);
26553		this.xMax = Math.round(x + (this.xMax - x) * factor);
26554	}
26555}
26556class Contour {
26557	constructor({
26558		flags,
26559		xCoordinates,
26560		yCoordinates
26561	}) {
26562		this.xCoordinates = xCoordinates;
26563		this.yCoordinates = yCoordinates;
26564		this.flags = flags;
26565	}
26566}
26567class SimpleGlyph {
26568	constructor({
26569		contours,
26570		instructions
26571	}) {
26572		this.contours = contours;
26573		this.instructions = instructions;
26574	}
26575	static parse(pos, glyf, numberOfContours) {
26576		const endPtsOfContours = [];
26577		for (let i = 0; i < numberOfContours; i++) {
26578			const endPt = glyf.getUint16(pos);
26579			pos += 2;
26580			endPtsOfContours.push(endPt);
26581		}
26582		const numberOfPt = endPtsOfContours[numberOfContours - 1] + 1;
26583		const instructionLength = glyf.getUint16(pos);
26584		pos += 2;
26585		const instructions = new Uint8Array(glyf).slice(pos, pos + instructionLength);
26586		pos += instructionLength;
26587		const flags = [];
26588		for (let i = 0; i < numberOfPt; pos++, i++) {
26589			let flag = glyf.getUint8(pos);
26590			flags.push(flag);
26591			if (flag & REPEAT_FLAG) {
26592				const count = glyf.getUint8(++pos);
26593				flag ^= REPEAT_FLAG;
26594				for (let m = 0; m < count; m++) {
26595					flags.push(flag);
26596				}
26597				i += count;
26598			}
26599		}
26600		const allXCoordinates = [];
26601		let xCoordinates = [];
26602		let yCoordinates = [];
26603		let pointFlags = [];
26604		const contours = [];
26605		let endPtsOfContoursIndex = 0;
26606		let lastCoordinate = 0;
26607		for (let i = 0; i < numberOfPt; i++) {
26608			const flag = flags[i];
26609			if (flag & X_SHORT_VECTOR) {
26610				const x = glyf.getUint8(pos++);
26611				lastCoordinate += flag & X_IS_SAME_OR_POSITIVE_X_SHORT_VECTOR ? x : -x;
26612				xCoordinates.push(lastCoordinate);
26613			} else if (flag & X_IS_SAME_OR_POSITIVE_X_SHORT_VECTOR) {
26614				xCoordinates.push(lastCoordinate);
26615			} else {
26616				lastCoordinate += glyf.getInt16(pos);
26617				pos += 2;
26618				xCoordinates.push(lastCoordinate);
26619			}
26620			if (endPtsOfContours[endPtsOfContoursIndex] === i) {
26621				endPtsOfContoursIndex++;
26622				allXCoordinates.push(xCoordinates);
26623				xCoordinates = [];
26624			}
26625		}
26626		lastCoordinate = 0;
26627		endPtsOfContoursIndex = 0;
26628		for (let i = 0; i < numberOfPt; i++) {
26629			const flag = flags[i];
26630			if (flag & Y_SHORT_VECTOR) {
26631				const y = glyf.getUint8(pos++);
26632				lastCoordinate += flag & Y_IS_SAME_OR_POSITIVE_Y_SHORT_VECTOR ? y : -y;
26633				yCoordinates.push(lastCoordinate);
26634			} else if (flag & Y_IS_SAME_OR_POSITIVE_Y_SHORT_VECTOR) {
26635				yCoordinates.push(lastCoordinate);
26636			} else {
26637				lastCoordinate += glyf.getInt16(pos);
26638				pos += 2;
26639				yCoordinates.push(lastCoordinate);
26640			}
26641			pointFlags.push(flag & ON_CURVE_POINT | flag & OVERLAP_SIMPLE);
26642			if (endPtsOfContours[endPtsOfContoursIndex] === i) {
26643				xCoordinates = allXCoordinates[endPtsOfContoursIndex];
26644				endPtsOfContoursIndex++;
26645				contours.push(new Contour({
26646					flags: pointFlags,
26647					xCoordinates,
26648					yCoordinates
26649				}));
26650				yCoordinates = [];
26651				pointFlags = [];
26652			}
26653		}
26654		return new SimpleGlyph({
26655			contours,
26656			instructions
26657		});
26658	}
26659	getSize() {
26660		let size = this.contours.length * 2 + 2 + this.instructions.length;
26661		let lastX = 0;
26662		let lastY = 0;
26663		for (const contour of this.contours) {
26664			size += contour.flags.length;
26665			for (let i = 0, ii = contour.xCoordinates.length; i < ii; i++) {
26666				const x = contour.xCoordinates[i];
26667				const y = contour.yCoordinates[i];
26668				let abs = Math.abs(x - lastX);
26669				if (abs > 255) {
26670					size += 2;
26671				} else if (abs > 0) {
26672					size += 1;
26673				}
26674				lastX = x;
26675				abs = Math.abs(y - lastY);
26676				if (abs > 255) {
26677					size += 2;
26678				} else if (abs > 0) {
26679					size += 1;
26680				}
26681				lastY = y;
26682			}
26683		}
26684		return size;
26685	}
26686	write(pos, buf) {
26687		const spos = pos;
26688		const xCoordinates = [];
26689		const yCoordinates = [];
26690		const flags = [];
26691		let lastX = 0;
26692		let lastY = 0;
26693		for (const contour of this.contours) {
26694			for (let i = 0, ii = contour.xCoordinates.length; i < ii; i++) {
26695				let flag = contour.flags[i];
26696				const x = contour.xCoordinates[i];
26697				let delta = x - lastX;
26698				if (delta === 0) {
26699					flag |= X_IS_SAME_OR_POSITIVE_X_SHORT_VECTOR;
26700					xCoordinates.push(0);
26701				} else {
26702					const abs = Math.abs(delta);
26703					if (abs <= 255) {
26704						flag |= delta >= 0 ? X_SHORT_VECTOR | X_IS_SAME_OR_POSITIVE_X_SHORT_VECTOR : X_SHORT_VECTOR;
26705						xCoordinates.push(abs);
26706					} else {
26707						xCoordinates.push(delta);
26708					}
26709				}
26710				lastX = x;
26711				const y = contour.yCoordinates[i];
26712				delta = y - lastY;
26713				if (delta === 0) {
26714					flag |= Y_IS_SAME_OR_POSITIVE_Y_SHORT_VECTOR;
26715					yCoordinates.push(0);
26716				} else {
26717					const abs = Math.abs(delta);
26718					if (abs <= 255) {
26719						flag |= delta >= 0 ? Y_SHORT_VECTOR | Y_IS_SAME_OR_POSITIVE_Y_SHORT_VECTOR : Y_SHORT_VECTOR;
26720						yCoordinates.push(abs);
26721					} else {
26722						yCoordinates.push(delta);
26723					}
26724				}
26725				lastY = y;
26726				flags.push(flag);
26727			}
26728			buf.setUint16(pos, xCoordinates.length - 1);
26729			pos += 2;
26730		}
26731		buf.setUint16(pos, this.instructions.length);
26732		pos += 2;
26733		if (this.instructions.length) {
26734			new Uint8Array(buf.buffer, 0, buf.buffer.byteLength).set(this.instructions, pos);
26735			pos += this.instructions.length;
26736		}
26737		for (const flag of flags) {
26738			buf.setUint8(pos++, flag);
26739		}
26740		for (let i = 0, ii = xCoordinates.length; i < ii; i++) {
26741			const x = xCoordinates[i];
26742			const flag = flags[i];
26743			if (flag & X_SHORT_VECTOR) {
26744				buf.setUint8(pos++, x);
26745			} else if (!(flag & X_IS_SAME_OR_POSITIVE_X_SHORT_VECTOR)) {
26746				buf.setInt16(pos, x);
26747				pos += 2;
26748			}
26749		}
26750		for (let i = 0, ii = yCoordinates.length; i < ii; i++) {
26751			const y = yCoordinates[i];
26752			const flag = flags[i];
26753			if (flag & Y_SHORT_VECTOR) {
26754				buf.setUint8(pos++, y);
26755			} else if (!(flag & Y_IS_SAME_OR_POSITIVE_Y_SHORT_VECTOR)) {
26756				buf.setInt16(pos, y);
26757				pos += 2;
26758			}
26759		}
26760		return pos - spos;
26761	}
26762	scale(x, factor) {
26763		for (const contour of this.contours) {
26764			if (contour.xCoordinates.length === 0) {
26765				continue;
26766			}
26767			for (let i = 0, ii = contour.xCoordinates.length; i < ii; i++) {
26768				contour.xCoordinates[i] = Math.round(x + (contour.xCoordinates[i] - x) * factor);
26769			}
26770		}
26771	}
26772}
26773class CompositeGlyph {
26774	constructor({
26775		flags,
26776		glyphIndex,
26777		argument1,
26778		argument2,
26779		transf,
26780		instructions
26781	}) {
26782		this.flags = flags;
26783		this.glyphIndex = glyphIndex;
26784		this.argument1 = argument1;
26785		this.argument2 = argument2;
26786		this.transf = transf;
26787		this.instructions = instructions;
26788	}
26789	static parse(pos, glyf) {
26790		const spos = pos;
26791		const transf = [];
26792		let flags = glyf.getUint16(pos);
26793		const glyphIndex = glyf.getUint16(pos + 2);
26794		pos += 4;
26795		let argument1, argument2;
26796		if (flags & ARG_1_AND_2_ARE_WORDS) {
26797			if (flags & ARGS_ARE_XY_VALUES) {
26798				argument1 = glyf.getInt16(pos);
26799				argument2 = glyf.getInt16(pos + 2);
26800			} else {
26801				argument1 = glyf.getUint16(pos);
26802				argument2 = glyf.getUint16(pos + 2);
26803			}
26804			pos += 4;
26805			flags ^= ARG_1_AND_2_ARE_WORDS;
26806		} else {
26807			if (flags & ARGS_ARE_XY_VALUES) {
26808				argument1 = glyf.getInt8(pos);
26809				argument2 = glyf.getInt8(pos + 1);
26810			} else {
26811				argument1 = glyf.getUint8(pos);
26812				argument2 = glyf.getUint8(pos + 1);
26813			}
26814			pos += 2;
26815		}
26816		if (flags & WE_HAVE_A_SCALE) {
26817			transf.push(glyf.getUint16(pos));
26818			pos += 2;
26819		} else if (flags & WE_HAVE_AN_X_AND_Y_SCALE) {
26820			transf.push(glyf.getUint16(pos), glyf.getUint16(pos + 2));
26821			pos += 4;
26822		} else if (flags & WE_HAVE_A_TWO_BY_TWO) {
26823			transf.push(glyf.getUint16(pos), glyf.getUint16(pos + 2), glyf.getUint16(pos + 4), glyf.getUint16(pos + 6));
26824			pos += 8;
26825		}
26826		let instructions = null;
26827		if (flags & WE_HAVE_INSTRUCTIONS) {
26828			const instructionLength = glyf.getUint16(pos);
26829			pos += 2;
26830			instructions = new Uint8Array(glyf).slice(pos, pos + instructionLength);
26831			pos += instructionLength;
26832		}
26833		return [pos - spos, new CompositeGlyph({
26834			flags,
26835			glyphIndex,
26836			argument1,
26837			argument2,
26838			transf,
26839			instructions
26840		})];
26841	}
26842	getSize() {
26843		let size = 2 + 2 + this.transf.length * 2;
26844		if (this.flags & WE_HAVE_INSTRUCTIONS) {
26845			size += 2 + this.instructions.length;
26846		}
26847		size += 2;
26848		if (this.flags & 2) {
26849			if (!(this.argument1 >= -128 && this.argument1 <= 127 && this.argument2 >= -128 && this.argument2 <= 127)) {
26850				size += 2;
26851			}
26852		} else if (!(this.argument1 >= 0 && this.argument1 <= 255 && this.argument2 >= 0 && this.argument2 <= 255)) {
26853			size += 2;
26854		}
26855		return size;
26856	}
26857	write(pos, buf) {
26858		const spos = pos;
26859		if (this.flags & ARGS_ARE_XY_VALUES) {
26860			if (!(this.argument1 >= -128 && this.argument1 <= 127 && this.argument2 >= -128 && this.argument2 <= 127)) {
26861				this.flags |= ARG_1_AND_2_ARE_WORDS;
26862			}
26863		} else if (!(this.argument1 >= 0 && this.argument1 <= 255 && this.argument2 >= 0 && this.argument2 <= 255)) {
26864			this.flags |= ARG_1_AND_2_ARE_WORDS;
26865		}
26866		buf.setUint16(pos, this.flags);
26867		buf.setUint16(pos + 2, this.glyphIndex);
26868		pos += 4;
26869		if (this.flags & ARG_1_AND_2_ARE_WORDS) {
26870			if (this.flags & ARGS_ARE_XY_VALUES) {
26871				buf.setInt16(pos, this.argument1);
26872				buf.setInt16(pos + 2, this.argument2);
26873			} else {
26874				buf.setUint16(pos, this.argument1);
26875				buf.setUint16(pos + 2, this.argument2);
26876			}
26877			pos += 4;
26878		} else {
26879			buf.setUint8(pos, this.argument1);
26880			buf.setUint8(pos + 1, this.argument2);
26881			pos += 2;
26882		}
26883		if (this.flags & WE_HAVE_INSTRUCTIONS) {
26884			buf.setUint16(pos, this.instructions.length);
26885			pos += 2;
26886			if (this.instructions.length) {
26887				new Uint8Array(buf.buffer, 0, buf.buffer.byteLength).set(this.instructions, pos);
26888				pos += this.instructions.length;
26889			}
26890		}
26891		return pos - spos;
26892	}
26893	scale(x, factor) {}
26894}
26895
26896;// ./src/core/opentype_file_builder.js
26897
26898
26899
26900
26901
26902
26903
26904
26905
26906function writeInt16(dest, offset, num) {
26907	dest[offset] = num >> 8 & 0xff;
26908	dest[offset + 1] = num & 0xff;
26909}
26910function writeInt32(dest, offset, num) {
26911	dest[offset] = num >> 24 & 0xff;
26912	dest[offset + 1] = num >> 16 & 0xff;
26913	dest[offset + 2] = num >> 8 & 0xff;
26914	dest[offset + 3] = num & 0xff;
26915}
26916function writeData(dest, offset, data) {
26917	if (data instanceof Uint8Array) {
26918		dest.set(data, offset);
26919	} else if (typeof data === "string") {
26920		for (let i = 0, ii = data.length; i < ii; i++) {
26921			dest[offset++] = data.charCodeAt(i) & 0xff;
26922		}
26923	} else {
26924		for (const num of data) {
26925			dest[offset++] = num & 0xff;
26926		}
26927	}
26928}
26929const OTF_HEADER_SIZE = 12;
26930const OTF_TABLE_ENTRY_SIZE = 16;
26931class OpenTypeFileBuilder {
26932	constructor(sfnt) {
26933		this.sfnt = sfnt;
26934		this.tables = Object.create(null);
26935	}
26936	static getSearchParams(entriesCount, entrySize) {
26937		let maxPower2 = 1,
26938			log2 = 0;
26939		while ((maxPower2 ^ entriesCount) > maxPower2) {
26940			maxPower2 <<= 1;
26941			log2++;
26942		}
26943		const searchRange = maxPower2 * entrySize;
26944		return {
26945			range: searchRange,
26946			entry: log2,
26947			rangeShift: entrySize * entriesCount - searchRange
26948		};
26949	}
26950	toArray() {
26951		let sfnt = this.sfnt;
26952		const tables = this.tables;
26953		const tablesNames = Object.keys(tables);
26954		tablesNames.sort();
26955		const numTables = tablesNames.length;
26956		let i, j, jj, table, tableName;
26957		let offset = OTF_HEADER_SIZE + numTables * OTF_TABLE_ENTRY_SIZE;
26958		const tableOffsets = [offset];
26959		for (i = 0; i < numTables; i++) {
26960			table = tables[tablesNames[i]];
26961			const paddedLength = (table.length + 3 & ~3) >>> 0;
26962			offset += paddedLength;
26963			tableOffsets.push(offset);
26964		}
26965		const file = new Uint8Array(offset);
26966		for (i = 0; i < numTables; i++) {
26967			table = tables[tablesNames[i]];
26968			writeData(file, tableOffsets[i], table);
26969		}
26970		if (sfnt === "true") {
26971			sfnt = string32(0x00010000);
26972		}
26973		file[0] = sfnt.charCodeAt(0) & 0xff;
26974		file[1] = sfnt.charCodeAt(1) & 0xff;
26975		file[2] = sfnt.charCodeAt(2) & 0xff;
26976		file[3] = sfnt.charCodeAt(3) & 0xff;
26977		writeInt16(file, 4, numTables);
26978		const searchParams = OpenTypeFileBuilder.getSearchParams(numTables, 16);
26979		writeInt16(file, 6, searchParams.range);
26980		writeInt16(file, 8, searchParams.entry);
26981		writeInt16(file, 10, searchParams.rangeShift);
26982		offset = OTF_HEADER_SIZE;
26983		for (i = 0; i < numTables; i++) {
26984			tableName = tablesNames[i];
26985			file[offset] = tableName.charCodeAt(0) & 0xff;
26986			file[offset + 1] = tableName.charCodeAt(1) & 0xff;
26987			file[offset + 2] = tableName.charCodeAt(2) & 0xff;
26988			file[offset + 3] = tableName.charCodeAt(3) & 0xff;
26989			let checksum = 0;
26990			for (j = tableOffsets[i], jj = tableOffsets[i + 1]; j < jj; j += 4) {
26991				const quad = readUint32(file, j);
26992				checksum = checksum + quad >>> 0;
26993			}
26994			writeInt32(file, offset + 4, checksum);
26995			writeInt32(file, offset + 8, tableOffsets[i]);
26996			writeInt32(file, offset + 12, tables[tableName].length);
26997			offset += OTF_TABLE_ENTRY_SIZE;
26998		}
26999		return file;
27000	}
27001	addTable(tag, data) {
27002		if (tag in this.tables) {
27003			throw new Error("Table " + tag + " already exists");
27004		}
27005		this.tables[tag] = data;
27006	}
27007}
27008
27009;// ./src/core/type1_parser.js
27010
27011
27012
27013
27014
27015
27016
27017
27018
27019
27020
27021const HINTING_ENABLED = false;
27022const COMMAND_MAP = {
27023	hstem: [1],
27024	vstem: [3],
27025	vmoveto: [4],
27026	rlineto: [5],
27027	hlineto: [6],
27028	vlineto: [7],
27029	rrcurveto: [8],
27030	callsubr: [10],
27031	flex: [12, 35],
27032	drop: [12, 18],
27033	endchar: [14],
27034	rmoveto: [21],
27035	hmoveto: [22],
27036	vhcurveto: [30],
27037	hvcurveto: [31]
27038};
27039class Type1CharString {
27040	constructor() {
27041		this.width = 0;
27042		this.lsb = 0;
27043		this.flexing = false;
27044		this.output = [];
27045		this.stack = [];
27046	}
27047	convert(encoded, subrs, seacAnalysisEnabled) {
27048		const count = encoded.length;
27049		let error = false;
27050		let wx, sbx, subrNumber;
27051		for (let i = 0; i < count; i++) {
27052			let value = encoded[i];
27053			if (value < 32) {
27054				if (value === 12) {
27055					value = (value << 8) + encoded[++i];
27056				}
27057				switch (value) {
27058					case 1:
27059						if (!HINTING_ENABLED) {
27060							this.stack = [];
27061							break;
27062						}
27063						error = this.executeCommand(2, COMMAND_MAP.hstem);
27064						break;
27065					case 3:
27066						if (!HINTING_ENABLED) {
27067							this.stack = [];
27068							break;
27069						}
27070						error = this.executeCommand(2, COMMAND_MAP.vstem);
27071						break;
27072					case 4:
27073						if (this.flexing) {
27074							if (this.stack.length < 1) {
27075								error = true;
27076								break;
27077							}
27078							const dy = this.stack.pop();
27079							this.stack.push(0, dy);
27080							break;
27081						}
27082						error = this.executeCommand(1, COMMAND_MAP.vmoveto);
27083						break;
27084					case 5:
27085						error = this.executeCommand(2, COMMAND_MAP.rlineto);
27086						break;
27087					case 6:
27088						error = this.executeCommand(1, COMMAND_MAP.hlineto);
27089						break;
27090					case 7:
27091						error = this.executeCommand(1, COMMAND_MAP.vlineto);
27092						break;
27093					case 8:
27094						error = this.executeCommand(6, COMMAND_MAP.rrcurveto);
27095						break;
27096					case 9:
27097						this.stack = [];
27098						break;
27099					case 10:
27100						if (this.stack.length < 1) {
27101							error = true;
27102							break;
27103						}
27104						subrNumber = this.stack.pop();
27105						if (!subrs[subrNumber]) {
27106							error = true;
27107							break;
27108						}
27109						error = this.convert(subrs[subrNumber], subrs, seacAnalysisEnabled);
27110						break;
27111					case 11:
27112						return error;
27113					case 13:
27114						if (this.stack.length < 2) {
27115							error = true;
27116							break;
27117						}
27118						wx = this.stack.pop();
27119						sbx = this.stack.pop();
27120						this.lsb = sbx;
27121						this.width = wx;
27122						this.stack.push(wx, sbx);
27123						error = this.executeCommand(2, COMMAND_MAP.hmoveto);
27124						break;
27125					case 14:
27126						this.output.push(COMMAND_MAP.endchar[0]);
27127						break;
27128					case 21:
27129						if (this.flexing) {
27130							break;
27131						}
27132						error = this.executeCommand(2, COMMAND_MAP.rmoveto);
27133						break;
27134					case 22:
27135						if (this.flexing) {
27136							this.stack.push(0);
27137							break;
27138						}
27139						error = this.executeCommand(1, COMMAND_MAP.hmoveto);
27140						break;
27141					case 30:
27142						error = this.executeCommand(4, COMMAND_MAP.vhcurveto);
27143						break;
27144					case 31:
27145						error = this.executeCommand(4, COMMAND_MAP.hvcurveto);
27146						break;
27147					case (12 << 8) + 0:
27148						this.stack = [];
27149						break;
27150					case (12 << 8) + 1:
27151						if (!HINTING_ENABLED) {
27152							this.stack = [];
27153							break;
27154						}
27155						error = this.executeCommand(2, COMMAND_MAP.vstem);
27156						break;
27157					case (12 << 8) + 2:
27158						if (!HINTING_ENABLED) {
27159							this.stack = [];
27160							break;
27161						}
27162						error = this.executeCommand(2, COMMAND_MAP.hstem);
27163						break;
27164					case (12 << 8) + 6:
27165						if (seacAnalysisEnabled) {
27166							const asb = this.stack.at(-5);
27167							this.seac = this.stack.splice(-4, 4);
27168							this.seac[0] += this.lsb - asb;
27169							error = this.executeCommand(0, COMMAND_MAP.endchar);
27170						} else {
27171							error = this.executeCommand(4, COMMAND_MAP.endchar);
27172						}
27173						break;
27174					case (12 << 8) + 7:
27175						if (this.stack.length < 4) {
27176							error = true;
27177							break;
27178						}
27179						this.stack.pop();
27180						wx = this.stack.pop();
27181						const sby = this.stack.pop();
27182						sbx = this.stack.pop();
27183						this.lsb = sbx;
27184						this.width = wx;
27185						this.stack.push(wx, sbx, sby);
27186						error = this.executeCommand(3, COMMAND_MAP.rmoveto);
27187						break;
27188					case (12 << 8) + 12:
27189						if (this.stack.length < 2) {
27190							error = true;
27191							break;
27192						}
27193						const num2 = this.stack.pop();
27194						const num1 = this.stack.pop();
27195						this.stack.push(num1 / num2);
27196						break;
27197					case (12 << 8) + 16:
27198						if (this.stack.length < 2) {
27199							error = true;
27200							break;
27201						}
27202						subrNumber = this.stack.pop();
27203						const numArgs = this.stack.pop();
27204						if (subrNumber === 0 && numArgs === 3) {
27205							const flexArgs = this.stack.splice(-17, 17);
27206							this.stack.push(flexArgs[2] + flexArgs[0], flexArgs[3] + flexArgs[1], flexArgs[4], flexArgs[5], flexArgs[6], flexArgs[7], flexArgs[8], flexArgs[9], flexArgs[10], flexArgs[11], flexArgs[12], flexArgs[13], flexArgs[14]);
27207							error = this.executeCommand(13, COMMAND_MAP.flex, true);
27208							this.flexing = false;
vendor: 4,258 bytes, lines 27209-27362
27209							this.stack.push(flexArgs[15], flexArgs[16]);
27210						} else if (subrNumber === 1 && numArgs === 0) {
27211							this.flexing = true;
27212						}
27213						break;
27214					case (12 << 8) + 17:
27215						break;
27216					case (12 << 8) + 33:
27217						this.stack = [];
27218						break;
27219					default:
27220						warn('Unknown type 1 charstring command of "' + value + '"');
27221						break;
27222				}
27223				if (error) {
27224					break;
27225				}
27226				continue;
27227			} else if (value <= 246) {
27228				value -= 139;
27229			} else if (value <= 250) {
27230				value = (value - 247) * 256 + encoded[++i] + 108;
27231			} else if (value <= 254) {
27232				value = -((value - 251) * 256) - encoded[++i] - 108;
27233			} else {
27234				value = (encoded[++i] & 0xff) << 24 | (encoded[++i] & 0xff) << 16 | (encoded[++i] & 0xff) << 8 | (encoded[++i] & 0xff) << 0;
27235			}
27236			this.stack.push(value);
27237		}
27238		return error;
27239	}
27240	executeCommand(howManyArgs, command, keepStack) {
27241		const stackLength = this.stack.length;
27242		if (howManyArgs > stackLength) {
27243			return true;
27244		}
27245		const start = stackLength - howManyArgs;
27246		for (let i = start; i < stackLength; i++) {
27247			let value = this.stack[i];
27248			if (Number.isInteger(value)) {
27249				this.output.push(28, value >> 8 & 0xff, value & 0xff);
27250			} else {
27251				value = 65536 * value | 0;
27252				this.output.push(255, value >> 24 & 0xff, value >> 16 & 0xff, value >> 8 & 0xff, value & 0xff);
27253			}
27254		}
27255		this.output.push(...command);
27256		if (keepStack) {
27257			this.stack.splice(start, howManyArgs);
27258		} else {
27259			this.stack.length = 0;
27260		}
27261		return false;
27262	}
27263}
27264const EEXEC_ENCRYPT_KEY = 55665;
27265const CHAR_STRS_ENCRYPT_KEY = 4330;
27266function isHexDigit(code) {
27267	return code >= 48 && code <= 57 || code >= 65 && code <= 70 || code >= 97 && code <= 102;
27268}
27269function decrypt(data, key, discardNumber) {
27270	if (discardNumber >= data.length) {
27271		return new Uint8Array(0);
27272	}
27273	const c1 = 52845,
27274		c2 = 22719;
27275	let r = key | 0,
27276		i,
27277		j;
27278	for (i = 0; i < discardNumber; i++) {
27279		r = (data[i] + r) * c1 + c2 & (1 << 16) - 1;
27280	}
27281	const count = data.length - discardNumber;
27282	const decrypted = new Uint8Array(count);
27283	for (i = discardNumber, j = 0; j < count; i++, j++) {
27284		const value = data[i];
27285		decrypted[j] = value ^ r >> 8;
27286		r = (value + r) * c1 + c2 & (1 << 16) - 1;
27287	}
27288	return decrypted;
27289}
27290function decryptAscii(data, key, discardNumber) {
27291	const c1 = 52845,
27292		c2 = 22719;
27293	let r = key | 0;
27294	const count = data.length,
27295		maybeLength = count >>> 1;
27296	const decrypted = new Uint8Array(maybeLength);
27297	let i, j;
27298	for (i = 0, j = 0; i < count; i++) {
27299		const digit1 = data[i];
27300		if (!isHexDigit(digit1)) {
27301			continue;
27302		}
27303		i++;
27304		let digit2;
27305		while (i < count && !isHexDigit(digit2 = data[i])) {
27306			i++;
27307		}
27308		if (i < count) {
27309			const value = parseInt(String.fromCharCode(digit1, digit2), 16);
27310			decrypted[j++] = value ^ r >> 8;
27311			r = (value + r) * c1 + c2 & (1 << 16) - 1;
27312		}
27313	}
27314	return decrypted.slice(discardNumber, j);
27315}
27316function isSpecial(c) {
27317	return c === 0x2f || c === 0x5b || c === 0x5d || c === 0x7b || c === 0x7d || c === 0x28 || c === 0x29;
27318}
27319class Type1Parser {
27320	constructor(stream, encrypted, seacAnalysisEnabled) {
27321		if (encrypted) {
27322			const data = stream.getBytes();
27323			const isBinary = !((isHexDigit(data[0]) || isWhiteSpace(data[0])) && isHexDigit(data[1]) && isHexDigit(data[2]) && isHexDigit(data[3]) && isHexDigit(data[4]) && isHexDigit(data[5]) && isHexDigit(data[6]) && isHexDigit(data[7]));
27324			stream = new Stream(isBinary ? decrypt(data, EEXEC_ENCRYPT_KEY, 4) : decryptAscii(data, EEXEC_ENCRYPT_KEY, 4));
27325		}
27326		this.seacAnalysisEnabled = !!seacAnalysisEnabled;
27327		this.stream = stream;
27328		this.nextChar();
27329	}
27330	readNumberArray() {
27331		this.getToken();
27332		const array = [];
27333		while (true) {
27334			const token = this.getToken();
27335			if (token === null || token === "]" || token === "}") {
27336				break;
27337			}
27338			array.push(parseFloat(token || 0));
27339		}
27340		return array;
27341	}
27342	readNumber() {
27343		const token = this.getToken();
27344		return parseFloat(token || 0);
27345	}
27346	readInt() {
27347		const token = this.getToken();
27348		return parseInt(token || 0, 10) | 0;
27349	}
27350	readBoolean() {
27351		const token = this.getToken();
27352		return token === "true" ? 1 : 0;
27353	}
27354	nextChar() {
27355		return this.currentChar = this.stream.getByte();
27356	}
27357	prevChar() {
27358		this.stream.skip(-2);
27359		return this.currentChar = this.stream.getByte();
27360	}
27361	getToken() {
27362		let comment = false;
vendor: 44,761 bytes, lines 27363-28841
27363		let ch = this.currentChar;
27364		while (true) {
27365			if (ch === -1) {
27366				return null;
27367			}
27368			if (comment) {
27369				if (ch === 0x0a || ch === 0x0d) {
27370					comment = false;
27371				}
27372			} else if (ch === 0x25) {
27373				comment = true;
27374			} else if (!isWhiteSpace(ch)) {
27375				break;
27376			}
27377			ch = this.nextChar();
27378		}
27379		if (isSpecial(ch)) {
27380			this.nextChar();
27381			return String.fromCharCode(ch);
27382		}
27383		let token = "";
27384		do {
27385			token += String.fromCharCode(ch);
27386			ch = this.nextChar();
27387		} while (ch >= 0 && !isWhiteSpace(ch) && !isSpecial(ch));
27388		return token;
27389	}
27390	readCharStrings(bytes, lenIV) {
27391		if (lenIV === -1) {
27392			return bytes;
27393		}
27394		return decrypt(bytes, CHAR_STRS_ENCRYPT_KEY, lenIV);
27395	}
27396	extractFontProgram(properties) {
27397		const stream = this.stream;
27398		const subrs = [],
27399			charstrings = [];
27400		const privateData = Object.create(null);
27401		privateData.lenIV = 4;
27402		const program = {
27403			subrs: [],
27404			charstrings: [],
27405			properties: {
27406				privateData
27407			}
27408		};
27409		let token, length, data, lenIV;
27410		while ((token = this.getToken()) !== null) {
27411			if (token !== "/") {
27412				continue;
27413			}
27414			token = this.getToken();
27415			switch (token) {
27416				case "CharStrings":
27417					this.getToken();
27418					this.getToken();
27419					this.getToken();
27420					this.getToken();
27421					while (true) {
27422						token = this.getToken();
27423						if (token === null || token === "end") {
27424							break;
27425						}
27426						if (token !== "/") {
27427							continue;
27428						}
27429						const glyph = this.getToken();
27430						length = this.readInt();
27431						this.getToken();
27432						data = length > 0 ? stream.getBytes(length) : new Uint8Array(0);
27433						lenIV = program.properties.privateData.lenIV;
27434						const encoded = this.readCharStrings(data, lenIV);
27435						this.nextChar();
27436						token = this.getToken();
27437						if (token === "noaccess") {
27438							this.getToken();
27439						} else if (token === "/") {
27440							this.prevChar();
27441						}
27442						charstrings.push({
27443							glyph,
27444							encoded
27445						});
27446					}
27447					break;
27448				case "Subrs":
27449					this.readInt();
27450					this.getToken();
27451					while (this.getToken() === "dup") {
27452						const index = this.readInt();
27453						length = this.readInt();
27454						this.getToken();
27455						data = length > 0 ? stream.getBytes(length) : new Uint8Array(0);
27456						lenIV = program.properties.privateData.lenIV;
27457						const encoded = this.readCharStrings(data, lenIV);
27458						this.nextChar();
27459						token = this.getToken();
27460						if (token === "noaccess") {
27461							this.getToken();
27462						}
27463						subrs[index] = encoded;
27464					}
27465					break;
27466				case "BlueValues":
27467				case "OtherBlues":
27468				case "FamilyBlues":
27469				case "FamilyOtherBlues":
27470					const blueArray = this.readNumberArray();
27471					if (blueArray.length > 0 && blueArray.length % 2 === 0 && HINTING_ENABLED) {
27472						program.properties.privateData[token] = blueArray;
27473					}
27474					break;
27475				case "StemSnapH":
27476				case "StemSnapV":
27477					program.properties.privateData[token] = this.readNumberArray();
27478					break;
27479				case "StdHW":
27480				case "StdVW":
27481					program.properties.privateData[token] = this.readNumberArray()[0];
27482					break;
27483				case "BlueShift":
27484				case "lenIV":
27485				case "BlueFuzz":
27486				case "BlueScale":
27487				case "LanguageGroup":
27488					program.properties.privateData[token] = this.readNumber();
27489					break;
27490				case "ExpansionFactor":
27491					program.properties.privateData[token] = this.readNumber() || 0.06;
27492					break;
27493				case "ForceBold":
27494					program.properties.privateData[token] = this.readBoolean();
27495					break;
27496			}
27497		}
27498		for (const {
27499			encoded,
27500			glyph
27501		} of charstrings) {
27502			const charString = new Type1CharString();
27503			const error = charString.convert(encoded, subrs, this.seacAnalysisEnabled);
27504			let output = charString.output;
27505			if (error) {
27506				output = [14];
27507			}
27508			const charStringObject = {
27509				glyphName: glyph,
27510				charstring: output,
27511				width: charString.width,
27512				lsb: charString.lsb,
27513				seac: charString.seac
27514			};
27515			if (glyph === ".notdef") {
27516				program.charstrings.unshift(charStringObject);
27517			} else {
27518				program.charstrings.push(charStringObject);
27519			}
27520			if (properties.builtInEncoding) {
27521				const index = properties.builtInEncoding.indexOf(glyph);
27522				if (index > -1 && properties.widths[index] === undefined && index >= properties.firstChar && index <= properties.lastChar) {
27523					properties.widths[index] = charString.width;
27524				}
27525			}
27526		}
27527		return program;
27528	}
27529	extractFontHeader(properties) {
27530		let token;
27531		while ((token = this.getToken()) !== null) {
27532			if (token !== "/") {
27533				continue;
27534			}
27535			token = this.getToken();
27536			switch (token) {
27537				case "FontMatrix":
27538					const matrix = this.readNumberArray();
27539					properties.fontMatrix = matrix;
27540					break;
27541				case "Encoding":
27542					const encodingArg = this.getToken();
27543					let encoding;
27544					if (!/^\d+$/.test(encodingArg)) {
27545						encoding = getEncoding(encodingArg);
27546					} else {
27547						encoding = [];
27548						const size = parseInt(encodingArg, 10) | 0;
27549						this.getToken();
27550						for (let j = 0; j < size; j++) {
27551							token = this.getToken();
27552							while (token !== "dup" && token !== "def") {
27553								token = this.getToken();
27554								if (token === null) {
27555									return;
27556								}
27557							}
27558							if (token === "def") {
27559								break;
27560							}
27561							const index = this.readInt();
27562							this.getToken();
27563							const glyph = this.getToken();
27564							encoding[index] = glyph;
27565							this.getToken();
27566						}
27567					}
27568					properties.builtInEncoding = encoding;
27569					break;
27570				case "FontBBox":
27571					const fontBBox = this.readNumberArray();
27572					properties.ascent = Math.max(fontBBox[3], fontBBox[1]);
27573					properties.descent = Math.min(fontBBox[1], fontBBox[3]);
27574					properties.ascentScaled = true;
27575					break;
27576			}
27577		}
27578	}
27579}
27580
27581;// ./src/core/type1_font.js
27582
27583
27584
27585
27586
27587
27588
27589function findBlock(streamBytes, signature, startIndex) {
27590	const streamBytesLength = streamBytes.length;
27591	const signatureLength = signature.length;
27592	const scanLength = streamBytesLength - signatureLength;
27593	let i = startIndex,
27594		found = false;
27595	while (i < scanLength) {
27596		let j = 0;
27597		while (j < signatureLength && streamBytes[i + j] === signature[j]) {
27598			j++;
27599		}
27600		if (j >= signatureLength) {
27601			i += j;
27602			while (i < streamBytesLength && isWhiteSpace(streamBytes[i])) {
27603				i++;
27604			}
27605			found = true;
27606			break;
27607		}
27608		i++;
27609	}
27610	return {
27611		found,
27612		length: i
27613	};
27614}
27615function getHeaderBlock(stream, suggestedLength) {
27616	const EEXEC_SIGNATURE = [0x65, 0x65, 0x78, 0x65, 0x63];
27617	const streamStartPos = stream.pos;
27618	let headerBytes, headerBytesLength, block;
27619	try {
27620		headerBytes = stream.getBytes(suggestedLength);
27621		headerBytesLength = headerBytes.length;
27622	} catch {}
27623	if (headerBytesLength === suggestedLength) {
27624		block = findBlock(headerBytes, EEXEC_SIGNATURE, suggestedLength - 2 * EEXEC_SIGNATURE.length);
27625		if (block.found && block.length === suggestedLength) {
27626			return {
27627				stream: new Stream(headerBytes),
27628				length: suggestedLength
27629			};
27630		}
27631	}
27632	warn('Invalid "Length1" property in Type1 font -- trying to recover.');
27633	stream.pos = streamStartPos;
27634	const SCAN_BLOCK_LENGTH = 2048;
27635	let actualLength;
27636	while (true) {
27637		const scanBytes = stream.peekBytes(SCAN_BLOCK_LENGTH);
27638		block = findBlock(scanBytes, EEXEC_SIGNATURE, 0);
27639		if (block.length === 0) {
27640			break;
27641		}
27642		stream.pos += block.length;
27643		if (block.found) {
27644			actualLength = stream.pos - streamStartPos;
27645			break;
27646		}
27647	}
27648	stream.pos = streamStartPos;
27649	if (actualLength) {
27650		return {
27651			stream: new Stream(stream.getBytes(actualLength)),
27652			length: actualLength
27653		};
27654	}
27655	warn('Unable to recover "Length1" property in Type1 font -- using as is.');
27656	return {
27657		stream: new Stream(stream.getBytes(suggestedLength)),
27658		length: suggestedLength
27659	};
27660}
27661function getEexecBlock(stream, suggestedLength) {
27662	const eexecBytes = stream.getBytes();
27663	if (eexecBytes.length === 0) {
27664		throw new FormatError("getEexecBlock - no font program found.");
27665	}
27666	return {
27667		stream: new Stream(eexecBytes),
27668		length: eexecBytes.length
27669	};
27670}
27671class Type1Font {
27672	constructor(name, file, properties) {
27673		const PFB_HEADER_SIZE = 6;
27674		let headerBlockLength = properties.length1;
27675		let eexecBlockLength = properties.length2;
27676		let pfbHeader = file.peekBytes(PFB_HEADER_SIZE);
27677		const pfbHeaderPresent = pfbHeader[0] === 0x80 && pfbHeader[1] === 0x01;
27678		if (pfbHeaderPresent) {
27679			file.skip(PFB_HEADER_SIZE);
27680			headerBlockLength = pfbHeader[5] << 24 | pfbHeader[4] << 16 | pfbHeader[3] << 8 | pfbHeader[2];
27681		}
27682		const headerBlock = getHeaderBlock(file, headerBlockLength);
27683		const headerBlockParser = new Type1Parser(headerBlock.stream, false, SEAC_ANALYSIS_ENABLED);
27684		headerBlockParser.extractFontHeader(properties);
27685		if (pfbHeaderPresent) {
27686			pfbHeader = file.getBytes(PFB_HEADER_SIZE);
27687			eexecBlockLength = pfbHeader[5] << 24 | pfbHeader[4] << 16 | pfbHeader[3] << 8 | pfbHeader[2];
27688		}
27689		const eexecBlock = getEexecBlock(file, eexecBlockLength);
27690		const eexecBlockParser = new Type1Parser(eexecBlock.stream, true, SEAC_ANALYSIS_ENABLED);
27691		const data = eexecBlockParser.extractFontProgram(properties);
27692		for (const key in data.properties) {
27693			properties[key] = data.properties[key];
27694		}
27695		const charstrings = data.charstrings;
27696		const type2Charstrings = this.getType2Charstrings(charstrings);
27697		const subrs = this.getType2Subrs(data.subrs);
27698		this.charstrings = charstrings;
27699		this.data = this.wrap(name, type2Charstrings, this.charstrings, subrs, properties);
27700		this.seacs = this.getSeacs(data.charstrings);
27701	}
27702	get numGlyphs() {
27703		return this.charstrings.length + 1;
27704	}
27705	getCharset() {
27706		const charset = [".notdef"];
27707		for (const {
27708			glyphName
27709		} of this.charstrings) {
27710			charset.push(glyphName);
27711		}
27712		return charset;
27713	}
27714	getGlyphMapping(properties) {
27715		const charstrings = this.charstrings;
27716		if (properties.composite) {
27717			const charCodeToGlyphId = Object.create(null);
27718			for (let glyphId = 0, charstringsLen = charstrings.length; glyphId < charstringsLen; glyphId++) {
27719				const charCode = properties.cMap.charCodeOf(glyphId);
27720				charCodeToGlyphId[charCode] = glyphId + 1;
27721			}
27722			return charCodeToGlyphId;
27723		}
27724		const glyphNames = [".notdef"];
27725		let builtInEncoding, glyphId;
27726		for (glyphId = 0; glyphId < charstrings.length; glyphId++) {
27727			glyphNames.push(charstrings[glyphId].glyphName);
27728		}
27729		const encoding = properties.builtInEncoding;
27730		if (encoding) {
27731			builtInEncoding = Object.create(null);
27732			for (const charCode in encoding) {
27733				glyphId = glyphNames.indexOf(encoding[charCode]);
27734				if (glyphId >= 0) {
27735					builtInEncoding[charCode] = glyphId;
27736				}
27737			}
27738		}
27739		return type1FontGlyphMapping(properties, builtInEncoding, glyphNames);
27740	}
27741	hasGlyphId(id) {
27742		if (id < 0 || id >= this.numGlyphs) {
27743			return false;
27744		}
27745		if (id === 0) {
27746			return true;
27747		}
27748		const glyph = this.charstrings[id - 1];
27749		return glyph.charstring.length > 0;
27750	}
27751	getSeacs(charstrings) {
27752		const seacMap = [];
27753		for (let i = 0, ii = charstrings.length; i < ii; i++) {
27754			const charstring = charstrings[i];
27755			if (charstring.seac) {
27756				seacMap[i + 1] = charstring.seac;
27757			}
27758		}
27759		return seacMap;
27760	}
27761	getType2Charstrings(type1Charstrings) {
27762		const type2Charstrings = [];
27763		for (const type1Charstring of type1Charstrings) {
27764			type2Charstrings.push(type1Charstring.charstring);
27765		}
27766		return type2Charstrings;
27767	}
27768	getType2Subrs(type1Subrs) {
27769		let bias = 0;
27770		const count = type1Subrs.length;
27771		if (count < 1133) {
27772			bias = 107;
27773		} else if (count < 33769) {
27774			bias = 1131;
27775		} else {
27776			bias = 32768;
27777		}
27778		const type2Subrs = [];
27779		let i;
27780		for (i = 0; i < bias; i++) {
27781			type2Subrs.push([0x0b]);
27782		}
27783		for (i = 0; i < count; i++) {
27784			type2Subrs.push(type1Subrs[i]);
27785		}
27786		return type2Subrs;
27787	}
27788	wrap(name, glyphs, charstrings, subrs, properties) {
27789		const cff = new CFF();
27790		cff.header = new CFFHeader(1, 0, 4, 4);
27791		cff.names = [name];
27792		const topDict = new CFFTopDict();
27793		topDict.setByName("version", 391);
27794		topDict.setByName("Notice", 392);
27795		topDict.setByName("FullName", 393);
27796		topDict.setByName("FamilyName", 394);
27797		topDict.setByName("Weight", 395);
27798		topDict.setByName("Encoding", null);
27799		topDict.setByName("FontMatrix", properties.fontMatrix);
27800		topDict.setByName("FontBBox", properties.bbox);
27801		topDict.setByName("charset", null);
27802		topDict.setByName("CharStrings", null);
27803		topDict.setByName("Private", null);
27804		cff.topDict = topDict;
27805		const strings = new CFFStrings();
27806		strings.add("Version 0.11");
27807		strings.add("See original notice");
27808		strings.add(name);
27809		strings.add(name);
27810		strings.add("Medium");
27811		cff.strings = strings;
27812		cff.globalSubrIndex = new CFFIndex();
27813		const count = glyphs.length;
27814		const charsetArray = [".notdef"];
27815		let i, ii;
27816		for (i = 0; i < count; i++) {
27817			const glyphName = charstrings[i].glyphName;
27818			const index = CFFStandardStrings.indexOf(glyphName);
27819			if (index === -1) {
27820				strings.add(glyphName);
27821			}
27822			charsetArray.push(glyphName);
27823		}
27824		cff.charset = new CFFCharset(false, 0, charsetArray);
27825		const charStringsIndex = new CFFIndex();
27826		charStringsIndex.add([0x8b, 0x0e]);
27827		for (i = 0; i < count; i++) {
27828			charStringsIndex.add(glyphs[i]);
27829		}
27830		cff.charStrings = charStringsIndex;
27831		const privateDict = new CFFPrivateDict();
27832		privateDict.setByName("Subrs", null);
27833		const fields = ["BlueValues", "OtherBlues", "FamilyBlues", "FamilyOtherBlues", "StemSnapH", "StemSnapV", "BlueShift", "BlueFuzz", "BlueScale", "LanguageGroup", "ExpansionFactor", "ForceBold", "StdHW", "StdVW"];
27834		for (i = 0, ii = fields.length; i < ii; i++) {
27835			const field = fields[i];
27836			if (!(field in properties.privateData)) {
27837				continue;
27838			}
27839			const value = properties.privateData[field];
27840			if (Array.isArray(value)) {
27841				for (let j = value.length - 1; j > 0; j--) {
27842					value[j] -= value[j - 1];
27843				}
27844			}
27845			privateDict.setByName(field, value);
27846		}
27847		cff.topDict.privateDict = privateDict;
27848		const subrIndex = new CFFIndex();
27849		for (i = 0, ii = subrs.length; i < ii; i++) {
27850			subrIndex.add(subrs[i]);
27851		}
27852		privateDict.subrsIndex = subrIndex;
27853		const compiler = new CFFCompiler(cff);
27854		return compiler.compile();
27855	}
27856}
27857
27858;// ./src/core/fonts.js
27859
27860
27861
27862
27863
27864
27865
27866
27867
27868
27869
27870
27871
27872
27873
27874
27875
27876
27877
27878
27879
27880
27881
27882
27883
27884
27885
27886
27887
27888
27889
27890
27891
27892
27893
27894
27895const PRIVATE_USE_AREAS = [[0xe000, 0xf8ff], [0x100000, 0x10fffd]];
27896const PDF_GLYPH_SPACE_UNITS = 1000;
27897const EXPORT_DATA_PROPERTIES = ["ascent", "bbox", "black", "bold", "charProcOperatorList", "composite", "cssFontInfo", "data", "defaultVMetrics", "defaultWidth", "descent", "fallbackName", "fontMatrix", "isInvalidPDFjsFont", "isType3Font", "italic", "loadedName", "mimetype", "missingFile", "name", "remeasure", "subtype", "systemFontInfo", "type", "vertical"];
27898const EXPORT_DATA_EXTRA_PROPERTIES = ["cMap", "defaultEncoding", "differences", "isMonospace", "isSerifFont", "isSymbolicFont", "seacMap", "toFontChar", "toUnicode", "vmetrics", "widths"];
27899function adjustWidths(properties) {
27900	if (!properties.fontMatrix) {
27901		return;
27902	}
27903	if (properties.fontMatrix[0] === FONT_IDENTITY_MATRIX[0]) {
27904		return;
27905	}
27906	const scale = 0.001 / properties.fontMatrix[0];
27907	const glyphsWidths = properties.widths;
27908	for (const glyph in glyphsWidths) {
27909		glyphsWidths[glyph] *= scale;
27910	}
27911	properties.defaultWidth *= scale;
27912}
27913function adjustTrueTypeToUnicode(properties, isSymbolicFont, nameRecords) {
27914	if (properties.isInternalFont) {
27915		return;
27916	}
27917	if (properties.hasIncludedToUnicodeMap) {
27918		return;
27919	}
27920	if (properties.hasEncoding) {
27921		return;
27922	}
27923	if (properties.toUnicode instanceof IdentityToUnicodeMap) {
27924		return;
27925	}
27926	if (!isSymbolicFont) {
27927		return;
27928	}
27929	if (nameRecords.length === 0) {
27930		return;
27931	}
27932	if (properties.defaultEncoding === WinAnsiEncoding) {
27933		return;
27934	}
27935	for (const r of nameRecords) {
27936		if (!isWinNameRecord(r)) {
27937			return;
27938		}
27939	}
27940	const encoding = WinAnsiEncoding;
27941	const toUnicode = [],
27942		glyphsUnicodeMap = getGlyphsUnicode();
27943	for (const charCode in encoding) {
27944		const glyphName = encoding[charCode];
27945		if (glyphName === "") {
27946			continue;
27947		}
27948		const unicode = glyphsUnicodeMap[glyphName];
27949		if (unicode === undefined) {
27950			continue;
27951		}
27952		toUnicode[charCode] = String.fromCharCode(unicode);
27953	}
27954	if (toUnicode.length > 0) {
27955		properties.toUnicode.amend(toUnicode);
27956	}
27957}
27958function adjustType1ToUnicode(properties, builtInEncoding) {
27959	if (properties.isInternalFont) {
27960		return;
27961	}
27962	if (properties.hasIncludedToUnicodeMap) {
27963		return;
27964	}
27965	if (builtInEncoding === properties.defaultEncoding) {
27966		return;
27967	}
27968	if (properties.toUnicode instanceof IdentityToUnicodeMap) {
27969		return;
27970	}
27971	const toUnicode = [],
27972		glyphsUnicodeMap = getGlyphsUnicode();
27973	for (const charCode in builtInEncoding) {
27974		if (properties.hasEncoding) {
27975			if (properties.baseEncodingName || properties.differences[charCode] !== undefined) {
27976				continue;
27977			}
27978		}
27979		const glyphName = builtInEncoding[charCode];
27980		const unicode = getUnicodeForGlyph(glyphName, glyphsUnicodeMap);
27981		if (unicode !== -1) {
27982			toUnicode[charCode] = String.fromCharCode(unicode);
27983		}
27984	}
27985	if (toUnicode.length > 0) {
27986		properties.toUnicode.amend(toUnicode);
27987	}
27988}
27989function amendFallbackToUnicode(properties) {
27990	if (!properties.fallbackToUnicode) {
27991		return;
27992	}
27993	if (properties.toUnicode instanceof IdentityToUnicodeMap) {
27994		return;
27995	}
27996	const toUnicode = [];
27997	for (const charCode in properties.fallbackToUnicode) {
27998		if (properties.toUnicode.has(charCode)) {
27999			continue;
28000		}
28001		toUnicode[charCode] = properties.fallbackToUnicode[charCode];
28002	}
28003	if (toUnicode.length > 0) {
28004		properties.toUnicode.amend(toUnicode);
28005	}
28006}
28007class fonts_Glyph {
28008	constructor(originalCharCode, fontChar, unicode, accent, width, vmetric, operatorListId, isSpace, isInFont) {
28009		this.originalCharCode = originalCharCode;
28010		this.fontChar = fontChar;
28011		this.unicode = unicode;
28012		this.accent = accent;
28013		this.width = width;
28014		this.vmetric = vmetric;
28015		this.operatorListId = operatorListId;
28016		this.isSpace = isSpace;
28017		this.isInFont = isInFont;
28018	}
28019	get category() {
28020		return shadow(this, "category", getCharUnicodeCategory(this.unicode), true);
28021	}
28022}
28023function int16(b0, b1) {
28024	return (b0 << 8) + b1;
28025}
28026function writeSignedInt16(bytes, index, value) {
28027	bytes[index + 1] = value;
28028	bytes[index] = value >>> 8;
28029}
28030function signedInt16(b0, b1) {
28031	const value = (b0 << 8) + b1;
28032	return value & 1 << 15 ? value - 0x10000 : value;
28033}
28034function writeUint32(bytes, index, value) {
28035	bytes[index + 3] = value & 0xff;
28036	bytes[index + 2] = value >>> 8;
28037	bytes[index + 1] = value >>> 16;
28038	bytes[index] = value >>> 24;
28039}
28040function int32(b0, b1, b2, b3) {
28041	return (b0 << 24) + (b1 << 16) + (b2 << 8) + b3;
28042}
28043function string16(value) {
28044	return String.fromCharCode(value >> 8 & 0xff, value & 0xff);
28045}
28046function safeString16(value) {
28047	if (value > 0x7fff) {
28048		value = 0x7fff;
28049	} else if (value < -0x8000) {
28050		value = -0x8000;
28051	}
28052	return String.fromCharCode(value >> 8 & 0xff, value & 0xff);
28053}
28054function isTrueTypeFile(file) {
28055	const header = file.peekBytes(4);
28056	return readUint32(header, 0) === 0x00010000 || bytesToString(header) === "true";
28057}
28058function isTrueTypeCollectionFile(file) {
28059	const header = file.peekBytes(4);
28060	return bytesToString(header) === "ttcf";
28061}
28062function isOpenTypeFile(file) {
28063	const header = file.peekBytes(4);
28064	return bytesToString(header) === "OTTO";
28065}
28066function isType1File(file) {
28067	const header = file.peekBytes(2);
28068	if (header[0] === 0x25 && header[1] === 0x21) {
28069		return true;
28070	}
28071	if (header[0] === 0x80 && header[1] === 0x01) {
28072		return true;
28073	}
28074	return false;
28075}
28076function isCFFFile(file) {
28077	const header = file.peekBytes(4);
28078	if (header[0] >= 1 && header[3] >= 1 && header[3] <= 4) {
28079		return true;
28080	}
28081	return false;
28082}
28083function getFontFileType(file, {
28084	type,
28085	subtype,
28086	composite
28087}) {
28088	let fileType, fileSubtype;
28089	if (isTrueTypeFile(file) || isTrueTypeCollectionFile(file)) {
28090		fileType = composite ? "CIDFontType2" : "TrueType";
28091	} else if (isOpenTypeFile(file)) {
28092		fileType = composite ? "CIDFontType2" : "OpenType";
28093	} else if (isType1File(file)) {
28094		if (composite) {
28095			fileType = "CIDFontType0";
28096		} else {
28097			fileType = type === "MMType1" ? "MMType1" : "Type1";
28098		}
28099	} else if (isCFFFile(file)) {
28100		if (composite) {
28101			fileType = "CIDFontType0";
28102			fileSubtype = "CIDFontType0C";
28103		} else {
28104			fileType = type === "MMType1" ? "MMType1" : "Type1";
28105			fileSubtype = "Type1C";
28106		}
28107	} else {
28108		warn("getFontFileType: Unable to detect correct font file Type/Subtype.");
28109		fileType = type;
28110		fileSubtype = subtype;
28111	}
28112	return [fileType, fileSubtype];
28113}
28114function applyStandardFontGlyphMap(map, glyphMap) {
28115	for (const charCode in glyphMap) {
28116		map[+charCode] = glyphMap[charCode];
28117	}
28118}
28119function buildToFontChar(encoding, glyphsUnicodeMap, differences) {
28120	const toFontChar = [];
28121	let unicode;
28122	for (let i = 0, ii = encoding.length; i < ii; i++) {
28123		unicode = getUnicodeForGlyph(encoding[i], glyphsUnicodeMap);
28124		if (unicode !== -1) {
28125			toFontChar[i] = unicode;
28126		}
28127	}
28128	for (const charCode in differences) {
28129		unicode = getUnicodeForGlyph(differences[charCode], glyphsUnicodeMap);
28130		if (unicode !== -1) {
28131			toFontChar[+charCode] = unicode;
28132		}
28133	}
28134	return toFontChar;
28135}
28136function isMacNameRecord(r) {
28137	return r.platform === 1 && r.encoding === 0 && r.language === 0;
28138}
28139function isWinNameRecord(r) {
28140	return r.platform === 3 && r.encoding === 1 && r.language === 0x409;
28141}
28142function convertCidString(charCode, cid, shouldThrow = false) {
28143	switch (cid.length) {
28144		case 1:
28145			return cid.charCodeAt(0);
28146		case 2:
28147			return cid.charCodeAt(0) << 8 | cid.charCodeAt(1);
28148	}
28149	const msg = `Unsupported CID string (charCode ${charCode}): "${cid}".`;
28150	if (shouldThrow) {
28151		throw new FormatError(msg);
28152	}
28153	warn(msg);
28154	return cid;
28155}
28156function adjustMapping(charCodeToGlyphId, hasGlyph, newGlyphZeroId, toUnicode) {
28157	const newMap = Object.create(null);
28158	const toUnicodeExtraMap = new Map();
28159	const toFontChar = [];
28160	const usedGlyphIds = new Set();
28161	let privateUseAreaIndex = 0;
28162	const privateUseOffetStart = PRIVATE_USE_AREAS[privateUseAreaIndex][0];
28163	let nextAvailableFontCharCode = privateUseOffetStart;
28164	let privateUseOffetEnd = PRIVATE_USE_AREAS[privateUseAreaIndex][1];
28165	const isInPrivateArea = code => PRIVATE_USE_AREAS[0][0] <= code && code <= PRIVATE_USE_AREAS[0][1] || PRIVATE_USE_AREAS[1][0] <= code && code <= PRIVATE_USE_AREAS[1][1];
28166	for (const originalCharCode in charCodeToGlyphId) {
28167		let glyphId = charCodeToGlyphId[originalCharCode];
28168		if (!hasGlyph(glyphId)) {
28169			continue;
28170		}
28171		if (nextAvailableFontCharCode > privateUseOffetEnd) {
28172			privateUseAreaIndex++;
28173			if (privateUseAreaIndex >= PRIVATE_USE_AREAS.length) {
28174				warn("Ran out of space in font private use area.");
28175				break;
28176			}
28177			nextAvailableFontCharCode = PRIVATE_USE_AREAS[privateUseAreaIndex][0];
28178			privateUseOffetEnd = PRIVATE_USE_AREAS[privateUseAreaIndex][1];
28179		}
28180		const fontCharCode = nextAvailableFontCharCode++;
28181		if (glyphId === 0) {
28182			glyphId = newGlyphZeroId;
28183		}
28184		let unicode = toUnicode.get(originalCharCode);
28185		if (typeof unicode === "string") {
28186			unicode = unicode.codePointAt(0);
28187		}
28188		if (unicode && !isInPrivateArea(unicode) && !usedGlyphIds.has(glyphId)) {
28189			toUnicodeExtraMap.set(unicode, glyphId);
28190			usedGlyphIds.add(glyphId);
28191		}
28192		newMap[fontCharCode] = glyphId;
28193		toFontChar[originalCharCode] = fontCharCode;
28194	}
28195	return {
28196		toFontChar,
28197		charCodeToGlyphId: newMap,
28198		toUnicodeExtraMap,
28199		nextAvailableFontCharCode
28200	};
28201}
28202function getRanges(glyphs, toUnicodeExtraMap, numGlyphs) {
28203	const codes = [];
28204	for (const charCode in glyphs) {
28205		if (glyphs[charCode] >= numGlyphs) {
28206			continue;
28207		}
28208		codes.push({
28209			fontCharCode: charCode | 0,
28210			glyphId: glyphs[charCode]
28211		});
28212	}
28213	if (toUnicodeExtraMap) {
28214		for (const [unicode, glyphId] of toUnicodeExtraMap) {
28215			if (glyphId >= numGlyphs) {
28216				continue;
28217			}
28218			codes.push({
28219				fontCharCode: unicode,
28220				glyphId
28221			});
28222		}
28223	}
28224	if (codes.length === 0) {
28225		codes.push({
28226			fontCharCode: 0,
28227			glyphId: 0
28228		});
28229	}
28230	codes.sort(function fontGetRangesSort(a, b) {
28231		return a.fontCharCode - b.fontCharCode;
28232	});
28233	const ranges = [];
28234	const length = codes.length;
28235	for (let n = 0; n < length;) {
28236		const start = codes[n].fontCharCode;
28237		const codeIndices = [codes[n].glyphId];
28238		++n;
28239		let end = start;
28240		while (n < length && end + 1 === codes[n].fontCharCode) {
28241			codeIndices.push(codes[n].glyphId);
28242			++end;
28243			++n;
28244			if (end === 0xffff) {
28245				break;
28246			}
28247		}
28248		ranges.push([start, end, codeIndices]);
28249	}
28250	return ranges;
28251}
28252function createCmapTable(glyphs, toUnicodeExtraMap, numGlyphs) {
28253	const ranges = getRanges(glyphs, toUnicodeExtraMap, numGlyphs);
28254	const numTables = ranges.at(-1)[1] > 0xffff ? 2 : 1;
28255	let cmap = "\x00\x00" + string16(numTables) + "\x00\x03" + "\x00\x01" + string32(4 + numTables * 8);
28256	let i, ii, j, jj;
28257	for (i = ranges.length - 1; i >= 0; --i) {
28258		if (ranges[i][0] <= 0xffff) {
28259			break;
28260		}
28261	}
28262	const bmpLength = i + 1;
28263	if (ranges[i][0] < 0xffff && ranges[i][1] === 0xffff) {
28264		ranges[i][1] = 0xfffe;
28265	}
28266	const trailingRangesCount = ranges[i][1] < 0xffff ? 1 : 0;
28267	const segCount = bmpLength + trailingRangesCount;
28268	const searchParams = OpenTypeFileBuilder.getSearchParams(segCount, 2);
28269	let startCount = "";
28270	let endCount = "";
28271	let idDeltas = "";
28272	let idRangeOffsets = "";
28273	let glyphsIds = "";
28274	let bias = 0;
28275	let range, start, end, codes;
28276	for (i = 0, ii = bmpLength; i < ii; i++) {
28277		range = ranges[i];
28278		start = range[0];
28279		end = range[1];
28280		startCount += string16(start);
28281		endCount += string16(end);
28282		codes = range[2];
28283		let contiguous = true;
28284		for (j = 1, jj = codes.length; j < jj; ++j) {
28285			if (codes[j] !== codes[j - 1] + 1) {
28286				contiguous = false;
28287				break;
28288			}
28289		}
28290		if (!contiguous) {
28291			const offset = (segCount - i) * 2 + bias * 2;
28292			bias += end - start + 1;
28293			idDeltas += string16(0);
28294			idRangeOffsets += string16(offset);
28295			for (j = 0, jj = codes.length; j < jj; ++j) {
28296				glyphsIds += string16(codes[j]);
28297			}
28298		} else {
28299			const startCode = codes[0];
28300			idDeltas += string16(startCode - start & 0xffff);
28301			idRangeOffsets += string16(0);
28302		}
28303	}
28304	if (trailingRangesCount > 0) {
28305		endCount += "\xFF\xFF";
28306		startCount += "\xFF\xFF";
28307		idDeltas += "\x00\x01";
28308		idRangeOffsets += "\x00\x00";
28309	}
28310	const format314 = "\x00\x00" + string16(2 * segCount) + string16(searchParams.range) + string16(searchParams.entry) + string16(searchParams.rangeShift) + endCount + "\x00\x00" + startCount + idDeltas + idRangeOffsets + glyphsIds;
28311	let format31012 = "";
28312	let header31012 = "";
28313	if (numTables > 1) {
28314		cmap += "\x00\x03" + "\x00\x0A" + string32(4 + numTables * 8 + 4 + format314.length);
28315		format31012 = "";
28316		for (i = 0, ii = ranges.length; i < ii; i++) {
28317			range = ranges[i];
28318			start = range[0];
28319			codes = range[2];
28320			let code = codes[0];
28321			for (j = 1, jj = codes.length; j < jj; ++j) {
28322				if (codes[j] !== codes[j - 1] + 1) {
28323					end = range[0] + j - 1;
28324					format31012 += string32(start) + string32(end) + string32(code);
28325					start = end + 1;
28326					code = codes[j];
28327				}
28328			}
28329			format31012 += string32(start) + string32(range[1]) + string32(code);
28330		}
28331		header31012 = "\x00\x0C" + "\x00\x00" + string32(format31012.length + 16) + "\x00\x00\x00\x00" + string32(format31012.length / 12);
28332	}
28333	return cmap + "\x00\x04" + string16(format314.length + 4) + format314 + header31012 + format31012;
28334}
28335function validateOS2Table(os2, file) {
28336	file.pos = (file.start || 0) + os2.offset;
28337	const version = file.getUint16();
28338	file.skip(60);
28339	const selection = file.getUint16();
28340	if (version < 4 && selection & 0x0300) {
28341		return false;
28342	}
28343	const firstChar = file.getUint16();
28344	const lastChar = file.getUint16();
28345	if (firstChar > lastChar) {
28346		return false;
28347	}
28348	file.skip(6);
28349	const usWinAscent = file.getUint16();
28350	if (usWinAscent === 0) {
28351		return false;
28352	}
28353	os2.data[8] = os2.data[9] = 0;
28354	return true;
28355}
28356function createOS2Table(properties, charstrings, override) {
28357	override ||= {
28358		unitsPerEm: 0,
28359		yMax: 0,
28360		yMin: 0,
28361		ascent: 0,
28362		descent: 0
28363	};
28364	let ulUnicodeRange1 = 0;
28365	let ulUnicodeRange2 = 0;
28366	let ulUnicodeRange3 = 0;
28367	let ulUnicodeRange4 = 0;
28368	let firstCharIndex = null;
28369	let lastCharIndex = 0;
28370	let position = -1;
28371	if (charstrings) {
28372		for (let code in charstrings) {
28373			code |= 0;
28374			if (firstCharIndex > code || !firstCharIndex) {
28375				firstCharIndex = code;
28376			}
28377			if (lastCharIndex < code) {
28378				lastCharIndex = code;
28379			}
28380			position = getUnicodeRangeFor(code, position);
28381			if (position < 32) {
28382				ulUnicodeRange1 |= 1 << position;
28383			} else if (position < 64) {
28384				ulUnicodeRange2 |= 1 << position - 32;
28385			} else if (position < 96) {
28386				ulUnicodeRange3 |= 1 << position - 64;
28387			} else if (position < 123) {
28388				ulUnicodeRange4 |= 1 << position - 96;
28389			} else {
28390				throw new FormatError("Unicode ranges Bits > 123 are reserved for internal usage");
28391			}
28392		}
28393		if (lastCharIndex > 0xffff) {
28394			lastCharIndex = 0xffff;
28395		}
28396	} else {
28397		firstCharIndex = 0;
28398		lastCharIndex = 255;
28399	}
28400	const bbox = properties.bbox || [0, 0, 0, 0];
28401	const unitsPerEm = override.unitsPerEm || (properties.fontMatrix ? 1 / Math.max(...properties.fontMatrix.slice(0, 4).map(Math.abs)) : 1000);
28402	const scale = properties.ascentScaled ? 1.0 : unitsPerEm / PDF_GLYPH_SPACE_UNITS;
28403	const typoAscent = override.ascent || Math.round(scale * (properties.ascent || bbox[3]));
28404	let typoDescent = override.descent || Math.round(scale * (properties.descent || bbox[1]));
28405	if (typoDescent > 0 && properties.descent > 0 && bbox[1] < 0) {
28406		typoDescent = -typoDescent;
28407	}
28408	const winAscent = override.yMax || typoAscent;
28409	const winDescent = -override.yMin || -typoDescent;
28410	return "\x00\x03" + "\x02\x24" + "\x01\xF4" + "\x00\x05" + "\x00\x00" + "\x02\x8A" + "\x02\xBB" + "\x00\x00" + "\x00\x8C" + "\x02\x8A" + "\x02\xBB" + "\x00\x00" + "\x01\xDF" + "\x00\x31" + "\x01\x02" + "\x00\x00" + "\x00\x00\x06" + String.fromCharCode(properties.fixedPitch ? 0x09 : 0x00) + "\x00\x00\x00\x00\x00\x00" + string32(ulUnicodeRange1) + string32(ulUnicodeRange2) + string32(ulUnicodeRange3) + string32(ulUnicodeRange4) + "\x2A\x32\x31\x2A" + string16(properties.italicAngle ? 1 : 0) + string16(firstCharIndex || properties.firstChar) + string16(lastCharIndex || properties.lastChar) + string16(typoAscent) + string16(typoDescent) + "\x00\x64" + string16(winAscent) + string16(winDescent) + "\x00\x00\x00\x00" + "\x00\x00\x00\x00" + string16(properties.xHeight) + string16(properties.capHeight) + string16(0) + string16(firstCharIndex || properties.firstChar) + "\x00\x03";
28411}
28412function createPostTable(properties) {
28413	const angle = Math.floor(properties.italicAngle * 2 ** 16);
28414	return "\x00\x03\x00\x00" + string32(angle) + "\x00\x00" + "\x00\x00" + string32(properties.fixedPitch ? 1 : 0) + "\x00\x00\x00\x00" + "\x00\x00\x00\x00" + "\x00\x00\x00\x00" + "\x00\x00\x00\x00";
28415}
28416function createPostscriptName(name) {
28417	return name.replaceAll(/[^\x21-\x7E]|[[\](){}<>/%]/g, "").slice(0, 63);
28418}
28419function createNameTable(name, proto) {
28420	if (!proto) {
28421		proto = [[], []];
28422	}
28423	const strings = [proto[0][0] || "Original licence", proto[0][1] || name, proto[0][2] || "Unknown", proto[0][3] || "uniqueID", proto[0][4] || name, proto[0][5] || "Version 0.11", proto[0][6] || createPostscriptName(name), proto[0][7] || "Unknown", proto[0][8] || "Unknown", proto[0][9] || "Unknown"];
28424	const stringsUnicode = [];
28425	let i, ii, j, jj, str;
28426	for (i = 0, ii = strings.length; i < ii; i++) {
28427		str = proto[1][i] || strings[i];
28428		const strBufUnicode = [];
28429		for (j = 0, jj = str.length; j < jj; j++) {
28430			strBufUnicode.push(string16(str.charCodeAt(j)));
28431		}
28432		stringsUnicode.push(strBufUnicode.join(""));
28433	}
28434	const names = [strings, stringsUnicode];
28435	const platforms = ["\x00\x01", "\x00\x03"];
28436	const encodings = ["\x00\x00", "\x00\x01"];
28437	const languages = ["\x00\x00", "\x04\x09"];
28438	const namesRecordCount = strings.length * platforms.length;
28439	let nameTable = "\x00\x00" + string16(namesRecordCount) + string16(namesRecordCount * 12 + 6);
28440	let strOffset = 0;
28441	for (i = 0, ii = platforms.length; i < ii; i++) {
28442		const strs = names[i];
28443		for (j = 0, jj = strs.length; j < jj; j++) {
28444			str = strs[j];
28445			const nameRecord = platforms[i] + encodings[i] + languages[i] + string16(j) + string16(str.length) + string16(strOffset);
28446			nameTable += nameRecord;
28447			strOffset += str.length;
28448		}
28449	}
28450	nameTable += strings.join("") + stringsUnicode.join("");
28451	return nameTable;
28452}
28453class Font {
28454	constructor(name, file, properties) {
28455		this.name = name;
28456		this.psName = null;
28457		this.mimetype = null;
28458		this.disableFontFace = false;
28459		this.loadedName = properties.loadedName;
28460		this.isType3Font = properties.isType3Font;
28461		this.missingFile = false;
28462		this.cssFontInfo = properties.cssFontInfo;
28463		this._charsCache = Object.create(null);
28464		this._glyphCache = Object.create(null);
28465		let isSerifFont = !!(properties.flags & FontFlags.Serif);
28466		if (!isSerifFont && !properties.isSimulatedFlags) {
28467			const baseName = name.replaceAll(/[,_]/g, "-").split("-", 1)[0],
28468				serifFonts = getSerifFonts();
28469			for (const namePart of baseName.split("+")) {
28470				if (serifFonts[namePart]) {
28471					isSerifFont = true;
28472					break;
28473				}
28474			}
28475		}
28476		this.isSerifFont = isSerifFont;
28477		this.isSymbolicFont = !!(properties.flags & FontFlags.Symbolic);
28478		this.isMonospace = !!(properties.flags & FontFlags.FixedPitch);
28479		let {
28480			type,
28481			subtype
28482		} = properties;
28483		this.type = type;
28484		this.subtype = subtype;
28485		this.systemFontInfo = properties.systemFontInfo;
28486		const matches = name.match(/^InvalidPDFjsFont_(.*)_\d+$/);
28487		this.isInvalidPDFjsFont = !!matches;
28488		if (this.isInvalidPDFjsFont) {
28489			this.fallbackName = matches[1];
28490		} else if (this.isMonospace) {
28491			this.fallbackName = "monospace";
28492		} else if (this.isSerifFont) {
28493			this.fallbackName = "serif";
28494		} else {
28495			this.fallbackName = "sans-serif";
28496		}
28497		if (this.systemFontInfo?.guessFallback) {
28498			this.systemFontInfo.guessFallback = false;
28499			this.systemFontInfo.css += `,${this.fallbackName}`;
28500		}
28501		this.differences = properties.differences;
28502		this.widths = properties.widths;
28503		this.defaultWidth = properties.defaultWidth;
28504		this.composite = properties.composite;
28505		this.cMap = properties.cMap;
28506		this.capHeight = properties.capHeight / PDF_GLYPH_SPACE_UNITS;
28507		this.ascent = properties.ascent / PDF_GLYPH_SPACE_UNITS;
28508		this.descent = properties.descent / PDF_GLYPH_SPACE_UNITS;
28509		this.lineHeight = this.ascent - this.descent;
28510		this.fontMatrix = properties.fontMatrix;
28511		this.bbox = properties.bbox;
28512		this.defaultEncoding = properties.defaultEncoding;
28513		this.toUnicode = properties.toUnicode;
28514		this.toFontChar = [];
28515		if (properties.type === "Type3") {
28516			for (let charCode = 0; charCode < 256; charCode++) {
28517				this.toFontChar[charCode] = this.differences[charCode] || properties.defaultEncoding[charCode];
28518			}
28519			return;
28520		}
28521		this.cidEncoding = properties.cidEncoding || "";
28522		this.vertical = !!properties.vertical;
28523		if (this.vertical) {
28524			this.vmetrics = properties.vmetrics;
28525			this.defaultVMetrics = properties.defaultVMetrics;
28526		}
28527		if (!file || file.isEmpty) {
28528			if (file) {
28529				warn('Font file is empty in "' + name + '" (' + this.loadedName + ")");
28530			}
28531			this.fallbackToSystemFont(properties);
28532			return;
28533		}
28534		[type, subtype] = getFontFileType(file, properties);
28535		if (type !== this.type || subtype !== this.subtype) {
28536			info("Inconsistent font file Type/SubType, expected: " + `${this.type}/${this.subtype} but found: ${type}/${subtype}.`);
28537		}
28538		let data;
28539		try {
28540			switch (type) {
28541				case "MMType1":
28542					info("MMType1 font (" + name + "), falling back to Type1.");
28543				case "Type1":
28544				case "CIDFontType0":
28545					this.mimetype = "font/opentype";
28546					const cff = subtype === "Type1C" || subtype === "CIDFontType0C" ? new CFFFont(file, properties) : new Type1Font(name, file, properties);
28547					adjustWidths(properties);
28548					data = this.convert(name, cff, properties);
28549					break;
28550				case "OpenType":
28551				case "TrueType":
28552				case "CIDFontType2":
28553					this.mimetype = "font/opentype";
28554					data = this.checkAndRepair(name, file, properties);
28555					if (this.isOpenType) {
28556						adjustWidths(properties);
28557						type = "OpenType";
28558					}
28559					break;
28560				default:
28561					throw new FormatError(`Font ${type} is not supported`);
28562			}
28563		} catch (e) {
28564			warn(e);
28565			this.fallbackToSystemFont(properties);
28566			return;
28567		}
28568		amendFallbackToUnicode(properties);
28569		this.data = data;
28570		this.type = type;
28571		this.subtype = subtype;
28572		this.fontMatrix = properties.fontMatrix;
28573		this.widths = properties.widths;
28574		this.defaultWidth = properties.defaultWidth;
28575		this.toUnicode = properties.toUnicode;
28576		this.seacMap = properties.seacMap;
28577	}
28578	get renderer() {
28579		const renderer = FontRendererFactory.create(this, SEAC_ANALYSIS_ENABLED);
28580		return shadow(this, "renderer", renderer);
28581	}
28582	exportData(extraProperties = false) {
28583		const exportDataProperties = extraProperties ? [...EXPORT_DATA_PROPERTIES, ...EXPORT_DATA_EXTRA_PROPERTIES] : EXPORT_DATA_PROPERTIES;
28584		const data = Object.create(null);
28585		let property, value;
28586		for (property of exportDataProperties) {
28587			value = this[property];
28588			if (value !== undefined) {
28589				data[property] = value;
28590			}
28591		}
28592		return data;
28593	}
28594	fallbackToSystemFont(properties) {
28595		this.missingFile = true;
28596		const {
28597			name,
28598			type
28599		} = this;
28600		let fontName = normalizeFontName(name);
28601		const stdFontMap = getStdFontMap(),
28602			nonStdFontMap = getNonStdFontMap();
28603		const isStandardFont = !!stdFontMap[fontName];
28604		const isMappedToStandardFont = !!(nonStdFontMap[fontName] && stdFontMap[nonStdFontMap[fontName]]);
28605		fontName = stdFontMap[fontName] || nonStdFontMap[fontName] || fontName;
28606		const fontBasicMetricsMap = getFontBasicMetrics();
28607		const metrics = fontBasicMetricsMap[fontName];
28608		if (metrics) {
28609			if (isNaN(this.ascent)) {
28610				this.ascent = metrics.ascent / PDF_GLYPH_SPACE_UNITS;
28611			}
28612			if (isNaN(this.descent)) {
28613				this.descent = metrics.descent / PDF_GLYPH_SPACE_UNITS;
28614			}
28615			if (isNaN(this.capHeight)) {
28616				this.capHeight = metrics.capHeight / PDF_GLYPH_SPACE_UNITS;
28617			}
28618		}
28619		this.bold = /bold/gi.test(fontName);
28620		this.italic = /oblique|italic/gi.test(fontName);
28621		this.black = /Black/g.test(name);
28622		const isNarrow = /Narrow/g.test(name);
28623		this.remeasure = (!isStandardFont || isNarrow) && Object.keys(this.widths).length > 0;
28624		if ((isStandardFont || isMappedToStandardFont) && type === "CIDFontType2" && this.cidEncoding.startsWith("Identity-")) {
28625			const cidToGidMap = properties.cidToGidMap;
28626			const map = [];
28627			applyStandardFontGlyphMap(map, getGlyphMapForStandardFonts());
28628			if (/Arial-?Black/i.test(name)) {
28629				applyStandardFontGlyphMap(map, getSupplementalGlyphMapForArialBlack());
28630			} else if (/Calibri/i.test(name)) {
28631				applyStandardFontGlyphMap(map, getSupplementalGlyphMapForCalibri());
28632			}
28633			if (cidToGidMap) {
28634				for (const charCode in map) {
28635					const cid = map[charCode];
28636					if (cidToGidMap[cid] !== undefined) {
28637						map[+charCode] = cidToGidMap[cid];
28638					}
28639				}
28640				if (cidToGidMap.length !== this.toUnicode.length && properties.hasIncludedToUnicodeMap && this.toUnicode instanceof IdentityToUnicodeMap) {
28641					this.toUnicode.forEach(function (charCode, unicodeCharCode) {
28642						const cid = map[charCode];
28643						if (cidToGidMap[cid] === undefined) {
28644							map[+charCode] = unicodeCharCode;
28645						}
28646					});
28647				}
28648			}
28649			if (!(this.toUnicode instanceof IdentityToUnicodeMap)) {
28650				this.toUnicode.forEach(function (charCode, unicodeCharCode) {
28651					map[+charCode] = unicodeCharCode;
28652				});
28653			}
28654			this.toFontChar = map;
28655			this.toUnicode = new ToUnicodeMap(map);
28656		} else if (/Symbol/i.test(fontName)) {
28657			this.toFontChar = buildToFontChar(SymbolSetEncoding, getGlyphsUnicode(), this.differences);
28658		} else if (/Dingbats/i.test(fontName)) {
28659			this.toFontChar = buildToFontChar(ZapfDingbatsEncoding, getDingbatsGlyphsUnicode(), this.differences);
28660		} else if (isStandardFont || isMappedToStandardFont) {
28661			const map = buildToFontChar(this.defaultEncoding, getGlyphsUnicode(), this.differences);
28662			if (type === "CIDFontType2" && !this.cidEncoding.startsWith("Identity-") && !(this.toUnicode instanceof IdentityToUnicodeMap)) {
28663				this.toUnicode.forEach(function (charCode, unicodeCharCode) {
28664					map[+charCode] = unicodeCharCode;
28665				});
28666			}
28667			this.toFontChar = map;
28668		} else {
28669			const glyphsUnicodeMap = getGlyphsUnicode();
28670			const map = [];
28671			this.toUnicode.forEach((charCode, unicodeCharCode) => {
28672				if (!this.composite) {
28673					const glyphName = this.differences[charCode] || this.defaultEncoding[charCode];
28674					const unicode = getUnicodeForGlyph(glyphName, glyphsUnicodeMap);
28675					if (unicode !== -1) {
28676						unicodeCharCode = unicode;
28677					}
28678				}
28679				map[+charCode] = unicodeCharCode;
28680			});
28681			if (this.composite && this.toUnicode instanceof IdentityToUnicodeMap) {
28682				if (/Tahoma|Verdana/i.test(name)) {
28683					applyStandardFontGlyphMap(map, getGlyphMapForStandardFonts());
28684				}
28685			}
28686			this.toFontChar = map;
28687		}
28688		amendFallbackToUnicode(properties);
28689		this.loadedName = fontName.split("-", 1)[0];
28690	}
28691	checkAndRepair(name, font, properties) {
28692		const VALID_TABLES = ["OS/2", "cmap", "head", "hhea", "hmtx", "maxp", "name", "post", "loca", "glyf", "fpgm", "prep", "cvt ", "CFF "];
28693		function readTables(file, numTables) {
28694			const tables = Object.create(null);
28695			tables["OS/2"] = null;
28696			tables.cmap = null;
28697			tables.head = null;
28698			tables.hhea = null;
28699			tables.hmtx = null;
28700			tables.maxp = null;
28701			tables.name = null;
28702			tables.post = null;
28703			for (let i = 0; i < numTables; i++) {
28704				const table = readTableEntry(file);
28705				if (!VALID_TABLES.includes(table.tag)) {
28706					continue;
28707				}
28708				if (table.length === 0) {
28709					continue;
28710				}
28711				tables[table.tag] = table;
28712			}
28713			return tables;
28714		}
28715		function readTableEntry(file) {
28716			const tag = file.getString(4);
28717			const checksum = file.getInt32() >>> 0;
28718			const offset = file.getInt32() >>> 0;
28719			const length = file.getInt32() >>> 0;
28720			const previousPosition = file.pos;
28721			file.pos = file.start || 0;
28722			file.skip(offset);
28723			const data = file.getBytes(length);
28724			file.pos = previousPosition;
28725			if (tag === "head") {
28726				data[8] = data[9] = data[10] = data[11] = 0;
28727				data[17] |= 0x20;
28728			}
28729			return {
28730				tag,
28731				checksum,
28732				length,
28733				offset,
28734				data
28735			};
28736		}
28737		function readOpenTypeHeader(ttf) {
28738			return {
28739				version: ttf.getString(4),
28740				numTables: ttf.getUint16(),
28741				searchRange: ttf.getUint16(),
28742				entrySelector: ttf.getUint16(),
28743				rangeShift: ttf.getUint16()
28744			};
28745		}
28746		function readTrueTypeCollectionHeader(ttc) {
28747			const ttcTag = ttc.getString(4);
28748			assert(ttcTag === "ttcf", "Must be a TrueType Collection font.");
28749			const majorVersion = ttc.getUint16();
28750			const minorVersion = ttc.getUint16();
28751			const numFonts = ttc.getInt32() >>> 0;
28752			const offsetTable = [];
28753			for (let i = 0; i < numFonts; i++) {
28754				offsetTable.push(ttc.getInt32() >>> 0);
28755			}
28756			const header = {
28757				ttcTag,
28758				majorVersion,
28759				minorVersion,
28760				numFonts,
28761				offsetTable
28762			};
28763			switch (majorVersion) {
28764				case 1:
28765					return header;
28766				case 2:
28767					header.dsigTag = ttc.getInt32() >>> 0;
28768					header.dsigLength = ttc.getInt32() >>> 0;
28769					header.dsigOffset = ttc.getInt32() >>> 0;
28770					return header;
28771			}
28772			throw new FormatError(`Invalid TrueType Collection majorVersion: ${majorVersion}.`);
28773		}
28774		function readTrueTypeCollectionData(ttc, fontName) {
28775			const {
28776				numFonts,
28777				offsetTable
28778			} = readTrueTypeCollectionHeader(ttc);
28779			const fontNameParts = fontName.split("+");
28780			let fallbackData;
28781			for (let i = 0; i < numFonts; i++) {
28782				ttc.pos = (ttc.start || 0) + offsetTable[i];
28783				const potentialHeader = readOpenTypeHeader(ttc);
28784				const potentialTables = readTables(ttc, potentialHeader.numTables);
28785				if (!potentialTables.name) {
28786					throw new FormatError('TrueType Collection font must contain a "name" table.');
28787				}
28788				const [nameTable] = readNameTable(potentialTables.name);
28789				for (let j = 0, jj = nameTable.length; j < jj; j++) {
28790					for (let k = 0, kk = nameTable[j].length; k < kk; k++) {
28791						const nameEntry = nameTable[j][k]?.replaceAll(/\s/g, "");
28792						if (!nameEntry) {
28793							continue;
28794						}
28795						if (nameEntry === fontName) {
28796							return {
28797								header: potentialHeader,
28798								tables: potentialTables
28799							};
28800						}
28801						if (fontNameParts.length < 2) {
28802							continue;
28803						}
28804						for (const part of fontNameParts) {
28805							if (nameEntry === part) {
28806								fallbackData = {
28807									name: part,
28808									header: potentialHeader,
28809									tables: potentialTables
28810								};
28811							}
28812						}
28813					}
28814				}
28815			}
28816			if (fallbackData) {
28817				warn(`TrueType Collection does not contain "${fontName}" font, ` + `falling back to "${fallbackData.name}" font instead.`);
28818				return {
28819					header: fallbackData.header,
28820					tables: fallbackData.tables
28821				};
28822			}
28823			throw new FormatError(`TrueType Collection does not contain "${fontName}" font.`);
28824		}
28825		function readCmapTable(cmap, file, isSymbolicFont, hasEncoding) {
28826			if (!cmap) {
28827				warn("No cmap table available.");
28828				return {
28829					platformId: -1,
28830					encodingId: -1,
28831					mappings: [],
28832					hasShortCmap: false
28833				};
28834			}
28835			let segment;
28836			let start = (file.start || 0) + cmap.offset;
28837			file.pos = start;
28838			file.skip(2);
28839			const numTables = file.getUint16();
28840			let potentialTable;
28841			let canBreak = false;
vendor: 9,409 bytes, lines 28842-29174
28842			for (let i = 0; i < numTables; i++) {
28843				const platformId = file.getUint16();
28844				const encodingId = file.getUint16();
28845				const offset = file.getInt32() >>> 0;
28846				let useTable = false;
28847				if (potentialTable?.platformId === platformId && potentialTable?.encodingId === encodingId) {
28848					continue;
28849				}
28850				if (platformId === 0 && (encodingId === 0 || encodingId === 1 || encodingId === 3)) {
28851					useTable = true;
28852				} else if (platformId === 1 && encodingId === 0) {
28853					useTable = true;
28854				} else if (platformId === 3 && encodingId === 1 && (hasEncoding || !potentialTable)) {
28855					useTable = true;
28856					if (!isSymbolicFont) {
28857						canBreak = true;
28858					}
28859				} else if (isSymbolicFont && platformId === 3 && encodingId === 0) {
28860					useTable = true;
28861					let correctlySorted = true;
28862					if (i < numTables - 1) {
28863						const nextBytes = file.peekBytes(2),
28864							nextPlatformId = int16(nextBytes[0], nextBytes[1]);
28865						if (nextPlatformId < platformId) {
28866							correctlySorted = false;
28867						}
28868					}
28869					if (correctlySorted) {
28870						canBreak = true;
28871					}
28872				}
28873				if (useTable) {
28874					potentialTable = {
28875						platformId,
28876						encodingId,
28877						offset
28878					};
28879				}
28880				if (canBreak) {
28881					break;
28882				}
28883			}
28884			if (potentialTable) {
28885				file.pos = start + potentialTable.offset;
28886			}
28887			if (!potentialTable || file.peekByte() === -1) {
28888				warn("Could not find a preferred cmap table.");
28889				return {
28890					platformId: -1,
28891					encodingId: -1,
28892					mappings: [],
28893					hasShortCmap: false
28894				};
28895			}
28896			const format = file.getUint16();
28897			let hasShortCmap = false;
28898			const mappings = [];
28899			let j, glyphId;
28900			if (format === 0) {
28901				file.skip(2 + 2);
28902				for (j = 0; j < 256; j++) {
28903					const index = file.getByte();
28904					if (!index) {
28905						continue;
28906					}
28907					mappings.push({
28908						charCode: j,
28909						glyphId: index
28910					});
28911				}
28912				hasShortCmap = true;
28913			} else if (format === 2) {
28914				file.skip(2 + 2);
28915				const subHeaderKeys = [];
28916				let maxSubHeaderKey = 0;
28917				for (let i = 0; i < 256; i++) {
28918					const subHeaderKey = file.getUint16() >> 3;
28919					subHeaderKeys.push(subHeaderKey);
28920					maxSubHeaderKey = Math.max(subHeaderKey, maxSubHeaderKey);
28921				}
28922				const subHeaders = [];
28923				for (let i = 0; i <= maxSubHeaderKey; i++) {
28924					subHeaders.push({
28925						firstCode: file.getUint16(),
28926						entryCount: file.getUint16(),
28927						idDelta: signedInt16(file.getByte(), file.getByte()),
28928						idRangePos: file.pos + file.getUint16()
28929					});
28930				}
28931				for (let i = 0; i < 256; i++) {
28932					if (subHeaderKeys[i] === 0) {
28933						file.pos = subHeaders[0].idRangePos + 2 * i;
28934						glyphId = file.getUint16();
28935						mappings.push({
28936							charCode: i,
28937							glyphId
28938						});
28939					} else {
28940						const s = subHeaders[subHeaderKeys[i]];
28941						for (j = 0; j < s.entryCount; j++) {
28942							const charCode = (i << 8) + j + s.firstCode;
28943							file.pos = s.idRangePos + 2 * j;
28944							glyphId = file.getUint16();
28945							if (glyphId !== 0) {
28946								glyphId = (glyphId + s.idDelta) % 65536;
28947							}
28948							mappings.push({
28949								charCode,
28950								glyphId
28951							});
28952						}
28953					}
28954				}
28955			} else if (format === 4) {
28956				file.skip(2 + 2);
28957				const segCount = file.getUint16() >> 1;
28958				file.skip(6);
28959				const segments = [];
28960				let segIndex;
28961				for (segIndex = 0; segIndex < segCount; segIndex++) {
28962					segments.push({
28963						end: file.getUint16()
28964					});
28965				}
28966				file.skip(2);
28967				for (segIndex = 0; segIndex < segCount; segIndex++) {
28968					segments[segIndex].start = file.getUint16();
28969				}
28970				for (segIndex = 0; segIndex < segCount; segIndex++) {
28971					segments[segIndex].delta = file.getUint16();
28972				}
28973				let offsetsCount = 0,
28974					offsetIndex;
28975				for (segIndex = 0; segIndex < segCount; segIndex++) {
28976					segment = segments[segIndex];
28977					const rangeOffset = file.getUint16();
28978					if (!rangeOffset) {
28979						segment.offsetIndex = -1;
28980						continue;
28981					}
28982					offsetIndex = (rangeOffset >> 1) - (segCount - segIndex);
28983					segment.offsetIndex = offsetIndex;
28984					offsetsCount = Math.max(offsetsCount, offsetIndex + segment.end - segment.start + 1);
28985				}
28986				const offsets = [];
28987				for (j = 0; j < offsetsCount; j++) {
28988					offsets.push(file.getUint16());
28989				}
28990				for (segIndex = 0; segIndex < segCount; segIndex++) {
28991					segment = segments[segIndex];
28992					start = segment.start;
28993					const end = segment.end;
28994					const delta = segment.delta;
28995					offsetIndex = segment.offsetIndex;
28996					for (j = start; j <= end; j++) {
28997						if (j === 0xffff) {
28998							continue;
28999						}
29000						glyphId = offsetIndex < 0 ? j : offsets[offsetIndex + j - start];
29001						glyphId = glyphId + delta & 0xffff;
29002						mappings.push({
29003							charCode: j,
29004							glyphId
29005						});
29006					}
29007				}
29008			} else if (format === 6) {
29009				file.skip(2 + 2);
29010				const firstCode = file.getUint16();
29011				const entryCount = file.getUint16();
29012				for (j = 0; j < entryCount; j++) {
29013					glyphId = file.getUint16();
29014					const charCode = firstCode + j;
29015					mappings.push({
29016						charCode,
29017						glyphId
29018					});
29019				}
29020			} else if (format === 12) {
29021				file.skip(2 + 4 + 4);
29022				const nGroups = file.getInt32() >>> 0;
29023				for (j = 0; j < nGroups; j++) {
29024					const startCharCode = file.getInt32() >>> 0;
29025					const endCharCode = file.getInt32() >>> 0;
29026					let glyphCode = file.getInt32() >>> 0;
29027					for (let charCode = startCharCode; charCode <= endCharCode; charCode++) {
29028						mappings.push({
29029							charCode,
29030							glyphId: glyphCode++
29031						});
29032					}
29033				}
29034			} else {
29035				warn("cmap table has unsupported format: " + format);
29036				return {
29037					platformId: -1,
29038					encodingId: -1,
29039					mappings: [],
29040					hasShortCmap: false
29041				};
29042			}
29043			mappings.sort(function (a, b) {
29044				return a.charCode - b.charCode;
29045			});
29046			for (let i = 1; i < mappings.length; i++) {
29047				if (mappings[i - 1].charCode === mappings[i].charCode) {
29048					mappings.splice(i, 1);
29049					i--;
29050				}
29051			}
29052			return {
29053				platformId: potentialTable.platformId,
29054				encodingId: potentialTable.encodingId,
29055				mappings,
29056				hasShortCmap
29057			};
29058		}
29059		function sanitizeMetrics(file, header, metrics, headTable, numGlyphs, dupFirstEntry) {
29060			if (!header) {
29061				if (metrics) {
29062					metrics.data = null;
29063				}
29064				return;
29065			}
29066			file.pos = (file.start || 0) + header.offset;
29067			file.pos += 4;
29068			file.pos += 2;
29069			file.pos += 2;
29070			file.pos += 2;
29071			file.pos += 2;
29072			file.pos += 2;
29073			file.pos += 2;
29074			file.pos += 2;
29075			file.pos += 2;
29076			file.pos += 2;
29077			const caretOffset = file.getUint16();
29078			file.pos += 8;
29079			file.pos += 2;
29080			let numOfMetrics = file.getUint16();
29081			if (caretOffset !== 0) {
29082				const macStyle = int16(headTable.data[44], headTable.data[45]);
29083				if (!(macStyle & 2)) {
29084					header.data[22] = 0;
29085					header.data[23] = 0;
29086				}
29087			}
29088			if (numOfMetrics > numGlyphs) {
29089				info(`The numOfMetrics (${numOfMetrics}) should not be ` + `greater than the numGlyphs (${numGlyphs}).`);
29090				numOfMetrics = numGlyphs;
29091				header.data[34] = (numOfMetrics & 0xff00) >> 8;
29092				header.data[35] = numOfMetrics & 0x00ff;
29093			}
29094			const numOfSidebearings = numGlyphs - numOfMetrics;
29095			const numMissing = numOfSidebearings - (metrics.length - numOfMetrics * 4 >> 1);
29096			if (numMissing > 0) {
29097				const entries = new Uint8Array(metrics.length + numMissing * 2);
29098				entries.set(metrics.data);
29099				if (dupFirstEntry) {
29100					entries[metrics.length] = metrics.data[2];
29101					entries[metrics.length + 1] = metrics.data[3];
29102				}
29103				metrics.data = entries;
29104			}
29105		}
29106		function sanitizeGlyph(source, sourceStart, sourceEnd, dest, destStart, hintsValid) {
29107			const glyphProfile = {
29108				length: 0,
29109				sizeOfInstructions: 0
29110			};
29111			if (sourceStart < 0 || sourceStart >= source.length || sourceEnd > source.length || sourceEnd - sourceStart <= 12) {
29112				return glyphProfile;
29113			}
29114			const glyf = source.subarray(sourceStart, sourceEnd);
29115			const xMin = signedInt16(glyf[2], glyf[3]);
29116			const yMin = signedInt16(glyf[4], glyf[5]);
29117			const xMax = signedInt16(glyf[6], glyf[7]);
29118			const yMax = signedInt16(glyf[8], glyf[9]);
29119			if (xMin > xMax) {
29120				writeSignedInt16(glyf, 2, xMax);
29121				writeSignedInt16(glyf, 6, xMin);
29122			}
29123			if (yMin > yMax) {
29124				writeSignedInt16(glyf, 4, yMax);
29125				writeSignedInt16(glyf, 8, yMin);
29126			}
29127			const contoursCount = signedInt16(glyf[0], glyf[1]);
29128			if (contoursCount < 0) {
29129				if (contoursCount < -1) {
29130					return glyphProfile;
29131				}
29132				dest.set(glyf, destStart);
29133				glyphProfile.length = glyf.length;
29134				return glyphProfile;
29135			}
29136			let i,
29137				j = 10,
29138				flagsCount = 0;
29139			for (i = 0; i < contoursCount; i++) {
29140				const endPoint = glyf[j] << 8 | glyf[j + 1];
29141				flagsCount = endPoint + 1;
29142				j += 2;
29143			}
29144			const instructionsStart = j;
29145			const instructionsLength = glyf[j] << 8 | glyf[j + 1];
29146			glyphProfile.sizeOfInstructions = instructionsLength;
29147			j += 2 + instructionsLength;
29148			const instructionsEnd = j;
29149			let coordinatesLength = 0;
29150			for (i = 0; i < flagsCount; i++) {
29151				const flag = glyf[j++];
29152				if (flag & 0xc0) {
29153					glyf[j - 1] = flag & 0x3f;
29154				}
29155				let xLength = 2;
29156				if (flag & 2) {
29157					xLength = 1;
29158				} else if (flag & 16) {
29159					xLength = 0;
29160				}
29161				let yLength = 2;
29162				if (flag & 4) {
29163					yLength = 1;
29164				} else if (flag & 32) {
29165					yLength = 0;
29166				}
29167				const xyLength = xLength + yLength;
29168				coordinatesLength += xyLength;
29169				if (flag & 8) {
29170					const repeat = glyf[j++];
29171					if (repeat === 0) {
29172						glyf[j - 1] ^= 8;
29173					}
29174					i += repeat;
vendor: 39,639 bytes, lines 29175-30406
29175					coordinatesLength += repeat * xyLength;
29176				}
29177			}
29178			if (coordinatesLength === 0) {
29179				return glyphProfile;
29180			}
29181			let glyphDataLength = j + coordinatesLength;
29182			if (glyphDataLength > glyf.length) {
29183				return glyphProfile;
29184			}
29185			if (!hintsValid && instructionsLength > 0) {
29186				dest.set(glyf.subarray(0, instructionsStart), destStart);
29187				dest.set([0, 0], destStart + instructionsStart);
29188				dest.set(glyf.subarray(instructionsEnd, glyphDataLength), destStart + instructionsStart + 2);
29189				glyphDataLength -= instructionsLength;
29190				if (glyf.length - glyphDataLength > 3) {
29191					glyphDataLength = glyphDataLength + 3 & ~3;
29192				}
29193				glyphProfile.length = glyphDataLength;
29194				return glyphProfile;
29195			}
29196			if (glyf.length - glyphDataLength > 3) {
29197				glyphDataLength = glyphDataLength + 3 & ~3;
29198				dest.set(glyf.subarray(0, glyphDataLength), destStart);
29199				glyphProfile.length = glyphDataLength;
29200				return glyphProfile;
29201			}
29202			dest.set(glyf, destStart);
29203			glyphProfile.length = glyf.length;
29204			return glyphProfile;
29205		}
29206		function sanitizeHead(head, numGlyphs, locaLength) {
29207			const data = head.data;
29208			const version = int32(data[0], data[1], data[2], data[3]);
29209			if (version >> 16 !== 1) {
29210				info("Attempting to fix invalid version in head table: " + version);
29211				data[0] = 0;
29212				data[1] = 1;
29213				data[2] = 0;
29214				data[3] = 0;
29215			}
29216			const indexToLocFormat = int16(data[50], data[51]);
29217			if (indexToLocFormat < 0 || indexToLocFormat > 1) {
29218				info("Attempting to fix invalid indexToLocFormat in head table: " + indexToLocFormat);
29219				const numGlyphsPlusOne = numGlyphs + 1;
29220				if (locaLength === numGlyphsPlusOne << 1) {
29221					data[50] = 0;
29222					data[51] = 0;
29223				} else if (locaLength === numGlyphsPlusOne << 2) {
29224					data[50] = 0;
29225					data[51] = 1;
29226				} else {
29227					throw new FormatError("Could not fix indexToLocFormat: " + indexToLocFormat);
29228				}
29229			}
29230		}
29231		function sanitizeGlyphLocations(loca, glyf, numGlyphs, isGlyphLocationsLong, hintsValid, dupFirstEntry, maxSizeOfInstructions) {
29232			let itemSize, itemDecode, itemEncode;
29233			if (isGlyphLocationsLong) {
29234				itemSize = 4;
29235				itemDecode = function fontItemDecodeLong(data, offset) {
29236					return data[offset] << 24 | data[offset + 1] << 16 | data[offset + 2] << 8 | data[offset + 3];
29237				};
29238				itemEncode = function fontItemEncodeLong(data, offset, value) {
29239					data[offset] = value >>> 24 & 0xff;
29240					data[offset + 1] = value >> 16 & 0xff;
29241					data[offset + 2] = value >> 8 & 0xff;
29242					data[offset + 3] = value & 0xff;
29243				};
29244			} else {
29245				itemSize = 2;
29246				itemDecode = function fontItemDecode(data, offset) {
29247					return data[offset] << 9 | data[offset + 1] << 1;
29248				};
29249				itemEncode = function fontItemEncode(data, offset, value) {
29250					data[offset] = value >> 9 & 0xff;
29251					data[offset + 1] = value >> 1 & 0xff;
29252				};
29253			}
29254			const numGlyphsOut = dupFirstEntry ? numGlyphs + 1 : numGlyphs;
29255			const locaDataSize = itemSize * (1 + numGlyphsOut);
29256			const locaData = new Uint8Array(locaDataSize);
29257			locaData.set(loca.data.subarray(0, locaDataSize));
29258			loca.data = locaData;
29259			const oldGlyfData = glyf.data;
29260			const oldGlyfDataLength = oldGlyfData.length;
29261			const newGlyfData = new Uint8Array(oldGlyfDataLength);
29262			let i, j;
29263			const locaEntries = [];
29264			for (i = 0, j = 0; i < numGlyphs + 1; i++, j += itemSize) {
29265				let offset = itemDecode(locaData, j);
29266				if (offset > oldGlyfDataLength) {
29267					offset = oldGlyfDataLength;
29268				}
29269				locaEntries.push({
29270					index: i,
29271					offset,
29272					endOffset: 0
29273				});
29274			}
29275			locaEntries.sort((a, b) => a.offset - b.offset);
29276			for (i = 0; i < numGlyphs; i++) {
29277				locaEntries[i].endOffset = locaEntries[i + 1].offset;
29278			}
29279			locaEntries.sort((a, b) => a.index - b.index);
29280			for (i = 0; i < numGlyphs; i++) {
29281				const {
29282					offset,
29283					endOffset
29284				} = locaEntries[i];
29285				if (offset !== 0 || endOffset !== 0) {
29286					break;
29287				}
29288				const nextOffset = locaEntries[i + 1].offset;
29289				if (nextOffset === 0) {
29290					continue;
29291				}
29292				locaEntries[i].endOffset = nextOffset;
29293				break;
29294			}
29295			const last = locaEntries.at(-2);
29296			if (last.offset !== 0 && last.endOffset === 0) {
29297				last.endOffset = oldGlyfDataLength;
29298			}
29299			const missingGlyphs = Object.create(null);
29300			let writeOffset = 0;
29301			itemEncode(locaData, 0, writeOffset);
29302			for (i = 0, j = itemSize; i < numGlyphs; i++, j += itemSize) {
29303				const glyphProfile = sanitizeGlyph(oldGlyfData, locaEntries[i].offset, locaEntries[i].endOffset, newGlyfData, writeOffset, hintsValid);
29304				const newLength = glyphProfile.length;
29305				if (newLength === 0) {
29306					missingGlyphs[i] = true;
29307				}
29308				if (glyphProfile.sizeOfInstructions > maxSizeOfInstructions) {
29309					maxSizeOfInstructions = glyphProfile.sizeOfInstructions;
29310				}
29311				writeOffset += newLength;
29312				itemEncode(locaData, j, writeOffset);
29313			}
29314			if (writeOffset === 0) {
29315				const simpleGlyph = new Uint8Array([0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 49, 0]);
29316				for (i = 0, j = itemSize; i < numGlyphsOut; i++, j += itemSize) {
29317					itemEncode(locaData, j, simpleGlyph.length);
29318				}
29319				glyf.data = simpleGlyph;
29320			} else if (dupFirstEntry) {
29321				const firstEntryLength = itemDecode(locaData, itemSize);
29322				if (newGlyfData.length > firstEntryLength + writeOffset) {
29323					glyf.data = newGlyfData.subarray(0, firstEntryLength + writeOffset);
29324				} else {
29325					glyf.data = new Uint8Array(firstEntryLength + writeOffset);
29326					glyf.data.set(newGlyfData.subarray(0, writeOffset));
29327				}
29328				glyf.data.set(newGlyfData.subarray(0, firstEntryLength), writeOffset);
29329				itemEncode(loca.data, locaData.length - itemSize, writeOffset + firstEntryLength);
29330			} else {
29331				glyf.data = newGlyfData.subarray(0, writeOffset);
29332			}
29333			return {
29334				missingGlyphs,
29335				maxSizeOfInstructions
29336			};
29337		}
29338		function readPostScriptTable(post, propertiesObj, maxpNumGlyphs) {
29339			const start = (font.start || 0) + post.offset;
29340			font.pos = start;
29341			const length = post.length,
29342				end = start + length;
29343			const version = font.getInt32();
29344			font.skip(28);
29345			let glyphNames;
29346			let valid = true;
29347			let i;
29348			switch (version) {
29349				case 0x00010000:
29350					glyphNames = MacStandardGlyphOrdering;
29351					break;
29352				case 0x00020000:
29353					const numGlyphs = font.getUint16();
29354					if (numGlyphs !== maxpNumGlyphs) {
29355						valid = false;
29356						break;
29357					}
29358					const glyphNameIndexes = [];
29359					for (i = 0; i < numGlyphs; ++i) {
29360						const index = font.getUint16();
29361						if (index >= 32768) {
29362							valid = false;
29363							break;
29364						}
29365						glyphNameIndexes.push(index);
29366					}
29367					if (!valid) {
29368						break;
29369					}
29370					const customNames = [],
29371						strBuf = [];
29372					while (font.pos < end) {
29373						const stringLength = font.getByte();
29374						strBuf.length = stringLength;
29375						for (i = 0; i < stringLength; ++i) {
29376							strBuf[i] = String.fromCharCode(font.getByte());
29377						}
29378						customNames.push(strBuf.join(""));
29379					}
29380					glyphNames = [];
29381					for (i = 0; i < numGlyphs; ++i) {
29382						const j = glyphNameIndexes[i];
29383						if (j < 258) {
29384							glyphNames.push(MacStandardGlyphOrdering[j]);
29385							continue;
29386						}
29387						glyphNames.push(customNames[j - 258]);
29388					}
29389					break;
29390				case 0x00030000:
29391					break;
29392				default:
29393					warn("Unknown/unsupported post table version " + version);
29394					valid = false;
29395					if (propertiesObj.defaultEncoding) {
29396						glyphNames = propertiesObj.defaultEncoding;
29397					}
29398					break;
29399			}
29400			propertiesObj.glyphNames = glyphNames;
29401			return valid;
29402		}
29403		function readNameTable(nameTable) {
29404			const start = (font.start || 0) + nameTable.offset;
29405			font.pos = start;
29406			const names = [[], []],
29407				records = [];
29408			const length = nameTable.length,
29409				end = start + length;
29410			const format = font.getUint16();
29411			const FORMAT_0_HEADER_LENGTH = 6;
29412			if (format !== 0 || length < FORMAT_0_HEADER_LENGTH) {
29413				return [names, records];
29414			}
29415			const numRecords = font.getUint16();
29416			const stringsStart = font.getUint16();
29417			const NAME_RECORD_LENGTH = 12;
29418			let i, ii;
29419			for (i = 0; i < numRecords && font.pos + NAME_RECORD_LENGTH <= end; i++) {
29420				const r = {
29421					platform: font.getUint16(),
29422					encoding: font.getUint16(),
29423					language: font.getUint16(),
29424					name: font.getUint16(),
29425					length: font.getUint16(),
29426					offset: font.getUint16()
29427				};
29428				if (isMacNameRecord(r) || isWinNameRecord(r)) {
29429					records.push(r);
29430				}
29431			}
29432			for (i = 0, ii = records.length; i < ii; i++) {
29433				const record = records[i];
29434				if (record.length <= 0) {
29435					continue;
29436				}
29437				const pos = start + stringsStart + record.offset;
29438				if (pos + record.length > end) {
29439					continue;
29440				}
29441				font.pos = pos;
29442				const nameIndex = record.name;
29443				if (record.encoding) {
29444					let str = "";
29445					for (let j = 0, jj = record.length; j < jj; j += 2) {
29446						str += String.fromCharCode(font.getUint16());
29447					}
29448					names[1][nameIndex] = str;
29449				} else {
29450					names[0][nameIndex] = font.getString(record.length);
29451				}
29452			}
29453			return [names, records];
29454		}
29455		const TTOpsStackDeltas = [0, 0, 0, 0, 0, 0, 0, 0, -2, -2, -2, -2, 0, 0, -2, -5, -1, -1, -1, -1, -1, -1, -1, -1, 0, 0, -1, 0, -1, -1, -1, -1, 1, -1, -999, 0, 1, 0, -1, -2, 0, -1, -2, -1, -1, 0, -1, -1, 0, 0, -999, -999, -1, -1, -1, -1, -2, -999, -2, -2, -999, 0, -2, -2, 0, 0, -2, 0, -2, 0, 0, 0, -2, -1, -1, 1, 1, 0, 0, -1, -1, -1, -1, -1, -1, -1, 0, 0, -1, 0, -1, -1, 0, -999, -1, -1, -1, -1, -1, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -2, -999, -999, -999, -999, -999, -1, -1, -2, -2, 0, 0, 0, 0, -1, -1, -999, -2, -2, 0, 0, -1, -2, -2, 0, 0, 0, -1, -1, -1, -2];
29456		function sanitizeTTProgram(table, ttContext) {
29457			let data = table.data;
29458			let i = 0,
29459				j,
29460				n,
29461				b,
29462				funcId,
29463				pc,
29464				lastEndf = 0,
29465				lastDeff = 0;
29466			const stack = [];
29467			const callstack = [];
29468			const functionsCalled = [];
29469			let tooComplexToFollowFunctions = ttContext.tooComplexToFollowFunctions;
29470			let inFDEF = false,
29471				ifLevel = 0,
29472				inELSE = 0;
29473			for (let ii = data.length; i < ii;) {
29474				const op = data[i++];
29475				if (op === 0x40) {
29476					n = data[i++];
29477					if (inFDEF || inELSE) {
29478						i += n;
29479					} else {
29480						for (j = 0; j < n; j++) {
29481							stack.push(data[i++]);
29482						}
29483					}
29484				} else if (op === 0x41) {
29485					n = data[i++];
29486					if (inFDEF || inELSE) {
29487						i += n * 2;
29488					} else {
29489						for (j = 0; j < n; j++) {
29490							b = data[i++];
29491							stack.push(b << 8 | data[i++]);
29492						}
29493					}
29494				} else if ((op & 0xf8) === 0xb0) {
29495					n = op - 0xb0 + 1;
29496					if (inFDEF || inELSE) {
29497						i += n;
29498					} else {
29499						for (j = 0; j < n; j++) {
29500							stack.push(data[i++]);
29501						}
29502					}
29503				} else if ((op & 0xf8) === 0xb8) {
29504					n = op - 0xb8 + 1;
29505					if (inFDEF || inELSE) {
29506						i += n * 2;
29507					} else {
29508						for (j = 0; j < n; j++) {
29509							b = data[i++];
29510							stack.push(signedInt16(b, data[i++]));
29511						}
29512					}
29513				} else if (op === 0x2b && !tooComplexToFollowFunctions) {
29514					if (!inFDEF && !inELSE) {
29515						funcId = stack.at(-1);
29516						if (isNaN(funcId)) {
29517							info("TT: CALL empty stack (or invalid entry).");
29518						} else {
29519							ttContext.functionsUsed[funcId] = true;
29520							if (funcId in ttContext.functionsStackDeltas) {
29521								const newStackLength = stack.length + ttContext.functionsStackDeltas[funcId];
29522								if (newStackLength < 0) {
29523									warn("TT: CALL invalid functions stack delta.");
29524									ttContext.hintsValid = false;
29525									return;
29526								}
29527								stack.length = newStackLength;
29528							} else if (funcId in ttContext.functionsDefined && !functionsCalled.includes(funcId)) {
29529								callstack.push({
29530									data,
29531									i,
29532									stackTop: stack.length - 1
29533								});
29534								functionsCalled.push(funcId);
29535								pc = ttContext.functionsDefined[funcId];
29536								if (!pc) {
29537									warn("TT: CALL non-existent function");
29538									ttContext.hintsValid = false;
29539									return;
29540								}
29541								data = pc.data;
29542								i = pc.i;
29543							}
29544						}
29545					}
29546				} else if (op === 0x2c && !tooComplexToFollowFunctions) {
29547					if (inFDEF || inELSE) {
29548						warn("TT: nested FDEFs not allowed");
29549						tooComplexToFollowFunctions = true;
29550					}
29551					inFDEF = true;
29552					lastDeff = i;
29553					funcId = stack.pop();
29554					ttContext.functionsDefined[funcId] = {
29555						data,
29556						i
29557					};
29558				} else if (op === 0x2d) {
29559					if (inFDEF) {
29560						inFDEF = false;
29561						lastEndf = i;
29562					} else {
29563						pc = callstack.pop();
29564						if (!pc) {
29565							warn("TT: ENDF bad stack");
29566							ttContext.hintsValid = false;
29567							return;
29568						}
29569						funcId = functionsCalled.pop();
29570						data = pc.data;
29571						i = pc.i;
29572						ttContext.functionsStackDeltas[funcId] = stack.length - pc.stackTop;
29573					}
29574				} else if (op === 0x89) {
29575					if (inFDEF || inELSE) {
29576						warn("TT: nested IDEFs not allowed");
29577						tooComplexToFollowFunctions = true;
29578					}
29579					inFDEF = true;
29580					lastDeff = i;
29581				} else if (op === 0x58) {
29582					++ifLevel;
29583				} else if (op === 0x1b) {
29584					inELSE = ifLevel;
29585				} else if (op === 0x59) {
29586					if (inELSE === ifLevel) {
29587						inELSE = 0;
29588					}
29589					--ifLevel;
29590				} else if (op === 0x1c) {
29591					if (!inFDEF && !inELSE) {
29592						const offset = stack.at(-1);
29593						if (offset > 0) {
29594							i += offset - 1;
29595						}
29596					}
29597				}
29598				if (!inFDEF && !inELSE) {
29599					let stackDelta = 0;
29600					if (op <= 0x8e) {
29601						stackDelta = TTOpsStackDeltas[op];
29602					} else if (op >= 0xc0 && op <= 0xdf) {
29603						stackDelta = -1;
29604					} else if (op >= 0xe0) {
29605						stackDelta = -2;
29606					}
29607					if (op >= 0x71 && op <= 0x75) {
29608						n = stack.pop();
29609						if (!isNaN(n)) {
29610							stackDelta = -n * 2;
29611						}
29612					}
29613					while (stackDelta < 0 && stack.length > 0) {
29614						stack.pop();
29615						stackDelta++;
29616					}
29617					while (stackDelta > 0) {
29618						stack.push(NaN);
29619						stackDelta--;
29620					}
29621				}
29622			}
29623			ttContext.tooComplexToFollowFunctions = tooComplexToFollowFunctions;
29624			const content = [data];
29625			if (i > data.length) {
29626				content.push(new Uint8Array(i - data.length));
29627			}
29628			if (lastDeff > lastEndf) {
29629				warn("TT: complementing a missing function tail");
29630				content.push(new Uint8Array([0x22, 0x2d]));
29631			}
29632			foldTTTable(table, content);
29633		}
29634		function checkInvalidFunctions(ttContext, maxFunctionDefs) {
29635			if (ttContext.tooComplexToFollowFunctions) {
29636				return;
29637			}
29638			if (ttContext.functionsDefined.length > maxFunctionDefs) {
29639				warn("TT: more functions defined than expected");
29640				ttContext.hintsValid = false;
29641				return;
29642			}
29643			for (let j = 0, jj = ttContext.functionsUsed.length; j < jj; j++) {
29644				if (j > maxFunctionDefs) {
29645					warn("TT: invalid function id: " + j);
29646					ttContext.hintsValid = false;
29647					return;
29648				}
29649				if (ttContext.functionsUsed[j] && !ttContext.functionsDefined[j]) {
29650					warn("TT: undefined function: " + j);
29651					ttContext.hintsValid = false;
29652					return;
29653				}
29654			}
29655		}
29656		function foldTTTable(table, content) {
29657			if (content.length > 1) {
29658				let newLength = 0;
29659				let j, jj;
29660				for (j = 0, jj = content.length; j < jj; j++) {
29661					newLength += content[j].length;
29662				}
29663				newLength = newLength + 3 & ~3;
29664				const result = new Uint8Array(newLength);
29665				let pos = 0;
29666				for (j = 0, jj = content.length; j < jj; j++) {
29667					result.set(content[j], pos);
29668					pos += content[j].length;
29669				}
29670				table.data = result;
29671				table.length = newLength;
29672			}
29673		}
29674		function sanitizeTTPrograms(fpgm, prep, cvt, maxFunctionDefs) {
29675			const ttContext = {
29676				functionsDefined: [],
29677				functionsUsed: [],
29678				functionsStackDeltas: [],
29679				tooComplexToFollowFunctions: false,
29680				hintsValid: true
29681			};
29682			if (fpgm) {
29683				sanitizeTTProgram(fpgm, ttContext);
29684			}
29685			if (prep) {
29686				sanitizeTTProgram(prep, ttContext);
29687			}
29688			if (fpgm) {
29689				checkInvalidFunctions(ttContext, maxFunctionDefs);
29690			}
29691			if (cvt && cvt.length & 1) {
29692				const cvtData = new Uint8Array(cvt.length + 1);
29693				cvtData.set(cvt.data);
29694				cvt.data = cvtData;
29695			}
29696			return ttContext.hintsValid;
29697		}
29698		font = new Stream(new Uint8Array(font.getBytes()));
29699		let header, tables;
29700		if (isTrueTypeCollectionFile(font)) {
29701			const ttcData = readTrueTypeCollectionData(font, this.name);
29702			header = ttcData.header;
29703			tables = ttcData.tables;
29704		} else {
29705			header = readOpenTypeHeader(font);
29706			tables = readTables(font, header.numTables);
29707		}
29708		let cff, cffFile;
29709		const isTrueType = !tables["CFF "];
29710		if (!isTrueType) {
29711			const isComposite = properties.composite && (properties.cidToGidMap?.length > 0 || !(properties.cMap instanceof IdentityCMap));
29712			if (header.version === "OTTO" && !isComposite || !tables.head || !tables.hhea || !tables.maxp || !tables.post) {
29713				cffFile = new Stream(tables["CFF "].data);
29714				cff = new CFFFont(cffFile, properties);
29715				adjustWidths(properties);
29716				return this.convert(name, cff, properties);
29717			}
29718			delete tables.glyf;
29719			delete tables.loca;
29720			delete tables.fpgm;
29721			delete tables.prep;
29722			delete tables["cvt "];
29723			this.isOpenType = true;
29724		} else {
29725			if (!tables.loca) {
29726				throw new FormatError('Required "loca" table is not found');
29727			}
29728			if (!tables.glyf) {
29729				warn('Required "glyf" table is not found -- trying to recover.');
29730				tables.glyf = {
29731					tag: "glyf",
29732					data: new Uint8Array(0)
29733				};
29734			}
29735			this.isOpenType = false;
29736		}
29737		if (!tables.maxp) {
29738			throw new FormatError('Required "maxp" table is not found');
29739		}
29740		font.pos = (font.start || 0) + tables.maxp.offset;
29741		let version = font.getInt32();
29742		const numGlyphs = font.getUint16();
29743		if (version !== 0x00010000 && version !== 0x00005000) {
29744			if (tables.maxp.length === 6) {
29745				version = 0x0005000;
29746			} else if (tables.maxp.length >= 32) {
29747				version = 0x00010000;
29748			} else {
29749				throw new FormatError(`"maxp" table has a wrong version number`);
29750			}
29751			writeUint32(tables.maxp.data, 0, version);
29752		}
29753		if (properties.scaleFactors?.length === numGlyphs && isTrueType) {
29754			const {
29755				scaleFactors
29756			} = properties;
29757			const isGlyphLocationsLong = int16(tables.head.data[50], tables.head.data[51]);
29758			const glyphs = new GlyfTable({
29759				glyfTable: tables.glyf.data,
29760				isGlyphLocationsLong,
29761				locaTable: tables.loca.data,
29762				numGlyphs
29763			});
29764			glyphs.scale(scaleFactors);
29765			const {
29766				glyf,
29767				loca,
29768				isLocationLong
29769			} = glyphs.write();
29770			tables.glyf.data = glyf;
29771			tables.loca.data = loca;
29772			if (isLocationLong !== !!isGlyphLocationsLong) {
29773				tables.head.data[50] = 0;
29774				tables.head.data[51] = isLocationLong ? 1 : 0;
29775			}
29776			const metrics = tables.hmtx.data;
29777			for (let i = 0; i < numGlyphs; i++) {
29778				const j = 4 * i;
29779				const advanceWidth = Math.round(scaleFactors[i] * int16(metrics[j], metrics[j + 1]));
29780				metrics[j] = advanceWidth >> 8 & 0xff;
29781				metrics[j + 1] = advanceWidth & 0xff;
29782				const lsb = Math.round(scaleFactors[i] * signedInt16(metrics[j + 2], metrics[j + 3]));
29783				writeSignedInt16(metrics, j + 2, lsb);
29784			}
29785		}
29786		let numGlyphsOut = numGlyphs + 1;
29787		let dupFirstEntry = true;
29788		if (numGlyphsOut > 0xffff) {
29789			dupFirstEntry = false;
29790			numGlyphsOut = numGlyphs;
29791			warn("Not enough space in glyfs to duplicate first glyph.");
29792		}
29793		let maxFunctionDefs = 0;
29794		let maxSizeOfInstructions = 0;
29795		if (version >= 0x00010000 && tables.maxp.length >= 32) {
29796			font.pos += 8;
29797			const maxZones = font.getUint16();
29798			if (maxZones > 2) {
29799				tables.maxp.data[14] = 0;
29800				tables.maxp.data[15] = 2;
29801			}
29802			font.pos += 4;
29803			maxFunctionDefs = font.getUint16();
29804			font.pos += 4;
29805			maxSizeOfInstructions = font.getUint16();
29806		}
29807		tables.maxp.data[4] = numGlyphsOut >> 8;
29808		tables.maxp.data[5] = numGlyphsOut & 255;
29809		const hintsValid = sanitizeTTPrograms(tables.fpgm, tables.prep, tables["cvt "], maxFunctionDefs);
29810		if (!hintsValid) {
29811			delete tables.fpgm;
29812			delete tables.prep;
29813			delete tables["cvt "];
29814		}
29815		sanitizeMetrics(font, tables.hhea, tables.hmtx, tables.head, numGlyphsOut, dupFirstEntry);
29816		if (!tables.head) {
29817			throw new FormatError('Required "head" table is not found');
29818		}
29819		sanitizeHead(tables.head, numGlyphs, isTrueType ? tables.loca.length : 0);
29820		let missingGlyphs = Object.create(null);
29821		if (isTrueType) {
29822			const isGlyphLocationsLong = int16(tables.head.data[50], tables.head.data[51]);
29823			const glyphsInfo = sanitizeGlyphLocations(tables.loca, tables.glyf, numGlyphs, isGlyphLocationsLong, hintsValid, dupFirstEntry, maxSizeOfInstructions);
29824			missingGlyphs = glyphsInfo.missingGlyphs;
29825			if (version >= 0x00010000 && tables.maxp.length >= 32) {
29826				tables.maxp.data[26] = glyphsInfo.maxSizeOfInstructions >> 8;
29827				tables.maxp.data[27] = glyphsInfo.maxSizeOfInstructions & 255;
29828			}
29829		}
29830		if (!tables.hhea) {
29831			throw new FormatError('Required "hhea" table is not found');
29832		}
29833		if (tables.hhea.data[10] === 0 && tables.hhea.data[11] === 0) {
29834			tables.hhea.data[10] = 0xff;
29835			tables.hhea.data[11] = 0xff;
29836		}
29837		const metricsOverride = {
29838			unitsPerEm: int16(tables.head.data[18], tables.head.data[19]),
29839			yMax: signedInt16(tables.head.data[42], tables.head.data[43]),
29840			yMin: signedInt16(tables.head.data[38], tables.head.data[39]),
29841			ascent: signedInt16(tables.hhea.data[4], tables.hhea.data[5]),
29842			descent: signedInt16(tables.hhea.data[6], tables.hhea.data[7]),
29843			lineGap: signedInt16(tables.hhea.data[8], tables.hhea.data[9])
29844		};
29845		this.ascent = metricsOverride.ascent / metricsOverride.unitsPerEm;
29846		this.descent = metricsOverride.descent / metricsOverride.unitsPerEm;
29847		this.lineGap = metricsOverride.lineGap / metricsOverride.unitsPerEm;
29848		if (this.cssFontInfo?.lineHeight) {
29849			this.lineHeight = this.cssFontInfo.metrics.lineHeight;
29850			this.lineGap = this.cssFontInfo.metrics.lineGap;
29851		} else {
29852			this.lineHeight = this.ascent - this.descent + this.lineGap;
29853		}
29854		if (tables.post) {
29855			readPostScriptTable(tables.post, properties, numGlyphs);
29856		}
29857		tables.post = {
29858			tag: "post",
29859			data: createPostTable(properties)
29860		};
29861		const charCodeToGlyphId = Object.create(null);
29862		function hasGlyph(glyphId) {
29863			return !missingGlyphs[glyphId];
29864		}
29865		if (properties.composite) {
29866			const cidToGidMap = properties.cidToGidMap || [];
29867			const isCidToGidMapEmpty = cidToGidMap.length === 0;
29868			properties.cMap.forEach(function (charCode, cid) {
29869				if (typeof cid === "string") {
29870					cid = convertCidString(charCode, cid, true);
29871				}
29872				if (cid > 0xffff) {
29873					throw new FormatError("Max size of CID is 65,535");
29874				}
29875				let glyphId = -1;
29876				if (isCidToGidMapEmpty) {
29877					glyphId = cid;
29878				} else if (cidToGidMap[cid] !== undefined) {
29879					glyphId = cidToGidMap[cid];
29880				}
29881				if (glyphId >= 0 && glyphId < numGlyphs && hasGlyph(glyphId)) {
29882					charCodeToGlyphId[charCode] = glyphId;
29883				}
29884			});
29885		} else {
29886			const cmapTable = readCmapTable(tables.cmap, font, this.isSymbolicFont, properties.hasEncoding);
29887			const cmapPlatformId = cmapTable.platformId;
29888			const cmapEncodingId = cmapTable.encodingId;
29889			const cmapMappings = cmapTable.mappings;
29890			let baseEncoding = [],
29891				forcePostTable = false;
29892			if (properties.hasEncoding && (properties.baseEncodingName === "MacRomanEncoding" || properties.baseEncodingName === "WinAnsiEncoding")) {
29893				baseEncoding = getEncoding(properties.baseEncodingName);
29894			}
29895			if (properties.hasEncoding && !this.isSymbolicFont && (cmapPlatformId === 3 && cmapEncodingId === 1 || cmapPlatformId === 1 && cmapEncodingId === 0)) {
29896				const glyphsUnicodeMap = getGlyphsUnicode();
29897				for (let charCode = 0; charCode < 256; charCode++) {
29898					let glyphName;
29899					if (this.differences[charCode] !== undefined) {
29900						glyphName = this.differences[charCode];
29901					} else if (baseEncoding.length && baseEncoding[charCode] !== "") {
29902						glyphName = baseEncoding[charCode];
29903					} else {
29904						glyphName = StandardEncoding[charCode];
29905					}
29906					if (!glyphName) {
29907						continue;
29908					}
29909					const standardGlyphName = recoverGlyphName(glyphName, glyphsUnicodeMap);
29910					let unicodeOrCharCode;
29911					if (cmapPlatformId === 3 && cmapEncodingId === 1) {
29912						unicodeOrCharCode = glyphsUnicodeMap[standardGlyphName];
29913					} else if (cmapPlatformId === 1 && cmapEncodingId === 0) {
29914						unicodeOrCharCode = MacRomanEncoding.indexOf(standardGlyphName);
29915					}
29916					if (unicodeOrCharCode === undefined) {
29917						if (!properties.glyphNames && properties.hasIncludedToUnicodeMap && !(this.toUnicode instanceof IdentityToUnicodeMap)) {
29918							const unicode = this.toUnicode.get(charCode);
29919							if (unicode) {
29920								unicodeOrCharCode = unicode.codePointAt(0);
29921							}
29922						}
29923						if (unicodeOrCharCode === undefined) {
29924							continue;
29925						}
29926					}
29927					for (const mapping of cmapMappings) {
29928						if (mapping.charCode !== unicodeOrCharCode) {
29929							continue;
29930						}
29931						charCodeToGlyphId[charCode] = mapping.glyphId;
29932						break;
29933					}
29934				}
29935			} else if (cmapPlatformId === 0) {
29936				for (const mapping of cmapMappings) {
29937					charCodeToGlyphId[mapping.charCode] = mapping.glyphId;
29938				}
29939				forcePostTable = true;
29940			} else if (cmapPlatformId === 3 && cmapEncodingId === 0) {
29941				for (const mapping of cmapMappings) {
29942					let charCode = mapping.charCode;
29943					if (charCode >= 0xf000 && charCode <= 0xf0ff) {
29944						charCode &= 0xff;
29945					}
29946					charCodeToGlyphId[charCode] = mapping.glyphId;
29947				}
29948			} else {
29949				for (const mapping of cmapMappings) {
29950					charCodeToGlyphId[mapping.charCode] = mapping.glyphId;
29951				}
29952			}
29953			if (properties.glyphNames && (baseEncoding.length || this.differences.length)) {
29954				for (let i = 0; i < 256; ++i) {
29955					if (!forcePostTable && charCodeToGlyphId[i] !== undefined) {
29956						continue;
29957					}
29958					const glyphName = this.differences[i] || baseEncoding[i];
29959					if (!glyphName) {
29960						continue;
29961					}
29962					const glyphId = properties.glyphNames.indexOf(glyphName);
29963					if (glyphId > 0 && hasGlyph(glyphId)) {
29964						charCodeToGlyphId[i] = glyphId;
29965					}
29966				}
29967			}
29968		}
29969		if (charCodeToGlyphId.length === 0) {
29970			charCodeToGlyphId[0] = 0;
29971		}
29972		let glyphZeroId = numGlyphsOut - 1;
29973		if (!dupFirstEntry) {
29974			glyphZeroId = 0;
29975		}
29976		if (!properties.cssFontInfo) {
29977			const newMapping = adjustMapping(charCodeToGlyphId, hasGlyph, glyphZeroId, this.toUnicode);
29978			this.toFontChar = newMapping.toFontChar;
29979			tables.cmap = {
29980				tag: "cmap",
29981				data: createCmapTable(newMapping.charCodeToGlyphId, newMapping.toUnicodeExtraMap, numGlyphsOut)
29982			};
29983			if (!tables["OS/2"] || !validateOS2Table(tables["OS/2"], font)) {
29984				tables["OS/2"] = {
29985					tag: "OS/2",
29986					data: createOS2Table(properties, newMapping.charCodeToGlyphId, metricsOverride)
29987				};
29988			}
29989		}
29990		if (!isTrueType) {
29991			try {
29992				cffFile = new Stream(tables["CFF "].data);
29993				const parser = new CFFParser(cffFile, properties, SEAC_ANALYSIS_ENABLED);
29994				cff = parser.parse();
29995				cff.duplicateFirstGlyph();
29996				const compiler = new CFFCompiler(cff);
29997				tables["CFF "].data = compiler.compile();
29998			} catch {
29999				warn("Failed to compile font " + properties.loadedName);
30000			}
30001		}
30002		if (!tables.name) {
30003			tables.name = {
30004				tag: "name",
30005				data: createNameTable(this.name)
30006			};
30007		} else {
30008			const [namePrototype, nameRecords] = readNameTable(tables.name);
30009			tables.name.data = createNameTable(name, namePrototype);
30010			this.psName = namePrototype[0][6] || null;
30011			if (!properties.composite) {
30012				adjustTrueTypeToUnicode(properties, this.isSymbolicFont, nameRecords);
30013			}
30014		}
30015		const builder = new OpenTypeFileBuilder(header.version);
30016		for (const tableTag in tables) {
30017			builder.addTable(tableTag, tables[tableTag].data);
30018		}
30019		return builder.toArray();
30020	}
30021	convert(fontName, font, properties) {
30022		properties.fixedPitch = false;
30023		if (properties.builtInEncoding) {
30024			adjustType1ToUnicode(properties, properties.builtInEncoding);
30025		}
30026		let glyphZeroId = 1;
30027		if (font instanceof CFFFont) {
30028			glyphZeroId = font.numGlyphs - 1;
30029		}
30030		const mapping = font.getGlyphMapping(properties);
30031		let newMapping = null;
30032		let newCharCodeToGlyphId = mapping;
30033		let toUnicodeExtraMap = null;
30034		if (!properties.cssFontInfo) {
30035			newMapping = adjustMapping(mapping, font.hasGlyphId.bind(font), glyphZeroId, this.toUnicode);
30036			this.toFontChar = newMapping.toFontChar;
30037			newCharCodeToGlyphId = newMapping.charCodeToGlyphId;
30038			toUnicodeExtraMap = newMapping.toUnicodeExtraMap;
30039		}
30040		const numGlyphs = font.numGlyphs;
30041		function getCharCodes(charCodeToGlyphId, glyphId) {
30042			let charCodes = null;
30043			for (const charCode in charCodeToGlyphId) {
30044				if (glyphId === charCodeToGlyphId[charCode]) {
30045					(charCodes ||= []).push(charCode | 0);
30046				}
30047			}
30048			return charCodes;
30049		}
30050		function createCharCode(charCodeToGlyphId, glyphId) {
30051			for (const charCode in charCodeToGlyphId) {
30052				if (glyphId === charCodeToGlyphId[charCode]) {
30053					return charCode | 0;
30054				}
30055			}
30056			newMapping.charCodeToGlyphId[newMapping.nextAvailableFontCharCode] = glyphId;
30057			return newMapping.nextAvailableFontCharCode++;
30058		}
30059		const seacs = font.seacs;
30060		if (newMapping && SEAC_ANALYSIS_ENABLED && seacs?.length) {
30061			const matrix = properties.fontMatrix || FONT_IDENTITY_MATRIX;
30062			const charset = font.getCharset();
30063			const seacMap = Object.create(null);
30064			for (let glyphId in seacs) {
30065				glyphId |= 0;
30066				const seac = seacs[glyphId];
30067				const baseGlyphName = StandardEncoding[seac[2]];
30068				const accentGlyphName = StandardEncoding[seac[3]];
30069				const baseGlyphId = charset.indexOf(baseGlyphName);
30070				const accentGlyphId = charset.indexOf(accentGlyphName);
30071				if (baseGlyphId < 0 || accentGlyphId < 0) {
30072					continue;
30073				}
30074				const accentOffset = {
30075					x: seac[0] * matrix[0] + seac[1] * matrix[2] + matrix[4],
30076					y: seac[0] * matrix[1] + seac[1] * matrix[3] + matrix[5]
30077				};
30078				const charCodes = getCharCodes(mapping, glyphId);
30079				if (!charCodes) {
30080					continue;
30081				}
30082				for (const charCode of charCodes) {
30083					const charCodeToGlyphId = newMapping.charCodeToGlyphId;
30084					const baseFontCharCode = createCharCode(charCodeToGlyphId, baseGlyphId);
30085					const accentFontCharCode = createCharCode(charCodeToGlyphId, accentGlyphId);
30086					seacMap[charCode] = {
30087						baseFontCharCode,
30088						accentFontCharCode,
30089						accentOffset
30090					};
30091				}
30092			}
30093			properties.seacMap = seacMap;
30094		}
30095		const unitsPerEm = properties.fontMatrix ? 1 / Math.max(...properties.fontMatrix.slice(0, 4).map(Math.abs)) : 1000;
30096		const builder = new OpenTypeFileBuilder("\x4F\x54\x54\x4F");
30097		builder.addTable("CFF ", font.data);
30098		builder.addTable("OS/2", createOS2Table(properties, newCharCodeToGlyphId));
30099		builder.addTable("cmap", createCmapTable(newCharCodeToGlyphId, toUnicodeExtraMap, numGlyphs));
30100		builder.addTable("head", "\x00\x01\x00\x00" + "\x00\x00\x10\x00" + "\x00\x00\x00\x00" + "\x5F\x0F\x3C\xF5" + "\x00\x00" + safeString16(unitsPerEm) + "\x00\x00\x00\x00\x9e\x0b\x7e\x27" + "\x00\x00\x00\x00\x9e\x0b\x7e\x27" + "\x00\x00" + safeString16(properties.descent) + "\x0F\xFF" + safeString16(properties.ascent) + string16(properties.italicAngle ? 2 : 0) + "\x00\x11" + "\x00\x00" + "\x00\x00" + "\x00\x00");
30101		builder.addTable("hhea", "\x00\x01\x00\x00" + safeString16(properties.ascent) + safeString16(properties.descent) + "\x00\x00" + "\xFF\xFF" + "\x00\x00" + "\x00\x00" + "\x00\x00" + safeString16(properties.capHeight) + safeString16(Math.tan(properties.italicAngle) * properties.xHeight) + "\x00\x00" + "\x00\x00" + "\x00\x00" + "\x00\x00" + "\x00\x00" + "\x00\x00" + string16(numGlyphs));
30102		builder.addTable("hmtx", function fontFieldsHmtx() {
30103			const charstrings = font.charstrings;
30104			const cffWidths = font.cff ? font.cff.widths : null;
30105			let hmtx = "\x00\x00\x00\x00";
30106			for (let i = 1, ii = numGlyphs; i < ii; i++) {
30107				let width = 0;
30108				if (charstrings) {
30109					const charstring = charstrings[i - 1];
30110					width = "width" in charstring ? charstring.width : 0;
30111				} else if (cffWidths) {
30112					width = Math.ceil(cffWidths[i] || 0);
30113				}
30114				hmtx += string16(width) + string16(0);
30115			}
30116			return hmtx;
30117		}());
30118		builder.addTable("maxp", "\x00\x00\x50\x00" + string16(numGlyphs));
30119		builder.addTable("name", createNameTable(fontName));
30120		builder.addTable("post", createPostTable(properties));
30121		return builder.toArray();
30122	}
30123	get _spaceWidth() {
30124		const possibleSpaceReplacements = ["space", "minus", "one", "i", "I"];
30125		let width;
30126		for (const glyphName of possibleSpaceReplacements) {
30127			if (glyphName in this.widths) {
30128				width = this.widths[glyphName];
30129				break;
30130			}
30131			const glyphsUnicodeMap = getGlyphsUnicode();
30132			const glyphUnicode = glyphsUnicodeMap[glyphName];
30133			let charcode = 0;
30134			if (this.composite && this.cMap.contains(glyphUnicode)) {
30135				charcode = this.cMap.lookup(glyphUnicode);
30136				if (typeof charcode === "string") {
30137					charcode = convertCidString(glyphUnicode, charcode);
30138				}
30139			}
30140			if (!charcode && this.toUnicode) {
30141				charcode = this.toUnicode.charCodeOf(glyphUnicode);
30142			}
30143			if (charcode <= 0) {
30144				charcode = glyphUnicode;
30145			}
30146			width = this.widths[charcode];
30147			if (width) {
30148				break;
30149			}
30150		}
30151		return shadow(this, "_spaceWidth", width || this.defaultWidth);
30152	}
30153	_charToGlyph(charcode, isSpace = false) {
30154		let glyph = this._glyphCache[charcode];
30155		if (glyph?.isSpace === isSpace) {
30156			return glyph;
30157		}
30158		let fontCharCode, width, operatorListId;
30159		let widthCode = charcode;
30160		if (this.cMap?.contains(charcode)) {
30161			widthCode = this.cMap.lookup(charcode);
30162			if (typeof widthCode === "string") {
30163				widthCode = convertCidString(charcode, widthCode);
30164			}
30165		}
30166		width = this.widths[widthCode];
30167		if (typeof width !== "number") {
30168			width = this.defaultWidth;
30169		}
30170		const vmetric = this.vmetrics?.[widthCode];
30171		let unicode = this.toUnicode.get(charcode) || charcode;
30172		if (typeof unicode === "number") {
30173			unicode = String.fromCharCode(unicode);
30174		}
30175		let isInFont = this.toFontChar[charcode] !== undefined;
30176		fontCharCode = this.toFontChar[charcode] || charcode;
30177		if (this.missingFile) {
30178			const glyphName = this.differences[charcode] || this.defaultEncoding[charcode];
30179			if ((glyphName === ".notdef" || glyphName === "") && this.type === "Type1") {
30180				fontCharCode = 0x20;
30181				if (glyphName === "") {
30182					width ||= this._spaceWidth;
30183					unicode = String.fromCharCode(fontCharCode);
30184				}
30185			}
30186			fontCharCode = mapSpecialUnicodeValues(fontCharCode);
30187		}
30188		if (this.isType3Font) {
30189			operatorListId = fontCharCode;
30190		}
30191		let accent = null;
30192		if (this.seacMap?.[charcode]) {
30193			isInFont = true;
30194			const seac = this.seacMap[charcode];
30195			fontCharCode = seac.baseFontCharCode;
30196			accent = {
30197				fontChar: String.fromCodePoint(seac.accentFontCharCode),
30198				offset: seac.accentOffset
30199			};
30200		}
30201		let fontChar = "";
30202		if (typeof fontCharCode === "number") {
30203			if (fontCharCode <= 0x10ffff) {
30204				fontChar = String.fromCodePoint(fontCharCode);
30205			} else {
30206				warn(`charToGlyph - invalid fontCharCode: ${fontCharCode}`);
30207			}
30208		}
30209		if (this.missingFile && this.vertical && fontChar.length === 1) {
30210			const vertical = getVerticalPresentationForm()[fontChar.charCodeAt(0)];
30211			if (vertical) {
30212				fontChar = unicode = String.fromCharCode(vertical);
30213			}
30214		}
30215		glyph = new fonts_Glyph(charcode, fontChar, unicode, accent, width, vmetric, operatorListId, isSpace, isInFont);
30216		return this._glyphCache[charcode] = glyph;
30217	}
30218	charsToGlyphs(chars) {
30219		let glyphs = this._charsCache[chars];
30220		if (glyphs) {
30221			return glyphs;
30222		}
30223		glyphs = [];
30224		if (this.cMap) {
30225			const c = Object.create(null),
30226				ii = chars.length;
30227			let i = 0;
30228			while (i < ii) {
30229				this.cMap.readCharCode(chars, i, c);
30230				const {
30231					charcode,
30232					length
30233				} = c;
30234				i += length;
30235				const glyph = this._charToGlyph(charcode, length === 1 && chars.charCodeAt(i - 1) === 0x20);
30236				glyphs.push(glyph);
30237			}
30238		} else {
30239			for (let i = 0, ii = chars.length; i < ii; ++i) {
30240				const charcode = chars.charCodeAt(i);
30241				const glyph = this._charToGlyph(charcode, charcode === 0x20);
30242				glyphs.push(glyph);
30243			}
30244		}
30245		return this._charsCache[chars] = glyphs;
30246	}
30247	getCharPositions(chars) {
30248		const positions = [];
30249		if (this.cMap) {
30250			const c = Object.create(null);
30251			let i = 0;
30252			while (i < chars.length) {
30253				this.cMap.readCharCode(chars, i, c);
30254				const length = c.length;
30255				positions.push([i, i + length]);
30256				i += length;
30257			}
30258		} else {
30259			for (let i = 0, ii = chars.length; i < ii; ++i) {
30260				positions.push([i, i + 1]);
30261			}
30262		}
30263		return positions;
30264	}
30265	get glyphCacheValues() {
30266		return Object.values(this._glyphCache);
30267	}
30268	encodeString(str) {
30269		const buffers = [];
30270		const currentBuf = [];
30271		const hasCurrentBufErrors = () => buffers.length % 2 === 1;
30272		const getCharCode = this.toUnicode instanceof IdentityToUnicodeMap ? unicode => this.toUnicode.charCodeOf(unicode) : unicode => this.toUnicode.charCodeOf(String.fromCodePoint(unicode));
30273		for (let i = 0, ii = str.length; i < ii; i++) {
30274			const unicode = str.codePointAt(i);
30275			if (unicode > 0xd7ff && (unicode < 0xe000 || unicode > 0xfffd)) {
30276				i++;
30277			}
30278			if (this.toUnicode) {
30279				const charCode = getCharCode(unicode);
30280				if (charCode !== -1) {
30281					if (hasCurrentBufErrors()) {
30282						buffers.push(currentBuf.join(""));
30283						currentBuf.length = 0;
30284					}
30285					const charCodeLength = this.cMap ? this.cMap.getCharCodeLength(charCode) : 1;
30286					for (let j = charCodeLength - 1; j >= 0; j--) {
30287						currentBuf.push(String.fromCharCode(charCode >> 8 * j & 0xff));
30288					}
30289					continue;
30290				}
30291			}
30292			if (!hasCurrentBufErrors()) {
30293				buffers.push(currentBuf.join(""));
30294				currentBuf.length = 0;
30295			}
30296			currentBuf.push(String.fromCodePoint(unicode));
30297		}
30298		buffers.push(currentBuf.join(""));
30299		return buffers;
30300	}
30301}
30302class ErrorFont {
30303	constructor(error) {
30304		this.error = error;
30305		this.loadedName = "g_font_error";
30306		this.missingFile = true;
30307	}
30308	charsToGlyphs() {
30309		return [];
30310	}
30311	encodeString(chars) {
30312		return [chars];
30313	}
30314	exportData(extraProperties = false) {
30315		return {
30316			error: this.error
30317		};
30318	}
30319}
30320
30321;// ./src/core/pattern.js
30322
30323
30324
30325
30326
30327
30328
30329
30330
30331
30332
30333const ShadingType = {
30334	FUNCTION_BASED: 1,
30335	AXIAL: 2,
30336	RADIAL: 3,
30337	FREE_FORM_MESH: 4,
30338	LATTICE_FORM_MESH: 5,
30339	COONS_PATCH_MESH: 6,
30340	TENSOR_PATCH_MESH: 7
30341};
30342class Pattern {
30343	constructor() {
30344		unreachable("Cannot initialize Pattern.");
30345	}
30346	static parseShading(shading, xref, res, pdfFunctionFactory, localColorSpaceCache) {
30347		const dict = shading instanceof BaseStream ? shading.dict : shading;
30348		const type = dict.get("ShadingType");
30349		try {
30350			switch (type) {
30351				case ShadingType.AXIAL:
30352				case ShadingType.RADIAL:
30353					return new RadialAxialShading(dict, xref, res, pdfFunctionFactory, localColorSpaceCache);
30354				case ShadingType.FREE_FORM_MESH:
30355				case ShadingType.LATTICE_FORM_MESH:
30356				case ShadingType.COONS_PATCH_MESH:
30357				case ShadingType.TENSOR_PATCH_MESH:
30358					return new MeshShading(shading, xref, res, pdfFunctionFactory, localColorSpaceCache);
30359				default:
30360					throw new FormatError("Unsupported ShadingType: " + type);
30361			}
30362		} catch (ex) {
30363			if (ex instanceof MissingDataException) {
30364				throw ex;
30365			}
30366			warn(ex);
30367			return new DummyShading();
30368		}
30369	}
30370}
30371class BaseShading {
30372	static SMALL_NUMBER = 1e-6;
30373	getIR() {
30374		unreachable("Abstract method `getIR` called.");
30375	}
30376}
30377class RadialAxialShading extends BaseShading {
30378	constructor(dict, xref, resources, pdfFunctionFactory, localColorSpaceCache) {
30379		super();
30380		this.shadingType = dict.get("ShadingType");
30381		let coordsLen = 0;
30382		if (this.shadingType === ShadingType.AXIAL) {
30383			coordsLen = 4;
30384		} else if (this.shadingType === ShadingType.RADIAL) {
30385			coordsLen = 6;
30386		}
30387		this.coordsArr = dict.getArray("Coords");
30388		if (!isNumberArray(this.coordsArr, coordsLen)) {
30389			throw new FormatError("RadialAxialShading: Invalid /Coords array.");
30390		}
30391		const cs = ColorSpace.parse({
30392			cs: dict.getRaw("CS") || dict.getRaw("ColorSpace"),
30393			xref,
30394			resources,
30395			pdfFunctionFactory,
30396			localColorSpaceCache
30397		});
30398		this.bbox = lookupNormalRect(dict.getArray("BBox"), null);
30399		let t0 = 0.0,
30400			t1 = 1.0;
30401		const domainArr = dict.getArray("Domain");
30402		if (isNumberArray(domainArr, 2)) {
30403			[t0, t1] = domainArr;
30404		}
30405		let extendStart = false,
30406			extendEnd = false;
30407		const extendArr = dict.getArray("Extend");
30408		if (isBooleanArray(extendArr, 2)) {
30409			[extendStart, extendEnd] = extendArr;
30410		}
30411		if (this.shadingType === ShadingType.RADIAL && (!extendStart || !extendEnd)) {
30412			const [x1, y1, r1, x2, y2, r2] = this.coordsArr;
30413			const distance = Math.hypot(x1 - x2, y1 - y2);
30414			if (r1 <= r2 + distance && r2 <= r1 + distance) {
30415				warn("Unsupported radial gradient.");
30416			}
30417		}
30418		this.extendStart = extendStart;
30419		this.extendEnd = extendEnd;
30420		const fnObj = dict.getRaw("Function");
30421		const fn = pdfFunctionFactory.createFromArray(fnObj);
30422		const NUMBER_OF_SAMPLES = 840;
30423		const step = (t1 - t0) / NUMBER_OF_SAMPLES;
30424		const colorStops = this.colorStops = [];
30425		if (t0 >= t1 || step <= 0) {
30426			info("Bad shading domain.");
30427			return;
30428		}
30429		const color = new Float32Array(cs.numComps),
30430			ratio = new Float32Array(1);
30431		let rgbColor;
30432		let iBase = 0;
30433		ratio[0] = t0;
30434		fn(ratio, 0, color, 0);
30435		let rgbBase = cs.getRgb(color, 0);
30436		const cssColorBase = Util.makeHexColor(rgbBase[0], rgbBase[1], rgbBase[2]);
30437		colorStops.push([0, cssColorBase]);
30438		let iPrev = 1;
30439		ratio[0] = t0 + step;
30440		fn(ratio, 0, color, 0);
30441		let rgbPrev = cs.getRgb(color, 0);
30442		let maxSlopeR = rgbPrev[0] - rgbBase[0] + 1;
30443		let maxSlopeG = rgbPrev[1] - rgbBase[1] + 1;
30444		let maxSlopeB = rgbPrev[2] - rgbBase[2] + 1;
30445		let minSlopeR = rgbPrev[0] - rgbBase[0] - 1;
30446		let minSlopeG = rgbPrev[1] - rgbBase[1] - 1;
30447		let minSlopeB = rgbPrev[2] - rgbBase[2] - 1;
30448		for (let i = 2; i < NUMBER_OF_SAMPLES; i++) {
30449			ratio[0] = t0 + i * step;
30450			fn(ratio, 0, color, 0);
30451			rgbColor = cs.getRgb(color, 0);
30452			const run = i - iBase;
30453			maxSlopeR = Math.min(maxSlopeR, (rgbColor[0] - rgbBase[0] + 1) / run);
30454			maxSlopeG = Math.min(maxSlopeG, (rgbColor[1] - rgbBase[1] + 1) / run);
30455			maxSlopeB = Math.min(maxSlopeB, (rgbColor[2] - rgbBase[2] + 1) / run);
30456			minSlopeR = Math.max(minSlopeR, (rgbColor[0] - rgbBase[0] - 1) / run);
30457			minSlopeG = Math.max(minSlopeG, (rgbColor[1] - rgbBase[1] - 1) / run);
30458			minSlopeB = Math.max(minSlopeB, (rgbColor[2] - rgbBase[2] - 1) / run);
30459			const slopesExist = minSlopeR <= maxSlopeR && minSlopeG <= maxSlopeG && minSlopeB <= maxSlopeB;
30460			if (!slopesExist) {
30461				const cssColor = Util.makeHexColor(rgbPrev[0], rgbPrev[1], rgbPrev[2]);
30462				colorStops.push([iPrev / NUMBER_OF_SAMPLES, cssColor]);
30463				maxSlopeR = rgbColor[0] - rgbPrev[0] + 1;
30464				maxSlopeG = rgbColor[1] - rgbPrev[1] + 1;
30465				maxSlopeB = rgbColor[2] - rgbPrev[2] + 1;
30466				minSlopeR = rgbColor[0] - rgbPrev[0] - 1;
30467				minSlopeG = rgbColor[1] - rgbPrev[1] - 1;
30468				minSlopeB = rgbColor[2] - rgbPrev[2] - 1;
30469				iBase = iPrev;
30470				rgbBase = rgbPrev;
30471			}
30472			iPrev = i;
30473			rgbPrev = rgbColor;
30474		}
30475		const cssColor = Util.makeHexColor(rgbPrev[0], rgbPrev[1], rgbPrev[2]);
30476		colorStops.push([1, cssColor]);
30477		let background = "transparent";
30478		if (dict.has("Background")) {
30479			rgbColor = cs.getRgb(dict.get("Background"), 0);
30480			background = Util.makeHexColor(rgbColor[0], rgbColor[1], rgbColor[2]);
30481		}
30482		if (!extendStart) {
30483			colorStops.unshift([0, background]);
30484			colorStops[1][0] += BaseShading.SMALL_NUMBER;
30485		}
30486		if (!extendEnd) {
30487			colorStops.at(-1)[0] -= BaseShading.SMALL_NUMBER;
30488			colorStops.push([1, background]);
30489		}
30490		this.colorStops = colorStops;
30491	}
30492	getIR() {
30493		const {
30494			coordsArr,
30495			shadingType
30496		} = this;
30497		let type, p0, p1, r0, r1;
30498		if (shadingType === ShadingType.AXIAL) {
30499			p0 = [coordsArr[0], coordsArr[1]];
30500			p1 = [coordsArr[2], coordsArr[3]];
30501			r0 = null;
30502			r1 = null;
30503			type = "axial";
30504		} else if (shadingType === ShadingType.RADIAL) {
30505			p0 = [coordsArr[0], coordsArr[1]];
30506			p1 = [coordsArr[3], coordsArr[4]];
30507			r0 = coordsArr[2];
30508			r1 = coordsArr[5];
30509			type = "radial";
30510		} else {
30511			unreachable(`getPattern type unknown: ${shadingType}`);
30512		}
30513		return ["RadialAxial", type, this.bbox, this.colorStops, p0, p1, r0, r1];
30514	}
30515}
30516class MeshStreamReader {
30517	constructor(stream, context) {
30518		this.stream = stream;
30519		this.context = context;
30520		this.buffer = 0;
30521		this.bufferLength = 0;
30522		const numComps = context.numComps;
30523		this.tmpCompsBuf = new Float32Array(numComps);
30524		const csNumComps = context.colorSpace.numComps;
30525		this.tmpCsCompsBuf = context.colorFn ? new Float32Array(csNumComps) : this.tmpCompsBuf;
30526	}
30527	get hasData() {
30528		if (this.stream.end) {
30529			return this.stream.pos < this.stream.end;
30530		}
30531		if (this.bufferLength > 0) {
30532			return true;
30533		}
30534		const nextByte = this.stream.getByte();
30535		if (nextByte < 0) {
30536			return false;
30537		}
30538		this.buffer = nextByte;
30539		this.bufferLength = 8;
30540		return true;
30541	}
30542	readBits(n) {
30543		let buffer = this.buffer;
30544		let bufferLength = this.bufferLength;
30545		if (n === 32) {
30546			if (bufferLength === 0) {
30547				return (this.stream.getByte() << 24 | this.stream.getByte() << 16 | this.stream.getByte() << 8 | this.stream.getByte()) >>> 0;
30548			}
30549			buffer = buffer << 24 | this.stream.getByte() << 16 | this.stream.getByte() << 8 | this.stream.getByte();
30550			const nextByte = this.stream.getByte();
30551			this.buffer = nextByte & (1 << bufferLength) - 1;
30552			return (buffer << 8 - bufferLength | (nextByte & 0xff) >> bufferLength) >>> 0;
30553		}
30554		if (n === 8 && bufferLength === 0) {
30555			return this.stream.getByte();
30556		}
30557		while (bufferLength < n) {
30558			buffer = buffer << 8 | this.stream.getByte();
30559			bufferLength += 8;
30560		}
30561		bufferLength -= n;
30562		this.bufferLength = bufferLength;
30563		this.buffer = buffer & (1 << bufferLength) - 1;
30564		return buffer >> bufferLength;
30565	}
30566	align() {
30567		this.buffer = 0;
30568		this.bufferLength = 0;
30569	}
30570	readFlag() {
30571		return this.readBits(this.context.bitsPerFlag);
30572	}
30573	readCoordinate() {
30574		const bitsPerCoordinate = this.context.bitsPerCoordinate;
30575		const xi = this.readBits(bitsPerCoordinate);
30576		const yi = this.readBits(bitsPerCoordinate);
30577		const decode = this.context.decode;
30578		const scale = bitsPerCoordinate < 32 ? 1 / ((1 << bitsPerCoordinate) - 1) : 2.3283064365386963e-10;
30579		return [xi * scale * (decode[1] - decode[0]) + decode[0], yi * scale * (decode[3] - decode[2]) + decode[2]];
30580	}
30581	readComponents() {
30582		const numComps = this.context.numComps;
30583		const bitsPerComponent = this.context.bitsPerComponent;
30584		const scale = bitsPerComponent < 32 ? 1 / ((1 << bitsPerComponent) - 1) : 2.3283064365386963e-10;
30585		const decode = this.context.decode;
30586		const components = this.tmpCompsBuf;
30587		for (let i = 0, j = 4; i < numComps; i++, j += 2) {
30588			const ci = this.readBits(bitsPerComponent);
30589			components[i] = ci * scale * (decode[j + 1] - decode[j]) + decode[j];
30590		}
30591		const color = this.tmpCsCompsBuf;
30592		if (this.context.colorFn) {
30593			this.context.colorFn(components, 0, color, 0);
30594		}
30595		return this.context.colorSpace.getRgb(color, 0);
30596	}
30597}
30598let bCache = Object.create(null);
30599function buildB(count) {
30600	const lut = [];
30601	for (let i = 0; i <= count; i++) {
30602		const t = i / count,
30603			t_ = 1 - t;
30604		lut.push(new Float32Array([t_ ** 3, 3 * t * t_ ** 2, 3 * t ** 2 * t_, t ** 3]));
30605	}
30606	return lut;
30607}
30608function getB(count) {
30609	return bCache[count] ||= buildB(count);
30610}
30611function clearPatternCaches() {
30612	bCache = Object.create(null);
30613}
30614class MeshShading extends BaseShading {
30615	static MIN_SPLIT_PATCH_CHUNKS_AMOUNT = 3;
30616	static MAX_SPLIT_PATCH_CHUNKS_AMOUNT = 20;
30617	static TRIANGLE_DENSITY = 20;
30618	constructor(stream, xref, resources, pdfFunctionFactory, localColorSpaceCache) {
30619		super();
30620		if (!(stream instanceof BaseStream)) {
30621			throw new FormatError("Mesh data is not a stream");
30622		}
30623		const dict = stream.dict;
30624		this.shadingType = dict.get("ShadingType");
30625		this.bbox = lookupNormalRect(dict.getArray("BBox"), null);
30626		const cs = ColorSpace.parse({
30627			cs: dict.getRaw("CS") || dict.getRaw("ColorSpace"),
30628			xref,
30629			resources,
30630			pdfFunctionFactory,
30631			localColorSpaceCache
30632		});
vendor: 15,338 bytes, lines 30633-31138
30633		this.background = dict.has("Background") ? cs.getRgb(dict.get("Background"), 0) : null;
30634		const fnObj = dict.getRaw("Function");
30635		const fn = fnObj ? pdfFunctionFactory.createFromArray(fnObj) : null;
30636		this.coords = [];
30637		this.colors = [];
30638		this.figures = [];
30639		const decodeContext = {
30640			bitsPerCoordinate: dict.get("BitsPerCoordinate"),
30641			bitsPerComponent: dict.get("BitsPerComponent"),
30642			bitsPerFlag: dict.get("BitsPerFlag"),
30643			decode: dict.getArray("Decode"),
30644			colorFn: fn,
30645			colorSpace: cs,
30646			numComps: fn ? 1 : cs.numComps
30647		};
30648		const reader = new MeshStreamReader(stream, decodeContext);
30649		let patchMesh = false;
30650		switch (this.shadingType) {
30651			case ShadingType.FREE_FORM_MESH:
30652				this._decodeType4Shading(reader);
30653				break;
30654			case ShadingType.LATTICE_FORM_MESH:
30655				const verticesPerRow = dict.get("VerticesPerRow") | 0;
30656				if (verticesPerRow < 2) {
30657					throw new FormatError("Invalid VerticesPerRow");
30658				}
30659				this._decodeType5Shading(reader, verticesPerRow);
30660				break;
30661			case ShadingType.COONS_PATCH_MESH:
30662				this._decodeType6Shading(reader);
30663				patchMesh = true;
30664				break;
30665			case ShadingType.TENSOR_PATCH_MESH:
30666				this._decodeType7Shading(reader);
30667				patchMesh = true;
30668				break;
30669			default:
30670				unreachable("Unsupported mesh type.");
30671				break;
30672		}
30673		if (patchMesh) {
30674			this._updateBounds();
30675			for (let i = 0, ii = this.figures.length; i < ii; i++) {
30676				this._buildFigureFromPatch(i);
30677			}
30678		}
30679		this._updateBounds();
30680		this._packData();
30681	}
30682	_decodeType4Shading(reader) {
30683		const coords = this.coords;
30684		const colors = this.colors;
30685		const operators = [];
30686		const ps = [];
30687		let verticesLeft = 0;
30688		while (reader.hasData) {
30689			const f = reader.readFlag();
30690			const coord = reader.readCoordinate();
30691			const color = reader.readComponents();
30692			if (verticesLeft === 0) {
30693				if (!(0 <= f && f <= 2)) {
30694					throw new FormatError("Unknown type4 flag");
30695				}
30696				switch (f) {
30697					case 0:
30698						verticesLeft = 3;
30699						break;
30700					case 1:
30701						ps.push(ps.at(-2), ps.at(-1));
30702						verticesLeft = 1;
30703						break;
30704					case 2:
30705						ps.push(ps.at(-3), ps.at(-1));
30706						verticesLeft = 1;
30707						break;
30708				}
30709				operators.push(f);
30710			}
30711			ps.push(coords.length);
30712			coords.push(coord);
30713			colors.push(color);
30714			verticesLeft--;
30715			reader.align();
30716		}
30717		this.figures.push({
30718			type: "triangles",
30719			coords: new Int32Array(ps),
30720			colors: new Int32Array(ps)
30721		});
30722	}
30723	_decodeType5Shading(reader, verticesPerRow) {
30724		const coords = this.coords;
30725		const colors = this.colors;
30726		const ps = [];
30727		while (reader.hasData) {
30728			const coord = reader.readCoordinate();
30729			const color = reader.readComponents();
30730			ps.push(coords.length);
30731			coords.push(coord);
30732			colors.push(color);
30733		}
30734		this.figures.push({
30735			type: "lattice",
30736			coords: new Int32Array(ps),
30737			colors: new Int32Array(ps),
30738			verticesPerRow
30739		});
30740	}
30741	_decodeType6Shading(reader) {
30742		const coords = this.coords;
30743		const colors = this.colors;
30744		const ps = new Int32Array(16);
30745		const cs = new Int32Array(4);
30746		while (reader.hasData) {
30747			const f = reader.readFlag();
30748			if (!(0 <= f && f <= 3)) {
30749				throw new FormatError("Unknown type6 flag");
30750			}
30751			const pi = coords.length;
30752			for (let i = 0, ii = f !== 0 ? 8 : 12; i < ii; i++) {
30753				coords.push(reader.readCoordinate());
30754			}
30755			const ci = colors.length;
30756			for (let i = 0, ii = f !== 0 ? 2 : 4; i < ii; i++) {
30757				colors.push(reader.readComponents());
30758			}
30759			let tmp1, tmp2, tmp3, tmp4;
30760			switch (f) {
30761				case 0:
30762					ps[12] = pi + 3;
30763					ps[13] = pi + 4;
30764					ps[14] = pi + 5;
30765					ps[15] = pi + 6;
30766					ps[8] = pi + 2;
30767					ps[11] = pi + 7;
30768					ps[4] = pi + 1;
30769					ps[7] = pi + 8;
30770					ps[0] = pi;
30771					ps[1] = pi + 11;
30772					ps[2] = pi + 10;
30773					ps[3] = pi + 9;
30774					cs[2] = ci + 1;
30775					cs[3] = ci + 2;
30776					cs[0] = ci;
30777					cs[1] = ci + 3;
30778					break;
30779				case 1:
30780					tmp1 = ps[12];
30781					tmp2 = ps[13];
30782					tmp3 = ps[14];
30783					tmp4 = ps[15];
30784					ps[12] = tmp4;
30785					ps[13] = pi + 0;
30786					ps[14] = pi + 1;
30787					ps[15] = pi + 2;
30788					ps[8] = tmp3;
30789					ps[11] = pi + 3;
30790					ps[4] = tmp2;
30791					ps[7] = pi + 4;
30792					ps[0] = tmp1;
30793					ps[1] = pi + 7;
30794					ps[2] = pi + 6;
30795					ps[3] = pi + 5;
30796					tmp1 = cs[2];
30797					tmp2 = cs[3];
30798					cs[2] = tmp2;
30799					cs[3] = ci;
30800					cs[0] = tmp1;
30801					cs[1] = ci + 1;
30802					break;
30803				case 2:
30804					tmp1 = ps[15];
30805					tmp2 = ps[11];
30806					ps[12] = ps[3];
30807					ps[13] = pi + 0;
30808					ps[14] = pi + 1;
30809					ps[15] = pi + 2;
30810					ps[8] = ps[7];
30811					ps[11] = pi + 3;
30812					ps[4] = tmp2;
30813					ps[7] = pi + 4;
30814					ps[0] = tmp1;
30815					ps[1] = pi + 7;
30816					ps[2] = pi + 6;
30817					ps[3] = pi + 5;
30818					tmp1 = cs[3];
30819					cs[2] = cs[1];
30820					cs[3] = ci;
30821					cs[0] = tmp1;
30822					cs[1] = ci + 1;
30823					break;
30824				case 3:
30825					ps[12] = ps[0];
30826					ps[13] = pi + 0;
30827					ps[14] = pi + 1;
30828					ps[15] = pi + 2;
30829					ps[8] = ps[1];
30830					ps[11] = pi + 3;
30831					ps[4] = ps[2];
30832					ps[7] = pi + 4;
30833					ps[0] = ps[3];
30834					ps[1] = pi + 7;
30835					ps[2] = pi + 6;
30836					ps[3] = pi + 5;
30837					cs[2] = cs[0];
30838					cs[3] = ci;
30839					cs[0] = cs[1];
30840					cs[1] = ci + 1;
30841					break;
30842			}
30843			ps[5] = coords.length;
30844			coords.push([(-4 * coords[ps[0]][0] - coords[ps[15]][0] + 6 * (coords[ps[4]][0] + coords[ps[1]][0]) - 2 * (coords[ps[12]][0] + coords[ps[3]][0]) + 3 * (coords[ps[13]][0] + coords[ps[7]][0])) / 9, (-4 * coords[ps[0]][1] - coords[ps[15]][1] + 6 * (coords[ps[4]][1] + coords[ps[1]][1]) - 2 * (coords[ps[12]][1] + coords[ps[3]][1]) + 3 * (coords[ps[13]][1] + coords[ps[7]][1])) / 9]);
30845			ps[6] = coords.length;
30846			coords.push([(-4 * coords[ps[3]][0] - coords[ps[12]][0] + 6 * (coords[ps[2]][0] + coords[ps[7]][0]) - 2 * (coords[ps[0]][0] + coords[ps[15]][0]) + 3 * (coords[ps[4]][0] + coords[ps[14]][0])) / 9, (-4 * coords[ps[3]][1] - coords[ps[12]][1] + 6 * (coords[ps[2]][1] + coords[ps[7]][1]) - 2 * (coords[ps[0]][1] + coords[ps[15]][1]) + 3 * (coords[ps[4]][1] + coords[ps[14]][1])) / 9]);
30847			ps[9] = coords.length;
30848			coords.push([(-4 * coords[ps[12]][0] - coords[ps[3]][0] + 6 * (coords[ps[8]][0] + coords[ps[13]][0]) - 2 * (coords[ps[0]][0] + coords[ps[15]][0]) + 3 * (coords[ps[11]][0] + coords[ps[1]][0])) / 9, (-4 * coords[ps[12]][1] - coords[ps[3]][1] + 6 * (coords[ps[8]][1] + coords[ps[13]][1]) - 2 * (coords[ps[0]][1] + coords[ps[15]][1]) + 3 * (coords[ps[11]][1] + coords[ps[1]][1])) / 9]);
30849			ps[10] = coords.length;
30850			coords.push([(-4 * coords[ps[15]][0] - coords[ps[0]][0] + 6 * (coords[ps[11]][0] + coords[ps[14]][0]) - 2 * (coords[ps[12]][0] + coords[ps[3]][0]) + 3 * (coords[ps[2]][0] + coords[ps[8]][0])) / 9, (-4 * coords[ps[15]][1] - coords[ps[0]][1] + 6 * (coords[ps[11]][1] + coords[ps[14]][1]) - 2 * (coords[ps[12]][1] + coords[ps[3]][1]) + 3 * (coords[ps[2]][1] + coords[ps[8]][1])) / 9]);
30851			this.figures.push({
30852				type: "patch",
30853				coords: new Int32Array(ps),
30854				colors: new Int32Array(cs)
30855			});
30856		}
30857	}
30858	_decodeType7Shading(reader) {
30859		const coords = this.coords;
30860		const colors = this.colors;
30861		const ps = new Int32Array(16);
30862		const cs = new Int32Array(4);
30863		while (reader.hasData) {
30864			const f = reader.readFlag();
30865			if (!(0 <= f && f <= 3)) {
30866				throw new FormatError("Unknown type7 flag");
30867			}
30868			const pi = coords.length;
30869			for (let i = 0, ii = f !== 0 ? 12 : 16; i < ii; i++) {
30870				coords.push(reader.readCoordinate());
30871			}
30872			const ci = colors.length;
30873			for (let i = 0, ii = f !== 0 ? 2 : 4; i < ii; i++) {
30874				colors.push(reader.readComponents());
30875			}
30876			let tmp1, tmp2, tmp3, tmp4;
30877			switch (f) {
30878				case 0:
30879					ps[12] = pi + 3;
30880					ps[13] = pi + 4;
30881					ps[14] = pi + 5;
30882					ps[15] = pi + 6;
30883					ps[8] = pi + 2;
30884					ps[9] = pi + 13;
30885					ps[10] = pi + 14;
30886					ps[11] = pi + 7;
30887					ps[4] = pi + 1;
30888					ps[5] = pi + 12;
30889					ps[6] = pi + 15;
30890					ps[7] = pi + 8;
30891					ps[0] = pi;
30892					ps[1] = pi + 11;
30893					ps[2] = pi + 10;
30894					ps[3] = pi + 9;
30895					cs[2] = ci + 1;
30896					cs[3] = ci + 2;
30897					cs[0] = ci;
30898					cs[1] = ci + 3;
30899					break;
30900				case 1:
30901					tmp1 = ps[12];
30902					tmp2 = ps[13];
30903					tmp3 = ps[14];
30904					tmp4 = ps[15];
30905					ps[12] = tmp4;
30906					ps[13] = pi + 0;
30907					ps[14] = pi + 1;
30908					ps[15] = pi + 2;
30909					ps[8] = tmp3;
30910					ps[9] = pi + 9;
30911					ps[10] = pi + 10;
30912					ps[11] = pi + 3;
30913					ps[4] = tmp2;
30914					ps[5] = pi + 8;
30915					ps[6] = pi + 11;
30916					ps[7] = pi + 4;
30917					ps[0] = tmp1;
30918					ps[1] = pi + 7;
30919					ps[2] = pi + 6;
30920					ps[3] = pi + 5;
30921					tmp1 = cs[2];
30922					tmp2 = cs[3];
30923					cs[2] = tmp2;
30924					cs[3] = ci;
30925					cs[0] = tmp1;
30926					cs[1] = ci + 1;
30927					break;
30928				case 2:
30929					tmp1 = ps[15];
30930					tmp2 = ps[11];
30931					ps[12] = ps[3];
30932					ps[13] = pi + 0;
30933					ps[14] = pi + 1;
30934					ps[15] = pi + 2;
30935					ps[8] = ps[7];
30936					ps[9] = pi + 9;
30937					ps[10] = pi + 10;
30938					ps[11] = pi + 3;
30939					ps[4] = tmp2;
30940					ps[5] = pi + 8;
30941					ps[6] = pi + 11;
30942					ps[7] = pi + 4;
30943					ps[0] = tmp1;
30944					ps[1] = pi + 7;
30945					ps[2] = pi + 6;
30946					ps[3] = pi + 5;
30947					tmp1 = cs[3];
30948					cs[2] = cs[1];
30949					cs[3] = ci;
30950					cs[0] = tmp1;
30951					cs[1] = ci + 1;
30952					break;
30953				case 3:
30954					ps[12] = ps[0];
30955					ps[13] = pi + 0;
30956					ps[14] = pi + 1;
30957					ps[15] = pi + 2;
30958					ps[8] = ps[1];
30959					ps[9] = pi + 9;
30960					ps[10] = pi + 10;
30961					ps[11] = pi + 3;
30962					ps[4] = ps[2];
30963					ps[5] = pi + 8;
30964					ps[6] = pi + 11;
30965					ps[7] = pi + 4;
30966					ps[0] = ps[3];
30967					ps[1] = pi + 7;
30968					ps[2] = pi + 6;
30969					ps[3] = pi + 5;
30970					cs[2] = cs[0];
30971					cs[3] = ci;
30972					cs[0] = cs[1];
30973					cs[1] = ci + 1;
30974					break;
30975			}
30976			this.figures.push({
30977				type: "patch",
30978				coords: new Int32Array(ps),
30979				colors: new Int32Array(cs)
30980			});
30981		}
30982	}
30983	_buildFigureFromPatch(index) {
30984		const figure = this.figures[index];
30985		assert(figure.type === "patch", "Unexpected patch mesh figure");
30986		const coords = this.coords,
30987			colors = this.colors;
30988		const pi = figure.coords;
30989		const ci = figure.colors;
30990		const figureMinX = Math.min(coords[pi[0]][0], coords[pi[3]][0], coords[pi[12]][0], coords[pi[15]][0]);
30991		const figureMinY = Math.min(coords[pi[0]][1], coords[pi[3]][1], coords[pi[12]][1], coords[pi[15]][1]);
30992		const figureMaxX = Math.max(coords[pi[0]][0], coords[pi[3]][0], coords[pi[12]][0], coords[pi[15]][0]);
30993		const figureMaxY = Math.max(coords[pi[0]][1], coords[pi[3]][1], coords[pi[12]][1], coords[pi[15]][1]);
30994		let splitXBy = Math.ceil((figureMaxX - figureMinX) * MeshShading.TRIANGLE_DENSITY / (this.bounds[2] - this.bounds[0]));
30995		splitXBy = Math.max(MeshShading.MIN_SPLIT_PATCH_CHUNKS_AMOUNT, Math.min(MeshShading.MAX_SPLIT_PATCH_CHUNKS_AMOUNT, splitXBy));
30996		let splitYBy = Math.ceil((figureMaxY - figureMinY) * MeshShading.TRIANGLE_DENSITY / (this.bounds[3] - this.bounds[1]));
30997		splitYBy = Math.max(MeshShading.MIN_SPLIT_PATCH_CHUNKS_AMOUNT, Math.min(MeshShading.MAX_SPLIT_PATCH_CHUNKS_AMOUNT, splitYBy));
30998		const verticesPerRow = splitXBy + 1;
30999		const figureCoords = new Int32Array((splitYBy + 1) * verticesPerRow);
31000		const figureColors = new Int32Array((splitYBy + 1) * verticesPerRow);
31001		let k = 0;
31002		const cl = new Uint8Array(3),
31003			cr = new Uint8Array(3);
31004		const c0 = colors[ci[0]],
31005			c1 = colors[ci[1]],
31006			c2 = colors[ci[2]],
31007			c3 = colors[ci[3]];
31008		const bRow = getB(splitYBy),
31009			bCol = getB(splitXBy);
31010		for (let row = 0; row <= splitYBy; row++) {
31011			cl[0] = (c0[0] * (splitYBy - row) + c2[0] * row) / splitYBy | 0;
31012			cl[1] = (c0[1] * (splitYBy - row) + c2[1] * row) / splitYBy | 0;
31013			cl[2] = (c0[2] * (splitYBy - row) + c2[2] * row) / splitYBy | 0;
31014			cr[0] = (c1[0] * (splitYBy - row) + c3[0] * row) / splitYBy | 0;
31015			cr[1] = (c1[1] * (splitYBy - row) + c3[1] * row) / splitYBy | 0;
31016			cr[2] = (c1[2] * (splitYBy - row) + c3[2] * row) / splitYBy | 0;
31017			for (let col = 0; col <= splitXBy; col++, k++) {
31018				if ((row === 0 || row === splitYBy) && (col === 0 || col === splitXBy)) {
31019					continue;
31020				}
31021				let x = 0,
31022					y = 0;
31023				let q = 0;
31024				for (let i = 0; i <= 3; i++) {
31025					for (let j = 0; j <= 3; j++, q++) {
31026						const m = bRow[row][i] * bCol[col][j];
31027						x += coords[pi[q]][0] * m;
31028						y += coords[pi[q]][1] * m;
31029					}
31030				}
31031				figureCoords[k] = coords.length;
31032				coords.push([x, y]);
31033				figureColors[k] = colors.length;
31034				const newColor = new Uint8Array(3);
31035				newColor[0] = (cl[0] * (splitXBy - col) + cr[0] * col) / splitXBy | 0;
31036				newColor[1] = (cl[1] * (splitXBy - col) + cr[1] * col) / splitXBy | 0;
31037				newColor[2] = (cl[2] * (splitXBy - col) + cr[2] * col) / splitXBy | 0;
31038				colors.push(newColor);
31039			}
31040		}
31041		figureCoords[0] = pi[0];
31042		figureColors[0] = ci[0];
31043		figureCoords[splitXBy] = pi[3];
31044		figureColors[splitXBy] = ci[1];
31045		figureCoords[verticesPerRow * splitYBy] = pi[12];
31046		figureColors[verticesPerRow * splitYBy] = ci[2];
31047		figureCoords[verticesPerRow * splitYBy + splitXBy] = pi[15];
31048		figureColors[verticesPerRow * splitYBy + splitXBy] = ci[3];
31049		this.figures[index] = {
31050			type: "lattice",
31051			coords: figureCoords,
31052			colors: figureColors,
31053			verticesPerRow
31054		};
31055	}
31056	_updateBounds() {
31057		let minX = this.coords[0][0],
31058			minY = this.coords[0][1],
31059			maxX = minX,
31060			maxY = minY;
31061		for (let i = 1, ii = this.coords.length; i < ii; i++) {
31062			const x = this.coords[i][0],
31063				y = this.coords[i][1];
31064			minX = minX > x ? x : minX;
31065			minY = minY > y ? y : minY;
31066			maxX = maxX < x ? x : maxX;
31067			maxY = maxY < y ? y : maxY;
31068		}
31069		this.bounds = [minX, minY, maxX, maxY];
31070	}
31071	_packData() {
31072		let i, ii, j, jj;
31073		const coords = this.coords;
31074		const coordsPacked = new Float32Array(coords.length * 2);
31075		for (i = 0, j = 0, ii = coords.length; i < ii; i++) {
31076			const xy = coords[i];
31077			coordsPacked[j++] = xy[0];
31078			coordsPacked[j++] = xy[1];
31079		}
31080		this.coords = coordsPacked;
31081		const colors = this.colors;
31082		const colorsPacked = new Uint8Array(colors.length * 3);
31083		for (i = 0, j = 0, ii = colors.length; i < ii; i++) {
31084			const c = colors[i];
31085			colorsPacked[j++] = c[0];
31086			colorsPacked[j++] = c[1];
31087			colorsPacked[j++] = c[2];
31088		}
31089		this.colors = colorsPacked;
31090		const figures = this.figures;
31091		for (i = 0, ii = figures.length; i < ii; i++) {
31092			const figure = figures[i],
31093				ps = figure.coords,
31094				cs = figure.colors;
31095			for (j = 0, jj = ps.length; j < jj; j++) {
31096				ps[j] *= 2;
31097				cs[j] *= 3;
31098			}
31099		}
31100	}
31101	getIR() {
31102		const {
31103			bounds
31104		} = this;
31105		if (bounds[2] - bounds[0] === 0 || bounds[3] - bounds[1] === 0) {
31106			throw new FormatError(`Invalid MeshShading bounds: [${bounds}].`);
31107		}
31108		return ["Mesh", this.shadingType, this.coords, this.colors, this.figures, bounds, this.bbox, this.background];
31109	}
31110}
31111class DummyShading extends BaseShading {
31112	getIR() {
31113		return ["Dummy"];
31114	}
31115}
31116function getTilingPatternIR(operatorList, dict, color) {
31117	const matrix = lookupMatrix(dict.getArray("Matrix"), IDENTITY_MATRIX);
31118	const bbox = lookupNormalRect(dict.getArray("BBox"), null);
31119	if (!bbox || bbox[2] - bbox[0] === 0 || bbox[3] - bbox[1] === 0) {
31120		throw new FormatError(`Invalid getTilingPatternIR /BBox array.`);
31121	}
31122	const xstep = dict.get("XStep");
31123	if (typeof xstep !== "number") {
31124		throw new FormatError(`Invalid getTilingPatternIR /XStep value.`);
31125	}
31126	const ystep = dict.get("YStep");
31127	if (typeof ystep !== "number") {
31128		throw new FormatError(`Invalid getTilingPatternIR /YStep value.`);
31129	}
31130	const paintType = dict.get("PaintType");
31131	if (!Number.isInteger(paintType)) {
31132		throw new FormatError(`Invalid getTilingPatternIR /PaintType value.`);
31133	}
31134	const tilingType = dict.get("TilingType");
31135	if (!Number.isInteger(tilingType)) {
31136		throw new FormatError(`Invalid getTilingPatternIR /TilingType value.`);
31137	}
31138	
vendor: 5,000 bytes, lines 31138-31143
31138return ["TilingPattern", color, operatorList, matrix, bbox, xstep, ystep, paintType, tilingType];
31139}
31140
31141;// ./src/core/calibri_factors.js
31142const CalibriBoldFactors = [1.3877, 1, 1, 1, 0.97801, 0.92482, 0.89552, 0.91133, 0.81988, 0.97566, 0.98152, 0.93548, 0.93548, 1.2798, 0.85284, 0.92794, 1, 0.96134, 1.54657, 0.91133, 0.91133, 0.91133, 0.91133, 0.91133, 0.91133, 0.91133, 0.91133, 0.91133, 0.91133, 0.82845, 0.82845, 0.85284, 0.85284, 0.85284, 0.75859, 0.92138, 0.83908, 0.7762, 0.73293, 0.87289, 0.73133, 0.7514, 0.81921, 0.87356, 0.95958, 0.59526, 0.75727, 0.69225, 1.04924, 0.9121, 0.86943, 0.79795, 0.88198, 0.77958, 0.70864, 0.81055, 0.90399, 0.88653, 0.96017, 0.82577, 0.77892, 0.78257, 0.97507, 1.54657, 0.97507, 0.85284, 0.89552, 0.90176, 0.88762, 0.8785, 0.75241, 0.8785, 0.90518, 0.95015, 0.77618, 0.8785, 0.88401, 0.91916, 0.86304, 0.88401, 0.91488, 0.8785, 0.8801, 0.8785, 0.8785, 0.91343, 0.7173, 1.04106, 0.8785, 0.85075, 0.95794, 0.82616, 0.85162, 0.79492, 0.88331, 1.69808, 0.88331, 0.85284, 0.97801, 0.89552, 0.91133, 0.89552, 0.91133, 1.7801, 0.89552, 1.24487, 1.13254, 1.12401, 0.96839, 0.85284, 0.68787, 0.70645, 0.85592, 0.90747, 1.01466, 1.0088, 0.90323, 1, 1.07463, 1, 0.91056, 0.75806, 1.19118, 0.96839, 0.78864, 0.82845, 0.84133, 0.75859, 0.83908, 0.83908, 0.83908, 0.83908, 0.83908, 0.83908, 0.77539, 0.73293, 0.73133, 0.73133, 0.73133, 0.73133, 0.95958, 0.95958, 0.95958, 0.95958, 0.88506, 0.9121, 0.86943, 0.86943, 0.86943, 0.86943, 0.86943, 0.85284, 0.87508, 0.90399, 0.90399, 0.90399, 0.90399, 0.77892, 0.79795, 0.90807, 0.88762, 0.88762, 0.88762, 0.88762, 0.88762, 0.88762, 0.8715, 0.75241, 0.90518, 0.90518, 0.90518, 0.90518, 0.88401, 0.88401, 0.88401, 0.88401, 0.8785, 0.8785, 0.8801, 0.8801, 0.8801, 0.8801, 0.8801, 0.90747, 0.89049, 0.8785, 0.8785, 0.8785, 0.8785, 0.85162, 0.8785, 0.85162, 0.83908, 0.88762, 0.83908, 0.88762, 0.83908, 0.88762, 0.73293, 0.75241, 0.73293, 0.75241, 0.73293, 0.75241, 0.73293, 0.75241, 0.87289, 0.83016, 0.88506, 0.93125, 0.73133, 0.90518, 0.73133, 0.90518, 0.73133, 0.90518, 0.73133, 0.90518, 0.73133, 0.90518, 0.81921, 0.77618, 0.81921, 0.77618, 0.81921, 0.77618, 1, 1, 0.87356, 0.8785, 0.91075, 0.89608, 0.95958, 0.88401, 0.95958, 0.88401, 0.95958, 0.88401, 0.95958, 0.88401, 0.95958, 0.88401, 0.76229, 0.90167, 0.59526, 0.91916, 1, 1, 0.86304, 0.69225, 0.88401, 1, 1, 0.70424, 0.79468, 0.91926, 0.88175, 0.70823, 0.94903, 0.9121, 0.8785, 1, 1, 0.9121, 0.8785, 0.87802, 0.88656, 0.8785, 0.86943, 0.8801, 0.86943, 0.8801, 0.86943, 0.8801, 0.87402, 0.89291, 0.77958, 0.91343, 1, 1, 0.77958, 0.91343, 0.70864, 0.7173, 0.70864, 0.7173, 0.70864, 0.7173, 0.70864, 0.7173, 1, 1, 0.81055, 0.75841, 0.81055, 1.06452, 0.90399, 0.8785, 0.90399, 0.8785, 0.90399, 0.8785, 0.90399, 0.8785, 0.90399, 0.8785, 0.90399, 0.8785, 0.96017, 0.95794, 0.77892, 0.85162, 0.77892, 0.78257, 0.79492, 0.78257, 0.79492, 0.78257, 0.79492, 0.9297, 0.56892, 0.83908, 0.88762, 0.77539, 0.8715, 0.87508, 0.89049, 1, 1, 0.81055, 1.04106, 1.20528, 1.20528, 1, 1.15543, 0.70674, 0.98387, 0.94721, 1.33431, 1.45894, 0.95161, 1.06303, 0.83908, 0.80352, 0.57184, 0.6965, 0.56289, 0.82001, 0.56029, 0.81235, 1.02988, 0.83908, 0.7762, 0.68156, 0.80367, 0.73133, 0.78257, 0.87356, 0.86943, 0.95958, 0.75727, 0.89019, 1.04924, 0.9121, 0.7648, 0.86943, 0.87356, 0.79795, 0.78275, 0.81055, 0.77892, 0.9762, 0.82577, 0.99819, 0.84896, 0.95958, 0.77892, 0.96108, 1.01407, 0.89049, 1.02988, 0.94211, 0.96108, 0.8936, 0.84021, 0.87842, 0.96399, 0.79109, 0.89049, 1.00813, 1.02988, 0.86077, 0.87445, 0.92099, 0.84723, 0.86513, 0.8801, 0.75638, 0.85714, 0.78216, 0.79586, 0.87965, 0.94211, 0.97747, 0.78287, 0.97926, 0.84971, 1.02988, 0.94211, 0.8801, 0.94211, 0.84971, 0.73133, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0.90264, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0.90518, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0.90548, 1, 1, 1, 1, 1, 1, 0.96017, 0.95794, 0.96017, 0.95794, 0.96017, 0.95794, 0.77892, 0.85162, 1, 1, 0.89552, 0.90527, 1, 0.90363, 0.92794, 0.92794, 0.92794, 0.92794, 0.87012, 0.87012, 0.87012, 0.89552, 0.89552, 1.42259, 0.71143, 1.06152, 1, 1, 1.03372, 1.03372, 0.97171, 1.4956, 2.2807, 0.93835, 0.83406, 0.91133, 0.84107, 0.91133, 1, 1, 1, 0.72021, 1, 1.23108, 0.83489, 0.88525, 0.88525, 0.81499, 0.90527, 1.81055, 0.90527, 1.81055, 1.31006, 1.53711, 0.94434, 1.08696, 1, 0.95018, 0.77192, 0.85284, 0.90747, 1.17534, 0.69825, 0.9716, 1.37077, 0.90747, 0.90747, 0.85356, 0.90747, 0.90747, 1.44947, 0.85284, 0.8941, 0.8941, 0.70572, 0.8, 0.70572, 0.70572, 0.70572, 0.70572, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0.99862, 0.99862, 1, 1, 1, 1, 1, 1.08004, 0.91027, 1, 1, 1, 0.99862, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0.90727, 0.90727, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1];
31143const CalibriBoldMetrics = {
31144	lineHeight: 1.2207,
31145	lineGap: 0.2207
31146}
vendor: 4,884 bytes, lines 31146-31147
31146;
31147const CalibriBoldItalicFactors = [1.3877, 1, 1, 1, 0.97801, 0.92482, 0.89552, 0.91133, 0.81988, 0.97566, 0.98152, 0.93548, 0.93548, 1.2798, 0.85284, 0.92794, 1, 0.96134, 1.56239, 0.91133, 0.91133, 0.91133, 0.91133, 0.91133, 0.91133, 0.91133, 0.91133, 0.91133, 0.91133, 0.82845, 0.82845, 0.85284, 0.85284, 0.85284, 0.75859, 0.92138, 0.83908, 0.7762, 0.71805, 0.87289, 0.73133, 0.7514, 0.81921, 0.87356, 0.95958, 0.59526, 0.75727, 0.69225, 1.04924, 0.90872, 0.85938, 0.79795, 0.87068, 0.77958, 0.69766, 0.81055, 0.90399, 0.88653, 0.96068, 0.82577, 0.77892, 0.78257, 0.97507, 1.529, 0.97507, 0.85284, 0.89552, 0.90176, 0.94908, 0.86411, 0.74012, 0.86411, 0.88323, 0.95015, 0.86411, 0.86331, 0.88401, 0.91916, 0.86304, 0.88401, 0.9039, 0.86331, 0.86331, 0.86411, 0.86411, 0.90464, 0.70852, 1.04106, 0.86331, 0.84372, 0.95794, 0.82616, 0.84548, 0.79492, 0.88331, 1.69808, 0.88331, 0.85284, 0.97801, 0.89552, 0.91133, 0.89552, 0.91133, 1.7801, 0.89552, 1.24487, 1.13254, 1.19129, 0.96839, 0.85284, 0.68787, 0.70645, 0.85592, 0.90747, 1.01466, 1.0088, 0.90323, 1, 1.07463, 1, 0.91056, 0.75806, 1.19118, 0.96839, 0.78864, 0.82845, 0.84133, 0.75859, 0.83908, 0.83908, 0.83908, 0.83908, 0.83908, 0.83908, 0.77539, 0.71805, 0.73133, 0.73133, 0.73133, 0.73133, 0.95958, 0.95958, 0.95958, 0.95958, 0.88506, 0.90872, 0.85938, 0.85938, 0.85938, 0.85938, 0.85938, 0.85284, 0.87068, 0.90399, 0.90399, 0.90399, 0.90399, 0.77892, 0.79795, 0.90807, 0.94908, 0.94908, 0.94908, 0.94908, 0.94908, 0.94908, 0.85887, 0.74012, 0.88323, 0.88323, 0.88323, 0.88323, 0.88401, 0.88401, 0.88401, 0.88401, 0.8785, 0.86331, 0.86331, 0.86331, 0.86331, 0.86331, 0.86331, 0.90747, 0.89049, 0.86331, 0.86331, 0.86331, 0.86331, 0.84548, 0.86411, 0.84548, 0.83908, 0.94908, 0.83908, 0.94908, 0.83908, 0.94908, 0.71805, 0.74012, 0.71805, 0.74012, 0.71805, 0.74012, 0.71805, 0.74012, 0.87289, 0.79538, 0.88506, 0.92726, 0.73133, 0.88323, 0.73133, 0.88323, 0.73133, 0.88323, 0.73133, 0.88323, 0.73133, 0.88323, 0.81921, 0.86411, 0.81921, 0.86411, 0.81921, 0.86411, 1, 1, 0.87356, 0.86331, 0.91075, 0.8777, 0.95958, 0.88401, 0.95958, 0.88401, 0.95958, 0.88401, 0.95958, 0.88401, 0.95958, 0.88401, 0.76467, 0.90167, 0.59526, 0.91916, 1, 1, 0.86304, 0.69225, 0.88401, 1, 1, 0.70424, 0.77312, 0.91926, 0.88175, 0.70823, 0.94903, 0.90872, 0.86331, 1, 1, 0.90872, 0.86331, 0.86906, 0.88116, 0.86331, 0.85938, 0.86331, 0.85938, 0.86331, 0.85938, 0.86331, 0.87402, 0.86549, 0.77958, 0.90464, 1, 1, 0.77958, 0.90464, 0.69766, 0.70852, 0.69766, 0.70852, 0.69766, 0.70852, 0.69766, 0.70852, 1, 1, 0.81055, 0.75841, 0.81055, 1.06452, 0.90399, 0.86331, 0.90399, 0.86331, 0.90399, 0.86331, 0.90399, 0.86331, 0.90399, 0.86331, 0.90399, 0.86331, 0.96068, 0.95794, 0.77892, 0.84548, 0.77892, 0.78257, 0.79492, 0.78257, 0.79492, 0.78257, 0.79492, 0.9297, 0.56892, 0.83908, 0.94908, 0.77539, 0.85887, 0.87068, 0.89049, 1, 1, 0.81055, 1.04106, 1.20528, 1.20528, 1, 1.15543, 0.70088, 0.98387, 0.94721, 1.33431, 1.45894, 0.95161, 1.48387, 0.83908, 0.80352, 0.57118, 0.6965, 0.56347, 0.79179, 0.55853, 0.80346, 1.02988, 0.83908, 0.7762, 0.67174, 0.86036, 0.73133, 0.78257, 0.87356, 0.86441, 0.95958, 0.75727, 0.89019, 1.04924, 0.90872, 0.74889, 0.85938, 0.87891, 0.79795, 0.7957, 0.81055, 0.77892, 0.97447, 0.82577, 0.97466, 0.87179, 0.95958, 0.77892, 0.94252, 0.95612, 0.8753, 1.02988, 0.92733, 0.94252, 0.87411, 0.84021, 0.8728, 0.95612, 0.74081, 0.8753, 1.02189, 1.02988, 0.84814, 0.87445, 0.91822, 0.84723, 0.85668, 0.86331, 0.81344, 0.87581, 0.76422, 0.82046, 0.96057, 0.92733, 0.99375, 0.78022, 0.95452, 0.86015, 1.02988, 0.92733, 0.86331, 0.92733, 0.86015, 0.73133, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0.90631, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0.88323, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0.85174, 1, 1, 1, 1, 1, 1, 0.96068, 0.95794, 0.96068, 0.95794, 0.96068, 0.95794, 0.77892, 0.84548, 1, 1, 0.89552, 0.90527, 1, 0.90363, 0.92794, 0.92794, 0.92794, 0.89807, 0.87012, 0.87012, 0.87012, 0.89552, 0.89552, 1.42259, 0.71094, 1.06152, 1, 1, 1.03372, 1.03372, 0.97171, 1.4956, 2.2807, 0.92972, 0.83406, 0.91133, 0.83326, 0.91133, 1, 1, 1, 0.72021, 1, 1.23108, 0.83489, 0.88525, 0.88525, 0.81499, 0.90616, 1.81055, 0.90527, 1.81055, 1.3107, 1.53711, 0.94434, 1.08696, 1, 0.95018, 0.77192, 0.85284, 0.90747, 1.17534, 0.69825, 0.9716, 1.37077, 0.90747, 0.90747, 0.85356, 0.90747, 0.90747, 1.44947, 0.85284, 0.8941, 0.8941, 0.70572, 0.8, 0.70572, 0.70572, 0.70572, 0.70572, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0.99862, 0.99862, 1, 1, 1, 1, 1, 1.08004, 0.91027, 1, 1, 1, 0.99862, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0.90727, 0.90727, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1];
31148const CalibriBoldItalicMetrics = {
31149	lineHeight: 1.2207,
31150	
vendor: 4,853 bytes, lines 31150-31153
31150lineGap: 0.2207
31151};
31152const CalibriItalicFactors = [1.3877, 1, 1, 1, 1.17223, 1.1293, 0.89552, 0.91133, 0.80395, 1.02269, 1.15601, 0.91056, 0.91056, 1.2798, 0.85284, 0.89807, 1, 0.90861, 1.39543, 0.91133, 0.91133, 0.91133, 0.91133, 0.91133, 0.91133, 0.91133, 0.91133, 0.91133, 0.91133, 0.96309, 0.96309, 0.85284, 0.85284, 0.85284, 0.83319, 0.88071, 0.8675, 0.81552, 0.72346, 0.85193, 0.73206, 0.7522, 0.81105, 0.86275, 0.90685, 0.6377, 0.77892, 0.75593, 1.02638, 0.89249, 0.84118, 0.77452, 0.85374, 0.75186, 0.67789, 0.79776, 0.88844, 0.85066, 0.94309, 0.77818, 0.7306, 0.76659, 1.10369, 1.38313, 1.10369, 1.06139, 0.89552, 0.8739, 0.9245, 0.9245, 0.83203, 0.9245, 0.85865, 1.09842, 0.9245, 0.9245, 1.03297, 1.07692, 0.90918, 1.03297, 0.94959, 0.9245, 0.92274, 0.9245, 0.9245, 1.02933, 0.77832, 1.20562, 0.9245, 0.8916, 0.98986, 0.86621, 0.89453, 0.79004, 0.94152, 1.77256, 0.94152, 0.85284, 0.97801, 0.89552, 0.91133, 0.89552, 0.91133, 1.91729, 0.89552, 1.17889, 1.13254, 1.16359, 0.92098, 0.85284, 0.68787, 0.71353, 0.84737, 0.90747, 1.0088, 1.0044, 0.87683, 1, 1.09091, 1, 0.92229, 0.739, 1.15642, 0.92098, 0.76288, 0.80504, 0.80972, 0.75859, 0.8675, 0.8675, 0.8675, 0.8675, 0.8675, 0.8675, 0.76318, 0.72346, 0.73206, 0.73206, 0.73206, 0.73206, 0.90685, 0.90685, 0.90685, 0.90685, 0.86477, 0.89249, 0.84118, 0.84118, 0.84118, 0.84118, 0.84118, 0.85284, 0.84557, 0.88844, 0.88844, 0.88844, 0.88844, 0.7306, 0.77452, 0.86331, 0.9245, 0.9245, 0.9245, 0.9245, 0.9245, 0.9245, 0.84843, 0.83203, 0.85865, 0.85865, 0.85865, 0.85865, 0.82601, 0.82601, 0.82601, 0.82601, 0.94469, 0.9245, 0.92274, 0.92274, 0.92274, 0.92274, 0.92274, 0.90747, 0.86651, 0.9245, 0.9245, 0.9245, 0.9245, 0.89453, 0.9245, 0.89453, 0.8675, 0.9245, 0.8675, 0.9245, 0.8675, 0.9245, 0.72346, 0.83203, 0.72346, 0.83203, 0.72346, 0.83203, 0.72346, 0.83203, 0.85193, 0.8875, 0.86477, 0.99034, 0.73206, 0.85865, 0.73206, 0.85865, 0.73206, 0.85865, 0.73206, 0.85865, 0.73206, 0.85865, 0.81105, 0.9245, 0.81105, 0.9245, 0.81105, 0.9245, 1, 1, 0.86275, 0.9245, 0.90872, 0.93591, 0.90685, 0.82601, 0.90685, 0.82601, 0.90685, 0.82601, 0.90685, 1.03297, 0.90685, 0.82601, 0.77896, 1.05611, 0.6377, 1.07692, 1, 1, 0.90918, 0.75593, 1.03297, 1, 1, 0.76032, 0.9375, 0.98156, 0.93407, 0.77261, 1.11429, 0.89249, 0.9245, 1, 1, 0.89249, 0.9245, 0.92534, 0.86698, 0.9245, 0.84118, 0.92274, 0.84118, 0.92274, 0.84118, 0.92274, 0.8667, 0.86291, 0.75186, 1.02933, 1, 1, 0.75186, 1.02933, 0.67789, 0.77832, 0.67789, 0.77832, 0.67789, 0.77832, 0.67789, 0.77832, 1, 1, 0.79776, 0.97655, 0.79776, 1.23023, 0.88844, 0.9245, 0.88844, 0.9245, 0.88844, 0.9245, 0.88844, 0.9245, 0.88844, 0.9245, 0.88844, 0.9245, 0.94309, 0.98986, 0.7306, 0.89453, 0.7306, 0.76659, 0.79004, 0.76659, 0.79004, 0.76659, 0.79004, 1.09231, 0.54873, 0.8675, 0.9245, 0.76318, 0.84843, 0.84557, 0.86651, 1, 1, 0.79776, 1.20562, 1.18622, 1.18622, 1, 1.1437, 0.67009, 0.96334, 0.93695, 1.35191, 1.40909, 0.95161, 1.48387, 0.8675, 0.90861, 0.6192, 0.7363, 0.64824, 0.82411, 0.56321, 0.85696, 1.23516, 0.8675, 0.81552, 0.7286, 0.84134, 0.73206, 0.76659, 0.86275, 0.84369, 0.90685, 0.77892, 0.85871, 1.02638, 0.89249, 0.75828, 0.84118, 0.85984, 0.77452, 0.76466, 0.79776, 0.7306, 0.90782, 0.77818, 0.903, 0.87291, 0.90685, 0.7306, 0.99058, 1.03667, 0.94635, 1.23516, 0.9849, 0.99058, 0.92393, 0.8916, 0.942, 1.03667, 0.75026, 0.94635, 1.0297, 1.23516, 0.90918, 0.94048, 0.98217, 0.89746, 0.84153, 0.92274, 0.82507, 0.88832, 0.84438, 0.88178, 1.03525, 0.9849, 1.00225, 0.78086, 0.97248, 0.89404, 1.23516, 0.9849, 0.92274, 0.9849, 0.89404, 0.73206, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0.89693, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0.85865, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0.90933, 1, 1, 1, 1, 1, 1, 0.94309, 0.98986, 0.94309, 0.98986, 0.94309, 0.98986, 0.7306, 0.89453, 1, 1, 0.89552, 0.90527, 1, 0.90186, 1.12308, 1.12308, 1.12308, 1.12308, 1.2566, 1.2566, 1.2566, 0.89552, 0.89552, 1.42259, 0.68994, 1.03809, 1, 1, 1.0176, 1.0176, 1.11523, 1.4956, 2.01462, 0.97858, 0.82616, 0.91133, 0.83437, 0.91133, 1, 1, 1, 0.70508, 1, 1.23108, 0.79801, 0.84426, 0.84426, 0.774, 0.90572, 1.81055, 0.90749, 1.81055, 1.28809, 1.55469, 0.94434, 1.07806, 1, 0.97094, 0.7589, 0.85284, 0.90747, 1.19658, 0.69825, 0.97622, 1.33512, 0.90747, 0.90747, 0.85284, 0.90747, 0.90747, 1.44947, 0.85284, 0.8941, 0.8941, 0.70572, 0.8, 0.70572, 0.70572, 0.70572, 0.70572, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0.99862, 0.99862, 1, 1, 1, 1, 1, 1.0336, 0.91027, 1, 1, 1, 0.99862, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1.05859, 1.05859, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1];
31153const CalibriItalicMetrics = {
31154	lineHeight: 1.2207,
31155	
vendor: 4,912 bytes, lines 31155-31158
31155lineGap: 0.2207
31156};
31157const CalibriRegularFactors = [1.3877, 1, 1, 1, 1.17223, 1.1293, 0.89552, 0.91133, 0.80395, 1.02269, 1.15601, 0.91056, 0.91056, 1.2798, 0.85284, 0.89807, 1, 0.90861, 1.39016, 0.91133, 0.91133, 0.91133, 0.91133, 0.91133, 0.91133, 0.91133, 0.91133, 0.91133, 0.91133, 0.96309, 0.96309, 0.85284, 0.85284, 0.85284, 0.83319, 0.88071, 0.8675, 0.81552, 0.73834, 0.85193, 0.73206, 0.7522, 0.81105, 0.86275, 0.90685, 0.6377, 0.77892, 0.75593, 1.02638, 0.89385, 0.85122, 0.77452, 0.86503, 0.75186, 0.68887, 0.79776, 0.88844, 0.85066, 0.94258, 0.77818, 0.7306, 0.76659, 1.10369, 1.39016, 1.10369, 1.06139, 0.89552, 0.8739, 0.86128, 0.94469, 0.8457, 0.94469, 0.89464, 1.09842, 0.84636, 0.94469, 1.03297, 1.07692, 0.90918, 1.03297, 0.95897, 0.94469, 0.9482, 0.94469, 0.94469, 1.04692, 0.78223, 1.20562, 0.94469, 0.90332, 0.98986, 0.86621, 0.90527, 0.79004, 0.94152, 1.77256, 0.94152, 0.85284, 0.97801, 0.89552, 0.91133, 0.89552, 0.91133, 1.91729, 0.89552, 1.17889, 1.13254, 1.08707, 0.92098, 0.85284, 0.68787, 0.71353, 0.84737, 0.90747, 1.0088, 1.0044, 0.87683, 1, 1.09091, 1, 0.92229, 0.739, 1.15642, 0.92098, 0.76288, 0.80504, 0.80972, 0.75859, 0.8675, 0.8675, 0.8675, 0.8675, 0.8675, 0.8675, 0.76318, 0.73834, 0.73206, 0.73206, 0.73206, 0.73206, 0.90685, 0.90685, 0.90685, 0.90685, 0.86477, 0.89385, 0.85122, 0.85122, 0.85122, 0.85122, 0.85122, 0.85284, 0.85311, 0.88844, 0.88844, 0.88844, 0.88844, 0.7306, 0.77452, 0.86331, 0.86128, 0.86128, 0.86128, 0.86128, 0.86128, 0.86128, 0.8693, 0.8457, 0.89464, 0.89464, 0.89464, 0.89464, 0.82601, 0.82601, 0.82601, 0.82601, 0.94469, 0.94469, 0.9482, 0.9482, 0.9482, 0.9482, 0.9482, 0.90747, 0.86651, 0.94469, 0.94469, 0.94469, 0.94469, 0.90527, 0.94469, 0.90527, 0.8675, 0.86128, 0.8675, 0.86128, 0.8675, 0.86128, 0.73834, 0.8457, 0.73834, 0.8457, 0.73834, 0.8457, 0.73834, 0.8457, 0.85193, 0.92454, 0.86477, 0.9921, 0.73206, 0.89464, 0.73206, 0.89464, 0.73206, 0.89464, 0.73206, 0.89464, 0.73206, 0.89464, 0.81105, 0.84636, 0.81105, 0.84636, 0.81105, 0.84636, 1, 1, 0.86275, 0.94469, 0.90872, 0.95786, 0.90685, 0.82601, 0.90685, 0.82601, 0.90685, 0.82601, 0.90685, 1.03297, 0.90685, 0.82601, 0.77741, 1.05611, 0.6377, 1.07692, 1, 1, 0.90918, 0.75593, 1.03297, 1, 1, 0.76032, 0.90452, 0.98156, 1.11842, 0.77261, 1.11429, 0.89385, 0.94469, 1, 1, 0.89385, 0.94469, 0.95877, 0.86901, 0.94469, 0.85122, 0.9482, 0.85122, 0.9482, 0.85122, 0.9482, 0.8667, 0.90016, 0.75186, 1.04692, 1, 1, 0.75186, 1.04692, 0.68887, 0.78223, 0.68887, 0.78223, 0.68887, 0.78223, 0.68887, 0.78223, 1, 1, 0.79776, 0.92188, 0.79776, 1.23023, 0.88844, 0.94469, 0.88844, 0.94469, 0.88844, 0.94469, 0.88844, 0.94469, 0.88844, 0.94469, 0.88844, 0.94469, 0.94258, 0.98986, 0.7306, 0.90527, 0.7306, 0.76659, 0.79004, 0.76659, 0.79004, 0.76659, 0.79004, 1.09231, 0.54873, 0.8675, 0.86128, 0.76318, 0.8693, 0.85311, 0.86651, 1, 1, 0.79776, 1.20562, 1.18622, 1.18622, 1, 1.1437, 0.67742, 0.96334, 0.93695, 1.35191, 1.40909, 0.95161, 1.48387, 0.86686, 0.90861, 0.62267, 0.74359, 0.65649, 0.85498, 0.56963, 0.88254, 1.23516, 0.8675, 0.81552, 0.75443, 0.84503, 0.73206, 0.76659, 0.86275, 0.85122, 0.90685, 0.77892, 0.85746, 1.02638, 0.89385, 0.75657, 0.85122, 0.86275, 0.77452, 0.74171, 0.79776, 0.7306, 0.95165, 0.77818, 0.89772, 0.88831, 0.90685, 0.7306, 0.98142, 1.02191, 0.96576, 1.23516, 0.99018, 0.98142, 0.9236, 0.89258, 0.94035, 1.02191, 0.78848, 0.96576, 0.9561, 1.23516, 0.90918, 0.92578, 0.95424, 0.89746, 0.83969, 0.9482, 0.80113, 0.89442, 0.85208, 0.86155, 0.98022, 0.99018, 1.00452, 0.81209, 0.99247, 0.89181, 1.23516, 0.99018, 0.9482, 0.99018, 0.89181, 0.73206, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0.88844, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0.89464, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0.96766, 1, 1, 1, 1, 1, 1, 0.94258, 0.98986, 0.94258, 0.98986, 0.94258, 0.98986, 0.7306, 0.90527, 1, 1, 0.89552, 0.90527, 1, 0.90186, 1.12308, 1.12308, 1.12308, 1.12308, 1.2566, 1.2566, 1.2566, 0.89552, 0.89552, 1.42259, 0.69043, 1.03809, 1, 1, 1.0176, 1.0176, 1.11523, 1.4956, 2.01462, 0.99331, 0.82616, 0.91133, 0.84286, 0.91133, 1, 1, 1, 0.70508, 1, 1.23108, 0.79801, 0.84426, 0.84426, 0.774, 0.90527, 1.81055, 0.90527, 1.81055, 1.28809, 1.55469, 0.94434, 1.07806, 1, 0.97094, 0.7589, 0.85284, 0.90747, 1.19658, 0.69825, 0.97622, 1.33512, 0.90747, 0.90747, 0.85356, 0.90747, 0.90747, 1.44947, 0.85284, 0.8941, 0.8941, 0.70572, 0.8, 0.70572, 0.70572, 0.70572, 0.70572, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0.99862, 0.99862, 1, 1, 1, 1, 1, 1.0336, 0.91027, 1, 1, 1, 0.99862, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1.05859, 1.05859, 1, 1, 1, 1.07185, 0.99413, 0.96334, 1.08065, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1];
31158const CalibriRegularMetrics = {
31159	lineHeight: 1.2207,
31160	lineGap: 0.2207
31161};
31162
31163;// ./src/core/helvetica_factors.js
31164const HelveticaBoldFactors = [0.76116, 1, 1, 1.0006, 0.99998, 0.99974, 0.99973, 0.99973, 0.99982, 0.99977, 1.00087, 0.99998, 0.99998, 0.99959, 1.00003, 1.0006, 0.99998, 1.0006, 1.0006, 0.99973, 0.99973, 0.99973, 0.99973, 0.99973, 0.99973, 0.99973, 0.99973, 0.99973, 0.99973, 0.99998, 1, 1.00003, 1.00003, 1.00003, 1.00026, 0.9999, 0.99977, 0.99977, 0.99977, 0.99977, 1.00001, 1.00026, 1.00022, 0.99977, 1.0006, 0.99973, 0.99977, 1.00026, 0.99999, 0.99977, 1.00022, 1.00001, 1.00022, 0.99977, 1.00001, 1.00026, 0.99977, 1.00001, 1.00016, 1.00001, 1.00001, 1.00026, 0.99998, 1.0006, 0.99998, 1.00003, 0.99973, 0.99998, 0.99973, 1.00026, 0.99973, 1.00026, 0.99973, 0.99998, 1.00026, 1.00026, 1.0006, 1.0006, 0.99973, 1.0006, 0.99982, 1.00026, 1.00026, 1.00026, 1.00026, 0.99959, 0.99973, 0.99998, 1.00026, 0.99973, 1.00022, 0.99973, 0.99973, 1, 0.99959, 1.00077, 0.99959, 1.00003, 0.99998, 0.99973, 0.99973, 0.99973, 0.99973, 1.00077, 0.99973, 0.99998, 1.00025, 0.99968, 0.99973, 1.00003, 1.00025, 0.60299, 1.00024, 1.06409, 1, 1, 0.99998, 1, 0.99973, 1.0006, 0.99998, 1, 0.99936, 0.99973, 1.00002, 1.00002, 1.00002, 1.00026, 0.99977, 0.99977, 0.99977, 0.99977, 0.99977, 0.99977, 1, 0.99977, 1.00001, 1.00001, 1.00001, 1.00001, 1.0006, 1.0006, 1.0006, 1.0006, 0.99977, 0.99977, 1.00022, 1.00022, 1.00022, 1.00022, 1.00022, 1.00003, 1.00022, 0.99977, 0.99977, 0.99977, 0.99977, 1.00001, 1.00001, 1.00026, 0.99973, 0.99973, 0.99973, 0.99973, 0.99973, 0.99973, 0.99982, 0.99973, 0.99973, 0.99973, 0.99973, 0.99973, 1.0006, 1.0006, 1.0006, 1.0006, 1.00026, 1.00026, 1.00026, 1.00026, 1.00026, 1.00026, 1.00026, 1.06409, 1.00026, 1.00026, 1.00026, 1.00026, 1.00026, 0.99973, 1.00026, 0.99973, 0.99977, 0.99973, 0.99977, 0.99973, 0.99977, 0.99973, 0.99977, 0.99973, 0.99977, 0.99973, 0.99977, 0.99973, 0.99977, 0.99973, 0.99977, 1.03374, 0.99977, 1.00026, 1.00001, 0.99973, 1.00001, 0.99973, 1.00001, 0.99973, 1.00001, 0.99973, 1.00001, 0.99973, 1.00022, 1.00026, 1.00022, 1.00026, 1.00022, 1.00026, 1.00022, 1.00026, 0.99977, 1.00026, 0.99977, 1.00026, 1.0006, 1.0006, 1.0006, 1.0006, 1.0006, 1.0006, 1.0006, 1.0006, 1.0006, 1.0006, 1.00042, 0.99973, 0.99973, 1.0006, 0.99977, 0.99973, 0.99973, 1.00026, 1.0006, 1.00026, 1.0006, 1.00026, 1.03828, 1.00026, 0.99999, 1.00026, 1.0006, 0.99977, 1.00026, 0.99977, 1.00026, 0.99977, 1.00026, 0.9993, 0.9998, 1.00026, 1.00022, 1.00026, 1.00022, 1.00026, 1.00022, 1.00026, 1, 1.00016, 0.99977, 0.99959, 0.99977, 0.99959, 0.99977, 0.99959, 1.00001, 0.99973, 1.00001, 0.99973, 1.00001, 0.99973, 1.00001, 0.99973, 1.00026, 0.99998, 1.00026, 0.8121, 1.00026, 0.99998, 0.99977, 1.00026, 0.99977, 1.00026, 0.99977, 1.00026, 0.99977, 1.00026, 0.99977, 1.00026, 0.99977, 1.00026, 1.00016, 1.00022, 1.00001, 0.99973, 1.00001, 1.00026, 1, 1.00026, 1, 1.00026, 1, 1.0006, 0.99973, 0.99977, 0.99973, 1, 0.99982, 1.00022, 1.00026, 1.00001, 0.99973, 1.00026, 0.99998, 0.99998, 0.99998, 0.99998, 0.99998, 0.99998, 0.99998, 0.99998, 0.99998, 0.99998, 0.99998, 1.00034, 0.99977, 1, 0.99997, 1.00026, 1.00078, 1.00036, 0.99973, 1.00013, 1.0006, 0.99977, 0.99977, 0.99988, 0.85148, 1.00001, 1.00026, 0.99977, 1.00022, 1.0006, 0.99977, 1.00001, 0.99999, 0.99977, 1.00069, 1.00022, 0.99977, 1.00001, 0.99984, 1.00026, 1.00001, 1.00024, 1.00001, 0.9999, 1, 1.0006, 1.00001, 1.00041, 0.99962, 1.00026, 1.0006, 0.99995, 1.00041, 0.99942, 0.99973, 0.99927, 1.00082, 0.99902, 1.00026, 1.00087, 1.0006, 1.00069, 0.99973, 0.99867, 0.99973, 0.9993, 1.00026, 1.00049, 1.00056, 1, 0.99988, 0.99935, 0.99995, 0.99954, 1.00055, 0.99945, 1.00032, 1.0006, 0.99995, 1.00026, 0.99995, 1.00032, 1.00001, 1.00008, 0.99971, 1.00019, 0.9994, 1.00001, 1.0006, 1.00044, 0.99973, 1.00023, 1.00047, 1, 0.99942, 0.99561, 0.99989, 1.00035, 0.99977, 1.00035, 0.99977, 1.00019, 0.99944, 1.00001, 1.00021, 0.99926, 1.00035, 1.00035, 0.99942, 1.00048, 0.99999, 0.99977, 1.00022, 1.00035, 1.00001, 0.99977, 1.00026, 0.99989, 1.00057, 1.00001, 0.99936, 1.00052, 1.00012, 0.99996, 1.00043, 1, 1.00035, 0.9994, 0.99976, 1.00035, 0.99973, 1.00052, 1.00041, 1.00119, 1.00037, 0.99973, 1.00002, 0.99986, 1.00041, 1.00041, 0.99902, 0.9996, 1.00034, 0.99999, 1.00026, 0.99999, 1.00026, 0.99973, 1.00052, 0.99973, 1, 0.99973, 1.00041, 1.00075, 0.9994, 1.0003, 0.99999, 1, 1.00041, 0.99955, 1, 0.99915, 0.99973, 0.99973, 1.00026, 1.00119, 0.99955, 0.99973, 1.0006, 0.99911, 1.0006, 1.00026, 0.99972, 1.00026, 0.99902, 1.00041, 0.99973, 0.99999, 1, 1, 1.00038, 1.0005, 1.00016, 1.00022, 1.00016, 1.00022, 1.00016, 1.00022, 1.00001, 0.99973, 1, 1, 0.99973, 1, 1, 0.99955, 1.0006, 1.0006, 1.0006, 1.0006, 1, 1, 1, 0.99973, 0.99973, 0.99972, 1, 1, 1.00106, 0.99999, 0.99998, 0.99998, 0.99999, 0.99998, 1.66475, 1, 0.99973, 0.99973, 1.00023, 0.99973, 0.99971, 1.00047, 1.00023, 1, 0.99991, 0.99984, 1.00002, 1.00002, 1.00002, 1.00002, 1, 1, 1, 1, 1, 1, 1, 0.99972, 1, 1.20985, 1.39713, 1.00003, 1.00031, 1.00015, 1, 0.99561, 1.00027, 1.00031, 1.00031, 0.99915, 1.00031, 1.00031, 0.99999, 1.00003, 0.99999, 0.99999, 1.41144, 1.6, 1.41144, 1.41144, 1.41144, 1.41144, 1.41144, 1.41144, 1.41144, 1.41144, 1.41144, 1.41144, 1.41144, 1.41144, 1.41144, 1.41144, 1.41144, 1.41144, 1.41144, 1.41144, 1.41144, 1.41144, 1.41144, 1.41144, 1.41144, 1.41144, 1.41144, 1.41144, 1.41144, 1.41144, 1.41144, 1.41144, 1.41144, 1.41144, 1.41144, 1.41144, 1.41144, 1.41144, 1.41144, 1.41144, 1.41144, 1.41144, 1.41144, 1.41144, 1.41144, 1.40579, 1.40579, 1.36625, 0.99999, 1, 0.99861, 0.99861, 1, 1.00026, 1.00026, 1.00026, 1.00026, 0.99972, 0.99999, 0.99999, 0.99999, 0.99999, 1.40483, 1, 0.99977, 1.00054, 1, 1, 0.99953, 0.99962, 1.00042, 0.9995, 1, 1, 1, 1, 1, 1, 1, 1, 0.99998, 0.99998, 0.99998, 0.99998, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1];
31165const HelveticaBoldMetrics = {
31166	lineHeight: 1.2,
31167	lineGap: 0.2
31168};
31169const HelveticaBoldItalicFactors = [0.76116, 1, 1, 1.0006, 0.99998, 0.99974, 0.99973, 0.99973, 0.99982, 0.99977, 1.00087, 0.99998, 0.99998, 0.99959, 1.00003, 1.0006, 0.99998, 1.0006, 1.0006, 0.99973, 0.99973, 0.99973, 0.99973, 0.99973, 0.99973, 0.99973, 0.99973, 0.99973, 0.99973, 0.99998, 1, 1.00003, 1.00003, 1.00003, 1.00026, 0.9999, 0.99977, 0.99977, 0.99977, 0.99977, 1.00001, 1.00026, 1.00022, 0.99977, 1.0006, 0.99973, 0.99977, 1.00026, 0.99999, 0.99977, 1.00022, 1.00001, 1.00022, 0.99977, 1.00001, 1.00026, 0.99977, 1.00001, 1.00016, 1.00001, 1.00001, 1.00026, 0.99998, 1.0006, 0.99998, 1.00003, 0.99973, 0.99998, 0.99973, 1.00026, 0.99973, 1.00026, 0.99973, 0.99998, 1.00026, 1.00026, 1.0006, 1.0006, 0.99973, 1.0006, 0.99982, 1.00026, 1.00026, 1.00026, 1.00026, 0.99959, 0.99973, 0.99998, 1.00026, 0.99973, 1.00022, 0.99973, 0.99973, 1, 0.99959, 1.00077, 0.99959, 1.00003, 0.99998, 0.99973, 0.99973, 0.99973, 0.99973, 1.00077, 0.99973, 0.99998, 1.00025, 0.99968, 0.99973, 1.00003, 1.00025, 0.60299, 1.00024, 1.06409, 1, 1, 0.99998, 1, 0.99973, 1.0006, 0.99998, 1, 0.99936, 0.99973, 1.00002, 1.00002, 1.00002, 1.00026, 0.99977, 0.99977, 0.99977, 0.99977, 0.99977, 0.99977, 1, 0.99977, 1.00001, 1.00001, 1.00001, 1.00001, 1.0006, 1.0006, 1.0006, 1.0006, 0.99977, 0.99977, 1.00022, 1.00022, 1.00022, 1.00022, 1.00022, 1.00003, 1.00022, 0.99977, 0.99977, 0.99977, 0.99977, 1.00001, 1.00001, 1.00026, 0.99973, 0.99973, 0.99973, 0.99973, 0.99973, 0.99973, 0.99982, 0.99973, 0.99973, 0.99973, 0.99973, 0.99973, 1.0006, 1.0006, 1.0006, 1.0006, 1.00026, 1.00026, 1.00026, 1.00026, 1.00026, 1.00026, 1.00026, 1.06409, 1.00026, 1.00026, 1.00026, 1.00026, 1.00026, 0.99973, 1.00026, 0.99973, 0.99977, 0.99973, 0.99977, 0.99973, 0.99977, 0.99973, 0.99977, 0.99973, 0.99977, 0.99973, 0.99977, 0.99973, 0.99977, 0.99973, 0.99977, 1.0044, 0.99977, 1.00026, 1.00001, 0.99973, 1.00001, 0.99973, 1.00001, 0.99973, 1.00001, 0.99973, 1.00001, 0.99973, 1.00022, 1.00026, 1.00022, 1.00026, 1.00022, 1.00026, 1.00022, 1.00026, 0.99977, 1.00026, 0.99977, 1.00026, 1.0006, 1.0006, 1.0006, 1.0006, 1.0006, 1.0006, 1.0006, 1.0006, 1.0006, 1.0006, 0.99971, 0.99973, 0.99973, 1.0006, 0.99977, 0.99973, 0.99973, 1.00026, 1.0006, 1.00026, 1.0006, 1.00026, 1.01011, 1.00026, 0.99999, 1.00026, 1.0006, 0.99977, 1.00026, 0.99977, 1.00026, 0.99977, 1.00026, 0.9993, 0.9998, 1.00026, 1.00022, 1.00026, 1.00022, 1.00026, 1.00022, 1.00026, 1, 1.00016, 0.99977, 0.99959, 0.99977, 0.99959, 0.99977, 0.99959, 1.00001, 0.99973, 1.00001, 0.99973, 1.00001, 0.99973, 1.00001, 0.99973, 1.00026, 0.99998, 1.00026, 0.8121, 1.00026, 0.99998, 0.99977, 1.00026, 0.99977, 1.00026, 0.99977, 1.00026, 0.99977, 1.00026, 0.99977, 1.00026, 0.99977, 1.00026, 1.00016, 1.00022, 1.00001, 0.99973, 1.00001, 1.00026, 1, 1.00026, 1, 1.00026, 1, 1.0006, 0.99973, 0.99977, 0.99973, 1, 0.99982, 1.00022, 1.00026, 1.00001, 0.99973, 1.00026, 0.99998, 0.99998, 0.99998, 0.99998, 0.99998, 0.99998, 0.99998, 0.99998, 0.99998, 0.99998, 0.99998, 0.99998, 0.99977, 1, 1, 1.00026, 0.99969, 0.99972, 0.99981, 0.9998, 1.0006, 0.99977, 0.99977, 1.00022, 0.91155, 1.00001, 1.00026, 0.99977, 1.00022, 1.0006, 0.99977, 1.00001, 0.99999, 0.99977, 0.99966, 1.00022, 1.00032, 1.00001, 0.99944, 1.00026, 1.00001, 0.99968, 1.00001, 1.00047, 1, 1.0006, 1.00001, 0.99981, 1.00101, 1.00026, 1.0006, 0.99948, 0.99981, 1.00064, 0.99973, 0.99942, 1.00101, 1.00061, 1.00026, 1.00069, 1.0006, 1.00014, 0.99973, 1.01322, 0.99973, 1.00065, 1.00026, 1.00012, 0.99923, 1, 1.00064, 1.00076, 0.99948, 1.00055, 1.00063, 1.00007, 0.99943, 1.0006, 0.99948, 1.00026, 0.99948, 0.99943, 1.00001, 1.00001, 1.00029, 1.00038, 1.00035, 1.00001, 1.0006, 1.0006, 0.99973, 0.99978, 1.00001, 1.00057, 0.99989, 0.99967, 0.99964, 0.99967, 0.99977, 0.99999, 0.99977, 1.00038, 0.99977, 1.00001, 0.99973, 1.00066, 0.99967, 0.99967, 1.00041, 0.99998, 0.99999, 0.99977, 1.00022, 0.99967, 1.00001, 0.99977, 1.00026, 0.99964, 1.00031, 1.00001, 0.99999, 0.99999, 1, 1.00023, 1, 1, 0.99999, 1.00035, 1.00001, 0.99999, 0.99973, 0.99977, 0.99999, 1.00058, 0.99973, 0.99973, 0.99955, 0.9995, 1.00026, 1.00026, 1.00032, 0.99989, 1.00034, 0.99999, 1.00026, 1.00026, 1.00026, 0.99973, 0.45998, 0.99973, 1.00026, 0.99973, 1.00001, 0.99999, 0.99982, 0.99994, 0.99996, 1, 1.00042, 1.00044, 1.00029, 1.00023, 0.99973, 0.99973, 1.00026, 0.99949, 1.00002, 0.99973, 1.0006, 1.0006, 1.0006, 0.99975, 1.00026, 1.00026, 1.00032, 0.98685, 0.99973, 1.00026, 1, 1, 0.99966, 1.00044, 1.00016, 1.00022, 1.00016, 1.00022, 1.00016, 1.00022, 1.00001, 0.99973, 1, 1, 0.99973, 1, 1, 0.99955, 1.0006, 1.0006, 1.0006, 1.0006, 1, 1, 1, 0.99973, 0.99973, 0.99972, 1, 1, 1.00106, 0.99999, 0.99998, 0.99998, 0.99999, 0.99998, 1.66475, 1, 0.99973, 0.99973, 1, 0.99973, 0.99971, 0.99978, 1, 1, 0.99991, 0.99984, 1.00002, 1.00002, 1.00002, 1.00002, 1.00098, 1, 1, 1, 1.00049, 1, 1, 0.99972, 1, 1.20985, 1.39713, 1.00003, 1.00031, 1.00015, 1, 0.99561, 1.00027, 1.00031, 1.00031, 0.99915, 1.00031, 1.00031, 0.99999, 1.00003, 0.99999, 0.99999, 1.41144, 1.6, 1.41144, 1.41144, 1.41144, 1.41144, 1.41144, 1.41144, 1.41144, 1.41144, 1.41144, 1.41144, 1.41144, 1.41144, 1.41144, 1.41144, 1.41144, 1.41144, 1.41144, 1.41144, 1.41144, 1.41144, 1.41144, 1.41144, 1.41144, 1.41144, 1.41144, 1.41144, 1.41144, 1.41144, 1.41144, 1.41144, 1.41144, 1.41144, 1.41144, 1.41144, 1.41144, 1.41144, 1.41144, 1.41144, 1.41144, 1.41144, 1.41144, 1.41144, 1.41144, 1.40579, 1.40579, 1.36625, 0.99999, 1, 0.99861, 0.99861, 1, 1.00026, 1.00026, 1.00026, 1.00026, 0.99972, 0.99999, 0.99999, 0.99999, 0.99999, 1.40483, 1, 0.99977, 1.00054, 1, 1, 0.99953, 0.99962, 1.00042, 0.9995, 1, 1, 1, 1, 1, 1, 1, 1, 0.99998, 0.99998, 0.99998, 0.99998, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1];
31170const HelveticaBoldItalicMetrics = {
31171	lineHeight: 1.35,
31172	lineGap: 0.2
31173};
31174const HelveticaItalicFactors = [0.76116, 1, 1, 1.0006, 1.0006, 1.00006, 0.99973, 0.99973, 0.99982, 1.00001, 1.00043, 0.99998, 0.99998, 0.99959, 1.00003, 1.0006, 0.99998, 1.0006, 1.0006, 0.99973, 0.99973, 0.99973, 0.99973, 0.99973, 0.99973, 0.99973, 0.99973, 0.99973, 0.99973, 1.0006, 1, 1.00003, 1.00003, 1.00003, 0.99973, 0.99987, 1.00001, 1.00001, 0.99977, 0.99977, 1.00001, 1.00026, 1.00022, 0.99977, 1.0006, 1, 1.00001, 0.99973, 0.99999, 0.99977, 1.00022, 1.00001, 1.00022, 0.99977, 1.00001, 1.00026, 0.99977, 1.00001, 1.00016, 1.00001, 1.00001, 1.00026, 1.0006, 1.0006, 1.0006, 0.99949, 0.99973, 0.99998, 0.99973, 0.99973, 1, 0.99973, 0.99973, 1.0006, 0.99973, 0.99973, 0.99924, 0.99924, 1, 0.99924, 0.99999, 0.99973, 0.99973, 0.99973, 0.99973, 0.99998, 1, 1.0006, 0.99973, 1, 0.99977, 1, 1, 1, 1.00005, 1.0009, 1.00005, 1.00003, 0.99998, 0.99973, 0.99973, 0.99973, 0.99973, 1.0009, 0.99973, 0.99998, 1.00025, 0.99968, 0.99973, 1.00003, 1.00025, 0.60299, 1.00024, 1.06409, 1, 1, 0.99998, 1, 0.9998, 1.0006, 0.99998, 1, 0.99936, 0.99973, 1.00002, 1.00002, 1.00002, 1.00026, 1.00001, 1.00001, 1.00001, 1.00001, 1.00001, 1.00001, 1, 0.99977, 1.00001, 1.00001, 1.00001, 1.00001, 1.0006, 1.0006, 1.0006, 1.0006, 0.99977, 0.99977, 1.00022, 1.00022, 1.00022, 1.00022, 1.00022, 1.00003, 1.00022, 0.99977, 0.99977, 0.99977, 0.99977, 1.00001, 1.00001, 1.00026, 0.99973, 0.99973, 0.99973, 0.99973, 0.99973, 0.99973, 0.99982, 1, 0.99973, 0.99973, 0.99973, 0.99973, 1.0006, 1.0006, 1.0006, 1.0006, 0.99973, 0.99973, 0.99973, 0.99973, 0.99973, 0.99973, 0.99973, 1.06409, 1.00026, 0.99973, 0.99973, 0.99973, 0.99973, 1, 0.99973, 1, 1.00001, 0.99973, 1.00001, 0.99973, 1.00001, 0.99973, 0.99977, 1, 0.99977, 1, 0.99977, 1, 0.99977, 1, 0.99977, 1.0288, 0.99977, 0.99973, 1.00001, 0.99973, 1.00001, 0.99973, 1.00001, 0.99973, 1.00001, 0.99973, 1.00001, 0.99973, 1.00022, 0.99973, 1.00022, 0.99973, 1.00022, 0.99973, 1.00022, 0.99973, 0.99977, 0.99973, 0.99977, 0.99973, 1.0006, 1.0006, 1.0006, 1.0006, 1.0006, 1.0006, 1.0006, 0.99924, 1.0006, 1.0006, 0.99946, 1.00034, 1, 0.99924, 1.00001, 1, 1, 0.99973, 0.99924, 0.99973, 0.99924, 0.99973, 1.06311, 0.99973, 1.00024, 0.99973, 0.99924, 0.99977, 0.99973, 0.99977, 0.99973, 0.99977, 0.99973, 1.00041, 0.9998, 0.99973, 1.00022, 0.99973, 1.00022, 0.99973, 1.00022, 0.99973, 1, 1.00016, 0.99977, 0.99998, 0.99977, 0.99998, 0.99977, 0.99998, 1.00001, 1, 1.00001, 1, 1.00001, 1, 1.00001, 1, 1.00026, 1.0006, 1.00026, 0.89547, 1.00026, 1.0006, 0.99977, 0.99973, 0.99977, 0.99973, 0.99977, 0.99973, 0.99977, 0.99973, 0.99977, 0.99973, 0.99977, 0.99973, 1.00016, 0.99977, 1.00001, 1, 1.00001, 1.00026, 1, 1.00026, 1, 1.00026, 1, 0.99924, 0.99973, 1.00001, 0.99973, 1, 0.99982, 1.00022, 1.00026, 1.00001, 1, 1.00026, 1.0006, 0.99998, 0.99998, 0.99998, 0.99998, 0.99998, 0.99998, 0.99998, 0.99998, 0.99998, 0.99998, 0.99998, 1.00001, 1, 1.00054, 0.99977, 1.00084, 1.00007, 0.99973, 1.00013, 0.99924, 1.00001, 1.00001, 0.99945, 0.91221, 1.00001, 1.00026, 0.99977, 1.00022, 1.0006, 1.00001, 1.00001, 0.99999, 0.99977, 0.99933, 1.00022, 1.00054, 1.00001, 1.00065, 1.00026, 1.00001, 1.0001, 1.00001, 1.00052, 1, 1.0006, 1.00001, 0.99945, 0.99897, 0.99968, 0.99924, 1.00036, 0.99945, 0.99949, 1, 1.0006, 0.99897, 0.99918, 0.99968, 0.99911, 0.99924, 1, 0.99962, 1.01487, 1, 1.0005, 0.99973, 1.00012, 1.00043, 1, 0.99995, 0.99994, 1.00036, 0.99947, 1.00019, 1.00063, 1.00025, 0.99924, 1.00036, 0.99973, 1.00036, 1.00025, 1.00001, 1.00001, 1.00027, 1.0001, 1.00068, 1.00001, 1.0006, 1.0006, 1, 1.00008, 0.99957, 0.99972, 0.9994, 0.99954, 0.99975, 1.00051, 1.00001, 1.00019, 1.00001, 1.0001, 0.99986, 1.00001, 1.00001, 1.00038, 0.99954, 0.99954, 0.9994, 1.00066, 0.99999, 0.99977, 1.00022, 1.00054, 1.00001, 0.99977, 1.00026, 0.99975, 1.0001, 1.00001, 0.99993, 0.9995, 0.99955, 1.00016, 0.99978, 0.99974, 1.00019, 1.00022, 0.99955, 1.00053, 0.99973, 1.00089, 1.00005, 0.99967, 1.00048, 0.99973, 1.00002, 1.00034, 0.99973, 0.99973, 0.99964, 1.00006, 1.00066, 0.99947, 0.99973, 0.98894, 0.99973, 1, 0.44898, 1, 0.99946, 1, 1.00039, 1.00082, 0.99991, 0.99991, 0.99985, 1.00022, 1.00023, 1.00061, 1.00006, 0.99966, 0.99973, 0.99973, 0.99973, 1.00019, 1.0008, 1, 0.99924, 0.99924, 0.99924, 0.99983, 1.00044, 0.99973, 0.99964, 0.98332, 1, 0.99973, 1, 1, 0.99962, 0.99895, 1.00016, 0.99977, 1.00016, 0.99977, 1.00016, 0.99977, 1.00001, 1, 1, 1, 0.99973, 1, 1, 0.99955, 0.99924, 0.99924, 0.99924, 0.99924, 0.99998, 0.99998, 0.99998, 0.99973, 0.99973, 0.99972, 1, 1, 1.00267, 0.99999, 0.99998, 0.99998, 1, 0.99998, 1.66475, 1, 0.99973, 0.99973, 1.00023, 0.99973, 1.00423, 0.99925, 0.99999, 1, 0.99991, 0.99984, 1.00002, 1.00002, 1.00002, 1.00002, 1.00049, 1, 1.00245, 1, 1, 1, 1, 0.96329, 1, 1.20985, 1.39713, 1.00003, 0.8254, 1.00015, 1, 1.00035, 1.00027, 1.00031, 1.00031, 1.00003, 1.00031, 1.00031, 0.99999, 1.00003, 0.99999, 0.99999, 1.41144, 1.6, 1.41144, 1.41144, 1.41144, 1.41144, 1.41144, 1.41144, 1.41144, 1.41144, 1.41144, 1.41144, 1.41144, 1.41144, 1.41144, 1.41144, 1.41144, 1.41144, 1.41144, 1.41144, 1.41144, 1.41144, 1.41144, 1.41144, 1.41144, 1.41144, 1.41144, 1.41144, 1.41144, 1.41144, 1.41144, 1.41144, 1.41144, 1.41144, 1.41144, 1.41144, 1.41144, 1.41144, 1.41144, 1.41144, 1.41144, 1.41144, 1.41144, 1.41144, 1.41144, 1.40579, 1.40579, 1.36625, 0.99999, 1, 0.99861, 0.99861, 1, 1.00026, 1.00026, 1.00026, 1.00026, 0.95317, 0.99999, 0.99999, 0.99999, 0.99999, 1.40483, 1, 0.99977, 1.00054, 1, 1, 0.99953, 0.99962, 1.00042, 0.9995, 1, 1, 1, 1, 1, 1, 1, 1, 0.99998, 0.99998, 0.99998, 0.99998, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1];
31175const HelveticaItalicMetrics = {
31176	lineHeight: 1.35,
31177	lineGap: 0.2
31178};
31179const HelveticaRegularFactors = [0.76116, 1, 1, 1.0006, 1.0006, 1.00006, 0.99973, 0.99973, 0.99982, 1.00001, 1.00043, 0.99998, 0.99998, 0.99959, 1.00003, 1.0006, 0.99998, 1.0006, 1.0006, 0.99973, 0.99973, 0.99973, 0.99973, 0.99973, 0.99973, 0.99973, 0.99973, 0.99973, 0.99973, 1.0006, 1, 1.00003, 1.00003, 1.00003, 0.99973, 0.99987, 1.00001, 1.00001, 0.99977, 0.99977, 1.00001, 1.00026, 1.00022, 0.99977, 1.0006, 1, 1.00001, 0.99973, 0.99999, 0.99977, 1.00022, 1.00001, 1.00022, 0.99977, 1.00001, 1.00026, 0.99977, 1.00001, 1.00016, 1.00001, 1.00001, 1.00026, 1.0006, 1.0006, 1.0006, 0.99949, 0.99973, 0.99998, 0.99973, 0.99973, 1, 0.99973, 0.99973, 1.0006, 0.99973, 0.99973, 0.99924, 0.99924, 1, 0.99924, 0.99999, 0.99973, 0.99973, 0.99973, 0.99973, 0.99998, 1, 1.0006, 0.99973, 1, 0.99977, 1, 1, 1, 1.00005, 1.0009, 1.00005, 1.00003, 0.99998, 0.99973, 0.99973, 0.99973, 0.99973, 1.0009, 0.99973, 0.99998, 1.00025, 0.99968, 0.99973, 1.00003, 1.00025, 0.60299, 1.00024, 1.06409, 1, 1, 0.99998, 1, 0.9998, 1.0006, 0.99998, 1, 0.99936, 0.99973, 1.00002, 1.00002, 1.00002, 1.00026, 1.00001, 1.00001, 1.00001, 1.00001, 1.00001, 1.00001, 1, 0.99977, 1.00001, 1.00001, 1.00001, 1.00001, 1.0006, 1.0006, 1.0006, 1.0006, 0.99977, 0.99977, 1.00022, 1.00022, 1.00022, 1.00022, 1.00022, 1.00003, 1.00022, 0.99977, 0.99977, 0.99977, 0.99977, 1.00001, 1.00001, 1.00026, 0.99973, 0.99973, 0.99973, 0.99973, 0.99973, 0.99973, 0.99982, 1, 0.99973, 0.99973, 0.99973, 0.99973, 1.0006, 1.0006, 1.0006, 1.0006, 0.99973, 0.99973, 0.99973, 0.99973, 0.99973, 0.99973, 0.99973, 1.06409, 1.00026, 0.99973, 0.99973, 0.99973, 0.99973, 1, 0.99973, 1, 1.00001, 0.99973, 1.00001, 0.99973, 1.00001, 0.99973, 0.99977, 1, 0.99977, 1, 0.99977, 1, 0.99977, 1, 0.99977, 1.04596, 0.99977, 0.99973, 1.00001, 0.99973, 1.00001, 0.99973, 1.00001, 0.99973, 1.00001, 0.99973, 1.00001, 0.99973, 1.00022, 0.99973, 1.00022, 0.99973, 1.00022, 0.99973, 1.00022, 0.99973, 0.99977, 0.99973, 0.99977, 0.99973, 1.0006, 1.0006, 1.0006, 1.0006, 1.0006, 1.0006, 1.0006, 0.99924, 1.0006, 1.0006, 1.00019, 1.00034, 1, 0.99924, 1.00001, 1, 1, 0.99973, 0.99924, 0.99973, 0.99924, 0.99973, 1.02572, 0.99973, 1.00005, 0.99973, 0.99924, 0.99977, 0.99973, 0.99977, 0.99973, 0.99977, 0.99973, 0.99999, 0.9998, 0.99973, 1.00022, 0.99973, 1.00022, 0.99973, 1.00022, 0.99973, 1, 1.00016, 0.99977, 0.99998, 0.99977, 0.99998, 0.99977, 0.99998, 1.00001, 1, 1.00001, 1, 1.00001, 1, 1.00001, 1, 1.00026, 1.0006, 1.00026, 0.84533, 1.00026, 1.0006, 0.99977, 0.99973, 0.99977, 0.99973, 0.99977, 0.99973, 0.99977, 0.99973, 0.99977, 0.99973, 0.99977, 0.99973, 1.00016, 0.99977, 1.00001, 1, 1.00001, 1.00026, 1, 1.00026, 1, 1.00026, 1, 0.99924, 0.99973, 1.00001, 0.99973, 1, 0.99982, 1.00022, 1.00026, 1.00001, 1, 1.00026, 1.0006, 0.99998, 0.99998, 0.99998, 0.99998, 0.99998, 0.99998, 0.99998, 0.99998, 0.99998, 0.99998, 0.99998, 0.99928, 1, 0.99977, 1.00013, 1.00055, 0.99947, 0.99945, 0.99941, 0.99924, 1.00001, 1.00001, 1.0004, 0.91621, 1.00001, 1.00026, 0.99977, 1.00022, 1.0006, 1.00001, 1.00005, 0.99999, 0.99977, 1.00015, 1.00022, 0.99977, 1.00001, 0.99973, 1.00026, 1.00001, 1.00019, 1.00001, 0.99946, 1, 1.0006, 1.00001, 0.99978, 1.00045, 0.99973, 0.99924, 1.00023, 0.99978, 0.99966, 1, 1.00065, 1.00045, 1.00019, 0.99973, 0.99973, 0.99924, 1, 1, 0.96499, 1, 1.00055, 0.99973, 1.00008, 1.00027, 1, 0.9997, 0.99995, 1.00023, 0.99933, 1.00019, 1.00015, 1.00031, 0.99924, 1.00023, 0.99973, 1.00023, 1.00031, 1.00001, 0.99928, 1.00029, 1.00092, 1.00035, 1.00001, 1.0006, 1.0006, 1, 0.99988, 0.99975, 1, 1.00082, 0.99561, 0.9996, 1.00035, 1.00001, 0.99962, 1.00001, 1.00092, 0.99964, 1.00001, 0.99963, 0.99999, 1.00035, 1.00035, 1.00082, 0.99962, 0.99999, 0.99977, 1.00022, 1.00035, 1.00001, 0.99977, 1.00026, 0.9996, 0.99967, 1.00001, 1.00034, 1.00074, 1.00054, 1.00053, 1.00063, 0.99971, 0.99962, 1.00035, 0.99975, 0.99977, 0.99973, 1.00043, 0.99953, 
311791.0007, 0.99915, 0.99973, 1.00008, 0.99892, 1.00073, 1.00073, 1.00114, 0.99915, 1.00073, 0.99955, 0.99973, 1.00092, 0.99973, 1, 0.99998, 1, 1.0003, 1, 1.00043, 1.00001, 0.99969, 1.0003, 1, 1.00035, 1.00001, 0.9995, 1, 1.00092, 0.99973, 0.99973, 0.99973, 1.0007, 0.9995, 1, 0.99924, 1.0006, 0.99924, 0.99972, 1.00062, 0.99973, 1.00114, 1.00073, 1, 0.99955, 1, 1, 1.00047, 0.99968, 1.00016, 0.99977, 1.00016, 0.99977, 1.00016, 0.99977, 1.00001, 1, 1, 1, 0.99973, 1, 1, 0.99955, 0.99924, 0.99924, 0.99924, 0.99924, 0.99998, 0.99998, 0.99998, 0.99973, 0.99973, 0.99972, 1, 1, 1.00267, 0.99999, 0.99998, 0.99998, 1, 0.99998, 1.66475, 1, 0.99973, 0.99973, 1.00023, 0.99973, 0.99971, 0.99925, 1.00023, 1, 0.99991, 0.99984, 1.00002, 1.00002, 1.00002, 1.00002, 1, 1, 1, 1, 1, 1, 1, 0.96329, 1, 1.20985, 1.39713, 1.00003, 0.8254, 1.00015, 1, 1.00035, 1.00027, 1.00031, 1.00031, 0.99915, 1.00031, 1.00031, 0.99999, 1.00003, 0.99999, 0.99999, 1.41144, 1.6, 1.41144, 1.41144, 1.41144, 1.41144, 1.41144, 1.41144, 1.41144, 1.41144, 1.41144, 1.41144, 1.41144, 1.41144, 1.41144, 1.41144, 1.41144, 1.41144, 1.41144, 1.41144, 1.41144, 1.41144, 1.41144, 1.41144, 1.41144, 1.41144, 1.41144, 1.41144, 1.41144, 1.41144, 1.41144, 1.41144, 1.41144, 1.41144, 1.41144, 1.41144, 1.41144, 1.41144, 1.41144, 1.41144, 1.41144, 1.41144, 1.41144, 1.41144, 1.41144, 1.40579, 1.40579, 1.36625, 0.99999, 1, 0.99861, 0.99861, 1, 1.00026, 1.00026, 1.00026, 1.00026, 0.95317, 0.99999, 0.99999, 0.99999, 0.99999, 1.40483, 1, 0.99977, 1.00054, 1, 1, 0.99953, 0.99962, 1.00042, 0.9995, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1];
31180const HelveticaRegularMetrics = {
31181	lineHeight: 1.2,
31182	
vendor: 32,941 bytes, lines 31182-31197
31182lineGap: 0.2
31183};
31184
31185;// ./src/core/liberationsans_widths.js
31186const LiberationSansBoldWidths = [365, 0, 333, 278, 333, 474, 556, 556, 889, 722, 238, 333, 333, 389, 584, 278, 333, 278, 278, 556, 556, 556, 556, 556, 556, 556, 556, 556, 556, 333, 333, 584, 584, 584, 611, 975, 722, 722, 722, 722, 667, 611, 778, 722, 278, 556, 722, 611, 833, 722, 778, 667, 778, 722, 667, 611, 722, 667, 944, 667, 667, 611, 333, 278, 333, 584, 556, 333, 556, 611, 556, 611, 556, 333, 611, 611, 278, 278, 556, 278, 889, 611, 611, 611, 611, 389, 556, 333, 611, 556, 778, 556, 556, 500, 389, 280, 389, 584, 333, 556, 556, 556, 556, 280, 556, 333, 737, 370, 556, 584, 737, 552, 400, 549, 333, 333, 333, 576, 556, 278, 333, 333, 365, 556, 834, 834, 834, 611, 722, 722, 722, 722, 722, 722, 1000, 722, 667, 667, 667, 667, 278, 278, 278, 278, 722, 722, 778, 778, 778, 778, 778, 584, 778, 722, 722, 722, 722, 667, 667, 611, 556, 556, 556, 556, 556, 556, 889, 556, 556, 556, 556, 556, 278, 278, 278, 278, 611, 611, 611, 611, 611, 611, 611, 549, 611, 611, 611, 611, 611, 556, 611, 556, 722, 556, 722, 556, 722, 556, 722, 556, 722, 556, 722, 556, 722, 556, 722, 719, 722, 611, 667, 556, 667, 556, 667, 556, 667, 556, 667, 556, 778, 611, 778, 611, 778, 611, 778, 611, 722, 611, 722, 611, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 785, 556, 556, 278, 722, 556, 556, 611, 278, 611, 278, 611, 385, 611, 479, 611, 278, 722, 611, 722, 611, 722, 611, 708, 723, 611, 778, 611, 778, 611, 778, 611, 1000, 944, 722, 389, 722, 389, 722, 389, 667, 556, 667, 556, 667, 556, 667, 556, 611, 333, 611, 479, 611, 333, 722, 611, 722, 611, 722, 611, 722, 611, 722, 611, 722, 611, 944, 778, 667, 556, 667, 611, 500, 611, 500, 611, 500, 278, 556, 722, 556, 1000, 889, 778, 611, 667, 556, 611, 333, 333, 333, 333, 333, 333, 333, 333, 333, 333, 333, 465, 722, 333, 853, 906, 474, 825, 927, 838, 278, 722, 722, 601, 719, 667, 611, 722, 778, 278, 722, 667, 833, 722, 644, 778, 722, 667, 600, 611, 667, 821, 667, 809, 802, 278, 667, 615, 451, 611, 278, 582, 615, 610, 556, 606, 475, 460, 611, 541, 278, 558, 556, 612, 556, 445, 611, 766, 619, 520, 684, 446, 582, 715, 576, 753, 845, 278, 582, 611, 582, 845, 667, 669, 885, 567, 711, 667, 278, 276, 556, 1094, 1062, 875, 610, 722, 622, 719, 722, 719, 722, 567, 712, 667, 904, 626, 719, 719, 610, 702, 833, 722, 778, 719, 667, 722, 611, 622, 854, 667, 730, 703, 1005, 1019, 870, 979, 719, 711, 1031, 719, 556, 618, 615, 417, 635, 556, 709, 497, 615, 615, 500, 635, 740, 604, 611, 604, 611, 556, 490, 556, 875, 556, 615, 581, 833, 844, 729, 854, 615, 552, 854, 583, 556, 556, 611, 417, 552, 556, 278, 281, 278, 969, 906, 611, 500, 615, 556, 604, 778, 611, 487, 447, 944, 778, 944, 778, 944, 778, 667, 556, 333, 333, 556, 1000, 1000, 552, 278, 278, 278, 278, 500, 500, 500, 556, 556, 350, 1000, 1000, 240, 479, 333, 333, 604, 333, 167, 396, 556, 556, 1094, 556, 885, 489, 1115, 1000, 768, 600, 834, 834, 834, 834, 1000, 500, 1000, 500, 1000, 500, 500, 494, 612, 823, 713, 584, 549, 713, 979, 722, 274, 549, 549, 583, 549, 549, 604, 584, 604, 604, 708, 625, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 729, 604, 604, 354, 354, 1000, 990, 990, 990, 990, 494, 604, 604, 604, 604, 354, 1021, 1052, 917, 750, 750, 531, 656, 594, 510, 500, 750, 750, 611, 611, 333, 333, 333, 333, 333, 333, 333, 333, 222, 222, 333, 333, 333, 333, 333, 333, 333, 333];
31187const LiberationSansBoldMapping = [-1, -1, -1, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, 123, 124, 125, 126, 161, 162, 163, 164, 165, 166, 167, 168, 169, 170, 171, 172, 174, 175, 176, 177, 178, 179, 180, 181, 182, 183, 184, 185, 186, 187, 188, 189, 190, 191, 192, 193, 194, 195, 196, 197, 198, 199, 200, 201, 202, 203, 204, 205, 206, 207, 208, 209, 210, 211, 212, 213, 214, 215, 216, 217, 218, 219, 220, 221, 222, 223, 224, 225, 226, 227, 228, 229, 230, 231, 232, 233, 234, 235, 236, 237, 238, 239, 240, 241, 242, 243, 244, 245, 246, 247, 248, 249, 250, 251, 252, 253, 254, 255, 256, 257, 258, 259, 260, 261, 262, 263, 264, 265, 266, 267, 268, 269, 270, 271, 272, 273, 274, 275, 276, 277, 278, 279, 280, 281, 282, 283, 284, 285, 286, 287, 288, 289, 290, 291, 292, 293, 294, 295, 296, 297, 298, 299, 300, 301, 302, 303, 304, 305, 306, 307, 308, 309, 310, 311, 312, 313, 314, 315, 316, 317, 318, 319, 320, 321, 322, 323, 324, 325, 326, 327, 328, 329, 330, 331, 332, 333, 334, 335, 336, 337, 338, 339, 340, 341, 342, 343, 344, 345, 346, 347, 348, 349, 350, 351, 352, 353, 354, 355, 356, 357, 358, 359, 360, 361, 362, 363, 364, 365, 366, 367, 368, 369, 370, 371, 372, 373, 374, 375, 376, 377, 378, 379, 380, 381, 382, 383, 402, 506, 507, 508, 509, 510, 511, 536, 537, 538, 539, 710, 711, 713, 728, 729, 730, 731, 732, 733, 900, 901, 902, 903, 904, 905, 906, 908, 910, 911, 912, 913, 914, 915, 916, 917, 918, 919, 920, 921, 922, 923, 924, 925, 926, 927, 928, 929, 931, 932, 933, 934, 935, 936, 937, 938, 939, 940, 941, 942, 943, 944, 945, 946, 947, 948, 949, 950, 951, 952, 953, 954, 955, 956, 957, 958, 959, 960, 961, 962, 963, 964, 965, 966, 967, 968, 969, 970, 971, 972, 973, 974, 1024, 1025, 1026, 1027, 1028, 1029, 1030, 1031, 1032, 1033, 1034, 1035, 1036, 1037, 1038, 1039, 1040, 1041, 1042, 1043, 1044, 1045, 1046, 1047, 1048, 1049, 1050, 1051, 1052, 1053, 1054, 1055, 1056, 1057, 1058, 1059, 1060, 1061, 1062, 1063, 1064, 1065, 1066, 1067, 1068, 1069, 1070, 1071, 1072, 1073, 1074, 1075, 1076, 1077, 1078, 1079, 1080, 1081, 1082, 1083, 1084, 1085, 1086, 1087, 1088, 1089, 1090, 1091, 1092, 1093, 1094, 1095, 1096, 1097, 1098, 1099, 1100, 1101, 1102, 1103, 1104, 1105, 1106, 1107, 1108, 1109, 1110, 1111, 1112, 1113, 1114, 1115, 1116, 1117, 1118, 1119, 1138, 1139, 1168, 1169, 7808, 7809, 7810, 7811, 7812, 7813, 7922, 7923, 8208, 8209, 8211, 8212, 8213, 8215, 8216, 8217, 8218, 8219, 8220, 8221, 8222, 8224, 8225, 8226, 8230, 8240, 8242, 8243, 8249, 8250, 8252, 8254, 8260, 8319, 8355, 8356, 8359, 8364, 8453, 8467, 8470, 8482, 8486, 8494, 8539, 8540, 8541, 8542, 8592, 8593, 8594, 8595, 8596, 8597, 8616, 8706, 8710, 8719, 8721, 8722, 8730, 8734, 8735, 8745, 8747, 8776, 8800, 8801, 8804, 8805, 8962, 8976, 8992, 8993, 9472, 9474, 9484, 9488, 9492, 9496, 9500, 9508, 9516, 9524, 9532, 9552, 9553, 9554, 9555, 9556, 9557, 9558, 9559, 9560, 9561, 9562, 9563, 9564, 9565, 9566, 9567, 9568, 9569, 9570, 9571, 9572, 9573, 9574, 9575, 9576, 9577, 9578, 9579, 9580, 9600, 9604, 9608, 9612, 9616, 9617, 9618, 9619, 9632, 9633, 9642, 9643, 9644, 9650, 9658, 9660, 9668, 9674, 9675, 9679, 9688, 9689, 9702, 9786, 9787, 9788, 9792, 9794, 9824, 9827, 9829, 9830, 9834, 9835, 9836, 61441, 61442, 61445, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1];
31188const LiberationSansBoldItalicWidths = [365, 0, 333, 278, 333, 474, 556, 556, 889, 722, 238, 333, 333, 389, 584, 278, 333, 278, 278, 556, 556, 556, 556, 556, 556, 556, 556, 556, 556, 333, 333, 584, 584, 584, 611, 975, 722, 722, 722, 722, 667, 611, 778, 722, 278, 556, 722, 611, 833, 722, 778, 667, 778, 722, 667, 611, 722, 667, 944, 667, 667, 611, 333, 278, 333, 584, 556, 333, 556, 611, 556, 611, 556, 333, 611, 611, 278, 278, 556, 278, 889, 611, 611, 611, 611, 389, 556, 333, 611, 556, 778, 556, 556, 500, 389, 280, 389, 584, 333, 556, 556, 556, 556, 280, 556, 333, 737, 370, 556, 584, 737, 552, 400, 549, 333, 333, 333, 576, 556, 278, 333, 333, 365, 556, 834, 834, 834, 611, 722, 722, 722, 722, 722, 722, 1000, 722, 667, 667, 667, 667, 278, 278, 278, 278, 722, 722, 778, 778, 778, 778, 778, 584, 778, 722, 722, 722, 722, 667, 667, 611, 556, 556, 556, 556, 556, 556, 889, 556, 556, 556, 556, 556, 278, 278, 278, 278, 611, 611, 611, 611, 611, 611, 611, 549, 611, 611, 611, 611, 611, 556, 611, 556, 722, 556, 722, 556, 722, 556, 722, 556, 722, 556, 722, 556, 722, 556, 722, 740, 722, 611, 667, 556, 667, 556, 667, 556, 667, 556, 667, 556, 778, 611, 778, 611, 778, 611, 778, 611, 722, 611, 722, 611, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 782, 556, 556, 278, 722, 556, 556, 611, 278, 611, 278, 611, 396, 611, 479, 611, 278, 722, 611, 722, 611, 722, 611, 708, 723, 611, 778, 611, 778, 611, 778, 611, 1000, 944, 722, 389, 722, 389, 722, 389, 667, 556, 667, 556, 667, 556, 667, 556, 611, 333, 611, 479, 611, 333, 722, 611, 722, 611, 722, 611, 722, 611, 722, 611, 722, 611, 944, 778, 667, 556, 667, 611, 500, 611, 500, 611, 500, 278, 556, 722, 556, 1000, 889, 778, 611, 667, 556, 611, 333, 333, 333, 333, 333, 333, 333, 333, 333, 333, 333, 333, 722, 333, 854, 906, 473, 844, 930, 847, 278, 722, 722, 610, 671, 667, 611, 722, 778, 278, 722, 667, 833, 722, 657, 778, 718, 667, 590, 611, 667, 822, 667, 829, 781, 278, 667, 620, 479, 611, 278, 591, 620, 621, 556, 610, 479, 492, 611, 558, 278, 566, 556, 603, 556, 450, 611, 712, 605, 532, 664, 409, 591, 704, 578, 773, 834, 278, 591, 611, 591, 834, 667, 667, 886, 614, 719, 667, 278, 278, 556, 1094, 1042, 854, 622, 719, 677, 719, 722, 708, 722, 614, 722, 667, 927, 643, 719, 719, 615, 687, 833, 722, 778, 719, 667, 722, 611, 677, 781, 667, 729, 708, 979, 989, 854, 1000, 708, 719, 1042, 729, 556, 619, 604, 534, 618, 556, 736, 510, 611, 611, 507, 622, 740, 604, 611, 611, 611, 556, 889, 556, 885, 556, 646, 583, 889, 935, 707, 854, 594, 552, 865, 589, 556, 556, 611, 469, 563, 556, 278, 278, 278, 969, 906, 611, 507, 619, 556, 611, 778, 611, 575, 467, 944, 778, 944, 778, 944, 778, 667, 556, 333, 333, 556, 1000, 1000, 552, 278, 278, 278, 278, 500, 500, 500, 556, 556, 350, 1000, 1000, 240, 479, 333, 333, 604, 333, 167, 396, 556, 556, 1104, 556, 885, 516, 1146, 1000, 768, 600, 834, 834, 834, 834, 999, 500, 1000, 500, 1000, 500, 500, 494, 612, 823, 713, 584, 549, 713, 979, 722, 274, 549, 549, 583, 549, 549, 604, 584, 604, 604, 708, 625, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 729, 604, 604, 354, 354, 1000, 990, 990, 990, 990, 494, 604, 604, 604, 604, 354, 1021, 1052, 917, 750, 750, 531, 656, 594, 510, 500, 750, 750, 611, 611, 333, 333, 333, 333, 333, 333, 333, 333, 222, 222, 333, 333, 333, 333, 333, 333, 333, 333];
31189const LiberationSansBoldItalicMapping = [-1, -1, -1, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, 123, 124, 125, 126, 161, 162, 163, 164, 165, 166, 167, 168, 169, 170, 171, 172, 174, 175, 176, 177, 178, 179, 180, 181, 182, 183, 184, 185, 186, 187, 188, 189, 190, 191, 192, 193, 194, 195, 196, 197, 198, 199, 200, 201, 202, 203, 204, 205, 206, 207, 208, 209, 210, 211, 212, 213, 214, 215, 216, 217, 218, 219, 220, 221, 222, 223, 224, 225, 226, 227, 228, 229, 230, 231, 232, 233, 234, 235, 236, 237, 238, 239, 240, 241, 242, 243, 244, 245, 246, 247, 248, 249, 250, 251, 252, 253, 254, 255, 256, 257, 258, 259, 260, 261, 262, 263, 264, 265, 266, 267, 268, 269, 270, 271, 272, 273, 274, 275, 276, 277, 278, 279, 280, 281, 282, 283, 284, 285, 286, 287, 288, 289, 290, 291, 292, 293, 294, 295, 296, 297, 298, 299, 300, 301, 302, 303, 304, 305, 306, 307, 308, 309, 310, 311, 312, 313, 314, 315, 316, 317, 318, 319, 320, 321, 322, 323, 324, 325, 326, 327, 328, 329, 330, 331, 332, 333, 334, 335, 336, 337, 338, 339, 340, 341, 342, 343, 344, 345, 346, 347, 348, 349, 350, 351, 352, 353, 354, 355, 356, 357, 358, 359, 360, 361, 362, 363, 364, 365, 366, 367, 368, 369, 370, 371, 372, 373, 374, 375, 376, 377, 378, 379, 380, 381, 382, 383, 402, 506, 507, 508, 509, 510, 511, 536, 537, 538, 539, 710, 711, 713, 728, 729, 730, 731, 732, 733, 900, 901, 902, 903, 904, 905, 906, 908, 910, 911, 912, 913, 914, 915, 916, 917, 918, 919, 920, 921, 922, 923, 924, 925, 926, 927, 928, 929, 931, 932, 933, 934, 935, 936, 937, 938, 939, 940, 941, 942, 943, 944, 945, 946, 947, 948, 949, 950, 951, 952, 953, 954, 955, 956, 957, 958, 959, 960, 961, 962, 963, 964, 965, 966, 967, 968, 969, 970, 971, 972, 973, 974, 1024, 1025, 1026, 1027, 1028, 1029, 1030, 1031, 1032, 1033, 1034, 1035, 1036, 1037, 1038, 1039, 1040, 1041, 1042, 1043, 1044, 1045, 1046, 1047, 1048, 1049, 1050, 1051, 1052, 1053, 1054, 1055, 1056, 1057, 1058, 1059, 1060, 1061, 1062, 1063, 1064, 1065, 1066, 1067, 1068, 1069, 1070, 1071, 1072, 1073, 1074, 1075, 1076, 1077, 1078, 1079, 1080, 1081, 1082, 1083, 1084, 1085, 1086, 1087, 1088, 1089, 1090, 1091, 1092, 1093, 1094, 1095, 1096, 1097, 1098, 1099, 1100, 1101, 1102, 1103, 1104, 1105, 1106, 1107, 1108, 1109, 1110, 1111, 1112, 1113, 1114, 1115, 1116, 1117, 1118, 1119, 1138, 1139, 1168, 1169, 7808, 7809, 7810, 7811, 7812, 7813, 7922, 7923, 8208, 8209, 8211, 8212, 8213, 8215, 8216, 8217, 8218, 8219, 8220, 8221, 8222, 8224, 8225, 8226, 8230, 8240, 8242, 8243, 8249, 8250, 8252, 8254, 8260, 8319, 8355, 8356, 8359, 8364, 8453, 8467, 8470, 8482, 8486, 8494, 8539, 8540, 8541, 8542, 8592, 8593, 8594, 8595, 8596, 8597, 8616, 8706, 8710, 8719, 8721, 8722, 8730, 8734, 8735, 8745, 8747, 8776, 8800, 8801, 8804, 8805, 8962, 8976, 8992, 8993, 9472, 9474, 9484, 9488, 9492, 9496, 9500, 9508, 9516, 9524, 9532, 9552, 9553, 9554, 9555, 9556, 9557, 9558, 9559, 9560, 9561, 9562, 9563, 9564, 9565, 9566, 9567, 9568, 9569, 9570, 9571, 9572, 9573, 9574, 9575, 9576, 9577, 9578, 9579, 9580, 9600, 9604, 9608, 9612, 9616, 9617, 9618, 9619, 9632, 9633, 9642, 9643, 9644, 9650, 9658, 9660, 9668, 9674, 9675, 9679, 9688, 9689, 9702, 9786, 9787, 9788, 9792, 9794, 9824, 9827, 9829, 9830, 9834, 9835, 9836, 61441, 61442, 61445, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1];
31190const LiberationSansItalicWidths = [365, 0, 333, 278, 278, 355, 556, 556, 889, 667, 191, 333, 333, 389, 584, 278, 333, 278, 278, 556, 556, 556, 556, 556, 556, 556, 556, 556, 556, 278, 278, 584, 584, 584, 556, 1015, 667, 667, 722, 722, 667, 611, 778, 722, 278, 500, 667, 556, 833, 722, 778, 667, 778, 722, 667, 611, 722, 667, 944, 667, 667, 611, 278, 278, 278, 469, 556, 333, 556, 556, 500, 556, 556, 278, 556, 556, 222, 222, 500, 222, 833, 556, 556, 556, 556, 333, 500, 278, 556, 500, 722, 500, 500, 500, 334, 260, 334, 584, 333, 556, 556, 556, 556, 260, 556, 333, 737, 370, 556, 584, 737, 552, 400, 549, 333, 333, 333, 576, 537, 278, 333, 333, 365, 556, 834, 834, 834, 611, 667, 667, 667, 667, 667, 667, 1000, 722, 667, 667, 667, 667, 278, 278, 278, 278, 722, 722, 778, 778, 778, 778, 778, 584, 778, 722, 722, 722, 722, 667, 667, 611, 556, 556, 556, 556, 556, 556, 889, 500, 556, 556, 556, 556, 278, 278, 278, 278, 556, 556, 556, 556, 556, 556, 556, 549, 611, 556, 556, 556, 556, 500, 556, 500, 667, 556, 667, 556, 667, 556, 722, 500, 722, 500, 722, 500, 722, 500, 722, 625, 722, 556, 667, 556, 667, 556, 667, 556, 667, 556, 667, 556, 778, 556, 778, 556, 778, 556, 778, 556, 722, 556, 722, 556, 278, 278, 278, 278, 278, 278, 278, 222, 278, 278, 733, 444, 500, 222, 667, 500, 500, 556, 222, 556, 222, 556, 281, 556, 400, 556, 222, 722, 556, 722, 556, 722, 556, 615, 723, 556, 778, 556, 778, 556, 778, 556, 1000, 944, 722, 333, 722, 333, 722, 333, 667, 500, 667, 500, 667, 500, 667, 500, 611, 278, 611, 354, 611, 278, 722, 556, 722, 556, 722, 556, 722, 556, 722, 556, 722, 556, 944, 722, 667, 500, 667, 611, 500, 611, 500, 611, 500, 222, 556, 667, 556, 1000, 889, 778, 611, 667, 500, 611, 278, 333, 333, 333, 333, 333, 333, 333, 333, 333, 333, 333, 667, 278, 789, 846, 389, 794, 865, 775, 222, 667, 667, 570, 671, 667, 611, 722, 778, 278, 667, 667, 833, 722, 648, 778, 725, 667, 600, 611, 667, 837, 667, 831, 761, 278, 667, 570, 439, 555, 222, 550, 570, 571, 500, 556, 439, 463, 555, 542, 222, 500, 492, 548, 500, 447, 556, 670, 573, 486, 603, 374, 550, 652, 546, 728, 779, 222, 550, 556, 550, 779, 667, 667, 843, 544, 708, 667, 278, 278, 500, 1066, 982, 844, 589, 715, 639, 724, 667, 651, 667, 544, 704, 667, 917, 614, 715, 715, 589, 686, 833, 722, 778, 725, 667, 722, 611, 639, 795, 667, 727, 673, 920, 923, 805, 886, 651, 694, 1022, 682, 556, 562, 522, 493, 553, 556, 688, 465, 556, 556, 472, 564, 686, 550, 556, 556, 556, 500, 833, 500, 835, 500, 572, 518, 830, 851, 621, 736, 526, 492, 752, 534, 556, 556, 556, 378, 496, 500, 222, 222, 222, 910, 828, 556, 472, 565, 500, 556, 778, 556, 492, 339, 944, 722, 944, 722, 944, 722, 667, 500, 333, 333, 556, 1000, 1000, 552, 222, 222, 222, 222, 333, 333, 333, 556, 556, 350, 1000, 1000, 188, 354, 333, 333, 500, 333, 167, 365, 556, 556, 1094, 556, 885, 323, 1083, 1000, 768, 600, 834, 834, 834, 834, 1000, 500, 998, 500, 1000, 500, 500, 494, 612, 823, 713, 584, 549, 713, 979, 719, 274, 549, 549, 584, 549, 549, 604, 584, 604, 604, 708, 625, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 729, 604, 604, 354, 354, 1000, 990, 990, 990, 990, 494, 604, 604, 604, 604, 354, 1021, 1052, 917, 750, 750, 531, 656, 594, 510, 500, 750, 750, 500, 500, 333, 333, 333, 333, 333, 333, 333, 333, 222, 222, 294, 294, 324, 324, 316, 328, 398, 285];
31191const LiberationSansItalicMapping = [-1, -1, -1, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, 123, 124, 125, 126, 161, 162, 163, 164, 165, 166, 167, 168, 169, 170, 171, 172, 174, 175, 176, 177, 178, 179, 180, 181, 182, 183, 184, 185, 186, 187, 188, 189, 190, 191, 192, 193, 194, 195, 196, 197, 198, 199, 200, 201, 202, 203, 204, 205, 206, 207, 208, 209, 210, 211, 212, 213, 214, 215, 216, 217, 218, 219, 220, 221, 222, 223, 224, 225, 226, 227, 228, 229, 230, 231, 232, 233, 234, 235, 236, 237, 238, 239, 240, 241, 242, 243, 244, 245, 246, 247, 248, 249, 250, 251, 252, 253, 254, 255, 256, 257, 258, 259, 260, 261, 262, 263, 264, 265, 266, 267, 268, 269, 270, 271, 272, 273, 274, 275, 276, 277, 278, 279, 280, 281, 282, 283, 284, 285, 286, 287, 288, 289, 290, 291, 292, 293, 294, 295, 296, 297, 298, 299, 300, 301, 302, 303, 304, 305, 306, 307, 308, 309, 310, 311, 312, 313, 314, 315, 316, 317, 318, 319, 320, 321, 322, 323, 324, 325, 326, 327, 328, 329, 330, 331, 332, 333, 334, 335, 336, 337, 338, 339, 340, 341, 342, 343, 344, 345, 346, 347, 348, 349, 350, 351, 352, 353, 354, 355, 356, 357, 358, 359, 360, 361, 362, 363, 364, 365, 366, 367, 368, 369, 370, 371, 372, 373, 374, 375, 376, 377, 378, 379, 380, 381, 382, 383, 402, 506, 507, 508, 509, 510, 511, 536, 537, 538, 539, 710, 711, 713, 728, 729, 730, 731, 732, 733, 900, 901, 902, 903, 904, 905, 906, 908, 910, 911, 912, 913, 914, 915, 916, 917, 918, 919, 920, 921, 922, 923, 924, 925, 926, 927, 928, 929, 931, 932, 933, 934, 935, 936, 937, 938, 939, 940, 941, 942, 943, 944, 945, 946, 947, 948, 949, 950, 951, 952, 953, 954, 955, 956, 957, 958, 959, 960, 961, 962, 963, 964, 965, 966, 967, 968, 969, 970, 971, 972, 973, 974, 1024, 1025, 1026, 1027, 1028, 1029, 1030, 1031, 1032, 1033, 1034, 1035, 1036, 1037, 1038, 1039, 1040, 1041, 1042, 1043, 1044, 1045, 1046, 1047, 1048, 1049, 1050, 1051, 1052, 1053, 1054, 1055, 1056, 1057, 1058, 1059, 1060, 1061, 1062, 1063, 1064, 1065, 1066, 1067, 1068, 1069, 1070, 1071, 1072, 1073, 1074, 1075, 1076, 1077, 1078, 1079, 1080, 1081, 1082, 1083, 1084, 1085, 1086, 1087, 1088, 1089, 1090, 1091, 1092, 1093, 1094, 1095, 1096, 1097, 1098, 1099, 1100, 1101, 1102, 1103, 1104, 1105, 1106, 1107, 1108, 1109, 1110, 1111, 1112, 1113, 1114, 1115, 1116, 1117, 1118, 1119, 1138, 1139, 1168, 1169, 7808, 7809, 7810, 7811, 7812, 7813, 7922, 7923, 8208, 8209, 8211, 8212, 8213, 8215, 8216, 8217, 8218, 8219, 8220, 8221, 8222, 8224, 8225, 8226, 8230, 8240, 8242, 8243, 8249, 8250, 8252, 8254, 8260, 8319, 8355, 8356, 8359, 8364, 8453, 8467, 8470, 8482, 8486, 8494, 8539, 8540, 8541, 8542, 8592, 8593, 8594, 8595, 8596, 8597, 8616, 8706, 8710, 8719, 8721, 8722, 8730, 8734, 8735, 8745, 8747, 8776, 8800, 8801, 8804, 8805, 8962, 8976, 8992, 8993, 9472, 9474, 9484, 9488, 9492, 9496, 9500, 9508, 9516, 9524, 9532, 9552, 9553, 9554, 9555, 9556, 9557, 9558, 9559, 9560, 9561, 9562, 9563, 9564, 9565, 9566, 9567, 9568, 9569, 9570, 9571, 9572, 9573, 9574, 9575, 9576, 9577, 9578, 9579, 9580, 9600, 9604, 9608, 9612, 9616, 9617, 9618, 9619, 9632, 9633, 9642, 9643, 9644, 9650, 9658, 9660, 9668, 9674, 9675, 9679, 9688, 9689, 9702, 9786, 9787, 9788, 9792, 9794, 9824, 9827, 9829, 9830, 9834, 9835, 9836, 61441, 61442, 61445, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1];
31192const LiberationSansRegularWidths = [365, 0, 333, 278, 278, 355, 556, 556, 889, 667, 191, 333, 333, 389, 584, 278, 333, 278, 278, 556, 556, 556, 556, 556, 556, 556, 556, 556, 556, 278, 278, 584, 584, 584, 556, 1015, 667, 667, 722, 722, 667, 611, 778, 722, 278, 500, 667, 556, 833, 722, 778, 667, 778, 722, 667, 611, 722, 667, 944, 667, 667, 611, 278, 278, 278, 469, 556, 333, 556, 556, 500, 556, 556, 278, 556, 556, 222, 222, 500, 222, 833, 556, 556, 556, 556, 333, 500, 278, 556, 500, 722, 500, 500, 500, 334, 260, 334, 584, 333, 556, 556, 556, 556, 260, 556, 333, 737, 370, 556, 584, 737, 552, 400, 549, 333, 333, 333, 576, 537, 278, 333, 333, 365, 556, 834, 834, 834, 611, 667, 667, 667, 667, 667, 667, 1000, 722, 667, 667, 667, 667, 278, 278, 278, 278, 722, 722, 778, 778, 778, 778, 778, 584, 778, 722, 722, 722, 722, 667, 667, 611, 556, 556, 556, 556, 556, 556, 889, 500, 556, 556, 556, 556, 278, 278, 278, 278, 556, 556, 556, 556, 556, 556, 556, 549, 611, 556, 556, 556, 556, 500, 556, 500, 667, 556, 667, 556, 667, 556, 722, 500, 722, 500, 722, 500, 722, 500, 722, 615, 722, 556, 667, 556, 667, 556, 667, 556, 667, 556, 667, 556, 778, 556, 778, 556, 778, 556, 778, 556, 722, 556, 722, 556, 278, 278, 278, 278, 278, 278, 278, 222, 278, 278, 735, 444, 500, 222, 667, 500, 500, 556, 222, 556, 222, 556, 292, 556, 334, 556, 222, 722, 556, 722, 556, 722, 556, 604, 723, 556, 778, 556, 778, 556, 778, 556, 1000, 944, 722, 333, 722, 333, 722, 333, 667, 500, 667, 500, 667, 500, 667, 500, 611, 278, 611, 375, 611, 278, 722, 556, 722, 556, 722, 556, 722, 556, 722, 556, 722, 556, 944, 722, 667, 500, 667, 611, 500, 611, 500, 611, 500, 222, 556, 667, 556, 1000, 889, 778, 611, 667, 500, 611, 278, 333, 333, 333, 333, 333, 333, 333, 333, 333, 333, 333, 667, 278, 784, 838, 384, 774, 855, 752, 222, 667, 667, 551, 668, 667, 611, 722, 778, 278, 667, 668, 833, 722, 650, 778, 722, 667, 618, 611, 667, 798, 667, 835, 748, 278, 667, 578, 446, 556, 222, 547, 578, 575, 500, 557, 446, 441, 556, 556, 222, 500, 500, 576, 500, 448, 556, 690, 569, 482, 617, 395, 547, 648, 525, 713, 781, 222, 547, 556, 547, 781, 667, 667, 865, 542, 719, 667, 278, 278, 500, 1057, 1010, 854, 583, 722, 635, 719, 667, 656, 667, 542, 677, 667, 923, 604, 719, 719, 583, 656, 833, 722, 778, 719, 667, 722, 611, 635, 760, 667, 740, 667, 917, 938, 792, 885, 656, 719, 1010, 722, 556, 573, 531, 365, 583, 556, 669, 458, 559, 559, 438, 583, 688, 552, 556, 542, 556, 500, 458, 500, 823, 500, 573, 521, 802, 823, 625, 719, 521, 510, 750, 542, 556, 556, 556, 365, 510, 500, 222, 278, 222, 906, 812, 556, 438, 559, 500, 552, 778, 556, 489, 411, 944, 722, 944, 722, 944, 722, 667, 500, 333, 333, 556, 1000, 1000, 552, 222, 222, 222, 222, 333, 333, 333, 556, 556, 350, 1000, 1000, 188, 354, 333, 333, 500, 333, 167, 365, 556, 556, 1094, 556, 885, 323, 1073, 1000, 768, 600, 834, 834, 834, 834, 1000, 500, 1000, 500, 1000, 500, 500, 494, 612, 823, 713, 584, 549, 713, 979, 719, 274, 549, 549, 583, 549, 549, 604, 584, 604, 604, 708, 625, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 729, 604, 604, 354, 354, 1000, 990, 990, 990, 990, 494, 604, 604, 604, 604, 354, 1021, 1052, 917, 750, 750, 531, 656, 594, 510, 500, 750, 750, 500, 500, 333, 333, 333, 333, 333, 333, 333, 333, 222, 222, 294, 294, 324, 324, 316, 328, 398, 285];
31193const LiberationSansRegularMapping = [-1, -1, -1, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, 123, 124, 125, 126, 161, 162, 163, 164, 165, 166, 167, 168, 169, 170, 171, 172, 174, 175, 176, 177, 178, 179, 180, 181, 182, 183, 184, 185, 186, 187, 188, 189, 190, 191, 192, 193, 194, 195, 196, 197, 198, 199, 200, 201, 202, 203, 204, 205, 206, 207, 208, 209, 210, 211, 212, 213, 214, 215, 216, 217, 218, 219, 220, 221, 222, 223, 224, 225, 226, 227, 228, 229, 230, 231, 232, 233, 234, 235, 236, 237, 238, 239, 240, 241, 242, 243, 244, 245, 246, 247, 248, 249, 250, 251, 252, 253, 254, 255, 256, 257, 258, 259, 260, 261, 262, 263, 264, 265, 266, 267, 268, 269, 270, 271, 272, 273, 274, 275, 276, 277, 278, 279, 280, 281, 282, 283, 284, 285, 286, 287, 288, 289, 290, 291, 292, 293, 294, 295, 296, 297, 298, 299, 300, 301, 302, 303, 304, 305, 306, 307, 308, 309, 310, 311, 312, 313, 314, 315, 316, 317, 318, 319, 320, 321, 322, 323, 324, 325, 326, 327, 328, 329, 330, 331, 332, 333, 334, 335, 336, 337, 338, 339, 340, 341, 342, 343, 344, 345, 346, 347, 348, 349, 350, 351, 352, 353, 354, 355, 356, 357, 358, 359, 360, 361, 362, 363, 364, 365, 366, 367, 368, 369, 370, 371, 372, 373, 374, 375, 376, 377, 378, 379, 380, 381, 382, 383, 402, 506, 507, 508, 509, 510, 511, 536, 537, 538, 539, 710, 711, 713, 728, 729, 730, 731, 732, 733, 900, 901, 902, 903, 904, 905, 906, 908, 910, 911, 912, 913, 914, 915, 916, 917, 918, 919, 920, 921, 922, 923, 924, 925, 926, 927, 928, 929, 931, 932, 933, 934, 935, 936, 937, 938, 939, 940, 941, 942, 943, 944, 945, 946, 947, 948, 949, 950, 951, 952, 953, 954, 955, 956, 957, 958, 959, 960, 961, 962, 963, 964, 965, 966, 967, 968, 969, 970, 971, 972, 973, 974, 1024, 1025, 1026, 1027, 1028, 1029, 1030, 1031, 1032, 1033, 1034, 1035, 1036, 1037, 1038, 1039, 1040, 1041, 1042, 1043, 1044, 1045, 1046, 1047, 1048, 1049, 1050, 1051, 1052, 1053, 1054, 1055, 1056, 1057, 1058, 1059, 1060, 1061, 1062, 1063, 1064, 1065, 1066, 1067, 1068, 1069, 1070, 1071, 1072, 1073, 1074, 1075, 1076, 1077, 1078, 1079, 1080, 1081, 1082, 1083, 1084, 1085, 1086, 1087, 1088, 1089, 1090, 1091, 1092, 1093, 1094, 1095, 1096, 1097, 1098, 1099, 1100, 1101, 1102, 1103, 1104, 1105, 1106, 1107, 1108, 1109, 1110, 1111, 1112, 1113, 1114, 1115, 1116, 1117, 1118, 1119, 1138, 1139, 1168, 1169, 7808, 7809, 7810, 7811, 7812, 7813, 7922, 7923, 8208, 8209, 8211, 8212, 8213, 8215, 8216, 8217, 8218, 8219, 8220, 8221, 8222, 8224, 8225, 8226, 8230, 8240, 8242, 8243, 8249, 8250, 8252, 8254, 8260, 8319, 8355, 8356, 8359, 8364, 8453, 8467, 8470, 8482, 8486, 8494, 8539, 8540, 8541, 8542, 8592, 8593, 8594, 8595, 8596, 8597, 8616, 8706, 8710, 8719, 8721, 8722, 8730, 8734, 8735, 8745, 8747, 8776, 8800, 8801, 8804, 8805, 8962, 8976, 8992, 8993, 9472, 9474, 9484, 9488, 9492, 9496, 9500, 9508, 9516, 9524, 9532, 9552, 9553, 9554, 9555, 9556, 9557, 9558, 9559, 9560, 9561, 9562, 9563, 9564, 9565, 9566, 9567, 9568, 9569, 9570, 9571, 9572, 9573, 9574, 9575, 9576, 9577, 9578, 9579, 9580, 9600, 9604, 9608, 9612, 9616, 9617, 9618, 9619, 9632, 9633, 9642, 9643, 9644, 9650, 9658, 9660, 9668, 9674, 9675, 9679, 9688, 9689, 9702, 9786, 9787, 9788, 9792, 9794, 9824, 9827, 9829, 9830, 9834, 9835, 9836, 61441, 61442, 61445, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1];
31194
31195;// ./src/core/myriadpro_factors.js
31196const MyriadProBoldFactors = [1.36898, 1, 1, 0.72706, 0.80479, 0.83734, 0.98894, 0.99793, 0.9897, 0.93884, 0.86209, 0.94292, 0.94292, 1.16661, 1.02058, 0.93582, 0.96694, 0.93582, 1.19137, 0.99793, 0.99793, 0.99793, 0.99793, 0.99793, 0.99793, 0.99793, 0.99793, 0.99793, 0.99793, 0.78076, 0.78076, 1.02058, 1.02058, 1.02058, 0.72851, 0.78966, 0.90838, 0.83637, 0.82391, 0.96376, 0.80061, 0.86275, 0.8768, 0.95407, 1.0258, 0.73901, 0.85022, 0.83655, 1.0156, 0.95546, 0.92179, 0.87107, 0.92179, 0.82114, 0.8096, 0.89713, 0.94438, 0.95353, 0.94083, 0.91905, 0.90406, 0.9446, 0.94292, 1.18777, 0.94292, 1.02058, 0.89903, 0.90088, 0.94938, 0.97898, 0.81093, 0.97571, 0.94938, 1.024, 0.9577, 0.95933, 0.98621, 1.0474, 0.97455, 0.98981, 0.9672, 0.95933, 0.9446, 0.97898, 0.97407, 0.97646, 0.78036, 1.10208, 0.95442, 0.95298, 0.97579, 0.9332, 0.94039, 0.938, 0.80687, 1.01149, 0.80687, 1.02058, 0.80479, 0.99793, 0.99793, 0.99793, 0.99793, 1.01149, 1.00872, 0.90088, 0.91882, 1.0213, 0.8361, 1.02058, 0.62295, 0.54324, 0.89022, 1.08595, 1, 1, 0.90088, 1, 0.97455, 0.93582, 0.90088, 1, 1.05686, 0.8361, 0.99642, 0.99642, 0.99642, 0.72851, 0.90838, 0.90838, 0.90838, 0.90838, 0.90838, 0.90838, 0.868, 0.82391, 0.80061, 0.80061, 0.80061, 0.80061, 1.0258, 1.0258, 1.0258, 1.0258, 0.97484, 0.95546, 0.92179, 0.92179, 0.92179, 0.92179, 0.92179, 1.02058, 0.92179, 0.94438, 0.94438, 0.94438, 0.94438, 0.90406, 0.86958, 0.98225, 0.94938, 0.94938, 0.94938, 0.94938, 0.94938, 0.94938, 0.9031, 0.81093, 0.94938, 0.94938, 0.94938, 0.94938, 0.98621, 0.98621, 0.98621, 0.98621, 0.93969, 0.95933, 0.9446, 0.9446, 0.9446, 0.9446, 0.9446, 1.08595, 0.9446, 0.95442, 0.95442, 0.95442, 0.95442, 0.94039, 0.97898, 0.94039, 0.90838, 0.94938, 0.90838, 0.94938, 0.90838, 0.94938, 0.82391, 0.81093, 0.82391, 0.81093, 0.82391, 0.81093, 0.82391, 0.81093, 0.96376, 0.84313, 0.97484, 0.97571, 0.80061, 0.94938, 0.80061, 0.94938, 0.80061, 0.94938, 0.80061, 0.94938, 0.80061, 0.94938, 0.8768, 0.9577, 0.8768, 0.9577, 0.8768, 0.9577, 1, 1, 0.95407, 0.95933, 0.97069, 0.95933, 1.0258, 0.98621, 1.0258, 0.98621, 1.0258, 0.98621, 1.0258, 0.98621, 1.0258, 0.98621, 0.887, 1.01591, 0.73901, 1.0474, 1, 1, 0.97455, 0.83655, 0.98981, 1, 1, 0.83655, 0.73977, 0.83655, 0.73903, 0.84638, 1.033, 0.95546, 0.95933, 1, 1, 0.95546, 0.95933, 0.8271, 0.95417, 0.95933, 0.92179, 0.9446, 0.92179, 0.9446, 0.92179, 0.9446, 0.936, 0.91964, 0.82114, 0.97646, 1, 1, 0.82114, 0.97646, 0.8096, 0.78036, 0.8096, 0.78036, 1, 1, 0.8096, 0.78036, 1, 1, 0.89713, 0.77452, 0.89713, 1.10208, 0.94438, 0.95442, 0.94438, 0.95442, 0.94438, 0.95442, 0.94438, 0.95442, 0.94438, 0.95442, 0.94438, 0.95442, 0.94083, 0.97579, 0.90406, 0.94039, 0.90406, 0.9446, 0.938, 0.9446, 0.938, 0.9446, 0.938, 1, 0.99793, 0.90838, 0.94938, 0.868, 0.9031, 0.92179, 0.9446, 1, 1, 0.89713, 1.10208, 0.90088, 0.90088, 0.90088, 0.90088, 0.90088, 0.90088, 0.90088, 0.90088, 0.90088, 0.90989, 0.9358, 0.91945, 0.83181, 0.75261, 0.87992, 0.82976, 0.96034, 0.83689, 0.97268, 1.0078, 0.90838, 0.83637, 0.8019, 0.90157, 0.80061, 0.9446, 0.95407, 0.92436, 1.0258, 0.85022, 0.97153, 1.0156, 0.95546, 0.89192, 0.92179, 0.92361, 0.87107, 0.96318, 0.89713, 0.93704, 0.95638, 0.91905, 0.91709, 0.92796, 1.0258, 0.93704, 0.94836, 1.0373, 0.95933, 1.0078, 0.95871, 0.94836, 0.96174, 0.92601, 0.9498, 0.98607, 0.95776, 0.95933, 1.05453, 1.0078, 0.98275, 0.9314, 0.95617, 0.91701, 1.05993, 0.9446, 0.78367, 0.9553, 1, 0.86832, 1.0128, 0.95871, 0.99394, 0.87548, 0.96361, 0.86774, 1.0078, 0.95871, 0.9446, 0.95871, 0.86774, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0.94083, 0.97579, 0.94083, 0.97579, 0.94083, 0.97579, 0.90406, 0.94039, 0.96694, 1, 0.89903, 1, 1, 1, 0.93582, 0.93582, 0.93582, 1, 0.908, 0.908, 0.918, 0.94219, 0.94219, 0.96544, 1, 1.285, 1, 1, 0.81079, 0.81079, 1, 1, 0.74854, 1, 1, 1, 1, 0.99793, 1, 1, 1, 0.65, 1, 1.36145, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1.17173, 1, 0.80535, 0.76169, 1.02058, 1.0732, 1.05486, 1, 1, 1.30692, 1.08595, 1.08595, 1, 1.08595, 1.08595, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1.16161, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1];
31197const MyriadProBoldMetrics = {
31198	lineHeight: 1.2,
31199	
vendor: 4,628 bytes, lines 31199-31202
31199lineGap: 0.2
31200};
31201const MyriadProBoldItalicFactors = [1.36898, 1, 1, 0.66227, 0.80779, 0.81625, 0.97276, 0.97276, 0.97733, 0.92222, 0.83266, 0.94292, 0.94292, 1.16148, 1.02058, 0.93582, 0.96694, 0.93582, 1.17337, 0.97276, 0.97276, 0.97276, 0.97276, 0.97276, 0.97276, 0.97276, 0.97276, 0.97276, 0.97276, 0.78076, 0.78076, 1.02058, 1.02058, 1.02058, 0.71541, 0.76813, 0.85576, 0.80591, 0.80729, 0.94299, 0.77512, 0.83655, 0.86523, 0.92222, 0.98621, 0.71743, 0.81698, 0.79726, 0.98558, 0.92222, 0.90637, 0.83809, 0.90637, 0.80729, 0.76463, 0.86275, 0.90699, 0.91605, 0.9154, 0.85308, 0.85458, 0.90531, 0.94292, 1.21296, 0.94292, 1.02058, 0.89903, 1.18616, 0.99613, 0.91677, 0.78216, 0.91677, 0.90083, 0.98796, 0.9135, 0.92168, 0.95381, 0.98981, 0.95298, 0.95381, 0.93459, 0.92168, 0.91513, 0.92004, 0.91677, 0.95077, 0.748, 1.04502, 0.91677, 0.92061, 0.94236, 0.89544, 0.89364, 0.9, 0.80687, 0.8578, 0.80687, 1.02058, 0.80779, 0.97276, 0.97276, 0.97276, 0.97276, 0.8578, 0.99973, 1.18616, 0.91339, 1.08074, 0.82891, 1.02058, 0.55509, 0.71526, 0.89022, 1.08595, 1, 1, 1.18616, 1, 0.96736, 0.93582, 1.18616, 1, 1.04864, 0.82711, 0.99043, 0.99043, 0.99043, 0.71541, 0.85576, 0.85576, 0.85576, 0.85576, 0.85576, 0.85576, 0.845, 0.80729, 0.77512, 0.77512, 0.77512, 0.77512, 0.98621, 0.98621, 0.98621, 0.98621, 0.95961, 0.92222, 0.90637, 0.90637, 0.90637, 0.90637, 0.90637, 1.02058, 0.90251, 0.90699, 0.90699, 0.90699, 0.90699, 0.85458, 0.83659, 0.94951, 0.99613, 0.99613, 0.99613, 0.99613, 0.99613, 0.99613, 0.85811, 0.78216, 0.90083, 0.90083, 0.90083, 0.90083, 0.95381, 0.95381, 0.95381, 0.95381, 0.9135, 0.92168, 0.91513, 0.91513, 0.91513, 0.91513, 0.91513, 1.08595, 0.91677, 0.91677, 0.91677, 0.91677, 0.91677, 0.89364, 0.92332, 0.89364, 0.85576, 0.99613, 0.85576, 0.99613, 0.85576, 0.99613, 0.80729, 0.78216, 0.80729, 0.78216, 0.80729, 0.78216, 0.80729, 0.78216, 0.94299, 0.76783, 0.95961, 0.91677, 0.77512, 0.90083, 0.77512, 0.90083, 0.77512, 0.90083, 0.77512, 0.90083, 0.77512, 0.90083, 0.86523, 0.9135, 0.86523, 0.9135, 0.86523, 0.9135, 1, 1, 0.92222, 0.92168, 0.92222, 0.92168, 0.98621, 0.95381, 0.98621, 0.95381, 0.98621, 0.95381, 0.98621, 0.95381, 0.98621, 0.95381, 0.86036, 0.97096, 0.71743, 0.98981, 1, 1, 0.95298, 0.79726, 0.95381, 1, 1, 0.79726, 0.6894, 0.79726, 0.74321, 0.81691, 1.0006, 0.92222, 0.92168, 1, 1, 0.92222, 0.92168, 0.79464, 0.92098, 0.92168, 0.90637, 0.91513, 0.90637, 0.91513, 0.90637, 0.91513, 0.909, 0.87514, 0.80729, 0.95077, 1, 1, 0.80729, 0.95077, 0.76463, 0.748, 0.76463, 0.748, 1, 1, 0.76463, 0.748, 1, 1, 0.86275, 0.72651, 0.86275, 1.04502, 0.90699, 0.91677, 0.90699, 0.91677, 0.90699, 0.91677, 0.90699, 0.91677, 0.90699, 0.91677, 0.90699, 0.91677, 0.9154, 0.94236, 0.85458, 0.89364, 0.85458, 0.90531, 0.9, 0.90531, 0.9, 0.90531, 0.9, 1, 0.97276, 0.85576, 0.99613, 0.845, 0.85811, 0.90251, 0.91677, 1, 1, 0.86275, 1.04502, 1.18616, 1.18616, 1.18616, 1.18616, 1.18616, 1.18616, 1.18616, 1.18616, 1.18616, 1.00899, 1.30628, 0.85576, 0.80178, 0.66862, 0.7927, 0.69323, 0.88127, 0.72459, 0.89711, 0.95381, 0.85576, 0.80591, 0.7805, 0.94729, 0.77512, 0.90531, 0.92222, 0.90637, 0.98621, 0.81698, 0.92655, 0.98558, 0.92222, 0.85359, 0.90637, 0.90976, 0.83809, 0.94523, 0.86275, 0.83509, 0.93157, 0.85308, 0.83392, 0.92346, 0.98621, 0.83509, 0.92886, 0.91324, 0.92168, 0.95381, 0.90646, 0.92886, 0.90557, 0.86847, 0.90276, 0.91324, 0.86842, 0.92168, 0.99531, 0.95381, 0.9224, 0.85408, 0.92699, 0.86847, 1.0051, 0.91513, 0.80487, 0.93481, 1, 0.88159, 1.05214, 0.90646, 0.97355, 0.81539, 0.89398, 0.85923, 0.95381, 0.90646, 0.91513, 0.90646, 0.85923, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0.9154, 0.94236, 0.9154, 0.94236, 0.9154, 0.94236, 0.85458, 0.89364, 0.96694, 1, 0.89903, 1, 1, 1, 0.91782, 0.91782, 0.91782, 1, 0.896, 0.896, 0.896, 0.9332, 0.9332, 0.95973, 1, 1.26, 1, 1, 0.80479, 0.80178, 1, 1, 0.85633, 1, 1, 1, 1, 0.97276, 1, 1, 1, 0.698, 1, 1.36145, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1.14542, 1, 0.79199, 0.78694, 1.02058, 1.03493, 1.05486, 1, 1, 1.23026, 1.08595, 1.08595, 1, 1.08595, 1.08595, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1.20006, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1];
31202const MyriadProBoldItalicMetrics = {
31203	lineHeight: 1.2,
31204	lineGap: 0.2
31205};
31206const MyriadProItalicFactors = [1.36898, 1, 1, 0.65507, 0.84943, 0.85639, 0.88465, 0.88465, 0.86936, 0.88307, 0.86948, 0.85283, 0.85283, 1.06383, 1.02058, 0.75945, 0.9219, 0.75945, 1.17337, 0.88465, 0.88465, 0.88465, 0.88465, 0.88465, 0.88465, 0.88465, 0.88465, 0.88465, 0.88465, 0.75945, 0.75945, 1.02058, 1.02058, 1.02058, 0.69046, 0.70926, 0.85158, 0.77812, 0.76852, 0.89591, 0.70466, 0.76125, 0.80094, 0.86822, 0.83864, 0.728, 0.77212, 0.79475, 0.93637, 0.87514, 0.8588, 0.76013, 0.8588, 0.72421, 0.69866, 0.77598, 0.85991, 0.80811, 0.87832, 0.78112, 0.77512, 0.8562, 1.0222, 1.18417, 1.0222, 1.27014, 0.89903, 1.15012, 0.93859, 0.94399, 0.846, 0.94399, 0.81453, 1.0186, 0.94219, 0.96017, 1.03075, 1.02175, 0.912, 1.03075, 0.96998, 0.96017, 0.93859, 0.94399, 0.94399, 0.95493, 0.746, 1.12658, 0.94578, 0.91, 0.979, 0.882, 0.882, 0.83, 0.85034, 0.83537, 0.85034, 1.02058, 0.70869, 0.88465, 0.88465, 0.88465, 0.88465, 0.83537, 0.90083, 1.15012, 0.9161, 0.94565, 0.73541, 1.02058, 0.53609, 0.69353, 0.79519, 1.08595, 1, 1, 1.15012, 1, 0.91974, 0.75945, 1.15012, 1, 0.9446, 0.73361, 0.9005, 0.9005, 0.9005, 0.62864, 0.85158, 0.85158, 0.85158, 0.85158, 0.85158, 0.85158, 0.773, 0.76852, 0.70466, 0.70466, 0.70466, 0.70466, 0.83864, 0.83864, 0.83864, 0.83864, 0.90561, 0.87514, 0.8588, 0.8588, 0.8588, 0.8588, 0.8588, 1.02058, 0.85751, 0.85991, 0.85991, 0.85991, 0.85991, 0.77512, 0.76013, 0.88075, 0.93859, 0.93859, 0.93859, 0.93859, 0.93859, 0.93859, 0.8075, 0.846, 0.81453, 0.81453, 0.81453, 0.81453, 0.82424, 0.82424, 0.82424, 0.82424, 0.9278, 0.96017, 0.93859, 0.93859, 0.93859, 0.93859, 0.93859, 1.08595, 0.8562, 0.94578, 0.94578, 0.94578, 0.94578, 0.882, 0.94578, 0.882, 0.85158, 0.93859, 0.85158, 0.93859, 0.85158, 0.93859, 0.76852, 0.846, 0.76852, 0.846, 0.76852, 0.846, 0.76852, 0.846, 0.89591, 0.8544, 0.90561, 0.94399, 0.70466, 0.81453, 0.70466, 0.81453, 0.70466, 0.81453, 0.70466, 0.81453, 0.70466, 0.81453, 0.80094, 0.94219, 0.80094, 0.94219, 0.80094, 0.94219, 1, 1, 0.86822, 0.96017, 0.86822, 0.96017, 0.83864, 0.82424, 0.83864, 0.82424, 0.83864, 0.82424, 0.83864, 1.03075, 0.83864, 0.82424, 0.81402, 1.02738, 0.728, 1.02175, 1, 1, 0.912, 0.79475, 1.03075, 1, 1, 0.79475, 0.83911, 0.79475, 0.66266, 0.80553, 1.06676, 0.87514, 0.96017, 1, 1, 0.87514, 0.96017, 0.86865, 0.87396, 0.96017, 0.8588, 0.93859, 0.8588, 0.93859, 0.8588, 0.93859, 0.867, 0.84759, 0.72421, 0.95493, 1, 1, 0.72421, 0.95493, 0.69866, 0.746, 0.69866, 0.746, 1, 1, 0.69866, 0.746, 1, 1, 0.77598, 0.88417, 0.77598, 1.12658, 0.85991, 0.94578, 0.85991, 0.94578, 0.85991, 0.94578, 0.85991, 0.94578, 0.85991, 0.94578, 0.85991, 0.94578, 0.87832, 0.979, 0.77512, 0.882, 0.77512, 0.8562, 0.83, 0.8562, 0.83, 0.8562, 0.83, 1, 0.88465, 0.85158, 0.93859, 0.773, 0.8075, 0.85751, 0.8562, 1, 1, 0.77598, 1.12658, 1.15012, 1.15012, 1.15012, 1.15012, 1.15012, 1.15313, 1.15012, 1.15012, 1.15012, 1.08106, 1.03901, 0.85158, 0.77025, 0.62264, 0.7646, 0.65351, 0.86026, 0.69461, 0.89947, 1.03075, 0.85158, 0.77812, 0.76449, 0.88836, 0.70466, 0.8562, 0.86822, 0.8588, 0.83864, 0.77212, 0.85308, 0.93637, 0.87514, 0.82352, 0.8588, 0.85701, 0.76013, 0.89058, 0.77598, 0.8156, 0.82565, 0.78112, 0.77899, 0.89386, 0.83864, 0.8156, 0.9486, 0.92388, 0.96186, 1.03075, 0.91123, 0.9486, 0.93298, 0.878, 0.93942, 0.92388, 0.84596, 0.96186, 0.95119, 1.03075, 0.922, 0.88787, 0.95829, 0.88, 0.93559, 0.93859, 0.78815, 0.93758, 1, 0.89217, 1.03737, 0.91123, 0.93969, 0.77487, 0.85769, 0.86799, 1.03075, 0.91123, 0.93859, 0.91123, 0.86799, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0.87832, 0.979, 0.87832, 0.979, 0.87832, 0.979, 0.77512, 0.882, 0.9219, 1, 0.89903, 1, 1, 1, 0.87321, 0.87321, 0.87321, 1, 1.027, 1.027, 1.027, 0.86847, 0.86847, 0.79121, 1, 1.124, 1, 1, 0.73572, 0.73572, 1, 1, 0.85034, 1, 1, 1, 1, 0.88465, 1, 1, 1, 0.669, 1, 1.36145, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1.04828, 1, 0.74948, 0.75187, 1.02058, 0.98391, 1.02119, 1, 1, 1.06233, 1.08595, 1.08595, 1, 1.08595, 1.08595, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1.05233, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1];
31207const MyriadProItalicMetrics = {
31208	lineHeight: 1.2,
31209	lineGap: 0.2
31210};
31211const MyriadProRegularFactors = [1.36898, 1, 1, 0.76305, 0.82784, 0.94935, 0.89364, 0.92241, 0.89073, 0.90706, 0.98472, 0.85283, 0.85283, 1.0664, 1.02058, 0.74505, 0.9219, 0.74505, 1.23456, 0.92241, 0.92241, 0.92241, 0.92241, 0.92241, 0.92241, 0.92241, 0.92241, 0.92241, 0.92241, 0.74505, 0.74505, 1.02058, 1.02058, 1.02058, 0.73002, 0.72601, 0.91755, 0.8126, 0.80314, 0.92222, 0.73764, 0.79726, 0.83051, 0.90284, 0.86023, 0.74, 0.8126, 0.84869, 0.96518, 0.91115, 0.8858, 0.79761, 0.8858, 0.74498, 0.73914, 0.81363, 0.89591, 0.83659, 0.89633, 0.85608, 0.8111, 0.90531, 1.0222, 1.22736, 1.0222, 1.27014, 0.89903, 0.90088, 0.86667, 1.0231, 0.896, 1.01411, 0.90083, 1.05099, 1.00512, 0.99793, 1.05326, 1.09377, 0.938, 1.06226, 1.00119, 0.99793, 0.98714, 1.0231, 1.01231, 0.98196, 0.792, 1.19137, 0.99074, 0.962, 1.01915, 0.926, 0.942, 0.856, 0.85034, 0.92006, 0.85034, 1.02058, 0.69067, 0.92241, 0.92241, 0.92241, 0.92241, 0.92006, 0.9332, 0.90088, 0.91882, 0.93484, 0.75339, 1.02058, 0.56866, 0.54324, 0.79519, 1.08595, 1, 1, 0.90088, 1, 0.95325, 0.74505, 0.90088, 1, 0.97198, 0.75339, 0.91009, 0.91009, 0.91009, 0.66466, 0.91755, 0.91755, 0.91755, 0.91755, 0.91755, 0.91755, 0.788, 0.80314, 0.73764, 0.73764, 0.73764, 0.73764, 0.86023, 0.86023, 0.86023, 0.86023, 0.92915, 0.91115, 0.8858, 0.8858, 0.8858, 0.8858, 0.8858, 1.02058, 0.8858, 0.89591, 0.89591, 0.89591, 0.89591, 0.8111, 0.79611, 0.89713, 0.86667, 0.86667, 0.86667, 0.86667, 0.86667, 0.86667, 0.86936, 0.896, 0.90083, 0.90083, 0.90083, 0.90083, 0.84224, 0.84224, 0.84224, 0.84224, 0.97276, 0.99793, 0.98714, 0.98714, 0.98714, 0.98714, 0.98714, 1.08595, 0.89876, 0.99074, 0.99074, 0.99074, 0.99074, 0.942, 1.0231, 0.942, 0.91755, 0.86667, 0.91755, 0.86667, 0.91755, 0.86667, 0.80314, 0.896, 0.80314, 0.896, 0.80314, 0.896, 0.80314, 0.896, 0.92222, 0.93372, 0.92915, 1.01411, 0.73764, 0.90083, 0.73764, 0.90083, 0.73764, 0.90083, 0.73764, 0.90083, 0.73764, 0.90083, 0.83051, 1.00512, 0.83051, 1.00512, 0.83051, 1.00512, 1, 1, 0.90284, 0.99793, 0.90976, 0.99793, 0.86023, 0.84224, 0.86023, 0.84224, 0.86023, 0.84224, 0.86023, 1.05326, 0.86023, 0.84224, 0.82873, 1.07469, 0.74, 1.09377, 1, 1, 0.938, 0.84869, 1.06226, 1, 1, 0.84869, 0.83704, 0.84869, 0.81441, 0.85588, 1.08927, 0.91115, 0.99793, 1, 1, 0.91115, 0.99793, 0.91887, 0.90991, 0.99793, 0.8858, 0.98714, 0.8858, 0.98714, 0.8858, 0.98714, 0.894, 0.91434, 0.74498, 0.98196, 1, 1, 0.74498, 0.98196, 0.73914, 0.792, 0.73914, 0.792, 1, 1, 0.73914, 0.792, 1, 1, 0.81363, 0.904, 0.81363, 1.19137, 0.89591, 0.99074, 0.89591, 0.99074, 0.89591, 0.99074, 0.89591, 0.99074, 0.89591, 0.99074, 0.89591, 0.99074, 0.89633, 1.01915, 0.8111, 0.942, 0.8111, 0.90531, 0.856, 0.90531, 0.856, 0.90531, 0.856, 1, 0.92241, 0.91755, 0.86667, 0.788, 0.86936, 0.8858, 0.89876, 1, 1, 0.81363, 1.19137, 0.90088, 0.90088, 0.90088, 0.90088, 0.90088, 0.90088, 0.90088, 0.90088, 0.90088, 0.90388, 1.03901, 0.92138, 0.78105, 0.7154, 0.86169, 0.80513, 0.94007, 0.82528, 0.98612, 1.06226, 0.91755, 0.8126, 0.81884, 0.92819, 0.73764, 0.90531, 0.90284, 0.8858, 0.86023, 0.8126, 0.91172, 0.96518, 0.91115, 0.83089, 0.8858, 0.87791, 0.79761, 0.89297, 0.81363, 0.88157, 0.89992, 0.85608, 0.81992, 0.94307, 0.86023, 0.88157, 0.95308, 0.98699, 0.99793, 1.06226, 0.95817, 0.95308, 0.97358, 0.928, 0.98088, 0.98699, 0.92761, 0.99793, 0.96017, 1.06226, 0.986, 0.944, 0.95978, 0.938, 0.96705, 0.98714, 0.80442, 0.98972, 1, 0.89762, 1.04552, 0.95817, 0.99007, 0.87064, 0.91879, 0.88888, 1.06226, 0.95817, 0.98714, 0.95817, 0.88888, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0.89633, 1.01915, 0.89633, 1.01915, 0.89633, 1.01915, 0.8111, 0.942, 0.9219, 1, 0.89903, 1, 1, 1, 0.93173, 0.93173, 0.93173, 1, 1.06304, 1.06304, 1.06904, 0.89903, 0.89903, 0.80549, 1, 1.156, 1, 1, 0.76575, 0.76575, 1, 1, 0.72458, 1, 1, 1, 1, 0.92241, 1, 1, 1, 0.619, 1, 1.36145, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1.07257, 1, 0.74705, 0.71119, 1.02058, 1.024, 
312111.02119, 1, 1, 1.1536, 1.08595, 1.08595, 1, 1.08595, 1.08595, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1.05638, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1];
31212const MyriadProRegularMetrics = {
31213	lineHeight: 1.2,
31214	lineGap: 0.2
31215};
31216
31217;// ./src/core/segoeui_factors.js
31218const SegoeuiBoldFactors = [1.76738, 1, 1, 0.99297, 0.9824, 1.04016, 1.06497, 1.03424, 0.97529, 1.17647, 1.23203, 1.1085, 1.1085, 1.16939, 1.2107, 0.9754, 1.21408, 0.9754, 1.59578, 1.03424, 1.03424, 1.03424, 1.03424, 1.03424, 1.03424, 1.03424, 1.03424, 1.03424, 1.03424, 0.81378, 0.81378, 1.2107, 1.2107, 1.2107, 0.71703, 0.97847, 0.97363, 0.88776, 0.8641, 1.02096, 0.79795, 0.85132, 0.914, 1.06085, 1.1406, 0.8007, 0.89858, 0.83693, 1.14889, 1.09398, 0.97489, 0.92094, 0.97489, 0.90399, 0.84041, 0.95923, 1.00135, 1, 1.06467, 0.98243, 0.90996, 0.99361, 1.1085, 1.56942, 1.1085, 1.2107, 0.74627, 0.94282, 0.96752, 1.01519, 0.86304, 1.01359, 0.97278, 1.15103, 1.01359, 0.98561, 1.02285, 1.02285, 1.00527, 1.02285, 1.0302, 0.99041, 1.0008, 1.01519, 1.01359, 1.02258, 0.79104, 1.16862, 0.99041, 0.97454, 1.02511, 0.99298, 0.96752, 0.95801, 0.94856, 1.16579, 0.94856, 1.2107, 0.9824, 1.03424, 1.03424, 1, 1.03424, 1.16579, 0.8727, 1.3871, 1.18622, 1.10818, 1.04478, 1.2107, 1.18622, 0.75155, 0.94994, 1.28826, 1.21408, 1.21408, 0.91056, 1, 0.91572, 0.9754, 0.64663, 1.18328, 1.24866, 1.04478, 1.14169, 1.15749, 1.17389, 0.71703, 0.97363, 0.97363, 0.97363, 0.97363, 0.97363, 0.97363, 0.93506, 0.8641, 0.79795, 0.79795, 0.79795, 0.79795, 1.1406, 1.1406, 1.1406, 1.1406, 1.02096, 1.09398, 0.97426, 0.97426, 0.97426, 0.97426, 0.97426, 1.2107, 0.97489, 1.00135, 1.00135, 1.00135, 1.00135, 0.90996, 0.92094, 1.02798, 0.96752, 0.96752, 0.96752, 0.96752, 0.96752, 0.96752, 0.93136, 0.86304, 0.97278, 0.97278, 0.97278, 0.97278, 1.02285, 1.02285, 1.02285, 1.02285, 0.97122, 0.99041, 1, 1, 1, 1, 1, 1.28826, 1.0008, 0.99041, 0.99041, 0.99041, 0.99041, 0.96752, 1.01519, 0.96752, 0.97363, 0.96752, 0.97363, 0.96752, 0.97363, 0.96752, 0.8641, 0.86304, 0.8641, 0.86304, 0.8641, 0.86304, 0.8641, 0.86304, 1.02096, 1.03057, 1.02096, 1.03517, 0.79795, 0.97278, 0.79795, 0.97278, 0.79795, 0.97278, 0.79795, 0.97278, 0.79795, 0.97278, 0.914, 1.01359, 0.914, 1.01359, 0.914, 1.01359, 1, 1, 1.06085, 0.98561, 1.06085, 1.00879, 1.1406, 1.02285, 1.1406, 1.02285, 1.1406, 1.02285, 1.1406, 1.02285, 1.1406, 1.02285, 0.97138, 1.08692, 0.8007, 1.02285, 1, 1, 1.00527, 0.83693, 1.02285, 1, 1, 0.83693, 0.9455, 0.83693, 0.90418, 0.83693, 1.13005, 1.09398, 0.99041, 1, 1, 1.09398, 0.99041, 0.96692, 1.09251, 0.99041, 0.97489, 1.0008, 0.97489, 1.0008, 0.97489, 1.0008, 0.93994, 0.97931, 0.90399, 1.02258, 1, 1, 0.90399, 1.02258, 0.84041, 0.79104, 0.84041, 0.79104, 0.84041, 0.79104, 0.84041, 0.79104, 1, 1, 0.95923, 1.07034, 0.95923, 1.16862, 1.00135, 0.99041, 1.00135, 0.99041, 1.00135, 0.99041, 1.00135, 0.99041, 1.00135, 0.99041, 1.00135, 0.99041, 1.06467, 1.02511, 0.90996, 0.96752, 0.90996, 0.99361, 0.95801, 0.99361, 0.95801, 0.99361, 0.95801, 1.07733, 1.03424, 0.97363, 0.96752, 0.93506, 0.93136, 0.97489, 1.0008, 1, 1, 0.95923, 1.16862, 1.15103, 1.15103, 1.01173, 1.03959, 0.75953, 0.81378, 0.79912, 1.15103, 1.21994, 0.95161, 0.87815, 1.01149, 0.81525, 0.7676, 0.98167, 1.01134, 1.02546, 0.84097, 1.03089, 1.18102, 0.97363, 0.88776, 0.85134, 0.97826, 0.79795, 0.99361, 1.06085, 0.97489, 1.1406, 0.89858, 1.0388, 1.14889, 1.09398, 0.86039, 0.97489, 1.0595, 0.92094, 0.94793, 0.95923, 0.90996, 0.99346, 0.98243, 1.02112, 0.95493, 1.1406, 0.90996, 1.03574, 1.02597, 1.0008, 1.18102, 1.06628, 1.03574, 1.0192, 1.01932, 1.00886, 0.97531, 1.0106, 1.0008, 1.13189, 1.18102, 1.02277, 0.98683, 1.0016, 0.99561, 1.07237, 1.0008, 0.90434, 0.99921, 0.93803, 0.8965, 1.23085, 1.06628, 1.04983, 0.96268, 1.0499, 0.98439, 1.18102, 1.06628, 1.0008, 1.06628, 0.98439, 0.79795, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1.09466, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0.97278, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1.02065, 1, 1, 1, 1, 1, 1, 1.06467, 1.02511, 1.06467, 1.02511, 1.06467, 1.02511, 0.90996, 0.96752, 1, 1.21408, 0.89903, 1, 1, 0.75155, 1.04394, 1.04394, 1.04394, 1.04394, 0.98633, 0.98633, 0.98633, 0.73047, 0.73047, 1.20642, 0.91211, 1.25635, 1.222, 1.02956, 1.03372, 1.03372, 0.96039, 1.24633, 1, 1.12454, 0.93503, 1.03424, 1.19687, 1.03424, 1, 1, 1, 0.771, 1, 1, 1.15749, 1.15749, 1.15749, 1.10948, 0.86279, 0.94434, 0.86279, 0.94434, 0.86182, 1, 1, 1.16897, 1, 0.96085, 0.90137, 1.2107, 1.18416, 1.13973, 0.69825, 0.9716, 2.10339, 1.29004, 1.29004, 1.21172, 1.29004, 1.29004, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1.42603, 1, 0.99862, 0.99862, 1, 0.87025, 0.87025, 0.87025, 0.87025, 1.18874, 1.42603, 1, 1.42603, 1.42603, 0.99862, 1, 1, 1, 1, 1, 1.2886, 1.04315, 1.15296, 1.34163, 1, 1, 1, 1.09193, 1.09193, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1];
31219const SegoeuiBoldMetrics = {
31220	lineHeight: 1.33008,
31221	lineGap: 0
31222};
31223const SegoeuiBoldItalicFactors = [1.76738, 1, 1, 0.98946, 1.03959, 1.04016, 1.02809, 1.036, 0.97639, 1.10953, 1.23203, 1.11144, 1.11144, 1.16939, 1.21237, 0.9754, 1.21261, 0.9754, 1.59754, 1.036, 1.036, 1.036, 1.036, 1.036, 1.036, 1.036, 1.036, 1.036, 1.036, 0.81378, 0.81378, 1.21237, 1.21237, 1.21237, 0.73541, 0.97847, 0.97363, 0.89723, 0.87897, 1.0426, 0.79429, 0.85292, 0.91149, 1.05815, 1.1406, 0.79631, 0.90128, 0.83853, 1.04396, 1.10615, 0.97552, 0.94436, 0.97552, 0.88641, 0.80527, 0.96083, 1.00135, 1, 1.06777, 0.9817, 0.91142, 0.99361, 1.11144, 1.57293, 1.11144, 1.21237, 0.74627, 1.31818, 1.06585, 0.97042, 0.83055, 0.97042, 0.93503, 1.1261, 0.97042, 0.97922, 1.14236, 0.94552, 1.01054, 1.14236, 1.02471, 0.97922, 0.94165, 0.97042, 0.97042, 1.0276, 0.78929, 1.1261, 0.97922, 0.95874, 1.02197, 0.98507, 0.96752, 0.97168, 0.95107, 1.16579, 0.95107, 1.21237, 1.03959, 1.036, 1.036, 1, 1.036, 1.16579, 0.87357, 1.31818, 1.18754, 1.26781, 1.05356, 1.21237, 1.18622, 0.79487, 0.94994, 1.29004, 1.24047, 1.24047, 1.31818, 1, 0.91484, 0.9754, 1.31818, 1.1349, 1.24866, 1.05356, 1.13934, 1.15574, 1.17389, 0.73541, 0.97363, 0.97363, 0.97363, 0.97363, 0.97363, 0.97363, 0.94385, 0.87897, 0.79429, 0.79429, 0.79429, 0.79429, 1.1406, 1.1406, 1.1406, 1.1406, 1.0426, 1.10615, 0.97552, 0.97552, 0.97552, 0.97552, 0.97552, 1.21237, 0.97552, 1.00135, 1.00135, 1.00135, 1.00135, 0.91142, 0.94436, 0.98721, 1.06585, 1.06585, 1.06585, 1.06585, 1.06585, 1.06585, 0.96705, 0.83055, 0.93503, 0.93503, 0.93503, 0.93503, 1.14236, 1.14236, 1.14236, 1.14236, 0.93125, 0.97922, 0.94165, 0.94165, 0.94165, 0.94165, 0.94165, 1.29004, 0.94165, 0.97922, 0.97922, 0.97922, 0.97922, 0.96752, 0.97042, 0.96752, 0.97363, 1.06585, 0.97363, 1.06585, 0.97363, 1.06585, 0.87897, 0.83055, 0.87897, 0.83055, 0.87897, 0.83055, 0.87897, 0.83055, 1.0426, 1.0033, 1.0426, 0.97042, 0.79429, 0.93503, 0.79429, 0.93503, 0.79429, 0.93503, 0.79429, 0.93503, 0.79429, 0.93503, 0.91149, 0.97042, 0.91149, 0.97042, 0.91149, 0.97042, 1, 1, 1.05815, 0.97922, 1.05815, 0.97922, 1.1406, 1.14236, 1.1406, 1.14236, 1.1406, 1.14236, 1.1406, 1.14236, 1.1406, 1.14236, 0.97441, 1.04302, 0.79631, 1.01582, 1, 1, 1.01054, 0.83853, 1.14236, 1, 1, 0.83853, 1.09125, 0.83853, 0.90418, 0.83853, 1.19508, 
312231.10615, 0.97922, 1, 1, 1.10615, 0.97922, 1.01034, 1.10466, 0.97922, 0.97552, 0.94165, 0.97552, 0.94165, 0.97552, 0.94165, 0.91602, 0.91981, 0.88641, 1.0276, 1, 1, 0.88641, 1.0276, 0.80527, 0.78929, 0.80527, 0.78929, 0.80527, 0.78929, 0.80527, 0.78929, 1, 1, 0.96083, 1.05403, 0.95923, 1.16862, 1.00135, 0.97922, 1.00135, 0.97922, 1.00135, 0.97922, 1.00135, 0.97922, 1.00135, 0.97922, 1.00135, 0.97922, 1.06777, 1.02197, 0.91142, 0.96752, 0.91142, 0.99361, 0.97168, 0.99361, 0.97168, 0.99361, 0.97168, 1.23199, 1.036, 0.97363, 1.06585, 0.94385, 0.96705, 0.97552, 0.94165, 1, 1, 0.96083, 1.1261, 1.31818, 1.31818, 1.31818, 1.31818, 1.31818, 1.31818, 1.31818, 1.31818, 1.31818, 0.95161, 1.27126, 1.00811, 0.83284, 0.77702, 0.99137, 0.95253, 1.0347, 0.86142, 1.07205, 1.14236, 0.97363, 0.89723, 0.86869, 1.09818, 0.79429, 0.99361, 1.05815, 0.97552, 1.1406, 0.90128, 1.06662, 1.04396, 1.10615, 0.84918, 0.97552, 1.04694, 0.94436, 0.98015, 0.96083, 0.91142, 1.00356, 0.9817, 1.01945, 0.98999, 1.1406, 0.91142, 1.04961, 0.9898, 1.00639, 1.14236, 1.07514, 1.04961, 0.99607, 1.02897, 1.008, 0.9898, 0.95134, 1.00639, 1.11121, 1.14236, 1.00518, 0.97981, 1.02186, 1, 1.08578, 0.94165, 0.99314, 0.98387, 0.93028, 0.93377, 1.35125, 1.07514, 1.10687, 0.93491, 1.04232, 1.00351, 1.14236, 1.07514, 0.94165, 1.07514, 1.00351, 0.79429, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1.09097, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0.93503, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0.96609, 1, 1, 1, 1, 1, 1, 1.06777, 1.02197, 1.06777, 1.02197, 1.06777, 1.02197, 0.91142, 0.96752, 1, 1.21261, 0.89903, 1, 1, 0.75155, 1.04745, 1.04745, 1.04745, 1.04394, 0.98633, 0.98633, 0.98633, 0.72959, 0.72959, 1.20502, 0.91406, 1.26514, 1.222, 1.02956, 1.03372, 1.03372, 0.96039, 1.24633, 1, 1.09125, 0.93327, 1.03336, 1.16541, 1.036, 1, 1, 1, 0.771, 1, 1, 1.15574, 1.15574, 1.15574, 1.15574, 0.86364, 0.94434, 0.86279, 0.94434, 0.86224, 1, 1, 1.16798, 1, 0.96085, 0.90068, 1.21237, 1.18416, 1.13904, 0.69825, 0.9716, 2.10339, 1.29004, 1.29004, 1.21339, 1.29004, 1.29004, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1.42603, 1, 0.99862, 0.99862, 1, 0.87025, 0.87025, 0.87025, 0.87025, 1.18775, 1.42603, 1, 1.42603, 1.42603, 0.99862, 1, 1, 1, 1, 1, 1.2886, 1.04315, 1.15296, 1.34163, 1, 1, 1, 1.13269, 1.13269, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1];
31224const SegoeuiBoldItalicMetrics = {
31225	lineHeight: 1.33008,
31226	lineGap: 0
31227};
31228const SegoeuiItalicFactors = [1.76738, 1, 1, 0.98946, 1.14763, 1.05365, 1.06234, 0.96927, 0.92586, 1.15373, 1.18414, 0.91349, 0.91349, 1.07403, 1.17308, 0.78383, 1.20088, 0.78383, 1.42531, 0.96927, 0.96927, 0.96927, 0.96927, 0.96927, 0.96927, 0.96927, 0.96927, 0.96927, 0.96927, 0.78383, 0.78383, 1.17308, 1.17308, 1.17308, 0.77349, 0.94565, 0.94729, 0.85944, 0.88506, 0.9858, 0.74817, 0.80016, 0.88449, 0.98039, 0.95782, 0.69238, 0.89898, 0.83231, 0.98183, 1.03989, 0.96924, 0.86237, 0.96924, 0.80595, 0.74524, 0.86091, 0.95402, 0.94143, 0.98448, 0.8858, 0.83089, 0.93285, 1.0949, 1.39016, 1.0949, 1.45994, 0.74627, 1.04839, 0.97454, 0.97454, 0.87207, 0.97454, 0.87533, 1.06151, 0.97454, 1.00176, 1.16484, 1.08132, 0.98047, 1.16484, 1.02989, 1.01054, 0.96225, 0.97454, 0.97454, 1.06598, 0.79004, 1.16344, 1.00351, 0.94629, 0.9973, 0.91016, 0.96777, 0.9043, 0.91082, 0.92481, 0.91082, 1.17308, 0.95748, 0.96927, 0.96927, 1, 0.96927, 0.92481, 0.80597, 1.04839, 1.23393, 1.1781, 0.9245, 1.17308, 1.20808, 0.63218, 0.94261, 1.24822, 1.09971, 1.09971, 1.04839, 1, 0.85273, 0.78032, 1.04839, 1.09971, 1.22326, 0.9245, 1.09836, 1.13525, 1.15222, 0.70424, 0.94729, 0.94729, 0.94729, 0.94729, 0.94729, 0.94729, 0.85498, 0.88506, 0.74817, 0.74817, 0.74817, 0.74817, 0.95782, 0.95782, 0.95782, 0.95782, 0.9858, 1.03989, 0.96924, 0.96924, 0.96924, 0.96924, 0.96924, 1.17308, 0.96924, 0.95402, 0.95402, 0.95402, 0.95402, 0.83089, 0.86237, 0.88409, 0.97454, 0.97454, 0.97454, 0.97454, 0.97454, 0.97454, 0.92916, 0.87207, 0.87533, 0.87533, 0.87533, 0.87533, 0.93146, 0.93146, 0.93146, 0.93146, 0.93854, 1.01054, 0.96225, 0.96225, 0.96225, 0.96225, 0.96225, 1.24822, 0.8761, 1.00351, 1.00351, 1.00351, 1.00351, 0.96777, 0.97454, 0.96777, 0.94729, 0.97454, 0.94729, 0.97454, 0.94729, 0.97454, 0.88506, 0.87207, 0.88506, 0.87207, 0.88506, 0.87207, 0.88506, 0.87207, 0.9858, 0.95391, 0.9858, 0.97454, 0.74817, 0.87533, 0.74817, 0.87533, 0.74817, 0.87533, 0.74817, 0.87533, 0.74817, 0.87533, 0.88449, 0.97454, 0.88449, 0.97454, 0.88449, 0.97454, 1, 1, 0.98039, 1.00176, 0.98039, 1.00176, 0.95782, 0.93146, 0.95782, 0.93146, 0.95782, 0.93146, 0.95782, 1.16484, 0.95782, 0.93146, 0.84421, 1.12761, 0.69238, 1.08132, 1, 1, 0.98047, 0.83231, 1.16484, 1, 1, 0.84723, 1.04861, 0.84723, 0.78755, 0.83231, 1.23736, 1.03989, 1.01054, 1, 1, 1.03989, 1.01054, 0.9857, 1.03849, 1.01054, 0.96924, 0.96225, 0.96924, 0.96225, 0.96924, 0.96225, 0.92383, 0.90171, 0.80595, 1.06598, 1, 1, 0.80595, 1.06598, 0.74524, 0.79004, 0.74524, 0.79004, 0.74524, 0.79004, 0.74524, 0.79004, 1, 1, 0.86091, 1.02759, 0.85771, 1.16344, 0.95402, 1.00351, 0.95402, 1.00351, 0.95402, 1.00351, 0.95402, 1.00351, 0.95402, 1.00351, 0.95402, 1.00351, 0.98448, 0.9973, 0.83089, 0.96777, 0.83089, 0.93285, 0.9043, 0.93285, 0.9043, 0.93285, 0.9043, 1.31868, 0.96927, 0.94729, 0.97454, 0.85498, 0.92916, 0.96924, 0.8761, 1, 1, 0.86091, 1.16344, 1.04839, 1.04839, 1.04839, 1.04839, 1.04839, 1.04839, 1.04839, 1.04839, 1.04839, 0.81965, 0.81965, 0.94729, 0.78032, 0.71022, 0.90883, 0.84171, 0.99877, 0.77596, 1.05734, 1.2, 0.94729, 0.85944, 
312280.82791, 0.9607, 0.74817, 0.93285, 0.98039, 0.96924, 0.95782, 0.89898, 0.98316, 0.98183, 1.03989, 0.78614, 0.96924, 0.97642, 0.86237, 0.86075, 0.86091, 0.83089, 0.90082, 0.8858, 0.97296, 1.01284, 0.95782, 0.83089, 1.0976, 1.04, 1.03342, 1.2, 1.0675, 1.0976, 0.98205, 1.03809, 1.05097, 1.04, 0.95364, 1.03342, 1.05401, 1.2, 1.02148, 1.0119, 1.04724, 1.0127, 1.02732, 0.96225, 0.8965, 0.97783, 0.93574, 0.94818, 1.30679, 1.0675, 1.11826, 0.99821, 1.0557, 1.0326, 1.2, 1.0675, 0.96225, 1.0675, 1.0326, 0.74817, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1.03754, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0.87533, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0.98705, 1, 1, 1, 1, 1, 1, 0.98448, 0.9973, 0.98448, 0.9973, 0.98448, 0.9973, 0.83089, 0.96777, 1, 1.20088, 0.89903, 1, 1, 0.75155, 0.94945, 0.94945, 0.94945, 0.94945, 1.12317, 1.12317, 1.12317, 0.67603, 0.67603, 1.15621, 0.73584, 1.21191, 1.22135, 1.06483, 0.94868, 0.94868, 0.95996, 1.24633, 1, 1.07497, 0.87709, 0.96927, 1.01473, 0.96927, 1, 1, 1, 0.77295, 1, 1, 1.09836, 1.09836, 1.09836, 1.01522, 0.86321, 0.94434, 0.8649, 0.94434, 0.86182, 1, 1, 1.083, 1, 0.91578, 0.86438, 1.17308, 1.18416, 1.14589, 0.69825, 0.97622, 1.96791, 1.24822, 1.24822, 1.17308, 1.24822, 1.24822, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1.42603, 1, 0.99862, 0.99862, 1, 0.87025, 0.87025, 0.87025, 0.87025, 1.17984, 1.42603, 1, 1.42603, 1.42603, 0.99862, 1, 1, 1, 1, 1, 1.2886, 1.04315, 1.15296, 1.34163, 1, 1, 1, 1.10742, 1.10742, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1];
31229const SegoeuiItalicMetrics = {
31230	lineHeight: 1.33008,
31231	lineGap: 0
31232};
31233const SegoeuiRegularFactors = [1.76738, 1, 1, 0.98594, 1.02285, 1.10454, 1.06234, 0.96927, 0.92037, 1.19985, 1.2046, 0.90616, 0.90616, 1.07152, 1.1714, 0.78032, 1.20088, 0.78032, 1.40246, 0.96927, 0.96927, 0.96927, 0.96927, 0.96927, 0.96927, 0.96927, 0.96927, 0.96927, 0.96927, 0.78032, 0.78032, 1.1714, 1.1714, 1.1714, 0.80597, 0.94084, 0.96706, 0.85944, 0.85734, 0.97093, 0.75842, 0.79936, 0.88198, 0.9831, 0.95782, 0.71387, 0.86969, 0.84636, 1.07796, 1.03584, 0.96924, 0.83968, 0.96924, 0.82826, 0.79649, 0.85771, 0.95132, 0.93119, 0.98965, 0.88433, 0.8287, 0.93365, 1.08612, 1.3638, 1.08612, 1.45786, 0.74627, 0.80499, 0.91484, 1.05707, 0.92383, 1.05882, 0.9403, 1.12654, 1.05882, 1.01756, 1.09011, 1.09011, 0.99414, 1.09011, 1.034, 1.01756, 1.05356, 1.05707, 1.05882, 1.04399, 0.84863, 1.21968, 1.01756, 0.95801, 1.00068, 0.91797, 0.96777, 0.9043, 0.90351, 0.92105, 0.90351, 1.1714, 0.85337, 0.96927, 0.96927, 0.99912, 0.96927, 0.92105, 0.80597, 1.2434, 1.20808, 1.05937, 0.90957, 1.1714, 1.20808, 0.75155, 0.94261, 1.24644, 1.09971, 1.09971, 0.84751, 1, 0.85273, 0.78032, 0.61584, 1.05425, 1.17914, 0.90957, 1.08665, 1.11593, 1.14169, 0.73381, 0.96706, 0.96706, 0.96706, 0.96706, 0.96706, 0.96706, 0.86035, 0.85734, 0.75842, 0.75842, 0.75842, 0.75842, 0.95782, 0.95782, 0.95782, 0.95782, 0.97093, 1.03584, 0.96924, 0.96924, 0.96924, 0.96924, 0.96924, 1.1714, 0.96924, 0.95132, 0.95132, 0.95132, 0.95132, 0.8287, 0.83968, 0.89049, 0.91484, 0.91484, 0.91484, 0.91484, 0.91484, 0.91484, 0.93575, 0.92383, 0.9403, 0.9403, 0.9403, 0.9403, 0.8717, 0.8717, 0.8717, 0.8717, 1.00527, 1.01756, 1.05356, 1.05356, 1.05356, 1.05356, 1.05356, 1.24644, 0.95923, 1.01756, 1.01756, 1.01756, 1.01756, 0.96777, 1.05707, 0.96777, 0.96706, 0.91484, 0.96706, 0.91484, 0.96706, 0.91484, 0.85734, 0.92383, 0.85734, 0.92383, 0.85734, 0.92383, 0.85734, 0.92383, 0.97093, 1.0969, 0.97093, 1.05882, 0.75842, 0.9403, 0.75842, 0.9403, 0.75842, 0.9403, 0.75842, 0.9403, 0.75842, 0.9403, 0.88198, 1.05882, 0.88198, 1.05882, 0.88198, 1.05882, 1, 1, 0.9831, 1.01756, 0.9831, 1.01756, 0.95782, 0.8717, 0.95782, 0.8717, 0.95782, 0.8717, 0.95782, 1.09011, 0.95782, 0.8717, 0.84784, 1.11551, 0.71387, 1.09011, 1, 1, 0.99414, 0.84636, 1.09011, 1, 1, 0.84636, 1.0536, 0.84636, 0.94298, 0.84636, 1.23297, 1.03584, 1.01756, 1, 1, 1.03584, 1.01756, 1.00323, 1.03444, 1.01756, 0.96924, 1.05356, 0.96924, 1.05356, 0.96924, 1.05356, 0.93066, 0.98293, 0.82826, 1.04399, 1, 1, 0.82826, 1.04399, 0.79649, 0.84863, 0.79649, 0.84863, 0.79649, 0.84863, 0.79649, 0.84863, 1, 1, 0.85771, 1.17318, 0.85771, 1.21968, 0.95132, 1.01756, 0.95132, 1.01756, 0.95132, 1.01756, 0.95132, 1.01756, 0.95132, 1.01756, 0.95132, 1.01756, 0.98965, 1.00068, 0.8287, 0.96777, 0.8287, 0.93365, 0.9043, 0.93365, 0.9043, 0.93365, 0.9043, 1.08571, 0.96927, 0.96706, 0.91484, 0.86035, 0.93575, 0.96924, 0.95923, 1, 1, 0.85771, 1.21968, 1.11437, 1.11437, 0.93109, 0.91202, 0.60411, 0.84164, 0.55572, 1.01173, 0.97361, 0.81818, 0.81818, 0.96635, 0.78032, 0.72727, 0.92366, 0.98601, 1.03405, 0.77968, 1.09799, 1.2, 
vendor: 5,775 bytes, lines 31233-31363
312330.96706, 0.85944, 0.85638, 0.96491, 0.75842, 0.93365, 0.9831, 0.96924, 0.95782, 0.86969, 0.94152, 1.07796, 1.03584, 0.78437, 0.96924, 0.98715, 0.83968, 0.83491, 0.85771, 0.8287, 0.94492, 0.88433, 0.9287, 1.0098, 0.95782, 0.8287, 1.0625, 0.98248, 1.03424, 1.2, 1.01071, 1.0625, 0.95246, 1.03809, 1.04912, 0.98248, 1.00221, 1.03424, 1.05443, 1.2, 1.04785, 0.99609, 1.00169, 1.05176, 0.99346, 1.05356, 0.9087, 1.03004, 0.95542, 0.93117, 1.23362, 1.01071, 1.07831, 1.02512, 1.05205, 1.03502, 1.2, 1.01071, 1.05356, 1.01071, 1.03502, 0.75842, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1.03719, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0.9403, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1.04021, 1, 1, 1, 1, 1, 1, 0.98965, 1.00068, 0.98965, 1.00068, 0.98965, 1.00068, 0.8287, 0.96777, 1, 1.20088, 0.89903, 1, 1, 0.75155, 1.03077, 1.03077, 1.03077, 1.03077, 1.13196, 1.13196, 1.13196, 0.67428, 0.67428, 1.16039, 0.73291, 1.20996, 1.22135, 1.06483, 0.94868, 0.94868, 0.95996, 1.24633, 1, 1.07497, 0.87796, 0.96927, 1.01518, 0.96927, 1, 1, 1, 0.77295, 1, 1, 1.10539, 1.10539, 1.11358, 1.06967, 0.86279, 0.94434, 0.86279, 0.94434, 0.86182, 1, 1, 1.083, 1, 0.91578, 0.86507, 1.1714, 1.18416, 1.14589, 0.69825, 0.97622, 1.9697, 1.24822, 1.24822, 1.17238, 1.24822, 1.24822, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1.42603, 1, 0.99862, 0.99862, 1, 0.87025, 0.87025, 0.87025, 0.87025, 1.18083, 1.42603, 1, 1.42603, 1.42603, 0.99862, 1, 1, 1, 1, 1, 1.2886, 1.04315, 1.15296, 1.34163, 1, 1, 1, 1.10938, 1.10938, 1, 1, 1, 1.05425, 1.09971, 1.09971, 1.09971, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1];
31234const SegoeuiRegularMetrics = {
31235	lineHeight: 1.33008,
31236	lineGap: 0
31237};
31238
31239;// ./src/core/xfa_fonts.js
31240
31241
31242
31243
31244
31245
31246
31247
31248
31249
31250const getXFAFontMap = getLookupTableFactory(function (t) {
31251	t["MyriadPro-Regular"] = t["PdfJS-Fallback-Regular"] = {
31252		name: "LiberationSans-Regular",
31253		factors: MyriadProRegularFactors,
31254		baseWidths: LiberationSansRegularWidths,
31255		baseMapping: LiberationSansRegularMapping,
31256		metrics: MyriadProRegularMetrics
31257	};
31258	t["MyriadPro-Bold"] = t["PdfJS-Fallback-Bold"] = {
31259		name: "LiberationSans-Bold",
31260		factors: MyriadProBoldFactors,
31261		baseWidths: LiberationSansBoldWidths,
31262		baseMapping: LiberationSansBoldMapping,
31263		metrics: MyriadProBoldMetrics
31264	};
31265	t["MyriadPro-It"] = t["MyriadPro-Italic"] = t["PdfJS-Fallback-Italic"] = {
31266		name: "LiberationSans-Italic",
31267		factors: MyriadProItalicFactors,
31268		baseWidths: LiberationSansItalicWidths,
31269		baseMapping: LiberationSansItalicMapping,
31270		metrics: MyriadProItalicMetrics
31271	};
31272	t["MyriadPro-BoldIt"] = t["MyriadPro-BoldItalic"] = t["PdfJS-Fallback-BoldItalic"] = {
31273		name: "LiberationSans-BoldItalic",
31274		factors: MyriadProBoldItalicFactors,
31275		baseWidths: LiberationSansBoldItalicWidths,
31276		baseMapping: LiberationSansBoldItalicMapping,
31277		metrics: MyriadProBoldItalicMetrics
31278	};
31279	t.ArialMT = t.Arial = t["Arial-Regular"] = {
31280		name: "LiberationSans-Regular",
31281		baseWidths: LiberationSansRegularWidths,
31282		baseMapping: LiberationSansRegularMapping
31283	};
31284	t["Arial-BoldMT"] = t["Arial-Bold"] = {
31285		name: "LiberationSans-Bold",
31286		baseWidths: LiberationSansBoldWidths,
31287		baseMapping: LiberationSansBoldMapping
31288	};
31289	t["Arial-ItalicMT"] = t["Arial-Italic"] = {
31290		name: "LiberationSans-Italic",
31291		baseWidths: LiberationSansItalicWidths,
31292		baseMapping: LiberationSansItalicMapping
31293	};
31294	t["Arial-BoldItalicMT"] = t["Arial-BoldItalic"] = {
31295		name: "LiberationSans-BoldItalic",
31296		baseWidths: LiberationSansBoldItalicWidths,
31297		baseMapping: LiberationSansBoldItalicMapping
31298	};
31299	t["Calibri-Regular"] = {
31300		name: "LiberationSans-Regular",
31301		factors: CalibriRegularFactors,
31302		baseWidths: LiberationSansRegularWidths,
31303		baseMapping: LiberationSansRegularMapping,
31304		metrics: CalibriRegularMetrics
31305	};
31306	t["Calibri-Bold"] = {
31307		name: "LiberationSans-Bold",
31308		factors: CalibriBoldFactors,
31309		baseWidths: LiberationSansBoldWidths,
31310		baseMapping: LiberationSansBoldMapping,
31311		metrics: CalibriBoldMetrics
31312	};
31313	t["Calibri-Italic"] = {
31314		name: "LiberationSans-Italic",
31315		factors: CalibriItalicFactors,
31316		baseWidths: LiberationSansItalicWidths,
31317		baseMapping: LiberationSansItalicMapping,
31318		metrics: CalibriItalicMetrics
31319	};
31320	t["Calibri-BoldItalic"] = {
31321		name: "LiberationSans-BoldItalic",
31322		factors: CalibriBoldItalicFactors,
31323		baseWidths: LiberationSansBoldItalicWidths,
31324		baseMapping: LiberationSansBoldItalicMapping,
31325		metrics: CalibriBoldItalicMetrics
31326	};
31327	t["Segoeui-Regular"] = {
31328		name: "LiberationSans-Regular",
31329		factors: SegoeuiRegularFactors,
31330		baseWidths: LiberationSansRegularWidths,
31331		baseMapping: LiberationSansRegularMapping,
31332		metrics: SegoeuiRegularMetrics
31333	};
31334	t["Segoeui-Bold"] = {
31335		name: "LiberationSans-Bold",
31336		factors: SegoeuiBoldFactors,
31337		baseWidths: LiberationSansBoldWidths,
31338		baseMapping: LiberationSansBoldMapping,
31339		metrics: SegoeuiBoldMetrics
31340	};
31341	t["Segoeui-Italic"] = {
31342		name: "LiberationSans-Italic",
31343		factors: SegoeuiItalicFactors,
31344		baseWidths: LiberationSansItalicWidths,
31345		baseMapping: LiberationSansItalicMapping,
31346		metrics: SegoeuiItalicMetrics
31347	};
31348	t["Segoeui-BoldItalic"] = {
31349		name: "LiberationSans-BoldItalic",
31350		factors: SegoeuiBoldItalicFactors,
31351		baseWidths: LiberationSansBoldItalicWidths,
31352		baseMapping: LiberationSansBoldItalicMapping,
31353		metrics: SegoeuiBoldItalicMetrics
31354	};
31355	t["Helvetica-Regular"] = t.Helvetica = {
31356		name: "LiberationSans-Regular",
31357		factors: HelveticaRegularFactors,
31358		baseWidths: LiberationSansRegularWidths,
31359		baseMapping: LiberationSansRegularMapping,
31360		metrics: HelveticaRegularMetrics
31361	};
31362	t["Helvetica-Bold"] = {
31363		name: "LiberationSans-Bold",
vendor: 10,466 bytes, lines 31364-31790
31364		factors: HelveticaBoldFactors,
31365		baseWidths: LiberationSansBoldWidths,
31366		baseMapping: LiberationSansBoldMapping,
31367		metrics: HelveticaBoldMetrics
31368	};
31369	t["Helvetica-Italic"] = {
31370		name: "LiberationSans-Italic",
31371		factors: HelveticaItalicFactors,
31372		baseWidths: LiberationSansItalicWidths,
31373		baseMapping: LiberationSansItalicMapping,
31374		metrics: HelveticaItalicMetrics
31375	};
31376	t["Helvetica-BoldItalic"] = {
31377		name: "LiberationSans-BoldItalic",
31378		factors: HelveticaBoldItalicFactors,
31379		baseWidths: LiberationSansBoldItalicWidths,
31380		baseMapping: LiberationSansBoldItalicMapping,
31381		metrics: HelveticaBoldItalicMetrics
31382	};
31383});
31384function getXfaFontName(name) {
31385	const fontName = normalizeFontName(name);
31386	const fontMap = getXFAFontMap();
31387	return fontMap[fontName];
31388}
31389function getXfaFontWidths(name) {
31390	const info = getXfaFontName(name);
31391	if (!info) {
31392		return null;
31393	}
31394	const {
31395		baseWidths,
31396		baseMapping,
31397		factors
31398	} = info;
31399	const rescaledBaseWidths = !factors ? baseWidths : baseWidths.map((w, i) => w * factors[i]);
31400	let currentCode = -2;
31401	let currentArray;
31402	const newWidths = [];
31403	for (const [unicode, glyphIndex] of baseMapping.map((charUnicode, index) => [charUnicode, index]).sort(([unicode1], [unicode2]) => unicode1 - unicode2)) {
31404		if (unicode === -1) {
31405			continue;
31406		}
31407		if (unicode === currentCode + 1) {
31408			currentArray.push(rescaledBaseWidths[glyphIndex]);
31409			currentCode += 1;
31410		} else {
31411			currentCode = unicode;
31412			currentArray = [rescaledBaseWidths[glyphIndex]];
31413			newWidths.push(unicode, currentArray);
31414		}
31415	}
31416	return newWidths;
31417}
31418function getXfaFontDict(name) {
31419	const widths = getXfaFontWidths(name);
31420	const dict = new Dict(null);
31421	dict.set("BaseFont", Name.get(name));
31422	dict.set("Type", Name.get("Font"));
31423	dict.set("Subtype", Name.get("CIDFontType2"));
31424	dict.set("Encoding", Name.get("Identity-H"));
31425	dict.set("CIDToGIDMap", Name.get("Identity"));
31426	dict.set("W", widths);
31427	dict.set("FirstChar", widths[0]);
31428	dict.set("LastChar", widths.at(-2) + widths.at(-1).length - 1);
31429	const descriptor = new Dict(null);
31430	dict.set("FontDescriptor", descriptor);
31431	const systemInfo = new Dict(null);
31432	systemInfo.set("Ordering", "Identity");
31433	systemInfo.set("Registry", "Adobe");
31434	systemInfo.set("Supplement", 0);
31435	dict.set("CIDSystemInfo", systemInfo);
31436	return dict;
31437}
31438
31439;// ./src/core/ps_parser.js
31440
31441
31442
31443
31444class PostScriptParser {
31445	constructor(lexer) {
31446		this.lexer = lexer;
31447		this.operators = [];
31448		this.token = null;
31449		this.prev = null;
31450	}
31451	nextToken() {
31452		this.prev = this.token;
31453		this.token = this.lexer.getToken();
31454	}
31455	accept(type) {
31456		if (this.token.type === type) {
31457			this.nextToken();
31458			return true;
31459		}
31460		return false;
31461	}
31462	expect(type) {
31463		if (this.accept(type)) {
31464			return true;
31465		}
31466		throw new FormatError(`Unexpected symbol: found ${this.token.type} expected ${type}.`);
31467	}
31468	parse() {
31469		this.nextToken();
31470		this.expect(PostScriptTokenTypes.LBRACE);
31471		this.parseBlock();
31472		this.expect(PostScriptTokenTypes.RBRACE);
31473		return this.operators;
31474	}
31475	parseBlock() {
31476		while (true) {
31477			if (this.accept(PostScriptTokenTypes.NUMBER)) {
31478				this.operators.push(this.prev.value);
31479			} else if (this.accept(PostScriptTokenTypes.OPERATOR)) {
31480				this.operators.push(this.prev.value);
31481			} else if (this.accept(PostScriptTokenTypes.LBRACE)) {
31482				this.parseCondition();
31483			} else {
31484				return;
31485			}
31486		}
31487	}
31488	parseCondition() {
31489		const conditionLocation = this.operators.length;
31490		this.operators.push(null, null);
31491		this.parseBlock();
31492		this.expect(PostScriptTokenTypes.RBRACE);
31493		if (this.accept(PostScriptTokenTypes.IF)) {
31494			this.operators[conditionLocation] = this.operators.length;
31495			this.operators[conditionLocation + 1] = "jz";
31496		} else if (this.accept(PostScriptTokenTypes.LBRACE)) {
31497			const jumpLocation = this.operators.length;
31498			this.operators.push(null, null);
31499			const endOfTrue = this.operators.length;
31500			this.parseBlock();
31501			this.expect(PostScriptTokenTypes.RBRACE);
31502			this.expect(PostScriptTokenTypes.IFELSE);
31503			this.operators[jumpLocation] = this.operators.length;
31504			this.operators[jumpLocation + 1] = "j";
31505			this.operators[conditionLocation] = endOfTrue;
31506			this.operators[conditionLocation + 1] = "jz";
31507		} else {
31508			throw new FormatError("PS Function: error parsing conditional.");
31509		}
31510	}
31511}
31512const PostScriptTokenTypes = {
31513	LBRACE: 0,
31514	RBRACE: 1,
31515	NUMBER: 2,
31516	OPERATOR: 3,
31517	IF: 4,
31518	IFELSE: 5
31519};
31520class PostScriptToken {
31521	static get opCache() {
31522		return shadow(this, "opCache", Object.create(null));
31523	}
31524	constructor(type, value) {
31525		this.type = type;
31526		this.value = value;
31527	}
31528	static getOperator(op) {
31529		return PostScriptToken.opCache[op] ||= new PostScriptToken(PostScriptTokenTypes.OPERATOR, op);
31530	}
31531	static get LBRACE() {
31532		return shadow(this, "LBRACE", new PostScriptToken(PostScriptTokenTypes.LBRACE, "{"));
31533	}
31534	static get RBRACE() {
31535		return shadow(this, "RBRACE", new PostScriptToken(PostScriptTokenTypes.RBRACE, "}"));
31536	}
31537	static get IF() {
31538		return shadow(this, "IF", new PostScriptToken(PostScriptTokenTypes.IF, "IF"));
31539	}
31540	static get IFELSE() {
31541		return shadow(this, "IFELSE", new PostScriptToken(PostScriptTokenTypes.IFELSE, "IFELSE"));
31542	}
31543}
31544class PostScriptLexer {
31545	constructor(stream) {
31546		this.stream = stream;
31547		this.nextChar();
31548		this.strBuf = [];
31549	}
31550	nextChar() {
31551		return this.currentChar = this.stream.getByte();
31552	}
31553	getToken() {
31554		let comment = false;
31555		let ch = this.currentChar;
31556		while (true) {
31557			if (ch < 0) {
31558				return EOF;
31559			}
31560			if (comment) {
31561				if (ch === 0x0a || ch === 0x0d) {
31562					comment = false;
31563				}
31564			} else if (ch === 0x25) {
31565				comment = true;
31566			} else if (!isWhiteSpace(ch)) {
31567				break;
31568			}
31569			ch = this.nextChar();
31570		}
31571		switch (ch | 0) {
31572			case 0x30:
31573			case 0x31:
31574			case 0x32:
31575			case 0x33:
31576			case 0x34:
31577			case 0x35:
31578			case 0x36:
31579			case 0x37:
31580			case 0x38:
31581			case 0x39:
31582			case 0x2b:
31583			case 0x2d:
31584			case 0x2e:
31585				return new PostScriptToken(PostScriptTokenTypes.NUMBER, this.getNumber());
31586			case 0x7b:
31587				this.nextChar();
31588				return PostScriptToken.LBRACE;
31589			case 0x7d:
31590				this.nextChar();
31591				return PostScriptToken.RBRACE;
31592		}
31593		const strBuf = this.strBuf;
31594		strBuf.length = 0;
31595		strBuf[0] = String.fromCharCode(ch);
31596		while ((ch = this.nextChar()) >= 0 && (ch >= 0x41 && ch <= 0x5a || ch >= 0x61 && ch <= 0x7a)) {
31597			strBuf.push(String.fromCharCode(ch));
31598		}
31599		const str = strBuf.join("");
31600		switch (str.toLowerCase()) {
31601			case "if":
31602				return PostScriptToken.IF;
31603			case "ifelse":
31604				return PostScriptToken.IFELSE;
31605			default:
31606				return PostScriptToken.getOperator(str);
31607		}
31608	}
31609	getNumber() {
31610		let ch = this.currentChar;
31611		const strBuf = this.strBuf;
31612		strBuf.length = 0;
31613		strBuf[0] = String.fromCharCode(ch);
31614		while ((ch = this.nextChar()) >= 0) {
31615			if (ch >= 0x30 && ch <= 0x39 || ch === 0x2d || ch === 0x2e) {
31616				strBuf.push(String.fromCharCode(ch));
31617			} else {
31618				break;
31619			}
31620		}
31621		const value = parseFloat(strBuf.join(""));
31622		if (isNaN(value)) {
31623			throw new FormatError(`Invalid floating point number: ${value}`);
31624		}
31625		return value;
31626	}
31627}
31628
31629;// ./src/core/image_utils.js
31630
31631
31632
31633
31634
31635
31636
31637
31638
31639class BaseLocalCache {
31640	constructor(options) {
31641		this._onlyRefs = options?.onlyRefs === true;
31642		if (!this._onlyRefs) {
31643			this._nameRefMap = new Map();
31644			this._imageMap = new Map();
31645		}
31646		this._imageCache = new RefSetCache();
31647	}
31648	getByName(name) {
31649		if (this._onlyRefs) {
31650			unreachable("Should not call `getByName` method.");
31651		}
31652		const ref = this._nameRefMap.get(name);
31653		if (ref) {
31654			return this.getByRef(ref);
31655		}
31656		return this._imageMap.get(name) || null;
31657	}
31658	getByRef(ref) {
31659		return this._imageCache.get(ref) || null;
31660	}
31661	set(name, ref, data) {
31662		unreachable("Abstract method `set` called.");
31663	}
31664}
31665class LocalImageCache extends BaseLocalCache {
31666	set(name, ref = null, data) {
31667		if (typeof name !== "string") {
31668			throw new Error('LocalImageCache.set - expected "name" argument.');
31669		}
31670		if (ref) {
31671			if (this._imageCache.has(ref)) {
31672				return;
31673			}
31674			this._nameRefMap.set(name, ref);
31675			this._imageCache.put(ref, data);
31676			return;
31677		}
31678		if (this._imageMap.has(name)) {
31679			return;
31680		}
31681		this._imageMap.set(name, data);
31682	}
31683}
31684class LocalColorSpaceCache extends BaseLocalCache {
31685	set(name = null, ref = null, data) {
31686		if (typeof name !== "string" && !ref) {
31687			throw new Error('LocalColorSpaceCache.set - expected "name" and/or "ref" argument.');
31688		}
31689		if (ref) {
31690			if (this._imageCache.has(ref)) {
31691				return;
31692			}
31693			if (name !== null) {
31694				this._nameRefMap.set(name, ref);
31695			}
31696			this._imageCache.put(ref, data);
31697			return;
31698		}
31699		if (this._imageMap.has(name)) {
31700			return;
31701		}
31702		this._imageMap.set(name, data);
31703	}
31704}
31705class LocalFunctionCache extends BaseLocalCache {
31706	constructor(options) {
31707		super({
31708			onlyRefs: true
31709		});
31710	}
31711	set(name = null, ref, data) {
31712		if (!ref) {
31713			throw new Error('LocalFunctionCache.set - expected "ref" argument.');
31714		}
31715		if (this._imageCache.has(ref)) {
31716			return;
31717		}
31718		this._imageCache.put(ref, data);
31719	}
31720}
31721class LocalGStateCache extends BaseLocalCache {
31722	set(name, ref = null, data) {
31723		if (typeof name !== "string") {
31724			throw new Error('LocalGStateCache.set - expected "name" argument.');
31725		}
31726		if (ref) {
31727			if (this._imageCache.has(ref)) {
31728				return;
31729			}
31730			this._nameRefMap.set(name, ref);
31731			this._imageCache.put(ref, data);
31732			return;
31733		}
31734		if (this._imageMap.has(name)) {
31735			return;
31736		}
31737		this._imageMap.set(name, data);
31738	}
31739}
31740class LocalTilingPatternCache extends BaseLocalCache {
31741	constructor(options) {
31742		super({
31743			onlyRefs: true
31744		});
31745	}
31746	set(name = null, ref, data) {
31747		if (!ref) {
31748			throw new Error('LocalTilingPatternCache.set - expected "ref" argument.');
31749		}
31750		if (this._imageCache.has(ref)) {
31751			return;
31752		}
31753		this._imageCache.put(ref, data);
31754	}
31755}
31756class RegionalImageCache extends BaseLocalCache {
31757	constructor(options) {
31758		super({
31759			onlyRefs: true
31760		});
31761	}
31762	set(name = null, ref, data) {
31763		if (!ref) {
31764			throw new Error('RegionalImageCache.set - expected "ref" argument.');
31765		}
31766		if (this._imageCache.has(ref)) {
31767			return;
31768		}
31769		this._imageCache.put(ref, data);
31770	}
31771}
31772class GlobalImageCache {
31773	static NUM_PAGES_THRESHOLD = 2;
31774	static MIN_IMAGES_TO_CACHE = 10;
31775	static MAX_BYTE_SIZE = 5 * MAX_IMAGE_SIZE_TO_CACHE;
31776	#decodeFailedSet = new RefSet();
31777	constructor() {
31778		this._refCache = new RefSetCache();
31779		this._imageCache = new RefSetCache();
31780	}
31781	get #byteSize() {
31782		let byteSize = 0;
31783		for (const imageData of this._imageCache) {
31784			byteSize += imageData.byteSize;
31785		}
31786		return byteSize;
31787	}
31788	get #cacheLimitReached() {
31789		if (this._imageCache.size < GlobalImageCache.MIN_IMAGES_TO_CACHE) {
31790			return false;
31791		}
31792		if (this.#byteSize < GlobalImageCache.MAX_BYTE_SIZE) {
31793			return false;
31794		}
31795		return true;
31796	}
31797	shouldCache(ref, pageIndex) {
31798		let pageIndexSet = this._refCache.get(ref);
31799		if (!pageIndexSet) {
31800			pageIndexSet = new Set();
31801			this._refCache.put(ref, pageIndexSet);
31802		}
31803		pageIndexSet.add(pageIndex);
31804		if (pageIndexSet.size < GlobalImageCache.NUM_PAGES_THRESHOLD) {
31805			return false;
31806		}
31807		if (!this._imageCache.has(ref) && this.#cacheLimitReached) {
31808			return false;
31809		}
31810		return true;
31811	}
31812	addDecodeFailed(ref) {
31813		this.#decodeFailedSet.put(ref);
31814	}
31815	hasDecodeFailed(ref) {
31816		return this.#decodeFailedSet.has(ref);
31817	}
31818	addByteSize(ref, byteSize) {
31819		const imageData = this._imageCache.get(ref);
31820		if (!imageData) {
31821			return;
31822		}
31823		if (imageData.byteSize) {
31824			return;
31825		}
31826		imageData.byteSize = byteSize;
31827	}
31828	getData(ref, pageIndex) {
31829		const pageIndexSet = this._refCache.get(ref);
31830		if (!pageIndexSet) {
31831			return null;
31832		}
31833		if (pageIndexSet.size < GlobalImageCache.NUM_PAGES_THRESHOLD) {
31834			return null;
31835		}
31836		const imageData = this._imageCache.get(ref);
31837		if (!imageData) {
31838			return null;
31839		}
31840		pageIndexSet.add(pageIndex);
31841		return imageData;
31842	}
31843	setData(ref, data) {
31844		if (!this._refCache.has(ref)) {
31845			throw new Error('GlobalImageCache.setData - expected "shouldCache" to have been called.');
31846		}
31847		if (this._imageCache.has(ref)) {
31848			return;
31849		}
31850		if (this.#cacheLimitReached) {
31851			warn("GlobalImageCache.setData - cache limit reached.");
31852			return;
31853		}
31854		this._imageCache.put(ref, data);
31855	}
31856	clear(onlyData = false) {
31857		if (!onlyData) {
31858			this.#decodeFailedSet.clear();
31859			this._refCache.clear();
31860		}
31861		this._imageCache.clear();
31862	}
31863}
31864
31865;// ./src/core/function.js
31866
31867
31868
31869
31870
31871
31872
31873
31874
31875
31876
31877
31878
31879
31880class PDFFunctionFactory {
31881	constructor({
31882		xref,
31883		isEvalSupported = true
31884	}) {
31885		this.xref = xref;
31886		this.isEvalSupported = isEvalSupported !== false;
31887	}
31888	create(fn) {
31889		const cachedFunction = this.getCached(fn);
31890		if (cachedFunction) {
31891			return cachedFunction;
31892		}
31893		const parsedFunction = PDFFunction.parse({
31894			xref: this.xref,
31895			isEvalSupported: this.isEvalSupported,
31896			fn: fn instanceof Ref ? this.xref.fetch(fn) : fn
31897		});
31898		this._cache(fn, parsedFunction);
31899		return parsedFunction;
31900	}
31901	createFromArray(fnObj) {
31902		const cachedFunction = this.getCached(fnObj);
31903		if (cachedFunction) {
31904			return cachedFunction;
31905		}
31906		const parsedFunction = PDFFunction.parseArray({
31907			xref: this.xref,
31908			isEvalSupported: this.isEvalSupported,
31909			fnObj: fnObj instanceof Ref ? this.xref.fetch(fnObj) : fnObj
31910		});
31911		this._cache(fnObj, parsedFunction);
31912		return parsedFunction;
31913	}
31914	getCached(cacheKey) {
31915		let fnRef;
31916		if (cacheKey instanceof Ref) {
31917			fnRef = cacheKey;
31918		} else if (cacheKey instanceof Dict) {
31919			fnRef = cacheKey.objId;
31920		} else if (cacheKey instanceof BaseStream) {
31921			fnRef = cacheKey.dict?.objId;
31922		}
31923		if (fnRef) {
31924			const localFunction = this._localFunctionCache.getByRef(fnRef);
31925			if (localFunction) {
31926				return localFunction;
31927			}
31928		}
31929		return null;
31930	}
31931	_cache(cacheKey, parsedFunction) {
31932		if (!parsedFunction) {
31933			throw new Error('PDFFunctionFactory._cache - expected "parsedFunction" argument.');
31934		}
31935		let fnRef;
31936		if (cacheKey instanceof Ref) {
31937			fnRef = cacheKey;
31938		} else if (cacheKey instanceof Dict) {
31939			fnRef = cacheKey.objId;
31940		} else if (cacheKey instanceof BaseStream) {
31941			fnRef = cacheKey.dict?.objId;
31942		}
31943		if (fnRef) {
31944			this._localFunctionCache.set(null, fnRef, parsedFunction);
31945		}
31946	}
31947	get _localFunctionCache() {
31948		return shadow(this, "_localFunctionCache", new LocalFunctionCache());
31949	}
31950}
31951function toNumberArray(arr) {
31952	if (!Array.isArray(arr)) {
31953		return null;
31954	}
31955	if (!isNumberArray(arr, null)) {
31956		return arr.map(x => +x);
31957	}
31958	return arr;
31959}
31960class PDFFunction {
31961	static getSampleArray(size, outputSize, bps, stream) {
31962		let i, ii;
31963		let length = 1;
31964		for (i = 0, ii = size.length; i < ii; i++) {
31965			length *= size[i];
31966		}
31967		length *= outputSize;
31968		const array = new Array(length);
31969		let codeSize = 0;
31970		let codeBuf = 0;
31971		const sampleMul = 1.0 / (2.0 ** bps - 1);
31972		const strBytes = stream.getBytes((length * bps + 7) / 8);
31973		let strIdx = 0;
31974		for (i = 0; i < length; i++) {
31975			while (codeSize < bps) {
31976				codeBuf <<= 8;
31977				codeBuf |= strBytes[strIdx++];
31978				codeSize += 8;
31979			}
31980			codeSize -= bps;
31981			array[i] = (codeBuf >> codeSize) * sampleMul;
31982			codeBuf &= (1 << codeSize) - 1;
31983		}
31984		return array;
31985	}
31986	static parse({
31987		xref,
31988		isEvalSupported,
31989		fn
31990	}) {
31991		const dict = fn.dict || fn;
31992		const typeNum = dict.get("FunctionType");
31993		switch (typeNum) {
31994			case 0:
31995				return this.constructSampled({
31996					xref,
31997					isEvalSupported,
31998					fn,
31999					dict
32000				});
32001			case 1:
32002				break;
32003			case 2:
32004				return this.constructInterpolated({
32005					xref,
32006					isEvalSupported,
32007					dict
32008				});
32009			case 3:
32010				return this.constructStiched({
32011					xref,
32012					isEvalSupported,
32013					dict
32014				});
32015			case 4:
32016				return this.constructPostScript({
32017					xref,
32018					isEvalSupported,
32019					fn,
32020					dict
32021				});
32022		}
32023		throw new FormatError("Unknown type of function");
32024	}
32025	static parseArray({
32026		xref,
32027		isEvalSupported,
32028		fnObj
32029	}) {
32030		if (!Array.isArray(fnObj)) {
32031			return this.parse({
32032				xref,
32033				isEvalSupported,
32034				fn: fnObj
32035			});
32036		}
32037		const fnArray = [];
32038		for (const fn of fnObj) {
32039			fnArray.push(this.parse({
32040				xref,
32041				isEvalSupported,
32042				fn: xref.fetchIfRef(fn)
32043			}));
32044		}
vendor: 8,937 bytes, lines 32045-32375
32045		return function (src, srcOffset, dest, destOffset) {
32046			for (let i = 0, ii = fnArray.length; i < ii; i++) {
32047				fnArray[i](src, srcOffset, dest, destOffset + i);
32048			}
32049		};
32050	}
32051	static constructSampled({
32052		xref,
32053		isEvalSupported,
32054		fn,
32055		dict
32056	}) {
32057		function toMultiArray(arr) {
32058			const inputLength = arr.length;
32059			const out = [];
32060			let index = 0;
32061			for (let i = 0; i < inputLength; i += 2) {
32062				out[index++] = [arr[i], arr[i + 1]];
32063			}
32064			return out;
32065		}
32066		function interpolate(x, xmin, xmax, ymin, ymax) {
32067			return ymin + (x - xmin) * ((ymax - ymin) / (xmax - xmin));
32068		}
32069		let domain = toNumberArray(dict.getArray("Domain"));
32070		let range = toNumberArray(dict.getArray("Range"));
32071		if (!domain || !range) {
32072			throw new FormatError("No domain or range");
32073		}
32074		const inputSize = domain.length / 2;
32075		const outputSize = range.length / 2;
32076		domain = toMultiArray(domain);
32077		range = toMultiArray(range);
32078		const size = toNumberArray(dict.getArray("Size"));
32079		const bps = dict.get("BitsPerSample");
32080		const order = dict.get("Order") || 1;
32081		if (order !== 1) {
32082			info("No support for cubic spline interpolation: " + order);
32083		}
32084		let encode = toNumberArray(dict.getArray("Encode"));
32085		if (!encode) {
32086			encode = [];
32087			for (let i = 0; i < inputSize; ++i) {
32088				encode.push([0, size[i] - 1]);
32089			}
32090		} else {
32091			encode = toMultiArray(encode);
32092		}
32093		let decode = toNumberArray(dict.getArray("Decode"));
32094		decode = !decode ? range : toMultiArray(decode);
32095		const samples = this.getSampleArray(size, outputSize, bps, fn);
32096		return function constructSampledFn(src, srcOffset, dest, destOffset) {
32097			const cubeVertices = 1 << inputSize;
32098			const cubeN = new Float64Array(cubeVertices);
32099			const cubeVertex = new Uint32Array(cubeVertices);
32100			let i, j;
32101			for (j = 0; j < cubeVertices; j++) {
32102				cubeN[j] = 1;
32103			}
32104			let k = outputSize,
32105				pos = 1;
32106			for (i = 0; i < inputSize; ++i) {
32107				const domain_2i = domain[i][0];
32108				const domain_2i_1 = domain[i][1];
32109				const xi = Math.min(Math.max(src[srcOffset + i], domain_2i), domain_2i_1);
32110				let e = interpolate(xi, domain_2i, domain_2i_1, encode[i][0], encode[i][1]);
32111				const size_i = size[i];
32112				e = Math.min(Math.max(e, 0), size_i - 1);
32113				const e0 = e < size_i - 1 ? Math.floor(e) : e - 1;
32114				const n0 = e0 + 1 - e;
32115				const n1 = e - e0;
32116				const offset0 = e0 * k;
32117				const offset1 = offset0 + k;
32118				for (j = 0; j < cubeVertices; j++) {
32119					if (j & pos) {
32120						cubeN[j] *= n1;
32121						cubeVertex[j] += offset1;
32122					} else {
32123						cubeN[j] *= n0;
32124						cubeVertex[j] += offset0;
32125					}
32126				}
32127				k *= size_i;
32128				pos <<= 1;
32129			}
32130			for (j = 0; j < outputSize; ++j) {
32131				let rj = 0;
32132				for (i = 0; i < cubeVertices; i++) {
32133					rj += samples[cubeVertex[i] + j] * cubeN[i];
32134				}
32135				rj = interpolate(rj, 0, 1, decode[j][0], decode[j][1]);
32136				dest[destOffset + j] = Math.min(Math.max(rj, range[j][0]), range[j][1]);
32137			}
32138		};
32139	}
32140	static constructInterpolated({
32141		xref,
32142		isEvalSupported,
32143		dict
32144	}) {
32145		const c0 = toNumberArray(dict.getArray("C0")) || [0];
32146		const c1 = toNumberArray(dict.getArray("C1")) || [1];
32147		const n = dict.get("N");
32148		const diff = [];
32149		for (let i = 0, ii = c0.length; i < ii; ++i) {
32150			diff.push(c1[i] - c0[i]);
32151		}
32152		const length = diff.length;
32153		return function constructInterpolatedFn(src, srcOffset, dest, destOffset) {
32154			const x = n === 1 ? src[srcOffset] : src[srcOffset] ** n;
32155			for (let j = 0; j < length; ++j) {
32156				dest[destOffset + j] = c0[j] + x * diff[j];
32157			}
32158		};
32159	}
32160	static constructStiched({
32161		xref,
32162		isEvalSupported,
32163		dict
32164	}) {
32165		const domain = toNumberArray(dict.getArray("Domain"));
32166		if (!domain) {
32167			throw new FormatError("No domain");
32168		}
32169		const inputSize = domain.length / 2;
32170		if (inputSize !== 1) {
32171			throw new FormatError("Bad domain for stiched function");
32172		}
32173		const fns = [];
32174		for (const fn of dict.get("Functions")) {
32175			fns.push(this.parse({
32176				xref,
32177				isEvalSupported,
32178				fn: xref.fetchIfRef(fn)
32179			}));
32180		}
32181		const bounds = toNumberArray(dict.getArray("Bounds"));
32182		const encode = toNumberArray(dict.getArray("Encode"));
32183		const tmpBuf = new Float32Array(1);
32184		return function constructStichedFn(src, srcOffset, dest, destOffset) {
32185			const clip = function constructStichedFromIRClip(v, min, max) {
32186				if (v > max) {
32187					v = max;
32188				} else if (v < min) {
32189					v = min;
32190				}
32191				return v;
32192			};
32193			const v = clip(src[srcOffset], domain[0], domain[1]);
32194			const length = bounds.length;
32195			let i;
32196			for (i = 0; i < length; ++i) {
32197				if (v < bounds[i]) {
32198					break;
32199				}
32200			}
32201			let dmin = domain[0];
32202			if (i > 0) {
32203				dmin = bounds[i - 1];
32204			}
32205			let dmax = domain[1];
32206			if (i < bounds.length) {
32207				dmax = bounds[i];
32208			}
32209			const rmin = encode[2 * i];
32210			const rmax = encode[2 * i + 1];
32211			tmpBuf[0] = dmin === dmax ? rmin : rmin + (v - dmin) * (rmax - rmin) / (dmax - dmin);
32212			fns[i](tmpBuf, 0, dest, destOffset);
32213		};
32214	}
32215	static constructPostScript({
32216		xref,
32217		isEvalSupported,
32218		fn,
32219		dict
32220	}) {
32221		const domain = toNumberArray(dict.getArray("Domain"));
32222		const range = toNumberArray(dict.getArray("Range"));
32223		if (!domain) {
32224			throw new FormatError("No domain.");
32225		}
32226		if (!range) {
32227			throw new FormatError("No range.");
32228		}
32229		const lexer = new PostScriptLexer(fn);
32230		const parser = new PostScriptParser(lexer);
32231		const code = parser.parse();
32232		if (isEvalSupported && FeatureTest.isEvalSupported) {
32233			const compiled = new PostScriptCompiler().compile(code, domain, range);
32234			if (compiled) {
32235				return new Function("src", "srcOffset", "dest", "destOffset", compiled);
32236			}
32237		}
32238		info("Unable to compile PS function");
32239		const numOutputs = range.length >> 1;
32240		const numInputs = domain.length >> 1;
32241		const evaluator = new PostScriptEvaluator(code);
32242		const cache = Object.create(null);
32243		const MAX_CACHE_SIZE = 2048 * 4;
32244		let cache_available = MAX_CACHE_SIZE;
32245		const tmpBuf = new Float32Array(numInputs);
32246		return function constructPostScriptFn(src, srcOffset, dest, destOffset) {
32247			let i, value;
32248			let key = "";
32249			const input = tmpBuf;
32250			for (i = 0; i < numInputs; i++) {
32251				value = src[srcOffset + i];
32252				input[i] = value;
32253				key += value + "_";
32254			}
32255			const cachedValue = cache[key];
32256			if (cachedValue !== undefined) {
32257				dest.set(cachedValue, destOffset);
32258				return;
32259			}
32260			const output = new Float32Array(numOutputs);
32261			const stack = evaluator.execute(input);
32262			const stackIndex = stack.length - numOutputs;
32263			for (i = 0; i < numOutputs; i++) {
32264				value = stack[stackIndex + i];
32265				let bound = range[i * 2];
32266				if (value < bound) {
32267					value = bound;
32268				} else {
32269					bound = range[i * 2 + 1];
32270					if (value > bound) {
32271						value = bound;
32272					}
32273				}
32274				output[i] = value;
32275			}
32276			if (cache_available > 0) {
32277				cache_available--;
32278				cache[key] = output;
32279			}
32280			dest.set(output, destOffset);
32281		};
32282	}
32283}
32284function isPDFFunction(v) {
32285	let fnDict;
32286	if (v instanceof Dict) {
32287		fnDict = v;
32288	} else if (v instanceof BaseStream) {
32289		fnDict = v.dict;
32290	} else {
32291		return false;
32292	}
32293	return fnDict.has("FunctionType");
32294}
32295class PostScriptStack {
32296	static MAX_STACK_SIZE = 100;
32297	constructor(initialStack) {
32298		this.stack = initialStack ? Array.from(initialStack) : [];
32299	}
32300	push(value) {
32301		if (this.stack.length >= PostScriptStack.MAX_STACK_SIZE) {
32302			throw new Error("PostScript function stack overflow.");
32303		}
32304		this.stack.push(value);
32305	}
32306	pop() {
32307		if (this.stack.length <= 0) {
32308			throw new Error("PostScript function stack underflow.");
32309		}
32310		return this.stack.pop();
32311	}
32312	copy(n) {
32313		if (this.stack.length + n >= PostScriptStack.MAX_STACK_SIZE) {
32314			throw new Error("PostScript function stack overflow.");
32315		}
32316		const stack = this.stack;
32317		for (let i = stack.length - n, j = n - 1; j >= 0; j--, i++) {
32318			stack.push(stack[i]);
32319		}
32320	}
32321	index(n) {
32322		this.push(this.stack[this.stack.length - n - 1]);
32323	}
32324	roll(n, p) {
32325		const stack = this.stack;
32326		const l = stack.length - n;
32327		const r = stack.length - 1;
32328		const c = l + (p - Math.floor(p / n) * n);
32329		for (let i = l, j = r; i < j; i++, j--) {
32330			const t = stack[i];
32331			stack[i] = stack[j];
32332			stack[j] = t;
32333		}
32334		for (let i = l, j = c - 1; i < j; i++, j--) {
32335			const t = stack[i];
32336			stack[i] = stack[j];
32337			stack[j] = t;
32338		}
32339		for (let i = c, j = r; i < j; i++, j--) {
32340			const t = stack[i];
32341			stack[i] = stack[j];
32342			stack[j] = t;
32343		}
32344	}
32345}
32346class PostScriptEvaluator {
32347	constructor(operators) {
32348		this.operators = operators;
32349	}
32350	execute(initialStack) {
32351		const stack = new PostScriptStack(initialStack);
32352		let counter = 0;
32353		const operators = this.operators;
32354		const length = operators.length;
32355		let operator, a, b;
32356		while (counter < length) {
32357			operator = operators[counter++];
32358			if (typeof operator === "number") {
32359				stack.push(operator);
32360				continue;
32361			}
32362			switch (operator) {
32363				case "jz":
32364					b = stack.pop();
32365					a = stack.pop();
32366					if (!a) {
32367						counter = b;
32368					}
32369					break;
32370				case "j":
32371					a = stack.pop();
32372					counter = a;
32373					break;
32374				case "abs":
32375					a = stack.pop();
vendor: 10,137 bytes, lines 32376-32830
32376					stack.push(Math.abs(a));
32377					break;
32378				case "add":
32379					b = stack.pop();
32380					a = stack.pop();
32381					stack.push(a + b);
32382					break;
32383				case "and":
32384					b = stack.pop();
32385					a = stack.pop();
32386					if (typeof a === "boolean" && typeof b === "boolean") {
32387						stack.push(a && b);
32388					} else {
32389						stack.push(a & b);
32390					}
32391					break;
32392				case "atan":
32393					b = stack.pop();
32394					a = stack.pop();
32395					a = Math.atan2(a, b) / Math.PI * 180;
32396					if (a < 0) {
32397						a += 360;
32398					}
32399					stack.push(a);
32400					break;
32401				case "bitshift":
32402					b = stack.pop();
32403					a = stack.pop();
32404					if (a > 0) {
32405						stack.push(a << b);
32406					} else {
32407						stack.push(a >> b);
32408					}
32409					break;
32410				case "ceiling":
32411					a = stack.pop();
32412					stack.push(Math.ceil(a));
32413					break;
32414				case "copy":
32415					a = stack.pop();
32416					stack.copy(a);
32417					break;
32418				case "cos":
32419					a = stack.pop();
32420					stack.push(Math.cos(a % 360 / 180 * Math.PI));
32421					break;
32422				case "cvi":
32423					a = stack.pop() | 0;
32424					stack.push(a);
32425					break;
32426				case "cvr":
32427					break;
32428				case "div":
32429					b = stack.pop();
32430					a = stack.pop();
32431					stack.push(a / b);
32432					break;
32433				case "dup":
32434					stack.copy(1);
32435					break;
32436				case "eq":
32437					b = stack.pop();
32438					a = stack.pop();
32439					stack.push(a === b);
32440					break;
32441				case "exch":
32442					stack.roll(2, 1);
32443					break;
32444				case "exp":
32445					b = stack.pop();
32446					a = stack.pop();
32447					stack.push(a ** b);
32448					break;
32449				case "false":
32450					stack.push(false);
32451					break;
32452				case "floor":
32453					a = stack.pop();
32454					stack.push(Math.floor(a));
32455					break;
32456				case "ge":
32457					b = stack.pop();
32458					a = stack.pop();
32459					stack.push(a >= b);
32460					break;
32461				case "gt":
32462					b = stack.pop();
32463					a = stack.pop();
32464					stack.push(a > b);
32465					break;
32466				case "idiv":
32467					b = stack.pop();
32468					a = stack.pop();
32469					stack.push(a / b | 0);
32470					break;
32471				case "index":
32472					a = stack.pop();
32473					stack.index(a);
32474					break;
32475				case "le":
32476					b = stack.pop();
32477					a = stack.pop();
32478					stack.push(a <= b);
32479					break;
32480				case "ln":
32481					a = stack.pop();
32482					stack.push(Math.log(a));
32483					break;
32484				case "log":
32485					a = stack.pop();
32486					stack.push(Math.log10(a));
32487					break;
32488				case "lt":
32489					b = stack.pop();
32490					a = stack.pop();
32491					stack.push(a < b);
32492					break;
32493				case "mod":
32494					b = stack.pop();
32495					a = stack.pop();
32496					stack.push(a % b);
32497					break;
32498				case "mul":
32499					b = stack.pop();
32500					a = stack.pop();
32501					stack.push(a * b);
32502					break;
32503				case "ne":
32504					b = stack.pop();
32505					a = stack.pop();
32506					stack.push(a !== b);
32507					break;
32508				case "neg":
32509					a = stack.pop();
32510					stack.push(-a);
32511					break;
32512				case "not":
32513					a = stack.pop();
32514					if (typeof a === "boolean") {
32515						stack.push(!a);
32516					} else {
32517						stack.push(~a);
32518					}
32519					break;
32520				case "or":
32521					b = stack.pop();
32522					a = stack.pop();
32523					if (typeof a === "boolean" && typeof b === "boolean") {
32524						stack.push(a || b);
32525					} else {
32526						stack.push(a | b);
32527					}
32528					break;
32529				case "pop":
32530					stack.pop();
32531					break;
32532				case "roll":
32533					b = stack.pop();
32534					a = stack.pop();
32535					stack.roll(a, b);
32536					break;
32537				case "round":
32538					a = stack.pop();
32539					stack.push(Math.round(a));
32540					break;
32541				case "sin":
32542					a = stack.pop();
32543					stack.push(Math.sin(a % 360 / 180 * Math.PI));
32544					break;
32545				case "sqrt":
32546					a = stack.pop();
32547					stack.push(Math.sqrt(a));
32548					break;
32549				case "sub":
32550					b = stack.pop();
32551					a = stack.pop();
32552					stack.push(a - b);
32553					break;
32554				case "true":
32555					stack.push(true);
32556					break;
32557				case "truncate":
32558					a = stack.pop();
32559					a = a < 0 ? Math.ceil(a) : Math.floor(a);
32560					stack.push(a);
32561					break;
32562				case "xor":
32563					b = stack.pop();
32564					a = stack.pop();
32565					if (typeof a === "boolean" && typeof b === "boolean") {
32566						stack.push(a !== b);
32567					} else {
32568						stack.push(a ^ b);
32569					}
32570					break;
32571				default:
32572					throw new FormatError(`Unknown operator ${operator}`);
32573			}
32574		}
32575		return stack.stack;
32576	}
32577}
32578class AstNode {
32579	constructor(type) {
32580		this.type = type;
32581	}
32582	visit(visitor) {
32583		unreachable("abstract method");
32584	}
32585}
32586class AstArgument extends AstNode {
32587	constructor(index, min, max) {
32588		super("args");
32589		this.index = index;
32590		this.min = min;
32591		this.max = max;
32592	}
32593	visit(visitor) {
32594		visitor.visitArgument(this);
32595	}
32596}
32597class AstLiteral extends AstNode {
32598	constructor(number) {
32599		super("literal");
32600		this.number = number;
32601		this.min = number;
32602		this.max = number;
32603	}
32604	visit(visitor) {
32605		visitor.visitLiteral(this);
32606	}
32607}
32608class AstBinaryOperation extends AstNode {
32609	constructor(op, arg1, arg2, min, max) {
32610		super("binary");
32611		this.op = op;
32612		this.arg1 = arg1;
32613		this.arg2 = arg2;
32614		this.min = min;
32615		this.max = max;
32616	}
32617	visit(visitor) {
32618		visitor.visitBinaryOperation(this);
32619	}
32620}
32621class AstMin extends AstNode {
32622	constructor(arg, max) {
32623		super("max");
32624		this.arg = arg;
32625		this.min = arg.min;
32626		this.max = max;
32627	}
32628	visit(visitor) {
32629		visitor.visitMin(this);
32630	}
32631}
32632class AstVariable extends AstNode {
32633	constructor(index, min, max) {
32634		super("var");
32635		this.index = index;
32636		this.min = min;
32637		this.max = max;
32638	}
32639	visit(visitor) {
32640		visitor.visitVariable(this);
32641	}
32642}
32643class AstVariableDefinition extends AstNode {
32644	constructor(variable, arg) {
32645		super("definition");
32646		this.variable = variable;
32647		this.arg = arg;
32648	}
32649	visit(visitor) {
32650		visitor.visitVariableDefinition(this);
32651	}
32652}
32653class ExpressionBuilderVisitor {
32654	constructor() {
32655		this.parts = [];
32656	}
32657	visitArgument(arg) {
32658		this.parts.push("Math.max(", arg.min, ", Math.min(", arg.max, ", src[srcOffset + ", arg.index, "]))");
32659	}
32660	visitVariable(variable) {
32661		this.parts.push("v", variable.index);
32662	}
32663	visitLiteral(literal) {
32664		this.parts.push(literal.number);
32665	}
32666	visitBinaryOperation(operation) {
32667		this.parts.push("(");
32668		operation.arg1.visit(this);
32669		this.parts.push(" ", operation.op, " ");
32670		operation.arg2.visit(this);
32671		this.parts.push(")");
32672	}
32673	visitVariableDefinition(definition) {
32674		this.parts.push("var ");
32675		definition.variable.visit(this);
32676		this.parts.push(" = ");
32677		definition.arg.visit(this);
32678		this.parts.push(";");
32679	}
32680	visitMin(max) {
32681		this.parts.push("Math.min(");
32682		max.arg.visit(this);
32683		this.parts.push(", ", max.max, ")");
32684	}
32685	toString() {
32686		return this.parts.join("");
32687	}
32688}
32689function buildAddOperation(num1, num2) {
32690	if (num2.type === "literal" && num2.number === 0) {
32691		return num1;
32692	}
32693	if (num1.type === "literal" && num1.number === 0) {
32694		return num2;
32695	}
32696	if (num2.type === "literal" && num1.type === "literal") {
32697		return new AstLiteral(num1.number + num2.number);
32698	}
32699	return new AstBinaryOperation("+", num1, num2, num1.min + num2.min, num1.max + num2.max);
32700}
32701function buildMulOperation(num1, num2) {
32702	if (num2.type === "literal") {
32703		if (num2.number === 0) {
32704			return new AstLiteral(0);
32705		} else if (num2.number === 1) {
32706			return num1;
32707		} else if (num1.type === "literal") {
32708			return new AstLiteral(num1.number * num2.number);
32709		}
32710	}
32711	if (num1.type === "literal") {
32712		if (num1.number === 0) {
32713			return new AstLiteral(0);
32714		} else if (num1.number === 1) {
32715			return num2;
32716		}
32717	}
32718	const min = Math.min(num1.min * num2.min, num1.min * num2.max, num1.max * num2.min, num1.max * num2.max);
32719	const max = Math.max(num1.min * num2.min, num1.min * num2.max, num1.max * num2.min, num1.max * num2.max);
32720	return new AstBinaryOperation("*", num1, num2, min, max);
32721}
32722function buildSubOperation(num1, num2) {
32723	if (num2.type === "literal") {
32724		if (num2.number === 0) {
32725			return num1;
32726		} else if (num1.type === "literal") {
32727			return new AstLiteral(num1.number - num2.number);
32728		}
32729	}
32730	if (num2.type === "binary" && num2.op === "-" && num1.type === "literal" && num1.number === 1 && num2.arg1.type === "literal" && num2.arg1.number === 1) {
32731		return num2.arg2;
32732	}
32733	return new AstBinaryOperation("-", num1, num2, num1.min - num2.max, num1.max - num2.min);
32734}
32735function buildMinOperation(num1, max) {
32736	if (num1.min >= max) {
32737		return new AstLiteral(max);
32738	} else if (num1.max <= max) {
32739		return num1;
32740	}
32741	return new AstMin(num1, max);
32742}
32743class PostScriptCompiler {
32744	compile(code, domain, range) {
32745		const stack = [];
32746		const instructions = [];
32747		const inputSize = domain.length >> 1,
32748			outputSize = range.length >> 1;
32749		let lastRegister = 0;
32750		let n, j;
32751		let num1, num2, ast1, ast2, tmpVar, item;
32752		for (let i = 0; i < inputSize; i++) {
32753			stack.push(new AstArgument(i, domain[i * 2], domain[i * 2 + 1]));
32754		}
32755		for (let i = 0, ii = code.length; i < ii; i++) {
32756			item = code[i];
32757			if (typeof item === "number") {
32758				stack.push(new AstLiteral(item));
32759				continue;
32760			}
32761			switch (item) {
32762				case "add":
32763					if (stack.length < 2) {
32764						return null;
32765					}
32766					num2 = stack.pop();
32767					num1 = stack.pop();
32768					stack.push(buildAddOperation(num1, num2));
32769					break;
32770				case "cvr":
32771					if (stack.length < 1) {
32772						return null;
32773					}
32774					break;
32775				case "mul":
32776					if (stack.length < 2) {
32777						return null;
32778					}
32779					num2 = stack.pop();
32780					num1 = stack.pop();
32781					stack.push(buildMulOperation(num1, num2));
32782					break;
32783				case "sub":
32784					if (stack.length < 2) {
32785						return null;
32786					}
32787					num2 = stack.pop();
32788					num1 = stack.pop();
32789					stack.push(buildSubOperation(num1, num2));
32790					break;
32791				case "exch":
32792					if (stack.length < 2) {
32793						return null;
32794					}
32795					ast1 = stack.pop();
32796					ast2 = stack.pop();
32797					stack.push(ast1, ast2);
32798					break;
32799				case "pop":
32800					if (stack.length < 1) {
32801						return null;
32802					}
32803					stack.pop();
32804					break;
32805				case "index":
32806					if (stack.length < 1) {
32807						return null;
32808					}
32809					num1 = stack.pop();
32810					if (num1.type !== "literal") {
32811						return null;
32812					}
32813					n = num1.number;
32814					if (n < 0 || !Number.isInteger(n) || stack.length < n) {
32815						return null;
32816					}
32817					ast1 = stack[stack.length - n - 1];
32818					if (ast1.type === "literal" || ast1.type === "var") {
32819						stack.push(ast1);
32820						break;
32821					}
32822					tmpVar = new AstVariable(lastRegister++, ast1.min, ast1.max);
32823					stack[stack.length - n - 1] = tmpVar;
32824					stack.push(tmpVar);
32825					instructions.push(new AstVariableDefinition(tmpVar, ast1));
32826					break;
32827				case "dup":
32828					if (stack.length < 1) {
32829						return null;
32830					}
vendor: 5,748 bytes, lines 32831-32939
32831					if (typeof code[i + 1] === "number" && code[i + 2] === "gt" && code[i + 3] === i + 7 && code[i + 4] === "jz" && code[i + 5] === "pop" && code[i + 6] === code[i + 1]) {
32832						num1 = stack.pop();
32833						stack.push(buildMinOperation(num1, code[i + 1]));
32834						i += 6;
32835						break;
32836					}
32837					ast1 = stack.at(-1);
32838					if (ast1.type === "literal" || ast1.type === "var") {
32839						stack.push(ast1);
32840						break;
32841					}
32842					tmpVar = new AstVariable(lastRegister++, ast1.min, ast1.max);
32843					stack[stack.length - 1] = tmpVar;
32844					stack.push(tmpVar);
32845					instructions.push(new AstVariableDefinition(tmpVar, ast1));
32846					break;
32847				case "roll":
32848					if (stack.length < 2) {
32849						return null;
32850					}
32851					num2 = stack.pop();
32852					num1 = stack.pop();
32853					if (num2.type !== "literal" || num1.type !== "literal") {
32854						return null;
32855					}
32856					j = num2.number;
32857					n = num1.number;
32858					if (n <= 0 || !Number.isInteger(n) || !Number.isInteger(j) || stack.length < n) {
32859						return null;
32860					}
32861					j = (j % n + n) % n;
32862					if (j === 0) {
32863						break;
32864					}
32865					stack.push(...stack.splice(stack.length - n, n - j));
32866					break;
32867				default:
32868					return null;
32869			}
32870		}
32871		if (stack.length !== outputSize) {
32872			return null;
32873		}
32874		const result = [];
32875		for (const instruction of instructions) {
32876			const statementBuilder = new ExpressionBuilderVisitor();
32877			instruction.visit(statementBuilder);
32878			result.push(statementBuilder.toString());
32879		}
32880		for (let i = 0, ii = stack.length; i < ii; i++) {
32881			const expr = stack[i],
32882				statementBuilder = new ExpressionBuilderVisitor();
32883			expr.visit(statementBuilder);
32884			const min = range[i * 2],
32885				max = range[i * 2 + 1];
32886			const out = [statementBuilder.toString()];
32887			if (min > expr.min) {
32888				out.unshift("Math.max(", min, ", ");
32889				out.push(")");
32890			}
32891			if (max < expr.max) {
32892				out.unshift("Math.min(", max, ", ");
32893				out.push(")");
32894			}
32895			out.unshift("dest[destOffset + ", i, "] = ");
32896			out.push(";");
32897			result.push(out.join(""));
32898		}
32899		return result.join("\n");
32900	}
32901}
32902
32903;// ./src/core/bidi.js
32904
32905const baseTypes = ["BN", "BN", "BN", "BN", "BN", "BN", "BN", "BN", "BN", "S", "B", "S", "WS", "B", "BN", "BN", "BN", "BN", "BN", "BN", "BN", "BN", "BN", "BN", "BN", "BN", "BN", "BN", "B", "B", "B", "S", "WS", "ON", "ON", "ET", "ET", "ET", "ON", "ON", "ON", "ON", "ON", "ES", "CS", "ES", "CS", "CS", "EN", "EN", "EN", "EN", "EN", "EN", "EN", "EN", "EN", "EN", "CS", "ON", "ON", "ON", "ON", "ON", "ON", "L", "L", "L", "L", "L", "L", "L", "L", "L", "L", "L", "L", "L", "L", "L", "L", "L", "L", "L", "L", "L", "L", "L", "L", "L", "L", "ON", "ON", "ON", "ON", "ON", "ON", "L", "L", "L", "L", "L", "L", "L", "L", "L", "L", "L", "L", "L", "L", "L", "L", "L", "L", "L", "L", "L", "L", "L", "L", "L", "L", "ON", "ON", "ON", "ON", "BN", "BN", "BN", "BN", "BN", "BN", "B", "BN", "BN", "BN", "BN", "BN", "BN", "BN", "BN", "BN", "BN", "BN", "BN", "BN", "BN", "BN", "BN", "BN", "BN", "BN", "BN", "BN", "BN", "BN", "BN", "BN", "BN", "CS", "ON", "ET", "ET", "ET", "ET", "ON", "ON", "ON", "ON", "L", "ON", "ON", "BN", "ON", "ON", "ET", "ET", "EN", "EN", "ON", "L", "ON", "ON", "ON", "EN", "L", "ON", "ON", "ON", "ON", "ON", "L", "L", "L", "L", "L", "L", "L", "L", "L", "L", "L", "L", "L", "L", "L", "L", "L", "L", "L", "L", "L", "L", "L", "ON", "L", "L", "L", "L", "L", "L", "L", "L", "L", "L", "L", "L", "L", "L", "L", "L", "L", "L", "L", "L", "L", "L", "L", "L", "L", "L", "L", "L", "L", "L", "L", "ON", "L", "L", "L", "L", "L", "L", "L", "L"];
32906const arabicTypes = ["AN", "AN", "AN", "AN", "AN", "AN", "ON", "ON", "AL", "ET", "ET", "AL", "CS", "AL", "ON", "ON", "NSM", "NSM", "NSM", "NSM", "NSM", "NSM", "NSM", "NSM", "NSM", "NSM", "NSM", "AL", "AL", "", "AL", "AL", "AL", "AL", "AL", "AL", "AL", "AL", "AL", "AL", "AL", "AL", "AL", "AL", "AL", "AL", "AL", "AL", "AL", "AL", "AL", "AL", "AL", "AL", "AL", "AL", "AL", "AL", "AL", "AL", "AL", "AL", "AL", "AL", "AL", "AL", "AL", "AL", "AL", "AL", "AL", "AL", "AL", "AL", "AL", "NSM", "NSM", "NSM", "NSM", "NSM", "NSM", "NSM", "NSM", "NSM", "NSM", "NSM", "NSM", "NSM", "NSM", "NSM", "NSM", "NSM", "NSM", "NSM", "NSM", "NSM", "AN", "AN", "AN", "AN", "AN", "AN", "AN", "AN", "AN", "AN", "ET", "AN", "AN", "AL", "AL", "AL", "NSM", "AL", "AL", "AL", "AL", "AL", "AL", "AL", "AL", "AL", "AL", "AL", "AL", "AL", "AL", "AL", "AL", "AL", "AL", "AL", "AL", "AL", "AL", "AL", "AL", "AL", "AL", "AL", "AL", "AL", "AL", "AL", "AL", "AL", "AL", "AL", "AL", "AL", "AL", "AL", "AL", "AL", "AL", "AL", "AL", "AL", "AL", "AL", "AL", "AL", "AL", "AL", "AL", "AL", "AL", "AL", "AL", "AL", "AL", "AL", "AL", "AL", "AL", "AL", "AL", "AL", "AL", "AL", "AL", "AL", "AL", "AL", "AL", "AL", "AL", "AL", "AL", "AL", "AL", "AL", "AL", "AL", "AL", "AL", "AL", "AL", "AL", "AL", "AL", "AL", "AL", "AL", "AL", "AL", "AL", "AL", "AL", "AL", "AL", "AL", "AL", "AL", "NSM", "NSM", "NSM", "NSM", "NSM", "NSM", "NSM", "AN", "ON", "NSM", "NSM", "NSM", "NSM", "NSM", "NSM", "AL", "AL", "NSM", "NSM", "ON", "NSM", "NSM", "NSM", "NSM", "AL", "AL", "EN", "EN", "EN", "EN", "EN", "EN", "EN", "EN", "EN", "EN", "AL", "AL", "AL", "AL", "AL", "AL"];
32907function isOdd(i) {
32908	return (i & 1) !== 0;
32909}
32910function isEven(i) {
32911	return (i & 1) === 0;
32912}
32913function findUnequal(arr, start, value) {
32914	let j, jj;
32915	for (j = start, jj = arr.length; j < jj; ++j) {
32916		if (arr[j] !== value) {
32917			return j;
32918		}
32919	}
32920	return j;
32921}
32922function setValues(arr, start, end, value) {
32923	for (let j = start; j < end; ++j) {
32924		arr[j] = value;
32925	}
32926}
32927function reverseValues(arr, start, end) {
32928	for (let i = start, j = end - 1; i < j; ++i, --j) {
32929		const temp = arr[i];
32930		arr[i] = arr[j];
32931		arr[j] = temp;
32932	}
32933}
32934function createBidiText(str, isLTR, vertical = false) {
32935	let dir = "ltr";
32936	if (vertical) {
32937		dir = "ttb";
32938	} else if (!isLTR) {
32939		dir = "rtl";
vendor: 3,188 bytes, lines 32940-33075
32940	}
32941	return {
32942		str,
32943		dir
32944	};
32945}
32946const chars = [];
32947const types = [];
32948function bidi(str, startLevel = -1, vertical = false) {
32949	let isLTR = true;
32950	const strLength = str.length;
32951	if (strLength === 0 || vertical) {
32952		return createBidiText(str, isLTR, vertical);
32953	}
32954	chars.length = strLength;
32955	types.length = strLength;
32956	let numBidi = 0;
32957	let i, ii;
32958	for (i = 0; i < strLength; ++i) {
32959		chars[i] = str.charAt(i);
32960		const charCode = str.charCodeAt(i);
32961		let charType = "L";
32962		if (charCode <= 0x00ff) {
32963			charType = baseTypes[charCode];
32964		} else if (0x0590 <= charCode && charCode <= 0x05f4) {
32965			charType = "R";
32966		} else if (0x0600 <= charCode && charCode <= 0x06ff) {
32967			charType = arabicTypes[charCode & 0xff];
32968			if (!charType) {
32969				warn("Bidi: invalid Unicode character " + charCode.toString(16));
32970			}
32971		} else if (0x0700 <= charCode && charCode <= 0x08ac || 0xfb50 <= charCode && charCode <= 0xfdff || 0xfe70 <= charCode && charCode <= 0xfeff) {
32972			charType = "AL";
32973		}
32974		if (charType === "R" || charType === "AL" || charType === "AN") {
32975			numBidi++;
32976		}
32977		types[i] = charType;
32978	}
32979	if (numBidi === 0) {
32980		isLTR = true;
32981		return createBidiText(str, isLTR);
32982	}
32983	if (startLevel === -1) {
32984		if (numBidi / strLength < 0.3 && strLength > 4) {
32985			isLTR = true;
32986			startLevel = 0;
32987		} else {
32988			isLTR = false;
32989			startLevel = 1;
32990		}
32991	}
32992	const levels = [];
32993	for (i = 0; i < strLength; ++i) {
32994		levels[i] = startLevel;
32995	}
32996	const e = isOdd(startLevel) ? "R" : "L";
32997	const sor = e;
32998	const eor = sor;
32999	let lastType = sor;
33000	for (i = 0; i < strLength; ++i) {
33001		if (types[i] === "NSM") {
33002			types[i] = lastType;
33003		} else {
33004			lastType = types[i];
33005		}
33006	}
33007	lastType = sor;
33008	let t;
33009	for (i = 0; i < strLength; ++i) {
33010		t = types[i];
33011		if (t === "EN") {
33012			types[i] = lastType === "AL" ? "AN" : "EN";
33013		} else if (t === "R" || t === "L" || t === "AL") {
33014			lastType = t;
33015		}
33016	}
33017	for (i = 0; i < strLength; ++i) {
33018		t = types[i];
33019		if (t === "AL") {
33020			types[i] = "R";
33021		}
33022	}
33023	for (i = 1; i < strLength - 1; ++i) {
33024		if (types[i] === "ES" && types[i - 1] === "EN" && types[i + 1] === "EN") {
33025			types[i] = "EN";
33026		}
33027		if (types[i] === "CS" && (types[i - 1] === "EN" || types[i - 1] === "AN") && types[i + 1] === types[i - 1]) {
33028			types[i] = types[i - 1];
33029		}
33030	}
33031	for (i = 0; i < strLength; ++i) {
33032		if (types[i] === "EN") {
33033			for (let j = i - 1; j >= 0; --j) {
33034				if (types[j] !== "ET") {
33035					break;
33036				}
33037				types[j] = "EN";
33038			}
33039			for (let j = i + 1; j < strLength; ++j) {
33040				if (types[j] !== "ET") {
33041					break;
33042				}
33043				types[j] = "EN";
33044			}
33045		}
33046	}
33047	for (i = 0; i < strLength; ++i) {
33048		t = types[i];
33049		if (t === "WS" || t === "ES" || t === "ET" || t === "CS") {
33050			types[i] = "ON";
33051		}
33052	}
33053	lastType = sor;
33054	for (i = 0; i < strLength; ++i) {
33055		t = types[i];
33056		if (t === "EN") {
33057			types[i] = lastType === "L" ? "L" : "EN";
33058		} else if (t === "R" || t === "L") {
33059			lastType = t;
33060		}
33061	}
33062	for (i = 0; i < strLength; ++i) {
33063		if (types[i] === "ON") {
33064			const end = findUnequal(types, i + 1, "ON");
33065			let before = sor;
33066			if (i > 0) {
33067				before = types[i - 1];
33068			}
33069			let after = eor;
33070			if (end + 1 < strLength) {
33071				after = types[end + 1];
33072			}
33073			if (before !== "L") {
33074				before = "R";
33075			}
vendor: 1,732 bytes, lines 33076-33170
33076			if (after !== "L") {
33077				after = "R";
33078			}
33079			if (before === after) {
33080				setValues(types, i, end, before);
33081			}
33082			i = end - 1;
33083		}
33084	}
33085	for (i = 0; i < strLength; ++i) {
33086		if (types[i] === "ON") {
33087			types[i] = e;
33088		}
33089	}
33090	for (i = 0; i < strLength; ++i) {
33091		t = types[i];
33092		if (isEven(levels[i])) {
33093			if (t === "R") {
33094				levels[i] += 1;
33095			} else if (t === "AN" || t === "EN") {
33096				levels[i] += 2;
33097			}
33098		} else if (t === "L" || t === "AN" || t === "EN") {
33099			levels[i] += 1;
33100		}
33101	}
33102	let highestLevel = -1;
33103	let lowestOddLevel = 99;
33104	let level;
33105	for (i = 0, ii = levels.length; i < ii; ++i) {
33106		level = levels[i];
33107		if (highestLevel < level) {
33108			highestLevel = level;
33109		}
33110		if (lowestOddLevel > level && isOdd(level)) {
33111			lowestOddLevel = level;
33112		}
33113	}
33114	for (level = highestLevel; level >= lowestOddLevel; --level) {
33115		let start = -1;
33116		for (i = 0, ii = levels.length; i < ii; ++i) {
33117			if (levels[i] < level) {
33118				if (start >= 0) {
33119					reverseValues(chars, start, i);
33120					start = -1;
33121				}
33122			} else if (start < 0) {
33123				start = i;
33124			}
33125		}
33126		if (start >= 0) {
33127			reverseValues(chars, start, levels.length);
33128		}
33129	}
33130	for (i = 0, ii = chars.length; i < ii; ++i) {
33131		const ch = chars[i];
33132		if (ch === "<" || ch === ">") {
33133			chars[i] = "";
33134		}
33135	}
33136	return createBidiText(chars.join(""), isLTR);
33137}
33138
33139;// ./src/core/font_substitutions.js
33140
33141
33142
33143
33144
33145
33146
33147
33148
33149
33150
33151
33152
33153const NORMAL = {
33154	style: "normal",
33155	weight: "normal"
33156};
33157const BOLD = {
33158	style: "normal",
33159	weight: "bold"
33160};
33161const ITALIC = {
33162	style: "italic",
33163	weight: "normal"
33164};
33165const BOLDITALIC = {
33166	style: "italic",
33167	weight: "bold"
33168};
33169const substitutionMap = new Map([["Times-Roman", {
33170	local: ["Times New Roman", "Times-Roman", "Times", "Liberation Serif", "Nimbus Roman", "Nimbus Roman 
vendor: 5,884 bytes, lines 33170-33366
33170L", "Tinos", "Thorndale", "TeX Gyre Termes", "FreeSerif", "Linux Libertine O", "Libertinus Serif", "DejaVu Serif", "Bitstream Vera Serif", "Ubuntu"],
33171	style: NORMAL,
33172	ultimate: "serif"
33173}], ["Times-Bold", {
33174	alias: "Times-Roman",
33175	style: BOLD,
33176	ultimate: "serif"
33177}], ["Times-Italic", {
33178	alias: "Times-Roman",
33179	style: ITALIC,
33180	ultimate: "serif"
33181}], ["Times-BoldItalic", {
33182	alias: "Times-Roman",
33183	style: BOLDITALIC,
33184	ultimate: "serif"
33185}], ["Helvetica", {
33186	local: ["Helvetica", "Helvetica Neue", "Arial", "Arial Nova", "Liberation Sans", "Arimo", "Nimbus Sans", "Nimbus Sans L", "A030", "TeX Gyre Heros", "FreeSans", "DejaVu Sans", "Albany", "Bitstream Vera Sans", "Arial Unicode MS", "Microsoft Sans Serif", "Apple Symbols", "Cantarell"],
33187	path: "LiberationSans-Regular.ttf",
33188	style: NORMAL,
33189	ultimate: "sans-serif"
33190}], ["Helvetica-Bold", {
33191	alias: "Helvetica",
33192	path: "LiberationSans-Bold.ttf",
33193	style: BOLD,
33194	ultimate: "sans-serif"
33195}], ["Helvetica-Oblique", {
33196	alias: "Helvetica",
33197	path: "LiberationSans-Italic.ttf",
33198	style: ITALIC,
33199	ultimate: "sans-serif"
33200}], ["Helvetica-BoldOblique", {
33201	alias: "Helvetica",
33202	path: "LiberationSans-BoldItalic.ttf",
33203	style: BOLDITALIC,
33204	ultimate: "sans-serif"
33205}], ["Courier", {
33206	local: ["Courier", "Courier New", "Liberation Mono", "Nimbus Mono", "Nimbus Mono L", "Cousine", "Cumberland", "TeX Gyre Cursor", "FreeMono", "Linux Libertine Mono O", "Libertinus Mono"],
33207	style: NORMAL,
33208	ultimate: "monospace"
33209}], ["Courier-Bold", {
33210	alias: "Courier",
33211	style: BOLD,
33212	ultimate: "monospace"
33213}], ["Courier-Oblique", {
33214	alias: "Courier",
33215	style: ITALIC,
33216	ultimate: "monospace"
33217}], ["Courier-BoldOblique", {
33218	alias: "Courier",
33219	style: BOLDITALIC,
33220	ultimate: "monospace"
33221}], ["ArialBlack", {
33222	local: ["Arial Black"],
33223	style: {
33224		style: "normal",
33225		weight: "900"
33226	},
33227	fallback: "Helvetica-Bold"
33228}], ["ArialBlack-Bold", {
33229	alias: "ArialBlack"
33230}], ["ArialBlack-Italic", {
33231	alias: "ArialBlack",
33232	style: {
33233		style: "italic",
33234		weight: "900"
33235	},
33236	fallback: "Helvetica-BoldOblique"
33237}], ["ArialBlack-BoldItalic", {
33238	alias: "ArialBlack-Italic"
33239}], ["ArialNarrow", {
33240	local: ["Arial Narrow", "Liberation Sans Narrow", "Helvetica Condensed", "Nimbus Sans Narrow", "TeX Gyre Heros Cn"],
33241	style: NORMAL,
33242	fallback: "Helvetica"
33243}], ["ArialNarrow-Bold", {
33244	alias: "ArialNarrow",
33245	style: BOLD,
33246	fallback: "Helvetica-Bold"
33247}], ["ArialNarrow-Italic", {
33248	alias: "ArialNarrow",
33249	style: ITALIC,
33250	fallback: "Helvetica-Oblique"
33251}], ["ArialNarrow-BoldItalic", {
33252	alias: "ArialNarrow",
33253	style: BOLDITALIC,
33254	fallback: "Helvetica-BoldOblique"
33255}], ["Calibri", {
33256	local: ["Calibri", "Carlito"],
33257	style: NORMAL,
33258	fallback: "Helvetica"
33259}], ["Calibri-Bold", {
33260	alias: "Calibri",
33261	style: BOLD,
33262	fallback: "Helvetica-Bold"
33263}], ["Calibri-Italic", {
33264	alias: "Calibri",
33265	style: ITALIC,
33266	fallback: "Helvetica-Oblique"
33267}], ["Calibri-BoldItalic", {
33268	alias: "Calibri",
33269	style: BOLDITALIC,
33270	fallback: "Helvetica-BoldOblique"
33271}], ["Wingdings", {
33272	local: ["Wingdings", "URW Dingbats"],
33273	style: NORMAL
33274}], ["Wingdings-Regular", {
33275	alias: "Wingdings"
33276}], ["Wingdings-Bold", {
33277	alias: "Wingdings"
33278}]]);
33279const fontAliases = new Map([["Arial-Black", "ArialBlack"]]);
33280function getStyleToAppend(style) {
33281	switch (style) {
33282		case BOLD:
33283			return "Bold";
33284		case ITALIC:
33285			return "Italic";
33286		case BOLDITALIC:
33287			return "Bold Italic";
33288		default:
33289			if (style?.weight === "bold") {
33290				return "Bold";
33291			}
33292			if (style?.style === "italic") {
33293				return "Italic";
33294			}
33295	}
33296	return "";
33297}
33298function getFamilyName(str) {
33299	const keywords = new Set(["thin", "extralight", "ultralight", "demilight", "semilight", "light", "book", "regular", "normal", "medium", "demibold", "semibold", "bold", "extrabold", "ultrabold", "black", "heavy", "extrablack", "ultrablack", "roman", "italic", "oblique", "ultracondensed", "extracondensed", "condensed", "semicondensed", "normal", "semiexpanded", "expanded", "extraexpanded", "ultraexpanded", "bolditalic"]);
33300	return str.split(/[- ,+]+/g).filter(tok => !keywords.has(tok.toLowerCase())).join(" ");
33301}
33302function generateFont({
33303	alias,
33304	local,
33305	path,
33306	fallback,
33307	style,
33308	ultimate
33309}, src, localFontPath, useFallback = true, usePath = true, append = "") {
33310	const result = {
33311		style: null,
33312		ultimate: null
33313	};
33314	if (local) {
33315		const extra = append ? ` ${append}` : "";
33316		for (const name of local) {
33317			src.push(`local(${name}${extra})`);
33318		}
33319	}
33320	if (alias) {
33321		const substitution = substitutionMap.get(alias);
33322		const aliasAppend = append || getStyleToAppend(style);
33323		Object.assign(result, generateFont(substitution, src, localFontPath, useFallback && !fallback, usePath && !path, aliasAppend));
33324	}
33325	if (style) {
33326		result.style = style;
33327	}
33328	if (ultimate) {
33329		result.ultimate = ultimate;
33330	}
33331	if (useFallback && fallback) {
33332		const fallbackInfo = substitutionMap.get(fallback);
33333		const {
33334			ultimate: fallbackUltimate
33335		} = generateFont(fallbackInfo, src, localFontPath, useFallback, usePath && !path, append);
33336		result.ultimate ||= fallbackUltimate;
33337	}
33338	if (usePath && path && localFontPath) {
33339		src.push(`url(${localFontPath}${path})`);
33340	}
33341	return result;
33342}
33343function getFontSubstitution(systemFontCache, idFactory, localFontPath, baseFontName, standardFontName, type) {
33344	if (baseFontName.startsWith("InvalidPDFjsFont_")) {
33345		return null;
33346	}
33347	if ((type === "TrueType" || type === "Type1") && /^[A-Z]{6}\+/.test(baseFontName)) {
33348		baseFontName = baseFontName.slice(7);
33349	}
33350	baseFontName = normalizeFontName(baseFontName);
33351	const key = baseFontName;
33352	let substitutionInfo = systemFontCache.get(key);
33353	if (substitutionInfo) {
33354		return substitutionInfo;
33355	}
33356	let substitution = substitutionMap.get(baseFontName);
33357	if (!substitution) {
33358		for (const [alias, subst] of fontAliases) {
33359			if (baseFontName.startsWith(alias)) {
33360				baseFontName = `${subst}${baseFontName.substring(alias.length)}`;
33361				substitution = substitutionMap.get(baseFontName);
33362				break;
33363			}
33364		}
33365	}
33366	let mustAddBaseFont = false;
vendor: 5,055 bytes, lines 33367-33552
33367	if (!substitution) {
33368		substitution = substitutionMap.get(standardFontName);
33369		mustAddBaseFont = true;
33370	}
33371	const loadedName = `${idFactory.getDocId()}_s${idFactory.createFontId()}`;
33372	if (!substitution) {
33373		if (!validateFontName(baseFontName)) {
33374			warn(`Cannot substitute the font because of its name: ${baseFontName}`);
33375			systemFontCache.set(key, null);
33376			return null;
33377		}
33378		const bold = /bold/gi.test(baseFontName);
33379		const italic = /oblique|italic/gi.test(baseFontName);
33380		const style = bold && italic && BOLDITALIC || bold && BOLD || italic && ITALIC || NORMAL;
33381		substitutionInfo = {
33382			css: `"${getFamilyName(baseFontName)}",${loadedName}`,
33383			guessFallback: true,
33384			loadedName,
33385			baseFontName,
33386			src: `local(${baseFontName})`,
33387			style
33388		};
33389		systemFontCache.set(key, substitutionInfo);
33390		return substitutionInfo;
33391	}
33392	const src = [];
33393	if (mustAddBaseFont && validateFontName(baseFontName)) {
33394		src.push(`local(${baseFontName})`);
33395	}
33396	const {
33397		style,
33398		ultimate
33399	} = generateFont(substitution, src, localFontPath);
33400	const guessFallback = ultimate === null;
33401	const fallback = guessFallback ? "" : `,${ultimate}`;
33402	substitutionInfo = {
33403		css: `"${getFamilyName(baseFontName)}",${loadedName}${fallback}`,
33404		guessFallback,
33405		loadedName,
33406		baseFontName,
33407		src: src.join(","),
33408		style
33409	};
33410	systemFontCache.set(key, substitutionInfo);
33411	return substitutionInfo;
33412}
33413
33414;// ./src/core/image_resizer.js
33415
33416
33417
33418
33419
33420
33421
33422
33423
33424const MIN_IMAGE_DIM = 2048;
33425const MAX_IMAGE_DIM = 65537;
33426const MAX_ERROR = 128;
33427class ImageResizer {
33428	static #goodSquareLength = MIN_IMAGE_DIM;
33429	static #isImageDecoderSupported = FeatureTest.isImageDecoderSupported;
33430	constructor(imgData, isMask) {
33431		this._imgData = imgData;
33432		this._isMask = isMask;
33433	}
33434	static get canUseImageDecoder() {
33435		return shadow(this, "canUseImageDecoder", this.#isImageDecoderSupported ? ImageDecoder.isTypeSupported("image/bmp") : Promise.resolve(false));
33436	}
33437	static needsToBeResized(width, height) {
33438		if (width <= this.#goodSquareLength && height <= this.#goodSquareLength) {
33439			return false;
33440		}
33441		const {
33442			MAX_DIM
33443		} = this;
33444		if (width > MAX_DIM || height > MAX_DIM) {
33445			return true;
33446		}
33447		const area = width * height;
33448		if (this._hasMaxArea) {
33449			return area > this.MAX_AREA;
33450		}
33451		if (area < this.#goodSquareLength ** 2) {
33452			return false;
33453		}
33454		if (this._areGoodDims(width, height)) {
33455			this.#goodSquareLength = Math.max(this.#goodSquareLength, Math.floor(Math.sqrt(width * height)));
33456			return false;
33457		}
33458		this.#goodSquareLength = this._guessMax(this.#goodSquareLength, MAX_DIM, MAX_ERROR, 0);
33459		const maxArea = this.MAX_AREA = this.#goodSquareLength ** 2;
33460		return area > maxArea;
33461	}
33462	static get MAX_DIM() {
33463		return shadow(this, "MAX_DIM", this._guessMax(MIN_IMAGE_DIM, MAX_IMAGE_DIM, 0, 1));
33464	}
33465	static get MAX_AREA() {
33466		this._hasMaxArea = true;
33467		return shadow(this, "MAX_AREA", this._guessMax(this.#goodSquareLength, this.MAX_DIM, MAX_ERROR, 0) ** 2);
33468	}
33469	static set MAX_AREA(area) {
33470		if (area >= 0) {
33471			this._hasMaxArea = true;
33472			shadow(this, "MAX_AREA", area);
33473		}
33474	}
33475	static setOptions({
33476		canvasMaxAreaInBytes = -1,
33477		isImageDecoderSupported = false
33478	}) {
33479		if (!this._hasMaxArea) {
33480			this.MAX_AREA = canvasMaxAreaInBytes >> 2;
33481		}
33482		this.#isImageDecoderSupported = isImageDecoderSupported;
33483	}
33484	static _areGoodDims(width, height) {
33485		try {
33486			const canvas = new OffscreenCanvas(width, height);
33487			const ctx = canvas.getContext("2d");
33488			ctx.fillRect(0, 0, 1, 1);
33489			const opacity = ctx.getImageData(0, 0, 1, 1).data[3];
33490			canvas.width = canvas.height = 1;
33491			return opacity !== 0;
33492		} catch {
33493			return false;
33494		}
33495	}
33496	static _guessMax(start, end, tolerance, defaultHeight) {
33497		while (start + tolerance + 1 < end) {
33498			const middle = Math.floor((start + end) / 2);
33499			const height = defaultHeight || middle;
33500			if (this._areGoodDims(middle, height)) {
33501				start = middle;
33502			} else {
33503				end = middle;
33504			}
33505		}
33506		return start;
33507	}
33508	static async createImage(imgData, isMask = false) {
33509		return new ImageResizer(imgData, isMask)._createImage();
33510	}
33511	async _createImage() {
33512		const {
33513			_imgData: imgData
33514		} = this;
33515		const {
33516			width,
33517			height
33518		} = imgData;
33519		if (width * height * 4 > MAX_INT_32) {
33520			const result = this.#rescaleImageData();
33521			if (result) {
33522				return result;
33523			}
33524		}
33525		const data = this._encodeBMP();
33526		let decoder, imagePromise;
33527		if (await ImageResizer.canUseImageDecoder) {
33528			decoder = new ImageDecoder({
33529				data,
33530				type: "image/bmp",
33531				preferAnimation: false,
33532				transfer: [data.buffer]
33533			});
33534			imagePromise = decoder.decode().catch(reason => {
33535				warn(`BMP image decoding failed: ${reason}`);
33536				return createImageBitmap(new Blob([this._encodeBMP().buffer], {
33537					type: "image/bmp"
33538				}));
33539			}).finally(() => {
33540				decoder.close();
33541			});
33542		} else {
33543			imagePromise = createImageBitmap(new Blob([data.buffer], {
33544				type: "image/bmp"
33545			}));
33546		}
33547		const {
33548			MAX_AREA,
33549			MAX_DIM
33550		} = ImageResizer;
33551		const minFactor = Math.max(width / MAX_DIM, height / MAX_DIM, Math.sqrt(width * height / MAX_AREA));
33552		const firstFactor = Math.max(minFactor, 2);
vendor: 9,422 bytes, lines 33553-33906
33553		const factor = Math.round(10 * (minFactor + 1.25)) / 10 / firstFactor;
33554		const N = Math.floor(Math.log2(factor));
33555		const steps = new Array(N + 2).fill(2);
33556		steps[0] = firstFactor;
33557		steps.splice(-1, 1, factor / (1 << N));
33558		let newWidth = width;
33559		let newHeight = height;
33560		const result = await imagePromise;
33561		let bitmap = result.image || result;
33562		for (const step of steps) {
33563			const prevWidth = newWidth;
33564			const prevHeight = newHeight;
33565			newWidth = Math.floor(newWidth / step) - 1;
33566			newHeight = Math.floor(newHeight / step) - 1;
33567			const canvas = new OffscreenCanvas(newWidth, newHeight);
33568			const ctx = canvas.getContext("2d");
33569			ctx.drawImage(bitmap, 0, 0, prevWidth, prevHeight, 0, 0, newWidth, newHeight);
33570			bitmap.close();
33571			bitmap = canvas.transferToImageBitmap();
33572		}
33573		imgData.data = null;
33574		imgData.bitmap = bitmap;
33575		imgData.width = newWidth;
33576		imgData.height = newHeight;
33577		return imgData;
33578	}
33579	#rescaleImageData() {
33580		const {
33581			_imgData: imgData
33582		} = this;
33583		const {
33584			data,
33585			width,
33586			height,
33587			kind
33588		} = imgData;
33589		const rgbaSize = width * height * 4;
33590		const K = Math.ceil(Math.log2(rgbaSize / MAX_INT_32));
33591		const newWidth = width >> K;
33592		const newHeight = height >> K;
33593		let rgbaData;
33594		let maxHeight = height;
33595		try {
33596			rgbaData = new Uint8Array(rgbaSize);
33597		} catch {
33598			let n = Math.floor(Math.log2(rgbaSize + 1));
33599			while (true) {
33600				try {
33601					rgbaData = new Uint8Array(2 ** n - 1);
33602					break;
33603				} catch {
33604					n -= 1;
33605				}
33606			}
33607			maxHeight = Math.floor((2 ** n - 1) / (width * 4));
33608			const newSize = width * maxHeight * 4;
33609			if (newSize < rgbaData.length) {
33610				rgbaData = new Uint8Array(newSize);
33611			}
33612		}
33613		const src32 = new Uint32Array(rgbaData.buffer);
33614		const dest32 = new Uint32Array(newWidth * newHeight);
33615		let srcPos = 0;
33616		let newIndex = 0;
33617		const step = Math.ceil(height / maxHeight);
33618		const remainder = height % maxHeight === 0 ? height : height % maxHeight;
33619		for (let k = 0; k < step; k++) {
33620			const h = k < step - 1 ? maxHeight : remainder;
33621			({
33622				srcPos
33623			} = convertToRGBA({
33624				kind,
33625				src: data,
33626				dest: src32,
33627				width,
33628				height: h,
33629				inverseDecode: this._isMask,
33630				srcPos
33631			}));
33632			for (let i = 0, ii = h >> K; i < ii; i++) {
33633				const buf = src32.subarray((i << K) * width);
33634				for (let j = 0; j < newWidth; j++) {
33635					dest32[newIndex++] = buf[j << K];
33636				}
33637			}
33638		}
33639		if (ImageResizer.needsToBeResized(newWidth, newHeight)) {
33640			imgData.data = dest32;
33641			imgData.width = newWidth;
33642			imgData.height = newHeight;
33643			imgData.kind = ImageKind.RGBA_32BPP;
33644			return null;
33645		}
33646		const canvas = new OffscreenCanvas(newWidth, newHeight);
33647		const ctx = canvas.getContext("2d", {
33648			willReadFrequently: true
33649		});
33650		ctx.putImageData(new ImageData(new Uint8ClampedArray(dest32.buffer), newWidth, newHeight), 0, 0);
33651		imgData.data = null;
33652		imgData.bitmap = canvas.transferToImageBitmap();
33653		imgData.width = newWidth;
33654		imgData.height = newHeight;
33655		return imgData;
33656	}
33657	_encodeBMP() {
33658		const {
33659			width,
33660			height,
33661			kind
33662		} = this._imgData;
33663		let data = this._imgData.data;
33664		let bitPerPixel;
33665		let colorTable = new Uint8Array(0);
33666		let maskTable = colorTable;
33667		let compression = 0;
33668		switch (kind) {
33669			case ImageKind.GRAYSCALE_1BPP:
33670				{
33671					bitPerPixel = 1;
33672					colorTable = new Uint8Array(this._isMask ? [255, 255, 255, 255, 0, 0, 0, 0] : [0, 0, 0, 0, 255, 255, 255, 255]);
33673					const rowLen = width + 7 >> 3;
33674					const rowSize = rowLen + 3 & -4;
33675					if (rowLen !== rowSize) {
33676						const newData = new Uint8Array(rowSize * height);
33677						let k = 0;
33678						for (let i = 0, ii = height * rowLen; i < ii; i += rowLen, k += rowSize) {
33679							newData.set(data.subarray(i, i + rowLen), k);
33680						}
33681						data = newData;
33682					}
33683					break;
33684				}
33685			case ImageKind.RGB_24BPP:
33686				{
33687					bitPerPixel = 24;
33688					if (width & 3) {
33689						const rowLen = 3 * width;
33690						const rowSize = rowLen + 3 & -4;
33691						const extraLen = rowSize - rowLen;
33692						const newData = new Uint8Array(rowSize * height);
33693						let k = 0;
33694						for (let i = 0, ii = height * rowLen; i < ii; i += rowLen) {
33695							const row = data.subarray(i, i + rowLen);
33696							for (let j = 0; j < rowLen; j += 3) {
33697								newData[k++] = row[j + 2];
33698								newData[k++] = row[j + 1];
33699								newData[k++] = row[j];
33700							}
33701							k += extraLen;
33702						}
33703						data = newData;
33704					} else {
33705						for (let i = 0, ii = data.length; i < ii; i += 3) {
33706							const tmp = data[i];
33707							data[i] = data[i + 2];
33708							data[i + 2] = tmp;
33709						}
33710					}
33711					break;
33712				}
33713			case ImageKind.RGBA_32BPP:
33714				bitPerPixel = 32;
33715				compression = 3;
33716				maskTable = new Uint8Array(4 + 4 + 4 + 4 + 52);
33717				const view = new DataView(maskTable.buffer);
33718				if (FeatureTest.isLittleEndian) {
33719					view.setUint32(0, 0x000000ff, true);
33720					view.setUint32(4, 0x0000ff00, true);
33721					view.setUint32(8, 0x00ff0000, true);
33722					view.setUint32(12, 0xff000000, true);
33723				} else {
33724					view.setUint32(0, 0xff000000, true);
33725					view.setUint32(4, 0x00ff0000, true);
33726					view.setUint32(8, 0x0000ff00, true);
33727					view.setUint32(12, 0x000000ff, true);
33728				}
33729				break;
33730			default:
33731				throw new Error("invalid format");
33732		}
33733		let i = 0;
33734		const headerLength = 40 + maskTable.length;
33735		const fileLength = 14 + headerLength + colorTable.length + data.length;
33736		const bmpData = new Uint8Array(fileLength);
33737		const view = new DataView(bmpData.buffer);
33738		view.setUint16(i, 0x4d42, true);
33739		i += 2;
33740		view.setUint32(i, fileLength, true);
33741		i += 4;
33742		view.setUint32(i, 0, true);
33743		i += 4;
33744		view.setUint32(i, 14 + headerLength + colorTable.length, true);
33745		i += 4;
33746		view.setUint32(i, headerLength, true);
33747		i += 4;
33748		view.setInt32(i, width, true);
33749		i += 4;
33750		view.setInt32(i, -height, true);
33751		i += 4;
33752		view.setUint16(i, 1, true);
33753		i += 2;
33754		view.setUint16(i, bitPerPixel, true);
33755		i += 2;
33756		view.setUint32(i, compression, true);
33757		i += 4;
33758		view.setUint32(i, 0, true);
33759		i += 4;
33760		view.setInt32(i, 0, true);
33761		i += 4;
33762		view.setInt32(i, 0, true);
33763		i += 4;
33764		view.setUint32(i, colorTable.length / 4, true);
33765		i += 4;
33766		view.setUint32(i, 0, true);
33767		i += 4;
33768		bmpData.set(maskTable, i);
33769		i += maskTable.length;
33770		bmpData.set(colorTable, i);
33771		i += colorTable.length;
33772		bmpData.set(data, i);
33773		return bmpData;
33774	}
33775}
33776
33777;// ./src/shared/murmurhash3.js
33778
33779
33780
33781
33782
33783
33784const SEED = 0xc3d2e1f0;
33785const MASK_HIGH = 0xffff0000;
33786const MASK_LOW = 0xffff;
33787class MurmurHash3_64 {
33788	constructor(seed) {
33789		this.h1 = seed ? seed & 0xffffffff : SEED;
33790		this.h2 = seed ? seed & 0xffffffff : SEED;
33791	}
33792	update(input) {
33793		let data, length;
33794		if (typeof input === "string") {
33795			data = new Uint8Array(input.length * 2);
33796			length = 0;
33797			for (let i = 0, ii = input.length; i < ii; i++) {
33798				const code = input.charCodeAt(i);
33799				if (code <= 0xff) {
33800					data[length++] = code;
33801				} else {
33802					data[length++] = code >>> 8;
33803					data[length++] = code & 0xff;
33804				}
33805			}
33806		} else if (ArrayBuffer.isView(input)) {
33807			data = input.slice();
33808			length = data.byteLength;
33809		} else {
33810			throw new Error("Invalid data format, must be a string or TypedArray.");
33811		}
33812		const blockCounts = length >> 2;
33813		const tailLength = length - blockCounts * 4;
33814		const dataUint32 = new Uint32Array(data.buffer, 0, blockCounts);
33815		let k1 = 0,
33816			k2 = 0;
33817		let h1 = this.h1,
33818			h2 = this.h2;
33819		const C1 = 0xcc9e2d51,
33820			C2 = 0x1b873593;
33821		const C1_LOW = C1 & MASK_LOW,
33822			C2_LOW = C2 & MASK_LOW;
33823		for (let i = 0; i < blockCounts; i++) {
33824			if (i & 1) {
33825				k1 = dataUint32[i];
33826				k1 = k1 * C1 & MASK_HIGH | k1 * C1_LOW & MASK_LOW;
33827				k1 = k1 << 15 | k1 >>> 17;
33828				k1 = k1 * C2 & MASK_HIGH | k1 * C2_LOW & MASK_LOW;
33829				h1 ^= k1;
33830				h1 = h1 << 13 | h1 >>> 19;
33831				h1 = h1 * 5 + 0xe6546b64;
33832			} else {
33833				k2 = dataUint32[i];
33834				k2 = k2 * C1 & MASK_HIGH | k2 * C1_LOW & MASK_LOW;
33835				k2 = k2 << 15 | k2 >>> 17;
33836				k2 = k2 * C2 & MASK_HIGH | k2 * C2_LOW & MASK_LOW;
33837				h2 ^= k2;
33838				h2 = h2 << 13 | h2 >>> 19;
33839				h2 = h2 * 5 + 0xe6546b64;
33840			}
33841		}
33842		k1 = 0;
33843		switch (tailLength) {
33844			case 3:
33845				k1 ^= data[blockCounts * 4 + 2] << 16;
33846			case 2:
33847				k1 ^= data[blockCounts * 4 + 1] << 8;
33848			case 1:
33849				k1 ^= data[blockCounts * 4];
33850				k1 = k1 * C1 & MASK_HIGH | k1 * C1_LOW & MASK_LOW;
33851				k1 = k1 << 15 | k1 >>> 17;
33852				k1 = k1 * C2 & MASK_HIGH | k1 * C2_LOW & MASK_LOW;
33853				if (blockCounts & 1) {
33854					h1 ^= k1;
33855				} else {
33856					h2 ^= k1;
33857				}
33858		}
33859		this.h1 = h1;
33860		this.h2 = h2;
33861	}
33862	hexdigest() {
33863		let h1 = this.h1,
33864			h2 = this.h2;
33865		h1 ^= h2 >>> 1;
33866		h1 = h1 * 0xed558ccd & MASK_HIGH | h1 * 0x8ccd & MASK_LOW;
33867		h2 = h2 * 0xff51afd7 & MASK_HIGH | ((h2 << 16 | h1 >>> 16) * 0xafd7ed55 & MASK_HIGH) >>> 16;
33868		h1 ^= h2 >>> 1;
33869		h1 = h1 * 0x1a85ec53 & MASK_HIGH | h1 * 0xec53 & MASK_LOW;
33870		h2 = h2 * 0xc4ceb9fe & MASK_HIGH | ((h2 << 16 | h1 >>> 16) * 0xb9fe1a85 & MASK_HIGH) >>> 16;
33871		h1 ^= h2 >>> 1;
33872		return (h1 >>> 0).toString(16).padStart(8, "0") + (h2 >>> 0).toString(16).padStart(8, "0");
33873	}
33874}
33875
33876;// ./src/core/operator_list.js
33877
33878
33879
33880
33881
33882
33883
33884
33885
33886
33887
33888
33889
33890
33891
33892function addState(parentState, pattern, checkFn, iterateFn, processFn) {
33893	let state = parentState;
33894	for (let i = 0, ii = pattern.length - 1; i < ii; i++) {
33895		const item = pattern[i];
33896		state = state[item] ||= [];
33897	}
33898	state[pattern.at(-1)] = {
33899		checkFn,
33900		iterateFn,
33901		processFn
33902	};
33903}
33904const InitialState = [];
33905addState(InitialState, [OPS.save, OPS.transform, OPS.paintInlineImageXObject, OPS.restore], null, function iterateInlineImageGroup(context, i) {
33906	const fnArray = context.fnArray;
vendor: 14,522 bytes, lines 33907-34354
33907	const iFirstSave = context.iCurr - 3;
33908	const pos = (i - iFirstSave) % 4;
33909	switch (pos) {
33910		case 0:
33911			return fnArray[i] === OPS.save;
33912		case 1:
33913			return fnArray[i] === OPS.transform;
33914		case 2:
33915			return fnArray[i] === OPS.paintInlineImageXObject;
33916		case 3:
33917			return fnArray[i] === OPS.restore;
33918	}
33919	throw new Error(`iterateInlineImageGroup - invalid pos: ${pos}`);
33920}, function foundInlineImageGroup(context, i) {
33921	const MIN_IMAGES_IN_INLINE_IMAGES_BLOCK = 10;
33922	const MAX_IMAGES_IN_INLINE_IMAGES_BLOCK = 200;
33923	const MAX_WIDTH = 1000;
33924	const IMAGE_PADDING = 1;
33925	const fnArray = context.fnArray,
33926		argsArray = context.argsArray;
33927	const curr = context.iCurr;
33928	const iFirstSave = curr - 3;
33929	const iFirstTransform = curr - 2;
33930	const iFirstPIIXO = curr - 1;
33931	const count = Math.min(Math.floor((i - iFirstSave) / 4), MAX_IMAGES_IN_INLINE_IMAGES_BLOCK);
33932	if (count < MIN_IMAGES_IN_INLINE_IMAGES_BLOCK) {
33933		return i - (i - iFirstSave) % 4;
33934	}
33935	let maxX = 0;
33936	const map = [];
33937	let maxLineHeight = 0;
33938	let currentX = IMAGE_PADDING,
33939		currentY = IMAGE_PADDING;
33940	for (let q = 0; q < count; q++) {
33941		const transform = argsArray[iFirstTransform + (q << 2)];
33942		const img = argsArray[iFirstPIIXO + (q << 2)][0];
33943		if (currentX + img.width > MAX_WIDTH) {
33944			maxX = Math.max(maxX, currentX);
33945			currentY += maxLineHeight + 2 * IMAGE_PADDING;
33946			currentX = 0;
33947			maxLineHeight = 0;
33948		}
33949		map.push({
33950			transform,
33951			x: currentX,
33952			y: currentY,
33953			w: img.width,
33954			h: img.height
33955		});
33956		currentX += img.width + 2 * IMAGE_PADDING;
33957		maxLineHeight = Math.max(maxLineHeight, img.height);
33958	}
33959	const imgWidth = Math.max(maxX, currentX) + IMAGE_PADDING;
33960	const imgHeight = currentY + maxLineHeight + IMAGE_PADDING;
33961	const imgData = new Uint8Array(imgWidth * imgHeight * 4);
33962	const imgRowSize = imgWidth << 2;
33963	for (let q = 0; q < count; q++) {
33964		const data = argsArray[iFirstPIIXO + (q << 2)][0].data;
33965		const rowSize = map[q].w << 2;
33966		let dataOffset = 0;
33967		let offset = map[q].x + map[q].y * imgWidth << 2;
33968		imgData.set(data.subarray(0, rowSize), offset - imgRowSize);
33969		for (let k = 0, kk = map[q].h; k < kk; k++) {
33970			imgData.set(data.subarray(dataOffset, dataOffset + rowSize), offset);
33971			dataOffset += rowSize;
33972			offset += imgRowSize;
33973		}
33974		imgData.set(data.subarray(dataOffset - rowSize, dataOffset), offset);
33975		while (offset >= 0) {
33976			data[offset - 4] = data[offset];
33977			data[offset - 3] = data[offset + 1];
33978			data[offset - 2] = data[offset + 2];
33979			data[offset - 1] = data[offset + 3];
33980			data[offset + rowSize] = data[offset + rowSize - 4];
33981			data[offset + rowSize + 1] = data[offset + rowSize - 3];
33982			data[offset + rowSize + 2] = data[offset + rowSize - 2];
33983			data[offset + rowSize + 3] = data[offset + rowSize - 1];
33984			offset -= imgRowSize;
33985		}
33986	}
33987	const img = {
33988		width: imgWidth,
33989		height: imgHeight
33990	};
33991	if (context.isOffscreenCanvasSupported) {
33992		const canvas = new OffscreenCanvas(imgWidth, imgHeight);
33993		const ctx = canvas.getContext("2d");
33994		ctx.putImageData(new ImageData(new Uint8ClampedArray(imgData.buffer), imgWidth, imgHeight), 0, 0);
33995		img.bitmap = canvas.transferToImageBitmap();
33996		img.data = null;
33997	} else {
33998		img.kind = ImageKind.RGBA_32BPP;
33999		img.data = imgData;
34000	}
34001	fnArray.splice(iFirstSave, count * 4, OPS.paintInlineImageXObjectGroup);
34002	argsArray.splice(iFirstSave, count * 4, [img, map]);
34003	return iFirstSave + 1;
34004});
34005addState(InitialState, [OPS.save, OPS.transform, OPS.paintImageMaskXObject, OPS.restore], null, function iterateImageMaskGroup(context, i) {
34006	const fnArray = context.fnArray;
34007	const iFirstSave = context.iCurr - 3;
34008	const pos = (i - iFirstSave) % 4;
34009	switch (pos) {
34010		case 0:
34011			return fnArray[i] === OPS.save;
34012		case 1:
34013			return fnArray[i] === OPS.transform;
34014		case 2:
34015			return fnArray[i] === OPS.paintImageMaskXObject;
34016		case 3:
34017			return fnArray[i] === OPS.restore;
34018	}
34019	throw new Error(`iterateImageMaskGroup - invalid pos: ${pos}`);
34020}, function foundImageMaskGroup(context, i) {
34021	const MIN_IMAGES_IN_MASKS_BLOCK = 10;
34022	const MAX_IMAGES_IN_MASKS_BLOCK = 100;
34023	const MAX_SAME_IMAGES_IN_MASKS_BLOCK = 1000;
34024	const fnArray = context.fnArray,
34025		argsArray = context.argsArray;
34026	const curr = context.iCurr;
34027	const iFirstSave = curr - 3;
34028	const iFirstTransform = curr - 2;
34029	const iFirstPIMXO = curr - 1;
34030	let count = Math.floor((i - iFirstSave) / 4);
34031	if (count < MIN_IMAGES_IN_MASKS_BLOCK) {
34032		return i - (i - iFirstSave) % 4;
34033	}
34034	let isSameImage = false;
34035	let iTransform, transformArgs;
34036	const firstPIMXOArg0 = argsArray[iFirstPIMXO][0];
34037	const firstTransformArg0 = argsArray[iFirstTransform][0],
34038		firstTransformArg1 = argsArray[iFirstTransform][1],
34039		firstTransformArg2 = argsArray[iFirstTransform][2],
34040		firstTransformArg3 = argsArray[iFirstTransform][3];
34041	if (firstTransformArg1 === firstTransformArg2) {
34042		isSameImage = true;
34043		iTransform = iFirstTransform + 4;
34044		let iPIMXO = iFirstPIMXO + 4;
34045		for (let q = 1; q < count; q++, iTransform += 4, iPIMXO += 4) {
34046			transformArgs = argsArray[iTransform];
34047			if (argsArray[iPIMXO][0] !== firstPIMXOArg0 || transformArgs[0] !== firstTransformArg0 || transformArgs[1] !== firstTransformArg1 || transformArgs[2] !== firstTransformArg2 || transformArgs[3] !== firstTransformArg3) {
34048				if (q < MIN_IMAGES_IN_MASKS_BLOCK) {
34049					isSameImage = false;
34050				} else {
34051					count = q;
34052				}
34053				break;
34054			}
34055		}
34056	}
34057	if (isSameImage) {
34058		count = Math.min(count, MAX_SAME_IMAGES_IN_MASKS_BLOCK);
34059		const positions = new Float32Array(count * 2);
34060		iTransform = iFirstTransform;
34061		for (let q = 0; q < count; q++, iTransform += 4) {
34062			transformArgs = argsArray[iTransform];
34063			positions[q << 1] = transformArgs[4];
34064			positions[(q << 1) + 1] = transformArgs[5];
34065		}
34066		fnArray.splice(iFirstSave, count * 4, OPS.paintImageMaskXObjectRepeat);
34067		argsArray.splice(iFirstSave, count * 4, [firstPIMXOArg0, firstTransformArg0, firstTransformArg1, firstTransformArg2, firstTransformArg3, positions]);
34068	} else {
34069		count = Math.min(count, MAX_IMAGES_IN_MASKS_BLOCK);
34070		const images = [];
34071		for (let q = 0; q < count; q++) {
34072			transformArgs = argsArray[iFirstTransform + (q << 2)];
34073			const maskParams = argsArray[iFirstPIMXO + (q << 2)][0];
34074			images.push({
34075				data: maskParams.data,
34076				width: maskParams.width,
34077				height: maskParams.height,
34078				interpolate: maskParams.interpolate,
34079				count: maskParams.count,
34080				transform: transformArgs
34081			});
34082		}
34083		fnArray.splice(iFirstSave, count * 4, OPS.paintImageMaskXObjectGroup);
34084		argsArray.splice(iFirstSave, count * 4, [images]);
34085	}
34086	return iFirstSave + 1;
34087});
34088addState(InitialState, [OPS.save, OPS.transform, OPS.paintImageXObject, OPS.restore], function (context) {
34089	const argsArray = context.argsArray;
34090	const iFirstTransform = context.iCurr - 2;
34091	return argsArray[iFirstTransform][1] === 0 && argsArray[iFirstTransform][2] === 0;
34092}, function iterateImageGroup(context, i) {
34093	const fnArray = context.fnArray,
34094		argsArray = context.argsArray;
34095	const iFirstSave = context.iCurr - 3;
34096	const pos = (i - iFirstSave) % 4;
34097	switch (pos) {
34098		case 0:
34099			return fnArray[i] === OPS.save;
34100		case 1:
34101			if (fnArray[i] !== OPS.transform) {
34102				return false;
34103			}
34104			const iFirstTransform = context.iCurr - 2;
34105			const firstTransformArg0 = argsArray[iFirstTransform][0];
34106			const firstTransformArg3 = argsArray[iFirstTransform][3];
34107			if (argsArray[i][0] !== firstTransformArg0 || argsArray[i][1] !== 0 || argsArray[i][2] !== 0 || argsArray[i][3] !== firstTransformArg3) {
34108				return false;
34109			}
34110			return true;
34111		case 2:
34112			if (fnArray[i] !== OPS.paintImageXObject) {
34113				return false;
34114			}
34115			const iFirstPIXO = context.iCurr - 1;
34116			const firstPIXOArg0 = argsArray[iFirstPIXO][0];
34117			if (argsArray[i][0] !== firstPIXOArg0) {
34118				return false;
34119			}
34120			return true;
34121		case 3:
34122			return fnArray[i] === OPS.restore;
34123	}
34124	throw new Error(`iterateImageGroup - invalid pos: ${pos}`);
34125}, function (context, i) {
34126	const MIN_IMAGES_IN_BLOCK = 3;
34127	const MAX_IMAGES_IN_BLOCK = 1000;
34128	const fnArray = context.fnArray,
34129		argsArray = context.argsArray;
34130	const curr = context.iCurr;
34131	const iFirstSave = curr - 3;
34132	const iFirstTransform = curr - 2;
34133	const iFirstPIXO = curr - 1;
34134	const firstPIXOArg0 = argsArray[iFirstPIXO][0];
34135	const firstTransformArg0 = argsArray[iFirstTransform][0];
34136	const firstTransformArg3 = argsArray[iFirstTransform][3];
34137	const count = Math.min(Math.floor((i - iFirstSave) / 4), MAX_IMAGES_IN_BLOCK);
34138	if (count < MIN_IMAGES_IN_BLOCK) {
34139		return i - (i - iFirstSave) % 4;
34140	}
34141	const positions = new Float32Array(count * 2);
34142	let iTransform = iFirstTransform;
34143	for (let q = 0; q < count; q++, iTransform += 4) {
34144		const transformArgs = argsArray[iTransform];
34145		positions[q << 1] = transformArgs[4];
34146		positions[(q << 1) + 1] = transformArgs[5];
34147	}
34148	const args = [firstPIXOArg0, firstTransformArg0, firstTransformArg3, positions];
34149	fnArray.splice(iFirstSave, count * 4, OPS.paintImageXObjectRepeat);
34150	argsArray.splice(iFirstSave, count * 4, args);
34151	return iFirstSave + 1;
34152});
34153addState(InitialState, [OPS.beginText, OPS.setFont, OPS.setTextMatrix, OPS.showText, OPS.endText], null, function iterateShowTextGroup(context, i) {
34154	const fnArray = context.fnArray,
34155		argsArray = context.argsArray;
34156	const iFirstSave = context.iCurr - 4;
34157	const pos = (i - iFirstSave) % 5;
34158	switch (pos) {
34159		case 0:
34160			return fnArray[i] === OPS.beginText;
34161		case 1:
34162			return fnArray[i] === OPS.setFont;
34163		case 2:
34164			return fnArray[i] === OPS.setTextMatrix;
34165		case 3:
34166			if (fnArray[i] !== OPS.showText) {
34167				return false;
34168			}
34169			const iFirstSetFont = context.iCurr - 3;
34170			const firstSetFontArg0 = argsArray[iFirstSetFont][0];
34171			const firstSetFontArg1 = argsArray[iFirstSetFont][1];
34172			if (argsArray[i][0] !== firstSetFontArg0 || argsArray[i][1] !== firstSetFontArg1) {
34173				return false;
34174			}
34175			return true;
34176		case 4:
34177			return fnArray[i] === OPS.endText;
34178	}
34179	throw new Error(`iterateShowTextGroup - invalid pos: ${pos}`);
34180}, function (context, i) {
34181	const MIN_CHARS_IN_BLOCK = 3;
34182	const MAX_CHARS_IN_BLOCK = 1000;
34183	const fnArray = context.fnArray,
34184		argsArray = context.argsArray;
34185	const curr = context.iCurr;
34186	const iFirstBeginText = curr - 4;
34187	const iFirstSetFont = curr - 3;
34188	const iFirstSetTextMatrix = curr - 2;
34189	const iFirstShowText = curr - 1;
34190	const iFirstEndText = curr;
34191	const firstSetFontArg0 = argsArray[iFirstSetFont][0];
34192	const firstSetFontArg1 = argsArray[iFirstSetFont][1];
34193	let count = Math.min(Math.floor((i - iFirstBeginText) / 5), MAX_CHARS_IN_BLOCK);
34194	if (count < MIN_CHARS_IN_BLOCK) {
34195		return i - (i - iFirstBeginText) % 5;
34196	}
34197	let iFirst = iFirstBeginText;
34198	if (iFirstBeginText >= 4 && fnArray[iFirstBeginText - 4] === fnArray[iFirstSetFont] && fnArray[iFirstBeginText - 3] === fnArray[iFirstSetTextMatrix] && fnArray[iFirstBeginText - 2] === fnArray[iFirstShowText] && fnArray[iFirstBeginText - 1] === fnArray[iFirstEndText] && argsArray[iFirstBeginText - 4][0] === firstSetFontArg0 && argsArray[iFirstBeginText - 4][1] === firstSetFontArg1) {
34199		count++;
34200		iFirst -= 5;
34201	}
34202	let iEndText = iFirst + 4;
34203	for (let q = 1; q < count; q++) {
34204		fnArray.splice(iEndText, 3);
34205		argsArray.splice(iEndText, 3);
34206		iEndText += 2;
34207	}
34208	return iEndText + 1;
34209});
34210class NullOptimizer {
34211	constructor(queue) {
34212		this.queue = queue;
34213	}
34214	_optimize() {}
34215	push(fn, args) {
34216		this.queue.fnArray.push(fn);
34217		this.queue.argsArray.push(args);
34218		this._optimize();
34219	}
34220	flush() {}
34221	reset() {}
34222}
34223class QueueOptimizer extends NullOptimizer {
34224	constructor(queue) {
34225		super(queue);
34226		this.state = null;
34227		this.context = {
34228			iCurr: 0,
34229			fnArray: queue.fnArray,
34230			argsArray: queue.argsArray,
34231			isOffscreenCanvasSupported: false
34232		};
34233		this.match = null;
34234		this.lastProcessed = 0;
34235	}
34236	set isOffscreenCanvasSupported(value) {
34237		this.context.isOffscreenCanvasSupported = value;
34238	}
34239	_optimize() {
34240		const fnArray = this.queue.fnArray;
34241		let i = this.lastProcessed,
34242			ii = fnArray.length;
34243		let state = this.state;
34244		let match = this.match;
34245		if (!state && !match && i + 1 === ii && !InitialState[fnArray[i]]) {
34246			this.lastProcessed = ii;
34247			return;
34248		}
34249		const context = this.context;
34250		while (i < ii) {
34251			if (match) {
34252				const iterate = (0, match.iterateFn)(context, i);
34253				if (iterate) {
34254					i++;
34255					continue;
34256				}
34257				i = (0, match.processFn)(context, i + 1);
34258				ii = fnArray.length;
34259				match = null;
34260				state = null;
34261				if (i >= ii) {
34262					break;
34263				}
34264			}
34265			state = (state || InitialState)[fnArray[i]];
34266			if (!state || Array.isArray(state)) {
34267				i++;
34268				continue;
34269			}
34270			context.iCurr = i;
34271			i++;
34272			if (state.checkFn && !(0, state.checkFn)(context)) {
34273				state = null;
34274				continue;
34275			}
34276			match = state;
34277			state = null;
34278		}
34279		this.state = state;
34280		this.match = match;
34281		this.lastProcessed = i;
34282	}
34283	flush() {
34284		while (this.match) {
34285			const length = this.queue.fnArray.length;
34286			this.lastProcessed = (0, this.match.processFn)(this.context, length);
34287			this.match = null;
34288			this.state = null;
34289			this._optimize();
34290		}
34291	}
34292	reset() {
34293		this.state = null;
34294		this.match = null;
34295		this.lastProcessed = 0;
34296	}
34297}
34298class OperatorList {
34299	static CHUNK_SIZE = 1000;
34300	static CHUNK_SIZE_ABOUT = this.CHUNK_SIZE - 5;
34301	constructor(intent = 0, streamSink) {
34302		this._streamSink = streamSink;
34303		this.fnArray = [];
34304		this.argsArray = [];
34305		this.optimizer = streamSink && !(intent & RenderingIntentFlag.OPLIST) ? new QueueOptimizer(this) : new NullOptimizer(this);
34306		this.dependencies = new Set();
34307		this._totalLength = 0;
34308		this.weight = 0;
34309		this._resolved = streamSink ? null : Promise.resolve();
34310	}
34311	set isOffscreenCanvasSupported(value) {
34312		this.optimizer.isOffscreenCanvasSupported = value;
34313	}
34314	get length() {
34315		return this.argsArray.length;
34316	}
34317	get ready() {
34318		return this._resolved || this._streamSink.ready;
34319	}
34320	get totalLength() {
34321		return this._totalLength + this.length;
34322	}
34323	addOp(fn, args) {
34324		this.optimizer.push(fn, args);
34325		this.weight++;
34326		if (this._streamSink) {
34327			if (this.weight >= OperatorList.CHUNK_SIZE) {
34328				this.flush();
34329			} else if (this.weight >= OperatorList.CHUNK_SIZE_ABOUT && (fn === OPS.restore || fn === OPS.endText)) {
34330				this.flush();
34331			}
34332		}
34333	}
34334	addImageOps(fn, args, optionalContent, hasMask = false) {
34335		if (hasMask) {
34336			this.addOp(OPS.save);
34337			this.addOp(OPS.setGState, [[["SMask", false]]]);
34338		}
34339		if (optionalContent !== undefined) {
34340			this.addOp(OPS.beginMarkedContentProps, ["OC", optionalContent]);
34341		}
34342		this.addOp(fn, args);
34343		if (optionalContent !== undefined) {
34344			this.addOp(OPS.endMarkedContent, []);
34345		}
34346		if (hasMask) {
34347			this.addOp(OPS.restore);
34348		}
34349	}
34350	addDependency(dependency) {
34351		if (this.dependencies.has(dependency)) {
34352			return;
34353		}
34354		this.dependencies.add(dependency);
vendor: 5,708 bytes, lines 34355-34586
34355		this.addOp(OPS.dependency, [dependency]);
34356	}
34357	addDependencies(dependencies) {
34358		for (const dependency of dependencies) {
34359			this.addDependency(dependency);
34360		}
34361	}
34362	addOpList(opList) {
34363		if (!(opList instanceof OperatorList)) {
34364			warn('addOpList - ignoring invalid "opList" parameter.');
34365			return;
34366		}
34367		for (const dependency of opList.dependencies) {
34368			this.dependencies.add(dependency);
34369		}
34370		for (let i = 0, ii = opList.length; i < ii; i++) {
34371			this.addOp(opList.fnArray[i], opList.argsArray[i]);
34372		}
34373	}
34374	getIR() {
34375		return {
34376			fnArray: this.fnArray,
34377			argsArray: this.argsArray,
34378			length: this.length
34379		};
34380	}
34381	get _transfers() {
34382		const transfers = [];
34383		const {
34384			fnArray,
34385			argsArray,
34386			length
34387		} = this;
34388		for (let i = 0; i < length; i++) {
34389			switch (fnArray[i]) {
34390				case OPS.paintInlineImageXObject:
34391				case OPS.paintInlineImageXObjectGroup:
34392				case OPS.paintImageMaskXObject:
34393					const arg = argsArray[i][0];
34394					if (!arg.cached && arg.data?.buffer instanceof ArrayBuffer) {
34395						transfers.push(arg.data.buffer);
34396					}
34397					break;
34398			}
34399		}
34400		return transfers;
34401	}
34402	flush(lastChunk = false, separateAnnots = null) {
34403		this.optimizer.flush();
34404		const length = this.length;
34405		this._totalLength += length;
34406		this._streamSink.enqueue({
34407			fnArray: this.fnArray,
34408			argsArray: this.argsArray,
34409			lastChunk,
34410			separateAnnots,
34411			length
34412		}, 1, this._transfers);
34413		this.dependencies.clear();
34414		this.fnArray.length = 0;
34415		this.argsArray.length = 0;
34416		this.weight = 0;
34417		this.optimizer.reset();
34418	}
34419}
34420
34421;// ./src/core/image.js
34422
34423
34424
34425
34426
34427
34428
34429
34430
34431
34432
34433
34434
34435
34436
34437function decodeAndClamp(value, addend, coefficient, max) {
34438	value = addend + value * coefficient;
34439	if (value < 0) {
34440		value = 0;
34441	} else if (value > max) {
34442		value = max;
34443	}
34444	return value;
34445}
34446function resizeImageMask(src, bpc, w1, h1, w2, h2) {
34447	const length = w2 * h2;
34448	let dest;
34449	if (bpc <= 8) {
34450		dest = new Uint8Array(length);
34451	} else if (bpc <= 16) {
34452		dest = new Uint16Array(length);
34453	} else {
34454		dest = new Uint32Array(length);
34455	}
34456	const xRatio = w1 / w2;
34457	const yRatio = h1 / h2;
34458	let i,
34459		j,
34460		py,
34461		newIndex = 0,
34462		oldIndex;
34463	const xScaled = new Uint16Array(w2);
34464	const w1Scanline = w1;
34465	for (i = 0; i < w2; i++) {
34466		xScaled[i] = Math.floor(i * xRatio);
34467	}
34468	for (i = 0; i < h2; i++) {
34469		py = Math.floor(i * yRatio) * w1Scanline;
34470		for (j = 0; j < w2; j++) {
34471			oldIndex = py + xScaled[j];
34472			dest[newIndex++] = src[oldIndex];
34473		}
34474	}
34475	return dest;
34476}
34477class PDFImage {
34478	constructor({
34479		xref,
34480		res,
34481		image,
34482		isInline = false,
34483		smask = null,
34484		mask = null,
34485		isMask = false,
34486		pdfFunctionFactory,
34487		localColorSpaceCache
34488	}) {
34489		this.image = image;
34490		const dict = image.dict;
34491		const filter = dict.get("F", "Filter");
34492		let filterName;
34493		if (filter instanceof Name) {
34494			filterName = filter.name;
34495		} else if (Array.isArray(filter)) {
34496			const filterZero = xref.fetchIfRef(filter[0]);
34497			if (filterZero instanceof Name) {
34498				filterName = filterZero.name;
34499			}
34500		}
34501		switch (filterName) {
34502			case "JPXDecode":
34503				({
34504					width: image.width,
34505					height: image.height,
34506					componentsCount: image.numComps,
34507					bitsPerComponent: image.bitsPerComponent
34508				} = JpxImage.parseImageProperties(image.stream));
34509				image.stream.reset();
34510				this.jpxDecoderOptions = {
34511					numComponents: 0,
34512					isIndexedColormap: false,
34513					smaskInData: dict.has("SMaskInData")
34514				};
34515				break;
34516			case "JBIG2Decode":
34517				image.bitsPerComponent = 1;
34518				image.numComps = 1;
34519				break;
34520		}
34521		let width = dict.get("W", "Width");
34522		let height = dict.get("H", "Height");
34523		if (Number.isInteger(image.width) && image.width > 0 && Number.isInteger(image.height) && image.height > 0 && (image.width !== width || image.height !== height)) {
34524			warn("PDFImage - using the Width/Height of the image data, " + "rather than the image dictionary.");
34525			width = image.width;
34526			height = image.height;
34527		}
34528		if (width < 1 || height < 1) {
34529			throw new FormatError(`Invalid image width: ${width} or height: ${height}`);
34530		}
34531		this.width = width;
34532		this.height = height;
34533		this.interpolate = dict.get("I", "Interpolate");
34534		this.imageMask = dict.get("IM", "ImageMask") || false;
34535		this.matte = dict.get("Matte") || false;
34536		let bitsPerComponent = image.bitsPerComponent;
34537		if (!bitsPerComponent) {
34538			bitsPerComponent = dict.get("BPC", "BitsPerComponent");
34539			if (!bitsPerComponent) {
34540				if (this.imageMask) {
34541					bitsPerComponent = 1;
34542				} else {
34543					throw new FormatError(`Bits per component missing in image: ${this.imageMask}`);
34544				}
34545			}
34546		}
34547		this.bpc = bitsPerComponent;
34548		if (!this.imageMask) {
34549			let colorSpace = dict.getRaw("CS") || dict.getRaw("ColorSpace");
34550			const hasColorSpace = !!colorSpace;
34551			if (!hasColorSpace) {
34552				if (this.jpxDecoderOptions) {
34553					colorSpace = Name.get("DeviceRGBA");
34554				} else {
34555					switch (image.numComps) {
34556						case 1:
34557							colorSpace = Name.get("DeviceGray");
34558							break;
34559						case 3:
34560							colorSpace = Name.get("DeviceRGB");
34561							break;
34562						case 4:
34563							colorSpace = Name.get("DeviceCMYK");
34564							break;
34565						default:
34566							throw new Error(`Images with ${image.numComps} color components not supported.`);
34567					}
34568				}
34569			} else if (this.jpxDecoderOptions?.smaskInData) {
34570				colorSpace = Name.get("DeviceRGBA");
34571			}
34572			this.colorSpace = ColorSpace.parse({
34573				cs: colorSpace,
34574				xref,
34575				resources: isInline ? res : null,
34576				pdfFunctionFactory,
34577				localColorSpaceCache
34578			});
34579			this.numComps = this.colorSpace.numComps;
34580			if (this.jpxDecoderOptions) {
34581				this.jpxDecoderOptions.numComponents = hasColorSpace ? this.numComp : 0;
34582				this.jpxDecoderOptions.isIndexedColormap = this.colorSpace.name === "Indexed";
34583			}
34584		}
34585		this.decode = dict.getArray("D", "Decode");
34586		this.needsDecode = false;
34587		if (this.decode && (this.colorSpace && !this.colorSpace.isDefaultDecode(this.decode, bitsPerComponent) || isMask && !ColorSpace.isDefaultDecode(this.decode, 1))) {
34588			this.needsDecode = true;
34589			const max = (1 << bitsPerComponent) - 1;
34590			this.decodeCoefficients = [];
34591			this.decodeAddends = [];
34592			const isIndexed = this.colorSpace?.name === "Indexed";
34593			for (let i = 0, j = 0; i < this.decode.length; i += 2, ++j) {
34594				const dmin = this.decode[i];
34595				const dmax = this.decode[i + 1];
34596				this.decodeCoefficients[j] = isIndexed ? (dmax - dmin) / max : dmax - dmin;
34597				this.decodeAddends[j] = isIndexed ? dmin : max * dmin;
34598			}
34599		}
34600		if (smask) {
34601			this.smask = new PDFImage({
34602				xref,
34603				res,
34604				image: smask,
34605				isInline,
34606				pdfFunctionFactory,
34607				localColorSpaceCache
34608			});
34609		} else if (mask) {
34610			if (mask instanceof BaseStream) {
34611				const maskDict = mask.dict,
34612					imageMask = maskDict.get("IM", "ImageMask");
34613				if (!imageMask) {
34614					warn("Ignoring /Mask in image without /ImageMask.");
34615				} else {
34616					this.mask = new PDFImage({
34617						xref,
34618						res,
34619						image: mask,
34620						isInline,
34621						isMask: true,
34622						pdfFunctionFactory,
34623						localColorSpaceCache
34624					});
34625				}
34626			} else {
34627				this.mask = mask;
34628			}
34629		}
34630	}
34631	static async buildImage({
34632		xref,
34633		res,
34634		image,
34635		isInline = false,
34636		pdfFunctionFactory,
34637		localColorSpaceCache
34638	}) {
34639		const imageData = image;
34640		let smaskData = null;
34641		let maskData = null;
34642		const smask = image.dict.get("SMask");
34643		const mask = image.dict.get("Mask");
34644		if (smask) {
34645			if (smask instanceof BaseStream) {
34646				smaskData = smask;
34647			} else {
34648				warn("Unsupported /SMask format.");
34649			}
34650		} else if (mask) {
34651			if (mask instanceof BaseStream || Array.isArray(mask)) {
34652				maskData = mask;
34653			} else {
34654				warn("Unsupported /Mask format.");
34655			}
34656		}
34657		return new PDFImage({
34658			xref,
34659			res,
34660			image: imageData,
34661			isInline,
34662			smask: smaskData,
34663			mask: maskData,
34664			pdfFunctionFactory,
34665			localColorSpaceCache
34666		});
34667	}
34668	static createRawMask({
34669		imgArray,
34670		width,
34671		height,
34672		imageIsFromDecodeStream,
34673		inverseDecode,
34674		interpolate
34675	}) {
34676		const computedLength = (width + 7 >> 3) * height;
34677		const actualLength = imgArray.byteLength;
34678		const haveFullData = computedLength === actualLength;
34679		let data, i;
34680		if (imageIsFromDecodeStream && (!inverseDecode || haveFullData)) {
34681			data = imgArray;
34682		} else if (!inverseDecode) {
34683			data = new Uint8Array(imgArray);
34684		} else {
34685			data = new Uint8Array(computedLength);
34686			data.set(imgArray);
34687			data.fill(0xff, actualLength);
34688		}
34689		if (inverseDecode) {
34690			for (i = 0; i < actualLength; i++) {
34691				data[i] ^= 0xff;
34692			}
34693		}
34694		return {
34695			data,
34696			width,
34697			height,
34698			interpolate
34699		};
34700	}
34701	static async createMask({
34702		imgArray,
34703		width,
34704		height,
34705		imageIsFromDecodeStream,
34706		inverseDecode,
34707		interpolate,
34708		isOffscreenCanvasSupported = false
34709	}) {
34710		const isSingleOpaquePixel = width === 1 && height === 1 && inverseDecode === (imgArray.length === 0 || !!(imgArray[0] & 128));
34711		if (isSingleOpaquePixel) {
34712			return {
34713				isSingleOpaquePixel
34714			};
34715		}
34716		if (isOffscreenCanvasSupported) {
34717			if (ImageResizer.needsToBeResized(width, height)) {
34718				const data = new Uint8ClampedArray(width * height * 4);
34719				convertBlackAndWhiteToRGBA({
34720					src: imgArray,
34721					dest: data,
34722					width,
34723					height,
34724					nonBlackColor: 0,
34725					inverseDecode
34726				});
34727				return ImageResizer.createImage({
34728					kind: ImageKind.RGBA_32BPP,
34729					data,
34730					width,
34731					height,
34732					interpolate
34733				});
34734			}
34735			const canvas = new OffscreenCanvas(width, height);
34736			const ctx = canvas.getContext("2d");
34737			const imgData = ctx.createImageData(width, height);
34738			convertBlackAndWhiteToRGBA({
34739				src: imgArray,
34740				dest: imgData.data,
34741				width,
34742				height,
34743				nonBlackColor: 0,
34744				inverseDecode
34745			});
34746			ctx.putImageData(imgData, 0, 0);
34747			const bitmap = canvas.transferToImageBitmap();
34748			return {
34749				data: null,
34750				width,
34751				height,
34752				interpolate,
34753				bitmap
34754			};
34755		}
34756		return this.createRawMask({
34757			imgArray,
34758			width,
34759			height,
34760			inverseDecode,
34761			imageIsFromDecodeStream,
34762			interpolate
34763		});
34764	}
34765	get drawWidth() {
34766		return Math.max(this.width, this.smask?.width || 0, this.mask?.width || 0);
34767	}
34768	get drawHeight() {
34769		return Math.max(this.height, this.smask?.height || 0, this.mask?.height || 0
vendor: 16,670 bytes, lines 34769-35421
34769);
34770	}
34771	decodeBuffer(buffer) {
34772		const bpc = this.bpc;
34773		const numComps = this.numComps;
34774		const decodeAddends = this.decodeAddends;
34775		const decodeCoefficients = this.decodeCoefficients;
34776		const max = (1 << bpc) - 1;
34777		let i, ii;
34778		if (bpc === 1) {
34779			for (i = 0, ii = buffer.length; i < ii; i++) {
34780				buffer[i] = +!buffer[i];
34781			}
34782			return;
34783		}
34784		let index = 0;
34785		for (i = 0, ii = this.width * this.height; i < ii; i++) {
34786			for (let j = 0; j < numComps; j++) {
34787				buffer[index] = decodeAndClamp(buffer[index], decodeAddends[j], decodeCoefficients[j], max);
34788				index++;
34789			}
34790		}
34791	}
34792	getComponents(buffer) {
34793		const bpc = this.bpc;
34794		if (bpc === 8) {
34795			return buffer;
34796		}
34797		const width = this.width;
34798		const height = this.height;
34799		const numComps = this.numComps;
34800		const length = width * height * numComps;
34801		let bufferPos = 0;
34802		let output;
34803		if (bpc <= 8) {
34804			output = new Uint8Array(length);
34805		} else if (bpc <= 16) {
34806			output = new Uint16Array(length);
34807		} else {
34808			output = new Uint32Array(length);
34809		}
34810		const rowComps = width * numComps;
34811		const max = (1 << bpc) - 1;
34812		let i = 0,
34813			ii,
34814			buf;
34815		if (bpc === 1) {
34816			let mask, loop1End, loop2End;
34817			for (let j = 0; j < height; j++) {
34818				loop1End = i + (rowComps & ~7);
34819				loop2End = i + rowComps;
34820				while (i < loop1End) {
34821					buf = buffer[bufferPos++];
34822					output[i] = buf >> 7 & 1;
34823					output[i + 1] = buf >> 6 & 1;
34824					output[i + 2] = buf >> 5 & 1;
34825					output[i + 3] = buf >> 4 & 1;
34826					output[i + 4] = buf >> 3 & 1;
34827					output[i + 5] = buf >> 2 & 1;
34828					output[i + 6] = buf >> 1 & 1;
34829					output[i + 7] = buf & 1;
34830					i += 8;
34831				}
34832				if (i < loop2End) {
34833					buf = buffer[bufferPos++];
34834					mask = 128;
34835					while (i < loop2End) {
34836						output[i++] = +!!(buf & mask);
34837						mask >>= 1;
34838					}
34839				}
34840			}
34841		} else {
34842			let bits = 0;
34843			buf = 0;
34844			for (i = 0, ii = length; i < ii; ++i) {
34845				if (i % rowComps === 0) {
34846					buf = 0;
34847					bits = 0;
34848				}
34849				while (bits < bpc) {
34850					buf = buf << 8 | buffer[bufferPos++];
34851					bits += 8;
34852				}
34853				const remainingBits = bits - bpc;
34854				let value = buf >> remainingBits;
34855				if (value < 0) {
34856					value = 0;
34857				} else if (value > max) {
34858					value = max;
34859				}
34860				output[i] = value;
34861				buf &= (1 << remainingBits) - 1;
34862				bits = remainingBits;
34863			}
34864		}
34865		return output;
34866	}
34867	async fillOpacity(rgbaBuf, width, height, actualHeight, image) {
34868		const smask = this.smask;
34869		const mask = this.mask;
34870		let alphaBuf, sw, sh, i, ii, j;
34871		if (smask) {
34872			sw = smask.width;
34873			sh = smask.height;
34874			alphaBuf = new Uint8ClampedArray(sw * sh);
34875			await smask.fillGrayBuffer(alphaBuf);
34876			if (sw !== width || sh !== height) {
34877				alphaBuf = resizeImageMask(alphaBuf, smask.bpc, sw, sh, width, height);
34878			}
34879		} else if (mask) {
34880			if (mask instanceof PDFImage) {
34881				sw = mask.width;
34882				sh = mask.height;
34883				alphaBuf = new Uint8ClampedArray(sw * sh);
34884				mask.numComps = 1;
34885				await mask.fillGrayBuffer(alphaBuf);
34886				for (i = 0, ii = sw * sh; i < ii; ++i) {
34887					alphaBuf[i] = 255 - alphaBuf[i];
34888				}
34889				if (sw !== width || sh !== height) {
34890					alphaBuf = resizeImageMask(alphaBuf, mask.bpc, sw, sh, width, height);
34891				}
34892			} else if (Array.isArray(mask)) {
34893				alphaBuf = new Uint8ClampedArray(width * height);
34894				const numComps = this.numComps;
34895				for (i = 0, ii = width * height; i < ii; ++i) {
34896					let opacity = 0;
34897					const imageOffset = i * numComps;
34898					for (j = 0; j < numComps; ++j) {
34899						const color = image[imageOffset + j];
34900						const maskOffset = j * 2;
34901						if (color < mask[maskOffset] || color > mask[maskOffset + 1]) {
34902							opacity = 255;
34903							break;
34904						}
34905					}
34906					alphaBuf[i] = opacity;
34907				}
34908			} else {
34909				throw new FormatError("Unknown mask format.");
34910			}
34911		}
34912		if (alphaBuf) {
34913			for (i = 0, j = 3, ii = width * actualHeight; i < ii; ++i, j += 4) {
34914				rgbaBuf[j] = alphaBuf[i];
34915			}
34916		} else {
34917			for (i = 0, j = 3, ii = width * actualHeight; i < ii; ++i, j += 4) {
34918				rgbaBuf[j] = 255;
34919			}
34920		}
34921	}
34922	undoPreblend(buffer, width, height) {
34923		const matte = this.smask?.matte;
34924		if (!matte) {
34925			return;
34926		}
34927		const matteRgb = this.colorSpace.getRgb(matte, 0);
34928		const matteR = matteRgb[0];
34929		const matteG = matteRgb[1];
34930		const matteB = matteRgb[2];
34931		const length = width * height * 4;
34932		for (let i = 0; i < length; i += 4) {
34933			const alpha = buffer[i + 3];
34934			if (alpha === 0) {
34935				buffer[i] = 255;
34936				buffer[i + 1] = 255;
34937				buffer[i + 2] = 255;
34938				continue;
34939			}
34940			const k = 255 / alpha;
34941			buffer[i] = (buffer[i] - matteR) * k + matteR;
34942			buffer[i + 1] = (buffer[i + 1] - matteG) * k + matteG;
34943			buffer[i + 2] = (buffer[i + 2] - matteB) * k + matteB;
34944		}
34945	}
34946	async createImageData(forceRGBA = false, isOffscreenCanvasSupported = false) {
34947		const drawWidth = this.drawWidth;
34948		const drawHeight = this.drawHeight;
34949		const imgData = {
34950			width: drawWidth,
34951			height: drawHeight,
34952			interpolate: this.interpolate,
34953			kind: 0,
34954			data: null
34955		};
34956		const numComps = this.numComps;
34957		const originalWidth = this.width;
34958		const originalHeight = this.height;
34959		const bpc = this.bpc;
34960		const rowBytes = originalWidth * numComps * bpc + 7 >> 3;
34961		const mustBeResized = isOffscreenCanvasSupported && ImageResizer.needsToBeResized(drawWidth, drawHeight);
34962		if (!this.smask && !this.mask && this.colorSpace.name === "DeviceRGBA") {
34963			imgData.kind = ImageKind.RGBA_32BPP;
34964			const imgArray = imgData.data = await this.getImageBytes(originalHeight * originalWidth * 4, {});
34965			if (isOffscreenCanvasSupported) {
34966				if (!mustBeResized) {
34967					return this.createBitmap(ImageKind.RGBA_32BPP, drawWidth, drawHeight, imgArray);
34968				}
34969				return ImageResizer.createImage(imgData, false);
34970			}
34971			return imgData;
34972		}
34973		if (!forceRGBA) {
34974			let kind;
34975			if (this.colorSpace.name === "DeviceGray" && bpc === 1) {
34976				kind = ImageKind.GRAYSCALE_1BPP;
34977			} else if (this.colorSpace.name === "DeviceRGB" && bpc === 8 && !this.needsDecode) {
34978				kind = ImageKind.RGB_24BPP;
34979			}
34980			if (kind && !this.smask && !this.mask && drawWidth === originalWidth && drawHeight === originalHeight) {
34981				const image = await this.#getImage(originalWidth, originalHeight);
34982				if (image) {
34983					return image;
34984				}
34985				const data = await this.getImageBytes(originalHeight * rowBytes, {});
34986				if (isOffscreenCanvasSupported) {
34987					if (mustBeResized) {
34988						return ImageResizer.createImage({
34989							data,
34990							kind,
34991							width: drawWidth,
34992							height: drawHeight,
34993							interpolate: this.interpolate
34994						}, this.needsDecode);
34995					}
34996					return this.createBitmap(kind, originalWidth, originalHeight, data);
34997				}
34998				imgData.kind = kind;
34999				imgData.data = data;
35000				if (this.needsDecode) {
35001					assert(kind === ImageKind.GRAYSCALE_1BPP, "PDFImage.createImageData: The image must be grayscale.");
35002					const buffer = imgData.data;
35003					for (let i = 0, ii = buffer.length; i < ii; i++) {
35004						buffer[i] ^= 0xff;
35005					}
35006				}
35007				return imgData;
35008			}
35009			if (this.image instanceof JpegStream && !this.smask && !this.mask && !this.needsDecode) {
35010				let imageLength = originalHeight * rowBytes;
35011				if (isOffscreenCanvasSupported && !mustBeResized) {
35012					let isHandled = false;
35013					switch (this.colorSpace.name) {
35014						case "DeviceGray":
35015							imageLength *= 4;
35016							isHandled = true;
35017							break;
35018						case "DeviceRGB":
35019							imageLength = imageLength / 3 * 4;
35020							isHandled = true;
35021							break;
35022						case "DeviceCMYK":
35023							isHandled = true;
35024							break;
35025					}
35026					if (isHandled) {
35027						const image = await this.#getImage(drawWidth, drawHeight);
35028						if (image) {
35029							return image;
35030						}
35031						const rgba = await this.getImageBytes(imageLength, {
35032							drawWidth,
35033							drawHeight,
35034							forceRGBA: true
35035						});
35036						return this.createBitmap(ImageKind.RGBA_32BPP, drawWidth, drawHeight, rgba);
35037					}
35038				} else {
35039					switch (this.colorSpace.name) {
35040						case "DeviceGray":
35041							imageLength *= 3;
35042						case "DeviceRGB":
35043						case "DeviceCMYK":
35044							imgData.kind = ImageKind.RGB_24BPP;
35045							imgData.data = await this.getImageBytes(imageLength, {
35046								drawWidth,
35047								drawHeight,
35048								forceRGB: true
35049							});
35050							if (mustBeResized) {
35051								return ImageResizer.createImage(imgData);
35052							}
35053							return imgData;
35054					}
35055				}
35056			}
35057		}
35058		const imgArray = await this.getImageBytes(originalHeight * rowBytes, {
35059			internal: true
35060		});
35061		const actualHeight = 0 | imgArray.length / rowBytes * drawHeight / originalHeight;
35062		const comps = this.getComponents(imgArray);
35063		let alpha01, maybeUndoPreblend;
35064		let canvas, ctx, canvasImgData, data;
35065		if (isOffscreenCanvasSupported && !mustBeResized) {
35066			canvas = new OffscreenCanvas(drawWidth, drawHeight);
35067			ctx = canvas.getContext("2d");
35068			canvasImgData = ctx.createImageData(drawWidth, drawHeight);
35069			data = canvasImgData.data;
35070		}
35071		imgData.kind = ImageKind.RGBA_32BPP;
35072		if (!forceRGBA && !this.smask && !this.mask) {
35073			if (!isOffscreenCanvasSupported || mustBeResized) {
35074				imgData.kind = ImageKind.RGB_24BPP;
35075				data = new Uint8ClampedArray(drawWidth * drawHeight * 3);
35076				alpha01 = 0;
35077			} else {
35078				const arr = new Uint32Array(data.buffer);
35079				arr.fill(FeatureTest.isLittleEndian ? 0xff000000 : 0x000000ff);
35080				alpha01 = 1;
35081			}
35082			maybeUndoPreblend = false;
35083		} else {
35084			if (!isOffscreenCanvasSupported || mustBeResized) {
35085				data = new Uint8ClampedArray(drawWidth * drawHeight * 4);
35086			}
35087			alpha01 = 1;
35088			maybeUndoPreblend = true;
35089			await this.fillOpacity(data, drawWidth, drawHeight, actualHeight, comps);
35090		}
35091		if (this.needsDecode) {
35092			this.decodeBuffer(comps);
35093		}
35094		this.colorSpace.fillRgb(data, originalWidth, originalHeight, drawWidth, drawHeight, actualHeight, bpc, comps, alpha01);
35095		if (maybeUndoPreblend) {
35096			this.undoPreblend(data, drawWidth, actualHeight);
35097		}
35098		if (isOffscreenCanvasSupported && !mustBeResized) {
35099			ctx.putImageData(canvasImgData, 0, 0);
35100			const bitmap = canvas.transferToImageBitmap();
35101			return {
35102				data: null,
35103				width: drawWidth,
35104				height: drawHeight,
35105				bitmap,
35106				interpolate: this.interpolate
35107			};
35108		}
35109		imgData.data = data;
35110		if (mustBeResized) {
35111			return ImageResizer.createImage(imgData);
35112		}
35113		return imgData;
35114	}
35115	async fillGrayBuffer(buffer) {
35116		const numComps = this.numComps;
35117		if (numComps !== 1) {
35118			throw new FormatError(`Reading gray scale from a color image: ${numComps}`);
35119		}
35120		const width = this.width;
35121		const height = this.height;
35122		const bpc = this.bpc;
35123		const rowBytes = width * numComps * bpc + 7 >> 3;
35124		const imgArray = await this.getImageBytes(height * rowBytes, {
35125			internal: true
35126		});
35127		const comps = this.getComponents(imgArray);
35128		let i, length;
35129		if (bpc === 1) {
35130			length = width * height;
35131			if (this.needsDecode) {
35132				for (i = 0; i < length; ++i) {
35133					buffer[i] = comps[i] - 1 & 255;
35134				}
35135			} else {
35136				for (i = 0; i < length; ++i) {
35137					buffer[i] = -comps[i] & 255;
35138				}
35139			}
35140			return;
35141		}
35142		if (this.needsDecode) {
35143			this.decodeBuffer(comps);
35144		}
35145		length = width * height;
35146		const scale = 255 / ((1 << bpc) - 1);
35147		for (i = 0; i < length; ++i) {
35148			buffer[i] = scale * comps[i];
35149		}
35150	}
35151	createBitmap(kind, width, height, src) {
35152		const canvas = new OffscreenCanvas(width, height);
35153		const ctx = canvas.getContext("2d");
35154		let imgData;
35155		if (kind === ImageKind.RGBA_32BPP) {
35156			imgData = new ImageData(src, width, height);
35157		} else {
35158			imgData = ctx.createImageData(width, height);
35159			convertToRGBA({
35160				kind,
35161				src,
35162				dest: new Uint32Array(imgData.data.buffer),
35163				width,
35164				height,
35165				inverseDecode: this.needsDecode
35166			});
35167		}
35168		ctx.putImageData(imgData, 0, 0);
35169		const bitmap = canvas.transferToImageBitmap();
35170		return {
35171			data: null,
35172			width,
35173			height,
35174			bitmap,
35175			interpolate: this.interpolate
35176		};
35177	}
35178	async #getImage(width, height) {
35179		const bitmap = await this.image.getTransferableImage();
35180		if (!bitmap) {
35181			return null;
35182		}
35183		return {
35184			data: null,
35185			width,
35186			height,
35187			bitmap,
35188			interpolate: this.interpolate
35189		};
35190	}
35191	async getImageBytes(length, {
35192		drawWidth,
35193		drawHeight,
35194		forceRGBA = false,
35195		forceRGB = false,
35196		internal = false
35197	}) {
35198		this.image.reset();
35199		this.image.drawWidth = drawWidth || this.width;
35200		this.image.drawHeight = drawHeight || this.height;
35201		this.image.forceRGBA = !!forceRGBA;
35202		this.image.forceRGB = !!forceRGB;
35203		const imageBytes = await this.image.getImageData(length, this.jpxDecoderOptions);
35204		if (internal || this.image instanceof DecodeStream) {
35205			return imageBytes;
35206		}
35207		assert(imageBytes instanceof Uint8Array, 'PDFImage.getImageBytes: Unsupported "imageBytes" type.');
35208		return new Uint8Array(imageBytes);
35209	}
35210}
35211
35212;// ./src/core/evaluator.js
35213
35214
35215
35216
35217
35218
35219
35220
35221
35222
35223
35224
35225
35226
35227
35228
35229
35230
35231
35232
35233
35234
35235
35236
35237
35238
35239
35240
35241
35242
35243
35244
35245
35246
35247
35248
35249
35250
35251
35252
35253
35254
35255
35256
35257
35258
35259const DefaultPartialEvaluatorOptions = Object.freeze({
35260	maxImageSize: -1,
35261	disableFontFace: false,
35262	ignoreErrors: false,
35263	isEvalSupported: true,
35264	isOffscreenCanvasSupported: false,
35265	isImageDecoderSupported: false,
35266	canvasMaxAreaInBytes: -1,
35267	fontExtraProperties: false,
35268	useSystemFonts: true,
35269	cMapUrl: null,
35270	standardFontDataUrl: null
35271});
35272const PatternType = {
35273	TILING: 1,
35274	SHADING: 2
35275};
35276const TEXT_CHUNK_BATCH_SIZE = 10;
35277const deferred = Promise.resolve();
35278function normalizeBlendMode(value, parsingArray = false) {
35279	if (Array.isArray(value)) {
35280		for (const val of value) {
35281			const maybeBM = normalizeBlendMode(val, true);
35282			if (maybeBM) {
35283				return maybeBM;
35284			}
35285		}
35286		warn(`Unsupported blend mode Array: ${value}`);
35287		return "source-over";
35288	}
35289	if (!(value instanceof Name)) {
35290		if (parsingArray) {
35291			return null;
35292		}
35293		return "source-over";
35294	}
35295	switch (value.name) {
35296		case "Normal":
35297		case "Compatible":
35298			return "source-over";
35299		case "Multiply":
35300			return "multiply";
35301		case "Screen":
35302			return "screen";
35303		case "Overlay":
35304			return "overlay";
35305		case "Darken":
35306			return "darken";
35307		case "Lighten":
35308			return "lighten";
35309		case "ColorDodge":
35310			return "color-dodge";
35311		case "ColorBurn":
35312			return "color-burn";
35313		case "HardLight":
35314			return "hard-light";
35315		case "SoftLight":
35316			return "soft-light";
35317		case "Difference":
35318			return "difference";
35319		case "Exclusion":
35320			return "exclusion";
35321		case "Hue":
35322			return "hue";
35323		case "Saturation":
35324			return "saturation";
35325		case "Color":
35326			return "color";
35327		case "Luminosity":
35328			return "luminosity";
35329	}
35330	if (parsingArray) {
35331		return null;
35332	}
35333	warn(`Unsupported blend mode: ${value.name}`);
35334	return "source-over";
35335}
35336function addLocallyCachedImageOps(opList, data) {
35337	if (data.objId) {
35338		opList.addDependency(data.objId);
35339	}
35340	opList.addImageOps(data.fn, data.args, data.optionalContent, data.hasMask);
35341	if (data.fn === OPS.paintImageMaskXObject && data.args[0]?.count > 0) {
35342		data.args[0].count++;
35343	}
35344}
35345class TimeSlotManager {
35346	static TIME_SLOT_DURATION_MS = 20;
35347	static CHECK_TIME_EVERY = 100;
35348	constructor() {
35349		this.reset();
35350	}
35351	check() {
35352		if (++this.checked < TimeSlotManager.CHECK_TIME_EVERY) {
35353			return false;
35354		}
35355		this.checked = 0;
35356		return this.endTime <= Date.now();
35357	}
35358	reset() {
35359		this.endTime = Date.now() + TimeSlotManager.TIME_SLOT_DURATION_MS;
35360		this.checked = 0;
35361	}
35362}
35363class PartialEvaluator {
35364	constructor({
35365		xref,
35366		handler,
35367		pageIndex,
35368		idFactory,
35369		fontCache,
35370		builtInCMapCache,
35371		standardFontDataCache,
35372		globalImageCache,
35373		systemFontCache,
35374		options = null
35375	}) {
35376		this.xref = xref;
35377		this.handler = handler;
35378		this.pageIndex = pageIndex;
35379		this.idFactory = idFactory;
35380		this.fontCache = fontCache;
35381		this.builtInCMapCache = builtInCMapCache;
35382		this.standardFontDataCache = standardFontDataCache;
35383		this.globalImageCache = globalImageCache;
35384		this.systemFontCache = systemFontCache;
35385		this.options = options || DefaultPartialEvaluatorOptions;
35386		this.type3FontRefs = null;
35387		this._regionalImageCache = new RegionalImageCache();
35388		this._fetchBuiltInCMapBound = this.fetchBuiltInCMap.bind(this);
35389		ImageResizer.setOptions(this.options);
35390		JpegStream.setOptions(this.options);
35391	}
35392	get _pdfFunctionFactory() {
35393		const pdfFunctionFactory = new PDFFunctionFactory({
35394			xref: this.xref,
35395			isEvalSupported: this.options.isEvalSupported
35396		});
35397		return shadow(this, "_pdfFunctionFactory", pdfFunctionFactory);
35398	}
35399	get parsingType3Font() {
35400		return !!this.type3FontRefs;
35401	}
35402	clone(newOptions = null) {
35403		const newEvaluator = Object.create(this);
35404		newEvaluator.options = Object.assign(Object.create(null), this.options, newOptions);
35405		return newEvaluator;
35406	}
35407	hasBlendModes(resources, nonBlendModesSet) {
35408		if (!(resources instanceof Dict)) {
35409			return false;
35410		}
35411		if (resources.objId && nonBlendModesSet.has(resources.objId)) {
35412			return false;
35413		}
35414		const processed = new RefSet(nonBlendModesSet);
35415		if (resources.objId) {
35416			processed.put(resources.objId);
35417		}
35418		const nodes = [resources],
35419			xref = this.xref;
35420		while (nodes.length) {
35421			const node = nodes.shift();
35422			const graphicStates = node.get("ExtGState");
35423			if (graphicStates instanceof Dict) {
35424				for (let graphicState of graphicStates.getRawValues()) {
35425					if (graphicState instanceof Ref) {
35426						if (processed.has(graphicState)) {
35427							continue;
35428						}
35429						try {
35430							graphicState = xref.fetch(graphicState);
35431						} catch (ex) {
35432							processed.put(graphicState);
35433							info(`hasBlendModes - ignoring ExtGState: "${ex}".`);
35434							continue;
35435						}
35436					}
35437					if (!(graphicState instanceof Dict)) {
35438						continue;
35439					}
35440					if (graphicState.objId) {
35441						processed.put(graphicState.objId);
35442					}
35443					const bm = graphicState.get("BM");
35444					if (bm instanceof Name) {
35445						if (bm.name !== "Normal") {
35446							return true;
35447						}
35448						continue;
35449					}
35450					if (bm !== undefined && Array.isArray(bm)) {
35451						for (const element of bm) {
35452							if (element instanceof Name && element.name !== "Normal") {
35453								return true;
35454							}
35455						}
35456					}
35457				}
35458			}
35459			const xObjects = node.get("XObject");
35460			if (!(xObjects instanceof Dict)) {
35461				continue;
35462			}
35463			for (let xObject of xObjects.getRawValues()) {
35464				if (xObject instanceof Ref) {
35465					if (processed.has(xObject)) {
35466						continue;
35467					}
35468					try {
35469						xObject = xref.fetch(xObject);
35470					} catch (ex) {
35471						processed.put(xObject);
35472						info(`hasBlendModes - ignoring XObject: "${ex}".`);
35473						continue;
35474					}
35475				}
35476				if (!(xObject instanceof BaseStream)) {
35477					continue;
35478				}
35479				if (xObject.dict.objId) {
35480					processed.put(xObject.dict.objId);
35481				}
35482				const xResources = xObject.dict.get("Resources");
35483				if (!(xResources instanceof Dict)) {
35484					continue;
35485				}
35486				if (xResources.objId && processed.has(xResources.objId)) {
35487					continue;
35488				}
35489				nodes.push(xResources);
35490				if (xResources.objId) {
35491					processed.put(xResources.objId);
35492				}
35493			}
35494		}
35495		for (const ref of processed) {
35496			nonBlendModesSet.put(ref);
35497		}
35498		return false;
35499	}
35500	async #fetchData(url) {
35501		const response = await fetch(url);
35502		if (!response.ok) {
35503			throw new Error(`Failed to fetch file "${url}" with "${response.statusText}".`);
35504		}
35505		return new Uint8Array(await response.arrayBuffer());
35506	}
35507	async fetchBuiltInCMap(name) {
35508		const cachedData = this.builtInCMapCache.get(name);
35509		if (cachedData) {
35510			return cachedData;
35511		}
35512		let data;
35513		if (this.options.cMapUrl !== null) {
35514			const cMapData = await this.#fetchData(`${this.options.cMapUrl}${name}.bcmap`);
35515			data = {
35516				cMapData,
35517				isCompressed: true
35518			};
35519		} else {
35520			data = await this.handler.sendWithPromise("FetchBuiltInCMap", {
35521				name
35522			});
35523		}
35524		this.builtInCMapCache.set(name, data);
35525		return data;
35526	}
35527	async fetchStandardFontData(name) {
35528		const cachedData = this.standardFontDataCache.get(name);
35529		if (cachedData) {
35530			return new Stream(cachedData);
35531		}
35532		if (this.options.useSystemFonts && name !== "Symbol" && name !== "ZapfDingbats") {
35533			return null;
35534		}
35535		const standardFontNameToFileName = getFontNameToFileMap(),
35536			filename = standardFontNameToFileName[name];
35537		let data;
35538		try {
35539			if (this.options.standardFontDataUrl !== null) {
35540				data = await this.#fetchData(`${this.options.standardFontDataUrl}${filename}`);
35541			} else {
35542				data = await this.handler.sendWithPromise("FetchStandardFontData", {
35543					filename
35544				});
35545			}
35546		} catch (ex) {
35547			warn(ex);
35548			return null;
35549		}
35550		this.standardFontDataCache.set(name, data);
35551		return new Stream(data);
35552	}
35553	async buildFormXObject(resources, xobj, smask, operatorList, task, initialState, localColorSpaceCache) {
35554		const dict = xobj.dict;
35555		const matrix = lookupMatrix(dict.getArray("Matrix"), null);
35556		const bbox = lookupNormalRect(dict.getArray("BBox"), null);
35557		let optionalContent, groupOptions;
35558		if (dict.has("OC")) {
35559			optionalContent = await this.parseMarkedContentProps(dict.get("OC"), resources);
35560		}
35561		if (optionalContent !== undefined) {
35562			operatorList.addOp(OPS.beginMarkedContentProps, ["OC", optionalContent]);
35563		}
35564		const group = dict.get("Group");
35565		if (group) {
35566			groupOptions = {
35567				matrix,
35568				bbox,
35569				smask,
35570				isolated: false,
35571				knockout: false
35572			};
35573			const groupSubtype = group.get("S");
35574			let colorSpace = null;
35575			if (isName(groupSubtype, "Transparency")) {
35576				groupOptions.isolated = group.get("I") || false;
35577				groupOptions.knockout = group.get("K") || false;
35578				if (group.has("CS")) {
35579					const cs = group.getRaw("CS");
35580					const cachedColorSpace = ColorSpace.getCached(cs, this.xref, localColorSpaceCache);
35581					if (cachedColorSpace) {
35582						colorSpace = cachedColorSpace;
35583					} else {
35584						colorSpace = await this.parseColorSpace({
35585							cs,
35586							resources,
35587							localColorSpaceCache
35588						});
35589					}
35590				}
35591			}
35592			if (smask?.backdrop) {
35593				colorSpace ||= ColorSpace.singletons.rgb;
35594				smask.backdrop = colorSpace.getRgb(smask.backdrop, 0);
35595			}
35596			operatorList.addOp(OPS.beginGroup, [groupOptions]);
35597		}
35598		const args = group ? [matrix, null] : [matrix, bbox];
35599		operatorList.addOp(OPS.paintFormXObjectBegin, args);
35600		await this.getOperatorList({
35601			stream: xobj,
35602			task,
35603			resources: dict.get("Resources") || resources,
35604			operatorList,
35605			initialState
35606		});
35607		operatorList.addOp(OPS.paintFormXObjectEnd, []);
35608		if (group) {
35609			operatorList.addOp(OPS.endGroup, [groupOptions]);
35610		}
35611		if (optionalContent !== undefined) {
35612			operatorList.addOp(OPS.endMarkedContent, []);
35613		}
35614	}
35615	_sendImgData(objId, imgData, cacheGlobally = false) {
35616		const transfers = imgData ? [imgData.bitmap || imgData.data.buffer] : null;
35617		if (this.parsingType3Font || cacheGlobally) {
35618			return this.handler.send("commonobj", [objId, "Image", imgData], transfers);
35619		}
35620		return this.handler.send("obj", [objId, this.pageIndex, "Image", imgData], transfers);
35621	}
35622	async buildPaintImageXObject({
35623		resources,
35624		image,
35625		isInline = false,
35626		operatorList,
35627		cacheKey,
35628		localImageCache,
35629		localColorSpaceCache
35630	}) {
35631		const dict = image.dict;
35632		const imageRef = dict.objId;
35633		const w = dict.get("W", "Width");
35634		const h = dict.get("H", "Height");
35635		if (!(w && typeof w === "number") || !(h && typeof h === "number")) {
35636			warn("Image dimensions are missing, or not numbers.");
35637			return;
35638		}
35639		const maxImageSize = this.options.maxImageSize;
35640		if (maxImageSize !== -1 && w * h > maxImageSize) {
35641			const msg = "Image exceeded maximum allowed size and was removed.";
35642			if (this.options.ignoreErrors) {
35643				warn(msg);
35644				return;
35645			}
35646			throw new Error(msg);
35647		}
35648		let optionalContent;
35649		if (dict.has("OC")) {
35650			optionalContent = await this.parseMarkedContentProps(dict.get("OC"), resources);
35651		}
35652		const imageMask = dict.get("IM", "ImageMask") || false;
35653		let imgData, args;
35654		if (imageMask) {
35655			const interpolate = dict.get("I", "Interpolate");
35656			const bitStrideLength = w + 7 >> 3;
35657			const imgArray = image.getBytes(bitStrideLength * h);
35658			const decode = dict.getArray("D", "Decode");
35659			if (this.parsingType3Font) {
35660				imgData = PDFImage.createRawMask({
35661					imgArray,
35662					width: w,
35663					height: h,
35664					imageIsFromDecodeStream: image instanceof DecodeStream,
35665					inverseDecode: decode?.[0] > 0,
35666					interpolate
35667				});
35668				imgData.cached = !!cacheKey;
35669				args = [imgData];
35670				operatorList.addImageOps(OPS.paintImageMaskXObject, args, optionalContent);
35671				if (cacheKey) {
35672					const cacheData = {
35673						fn: OPS.paintImageMaskXObject,
35674						args,
35675						optionalContent
35676					};
35677					localImageCache.set(cacheKey, imageRef, cacheData);
35678					if (imageRef) {
35679						this._regionalImageCache.set(null, imageRef, cacheData);
35680					}
35681				}
35682				return;
35683			}
35684			imgData = await PDFImage.createMask({
35685				imgArray,
35686				width: w,
35687				height: h,
35688				imageIsFromDecodeStream: image instanceof DecodeStream,
35689				inverseDecode: decode?.[0] > 0,
35690				interpolate,
35691				isOffscreenCanvasSupported: this.options.isOffscreenCanvasSupported
35692			});
35693			if (imgData.isSingleOpaquePixel) {
35694				operatorList.addImageOps(OPS.paintSolidColorImageMask, [], optionalContent);
35695				if (cacheKey) {
35696					const cacheData = {
35697						fn: OPS.paintSolidColorImageMask,
35698						args: [],
35699						optionalContent
35700					};
35701					localImageCache.set(cacheKey, imageRef, cacheData);
35702					if (imageRef) {
35703						this._regionalImageCache.set(null, imageRef, cacheData);
35704					}
35705				}
35706				return;
35707			}
35708			const objId = `mask_${this.idFactory.createObjId()}`;
35709			operatorList.addDependency(objId);
35710			imgData.dataLen = imgData.bitmap ? imgData.width * imgData.height * 4 : imgData.data.length;
35711			this._sendImgData(objId, imgData);
35712			args = [{
35713				data: objId,
35714				width: imgData.width,
35715				height: imgData.height,
35716				interpolate: imgData.interpolate,
35717				count: 1
35718			}];
35719			operatorList.addImageOps(OPS.paintImageMaskXObject, args, optionalContent);
35720			if (cacheKey) {
35721				const cacheData = {
35722					objId,
35723					fn: OPS.paintImageMaskXObject,
35724					args,
35725					optionalContent
35726				};
35727				localImageCache.set(cacheKey, imageRef, cacheData);
35728				if (imageRef) {
35729					this._regionalImageCache.set(null, imageRef, cacheData);
35730				}
35731			}
35732			return;
35733		}
35734		const SMALL_IMAGE_DIMENSIONS = 200;
35735		const hasMask = dict.has("SMask") || dict.has("Mask");
35736		if (isInline && w + h < SMALL_IMAGE_DIMENSIONS && !hasMask) {
35737			try {
35738				const imageObj = new PDFImage({
35739					xref: this.xref,
35740					res: resources,
35741					image,
35742					isInline,
35743					pdfFunctionFactory: this._pdfFunctionFactory,
35744					localColorSpaceCache
35745				});
35746				imgData = await imageObj.createImageData(true, false);
35747				operatorList.isOffscreenCanvasSupported = this.options.isOffscreenCanvasSupported;
35748				operatorList.addImageOps(OPS.paintInlineImageXObject, [imgData], optionalContent);
35749			} catch (reason) {
35750				const msg = `Unable to decode inline image: "${reason}".`;
35751				if (!this.options.ignoreErrors) {
35752					throw new Error(msg);
35753				}
35754				warn(msg);
35755			}
35756			return;
35757		}
35758		let objId = `img_${this.idFactory.createObjId()}`,
35759			cacheGlobally = false;
35760		if (this.parsingType3Font) {
35761			objId = `${this.idFactory.getDocId()}_type3_${objId}`;
35762		} else if (cacheKey && imageRef) {
35763			cacheGlobally = this.globalImageCache.shouldCache(imageRef, this.pageIndex);
35764			if (cacheGlobally) {
35765				assert(!isInline, "Cannot cache an inline image globally.");
35766				objId = `${this.idFactory.getDocId()}_${objId}`;
35767			}
35768		}
35769		operatorList.addDependency(objId);
35770		args = [objId, w, h];
35771		operatorList.addImageOps(OPS.paintImageXObject, args, optionalContent, hasMask);
35772		if (cacheGlobally) {
35773			if (this.globalImageCache.hasDecodeFailed(imageRef)) {
35774				this.globalImageCache.setData(imageRef, {
35775					objId,
35776					fn: OPS.paintImageXObject,
35777					args,
35778					optionalContent,
35779					hasMask,
35780					byteSize: 0
35781				});
35782				this._sendImgData(objId, null, cacheGlobally);
35783				return;
35784			}
35785			if (w * h > 250000 || hasMask) {
35786				const localLength = await this.handler.sendWithPromise("commonobj", [objId, "CopyLocalImage", {
35787					imageRef
35788				}]);
35789				if (localLength) {
35790					this.globalImageCache.setData(imageRef, {
35791						objId,
35792						fn: OPS.paintImageXObject,
35793						args,
35794						optionalContent,
35795						hasMask,
35796						byteSize: 0
35797					});
35798					this.globalImageCache.addByteSize(imageRef, localLength);
35799					return;
35800				}
35801			}
35802		}
35803		PDFImage.buildImage({
35804			xref: this.xref,
35805			res: resources,
35806			image,
35807			isInline,
35808			pdfFunctionFactory: this._pdfFunctionFactory,
35809			localColorSpaceCache
35810		}).then(async imageObj => {
35811			imgData = await imageObj.createImageData(false, this.options.isOffscreenCanvasSupported);
35812			imgData.dataLen = imgData.bitmap ? imgData.width * imgData.height * 4 : imgData.data.length;
35813			imgData.ref = imageRef;
35814			if (cacheGlobally) {
35815				this.globalImageCache.addByteSize(imageRef, imgData.dataLen);
35816			}
35817			return this._sendImgData(objId, imgData, cacheGlobally);
35818		}).catch(reason => {
35819			warn(`Unable to decode image "${objId}": "${reason}".`);
35820			if (imageRef) {
35821				this.globalImageCache.addDecodeFailed(imageRef);
35822			}
35823			return this._sendImgData(objId, null, cacheGlobally);
35824		});
35825		if (cacheKey) {
35826			const cacheData = {
35827				objId,
35828				fn: OPS.paintImageXObject,
35829				args,
35830				optionalContent,
35831				hasMask
35832			};
35833			localImageCache.set(cacheKey, imageRef, cacheData);
35834			if (imageRef) {
35835				this._regionalImageCache.set(null, imageRef, cacheData);
35836				if (cacheGlobally) {
35837					this.globalImageCache.setData(imageRef, {
35838						objId,
35839						fn: OPS.paintImageXObject,
35840						args,
35841						optionalContent,
35842						hasMask,
35843						byteSize: 0
35844					});
35845				}
35846			}
35847		}
35848	}
35849	handleSMask(smask, resources, operatorList, task, stateManager, localColorSpaceCache) {
35850		const smaskContent = smask.get("G");
35851		const smaskOptions = {
35852			subtype: smask.get("S").name,
35853			backdrop: smask.get("BC")
35854		};
35855		const transferObj = smask.get("TR");
35856		if (isPDFFunction(transferObj)) {
35857			const transferFn = this._pdfFunctionFactory.create(transferObj);
35858			const transferMap = new Uint8Array(256);
35859			const tmp = new Float32Array(1);
35860			for (let i = 0; i < 256; i++) {
35861				tmp[0] = i / 255;
35862				transferFn(tmp, 0, tmp, 0);
35863				transferMap[i] = tmp[0] * 255 | 0;
35864			}
35865			smaskOptions.transferMap = transferMap;
35866		}
35867		return this.buildFormXObject(resources, smaskContent, smaskOptions, operatorList, task, stateManager.state.clone(), localColorSpaceCache);
35868	}
35869	handleTransferFunction(tr) {
35870		let transferArray;
35871		if (Array.isArray(tr)) {
35872			transferArray = tr;
35873		} else if (isPDFFunction(tr)) {
35874			transferArray = [tr];
35875		} else {
35876			return null;
35877		}
35878		const transferMaps = [];
35879		let numFns = 0,
35880			numEffectfulFns = 0;
35881		for (const entry of transferArray) {
35882			const transferObj = this.xref.fetchIfRef(entry);
35883			numFns++;
35884			if (isName(transferObj, "Identity")) {
35885				transferMaps.push(null);
35886				continue;
35887			} else if (!isPDFFunction(transferObj)) {
35888				return null;
35889			}
35890			const transferFn = this._pdfFunctionFactory.create(transferObj);
35891			const transferMap = new Uint8Array(256),
35892				tmp = new Float32Array(1);
35893			for (let j = 0; j < 256; j++) {
35894				tmp[0] = j / 255;
35895				transferFn(tmp, 0, tmp, 0);
35896				transferMap[j] = tmp[0] * 255 | 0;
35897			}
35898			transferMaps.push(transferMap);
35899			numEffectfulFns++;
35900		}
35901		if (!(numFns === 1 || numFns === 4)) {
35902			return null;
35903		}
35904		if (numEffectfulFns === 0) {
35905			return null;
35906		}
35907		return transferMaps;
35908	}
35909	handleTilingType(fn, color, resources, pattern, patternDict, operatorList, task, localTilingPatternCache) {
35910		const tilingOpList = new OperatorList();
35911		const patternResources = Dict.merge({
35912			xref: this.xref,
35913			dictArray: [patternDict.get("Resources"), resources]
35914		});
35915		return this.getOperatorList({
35916			stream: pattern,
35917			task,
35918			resources: patternResources,
35919			operatorList: tilingOpList
35920		}).then(function () {
35921			const operatorListIR = tilingOpList.getIR();
35922			const tilingPatternIR = getTilingPatternIR(operatorListIR, patternDict, color);
35923			operatorList.addDependencies(tilingOpList.dependencies);
35924			operatorList.addOp(fn, tilingPatternIR);
35925			if (patternDict.objId) {
35926				localTilingPatternCache.set(null, patternDict.objId, {
35927					operatorListIR,
35928					dict: patternDict
35929				});
35930			}
35931		}).catch(reason => {
35932			if (reason instanceof AbortException) {
35933				return;
35934			}
35935			if (this.options.ignoreErrors) {
35936				warn(`handleTilingType - ignoring pattern: "${reason}".`);
35937				return;
35938			}
35939			throw reason;
35940		});
35941	}
35942	async handleSetFont(resources, fontArgs, fontRef, operatorList, task, state, fallbackFontDict = null, cssFontInfo = null) {
35943		const fontName = fontArgs?.[0] instanceof Name ? fontArgs[0].name : null;
35944		let translated = await this.loadFont(fontName, fontRef, resources, fallbackFontDict, cssFontInfo);
35945		if (translated.font.isType3Font) {
35946			try {
35947				await translated.loadType3Data(this, resources, task);
35948				operatorList.addDependencies(translated.type3Dependencies);
35949			} catch (reason) {
35950				translated = new TranslatedFont({
35951					loadedName: "g_font_error",
35952					font: new ErrorFont(`Type3 font load error: ${reason}`),
35953					dict: translated.font,
35954					evaluatorOptions: this.options
35955				});
35956			}
35957		}
35958		state.font = translated.font;
35959		translated.send(this.handler);
35960		return translated.loadedName;
35961	}
vendor: 4,621 bytes, lines 35962-36134
35962	handleText(chars, state) {
35963		const font = state.font;
35964		const glyphs = font.charsToGlyphs(chars);
35965		if (font.data) {
35966			const isAddToPathSet = !!(state.textRenderingMode & TextRenderingMode.ADD_TO_PATH_FLAG);
35967			if (isAddToPathSet || state.fillColorSpace.name === "Pattern" || font.disableFontFace || this.options.disableFontFace) {
35968				PartialEvaluator.buildFontPaths(font, glyphs, this.handler, this.options);
35969			}
35970		}
35971		return glyphs;
35972	}
35973	ensureStateFont(state) {
35974		if (state.font) {
35975			return;
35976		}
35977		const reason = new FormatError("Missing setFont (Tf) operator before text rendering operator.");
35978		if (this.options.ignoreErrors) {
35979			warn(`ensureStateFont: "${reason}".`);
35980			return;
35981		}
35982		throw reason;
35983	}
35984	async setGState({
35985		resources,
35986		gState,
35987		operatorList,
35988		cacheKey,
35989		task,
35990		stateManager,
35991		localGStateCache,
35992		localColorSpaceCache
35993	}) {
35994		const gStateRef = gState.objId;
35995		let isSimpleGState = true;
35996		const gStateObj = [];
35997		let promise = Promise.resolve();
35998		for (const key of gState.getKeys()) {
35999			const value = gState.get(key);
36000			switch (key) {
36001				case "Type":
36002					break;
36003				case "LW":
36004				case "LC":
36005				case "LJ":
36006				case "ML":
36007				case "D":
36008				case "RI":
36009				case "FL":
36010				case "CA":
36011				case "ca":
36012					gStateObj.push([key, value]);
36013					break;
36014				case "Font":
36015					isSimpleGState = false;
36016					promise = promise.then(() => this.handleSetFont(resources, null, value[0], operatorList, task, stateManager.state).then(function (loadedName) {
36017						operatorList.addDependency(loadedName);
36018						gStateObj.push([key, [loadedName, value[1]]]);
36019					}));
36020					break;
36021				case "BM":
36022					gStateObj.push([key, normalizeBlendMode(value)]);
36023					break;
36024				case "SMask":
36025					if (isName(value, "None")) {
36026						gStateObj.push([key, false]);
36027						break;
36028					}
36029					if (value instanceof Dict) {
36030						isSimpleGState = false;
36031						promise = promise.then(() => this.handleSMask(value, resources, operatorList, task, stateManager, localColorSpaceCache));
36032						gStateObj.push([key, true]);
36033					} else {
36034						warn("Unsupported SMask type");
36035					}
36036					break;
36037				case "TR":
36038					const transferMaps = this.handleTransferFunction(value);
36039					gStateObj.push([key, transferMaps]);
36040					break;
36041				case "OP":
36042				case "op":
36043				case "OPM":
36044				case "BG":
36045				case "BG2":
36046				case "UCR":
36047				case "UCR2":
36048				case "TR2":
36049				case "HT":
36050				case "SM":
36051				case "SA":
36052				case "AIS":
36053				case "TK":
36054					info("graphic state operator " + key);
36055					break;
36056				default:
36057					info("Unknown graphic state operator " + key);
36058					break;
36059			}
36060		}
36061		await promise;
36062		if (gStateObj.length > 0) {
36063			operatorList.addOp(OPS.setGState, [gStateObj]);
36064		}
36065		if (isSimpleGState) {
36066			localGStateCache.set(cacheKey, gStateRef, gStateObj);
36067		}
36068	}
36069	loadFont(fontName, font, resources, fallbackFontDict = null, cssFontInfo = null) {
36070		const errorFont = async () => {
36071			return new TranslatedFont({
36072				loadedName: "g_font_error",
36073				font: new ErrorFont(`Font "${fontName}" is not available.`),
36074				dict: font,
36075				evaluatorOptions: this.options
36076			});
36077		};
36078		let fontRef;
36079		if (font) {
36080			if (font instanceof Ref) {
36081				fontRef = font;
36082			}
36083		} else {
36084			const fontRes = resources.get("Font");
36085			if (fontRes) {
36086				fontRef = fontRes.getRaw(fontName);
36087			}
36088		}
36089		if (fontRef) {
36090			if (this.type3FontRefs?.has(fontRef)) {
36091				return errorFont();
36092			}
36093			if (this.fontCache.has(fontRef)) {
36094				return this.fontCache.get(fontRef);
36095			}
36096			try {
36097				font = this.xref.fetchIfRef(fontRef);
36098			} catch (ex) {
36099				warn(`loadFont - lookup failed: "${ex}".`);
36100			}
36101		}
36102		if (!(font instanceof Dict)) {
36103			if (!this.options.ignoreErrors && !this.parsingType3Font) {
36104				warn(`Font "${fontName}" is not available.`);
36105				return errorFont();
36106			}
36107			warn(`Font "${fontName}" is not available -- attempting to fallback to a default font.`);
36108			font = fallbackFontDict || PartialEvaluator.fallbackFontDict;
36109		}
36110		if (font.cacheKey && this.fontCache.has(font.cacheKey)) {
36111			return this.fontCache.get(font.cacheKey);
36112		}
36113		const {
36114			promise,
36115			resolve
36116		} = Promise.withResolvers();
36117		let preEvaluatedFont;
36118		try {
36119			preEvaluatedFont = this.preEvaluateFont(font);
36120			preEvaluatedFont.cssFontInfo = cssFontInfo;
36121		} catch (reason) {
36122			warn(`loadFont - preEvaluateFont failed: "${reason}".`);
36123			return errorFont();
36124		}
36125		const {
36126			descriptor,
36127			hash
36128		} = preEvaluatedFont;
36129		const fontRefIsRef = fontRef instanceof Ref;
36130		let fontID;
36131		if (hash && descriptor instanceof Dict) {
36132			const fontAliases = descriptor.fontAliases ||= Object.create(null);
36133			if (fontAliases[hash]) {
36134				const aliasFontRef = fontAliases[hash].aliasRef;
36135				if (fontRefIsRef && aliasFontRef && this.fontCache.has(aliasFontRef)) {
36136					this.fontCache.putAlias(fontRef, aliasFontRef);
36137					return this.fontCache.get(fontRef);
36138				}
36139			} else {
36140				fontAliases[hash] = {
36141					fontID: this.idFactory.createFontId()
36142				};
36143			}
36144			if (fontRefIsRef) {
36145				fontAliases[hash].aliasRef = fontRef;
36146			}
36147			fontID = fontAliases[hash].fontID;
36148		} else {
36149			fontID = this.idFactory.createFontId();
36150		}
36151		assert(fontID?.startsWith("f"), 'The "fontID" must be (correctly) defined.');
36152		if (fontRefIsRef) {
36153			this.fontCache.put(fontRef, promise);
36154		} else {
36155			font.cacheKey = `cacheKey_${fontID}`;
36156			this.fontCache.put(font.cacheKey, promise);
36157		}
36158		font.loadedName = `${this.idFactory.getDocId()}_${fontID}`;
36159		this.translateFont(preEvaluatedFont).then(translatedFont => {
36160			resolve(new TranslatedFont({
36161				loadedName: font.loadedName,
36162				font: translatedFont,
36163				dict: font,
36164				evaluatorOptions: this.options
36165			}));
36166		}).catch(reason => {
36167			warn(`loadFont - translateFont failed: "${reason}".`);
36168			resolve(new TranslatedFont({
36169				loadedName: font.loadedName,
36170				font: new ErrorFont(reason instanceof Error ? reason.message : reason),
36171				dict: font,
36172				evaluatorOptions: this.options
36173			}));
36174		});
36175		return promise;
36176	}
36177	buildPath(operatorList, fn, args, parsingText = false) {
36178		const lastIndex = operatorList.length - 1;
36179		if (!args) {
36180			args = [];
36181		}
36182		if (lastIndex < 0 || operatorList.fnArray[lastIndex] !== OPS.constructPath) {
36183			if (parsingText) {
36184				warn(`Encountered path operator "${fn}" inside of a text object.`);
36185				operatorList.addOp(OPS.save, null);
36186			}
36187			let minMax;
36188			switch (fn) {
36189				case OPS.rectangle:
36190					const x = args[0] + args[2];
36191					const y = args[1] + args[3];
36192					minMax = [Math.min(args[0], x), Math.min(args[1], y), Math.max(args[0], x), Math.max(args[1], y)];
36193					break;
36194				case OPS.moveTo:
36195				case OPS.lineTo:
36196					minMax = [args[0], args[1], args[0], args[1]];
36197					break;
36198				default:
36199					minMax = [Infinity, Infinity, -Infinity, -Infinity];
36200					break;
36201			}
36202			operatorList.addOp(OPS.constructPath, [[fn], args, minMax]);
36203			if (parsingText) {
36204				operatorList.addOp(OPS.restore, null);
36205			}
36206		} else {
36207			const opArgs = operatorList.argsArray[lastIndex];
36208			opArgs[0].push(fn);
36209			opArgs[1].push(...args);
36210			const minMax = opArgs[2];
36211			switch (fn) {
36212				case OPS.rectangle:
36213					const x = args[0] + args[2];
36214					const y = args[1] + args[3];
36215					minMax[0] = Math.min(minMax[0], args[0], x);
36216					minMax[1] = Math.min(minMax[1], args[1], y);
36217					minMax[2] = Math.max(minMax[2], args[0], x);
36218					minMax[3] = Math.max(minMax[3], args[1], y);
36219					break;
36220				case OPS.moveTo:
36221				case OPS.lineTo:
36222					minMax[0] = Math.min(minMax[0], args[0]);
36223					minMax[1] = Math.min(minMax[1], args[1]);
36224					minMax[2] = Math.max(minMax[2], args[0]);
36225					minMax[3] = Math.max(minMax[3], args[1]);
36226					break;
36227			}
36228		}
36229	}
36230	parseColorSpace({
36231		cs,
36232		resources,
36233		localColorSpaceCache
36234	}) {
36235		return ColorSpace.parseAsync({
36236			cs,
36237			xref: this.xref,
36238			resources,
36239			pdfFunctionFactory: this._pdfFunctionFactory,
36240			localColorSpaceCache
36241		}).catch(reason => {
36242			if (reason instanceof AbortException) {
36243				return null;
36244			}
36245			if (this.options.ignoreErrors) {
36246				warn(`parseColorSpace - ignoring ColorSpace: "${reason}".`);
36247				return null;
36248			}
36249			throw reason;
36250		});
36251	}
36252	parseShading({
36253		shading,
36254		resources,
36255		localColorSpaceCache,
36256		localShadingPatternCache
36257	}) {
36258		let id = localShadingPatternCache.get(shading);
36259		if (id) {
36260			return id;
36261		}
36262		let patternIR;
36263		try {
36264			const shadingFill = Pattern.parseShading(shading, this.xref, resources, this._pdfFunctionFactory, localColorSpaceCache);
36265			patternIR = shadingFill.getIR();
36266		} catch (reason) {
36267			if (reason instanceof AbortException) {
36268				return null;
36269			}
36270			if (this.options.ignoreErrors) {
36271				warn(`parseShading - ignoring shading: "${reason}".`);
36272				localShadingPatternCache.set(shading, null);
36273				return null;
36274			}
36275			throw reason;
36276		}
36277		id = `pattern_${this.idFactory.createObjId()}`;
36278		if (this.parsingType3Font) {
36279			id = `${this.idFactory.getDocId()}_type3_${id}`;
36280		}
36281		localShadingPatternCache.set(shading, id);
36282		if (this.parsingType3Font) {
36283			this.handler.send("commonobj", [id, "Pattern", patternIR]);
36284		} else {
36285			this.handler.send("obj", [id, this.pageIndex, "Pattern", patternIR]);
36286		}
36287		return id;
36288	}
36289	handleColorN(operatorList, fn, args, cs, patterns, resources, task, localColorSpaceCache, localTilingPatternCache, localShadingPatternCache) {
36290		const patternName = args.pop();
36291		if (patternName instanceof Name) {
36292			const rawPattern = patterns.getRaw(patternName.name);
36293			const localTilingPattern = rawPattern instanceof Ref && localTilingPatternCache.getByRef(rawPattern);
36294			if (localTilingPattern) {
36295				try {
36296					const color = cs.base ? cs.base.getRgb(args, 0) : null;
36297					const tilingPatternIR = getTilingPatternIR(localTilingPattern.operatorListIR, localTilingPattern.dict, color);
36298					operatorList.addOp(fn, tilingPatternIR);
36299					return undefined;
36300				} catch {}
36301			}
36302			const pattern = this.xref.fetchIfRef(rawPattern);
36303			if (pattern) {
36304				const dict = pattern instanceof BaseStream ? pattern.dict : pattern;
36305				const typeNum = dict.get("PatternType");
36306				if (typeNum === PatternType.TILING) {
36307					const color = cs.base ? cs.base.getRgb(args, 0) : null;
36308					return this.handleTilingType(fn, color, resources, pattern, dict, operatorList, task, localTilingPatternCache);
36309				} else if (typeNum === PatternType.SHADING) {
36310					const shading = dict.get("Shading");
36311					const objId = this.parseShading({
36312						shading,
36313						resources,
36314						localColorSpaceCache,
36315						localShadingPatternCache
36316					});
36317					if (objId) {
36318						const matrix = lookupMatrix(dict.getArray("Matrix"), null);
36319						operatorList.addOp(fn, ["Shading", objId, matrix]);
36320					}
36321					return undefined;
36322				}
36323				throw new FormatError(`Unknown PatternType: ${typeNum}`);
36324			}
36325		}
36326		throw new FormatError(`Unknown PatternName: ${patternName}`);
36327	}
36328	_parseVisibilityExpression(array, nestingCounter, currentResult) {
36329		const MAX_NESTING = 10;
36330		if (++nestingCounter > MAX_NESTING) {
36331			warn("Visibility expression is too deeply nested");
36332			return;
36333		}
36334		const length = array.length;
36335		const operator = this.xref.fetchIfRef(array[0]);
36336		if (length < 2 || !(operator instanceof Name)) {
36337			warn("Invalid visibility expression");
36338			return;
36339		}
36340		switch (operator.name) {
36341			case "And":
36342			case "Or":
36343			case "Not":
36344				currentResult.push(operator.name);
36345				break;
36346			default:
36347				warn(`Invalid operator ${operator.name} in visibility expression`);
36348				return;
36349		}
36350		for (let i = 1; i < length; i++) {
36351			const raw = array[i];
36352			const object = this.xref.fetchIfRef(raw);
36353			if (Array.isArray(object)) {
36354				const nestedResult = [];
36355				currentResult.push(nestedResult);
36356				this._parseVisibilityExpression(object, nestingCounter, nestedResult);
36357			} else if (raw instanceof Ref) {
36358				currentResult.push(raw.toString());
36359			}
36360		}
36361	}
36362	async parseMarkedContentProps(contentProperties, resources) {
36363		let optionalContent;
36364		if (contentProperties instanceof Name) {
36365			const properties = resources.get("Properties");
36366			optionalContent = properties.get(contentProperties.name);
36367		} else if (contentProperties instanceof Dict) {
36368			optionalContent = contentProperties;
36369		} else {
36370			throw new FormatError("Optional content properties malformed.");
36371		}
36372		const optionalContentType = optionalContent.get("Type")?.name;
36373		if (optionalContentType === "OCG") {
36374			return {
36375				type: optionalContentType,
36376				id: optionalContent.objId
36377			};
36378		} else if (optionalContentType === "OCMD") {
36379			const expression = optionalContent.get("VE");
36380			if (Array.isArray(expression)) {
36381				const result = [];
36382				this._parseVisibilityExpression(expression, 0, result);
36383				if (result.length > 0) {
36384					return {
36385						type: "OCMD",
36386						expression: result
36387					};
36388				}
36389			}
36390			const optionalContentGroups = optionalContent.get("OCGs");
36391			if (Array.isArray(optionalContentGroups) || optionalContentGroups instanceof Dict) {
36392				const groupIds = [];
36393				if (Array.isArray(optionalContentGroups)) {
36394					for (const ocg of optionalContentGroups) {
36395						groupIds.push(ocg.toString());
36396					}
36397				} else {
36398					groupIds.push(optionalContentGroups.objId);
36399				}
36400				return {
36401					type: optionalContentType,
36402					ids: groupIds,
36403					policy: optionalContent.get("P") instanceof Name ? optionalContent.get("P").name : null,
36404					expression: null
36405				};
36406			} else if (optionalContentGroups instanceof Ref) {
36407				return {
36408					type: optionalContentType,
36409					id: optionalContentGroups.toString()
36410				};
36411			}
36412		}
36413		return null;
36414	}
36415	getOperatorList({
36416		stream,
36417		task,
36418		resources,
36419		operatorList,
36420		initialState = null,
36421		fallbackFontDict = null
36422	}) {
36423		resources ||= Dict.empty;
36424		initialState ||= new EvalState();
36425		if (!operatorList) {
36426			throw new Error('getOperatorList: missing "operatorList" parameter');
36427		}
36428		const self = this;
36429		const xref = this.xref;
36430		let parsingText = false;
vendor: 17,557 bytes, lines 36431-36989
36431		const localImageCache = new LocalImageCache();
36432		const localColorSpaceCache = new LocalColorSpaceCache();
36433		const localGStateCache = new LocalGStateCache();
36434		const localTilingPatternCache = new LocalTilingPatternCache();
36435		const localShadingPatternCache = new Map();
36436		const xobjs = resources.get("XObject") || Dict.empty;
36437		const patterns = resources.get("Pattern") || Dict.empty;
36438		const stateManager = new StateManager(initialState);
36439		const preprocessor = new EvaluatorPreprocessor(stream, xref, stateManager);
36440		const timeSlotManager = new TimeSlotManager();
36441		function closePendingRestoreOPS(argument) {
36442			for (let i = 0, ii = preprocessor.savedStatesDepth; i < ii; i++) {
36443				operatorList.addOp(OPS.restore, []);
36444			}
36445		}
36446		return new Promise(function promiseBody(resolve, reject) {
36447			const next = function (promise) {
36448				Promise.all([promise, operatorList.ready]).then(function () {
36449					try {
36450						promiseBody(resolve, reject);
36451					} catch (ex) {
36452						reject(ex);
36453					}
36454				}, reject);
36455			};
36456			task.ensureNotTerminated();
36457			timeSlotManager.reset();
36458			const operation = {};
36459			let stop, i, ii, cs, name, isValidName;
36460			while (!(stop = timeSlotManager.check())) {
36461				operation.args = null;
36462				if (!preprocessor.read(operation)) {
36463					break;
36464				}
36465				let args = operation.args;
36466				let fn = operation.fn;
36467				switch (fn | 0) {
36468					case OPS.paintXObject:
36469						isValidName = args[0] instanceof Name;
36470						name = args[0].name;
36471						if (isValidName) {
36472							const localImage = localImageCache.getByName(name);
36473							if (localImage) {
36474								addLocallyCachedImageOps(operatorList, localImage);
36475								args = null;
36476								continue;
36477							}
36478						}
36479						next(new Promise(function (resolveXObject, rejectXObject) {
36480							if (!isValidName) {
36481								throw new FormatError("XObject must be referred to by name.");
36482							}
36483							let xobj = xobjs.getRaw(name);
36484							if (xobj instanceof Ref) {
36485								const localImage = localImageCache.getByRef(xobj) || self._regionalImageCache.getByRef(xobj);
36486								if (localImage) {
36487									addLocallyCachedImageOps(operatorList, localImage);
36488									resolveXObject();
36489									return;
36490								}
36491								const globalImage = self.globalImageCache.getData(xobj, self.pageIndex);
36492								if (globalImage) {
36493									operatorList.addDependency(globalImage.objId);
36494									operatorList.addImageOps(globalImage.fn, globalImage.args, globalImage.optionalContent, globalImage.hasMask);
36495									resolveXObject();
36496									return;
36497								}
36498								xobj = xref.fetch(xobj);
36499							}
36500							if (!(xobj instanceof BaseStream)) {
36501								throw new FormatError("XObject should be a stream");
36502							}
36503							const type = xobj.dict.get("Subtype");
36504							if (!(type instanceof Name)) {
36505								throw new FormatError("XObject should have a Name subtype");
36506							}
36507							if (type.name === "Form") {
36508								stateManager.save();
36509								self.buildFormXObject(resources, xobj, null, operatorList, task, stateManager.state.clone(), localColorSpaceCache).then(function () {
36510									stateManager.restore();
36511									resolveXObject();
36512								}, rejectXObject);
36513								return;
36514							} else if (type.name === "Image") {
36515								self.buildPaintImageXObject({
36516									resources,
36517									image: xobj,
36518									operatorList,
36519									cacheKey: name,
36520									localImageCache,
36521									localColorSpaceCache
36522								}).then(resolveXObject, rejectXObject);
36523								return;
36524							} else if (type.name === "PS") {
36525								info("Ignored XObject subtype PS");
36526							} else {
36527								throw new FormatError(`Unhandled XObject subtype ${type.name}`);
36528							}
36529							resolveXObject();
36530						}).catch(function (reason) {
36531							if (reason instanceof AbortException) {
36532								return;
36533							}
36534							if (self.options.ignoreErrors) {
36535								warn(`getOperatorList - ignoring XObject: "${reason}".`);
36536								return;
36537							}
36538							throw reason;
36539						}));
36540						return;
36541					case OPS.setFont:
36542						const fontSize = args[1];
36543						next(self.handleSetFont(resources, args, null, operatorList, task, stateManager.state, fallbackFontDict).then(function (loadedName) {
36544							operatorList.addDependency(loadedName);
36545							operatorList.addOp(OPS.setFont, [loadedName, fontSize]);
36546						}));
36547						return;
36548					case OPS.beginText:
36549						parsingText = true;
36550						break;
36551					case OPS.endText:
36552						parsingText = false;
36553						break;
36554					case OPS.endInlineImage:
36555						const cacheKey = args[0].cacheKey;
36556						if (cacheKey) {
36557							const localImage = localImageCache.getByName(cacheKey);
36558							if (localImage) {
36559								addLocallyCachedImageOps(operatorList, localImage);
36560								args = null;
36561								continue;
36562							}
36563						}
36564						next(self.buildPaintImageXObject({
36565							resources,
36566							image: args[0],
36567							isInline: true,
36568							operatorList,
36569							cacheKey,
36570							localImageCache,
36571							localColorSpaceCache
36572						}));
36573						return;
36574					case OPS.showText:
36575						if (!stateManager.state.font) {
36576							self.ensureStateFont(stateManager.state);
36577							continue;
36578						}
36579						args[0] = self.handleText(args[0], stateManager.state);
36580						break;
36581					case OPS.showSpacedText:
36582						if (!stateManager.state.font) {
36583							self.ensureStateFont(stateManager.state);
36584							continue;
36585						}
36586						const combinedGlyphs = [],
36587							state = stateManager.state;
36588						for (const arrItem of args[0]) {
36589							if (typeof arrItem === "string") {
36590								combinedGlyphs.push(...self.handleText(arrItem, state));
36591							} else if (typeof arrItem === "number") {
36592								combinedGlyphs.push(arrItem);
36593							}
36594						}
36595						args[0] = combinedGlyphs;
36596						fn = OPS.showText;
36597						break;
36598					case OPS.nextLineShowText:
36599						if (!stateManager.state.font) {
36600							self.ensureStateFont(stateManager.state);
36601							continue;
36602						}
36603						operatorList.addOp(OPS.nextLine);
36604						args[0] = self.handleText(args[0], stateManager.state);
36605						fn = OPS.showText;
36606						break;
36607					case OPS.nextLineSetSpacingShowText:
36608						if (!stateManager.state.font) {
36609							self.ensureStateFont(stateManager.state);
36610							continue;
36611						}
36612						operatorList.addOp(OPS.nextLine);
36613						operatorList.addOp(OPS.setWordSpacing, [args.shift()]);
36614						operatorList.addOp(OPS.setCharSpacing, [args.shift()]);
36615						args[0] = self.handleText(args[0], stateManager.state);
36616						fn = OPS.showText;
36617						break;
36618					case OPS.setTextRenderingMode:
36619						stateManager.state.textRenderingMode = args[0];
36620						break;
36621					case OPS.setFillColorSpace:
36622						{
36623							const cachedColorSpace = ColorSpace.getCached(args[0], xref, localColorSpaceCache);
36624							if (cachedColorSpace) {
36625								stateManager.state.fillColorSpace = cachedColorSpace;
36626								continue;
36627							}
36628							next(self.parseColorSpace({
36629								cs: args[0],
36630								resources,
36631								localColorSpaceCache
36632							}).then(function (colorSpace) {
36633								stateManager.state.fillColorSpace = colorSpace || ColorSpace.singletons.gray;
36634							}));
36635							return;
36636						}
36637					case OPS.setStrokeColorSpace:
36638						{
36639							const cachedColorSpace = ColorSpace.getCached(args[0], xref, localColorSpaceCache);
36640							if (cachedColorSpace) {
36641								stateManager.state.strokeColorSpace = cachedColorSpace;
36642								continue;
36643							}
36644							next(self.parseColorSpace({
36645								cs: args[0],
36646								resources,
36647								localColorSpaceCache
36648							}).then(function (colorSpace) {
36649								stateManager.state.strokeColorSpace = colorSpace || ColorSpace.singletons.gray;
36650							}));
36651							return;
36652						}
36653					case OPS.setFillColor:
36654						cs = stateManager.state.fillColorSpace;
36655						args = cs.getRgb(args, 0);
36656						fn = OPS.setFillRGBColor;
36657						break;
36658					case OPS.setStrokeColor:
36659						cs = stateManager.state.strokeColorSpace;
36660						args = cs.getRgb(args, 0);
36661						fn = OPS.setStrokeRGBColor;
36662						break;
36663					case OPS.setFillGray:
36664						stateManager.state.fillColorSpace = ColorSpace.singletons.gray;
36665						args = ColorSpace.singletons.gray.getRgb(args, 0);
36666						fn = OPS.setFillRGBColor;
36667						break;
36668					case OPS.setStrokeGray:
36669						stateManager.state.strokeColorSpace = ColorSpace.singletons.gray;
36670						args = ColorSpace.singletons.gray.getRgb(args, 0);
36671						fn = OPS.setStrokeRGBColor;
36672						break;
36673					case OPS.setFillCMYKColor:
36674						stateManager.state.fillColorSpace = ColorSpace.singletons.cmyk;
36675						args = ColorSpace.singletons.cmyk.getRgb(args, 0);
36676						fn = OPS.setFillRGBColor;
36677						break;
36678					case OPS.setStrokeCMYKColor:
36679						stateManager.state.strokeColorSpace = ColorSpace.singletons.cmyk;
36680						args = ColorSpace.singletons.cmyk.getRgb(args, 0);
36681						fn = OPS.setStrokeRGBColor;
36682						break;
36683					case OPS.setFillRGBColor:
36684						stateManager.state.fillColorSpace = ColorSpace.singletons.rgb;
36685						args = ColorSpace.singletons.rgb.getRgb(args, 0);
36686						break;
36687					case OPS.setStrokeRGBColor:
36688						stateManager.state.strokeColorSpace = ColorSpace.singletons.rgb;
36689						args = ColorSpace.singletons.rgb.getRgb(args, 0);
36690						break;
36691					case OPS.setFillColorN:
36692						cs = stateManager.state.patternFillColorSpace;
36693						if (!cs) {
36694							if (isNumberArray(args, null)) {
36695								args = ColorSpace.singletons.gray.getRgb(args, 0);
36696								fn = OPS.setFillRGBColor;
36697								break;
36698							}
36699							args = [];
36700							fn = OPS.setFillTransparent;
36701							break;
36702						}
36703						if (cs.name === "Pattern") {
36704							next(self.handleColorN(operatorList, OPS.setFillColorN, args, cs, patterns, resources, task, localColorSpaceCache, localTilingPatternCache, localShadingPatternCache));
36705							return;
36706						}
36707						args = cs.getRgb(args, 0);
36708						fn = OPS.setFillRGBColor;
36709						break;
36710					case OPS.setStrokeColorN:
36711						cs = stateManager.state.patternStrokeColorSpace;
36712						if (!cs) {
36713							if (isNumberArray(args, null)) {
36714								args = ColorSpace.singletons.gray.getRgb(args, 0);
36715								fn = OPS.setStrokeRGBColor;
36716								break;
36717							}
36718							args = [];
36719							fn = OPS.setStrokeTransparent;
36720							break;
36721						}
36722						if (cs.name === "Pattern") {
36723							next(self.handleColorN(operatorList, OPS.setStrokeColorN, args, cs, patterns, resources, task, localColorSpaceCache, localTilingPatternCache, localShadingPatternCache));
36724							return;
36725						}
36726						args = cs.getRgb(args, 0);
36727						fn = OPS.setStrokeRGBColor;
36728						break;
36729					case OPS.shadingFill:
36730						let shading;
36731						try {
36732							const shadingRes = resources.get("Shading");
36733							if (!shadingRes) {
36734								throw new FormatError("No shading resource found");
36735							}
36736							shading = shadingRes.get(args[0].name);
36737							if (!shading) {
36738								throw new FormatError("No shading object found");
36739							}
36740						} catch (reason) {
36741							if (reason instanceof AbortException) {
36742								continue;
36743							}
36744							if (self.options.ignoreErrors) {
36745								warn(`getOperatorList - ignoring Shading: "${reason}".`);
36746								continue;
36747							}
36748							throw reason;
36749						}
36750						const patternId = self.parseShading({
36751							shading,
36752							resources,
36753							localColorSpaceCache,
36754							localShadingPatternCache
36755						});
36756						if (!patternId) {
36757							continue;
36758						}
36759						args = [patternId];
36760						fn = OPS.shadingFill;
36761						break;
36762					case OPS.setGState:
36763						isValidName = args[0] instanceof Name;
36764						name = args[0].name;
36765						if (isValidName) {
36766							const localGStateObj = localGStateCache.getByName(name);
36767							if (localGStateObj) {
36768								if (localGStateObj.length > 0) {
36769									operatorList.addOp(OPS.setGState, [localGStateObj]);
36770								}
36771								args = null;
36772								continue;
36773							}
36774						}
36775						next(new Promise(function (resolveGState, rejectGState) {
36776							if (!isValidName) {
36777								throw new FormatError("GState must be referred to by name.");
36778							}
36779							const extGState = resources.get("ExtGState");
36780							if (!(extGState instanceof Dict)) {
36781								throw new FormatError("ExtGState should be a dictionary.");
36782							}
36783							const gState = extGState.get(name);
36784							if (!(gState instanceof Dict)) {
36785								throw new FormatError("GState should be a dictionary.");
36786							}
36787							self.setGState({
36788								resources,
36789								gState,
36790								operatorList,
36791								cacheKey: name,
36792								task,
36793								stateManager,
36794								localGStateCache,
36795								localColorSpaceCache
36796							}).then(resolveGState, rejectGState);
36797						}).catch(function (reason) {
36798							if (reason instanceof AbortException) {
36799								return;
36800							}
36801							if (self.options.ignoreErrors) {
36802								warn(`getOperatorList - ignoring ExtGState: "${reason}".`);
36803								return;
36804							}
36805							throw reason;
36806						}));
36807						return;
36808					case OPS.moveTo:
36809					case OPS.lineTo:
36810					case OPS.curveTo:
36811					case OPS.curveTo2:
36812					case OPS.curveTo3:
36813					case OPS.closePath:
36814					case OPS.rectangle:
36815						self.buildPath(operatorList, fn, args, parsingText);
36816						continue;
36817					case OPS.markPoint:
36818					case OPS.markPointProps:
36819					case OPS.beginCompat:
36820					case OPS.endCompat:
36821						continue;
36822					case OPS.beginMarkedContentProps:
36823						if (!(args[0] instanceof Name)) {
36824							warn(`Expected name for beginMarkedContentProps arg0=${args[0]}`);
36825							operatorList.addOp(OPS.beginMarkedContentProps, ["OC", null]);
36826							continue;
36827						}
36828						if (args[0].name === "OC") {
36829							next(self.parseMarkedContentProps(args[1], resources).then(data => {
36830								operatorList.addOp(OPS.beginMarkedContentProps, ["OC", data]);
36831							}).catch(reason => {
36832								if (reason instanceof AbortException) {
36833									return;
36834								}
36835								if (self.options.ignoreErrors) {
36836									warn(`getOperatorList - ignoring beginMarkedContentProps: "${reason}".`);
36837									operatorList.addOp(OPS.beginMarkedContentProps, ["OC", null]);
36838									return;
36839								}
36840								throw reason;
36841							}));
36842							return;
36843						}
36844						args = [args[0].name, args[1] instanceof Dict ? args[1].get("MCID") : null];
36845						break;
36846					case OPS.beginMarkedContent:
36847					case OPS.endMarkedContent:
36848					default:
36849						if (args !== null) {
36850							for (i = 0, ii = args.length; i < ii; i++) {
36851								if (args[i] instanceof Dict) {
36852									break;
36853								}
36854							}
36855							if (i < ii) {
36856								warn("getOperatorList - ignoring operator: " + fn);
36857								continue;
36858							}
36859						}
36860				}
36861				operatorList.addOp(fn, args);
36862			}
36863			if (stop) {
36864				next(deferred);
36865				return;
36866			}
36867			closePendingRestoreOPS();
36868			resolve();
36869		}).catch(reason => {
36870			if (reason instanceof AbortException) {
36871				return;
36872			}
36873			if (this.options.ignoreErrors) {
36874				warn(`getOperatorList - ignoring errors during "${task.name}" ` + `task: "${reason}".`);
36875				closePendingRestoreOPS();
36876				return;
36877			}
36878			throw reason;
36879		});
36880	}
36881	getTextContent({
36882		stream,
36883		task,
36884		resources,
36885		stateManager = null,
36886		includeMarkedContent = false,
36887		sink,
36888		seenStyles = new Set(),
36889		viewBox,
36890		lang = null,
36891		markedContentData = null,
36892		disableNormalization = false,
36893		keepWhiteSpace = false
36894	}) {
36895		resources ||= Dict.empty;
36896		stateManager ||= new StateManager(new TextState());
36897		if (includeMarkedContent) {
36898			markedContentData ||= {
36899				level: 0
36900			};
36901		}
36902		const textContent = {
36903			items: [],
36904			styles: Object.create(null),
36905			lang
36906		};
36907		const textContentItem = {
36908			initialized: false,
36909			str: [],
36910			totalWidth: 0,
36911			totalHeight: 0,
36912			width: 0,
36913			height: 0,
36914			vertical: false,
36915			prevTransform: null,
36916			textAdvanceScale: 0,
36917			spaceInFlowMin: 0,
36918			spaceInFlowMax: 0,
36919			trackingSpaceMin: Infinity,
36920			negativeSpaceMax: -Infinity,
36921			notASpace: -Infinity,
36922			transform: null,
36923			fontName: null,
36924			hasEOL: false
36925		};
36926		const twoLastChars = [" ", " "];
36927		let twoLastCharsPos = 0;
36928		function saveLastChar(char) {
36929			const nextPos = (twoLastCharsPos + 1) % 2;
36930			const ret = twoLastChars[twoLastCharsPos] !== " " && twoLastChars[nextPos] === " ";
36931			twoLastChars[twoLastCharsPos] = char;
36932			twoLastCharsPos = nextPos;
36933			return !keepWhiteSpace && ret;
36934		}
36935		function shouldAddWhitepsace() {
36936			return !keepWhiteSpace && twoLastChars[twoLastCharsPos] !== " " && twoLastChars[(twoLastCharsPos + 1) % 2] === " ";
36937		}
36938		function resetLastChars() {
36939			twoLastChars[0] = twoLastChars[1] = " ";
36940			twoLastCharsPos = 0;
36941		}
36942		const TRACKING_SPACE_FACTOR = 0.102;
36943		const NOT_A_SPACE_FACTOR = 0.03;
36944		const NEGATIVE_SPACE_FACTOR = -0.2;
36945		const SPACE_IN_FLOW_MIN_FACTOR = 0.102;
36946		const SPACE_IN_FLOW_MAX_FACTOR = 0.6;
36947		const VERTICAL_SHIFT_RATIO = 0.25;
36948		const self = this;
36949		const xref = this.xref;
36950		const showSpacedTextBuffer = [];
36951		let xobjs = null;
36952		const emptyXObjectCache = new LocalImageCache();
36953		const emptyGStateCache = new LocalGStateCache();
36954		const preprocessor = new EvaluatorPreprocessor(stream, xref, stateManager);
36955		let textState;
36956		function pushWhitespace({
36957			width = 0,
36958			height = 0,
36959			transform = textContentItem.prevTransform,
36960			fontName = textContentItem.fontName
36961		}) {
36962			textContent.items.push({
36963				str: " ",
36964				dir: "ltr",
36965				width,
36966				height,
36967				transform,
36968				fontName,
36969				hasEOL: false
36970			});
36971		}
36972		function getCurrentTextTransform() {
36973			const font = textState.font;
36974			const tsm = [textState.fontSize * textState.textHScale, 0, 0, textState.fontSize, 0, textState.textRise];
36975			if (font.isType3Font && (textState.fontSize <= 1 || font.isCharBBox) && !isArrayEqual(textState.fontMatrix, FONT_IDENTITY_MATRIX)) {
36976				const glyphHeight = font.bbox[3] - font.bbox[1];
36977				if (glyphHeight > 0) {
36978					tsm[3] *= glyphHeight * textState.fontMatrix[3];
36979				}
36980			}
36981			return Util.transform(textState.ctm, Util.transform(textState.textMatrix, tsm));
36982		}
36983		function ensureTextContentItem() {
36984			if (textContentItem.initialized) {
36985				return textContentItem;
36986			}
36987			const {
36988				font,
36989				loadedName
vendor: 1,032 bytes, lines 36990-37015
36990			} = textState;
36991			if (!seenStyles.has(loadedName)) {
36992				seenStyles.add(loadedName);
36993				textContent.styles[loadedName] = {
36994					fontFamily: font.fallbackName,
36995					ascent: font.ascent,
36996					descent: font.descent,
36997					vertical: font.vertical
36998				};
36999				if (self.options.fontExtraProperties && font.systemFontInfo) {
37000					const style = textContent.styles[loadedName];
37001					style.fontSubstitution = font.systemFontInfo.css;
37002					style.fontSubstitutionLoadedName = font.systemFontInfo.loadedName;
37003				}
37004			}
37005			textContentItem.fontName = loadedName;
37006			const trm = textContentItem.transform = getCurrentTextTransform();
37007			if (!font.vertical) {
37008				textContentItem.width = textContentItem.totalWidth = 0;
37009				textContentItem.height = textContentItem.totalHeight = Math.hypot(trm[2], trm[3]);
37010				textContentItem.vertical = false;
37011			} else {
37012				textContentItem.width = textContentItem.totalWidth = Math.hypot(trm[0], trm[1]);
37013				textContentItem.height = textContentItem.totalHeight = 0;
37014				textContentItem.vertical = true;
37015			}
vendor: 23,612 bytes, lines 37016-37764
37016			const scaleLineX = Math.hypot(textState.textLineMatrix[0], textState.textLineMatrix[1]);
37017			const scaleCtmX = Math.hypot(textState.ctm[0], textState.ctm[1]);
37018			textContentItem.textAdvanceScale = scaleCtmX * scaleLineX;
37019			const {
37020				fontSize
37021			} = textState;
37022			textContentItem.trackingSpaceMin = fontSize * TRACKING_SPACE_FACTOR;
37023			textContentItem.notASpace = fontSize * NOT_A_SPACE_FACTOR;
37024			textContentItem.negativeSpaceMax = fontSize * NEGATIVE_SPACE_FACTOR;
37025			textContentItem.spaceInFlowMin = fontSize * SPACE_IN_FLOW_MIN_FACTOR;
37026			textContentItem.spaceInFlowMax = fontSize * SPACE_IN_FLOW_MAX_FACTOR;
37027			textContentItem.hasEOL = false;
37028			textContentItem.initialized = true;
37029			return textContentItem;
37030		}
37031		function updateAdvanceScale() {
37032			if (!textContentItem.initialized) {
37033				return;
37034			}
37035			const scaleLineX = Math.hypot(textState.textLineMatrix[0], textState.textLineMatrix[1]);
37036			const scaleCtmX = Math.hypot(textState.ctm[0], textState.ctm[1]);
37037			const scaleFactor = scaleCtmX * scaleLineX;
37038			if (scaleFactor === textContentItem.textAdvanceScale) {
37039				return;
37040			}
37041			if (!textContentItem.vertical) {
37042				textContentItem.totalWidth += textContentItem.width * textContentItem.textAdvanceScale;
37043				textContentItem.width = 0;
37044			} else {
37045				textContentItem.totalHeight += textContentItem.height * textContentItem.textAdvanceScale;
37046				textContentItem.height = 0;
37047			}
37048			textContentItem.textAdvanceScale = scaleFactor;
37049		}
37050		function runBidiTransform(textChunk) {
37051			let text = textChunk.str.join("");
37052			if (!disableNormalization) {
37053				text = normalizeUnicode(text);
37054			}
37055			const bidiResult = bidi(text, -1, textChunk.vertical);
37056			return {
37057				str: bidiResult.str,
37058				dir: bidiResult.dir,
37059				width: Math.abs(textChunk.totalWidth),
37060				height: Math.abs(textChunk.totalHeight),
37061				transform: textChunk.transform,
37062				fontName: textChunk.fontName,
37063				hasEOL: textChunk.hasEOL
37064			};
37065		}
37066		async function handleSetFont(fontName, fontRef) {
37067			const translated = await self.loadFont(fontName, fontRef, resources);
37068			if (translated.font.isType3Font) {
37069				try {
37070					await translated.loadType3Data(self, resources, task);
37071				} catch {}
37072			}
37073			textState.loadedName = translated.loadedName;
37074			textState.font = translated.font;
37075			textState.fontMatrix = translated.font.fontMatrix || FONT_IDENTITY_MATRIX;
37076		}
37077		function applyInverseRotation(x, y, matrix) {
37078			const scale = Math.hypot(matrix[0], matrix[1]);
37079			return [(matrix[0] * x + matrix[1] * y) / scale, (matrix[2] * x + matrix[3] * y) / scale];
37080		}
37081		function compareWithLastPosition(glyphWidth) {
37082			const currentTransform = getCurrentTextTransform();
37083			let posX = currentTransform[4];
37084			let posY = currentTransform[5];
37085			if (textState.font?.vertical) {
37086				if (posX < viewBox[0] || posX > viewBox[2] || posY + glyphWidth < viewBox[1] || posY > viewBox[3]) {
37087					return false;
37088				}
37089			} else if (posX + glyphWidth < viewBox[0] || posX > viewBox[2] || posY < viewBox[1] || posY > viewBox[3]) {
37090				return false;
37091			}
37092			if (!textState.font || !textContentItem.prevTransform) {
37093				return true;
37094			}
37095			let lastPosX = textContentItem.prevTransform[4];
37096			let lastPosY = textContentItem.prevTransform[5];
37097			if (lastPosX === posX && lastPosY === posY) {
37098				return true;
37099			}
37100			let rotate = -1;
37101			if (currentTransform[0] && currentTransform[1] === 0 && currentTransform[2] === 0) {
37102				rotate = currentTransform[0] > 0 ? 0 : 180;
37103			} else if (currentTransform[1] && currentTransform[0] === 0 && currentTransform[3] === 0) {
37104				rotate = currentTransform[1] > 0 ? 90 : 270;
37105			}
37106			switch (rotate) {
37107				case 0:
37108					break;
37109				case 90:
37110					[posX, posY] = [posY, posX];
37111					[lastPosX, lastPosY] = [lastPosY, lastPosX];
37112					break;
37113				case 180:
37114					[posX, posY, lastPosX, lastPosY] = [-posX, -posY, -lastPosX, -lastPosY];
37115					break;
37116				case 270:
37117					[posX, posY] = [-posY, -posX];
37118					[lastPosX, lastPosY] = [-lastPosY, -lastPosX];
37119					break;
37120				default:
37121					[posX, posY] = applyInverseRotation(posX, posY, currentTransform);
37122					[lastPosX, lastPosY] = applyInverseRotation(lastPosX, lastPosY, textContentItem.prevTransform);
37123			}
37124			if (textState.font.vertical) {
37125				const advanceY = (lastPosY - posY) / textContentItem.textAdvanceScale;
37126				const advanceX = posX - lastPosX;
37127				const textOrientation = Math.sign(textContentItem.height);
37128				if (advanceY < textOrientation * textContentItem.negativeSpaceMax) {
37129					if (Math.abs(advanceX) > 0.5 * textContentItem.width) {
37130						appendEOL();
37131						return true;
37132					}
37133					resetLastChars();
37134					flushTextContentItem();
37135					return true;
37136				}
37137				if (Math.abs(advanceX) > textContentItem.width) {
37138					appendEOL();
37139					return true;
37140				}
37141				if (advanceY <= textOrientation * textContentItem.notASpace) {
37142					resetLastChars();
37143				}
37144				if (advanceY <= textOrientation * textContentItem.trackingSpaceMin) {
37145					if (shouldAddWhitepsace()) {
37146						resetLastChars();
37147						flushTextContentItem();
37148						pushWhitespace({
37149							height: Math.abs(advanceY)
37150						});
37151					} else {
37152						textContentItem.height += advanceY;
37153					}
37154				} else if (!addFakeSpaces(advanceY, textContentItem.prevTransform, textOrientation)) {
37155					if (textContentItem.str.length === 0) {
37156						resetLastChars();
37157						pushWhitespace({
37158							height: Math.abs(advanceY)
37159						});
37160					} else {
37161						textContentItem.height += advanceY;
37162					}
37163				}
37164				if (Math.abs(advanceX) > textContentItem.width * VERTICAL_SHIFT_RATIO) {
37165					flushTextContentItem();
37166				}
37167				return true;
37168			}
37169			const advanceX = (posX - lastPosX) / textContentItem.textAdvanceScale;
37170			const advanceY = posY - lastPosY;
37171			const textOrientation = Math.sign(textContentItem.width);
37172			if (advanceX < textOrientation * textContentItem.negativeSpaceMax) {
37173				if (Math.abs(advanceY) > 0.5 * textContentItem.height) {
37174					appendEOL();
37175					return true;
37176				}
37177				resetLastChars();
37178				flushTextContentItem();
37179				return true;
37180			}
37181			if (Math.abs(advanceY) > textContentItem.height) {
37182				appendEOL();
37183				return true;
37184			}
37185			if (advanceX <= textOrientation * textContentItem.notASpace) {
37186				resetLastChars();
37187			}
37188			if (advanceX <= textOrientation * textContentItem.trackingSpaceMin) {
37189				if (shouldAddWhitepsace()) {
37190					resetLastChars();
37191					flushTextContentItem();
37192					pushWhitespace({
37193						width: Math.abs(advanceX)
37194					});
37195				} else {
37196					textContentItem.width += advanceX;
37197				}
37198			} else if (!addFakeSpaces(advanceX, textContentItem.prevTransform, textOrientation)) {
37199				if (textContentItem.str.length === 0) {
37200					resetLastChars();
37201					pushWhitespace({
37202						width: Math.abs(advanceX)
37203					});
37204				} else {
37205					textContentItem.width += advanceX;
37206				}
37207			}
37208			if (Math.abs(advanceY) > textContentItem.height * VERTICAL_SHIFT_RATIO) {
37209				flushTextContentItem();
37210			}
37211			return true;
37212		}
37213		function buildTextContentItem({
37214			chars,
37215			extraSpacing
37216		}) {
37217			const font = textState.font;
37218			if (!chars) {
37219				const charSpacing = textState.charSpacing + extraSpacing;
37220				if (charSpacing) {
37221					if (!font.vertical) {
37222						textState.translateTextMatrix(charSpacing * textState.textHScale, 0);
37223					} else {
37224						textState.translateTextMatrix(0, -charSpacing);
37225					}
37226				}
37227				if (keepWhiteSpace) {
37228					compareWithLastPosition(0);
37229				}
37230				return;
37231			}
37232			const glyphs = font.charsToGlyphs(chars);
37233			const scale = textState.fontMatrix[0] * textState.fontSize;
37234			for (let i = 0, ii = glyphs.length; i < ii; i++) {
37235				const glyph = glyphs[i];
37236				const {
37237					category
37238				} = glyph;
37239				if (category.isInvisibleFormatMark) {
37240					continue;
37241				}
37242				let charSpacing = textState.charSpacing + (i + 1 === ii ? extraSpacing : 0);
37243				let glyphWidth = glyph.width;
37244				if (font.vertical) {
37245					glyphWidth = glyph.vmetric ? glyph.vmetric[0] : -glyphWidth;
37246				}
37247				let scaledDim = glyphWidth * scale;
37248				if (!keepWhiteSpace && category.isWhitespace) {
37249					if (!font.vertical) {
37250						charSpacing += scaledDim + textState.wordSpacing;
37251						textState.translateTextMatrix(charSpacing * textState.textHScale, 0);
37252					} else {
37253						charSpacing += -scaledDim + textState.wordSpacing;
37254						textState.translateTextMatrix(0, -charSpacing);
37255					}
37256					saveLastChar(" ");
37257					continue;
37258				}
37259				if (!category.isZeroWidthDiacritic && !compareWithLastPosition(scaledDim)) {
37260					if (!font.vertical) {
37261						textState.translateTextMatrix(scaledDim * textState.textHScale, 0);
37262					} else {
37263						textState.translateTextMatrix(0, scaledDim);
37264					}
37265					continue;
37266				}
37267				const textChunk = ensureTextContentItem();
37268				if (category.isZeroWidthDiacritic) {
37269					scaledDim = 0;
37270				}
37271				if (!font.vertical) {
37272					scaledDim *= textState.textHScale;
37273					textState.translateTextMatrix(scaledDim, 0);
37274					textChunk.width += scaledDim;
37275				} else {
37276					textState.translateTextMatrix(0, scaledDim);
37277					scaledDim = Math.abs(scaledDim);
37278					textChunk.height += scaledDim;
37279				}
37280				if (scaledDim) {
37281					textChunk.prevTransform = getCurrentTextTransform();
37282				}
37283				const glyphUnicode = glyph.unicode;
37284				if (saveLastChar(glyphUnicode)) {
37285					textChunk.str.push(" ");
37286				}
37287				textChunk.str.push(glyphUnicode);
37288				if (charSpacing) {
37289					if (!font.vertical) {
37290						textState.translateTextMatrix(charSpacing * textState.textHScale, 0);
37291					} else {
37292						textState.translateTextMatrix(0, -charSpacing);
37293					}
37294				}
37295			}
37296		}
37297		function appendEOL() {
37298			resetLastChars();
37299			if (textContentItem.initialized) {
37300				textContentItem.hasEOL = true;
37301				flushTextContentItem();
37302			} else {
37303				textContent.items.push({
37304					str: "",
37305					dir: "ltr",
37306					width: 0,
37307					height: 0,
37308					transform: getCurrentTextTransform(),
37309					fontName: textState.loadedName,
37310					hasEOL: true
37311				});
37312			}
37313		}
37314		function addFakeSpaces(width, transf, textOrientation) {
37315			if (textOrientation * textContentItem.spaceInFlowMin <= width && width <= textOrientation * textContentItem.spaceInFlowMax) {
37316				if (textContentItem.initialized) {
37317					resetLastChars();
37318					textContentItem.str.push(" ");
37319				}
37320				return false;
37321			}
37322			const fontName = textContentItem.fontName;
37323			let height = 0;
37324			if (textContentItem.vertical) {
37325				height = width;
37326				width = 0;
37327			}
37328			flushTextContentItem();
37329			resetLastChars();
37330			pushWhitespace({
37331				width: Math.abs(width),
37332				height: Math.abs(height),
37333				transform: transf || getCurrentTextTransform(),
37334				fontName
37335			});
37336			return true;
37337		}
37338		function flushTextContentItem() {
37339			if (!textContentItem.initialized || !textContentItem.str) {
37340				return;
37341			}
37342			if (!textContentItem.vertical) {
37343				textContentItem.totalWidth += textContentItem.width * textContentItem.textAdvanceScale;
37344			} else {
37345				textContentItem.totalHeight += textContentItem.height * textContentItem.textAdvanceScale;
37346			}
37347			textContent.items.push(runBidiTransform(textContentItem));
37348			textContentItem.initialized = false;
37349			textContentItem.str.length = 0;
37350		}
37351		function enqueueChunk(batch = false) {
37352			const length = textContent.items.length;
37353			if (length === 0) {
37354				return;
37355			}
37356			if (batch && length < TEXT_CHUNK_BATCH_SIZE) {
37357				return;
37358			}
37359			sink.enqueue(textContent, length);
37360			textContent.items = [];
37361			textContent.styles = Object.create(null);
37362		}
37363		const timeSlotManager = new TimeSlotManager();
37364		return new Promise(function promiseBody(resolve, reject) {
37365			const next = function (promise) {
37366				enqueueChunk(true);
37367				Promise.all([promise, sink.ready]).then(function () {
37368					try {
37369						promiseBody(resolve, reject);
37370					} catch (ex) {
37371						reject(ex);
37372					}
37373				}, reject);
37374			};
37375			task.ensureNotTerminated();
37376			timeSlotManager.reset();
37377			const operation = {};
37378			let stop,
37379				name,
37380				isValidName,
37381				args = [];
37382			while (!(stop = timeSlotManager.check())) {
37383				args.length = 0;
37384				operation.args = args;
37385				if (!preprocessor.read(operation)) {
37386					break;
37387				}
37388				const previousState = textState;
37389				textState = stateManager.state;
37390				const fn = operation.fn;
37391				args = operation.args;
37392				switch (fn | 0) {
37393					case OPS.setFont:
37394						const fontNameArg = args[0].name,
37395							fontSizeArg = args[1];
37396						if (textState.font && fontNameArg === textState.fontName && fontSizeArg === textState.fontSize) {
37397							break;
37398						}
37399						flushTextContentItem();
37400						textState.fontName = fontNameArg;
37401						textState.fontSize = fontSizeArg;
37402						next(handleSetFont(fontNameArg, null));
37403						return;
37404					case OPS.setTextRise:
37405						textState.textRise = args[0];
37406						break;
37407					case OPS.setHScale:
37408						textState.textHScale = args[0] / 100;
37409						break;
37410					case OPS.setLeading:
37411						textState.leading = args[0];
37412						break;
37413					case OPS.moveText:
37414						textState.translateTextLineMatrix(args[0], args[1]);
37415						textState.textMatrix = textState.textLineMatrix.slice();
37416						break;
37417					case OPS.setLeadingMoveText:
37418						textState.leading = -args[1];
37419						textState.translateTextLineMatrix(args[0], args[1]);
37420						textState.textMatrix = textState.textLineMatrix.slice();
37421						break;
37422					case OPS.nextLine:
37423						textState.carriageReturn();
37424						break;
37425					case OPS.setTextMatrix:
37426						textState.setTextMatrix(args[0], args[1], args[2], args[3], args[4], args[5]);
37427						textState.setTextLineMatrix(args[0], args[1], args[2], args[3], args[4], args[5]);
37428						updateAdvanceScale();
37429						break;
37430					case OPS.setCharSpacing:
37431						textState.charSpacing = args[0];
37432						break;
37433					case OPS.setWordSpacing:
37434						textState.wordSpacing = args[0];
37435						break;
37436					case OPS.beginText:
37437						textState.textMatrix = IDENTITY_MATRIX.slice();
37438						textState.textLineMatrix = IDENTITY_MATRIX.slice();
37439						break;
37440					case OPS.showSpacedText:
37441						if (!stateManager.state.font) {
37442							self.ensureStateFont(stateManager.state);
37443							continue;
37444						}
37445						const spaceFactor = (textState.font.vertical ? 1 : -1) * textState.fontSize / 1000;
37446						const elements = args[0];
37447						for (let i = 0, ii = elements.length; i < ii; i++) {
37448							const item = elements[i];
37449							if (typeof item === "string") {
37450								showSpacedTextBuffer.push(item);
37451							} else if (typeof item === "number" && item !== 0) {
37452								const str = showSpacedTextBuffer.join("");
37453								showSpacedTextBuffer.length = 0;
37454								buildTextContentItem({
37455									chars: str,
37456									extraSpacing: item * spaceFactor
37457								});
37458							}
37459						}
37460						if (showSpacedTextBuffer.length > 0) {
37461							const str = showSpacedTextBuffer.join("");
37462							showSpacedTextBuffer.length = 0;
37463							buildTextContentItem({
37464								chars: str,
37465								extraSpacing: 0
37466							});
37467						}
37468						break;
37469					case OPS.showText:
37470						if (!stateManager.state.font) {
37471							self.ensureStateFont(stateManager.state);
37472							continue;
37473						}
37474						buildTextContentItem({
37475							chars: args[0],
37476							extraSpacing: 0
37477						});
37478						break;
37479					case OPS.nextLineShowText:
37480						if (!stateManager.state.font) {
37481							self.ensureStateFont(stateManager.state);
37482							continue;
37483						}
37484						textState.carriageReturn();
37485						buildTextContentItem({
37486							chars: args[0],
37487							extraSpacing: 0
37488						});
37489						break;
37490					case OPS.nextLineSetSpacingShowText:
37491						if (!stateManager.state.font) {
37492							self.ensureStateFont(stateManager.state);
37493							continue;
37494						}
37495						textState.wordSpacing = args[0];
37496						textState.charSpacing = args[1];
37497						textState.carriageReturn();
37498						buildTextContentItem({
37499							chars: args[2],
37500							extraSpacing: 0
37501						});
37502						break;
37503					case OPS.paintXObject:
37504						flushTextContentItem();
37505						xobjs ??= resources.get("XObject") || Dict.empty;
37506						isValidName = args[0] instanceof Name;
37507						name = args[0].name;
37508						if (isValidName && emptyXObjectCache.getByName(name)) {
37509							break;
37510						}
37511						next(new Promise(function (resolveXObject, rejectXObject) {
37512							if (!isValidName) {
37513								throw new FormatError("XObject must be referred to by name.");
37514							}
37515							let xobj = xobjs.getRaw(name);
37516							if (xobj instanceof Ref) {
37517								if (emptyXObjectCache.getByRef(xobj)) {
37518									resolveXObject();
37519									return;
37520								}
37521								const globalImage = self.globalImageCache.getData(xobj, self.pageIndex);
37522								if (globalImage) {
37523									resolveXObject();
37524									return;
37525								}
37526								xobj = xref.fetch(xobj);
37527							}
37528							if (!(xobj instanceof BaseStream)) {
37529								throw new FormatError("XObject should be a stream");
37530							}
37531							const type = xobj.dict.get("Subtype");
37532							if (!(type instanceof Name)) {
37533								throw new FormatError("XObject should have a Name subtype");
37534							}
37535							if (type.name !== "Form") {
37536								emptyXObjectCache.set(name, xobj.dict.objId, true);
37537								resolveXObject();
37538								return;
37539							}
37540							const currentState = stateManager.state.clone();
37541							const xObjStateManager = new StateManager(currentState);
37542							const matrix = lookupMatrix(xobj.dict.getArray("Matrix"), null);
37543							if (matrix) {
37544								xObjStateManager.transform(matrix);
37545							}
37546							enqueueChunk();
37547							const sinkWrapper = {
37548								enqueueInvoked: false,
37549								enqueue(chunk, size) {
37550									this.enqueueInvoked = true;
37551									sink.enqueue(chunk, size);
37552								},
37553								get desiredSize() {
37554									return sink.desiredSize;
37555								},
37556								get ready() {
37557									return sink.ready;
37558								}
37559							};
37560							self.getTextContent({
37561								stream: xobj,
37562								task,
37563								resources: xobj.dict.get("Resources") || resources,
37564								stateManager: xObjStateManager,
37565								includeMarkedContent,
37566								sink: sinkWrapper,
37567								seenStyles,
37568								viewBox,
37569								lang,
37570								markedContentData,
37571								disableNormalization,
37572								keepWhiteSpace
37573							}).then(function () {
37574								if (!sinkWrapper.enqueueInvoked) {
37575									emptyXObjectCache.set(name, xobj.dict.objId, true);
37576								}
37577								resolveXObject();
37578							}, rejectXObject);
37579						}).catch(function (reason) {
37580							if (reason instanceof AbortException) {
37581								return;
37582							}
37583							if (self.options.ignoreErrors) {
37584								warn(`getTextContent - ignoring XObject: "${reason}".`);
37585								return;
37586							}
37587							throw reason;
37588						}));
37589						return;
37590					case OPS.setGState:
37591						isValidName = args[0] instanceof Name;
37592						name = args[0].name;
37593						if (isValidName && emptyGStateCache.getByName(name)) {
37594							break;
37595						}
37596						next(new Promise(function (resolveGState, rejectGState) {
37597							if (!isValidName) {
37598								throw new FormatError("GState must be referred to by name.");
37599							}
37600							const extGState = resources.get("ExtGState");
37601							if (!(extGState instanceof Dict)) {
37602								throw new FormatError("ExtGState should be a dictionary.");
37603							}
37604							const gState = extGState.get(name);
37605							if (!(gState instanceof Dict)) {
37606								throw new FormatError("GState should be a dictionary.");
37607							}
37608							const gStateFont = gState.get("Font");
37609							if (!gStateFont) {
37610								emptyGStateCache.set(name, gState.objId, true);
37611								resolveGState();
37612								return;
37613							}
37614							flushTextContentItem();
37615							textState.fontName = null;
37616							textState.fontSize = gStateFont[1];
37617							handleSetFont(null, gStateFont[0]).then(resolveGState, rejectGState);
37618						}).catch(function (reason) {
37619							if (reason instanceof AbortException) {
37620								return;
37621							}
37622							if (self.options.ignoreErrors) {
37623								warn(`getTextContent - ignoring ExtGState: "${reason}".`);
37624								return;
37625							}
37626							throw reason;
37627						}));
37628						return;
37629					case OPS.beginMarkedContent:
37630						flushTextContentItem();
37631						if (includeMarkedContent) {
37632							markedContentData.level++;
37633							textContent.items.push({
37634								type: "beginMarkedContent",
37635								tag: args[0] instanceof Name ? args[0].name : null
37636							});
37637						}
37638						break;
37639					case OPS.beginMarkedContentProps:
37640						flushTextContentItem();
37641						if (includeMarkedContent) {
37642							markedContentData.level++;
37643							let mcid = null;
37644							if (args[1] instanceof Dict) {
37645								mcid = args[1].get("MCID");
37646							}
37647							textContent.items.push({
37648								type: "beginMarkedContentProps",
37649								id: Number.isInteger(mcid) ? `${self.idFactory.getPageObjId()}_mc${mcid}` : null,
37650								tag: args[0] instanceof Name ? args[0].name : null
37651							});
37652						}
37653						break;
37654					case OPS.endMarkedContent:
37655						flushTextContentItem();
37656						if (includeMarkedContent) {
37657							if (markedContentData.level === 0) {
37658								break;
37659							}
37660							markedContentData.level--;
37661							textContent.items.push({
37662								type: "endMarkedContent"
37663							});
37664						}
37665						break;
37666					case OPS.restore:
37667						if (previousState && (previousState.font !== textState.font || previousState.fontSize !== textState.fontSize || previousState.fontName !== textState.fontName)) {
37668							flushTextContentItem();
37669						}
37670						break;
37671				}
37672				if (textContent.items.length >= sink.desiredSize) {
37673					stop = true;
37674					break;
37675				}
37676			}
37677			if (stop) {
37678				next(deferred);
37679				return;
37680			}
37681			flushTextContentItem();
37682			enqueueChunk();
37683			resolve();
37684		}).catch(reason => {
37685			if (reason instanceof AbortException) {
37686				return;
37687			}
37688			if (this.options.ignoreErrors) {
37689				warn(`getTextContent - ignoring errors during "${task.name}" ` + `task: "${reason}".`);
37690				flushTextContentItem();
37691				enqueueChunk();
37692				return;
37693			}
37694			throw reason;
37695		});
37696	}
37697	async extractDataStructures(dict, properties) {
37698		const xref = this.xref;
37699		let cidToGidBytes;
37700		const toUnicodePromise = this.readToUnicode(properties.toUnicode);
37701		if (properties.composite) {
37702			const cidSystemInfo = dict.get("CIDSystemInfo");
37703			if (cidSystemInfo instanceof Dict) {
37704				properties.cidSystemInfo = {
37705					registry: stringToPDFString(cidSystemInfo.get("Registry")),
37706					ordering: stringToPDFString(cidSystemInfo.get("Ordering")),
37707					supplement: cidSystemInfo.get("Supplement")
37708				};
37709			}
37710			try {
37711				const cidToGidMap = dict.get("CIDToGIDMap");
37712				if (cidToGidMap instanceof BaseStream) {
37713					cidToGidBytes = cidToGidMap.getBytes();
37714				}
37715			} catch (ex) {
37716				if (!this.options.ignoreErrors) {
37717					throw ex;
37718				}
37719				warn(`extractDataStructures - ignoring CIDToGIDMap data: "${ex}".`);
37720			}
37721		}
37722		const differences = [];
37723		let baseEncodingName = null;
37724		let encoding;
37725		if (dict.has("Encoding")) {
37726			encoding = dict.get("Encoding");
37727			if (encoding instanceof Dict) {
37728				baseEncodingName = encoding.get("BaseEncoding");
37729				baseEncodingName = baseEncodingName instanceof Name ? baseEncodingName.name : null;
37730				if (encoding.has("Differences")) {
37731					const diffEncoding = encoding.get("Differences");
37732					let index = 0;
37733					for (const entry of diffEncoding) {
37734						const data = xref.fetchIfRef(entry);
37735						if (typeof data === "number") {
37736							index = data;
37737						} else if (data instanceof Name) {
37738							differences[index++] = data.name;
37739						} else {
37740							throw new FormatError(`Invalid entry in 'Differences' array: ${data}`);
37741						}
37742					}
37743				}
37744			} else if (encoding instanceof Name) {
37745				baseEncodingName = encoding.name;
37746			} else {
37747				const msg = "Encoding is not a Name nor a Dict";
37748				if (!this.options.ignoreErrors) {
37749					throw new FormatError(msg);
37750				}
37751				warn(msg);
37752			}
37753			if (baseEncodingName !== "MacRomanEncoding" && baseEncodingName !== "MacExpertEncoding" && baseEncodingName !== "WinAnsiEncoding") {
37754				baseEncodingName = null;
37755			}
37756		}
37757		const nonEmbeddedFont = !properties.file || properties.isInternalFont,
37758			isSymbolsFontName = getSymbolsFonts()[properties.name];
37759		if (baseEncodingName && nonEmbeddedFont && isSymbolsFontName) {
37760			baseEncodingName = null;
37761		}
37762		if (baseEncodingName) {
37763			properties.defaultEncoding = getEncoding(baseEncodingName);
37764		} else {
vendor: 10,342 bytes, lines 37765-38096
37765			const isSymbolicFont = !!(properties.flags & FontFlags.Symbolic);
37766			const isNonsymbolicFont = !!(properties.flags & FontFlags.Nonsymbolic);
37767			encoding = StandardEncoding;
37768			if (properties.type === "TrueType" && !isNonsymbolicFont) {
37769				encoding = WinAnsiEncoding;
37770			}
37771			if (isSymbolicFont || isSymbolsFontName) {
37772				encoding = MacRomanEncoding;
37773				if (nonEmbeddedFont) {
37774					if (/Symbol/i.test(properties.name)) {
37775						encoding = SymbolSetEncoding;
37776					} else if (/Dingbats/i.test(properties.name)) {
37777						encoding = ZapfDingbatsEncoding;
37778					} else if (/Wingdings/i.test(properties.name)) {
37779						encoding = WinAnsiEncoding;
37780					}
37781				}
37782			}
37783			properties.defaultEncoding = encoding;
37784		}
37785		properties.differences = differences;
37786		properties.baseEncodingName = baseEncodingName;
37787		properties.hasEncoding = !!baseEncodingName || differences.length > 0;
37788		properties.dict = dict;
37789		properties.toUnicode = await toUnicodePromise;
37790		const builtToUnicode = await this.buildToUnicode(properties);
37791		properties.toUnicode = builtToUnicode;
37792		if (cidToGidBytes) {
37793			properties.cidToGidMap = this.readCidToGidMap(cidToGidBytes, builtToUnicode);
37794		}
37795		return properties;
37796	}
37797	_simpleFontToUnicode(properties, forceGlyphs = false) {
37798		assert(!properties.composite, "Must be a simple font.");
37799		const toUnicode = [];
37800		const encoding = properties.defaultEncoding.slice();
37801		const baseEncodingName = properties.baseEncodingName;
37802		const differences = properties.differences;
37803		for (const charcode in differences) {
37804			const glyphName = differences[charcode];
37805			if (glyphName === ".notdef") {
37806				continue;
37807			}
37808			encoding[charcode] = glyphName;
37809		}
37810		const glyphsUnicodeMap = getGlyphsUnicode();
37811		for (const charcode in encoding) {
37812			let glyphName = encoding[charcode];
37813			if (glyphName === "") {
37814				continue;
37815			}
37816			let unicode = glyphsUnicodeMap[glyphName];
37817			if (unicode !== undefined) {
37818				toUnicode[charcode] = String.fromCharCode(unicode);
37819				continue;
37820			}
37821			let code = 0;
37822			switch (glyphName[0]) {
37823				case "G":
37824					if (glyphName.length === 3) {
37825						code = parseInt(glyphName.substring(1), 16);
37826					}
37827					break;
37828				case "g":
37829					if (glyphName.length === 5) {
37830						code = parseInt(glyphName.substring(1), 16);
37831					}
37832					break;
37833				case "C":
37834				case "c":
37835					if (glyphName.length >= 3 && glyphName.length <= 4) {
37836						const codeStr = glyphName.substring(1);
37837						if (forceGlyphs) {
37838							code = parseInt(codeStr, 16);
37839							break;
37840						}
37841						code = +codeStr;
37842						if (Number.isNaN(code) && Number.isInteger(parseInt(codeStr, 16))) {
37843							return this._simpleFontToUnicode(properties, true);
37844						}
37845					}
37846					break;
37847				case "u":
37848					unicode = getUnicodeForGlyph(glyphName, glyphsUnicodeMap);
37849					if (unicode !== -1) {
37850						code = unicode;
37851					}
37852					break;
37853				default:
37854					switch (glyphName) {
37855						case "f_h":
37856						case "f_t":
37857						case "T_h":
37858							toUnicode[charcode] = glyphName.replaceAll("_", "");
37859							continue;
37860					}
37861					break;
37862			}
37863			if (code > 0 && code <= 0x10ffff && Number.isInteger(code)) {
37864				if (baseEncodingName && code === +charcode) {
37865					const baseEncoding = getEncoding(baseEncodingName);
37866					if (baseEncoding && (glyphName = baseEncoding[charcode])) {
37867						toUnicode[charcode] = String.fromCharCode(glyphsUnicodeMap[glyphName]);
37868						continue;
37869					}
37870				}
37871				toUnicode[charcode] = String.fromCodePoint(code);
37872			}
37873		}
37874		return toUnicode;
37875	}
37876	async buildToUnicode(properties) {
37877		properties.hasIncludedToUnicodeMap = properties.toUnicode?.length > 0;
37878		if (properties.hasIncludedToUnicodeMap) {
37879			if (!properties.composite && properties.hasEncoding) {
37880				properties.fallbackToUnicode = this._simpleFontToUnicode(properties);
37881			}
37882			return properties.toUnicode;
37883		}
37884		if (!properties.composite) {
37885			return new ToUnicodeMap(this._simpleFontToUnicode(properties));
37886		}
37887		if (properties.composite && (properties.cMap.builtInCMap && !(properties.cMap instanceof IdentityCMap) || properties.cidSystemInfo?.registry === "Adobe" && (properties.cidSystemInfo.ordering === "GB1" || properties.cidSystemInfo.ordering === "CNS1" || properties.cidSystemInfo.ordering === "Japan1" || properties.cidSystemInfo.ordering === "Korea1"))) {
37888			const {
37889				registry,
37890				ordering
37891			} = properties.cidSystemInfo;
37892			const ucs2CMapName = Name.get(`${registry}-${ordering}-UCS2`);
37893			const ucs2CMap = await CMapFactory.create({
37894				encoding: ucs2CMapName,
37895				fetchBuiltInCMap: this._fetchBuiltInCMapBound,
37896				useCMap: null
37897			});
37898			const toUnicode = [],
37899				buf = [];
37900			properties.cMap.forEach(function (charcode, cid) {
37901				if (cid > 0xffff) {
37902					throw new FormatError("Max size of CID is 65,535");
37903				}
37904				const ucs2 = ucs2CMap.lookup(cid);
37905				if (ucs2) {
37906					buf.length = 0;
37907					for (let i = 0, ii = ucs2.length; i < ii; i += 2) {
37908						buf.push((ucs2.charCodeAt(i) << 8) + ucs2.charCodeAt(i + 1));
37909					}
37910					toUnicode[charcode] = String.fromCharCode(...buf);
37911				}
37912			});
37913			return new ToUnicodeMap(toUnicode);
37914		}
37915		return new IdentityToUnicodeMap(properties.firstChar, properties.lastChar);
37916	}
37917	async readToUnicode(cmapObj) {
37918		if (!cmapObj) {
37919			return null;
37920		}
37921		if (cmapObj instanceof Name) {
37922			const cmap = await CMapFactory.create({
37923				encoding: cmapObj,
37924				fetchBuiltInCMap: this._fetchBuiltInCMapBound,
37925				useCMap: null
37926			});
37927			if (cmap instanceof IdentityCMap) {
37928				return new IdentityToUnicodeMap(0, 0xffff);
37929			}
37930			return new ToUnicodeMap(cmap.getMap());
37931		}
37932		if (cmapObj instanceof BaseStream) {
37933			try {
37934				const cmap = await CMapFactory.create({
37935					encoding: cmapObj,
37936					fetchBuiltInCMap: this._fetchBuiltInCMapBound,
37937					useCMap: null
37938				});
37939				if (cmap instanceof IdentityCMap) {
37940					return new IdentityToUnicodeMap(0, 0xffff);
37941				}
37942				const map = new Array(cmap.length);
37943				cmap.forEach(function (charCode, token) {
37944					if (typeof token === "number") {
37945						map[charCode] = String.fromCodePoint(token);
37946						return;
37947					}
37948					if (token.length % 2 !== 0) {
37949						token = "\u0000" + token;
37950					}
37951					const str = [];
37952					for (let k = 0; k < token.length; k += 2) {
37953						const w1 = token.charCodeAt(k) << 8 | token.charCodeAt(k + 1);
37954						if ((w1 & 0xf800) !== 0xd800) {
37955							str.push(w1);
37956							continue;
37957						}
37958						k += 2;
37959						const w2 = token.charCodeAt(k) << 8 | token.charCodeAt(k + 1);
37960						str.push(((w1 & 0x3ff) << 10) + (w2 & 0x3ff) + 0x10000);
37961					}
37962					map[charCode] = String.fromCodePoint(...str);
37963				});
37964				return new ToUnicodeMap(map);
37965			} catch (reason) {
37966				if (reason instanceof AbortException) {
37967					return null;
37968				}
37969				if (this.options.ignoreErrors) {
37970					warn(`readToUnicode - ignoring ToUnicode data: "${reason}".`);
37971					return null;
37972				}
37973				throw reason;
37974			}
37975		}
37976		return null;
37977	}
37978	readCidToGidMap(glyphsData, toUnicode) {
37979		const result = [];
37980		for (let j = 0, jj = glyphsData.length; j < jj; j++) {
37981			const glyphID = glyphsData[j++] << 8 | glyphsData[j];
37982			const code = j >> 1;
37983			if (glyphID === 0 && !toUnicode.has(code)) {
37984				continue;
37985			}
37986			result[code] = glyphID;
37987		}
37988		return result;
37989	}
37990	extractWidths(dict, descriptor, properties) {
37991		const xref = this.xref;
37992		let glyphsWidths = [];
37993		let defaultWidth = 0;
37994		const glyphsVMetrics = [];
37995		let defaultVMetrics;
37996		if (properties.composite) {
37997			const dw = dict.get("DW");
37998			defaultWidth = typeof dw === "number" ? Math.ceil(dw) : 1000;
37999			const widths = dict.get("W");
38000			if (Array.isArray(widths)) {
38001				for (let i = 0, ii = widths.length; i < ii; i++) {
38002					let start = xref.fetchIfRef(widths[i++]);
38003					if (!Number.isInteger(start)) {
38004						break;
38005					}
38006					const code = xref.fetchIfRef(widths[i]);
38007					if (Array.isArray(code)) {
38008						for (const c of code) {
38009							const width = xref.fetchIfRef(c);
38010							if (typeof width === "number") {
38011								glyphsWidths[start] = width;
38012							}
38013							start++;
38014						}
38015					} else if (Number.isInteger(code)) {
38016						const width = xref.fetchIfRef(widths[++i]);
38017						if (typeof width !== "number") {
38018							continue;
38019						}
38020						for (let j = start; j <= code; j++) {
38021							glyphsWidths[j] = width;
38022						}
38023					} else {
38024						break;
38025					}
38026				}
38027			}
38028			if (properties.vertical) {
38029				const dw2 = dict.getArray("DW2");
38030				let vmetrics = isNumberArray(dw2, 2) ? dw2 : [880, -1000];
38031				defaultVMetrics = [vmetrics[1], defaultWidth * 0.5, vmetrics[0]];
38032				vmetrics = dict.get("W2");
38033				if (Array.isArray(vmetrics)) {
38034					for (let i = 0, ii = vmetrics.length; i < ii; i++) {
38035						let start = xref.fetchIfRef(vmetrics[i++]);
38036						if (!Number.isInteger(start)) {
38037							break;
38038						}
38039						const code = xref.fetchIfRef(vmetrics[i]);
38040						if (Array.isArray(code)) {
38041							for (let j = 0, jj = code.length; j < jj; j++) {
38042								const vmetric = [xref.fetchIfRef(code[j++]), xref.fetchIfRef(code[j++]), xref.fetchIfRef(code[j])];
38043								if (isNumberArray(vmetric, null)) {
38044									glyphsVMetrics[start] = vmetric;
38045								}
38046								start++;
38047							}
38048						} else if (Number.isInteger(code)) {
38049							const vmetric = [xref.fetchIfRef(vmetrics[++i]), xref.fetchIfRef(vmetrics[++i]), xref.fetchIfRef(vmetrics[++i])];
38050							if (!isNumberArray(vmetric, null)) {
38051								continue;
38052							}
38053							for (let j = start; j <= code; j++) {
38054								glyphsVMetrics[j] = vmetric;
38055							}
38056						} else {
38057							break;
38058						}
38059					}
38060				}
38061			}
38062		} else {
38063			const widths = dict.get("Widths");
38064			if (Array.isArray(widths)) {
38065				let j = properties.firstChar;
38066				for (const w of widths) {
38067					const width = xref.fetchIfRef(w);
38068					if (typeof width === "number") {
38069						glyphsWidths[j] = width;
38070					}
38071					j++;
38072				}
38073				const missingWidth = descriptor.get("MissingWidth");
38074				defaultWidth = typeof missingWidth === "number" ? missingWidth : 0;
38075			} else {
38076				const baseFontName = dict.get("BaseFont");
38077				if (baseFontName instanceof Name) {
38078					const metrics = this.getBaseFontMetrics(baseFontName.name);
38079					glyphsWidths = this.buildCharCodeToWidth(metrics.widths, properties);
38080					defaultWidth = metrics.defaultWidth;
38081				}
38082			}
38083		}
38084		let isMonospace = true;
38085		let firstWidth = defaultWidth;
38086		for (const glyph in glyphsWidths) {
38087			const glyphWidth = glyphsWidths[glyph];
38088			if (!glyphWidth) {
38089				continue;
38090			}
38091			if (!firstWidth) {
38092				firstWidth = glyphWidth;
38093				continue;
38094			}
38095			if (firstWidth !== glyphWidth) {
38096				isMonospace = false;
vendor: 13,764 bytes, lines 38097-38534
38097				break;
38098			}
38099		}
38100		if (isMonospace) {
38101			properties.flags |= FontFlags.FixedPitch;
38102		} else {
38103			properties.flags &= ~FontFlags.FixedPitch;
38104		}
38105		properties.defaultWidth = defaultWidth;
38106		properties.widths = glyphsWidths;
38107		properties.defaultVMetrics = defaultVMetrics;
38108		properties.vmetrics = glyphsVMetrics;
38109	}
38110	isSerifFont(baseFontName) {
38111		const fontNameWoStyle = baseFontName.split("-", 1)[0];
38112		return fontNameWoStyle in getSerifFonts() || /serif/gi.test(fontNameWoStyle);
38113	}
38114	getBaseFontMetrics(name) {
38115		let defaultWidth = 0;
38116		let widths = Object.create(null);
38117		let monospace = false;
38118		const stdFontMap = getStdFontMap();
38119		let lookupName = stdFontMap[name] || name;
38120		const Metrics = getMetrics();
38121		if (!(lookupName in Metrics)) {
38122			lookupName = this.isSerifFont(name) ? "Times-Roman" : "Helvetica";
38123		}
38124		const glyphWidths = Metrics[lookupName];
38125		if (typeof glyphWidths === "number") {
38126			defaultWidth = glyphWidths;
38127			monospace = true;
38128		} else {
38129			widths = glyphWidths();
38130		}
38131		return {
38132			defaultWidth,
38133			monospace,
38134			widths
38135		};
38136	}
38137	buildCharCodeToWidth(widthsByGlyphName, properties) {
38138		const widths = Object.create(null);
38139		const differences = properties.differences;
38140		const encoding = properties.defaultEncoding;
38141		for (let charCode = 0; charCode < 256; charCode++) {
38142			if (charCode in differences && widthsByGlyphName[differences[charCode]]) {
38143				widths[charCode] = widthsByGlyphName[differences[charCode]];
38144				continue;
38145			}
38146			if (charCode in encoding && widthsByGlyphName[encoding[charCode]]) {
38147				widths[charCode] = widthsByGlyphName[encoding[charCode]];
38148				continue;
38149			}
38150		}
38151		return widths;
38152	}
38153	preEvaluateFont(dict) {
38154		const baseDict = dict;
38155		let type = dict.get("Subtype");
38156		if (!(type instanceof Name)) {
38157			throw new FormatError("invalid font Subtype");
38158		}
38159		let composite = false;
38160		let hash;
38161		if (type.name === "Type0") {
38162			const df = dict.get("DescendantFonts");
38163			if (!df) {
38164				throw new FormatError("Descendant fonts are not specified");
38165			}
38166			dict = Array.isArray(df) ? this.xref.fetchIfRef(df[0]) : df;
38167			if (!(dict instanceof Dict)) {
38168				throw new FormatError("Descendant font is not a dictionary.");
38169			}
38170			type = dict.get("Subtype");
38171			if (!(type instanceof Name)) {
38172				throw new FormatError("invalid font Subtype");
38173			}
38174			composite = true;
38175		}
38176		let firstChar = dict.get("FirstChar");
38177		if (!Number.isInteger(firstChar)) {
38178			firstChar = 0;
38179		}
38180		let lastChar = dict.get("LastChar");
38181		if (!Number.isInteger(lastChar)) {
38182			lastChar = composite ? 0xffff : 0xff;
38183		}
38184		const descriptor = dict.get("FontDescriptor");
38185		const toUnicode = dict.get("ToUnicode") || baseDict.get("ToUnicode");
38186		if (descriptor) {
38187			hash = new MurmurHash3_64();
38188			const encoding = baseDict.getRaw("Encoding");
38189			if (encoding instanceof Name) {
38190				hash.update(encoding.name);
38191			} else if (encoding instanceof Ref) {
38192				hash.update(encoding.toString());
38193			} else if (encoding instanceof Dict) {
38194				for (const entry of encoding.getRawValues()) {
38195					if (entry instanceof Name) {
38196						hash.update(entry.name);
38197					} else if (entry instanceof Ref) {
38198						hash.update(entry.toString());
38199					} else if (Array.isArray(entry)) {
38200						const diffLength = entry.length,
38201							diffBuf = new Array(diffLength);
38202						for (let j = 0; j < diffLength; j++) {
38203							const diffEntry = entry[j];
38204							if (diffEntry instanceof Name) {
38205								diffBuf[j] = diffEntry.name;
38206							} else if (typeof diffEntry === "number" || diffEntry instanceof Ref) {
38207								diffBuf[j] = diffEntry.toString();
38208							}
38209						}
38210						hash.update(diffBuf.join());
38211					}
38212				}
38213			}
38214			hash.update(`${firstChar}-${lastChar}`);
38215			if (toUnicode instanceof BaseStream) {
38216				const stream = toUnicode.str || toUnicode;
38217				const uint8array = stream.buffer ? new Uint8Array(stream.buffer.buffer, 0, stream.bufferLength) : new Uint8Array(stream.bytes.buffer, stream.start, stream.end - stream.start);
38218				hash.update(uint8array);
38219			} else if (toUnicode instanceof Name) {
38220				hash.update(toUnicode.name);
38221			}
38222			const widths = dict.get("Widths") || baseDict.get("Widths");
38223			if (Array.isArray(widths)) {
38224				const widthsBuf = [];
38225				for (const entry of widths) {
38226					if (typeof entry === "number" || entry instanceof Ref) {
38227						widthsBuf.push(entry.toString());
38228					}
38229				}
38230				hash.update(widthsBuf.join());
38231			}
38232			if (composite) {
38233				hash.update("compositeFont");
38234				const compositeWidths = dict.get("W") || baseDict.get("W");
38235				if (Array.isArray(compositeWidths)) {
38236					const widthsBuf = [];
38237					for (const entry of compositeWidths) {
38238						if (typeof entry === "number" || entry instanceof Ref) {
38239							widthsBuf.push(entry.toString());
38240						} else if (Array.isArray(entry)) {
38241							const subWidthsBuf = [];
38242							for (const element of entry) {
38243								if (typeof element === "number" || element instanceof Ref) {
38244									subWidthsBuf.push(element.toString());
38245								}
38246							}
38247							widthsBuf.push(`[${subWidthsBuf.join()}]`);
38248						}
38249					}
38250					hash.update(widthsBuf.join());
38251				}
38252				const cidToGidMap = dict.getRaw("CIDToGIDMap") || baseDict.getRaw("CIDToGIDMap");
38253				if (cidToGidMap instanceof Name) {
38254					hash.update(cidToGidMap.name);
38255				} else if (cidToGidMap instanceof Ref) {
38256					hash.update(cidToGidMap.toString());
38257				} else if (cidToGidMap instanceof BaseStream) {
38258					hash.update(cidToGidMap.peekBytes());
38259				}
38260			}
38261		}
38262		return {
38263			descriptor,
38264			dict,
38265			baseDict,
38266			composite,
38267			type: type.name,
38268			firstChar,
38269			lastChar,
38270			toUnicode,
38271			hash: hash ? hash.hexdigest() : ""
38272		};
38273	}
38274	async translateFont({
38275		descriptor,
38276		dict,
38277		baseDict,
38278		composite,
38279		type,
38280		firstChar,
38281		lastChar,
38282		toUnicode,
38283		cssFontInfo
38284	}) {
38285		const isType3Font = type === "Type3";
38286		if (!descriptor) {
38287			if (isType3Font) {
38288				const bbox = lookupNormalRect(dict.getArray("FontBBox"), [0, 0, 0, 0]);
38289				descriptor = new Dict(null);
38290				descriptor.set("FontName", Name.get(type));
38291				descriptor.set("FontBBox", bbox);
38292			} else {
38293				let baseFontName = dict.get("BaseFont");
38294				if (!(baseFontName instanceof Name)) {
38295					throw new FormatError("Base font is not specified");
38296				}
38297				baseFontName = baseFontName.name.replaceAll(/[,_]/g, "-");
38298				const metrics = this.getBaseFontMetrics(baseFontName);
38299				const fontNameWoStyle = baseFontName.split("-", 1)[0];
38300				const flags = (this.isSerifFont(fontNameWoStyle) ? FontFlags.Serif : 0) | (metrics.monospace ? FontFlags.FixedPitch : 0) | (getSymbolsFonts()[fontNameWoStyle] ? FontFlags.Symbolic : FontFlags.Nonsymbolic);
38301				const properties = {
38302					type,
38303					name: baseFontName,
38304					loadedName: baseDict.loadedName,
38305					systemFontInfo: null,
38306					widths: metrics.widths,
38307					defaultWidth: metrics.defaultWidth,
38308					isSimulatedFlags: true,
38309					flags,
38310					firstChar,
38311					lastChar,
38312					toUnicode,
38313					xHeight: 0,
38314					capHeight: 0,
38315					italicAngle: 0,
38316					isType3Font
38317				};
38318				const widths = dict.get("Widths");
38319				const standardFontName = getStandardFontName(baseFontName);
38320				let file = null;
38321				if (standardFontName) {
38322					file = await this.fetchStandardFontData(standardFontName);
38323					properties.isInternalFont = !!file;
38324				}
38325				if (!properties.isInternalFont && this.options.useSystemFonts) {
38326					properties.systemFontInfo = getFontSubstitution(this.systemFontCache, this.idFactory, this.options.standardFontDataUrl, baseFontName, standardFontName, type);
38327				}
38328				const newProperties = await this.extractDataStructures(dict, properties);
38329				if (Array.isArray(widths)) {
38330					const glyphWidths = [];
38331					let j = firstChar;
38332					for (const w of widths) {
38333						const width = this.xref.fetchIfRef(w);
38334						if (typeof width === "number") {
38335							glyphWidths[j] = width;
38336						}
38337						j++;
38338					}
38339					newProperties.widths = glyphWidths;
38340				} else {
38341					newProperties.widths = this.buildCharCodeToWidth(metrics.widths, newProperties);
38342				}
38343				return new Font(baseFontName, file, newProperties);
38344			}
38345		}
38346		let fontName = descriptor.get("FontName");
38347		let baseFont = dict.get("BaseFont");
38348		if (typeof fontName === "string") {
38349			fontName = Name.get(fontName);
38350		}
38351		if (typeof baseFont === "string") {
38352			baseFont = Name.get(baseFont);
38353		}
38354		const fontNameStr = fontName?.name;
38355		const baseFontStr = baseFont?.name;
38356		if (!isType3Font && fontNameStr !== baseFontStr) {
38357			info(`The FontDescriptor's FontName is "${fontNameStr}" but ` + `should be the same as the Font's BaseFont "${baseFontStr}".`);
38358			if (fontNameStr && baseFontStr && (baseFontStr.startsWith(fontNameStr) || !isKnownFontName(fontNameStr) && isKnownFontName(baseFontStr))) {
38359				fontName = null;
38360			}
38361		}
38362		fontName ||= baseFont;
38363		if (!(fontName instanceof Name)) {
38364			throw new FormatError("invalid font name");
38365		}
38366		let fontFile, subtype, length1, length2, length3;
38367		try {
38368			fontFile = descriptor.get("FontFile", "FontFile2", "FontFile3");
38369			if (fontFile) {
38370				if (!(fontFile instanceof BaseStream)) {
38371					throw new FormatError("FontFile should be a stream");
38372				} else if (fontFile.isEmpty) {
38373					throw new FormatError("FontFile is empty");
38374				}
38375			}
38376		} catch (ex) {
38377			if (!this.options.ignoreErrors) {
38378				throw ex;
38379			}
38380			warn(`translateFont - fetching "${fontName.name}" font file: "${ex}".`);
38381			fontFile = null;
38382		}
38383		let isInternalFont = false;
38384		let glyphScaleFactors = null;
38385		let systemFontInfo = null;
38386		if (fontFile) {
38387			if (fontFile.dict) {
38388				const subtypeEntry = fontFile.dict.get("Subtype");
38389				if (subtypeEntry instanceof Name) {
38390					subtype = subtypeEntry.name;
38391				}
38392				length1 = fontFile.dict.get("Length1");
38393				length2 = fontFile.dict.get("Length2");
38394				length3 = fontFile.dict.get("Length3");
38395			}
38396		} else if (cssFontInfo) {
38397			const standardFontName = getXfaFontName(fontName.name);
38398			if (standardFontName) {
38399				cssFontInfo.fontFamily = `${cssFontInfo.fontFamily}-PdfJS-XFA`;
38400				cssFontInfo.metrics = standardFontName.metrics || null;
38401				glyphScaleFactors = standardFontName.factors || null;
38402				fontFile = await this.fetchStandardFontData(standardFontName.name);
38403				isInternalFont = !!fontFile;
38404				baseDict = dict = getXfaFontDict(fontName.name);
38405				composite = true;
38406			}
38407		} else if (!isType3Font) {
38408			const standardFontName = getStandardFontName(fontName.name);
38409			if (standardFontName) {
38410				fontFile = await this.fetchStandardFontData(standardFontName);
38411				isInternalFont = !!fontFile;
38412			}
38413			if (!isInternalFont && this.options.useSystemFonts) {
38414				systemFontInfo = getFontSubstitution(this.systemFontCache, this.idFactory, this.options.standardFontDataUrl, fontName.name, standardFontName, type);
38415			}
38416		}
38417		const fontMatrix = lookupMatrix(dict.getArray("FontMatrix"), FONT_IDENTITY_MATRIX);
38418		const bbox = lookupNormalRect(descriptor.getArray("FontBBox") || dict.getArray("FontBBox"), undefined);
38419		let ascent = descriptor.get("Ascent");
38420		if (typeof ascent !== "number") {
38421			ascent = undefined;
38422		}
38423		let descent = descriptor.get("Descent");
38424		if (typeof descent !== "number") {
38425			descent = undefined;
38426		}
38427		let xHeight = descriptor.get("XHeight");
38428		if (typeof xHeight !== "number") {
38429			xHeight = 0;
38430		}
38431		let capHeight = descriptor.get("CapHeight");
38432		if (typeof capHeight !== "number") {
38433			capHeight = 0;
38434		}
38435		let flags = descriptor.get("Flags");
38436		if (!Number.isInteger(flags)) {
38437			flags = 0;
38438		}
38439		let italicAngle = descriptor.get("ItalicAngle");
38440		if (typeof italicAngle !== "number") {
38441			italicAngle = 0;
38442		}
38443		const properties = {
38444			type,
38445			name: fontName.name,
38446			subtype,
38447			file: fontFile,
38448			length1,
38449			length2,
38450			length3,
38451			isInternalFont,
38452			loadedName: baseDict.loadedName,
38453			composite,
38454			fixedPitch: false,
38455			fontMatrix,
38456			firstChar,
38457			lastChar,
38458			toUnicode,
38459			bbox,
38460			ascent,
38461			descent,
38462			xHeight,
38463			capHeight,
38464			flags,
38465			italicAngle,
38466			isType3Font,
38467			cssFontInfo,
38468			scaleFactors: glyphScaleFactors,
38469			systemFontInfo
38470		};
38471		if (composite) {
38472			const cidEncoding = baseDict.get("Encoding");
38473			if (cidEncoding instanceof Name) {
38474				properties.cidEncoding = cidEncoding.name;
38475			}
38476			const cMap = await CMapFactory.create({
38477				encoding: cidEncoding,
38478				fetchBuiltInCMap: this._fetchBuiltInCMapBound,
38479				useCMap: null
38480			});
38481			properties.cMap = cMap;
38482			properties.vertical = properties.cMap.vertical;
38483		}
38484		const newProperties = await this.extractDataStructures(dict, properties);
38485		this.extractWidths(dict, descriptor, newProperties);
38486		return new Font(fontName.name, fontFile, newProperties);
38487	}
38488	static buildFontPaths(font, glyphs, handler, evaluatorOptions) {
38489		function buildPath(fontChar) {
38490			const glyphName = `${font.loadedName}_path_${fontChar}`;
38491			try {
38492				if (font.renderer.hasBuiltPath(fontChar)) {
38493					return;
38494				}
38495				handler.send("commonobj", [glyphName, "FontPath", font.renderer.getPathJs(fontChar)]);
38496			} catch (reason) {
38497				if (evaluatorOptions.ignoreErrors) {
38498					warn(`buildFontPaths - ignoring ${glyphName} glyph: "${reason}".`);
38499					return;
38500				}
38501				throw reason;
38502			}
38503		}
38504		for (const glyph of glyphs) {
38505			buildPath(glyph.fontChar);
38506			const accent = glyph.accent;
38507			if (accent?.fontChar) {
38508				buildPath(accent.fontChar);
38509			}
38510		}
38511	}
38512	static get fallbackFontDict() {
38513		const dict = new Dict();
38514		dict.set("BaseFont", Name.get("Helvetica"));
38515		dict.set("Type", Name.get("FallbackType"));
38516		dict.set("Subtype", Name.get("FallbackType"));
38517		dict.set("Encoding", Name.get("WinAnsiEncoding"));
38518		return shadow(this, "fallbackFontDict", dict);
38519	}
38520}
38521class TranslatedFont {
38522	constructor({
38523		loadedName,
38524		font,
38525		dict,
38526		evaluatorOptions
38527	}) {
38528		this.loadedName = loadedName;
38529		this.font = font;
38530		this.dict = dict;
38531		this._evaluatorOptions = evaluatorOptions || DefaultPartialEvaluatorOptions;
38532		this.type3Loaded = null;
38533		this.type3Dependencies = font.isType3Font ? new Set() : null;
38534		this.sent = false;
vendor: 4,652 bytes, lines 38535-38684
38535	}
38536	send(handler) {
38537		if (this.sent) {
38538			return;
38539		}
38540		this.sent = true;
38541		handler.send("commonobj", [this.loadedName, "Font", this.font.exportData(this._evaluatorOptions.fontExtraProperties)]);
38542	}
38543	fallback(handler) {
38544		if (!this.font.data) {
38545			return;
38546		}
38547		this.font.disableFontFace = true;
38548		PartialEvaluator.buildFontPaths(this.font, this.font.glyphCacheValues, handler, this._evaluatorOptions);
38549	}
38550	loadType3Data(evaluator, resources, task) {
38551		if (this.type3Loaded) {
38552			return this.type3Loaded;
38553		}
38554		if (!this.font.isType3Font) {
38555			throw new Error("Must be a Type3 font.");
38556		}
38557		const type3Evaluator = evaluator.clone({
38558			ignoreErrors: false
38559		});
38560		const type3FontRefs = new RefSet(evaluator.type3FontRefs);
38561		if (this.dict.objId && !type3FontRefs.has(this.dict.objId)) {
38562			type3FontRefs.put(this.dict.objId);
38563		}
38564		type3Evaluator.type3FontRefs = type3FontRefs;
38565		const translatedFont = this.font,
38566			type3Dependencies = this.type3Dependencies;
38567		let loadCharProcsPromise = Promise.resolve();
38568		const charProcs = this.dict.get("CharProcs");
38569		const fontResources = this.dict.get("Resources") || resources;
38570		const charProcOperatorList = Object.create(null);
38571		const fontBBox = Util.normalizeRect(translatedFont.bbox || [0, 0, 0, 0]),
38572			width = fontBBox[2] - fontBBox[0],
38573			height = fontBBox[3] - fontBBox[1];
38574		const fontBBoxSize = Math.hypot(width, height);
38575		for (const key of charProcs.getKeys()) {
38576			loadCharProcsPromise = loadCharProcsPromise.then(() => {
38577				const glyphStream = charProcs.get(key);
38578				const operatorList = new OperatorList();
38579				return type3Evaluator.getOperatorList({
38580					stream: glyphStream,
38581					task,
38582					resources: fontResources,
38583					operatorList
38584				}).then(() => {
38585					if (operatorList.fnArray[0] === OPS.setCharWidthAndBounds) {
38586						this._removeType3ColorOperators(operatorList, fontBBoxSize);
38587					}
38588					charProcOperatorList[key] = operatorList.getIR();
38589					for (const dependency of operatorList.dependencies) {
38590						type3Dependencies.add(dependency);
38591					}
38592				}).catch(function (reason) {
38593					warn(`Type3 font resource "${key}" is not available.`);
38594					const dummyOperatorList = new OperatorList();
38595					charProcOperatorList[key] = dummyOperatorList.getIR();
38596				});
38597			});
38598		}
38599		this.type3Loaded = loadCharProcsPromise.then(() => {
38600			translatedFont.charProcOperatorList = charProcOperatorList;
38601			if (this._bbox) {
38602				translatedFont.isCharBBox = true;
38603				translatedFont.bbox = this._bbox;
38604			}
38605		});
38606		return this.type3Loaded;
38607	}
38608	_removeType3ColorOperators(operatorList, fontBBoxSize = NaN) {
38609		const charBBox = Util.normalizeRect(operatorList.argsArray[0].slice(2)),
38610			width = charBBox[2] - charBBox[0],
38611			height = charBBox[3] - charBBox[1];
38612		const charBBoxSize = Math.hypot(width, height);
38613		if (width === 0 || height === 0) {
38614			operatorList.fnArray.splice(0, 1);
38615			operatorList.argsArray.splice(0, 1);
38616		} else if (fontBBoxSize === 0 || Math.round(charBBoxSize / fontBBoxSize) >= 10) {
38617			if (!this._bbox) {
38618				this._bbox = [Infinity, Infinity, -Infinity, -Infinity];
38619			}
38620			this._bbox[0] = Math.min(this._bbox[0], charBBox[0]);
38621			this._bbox[1] = Math.min(this._bbox[1], charBBox[1]);
38622			this._bbox[2] = Math.max(this._bbox[2], charBBox[2]);
38623			this._bbox[3] = Math.max(this._bbox[3], charBBox[3]);
38624		}
38625		let i = 0,
38626			ii = operatorList.length;
38627		while (i < ii) {
38628			switch (operatorList.fnArray[i]) {
38629				case OPS.setCharWidthAndBounds:
38630					break;
38631				case OPS.setStrokeColorSpace:
38632				case OPS.setFillColorSpace:
38633				case OPS.setStrokeColor:
38634				case OPS.setStrokeColorN:
38635				case OPS.setFillColor:
38636				case OPS.setFillColorN:
38637				case OPS.setStrokeGray:
38638				case OPS.setFillGray:
38639				case OPS.setStrokeRGBColor:
38640				case OPS.setFillRGBColor:
38641				case OPS.setStrokeCMYKColor:
38642				case OPS.setFillCMYKColor:
38643				case OPS.shadingFill:
38644				case OPS.setRenderingIntent:
38645					operatorList.fnArray.splice(i, 1);
38646					operatorList.argsArray.splice(i, 1);
38647					ii--;
38648					continue;
38649				case OPS.setGState:
38650					const [gStateObj] = operatorList.argsArray[i];
38651					let j = 0,
38652						jj = gStateObj.length;
38653					while (j < jj) {
38654						const [gStateKey] = gStateObj[j];
38655						switch (gStateKey) {
38656							case "TR":
38657							case "TR2":
38658							case "HT":
38659							case "BG":
38660							case "BG2":
38661							case "UCR":
38662							case "UCR2":
38663								gStateObj.splice(j, 1);
38664								jj--;
38665								continue;
38666						}
38667						j++;
38668					}
38669					break;
38670			}
38671			i++;
38672		}
38673	}
38674}
38675class StateManager {
38676	constructor(initialState = new EvalState()) {
38677		this.state = initialState;
38678		this.stateStack = [];
38679	}
38680	save() {
38681		const old = this.state;
38682		this.stateStack.push(this.state);
38683		this.state = old.clone();
38684	}
vendor: 8,374 bytes, lines 38685-39156
38685	restore() {
38686		const prev = this.stateStack.pop();
38687		if (prev) {
38688			this.state = prev;
38689		}
38690	}
38691	transform(args) {
38692		this.state.ctm = Util.transform(this.state.ctm, args);
38693	}
38694}
38695class TextState {
38696	constructor() {
38697		this.ctm = new Float32Array(IDENTITY_MATRIX);
38698		this.fontName = null;
38699		this.fontSize = 0;
38700		this.loadedName = null;
38701		this.font = null;
38702		this.fontMatrix = FONT_IDENTITY_MATRIX;
38703		this.textMatrix = IDENTITY_MATRIX.slice();
38704		this.textLineMatrix = IDENTITY_MATRIX.slice();
38705		this.charSpacing = 0;
38706		this.wordSpacing = 0;
38707		this.leading = 0;
38708		this.textHScale = 1;
38709		this.textRise = 0;
38710	}
38711	setTextMatrix(a, b, c, d, e, f) {
38712		const m = this.textMatrix;
38713		m[0] = a;
38714		m[1] = b;
38715		m[2] = c;
38716		m[3] = d;
38717		m[4] = e;
38718		m[5] = f;
38719	}
38720	setTextLineMatrix(a, b, c, d, e, f) {
38721		const m = this.textLineMatrix;
38722		m[0] = a;
38723		m[1] = b;
38724		m[2] = c;
38725		m[3] = d;
38726		m[4] = e;
38727		m[5] = f;
38728	}
38729	translateTextMatrix(x, y) {
38730		const m = this.textMatrix;
38731		m[4] = m[0] * x + m[2] * y + m[4];
38732		m[5] = m[1] * x + m[3] * y + m[5];
38733	}
38734	translateTextLineMatrix(x, y) {
38735		const m = this.textLineMatrix;
38736		m[4] = m[0] * x + m[2] * y + m[4];
38737		m[5] = m[1] * x + m[3] * y + m[5];
38738	}
38739	carriageReturn() {
38740		this.translateTextLineMatrix(0, -this.leading);
38741		this.textMatrix = this.textLineMatrix.slice();
38742	}
38743	clone() {
38744		const clone = Object.create(this);
38745		clone.textMatrix = this.textMatrix.slice();
38746		clone.textLineMatrix = this.textLineMatrix.slice();
38747		clone.fontMatrix = this.fontMatrix.slice();
38748		return clone;
38749	}
38750}
38751class EvalState {
38752	constructor() {
38753		this.ctm = new Float32Array(IDENTITY_MATRIX);
38754		this.font = null;
38755		this.textRenderingMode = TextRenderingMode.FILL;
38756		this._fillColorSpace = ColorSpace.singletons.gray;
38757		this._strokeColorSpace = ColorSpace.singletons.gray;
38758		this.patternFillColorSpace = null;
38759		this.patternStrokeColorSpace = null;
38760	}
38761	get fillColorSpace() {
38762		return this._fillColorSpace;
38763	}
38764	set fillColorSpace(colorSpace) {
38765		this._fillColorSpace = this.patternFillColorSpace = colorSpace;
38766	}
38767	get strokeColorSpace() {
38768		return this._strokeColorSpace;
38769	}
38770	set strokeColorSpace(colorSpace) {
38771		this._strokeColorSpace = this.patternStrokeColorSpace = colorSpace;
38772	}
38773	clone() {
38774		return Object.create(this);
38775	}
38776}
38777class EvaluatorPreprocessor {
38778	static get opMap() {
38779		return shadow(this, "opMap", Object.assign(Object.create(null), {
38780			w: {
38781				id: OPS.setLineWidth,
38782				numArgs: 1,
38783				variableArgs: false
38784			},
38785			J: {
38786				id: OPS.setLineCap,
38787				numArgs: 1,
38788				variableArgs: false
38789			},
38790			j: {
38791				id: OPS.setLineJoin,
38792				numArgs: 1,
38793				variableArgs: false
38794			},
38795			M: {
38796				id: OPS.setMiterLimit,
38797				numArgs: 1,
38798				variableArgs: false
38799			},
38800			d: {
38801				id: OPS.setDash,
38802				numArgs: 2,
38803				variableArgs: false
38804			},
38805			ri: {
38806				id: OPS.setRenderingIntent,
38807				numArgs: 1,
38808				variableArgs: false
38809			},
38810			i: {
38811				id: OPS.setFlatness,
38812				numArgs: 1,
38813				variableArgs: false
38814			},
38815			gs: {
38816				id: OPS.setGState,
38817				numArgs: 1,
38818				variableArgs: false
38819			},
38820			q: {
38821				id: OPS.save,
38822				numArgs: 0,
38823				variableArgs: false
38824			},
38825			Q: {
38826				id: OPS.restore,
38827				numArgs: 0,
38828				variableArgs: false
38829			},
38830			cm: {
38831				id: OPS.transform,
38832				numArgs: 6,
38833				variableArgs: false
38834			},
38835			m: {
38836				id: OPS.moveTo,
38837				numArgs: 2,
38838				variableArgs: false
38839			},
38840			l: {
38841				id: OPS.lineTo,
38842				numArgs: 2,
38843				variableArgs: false
38844			},
38845			c: {
38846				id: OPS.curveTo,
38847				numArgs: 6,
38848				variableArgs: false
38849			},
38850			v: {
38851				id: OPS.curveTo2,
38852				numArgs: 4,
38853				variableArgs: false
38854			},
38855			y: {
38856				id: OPS.curveTo3,
38857				numArgs: 4,
38858				variableArgs: false
38859			},
38860			h: {
38861				id: OPS.closePath,
38862				numArgs: 0,
38863				variableArgs: false
38864			},
38865			re: {
38866				id: OPS.rectangle,
38867				numArgs: 4,
38868				variableArgs: false
38869			},
38870			S: {
38871				id: OPS.stroke,
38872				numArgs: 0,
38873				variableArgs: false
38874			},
38875			s: {
38876				id: OPS.closeStroke,
38877				numArgs: 0,
38878				variableArgs: false
38879			},
38880			f: {
38881				id: OPS.fill,
38882				numArgs: 0,
38883				variableArgs: false
38884			},
38885			F: {
38886				id: OPS.fill,
38887				numArgs: 0,
38888				variableArgs: false
38889			},
38890			"f*": {
38891				id: OPS.eoFill,
38892				numArgs: 0,
38893				variableArgs: false
38894			},
38895			B: {
38896				id: OPS.fillStroke,
38897				numArgs: 0,
38898				variableArgs: false
38899			},
38900			"B*": {
38901				id: OPS.eoFillStroke,
38902				numArgs: 0,
38903				variableArgs: false
38904			},
38905			b: {
38906				id: OPS.closeFillStroke,
38907				numArgs: 0,
38908				variableArgs: false
38909			},
38910			"b*": {
38911				id: OPS.closeEOFillStroke,
38912				numArgs: 0,
38913				variableArgs: false
38914			},
38915			n: {
38916				id: OPS.endPath,
38917				numArgs: 0,
38918				variableArgs: false
38919			},
38920			W: {
38921				id: OPS.clip,
38922				numArgs: 0,
38923				variableArgs: false
38924			},
38925			"W*": {
38926				id: OPS.eoClip,
38927				numArgs: 0,
38928				variableArgs: false
38929			},
38930			BT: {
38931				id: OPS.beginText,
38932				numArgs: 0,
38933				variableArgs: false
38934			},
38935			ET: {
38936				id: OPS.endText,
38937				numArgs: 0,
38938				variableArgs: false
38939			},
38940			Tc: {
38941				id: OPS.setCharSpacing,
38942				numArgs: 1,
38943				variableArgs: false
38944			},
38945			Tw: {
38946				id: OPS.setWordSpacing,
38947				numArgs: 1,
38948				variableArgs: false
38949			},
38950			Tz: {
38951				id: OPS.setHScale,
38952				numArgs: 1,
38953				variableArgs: false
38954			},
38955			TL: {
38956				id: OPS.setLeading,
38957				numArgs: 1,
38958				variableArgs: false
38959			},
38960			Tf: {
38961				id: OPS.setFont,
38962				numArgs: 2,
38963				variableArgs: false
38964			},
38965			Tr: {
38966				id: OPS.setTextRenderingMode,
38967				numArgs: 1,
38968				variableArgs: false
38969			},
38970			Ts: {
38971				id: OPS.setTextRise,
38972				numArgs: 1,
38973				variableArgs: false
38974			},
38975			Td: {
38976				id: OPS.moveText,
38977				numArgs: 2,
38978				variableArgs: false
38979			},
38980			TD: {
38981				id: OPS.setLeadingMoveText,
38982				numArgs: 2,
38983				variableArgs: false
38984			},
38985			Tm: {
38986				id: OPS.setTextMatrix,
38987				numArgs: 6,
38988				variableArgs: false
38989			},
38990			"T*": {
38991				id: OPS.nextLine,
38992				numArgs: 0,
38993				variableArgs: false
38994			},
38995			Tj: {
38996				id: OPS.showText,
38997				numArgs: 1,
38998				variableArgs: false
38999			},
39000			TJ: {
39001				id: OPS.showSpacedText,
39002				numArgs: 1,
39003				variableArgs: false
39004			},
39005			"'": {
39006				id: OPS.nextLineShowText,
39007				numArgs: 1,
39008				variableArgs: false
39009			},
39010			'"': {
39011				id: OPS.nextLineSetSpacingShowText,
39012				numArgs: 3,
39013				variableArgs: false
39014			},
39015			d0: {
39016				id: OPS.setCharWidth,
39017				numArgs: 2,
39018				variableArgs: false
39019			},
39020			d1: {
39021				id: OPS.setCharWidthAndBounds,
39022				numArgs: 6,
39023				variableArgs: false
39024			},
39025			CS: {
39026				id: OPS.setStrokeColorSpace,
39027				numArgs: 1,
39028				variableArgs: false
39029			},
39030			cs: {
39031				id: OPS.setFillColorSpace,
39032				numArgs: 1,
39033				variableArgs: false
39034			},
39035			SC: {
39036				id: OPS.setStrokeColor,
39037				numArgs: 4,
39038				variableArgs: true
39039			},
39040			SCN: {
39041				id: OPS.setStrokeColorN,
39042				numArgs: 33,
39043				variableArgs: true
39044			},
39045			sc: {
39046				id: OPS.setFillColor,
39047				numArgs: 4,
39048				variableArgs: true
39049			},
39050			scn: {
39051				id: OPS.setFillColorN,
39052				numArgs: 33,
39053				variableArgs: true
39054			},
39055			G: {
39056				id: OPS.setStrokeGray,
39057				numArgs: 1,
39058				variableArgs: false
39059			},
39060			g: {
39061				id: OPS.setFillGray,
39062				numArgs: 1,
39063				variableArgs: false
39064			},
39065			RG: {
39066				id: OPS.setStrokeRGBColor,
39067				numArgs: 3,
39068				variableArgs: false
39069			},
39070			rg: {
39071				id: OPS.setFillRGBColor,
39072				numArgs: 3,
39073				variableArgs: false
39074			},
39075			K: {
39076				id: OPS.setStrokeCMYKColor,
39077				numArgs: 4,
39078				variableArgs: false
39079			},
39080			k: {
39081				id: OPS.setFillCMYKColor,
39082				numArgs: 4,
39083				variableArgs: false
39084			},
39085			sh: {
39086				id: OPS.shadingFill,
39087				numArgs: 1,
39088				variableArgs: false
39089			},
39090			BI: {
39091				id: OPS.beginInlineImage,
39092				numArgs: 0,
39093				variableArgs: false
39094			},
39095			ID: {
39096				id: OPS.beginImageData,
39097				numArgs: 0,
39098				variableArgs: false
39099			},
39100			EI: {
39101				id: OPS.endInlineImage,
39102				numArgs: 1,
39103				variableArgs: false
39104			},
39105			Do: {
39106				id: OPS.paintXObject,
39107				numArgs: 1,
39108				variableArgs: false
39109			},
39110			MP: {
39111				id: OPS.markPoint,
39112				numArgs: 1,
39113				variableArgs: false
39114			},
39115			DP: {
39116				id: OPS.markPointProps,
39117				numArgs: 2,
39118				variableArgs: false
39119			},
39120			BMC: {
39121				id: OPS.beginMarkedContent,
39122				numArgs: 1,
39123				variableArgs: false
39124			},
39125			BDC: {
39126				id: OPS.beginMarkedContentProps,
39127				numArgs: 2,
39128				variableArgs: false
39129			},
39130			EMC: {
39131				id: OPS.endMarkedContent,
39132				numArgs: 0,
39133				variableArgs: false
39134			},
39135			BX: {
39136				id: OPS.beginCompat,
39137				numArgs: 0,
39138				variableArgs: false
39139			},
39140			EX: {
39141				id: OPS.endCompat,
39142				numArgs: 0,
39143				variableArgs: false
39144			},
39145			BM: null,
39146			BD: null,
39147			true: null,
39148			fa: null,
39149			fal: null,
39150			fals: null,
39151			false: null,
39152			nu: null,
39153			nul: null,
39154			null: null
39155		}));
39156	}
vendor: 4,458 bytes, lines 39157-39345
39157	static MAX_INVALID_PATH_OPS = 10;
39158	constructor(stream, xref, stateManager = new StateManager()) {
39159		this.parser = new Parser({
39160			lexer: new Lexer(stream, EvaluatorPreprocessor.opMap),
39161			xref
39162		});
39163		this.stateManager = stateManager;
39164		this.nonProcessedArgs = [];
39165		this._isPathOp = false;
39166		this._numInvalidPathOPS = 0;
39167	}
39168	get savedStatesDepth() {
39169		return this.stateManager.stateStack.length;
39170	}
39171	read(operation) {
39172		let args = operation.args;
39173		while (true) {
39174			const obj = this.parser.getObj();
39175			if (obj instanceof Cmd) {
39176				const cmd = obj.cmd;
39177				const opSpec = EvaluatorPreprocessor.opMap[cmd];
39178				if (!opSpec) {
39179					warn(`Unknown command "${cmd}".`);
39180					continue;
39181				}
39182				const fn = opSpec.id;
39183				const numArgs = opSpec.numArgs;
39184				let argsLength = args !== null ? args.length : 0;
39185				if (!this._isPathOp) {
39186					this._numInvalidPathOPS = 0;
39187				}
39188				this._isPathOp = fn >= OPS.moveTo && fn <= OPS.endPath;
39189				if (!opSpec.variableArgs) {
39190					if (argsLength !== numArgs) {
39191						const nonProcessedArgs = this.nonProcessedArgs;
39192						while (argsLength > numArgs) {
39193							nonProcessedArgs.push(args.shift());
39194							argsLength--;
39195						}
39196						while (argsLength < numArgs && nonProcessedArgs.length !== 0) {
39197							if (args === null) {
39198								args = [];
39199							}
39200							args.unshift(nonProcessedArgs.pop());
39201							argsLength++;
39202						}
39203					}
39204					if (argsLength < numArgs) {
39205						const partialMsg = `command ${cmd}: expected ${numArgs} args, ` + `but received ${argsLength} args.`;
39206						if (this._isPathOp && ++this._numInvalidPathOPS > EvaluatorPreprocessor.MAX_INVALID_PATH_OPS) {
39207							throw new FormatError(`Invalid ${partialMsg}`);
39208						}
39209						warn(`Skipping ${partialMsg}`);
39210						if (args !== null) {
39211							args.length = 0;
39212						}
39213						continue;
39214					}
39215				} else if (argsLength > numArgs) {
39216					info(`Command ${cmd}: expected [0, ${numArgs}] args, ` + `but received ${argsLength} args.`);
39217				}
39218				this.preprocessCommand(fn, args);
39219				operation.fn = fn;
39220				operation.args = args;
39221				return true;
39222			}
39223			if (obj === EOF) {
39224				return false;
39225			}
39226			if (obj !== null) {
39227				if (args === null) {
39228					args = [];
39229				}
39230				args.push(obj);
39231				if (args.length > 33) {
39232					throw new FormatError("Too many arguments");
39233				}
39234			}
39235		}
39236	}
39237	preprocessCommand(fn, args) {
39238		switch (fn | 0) {
39239			case OPS.save:
39240				this.stateManager.save();
39241				break;
39242			case OPS.restore:
39243				this.stateManager.restore();
39244				break;
39245			case OPS.transform:
39246				this.stateManager.transform(args);
39247				break;
39248		}
39249	}
39250}
39251
39252;// ./src/core/default_appearance.js
39253
39254
39255
39256
39257
39258
39259
39260
39261
39262
39263
39264
39265
39266
39267
39268class DefaultAppearanceEvaluator extends EvaluatorPreprocessor {
39269	constructor(str) {
39270		super(new StringStream(str));
39271	}
39272	parse() {
39273		const operation = {
39274			fn: 0,
39275			args: []
39276		};
39277		const result = {
39278			fontSize: 0,
39279			fontName: "",
39280			fontColor: new Uint8ClampedArray(3)
39281		};
39282		try {
39283			while (true) {
39284				operation.args.length = 0;
39285				if (!this.read(operation)) {
39286					break;
39287				}
39288				if (this.savedStatesDepth !== 0) {
39289					continue;
39290				}
39291				const {
39292					fn,
39293					args
39294				} = operation;
39295				switch (fn | 0) {
39296					case OPS.setFont:
39297						const [fontName, fontSize] = args;
39298						if (fontName instanceof Name) {
39299							result.fontName = fontName.name;
39300						}
39301						if (typeof fontSize === "number" && fontSize > 0) {
39302							result.fontSize = fontSize;
39303						}
39304						break;
39305					case OPS.setFillRGBColor:
39306						ColorSpace.singletons.rgb.getRgbItem(args, 0, result.fontColor, 0);
39307						break;
39308					case OPS.setFillGray:
39309						ColorSpace.singletons.gray.getRgbItem(args, 0, result.fontColor, 0);
39310						break;
39311					case OPS.setFillCMYKColor:
39312						ColorSpace.singletons.cmyk.getRgbItem(args, 0, result.fontColor, 0);
39313						break;
39314				}
39315			}
39316		} catch (reason) {
39317			warn(`parseDefaultAppearance - ignoring errors: "${reason}".`);
39318		}
39319		return result;
39320	}
39321}
39322function parseDefaultAppearance(str) {
39323	return new DefaultAppearanceEvaluator(str).parse();
39324}
39325class AppearanceStreamEvaluator extends EvaluatorPreprocessor {
39326	constructor(stream, evaluatorOptions, xref) {
39327		super(stream);
39328		this.stream = stream;
39329		this.evaluatorOptions = evaluatorOptions;
39330		this.xref = xref;
39331		this.resources = stream.dict?.get("Resources");
39332	}
39333	parse() {
39334		const operation = {
39335			fn: 0,
39336			args: []
39337		};
39338		let result = {
39339			scaleFactor: 1,
39340			fontSize: 0,
39341			fontName: "",
39342			fontColor: new Uint8ClampedArray(3),
39343			fillColorSpace: ColorSpace.singletons.gray
39344		};
39345		let breakLoop = false;
vendor: 70,986 bytes, lines 39346-42112
39346		const stack = [];
39347		try {
39348			while (true) {
39349				operation.args.length = 0;
39350				if (breakLoop || !this.read(operation)) {
39351					break;
39352				}
39353				const {
39354					fn,
39355					args
39356				} = operation;
39357				switch (fn | 0) {
39358					case OPS.save:
39359						stack.push({
39360							scaleFactor: result.scaleFactor,
39361							fontSize: result.fontSize,
39362							fontName: result.fontName,
39363							fontColor: result.fontColor.slice(),
39364							fillColorSpace: result.fillColorSpace
39365						});
39366						break;
39367					case OPS.restore:
39368						result = stack.pop() || result;
39369						break;
39370					case OPS.setTextMatrix:
39371						result.scaleFactor *= Math.hypot(args[0], args[1]);
39372						break;
39373					case OPS.setFont:
39374						const [fontName, fontSize] = args;
39375						if (fontName instanceof Name) {
39376							result.fontName = fontName.name;
39377						}
39378						if (typeof fontSize === "number" && fontSize > 0) {
39379							result.fontSize = fontSize * result.scaleFactor;
39380						}
39381						break;
39382					case OPS.setFillColorSpace:
39383						result.fillColorSpace = ColorSpace.parse({
39384							cs: args[0],
39385							xref: this.xref,
39386							resources: this.resources,
39387							pdfFunctionFactory: this._pdfFunctionFactory,
39388							localColorSpaceCache: this._localColorSpaceCache
39389						});
39390						break;
39391					case OPS.setFillColor:
39392						const cs = result.fillColorSpace;
39393						cs.getRgbItem(args, 0, result.fontColor, 0);
39394						break;
39395					case OPS.setFillRGBColor:
39396						ColorSpace.singletons.rgb.getRgbItem(args, 0, result.fontColor, 0);
39397						break;
39398					case OPS.setFillGray:
39399						ColorSpace.singletons.gray.getRgbItem(args, 0, result.fontColor, 0);
39400						break;
39401					case OPS.setFillCMYKColor:
39402						ColorSpace.singletons.cmyk.getRgbItem(args, 0, result.fontColor, 0);
39403						break;
39404					case OPS.showText:
39405					case OPS.showSpacedText:
39406					case OPS.nextLineShowText:
39407					case OPS.nextLineSetSpacingShowText:
39408						breakLoop = true;
39409						break;
39410				}
39411			}
39412		} catch (reason) {
39413			warn(`parseAppearanceStream - ignoring errors: "${reason}".`);
39414		}
39415		this.stream.reset();
39416		delete result.scaleFactor;
39417		delete result.fillColorSpace;
39418		return result;
39419	}
39420	get _localColorSpaceCache() {
39421		return shadow(this, "_localColorSpaceCache", new LocalColorSpaceCache());
39422	}
39423	get _pdfFunctionFactory() {
39424		const pdfFunctionFactory = new PDFFunctionFactory({
39425			xref: this.xref,
39426			isEvalSupported: this.evaluatorOptions.isEvalSupported
39427		});
39428		return shadow(this, "_pdfFunctionFactory", pdfFunctionFactory);
39429	}
39430}
39431function parseAppearanceStream(stream, evaluatorOptions, xref) {
39432	return new AppearanceStreamEvaluator(stream, evaluatorOptions, xref).parse();
39433}
39434function getPdfColor(color, isFill) {
39435	if (color[0] === color[1] && color[1] === color[2]) {
39436		const gray = color[0] / 255;
39437		return `${numberToString(gray)} ${isFill ? "g" : "G"}`;
39438	}
39439	return Array.from(color, c => numberToString(c / 255)).join(" ") + ` ${isFill ? "rg" : "RG"}`;
39440}
39441function createDefaultAppearance({
39442	fontSize,
39443	fontName,
39444	fontColor
39445}) {
39446	return `/${escapePDFName(fontName)} ${fontSize} Tf ${getPdfColor(fontColor, true)}`;
39447}
39448class FakeUnicodeFont {
39449	constructor(xref, fontFamily) {
39450		this.xref = xref;
39451		this.widths = null;
39452		this.firstChar = Infinity;
39453		this.lastChar = -Infinity;
39454		this.fontFamily = fontFamily;
39455		const canvas = new OffscreenCanvas(1, 1);
39456		this.ctxMeasure = canvas.getContext("2d", {
39457			willReadFrequently: true
39458		});
39459		if (!FakeUnicodeFont._fontNameId) {
39460			FakeUnicodeFont._fontNameId = 1;
39461		}
39462		this.fontName = Name.get(`InvalidPDFjsFont_${fontFamily}_${FakeUnicodeFont._fontNameId++}`);
39463	}
39464	get fontDescriptorRef() {
39465		if (!FakeUnicodeFont._fontDescriptorRef) {
39466			const fontDescriptor = new Dict(this.xref);
39467			fontDescriptor.set("Type", Name.get("FontDescriptor"));
39468			fontDescriptor.set("FontName", this.fontName);
39469			fontDescriptor.set("FontFamily", "MyriadPro Regular");
39470			fontDescriptor.set("FontBBox", [0, 0, 0, 0]);
39471			fontDescriptor.set("FontStretch", Name.get("Normal"));
39472			fontDescriptor.set("FontWeight", 400);
39473			fontDescriptor.set("ItalicAngle", 0);
39474			FakeUnicodeFont._fontDescriptorRef = this.xref.getNewPersistentRef(fontDescriptor);
39475		}
39476		return FakeUnicodeFont._fontDescriptorRef;
39477	}
39478	get descendantFontRef() {
39479		const descendantFont = new Dict(this.xref);
39480		descendantFont.set("BaseFont", this.fontName);
39481		descendantFont.set("Type", Name.get("Font"));
39482		descendantFont.set("Subtype", Name.get("CIDFontType0"));
39483		descendantFont.set("CIDToGIDMap", Name.get("Identity"));
39484		descendantFont.set("FirstChar", this.firstChar);
39485		descendantFont.set("LastChar", this.lastChar);
39486		descendantFont.set("FontDescriptor", this.fontDescriptorRef);
39487		descendantFont.set("DW", 1000);
39488		const widths = [];
39489		const chars = [...this.widths.entries()].sort();
39490		let currentChar = null;
39491		let currentWidths = null;
39492		for (const [char, width] of chars) {
39493			if (!currentChar) {
39494				currentChar = char;
39495				currentWidths = [width];
39496				continue;
39497			}
39498			if (char === currentChar + currentWidths.length) {
39499				currentWidths.push(width);
39500			} else {
39501				widths.push(currentChar, currentWidths);
39502				currentChar = char;
39503				currentWidths = [width];
39504			}
39505		}
39506		if (currentChar) {
39507			widths.push(currentChar, currentWidths);
39508		}
39509		descendantFont.set("W", widths);
39510		const cidSystemInfo = new Dict(this.xref);
39511		cidSystemInfo.set("Ordering", "Identity");
39512		cidSystemInfo.set("Registry", "Adobe");
39513		cidSystemInfo.set("Supplement", 0);
39514		descendantFont.set("CIDSystemInfo", cidSystemInfo);
39515		return this.xref.getNewPersistentRef(descendantFont);
39516	}
39517	get baseFontRef() {
39518		const baseFont = new Dict(this.xref);
39519		baseFont.set("BaseFont", this.fontName);
39520		baseFont.set("Type", Name.get("Font"));
39521		baseFont.set("Subtype", Name.get("Type0"));
39522		baseFont.set("Encoding", Name.get("Identity-H"));
39523		baseFont.set("DescendantFonts", [this.descendantFontRef]);
39524		baseFont.set("ToUnicode", Name.get("Identity-H"));
39525		return this.xref.getNewPersistentRef(baseFont);
39526	}
39527	get resources() {
39528		const resources = new Dict(this.xref);
39529		const font = new Dict(this.xref);
39530		font.set(this.fontName.name, this.baseFontRef);
39531		resources.set("Font", font);
39532		return resources;
39533	}
39534	_createContext() {
39535		this.widths = new Map();
39536		this.ctxMeasure.font = `1000px ${this.fontFamily}`;
39537		return this.ctxMeasure;
39538	}
39539	createFontResources(text) {
39540		const ctx = this._createContext();
39541		for (const line of text.split(/\r\n?|\n/)) {
39542			for (const char of line.split("")) {
39543				const code = char.charCodeAt(0);
39544				if (this.widths.has(code)) {
39545					continue;
39546				}
39547				const metrics = ctx.measureText(char);
39548				const width = Math.ceil(metrics.width);
39549				this.widths.set(code, width);
39550				this.firstChar = Math.min(code, this.firstChar);
39551				this.lastChar = Math.max(code, this.lastChar);
39552			}
39553		}
39554		return this.resources;
39555	}
39556	static getFirstPositionInfo(rect, rotation, fontSize) {
39557		const [x1, y1, x2, y2] = rect;
39558		let w = x2 - x1;
39559		let h = y2 - y1;
39560		if (rotation % 180 !== 0) {
39561			[w, h] = [h, w];
39562		}
39563		const lineHeight = LINE_FACTOR * fontSize;
39564		const lineDescent = LINE_DESCENT_FACTOR * fontSize;
39565		return {
39566			coords: [0, h + lineDescent - lineHeight],
39567			bbox: [0, 0, w, h],
39568			matrix: rotation !== 0 ? getRotationMatrix(rotation, h, lineHeight) : undefined
39569		};
39570	}
39571	createAppearance(text, rect, rotation, fontSize, bgColor, strokeAlpha) {
39572		const ctx = this._createContext();
39573		const lines = [];
39574		let maxWidth = -Infinity;
39575		for (const line of text.split(/\r\n?|\n/)) {
39576			lines.push(line);
39577			const lineWidth = ctx.measureText(line).width;
39578			maxWidth = Math.max(maxWidth, lineWidth);
39579			for (const code of codePointIter(line)) {
39580				const char = String.fromCodePoint(code);
39581				let width = this.widths.get(code);
39582				if (width === undefined) {
39583					const metrics = ctx.measureText(char);
39584					width = Math.ceil(metrics.width);
39585					this.widths.set(code, width);
39586					this.firstChar = Math.min(code, this.firstChar);
39587					this.lastChar = Math.max(code, this.lastChar);
39588				}
39589			}
39590		}
39591		maxWidth *= fontSize / 1000;
39592		const [x1, y1, x2, y2] = rect;
39593		let w = x2 - x1;
39594		let h = y2 - y1;
39595		if (rotation % 180 !== 0) {
39596			[w, h] = [h, w];
39597		}
39598		let hscale = 1;
39599		if (maxWidth > w) {
39600			hscale = w / maxWidth;
39601		}
39602		let vscale = 1;
39603		const lineHeight = LINE_FACTOR * fontSize;
39604		const lineDescent = LINE_DESCENT_FACTOR * fontSize;
39605		const maxHeight = lineHeight * lines.length;
39606		if (maxHeight > h) {
39607			vscale = h / maxHeight;
39608		}
39609		const fscale = Math.min(hscale, vscale);
39610		const newFontSize = fontSize * fscale;
39611		const buffer = ["q", `0 0 ${numberToString(w)} ${numberToString(h)} re W n`, `BT`, `1 0 0 1 0 ${numberToString(h + lineDescent)} Tm 0 Tc ${getPdfColor(bgColor, true)}`, `/${this.fontName.name} ${numberToString(newFontSize)} Tf`];
39612		const {
39613			resources
39614		} = this;
39615		strokeAlpha = typeof strokeAlpha === "number" && strokeAlpha >= 0 && strokeAlpha <= 1 ? strokeAlpha : 1;
39616		if (strokeAlpha !== 1) {
39617			buffer.push("/R0 gs");
39618			const extGState = new Dict(this.xref);
39619			const r0 = new Dict(this.xref);
39620			r0.set("ca", strokeAlpha);
39621			r0.set("CA", strokeAlpha);
39622			r0.set("Type", Name.get("ExtGState"));
39623			extGState.set("R0", r0);
39624			resources.set("ExtGState", extGState);
39625		}
39626		const vShift = numberToString(lineHeight);
39627		for (const line of lines) {
39628			buffer.push(`0 -${vShift} Td <${stringToUTF16HexString(line)}> Tj`);
39629		}
39630		buffer.push("ET", "Q");
39631		const appearance = buffer.join("\n");
39632		const appearanceStreamDict = new Dict(this.xref);
39633		appearanceStreamDict.set("Subtype", Name.get("Form"));
39634		appearanceStreamDict.set("Type", Name.get("XObject"));
39635		appearanceStreamDict.set("BBox", [0, 0, w, h]);
39636		appearanceStreamDict.set("Length", appearance.length);
39637		appearanceStreamDict.set("Resources", resources);
39638		if (rotation) {
39639			const matrix = getRotationMatrix(rotation, w, h);
39640			appearanceStreamDict.set("Matrix", matrix);
39641		}
39642		const ap = new StringStream(appearance);
39643		ap.dict = appearanceStreamDict;
39644		return ap;
39645	}
39646}
39647
39648;// ./src/core/name_number_tree.js
39649
39650
39651
39652class NameOrNumberTree {
39653	constructor(root, xref, type) {
39654		this.root = root;
39655		this.xref = xref;
39656		this._type = type;
39657	}
39658	getAll() {
39659		const map = new Map();
39660		if (!this.root) {
39661			return map;
39662		}
39663		const xref = this.xref;
39664		const processed = new RefSet();
39665		processed.put(this.root);
39666		const queue = [this.root];
39667		while (queue.length > 0) {
39668			const obj = xref.fetchIfRef(queue.shift());
39669			if (!(obj instanceof Dict)) {
39670				continue;
39671			}
39672			if (obj.has("Kids")) {
39673				const kids = obj.get("Kids");
39674				if (!Array.isArray(kids)) {
39675					continue;
39676				}
39677				for (const kid of kids) {
39678					if (processed.has(kid)) {
39679						throw new FormatError(`Duplicate entry in "${this._type}" tree.`);
39680					}
39681					queue.push(kid);
39682					processed.put(kid);
39683				}
39684				continue;
39685			}
39686			const entries = obj.get(this._type);
39687			if (!Array.isArray(entries)) {
39688				continue;
39689			}
39690			for (let i = 0, ii = entries.length; i < ii; i += 2) {
39691				map.set(xref.fetchIfRef(entries[i]), xref.fetchIfRef(entries[i + 1]));
39692			}
39693		}
39694		return map;
39695	}
39696	getRaw(key) {
39697		if (!this.root) {
39698			return null;
39699		}
39700		const xref = this.xref;
39701		let kidsOrEntries = xref.fetchIfRef(this.root);
39702		let loopCount = 0;
39703		const MAX_LEVELS = 10;
39704		while (kidsOrEntries.has("Kids")) {
39705			if (++loopCount > MAX_LEVELS) {
39706				warn(`Search depth limit reached for "${this._type}" tree.`);
39707				return null;
39708			}
39709			const kids = kidsOrEntries.get("Kids");
39710			if (!Array.isArray(kids)) {
39711				return null;
39712			}
39713			let l = 0,
39714				r = kids.length - 1;
39715			while (l <= r) {
39716				const m = l + r >> 1;
39717				const kid = xref.fetchIfRef(kids[m]);
39718				const limits = kid.get("Limits");
39719				if (key < xref.fetchIfRef(limits[0])) {
39720					r = m - 1;
39721				} else if (key > xref.fetchIfRef(limits[1])) {
39722					l = m + 1;
39723				} else {
39724					kidsOrEntries = kid;
39725					break;
39726				}
39727			}
39728			if (l > r) {
39729				return null;
39730			}
39731		}
39732		const entries = kidsOrEntries.get(this._type);
39733		if (Array.isArray(entries)) {
39734			let l = 0,
39735				r = entries.length - 2;
39736			while (l <= r) {
39737				const tmp = l + r >> 1,
39738					m = tmp + (tmp & 1);
39739				const currentKey = xref.fetchIfRef(entries[m]);
39740				if (key < currentKey) {
39741					r = m - 2;
39742				} else if (key > currentKey) {
39743					l = m + 2;
39744				} else {
39745					return entries[m + 1];
39746				}
39747			}
39748		}
39749		return null;
39750	}
39751	get(key) {
39752		return this.xref.fetchIfRef(this.getRaw(key));
39753	}
39754}
39755class NameTree extends NameOrNumberTree {
39756	constructor(root, xref) {
39757		super(root, xref, "Names");
39758	}
39759}
39760class NumberTree extends NameOrNumberTree {
39761	constructor(root, xref) {
39762		super(root, xref, "Nums");
39763	}
39764}
39765
39766;// ./src/core/cleanup_helper.js
39767
39768
39769
39770
39771function clearGlobalCaches() {
39772	clearPatternCaches();
39773	clearPrimitiveCaches();
39774	clearUnicodeCaches();
39775	JpxImage.cleanup();
39776}
39777
39778;// ./src/core/file_spec.js
39779
39780
39781
39782function pickPlatformItem(dict) {
39783	if (!(dict instanceof Dict)) {
39784		return null;
39785	}
39786	if (dict.has("UF")) {
39787		return dict.get("UF");
39788	} else if (dict.has("F")) {
39789		return dict.get("F");
39790	} else if (dict.has("Unix")) {
39791		return dict.get("Unix");
39792	} else if (dict.has("Mac")) {
39793		return dict.get("Mac");
39794	} else if (dict.has("DOS")) {
39795		return dict.get("DOS");
39796	}
39797	return null;
39798}
39799function stripPath(str) {
39800	return str.substring(str.lastIndexOf("/") + 1);
39801}
39802class FileSpec {
39803	#contentAvailable = false;
39804	constructor(root, xref, skipContent = false) {
39805		if (!(root instanceof Dict)) {
39806			return;
39807		}
39808		this.xref = xref;
39809		this.root = root;
39810		if (root.has("FS")) {
39811			this.fs = root.get("FS");
39812		}
39813		if (root.has("RF")) {
39814			warn("Related file specifications are not supported");
39815		}
39816		if (!skipContent) {
39817			if (root.has("EF")) {
39818				this.#contentAvailable = true;
39819			} else {
39820				warn("Non-embedded file specifications are not supported");
39821			}
39822		}
39823	}
39824	get filename() {
39825		let filename = "";
39826		const item = pickPlatformItem(this.root);
39827		if (item && typeof item === "string") {
39828			filename = stringToPDFString(item).replaceAll("\\\\", "\\").replaceAll("\\/", "/").replaceAll("\\", "/");
39829		}
39830		return shadow(this, "filename", filename || "unnamed");
39831	}
39832	get content() {
39833		if (!this.#contentAvailable) {
39834			return null;
39835		}
39836		this._contentRef ||= pickPlatformItem(this.root?.get("EF"));
39837		let content = null;
39838		if (this._contentRef) {
39839			const fileObj = this.xref.fetchIfRef(this._contentRef);
39840			if (fileObj instanceof BaseStream) {
39841				content = fileObj.getBytes();
39842			} else {
39843				warn("Embedded file specification points to non-existing/invalid content");
39844			}
39845		} else {
39846			warn("Embedded file specification does not have any content");
39847		}
39848		return content;
39849	}
39850	get description() {
39851		let description = "";
39852		const desc = this.root?.get("Desc");
39853		if (desc && typeof desc === "string") {
39854			description = stringToPDFString(desc);
39855		}
39856		return shadow(this, "description", description);
39857	}
39858	get serializable() {
39859		return {
39860			rawFilename: this.filename,
39861			filename: stripPath(this.filename),
39862			content: this.content,
39863			description: this.description
39864		};
39865	}
39866}
39867
39868;// ./src/core/xml_parser.js
39869
39870
39871
39872const XMLParserErrorCode = {
39873	NoError: 0,
39874	EndOfDocument: -1,
39875	UnterminatedCdat: -2,
39876	UnterminatedXmlDeclaration: -3,
39877	UnterminatedDoctypeDeclaration: -4,
39878	UnterminatedComment: -5,
39879	MalformedElement: -6,
39880	OutOfMemory: -7,
39881	UnterminatedAttributeValue: -8,
39882	UnterminatedElement: -9,
39883	ElementNeverBegun: -10
39884};
39885function isWhitespace(s, index) {
39886	const ch = s[index];
39887	return ch === " " || ch === "\n" || ch === "\r" || ch === "\t";
39888}
39889function isWhitespaceString(s) {
39890	for (let i = 0, ii = s.length; i < ii; i++) {
39891		if (!isWhitespace(s, i)) {
39892			return false;
39893		}
39894	}
39895	return true;
39896}
39897class XMLParserBase {
39898	_resolveEntities(s) {
39899		return s.replaceAll(/&([^;]+);/g, (all, entity) => {
39900			if (entity.substring(0, 2) === "#x") {
39901				return String.fromCodePoint(parseInt(entity.substring(2), 16));
39902			} else if (entity.substring(0, 1) === "#") {
39903				return String.fromCodePoint(parseInt(entity.substring(1), 10));
39904			}
39905			switch (entity) {
39906				case "lt":
39907					return "<";
39908				case "gt":
39909					return ">";
39910				case "amp":
39911					return "&";
39912				case "quot":
39913					return '"';
39914				case "apos":
39915					return "'";
39916			}
39917			return this.onResolveEntity(entity);
39918		});
39919	}
39920	_parseContent(s, start) {
39921		const attributes = [];
39922		let pos = start;
39923		function skipWs() {
39924			while (pos < s.length && isWhitespace(s, pos)) {
39925				++pos;
39926			}
39927		}
39928		while (pos < s.length && !isWhitespace(s, pos) && s[pos] !== ">" && s[pos] !== "/") {
39929			++pos;
39930		}
39931		const name = s.substring(start, pos);
39932		skipWs();
39933		while (pos < s.length && s[pos] !== ">" && s[pos] !== "/" && s[pos] !== "?") {
39934			skipWs();
39935			let attrName = "",
39936				attrValue = "";
39937			while (pos < s.length && !isWhitespace(s, pos) && s[pos] !== "=") {
39938				attrName += s[pos];
39939				++pos;
39940			}
39941			skipWs();
39942			if (s[pos] !== "=") {
39943				return null;
39944			}
39945			++pos;
39946			skipWs();
39947			const attrEndChar = s[pos];
39948			if (attrEndChar !== '"' && attrEndChar !== "'") {
39949				return null;
39950			}
39951			const attrEndIndex = s.indexOf(attrEndChar, ++pos);
39952			if (attrEndIndex < 0) {
39953				return null;
39954			}
39955			attrValue = s.substring(pos, attrEndIndex);
39956			attributes.push({
39957				name: attrName,
39958				value: this._resolveEntities(attrValue)
39959			});
39960			pos = attrEndIndex + 1;
39961			skipWs();
39962		}
39963		return {
39964			name,
39965			attributes,
39966			parsed: pos - start
39967		};
39968	}
39969	_parseProcessingInstruction(s, start) {
39970		let pos = start;
39971		function skipWs() {
39972			while (pos < s.length && isWhitespace(s, pos)) {
39973				++pos;
39974			}
39975		}
39976		while (pos < s.length && !isWhitespace(s, pos) && s[pos] !== ">" && s[pos] !== "?" && s[pos] !== "/") {
39977			++pos;
39978		}
39979		const name = s.substring(start, pos);
39980		skipWs();
39981		const attrStart = pos;
39982		while (pos < s.length && (s[pos] !== "?" || s[pos + 1] !== ">")) {
39983			++pos;
39984		}
39985		const value = s.substring(attrStart, pos);
39986		return {
39987			name,
39988			value,
39989			parsed: pos - start
39990		};
39991	}
39992	parseXml(s) {
39993		let i = 0;
39994		while (i < s.length) {
39995			const ch = s[i];
39996			let j = i;
39997			if (ch === "<") {
39998				++j;
39999				const ch2 = s[j];
40000				let q;
40001				switch (ch2) {
40002					case "/":
40003						++j;
40004						q = s.indexOf(">", j);
40005						if (q < 0) {
40006							this.onError(XMLParserErrorCode.UnterminatedElement);
40007							return;
40008						}
40009						this.onEndElement(s.substring(j, q));
40010						j = q + 1;
40011						break;
40012					case "?":
40013						++j;
40014						const pi = this._parseProcessingInstruction(s, j);
40015						if (s.substring(j + pi.parsed, j + pi.parsed + 2) !== "?>") {
40016							this.onError(XMLParserErrorCode.UnterminatedXmlDeclaration);
40017							return;
40018						}
40019						this.onPi(pi.name, pi.value);
40020						j += pi.parsed + 2;
40021						break;
40022					case "!":
40023						if (s.substring(j + 1, j + 3) === "--") {
40024							q = s.indexOf("-->", j + 3);
40025							if (q < 0) {
40026								this.onError(XMLParserErrorCode.UnterminatedComment);
40027								return;
40028							}
40029							this.onComment(s.substring(j + 3, q));
40030							j = q + 3;
40031						} else if (s.substring(j + 1, j + 8) === "[CDATA[") {
40032							q = s.indexOf("]]>", j + 8);
40033							if (q < 0) {
40034								this.onError(XMLParserErrorCode.UnterminatedCdat);
40035								return;
40036							}
40037							this.onCdata(s.substring(j + 8, q));
40038							j = q + 3;
40039						} else if (s.substring(j + 1, j + 8) === "DOCTYPE") {
40040							const q2 = s.indexOf("[", j + 8);
40041							let complexDoctype = false;
40042							q = s.indexOf(">", j + 8);
40043							if (q < 0) {
40044								this.onError(XMLParserErrorCode.UnterminatedDoctypeDeclaration);
40045								return;
40046							}
40047							if (q2 > 0 && q > q2) {
40048								q = s.indexOf("]>", j + 8);
40049								if (q < 0) {
40050									this.onError(XMLParserErrorCode.UnterminatedDoctypeDeclaration);
40051									return;
40052								}
40053								complexDoctype = true;
40054							}
40055							const doctypeContent = s.substring(j + 8, q + (complexDoctype ? 1 : 0));
40056							this.onDoctype(doctypeContent);
40057							j = q + (complexDoctype ? 2 : 1);
40058						} else {
40059							this.onError(XMLParserErrorCode.MalformedElement);
40060							return;
40061						}
40062						break;
40063					default:
40064						const content = this._parseContent(s, j);
40065						if (content === null) {
40066							this.onError(XMLParserErrorCode.MalformedElement);
40067							return;
40068						}
40069						let isClosed = false;
40070						if (s.substring(j + content.parsed, j + content.parsed + 2) === "/>") {
40071							isClosed = true;
40072						} else if (s.substring(j + content.parsed, j + content.parsed + 1) !== ">") {
40073							this.onError(XMLParserErrorCode.UnterminatedElement);
40074							return;
40075						}
40076						this.onBeginElement(content.name, content.attributes, isClosed);
40077						j += content.parsed + (isClosed ? 2 : 1);
40078						break;
40079				}
40080			} else {
40081				while (j < s.length && s[j] !== "<") {
40082					j++;
40083				}
40084				const text = s.substring(i, j);
40085				this.onText(this._resolveEntities(text));
40086			}
40087			i = j;
40088		}
40089	}
40090	onResolveEntity(name) {
40091		return `&${name};`;
40092	}
40093	onPi(name, value) {}
40094	onComment(text) {}
40095	onCdata(text) {}
40096	onDoctype(doctypeContent) {}
40097	onText(text) {}
40098	onBeginElement(name, attributes, isEmpty) {}
40099	onEndElement(name) {}
40100	onError(code) {}
40101}
40102class SimpleDOMNode {
40103	constructor(nodeName, nodeValue) {
40104		this.nodeName = nodeName;
40105		this.nodeValue = nodeValue;
40106		Object.defineProperty(this, "parentNode", {
40107			value: null,
40108			writable: true
40109		});
40110	}
40111	get firstChild() {
40112		return this.childNodes?.[0];
40113	}
40114	get nextSibling() {
40115		const childNodes = this.parentNode.childNodes;
40116		if (!childNodes) {
40117			return undefined;
40118		}
40119		const index = childNodes.indexOf(this);
40120		if (index === -1) {
40121			return undefined;
40122		}
40123		return childNodes[index + 1];
40124	}
40125	get textContent() {
40126		if (!this.childNodes) {
40127			return this.nodeValue || "";
40128		}
40129		return this.childNodes.map(function (child) {
40130			return child.textContent;
40131		}).join("");
40132	}
40133	get children() {
40134		return this.childNodes || [];
40135	}
40136	hasChildNodes() {
40137		return this.childNodes?.length > 0;
40138	}
40139	searchNode(paths, pos) {
40140		if (pos >= paths.length) {
40141			return this;
40142		}
40143		const component = paths[pos];
40144		if (component.name.startsWith("#") && pos < paths.length - 1) {
40145			return this.searchNode(paths, pos + 1);
40146		}
40147		const stack = [];
40148		let node = this;
40149		while (true) {
40150			if (component.name === node.nodeName) {
40151				if (component.pos === 0) {
40152					const res = node.searchNode(paths, pos + 1);
40153					if (res !== null) {
40154						return res;
40155					}
40156				} else if (stack.length === 0) {
40157					return null;
40158				} else {
40159					const [parent] = stack.pop();
40160					let siblingPos = 0;
40161					for (const child of parent.childNodes) {
40162						if (component.name === child.nodeName) {
40163							if (siblingPos === component.pos) {
40164								return child.searchNode(paths, pos + 1);
40165							}
40166							siblingPos++;
40167						}
40168					}
40169					return node.searchNode(paths, pos + 1);
40170				}
40171			}
40172			if (node.childNodes?.length > 0) {
40173				stack.push([node, 0]);
40174				node = node.childNodes[0];
40175			} else if (stack.length === 0) {
40176				return null;
40177			} else {
40178				while (stack.length !== 0) {
40179					const [parent, currentPos] = stack.pop();
40180					const newPos = currentPos + 1;
40181					if (newPos < parent.childNodes.length) {
40182						stack.push([parent, newPos]);
40183						node = parent.childNodes[newPos];
40184						break;
40185					}
40186				}
40187				if (stack.length === 0) {
40188					return null;
40189				}
40190			}
40191		}
40192	}
40193	dump(buffer) {
40194		if (this.nodeName === "#text") {
40195			buffer.push(encodeToXmlString(this.nodeValue));
40196			return;
40197		}
40198		buffer.push(`<${this.nodeName}`);
40199		if (this.attributes) {
40200			for (const attribute of this.attributes) {
40201				buffer.push(` ${attribute.name}="${encodeToXmlString(attribute.value)}"`);
40202			}
40203		}
40204		if (this.hasChildNodes()) {
40205			buffer.push(">");
40206			for (const child of this.childNodes) {
40207				child.dump(buffer);
40208			}
40209			buffer.push(`</${this.nodeName}>`);
40210		} else if (this.nodeValue) {
40211			buffer.push(`>${encodeToXmlString(this.nodeValue)}</${this.nodeName}>`);
40212		} else {
40213			buffer.push("/>");
40214		}
40215	}
40216}
40217class SimpleXMLParser extends XMLParserBase {
40218	constructor({
40219		hasAttributes = false,
40220		lowerCaseName = false
40221	}) {
40222		super();
40223		this._currentFragment = null;
40224		this._stack = null;
40225		this._errorCode = XMLParserErrorCode.NoError;
40226		this._hasAttributes = hasAttributes;
40227		this._lowerCaseName = lowerCaseName;
40228	}
40229	parseFromString(data) {
40230		this._currentFragment = [];
40231		this._stack = [];
40232		this._errorCode = XMLParserErrorCode.NoError;
40233		this.parseXml(data);
40234		if (this._errorCode !== XMLParserErrorCode.NoError) {
40235			return undefined;
40236		}
40237		const [documentElement] = this._currentFragment;
40238		if (!documentElement) {
40239			return undefined;
40240		}
40241		return {
40242			documentElement
40243		};
40244	}
40245	onText(text) {
40246		if (isWhitespaceString(text)) {
40247			return;
40248		}
40249		const node = new SimpleDOMNode("#text", text);
40250		this._currentFragment.push(node);
40251	}
40252	onCdata(text) {
40253		const node = new SimpleDOMNode("#text", text);
40254		this._currentFragment.push(node);
40255	}
40256	onBeginElement(name, attributes, isEmpty) {
40257		if (this._lowerCaseName) {
40258			name = name.toLowerCase();
40259		}
40260		const node = new SimpleDOMNode(name);
40261		node.childNodes = [];
40262		if (this._hasAttributes) {
40263			node.attributes = attributes;
40264		}
40265		this._currentFragment.push(node);
40266		if (isEmpty) {
40267			return;
40268		}
40269		this._stack.push(this._currentFragment);
40270		this._currentFragment = node.childNodes;
40271	}
40272	onEndElement(name) {
40273		this._currentFragment = this._stack.pop() || [];
40274		const lastElement = this._currentFragment.at(-1);
40275		if (!lastElement) {
40276			return null;
40277		}
40278		for (const childNode of lastElement.childNodes) {
40279			childNode.parentNode = lastElement;
40280		}
40281		return lastElement;
40282	}
40283	onError(code) {
40284		this._errorCode = code;
40285	}
40286}
40287
40288;// ./src/core/metadata_parser.js
40289
40290
40291
40292
40293
40294class MetadataParser {
40295	constructor(data) {
40296		data = this._repair(data);
40297		const parser = new SimpleXMLParser({
40298			lowerCaseName: true
40299		});
40300		const xmlDocument = parser.parseFromString(data);
40301		this._metadataMap = new Map();
40302		this._data = data;
40303		if (xmlDocument) {
40304			this._parse(xmlDocument);
40305		}
40306	}
40307	_repair(data) {
40308		return data.replace(/^[^<]+/, "").replaceAll(/>\\376\\377([^<]+)/g, function (all, codes) {
40309			const bytes = codes.replaceAll(/\\([0-3])([0-7])([0-7])/g, function (code, d1, d2, d3) {
40310				return String.fromCharCode(d1 * 64 + d2 * 8 + d3 * 1);
40311			}).replaceAll(/&(amp|apos|gt|lt|quot);/g, function (str, name) {
40312				switch (name) {
40313					case "amp":
40314						return "&";
40315					case "apos":
40316						return "'";
40317					case "gt":
40318						return ">";
40319					case "lt":
40320						return "<";
40321					case "quot":
40322						return '"';
40323				}
40324				throw new Error(`_repair: ${name} isn't defined.`);
40325			});
40326			const charBuf = [">"];
40327			for (let i = 0, ii = bytes.length; i < ii; i += 2) {
40328				const code = bytes.charCodeAt(i) * 256 + bytes.charCodeAt(i + 1);
40329				if (code >= 32 && code < 127 && code !== 60 && code !== 62 && code !== 38) {
40330					charBuf.push(String.fromCharCode(code));
40331				} else {
40332					charBuf.push("&#x" + (0x10000 + code).toString(16).substring(1) + ";");
40333				}
40334			}
40335			return charBuf.join("");
40336		});
40337	}
40338	_getSequence(entry) {
40339		const name = entry.nodeName;
40340		if (name !== "rdf:bag" && name !== "rdf:seq" && name !== "rdf:alt") {
40341			return null;
40342		}
40343		return entry.childNodes.filter(node => node.nodeName === "rdf:li");
40344	}
40345	_parseArray(entry) {
40346		if (!entry.hasChildNodes()) {
40347			return;
40348		}
40349		const [seqNode] = entry.childNodes;
40350		const sequence = this._getSequence(seqNode) || [];
40351		this._metadataMap.set(entry.nodeName, sequence.map(node => node.textContent.trim()));
40352	}
40353	_parse(xmlDocument) {
40354		let rdf = xmlDocument.documentElement;
40355		if (rdf.nodeName !== "rdf:rdf") {
40356			rdf = rdf.firstChild;
40357			while (rdf && rdf.nodeName !== "rdf:rdf") {
40358				rdf = rdf.nextSibling;
40359			}
40360		}
40361		if (!rdf || rdf.nodeName !== "rdf:rdf" || !rdf.hasChildNodes()) {
40362			return;
40363		}
40364		for (const desc of rdf.childNodes) {
40365			if (desc.nodeName !== "rdf:description") {
40366				continue;
40367			}
40368			for (const entry of desc.childNodes) {
40369				const name = entry.nodeName;
40370				switch (name) {
40371					case "#text":
40372						continue;
40373					case "dc:creator":
40374					case "dc:subject":
40375						this._parseArray(entry);
40376						continue;
40377				}
40378				this._metadataMap.set(name, entry.textContent.trim());
40379			}
40380		}
40381	}
40382	get serializable() {
40383		return {
40384			parsedData: this._metadataMap,
40385			rawData: this._data
40386		};
40387	}
40388}
40389
40390;// ./src/core/struct_tree.js
40391
40392
40393
40394
40395
40396const MAX_DEPTH = 40;
40397const StructElementType = {
40398	PAGE_CONTENT: 1,
40399	STREAM_CONTENT: 2,
40400	OBJECT: 3,
40401	ANNOTATION: 4,
40402	ELEMENT: 5
40403};
40404class StructTreeRoot {
40405	constructor(rootDict, rootRef) {
40406		this.dict = rootDict;
40407		this.ref = rootRef instanceof Ref ? rootRef : null;
40408		this.roleMap = new Map();
40409		this.structParentIds = null;
40410	}
40411	init() {
40412		this.readRoleMap();
40413	}
40414	#addIdToPage(pageRef, id, type) {
40415		if (!(pageRef instanceof Ref) || id < 0) {
40416			return;
40417		}
40418		this.structParentIds ||= new RefSetCache();
40419		let ids = this.structParentIds.get(pageRef);
40420		if (!ids) {
40421			ids = [];
40422			this.structParentIds.put(pageRef, ids);
40423		}
40424		ids.push([id, type]);
40425	}
40426	addAnnotationIdToPage(pageRef, id) {
40427		this.#addIdToPage(pageRef, id, StructElementType.ANNOTATION);
40428	}
40429	readRoleMap() {
40430		const roleMapDict = this.dict.get("RoleMap");
40431		if (!(roleMapDict instanceof Dict)) {
40432			return;
40433		}
40434		for (const [key, value] of roleMapDict) {
40435			if (value instanceof Name) {
40436				this.roleMap.set(key, value.name);
40437			}
40438		}
40439	}
40440	static async canCreateStructureTree({
40441		catalogRef,
40442		pdfManager,
40443		newAnnotationsByPage
40444	}) {
40445		if (!(catalogRef instanceof Ref)) {
40446			warn("Cannot save the struct tree: no catalog reference.");
40447			return false;
40448		}
40449		let nextKey = 0;
40450		let hasNothingToUpdate = true;
40451		for (const [pageIndex, elements] of newAnnotationsByPage) {
40452			const {
40453				ref: pageRef
40454			} = await pdfManager.getPage(pageIndex);
40455			if (!(pageRef instanceof Ref)) {
40456				warn(`Cannot save the struct tree: page ${pageIndex} has no ref.`);
40457				hasNothingToUpdate = true;
40458				break;
40459			}
40460			for (const element of elements) {
40461				if (element.accessibilityData?.type) {
40462					element.parentTreeId = nextKey++;
40463					hasNothingToUpdate = false;
40464				}
40465			}
40466		}
40467		if (hasNothingToUpdate) {
40468			for (const elements of newAnnotationsByPage.values()) {
40469				for (const element of elements) {
40470					delete element.parentTreeId;
40471				}
40472			}
40473			return false;
40474		}
40475		return true;
40476	}
40477	static async createStructureTree({
40478		newAnnotationsByPage,
40479		xref,
40480		catalogRef,
40481		pdfManager,
40482		changes
40483	}) {
40484		const root = pdfManager.catalog.cloneDict();
40485		const cache = new RefSetCache();
40486		cache.put(catalogRef, root);
40487		const structTreeRootRef = xref.getNewTemporaryRef();
40488		root.set("StructTreeRoot", structTreeRootRef);
40489		const structTreeRoot = new Dict(xref);
40490		structTreeRoot.set("Type", Name.get("StructTreeRoot"));
40491		const parentTreeRef = xref.getNewTemporaryRef();
40492		structTreeRoot.set("ParentTree", parentTreeRef);
40493		const kids = [];
40494		structTreeRoot.set("K", kids);
40495		cache.put(structTreeRootRef, structTreeRoot);
40496		const parentTree = new Dict(xref);
40497		const nums = [];
40498		parentTree.set("Nums", nums);
40499		const nextKey = await this.#writeKids({
40500			newAnnotationsByPage,
40501			structTreeRootRef,
40502			structTreeRoot: null,
40503			kids,
40504			nums,
40505			xref,
40506			pdfManager,
40507			changes,
40508			cache
40509		});
40510		structTreeRoot.set("ParentTreeNextKey", nextKey);
40511		cache.put(parentTreeRef, parentTree);
40512		for (const [ref, obj] of cache.items()) {
40513			changes.put(ref, {
40514				data: obj
40515			});
40516		}
40517	}
40518	async canUpdateStructTree({
40519		pdfManager,
40520		xref,
40521		newAnnotationsByPage
40522	}) {
40523		if (!this.ref) {
40524			warn("Cannot update the struct tree: no root reference.");
40525			return false;
40526		}
40527		let nextKey = this.dict.get("ParentTreeNextKey");
40528		if (!Number.isInteger(nextKey) || nextKey < 0) {
40529			warn("Cannot update the struct tree: invalid next key.");
40530			return false;
40531		}
40532		const parentTree = this.dict.get("ParentTree");
40533		if (!(parentTree instanceof Dict)) {
40534			warn("Cannot update the struct tree: ParentTree isn't a dict.");
40535			return false;
40536		}
40537		const nums = parentTree.get("Nums");
40538		if (!Array.isArray(nums)) {
40539			warn("Cannot update the struct tree: nums isn't an array.");
40540			return false;
40541		}
40542		const numberTree = new NumberTree(parentTree, xref);
40543		for (const pageIndex of newAnnotationsByPage.keys()) {
40544			const {
40545				pageDict
40546			} = await pdfManager.getPage(pageIndex);
40547			if (!pageDict.has("StructParents")) {
40548				continue;
40549			}
40550			const id = pageDict.get("StructParents");
40551			if (!Number.isInteger(id) || !Array.isArray(numberTree.get(id))) {
40552				warn(`Cannot save the struct tree: page ${pageIndex} has a wrong id.`);
40553				return false;
40554			}
40555		}
40556		let hasNothingToUpdate = true;
40557		for (const [pageIndex, elements] of newAnnotationsByPage) {
40558			const {
40559				pageDict
40560			} = await pdfManager.getPage(pageIndex);
40561			StructTreeRoot.#collectParents({
40562				elements,
40563				xref: this.dict.xref,
40564				pageDict,
40565				numberTree
40566			});
40567			for (const element of elements) {
40568				if (element.accessibilityData?.type) {
40569					if (!(element.accessibilityData.structParent >= 0)) {
40570						element.parentTreeId = nextKey++;
40571					}
40572					hasNothingToUpdate = false;
40573				}
40574			}
40575		}
40576		if (hasNothingToUpdate) {
40577			for (const elements of newAnnotationsByPage.values()) {
40578				for (const element of elements) {
40579					delete element.parentTreeId;
40580					delete element.structTreeParent;
40581				}
40582			}
40583			return false;
40584		}
40585		return true;
40586	}
40587	async updateStructureTree({
40588		newAnnotationsByPage,
40589		pdfManager,
40590		changes
40591	}) {
40592		const xref = this.dict.xref;
40593		const structTreeRoot = this.dict.clone();
40594		const structTreeRootRef = this.ref;
40595		const cache = new RefSetCache();
40596		cache.put(structTreeRootRef, structTreeRoot);
40597		let parentTreeRef = structTreeRoot.getRaw("ParentTree");
40598		let parentTree;
40599		if (parentTreeRef instanceof Ref) {
40600			parentTree = xref.fetch(parentTreeRef);
40601		} else {
40602			parentTree = parentTreeRef;
40603			parentTreeRef = xref.getNewTemporaryRef();
40604			structTreeRoot.set("ParentTree", parentTreeRef);
40605		}
40606		parentTree = parentTree.clone();
40607		cache.put(parentTreeRef, parentTree);
40608		let nums = parentTree.getRaw("Nums");
40609		let numsRef = null;
40610		if (nums instanceof Ref) {
40611			numsRef = nums;
40612			nums = xref.fetch(numsRef);
40613		}
40614		nums = nums.slice();
40615		if (!numsRef) {
40616			parentTree.set("Nums", nums);
40617		}
40618		const newNextKey = await StructTreeRoot.#writeKids({
40619			newAnnotationsByPage,
40620			structTreeRootRef,
40621			structTreeRoot: this,
40622			kids: null,
40623			nums,
40624			xref,
40625			pdfManager,
40626			changes,
40627			cache
40628		});
40629		if (newNextKey === -1) {
40630			return;
40631		}
40632		structTreeRoot.set("ParentTreeNextKey", newNextKey);
40633		if (numsRef) {
40634			cache.put(numsRef, nums);
40635		}
40636		for (const [ref, obj] of cache.items()) {
40637			changes.put(ref, {
40638				data: obj
40639			});
40640		}
40641	}
40642	static async #writeKids({
40643		newAnnotationsByPage,
40644		structTreeRootRef,
40645		structTreeRoot,
40646		kids,
40647		nums,
40648		xref,
40649		pdfManager,
40650		changes,
40651		cache
40652	}) {
40653		const objr = Name.get("OBJR");
40654		let nextKey = -1;
40655		let structTreePageObjs;
40656		for (const [pageIndex, elements] of newAnnotationsByPage) {
40657			const page = await pdfManager.getPage(pageIndex);
40658			const {
40659				ref: pageRef
40660			} = page;
40661			const isPageRef = pageRef instanceof Ref;
40662			for (const {
40663				accessibilityData,
40664				ref,
40665				parentTreeId,
40666				structTreeParent
40667			} of elements) {
40668				if (!accessibilityData?.type) {
40669					continue;
40670				}
40671				const {
40672					structParent
40673				} = accessibilityData;
40674				if (structTreeRoot && Number.isInteger(structParent) && structParent >= 0) {
40675					let objs = (structTreePageObjs ||= new Map()).get(pageIndex);
40676					if (objs === undefined) {
40677						const structTreePage = new StructTreePage(structTreeRoot, page.pageDict);
40678						objs = structTreePage.collectObjects(pageRef);
40679						structTreePageObjs.set(pageIndex, objs);
40680					}
40681					const objRef = objs?.get(structParent);
40682					if (objRef) {
40683						const tagDict = xref.fetch(objRef).clone();
40684						StructTreeRoot.#writeProperties(tagDict, accessibilityData);
40685						changes.put(objRef, {
40686							data: tagDict
40687						});
40688						continue;
40689					}
40690				}
40691				nextKey = Math.max(nextKey, parentTreeId);
40692				const tagRef = xref.getNewTemporaryRef();
40693				const tagDict = new Dict(xref);
40694				StructTreeRoot.#writeProperties(tagDict, accessibilityData);
40695				await this.#updateParentTag({
40696					structTreeParent,
40697					tagDict,
40698					newTagRef: tagRef,
40699					structTreeRootRef,
40700					fallbackKids: kids,
40701					xref,
40702					cache
40703				});
40704				const objDict = new Dict(xref);
40705				tagDict.set("K", objDict);
40706				objDict.set("Type", objr);
40707				if (isPageRef) {
40708					objDict.set("Pg", pageRef);
40709				}
40710				objDict.set("Obj", ref);
40711				cache.put(tagRef, tagDict);
40712				nums.push(parentTreeId, tagRef);
40713			}
40714		}
40715		return nextKey + 1;
40716	}
40717	static #writeProperties(tagDict, {
40718		type,
40719		title,
40720		lang,
40721		alt,
40722		expanded,
40723		actualText
40724	}) {
40725		tagDict.set("S", Name.get(type));
40726		if (title) {
40727			tagDict.set("T", stringToAsciiOrUTF16BE(title));
40728		}
40729		if (lang) {
40730			tagDict.set("Lang", stringToAsciiOrUTF16BE(lang));
40731		}
40732		if (alt) {
40733			tagDict.set("Alt", stringToAsciiOrUTF16BE(alt));
40734		}
40735		if (expanded) {
40736			tagDict.set("E", stringToAsciiOrUTF16BE(expanded));
40737		}
40738		if (actualText) {
40739			tagDict.set("ActualText", stringToAsciiOrUTF16BE(actualText));
40740		}
40741	}
40742	static #collectParents({
40743		elements,
40744		xref,
40745		pageDict,
40746		numberTree
40747	}) {
40748		const idToElements = new Map();
40749		for (const element of elements) {
40750			if (element.structTreeParentId) {
40751				const id = parseInt(element.structTreeParentId.split("_mc")[1], 10);
40752				let elems = idToElements.get(id);
40753				if (!elems) {
40754					elems = [];
40755					idToElements.set(id, elems);
40756				}
40757				elems.push(element);
40758			}
40759		}
40760		const id = pageDict.get("StructParents");
40761		if (!Number.isInteger(id)) {
40762			return;
40763		}
40764		const parentArray = numberTree.get(id);
40765		const updateElement = (kid, pageKid, kidRef) => {
40766			const elems = idToElements.get(kid);
40767			if (elems) {
40768				const parentRef = pageKid.getRaw("P");
40769				const parentDict = xref.fetchIfRef(parentRef);
40770				if (parentRef instanceof Ref && parentDict instanceof Dict) {
40771					const params = {
40772						ref: kidRef,
40773						dict: pageKid
40774					};
40775					for (const element of elems) {
40776						element.structTreeParent = params;
40777					}
40778				}
40779				return true;
40780			}
40781			return false;
40782		};
40783		for (const kidRef of parentArray) {
40784			if (!(kidRef instanceof Ref)) {
40785				continue;
40786			}
40787			const pageKid = xref.fetch(kidRef);
40788			const k = pageKid.get("K");
40789			if (Number.isInteger(k)) {
40790				updateElement(k, pageKid, kidRef);
40791				continue;
40792			}
40793			if (!Array.isArray(k)) {
40794				continue;
40795			}
40796			for (let kid of k) {
40797				kid = xref.fetchIfRef(kid);
40798				if (Number.isInteger(kid) && updateElement(kid, pageKid, kidRef)) {
40799					break;
40800				}
40801				if (!(kid instanceof Dict)) {
40802					continue;
40803				}
40804				if (!isName(kid.get("Type"), "MCR")) {
40805					break;
40806				}
40807				const mcid = kid.get("MCID");
40808				if (Number.isInteger(mcid) && updateElement(mcid, pageKid, kidRef)) {
40809					break;
40810				}
40811			}
40812		}
40813	}
40814	static async #updateParentTag({
40815		structTreeParent,
40816		tagDict,
40817		newTagRef,
40818		structTreeRootRef,
40819		fallbackKids,
40820		xref,
40821		cache
40822	}) {
40823		let ref = null;
40824		let parentRef;
40825		if (structTreeParent) {
40826			({
40827				ref
40828			} = structTreeParent);
40829			parentRef = structTreeParent.dict.getRaw("P") || structTreeRootRef;
40830		} else {
40831			parentRef = structTreeRootRef;
40832		}
40833		tagDict.set("P", parentRef);
40834		const parentDict = xref.fetchIfRef(parentRef);
40835		if (!parentDict) {
40836			fallbackKids.push(newTagRef);
40837			return;
40838		}
40839		let cachedParentDict = cache.get(parentRef);
40840		if (!cachedParentDict) {
40841			cachedParentDict = parentDict.clone();
40842			cache.put(parentRef, cachedParentDict);
40843		}
40844		const parentKidsRaw = cachedParentDict.getRaw("K");
40845		let cachedParentKids = parentKidsRaw instanceof Ref ? cache.get(parentKidsRaw) : null;
40846		if (!cachedParentKids) {
40847			cachedParentKids = xref.fetchIfRef(parentKidsRaw);
40848			cachedParentKids = Array.isArray(cachedParentKids) ? cachedParentKids.slice() : [parentKidsRaw];
40849			const parentKidsRef = xref.getNewTemporaryRef();
40850			cachedParentDict.set("K", parentKidsRef);
40851			cache.put(parentKidsRef, cachedParentKids);
40852		}
40853		const index = cachedParentKids.indexOf(ref);
40854		cachedParentKids.splice(index >= 0 ? index + 1 : cachedParentKids.length, 0, newTagRef);
40855	}
40856}
40857class StructElementNode {
40858	constructor(tree, dict) {
40859		this.tree = tree;
40860		this.dict = dict;
40861		this.kids = [];
40862		this.parseKids();
40863	}
40864	get role() {
40865		const nameObj = this.dict.get("S");
40866		const name = nameObj instanceof Name ? nameObj.name : "";
40867		const {
40868			root
40869		} = this.tree;
40870		if (root.roleMap.has(name)) {
40871			return root.roleMap.get(name);
40872		}
40873		return name;
40874	}
40875	parseKids() {
40876		let pageObjId = null;
40877		const objRef = this.dict.getRaw("Pg");
40878		if (objRef instanceof Ref) {
40879			pageObjId = objRef.toString();
40880		}
40881		const kids = this.dict.get("K");
40882		if (Array.isArray(kids)) {
40883			for (const kid of kids) {
40884				const element = this.parseKid(pageObjId, kid);
40885				if (element) {
40886					this.kids.push(element);
40887				}
40888			}
40889		} else {
40890			const element = this.parseKid(pageObjId, kids);
40891			if (element) {
40892				this.kids.push(element);
40893			}
40894		}
40895	}
40896	parseKid(pageObjId, kid) {
40897		if (Number.isInteger(kid)) {
40898			if (this.tree.pageDict.objId !== pageObjId) {
40899				return null;
40900			}
40901			return new StructElement({
40902				type: StructElementType.PAGE_CONTENT,
40903				mcid: kid,
40904				pageObjId
40905			});
40906		}
40907		let kidDict = null;
40908		if (kid instanceof Ref) {
40909			kidDict = this.dict.xref.fetch(kid);
40910		} else if (kid instanceof Dict) {
40911			kidDict = kid;
40912		}
40913		if (!kidDict) {
40914			return null;
40915		}
40916		const pageRef = kidDict.getRaw("Pg");
40917		if (pageRef instanceof Ref) {
40918			pageObjId = pageRef.toString();
40919		}
40920		const type = kidDict.get("Type") instanceof Name ? kidDict.get("Type").name : null;
40921		if (type === "MCR") {
40922			if (this.tree.pageDict.objId !== pageObjId) {
40923				return null;
40924			}
40925			const kidRef = kidDict.getRaw("Stm");
40926			return new StructElement({
40927				type: StructElementType.STREAM_CONTENT,
40928				refObjId: kidRef instanceof Ref ? kidRef.toString() : null,
40929				pageObjId,
40930				mcid: kidDict.get("MCID")
40931			});
40932		}
40933		if (type === "OBJR") {
40934			if (this.tree.pageDict.objId !== pageObjId) {
40935				return null;
40936			}
40937			const kidRef = kidDict.getRaw("Obj");
40938			return new StructElement({
40939				type: StructElementType.OBJECT,
40940				refObjId: kidRef instanceof Ref ? kidRef.toString() : null,
40941				pageObjId
40942			});
40943		}
40944		return new StructElement({
40945			type: StructElementType.ELEMENT,
40946			dict: kidDict
40947		});
40948	}
40949}
40950class StructElement {
40951	constructor({
40952		type,
40953		dict = null,
40954		mcid = null,
40955		pageObjId = null,
40956		refObjId = null
40957	}) {
40958		this.type = type;
40959		this.dict = dict;
40960		this.mcid = mcid;
40961		this.pageObjId = pageObjId;
40962		this.refObjId = refObjId;
40963		this.parentNode = null;
40964	}
40965}
40966class StructTreePage {
40967	constructor(structTreeRoot, pageDict) {
40968		this.root = structTreeRoot;
40969		this.rootDict = structTreeRoot ? structTreeRoot.dict : null;
40970		this.pageDict = pageDict;
40971		this.nodes = [];
40972	}
40973	collectObjects(pageRef) {
40974		if (!this.root || !this.rootDict || !(pageRef instanceof Ref)) {
40975			return null;
40976		}
40977		const parentTree = this.rootDict.get("ParentTree");
40978		if (!parentTree) {
40979			return null;
40980		}
40981		const ids = this.root.structParentIds?.get(pageRef);
40982		if (!ids) {
40983			return null;
40984		}
40985		const map = new Map();
40986		const numberTree = new NumberTree(parentTree, this.rootDict.xref);
40987		for (const [elemId] of ids) {
40988			const obj = numberTree.getRaw(elemId);
40989			if (obj instanceof Ref) {
40990				map.set(elemId, obj);
40991			}
40992		}
40993		return map;
40994	}
40995	parse(pageRef) {
40996		if (!this.root || !this.rootDict || !(pageRef instanceof Ref)) {
40997			return;
40998		}
40999		const parentTree = this.rootDict.get("ParentTree");
41000		if (!parentTree) {
41001			return;
41002		}
41003		const id = this.pageDict.get("StructParents");
41004		const ids = this.root.structParentIds?.get(pageRef);
41005		if (!Number.isInteger(id) && !ids) {
41006			return;
41007		}
41008		const map = new Map();
41009		const numberTree = new NumberTree(parentTree, this.rootDict.xref);
41010		if (Number.isInteger(id)) {
41011			const parentArray = numberTree.get(id);
41012			if (Array.isArray(parentArray)) {
41013				for (const ref of parentArray) {
41014					if (ref instanceof Ref) {
41015						this.addNode(this.rootDict.xref.fetch(ref), map);
41016					}
41017				}
41018			}
41019		}
41020		if (!ids) {
41021			return;
41022		}
41023		for (const [elemId, type] of ids) {
41024			const obj = numberTree.get(elemId);
41025			if (obj) {
41026				const elem = this.addNode(this.rootDict.xref.fetchIfRef(obj), map);
41027				if (elem?.kids?.length === 1 && elem.kids[0].type === StructElementType.OBJECT) {
41028					elem.kids[0].type = type;
41029				}
41030			}
41031		}
41032	}
41033	addNode(dict, map, level = 0) {
41034		if (level > MAX_DEPTH) {
41035			warn("StructTree MAX_DEPTH reached.");
41036			return null;
41037		}
41038		if (!(dict instanceof Dict)) {
41039			return null;
41040		}
41041		if (map.has(dict)) {
41042			return map.get(dict);
41043		}
41044		const element = new StructElementNode(this, dict);
41045		map.set(dict, element);
41046		const parent = dict.get("P");
41047		if (!parent || isName(parent.get("Type"), "StructTreeRoot")) {
41048			if (!this.addTopLevelNode(dict, element)) {
41049				map.delete(dict);
41050			}
41051			return element;
41052		}
41053		const parentNode = this.addNode(parent, map, level + 1);
41054		if (!parentNode) {
41055			return element;
41056		}
41057		let save = false;
41058		for (const kid of parentNode.kids) {
41059			if (kid.type === StructElementType.ELEMENT && kid.dict === dict) {
41060				kid.parentNode = element;
41061				save = true;
41062			}
41063		}
41064		if (!save) {
41065			map.delete(dict);
41066		}
41067		return element;
41068	}
41069	addTopLevelNode(dict, element) {
41070		const obj = this.rootDict.get("K");
41071		if (!obj) {
41072			return false;
41073		}
41074		if (obj instanceof Dict) {
41075			if (obj.objId !== dict.objId) {
41076				return false;
41077			}
41078			this.nodes[0] = element;
41079			return true;
41080		}
41081		if (!Array.isArray(obj)) {
41082			return true;
41083		}
41084		let save = false;
41085		for (let i = 0; i < obj.length; i++) {
41086			const kidRef = obj[i];
41087			if (kidRef?.toString() === dict.objId) {
41088				this.nodes[i] = element;
41089				save = true;
41090			}
41091		}
41092		return save;
41093	}
41094	get serializable() {
41095		function nodeToSerializable(node, parent, level = 0) {
41096			if (level > MAX_DEPTH) {
41097				warn("StructTree too deep to be fully serialized.");
41098				return;
41099			}
41100			const obj = Object.create(null);
41101			obj.role = node.role;
41102			obj.children = [];
41103			parent.children.push(obj);
41104			let alt = node.dict.get("Alt");
41105			if (typeof alt !== "string") {
41106				alt = node.dict.get("ActualText");
41107			}
41108			if (typeof alt === "string") {
41109				obj.alt = stringToPDFString(alt);
41110			}
41111			const a = node.dict.get("A");
41112			if (a instanceof Dict) {
41113				const bbox = lookupNormalRect(a.getArray("BBox"), null);
41114				if (bbox) {
41115					obj.bbox = bbox;
41116				} else {
41117					const width = a.get("Width");
41118					const height = a.get("Height");
41119					if (typeof width === "number" && width > 0 && typeof height === "number" && height > 0) {
41120						obj.bbox = [0, 0, width, height];
41121					}
41122				}
41123			}
41124			const lang = node.dict.get("Lang");
41125			if (typeof lang === "string") {
41126				obj.lang = stringToPDFString(lang);
41127			}
41128			for (const kid of node.kids) {
41129				const kidElement = kid.type === StructElementType.ELEMENT ? kid.parentNode : null;
41130				if (kidElement) {
41131					nodeToSerializable(kidElement, obj, level + 1);
41132					continue;
41133				} else if (kid.type === StructElementType.PAGE_CONTENT || kid.type === StructElementType.STREAM_CONTENT) {
41134					obj.children.push({
41135						type: "content",
41136						id: `p${kid.pageObjId}_mc${kid.mcid}`
41137					});
41138				} else if (kid.type === StructElementType.OBJECT) {
41139					obj.children.push({
41140						type: "object",
41141						id: kid.refObjId
41142					});
41143				} else if (kid.type === StructElementType.ANNOTATION) {
41144					obj.children.push({
41145						type: "annotation",
41146						id: `${AnnotationPrefix}${kid.refObjId}`
41147					});
41148				}
41149			}
41150		}
41151		const root = Object.create(null);
41152		root.children = [];
41153		root.role = "Root";
41154		for (const child of this.nodes) {
41155			if (!child) {
41156				continue;
41157			}
41158			nodeToSerializable(child, root);
41159		}
41160		return root;
41161	}
41162}
41163
41164;// ./src/core/catalog.js
41165
41166
41167
41168
41169
41170
41171
41172
41173
41174
41175
41176
41177
41178
41179
41180
41181
41182
41183
41184
41185
41186
41187
41188
41189
41190
41191
41192
41193function isValidExplicitDest(dest) {
41194	if (!Array.isArray(dest) || dest.length < 2) {
41195		return false;
41196	}
41197	const [page, zoom, ...args] = dest;
41198	if (!(page instanceof Ref) && !Number.isInteger(page)) {
41199		return false;
41200	}
41201	if (!(zoom instanceof Name)) {
41202		return false;
41203	}
41204	const argsLen = args.length;
41205	let allowNull = true;
41206	switch (zoom.name) {
41207		case "XYZ":
41208			if (argsLen < 2 || argsLen > 3) {
41209				return false;
41210			}
41211			break;
41212		case "Fit":
41213		case "FitB":
41214			return argsLen === 0;
41215		case "FitH":
41216		case "FitBH":
41217		case "FitV":
41218		case "FitBV":
41219			if (argsLen > 1) {
41220				return false;
41221			}
41222			break;
41223		case "FitR":
41224			if (argsLen !== 4) {
41225				return false;
41226			}
41227			allowNull = false;
41228			break;
41229		default:
41230			return false;
41231	}
41232	for (const arg of args) {
41233		if (!(typeof arg === "number" || allowNull && arg === null)) {
41234			return false;
41235		}
41236	}
41237	return true;
41238}
41239function fetchDest(dest) {
41240	if (dest instanceof Dict) {
41241		dest = dest.get("D");
41242	}
41243	return isValidExplicitDest(dest) ? dest : null;
41244}
41245function fetchRemoteDest(action) {
41246	let dest = action.get("D");
41247	if (dest) {
41248		if (dest instanceof Name) {
41249			dest = dest.name;
41250		}
41251		if (typeof dest === "string") {
41252			return stringToPDFString(dest);
41253		} else if (isValidExplicitDest(dest)) {
41254			return JSON.stringify(dest);
41255		}
41256	}
41257	return null;
41258}
41259class Catalog {
41260	constructor(pdfManager, xref) {
41261		this.pdfManager = pdfManager;
41262		this.xref = xref;
41263		this._catDict = xref.getCatalogObj();
41264		if (!(this._catDict instanceof Dict)) {
41265			throw new FormatError("Catalog object is not a dictionary.");
41266		}
41267		this.toplevelPagesDict;
41268		this._actualNumPages = null;
41269		this.fontCache = new RefSetCache();
41270		this.builtInCMapCache = new Map();
41271		this.standardFontDataCache = new Map();
41272		this.globalImageCache = new GlobalImageCache();
41273		this.pageKidsCountCache = new RefSetCache();
41274		this.pageIndexCache = new RefSetCache();
41275		this.pageDictCache = new RefSetCache();
41276		this.nonBlendModesSet = new RefSet();
41277		this.systemFontCache = new Map();
41278	}
41279	cloneDict() {
41280		return this._catDict.clone();
41281	}
41282	get version() {
41283		const version = this._catDict.get("Version");
41284		if (version instanceof Name) {
41285			if (PDF_VERSION_REGEXP.test(version.name)) {
41286				return shadow(this, "version", version.name);
41287			}
41288			warn(`Invalid PDF catalog version: ${version.name}`);
41289		}
41290		return shadow(this, "version", null);
41291	}
41292	get lang() {
41293		const lang = this._catDict.get("Lang");
41294		return shadow(this, "lang", lang && typeof lang === "string" ? stringToPDFString(lang) : null);
41295	}
41296	get needsRendering() {
41297		const needsRendering = this._catDict.get("NeedsRendering");
41298		return shadow(this, "needsRendering", typeof needsRendering === "boolean" ? needsRendering : false);
41299	}
41300	get collection() {
41301		let collection = null;
41302		try {
41303			const obj = this._catDict.get("Collection");
41304			if (obj instanceof Dict && obj.size > 0) {
41305				collection = obj;
41306			}
41307		} catch (ex) {
41308			if (ex instanceof MissingDataException) {
41309				throw ex;
41310			}
41311			info("Cannot fetch Collection entry; assuming no collection is present.");
41312		}
41313		return shadow(this, "collection", collection);
41314	}
41315	get acroForm() {
41316		let acroForm = null;
41317		try {
41318			const obj = this._catDict.get("AcroForm");
41319			if (obj instanceof Dict && obj.size > 0) {
41320				acroForm = obj;
41321			}
41322		} catch (ex) {
41323			if (ex instanceof MissingDataException) {
41324				throw ex;
41325			}
41326			info("Cannot fetch AcroForm entry; assuming no forms are present.");
41327		}
41328		return shadow(this, "acroForm", acroForm);
41329	}
41330	get acroFormRef() {
41331		const value = this._catDict.getRaw("AcroForm");
41332		return shadow(this, "acroFormRef", value instanceof Ref ? value : null);
41333	}
41334	get metadata() {
41335		const streamRef = this._catDict.getRaw("Metadata");
41336		if (!(streamRef instanceof Ref)) {
41337			return shadow(this, "metadata", null);
41338		}
41339		let metadata = null;
41340		try {
41341			const stream = this.xref.fetch(streamRef, !this.xref.encrypt?.encryptMetadata);
41342			if (stream instanceof BaseStream && stream.dict instanceof Dict) {
41343				const type = stream.dict.get("Type");
41344				const subtype = stream.dict.get("Subtype");
41345				if (isName(type, "Metadata") && isName(subtype, "XML")) {
41346					const data = stringToUTF8String(stream.getString());
41347					if (data) {
41348						metadata = new MetadataParser(data).serializable;
41349					}
41350				}
41351			}
41352		} catch (ex) {
41353			if (ex instanceof MissingDataException) {
41354				throw ex;
41355			}
41356			info(`Skipping invalid Metadata: "${ex}".`);
41357		}
41358		return shadow(this, "metadata", metadata);
41359	}
41360	get markInfo() {
41361		let markInfo = null;
41362		try {
41363			markInfo = this._readMarkInfo();
41364		} catch (ex) {
41365			if (ex instanceof MissingDataException) {
41366				throw ex;
41367			}
41368			warn("Unable to read mark info.");
41369		}
41370		return shadow(this, "markInfo", markInfo);
41371	}
41372	_readMarkInfo() {
41373		const obj = this._catDict.get("MarkInfo");
41374		if (!(obj instanceof Dict)) {
41375			return null;
41376		}
41377		const markInfo = {
41378			Marked: false,
41379			UserProperties: false,
41380			Suspects: false
41381		};
41382		for (const key in markInfo) {
41383			const value = obj.get(key);
41384			if (typeof value === "boolean") {
41385				markInfo[key] = value;
41386			}
41387		}
41388		return markInfo;
41389	}
41390	get structTreeRoot() {
41391		let structTree = null;
41392		try {
41393			structTree = this._readStructTreeRoot();
41394		} catch (ex) {
41395			if (ex instanceof MissingDataException) {
41396				throw ex;
41397			}
41398			warn("Unable read to structTreeRoot info.");
41399		}
41400		return shadow(this, "structTreeRoot", structTree);
41401	}
41402	_readStructTreeRoot() {
41403		const rawObj = this._catDict.getRaw("StructTreeRoot");
41404		const obj = this.xref.fetchIfRef(rawObj);
41405		if (!(obj instanceof Dict)) {
41406			return null;
41407		}
41408		const root = new StructTreeRoot(obj, rawObj);
41409		root.init();
41410		return root;
41411	}
41412	get toplevelPagesDict() {
41413		const pagesObj = this._catDict.get("Pages");
41414		if (!(pagesObj instanceof Dict)) {
41415			throw new FormatError("Invalid top-level pages dictionary.");
41416		}
41417		return shadow(this, "toplevelPagesDict", pagesObj);
41418	}
41419	get documentOutline() {
41420		let obj = null;
41421		try {
41422			obj = this._readDocumentOutline();
41423		} catch (ex) {
41424			if (ex instanceof MissingDataException) {
41425				throw ex;
41426			}
41427			warn("Unable to read document outline.");
41428		}
41429		return shadow(this, "documentOutline", obj);
41430	}
41431	_readDocumentOutline() {
41432		let obj = this._catDict.get("Outlines");
41433		if (!(obj instanceof Dict)) {
41434			return null;
41435		}
41436		obj = obj.getRaw("First");
41437		if (!(obj instanceof Ref)) {
41438			return null;
41439		}
41440		const root = {
41441			items: []
41442		};
41443		const queue = [{
41444			obj,
41445			parent: root
41446		}];
41447		const processed = new RefSet();
41448		processed.put(obj);
41449		const xref = this.xref,
41450			blackColor = new Uint8ClampedArray(3);
41451		while (queue.length > 0) {
41452			const i = queue.shift();
41453			const outlineDict = xref.fetchIfRef(i.obj);
41454			if (outlineDict === null) {
41455				continue;
41456			}
41457			if (!outlineDict.has("Title")) {
41458				warn("Invalid outline item encountered.");
41459			}
41460			const data = {
41461				url: null,
41462				dest: null,
41463				action: null
41464			};
41465			Catalog.parseDestDictionary({
41466				destDict: outlineDict,
41467				resultObj: data,
41468				docBaseUrl: this.baseUrl,
41469				docAttachments: this.attachments
41470			});
41471			const title = outlineDict.get("Title");
41472			const flags = outlineDict.get("F") || 0;
41473			const color = outlineDict.getArray("C");
41474			const count = outlineDict.get("Count");
41475			let rgbColor = blackColor;
41476			if (isNumberArray(color, 3) && (color[0] !== 0 || color[1] !== 0 || color[2] !== 0)) {
41477				rgbColor = ColorSpace.singletons.rgb.getRgb(color, 0);
41478			}
41479			const outlineItem = {
41480				action: data.action,
41481				attachment: data.attachment,
41482				dest: data.dest,
41483				url: data.url,
41484				unsafeUrl: data.unsafeUrl,
41485				newWindow: data.newWindow,
41486				setOCGState: data.setOCGState,
41487				title: typeof title === "string" ? stringToPDFString(title) : "",
41488				color: rgbColor,
41489				count: Number.isInteger(count) ? count : undefined,
41490				bold: !!(flags & 2),
41491				italic: !!(flags & 1),
41492				items: []
41493			};
41494			i.parent.items.push(outlineItem);
41495			obj = outlineDict.getRaw("First");
41496			if (obj instanceof Ref && !processed.has(obj)) {
41497				queue.push({
41498					obj,
41499					parent: outlineItem
41500				});
41501				processed.put(obj);
41502			}
41503			obj = outlineDict.getRaw("Next");
41504			if (obj instanceof Ref && !processed.has(obj)) {
41505				queue.push({
41506					obj,
41507					parent: i.parent
41508				});
41509				processed.put(obj);
41510			}
41511		}
41512		return root.items.length > 0 ? root.items : null;
41513	}
41514	get permissions() {
41515		let permissions = null;
41516		try {
41517			permissions = this._readPermissions();
41518		} catch (ex) {
41519			if (ex instanceof MissingDataException) {
41520				throw ex;
41521			}
41522			warn("Unable to read permissions.");
41523		}
41524		return shadow(this, "permissions", permissions);
41525	}
41526	_readPermissions() {
41527		const encrypt = this.xref.trailer.get("Encrypt");
41528		if (!(encrypt instanceof Dict)) {
41529			return null;
41530		}
41531		let flags = encrypt.get("P");
41532		if (typeof flags !== "number") {
41533			return null;
41534		}
41535		flags += 2 ** 32;
41536		const permissions = [];
41537		for (const key in PermissionFlag) {
41538			const value = PermissionFlag[key];
41539			if (flags & value) {
41540				permissions.push(value);
41541			}
41542		}
41543		return permissions;
41544	}
41545	get optionalContentConfig() {
41546		let config = null;
41547		try {
41548			const properties = this._catDict.get("OCProperties");
41549			if (!properties) {
41550				return shadow(this, "optionalContentConfig", null);
41551			}
41552			const defaultConfig = properties.get("D");
41553			if (!defaultConfig) {
41554				return shadow(this, "optionalContentConfig", null);
41555			}
41556			const groupsData = properties.get("OCGs");
41557			if (!Array.isArray(groupsData)) {
41558				return shadow(this, "optionalContentConfig", null);
41559			}
41560			const groupRefCache = new RefSetCache();
41561			for (const groupRef of groupsData) {
41562				if (!(groupRef instanceof Ref) || groupRefCache.has(groupRef)) {
41563					continue;
41564				}
41565				groupRefCache.put(groupRef, this.#readOptionalContentGroup(groupRef));
41566			}
41567			config = this.#readOptionalContentConfig(defaultConfig, groupRefCache);
41568		} catch (ex) {
41569			if (ex instanceof MissingDataException) {
41570				throw ex;
41571			}
41572			warn(`Unable to read optional content config: ${ex}`);
41573		}
41574		return shadow(this, "optionalContentConfig", config);
41575	}
41576	#readOptionalContentGroup(groupRef) {
41577		const group = this.xref.fetch(groupRef);
41578		const obj = {
41579			id: groupRef.toString(),
41580			name: null,
41581			intent: null,
41582			usage: {
41583				print: null,
41584				view: null
41585			},
41586			rbGroups: []
41587		};
41588		const name = group.get("Name");
41589		if (typeof name === "string") {
41590			obj.name = stringToPDFString(name);
41591		}
41592		let intent = group.getArray("Intent");
41593		if (!Array.isArray(intent)) {
41594			intent = [intent];
41595		}
41596		if (intent.every(i => i instanceof Name)) {
41597			obj.intent = intent.map(i => i.name);
41598		}
41599		const usage = group.get("Usage");
41600		if (!(usage instanceof Dict)) {
41601			return obj;
41602		}
41603		const usageObj = obj.usage;
41604		const print = usage.get("Print");
41605		if (print instanceof Dict) {
41606			const printState = print.get("PrintState");
41607			if (printState instanceof Name) {
41608				switch (printState.name) {
41609					case "ON":
41610					case "OFF":
41611						usageObj.print = {
41612							printState: printState.name
41613						};
41614				}
41615			}
41616		}
41617		const view = usage.get("View");
41618		if (view instanceof Dict) {
41619			const viewState = view.get("ViewState");
41620			if (viewState instanceof Name) {
41621				switch (viewState.name) {
41622					case "ON":
41623					case "OFF":
41624						usageObj.view = {
41625							viewState: viewState.name
41626						};
41627				}
41628			}
41629		}
41630		return obj;
41631	}
41632	#readOptionalContentConfig(config, groupRefCache) {
41633		function parseOnOff(refs) {
41634			const onParsed = [];
41635			if (Array.isArray(refs)) {
41636				for (const value of refs) {
41637					if (value instanceof Ref && groupRefCache.has(value)) {
41638						onParsed.push(value.toString());
41639					}
41640				}
41641			}
41642			return onParsed;
41643		}
41644		function parseOrder(refs, nestedLevels = 0) {
41645			if (!Array.isArray(refs)) {
41646				return null;
41647			}
41648			const order = [];
41649			for (const value of refs) {
41650				if (value instanceof Ref && groupRefCache.has(value)) {
41651					parsedOrderRefs.put(value);
41652					order.push(value.toString());
41653					continue;
41654				}
41655				const nestedOrder = parseNestedOrder(value, nestedLevels);
41656				if (nestedOrder) {
41657					order.push(nestedOrder);
41658				}
41659			}
41660			if (nestedLevels > 0) {
41661				return order;
41662			}
41663			const hiddenGroups = [];
41664			for (const [groupRef] of groupRefCache.items()) {
41665				if (parsedOrderRefs.has(groupRef)) {
41666					continue;
41667				}
41668				hiddenGroups.push(groupRef.toString());
41669			}
41670			if (hiddenGroups.length) {
41671				order.push({
41672					name: null,
41673					order: hiddenGroups
41674				});
41675			}
41676			return order;
41677		}
41678		function parseNestedOrder(ref, nestedLevels) {
41679			if (++nestedLevels > MAX_NESTED_LEVELS) {
41680				warn("parseNestedOrder - reached MAX_NESTED_LEVELS.");
41681				return null;
41682			}
41683			const value = xref.fetchIfRef(ref);
41684			if (!Array.isArray(value)) {
41685				return null;
41686			}
41687			const nestedName = xref.fetchIfRef(value[0]);
41688			if (typeof nestedName !== "string") {
41689				return null;
41690			}
41691			const nestedOrder = parseOrder(value.slice(1), nestedLevels);
41692			if (!nestedOrder?.length) {
41693				return null;
41694			}
41695			return {
41696				name: stringToPDFString(nestedName),
41697				order: nestedOrder
41698			};
41699		}
41700		function parseRBGroups(rbGroups) {
41701			if (!Array.isArray(rbGroups)) {
41702				return;
41703			}
41704			for (const value of rbGroups) {
41705				const rbGroup = xref.fetchIfRef(value);
41706				if (!Array.isArray(rbGroup) || !rbGroup.length) {
41707					continue;
41708				}
41709				const parsedRbGroup = new Set();
41710				for (const ref of rbGroup) {
41711					if (ref instanceof Ref && groupRefCache.has(ref) && !parsedRbGroup.has(ref.toString())) {
41712						parsedRbGroup.add(ref.toString());
41713						groupRefCache.get(ref).rbGroups.push(parsedRbGroup);
41714					}
41715				}
41716			}
41717		}
41718		const xref = this.xref,
41719			parsedOrderRefs = new RefSet(),
41720			MAX_NESTED_LEVELS = 10;
41721		parseRBGroups(config.get("RBGroups"));
41722		return {
41723			name: typeof config.get("Name") === "string" ? stringToPDFString(config.get("Name")) : null,
41724			creator: typeof config.get("Creator") === "string" ? stringToPDFString(config.get("Creator")) : null,
41725			baseState: config.get("BaseState") instanceof Name ? config.get("BaseState").name : null,
41726			on: parseOnOff(config.get("ON")),
41727			off: parseOnOff(config.get("OFF")),
41728			order: parseOrder(config.get("Order")),
41729			groups: [...groupRefCache]
41730		};
41731	}
41732	setActualNumPages(num = null) {
41733		this._actualNumPages = num;
41734	}
41735	get hasActualNumPages() {
41736		return this._actualNumPages !== null;
41737	}
41738	get _pagesCount() {
41739		const obj = this.toplevelPagesDict.get("Count");
41740		if (!Number.isInteger(obj)) {
41741			throw new FormatError("Page count in top-level pages dictionary is not an integer.");
41742		}
41743		return shadow(this, "_pagesCount", obj);
41744	}
41745	get numPages() {
41746		return this.hasActualNumPages ? this._actualNumPages : this._pagesCount;
41747	}
41748	get destinations() {
41749		const obj = this._readDests(),
41750			dests = Object.create(null);
41751		if (obj instanceof NameTree) {
41752			for (const [key, value] of obj.getAll()) {
41753				const dest = fetchDest(value);
41754				if (dest) {
41755					dests[stringToPDFString(key)] = dest;
41756				}
41757			}
41758		} else if (obj instanceof Dict) {
41759			for (const [key, value] of obj) {
41760				const dest = fetchDest(value);
41761				if (dest) {
41762					dests[key] = dest;
41763				}
41764			}
41765		}
41766		return shadow(this, "destinations", dests);
41767	}
41768	getDestination(id) {
41769		const obj = this._readDests();
41770		if (obj instanceof NameTree) {
41771			const dest = fetchDest(obj.get(id));
41772			if (dest) {
41773				return dest;
41774			}
41775			const allDest = this.destinations[id];
41776			if (allDest) {
41777				warn(`Found "${id}" at an incorrect position in the NameTree.`);
41778				return allDest;
41779			}
41780		} else if (obj instanceof Dict) {
41781			const dest = fetchDest(obj.get(id));
41782			if (dest) {
41783				return dest;
41784			}
41785		}
41786		return null;
41787	}
41788	_readDests() {
41789		const obj = this._catDict.get("Names");
41790		if (obj?.has("Dests")) {
41791			return new NameTree(obj.getRaw("Dests"), this.xref);
41792		} else if (this._catDict.has("Dests")) {
41793			return this._catDict.get("Dests");
41794		}
41795		return undefined;
41796	}
41797	get pageLabels() {
41798		let obj = null;
41799		try {
41800			obj = this._readPageLabels();
41801		} catch (ex) {
41802			if (ex instanceof MissingDataException) {
41803				throw ex;
41804			}
41805			warn("Unable to read page labels.");
41806		}
41807		return shadow(this, "pageLabels", obj);
41808	}
41809	_readPageLabels() {
41810		const obj = this._catDict.getRaw("PageLabels");
41811		if (!obj) {
41812			return null;
41813		}
41814		const pageLabels = new Array(this.numPages);
41815		let style = null,
41816			prefix = "";
41817		const numberTree = new NumberTree(obj, this.xref);
41818		const nums = numberTree.getAll();
41819		let currentLabel = "",
41820			currentIndex = 1;
41821		for (let i = 0, ii = this.numPages; i < ii; i++) {
41822			const labelDict = nums.get(i);
41823			if (labelDict !== undefined) {
41824				if (!(labelDict instanceof Dict)) {
41825					throw new FormatError("PageLabel is not a dictionary.");
41826				}
41827				if (labelDict.has("Type") && !isName(labelDict.get("Type"), "PageLabel")) {
41828					throw new FormatError("Invalid type in PageLabel dictionary.");
41829				}
41830				if (labelDict.has("S")) {
41831					const s = labelDict.get("S");
41832					if (!(s instanceof Name)) {
41833						throw new FormatError("Invalid style in PageLabel dictionary.");
41834					}
41835					style = s.name;
41836				} else {
41837					style = null;
41838				}
41839				if (labelDict.has("P")) {
41840					const p = labelDict.get("P");
41841					if (typeof p !== "string") {
41842						throw new FormatError("Invalid prefix in PageLabel dictionary.");
41843					}
41844					prefix = stringToPDFString(p);
41845				} else {
41846					prefix = "";
41847				}
41848				if (labelDict.has("St")) {
41849					const st = labelDict.get("St");
41850					if (!(Number.isInteger(st) && st >= 1)) {
41851						throw new FormatError("Invalid start in PageLabel dictionary.");
41852					}
41853					currentIndex = st;
41854				} else {
41855					currentIndex = 1;
41856				}
41857			}
41858			switch (style) {
41859				case "D":
41860					currentLabel = currentIndex;
41861					break;
41862				case "R":
41863				case "r":
41864					currentLabel = toRomanNumerals(currentIndex, style === "r");
41865					break;
41866				case "A":
41867				case "a":
41868					const LIMIT = 26;
41869					const A_UPPER_CASE = 0x41,
41870						A_LOWER_CASE = 0x61;
41871					const baseCharCode = style === "a" ? A_LOWER_CASE : A_UPPER_CASE;
41872					const letterIndex = currentIndex - 1;
41873					const character = String.fromCharCode(baseCharCode + letterIndex % LIMIT);
41874					currentLabel = character.repeat(Math.floor(letterIndex / LIMIT) + 1);
41875					break;
41876				default:
41877					if (style) {
41878						throw new FormatError(`Invalid style "${style}" in PageLabel dictionary.`);
41879					}
41880					currentLabel = "";
41881			}
41882			pageLabels[i] = prefix + currentLabel;
41883			currentIndex++;
41884		}
41885		return pageLabels;
41886	}
41887	get pageLayout() {
41888		const obj = this._catDict.get("PageLayout");
41889		let pageLayout = "";
41890		if (obj instanceof Name) {
41891			switch (obj.name) {
41892				case "SinglePage":
41893				case "OneColumn":
41894				case "TwoColumnLeft":
41895				case "TwoColumnRight":
41896				case "TwoPageLeft":
41897				case "TwoPageRight":
41898					pageLayout = obj.name;
41899			}
41900		}
41901		return shadow(this, "pageLayout", pageLayout);
41902	}
41903	get pageMode() {
41904		const obj = this._catDict.get("PageMode");
41905		let pageMode = "UseNone";
41906		if (obj instanceof Name) {
41907			switch (obj.name) {
41908				case "UseNone":
41909				case "UseOutlines":
41910				case "UseThumbs":
41911				case "FullScreen":
41912				case "UseOC":
41913				case "UseAttachments":
41914					pageMode = obj.name;
41915			}
41916		}
41917		return shadow(this, "pageMode", pageMode);
41918	}
41919	get viewerPreferences() {
41920		const obj = this._catDict.get("ViewerPreferences");
41921		if (!(obj instanceof Dict)) {
41922			return shadow(this, "viewerPreferences", null);
41923		}
41924		let prefs = null;
41925		for (const key of obj.getKeys()) {
41926			const value = obj.get(key);
41927			let prefValue;
41928			switch (key) {
41929				case "HideToolbar":
41930				case "HideMenubar":
41931				case "HideWindowUI":
41932				case "FitWindow":
41933				case "CenterWindow":
41934				case "DisplayDocTitle":
41935				case "PickTrayByPDFSize":
41936					if (typeof value === "boolean") {
41937						prefValue = value;
41938					}
41939					break;
41940				case "NonFullScreenPageMode":
41941					if (value instanceof Name) {
41942						switch (value.name) {
41943							case "UseNone":
41944							case "UseOutlines":
41945							case "UseThumbs":
41946							case "UseOC":
41947								prefValue = value.name;
41948								break;
41949							default:
41950								prefValue = "UseNone";
41951						}
41952					}
41953					break;
41954				case "Direction":
41955					if (value instanceof Name) {
41956						switch (value.name) {
41957							case "L2R":
41958							case "R2L":
41959								prefValue = value.name;
41960								break;
41961							default:
41962								prefValue = "L2R";
41963						}
41964					}
41965					break;
41966				case "ViewArea":
41967				case "ViewClip":
41968				case "PrintArea":
41969				case "PrintClip":
41970					if (value instanceof Name) {
41971						switch (value.name) {
41972							case "MediaBox":
41973							case "CropBox":
41974							case "BleedBox":
41975							case "TrimBox":
41976							case "ArtBox":
41977								prefValue = value.name;
41978								break;
41979							default:
41980								prefValue = "CropBox";
41981						}
41982					}
41983					break;
41984				case "PrintScaling":
41985					if (value instanceof Name) {
41986						switch (value.name) {
41987							case "None":
41988							case "AppDefault":
41989								prefValue = value.name;
41990								break;
41991							default:
41992								prefValue = "AppDefault";
41993						}
41994					}
41995					break;
41996				case "Duplex":
41997					if (value instanceof Name) {
41998						switch (value.name) {
41999							case "Simplex":
42000							case "DuplexFlipShortEdge":
42001							case "DuplexFlipLongEdge":
42002								prefValue = value.name;
42003								break;
42004							default:
42005								prefValue = "None";
42006						}
42007					}
42008					break;
42009				case "PrintPageRange":
42010					if (Array.isArray(value) && value.length % 2 === 0) {
42011						const isValid = value.every((page, i, arr) => Number.isInteger(page) && page > 0 && (i === 0 || page >= arr[i - 1]) && page <= this.numPages);
42012						if (isValid) {
42013							prefValue = value;
42014						}
42015					}
42016					break;
42017				case "NumCopies":
42018					if (Number.isInteger(value) && value > 0) {
42019						prefValue = value;
42020					}
42021					break;
42022				default:
42023					warn(`Ignoring non-standard key in ViewerPreferences: ${key}.`);
42024					continue;
42025			}
42026			if (prefValue === undefined) {
42027				warn(`Bad value, for key "${key}", in ViewerPreferences: ${value}.`);
42028				continue;
42029			}
42030			if (!prefs) {
42031				prefs = Object.create(null);
42032			}
42033			prefs[key] = prefValue;
42034		}
42035		return shadow(this, "viewerPreferences", prefs);
42036	}
42037	get openAction() {
42038		const obj = this._catDict.get("OpenAction");
42039		const openAction = Object.create(null);
42040		if (obj instanceof Dict) {
42041			const destDict = new Dict(this.xref);
42042			destDict.set("A", obj);
42043			const resultObj = {
42044				url: null,
42045				dest: null,
42046				action: null
42047			};
42048			Catalog.parseDestDictionary({
42049				destDict,
42050				resultObj
42051			});
42052			if (Array.isArray(resultObj.dest)) {
42053				openAction.dest = resultObj.dest;
42054			} else if (resultObj.action) {
42055				openAction.action = resultObj.action;
42056			}
42057		} else if (Array.isArray(obj)) {
42058			openAction.dest = obj;
42059		}
42060		return shadow(this, "openAction", objectSize(openAction) > 0 ? openAction : null);
42061	}
42062	get attachments() {
42063		const obj = this._catDict.get("Names");
42064		let attachments = null;
42065		if (obj instanceof Dict && obj.has("EmbeddedFiles")) {
42066			const nameTree = new NameTree(obj.getRaw("EmbeddedFiles"), this.xref);
42067			for (const [key, value] of nameTree.getAll()) {
42068				const fs = new FileSpec(value, this.xref);
42069				if (!attachments) {
42070					attachments = Object.create(null);
42071				}
42072				attachments[stringToPDFString(key)] = fs.serializable;
42073			}
42074		}
42075		return shadow(this, "attachments", attachments);
42076	}
42077	get xfaImages() {
42078		const obj = this._catDict.get("Names");
42079		let xfaImages = null;
42080		if (obj instanceof Dict && obj.has("XFAImages")) {
42081			const nameTree = new NameTree(obj.getRaw("XFAImages"), this.xref);
42082			for (const [key, value] of nameTree.getAll()) {
42083				if (!xfaImages) {
42084					xfaImages = new Dict(this.xref);
42085				}
42086				xfaImages.set(stringToPDFString(key), value);
42087			}
42088		}
42089		return shadow(this, "xfaImages", xfaImages);
42090	}
42091	_collectJavaScript() {
42092		const obj = this._catDict.get("Names");
42093		let javaScript = null;
42094		function appendIfJavaScriptDict(name, jsDict) {
42095			if (!(jsDict instanceof Dict)) {
42096				return;
42097			}
42098			if (!isName(jsDict.get("S"), "JavaScript")) {
42099				return;
42100			}
42101			let js = jsDict.get("JS");
42102			if (js instanceof BaseStream) {
42103				js = js.getString();
42104			} else if (typeof js !== "string") {
42105				return;
42106			}
42107			js = stringToPDFString(js).replaceAll("\x00", "");
42108			if (js) {
42109				(javaScript ||= new Map()).set(name, js);
42110			}
42111		}
42112		if (obj instanceof Dict && obj.has("JavaScript")) {
42113			const nameTree = new NameTree(obj.getRaw("JavaScript"), this.xref);
42114			for (const [key, value] of nameTree.getAll()) {
42115				appendIfJavaScriptDict(stringToPDFString(key), value);
42116			}
42117		}
42118		const openAction = this._catDict.get("OpenAction");
42119		if (openAction) {
42120			appendIfJavaScriptDict("OpenAction", openAction);
42121		}
42122		return javaScript;
42123	}
42124	get jsActions() {
42125		const javaScript = this._collectJavaScript();
42126		let actions = collectActions(this.xref, this._catDict, DocumentActionEventType);
42127		if (javaScript) {
42128			actions ||= Object.create(null);
42129			for (const [key, val] of javaScript) {
42130				if (key in actions) {
42131					actions[key].push(val);
42132				} else {
42133					actions[key] = [val];
42134				}
42135			}
42136		}
42137		return shadow(this, "jsActions", actions);
42138	}
42139	async fontFallback(id, handler) {
42140		const translatedFonts = await Promise.all(this.fontCache);
42141		for (const translatedFont of translatedFonts) {
42142			if (translatedFont.loadedName === id) {
42143				translatedFont.fallback(handler);
42144				return;
42145			}
42146		}
42147	}
42148	async cleanup(manuallyTriggered = false) {
42149		clearGlobalCaches();
42150		this.globalImageCache.clear(manuallyTriggered);
42151		this.pageKidsCountCache.clear();
42152		this.pageIndexCache.clear();
42153		this.pageDictCache.clear();
42154		this.nonBlendModesSet.clear();
42155		const translatedFonts = await Promise.all(this.fontCache);
42156		for (const {
42157			dict
42158		} of translatedFonts) {
42159			delete dict.cacheKey;
42160		}
42161		this.fontCache.clear();
42162		this.builtInCMapCache.clear();
42163		this.standardFontDataCache.clear();
42164		this.systemFontCache.clear();
42165	}
42166	async getPageDict(pageIndex) {
42167		const nodesToVisit = [this.toplevelPagesDict];
42168		const visitedNodes = new RefSet();
42169		const pagesRef = this._catDict.getRaw("Pages");
42170		if (pagesRef instanceof Ref) {
42171			visitedNodes.put(pagesRef);
42172		}
42173		const xref = this.xref,
42174			pageKidsCountCache = this.pageKidsCountCache,
42175			pageIndexCache = this.pageIndexCache,
42176			pageDictCache = this.pageDictCache;
42177		let currentPageIndex = 0;
42178		while (nodesToVisit.length) {
42179			const currentNode = nodesToVisit.pop();
42180			if (currentNode instanceof Ref) {
42181				const count = pageKidsCountCache.get(currentNode);
42182				if (count >= 0 && currentPageIndex + count <= pageIndex) {
42183					currentPageIndex += count;
42184					continue;
42185				}
42186				if (visitedNodes.has(currentNode)) {
42187					throw new FormatError("Pages tree contains circular reference.");
42188				}
42189				visitedNodes.put(currentNode);
42190				const obj = await (pageDictCache.get(currentNode) || xref.fetchAsync(currentNode));
42191				if (obj instanceof Dict) {
42192					let type = obj.getRaw("Type");
42193					if (type instanceof Ref) {
42194						type = await xref.fetchAsync(type);
42195					}
42196					if (isName(type, "Page") || !obj.has("Kids")) {
42197						if (!pageKidsCountCache.has(currentNode)) {
42198							pageKidsCountCache.put(currentNode, 1);
42199						}
42200						if (!pageIndexCache.has(currentNode)) {
42201							pageIndexCache.put(currentNode, currentPageIndex);
42202						}
42203						if (currentPageIndex === pageIndex) {
42204							return [obj, currentNode];
42205						}
42206						currentPageIndex++;
42207						continue;
42208					}
42209				}
42210				nodesToVisit.push(obj);
42211				continue;
42212			}
42213			if (!(currentNode instanceof Dict)) {
42214				throw new FormatError("Page dictionary kid reference points to wrong type of object.");
42215			}
42216			const {
42217				objId
42218			} = currentNode;
42219			let count = currentNode.getRaw("Count");
42220			if (count instanceof Ref) {
42221				count = await xref.fetchAsync(count);
42222			}
42223			if (Number.isInteger(count) && count >= 0) {
42224				if (objId && !pageKidsCountCache.has(objId)) {
42225					pageKidsCountCache.put(objId, count);
42226				}
42227				if (currentPageIndex + count <= pageIndex) {
42228					currentPageIndex += count;
42229					continue;
42230				}
42231			}
42232			let kids = currentNode.getRaw("Kids");
42233			if (kids instanceof Ref) {
42234				kids = await xref.fetchAsync(kids);
42235			}
42236			if (!Array.isArray(kids)) {
42237				let type = currentNode.getRaw("Type");
42238				if (type instanceof Ref) {
42239					type = await xref.fetchAsync(type);
42240				}
42241				if (isName(type, "Page") || !currentNode.has("Kids")) {
42242					if (currentPageIndex === pageIndex) {
42243						return [currentNode, null];
42244					}
42245					currentPageIndex++;
42246					continue;
42247				}
42248				throw new FormatError("Page dictionary kids object is not an array.");
42249			}
42250			for (let last = kids.length - 1; last >= 0; last--) {
42251				const lastKid = kids[last];
42252				nodesToVisit.push(lastKid);
42253				if (currentNode === this.toplevelPagesDict && lastKid instanceof Ref && !pageDictCache.has(lastKid)) {
42254					pageDictCache.put(lastKid, xref.fetchAsync(lastKid));
42255				}
42256			}
42257		}
42258		throw new Error(`Page index ${pageIndex} not found.`);
42259	}
vendor: 1,484 bytes, lines 42260-42315
42260	async getAllPageDicts(recoveryMode = false) {
42261		const {
42262			ignoreErrors
42263		} = this.pdfManager.evaluatorOptions;
42264		const queue = [{
42265			currentNode: this.toplevelPagesDict,
42266			posInKids: 0
42267		}];
42268		const visitedNodes = new RefSet();
42269		const pagesRef = this._catDict.getRaw("Pages");
42270		if (pagesRef instanceof Ref) {
42271			visitedNodes.put(pagesRef);
42272		}
42273		const map = new Map(),
42274			xref = this.xref,
42275			pageIndexCache = this.pageIndexCache;
42276		let pageIndex = 0;
42277		function addPageDict(pageDict, pageRef) {
42278			if (pageRef && !pageIndexCache.has(pageRef)) {
42279				pageIndexCache.put(pageRef, pageIndex);
42280			}
42281			map.set(pageIndex++, [pageDict, pageRef]);
42282		}
42283		function addPageError(error) {
42284			if (error instanceof XRefEntryException && !recoveryMode) {
42285				throw error;
42286			}
42287			if (recoveryMode && ignoreErrors && pageIndex === 0) {
42288				warn(`getAllPageDicts - Skipping invalid first page: "${error}".`);
42289				error = Dict.empty;
42290			}
42291			map.set(pageIndex++, [error, null]);
42292		}
42293		while (queue.length > 0) {
42294			const queueItem = queue.at(-1);
42295			const {
42296				currentNode,
42297				posInKids
42298			} = queueItem;
42299			let kids = currentNode.getRaw("Kids");
42300			if (kids instanceof Ref) {
42301				try {
42302					kids = await xref.fetchAsync(kids);
42303				} catch (ex) {
42304					addPageError(ex);
42305					break;
42306				}
42307			}
42308			if (!Array.isArray(kids)) {
42309				addPageError(new FormatError("Page dictionary kids object is not an array."));
42310				break;
42311			}
42312			if (posInKids >= kids.length) {
42313				queue.pop();
42314				continue;
42315			}
vendor: 26,492 bytes, lines 42316-43390
42316			const kidObj = kids[posInKids];
42317			let obj;
42318			if (kidObj instanceof Ref) {
42319				if (visitedNodes.has(kidObj)) {
42320					addPageError(new FormatError("Pages tree contains circular reference."));
42321					break;
42322				}
42323				visitedNodes.put(kidObj);
42324				try {
42325					obj = await xref.fetchAsync(kidObj);
42326				} catch (ex) {
42327					addPageError(ex);
42328					break;
42329				}
42330			} else {
42331				obj = kidObj;
42332			}
42333			if (!(obj instanceof Dict)) {
42334				addPageError(new FormatError("Page dictionary kid reference points to wrong type of object."));
42335				break;
42336			}
42337			let type = obj.getRaw("Type");
42338			if (type instanceof Ref) {
42339				try {
42340					type = await xref.fetchAsync(type);
42341				} catch (ex) {
42342					addPageError(ex);
42343					break;
42344				}
42345			}
42346			if (isName(type, "Page") || !obj.has("Kids")) {
42347				addPageDict(obj, kidObj instanceof Ref ? kidObj : null);
42348			} else {
42349				queue.push({
42350					currentNode: obj,
42351					posInKids: 0
42352				});
42353			}
42354			queueItem.posInKids++;
42355		}
42356		return map;
42357	}
42358	getPageIndex(pageRef) {
42359		const cachedPageIndex = this.pageIndexCache.get(pageRef);
42360		if (cachedPageIndex !== undefined) {
42361			return Promise.resolve(cachedPageIndex);
42362		}
42363		const xref = this.xref;
42364		function pagesBeforeRef(kidRef) {
42365			let total = 0,
42366				parentRef;
42367			return xref.fetchAsync(kidRef).then(function (node) {
42368				if (isRefsEqual(kidRef, pageRef) && !isDict(node, "Page") && !(node instanceof Dict && !node.has("Type") && node.has("Contents"))) {
42369					throw new FormatError("The reference does not point to a /Page dictionary.");
42370				}
42371				if (!node) {
42372					return null;
42373				}
42374				if (!(node instanceof Dict)) {
42375					throw new FormatError("Node must be a dictionary.");
42376				}
42377				parentRef = node.getRaw("Parent");
42378				return node.getAsync("Parent");
42379			}).then(function (parent) {
42380				if (!parent) {
42381					return null;
42382				}
42383				if (!(parent instanceof Dict)) {
42384					throw new FormatError("Parent must be a dictionary.");
42385				}
42386				return parent.getAsync("Kids");
42387			}).then(function (kids) {
42388				if (!kids) {
42389					return null;
42390				}
42391				const kidPromises = [];
42392				let found = false;
42393				for (const kid of kids) {
42394					if (!(kid instanceof Ref)) {
42395						throw new FormatError("Kid must be a reference.");
42396					}
42397					if (isRefsEqual(kid, kidRef)) {
42398						found = true;
42399						break;
42400					}
42401					kidPromises.push(xref.fetchAsync(kid).then(function (obj) {
42402						if (!(obj instanceof Dict)) {
42403							throw new FormatError("Kid node must be a dictionary.");
42404						}
42405						if (obj.has("Count")) {
42406							total += obj.get("Count");
42407						} else {
42408							total++;
42409						}
42410					}));
42411				}
42412				if (!found) {
42413					throw new FormatError("Kid reference not found in parent's kids.");
42414				}
42415				return Promise.all(kidPromises).then(function () {
42416					return [total, parentRef];
42417				});
42418			});
42419		}
42420		let total = 0;
42421		const next = ref => pagesBeforeRef(ref).then(args => {
42422			if (!args) {
42423				this.pageIndexCache.put(pageRef, total);
42424				return total;
42425			}
42426			const [count, parentRef] = args;
42427			total += count;
42428			return next(parentRef);
42429		});
42430		return next(pageRef);
42431	}
42432	get baseUrl() {
42433		const uri = this._catDict.get("URI");
42434		if (uri instanceof Dict) {
42435			const base = uri.get("Base");
42436			if (typeof base === "string") {
42437				const absoluteUrl = createValidAbsoluteUrl(base, null, {
42438					tryConvertEncoding: true
42439				});
42440				if (absoluteUrl) {
42441					return shadow(this, "baseUrl", absoluteUrl.href);
42442				}
42443			}
42444		}
42445		return shadow(this, "baseUrl", this.pdfManager.docBaseUrl);
42446	}
42447	static parseDestDictionary({
42448		destDict,
42449		resultObj,
42450		docBaseUrl = null,
42451		docAttachments = null
42452	}) {
42453		if (!(destDict instanceof Dict)) {
42454			warn("parseDestDictionary: `destDict` must be a dictionary.");
42455			return;
42456		}
42457		let action = destDict.get("A"),
42458			url,
42459			dest;
42460		if (!(action instanceof Dict)) {
42461			if (destDict.has("Dest")) {
42462				action = destDict.get("Dest");
42463			} else {
42464				action = destDict.get("AA");
42465				if (action instanceof Dict) {
42466					if (action.has("D")) {
42467						action = action.get("D");
42468					} else if (action.has("U")) {
42469						action = action.get("U");
42470					}
42471				}
42472			}
42473		}
42474		if (action instanceof Dict) {
42475			const actionType = action.get("S");
42476			if (!(actionType instanceof Name)) {
42477				warn("parseDestDictionary: Invalid type in Action dictionary.");
42478				return;
42479			}
42480			const actionName = actionType.name;
42481			switch (actionName) {
42482				case "ResetForm":
42483					const flags = action.get("Flags");
42484					const include = ((typeof flags === "number" ? flags : 0) & 1) === 0;
42485					const fields = [];
42486					const refs = [];
42487					for (const obj of action.get("Fields") || []) {
42488						if (obj instanceof Ref) {
42489							refs.push(obj.toString());
42490						} else if (typeof obj === "string") {
42491							fields.push(stringToPDFString(obj));
42492						}
42493					}
42494					resultObj.resetForm = {
42495						fields,
42496						refs,
42497						include
42498					};
42499					break;
42500				case "URI":
42501					url = action.get("URI");
42502					if (url instanceof Name) {
42503						url = "/" + url.name;
42504					}
42505					break;
42506				case "GoTo":
42507					dest = action.get("D");
42508					break;
42509				case "Launch":
42510				case "GoToR":
42511					const urlDict = action.get("F");
42512					if (urlDict instanceof Dict) {
42513						const fs = new FileSpec(urlDict, null, true);
42514						const {
42515							rawFilename
42516						} = fs.serializable;
42517						url = rawFilename;
42518					} else if (typeof urlDict === "string") {
42519						url = urlDict;
42520					}
42521					const remoteDest = fetchRemoteDest(action);
42522					if (remoteDest && typeof url === "string") {
42523						url = url.split("#", 1)[0] + "#" + remoteDest;
42524					}
42525					const newWindow = action.get("NewWindow");
42526					if (typeof newWindow === "boolean") {
42527						resultObj.newWindow = newWindow;
42528					}
42529					break;
42530				case "GoToE":
42531					const target = action.get("T");
42532					let attachment;
42533					if (docAttachments && target instanceof Dict) {
42534						const relationship = target.get("R");
42535						const name = target.get("N");
42536						if (isName(relationship, "C") && typeof name === "string") {
42537							attachment = docAttachments[stringToPDFString(name)];
42538						}
42539					}
42540					if (attachment) {
42541						resultObj.attachment = attachment;
42542						const attachmentDest = fetchRemoteDest(action);
42543						if (attachmentDest) {
42544							resultObj.attachmentDest = attachmentDest;
42545						}
42546					} else {
42547						warn(`parseDestDictionary - unimplemented "GoToE" action.`);
42548					}
42549					break;
42550				case "Named":
42551					const namedAction = action.get("N");
42552					if (namedAction instanceof Name) {
42553						resultObj.action = namedAction.name;
42554					}
42555					break;
42556				case "SetOCGState":
42557					const state = action.get("State");
42558					const preserveRB = action.get("PreserveRB");
42559					if (!Array.isArray(state) || state.length === 0) {
42560						break;
42561					}
42562					const stateArr = [];
42563					for (const elem of state) {
42564						if (elem instanceof Name) {
42565							switch (elem.name) {
42566								case "ON":
42567								case "OFF":
42568								case "Toggle":
42569									stateArr.push(elem.name);
42570									break;
42571							}
42572						} else if (elem instanceof Ref) {
42573							stateArr.push(elem.toString());
42574						}
42575					}
42576					if (stateArr.length !== state.length) {
42577						break;
42578					}
42579					resultObj.setOCGState = {
42580						state: stateArr,
42581						preserveRB: typeof preserveRB === "boolean" ? preserveRB : true
42582					};
42583					break;
42584				case "JavaScript":
42585					const jsAction = action.get("JS");
42586					let js;
42587					if (jsAction instanceof BaseStream) {
42588						js = jsAction.getString();
42589					} else if (typeof jsAction === "string") {
42590						js = jsAction;
42591					}
42592					const jsURL = js && recoverJsURL(stringToPDFString(js));
42593					if (jsURL) {
42594						url = jsURL.url;
42595						resultObj.newWindow = jsURL.newWindow;
42596						break;
42597					}
42598				default:
42599					if (actionName === "JavaScript" || actionName === "SubmitForm") {
42600						break;
42601					}
42602					warn(`parseDestDictionary - unsupported action: "${actionName}".`);
42603					break;
42604			}
42605		} else if (destDict.has("Dest")) {
42606			dest = destDict.get("Dest");
42607		}
42608		if (typeof url === "string") {
42609			const absoluteUrl = createValidAbsoluteUrl(url, docBaseUrl, {
42610				addDefaultProtocol: true,
42611				tryConvertEncoding: true
42612			});
42613			if (absoluteUrl) {
42614				resultObj.url = absoluteUrl.href;
42615			}
42616			resultObj.unsafeUrl = url;
42617		}
42618		if (dest) {
42619			if (dest instanceof Name) {
42620				dest = dest.name;
42621			}
42622			if (typeof dest === "string") {
42623				resultObj.dest = stringToPDFString(dest);
42624			} else if (isValidExplicitDest(dest)) {
42625				resultObj.dest = dest;
42626			}
42627		}
42628	}
42629}
42630
42631;// ./src/core/object_loader.js
42632
42633
42634
42635
42636
42637function mayHaveChildren(value) {
42638	return value instanceof Ref || value instanceof Dict || value instanceof BaseStream || Array.isArray(value);
42639}
42640function addChildren(node, nodesToVisit) {
42641	if (node instanceof Dict) {
42642		node = node.getRawValues();
42643	} else if (node instanceof BaseStream) {
42644		node = node.dict.getRawValues();
42645	} else if (!Array.isArray(node)) {
42646		return;
42647	}
42648	for (const rawValue of node) {
42649		if (mayHaveChildren(rawValue)) {
42650			nodesToVisit.push(rawValue);
42651		}
42652	}
42653}
42654class ObjectLoader {
42655	constructor(dict, keys, xref) {
42656		this.dict = dict;
42657		this.keys = keys;
42658		this.xref = xref;
42659		this.refSet = null;
42660	}
42661	async load() {
42662		if (this.xref.stream.isDataLoaded) {
42663			return undefined;
42664		}
42665		const {
42666			keys,
42667			dict
42668		} = this;
42669		this.refSet = new RefSet();
42670		const nodesToVisit = [];
42671		for (const key of keys) {
42672			const rawValue = dict.getRaw(key);
42673			if (rawValue !== undefined) {
42674				nodesToVisit.push(rawValue);
42675			}
42676		}
42677		return this._walk(nodesToVisit);
42678	}
42679	async _walk(nodesToVisit) {
42680		const nodesToRevisit = [];
42681		const pendingRequests = [];
42682		while (nodesToVisit.length) {
42683			let currentNode = nodesToVisit.pop();
42684			if (currentNode instanceof Ref) {
42685				if (this.refSet.has(currentNode)) {
42686					continue;
42687				}
42688				try {
42689					this.refSet.put(currentNode);
42690					currentNode = this.xref.fetch(currentNode);
42691				} catch (ex) {
42692					if (!(ex instanceof MissingDataException)) {
42693						warn(`ObjectLoader._walk - requesting all data: "${ex}".`);
42694						this.refSet = null;
42695						const {
42696							manager
42697						} = this.xref.stream;
42698						return manager.requestAllChunks();
42699					}
42700					nodesToRevisit.push(currentNode);
42701					pendingRequests.push({
42702						begin: ex.begin,
42703						end: ex.end
42704					});
42705				}
42706			}
42707			if (currentNode instanceof BaseStream) {
42708				const baseStreams = currentNode.getBaseStreams();
42709				if (baseStreams) {
42710					let foundMissingData = false;
42711					for (const stream of baseStreams) {
42712						if (stream.isDataLoaded) {
42713							continue;
42714						}
42715						foundMissingData = true;
42716						pendingRequests.push({
42717							begin: stream.start,
42718							end: stream.end
42719						});
42720					}
42721					if (foundMissingData) {
42722						nodesToRevisit.push(currentNode);
42723					}
42724				}
42725			}
42726			addChildren(currentNode, nodesToVisit);
42727		}
42728		if (pendingRequests.length) {
42729			await this.xref.stream.manager.requestRanges(pendingRequests);
42730			for (const node of nodesToRevisit) {
42731				if (node instanceof Ref) {
42732					this.refSet.remove(node);
42733				}
42734			}
42735			return this._walk(nodesToRevisit);
42736		}
42737		this.refSet = null;
42738		return undefined;
42739	}
42740}
42741
42742;// ./src/core/xfa/symbol_utils.js
42743const $acceptWhitespace = Symbol();
42744const $addHTML = Symbol();
42745const $appendChild = Symbol();
42746const $childrenToHTML = Symbol();
42747const $clean = Symbol();
42748const $cleanPage = Symbol();
42749const $cleanup = Symbol();
42750const $clone = Symbol();
42751const $consumed = Symbol();
42752const $content = Symbol("content");
42753const $data = Symbol("data");
42754const $dump = Symbol();
42755const $extra = Symbol("extra");
42756const $finalize = Symbol();
42757const $flushHTML = Symbol();
42758const $getAttributeIt = Symbol();
42759const $getAttributes = Symbol();
42760const $getAvailableSpace = Symbol();
42761const $getChildrenByClass = Symbol();
42762const $getChildrenByName = Symbol();
42763const $getChildrenByNameIt = Symbol();
42764const $getDataValue = Symbol();
42765const $getExtra = Symbol();
42766const $getRealChildrenByNameIt = Symbol();
42767const $getChildren = Symbol();
42768const $getContainedChildren = Symbol();
42769const $getNextPage = Symbol();
42770const $getSubformParent = Symbol();
42771const $getParent = Symbol();
42772const $getTemplateRoot = Symbol();
42773const $globalData = Symbol();
42774const $hasSettableValue = Symbol();
42775const $ids = Symbol();
42776const $indexOf = Symbol();
42777const $insertAt = Symbol();
42778const $isCDATAXml = Symbol();
42779const $isBindable = Symbol();
42780const $isDataValue = Symbol();
42781const $isDescendent = Symbol();
42782const $isNsAgnostic = Symbol();
42783const $isSplittable = Symbol();
42784const $isThereMoreWidth = Symbol();
42785const $isTransparent = Symbol();
42786const $isUsable = Symbol();
42787const $lastAttribute = Symbol();
42788const $namespaceId = Symbol("namespaceId");
42789const $nodeName = Symbol("nodeName");
42790const $nsAttributes = Symbol();
42791const $onChild = Symbol();
42792const $onChildCheck = Symbol();
42793const $onText = Symbol();
42794const $pushGlyphs = Symbol();
42795const $popPara = Symbol();
42796const $pushPara = Symbol();
42797const $removeChild = Symbol();
42798const $root = Symbol("root");
42799const $resolvePrototypes = Symbol();
42800const $searchNode = Symbol();
42801const $setId = Symbol();
42802const $setSetAttributes = Symbol();
42803const $setValue = Symbol();
42804const $tabIndex = Symbol();
42805const $text = Symbol();
42806const $toPages = Symbol();
42807const $toHTML = Symbol();
42808const $toString = Symbol();
42809const $toStyle = Symbol();
42810const $uid = Symbol("uid");
42811
42812;// ./src/core/xfa/namespaces.js
42813const $buildXFAObject = Symbol();
42814const NamespaceIds = {
42815	config: {
42816		id: 0,
42817		check: ns => ns.startsWith("http://www.xfa.org/schema/xci/")
42818	},
42819	connectionSet: {
42820		id: 1,
42821		check: ns => ns.startsWith("http://www.xfa.org/schema/xfa-connection-set/")
42822	},
42823	datasets: {
42824		id: 2,
42825		check: ns => ns.startsWith("http://www.xfa.org/schema/xfa-data/")
42826	},
42827	form: {
42828		id: 3,
42829		check: ns => ns.startsWith("http://www.xfa.org/schema/xfa-form/")
42830	},
42831	localeSet: {
42832		id: 4,
42833		check: ns => ns.startsWith("http://www.xfa.org/schema/xfa-locale-set/")
42834	},
42835	pdf: {
42836		id: 5,
42837		check: ns => ns === "http://ns.adobe.com/xdp/pdf/"
42838	},
42839	signature: {
42840		id: 6,
42841		check: ns => ns === "http://www.w3.org/2000/09/xmldsig#"
42842	},
42843	sourceSet: {
42844		id: 7,
42845		check: ns => ns.startsWith("http://www.xfa.org/schema/xfa-source-set/")
42846	},
42847	stylesheet: {
42848		id: 8,
42849		check: ns => ns === "http://www.w3.org/1999/XSL/Transform"
42850	},
42851	template: {
42852		id: 9,
42853		check: ns => ns.startsWith("http://www.xfa.org/schema/xfa-template/")
42854	},
42855	xdc: {
42856		id: 10,
42857		check: ns => ns.startsWith("http://www.xfa.org/schema/xdc/")
42858	},
42859	xdp: {
42860		id: 11,
42861		check: ns => ns === "http://ns.adobe.com/xdp/"
42862	},
42863	xfdf: {
42864		id: 12,
42865		check: ns => ns === "http://ns.adobe.com/xfdf/"
42866	},
42867	xhtml: {
42868		id: 13,
42869		check: ns => ns === "http://www.w3.org/1999/xhtml"
42870	},
42871	xmpmeta: {
42872		id: 14,
42873		check: ns => ns === "http://ns.adobe.com/xmpmeta/"
42874	}
42875};
42876
42877;// ./src/core/xfa/utils.js
42878
42879
42880
42881
42882
42883const dimConverters = {
42884	pt: x => x,
42885	cm: x => x / 2.54 * 72,
42886	mm: x => x / (10 * 2.54) * 72,
42887	in: x => x * 72,
42888	px: x => x
42889};
42890const measurementPattern = /([+-]?\d+\.?\d*)(.*)/;
42891function stripQuotes(str) {
42892	if (str.startsWith("'") || str.startsWith('"')) {
42893		return str.slice(1, -1);
42894	}
42895	return str;
42896}
42897function getInteger({
42898	data,
42899	defaultValue,
42900	validate
42901}) {
42902	if (!data) {
42903		return defaultValue;
42904	}
42905	data = data.trim();
42906	const n = parseInt(data, 10);
42907	if (!isNaN(n) && validate(n)) {
42908		return n;
42909	}
42910	return defaultValue;
42911}
42912function getFloat({
42913	data,
42914	defaultValue,
42915	validate
42916}) {
42917	if (!data) {
42918		return defaultValue;
42919	}
42920	data = data.trim();
42921	const n = parseFloat(data);
42922	if (!isNaN(n) && validate(n)) {
42923		return n;
42924	}
42925	return defaultValue;
42926}
42927function getKeyword({
42928	data,
42929	defaultValue,
42930	validate
42931}) {
42932	if (!data) {
42933		return defaultValue;
42934	}
42935	data = data.trim();
42936	if (validate(data)) {
42937		return data;
42938	}
42939	return defaultValue;
42940}
42941function getStringOption(data, options) {
42942	return getKeyword({
42943		data,
42944		defaultValue: options[0],
42945		validate: k => options.includes(k)
42946	});
42947}
42948function getMeasurement(str, def = "0") {
42949	def ||= "0";
42950	if (!str) {
42951		return getMeasurement(def);
42952	}
42953	const match = str.trim().match(measurementPattern);
42954	if (!match) {
42955		return getMeasurement(def);
42956	}
42957	const [, valueStr, unit] = match;
42958	const value = parseFloat(valueStr);
42959	if (isNaN(value)) {
42960		return getMeasurement(def);
42961	}
42962	if (value === 0) {
42963		return 0;
42964	}
42965	const conv = dimConverters[unit];
42966	if (conv) {
42967		return conv(value);
42968	}
42969	return value;
42970}
42971function getRatio(data) {
42972	if (!data) {
42973		return {
42974			num: 1,
42975			den: 1
42976		};
42977	}
42978	const ratio = data.trim().split(/\s*:\s*/).map(x => parseFloat(x)).filter(x => !isNaN(x));
42979	if (ratio.length === 1) {
42980		ratio.push(1);
42981	}
42982	if (ratio.length === 0) {
42983		return {
42984			num: 1,
42985			den: 1
42986		};
42987	}
42988	const [num, den] = ratio;
42989	return {
42990		num,
42991		den
42992	};
42993}
42994function getRelevant(data) {
42995	if (!data) {
42996		return [];
42997	}
42998	return data.trim().split(/\s+/).map(e => ({
42999		excluded: e[0] === "-",
43000		viewname: e.substring(1)
43001	}));
43002}
43003function getColor(data, def = [0, 0, 0]) {
43004	let [r, g, b] = def;
43005	if (!data) {
43006		return {
43007			r,
43008			g,
43009			b
43010		};
43011	}
43012	const color = data.trim().split(/\s*,\s*/).map(c => Math.min(Math.max(0, parseInt(c.trim(), 10)), 255)).map(c => isNaN(c) ? 0 : c);
43013	if (color.length < 3) {
43014		return {
43015			r,
43016			g,
43017			b
43018		};
43019	}
43020	[r, g, b] = color;
43021	return {
43022		r,
43023		g,
43024		b
43025	};
43026}
43027function getBBox(data) {
43028	const def = -1;
43029	if (!data) {
43030		return {
43031			x: def,
43032			y: def,
43033			width: def,
43034			height: def
43035		};
43036	}
43037	const bbox = data.trim().split(/\s*,\s*/).map(m => getMeasurement(m, "-1"));
43038	if (bbox.length < 4 || bbox[2] < 0 || bbox[3] < 0) {
43039		return {
43040			x: def,
43041			y: def,
43042			width: def,
43043			height: def
43044		};
43045	}
43046	const [x, y, width, height] = bbox;
43047	return {
43048		x,
43049		y,
43050		width,
43051		height
43052	};
43053}
43054class HTMLResult {
43055	static get FAILURE() {
43056		return shadow(this, "FAILURE", new HTMLResult(false, null, null, null));
43057	}
43058	static get EMPTY() {
43059		return shadow(this, "EMPTY", new HTMLResult(true, null, null, null));
43060	}
43061	constructor(success, html, bbox, breakNode) {
43062		this.success = success;
43063		this.html = html;
43064		this.bbox = bbox;
43065		this.breakNode = breakNode;
43066	}
43067	isBreak() {
43068		return !!this.breakNode;
43069	}
43070	static breakNode(node) {
43071		return new HTMLResult(false, null, null, node);
43072	}
43073	static success(html, bbox = null) {
43074		return new HTMLResult(true, html, bbox, null);
43075	}
43076}
43077
43078;// ./src/core/xfa/fonts.js
43079
43080
43081
43082
43083
43084
43085
43086
43087
43088
43089
43090
43091
43092class FontFinder {
43093	constructor(pdfFonts) {
43094		this.fonts = new Map();
43095		this.cache = new Map();
43096		this.warned = new Set();
43097		this.defaultFont = null;
43098		this.add(pdfFonts);
43099	}
43100	add(pdfFonts, reallyMissingFonts = null) {
43101		for (const pdfFont of pdfFonts) {
43102			this.addPdfFont(pdfFont);
43103		}
43104		for (const pdfFont of this.fonts.values()) {
43105			if (!pdfFont.regular) {
43106				pdfFont.regular = pdfFont.italic || pdfFont.bold || pdfFont.bolditalic;
43107			}
43108		}
43109		if (!reallyMissingFonts || reallyMissingFonts.size === 0) {
43110			return;
43111		}
43112		const myriad = this.fonts.get("PdfJS-Fallback-PdfJS-XFA");
43113		for (const missing of reallyMissingFonts) {
43114			this.fonts.set(missing, myriad);
43115		}
43116	}
43117	addPdfFont(pdfFont) {
43118		const cssFontInfo = pdfFont.cssFontInfo;
43119		const name = cssFontInfo.fontFamily;
43120		let font = this.fonts.get(name);
43121		if (!font) {
43122			font = Object.create(null);
43123			this.fonts.set(name, font);
43124			if (!this.defaultFont) {
43125				this.defaultFont = font;
43126			}
43127		}
43128		let property = "";
43129		const fontWeight = parseFloat(cssFontInfo.fontWeight);
43130		if (parseFloat(cssFontInfo.italicAngle) !== 0) {
43131			property = fontWeight >= 700 ? "bolditalic" : "italic";
43132		} else if (fontWeight >= 700) {
43133			property = "bold";
43134		}
43135		if (!property) {
43136			if (pdfFont.name.includes("Bold") || pdfFont.psName?.includes("Bold")) {
43137				property = "bold";
43138			}
43139			if (pdfFont.name.includes("Italic") || pdfFont.name.endsWith("It") || pdfFont.psName?.includes("Italic") || pdfFont.psName?.endsWith("It")) {
43140				property += "italic";
43141			}
43142		}
43143		if (!property) {
43144			property = "regular";
43145		}
43146		font[property] = pdfFont;
43147	}
43148	getDefault() {
43149		return this.defaultFont;
43150	}
43151	find(fontName, mustWarn = true) {
43152		let font = this.fonts.get(fontName) || this.cache.get(fontName);
43153		if (font) {
43154			return font;
43155		}
43156		const pattern = /,|-|_| |bolditalic|bold|italic|regular|it/gi;
43157		let name = fontName.replaceAll(pattern, "");
43158		font = this.fonts.get(name);
43159		if (font) {
43160			this.cache.set(fontName, font);
43161			return font;
43162		}
43163		name = name.toLowerCase();
43164		const maybe = [];
43165		for (const [family, pdfFont] of this.fonts.entries()) {
43166			if (family.replaceAll(pattern, "").toLowerCase().startsWith(name)) {
43167				maybe.push(pdfFont);
43168			}
43169		}
43170		if (maybe.length === 0) {
43171			for (const [, pdfFont] of this.fonts.entries()) {
43172				if (pdfFont.regular.name?.replaceAll(pattern, "").toLowerCase().startsWith(name)) {
43173					maybe.push(pdfFont);
43174				}
43175			}
43176		}
43177		if (maybe.length === 0) {
43178			name = name.replaceAll(/psmt|mt/gi, "");
43179			for (const [family, pdfFont] of this.fonts.entries()) {
43180				if (family.replaceAll(pattern, "").toLowerCase().startsWith(name)) {
43181					maybe.push(pdfFont);
43182				}
43183			}
43184		}
43185		if (maybe.length === 0) {
43186			for (const pdfFont of this.fonts.values()) {
43187				if (pdfFont.regular.name?.replaceAll(pattern, "").toLowerCase().startsWith(name)) {
43188					maybe.push(pdfFont);
43189				}
43190			}
43191		}
43192		if (maybe.length >= 1) {
43193			if (maybe.length !== 1 && mustWarn) {
43194				warn(`XFA - Too many choices to guess the correct font: ${fontName}`);
43195			}
43196			this.cache.set(fontName, maybe[0]);
43197			return maybe[0];
43198		}
43199		if (mustWarn && !this.warned.has(fontName)) {
43200			this.warned.add(fontName);
43201			warn(`XFA - Cannot find the font: ${fontName}`);
43202		}
43203		return null;
43204	}
43205}
43206function selectFont(xfaFont, typeface) {
43207	if (xfaFont.posture === "italic") {
43208		if (xfaFont.weight === "bold") {
43209			return typeface.bolditalic;
43210		}
43211		return typeface.italic;
43212	} else if (xfaFont.weight === "bold") {
43213		return typeface.bold;
43214	}
43215	return typeface.regular;
43216}
43217function fonts_getMetrics(xfaFont, real = false) {
43218	let pdfFont = null;
43219	if (xfaFont) {
43220		const name = stripQuotes(xfaFont.typeface);
43221		const typeface = xfaFont[$globalData].fontFinder.find(name);
43222		pdfFont = selectFont(xfaFont, typeface);
43223	}
43224	if (!pdfFont) {
43225		return {
43226			lineHeight: 12,
43227			lineGap: 2,
43228			lineNoGap: 10
43229		};
43230	}
43231	const size = xfaFont.size || 10;
43232	const lineHeight = pdfFont.lineHeight ? Math.max(real ? 0 : 1.2, pdfFont.lineHeight) : 1.2;
43233	const lineGap = pdfFont.lineGap === undefined ? 0.2 : pdfFont.lineGap;
43234	return {
43235		lineHeight: lineHeight * size,
43236		lineGap: lineGap * size,
43237		lineNoGap: Math.max(1, lineHeight - lineGap) * size
43238	};
43239}
43240
43241;// ./src/core/xfa/text.js
43242
43243
43244
43245
43246const WIDTH_FACTOR = 1.02;
43247class FontInfo {
43248	constructor(xfaFont, margin, lineHeight, fontFinder) {
43249		this.lineHeight = lineHeight;
43250		this.paraMargin = margin || {
43251			top: 0,
43252			bottom: 0,
43253			left: 0,
43254			right: 0
43255		};
43256		if (!xfaFont) {
43257			[this.pdfFont, this.xfaFont] = this.defaultFont(fontFinder);
43258			return;
43259		}
43260		this.xfaFont = {
43261			typeface: xfaFont.typeface,
43262			posture: xfaFont.posture,
43263			weight: xfaFont.weight,
43264			size: xfaFont.size,
43265			letterSpacing: xfaFont.letterSpacing
43266		};
43267		const typeface = fontFinder.find(xfaFont.typeface);
43268		if (!typeface) {
43269			[this.pdfFont, this.xfaFont] = this.defaultFont(fontFinder);
43270			return;
43271		}
43272		this.pdfFont = selectFont(xfaFont, typeface);
43273		if (!this.pdfFont) {
43274			[this.pdfFont, this.xfaFont] = this.defaultFont(fontFinder);
43275		}
43276	}
43277	defaultFont(fontFinder) {
43278		const font = fontFinder.find("Helvetica", false) || fontFinder.find("Myriad Pro", false) || fontFinder.find("Arial", false) || fontFinder.getDefault();
43279		if (font?.regular) {
43280			const pdfFont = font.regular;
43281			const info = pdfFont.cssFontInfo;
43282			const xfaFont = {
43283				typeface: info.fontFamily,
43284				posture: "normal",
43285				weight: "normal",
43286				size: 10,
43287				letterSpacing: 0
43288			};
43289			return [pdfFont, xfaFont];
43290		}
43291		const xfaFont = {
43292			typeface: "Courier",
43293			posture: "normal",
43294			weight: "normal",
43295			size: 10,
43296			letterSpacing: 0
43297		};
43298		return [null, xfaFont];
43299	}
43300}
43301class FontSelector {
43302	constructor(defaultXfaFont, defaultParaMargin, defaultLineHeight, fontFinder) {
43303		this.fontFinder = fontFinder;
43304		this.stack = [new FontInfo(defaultXfaFont, defaultParaMargin, defaultLineHeight, fontFinder)];
43305	}
43306	pushData(xfaFont, margin, lineHeight) {
43307		const lastFont = this.stack.at(-1);
43308		for (const name of ["typeface", "posture", "weight", "size", "letterSpacing"]) {
43309			if (!xfaFont[name]) {
43310				xfaFont[name] = lastFont.xfaFont[name];
43311			}
43312		}
43313		for (const name of ["top", "bottom", "left", "right"]) {
43314			if (isNaN(margin[name])) {
43315				margin[name] = lastFont.paraMargin[name];
43316			}
43317		}
43318		const fontInfo = new FontInfo(xfaFont, margin, lineHeight || lastFont.lineHeight, this.fontFinder);
43319		if (!fontInfo.pdfFont) {
43320			fontInfo.pdfFont = lastFont.pdfFont;
43321		}
43322		this.stack.push(fontInfo);
43323	}
43324	popFont() {
43325		this.stack.pop();
43326	}
43327	topFont() {
43328		return this.stack.at(-1);
43329	}
43330}
43331class TextMeasure {
43332	constructor(defaultXfaFont, defaultParaMargin, defaultLineHeight, fonts) {
43333		this.glyphs = [];
43334		this.fontSelector = new FontSelector(defaultXfaFont, defaultParaMargin, defaultLineHeight, fonts);
43335		this.extraHeight = 0;
43336	}
43337	pushData(xfaFont, margin, lineHeight) {
43338		this.fontSelector.pushData(xfaFont, margin, lineHeight);
43339	}
43340	popFont(xfaFont) {
43341		return this.fontSelector.popFont();
43342	}
43343	addPara() {
43344		const lastFont = this.fontSelector.topFont();
43345		this.extraHeight += lastFont.paraMargin.top + lastFont.paraMargin.bottom;
43346	}
43347	addString(str) {
43348		if (!str) {
43349			return;
43350		}
43351		const lastFont = this.fontSelector.topFont();
43352		const fontSize = lastFont.xfaFont.size;
43353		if (lastFont.pdfFont) {
43354			const letterSpacing = lastFont.xfaFont.letterSpacing;
43355			const pdfFont = lastFont.pdfFont;
43356			const fontLineHeight = pdfFont.lineHeight || 1.2;
43357			const lineHeight = lastFont.lineHeight || Math.max(1.2, fontLineHeight) * fontSize;
43358			const lineGap = pdfFont.lineGap === undefined ? 0.2 : pdfFont.lineGap;
43359			const noGap = fontLineHeight - lineGap;
43360			const firstLineHeight = Math.max(1, noGap) * fontSize;
43361			const scale = fontSize / 1000;
43362			const fallbackWidth = pdfFont.defaultWidth || pdfFont.charsToGlyphs(" ")[0].width;
43363			for (const line of str.split(/[\u2029\n]/)) {
43364				const encodedLine = pdfFont.encodeString(line).join("");
43365				const glyphs = pdfFont.charsToGlyphs(encodedLine);
43366				for (const glyph of glyphs) {
43367					const width = glyph.width || fallbackWidth;
43368					this.glyphs.push([width * scale + letterSpacing, lineHeight, firstLineHeight, glyph.unicode, false]);
43369				}
43370				this.glyphs.push([0, 0, 0, "\n", true]);
43371			}
43372			this.glyphs.pop();
43373			return;
43374		}
43375		for (const line of str.split(/[\u2029\n]/)) {
43376			for (const char of line.split("")) {
43377				this.glyphs.push([fontSize, 1.2 * fontSize, fontSize, char, false]);
43378			}
43379			this.glyphs.push([0, 0, 0, "\n", true]);
43380		}
43381		this.glyphs.pop();
43382	}
43383	compute(maxWidth) {
43384		let lastSpacePos = -1,
43385			lastSpaceWidth = 0,
43386			width = 0,
43387			height = 0,
43388			currentLineWidth = 0,
43389			currentLineHeight = 0;
43390		let isBroken = false;
vendor: 5,009 bytes, lines 43391-43582
43391		let isFirstLine = true;
43392		for (let i = 0, ii = this.glyphs.length; i < ii; i++) {
43393			const [glyphWidth, lineHeight, firstLineHeight, char, isEOL] = this.glyphs[i];
43394			const isSpace = char === " ";
43395			const glyphHeight = isFirstLine ? firstLineHeight : lineHeight;
43396			if (isEOL) {
43397				width = Math.max(width, currentLineWidth);
43398				currentLineWidth = 0;
43399				height += currentLineHeight;
43400				currentLineHeight = glyphHeight;
43401				lastSpacePos = -1;
43402				lastSpaceWidth = 0;
43403				isFirstLine = false;
43404				continue;
43405			}
43406			if (isSpace) {
43407				if (currentLineWidth + glyphWidth > maxWidth) {
43408					width = Math.max(width, currentLineWidth);
43409					currentLineWidth = 0;
43410					height += currentLineHeight;
43411					currentLineHeight = glyphHeight;
43412					lastSpacePos = -1;
43413					lastSpaceWidth = 0;
43414					isBroken = true;
43415					isFirstLine = false;
43416				} else {
43417					currentLineHeight = Math.max(glyphHeight, currentLineHeight);
43418					lastSpaceWidth = currentLineWidth;
43419					currentLineWidth += glyphWidth;
43420					lastSpacePos = i;
43421				}
43422				continue;
43423			}
43424			if (currentLineWidth + glyphWidth > maxWidth) {
43425				height += currentLineHeight;
43426				currentLineHeight = glyphHeight;
43427				if (lastSpacePos !== -1) {
43428					i = lastSpacePos;
43429					width = Math.max(width, lastSpaceWidth);
43430					currentLineWidth = 0;
43431					lastSpacePos = -1;
43432					lastSpaceWidth = 0;
43433				} else {
43434					width = Math.max(width, currentLineWidth);
43435					currentLineWidth = glyphWidth;
43436				}
43437				isBroken = true;
43438				isFirstLine = false;
43439				continue;
43440			}
43441			currentLineWidth += glyphWidth;
43442			currentLineHeight = Math.max(glyphHeight, currentLineHeight);
43443		}
43444		width = Math.max(width, currentLineWidth);
43445		height += currentLineHeight + this.extraHeight;
43446		return {
43447			width: WIDTH_FACTOR * width,
43448			height,
43449			isBroken
43450		};
43451	}
43452}
43453
43454;// ./src/core/xfa/som.js
43455
43456
43457
43458
43459
43460
43461const namePattern = /^[^.[]+/;
43462const indexPattern = /^[^\]]+/;
43463const operators = {
43464	dot: 0,
43465	dotDot: 1,
43466	dotHash: 2,
43467	dotBracket: 3,
43468	dotParen: 4
43469};
43470const shortcuts = new Map([["$data", (root, current) => root.datasets ? root.datasets.data : root], ["$record", (root, current) => (root.datasets ? root.datasets.data : root)[$getChildren]()[0]], ["$template", (root, current) => root.template], ["$connectionSet", (root, current) => root.connectionSet], ["$form", (root, current) => root.form], ["$layout", (root, current) => root.layout], ["$host", (root, current) => root.host], ["$dataWindow", (root, current) => root.dataWindow], ["$event", (root, current) => root.event], ["!", (root, current) => root.datasets], ["$xfa", (root, current) => root], ["xfa", (root, current) => root], ["$", (root, current) => current]]);
43471const somCache = new WeakMap();
43472function parseIndex(index) {
43473	index = index.trim();
43474	if (index === "*") {
43475		return Infinity;
43476	}
43477	return parseInt(index, 10) || 0;
43478}
43479function parseExpression(expr, dotDotAllowed, noExpr = true) {
43480	let match = expr.match(namePattern);
43481	if (!match) {
43482		return null;
43483	}
43484	let [name] = match;
43485	const parsed = [{
43486		name,
43487		cacheName: "." + name,
43488		index: 0,
43489		js: null,
43490		formCalc: null,
43491		operator: operators.dot
43492	}];
43493	let pos = name.length;
43494	while (pos < expr.length) {
43495		const spos = pos;
43496		const char = expr.charAt(pos++);
43497		if (char === "[") {
43498			match = expr.slice(pos).match(indexPattern);
43499			if (!match) {
43500				warn("XFA - Invalid index in SOM expression");
43501				return null;
43502			}
43503			parsed.at(-1).index = parseIndex(match[0]);
43504			pos += match[0].length + 1;
43505			continue;
43506		}
43507		let operator;
43508		switch (expr.charAt(pos)) {
43509			case ".":
43510				if (!dotDotAllowed) {
43511					return null;
43512				}
43513				pos++;
43514				operator = operators.dotDot;
43515				break;
43516			case "#":
43517				pos++;
43518				operator = operators.dotHash;
43519				break;
43520			case "[":
43521				if (noExpr) {
43522					warn("XFA - SOM expression contains a FormCalc subexpression which is not supported for now.");
43523					return null;
43524				}
43525				operator = operators.dotBracket;
43526				break;
43527			case "(":
43528				if (noExpr) {
43529					warn("XFA - SOM expression contains a JavaScript subexpression which is not supported for now.");
43530					return null;
43531				}
43532				operator = operators.dotParen;
43533				break;
43534			default:
43535				operator = operators.dot;
43536				break;
43537		}
43538		match = expr.slice(pos).match(namePattern);
43539		if (!match) {
43540			break;
43541		}
43542		[name] = match;
43543		pos += name.length;
43544		parsed.push({
43545			name,
43546			cacheName: expr.slice(spos, pos),
43547			operator,
43548			index: 0,
43549			js: null,
43550			formCalc: null
43551		});
43552	}
43553	return parsed;
43554}
43555function searchNode(root, container, expr, dotDotAllowed = true, useCache = true) {
43556	const parsed = parseExpression(expr, dotDotAllowed);
43557	if (!parsed) {
43558		return null;
43559	}
43560	const fn = shortcuts.get(parsed[0].name);
43561	let i = 0;
43562	let isQualified;
43563	if (fn) {
43564		isQualified = true;
43565		root = [fn(root, container)];
43566		i = 1;
43567	} else {
43568		isQualified = container === null;
43569		root = [container || root];
43570	}
43571	for (let ii = parsed.length; i < ii; i++) {
43572		const {
43573			name,
43574			cacheName,
43575			operator,
43576			index
43577		} = parsed[i];
43578		const nodes = [];
43579		for (const node of root) {
43580			if (!node.isXFAObject) {
43581				continue;
43582			}
vendor: 14,594 bytes, lines 43583-44188
43583			let children, cached;
43584			if (useCache) {
43585				cached = somCache.get(node);
43586				if (!cached) {
43587					cached = new Map();
43588					somCache.set(node, cached);
43589				}
43590				children = cached.get(cacheName);
43591			}
43592			if (!children) {
43593				switch (operator) {
43594					case operators.dot:
43595						children = node[$getChildrenByName](name, false);
43596						break;
43597					case operators.dotDot:
43598						children = node[$getChildrenByName](name, true);
43599						break;
43600					case operators.dotHash:
43601						children = node[$getChildrenByClass](name);
43602						children = children.isXFAObjectArray ? children.children : [children];
43603						break;
43604					default:
43605						break;
43606				}
43607				if (useCache) {
43608					cached.set(cacheName, children);
43609				}
43610			}
43611			if (children.length > 0) {
43612				nodes.push(children);
43613			}
43614		}
43615		if (nodes.length === 0 && !isQualified && i === 0) {
43616			const parent = container[$getParent]();
43617			container = parent;
43618			if (!container) {
43619				return null;
43620			}
43621			i = -1;
43622			root = [container];
43623			continue;
43624		}
43625		root = isFinite(index) ? nodes.filter(node => index < node.length).map(node => node[index]) : nodes.flat();
43626	}
43627	if (root.length === 0) {
43628		return null;
43629	}
43630	return root;
43631}
43632function createDataNode(root, container, expr) {
43633	const parsed = parseExpression(expr);
43634	if (!parsed) {
43635		return null;
43636	}
43637	if (parsed.some(x => x.operator === operators.dotDot)) {
43638		return null;
43639	}
43640	const fn = shortcuts.get(parsed[0].name);
43641	let i = 0;
43642	if (fn) {
43643		root = fn(root, container);
43644		i = 1;
43645	} else {
43646		root = container || root;
43647	}
43648	for (let ii = parsed.length; i < ii; i++) {
43649		const {
43650			name,
43651			operator,
43652			index
43653		} = parsed[i];
43654		if (!isFinite(index)) {
43655			parsed[i].index = 0;
43656			return root.createNodes(parsed.slice(i));
43657		}
43658		let children;
43659		switch (operator) {
43660			case operators.dot:
43661				children = root[$getChildrenByName](name, false);
43662				break;
43663			case operators.dotDot:
43664				children = root[$getChildrenByName](name, true);
43665				break;
43666			case operators.dotHash:
43667				children = root[$getChildrenByClass](name);
43668				children = children.isXFAObjectArray ? children.children : [children];
43669				break;
43670			default:
43671				break;
43672		}
43673		if (children.length === 0) {
43674			return root.createNodes(parsed.slice(i));
43675		}
43676		if (index < children.length) {
43677			const child = children[index];
43678			if (!child.isXFAObject) {
43679				warn(`XFA - Cannot create a node.`);
43680				return null;
43681			}
43682			root = child;
43683		} else {
43684			parsed[i].index = index - children.length;
43685			return root.createNodes(parsed.slice(i));
43686		}
43687	}
43688	return null;
43689}
43690
43691;// ./src/core/xfa/xfa_object.js
43692
43693
43694
43695
43696
43697
43698
43699
43700
43701
43702
43703
43704
43705
43706
43707
43708
43709const _applyPrototype = Symbol();
43710const _attributes = Symbol();
43711const _attributeNames = Symbol();
43712const _children = Symbol("_children");
43713const _cloneAttribute = Symbol();
43714const _dataValue = Symbol();
43715const _defaultValue = Symbol();
43716const _filteredChildrenGenerator = Symbol();
43717const _getPrototype = Symbol();
43718const _getUnsetAttributes = Symbol();
43719const _hasChildren = Symbol();
43720const _max = Symbol();
43721const _options = Symbol();
43722const _parent = Symbol("parent");
43723const _resolvePrototypesHelper = Symbol();
43724const _setAttributes = Symbol();
43725const _validator = Symbol();
43726let uid = 0;
43727const NS_DATASETS = NamespaceIds.datasets.id;
43728class XFAObject {
43729	constructor(nsId, name, hasChildren = false) {
43730		this[$namespaceId] = nsId;
43731		this[$nodeName] = name;
43732		this[_hasChildren] = hasChildren;
43733		this[_parent] = null;
43734		this[_children] = [];
43735		this[$uid] = `${name}${uid++}`;
43736		this[$globalData] = null;
43737	}
43738	get isXFAObject() {
43739		return true;
43740	}
43741	get isXFAObjectArray() {
43742		return false;
43743	}
43744	createNodes(path) {
43745		let root = this,
43746			node = null;
43747		for (const {
43748			name,
43749			index
43750		} of path) {
43751			for (let i = 0, ii = isFinite(index) ? index : 0; i <= ii; i++) {
43752				const nsId = root[$namespaceId] === NS_DATASETS ? -1 : root[$namespaceId];
43753				node = new XmlObject(nsId, name);
43754				root[$appendChild](node);
43755			}
43756			root = node;
43757		}
43758		return node;
43759	}
43760	[$onChild](child) {
43761		if (!this[_hasChildren] || !this[$onChildCheck](child)) {
43762			return false;
43763		}
43764		const name = child[$nodeName];
43765		const node = this[name];
43766		if (node instanceof XFAObjectArray) {
43767			if (node.push(child)) {
43768				this[$appendChild](child);
43769				return true;
43770			}
43771		} else {
43772			if (node !== null) {
43773				this[$removeChild](node);
43774			}
43775			this[name] = child;
43776			this[$appendChild](child);
43777			return true;
43778		}
43779		let id = "";
43780		if (this.id) {
43781			id = ` (id: ${this.id})`;
43782		} else if (this.name) {
43783			id = ` (name: ${this.name} ${this.h.value})`;
43784		}
43785		warn(`XFA - node "${this[$nodeName]}"${id} has already enough "${name}"!`);
43786		return false;
43787	}
43788	[$onChildCheck](child) {
43789		return this.hasOwnProperty(child[$nodeName]) && child[$namespaceId] === this[$namespaceId];
43790	}
43791	[$isNsAgnostic]() {
43792		return false;
43793	}
43794	[$acceptWhitespace]() {
43795		return false;
43796	}
43797	[$isCDATAXml]() {
43798		return false;
43799	}
43800	[$isBindable]() {
43801		return false;
43802	}
43803	[$popPara]() {
43804		if (this.para) {
43805			this[$getTemplateRoot]()[$extra].paraStack.pop();
43806		}
43807	}
43808	[$pushPara]() {
43809		this[$getTemplateRoot]()[$extra].paraStack.push(this.para);
43810	}
43811	[$setId](ids) {
43812		if (this.id && this[$namespaceId] === NamespaceIds.template.id) {
43813			ids.set(this.id, this);
43814		}
43815	}
43816	[$getTemplateRoot]() {
43817		return this[$globalData].template;
43818	}
43819	[$isSplittable]() {
43820		return false;
43821	}
43822	[$isThereMoreWidth]() {
43823		return false;
43824	}
43825	[$appendChild](child) {
43826		child[_parent] = this;
43827		this[_children].push(child);
43828		if (!child[$globalData] && this[$globalData]) {
43829			child[$globalData] = this[$globalData];
43830		}
43831	}
43832	[$removeChild](child) {
43833		const i = this[_children].indexOf(child);
43834		this[_children].splice(i, 1);
43835	}
43836	[$hasSettableValue]() {
43837		return this.hasOwnProperty("value");
43838	}
43839	[$setValue](_) {}
43840	[$onText](_) {}
43841	[$finalize]() {}
43842	[$clean](builder) {
43843		delete this[_hasChildren];
43844		if (this[$cleanup]) {
43845			builder.clean(this[$cleanup]);
43846			delete this[$cleanup];
43847		}
43848	}
43849	[$indexOf](child) {
43850		return this[_children].indexOf(child);
43851	}
43852	[$insertAt](i, child) {
43853		child[_parent] = this;
43854		this[_children].splice(i, 0, child);
43855		if (!child[$globalData] && this[$globalData]) {
43856			child[$globalData] = this[$globalData];
43857		}
43858	}
43859	[$isTransparent]() {
43860		return !this.name;
43861	}
43862	[$lastAttribute]() {
43863		return "";
43864	}
43865	[$text]() {
43866		if (this[_children].length === 0) {
43867			return this[$content];
43868		}
43869		return this[_children].map(c => c[$text]()).join("");
43870	}
43871	get [_attributeNames]() {
43872		const proto = Object.getPrototypeOf(this);
43873		if (!proto._attributes) {
43874			const attributes = proto._attributes = new Set();
43875			for (const name of Object.getOwnPropertyNames(this)) {
43876				if (this[name] === null || this[name] instanceof XFAObject || this[name] instanceof XFAObjectArray) {
43877					break;
43878				}
43879				attributes.add(name);
43880			}
43881		}
43882		return shadow(this, _attributeNames, proto._attributes);
43883	}
43884	[$isDescendent](parent) {
43885		let node = this;
43886		while (node) {
43887			if (node === parent) {
43888				return true;
43889			}
43890			node = node[$getParent]();
43891		}
43892		return false;
43893	}
43894	[$getParent]() {
43895		return this[_parent];
43896	}
43897	[$getSubformParent]() {
43898		return this[$getParent]();
43899	}
43900	[$getChildren](name = null) {
43901		if (!name) {
43902			return this[_children];
43903		}
43904		return this[name];
43905	}
43906	[$dump]() {
43907		const dumped = Object.create(null);
43908		if (this[$content]) {
43909			dumped.$content = this[$content];
43910		}
43911		for (const name of Object.getOwnPropertyNames(this)) {
43912			const value = this[name];
43913			if (value === null) {
43914				continue;
43915			}
43916			if (value instanceof XFAObject) {
43917				dumped[name] = value[$dump]();
43918			} else if (value instanceof XFAObjectArray) {
43919				if (!value.isEmpty()) {
43920					dumped[name] = value.dump();
43921				}
43922			} else {
43923				dumped[name] = value;
43924			}
43925		}
43926		return dumped;
43927	}
43928	[$toStyle]() {
43929		return null;
43930	}
43931	[$toHTML]() {
43932		return HTMLResult.EMPTY;
43933	}
43934	*[$getContainedChildren]() {
43935		for (const node of this[$getChildren]()) {
43936			yield node;
43937		}
43938	}
43939	*[_filteredChildrenGenerator](filter, include) {
43940		for (const node of this[$getContainedChildren]()) {
43941			if (!filter || include === filter.has(node[$nodeName])) {
43942				const availableSpace = this[$getAvailableSpace]();
43943				const res = node[$toHTML](availableSpace);
43944				if (!res.success) {
43945					this[$extra].failingNode = node;
43946				}
43947				yield res;
43948			}
43949		}
43950	}
43951	[$flushHTML]() {
43952		return null;
43953	}
43954	[$addHTML](html, bbox) {
43955		this[$extra].children.push(html);
43956	}
43957	[$getAvailableSpace]() {}
43958	[$childrenToHTML]({
43959		filter = null,
43960		include = true
43961	}) {
43962		if (!this[$extra].generator) {
43963			this[$extra].generator = this[_filteredChildrenGenerator](filter, include);
43964		} else {
43965			const availableSpace = this[$getAvailableSpace]();
43966			const res = this[$extra].failingNode[$toHTML](availableSpace);
43967			if (!res.success) {
43968				return res;
43969			}
43970			if (res.html) {
43971				this[$addHTML](res.html, res.bbox);
43972			}
43973			delete this[$extra].failingNode;
43974		}
43975		while (true) {
43976			const gen = this[$extra].generator.next();
43977			if (gen.done) {
43978				break;
43979			}
43980			const res = gen.value;
43981			if (!res.success) {
43982				return res;
43983			}
43984			if (res.html) {
43985				this[$addHTML](res.html, res.bbox);
43986			}
43987		}
43988		this[$extra].generator = null;
43989		return HTMLResult.EMPTY;
43990	}
43991	[$setSetAttributes](attributes) {
43992		this[_setAttributes] = new Set(Object.keys(attributes));
43993	}
43994	[_getUnsetAttributes](protoAttributes) {
43995		const allAttr = this[_attributeNames];
43996		const setAttr = this[_setAttributes];
43997		return [...protoAttributes].filter(x => allAttr.has(x) && !setAttr.has(x));
43998	}
43999	[$resolvePrototypes](ids, ancestors = new Set()) {
44000		for (const child of this[_children]) {
44001			child[_resolvePrototypesHelper](ids, ancestors);
44002		}
44003	}
44004	[_resolvePrototypesHelper](ids, ancestors) {
44005		const proto = this[_getPrototype](ids, ancestors);
44006		if (proto) {
44007			this[_applyPrototype](proto, ids, ancestors);
44008		} else {
44009			this[$resolvePrototypes](ids, ancestors);
44010		}
44011	}
44012	[_getPrototype](ids, ancestors) {
44013		const {
44014			use,
44015			usehref
44016		} = this;
44017		if (!use && !usehref) {
44018			return null;
44019		}
44020		let proto = null;
44021		let somExpression = null;
44022		let id = null;
44023		let ref = use;
44024		if (usehref) {
44025			ref = usehref;
44026			if (usehref.startsWith("#som(") && usehref.endsWith(")")) {
44027				somExpression = usehref.slice("#som(".length, -1);
44028			} else if (usehref.startsWith(".#som(") && usehref.endsWith(")")) {
44029				somExpression = usehref.slice(".#som(".length, -1);
44030			} else if (usehref.startsWith("#")) {
44031				id = usehref.slice(1);
44032			} else if (usehref.startsWith(".#")) {
44033				id = usehref.slice(2);
44034			}
44035		} else if (use.startsWith("#")) {
44036			id = use.slice(1);
44037		} else {
44038			somExpression = use;
44039		}
44040		this.use = this.usehref = "";
44041		if (id) {
44042			proto = ids.get(id);
44043		} else {
44044			proto = searchNode(ids.get($root), this, somExpression, true, false);
44045			if (proto) {
44046				proto = proto[0];
44047			}
44048		}
44049		if (!proto) {
44050			warn(`XFA - Invalid prototype reference: ${ref}.`);
44051			return null;
44052		}
44053		if (proto[$nodeName] !== this[$nodeName]) {
44054			warn(`XFA - Incompatible prototype: ${proto[$nodeName]} !== ${this[$nodeName]}.`);
44055			return null;
44056		}
44057		if (ancestors.has(proto)) {
44058			warn(`XFA - Cycle detected in prototypes use.`);
44059			return null;
44060		}
44061		ancestors.add(proto);
44062		const protoProto = proto[_getPrototype](ids, ancestors);
44063		if (protoProto) {
44064			proto[_applyPrototype](protoProto, ids, ancestors);
44065		}
44066		proto[$resolvePrototypes](ids, ancestors);
44067		ancestors.delete(proto);
44068		return proto;
44069	}
44070	[_applyPrototype](proto, ids, ancestors) {
44071		if (ancestors.has(proto)) {
44072			warn(`XFA - Cycle detected in prototypes use.`);
44073			return;
44074		}
44075		if (!this[$content] && proto[$content]) {
44076			this[$content] = proto[$content];
44077		}
44078		const newAncestors = new Set(ancestors);
44079		newAncestors.add(proto);
44080		for (const unsetAttrName of this[_getUnsetAttributes](proto[_setAttributes])) {
44081			this[unsetAttrName] = proto[unsetAttrName];
44082			if (this[_setAttributes]) {
44083				this[_setAttributes].add(unsetAttrName);
44084			}
44085		}
44086		for (const name of Object.getOwnPropertyNames(this)) {
44087			if (this[_attributeNames].has(name)) {
44088				continue;
44089			}
44090			const value = this[name];
44091			const protoValue = proto[name];
44092			if (value instanceof XFAObjectArray) {
44093				for (const child of value[_children]) {
44094					child[_resolvePrototypesHelper](ids, ancestors);
44095				}
44096				for (let i = value[_children].length, ii = protoValue[_children].length; i < ii; i++) {
44097					const child = proto[_children][i][$clone]();
44098					if (value.push(child)) {
44099						child[_parent] = this;
44100						this[_children].push(child);
44101						child[_resolvePrototypesHelper](ids, ancestors);
44102					} else {
44103						break;
44104					}
44105				}
44106				continue;
44107			}
44108			if (value !== null) {
44109				value[$resolvePrototypes](ids, ancestors);
44110				if (protoValue) {
44111					value[_applyPrototype](protoValue, ids, ancestors);
44112				}
44113				continue;
44114			}
44115			if (protoValue !== null) {
44116				const child = protoValue[$clone]();
44117				child[_parent] = this;
44118				this[name] = child;
44119				this[_children].push(child);
44120				child[_resolvePrototypesHelper](ids, ancestors);
44121			}
44122		}
44123	}
44124	static [_cloneAttribute](obj) {
44125		if (Array.isArray(obj)) {
44126			return obj.map(x => XFAObject[_cloneAttribute](x));
44127		}
44128		if (typeof obj === "object" && obj !== null) {
44129			return Object.assign({}, obj);
44130		}
44131		return obj;
44132	}
44133	[$clone]() {
44134		const clone = Object.create(Object.getPrototypeOf(this));
44135		for (const $symbol of Object.getOwnPropertySymbols(this)) {
44136			try {
44137				clone[$symbol] = this[$symbol];
44138			} catch {
44139				shadow(clone, $symbol, this[$symbol]);
44140			}
44141		}
44142		clone[$uid] = `${clone[$nodeName]}${uid++}`;
44143		clone[_children] = [];
44144		for (const name of Object.getOwnPropertyNames(this)) {
44145			if (this[_attributeNames].has(name)) {
44146				clone[name] = XFAObject[_cloneAttribute](this[name]);
44147				continue;
44148			}
44149			const value = this[name];
44150			clone[name] = value instanceof XFAObjectArray ? new XFAObjectArray(value[_max]) : null;
44151		}
44152		for (const child of this[_children]) {
44153			const name = child[$nodeName];
44154			const clonedChild = child[$clone]();
44155			clone[_children].push(clonedChild);
44156			clonedChild[_parent] = clone;
44157			if (clone[name] === null) {
44158				clone[name] = clonedChild;
44159			} else {
44160				clone[name][_children].push(clonedChild);
44161			}
44162		}
44163		return clone;
44164	}
44165	[$getChildren](name = null) {
44166		if (!name) {
44167			return this[_children];
44168		}
44169		return this[_children].filter(c => c[$nodeName] === name);
44170	}
44171	[$getChildrenByClass](name) {
44172		return this[name];
44173	}
44174	[$getChildrenByName](name, allTransparent, first = true) {
44175		return Array.from(this[$getChildrenByNameIt](name, allTransparent, first));
44176	}
44177	*[$getChildrenByNameIt](name, allTransparent, first = true) {
44178		if (name === "parent") {
44179			yield this[_parent];
44180			return;
44181		}
44182		for (const child of this[_children]) {
44183			if (child[$nodeName] === name) {
44184				yield child;
44185			}
44186			if (child.name === name) {
44187				yield child;
44188			}
vendor: 2,014 bytes, lines 44189-44274
44189			if (allTransparent || child[$isTransparent]()) {
44190				yield* child[$getChildrenByNameIt](name, allTransparent, false);
44191			}
44192		}
44193		if (first && this[_attributeNames].has(name)) {
44194			yield new XFAAttribute(this, name, this[name]);
44195		}
44196	}
44197}
44198class XFAObjectArray {
44199	constructor(max = Infinity) {
44200		this[_max] = max;
44201		this[_children] = [];
44202	}
44203	get isXFAObject() {
44204		return false;
44205	}
44206	get isXFAObjectArray() {
44207		return true;
44208	}
44209	push(child) {
44210		const len = this[_children].length;
44211		if (len <= this[_max]) {
44212			this[_children].push(child);
44213			return true;
44214		}
44215		warn(`XFA - node "${child[$nodeName]}" accepts no more than ${this[_max]} children`);
44216		return false;
44217	}
44218	isEmpty() {
44219		return this[_children].length === 0;
44220	}
44221	dump() {
44222		return this[_children].length === 1 ? this[_children][0][$dump]() : this[_children].map(x => x[$dump]());
44223	}
44224	[$clone]() {
44225		const clone = new XFAObjectArray(this[_max]);
44226		clone[_children] = this[_children].map(c => c[$clone]());
44227		return clone;
44228	}
44229	get children() {
44230		return this[_children];
44231	}
44232	clear() {
44233		this[_children].length = 0;
44234	}
44235}
44236class XFAAttribute {
44237	constructor(node, name, value) {
44238		this[_parent] = node;
44239		this[$nodeName] = name;
44240		this[$content] = value;
44241		this[$consumed] = false;
44242		this[$uid] = `attribute${uid++}`;
44243	}
44244	[$getParent]() {
44245		return this[_parent];
44246	}
44247	[$isDataValue]() {
44248		return true;
44249	}
44250	[$getDataValue]() {
44251		return this[$content].trim();
44252	}
44253	[$setValue](value) {
44254		value = value.value || "";
44255		this[$content] = value.toString();
44256	}
44257	[$text]() {
44258		return this[$content];
44259	}
44260	[$isDescendent](parent) {
44261		return this[_parent] === parent || this[_parent][$isDescendent](parent);
44262	}
44263}
44264class XmlObject extends XFAObject {
44265	constructor(nsId, name, attributes = {}) {
44266		super(nsId, name);
44267		this[$content] = "";
44268		this[_dataValue] = null;
44269		if (name !== "#text") {
44270			const map = new Map();
44271			this[_attributes] = map;
44272			for (const [attrName, value] of Object.entries(attributes)) {
44273				map.set(attrName, new XFAAttribute(this, attrName, value));
44274			}
vendor: 2,684 bytes, lines 44275-44380
44275			if (attributes.hasOwnProperty($nsAttributes)) {
44276				const dataNode = attributes[$nsAttributes].xfa.dataNode;
44277				if (dataNode !== undefined) {
44278					if (dataNode === "dataGroup") {
44279						this[_dataValue] = false;
44280					} else if (dataNode === "dataValue") {
44281						this[_dataValue] = true;
44282					}
44283				}
44284			}
44285		}
44286		this[$consumed] = false;
44287	}
44288	[$toString](buf) {
44289		const tagName = this[$nodeName];
44290		if (tagName === "#text") {
44291			buf.push(encodeToXmlString(this[$content]));
44292			return;
44293		}
44294		const utf8TagName = utf8StringToString(tagName);
44295		const prefix = this[$namespaceId] === NS_DATASETS ? "xfa:" : "";
44296		buf.push(`<${prefix}${utf8TagName}`);
44297		for (const [name, value] of this[_attributes].entries()) {
44298			const utf8Name = utf8StringToString(name);
44299			buf.push(` ${utf8Name}="${encodeToXmlString(value[$content])}"`);
44300		}
44301		if (this[_dataValue] !== null) {
44302			if (this[_dataValue]) {
44303				buf.push(` xfa:dataNode="dataValue"`);
44304			} else {
44305				buf.push(` xfa:dataNode="dataGroup"`);
44306			}
44307		}
44308		if (!this[$content] && this[_children].length === 0) {
44309			buf.push("/>");
44310			return;
44311		}
44312		buf.push(">");
44313		if (this[$content]) {
44314			if (typeof this[$content] === "string") {
44315				buf.push(encodeToXmlString(this[$content]));
44316			} else {
44317				this[$content][$toString](buf);
44318			}
44319		} else {
44320			for (const child of this[_children]) {
44321				child[$toString](buf);
44322			}
44323		}
44324		buf.push(`</${prefix}${utf8TagName}>`);
44325	}
44326	[$onChild](child) {
44327		if (this[$content]) {
44328			const node = new XmlObject(this[$namespaceId], "#text");
44329			this[$appendChild](node);
44330			node[$content] = this[$content];
44331			this[$content] = "";
44332		}
44333		this[$appendChild](child);
44334		return true;
44335	}
44336	[$onText](str) {
44337		this[$content] += str;
44338	}
44339	[$finalize]() {
44340		if (this[$content] && this[_children].length > 0) {
44341			const node = new XmlObject(this[$namespaceId], "#text");
44342			this[$appendChild](node);
44343			node[$content] = this[$content];
44344			delete this[$content];
44345		}
44346	}
44347	[$toHTML]() {
44348		if (this[$nodeName] === "#text") {
44349			return HTMLResult.success({
44350				name: "#text",
44351				value: this[$content]
44352			});
44353		}
44354		return HTMLResult.EMPTY;
44355	}
44356	[$getChildren](name = null) {
44357		if (!name) {
44358			return this[_children];
44359		}
44360		return this[_children].filter(c => c[$nodeName] === name);
44361	}
44362	[$getAttributes]() {
44363		return this[_attributes];
44364	}
44365	[$getChildrenByClass](name) {
44366		const value = this[_attributes].get(name);
44367		if (value !== undefined) {
44368			return value;
44369		}
44370		return this[$getChildren](name);
44371	}
44372	*[$getChildrenByNameIt](name, allTransparent) {
44373		const value = this[_attributes].get(name);
44374		if (value) {
44375			yield value;
44376		}
44377		for (const child of this[_children]) {
44378			if (child[$nodeName] === name) {
44379				yield child;
44380			}
vendor: 5,957 bytes, lines 44381-44626
44381			if (allTransparent) {
44382				yield* child[$getChildrenByNameIt](name, allTransparent);
44383			}
44384		}
44385	}
44386	*[$getAttributeIt](name, skipConsumed) {
44387		const value = this[_attributes].get(name);
44388		if (value && (!skipConsumed || !value[$consumed])) {
44389			yield value;
44390		}
44391		for (const child of this[_children]) {
44392			yield* child[$getAttributeIt](name, skipConsumed);
44393		}
44394	}
44395	*[$getRealChildrenByNameIt](name, allTransparent, skipConsumed) {
44396		for (const child of this[_children]) {
44397			if (child[$nodeName] === name && (!skipConsumed || !child[$consumed])) {
44398				yield child;
44399			}
44400			if (allTransparent) {
44401				yield* child[$getRealChildrenByNameIt](name, allTransparent, skipConsumed);
44402			}
44403		}
44404	}
44405	[$isDataValue]() {
44406		if (this[_dataValue] === null) {
44407			return this[_children].length === 0 || this[_children][0][$namespaceId] === NamespaceIds.xhtml.id;
44408		}
44409		return this[_dataValue];
44410	}
44411	[$getDataValue]() {
44412		if (this[_dataValue] === null) {
44413			if (this[_children].length === 0) {
44414				return this[$content].trim();
44415			}
44416			if (this[_children][0][$namespaceId] === NamespaceIds.xhtml.id) {
44417				return this[_children][0][$text]().trim();
44418			}
44419			return null;
44420		}
44421		return this[$content].trim();
44422	}
44423	[$setValue](value) {
44424		value = value.value || "";
44425		this[$content] = value.toString();
44426	}
44427	[$dump](hasNS = false) {
44428		const dumped = Object.create(null);
44429		if (hasNS) {
44430			dumped.$ns = this[$namespaceId];
44431		}
44432		if (this[$content]) {
44433			dumped.$content = this[$content];
44434		}
44435		dumped.$name = this[$nodeName];
44436		dumped.children = [];
44437		for (const child of this[_children]) {
44438			dumped.children.push(child[$dump](hasNS));
44439		}
44440		dumped.attributes = Object.create(null);
44441		for (const [name, value] of this[_attributes]) {
44442			dumped.attributes[name] = value[$content];
44443		}
44444		return dumped;
44445	}
44446}
44447class ContentObject extends XFAObject {
44448	constructor(nsId, name) {
44449		super(nsId, name);
44450		this[$content] = "";
44451	}
44452	[$onText](text) {
44453		this[$content] += text;
44454	}
44455	[$finalize]() {}
44456}
44457class OptionObject extends ContentObject {
44458	constructor(nsId, name, options) {
44459		super(nsId, name);
44460		this[_options] = options;
44461	}
44462	[$finalize]() {
44463		this[$content] = getKeyword({
44464			data: this[$content],
44465			defaultValue: this[_options][0],
44466			validate: k => this[_options].includes(k)
44467		});
44468	}
44469	[$clean](builder) {
44470		super[$clean](builder);
44471		delete this[_options];
44472	}
44473}
44474class StringObject extends ContentObject {
44475	[$finalize]() {
44476		this[$content] = this[$content].trim();
44477	}
44478}
44479class IntegerObject extends ContentObject {
44480	constructor(nsId, name, defaultValue, validator) {
44481		super(nsId, name);
44482		this[_defaultValue] = defaultValue;
44483		this[_validator] = validator;
44484	}
44485	[$finalize]() {
44486		this[$content] = getInteger({
44487			data: this[$content],
44488			defaultValue: this[_defaultValue],
44489			validate: this[_validator]
44490		});
44491	}
44492	[$clean](builder) {
44493		super[$clean](builder);
44494		delete this[_defaultValue];
44495		delete this[_validator];
44496	}
44497}
44498class Option01 extends IntegerObject {
44499	constructor(nsId, name) {
44500		super(nsId, name, 0, n => n === 1);
44501	}
44502}
44503class Option10 extends IntegerObject {
44504	constructor(nsId, name) {
44505		super(nsId, name, 1, n => n === 0);
44506	}
44507}
44508
44509;// ./src/core/xfa/html_utils.js
44510
44511
44512
44513
44514
44515
44516
44517
44518
44519
44520function measureToString(m) {
44521	if (typeof m === "string") {
44522		return "0px";
44523	}
44524	return Number.isInteger(m) ? `${m}px` : `${m.toFixed(2)}px`;
44525}
44526const converters = {
44527	anchorType(node, style) {
44528		const parent = node[$getSubformParent]();
44529		if (!parent || parent.layout && parent.layout !== "position") {
44530			return;
44531		}
44532		if (!("transform" in style)) {
44533			style.transform = "";
44534		}
44535		switch (node.anchorType) {
44536			case "bottomCenter":
44537				style.transform += "translate(-50%, -100%)";
44538				break;
44539			case "bottomLeft":
44540				style.transform += "translate(0,-100%)";
44541				break;
44542			case "bottomRight":
44543				style.transform += "translate(-100%,-100%)";
44544				break;
44545			case "middleCenter":
44546				style.transform += "translate(-50%,-50%)";
44547				break;
44548			case "middleLeft":
44549				style.transform += "translate(0,-50%)";
44550				break;
44551			case "middleRight":
44552				style.transform += "translate(-100%,-50%)";
44553				break;
44554			case "topCenter":
44555				style.transform += "translate(-50%,0)";
44556				break;
44557			case "topRight":
44558				style.transform += "translate(-100%,0)";
44559				break;
44560		}
44561	},
44562	dimensions(node, style) {
44563		const parent = node[$getSubformParent]();
44564		let width = node.w;
44565		const height = node.h;
44566		if (parent.layout?.includes("row")) {
44567			const extra = parent[$extra];
44568			const colSpan = node.colSpan;
44569			let w;
44570			if (colSpan === -1) {
44571				w = extra.columnWidths.slice(extra.currentColumn).reduce((a, x) => a + x, 0);
44572				extra.currentColumn = 0;
44573			} else {
44574				w = extra.columnWidths.slice(extra.currentColumn, extra.currentColumn + colSpan).reduce((a, x) => a + x, 0);
44575				extra.currentColumn = (extra.currentColumn + node.colSpan) % extra.columnWidths.length;
44576			}
44577			if (!isNaN(w)) {
44578				width = node.w = w;
44579			}
44580		}
44581		style.width = width !== "" ? measureToString(width) : "auto";
44582		style.height = height !== "" ? measureToString(height) : "auto";
44583	},
44584	position(node, style) {
44585		const parent = node[$getSubformParent]();
44586		if (parent?.layout && parent.layout !== "position") {
44587			return;
44588		}
44589		style.position = "absolute";
44590		style.left = measureToString(node.x);
44591		style.top = measureToString(node.y);
44592	},
44593	rotate(node, style) {
44594		if (node.rotate) {
44595			if (!("transform" in style)) {
44596				style.transform = "";
44597			}
44598			style.transform += `rotate(-${node.rotate}deg)`;
44599			style.transformOrigin = "top left";
44600		}
44601	},
44602	presence(node, style) {
44603		switch (node.presence) {
44604			case "invisible":
44605				style.visibility = "hidden";
44606				break;
44607			case "hidden":
44608			case "inactive":
44609				style.display = "none";
44610				break;
44611		}
44612	},
44613	hAlign(node, style) {
44614		if (node[$nodeName] === "para") {
44615			switch (node.hAlign) {
44616				case "justifyAll":
44617					style.textAlign = "justify-all";
44618					break;
44619				case "radix":
44620					style.textAlign = "left";
44621					break;
44622				default:
44623					style.textAlign = node.hAlign;
44624			}
44625		} else {
44626			switch (node.hAlign) {
vendor: 13,121 bytes, lines 44627-45133
44627				case "left":
44628					style.alignSelf = "start";
44629					break;
44630				case "center":
44631					style.alignSelf = "center";
44632					break;
44633				case "right":
44634					style.alignSelf = "end";
44635					break;
44636			}
44637		}
44638	},
44639	margin(node, style) {
44640		if (node.margin) {
44641			style.margin = node.margin[$toStyle]().margin;
44642		}
44643	}
44644};
44645function setMinMaxDimensions(node, style) {
44646	const parent = node[$getSubformParent]();
44647	if (parent.layout === "position") {
44648		if (node.minW > 0) {
44649			style.minWidth = measureToString(node.minW);
44650		}
44651		if (node.maxW > 0) {
44652			style.maxWidth = measureToString(node.maxW);
44653		}
44654		if (node.minH > 0) {
44655			style.minHeight = measureToString(node.minH);
44656		}
44657		if (node.maxH > 0) {
44658			style.maxHeight = measureToString(node.maxH);
44659		}
44660	}
44661}
44662function layoutText(text, xfaFont, margin, lineHeight, fontFinder, width) {
44663	const measure = new TextMeasure(xfaFont, margin, lineHeight, fontFinder);
44664	if (typeof text === "string") {
44665		measure.addString(text);
44666	} else {
44667		text[$pushGlyphs](measure);
44668	}
44669	return measure.compute(width);
44670}
44671function layoutNode(node, availableSpace) {
44672	let height = null;
44673	let width = null;
44674	let isBroken = false;
44675	if ((!node.w || !node.h) && node.value) {
44676		let marginH = 0;
44677		let marginV = 0;
44678		if (node.margin) {
44679			marginH = node.margin.leftInset + node.margin.rightInset;
44680			marginV = node.margin.topInset + node.margin.bottomInset;
44681		}
44682		let lineHeight = null;
44683		let margin = null;
44684		if (node.para) {
44685			margin = Object.create(null);
44686			lineHeight = node.para.lineHeight === "" ? null : node.para.lineHeight;
44687			margin.top = node.para.spaceAbove === "" ? 0 : node.para.spaceAbove;
44688			margin.bottom = node.para.spaceBelow === "" ? 0 : node.para.spaceBelow;
44689			margin.left = node.para.marginLeft === "" ? 0 : node.para.marginLeft;
44690			margin.right = node.para.marginRight === "" ? 0 : node.para.marginRight;
44691		}
44692		let font = node.font;
44693		if (!font) {
44694			const root = node[$getTemplateRoot]();
44695			let parent = node[$getParent]();
44696			while (parent && parent !== root) {
44697				if (parent.font) {
44698					font = parent.font;
44699					break;
44700				}
44701				parent = parent[$getParent]();
44702			}
44703		}
44704		const maxWidth = (node.w || availableSpace.width) - marginH;
44705		const fontFinder = node[$globalData].fontFinder;
44706		if (node.value.exData && node.value.exData[$content] && node.value.exData.contentType === "text/html") {
44707			const res = layoutText(node.value.exData[$content], font, margin, lineHeight, fontFinder, maxWidth);
44708			width = res.width;
44709			height = res.height;
44710			isBroken = res.isBroken;
44711		} else {
44712			const text = node.value[$text]();
44713			if (text) {
44714				const res = layoutText(text, font, margin, lineHeight, fontFinder, maxWidth);
44715				width = res.width;
44716				height = res.height;
44717				isBroken = res.isBroken;
44718			}
44719		}
44720		if (width !== null && !node.w) {
44721			width += marginH;
44722		}
44723		if (height !== null && !node.h) {
44724			height += marginV;
44725		}
44726	}
44727	return {
44728		w: width,
44729		h: height,
44730		isBroken
44731	};
44732}
44733function computeBbox(node, html, availableSpace) {
44734	let bbox;
44735	if (node.w !== "" && node.h !== "") {
44736		bbox = [node.x, node.y, node.w, node.h];
44737	} else {
44738		if (!availableSpace) {
44739			return null;
44740		}
44741		let width = node.w;
44742		if (width === "") {
44743			if (node.maxW === 0) {
44744				const parent = node[$getSubformParent]();
44745				width = parent.layout === "position" && parent.w !== "" ? 0 : node.minW;
44746			} else {
44747				width = Math.min(node.maxW, availableSpace.width);
44748			}
44749			html.attributes.style.width = measureToString(width);
44750		}
44751		let height = node.h;
44752		if (height === "") {
44753			if (node.maxH === 0) {
44754				const parent = node[$getSubformParent]();
44755				height = parent.layout === "position" && parent.h !== "" ? 0 : node.minH;
44756			} else {
44757				height = Math.min(node.maxH, availableSpace.height);
44758			}
44759			html.attributes.style.height = measureToString(height);
44760		}
44761		bbox = [node.x, node.y, width, height];
44762	}
44763	return bbox;
44764}
44765function fixDimensions(node) {
44766	const parent = node[$getSubformParent]();
44767	if (parent.layout?.includes("row")) {
44768		const extra = parent[$extra];
44769		const colSpan = node.colSpan;
44770		let width;
44771		if (colSpan === -1) {
44772			width = extra.columnWidths.slice(extra.currentColumn).reduce((a, w) => a + w, 0);
44773		} else {
44774			width = extra.columnWidths.slice(extra.currentColumn, extra.currentColumn + colSpan).reduce((a, w) => a + w, 0);
44775		}
44776		if (!isNaN(width)) {
44777			node.w = width;
44778		}
44779	}
44780	if (parent.layout && parent.layout !== "position") {
44781		node.x = node.y = 0;
44782	}
44783	if (node.layout === "table") {
44784		if (node.w === "" && Array.isArray(node.columnWidths)) {
44785			node.w = node.columnWidths.reduce((a, x) => a + x, 0);
44786		}
44787	}
44788}
44789function layoutClass(node) {
44790	switch (node.layout) {
44791		case "position":
44792			return "xfaPosition";
44793		case "lr-tb":
44794			return "xfaLrTb";
44795		case "rl-row":
44796			return "xfaRlRow";
44797		case "rl-tb":
44798			return "xfaRlTb";
44799		case "row":
44800			return "xfaRow";
44801		case "table":
44802			return "xfaTable";
44803		case "tb":
44804			return "xfaTb";
44805		default:
44806			return "xfaPosition";
44807	}
44808}
44809function toStyle(node, ...names) {
44810	const style = Object.create(null);
44811	for (const name of names) {
44812		const value = node[name];
44813		if (value === null) {
44814			continue;
44815		}
44816		if (converters.hasOwnProperty(name)) {
44817			converters[name](node, style);
44818			continue;
44819		}
44820		if (value instanceof XFAObject) {
44821			const newStyle = value[$toStyle]();
44822			if (newStyle) {
44823				Object.assign(style, newStyle);
44824			} else {
44825				warn(`(DEBUG) - XFA - style for ${name} not implemented yet`);
44826			}
44827		}
44828	}
44829	return style;
44830}
44831function createWrapper(node, html) {
44832	const {
44833		attributes
44834	} = html;
44835	const {
44836		style
44837	} = attributes;
44838	const wrapper = {
44839		name: "div",
44840		attributes: {
44841			class: ["xfaWrapper"],
44842			style: Object.create(null)
44843		},
44844		children: []
44845	};
44846	attributes.class.push("xfaWrapped");
44847	if (node.border) {
44848		const {
44849			widths,
44850			insets
44851		} = node.border[$extra];
44852		let width, height;
44853		let top = insets[0];
44854		let left = insets[3];
44855		const insetsH = insets[0] + insets[2];
44856		const insetsW = insets[1] + insets[3];
44857		switch (node.border.hand) {
44858			case "even":
44859				top -= widths[0] / 2;
44860				left -= widths[3] / 2;
44861				width = `calc(100% + ${(widths[1] + widths[3]) / 2 - insetsW}px)`;
44862				height = `calc(100% + ${(widths[0] + widths[2]) / 2 - insetsH}px)`;
44863				break;
44864			case "left":
44865				top -= widths[0];
44866				left -= widths[3];
44867				width = `calc(100% + ${widths[1] + widths[3] - insetsW}px)`;
44868				height = `calc(100% + ${widths[0] + widths[2] - insetsH}px)`;
44869				break;
44870			case "right":
44871				width = insetsW ? `calc(100% - ${insetsW}px)` : "100%";
44872				height = insetsH ? `calc(100% - ${insetsH}px)` : "100%";
44873				break;
44874		}
44875		const classNames = ["xfaBorder"];
44876		if (isPrintOnly(node.border)) {
44877			classNames.push("xfaPrintOnly");
44878		}
44879		const border = {
44880			name: "div",
44881			attributes: {
44882				class: classNames,
44883				style: {
44884					top: `${top}px`,
44885					left: `${left}px`,
44886					width,
44887					height
44888				}
44889			},
44890			children: []
44891		};
44892		for (const key of ["border", "borderWidth", "borderColor", "borderRadius", "borderStyle"]) {
44893			if (style[key] !== undefined) {
44894				border.attributes.style[key] = style[key];
44895				delete style[key];
44896			}
44897		}
44898		wrapper.children.push(border, html);
44899	} else {
44900		wrapper.children.push(html);
44901	}
44902	for (const key of ["background", "backgroundClip", "top", "left", "width", "height", "minWidth", "minHeight", "maxWidth", "maxHeight", "transform", "transformOrigin", "visibility"]) {
44903		if (style[key] !== undefined) {
44904			wrapper.attributes.style[key] = style[key];
44905			delete style[key];
44906		}
44907	}
44908	wrapper.attributes.style.position = style.position === "absolute" ? "absolute" : "relative";
44909	delete style.position;
44910	if (style.alignSelf) {
44911		wrapper.attributes.style.alignSelf = style.alignSelf;
44912		delete style.alignSelf;
44913	}
44914	return wrapper;
44915}
44916function fixTextIndent(styles) {
44917	const indent = getMeasurement(styles.textIndent, "0px");
44918	if (indent >= 0) {
44919		return;
44920	}
44921	const align = styles.textAlign === "right" ? "right" : "left";
44922	const name = "padding" + (align === "left" ? "Left" : "Right");
44923	const padding = getMeasurement(styles[name], "0px");
44924	styles[name] = `${padding - indent}px`;
44925}
44926function setAccess(node, classNames) {
44927	switch (node.access) {
44928		case "nonInteractive":
44929			classNames.push("xfaNonInteractive");
44930			break;
44931		case "readOnly":
44932			classNames.push("xfaReadOnly");
44933			break;
44934		case "protected":
44935			classNames.push("xfaDisabled");
44936			break;
44937	}
44938}
44939function isPrintOnly(node) {
44940	return node.relevant.length > 0 && !node.relevant[0].excluded && node.relevant[0].viewname === "print";
44941}
44942function getCurrentPara(node) {
44943	const stack = node[$getTemplateRoot]()[$extra].paraStack;
44944	return stack.length ? stack.at(-1) : null;
44945}
44946function setPara(node, nodeStyle, value) {
44947	if (value.attributes.class?.includes("xfaRich")) {
44948		if (nodeStyle) {
44949			if (node.h === "") {
44950				nodeStyle.height = "auto";
44951			}
44952			if (node.w === "") {
44953				nodeStyle.width = "auto";
44954			}
44955		}
44956		const para = getCurrentPara(node);
44957		if (para) {
44958			const valueStyle = value.attributes.style;
44959			valueStyle.display = "flex";
44960			valueStyle.flexDirection = "column";
44961			switch (para.vAlign) {
44962				case "top":
44963					valueStyle.justifyContent = "start";
44964					break;
44965				case "bottom":
44966					valueStyle.justifyContent = "end";
44967					break;
44968				case "middle":
44969					valueStyle.justifyContent = "center";
44970					break;
44971			}
44972			const paraStyle = para[$toStyle]();
44973			for (const [key, val] of Object.entries(paraStyle)) {
44974				if (!(key in valueStyle)) {
44975					valueStyle[key] = val;
44976				}
44977			}
44978		}
44979	}
44980}
44981function setFontFamily(xfaFont, node, fontFinder, style) {
44982	if (!fontFinder) {
44983		delete style.fontFamily;
44984		return;
44985	}
44986	const name = stripQuotes(xfaFont.typeface);
44987	style.fontFamily = `"${name}"`;
44988	const typeface = fontFinder.find(name);
44989	if (typeface) {
44990		const {
44991			fontFamily
44992		} = typeface.regular.cssFontInfo;
44993		if (fontFamily !== name) {
44994			style.fontFamily = `"${fontFamily}"`;
44995		}
44996		const para = getCurrentPara(node);
44997		if (para && para.lineHeight !== "") {
44998			return;
44999		}
45000		if (style.lineHeight) {
45001			return;
45002		}
45003		const pdfFont = selectFont(xfaFont, typeface);
45004		if (pdfFont) {
45005			style.lineHeight = Math.max(1.2, pdfFont.lineHeight);
45006		}
45007	}
45008}
45009function fixURL(str) {
45010	const absoluteUrl = createValidAbsoluteUrl(str, null, {
45011		addDefaultProtocol: true,
45012		tryConvertEncoding: true
45013	});
45014	return absoluteUrl ? absoluteUrl.href : null;
45015}
45016
45017;// ./src/core/xfa/layout.js
45018
45019
45020
45021
45022
45023function createLine(node, children) {
45024	return {
45025		name: "div",
45026		attributes: {
45027			class: [node.layout === "lr-tb" ? "xfaLr" : "xfaRl"]
45028		},
45029		children
45030	};
45031}
45032function flushHTML(node) {
45033	if (!node[$extra]) {
45034		return null;
45035	}
45036	const attributes = node[$extra].attributes;
45037	const html = {
45038		name: "div",
45039		attributes,
45040		children: node[$extra].children
45041	};
45042	if (node[$extra].failingNode) {
45043		const htmlFromFailing = node[$extra].failingNode[$flushHTML]();
45044		if (htmlFromFailing) {
45045			if (node.layout.endsWith("-tb")) {
45046				html.children.push(createLine(node, [htmlFromFailing]));
45047			} else {
45048				html.children.push(htmlFromFailing);
45049			}
45050		}
45051	}
45052	if (html.children.length === 0) {
45053		return null;
45054	}
45055	return html;
45056}
45057function addHTML(node, html, bbox) {
45058	const extra = node[$extra];
45059	const availableSpace = extra.availableSpace;
45060	const [x, y, w, h] = bbox;
45061	switch (node.layout) {
45062		case "position":
45063			{
45064				extra.width = Math.max(extra.width, x + w);
45065				extra.height = Math.max(extra.height, y + h);
45066				extra.children.push(html);
45067				break;
45068			}
45069		case "lr-tb":
45070		case "rl-tb":
45071			if (!extra.line || extra.attempt === 1) {
45072				extra.line = createLine(node, []);
45073				extra.children.push(extra.line);
45074				extra.numberInLine = 0;
45075			}
45076			extra.numberInLine += 1;
45077			extra.line.children.push(html);
45078			if (extra.attempt === 0) {
45079				extra.currentWidth += w;
45080				extra.height = Math.max(extra.height, extra.prevHeight + h);
45081			} else {
45082				extra.currentWidth = w;
45083				extra.prevHeight = extra.height;
45084				extra.height += h;
45085				extra.attempt = 0;
45086			}
45087			extra.width = Math.max(extra.width, extra.currentWidth);
45088			break;
45089		case "rl-row":
45090		case "row":
45091			{
45092				extra.children.push(html);
45093				extra.width += w;
45094				extra.height = Math.max(extra.height, h);
45095				const height = measureToString(extra.height);
45096				for (const child of extra.children) {
45097					child.attributes.style.height = height;
45098				}
45099				break;
45100			}
45101		case "table":
45102			{
45103				extra.width = Math.min(availableSpace.width, Math.max(extra.width, w));
45104				extra.height += h;
45105				extra.children.push(html);
45106				break;
45107			}
45108		case "tb":
45109			{
45110				extra.width = Math.min(availableSpace.width, Math.max(extra.width, w));
45111				extra.height += h;
45112				extra.children.push(html);
45113				break;
45114			}
45115	}
45116}
45117function getAvailableSpace(node) {
45118	const availableSpace = node[$extra].availableSpace;
45119	const marginV = node.margin ? node.margin.topInset + node.margin.bottomInset : 0;
45120	const marginH = node.margin ? node.margin.leftInset + node.margin.rightInset : 0;
45121	switch (node.layout) {
45122		case "lr-tb":
45123		case "rl-tb":
45124			if (node[$extra].attempt === 0) {
45125				return {
45126					width: availableSpace.width - marginH - node[$extra].currentWidth,
45127					height: availableSpace.height - marginV - node[$extra].prevHeight
45128				};
45129			}
45130			return {
45131				width: availableSpace.width - marginH,
45132				height: availableSpace.height - marginV - node[$extra].height
45133			};
vendor: 3,569 bytes, lines 45134-45273
45134		case "rl-row":
45135		case "row":
45136			const width = node[$extra].columnWidths.slice(node[$extra].currentColumn).reduce((a, x) => a + x);
45137			return {
45138				width,
45139				height: availableSpace.height - marginH
45140			};
45141		case "table":
45142		case "tb":
45143			return {
45144				width: availableSpace.width - marginH,
45145				height: availableSpace.height - marginV - node[$extra].height
45146			};
45147		case "position":
45148		default:
45149			return availableSpace;
45150	}
45151}
45152function getTransformedBBox(node) {
45153	let w = node.w === "" ? NaN : node.w;
45154	let h = node.h === "" ? NaN : node.h;
45155	let [centerX, centerY] = [0, 0];
45156	switch (node.anchorType || "") {
45157		case "bottomCenter":
45158			[centerX, centerY] = [w / 2, h];
45159			break;
45160		case "bottomLeft":
45161			[centerX, centerY] = [0, h];
45162			break;
45163		case "bottomRight":
45164			[centerX, centerY] = [w, h];
45165			break;
45166		case "middleCenter":
45167			[centerX, centerY] = [w / 2, h / 2];
45168			break;
45169		case "middleLeft":
45170			[centerX, centerY] = [0, h / 2];
45171			break;
45172		case "middleRight":
45173			[centerX, centerY] = [w, h / 2];
45174			break;
45175		case "topCenter":
45176			[centerX, centerY] = [w / 2, 0];
45177			break;
45178		case "topRight":
45179			[centerX, centerY] = [w, 0];
45180			break;
45181	}
45182	let x, y;
45183	switch (node.rotate || 0) {
45184		case 0:
45185			[x, y] = [-centerX, -centerY];
45186			break;
45187		case 90:
45188			[x, y] = [-centerY, centerX];
45189			[w, h] = [h, -w];
45190			break;
45191		case 180:
45192			[x, y] = [centerX, centerY];
45193			[w, h] = [-w, -h];
45194			break;
45195		case 270:
45196			[x, y] = [centerY, -centerX];
45197			[w, h] = [-h, w];
45198			break;
45199	}
45200	return [node.x + x + Math.min(0, w), node.y + y + Math.min(0, h), Math.abs(w), Math.abs(h)];
45201}
45202function checkDimensions(node, space) {
45203	if (node[$getTemplateRoot]()[$extra].firstUnsplittable === null) {
45204		return true;
45205	}
45206	if (node.w === 0 || node.h === 0) {
45207		return true;
45208	}
45209	const ERROR = 2;
45210	const parent = node[$getSubformParent]();
45211	const attempt = parent[$extra]?.attempt || 0;
45212	const [, y, w, h] = getTransformedBBox(node);
45213	switch (parent.layout) {
45214		case "lr-tb":
45215		case "rl-tb":
45216			if (attempt === 0) {
45217				if (!node[$getTemplateRoot]()[$extra].noLayoutFailure) {
45218					if (node.h !== "" && Math.round(h - space.height) > ERROR) {
45219						return false;
45220					}
45221					if (node.w !== "") {
45222						if (Math.round(w - space.width) <= ERROR) {
45223							return true;
45224						}
45225						if (parent[$extra].numberInLine === 0) {
45226							return space.height > ERROR;
45227						}
45228						return false;
45229					}
45230					return space.width > ERROR;
45231				}
45232				if (node.w !== "") {
45233					return Math.round(w - space.width) <= ERROR;
45234				}
45235				return space.width > ERROR;
45236			}
45237			if (node[$getTemplateRoot]()[$extra].noLayoutFailure) {
45238				return true;
45239			}
45240			if (node.h !== "" && Math.round(h - space.height) > ERROR) {
45241				return false;
45242			}
45243			if (node.w === "" || Math.round(w - space.width) <= ERROR) {
45244				return space.height > ERROR;
45245			}
45246			if (parent[$isThereMoreWidth]()) {
45247				return false;
45248			}
45249			return space.height > ERROR;
45250		case "table":
45251		case "tb":
45252			if (node[$getTemplateRoot]()[$extra].noLayoutFailure) {
45253				return true;
45254			}
45255			if (node.h !== "" && !node[$isSplittable]()) {
45256				return Math.round(h - space.height) <= ERROR;
45257			}
45258			if (node.w === "" || Math.round(w - space.width) <= ERROR) {
45259				return space.height > ERROR;
45260			}
45261			if (parent[$isThereMoreWidth]()) {
45262				return false;
45263			}
45264			return space.height > ERROR;
45265		case "position":
45266			if (node[$getTemplateRoot]()[$extra].noLayoutFailure) {
45267				return true;
45268			}
45269			if (node.h === "" || Math.round(h + y - space.height) <= ERROR) {
45270				return true;
45271			}
45272			const area = node[$getTemplateRoot]()[$extra].currentContentArea;
45273			return h + y > area.h;
vendor: 4,294 bytes, lines 45274-45463
45274		case "rl-row":
45275		case "row":
45276			if (node[$getTemplateRoot]()[$extra].noLayoutFailure) {
45277				return true;
45278			}
45279			if (node.h !== "") {
45280				return Math.round(h - space.height) <= ERROR;
45281			}
45282			return true;
45283		default:
45284			return true;
45285	}
45286}
45287
45288;// ./src/core/xfa/template.js
45289
45290
45291
45292
45293
45294
45295
45296
45297
45298
45299
45300
45301
45302
45303
45304
45305
45306
45307
45308
45309
45310
45311
45312
45313
45314
45315
45316
45317
45318const TEMPLATE_NS_ID = NamespaceIds.template.id;
45319const SVG_NS = "http://www.w3.org/2000/svg";
45320const MAX_ATTEMPTS_FOR_LRTB_LAYOUT = 2;
45321const MAX_EMPTY_PAGES = 3;
45322const DEFAULT_TAB_INDEX = 5000;
45323const HEADING_PATTERN = /^H(\d+)$/;
45324const MIMES = new Set(["image/gif", "image/jpeg", "image/jpg", "image/pjpeg", "image/png", "image/apng", "image/x-png", "image/bmp", "image/x-ms-bmp", "image/tiff", "image/tif", "application/octet-stream"]);
45325const IMAGES_HEADERS = [[[0x42, 0x4d], "image/bmp"], [[0xff, 0xd8, 0xff], "image/jpeg"], [[0x49, 0x49, 0x2a, 0x00], "image/tiff"], [[0x4d, 0x4d, 0x00, 0x2a], "image/tiff"], [[0x47, 0x49, 0x46, 0x38, 0x39, 0x61], "image/gif"], [[0x89, 0x50, 0x4e, 0x47, 0x0d, 0x0a, 0x1a, 0x0a], "image/png"]];
45326function getBorderDims(node) {
45327	if (!node || !node.border) {
45328		return {
45329			w: 0,
45330			h: 0
45331		};
45332	}
45333	const borderExtra = node.border[$getExtra]();
45334	if (!borderExtra) {
45335		return {
45336			w: 0,
45337			h: 0
45338		};
45339	}
45340	return {
45341		w: borderExtra.widths[0] + borderExtra.widths[2] + borderExtra.insets[0] + borderExtra.insets[2],
45342		h: borderExtra.widths[1] + borderExtra.widths[3] + borderExtra.insets[1] + borderExtra.insets[3]
45343	};
45344}
45345function hasMargin(node) {
45346	return node.margin && (node.margin.topInset || node.margin.rightInset || node.margin.bottomInset || node.margin.leftInset);
45347}
45348function _setValue(templateNode, value) {
45349	if (!templateNode.value) {
45350		const nodeValue = new Value({});
45351		templateNode[$appendChild](nodeValue);
45352		templateNode.value = nodeValue;
45353	}
45354	templateNode.value[$setValue](value);
45355}
45356function* getContainedChildren(node) {
45357	for (const child of node[$getChildren]()) {
45358		if (child instanceof SubformSet) {
45359			yield* child[$getContainedChildren]();
45360			continue;
45361		}
45362		yield child;
45363	}
45364}
45365function isRequired(node) {
45366	return node.validate?.nullTest === "error";
45367}
45368function setTabIndex(node) {
45369	while (node) {
45370		if (!node.traversal) {
45371			node[$tabIndex] = node[$getParent]()[$tabIndex];
45372			return;
45373		}
45374		if (node[$tabIndex]) {
45375			return;
45376		}
45377		let next = null;
45378		for (const child of node.traversal[$getChildren]()) {
45379			if (child.operation === "next") {
45380				next = child;
45381				break;
45382			}
45383		}
45384		if (!next || !next.ref) {
45385			node[$tabIndex] = node[$getParent]()[$tabIndex];
45386			return;
45387		}
45388		const root = node[$getTemplateRoot]();
45389		node[$tabIndex] = ++root[$tabIndex];
45390		const ref = root[$searchNode](next.ref, node);
45391		if (!ref) {
45392			return;
45393		}
45394		node = ref[0];
45395	}
45396}
45397function applyAssist(obj, attributes) {
45398	const assist = obj.assist;
45399	if (assist) {
45400		const assistTitle = assist[$toHTML]();
45401		if (assistTitle) {
45402			attributes.title = assistTitle;
45403		}
45404		const role = assist.role;
45405		const match = role.match(HEADING_PATTERN);
45406		if (match) {
45407			const ariaRole = "heading";
45408			const ariaLevel = match[1];
45409			attributes.role = ariaRole;
45410			attributes["aria-level"] = ariaLevel;
45411		}
45412	}
45413	if (obj.layout === "table") {
45414		attributes.role = "table";
45415	} else if (obj.layout === "row") {
45416		attributes.role = "row";
45417	} else {
45418		const parent = obj[$getParent]();
45419		if (parent.layout === "row") {
45420			attributes.role = parent.assist?.role === "TH" ? "columnheader" : "cell";
45421		}
45422	}
45423}
45424function ariaLabel(obj) {
45425	if (!obj.assist) {
45426		return null;
45427	}
45428	const assist = obj.assist;
45429	if (assist.speak && assist.speak[$content] !== "") {
45430		return assist.speak[$content];
45431	}
45432	if (assist.toolTip) {
45433		return assist.toolTip[$content];
45434	}
45435	return null;
45436}
45437function valueToHtml(value) {
45438	return HTMLResult.success({
45439		name: "div",
45440		attributes: {
45441			class: ["xfaRich"],
45442			style: Object.create(null)
45443		},
45444		children: [{
45445			name: "span",
45446			attributes: {
45447				style: Object.create(null)
45448			},
45449			value
45450		}]
45451	});
45452}
45453function setFirstUnsplittable(node) {
45454	const root = node[$getTemplateRoot]();
45455	if (root[$extra].firstUnsplittable === null) {
45456		root[$extra].firstUnsplittable = node;
45457		root[$extra].noLayoutFailure = true;
45458	}
45459}
45460function unsetFirstUnsplittable(node) {
45461	const root = node[$getTemplateRoot]();
45462	if (root[$extra].firstUnsplittable === node) {
45463		root[$extra].noLayoutFailure = false;
vendor: 53,740 bytes, lines 45464-47248
45464	}
45465}
45466function handleBreak(node) {
45467	if (node[$extra]) {
45468		return false;
45469	}
45470	node[$extra] = Object.create(null);
45471	if (node.targetType === "auto") {
45472		return false;
45473	}
45474	const root = node[$getTemplateRoot]();
45475	let target = null;
45476	if (node.target) {
45477		target = root[$searchNode](node.target, node[$getParent]());
45478		if (!target) {
45479			return false;
45480		}
45481		target = target[0];
45482	}
45483	const {
45484		currentPageArea,
45485		currentContentArea
45486	} = root[$extra];
45487	if (node.targetType === "pageArea") {
45488		if (!(target instanceof PageArea)) {
45489			target = null;
45490		}
45491		if (node.startNew) {
45492			node[$extra].target = target || currentPageArea;
45493			return true;
45494		} else if (target && target !== currentPageArea) {
45495			node[$extra].target = target;
45496			return true;
45497		}
45498		return false;
45499	}
45500	if (!(target instanceof ContentArea)) {
45501		target = null;
45502	}
45503	const pageArea = target && target[$getParent]();
45504	let index;
45505	let nextPageArea = pageArea;
45506	if (node.startNew) {
45507		if (target) {
45508			const contentAreas = pageArea.contentArea.children;
45509			const indexForCurrent = contentAreas.indexOf(currentContentArea);
45510			const indexForTarget = contentAreas.indexOf(target);
45511			if (indexForCurrent !== -1 && indexForCurrent < indexForTarget) {
45512				nextPageArea = null;
45513			}
45514			index = indexForTarget - 1;
45515		} else {
45516			index = currentPageArea.contentArea.children.indexOf(currentContentArea);
45517		}
45518	} else if (target && target !== currentContentArea) {
45519		const contentAreas = pageArea.contentArea.children;
45520		index = contentAreas.indexOf(target) - 1;
45521		nextPageArea = pageArea === currentPageArea ? null : pageArea;
45522	} else {
45523		return false;
45524	}
45525	node[$extra].target = nextPageArea;
45526	node[$extra].index = index;
45527	return true;
45528}
45529function handleOverflow(node, extraNode, space) {
45530	const root = node[$getTemplateRoot]();
45531	const saved = root[$extra].noLayoutFailure;
45532	const savedMethod = extraNode[$getSubformParent];
45533	extraNode[$getSubformParent] = () => node;
45534	root[$extra].noLayoutFailure = true;
45535	const res = extraNode[$toHTML](space);
45536	node[$addHTML](res.html, res.bbox);
45537	root[$extra].noLayoutFailure = saved;
45538	extraNode[$getSubformParent] = savedMethod;
45539}
45540class AppearanceFilter extends StringObject {
45541	constructor(attributes) {
45542		super(TEMPLATE_NS_ID, "appearanceFilter");
45543		this.id = attributes.id || "";
45544		this.type = getStringOption(attributes.type, ["optional", "required"]);
45545		this.use = attributes.use || "";
45546		this.usehref = attributes.usehref || "";
45547	}
45548}
45549class Arc extends XFAObject {
45550	constructor(attributes) {
45551		super(TEMPLATE_NS_ID, "arc", true);
45552		this.circular = getInteger({
45553			data: attributes.circular,
45554			defaultValue: 0,
45555			validate: x => x === 1
45556		});
45557		this.hand = getStringOption(attributes.hand, ["even", "left", "right"]);
45558		this.id = attributes.id || "";
45559		this.startAngle = getFloat({
45560			data: attributes.startAngle,
45561			defaultValue: 0,
45562			validate: x => true
45563		});
45564		this.sweepAngle = getFloat({
45565			data: attributes.sweepAngle,
45566			defaultValue: 360,
45567			validate: x => true
45568		});
45569		this.use = attributes.use || "";
45570		this.usehref = attributes.usehref || "";
45571		this.edge = null;
45572		this.fill = null;
45573	}
45574	[$toHTML]() {
45575		const edge = this.edge || new Edge({});
45576		const edgeStyle = edge[$toStyle]();
45577		const style = Object.create(null);
45578		if (this.fill?.presence === "visible") {
45579			Object.assign(style, this.fill[$toStyle]());
45580		} else {
45581			style.fill = "transparent";
45582		}
45583		style.strokeWidth = measureToString(edge.presence === "visible" ? edge.thickness : 0);
45584		style.stroke = edgeStyle.color;
45585		let arc;
45586		const attributes = {
45587			xmlns: SVG_NS,
45588			style: {
45589				width: "100%",
45590				height: "100%",
45591				overflow: "visible"
45592			}
45593		};
45594		if (this.sweepAngle === 360) {
45595			arc = {
45596				name: "ellipse",
45597				attributes: {
45598					xmlns: SVG_NS,
45599					cx: "50%",
45600					cy: "50%",
45601					rx: "50%",
45602					ry: "50%",
45603					style
45604				}
45605			};
45606		} else {
45607			const startAngle = this.startAngle * Math.PI / 180;
45608			const sweepAngle = this.sweepAngle * Math.PI / 180;
45609			const largeArc = this.sweepAngle > 180 ? 1 : 0;
45610			const [x1, y1, x2, y2] = [50 * (1 + Math.cos(startAngle)), 50 * (1 - Math.sin(startAngle)), 50 * (1 + Math.cos(startAngle + sweepAngle)), 50 * (1 - Math.sin(startAngle + sweepAngle))];
45611			arc = {
45612				name: "path",
45613				attributes: {
45614					xmlns: SVG_NS,
45615					d: `M ${x1} ${y1} A 50 50 0 ${largeArc} 0 ${x2} ${y2}`,
45616					vectorEffect: "non-scaling-stroke",
45617					style
45618				}
45619			};
45620			Object.assign(attributes, {
45621				viewBox: "0 0 100 100",
45622				preserveAspectRatio: "none"
45623			});
45624		}
45625		const svg = {
45626			name: "svg",
45627			children: [arc],
45628			attributes
45629		};
45630		const parent = this[$getParent]()[$getParent]();
45631		if (hasMargin(parent)) {
45632			return HTMLResult.success({
45633				name: "div",
45634				attributes: {
45635					style: {
45636						display: "inline",
45637						width: "100%",
45638						height: "100%"
45639					}
45640				},
45641				children: [svg]
45642			});
45643		}
45644		svg.attributes.style.position = "absolute";
45645		return HTMLResult.success(svg);
45646	}
45647}
45648class Area extends XFAObject {
45649	constructor(attributes) {
45650		super(TEMPLATE_NS_ID, "area", true);
45651		this.colSpan = getInteger({
45652			data: attributes.colSpan,
45653			defaultValue: 1,
45654			validate: n => n >= 1 || n === -1
45655		});
45656		this.id = attributes.id || "";
45657		this.name = attributes.name || "";
45658		this.relevant = getRelevant(attributes.relevant);
45659		this.use = attributes.use || "";
45660		this.usehref = attributes.usehref || "";
45661		this.x = getMeasurement(attributes.x, "0pt");
45662		this.y = getMeasurement(attributes.y, "0pt");
45663		this.desc = null;
45664		this.extras = null;
45665		this.area = new XFAObjectArray();
45666		this.draw = new XFAObjectArray();
45667		this.exObject = new XFAObjectArray();
45668		this.exclGroup = new XFAObjectArray();
45669		this.field = new XFAObjectArray();
45670		this.subform = new XFAObjectArray();
45671		this.subformSet = new XFAObjectArray();
45672	}
45673	*[$getContainedChildren]() {
45674		yield* getContainedChildren(this);
45675	}
45676	[$isTransparent]() {
45677		return true;
45678	}
45679	[$isBindable]() {
45680		return true;
45681	}
45682	[$addHTML](html, bbox) {
45683		const [x, y, w, h] = bbox;
45684		this[$extra].width = Math.max(this[$extra].width, x + w);
45685		this[$extra].height = Math.max(this[$extra].height, y + h);
45686		this[$extra].children.push(html);
45687	}
45688	[$getAvailableSpace]() {
45689		return this[$extra].availableSpace;
45690	}
45691	[$toHTML](availableSpace) {
45692		const style = toStyle(this, "position");
45693		const attributes = {
45694			style,
45695			id: this[$uid],
45696			class: ["xfaArea"]
45697		};
45698		if (isPrintOnly(this)) {
45699			attributes.class.push("xfaPrintOnly");
45700		}
45701		if (this.name) {
45702			attributes.xfaName = this.name;
45703		}
45704		const children = [];
45705		this[$extra] = {
45706			children,
45707			width: 0,
45708			height: 0,
45709			availableSpace
45710		};
45711		const result = this[$childrenToHTML]({
45712			filter: new Set(["area", "draw", "field", "exclGroup", "subform", "subformSet"]),
45713			include: true
45714		});
45715		if (!result.success) {
45716			if (result.isBreak()) {
45717				return result;
45718			}
45719			delete this[$extra];
45720			return HTMLResult.FAILURE;
45721		}
45722		style.width = measureToString(this[$extra].width);
45723		style.height = measureToString(this[$extra].height);
45724		const html = {
45725			name: "div",
45726			attributes,
45727			children
45728		};
45729		const bbox = [this.x, this.y, this[$extra].width, this[$extra].height];
45730		delete this[$extra];
45731		return HTMLResult.success(html, bbox);
45732	}
45733}
45734class Assist extends XFAObject {
45735	constructor(attributes) {
45736		super(TEMPLATE_NS_ID, "assist", true);
45737		this.id = attributes.id || "";
45738		this.role = attributes.role || "";
45739		this.use = attributes.use || "";
45740		this.usehref = attributes.usehref || "";
45741		this.speak = null;
45742		this.toolTip = null;
45743	}
45744	[$toHTML]() {
45745		return this.toolTip?.[$content] || null;
45746	}
45747}
45748class Barcode extends XFAObject {
45749	constructor(attributes) {
45750		super(TEMPLATE_NS_ID, "barcode", true);
45751		this.charEncoding = getKeyword({
45752			data: attributes.charEncoding ? attributes.charEncoding.toLowerCase() : "",
45753			defaultValue: "",
45754			validate: k => ["utf-8", "big-five", "fontspecific", "gbk", "gb-18030", "gb-2312", "ksc-5601", "none", "shift-jis", "ucs-2", "utf-16"].includes(k) || k.match(/iso-8859-\d{2}/)
45755		});
45756		this.checksum = getStringOption(attributes.checksum, ["none", "1mod10", "1mod10_1mod11", "2mod10", "auto"]);
45757		this.dataColumnCount = getInteger({
45758			data: attributes.dataColumnCount,
45759			defaultValue: -1,
45760			validate: x => x >= 0
45761		});
45762		this.dataLength = getInteger({
45763			data: attributes.dataLength,
45764			defaultValue: -1,
45765			validate: x => x >= 0
45766		});
45767		this.dataPrep = getStringOption(attributes.dataPrep, ["none", "flateCompress"]);
45768		this.dataRowCount = getInteger({
45769			data: attributes.dataRowCount,
45770			defaultValue: -1,
45771			validate: x => x >= 0
45772		});
45773		this.endChar = attributes.endChar || "";
45774		this.errorCorrectionLevel = getInteger({
45775			data: attributes.errorCorrectionLevel,
45776			defaultValue: -1,
45777			validate: x => x >= 0 && x <= 8
45778		});
45779		this.id = attributes.id || "";
45780		this.moduleHeight = getMeasurement(attributes.moduleHeight, "5mm");
45781		this.moduleWidth = getMeasurement(attributes.moduleWidth, "0.25mm");
45782		this.printCheckDigit = getInteger({
45783			data: attributes.printCheckDigit,
45784			defaultValue: 0,
45785			validate: x => x === 1
45786		});
45787		this.rowColumnRatio = getRatio(attributes.rowColumnRatio);
45788		this.startChar = attributes.startChar || "";
45789		this.textLocation = getStringOption(attributes.textLocation, ["below", "above", "aboveEmbedded", "belowEmbedded", "none"]);
45790		this.truncate = getInteger({
45791			data: attributes.truncate,
45792			defaultValue: 0,
45793			validate: x => x === 1
45794		});
45795		this.type = getStringOption(attributes.type ? attributes.type.toLowerCase() : "", ["aztec", "codabar", "code2of5industrial", "code2of5interleaved", "code2of5matrix", "code2of5standard", "code3of9", "code3of9extended", "code11", "code49", "code93", "code128", "code128a", "code128b", "code128c", "code128sscc", "datamatrix", "ean8", "ean8add2", "ean8add5", "ean13", "ean13add2", "ean13add5", "ean13pwcd", "fim", "logmars", "maxicode", "msi", "pdf417", "pdf417macro", "plessey", "postauscust2", "postauscust3", "postausreplypaid", "postausstandard", "postukrm4scc", "postusdpbc", "postusimb", "postusstandard", "postus5zip", "qrcode", "rfid", "rss14", "rss14expanded", "rss14limited", "rss14stacked", "rss14stackedomni", "rss14truncated", "telepen", "ucc128", "ucc128random", "ucc128sscc", "upca", "upcaadd2", "upcaadd5", "upcapwcd", "upce", "upceadd2", "upceadd5", "upcean2", "upcean5", "upsmaxicode"]);
45796		this.upsMode = getStringOption(attributes.upsMode, ["usCarrier", "internationalCarrier", "secureSymbol", "standardSymbol"]);
45797		this.use = attributes.use || "";
45798		this.usehref = attributes.usehref || "";
45799		this.wideNarrowRatio = getRatio(attributes.wideNarrowRatio);
45800		this.encrypt = null;
45801		this.extras = null;
45802	}
45803}
45804class Bind extends XFAObject {
45805	constructor(attributes) {
45806		super(TEMPLATE_NS_ID, "bind", true);
45807		this.match = getStringOption(attributes.match, ["once", "dataRef", "global", "none"]);
45808		this.ref = attributes.ref || "";
45809		this.picture = null;
45810	}
45811}
45812class BindItems extends XFAObject {
45813	constructor(attributes) {
45814		super(TEMPLATE_NS_ID, "bindItems");
45815		this.connection = attributes.connection || "";
45816		this.labelRef = attributes.labelRef || "";
45817		this.ref = attributes.ref || "";
45818		this.valueRef = attributes.valueRef || "";
45819	}
45820}
45821class Bookend extends XFAObject {
45822	constructor(attributes) {
45823		super(TEMPLATE_NS_ID, "bookend");
45824		this.id = attributes.id || "";
45825		this.leader = attributes.leader || "";
45826		this.trailer = attributes.trailer || "";
45827		this.use = attributes.use || "";
45828		this.usehref = attributes.usehref || "";
45829	}
45830}
45831class BooleanElement extends Option01 {
45832	constructor(attributes) {
45833		super(TEMPLATE_NS_ID, "boolean");
45834		this.id = attributes.id || "";
45835		this.name = attributes.name || "";
45836		this.use = attributes.use || "";
45837		this.usehref = attributes.usehref || "";
45838	}
45839	[$toHTML](availableSpace) {
45840		return valueToHtml(this[$content] === 1 ? "1" : "0");
45841	}
45842}
45843class Border extends XFAObject {
45844	constructor(attributes) {
45845		super(TEMPLATE_NS_ID, "border", true);
45846		this.break = getStringOption(attributes.break, ["close", "open"]);
45847		this.hand = getStringOption(attributes.hand, ["even", "left", "right"]);
45848		this.id = attributes.id || "";
45849		this.presence = getStringOption(attributes.presence, ["visible", "hidden", "inactive", "invisible"]);
45850		this.relevant = getRelevant(attributes.relevant);
45851		this.use = attributes.use || "";
45852		this.usehref = attributes.usehref || "";
45853		this.corner = new XFAObjectArray(4);
45854		this.edge = new XFAObjectArray(4);
45855		this.extras = null;
45856		this.fill = null;
45857		this.margin = null;
45858	}
45859	[$getExtra]() {
45860		if (!this[$extra]) {
45861			const edges = this.edge.children.slice();
45862			if (edges.length < 4) {
45863				const defaultEdge = edges.at(-1) || new Edge({});
45864				for (let i = edges.length; i < 4; i++) {
45865					edges.push(defaultEdge);
45866				}
45867			}
45868			const widths = edges.map(edge => edge.thickness);
45869			const insets = [0, 0, 0, 0];
45870			if (this.margin) {
45871				insets[0] = this.margin.topInset;
45872				insets[1] = this.margin.rightInset;
45873				insets[2] = this.margin.bottomInset;
45874				insets[3] = this.margin.leftInset;
45875			}
45876			this[$extra] = {
45877				widths,
45878				insets,
45879				edges
45880			};
45881		}
45882		return this[$extra];
45883	}
45884	[$toStyle]() {
45885		const {
45886			edges
45887		} = this[$getExtra]();
45888		const edgeStyles = edges.map(node => {
45889			const style = node[$toStyle]();
45890			style.color ||= "#000000";
45891			return style;
45892		});
45893		const style = Object.create(null);
45894		if (this.margin) {
45895			Object.assign(style, this.margin[$toStyle]());
45896		}
45897		if (this.fill?.presence === "visible") {
45898			Object.assign(style, this.fill[$toStyle]());
45899		}
45900		if (this.corner.children.some(node => node.radius !== 0)) {
45901			const cornerStyles = this.corner.children.map(node => node[$toStyle]());
45902			if (cornerStyles.length === 2 || cornerStyles.length === 3) {
45903				const last = cornerStyles.at(-1);
45904				for (let i = cornerStyles.length; i < 4; i++) {
45905					cornerStyles.push(last);
45906				}
45907			}
45908			style.borderRadius = cornerStyles.map(s => s.radius).join(" ");
45909		}
45910		switch (this.presence) {
45911			case "invisible":
45912			case "hidden":
45913				style.borderStyle = "";
45914				break;
45915			case "inactive":
45916				style.borderStyle = "none";
45917				break;
45918			default:
45919				style.borderStyle = edgeStyles.map(s => s.style).join(" ");
45920				break;
45921		}
45922		style.borderWidth = edgeStyles.map(s => s.width).join(" ");
45923		style.borderColor = edgeStyles.map(s => s.color).join(" ");
45924		return style;
45925	}
45926}
45927class Break extends XFAObject {
45928	constructor(attributes) {
45929		super(TEMPLATE_NS_ID, "break", true);
45930		this.after = getStringOption(attributes.after, ["auto", "contentArea", "pageArea", "pageEven", "pageOdd"]);
45931		this.afterTarget = attributes.afterTarget || "";
45932		this.before = getStringOption(attributes.before, ["auto", "contentArea", "pageArea", "pageEven", "pageOdd"]);
45933		this.beforeTarget = attributes.beforeTarget || "";
45934		this.bookendLeader = attributes.bookendLeader || "";
45935		this.bookendTrailer = attributes.bookendTrailer || "";
45936		this.id = attributes.id || "";
45937		this.overflowLeader = attributes.overflowLeader || "";
45938		this.overflowTarget = attributes.overflowTarget || "";
45939		this.overflowTrailer = attributes.overflowTrailer || "";
45940		this.startNew = getInteger({
45941			data: attributes.startNew,
45942			defaultValue: 0,
45943			validate: x => x === 1
45944		});
45945		this.use = attributes.use || "";
45946		this.usehref = attributes.usehref || "";
45947		this.extras = null;
45948	}
45949}
45950class BreakAfter extends XFAObject {
45951	constructor(attributes) {
45952		super(TEMPLATE_NS_ID, "breakAfter", true);
45953		this.id = attributes.id || "";
45954		this.leader = attributes.leader || "";
45955		this.startNew = getInteger({
45956			data: attributes.startNew,
45957			defaultValue: 0,
45958			validate: x => x === 1
45959		});
45960		this.target = attributes.target || "";
45961		this.targetType = getStringOption(attributes.targetType, ["auto", "contentArea", "pageArea"]);
45962		this.trailer = attributes.trailer || "";
45963		this.use = attributes.use || "";
45964		this.usehref = attributes.usehref || "";
45965		this.script = null;
45966	}
45967}
45968class BreakBefore extends XFAObject {
45969	constructor(attributes) {
45970		super(TEMPLATE_NS_ID, "breakBefore", true);
45971		this.id = attributes.id || "";
45972		this.leader = attributes.leader || "";
45973		this.startNew = getInteger({
45974			data: attributes.startNew,
45975			defaultValue: 0,
45976			validate: x => x === 1
45977		});
45978		this.target = attributes.target || "";
45979		this.targetType = getStringOption(attributes.targetType, ["auto", "contentArea", "pageArea"]);
45980		this.trailer = attributes.trailer || "";
45981		this.use = attributes.use || "";
45982		this.usehref = attributes.usehref || "";
45983		this.script = null;
45984	}
45985	[$toHTML](availableSpace) {
45986		this[$extra] = {};
45987		return HTMLResult.FAILURE;
45988	}
45989}
45990class Button extends XFAObject {
45991	constructor(attributes) {
45992		super(TEMPLATE_NS_ID, "button", true);
45993		this.highlight = getStringOption(attributes.highlight, ["inverted", "none", "outline", "push"]);
45994		this.id = attributes.id || "";
45995		this.use = attributes.use || "";
45996		this.usehref = attributes.usehref || "";
45997		this.extras = null;
45998	}
45999	[$toHTML](availableSpace) {
46000		const parent = this[$getParent]();
46001		const grandpa = parent[$getParent]();
46002		const htmlButton = {
46003			name: "button",
46004			attributes: {
46005				id: this[$uid],
46006				class: ["xfaButton"],
46007				style: {}
46008			},
46009			children: []
46010		};
46011		for (const event of grandpa.event.children) {
46012			if (event.activity !== "click" || !event.script) {
46013				continue;
46014			}
46015			const jsURL = recoverJsURL(event.script[$content]);
46016			if (!jsURL) {
46017				continue;
46018			}
46019			const href = fixURL(jsURL.url);
46020			if (!href) {
46021				continue;
46022			}
46023			htmlButton.children.push({
46024				name: "a",
46025				attributes: {
46026					id: "link" + this[$uid],
46027					href,
46028					newWindow: jsURL.newWindow,
46029					class: ["xfaLink"],
46030					style: {}
46031				},
46032				children: []
46033			});
46034		}
46035		return HTMLResult.success(htmlButton);
46036	}
46037}
46038class Calculate extends XFAObject {
46039	constructor(attributes) {
46040		super(TEMPLATE_NS_ID, "calculate", true);
46041		this.id = attributes.id || "";
46042		this.override = getStringOption(attributes.override, ["disabled", "error", "ignore", "warning"]);
46043		this.use = attributes.use || "";
46044		this.usehref = attributes.usehref || "";
46045		this.extras = null;
46046		this.message = null;
46047		this.script = null;
46048	}
46049}
46050class Caption extends XFAObject {
46051	constructor(attributes) {
46052		super(TEMPLATE_NS_ID, "caption", true);
46053		this.id = attributes.id || "";
46054		this.placement = getStringOption(attributes.placement, ["left", "bottom", "inline", "right", "top"]);
46055		this.presence = getStringOption(attributes.presence, ["visible", "hidden", "inactive", "invisible"]);
46056		this.reserve = Math.ceil(getMeasurement(attributes.reserve));
46057		this.use = attributes.use || "";
46058		this.usehref = attributes.usehref || "";
46059		this.extras = null;
46060		this.font = null;
46061		this.margin = null;
46062		this.para = null;
46063		this.value = null;
46064	}
46065	[$setValue](value) {
46066		_setValue(this, value);
46067	}
46068	[$getExtra](availableSpace) {
46069		if (!this[$extra]) {
46070			let {
46071				width,
46072				height
46073			} = availableSpace;
46074			switch (this.placement) {
46075				case "left":
46076				case "right":
46077				case "inline":
46078					width = this.reserve <= 0 ? width : this.reserve;
46079					break;
46080				case "top":
46081				case "bottom":
46082					height = this.reserve <= 0 ? height : this.reserve;
46083					break;
46084			}
46085			this[$extra] = layoutNode(this, {
46086				width,
46087				height
46088			});
46089		}
46090		return this[$extra];
46091	}
46092	[$toHTML](availableSpace) {
46093		if (!this.value) {
46094			return HTMLResult.EMPTY;
46095		}
46096		this[$pushPara]();
46097		const value = this.value[$toHTML](availableSpace).html;
46098		if (!value) {
46099			this[$popPara]();
46100			return HTMLResult.EMPTY;
46101		}
46102		const savedReserve = this.reserve;
46103		if (this.reserve <= 0) {
46104			const {
46105				w,
46106				h
46107			} = this[$getExtra](availableSpace);
46108			switch (this.placement) {
46109				case "left":
46110				case "right":
46111				case "inline":
46112					this.reserve = w;
46113					break;
46114				case "top":
46115				case "bottom":
46116					this.reserve = h;
46117					break;
46118			}
46119		}
46120		const children = [];
46121		if (typeof value === "string") {
46122			children.push({
46123				name: "#text",
46124				value
46125			});
46126		} else {
46127			children.push(value);
46128		}
46129		const style = toStyle(this, "font", "margin", "visibility");
46130		switch (this.placement) {
46131			case "left":
46132			case "right":
46133				if (this.reserve > 0) {
46134					style.width = measureToString(this.reserve);
46135				}
46136				break;
46137			case "top":
46138			case "bottom":
46139				if (this.reserve > 0) {
46140					style.height = measureToString(this.reserve);
46141				}
46142				break;
46143		}
46144		setPara(this, null, value);
46145		this[$popPara]();
46146		this.reserve = savedReserve;
46147		return HTMLResult.success({
46148			name: "div",
46149			attributes: {
46150				style,
46151				class: ["xfaCaption"]
46152			},
46153			children
46154		});
46155	}
46156}
46157class Certificate extends StringObject {
46158	constructor(attributes) {
46159		super(TEMPLATE_NS_ID, "certificate");
46160		this.id = attributes.id || "";
46161		this.name = attributes.name || "";
46162		this.use = attributes.use || "";
46163		this.usehref = attributes.usehref || "";
46164	}
46165}
46166class Certificates extends XFAObject {
46167	constructor(attributes) {
46168		super(TEMPLATE_NS_ID, "certificates", true);
46169		this.credentialServerPolicy = getStringOption(attributes.credentialServerPolicy, ["optional", "required"]);
46170		this.id = attributes.id || "";
46171		this.url = attributes.url || "";
46172		this.urlPolicy = attributes.urlPolicy || "";
46173		this.use = attributes.use || "";
46174		this.usehref = attributes.usehref || "";
46175		this.encryption = null;
46176		this.issuers = null;
46177		this.keyUsage = null;
46178		this.oids = null;
46179		this.signing = null;
46180		this.subjectDNs = null;
46181	}
46182}
46183class CheckButton extends XFAObject {
46184	constructor(attributes) {
46185		super(TEMPLATE_NS_ID, "checkButton", true);
46186		this.id = attributes.id || "";
46187		this.mark = getStringOption(attributes.mark, ["default", "check", "circle", "cross", "diamond", "square", "star"]);
46188		this.shape = getStringOption(attributes.shape, ["square", "round"]);
46189		this.size = getMeasurement(attributes.size, "10pt");
46190		this.use = attributes.use || "";
46191		this.usehref = attributes.usehref || "";
46192		this.border = null;
46193		this.extras = null;
46194		this.margin = null;
46195	}
46196	[$toHTML](availableSpace) {
46197		const style = toStyle("margin");
46198		const size = measureToString(this.size);
46199		style.width = style.height = size;
46200		let type;
46201		let className;
46202		let groupId;
46203		const field = this[$getParent]()[$getParent]();
46204		const items = field.items.children.length && field.items.children[0][$toHTML]().html || [];
46205		const exportedValue = {
46206			on: (items[0] !== undefined ? items[0] : "on").toString(),
46207			off: (items[1] !== undefined ? items[1] : "off").toString()
46208		};
46209		const value = field.value?.[$text]() || "off";
46210		const checked = value === exportedValue.on || undefined;
46211		const container = field[$getSubformParent]();
46212		const fieldId = field[$uid];
46213		let dataId;
46214		if (container instanceof ExclGroup) {
46215			groupId = container[$uid];
46216			type = "radio";
46217			className = "xfaRadio";
46218			dataId = container[$data]?.[$uid] || container[$uid];
46219		} else {
46220			type = "checkbox";
46221			className = "xfaCheckbox";
46222			dataId = field[$data]?.[$uid] || field[$uid];
46223		}
46224		const input = {
46225			name: "input",
46226			attributes: {
46227				class: [className],
46228				style,
46229				fieldId,
46230				dataId,
46231				type,
46232				checked,
46233				xfaOn: exportedValue.on,
46234				xfaOff: exportedValue.off,
46235				"aria-label": ariaLabel(field),
46236				"aria-required": false
46237			}
46238		};
46239		if (groupId) {
46240			input.attributes.name = groupId;
46241		}
46242		if (isRequired(field)) {
46243			input.attributes["aria-required"] = true;
46244			input.attributes.required = true;
46245		}
46246		return HTMLResult.success({
46247			name: "label",
46248			attributes: {
46249				class: ["xfaLabel"]
46250			},
46251			children: [input]
46252		});
46253	}
46254}
46255class ChoiceList extends XFAObject {
46256	constructor(attributes) {
46257		super(TEMPLATE_NS_ID, "choiceList", true);
46258		this.commitOn = getStringOption(attributes.commitOn, ["select", "exit"]);
46259		this.id = attributes.id || "";
46260		this.open = getStringOption(attributes.open, ["userControl", "always", "multiSelect", "onEntry"]);
46261		this.textEntry = getInteger({
46262			data: attributes.textEntry,
46263			defaultValue: 0,
46264			validate: x => x === 1
46265		});
46266		this.use = attributes.use || "";
46267		this.usehref = attributes.usehref || "";
46268		this.border = null;
46269		this.extras = null;
46270		this.margin = null;
46271	}
46272	[$toHTML](availableSpace) {
46273		const style = toStyle(this, "border", "margin");
46274		const ui = this[$getParent]();
46275		const field = ui[$getParent]();
46276		const fontSize = field.font?.size || 10;
46277		const optionStyle = {
46278			fontSize: `calc(${fontSize}px * var(--scale-factor))`
46279		};
46280		const children = [];
46281		if (field.items.children.length > 0) {
46282			const items = field.items;
46283			let displayedIndex = 0;
46284			let saveIndex = 0;
46285			if (items.children.length === 2) {
46286				displayedIndex = items.children[0].save;
46287				saveIndex = 1 - displayedIndex;
46288			}
46289			const displayed = items.children[displayedIndex][$toHTML]().html;
46290			const values = items.children[saveIndex][$toHTML]().html;
46291			let selected = false;
46292			const value = field.value?.[$text]() || "";
46293			for (let i = 0, ii = displayed.length; i < ii; i++) {
46294				const option = {
46295					name: "option",
46296					attributes: {
46297						value: values[i] || displayed[i],
46298						style: optionStyle
46299					},
46300					value: displayed[i]
46301				};
46302				if (values[i] === value) {
46303					option.attributes.selected = selected = true;
46304				}
46305				children.push(option);
46306			}
46307			if (!selected) {
46308				children.splice(0, 0, {
46309					name: "option",
46310					attributes: {
46311						hidden: true,
46312						selected: true
46313					},
46314					value: " "
46315				});
46316			}
46317		}
46318		const selectAttributes = {
46319			class: ["xfaSelect"],
46320			fieldId: field[$uid],
46321			dataId: field[$data]?.[$uid] || field[$uid],
46322			style,
46323			"aria-label": ariaLabel(field),
46324			"aria-required": false
46325		};
46326		if (isRequired(field)) {
46327			selectAttributes["aria-required"] = true;
46328			selectAttributes.required = true;
46329		}
46330		if (this.open === "multiSelect") {
46331			selectAttributes.multiple = true;
46332		}
46333		return HTMLResult.success({
46334			name: "label",
46335			attributes: {
46336				class: ["xfaLabel"]
46337			},
46338			children: [{
46339				name: "select",
46340				children,
46341				attributes: selectAttributes
46342			}]
46343		});
46344	}
46345}
46346class Color extends XFAObject {
46347	constructor(attributes) {
46348		super(TEMPLATE_NS_ID, "color", true);
46349		this.cSpace = getStringOption(attributes.cSpace, ["SRGB"]);
46350		this.id = attributes.id || "";
46351		this.use = attributes.use || "";
46352		this.usehref = attributes.usehref || "";
46353		this.value = attributes.value ? getColor(attributes.value) : "";
46354		this.extras = null;
46355	}
46356	[$hasSettableValue]() {
46357		return false;
46358	}
46359	[$toStyle]() {
46360		return this.value ? Util.makeHexColor(this.value.r, this.value.g, this.value.b) : null;
46361	}
46362}
46363class Comb extends XFAObject {
46364	constructor(attributes) {
46365		super(TEMPLATE_NS_ID, "comb");
46366		this.id = attributes.id || "";
46367		this.numberOfCells = getInteger({
46368			data: attributes.numberOfCells,
46369			defaultValue: 0,
46370			validate: x => x >= 0
46371		});
46372		this.use = attributes.use || "";
46373		this.usehref = attributes.usehref || "";
46374	}
46375}
46376class Connect extends XFAObject {
46377	constructor(attributes) {
46378		super(TEMPLATE_NS_ID, "connect", true);
46379		this.connection = attributes.connection || "";
46380		this.id = attributes.id || "";
46381		this.ref = attributes.ref || "";
46382		this.usage = getStringOption(attributes.usage, ["exportAndImport", "exportOnly", "importOnly"]);
46383		this.use = attributes.use || "";
46384		this.usehref = attributes.usehref || "";
46385		this.picture = null;
46386	}
46387}
46388class ContentArea extends XFAObject {
46389	constructor(attributes) {
46390		super(TEMPLATE_NS_ID, "contentArea", true);
46391		this.h = getMeasurement(attributes.h);
46392		this.id = attributes.id || "";
46393		this.name = attributes.name || "";
46394		this.relevant = getRelevant(attributes.relevant);
46395		this.use = attributes.use || "";
46396		this.usehref = attributes.usehref || "";
46397		this.w = getMeasurement(attributes.w);
46398		this.x = getMeasurement(attributes.x, "0pt");
46399		this.y = getMeasurement(attributes.y, "0pt");
46400		this.desc = null;
46401		this.extras = null;
46402	}
46403	[$toHTML](availableSpace) {
46404		const left = measureToString(this.x);
46405		const top = measureToString(this.y);
46406		const style = {
46407			left,
46408			top,
46409			width: measureToString(this.w),
46410			height: measureToString(this.h)
46411		};
46412		const classNames = ["xfaContentarea"];
46413		if (isPrintOnly(this)) {
46414			classNames.push("xfaPrintOnly");
46415		}
46416		return HTMLResult.success({
46417			name: "div",
46418			children: [],
46419			attributes: {
46420				style,
46421				class: classNames,
46422				id: this[$uid]
46423			}
46424		});
46425	}
46426}
46427class Corner extends XFAObject {
46428	constructor(attributes) {
46429		super(TEMPLATE_NS_ID, "corner", true);
46430		this.id = attributes.id || "";
46431		this.inverted = getInteger({
46432			data: attributes.inverted,
46433			defaultValue: 0,
46434			validate: x => x === 1
46435		});
46436		this.join = getStringOption(attributes.join, ["square", "round"]);
46437		this.presence = getStringOption(attributes.presence, ["visible", "hidden", "inactive", "invisible"]);
46438		this.radius = getMeasurement(attributes.radius);
46439		this.stroke = getStringOption(attributes.stroke, ["solid", "dashDot", "dashDotDot", "dashed", "dotted", "embossed", "etched", "lowered", "raised"]);
46440		this.thickness = getMeasurement(attributes.thickness, "0.5pt");
46441		this.use = attributes.use || "";
46442		this.usehref = attributes.usehref || "";
46443		this.color = null;
46444		this.extras = null;
46445	}
46446	[$toStyle]() {
46447		const style = toStyle(this, "visibility");
46448		style.radius = measureToString(this.join === "square" ? 0 : this.radius);
46449		return style;
46450	}
46451}
46452class DateElement extends ContentObject {
46453	constructor(attributes) {
46454		super(TEMPLATE_NS_ID, "date");
46455		this.id = attributes.id || "";
46456		this.name = attributes.name || "";
46457		this.use = attributes.use || "";
46458		this.usehref = attributes.usehref || "";
46459	}
46460	[$finalize]() {
46461		const date = this[$content].trim();
46462		this[$content] = date ? new Date(date) : null;
46463	}
46464	[$toHTML](availableSpace) {
46465		return valueToHtml(this[$content] ? this[$content].toString() : "");
46466	}
46467}
46468class DateTime extends ContentObject {
46469	constructor(attributes) {
46470		super(TEMPLATE_NS_ID, "dateTime");
46471		this.id = attributes.id || "";
46472		this.name = attributes.name || "";
46473		this.use = attributes.use || "";
46474		this.usehref = attributes.usehref || "";
46475	}
46476	[$finalize]() {
46477		const date = this[$content].trim();
46478		this[$content] = date ? new Date(date) : null;
46479	}
46480	[$toHTML](availableSpace) {
46481		return valueToHtml(this[$content] ? this[$content].toString() : "");
46482	}
46483}
46484class DateTimeEdit extends XFAObject {
46485	constructor(attributes) {
46486		super(TEMPLATE_NS_ID, "dateTimeEdit", true);
46487		this.hScrollPolicy = getStringOption(attributes.hScrollPolicy, ["auto", "off", "on"]);
46488		this.id = attributes.id || "";
46489		this.picker = getStringOption(attributes.picker, ["host", "none"]);
46490		this.use = attributes.use || "";
46491		this.usehref = attributes.usehref || "";
46492		this.border = null;
46493		this.comb = null;
46494		this.extras = null;
46495		this.margin = null;
46496	}
46497	[$toHTML](availableSpace) {
46498		const style = toStyle(this, "border", "font", "margin");
46499		const field = this[$getParent]()[$getParent]();
46500		const html = {
46501			name: "input",
46502			attributes: {
46503				type: "text",
46504				fieldId: field[$uid],
46505				dataId: field[$data]?.[$uid] || field[$uid],
46506				class: ["xfaTextfield"],
46507				style,
46508				"aria-label": ariaLabel(field),
46509				"aria-required": false
46510			}
46511		};
46512		if (isRequired(field)) {
46513			html.attributes["aria-required"] = true;
46514			html.attributes.required = true;
46515		}
46516		return HTMLResult.success({
46517			name: "label",
46518			attributes: {
46519				class: ["xfaLabel"]
46520			},
46521			children: [html]
46522		});
46523	}
46524}
46525class Decimal extends ContentObject {
46526	constructor(attributes) {
46527		super(TEMPLATE_NS_ID, "decimal");
46528		this.fracDigits = getInteger({
46529			data: attributes.fracDigits,
46530			defaultValue: 2,
46531			validate: x => true
46532		});
46533		this.id = attributes.id || "";
46534		this.leadDigits = getInteger({
46535			data: attributes.leadDigits,
46536			defaultValue: -1,
46537			validate: x => true
46538		});
46539		this.name = attributes.name || "";
46540		this.use = attributes.use || "";
46541		this.usehref = attributes.usehref || "";
46542	}
46543	[$finalize]() {
46544		const number = parseFloat(this[$content].trim());
46545		this[$content] = isNaN(number) ? null : number;
46546	}
46547	[$toHTML](availableSpace) {
46548		return valueToHtml(this[$content] !== null ? this[$content].toString() : "");
46549	}
46550}
46551class DefaultUi extends XFAObject {
46552	constructor(attributes) {
46553		super(TEMPLATE_NS_ID, "defaultUi", true);
46554		this.id = attributes.id || "";
46555		this.use = attributes.use || "";
46556		this.usehref = attributes.usehref || "";
46557		this.extras = null;
46558	}
46559}
46560class Desc extends XFAObject {
46561	constructor(attributes) {
46562		super(TEMPLATE_NS_ID, "desc", true);
46563		this.id = attributes.id || "";
46564		this.use = attributes.use || "";
46565		this.usehref = attributes.usehref || "";
46566		this.boolean = new XFAObjectArray();
46567		this.date = new XFAObjectArray();
46568		this.dateTime = new XFAObjectArray();
46569		this.decimal = new XFAObjectArray();
46570		this.exData = new XFAObjectArray();
46571		this.float = new XFAObjectArray();
46572		this.image = new XFAObjectArray();
46573		this.integer = new XFAObjectArray();
46574		this.text = new XFAObjectArray();
46575		this.time = new XFAObjectArray();
46576	}
46577}
46578class DigestMethod extends OptionObject {
46579	constructor(attributes) {
46580		super(TEMPLATE_NS_ID, "digestMethod", ["", "SHA1", "SHA256", "SHA512", "RIPEMD160"]);
46581		this.id = attributes.id || "";
46582		this.use = attributes.use || "";
46583		this.usehref = attributes.usehref || "";
46584	}
46585}
46586class DigestMethods extends XFAObject {
46587	constructor(attributes) {
46588		super(TEMPLATE_NS_ID, "digestMethods", true);
46589		this.id = attributes.id || "";
46590		this.type = getStringOption(attributes.type, ["optional", "required"]);
46591		this.use = attributes.use || "";
46592		this.usehref = attributes.usehref || "";
46593		this.digestMethod = new XFAObjectArray();
46594	}
46595}
46596class Draw extends XFAObject {
46597	constructor(attributes) {
46598		super(TEMPLATE_NS_ID, "draw", true);
46599		this.anchorType = getStringOption(attributes.anchorType, ["topLeft", "bottomCenter", "bottomLeft", "bottomRight", "middleCenter", "middleLeft", "middleRight", "topCenter", "topRight"]);
46600		this.colSpan = getInteger({
46601			data: attributes.colSpan,
46602			defaultValue: 1,
46603			validate: n => n >= 1 || n === -1
46604		});
46605		this.h = attributes.h ? getMeasurement(attributes.h) : "";
46606		this.hAlign = getStringOption(attributes.hAlign, ["left", "center", "justify", "justifyAll", "radix", "right"]);
46607		this.id = attributes.id || "";
46608		this.locale = attributes.locale || "";
46609		this.maxH = getMeasurement(attributes.maxH, "0pt");
46610		this.maxW = getMeasurement(attributes.maxW, "0pt");
46611		this.minH = getMeasurement(attributes.minH, "0pt");
46612		this.minW = getMeasurement(attributes.minW, "0pt");
46613		this.name = attributes.name || "";
46614		this.presence = getStringOption(attributes.presence, ["visible", "hidden", "inactive", "invisible"]);
46615		this.relevant = getRelevant(attributes.relevant);
46616		this.rotate = getInteger({
46617			data: attributes.rotate,
46618			defaultValue: 0,
46619			validate: x => x % 90 === 0
46620		});
46621		this.use = attributes.use || "";
46622		this.usehref = attributes.usehref || "";
46623		this.w = attributes.w ? getMeasurement(attributes.w) : "";
46624		this.x = getMeasurement(attributes.x, "0pt");
46625		this.y = getMeasurement(attributes.y, "0pt");
46626		this.assist = null;
46627		this.border = null;
46628		this.caption = null;
46629		this.desc = null;
46630		this.extras = null;
46631		this.font = null;
46632		this.keep = null;
46633		this.margin = null;
46634		this.para = null;
46635		this.traversal = null;
46636		this.ui = null;
46637		this.value = null;
46638		this.setProperty = new XFAObjectArray();
46639	}
46640	[$setValue](value) {
46641		_setValue(this, value);
46642	}
46643	[$toHTML](availableSpace) {
46644		setTabIndex(this);
46645		if (this.presence === "hidden" || this.presence === "inactive") {
46646			return HTMLResult.EMPTY;
46647		}
46648		fixDimensions(this);
46649		this[$pushPara]();
46650		const savedW = this.w;
46651		const savedH = this.h;
46652		const {
46653			w,
46654			h,
46655			isBroken
46656		} = layoutNode(this, availableSpace);
46657		if (w && this.w === "") {
46658			if (isBroken && this[$getSubformParent]()[$isThereMoreWidth]()) {
46659				this[$popPara]();
46660				return HTMLResult.FAILURE;
46661			}
46662			this.w = w;
46663		}
46664		if (h && this.h === "") {
46665			this.h = h;
46666		}
46667		setFirstUnsplittable(this);
46668		if (!checkDimensions(this, availableSpace)) {
46669			this.w = savedW;
46670			this.h = savedH;
46671			this[$popPara]();
46672			return HTMLResult.FAILURE;
46673		}
46674		unsetFirstUnsplittable(this);
46675		const style = toStyle(this, "font", "hAlign", "dimensions", "position", "presence", "rotate", "anchorType", "border", "margin");
46676		setMinMaxDimensions(this, style);
46677		if (style.margin) {
46678			style.padding = style.margin;
46679			delete style.margin;
46680		}
46681		const classNames = ["xfaDraw"];
46682		if (this.font) {
46683			classNames.push("xfaFont");
46684		}
46685		if (isPrintOnly(this)) {
46686			classNames.push("xfaPrintOnly");
46687		}
46688		const attributes = {
46689			style,
46690			id: this[$uid],
46691			class: classNames
46692		};
46693		if (this.name) {
46694			attributes.xfaName = this.name;
46695		}
46696		const html = {
46697			name: "div",
46698			attributes,
46699			children: []
46700		};
46701		applyAssist(this, attributes);
46702		const bbox = computeBbox(this, html, availableSpace);
46703		const value = this.value ? this.value[$toHTML](availableSpace).html : null;
46704		if (value === null) {
46705			this.w = savedW;
46706			this.h = savedH;
46707			this[$popPara]();
46708			return HTMLResult.success(createWrapper(this, html), bbox);
46709		}
46710		html.children.push(value);
46711		setPara(this, style, value);
46712		this.w = savedW;
46713		this.h = savedH;
46714		this[$popPara]();
46715		return HTMLResult.success(createWrapper(this, html), bbox);
46716	}
46717}
46718class Edge extends XFAObject {
46719	constructor(attributes) {
46720		super(TEMPLATE_NS_ID, "edge", true);
46721		this.cap = getStringOption(attributes.cap, ["square", "butt", "round"]);
46722		this.id = attributes.id || "";
46723		this.presence = getStringOption(attributes.presence, ["visible", "hidden", "inactive", "invisible"]);
46724		this.stroke = getStringOption(attributes.stroke, ["solid", "dashDot", "dashDotDot", "dashed", "dotted", "embossed", "etched", "lowered", "raised"]);
46725		this.thickness = getMeasurement(attributes.thickness, "0.5pt");
46726		this.use = attributes.use || "";
46727		this.usehref = attributes.usehref || "";
46728		this.color = null;
46729		this.extras = null;
46730	}
46731	[$toStyle]() {
46732		const style = toStyle(this, "visibility");
46733		Object.assign(style, {
46734			linecap: this.cap,
46735			width: measureToString(this.thickness),
46736			color: this.color ? this.color[$toStyle]() : "#000000",
46737			style: ""
46738		});
46739		if (this.presence !== "visible") {
46740			style.style = "none";
46741		} else {
46742			switch (this.stroke) {
46743				case "solid":
46744					style.style = "solid";
46745					break;
46746				case "dashDot":
46747					style.style = "dashed";
46748					break;
46749				case "dashDotDot":
46750					style.style = "dashed";
46751					break;
46752				case "dashed":
46753					style.style = "dashed";
46754					break;
46755				case "dotted":
46756					style.style = "dotted";
46757					break;
46758				case "embossed":
46759					style.style = "ridge";
46760					break;
46761				case "etched":
46762					style.style = "groove";
46763					break;
46764				case "lowered":
46765					style.style = "inset";
46766					break;
46767				case "raised":
46768					style.style = "outset";
46769					break;
46770			}
46771		}
46772		return style;
46773	}
46774}
46775class Encoding extends OptionObject {
46776	constructor(attributes) {
46777		super(TEMPLATE_NS_ID, "encoding", ["adbe.x509.rsa_sha1", "adbe.pkcs7.detached", "adbe.pkcs7.sha1"]);
46778		this.id = attributes.id || "";
46779		this.use = attributes.use || "";
46780		this.usehref = attributes.usehref || "";
46781	}
46782}
46783class Encodings extends XFAObject {
46784	constructor(attributes) {
46785		super(TEMPLATE_NS_ID, "encodings", true);
46786		this.id = attributes.id || "";
46787		this.type = getStringOption(attributes.type, ["optional", "required"]);
46788		this.use = attributes.use || "";
46789		this.usehref = attributes.usehref || "";
46790		this.encoding = new XFAObjectArray();
46791	}
46792}
46793class Encrypt extends XFAObject {
46794	constructor(attributes) {
46795		super(TEMPLATE_NS_ID, "encrypt", true);
46796		this.id = attributes.id || "";
46797		this.use = attributes.use || "";
46798		this.usehref = attributes.usehref || "";
46799		this.certificate = null;
46800	}
46801}
46802class EncryptData extends XFAObject {
46803	constructor(attributes) {
46804		super(TEMPLATE_NS_ID, "encryptData", true);
46805		this.id = attributes.id || "";
46806		this.operation = getStringOption(attributes.operation, ["encrypt", "decrypt"]);
46807		this.target = attributes.target || "";
46808		this.use = attributes.use || "";
46809		this.usehref = attributes.usehref || "";
46810		this.filter = null;
46811		this.manifest = null;
46812	}
46813}
46814class Encryption extends XFAObject {
46815	constructor(attributes) {
46816		super(TEMPLATE_NS_ID, "encryption", true);
46817		this.id = attributes.id || "";
46818		this.type = getStringOption(attributes.type, ["optional", "required"]);
46819		this.use = attributes.use || "";
46820		this.usehref = attributes.usehref || "";
46821		this.certificate = new XFAObjectArray();
46822	}
46823}
46824class EncryptionMethod extends OptionObject {
46825	constructor(attributes) {
46826		super(TEMPLATE_NS_ID, "encryptionMethod", ["", "AES256-CBC", "TRIPLEDES-CBC", "AES128-CBC", "AES192-CBC"]);
46827		this.id = attributes.id || "";
46828		this.use = attributes.use || "";
46829		this.usehref = attributes.usehref || "";
46830	}
46831}
46832class EncryptionMethods extends XFAObject {
46833	constructor(attributes) {
46834		super(TEMPLATE_NS_ID, "encryptionMethods", true);
46835		this.id = attributes.id || "";
46836		this.type = getStringOption(attributes.type, ["optional", "required"]);
46837		this.use = attributes.use || "";
46838		this.usehref = attributes.usehref || "";
46839		this.encryptionMethod = new XFAObjectArray();
46840	}
46841}
46842class Event extends XFAObject {
46843	constructor(attributes) {
46844		super(TEMPLATE_NS_ID, "event", true);
46845		this.activity = getStringOption(attributes.activity, ["click", "change", "docClose", "docReady", "enter", "exit", "full", "indexChange", "initialize", "mouseDown", "mouseEnter", "mouseExit", "mouseUp", "postExecute", "postOpen", "postPrint", "postSave", "postSign", "postSubmit", "preExecute", "preOpen", "prePrint", "preSave", "preSign", "preSubmit", "ready", "validationState"]);
46846		this.id = attributes.id || "";
46847		this.listen = getStringOption(attributes.listen, ["refOnly", "refAndDescendents"]);
46848		this.name = attributes.name || "";
46849		this.ref = attributes.ref || "";
46850		this.use = attributes.use || "";
46851		this.usehref = attributes.usehref || "";
46852		this.extras = null;
46853		this.encryptData = null;
46854		this.execute = null;
46855		this.script = null;
46856		this.signData = null;
46857		this.submit = null;
46858	}
46859}
46860class ExData extends ContentObject {
46861	constructor(attributes) {
46862		super(TEMPLATE_NS_ID, "exData");
46863		this.contentType = attributes.contentType || "";
46864		this.href = attributes.href || "";
46865		this.id = attributes.id || "";
46866		this.maxLength = getInteger({
46867			data: attributes.maxLength,
46868			defaultValue: -1,
46869			validate: x => x >= -1
46870		});
46871		this.name = attributes.name || "";
46872		this.rid = attributes.rid || "";
46873		this.transferEncoding = getStringOption(attributes.transferEncoding, ["none", "base64", "package"]);
46874		this.use = attributes.use || "";
46875		this.usehref = attributes.usehref || "";
46876	}
46877	[$isCDATAXml]() {
46878		return this.contentType === "text/html";
46879	}
46880	[$onChild](child) {
46881		if (this.contentType === "text/html" && child[$namespaceId] === NamespaceIds.xhtml.id) {
46882			this[$content] = child;
46883			return true;
46884		}
46885		if (this.contentType === "text/xml") {
46886			this[$content] = child;
46887			return true;
46888		}
46889		return false;
46890	}
46891	[$toHTML](availableSpace) {
46892		if (this.contentType !== "text/html" || !this[$content]) {
46893			return HTMLResult.EMPTY;
46894		}
46895		return this[$content][$toHTML](availableSpace);
46896	}
46897}
46898class ExObject extends XFAObject {
46899	constructor(attributes) {
46900		super(TEMPLATE_NS_ID, "exObject", true);
46901		this.archive = attributes.archive || "";
46902		this.classId = attributes.classId || "";
46903		this.codeBase = attributes.codeBase || "";
46904		this.codeType = attributes.codeType || "";
46905		this.id = attributes.id || "";
46906		this.name = attributes.name || "";
46907		this.use = attributes.use || "";
46908		this.usehref = attributes.usehref || "";
46909		this.extras = null;
46910		this.boolean = new XFAObjectArray();
46911		this.date = new XFAObjectArray();
46912		this.dateTime = new XFAObjectArray();
46913		this.decimal = new XFAObjectArray();
46914		this.exData = new XFAObjectArray();
46915		this.exObject = new XFAObjectArray();
46916		this.float = new XFAObjectArray();
46917		this.image = new XFAObjectArray();
46918		this.integer = new XFAObjectArray();
46919		this.text = new XFAObjectArray();
46920		this.time = new XFAObjectArray();
46921	}
46922}
46923class ExclGroup extends XFAObject {
46924	constructor(attributes) {
46925		super(TEMPLATE_NS_ID, "exclGroup", true);
46926		this.access = getStringOption(attributes.access, ["open", "nonInteractive", "protected", "readOnly"]);
46927		this.accessKey = attributes.accessKey || "";
46928		this.anchorType = getStringOption(attributes.anchorType, ["topLeft", "bottomCenter", "bottomLeft", "bottomRight", "middleCenter", "middleLeft", "middleRight", "topCenter", "topRight"]);
46929		this.colSpan = getInteger({
46930			data: attributes.colSpan,
46931			defaultValue: 1,
46932			validate: n => n >= 1 || n === -1
46933		});
46934		this.h = attributes.h ? getMeasurement(attributes.h) : "";
46935		this.hAlign = getStringOption(attributes.hAlign, ["left", "center", "justify", "justifyAll", "radix", "right"]);
46936		this.id = attributes.id || "";
46937		this.layout = getStringOption(attributes.layout, ["position", "lr-tb", "rl-row", "rl-tb", "row", "table", "tb"]);
46938		this.maxH = getMeasurement(attributes.maxH, "0pt");
46939		this.maxW = getMeasurement(attributes.maxW, "0pt");
46940		this.minH = getMeasurement(attributes.minH, "0pt");
46941		this.minW = getMeasurement(attributes.minW, "0pt");
46942		this.name = attributes.name || "";
46943		this.presence = getStringOption(attributes.presence, ["visible", "hidden", "inactive", "invisible"]);
46944		this.relevant = getRelevant(attributes.relevant);
46945		this.use = attributes.use || "";
46946		this.usehref = attributes.usehref || "";
46947		this.w = attributes.w ? getMeasurement(attributes.w) : "";
46948		this.x = getMeasurement(attributes.x, "0pt");
46949		this.y = getMeasurement(attributes.y, "0pt");
46950		this.assist = null;
46951		this.bind = null;
46952		this.border = null;
46953		this.calculate = null;
46954		this.caption = null;
46955		this.desc = null;
46956		this.extras = null;
46957		this.margin = null;
46958		this.para = null;
46959		this.traversal = null;
46960		this.validate = null;
46961		this.connect = new XFAObjectArray();
46962		this.event = new XFAObjectArray();
46963		this.field = new XFAObjectArray();
46964		this.setProperty = new XFAObjectArray();
46965	}
46966	[$isBindable]() {
46967		return true;
46968	}
46969	[$hasSettableValue]() {
46970		return true;
46971	}
46972	[$setValue](value) {
46973		for (const field of this.field.children) {
46974			if (!field.value) {
46975				const nodeValue = new Value({});
46976				field[$appendChild](nodeValue);
46977				field.value = nodeValue;
46978			}
46979			field.value[$setValue](value);
46980		}
46981	}
46982	[$isThereMoreWidth]() {
46983		return this.layout.endsWith("-tb") && this[$extra].attempt === 0 && this[$extra].numberInLine > 0 || this[$getParent]()[$isThereMoreWidth]();
46984	}
46985	[$isSplittable]() {
46986		const parent = this[$getSubformParent]();
46987		if (!parent[$isSplittable]()) {
46988			return false;
46989		}
46990		if (this[$extra]._isSplittable !== undefined) {
46991			return this[$extra]._isSplittable;
46992		}
46993		if (this.layout === "position" || this.layout.includes("row")) {
46994			this[$extra]._isSplittable = false;
46995			return false;
46996		}
46997		if (parent.layout?.endsWith("-tb") && parent[$extra].numberInLine !== 0) {
46998			return false;
46999		}
47000		this[$extra]._isSplittable = true;
47001		return true;
47002	}
47003	[$flushHTML]() {
47004		return flushHTML(this);
47005	}
47006	[$addHTML](html, bbox) {
47007		addHTML(this, html, bbox);
47008	}
47009	[$getAvailableSpace]() {
47010		return getAvailableSpace(this);
47011	}
47012	[$toHTML](availableSpace) {
47013		setTabIndex(this);
47014		if (this.presence === "hidden" || this.presence === "inactive" || this.h === 0 || this.w === 0) {
47015			return HTMLResult.EMPTY;
47016		}
47017		fixDimensions(this);
47018		const children = [];
47019		const attributes = {
47020			id: this[$uid],
47021			class: []
47022		};
47023		setAccess(this, attributes.class);
47024		if (!this[$extra]) {
47025			this[$extra] = Object.create(null);
47026		}
47027		Object.assign(this[$extra], {
47028			children,
47029			attributes,
47030			attempt: 0,
47031			line: null,
47032			numberInLine: 0,
47033			availableSpace: {
47034				width: Math.min(this.w || Infinity, availableSpace.width),
47035				height: Math.min(this.h || Infinity, availableSpace.height)
47036			},
47037			width: 0,
47038			height: 0,
47039			prevHeight: 0,
47040			currentWidth: 0
47041		});
47042		const isSplittable = this[$isSplittable]();
47043		if (!isSplittable) {
47044			setFirstUnsplittable(this);
47045		}
47046		if (!checkDimensions(this, availableSpace)) {
47047			return HTMLResult.FAILURE;
47048		}
47049		const filter = new Set(["field"]);
47050		if (this.layout.includes("row")) {
47051			const columnWidths = this[$getSubformParent]().columnWidths;
47052			if (Array.isArray(columnWidths) && columnWidths.length > 0) {
47053				this[$extra].columnWidths = columnWidths;
47054				this[$extra].currentColumn = 0;
47055			}
47056		}
47057		const style = toStyle(this, "anchorType", "dimensions", "position", "presence", "border", "margin", "hAlign");
47058		const classNames = ["xfaExclgroup"];
47059		const cl = layoutClass(this);
47060		if (cl) {
47061			classNames.push(cl);
47062		}
47063		if (isPrintOnly(this)) {
47064			classNames.push("xfaPrintOnly");
47065		}
47066		attributes.style = style;
47067		attributes.class = classNames;
47068		if (this.name) {
47069			attributes.xfaName = this.name;
47070		}
47071		this[$pushPara]();
47072		const isLrTb = this.layout === "lr-tb" || this.layout === "rl-tb";
47073		const maxRun = isLrTb ? MAX_ATTEMPTS_FOR_LRTB_LAYOUT : 1;
47074		for (; this[$extra].attempt < maxRun; this[$extra].attempt++) {
47075			if (isLrTb && this[$extra].attempt === MAX_ATTEMPTS_FOR_LRTB_LAYOUT - 1) {
47076				this[$extra].numberInLine = 0;
47077			}
47078			const result = this[$childrenToHTML]({
47079				filter,
47080				include: true
47081			});
47082			if (result.success) {
47083				break;
47084			}
47085			if (result.isBreak()) {
47086				this[$popPara]();
47087				return result;
47088			}
47089			if (isLrTb && this[$extra].attempt === 0 && this[$extra].numberInLine === 0 && !this[$getTemplateRoot]()[$extra].noLayoutFailure) {
47090				this[$extra].attempt = maxRun;
47091				break;
47092			}
47093		}
47094		this[$popPara]();
47095		if (!isSplittable) {
47096			unsetFirstUnsplittable(this);
47097		}
47098		if (this[$extra].attempt === maxRun) {
47099			if (!isSplittable) {
47100				delete this[$extra];
47101			}
47102			return HTMLResult.FAILURE;
47103		}
47104		let marginH = 0;
47105		let marginV = 0;
47106		if (this.margin) {
47107			marginH = this.margin.leftInset + this.margin.rightInset;
47108			marginV = this.margin.topInset + this.margin.bottomInset;
47109		}
47110		const width = Math.max(this[$extra].width + marginH, this.w || 0);
47111		const height = Math.max(this[$extra].height + marginV, this.h || 0);
47112		const bbox = [this.x, this.y, width, height];
47113		if (this.w === "") {
47114			style.width = measureToString(width);
47115		}
47116		if (this.h === "") {
47117			style.height = measureToString(height);
47118		}
47119		const html = {
47120			name: "div",
47121			attributes,
47122			children
47123		};
47124		applyAssist(this, attributes);
47125		delete this[$extra];
47126		return HTMLResult.success(createWrapper(this, html), bbox);
47127	}
47128}
47129class Execute extends XFAObject {
47130	constructor(attributes) {
47131		super(TEMPLATE_NS_ID, "execute");
47132		this.connection = attributes.connection || "";
47133		this.executeType = getStringOption(attributes.executeType, ["import", "remerge"]);
47134		this.id = attributes.id || "";
47135		this.runAt = getStringOption(attributes.runAt, ["client", "both", "server"]);
47136		this.use = attributes.use || "";
47137		this.usehref = attributes.usehref || "";
47138	}
47139}
47140class Extras extends XFAObject {
47141	constructor(attributes) {
47142		super(TEMPLATE_NS_ID, "extras", true);
47143		this.id = attributes.id || "";
47144		this.name = attributes.name || "";
47145		this.use = attributes.use || "";
47146		this.usehref = attributes.usehref || "";
47147		this.boolean = new XFAObjectArray();
47148		this.date = new XFAObjectArray();
47149		this.dateTime = new XFAObjectArray();
47150		this.decimal = new XFAObjectArray();
47151		this.exData = new XFAObjectArray();
47152		this.extras = new XFAObjectArray();
47153		this.float = new XFAObjectArray();
47154		this.image = new XFAObjectArray();
47155		this.integer = new XFAObjectArray();
47156		this.text = new XFAObjectArray();
47157		this.time = new XFAObjectArray();
47158	}
47159}
47160class Field extends XFAObject {
47161	constructor(attributes) {
47162		super(TEMPLATE_NS_ID, "field", true);
47163		this.access = getStringOption(attributes.access, ["open", "nonInteractive", "protected", "readOnly"]);
47164		this.accessKey = attributes.accessKey || "";
47165		this.anchorType = getStringOption(attributes.anchorType, ["topLeft", "bottomCenter", "bottomLeft", "bottomRight", "middleCenter", "middleLeft", "middleRight", "topCenter", "topRight"]);
47166		this.colSpan = getInteger({
47167			data: attributes.colSpan,
47168			defaultValue: 1,
47169			validate: n => n >= 1 || n === -1
47170		});
47171		this.h = attributes.h ? getMeasurement(attributes.h) : "";
47172		this.hAlign = getStringOption(attributes.hAlign, ["left", "center", "justify", "justifyAll", "radix", "right"]);
47173		this.id = attributes.id || "";
47174		this.locale = attributes.locale || "";
47175		this.maxH = getMeasurement(attributes.maxH, "0pt");
47176		this.maxW = getMeasurement(attributes.maxW, "0pt");
47177		this.minH = getMeasurement(attributes.minH, "0pt");
47178		this.minW = getMeasurement(attributes.minW, "0pt");
47179		this.name = attributes.name || "";
47180		this.presence = getStringOption(attributes.presence, ["visible", "hidden", "inactive", "invisible"]);
47181		this.relevant = getRelevant(attributes.relevant);
47182		this.rotate = getInteger({
47183			data: attributes.rotate,
47184			defaultValue: 0,
47185			validate: x => x % 90 === 0
47186		});
47187		this.use = attributes.use || "";
47188		this.usehref = attributes.usehref || "";
47189		this.w = attributes.w ? getMeasurement(attributes.w) : "";
47190		this.x = getMeasurement(attributes.x, "0pt");
47191		this.y = getMeasurement(attributes.y, "0pt");
47192		this.assist = null;
47193		this.bind = null;
47194		this.border = null;
47195		this.calculate = null;
47196		this.caption = null;
47197		this.desc = null;
47198		this.extras = null;
47199		this.font = null;
47200		this.format = null;
47201		this.items = new XFAObjectArray(2);
47202		this.keep = null;
47203		this.margin = null;
47204		this.para = null;
47205		this.traversal = null;
47206		this.ui = null;
47207		this.validate = null;
47208		this.value = null;
47209		this.bindItems = new XFAObjectArray();
47210		this.connect = new XFAObjectArray();
47211		this.event = new XFAObjectArray();
47212		this.setProperty = new XFAObjectArray();
47213	}
47214	[$isBindable]() {
47215		return true;
47216	}
47217	[$setValue](value) {
47218		_setValue(this, value);
47219	}
47220	[$toHTML](availableSpace) {
47221		setTabIndex(this);
47222		if (!this.ui) {
47223			this.ui = new Ui({});
47224			this.ui[$globalData] = this[$globalData];
47225			this[$appendChild](this.ui);
47226			let node;
47227			switch (this.items.children.length) {
47228				case 0:
47229					node = new TextEdit({});
47230					this.ui.textEdit = node;
47231					break;
47232				case 1:
47233					node = new CheckButton({});
47234					this.ui.checkButton = node;
47235					break;
47236				case 2:
47237					node = new ChoiceList({});
47238					this.ui.choiceList = node;
47239					break;
47240			}
47241			this.ui[$appendChild](node);
47242		}
47243		if (!this.ui || this.presence === "hidden" || this.presence === "inactive" || this.h === 0 || this.w === 0) {
47244			return HTMLResult.EMPTY;
47245		}
47246		if (this.caption) {
47247			delete this.caption[$extra];
47248		}
vendor: 5,664 bytes, lines 47249-47456
47249		this[$pushPara]();
47250		const caption = this.caption ? this.caption[$toHTML](availableSpace).html : null;
47251		const savedW = this.w;
47252		const savedH = this.h;
47253		let marginH = 0;
47254		let marginV = 0;
47255		if (this.margin) {
47256			marginH = this.margin.leftInset + this.margin.rightInset;
47257			marginV = this.margin.topInset + this.margin.bottomInset;
47258		}
47259		let borderDims = null;
47260		if (this.w === "" || this.h === "") {
47261			let width = null;
47262			let height = null;
47263			let uiW = 0;
47264			let uiH = 0;
47265			if (this.ui.checkButton) {
47266				uiW = uiH = this.ui.checkButton.size;
47267			} else {
47268				const {
47269					w,
47270					h
47271				} = layoutNode(this, availableSpace);
47272				if (w !== null) {
47273					uiW = w;
47274					uiH = h;
47275				} else {
47276					uiH = fonts_getMetrics(this.font, true).lineNoGap;
47277				}
47278			}
47279			borderDims = getBorderDims(this.ui[$getExtra]());
47280			uiW += borderDims.w;
47281			uiH += borderDims.h;
47282			if (this.caption) {
47283				const {
47284					w,
47285					h,
47286					isBroken
47287				} = this.caption[$getExtra](availableSpace);
47288				if (isBroken && this[$getSubformParent]()[$isThereMoreWidth]()) {
47289					this[$popPara]();
47290					return HTMLResult.FAILURE;
47291				}
47292				width = w;
47293				height = h;
47294				switch (this.caption.placement) {
47295					case "left":
47296					case "right":
47297					case "inline":
47298						width += uiW;
47299						break;
47300					case "top":
47301					case "bottom":
47302						height += uiH;
47303						break;
47304				}
47305			} else {
47306				width = uiW;
47307				height = uiH;
47308			}
47309			if (width && this.w === "") {
47310				width += marginH;
47311				this.w = Math.min(this.maxW <= 0 ? Infinity : this.maxW, this.minW + 1 < width ? width : this.minW);
47312			}
47313			if (height && this.h === "") {
47314				height += marginV;
47315				this.h = Math.min(this.maxH <= 0 ? Infinity : this.maxH, this.minH + 1 < height ? height : this.minH);
47316			}
47317		}
47318		this[$popPara]();
47319		fixDimensions(this);
47320		setFirstUnsplittable(this);
47321		if (!checkDimensions(this, availableSpace)) {
47322			this.w = savedW;
47323			this.h = savedH;
47324			this[$popPara]();
47325			return HTMLResult.FAILURE;
47326		}
47327		unsetFirstUnsplittable(this);
47328		const style = toStyle(this, "font", "dimensions", "position", "rotate", "anchorType", "presence", "margin", "hAlign");
47329		setMinMaxDimensions(this, style);
47330		const classNames = ["xfaField"];
47331		if (this.font) {
47332			classNames.push("xfaFont");
47333		}
47334		if (isPrintOnly(this)) {
47335			classNames.push("xfaPrintOnly");
47336		}
47337		const attributes = {
47338			style,
47339			id: this[$uid],
47340			class: classNames
47341		};
47342		if (style.margin) {
47343			style.padding = style.margin;
47344			delete style.margin;
47345		}
47346		setAccess(this, classNames);
47347		if (this.name) {
47348			attributes.xfaName = this.name;
47349		}
47350		const children = [];
47351		const html = {
47352			name: "div",
47353			attributes,
47354			children
47355		};
47356		applyAssist(this, attributes);
47357		const borderStyle = this.border ? this.border[$toStyle]() : null;
47358		const bbox = computeBbox(this, html, availableSpace);
47359		const ui = this.ui[$toHTML]().html;
47360		if (!ui) {
47361			Object.assign(style, borderStyle);
47362			return HTMLResult.success(createWrapper(this, html), bbox);
47363		}
47364		if (this[$tabIndex]) {
47365			if (ui.children?.[0]) {
47366				ui.children[0].attributes.tabindex = this[$tabIndex];
47367			} else {
47368				ui.attributes.tabindex = this[$tabIndex];
47369			}
47370		}
47371		if (!ui.attributes.style) {
47372			ui.attributes.style = Object.create(null);
47373		}
47374		let aElement = null;
47375		if (this.ui.button) {
47376			if (ui.children.length === 1) {
47377				[aElement] = ui.children.splice(0, 1);
47378			}
47379			Object.assign(ui.attributes.style, borderStyle);
47380		} else {
47381			Object.assign(style, borderStyle);
47382		}
47383		children.push(ui);
47384		if (this.value) {
47385			if (this.ui.imageEdit) {
47386				ui.children.push(this.value[$toHTML]().html);
47387			} else if (!this.ui.button) {
47388				let value = "";
47389				if (this.value.exData) {
47390					value = this.value.exData[$text]();
47391				} else if (this.value.text) {
47392					value = this.value.text[$getExtra]();
47393				} else {
47394					const htmlValue = this.value[$toHTML]().html;
47395					if (htmlValue !== null) {
47396						value = htmlValue.children[0].value;
47397					}
47398				}
47399				if (this.ui.textEdit && this.value.text?.maxChars) {
47400					ui.children[0].attributes.maxLength = this.value.text.maxChars;
47401				}
47402				if (value) {
47403					if (this.ui.numericEdit) {
47404						value = parseFloat(value);
47405						value = isNaN(value) ? "" : value.toString();
47406					}
47407					if (ui.children[0].name === "textarea") {
47408						ui.children[0].attributes.textContent = value;
47409					} else {
47410						ui.children[0].attributes.value = value;
47411					}
47412				}
47413			}
47414		}
47415		if (!this.ui.imageEdit && ui.children?.[0] && this.h) {
47416			borderDims = borderDims || getBorderDims(this.ui[$getExtra]());
47417			let captionHeight = 0;
47418			if (this.caption && ["top", "bottom"].includes(this.caption.placement)) {
47419				captionHeight = this.caption.reserve;
47420				if (captionHeight <= 0) {
47421					captionHeight = this.caption[$getExtra](availableSpace).h;
47422				}
47423				const inputHeight = this.h - captionHeight - marginV - borderDims.h;
47424				ui.children[0].attributes.style.height = measureToString(inputHeight);
47425			} else {
47426				ui.children[0].attributes.style.height = "100%";
47427			}
47428		}
47429		if (aElement) {
47430			ui.children.push(aElement);
47431		}
47432		if (!caption) {
47433			if (ui.attributes.class) {
47434				ui.attributes.class.push("xfaLeft");
47435			}
47436			this.w = savedW;
47437			this.h = savedH;
47438			return HTMLResult.success(createWrapper(this, html), bbox);
47439		}
47440		if (this.ui.button) {
47441			if (style.padding) {
47442				delete style.padding;
47443			}
47444			if (caption.name === "div") {
47445				caption.name = "span";
47446			}
47447			ui.children.push(caption);
47448			return HTMLResult.success(html, bbox);
47449		} else if (this.ui.checkButton) {
47450			caption.attributes.class[0] = "xfaCaptionForCheckButton";
47451		}
47452		if (!ui.attributes.class) {
47453			ui.attributes.class = [];
47454		}
47455		ui.children.splice(0, 0, caption);
47456		switch (this.caption.placement) {
vendor: 5,240 bytes, lines 47457-47630
47457			case "left":
47458				ui.attributes.class.push("xfaLeft");
47459				break;
47460			case "right":
47461				ui.attributes.class.push("xfaRight");
47462				break;
47463			case "top":
47464				ui.attributes.class.push("xfaTop");
47465				break;
47466			case "bottom":
47467				ui.attributes.class.push("xfaBottom");
47468				break;
47469			case "inline":
47470				ui.attributes.class.push("xfaLeft");
47471				break;
47472		}
47473		this.w = savedW;
47474		this.h = savedH;
47475		return HTMLResult.success(createWrapper(this, html), bbox);
47476	}
47477}
47478class Fill extends XFAObject {
47479	constructor(attributes) {
47480		super(TEMPLATE_NS_ID, "fill", true);
47481		this.id = attributes.id || "";
47482		this.presence = getStringOption(attributes.presence, ["visible", "hidden", "inactive", "invisible"]);
47483		this.use = attributes.use || "";
47484		this.usehref = attributes.usehref || "";
47485		this.color = null;
47486		this.extras = null;
47487		this.linear = null;
47488		this.pattern = null;
47489		this.radial = null;
47490		this.solid = null;
47491		this.stipple = null;
47492	}
47493	[$toStyle]() {
47494		const parent = this[$getParent]();
47495		const grandpa = parent[$getParent]();
47496		const ggrandpa = grandpa[$getParent]();
47497		const style = Object.create(null);
47498		let propName = "color";
47499		let altPropName = propName;
47500		if (parent instanceof Border) {
47501			propName = "background-color";
47502			altPropName = "background";
47503			if (ggrandpa instanceof Ui) {
47504				style.backgroundColor = "white";
47505			}
47506		}
47507		if (parent instanceof Rectangle || parent instanceof Arc) {
47508			propName = altPropName = "fill";
47509			style.fill = "white";
47510		}
47511		for (const name of Object.getOwnPropertyNames(this)) {
47512			if (name === "extras" || name === "color") {
47513				continue;
47514			}
47515			const obj = this[name];
47516			if (!(obj instanceof XFAObject)) {
47517				continue;
47518			}
47519			const color = obj[$toStyle](this.color);
47520			if (color) {
47521				style[color.startsWith("#") ? propName : altPropName] = color;
47522			}
47523			return style;
47524		}
47525		if (this.color?.value) {
47526			const color = this.color[$toStyle]();
47527			style[color.startsWith("#") ? propName : altPropName] = color;
47528		}
47529		return style;
47530	}
47531}
47532class Filter extends XFAObject {
47533	constructor(attributes) {
47534		super(TEMPLATE_NS_ID, "filter", true);
47535		this.addRevocationInfo = getStringOption(attributes.addRevocationInfo, ["", "required", "optional", "none"]);
47536		this.id = attributes.id || "";
47537		this.name = attributes.name || "";
47538		this.use = attributes.use || "";
47539		this.usehref = attributes.usehref || "";
47540		this.version = getInteger({
47541			data: this.version,
47542			defaultValue: 5,
47543			validate: x => x >= 1 && x <= 5
47544		});
47545		this.appearanceFilter = null;
47546		this.certificates = null;
47547		this.digestMethods = null;
47548		this.encodings = null;
47549		this.encryptionMethods = null;
47550		this.handler = null;
47551		this.lockDocument = null;
47552		this.mdp = null;
47553		this.reasons = null;
47554		this.timeStamp = null;
47555	}
47556}
47557class Float extends ContentObject {
47558	constructor(attributes) {
47559		super(TEMPLATE_NS_ID, "float");
47560		this.id = attributes.id || "";
47561		this.name = attributes.name || "";
47562		this.use = attributes.use || "";
47563		this.usehref = attributes.usehref || "";
47564	}
47565	[$finalize]() {
47566		const number = parseFloat(this[$content].trim());
47567		this[$content] = isNaN(number) ? null : number;
47568	}
47569	[$toHTML](availableSpace) {
47570		return valueToHtml(this[$content] !== null ? this[$content].toString() : "");
47571	}
47572}
47573class template_Font extends XFAObject {
47574	constructor(attributes) {
47575		super(TEMPLATE_NS_ID, "font", true);
47576		this.baselineShift = getMeasurement(attributes.baselineShift);
47577		this.fontHorizontalScale = getFloat({
47578			data: attributes.fontHorizontalScale,
47579			defaultValue: 100,
47580			validate: x => x >= 0
47581		});
47582		this.fontVerticalScale = getFloat({
47583			data: attributes.fontVerticalScale,
47584			defaultValue: 100,
47585			validate: x => x >= 0
47586		});
47587		this.id = attributes.id || "";
47588		this.kerningMode = getStringOption(attributes.kerningMode, ["none", "pair"]);
47589		this.letterSpacing = getMeasurement(attributes.letterSpacing, "0");
47590		this.lineThrough = getInteger({
47591			data: attributes.lineThrough,
47592			defaultValue: 0,
47593			validate: x => x === 1 || x === 2
47594		});
47595		this.lineThroughPeriod = getStringOption(attributes.lineThroughPeriod, ["all", "word"]);
47596		this.overline = getInteger({
47597			data: attributes.overline,
47598			defaultValue: 0,
47599			validate: x => x === 1 || x === 2
47600		});
47601		this.overlinePeriod = getStringOption(attributes.overlinePeriod, ["all", "word"]);
47602		this.posture = getStringOption(attributes.posture, ["normal", "italic"]);
47603		this.size = getMeasurement(attributes.size, "10pt");
47604		this.typeface = attributes.typeface || "Courier";
47605		this.underline = getInteger({
47606			data: attributes.underline,
47607			defaultValue: 0,
47608			validate: x => x === 1 || x === 2
47609		});
47610		this.underlinePeriod = getStringOption(attributes.underlinePeriod, ["all", "word"]);
47611		this.use = attributes.use || "";
47612		this.usehref = attributes.usehref || "";
47613		this.weight = getStringOption(attributes.weight, ["normal", "bold"]);
47614		this.extras = null;
47615		this.fill = null;
47616	}
47617	[$clean](builder) {
47618		super[$clean](builder);
47619		this[$globalData].usedTypefaces.add(this.typeface);
47620	}
47621	[$toStyle]() {
47622		const style = toStyle(this, "fill");
47623		const color = style.color;
47624		if (color) {
47625			if (color === "#000000") {
47626				delete style.color;
47627			} else if (!color.startsWith("#")) {
47628				style.background = color;
47629				style.backgroundClip = "text";
47630				style.color = "transparent";
vendor: 7,367 bytes, lines 47631-47893
47631			}
47632		}
47633		if (this.baselineShift) {
47634			style.verticalAlign = measureToString(this.baselineShift);
47635		}
47636		style.fontKerning = this.kerningMode === "none" ? "none" : "normal";
47637		style.letterSpacing = measureToString(this.letterSpacing);
47638		if (this.lineThrough !== 0) {
47639			style.textDecoration = "line-through";
47640			if (this.lineThrough === 2) {
47641				style.textDecorationStyle = "double";
47642			}
47643		}
47644		if (this.overline !== 0) {
47645			style.textDecoration = "overline";
47646			if (this.overline === 2) {
47647				style.textDecorationStyle = "double";
47648			}
47649		}
47650		style.fontStyle = this.posture;
47651		style.fontSize = measureToString(0.99 * this.size);
47652		setFontFamily(this, this, this[$globalData].fontFinder, style);
47653		if (this.underline !== 0) {
47654			style.textDecoration = "underline";
47655			if (this.underline === 2) {
47656				style.textDecorationStyle = "double";
47657			}
47658		}
47659		style.fontWeight = this.weight;
47660		return style;
47661	}
47662}
47663class Format extends XFAObject {
47664	constructor(attributes) {
47665		super(TEMPLATE_NS_ID, "format", true);
47666		this.id = attributes.id || "";
47667		this.use = attributes.use || "";
47668		this.usehref = attributes.usehref || "";
47669		this.extras = null;
47670		this.picture = null;
47671	}
47672}
47673class Handler extends StringObject {
47674	constructor(attributes) {
47675		super(TEMPLATE_NS_ID, "handler");
47676		this.id = attributes.id || "";
47677		this.type = getStringOption(attributes.type, ["optional", "required"]);
47678		this.use = attributes.use || "";
47679		this.usehref = attributes.usehref || "";
47680	}
47681}
47682class Hyphenation extends XFAObject {
47683	constructor(attributes) {
47684		super(TEMPLATE_NS_ID, "hyphenation");
47685		this.excludeAllCaps = getInteger({
47686			data: attributes.excludeAllCaps,
47687			defaultValue: 0,
47688			validate: x => x === 1
47689		});
47690		this.excludeInitialCap = getInteger({
47691			data: attributes.excludeInitialCap,
47692			defaultValue: 0,
47693			validate: x => x === 1
47694		});
47695		this.hyphenate = getInteger({
47696			data: attributes.hyphenate,
47697			defaultValue: 0,
47698			validate: x => x === 1
47699		});
47700		this.id = attributes.id || "";
47701		this.pushCharacterCount = getInteger({
47702			data: attributes.pushCharacterCount,
47703			defaultValue: 3,
47704			validate: x => x >= 0
47705		});
47706		this.remainCharacterCount = getInteger({
47707			data: attributes.remainCharacterCount,
47708			defaultValue: 3,
47709			validate: x => x >= 0
47710		});
47711		this.use = attributes.use || "";
47712		this.usehref = attributes.usehref || "";
47713		this.wordCharacterCount = getInteger({
47714			data: attributes.wordCharacterCount,
47715			defaultValue: 7,
47716			validate: x => x >= 0
47717		});
47718	}
47719}
47720class Image extends StringObject {
47721	constructor(attributes) {
47722		super(TEMPLATE_NS_ID, "image");
47723		this.aspect = getStringOption(attributes.aspect, ["fit", "actual", "height", "none", "width"]);
47724		this.contentType = attributes.contentType || "";
47725		this.href = attributes.href || "";
47726		this.id = attributes.id || "";
47727		this.name = attributes.name || "";
47728		this.transferEncoding = getStringOption(attributes.transferEncoding, ["base64", "none", "package"]);
47729		this.use = attributes.use || "";
47730		this.usehref = attributes.usehref || "";
47731	}
47732	[$toHTML]() {
47733		if (this.contentType && !MIMES.has(this.contentType.toLowerCase())) {
47734			return HTMLResult.EMPTY;
47735		}
47736		let buffer = this[$globalData].images && this[$globalData].images.get(this.href);
47737		if (!buffer && (this.href || !this[$content])) {
47738			return HTMLResult.EMPTY;
47739		}
47740		if (!buffer && this.transferEncoding === "base64") {
47741			buffer = fromBase64Util(this[$content]);
47742		}
47743		if (!buffer) {
47744			return HTMLResult.EMPTY;
47745		}
47746		if (!this.contentType) {
47747			for (const [header, type] of IMAGES_HEADERS) {
47748				if (buffer.length > header.length && header.every((x, i) => x === buffer[i])) {
47749					this.contentType = type;
47750					break;
47751				}
47752			}
47753			if (!this.contentType) {
47754				return HTMLResult.EMPTY;
47755			}
47756		}
47757		const blob = new Blob([buffer], {
47758			type: this.contentType
47759		});
47760		let style;
47761		switch (this.aspect) {
47762			case "fit":
47763			case "actual":
47764				break;
47765			case "height":
47766				style = {
47767					height: "100%",
47768					objectFit: "fill"
47769				};
47770				break;
47771			case "none":
47772				style = {
47773					width: "100%",
47774					height: "100%",
47775					objectFit: "fill"
47776				};
47777				break;
47778			case "width":
47779				style = {
47780					width: "100%",
47781					objectFit: "fill"
47782				};
47783				break;
47784		}
47785		const parent = this[$getParent]();
47786		return HTMLResult.success({
47787			name: "img",
47788			attributes: {
47789				class: ["xfaImage"],
47790				style,
47791				src: URL.createObjectURL(blob),
47792				alt: parent ? ariaLabel(parent[$getParent]()) : null
47793			}
47794		});
47795	}
47796}
47797class ImageEdit extends XFAObject {
47798	constructor(attributes) {
47799		super(TEMPLATE_NS_ID, "imageEdit", true);
47800		this.data = getStringOption(attributes.data, ["link", "embed"]);
47801		this.id = attributes.id || "";
47802		this.use = attributes.use || "";
47803		this.usehref = attributes.usehref || "";
47804		this.border = null;
47805		this.extras = null;
47806		this.margin = null;
47807	}
47808	[$toHTML](availableSpace) {
47809		if (this.data === "embed") {
47810			return HTMLResult.success({
47811				name: "div",
47812				children: [],
47813				attributes: {}
47814			});
47815		}
47816		return HTMLResult.EMPTY;
47817	}
47818}
47819class Integer extends ContentObject {
47820	constructor(attributes) {
47821		super(TEMPLATE_NS_ID, "integer");
47822		this.id = attributes.id || "";
47823		this.name = attributes.name || "";
47824		this.use = attributes.use || "";
47825		this.usehref = attributes.usehref || "";
47826	}
47827	[$finalize]() {
47828		const number = parseInt(this[$content].trim(), 10);
47829		this[$content] = isNaN(number) ? null : number;
47830	}
47831	[$toHTML](availableSpace) {
47832		return valueToHtml(this[$content] !== null ? this[$content].toString() : "");
47833	}
47834}
47835class Issuers extends XFAObject {
47836	constructor(attributes) {
47837		super(TEMPLATE_NS_ID, "issuers", true);
47838		this.id = attributes.id || "";
47839		this.type = getStringOption(attributes.type, ["optional", "required"]);
47840		this.use = attributes.use || "";
47841		this.usehref = attributes.usehref || "";
47842		this.certificate = new XFAObjectArray();
47843	}
47844}
47845class Items extends XFAObject {
47846	constructor(attributes) {
47847		super(TEMPLATE_NS_ID, "items", true);
47848		this.id = attributes.id || "";
47849		this.name = attributes.name || "";
47850		this.presence = getStringOption(attributes.presence, ["visible", "hidden", "inactive", "invisible"]);
47851		this.ref = attributes.ref || "";
47852		this.save = getInteger({
47853			data: attributes.save,
47854			defaultValue: 0,
47855			validate: x => x === 1
47856		});
47857		this.use = attributes.use || "";
47858		this.usehref = attributes.usehref || "";
47859		this.boolean = new XFAObjectArray();
47860		this.date = new XFAObjectArray();
47861		this.dateTime = new XFAObjectArray();
47862		this.decimal = new XFAObjectArray();
47863		this.exData = new XFAObjectArray();
47864		this.float = new XFAObjectArray();
47865		this.image = new XFAObjectArray();
47866		this.integer = new XFAObjectArray();
47867		this.text = new XFAObjectArray();
47868		this.time = new XFAObjectArray();
47869	}
47870	[$toHTML]() {
47871		const output = [];
47872		for (const child of this[$getChildren]()) {
47873			output.push(child[$text]());
47874		}
47875		return HTMLResult.success(output);
47876	}
47877}
47878class Keep extends XFAObject {
47879	constructor(attributes) {
47880		super(TEMPLATE_NS_ID, "keep", true);
47881		this.id = attributes.id || "";
47882		const options = ["none", "contentArea", "pageArea"];
47883		this.intact = getStringOption(attributes.intact, options);
47884		this.next = getStringOption(attributes.next, options);
47885		this.previous = getStringOption(attributes.previous, options);
47886		this.use = attributes.use || "";
47887		this.usehref = attributes.usehref || "";
47888		this.extras = null;
47889	}
47890}
47891class KeyUsage extends XFAObject {
47892	constructor(attributes) {
47893		super(TEMPLATE_NS_ID, "keyUsage");
vendor: 18,762 bytes, lines 47894-48490
47894		const options = ["", "yes", "no"];
47895		this.crlSign = getStringOption(attributes.crlSign, options);
47896		this.dataEncipherment = getStringOption(attributes.dataEncipherment, options);
47897		this.decipherOnly = getStringOption(attributes.decipherOnly, options);
47898		this.digitalSignature = getStringOption(attributes.digitalSignature, options);
47899		this.encipherOnly = getStringOption(attributes.encipherOnly, options);
47900		this.id = attributes.id || "";
47901		this.keyAgreement = getStringOption(attributes.keyAgreement, options);
47902		this.keyCertSign = getStringOption(attributes.keyCertSign, options);
47903		this.keyEncipherment = getStringOption(attributes.keyEncipherment, options);
47904		this.nonRepudiation = getStringOption(attributes.nonRepudiation, options);
47905		this.type = getStringOption(attributes.type, ["optional", "required"]);
47906		this.use = attributes.use || "";
47907		this.usehref = attributes.usehref || "";
47908	}
47909}
47910class Line extends XFAObject {
47911	constructor(attributes) {
47912		super(TEMPLATE_NS_ID, "line", true);
47913		this.hand = getStringOption(attributes.hand, ["even", "left", "right"]);
47914		this.id = attributes.id || "";
47915		this.slope = getStringOption(attributes.slope, ["\\", "/"]);
47916		this.use = attributes.use || "";
47917		this.usehref = attributes.usehref || "";
47918		this.edge = null;
47919	}
47920	[$toHTML]() {
47921		const parent = this[$getParent]()[$getParent]();
47922		const edge = this.edge || new Edge({});
47923		const edgeStyle = edge[$toStyle]();
47924		const style = Object.create(null);
47925		const thickness = edge.presence === "visible" ? edge.thickness : 0;
47926		style.strokeWidth = measureToString(thickness);
47927		style.stroke = edgeStyle.color;
47928		let x1, y1, x2, y2;
47929		let width = "100%";
47930		let height = "100%";
47931		if (parent.w <= thickness) {
47932			[x1, y1, x2, y2] = ["50%", 0, "50%", "100%"];
47933			width = style.strokeWidth;
47934		} else if (parent.h <= thickness) {
47935			[x1, y1, x2, y2] = [0, "50%", "100%", "50%"];
47936			height = style.strokeWidth;
47937		} else if (this.slope === "\\") {
47938			[x1, y1, x2, y2] = [0, 0, "100%", "100%"];
47939		} else {
47940			[x1, y1, x2, y2] = [0, "100%", "100%", 0];
47941		}
47942		const line = {
47943			name: "line",
47944			attributes: {
47945				xmlns: SVG_NS,
47946				x1,
47947				y1,
47948				x2,
47949				y2,
47950				style
47951			}
47952		};
47953		const svg = {
47954			name: "svg",
47955			children: [line],
47956			attributes: {
47957				xmlns: SVG_NS,
47958				width,
47959				height,
47960				style: {
47961					overflow: "visible"
47962				}
47963			}
47964		};
47965		if (hasMargin(parent)) {
47966			return HTMLResult.success({
47967				name: "div",
47968				attributes: {
47969					style: {
47970						display: "inline",
47971						width: "100%",
47972						height: "100%"
47973					}
47974				},
47975				children: [svg]
47976			});
47977		}
47978		svg.attributes.style.position = "absolute";
47979		return HTMLResult.success(svg);
47980	}
47981}
47982class Linear extends XFAObject {
47983	constructor(attributes) {
47984		super(TEMPLATE_NS_ID, "linear", true);
47985		this.id = attributes.id || "";
47986		this.type = getStringOption(attributes.type, ["toRight", "toBottom", "toLeft", "toTop"]);
47987		this.use = attributes.use || "";
47988		this.usehref = attributes.usehref || "";
47989		this.color = null;
47990		this.extras = null;
47991	}
47992	[$toStyle](startColor) {
47993		startColor = startColor ? startColor[$toStyle]() : "#FFFFFF";
47994		const transf = this.type.replace(/([RBLT])/, " $1").toLowerCase();
47995		const endColor = this.color ? this.color[$toStyle]() : "#000000";
47996		return `linear-gradient(${transf}, ${startColor}, ${endColor})`;
47997	}
47998}
47999class LockDocument extends ContentObject {
48000	constructor(attributes) {
48001		super(TEMPLATE_NS_ID, "lockDocument");
48002		this.id = attributes.id || "";
48003		this.type = getStringOption(attributes.type, ["optional", "required"]);
48004		this.use = attributes.use || "";
48005		this.usehref = attributes.usehref || "";
48006	}
48007	[$finalize]() {
48008		this[$content] = getStringOption(this[$content], ["auto", "0", "1"]);
48009	}
48010}
48011class Manifest extends XFAObject {
48012	constructor(attributes) {
48013		super(TEMPLATE_NS_ID, "manifest", true);
48014		this.action = getStringOption(attributes.action, ["include", "all", "exclude"]);
48015		this.id = attributes.id || "";
48016		this.name = attributes.name || "";
48017		this.use = attributes.use || "";
48018		this.usehref = attributes.usehref || "";
48019		this.extras = null;
48020		this.ref = new XFAObjectArray();
48021	}
48022}
48023class Margin extends XFAObject {
48024	constructor(attributes) {
48025		super(TEMPLATE_NS_ID, "margin", true);
48026		this.bottomInset = getMeasurement(attributes.bottomInset, "0");
48027		this.id = attributes.id || "";
48028		this.leftInset = getMeasurement(attributes.leftInset, "0");
48029		this.rightInset = getMeasurement(attributes.rightInset, "0");
48030		this.topInset = getMeasurement(attributes.topInset, "0");
48031		this.use = attributes.use || "";
48032		this.usehref = attributes.usehref || "";
48033		this.extras = null;
48034	}
48035	[$toStyle]() {
48036		return {
48037			margin: measureToString(this.topInset) + " " + measureToString(this.rightInset) + " " + measureToString(this.bottomInset) + " " + measureToString(this.leftInset)
48038		};
48039	}
48040}
48041class Mdp extends XFAObject {
48042	constructor(attributes) {
48043		super(TEMPLATE_NS_ID, "mdp");
48044		this.id = attributes.id || "";
48045		this.permissions = getInteger({
48046			data: attributes.permissions,
48047			defaultValue: 2,
48048			validate: x => x === 1 || x === 3
48049		});
48050		this.signatureType = getStringOption(attributes.signatureType, ["filler", "author"]);
48051		this.use = attributes.use || "";
48052		this.usehref = attributes.usehref || "";
48053	}
48054}
48055class Medium extends XFAObject {
48056	constructor(attributes) {
48057		super(TEMPLATE_NS_ID, "medium");
48058		this.id = attributes.id || "";
48059		this.imagingBBox = getBBox(attributes.imagingBBox);
48060		this.long = getMeasurement(attributes.long);
48061		this.orientation = getStringOption(attributes.orientation, ["portrait", "landscape"]);
48062		this.short = getMeasurement(attributes.short);
48063		this.stock = attributes.stock || "";
48064		this.trayIn = getStringOption(attributes.trayIn, ["auto", "delegate", "pageFront"]);
48065		this.trayOut = getStringOption(attributes.trayOut, ["auto", "delegate"]);
48066		this.use = attributes.use || "";
48067		this.usehref = attributes.usehref || "";
48068	}
48069}
48070class Message extends XFAObject {
48071	constructor(attributes) {
48072		super(TEMPLATE_NS_ID, "message", true);
48073		this.id = attributes.id || "";
48074		this.use = attributes.use || "";
48075		this.usehref = attributes.usehref || "";
48076		this.text = new XFAObjectArray();
48077	}
48078}
48079class NumericEdit extends XFAObject {
48080	constructor(attributes) {
48081		super(TEMPLATE_NS_ID, "numericEdit", true);
48082		this.hScrollPolicy = getStringOption(attributes.hScrollPolicy, ["auto", "off", "on"]);
48083		this.id = attributes.id || "";
48084		this.use = attributes.use || "";
48085		this.usehref = attributes.usehref || "";
48086		this.border = null;
48087		this.comb = null;
48088		this.extras = null;
48089		this.margin = null;
48090	}
48091	[$toHTML](availableSpace) {
48092		const style = toStyle(this, "border", "font", "margin");
48093		const field = this[$getParent]()[$getParent]();
48094		const html = {
48095			name: "input",
48096			attributes: {
48097				type: "text",
48098				fieldId: field[$uid],
48099				dataId: field[$data]?.[$uid] || field[$uid],
48100				class: ["xfaTextfield"],
48101				style,
48102				"aria-label": ariaLabel(field),
48103				"aria-required": false
48104			}
48105		};
48106		if (isRequired(field)) {
48107			html.attributes["aria-required"] = true;
48108			html.attributes.required = true;
48109		}
48110		return HTMLResult.success({
48111			name: "label",
48112			attributes: {
48113				class: ["xfaLabel"]
48114			},
48115			children: [html]
48116		});
48117	}
48118}
48119class Occur extends XFAObject {
48120	constructor(attributes) {
48121		super(TEMPLATE_NS_ID, "occur", true);
48122		this.id = attributes.id || "";
48123		this.initial = attributes.initial !== "" ? getInteger({
48124			data: attributes.initial,
48125			defaultValue: "",
48126			validate: x => true
48127		}) : "";
48128		this.max = attributes.max !== "" ? getInteger({
48129			data: attributes.max,
48130			defaultValue: 1,
48131			validate: x => true
48132		}) : "";
48133		this.min = attributes.min !== "" ? getInteger({
48134			data: attributes.min,
48135			defaultValue: 1,
48136			validate: x => true
48137		}) : "";
48138		this.use = attributes.use || "";
48139		this.usehref = attributes.usehref || "";
48140		this.extras = null;
48141	}
48142	[$clean]() {
48143		const parent = this[$getParent]();
48144		const originalMin = this.min;
48145		if (this.min === "") {
48146			this.min = parent instanceof PageArea || parent instanceof PageSet ? 0 : 1;
48147		}
48148		if (this.max === "") {
48149			if (originalMin === "") {
48150				this.max = parent instanceof PageArea || parent instanceof PageSet ? -1 : 1;
48151			} else {
48152				this.max = this.min;
48153			}
48154		}
48155		if (this.max !== -1 && this.max < this.min) {
48156			this.max = this.min;
48157		}
48158		if (this.initial === "") {
48159			this.initial = parent instanceof Template ? 1 : this.min;
48160		}
48161	}
48162}
48163class Oid extends StringObject {
48164	constructor(attributes) {
48165		super(TEMPLATE_NS_ID, "oid");
48166		this.id = attributes.id || "";
48167		this.name = attributes.name || "";
48168		this.use = attributes.use || "";
48169		this.usehref = attributes.usehref || "";
48170	}
48171}
48172class Oids extends XFAObject {
48173	constructor(attributes) {
48174		super(TEMPLATE_NS_ID, "oids", true);
48175		this.id = attributes.id || "";
48176		this.type = getStringOption(attributes.type, ["optional", "required"]);
48177		this.use = attributes.use || "";
48178		this.usehref = attributes.usehref || "";
48179		this.oid = new XFAObjectArray();
48180	}
48181}
48182class Overflow extends XFAObject {
48183	constructor(attributes) {
48184		super(TEMPLATE_NS_ID, "overflow");
48185		this.id = attributes.id || "";
48186		this.leader = attributes.leader || "";
48187		this.target = attributes.target || "";
48188		this.trailer = attributes.trailer || "";
48189		this.use = attributes.use || "";
48190		this.usehref = attributes.usehref || "";
48191	}
48192	[$getExtra]() {
48193		if (!this[$extra]) {
48194			const parent = this[$getParent]();
48195			const root = this[$getTemplateRoot]();
48196			const target = root[$searchNode](this.target, parent);
48197			const leader = root[$searchNode](this.leader, parent);
48198			const trailer = root[$searchNode](this.trailer, parent);
48199			this[$extra] = {
48200				target: target?.[0] || null,
48201				leader: leader?.[0] || null,
48202				trailer: trailer?.[0] || null,
48203				addLeader: false,
48204				addTrailer: false
48205			};
48206		}
48207		return this[$extra];
48208	}
48209}
48210class PageArea extends XFAObject {
48211	constructor(attributes) {
48212		super(TEMPLATE_NS_ID, "pageArea", true);
48213		this.blankOrNotBlank = getStringOption(attributes.blankOrNotBlank, ["any", "blank", "notBlank"]);
48214		this.id = attributes.id || "";
48215		this.initialNumber = getInteger({
48216			data: attributes.initialNumber,
48217			defaultValue: 1,
48218			validate: x => true
48219		});
48220		this.name = attributes.name || "";
48221		this.numbered = getInteger({
48222			data: attributes.numbered,
48223			defaultValue: 1,
48224			validate: x => true
48225		});
48226		this.oddOrEven = getStringOption(attributes.oddOrEven, ["any", "even", "odd"]);
48227		this.pagePosition = getStringOption(attributes.pagePosition, ["any", "first", "last", "only", "rest"]);
48228		this.relevant = getRelevant(attributes.relevant);
48229		this.use = attributes.use || "";
48230		this.usehref = attributes.usehref || "";
48231		this.desc = null;
48232		this.extras = null;
48233		this.medium = null;
48234		this.occur = null;
48235		this.area = new XFAObjectArray();
48236		this.contentArea = new XFAObjectArray();
48237		this.draw = new XFAObjectArray();
48238		this.exclGroup = new XFAObjectArray();
48239		this.field = new XFAObjectArray();
48240		this.subform = new XFAObjectArray();
48241	}
48242	[$isUsable]() {
48243		if (!this[$extra]) {
48244			this[$extra] = {
48245				numberOfUse: 0
48246			};
48247			return true;
48248		}
48249		return !this.occur || this.occur.max === -1 || this[$extra].numberOfUse < this.occur.max;
48250	}
48251	[$cleanPage]() {
48252		delete this[$extra];
48253	}
48254	[$getNextPage]() {
48255		if (!this[$extra]) {
48256			this[$extra] = {
48257				numberOfUse: 0
48258			};
48259		}
48260		const parent = this[$getParent]();
48261		if (parent.relation === "orderedOccurrence") {
48262			if (this[$isUsable]()) {
48263				this[$extra].numberOfUse += 1;
48264				return this;
48265			}
48266		}
48267		return parent[$getNextPage]();
48268	}
48269	[$getAvailableSpace]() {
48270		return this[$extra].space || {
48271			width: 0,
48272			height: 0
48273		};
48274	}
48275	[$toHTML]() {
48276		if (!this[$extra]) {
48277			this[$extra] = {
48278				numberOfUse: 1
48279			};
48280		}
48281		const children = [];
48282		this[$extra].children = children;
48283		const style = Object.create(null);
48284		if (this.medium && this.medium.short && this.medium.long) {
48285			style.width = measureToString(this.medium.short);
48286			style.height = measureToString(this.medium.long);
48287			this[$extra].space = {
48288				width: this.medium.short,
48289				height: this.medium.long
48290			};
48291			if (this.medium.orientation === "landscape") {
48292				const x = style.width;
48293				style.width = style.height;
48294				style.height = x;
48295				this[$extra].space = {
48296					width: this.medium.long,
48297					height: this.medium.short
48298				};
48299			}
48300		} else {
48301			warn("XFA - No medium specified in pageArea: please file a bug.");
48302		}
48303		this[$childrenToHTML]({
48304			filter: new Set(["area", "draw", "field", "subform"]),
48305			include: true
48306		});
48307		this[$childrenToHTML]({
48308			filter: new Set(["contentArea"]),
48309			include: true
48310		});
48311		return HTMLResult.success({
48312			name: "div",
48313			children,
48314			attributes: {
48315				class: ["xfaPage"],
48316				id: this[$uid],
48317				style,
48318				xfaName: this.name
48319			}
48320		});
48321	}
48322}
48323class PageSet extends XFAObject {
48324	constructor(attributes) {
48325		super(TEMPLATE_NS_ID, "pageSet", true);
48326		this.duplexImposition = getStringOption(attributes.duplexImposition, ["longEdge", "shortEdge"]);
48327		this.id = attributes.id || "";
48328		this.name = attributes.name || "";
48329		this.relation = getStringOption(attributes.relation, ["orderedOccurrence", "duplexPaginated", "simplexPaginated"]);
48330		this.relevant = getRelevant(attributes.relevant);
48331		this.use = attributes.use || "";
48332		this.usehref = attributes.usehref || "";
48333		this.extras = null;
48334		this.occur = null;
48335		this.pageArea = new XFAObjectArray();
48336		this.pageSet = new XFAObjectArray();
48337	}
48338	[$cleanPage]() {
48339		for (const page of this.pageArea.children) {
48340			page[$cleanPage]();
48341		}
48342		for (const page of this.pageSet.children) {
48343			page[$cleanPage]();
48344		}
48345	}
48346	[$isUsable]() {
48347		return !this.occur || this.occur.max === -1 || this[$extra].numberOfUse < this.occur.max;
48348	}
48349	[$getNextPage]() {
48350		if (!this[$extra]) {
48351			this[$extra] = {
48352				numberOfUse: 1,
48353				pageIndex: -1,
48354				pageSetIndex: -1
48355			};
48356		}
48357		if (this.relation === "orderedOccurrence") {
48358			if (this[$extra].pageIndex + 1 < this.pageArea.children.length) {
48359				this[$extra].pageIndex += 1;
48360				const pageArea = this.pageArea.children[this[$extra].pageIndex];
48361				return pageArea[$getNextPage]();
48362			}
48363			if (this[$extra].pageSetIndex + 1 < this.pageSet.children.length) {
48364				this[$extra].pageSetIndex += 1;
48365				return this.pageSet.children[this[$extra].pageSetIndex][$getNextPage]();
48366			}
48367			if (this[$isUsable]()) {
48368				this[$extra].numberOfUse += 1;
48369				this[$extra].pageIndex = -1;
48370				this[$extra].pageSetIndex = -1;
48371				return this[$getNextPage]();
48372			}
48373			const parent = this[$getParent]();
48374			if (parent instanceof PageSet) {
48375				return parent[$getNextPage]();
48376			}
48377			this[$cleanPage]();
48378			return this[$getNextPage]();
48379		}
48380		const pageNumber = this[$getTemplateRoot]()[$extra].pageNumber;
48381		const parity = pageNumber % 2 === 0 ? "even" : "odd";
48382		const position = pageNumber === 0 ? "first" : "rest";
48383		let page = this.pageArea.children.find(p => p.oddOrEven === parity && p.pagePosition === position);
48384		if (page) {
48385			return page;
48386		}
48387		page = this.pageArea.children.find(p => p.oddOrEven === "any" && p.pagePosition === position);
48388		if (page) {
48389			return page;
48390		}
48391		page = this.pageArea.children.find(p => p.oddOrEven === "any" && p.pagePosition === "any");
48392		if (page) {
48393			return page;
48394		}
48395		return this.pageArea.children[0];
48396	}
48397}
48398class Para extends XFAObject {
48399	constructor(attributes) {
48400		super(TEMPLATE_NS_ID, "para", true);
48401		this.hAlign = getStringOption(attributes.hAlign, ["left", "center", "justify", "justifyAll", "radix", "right"]);
48402		this.id = attributes.id || "";
48403		this.lineHeight = attributes.lineHeight ? getMeasurement(attributes.lineHeight, "0pt") : "";
48404		this.marginLeft = attributes.marginLeft ? getMeasurement(attributes.marginLeft, "0pt") : "";
48405		this.marginRight = attributes.marginRight ? getMeasurement(attributes.marginRight, "0pt") : "";
48406		this.orphans = getInteger({
48407			data: attributes.orphans,
48408			defaultValue: 0,
48409			validate: x => x >= 0
48410		});
48411		this.preserve = attributes.preserve || "";
48412		this.radixOffset = attributes.radixOffset ? getMeasurement(attributes.radixOffset, "0pt") : "";
48413		this.spaceAbove = attributes.spaceAbove ? getMeasurement(attributes.spaceAbove, "0pt") : "";
48414		this.spaceBelow = attributes.spaceBelow ? getMeasurement(attributes.spaceBelow, "0pt") : "";
48415		this.tabDefault = attributes.tabDefault ? getMeasurement(this.tabDefault) : "";
48416		this.tabStops = (attributes.tabStops || "").trim().split(/\s+/).map((x, i) => i % 2 === 1 ? getMeasurement(x) : x);
48417		this.textIndent = attributes.textIndent ? getMeasurement(attributes.textIndent, "0pt") : "";
48418		this.use = attributes.use || "";
48419		this.usehref = attributes.usehref || "";
48420		this.vAlign = getStringOption(attributes.vAlign, ["top", "bottom", "middle"]);
48421		this.widows = getInteger({
48422			data: attributes.widows,
48423			defaultValue: 0,
48424			validate: x => x >= 0
48425		});
48426		this.hyphenation = null;
48427	}
48428	[$toStyle]() {
48429		const style = toStyle(this, "hAlign");
48430		if (this.marginLeft !== "") {
48431			style.paddingLeft = measureToString(this.marginLeft);
48432		}
48433		if (this.marginRight !== "") {
48434			style.paddingRight = measureToString(this.marginRight);
48435		}
48436		if (this.spaceAbove !== "") {
48437			style.paddingTop = measureToString(this.spaceAbove);
48438		}
48439		if (this.spaceBelow !== "") {
48440			style.paddingBottom = measureToString(this.spaceBelow);
48441		}
48442		if (this.textIndent !== "") {
48443			style.textIndent = measureToString(this.textIndent);
48444			fixTextIndent(style);
48445		}
48446		if (this.lineHeight > 0) {
48447			style.lineHeight = measureToString(this.lineHeight);
48448		}
48449		if (this.tabDefault !== "") {
48450			style.tabSize = measureToString(this.tabDefault);
48451		}
48452		if (this.tabStops.length > 0) {}
48453		if (this.hyphenatation) {
48454			Object.assign(style, this.hyphenatation[$toStyle]());
48455		}
48456		return style;
48457	}
48458}
48459class PasswordEdit extends XFAObject {
48460	constructor(attributes) {
48461		super(TEMPLATE_NS_ID, "passwordEdit", true);
48462		this.hScrollPolicy = getStringOption(attributes.hScrollPolicy, ["auto", "off", "on"]);
48463		this.id = attributes.id || "";
48464		this.passwordChar = attributes.passwordChar || "*";
48465		this.use = attributes.use || "";
48466		this.usehref = attributes.usehref || "";
48467		this.border = null;
48468		this.extras = null;
48469		this.margin = null;
48470	}
48471}
48472class template_Pattern extends XFAObject {
48473	constructor(attributes) {
48474		super(TEMPLATE_NS_ID, "pattern", true);
48475		this.id = attributes.id || "";
48476		this.type = getStringOption(attributes.type, ["crossHatch", "crossDiagonal", "diagonalLeft", "diagonalRight", "horizontal", "vertical"]);
48477		this.use = attributes.use || "";
48478		this.usehref = attributes.usehref || "";
48479		this.color = null;
48480		this.extras = null;
48481	}
48482	[$toStyle](startColor) {
48483		startColor = startColor ? startColor[$toStyle]() : "#FFFFFF";
48484		const endColor = this.color ? this.color[$toStyle]() : "#000000";
48485		const width = 5;
48486		const cmd = "repeating-linear-gradient";
48487		const colors = `${startColor},${startColor} ${width}px,${endColor} ${width}px,${endColor} ${2 * width}px`;
48488		switch (this.type) {
48489			case "crossHatch":
48490				return `${cmd}
48490(to top,${colors}) ${cmd}(to right,${colors})`;
48491			case "crossDiagonal":
48492				return `${cmd}(45deg,${colors}) ${cmd}(-45deg,${colors})`;
48493			case "diagonalLeft":
48494				return `${cmd}(45deg,${colors})`;
48495			case "diagonalRight":
48496				return `${cmd}(-45deg,${colors})`;
48497			case "horizontal":
48498				return `${cmd}(to top,${colors})`;
48499			case "vertical":
48500				return `${cmd}(to right,${colors})`;
48501		}
48502		return "";
48503	}
48504}
48505class Picture extends StringObject {
48506	constructor(attributes) {
48507		super(TEMPLATE_NS_ID, "picture");
48508		this.id = attributes.id || "";
48509		this.use = attributes.use || "";
48510		this.usehref = attributes.usehref || "";
48511	}
48512}
48513class Proto extends XFAObject {
48514	constructor(attributes) {
48515		super(TEMPLATE_NS_ID, "proto", true);
48516		this.appearanceFilter = new XFAObjectArray();
48517		this.arc = new XFAObjectArray();
48518		this.area = new XFAObjectArray();
48519		this.assist = new XFAObjectArray();
48520		this.barcode = new XFAObjectArray();
48521		this.bindItems = new XFAObjectArray();
48522		this.bookend = new XFAObjectArray();
48523		this.boolean = new XFAObjectArray();
48524		this.border = new XFAObjectArray();
48525		this.break = new XFAObjectArray();
48526		this.breakAfter = new XFAObjectArray();
48527		this.breakBefore = new XFAObjectArray();
48528		this.button = new XFAObjectArray();
48529		this.calculate = new XFAObjectArray();
48530		this.caption = new XFAObjectArray();
48531		this.certificate = new XFAObjectArray();
48532		this.certificates = new XFAObjectArray();
48533		this.checkButton = new XFAObjectArray();
48534		this.choiceList = new XFAObjectArray();
48535		this.color = new XFAObjectArray();
48536		this.comb = new XFAObjectArray();
48537		this.connect = new XFAObjectArray();
48538		this.contentArea = new XFAObjectArray();
48539		this.corner = new XFAObjectArray();
48540		this.date = new XFAObjectArray();
48541		this.dateTime = new XFAObjectArray();
48542		this.dateTimeEdit = new XFAObjectArray();
48543		this.decimal = new XFAObjectArray();
48544		this.defaultUi = new XFAObjectArray();
48545		this.desc = new XFAObjectArray();
48546		this.digestMethod = new XFAObjectArray();
48547		this.digestMethods = new XFAObjectArray();
48548		this.draw = new XFAObjectArray();
48549		this.edge = new XFAObjectArray();
48550		this.encoding = new XFAObjectArray();
48551		this.encodings = new XFAObjectArray();
48552		this.encrypt = new XFAObjectArray();
48553		this.encryptData = new XFAObjectArray();
48554		this.encryption = new XFAObjectArray();
48555		this.encryptionMethod = new XFAObjectArray();
48556		this.encryptionMethods = new XFAObjectArray();
48557		this.event = new XFAObjectArray();
48558		this.exData = new XFAObjectArray();
48559		this.exObject = new XFAObjectArray();
48560		this.exclGroup = new XFAObjectArray();
48561		this.execute = new XFAObjectArray();
48562		this.extras = new XFAObjectArray();
48563		this.field = new XFAObjectArray();
48564		this.fill = new XFAObjectArray();
48565		this.filter = new XFAObjectArray();
48566		this.float = new XFAObjectArray();
48567		this.font = new XFAObjectArray();
48568		this.format = new XFAObjectArray();
48569		this.handler = new XFAObjectArray();
48570		this.hyphenation = new XFAObjectArray();
48571		this.image = new XFAObjectArray();
48572		this.imageEdit = new XFAObjectArray();
48573		this.integer = new XFAObjectArray();
48574		this.issuers = new XFAObjectArray();
48575		this.items = new XFAObjectArray();
48576		this.keep = new XFAObjectArray();
48577		this.keyUsage = new XFAObjectArray();
48578		this.line = new XFAObjectArray();
48579		this.linear = new XFAObjectArray();
48580		this.lockDocument = new XFAObjectArray();
48581		this.manifest = new XFAObjectArray();
48582		this.margin = new XFAObjectArray();
48583		this.mdp = new XFAObjectArray();
48584		this.medium = new XFAObjectArray();
48585		this.message = new XFAObjectArray();
48586		this.numericEdit = new XFAObjectArray();
48587		this.occur = new XFAObjectArray();
48588		this.oid = new XFAObjectArray();
48589		this.oids = new XFAObjectArray();
48590		this.overflow = new XFAObjectArray();
48591		this.pageArea = new XFAObjectArray();
48592		this.pageSet = new XFAObjectArray();
48593		this.para = new XFAObjectArray();
48594		this.passwordEdit = new XFAObjectArray();
48595		this.pattern = new XFAObjectArray();
48596		this.picture = new XFAObjectArray();
48597		this.radial = new XFAObjectArray();
48598		this.reason = new XFAObjectArray();
48599		this.reasons = new XFAObjectArray();
48600		this.rectangle = new XFAObjectArray();
48601		this.ref = new XFAObjectArray();
48602		this.script = new XFAObjectArray();
48603		this.setProperty = new XFAObjectArray();
48604		this.signData = new XFAObjectArray();
48605		this.signature = new XFAObjectArray();
48606		this.signing = new XFAObjectArray();
48607		this.solid = new XFAObjectArray();
48608		this.speak = new XFAObjectArray();
48609		this.stipple = new XFAObjectArray();
48610		this.subform = new XFAObjectArray();
48611		this.subformSet = new XFAObjectArray();
48612		this.subjectDN = new XFAObjectArray();
48613		this.subjectDNs = new XFAObjectArray();
48614		this.submit = new XFAObjectArray();
48615		this.text = new XFAObjectArray();
48616		this.textEdit = new XFAObjectArray();
48617		this.time = new XFAObjectArray();
48618		this.timeStamp = new XFAObjectArray();
48619		this.toolTip = new XFAObjectArray();
48620		this.traversal = new XFAObjectArray();
48621		this.traverse = new XFAObjectArray();
48622		this.ui = new XFAObjectArray();
48623		this.validate = new XFAObjectArray();
48624		this.value = new XFAObjectArray();
48625		this.variables = new XFAObjectArray();
48626	}
48627}
48628class Radial extends XFAObject {
48629	constructor(attributes) {
48630		super(TEMPLATE_NS_ID, "radial", true);
48631		this.id = attributes.id || "";
48632		this.type = getStringOption(attributes.type, ["toEdge", "toCenter"]);
48633		this.use = attributes.use || "";
48634		this.usehref = attributes.usehref || "";
48635		this.color = null;
48636		this.extras = null;
48637	}
48638	[$toStyle](startColor) {
48639		startColor = startColor ? startColor[$toStyle]() : "#FFFFFF";
48640		const endColor = this.color ? this.color[$toStyle]() : "#000000";
48641		const colors = this.type === "toEdge" ? `${startColor},${endColor}` : `${endColor},${startColor}`;
48642		return `radial-gradient(circle at center, ${colors})`;
48643	}
48644}
48645class Reason extends StringObject {
48646	constructor(attributes) {
48647		super(TEMPLATE_NS_ID, "reason");
48648		this.id = attributes.id || "";
48649		this.name = attributes.name || "";
48650		this.use = attributes.use || "";
48651		this.usehref = attributes.usehref || "";
48652	}
48653}
48654class Reasons extends XFAObject {
48655	constructor(attributes) {
48656		super(TEMPLATE_NS_ID, "reasons", true);
48657		this.id = attributes.id || "";
48658		this.type = getStringOption(attributes.type, ["optional", "required"]);
48659		this.use = attributes.use || "";
48660		this.usehref = attributes.usehref || "";
48661		this.reason = new XFAObjectArray();
48662	}
48663}
48664class Rectangle extends XFAObject {
48665	constructor(attributes) {
48666		super(TEMPLATE_NS_ID, "rectangle", true);
48667		this.hand = getStringOption(attributes.hand, ["even", "left", "right"]);
48668		this.id = attributes.id || "";
48669		this.use = attributes.use || "";
48670		this.usehref = attributes.usehref || "";
48671		this.corner = new XFAObjectArray(4);
48672		this.edge = new XFAObjectArray(4);
48673		this.fill = null;
48674	}
48675	[$toHTML]() {
48676		const edge = this.edge.children.length ? this.edge.children[0] : new Edge({});
48677		const edgeStyle = edge[$toStyle]();
48678		const style = Object.create(null);
48679		if (this.fill?.presence === "visible") {
48680			Object.assign(style, this.fill[$toStyle]());
48681		} else {
48682			style.fill = "transparent";
vendor: 29,310 bytes, lines 48683-49666
48683		}
48684		style.strokeWidth = measureToString(edge.presence === "visible" ? edge.thickness : 0);
48685		style.stroke = edgeStyle.color;
48686		const corner = this.corner.children.length ? this.corner.children[0] : new Corner({});
48687		const cornerStyle = corner[$toStyle]();
48688		const rect = {
48689			name: "rect",
48690			attributes: {
48691				xmlns: SVG_NS,
48692				width: "100%",
48693				height: "100%",
48694				x: 0,
48695				y: 0,
48696				rx: cornerStyle.radius,
48697				ry: cornerStyle.radius,
48698				style
48699			}
48700		};
48701		const svg = {
48702			name: "svg",
48703			children: [rect],
48704			attributes: {
48705				xmlns: SVG_NS,
48706				style: {
48707					overflow: "visible"
48708				},
48709				width: "100%",
48710				height: "100%"
48711			}
48712		};
48713		const parent = this[$getParent]()[$getParent]();
48714		if (hasMargin(parent)) {
48715			return HTMLResult.success({
48716				name: "div",
48717				attributes: {
48718					style: {
48719						display: "inline",
48720						width: "100%",
48721						height: "100%"
48722					}
48723				},
48724				children: [svg]
48725			});
48726		}
48727		svg.attributes.style.position = "absolute";
48728		return HTMLResult.success(svg);
48729	}
48730}
48731class RefElement extends StringObject {
48732	constructor(attributes) {
48733		super(TEMPLATE_NS_ID, "ref");
48734		this.id = attributes.id || "";
48735		this.use = attributes.use || "";
48736		this.usehref = attributes.usehref || "";
48737	}
48738}
48739class Script extends StringObject {
48740	constructor(attributes) {
48741		super(TEMPLATE_NS_ID, "script");
48742		this.binding = attributes.binding || "";
48743		this.contentType = attributes.contentType || "";
48744		this.id = attributes.id || "";
48745		this.name = attributes.name || "";
48746		this.runAt = getStringOption(attributes.runAt, ["client", "both", "server"]);
48747		this.use = attributes.use || "";
48748		this.usehref = attributes.usehref || "";
48749	}
48750}
48751class SetProperty extends XFAObject {
48752	constructor(attributes) {
48753		super(TEMPLATE_NS_ID, "setProperty");
48754		this.connection = attributes.connection || "";
48755		this.ref = attributes.ref || "";
48756		this.target = attributes.target || "";
48757	}
48758}
48759class SignData extends XFAObject {
48760	constructor(attributes) {
48761		super(TEMPLATE_NS_ID, "signData", true);
48762		this.id = attributes.id || "";
48763		this.operation = getStringOption(attributes.operation, ["sign", "clear", "verify"]);
48764		this.ref = attributes.ref || "";
48765		this.target = attributes.target || "";
48766		this.use = attributes.use || "";
48767		this.usehref = attributes.usehref || "";
48768		this.filter = null;
48769		this.manifest = null;
48770	}
48771}
48772class Signature extends XFAObject {
48773	constructor(attributes) {
48774		super(TEMPLATE_NS_ID, "signature", true);
48775		this.id = attributes.id || "";
48776		this.type = getStringOption(attributes.type, ["PDF1.3", "PDF1.6"]);
48777		this.use = attributes.use || "";
48778		this.usehref = attributes.usehref || "";
48779		this.border = null;
48780		this.extras = null;
48781		this.filter = null;
48782		this.manifest = null;
48783		this.margin = null;
48784	}
48785}
48786class Signing extends XFAObject {
48787	constructor(attributes) {
48788		super(TEMPLATE_NS_ID, "signing", true);
48789		this.id = attributes.id || "";
48790		this.type = getStringOption(attributes.type, ["optional", "required"]);
48791		this.use = attributes.use || "";
48792		this.usehref = attributes.usehref || "";
48793		this.certificate = new XFAObjectArray();
48794	}
48795}
48796class Solid extends XFAObject {
48797	constructor(attributes) {
48798		super(TEMPLATE_NS_ID, "solid", true);
48799		this.id = attributes.id || "";
48800		this.use = attributes.use || "";
48801		this.usehref = attributes.usehref || "";
48802		this.extras = null;
48803	}
48804	[$toStyle](startColor) {
48805		return startColor ? startColor[$toStyle]() : "#FFFFFF";
48806	}
48807}
48808class Speak extends StringObject {
48809	constructor(attributes) {
48810		super(TEMPLATE_NS_ID, "speak");
48811		this.disable = getInteger({
48812			data: attributes.disable,
48813			defaultValue: 0,
48814			validate: x => x === 1
48815		});
48816		this.id = attributes.id || "";
48817		this.priority = getStringOption(attributes.priority, ["custom", "caption", "name", "toolTip"]);
48818		this.rid = attributes.rid || "";
48819		this.use = attributes.use || "";
48820		this.usehref = attributes.usehref || "";
48821	}
48822}
48823class Stipple extends XFAObject {
48824	constructor(attributes) {
48825		super(TEMPLATE_NS_ID, "stipple", true);
48826		this.id = attributes.id || "";
48827		this.rate = getInteger({
48828			data: attributes.rate,
48829			defaultValue: 50,
48830			validate: x => x >= 0 && x <= 100
48831		});
48832		this.use = attributes.use || "";
48833		this.usehref = attributes.usehref || "";
48834		this.color = null;
48835		this.extras = null;
48836	}
48837	[$toStyle](bgColor) {
48838		const alpha = this.rate / 100;
48839		return Util.makeHexColor(Math.round(bgColor.value.r * (1 - alpha) + this.value.r * alpha), Math.round(bgColor.value.g * (1 - alpha) + this.value.g * alpha), Math.round(bgColor.value.b * (1 - alpha) + this.value.b * alpha));
48840	}
48841}
48842class Subform extends XFAObject {
48843	constructor(attributes) {
48844		super(TEMPLATE_NS_ID, "subform", true);
48845		this.access = getStringOption(attributes.access, ["open", "nonInteractive", "protected", "readOnly"]);
48846		this.allowMacro = getInteger({
48847			data: attributes.allowMacro,
48848			defaultValue: 0,
48849			validate: x => x === 1
48850		});
48851		this.anchorType = getStringOption(attributes.anchorType, ["topLeft", "bottomCenter", "bottomLeft", "bottomRight", "middleCenter", "middleLeft", "middleRight", "topCenter", "topRight"]);
48852		this.colSpan = getInteger({
48853			data: attributes.colSpan,
48854			defaultValue: 1,
48855			validate: n => n >= 1 || n === -1
48856		});
48857		this.columnWidths = (attributes.columnWidths || "").trim().split(/\s+/).map(x => x === "-1" ? -1 : getMeasurement(x));
48858		this.h = attributes.h ? getMeasurement(attributes.h) : "";
48859		this.hAlign = getStringOption(attributes.hAlign, ["left", "center", "justify", "justifyAll", "radix", "right"]);
48860		this.id = attributes.id || "";
48861		this.layout = getStringOption(attributes.layout, ["position", "lr-tb", "rl-row", "rl-tb", "row", "table", "tb"]);
48862		this.locale = attributes.locale || "";
48863		this.maxH = getMeasurement(attributes.maxH, "0pt");
48864		this.maxW = getMeasurement(attributes.maxW, "0pt");
48865		this.mergeMode = getStringOption(attributes.mergeMode, ["consumeData", "matchTemplate"]);
48866		this.minH = getMeasurement(attributes.minH, "0pt");
48867		this.minW = getMeasurement(attributes.minW, "0pt");
48868		this.name = attributes.name || "";
48869		this.presence = getStringOption(attributes.presence, ["visible", "hidden", "inactive", "invisible"]);
48870		this.relevant = getRelevant(attributes.relevant);
48871		this.restoreState = getStringOption(attributes.restoreState, ["manual", "auto"]);
48872		this.scope = getStringOption(attributes.scope, ["name", "none"]);
48873		this.use = attributes.use || "";
48874		this.usehref = attributes.usehref || "";
48875		this.w = attributes.w ? getMeasurement(attributes.w) : "";
48876		this.x = getMeasurement(attributes.x, "0pt");
48877		this.y = getMeasurement(attributes.y, "0pt");
48878		this.assist = null;
48879		this.bind = null;
48880		this.bookend = null;
48881		this.border = null;
48882		this.break = null;
48883		this.calculate = null;
48884		this.desc = null;
48885		this.extras = null;
48886		this.keep = null;
48887		this.margin = null;
48888		this.occur = null;
48889		this.overflow = null;
48890		this.pageSet = null;
48891		this.para = null;
48892		this.traversal = null;
48893		this.validate = null;
48894		this.variables = null;
48895		this.area = new XFAObjectArray();
48896		this.breakAfter = new XFAObjectArray();
48897		this.breakBefore = new XFAObjectArray();
48898		this.connect = new XFAObjectArray();
48899		this.draw = new XFAObjectArray();
48900		this.event = new XFAObjectArray();
48901		this.exObject = new XFAObjectArray();
48902		this.exclGroup = new XFAObjectArray();
48903		this.field = new XFAObjectArray();
48904		this.proto = new XFAObjectArray();
48905		this.setProperty = new XFAObjectArray();
48906		this.subform = new XFAObjectArray();
48907		this.subformSet = new XFAObjectArray();
48908	}
48909	[$getSubformParent]() {
48910		const parent = this[$getParent]();
48911		if (parent instanceof SubformSet) {
48912			return parent[$getSubformParent]();
48913		}
48914		return parent;
48915	}
48916	[$isBindable]() {
48917		return true;
48918	}
48919	[$isThereMoreWidth]() {
48920		return this.layout.endsWith("-tb") && this[$extra].attempt === 0 && this[$extra].numberInLine > 0 || this[$getParent]()[$isThereMoreWidth]();
48921	}
48922	*[$getContainedChildren]() {
48923		yield* getContainedChildren(this);
48924	}
48925	[$flushHTML]() {
48926		return flushHTML(this);
48927	}
48928	[$addHTML](html, bbox) {
48929		addHTML(this, html, bbox);
48930	}
48931	[$getAvailableSpace]() {
48932		return getAvailableSpace(this);
48933	}
48934	[$isSplittable]() {
48935		const parent = this[$getSubformParent]();
48936		if (!parent[$isSplittable]()) {
48937			return false;
48938		}
48939		if (this[$extra]._isSplittable !== undefined) {
48940			return this[$extra]._isSplittable;
48941		}
48942		if (this.layout === "position" || this.layout.includes("row")) {
48943			this[$extra]._isSplittable = false;
48944			return false;
48945		}
48946		if (this.keep && this.keep.intact !== "none") {
48947			this[$extra]._isSplittable = false;
48948			return false;
48949		}
48950		if (parent.layout?.endsWith("-tb") && parent[$extra].numberInLine !== 0) {
48951			return false;
48952		}
48953		this[$extra]._isSplittable = true;
48954		return true;
48955	}
48956	[$toHTML](availableSpace) {
48957		setTabIndex(this);
48958		if (this.break) {
48959			if (this.break.after !== "auto" || this.break.afterTarget !== "") {
48960				const node = new BreakAfter({
48961					targetType: this.break.after,
48962					target: this.break.afterTarget,
48963					startNew: this.break.startNew.toString()
48964				});
48965				node[$globalData] = this[$globalData];
48966				this[$appendChild](node);
48967				this.breakAfter.push(node);
48968			}
48969			if (this.break.before !== "auto" || this.break.beforeTarget !== "") {
48970				const node = new BreakBefore({
48971					targetType: this.break.before,
48972					target: this.break.beforeTarget,
48973					startNew: this.break.startNew.toString()
48974				});
48975				node[$globalData] = this[$globalData];
48976				this[$appendChild](node);
48977				this.breakBefore.push(node);
48978			}
48979			if (this.break.overflowTarget !== "") {
48980				const node = new Overflow({
48981					target: this.break.overflowTarget,
48982					leader: this.break.overflowLeader,
48983					trailer: this.break.overflowTrailer
48984				});
48985				node[$globalData] = this[$globalData];
48986				this[$appendChild](node);
48987				this.overflow.push(node);
48988			}
48989			this[$removeChild](this.break);
48990			this.break = null;
48991		}
48992		if (this.presence === "hidden" || this.presence === "inactive") {
48993			return HTMLResult.EMPTY;
48994		}
48995		if (this.breakBefore.children.length > 1 || this.breakAfter.children.length > 1) {
48996			warn("XFA - Several breakBefore or breakAfter in subforms: please file a bug.");
48997		}
48998		if (this.breakBefore.children.length >= 1) {
48999			const breakBefore = this.breakBefore.children[0];
49000			if (handleBreak(breakBefore)) {
49001				return HTMLResult.breakNode(breakBefore);
49002			}
49003		}
49004		if (this[$extra]?.afterBreakAfter) {
49005			return HTMLResult.EMPTY;
49006		}
49007		fixDimensions(this);
49008		const children = [];
49009		const attributes = {
49010			id: this[$uid],
49011			class: []
49012		};
49013		setAccess(this, attributes.class);
49014		if (!this[$extra]) {
49015			this[$extra] = Object.create(null);
49016		}
49017		Object.assign(this[$extra], {
49018			children,
49019			line: null,
49020			attributes,
49021			attempt: 0,
49022			numberInLine: 0,
49023			availableSpace: {
49024				width: Math.min(this.w || Infinity, availableSpace.width),
49025				height: Math.min(this.h || Infinity, availableSpace.height)
49026			},
49027			width: 0,
49028			height: 0,
49029			prevHeight: 0,
49030			currentWidth: 0
49031		});
49032		const root = this[$getTemplateRoot]();
49033		const savedNoLayoutFailure = root[$extra].noLayoutFailure;
49034		const isSplittable = this[$isSplittable]();
49035		if (!isSplittable) {
49036			setFirstUnsplittable(this);
49037		}
49038		if (!checkDimensions(this, availableSpace)) {
49039			return HTMLResult.FAILURE;
49040		}
49041		const filter = new Set(["area", "draw", "exclGroup", "field", "subform", "subformSet"]);
49042		if (this.layout.includes("row")) {
49043			const columnWidths = this[$getSubformParent]().columnWidths;
49044			if (Array.isArray(columnWidths) && columnWidths.length > 0) {
49045				this[$extra].columnWidths = columnWidths;
49046				this[$extra].currentColumn = 0;
49047			}
49048		}
49049		const style = toStyle(this, "anchorType", "dimensions", "position", "presence", "border", "margin", "hAlign");
49050		const classNames = ["xfaSubform"];
49051		const cl = layoutClass(this);
49052		if (cl) {
49053			classNames.push(cl);
49054		}
49055		attributes.style = style;
49056		attributes.class = classNames;
49057		if (this.name) {
49058			attributes.xfaName = this.name;
49059		}
49060		if (this.overflow) {
49061			const overflowExtra = this.overflow[$getExtra]();
49062			if (overflowExtra.addLeader) {
49063				overflowExtra.addLeader = false;
49064				handleOverflow(this, overflowExtra.leader, availableSpace);
49065			}
49066		}
49067		this[$pushPara]();
49068		const isLrTb = this.layout === "lr-tb" || this.layout === "rl-tb";
49069		const maxRun = isLrTb ? MAX_ATTEMPTS_FOR_LRTB_LAYOUT : 1;
49070		for (; this[$extra].attempt < maxRun; this[$extra].attempt++) {
49071			if (isLrTb && this[$extra].attempt === MAX_ATTEMPTS_FOR_LRTB_LAYOUT - 1) {
49072				this[$extra].numberInLine = 0;
49073			}
49074			const result = this[$childrenToHTML]({
49075				filter,
49076				include: true
49077			});
49078			if (result.success) {
49079				break;
49080			}
49081			if (result.isBreak()) {
49082				this[$popPara]();
49083				return result;
49084			}
49085			if (isLrTb && this[$extra].attempt === 0 && this[$extra].numberInLine === 0 && !root[$extra].noLayoutFailure) {
49086				this[$extra].attempt = maxRun;
49087				break;
49088			}
49089		}
49090		this[$popPara]();
49091		if (!isSplittable) {
49092			unsetFirstUnsplittable(this);
49093		}
49094		root[$extra].noLayoutFailure = savedNoLayoutFailure;
49095		if (this[$extra].attempt === maxRun) {
49096			if (this.overflow) {
49097				this[$getTemplateRoot]()[$extra].overflowNode = this.overflow;
49098			}
49099			if (!isSplittable) {
49100				delete this[$extra];
49101			}
49102			return HTMLResult.FAILURE;
49103		}
49104		if (this.overflow) {
49105			const overflowExtra = this.overflow[$getExtra]();
49106			if (overflowExtra.addTrailer) {
49107				overflowExtra.addTrailer = false;
49108				handleOverflow(this, overflowExtra.trailer, availableSpace);
49109			}
49110		}
49111		let marginH = 0;
49112		let marginV = 0;
49113		if (this.margin) {
49114			marginH = this.margin.leftInset + this.margin.rightInset;
49115			marginV = this.margin.topInset + this.margin.bottomInset;
49116		}
49117		const width = Math.max(this[$extra].width + marginH, this.w || 0);
49118		const height = Math.max(this[$extra].height + marginV, this.h || 0);
49119		const bbox = [this.x, this.y, width, height];
49120		if (this.w === "") {
49121			style.width = measureToString(width);
49122		}
49123		if (this.h === "") {
49124			style.height = measureToString(height);
49125		}
49126		if ((style.width === "0px" || style.height === "0px") && children.length === 0) {
49127			return HTMLResult.EMPTY;
49128		}
49129		const html = {
49130			name: "div",
49131			attributes,
49132			children
49133		};
49134		applyAssist(this, attributes);
49135		const result = HTMLResult.success(createWrapper(this, html), bbox);
49136		if (this.breakAfter.children.length >= 1) {
49137			const breakAfter = this.breakAfter.children[0];
49138			if (handleBreak(breakAfter)) {
49139				this[$extra].afterBreakAfter = result;
49140				return HTMLResult.breakNode(breakAfter);
49141			}
49142		}
49143		delete this[$extra];
49144		return result;
49145	}
49146}
49147class SubformSet extends XFAObject {
49148	constructor(attributes) {
49149		super(TEMPLATE_NS_ID, "subformSet", true);
49150		this.id = attributes.id || "";
49151		this.name = attributes.name || "";
49152		this.relation = getStringOption(attributes.relation, ["ordered", "choice", "unordered"]);
49153		this.relevant = getRelevant(attributes.relevant);
49154		this.use = attributes.use || "";
49155		this.usehref = attributes.usehref || "";
49156		this.bookend = null;
49157		this.break = null;
49158		this.desc = null;
49159		this.extras = null;
49160		this.occur = null;
49161		this.overflow = null;
49162		this.breakAfter = new XFAObjectArray();
49163		this.breakBefore = new XFAObjectArray();
49164		this.subform = new XFAObjectArray();
49165		this.subformSet = new XFAObjectArray();
49166	}
49167	*[$getContainedChildren]() {
49168		yield* getContainedChildren(this);
49169	}
49170	[$getSubformParent]() {
49171		let parent = this[$getParent]();
49172		while (!(parent instanceof Subform)) {
49173			parent = parent[$getParent]();
49174		}
49175		return parent;
49176	}
49177	[$isBindable]() {
49178		return true;
49179	}
49180}
49181class SubjectDN extends ContentObject {
49182	constructor(attributes) {
49183		super(TEMPLATE_NS_ID, "subjectDN");
49184		this.delimiter = attributes.delimiter || ",";
49185		this.id = attributes.id || "";
49186		this.name = attributes.name || "";
49187		this.use = attributes.use || "";
49188		this.usehref = attributes.usehref || "";
49189	}
49190	[$finalize]() {
49191		this[$content] = new Map(this[$content].split(this.delimiter).map(kv => {
49192			kv = kv.split("=", 2);
49193			kv[0] = kv[0].trim();
49194			return kv;
49195		}));
49196	}
49197}
49198class SubjectDNs extends XFAObject {
49199	constructor(attributes) {
49200		super(TEMPLATE_NS_ID, "subjectDNs", true);
49201		this.id = attributes.id || "";
49202		this.type = getStringOption(attributes.type, ["optional", "required"]);
49203		this.use = attributes.use || "";
49204		this.usehref = attributes.usehref || "";
49205		this.subjectDN = new XFAObjectArray();
49206	}
49207}
49208class Submit extends XFAObject {
49209	constructor(attributes) {
49210		super(TEMPLATE_NS_ID, "submit", true);
49211		this.embedPDF = getInteger({
49212			data: attributes.embedPDF,
49213			defaultValue: 0,
49214			validate: x => x === 1
49215		});
49216		this.format = getStringOption(attributes.format, ["xdp", "formdata", "pdf", "urlencoded", "xfd", "xml"]);
49217		this.id = attributes.id || "";
49218		this.target = attributes.target || "";
49219		this.textEncoding = getKeyword({
49220			data: attributes.textEncoding ? attributes.textEncoding.toLowerCase() : "",
49221			defaultValue: "",
49222			validate: k => ["utf-8", "big-five", "fontspecific", "gbk", "gb-18030", "gb-2312", "ksc-5601", "none", "shift-jis", "ucs-2", "utf-16"].includes(k) || k.match(/iso-8859-\d{2}/)
49223		});
49224		this.use = attributes.use || "";
49225		this.usehref = attributes.usehref || "";
49226		this.xdpContent = attributes.xdpContent || "";
49227		this.encrypt = null;
49228		this.encryptData = new XFAObjectArray();
49229		this.signData = new XFAObjectArray();
49230	}
49231}
49232class Template extends XFAObject {
49233	constructor(attributes) {
49234		super(TEMPLATE_NS_ID, "template", true);
49235		this.baseProfile = getStringOption(attributes.baseProfile, ["full", "interactiveForms"]);
49236		this.extras = null;
49237		this.subform = new XFAObjectArray();
49238	}
49239	[$finalize]() {
49240		if (this.subform.children.length === 0) {
49241			warn("XFA - No subforms in template node.");
49242		}
49243		if (this.subform.children.length >= 2) {
49244			warn("XFA - Several subforms in template node: please file a bug.");
49245		}
49246		this[$tabIndex] = DEFAULT_TAB_INDEX;
49247	}
49248	[$isSplittable]() {
49249		return true;
49250	}
49251	[$searchNode](expr, container) {
49252		if (expr.startsWith("#")) {
49253			return [this[$ids].get(expr.slice(1))];
49254		}
49255		return searchNode(this, container, expr, true, true);
49256	}
49257	*[$toPages]() {
49258		if (!this.subform.children.length) {
49259			return HTMLResult.success({
49260				name: "div",
49261				children: []
49262			});
49263		}
49264		this[$extra] = {
49265			overflowNode: null,
49266			firstUnsplittable: null,
49267			currentContentArea: null,
49268			currentPageArea: null,
49269			noLayoutFailure: false,
49270			pageNumber: 1,
49271			pagePosition: "first",
49272			oddOrEven: "odd",
49273			blankOrNotBlank: "nonBlank",
49274			paraStack: []
49275		};
49276		const root = this.subform.children[0];
49277		root.pageSet[$cleanPage]();
49278		const pageAreas = root.pageSet.pageArea.children;
49279		const mainHtml = {
49280			name: "div",
49281			children: []
49282		};
49283		let pageArea = null;
49284		let breakBefore = null;
49285		let breakBeforeTarget = null;
49286		if (root.breakBefore.children.length >= 1) {
49287			breakBefore = root.breakBefore.children[0];
49288			breakBeforeTarget = breakBefore.target;
49289		} else if (root.subform.children.length >= 1 && root.subform.children[0].breakBefore.children.length >= 1) {
49290			breakBefore = root.subform.children[0].breakBefore.children[0];
49291			breakBeforeTarget = breakBefore.target;
49292		} else if (root.break?.beforeTarget) {
49293			breakBefore = root.break;
49294			breakBeforeTarget = breakBefore.beforeTarget;
49295		} else if (root.subform.children.length >= 1 && root.subform.children[0].break?.beforeTarget) {
49296			breakBefore = root.subform.children[0].break;
49297			breakBeforeTarget = breakBefore.beforeTarget;
49298		}
49299		if (breakBefore) {
49300			const target = this[$searchNode](breakBeforeTarget, breakBefore[$getParent]());
49301			if (target instanceof PageArea) {
49302				pageArea = target;
49303				breakBefore[$extra] = {};
49304			}
49305		}
49306		if (!pageArea) {
49307			pageArea = pageAreas[0];
49308		}
49309		pageArea[$extra] = {
49310			numberOfUse: 1
49311		};
49312		const pageAreaParent = pageArea[$getParent]();
49313		pageAreaParent[$extra] = {
49314			numberOfUse: 1,
49315			pageIndex: pageAreaParent.pageArea.children.indexOf(pageArea),
49316			pageSetIndex: 0
49317		};
49318		let targetPageArea;
49319		let leader = null;
49320		let trailer = null;
49321		let hasSomething = true;
49322		let hasSomethingCounter = 0;
49323		let startIndex = 0;
49324		while (true) {
49325			if (!hasSomething) {
49326				mainHtml.children.pop();
49327				if (++hasSomethingCounter === MAX_EMPTY_PAGES) {
49328					warn("XFA - Something goes wrong: please file a bug.");
49329					return mainHtml;
49330				}
49331			} else {
49332				hasSomethingCounter = 0;
49333			}
49334			targetPageArea = null;
49335			this[$extra].currentPageArea = pageArea;
49336			const page = pageArea[$toHTML]().html;
49337			mainHtml.children.push(page);
49338			if (leader) {
49339				this[$extra].noLayoutFailure = true;
49340				page.children.push(leader[$toHTML](pageArea[$extra].space).html);
49341				leader = null;
49342			}
49343			if (trailer) {
49344				this[$extra].noLayoutFailure = true;
49345				page.children.push(trailer[$toHTML](pageArea[$extra].space).html);
49346				trailer = null;
49347			}
49348			const contentAreas = pageArea.contentArea.children;
49349			const htmlContentAreas = page.children.filter(node => node.attributes.class.includes("xfaContentarea"));
49350			hasSomething = false;
49351			this[$extra].firstUnsplittable = null;
49352			this[$extra].noLayoutFailure = false;
49353			const flush = index => {
49354				const html = root[$flushHTML]();
49355				if (html) {
49356					hasSomething ||= html.children?.length > 0;
49357					htmlContentAreas[index].children.push(html);
49358				}
49359			};
49360			for (let i = startIndex, ii = contentAreas.length; i < ii; i++) {
49361				const contentArea = this[$extra].currentContentArea = contentAreas[i];
49362				const space = {
49363					width: contentArea.w,
49364					height: contentArea.h
49365				};
49366				startIndex = 0;
49367				if (leader) {
49368					htmlContentAreas[i].children.push(leader[$toHTML](space).html);
49369					leader = null;
49370				}
49371				if (trailer) {
49372					htmlContentAreas[i].children.push(trailer[$toHTML](space).html);
49373					trailer = null;
49374				}
49375				const html = root[$toHTML](space);
49376				if (html.success) {
49377					if (html.html) {
49378						hasSomething ||= html.html.children?.length > 0;
49379						htmlContentAreas[i].children.push(html.html);
49380					} else if (!hasSomething && mainHtml.children.length > 1) {
49381						mainHtml.children.pop();
49382					}
49383					return mainHtml;
49384				}
49385				if (html.isBreak()) {
49386					const node = html.breakNode;
49387					flush(i);
49388					if (node.targetType === "auto") {
49389						continue;
49390					}
49391					if (node.leader) {
49392						leader = this[$searchNode](node.leader, node[$getParent]());
49393						leader = leader ? leader[0] : null;
49394					}
49395					if (node.trailer) {
49396						trailer = this[$searchNode](node.trailer, node[$getParent]());
49397						trailer = trailer ? trailer[0] : null;
49398					}
49399					if (node.targetType === "pageArea") {
49400						targetPageArea = node[$extra].target;
49401						i = Infinity;
49402					} else if (!node[$extra].target) {
49403						i = node[$extra].index;
49404					} else {
49405						targetPageArea = node[$extra].target;
49406						startIndex = node[$extra].index + 1;
49407						i = Infinity;
49408					}
49409					continue;
49410				}
49411				if (this[$extra].overflowNode) {
49412					const node = this[$extra].overflowNode;
49413					this[$extra].overflowNode = null;
49414					const overflowExtra = node[$getExtra]();
49415					const target = overflowExtra.target;
49416					overflowExtra.addLeader = overflowExtra.leader !== null;
49417					overflowExtra.addTrailer = overflowExtra.trailer !== null;
49418					flush(i);
49419					const currentIndex = i;
49420					i = Infinity;
49421					if (target instanceof PageArea) {
49422						targetPageArea = target;
49423					} else if (target instanceof ContentArea) {
49424						const index = contentAreas.indexOf(target);
49425						if (index !== -1) {
49426							if (index > currentIndex) {
49427								i = index - 1;
49428							} else {
49429								startIndex = index;
49430							}
49431						} else {
49432							targetPageArea = target[$getParent]();
49433							startIndex = targetPageArea.contentArea.children.indexOf(target);
49434						}
49435					}
49436					continue;
49437				}
49438				flush(i);
49439			}
49440			this[$extra].pageNumber += 1;
49441			if (targetPageArea) {
49442				if (targetPageArea[$isUsable]()) {
49443					targetPageArea[$extra].numberOfUse += 1;
49444				} else {
49445					targetPageArea = null;
49446				}
49447			}
49448			pageArea = targetPageArea || pageArea[$getNextPage]();
49449			yield null;
49450		}
49451	}
49452}
49453class Text extends ContentObject {
49454	constructor(attributes) {
49455		super(TEMPLATE_NS_ID, "text");
49456		this.id = attributes.id || "";
49457		this.maxChars = getInteger({
49458			data: attributes.maxChars,
49459			defaultValue: 0,
49460			validate: x => x >= 0
49461		});
49462		this.name = attributes.name || "";
49463		this.rid = attributes.rid || "";
49464		this.use = attributes.use || "";
49465		this.usehref = attributes.usehref || "";
49466	}
49467	[$acceptWhitespace]() {
49468		return true;
49469	}
49470	[$onChild](child) {
49471		if (child[$namespaceId] === NamespaceIds.xhtml.id) {
49472			this[$content] = child;
49473			return true;
49474		}
49475		warn(`XFA - Invalid content in Text: ${child[$nodeName]}.`);
49476		return false;
49477	}
49478	[$onText](str) {
49479		if (this[$content] instanceof XFAObject) {
49480			return;
49481		}
49482		super[$onText](str);
49483	}
49484	[$finalize]() {
49485		if (typeof this[$content] === "string") {
49486			this[$content] = this[$content].replaceAll("\r\n", "\n");
49487		}
49488	}
49489	[$getExtra]() {
49490		if (typeof this[$content] === "string") {
49491			return this[$content].split(/[\u2029\u2028\n]/).reduce((acc, line) => {
49492				if (line) {
49493					acc.push(line);
49494				}
49495				return acc;
49496			}, []).join("\n");
49497		}
49498		return this[$content][$text]();
49499	}
49500	[$toHTML](availableSpace) {
49501		if (typeof this[$content] === "string") {
49502			const html = valueToHtml(this[$content]).html;
49503			if (this[$content].includes("\u2029")) {
49504				html.name = "div";
49505				html.children = [];
49506				this[$content].split("\u2029").map(para => para.split(/[\u2028\n]/).reduce((acc, line) => {
49507					acc.push({
49508						name: "span",
49509						value: line
49510					}, {
49511						name: "br"
49512					});
49513					return acc;
49514				}, [])).forEach(lines => {
49515					html.children.push({
49516						name: "p",
49517						children: lines
49518					});
49519				});
49520			} else if (/[\u2028\n]/.test(this[$content])) {
49521				html.name = "div";
49522				html.children = [];
49523				this[$content].split(/[\u2028\n]/).forEach(line => {
49524					html.children.push({
49525						name: "span",
49526						value: line
49527					}, {
49528						name: "br"
49529					});
49530				});
49531			}
49532			return HTMLResult.success(html);
49533		}
49534		return this[$content][$toHTML](availableSpace);
49535	}
49536}
49537class TextEdit extends XFAObject {
49538	constructor(attributes) {
49539		super(TEMPLATE_NS_ID, "textEdit", true);
49540		this.allowRichText = getInteger({
49541			data: attributes.allowRichText,
49542			defaultValue: 0,
49543			validate: x => x === 1
49544		});
49545		this.hScrollPolicy = getStringOption(attributes.hScrollPolicy, ["auto", "off", "on"]);
49546		this.id = attributes.id || "";
49547		this.multiLine = getInteger({
49548			data: attributes.multiLine,
49549			defaultValue: "",
49550			validate: x => x === 0 || x === 1
49551		});
49552		this.use = attributes.use || "";
49553		this.usehref = attributes.usehref || "";
49554		this.vScrollPolicy = getStringOption(attributes.vScrollPolicy, ["auto", "off", "on"]);
49555		this.border = null;
49556		this.comb = null;
49557		this.extras = null;
49558		this.margin = null;
49559	}
49560	[$toHTML](availableSpace) {
49561		const style = toStyle(this, "border", "font", "margin");
49562		let html;
49563		const field = this[$getParent]()[$getParent]();
49564		if (this.multiLine === "") {
49565			this.multiLine = field instanceof Draw ? 1 : 0;
49566		}
49567		if (this.multiLine === 1) {
49568			html = {
49569				name: "textarea",
49570				attributes: {
49571					dataId: field[$data]?.[$uid] || field[$uid],
49572					fieldId: field[$uid],
49573					class: ["xfaTextfield"],
49574					style,
49575					"aria-label": ariaLabel(field),
49576					"aria-required": false
49577				}
49578			};
49579		} else {
49580			html = {
49581				name: "input",
49582				attributes: {
49583					type: "text",
49584					dataId: field[$data]?.[$uid] || field[$uid],
49585					fieldId: field[$uid],
49586					class: ["xfaTextfield"],
49587					style,
49588					"aria-label": ariaLabel(field),
49589					"aria-required": false
49590				}
49591			};
49592		}
49593		if (isRequired(field)) {
49594			html.attributes["aria-required"] = true;
49595			html.attributes.required = true;
49596		}
49597		return HTMLResult.success({
49598			name: "label",
49599			attributes: {
49600				class: ["xfaLabel"]
49601			},
49602			children: [html]
49603		});
49604	}
49605}
49606class Time extends StringObject {
49607	constructor(attributes) {
49608		super(TEMPLATE_NS_ID, "time");
49609		this.id = attributes.id || "";
49610		this.name = attributes.name || "";
49611		this.use = attributes.use || "";
49612		this.usehref = attributes.usehref || "";
49613	}
49614	[$finalize]() {
49615		const date = this[$content].trim();
49616		this[$content] = date ? new Date(date) : null;
49617	}
49618	[$toHTML](availableSpace) {
49619		return valueToHtml(this[$content] ? this[$content].toString() : "");
49620	}
49621}
49622class TimeStamp extends XFAObject {
49623	constructor(attributes) {
49624		super(TEMPLATE_NS_ID, "timeStamp");
49625		this.id = attributes.id || "";
49626		this.server = attributes.server || "";
49627		this.type = getStringOption(attributes.type, ["optional", "required"]);
49628		this.use = attributes.use || "";
49629		this.usehref = attributes.usehref || "";
49630	}
49631}
49632class ToolTip extends StringObject {
49633	constructor(attributes) {
49634		super(TEMPLATE_NS_ID, "toolTip");
49635		this.id = attributes.id || "";
49636		this.rid = attributes.rid || "";
49637		this.use = attributes.use || "";
49638		this.usehref = attributes.usehref || "";
49639	}
49640}
49641class Traversal extends XFAObject {
49642	constructor(attributes) {
49643		super(TEMPLATE_NS_ID, "traversal", true);
49644		this.id = attributes.id || "";
49645		this.use = attributes.use || "";
49646		this.usehref = attributes.usehref || "";
49647		this.extras = null;
49648		this.traverse = new XFAObjectArray();
49649	}
49650}
49651class Traverse extends XFAObject {
49652	constructor(attributes) {
49653		super(TEMPLATE_NS_ID, "traverse", true);
49654		this.id = attributes.id || "";
49655		this.operation = getStringOption(attributes.operation, ["next", "back", "down", "first", "left", "right", "up"]);
49656		this.ref = attributes.ref || "";
49657		this.use = attributes.use || "";
49658		this.usehref = attributes.usehref || "";
49659		this.extras = null;
49660		this.script = null;
49661	}
49662	get name() {
49663		return this.operation;
49664	}
49665	[$isTransparent]() {
49666		return false;
vendor: 18,386 bytes, lines 49667-50446
49667	}
49668}
49669class Ui extends XFAObject {
49670	constructor(attributes) {
49671		super(TEMPLATE_NS_ID, "ui", true);
49672		this.id = attributes.id || "";
49673		this.use = attributes.use || "";
49674		this.usehref = attributes.usehref || "";
49675		this.extras = null;
49676		this.picture = null;
49677		this.barcode = null;
49678		this.button = null;
49679		this.checkButton = null;
49680		this.choiceList = null;
49681		this.dateTimeEdit = null;
49682		this.defaultUi = null;
49683		this.imageEdit = null;
49684		this.numericEdit = null;
49685		this.passwordEdit = null;
49686		this.signature = null;
49687		this.textEdit = null;
49688	}
49689	[$getExtra]() {
49690		if (this[$extra] === undefined) {
49691			for (const name of Object.getOwnPropertyNames(this)) {
49692				if (name === "extras" || name === "picture") {
49693					continue;
49694				}
49695				const obj = this[name];
49696				if (!(obj instanceof XFAObject)) {
49697					continue;
49698				}
49699				this[$extra] = obj;
49700				return obj;
49701			}
49702			this[$extra] = null;
49703		}
49704		return this[$extra];
49705	}
49706	[$toHTML](availableSpace) {
49707		const obj = this[$getExtra]();
49708		if (obj) {
49709			return obj[$toHTML](availableSpace);
49710		}
49711		return HTMLResult.EMPTY;
49712	}
49713}
49714class Validate extends XFAObject {
49715	constructor(attributes) {
49716		super(TEMPLATE_NS_ID, "validate", true);
49717		this.formatTest = getStringOption(attributes.formatTest, ["warning", "disabled", "error"]);
49718		this.id = attributes.id || "";
49719		this.nullTest = getStringOption(attributes.nullTest, ["disabled", "error", "warning"]);
49720		this.scriptTest = getStringOption(attributes.scriptTest, ["error", "disabled", "warning"]);
49721		this.use = attributes.use || "";
49722		this.usehref = attributes.usehref || "";
49723		this.extras = null;
49724		this.message = null;
49725		this.picture = null;
49726		this.script = null;
49727	}
49728}
49729class Value extends XFAObject {
49730	constructor(attributes) {
49731		super(TEMPLATE_NS_ID, "value", true);
49732		this.id = attributes.id || "";
49733		this.override = getInteger({
49734			data: attributes.override,
49735			defaultValue: 0,
49736			validate: x => x === 1
49737		});
49738		this.relevant = getRelevant(attributes.relevant);
49739		this.use = attributes.use || "";
49740		this.usehref = attributes.usehref || "";
49741		this.arc = null;
49742		this.boolean = null;
49743		this.date = null;
49744		this.dateTime = null;
49745		this.decimal = null;
49746		this.exData = null;
49747		this.float = null;
49748		this.image = null;
49749		this.integer = null;
49750		this.line = null;
49751		this.rectangle = null;
49752		this.text = null;
49753		this.time = null;
49754	}
49755	[$setValue](value) {
49756		const parent = this[$getParent]();
49757		if (parent instanceof Field) {
49758			if (parent.ui?.imageEdit) {
49759				if (!this.image) {
49760					this.image = new Image({});
49761					this[$appendChild](this.image);
49762				}
49763				this.image[$content] = value[$content];
49764				return;
49765			}
49766		}
49767		const valueName = value[$nodeName];
49768		if (this[valueName] !== null) {
49769			this[valueName][$content] = value[$content];
49770			return;
49771		}
49772		for (const name of Object.getOwnPropertyNames(this)) {
49773			const obj = this[name];
49774			if (obj instanceof XFAObject) {
49775				this[name] = null;
49776				this[$removeChild](obj);
49777			}
49778		}
49779		this[value[$nodeName]] = value;
49780		this[$appendChild](value);
49781	}
49782	[$text]() {
49783		if (this.exData) {
49784			if (typeof this.exData[$content] === "string") {
49785				return this.exData[$content].trim();
49786			}
49787			return this.exData[$content][$text]().trim();
49788		}
49789		for (const name of Object.getOwnPropertyNames(this)) {
49790			if (name === "image") {
49791				continue;
49792			}
49793			const obj = this[name];
49794			if (obj instanceof XFAObject) {
49795				return (obj[$content] || "").toString().trim();
49796			}
49797		}
49798		return null;
49799	}
49800	[$toHTML](availableSpace) {
49801		for (const name of Object.getOwnPropertyNames(this)) {
49802			const obj = this[name];
49803			if (!(obj instanceof XFAObject)) {
49804				continue;
49805			}
49806			return obj[$toHTML](availableSpace);
49807		}
49808		return HTMLResult.EMPTY;
49809	}
49810}
49811class Variables extends XFAObject {
49812	constructor(attributes) {
49813		super(TEMPLATE_NS_ID, "variables", true);
49814		this.id = attributes.id || "";
49815		this.use = attributes.use || "";
49816		this.usehref = attributes.usehref || "";
49817		this.boolean = new XFAObjectArray();
49818		this.date = new XFAObjectArray();
49819		this.dateTime = new XFAObjectArray();
49820		this.decimal = new XFAObjectArray();
49821		this.exData = new XFAObjectArray();
49822		this.float = new XFAObjectArray();
49823		this.image = new XFAObjectArray();
49824		this.integer = new XFAObjectArray();
49825		this.manifest = new XFAObjectArray();
49826		this.script = new XFAObjectArray();
49827		this.text = new XFAObjectArray();
49828		this.time = new XFAObjectArray();
49829	}
49830	[$isTransparent]() {
49831		return true;
49832	}
49833}
49834class TemplateNamespace {
49835	static [$buildXFAObject](name, attributes) {
49836		if (TemplateNamespace.hasOwnProperty(name)) {
49837			const node = TemplateNamespace[name](attributes);
49838			node[$setSetAttributes](attributes);
49839			return node;
49840		}
49841		return undefined;
49842	}
49843	static appearanceFilter(attrs) {
49844		return new AppearanceFilter(attrs);
49845	}
49846	static arc(attrs) {
49847		return new Arc(attrs);
49848	}
49849	static area(attrs) {
49850		return new Area(attrs);
49851	}
49852	static assist(attrs) {
49853		return new Assist(attrs);
49854	}
49855	static barcode(attrs) {
49856		return new Barcode(attrs);
49857	}
49858	static bind(attrs) {
49859		return new Bind(attrs);
49860	}
49861	static bindItems(attrs) {
49862		return new BindItems(attrs);
49863	}
49864	static bookend(attrs) {
49865		return new Bookend(attrs);
49866	}
49867	static boolean(attrs) {
49868		return new BooleanElement(attrs);
49869	}
49870	static border(attrs) {
49871		return new Border(attrs);
49872	}
49873	static break(attrs) {
49874		return new Break(attrs);
49875	}
49876	static breakAfter(attrs) {
49877		return new BreakAfter(attrs);
49878	}
49879	static breakBefore(attrs) {
49880		return new BreakBefore(attrs);
49881	}
49882	static button(attrs) {
49883		return new Button(attrs);
49884	}
49885	static calculate(attrs) {
49886		return new Calculate(attrs);
49887	}
49888	static caption(attrs) {
49889		return new Caption(attrs);
49890	}
49891	static certificate(attrs) {
49892		return new Certificate(attrs);
49893	}
49894	static certificates(attrs) {
49895		return new Certificates(attrs);
49896	}
49897	static checkButton(attrs) {
49898		return new CheckButton(attrs);
49899	}
49900	static choiceList(attrs) {
49901		return new ChoiceList(attrs);
49902	}
49903	static color(attrs) {
49904		return new Color(attrs);
49905	}
49906	static comb(attrs) {
49907		return new Comb(attrs);
49908	}
49909	static connect(attrs) {
49910		return new Connect(attrs);
49911	}
49912	static contentArea(attrs) {
49913		return new ContentArea(attrs);
49914	}
49915	static corner(attrs) {
49916		return new Corner(attrs);
49917	}
49918	static date(attrs) {
49919		return new DateElement(attrs);
49920	}
49921	static dateTime(attrs) {
49922		return new DateTime(attrs);
49923	}
49924	static dateTimeEdit(attrs) {
49925		return new DateTimeEdit(attrs);
49926	}
49927	static decimal(attrs) {
49928		return new Decimal(attrs);
49929	}
49930	static defaultUi(attrs) {
49931		return new DefaultUi(attrs);
49932	}
49933	static desc(attrs) {
49934		return new Desc(attrs);
49935	}
49936	static digestMethod(attrs) {
49937		return new DigestMethod(attrs);
49938	}
49939	static digestMethods(attrs) {
49940		return new DigestMethods(attrs);
49941	}
49942	static draw(attrs) {
49943		return new Draw(attrs);
49944	}
49945	static edge(attrs) {
49946		return new Edge(attrs);
49947	}
49948	static encoding(attrs) {
49949		return new Encoding(attrs);
49950	}
49951	static encodings(attrs) {
49952		return new Encodings(attrs);
49953	}
49954	static encrypt(attrs) {
49955		return new Encrypt(attrs);
49956	}
49957	static encryptData(attrs) {
49958		return new EncryptData(attrs);
49959	}
49960	static encryption(attrs) {
49961		return new Encryption(attrs);
49962	}
49963	static encryptionMethod(attrs) {
49964		return new EncryptionMethod(attrs);
49965	}
49966	static encryptionMethods(attrs) {
49967		return new EncryptionMethods(attrs);
49968	}
49969	static event(attrs) {
49970		return new Event(attrs);
49971	}
49972	static exData(attrs) {
49973		return new ExData(attrs);
49974	}
49975	static exObject(attrs) {
49976		return new ExObject(attrs);
49977	}
49978	static exclGroup(attrs) {
49979		return new ExclGroup(attrs);
49980	}
49981	static execute(attrs) {
49982		return new Execute(attrs);
49983	}
49984	static extras(attrs) {
49985		return new Extras(attrs);
49986	}
49987	static field(attrs) {
49988		return new Field(attrs);
49989	}
49990	static fill(attrs) {
49991		return new Fill(attrs);
49992	}
49993	static filter(attrs) {
49994		return new Filter(attrs);
49995	}
49996	static float(attrs) {
49997		return new Float(attrs);
49998	}
49999	static font(attrs) {
50000		return new template_Font(attrs);
50001	}
50002	static format(attrs) {
50003		return new Format(attrs);
50004	}
50005	static handler(attrs) {
50006		return new Handler(attrs);
50007	}
50008	static hyphenation(attrs) {
50009		return new Hyphenation(attrs);
50010	}
50011	static image(attrs) {
50012		return new Image(attrs);
50013	}
50014	static imageEdit(attrs) {
50015		return new ImageEdit(attrs);
50016	}
50017	static integer(attrs) {
50018		return new Integer(attrs);
50019	}
50020	static issuers(attrs) {
50021		return new Issuers(attrs);
50022	}
50023	static items(attrs) {
50024		return new Items(attrs);
50025	}
50026	static keep(attrs) {
50027		return new Keep(attrs);
50028	}
50029	static keyUsage(attrs) {
50030		return new KeyUsage(attrs);
50031	}
50032	static line(attrs) {
50033		return new Line(attrs);
50034	}
50035	static linear(attrs) {
50036		return new Linear(attrs);
50037	}
50038	static lockDocument(attrs) {
50039		return new LockDocument(attrs);
50040	}
50041	static manifest(attrs) {
50042		return new Manifest(attrs);
50043	}
50044	static margin(attrs) {
50045		return new Margin(attrs);
50046	}
50047	static mdp(attrs) {
50048		return new Mdp(attrs);
50049	}
50050	static medium(attrs) {
50051		return new Medium(attrs);
50052	}
50053	static message(attrs) {
50054		return new Message(attrs);
50055	}
50056	static numericEdit(attrs) {
50057		return new NumericEdit(attrs);
50058	}
50059	static occur(attrs) {
50060		return new Occur(attrs);
50061	}
50062	static oid(attrs) {
50063		return new Oid(attrs);
50064	}
50065	static oids(attrs) {
50066		return new Oids(attrs);
50067	}
50068	static overflow(attrs) {
50069		return new Overflow(attrs);
50070	}
50071	static pageArea(attrs) {
50072		return new PageArea(attrs);
50073	}
50074	static pageSet(attrs) {
50075		return new PageSet(attrs);
50076	}
50077	static para(attrs) {
50078		return new Para(attrs);
50079	}
50080	static passwordEdit(attrs) {
50081		return new PasswordEdit(attrs);
50082	}
50083	static pattern(attrs) {
50084		return new template_Pattern(attrs);
50085	}
50086	static picture(attrs) {
50087		return new Picture(attrs);
50088	}
50089	static proto(attrs) {
50090		return new Proto(attrs);
50091	}
50092	static radial(attrs) {
50093		return new Radial(attrs);
50094	}
50095	static reason(attrs) {
50096		return new Reason(attrs);
50097	}
50098	static reasons(attrs) {
50099		return new Reasons(attrs);
50100	}
50101	static rectangle(attrs) {
50102		return new Rectangle(attrs);
50103	}
50104	static ref(attrs) {
50105		return new RefElement(attrs);
50106	}
50107	static script(attrs) {
50108		return new Script(attrs);
50109	}
50110	static setProperty(attrs) {
50111		return new SetProperty(attrs);
50112	}
50113	static signData(attrs) {
50114		return new SignData(attrs);
50115	}
50116	static signature(attrs) {
50117		return new Signature(attrs);
50118	}
50119	static signing(attrs) {
50120		return new Signing(attrs);
50121	}
50122	static solid(attrs) {
50123		return new Solid(attrs);
50124	}
50125	static speak(attrs) {
50126		return new Speak(attrs);
50127	}
50128	static stipple(attrs) {
50129		return new Stipple(attrs);
50130	}
50131	static subform(attrs) {
50132		return new Subform(attrs);
50133	}
50134	static subformSet(attrs) {
50135		return new SubformSet(attrs);
50136	}
50137	static subjectDN(attrs) {
50138		return new SubjectDN(attrs);
50139	}
50140	static subjectDNs(attrs) {
50141		return new SubjectDNs(attrs);
50142	}
50143	static submit(attrs) {
50144		return new Submit(attrs);
50145	}
50146	static template(attrs) {
50147		return new Template(attrs);
50148	}
50149	static text(attrs) {
50150		return new Text(attrs);
50151	}
50152	static textEdit(attrs) {
50153		return new TextEdit(attrs);
50154	}
50155	static time(attrs) {
50156		return new Time(attrs);
50157	}
50158	static timeStamp(attrs) {
50159		return new TimeStamp(attrs);
50160	}
50161	static toolTip(attrs) {
50162		return new ToolTip(attrs);
50163	}
50164	static traversal(attrs) {
50165		return new Traversal(attrs);
50166	}
50167	static traverse(attrs) {
50168		return new Traverse(attrs);
50169	}
50170	static ui(attrs) {
50171		return new Ui(attrs);
50172	}
50173	static validate(attrs) {
50174		return new Validate(attrs);
50175	}
50176	static value(attrs) {
50177		return new Value(attrs);
50178	}
50179	static variables(attrs) {
50180		return new Variables(attrs);
50181	}
50182}
50183
50184;// ./src/core/xfa/bind.js
50185
50186
50187
50188
50189
50190
50191
50192
50193
50194
50195
50196const bind_NS_DATASETS = NamespaceIds.datasets.id;
50197function createText(content) {
50198	const node = new Text({});
50199	node[$content] = content;
50200	return node;
50201}
50202class Binder {
50203	constructor(root) {
50204		this.root = root;
50205		this.datasets = root.datasets;
50206		this.data = root.datasets?.data || new XmlObject(NamespaceIds.datasets.id, "data");
50207		this.emptyMerge = this.data[$getChildren]().length === 0;
50208		this.root.form = this.form = root.template[$clone]();
50209	}
50210	_isConsumeData() {
50211		return !this.emptyMerge && this._mergeMode;
50212	}
50213	_isMatchTemplate() {
50214		return !this._isConsumeData();
50215	}
50216	bind() {
50217		this._bindElement(this.form, this.data);
50218		return this.form;
50219	}
50220	getData() {
50221		return this.data;
50222	}
50223	_bindValue(formNode, data, picture) {
50224		formNode[$data] = data;
50225		if (formNode[$hasSettableValue]()) {
50226			if (data[$isDataValue]()) {
50227				const value = data[$getDataValue]();
50228				formNode[$setValue](createText(value));
50229			} else if (formNode instanceof Field && formNode.ui?.choiceList?.open === "multiSelect") {
50230				const value = data[$getChildren]().map(child => child[$content].trim()).join("\n");
50231				formNode[$setValue](createText(value));
50232			} else if (this._isConsumeData()) {
50233				warn(`XFA - Nodes haven't the same type.`);
50234			}
50235		} else if (!data[$isDataValue]() || this._isMatchTemplate()) {
50236			this._bindElement(formNode, data);
50237		} else {
50238			warn(`XFA - Nodes haven't the same type.`);
50239		}
50240	}
50241	_findDataByNameToConsume(name, isValue, dataNode, global) {
50242		if (!name) {
50243			return null;
50244		}
50245		let generator, match;
50246		for (let i = 0; i < 3; i++) {
50247			generator = dataNode[$getRealChildrenByNameIt](name, false, true);
50248			while (true) {
50249				match = generator.next().value;
50250				if (!match) {
50251					break;
50252				}
50253				if (isValue === match[$isDataValue]()) {
50254					return match;
50255				}
50256			}
50257			if (dataNode[$namespaceId] === NamespaceIds.datasets.id && dataNode[$nodeName] === "data") {
50258				break;
50259			}
50260			dataNode = dataNode[$getParent]();
50261		}
50262		if (!global) {
50263			return null;
50264		}
50265		generator = this.data[$getRealChildrenByNameIt](name, true, false);
50266		match = generator.next().value;
50267		if (match) {
50268			return match;
50269		}
50270		generator = this.data[$getAttributeIt](name, true);
50271		match = generator.next().value;
50272		if (match?.[$isDataValue]()) {
50273			return match;
50274		}
50275		return null;
50276	}
50277	_setProperties(formNode, dataNode) {
50278		if (!formNode.hasOwnProperty("setProperty")) {
50279			return;
50280		}
50281		for (const {
50282			ref,
50283			target,
50284			connection
50285		} of formNode.setProperty.children) {
50286			if (connection) {
50287				continue;
50288			}
50289			if (!ref) {
50290				continue;
50291			}
50292			const nodes = searchNode(this.root, dataNode, ref, false, false);
50293			if (!nodes) {
50294				warn(`XFA - Invalid reference: ${ref}.`);
50295				continue;
50296			}
50297			const [node] = nodes;
50298			if (!node[$isDescendent](this.data)) {
50299				warn(`XFA - Invalid node: must be a data node.`);
50300				continue;
50301			}
50302			const targetNodes = searchNode(this.root, formNode, target, false, false);
50303			if (!targetNodes) {
50304				warn(`XFA - Invalid target: ${target}.`);
50305				continue;
50306			}
50307			const [targetNode] = targetNodes;
50308			if (!targetNode[$isDescendent](formNode)) {
50309				warn(`XFA - Invalid target: must be a property or subproperty.`);
50310				continue;
50311			}
50312			const targetParent = targetNode[$getParent]();
50313			if (targetNode instanceof SetProperty || targetParent instanceof SetProperty) {
50314				warn(`XFA - Invalid target: cannot be a setProperty or one of its properties.`);
50315				continue;
50316			}
50317			if (targetNode instanceof BindItems || targetParent instanceof BindItems) {
50318				warn(`XFA - Invalid target: cannot be a bindItems or one of its properties.`);
50319				continue;
50320			}
50321			const content = node[$text]();
50322			const name = targetNode[$nodeName];
50323			if (targetNode instanceof XFAAttribute) {
50324				const attrs = Object.create(null);
50325				attrs[name] = content;
50326				const obj = Reflect.construct(Object.getPrototypeOf(targetParent).constructor, [attrs]);
50327				targetParent[name] = obj[name];
50328				continue;
50329			}
50330			if (!targetNode.hasOwnProperty($content)) {
50331				warn(`XFA - Invalid node to use in setProperty`);
50332				continue;
50333			}
50334			targetNode[$data] = node;
50335			targetNode[$content] = content;
50336			targetNode[$finalize]();
50337		}
50338	}
50339	_bindItems(formNode, dataNode) {
50340		if (!formNode.hasOwnProperty("items") || !formNode.hasOwnProperty("bindItems") || formNode.bindItems.isEmpty()) {
50341			return;
50342		}
50343		for (const item of formNode.items.children) {
50344			formNode[$removeChild](item);
50345		}
50346		formNode.items.clear();
50347		const labels = new Items({});
50348		const values = new Items({});
50349		formNode[$appendChild](labels);
50350		formNode.items.push(labels);
50351		formNode[$appendChild](values);
50352		formNode.items.push(values);
50353		for (const {
50354			ref,
50355			labelRef,
50356			valueRef,
50357			connection
50358		} of formNode.bindItems.children) {
50359			if (connection) {
50360				continue;
50361			}
50362			if (!ref) {
50363				continue;
50364			}
50365			const nodes = searchNode(this.root, dataNode, ref, false, false);
50366			if (!nodes) {
50367				warn(`XFA - Invalid reference: ${ref}.`);
50368				continue;
50369			}
50370			for (const node of nodes) {
50371				if (!node[$isDescendent](this.datasets)) {
50372					warn(`XFA - Invalid ref (${ref}): must be a datasets child.`);
50373					continue;
50374				}
50375				const labelNodes = searchNode(this.root, node, labelRef, true, false);
50376				if (!labelNodes) {
50377					warn(`XFA - Invalid label: ${labelRef}.`);
50378					continue;
50379				}
50380				const [labelNode] = labelNodes;
50381				if (!labelNode[$isDescendent](this.datasets)) {
50382					warn(`XFA - Invalid label: must be a datasets child.`);
50383					continue;
50384				}
50385				const valueNodes = searchNode(this.root, node, valueRef, true, false);
50386				if (!valueNodes) {
50387					warn(`XFA - Invalid value: ${valueRef}.`);
50388					continue;
50389				}
50390				const [valueNode] = valueNodes;
50391				if (!valueNode[$isDescendent](this.datasets)) {
50392					warn(`XFA - Invalid value: must be a datasets child.`);
50393					continue;
50394				}
50395				const label = createText(labelNode[$text]());
50396				const value = createText(valueNode[$text]());
50397				labels[$appendChild](label);
50398				labels.text.push(label);
50399				values[$appendChild](value);
50400				values.text.push(value);
50401			}
50402		}
50403	}
50404	_bindOccurrences(formNode, matches, picture) {
50405		let baseClone;
50406		if (matches.length > 1) {
50407			baseClone = formNode[$clone]();
50408			baseClone[$removeChild](baseClone.occur);
50409			baseClone.occur = null;
50410		}
50411		this._bindValue(formNode, matches[0], picture);
50412		this._setProperties(formNode, matches[0]);
50413		this._bindItems(formNode, matches[0]);
50414		if (matches.length === 1) {
50415			return;
50416		}
50417		const parent = formNode[$getParent]();
50418		const name = formNode[$nodeName];
50419		const pos = parent[$indexOf](formNode);
50420		for (let i = 1, ii = matches.length; i < ii; i++) {
50421			const match = matches[i];
50422			const clone = baseClone[$clone]();
50423			parent[name].push(clone);
50424			parent[$insertAt](pos + i, clone);
50425			this._bindValue(clone, match, picture);
50426			this._setProperties(clone, match);
50427			this._bindItems(clone, match);
50428		}
50429	}
50430	_createOccurrences(formNode) {
50431		if (!this.emptyMerge) {
50432			return;
50433		}
50434		const {
50435			occur
50436		} = formNode;
50437		if (!occur || occur.initial <= 1) {
50438			return;
50439		}
50440		const parent = formNode[$getParent]();
50441		const name = formNode[$nodeName];
50442		if (!(parent[name] instanceof XFAObjectArray)) {
50443			return;
50444		}
50445		let currentNumber;
50446		if (formNode.name) {
vendor: 4,408 bytes, lines 50447-50605
50447			currentNumber = parent[name].children.filter(e => e.name === formNode.name).length;
50448		} else {
50449			currentNumber = parent[name].children.length;
50450		}
50451		const pos = parent[$indexOf](formNode) + 1;
50452		const ii = occur.initial - currentNumber;
50453		if (ii) {
50454			const nodeClone = formNode[$clone]();
50455			nodeClone[$removeChild](nodeClone.occur);
50456			nodeClone.occur = null;
50457			parent[name].push(nodeClone);
50458			parent[$insertAt](pos, nodeClone);
50459			for (let i = 1; i < ii; i++) {
50460				const clone = nodeClone[$clone]();
50461				parent[name].push(clone);
50462				parent[$insertAt](pos + i, clone);
50463			}
50464		}
50465	}
50466	_getOccurInfo(formNode) {
50467		const {
50468			name,
50469			occur
50470		} = formNode;
50471		if (!occur || !name) {
50472			return [1, 1];
50473		}
50474		const max = occur.max === -1 ? Infinity : occur.max;
50475		return [occur.min, max];
50476	}
50477	_setAndBind(formNode, dataNode) {
50478		this._setProperties(formNode, dataNode);
50479		this._bindItems(formNode, dataNode);
50480		this._bindElement(formNode, dataNode);
50481	}
50482	_bindElement(formNode, dataNode) {
50483		const uselessNodes = [];
50484		this._createOccurrences(formNode);
50485		for (const child of formNode[$getChildren]()) {
50486			if (child[$data]) {
50487				continue;
50488			}
50489			if (this._mergeMode === undefined && child[$nodeName] === "subform") {
50490				this._mergeMode = child.mergeMode === "consumeData";
50491				const dataChildren = dataNode[$getChildren]();
50492				if (dataChildren.length > 0) {
50493					this._bindOccurrences(child, [dataChildren[0]], null);
50494				} else if (this.emptyMerge) {
50495					const nsId = dataNode[$namespaceId] === bind_NS_DATASETS ? -1 : dataNode[$namespaceId];
50496					const dataChild = child[$data] = new XmlObject(nsId, child.name || "root");
50497					dataNode[$appendChild](dataChild);
50498					this._bindElement(child, dataChild);
50499				}
50500				continue;
50501			}
50502			if (!child[$isBindable]()) {
50503				continue;
50504			}
50505			let global = false;
50506			let picture = null;
50507			let ref = null;
50508			let match = null;
50509			if (child.bind) {
50510				switch (child.bind.match) {
50511					case "none":
50512						this._setAndBind(child, dataNode);
50513						continue;
50514					case "global":
50515						global = true;
50516						break;
50517					case "dataRef":
50518						if (!child.bind.ref) {
50519							warn(`XFA - ref is empty in node ${child[$nodeName]}.`);
50520							this._setAndBind(child, dataNode);
50521							continue;
50522						}
50523						ref = child.bind.ref;
50524						break;
50525					default:
50526						break;
50527				}
50528				if (child.bind.picture) {
50529					picture = child.bind.picture[$content];
50530				}
50531			}
50532			const [min, max] = this._getOccurInfo(child);
50533			if (ref) {
50534				match = searchNode(this.root, dataNode, ref, true, false);
50535				if (match === null) {
50536					match = createDataNode(this.data, dataNode, ref);
50537					if (!match) {
50538						continue;
50539					}
50540					if (this._isConsumeData()) {
50541						match[$consumed] = true;
50542					}
50543					this._setAndBind(child, match);
50544					continue;
50545				} else {
50546					if (this._isConsumeData()) {
50547						match = match.filter(node => !node[$consumed]);
50548					}
50549					if (match.length > max) {
50550						match = match.slice(0, max);
50551					} else if (match.length === 0) {
50552						match = null;
50553					}
50554					if (match && this._isConsumeData()) {
50555						match.forEach(node => {
50556							node[$consumed] = true;
50557						});
50558					}
50559				}
50560			} else {
50561				if (!child.name) {
50562					this._setAndBind(child, dataNode);
50563					continue;
50564				}
50565				if (this._isConsumeData()) {
50566					const matches = [];
50567					while (matches.length < max) {
50568						const found = this._findDataByNameToConsume(child.name, child[$hasSettableValue](), dataNode, global);
50569						if (!found) {
50570							break;
50571						}
50572						found[$consumed] = true;
50573						matches.push(found);
50574					}
50575					match = matches.length > 0 ? matches : null;
50576				} else {
50577					match = dataNode[$getRealChildrenByNameIt](child.name, false, this.emptyMerge).next().value;
50578					if (!match) {
50579						if (min === 0) {
50580							uselessNodes.push(child);
50581							continue;
50582						}
50583						const nsId = dataNode[$namespaceId] === bind_NS_DATASETS ? -1 : dataNode[$namespaceId];
50584						match = child[$data] = new XmlObject(nsId, child.name);
50585						if (this.emptyMerge) {
50586							match[$consumed] = true;
50587						}
50588						dataNode[$appendChild](match);
50589						this._setAndBind(child, match);
50590						continue;
50591					}
50592					if (this.emptyMerge) {
50593						match[$consumed] = true;
50594					}
50595					match = [match];
50596				}
50597			}
50598			if (match) {
50599				this._bindOccurrences(child, match, picture);
50600			} else if (min > 0) {
50601				this._setAndBind(child, dataNode);
50602			} else {
50603				uselessNodes.push(child);
50604			}
50605		}
vendor: 30,521 bytes, lines 50606-51821
50606		uselessNodes.forEach(node => node[$getParent]()[$removeChild](node));
50607	}
50608}
50609
50610;// ./src/core/xfa/data.js
50611
50612
50613class DataHandler {
50614	constructor(root, data) {
50615		this.data = data;
50616		this.dataset = root.datasets || null;
50617	}
50618	serialize(storage) {
50619		const stack = [[-1, this.data[$getChildren]()]];
50620		while (stack.length > 0) {
50621			const last = stack.at(-1);
50622			const [i, children] = last;
50623			if (i + 1 === children.length) {
50624				stack.pop();
50625				continue;
50626			}
50627			const child = children[++last[0]];
50628			const storageEntry = storage.get(child[$uid]);
50629			if (storageEntry) {
50630				child[$setValue](storageEntry);
50631			} else {
50632				const attributes = child[$getAttributes]();
50633				for (const value of attributes.values()) {
50634					const entry = storage.get(value[$uid]);
50635					if (entry) {
50636						value[$setValue](entry);
50637						break;
50638					}
50639				}
50640			}
50641			const nodes = child[$getChildren]();
50642			if (nodes.length > 0) {
50643				stack.push([-1, nodes]);
50644			}
50645		}
50646		const buf = [`<xfa:datasets xmlns:xfa="http://www.xfa.org/schema/xfa-data/1.0/">`];
50647		if (this.dataset) {
50648			for (const child of this.dataset[$getChildren]()) {
50649				if (child[$nodeName] !== "data") {
50650					child[$toString](buf);
50651				}
50652			}
50653		}
50654		this.data[$toString](buf);
50655		buf.push("</xfa:datasets>");
50656		return buf.join("");
50657	}
50658}
50659
50660;// ./src/core/xfa/config.js
50661
50662
50663
50664
50665
50666
50667
50668
50669
50670
50671
50672const CONFIG_NS_ID = NamespaceIds.config.id;
50673class Acrobat extends XFAObject {
50674	constructor(attributes) {
50675		super(CONFIG_NS_ID, "acrobat", true);
50676		this.acrobat7 = null;
50677		this.autoSave = null;
50678		this.common = null;
50679		this.validate = null;
50680		this.validateApprovalSignatures = null;
50681		this.submitUrl = new XFAObjectArray();
50682	}
50683}
50684class Acrobat7 extends XFAObject {
50685	constructor(attributes) {
50686		super(CONFIG_NS_ID, "acrobat7", true);
50687		this.dynamicRender = null;
50688	}
50689}
50690class ADBE_JSConsole extends OptionObject {
50691	constructor(attributes) {
50692		super(CONFIG_NS_ID, "ADBE_JSConsole", ["delegate", "Enable", "Disable"]);
50693	}
50694}
50695class ADBE_JSDebugger extends OptionObject {
50696	constructor(attributes) {
50697		super(CONFIG_NS_ID, "ADBE_JSDebugger", ["delegate", "Enable", "Disable"]);
50698	}
50699}
50700class AddSilentPrint extends Option01 {
50701	constructor(attributes) {
50702		super(CONFIG_NS_ID, "addSilentPrint");
50703	}
50704}
50705class AddViewerPreferences extends Option01 {
50706	constructor(attributes) {
50707		super(CONFIG_NS_ID, "addViewerPreferences");
50708	}
50709}
50710class AdjustData extends Option10 {
50711	constructor(attributes) {
50712		super(CONFIG_NS_ID, "adjustData");
50713	}
50714}
50715class AdobeExtensionLevel extends IntegerObject {
50716	constructor(attributes) {
50717		super(CONFIG_NS_ID, "adobeExtensionLevel", 0, n => n >= 1 && n <= 8);
50718	}
50719}
50720class Agent extends XFAObject {
50721	constructor(attributes) {
50722		super(CONFIG_NS_ID, "agent", true);
50723		this.name = attributes.name ? attributes.name.trim() : "";
50724		this.common = new XFAObjectArray();
50725	}
50726}
50727class AlwaysEmbed extends ContentObject {
50728	constructor(attributes) {
50729		super(CONFIG_NS_ID, "alwaysEmbed");
50730	}
50731}
50732class Amd extends StringObject {
50733	constructor(attributes) {
50734		super(CONFIG_NS_ID, "amd");
50735	}
50736}
50737class config_Area extends XFAObject {
50738	constructor(attributes) {
50739		super(CONFIG_NS_ID, "area");
50740		this.level = getInteger({
50741			data: attributes.level,
50742			defaultValue: 0,
50743			validate: n => n >= 1 && n <= 3
50744		});
50745		this.name = getStringOption(attributes.name, ["", "barcode", "coreinit", "deviceDriver", "font", "general", "layout", "merge", "script", "signature", "sourceSet", "templateCache"]);
50746	}
50747}
50748class Attributes extends OptionObject {
50749	constructor(attributes) {
50750		super(CONFIG_NS_ID, "attributes", ["preserve", "delegate", "ignore"]);
50751	}
50752}
50753class AutoSave extends OptionObject {
50754	constructor(attributes) {
50755		super(CONFIG_NS_ID, "autoSave", ["disabled", "enabled"]);
50756	}
50757}
50758class Base extends StringObject {
50759	constructor(attributes) {
50760		super(CONFIG_NS_ID, "base");
50761	}
50762}
50763class BatchOutput extends XFAObject {
50764	constructor(attributes) {
50765		super(CONFIG_NS_ID, "batchOutput");
50766		this.format = getStringOption(attributes.format, ["none", "concat", "zip", "zipCompress"]);
50767	}
50768}
50769class BehaviorOverride extends ContentObject {
50770	constructor(attributes) {
50771		super(CONFIG_NS_ID, "behaviorOverride");
50772	}
50773	[$finalize]() {
50774		this[$content] = new Map(this[$content].trim().split(/\s+/).filter(x => x.includes(":")).map(x => x.split(":", 2)));
50775	}
50776}
50777class Cache extends XFAObject {
50778	constructor(attributes) {
50779		super(CONFIG_NS_ID, "cache", true);
50780		this.templateCache = null;
50781	}
50782}
50783class Change extends Option01 {
50784	constructor(attributes) {
50785		super(CONFIG_NS_ID, "change");
50786	}
50787}
50788class Common extends XFAObject {
50789	constructor(attributes) {
50790		super(CONFIG_NS_ID, "common", true);
50791		this.data = null;
50792		this.locale = null;
50793		this.localeSet = null;
50794		this.messaging = null;
50795		this.suppressBanner = null;
50796		this.template = null;
50797		this.validationMessaging = null;
50798		this.versionControl = null;
50799		this.log = new XFAObjectArray();
50800	}
50801}
50802class Compress extends XFAObject {
50803	constructor(attributes) {
50804		super(CONFIG_NS_ID, "compress");
50805		this.scope = getStringOption(attributes.scope, ["imageOnly", "document"]);
50806	}
50807}
50808class CompressLogicalStructure extends Option01 {
50809	constructor(attributes) {
50810		super(CONFIG_NS_ID, "compressLogicalStructure");
50811	}
50812}
50813class CompressObjectStream extends Option10 {
50814	constructor(attributes) {
50815		super(CONFIG_NS_ID, "compressObjectStream");
50816	}
50817}
50818class Compression extends XFAObject {
50819	constructor(attributes) {
50820		super(CONFIG_NS_ID, "compression", true);
50821		this.compressLogicalStructure = null;
50822		this.compressObjectStream = null;
50823		this.level = null;
50824		this.type = null;
50825	}
50826}
50827class Config extends XFAObject {
50828	constructor(attributes) {
50829		super(CONFIG_NS_ID, "config", true);
50830		this.acrobat = null;
50831		this.present = null;
50832		this.trace = null;
50833		this.agent = new XFAObjectArray();
50834	}
50835}
50836class Conformance extends OptionObject {
50837	constructor(attributes) {
50838		super(CONFIG_NS_ID, "conformance", ["A", "B"]);
50839	}
50840}
50841class ContentCopy extends Option01 {
50842	constructor(attributes) {
50843		super(CONFIG_NS_ID, "contentCopy");
50844	}
50845}
50846class Copies extends IntegerObject {
50847	constructor(attributes) {
50848		super(CONFIG_NS_ID, "copies", 1, n => n >= 1);
50849	}
50850}
50851class Creator extends StringObject {
50852	constructor(attributes) {
50853		super(CONFIG_NS_ID, "creator");
50854	}
50855}
50856class CurrentPage extends IntegerObject {
50857	constructor(attributes) {
50858		super(CONFIG_NS_ID, "currentPage", 0, n => n >= 0);
50859	}
50860}
50861class Data extends XFAObject {
50862	constructor(attributes) {
50863		super(CONFIG_NS_ID, "data", true);
50864		this.adjustData = null;
50865		this.attributes = null;
50866		this.incrementalLoad = null;
50867		this.outputXSL = null;
50868		this.range = null;
50869		this.record = null;
50870		this.startNode = null;
50871		this.uri = null;
50872		this.window = null;
50873		this.xsl = null;
50874		this.excludeNS = new XFAObjectArray();
50875		this.transform = new XFAObjectArray();
50876	}
50877}
50878class Debug extends XFAObject {
50879	constructor(attributes) {
50880		super(CONFIG_NS_ID, "debug", true);
50881		this.uri = null;
50882	}
50883}
50884class DefaultTypeface extends ContentObject {
50885	constructor(attributes) {
50886		super(CONFIG_NS_ID, "defaultTypeface");
50887		this.writingScript = getStringOption(attributes.writingScript, ["*", "Arabic", "Cyrillic", "EastEuropeanRoman", "Greek", "Hebrew", "Japanese", "Korean", "Roman", "SimplifiedChinese", "Thai", "TraditionalChinese", "Vietnamese"]);
50888	}
50889}
50890class Destination extends OptionObject {
50891	constructor(attributes) {
50892		super(CONFIG_NS_ID, "destination", ["pdf", "pcl", "ps", "webClient", "zpl"]);
50893	}
50894}
50895class DocumentAssembly extends Option01 {
50896	constructor(attributes) {
50897		super(CONFIG_NS_ID, "documentAssembly");
50898	}
50899}
50900class Driver extends XFAObject {
50901	constructor(attributes) {
50902		super(CONFIG_NS_ID, "driver", true);
50903		this.name = attributes.name ? attributes.name.trim() : "";
50904		this.fontInfo = null;
50905		this.xdc = null;
50906	}
50907}
50908class DuplexOption extends OptionObject {
50909	constructor(attributes) {
50910		super(CONFIG_NS_ID, "duplexOption", ["simplex", "duplexFlipLongEdge", "duplexFlipShortEdge"]);
50911	}
50912}
50913class DynamicRender extends OptionObject {
50914	constructor(attributes) {
50915		super(CONFIG_NS_ID, "dynamicRender", ["forbidden", "required"]);
50916	}
50917}
50918class Embed extends Option01 {
50919	constructor(attributes) {
50920		super(CONFIG_NS_ID, "embed");
50921	}
50922}
50923class config_Encrypt extends Option01 {
50924	constructor(attributes) {
50925		super(CONFIG_NS_ID, "encrypt");
50926	}
50927}
50928class config_Encryption extends XFAObject {
50929	constructor(attributes) {
50930		super(CONFIG_NS_ID, "encryption", true);
50931		this.encrypt = null;
50932		this.encryptionLevel = null;
50933		this.permissions = null;
50934	}
50935}
50936class EncryptionLevel extends OptionObject {
50937	constructor(attributes) {
50938		super(CONFIG_NS_ID, "encryptionLevel", ["40bit", "128bit"]);
50939	}
50940}
50941class Enforce extends StringObject {
50942	constructor(attributes) {
50943		super(CONFIG_NS_ID, "enforce");
50944	}
50945}
50946class Equate extends XFAObject {
50947	constructor(attributes) {
50948		super(CONFIG_NS_ID, "equate");
50949		this.force = getInteger({
50950			data: attributes.force,
50951			defaultValue: 1,
50952			validate: n => n === 0
50953		});
50954		this.from = attributes.from || "";
50955		this.to = attributes.to || "";
50956	}
50957}
50958class EquateRange extends XFAObject {
50959	constructor(attributes) {
50960		super(CONFIG_NS_ID, "equateRange");
50961		this.from = attributes.from || "";
50962		this.to = attributes.to || "";
50963		this._unicodeRange = attributes.unicodeRange || "";
50964	}
50965	get unicodeRange() {
50966		const ranges = [];
50967		const unicodeRegex = /U\+([0-9a-fA-F]+)/;
50968		const unicodeRange = this._unicodeRange;
50969		for (let range of unicodeRange.split(",").map(x => x.trim()).filter(x => !!x)) {
50970			range = range.split("-", 2).map(x => {
50971				const found = x.match(unicodeRegex);
50972				if (!found) {
50973					return 0;
50974				}
50975				return parseInt(found[1], 16);
50976			});
50977			if (range.length === 1) {
50978				range.push(range[0]);
50979			}
50980			ranges.push(range);
50981		}
50982		return shadow(this, "unicodeRange", ranges);
50983	}
50984}
50985class Exclude extends ContentObject {
50986	constructor(attributes) {
50987		super(CONFIG_NS_ID, "exclude");
50988	}
50989	[$finalize]() {
50990		this[$content] = this[$content].trim().split(/\s+/).filter(x => x && ["calculate", "close", "enter", "exit", "initialize", "ready", "validate"].includes(x));
50991	}
50992}
50993class ExcludeNS extends StringObject {
50994	constructor(attributes) {
50995		super(CONFIG_NS_ID, "excludeNS");
50996	}
50997}
50998class FlipLabel extends OptionObject {
50999	constructor(attributes) {
51000		super(CONFIG_NS_ID, "flipLabel", ["usePrinterSetting", "on", "off"]);
51001	}
51002}
51003class config_FontInfo extends XFAObject {
51004	constructor(attributes) {
51005		super(CONFIG_NS_ID, "fontInfo", true);
51006		this.embed = null;
51007		this.map = null;
51008		this.subsetBelow = null;
51009		this.alwaysEmbed = new XFAObjectArray();
51010		this.defaultTypeface = new XFAObjectArray();
51011		this.neverEmbed = new XFAObjectArray();
51012	}
51013}
51014class FormFieldFilling extends Option01 {
51015	constructor(attributes) {
51016		super(CONFIG_NS_ID, "formFieldFilling");
51017	}
51018}
51019class GroupParent extends StringObject {
51020	constructor(attributes) {
51021		super(CONFIG_NS_ID, "groupParent");
51022	}
51023}
51024class IfEmpty extends OptionObject {
51025	constructor(attributes) {
51026		super(CONFIG_NS_ID, "ifEmpty", ["dataValue", "dataGroup", "ignore", "remove"]);
51027	}
51028}
51029class IncludeXDPContent extends StringObject {
51030	constructor(attributes) {
51031		super(CONFIG_NS_ID, "includeXDPContent");
51032	}
51033}
51034class IncrementalLoad extends OptionObject {
51035	constructor(attributes) {
51036		super(CONFIG_NS_ID, "incrementalLoad", ["none", "forwardOnly"]);
51037	}
51038}
51039class IncrementalMerge extends Option01 {
51040	constructor(attributes) {
51041		super(CONFIG_NS_ID, "incrementalMerge");
51042	}
51043}
51044class Interactive extends Option01 {
51045	constructor(attributes) {
51046		super(CONFIG_NS_ID, "interactive");
51047	}
51048}
51049class Jog extends OptionObject {
51050	constructor(attributes) {
51051		super(CONFIG_NS_ID, "jog", ["usePrinterSetting", "none", "pageSet"]);
51052	}
51053}
51054class LabelPrinter extends XFAObject {
51055	constructor(attributes) {
51056		super(CONFIG_NS_ID, "labelPrinter", true);
51057		this.name = getStringOption(attributes.name, ["zpl", "dpl", "ipl", "tcpl"]);
51058		this.batchOutput = null;
51059		this.flipLabel = null;
51060		this.fontInfo = null;
51061		this.xdc = null;
51062	}
51063}
51064class Layout extends OptionObject {
51065	constructor(attributes) {
51066		super(CONFIG_NS_ID, "layout", ["paginate", "panel"]);
51067	}
51068}
51069class Level extends IntegerObject {
51070	constructor(attributes) {
51071		super(CONFIG_NS_ID, "level", 0, n => n > 0);
51072	}
51073}
51074class Linearized extends Option01 {
51075	constructor(attributes) {
51076		super(CONFIG_NS_ID, "linearized");
51077	}
51078}
51079class Locale extends StringObject {
51080	constructor(attributes) {
51081		super(CONFIG_NS_ID, "locale");
51082	}
51083}
51084class LocaleSet extends StringObject {
51085	constructor(attributes) {
51086		super(CONFIG_NS_ID, "localeSet");
51087	}
51088}
51089class Log extends XFAObject {
51090	constructor(attributes) {
51091		super(CONFIG_NS_ID, "log", true);
51092		this.mode = null;
51093		this.threshold = null;
51094		this.to = null;
51095		this.uri = null;
51096	}
51097}
51098class MapElement extends XFAObject {
51099	constructor(attributes) {
51100		super(CONFIG_NS_ID, "map", true);
51101		this.equate = new XFAObjectArray();
51102		this.equateRange = new XFAObjectArray();
51103	}
51104}
51105class MediumInfo extends XFAObject {
51106	constructor(attributes) {
51107		super(CONFIG_NS_ID, "mediumInfo", true);
51108		this.map = null;
51109	}
51110}
51111class config_Message extends XFAObject {
51112	constructor(attributes) {
51113		super(CONFIG_NS_ID, "message", true);
51114		this.msgId = null;
51115		this.severity = null;
51116	}
51117}
51118class Messaging extends XFAObject {
51119	constructor(attributes) {
51120		super(CONFIG_NS_ID, "messaging", true);
51121		this.message = new XFAObjectArray();
51122	}
51123}
51124class Mode extends OptionObject {
51125	constructor(attributes) {
51126		super(CONFIG_NS_ID, "mode", ["append", "overwrite"]);
51127	}
51128}
51129class ModifyAnnots extends Option01 {
51130	constructor(attributes) {
51131		super(CONFIG_NS_ID, "modifyAnnots");
51132	}
51133}
51134class MsgId extends IntegerObject {
51135	constructor(attributes) {
51136		super(CONFIG_NS_ID, "msgId", 1, n => n >= 1);
51137	}
51138}
51139class NameAttr extends StringObject {
51140	constructor(attributes) {
51141		super(CONFIG_NS_ID, "nameAttr");
51142	}
51143}
51144class NeverEmbed extends ContentObject {
51145	constructor(attributes) {
51146		super(CONFIG_NS_ID, "neverEmbed");
51147	}
51148}
51149class NumberOfCopies extends IntegerObject {
51150	constructor(attributes) {
51151		super(CONFIG_NS_ID, "numberOfCopies", null, n => n >= 2 && n <= 5);
51152	}
51153}
51154class OpenAction extends XFAObject {
51155	constructor(attributes) {
51156		super(CONFIG_NS_ID, "openAction", true);
51157		this.destination = null;
51158	}
51159}
51160class Output extends XFAObject {
51161	constructor(attributes) {
51162		super(CONFIG_NS_ID, "output", true);
51163		this.to = null;
51164		this.type = null;
51165		this.uri = null;
51166	}
51167}
51168class OutputBin extends StringObject {
51169	constructor(attributes) {
51170		super(CONFIG_NS_ID, "outputBin");
51171	}
51172}
51173class OutputXSL extends XFAObject {
51174	constructor(attributes) {
51175		super(CONFIG_NS_ID, "outputXSL", true);
51176		this.uri = null;
51177	}
51178}
51179class Overprint extends OptionObject {
51180	constructor(attributes) {
51181		super(CONFIG_NS_ID, "overprint", ["none", "both", "draw", "field"]);
51182	}
51183}
51184class Packets extends StringObject {
51185	constructor(attributes) {
51186		super(CONFIG_NS_ID, "packets");
51187	}
51188	[$finalize]() {
51189		if (this[$content] === "*") {
51190			return;
51191		}
51192		this[$content] = this[$content].trim().split(/\s+/).filter(x => ["config", "datasets", "template", "xfdf", "xslt"].includes(x));
51193	}
51194}
51195class PageOffset extends XFAObject {
51196	constructor(attributes) {
51197		super(CONFIG_NS_ID, "pageOffset");
51198		this.x = getInteger({
51199			data: attributes.x,
51200			defaultValue: "useXDCSetting",
51201			validate: n => true
51202		});
51203		this.y = getInteger({
51204			data: attributes.y,
51205			defaultValue: "useXDCSetting",
51206			validate: n => true
51207		});
51208	}
51209}
51210class PageRange extends StringObject {
51211	constructor(attributes) {
51212		super(CONFIG_NS_ID, "pageRange");
51213	}
51214	[$finalize]() {
51215		const numbers = this[$content].trim().split(/\s+/).map(x => parseInt(x, 10));
51216		const ranges = [];
51217		for (let i = 0, ii = numbers.length; i < ii; i += 2) {
51218			ranges.push(numbers.slice(i, i + 2));
51219		}
51220		this[$content] = ranges;
51221	}
51222}
51223class Pagination extends OptionObject {
51224	constructor(attributes) {
51225		super(CONFIG_NS_ID, "pagination", ["simplex", "duplexShortEdge", "duplexLongEdge"]);
51226	}
51227}
51228class PaginationOverride extends OptionObject {
51229	constructor(attributes) {
51230		super(CONFIG_NS_ID, "paginationOverride", ["none", "forceDuplex", "forceDuplexLongEdge", "forceDuplexShortEdge", "forceSimplex"]);
51231	}
51232}
51233class Part extends IntegerObject {
51234	constructor(attributes) {
51235		super(CONFIG_NS_ID, "part", 1, n => false);
51236	}
51237}
51238class Pcl extends XFAObject {
51239	constructor(attributes) {
51240		super(CONFIG_NS_ID, "pcl", true);
51241		this.name = attributes.name || "";
51242		this.batchOutput = null;
51243		this.fontInfo = null;
51244		this.jog = null;
51245		this.mediumInfo = null;
51246		this.outputBin = null;
51247		this.pageOffset = null;
51248		this.staple = null;
51249		this.xdc = null;
51250	}
51251}
51252class Pdf extends XFAObject {
51253	constructor(attributes) {
51254		super(CONFIG_NS_ID, "pdf", true);
51255		this.name = attributes.name || "";
51256		this.adobeExtensionLevel = null;
51257		this.batchOutput = null;
51258		this.compression = null;
51259		this.creator = null;
51260		this.encryption = null;
51261		this.fontInfo = null;
51262		this.interactive = null;
51263		this.linearized = null;
51264		this.openAction = null;
51265		this.pdfa = null;
51266		this.producer = null;
51267		this.renderPolicy = null;
51268		this.scriptModel = null;
51269		this.silentPrint = null;
51270		this.submitFormat = null;
51271		this.tagged = null;
51272		this.version = null;
51273		this.viewerPreferences = null;
51274		this.xdc = null;
51275	}
51276}
51277class Pdfa extends XFAObject {
51278	constructor(attributes) {
51279		super(CONFIG_NS_ID, "pdfa", true);
51280		this.amd = null;
51281		this.conformance = null;
51282		this.includeXDPContent = null;
51283		this.part = null;
51284	}
51285}
51286class Permissions extends XFAObject {
51287	constructor(attributes) {
51288		super(CONFIG_NS_ID, "permissions", true);
51289		this.accessibleContent = null;
51290		this.change = null;
51291		this.contentCopy = null;
51292		this.documentAssembly = null;
51293		this.formFieldFilling = null;
51294		this.modifyAnnots = null;
51295		this.plaintextMetadata = null;
51296		this.print = null;
51297		this.printHighQuality = null;
51298	}
51299}
51300class PickTrayByPDFSize extends Option01 {
51301	constructor(attributes) {
51302		super(CONFIG_NS_ID, "pickTrayByPDFSize");
51303	}
51304}
51305class config_Picture extends StringObject {
51306	constructor(attributes) {
51307		super(CONFIG_NS_ID, "picture");
51308	}
51309}
51310class PlaintextMetadata extends Option01 {
51311	constructor(attributes) {
51312		super(CONFIG_NS_ID, "plaintextMetadata");
51313	}
51314}
51315class Presence extends OptionObject {
51316	constructor(attributes) {
51317		super(CONFIG_NS_ID, "presence", ["preserve", "dissolve", "dissolveStructure", "ignore", "remove"]);
51318	}
51319}
51320class Present extends XFAObject {
51321	constructor(attributes) {
51322		super(CONFIG_NS_ID, "present", true);
51323		this.behaviorOverride = null;
51324		this.cache = null;
51325		this.common = null;
51326		this.copies = null;
51327		this.destination = null;
51328		this.incrementalMerge = null;
51329		this.layout = null;
51330		this.output = null;
51331		this.overprint = null;
51332		this.pagination = null;
51333		this.paginationOverride = null;
51334		this.script = null;
51335		this.validate = null;
51336		this.xdp = null;
51337		this.driver = new XFAObjectArray();
51338		this.labelPrinter = new XFAObjectArray();
51339		this.pcl = new XFAObjectArray();
51340		this.pdf = new XFAObjectArray();
51341		this.ps = new XFAObjectArray();
51342		this.submitUrl = new XFAObjectArray();
51343		this.webClient = new XFAObjectArray();
51344		this.zpl = new XFAObjectArray();
51345	}
51346}
51347class Print extends Option01 {
51348	constructor(attributes) {
51349		super(CONFIG_NS_ID, "print");
51350	}
51351}
51352class PrintHighQuality extends Option01 {
51353	constructor(attributes) {
51354		super(CONFIG_NS_ID, "printHighQuality");
51355	}
51356}
51357class PrintScaling extends OptionObject {
51358	constructor(attributes) {
51359		super(CONFIG_NS_ID, "printScaling", ["appdefault", "noScaling"]);
51360	}
51361}
51362class PrinterName extends StringObject {
51363	constructor(attributes) {
51364		super(CONFIG_NS_ID, "printerName");
51365	}
51366}
51367class Producer extends StringObject {
51368	constructor(attributes) {
51369		super(CONFIG_NS_ID, "producer");
51370	}
51371}
51372class Ps extends XFAObject {
51373	constructor(attributes) {
51374		super(CONFIG_NS_ID, "ps", true);
51375		this.name = attributes.name || "";
51376		this.batchOutput = null;
51377		this.fontInfo = null;
51378		this.jog = null;
51379		this.mediumInfo = null;
51380		this.outputBin = null;
51381		this.staple = null;
51382		this.xdc = null;
51383	}
51384}
51385class Range extends ContentObject {
51386	constructor(attributes) {
51387		super(CONFIG_NS_ID, "range");
51388	}
51389	[$finalize]() {
51390		this[$content] = this[$content].trim().split(/\s*,\s*/, 2).map(range => range.split("-").map(x => parseInt(x.trim(), 10))).filter(range => range.every(x => !isNaN(x))).map(range => {
51391			if (range.length === 1) {
51392				range.push(range[0]);
51393			}
51394			return range;
51395		});
51396	}
51397}
51398class Record extends ContentObject {
51399	constructor(attributes) {
51400		super(CONFIG_NS_ID, "record");
51401	}
51402	[$finalize]() {
51403		this[$content] = this[$content].trim();
51404		const n = parseInt(this[$content], 10);
51405		if (!isNaN(n) && n >= 0) {
51406			this[$content] = n;
51407		}
51408	}
51409}
51410class Relevant extends ContentObject {
51411	constructor(attributes) {
51412		super(CONFIG_NS_ID, "relevant");
51413	}
51414	[$finalize]() {
51415		this[$content] = this[$content].trim().split(/\s+/);
51416	}
51417}
51418class Rename extends ContentObject {
51419	constructor(attributes) {
51420		super(CONFIG_NS_ID, "rename");
51421	}
51422	[$finalize]() {
51423		this[$content] = this[$content].trim();
51424		if (this[$content].toLowerCase().startsWith("xml") || new RegExp("[\\p{L}_][\\p{L}\\d._\\p{M}-]*", "u").test(this[$content])) {
51425			warn("XFA - Rename: invalid XFA name");
51426		}
51427	}
51428}
51429class RenderPolicy extends OptionObject {
51430	constructor(attributes) {
51431		super(CONFIG_NS_ID, "renderPolicy", ["server", "client"]);
51432	}
51433}
51434class RunScripts extends OptionObject {
51435	constructor(attributes) {
51436		super(CONFIG_NS_ID, "runScripts", ["both", "client", "none", "server"]);
51437	}
51438}
51439class config_Script extends XFAObject {
51440	constructor(attributes) {
51441		super(CONFIG_NS_ID, "script", true);
51442		this.currentPage = null;
51443		this.exclude = null;
51444		this.runScripts = null;
51445	}
51446}
51447class ScriptModel extends OptionObject {
51448	constructor(attributes) {
51449		super(CONFIG_NS_ID, "scriptModel", ["XFA", "none"]);
51450	}
51451}
51452class Severity extends OptionObject {
51453	constructor(attributes) {
51454		super(CONFIG_NS_ID, "severity", ["ignore", "error", "information", "trace", "warning"]);
51455	}
51456}
51457class SilentPrint extends XFAObject {
51458	constructor(attributes) {
51459		super(CONFIG_NS_ID, "silentPrint", true);
51460		this.addSilentPrint = null;
51461		this.printerName = null;
51462	}
51463}
51464class Staple extends XFAObject {
51465	constructor(attributes) {
51466		super(CONFIG_NS_ID, "staple");
51467		this.mode = getStringOption(attributes.mode, ["usePrinterSetting", "on", "off"]);
51468	}
51469}
51470class StartNode extends StringObject {
51471	constructor(attributes) {
51472		super(CONFIG_NS_ID, "startNode");
51473	}
51474}
51475class StartPage extends IntegerObject {
51476	constructor(attributes) {
51477		super(CONFIG_NS_ID, "startPage", 0, n => true);
51478	}
51479}
51480class SubmitFormat extends OptionObject {
51481	constructor(attributes) {
51482		super(CONFIG_NS_ID, "submitFormat", ["html", "delegate", "fdf", "xml", "pdf"]);
51483	}
51484}
51485class SubmitUrl extends StringObject {
51486	constructor(attributes) {
51487		super(CONFIG_NS_ID, "submitUrl");
51488	}
51489}
51490class SubsetBelow extends IntegerObject {
51491	constructor(attributes) {
51492		super(CONFIG_NS_ID, "subsetBelow", 100, n => n >= 0 && n <= 100);
51493	}
51494}
51495class SuppressBanner extends Option01 {
51496	constructor(attributes) {
51497		super(CONFIG_NS_ID, "suppressBanner");
51498	}
51499}
51500class Tagged extends Option01 {
51501	constructor(attributes) {
51502		super(CONFIG_NS_ID, "tagged");
51503	}
51504}
51505class config_Template extends XFAObject {
51506	constructor(attributes) {
51507		super(CONFIG_NS_ID, "template", true);
51508		this.base = null;
51509		this.relevant = null;
51510		this.startPage = null;
51511		this.uri = null;
51512		this.xsl = null;
51513	}
51514}
51515class Threshold extends OptionObject {
51516	constructor(attributes) {
51517		super(CONFIG_NS_ID, "threshold", ["trace", "error", "information", "warning"]);
51518	}
51519}
51520class To extends OptionObject {
51521	constructor(attributes) {
51522		super(CONFIG_NS_ID, "to", ["null", "memory", "stderr", "stdout", "system", "uri"]);
51523	}
51524}
51525class TemplateCache extends XFAObject {
51526	constructor(attributes) {
51527		super(CONFIG_NS_ID, "templateCache");
51528		this.maxEntries = getInteger({
51529			data: attributes.maxEntries,
51530			defaultValue: 5,
51531			validate: n => n >= 0
51532		});
51533	}
51534}
51535class Trace extends XFAObject {
51536	constructor(attributes) {
51537		super(CONFIG_NS_ID, "trace", true);
51538		this.area = new XFAObjectArray();
51539	}
51540}
51541class Transform extends XFAObject {
51542	constructor(attributes) {
51543		super(CONFIG_NS_ID, "transform", true);
51544		this.groupParent = null;
51545		this.ifEmpty = null;
51546		this.nameAttr = null;
51547		this.picture = null;
51548		this.presence = null;
51549		this.rename = null;
51550		this.whitespace = null;
51551	}
51552}
51553class Type extends OptionObject {
51554	constructor(attributes) {
51555		super(CONFIG_NS_ID, "type", ["none", "ascii85", "asciiHex", "ccittfax", "flate", "lzw", "runLength", "native", "xdp", "mergedXDP"]);
51556	}
51557}
51558class Uri extends StringObject {
51559	constructor(attributes) {
51560		super(CONFIG_NS_ID, "uri");
51561	}
51562}
51563class config_Validate extends OptionObject {
51564	constructor(attributes) {
51565		super(CONFIG_NS_ID, "validate", ["preSubmit", "prePrint", "preExecute", "preSave"]);
51566	}
51567}
51568class ValidateApprovalSignatures extends ContentObject {
51569	constructor(attributes) {
51570		super(CONFIG_NS_ID, "validateApprovalSignatures");
51571	}
51572	[$finalize]() {
51573		this[$content] = this[$content].trim().split(/\s+/).filter(x => ["docReady", "postSign"].includes(x));
51574	}
51575}
51576class ValidationMessaging extends OptionObject {
51577	constructor(attributes) {
51578		super(CONFIG_NS_ID, "validationMessaging", ["allMessagesIndividually", "allMessagesTogether", "firstMessageOnly", "noMessages"]);
51579	}
51580}
51581class Version extends OptionObject {
51582	constructor(attributes) {
51583		super(CONFIG_NS_ID, "version", ["1.7", "1.6", "1.5", "1.4", "1.3", "1.2"]);
51584	}
51585}
51586class VersionControl extends XFAObject {
51587	constructor(attributes) {
51588		super(CONFIG_NS_ID, "VersionControl");
51589		this.outputBelow = getStringOption(attributes.outputBelow, ["warn", "error", "update"]);
51590		this.sourceAbove = getStringOption(attributes.sourceAbove, ["warn", "error"]);
51591		this.sourceBelow = getStringOption(attributes.sourceBelow, ["update", "maintain"]);
51592	}
51593}
51594class ViewerPreferences extends XFAObject {
51595	constructor(attributes) {
51596		super(CONFIG_NS_ID, "viewerPreferences", true);
51597		this.ADBE_JSConsole = null;
51598		this.ADBE_JSDebugger = null;
51599		this.addViewerPreferences = null;
51600		this.duplexOption = null;
51601		this.enforce = null;
51602		this.numberOfCopies = null;
51603		this.pageRange = null;
51604		this.pickTrayByPDFSize = null;
51605		this.printScaling = null;
51606	}
51607}
51608class WebClient extends XFAObject {
51609	constructor(attributes) {
51610		super(CONFIG_NS_ID, "webClient", true);
51611		this.name = attributes.name ? attributes.name.trim() : "";
51612		this.fontInfo = null;
51613		this.xdc = null;
51614	}
51615}
51616class Whitespace extends OptionObject {
51617	constructor(attributes) {
51618		super(CONFIG_NS_ID, "whitespace", ["preserve", "ltrim", "normalize", "rtrim", "trim"]);
51619	}
51620}
51621class Window extends ContentObject {
51622	constructor(attributes) {
51623		super(CONFIG_NS_ID, "window");
51624	}
51625	[$finalize]() {
51626		const pair = this[$content].trim().split(/\s*,\s*/, 2).map(x => parseInt(x, 10));
51627		if (pair.some(x => isNaN(x))) {
51628			this[$content] = [0, 0];
51629			return;
51630		}
51631		if (pair.length === 1) {
51632			pair.push(pair[0]);
51633		}
51634		this[$content] = pair;
51635	}
51636}
51637class Xdc extends XFAObject {
51638	constructor(attributes) {
51639		super(CONFIG_NS_ID, "xdc", true);
51640		this.uri = new XFAObjectArray();
51641		this.xsl = new XFAObjectArray();
51642	}
51643}
51644class Xdp extends XFAObject {
51645	constructor(attributes) {
51646		super(CONFIG_NS_ID, "xdp", true);
51647		this.packets = null;
51648	}
51649}
51650class Xsl extends XFAObject {
51651	constructor(attributes) {
51652		super(CONFIG_NS_ID, "xsl", true);
51653		this.debug = null;
51654		this.uri = null;
51655	}
51656}
51657class Zpl extends XFAObject {
51658	constructor(attributes) {
51659		super(CONFIG_NS_ID, "zpl", true);
51660		this.name = attributes.name ? attributes.name.trim() : "";
51661		this.batchOutput = null;
51662		this.flipLabel = null;
51663		this.fontInfo = null;
51664		this.xdc = null;
51665	}
51666}
51667class ConfigNamespace {
51668	static [$buildXFAObject](name, attributes) {
51669		if (ConfigNamespace.hasOwnProperty(name)) {
51670			return ConfigNamespace[name](attributes);
51671		}
51672		return undefined;
51673	}
51674	static acrobat(attrs) {
51675		return new Acrobat(attrs);
51676	}
51677	static acrobat7(attrs) {
51678		return new Acrobat7(attrs);
51679	}
51680	static ADBE_JSConsole(attrs) {
51681		return new ADBE_JSConsole(attrs);
51682	}
51683	static ADBE_JSDebugger(attrs) {
51684		return new ADBE_JSDebugger(attrs);
51685	}
51686	static addSilentPrint(attrs) {
51687		return new AddSilentPrint(attrs);
51688	}
51689	static addViewerPreferences(attrs) {
51690		return new AddViewerPreferences(attrs);
51691	}
51692	static adjustData(attrs) {
51693		return new AdjustData(attrs);
51694	}
51695	static adobeExtensionLevel(attrs) {
51696		return new AdobeExtensionLevel(attrs);
51697	}
51698	static agent(attrs) {
51699		return new Agent(attrs);
51700	}
51701	static alwaysEmbed(attrs) {
51702		return new AlwaysEmbed(attrs);
51703	}
51704	static amd(attrs) {
51705		return new Amd(attrs);
51706	}
51707	static area(attrs) {
51708		return new config_Area(attrs);
51709	}
51710	static attributes(attrs) {
51711		return new Attributes(attrs);
51712	}
51713	static autoSave(attrs) {
51714		return new AutoSave(attrs);
51715	}
51716	static base(attrs) {
51717		return new Base(attrs);
51718	}
51719	static batchOutput(attrs) {
51720		return new BatchOutput(attrs);
51721	}
51722	static behaviorOverride(attrs) {
51723		return new BehaviorOverride(attrs);
51724	}
51725	static cache(attrs) {
51726		return new Cache(attrs);
51727	}
51728	static change(attrs) {
51729		return new Change(attrs);
51730	}
51731	static common(attrs) {
51732		return new Common(attrs);
51733	}
51734	static compress(attrs) {
51735		return new Compress(attrs);
51736	}
51737	static compressLogicalStructure(attrs) {
51738		return new CompressLogicalStructure(attrs);
51739	}
51740	static compressObjectStream(attrs) {
51741		return new CompressObjectStream(attrs);
51742	}
51743	static compression(attrs) {
51744		return new Compression(attrs);
51745	}
51746	static config(attrs) {
51747		return new Config(attrs);
51748	}
51749	static conformance(attrs) {
51750		return new Conformance(attrs);
51751	}
51752	static contentCopy(attrs) {
51753		return new ContentCopy(attrs);
51754	}
51755	static copies(attrs) {
51756		return new Copies(attrs);
51757	}
51758	static creator(attrs) {
51759		return new Creator(attrs);
51760	}
51761	static currentPage(attrs) {
51762		return new CurrentPage(attrs);
51763	}
51764	static data(attrs) {
51765		return new Data(attrs);
51766	}
51767	static debug(attrs) {
51768		return new Debug(attrs);
51769	}
51770	static defaultTypeface(attrs) {
51771		return new DefaultTypeface(attrs);
51772	}
51773	static destination(attrs) {
51774		return new Destination(attrs);
51775	}
51776	static documentAssembly(attrs) {
51777		return new DocumentAssembly(attrs);
51778	}
51779	static driver(attrs) {
51780		return new Driver(attrs);
51781	}
51782	static duplexOption(attrs) {
51783		return new DuplexOption(attrs);
51784	}
51785	static dynamicRender(attrs) {
51786		return new DynamicRender(attrs);
51787	}
51788	static embed(attrs) {
51789		return new Embed(attrs);
51790	}
51791	static encrypt(attrs) {
51792		return new config_Encrypt(attrs);
51793	}
51794	static encryption(attrs) {
51795		return new config_Encryption(attrs);
51796	}
51797	static encryptionLevel(attrs) {
51798		return new EncryptionLevel(attrs);
51799	}
51800	static enforce(attrs) {
51801		return new Enforce(attrs);
51802	}
51803	static equate(attrs) {
51804		return new Equate(attrs);
51805	}
51806	static equateRange(attrs) {
51807		return new EquateRange(attrs);
51808	}
51809	static exclude(attrs) {
51810		return new Exclude(attrs);
51811	}
51812	static excludeNS(attrs) {
51813		return new ExcludeNS(attrs);
51814	}
51815	static flipLabel(attrs) {
51816		return new FlipLabel(attrs);
51817	}
51818	static fontInfo(attrs) {
51819		return new config_FontInfo(attrs);
51820	}
51821	static formFieldFilling(attrs) {
51822		return new FormFieldFilling(attrs);
51823	}
51824	static groupParent(attrs) {
51825		return new GroupParent(attrs);
51826	}
51827	static ifEmpty(attrs) {
51828		return new IfEmpty(attrs);
51829	}
51830	static includeXDPContent(attrs) {
51831		return new IncludeXDPContent(attrs);
51832	}
51833	static incrementalLoad(attrs) {
51834		return new IncrementalLoad(attrs);
51835	}
51836	static incrementalMerge(attrs) {
51837		return new IncrementalMerge(attrs);
51838	}
51839	static interactive(attrs) {
51840		return new Interactive(attrs);
51841	}
51842	static jog(attrs) {
51843		return new Jog(attrs);
51844	}
51845	static labelPrinter(attrs) {
51846		return new LabelPrinter(attrs);
51847	}
51848	static layout(attrs) {
51849		return new Layout(attrs);
51850	}
51851	static level(attrs) {
51852		return new Level(attrs);
51853	}
51854	static linearized(attrs) {
51855		return new Linearized(attrs);
51856	}
51857	static locale(attrs) {
51858		return new Locale(attrs);
51859	}
51860	static localeSet(attrs) {
51861		return new LocaleSet(attrs);
51862	}
51863	static log(attrs) {
51864		return new Log(attrs);
51865	}
51866	static map(attrs) {
51867		return new MapElement(attrs);
51868	}
51869	static mediumInfo(attrs) {
51870		return new MediumInfo(attrs);
51871	}
51872	static message(attrs) {
51873		return new config_Message(attrs);
51874	}
51875	static messaging(attrs) {
51876		return new Messaging(attrs);
51877	}
51878	static mode(attrs) {
51879		return new Mode(attrs);
51880	}
51881	static modifyAnnots(attrs) {
51882		return new ModifyAnnots(attrs);
51883	}
51884	static msgId(attrs) {
51885		return new MsgId(attrs);
51886	}
51887	static nameAttr(attrs) {
51888		return new NameAttr(attrs);
51889	}
51890	static neverEmbed(attrs) {
51891		return new NeverEmbed(attrs);
51892	}
51893	static numberOfCopies(attrs) {
51894		return new NumberOfCopies(attrs);
51895	}
51896	static openAction(attrs) {
51897		return new OpenAction(attrs);
51898	}
51899	static output(attrs) {
51900		return new Output(attrs);
51901	}
51902	static outputBin(attrs) {
51903		return new OutputBin(attrs);
51904	}
51905	static outputXSL(attrs) {
51906		return new OutputXSL(attrs);
51907	}
51908	static overprint(attrs) {
51909		return new Overprint(attrs);
51910	}
51911	static packets(attrs) {
51912		return new Packets(attrs);
51913	}
51914	static pageOffset(attrs) {
51915		return new PageOffset(attrs);
51916	}
51917	static pageRange(attrs) {
51918		return new PageRange(attrs);
51919	}
51920	static pagination(attrs) {
51921		return new Pagination(attrs);
51922	}
51923	static paginationOverride(attrs) {
51924		return new PaginationOverride(attrs);
51925	}
51926	static part(attrs) {
51927		return new Part(attrs);
51928	}
51929	static pcl(attrs) {
51930		return new Pcl(attrs);
51931	}
51932	static pdf(attrs) {
51933		return new Pdf(attrs);
51934	}
51935	static pdfa(attrs) {
51936		return new Pdfa(attrs);
51937	}
51938	static permissions(attrs) {
51939		return new Permissions(attrs);
51940	}
51941	static pickTrayByPDFSize(attrs) {
51942		return new PickTrayByPDFSize(attrs);
51943	}
51944	static picture(attrs) {
51945		return new config_Picture(attrs);
51946	}
51947	static plaintextMetadata(attrs) {
51948		return new PlaintextMetadata(attrs);
51949	}
51950	static presence(attrs) {
51951		return new Presence(attrs);
51952	}
51953	static present(attrs) {
51954		return new Present(attrs);
51955	}
51956	static print(attrs) {
51957		return new Print(attrs);
51958	}
51959	static printHighQuality(attrs) {
51960		return new PrintHighQuality(attrs);
51961	}
51962	static printScaling(attrs) {
51963		return new PrintScaling(attrs);
51964	}
51965	static printerName(attrs) {
51966		return new PrinterName(attrs);
51967	}
51968	static producer(attrs) {
51969		return new Producer(attrs);
51970	}
51971	static ps(attrs) {
51972		return new Ps(attrs);
51973	}
51974	static range(attrs) {
51975		return new Range(attrs);
51976	}
51977	static record(attrs) {
51978		return new Record(attrs);
51979	}
51980	static relevant(attrs) {
51981		return new Relevant(attrs);
51982	}
51983	static rename(attrs) {
51984		return new Rename(attrs);
51985	}
51986	static renderPolicy(attrs) {
51987		return new RenderPolicy(attrs);
51988	}
51989	static runScripts(attrs) {
51990		return new RunScripts(attrs);
51991	}
51992	static script(attrs) {
51993		return new config_Script(attrs);
51994	}
51995	static scriptModel(attrs) {
51996		return new ScriptModel(attrs);
51997	}
51998	static severity(attrs) {
51999		return new Severity(attrs);
52000	}
52001	static silentPrint(attrs) {
52002		return new SilentPrint(attrs);
52003	}
52004	static staple(attrs) {
52005		return new Staple(attrs);
52006	}
52007	static startNode(attrs) {
52008		return new StartNode(attrs);
52009	}
52010	static startPage(attrs) {
52011		return new StartPage(attrs);
52012	}
52013	static submitFormat(attrs) {
52014		return new SubmitFormat(attrs);
52015	}
52016	static submitUrl(attrs) {
52017		return new SubmitUrl(attrs);
52018	}
52019	static subsetBelow(attrs) {
52020		return new SubsetBelow(attrs);
52021	}
52022	static suppressBanner(attrs) {
52023		return new SuppressBanner(attrs);
52024	}
52025	static tagged(attrs) {
52026		return new Tagged(attrs);
52027	}
52028	static template(attrs) {
52029		return new config_Template(attrs);
52030	}
52031	static templateCache(attrs) {
52032		return new TemplateCache(attrs);
52033	}
52034	static threshold(attrs) {
52035		return new Threshold(attrs);
52036	}
52037	static to(attrs) {
52038		return new To(attrs);
52039	}
52040	static trace(attrs) {
52041		return new Trace(attrs);
52042	}
52043	static transform(attrs) {
52044		return new Transform(attrs);
52045	}
52046	static type(attrs) {
52047		return new Type(attrs);
52048	}
52049	static uri(attrs) {
52050		return new Uri(attrs);
52051	}
52052	static validate(attrs) {
vendor: 51,059 bytes, lines 52053-54028
52053		return new config_Validate(attrs);
52054	}
52055	static validateApprovalSignatures(attrs) {
52056		return new ValidateApprovalSignatures(attrs);
52057	}
52058	static validationMessaging(attrs) {
52059		return new ValidationMessaging(attrs);
52060	}
52061	static version(attrs) {
52062		return new Version(attrs);
52063	}
52064	static versionControl(attrs) {
52065		return new VersionControl(attrs);
52066	}
52067	static viewerPreferences(attrs) {
52068		return new ViewerPreferences(attrs);
52069	}
52070	static webClient(attrs) {
52071		return new WebClient(attrs);
52072	}
52073	static whitespace(attrs) {
52074		return new Whitespace(attrs);
52075	}
52076	static window(attrs) {
52077		return new Window(attrs);
52078	}
52079	static xdc(attrs) {
52080		return new Xdc(attrs);
52081	}
52082	static xdp(attrs) {
52083		return new Xdp(attrs);
52084	}
52085	static xsl(attrs) {
52086		return new Xsl(attrs);
52087	}
52088	static zpl(attrs) {
52089		return new Zpl(attrs);
52090	}
52091}
52092
52093;// ./src/core/xfa/connection_set.js
52094
52095
52096const CONNECTION_SET_NS_ID = NamespaceIds.connectionSet.id;
52097class ConnectionSet extends XFAObject {
52098	constructor(attributes) {
52099		super(CONNECTION_SET_NS_ID, "connectionSet", true);
52100		this.wsdlConnection = new XFAObjectArray();
52101		this.xmlConnection = new XFAObjectArray();
52102		this.xsdConnection = new XFAObjectArray();
52103	}
52104}
52105class EffectiveInputPolicy extends XFAObject {
52106	constructor(attributes) {
52107		super(CONNECTION_SET_NS_ID, "effectiveInputPolicy");
52108		this.id = attributes.id || "";
52109		this.name = attributes.name || "";
52110		this.use = attributes.use || "";
52111		this.usehref = attributes.usehref || "";
52112	}
52113}
52114class EffectiveOutputPolicy extends XFAObject {
52115	constructor(attributes) {
52116		super(CONNECTION_SET_NS_ID, "effectiveOutputPolicy");
52117		this.id = attributes.id || "";
52118		this.name = attributes.name || "";
52119		this.use = attributes.use || "";
52120		this.usehref = attributes.usehref || "";
52121	}
52122}
52123class Operation extends StringObject {
52124	constructor(attributes) {
52125		super(CONNECTION_SET_NS_ID, "operation");
52126		this.id = attributes.id || "";
52127		this.input = attributes.input || "";
52128		this.name = attributes.name || "";
52129		this.output = attributes.output || "";
52130		this.use = attributes.use || "";
52131		this.usehref = attributes.usehref || "";
52132	}
52133}
52134class RootElement extends StringObject {
52135	constructor(attributes) {
52136		super(CONNECTION_SET_NS_ID, "rootElement");
52137		this.id = attributes.id || "";
52138		this.name = attributes.name || "";
52139		this.use = attributes.use || "";
52140		this.usehref = attributes.usehref || "";
52141	}
52142}
52143class SoapAction extends StringObject {
52144	constructor(attributes) {
52145		super(CONNECTION_SET_NS_ID, "soapAction");
52146		this.id = attributes.id || "";
52147		this.name = attributes.name || "";
52148		this.use = attributes.use || "";
52149		this.usehref = attributes.usehref || "";
52150	}
52151}
52152class SoapAddress extends StringObject {
52153	constructor(attributes) {
52154		super(CONNECTION_SET_NS_ID, "soapAddress");
52155		this.id = attributes.id || "";
52156		this.name = attributes.name || "";
52157		this.use = attributes.use || "";
52158		this.usehref = attributes.usehref || "";
52159	}
52160}
52161class connection_set_Uri extends StringObject {
52162	constructor(attributes) {
52163		super(CONNECTION_SET_NS_ID, "uri");
52164		this.id = attributes.id || "";
52165		this.name = attributes.name || "";
52166		this.use = attributes.use || "";
52167		this.usehref = attributes.usehref || "";
52168	}
52169}
52170class WsdlAddress extends StringObject {
52171	constructor(attributes) {
52172		super(CONNECTION_SET_NS_ID, "wsdlAddress");
52173		this.id = attributes.id || "";
52174		this.name = attributes.name || "";
52175		this.use = attributes.use || "";
52176		this.usehref = attributes.usehref || "";
52177	}
52178}
52179class WsdlConnection extends XFAObject {
52180	constructor(attributes) {
52181		super(CONNECTION_SET_NS_ID, "wsdlConnection", true);
52182		this.dataDescription = attributes.dataDescription || "";
52183		this.name = attributes.name || "";
52184		this.effectiveInputPolicy = null;
52185		this.effectiveOutputPolicy = null;
52186		this.operation = null;
52187		this.soapAction = null;
52188		this.soapAddress = null;
52189		this.wsdlAddress = null;
52190	}
52191}
52192class XmlConnection extends XFAObject {
52193	constructor(attributes) {
52194		super(CONNECTION_SET_NS_ID, "xmlConnection", true);
52195		this.dataDescription = attributes.dataDescription || "";
52196		this.name = attributes.name || "";
52197		this.uri = null;
52198	}
52199}
52200class XsdConnection extends XFAObject {
52201	constructor(attributes) {
52202		super(CONNECTION_SET_NS_ID, "xsdConnection", true);
52203		this.dataDescription = attributes.dataDescription || "";
52204		this.name = attributes.name || "";
52205		this.rootElement = null;
52206		this.uri = null;
52207	}
52208}
52209class ConnectionSetNamespace {
52210	static [$buildXFAObject](name, attributes) {
52211		if (ConnectionSetNamespace.hasOwnProperty(name)) {
52212			return ConnectionSetNamespace[name](attributes);
52213		}
52214		return undefined;
52215	}
52216	static connectionSet(attrs) {
52217		return new ConnectionSet(attrs);
52218	}
52219	static effectiveInputPolicy(attrs) {
52220		return new EffectiveInputPolicy(attrs);
52221	}
52222	static effectiveOutputPolicy(attrs) {
52223		return new EffectiveOutputPolicy(attrs);
52224	}
52225	static operation(attrs) {
52226		return new Operation(attrs);
52227	}
52228	static rootElement(attrs) {
52229		return new RootElement(attrs);
52230	}
52231	static soapAction(attrs) {
52232		return new SoapAction(attrs);
52233	}
52234	static soapAddress(attrs) {
52235		return new SoapAddress(attrs);
52236	}
52237	static uri(attrs) {
52238		return new connection_set_Uri(attrs);
52239	}
52240	static wsdlAddress(attrs) {
52241		return new WsdlAddress(attrs);
52242	}
52243	static wsdlConnection(attrs) {
52244		return new WsdlConnection(attrs);
52245	}
52246	static xmlConnection(attrs) {
52247		return new XmlConnection(attrs);
52248	}
52249	static xsdConnection(attrs) {
52250		return new XsdConnection(attrs);
52251	}
52252}
52253
52254;// ./src/core/xfa/datasets.js
52255
52256
52257
52258const DATASETS_NS_ID = NamespaceIds.datasets.id;
52259class datasets_Data extends XmlObject {
52260	constructor(attributes) {
52261		super(DATASETS_NS_ID, "data", attributes);
52262	}
52263	[$isNsAgnostic]() {
52264		return true;
52265	}
52266}
52267class Datasets extends XFAObject {
52268	constructor(attributes) {
52269		super(DATASETS_NS_ID, "datasets", true);
52270		this.data = null;
52271		this.Signature = null;
52272	}
52273	[$onChild](child) {
52274		const name = child[$nodeName];
52275		if (name === "data" && child[$namespaceId] === DATASETS_NS_ID || name === "Signature" && child[$namespaceId] === NamespaceIds.signature.id) {
52276			this[name] = child;
52277		}
52278		this[$appendChild](child);
52279	}
52280}
52281class DatasetsNamespace {
52282	static [$buildXFAObject](name, attributes) {
52283		if (DatasetsNamespace.hasOwnProperty(name)) {
52284			return DatasetsNamespace[name](attributes);
52285		}
52286		return undefined;
52287	}
52288	static datasets(attributes) {
52289		return new Datasets(attributes);
52290	}
52291	static data(attributes) {
52292		return new datasets_Data(attributes);
52293	}
52294}
52295
52296;// ./src/core/xfa/locale_set.js
52297
52298
52299
52300const LOCALE_SET_NS_ID = NamespaceIds.localeSet.id;
52301class CalendarSymbols extends XFAObject {
52302	constructor(attributes) {
52303		super(LOCALE_SET_NS_ID, "calendarSymbols", true);
52304		this.name = "gregorian";
52305		this.dayNames = new XFAObjectArray(2);
52306		this.eraNames = null;
52307		this.meridiemNames = null;
52308		this.monthNames = new XFAObjectArray(2);
52309	}
52310}
52311class CurrencySymbol extends StringObject {
52312	constructor(attributes) {
52313		super(LOCALE_SET_NS_ID, "currencySymbol");
52314		this.name = getStringOption(attributes.name, ["symbol", "isoname", "decimal"]);
52315	}
52316}
52317class CurrencySymbols extends XFAObject {
52318	constructor(attributes) {
52319		super(LOCALE_SET_NS_ID, "currencySymbols", true);
52320		this.currencySymbol = new XFAObjectArray(3);
52321	}
52322}
52323class DatePattern extends StringObject {
52324	constructor(attributes) {
52325		super(LOCALE_SET_NS_ID, "datePattern");
52326		this.name = getStringOption(attributes.name, ["full", "long", "med", "short"]);
52327	}
52328}
52329class DatePatterns extends XFAObject {
52330	constructor(attributes) {
52331		super(LOCALE_SET_NS_ID, "datePatterns", true);
52332		this.datePattern = new XFAObjectArray(4);
52333	}
52334}
52335class DateTimeSymbols extends ContentObject {
52336	constructor(attributes) {
52337		super(LOCALE_SET_NS_ID, "dateTimeSymbols");
52338	}
52339}
52340class Day extends StringObject {
52341	constructor(attributes) {
52342		super(LOCALE_SET_NS_ID, "day");
52343	}
52344}
52345class DayNames extends XFAObject {
52346	constructor(attributes) {
52347		super(LOCALE_SET_NS_ID, "dayNames", true);
52348		this.abbr = getInteger({
52349			data: attributes.abbr,
52350			defaultValue: 0,
52351			validate: x => x === 1
52352		});
52353		this.day = new XFAObjectArray(7);
52354	}
52355}
52356class Era extends StringObject {
52357	constructor(attributes) {
52358		super(LOCALE_SET_NS_ID, "era");
52359	}
52360}
52361class EraNames extends XFAObject {
52362	constructor(attributes) {
52363		super(LOCALE_SET_NS_ID, "eraNames", true);
52364		this.era = new XFAObjectArray(2);
52365	}
52366}
52367class locale_set_Locale extends XFAObject {
52368	constructor(attributes) {
52369		super(LOCALE_SET_NS_ID, "locale", true);
52370		this.desc = attributes.desc || "";
52371		this.name = "isoname";
52372		this.calendarSymbols = null;
52373		this.currencySymbols = null;
52374		this.datePatterns = null;
52375		this.dateTimeSymbols = null;
52376		this.numberPatterns = null;
52377		this.numberSymbols = null;
52378		this.timePatterns = null;
52379		this.typeFaces = null;
52380	}
52381}
52382class locale_set_LocaleSet extends XFAObject {
52383	constructor(attributes) {
52384		super(LOCALE_SET_NS_ID, "localeSet", true);
52385		this.locale = new XFAObjectArray();
52386	}
52387}
52388class Meridiem extends StringObject {
52389	constructor(attributes) {
52390		super(LOCALE_SET_NS_ID, "meridiem");
52391	}
52392}
52393class MeridiemNames extends XFAObject {
52394	constructor(attributes) {
52395		super(LOCALE_SET_NS_ID, "meridiemNames", true);
52396		this.meridiem = new XFAObjectArray(2);
52397	}
52398}
52399class Month extends StringObject {
52400	constructor(attributes) {
52401		super(LOCALE_SET_NS_ID, "month");
52402	}
52403}
52404class MonthNames extends XFAObject {
52405	constructor(attributes) {
52406		super(LOCALE_SET_NS_ID, "monthNames", true);
52407		this.abbr = getInteger({
52408			data: attributes.abbr,
52409			defaultValue: 0,
52410			validate: x => x === 1
52411		});
52412		this.month = new XFAObjectArray(12);
52413	}
52414}
52415class NumberPattern extends StringObject {
52416	constructor(attributes) {
52417		super(LOCALE_SET_NS_ID, "numberPattern");
52418		this.name = getStringOption(attributes.name, ["full", "long", "med", "short"]);
52419	}
52420}
52421class NumberPatterns extends XFAObject {
52422	constructor(attributes) {
52423		super(LOCALE_SET_NS_ID, "numberPatterns", true);
52424		this.numberPattern = new XFAObjectArray(4);
52425	}
52426}
52427class NumberSymbol extends StringObject {
52428	constructor(attributes) {
52429		super(LOCALE_SET_NS_ID, "numberSymbol");
52430		this.name = getStringOption(attributes.name, ["decimal", "grouping", "percent", "minus", "zero"]);
52431	}
52432}
52433class NumberSymbols extends XFAObject {
52434	constructor(attributes) {
52435		super(LOCALE_SET_NS_ID, "numberSymbols", true);
52436		this.numberSymbol = new XFAObjectArray(5);
52437	}
52438}
52439class TimePattern extends StringObject {
52440	constructor(attributes) {
52441		super(LOCALE_SET_NS_ID, "timePattern");
52442		this.name = getStringOption(attributes.name, ["full", "long", "med", "short"]);
52443	}
52444}
52445class TimePatterns extends XFAObject {
52446	constructor(attributes) {
52447		super(LOCALE_SET_NS_ID, "timePatterns", true);
52448		this.timePattern = new XFAObjectArray(4);
52449	}
52450}
52451class TypeFace extends XFAObject {
52452	constructor(attributes) {
52453		super(LOCALE_SET_NS_ID, "typeFace", true);
52454		this.name = attributes.name | "";
52455	}
52456}
52457class TypeFaces extends XFAObject {
52458	constructor(attributes) {
52459		super(LOCALE_SET_NS_ID, "typeFaces", true);
52460		this.typeFace = new XFAObjectArray();
52461	}
52462}
52463class LocaleSetNamespace {
52464	static [$buildXFAObject](name, attributes) {
52465		if (LocaleSetNamespace.hasOwnProperty(name)) {
52466			return LocaleSetNamespace[name](attributes);
52467		}
52468		return undefined;
52469	}
52470	static calendarSymbols(attrs) {
52471		return new CalendarSymbols(attrs);
52472	}
52473	static currencySymbol(attrs) {
52474		return new CurrencySymbol(attrs);
52475	}
52476	static currencySymbols(attrs) {
52477		return new CurrencySymbols(attrs);
52478	}
52479	static datePattern(attrs) {
52480		return new DatePattern(attrs);
52481	}
52482	static datePatterns(attrs) {
52483		return new DatePatterns(attrs);
52484	}
52485	static dateTimeSymbols(attrs) {
52486		return new DateTimeSymbols(attrs);
52487	}
52488	static day(attrs) {
52489		return new Day(attrs);
52490	}
52491	static dayNames(attrs) {
52492		return new DayNames(attrs);
52493	}
52494	static era(attrs) {
52495		return new Era(attrs);
52496	}
52497	static eraNames(attrs) {
52498		return new EraNames(attrs);
52499	}
52500	static locale(attrs) {
52501		return new locale_set_Locale(attrs);
52502	}
52503	static localeSet(attrs) {
52504		return new locale_set_LocaleSet(attrs);
52505	}
52506	static meridiem(attrs) {
52507		return new Meridiem(attrs);
52508	}
52509	static meridiemNames(attrs) {
52510		return new MeridiemNames(attrs);
52511	}
52512	static month(attrs) {
52513		return new Month(attrs);
52514	}
52515	static monthNames(attrs) {
52516		return new MonthNames(attrs);
52517	}
52518	static numberPattern(attrs) {
52519		return new NumberPattern(attrs);
52520	}
52521	static numberPatterns(attrs) {
52522		return new NumberPatterns(attrs);
52523	}
52524	static numberSymbol(attrs) {
52525		return new NumberSymbol(attrs);
52526	}
52527	static numberSymbols(attrs) {
52528		return new NumberSymbols(attrs);
52529	}
52530	static timePattern(attrs) {
52531		return new TimePattern(attrs);
52532	}
52533	static timePatterns(attrs) {
52534		return new TimePatterns(attrs);
52535	}
52536	static typeFace(attrs) {
52537		return new TypeFace(attrs);
52538	}
52539	static typeFaces(attrs) {
52540		return new TypeFaces(attrs);
52541	}
52542}
52543
52544;// ./src/core/xfa/signature.js
52545
52546
52547const SIGNATURE_NS_ID = NamespaceIds.signature.id;
52548class signature_Signature extends XFAObject {
52549	constructor(attributes) {
52550		super(SIGNATURE_NS_ID, "signature", true);
52551	}
52552}
52553class SignatureNamespace {
52554	static [$buildXFAObject](name, attributes) {
52555		if (SignatureNamespace.hasOwnProperty(name)) {
52556			return SignatureNamespace[name](attributes);
52557		}
52558		return undefined;
52559	}
52560	static signature(attributes) {
52561		return new signature_Signature(attributes);
52562	}
52563}
52564
52565;// ./src/core/xfa/stylesheet.js
52566
52567
52568const STYLESHEET_NS_ID = NamespaceIds.stylesheet.id;
52569class Stylesheet extends XFAObject {
52570	constructor(attributes) {
52571		super(STYLESHEET_NS_ID, "stylesheet", true);
52572	}
52573}
52574class StylesheetNamespace {
52575	static [$buildXFAObject](name, attributes) {
52576		if (StylesheetNamespace.hasOwnProperty(name)) {
52577			return StylesheetNamespace[name](attributes);
52578		}
52579		return undefined;
52580	}
52581	static stylesheet(attributes) {
52582		return new Stylesheet(attributes);
52583	}
52584}
52585
52586;// ./src/core/xfa/xdp.js
52587
52588
52589
52590const XDP_NS_ID = NamespaceIds.xdp.id;
52591class xdp_Xdp extends XFAObject {
52592	constructor(attributes) {
52593		super(XDP_NS_ID, "xdp", true);
52594		this.uuid = attributes.uuid || "";
52595		this.timeStamp = attributes.timeStamp || "";
52596		this.config = null;
52597		this.connectionSet = null;
52598		this.datasets = null;
52599		this.localeSet = null;
52600		this.stylesheet = new XFAObjectArray();
52601		this.template = null;
52602	}
52603	[$onChildCheck](child) {
52604		const ns = NamespaceIds[child[$nodeName]];
52605		return ns && child[$namespaceId] === ns.id;
52606	}
52607}
52608class XdpNamespace {
52609	static [$buildXFAObject](name, attributes) {
52610		if (XdpNamespace.hasOwnProperty(name)) {
52611			return XdpNamespace[name](attributes);
52612		}
52613		return undefined;
52614	}
52615	static xdp(attributes) {
52616		return new xdp_Xdp(attributes);
52617	}
52618}
52619
52620;// ./src/core/xfa/xhtml.js
52621
52622
52623
52624
52625
52626
52627
52628
52629
52630
52631
52632
52633
52634
52635
52636const XHTML_NS_ID = NamespaceIds.xhtml.id;
52637const $richText = Symbol();
52638const VALID_STYLES = new Set(["color", "font", "font-family", "font-size", "font-stretch", "font-style", "font-weight", "margin", "margin-bottom", "margin-left", "margin-right", "margin-top", "letter-spacing", "line-height", "orphans", "page-break-after", "page-break-before", "page-break-inside", "tab-interval", "tab-stop", "text-align", "text-decoration", "text-indent", "vertical-align", "widows", "kerning-mode", "xfa-font-horizontal-scale", "xfa-font-vertical-scale", "xfa-spacerun", "xfa-tab-stops"]);
52639const StyleMapping = new Map([["page-break-after", "breakAfter"], ["page-break-before", "breakBefore"], ["page-break-inside", "breakInside"], ["kerning-mode", value => value === "none" ? "none" : "normal"], ["xfa-font-horizontal-scale", value => `scaleX(${Math.max(0, Math.min(parseInt(value) / 100)).toFixed(2)})`], ["xfa-font-vertical-scale", value => `scaleY(${Math.max(0, Math.min(parseInt(value) / 100)).toFixed(2)})`], ["xfa-spacerun", ""], ["xfa-tab-stops", ""], ["font-size", (value, original) => {
52640	value = original.fontSize = Math.abs(getMeasurement(value));
52641	return measureToString(0.99 * value);
52642}], ["letter-spacing", value => measureToString(getMeasurement(value))], ["line-height", value => measureToString(getMeasurement(value))], ["margin", value => measureToString(getMeasurement(value))], ["margin-bottom", value => measureToString(getMeasurement(value))], ["margin-left", value => measureToString(getMeasurement(value))], ["margin-right", value => measureToString(getMeasurement(value))], ["margin-top", value => measureToString(getMeasurement(value))], ["text-indent", value => measureToString(getMeasurement(value))], ["font-family", value => value], ["vertical-align", value => measureToString(getMeasurement(value))]]);
52643const spacesRegExp = /\s+/g;
52644const crlfRegExp = /[\r\n]+/g;
52645const crlfForRichTextRegExp = /\r\n?/g;
52646function mapStyle(styleStr, node, richText) {
52647	const style = Object.create(null);
52648	if (!styleStr) {
52649		return style;
52650	}
52651	const original = Object.create(null);
52652	for (const [key, value] of styleStr.split(";").map(s => s.split(":", 2))) {
52653		const mapping = StyleMapping.get(key);
52654		if (mapping === "") {
52655			continue;
52656		}
52657		let newValue = value;
52658		if (mapping) {
52659			newValue = typeof mapping === "string" ? mapping : mapping(value, original);
52660		}
52661		if (key.endsWith("scale")) {
52662			style.transform = style.transform ? `${style[key]} ${newValue}` : newValue;
52663		} else {
52664			style[key.replaceAll(/-([a-zA-Z])/g, (_, x) => x.toUpperCase())] = newValue;
52665		}
52666	}
52667	if (style.fontFamily) {
52668		setFontFamily({
52669			typeface: style.fontFamily,
52670			weight: style.fontWeight || "normal",
52671			posture: style.fontStyle || "normal",
52672			size: original.fontSize || 0
52673		}, node, node[$globalData].fontFinder, style);
52674	}
52675	if (richText && style.verticalAlign && style.verticalAlign !== "0px" && style.fontSize) {
52676		const SUB_SUPER_SCRIPT_FACTOR = 0.583;
52677		const VERTICAL_FACTOR = 0.333;
52678		const fontSize = getMeasurement(style.fontSize);
52679		style.fontSize = measureToString(fontSize * SUB_SUPER_SCRIPT_FACTOR);
52680		style.verticalAlign = measureToString(Math.sign(getMeasurement(style.verticalAlign)) * fontSize * VERTICAL_FACTOR);
52681	}
52682	if (richText && style.fontSize) {
52683		style.fontSize = `calc(${style.fontSize} * var(--scale-factor))`;
52684	}
52685	fixTextIndent(style);
52686	return style;
52687}
52688function checkStyle(node) {
52689	if (!node.style) {
52690		return "";
52691	}
52692	return node.style.trim().split(/\s*;\s*/).filter(s => !!s).map(s => s.split(/\s*:\s*/, 2)).filter(([key, value]) => {
52693		if (key === "font-family") {
52694			node[$globalData].usedTypefaces.add(value);
52695		}
52696		return VALID_STYLES.has(key);
52697	}).map(kv => kv.join(":")).join(";");
52698}
52699const NoWhites = new Set(["body", "html"]);
52700class XhtmlObject extends XmlObject {
52701	constructor(attributes, name) {
52702		super(XHTML_NS_ID, name);
52703		this[$richText] = false;
52704		this.style = attributes.style || "";
52705	}
52706	[$clean](builder) {
52707		super[$clean](builder);
52708		this.style = checkStyle(this);
52709	}
52710	[$acceptWhitespace]() {
52711		return !NoWhites.has(this[$nodeName]);
52712	}
52713	[$onText](str, richText = false) {
52714		if (!richText) {
52715			str = str.replaceAll(crlfRegExp, "");
52716			if (!this.style.includes("xfa-spacerun:yes")) {
52717				str = str.replaceAll(spacesRegExp, " ");
52718			}
52719		} else {
52720			this[$richText] = true;
52721		}
52722		if (str) {
52723			this[$content] += str;
52724		}
52725	}
52726	[$pushGlyphs](measure, mustPop = true) {
52727		const xfaFont = Object.create(null);
52728		const margin = {
52729			top: NaN,
52730			bottom: NaN,
52731			left: NaN,
52732			right: NaN
52733		};
52734		let lineHeight = null;
52735		for (const [key, value] of this.style.split(";").map(s => s.split(":", 2))) {
52736			switch (key) {
52737				case "font-family":
52738					xfaFont.typeface = stripQuotes(value);
52739					break;
52740				case "font-size":
52741					xfaFont.size = getMeasurement(value);
52742					break;
52743				case "font-weight":
52744					xfaFont.weight = value;
52745					break;
52746				case "font-style":
52747					xfaFont.posture = value;
52748					break;
52749				case "letter-spacing":
52750					xfaFont.letterSpacing = getMeasurement(value);
52751					break;
52752				case "margin":
52753					const values = value.split(/ \t/).map(x => getMeasurement(x));
52754					switch (values.length) {
52755						case 1:
52756							margin.top = margin.bottom = margin.left = margin.right = values[0];
52757							break;
52758						case 2:
52759							margin.top = margin.bottom = values[0];
52760							margin.left = margin.right = values[1];
52761							break;
52762						case 3:
52763							margin.top = values[0];
52764							margin.bottom = values[2];
52765							margin.left = margin.right = values[1];
52766							break;
52767						case 4:
52768							margin.top = values[0];
52769							margin.left = values[1];
52770							margin.bottom = values[2];
52771							margin.right = values[3];
52772							break;
52773					}
52774					break;
52775				case "margin-top":
52776					margin.top = getMeasurement(value);
52777					break;
52778				case "margin-bottom":
52779					margin.bottom = getMeasurement(value);
52780					break;
52781				case "margin-left":
52782					margin.left = getMeasurement(value);
52783					break;
52784				case "margin-right":
52785					margin.right = getMeasurement(value);
52786					break;
52787				case "line-height":
52788					lineHeight = getMeasurement(value);
52789					break;
52790			}
52791		}
52792		measure.pushData(xfaFont, margin, lineHeight);
52793		if (this[$content]) {
52794			measure.addString(this[$content]);
52795		} else {
52796			for (const child of this[$getChildren]()) {
52797				if (child[$nodeName] === "#text") {
52798					measure.addString(child[$content]);
52799					continue;
52800				}
52801				child[$pushGlyphs](measure);
52802			}
52803		}
52804		if (mustPop) {
52805			measure.popFont();
52806		}
52807	}
52808	[$toHTML](availableSpace) {
52809		const children = [];
52810		this[$extra] = {
52811			children
52812		};
52813		this[$childrenToHTML]({});
52814		if (children.length === 0 && !this[$content]) {
52815			return HTMLResult.EMPTY;
52816		}
52817		let value;
52818		if (this[$richText]) {
52819			value = this[$content] ? this[$content].replaceAll(crlfForRichTextRegExp, "\n") : undefined;
52820		} else {
52821			value = this[$content] || undefined;
52822		}
52823		return HTMLResult.success({
52824			name: this[$nodeName],
52825			attributes: {
52826				href: this.href,
52827				style: mapStyle(this.style, this, this[$richText])
52828			},
52829			children,
52830			value
52831		});
52832	}
52833}
52834class A extends XhtmlObject {
52835	constructor(attributes) {
52836		super(attributes, "a");
52837		this.href = fixURL(attributes.href) || "";
52838	}
52839}
52840class B extends XhtmlObject {
52841	constructor(attributes) {
52842		super(attributes, "b");
52843	}
52844	[$pushGlyphs](measure) {
52845		measure.pushFont({
52846			weight: "bold"
52847		});
52848		super[$pushGlyphs](measure);
52849		measure.popFont();
52850	}
52851}
52852class Body extends XhtmlObject {
52853	constructor(attributes) {
52854		super(attributes, "body");
52855	}
52856	[$toHTML](availableSpace) {
52857		const res = super[$toHTML](availableSpace);
52858		const {
52859			html
52860		} = res;
52861		if (!html) {
52862			return HTMLResult.EMPTY;
52863		}
52864		html.name = "div";
52865		html.attributes.class = ["xfaRich"];
52866		return res;
52867	}
52868}
52869class Br extends XhtmlObject {
52870	constructor(attributes) {
52871		super(attributes, "br");
52872	}
52873	[$text]() {
52874		return "\n";
52875	}
52876	[$pushGlyphs](measure) {
52877		measure.addString("\n");
52878	}
52879	[$toHTML](availableSpace) {
52880		return HTMLResult.success({
52881			name: "br"
52882		});
52883	}
52884}
52885class Html extends XhtmlObject {
52886	constructor(attributes) {
52887		super(attributes, "html");
52888	}
52889	[$toHTML](availableSpace) {
52890		const children = [];
52891		this[$extra] = {
52892			children
52893		};
52894		this[$childrenToHTML]({});
52895		if (children.length === 0) {
52896			return HTMLResult.success({
52897				name: "div",
52898				attributes: {
52899					class: ["xfaRich"],
52900					style: {}
52901				},
52902				value: this[$content] || ""
52903			});
52904		}
52905		if (children.length === 1) {
52906			const child = children[0];
52907			if (child.attributes?.class.includes("xfaRich")) {
52908				return HTMLResult.success(child);
52909			}
52910		}
52911		return HTMLResult.success({
52912			name: "div",
52913			attributes: {
52914				class: ["xfaRich"],
52915				style: {}
52916			},
52917			children
52918		});
52919	}
52920}
52921class I extends XhtmlObject {
52922	constructor(attributes) {
52923		super(attributes, "i");
52924	}
52925	[$pushGlyphs](measure) {
52926		measure.pushFont({
52927			posture: "italic"
52928		});
52929		super[$pushGlyphs](measure);
52930		measure.popFont();
52931	}
52932}
52933class Li extends XhtmlObject {
52934	constructor(attributes) {
52935		super(attributes, "li");
52936	}
52937}
52938class Ol extends XhtmlObject {
52939	constructor(attributes) {
52940		super(attributes, "ol");
52941	}
52942}
52943class P extends XhtmlObject {
52944	constructor(attributes) {
52945		super(attributes, "p");
52946	}
52947	[$pushGlyphs](measure) {
52948		super[$pushGlyphs](measure, false);
52949		measure.addString("\n");
52950		measure.addPara();
52951		measure.popFont();
52952	}
52953	[$text]() {
52954		const siblings = this[$getParent]()[$getChildren]();
52955		if (siblings.at(-1) === this) {
52956			return super[$text]();
52957		}
52958		return super[$text]() + "\n";
52959	}
52960}
52961class Span extends XhtmlObject {
52962	constructor(attributes) {
52963		super(attributes, "span");
52964	}
52965}
52966class Sub extends XhtmlObject {
52967	constructor(attributes) {
52968		super(attributes, "sub");
52969	}
52970}
52971class Sup extends XhtmlObject {
52972	constructor(attributes) {
52973		super(attributes, "sup");
52974	}
52975}
52976class Ul extends XhtmlObject {
52977	constructor(attributes) {
52978		super(attributes, "ul");
52979	}
52980}
52981class XhtmlNamespace {
52982	static [$buildXFAObject](name, attributes) {
52983		if (XhtmlNamespace.hasOwnProperty(name)) {
52984			return XhtmlNamespace[name](attributes);
52985		}
52986		return undefined;
52987	}
52988	static a(attributes) {
52989		return new A(attributes);
52990	}
52991	static b(attributes) {
52992		return new B(attributes);
52993	}
52994	static body(attributes) {
52995		return new Body(attributes);
52996	}
52997	static br(attributes) {
52998		return new Br(attributes);
52999	}
53000	static html(attributes) {
53001		return new Html(attributes);
53002	}
53003	static i(attributes) {
53004		return new I(attributes);
53005	}
53006	static li(attributes) {
53007		return new Li(attributes);
53008	}
53009	static ol(attributes) {
53010		return new Ol(attributes);
53011	}
53012	static p(attributes) {
53013		return new P(attributes);
53014	}
53015	static span(attributes) {
53016		return new Span(attributes);
53017	}
53018	static sub(attributes) {
53019		return new Sub(attributes);
53020	}
53021	static sup(attributes) {
53022		return new Sup(attributes);
53023	}
53024	static ul(attributes) {
53025		return new Ul(attributes);
53026	}
53027}
53028
53029;// ./src/core/xfa/setup.js
53030
53031
53032
53033
53034
53035
53036
53037
53038
53039const NamespaceSetUp = {
53040	config: ConfigNamespace,
53041	connection: ConnectionSetNamespace,
53042	datasets: DatasetsNamespace,
53043	localeSet: LocaleSetNamespace,
53044	signature: SignatureNamespace,
53045	stylesheet: StylesheetNamespace,
53046	template: TemplateNamespace,
53047	xdp: XdpNamespace,
53048	xhtml: XhtmlNamespace
53049};
53050
53051;// ./src/core/xfa/unknown.js
53052
53053
53054class UnknownNamespace {
53055	constructor(nsId) {
53056		this.namespaceId = nsId;
53057	}
53058	[$buildXFAObject](name, attributes) {
53059		return new XmlObject(this.namespaceId, name, attributes);
53060	}
53061}
53062
53063;// ./src/core/xfa/builder.js
53064
53065
53066
53067
53068
53069
53070
53071
53072
53073
53074
53075class Root extends XFAObject {
53076	constructor(ids) {
53077		super(-1, "root", Object.create(null));
53078		this.element = null;
53079		this[$ids] = ids;
53080	}
53081	[$onChild](child) {
53082		this.element = child;
53083		return true;
53084	}
53085	[$finalize]() {
53086		super[$finalize]();
53087		if (this.element.template instanceof Template) {
53088			this[$ids].set($root, this.element);
53089			this.element.template[$resolvePrototypes](this[$ids]);
53090			this.element.template[$ids] = this[$ids];
53091		}
53092	}
53093}
53094class Empty extends XFAObject {
53095	constructor() {
53096		super(-1, "", Object.create(null));
53097	}
53098	[$onChild](_) {
53099		return false;
53100	}
53101}
53102class Builder {
53103	constructor(rootNameSpace = null) {
53104		this._namespaceStack = [];
53105		this._nsAgnosticLevel = 0;
53106		this._namespacePrefixes = new Map();
53107		this._namespaces = new Map();
53108		this._nextNsId = Math.max(...Object.values(NamespaceIds).map(({
53109			id
53110		}) => id));
53111		this._currentNamespace = rootNameSpace || new UnknownNamespace(++this._nextNsId);
53112	}
53113	buildRoot(ids) {
53114		return new Root(ids);
53115	}
53116	build({
53117		nsPrefix,
53118		name,
53119		attributes,
53120		namespace,
53121		prefixes
53122	}) {
53123		const hasNamespaceDef = namespace !== null;
53124		if (hasNamespaceDef) {
53125			this._namespaceStack.push(this._currentNamespace);
53126			this._currentNamespace = this._searchNamespace(namespace);
53127		}
53128		if (prefixes) {
53129			this._addNamespacePrefix(prefixes);
53130		}
53131		if (attributes.hasOwnProperty($nsAttributes)) {
53132			const dataTemplate = NamespaceSetUp.datasets;
53133			const nsAttrs = attributes[$nsAttributes];
53134			let xfaAttrs = null;
53135			for (const [ns, attrs] of Object.entries(nsAttrs)) {
53136				const nsToUse = this._getNamespaceToUse(ns);
53137				if (nsToUse === dataTemplate) {
53138					xfaAttrs = {
53139						xfa: attrs
53140					};
53141					break;
53142				}
53143			}
53144			if (xfaAttrs) {
53145				attributes[$nsAttributes] = xfaAttrs;
53146			} else {
53147				delete attributes[$nsAttributes];
53148			}
53149		}
53150		const namespaceToUse = this._getNamespaceToUse(nsPrefix);
53151		const node = namespaceToUse?.[$buildXFAObject](name, attributes) || new Empty();
53152		if (node[$isNsAgnostic]()) {
53153			this._nsAgnosticLevel++;
53154		}
53155		if (hasNamespaceDef || prefixes || node[$isNsAgnostic]()) {
53156			node[$cleanup] = {
53157				hasNamespace: hasNamespaceDef,
53158				prefixes,
53159				nsAgnostic: node[$isNsAgnostic]()
53160			};
53161		}
53162		return node;
53163	}
53164	isNsAgnostic() {
53165		return this._nsAgnosticLevel > 0;
53166	}
53167	_searchNamespace(nsName) {
53168		let ns = this._namespaces.get(nsName);
53169		if (ns) {
53170			return ns;
53171		}
53172		for (const [name, {
53173			check
53174		}] of Object.entries(NamespaceIds)) {
53175			if (check(nsName)) {
53176				ns = NamespaceSetUp[name];
53177				if (ns) {
53178					this._namespaces.set(nsName, ns);
53179					return ns;
53180				}
53181				break;
53182			}
53183		}
53184		ns = new UnknownNamespace(++this._nextNsId);
53185		this._namespaces.set(nsName, ns);
53186		return ns;
53187	}
53188	_addNamespacePrefix(prefixes) {
53189		for (const {
53190			prefix,
53191			value
53192		} of prefixes) {
53193			const namespace = this._searchNamespace(value);
53194			let prefixStack = this._namespacePrefixes.get(prefix);
53195			if (!prefixStack) {
53196				prefixStack = [];
53197				this._namespacePrefixes.set(prefix, prefixStack);
53198			}
53199			prefixStack.push(namespace);
53200		}
53201	}
53202	_getNamespaceToUse(prefix) {
53203		if (!prefix) {
53204			return this._currentNamespace;
53205		}
53206		const prefixStack = this._namespacePrefixes.get(prefix);
53207		if (prefixStack?.length > 0) {
53208			return prefixStack.at(-1);
53209		}
53210		warn(`Unknown namespace prefix: ${prefix}.`);
53211		return null;
53212	}
53213	clean(data) {
53214		const {
53215			hasNamespace,
53216			prefixes,
53217			nsAgnostic
53218		} = data;
53219		if (hasNamespace) {
53220			this._currentNamespace = this._namespaceStack.pop();
53221		}
53222		if (prefixes) {
53223			prefixes.forEach(({
53224				prefix
53225			}) => {
53226				this._namespacePrefixes.get(prefix).pop();
53227			});
53228		}
53229		if (nsAgnostic) {
53230			this._nsAgnosticLevel--;
53231		}
53232	}
53233}
53234
53235;// ./src/core/xfa/parser.js
53236
53237
53238
53239
53240
53241
53242
53243
53244
53245
53246
53247
53248class XFAParser extends XMLParserBase {
53249	constructor(rootNameSpace = null, richText = false) {
53250		super();
53251		this._builder = new Builder(rootNameSpace);
53252		this._stack = [];
53253		this._globalData = {
53254			usedTypefaces: new Set()
53255		};
53256		this._ids = new Map();
53257		this._current = this._builder.buildRoot(this._ids);
53258		this._errorCode = XMLParserErrorCode.NoError;
53259		this._whiteRegex = /^\s+$/;
53260		this._nbsps = /\xa0+/g;
53261		this._richText = richText;
53262	}
53263	parse(data) {
53264		this.parseXml(data);
53265		if (this._errorCode !== XMLParserErrorCode.NoError) {
53266			return undefined;
53267		}
53268		this._current[$finalize]();
53269		return this._current.element;
53270	}
53271	onText(text) {
53272		text = text.replace(this._nbsps, match => match.slice(1) + " ");
53273		if (this._richText || this._current[$acceptWhitespace]()) {
53274			this._current[$onText](text, this._richText);
53275			return;
53276		}
53277		if (this._whiteRegex.test(text)) {
53278			return;
53279		}
53280		this._current[$onText](text.trim());
53281	}
53282	onCdata(text) {
53283		this._current[$onText](text);
53284	}
53285	_mkAttributes(attributes, tagName) {
53286		let namespace = null;
53287		let prefixes = null;
53288		const attributeObj = Object.create({});
53289		for (const {
53290			name,
53291			value
53292		} of attributes) {
53293			if (name === "xmlns") {
53294				if (!namespace) {
53295					namespace = value;
53296				} else {
53297					warn(`XFA - multiple namespace definition in <${tagName}>`);
53298				}
53299			} else if (name.startsWith("xmlns:")) {
53300				const prefix = name.substring("xmlns:".length);
53301				if (!prefixes) {
53302					prefixes = [];
53303				}
53304				prefixes.push({
53305					prefix,
53306					value
53307				});
53308			} else {
53309				const i = name.indexOf(":");
53310				if (i === -1) {
53311					attributeObj[name] = value;
53312				} else {
53313					let nsAttrs = attributeObj[$nsAttributes];
53314					if (!nsAttrs) {
53315						nsAttrs = attributeObj[$nsAttributes] = Object.create(null);
53316					}
53317					const [ns, attrName] = [name.slice(0, i), name.slice(i + 1)];
53318					const attrs = nsAttrs[ns] ||= Object.create(null);
53319					attrs[attrName] = value;
53320				}
53321			}
53322		}
53323		return [namespace, prefixes, attributeObj];
53324	}
53325	_getNameAndPrefix(name, nsAgnostic) {
53326		const i = name.indexOf(":");
53327		if (i === -1) {
53328			return [name, null];
53329		}
53330		return [name.substring(i + 1), nsAgnostic ? "" : name.substring(0, i)];
53331	}
53332	onBeginElement(tagName, attributes, isEmpty) {
53333		const [namespace, prefixes, attributesObj] = this._mkAttributes(attributes, tagName);
53334		const [name, nsPrefix] = this._getNameAndPrefix(tagName, this._builder.isNsAgnostic());
53335		const node = this._builder.build({
53336			nsPrefix,
53337			name,
53338			attributes: attributesObj,
53339			namespace,
53340			prefixes
53341		});
53342		node[$globalData] = this._globalData;
53343		if (isEmpty) {
53344			node[$finalize]();
53345			if (this._current[$onChild](node)) {
53346				node[$setId](this._ids);
53347			}
53348			node[$clean](this._builder);
53349			return;
53350		}
53351		this._stack.push(this._current);
53352		this._current = node;
53353	}
53354	onEndElement(name) {
53355		const node = this._current;
53356		if (node[$isCDATAXml]() && typeof node[$content] === "string") {
53357			const parser = new XFAParser();
53358			parser._globalData = this._globalData;
53359			const root = parser.parse(node[$content]);
53360			node[$content] = null;
53361			node[$onChild](root);
53362		}
53363		node[$finalize]();
53364		this._current = this._stack.pop();
53365		if (this._current[$onChild](node)) {
53366			node[$setId](this._ids);
53367		}
53368		node[$clean](this._builder);
53369	}
53370	onError(code) {
53371		this._errorCode = code;
53372	}
53373}
53374
53375;// ./src/core/xfa/factory.js
53376
53377
53378
53379
53380
53381
53382
53383
53384
53385
53386
53387
53388
53389class XFAFactory {
53390	constructor(data) {
53391		try {
53392			this.root = new XFAParser().parse(XFAFactory._createDocument(data));
53393			const binder = new Binder(this.root);
53394			this.form = binder.bind();
53395			this.dataHandler = new DataHandler(this.root, binder.getData());
53396			this.form[$globalData].template = this.form;
53397		} catch (e) {
53398			warn(`XFA - an error occurred during parsing and binding: ${e}`);
53399		}
53400	}
53401	isValid() {
53402		return this.root && this.form;
53403	}
53404	_createPagesHelper() {
53405		const iterator = this.form[$toPages]();
53406		return new Promise((resolve, reject) => {
53407			const nextIteration = () => {
53408				try {
53409					const value = iterator.next();
53410					if (value.done) {
53411						resolve(value.value);
53412					} else {
53413						setTimeout(nextIteration, 0);
53414					}
53415				} catch (e) {
53416					reject(e);
53417				}
53418			};
53419			setTimeout(nextIteration, 0);
53420		});
53421	}
53422	async _createPages() {
53423		try {
53424			this.pages = await this._createPagesHelper();
53425			this.dims = this.pages.children.map(c => {
53426				const {
53427					width,
53428					height
53429				} = c.attributes.style;
53430				return [0, 0, parseInt(width), parseInt(height)];
53431			});
53432		} catch (e) {
53433			warn(`XFA - an error occurred during layout: ${e}`);
53434		}
53435	}
53436	getBoundingBox(pageIndex) {
53437		return this.dims[pageIndex];
53438	}
53439	async getNumPages() {
53440		if (!this.pages) {
53441			await this._createPages();
53442		}
53443		return this.dims.length;
53444	}
53445	setImages(images) {
53446		this.form[$globalData].images = images;
53447	}
53448	setFonts(fonts) {
53449		this.form[$globalData].fontFinder = new FontFinder(fonts);
53450		const missingFonts = [];
53451		for (let typeface of this.form[$globalData].usedTypefaces) {
53452			typeface = stripQuotes(typeface);
53453			const font = this.form[$globalData].fontFinder.find(typeface);
53454			if (!font) {
53455				missingFonts.push(typeface);
53456			}
53457		}
53458		if (missingFonts.length > 0) {
53459			return missingFonts;
53460		}
53461		return null;
53462	}
53463	appendFonts(fonts, reallyMissingFonts) {
53464		this.form[$globalData].fontFinder.add(fonts, reallyMissingFonts);
53465	}
53466	async getPages() {
53467		if (!this.pages) {
53468			await this._createPages();
53469		}
53470		const pages = this.pages;
53471		this.pages = null;
53472		return pages;
53473	}
53474	serializeData(storage) {
53475		return this.dataHandler.serialize(storage);
53476	}
53477	static _createDocument(data) {
53478		if (!data["/xdp:xdp"]) {
53479			return data["xdp:xdp"];
53480		}
53481		return Object.values(data).join("");
53482	}
53483	static getRichTextAsHtml(rc) {
53484		if (!rc || typeof rc !== "string") {
53485			return null;
53486		}
53487		try {
53488			let root = new XFAParser(XhtmlNamespace, true).parse(rc);
53489			if (!["body", "xhtml"].includes(root[$nodeName])) {
53490				const newRoot = XhtmlNamespace.body({});
53491				newRoot[$appendChild](root);
53492				root = newRoot;
53493			}
53494			const result = root[$toHTML]();
53495			if (!result.success) {
53496				return null;
53497			}
53498			const {
53499				html
53500			} = result;
53501			const {
53502				attributes
53503			} = html;
53504			if (attributes) {
53505				if (attributes.class) {
53506					attributes.class = attributes.class.filter(attr => !attr.startsWith("xfa"));
53507				}
53508				attributes.dir = "auto";
53509			}
53510			return {
53511				html,
53512				str: root[$text]()
53513			};
53514		} catch (e) {
53515			warn(`XFA - an error occurred during parsing of rich text: ${e}`);
53516		}
53517		return null;
53518	}
53519}
53520
53521;// ./src/core/annotation.js
53522
53523
53524
53525
53526
53527
53528
53529
53530
53531
53532
53533
53534
53535
53536
53537
53538
53539
53540
53541
53542
53543
53544
53545
53546
53547
53548
53549
53550class AnnotationFactory {
53551	static createGlobals(pdfManager) {
53552		return Promise.all([pdfManager.ensureCatalog("acroForm"), pdfManager.ensureDoc("xfaDatasets"), pdfManager.ensureCatalog("structTreeRoot"), pdfManager.ensureCatalog("baseUrl"), pdfManager.ensureCatalog("attachments")]).then(([acroForm, xfaDatasets, structTreeRoot, baseUrl, attachments]) => {
53553			return {
53554				pdfManager,
53555				acroForm: acroForm instanceof Dict ? acroForm : Dict.empty,
53556				xfaDatasets,
53557				structTreeRoot,
53558				baseUrl,
53559				attachments
53560			};
53561		}, reason => {
53562			warn(`createGlobals: "${reason}".`);
53563			return null;
53564		});
53565	}
53566	static async create(xref, ref, annotationGlobals, idFactory, collectFields, orphanFields, pageRef) {
53567		const pageIndex = collectFields ? await this._getPageIndex(xref, ref, annotationGlobals.pdfManager) : null;
53568		return annotationGlobals.pdfManager.ensure(this, "_create", [xref, ref, annotationGlobals, idFactory, collectFields, orphanFields, pageIndex, pageRef]);
53569	}
53570	static _create(xref, ref, annotationGlobals, idFactory, collectFields = false, orphanFields = null, pageIndex = null, pageRef = null) {
53571		const dict = xref.fetchIfRef(ref);
53572		if (!(dict instanceof Dict)) {
53573			return undefined;
53574		}
53575		const {
53576			acroForm,
53577			pdfManager
53578		} = annotationGlobals;
53579		const id = ref instanceof Ref ? ref.toString() : `annot_${idFactory.createObjId()}`;
53580		let subtype = dict.get("Subtype");
53581		subtype = subtype instanceof Name ? subtype.name : null;
53582		const parameters = {
53583			xref,
53584			ref,
53585			dict,
53586			subtype,
53587			id,
53588			annotationGlobals,
53589			collectFields,
53590			orphanFields,
53591			needAppearances: !collectFields && acroForm.get("NeedAppearances") === true,
53592			pageIndex,
53593			evaluatorOptions: pdfManager.evaluatorOptions,
53594			pageRef
53595		};
53596		switch (subtype) {
53597			case "Link":
53598				return new LinkAnnotation(parameters);
53599			case "Text":
53600				return new TextAnnotation(parameters);
53601			case "Widget":
53602				let fieldType = getInheritableProperty({
53603					dict,
53604					key: "FT"
53605				});
53606				fieldType = fieldType instanceof Name ? fieldType.name : null;
53607				switch (fieldType) {
53608					case "Tx":
53609						return new TextWidgetAnnotation(parameters);
53610					case "Btn":
53611						return new ButtonWidgetAnnotation(parameters);
53612					case "Ch":
53613						return new ChoiceWidgetAnnotation(parameters);
53614					case "Sig":
53615						return new SignatureWidgetAnnotation(parameters);
53616				}
53617				warn(`Unimplemented widget field type "${fieldType}", ` + "falling back to base field type.");
53618				return new WidgetAnnotation(parameters);
53619			case "Popup":
53620				return new PopupAnnotation(parameters);
53621			case "FreeText":
53622				return new FreeTextAnnotation(parameters);
53623			case "Line":
53624				return new LineAnnotation(parameters);
53625			case "Square":
53626				return new SquareAnnotation(parameters);
53627			case "Circle":
53628				return new CircleAnnotation(parameters);
53629			case "PolyLine":
53630				return new PolylineAnnotation(parameters);
53631			case "Polygon":
53632				return new PolygonAnnotation(parameters);
53633			case "Caret":
53634				return new CaretAnnotation(parameters);
53635			case "Ink":
53636				return new InkAnnotation(parameters);
53637			case "Highlight":
53638				return new HighlightAnnotation(parameters);
53639			case "Underline":
53640				return new UnderlineAnnotation(parameters);
53641			case "Squiggly":
53642				return new SquigglyAnnotation(parameters);
53643			case "StrikeOut":
53644				return new StrikeOutAnnotation(parameters);
53645			case "Stamp":
53646				return new StampAnnotation(parameters);
53647			case "FileAttachment":
53648				return new FileAttachmentAnnotation(parameters);
53649			default:
53650				if (!collectFields) {
53651					if (!subtype) {
53652						warn("Annotation is missing the required /Subtype.");
53653					} else {
53654						warn(`Unimplemented annotation type "${subtype}", ` + "falling back to base annotation.");
53655					}
53656				}
53657				return new Annotation(parameters);
53658		}
53659	}
53660	static async _getPageIndex(xref, ref, pdfManager) {
53661		try {
53662			const annotDict = await xref.fetchIfRefAsync(ref);
53663			if (!(annotDict instanceof Dict)) {
53664				return -1;
53665			}
53666			const pageRef = annotDict.getRaw("P");
53667			if (pageRef instanceof Ref) {
53668				try {
53669					const pageIndex = await pdfManager.ensureCatalog("getPageIndex", [pageRef]);
53670					return pageIndex;
53671				} catch (ex) {
53672					info(`_getPageIndex -- not a valid page reference: "${ex}".`);
53673				}
53674			}
53675			if (annotDict.has("Kids")) {
53676				return -1;
53677			}
53678			const numPages = await pdfManager.ensureDoc("numPages");
53679			for (let pageIndex = 0; pageIndex < numPages; pageIndex++) {
53680				const page = await pdfManager.getPage(pageIndex);
53681				const annotations = await pdfManager.ensure(page, "annotations");
53682				for (const annotRef of annotations) {
53683					if (annotRef instanceof Ref && isRefsEqual(annotRef, ref)) {
53684						return pageIndex;
53685					}
53686				}
53687			}
53688		} catch (ex) {
53689			warn(`_getPageIndex: "${ex}".`);
53690		}
53691		return -1;
53692	}
53693	static generateImages(annotations, xref, isOffscreenCanvasSupported) {
53694		if (!isOffscreenCanvasSupported) {
53695			warn("generateImages: OffscreenCanvas is not supported, cannot save or print some annotations with images.");
53696			return null;
53697		}
53698		let imagePromises;
53699		for (const {
53700			bitmapId,
53701			bitmap
53702		} of annotations) {
53703			if (!bitmap) {
53704				continue;
53705			}
53706			imagePromises ||= new Map();
53707			imagePromises.set(bitmapId, StampAnnotation.createImage(bitmap, xref));
53708		}
53709		return imagePromises;
53710	}
53711	static async saveNewAnnotations(evaluator, task, annotations, imagePromises, changes) {
53712		const xref = evaluator.xref;
53713		let baseFontRef;
53714		const promises = [];
53715		const {
53716			isOffscreenCanvasSupported
53717		} = evaluator.options;
53718		for (const annotation of annotations) {
53719			if (annotation.deleted) {
53720				continue;
53721			}
53722			switch (annotation.annotationType) {
53723				case AnnotationEditorType.FREETEXT:
53724					if (!baseFontRef) {
53725						const baseFont = new Dict(xref);
53726						baseFont.set("BaseFont", Name.get("Helvetica"));
53727						baseFont.set("Type", Name.get("Font"));
53728						baseFont.set("Subtype", Name.get("Type1"));
53729						baseFont.set("Encoding", Name.get("WinAnsiEncoding"));
53730						baseFontRef = xref.getNewTemporaryRef();
53731						changes.put(baseFontRef, {
53732							data: baseFont
53733						});
53734					}
53735					promises.push(FreeTextAnnotation.createNewAnnotation(xref, annotation, changes, {
53736						evaluator,
53737						task,
53738						baseFontRef
53739					}));
53740					break;
53741				case AnnotationEditorType.HIGHLIGHT:
53742					if (annotation.quadPoints) {
53743						promises.push(HighlightAnnotation.createNewAnnotation(xref, annotation, changes));
53744					} else {
53745						promises.push(InkAnnotation.createNewAnnotation(xref, annotation, changes));
53746					}
53747					break;
53748				case AnnotationEditorType.INK:
53749					promises.push(InkAnnotation.createNewAnnotation(xref, annotation, changes));
53750					break;
53751				case AnnotationEditorType.STAMP:
53752					const image = isOffscreenCanvasSupported ? await imagePromises?.get(annotation.bitmapId) : null;
53753					if (image?.imageStream) {
53754						const {
53755							imageStream,
53756							smaskStream
53757						} = image;
53758						if (smaskStream) {
53759							const smaskRef = xref.getNewTemporaryRef();
53760							changes.put(smaskRef, {
53761								data: smaskStream
53762							});
53763							imageStream.dict.set("SMask", smaskRef);
53764						}
53765						const imageRef = image.imageRef = xref.getNewTemporaryRef();
53766						changes.put(imageRef, {
53767							data: imageStream
53768						});
53769						image.imageStream = image.smaskStream = null;
53770					}
53771					promises.push(StampAnnotation.createNewAnnotation(xref, annotation, changes, {
53772						image
53773					}));
53774					break;
53775			}
53776		}
53777		return {
53778			annotations: await Promise.all(promises)
53779		};
53780	}
53781	static async printNewAnnotations(annotationGlobals, evaluator, task, annotations, imagePromises) {
53782		if (!annotations) {
53783			return null;
53784		}
53785		const {
53786			options,
53787			xref
53788		} = evaluator;
53789		const promises = [];
53790		for (const annotation of annotations) {
53791			if (annotation.deleted) {
53792				continue;
53793			}
53794			switch (annotation.annotationType) {
53795				case AnnotationEditorType.FREETEXT:
53796					promises.push(FreeTextAnnotation.createNewPrintAnnotation(annotationGlobals, xref, annotation, {
53797						evaluator,
53798						task,
53799						evaluatorOptions: options
53800					}));
53801					break;
53802				case AnnotationEditorType.HIGHLIGHT:
53803					if (annotation.quadPoints) {
53804						promises.push(HighlightAnnotation.createNewPrintAnnotation(annotationGlobals, xref, annotation, {
53805							evaluatorOptions: options
53806						}));
53807					} else {
53808						promises.push(InkAnnotation.createNewPrintAnnotation(annotationGlobals, xref, annotation, {
53809							evaluatorOptions: options
53810						}));
53811					}
53812					break;
53813				case AnnotationEditorType.INK:
53814					promises.push(InkAnnotation.createNewPrintAnnotation(annotationGlobals, xref, annotation, {
53815						evaluatorOptions: options
53816					}));
53817					break;
53818				case AnnotationEditorType.STAMP:
53819					const image = options.isOffscreenCanvasSupported ? await imagePromises?.get(annotation.bitmapId) : null;
53820					if (image?.imageStream) {
53821						const {
53822							imageStream,
53823							smaskStream
53824						} = image;
53825						if (smaskStream) {
53826							imageStream.dict.set("SMask", smaskStream);
53827						}
53828						image.imageRef = new JpegStream(imageStream, imageStream.length);
53829						image.imageStream = image.smaskStream = null;
53830					}
53831					promises.push(StampAnnotation.createNewPrintAnnotation(annotationGlobals, xref, annotation, {
53832						image,
53833						evaluatorOptions: options
53834					}));
53835					break;
53836			}
53837		}
53838		return Promise.all(promises);
53839	}
53840}
53841function getRgbColor(color, defaultColor = new Uint8ClampedArray(3)) {
53842	if (!Array.isArray(color)) {
53843		return defaultColor;
53844	}
53845	const rgbColor = defaultColor || new Uint8ClampedArray(3);
53846	switch (color.length) {
53847		case 0:
53848			return null;
53849		case 1:
53850			ColorSpace.singletons.gray.getRgbItem(color, 0, rgbColor, 0);
53851			return rgbColor;
53852		case 3:
53853			ColorSpace.singletons.rgb.getRgbItem(color, 0, rgbColor, 0);
53854			return rgbColor;
53855		case 4:
53856			ColorSpace.singletons.cmyk.getRgbItem(color, 0, rgbColor, 0);
53857			return rgbColor;
53858		default:
53859			return defaultColor;
53860	}
53861}
53862function getPdfColorArray(color) {
53863	return Array.from(color, c => c / 255);
53864}
53865function getQuadPoints(dict, rect) {
53866	const quadPoints = dict.getArray("QuadPoints");
53867	if (!isNumberArray(quadPoints, null) || quadPoints.length === 0 || quadPoints.length % 8 > 0) {
53868		return null;
53869	}
53870	const newQuadPoints = new Float32Array(quadPoints.length);
53871	for (let i = 0, ii = quadPoints.length; i < ii; i += 8) {
53872		const [x1, y1, x2, y2, x3, y3, x4, y4] = quadPoints.slice(i, i + 8);
53873		const minX = Math.min(x1, x2, x3, x4);
53874		const maxX = Math.max(x1, x2, x3, x4);
53875		const minY = Math.min(y1, y2, y3, y4);
53876		const maxY = Math.max(y1, y2, y3, y4);
53877		if (rect !== null && (minX < rect[0] || maxX > rect[2] || minY < rect[1] || maxY > rect[3])) {
53878			return null;
53879		}
53880		newQuadPoints.set([minX, maxY, maxX, maxY, minX, minY, maxX, minY], i);
53881	}
53882	return newQuadPoints;
53883}
53884function getTransformMatrix(rect, bbox, matrix) {
53885	const [minX, minY, maxX, maxY] = Util.getAxialAlignedBoundingBox(bbox, matrix);
53886	if (minX === maxX || minY === maxY) {
53887		return [1, 0, 0, 1, rect[0], rect[1]];
53888	}
53889	const xRatio = (rect[2] - rect[0]) / (maxX - minX);
53890	const yRatio = (rect[3] - rect[1]) / (maxY - minY);
53891	return [xRatio, 0, 0, yRatio, rect[0] - minX * xRatio, rect[1] - minY * yRatio];
53892}
53893class Annotation {
53894	constructor(params) {
53895		const {
53896			dict,
53897			xref,
53898			annotationGlobals,
53899			ref,
53900			orphanFields
53901		} = params;
53902		const parentRef = orphanFields?.get(ref);
53903		if (parentRef) {
53904			dict.set("Parent", parentRef);
53905		}
53906		this.setTitle(dict.get("T"));
53907		this.setContents(dict.get("Contents"));
53908		this.setModificationDate(dict.get("M"));
53909		this.setFlags(dict.get("F"));
53910		this.setRectangle(dict.getArray("Rect"));
53911		this.setColor(dict.getArray("C"));
53912		this.setBorderStyle(dict);
53913		this.setAppearance(dict);
53914		this.setOptionalContent(dict);
53915		const MK = dict.get("MK");
53916		this.setBorderAndBackgroundColors(MK);
53917		this.setRotation(MK, dict);
53918		this.ref = params.ref instanceof Ref ? params.ref : null;
53919		this._streams = [];
53920		if (this.appearance) {
53921			this._streams.push(this.appearance);
53922		}
53923		const isLocked = !!(this.flags & AnnotationFlag.LOCKED);
53924		const isContentLocked = !!(this.flags & AnnotationFlag.LOCKEDCONTENTS);
53925		this.data = {
53926			annotationFlags: this.flags,
53927			borderStyle: this.borderStyle,
53928			color: this.color,
53929			backgroundColor: this.backgroundColor,
53930			borderColor: this.borderColor,
53931			rotation: this.rotation,
53932			contentsObj: this._contents,
53933			hasAppearance: !!this.appearance,
53934			id: params.id,
53935			modificationDate: this.modificationDate,
53936			rect: this.rectangle,
53937			subtype: params.subtype,
53938			hasOwnCanvas: false,
53939			noRotate: !!(this.flags & AnnotationFlag.NOROTATE),
53940			noHTML: isLocked && isContentLocked,
53941			isEditable: false,
53942			structParent: -1
53943		};
53944		if (annotationGlobals.structTreeRoot) {
53945			let structParent = dict.get("StructParent");
53946			this.data.structParent = structParent = Number.isInteger(structParent) && structParent >= 0 ? structParent : -1;
53947			annotationGlobals.structTreeRoot.addAnnotationIdToPage(params.pageRef, structParent);
53948		}
53949		if (params.collectFields) {
53950			const kids = dict.get("Kids");
53951			if (Array.isArray(kids)) {
53952				const kidIds = [];
53953				for (const kid of kids) {
53954					if (kid instanceof Ref) {
53955						kidIds.push(kid.toString());
53956					}
53957				}
53958				if (kidIds.length !== 0) {
53959					this.data.kidIds = kidIds;
53960				}
53961			}
53962			this.data.actions = collectActions(xref, dict, AnnotationActionEventType);
53963			this.data.fieldName = this._constructFieldName(dict);
53964			this.data.pageIndex = params.pageIndex;
53965		}
53966		const it = dict.get("IT");
53967		if (it instanceof Name) {
53968			this.data.it = it.name;
53969		}
53970		this._isOffscreenCanvasSupported = params.evaluatorOptions.isOffscreenCanvasSupported;
53971		this._fallbackFontDict = null;
53972		this._needAppearances = false;
53973	}
53974	_hasFlag(flags, flag) {
53975		return !!(flags & flag);
53976	}
53977	_buildFlags(noView, noPrint) {
53978		let {
53979			flags
53980		} = this;
53981		if (noView === undefined) {
53982			if (noPrint === undefined) {
53983				return undefined;
53984			}
53985			if (noPrint) {
53986				return flags & ~AnnotationFlag.PRINT;
53987			}
53988			return flags & ~AnnotationFlag.HIDDEN | AnnotationFlag.PRINT;
53989		}
53990		if (noView) {
53991			flags |= AnnotationFlag.PRINT;
53992			if (noPrint) {
53993				return flags & ~AnnotationFlag.NOVIEW | AnnotationFlag.HIDDEN;
53994			}
53995			return flags & ~AnnotationFlag.HIDDEN | AnnotationFlag.NOVIEW;
53996		}
53997		flags &= ~(AnnotationFlag.HIDDEN | AnnotationFlag.NOVIEW);
53998		if (noPrint) {
53999			return flags & ~AnnotationFlag.PRINT;
54000		}
54001		return flags | AnnotationFlag.PRINT;
54002	}
54003	_isViewable(flags) {
54004		return !this._hasFlag(flags, AnnotationFlag.INVISIBLE) && !this._hasFlag(flags, AnnotationFlag.NOVIEW);
54005	}
54006	_isPrintable(flags) {
54007		return this._hasFlag(flags, AnnotationFlag.PRINT) && !this._hasFlag(flags, AnnotationFlag.HIDDEN) && !this._hasFlag(flags, AnnotationFlag.INVISIBLE);
54008	}
54009	mustBeViewed(annotationStorage, _renderForms) {
54010		const noView = annotationStorage?.get(this.data.id)?.noView;
54011		if (noView !== undefined) {
54012			return !noView;
54013		}
54014		return this.viewable && !this._hasFlag(this.flags, AnnotationFlag.HIDDEN);
54015	}
54016	mustBePrinted(annotationStorage) {
54017		const noPrint = annotationStorage?.get(this.data.id)?.noPrint;
54018		if (noPrint !== undefined) {
54019			return !noPrint;
54020		}
54021		return this.printable;
54022	}
54023	mustBeViewedWhenEditing(isEditing, modifiedIds = null) {
54024		return isEditing ? !this.data.isEditable : !modifiedIds?.has(this.data.id);
54025	}
54026	get viewable() {
54027		if (this.data.quadPoints === null) {
54028			return false;
vendor: 2,422 bytes, lines 54029-54121
54029		}
54030		if (this.flags === 0) {
54031			return true;
54032		}
54033		return this._isViewable(this.flags);
54034	}
54035	get printable() {
54036		if (this.data.quadPoints === null) {
54037			return false;
54038		}
54039		if (this.flags === 0) {
54040			return false;
54041		}
54042		return this._isPrintable(this.flags);
54043	}
54044	_parseStringHelper(data) {
54045		const str = typeof data === "string" ? stringToPDFString(data) : "";
54046		const dir = str && bidi(str).dir === "rtl" ? "rtl" : "ltr";
54047		return {
54048			str,
54049			dir
54050		};
54051	}
54052	setDefaultAppearance(params) {
54053		const {
54054			dict,
54055			annotationGlobals
54056		} = params;
54057		const defaultAppearance = getInheritableProperty({
54058			dict,
54059			key: "DA"
54060		}) || annotationGlobals.acroForm.get("DA");
54061		this._defaultAppearance = typeof defaultAppearance === "string" ? defaultAppearance : "";
54062		this.data.defaultAppearanceData = parseDefaultAppearance(this._defaultAppearance);
54063	}
54064	setTitle(title) {
54065		this._title = this._parseStringHelper(title);
54066	}
54067	setContents(contents) {
54068		this._contents = this._parseStringHelper(contents);
54069	}
54070	setModificationDate(modificationDate) {
54071		this.modificationDate = typeof modificationDate === "string" ? modificationDate : null;
54072	}
54073	setFlags(flags) {
54074		this.flags = Number.isInteger(flags) && flags > 0 ? flags : 0;
54075		if (this.flags & AnnotationFlag.INVISIBLE && this.constructor.name !== "Annotation") {
54076			this.flags ^= AnnotationFlag.INVISIBLE;
54077		}
54078	}
54079	hasFlag(flag) {
54080		return this._hasFlag(this.flags, flag);
54081	}
54082	setRectangle(rectangle) {
54083		this.rectangle = lookupNormalRect(rectangle, [0, 0, 0, 0]);
54084	}
54085	setColor(color) {
54086		this.color = getRgbColor(color);
54087	}
54088	setLineEndings(lineEndings) {
54089		this.lineEndings = ["None", "None"];
54090		if (Array.isArray(lineEndings) && lineEndings.length === 2) {
54091			for (let i = 0; i < 2; i++) {
54092				const obj = lineEndings[i];
54093				if (obj instanceof Name) {
54094					switch (obj.name) {
54095						case "None":
54096							continue;
54097						case "Square":
54098						case "Circle":
54099						case "Diamond":
54100						case "OpenArrow":
54101						case "ClosedArrow":
54102						case "Butt":
54103						case "ROpenArrow":
54104						case "RClosedArrow":
54105						case "Slash":
54106							this.lineEndings[i] = obj.name;
54107							continue;
54108					}
54109				}
54110				warn(`Ignoring invalid lineEnding: ${obj}`);
54111			}
54112		}
54113	}
54114	setRotation(mk, dict) {
54115		this.rotation = 0;
54116		let angle = mk instanceof Dict ? mk.get("R") || 0 : dict.get("Rotate") || 0;
54117		if (Number.isInteger(angle) && angle !== 0) {
54118			angle %= 360;
54119			if (angle < 0) {
54120				angle += 360;
54121			}
vendor: 58,371 bytes, lines 54122-55941
54122			if (angle % 90 === 0) {
54123				this.rotation = angle;
54124			}
54125		}
54126	}
54127	setBorderAndBackgroundColors(mk) {
54128		if (mk instanceof Dict) {
54129			this.borderColor = getRgbColor(mk.getArray("BC"), null);
54130			this.backgroundColor = getRgbColor(mk.getArray("BG"), null);
54131		} else {
54132			this.borderColor = this.backgroundColor = null;
54133		}
54134	}
54135	setBorderStyle(borderStyle) {
54136		this.borderStyle = new AnnotationBorderStyle();
54137		if (!(borderStyle instanceof Dict)) {
54138			return;
54139		}
54140		if (borderStyle.has("BS")) {
54141			const dict = borderStyle.get("BS");
54142			if (dict instanceof Dict) {
54143				const dictType = dict.get("Type");
54144				if (!dictType || isName(dictType, "Border")) {
54145					this.borderStyle.setWidth(dict.get("W"), this.rectangle);
54146					this.borderStyle.setStyle(dict.get("S"));
54147					this.borderStyle.setDashArray(dict.getArray("D"));
54148				}
54149			}
54150		} else if (borderStyle.has("Border")) {
54151			const array = borderStyle.getArray("Border");
54152			if (Array.isArray(array) && array.length >= 3) {
54153				this.borderStyle.setHorizontalCornerRadius(array[0]);
54154				this.borderStyle.setVerticalCornerRadius(array[1]);
54155				this.borderStyle.setWidth(array[2], this.rectangle);
54156				if (array.length === 4) {
54157					this.borderStyle.setDashArray(array[3], true);
54158				}
54159			}
54160		} else {
54161			this.borderStyle.setWidth(0);
54162		}
54163	}
54164	setAppearance(dict) {
54165		this.appearance = null;
54166		const appearanceStates = dict.get("AP");
54167		if (!(appearanceStates instanceof Dict)) {
54168			return;
54169		}
54170		const normalAppearanceState = appearanceStates.get("N");
54171		if (normalAppearanceState instanceof BaseStream) {
54172			this.appearance = normalAppearanceState;
54173			return;
54174		}
54175		if (!(normalAppearanceState instanceof Dict)) {
54176			return;
54177		}
54178		const as = dict.get("AS");
54179		if (!(as instanceof Name) || !normalAppearanceState.has(as.name)) {
54180			return;
54181		}
54182		const appearance = normalAppearanceState.get(as.name);
54183		if (appearance instanceof BaseStream) {
54184			this.appearance = appearance;
54185		}
54186	}
54187	setOptionalContent(dict) {
54188		this.oc = null;
54189		const oc = dict.get("OC");
54190		if (oc instanceof Name) {
54191			warn("setOptionalContent: Support for /Name-entry is not implemented.");
54192		} else if (oc instanceof Dict) {
54193			this.oc = oc;
54194		}
54195	}
54196	loadResources(keys, appearance) {
54197		return appearance.dict.getAsync("Resources").then(resources => {
54198			if (!resources) {
54199				return undefined;
54200			}
54201			const objectLoader = new ObjectLoader(resources, keys, resources.xref);
54202			return objectLoader.load().then(function () {
54203				return resources;
54204			});
54205		});
54206	}
54207	async getOperatorList(evaluator, task, intent, annotationStorage) {
54208		const {
54209			hasOwnCanvas,
54210			id,
54211			rect
54212		} = this.data;
54213		let appearance = this.appearance;
54214		const isUsingOwnCanvas = !!(hasOwnCanvas && intent & RenderingIntentFlag.DISPLAY);
54215		if (isUsingOwnCanvas && (rect[0] === rect[2] || rect[1] === rect[3])) {
54216			this.data.hasOwnCanvas = false;
54217			return {
54218				opList: new OperatorList(),
54219				separateForm: false,
54220				separateCanvas: false
54221			};
54222		}
54223		if (!appearance) {
54224			if (!isUsingOwnCanvas) {
54225				return {
54226					opList: new OperatorList(),
54227					separateForm: false,
54228					separateCanvas: false
54229				};
54230			}
54231			appearance = new StringStream("");
54232			appearance.dict = new Dict();
54233		}
54234		const appearanceDict = appearance.dict;
54235		const resources = await this.loadResources(["ExtGState", "ColorSpace", "Pattern", "Shading", "XObject", "Font"], appearance);
54236		const bbox = lookupRect(appearanceDict.getArray("BBox"), [0, 0, 1, 1]);
54237		const matrix = lookupMatrix(appearanceDict.getArray("Matrix"), IDENTITY_MATRIX);
54238		const transform = getTransformMatrix(rect, bbox, matrix);
54239		const opList = new OperatorList();
54240		let optionalContent;
54241		if (this.oc) {
54242			optionalContent = await evaluator.parseMarkedContentProps(this.oc, null);
54243		}
54244		if (optionalContent !== undefined) {
54245			opList.addOp(OPS.beginMarkedContentProps, ["OC", optionalContent]);
54246		}
54247		opList.addOp(OPS.beginAnnotation, [id, rect, transform, matrix, isUsingOwnCanvas]);
54248		await evaluator.getOperatorList({
54249			stream: appearance,
54250			task,
54251			resources,
54252			operatorList: opList,
54253			fallbackFontDict: this._fallbackFontDict
54254		});
54255		opList.addOp(OPS.endAnnotation, []);
54256		if (optionalContent !== undefined) {
54257			opList.addOp(OPS.endMarkedContent, []);
54258		}
54259		this.reset();
54260		return {
54261			opList,
54262			separateForm: false,
54263			separateCanvas: isUsingOwnCanvas
54264		};
54265	}
54266	async save(evaluator, task, annotationStorage, changes) {
54267		return null;
54268	}
54269	get hasTextContent() {
54270		return false;
54271	}
54272	async extractTextContent(evaluator, task, viewBox) {
54273		if (!this.appearance) {
54274			return;
54275		}
54276		const resources = await this.loadResources(["ExtGState", "Font", "Properties", "XObject"], this.appearance);
54277		const text = [];
54278		const buffer = [];
54279		let firstPosition = null;
54280		const sink = {
54281			desiredSize: Math.Infinity,
54282			ready: true,
54283			enqueue(chunk, size) {
54284				for (const item of chunk.items) {
54285					if (item.str === undefined) {
54286						continue;
54287					}
54288					firstPosition ||= item.transform.slice(-2);
54289					buffer.push(item.str);
54290					if (item.hasEOL) {
54291						text.push(buffer.join("").trimEnd());
54292						buffer.length = 0;
54293					}
54294				}
54295			}
54296		};
54297		await evaluator.getTextContent({
54298			stream: this.appearance,
54299			task,
54300			resources,
54301			includeMarkedContent: true,
54302			keepWhiteSpace: true,
54303			sink,
54304			viewBox
54305		});
54306		this.reset();
54307		if (buffer.length) {
54308			text.push(buffer.join("").trimEnd());
54309		}
54310		if (text.length > 1 || text[0]) {
54311			const appearanceDict = this.appearance.dict;
54312			const bbox = lookupRect(appearanceDict.getArray("BBox"), null);
54313			const matrix = lookupMatrix(appearanceDict.getArray("Matrix"), null);
54314			this.data.textPosition = this._transformPoint(firstPosition, bbox, matrix);
54315			this.data.textContent = text;
54316		}
54317	}
54318	_transformPoint(coords, bbox, matrix) {
54319		const {
54320			rect
54321		} = this.data;
54322		bbox ||= [0, 0, 1, 1];
54323		matrix ||= [1, 0, 0, 1, 0, 0];
54324		const transform = getTransformMatrix(rect, bbox, matrix);
54325		transform[4] -= rect[0];
54326		transform[5] -= rect[1];
54327		coords = Util.applyTransform(coords, transform);
54328		return Util.applyTransform(coords, matrix);
54329	}
54330	getFieldObject() {
54331		if (this.data.kidIds) {
54332			return {
54333				id: this.data.id,
54334				actions: this.data.actions,
54335				name: this.data.fieldName,
54336				strokeColor: this.data.borderColor,
54337				fillColor: this.data.backgroundColor,
54338				type: "",
54339				kidIds: this.data.kidIds,
54340				page: this.data.pageIndex,
54341				rotation: this.rotation
54342			};
54343		}
54344		return null;
54345	}
54346	reset() {
54347		for (const stream of this._streams) {
54348			stream.reset();
54349		}
54350	}
54351	_constructFieldName(dict) {
54352		if (!dict.has("T") && !dict.has("Parent")) {
54353			warn("Unknown field name, falling back to empty field name.");
54354			return "";
54355		}
54356		if (!dict.has("Parent")) {
54357			return stringToPDFString(dict.get("T"));
54358		}
54359		const fieldName = [];
54360		if (dict.has("T")) {
54361			fieldName.unshift(stringToPDFString(dict.get("T")));
54362		}
54363		let loopDict = dict;
54364		const visited = new RefSet();
54365		if (dict.objId) {
54366			visited.put(dict.objId);
54367		}
54368		while (loopDict.has("Parent")) {
54369			loopDict = loopDict.get("Parent");
54370			if (!(loopDict instanceof Dict) || loopDict.objId && visited.has(loopDict.objId)) {
54371				break;
54372			}
54373			if (loopDict.objId) {
54374				visited.put(loopDict.objId);
54375			}
54376			if (loopDict.has("T")) {
54377				fieldName.unshift(stringToPDFString(loopDict.get("T")));
54378			}
54379		}
54380		return fieldName.join(".");
54381	}
54382}
54383class AnnotationBorderStyle {
54384	constructor() {
54385		this.width = 1;
54386		this.rawWidth = 1;
54387		this.style = AnnotationBorderStyleType.SOLID;
54388		this.dashArray = [3];
54389		this.horizontalCornerRadius = 0;
54390		this.verticalCornerRadius = 0;
54391	}
54392	setWidth(width, rect = [0, 0, 0, 0]) {
54393		if (width instanceof Name) {
54394			this.width = 0;
54395			return;
54396		}
54397		if (typeof width === "number") {
54398			if (width > 0) {
54399				this.rawWidth = width;
54400				const maxWidth = (rect[2] - rect[0]) / 2;
54401				const maxHeight = (rect[3] - rect[1]) / 2;
54402				if (maxWidth > 0 && maxHeight > 0 && (width > maxWidth || width > maxHeight)) {
54403					warn(`AnnotationBorderStyle.setWidth - ignoring width: ${width}`);
54404					width = 1;
54405				}
54406			}
54407			this.width = width;
54408		}
54409	}
54410	setStyle(style) {
54411		if (!(style instanceof Name)) {
54412			return;
54413		}
54414		switch (style.name) {
54415			case "S":
54416				this.style = AnnotationBorderStyleType.SOLID;
54417				break;
54418			case "D":
54419				this.style = AnnotationBorderStyleType.DASHED;
54420				break;
54421			case "B":
54422				this.style = AnnotationBorderStyleType.BEVELED;
54423				break;
54424			case "I":
54425				this.style = AnnotationBorderStyleType.INSET;
54426				break;
54427			case "U":
54428				this.style = AnnotationBorderStyleType.UNDERLINE;
54429				break;
54430			default:
54431				break;
54432		}
54433	}
54434	setDashArray(dashArray, forceStyle = false) {
54435		if (Array.isArray(dashArray)) {
54436			let isValid = true;
54437			let allZeros = true;
54438			for (const element of dashArray) {
54439				const validNumber = +element >= 0;
54440				if (!validNumber) {
54441					isValid = false;
54442					break;
54443				} else if (element > 0) {
54444					allZeros = false;
54445				}
54446			}
54447			if (dashArray.length === 0 || isValid && !allZeros) {
54448				this.dashArray = dashArray;
54449				if (forceStyle) {
54450					this.setStyle(Name.get("D"));
54451				}
54452			} else {
54453				this.width = 0;
54454			}
54455		} else if (dashArray) {
54456			this.width = 0;
54457		}
54458	}
54459	setHorizontalCornerRadius(radius) {
54460		if (Number.isInteger(radius)) {
54461			this.horizontalCornerRadius = radius;
54462		}
54463	}
54464	setVerticalCornerRadius(radius) {
54465		if (Number.isInteger(radius)) {
54466			this.verticalCornerRadius = radius;
54467		}
54468	}
54469}
54470class MarkupAnnotation extends Annotation {
54471	constructor(params) {
54472		super(params);
54473		const {
54474			dict
54475		} = params;
54476		if (dict.has("IRT")) {
54477			const rawIRT = dict.getRaw("IRT");
54478			this.data.inReplyTo = rawIRT instanceof Ref ? rawIRT.toString() : null;
54479			const rt = dict.get("RT");
54480			this.data.replyType = rt instanceof Name ? rt.name : AnnotationReplyType.REPLY;
54481		}
54482		let popupRef = null;
54483		if (this.data.replyType === AnnotationReplyType.GROUP) {
54484			const parent = dict.get("IRT");
54485			this.setTitle(parent.get("T"));
54486			this.data.titleObj = this._title;
54487			this.setContents(parent.get("Contents"));
54488			this.data.contentsObj = this._contents;
54489			if (!parent.has("CreationDate")) {
54490				this.data.creationDate = null;
54491			} else {
54492				this.setCreationDate(parent.get("CreationDate"));
54493				this.data.creationDate = this.creationDate;
54494			}
54495			if (!parent.has("M")) {
54496				this.data.modificationDate = null;
54497			} else {
54498				this.setModificationDate(parent.get("M"));
54499				this.data.modificationDate = this.modificationDate;
54500			}
54501			popupRef = parent.getRaw("Popup");
54502			if (!parent.has("C")) {
54503				this.data.color = null;
54504			} else {
54505				this.setColor(parent.getArray("C"));
54506				this.data.color = this.color;
54507			}
54508		} else {
54509			this.data.titleObj = this._title;
54510			this.setCreationDate(dict.get("CreationDate"));
54511			this.data.creationDate = this.creationDate;
54512			popupRef = dict.getRaw("Popup");
54513			if (!dict.has("C")) {
54514				this.data.color = null;
54515			}
54516		}
54517		this.data.popupRef = popupRef instanceof Ref ? popupRef.toString() : null;
54518		if (dict.has("RC")) {
54519			this.data.richText = XFAFactory.getRichTextAsHtml(dict.get("RC"));
54520		}
54521	}
54522	setCreationDate(creationDate) {
54523		this.creationDate = typeof creationDate === "string" ? creationDate : null;
54524	}
54525	_setDefaultAppearance({
54526		xref,
54527		extra,
54528		strokeColor,
54529		fillColor,
54530		blendMode,
54531		strokeAlpha,
54532		fillAlpha,
54533		pointsCallback
54534	}) {
54535		let minX = Number.MAX_VALUE;
54536		let minY = Number.MAX_VALUE;
54537		let maxX = Number.MIN_VALUE;
54538		let maxY = Number.MIN_VALUE;
54539		const buffer = ["q"];
54540		if (extra) {
54541			buffer.push(extra);
54542		}
54543		if (strokeColor) {
54544			buffer.push(`${strokeColor[0]} ${strokeColor[1]} ${strokeColor[2]} RG`);
54545		}
54546		if (fillColor) {
54547			buffer.push(`${fillColor[0]} ${fillColor[1]} ${fillColor[2]} rg`);
54548		}
54549		const pointsArray = this.data.quadPoints || Float32Array.from([this.rectangle[0], this.rectangle[3], this.rectangle[2], this.rectangle[3], this.rectangle[0], this.rectangle[1], this.rectangle[2], this.rectangle[1]]);
54550		for (let i = 0, ii = pointsArray.length; i < ii; i += 8) {
54551			const [mX, MX, mY, MY] = pointsCallback(buffer, pointsArray.subarray(i, i + 8));
54552			minX = Math.min(minX, mX);
54553			maxX = Math.max(maxX, MX);
54554			minY = Math.min(minY, mY);
54555			maxY = Math.max(maxY, MY);
54556		}
54557		buffer.push("Q");
54558		const formDict = new Dict(xref);
54559		const appearanceStreamDict = new Dict(xref);
54560		appearanceStreamDict.set("Subtype", Name.get("Form"));
54561		const appearanceStream = new StringStream(buffer.join(" "));
54562		appearanceStream.dict = appearanceStreamDict;
54563		formDict.set("Fm0", appearanceStream);
54564		const gsDict = new Dict(xref);
54565		if (blendMode) {
54566			gsDict.set("BM", Name.get(blendMode));
54567		}
54568		if (typeof strokeAlpha === "number") {
54569			gsDict.set("CA", strokeAlpha);
54570		}
54571		if (typeof fillAlpha === "number") {
54572			gsDict.set("ca", fillAlpha);
54573		}
54574		const stateDict = new Dict(xref);
54575		stateDict.set("GS0", gsDict);
54576		const resources = new Dict(xref);
54577		resources.set("ExtGState", stateDict);
54578		resources.set("XObject", formDict);
54579		const appearanceDict = new Dict(xref);
54580		appearanceDict.set("Resources", resources);
54581		const bbox = this.data.rect = [minX, minY, maxX, maxY];
54582		appearanceDict.set("BBox", bbox);
54583		this.appearance = new StringStream("/GS0 gs /Fm0 Do");
54584		this.appearance.dict = appearanceDict;
54585		this._streams.push(this.appearance, appearanceStream);
54586	}
54587	static async createNewAnnotation(xref, annotation, changes, params) {
54588		const annotationRef = annotation.ref ||= xref.getNewTemporaryRef();
54589		const ap = await this.createNewAppearanceStream(annotation, xref, params);
54590		let annotationDict;
54591		if (ap) {
54592			const apRef = xref.getNewTemporaryRef();
54593			annotationDict = this.createNewDict(annotation, xref, {
54594				apRef
54595			});
54596			changes.put(apRef, {
54597				data: ap
54598			});
54599		} else {
54600			annotationDict = this.createNewDict(annotation, xref, {});
54601		}
54602		if (Number.isInteger(annotation.parentTreeId)) {
54603			annotationDict.set("StructParent", annotation.parentTreeId);
54604		}
54605		changes.put(annotationRef, {
54606			data: annotationDict
54607		});
54608		return {
54609			ref: annotationRef
54610		};
54611	}
54612	static async createNewPrintAnnotation(annotationGlobals, xref, annotation, params) {
54613		const ap = await this.createNewAppearanceStream(annotation, xref, params);
54614		const annotationDict = this.createNewDict(annotation, xref, ap ? {
54615			ap
54616		} : {});
54617		const newAnnotation = new this.prototype.constructor({
54618			dict: annotationDict,
54619			xref,
54620			annotationGlobals,
54621			evaluatorOptions: params.evaluatorOptions
54622		});
54623		if (annotation.ref) {
54624			newAnnotation.ref = newAnnotation.refToReplace = annotation.ref;
54625		}
54626		return newAnnotation;
54627	}
54628}
54629class WidgetAnnotation extends Annotation {
54630	constructor(params) {
54631		super(params);
54632		const {
54633			dict,
54634			xref,
54635			annotationGlobals
54636		} = params;
54637		const data = this.data;
54638		this._needAppearances = params.needAppearances;
54639		data.annotationType = AnnotationType.WIDGET;
54640		if (data.fieldName === undefined) {
54641			data.fieldName = this._constructFieldName(dict);
54642		}
54643		if (data.actions === undefined) {
54644			data.actions = collectActions(xref, dict, AnnotationActionEventType);
54645		}
54646		let fieldValue = getInheritableProperty({
54647			dict,
54648			key: "V",
54649			getArray: true
54650		});
54651		data.fieldValue = this._decodeFormValue(fieldValue);
54652		const defaultFieldValue = getInheritableProperty({
54653			dict,
54654			key: "DV",
54655			getArray: true
54656		});
54657		data.defaultFieldValue = this._decodeFormValue(defaultFieldValue);
54658		if (fieldValue === undefined && annotationGlobals.xfaDatasets) {
54659			const path = this._title.str;
54660			if (path) {
54661				this._hasValueFromXFA = true;
54662				data.fieldValue = fieldValue = annotationGlobals.xfaDatasets.getValue(path);
54663			}
54664		}
54665		if (fieldValue === undefined && data.defaultFieldValue !== null) {
54666			data.fieldValue = data.defaultFieldValue;
54667		}
54668		data.alternativeText = stringToPDFString(dict.get("TU") || "");
54669		this.setDefaultAppearance(params);
54670		data.hasAppearance ||= this._needAppearances && data.fieldValue !== undefined && data.fieldValue !== null;
54671		const fieldType = getInheritableProperty({
54672			dict,
54673			key: "FT"
54674		});
54675		data.fieldType = fieldType instanceof Name ? fieldType.name : null;
54676		const localResources = getInheritableProperty({
54677			dict,
54678			key: "DR"
54679		});
54680		const acroFormResources = annotationGlobals.acroForm.get("DR");
54681		const appearanceResources = this.appearance?.dict.get("Resources");
54682		this._fieldResources = {
54683			localResources,
54684			acroFormResources,
54685			appearanceResources,
54686			mergedResources: Dict.merge({
54687				xref,
54688				dictArray: [localResources, appearanceResources, acroFormResources],
54689				mergeSubDicts: true
54690			})
54691		};
54692		data.fieldFlags = getInheritableProperty({
54693			dict,
54694			key: "Ff"
54695		});
54696		if (!Number.isInteger(data.fieldFlags) || data.fieldFlags < 0) {
54697			data.fieldFlags = 0;
54698		}
54699		data.readOnly = this.hasFieldFlag(AnnotationFieldFlag.READONLY);
54700		data.required = this.hasFieldFlag(AnnotationFieldFlag.REQUIRED);
54701		data.hidden = this._hasFlag(data.annotationFlags, AnnotationFlag.HIDDEN) || this._hasFlag(data.annotationFlags, AnnotationFlag.NOVIEW);
54702	}
54703	_decodeFormValue(formValue) {
54704		if (Array.isArray(formValue)) {
54705			return formValue.filter(item => typeof item === "string").map(item => stringToPDFString(item));
54706		} else if (formValue instanceof Name) {
54707			return stringToPDFString(formValue.name);
54708		} else if (typeof formValue === "string") {
54709			return stringToPDFString(formValue);
54710		}
54711		return null;
54712	}
54713	hasFieldFlag(flag) {
54714		return !!(this.data.fieldFlags & flag);
54715	}
54716	_isViewable(flags) {
54717		return true;
54718	}
54719	mustBeViewed(annotationStorage, renderForms) {
54720		if (renderForms) {
54721			return this.viewable;
54722		}
54723		return super.mustBeViewed(annotationStorage, renderForms) && !this._hasFlag(this.flags, AnnotationFlag.NOVIEW);
54724	}
54725	getRotationMatrix(annotationStorage) {
54726		let rotation = annotationStorage?.get(this.data.id)?.rotation;
54727		if (rotation === undefined) {
54728			rotation = this.rotation;
54729		}
54730		if (rotation === 0) {
54731			return IDENTITY_MATRIX;
54732		}
54733		const width = this.data.rect[2] - this.data.rect[0];
54734		const height = this.data.rect[3] - this.data.rect[1];
54735		return getRotationMatrix(rotation, width, height);
54736	}
54737	getBorderAndBackgroundAppearances(annotationStorage) {
54738		let rotation = annotationStorage?.get(this.data.id)?.rotation;
54739		if (rotation === undefined) {
54740			rotation = this.rotation;
54741		}
54742		if (!this.backgroundColor && !this.borderColor) {
54743			return "";
54744		}
54745		const width = this.data.rect[2] - this.data.rect[0];
54746		const height = this.data.rect[3] - this.data.rect[1];
54747		const rect = rotation === 0 || rotation === 180 ? `0 0 ${width} ${height} re` : `0 0 ${height} ${width} re`;
54748		let str = "";
54749		if (this.backgroundColor) {
54750			str = `${getPdfColor(this.backgroundColor, true)} ${rect} f `;
54751		}
54752		if (this.borderColor) {
54753			const borderWidth = this.borderStyle.width || 1;
54754			str += `${borderWidth} w ${getPdfColor(this.borderColor, false)} ${rect} S `;
54755		}
54756		return str;
54757	}
54758	async getOperatorList(evaluator, task, intent, annotationStorage) {
54759		if (intent & RenderingIntentFlag.ANNOTATIONS_FORMS && !(this instanceof SignatureWidgetAnnotation) && !this.data.noHTML && !this.data.hasOwnCanvas) {
54760			return {
54761				opList: new OperatorList(),
54762				separateForm: true,
54763				separateCanvas: false
54764			};
54765		}
54766		if (!this._hasText) {
54767			return super.getOperatorList(evaluator, task, intent, annotationStorage);
54768		}
54769		const content = await this._getAppearance(evaluator, task, intent, annotationStorage);
54770		if (this.appearance && content === null) {
54771			return super.getOperatorList(evaluator, task, intent, annotationStorage);
54772		}
54773		const opList = new OperatorList();
54774		if (!this._defaultAppearance || content === null) {
54775			return {
54776				opList,
54777				separateForm: false,
54778				separateCanvas: false
54779			};
54780		}
54781		const isUsingOwnCanvas = !!(this.data.hasOwnCanvas && intent & RenderingIntentFlag.DISPLAY);
54782		const matrix = [1, 0, 0, 1, 0, 0];
54783		const bbox = [0, 0, this.data.rect[2] - this.data.rect[0], this.data.rect[3] - this.data.rect[1]];
54784		const transform = getTransformMatrix(this.data.rect, bbox, matrix);
54785		let optionalContent;
54786		if (this.oc) {
54787			optionalContent = await evaluator.parseMarkedContentProps(this.oc, null);
54788		}
54789		if (optionalContent !== undefined) {
54790			opList.addOp(OPS.beginMarkedContentProps, ["OC", optionalContent]);
54791		}
54792		opList.addOp(OPS.beginAnnotation, [this.data.id, this.data.rect, transform, this.getRotationMatrix(annotationStorage), isUsingOwnCanvas]);
54793		const stream = new StringStream(content);
54794		await evaluator.getOperatorList({
54795			stream,
54796			task,
54797			resources: this._fieldResources.mergedResources,
54798			operatorList: opList
54799		});
54800		opList.addOp(OPS.endAnnotation, []);
54801		if (optionalContent !== undefined) {
54802			opList.addOp(OPS.endMarkedContent, []);
54803		}
54804		return {
54805			opList,
54806			separateForm: false,
54807			separateCanvas: isUsingOwnCanvas
54808		};
54809	}
54810	_getMKDict(rotation) {
54811		const mk = new Dict(null);
54812		if (rotation) {
54813			mk.set("R", rotation);
54814		}
54815		if (this.borderColor) {
54816			mk.set("BC", getPdfColorArray(this.borderColor));
54817		}
54818		if (this.backgroundColor) {
54819			mk.set("BG", getPdfColorArray(this.backgroundColor));
54820		}
54821		return mk.size > 0 ? mk : null;
54822	}
54823	amendSavedDict(annotationStorage, dict) {}
54824	setValue(dict, value, xref, changes) {
54825		const {
54826			dict: parentDict,
54827			ref: parentRef
54828		} = getParentToUpdate(dict, this.ref, xref);
54829		if (!parentDict) {
54830			dict.set("V", value);
54831		} else if (!changes.has(parentRef)) {
54832			const newParentDict = parentDict.clone();
54833			newParentDict.set("V", value);
54834			changes.put(parentRef, {
54835				data: newParentDict
54836			});
54837			return newParentDict;
54838		}
54839		return null;
54840	}
54841	async save(evaluator, task, annotationStorage, changes) {
54842		const storageEntry = annotationStorage?.get(this.data.id);
54843		const flags = this._buildFlags(storageEntry?.noView, storageEntry?.noPrint);
54844		let value = storageEntry?.value,
54845			rotation = storageEntry?.rotation;
54846		if (value === this.data.fieldValue || value === undefined) {
54847			if (!this._hasValueFromXFA && rotation === undefined && flags === undefined) {
54848				return;
54849			}
54850			value ||= this.data.fieldValue;
54851		}
54852		if (rotation === undefined && !this._hasValueFromXFA && Array.isArray(value) && Array.isArray(this.data.fieldValue) && isArrayEqual(value, this.data.fieldValue) && flags === undefined) {
54853			return;
54854		}
54855		if (rotation === undefined) {
54856			rotation = this.rotation;
54857		}
54858		let appearance = null;
54859		if (!this._needAppearances) {
54860			appearance = await this._getAppearance(evaluator, task, RenderingIntentFlag.SAVE, annotationStorage);
54861			if (appearance === null && flags === undefined) {
54862				return;
54863			}
54864		} else {}
54865		let needAppearances = false;
54866		if (appearance?.needAppearances) {
54867			needAppearances = true;
54868			appearance = null;
54869		}
54870		const {
54871			xref
54872		} = evaluator;
54873		const originalDict = xref.fetchIfRef(this.ref);
54874		if (!(originalDict instanceof Dict)) {
54875			return;
54876		}
54877		const dict = new Dict(xref);
54878		for (const key of originalDict.getKeys()) {
54879			if (key !== "AP") {
54880				dict.set(key, originalDict.getRaw(key));
54881			}
54882		}
54883		if (flags !== undefined) {
54884			dict.set("F", flags);
54885			if (appearance === null && !needAppearances) {
54886				const ap = originalDict.getRaw("AP");
54887				if (ap) {
54888					dict.set("AP", ap);
54889				}
54890			}
54891		}
54892		const xfa = {
54893			path: this.data.fieldName,
54894			value
54895		};
54896		const newParentDict = this.setValue(dict, Array.isArray(value) ? value.map(stringToAsciiOrUTF16BE) : stringToAsciiOrUTF16BE(value), xref, changes);
54897		this.amendSavedDict(annotationStorage, newParentDict || dict);
54898		const maybeMK = this._getMKDict(rotation);
54899		if (maybeMK) {
54900			dict.set("MK", maybeMK);
54901		}
54902		changes.put(this.ref, {
54903			data: dict,
54904			xfa,
54905			needAppearances
54906		});
54907		if (appearance !== null) {
54908			const newRef = xref.getNewTemporaryRef();
54909			const AP = new Dict(xref);
54910			dict.set("AP", AP);
54911			AP.set("N", newRef);
54912			const resources = this._getSaveFieldResources(xref);
54913			const appearanceStream = new StringStream(appearance);
54914			const appearanceDict = appearanceStream.dict = new Dict(xref);
54915			appearanceDict.set("Subtype", Name.get("Form"));
54916			appearanceDict.set("Resources", resources);
54917			appearanceDict.set("BBox", [0, 0, this.data.rect[2] - this.data.rect[0], this.data.rect[3] - this.data.rect[1]]);
54918			const rotationMatrix = this.getRotationMatrix(annotationStorage);
54919			if (rotationMatrix !== IDENTITY_MATRIX) {
54920				appearanceDict.set("Matrix", rotationMatrix);
54921			}
54922			changes.put(newRef, {
54923				data: appearanceStream,
54924				xfa: null,
54925				needAppearances: false
54926			});
54927		}
54928		dict.set("M", `D:${getModificationDate()}`);
54929	}
54930	async _getAppearance(evaluator, task, intent, annotationStorage) {
54931		const isPassword = this.hasFieldFlag(AnnotationFieldFlag.PASSWORD);
54932		if (isPassword) {
54933			return null;
54934		}
54935		const storageEntry = annotationStorage?.get(this.data.id);
54936		let value, rotation;
54937		if (storageEntry) {
54938			value = storageEntry.formattedValue || storageEntry.value;
54939			rotation = storageEntry.rotation;
54940		}
54941		if (rotation === undefined && value === undefined && !this._needAppearances) {
54942			if (!this._hasValueFromXFA || this.appearance) {
54943				return null;
54944			}
54945		}
54946		const colors = this.getBorderAndBackgroundAppearances(annotationStorage);
54947		if (value === undefined) {
54948			value = this.data.fieldValue;
54949			if (!value) {
54950				return `/Tx BMC q ${colors}Q EMC`;
54951			}
54952		}
54953		if (Array.isArray(value) && value.length === 1) {
54954			value = value[0];
54955		}
54956		assert(typeof value === "string", "Expected `value` to be a string.");
54957		value = value.trimEnd();
54958		if (this.data.combo) {
54959			const option = this.data.options.find(({
54960				exportValue
54961			}) => value === exportValue);
54962			value = option?.displayValue || value;
54963		}
54964		if (value === "") {
54965			return `/Tx BMC q ${colors}Q EMC`;
54966		}
54967		if (rotation === undefined) {
54968			rotation = this.rotation;
54969		}
54970		let lineCount = -1;
54971		let lines;
54972		if (this.data.multiLine) {
54973			lines = value.split(/\r\n?|\n/).map(line => line.normalize("NFC"));
54974			lineCount = lines.length;
54975		} else {
54976			lines = [value.replace(/\r\n?|\n/, "").normalize("NFC")];
54977		}
54978		const defaultPadding = 1;
54979		const defaultHPadding = 2;
54980		let totalHeight = this.data.rect[3] - this.data.rect[1];
54981		let totalWidth = this.data.rect[2] - this.data.rect[0];
54982		if (rotation === 90 || rotation === 270) {
54983			[totalWidth, totalHeight] = [totalHeight, totalWidth];
54984		}
54985		if (!this._defaultAppearance) {
54986			this.data.defaultAppearanceData = parseDefaultAppearance(this._defaultAppearance = "/Helvetica 0 Tf 0 g");
54987		}
54988		let font = await WidgetAnnotation._getFontData(evaluator, task, this.data.defaultAppearanceData, this._fieldResources.mergedResources);
54989		let defaultAppearance, fontSize, lineHeight;
54990		const encodedLines = [];
54991		let encodingError = false;
54992		for (const line of lines) {
54993			const encodedString = font.encodeString(line);
54994			if (encodedString.length > 1) {
54995				encodingError = true;
54996			}
54997			encodedLines.push(encodedString.join(""));
54998		}
54999		if (encodingError && intent & RenderingIntentFlag.SAVE) {
55000			return {
55001				needAppearances: true
55002			};
55003		}
55004		if (encodingError && this._isOffscreenCanvasSupported) {
55005			const fontFamily = this.data.comb ? "monospace" : "sans-serif";
55006			const fakeUnicodeFont = new FakeUnicodeFont(evaluator.xref, fontFamily);
55007			const resources = fakeUnicodeFont.createFontResources(lines.join(""));
55008			const newFont = resources.getRaw("Font");
55009			if (this._fieldResources.mergedResources.has("Font")) {
55010				const oldFont = this._fieldResources.mergedResources.get("Font");
55011				for (const key of newFont.getKeys()) {
55012					oldFont.set(key, newFont.getRaw(key));
55013				}
55014			} else {
55015				this._fieldResources.mergedResources.set("Font", newFont);
55016			}
55017			const fontName = fakeUnicodeFont.fontName.name;
55018			font = await WidgetAnnotation._getFontData(evaluator, task, {
55019				fontName,
55020				fontSize: 0
55021			}, resources);
55022			for (let i = 0, ii = encodedLines.length; i < ii; i++) {
55023				encodedLines[i] = stringToUTF16String(lines[i]);
55024			}
55025			const savedDefaultAppearance = Object.assign(Object.create(null), this.data.defaultAppearanceData);
55026			this.data.defaultAppearanceData.fontSize = 0;
55027			this.data.defaultAppearanceData.fontName = fontName;
55028			[defaultAppearance, fontSize, lineHeight] = this._computeFontSize(totalHeight - 2 * defaultPadding, totalWidth - 2 * defaultHPadding, value, font, lineCount);
55029			this.data.defaultAppearanceData = savedDefaultAppearance;
55030		} else {
55031			if (!this._isOffscreenCanvasSupported) {
55032				warn("_getAppearance: OffscreenCanvas is not supported, annotation may not render correctly.");
55033			}
55034			[defaultAppearance, fontSize, lineHeight] = this._computeFontSize(totalHeight - 2 * defaultPadding, totalWidth - 2 * defaultHPadding, value, font, lineCount);
55035		}
55036		let descent = font.descent;
55037		if (isNaN(descent)) {
55038			descent = BASELINE_FACTOR * lineHeight;
55039		} else {
55040			descent = Math.max(BASELINE_FACTOR * lineHeight, Math.abs(descent) * fontSize);
55041		}
55042		const defaultVPadding = Math.min(Math.floor((totalHeight - fontSize) / 2), defaultPadding);
55043		const alignment = this.data.textAlignment;
55044		if (this.data.multiLine) {
55045			return this._getMultilineAppearance(defaultAppearance, encodedLines, font, fontSize, totalWidth, totalHeight, alignment, defaultHPadding, defaultVPadding, descent, lineHeight, annotationStorage);
55046		}
55047		if (this.data.comb) {
55048			return this._getCombAppearance(defaultAppearance, font, encodedLines[0], fontSize, totalWidth, totalHeight, defaultHPadding, defaultVPadding, descent, lineHeight, annotationStorage);
55049		}
55050		const bottomPadding = defaultVPadding + descent;
55051		if (alignment === 0 || alignment > 2) {
55052			return `/Tx BMC q ${colors}BT ` + defaultAppearance + ` 1 0 0 1 ${numberToString(defaultHPadding)} ${numberToString(bottomPadding)} Tm (${escapeString(encodedLines[0])}) Tj` + " ET Q EMC";
55053		}
55054		const prevInfo = {
55055			shift: 0
55056		};
55057		const renderedText = this._renderText(encodedLines[0], font, fontSize, totalWidth, alignment, prevInfo, defaultHPadding, bottomPadding);
55058		return `/Tx BMC q ${colors}BT ` + defaultAppearance + ` 1 0 0 1 0 0 Tm ${renderedText}` + " ET Q EMC";
55059	}
55060	static async _getFontData(evaluator, task, appearanceData, resources) {
55061		const operatorList = new OperatorList();
55062		const initialState = {
55063			font: null,
55064			clone() {
55065				return this;
55066			}
55067		};
55068		const {
55069			fontName,
55070			fontSize
55071		} = appearanceData;
55072		await evaluator.handleSetFont(resources, [fontName && Name.get(fontName), fontSize], null, operatorList, task, initialState, null);
55073		return initialState.font;
55074	}
55075	_getTextWidth(text, font) {
55076		return font.charsToGlyphs(text).reduce((width, glyph) => width + glyph.width, 0) / 1000;
55077	}
55078	_computeFontSize(height, width, text, font, lineCount) {
55079		let {
55080			fontSize
55081		} = this.data.defaultAppearanceData;
55082		let lineHeight = (fontSize || 12) * LINE_FACTOR,
55083			numberOfLines = Math.round(height / lineHeight);
55084		if (!fontSize) {
55085			const roundWithTwoDigits = x => Math.floor(x * 100) / 100;
55086			if (lineCount === -1) {
55087				const textWidth = this._getTextWidth(text, font);
55088				fontSize = roundWithTwoDigits(Math.min(height / LINE_FACTOR, width / textWidth));
55089				numberOfLines = 1;
55090			} else {
55091				const lines = text.split(/\r\n?|\n/);
55092				const cachedLines = [];
55093				for (const line of lines) {
55094					const encoded = font.encodeString(line).join("");
55095					const glyphs = font.charsToGlyphs(encoded);
55096					const positions = font.getCharPositions(encoded);
55097					cachedLines.push({
55098						line: encoded,
55099						glyphs,
55100						positions
55101					});
55102				}
55103				const isTooBig = fsize => {
55104					let totalHeight = 0;
55105					for (const cache of cachedLines) {
55106						const chunks = this._splitLine(null, font, fsize, width, cache);
55107						totalHeight += chunks.length * fsize;
55108						if (totalHeight > height) {
55109							return true;
55110						}
55111					}
55112					return false;
55113				};
55114				numberOfLines = Math.max(numberOfLines, lineCount);
55115				while (true) {
55116					lineHeight = height / numberOfLines;
55117					fontSize = roundWithTwoDigits(lineHeight / LINE_FACTOR);
55118					if (isTooBig(fontSize)) {
55119						numberOfLines++;
55120						continue;
55121					}
55122					break;
55123				}
55124			}
55125			const {
55126				fontName,
55127				fontColor
55128			} = this.data.defaultAppearanceData;
55129			this._defaultAppearance = createDefaultAppearance({
55130				fontSize,
55131				fontName,
55132				fontColor
55133			});
55134		}
55135		return [this._defaultAppearance, fontSize, height / numberOfLines];
55136	}
55137	_renderText(text, font, fontSize, totalWidth, alignment, prevInfo, hPadding, vPadding) {
55138		let shift;
55139		if (alignment === 1) {
55140			const width = this._getTextWidth(text, font) * fontSize;
55141			shift = (totalWidth - width) / 2;
55142		} else if (alignment === 2) {
55143			const width = this._getTextWidth(text, font) * fontSize;
55144			shift = totalWidth - width - hPadding;
55145		} else {
55146			shift = hPadding;
55147		}
55148		const shiftStr = numberToString(shift - prevInfo.shift);
55149		prevInfo.shift = shift;
55150		vPadding = numberToString(vPadding);
55151		return `${shiftStr} ${vPadding} Td (${escapeString(text)}) Tj`;
55152	}
55153	_getSaveFieldResources(xref) {
55154		const {
55155			localResources,
55156			appearanceResources,
55157			acroFormResources
55158		} = this._fieldResources;
55159		const fontName = this.data.defaultAppearanceData?.fontName;
55160		if (!fontName) {
55161			return localResources || Dict.empty;
55162		}
55163		for (const resources of [localResources, appearanceResources]) {
55164			if (resources instanceof Dict) {
55165				const localFont = resources.get("Font");
55166				if (localFont instanceof Dict && localFont.has(fontName)) {
55167					return resources;
55168				}
55169			}
55170		}
55171		if (acroFormResources instanceof Dict) {
55172			const acroFormFont = acroFormResources.get("Font");
55173			if (acroFormFont instanceof Dict && acroFormFont.has(fontName)) {
55174				const subFontDict = new Dict(xref);
55175				subFontDict.set(fontName, acroFormFont.getRaw(fontName));
55176				const subResourcesDict = new Dict(xref);
55177				subResourcesDict.set("Font", subFontDict);
55178				return Dict.merge({
55179					xref,
55180					dictArray: [subResourcesDict, localResources],
55181					mergeSubDicts: true
55182				});
55183			}
55184		}
55185		return localResources || Dict.empty;
55186	}
55187	getFieldObject() {
55188		return null;
55189	}
55190}
55191class TextWidgetAnnotation extends WidgetAnnotation {
55192	constructor(params) {
55193		super(params);
55194		const {
55195			dict
55196		} = params;
55197		if (dict.has("PMD")) {
55198			this.flags |= AnnotationFlag.HIDDEN;
55199			this.data.hidden = true;
55200			warn("Barcodes are not supported");
55201		}
55202		this.data.hasOwnCanvas = this.data.readOnly && !this.data.noHTML;
55203		this._hasText = true;
55204		if (typeof this.data.fieldValue !== "string") {
55205			this.data.fieldValue = "";
55206		}
55207		let alignment = getInheritableProperty({
55208			dict,
55209			key: "Q"
55210		});
55211		if (!Number.isInteger(alignment) || alignment < 0 || alignment > 2) {
55212			alignment = null;
55213		}
55214		this.data.textAlignment = alignment;
55215		let maximumLength = getInheritableProperty({
55216			dict,
55217			key: "MaxLen"
55218		});
55219		if (!Number.isInteger(maximumLength) || maximumLength < 0) {
55220			maximumLength = 0;
55221		}
55222		this.data.maxLen = maximumLength;
55223		this.data.multiLine = this.hasFieldFlag(AnnotationFieldFlag.MULTILINE);
55224		this.data.comb = this.hasFieldFlag(AnnotationFieldFlag.COMB) && !this.hasFieldFlag(AnnotationFieldFlag.MULTILINE) && !this.hasFieldFlag(AnnotationFieldFlag.PASSWORD) && !this.hasFieldFlag(AnnotationFieldFlag.FILESELECT) && this.data.maxLen !== 0;
55225		this.data.doNotScroll = this.hasFieldFlag(AnnotationFieldFlag.DONOTSCROLL);
55226	}
55227	get hasTextContent() {
55228		return !!this.appearance && !this._needAppearances;
55229	}
55230	_getCombAppearance(defaultAppearance, font, text, fontSize, width, height, hPadding, vPadding, descent, lineHeight, annotationStorage) {
55231		const combWidth = width / this.data.maxLen;
55232		const colors = this.getBorderAndBackgroundAppearances(annotationStorage);
55233		const buf = [];
55234		const positions = font.getCharPositions(text);
55235		for (const [start, end] of positions) {
55236			buf.push(`(${escapeString(text.substring(start, end))}) Tj`);
55237		}
55238		const renderedComb = buf.join(` ${numberToString(combWidth)} 0 Td `);
55239		return `/Tx BMC q ${colors}BT ` + defaultAppearance + ` 1 0 0 1 ${numberToString(hPadding)} ${numberToString(vPadding + descent)} Tm ${renderedComb}` + " ET Q EMC";
55240	}
55241	_getMultilineAppearance(defaultAppearance, lines, font, fontSize, width, height, alignment, hPadding, vPadding, descent, lineHeight, annotationStorage) {
55242		const buf = [];
55243		const totalWidth = width - 2 * hPadding;
55244		const prevInfo = {
55245			shift: 0
55246		};
55247		for (let i = 0, ii = lines.length; i < ii; i++) {
55248			const line = lines[i];
55249			const chunks = this._splitLine(line, font, fontSize, totalWidth);
55250			for (let j = 0, jj = chunks.length; j < jj; j++) {
55251				const chunk = chunks[j];
55252				const vShift = i === 0 && j === 0 ? -vPadding - (lineHeight - descent) : -lineHeight;
55253				buf.push(this._renderText(chunk, font, fontSize, width, alignment, prevInfo, hPadding, vShift));
55254			}
55255		}
55256		const colors = this.getBorderAndBackgroundAppearances(annotationStorage);
55257		const renderedText = buf.join("\n");
55258		return `/Tx BMC q ${colors}BT ` + defaultAppearance + ` 1 0 0 1 0 ${numberToString(height)} Tm ${renderedText}` + " ET Q EMC";
55259	}
55260	_splitLine(line, font, fontSize, width, cache = {}) {
55261		line = cache.line || line;
55262		const glyphs = cache.glyphs || font.charsToGlyphs(line);
55263		if (glyphs.length <= 1) {
55264			return [line];
55265		}
55266		const positions = cache.positions || font.getCharPositions(line);
55267		const scale = fontSize / 1000;
55268		const chunks = [];
55269		let lastSpacePosInStringStart = -1,
55270			lastSpacePosInStringEnd = -1,
55271			lastSpacePos = -1,
55272			startChunk = 0,
55273			currentWidth = 0;
55274		for (let i = 0, ii = glyphs.length; i < ii; i++) {
55275			const [start, end] = positions[i];
55276			const glyph = glyphs[i];
55277			const glyphWidth = glyph.width * scale;
55278			if (glyph.unicode === " ") {
55279				if (currentWidth + glyphWidth > width) {
55280					chunks.push(line.substring(startChunk, start));
55281					startChunk = start;
55282					currentWidth = glyphWidth;
55283					lastSpacePosInStringStart = -1;
55284					lastSpacePos = -1;
55285				} else {
55286					currentWidth += glyphWidth;
55287					lastSpacePosInStringStart = start;
55288					lastSpacePosInStringEnd = end;
55289					lastSpacePos = i;
55290				}
55291			} else if (currentWidth + glyphWidth > width) {
55292				if (lastSpacePosInStringStart !== -1) {
55293					chunks.push(line.substring(startChunk, lastSpacePosInStringEnd));
55294					startChunk = lastSpacePosInStringEnd;
55295					i = lastSpacePos + 1;
55296					lastSpacePosInStringStart = -1;
55297					currentWidth = 0;
55298				} else {
55299					chunks.push(line.substring(startChunk, start));
55300					startChunk = start;
55301					currentWidth = glyphWidth;
55302				}
55303			} else {
55304				currentWidth += glyphWidth;
55305			}
55306		}
55307		if (startChunk < line.length) {
55308			chunks.push(line.substring(startChunk, line.length));
55309		}
55310		return chunks;
55311	}
55312	async extractTextContent(evaluator, task, viewBox) {
55313		await super.extractTextContent(evaluator, task, viewBox);
55314		const text = this.data.textContent;
55315		if (!text) {
55316			return;
55317		}
55318		const allText = text.join("\n");
55319		if (allText === this.data.fieldValue) {
55320			return;
55321		}
55322		const regex = allText.replaceAll(/([.*+?^${}()|[\]\\])|(\s+)/g, (_m, p1) => p1 ? `\\${p1}` : "\\s+");
55323		if (new RegExp(`^\\s*${regex}\\s*$`).test(this.data.fieldValue)) {
55324			this.data.textContent = this.data.fieldValue.split("\n");
55325		}
55326	}
55327	getFieldObject() {
55328		return {
55329			id: this.data.id,
55330			value: this.data.fieldValue,
55331			defaultValue: this.data.defaultFieldValue || "",
55332			multiline: this.data.multiLine,
55333			password: this.hasFieldFlag(AnnotationFieldFlag.PASSWORD),
55334			charLimit: this.data.maxLen,
55335			comb: this.data.comb,
55336			editable: !this.data.readOnly,
55337			hidden: this.data.hidden,
55338			name: this.data.fieldName,
55339			rect: this.data.rect,
55340			actions: this.data.actions,
55341			page: this.data.pageIndex,
55342			strokeColor: this.data.borderColor,
55343			fillColor: this.data.backgroundColor,
55344			rotation: this.rotation,
55345			type: "text"
55346		};
55347	}
55348}
55349class ButtonWidgetAnnotation extends WidgetAnnotation {
55350	constructor(params) {
55351		super(params);
55352		this.checkedAppearance = null;
55353		this.uncheckedAppearance = null;
55354		this.data.checkBox = !this.hasFieldFlag(AnnotationFieldFlag.RADIO) && !this.hasFieldFlag(AnnotationFieldFlag.PUSHBUTTON);
55355		this.data.radioButton = this.hasFieldFlag(AnnotationFieldFlag.RADIO) && !this.hasFieldFlag(AnnotationFieldFlag.PUSHBUTTON);
55356		this.data.pushButton = this.hasFieldFlag(AnnotationFieldFlag.PUSHBUTTON);
55357		this.data.isTooltipOnly = false;
55358		if (this.data.checkBox) {
55359			this._processCheckBox(params);
55360		} else if (this.data.radioButton) {
55361			this._processRadioButton(params);
55362		} else if (this.data.pushButton) {
55363			this.data.hasOwnCanvas = true;
55364			this.data.noHTML = false;
55365			this._processPushButton(params);
55366		} else {
55367			warn("Invalid field flags for button widget annotation");
55368		}
55369	}
55370	async getOperatorList(evaluator, task, intent, annotationStorage) {
55371		if (this.data.pushButton) {
55372			return super.getOperatorList(evaluator, task, intent, false, annotationStorage);
55373		}
55374		let value = null;
55375		let rotation = null;
55376		if (annotationStorage) {
55377			const storageEntry = annotationStorage.get(this.data.id);
55378			value = storageEntry ? storageEntry.value : null;
55379			rotation = storageEntry ? storageEntry.rotation : null;
55380		}
55381		if (value === null && this.appearance) {
55382			return super.getOperatorList(evaluator, task, intent, annotationStorage);
55383		}
55384		if (value === null || value === undefined) {
55385			value = this.data.checkBox ? this.data.fieldValue === this.data.exportValue : this.data.fieldValue === this.data.buttonValue;
55386		}
55387		const appearance = value ? this.checkedAppearance : this.uncheckedAppearance;
55388		if (appearance) {
55389			const savedAppearance = this.appearance;
55390			const savedMatrix = lookupMatrix(appearance.dict.getArray("Matrix"), IDENTITY_MATRIX);
55391			if (rotation) {
55392				appearance.dict.set("Matrix", this.getRotationMatrix(annotationStorage));
55393			}
55394			this.appearance = appearance;
55395			const operatorList = super.getOperatorList(evaluator, task, intent, annotationStorage);
55396			this.appearance = savedAppearance;
55397			appearance.dict.set("Matrix", savedMatrix);
55398			return operatorList;
55399		}
55400		return {
55401			opList: new OperatorList(),
55402			separateForm: false,
55403			separateCanvas: false
55404		};
55405	}
55406	async save(evaluator, task, annotationStorage, changes) {
55407		if (this.data.checkBox) {
55408			this._saveCheckbox(evaluator, task, annotationStorage, changes);
55409			return;
55410		}
55411		if (this.data.radioButton) {
55412			this._saveRadioButton(evaluator, task, annotationStorage, changes);
55413		}
55414	}
55415	async _saveCheckbox(evaluator, task, annotationStorage, changes) {
55416		if (!annotationStorage) {
55417			return;
55418		}
55419		const storageEntry = annotationStorage.get(this.data.id);
55420		const flags = this._buildFlags(storageEntry?.noView, storageEntry?.noPrint);
55421		let rotation = storageEntry?.rotation,
55422			value = storageEntry?.value;
55423		if (rotation === undefined && flags === undefined) {
55424			if (value === undefined) {
55425				return;
55426			}
55427			const defaultValue = this.data.fieldValue === this.data.exportValue;
55428			if (defaultValue === value) {
55429				return;
55430			}
55431		}
55432		let dict = evaluator.xref.fetchIfRef(this.ref);
55433		if (!(dict instanceof Dict)) {
55434			return;
55435		}
55436		dict = dict.clone();
55437		if (rotation === undefined) {
55438			rotation = this.rotation;
55439		}
55440		if (value === undefined) {
55441			value = this.data.fieldValue === this.data.exportValue;
55442		}
55443		const xfa = {
55444			path: this.data.fieldName,
55445			value: value ? this.data.exportValue : ""
55446		};
55447		const name = Name.get(value ? this.data.exportValue : "Off");
55448		this.setValue(dict, name, evaluator.xref, changes);
55449		dict.set("AS", name);
55450		dict.set("M", `D:${getModificationDate()}`);
55451		if (flags !== undefined) {
55452			dict.set("F", flags);
55453		}
55454		const maybeMK = this._getMKDict(rotation);
55455		if (maybeMK) {
55456			dict.set("MK", maybeMK);
55457		}
55458		changes.put(this.ref, {
55459			data: dict,
55460			xfa,
55461			needAppearances: false
55462		});
55463	}
55464	async _saveRadioButton(evaluator, task, annotationStorage, changes) {
55465		if (!annotationStorage) {
55466			return;
55467		}
55468		const storageEntry = annotationStorage.get(this.data.id);
55469		const flags = this._buildFlags(storageEntry?.noView, storageEntry?.noPrint);
55470		let rotation = storageEntry?.rotation,
55471			value = storageEntry?.value;
55472		if (rotation === undefined && flags === undefined) {
55473			if (value === undefined) {
55474				return;
55475			}
55476			const defaultValue = this.data.fieldValue === this.data.buttonValue;
55477			if (defaultValue === value) {
55478				return;
55479			}
55480		}
55481		let dict = evaluator.xref.fetchIfRef(this.ref);
55482		if (!(dict instanceof Dict)) {
55483			return;
55484		}
55485		dict = dict.clone();
55486		if (value === undefined) {
55487			value = this.data.fieldValue === this.data.buttonValue;
55488		}
55489		if (rotation === undefined) {
55490			rotation = this.rotation;
55491		}
55492		const xfa = {
55493			path: this.data.fieldName,
55494			value: value ? this.data.buttonValue : ""
55495		};
55496		const name = Name.get(value ? this.data.buttonValue : "Off");
55497		if (value) {
55498			this.setValue(dict, name, evaluator.xref, changes);
55499		}
55500		dict.set("AS", name);
55501		dict.set("M", `D:${getModificationDate()}`);
55502		if (flags !== undefined) {
55503			dict.set("F", flags);
55504		}
55505		const maybeMK = this._getMKDict(rotation);
55506		if (maybeMK) {
55507			dict.set("MK", maybeMK);
55508		}
55509		changes.put(this.ref, {
55510			data: dict,
55511			xfa,
55512			needAppearances: false
55513		});
55514	}
55515	_getDefaultCheckedAppearance(params, type) {
55516		const width = this.data.rect[2] - this.data.rect[0];
55517		const height = this.data.rect[3] - this.data.rect[1];
55518		const bbox = [0, 0, width, height];
55519		const FONT_RATIO = 0.8;
55520		const fontSize = Math.min(width, height) * FONT_RATIO;
55521		let metrics, char;
55522		if (type === "check") {
55523			metrics = {
55524				width: 0.755 * fontSize,
55525				height: 0.705 * fontSize
55526			};
55527			char = "\x33";
55528		} else if (type === "disc") {
55529			metrics = {
55530				width: 0.791 * fontSize,
55531				height: 0.705 * fontSize
55532			};
55533			char = "\x6C";
55534		} else {
55535			unreachable(`_getDefaultCheckedAppearance - unsupported type: ${type}`);
55536		}
55537		const xShift = numberToString((width - metrics.width) / 2);
55538		const yShift = numberToString((height - metrics.height) / 2);
55539		const appearance = `q BT /PdfJsZaDb ${fontSize} Tf 0 g ${xShift} ${yShift} Td (${char}) Tj ET Q`;
55540		const appearanceStreamDict = new Dict(params.xref);
55541		appearanceStreamDict.set("FormType", 1);
55542		appearanceStreamDict.set("Subtype", Name.get("Form"));
55543		appearanceStreamDict.set("Type", Name.get("XObject"));
55544		appearanceStreamDict.set("BBox", bbox);
55545		appearanceStreamDict.set("Matrix", [1, 0, 0, 1, 0, 0]);
55546		appearanceStreamDict.set("Length", appearance.length);
55547		const resources = new Dict(params.xref);
55548		const font = new Dict(params.xref);
55549		font.set("PdfJsZaDb", this.fallbackFontDict);
55550		resources.set("Font", font);
55551		appearanceStreamDict.set("Resources", resources);
55552		this.checkedAppearance = new StringStream(appearance);
55553		this.checkedAppearance.dict = appearanceStreamDict;
55554		this._streams.push(this.checkedAppearance);
55555	}
55556	_processCheckBox(params) {
55557		const customAppearance = params.dict.get("AP");
55558		if (!(customAppearance instanceof Dict)) {
55559			return;
55560		}
55561		const normalAppearance = customAppearance.get("N");
55562		if (!(normalAppearance instanceof Dict)) {
55563			return;
55564		}
55565		const asValue = this._decodeFormValue(params.dict.get("AS"));
55566		if (typeof asValue === "string") {
55567			this.data.fieldValue = asValue;
55568		}
55569		const yes = this.data.fieldValue !== null && this.data.fieldValue !== "Off" ? this.data.fieldValue : "Yes";
55570		const exportValues = normalAppearance.getKeys();
55571		if (exportValues.length === 0) {
55572			exportValues.push("Off", yes);
55573		} else if (exportValues.length === 1) {
55574			if (exportValues[0] === "Off") {
55575				exportValues.push(yes);
55576			} else {
55577				exportValues.unshift("Off");
55578			}
55579		} else if (exportValues.includes(yes)) {
55580			exportValues.length = 0;
55581			exportValues.push("Off", yes);
55582		} else {
55583			const otherYes = exportValues.find(v => v !== "Off");
55584			exportValues.length = 0;
55585			exportValues.push("Off", otherYes);
55586		}
55587		if (!exportValues.includes(this.data.fieldValue)) {
55588			this.data.fieldValue = "Off";
55589		}
55590		this.data.exportValue = exportValues[1];
55591		const checkedAppearance = normalAppearance.get(this.data.exportValue);
55592		this.checkedAppearance = checkedAppearance instanceof BaseStream ? checkedAppearance : null;
55593		const uncheckedAppearance = normalAppearance.get("Off");
55594		this.uncheckedAppearance = uncheckedAppearance instanceof BaseStream ? uncheckedAppearance : null;
55595		if (this.checkedAppearance) {
55596			this._streams.push(this.checkedAppearance);
55597		} else {
55598			this._getDefaultCheckedAppearance(params, "check");
55599		}
55600		if (this.uncheckedAppearance) {
55601			this._streams.push(this.uncheckedAppearance);
55602		}
55603		this._fallbackFontDict = this.fallbackFontDict;
55604		if (this.data.defaultFieldValue === null) {
55605			this.data.defaultFieldValue = "Off";
55606		}
55607	}
55608	_processRadioButton(params) {
55609		this.data.buttonValue = null;
55610		const fieldParent = params.dict.get("Parent");
55611		if (fieldParent instanceof Dict) {
55612			this.parent = params.dict.getRaw("Parent");
55613			const fieldParentValue = fieldParent.get("V");
55614			if (fieldParentValue instanceof Name) {
55615				this.data.fieldValue = this._decodeFormValue(fieldParentValue);
55616			}
55617		}
55618		const appearanceStates = params.dict.get("AP");
55619		if (!(appearanceStates instanceof Dict)) {
55620			return;
55621		}
55622		const normalAppearance = appearanceStates.get("N");
55623		if (!(normalAppearance instanceof Dict)) {
55624			return;
55625		}
55626		for (const key of normalAppearance.getKeys()) {
55627			if (key !== "Off") {
55628				this.data.buttonValue = this._decodeFormValue(key);
55629				break;
55630			}
55631		}
55632		const checkedAppearance = normalAppearance.get(this.data.buttonValue);
55633		this.checkedAppearance = checkedAppearance instanceof BaseStream ? checkedAppearance : null;
55634		const uncheckedAppearance = normalAppearance.get("Off");
55635		this.uncheckedAppearance = uncheckedAppearance instanceof BaseStream ? uncheckedAppearance : null;
55636		if (this.checkedAppearance) {
55637			this._streams.push(this.checkedAppearance);
55638		} else {
55639			this._getDefaultCheckedAppearance(params, "disc");
55640		}
55641		if (this.uncheckedAppearance) {
55642			this._streams.push(this.uncheckedAppearance);
55643		}
55644		this._fallbackFontDict = this.fallbackFontDict;
55645		if (this.data.defaultFieldValue === null) {
55646			this.data.defaultFieldValue = "Off";
55647		}
55648	}
55649	_processPushButton(params) {
55650		const {
55651			dict,
55652			annotationGlobals
55653		} = params;
55654		if (!dict.has("A") && !dict.has("AA") && !this.data.alternativeText) {
55655			warn("Push buttons without action dictionaries are not supported");
55656			return;
55657		}
55658		this.data.isTooltipOnly = !dict.has("A") && !dict.has("AA");
55659		Catalog.parseDestDictionary({
55660			destDict: dict,
55661			resultObj: this.data,
55662			docBaseUrl: annotationGlobals.baseUrl,
55663			docAttachments: annotationGlobals.attachments
55664		});
55665	}
55666	getFieldObject() {
55667		let type = "button";
55668		let exportValues;
55669		if (this.data.checkBox) {
55670			type = "checkbox";
55671			exportValues = this.data.exportValue;
55672		} else if (this.data.radioButton) {
55673			type = "radiobutton";
55674			exportValues = this.data.buttonValue;
55675		}
55676		return {
55677			id: this.data.id,
55678			value: this.data.fieldValue || "Off",
55679			defaultValue: this.data.defaultFieldValue,
55680			exportValues,
55681			editable: !this.data.readOnly,
55682			name: this.data.fieldName,
55683			rect: this.data.rect,
55684			hidden: this.data.hidden,
55685			actions: this.data.actions,
55686			page: this.data.pageIndex,
55687			strokeColor: this.data.borderColor,
55688			fillColor: this.data.backgroundColor,
55689			rotation: this.rotation,
55690			type
55691		};
55692	}
55693	get fallbackFontDict() {
55694		const dict = new Dict();
55695		dict.set("BaseFont", Name.get("ZapfDingbats"));
55696		dict.set("Type", Name.get("FallbackType"));
55697		dict.set("Subtype", Name.get("FallbackType"));
55698		dict.set("Encoding", Name.get("ZapfDingbatsEncoding"));
55699		return shadow(this, "fallbackFontDict", dict);
55700	}
55701}
55702class ChoiceWidgetAnnotation extends WidgetAnnotation {
55703	constructor(params) {
55704		super(params);
55705		const {
55706			dict,
55707			xref
55708		} = params;
55709		this.indices = dict.getArray("I");
55710		this.hasIndices = Array.isArray(this.indices) && this.indices.length > 0;
55711		this.data.options = [];
55712		const options = getInheritableProperty({
55713			dict,
55714			key: "Opt"
55715		});
55716		if (Array.isArray(options)) {
55717			for (let i = 0, ii = options.length; i < ii; i++) {
55718				const option = xref.fetchIfRef(options[i]);
55719				const isOptionArray = Array.isArray(option);
55720				this.data.options[i] = {
55721					exportValue: this._decodeFormValue(isOptionArray ? xref.fetchIfRef(option[0]) : option),
55722					displayValue: this._decodeFormValue(isOptionArray ? xref.fetchIfRef(option[1]) : option)
55723				};
55724			}
55725		}
55726		if (!this.hasIndices) {
55727			if (typeof this.data.fieldValue === "string") {
55728				this.data.fieldValue = [this.data.fieldValue];
55729			} else if (!this.data.fieldValue) {
55730				this.data.fieldValue = [];
55731			}
55732		} else {
55733			this.data.fieldValue = [];
55734			const ii = this.data.options.length;
55735			for (const i of this.indices) {
55736				if (Number.isInteger(i) && i >= 0 && i < ii) {
55737					this.data.fieldValue.push(this.data.options[i].exportValue);
55738				}
55739			}
55740		}
55741		if (this.data.options.length === 0 && this.data.fieldValue.length > 0) {
55742			this.data.options = this.data.fieldValue.map(value => ({
55743				exportValue: value,
55744				displayValue: value
55745			}));
55746		}
55747		this.data.combo = this.hasFieldFlag(AnnotationFieldFlag.COMBO);
55748		this.data.multiSelect = this.hasFieldFlag(AnnotationFieldFlag.MULTISELECT);
55749		this._hasText = true;
55750	}
55751	getFieldObject() {
55752		const type = this.data.combo ? "combobox" : "listbox";
55753		const value = this.data.fieldValue.length > 0 ? this.data.fieldValue[0] : null;
55754		return {
55755			id: this.data.id,
55756			value,
55757			defaultValue: this.data.defaultFieldValue,
55758			editable: !this.data.readOnly,
55759			name: this.data.fieldName,
55760			rect: this.data.rect,
55761			numItems: this.data.fieldValue.length,
55762			multipleSelection: this.data.multiSelect,
55763			hidden: this.data.hidden,
55764			actions: this.data.actions,
55765			items: this.data.options,
55766			page: this.data.pageIndex,
55767			strokeColor: this.data.borderColor,
55768			fillColor: this.data.backgroundColor,
55769			rotation: this.rotation,
55770			type
55771		};
55772	}
55773	amendSavedDict(annotationStorage, dict) {
55774		if (!this.hasIndices) {
55775			return;
55776		}
55777		let values = annotationStorage?.get(this.data.id)?.value;
55778		if (!Array.isArray(values)) {
55779			values = [values];
55780		}
55781		const indices = [];
55782		const {
55783			options
55784		} = this.data;
55785		for (let i = 0, j = 0, ii = options.length; i < ii; i++) {
55786			if (options[i].exportValue === values[j]) {
55787				indices.push(i);
55788				j += 1;
55789			}
55790		}
55791		dict.set("I", indices);
55792	}
55793	async _getAppearance(evaluator, task, intent, annotationStorage) {
55794		if (this.data.combo) {
55795			return super._getAppearance(evaluator, task, intent, annotationStorage);
55796		}
55797		let exportedValue, rotation;
55798		const storageEntry = annotationStorage?.get(this.data.id);
55799		if (storageEntry) {
55800			rotation = storageEntry.rotation;
55801			exportedValue = storageEntry.value;
55802		}
55803		if (rotation === undefined && exportedValue === undefined && !this._needAppearances) {
55804			return null;
55805		}
55806		if (exportedValue === undefined) {
55807			exportedValue = this.data.fieldValue;
55808		} else if (!Array.isArray(exportedValue)) {
55809			exportedValue = [exportedValue];
55810		}
55811		const defaultPadding = 1;
55812		const defaultHPadding = 2;
55813		let totalHeight = this.data.rect[3] - this.data.rect[1];
55814		let totalWidth = this.data.rect[2] - this.data.rect[0];
55815		if (rotation === 90 || rotation === 270) {
55816			[totalWidth, totalHeight] = [totalHeight, totalWidth];
55817		}
55818		const lineCount = this.data.options.length;
55819		const valueIndices = [];
55820		for (let i = 0; i < lineCount; i++) {
55821			const {
55822				exportValue
55823			} = this.data.options[i];
55824			if (exportedValue.includes(exportValue)) {
55825				valueIndices.push(i);
55826			}
55827		}
55828		if (!this._defaultAppearance) {
55829			this.data.defaultAppearanceData = parseDefaultAppearance(this._defaultAppearance = "/Helvetica 0 Tf 0 g");
55830		}
55831		const font = await WidgetAnnotation._getFontData(evaluator, task, this.data.defaultAppearanceData, this._fieldResources.mergedResources);
55832		let defaultAppearance;
55833		let {
55834			fontSize
55835		} = this.data.defaultAppearanceData;
55836		if (!fontSize) {
55837			const lineHeight = (totalHeight - defaultPadding) / lineCount;
55838			let lineWidth = -1;
55839			let value;
55840			for (const {
55841				displayValue
55842			} of this.data.options) {
55843				const width = this._getTextWidth(displayValue, font);
55844				if (width > lineWidth) {
55845					lineWidth = width;
55846					value = displayValue;
55847				}
55848			}
55849			[defaultAppearance, fontSize] = this._computeFontSize(lineHeight, totalWidth - 2 * defaultHPadding, value, font, -1);
55850		} else {
55851			defaultAppearance = this._defaultAppearance;
55852		}
55853		const lineHeight = fontSize * LINE_FACTOR;
55854		const vPadding = (lineHeight - fontSize) / 2;
55855		const numberOfVisibleLines = Math.floor(totalHeight / lineHeight);
55856		let firstIndex = 0;
55857		if (valueIndices.length > 0) {
55858			const minIndex = Math.min(...valueIndices);
55859			const maxIndex = Math.max(...valueIndices);
55860			firstIndex = Math.max(0, maxIndex - numberOfVisibleLines + 1);
55861			if (firstIndex > minIndex) {
55862				firstIndex = minIndex;
55863			}
55864		}
55865		const end = Math.min(firstIndex + numberOfVisibleLines + 1, lineCount);
55866		const buf = ["/Tx BMC q", `1 1 ${totalWidth} ${totalHeight} re W n`];
55867		if (valueIndices.length) {
55868			buf.push("0.600006 0.756866 0.854904 rg");
55869			for (const index of valueIndices) {
55870				if (firstIndex <= index && index < end) {
55871					buf.push(`1 ${totalHeight - (index - firstIndex + 1) * lineHeight} ${totalWidth} ${lineHeight} re f`);
55872				}
55873			}
55874		}
55875		buf.push("BT", defaultAppearance, `1 0 0 1 0 ${totalHeight} Tm`);
55876		const prevInfo = {
55877			shift: 0
55878		};
55879		for (let i = firstIndex; i < end; i++) {
55880			const {
55881				displayValue
55882			} = this.data.options[i];
55883			const vpadding = i === firstIndex ? vPadding : 0;
55884			buf.push(this._renderText(displayValue, font, fontSize, totalWidth, 0, prevInfo, defaultHPadding, -lineHeight + vpadding));
55885		}
55886		buf.push("ET Q EMC");
55887		return buf.join("\n");
55888	}
55889}
55890class SignatureWidgetAnnotation extends WidgetAnnotation {
55891	constructor(params) {
55892		super(params);
55893		this.data.fieldValue = null;
55894		this.data.hasOwnCanvas = this.data.noRotate;
55895		this.data.noHTML = !this.data.hasOwnCanvas;
55896	}
55897	getFieldObject() {
55898		return {
55899			id: this.data.id,
55900			value: null,
55901			page: this.data.pageIndex,
55902			type: "signature"
55903		};
55904	}
55905}
55906class TextAnnotation extends MarkupAnnotation {
55907	constructor(params) {
55908		const DEFAULT_ICON_SIZE = 22;
55909		super(params);
55910		this.data.noRotate = true;
55911		this.data.hasOwnCanvas = this.data.noRotate;
55912		this.data.noHTML = false;
55913		const {
55914			dict
55915		} = params;
55916		this.data.annotationType = AnnotationType.TEXT;
55917		if (this.data.hasAppearance) {
55918			this.data.name = "NoIcon";
55919		} else {
55920			this.data.rect[1] = this.data.rect[3] - DEFAULT_ICON_SIZE;
55921			this.data.rect[2] = this.data.rect[0] + DEFAULT_ICON_SIZE;
55922			this.data.name = dict.has("Name") ? dict.get("Name").name : "Note";
55923		}
55924		if (dict.has("State")) {
55925			this.data.state = dict.get("State") || null;
55926			this.data.stateModel = dict.get("StateModel") || null;
55927		} else {
55928			this.data.state = null;
55929			this.data.stateModel = null;
55930		}
55931	}
55932}
55933class LinkAnnotation extends Annotation {
55934	constructor(params) {
55935		super(params);
55936		const {
55937			dict,
55938			annotationGlobals
55939		} = params;
55940		this.data.annotationType = AnnotationType.LINK;
55941		this.data.noHTML = false;
vendor: 4,742 bytes, lines 55942-56108
55942		const quadPoints = getQuadPoints(dict, this.rectangle);
55943		if (quadPoints) {
55944			this.data.quadPoints = quadPoints;
55945		}
55946		this.data.borderColor ||= this.data.color;
55947		Catalog.parseDestDictionary({
55948			destDict: dict,
55949			resultObj: this.data,
55950			docBaseUrl: annotationGlobals.baseUrl,
55951			docAttachments: annotationGlobals.attachments
55952		});
55953	}
55954}
55955class PopupAnnotation extends Annotation {
55956	constructor(params) {
55957		super(params);
55958		const {
55959			dict
55960		} = params;
55961		this.data.annotationType = AnnotationType.POPUP;
55962		this.data.noHTML = false;
55963		if (this.data.rect[0] === this.data.rect[2] || this.data.rect[1] === this.data.rect[3]) {
55964			this.data.rect = null;
55965		}
55966		let parentItem = dict.get("Parent");
55967		if (!parentItem) {
55968			warn("Popup annotation has a missing or invalid parent annotation.");
55969			return;
55970		}
55971		this.data.parentRect = lookupNormalRect(parentItem.getArray("Rect"), null);
55972		const rt = parentItem.get("RT");
55973		if (isName(rt, AnnotationReplyType.GROUP)) {
55974			parentItem = parentItem.get("IRT");
55975		}
55976		if (!parentItem.has("M")) {
55977			this.data.modificationDate = null;
55978		} else {
55979			this.setModificationDate(parentItem.get("M"));
55980			this.data.modificationDate = this.modificationDate;
55981		}
55982		if (!parentItem.has("C")) {
55983			this.data.color = null;
55984		} else {
55985			this.setColor(parentItem.getArray("C"));
55986			this.data.color = this.color;
55987		}
55988		if (!this.viewable) {
55989			const parentFlags = parentItem.get("F");
55990			if (this._isViewable(parentFlags)) {
55991				this.setFlags(parentFlags);
55992			}
55993		}
55994		this.setTitle(parentItem.get("T"));
55995		this.data.titleObj = this._title;
55996		this.setContents(parentItem.get("Contents"));
55997		this.data.contentsObj = this._contents;
55998		if (parentItem.has("RC")) {
55999			this.data.richText = XFAFactory.getRichTextAsHtml(parentItem.get("RC"));
56000		}
56001		this.data.open = !!dict.get("Open");
56002	}
56003}
56004class FreeTextAnnotation extends MarkupAnnotation {
56005	constructor(params) {
56006		super(params);
56007		this.data.hasOwnCanvas = this.data.noRotate;
56008		this.data.isEditable = !this.data.noHTML;
56009		this.data.noHTML = false;
56010		const {
56011			evaluatorOptions,
56012			xref
56013		} = params;
56014		this.data.annotationType = AnnotationType.FREETEXT;
56015		this.setDefaultAppearance(params);
56016		this._hasAppearance = !!this.appearance;
56017		if (this._hasAppearance) {
56018			const {
56019				fontColor,
56020				fontSize
56021			} = parseAppearanceStream(this.appearance, evaluatorOptions, xref);
56022			this.data.defaultAppearanceData.fontColor = fontColor;
56023			this.data.defaultAppearanceData.fontSize = fontSize || 10;
56024		} else {
56025			this.data.defaultAppearanceData.fontSize ||= 10;
56026			const {
56027				fontColor,
56028				fontSize
56029			} = this.data.defaultAppearanceData;
56030			if (this._contents.str) {
56031				this.data.textContent = this._contents.str.split(/\r\n?|\n/).map(line => line.trimEnd());
56032				const {
56033					coords,
56034					bbox,
56035					matrix
56036				} = FakeUnicodeFont.getFirstPositionInfo(this.rectangle, this.rotation, fontSize);
56037				this.data.textPosition = this._transformPoint(coords, bbox, matrix);
56038			}
56039			if (this._isOffscreenCanvasSupported) {
56040				const strokeAlpha = params.dict.get("CA");
56041				const fakeUnicodeFont = new FakeUnicodeFont(xref, "sans-serif");
56042				this.appearance = fakeUnicodeFont.createAppearance(this._contents.str, this.rectangle, this.rotation, fontSize, fontColor, strokeAlpha);
56043				this._streams.push(this.appearance);
56044			} else {
56045				warn("FreeTextAnnotation: OffscreenCanvas is not supported, annotation may not render correctly.");
56046			}
56047		}
56048	}
56049	get hasTextContent() {
56050		return this._hasAppearance;
56051	}
56052	static createNewDict(annotation, xref, {
56053		apRef,
56054		ap
56055	}) {
56056		const {
56057			color,
56058			fontSize,
56059			oldAnnotation,
56060			rect,
56061			rotation,
56062			user,
56063			value
56064		} = annotation;
56065		const freetext = oldAnnotation || new Dict(xref);
56066		freetext.set("Type", Name.get("Annot"));
56067		freetext.set("Subtype", Name.get("FreeText"));
56068		if (oldAnnotation) {
56069			freetext.set("M", `D:${getModificationDate()}`);
56070			freetext.delete("RC");
56071		} else {
56072			freetext.set("CreationDate", `D:${getModificationDate()}`);
56073		}
56074		freetext.set("Rect", rect);
56075		const da = `/Helv ${fontSize} Tf ${getPdfColor(color, true)}`;
56076		freetext.set("DA", da);
56077		freetext.set("Contents", stringToAsciiOrUTF16BE(value));
56078		freetext.set("F", 4);
56079		freetext.set("Border", [0, 0, 0]);
56080		freetext.set("Rotate", rotation);
56081		if (user) {
56082			freetext.set("T", stringToAsciiOrUTF16BE(user));
56083		}
56084		if (apRef || ap) {
56085			const n = new Dict(xref);
56086			freetext.set("AP", n);
56087			if (apRef) {
56088				n.set("N", apRef);
56089			} else {
56090				n.set("N", ap);
56091			}
56092		}
56093		return freetext;
56094	}
56095	static async createNewAppearanceStream(annotation, xref, params) {
56096		const {
56097			baseFontRef,
56098			evaluator,
56099			task
56100		} = params;
56101		const {
56102			color,
56103			fontSize,
56104			rect,
56105			rotation,
56106			value
56107		} = annotation;
56108		const resources = new Dict(xref);
vendor: 10,013 bytes, lines 56109-56403
56109		const font = new Dict(xref);
56110		if (baseFontRef) {
56111			font.set("Helv", baseFontRef);
56112		} else {
56113			const baseFont = new Dict(xref);
56114			baseFont.set("BaseFont", Name.get("Helvetica"));
56115			baseFont.set("Type", Name.get("Font"));
56116			baseFont.set("Subtype", Name.get("Type1"));
56117			baseFont.set("Encoding", Name.get("WinAnsiEncoding"));
56118			font.set("Helv", baseFont);
56119		}
56120		resources.set("Font", font);
56121		const helv = await WidgetAnnotation._getFontData(evaluator, task, {
56122			fontName: "Helv",
56123			fontSize
56124		}, resources);
56125		const [x1, y1, x2, y2] = rect;
56126		let w = x2 - x1;
56127		let h = y2 - y1;
56128		if (rotation % 180 !== 0) {
56129			[w, h] = [h, w];
56130		}
56131		const lines = value.split("\n");
56132		const scale = fontSize / 1000;
56133		let totalWidth = -Infinity;
56134		const encodedLines = [];
56135		for (let line of lines) {
56136			const encoded = helv.encodeString(line);
56137			if (encoded.length > 1) {
56138				return null;
56139			}
56140			line = encoded.join("");
56141			encodedLines.push(line);
56142			let lineWidth = 0;
56143			const glyphs = helv.charsToGlyphs(line);
56144			for (const glyph of glyphs) {
56145				lineWidth += glyph.width * scale;
56146			}
56147			totalWidth = Math.max(totalWidth, lineWidth);
56148		}
56149		let hscale = 1;
56150		if (totalWidth > w) {
56151			hscale = w / totalWidth;
56152		}
56153		let vscale = 1;
56154		const lineHeight = LINE_FACTOR * fontSize;
56155		const lineAscent = (LINE_FACTOR - LINE_DESCENT_FACTOR) * fontSize;
56156		const totalHeight = lineHeight * lines.length;
56157		if (totalHeight > h) {
56158			vscale = h / totalHeight;
56159		}
56160		const fscale = Math.min(hscale, vscale);
56161		const newFontSize = fontSize * fscale;
56162		let firstPoint, clipBox, matrix;
56163		switch (rotation) {
56164			case 0:
56165				matrix = [1, 0, 0, 1];
56166				clipBox = [rect[0], rect[1], w, h];
56167				firstPoint = [rect[0], rect[3] - lineAscent];
56168				break;
56169			case 90:
56170				matrix = [0, 1, -1, 0];
56171				clipBox = [rect[1], -rect[2], w, h];
56172				firstPoint = [rect[1], -rect[0] - lineAscent];
56173				break;
56174			case 180:
56175				matrix = [-1, 0, 0, -1];
56176				clipBox = [-rect[2], -rect[3], w, h];
56177				firstPoint = [-rect[2], -rect[1] - lineAscent];
56178				break;
56179			case 270:
56180				matrix = [0, -1, 1, 0];
56181				clipBox = [-rect[3], rect[0], w, h];
56182				firstPoint = [-rect[3], rect[2] - lineAscent];
56183				break;
56184		}
56185		const buffer = ["q", `${matrix.join(" ")} 0 0 cm`, `${clipBox.join(" ")} re W n`, `BT`, `${getPdfColor(color, true)}`, `0 Tc /Helv ${numberToString(newFontSize)} Tf`];
56186		buffer.push(`${firstPoint.join(" ")} Td (${escapeString(encodedLines[0])}) Tj`);
56187		const vShift = numberToString(lineHeight);
56188		for (let i = 1, ii = encodedLines.length; i < ii; i++) {
56189			const line = encodedLines[i];
56190			buffer.push(`0 -${vShift} Td (${escapeString(line)}) Tj`);
56191		}
56192		buffer.push("ET", "Q");
56193		const appearance = buffer.join("\n");
56194		const appearanceStreamDict = new Dict(xref);
56195		appearanceStreamDict.set("FormType", 1);
56196		appearanceStreamDict.set("Subtype", Name.get("Form"));
56197		appearanceStreamDict.set("Type", Name.get("XObject"));
56198		appearanceStreamDict.set("BBox", rect);
56199		appearanceStreamDict.set("Resources", resources);
56200		appearanceStreamDict.set("Matrix", [1, 0, 0, 1, -rect[0], -rect[1]]);
56201		const ap = new StringStream(appearance);
56202		ap.dict = appearanceStreamDict;
56203		return ap;
56204	}
56205}
56206class LineAnnotation extends MarkupAnnotation {
56207	constructor(params) {
56208		super(params);
56209		const {
56210			dict,
56211			xref
56212		} = params;
56213		this.data.annotationType = AnnotationType.LINE;
56214		this.data.hasOwnCanvas = this.data.noRotate;
56215		this.data.noHTML = false;
56216		const lineCoordinates = lookupRect(dict.getArray("L"), [0, 0, 0, 0]);
56217		this.data.lineCoordinates = Util.normalizeRect(lineCoordinates);
56218		this.setLineEndings(dict.getArray("LE"));
56219		this.data.lineEndings = this.lineEndings;
56220		if (!this.appearance) {
56221			const strokeColor = this.color ? getPdfColorArray(this.color) : [0, 0, 0];
56222			const strokeAlpha = dict.get("CA");
56223			const interiorColor = getRgbColor(dict.getArray("IC"), null);
56224			const fillColor = interiorColor ? getPdfColorArray(interiorColor) : null;
56225			const fillAlpha = fillColor ? strokeAlpha : null;
56226			const borderWidth = this.borderStyle.width || 1,
56227				borderAdjust = 2 * borderWidth;
56228			const bbox = [this.data.lineCoordinates[0] - borderAdjust, this.data.lineCoordinates[1] - borderAdjust, this.data.lineCoordinates[2] + borderAdjust, this.data.lineCoordinates[3] + borderAdjust];
56229			if (!Util.intersect(this.rectangle, bbox)) {
56230				this.rectangle = bbox;
56231			}
56232			this._setDefaultAppearance({
56233				xref,
56234				extra: `${borderWidth} w`,
56235				strokeColor,
56236				fillColor,
56237				strokeAlpha,
56238				fillAlpha,
56239				pointsCallback: (buffer, points) => {
56240					buffer.push(`${lineCoordinates[0]} ${lineCoordinates[1]} m`, `${lineCoordinates[2]} ${lineCoordinates[3]} l`, "S");
56241					return [points[0] - borderWidth, points[2] + borderWidth, points[7] - borderWidth, points[3] + borderWidth];
56242				}
56243			});
56244		}
56245	}
56246}
56247class SquareAnnotation extends MarkupAnnotation {
56248	constructor(params) {
56249		super(params);
56250		const {
56251			dict,
56252			xref
56253		} = params;
56254		this.data.annotationType = AnnotationType.SQUARE;
56255		this.data.hasOwnCanvas = this.data.noRotate;
56256		this.data.noHTML = false;
56257		if (!this.appearance) {
56258			const strokeColor = this.color ? getPdfColorArray(this.color) : [0, 0, 0];
56259			const strokeAlpha = dict.get("CA");
56260			const interiorColor = getRgbColor(dict.getArray("IC"), null);
56261			const fillColor = interiorColor ? getPdfColorArray(interiorColor) : null;
56262			const fillAlpha = fillColor ? strokeAlpha : null;
56263			if (this.borderStyle.width === 0 && !fillColor) {
56264				return;
56265			}
56266			this._setDefaultAppearance({
56267				xref,
56268				extra: `${this.borderStyle.width} w`,
56269				strokeColor,
56270				fillColor,
56271				strokeAlpha,
56272				fillAlpha,
56273				pointsCallback: (buffer, points) => {
56274					const x = points[4] + this.borderStyle.width / 2;
56275					const y = points[5] + this.borderStyle.width / 2;
56276					const width = points[6] - points[4] - this.borderStyle.width;
56277					const height = points[3] - points[7] - this.borderStyle.width;
56278					buffer.push(`${x} ${y} ${width} ${height} re`);
56279					if (fillColor) {
56280						buffer.push("B");
56281					} else {
56282						buffer.push("S");
56283					}
56284					return [points[0], points[2], points[7], points[3]];
56285				}
56286			});
56287		}
56288	}
56289}
56290class CircleAnnotation extends MarkupAnnotation {
56291	constructor(params) {
56292		super(params);
56293		const {
56294			dict,
56295			xref
56296		} = params;
56297		this.data.annotationType = AnnotationType.CIRCLE;
56298		if (!this.appearance) {
56299			const strokeColor = this.color ? getPdfColorArray(this.color) : [0, 0, 0];
56300			const strokeAlpha = dict.get("CA");
56301			const interiorColor = getRgbColor(dict.getArray("IC"), null);
56302			const fillColor = interiorColor ? getPdfColorArray(interiorColor) : null;
56303			const fillAlpha = fillColor ? strokeAlpha : null;
56304			if (this.borderStyle.width === 0 && !fillColor) {
56305				return;
56306			}
56307			const controlPointsDistance = 4 / 3 * Math.tan(Math.PI / (2 * 4));
56308			this._setDefaultAppearance({
56309				xref,
56310				extra: `${this.borderStyle.width} w`,
56311				strokeColor,
56312				fillColor,
56313				strokeAlpha,
56314				fillAlpha,
56315				pointsCallback: (buffer, points) => {
56316					const x0 = points[0] + this.borderStyle.width / 2;
56317					const y0 = points[1] - this.borderStyle.width / 2;
56318					const x1 = points[6] - this.borderStyle.width / 2;
56319					const y1 = points[7] + this.borderStyle.width / 2;
56320					const xMid = x0 + (x1 - x0) / 2;
56321					const yMid = y0 + (y1 - y0) / 2;
56322					const xOffset = (x1 - x0) / 2 * controlPointsDistance;
56323					const yOffset = (y1 - y0) / 2 * controlPointsDistance;
56324					buffer.push(`${xMid} ${y1} m`, `${xMid + xOffset} ${y1} ${x1} ${yMid + yOffset} ${x1} ${yMid} c`, `${x1} ${yMid - yOffset} ${xMid + xOffset} ${y0} ${xMid} ${y0} c`, `${xMid - xOffset} ${y0} ${x0} ${yMid - yOffset} ${x0} ${yMid} c`, `${x0} ${yMid + yOffset} ${xMid - xOffset} ${y1} ${xMid} ${y1} c`, "h");
56325					if (fillColor) {
56326						buffer.push("B");
56327					} else {
56328						buffer.push("S");
56329					}
56330					return [points[0], points[2], points[7], points[3]];
56331				}
56332			});
56333		}
56334	}
56335}
56336class PolylineAnnotation extends MarkupAnnotation {
56337	constructor(params) {
56338		super(params);
56339		const {
56340			dict,
56341			xref
56342		} = params;
56343		this.data.annotationType = AnnotationType.POLYLINE;
56344		this.data.hasOwnCanvas = this.data.noRotate;
56345		this.data.noHTML = false;
56346		this.data.vertices = null;
56347		if (!(this instanceof PolygonAnnotation)) {
56348			this.setLineEndings(dict.getArray("LE"));
56349			this.data.lineEndings = this.lineEndings;
56350		}
56351		const rawVertices = dict.getArray("Vertices");
56352		if (!isNumberArray(rawVertices, null)) {
56353			return;
56354		}
56355		const vertices = this.data.vertices = Float32Array.from(rawVertices);
56356		if (!this.appearance) {
56357			const strokeColor = this.color ? getPdfColorArray(this.color) : [0, 0, 0];
56358			const strokeAlpha = dict.get("CA");
56359			const borderWidth = this.borderStyle.width || 1,
56360				borderAdjust = 2 * borderWidth;
56361			const bbox = [Infinity, Infinity, -Infinity, -Infinity];
56362			for (let i = 0, ii = vertices.length; i < ii; i += 2) {
56363				bbox[0] = Math.min(bbox[0], vertices[i] - borderAdjust);
56364				bbox[1] = Math.min(bbox[1], vertices[i + 1] - borderAdjust);
56365				bbox[2] = Math.max(bbox[2], vertices[i] + borderAdjust);
56366				bbox[3] = Math.max(bbox[3], vertices[i + 1] + borderAdjust);
56367			}
56368			if (!Util.intersect(this.rectangle, bbox)) {
56369				this.rectangle = bbox;
56370			}
56371			this._setDefaultAppearance({
56372				xref,
56373				extra: `${borderWidth} w`,
56374				strokeColor,
56375				strokeAlpha,
56376				pointsCallback: (buffer, points) => {
56377					for (let i = 0, ii = vertices.length; i < ii; i += 2) {
56378						buffer.push(`${vertices[i]} ${vertices[i + 1]} ${i === 0 ? "m" : "l"}`);
56379					}
56380					buffer.push("S");
56381					return [points[0], points[2], points[7], points[3]];
56382				}
56383			});
56384		}
56385	}
56386}
56387class PolygonAnnotation extends PolylineAnnotation {
56388	constructor(params) {
56389		super(params);
56390		this.data.annotationType = AnnotationType.POLYGON;
56391	}
56392}
56393class CaretAnnotation extends MarkupAnnotation {
56394	constructor(params) {
56395		super(params);
56396		this.data.annotationType = AnnotationType.CARET;
56397	}
56398}
56399class InkAnnotation extends MarkupAnnotation {
56400	constructor(params) {
56401		super(params);
56402		this.data.hasOwnCanvas = this.data.noRotate;
56403		this.data.noHTML = false;
56404		const {
56405			dict,
56406			xref
56407		} = params;
56408		this.data.annotationType = AnnotationType.INK;
56409		this.data.inkLists = [];
56410		this.data.isEditable = !this.data.noHTML;
56411		this.data.noHTML = false;
56412		this.data.opacity = dict.get("CA") || 1;
56413		const rawInkLists = dict.getArray("InkList");
56414		if (!Array.isArray(rawInkLists)) {
56415			return;
56416		}
56417		for (let i = 0, ii = rawInkLists.length; i < ii; ++i) {
56418			if (!Array.isArray(rawInkLists[i])) {
56419				continue;
56420			}
56421			const inkList = new Float32Array(rawInkLists[i].length);
56422			this.data.inkLists.push(inkList);
56423			for (let j = 0, jj = rawInkLists[i].length; j < jj; j += 2) {
56424				const x = xref.fetchIfRef(rawInkLists[i][j]),
56425					y = xref.fetchIfRef(rawInkLists[i][j + 1]);
56426				if (typeof x === "number" && typeof y === "number") {
56427					inkList[j] = x;
56428					inkList[j + 1] = y;
56429				}
56430			}
56431		}
56432		if (!this.appearance) {
56433			const strokeColor = this.color ? getPdfColorArray(this.color) : [0, 0, 0];
56434			const strokeAlpha = dict.get("CA");
56435			const borderWidth = this.borderStyle.width || 1,
56436				borderAdjust = 2 * borderWidth;
56437			const bbox = [Infinity, Infinity, -Infinity, -Infinity];
56438			for (const inkList of this.data.inkLists) {
56439				for (let i = 0, ii = inkList.length; i < ii; i += 2) {
56440					bbox[0] = Math.min(bbox[0], inkList[i] - borderAdjust);
56441					bbox[1] = Math.min(bbox[1], inkList[i + 1] - borderAdjust);
56442					bbox[2] = Math.max(bbox[2], inkList[i] + borderAdjust);
56443					bbox[3] = Math.max(bbox[3], inkList[i + 1] + borderAdjust);
56444				}
56445			}
56446			if (!Util.intersect(this.rectangle, bbox)) {
56447				this.rectangle = bbox;
56448			}
56449			this._setDefaultAppearance({
56450				xref,
56451				extra: `${borderWidth} w`,
56452				strokeColor,
56453				strokeAlpha,
56454				pointsCallback: (buffer, points) => {
56455					for (const inkList of this.data.inkLists) {
56456						for (let i = 0, ii = inkList.length; i < ii; i += 2) {
56457							buffer.push(`${inkList[i]} ${inkList[i + 1]} ${i === 0 ? "m" : "l"}`);
56458						}
56459						buffer.push("S");
56460					}
56461					return [points[0], points[2], points[7], points[3]];
56462				}
56463			});
56464		}
56465	}
56466	static createNewDict(annotation, xref, {
56467		apRef,
56468		ap
56469	}) {
56470		const {
56471			oldAnnotation,
56472			color,
56473			opacity,
56474			paths,
56475			outlines,
56476			rect,
56477			rotation,
56478			thickness,
56479			user
56480		} = annotation;
56481		const ink = oldAnnotation || new Dict(xref);
56482		ink.set("Type", Name.get("Annot"));
56483		ink.set("Subtype", Name.get("Ink"));
56484		ink.set(oldAnnotation ? "M" : "CreationDate", `D:${getModificationDate()}`);
56485		ink.set("Rect", rect);
56486		ink.set("InkList", outlines?.points || paths.points);
56487		ink.set("F", 4);
56488		ink.set("Rotate", rotation);
56489		if (user) {
56490			ink.set("T", stringToAsciiOrUTF16BE(user));
56491		}
56492		if (outlines) {
56493			ink.set("IT", Name.get("InkHighlight"));
56494		}
56495		const bs = new Dict(xref);
56496		ink.set("BS", bs);
56497		bs.set("W", thickness);
56498		ink.set("C", Array.from(color, c => c / 255));
56499		ink.set("CA", opacity);
56500		const n = new Dict(xref);
56501		ink.set("AP", n);
56502		if (apRef) {
56503			n.set("N", apRef);
56504		} else {
56505			n.set("N", ap);
56506		}
56507		return ink;
56508	}
56509	static async createNewAppearanceStream(annotation, xref, params) {
56510		if (annotation.outlines) {
56511			return this.createNewAppearanceStreamForHighlight(annotation, xref, params);
56512		}
56513		const {
56514			color,
56515			rect,
56516			paths,
56517			thickness,
56518			opacity
56519		} = annotation;
56520		const appearanceBuffer = [`${thickness} w 1 J 1 j`, `${getPdfColor(color, false)}`];
56521		if (opacity !== 1) {
56522			appearanceBuffer.push("/R0 gs");
56523		}
56524		for (const outline of paths.lines) {
56525			appearanceBuffer.push(`${numberToString(outline[4])} ${numberToString(outline[5])} m`);
56526			for (let i = 6, ii = outline.length; i < ii; i += 6) {
56527				if (isNaN(outline[i])) {
56528					appearanceBuffer.push(`${numberToString(outline[i + 4])} ${numberToString(outline[i + 5])} l`);
56529				} else {
56530					const [c1x, c1y, c2x, c2y, x, y] = outline.slice(i, i + 6);
56531					appearanceBuffer.push([c1x, c1y, c2x, c2y, x, y].map(numberToString).join(" ") + " c");
56532				}
56533			}
56534			if (outline.length === 6) {
56535				appearanceBuffer.push(`${numberToString(outline[4])} ${numberToString(outline[5])} l`);
56536			}
56537		}
56538		appearanceBuffer.push("S");
56539		const appearance = appearanceBuffer.join("\n");
56540		const appearanceStreamDict = new Dict(xref);
56541		appearanceStreamDict.set("FormType", 1);
56542		appearanceStreamDict.set("Subtype", Name.get("Form"));
56543		appearanceStreamDict.set("Type", Name.get("XObject"));
56544		appearanceStreamDict.set("BBox", rect);
56545		appearanceStreamDict.set("Length", appearance.length);
56546		if (opacity !== 1) {
56547			const resources = new Dict(xref);
56548			const extGState = new Dict(xref);
56549			const r0 = new Dict(xref);
56550			r0.set("CA", opacity);
vendor: 4,890 bytes, lines 56551-56699
56551			r0.set("Type", Name.get("ExtGState"));
56552			extGState.set("R0", r0);
56553			resources.set("ExtGState", extGState);
56554			appearanceStreamDict.set("Resources", resources);
56555		}
56556		const ap = new StringStream(appearance);
56557		ap.dict = appearanceStreamDict;
56558		return ap;
56559	}
56560	static async createNewAppearanceStreamForHighlight(annotation, xref, params) {
56561		const {
56562			color,
56563			rect,
56564			outlines: {
56565				outline
56566			},
56567			opacity
56568		} = annotation;
56569		const appearanceBuffer = [`${getPdfColor(color, true)}`, "/R0 gs"];
56570		appearanceBuffer.push(`${numberToString(outline[4])} ${numberToString(outline[5])} m`);
56571		for (let i = 6, ii = outline.length; i < ii; i += 6) {
56572			if (isNaN(outline[i])) {
56573				appearanceBuffer.push(`${numberToString(outline[i + 4])} ${numberToString(outline[i + 5])} l`);
56574			} else {
56575				const [c1x, c1y, c2x, c2y, x, y] = outline.slice(i, i + 6);
56576				appearanceBuffer.push([c1x, c1y, c2x, c2y, x, y].map(numberToString).join(" ") + " c");
56577			}
56578		}
56579		appearanceBuffer.push("h f");
56580		const appearance = appearanceBuffer.join("\n");
56581		const appearanceStreamDict = new Dict(xref);
56582		appearanceStreamDict.set("FormType", 1);
56583		appearanceStreamDict.set("Subtype", Name.get("Form"));
56584		appearanceStreamDict.set("Type", Name.get("XObject"));
56585		appearanceStreamDict.set("BBox", rect);
56586		appearanceStreamDict.set("Length", appearance.length);
56587		const resources = new Dict(xref);
56588		const extGState = new Dict(xref);
56589		resources.set("ExtGState", extGState);
56590		appearanceStreamDict.set("Resources", resources);
56591		const r0 = new Dict(xref);
56592		extGState.set("R0", r0);
56593		r0.set("BM", Name.get("Multiply"));
56594		if (opacity !== 1) {
56595			r0.set("ca", opacity);
56596			r0.set("Type", Name.get("ExtGState"));
56597		}
56598		const ap = new StringStream(appearance);
56599		ap.dict = appearanceStreamDict;
56600		return ap;
56601	}
56602}
56603class HighlightAnnotation extends MarkupAnnotation {
56604	constructor(params) {
56605		super(params);
56606		const {
56607			dict,
56608			xref
56609		} = params;
56610		this.data.annotationType = AnnotationType.HIGHLIGHT;
56611		this.data.isEditable = !this.data.noHTML;
56612		this.data.noHTML = false;
56613		this.data.opacity = dict.get("CA") || 1;
56614		const quadPoints = this.data.quadPoints = getQuadPoints(dict, null);
56615		if (quadPoints) {
56616			const resources = this.appearance?.dict.get("Resources");
56617			if (!this.appearance || !resources?.has("ExtGState")) {
56618				if (this.appearance) {
56619					warn("HighlightAnnotation - ignoring built-in appearance stream.");
56620				}
56621				const fillColor = this.color ? getPdfColorArray(this.color) : [1, 1, 0];
56622				const fillAlpha = dict.get("CA");
56623				this._setDefaultAppearance({
56624					xref,
56625					fillColor,
56626					blendMode: "Multiply",
56627					fillAlpha,
56628					pointsCallback: (buffer, points) => {
56629						buffer.push(`${points[0]} ${points[1]} m`, `${points[2]} ${points[3]} l`, `${points[6]} ${points[7]} l`, `${points[4]} ${points[5]} l`, "f");
56630						return [points[0], points[2], points[7], points[3]];
56631					}
56632				});
56633			}
56634		} else {
56635			this.data.popupRef = null;
56636		}
56637	}
56638	static createNewDict(annotation, xref, {
56639		apRef,
56640		ap
56641	}) {
56642		const {
56643			color,
56644			oldAnnotation,
56645			opacity,
56646			rect,
56647			rotation,
56648			user,
56649			quadPoints
56650		} = annotation;
56651		const highlight = oldAnnotation || new Dict(xref);
56652		highlight.set("Type", Name.get("Annot"));
56653		highlight.set("Subtype", Name.get("Highlight"));
56654		highlight.set(oldAnnotation ? "M" : "CreationDate", `D:${getModificationDate()}`);
56655		highlight.set("CreationDate", `D:${getModificationDate()}`);
56656		highlight.set("Rect", rect);
56657		highlight.set("F", 4);
56658		highlight.set("Border", [0, 0, 0]);
56659		highlight.set("Rotate", rotation);
56660		highlight.set("QuadPoints", quadPoints);
56661		highlight.set("C", Array.from(color, c => c / 255));
56662		highlight.set("CA", opacity);
56663		if (user) {
56664			highlight.set("T", stringToAsciiOrUTF16BE(user));
56665		}
56666		if (apRef || ap) {
56667			const n = new Dict(xref);
56668			highlight.set("AP", n);
56669			n.set("N", apRef || ap);
56670		}
56671		return highlight;
56672	}
56673	static async createNewAppearanceStream(annotation, xref, params) {
56674		const {
56675			color,
56676			rect,
56677			outlines,
56678			opacity
56679		} = annotation;
56680		const appearanceBuffer = [`${getPdfColor(color, true)}`, "/R0 gs"];
56681		const buffer = [];
56682		for (const outline of outlines) {
56683			buffer.length = 0;
56684			buffer.push(`${numberToString(outline[0])} ${numberToString(outline[1])} m`);
56685			for (let i = 2, ii = outline.length; i < ii; i += 2) {
56686				buffer.push(`${numberToString(outline[i])} ${numberToString(outline[i + 1])} l`);
56687			}
56688			buffer.push("h");
56689			appearanceBuffer.push(buffer.join("\n"));
56690		}
56691		appearanceBuffer.push("f*");
56692		const appearance = appearanceBuffer.join("\n");
56693		const appearanceStreamDict = new Dict(xref);
56694		appearanceStreamDict.set("FormType", 1);
56695		appearanceStreamDict.set("Subtype", Name.get("Form"));
56696		appearanceStreamDict.set("Type", Name.get("XObject"));
56697		appearanceStreamDict.set("BBox", rect);
56698		appearanceStreamDict.set("Length", appearance.length);
56699		const resources = new Dict(xref);
56700		const extGState = new Dict(xref);
56701		resources.set("ExtGState", extGState);
56702		appearanceStreamDict.set("Resources", resources);
56703		const r0 = new Dict(xref);
56704		extGState.set("R0", r0);
56705		r0.set("BM", Name.get("Multiply"));
56706		if (opacity !== 1) {
56707			r0.set("ca", opacity);
56708			r0.set("Type", Name.get("ExtGState"));
56709		}
56710		const ap = new StringStream(appearance);
56711		ap.dict = appearanceStreamDict;
56712		return ap;
56713	}
56714}
56715class UnderlineAnnotation extends MarkupAnnotation {
56716	constructor(params) {
56717		super(params);
56718		const {
56719			dict,
56720			xref
56721		} = params;
56722		this.data.annotationType = AnnotationType.UNDERLINE;
56723		const quadPoints = this.data.quadPoints = getQuadPoints(dict, null);
56724		if (quadPoints) {
56725			if (!this.appearance) {
56726				const strokeColor = this.color ? getPdfColorArray(this.color) : [0, 0, 0];
56727				const strokeAlpha = dict.get("CA");
56728				this._setDefaultAppearance({
56729					xref,
56730					extra: "[] 0 d 0.571 w",
56731					strokeColor,
56732					strokeAlpha,
56733					pointsCallback: (buffer, points) => {
56734						buffer.push(`${points[4]} ${points[5] + 1.3} m`, `${points[6]} ${points[7] + 1.3} l`, "S");
56735						return [points[0], points[2], points[7], points[3]];
56736					}
56737				});
56738			}
56739		} else {
56740			this.data.popupRef = null;
56741		}
56742	}
56743}
56744class SquigglyAnnotation extends MarkupAnnotation {
56745	constructor(params) {
56746		super(params);
56747		const {
56748			dict,
56749			xref
56750		} = params;
56751		this.data.annotationType = AnnotationType.SQUIGGLY;
56752		const quadPoints = this.data.quadPoints = getQuadPoints(dict, null);
56753		if (quadPoints) {
56754			if (!this.appearance) {
56755				const strokeColor = this.color ? getPdfColorArray(this.color) : [0, 0, 0];
56756				const strokeAlpha = dict.get("CA");
56757				this._setDefaultAppearance({
56758					xref,
56759					extra: "[] 0 d 1 w",
56760					strokeColor,
56761					strokeAlpha,
56762					pointsCallback: (buffer, points) => {
56763						const dy = (points[1] - points[5]) / 6;
56764						let shift = dy;
56765						let x = points[4];
56766						const y = points[5];
56767						const xEnd = points[6];
56768						buffer.push(`${x} ${y + shift} m`);
56769						do {
56770							x += 2;
56771							shift = shift === 0 ? dy : 0;
56772							buffer.push(`${x} ${y + shift} l`);
56773						} while (x < xEnd);
56774						buffer.push("S");
56775						return [points[4], xEnd, y - 2 * dy, y + 2 * dy];
56776					}
56777				});
56778			}
56779		} else {
56780			this.data.popupRef = null;
56781		}
56782	}
56783}
56784class StrikeOutAnnotation extends MarkupAnnotation {
56785	constructor(params) {
56786		super(params);
56787		const {
56788			dict,
56789			xref
56790		} = params;
56791		this.data.annotationType = AnnotationType.STRIKEOUT;
56792		const quadPoints = this.data.quadPoints = getQuadPoints(dict, null);
56793		if (quadPoints) {
56794			if (!this.appearance) {
56795				const strokeColor = this.color ? getPdfColorArray(this.color) : [0, 0, 0];
56796				const strokeAlpha = dict.get("CA");
56797				this._setDefaultAppearance({
56798					xref,
56799					extra: "[] 0 d 1 w",
56800					strokeColor,
56801					strokeAlpha,
56802					pointsCallback: (buffer, points) => {
56803						buffer.push(`${(points[0] + points[4]) / 2} ` + `${(points[1] + points[5]) / 2} m`, `${(points[2] + points[6]) / 2} ` + `${(points[3] + points[7]) / 2} l`, "S");
56804						return [points[0], points[2], points[7], points[3]];
56805					}
56806				});
56807			}
56808		} else {
56809			this.data.popupRef = null;
56810		}
56811	}
56812}
56813class StampAnnotation extends MarkupAnnotation {
56814	#savedHasOwnCanvas;
56815	constructor(params) {
56816		super(params);
56817		this.data.annotationType = AnnotationType.STAMP;
56818		this.#savedHasOwnCanvas = this.data.hasOwnCanvas = this.data.noRotate;
56819		this.data.isEditable = !this.data.noHTML;
56820		this.data.noHTML = false;
56821	}
56822	mustBeViewedWhenEditing(isEditing, modifiedIds = null) {
56823		if (isEditing) {
56824			if (!this.data.isEditable) {
56825				return false;
56826			}
56827			this.#savedHasOwnCanvas = this.data.hasOwnCanvas;
56828			this.data.hasOwnCanvas = true;
56829			return true;
56830		}
56831		this.data.hasOwnCanvas = this.#savedHasOwnCanvas;
56832		return !modifiedIds?.has(this.data.id);
56833	}
56834	static async createImage(bitmap, xref) {
56835		const {
56836			width,
56837			height
56838		} = bitmap;
56839		const canvas = new OffscreenCanvas(width, height);
56840		const ctx = canvas.getContext("2d", {
56841			alpha: true
56842		});
56843		ctx.drawImage(bitmap, 0, 0);
56844		const data = ctx.getImageData(0, 0, width, height).data;
56845		const buf32 = new Uint32Array(data.buffer);
56846		const hasAlpha = buf32.some(FeatureTest.isLittleEndian ? x => x >>> 24 !== 0xff : x => (x & 0xff) !== 0xff);
56847		if (hasAlpha) {
56848			ctx.fillStyle = "white";
56849			ctx.fillRect(0, 0, width, height);
56850			ctx.drawImage(bitmap, 0, 0);
56851		}
56852		const jpegBufferPromise = canvas.convertToBlob({
56853			type: "image/jpeg",
56854			quality: 1
56855		}).then(blob => blob.arrayBuffer());
56856		const xobjectName = Name.get("XObject");
56857		const imageName = Name.get("Image");
vendor: 4,665 bytes, lines 56858-57039
56858		const image = new Dict(xref);
56859		image.set("Type", xobjectName);
56860		image.set("Subtype", imageName);
56861		image.set("BitsPerComponent", 8);
56862		image.set("ColorSpace", Name.get("DeviceRGB"));
56863		image.set("Filter", Name.get("DCTDecode"));
56864		image.set("BBox", [0, 0, width, height]);
56865		image.set("Width", width);
56866		image.set("Height", height);
56867		let smaskStream = null;
56868		if (hasAlpha) {
56869			const alphaBuffer = new Uint8Array(buf32.length);
56870			if (FeatureTest.isLittleEndian) {
56871				for (let i = 0, ii = buf32.length; i < ii; i++) {
56872					alphaBuffer[i] = buf32[i] >>> 24;
56873				}
56874			} else {
56875				for (let i = 0, ii = buf32.length; i < ii; i++) {
56876					alphaBuffer[i] = buf32[i] & 0xff;
56877				}
56878			}
56879			const smask = new Dict(xref);
56880			smask.set("Type", xobjectName);
56881			smask.set("Subtype", imageName);
56882			smask.set("BitsPerComponent", 8);
56883			smask.set("ColorSpace", Name.get("DeviceGray"));
56884			smask.set("Width", width);
56885			smask.set("Height", height);
56886			smaskStream = new Stream(alphaBuffer, 0, 0, smask);
56887		}
56888		const imageStream = new Stream(await jpegBufferPromise, 0, 0, image);
56889		return {
56890			imageStream,
56891			smaskStream,
56892			width,
56893			height
56894		};
56895	}
56896	static createNewDict(annotation, xref, {
56897		apRef,
56898		ap
56899	}) {
56900		const {
56901			oldAnnotation,
56902			rect,
56903			rotation,
56904			user
56905		} = annotation;
56906		const stamp = oldAnnotation || new Dict(xref);
56907		stamp.set("Type", Name.get("Annot"));
56908		stamp.set("Subtype", Name.get("Stamp"));
56909		stamp.set(oldAnnotation ? "M" : "CreationDate", `D:${getModificationDate()}`);
56910		stamp.set("Rect", rect);
56911		stamp.set("F", 4);
56912		stamp.set("Border", [0, 0, 0]);
56913		stamp.set("Rotate", rotation);
56914		if (user) {
56915			stamp.set("T", stringToAsciiOrUTF16BE(user));
56916		}
56917		if (apRef || ap) {
56918			const n = new Dict(xref);
56919			stamp.set("AP", n);
56920			if (apRef) {
56921				n.set("N", apRef);
56922			} else {
56923				n.set("N", ap);
56924			}
56925		}
56926		return stamp;
56927	}
56928	static async createNewAppearanceStream(annotation, xref, params) {
56929		if (annotation.oldAnnotation) {
56930			return null;
56931		}
56932		const {
56933			rotation
56934		} = annotation;
56935		const {
56936			imageRef,
56937			width,
56938			height
56939		} = params.image;
56940		const resources = new Dict(xref);
56941		const xobject = new Dict(xref);
56942		resources.set("XObject", xobject);
56943		xobject.set("Im0", imageRef);
56944		const appearance = `q ${width} 0 0 ${height} 0 0 cm /Im0 Do Q`;
56945		const appearanceStreamDict = new Dict(xref);
56946		appearanceStreamDict.set("FormType", 1);
56947		appearanceStreamDict.set("Subtype", Name.get("Form"));
56948		appearanceStreamDict.set("Type", Name.get("XObject"));
56949		appearanceStreamDict.set("BBox", [0, 0, width, height]);
56950		appearanceStreamDict.set("Resources", resources);
56951		if (rotation) {
56952			const matrix = getRotationMatrix(rotation, width, height);
56953			appearanceStreamDict.set("Matrix", matrix);
56954		}
56955		const ap = new StringStream(appearance);
56956		ap.dict = appearanceStreamDict;
56957		return ap;
56958	}
56959}
56960class FileAttachmentAnnotation extends MarkupAnnotation {
56961	constructor(params) {
56962		super(params);
56963		const {
56964			dict,
56965			xref
56966		} = params;
56967		const file = new FileSpec(dict.get("FS"), xref);
56968		this.data.annotationType = AnnotationType.FILEATTACHMENT;
56969		this.data.hasOwnCanvas = this.data.noRotate;
56970		this.data.noHTML = false;
56971		this.data.file = file.serializable;
56972		const name = dict.get("Name");
56973		this.data.name = name instanceof Name ? stringToPDFString(name.name) : "PushPin";
56974		const fillAlpha = dict.get("ca");
56975		this.data.fillAlpha = typeof fillAlpha === "number" && fillAlpha >= 0 && fillAlpha <= 1 ? fillAlpha : null;
56976	}
56977}
56978
56979;// ./src/core/decrypt_stream.js
56980
56981const chunkSize = 512;
56982class DecryptStream extends DecodeStream {
56983	constructor(str, maybeLength, decrypt) {
56984		super(maybeLength);
56985		this.str = str;
56986		this.dict = str.dict;
56987		this.decrypt = decrypt;
56988		this.nextChunk = null;
56989		this.initialized = false;
56990	}
56991	readBlock() {
56992		let chunk;
56993		if (this.initialized) {
56994			chunk = this.nextChunk;
56995		} else {
56996			chunk = this.str.getBytes(chunkSize);
56997			this.initialized = true;
56998		}
56999		if (!chunk?.length) {
57000			this.eof = true;
57001			return;
57002		}
57003		this.nextChunk = this.str.getBytes(chunkSize);
57004		const hasMoreData = this.nextChunk?.length > 0;
57005		const decrypt = this.decrypt;
57006		chunk = decrypt(chunk, !hasMoreData);
57007		const bufferLength = this.bufferLength,
57008			newLength = bufferLength + chunk.length,
57009			buffer = this.ensureBuffer(newLength);
57010		buffer.set(chunk, bufferLength);
57011		this.bufferLength = newLength;
57012	}
57013}
57014
57015;// ./src/core/crypto.js
57016
57017
57018
57019
57020
57021
57022
57023
57024
57025
57026
57027
57028class ARCFourCipher {
57029	constructor(key) {
57030		this.a = 0;
57031		this.b = 0;
57032		const s = new Uint8Array(256);
57033		const keyLength = key.length;
57034		for (let i = 0; i < 256; ++i) {
57035			s[i] = i;
57036		}
57037		for (let i = 0, j = 0; i < 256; ++i) {
57038			const tmp = s[i];
57039			j = j + tmp + key[i % keyLength] & 0xff;
vendor: 18,373 bytes, lines 57040-57529
57040			s[i] = s[j];
57041			s[j] = tmp;
57042		}
57043		this.s = s;
57044	}
57045	encryptBlock(data) {
57046		let a = this.a,
57047			b = this.b;
57048		const s = this.s;
57049		const n = data.length;
57050		const output = new Uint8Array(n);
57051		for (let i = 0; i < n; ++i) {
57052			a = a + 1 & 0xff;
57053			const tmp = s[a];
57054			b = b + tmp & 0xff;
57055			const tmp2 = s[b];
57056			s[a] = tmp2;
57057			s[b] = tmp;
57058			output[i] = data[i] ^ s[tmp + tmp2 & 0xff];
57059		}
57060		this.a = a;
57061		this.b = b;
57062		return output;
57063	}
57064	decryptBlock(data) {
57065		return this.encryptBlock(data);
57066	}
57067	encrypt(data) {
57068		return this.encryptBlock(data);
57069	}
57070}
57071const calculateMD5 = function calculateMD5Closure() {
57072	const r = new Uint8Array([7, 12, 17, 22, 7, 12, 17, 22, 7, 12, 17, 22, 7, 12, 17, 22, 5, 9, 14, 20, 5, 9, 14, 20, 5, 9, 14, 20, 5, 9, 14, 20, 4, 11, 16, 23, 4, 11, 16, 23, 4, 11, 16, 23, 4, 11, 16, 23, 6, 10, 15, 21, 6, 10, 15, 21, 6, 10, 15, 21, 6, 10, 15, 21]);
57073	const k = new Int32Array([-680876936, -389564586, 606105819, -1044525330, -176418897, 1200080426, -1473231341, -45705983, 1770035416, -1958414417, -42063, -1990404162, 1804603682, -40341101, -1502002290, 1236535329, -165796510, -1069501632, 643717713, -373897302, -701558691, 38016083, -660478335, -405537848, 568446438, -1019803690, -187363961, 1163531501, -1444681467, -51403784, 1735328473, -1926607734, -378558, -2022574463, 1839030562, -35309556, -1530992060, 1272893353, -155497632, -1094730640, 681279174, -358537222, -722521979, 76029189, -640364487, -421815835, 530742520, -995338651, -198630844, 1126891415, -1416354905, -57434055, 1700485571, -1894986606, -1051523, -2054922799, 1873313359, -30611744, -1560198380, 1309151649, -145523070, -1120210379, 718787259, -343485551]);
57074	function hash(data, offset, length) {
57075		let h0 = 1732584193,
57076			h1 = -271733879,
57077			h2 = -1732584194,
57078			h3 = 271733878;
57079		const paddedLength = length + 72 & ~63;
57080		const padded = new Uint8Array(paddedLength);
57081		let i, j;
57082		for (i = 0; i < length; ++i) {
57083			padded[i] = data[offset++];
57084		}
57085		padded[i++] = 0x80;
57086		const n = paddedLength - 8;
57087		while (i < n) {
57088			padded[i++] = 0;
57089		}
57090		padded[i++] = length << 3 & 0xff;
57091		padded[i++] = length >> 5 & 0xff;
57092		padded[i++] = length >> 13 & 0xff;
57093		padded[i++] = length >> 21 & 0xff;
57094		padded[i++] = length >>> 29 & 0xff;
57095		padded[i++] = 0;
57096		padded[i++] = 0;
57097		padded[i++] = 0;
57098		const w = new Int32Array(16);
57099		for (i = 0; i < paddedLength;) {
57100			for (j = 0; j < 16; ++j, i += 4) {
57101				w[j] = padded[i] | padded[i + 1] << 8 | padded[i + 2] << 16 | padded[i + 3] << 24;
57102			}
57103			let a = h0,
57104				b = h1,
57105				c = h2,
57106				d = h3,
57107				f,
57108				g;
57109			for (j = 0; j < 64; ++j) {
57110				if (j < 16) {
57111					f = b & c | ~b & d;
57112					g = j;
57113				} else if (j < 32) {
57114					f = d & b | ~d & c;
57115					g = 5 * j + 1 & 15;
57116				} else if (j < 48) {
57117					f = b ^ c ^ d;
57118					g = 3 * j + 5 & 15;
57119				} else {
57120					f = c ^ (b | ~d);
57121					g = 7 * j & 15;
57122				}
57123				const tmp = d,
57124					rotateArg = a + f + k[j] + w[g] | 0,
57125					rotate = r[j];
57126				d = c;
57127				c = b;
57128				b = b + (rotateArg << rotate | rotateArg >>> 32 - rotate) | 0;
57129				a = tmp;
57130			}
57131			h0 = h0 + a | 0;
57132			h1 = h1 + b | 0;
57133			h2 = h2 + c | 0;
57134			h3 = h3 + d | 0;
57135		}
57136		return new Uint8Array([h0 & 0xFF, h0 >> 8 & 0xFF, h0 >> 16 & 0xFF, h0 >>> 24 & 0xFF, h1 & 0xFF, h1 >> 8 & 0xFF, h1 >> 16 & 0xFF, h1 >>> 24 & 0xFF, h2 & 0xFF, h2 >> 8 & 0xFF, h2 >> 16 & 0xFF, h2 >>> 24 & 0xFF, h3 & 0xFF, h3 >> 8 & 0xFF, h3 >> 16 & 0xFF, h3 >>> 24 & 0xFF]);
57137	}
57138	return hash;
57139}();
57140class Word64 {
57141	constructor(highInteger, lowInteger) {
57142		this.high = highInteger | 0;
57143		this.low = lowInteger | 0;
57144	}
57145	and(word) {
57146		this.high &= word.high;
57147		this.low &= word.low;
57148	}
57149	xor(word) {
57150		this.high ^= word.high;
57151		this.low ^= word.low;
57152	}
57153	or(word) {
57154		this.high |= word.high;
57155		this.low |= word.low;
57156	}
57157	shiftRight(places) {
57158		if (places >= 32) {
57159			this.low = this.high >>> places - 32 | 0;
57160			this.high = 0;
57161		} else {
57162			this.low = this.low >>> places | this.high << 32 - places;
57163			this.high = this.high >>> places | 0;
57164		}
57165	}
57166	shiftLeft(places) {
57167		if (places >= 32) {
57168			this.high = this.low << places - 32;
57169			this.low = 0;
57170		} else {
57171			this.high = this.high << places | this.low >>> 32 - places;
57172			this.low <<= places;
57173		}
57174	}
57175	rotateRight(places) {
57176		let low, high;
57177		if (places & 32) {
57178			high = this.low;
57179			low = this.high;
57180		} else {
57181			low = this.low;
57182			high = this.high;
57183		}
57184		places &= 31;
57185		this.low = low >>> places | high << 32 - places;
57186		this.high = high >>> places | low << 32 - places;
57187	}
57188	not() {
57189		this.high = ~this.high;
57190		this.low = ~this.low;
57191	}
57192	add(word) {
57193		const lowAdd = (this.low >>> 0) + (word.low >>> 0);
57194		let highAdd = (this.high >>> 0) + (word.high >>> 0);
57195		if (lowAdd > 0xffffffff) {
57196			highAdd += 1;
57197		}
57198		this.low = lowAdd | 0;
57199		this.high = highAdd | 0;
57200	}
57201	copyTo(bytes, offset) {
57202		bytes[offset] = this.high >>> 24 & 0xff;
57203		bytes[offset + 1] = this.high >> 16 & 0xff;
57204		bytes[offset + 2] = this.high >> 8 & 0xff;
57205		bytes[offset + 3] = this.high & 0xff;
57206		bytes[offset + 4] = this.low >>> 24 & 0xff;
57207		bytes[offset + 5] = this.low >> 16 & 0xff;
57208		bytes[offset + 6] = this.low >> 8 & 0xff;
57209		bytes[offset + 7] = this.low & 0xff;
57210	}
57211	assign(word) {
57212		this.high = word.high;
57213		this.low = word.low;
57214	}
57215}
57216const calculateSHA256 = function calculateSHA256Closure() {
57217	function rotr(x, n) {
57218		return x >>> n | x << 32 - n;
57219	}
57220	function ch(x, y, z) {
57221		return x & y ^ ~x & z;
57222	}
57223	function maj(x, y, z) {
57224		return x & y ^ x & z ^ y & z;
57225	}
57226	function sigma(x) {
57227		return rotr(x, 2) ^ rotr(x, 13) ^ rotr(x, 22);
57228	}
57229	function sigmaPrime(x) {
57230		return rotr(x, 6) ^ rotr(x, 11) ^ rotr(x, 25);
57231	}
57232	function littleSigma(x) {
57233		return rotr(x, 7) ^ rotr(x, 18) ^ x >>> 3;
57234	}
57235	function littleSigmaPrime(x) {
57236		return rotr(x, 17) ^ rotr(x, 19) ^ x >>> 10;
57237	}
57238	const k = [0x428a2f98, 0x71374491, 0xb5c0fbcf, 0xe9b5dba5, 0x3956c25b, 0x59f111f1, 0x923f82a4, 0xab1c5ed5, 0xd807aa98, 0x12835b01, 0x243185be, 0x550c7dc3, 0x72be5d74, 0x80deb1fe, 0x9bdc06a7, 0xc19bf174, 0xe49b69c1, 0xefbe4786, 0x0fc19dc6, 0x240ca1cc, 0x2de92c6f, 0x4a7484aa, 0x5cb0a9dc, 0x76f988da, 0x983e5152, 0xa831c66d, 0xb00327c8, 0xbf597fc7, 0xc6e00bf3, 0xd5a79147, 0x06ca6351, 0x14292967, 0x27b70a85, 0x2e1b2138, 0x4d2c6dfc, 0x53380d13, 0x650a7354, 0x766a0abb, 0x81c2c92e, 0x92722c85, 0xa2bfe8a1, 0xa81a664b, 0xc24b8b70, 0xc76c51a3, 0xd192e819, 0xd6990624, 0xf40e3585, 0x106aa070, 0x19a4c116, 0x1e376c08, 0x2748774c, 0x34b0bcb5, 0x391c0cb3, 0x4ed8aa4a, 0x5b9cca4f, 0x682e6ff3, 0x748f82ee, 0x78a5636f, 0x84c87814, 0x8cc70208, 0x90befffa, 0xa4506ceb, 0xbef9a3f7, 0xc67178f2];
57239	function hash(data, offset, length) {
57240		let h0 = 0x6a09e667,
57241			h1 = 0xbb67ae85,
57242			h2 = 0x3c6ef372,
57243			h3 = 0xa54ff53a,
57244			h4 = 0x510e527f,
57245			h5 = 0x9b05688c,
57246			h6 = 0x1f83d9ab,
57247			h7 = 0x5be0cd19;
57248		const paddedLength = Math.ceil((length + 9) / 64) * 64;
57249		const padded = new Uint8Array(paddedLength);
57250		let i, j;
57251		for (i = 0; i < length; ++i) {
57252			padded[i] = data[offset++];
57253		}
57254		padded[i++] = 0x80;
57255		const n = paddedLength - 8;
57256		while (i < n) {
57257			padded[i++] = 0;
57258		}
57259		padded[i++] = 0;
57260		padded[i++] = 0;
57261		padded[i++] = 0;
57262		padded[i++] = length >>> 29 & 0xff;
57263		padded[i++] = length >> 21 & 0xff;
57264		padded[i++] = length >> 13 & 0xff;
57265		padded[i++] = length >> 5 & 0xff;
57266		padded[i++] = length << 3 & 0xff;
57267		const w = new Uint32Array(64);
57268		for (i = 0; i < paddedLength;) {
57269			for (j = 0; j < 16; ++j) {
57270				w[j] = padded[i] << 24 | padded[i + 1] << 16 | padded[i + 2] << 8 | padded[i + 3];
57271				i += 4;
57272			}
57273			for (j = 16; j < 64; ++j) {
57274				w[j] = littleSigmaPrime(w[j - 2]) + w[j - 7] + littleSigma(w[j - 15]) + w[j - 16] | 0;
57275			}
57276			let a = h0,
57277				b = h1,
57278				c = h2,
57279				d = h3,
57280				e = h4,
57281				f = h5,
57282				g = h6,
57283				h = h7,
57284				t1,
57285				t2;
57286			for (j = 0; j < 64; ++j) {
57287				t1 = h + sigmaPrime(e) + ch(e, f, g) + k[j] + w[j];
57288				t2 = sigma(a) + maj(a, b, c);
57289				h = g;
57290				g = f;
57291				f = e;
57292				e = d + t1 | 0;
57293				d = c;
57294				c = b;
57295				b = a;
57296				a = t1 + t2 | 0;
57297			}
57298			h0 = h0 + a | 0;
57299			h1 = h1 + b | 0;
57300			h2 = h2 + c | 0;
57301			h3 = h3 + d | 0;
57302			h4 = h4 + e | 0;
57303			h5 = h5 + f | 0;
57304			h6 = h6 + g | 0;
57305			h7 = h7 + h | 0;
57306		}
57307		return new Uint8Array([h0 >> 24 & 0xFF, h0 >> 16 & 0xFF, h0 >> 8 & 0xFF, h0 & 0xFF, h1 >> 24 & 0xFF, h1 >> 16 & 0xFF, h1 >> 8 & 0xFF, h1 & 0xFF, h2 >> 24 & 0xFF, h2 >> 16 & 0xFF, h2 >> 8 & 0xFF, h2 & 0xFF, h3 >> 24 & 0xFF, h3 >> 16 & 0xFF, h3 >> 8 & 0xFF, h3 & 0xFF, h4 >> 24 & 0xFF, h4 >> 16 & 0xFF, h4 >> 8 & 0xFF, h4 & 0xFF, h5 >> 24 & 0xFF, h5 >> 16 & 0xFF, h5 >> 8 & 0xFF, h5 & 0xFF, h6 >> 24 & 0xFF, h6 >> 16 & 0xFF, h6 >> 8 & 0xFF, h6 & 0xFF, h7 >> 24 & 0xFF, h7 >> 16 & 0xFF, h7 >> 8 & 0xFF, h7 & 0xFF]);
57308	}
57309	return hash;
57310}();
57311const calculateSHA512 = function calculateSHA512Closure() {
57312	function ch(result, x, y, z, tmp) {
57313		result.assign(x);
57314		result.and(y);
57315		tmp.assign(x);
57316		tmp.not();
57317		tmp.and(z);
57318		result.xor(tmp);
57319	}
57320	function maj(result, x, y, z, tmp) {
57321		result.assign(x);
57322		result.and(y);
57323		tmp.assign(x);
57324		tmp.and(z);
57325		result.xor(tmp);
57326		tmp.assign(y);
57327		tmp.and(z);
57328		result.xor(tmp);
57329	}
57330	function sigma(result, x, tmp) {
57331		result.assign(x);
57332		result.rotateRight(28);
57333		tmp.assign(x);
57334		tmp.rotateRight(34);
57335		result.xor(tmp);
57336		tmp.assign(x);
57337		tmp.rotateRight(39);
57338		result.xor(tmp);
57339	}
57340	function sigmaPrime(result, x, tmp) {
57341		result.assign(x);
57342		result.rotateRight(14);
57343		tmp.assign(x);
57344		tmp.rotateRight(18);
57345		result.xor(tmp);
57346		tmp.assign(x);
57347		tmp.rotateRight(41);
57348		result.xor(tmp);
57349	}
57350	function littleSigma(result, x, tmp) {
57351		result.assign(x);
57352		result.rotateRight(1);
57353		tmp.assign(x);
57354		tmp.rotateRight(8);
57355		result.xor(tmp);
57356		tmp.assign(x);
57357		tmp.shiftRight(7);
57358		result.xor(tmp);
57359	}
57360	function littleSigmaPrime(result, x, tmp) {
57361		result.assign(x);
57362		result.rotateRight(19);
57363		tmp.assign(x);
57364		tmp.rotateRight(61);
57365		result.xor(tmp);
57366		tmp.assign(x);
57367		tmp.shiftRight(6);
57368		result.xor(tmp);
57369	}
57370	const k = [new Word64(0x428a2f98, 0xd728ae22), new Word64(0x71374491, 0x23ef65cd), new Word64(0xb5c0fbcf, 0xec4d3b2f), new Word64(0xe9b5dba5, 0x8189dbbc), new Word64(0x3956c25b, 0xf348b538), new Word64(0x59f111f1, 0xb605d019), new Word64(0x923f82a4, 0xaf194f9b), new Word64(0xab1c5ed5, 0xda6d8118), new Word64(0xd807aa98, 0xa3030242), new Word64(0x12835b01, 0x45706fbe), new Word64(0x243185be, 0x4ee4b28c), new Word64(0x550c7dc3, 0xd5ffb4e2), new Word64(0x72be5d74, 0xf27b896f), new Word64(0x80deb1fe, 0x3b1696b1), new Word64(0x9bdc06a7, 0x25c71235), new Word64(0xc19bf174, 0xcf692694), new Word64(0xe49b69c1, 0x9ef14ad2), new Word64(0xefbe4786, 0x384f25e3), new Word64(0x0fc19dc6, 0x8b8cd5b5), new Word64(0x240ca1cc, 0x77ac9c65), new Word64(0x2de92c6f, 0x592b0275), new Word64(0x4a7484aa, 0x6ea6e483), new Word64(0x5cb0a9dc, 0xbd41fbd4), new Word64(0x76f988da, 0x831153b5), new Word64(0x983e5152, 0xee66dfab), new Word64(0xa831c66d, 0x2db43210), new Word64(0xb00327c8, 0x98fb213f), new Word64(0xbf597fc7, 0xbeef0ee4), new Word64(0xc6e00bf3, 0x3da88fc2), new Word64(0xd5a79147, 0x930aa725), new Word64(0x06ca6351, 0xe003826f), new Word64(0x14292967, 0x0a0e6e70), new Word64(0x27b70a85, 0x46d22ffc), new Word64(0x2e1b2138, 0x5c26c926), new Word64(0x4d2c6dfc, 0x5ac42aed), new Word64(0x53380d13, 0x9d95b3df), new Word64(0x650a7354, 0x8baf63de), new Word64(0x766a0abb, 0x3c77b2a8), new Word64(0x81c2c92e, 0x47edaee6), new Word64(0x92722c85, 0x1482353b), new Word64(0xa2bfe8a1, 0x4cf10364), new Word64(0xa81a664b, 0xbc423001), new Word64(0xc24b8b70, 0xd0f89791), new Word64(0xc76c51a3, 0x0654be30), new Word64(0xd192e819, 0xd6ef5218), new Word64(0xd6990624, 0x5565a910), new Word64(0xf40e3585, 0x5771202a), new Word64(0x106aa070, 0x32bbd1b8), new Word64(0x19a4c116, 0xb8d2d0c8), new Word64(0x1e376c08, 0x5141ab53), new Word64(0x2748774c, 0xdf8eeb99), new Word64(0x34b0bcb5, 0xe19b48a8), new Word64(0x391c0cb3, 0xc5c95a63), new Word64(0x4ed8aa4a, 0xe3418acb), new Word64(0x5b9cca4f, 0x7763e373), new Word64(0x682e6ff3, 0xd6b2b8a3), new Word64(0x748f82ee, 0x5defb2fc), new Word64(0x78a5636f, 0x43172f60), new Word64(0x84c87814, 0xa1f0ab72), new Word64(0x8cc70208, 0x1a6439ec), new Word64(0x90befffa, 0x23631e28), new Word64(0xa4506ceb, 0xde82bde9), new Word64(0xbef9a3f7, 0xb2c67915), new Word64(0xc67178f2, 0xe372532b), new Word64(0xca273ece, 0xea26619c), new Word64(0xd186b8c7, 0x21c0c207), new Word64(0xeada7dd6, 0xcde0eb1e), new Word64(0xf57d4f7f, 0xee6ed178), new Word64(0x06f067aa, 0x72176fba), new Word64(0x0a637dc5, 0xa2c898a6), new Word64(0x113f9804, 0xbef90dae), new Word64(0x1b710b35, 0x131c471b), new Word64(0x28db77f5, 0x23047d84), new Word64(0x32caab7b, 0x40c72493), new Word64(0x3c9ebe0a, 0x15c9bebc), new Word64(0x431d67c4, 0x9c100d4c), new Word64(0x4cc5d4be, 0xcb3e42b6), new Word64(0x597f299c, 0xfc657e2a), new Word64(0x5fcb6fab, 0x3ad6faec), new Word64(0x6c44198c, 0x4a475817)];
57371	function hash(data, offset, length, mode384 = false) {
57372		let h0, h1, h2, h3, h4, h5, h6, h7;
57373		if (!mode384) {
57374			h0 = new Word64(0x6a09e667, 0xf3bcc908);
57375			h1 = new Word64(0xbb67ae85, 0x84caa73b);
57376			h2 = new Word64(0x3c6ef372, 0xfe94f82b);
57377			h3 = new Word64(0xa54ff53a, 0x5f1d36f1);
57378			h4 = new Word64(0x510e527f, 0xade682d1);
57379			h5 = new Word64(0x9b05688c, 0x2b3e6c1f);
57380			h6 = new Word64(0x1f83d9ab, 0xfb41bd6b);
57381			h7 = new Word64(0x5be0cd19, 0x137e2179);
57382		} else {
57383			h0 = new Word64(0xcbbb9d5d, 0xc1059ed8);
57384			h1 = new Word64(0x629a292a, 0x367cd507);
57385			h2 = new Word64(0x9159015a, 0x3070dd17);
57386			h3 = new Word64(0x152fecd8, 0xf70e5939);
57387			h4 = new Word64(0x67332667, 0xffc00b31);
57388			h5 = new Word64(0x8eb44a87, 0x68581511);
57389			h6 = new Word64(0xdb0c2e0d, 0x64f98fa7);
57390			h7 = new Word64(0x47b5481d, 0xbefa4fa4);
57391		}
57392		const paddedLength = Math.ceil((length + 17) / 128) * 128;
57393		const padded = new Uint8Array(paddedLength);
57394		let i, j;
57395		for (i = 0; i < length; ++i) {
57396			padded[i] = data[offset++];
57397		}
57398		padded[i++] = 0x80;
57399		const n = paddedLength - 16;
57400		while (i < n) {
57401			padded[i++] = 0;
57402		}
57403		padded[i++] = 0;
57404		padded[i++] = 0;
57405		padded[i++] = 0;
57406		padded[i++] = 0;
57407		padded[i++] = 0;
57408		padded[i++] = 0;
57409		padded[i++] = 0;
57410		padded[i++] = 0;
57411		padded[i++] = 0;
57412		padded[i++] = 0;
57413		padded[i++] = 0;
57414		padded[i++] = length >>> 29 & 0xff;
57415		padded[i++] = length >> 21 & 0xff;
57416		padded[i++] = length >> 13 & 0xff;
57417		padded[i++] = length >> 5 & 0xff;
57418		padded[i++] = length << 3 & 0xff;
57419		const w = new Array(80);
57420		for (i = 0; i < 80; i++) {
57421			w[i] = new Word64(0, 0);
57422		}
57423		let a = new Word64(0, 0),
57424			b = new Word64(0, 0),
57425			c = new Word64(0, 0);
57426		let d = new Word64(0, 0),
57427			e = new Word64(0, 0),
57428			f = new Word64(0, 0);
57429		let g = new Word64(0, 0),
57430			h = new Word64(0, 0);
57431		const t1 = new Word64(0, 0),
57432			t2 = new Word64(0, 0);
57433		const tmp1 = new Word64(0, 0),
57434			tmp2 = new Word64(0, 0);
57435		let tmp3;
57436		for (i = 0; i < paddedLength;) {
57437			for (j = 0; j < 16; ++j) {
57438				w[j].high = padded[i] << 24 | padded[i + 1] << 16 | padded[i + 2] << 8 | padded[i + 3];
57439				w[j].low = padded[i + 4] << 24 | padded[i + 5] << 16 | padded[i + 6] << 8 | padded[i + 7];
57440				i += 8;
57441			}
57442			for (j = 16; j < 80; ++j) {
57443				tmp3 = w[j];
57444				littleSigmaPrime(tmp3, w[j - 2], tmp2);
57445				tmp3.add(w[j - 7]);
57446				littleSigma(tmp1, w[j - 15], tmp2);
57447				tmp3.add(tmp1);
57448				tmp3.add(w[j - 16]);
57449			}
57450			a.assign(h0);
57451			b.assign(h1);
57452			c.assign(h2);
57453			d.assign(h3);
57454			e.assign(h4);
57455			f.assign(h5);
57456			g.assign(h6);
57457			h.assign(h7);
57458			for (j = 0; j < 80; ++j) {
57459				t1.assign(h);
57460				sigmaPrime(tmp1, e, tmp2);
57461				t1.add(tmp1);
57462				ch(tmp1, e, f, g, tmp2);
57463				t1.add(tmp1);
57464				t1.add(k[j]);
57465				t1.add(w[j]);
57466				sigma(t2, a, tmp2);
57467				maj(tmp1, a, b, c, tmp2);
57468				t2.add(tmp1);
57469				tmp3 = h;
57470				h = g;
57471				g = f;
57472				f = e;
57473				d.add(t1);
57474				e = d;
57475				d = c;
57476				c = b;
57477				b = a;
57478				tmp3.assign(t1);
57479				tmp3.add(t2);
57480				a = tmp3;
57481			}
57482			h0.add(a);
57483			h1.add(b);
57484			h2.add(c);
57485			h3.add(d);
57486			h4.add(e);
57487			h5.add(f);
57488			h6.add(g);
57489			h7.add(h);
57490		}
57491		let result;
57492		if (!mode384) {
57493			result = new Uint8Array(64);
57494			h0.copyTo(result, 0);
57495			h1.copyTo(result, 8);
57496			h2.copyTo(result, 16);
57497			h3.copyTo(result, 24);
57498			h4.copyTo(result, 32);
57499			h5.copyTo(result, 40);
57500			h6.copyTo(result, 48);
57501			h7.copyTo(result, 56);
57502		} else {
57503			result = new Uint8Array(48);
57504			h0.copyTo(result, 0);
57505			h1.copyTo(result, 8);
57506			h2.copyTo(result, 16);
57507			h3.copyTo(result, 24);
57508			h4.copyTo(result, 32);
57509			h5.copyTo(result, 40);
57510		}
57511		return result;
57512	}
57513	return hash;
57514}();
57515function calculateSHA384(data, offset, length) {
57516	return calculateSHA512(data, offset, length, true);
57517}
57518class NullCipher {
57519	decryptBlock(data) {
57520		return data;
57521	}
57522	encrypt(data) {
57523		return data;
57524	}
57525}
57526class AESBaseCipher {
57527	constructor() {
57528		this._s = new Uint8Array([0x63, 0x7c, 0x77, 0x7b, 0xf2, 0x6b, 0x6f, 0xc5, 0x30, 0x01, 0x67, 0x2b, 0xfe, 0xd7, 0xab, 0x76, 0xca, 0x82, 0xc9, 0x7d, 0xfa, 0x59, 0x47, 0xf0, 0xad, 0xd4, 0xa2, 0xaf, 0x9c, 0xa4, 0x72, 0xc0, 0xb7, 0xfd, 0x93, 0x26, 0x36, 0x3f, 0xf7, 0xcc, 0x34, 0xa5, 0xe5, 0xf1, 0x71, 0xd8, 0x31, 0x15, 0x04, 0xc7, 0x23, 0xc3, 0x18, 0x96, 0x05, 0x9a, 0x07, 0x12, 0x80, 0xe2, 0xeb, 0x27, 0xb2, 0x75, 0x09, 0x83, 0x2c, 0x1a, 0x1b, 0x6e, 0x5a, 0xa0, 0x52, 0x3b, 0xd6, 0xb3, 0x29, 0xe3, 0x2f, 0x84, 0x53, 0xd1, 0x00, 0xed, 0x20, 0xfc, 0xb1, 0x5b, 0x6a, 0xcb, 0xbe, 0x39, 0x4a, 0x4c, 0x58, 0xcf, 0xd0, 0xef, 0xaa, 0xfb, 0x43, 0x4d, 0x33, 0x85, 0x45, 0xf9, 0x02, 0x7f, 0x50, 0x3c, 0x9f, 0xa8, 0x51, 0xa3, 0x40, 0x8f, 0x92, 0x9d, 0x38, 0xf5, 0xbc, 0xb6, 0xda, 0x21, 0x10, 0xff, 0xf3, 0xd2, 0xcd, 0x0c, 0x13, 0xec, 0x5f, 0x97, 0x44, 0x17, 0xc4, 0xa7, 0x7e, 0x3d, 0x64, 0x5d, 0x19, 0x73, 0x60, 0x81, 0x4f, 0xdc, 0x22, 0x2a, 0x90, 0x88, 0x46, 0xee, 0xb8, 0x14, 0xde, 0x5e, 0x0b, 0xdb, 0xe0, 0x32, 0x3a, 0x0a, 0x49, 0x06, 0x24, 0x5c, 0xc2, 0xd3, 0xac, 0x62, 0x91, 0x95, 0xe4, 0x79, 0xe7, 0xc8, 0x37, 0x6d, 0x8d, 0xd5, 0x4e, 0xa9, 0x6c, 0x56, 0xf4, 0xea, 0x65, 0x7a, 0xae, 0x08, 0xba, 0x78, 0x25, 0x2e, 0x1c, 0xa6, 0xb4, 0xc6, 0xe8, 0xdd, 0x74, 0x1f, 0x4b, 0xbd, 0x8b, 0x8a, 0x70, 0x3e, 0xb5, 0x66, 0x48, 0x03, 0xf6, 0x0e, 0x61, 0x35, 0x57, 0xb9, 0x86, 0xc1, 0x1d, 0x9e, 0xe1, 0xf8, 0x98, 0x11, 0x69, 0xd9, 0x8e, 0x94, 0x9b, 0x1e, 0x87, 0xe9, 0xce, 0x55, 0x28, 0xdf, 0x8c, 0xa1, 0x89, 0x0d, 0xbf, 0xe6, 0x42, 0x68, 0x41, 0x99, 0x2d, 0x0f, 0xb0, 0x54, 0xbb, 0x16]);
57529		this._inv_s = new Uint8Array([0x52, 0x09, 0x6a, 0xd5, 0x30, 0x36, 0xa5, 0x38, 0xbf, 0x40, 0xa3, 0x9e, 0x81, 0xf3, 0xd7, 0xfb, 0x7c, 0xe3, 0x39, 0x82, 0x9b, 0x2f, 0xff, 0x87, 0x34, 0x8e, 0x43, 0x44, 0xc4, 0xde, 0xe9, 0xcb, 0x54, 0x7b, 0x94, 0x32, 0xa6, 0xc2, 0x23, 0x3d, 0xee, 0x4c, 0x95, 0x0b, 0x42, 
575290xfa, 0xc3, 0x4e, 0x08, 0x2e, 0xa1, 0x66, 0x28, 0xd9, 0x24, 0xb2, 0x76, 0x5b, 0xa2, 0x49, 0x6d, 0x8b, 0xd1, 0x25, 0x72, 0xf8, 0xf6, 0x64, 0x86, 0x68, 0x98, 0x16, 0xd4, 0xa4, 0x5c, 0xcc, 0x5d, 0x65, 0xb6, 0x92, 0x6c, 0x70, 0x48, 0x50, 0xfd, 0xed, 0xb9, 0xda, 0x5e, 0x15, 0x46, 0x57, 0xa7, 0x8d, 0x9d, 0x84, 0x90, 0xd8, 0xab, 0x00, 0x8c, 0xbc, 0xd3, 0x0a, 0xf7, 0xe4, 0x58, 0x05, 0xb8, 0xb3, 0x45, 0x06, 0xd0, 0x2c, 0x1e, 0x8f, 0xca, 0x3f, 0x0f, 0x02, 0xc1, 0xaf, 0xbd, 0x03, 0x01, 0x13, 0x8a, 0x6b, 0x3a, 0x91, 0x11, 0x41, 0x4f, 0x67, 0xdc, 0xea, 0x97, 0xf2, 0xcf, 0xce, 0xf0, 0xb4, 0xe6, 0x73, 0x96, 0xac, 0x74, 0x22, 0xe7, 0xad, 0x35, 0x85, 0xe2, 0xf9, 0x37, 0xe8, 0x1c, 0x75, 0xdf, 0x6e, 0x47, 0xf1, 0x1a, 0x71, 0x1d, 0x29, 0xc5, 0x89, 0x6f, 0xb7, 0x62, 0x0e, 0xaa, 0x18, 0xbe, 0x1b, 0xfc, 0x56, 0x3e, 0x4b, 0xc6, 0xd2, 0x79, 0x20, 0x9a, 0xdb, 0xc0, 0xfe, 0x78, 0xcd, 0x5a, 0xf4, 0x1f, 0xdd, 0xa8, 0x33, 0x88, 0x07, 0xc7, 0x31, 0xb1, 0x12, 0x10, 0x59, 0x27, 0x80, 0xec, 0x5f, 0x60, 0x51, 0x7f, 0xa9, 0x19, 0xb5, 0x4a, 0x0d, 0x2d, 0xe5, 0x7a, 0x9f, 0x93, 0xc9, 0x9c, 0xef, 0xa0, 0xe0, 0x3b, 0x4d, 0xae, 0x2a, 0xf5, 0xb0, 0xc8, 0xeb, 0xbb, 0x3c, 0x83, 0x53, 0x99, 0x61, 0x17, 0x2b, 0x04, 0x7e, 0xba, 0x77, 0xd6, 0x26, 0xe1, 0x69, 0x14, 0x63, 0x55, 0x21, 0x0c, 0x7d]);
57530		this._mix = new Uint32Array([0x00000000, 0x0e090d0b, 0x1c121a16, 0x121b171d, 0x3824342c, 0x362d3927, 0x24362e3a, 0x2a3f2331, 0x70486858, 0x7e416553, 0x6c5a724e, 0x62537f45, 0x486c5c74, 0x4665517f, 0x547e4662, 0x5a774b69, 0xe090d0b0, 0xee99ddbb, 0xfc82caa6, 0xf28bc7ad, 0xd8b4e49c, 0xd6bde997, 0xc4a6fe8a, 0xcaaff381, 0x90d8b8e8, 0x9ed1b5e3, 0x8ccaa2fe, 0x82c3aff5, 0xa8fc8cc4, 0xa6f581cf, 0xb4ee96d2, 0xbae79bd9, 0xdb3bbb7b, 0xd532b670, 0xc729a16d, 0xc920ac66, 0xe31f8f57, 0xed16825c, 0xff0d9541, 0xf104984a, 0xab73d323, 0xa57ade28, 0xb761c935, 0xb968c43e, 0x9357e70f, 0x9d5eea04, 0x8f45fd19, 0x814cf012, 0x3bab6bcb, 0x35a266c0, 0x27b971dd, 0x29b07cd6, 0x038f5fe7, 0x0d8652ec, 0x1f9d45f1, 0x119448fa, 0x4be30393, 0x45ea0e98, 0x57f11985, 0x59f8148e, 0x73c737bf, 0x7dce3ab4, 0x6fd52da9, 0x61dc20a2, 0xad766df6, 0xa37f60fd, 0xb16477e0, 0xbf6d7aeb, 0x955259da, 0x9b5b54d1, 0x894043cc, 0x87494ec7, 0xdd3e05ae, 0xd33708a5, 0xc12c1fb8, 0xcf2512b3, 0xe51a3182, 0xeb133c89, 0xf9082b94, 0xf701269f, 0x4de6bd46, 0x43efb04d, 0x51f4a750, 0x5ffdaa5b, 0x75c2896a, 0x7bcb8461, 0x69d0937c, 0x67d99e77, 0x3daed51e, 0x33a7d815, 0x21bccf08, 0x2fb5c203, 0x058ae132, 0x0b83ec39, 0x1998fb24, 0x1791f62f, 0x764dd68d, 0x7844db86, 0x6a5fcc9b, 0x6456c190, 0x4e69e2a1, 0x4060efaa, 0x527bf8b7, 0x5c72f5bc, 0x0605bed5, 0x080cb3de, 0x1a17a4c3, 0x141ea9c8, 0x3e218af9, 0x302887f2, 0x223390ef, 0x2c3a9de4, 0x96dd063d, 0x98d40b36, 0x8acf1c2b, 0x84c61120, 0xaef93211, 0xa0f03f1a, 0xb2eb2807, 0xbce2250c, 0xe6956e65, 0xe89c636e, 0xfa877473, 0xf48e7978, 0xdeb15a49, 0xd0b85742, 0xc2a3405f, 0xccaa4d54, 0x41ecdaf7, 0x4fe5d7fc, 0x5dfec0e1, 0x53f7cdea, 0x79c8eedb, 0x77c1e3d0, 0x65daf4cd, 0x6bd3f9c6, 0x31a4b2af, 0x3fadbfa4, 0x2db6a8b9, 0x23bfa5b2, 0x09808683, 0x07898b88, 0x15929c95, 0x1b9b919e, 0xa17c0a47, 0xaf75074c, 0xbd6e1051, 0xb3671d5a, 0x99583e6b, 0x97513360, 0x854a247d, 0x8b432976, 0xd134621f, 0xdf3d6f14, 0xcd267809, 0xc32f7502, 0xe9105633, 0xe7195b38, 0xf5024c25, 0xfb0b412e, 0x9ad7618c, 0x94de6c87, 0x86c57b9a, 0x88cc7691, 0xa2f355a0, 0xacfa58ab, 0xbee14fb6, 0xb0e842bd, 0xea9f09d4, 0xe49604df, 0xf68d13c2, 0xf8841ec9, 0xd2bb3df8, 0xdcb230f3, 0xcea927ee, 0xc0a02ae5, 0x7a47b13c, 0x744ebc37, 0x6655ab2a, 0x685ca621, 0x42638510, 0x4c6a881b, 0x5e719f06, 0x5078920d, 0x0a0fd964, 0x0406d46f, 0x161dc372, 0x1814ce79, 0x322bed48, 0x3c22e043, 0x2e39f75e, 0x2030fa55, 0xec9ab701, 0xe293ba0a, 0xf088ad17, 0xfe81a01c, 0xd4be832d, 0xdab78e26, 0xc8ac993b, 0xc6a59430, 0x9cd2df59, 0x92dbd252, 0x80c0c54f, 0x8ec9c844, 0xa4f6eb75, 0xaaffe67e, 0xb8e4f163, 0xb6edfc68, 0x0c0a67b1, 0x02036aba, 0x10187da7, 0x1e1170ac, 0x342e539d, 0x3a275e96, 0x283c498b, 0x26354480, 0x7c420fe9, 0x724b02e2, 0x605015ff, 0x6e5918f4, 0x44663bc5, 0x4a6f36ce, 0x587421d3, 0x567d2cd8, 0x37a10c7a, 0x39a80171, 0x2bb3166c, 0x25ba1b67, 0x0f853856, 0x018c355d, 0x13972240, 0x1d9e2f4b, 0x47e96422, 0x49e06929, 0x5bfb7e34, 0x55f2733f, 0x7fcd500e, 0x71c45d05, 0x63df4a18, 0x6dd64713, 0xd731dcca, 0xd938d1c1, 0xcb23
vendor: 5,927 bytes, lines 57530-57766
57530c6dc, 0xc52acbd7, 0xef15e8e6, 0xe11ce5ed, 0xf307f2f0, 0xfd0efffb, 0xa779b492, 0xa970b999, 0xbb6bae84, 0xb562a38f, 0x9f5d80be, 0x91548db5, 0x834f9aa8, 0x8d4697a3]);
57531		this._mixCol = new Uint8Array(256);
57532		for (let i = 0; i < 256; i++) {
57533			this._mixCol[i] = i < 128 ? i << 1 : i << 1 ^ 0x1b;
57534		}
57535		this.buffer = new Uint8Array(16);
57536		this.bufferPosition = 0;
57537	}
57538	_expandKey(cipherKey) {
57539		unreachable("Cannot call `_expandKey` on the base class");
57540	}
57541	_decrypt(input, key) {
57542		let t, u, v;
57543		const state = new Uint8Array(16);
57544		state.set(input);
57545		for (let j = 0, k = this._keySize; j < 16; ++j, ++k) {
57546			state[j] ^= key[k];
57547		}
57548		for (let i = this._cyclesOfRepetition - 1; i >= 1; --i) {
57549			t = state[13];
57550			state[13] = state[9];
57551			state[9] = state[5];
57552			state[5] = state[1];
57553			state[1] = t;
57554			t = state[14];
57555			u = state[10];
57556			state[14] = state[6];
57557			state[10] = state[2];
57558			state[6] = t;
57559			state[2] = u;
57560			t = state[15];
57561			u = state[11];
57562			v = state[7];
57563			state[15] = state[3];
57564			state[11] = t;
57565			state[7] = u;
57566			state[3] = v;
57567			for (let j = 0; j < 16; ++j) {
57568				state[j] = this._inv_s[state[j]];
57569			}
57570			for (let j = 0, k = i * 16; j < 16; ++j, ++k) {
57571				state[j] ^= key[k];
57572			}
57573			for (let j = 0; j < 16; j += 4) {
57574				const s0 = this._mix[state[j]];
57575				const s1 = this._mix[state[j + 1]];
57576				const s2 = this._mix[state[j + 2]];
57577				const s3 = this._mix[state[j + 3]];
57578				t = s0 ^ s1 >>> 8 ^ s1 << 24 ^ s2 >>> 16 ^ s2 << 16 ^ s3 >>> 24 ^ s3 << 8;
57579				state[j] = t >>> 24 & 0xff;
57580				state[j + 1] = t >> 16 & 0xff;
57581				state[j + 2] = t >> 8 & 0xff;
57582				state[j + 3] = t & 0xff;
57583			}
57584		}
57585		t = state[13];
57586		state[13] = state[9];
57587		state[9] = state[5];
57588		state[5] = state[1];
57589		state[1] = t;
57590		t = state[14];
57591		u = state[10];
57592		state[14] = state[6];
57593		state[10] = state[2];
57594		state[6] = t;
57595		state[2] = u;
57596		t = state[15];
57597		u = state[11];
57598		v = state[7];
57599		state[15] = state[3];
57600		state[11] = t;
57601		state[7] = u;
57602		state[3] = v;
57603		for (let j = 0; j < 16; ++j) {
57604			state[j] = this._inv_s[state[j]];
57605			state[j] ^= key[j];
57606		}
57607		return state;
57608	}
57609	_encrypt(input, key) {
57610		const s = this._s;
57611		let t, u, v;
57612		const state = new Uint8Array(16);
57613		state.set(input);
57614		for (let j = 0; j < 16; ++j) {
57615			state[j] ^= key[j];
57616		}
57617		for (let i = 1; i < this._cyclesOfRepetition; i++) {
57618			for (let j = 0; j < 16; ++j) {
57619				state[j] = s[state[j]];
57620			}
57621			v = state[1];
57622			state[1] = state[5];
57623			state[5] = state[9];
57624			state[9] = state[13];
57625			state[13] = v;
57626			v = state[2];
57627			u = state[6];
57628			state[2] = state[10];
57629			state[6] = state[14];
57630			state[10] = v;
57631			state[14] = u;
57632			v = state[3];
57633			u = state[7];
57634			t = state[11];
57635			state[3] = state[15];
57636			state[7] = v;
57637			state[11] = u;
57638			state[15] = t;
57639			for (let j = 0; j < 16; j += 4) {
57640				const s0 = state[j + 0];
57641				const s1 = state[j + 1];
57642				const s2 = state[j + 2];
57643				const s3 = state[j + 3];
57644				t = s0 ^ s1 ^ s2 ^ s3;
57645				state[j + 0] ^= t ^ this._mixCol[s0 ^ s1];
57646				state[j + 1] ^= t ^ this._mixCol[s1 ^ s2];
57647				state[j + 2] ^= t ^ this._mixCol[s2 ^ s3];
57648				state[j + 3] ^= t ^ this._mixCol[s3 ^ s0];
57649			}
57650			for (let j = 0, k = i * 16; j < 16; ++j, ++k) {
57651				state[j] ^= key[k];
57652			}
57653		}
57654		for (let j = 0; j < 16; ++j) {
57655			state[j] = s[state[j]];
57656		}
57657		v = state[1];
57658		state[1] = state[5];
57659		state[5] = state[9];
57660		state[9] = state[13];
57661		state[13] = v;
57662		v = state[2];
57663		u = state[6];
57664		state[2] = state[10];
57665		state[6] = state[14];
57666		state[10] = v;
57667		state[14] = u;
57668		v = state[3];
57669		u = state[7];
57670		t = state[11];
57671		state[3] = state[15];
57672		state[7] = v;
57673		state[11] = u;
57674		state[15] = t;
57675		for (let j = 0, k = this._keySize; j < 16; ++j, ++k) {
57676			state[j] ^= key[k];
57677		}
57678		return state;
57679	}
57680	_decryptBlock2(data, finalize) {
57681		const sourceLength = data.length;
57682		let buffer = this.buffer,
57683			bufferLength = this.bufferPosition;
57684		const result = [];
57685		let iv = this.iv;
57686		for (let i = 0; i < sourceLength; ++i) {
57687			buffer[bufferLength] = data[i];
57688			++bufferLength;
57689			if (bufferLength < 16) {
57690				continue;
57691			}
57692			const plain = this._decrypt(buffer, this._key);
57693			for (let j = 0; j < 16; ++j) {
57694				plain[j] ^= iv[j];
57695			}
57696			iv = buffer;
57697			result.push(plain);
57698			buffer = new Uint8Array(16);
57699			bufferLength = 0;
57700		}
57701		this.buffer = buffer;
57702		this.bufferLength = bufferLength;
57703		this.iv = iv;
57704		if (result.length === 0) {
57705			return new Uint8Array(0);
57706		}
57707		let outputLength = 16 * result.length;
57708		if (finalize) {
57709			const lastBlock = result.at(-1);
57710			let psLen = lastBlock[15];
57711			if (psLen <= 16) {
57712				for (let i = 15, ii = 16 - psLen; i >= ii; --i) {
57713					if (lastBlock[i] !== psLen) {
57714						psLen = 0;
57715						break;
57716					}
57717				}
57718				outputLength -= psLen;
57719				result[result.length - 1] = lastBlock.subarray(0, 16 - psLen);
57720			}
57721		}
57722		const output = new Uint8Array(outputLength);
57723		for (let i = 0, j = 0, ii = result.length; i < ii; ++i, j += 16) {
57724			output.set(result[i], j);
57725		}
57726		return output;
57727	}
57728	decryptBlock(data, finalize, iv = null) {
57729		const sourceLength = data.length;
57730		const buffer = this.buffer;
57731		let bufferLength = this.bufferPosition;
57732		if (iv) {
57733			this.iv = iv;
57734		} else {
57735			for (let i = 0; bufferLength < 16 && i < sourceLength; ++i, ++bufferLength) {
57736				buffer[bufferLength] = data[i];
57737			}
57738			if (bufferLength < 16) {
57739				this.bufferLength = bufferLength;
57740				return new Uint8Array(0);
57741			}
57742			this.iv = buffer;
57743			data = data.subarray(16);
57744		}
57745		this.buffer = new Uint8Array(16);
57746		this.bufferLength = 0;
57747		this.decryptBlock = this._decryptBlock2;
57748		return this.decryptBlock(data, finalize);
57749	}
57750	encrypt(data, iv) {
57751		const sourceLength = data.length;
57752		let buffer = this.buffer,
57753			bufferLength = this.bufferPosition;
57754		const result = [];
57755		if (!iv) {
57756			iv = new Uint8Array(16);
57757		}
57758		for (let i = 0; i < sourceLength; ++i) {
57759			buffer[bufferLength] = data[i];
57760			++bufferLength;
57761			if (bufferLength < 16) {
57762				continue;
57763			}
57764			for (let j = 0; j < 16; ++j) {
57765				buffer[j] ^= iv[j];
57766			}
vendor: 4,580 bytes, lines 57767-57888
57767			const cipher = this._encrypt(buffer, this._key);
57768			iv = cipher;
57769			result.push(cipher);
57770			buffer = new Uint8Array(16);
57771			bufferLength = 0;
57772		}
57773		this.buffer = buffer;
57774		this.bufferLength = bufferLength;
57775		this.iv = iv;
57776		if (result.length === 0) {
57777			return new Uint8Array(0);
57778		}
57779		const outputLength = 16 * result.length;
57780		const output = new Uint8Array(outputLength);
57781		for (let i = 0, j = 0, ii = result.length; i < ii; ++i, j += 16) {
57782			output.set(result[i], j);
57783		}
57784		return output;
57785	}
57786}
57787class AES128Cipher extends AESBaseCipher {
57788	constructor(key) {
57789		super();
57790		this._cyclesOfRepetition = 10;
57791		this._keySize = 160;
57792		this._rcon = new Uint8Array([0x8d, 0x01, 0x02, 0x04, 0x08, 0x10, 0x20, 0x40, 0x80, 0x1b, 0x36, 0x6c, 0xd8, 0xab, 0x4d, 0x9a, 0x2f, 0x5e, 0xbc, 0x63, 0xc6, 0x97, 0x35, 0x6a, 0xd4, 0xb3, 0x7d, 0xfa, 0xef, 0xc5, 0x91, 0x39, 0x72, 0xe4, 0xd3, 0xbd, 0x61, 0xc2, 0x9f, 0x25, 0x4a, 0x94, 0x33, 0x66, 0xcc, 0x83, 0x1d, 0x3a, 0x74, 0xe8, 0xcb, 0x8d, 0x01, 0x02, 0x04, 0x08, 0x10, 0x20, 0x40, 0x80, 0x1b, 0x36, 0x6c, 0xd8, 0xab, 0x4d, 0x9a, 0x2f, 0x5e, 0xbc, 0x63, 0xc6, 0x97, 0x35, 0x6a, 0xd4, 0xb3, 0x7d, 0xfa, 0xef, 0xc5, 0x91, 0x39, 0x72, 0xe4, 0xd3, 0xbd, 0x61, 0xc2, 0x9f, 0x25, 0x4a, 0x94, 0x33, 0x66, 0xcc, 0x83, 0x1d, 0x3a, 0x74, 0xe8, 0xcb, 0x8d, 0x01, 0x02, 0x04, 0x08, 0x10, 0x20, 0x40, 0x80, 0x1b, 0x36, 0x6c, 0xd8, 0xab, 0x4d, 0x9a, 0x2f, 0x5e, 0xbc, 0x63, 0xc6, 0x97, 0x35, 0x6a, 0xd4, 0xb3, 0x7d, 0xfa, 0xef, 0xc5, 0x91, 0x39, 0x72, 0xe4, 0xd3, 0xbd, 0x61, 0xc2, 0x9f, 0x25, 0x4a, 0x94, 0x33, 0x66, 0xcc, 0x83, 0x1d, 0x3a, 0x74, 0xe8, 0xcb, 0x8d, 0x01, 0x02, 0x04, 0x08, 0x10, 0x20, 0x40, 0x80, 0x1b, 0x36, 0x6c, 0xd8, 0xab, 0x4d, 0x9a, 0x2f, 0x5e, 0xbc, 0x63, 0xc6, 0x97, 0x35, 0x6a, 0xd4, 0xb3, 0x7d, 0xfa, 0xef, 0xc5, 0x91, 0x39, 0x72, 0xe4, 0xd3, 0xbd, 0x61, 0xc2, 0x9f, 0x25, 0x4a, 0x94, 0x33, 0x66, 0xcc, 0x83, 0x1d, 0x3a, 0x74, 0xe8, 0xcb, 0x8d, 0x01, 0x02, 0x04, 0x08, 0x10, 0x20, 0x40, 0x80, 0x1b, 0x36, 0x6c, 0xd8, 0xab, 0x4d, 0x9a, 0x2f, 0x5e, 0xbc, 0x63, 0xc6, 0x97, 0x35, 0x6a, 0xd4, 0xb3, 0x7d, 0xfa, 0xef, 0xc5, 0x91, 0x39, 0x72, 0xe4, 0xd3, 0xbd, 0x61, 0xc2, 0x9f, 0x25, 0x4a, 0x94, 0x33, 0x66, 0xcc, 0x83, 0x1d, 0x3a, 0x74, 0xe8, 0xcb, 0x8d]);
57793		this._key = this._expandKey(key);
57794	}
57795	_expandKey(cipherKey) {
57796		const b = 176;
57797		const s = this._s;
57798		const rcon = this._rcon;
57799		const result = new Uint8Array(b);
57800		result.set(cipherKey);
57801		for (let j = 16, i = 1; j < b; ++i) {
57802			let t1 = result[j - 3];
57803			let t2 = result[j - 2];
57804			let t3 = result[j - 1];
57805			let t4 = result[j - 4];
57806			t1 = s[t1];
57807			t2 = s[t2];
57808			t3 = s[t3];
57809			t4 = s[t4];
57810			t1 ^= rcon[i];
57811			for (let n = 0; n < 4; ++n) {
57812				result[j] = t1 ^= result[j - 16];
57813				j++;
57814				result[j] = t2 ^= result[j - 16];
57815				j++;
57816				result[j] = t3 ^= result[j - 16];
57817				j++;
57818				result[j] = t4 ^= result[j - 16];
57819				j++;
57820			}
57821		}
57822		return result;
57823	}
57824}
57825class AES256Cipher extends AESBaseCipher {
57826	constructor(key) {
57827		super();
57828		this._cyclesOfRepetition = 14;
57829		this._keySize = 224;
57830		this._key = this._expandKey(key);
57831	}
57832	_expandKey(cipherKey) {
57833		const b = 240;
57834		const s = this._s;
57835		const result = new Uint8Array(b);
57836		result.set(cipherKey);
57837		let r = 1;
57838		let t1, t2, t3, t4;
57839		for (let j = 32, i = 1; j < b; ++i) {
57840			if (j % 32 === 16) {
57841				t1 = s[t1];
57842				t2 = s[t2];
57843				t3 = s[t3];
57844				t4 = s[t4];
57845			} else if (j % 32 === 0) {
57846				t1 = result[j - 3];
57847				t2 = result[j - 2];
57848				t3 = result[j - 1];
57849				t4 = result[j - 4];
57850				t1 = s[t1];
57851				t2 = s[t2];
57852				t3 = s[t3];
57853				t4 = s[t4];
57854				t1 ^= r;
57855				if ((r <<= 1) >= 256) {
57856					r = (r ^ 0x1b) & 0xff;
57857				}
57858			}
57859			for (let n = 0; n < 4; ++n) {
57860				result[j] = t1 ^= result[j - 32];
57861				j++;
57862				result[j] = t2 ^= result[j - 32];
57863				j++;
57864				result[j] = t3 ^= result[j - 32];
57865				j++;
57866				result[j] = t4 ^= result[j - 32];
57867				j++;
57868			}
57869		}
57870		return result;
57871	}
57872}
57873class PDF17 {
57874	checkOwnerPassword(password, ownerValidationSalt, userBytes, ownerPassword) {
57875		const hashData = new Uint8Array(password.length + 56);
57876		hashData.set(password, 0);
57877		hashData.set(ownerValidationSalt, password.length);
57878		hashData.set(userBytes, password.length + ownerValidationSalt.length);
57879		const result = calculateSHA256(hashData, 0, hashData.length);
57880		return isArrayEqual(result, ownerPassword);
57881	}
57882	checkUserPassword(password, userValidationSalt, userPassword) {
57883		const hashData = new Uint8Array(password.length + 8);
57884		hashData.set(password, 0);
57885		hashData.set(userValidationSalt, password.length);
57886		const result = calculateSHA256(hashData, 0, hashData.length);
57887		return isArrayEqual(result, userPassword);
57888	}
vendor: 39,431 bytes, lines 57889-59235
57889	getOwnerKey(password, ownerKeySalt, userBytes, ownerEncryption) {
57890		const hashData = new Uint8Array(password.length + 56);
57891		hashData.set(password, 0);
57892		hashData.set(ownerKeySalt, password.length);
57893		hashData.set(userBytes, password.length + ownerKeySalt.length);
57894		const key = calculateSHA256(hashData, 0, hashData.length);
57895		const cipher = new AES256Cipher(key);
57896		return cipher.decryptBlock(ownerEncryption, false, new Uint8Array(16));
57897	}
57898	getUserKey(password, userKeySalt, userEncryption) {
57899		const hashData = new Uint8Array(password.length + 8);
57900		hashData.set(password, 0);
57901		hashData.set(userKeySalt, password.length);
57902		const key = calculateSHA256(hashData, 0, hashData.length);
57903		const cipher = new AES256Cipher(key);
57904		return cipher.decryptBlock(userEncryption, false, new Uint8Array(16));
57905	}
57906}
57907class PDF20 {
57908	_hash(password, input, userBytes) {
57909		let k = calculateSHA256(input, 0, input.length).subarray(0, 32);
57910		let e = [0];
57911		let i = 0;
57912		while (i < 64 || e.at(-1) > i - 32) {
57913			const combinedLength = password.length + k.length + userBytes.length,
57914				combinedArray = new Uint8Array(combinedLength);
57915			let writeOffset = 0;
57916			combinedArray.set(password, writeOffset);
57917			writeOffset += password.length;
57918			combinedArray.set(k, writeOffset);
57919			writeOffset += k.length;
57920			combinedArray.set(userBytes, writeOffset);
57921			const k1 = new Uint8Array(combinedLength * 64);
57922			for (let j = 0, pos = 0; j < 64; j++, pos += combinedLength) {
57923				k1.set(combinedArray, pos);
57924			}
57925			const cipher = new AES128Cipher(k.subarray(0, 16));
57926			e = cipher.encrypt(k1, k.subarray(16, 32));
57927			const remainder = e.slice(0, 16).reduce((a, b) => a + b, 0) % 3;
57928			if (remainder === 0) {
57929				k = calculateSHA256(e, 0, e.length);
57930			} else if (remainder === 1) {
57931				k = calculateSHA384(e, 0, e.length);
57932			} else if (remainder === 2) {
57933				k = calculateSHA512(e, 0, e.length);
57934			}
57935			i++;
57936		}
57937		return k.subarray(0, 32);
57938	}
57939	checkOwnerPassword(password, ownerValidationSalt, userBytes, ownerPassword) {
57940		const hashData = new Uint8Array(password.length + 56);
57941		hashData.set(password, 0);
57942		hashData.set(ownerValidationSalt, password.length);
57943		hashData.set(userBytes, password.length + ownerValidationSalt.length);
57944		const result = this._hash(password, hashData, userBytes);
57945		return isArrayEqual(result, ownerPassword);
57946	}
57947	checkUserPassword(password, userValidationSalt, userPassword) {
57948		const hashData = new Uint8Array(password.length + 8);
57949		hashData.set(password, 0);
57950		hashData.set(userValidationSalt, password.length);
57951		const result = this._hash(password, hashData, []);
57952		return isArrayEqual(result, userPassword);
57953	}
57954	getOwnerKey(password, ownerKeySalt, userBytes, ownerEncryption) {
57955		const hashData = new Uint8Array(password.length + 56);
57956		hashData.set(password, 0);
57957		hashData.set(ownerKeySalt, password.length);
57958		hashData.set(userBytes, password.length + ownerKeySalt.length);
57959		const key = this._hash(password, hashData, userBytes);
57960		const cipher = new AES256Cipher(key);
57961		return cipher.decryptBlock(ownerEncryption, false, new Uint8Array(16));
57962	}
57963	getUserKey(password, userKeySalt, userEncryption) {
57964		const hashData = new Uint8Array(password.length + 8);
57965		hashData.set(password, 0);
57966		hashData.set(userKeySalt, password.length);
57967		const key = this._hash(password, hashData, []);
57968		const cipher = new AES256Cipher(key);
57969		return cipher.decryptBlock(userEncryption, false, new Uint8Array(16));
57970	}
57971}
57972class CipherTransform {
57973	constructor(stringCipherConstructor, streamCipherConstructor) {
57974		this.StringCipherConstructor = stringCipherConstructor;
57975		this.StreamCipherConstructor = streamCipherConstructor;
57976	}
57977	createStream(stream, length) {
57978		const cipher = new this.StreamCipherConstructor();
57979		return new DecryptStream(stream, length, function cipherTransformDecryptStream(data, finalize) {
57980			return cipher.decryptBlock(data, finalize);
57981		});
57982	}
57983	decryptString(s) {
57984		const cipher = new this.StringCipherConstructor();
57985		let data = stringToBytes(s);
57986		data = cipher.decryptBlock(data, true);
57987		return bytesToString(data);
57988	}
57989	encryptString(s) {
57990		const cipher = new this.StringCipherConstructor();
57991		if (cipher instanceof AESBaseCipher) {
57992			const strLen = s.length;
57993			const pad = 16 - strLen % 16;
57994			s += String.fromCharCode(pad).repeat(pad);
57995			const iv = new Uint8Array(16);
57996			if (typeof crypto !== "undefined") {
57997				crypto.getRandomValues(iv);
57998			} else {
57999				for (let i = 0; i < 16; i++) {
58000					iv[i] = Math.floor(256 * Math.random());
58001				}
58002			}
58003			let data = stringToBytes(s);
58004			data = cipher.encrypt(data, iv);
58005			const buf = new Uint8Array(16 + data.length);
58006			buf.set(iv);
58007			buf.set(data, 16);
58008			return bytesToString(buf);
58009		}
58010		let data = stringToBytes(s);
58011		data = cipher.encrypt(data);
58012		return bytesToString(data);
58013	}
58014}
58015class CipherTransformFactory {
58016	static #defaultPasswordBytes = new Uint8Array([0x28, 0xbf, 0x4e, 0x5e, 0x4e, 0x75, 0x8a, 0x41, 0x64, 0x00, 0x4e, 0x56, 0xff, 0xfa, 0x01, 0x08, 0x2e, 0x2e, 0x00, 0xb6, 0xd0, 0x68, 0x3e, 0x80, 0x2f, 0x0c, 0xa9, 0xfe, 0x64, 0x53, 0x69, 0x7a]);
58017	#createEncryptionKey20(revision, password, ownerPassword, ownerValidationSalt, ownerKeySalt, uBytes, userPassword, userValidationSalt, userKeySalt, ownerEncryption, userEncryption, perms) {
58018		if (password) {
58019			const passwordLength = Math.min(127, password.length);
58020			password = password.subarray(0, passwordLength);
58021		} else {
58022			password = [];
58023		}
58024		const pdfAlgorithm = revision === 6 ? new PDF20() : new PDF17();
58025		if (pdfAlgorithm.checkUserPassword(password, userValidationSalt, userPassword)) {
58026			return pdfAlgorithm.getUserKey(password, userKeySalt, userEncryption);
58027		} else if (password.length && pdfAlgorithm.checkOwnerPassword(password, ownerValidationSalt, uBytes, ownerPassword)) {
58028			return pdfAlgorithm.getOwnerKey(password, ownerKeySalt, uBytes, ownerEncryption);
58029		}
58030		return null;
58031	}
58032	#prepareKeyData(fileId, password, ownerPassword, userPassword, flags, revision, keyLength, encryptMetadata) {
58033		const hashDataSize = 40 + ownerPassword.length + fileId.length;
58034		const hashData = new Uint8Array(hashDataSize);
58035		let i = 0,
58036			j,
58037			n;
58038		if (password) {
58039			n = Math.min(32, password.length);
58040			for (; i < n; ++i) {
58041				hashData[i] = password[i];
58042			}
58043		}
58044		j = 0;
58045		while (i < 32) {
58046			hashData[i++] = CipherTransformFactory.#defaultPasswordBytes[j++];
58047		}
58048		for (j = 0, n = ownerPassword.length; j < n; ++j) {
58049			hashData[i++] = ownerPassword[j];
58050		}
58051		hashData[i++] = flags & 0xff;
58052		hashData[i++] = flags >> 8 & 0xff;
58053		hashData[i++] = flags >> 16 & 0xff;
58054		hashData[i++] = flags >>> 24 & 0xff;
58055		for (j = 0, n = fileId.length; j < n; ++j) {
58056			hashData[i++] = fileId[j];
58057		}
58058		if (revision >= 4 && !encryptMetadata) {
58059			hashData[i++] = 0xff;
58060			hashData[i++] = 0xff;
58061			hashData[i++] = 0xff;
58062			hashData[i++] = 0xff;
58063		}
58064		let hash = calculateMD5(hashData, 0, i);
58065		const keyLengthInBytes = keyLength >> 3;
58066		if (revision >= 3) {
58067			for (j = 0; j < 50; ++j) {
58068				hash = calculateMD5(hash, 0, keyLengthInBytes);
58069			}
58070		}
58071		const encryptionKey = hash.subarray(0, keyLengthInBytes);
58072		let cipher, checkData;
58073		if (revision >= 3) {
58074			for (i = 0; i < 32; ++i) {
58075				hashData[i] = CipherTransformFactory.#defaultPasswordBytes[i];
58076			}
58077			for (j = 0, n = fileId.length; j < n; ++j) {
58078				hashData[i++] = fileId[j];
58079			}
58080			cipher = new ARCFourCipher(encryptionKey);
58081			checkData = cipher.encryptBlock(calculateMD5(hashData, 0, i));
58082			n = encryptionKey.length;
58083			const derivedKey = new Uint8Array(n);
58084			for (j = 1; j <= 19; ++j) {
58085				for (let k = 0; k < n; ++k) {
58086					derivedKey[k] = encryptionKey[k] ^ j;
58087				}
58088				cipher = new ARCFourCipher(derivedKey);
58089				checkData = cipher.encryptBlock(checkData);
58090			}
58091			for (j = 0, n = checkData.length; j < n; ++j) {
58092				if (userPassword[j] !== checkData[j]) {
58093					return null;
58094				}
58095			}
58096		} else {
58097			cipher = new ARCFourCipher(encryptionKey);
58098			checkData = cipher.encryptBlock(CipherTransformFactory.#defaultPasswordBytes);
58099			for (j = 0, n = checkData.length; j < n; ++j) {
58100				if (userPassword[j] !== checkData[j]) {
58101					return null;
58102				}
58103			}
58104		}
58105		return encryptionKey;
58106	}
58107	#decodeUserPassword(password, ownerPassword, revision, keyLength) {
58108		const hashData = new Uint8Array(32);
58109		let i = 0;
58110		const n = Math.min(32, password.length);
58111		for (; i < n; ++i) {
58112			hashData[i] = password[i];
58113		}
58114		let j = 0;
58115		while (i < 32) {
58116			hashData[i++] = CipherTransformFactory.#defaultPasswordBytes[j++];
58117		}
58118		let hash = calculateMD5(hashData, 0, i);
58119		const keyLengthInBytes = keyLength >> 3;
58120		if (revision >= 3) {
58121			for (j = 0; j < 50; ++j) {
58122				hash = calculateMD5(hash, 0, hash.length);
58123			}
58124		}
58125		let cipher, userPassword;
58126		if (revision >= 3) {
58127			userPassword = ownerPassword;
58128			const derivedKey = new Uint8Array(keyLengthInBytes);
58129			for (j = 19; j >= 0; j--) {
58130				for (let k = 0; k < keyLengthInBytes; ++k) {
58131					derivedKey[k] = hash[k] ^ j;
58132				}
58133				cipher = new ARCFourCipher(derivedKey);
58134				userPassword = cipher.encryptBlock(userPassword);
58135			}
58136		} else {
58137			cipher = new ARCFourCipher(hash.subarray(0, keyLengthInBytes));
58138			userPassword = cipher.encryptBlock(ownerPassword);
58139		}
58140		return userPassword;
58141	}
58142	#buildObjectKey(num, gen, encryptionKey, isAes = false) {
58143		const key = new Uint8Array(encryptionKey.length + 9);
58144		const n = encryptionKey.length;
58145		let i;
58146		for (i = 0; i < n; ++i) {
58147			key[i] = encryptionKey[i];
58148		}
58149		key[i++] = num & 0xff;
58150		key[i++] = num >> 8 & 0xff;
58151		key[i++] = num >> 16 & 0xff;
58152		key[i++] = gen & 0xff;
58153		key[i++] = gen >> 8 & 0xff;
58154		if (isAes) {
58155			key[i++] = 0x73;
58156			key[i++] = 0x41;
58157			key[i++] = 0x6c;
58158			key[i++] = 0x54;
58159		}
58160		const hash = calculateMD5(key, 0, i);
58161		return hash.subarray(0, Math.min(encryptionKey.length + 5, 16));
58162	}
58163	#buildCipherConstructor(cf, name, num, gen, key) {
58164		if (!(name instanceof Name)) {
58165			throw new FormatError("Invalid crypt filter name.");
58166		}
58167		const self = this;
58168		const cryptFilter = cf.get(name.name);
58169		const cfm = cryptFilter?.get("CFM");
58170		if (!cfm || cfm.name === "None") {
58171			return function () {
58172				return new NullCipher();
58173			};
58174		}
58175		if (cfm.name === "V2") {
58176			return function () {
58177				return new ARCFourCipher(self.#buildObjectKey(num, gen, key, false));
58178			};
58179		}
58180		if (cfm.name === "AESV2") {
58181			return function () {
58182				return new AES128Cipher(self.#buildObjectKey(num, gen, key, true));
58183			};
58184		}
58185		if (cfm.name === "AESV3") {
58186			return function () {
58187				return new AES256Cipher(key);
58188			};
58189		}
58190		throw new FormatError("Unknown crypto method");
58191	}
58192	constructor(dict, fileId, password) {
58193		const filter = dict.get("Filter");
58194		if (!isName(filter, "Standard")) {
58195			throw new FormatError("unknown encryption method");
58196		}
58197		this.filterName = filter.name;
58198		this.dict = dict;
58199		const algorithm = dict.get("V");
58200		if (!Number.isInteger(algorithm) || algorithm !== 1 && algorithm !== 2 && algorithm !== 4 && algorithm !== 5) {
58201			throw new FormatError("unsupported encryption algorithm");
58202		}
58203		this.algorithm = algorithm;
58204		let keyLength = dict.get("Length");
58205		if (!keyLength) {
58206			if (algorithm <= 3) {
58207				keyLength = 40;
58208			} else {
58209				const cfDict = dict.get("CF");
58210				const streamCryptoName = dict.get("StmF");
58211				if (cfDict instanceof Dict && streamCryptoName instanceof Name) {
58212					cfDict.suppressEncryption = true;
58213					const handlerDict = cfDict.get(streamCryptoName.name);
58214					keyLength = handlerDict?.get("Length") || 128;
58215					if (keyLength < 40) {
58216						keyLength <<= 3;
58217					}
58218				}
58219			}
58220		}
58221		if (!Number.isInteger(keyLength) || keyLength < 40 || keyLength % 8 !== 0) {
58222			throw new FormatError("invalid key length");
58223		}
58224		const ownerBytes = stringToBytes(dict.get("O")),
58225			userBytes = stringToBytes(dict.get("U"));
58226		const ownerPassword = ownerBytes.subarray(0, 32);
58227		const userPassword = userBytes.subarray(0, 32);
58228		const flags = dict.get("P");
58229		const revision = dict.get("R");
58230		const encryptMetadata = (algorithm === 4 || algorithm === 5) && dict.get("EncryptMetadata") !== false;
58231		this.encryptMetadata = encryptMetadata;
58232		const fileIdBytes = stringToBytes(fileId);
58233		let passwordBytes;
58234		if (password) {
58235			if (revision === 6) {
58236				try {
58237					password = utf8StringToString(password);
58238				} catch {
58239					warn("CipherTransformFactory: Unable to convert UTF8 encoded password.");
58240				}
58241			}
58242			passwordBytes = stringToBytes(password);
58243		}
58244		let encryptionKey;
58245		if (algorithm !== 5) {
58246			encryptionKey = this.#prepareKeyData(fileIdBytes, passwordBytes, ownerPassword, userPassword, flags, revision, keyLength, encryptMetadata);
58247		} else {
58248			const ownerValidationSalt = ownerBytes.subarray(32, 40);
58249			const ownerKeySalt = ownerBytes.subarray(40, 48);
58250			const uBytes = userBytes.subarray(0, 48);
58251			const userValidationSalt = userBytes.subarray(32, 40);
58252			const userKeySalt = userBytes.subarray(40, 48);
58253			const ownerEncryption = stringToBytes(dict.get("OE"));
58254			const userEncryption = stringToBytes(dict.get("UE"));
58255			const perms = stringToBytes(dict.get("Perms"));
58256			encryptionKey = this.#createEncryptionKey20(revision, passwordBytes, ownerPassword, ownerValidationSalt, ownerKeySalt, uBytes, userPassword, userValidationSalt, userKeySalt, ownerEncryption, userEncryption, perms);
58257		}
58258		if (!encryptionKey && !password) {
58259			throw new PasswordException("No password given", PasswordResponses.NEED_PASSWORD);
58260		} else if (!encryptionKey && password) {
58261			const decodedPassword = this.#decodeUserPassword(passwordBytes, ownerPassword, revision, keyLength);
58262			encryptionKey = this.#prepareKeyData(fileIdBytes, decodedPassword, ownerPassword, userPassword, flags, revision, keyLength, encryptMetadata);
58263		}
58264		if (!encryptionKey) {
58265			throw new PasswordException("Incorrect Password", PasswordResponses.INCORRECT_PASSWORD);
58266		}
58267		this.encryptionKey = encryptionKey;
58268		if (algorithm >= 4) {
58269			const cf = dict.get("CF");
58270			if (cf instanceof Dict) {
58271				cf.suppressEncryption = true;
58272			}
58273			this.cf = cf;
58274			this.stmf = dict.get("StmF") || Name.get("Identity");
58275			this.strf = dict.get("StrF") || Name.get("Identity");
58276			this.eff = dict.get("EFF") || this.stmf;
58277		}
58278	}
58279	createCipherTransform(num, gen) {
58280		if (this.algorithm === 4 || this.algorithm === 5) {
58281			return new CipherTransform(this.#buildCipherConstructor(this.cf, this.strf, num, gen, this.encryptionKey), this.#buildCipherConstructor(this.cf, this.stmf, num, gen, this.encryptionKey));
58282		}
58283		const key = this.#buildObjectKey(num, gen, this.encryptionKey, false);
58284		const cipherConstructor = function () {
58285			return new ARCFourCipher(key);
58286		};
58287		return new CipherTransform(cipherConstructor, cipherConstructor);
58288	}
58289}
58290
58291;// ./src/core/dataset_reader.js
58292
58293
58294
58295
58296function decodeString(str) {
58297	try {
58298		return stringToUTF8String(str);
58299	} catch (ex) {
58300		warn(`UTF-8 decoding failed: "${ex}".`);
58301		return str;
58302	}
58303}
58304class DatasetXMLParser extends SimpleXMLParser {
58305	constructor(options) {
58306		super(options);
58307		this.node = null;
58308	}
58309	onEndElement(name) {
58310		const node = super.onEndElement(name);
58311		if (node && name === "xfa:datasets") {
58312			this.node = node;
58313			throw new Error("Aborting DatasetXMLParser.");
58314		}
58315	}
58316}
58317class DatasetReader {
58318	constructor(data) {
58319		if (data.datasets) {
58320			this.node = new SimpleXMLParser({
58321				hasAttributes: true
58322			}).parseFromString(data.datasets).documentElement;
58323		} else {
58324			const parser = new DatasetXMLParser({
58325				hasAttributes: true
58326			});
58327			try {
58328				parser.parseFromString(data["xdp:xdp"]);
58329			} catch {}
58330			this.node = parser.node;
58331		}
58332	}
58333	getValue(path) {
58334		if (!this.node || !path) {
58335			return "";
58336		}
58337		const node = this.node.searchNode(parseXFAPath(path), 0);
58338		if (!node) {
58339			return "";
58340		}
58341		const first = node.firstChild;
58342		if (first?.nodeName === "value") {
58343			return node.children.map(child => decodeString(child.textContent));
58344		}
58345		return decodeString(node.textContent);
58346	}
58347}
58348
58349;// ./src/core/xref.js
58350
58351
58352
58353
58354
58355
58356
58357
58358
58359
58360
58361
58362
58363
58364
58365
58366
58367
58368
58369
58370class XRef {
58371	#firstXRefStmPos = null;
58372	constructor(stream, pdfManager) {
58373		this.stream = stream;
58374		this.pdfManager = pdfManager;
58375		this.entries = [];
58376		this._xrefStms = new Set();
58377		this._cacheMap = new Map();
58378		this._pendingRefs = new RefSet();
58379		this._newPersistentRefNum = null;
58380		this._newTemporaryRefNum = null;
58381		this._persistentRefsCache = null;
58382	}
58383	getNewPersistentRef(obj) {
58384		if (this._newPersistentRefNum === null) {
58385			this._newPersistentRefNum = this.entries.length || 1;
58386		}
58387		const num = this._newPersistentRefNum++;
58388		this._cacheMap.set(num, obj);
58389		return Ref.get(num, 0);
58390	}
58391	getNewTemporaryRef() {
58392		if (this._newTemporaryRefNum === null) {
58393			this._newTemporaryRefNum = this.entries.length || 1;
58394			if (this._newPersistentRefNum) {
58395				this._persistentRefsCache = new Map();
58396				for (let i = this._newTemporaryRefNum; i < this._newPersistentRefNum; i++) {
58397					this._persistentRefsCache.set(i, this._cacheMap.get(i));
58398					this._cacheMap.delete(i);
58399				}
58400			}
58401		}
58402		return Ref.get(this._newTemporaryRefNum++, 0);
58403	}
58404	resetNewTemporaryRef() {
58405		this._newTemporaryRefNum = null;
58406		if (this._persistentRefsCache) {
58407			for (const [num, obj] of this._persistentRefsCache) {
58408				this._cacheMap.set(num, obj);
58409			}
58410		}
58411		this._persistentRefsCache = null;
58412	}
58413	setStartXRef(startXRef) {
58414		this.startXRefQueue = [startXRef];
58415	}
58416	parse(recoveryMode = false) {
58417		let trailerDict;
58418		if (!recoveryMode) {
58419			trailerDict = this.readXRef();
58420		} else {
58421			warn("Indexing all PDF objects");
58422			trailerDict = this.indexObjects();
58423		}
58424		trailerDict.assignXref(this);
58425		this.trailer = trailerDict;
58426		let encrypt;
58427		try {
58428			encrypt = trailerDict.get("Encrypt");
58429		} catch (ex) {
58430			if (ex instanceof MissingDataException) {
58431				throw ex;
58432			}
58433			warn(`XRef.parse - Invalid "Encrypt" reference: "${ex}".`);
58434		}
58435		if (encrypt instanceof Dict) {
58436			const ids = trailerDict.get("ID");
58437			const fileId = ids?.length ? ids[0] : "";
58438			encrypt.suppressEncryption = true;
58439			this.encrypt = new CipherTransformFactory(encrypt, fileId, this.pdfManager.password);
58440		}
58441		let root;
58442		try {
58443			root = trailerDict.get("Root");
58444		} catch (ex) {
58445			if (ex instanceof MissingDataException) {
58446				throw ex;
58447			}
58448			warn(`XRef.parse - Invalid "Root" reference: "${ex}".`);
58449		}
58450		if (root instanceof Dict) {
58451			try {
58452				const pages = root.get("Pages");
58453				if (pages instanceof Dict) {
58454					this.root = root;
58455					return;
58456				}
58457			} catch (ex) {
58458				if (ex instanceof MissingDataException) {
58459					throw ex;
58460				}
58461				warn(`XRef.parse - Invalid "Pages" reference: "${ex}".`);
58462			}
58463		}
58464		if (!recoveryMode) {
58465			throw new XRefParseException();
58466		}
58467		throw new InvalidPDFException("Invalid Root reference.");
58468	}
58469	processXRefTable(parser) {
58470		if (!("tableState" in this)) {
58471			this.tableState = {
58472				entryNum: 0,
58473				streamPos: parser.lexer.stream.pos,
58474				parserBuf1: parser.buf1,
58475				parserBuf2: parser.buf2
58476			};
58477		}
58478		const obj = this.readXRefTable(parser);
58479		if (!isCmd(obj, "trailer")) {
58480			throw new FormatError("Invalid XRef table: could not find trailer dictionary");
58481		}
58482		let dict = parser.getObj();
58483		if (!(dict instanceof Dict) && dict.dict) {
58484			dict = dict.dict;
58485		}
58486		if (!(dict instanceof Dict)) {
58487			throw new FormatError("Invalid XRef table: could not parse trailer dictionary");
58488		}
58489		delete this.tableState;
58490		return dict;
58491	}
58492	readXRefTable(parser) {
58493		const stream = parser.lexer.stream;
58494		const tableState = this.tableState;
58495		stream.pos = tableState.streamPos;
58496		parser.buf1 = tableState.parserBuf1;
58497		parser.buf2 = tableState.parserBuf2;
58498		let obj;
58499		while (true) {
58500			if (!("firstEntryNum" in tableState) || !("entryCount" in tableState)) {
58501				if (isCmd(obj = parser.getObj(), "trailer")) {
58502					break;
58503				}
58504				tableState.firstEntryNum = obj;
58505				tableState.entryCount = parser.getObj();
58506			}
58507			let first = tableState.firstEntryNum;
58508			const count = tableState.entryCount;
58509			if (!Number.isInteger(first) || !Number.isInteger(count)) {
58510				throw new FormatError("Invalid XRef table: wrong types in subsection header");
58511			}
58512			for (let i = tableState.entryNum; i < count; i++) {
58513				tableState.streamPos = stream.pos;
58514				tableState.entryNum = i;
58515				tableState.parserBuf1 = parser.buf1;
58516				tableState.parserBuf2 = parser.buf2;
58517				const entry = {};
58518				entry.offset = parser.getObj();
58519				entry.gen = parser.getObj();
58520				const type = parser.getObj();
58521				if (type instanceof Cmd) {
58522					switch (type.cmd) {
58523						case "f":
58524							entry.free = true;
58525							break;
58526						case "n":
58527							entry.uncompressed = true;
58528							break;
58529					}
58530				}
58531				if (!Number.isInteger(entry.offset) || !Number.isInteger(entry.gen) || !(entry.free || entry.uncompressed)) {
58532					throw new FormatError(`Invalid entry in XRef subsection: ${first}, ${count}`);
58533				}
58534				if (i === 0 && entry.free && first === 1) {
58535					first = 0;
58536				}
58537				if (!this.entries[i + first]) {
58538					this.entries[i + first] = entry;
58539				}
58540			}
58541			tableState.entryNum = 0;
58542			tableState.streamPos = stream.pos;
58543			tableState.parserBuf1 = parser.buf1;
58544			tableState.parserBuf2 = parser.buf2;
58545			delete tableState.firstEntryNum;
58546			delete tableState.entryCount;
58547		}
58548		if (this.entries[0] && !this.entries[0].free) {
58549			throw new FormatError("Invalid XRef table: unexpected first object");
58550		}
58551		return obj;
58552	}
58553	processXRefStream(stream) {
58554		if (!("streamState" in this)) {
58555			const {
58556				dict,
58557				pos
58558			} = stream;
58559			const byteWidths = dict.get("W");
58560			const range = dict.get("Index") || [0, dict.get("Size")];
58561			this.streamState = {
58562				entryRanges: range,
58563				byteWidths,
58564				entryNum: 0,
58565				streamPos: pos
58566			};
58567		}
58568		this.readXRefStream(stream);
58569		delete this.streamState;
58570		return stream.dict;
58571	}
58572	readXRefStream(stream) {
58573		const streamState = this.streamState;
58574		stream.pos = streamState.streamPos;
58575		const [typeFieldWidth, offsetFieldWidth, generationFieldWidth] = streamState.byteWidths;
58576		const entryRanges = streamState.entryRanges;
58577		while (entryRanges.length > 0) {
58578			const [first, n] = entryRanges;
58579			if (!Number.isInteger(first) || !Number.isInteger(n)) {
58580				throw new FormatError(`Invalid XRef range fields: ${first}, ${n}`);
58581			}
58582			if (!Number.isInteger(typeFieldWidth) || !Number.isInteger(offsetFieldWidth) || !Number.isInteger(generationFieldWidth)) {
58583				throw new FormatError(`Invalid XRef entry fields length: ${first}, ${n}`);
58584			}
58585			for (let i = streamState.entryNum; i < n; ++i) {
58586				streamState.entryNum = i;
58587				streamState.streamPos = stream.pos;
58588				let type = 0,
58589					offset = 0,
58590					generation = 0;
58591				for (let j = 0; j < typeFieldWidth; ++j) {
58592					const typeByte = stream.getByte();
58593					if (typeByte === -1) {
58594						throw new FormatError("Invalid XRef byteWidths 'type'.");
58595					}
58596					type = type << 8 | typeByte;
58597				}
58598				if (typeFieldWidth === 0) {
58599					type = 1;
58600				}
58601				for (let j = 0; j < offsetFieldWidth; ++j) {
58602					const offsetByte = stream.getByte();
58603					if (offsetByte === -1) {
58604						throw new FormatError("Invalid XRef byteWidths 'offset'.");
58605					}
58606					offset = offset << 8 | offsetByte;
58607				}
58608				for (let j = 0; j < generationFieldWidth; ++j) {
58609					const generationByte = stream.getByte();
58610					if (generationByte === -1) {
58611						throw new FormatError("Invalid XRef byteWidths 'generation'.");
58612					}
58613					generation = generation << 8 | generationByte;
58614				}
58615				const entry = {};
58616				entry.offset = offset;
58617				entry.gen = generation;
58618				switch (type) {
58619					case 0:
58620						entry.free = true;
58621						break;
58622					case 1:
58623						entry.uncompressed = true;
58624						break;
58625					case 2:
58626						break;
58627					default:
58628						throw new FormatError(`Invalid XRef entry type: ${type}`);
58629				}
58630				if (!this.entries[first + i]) {
58631					this.entries[first + i] = entry;
58632				}
58633			}
58634			streamState.entryNum = 0;
58635			streamState.streamPos = stream.pos;
58636			entryRanges.splice(0, 2);
58637		}
58638	}
58639	indexObjects() {
58640		const TAB = 0x9,
58641			LF = 0xa,
58642			CR = 0xd,
58643			SPACE = 0x20;
58644		const PERCENT = 0x25,
58645			LT = 0x3c;
58646		function readToken(data, offset) {
58647			let token = "",
58648				ch = data[offset];
58649			while (ch !== LF && ch !== CR && ch !== LT) {
58650				if (++offset >= data.length) {
58651					break;
58652				}
58653				token += String.fromCharCode(ch);
58654				ch = data[offset];
58655			}
58656			return token;
58657		}
58658		function skipUntil(data, offset, what) {
58659			const length = what.length,
58660				dataLength = data.length;
58661			let skipped = 0;
58662			while (offset < dataLength) {
58663				let i = 0;
58664				while (i < length && data[offset + i] === what[i]) {
58665					++i;
58666				}
58667				if (i >= length) {
58668					break;
58669				}
58670				offset++;
58671				skipped++;
58672			}
58673			return skipped;
58674		}
58675		const gEndobjRegExp = /\b(endobj|\d+\s+\d+\s+obj|xref|trailer\s*<<)\b/g;
58676		const gStartxrefRegExp = /\b(startxref|\d+\s+\d+\s+obj)\b/g;
58677		const objRegExp = /^(\d+)\s+(\d+)\s+obj\b/;
58678		const trailerBytes = new Uint8Array([116, 114, 97, 105, 108, 101, 114]);
58679		const startxrefBytes = new Uint8Array([115, 116, 97, 114, 116, 120, 114, 101, 102]);
58680		const xrefBytes = new Uint8Array([47, 88, 82, 101, 102]);
58681		this.entries.length = 0;
58682		this._cacheMap.clear();
58683		const stream = this.stream;
58684		stream.pos = 0;
58685		const buffer = stream.getBytes(),
58686			bufferStr = bytesToString(buffer),
58687			length = buffer.length;
58688		let position = stream.start;
58689		const trailers = [],
58690			xrefStms = [];
58691		while (position < length) {
58692			let ch = buffer[position];
58693			if (ch === TAB || ch === LF || ch === CR || ch === SPACE) {
58694				++position;
58695				continue;
58696			}
58697			if (ch === PERCENT) {
58698				do {
58699					++position;
58700					if (position >= length) {
58701						break;
58702					}
58703					ch = buffer[position];
58704				} while (ch !== LF && ch !== CR);
58705				continue;
58706			}
58707			const token = readToken(buffer, position);
58708			let m;
58709			if (token.startsWith("xref") && (token.length === 4 || /\s/.test(token[4]))) {
58710				position += skipUntil(buffer, position, trailerBytes);
58711				trailers.push(position);
58712				position += skipUntil(buffer, position, startxrefBytes);
58713			} else if (m = objRegExp.exec(token)) {
58714				const num = m[1] | 0,
58715					gen = m[2] | 0;
58716				const startPos = position + token.length;
58717				let contentLength,
58718					updateEntries = false;
58719				if (!this.entries[num]) {
58720					updateEntries = true;
58721				} else if (this.entries[num].gen === gen) {
58722					try {
58723						const parser = new Parser({
58724							lexer: new Lexer(stream.makeSubStream(startPos))
58725						});
58726						parser.getObj();
58727						updateEntries = true;
58728					} catch (ex) {
58729						if (ex instanceof ParserEOFException) {
58730							warn(`indexObjects -- checking object (${token}): "${ex}".`);
58731						} else {
58732							updateEntries = true;
58733						}
58734					}
58735				}
58736				if (updateEntries) {
58737					this.entries[num] = {
58738						offset: position - stream.start,
58739						gen,
58740						uncompressed: true
58741					};
58742				}
58743				gEndobjRegExp.lastIndex = startPos;
58744				const match = gEndobjRegExp.exec(bufferStr);
58745				if (match) {
58746					const endPos = gEndobjRegExp.lastIndex + 1;
58747					contentLength = endPos - position;
58748					if (match[1] !== "endobj") {
58749						warn(`indexObjects: Found "${match[1]}" inside of another "obj", ` + 'caused by missing "endobj" -- trying to recover.');
58750						contentLength -= match[1].length + 1;
58751					}
58752				} else {
58753					contentLength = length - position;
58754				}
58755				const content = buffer.subarray(position, position + contentLength);
58756				const xrefTagOffset = skipUntil(content, 0, xrefBytes);
58757				if (xrefTagOffset < contentLength && content[xrefTagOffset + 5] < 64) {
58758					xrefStms.push(position - stream.start);
58759					this._xrefStms.add(position - stream.start);
58760				}
58761				position += contentLength;
58762			} else if (token.startsWith("trailer") && (token.length === 7 || /\s/.test(token[7]))) {
58763				trailers.push(position);
58764				const startPos = position + token.length;
58765				let contentLength;
58766				gStartxrefRegExp.lastIndex = startPos;
58767				const match = gStartxrefRegExp.exec(bufferStr);
58768				if (match) {
58769					const endPos = gStartxrefRegExp.lastIndex + 1;
58770					contentLength = endPos - position;
58771					if (match[1] !== "startxref") {
58772						warn(`indexObjects: Found "${match[1]}" after "trailer", ` + 'caused by missing "startxref" -- trying to recover.');
58773						contentLength -= match[1].length + 1;
58774					}
58775				} else {
58776					contentLength = length - position;
58777				}
58778				position += contentLength;
58779			} else {
58780				position += token.length + 1;
58781			}
58782		}
58783		for (const xrefStm of xrefStms) {
58784			this.startXRefQueue.push(xrefStm);
58785			this.readXRef(true);
58786		}
58787		const trailerDicts = [];
58788		let isEncrypted = false;
58789		for (const trailer of trailers) {
58790			stream.pos = trailer;
58791			const parser = new Parser({
58792				lexer: new Lexer(stream),
58793				xref: this,
58794				allowStreams: true,
58795				recoveryMode: true
58796			});
58797			const obj = parser.getObj();
58798			if (!isCmd(obj, "trailer")) {
58799				continue;
58800			}
58801			const dict = parser.getObj();
58802			if (!(dict instanceof Dict)) {
58803				continue;
58804			}
58805			trailerDicts.push(dict);
58806			if (dict.has("Encrypt")) {
58807				isEncrypted = true;
58808			}
58809		}
58810		let trailerDict, trailerError;
58811		for (const dict of [...trailerDicts, "genFallback", ...trailerDicts]) {
58812			if (dict === "genFallback") {
58813				if (!trailerError) {
58814					break;
58815				}
58816				this._generationFallback = true;
58817				continue;
58818			}
58819			let validPagesDict = false;
58820			try {
58821				const rootDict = dict.get("Root");
58822				if (!(rootDict instanceof Dict)) {
58823					continue;
58824				}
58825				const pagesDict = rootDict.get("Pages");
58826				if (!(pagesDict instanceof Dict)) {
58827					continue;
58828				}
58829				const pagesCount = pagesDict.get("Count");
58830				if (Number.isInteger(pagesCount)) {
58831					validPagesDict = true;
58832				}
58833			} catch (ex) {
58834				trailerError = ex;
58835				continue;
58836			}
58837			if (validPagesDict && (!isEncrypted || dict.has("Encrypt")) && dict.has("ID")) {
58838				return dict;
58839			}
58840			trailerDict = dict;
58841		}
58842		if (trailerDict) {
58843			return trailerDict;
58844		}
58845		if (this.topDict) {
58846			return this.topDict;
58847		}
58848		if (!trailerDicts.length) {
58849			for (const [num, entry] of this.entries.entries()) {
58850				if (!entry) {
58851					continue;
58852				}
58853				const ref = Ref.get(num, entry.gen);
58854				let obj;
58855				try {
58856					obj = this.fetch(ref);
58857				} catch {
58858					continue;
58859				}
58860				if (obj instanceof BaseStream) {
58861					obj = obj.dict;
58862				}
58863				if (obj instanceof Dict && obj.has("Root")) {
58864					return obj;
58865				}
58866			}
58867		}
58868		throw new InvalidPDFException("Invalid PDF structure.");
58869	}
58870	readXRef(recoveryMode = false) {
58871		const stream = this.stream;
58872		const startXRefParsedCache = new Set();
58873		while (this.startXRefQueue.length) {
58874			try {
58875				const startXRef = this.startXRefQueue[0];
58876				if (startXRefParsedCache.has(startXRef)) {
58877					warn("readXRef - skipping XRef table since it was already parsed.");
58878					this.startXRefQueue.shift();
58879					continue;
58880				}
58881				startXRefParsedCache.add(startXRef);
58882				stream.pos = startXRef + stream.start;
58883				const parser = new Parser({
58884					lexer: new Lexer(stream),
58885					xref: this,
58886					allowStreams: true
58887				});
58888				let obj = parser.getObj();
58889				let dict;
58890				if (isCmd(obj, "xref")) {
58891					dict = this.processXRefTable(parser);
58892					if (!this.topDict) {
58893						this.topDict = dict;
58894					}
58895					obj = dict.get("XRefStm");
58896					if (Number.isInteger(obj) && !this._xrefStms.has(obj)) {
58897						this._xrefStms.add(obj);
58898						this.startXRefQueue.push(obj);
58899						this.#firstXRefStmPos ??= obj;
58900					}
58901				} else if (Number.isInteger(obj)) {
58902					if (!Number.isInteger(parser.getObj()) || !isCmd(parser.getObj(), "obj") || !((obj = parser.getObj()) instanceof BaseStream)) {
58903						throw new FormatError("Invalid XRef stream");
58904					}
58905					dict = this.processXRefStream(obj);
58906					if (!this.topDict) {
58907						this.topDict = dict;
58908					}
58909					if (!dict) {
58910						throw new FormatError("Failed to read XRef stream");
58911					}
58912				} else {
58913					throw new FormatError("Invalid XRef stream header");
58914				}
58915				obj = dict.get("Prev");
58916				if (Number.isInteger(obj)) {
58917					this.startXRefQueue.push(obj);
58918				} else if (obj instanceof Ref) {
58919					this.startXRefQueue.push(obj.num);
58920				}
58921			} catch (e) {
58922				if (e instanceof MissingDataException) {
58923					throw e;
58924				}
58925				info("(while reading XRef): " + e);
58926			}
58927			this.startXRefQueue.shift();
58928		}
58929		if (this.topDict) {
58930			return this.topDict;
58931		}
58932		if (recoveryMode) {
58933			return undefined;
58934		}
58935		throw new XRefParseException();
58936	}
58937	get lastXRefStreamPos() {
58938		return this.#firstXRefStmPos ?? (this._xrefStms.size > 0 ? Math.max(...this._xrefStms) : null);
58939	}
58940	getEntry(i) {
58941		const xrefEntry = this.entries[i];
58942		if (xrefEntry && !xrefEntry.free && xrefEntry.offset) {
58943			return xrefEntry;
58944		}
58945		return null;
58946	}
58947	fetchIfRef(obj, suppressEncryption = false) {
58948		if (obj instanceof Ref) {
58949			return this.fetch(obj, suppressEncryption);
58950		}
58951		return obj;
58952	}
58953	fetch(ref, suppressEncryption = false) {
58954		if (!(ref instanceof Ref)) {
58955			throw new Error("ref object is not a reference");
58956		}
58957		const num = ref.num;
58958		const cacheEntry = this._cacheMap.get(num);
58959		if (cacheEntry !== undefined) {
58960			if (cacheEntry instanceof Dict && !cacheEntry.objId) {
58961				cacheEntry.objId = ref.toString();
58962			}
58963			return cacheEntry;
58964		}
58965		let xrefEntry = this.getEntry(num);
58966		if (xrefEntry === null) {
58967			this._cacheMap.set(num, xrefEntry);
58968			return xrefEntry;
58969		}
58970		if (this._pendingRefs.has(ref)) {
58971			this._pendingRefs.remove(ref);
58972			warn(`Ignoring circular reference: ${ref}.`);
58973			return CIRCULAR_REF;
58974		}
58975		this._pendingRefs.put(ref);
58976		try {
58977			xrefEntry = xrefEntry.uncompressed ? this.fetchUncompressed(ref, xrefEntry, suppressEncryption) : this.fetchCompressed(ref, xrefEntry, suppressEncryption);
58978			this._pendingRefs.remove(ref);
58979		} catch (ex) {
58980			this._pendingRefs.remove(ref);
58981			throw ex;
58982		}
58983		if (xrefEntry instanceof Dict) {
58984			xrefEntry.objId = ref.toString();
58985		} else if (xrefEntry instanceof BaseStream) {
58986			xrefEntry.dict.objId = ref.toString();
58987		}
58988		return xrefEntry;
58989	}
58990	fetchUncompressed(ref, xrefEntry, suppressEncryption = false) {
58991		const gen = ref.gen;
58992		let num = ref.num;
58993		if (xrefEntry.gen !== gen) {
58994			const msg = `Inconsistent generation in XRef: ${ref}`;
58995			if (this._generationFallback && xrefEntry.gen < gen) {
58996				warn(msg);
58997				return this.fetchUncompressed(Ref.get(num, xrefEntry.gen), xrefEntry, suppressEncryption);
58998			}
58999			throw new XRefEntryException(msg);
59000		}
59001		const stream = this.stream.makeSubStream(xrefEntry.offset + this.stream.start);
59002		const parser = new Parser({
59003			lexer: new Lexer(stream),
59004			xref: this,
59005			allowStreams: true
59006		});
59007		const obj1 = parser.getObj();
59008		const obj2 = parser.getObj();
59009		const obj3 = parser.getObj();
59010		if (obj1 !== num || obj2 !== gen || !(obj3 instanceof Cmd)) {
59011			throw new XRefEntryException(`Bad (uncompressed) XRef entry: ${ref}`);
59012		}
59013		if (obj3.cmd !== "obj") {
59014			if (obj3.cmd.startsWith("obj")) {
59015				num = parseInt(obj3.cmd.substring(3), 10);
59016				if (!Number.isNaN(num)) {
59017					return num;
59018				}
59019			}
59020			throw new XRefEntryException(`Bad (uncompressed) XRef entry: ${ref}`);
59021		}
59022		xrefEntry = this.encrypt && !suppressEncryption ? parser.getObj(this.encrypt.createCipherTransform(num, gen)) : parser.getObj();
59023		if (!(xrefEntry instanceof BaseStream)) {
59024			this._cacheMap.set(num, xrefEntry);
59025		}
59026		return xrefEntry;
59027	}
59028	fetchCompressed(ref, xrefEntry, suppressEncryption = false) {
59029		const tableOffset = xrefEntry.offset;
59030		const stream = this.fetch(Ref.get(tableOffset, 0));
59031		if (!(stream instanceof BaseStream)) {
59032			throw new FormatError("bad ObjStm stream");
59033		}
59034		const first = stream.dict.get("First");
59035		const n = stream.dict.get("N");
59036		if (!Number.isInteger(first) || !Number.isInteger(n)) {
59037			throw new FormatError("invalid first and n parameters for ObjStm stream");
59038		}
59039		let parser = new Parser({
59040			lexer: new Lexer(stream),
59041			xref: this,
59042			allowStreams: true
59043		});
59044		const nums = new Array(n);
59045		const offsets = new Array(n);
59046		for (let i = 0; i < n; ++i) {
59047			const num = parser.getObj();
59048			if (!Number.isInteger(num)) {
59049				throw new FormatError(`invalid object number in the ObjStm stream: ${num}`);
59050			}
59051			const offset = parser.getObj();
59052			if (!Number.isInteger(offset)) {
59053				throw new FormatError(`invalid object offset in the ObjStm stream: ${offset}`);
59054			}
59055			nums[i] = num;
59056			offsets[i] = offset;
59057		}
59058		const start = (stream.start || 0) + first;
59059		const entries = new Array(n);
59060		for (let i = 0; i < n; ++i) {
59061			const length = i < n - 1 ? offsets[i + 1] - offsets[i] : undefined;
59062			if (length < 0) {
59063				throw new FormatError("Invalid offset in the ObjStm stream.");
59064			}
59065			parser = new Parser({
59066				lexer: new Lexer(stream.makeSubStream(start + offsets[i], length, stream.dict)),
59067				xref: this,
59068				allowStreams: true
59069			});
59070			const obj = parser.getObj();
59071			entries[i] = obj;
59072			if (obj instanceof BaseStream) {
59073				continue;
59074			}
59075			const num = nums[i],
59076				entry = this.entries[num];
59077			if (entry && entry.offset === tableOffset && entry.gen === i) {
59078				this._cacheMap.set(num, obj);
59079			}
59080		}
59081		xrefEntry = entries[xrefEntry.gen];
59082		if (xrefEntry === undefined) {
59083			throw new XRefEntryException(`Bad (compressed) XRef entry: ${ref}`);
59084		}
59085		return xrefEntry;
59086	}
59087	async fetchIfRefAsync(obj, suppressEncryption) {
59088		if (obj instanceof Ref) {
59089			return this.fetchAsync(obj, suppressEncryption);
59090		}
59091		return obj;
59092	}
59093	async fetchAsync(ref, suppressEncryption) {
59094		try {
59095			return this.fetch(ref, suppressEncryption);
59096		} catch (ex) {
59097			if (!(ex instanceof MissingDataException)) {
59098				throw ex;
59099			}
59100			await this.pdfManager.requestRange(ex.begin, ex.end);
59101			return this.fetchAsync(ref, suppressEncryption);
59102		}
59103	}
59104	getCatalogObj() {
59105		return this.root;
59106	}
59107}
59108
59109;// ./src/core/document.js
59110
59111
59112
59113
59114
59115
59116
59117
59118
59119
59120
59121
59122
59123
59124
59125
59126
59127
59128
59129
59130
59131
59132
59133
59134
59135
59136
59137
59138
59139
59140
59141
59142
59143
59144
59145
59146
59147const LETTER_SIZE_MEDIABOX = [0, 0, 612, 792];
59148class Page {
59149	constructor({
59150		pdfManager,
59151		xref,
59152		pageIndex,
59153		pageDict,
59154		ref,
59155		globalIdFactory,
59156		fontCache,
59157		builtInCMapCache,
59158		standardFontDataCache,
59159		globalImageCache,
59160		systemFontCache,
59161		nonBlendModesSet,
59162		xfaFactory
59163	}) {
59164		this.pdfManager = pdfManager;
59165		this.pageIndex = pageIndex;
59166		this.pageDict = pageDict;
59167		this.xref = xref;
59168		this.ref = ref;
59169		this.fontCache = fontCache;
59170		this.builtInCMapCache = builtInCMapCache;
59171		this.standardFontDataCache = standardFontDataCache;
59172		this.globalImageCache = globalImageCache;
59173		this.systemFontCache = systemFontCache;
59174		this.nonBlendModesSet = nonBlendModesSet;
59175		this.evaluatorOptions = pdfManager.evaluatorOptions;
59176		this.resourcesPromise = null;
59177		this.xfaFactory = xfaFactory;
59178		const idCounters = {
59179			obj: 0
59180		};
59181		this._localIdFactory = class extends globalIdFactory {
59182			static createObjId() {
59183				return `p${pageIndex}_${++idCounters.obj}`;
59184			}
59185			static getPageObjId() {
59186				return `p${ref.toString()}`;
59187			}
59188		};
59189	}
59190	_getInheritableProperty(key, getArray = false) {
59191		const value = getInheritableProperty({
59192			dict: this.pageDict,
59193			key,
59194			getArray,
59195			stopWhenFound: false
59196		});
59197		if (!Array.isArray(value)) {
59198			return value;
59199		}
59200		if (value.length === 1 || !(value[0] instanceof Dict)) {
59201			return value[0];
59202		}
59203		return Dict.merge({
59204			xref: this.xref,
59205			dictArray: value
59206		});
59207	}
59208	get content() {
59209		return this.pageDict.getArray("Contents");
59210	}
59211	get resources() {
59212		const resources = this._getInheritableProperty("Resources");
59213		return shadow(this, "resources", resources instanceof Dict ? resources : Dict.empty);
59214	}
59215	_getBoundingBox(name) {
59216		if (this.xfaData) {
59217			return this.xfaData.bbox;
59218		}
59219		const box = lookupNormalRect(this._getInheritableProperty(name, true), null);
59220		if (box) {
59221			if (box[2] - box[0] > 0 && box[3] - box[1] > 0) {
59222				return box;
59223			}
59224			warn(`Empty, or invalid, /${name} entry.`);
59225		}
59226		return null;
59227	}
59228	get mediaBox() {
59229		return shadow(this, "mediaBox", this._getBoundingBox("MediaBox") || LETTER_SIZE_MEDIABOX);
59230	}
59231	get cropBox() {
59232		return shadow(this, "cropBox", this._getBoundingBox("CropBox") || this.mediaBox);
59233	}
59234	get userUnit() {
59235		const obj = this.pageDict.get("UserUnit");
59236		return shadow(this, "userUnit", typeof obj === "number" && obj > 0 ? obj : 1.0);
59237	}
59238	get view() {
59239		const {
59240			cropBox,
59241			mediaBox
59242		} = this;
59243		if (cropBox !== mediaBox && !isArrayEqual(cropBox, mediaBox)) {
59244			const box = Util.intersect(cropBox, mediaBox);
59245			if (box && box[2] - box[0] > 0 && box[3] - box[1] > 0) {
59246				return shadow(this, "view", box);
59247			}
59248			warn("Empty /CropBox and /MediaBox intersection.");
59249		}
59250		return shadow(this, "view", mediaBox);
59251	}
59252	get rotate() {
59253		let rotate = this._getInheritableProperty("Rotate") || 0;
59254		if (rotate % 90 !== 0) {
59255			rotate = 0;
59256		} else if (rotate >= 360) {
59257			rotate %= 360;
59258		} else if (rotate < 0) {
59259			rotate = (rotate % 360 + 360) % 360;
59260		}
59261		return shadow(this, "rotate", rotate);
59262	}
59263	_onSubStreamError(reason, objId) {
59264		if (this.evaluatorOptions.ignoreErrors) {
59265			warn(`getContentStream - ignoring sub-stream (${objId}): "${reason}".`);
59266			return;
59267		}
59268		throw reason;
59269	}
59270	getContentStream() {
59271		return this.pdfManager.ensure(this, "content").then(content => {
59272			if (content instanceof BaseStream) {
59273				return content;
59274			}
59275			if (Array.isArray(content)) {
59276				return new StreamsSequenceStream(content, this._onSubStreamError.bind(this));
59277			}
59278			return new NullStream();
59279		});
59280	}
59281	get xfaData() {
59282		return shadow(this, "xfaData", this.xfaFactory ? {
59283			bbox: this.xfaFactory.getBoundingBox(this.pageIndex)
59284		} : null);
59285	}
59286	async #replaceIdByRef(annotations, deletedAnnotations, existingAnnotations) {
59287		const promises = [];
59288		for (const annotation of annotations) {
59289			if (annotation.id) {
59290				const ref = Ref.fromString(annotation.id);
59291				if (!ref) {
59292					warn(`A non-linked annotation cannot be modified: ${annotation.id}`);
59293					continue;
59294				}
59295				if (annotation.deleted) {
59296					deletedAnnotations.put(ref, ref);
59297					if (annotation.popupRef) {
59298						const popupRef = Ref.fromString(annotation.popupRef);
59299						if (popupRef) {
59300							deletedAnnotations.put(popupRef, popupRef);
59301						}
59302					}
59303					continue;
59304				}
59305				existingAnnotations?.put(ref);
59306				annotation.ref = ref;
59307				promises.push(this.xref.fetchAsync(ref).then(obj => {
59308					if (obj instanceof Dict) {
59309						annotation.oldAnnotation = obj.clone();
59310					}
59311				}, () => {
59312					warn(`Cannot fetch \`oldAnnotation\` for: ${ref}.`);
59313				}));
59314				delete annotation.id;
59315			}
59316		}
59317		await Promise.all(promises);
59318	}
59319	async saveNewAnnotations(handler, task, annotations, imagePromises, changes) {
59320		if (this.xfaFactory) {
59321			throw new Error("XFA: Cannot save new annotations.");
59322		}
59323		const partialEvaluator = new PartialEvaluator({
59324			xref: this.xref,
59325			handler,
59326			pageIndex: this.pageIndex,
59327			idFactory: this._localIdFactory,
59328			fontCache: this.fontCache,
59329			builtInCMapCache: this.builtInCMapCache,
59330			standardFontDataCache: this.standardFontDataCache,
59331			globalImageCache: this.globalImageCache,
59332			systemFontCache: this.systemFontCache,
59333			options: this.evaluatorOptions
59334		});
59335		const deletedAnnotations = new RefSetCache();
59336		const existingAnnotations = new RefSet();
59337		await this.#replaceIdByRef(annotations, deletedAnnotations, existingAnnotations);
59338		const pageDict = this.pageDict;
59339		const annotationsArray = this.annotations.filter(a => !(a instanceof Ref && deletedAnnotations.has(a)));
59340		const newData = await AnnotationFactory.saveNewAnnotations(partialEvaluator, task, annotations, imagePromises, changes);
59341		for (const {
59342			ref
59343		} of newData.annotations) {
59344			if (ref instanceof Ref && !existingAnnotations.has(ref)) {
59345				annotationsArray.push(ref);
59346			}
59347		}
59348		const dict = pageDict.clone();
59349		dict.set("Annots", annotationsArray);
59350		changes.put(this.ref, {
59351			data: dict
59352		});
59353		for (const deletedRef of deletedAnnotations) {
59354			changes.put(deletedRef, {
59355				data: null
59356			});
59357		}
59358	}
59359	save(handler, task, annotationStorage, changes) {
59360		const partialEvaluator = new PartialEvaluator({
59361			xref: this.xref,
59362			handler,
59363			pageIndex: this.pageIndex,
59364			idFactory: this._localIdFactory,
59365			fontCache: this.fontCache,
59366			builtInCMapCache: this.builtInCMapCache,
59367			standardFontDataCache: this.standardFontDataCache,
59368			globalImageCache: this.globalImageCache,
59369			systemFontCache: this.systemFontCache,
59370			options: this.evaluatorOptions
59371		});
59372		return this._parsedAnnotations.then(function (annotations) {
59373			const promises = [];
59374			for (const annotation of annotations) {
59375				promises.push(annotation.save(partialEvaluator, task, annotationStorage, changes).catch(function (reason) {
59376					warn("save - ignoring annotation data during " + `"${task.name}" task: "${reason}".`);
59377					return null;
59378				}));
59379			}
59380			return Promise.all(promises);
59381		});
59382	}
59383	loadResources(keys) {
59384		this.resourcesPromise ||= this.pdfManager.ensure(this, "resources");
59385		return this.resourcesPromise.then(() => {
59386			const objectLoader = new ObjectLoader(this.resources, keys, this.xref);
59387			return objectLoader.load();
59388		});
59389	}
59390	getOperatorList({
59391		handler,
59392		sink,
59393		task,
59394		intent,
59395		cacheKey,
59396		annotationStorage = null,
59397		modifiedIds = null
59398	}) {
59399		const contentStreamPromise = this.getContentStream();
59400		const resourcesPromise = this.loadResources(["ColorSpace", "ExtGState", "Font", "Pattern", "Properties", "Shading", "XObject"]);
59401		const partialEvaluator = new PartialEvaluator({
59402			xref: this.xref,
59403			handler,
59404			pageIndex: this.pageIndex,
59405			idFactory: this._localIdFactory,
59406			fontCache: this.fontCache,
59407			builtInCMapCache: this.builtInCMapCache,
59408			standardFontDataCache: this.standardFontDataCache,
59409			globalImageCache: this.globalImageCache,
59410			systemFontCache: this.systemFontCache,
59411			options: this.evaluatorOptions
59412		});
59413		const newAnnotsByPage = !this.xfaFactory ? getNewAnnotationsMap(annotationStorage) : null;
59414		const newAnnots = newAnnotsByPage?.get(this.pageIndex);
59415		let newAnnotationsPromise = Promise.resolve(null);
59416		let deletedAnnotations = null;
59417		if (newAnnots) {
59418			const annotationGlobalsPromise = this.pdfManager.ensureDoc("annotationGlobals");
59419			let imagePromises;
59420			const missingBitmaps = new Set();
59421			for (const {
59422				bitmapId,
59423				bitmap
59424			} of newAnnots) {
59425				if (bitmapId && !bitmap && !missingBitmaps.has(bitmapId)) {
59426					missingBitmaps.add(bitmapId);
59427				}
59428			}
59429			const {
59430				isOffscreenCanvasSupported
59431			} = this.evaluatorOptions;
59432			if (missingBitmaps.size > 0) {
59433				const annotationWithBitmaps = newAnnots.slice();
59434				for (const [key, annotation] of annotationStorage) {
59435					if (!key.startsWith(AnnotationEditorPrefix)) {
59436						continue;
59437					}
59438					if (annotation.bitmap && missingBitmaps.has(annotation.bitmapId)) {
59439						annotationWithBitmaps.push(annotation);
59440					}
59441				}
59442				imagePromises = AnnotationFactory.generateImages(annotationWithBitmaps, this.xref, isOffscreenCanvasSupported);
59443			} else {
59444				imagePromises = AnnotationFactory.generateImages(newAnnots, this.xref, isOffscreenCanvasSupported);
59445			}
59446			deletedAnnotations = new RefSet();
59447			newAnnotationsPromise = Promise.all([annotationGlobalsPromise, this.#replaceIdByRef(newAnnots, deletedAnnotations, null)]).then(([annotationGlobals]) => {
59448				if (!annotationGlobals) {
59449					return null;
59450				}
59451				return AnnotationFactory.printNewAnnotations(annotationGlobals, partialEvaluator, task, newAnnots, imagePromises);
59452			});
59453		}
59454		const pageListPromise = Promise.all([contentStreamPromise, resourcesPromise]).then(([contentStream]) => {
59455			const opList = new OperatorList(intent, sink);
59456			handler.send("StartRenderPage", {
59457				transparency: partialEvaluator.hasBlendModes(this.resources, this.nonBlendModesSet),
59458				pageIndex: this.pageIndex,
59459				cacheKey
59460			});
59461			return partialEvaluator.getOperatorList({
59462				stream: contentStream,
59463				task,
59464				resources: this.resources,
59465				operatorList: opList
59466			}).then(function () {
59467				return opList;
59468			});
59469		});
59470		return Promise.all([pageListPromise, this._parsedAnnotations, newAnnotationsPromise]).then(function ([pageOpList, annotations, newAnnotations]) {
59471			if (newAnnotations) {
59472				annotations = annotations.filter(a => !(a.ref && deletedAnnotations.has(a.ref)));
59473				for (let i = 0, ii = newAnnotations.length; i < ii; i++) {
59474					const newAnnotation = newAnnotations[i];
59475					if (newAnnotation.refToReplace) {
59476						const j = annotations.findIndex(a => a.ref && isRefsEqual(a.ref, newAnnotation.refToReplace));
59477						if (j >= 0) {
59478							annotations.splice(j, 1, newAnnotation);
59479							newAnnotations.splice(i--, 1);
59480							ii--;
59481						}
59482					}
59483				}
59484				annotations = annotations.concat(newAnnotations);
59485			}
59486			if (annotations.length === 0 || intent & RenderingIntentFlag.ANNOTATIONS_DISABLE) {
59487				pageOpList.flush(true);
59488				return {
59489					length: pageOpList.totalLength
59490				};
59491			}
59492			const renderForms = !!(intent & RenderingIntentFlag.ANNOTATIONS_FORMS),
59493				isEditing = !!(intent & RenderingIntentFlag.IS_EDITING),
59494				intentAny = !!(intent & RenderingIntentFlag.ANY),
59495				intentDisplay = !!(intent & RenderingIntentFlag.DISPLAY),
59496				intentPrint = !!(intent & RenderingIntentFlag.PRINT);
59497			const opListPromises = [];
59498			for (const annotation of annotations) {
59499				if (intentAny || intentDisplay && annotation.mustBeViewed(annotationStorage, renderForms) && annotation.mustBeViewedWhenEditing(isEditing, modifiedIds) || intentPrint && annotation.mustBePrinted(annotationStorage)) {
59500					opListPromises.push(annotation.getOperatorList(partialEvaluator, task, intent, annotationStorage).catch(function (reason) {
59501						warn("getOperatorList - ignoring annotation data during " + `"${task.name}" task: "${reason}".`);
59502						return {
59503							opList: null,
59504							separateForm: false,
59505							separateCanvas: false
59506						};
59507					}));
59508				}
59509			}
59510			return Promise.all(opListPromises).then(function (opLists) {
59511				let form = false,
59512					canvas = false;
59513				for (const {
59514					opList,
59515					separateForm,
59516					separateCanvas
59517				} of opLists) {
59518					pageOpList.addOpList(opList);
59519					form ||= separateForm;
59520					canvas ||= separateCanvas;
59521				}
59522				pageOpList.flush(true, {
59523					form,
59524					canvas
59525				});
59526				return {
59527					length: pageOpList.totalLength
59528				};
59529			});
59530		});
59531	}
59532	async extractTextContent({
59533		handler,
59534		task,
59535		includeMarkedContent,
59536		disableNormalization,
59537		sink
59538	}) {
59539		const contentStreamPromise = this.getContentStream();
59540		const resourcesPromise = this.loadResources(["ExtGState", "Font", "Properties", "XObject"]);
59541		const langPromise = this.pdfManager.ensureCatalog("lang");
59542		const [contentStream,, lang] = await Promise.all([contentStreamPromise, resourcesPromise, langPromise]);
59543		const partialEvaluator = new PartialEvaluator({
59544			xref: this.xref,
59545			handler,
59546			pageIndex: this.pageIndex,
59547			idFactory: this._localIdFactory,
59548			fontCache: this.fontCache,
59549			builtInCMapCache: this.builtInCMapCache,
59550			standardFontDataCache: this.standardFontDataCache,
59551			globalImageCache: this.globalImageCache,
59552			systemFontCache: this.systemFontCache,
59553			options: this.evaluatorOptions
59554		});
59555		return partialEvaluator.getTextContent({
59556			stream: contentStream,
59557			task,
59558			resources: this.resources,
59559			includeMarkedContent,
59560			disableNormalization,
59561			sink,
59562			viewBox: this.view,
59563			lang
59564		});
59565	}
59566	async getStructTree() {
59567		const structTreeRoot = await this.pdfManager.ensureCatalog("structTreeRoot");
59568		if (!structTreeRoot) {
59569			return null;
59570		}
59571		await this._parsedAnnotations;
59572		const structTree = await this.pdfManager.ensure(this, "_parseStructTree", [structTreeRoot]);
59573		return this.pdfManager.ensure(structTree, "serializable");
59574	}
59575	_parseStructTree(structTreeRoot) {
59576		const tree = new StructTreePage(structTreeRoot, this.pageDict);
59577		tree.parse(this.ref);
59578		return tree;
59579	}
59580	async getAnnotationsData(handler, task, intent) {
59581		const annotations = await this._parsedAnnotations;
59582		if (annotations.length === 0) {
59583			return annotations;
59584		}
59585		const annotationsData = [],
59586			textContentPromises = [];
59587		let partialEvaluator;
59588		const intentAny = !!(intent & RenderingIntentFlag.ANY),
59589			intentDisplay = !!(intent & RenderingIntentFlag.DISPLAY),
59590			intentPrint = !!(intent & RenderingIntentFlag.PRINT);
59591		for (const annotation of annotations) {
59592			const isVisible = intentAny || intentDisplay && annotation.viewable;
59593			if (isVisible || intentPrint && annotation.printable) {
59594				annotationsData.push(annotation.data);
59595			}
vendor: 5,197 bytes, lines 59596-59767
59596			if (annotation.hasTextContent && isVisible) {
59597				partialEvaluator ||= new PartialEvaluator({
59598					xref: this.xref,
59599					handler,
59600					pageIndex: this.pageIndex,
59601					idFactory: this._localIdFactory,
59602					fontCache: this.fontCache,
59603					builtInCMapCache: this.builtInCMapCache,
59604					standardFontDataCache: this.standardFontDataCache,
59605					globalImageCache: this.globalImageCache,
59606					systemFontCache: this.systemFontCache,
59607					options: this.evaluatorOptions
59608				});
59609				textContentPromises.push(annotation.extractTextContent(partialEvaluator, task, [-Infinity, -Infinity, Infinity, Infinity]).catch(function (reason) {
59610					warn(`getAnnotationsData - ignoring textContent during "${task.name}" task: "${reason}".`);
59611				}));
59612			}
59613		}
59614		await Promise.all(textContentPromises);
59615		return annotationsData;
59616	}
59617	get annotations() {
59618		const annots = this._getInheritableProperty("Annots");
59619		return shadow(this, "annotations", Array.isArray(annots) ? annots : []);
59620	}
59621	get _parsedAnnotations() {
59622		const promise = this.pdfManager.ensure(this, "annotations").then(async annots => {
59623			if (annots.length === 0) {
59624				return annots;
59625			}
59626			const [annotationGlobals, fieldObjects] = await Promise.all([this.pdfManager.ensureDoc("annotationGlobals"), this.pdfManager.ensureDoc("fieldObjects")]);
59627			if (!annotationGlobals) {
59628				return [];
59629			}
59630			const orphanFields = fieldObjects?.orphanFields;
59631			const annotationPromises = [];
59632			for (const annotationRef of annots) {
59633				annotationPromises.push(AnnotationFactory.create(this.xref, annotationRef, annotationGlobals, this._localIdFactory, false, orphanFields, this.ref).catch(function (reason) {
59634					warn(`_parsedAnnotations: "${reason}".`);
59635					return null;
59636				}));
59637			}
59638			const sortedAnnotations = [];
59639			let popupAnnotations, widgetAnnotations;
59640			for (const annotation of await Promise.all(annotationPromises)) {
59641				if (!annotation) {
59642					continue;
59643				}
59644				if (annotation instanceof WidgetAnnotation) {
59645					(widgetAnnotations ||= []).push(annotation);
59646					continue;
59647				}
59648				if (annotation instanceof PopupAnnotation) {
59649					(popupAnnotations ||= []).push(annotation);
59650					continue;
59651				}
59652				sortedAnnotations.push(annotation);
59653			}
59654			if (widgetAnnotations) {
59655				sortedAnnotations.push(...widgetAnnotations);
59656			}
59657			if (popupAnnotations) {
59658				sortedAnnotations.push(...popupAnnotations);
59659			}
59660			return sortedAnnotations;
59661		});
59662		return shadow(this, "_parsedAnnotations", promise);
59663	}
59664	get jsActions() {
59665		const actions = collectActions(this.xref, this.pageDict, PageActionEventType);
59666		return shadow(this, "jsActions", actions);
59667	}
59668}
59669const PDF_HEADER_SIGNATURE = new Uint8Array([0x25, 0x50, 0x44, 0x46, 0x2d]);
59670const STARTXREF_SIGNATURE = new Uint8Array([0x73, 0x74, 0x61, 0x72, 0x74, 0x78, 0x72, 0x65, 0x66]);
59671const ENDOBJ_SIGNATURE = new Uint8Array([0x65, 0x6e, 0x64, 0x6f, 0x62, 0x6a]);
59672function find(stream, signature, limit = 1024, backwards = false) {
59673	const signatureLength = signature.length;
59674	const scanBytes = stream.peekBytes(limit);
59675	const scanLength = scanBytes.length - signatureLength;
59676	if (scanLength <= 0) {
59677		return false;
59678	}
59679	if (backwards) {
59680		const signatureEnd = signatureLength - 1;
59681		let pos = scanBytes.length - 1;
59682		while (pos >= signatureEnd) {
59683			let j = 0;
59684			while (j < signatureLength && scanBytes[pos - j] === signature[signatureEnd - j]) {
59685				j++;
59686			}
59687			if (j >= signatureLength) {
59688				stream.pos += pos - signatureEnd;
59689				return true;
59690			}
59691			pos--;
59692		}
59693	} else {
59694		let pos = 0;
59695		while (pos <= scanLength) {
59696			let j = 0;
59697			while (j < signatureLength && scanBytes[pos + j] === signature[j]) {
59698				j++;
59699			}
59700			if (j >= signatureLength) {
59701				stream.pos += pos;
59702				return true;
59703			}
59704			pos++;
59705		}
59706	}
59707	return false;
59708}
59709class PDFDocument {
59710	constructor(pdfManager, stream) {
59711		if (stream.length <= 0) {
59712			throw new InvalidPDFException("The PDF file is empty, i.e. its size is zero bytes.");
59713		}
59714		this.pdfManager = pdfManager;
59715		this.stream = stream;
59716		this.xref = new XRef(stream, pdfManager);
59717		this._pagePromises = new Map();
59718		this._version = null;
59719		const idCounters = {
59720			font: 0
59721		};
59722		this._globalIdFactory = class {
59723			static getDocId() {
59724				return `g_${pdfManager.docId}`;
59725			}
59726			static createFontId() {
59727				return `f${++idCounters.font}`;
59728			}
59729			static createObjId() {
59730				unreachable("Abstract method `createObjId` called.");
59731			}
59732			static getPageObjId() {
59733				unreachable("Abstract method `getPageObjId` called.");
59734			}
59735		};
59736	}
59737	parse(recoveryMode) {
59738		this.xref.parse(recoveryMode);
59739		this.catalog = new Catalog(this.pdfManager, this.xref);
59740	}
59741	get linearization() {
59742		let linearization = null;
59743		try {
59744			linearization = Linearization.create(this.stream);
59745		} catch (err) {
59746			if (err instanceof MissingDataException) {
59747				throw err;
59748			}
59749			info(err);
59750		}
59751		return shadow(this, "linearization", linearization);
59752	}
59753	get startXRef() {
59754		const stream = this.stream;
59755		let startXRef = 0;
59756		if (this.linearization) {
59757			stream.reset();
59758			if (find(stream, ENDOBJ_SIGNATURE)) {
59759				stream.skip(6);
59760				let ch = stream.peekByte();
59761				while (isWhiteSpace(ch)) {
59762					stream.pos++;
59763					ch = stream.peekByte();
59764				}
59765				startXRef = stream.pos - stream.start;
59766			}
59767		} else {
vendor: 4,497 bytes, lines 59768-59950
59768			const step = 1024;
59769			const startXRefLength = STARTXREF_SIGNATURE.length;
59770			let found = false,
59771				pos = stream.end;
59772			while (!found && pos > 0) {
59773				pos -= step - startXRefLength;
59774				if (pos < 0) {
59775					pos = 0;
59776				}
59777				stream.pos = pos;
59778				found = find(stream, STARTXREF_SIGNATURE, step, true);
59779			}
59780			if (found) {
59781				stream.skip(9);
59782				let ch;
59783				do {
59784					ch = stream.getByte();
59785				} while (isWhiteSpace(ch));
59786				let str = "";
59787				while (ch >= 0x20 && ch <= 0x39) {
59788					str += String.fromCharCode(ch);
59789					ch = stream.getByte();
59790				}
59791				startXRef = parseInt(str, 10);
59792				if (isNaN(startXRef)) {
59793					startXRef = 0;
59794				}
59795			}
59796		}
59797		return shadow(this, "startXRef", startXRef);
59798	}
59799	checkHeader() {
59800		const stream = this.stream;
59801		stream.reset();
59802		if (!find(stream, PDF_HEADER_SIGNATURE)) {
59803			return;
59804		}
59805		stream.moveStart();
59806		stream.skip(PDF_HEADER_SIGNATURE.length);
59807		let version = "",
59808			ch;
59809		while ((ch = stream.getByte()) > 0x20 && version.length < 7) {
59810			version += String.fromCharCode(ch);
59811		}
59812		if (PDF_VERSION_REGEXP.test(version)) {
59813			this._version = version;
59814		} else {
59815			warn(`Invalid PDF header version: ${version}`);
59816		}
59817	}
59818	parseStartXRef() {
59819		this.xref.setStartXRef(this.startXRef);
59820	}
59821	get numPages() {
59822		let num = 0;
59823		if (this.catalog.hasActualNumPages) {
59824			num = this.catalog.numPages;
59825		} else if (this.xfaFactory) {
59826			num = this.xfaFactory.getNumPages();
59827		} else if (this.linearization) {
59828			num = this.linearization.numPages;
59829		} else {
59830			num = this.catalog.numPages;
59831		}
59832		return shadow(this, "numPages", num);
59833	}
59834	_hasOnlyDocumentSignatures(fields, recursionDepth = 0) {
59835		const RECURSION_LIMIT = 10;
59836		if (!Array.isArray(fields)) {
59837			return false;
59838		}
59839		return fields.every(field => {
59840			field = this.xref.fetchIfRef(field);
59841			if (!(field instanceof Dict)) {
59842				return false;
59843			}
59844			if (field.has("Kids")) {
59845				if (++recursionDepth > RECURSION_LIMIT) {
59846					warn("_hasOnlyDocumentSignatures: maximum recursion depth reached");
59847					return false;
59848				}
59849				return this._hasOnlyDocumentSignatures(field.get("Kids"), recursionDepth);
59850			}
59851			const isSignature = isName(field.get("FT"), "Sig");
59852			const rectangle = field.get("Rect");
59853			const isInvisible = Array.isArray(rectangle) && rectangle.every(value => value === 0);
59854			return isSignature && isInvisible;
59855		});
59856	}
59857	get _xfaStreams() {
59858		const acroForm = this.catalog.acroForm;
59859		if (!acroForm) {
59860			return null;
59861		}
59862		const xfa = acroForm.get("XFA");
59863		const entries = {
59864			"xdp:xdp": "",
59865			template: "",
59866			datasets: "",
59867			config: "",
59868			connectionSet: "",
59869			localeSet: "",
59870			stylesheet: "",
59871			"/xdp:xdp": ""
59872		};
59873		if (xfa instanceof BaseStream && !xfa.isEmpty) {
59874			entries["xdp:xdp"] = xfa;
59875			return entries;
59876		}
59877		if (!Array.isArray(xfa) || xfa.length === 0) {
59878			return null;
59879		}
59880		for (let i = 0, ii = xfa.length; i < ii; i += 2) {
59881			let name;
59882			if (i === 0) {
59883				name = "xdp:xdp";
59884			} else if (i === ii - 2) {
59885				name = "/xdp:xdp";
59886			} else {
59887				name = xfa[i];
59888			}
59889			if (!entries.hasOwnProperty(name)) {
59890				continue;
59891			}
59892			const data = this.xref.fetchIfRef(xfa[i + 1]);
59893			if (!(data instanceof BaseStream) || data.isEmpty) {
59894				continue;
59895			}
59896			entries[name] = data;
59897		}
59898		return entries;
59899	}
59900	get xfaDatasets() {
59901		const streams = this._xfaStreams;
59902		if (!streams) {
59903			return shadow(this, "xfaDatasets", null);
59904		}
59905		for (const key of ["datasets", "xdp:xdp"]) {
59906			const stream = streams[key];
59907			if (!stream) {
59908				continue;
59909			}
59910			try {
59911				const str = stringToUTF8String(stream.getString());
59912				const data = {
59913					[key]: str
59914				};
59915				return shadow(this, "xfaDatasets", new DatasetReader(data));
59916			} catch {
59917				warn("XFA - Invalid utf-8 string.");
59918				break;
59919			}
59920		}
59921		return shadow(this, "xfaDatasets", null);
59922	}
59923	get xfaData() {
59924		const streams = this._xfaStreams;
59925		if (!streams) {
59926			return null;
59927		}
59928		const data = Object.create(null);
59929		for (const [key, stream] of Object.entries(streams)) {
59930			if (!stream) {
59931				continue;
59932			}
59933			try {
59934				data[key] = stringToUTF8String(stream.getString());
59935			} catch {
59936				warn("XFA - Invalid utf-8 string.");
59937				return null;
59938			}
59939		}
59940		return data;
59941	}
59942	get xfaFactory() {
59943		let data;
59944		if (this.pdfManager.enableXfa && this.catalog.needsRendering && this.formInfo.hasXfa && !this.formInfo.hasAcroForm) {
59945			data = this.xfaData;
59946		}
59947		return shadow(this, "xfaFactory", data ? new XFAFactory(data) : null);
59948	}
59949	get isPureXfa() {
59950		return this.xfaFactory ? this.xfaFactory.isValid() : false;
59951	}
59952	get htmlForXfa() {
59953		return this.xfaFactory ? this.xfaFactory.getPages() : null;
59954	}
59955	async loadXfaImages() {
59956		const xfaImagesDict = await this.pdfManager.ensureCatalog("xfaImages");
59957		if (!xfaImagesDict) {
59958			return;
59959		}
59960		const keys = xfaImagesDict.getKeys();
59961		const objectLoader = new ObjectLoader(xfaImagesDict, keys, this.xref);
59962		await objectLoader.load();
59963		const xfaImages = new Map();
59964		for (const key of keys) {
59965			const stream = xfaImagesDict.get(key);
59966			if (stream instanceof BaseStream) {
59967				xfaImages.set(key, stream.getBytes());
59968			}
59969		}
59970		this.xfaFactory.setImages(xfaImages);
59971	}
59972	async loadXfaFonts(handler, task) {
59973		const acroForm = await this.pdfManager.ensureCatalog("acroForm");
59974		if (!acroForm) {
59975			return;
59976		}
59977		const resources = await acroForm.getAsync("DR");
59978		if (!(resources instanceof Dict)) {
59979			return;
59980		}
59981		const objectLoader = new ObjectLoader(resources, ["Font"], this.xref);
59982		await objectLoader.load();
59983		const fontRes = resources.get("Font");
59984		if (!(fontRes instanceof Dict)) {
59985			return;
59986		}
59987		const options = Object.assign(Object.create(null), this.pdfManager.evaluatorOptions);
59988		options.useSystemFonts = false;
59989		const partialEvaluator = new PartialEvaluator({
59990			xref: this.xref,
59991			handler,
59992			pageIndex: -1,
59993			idFactory: this._globalIdFactory,
59994			fontCache: this.catalog.fontCache,
59995			builtInCMapCache: this.catalog.builtInCMapCache,
59996			standardFontDataCache: this.catalog.standardFontDataCache,
59997			options
59998		});
59999		const operatorList = new OperatorList();
60000		const pdfFonts = [];
60001		const initialState = {
60002			get font() {
60003				return pdfFonts.at(-1);
60004			},
60005			set font(font) {
60006				pdfFonts.push(font);
60007			},
60008			clone() {
60009				return this;
60010			}
60011		};
60012		const promises = [];
60013		for (const [fontName, font] of fontRes) {
60014			const descriptor = font.get("FontDescriptor");
60015			if (!(descriptor instanceof Dict)) {
60016				continue;
60017			}
60018			let fontFamily = descriptor.get("FontFamily");
60019			fontFamily = fontFamily.replaceAll(/[ ]+(\d)/g, "$1");
60020			const fontWeight = descriptor.get("FontWeight");
60021			const italicAngle = -descriptor.get("ItalicAngle");
60022			const cssFontInfo = {
60023				fontFamily,
60024				fontWeight,
60025				italicAngle
60026			};
60027			if (!validateCSSFont(cssFontInfo)) {
60028				continue;
60029			}
60030			promises.push(partialEvaluator.handleSetFont(resources, [Name.get(fontName), 1], null, operatorList, task, initialState, null, cssFontInfo).catch(function (reason) {
60031				warn(`loadXfaFonts: "${reason}".`);
60032				return null;
60033			}));
60034		}
60035		await Promise.all(promises);
60036		const missingFonts = this.xfaFactory.setFonts(pdfFonts);
60037		if (!missingFonts) {
60038			return;
60039		}
60040		options.ignoreErrors = true;
60041		promises.length = 0;
60042		pdfFonts.length = 0;
60043		const reallyMissingFonts = new Set();
60044		for (const missing of missingFonts) {
60045			if (!getXfaFontName(`${missing}-Regular`)) {
60046				reallyMissingFonts.add(missing);
60047			}
60048		}
60049		if (reallyMissingFonts.size) {
60050			missingFonts.push("PdfJS-Fallback");
60051		}
60052		for (const missing of missingFonts) {
60053			if (reallyMissingFonts.has(missing)) {
60054				continue;
60055			}
60056			for (const fontInfo of [{
60057				name: "Regular",
60058				fontWeight: 400,
60059				italicAngle: 0
60060			}, {
60061				name: "Bold",
60062				fontWeight: 700,
60063				italicAngle: 0
60064			}, {
60065				name: "Italic",
60066				fontWeight: 400,
60067				italicAngle: 12
60068			}, {
60069				name: "BoldItalic",
60070				fontWeight: 700,
60071				italicAngle: 12
60072			}]) {
60073				const name = `${missing}-${fontInfo.name}`;
60074				const dict = getXfaFontDict(name);
60075				promises.push(partialEvaluator.handleSetFont(resources, [Name.get(name), 1], null, operatorList, task, initialState, dict, {
60076					fontFamily: missing,
60077					fontWeight: fontInfo.fontWeight,
60078					italicAngle: fontInfo.italicAngle
60079				}).catch(function (reason) {
60080					warn(`loadXfaFonts: "${reason}".`);
60081					return null;
60082				}));
60083			}
60084		}
60085		await Promise.all(promises);
60086		this.xfaFactory.appendFonts(pdfFonts, reallyMissingFonts);
60087	}
60088	async serializeXfaData(annotationStorage) {
60089		return this.xfaFactory ? this.xfaFactory.serializeData(annotationStorage) : null;
60090	}
60091	get version() {
60092		return this.catalog.version || this._version;
60093	}
60094	get formInfo() {
60095		const formInfo = {
60096			hasFields: false,
60097			hasAcroForm: false,
60098			hasXfa: false,
60099			hasSignatures: false
60100		};
60101		const acroForm = this.catalog.acroForm;
60102		if (!acroForm) {
60103			return shadow(this, "formInfo", formInfo);
60104		}
60105		try {
60106			const fields = acroForm.get("Fields");
60107			const hasFields = Array.isArray(fields) && fields.length > 0;
60108			formInfo.hasFields = hasFields;
60109			const xfa = acroForm.get("XFA");
60110			formInfo.hasXfa = Array.isArray(xfa) && xfa.length > 0 || xfa instanceof BaseStream && !xfa.isEmpty;
60111			const sigFlags = acroForm.get("SigFlags");
60112			const hasSignatures = !!(sigFlags & 0x1);
60113			const hasOnlyDocumentSignatures = hasSignatures && this._hasOnlyDocumentSignatures(fields);
60114			formInfo.hasAcroForm = hasFields && !hasOnlyDocumentSignatures;
60115			formInfo.hasSignatures = hasSignatures;
60116		} catch (ex) {
60117			if (ex instanceof MissingDataException) {
60118				throw ex;
60119			}
60120			warn(`Cannot fetch form information: "${ex}".`);
60121		}
60122		return shadow(this, "formInfo", formInfo);
60123	}
60124	get documentInfo() {
60125		const docInfo = {
60126			PDFFormatVersion: this.version,
60127			Language: this.catalog.lang,
60128			EncryptFilterName: this.xref.encrypt ? this.xref.encrypt.filterName : null,
60129			IsLinearized: !!this.linearization,
60130			IsAcroFormPresent: this.formInfo.hasAcroForm,
60131			IsXFAPresent: this.formInfo.hasXfa,
60132			IsCollectionPresent: !!this.catalog.collection,
60133			IsSignaturesPresent: this.formInfo.hasSignatures
60134		};
60135		let infoDict;
60136		try {
60137			infoDict = this.xref.trailer.get("Info");
60138		} catch (err) {
60139			if (err instanceof MissingDataException) {
60140				throw err;
60141			}
vendor: 56,017 bytes, lines 60142-62136
60142			info("The document information dictionary is invalid.");
60143		}
60144		if (!(infoDict instanceof Dict)) {
60145			return shadow(this, "documentInfo", docInfo);
60146		}
60147		for (const key of infoDict.getKeys()) {
60148			const value = infoDict.get(key);
60149			switch (key) {
60150				case "Title":
60151				case "Author":
60152				case "Subject":
60153				case "Keywords":
60154				case "Creator":
60155				case "Producer":
60156				case "CreationDate":
60157				case "ModDate":
60158					if (typeof value === "string") {
60159						docInfo[key] = stringToPDFString(value);
60160						continue;
60161					}
60162					break;
60163				case "Trapped":
60164					if (value instanceof Name) {
60165						docInfo[key] = value;
60166						continue;
60167					}
60168					break;
60169				default:
60170					let customValue;
60171					switch (typeof value) {
60172						case "string":
60173							customValue = stringToPDFString(value);
60174							break;
60175						case "number":
60176						case "boolean":
60177							customValue = value;
60178							break;
60179						default:
60180							if (value instanceof Name) {
60181								customValue = value;
60182							}
60183							break;
60184					}
60185					if (customValue === undefined) {
60186						warn(`Bad value, for custom key "${key}", in Info: ${value}.`);
60187						continue;
60188					}
60189					if (!docInfo.Custom) {
60190						docInfo.Custom = Object.create(null);
60191					}
60192					docInfo.Custom[key] = customValue;
60193					continue;
60194			}
60195			warn(`Bad value, for key "${key}", in Info: ${value}.`);
60196		}
60197		return shadow(this, "documentInfo", docInfo);
60198	}
60199	get fingerprints() {
60200		const FINGERPRINT_FIRST_BYTES = 1024;
60201		const EMPTY_FINGERPRINT = "\x00".repeat(16);
60202		function validate(data) {
60203			return typeof data === "string" && data.length === 16 && data !== EMPTY_FINGERPRINT;
60204		}
60205		const id = this.xref.trailer.get("ID");
60206		let hashOriginal, hashModified;
60207		if (Array.isArray(id) && validate(id[0])) {
60208			hashOriginal = stringToBytes(id[0]);
60209			if (id[1] !== id[0] && validate(id[1])) {
60210				hashModified = stringToBytes(id[1]);
60211			}
60212		} else {
60213			hashOriginal = calculateMD5(this.stream.getByteRange(0, FINGERPRINT_FIRST_BYTES), 0, FINGERPRINT_FIRST_BYTES);
60214		}
60215		return shadow(this, "fingerprints", [toHexUtil(hashOriginal), hashModified ? toHexUtil(hashModified) : null]);
60216	}
60217	async _getLinearizationPage(pageIndex) {
60218		const {
60219			catalog,
60220			linearization,
60221			xref
60222		} = this;
60223		const ref = Ref.get(linearization.objectNumberFirst, 0);
60224		try {
60225			const obj = await xref.fetchAsync(ref);
60226			if (obj instanceof Dict) {
60227				let type = obj.getRaw("Type");
60228				if (type instanceof Ref) {
60229					type = await xref.fetchAsync(type);
60230				}
60231				if (isName(type, "Page") || !obj.has("Type") && !obj.has("Kids") && obj.has("Contents")) {
60232					if (!catalog.pageKidsCountCache.has(ref)) {
60233						catalog.pageKidsCountCache.put(ref, 1);
60234					}
60235					if (!catalog.pageIndexCache.has(ref)) {
60236						catalog.pageIndexCache.put(ref, 0);
60237					}
60238					return [obj, ref];
60239				}
60240			}
60241			throw new FormatError("The Linearization dictionary doesn't point to a valid Page dictionary.");
60242		} catch (reason) {
60243			warn(`_getLinearizationPage: "${reason.message}".`);
60244			return catalog.getPageDict(pageIndex);
60245		}
60246	}
60247	getPage(pageIndex) {
60248		const cachedPromise = this._pagePromises.get(pageIndex);
60249		if (cachedPromise) {
60250			return cachedPromise;
60251		}
60252		const {
60253			catalog,
60254			linearization,
60255			xfaFactory
60256		} = this;
60257		let promise;
60258		if (xfaFactory) {
60259			promise = Promise.resolve([Dict.empty, null]);
60260		} else if (linearization?.pageFirst === pageIndex) {
60261			promise = this._getLinearizationPage(pageIndex);
60262		} else {
60263			promise = catalog.getPageDict(pageIndex);
60264		}
60265		promise = promise.then(([pageDict, ref]) => {
60266			return new Page({
60267				pdfManager: this.pdfManager,
60268				xref: this.xref,
60269				pageIndex,
60270				pageDict,
60271				ref,
60272				globalIdFactory: this._globalIdFactory,
60273				fontCache: catalog.fontCache,
60274				builtInCMapCache: catalog.builtInCMapCache,
60275				standardFontDataCache: catalog.standardFontDataCache,
60276				globalImageCache: catalog.globalImageCache,
60277				systemFontCache: catalog.systemFontCache,
60278				nonBlendModesSet: catalog.nonBlendModesSet,
60279				xfaFactory
60280			});
60281		});
60282		this._pagePromises.set(pageIndex, promise);
60283		return promise;
60284	}
60285	async checkFirstPage(recoveryMode = false) {
60286		if (recoveryMode) {
60287			return;
60288		}
60289		try {
60290			await this.getPage(0);
60291		} catch (reason) {
60292			if (reason instanceof XRefEntryException) {
60293				this._pagePromises.delete(0);
60294				await this.cleanup();
60295				throw new XRefParseException();
60296			}
60297		}
60298	}
60299	async checkLastPage(recoveryMode = false) {
60300		const {
60301			catalog,
60302			pdfManager
60303		} = this;
60304		catalog.setActualNumPages();
60305		let numPages;
60306		try {
60307			await Promise.all([pdfManager.ensureDoc("xfaFactory"), pdfManager.ensureDoc("linearization"), pdfManager.ensureCatalog("numPages")]);
60308			if (this.xfaFactory) {
60309				return;
60310			} else if (this.linearization) {
60311				numPages = this.linearization.numPages;
60312			} else {
60313				numPages = catalog.numPages;
60314			}
60315			if (!Number.isInteger(numPages)) {
60316				throw new FormatError("Page count is not an integer.");
60317			} else if (numPages <= 1) {
60318				return;
60319			}
60320			await this.getPage(numPages - 1);
60321		} catch (reason) {
60322			this._pagePromises.delete(numPages - 1);
60323			await this.cleanup();
60324			if (reason instanceof XRefEntryException && !recoveryMode) {
60325				throw new XRefParseException();
60326			}
60327			warn(`checkLastPage - invalid /Pages tree /Count: ${numPages}.`);
60328			let pagesTree;
60329			try {
60330				pagesTree = await catalog.getAllPageDicts(recoveryMode);
60331			} catch (reasonAll) {
60332				if (reasonAll instanceof XRefEntryException && !recoveryMode) {
60333					throw new XRefParseException();
60334				}
60335				catalog.setActualNumPages(1);
60336				return;
60337			}
60338			for (const [pageIndex, [pageDict, ref]] of pagesTree) {
60339				let promise;
60340				if (pageDict instanceof Error) {
60341					promise = Promise.reject(pageDict);
60342					promise.catch(() => {});
60343				} else {
60344					promise = Promise.resolve(new Page({
60345						pdfManager,
60346						xref: this.xref,
60347						pageIndex,
60348						pageDict,
60349						ref,
60350						globalIdFactory: this._globalIdFactory,
60351						fontCache: catalog.fontCache,
60352						builtInCMapCache: catalog.builtInCMapCache,
60353						standardFontDataCache: catalog.standardFontDataCache,
60354						globalImageCache: catalog.globalImageCache,
60355						systemFontCache: catalog.systemFontCache,
60356						nonBlendModesSet: catalog.nonBlendModesSet,
60357						xfaFactory: null
60358					}));
60359				}
60360				this._pagePromises.set(pageIndex, promise);
60361			}
60362			catalog.setActualNumPages(pagesTree.size);
60363		}
60364	}
60365	fontFallback(id, handler) {
60366		return this.catalog.fontFallback(id, handler);
60367	}
60368	async cleanup(manuallyTriggered = false) {
60369		return this.catalog ? this.catalog.cleanup(manuallyTriggered) : clearGlobalCaches();
60370	}
60371	async #collectFieldObjects(name, parentRef, fieldRef, promises, annotationGlobals, visitedRefs, orphanFields) {
60372		const {
60373			xref
60374		} = this;
60375		if (!(fieldRef instanceof Ref) || visitedRefs.has(fieldRef)) {
60376			return;
60377		}
60378		visitedRefs.put(fieldRef);
60379		const field = await xref.fetchAsync(fieldRef);
60380		if (!(field instanceof Dict)) {
60381			return;
60382		}
60383		if (field.has("T")) {
60384			const partName = stringToPDFString(await field.getAsync("T"));
60385			name = name === "" ? partName : `${name}.${partName}`;
60386		} else {
60387			let obj = field;
60388			while (true) {
60389				obj = obj.getRaw("Parent") || parentRef;
60390				if (obj instanceof Ref) {
60391					if (visitedRefs.has(obj)) {
60392						break;
60393					}
60394					obj = await xref.fetchAsync(obj);
60395				}
60396				if (!(obj instanceof Dict)) {
60397					break;
60398				}
60399				if (obj.has("T")) {
60400					const partName = stringToPDFString(await obj.getAsync("T"));
60401					name = name === "" ? partName : `${name}.${partName}`;
60402					break;
60403				}
60404			}
60405		}
60406		if (parentRef && !field.has("Parent") && isName(field.get("Subtype"), "Widget")) {
60407			orphanFields.put(fieldRef, parentRef);
60408		}
60409		if (!promises.has(name)) {
60410			promises.set(name, []);
60411		}
60412		promises.get(name).push(AnnotationFactory.create(xref, fieldRef, annotationGlobals, null, true, orphanFields, null).then(annotation => annotation?.getFieldObject()).catch(function (reason) {
60413			warn(`#collectFieldObjects: "${reason}".`);
60414			return null;
60415		}));
60416		if (!field.has("Kids")) {
60417			return;
60418		}
60419		const kids = await field.getAsync("Kids");
60420		if (Array.isArray(kids)) {
60421			for (const kid of kids) {
60422				await this.#collectFieldObjects(name, fieldRef, kid, promises, annotationGlobals, visitedRefs, orphanFields);
60423			}
60424		}
60425	}
60426	get fieldObjects() {
60427		const promise = this.pdfManager.ensureDoc("formInfo").then(async formInfo => {
60428			if (!formInfo.hasFields) {
60429				return null;
60430			}
60431			const [annotationGlobals, acroForm] = await Promise.all([this.pdfManager.ensureDoc("annotationGlobals"), this.pdfManager.ensureCatalog("acroForm")]);
60432			if (!annotationGlobals) {
60433				return null;
60434			}
60435			const visitedRefs = new RefSet();
60436			const allFields = Object.create(null);
60437			const fieldPromises = new Map();
60438			const orphanFields = new RefSetCache();
60439			for (const fieldRef of await acroForm.getAsync("Fields")) {
60440				await this.#collectFieldObjects("", null, fieldRef, fieldPromises, annotationGlobals, visitedRefs, orphanFields);
60441			}
60442			const allPromises = [];
60443			for (const [name, promises] of fieldPromises) {
60444				allPromises.push(Promise.all(promises).then(fields => {
60445					fields = fields.filter(field => !!field);
60446					if (fields.length > 0) {
60447						allFields[name] = fields;
60448					}
60449				}));
60450			}
60451			await Promise.all(allPromises);
60452			return {
60453				allFields,
60454				orphanFields
60455			};
60456		});
60457		return shadow(this, "fieldObjects", promise);
60458	}
60459	get hasJSActions() {
60460		const promise = this.pdfManager.ensureDoc("_parseHasJSActions");
60461		return shadow(this, "hasJSActions", promise);
60462	}
60463	async _parseHasJSActions() {
60464		const [catalogJsActions, fieldObjects] = await Promise.all([this.pdfManager.ensureCatalog("jsActions"), this.pdfManager.ensureDoc("fieldObjects")]);
60465		if (catalogJsActions) {
60466			return true;
60467		}
60468		if (fieldObjects) {
60469			return Object.values(fieldObjects.allFields).some(fieldObject => fieldObject.some(object => object.actions !== null));
60470		}
60471		return false;
60472	}
60473	get calculationOrderIds() {
60474		const calculationOrder = this.catalog.acroForm?.get("CO");
60475		if (!Array.isArray(calculationOrder) || calculationOrder.length === 0) {
60476			return shadow(this, "calculationOrderIds", null);
60477		}
60478		const ids = [];
60479		for (const id of calculationOrder) {
60480			if (id instanceof Ref) {
60481				ids.push(id.toString());
60482			}
60483		}
60484		return shadow(this, "calculationOrderIds", ids.length ? ids : null);
60485	}
60486	get annotationGlobals() {
60487		return shadow(this, "annotationGlobals", AnnotationFactory.createGlobals(this.pdfManager));
60488	}
60489}
60490
60491;// ./src/core/pdf_manager.js
60492
60493
60494
60495
60496
60497function parseDocBaseUrl(url) {
60498	if (url) {
60499		const absoluteUrl = createValidAbsoluteUrl(url);
60500		if (absoluteUrl) {
60501			return absoluteUrl.href;
60502		}
60503		warn(`Invalid absolute docBaseUrl: "${url}".`);
60504	}
60505	return null;
60506}
60507class BasePdfManager {
60508	constructor(args) {
60509		this._docBaseUrl = parseDocBaseUrl(args.docBaseUrl);
60510		this._docId = args.docId;
60511		this._password = args.password;
60512		this.enableXfa = args.enableXfa;
60513		args.evaluatorOptions.isOffscreenCanvasSupported &&= FeatureTest.isOffscreenCanvasSupported;
60514		args.evaluatorOptions.isImageDecoderSupported &&= FeatureTest.isImageDecoderSupported;
60515		this.evaluatorOptions = Object.freeze(args.evaluatorOptions);
60516	}
60517	get docId() {
60518		return this._docId;
60519	}
60520	get password() {
60521		return this._password;
60522	}
60523	get docBaseUrl() {
60524		return this._docBaseUrl;
60525	}
60526	get catalog() {
60527		return this.pdfDocument.catalog;
60528	}
60529	ensureDoc(prop, args) {
60530		return this.ensure(this.pdfDocument, prop, args);
60531	}
60532	ensureXRef(prop, args) {
60533		return this.ensure(this.pdfDocument.xref, prop, args);
60534	}
60535	ensureCatalog(prop, args) {
60536		return this.ensure(this.pdfDocument.catalog, prop, args);
60537	}
60538	getPage(pageIndex) {
60539		return this.pdfDocument.getPage(pageIndex);
60540	}
60541	fontFallback(id, handler) {
60542		return this.pdfDocument.fontFallback(id, handler);
60543	}
60544	loadXfaFonts(handler, task) {
60545		return this.pdfDocument.loadXfaFonts(handler, task);
60546	}
60547	loadXfaImages() {
60548		return this.pdfDocument.loadXfaImages();
60549	}
60550	serializeXfaData(annotationStorage) {
60551		return this.pdfDocument.serializeXfaData(annotationStorage);
60552	}
60553	cleanup(manuallyTriggered = false) {
60554		return this.pdfDocument.cleanup(manuallyTriggered);
60555	}
60556	async ensure(obj, prop, args) {
60557		unreachable("Abstract method `ensure` called");
60558	}
60559	requestRange(begin, end) {
60560		unreachable("Abstract method `requestRange` called");
60561	}
60562	requestLoadedStream(noFetch = false) {
60563		unreachable("Abstract method `requestLoadedStream` called");
60564	}
60565	sendProgressiveData(chunk) {
60566		unreachable("Abstract method `sendProgressiveData` called");
60567	}
60568	updatePassword(password) {
60569		this._password = password;
60570	}
60571	terminate(reason) {
60572		unreachable("Abstract method `terminate` called");
60573	}
60574}
60575class LocalPdfManager extends BasePdfManager {
60576	constructor(args) {
60577		super(args);
60578		const stream = new Stream(args.source);
60579		this.pdfDocument = new PDFDocument(this, stream);
60580		this._loadedStreamPromise = Promise.resolve(stream);
60581	}
60582	async ensure(obj, prop, args) {
60583		const value = obj[prop];
60584		if (typeof value === "function") {
60585			return value.apply(obj, args);
60586		}
60587		return value;
60588	}
60589	requestRange(begin, end) {
60590		return Promise.resolve();
60591	}
60592	requestLoadedStream(noFetch = false) {
60593		return this._loadedStreamPromise;
60594	}
60595	terminate(reason) {}
60596}
60597class NetworkPdfManager extends BasePdfManager {
60598	constructor(args) {
60599		super(args);
60600		this.streamManager = new ChunkedStreamManager(args.source, {
60601			msgHandler: args.handler,
60602			length: args.length,
60603			disableAutoFetch: args.disableAutoFetch,
60604			rangeChunkSize: args.rangeChunkSize
60605		});
60606		this.pdfDocument = new PDFDocument(this, this.streamManager.getStream());
60607	}
60608	async ensure(obj, prop, args) {
60609		try {
60610			const value = obj[prop];
60611			if (typeof value === "function") {
60612				return value.apply(obj, args);
60613			}
60614			return value;
60615		} catch (ex) {
60616			if (!(ex instanceof MissingDataException)) {
60617				throw ex;
60618			}
60619			await this.requestRange(ex.begin, ex.end);
60620			return this.ensure(obj, prop, args);
60621		}
60622	}
60623	requestRange(begin, end) {
60624		return this.streamManager.requestRange(begin, end);
60625	}
60626	requestLoadedStream(noFetch = false) {
60627		return this.streamManager.requestAllChunks(noFetch);
60628	}
60629	sendProgressiveData(chunk) {
60630		this.streamManager.onReceiveData({
60631			chunk
60632		});
60633	}
60634	terminate(reason) {
60635		this.streamManager.abort(reason);
60636	}
60637}
60638
60639;// ./src/shared/message_handler.js
60640
60641
60642
60643const CallbackKind = {
60644	DATA: 1,
60645	ERROR: 2
60646};
60647const StreamKind = {
60648	CANCEL: 1,
60649	CANCEL_COMPLETE: 2,
60650	CLOSE: 3,
60651	ENQUEUE: 4,
60652	ERROR: 5,
60653	PULL: 6,
60654	PULL_COMPLETE: 7,
60655	START_COMPLETE: 8
60656};
60657function onFn() {}
60658function wrapReason(ex) {
60659	if (ex instanceof AbortException || ex instanceof InvalidPDFException || ex instanceof MissingPDFException || ex instanceof PasswordException || ex instanceof UnexpectedResponseException || ex instanceof UnknownErrorException) {
60660		return ex;
60661	}
60662	if (!(ex instanceof Error || typeof ex === "object" && ex !== null)) {
60663		unreachable('wrapReason: Expected "reason" to be a (possibly cloned) Error.');
60664	}
60665	switch (ex.name) {
60666		case "AbortException":
60667			return new AbortException(ex.message);
60668		case "InvalidPDFException":
60669			return new InvalidPDFException(ex.message);
60670		case "MissingPDFException":
60671			return new MissingPDFException(ex.message);
60672		case "PasswordException":
60673			return new PasswordException(ex.message, ex.code);
60674		case "UnexpectedResponseException":
60675			return new UnexpectedResponseException(ex.message, ex.status);
60676		case "UnknownErrorException":
60677			return new UnknownErrorException(ex.message, ex.details);
60678	}
60679	return new UnknownErrorException(ex.message, ex.toString());
60680}
60681class MessageHandler {
60682	#messageAC = new AbortController();
60683	constructor(sourceName, targetName, comObj) {
60684		this.sourceName = sourceName;
60685		this.targetName = targetName;
60686		this.comObj = comObj;
60687		this.callbackId = 1;
60688		this.streamId = 1;
60689		this.streamSinks = Object.create(null);
60690		this.streamControllers = Object.create(null);
60691		this.callbackCapabilities = Object.create(null);
60692		this.actionHandler = Object.create(null);
60693		comObj.addEventListener("message", this.#onMessage.bind(this), {
60694			signal: this.#messageAC.signal
60695		});
60696	}
60697	#onMessage({
60698		data
60699	}) {
60700		if (data.targetName !== this.sourceName) {
60701			return;
60702		}
60703		if (data.stream) {
60704			this.#processStreamMessage(data);
60705			return;
60706		}
60707		if (data.callback) {
60708			const callbackId = data.callbackId;
60709			const capability = this.callbackCapabilities[callbackId];
60710			if (!capability) {
60711				throw new Error(`Cannot resolve callback ${callbackId}`);
60712			}
60713			delete this.callbackCapabilities[callbackId];
60714			if (data.callback === CallbackKind.DATA) {
60715				capability.resolve(data.data);
60716			} else if (data.callback === CallbackKind.ERROR) {
60717				capability.reject(wrapReason(data.reason));
60718			} else {
60719				throw new Error("Unexpected callback case");
60720			}
60721			return;
60722		}
60723		const action = this.actionHandler[data.action];
60724		if (!action) {
60725			throw new Error(`Unknown action from worker: ${data.action}`);
60726		}
60727		if (data.callbackId) {
60728			const sourceName = this.sourceName,
60729				targetName = data.sourceName,
60730				comObj = this.comObj;
60731			Promise.try(action, data.data).then(function (result) {
60732				comObj.postMessage({
60733					sourceName,
60734					targetName,
60735					callback: CallbackKind.DATA,
60736					callbackId: data.callbackId,
60737					data: result
60738				});
60739			}, function (reason) {
60740				comObj.postMessage({
60741					sourceName,
60742					targetName,
60743					callback: CallbackKind.ERROR,
60744					callbackId: data.callbackId,
60745					reason: wrapReason(reason)
60746				});
60747			});
60748			return;
60749		}
60750		if (data.streamId) {
60751			this.#createStreamSink(data);
60752			return;
60753		}
60754		action(data.data);
60755	}
60756	on(actionName, handler) {
60757		const ah = this.actionHandler;
60758		if (ah[actionName]) {
60759			throw new Error(`There is already an actionName called "${actionName}"`);
60760		}
60761		ah[actionName] = handler;
60762	}
60763	send(actionName, data, transfers) {
60764		this.comObj.postMessage({
60765			sourceName: this.sourceName,
60766			targetName: this.targetName,
60767			action: actionName,
60768			data
60769		}, transfers);
60770	}
60771	sendWithPromise(actionName, data, transfers) {
60772		const callbackId = this.callbackId++;
60773		const capability = Promise.withResolvers();
60774		this.callbackCapabilities[callbackId] = capability;
60775		try {
60776			this.comObj.postMessage({
60777				sourceName: this.sourceName,
60778				targetName: this.targetName,
60779				action: actionName,
60780				callbackId,
60781				data
60782			}, transfers);
60783		} catch (ex) {
60784			capability.reject(ex);
60785		}
60786		return capability.promise;
60787	}
60788	sendWithStream(actionName, data, queueingStrategy, transfers) {
60789		const streamId = this.streamId++,
60790			sourceName = this.sourceName,
60791			targetName = this.targetName,
60792			comObj = this.comObj;
60793		return new ReadableStream({
60794			start: controller => {
60795				const startCapability = Promise.withResolvers();
60796				this.streamControllers[streamId] = {
60797					controller,
60798					startCall: startCapability,
60799					pullCall: null,
60800					cancelCall: null,
60801					isClosed: false
60802				};
60803				comObj.postMessage({
60804					sourceName,
60805					targetName,
60806					action: actionName,
60807					streamId,
60808					data,
60809					desiredSize: controller.desiredSize
60810				}, transfers);
60811				return startCapability.promise;
60812			},
60813			pull: controller => {
60814				const pullCapability = Promise.withResolvers();
60815				this.streamControllers[streamId].pullCall = pullCapability;
60816				comObj.postMessage({
60817					sourceName,
60818					targetName,
60819					stream: StreamKind.PULL,
60820					streamId,
60821					desiredSize: controller.desiredSize
60822				});
60823				return pullCapability.promise;
60824			},
60825			cancel: reason => {
60826				assert(reason instanceof Error, "cancel must have a valid reason");
60827				const cancelCapability = Promise.withResolvers();
60828				this.streamControllers[streamId].cancelCall = cancelCapability;
60829				this.streamControllers[streamId].isClosed = true;
60830				comObj.postMessage({
60831					sourceName,
60832					targetName,
60833					stream: StreamKind.CANCEL,
60834					streamId,
60835					reason: wrapReason(reason)
60836				});
60837				return cancelCapability.promise;
60838			}
60839		}, queueingStrategy);
60840	}
60841	#createStreamSink(data) {
60842		const streamId = data.streamId,
60843			sourceName = this.sourceName,
60844			targetName = data.sourceName,
60845			comObj = this.comObj;
60846		const self = this,
60847			action = this.actionHandler[data.action];
60848		const streamSink = {
60849			enqueue(chunk, size = 1, transfers) {
60850				if (this.isCancelled) {
60851					return;
60852				}
60853				const lastDesiredSize = this.desiredSize;
60854				this.desiredSize -= size;
60855				if (lastDesiredSize > 0 && this.desiredSize <= 0) {
60856					this.sinkCapability = Promise.withResolvers();
60857					this.ready = this.sinkCapability.promise;
60858				}
60859				comObj.postMessage({
60860					sourceName,
60861					targetName,
60862					stream: StreamKind.ENQUEUE,
60863					streamId,
60864					chunk
60865				}, transfers);
60866			},
60867			close() {
60868				if (this.isCancelled) {
60869					return;
60870				}
60871				this.isCancelled = true;
60872				comObj.postMessage({
60873					sourceName,
60874					targetName,
60875					stream: StreamKind.CLOSE,
60876					streamId
60877				});
60878				delete self.streamSinks[streamId];
60879			},
60880			error(reason) {
60881				assert(reason instanceof Error, "error must have a valid reason");
60882				if (this.isCancelled) {
60883					return;
60884				}
60885				this.isCancelled = true;
60886				comObj.postMessage({
60887					sourceName,
60888					targetName,
60889					stream: StreamKind.ERROR,
60890					streamId,
60891					reason: wrapReason(reason)
60892				});
60893			},
60894			sinkCapability: Promise.withResolvers(),
60895			onPull: null,
60896			onCancel: null,
60897			isCancelled: false,
60898			desiredSize: data.desiredSize,
60899			ready: null
60900		};
60901		streamSink.sinkCapability.resolve();
60902		streamSink.ready = streamSink.sinkCapability.promise;
60903		this.streamSinks[streamId] = streamSink;
60904		Promise.try(action, data.data, streamSink).then(function () {
60905			comObj.postMessage({
60906				sourceName,
60907				targetName,
60908				stream: StreamKind.START_COMPLETE,
60909				streamId,
60910				success: true
60911			});
60912		}, function (reason) {
60913			comObj.postMessage({
60914				sourceName,
60915				targetName,
60916				stream: StreamKind.START_COMPLETE,
60917				streamId,
60918				reason: wrapReason(reason)
60919			});
60920		});
60921	}
60922	#processStreamMessage(data) {
60923		const streamId = data.streamId,
60924			sourceName = this.sourceName,
60925			targetName = data.sourceName,
60926			comObj = this.comObj;
60927		const streamController = this.streamControllers[streamId],
60928			streamSink = this.streamSinks[streamId];
60929		switch (data.stream) {
60930			case StreamKind.START_COMPLETE:
60931				if (data.success) {
60932					streamController.startCall.resolve();
60933				} else {
60934					streamController.startCall.reject(wrapReason(data.reason));
60935				}
60936				break;
60937			case StreamKind.PULL_COMPLETE:
60938				if (data.success) {
60939					streamController.pullCall.resolve();
60940				} else {
60941					streamController.pullCall.reject(wrapReason(data.reason));
60942				}
60943				break;
60944			case StreamKind.PULL:
60945				if (!streamSink) {
60946					comObj.postMessage({
60947						sourceName,
60948						targetName,
60949						stream: StreamKind.PULL_COMPLETE,
60950						streamId,
60951						success: true
60952					});
60953					break;
60954				}
60955				if (streamSink.desiredSize <= 0 && data.desiredSize > 0) {
60956					streamSink.sinkCapability.resolve();
60957				}
60958				streamSink.desiredSize = data.desiredSize;
60959				Promise.try(streamSink.onPull || onFn).then(function () {
60960					comObj.postMessage({
60961						sourceName,
60962						targetName,
60963						stream: StreamKind.PULL_COMPLETE,
60964						streamId,
60965						success: true
60966					});
60967				}, function (reason) {
60968					comObj.postMessage({
60969						sourceName,
60970						targetName,
60971						stream: StreamKind.PULL_COMPLETE,
60972						streamId,
60973						reason: wrapReason(reason)
60974					});
60975				});
60976				break;
60977			case StreamKind.ENQUEUE:
60978				assert(streamController, "enqueue should have stream controller");
60979				if (streamController.isClosed) {
60980					break;
60981				}
60982				streamController.controller.enqueue(data.chunk);
60983				break;
60984			case StreamKind.CLOSE:
60985				assert(streamController, "close should have stream controller");
60986				if (streamController.isClosed) {
60987					break;
60988				}
60989				streamController.isClosed = true;
60990				streamController.controller.close();
60991				this.#deleteStreamController(streamController, streamId);
60992				break;
60993			case StreamKind.ERROR:
60994				assert(streamController, "error should have stream controller");
60995				streamController.controller.error(wrapReason(data.reason));
60996				this.#deleteStreamController(streamController, streamId);
60997				break;
60998			case StreamKind.CANCEL_COMPLETE:
60999				if (data.success) {
61000					streamController.cancelCall.resolve();
61001				} else {
61002					streamController.cancelCall.reject(wrapReason(data.reason));
61003				}
61004				this.#deleteStreamController(streamController, streamId);
61005				break;
61006			case StreamKind.CANCEL:
61007				if (!streamSink) {
61008					break;
61009				}
61010				const dataReason = wrapReason(data.reason);
61011				Promise.try(streamSink.onCancel || onFn, dataReason).then(function () {
61012					comObj.postMessage({
61013						sourceName,
61014						targetName,
61015						stream: StreamKind.CANCEL_COMPLETE,
61016						streamId,
61017						success: true
61018					});
61019				}, function (reason) {
61020					comObj.postMessage({
61021						sourceName,
61022						targetName,
61023						stream: StreamKind.CANCEL_COMPLETE,
61024						streamId,
61025						reason: wrapReason(reason)
61026					});
61027				});
61028				streamSink.sinkCapability.reject(dataReason);
61029				streamSink.isCancelled = true;
61030				delete this.streamSinks[streamId];
61031				break;
61032			default:
61033				throw new Error("Unexpected stream case");
61034		}
61035	}
61036	async #deleteStreamController(streamController, streamId) {
61037		await Promise.allSettled([streamController.startCall?.promise, streamController.pullCall?.promise, streamController.cancelCall?.promise]);
61038		delete this.streamControllers[streamId];
61039	}
61040	destroy() {
61041		this.#messageAC?.abort();
61042		this.#messageAC = null;
61043	}
61044}
61045
61046;// ./src/core/writer.js
61047
61048
61049
61050
61051
61052
61053
61054
61055
61056
61057
61058
61059
61060
61061
61062
61063
61064async function writeObject(ref, obj, buffer, {
61065	encrypt = null
61066}) {
61067	const transform = encrypt?.createCipherTransform(ref.num, ref.gen);
61068	buffer.push(`${ref.num} ${ref.gen} obj\n`);
61069	if (obj instanceof Dict) {
61070		await writeDict(obj, buffer, transform);
61071	} else if (obj instanceof BaseStream) {
61072		await writeStream(obj, buffer, transform);
61073	} else if (Array.isArray(obj) || ArrayBuffer.isView(obj)) {
61074		await writeArray(obj, buffer, transform);
61075	}
61076	buffer.push("\nendobj\n");
61077}
61078async function writeDict(dict, buffer, transform) {
61079	buffer.push("<<");
61080	for (const key of dict.getKeys()) {
61081		buffer.push(` /${escapePDFName(key)} `);
61082		await writeValue(dict.getRaw(key), buffer, transform);
61083	}
61084	buffer.push(">>");
61085}
61086async function writeStream(stream, buffer, transform) {
61087	let bytes = stream.getBytes();
61088	const {
61089		dict
61090	} = stream;
61091	const [filter, params] = await Promise.all([dict.getAsync("Filter"), dict.getAsync("DecodeParms")]);
61092	const filterZero = Array.isArray(filter) ? await dict.xref.fetchIfRefAsync(filter[0]) : filter;
61093	const isFilterZeroFlateDecode = isName(filterZero, "FlateDecode");
61094	const MIN_LENGTH_FOR_COMPRESSING = 256;
61095	if (bytes.length >= MIN_LENGTH_FOR_COMPRESSING || isFilterZeroFlateDecode) {
61096		try {
61097			const cs = new CompressionStream("deflate");
61098			const writer = cs.writable.getWriter();
61099			await writer.ready;
61100			writer.write(bytes).then(async () => {
61101				await writer.ready;
61102				await writer.close();
61103			}).catch(() => {});
61104			const buf = await new Response(cs.readable).arrayBuffer();
61105			bytes = new Uint8Array(buf);
61106			let newFilter, newParams;
61107			if (!filter) {
61108				newFilter = Name.get("FlateDecode");
61109			} else if (!isFilterZeroFlateDecode) {
61110				newFilter = Array.isArray(filter) ? [Name.get("FlateDecode"), ...filter] : [Name.get("FlateDecode"), filter];
61111				if (params) {
61112					newParams = Array.isArray(params) ? [null, ...params] : [null, params];
61113				}
61114			}
61115			if (newFilter) {
61116				dict.set("Filter", newFilter);
61117			}
61118			if (newParams) {
61119				dict.set("DecodeParms", newParams);
61120			}
61121		} catch (ex) {
61122			info(`writeStream - cannot compress data: "${ex}".`);
61123		}
61124	}
61125	let string = bytesToString(bytes);
61126	if (transform) {
61127		string = transform.encryptString(string);
61128	}
61129	dict.set("Length", string.length);
61130	await writeDict(dict, buffer, transform);
61131	buffer.push(" stream\n", string, "\nendstream");
61132}
61133async function writeArray(array, buffer, transform) {
61134	buffer.push("[");
61135	let first = true;
61136	for (const val of array) {
61137		if (!first) {
61138			buffer.push(" ");
61139		} else {
61140			first = false;
61141		}
61142		await writeValue(val, buffer, transform);
61143	}
61144	buffer.push("]");
61145}
61146async function writeValue(value, buffer, transform) {
61147	if (value instanceof Name) {
61148		buffer.push(`/${escapePDFName(value.name)}`);
61149	} else if (value instanceof Ref) {
61150		buffer.push(`${value.num} ${value.gen} R`);
61151	} else if (Array.isArray(value) || ArrayBuffer.isView(value)) {
61152		await writeArray(value, buffer, transform);
61153	} else if (typeof value === "string") {
61154		if (transform) {
61155			value = transform.encryptString(value);
61156		}
61157		buffer.push(`(${escapeString(value)})`);
61158	} else if (typeof value === "number") {
61159		buffer.push(numberToString(value));
61160	} else if (typeof value === "boolean") {
61161		buffer.push(value.toString());
61162	} else if (value instanceof Dict) {
61163		await writeDict(value, buffer, transform);
61164	} else if (value instanceof BaseStream) {
61165		await writeStream(value, buffer, transform);
61166	} else if (value === null) {
61167		buffer.push("null");
61168	} else {
61169		warn(`Unhandled value in writer: ${typeof value}, please file a bug.`);
61170	}
61171}
61172function writeInt(number, size, offset, buffer) {
61173	for (let i = size + offset - 1; i > offset - 1; i--) {
61174		buffer[i] = number & 0xff;
61175		number >>= 8;
61176	}
61177	return offset + size;
61178}
61179function writeString(string, offset, buffer) {
61180	for (let i = 0, len = string.length; i < len; i++) {
61181		buffer[offset + i] = string.charCodeAt(i) & 0xff;
61182	}
61183}
61184function computeMD5(filesize, xrefInfo) {
61185	const time = Math.floor(Date.now() / 1000);
61186	const filename = xrefInfo.filename || "";
61187	const md5Buffer = [time.toString(), filename, filesize.toString()];
61188	let md5BufferLen = md5Buffer.reduce((a, str) => a + str.length, 0);
61189	for (const value of Object.values(xrefInfo.info)) {
61190		md5Buffer.push(value);
61191		md5BufferLen += value.length;
61192	}
61193	const array = new Uint8Array(md5BufferLen);
61194	let offset = 0;
61195	for (const str of md5Buffer) {
61196		writeString(str, offset, array);
61197		offset += str.length;
61198	}
61199	return bytesToString(calculateMD5(array));
61200}
61201function writeXFADataForAcroform(str, changes) {
61202	const xml = new SimpleXMLParser({
61203		hasAttributes: true
61204	}).parseFromString(str);
61205	for (const {
61206		xfa
61207	} of changes) {
61208		if (!xfa) {
61209			continue;
61210		}
61211		const {
61212			path,
61213			value
61214		} = xfa;
61215		if (!path) {
61216			continue;
61217		}
61218		const nodePath = parseXFAPath(path);
61219		let node = xml.documentElement.searchNode(nodePath, 0);
61220		if (!node && nodePath.length > 1) {
61221			node = xml.documentElement.searchNode([nodePath.at(-1)], 0);
61222		}
61223		if (node) {
61224			node.childNodes = Array.isArray(value) ? value.map(val => new SimpleDOMNode("value", val)) : [new SimpleDOMNode("#text", value)];
61225		} else {
61226			warn(`Node not found for path: ${path}`);
61227		}
61228	}
61229	const buffer = [];
61230	xml.documentElement.dump(buffer);
61231	return buffer.join("");
61232}
61233async function updateAcroform({
61234	xref,
61235	acroForm,
61236	acroFormRef,
61237	hasXfa,
61238	hasXfaDatasetsEntry,
61239	xfaDatasetsRef,
61240	needAppearances,
61241	changes
61242}) {
61243	if (hasXfa && !hasXfaDatasetsEntry && !xfaDatasetsRef) {
61244		warn("XFA - Cannot save it");
61245	}
61246	if (!needAppearances && (!hasXfa || !xfaDatasetsRef || hasXfaDatasetsEntry)) {
61247		return;
61248	}
61249	const dict = acroForm.clone();
61250	if (hasXfa && !hasXfaDatasetsEntry) {
61251		const newXfa = acroForm.get("XFA").slice();
61252		newXfa.splice(2, 0, "datasets");
61253		newXfa.splice(3, 0, xfaDatasetsRef);
61254		dict.set("XFA", newXfa);
61255	}
61256	if (needAppearances) {
61257		dict.set("NeedAppearances", true);
61258	}
61259	changes.put(acroFormRef, {
61260		data: dict
61261	});
61262}
61263function updateXFA({
61264	xfaData,
61265	xfaDatasetsRef,
61266	changes,
61267	xref
61268}) {
61269	if (xfaData === null) {
61270		const datasets = xref.fetchIfRef(xfaDatasetsRef);
61271		xfaData = writeXFADataForAcroform(datasets.getString(), changes);
61272	}
61273	const xfaDataStream = new StringStream(xfaData);
61274	xfaDataStream.dict = new Dict(xref);
61275	xfaDataStream.dict.set("Type", Name.get("EmbeddedFile"));
61276	changes.put(xfaDatasetsRef, {
61277		data: xfaDataStream
61278	});
61279}
61280async function getXRefTable(xrefInfo, baseOffset, newRefs, newXref, buffer) {
61281	buffer.push("xref\n");
61282	const indexes = getIndexes(newRefs);
61283	let indexesPosition = 0;
61284	for (const {
61285		ref,
61286		data
61287	} of newRefs) {
61288		if (ref.num === indexes[indexesPosition]) {
61289			buffer.push(`${indexes[indexesPosition]} ${indexes[indexesPosition + 1]}\n`);
61290			indexesPosition += 2;
61291		}
61292		if (data !== null) {
61293			buffer.push(`${baseOffset.toString().padStart(10, "0")} ${Math.min(ref.gen, 0xffff).toString().padStart(5, "0")} n\r\n`);
61294			baseOffset += data.length;
61295		} else {
61296			buffer.push(`0000000000 ${Math.min(ref.gen + 1, 0xffff).toString().padStart(5, "0")} f\r\n`);
61297		}
61298	}
61299	computeIDs(baseOffset, xrefInfo, newXref);
61300	buffer.push("trailer\n");
61301	await writeDict(newXref, buffer);
61302	buffer.push("\nstartxref\n", baseOffset.toString(), "\n%%EOF\n");
61303}
61304function getIndexes(newRefs) {
61305	const indexes = [];
61306	for (const {
61307		ref
61308	} of newRefs) {
61309		if (ref.num === indexes.at(-2) + indexes.at(-1)) {
61310			indexes[indexes.length - 1] += 1;
61311		} else {
61312			indexes.push(ref.num, 1);
61313		}
61314	}
61315	return indexes;
61316}
61317async function getXRefStreamTable(xrefInfo, baseOffset, newRefs, newXref, buffer) {
61318	const xrefTableData = [];
61319	let maxOffset = 0;
61320	let maxGen = 0;
61321	for (const {
61322		ref,
61323		data
61324	} of newRefs) {
61325		let gen;
61326		maxOffset = Math.max(maxOffset, baseOffset);
61327		if (data !== null) {
61328			gen = Math.min(ref.gen, 0xffff);
61329			xrefTableData.push([1, baseOffset, gen]);
61330			baseOffset += data.length;
61331		} else {
61332			gen = Math.min(ref.gen + 1, 0xffff);
61333			xrefTableData.push([0, 0, gen]);
61334		}
61335		maxGen = Math.max(maxGen, gen);
61336	}
61337	newXref.set("Index", getIndexes(newRefs));
61338	const offsetSize = getSizeInBytes(maxOffset);
61339	const maxGenSize = getSizeInBytes(maxGen);
61340	const sizes = [1, offsetSize, maxGenSize];
61341	newXref.set("W", sizes);
61342	computeIDs(baseOffset, xrefInfo, newXref);
61343	const structSize = sizes.reduce((a, x) => a + x, 0);
61344	const data = new Uint8Array(structSize * xrefTableData.length);
61345	const stream = new Stream(data);
61346	stream.dict = newXref;
61347	let offset = 0;
61348	for (const [type, objOffset, gen] of xrefTableData) {
61349		offset = writeInt(type, sizes[0], offset, data);
61350		offset = writeInt(objOffset, sizes[1], offset, data);
61351		offset = writeInt(gen, sizes[2], offset, data);
61352	}
61353	await writeObject(xrefInfo.newRef, stream, buffer, {});
61354	buffer.push("startxref\n", baseOffset.toString(), "\n%%EOF\n");
61355}
61356function computeIDs(baseOffset, xrefInfo, newXref) {
61357	if (Array.isArray(xrefInfo.fileIds) && xrefInfo.fileIds.length > 0) {
61358		const md5 = computeMD5(baseOffset, xrefInfo);
61359		newXref.set("ID", [xrefInfo.fileIds[0], md5]);
61360	}
61361}
61362function getTrailerDict(xrefInfo, changes, useXrefStream) {
61363	const newXref = new Dict(null);
61364	newXref.set("Prev", xrefInfo.startXRef);
61365	const refForXrefTable = xrefInfo.newRef;
61366	if (useXrefStream) {
61367		changes.put(refForXrefTable, {
61368			data: ""
61369		});
61370		newXref.set("Size", refForXrefTable.num + 1);
61371		newXref.set("Type", Name.get("XRef"));
61372	} else {
61373		newXref.set("Size", refForXrefTable.num);
61374	}
61375	if (xrefInfo.rootRef !== null) {
61376		newXref.set("Root", xrefInfo.rootRef);
61377	}
61378	if (xrefInfo.infoRef !== null) {
61379		newXref.set("Info", xrefInfo.infoRef);
61380	}
61381	if (xrefInfo.encryptRef !== null) {
61382		newXref.set("Encrypt", xrefInfo.encryptRef);
61383	}
61384	return newXref;
61385}
61386async function writeChanges(changes, xref, buffer = []) {
61387	const newRefs = [];
61388	for (const [ref, {
61389		data
61390	}] of changes.items()) {
61391		if (data === null || typeof data === "string") {
61392			newRefs.push({
61393				ref,
61394				data
61395			});
61396			continue;
61397		}
61398		await writeObject(ref, data, buffer, xref);
61399		newRefs.push({
61400			ref,
61401			data: buffer.join("")
61402		});
61403		buffer.length = 0;
61404	}
61405	return newRefs.sort((a, b) => a.ref.num - b.ref.num);
61406}
61407async function incrementalUpdate({
61408	originalData,
61409	xrefInfo,
61410	changes,
61411	xref = null,
61412	hasXfa = false,
61413	xfaDatasetsRef = null,
61414	hasXfaDatasetsEntry = false,
61415	needAppearances,
61416	acroFormRef = null,
61417	acroForm = null,
61418	xfaData = null,
61419	useXrefStream = false
61420}) {
61421	await updateAcroform({
61422		xref,
61423		acroForm,
61424		acroFormRef,
61425		hasXfa,
61426		hasXfaDatasetsEntry,
61427		xfaDatasetsRef,
61428		needAppearances,
61429		changes
61430	});
61431	if (hasXfa) {
61432		updateXFA({
61433			xfaData,
61434			xfaDatasetsRef,
61435			changes,
61436			xref
61437		});
61438	}
61439	const newXref = getTrailerDict(xrefInfo, changes, useXrefStream);
61440	const buffer = [];
61441	const newRefs = await writeChanges(changes, xref, buffer);
61442	let baseOffset = originalData.length;
61443	const lastByte = originalData.at(-1);
61444	if (lastByte !== 0x0a && lastByte !== 0x0d) {
61445		buffer.push("\n");
61446		baseOffset += 1;
61447	}
61448	for (const {
61449		data
61450	} of newRefs) {
61451		if (data !== null) {
61452			buffer.push(data);
61453		}
61454	}
61455	await (useXrefStream ? getXRefStreamTable(xrefInfo, baseOffset, newRefs, newXref, buffer) : getXRefTable(xrefInfo, baseOffset, newRefs, newXref, buffer));
61456	const totalLength = buffer.reduce((a, str) => a + str.length, originalData.length);
61457	const array = new Uint8Array(totalLength);
61458	array.set(originalData);
61459	let offset = originalData.length;
61460	for (const str of buffer) {
61461		writeString(str, offset, array);
61462		offset += str.length;
61463	}
61464	return array;
61465}
61466
61467;// ./src/core/worker_stream.js
61468
61469
61470class PDFWorkerStream {
61471	constructor(msgHandler) {
61472		this._msgHandler = msgHandler;
61473		this._contentLength = null;
61474		this._fullRequestReader = null;
61475		this._rangeRequestReaders = [];
61476	}
61477	getFullReader() {
61478		assert(!this._fullRequestReader, "PDFWorkerStream.getFullReader can only be called once.");
61479		this._fullRequestReader = new PDFWorkerStreamReader(this._msgHandler);
61480		return this._fullRequestReader;
61481	}
61482	getRangeReader(begin, end) {
61483		const reader = new PDFWorkerStreamRangeReader(begin, end, this._msgHandler);
61484		this._rangeRequestReaders.push(reader);
61485		return reader;
61486	}
61487	cancelAllRequests(reason) {
61488		this._fullRequestReader?.cancel(reason);
61489		for (const reader of this._rangeRequestReaders.slice(0)) {
61490			reader.cancel(reason);
61491		}
61492	}
61493}
61494class PDFWorkerStreamReader {
61495	constructor(msgHandler) {
61496		this._msgHandler = msgHandler;
61497		this.onProgress = null;
61498		this._contentLength = null;
61499		this._isRangeSupported = false;
61500		this._isStreamingSupported = false;
61501		const readableStream = this._msgHandler.sendWithStream("GetReader");
61502		this._reader = readableStream.getReader();
61503		this._headersReady = this._msgHandler.sendWithPromise("ReaderHeadersReady").then(data => {
61504			this._isStreamingSupported = data.isStreamingSupported;
61505			this._isRangeSupported = data.isRangeSupported;
61506			this._contentLength = data.contentLength;
61507		});
61508	}
61509	get headersReady() {
61510		return this._headersReady;
61511	}
61512	get contentLength() {
61513		return this._contentLength;
61514	}
61515	get isStreamingSupported() {
61516		return this._isStreamingSupported;
61517	}
61518	get isRangeSupported() {
61519		return this._isRangeSupported;
61520	}
61521	async read() {
61522		const {
61523			value,
61524			done
61525		} = await this._reader.read();
61526		if (done) {
61527			return {
61528				value: undefined,
61529				done: true
61530			};
61531		}
61532		return {
61533			value: value.buffer,
61534			done: false
61535		};
61536	}
61537	cancel(reason) {
61538		this._reader.cancel(reason);
61539	}
61540}
61541class PDFWorkerStreamRangeReader {
61542	constructor(begin, end, msgHandler) {
61543		this._msgHandler = msgHandler;
61544		this.onProgress = null;
61545		const readableStream = this._msgHandler.sendWithStream("GetRangeReader", {
61546			begin,
61547			end
61548		});
61549		this._reader = readableStream.getReader();
61550	}
61551	get isStreamingSupported() {
61552		return false;
61553	}
61554	async read() {
61555		const {
61556			value,
61557			done
61558		} = await this._reader.read();
61559		if (done) {
61560			return {
61561				value: undefined,
61562				done: true
61563			};
61564		}
61565		return {
61566			value: value.buffer,
61567			done: false
61568		};
61569	}
61570	cancel(reason) {
61571		this._reader.cancel(reason);
61572	}
61573}
61574
61575;// ./src/core/worker.js
61576
61577
61578
61579
61580
61581
61582
61583
61584
61585
61586
61587
61588
61589
61590
61591
61592
61593
61594
61595
61596
61597
61598
61599
61600
61601
61602
61603
61604
61605class WorkerTask {
61606	constructor(name) {
61607		this.name = name;
61608		this.terminated = false;
61609		this._capability = Promise.withResolvers();
61610	}
61611	get finished() {
61612		return this._capability.promise;
61613	}
61614	finish() {
61615		this._capability.resolve();
61616	}
61617	terminate() {
61618		this.terminated = true;
61619	}
61620	ensureNotTerminated() {
61621		if (this.terminated) {
61622			throw new Error("Worker task was terminated");
61623		}
61624	}
61625}
61626class WorkerMessageHandler {
61627	static {
61628		if (typeof window === "undefined" && !isNodeJS && typeof self !== "undefined" && typeof self.postMessage === "function" && "onmessage" in self) {
61629			this.initializeFromPort(self);
61630		}
61631	}
61632	static setup(handler, port) {
61633		let testMessageProcessed = false;
61634		handler.on("test", data => {
61635			if (testMessageProcessed) {
61636				return;
61637			}
61638			testMessageProcessed = true;
61639			handler.send("test", data instanceof Uint8Array);
61640		});
61641		handler.on("configure", data => {
61642			setVerbosityLevel(data.verbosity);
61643		});
61644		handler.on("GetDocRequest", data => this.createDocumentHandler(data, port));
61645	}
61646	static createDocumentHandler(docParams, port) {
61647		let pdfManager;
61648		let terminated = false;
61649		let cancelXHRs = null;
61650		const WorkerTasks = new Set();
61651		const verbosity = getVerbosityLevel();
61652		const {
61653			docId,
61654			apiVersion
61655		} = docParams;
61656		const workerVersion = "4.10.38";
61657		if (apiVersion !== workerVersion) {
61658			throw new Error(`The API version "${apiVersion}" does not match ` + `the Worker version "${workerVersion}".`);
61659		}
61660		const enumerableProperties = [];
61661		for (const property in []) {
61662			enumerableProperties.push(property);
61663		}
61664		if (enumerableProperties.length) {
61665			throw new Error("The `Array.prototype` contains unexpected enumerable properties: " + enumerableProperties.join(", ") + "; thus breaking e.g. `for...in` iteration of `Array`s.");
61666		}
61667		const workerHandlerName = docId + "_worker";
61668		let handler = new MessageHandler(workerHandlerName, docId, port);
61669		function ensureNotTerminated() {
61670			if (terminated) {
61671				throw new Error("Worker was terminated");
61672			}
61673		}
61674		function startWorkerTask(task) {
61675			WorkerTasks.add(task);
61676		}
61677		function finishWorkerTask(task) {
61678			task.finish();
61679			WorkerTasks.delete(task);
61680		}
61681		async function loadDocument(recoveryMode) {
61682			await pdfManager.ensureDoc("checkHeader");
61683			await pdfManager.ensureDoc("parseStartXRef");
61684			await pdfManager.ensureDoc("parse", [recoveryMode]);
61685			await pdfManager.ensureDoc("checkFirstPage", [recoveryMode]);
61686			await pdfManager.ensureDoc("checkLastPage", [recoveryMode]);
61687			const isPureXfa = await pdfManager.ensureDoc("isPureXfa");
61688			if (isPureXfa) {
61689				const task = new WorkerTask("loadXfaFonts");
61690				startWorkerTask(task);
61691				await Promise.all([pdfManager.loadXfaFonts(handler, task).catch(reason => {}).then(() => finishWorkerTask(task)), pdfManager.loadXfaImages()]);
61692			}
61693			const [numPages, fingerprints] = await Promise.all([pdfManager.ensureDoc("numPages"), pdfManager.ensureDoc("fingerprints")]);
61694			const htmlForXfa = isPureXfa ? await pdfManager.ensureDoc("htmlForXfa") : null;
61695			return {
61696				numPages,
61697				fingerprints,
61698				htmlForXfa
61699			};
61700		}
61701		async function getPdfManager({
61702			data,
61703			password,
61704			disableAutoFetch,
61705			rangeChunkSize,
61706			length,
61707			docBaseUrl,
61708			enableXfa,
61709			evaluatorOptions
61710		}) {
61711			const pdfManagerArgs = {
61712				source: null,
61713				disableAutoFetch,
61714				docBaseUrl,
61715				docId,
61716				enableXfa,
61717				evaluatorOptions,
61718				handler,
61719				length,
61720				password,
61721				rangeChunkSize
61722			};
61723			if (data) {
61724				pdfManagerArgs.source = data;
61725				return new LocalPdfManager(pdfManagerArgs);
61726			}
61727			const pdfStream = new PDFWorkerStream(handler),
61728				fullRequest = pdfStream.getFullReader();
61729			const pdfManagerCapability = Promise.withResolvers();
61730			let newPdfManager,
61731				cachedChunks = [],
61732				loaded = 0;
61733			fullRequest.headersReady.then(function () {
61734				if (!fullRequest.isRangeSupported) {
61735					return;
61736				}
61737				pdfManagerArgs.source = pdfStream;
61738				pdfManagerArgs.length = fullRequest.contentLength;
61739				pdfManagerArgs.disableAutoFetch ||= fullRequest.isStreamingSupported;
61740				newPdfManager = new NetworkPdfManager(pdfManagerArgs);
61741				for (const chunk of cachedChunks) {
61742					newPdfManager.sendProgressiveData(chunk);
61743				}
61744				cachedChunks = [];
61745				pdfManagerCapability.resolve(newPdfManager);
61746				cancelXHRs = null;
61747			}).catch(function (reason) {
61748				pdfManagerCapability.reject(reason);
61749				cancelXHRs = null;
61750			});
61751			new Promise(function (resolve, reject) {
61752				const readChunk = function ({
61753					value,
61754					done
61755				}) {
61756					try {
61757						ensureNotTerminated();
61758						if (done) {
61759							if (!newPdfManager) {
61760								const pdfFile = arrayBuffersToBytes(cachedChunks);
61761								cachedChunks = [];
61762								if (length && pdfFile.length !== length) {
61763									warn("reported HTTP length is different from actual");
61764								}
61765								pdfManagerArgs.source = pdfFile;
61766								newPdfManager = new LocalPdfManager(pdfManagerArgs);
61767								pdfManagerCapability.resolve(newPdfManager);
61768							}
61769							cancelXHRs = null;
61770							return;
61771						}
61772						loaded += value.byteLength;
61773						if (!fullRequest.isStreamingSupported) {
61774							handler.send("DocProgress", {
61775								loaded,
61776								total: Math.max(loaded, fullRequest.contentLength || 0)
61777							});
61778						}
61779						if (newPdfManager) {
61780							newPdfManager.sendProgressiveData(value);
61781						} else {
61782							cachedChunks.push(value);
61783						}
61784						fullRequest.read().then(readChunk, reject);
61785					} catch (e) {
61786						reject(e);
61787					}
61788				};
61789				fullRequest.read().then(readChunk, reject);
61790			}).catch(function (e) {
61791				pdfManagerCapability.reject(e);
61792				cancelXHRs = null;
61793			});
61794			cancelXHRs = reason => {
61795				pdfStream.cancelAllRequests(reason);
61796			};
61797			return pdfManagerCapability.promise;
61798		}
61799		function setupDoc(data) {
61800			function onSuccess(doc) {
61801				ensureNotTerminated();
61802				handler.send("GetDoc", {
61803					pdfInfo: doc
61804				});
61805			}
61806			function onFailure(ex) {
61807				ensureNotTerminated();
61808				if (ex instanceof PasswordException) {
61809					const task = new WorkerTask(`PasswordException: response ${ex.code}`);
61810					startWorkerTask(task);
61811					handler.sendWithPromise("PasswordRequest", ex).then(function ({
61812						password
61813					}) {
61814						finishWorkerTask(task);
61815						pdfManager.updatePassword(password);
61816						pdfManagerReady();
61817					}).catch(function () {
61818						finishWorkerTask(task);
61819						handler.send("DocException", ex);
61820					});
61821				} else {
61822					handler.send("DocException", wrapReason(ex));
61823				}
61824			}
61825			function pdfManagerReady() {
61826				ensureNotTerminated();
61827				loadDocument(false).then(onSuccess, function (reason) {
61828					ensureNotTerminated();
61829					if (!(reason instanceof XRefParseException)) {
61830						onFailure(reason);
61831						return;
61832					}
61833					pdfManager.requestLoadedStream().then(function () {
61834						ensureNotTerminated();
61835						loadDocument(true).then(onSuccess, onFailure);
61836					});
61837				});
61838			}
61839			ensureNotTerminated();
61840			getPdfManager(data).then(function (newPdfManager) {
61841				if (terminated) {
61842					newPdfManager.terminate(new AbortException("Worker was terminated."));
61843					throw new Error("Worker was terminated");
61844				}
61845				pdfManager = newPdfManager;
61846				pdfManager.requestLoadedStream(true).then(stream => {
61847					handler.send("DataLoaded", {
61848						length: stream.bytes.byteLength
61849					});
61850				});
61851			}).then(pdfManagerReady, onFailure);
61852		}
61853		handler.on("GetPage", function (data) {
61854			return pdfManager.getPage(data.pageIndex).then(function (page) {
61855				return Promise.all([pdfManager.ensure(page, "rotate"), pdfManager.ensure(page, "ref"), pdfManager.ensure(page, "userUnit"), pdfManager.ensure(page, "view")]).then(function ([rotate, ref, userUnit, view]) {
61856					return {
61857						rotate,
61858						ref,
61859						refStr: ref?.toString() ?? null,
61860						userUnit,
61861						view
61862					};
61863				});
61864			});
61865		});
61866		handler.on("GetPageIndex", function (data) {
61867			const pageRef = Ref.get(data.num, data.gen);
61868			return pdfManager.ensureCatalog("getPageIndex", [pageRef]);
61869		});
61870		handler.on("GetDestinations", function (data) {
61871			return pdfManager.ensureCatalog("destinations");
61872		});
61873		handler.on("GetDestination", function (data) {
61874			return pdfManager.ensureCatalog("getDestination", [data.id]);
61875		});
61876		handler.on("GetPageLabels", function (data) {
61877			return pdfManager.ensureCatalog("pageLabels");
61878		});
61879		handler.on("GetPageLayout", function (data) {
61880			return pdfManager.ensureCatalog("pageLayout");
61881		});
61882		handler.on("GetPageMode", function (data) {
61883			return pdfManager.ensureCatalog("pageMode");
61884		});
61885		handler.on("GetViewerPreferences", function (data) {
61886			return pdfManager.ensureCatalog("viewerPreferences");
61887		});
61888		handler.on("GetOpenAction", function (data) {
61889			return pdfManager.ensureCatalog("openAction");
61890		});
61891		handler.on("GetAttachments", function (data) {
61892			return pdfManager.ensureCatalog("attachments");
61893		});
61894		handler.on("GetDocJSActions", function (data) {
61895			return pdfManager.ensureCatalog("jsActions");
61896		});
61897		handler.on("GetPageJSActions", function ({
61898			pageIndex
61899		}) {
61900			return pdfManager.getPage(pageIndex).then(function (page) {
61901				return pdfManager.ensure(page, "jsActions");
61902			});
61903		});
61904		handler.on("GetOutline", function (data) {
61905			return pdfManager.ensureCatalog("documentOutline");
61906		});
61907		handler.on("GetOptionalContentConfig", function (data) {
61908			return pdfManager.ensureCatalog("optionalContentConfig");
61909		});
61910		handler.on("GetPermissions", function (data) {
61911			return pdfManager.ensureCatalog("permissions");
61912		});
61913		handler.on("GetMetadata", function (data) {
61914			return Promise.all([pdfManager.ensureDoc("documentInfo"), pdfManager.ensureCatalog("metadata")]);
61915		});
61916		handler.on("GetMarkInfo", function (data) {
61917			return pdfManager.ensureCatalog("markInfo");
61918		});
61919		handler.on("GetData", function (data) {
61920			return pdfManager.requestLoadedStream().then(function (stream) {
61921				return stream.bytes;
61922			});
61923		});
61924		handler.on("GetAnnotations", function ({
61925			pageIndex,
61926			intent
61927		}) {
61928			return pdfManager.getPage(pageIndex).then(function (page) {
61929				const task = new WorkerTask(`GetAnnotations: page ${pageIndex}`);
61930				startWorkerTask(task);
61931				return page.getAnnotationsData(handler, task, intent).then(data => {
61932					finishWorkerTask(task);
61933					return data;
61934				}, reason => {
61935					finishWorkerTask(task);
61936					throw reason;
61937				});
61938			});
61939		});
61940		handler.on("GetFieldObjects", function (data) {
61941			return pdfManager.ensureDoc("fieldObjects").then(fieldObjects => fieldObjects?.allFields || null);
61942		});
61943		handler.on("HasJSActions", function (data) {
61944			return pdfManager.ensureDoc("hasJSActions");
61945		});
61946		handler.on("GetCalculationOrderIds", function (data) {
61947			return pdfManager.ensureDoc("calculationOrderIds");
61948		});
61949		handler.on("SaveDocument", async function ({
61950			isPureXfa,
61951			numPages,
61952			annotationStorage,
61953			filename
61954		}) {
61955			const globalPromises = [pdfManager.requestLoadedStream(), pdfManager.ensureCatalog("acroForm"), pdfManager.ensureCatalog("acroFormRef"), pdfManager.ensureDoc("startXRef"), pdfManager.ensureDoc("xref"), pdfManager.ensureDoc("linearization"), pdfManager.ensureCatalog("structTreeRoot")];
61956			const changes = new RefSetCache();
61957			const promises = [];
61958			const newAnnotationsByPage = !isPureXfa ? getNewAnnotationsMap(annotationStorage) : null;
61959			const [stream, acroForm, acroFormRef, startXRef, xref, linearization, _structTreeRoot] = await Promise.all(globalPromises);
61960			const catalogRef = xref.trailer.getRaw("Root") || null;
61961			let structTreeRoot;
61962			if (newAnnotationsByPage) {
61963				if (!_structTreeRoot) {
61964					if (await StructTreeRoot.canCreateStructureTree({
61965						catalogRef,
61966						pdfManager,
61967						newAnnotationsByPage
61968					})) {
61969						structTreeRoot = null;
61970					}
61971				} else if (await _structTreeRoot.canUpdateStructTree({
61972					pdfManager,
61973					xref,
61974					newAnnotationsByPage
61975				})) {
61976					structTreeRoot = _structTreeRoot;
61977				}
61978				const imagePromises = AnnotationFactory.generateImages(annotationStorage.values(), xref, pdfManager.evaluatorOptions.isOffscreenCanvasSupported);
61979				const newAnnotationPromises = structTreeRoot === undefined ? promises : [];
61980				for (const [pageIndex, annotations] of newAnnotationsByPage) {
61981					newAnnotationPromises.push(pdfManager.getPage(pageIndex).then(page => {
61982						const task = new WorkerTask(`Save (editor): page ${pageIndex}`);
61983						startWorkerTask(task);
61984						return page.saveNewAnnotations(handler, task, annotations, imagePromises, changes).finally(function () {
61985							finishWorkerTask(task);
61986						});
61987					}));
61988				}
61989				if (structTreeRoot === null) {
61990					promises.push(Promise.all(newAnnotationPromises).then(async () => {
61991						await StructTreeRoot.createStructureTree({
61992							newAnnotationsByPage,
61993							xref,
61994							catalogRef,
61995							pdfManager,
61996							changes
61997						});
61998					}));
61999				} else if (structTreeRoot) {
62000					promises.push(Promise.all(newAnnotationPromises).then(async () => {
62001						await structTreeRoot.updateStructureTree({
62002							newAnnotationsByPage,
62003							pdfManager,
62004							changes
62005						});
62006					}));
62007				}
62008			}
62009			if (isPureXfa) {
62010				promises.push(pdfManager.serializeXfaData(annotationStorage));
62011			} else {
62012				for (let pageIndex = 0; pageIndex < numPages; pageIndex++) {
62013					promises.push(pdfManager.getPage(pageIndex).then(function (page) {
62014						const task = new WorkerTask(`Save: page ${pageIndex}`);
62015						startWorkerTask(task);
62016						return page.save(handler, task, annotationStorage, changes).finally(function () {
62017							finishWorkerTask(task);
62018						});
62019					}));
62020				}
62021			}
62022			const refs = await Promise.all(promises);
62023			let xfaData = null;
62024			if (isPureXfa) {
62025				xfaData = refs[0];
62026				if (!xfaData) {
62027					return stream.bytes;
62028				}
62029			} else if (changes.size === 0) {
62030				return stream.bytes;
62031			}
62032			const needAppearances = acroFormRef && acroForm instanceof Dict && changes.values().some(ref => ref.needAppearances);
62033			const xfa = acroForm instanceof Dict && acroForm.get("XFA") || null;
62034			let xfaDatasetsRef = null;
62035			let hasXfaDatasetsEntry = false;
62036			if (Array.isArray(xfa)) {
62037				for (let i = 0, ii = xfa.length; i < ii; i += 2) {
62038					if (xfa[i] === "datasets") {
62039						xfaDatasetsRef = xfa[i + 1];
62040						hasXfaDatasetsEntry = true;
62041					}
62042				}
62043				if (xfaDatasetsRef === null) {
62044					xfaDatasetsRef = xref.getNewTemporaryRef();
62045				}
62046			} else if (xfa) {
62047				warn("Unsupported XFA type.");
62048			}
62049			let newXrefInfo = Object.create(null);
62050			if (xref.trailer) {
62051				const infoObj = Object.create(null);
62052				const xrefInfo = xref.trailer.get("Info") || null;
62053				if (xrefInfo instanceof Dict) {
62054					for (const [key, value] of xrefInfo) {
62055						if (typeof value === "string") {
62056							infoObj[key] = stringToPDFString(value);
62057						}
62058					}
62059				}
62060				newXrefInfo = {
62061					rootRef: catalogRef,
62062					encryptRef: xref.trailer.getRaw("Encrypt") || null,
62063					newRef: xref.getNewTemporaryRef(),
62064					infoRef: xref.trailer.getRaw("Info") || null,
62065					info: infoObj,
62066					fileIds: xref.trailer.get("ID") || null,
62067					startXRef: linearization ? startXRef : xref.lastXRefStreamPos ?? startXRef,
62068					filename
62069				};
62070			}
62071			return incrementalUpdate({
62072				originalData: stream.bytes,
62073				xrefInfo: newXrefInfo,
62074				changes,
62075				xref,
62076				hasXfa: !!xfa,
62077				xfaDatasetsRef,
62078				hasXfaDatasetsEntry,
62079				needAppearances,
62080				acroFormRef,
62081				acroForm,
62082				xfaData,
62083				useXrefStream: isDict(xref.topDict, "XRef")
62084			}).finally(() => {
62085				xref.resetNewTemporaryRef();
62086			});
62087		});
62088		handler.on("GetOperatorList", function (data, sink) {
62089			const pageIndex = data.pageIndex;
62090			pdfManager.getPage(pageIndex).then(function (page) {
62091				const task = new WorkerTask(`GetOperatorList: page ${pageIndex}`);
62092				startWorkerTask(task);
62093				const start = verbosity >= VerbosityLevel.INFOS ? Date.now() : 0;
62094				page.getOperatorList({
62095					handler,
62096					sink,
62097					task,
62098					intent: data.intent,
62099					cacheKey: data.cacheKey,
62100					annotationStorage: data.annotationStorage,
62101					modifiedIds: data.modifiedIds
62102				}).then(function (operatorListInfo) {
62103					finishWorkerTask(task);
62104					if (start) {
62105						info(`page=${pageIndex + 1} - getOperatorList: time=` + `${Date.now() - start}ms, len=${operatorListInfo.length}`);
62106					}
62107					sink.close();
62108				}, function (reason) {
62109					finishWorkerTask(task);
62110					if (task.terminated) {
62111						return;
62112					}
62113					sink.error(reason);
62114				});
62115			});
62116		});
62117		handler.on("GetTextContent", function (data, sink) {
62118			const {
62119				pageIndex,
62120				includeMarkedContent,
62121				disableNormalization
62122			} = data;
62123			pdfManager.getPage(pageIndex).then(function (page) {
62124				const task = new WorkerTask("GetTextContent: page " + pageIndex);
62125				startWorkerTask(task);
62126				const start = verbosity >= VerbosityLevel.INFOS ? Date.now() : 0;
62127				page.extractTextContent({
62128					handler,
62129					task,
62130					sink,
62131					includeMarkedContent,
62132					disableNormalization
62133				}).then(function () {
62134					finishWorkerTask(task);
62135					if (start) {
62136						info(`page=${pageIndex + 1} - getTextContent: time=` + `${Date.now() - start}
62136ms`);
62137					}
62138					sink.close();
62139				}, function (reason) {
62140					finishWorkerTask(task);
62141					if (task.terminated) {
62142						return;
62143					}
62144					sink.error(reason);
62145				});
62146			});
62147		});
62148		handler.on("GetStructTree", function (data) {
62149			return pdfManager.getPage(data.pageIndex).then(function (page) {
62150				return pdfManager.ensure(page, "getStructTree");
62151			});
62152		});
62153		handler.on("FontFallback", function (data) {
62154			return pdfManager.fontFallback(data.id, handler);
62155		});
62156		handler.on("Cleanup", function (data) {
62157			return pdfManager.cleanup(true);
62158		});
62159		handler.on("Terminate", function (data) {
62160			terminated = true;
62161			const waitOn = [];
62162			if (pdfManager) {
62163				pdfManager.terminate(new AbortException("Worker was terminated."));
62164				const cleanupPromise = pdfManager.cleanup();
62165				waitOn.push(cleanupPromise);
62166				pdfManager = null;
62167			} else {
62168				clearGlobalCaches();
62169			}
62170			cancelXHRs?.(new AbortException("Worker was terminated."));
62171			for (const task of WorkerTasks) {
62172				waitOn.push(task.finished);
62173				task.terminate();
62174			}
62175			return Promise.all(waitOn).then(function () {
62176				handler.destroy();
62177				handler = null;
62178			});
62179		});
62180		handler.on("Ready", function (data) {
62181			setupDoc(docParams);
62182			docParams = null;
62183		});
62184		return workerHandlerName;
62185	}
62186	static initializeFromPort(port) {
62187		const handler = new MessageHandler("worker", "main", port);
62188		this.setup(handler, port);
62189		handler.send("ready", null);
62190	}
62191}
62192
62193;// ./src/pdf.worker.js
62194
62195const pdfjsVersion = "4.10.38";
62196const pdfjsBuild = "f9bea397f";
62197
62198var __webpack_exports__WorkerMessageHandler = __webpack_exports__.WorkerMessageHandler;
62199export { __webpack_exports__WorkerMessageHandler as WorkerMessageHandler };
62200
62201//# sourceMappingURL=pdf.worker.mjs.map
62202//# sourceMappingURL=pdfjs.worker.bundle.js.map

Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.