@depup/markdown-it 15.0.2-depup.85 → 15.0.3-depup.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +3 -11
- package/changes.json +3 -16
- package/dist/browser/markdown-it.esm.min.mjs +737 -686
- package/dist/browser/markdown-it.esm.min.mjs.map +1 -1
- package/dist/browser/markdown-it.umd.min.js +8 -8
- package/dist/browser/markdown-it.umd.min.js.map +1 -1
- package/dist/markdown-it.cjs.js +660 -518
- package/dist/markdown-it.cjs.js.map +1 -1
- package/dist/markdown-it.d.mts +1 -0
- package/dist/markdown-it.mjs +179 -124
- package/dist/markdown-it.mjs.map +1 -1
- package/package.json +13 -26
package/dist/markdown-it.cjs.js
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
/*! markdown-it 15.0.
|
|
1
|
+
/*! markdown-it 15.0.3 https://github.com/markdown-it/markdown-it @license MIT */
|
|
2
2
|
//#region \0rolldown/runtime.js
|
|
3
3
|
var __create = Object.create;
|
|
4
4
|
var __defProp = Object.defineProperty;
|
|
@@ -38,80 +38,263 @@ let linkify_it = require("linkify-it");
|
|
|
38
38
|
let punycode_js = require("punycode.js");
|
|
39
39
|
punycode_js = __toESM(punycode_js, 1);
|
|
40
40
|
//#region node_modules/entities/dist/decode-codepoint.js
|
|
41
|
-
var decodeMap = /* @__PURE__ */ new Map([
|
|
42
|
-
[0, 65533],
|
|
43
|
-
[128, 8364],
|
|
44
|
-
[130, 8218],
|
|
45
|
-
[131, 402],
|
|
46
|
-
[132, 8222],
|
|
47
|
-
[133, 8230],
|
|
48
|
-
[134, 8224],
|
|
49
|
-
[135, 8225],
|
|
50
|
-
[136, 710],
|
|
51
|
-
[137, 8240],
|
|
52
|
-
[138, 352],
|
|
53
|
-
[139, 8249],
|
|
54
|
-
[140, 338],
|
|
55
|
-
[142, 381],
|
|
56
|
-
[145, 8216],
|
|
57
|
-
[146, 8217],
|
|
58
|
-
[147, 8220],
|
|
59
|
-
[148, 8221],
|
|
60
|
-
[149, 8226],
|
|
61
|
-
[150, 8211],
|
|
62
|
-
[151, 8212],
|
|
63
|
-
[152, 732],
|
|
64
|
-
[153, 8482],
|
|
65
|
-
[154, 353],
|
|
66
|
-
[155, 8250],
|
|
67
|
-
[156, 339],
|
|
68
|
-
[158, 382],
|
|
69
|
-
[159, 376]
|
|
70
|
-
]);
|
|
71
41
|
/**
|
|
72
|
-
*
|
|
73
|
-
*
|
|
74
|
-
|
|
42
|
+
* C1 Unicode control character reference replacements (code points 128–159).
|
|
43
|
+
* Index i gives the replacement for code point 128+i; 0 means "no replacement".
|
|
44
|
+
*/
|
|
45
|
+
var c1 = [
|
|
46
|
+
8364,
|
|
47
|
+
0,
|
|
48
|
+
8218,
|
|
49
|
+
402,
|
|
50
|
+
8222,
|
|
51
|
+
8230,
|
|
52
|
+
8224,
|
|
53
|
+
8225,
|
|
54
|
+
710,
|
|
55
|
+
8240,
|
|
56
|
+
352,
|
|
57
|
+
8249,
|
|
58
|
+
338,
|
|
59
|
+
0,
|
|
60
|
+
381,
|
|
61
|
+
0,
|
|
62
|
+
0,
|
|
63
|
+
8216,
|
|
64
|
+
8217,
|
|
65
|
+
8220,
|
|
66
|
+
8221,
|
|
67
|
+
8226,
|
|
68
|
+
8211,
|
|
69
|
+
8212,
|
|
70
|
+
732,
|
|
71
|
+
8482,
|
|
72
|
+
353,
|
|
73
|
+
8250,
|
|
74
|
+
339,
|
|
75
|
+
0,
|
|
76
|
+
382,
|
|
77
|
+
376
|
|
78
|
+
];
|
|
79
|
+
/**
|
|
80
|
+
* True for NUL, UTF-16 surrogates, and values past U+10FFFF.
|
|
81
|
+
* @param codePoint Unicode code point to check.
|
|
82
|
+
*/
|
|
83
|
+
function isInvalidCodePoint(codePoint) {
|
|
84
|
+
return codePoint === 0 || codePoint >= 55296 && codePoint <= 57343 || codePoint > 1114111;
|
|
85
|
+
}
|
|
86
|
+
/**
|
|
87
|
+
* Replace the given code point with U+FFFD if it is NUL (0), a surrogate, or
|
|
88
|
+
* outside the valid Unicode range. Code points in the C1 controls range
|
|
89
|
+
* (128–159) are remapped to their Windows-1252 equivalents, following the
|
|
90
|
+
* HTML spec. All other code points are returned unchanged.
|
|
75
91
|
* @param codePoint Unicode code point to convert.
|
|
76
92
|
*/
|
|
77
93
|
function replaceCodePoint(codePoint) {
|
|
78
|
-
|
|
79
|
-
if (codePoint >=
|
|
80
|
-
return
|
|
94
|
+
if (isInvalidCodePoint(codePoint)) return 65533;
|
|
95
|
+
if (codePoint >= 128 && codePoint <= 159) return c1[codePoint - 128] || codePoint;
|
|
96
|
+
return codePoint;
|
|
97
|
+
}
|
|
98
|
+
/**
|
|
99
|
+
* Convert the code point of a decoded numeric entity to a string, replacing
|
|
100
|
+
* invalid values.
|
|
101
|
+
*
|
|
102
|
+
* Fast path for plain BMP code points: [1..0x7F] and [0xA0..0xD7FF] pass
|
|
103
|
+
* `replaceCodePoint` unchanged (no NUL, C1 remap, surrogate, or out-of-range
|
|
104
|
+
* handling) and fit a single charCode. 0xd760 = 0xD800 (the first surrogate)
|
|
105
|
+
* - 0xA0.
|
|
106
|
+
* @param codePoint Unicode code point to convert.
|
|
107
|
+
*/
|
|
108
|
+
function codePointToString(codePoint) {
|
|
109
|
+
return codePoint - 1 >>> 0 < 127 || codePoint - 160 >>> 0 < 55136 ? String.fromCharCode(codePoint) : String.fromCodePoint(replaceCodePoint(codePoint));
|
|
81
110
|
}
|
|
82
111
|
//#endregion
|
|
83
112
|
//#region node_modules/entities/dist/internal/decode-shared.js
|
|
113
|
+
var BASE91_INVERSE = /* #__PURE__ */ (() => {
|
|
114
|
+
const table = /* @__PURE__ */ new Uint8Array(127);
|
|
115
|
+
let code = 0;
|
|
116
|
+
for (let char = 33; char <= 126; char++) if (char !== 34 && char !== 36 && char !== 92) table[char] = code++;
|
|
117
|
+
return table;
|
|
118
|
+
})();
|
|
84
119
|
/**
|
|
85
|
-
*
|
|
86
|
-
*
|
|
87
|
-
*
|
|
120
|
+
* Decode a dictionary-encoded trie string back into its Uint16Array.
|
|
121
|
+
*
|
|
122
|
+
* Stream layout (consumed in this order):
|
|
123
|
+
* 1. dict1 atoms — `dict1AtomCount` uint16 values, delta+RLE encoded.
|
|
124
|
+
* 2. dict2 atoms — `atomCount - dict1AtomCount` values, delta+RLE.
|
|
125
|
+
* 3. dict2 ngrams — `ngramCount - (dictSize - dict1AtomCount)` entries,
|
|
126
|
+
* each a pair of slot codes that resolve to earlier slots.
|
|
127
|
+
* 4. dict1 ngrams — `dictSize - dict1AtomCount` entries, same shape.
|
|
128
|
+
* 5. data — slot codes, each expanding to one or more uint16 values.
|
|
129
|
+
*
|
|
130
|
+
* Codes use a 91-char base (printable ASCII minus `"`, `$`, `\`):
|
|
131
|
+
* - char1 < dictSize → 1-char code, slot = char1
|
|
132
|
+
* - char1 ≥ dictSize → 2-char code, slot = dictSize + (char1 - dictSize)*91 + char2
|
|
133
|
+
*
|
|
134
|
+
* Slot index → token kind:
|
|
135
|
+
* [0, A) dict1 atoms (1-char codes)
|
|
136
|
+
* [A, dictSize) dict1 ngrams (1-char codes)
|
|
137
|
+
* [dictSize, dictSize+D) dict2 atoms (2-char codes)
|
|
138
|
+
* [dictSize+D, end) dict2 ngrams (2-char codes)
|
|
139
|
+
*
|
|
140
|
+
* Both atom dicts decode before any ngram, and dict2 ngrams decode before
|
|
141
|
+
* dict1 ngrams. So every ngram entry references slots whose contents are
|
|
142
|
+
* already filled — no forward references to handle.
|
|
143
|
+
*
|
|
144
|
+
* This runs on library import. Flat typed arrays store each slot as either
|
|
145
|
+
* a plain value (`single`, covering every atom) or a range in a shared
|
|
146
|
+
* `pool` (ngrams).
|
|
147
|
+
* @param input Packed trie string.
|
|
148
|
+
* @param resultLength Expected number of uint16 values in the output.
|
|
149
|
+
* @param atomCount Total number of distinct uint16 values in the trie.
|
|
150
|
+
* @param dict1AtomCount Atoms in the 1-char range (`A` above).
|
|
151
|
+
* @param ngramCount Total number of ngram entries (dict1 + dict2).
|
|
152
|
+
* @param dictSize Number of 1-char code slots; the rest of `BASE - dictSize`
|
|
153
|
+
* first-byte values are 2-char codes.
|
|
88
154
|
*/
|
|
89
|
-
function
|
|
90
|
-
const
|
|
91
|
-
const
|
|
92
|
-
const
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
155
|
+
function decodeTrieDict(input, resultLength, atomCount, dict1AtomCount, ngramCount, dictSize) {
|
|
156
|
+
const base = 91;
|
|
157
|
+
const inputLength = input.length;
|
|
158
|
+
const twoCharBias = dictSize * 90;
|
|
159
|
+
let pos = 0;
|
|
160
|
+
/** Read one slot code at `pos` and return its slot index, advancing pos. */
|
|
161
|
+
const readSlotCode = () => {
|
|
162
|
+
const c1 = BASE91_INVERSE[input.charCodeAt(pos++)];
|
|
163
|
+
return c1 < dictSize ? c1 : c1 * base - twoCharBias + BASE91_INVERSE[input.charCodeAt(pos++)];
|
|
164
|
+
};
|
|
165
|
+
const dict2AtomCount = atomCount - dict1AtomCount;
|
|
166
|
+
const slotCount = atomCount + ngramCount;
|
|
167
|
+
const single = new Int32Array(slotCount);
|
|
168
|
+
single.fill(-1, dict1AtomCount, dictSize);
|
|
169
|
+
single.fill(-1, dictSize + dict2AtomCount, slotCount);
|
|
170
|
+
const start = new Int32Array(slotCount);
|
|
171
|
+
const length = new Int32Array(slotCount);
|
|
172
|
+
/**
|
|
173
|
+
* Decode `count` ascending uint16 values from a delta+RLE stream into
|
|
174
|
+
* `single[off..off+count)`.
|
|
175
|
+
*
|
|
176
|
+
* code < 89 → delta = code
|
|
177
|
+
* code == 89 → run-length: next char encodes runLength-2; emit `runLength` consecutive +1 values
|
|
178
|
+
* code == 90, next < 90 → escape: delta = 89 + next * BASE + after-next
|
|
179
|
+
* code == 90, next == 90 → double-escape: extra char for very large deltas
|
|
180
|
+
* @param count
|
|
181
|
+
* @param off
|
|
182
|
+
*/
|
|
183
|
+
function decodeDelta(count, off) {
|
|
184
|
+
let previous = 0;
|
|
185
|
+
let slot = off;
|
|
186
|
+
const end = off + count;
|
|
187
|
+
while (slot < end) {
|
|
188
|
+
const code = BASE91_INVERSE[input.charCodeAt(pos++)];
|
|
189
|
+
if (code < 89) {
|
|
190
|
+
previous += code;
|
|
191
|
+
single[slot++] = previous;
|
|
192
|
+
} else if (code === 89) {
|
|
193
|
+
let runLength = BASE91_INVERSE[input.charCodeAt(pos++)] + 2;
|
|
194
|
+
while (runLength--) single[slot++] = ++previous;
|
|
195
|
+
} else {
|
|
196
|
+
const next = BASE91_INVERSE[input.charCodeAt(pos++)];
|
|
197
|
+
previous += 89 + (next < 90 ? next * base + BASE91_INVERSE[input.charCodeAt(pos++)] : BASE91_INVERSE[input.charCodeAt(pos++)] * 8281 + BASE91_INVERSE[input.charCodeAt(pos++)] * base + BASE91_INVERSE[input.charCodeAt(pos++)]);
|
|
198
|
+
single[slot++] = previous;
|
|
199
|
+
}
|
|
200
|
+
}
|
|
201
|
+
}
|
|
202
|
+
decodeDelta(dict1AtomCount, 0);
|
|
203
|
+
decodeDelta(dict2AtomCount, dictSize);
|
|
204
|
+
const references = new Int32Array(ngramCount * 2);
|
|
205
|
+
let poolSize = 0;
|
|
206
|
+
let ngramIndex = 0;
|
|
207
|
+
/**
|
|
208
|
+
* Read `count` ngram entries (each = 2 slot-code references) for the slots
|
|
209
|
+
* starting at `startSlot`, recording references and assigning pool ranges.
|
|
210
|
+
* @param count
|
|
211
|
+
* @param startSlot
|
|
212
|
+
*/
|
|
213
|
+
function readNgramReferences(count, startSlot) {
|
|
214
|
+
for (let index = 0; index < count; index++) {
|
|
215
|
+
const slot = startSlot + index;
|
|
216
|
+
const a = readSlotCode();
|
|
217
|
+
const b = readSlotCode();
|
|
218
|
+
references[ngramIndex * 2] = a;
|
|
219
|
+
references[ngramIndex * 2 + 1] = b;
|
|
220
|
+
ngramIndex += 1;
|
|
221
|
+
start[slot] = poolSize;
|
|
222
|
+
const entryLength = (single[a] < 0 ? length[a] : 1) + (single[b] < 0 ? length[b] : 1);
|
|
223
|
+
length[slot] = entryLength;
|
|
224
|
+
poolSize += entryLength;
|
|
225
|
+
}
|
|
226
|
+
}
|
|
227
|
+
readNgramReferences(ngramCount - dictSize + dict1AtomCount, dictSize + dict2AtomCount);
|
|
228
|
+
readNgramReferences(dictSize - dict1AtomCount, dict1AtomCount);
|
|
229
|
+
const pool = new Uint16Array(poolSize);
|
|
230
|
+
let write = 0;
|
|
231
|
+
for (let index = 0; index < ngramIndex; index++) for (let half = 0; half < 2; half++) {
|
|
232
|
+
const source = references[index * 2 + half];
|
|
233
|
+
const value = single[source];
|
|
234
|
+
if (value < 0) {
|
|
235
|
+
let read = start[source];
|
|
236
|
+
const readEnd = read + length[source];
|
|
237
|
+
while (read < readEnd) pool[write++] = pool[read++];
|
|
238
|
+
} else pool[write++] = value;
|
|
239
|
+
}
|
|
240
|
+
const out = new Uint16Array(resultLength);
|
|
241
|
+
let outIndex = 0;
|
|
242
|
+
while (pos < inputLength) {
|
|
243
|
+
let slot = BASE91_INVERSE[input.charCodeAt(pos++)];
|
|
244
|
+
if (slot >= dictSize) slot = slot * base - twoCharBias + BASE91_INVERSE[input.charCodeAt(pos++)];
|
|
245
|
+
const value = single[slot];
|
|
246
|
+
if (value < 0) {
|
|
247
|
+
let read = start[slot];
|
|
248
|
+
const readEnd = read + length[slot];
|
|
249
|
+
while (read < readEnd) out[outIndex++] = pool[read++];
|
|
250
|
+
} else out[outIndex++] = value;
|
|
97
251
|
}
|
|
98
252
|
return out;
|
|
99
253
|
}
|
|
100
254
|
//#endregion
|
|
101
255
|
//#region node_modules/entities/dist/generated/decode-data-html.js
|
|
102
256
|
/** Packed HTML decode trie data. */
|
|
103
|
-
var htmlDecodeTree = /* #__PURE__ */ decodeBase64("QR08ALkAAgH6AYsDNQR2BO0EPgXZBQEGLAbdBxMISQrvCmQLfQurDKQNLw4fD4YPpA+6D/IPAAAAAAAAAAAAAAAAKhBMEY8TmxUWF2EYLBkxGuAa3RsJHDscWR8YIC8jSCSIJcMl6ie3Ku8rEC0CLjoupS7kLgAIRU1hYmNmZ2xtbm9wcnN0dVQAWgBeAGUAaQBzAHcAfgCBAIQAhwCSAJoAoACsALMAbABpAGcAO4DGAMZAUAA7gCYAJkBjAHUAdABlADuAwQDBQHIiZXZlAAJhAAFpeW0AcgByAGMAO4DCAMJAEGRyAADgNdgE3XIAYQB2AGUAO4DAAMBA8CFoYZFj4SFjcgBhZAAAoFMqAAFncIsAjgBvAG4ABGFmAADgNdg43fAlbHlGdW5jdGlvbgCgYSBpAG4AZwA7gMUAxUAAAWNzpACoAHIAAOA12Jzc6SFnbgCgVCJpAGwAZABlADuAwwDDQG0AbAA7gMQAxEAABGFjZWZvcnN1xQDYANoA7QDxAPYA+QD8AAABY3LJAM8AayNzbGFzaAAAoBYidgHTANUAAKDnKmUAZAAAoAYjeQARZIABY3J0AOAA5QDrAGEidXNlAACgNSLuI291bGxpcwCgLCFhAJJjcgAA4DXYBd1wAGYAAOA12Dnd5SF2ZdhiYwDyAOoAbSJwZXEAAKBOIgAHSE9hY2RlZmhpbG9yc3UXARoBHwE6AVIBVQFiAWQBZgGCAakB6QHtAfIBYwB5ACdkUABZADuAqQCpQIABY3B5ACUBKAE1AfUhdGUGYWmg0iJ0KGFsRGlmZmVyZW50aWFsRAAAoEUhbCJleXMAAKAtIQACYWVpb0EBRAFKAU0B8iFvbgxhZABpAGwAO4DHAMdAcgBjAAhhbiJpbnQAAKAwIm8AdAAKYQABZG5ZAV0BaSJsbGEAuGB0I2VyRG90ALdg8gA5AWkAp2NyImNsZQAAAkRNUFRwAXQBeQF9AW8AdAAAoJkiaSJudXMAAKCWIuwhdXMAoJUiaSJtZXMAAKCXIm8AAAFjc4cBlAFrKndpc2VDb250b3VySW50ZWdyYWwAAKAyImUjQ3VybHkAAAFEUZwBpAFvJXVibGVRdW90ZQAAoB0gdSJvdGUAAKAZIAACbG5wdbABtgHNAdgBbwBuAGWgNyIAoHQqgAFnaXQAvAHBAcUB8iJ1ZW50AKBhIm4AdAAAoC8i7yV1ckludGVncmFsAKAuIgABZnLRAdMBAKACIe8iZHVjdACgECJuLnRlckNsb2Nrd2lzZUNvbnRvdXJJbnRlZ3JhbAAAoDMi7yFzcwCgLypjAHIAAOA12J7ccABDoNMiYQBwAACgTSKABURKU1phY2VmaW9zAAsCEgIVAhgCGwIsAjQCOQI9AnMCfwNvoEUh9CJyYWhkAKARKWMAeQACZGMAeQAFZGMAeQAPZIABZ3JzACECJQIoAuchZXIAoCEgcgAAoKEhaAB2AACg5CoAAWF5MAIzAvIhb24OYRRkbAB0oAciYQCUY3IAAOA12AfdAAFhZkECawIAAWNtRQJnAvIjaXRpY2FsAAJBREdUUAJUAl8CYwJjInV0ZQC0YG8AdAFZAloC2WJiJGxlQWN1dGUA3WJyImF2ZQBgYGkibGRlANxi7yFuZACgxCJmJWVyZW50aWFsRAAAoEYhcAR9AgAAAAAAAIECjgIAABoDZgAA4DXYO91EoagAhQKJAm8AdAAAoNwgcSJ1YWwAAKBQIuIhbGUAA0NETFJVVpkCqAK1Au8C/wIRA28AbgB0AG8AdQByAEkAbgB0AGUAZwByAGEA7ADEAW8AdAKvAgAAAACwAqhgbiNBcnJvdwAAoNMhAAFlb7kC0AJmAHQAgAFBUlQAwQLGAs0CciJyb3cAAKDQIekkZ2h0QXJyb3cAoNQhZQDlACsCbgBnAAABTFLWAugC5SFmdAABQVLcAuECciJyb3cAAKD4J+kkZ2h0QXJyb3cAoPon6SRnaHRBcnJvdwCg+SdpImdodAAAAUFU9gL7AnIicm93AACg0iFlAGUAAKCoInAAQQIGAwAAAAALA3Iicm93AACg0SFvJHduQXJyb3cAAKDVIWUlcnRpY2FsQmFyAACgJSJuAAADQUJMUlRhJAM2AzoDWgNxA3oDciJyb3cAAKGTIUJVLAMwA2EAcgAAoBMpcCNBcnJvdwAAoPUhciJldmUAEWPlIWZ00gJDAwAASwMAAFIDaSVnaHRWZWN0b3IAAKBQKWUkZVZlY3RvcgAAoF4p5SJjdG9yQqC9IWEAcgAAoFYpaSJnaHQA1AFiAwAAaQNlJGVWZWN0b3IAAKBfKeUiY3RvckKgwSFhAHIAAKBXKWUAZQBBoKQiciJyb3cAAKCnIXIAcgBvAPcAtAIAAWN0gwOHA3IA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YwAAoN8i4SFycnCgtiEAoD0pgKIqImJjZG9zACsVMBU6FT4VQRVyImNhcAAAoEgqAAFhdTQVNxVwAACgRipwAACgSipvAHQAAKCNInIAAKBFKgDgKiIA/gACYWxydksVURVuFXMVcgByAG2gtyEAoDwpeQCAAWV2dwBYFWUVaRVxAHACXxUAAAAAYxVyAGUA4wAXFXUA4wAZFWUAZQAAoM4iZSJkZ2UAAKDPImUAbgA7gKQApEBlI2Fycm93AAABbHJ7FX8V5SFmdACgtiFpImdodAAAoLchZQDkAG0VAAFjaYsVkRVvAG4AaQBuAPQAkwFuAHQAAKAxImwiY3R5AACgLSOACUFIYWJjZGVmaGlqbG9yc3R1d3oAuBW7Fb8V1RXgFegV+RUKFhUWHxZUFlcWZRbFFtsW7xb7FgUXChdyAPIAtAJhAHIAAKBlKQACZ2xyc8YVyhXOFdAV5yFlcgCgICDlIXRoAKA4IfIA9QxoAHagECAAoKMiawHZFd4VYSJyb3cAAKAPKWEA4wBfAgABYXnkFecV8iFvbg9hNGQAoUYhYW/tFfQVAAFnciEC8RVyAACgyiF0InNlcQAAoHcqgAFnbG0A/xUCFgUWO4CwALBAdABhALRjcCJ0eXYAAKCxKQABaXIOFhIW8yFodACgfykA4DXYId1hAHIAAAFschsWHRYAoMMhAKDCIYACYWVnc3YAKBauAjYWOhY+Fm0AAKHEIm9zLhY0Fm4AZABzoMQi9SFpdACgZiZhIm1tYQDdY2kAbgAAoPIiAKH3AGlvQxZRFmQAZQAAgfcAO29KFksW90BuI3RpbWVzAACgxyJuAPgAUBZjAHkAUmRjAG8CXhYAAAAAYhZyAG4AAKAeI28AcAAAoA0jgAJscHR1dwBuFnEWdRaSFp4W7CFhciRgZgAA4DXYVd0AotkCZW1wc30WhBaJFo0WcQBkoFAibwB0AACgUSJpIm51cwAAoDgi7CF1cwCgFCLxInVhcmUAoKEiYgBsAGUAYgBhAHIAdwBlAGQAZwDlANcAbgCAAWFkaAClFqoWtBZyAHIAbwD3APUMbwB3AG4AYQByAHIAbwB3APMA8xVhI3Jwb29uAAABbHK8FsAWZQBmAPQAHBZpAGcAaAD0AB4WYgHJFs8WawBhAHIAbwD3AJILbwLUFgAAAADYFnIAbgAAoB8jbwBwAACgDCOAAWNvdADhFukW7BYAAXJ55RboFgDgNdi53FVkbAAAoPYp8iFvaxFhAAFkcvMW9xZvAHQAAKDxImkA5qC/JVsSAAFhaP8WAhdyAPIANQNhAPIA1wvhIm5nbGUAoKYpAAFjaQ4XEBd5AF9k5yJyYXJyAKD/JwAJRGFjZGVmZ2xtbm9wcXJzdHV4MRc4F0YXWxcyBF4XaRd5F40XrBe0F78X2RcVGCEYLRg1GEAYAAFEbzUXgRZvAPQA+BUAAWNzPBdCF3UAdABlADuA6QDpQPQhZXIAoG4qAAJhaW95TRdQF1YXWhfyIW9uG2FyAGOgViI7gOoA6kDsIW9uAKBVIk1kbwB0ABdhAAFEcmIXZhdvAHQAAKBSIgDgNdgi3XKhmipuF3QXYQB2AGUAO4DoAOhAZKCWKm8AdAAAoJgqgKGZKmlscwCAF4UXhxfuInRlcnMAoOcjAKATIWSglSpvAHQAAKCXKoABYXBzAJMXlheiF2MAcgATYXQAeQBzogUinxcAAAAAoRdlAHQAAKAFInAAMaADIDMBqRerFwCgBCAAoAUgAAFnc7AXsRdLYXAAAKACIAABZ3C4F7sXbwBuABlhZgAA4DXYVt2AAWFscwDFF8sXzxdyAHOg1SJsAACg4yl1AHMAAKBxKmkAAKG1A2x21RfYF28AbgC1Y/VjAAJjc3V24BfoF/0XEBgAAWlv5BdWF3IAYwAAoFYiaQLuFwAAAADwF+0ADQThIW50AAFnbPUX+Rd0AHIAAKCWKuUhc3MAoJUqgAFhZWkAAxgGGAoYbABzAD1gcwB0AACgXyJ2AESgYSJEAACgeCrwImFyc2wAoOUpAAFEYRkYHRhvAHQAAKBTInIAcgAAoHEpgAFjZGkAJxgqGO0XcgAAoC8hbwD0AIwCAAFhaDEYMhi3YzuA8ADwQAABbXI5GD0YbAA7gOsA60BvAACgrCCAAWNpcABGGEgYSxhsACFgcwD0ACwEAAFlb08YVxhjAHQAYQB0AGkAbwDuABoEbgBlAG4AdABpAGEAbADlADME4Ql1GAAAgRgAAIMYiBgAAAAAoRilGAAAqhgAALsYvhjRGAAA1xgnGWwAbABpAG4AZwBkAG8AdABzAGUA8QBlF3kARGRtImFsZQAAoEAmgAFpbHIAjRiRGJ0Y7CFpZwCgA/tpApcYAAAAAJoYZwAAoAD7aQBnAACgBPsA4DXYI93sIWlnAKAB++whaWcA4GYAagCAAWFsdACvGLIYthh0AACgbSZpAGcAAKAC+24AcwAAoLElbwBmAJJh8AHCGAAAxhhmAADgNdhX3QABYWvJGMwYbADsAGsEdqDUIgCg2SphI3J0aW50AACgDSoAAWFv2hgiGQABY3PeGB8ZsQPnGP0YBRkSGRUZAAAdGbID7xjyGPQY9xj5GAAA+xg7gL0AvUAAoFMhO4C8ALxAAKBVIQCgWSEAoFshswEBGQAAAxkAoFQhAKBWIbQCCxkOGQAAAAAQGTuAvgC+QACgVyEAoFwhNQAAoFghtgEZGQAAGxkAoFohAKBdITgAAKBeIWwAAKBEIHcAbgAAoCIjYwByAADgNdi73IAIRWFiY2RlZmdpamxub3JzdHYARhlKGVoZXhlmGWkZkhmWGZkZnRmgGa0ZxhnLGc8Z4BkjGmygZyIAoIwqgAFjbXAAUBlTGVgZ9SF0ZfVhbQBhAOSgswM6FgCghipyImV2ZQAfYQABaXliGWUZcgBjAB1hM2RvAHQAIWGAoWUibHFzAMYEcBl6GfGhZSLOBAAAdhlsAGEAbgD0AN8EgKF+KmNkbACBGYQZjBljAACgqSpvAHQAb6CAKmyggioAoIQqZeDbIgD+cwAAoJQqcgAA4DXYJN3noGsirATtIWVsAKA3IWMAeQBTZIChdyJFYWoApxmpGasZAKCSKgCgpSoAoKQqAAJFYWVztBm2Gb0ZwhkAoGkicABwoIoq8iFveACgiipxoIgq8aCIKrUZaQBtAACg5yJwAGYAAOA12FjdYQB2AOUAYwIAAWNp0xnWGXIAAKAKIW0AAKFzImVs3BneGQCgjioAoJAqAIM+ADtjZGxxco0E6xn0GfgZ/BkBGgABY2nvGfEZAKCnKnIAAKB6Km8AdAAAoNci0CFhcgCglSl1ImVzdAAAoHwqgAJhZGVscwAKGvQZFhrVBCAa8AEPGgAAFBpwAHIAbwD4AFkZcgAAoHgpcQAAAWxxxAQbGmwAZQBzAPMASRlpAO0A5AQAAWVuJxouGnIjdG5lcXEAAOBpIgD+xQAsGgAFQWFiY2Vma29zeUAaQxpmGmoabRqDGocalhrCGtMacgDyAMwCAAJpbG1yShpOGlAaVBpyAHMA8ABxD2YAvWBpAGwA9AASBQABZHJYGlsaYwB5AEpkAKGUIWN3YBpkGmkAcgAAoEgpAKCtIWEAcgAAoA8h6SFyYyVhgAFhbHIAcxp7Gn8a8iF0c3WgZSZpAHQAAKBlJuwhaXAAoCYg4yFvbgCguSJyAADgNdgl3XMAAAFld4wakRphInJvdwAAoCUpYSJyb3cAAKAmKYACYW1vcHIAnxqjGqcauhq+GnIAcgAAoP8h9CFodACgOyJrAAABbHKsGrMaZSRmdGFycm93AACgqSHpJGdodGFycm93AKCqIWYAAOA12Fnd4iFhcgCgFSCAAWNsdADIGswa0BpyAADgNdi93GEAcwDoAGka8iFvaydhAAFicNca2xr1IWxsAKBDIOghZW4AoBAg4Qr2GgAA/RoAAAgbExsaGwAAIRs7GwAAAAA+G2IbmRuVG6sbAACyG80b0htjAHUAdABlADuA7QDtQAChYyBpeQEbBhtyAGMAO4DuAO5AOGQAAWN4CxsNG3kANWRjAGwAO4ChAKFAAAFmcssCFhsA4DXYJt1yAGEAdgBlADuA7ADsQIChSCFpbm8AJxsyGzYbAAFpbisbLxtuAHQAAKAMKnQAAKAtIuYhaW4AoNwpdABhAACgKSHsIWlnM2GAAWFvcABDG1sbXhuAAWNndABJG0sbWRtyACthgAFlbHAAcQVRG1UbaQBuAOUAyAVhAHIA9AByBWgAMWFmAACgtyJlAGQAtWEAoggiY2ZvdGkbbRt1G3kb4SFyZQCgBSFpAG4AdKAeImkAZQAAoN0pZABvAPQAWxsAoisiY2VscIEbhRuPG5QbYQBsAACguiIAAWdyiRuNG2UAcgDzACMQ4wCCG2EicmhrAACgFyryIW9kAKA8KgACY2dwdJ8boRukG6gbeQBRZG8AbgAvYWYAAOA12FrdYQC5Y3UAZQBzAHQAO4C/AL9AAAFjabUbuRtyAADgNdi+3G4AAKIIIkVkc3bCG8QbyBvQAwCg+SJvAHQAAKD1Inag9CIAoPMiaaBiIOwhZGUpYesB1hsAANkbYwB5AFZkbAA7gO8A70AAA2NmbW9zdeYb7hvyG/Ub+hsFHAABaXnqG+0bcgBjADVhOWRyAADgNdgn3eEhdGg3YnAAZgAA4DXYW93jAf8bAAADHHIAAOA12L/c8iFjeVhk6yFjeVRkAARhY2ZnaGpvcxUcGhwiHCYcKhwtHDAcNRzwIXBhdqC6A/BjAAFleR4cIRzkIWlsN2E6ZHIAAOA12CjdciJlZW4AOGFjAHkARWRjAHkAXGRwAGYAAOA12FzdYwByAADgNdjA3IALQUJFSGFiY2RlZmdoamxtbm9wcnN0dXYAXhxtHHEcdRx5HN8cBx0dHTwd3B3tHfEdAR4EHh0eLB5FHrwewx7hHgkfPR9LH4ABYXJ0AGQcZxxpHHIA8gBvB/IAxQLhIWlsAKAbKeEhcnIAoA4pZ6BmIgCgiyphAHIAAKBiKWMJjRwAAJAcAACVHAAAAAAAAAAAAACZHJwcAACmHKgcrRwAANIc9SF0ZTph7SJwdHl2AKC0KXIAYQDuAFoG4iFkYbtjZwAAoegnZGyhHKMcAKCRKeUAiwYAoIUqdQBvADuAqwCrQHIAgKOQIWJmaGxwc3QAuhy/HMIcxBzHHMoczhxmoOQhcwAAoB8pcwAAoB0p6wCyGnAAAKCrIWwAAKA5KWkAbQAAoHMpbAAAoKIhAKGrKmFl1hzaHGkAbAAAoBkpc6CtKgDgrSoA/oABYWJyAOUc6RztHHIAcgAAoAwpcgBrAACgcicAAWFr8Rz4HGMAAAFla/Yc9xx7YFtgAAFlc/wc/hwAoIspbAAAAWR1Ax0FHQCgjykAoI0pAAJhZXV5Dh0RHRodHB3yIW9uPmEAAWRpFR0YHWkAbAA8YewAowbiAPccO2QAAmNxcnMkHScdLB05HWEAAKA2KXUAbwDyoBwgqhEAAWR1MB00HeghYXIAoGcpcyJoYXIAAKBLKWgAAKCyIQCiZCJmZ3FzRB1FB5Qdnh10AIACYWhscnQATh1WHWUdbB2NHXIicm93AHSgkCFhAOkAzxxhI3Jwb29uAAABZHVeHWId7yF3bgCgvSFwAACgvCHlJGZ0YXJyb3dzAKDHIWkiZ2h0AIABYWhzAHUdex2DHXIicm93APOglCGdBmEAcgBwAG8AbwBuAPMAzgtxAHUAaQBnAGEAcgByAG8A9wBlGugkcmVldGltZXMAoMsi8aFkIk0HAACaHWwAYQBuAPQAXgcAon0qY2Rnc6YdqR2xHbcdYwAAoKgqbwB0AG+gfypyoIEqAKCDKmXg2iIA/nMAAKCTKoACYWRlZ3MAwB3GHcod1h3ZHXAAcAByAG8A+ACmHG8AdAAAoNYicQAAAWdxzx3SHXQA8gBGB2cAdADyAHQcdADyAFMHaQDtAGMHgAFpbHIA4h3mHeod8yFodACgfClvAG8A8gDKBgDgNdgp3UWgdiIAoJEqYQH1Hf4dcgAAAWR1YB35HWygvCEAoGopbABrAACghCVjAHkAWWQAomoiYWNodAweDx4VHhkecgDyAGsdbwByAG4AZQDyAGAW4SFyZACgaylyAGkAAKD6JQABaW8hHiQe5CFvdEBh9SFzdGGgsCPjIWhlAKCwIwACRWFlczMeNR48HkEeAKBoInAAcKCJKvIhb3gAoIkqcaCHKvGghyo0HmkAbQAAoOYiAARhYm5vcHR3elIeXB5fHoUelh6mHqsetB4AAW5yVh5ZHmcAAKDsJ3IAAKD9IXIA6wCwBmcAgAFsbXIAZh52Hnse5SFmdAABYXKIB2weaQBnAGgAdABhAHIAcgBvAPcAkwfhInBzdG8AoPwnaQBnAGgAdABhAHIAcgBvAPcAmgdwI2Fycm93AAABbHKNHpEeZQBmAPQAxhxpImdodAAAoKwhgAFhZmwAnB6fHqIecgAAoIUpAOA12F3ddQBzAACgLSppIm1lcwAAoDQqYQGvHrMecwB0AACgFyLhAIoOZaHKJbkeRhLuIWdlAKDKJWEAcgBsoCgAdAAAoJMpgAJhY2htdADMHs8e1R7bHt0ecgDyAJ0GbwByAG4AZQDyANYWYQByAGSgyyEAoG0pAKAOIHIAaQAAoL8iAANhY2hpcXTrHu8e1QfzHv0eBh/xIXVvAKA5IHIAAOA12MHcbQDloXIi+h4AAPweAKCNKgCgjyoAAWJ19xwBH28AcqAYIACgGiDyIW9rQmEAhDwAO2NkaGlscXJCBhcfxh0gHyQfKB8sHzEfAAFjaRsfHR8AoKYqcgAAoHkqcgBlAOUAkx3tIWVzAKDJIuEhcnIAoHYpdSJlc3QAAKB7KgABUGk1HzkfYQByAACglillocMlAgdfEnIAAAFkdUIfRx9zImhhcgAAoEop6CFhcgCgZikAAWVuTx9WH3IjdG5lcXEAAOBoIgD+xQBUHwAHRGFjZGVmaGlsbm9wc3VuH3Ifoh+rH68ftx+7H74f5h/uH/MfBwj/HwsgxCFvdACgOiIAAmNscHJ5H30fiR+eH3IAO4CvAK9AAAFldIEfgx8AoEImZaAgJ3MAZQAAoCAnc6CmIXQAbwCAoaYhZGx1AJQfmB+cH28AdwDuAHkDZQBmAPQA6gbwAOkO6yFlcgCgriUAAW95ph+qH+0hbWEAoCkqPGThIXNoAKAUIOElc3VyZWRhbmdsZQCgISJyAADgNdgq3W8AAKAnIYABY2RuAMQfyR/bH3IAbwA7gLUAtUBhoiMi0B8AANMf1x9zAPQAKxFpAHIAAKDwKm8AdAA7gLcAt0B1AHMA4qESIh4TAADjH3WgOCIAoCoqYwHqH+0fcAAAoNsq8gB+GnAAbAB1APMACAgAAWRw9x/7H+UhbHMAoKciZgAA4DXYXt0AAWN0AyAHIHIAAOA12MLc8CFvcwCgPiJsobwDECAVIPQiaW1hcACguCJhAPAAEyAADEdMUlZhYmNkZWZnaGlqbG1vcHJzdHV2dzwgRyBmIG0geSCqILgg2iDeIBEhFSEyIUMhTSFQIZwhnyHSIQAiIyKLIrEivyIUIwABZ3RAIEMgAODZIjgD9uBrItIgBwmAAWVsdABNIF8gYiBmAHQAAAFhclMgWCByInJvdwAAoM0h6SRnaHRhcnJvdwCgziEA4NgiOAP24Goi0iBfCekkZ2h0YXJyb3cAoM8hAAFEZHEgdSDhIXNoAKCvIuEhc2gAoK4igAJiY25wdACCIIYgiSCNIKIgbABhAACgByL1IXRlRGFnAADgICLSIACiSSJFaW9wlSCYIJwgniAA4HAqOANkAADgSyI4A3MASWFyAG8A+AAyCnUAcgBhoG4mbADzoG4mmwjzAa8gAACzIHAAO4CgAKBAbQBwAOXgTiI4AyoJgAJhZW91eQDBIMogzSDWINkg8AHGIAAAyCAAoEMqbwBuAEhh5CFpbEZhbgBnAGSgRyJvAHQAAOBtKjgDcAAAoEIqPWThIXNoAKATIACjYCJBYWRxc3jpIO0g+SD+IAIhDCFyAHIAAKDXIXIAAAFocvIg9SBrAACgJClvoJch9wAGD28AdAAA4FAiOAN1AGkA9gC7CAABZWkGIQohYQByAACgKCntAN8I6SFzdPOgBCLlCHIAAOA12CvdAAJFZXN0/wgcISshLiHxoXEiIiEAABMJ8aFxIgAJAAAnIWwAYQBuAPQAEwlpAO0AGQlyoG8iAKBvIoABQWFwADghOyE/IXIA8gBeIHIAcgAAoK4hYQByAACg8ipzogsiSiEAAAAAxwtkoPwiAKD6ImMAeQBaZIADQUVhZGVzdABcIV8hYiFmIWkhkyGWIXIA8gBXIADgZiI4A3IAcgAAoJohcgAAoCUggKFwImZxcwBwIYQhjiF0AAABYXJ1IXohcgByAG8A9wBlIWkAZwBoAHQAYQByAHIAbwD3AD4h8aFwImAhAACKIWwAYQBuAPQAZwlz4H0qOAMAoG4iaQDtAG0JcqBuImkA5aDqIkUJaQDkADoKAAFwdKMhpyFmAADgNdhf3YCBrAA7aW4AriGvIcchrEBuAIChCSJFZHYAtyG6Ib8hAOD5IjgDbwB0AADg9SI4A+EB1gjEIcYhAKD3IgCg9iJpAHagDCLhAagJzyHRIQCg/iIAoP0igAFhb3IA2CHsIfEhcgCAoSYiYXN0AOAh5SHpIWwAbABlAOwAywhsAADg/SrlIADgAiI4A2wiaW50AACgFCrjoYAi9yEAAPohdQDlAJsJY+CvKjgDZaCAIvEAkwkAAkFhaXQHIgoiFyIeInIA8gBsIHIAcgAAoZshY3cRIhQiAOAzKTgDAOCdITgDZyRodGFycm93AACgmyFyAGkA5aDrIr4JgANjaGltcHF1AC8iPCJHIpwhTSJQIloigKGBImNlcgA2Iv0JOSJ1AOUABgoA4DXYw9zvIXJ0bQKdIQAAAABEImEAcgDhAOEhbQBloEEi8aBEIiYKYQDyAMsIcwB1AAABYnBWIlgi5QDUCeUA3wmAAWJjcABgInMieCKAoYQiRWVzAGci7glqIgDgxSo4A2UAdABl4IIi0iBxAPGgiCJoImMAZaCBIvEA/gmAoYUiRWVzAH8iFgqCIgDgxio4A2UAdABl4IMi0iBxAPGgiSKAIgACZ2lscpIilCKaIpwi7AAMCWwAZABlADuA8QDxQOcAWwlpI2FuZ2xlAAABbHKkIqoi5SFmdGWg6iLxAEUJaSJnaHQAZaDrIvEAvgltoL0DAKEjAGVzuCK8InIAbwAAoBYhcAAAoAcggARESGFkZ2lscnMAziLSItYi2iLeIugi7SICIw8j4SFzaACgrSLhIXJyAKAEKXAAAOBNItIg4SFzaACgrCIAAWV04iLlIgDgZSLSIADgPgDSIG4iZmluAACg3imAAUFldADzIvci+iJyAHIAAKACKQDgZCLSIHLgPADSIGkAZQAA4LQi0iAAAUF0BiMKI3IAcgAAoAMp8iFpZQDgtSLSIGkAbQAA4Dwi0iCAAUFhbgAaIx4jKiNyAHIAAKDWIXIAAAFociMjJiNrAACgIylvoJYh9wD/DuUhYXIAoCcpUxJqFAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAVCMAAF4jaSN/I4IjjSOeI8AUAAAAAKYjwCMAANoj3yMAAO8jHiQvJD8kRCQAAWNzVyNsFHUAdABlADuA8wDzQAABaXlhI2cjcgBjoJoiO4D0APRAPmSAAmFiaW9zAHEjdCN3I3EBeiNzAOgAdhTsIWFjUWF2AACgOCrvIWxkAKC8KewhaWdTYQABY3KFI4kjaQByAACgvykA4DXYLN1vA5QjAAAAAJYjAACcI24A22JhAHYAZQA7gPIA8kAAoMEpAAFibaEjjAphAHIAAKC1KQACYWNpdKwjryO6I70jcgDyAFkUAAFpcrMjtiNyAACgvinvIXNzAKC7KW4A5QDZCgCgwCmAAWFlaQDFI8gjyyNjAHIATWFnAGEAyWOAAWNkbgDRI9Qj1iPyIW9uv2MAoLYpdQDzAHgBcABmAADgNdhg3YABYWVsAOQj5yPrI3IAAKC3KXIAcAAAoLkpdQDzAHwBAKMoImFkaW9zdvkj/CMPJBMkFiQbJHIA8gBeFIChXSplZm0AAyQJJAwkcgBvoDQhZgAAoDQhO4CqAKpAO4C6ALpA5yFvZgCgtiJyAACgVipsIm9wZQAAoFcqAKBbKoABY2xvACMkJSQrJPIACCRhAHMAaAA7gPgA+EBsAACgmCJpAGwBMyQ4JGQAZQA7gPUA9UBlAHMAYaCXInMAAKA2Km0AbAA7gPYA9kDiIWFyAKA9I+EKXiQAAHokAAB8JJQkAACYJKkkAAAAALUkEQsAAPAkAAAAAAQleiUAAIMlcgCAoSUiYXN0AGUkbyQBCwCBtgA7bGokayS2QGwAZQDsABgDaQJ1JAAAAAB4JG0AAKDzKgCg/Sp5AD9kcgCAAmNpbXB0AIUkiCSLJJkSjyRuAHQAJWBvAGQALmBpAGwAAKAwIOUhbmsAoDEgcgAA4DXYLd2AAWltbwCdJKAkpCR2oMYD1WNtAGEA9AD+B24AZQAAoA4m9KHAA64kAAC0JGMjaGZvcmsAAKDUItZjAAFhdbgkxCRuAAABY2u9JMIkawBooA8hAKAOIfYAaRpzAACkKwBhYmNkZW1zdNMkIRPXJNsk4STjJOck6yTjIWlyAKAjKmkAcgAAoCIqAAFvdYsW3yQAoCUqAKByKm4AO4CxALFAaQBtAACgJip3AG8AAKAnKoABaXB1APUk+iT+JO4idGludACgFSpmAADgNdhh3W4AZAA7gKMAo0CApHoiRWFjZWlub3N1ABMlFSUYJRslTCVRJVklSSV1JQCgsypwAACgtyp1AOUAPwtjoK8qgKJ6ImFjZW5zACclLSU0JTYlSSVwAHAAcgBvAPgAFyV1AHIAbAB5AGUA8QA/C/EAOAuAAWFlcwA8JUElRSXwInByb3gAoLkqcQBxAACgtSppAG0AAKDoImkA7QBEC20AZQDzoDIgIguAAUVhcwBDJVclRSXwAEAlgAFkZnAATwtfJXElgAFhbHMAZSVpJW0l7CFhcgCgLiPpIW5lAKASI/UhcmYAoBMjdKAdIu8AWQvyIWVsAKCwIgABY2l9JYElcgAA4DXYxdzIY24iY3NwAACgCCAAA2Zpb3BzdZElKxuVJZolnyWkJXIAAOA12C7dcABmAADgNdhi3XIiaW1lAACgVyBjAHIAAOA12MbcgAFhZW8AqiW6JcAldAAAAWVpryW2JXIAbgBpAG8AbgDzABkFbgB0AACgFipzAHQAZaA/APEACRj0AG0LgApBQkhhYmNkZWZoaWxtbm9wcnN0dXgA4yXyJfYl+iVpJpAmpia9JtUm5ib4JlonaCdxJ3UnnietJ7EnyCfiJ+cngAFhcnQA6SXsJe4lcgDyAJkM8gD6AuEhaWwAoBwpYQByAPIA3BVhAHIAAKBkKYADY2RlbnFydAAGJhAmEyYYJiYmKyZaJgABZXUKJg0mAOA9IjEDdABlAFVhaQDjACAN7SJwdHl2AKCzKWcAgKHpJ2RlbAAgJiImJCYAoJIpAKClKeUA9wt1AG8AO4C7ALtAcgAApZIhYWJjZmhscHN0dz0mQCZFJkcmSiZMJk4mUSZVJlgmcAAAoHUpZqDlIXMAAKAgKQCgMylzAACgHinrALka8ACVHmwAAKBFKWkAbQAAoHQpbAAAoKMhAKCdIQABYWleJmImaQBsAACgGilvAG6gNiJhAGwA8wB2C4ABYWJyAG8mciZ2JnIA8gAvEnIAawAAoHMnAAFha3omgSZjAAABZWt/JoAmfWBdYAABZXOFJocmAKCMKWwAAAFkdYwmjiYAoI4pAKCQKQACYWV1eZcmmiajJqUm8iFvbllhAAFkaZ4moSZpAGwAV2HsAA8M4gCAJkBkAAJjbHFzrSawJrUmuiZhAACgNylkImhhcgAAoGkpdQBvAPKgHSCjAWgAAKCzIYABYWNnAMMm0iaUC2wAgKEcIWlwcwDLJs4migxuAOUAoAxhAHIA9ADaC3QAAKCtJYABaWxyANsm3ybjJvMhaHQAoH0pbwBvAPIANgwA4DXYL90AAWFv6ib1JnIAAAFkde8m8SYAoMEhbKDAIQCgbCl2oMED8WOAAWducwD+Jk4nUCdoAHQAAANhaGxyc3QKJxInISc1Jz0nRydyInJvdwB0oJIhYQDpAFYmYSNycG9vbgAAAWR1GiceJ28AdwDuAPAmcAAAoMAh5SFmdAABYWgnJy0ncgByAG8AdwDzAAkMYQByAHAAbwBvAG4A8wATBGklZ2h0YXJyb3dzAACgySFxAHUAaQBnAGEAcgByAG8A9wBZJugkcmVldGltZXMAoMwiZwDaYmkAbgBnAGQAbwB0AHMAZQDxABwYgAFhaG0AYCdjJ2YncgDyAAkMYQDyABMEAKAPIG8idXN0AGGgsSPjIWhlAKCxI+0haWQAoO4qAAJhYnB0fCeGJ4knmScAAW5ygCeDJ2cAAKDtJ3IAAKD+IXIA6wAcDIABYWZsAI8nkieVJ3IAAKCGKQDgNdhj3XUAcwAAoC4qaSJtZXMAAKA1KgABYXCiJ6gncgBnoCkAdAAAoJQp7yJsaW50AKASKmEAcgDyADwnAAJhY2hxuCe8J6EMwCfxIXVvAKA6IHIAAOA12MfcAAFidYAmxCdvAPKgGSCoAYABaGlyAM4n0ifWJ3IAZQDlAE0n7SFlcwCgyiJpAIChuSVlZmwAXAxjEt4n9CFyaQCgzinsInVoYXIAoGgpAKAeIWENBSgJKA0oSyhVKIYoAACLKLAoAAAAAOMo5ygAABApJCkxKW0pcSmHKaYpAACYKgAAAACxKmMidXRlAFthcQB1AO8ABR+ApHsiRWFjZWlucHN5ABwoHignKCooLygyKEEoRihJKACgtCrwASMoAAAlKACguCpvAG4AYWF1AOUAgw1koLAqaQBsAF9hcgBjAF1hgAFFYXMAOCg6KD0oAKC2KnAAAKC6KmkAbQAAoOki7yJsaW50AKATKmkA7QCIDUFkbwB0AGKixSKRFgAAAABTKACgZiqAA0FhY21zdHgAYChkKG8ocyh1KHkogihyAHIAAKDYIXIAAAFocmkoayjrAJAab6CYIfcAzAd0ADuApwCnQGkAO2D3IWFyAKApKW0AAAFpbn4ozQBuAHUA8wDOAHQAAKA2J3IA7+A12DDdIxkAAmFjb3mRKJUonSisKHIAcAAAoG8mAAFoeZkonChjAHkASWRIZHIAdABtAqUoAAAAAKgoaQDkAFsPYQByAGEA7ABsJDuArQCtQAABZ22zKLsobQBhAAChwwNmdroouijCY4CjPCJkZWdsbnByAMgozCjPKNMo1yjaKN4obwB0AACgairxoEMiCw5FoJ4qAKCgKkWgnSoAoJ8qZQAAoEYi7CF1cwCgJCrhIXJyAKByKWEAcgDyAPwMAAJhZWl07Sj8KAEpCCkAAWxz8Sj4KGwAcwBlAHQAbQDpAH8oaABwAACgMyrwImFyc2wAoOQpAAFkbFoPBSllAACgIyNloKoqc6CsKgDgrCoA/oABZmxwABUpGCkfKfQhY3lMZGKgLwBhoMQpcgAAoD8jZgAA4DXYZN1hAAABZHIoKRcDZQBzAHWgYCZpAHQAAKBgJoABY3N1ADYpRilhKQABYXU6KUApcABzoJMiAOCTIgD+cABzoJQiAOCUIgD+dQAAAWJwSylWKQChjyJlcz4NUCllAHQAZaCPIvEAPw0AoZAiZXNIDVspZQB0AGWgkCLxAEkNAKGhJWFmZilbBHIAZQFrKVwEAKChJWEAcgDyAAMNAAJjZW10dyl7KX8pgilyAADgNdjI3HQAbQDuAM4AaQDsAAYpYQByAOYAVw0AAWFyiimOKXIA5qAGJhESAAFhbpIpoylpImdodAAAAWVwmSmgKXAAcwBpAGwAbwDuANkXaADpAKAkcwCvYIACYmNtbnAArin8KY4NJSooKgCkgiJFZGVtbnByc7wpvinCKcgpzCnUKdgp3CkAoMUqbwB0AACgvSpkoIYibwB0AACgwyr1IWx0AKDBKgABRWXQKdIpAKDLKgCgiiLsIXVzAKC/KuEhcnIAoHkpgAFlaXUA4inxKfQpdAAAoYIiZW7oKewpcQDxoIYivSllAHEA8aCKItEpbQAAoMcqAAFicPgp+ikAoNUqAKDTKmMAgKJ7ImFjZW5zAAcqDSoUKhYqRihwAHAAcgBvAPgAIyh1AHIAbAB5AGUA8QCDDfEAfA2AAWFlcwAcKiIqPShwAHAAcgBvAPgAPChxAPEAOShnAACgaiYApoMiMTIzRWRlaGxtbnBzPCo/KkIqRSpHKlIqWCpjKmcqaypzKncqO4C5ALlAO4CyALJAO4CzALNAAKDGKgABb3NLKk4qdAAAoL4qdQBiAACg2CpkoIcibwB0AACgxCpzAAABb3VdKmAqbAAAoMknYgAAoNcq4SFycgCgeyn1IWx0AKDCKgABRWVvKnEqAKDMKgCgiyLsIXVzAKDAKoABZWl1AH0qjCqPKnQAAKGDImVugyqHKnEA8aCHIkYqZQBxAPGgiyJwKm0AAKDIKgABYnCTKpUqAKDUKgCg1iqAAUFhbgCdKqEqrCpyAHIAAKDZIXIAAAFocqYqqCrrAJUab6CZIfcAxQf3IWFyAKAqKWwAaQBnADuA3wDfQOELzyrZKtwq6SrsKvEqAAD1KjQrAAAAAAAAAAAAAEwrbCsAAHErvSsAAAAAAADRK3IC1CoAAAAA2CrnIWV0AKAWI8RjcgDrAOUKgAFhZXkA4SrkKucq8iFvbmVh5CFpbGNhQmRvAPQAIg5sInJlYwAAoBUjcgAA4DXYMd0AAmVpa2/7KhIrKCsuK/IBACsAAAkrZQAAATRm6g0EK28AcgDlAOsNYQBzorgDECsAAAAAEit5AG0A0WMAAWNuFislK2sAAAFhcxsrIStwAHAAcgBvAPgAFw5pAG0AAKA8InMA8AD9DQABYXMsKyEr8AAXDnIAbgA7gP4A/kDsATgrOyswG2QA5QBnAmUAcwCAgdcAO2JkAEMrRCtJK9dAYaCgInIAAKAxKgCgMCqAAWVwcwBRK1MraSvhAAkh4qKkIlsrXysAAAAAYytvAHQAAKA2I2kAcgAAoPEqb+A12GXdcgBrAACg2irhAHgociJpbWUAAKA0IIABYWlwAHYreSu3K2QA5QC+DYADYWRlbXBzdACFK6MrmiunK6wrsCuzK24iZ2xlAACitSVkbHFykCuUK5ornCvvIXduAKC/JeUhZnRloMMl8QACBwCgXCJpImdodABloLkl8QBdDG8AdAAAoOwlaSJudXMAAKA6KuwhdXMAoDkqYgAAoM0p6SFtZQCgOyrlInppdW0AoOIjgAFjaHQAwivKK80rAAFyecYrySsA4DXYydxGZGMAeQBbZPIhb2tnYQABaW/UK9creAD0ANERaCJlYWQAAAFsct4r5ytlAGYAdABhAHIAcgBvAPcAXQbpJGdodGFycm93AKCgIQAJQUhhYmNkZmdobG1vcHJzdHV3CiwNLBEsHSwnLDEsQCxLLFIsYix6LIQsjyzLLOgs7Sz/LAotcgDyAAkDYQByAACgYykAAWNyFSwbLHUAdABlADuA+gD6QPIACQ1yAOMBIywAACUseQBeZHYAZQBtYQABaXkrLDAscgBjADuA+wD7QENkgAFhYmgANyw6LD0scgDyANEO7CFhY3FhYQDyAOAOAAFpckQsSCzzIWh0AKB+KQDgNdgy3XIAYQB2AGUAO4D5APlAYQFWLF8scgAAAWxyWixcLACgvyEAoL4hbABrAACggCUAAWN0Zix2LG8CbCwAAAAAcyxyAG4AZaAcI3IAAKAcI28AcAAAoA8jcgBpAACg+CUAAWFsfiyBLGMAcgBrYTuAqACoQAABZ3CILIssbwBuAHNhZgAA4DXYZt0AA2FkaGxzdZksniynLLgsuyzFLHIAcgBvAPcACQ1vAHcAbgBhAHIAcgBvAPcA2A5hI3Jwb29uAAABbHKvLLMsZQBmAPQAWyxpAGcAaAD0AF0sdQDzAKYOaQAAocUDaGzBLMIs0mNvAG4AxWPwI2Fycm93cwCgyCGAAWNpdADRLOEs5CxvAtcsAAAAAN4scgBuAGWgHSNyAACgHSNvAHAAAKAOI24AZwBvYXIAaQAAoPklYwByAADgNdjK3IABZGlyAPMs9yz6LG8AdAAAoPAi7CFkZWlhaQBmoLUlAKC0JQABYW0DLQYtcgDyAMosbAA7gPwA/EDhIm5nbGUAoKcpgAdBQkRhY2RlZmxub3Byc3oAJy0qLTAtNC2bLZ0toS2/LcMtxy3TLdgt3C3gLfwtcgDyABADYQByAHag6CoAoOkqYQBzAOgA/gIAAW5yOC08LechcnQAoJwpgANla25wcnN0AJkpSC1NLVQtXi1iLYItYQBwAHAA4QAaHG8AdABoAGkAbgDnAKEXgAFoaXIAoSmzJFotbwBwAPQAdCVooJUh7wD4JgABaXVmLWotZwBtAOEAuygAAWJwbi14LXMjZXRuZXEAceCKIgD+AODLKgD+cyNldG5lcQBx4IsiAP4A4MwqAP4AAWhyhi2KLWUAdADhABIraSNhbmdsZQAAAWxyki2WLeUhZnQAoLIiaSJnaHQAAKCzInkAMmThIXNoAKCiIoABZWxyAKcttC24LWKiKCKuLQAAAACyLWEAcgAAoLsicQAAoFoi7CFpcACg7iIAAWJ0vC1eD2EA8gBfD3IAAOA12DPddAByAOkAlS1zAHUAAAFicM0t0C0A4IIi0iAA4IMi0iBwAGYAAOA12GfdcgBvAPAAWQt0AHIA6QCaLQABY3XkLegtcgAA4DXYy9wAAWJw7C30LW4AAAFFZXUt8S0A4IoiAP5uAAABRWV/LfktAOCLIgD+6SJnemFnAKCaKYADY2Vmb3BycwANLhAuJS4pLiMuLi40LukhcmN1YQABZGkULiEuAAFiZxguHC5hAHIAAKBfKmUAcaAnIgCgWSLlIXJwAKAYIXIAAOA12DTdcABmAADgNdho3WWgQCJhAHQA6ABqD2MAcgAA4DXYzNzjCuQRUC4AAFQuAABYLmIuAAAAAGMubS5wLnQuAAAAAIguki4AAJouJxIqEnQAcgDpAB0ScgAA4DXYNd0AAUFhWy5eLnIA8gDnAnIA8gCTB75jAAFBYWYuaS5yAPIA4AJyAPIAjAdhAPAAeh5pAHMAAKD7IoABZHB0APgReS6DLgABZmx9LoAuAOA12GnddQDzAP8RaQBtAOUABBIAAUFhiy6OLnIA8gDuAnIA8gCaBwABY3GVLgoScgAA4DXYzdwAAXB0nS6hLmwAdQDzACUScgDpACASAARhY2VmaW9zdbEuvC7ELsguzC7PLtQu2S5jAAABdXm2LrsudABlADuA/QD9QE9kAAFpecAuwy5yAGMAd2FLZG4AO4ClAKVAcgAA4DXYNt1jAHkAV2RwAGYAAOA12GrdYwByAADgNdjO3AABY23dLt8ueQBOZGwAO4D/AP9AAAVhY2RlZmhpb3N38y73Lv8uAi8MLxAvEy8YLx0vIi9jInV0ZQB6YQABYXn7Lv4u8iFvbn5hN2RvAHQAfGEAAWV0Bi8KL3QAcgDmAB8QYQC2Y3IAAOA12DfdYwB5ADZk5yJyYXJyAKDdIXAAZgAA4DXYa91jAHIAAOA12M/cAAFqbiYvKC8AoA0gagAAoAwg");
|
|
257
|
+
var htmlDecodeTree = /* #__PURE__ */ decodeTrieDict("!}.&u%}'&}*'~!6*)%&,~!J~!J~%L~y<~!R,~~%Lu~~#GD~~#|)1#%}^%}2%+#.##%##%}&%##%'#%##&%#%#'%#&#%#&#'#%%#&#%##%#)%''%&%#%#'%#%%#%%}%%%#%#&(23#%%#&-%0%('1#(##%#'##+%'*.:1}#%#6-+(%'%%#%%%}#L'2351&('%}&/N'(0(/*-%(%%}#'+&T%7.2}#&%&#%#36/5##%&%%#&#%%#))2%%##%&&'0~!#*+&'%1~!%).'3q?&%'1~!.##%6(~!+%%%(Gw'rT~!E#<nA%#jZ~!H%(~!42##~!*31&~!G%U~#)5~#`3~!J~!Z~%]~%Y~%C~!q~!u~#kz~%#~!6'~!D~!U~!?~#T~!c%~!G#'~%7|~!G~!J~!G&~#pb~(Df}#%}*&}#%##%##%##&#-}&'#'&%#.++}%mI,#,@&(}*%}*'%&##&#%##%}&0}#.},U},%}+%}&%}#%##&}B%(}(%}+%)})%##%#&}&%##%&}<%}>%#%&}*%}(%}9%}/%})%}*%}*%}?&}&%}3%}&*#%})%#%#)}#&#-#+*%E%%'%'#%}#*V##&##I}#&&##%&%#&&Qf%%))w/0+&%#(#.%-''''++++7}>%4'',##1,#%#&%##&#'##&#*#9)%&%}#*}%,#+P(%A&%#'&##wSD',9E00#y#@}(+}&%&>~!#~!X}#*}(&&}(&}(,%}%&#+&}#&}I%#%}%)#(},'%#*}4%%#%}(''}#/##(##),%-##%%)#&}(.}&%#&}%%}*&#%},&&}&%}#%*'#%})%}D&}&%}-&}6&#&}-,%}#%})-(~+`~,=?~I9'9%~!,#%})%})%}@%}?%}(~!?~#<~#pP~#BG~#=1#%K+~#?#~%;)~#A~#mF1~#A'~'X%'~#lR~#N~'N~#r~#m#-~#i'?%#'%~#B%##%,%#~#_%#0%~#]732~,w~2+#:&#%&'0%&>%}#>##F+)#%&&#(+_}4&}-%}(&}@&}O7Fdf0@+/v4}&WU##&/0#&'('B#%}.%}'+#%}#%%&#&%#%##+#&#)#6#'#.},%}c%},%#%##%&#&%#&~#>'*-.%##%##%}#%%}%'~#)D1}#%*&~#_%%'(~#S2%'.}#~#=##*'*-%}&'%'##&&~'E%.#&~#M4}%%##&'%#~#O1##%&#'+~#<B%##%%'%+~#;#@%}#&%#&&%#(~#H1}'%'##&&~#?A}&'~#D#%32}'&&&&~#[}'(#%}'~#;C})&}%%#%~#=&%,3}%'(#%%~#^'#&&)#%'~#Y%-~#d-%'~#^%%&#&&&}#~#b~2t*&'~&(~&@~0%~e~3}%*''0})&}+~!9##-}#%-hD*)1fC#%/&/fB#40~!+#)*4~!+~!K'&:~!/*7~!.#~!H~!L':~%x&~!H#~!*~%1~!I#~!+A~#p'~!F~~#-#~,,(~.Z~!V~%;'B'mq-W~!N~%I%#&&#&}#%},%%}'%}+X#%}#&}(%}'%}<%}#%}%%'}'%}:~![)9@~%>~#UA%-%##&~!C%~!-.9:~!1~!-^2/:a~!y,D*J#-5)/4~%23,~#G~!L1~!0X3`~!2+~!!0-~&E~!W~!o,>Y&]~%cZx_&~#O*9#A#'#+I'%#)~!0B*-5A+-((F&*M#)(-7-5+'-3a5Vi~!Y~!?+[)%3),ERHm~!+:D,VG.+)?fB%%*(%)'(#&80%1'8`K8?`+'Z#&O&'H5#*9)A%%5&3))0%39+.*7#()&&*=4@**L)<'_&*+..;(#*+)./&0#3)%')-8(4ixD(&.}%,('aI:,)%,k2231T)I'#/-W7,/'Q#.'Y24+h')37</31&83##&0#),H(?'&?/1##%#&&#%''-%&&&#(&''&#.-'%#%%(,')*'&#&#'##%(%(#%('#&##%%%%('%#%#%%#%#&%##h>w+v<ayvyvcg.uuhKr}g/v|g>u9i[~>g5uI~=RvdwEg;v/g;uk!!TTSx]@RT!U!#!@VBRUU!'UTe-d0c`e&gSdicedFcrdTaqb.kYcAohdYd@a3e+d}dMdtd.aJ#bqcK`dle/e.e'dwdPdodddjbEb}ogd^ofdpduc6j?l%d{drdqc)d7bacOdQ%T#Y)X.sR[yH>6Vyv3[xwLu>vo'!*.[yBacahoj>6Rew3[xqdZa#!a&#^(X-[yG>6Vyu3[xvg3sEr|g.u/Ri9db0T#^(Xa)!-[y;>6Vylg4wKs{JwNZt3@3r=c4Z([xlg;wKt!cpq's@v7A'*a(a+!-a#[y<3Dt?3Dt'>6Vym3[xmg9rxsNJwLZt4~?r?db1T#`-!(Xa,!0[yS>6Vz%NuQs.g4wKtnJwNZtS@3r>c4Z([y%g;wKtrdga8!a(!#&T*Y-Xa#!a0<or[yc3Dtq>6Vz43[y3JwNZtf@3s!Ju}!%Dti:pm3c_%X#tjB5pkd6q!r]u?voC'*-a.a2!0a&a+[yI3DtI3Ds~3DtH>6Vyw3[xx;:s#~<5pKJwNZtE@3r~d`a)!a2T#a.(!+U.X1[yT3Dt`3Dtv>6Vz&3[y&g9rxwzcxstPu.<rAJwLZtT~?r@dZa%!a.&^*Za(/Reu[ya>6Vz23[y1g3sEr}wkg{NuQRg{ci(U#5@b`~,cg#U(2WnH5wugcRh7dX#T(Y,a'Ta!!a,[yZ<]mj>6Vz,3[y+Pv#5ReZKu+=,%!H}7ABwkaS?Rh:BcW(X#<]mrj:ubv/ARekdg%!(!a.*Ta(Y.X1!#sP>Rl*Dt6[y>>6Vyo3Wf*jOvuumvuRgRJuq*!:9<B@bX~3jVv&v@s@5Re[d/rQt{uAvo&a&a*)a2!,0Wf!3Dt0=Bs'>6Re}3[xy~<5s%JwJZt1~Gs)c;&!#2sJkNuXvzq7rxu,Re8dka4!a8(aEZ+a@Y.X1Xa)[yd=Bs(3DtP>6Vz53[y4cX#X&Re:avRe9~<5s&JwJZtQ~Gs*i^rzvdRg+Jv{%!2sbB@bX}kdga,!Za?&^*T1/!a'Dt+[y6>6Vyf3Wf%g/u;s4hGu6?Rh-JvZ,!c%#&RoX54Rivj7uyvf8RgTKvZB%*!2sGh<vu5Rgq<=C::9bb~#dZ#T&Ta6Y.X*Dt>[y93Wf)coZ(T,6VyifluvRgC@95@B@bX~/hFu34cC#T,k/unq8w8Q5RkUklwQuzunq8w8Q5Rk8d/rJu?v8w9)-&!a0a;a&aIWejg3sEr/h1s<DtDJvyZqY5aws3Jvy!&Wei~Hr1:au5@Bag>23E~5c:Z&bX};kKv?w&unuVu5Rjc;>bs)#~@:Rh.=ay<a]C;b`}Vd6s/t{uAvoaxa()!a,a7%-a#a2Dt,[yF2Wo[>6Vyt3[xuNuPRi&NuPwpi#RoWh?vf8Ri%Jv]!%Ri:KvxD!.'2WeAjZu`q9rxu,Re7woeAg-unLq(qA_/*2Wg_g3u5q^9:4E}/jTrxrzv=Wkkd~0UX#^^Xa-a1a5T&a=U1a'*aEa]!a*aPaA-adok[y54Rn>;:p3~Dp5g9rpsFNvZqjg3uJp4~<5p0Pw;5qlJwNZt*@3p1Pw:5p/Ou!5p2JvG'!6Vye=<qnJvh_[xhg3v,Rh3kOwOw-sDuev/Re^dha[a%!%!a+#Ta7)-5TaCaO!aka!a)sf[yb2>Rl!9ARiq5E}Qg=ucRkBE|oJrJ_@Wk~@Wk{JrJ_@Wk|@WkyJrJ_@Wk}@WkzJvO_[y2g-vMRmiKuYC!)&>Ri;>Ri<@3RkNc](X#@9Rk=g5vuRmhKvDB!+'=]meg3u4Rmgd)#Y'Vz3CARmfd`a+!%T'!+#Ta1Ta6TaM-sTDt9[yA9sYd'%Y#s[[xpj:ueunaXRgEjRq,v-vuqdd2'`#6Rev<32@5>:2<E}5xIo9a*X#Y(;5RePJvD_g>vyRgNj8w)v8<wggs:RgXiZt|vjx,hSq3ah!-(~@:Ro/Ou!5RhWj^v(pyw8unRhUdx-UY#^Ua.a3a70!)%UX1TaDa)'omRiRRhE[y:3Dsz=Br,>6Vyj3[xkg6ruwjcqsrPw;5r*Ku]D'Zt-@3r(~?r.i[vwv]dU1a--U#`a4(g/vsRhPOu!5RhLj:rmu9Wo!~@:wdh@g/vsRiTjXuvvNr}:RhBj^v(pyw8unRn]dz1UYa'a+^Y(!aETZalaRY.Ta?a4[yDJw1!#qLsW>6Vyrfzq-pLflpwRe|Js>%!Dt@3Dt&Jvy_[xs~HrnjMuwpsw'RecKu+D#'!t<~Grl~?rjg5u-x,gwp{ah!-(~@:Rg~Ou!5Rh'jXuvvNr}:Rh#cW#X/c;&!#2sLi[v7u7RgpJv)(!iLrxu,Re6j7v@s@5Se[e7d`aW!Za(a`T.a#!a3!&aDa-!9)Dt_=6s+3[x~~DR|h~DS6avhGun5RkZj3w)v-]mkKunB!&*]kb97R|i<ARk<c:Z(6Vy}Juh'!wziMRoS:F|vkLuauJv5vtvQRh1d='T+Y#VyO~DR|jcF#T'7R|g97R|kJv3'!ay<Rj,Jvh&!:ReXcsa6*a+#a#_aIRf9aLRf?c,Z&Rf5Rf7c.Z&Rf;Rf>cQ#%T'p-Rf8Rf=ct#%'(*!,p,Rf4p+Rf6Rf:Rf<d~'Ua%U*^UYa(!a,-!#a4YaTalaEX0a8a<Weo3Dt/3Dsx=Br93Wen~Dr;~<5p<JwNZt2@3p=Pw:5p;Ou!5r3c7&!#:p>3Ds}KvGB)_6Vyk2sM=<r7x'eovA(!hFu1ARf}cV#X&@r5j6rvwQa^Rf3c=Za'wkghJv__g;unRggA53B9=b^}%j6uduo5Jq;!(hIv%2Re`Ou4ARe_e%a#^^^Xa&!a*a2!&a6YaP!*ad!#a:aE/5Rn?[y@>6Vyp;:pE~DrY~<5pBJwNZt8@3pCh=rt3rWPw:5pAJup_[xoNuPpF9c!#'45pD5ARn)d8#X'X*3@rU72s]h>v<<sSjJpqvewOJq/(!hNw'5ReBk0s2u3w/w'5ReE5@Jq.!a+JQ!&WeU23d(#Y&RjG5]jBk!u7w&u0udARjEe#+^^^Ub#!a2/a`Z(agT1!a-a;|@TaG!aS[yV=Re~fow'RguNuPRe?bz#'>RoUWeL>:Cbb|?JwPZtVg6ruRmzJvD'!6Vz(g/vmRh~Jvy_[y(g9voRgyx*cy(#2>Ri2B9b]~9kIw9u7rluJu3Rg]dI#a%UY'@=p%CAx.gQZ&RhwwygtRm{x5g_Z'+ABqR9Woa=Bp&dV#^*Xa'!&@o{g4v]Rk;Jv{!%Rk[wkkiA5RkiwwfUB=x,fUuqC&*!>RfTg8v0RfV~ARfSd;rJsAuAv9wR'ae+/aO!a@aza/a#[yQ@Wg!2Wemg3sEr0JvB_g>uvReWg2v+Re=KupB_+[y!2AbY~-~Hr2AJwD!(h<~El>h<~El?Kun@+_:9b`}Kg-v/Ri3g;vtwyk_9]k_d=&T#*U.6qh@Ab`|K9:H|CJv[!&3Dtex'fDwC%!Rf[9WlMd[(^X,!a%Z06Vz!@WgBg=v~Rgvg,QRe@awd,#Y+jTv|Q~EfWj]uNr|~FRfXdy#Y&^Ua%!aO.!(a)Ua;=!a@aKap!a-,a!Ta]a[rSa]p?[y82sK=Bq~;:p:~<5p8Pw:5p7d'#Y'Wf(;RnRi[u4w&RgJJvG'!6Vyh=<r#ijuuv/sIKuYD'ZtG@3p9~Gr&d2#`(g<vtRgFj`u5w&rqpxRf2CJuY!+:wfnTOu!5Rg}jNs1ucv&RfwJvA!&3@q|BDcC#T,k/unq8w8Q5RkTklwQuzunq8w8Q5Rk9dga#!a'!a=#a0!:+Tb*b@aO.a4!aba8aFJv^}?!VyR~Dr<g;u%Rn.~<5p[x'e`wNZtR@3p]Pw:5pZhNvjBp.woe_g5u-r4JwF!%DtO3:ooc7&!#:p^3DtpLuGw(!+%)Dtk6Vz#2sd=<r8d'#Y([y#<x3gJt`w@!)%}MRiowzikRij=]ilxAf3,U(#B2Rf#g0v-Rm[ck{`U#]giKv3>)!&6Ri154s,KuGB_%@r68r:dJ|t`#X(9<E|u2@H|rx3gJu?w'!+'1Nu7Reg4=H~+9<wxgY95Rm]xLggZ-`(X}U2:Ri4h<uOawRmsJv__5@bb{jbV~3dka#a'a]!,#a+U=a>b6a3b%!/aKa/)!arwve^VyJ;:pR~DpTg3uJpS~<5pOPw;5qmPw:5pNOu!5pQJvG'!6Vyx=<qoJvA!{~Jup!%@qk7Rn/KvyD!}''[xz;>wkh'?Rh,x8gyt`w5D!&),(SgyccRgztJ@3pPB5p#d'(Y#<]mmifubw&RgoJvE&!82s^JvF&!8Rf,ADb]~;x=h'rNu]vK!,%'*0RnORh)4Rh*AqQg-vaRnNg;wHwkh'ba~4cE#Ta*x3gctyw@'!+%RnFRnD<4Rn@hFvK5RnCxWg[#`&a0Ua()`1Rm75Rg[c]%X#qi8Rg^NvdRj>BwzgZauwji7Rm6A4wgg]d1#&(*,.0a#Rm;Rm<Rm=Rm>Rm?Rm@RmARmBe%#^^^Xaea?aC/b+(,!a+a#!a/!>a&Ta<aKbD!2wphBRnk[yPw}hE|.=Br-3Dtm>6Vy~g6urRf.x,hPrNav!%'RnqRo%Ro#Nu;q[Pw;5r+JwNZtM@3r)d'#Y'Weh;xChL#`&RnmRnoKu}>%(!Rne~Bs-;2wjcussJv+'!aYSO}6@B<5?ba~8LrNvj!.%*ROwungw~ng~:9;Ri^>wtnig;wHRnixDh@|(UZ.x1h@|)!#:2<H|*xHn]#-UX'3Ro)z=iT}6ARns=Bwsn_wpnaRncw]aR(#UXa&Ua*a/=]iPd'#Y&Ro'WnXf{QRm2hNvj]nZd`'T~&1`{|`#9b]{}c:'!#Wl{>@=be}]?cl{{U#:5Abb}Jds#^YaF!a*b4a#a3aPa>&Tb!bH!*a_!Eau?/a&RjY<]gj>6Vz*;:pe~DrZg,QRj1JwNZtX@wihspcJvZ&!VyX9WmOJu|!|N2WmHJvh&!]ht~Bpbcn&T(!#RmQ<s7Nu;padH#X'`+WmJ@>RmKCARhnKup=!)&Wf+:RhqNuPpf9c!#'45pd5AwghpARn(Ls@w!%,)!RmP@Wfe<E|IJva!&WmNg8vsRmLd`*.`#Y'Xa!axRn*]hrA8Rhug5s@rXg8u!RmMd8#X'X*3@rV72smdI*#UY&RmICARho~GsgxVgd)Ta'U-Y&Xa!T#RnEWnA@Wffg1uDRi0hFvK5RnBxGnG&#`%owp)@wsf+bX}Ze-*1!a*^^^Ua|!#a.aq&Ya2!a>.a6!a:aO`aJDtL[y`@Wg#>6Vz12@wzoYRoZNuPRi!NuPRhzg=ucRi,@=b`{Yg=ucRi-ACJvB!&Sh[ebSh]ebi`wUuFRm4Jw2_[y0JvB!.<Ju(!&SoG}6Shd}6<Ju(!&SoH}6She}6Kur@._g5vHRieJvx!{L2G{Kx6gd'T#?Rh82Wi5cZ#X(g1w)Rm5dW-Y(Ta#!a)!#aYa=wnfE=su2>>bU{0j9udv:<svj8uQv-7RgHdE%#^'sq9sp=>Bb_{TJv`!&g/r|snj6v(us5d,#Y(56H}[978H}]Jw5!&g1rushJvB!+j;v{u5?zDhd}6}bj;v{u5?zDhe}6}ce*#`(^^^a[aea!=!a6a*aoXb1a.!aAbL!b>,b'aL!aV@Wf|2Wlg3[y/JwNZt^@3piPw:5pgJunZou3@rsJva&!Vy_g<v~Rm#JvG'!6Vz0=<r{Ju{%!:pj@WfsiXuJu3Rm:JvZ&!WfA~Bph@c4Z&Dtwax5rubx(#:awRk1@d,#Y&RfjRfid1#,Y(@Wfp2Wlrg5s@ryKu[@!,'=]ig9wlk?Rk>g5u-rqJvy'!@9RkQcH(T#=>Ri~@<wkj(Wj(KuZB*!&<7rw@9RkRcH(T#=>Ri}@<wkj)Wj)dg(Ta2Xa9X#`-!a*CARhg@@=I}d9x;c~#X%so=<sj>2@@=aybb}XjWv0Q~EfEj3vLv;<d,#Y(56H}`978H}_dgaPaFa'a/!#a3Y0a_a;a|!1(a7-[yE3[xt;:pJNvZrrg3uJrvJwNZt=@3pIh=rt3rxPw:5pGOu!5rpJvG'!6Vys=<rz@c4Z&Dt(ax5rtJvZ!&~BpH@wsfNg-vaRlNci*U#=<wei<F}a5@Jq.!a*JQ!%@qZ23d(#Y&RjH5]jCk!u7w&u0udARjFd/prq=tyvpaEa(a:.!a1aZ(@@=I}:9wpd%=<sX55w_h}@@=I{t=ay<aU@@=I}T=ay<2@@=I})?C9:9au@9Cb]}DP~=x-fAZ(2Wl1=ay<aU@@=I}>5@d##Y+jTv|vV~EfFj]uNpn~FRfGdgaK!Z2&!a8a-Tb({E!acTbM*!a(DtY[yYd'%Y#sl[y*hHvh>Re5x2c{Z}.j4uCvcawRiMd+#X+_x&d!},<5RkX;2Hzw@x,gavfB-!{CcF&T#Roe;RodwWbBg5urRgaKvHC*_6Vz+<4opieuew&Rmq@d]&Y)X,T#X0Rh}<BqP=4qS9:ReMg/ujReNJw0!/<Jui%!bd{kawwnemRelAxUa?a3#*.&UX(Ya+a/RhvRnQ<o}9Wmtd-#Y&RgSRmw9;Rmxay=Rmyg-vaRmuxEhSrNu,v-voC!%(aR.a(a7+1Ro1>Ro5CE{A9b]{@;5x#eO{:g;urRi+KrNA!%(Ro3>Ro79;Ri_Ku@>{;&!x%gX|{KunA_+g5QRj/g3u5Rj#g>uERj%wio/xRhS&!,!#^1U}wba{8>>@=be}qC@:D5ba{7Ku+A&!}x?ba}t>>@=be}se(aA^^^Uat!b0#{pa+awUazbGa#aLb9bgaWac'a5TbS=Br!d1#`%scp_Jvl!#rT>Re0JvX&!VyN=H{Fcm#U&:pY=ReaJv2&!]h0=]nUJvG'!6Vy|=<r%JrM_=]h2@Wlud'#)U'Wf'b]{i=]h/Jvh!&~BpWg=v]RnMx+ny#'Nu;pVwjnu=]nwxJnx,T#`&Reqwjnt=]nvieu9vrRjLLuYwP(#+!th@wih5pX~Gr'g5v/Rh4KunA'!-CARnP@wwiN:Rm_9x'cvw>!|l=<saKvAA!0&3@q}>w^e1bp#&Re2Re3BDx7gH#T|f5H|eKuZ>!%(:qNAH{]Jv6!+3B2B9=b^{X<5<B92:E{ZLvhwA(a;a%!igQuyRmad+#Y}m@3Rh5d8#X'X*:AqUAHzmaxwbh<aXRnVcF}RT#Nw&cj#U(BWnug/vsRntdka)(a3+.Zb7aYYan1!bVa@Xa}[y^@b[{G=H{+hFu73Rj&Pv#5ReQcK%T#sig1v{Rj'Ku+D#'!t]~Grm~?rkKuMB!01d5#`'Vy.ta3Dtu~Hroc8#'{^45s85AwZbP&!#Rn!wghxWn#KvEA!)&2RlA2RlBx:h|#(T,=]j09Wobz>x]z/@awRoTd+#Y(az]hFhCrm4d,#Y+jTv|Q~EfMj]uNr|~FRfOdCa!Xa9_X#@<plJvf!%b`{(9;Rgwc;.!#2x7cw#T|UDb]|T5Ju={(!=@E{&Jv)&!Ab`{'awJvf!~*>>@=be{#KuY>!+&4Ezyi[ugv&RjIdea+T)#UXa&T-T&a!Rh9auRmW=]kLg5vuRn+g3u4Rn-Ow6ARn,hHus5xNk?#UX(U~)/g8v0RkD~AwkkF?Ri.OuNBwkkA?Ri/d|a2`a*^UYa.!aBTZaTa'Xa;!(!2!-a#b2[yC>6Vyq3[xr2Wi?g1rusVh%s?DtF~<5rbJs;%!DtBfswKtCj[uvuSsEu3RgVx3o:u+wN'*Zt;@3rd~Grh~?rfg8w)Lq)qE&-a%!>bI|`jWv0vV~EfCjTv|vV~Ef@j]uNpn~FRfBcK#T']gWNu7x,k7q4ai(0!hHv8<RhmkMu9vrsBuev/RhlCJvB!,g<v{wchh~@:Rhji[vrv{wchi~@:RhkdS&a5UY#Ta!RgPwwiI5BwciI~@:Rh`x'iJvj'!5]iJPu8Bwch]~@:Rhach)U#h3rp]gLh@t|Ax,hTq3ah!-(~@:Ro0Ou!5RhXj^v(pyw8unRhVd|)`,^UYas!a?/a2Z'a^Ta{Tb7Ta(a#!a,Wf&9sZ3DtAadamov=Bqt3[xig8vsRm~>waiL2b`{QJv*_Ouv2qgj<v]v2BqfdR'X*X#Y-@3qr~Gqv~?p6hHv-]glPup5Lq+q?_%*b_{qF{n9b^{rOu4ARhpKvCD!+&~Bqp:5Dbb}nwoiKl&unuTuBv]v+ueunaXRf0=Jvh!0nKufu8v1w&w7q%w&uHrz:Rgnj5w,uxDJq/(!hNw'5ReCk0s2u3w/w'5ReFd>Za&!*UaA=<wkgsRnSJv^!%Refifw3vyRgOKu_B'!,<]gkiiu:w&Rh<=C@a^<B57@2F{[<B5@aW:=3away9A5aW=<B=C@a^<B57@2F{Ie-#`(^^^bCara.b8aza6!/bZ,!adTbnTbOb+aFaS!aAT9@Wf~2Wli3Dtl2@d,#Y&RfnRfmJwJZtN~GqyJva&!VyMg<v~Rm%iXuJu3Rm9Jv[_=]ih9wlkDRkCd1#`(@Wg>2Wls3cH#T(@<Rj*=>Ri|b~'#23s9h<~El.d'#Y&Dtxi^rzvdRl#d*#U%(o|B2s`hJwSaxRmDKv4B&!1:Rmdd5#`'Vx}to~Hq{x'f1v3(!BA5ba|bJv_&!Wfug1v]ReIdO+U/Y#&G}-8wze=Rh{g1v]ReHg/uQRf/by#)ibQwERl/cH#T(@<Rj+=>Ri{cNu+vlax-!(#a0qa9<Rii2;;bU{H;x<i=&X#Rk`<4wwi=C9H~8xAI(Y#<azRi@45wXI<B9;5bb~7dL(X#Xa(+!aL6Vy{g5QqOau:5au2@ay547EzbxOcU(UX-T#Ta#:Cbb|A?wjh/b_|SOw6ARgtihr}u7Rhy<d1#T)X1@@=I|~=ay<2@@=aybb}Sj3vLv;<d,#Y(56H}A978H}@dGpvs@uAu`vcw9*!aFa+ai%(b!aXa8.a?a[ozWey=sU2@G}Nch&U#Rf_WexKu+D#'!t:~Gr`~?r^j]uNr|~FRg*j^psurwJt|RmcKv)@&!)7Rkv~Br[@wxfO:Rl3co#U'6Rezj_q#vIuavjRltwzeyh@vr5JqD0!>aY?C9:9au@9Cb]}9cl#U*5;5<H||jbuus1ucv&Rfvg1v~d/pppzqFr^a--a~!aMat1(hFv;Wiz@@=Izoj5uuv-7Rix~Cw`fk2WlVcZ#X,k)u3vWs@u2]ktg;wEx'fBq(_2Wg/jTv|vV~EfoJv]!15x'hzqG!(P~EfU~CRl_j6v(us5x4i-#T(2WmZ?C2F|d>Kq<aj1!*jTqIsBv=Wl`~Cw`fi2WlWj`v0u*~>RlR=c>Z,k#u3vWs@u2]kr<c1Z+jTqIsBv=Wla~Cw`fm2WlXdmb3!a{(arZa`bkTa%TbQTa-a9+c'!aM!/[yL=Bqug.w'RifhFvyDRj.g>vgwyk^9]k^Jv3_@WfbAARkhJw2_[x|JvB_wkoIRoKwkoJRoLd'(Y#<]gm=<9<H|yd'%_X#skDtb3awwqkgNulRkgdB#^',9:p'hJwSaxRmEBwVb8@4=H|qLu+w50&!)@3qs~?pU>Awwn;;Rn=c:Z'ARn<=<qwKvC@!/&~BqqJv6!&]eVb^z^xRge'/a%+^`#Sge}6<4Rn3=]n0Pw2>Rn8Jw0!&>Rn:>Rn6cY#a7+!a&=<wkaNw~h3z_c5Z{=wjh#=]nLKv^D!&)Vyz=bW|swYb<WetcG#T(2wxa@qVx@gD#Y&b^|V5JwG&!5bb|pg/w&RgD@x=kHs=uAvn!a%%/'+RmSRh694Ro`g-vaRmRhHv-]mlxCcS#`&ba~.5cD#Ta)P~=d,#Y(56H{>978H{Dd_#{2^Y%_+qbbb{6g3sERhsbU{?dfa.,`a(Xa<!aiX#(55RiG54RiHcI#T'WiU3RiVNvdwtfcRlKNvdd,#Y&RlHRlExQgf.1*^T'X#Sgf}6Wn4=]hfPrk>Rn7Jw0!&>Rn5>Rn9Lunw?&a2!,5<oq@@wqfdRlJj5Q~=d,#Y(~ARfcOuN]fdDKw;ay(}i!547E}j?cI#T(@5bV}iCbV}hdv(^^Tb?a40,b##Tbo!a*bR!a<b|a/!aKai!aU[yK=]o^g:v>ReGJwPZtK<7Rh+h<~El,Pv#5ReR@awwxjCg,ulRjDJv6&!]j!z?aQeeg>w=Sh<eeJw;!&axEzOg,Qosc!#*:wkeJ]eJ>x'h-u(!%Ro.w~h.zPdNZ(X,Ya![x{;9ReY;wkgxRiF:x?ap#Y&RmUg<s2Rkod]+UY0TZ'!a&A9sw<=bczLNvuw{gqzNhJwSaxRmCKuLay!#&s_Rf-55b^{uJvZa!!c%#(55Ri654wmiu5RiuawLu,vp!+}^%b_}Y9;wkgxba}o>A9:=b^}zKuh=a''!3awRk3c*'!#aHRk6c+Z&Rk5Rk4Jv)&!awRjSawd9*`#0?C2@EzMj8u<uJ5RmbjQrquJu3x,k>uq@_+=ayb^|W~ARkEOuN]k@7dhzV^X/X&a-#zRzSb`zXcJzTT#2WkVKvDBzW!%FzY9;5bbzWjQrquJu3Jw3%!b`zU=ayb^zQd:#X(T-a!6Vyywxh}=b]{Jg=u1RiAdGp~qHtzv!w(wA+a+a;<!aJaYai'anasb(=azRmV:Cbb{MLq2vb!%')RjuRjrRjtRjqx3jnqCw3!%')Rk(Rk+Rk&Rk)Lq2vb!%')Rj{RjxRjzRjwLq2vb!%')RjsRjpRjfRjex3jcqCw3!%')Rk'Rk*RjkRjl9<CbbzfOu4ARhxLq2vb!%')RjyRjvRjhRjgx=joq*uKvb!%')+-Rk.Rk%Rj~Rk-Rk#Rj}x=jdq*uKvb!%')+-Rk,Rk!Rj|RjmRjjRjidAq&qKs@uAv8Aa.'*-a@a&0!aM@a5[y73Dsy3Ds|3Dt):wxgI2sHJwJZt.~Gqxwsf0ikrzt}Rl0Jvy_[xj~HqzKv_A|D!&WfP8axRoVcf,U#k(v]v+ueunaXRf1Ju}'!g8u#Ri=jQw!sCunLprq>!,')~<5qeGzq9F{W=c##%s5au:5aU3CBE|;d4#X(D!a&6Vygx(b;#(=]ed?C2F{N<capoq2r[a&!aPa9,'Pw;5s:@@=I|,55w_h|@@=IzcP~=x'fCqB_2Wl2>aU@@=I|1OuNBc1Z+jTqIsBv=Wlc~Cw`fl2WlZ~AcTa%!Z+jTqIsBv=Wlb~Cw`fh2WlYk+uNqJsBv=WlSg,u3dca3#UXaMYa)TaB-=cM|7T#<bI}l5@B932:aV2G{BOuNBJq:|M!5Ezt=<B=C@a^<B57@2F{v>cB{/T#=ay<bI{3Jv6!a.6BKq0ah&+!5E}HP~Ef{978BaU@@=Iza<7d#.Y#978BaU@@=IzH~AJq0!(@@=IzG978BaU@@=IzFe,aU*Y&^^^bvJb,b:bFad!a,c2Ta>aL.bo6!a#CbTa'T#Re{2Wlh2@G{yg6t~Ro_NvdRfticuRQRllJv3&!x&c|zs@Jw3!%RflwpfkRlpKuL;%(!Re<@G|C2GzdhIvuBwgjAg-u0RjAKQB%!(GzZ@G|5NuuRl7d='T+Y#Vy[g<v~Rm!==G|>JvA!)@wma=]m1ifuaw&RmnLs@vT'!|/+[y,g:v>ReTJw1!#qX=x!eC{bLu+wT&)ZtZauq_~Graci&U#F|89:r_Lupvq!.)&2RlG8RfaC=x!eF{_h?rpWlmd&'!#X|&]k::xJey#`'T|+<E|&2@H|%dE#(^,g;u.RiEg6vjRiC9xCkA{O|zY#g=ucRmXKs0@!&*@G|m@awRknJuh!,3d(}gY}eJvj!%Rm):Jw3!%Rm+Rm-Ls0w(&!a(a#@b[|6cZ#X'7RkxWgAOu4ARn'dH'U#Y*Vz-Wm'CARm}d]*#a%^a*T'aK!a<9bV{PC=p*Jw4!&SgxcbB5r]idw(wBRmF7xFkt#&`(Rm/Rm8E|!JuY_9:Rl5=wrgr2:bbxd@xXfB(a*#T+!.X0X1Ta/a'T&RlDRfL>RlyARl9b[z[>RfZ:RlL:RfRwlg/ARl;9;RlxKv,A/!%7s69<74=BA5ba{-8Bde#`a<XaKYa1,a'P~=wxfB2bZ}}?C972@@=I}r8@55B9;5bb}G978B2@@=aybb}3j3vLv;<Jw3&!>Rfk=ayb^}4~Ad1#`*@@=aybb{w2@>==<bbz]dx+UY#^UaF!a9!bB'Ya1.!ajXa#%olRhD[y=3Dt#Ov5BrHKuMB%!(Rf^Wep~HrJwkiQjKr|~FRg)Ku+D#'!t5~GrF~?rDdV)UY,Z/_7RkuG{<~BrBg,rlsO:235B@bX}|d?a1!#`(6Vyn5@d##Y+jTv|vV~EfIj]uNpn~FRfH7Lq2vb1!a9-978BaU@@=Iz9978BbU}#~AJq0!(@@=Iz8978BaU@@=Iz7~AJQ|}!978BbU}!JvkaK!AdUa21-U#`a+(g/vsRn~Ou!5RPj:rmu9WhOjXuvvNr}:RhAj^v(pyw8unRn[kPr}p|u7vwv]RiSBd;pppzq@qHQa?(b.!a.a`@.|xa(hFv;Wiyj5uuv-7Riw~Cw`fg2WlU978BbU|wOuNBJqG!(P~EfD~CRlQcZ#X,k)u3vWs@u2]ksg;wEx'f@q1_2Wg.j]uNpn~FRfqJv]!15x'h{qG!(@@=IzK~CRl^j6v(us5x4i,#T(2WmY?C2F{1>Kq<aj1!*jTqIsBv=Wld~Cw`fj2Wl[j`v0u*~>RlT=c>Z,k#u3vWs@u2]kq<c1Z+jTqIsBv=Wle~Cw`fn2Wl]dn1#c(a(b^a2!b/bAT(bj!aDa7bu,a_a{c0!2T0g:v>ReD2@G{42@G{5~DpM~<5rc=Bx6i>{RT#RnI@zCx]y]z:2Jv[!zr5Awyk]9]k]dD(Y+X#6Vz.g=wKtgwhaCwgmTWj2Lu,w%_+/[y-B;b^xeg3u3Rj-2@bX{*KrJ<!+'@Wg(g?QRlC@Jv`!%b[zIwsfII}8JQ_@w|kW|=Jv(%!AqcOuNBJvEzh!bYzjLs@wP#(0!oy@>RkdJwMZtc3Dtd@BcG#T'9bWxg2@2Fznd*#Y+;2x'c}w<zizixNgwa#Z'U+!/!a'!a+w~g~z6wcn{Rn}wcnzRn|5Rh%=]nJg5vuRmvNvdRlvcprJu}w*az*a#!%.a.'Bot9qT]kj@Wg'ay2Gzv@Jv`!%b[zEwsfHI}1;ck#Ux`<Cbbx_Lu+w!a&0*!wko*wwo,So,}6Juqxf!E}PigQuyRm`d3(`#8>Rn%:A5B;bZ~%KvhCa!a2!x>k7#Uxb@b{#xaRk7Jw0!)>wwhlShl}6>wwhmShm}6CJvB!.x'hhvj{!!5Bwkhhbaz}x'hivjz~!5Bwkhibaz|xEhTrNu,v-vpD!a%&/)a3a.,%Ro2t[CE{)@3re9b]{%wjo09:rgc:Z&Ro6=<riifuaw&RmoKrNA!%(Ro4>Ro89;Ri`dSaL'UYzxZb)7Rka3xRhT&!,!#^1U}vbaz{>>@=be}yC@:D5bazzKu+A&!}{?ba}y>>@=be}wxBh[t`u~vJvr!%a!a()a,a0a4RoC=]o;Ju(!%RoGRhdwjh`=]oAg>w#Ro?g5vuRo=NvdRl|Ku]C.!&;RoEJvB!%RoORoMBx'h[v+_?w~h`}~5?w~hd~!xKh]oiptu-utv.vp!#%&a30a@a'a+(a/aOp(o~p!RoDJu(!%RoHRhewjha=]oBNvdRl}g>w#Ro@g5vuRo>c[#X']o<CauRoRAd-#Y':RkpauRoQKu]C.!&;RoFJvB!%RoNRoPBx'h]v+_?w~ha}t5?w~he}ue!/UbhYacXaW^Tc&a;b:a-c/#b&aja1(!cL+!bKbt!bmcRc9aIc?8[yW3Dtt94Rg`Jv}!&SiRMzBhEebShEMNuPRe>x7gL#TzuwjirRipc<Z&>on;>z=h-MSh.Mwqczx'a7vj&!>Re4@=ResJt__NuPRi*NuPRi)j]uNr|~FRfzKrJ>_+@Wfy@Wf]2WocKrJ<!+'@Wg%g/QRl@@Jv`!&awRl<wsfFIzgLu(w*!.*&ShBMwvhIRhI9;RhNx1hK'!#Sn]Mx1hK~0!#:2<H~7cNu+w7D*'1ZtW>Rn1~?rOc:Z&Rn2=<rQ<7wjh&=BSnLMc]#X(6Vz)w[b=a!U#9wzgMc3#&(RgMRitRis<x,gKt`ax!&+SioM=BSilMc3#&(RgKRinRimKurB,!&SiQMzBhDebShDM6BJQ!(P~Efx978B2@@=I}WLrJw!!,a*&@G}O@9wkibRid@@x'fKwC!&SlDMSfLMjUv~Q~EfKKv3@a+!(hFv-]mpx/hYZ(C5RiWz<o/MwkhY?So/M@x,gbvfB*&!SgEM:SoeeehFu3:Rgbda(,^TZa)X/7Sg[eb:2RgI~BrMC@wgkc:wwkcRerx3h(uUvK!&*,SnOM4Sh*MArRg;wHRh(x=h;rJvPwI!a4',a'0@Wg&=BSh/Mg>w=Rh=g3w*wwgGRgGcW(X#;Sg}M2Gzk@Jv`!&awRl=wsfGIz`dKZ*T'Y-:RhR7RhQg5u-p`j6v(us5d,#Y+~Awkia?RicOuNBwkibba}Ld6p~tyu_vbAa'a+!a/'a3aEa8a!>Sh,ebJv{!&Sh@ebSaReb9;SgwebNuPRi(NvdRl)NuPRi'hHu^<Rm^Jvv_@Wl(g;u1Si/ebKu'B&!*Sh?eb@Wl'z@aPeb95Si.ebcpputyvjB)!,&a+0a%ShAMWeK@G}C@WfJ9;RhMwvhH9w{ia}ix,hJvRA1(!zAn[MRhHx1hJ~*!#hFv(BSn[MBJQ!(@@=I~'978B2@@=I}2db.Ua<'X}+T#a0XaG2G}E;wkg|wuh!Rh!x,hZu,@)!&So0MVy)C5RiXACJvB!&5RiY5RiZg8w)cG}*T#2@bU}=KsA>(!a.3wkhZba~(x,h^u(A!&(SoCMRhb5Bz=h[eb?w~hb~6x,h_u(A!&(SoDMRhc5Bz=h]eb?w~hc~6e)aA1T#T,^^^c-bMb&blcPaP(a/!0!bA=b5c@a(!bfbrc#2afwmhARnjwchORnp2Wlf3DtsNvdRl-2@wpa<]m0bx(#:awRk2@Jw3!%RfhwpfgRlnKQB%!(G{V@G|'NuuRl6d='T+Y#VyUg<v~Rl~==G|<Jv+'!aYShC}6@B<5?ba~8@Jw3'!g2QRljhLrpWlOd+#Y'g.w'rIg>w*wgj@g-u0Rj@Lu+wT&)ZtUauq]~GrGci&U#F|39:rELrNvj!.%*RhCwunfw~nf~:9;Ri]>wtnhg;wHRnhx3hDs@v~!/+'@Wfr@9RkSNu&Rlo=@<5GzoKs0@_+@Wl+@awRkmJuh!-3d(}pY#qWJvj!%Rm(:Jw3!%Rm,Rm*de&!1U-U#`)Re;@G|.@9Ri82@wjfvRlq=@<5GzpLvOvr!).&2RlF8Rf`C=x!eE{.Jw3_g2QRlkhLrpWlPde(!#U{s,UXa*Ta'[y'g:v>ReS;x0PZ&RnlRnn~HrKJw1}f!=x!eB|2w]aP(#Xa&a*Ta.Ua2a7=]iOd'#Y&Ro&WnWg;u.RiDg6vjRiBNvdRlzhNvj]nYJuW_2Wm3x)kFze{9d])!a.!,Y01!#&aC!a3RndC=ox~BrC@2b^{pg,rlse7x'ksuq!%Rm.E{xidw(wBRmGx9o+)X#wwo-So-}69:Rl4@xSf@a#XZ'X)X,Ta(/ARl8b[xc>RfY:RlI:RfQwlg.ARl:9;Rlwdn'#^XafaQa1X1TaHTa)@b[{zcZ#X'7RkwWg@Ou4ARn&x)kG#{,g7u/RkGdH'U#Y*Vz'Wm&CARm|bx#(A]gUbUzJj9Q~=d,#Y(56H}l978H{U7d,0#U*2>ABb_xZ978BbU{e~AJQ{g!978BbU{hxMh?ad{oUYZ.x1h?{l!#:2<H{mx3n[t{vl!,&a%3Ro(z=iS}6ARnr=Bwsn^wvn`Rnbd`*T}B0!#^X'BG{c9b]{a>>@=be}F?JvS!&BG{d7BG}(Bde#`a1X,Ya@!a'P~=wxf@2bZ}I56B2@@=aybb}08@55B9;5bb}<j3vLv;<Jw3&!>Rfg=ayb^}&OuNBKuLA!)a!P~=x#fD{f2@>==<bbzl?C972@@=Ix^d6rSu,v7w*C(0a)a6#B+a%!sQ[y?3Dt%3[xn~<5rLOu!5p@Ku+D#'!t7~GrP~?rNKvlaya7'!h+v-5qMg=t|cd,U#5AAaa5Abb{S@52B5@a[@52B5Gx[iXueu;d<#`a(!/549C;ag>23ExY5@Dah89b^~689Jv)!~2b[~1Lv'w(%*!a#bX|aPrmawRe]keu7uhv-q6rxu,q`xTo]/a5aU!bNaDXbi!b-!ao!b<bwA!#5@B932:aV2G|:d-)Y#hJrL>RhG<7@C5<H|_=Cau:5aj5@B932:bJ|ng>vIbs)#?C2F|9jPv0w.vISh-MKvUaz(.!9ABbb|[5;5<H|Eg>unwfh;9:4E|YjQsBt|vjx'hYq3!(?C2F|J:2<BaY?C2F|GOu!5x,g|p{ah!-(?C2F|c9:4E|OjXuvvNr}:Rh&i[w*t|cd+U#jJvsu)vsSn~Mkfrmu9p}u7vwv]So!McW#Xa!ax5@A5aY:5;5<H|>kJv~vYrquJu3x4ib#T)2@SmZM?C2F|Bj:rmu9@xPhI(a*a#U#`a3-5Abb|L~@:RhK9:4E|0@52B5G|#C::aY?C2F|-:2<BaY?C2F|.5Jvk!a)javYrquJu3x4ia#T)2@SmYM?C2F|HAxPhH(!a#U#`a*-5Abb|4~@:RhJ9:4E|R@52B5G|F:2<BaY?C2F|Sc^#Xa2j=Qq5CJvB!-g<v{z;hhM?C2F|Zi[vrv{z;hiM?C2F|XKsA>!a)-g<v{z;h[eb?C2F|]i[vrv{z;h]eb?C2F|^iZu.vix,hZq3ah!.(?C2F|QOu!5ShXM:2<BaY?C2F|P", 13494, 2713, 49, 25, 61);
|
|
104
258
|
//#endregion
|
|
105
259
|
//#region node_modules/entities/dist/internal/bin-trie-flags.js
|
|
106
260
|
/**
|
|
107
261
|
* Bit flags & masks for the binary trie encoding used for entity decoding.
|
|
108
262
|
*
|
|
109
|
-
*
|
|
110
|
-
*
|
|
111
|
-
*
|
|
112
|
-
*
|
|
113
|
-
*
|
|
114
|
-
*
|
|
263
|
+
* The trie is a flat `Uint16Array`. Every node starts with one header word:
|
|
264
|
+
*
|
|
265
|
+
* 15..14 VALUE_LENGTH Number of words the value occupies, +1.
|
|
266
|
+
* 0 = no value; 1 = value inline in bits 12..0;
|
|
267
|
+
* 2/3 = value in the 1/2 words after the header.
|
|
268
|
+
* 13 FLAG13 If VALUE_LENGTH > 0: semicolon required ("strict"
|
|
269
|
+
* entity; `;` is never stored as a branch).
|
|
270
|
+
* If VALUE_LENGTH == 0: this node is a compact run.
|
|
271
|
+
* 12..7 BRANCH_LENGTH Number of branches (or run length for runs).
|
|
272
|
+
* 6..0 JUMP_TABLE Jump-table offset / single-branch char / first
|
|
273
|
+
* run char (see below).
|
|
274
|
+
*
|
|
275
|
+
* Branch data follows the header and any value words. Its shape is selected
|
|
276
|
+
* by (JUMP_TABLE, BRANCH_LENGTH) in the header:
|
|
277
|
+
*
|
|
278
|
+
* Single branch JUMP_TABLE = the only child's char, BRANCH_LENGTH = 0.
|
|
279
|
+
* No branch words; the child node follows immediately.
|
|
280
|
+
* Jump table JUMP_TABLE = first covered char (> 0), BRANCH_LENGTH =
|
|
281
|
+
* table length. One word per covered char: 0 = no branch,
|
|
282
|
+
* otherwise the child's offset from the END of the table,
|
|
283
|
+
* +1 (so 0 stays the no-branch sentinel).
|
|
284
|
+
* Dictionary JUMP_TABLE = 0, BRANCH_LENGTH = number of branches.
|
|
285
|
+
* ceil(n/2) words of sorted keys packed two per word
|
|
286
|
+
* (low byte first), then n pointer words storing the
|
|
287
|
+
* child's offset from the END of the branch data.
|
|
288
|
+
* Compact run VALUE_LENGTH = 0, FLAG13 set. BRANCH_LENGTH = run
|
|
289
|
+
* length (3..63), JUMP_TABLE = first char; remaining run
|
|
290
|
+
* chars packed two per word after the header. The target
|
|
291
|
+
* node follows the packed words immediately.
|
|
292
|
+
*
|
|
293
|
+
* Pointers are end-relative (rather than relative to the pointer's own
|
|
294
|
+
* position) because that makes the common "child encoded right after the
|
|
295
|
+
* branch data" case a small constant, which compresses far better. Offsets
|
|
296
|
+
* to already-encoded (shared) nodes wrap via uint16 modulo arithmetic; the
|
|
297
|
+
* decoder masks navigation results with `& 0xff_ff` to match.
|
|
115
298
|
*/
|
|
116
299
|
var BinTrieFlags;
|
|
117
300
|
(function(BinTrieFlags) {
|
|
@@ -119,9 +302,11 @@ var BinTrieFlags;
|
|
|
119
302
|
BinTrieFlags[BinTrieFlags["FLAG13"] = 8192] = "FLAG13";
|
|
120
303
|
BinTrieFlags[BinTrieFlags["BRANCH_LENGTH"] = 8064] = "BRANCH_LENGTH";
|
|
121
304
|
BinTrieFlags[BinTrieFlags["JUMP_TABLE"] = 127] = "JUMP_TABLE";
|
|
305
|
+
/** Bits 12..0: the inline value of a VALUE_LENGTH = 1 header word. */
|
|
306
|
+
BinTrieFlags[BinTrieFlags["VALUE_MASK"] = 8191] = "VALUE_MASK";
|
|
122
307
|
})(BinTrieFlags || (BinTrieFlags = {}));
|
|
123
308
|
//#endregion
|
|
124
|
-
//#region \0@oxc-project+runtime@0.
|
|
309
|
+
//#region \0@oxc-project+runtime@0.154.0/helpers/esm/typeof.js
|
|
125
310
|
function _typeof(o) {
|
|
126
311
|
"@babel/helpers - typeof";
|
|
127
312
|
return _typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function(o) {
|
|
@@ -131,7 +316,7 @@ function _typeof(o) {
|
|
|
131
316
|
}, _typeof(o);
|
|
132
317
|
}
|
|
133
318
|
//#endregion
|
|
134
|
-
//#region \0@oxc-project+runtime@0.
|
|
319
|
+
//#region \0@oxc-project+runtime@0.154.0/helpers/esm/toPrimitive.js
|
|
135
320
|
function toPrimitive(t, r) {
|
|
136
321
|
if ("object" != _typeof(t) || !t) return t;
|
|
137
322
|
var e = t[Symbol.toPrimitive];
|
|
@@ -143,13 +328,13 @@ function toPrimitive(t, r) {
|
|
|
143
328
|
return ("string" === r ? String : Number)(t);
|
|
144
329
|
}
|
|
145
330
|
//#endregion
|
|
146
|
-
//#region \0@oxc-project+runtime@0.
|
|
331
|
+
//#region \0@oxc-project+runtime@0.154.0/helpers/esm/toPropertyKey.js
|
|
147
332
|
function toPropertyKey(t) {
|
|
148
333
|
var i = toPrimitive(t, "string");
|
|
149
334
|
return "symbol" == _typeof(i) ? i : i + "";
|
|
150
335
|
}
|
|
151
336
|
//#endregion
|
|
152
|
-
//#region \0@oxc-project+runtime@0.
|
|
337
|
+
//#region \0@oxc-project+runtime@0.154.0/helpers/esm/defineProperty.js
|
|
153
338
|
function _defineProperty(e, r, t) {
|
|
154
339
|
return (r = toPropertyKey(r)) in e ? Object.defineProperty(e, r, {
|
|
155
340
|
value: t,
|
|
@@ -162,39 +347,65 @@ function _defineProperty(e, r, t) {
|
|
|
162
347
|
//#region node_modules/entities/dist/decode.js
|
|
163
348
|
var CharCodes;
|
|
164
349
|
(function(CharCodes) {
|
|
350
|
+
CharCodes[CharCodes["AMP"] = 38] = "AMP";
|
|
165
351
|
CharCodes[CharCodes["NUM"] = 35] = "NUM";
|
|
166
352
|
CharCodes[CharCodes["SEMI"] = 59] = "SEMI";
|
|
167
353
|
CharCodes[CharCodes["EQUALS"] = 61] = "EQUALS";
|
|
168
354
|
CharCodes[CharCodes["ZERO"] = 48] = "ZERO";
|
|
169
355
|
CharCodes[CharCodes["NINE"] = 57] = "NINE";
|
|
170
356
|
CharCodes[CharCodes["LOWER_A"] = 97] = "LOWER_A";
|
|
171
|
-
CharCodes[CharCodes["LOWER_F"] = 102] = "LOWER_F";
|
|
172
357
|
CharCodes[CharCodes["LOWER_X"] = 120] = "LOWER_X";
|
|
173
|
-
CharCodes[CharCodes["LOWER_Z"] = 122] = "LOWER_Z";
|
|
174
|
-
CharCodes[CharCodes["UPPER_A"] = 65] = "UPPER_A";
|
|
175
|
-
CharCodes[CharCodes["UPPER_F"] = 70] = "UPPER_F";
|
|
176
|
-
CharCodes[CharCodes["UPPER_Z"] = 90] = "UPPER_Z";
|
|
177
358
|
})(CharCodes || (CharCodes = {}));
|
|
178
359
|
/** Bit that needs to be set to convert an upper case ASCII character to lower case */
|
|
179
360
|
var TO_LOWER_BIT = 32;
|
|
361
|
+
var CONSUMED_SHIFT = 21;
|
|
362
|
+
var CODE_POINT_MASK = 2097151;
|
|
363
|
+
/**
|
|
364
|
+
* Reserved consumed field for counts of at least 2047 characters after `&`.
|
|
365
|
+
* The true count is in `longNumericConsumed`.
|
|
366
|
+
*/
|
|
367
|
+
var CONSUMED_OVERFLOW = 2047;
|
|
368
|
+
/**
|
|
369
|
+
* Side channel for numeric entities of at least 2048 characters including
|
|
370
|
+
* `&`. Set by `parseNumericEntity` when its consumed count reaches the
|
|
371
|
+
* reserved value `CONSUMED_OVERFLOW`; callers read the true count from here.
|
|
372
|
+
* A module-level slot avoids a tuple allocation on the hot path.
|
|
373
|
+
*/
|
|
374
|
+
var longNumericConsumed = 0;
|
|
375
|
+
/**
|
|
376
|
+
* Extract the consumed count from a `parseNumericEntity` packed result,
|
|
377
|
+
* recovering the true length from `longNumericConsumed` when the packed
|
|
378
|
+
* field contains the sentinel. Read it before the next `parseNumericEntity`
|
|
379
|
+
* call, which may overwrite the side channel. This helper owns that protocol.
|
|
380
|
+
* @param packed Packed result of `parseNumericEntity`.
|
|
381
|
+
*/
|
|
382
|
+
function unpackConsumed(packed) {
|
|
383
|
+
const consumed = packed >>> CONSUMED_SHIFT;
|
|
384
|
+
return consumed === CONSUMED_OVERFLOW ? longNumericConsumed : consumed;
|
|
385
|
+
}
|
|
386
|
+
/**
|
|
387
|
+
* Unsigned subtraction trick: (code - lo) >>> 0 wraps negatives to large
|
|
388
|
+
* values, so a single `<=` covers the entire [lo..hi] range check.
|
|
389
|
+
* @param code Code point to check.
|
|
390
|
+
*/
|
|
180
391
|
function isNumber(code) {
|
|
181
|
-
return code
|
|
392
|
+
return code - CharCodes.ZERO >>> 0 <= 9;
|
|
182
393
|
}
|
|
183
394
|
function isHexadecimalCharacter(code) {
|
|
184
|
-
return code
|
|
395
|
+
return (code | TO_LOWER_BIT) - CharCodes.LOWER_A >>> 0 <= 5;
|
|
185
396
|
}
|
|
186
|
-
function
|
|
187
|
-
return code
|
|
397
|
+
function isAlpha(code) {
|
|
398
|
+
return (code | TO_LOWER_BIT) - CharCodes.LOWER_A >>> 0 <= 25;
|
|
188
399
|
}
|
|
189
400
|
/**
|
|
190
401
|
* Checks if the given character is a valid end character for an entity in an attribute.
|
|
191
402
|
*
|
|
192
403
|
* Attribute values that aren't terminated properly aren't parsed, and shouldn't lead to a parser error.
|
|
193
404
|
* See the example in https://html.spec.whatwg.org/multipage/parsing.html#named-character-reference-state
|
|
194
|
-
* @param code Code point to
|
|
405
|
+
* @param code Code point to check.
|
|
195
406
|
*/
|
|
196
407
|
function isEntityInAttributeInvalidEnd(code) {
|
|
197
|
-
return code === CharCodes.EQUALS ||
|
|
408
|
+
return code === CharCodes.EQUALS || isAlpha(code) || isNumber(code);
|
|
198
409
|
}
|
|
199
410
|
var EntityDecoderState;
|
|
200
411
|
(function(EntityDecoderState) {
|
|
@@ -217,355 +428,231 @@ var DecodingMode;
|
|
|
217
428
|
DecodingMode[DecodingMode["Attribute"] = 2] = "Attribute";
|
|
218
429
|
})(DecodingMode || (DecodingMode = {}));
|
|
219
430
|
/**
|
|
220
|
-
* Token decoder with support of writing partial entities.
|
|
221
|
-
*/
|
|
222
|
-
var EntityDecoder = class {
|
|
223
|
-
constructor(decodeTree, emitCodePoint, errors) {
|
|
224
|
-
_defineProperty(this, "decodeTree", void 0);
|
|
225
|
-
_defineProperty(this, "emitCodePoint", void 0);
|
|
226
|
-
_defineProperty(this, "errors", void 0);
|
|
227
|
-
_defineProperty(
|
|
228
|
-
this,
|
|
229
|
-
/** The current state of the decoder. */
|
|
230
|
-
"state",
|
|
231
|
-
EntityDecoderState.EntityStart
|
|
232
|
-
);
|
|
233
|
-
_defineProperty(
|
|
234
|
-
this,
|
|
235
|
-
/** Characters that were consumed while parsing an entity. */
|
|
236
|
-
"consumed",
|
|
237
|
-
1
|
|
238
|
-
);
|
|
239
|
-
_defineProperty(
|
|
240
|
-
this,
|
|
241
|
-
/**
|
|
242
|
-
* The result of the entity.
|
|
243
|
-
*
|
|
244
|
-
* Either the result index of a numeric entity, or the codepoint of a
|
|
245
|
-
* numeric entity.
|
|
246
|
-
*/
|
|
247
|
-
"result",
|
|
248
|
-
0
|
|
249
|
-
);
|
|
250
|
-
_defineProperty(
|
|
251
|
-
this,
|
|
252
|
-
/** The current index in the decode tree. */
|
|
253
|
-
"treeIndex",
|
|
254
|
-
0
|
|
255
|
-
);
|
|
256
|
-
_defineProperty(
|
|
257
|
-
this,
|
|
258
|
-
/** The number of characters that were consumed in excess. */
|
|
259
|
-
"excess",
|
|
260
|
-
1
|
|
261
|
-
);
|
|
262
|
-
_defineProperty(
|
|
263
|
-
this,
|
|
264
|
-
/** The mode in which the decoder is operating. */
|
|
265
|
-
"decodeMode",
|
|
266
|
-
DecodingMode.Strict
|
|
267
|
-
);
|
|
268
|
-
_defineProperty(
|
|
269
|
-
this,
|
|
270
|
-
/** The number of characters that have been consumed in the current run. */
|
|
271
|
-
"runConsumed",
|
|
272
|
-
0
|
|
273
|
-
);
|
|
274
|
-
this.decodeTree = decodeTree;
|
|
275
|
-
this.emitCodePoint = emitCodePoint;
|
|
276
|
-
this.errors = errors;
|
|
277
|
-
}
|
|
278
|
-
/**
|
|
279
|
-
* Resets the instance to make it reusable.
|
|
280
|
-
* @param decodeMode Entity decoding mode to use.
|
|
281
|
-
*/
|
|
282
|
-
startEntity(decodeMode) {
|
|
283
|
-
this.decodeMode = decodeMode;
|
|
284
|
-
this.state = EntityDecoderState.EntityStart;
|
|
285
|
-
this.result = 0;
|
|
286
|
-
this.treeIndex = 0;
|
|
287
|
-
this.excess = 1;
|
|
288
|
-
this.consumed = 1;
|
|
289
|
-
this.runConsumed = 0;
|
|
290
|
-
}
|
|
291
|
-
/**
|
|
292
|
-
* Write an entity to the decoder. This can be called multiple times with partial entities.
|
|
293
|
-
* If the entity is incomplete, the decoder will return -1.
|
|
294
|
-
*
|
|
295
|
-
* Mirrors the implementation of `getDecoder`, but with the ability to stop decoding if the
|
|
296
|
-
* entity is incomplete, and resume when the next string is written.
|
|
297
|
-
* @param input The string containing the entity (or a continuation of the entity).
|
|
298
|
-
* @param offset The offset at which the entity begins. Should be 0 if this is not the first call.
|
|
299
|
-
* @returns The number of characters that were consumed, or -1 if the entity is incomplete.
|
|
300
|
-
*/
|
|
301
|
-
write(input, offset) {
|
|
302
|
-
switch (this.state) {
|
|
303
|
-
case EntityDecoderState.EntityStart:
|
|
304
|
-
if (input.charCodeAt(offset) === CharCodes.NUM) {
|
|
305
|
-
this.state = EntityDecoderState.NumericStart;
|
|
306
|
-
this.consumed += 1;
|
|
307
|
-
return this.stateNumericStart(input, offset + 1);
|
|
308
|
-
}
|
|
309
|
-
this.state = EntityDecoderState.NamedEntity;
|
|
310
|
-
return this.stateNamedEntity(input, offset);
|
|
311
|
-
case EntityDecoderState.NumericStart: return this.stateNumericStart(input, offset);
|
|
312
|
-
case EntityDecoderState.NumericDecimal: return this.stateNumericDecimal(input, offset);
|
|
313
|
-
case EntityDecoderState.NumericHex: return this.stateNumericHex(input, offset);
|
|
314
|
-
case EntityDecoderState.NamedEntity: return this.stateNamedEntity(input, offset);
|
|
315
|
-
}
|
|
316
|
-
}
|
|
317
|
-
/**
|
|
318
|
-
* Switches between the numeric decimal and hexadecimal states.
|
|
319
|
-
*
|
|
320
|
-
* Equivalent to the `Numeric character reference state` in the HTML spec.
|
|
321
|
-
* @param input The string containing the entity (or a continuation of the entity).
|
|
322
|
-
* @param offset The current offset.
|
|
323
|
-
* @returns The number of characters that were consumed, or -1 if the entity is incomplete.
|
|
324
|
-
*/
|
|
325
|
-
stateNumericStart(input, offset) {
|
|
326
|
-
if (offset >= input.length) return -1;
|
|
327
|
-
if ((input.charCodeAt(offset) | TO_LOWER_BIT) === CharCodes.LOWER_X) {
|
|
328
|
-
this.state = EntityDecoderState.NumericHex;
|
|
329
|
-
this.consumed += 1;
|
|
330
|
-
return this.stateNumericHex(input, offset + 1);
|
|
331
|
-
}
|
|
332
|
-
this.state = EntityDecoderState.NumericDecimal;
|
|
333
|
-
return this.stateNumericDecimal(input, offset);
|
|
334
|
-
}
|
|
335
|
-
/**
|
|
336
|
-
* Parses a hexadecimal numeric entity.
|
|
337
|
-
*
|
|
338
|
-
* Equivalent to the `Hexademical character reference state` in the HTML spec.
|
|
339
|
-
* @param input The string containing the entity (or a continuation of the entity).
|
|
340
|
-
* @param offset The current offset.
|
|
341
|
-
* @returns The number of characters that were consumed, or -1 if the entity is incomplete.
|
|
342
|
-
*/
|
|
343
|
-
stateNumericHex(input, offset) {
|
|
344
|
-
while (offset < input.length) {
|
|
345
|
-
const char = input.charCodeAt(offset);
|
|
346
|
-
if (isNumber(char) || isHexadecimalCharacter(char)) {
|
|
347
|
-
const digit = char <= CharCodes.NINE ? char - CharCodes.ZERO : (char | TO_LOWER_BIT) - CharCodes.LOWER_A + 10;
|
|
348
|
-
this.result = this.result * 16 + digit;
|
|
349
|
-
this.consumed++;
|
|
350
|
-
offset++;
|
|
351
|
-
} else return this.emitNumericEntity(char, 3);
|
|
352
|
-
}
|
|
353
|
-
return -1;
|
|
354
|
-
}
|
|
355
|
-
/**
|
|
356
|
-
* Parses a decimal numeric entity.
|
|
357
|
-
*
|
|
358
|
-
* Equivalent to the `Decimal character reference state` in the HTML spec.
|
|
359
|
-
* @param input The string containing the entity (or a continuation of the entity).
|
|
360
|
-
* @param offset The current offset.
|
|
361
|
-
* @returns The number of characters that were consumed, or -1 if the entity is incomplete.
|
|
362
|
-
*/
|
|
363
|
-
stateNumericDecimal(input, offset) {
|
|
364
|
-
while (offset < input.length) {
|
|
365
|
-
const char = input.charCodeAt(offset);
|
|
366
|
-
if (isNumber(char)) {
|
|
367
|
-
this.result = this.result * 10 + (char - CharCodes.ZERO);
|
|
368
|
-
this.consumed++;
|
|
369
|
-
offset++;
|
|
370
|
-
} else return this.emitNumericEntity(char, 2);
|
|
371
|
-
}
|
|
372
|
-
return -1;
|
|
373
|
-
}
|
|
374
|
-
/**
|
|
375
|
-
* Validate and emit a numeric entity.
|
|
376
|
-
*
|
|
377
|
-
* Implements the logic from the `Hexademical character reference start
|
|
378
|
-
* state` and `Numeric character reference end state` in the HTML spec.
|
|
379
|
-
* @param lastCp The last code point of the entity. Used to see if the
|
|
380
|
-
* entity was terminated with a semicolon.
|
|
381
|
-
* @param expectedLength The minimum number of characters that should be
|
|
382
|
-
* consumed. Used to validate that at least one digit
|
|
383
|
-
* was consumed.
|
|
384
|
-
* @returns The number of characters that were consumed.
|
|
385
|
-
*/
|
|
386
|
-
emitNumericEntity(lastCp, expectedLength) {
|
|
387
|
-
if (this.consumed <= expectedLength) {
|
|
388
|
-
var _this$errors;
|
|
389
|
-
(_this$errors = this.errors) === null || _this$errors === void 0 || _this$errors.absenceOfDigitsInNumericCharacterReference(this.consumed);
|
|
390
|
-
return 0;
|
|
391
|
-
}
|
|
392
|
-
if (lastCp === CharCodes.SEMI) this.consumed += 1;
|
|
393
|
-
else if (this.decodeMode === DecodingMode.Strict) return 0;
|
|
394
|
-
this.emitCodePoint(replaceCodePoint(this.result), this.consumed);
|
|
395
|
-
if (this.errors) {
|
|
396
|
-
if (lastCp !== CharCodes.SEMI) this.errors.missingSemicolonAfterCharacterReference();
|
|
397
|
-
this.errors.validateNumericCharacterReference(this.result);
|
|
398
|
-
}
|
|
399
|
-
return this.consumed;
|
|
400
|
-
}
|
|
401
|
-
/**
|
|
402
|
-
* Parses a named entity.
|
|
403
|
-
*
|
|
404
|
-
* Equivalent to the `Named character reference state` in the HTML spec.
|
|
405
|
-
* @param input The string containing the entity (or a continuation of the entity).
|
|
406
|
-
* @param offset The current offset.
|
|
407
|
-
* @returns The number of characters that were consumed, or -1 if the entity is incomplete.
|
|
408
|
-
*/
|
|
409
|
-
stateNamedEntity(input, offset) {
|
|
410
|
-
const { decodeTree } = this;
|
|
411
|
-
let current = decodeTree[this.treeIndex];
|
|
412
|
-
let valueLength = (current & BinTrieFlags.VALUE_LENGTH) >> 14;
|
|
413
|
-
while (offset < input.length) {
|
|
414
|
-
if (valueLength === 0 && (current & BinTrieFlags.FLAG13) !== 0) {
|
|
415
|
-
const runLength = (current & BinTrieFlags.BRANCH_LENGTH) >> 7;
|
|
416
|
-
if (this.runConsumed === 0) {
|
|
417
|
-
const firstChar = current & BinTrieFlags.JUMP_TABLE;
|
|
418
|
-
if (input.charCodeAt(offset) !== firstChar) return this.result === 0 ? 0 : this.emitNotTerminatedNamedEntity();
|
|
419
|
-
offset++;
|
|
420
|
-
this.excess++;
|
|
421
|
-
this.runConsumed++;
|
|
422
|
-
}
|
|
423
|
-
while (this.runConsumed < runLength) {
|
|
424
|
-
if (offset >= input.length) return -1;
|
|
425
|
-
const charIndexInPacked = this.runConsumed - 1;
|
|
426
|
-
const packedWord = decodeTree[this.treeIndex + 1 + (charIndexInPacked >> 1)];
|
|
427
|
-
const expectedChar = charIndexInPacked % 2 === 0 ? packedWord & 255 : packedWord >> 8 & 255;
|
|
428
|
-
if (input.charCodeAt(offset) !== expectedChar) {
|
|
429
|
-
this.runConsumed = 0;
|
|
430
|
-
return this.result === 0 ? 0 : this.emitNotTerminatedNamedEntity();
|
|
431
|
-
}
|
|
432
|
-
offset++;
|
|
433
|
-
this.excess++;
|
|
434
|
-
this.runConsumed++;
|
|
435
|
-
}
|
|
436
|
-
this.runConsumed = 0;
|
|
437
|
-
this.treeIndex += 1 + (runLength >> 1);
|
|
438
|
-
current = decodeTree[this.treeIndex];
|
|
439
|
-
valueLength = (current & BinTrieFlags.VALUE_LENGTH) >> 14;
|
|
440
|
-
}
|
|
441
|
-
if (offset >= input.length) break;
|
|
442
|
-
const char = input.charCodeAt(offset);
|
|
443
|
-
if (char === CharCodes.SEMI && valueLength !== 0 && (current & BinTrieFlags.FLAG13) !== 0) return this.emitNamedEntityData(this.treeIndex, valueLength, this.consumed + this.excess);
|
|
444
|
-
this.treeIndex = determineBranch(decodeTree, current, this.treeIndex + Math.max(1, valueLength), char);
|
|
445
|
-
if (this.treeIndex < 0) return this.result === 0 || this.decodeMode === DecodingMode.Attribute && (valueLength === 0 || isEntityInAttributeInvalidEnd(char)) ? 0 : this.emitNotTerminatedNamedEntity();
|
|
446
|
-
current = decodeTree[this.treeIndex];
|
|
447
|
-
valueLength = (current & BinTrieFlags.VALUE_LENGTH) >> 14;
|
|
448
|
-
if (valueLength !== 0) {
|
|
449
|
-
if (char === CharCodes.SEMI) return this.emitNamedEntityData(this.treeIndex, valueLength, this.consumed + this.excess);
|
|
450
|
-
if (this.decodeMode !== DecodingMode.Strict && (current & BinTrieFlags.FLAG13) === 0) {
|
|
451
|
-
this.result = this.treeIndex;
|
|
452
|
-
this.consumed += this.excess;
|
|
453
|
-
this.excess = 0;
|
|
454
|
-
}
|
|
455
|
-
}
|
|
456
|
-
offset++;
|
|
457
|
-
this.excess++;
|
|
458
|
-
}
|
|
459
|
-
return -1;
|
|
460
|
-
}
|
|
461
|
-
/**
|
|
462
|
-
* Emit a named entity that was not terminated with a semicolon.
|
|
463
|
-
* @returns The number of characters consumed.
|
|
464
|
-
*/
|
|
465
|
-
emitNotTerminatedNamedEntity() {
|
|
466
|
-
var _this$errors2;
|
|
467
|
-
const { result, decodeTree } = this;
|
|
468
|
-
const valueLength = (decodeTree[result] & BinTrieFlags.VALUE_LENGTH) >> 14;
|
|
469
|
-
this.emitNamedEntityData(result, valueLength, this.consumed);
|
|
470
|
-
(_this$errors2 = this.errors) === null || _this$errors2 === void 0 || _this$errors2.missingSemicolonAfterCharacterReference();
|
|
471
|
-
return this.consumed;
|
|
472
|
-
}
|
|
473
|
-
/**
|
|
474
|
-
* Emit a named entity.
|
|
475
|
-
* @param result The index of the entity in the decode tree.
|
|
476
|
-
* @param valueLength The number of bytes in the entity.
|
|
477
|
-
* @param consumed The number of characters consumed.
|
|
478
|
-
* @returns The number of characters consumed.
|
|
479
|
-
*/
|
|
480
|
-
emitNamedEntityData(result, valueLength, consumed) {
|
|
481
|
-
const { decodeTree } = this;
|
|
482
|
-
this.emitCodePoint(valueLength === 1 ? decodeTree[result] & ~(BinTrieFlags.VALUE_LENGTH | BinTrieFlags.FLAG13) : decodeTree[result + 1], consumed);
|
|
483
|
-
if (valueLength === 3) this.emitCodePoint(decodeTree[result + 2], consumed);
|
|
484
|
-
return consumed;
|
|
485
|
-
}
|
|
486
|
-
/**
|
|
487
|
-
* Signal to the parser that the end of the input was reached.
|
|
488
|
-
*
|
|
489
|
-
* Remaining data will be emitted and relevant errors will be produced.
|
|
490
|
-
* @returns The number of characters consumed.
|
|
491
|
-
*/
|
|
492
|
-
end() {
|
|
493
|
-
switch (this.state) {
|
|
494
|
-
case EntityDecoderState.NamedEntity: return this.result !== 0 && (this.decodeMode !== DecodingMode.Attribute || this.result === this.treeIndex) ? this.emitNotTerminatedNamedEntity() : 0;
|
|
495
|
-
case EntityDecoderState.NumericDecimal: return this.emitNumericEntity(0, 2);
|
|
496
|
-
case EntityDecoderState.NumericHex: return this.emitNumericEntity(0, 3);
|
|
497
|
-
case EntityDecoderState.NumericStart:
|
|
498
|
-
var _this$errors3;
|
|
499
|
-
(_this$errors3 = this.errors) === null || _this$errors3 === void 0 || _this$errors3.absenceOfDigitsInNumericCharacterReference(this.consumed);
|
|
500
|
-
return 0;
|
|
501
|
-
case EntityDecoderState.EntityStart: return 0;
|
|
502
|
-
}
|
|
503
|
-
}
|
|
504
|
-
};
|
|
505
|
-
/**
|
|
506
|
-
* Creates a function that decodes entities in a string.
|
|
507
|
-
* @param decodeTree The decode tree.
|
|
508
|
-
* @returns A function that decodes entities in a string.
|
|
509
|
-
*/
|
|
510
|
-
function getDecoder(decodeTree) {
|
|
511
|
-
let returnValue = "";
|
|
512
|
-
const decoder = new EntityDecoder(decodeTree, (data) => returnValue += String.fromCodePoint(data));
|
|
513
|
-
return function decodeWithTrie(input, decodeMode) {
|
|
514
|
-
let lastIndex = 0;
|
|
515
|
-
let offset = 0;
|
|
516
|
-
while ((offset = input.indexOf("&", offset)) >= 0) {
|
|
517
|
-
returnValue += input.slice(lastIndex, offset);
|
|
518
|
-
decoder.startEntity(decodeMode);
|
|
519
|
-
const length = decoder.write(input, offset + 1);
|
|
520
|
-
if (length < 0) {
|
|
521
|
-
lastIndex = offset + decoder.end();
|
|
522
|
-
break;
|
|
523
|
-
}
|
|
524
|
-
lastIndex = offset + length;
|
|
525
|
-
offset = length === 0 ? lastIndex + 1 : lastIndex;
|
|
526
|
-
}
|
|
527
|
-
const result = returnValue + input.slice(lastIndex);
|
|
528
|
-
returnValue = "";
|
|
529
|
-
return result;
|
|
530
|
-
};
|
|
531
|
-
}
|
|
532
|
-
/**
|
|
533
431
|
* Determines the branch of the current node that is taken given the current
|
|
534
432
|
* character. This function is used to traverse the trie.
|
|
433
|
+
*
|
|
434
|
+
* See `BinTrieFlags` for the branch-data layouts handled here.
|
|
535
435
|
* @param decodeTree The trie.
|
|
536
|
-
* @param current The current node.
|
|
537
|
-
* @param nodeIndex Index
|
|
436
|
+
* @param current The current node's header word.
|
|
437
|
+
* @param nodeIndex Index of the node's first branch-data word (the header
|
|
438
|
+
* plus any value words have been skipped by the caller).
|
|
538
439
|
* @param char The current character.
|
|
539
440
|
* @returns The index of the next node, or -1 if no branch is taken.
|
|
540
441
|
*/
|
|
541
442
|
function determineBranch(decodeTree, current, nodeIndex, char) {
|
|
542
443
|
const branchCount = (current & BinTrieFlags.BRANCH_LENGTH) >> 7;
|
|
543
444
|
const jumpOffset = current & BinTrieFlags.JUMP_TABLE;
|
|
544
|
-
if (branchCount === 0) return jumpOffset !== 0 && char === jumpOffset ? nodeIndex : -1;
|
|
545
445
|
if (jumpOffset) {
|
|
546
|
-
|
|
547
|
-
|
|
446
|
+
if (branchCount === 0) return char === jumpOffset ? nodeIndex : -1;
|
|
447
|
+
const slot = char - jumpOffset;
|
|
448
|
+
if (slot >>> 0 >= branchCount) return -1;
|
|
449
|
+
const stored = decodeTree[nodeIndex + slot];
|
|
450
|
+
return stored === 0 ? -1 : nodeIndex + branchCount + stored - 1 & 65535;
|
|
548
451
|
}
|
|
452
|
+
if (branchCount === 0) return -1;
|
|
549
453
|
const packedKeySlots = branchCount + 1 >> 1;
|
|
550
|
-
|
|
551
|
-
let
|
|
552
|
-
|
|
553
|
-
|
|
554
|
-
|
|
555
|
-
if (midKey < char) lo = mid + 1;
|
|
556
|
-
else if (midKey > char) hi = mid - 1;
|
|
557
|
-
else return decodeTree[nodeIndex + packedKeySlots + mid];
|
|
454
|
+
const branchEnd = nodeIndex + packedKeySlots + branchCount;
|
|
455
|
+
for (let index = 0; index < branchCount; index++) {
|
|
456
|
+
const key = decodeTree[nodeIndex + (index >> 1)] >> ((index & 1) << 3) & 255;
|
|
457
|
+
if (key === char) return branchEnd + decodeTree[nodeIndex + packedKeySlots + index] & 65535;
|
|
458
|
+
if (key > char) return -1;
|
|
558
459
|
}
|
|
559
460
|
return -1;
|
|
560
461
|
}
|
|
561
|
-
|
|
462
|
+
/**
|
|
463
|
+
* Read the decoded value from a trie node.
|
|
464
|
+
* @param decodeTree The trie.
|
|
465
|
+
* @param nodeIndex The index of the node.
|
|
466
|
+
* @param valueLength The length of the value (1, 2, or 3).
|
|
467
|
+
* @returns The decoded string.
|
|
468
|
+
*/
|
|
469
|
+
function readTrieValue(decodeTree, nodeIndex, valueLength) {
|
|
470
|
+
if (valueLength === 1) return String.fromCharCode(decodeTree[nodeIndex] & BinTrieFlags.VALUE_MASK);
|
|
471
|
+
if (valueLength === 2) return String.fromCharCode(decodeTree[nodeIndex + 1]);
|
|
472
|
+
return String.fromCharCode(decodeTree[nodeIndex + 1], decodeTree[nodeIndex + 2]);
|
|
473
|
+
}
|
|
474
|
+
/**
|
|
475
|
+
* Parse a numeric entity (`&#DDD;` or `&#xHHH;`).
|
|
476
|
+
*
|
|
477
|
+
* Encodes the result as `(consumed << CONSUMED_SHIFT) | codepoint` (see
|
|
478
|
+
* the packing comment at the top of the file; overlong entities spill
|
|
479
|
+
* their length into `longNumericConsumed`). Returns 0 when no digits were
|
|
480
|
+
* found.
|
|
481
|
+
*
|
|
482
|
+
* This is the sync counterpart of the streaming
|
|
483
|
+
* `EntityDecoder#stateNumericDecimal` / `#stateNumericHex`. Digit parsing
|
|
484
|
+
* matches those methods; only this packed result needs a value clamp.
|
|
485
|
+
* @param input The input string.
|
|
486
|
+
* @param numberStart Index of the `#` character.
|
|
487
|
+
* @param inputLength Cached `input.length`.
|
|
488
|
+
*/
|
|
489
|
+
function parseNumericEntity(input, numberStart, inputLength) {
|
|
490
|
+
let offset = numberStart + 1;
|
|
491
|
+
let cp = 0;
|
|
492
|
+
let digitStart = offset;
|
|
493
|
+
if (offset < inputLength && (input.charCodeAt(offset) | TO_LOWER_BIT) === CharCodes.LOWER_X) {
|
|
494
|
+
offset += 1;
|
|
495
|
+
digitStart = offset;
|
|
496
|
+
while (offset < inputLength) {
|
|
497
|
+
const char = input.charCodeAt(offset);
|
|
498
|
+
if (isNumber(char)) cp = cp * 16 + (char - CharCodes.ZERO);
|
|
499
|
+
else if (isHexadecimalCharacter(char)) cp = cp * 16 + ((char | TO_LOWER_BIT) - CharCodes.LOWER_A + 10);
|
|
500
|
+
else break;
|
|
501
|
+
offset += 1;
|
|
502
|
+
}
|
|
503
|
+
} else while (offset < inputLength) {
|
|
504
|
+
const digit = input.charCodeAt(offset) - CharCodes.ZERO;
|
|
505
|
+
if (digit >>> 0 > 9) break;
|
|
506
|
+
cp = cp * 10 + digit;
|
|
507
|
+
offset += 1;
|
|
508
|
+
}
|
|
509
|
+
if (offset === digitStart) return 0;
|
|
510
|
+
if (offset < inputLength && input.charCodeAt(offset) === CharCodes.SEMI) offset += 1;
|
|
511
|
+
if (cp > 1114111) cp = 1114112;
|
|
512
|
+
let consumed = offset - numberStart;
|
|
513
|
+
if (consumed >= CONSUMED_OVERFLOW) {
|
|
514
|
+
longNumericConsumed = consumed;
|
|
515
|
+
consumed = CONSUMED_OVERFLOW;
|
|
516
|
+
}
|
|
517
|
+
return consumed << CONSUMED_SHIFT | cp;
|
|
518
|
+
}
|
|
519
|
+
/**
|
|
520
|
+
* Decode all entities in `input` using the HTML trie.
|
|
521
|
+
*
|
|
522
|
+
* Hard-wired to `htmlDecodeTree`: the inline root navigation below assumes
|
|
523
|
+
* the HTML root's jump-table shape, so this must not be generalized to
|
|
524
|
+
* other tries (the XML trie's dictionary root would silently match no
|
|
525
|
+
* entities — `decodeXML` has its own hand-coded fast path instead).
|
|
526
|
+
* @param input The string to decode.
|
|
527
|
+
* @param isStrict Only match semicolon-terminated entities.
|
|
528
|
+
* @param isAttribute Whether to apply attribute-specific parsing rules (disallowing certain non-semicolon terminators).
|
|
529
|
+
* @returns The decoded string.
|
|
530
|
+
*/
|
|
531
|
+
function decodeWithTrie(input, isStrict, isAttribute) {
|
|
532
|
+
const decodeTree = htmlDecodeTree;
|
|
533
|
+
let offset = input.indexOf("&");
|
|
534
|
+
if (offset < 0) return input;
|
|
535
|
+
const inputLength = input.length;
|
|
536
|
+
let chunkStart = 0;
|
|
537
|
+
let result = "";
|
|
538
|
+
const root = decodeTree[0];
|
|
539
|
+
const rootJumpOffset = root & BinTrieFlags.JUMP_TABLE;
|
|
540
|
+
const rootBranchCount = (root & BinTrieFlags.BRANCH_LENGTH) >> 7;
|
|
541
|
+
do {
|
|
542
|
+
const entityStart = offset + 1;
|
|
543
|
+
const firstChar = input.charCodeAt(entityStart);
|
|
544
|
+
let consumed;
|
|
545
|
+
let value;
|
|
546
|
+
if (firstChar === CharCodes.NUM) {
|
|
547
|
+
const packed = parseNumericEntity(input, entityStart, inputLength);
|
|
548
|
+
consumed = unpackConsumed(packed);
|
|
549
|
+
if (isStrict && consumed > 0 && input.charCodeAt(entityStart + consumed - 1) !== CharCodes.SEMI) consumed = 0;
|
|
550
|
+
value = consumed === 0 ? "" : codePointToString(packed & CODE_POINT_MASK);
|
|
551
|
+
} else if (isAlpha(firstChar)) {
|
|
552
|
+
consumed = 0;
|
|
553
|
+
value = "";
|
|
554
|
+
const rootSlotIndex = firstChar - rootJumpOffset;
|
|
555
|
+
let nodeIndex;
|
|
556
|
+
if (rootSlotIndex >>> 0 < rootBranchCount) {
|
|
557
|
+
const stored = decodeTree[1 + rootSlotIndex];
|
|
558
|
+
nodeIndex = stored === 0 ? -1 : rootBranchCount + stored & 65535;
|
|
559
|
+
} else nodeIndex = -1;
|
|
560
|
+
let bestNodeIndex = 0;
|
|
561
|
+
let bestValueLength = 0;
|
|
562
|
+
let current = nodeIndex < 0 ? 0 : decodeTree[nodeIndex];
|
|
563
|
+
let index = entityStart + 1;
|
|
564
|
+
trie: while (index < inputLength) {
|
|
565
|
+
while ((current & (BinTrieFlags.VALUE_LENGTH | BinTrieFlags.FLAG13)) === 0 && (current & BinTrieFlags.JUMP_TABLE) !== 0) {
|
|
566
|
+
const jumpOffset = current & BinTrieFlags.JUMP_TABLE;
|
|
567
|
+
const branchCount = (current & BinTrieFlags.BRANCH_LENGTH) >> 7;
|
|
568
|
+
if (branchCount === 0) {
|
|
569
|
+
if (input.charCodeAt(index) !== jumpOffset) break trie;
|
|
570
|
+
nodeIndex += 1;
|
|
571
|
+
} else {
|
|
572
|
+
const slot = input.charCodeAt(index) - jumpOffset;
|
|
573
|
+
if (slot >>> 0 >= branchCount) break trie;
|
|
574
|
+
const stored = decodeTree[nodeIndex + 1 + slot];
|
|
575
|
+
if (stored === 0) break trie;
|
|
576
|
+
nodeIndex = nodeIndex + branchCount + stored & 65535;
|
|
577
|
+
}
|
|
578
|
+
current = decodeTree[nodeIndex];
|
|
579
|
+
index += 1;
|
|
580
|
+
if (index >= inputLength) break trie;
|
|
581
|
+
}
|
|
582
|
+
if ((current & (BinTrieFlags.VALUE_LENGTH | BinTrieFlags.FLAG13)) === BinTrieFlags.FLAG13) {
|
|
583
|
+
const runLength = (current & BinTrieFlags.BRANCH_LENGTH) >> 7;
|
|
584
|
+
if (input.charCodeAt(index) !== (current & BinTrieFlags.JUMP_TABLE)) break;
|
|
585
|
+
index += 1;
|
|
586
|
+
const remaining = runLength - 1;
|
|
587
|
+
let wordIndex = nodeIndex + 1;
|
|
588
|
+
let charIndexInPacked = 0;
|
|
589
|
+
for (; charIndexInPacked + 1 < remaining; charIndexInPacked += 2) {
|
|
590
|
+
const packed = decodeTree[wordIndex];
|
|
591
|
+
if (input.charCodeAt(index) !== (packed & 255)) break trie;
|
|
592
|
+
index += 1;
|
|
593
|
+
if (input.charCodeAt(index) !== (packed >> 8 & 255)) break trie;
|
|
594
|
+
index += 1;
|
|
595
|
+
wordIndex += 1;
|
|
596
|
+
}
|
|
597
|
+
if (charIndexInPacked < remaining) {
|
|
598
|
+
if (input.charCodeAt(index) !== (decodeTree[wordIndex] & 255)) break;
|
|
599
|
+
index += 1;
|
|
600
|
+
}
|
|
601
|
+
nodeIndex += 1 + (runLength >> 1);
|
|
602
|
+
current = decodeTree[nodeIndex];
|
|
603
|
+
continue;
|
|
604
|
+
}
|
|
605
|
+
const valueLength = current >>> 14;
|
|
606
|
+
const char = input.charCodeAt(index);
|
|
607
|
+
if (valueLength !== 0) {
|
|
608
|
+
if (char === CharCodes.SEMI) {
|
|
609
|
+
consumed = index - entityStart + 1;
|
|
610
|
+
value = valueLength === 1 ? String.fromCharCode(current & BinTrieFlags.VALUE_MASK) : readTrieValue(decodeTree, nodeIndex, valueLength);
|
|
611
|
+
break;
|
|
612
|
+
}
|
|
613
|
+
if (!isStrict && (current & BinTrieFlags.FLAG13) === 0) {
|
|
614
|
+
consumed = index - entityStart;
|
|
615
|
+
bestNodeIndex = nodeIndex;
|
|
616
|
+
bestValueLength = valueLength;
|
|
617
|
+
}
|
|
618
|
+
if (valueLength === 1) break;
|
|
619
|
+
}
|
|
620
|
+
const next = determineBranch(decodeTree, current, nodeIndex + (valueLength || 1), char);
|
|
621
|
+
if (next < 0) break;
|
|
622
|
+
nodeIndex = next;
|
|
623
|
+
current = decodeTree[nodeIndex];
|
|
624
|
+
index += 1;
|
|
625
|
+
}
|
|
626
|
+
if (value === "") {
|
|
627
|
+
const finalVL = current >>> 14;
|
|
628
|
+
if (finalVL !== 0 && !isStrict && (current & BinTrieFlags.FLAG13) === 0) {
|
|
629
|
+
consumed = index - entityStart;
|
|
630
|
+
bestNodeIndex = nodeIndex;
|
|
631
|
+
bestValueLength = finalVL;
|
|
632
|
+
}
|
|
633
|
+
if (consumed > 0) value = readTrieValue(decodeTree, bestNodeIndex, bestValueLength);
|
|
634
|
+
}
|
|
635
|
+
} else {
|
|
636
|
+
consumed = 0;
|
|
637
|
+
value = "";
|
|
638
|
+
}
|
|
639
|
+
if (consumed === 0 || isAttribute && firstChar !== CharCodes.NUM && input.charCodeAt(entityStart + consumed - 1) !== CharCodes.SEMI && entityStart + consumed < inputLength && isEntityInAttributeInvalidEnd(input.charCodeAt(entityStart + consumed))) offset = entityStart;
|
|
640
|
+
else {
|
|
641
|
+
if (chunkStart < offset) result += input.slice(chunkStart, offset);
|
|
642
|
+
result += value;
|
|
643
|
+
offset = chunkStart = entityStart + consumed;
|
|
644
|
+
}
|
|
645
|
+
if (input.charCodeAt(offset) !== CharCodes.AMP) offset = input.indexOf("&", offset);
|
|
646
|
+
} while (offset >= 0);
|
|
647
|
+
return result + input.slice(chunkStart);
|
|
648
|
+
}
|
|
562
649
|
/**
|
|
563
650
|
* Decodes an HTML string, requiring all entities to be terminated by a semicolon.
|
|
564
651
|
* @param htmlString The string to decode.
|
|
565
652
|
* @returns The decoded string.
|
|
566
653
|
*/
|
|
567
654
|
function decodeHTMLStrict(htmlString) {
|
|
568
|
-
return
|
|
655
|
+
return decodeWithTrie(htmlString, true, false);
|
|
569
656
|
}
|
|
570
657
|
//#endregion
|
|
571
658
|
//#region src/common/utils.ts
|
|
@@ -1926,12 +2013,14 @@ var StateBlock = class {
|
|
|
1926
2013
|
const s = this.src;
|
|
1927
2014
|
for (let start = 0, pos = 0, indent = 0, offset = 0, len = s.length, indent_found = false; pos < len; pos++) {
|
|
1928
2015
|
const ch = s.charCodeAt(pos);
|
|
1929
|
-
if (!indent_found)
|
|
1930
|
-
|
|
1931
|
-
|
|
1932
|
-
|
|
1933
|
-
|
|
1934
|
-
|
|
2016
|
+
if (!indent_found) {
|
|
2017
|
+
if (isSpace(ch)) {
|
|
2018
|
+
indent++;
|
|
2019
|
+
if (ch === 9) offset += 4 - offset % 4;
|
|
2020
|
+
else offset++;
|
|
2021
|
+
continue;
|
|
2022
|
+
} else indent_found = true;
|
|
2023
|
+
}
|
|
1935
2024
|
if (ch === 10 || pos === len - 1) {
|
|
1936
2025
|
if (ch !== 10) pos++;
|
|
1937
2026
|
this.bMarks.push(start);
|
|
@@ -1998,9 +2087,10 @@ var StateBlock = class {
|
|
|
1998
2087
|
else last = this.eMarks[line];
|
|
1999
2088
|
while (first < last && lineIndent < indent) {
|
|
2000
2089
|
const ch = this.src.charCodeAt(first);
|
|
2001
|
-
if (isSpace(ch))
|
|
2002
|
-
|
|
2003
|
-
|
|
2090
|
+
if (isSpace(ch)) {
|
|
2091
|
+
if (ch === 9) lineIndent += 4 - (lineIndent + this.bsCount[line]) % 4;
|
|
2092
|
+
else lineIndent++;
|
|
2093
|
+
} else if (first - lineStart < this.tShift[line]) lineIndent++;
|
|
2004
2094
|
else break;
|
|
2005
2095
|
first++;
|
|
2006
2096
|
}
|
|
@@ -2027,13 +2117,15 @@ function escapedSplit(str) {
|
|
|
2027
2117
|
let lastPos = 0;
|
|
2028
2118
|
let current = "";
|
|
2029
2119
|
while (pos < max) {
|
|
2030
|
-
if (ch === 124)
|
|
2031
|
-
|
|
2032
|
-
|
|
2033
|
-
|
|
2034
|
-
|
|
2035
|
-
|
|
2036
|
-
|
|
2120
|
+
if (ch === 124) {
|
|
2121
|
+
if (!isEscaped) {
|
|
2122
|
+
result.push(current + str.substring(lastPos, pos));
|
|
2123
|
+
current = "";
|
|
2124
|
+
lastPos = pos + 1;
|
|
2125
|
+
} else {
|
|
2126
|
+
current += str.substring(lastPos, pos - 1);
|
|
2127
|
+
lastPos = pos;
|
|
2128
|
+
}
|
|
2037
2129
|
}
|
|
2038
2130
|
isEscaped = ch === 92;
|
|
2039
2131
|
pos++;
|
|
@@ -2065,8 +2157,10 @@ function table(state, startLine, endLine, silent) {
|
|
|
2065
2157
|
const aligns = [];
|
|
2066
2158
|
for (let i = 0; i < columns.length; i++) {
|
|
2067
2159
|
const t = columns[i].trim();
|
|
2068
|
-
if (!t)
|
|
2069
|
-
|
|
2160
|
+
if (!t) {
|
|
2161
|
+
if (i === 0 || i === columns.length - 1) continue;
|
|
2162
|
+
else return false;
|
|
2163
|
+
}
|
|
2070
2164
|
if (!/^:?-+:?$/.test(t)) return false;
|
|
2071
2165
|
if (t.charCodeAt(t.length - 1) === 58) aligns.push(t.charCodeAt(0) === 58 ? "center" : "right");
|
|
2072
2166
|
else if (t.charCodeAt(0) === 58) aligns.push("left");
|
|
@@ -2259,9 +2353,10 @@ function blockquote(state, startLine, endLine, silent) {
|
|
|
2259
2353
|
state.bMarks[nextLine] = pos;
|
|
2260
2354
|
while (pos < max) {
|
|
2261
2355
|
const ch = state.src.charCodeAt(pos);
|
|
2262
|
-
if (isSpace(ch))
|
|
2263
|
-
|
|
2264
|
-
|
|
2356
|
+
if (isSpace(ch)) {
|
|
2357
|
+
if (ch === 9) offset += 4 - (offset + state.bsCount[nextLine] + (adjustTab ? 1 : 0)) % 4;
|
|
2358
|
+
else offset++;
|
|
2359
|
+
} else break;
|
|
2265
2360
|
pos++;
|
|
2266
2361
|
}
|
|
2267
2362
|
lastLineEmpty = pos >= max;
|
|
@@ -2494,129 +2589,141 @@ function list(state, startLine, endLine, silent) {
|
|
|
2494
2589
|
}
|
|
2495
2590
|
//#endregion
|
|
2496
2591
|
//#region src/rules_block/reference.ts
|
|
2592
|
+
var MAX_LABEL_LENGTH = 999;
|
|
2593
|
+
function countCodePoints(str) {
|
|
2594
|
+
let length = str.length;
|
|
2595
|
+
for (let i = 0; i < str.length - 1; i++) {
|
|
2596
|
+
const high = str.charCodeAt(i);
|
|
2597
|
+
if (high < 55296 || high > 56319) continue;
|
|
2598
|
+
const low = str.charCodeAt(i + 1);
|
|
2599
|
+
if (low >= 56320 && low <= 57343) {
|
|
2600
|
+
length--;
|
|
2601
|
+
i++;
|
|
2602
|
+
}
|
|
2603
|
+
}
|
|
2604
|
+
return length;
|
|
2605
|
+
}
|
|
2606
|
+
function lineEnd(state, line) {
|
|
2607
|
+
return Math.min(state.eMarks[line] + 1, state.src.length);
|
|
2608
|
+
}
|
|
2609
|
+
function getNextLinePos(state, nextLine) {
|
|
2610
|
+
const endLine = state.lineMax;
|
|
2611
|
+
if (nextLine >= endLine || state.isEmpty(nextLine)) return -1;
|
|
2612
|
+
let isContinuation = false;
|
|
2613
|
+
if (state.sCount[nextLine] - state.blkIndent > 3) isContinuation = true;
|
|
2614
|
+
if (state.sCount[nextLine] < 0) isContinuation = true;
|
|
2615
|
+
if (!isContinuation) {
|
|
2616
|
+
const terminatorRules = state.md.block.ruler.getRules("reference");
|
|
2617
|
+
const oldParentType = state.parentType;
|
|
2618
|
+
state.parentType = "reference";
|
|
2619
|
+
let terminate = false;
|
|
2620
|
+
for (let i = 0, l = terminatorRules.length; i < l; i++) if (terminatorRules[i](state, nextLine, endLine, true)) {
|
|
2621
|
+
terminate = true;
|
|
2622
|
+
break;
|
|
2623
|
+
}
|
|
2624
|
+
state.parentType = oldParentType;
|
|
2625
|
+
if (terminate) return -1;
|
|
2626
|
+
}
|
|
2627
|
+
return state.bMarks[nextLine] + state.tShift[nextLine];
|
|
2628
|
+
}
|
|
2497
2629
|
function reference(state, startLine, _endLine, silent) {
|
|
2630
|
+
const src = state.src;
|
|
2498
2631
|
let pos = state.bMarks[startLine] + state.tShift[startLine];
|
|
2499
|
-
let max = state.eMarks[startLine];
|
|
2500
2632
|
let nextLine = startLine + 1;
|
|
2501
2633
|
if (state.sCount[startLine] - state.blkIndent >= 4) return false;
|
|
2502
|
-
if (
|
|
2503
|
-
|
|
2504
|
-
|
|
2505
|
-
if (nextLine >= endLine || state.isEmpty(nextLine)) return null;
|
|
2506
|
-
let isContinuation = false;
|
|
2507
|
-
if (state.sCount[nextLine] - state.blkIndent > 3) isContinuation = true;
|
|
2508
|
-
if (state.sCount[nextLine] < 0) isContinuation = true;
|
|
2509
|
-
if (!isContinuation) {
|
|
2510
|
-
const terminatorRules = state.md.block.ruler.getRules("reference");
|
|
2511
|
-
const oldParentType = state.parentType;
|
|
2512
|
-
state.parentType = "reference";
|
|
2513
|
-
let terminate = false;
|
|
2514
|
-
for (let i = 0, l = terminatorRules.length; i < l; i++) if (terminatorRules[i](state, nextLine, endLine, true)) {
|
|
2515
|
-
terminate = true;
|
|
2516
|
-
break;
|
|
2517
|
-
}
|
|
2518
|
-
state.parentType = oldParentType;
|
|
2519
|
-
if (terminate) return null;
|
|
2520
|
-
}
|
|
2521
|
-
const pos = state.bMarks[nextLine] + state.tShift[nextLine];
|
|
2522
|
-
const max = state.eMarks[nextLine];
|
|
2523
|
-
return state.src.slice(pos, max + 1);
|
|
2524
|
-
}
|
|
2525
|
-
let str = state.src.slice(pos, max + 1);
|
|
2526
|
-
max = str.length;
|
|
2634
|
+
if (src.charCodeAt(pos) !== 91) return false;
|
|
2635
|
+
let max = lineEnd(state, startLine);
|
|
2636
|
+
let rawLabel = "";
|
|
2527
2637
|
let labelEnd = -1;
|
|
2528
|
-
|
|
2529
|
-
|
|
2638
|
+
let segmentStart = ++pos;
|
|
2639
|
+
while (pos < max) {
|
|
2640
|
+
if (rawLabel.length + pos - segmentStart > MAX_LABEL_LENGTH * 2) return false;
|
|
2641
|
+
let ch = src.charCodeAt(pos);
|
|
2530
2642
|
if (ch === 91) return false;
|
|
2531
|
-
|
|
2643
|
+
if (ch === 93) {
|
|
2532
2644
|
labelEnd = pos;
|
|
2533
2645
|
break;
|
|
2534
|
-
} else if (ch === 10) {
|
|
2535
|
-
const lineContent = getNextLine(nextLine);
|
|
2536
|
-
if (lineContent !== null) {
|
|
2537
|
-
str += lineContent;
|
|
2538
|
-
max = str.length;
|
|
2539
|
-
nextLine++;
|
|
2540
|
-
}
|
|
2541
|
-
} else if (ch === 92) {
|
|
2542
|
-
pos++;
|
|
2543
|
-
if (pos < max && str.charCodeAt(pos) === 10) {
|
|
2544
|
-
const lineContent = getNextLine(nextLine);
|
|
2545
|
-
if (lineContent !== null) {
|
|
2546
|
-
str += lineContent;
|
|
2547
|
-
max = str.length;
|
|
2548
|
-
nextLine++;
|
|
2549
|
-
}
|
|
2550
|
-
}
|
|
2551
2646
|
}
|
|
2647
|
+
if (ch === 92) ch = src.charCodeAt(++pos);
|
|
2648
|
+
if (ch === 10 && pos < max) {
|
|
2649
|
+
const nextPos = getNextLinePos(state, nextLine);
|
|
2650
|
+
if (nextPos < 0) return false;
|
|
2651
|
+
rawLabel += src.slice(segmentStart, max);
|
|
2652
|
+
pos = segmentStart = nextPos;
|
|
2653
|
+
max = lineEnd(state, nextLine++);
|
|
2654
|
+
continue;
|
|
2655
|
+
}
|
|
2656
|
+
pos++;
|
|
2552
2657
|
}
|
|
2553
|
-
if (labelEnd < 0 ||
|
|
2554
|
-
|
|
2555
|
-
|
|
2658
|
+
if (labelEnd < 0 || src.charCodeAt(labelEnd + 1) !== 58) return false;
|
|
2659
|
+
rawLabel += src.slice(segmentStart, labelEnd);
|
|
2660
|
+
if (rawLabel.length > MAX_LABEL_LENGTH && countCodePoints(rawLabel) > MAX_LABEL_LENGTH) return false;
|
|
2661
|
+
pos = labelEnd + 2;
|
|
2662
|
+
while (pos < max) {
|
|
2663
|
+
const ch = src.charCodeAt(pos);
|
|
2556
2664
|
if (ch === 10) {
|
|
2557
|
-
const
|
|
2558
|
-
if (
|
|
2559
|
-
|
|
2560
|
-
|
|
2561
|
-
|
|
2562
|
-
|
|
2563
|
-
|
|
2564
|
-
|
|
2565
|
-
const destRes = state.md.helpers.parseLinkDestination(str, pos, max);
|
|
2665
|
+
const nextPos = getNextLinePos(state, nextLine);
|
|
2666
|
+
if (nextPos < 0) break;
|
|
2667
|
+
pos = nextPos;
|
|
2668
|
+
max = lineEnd(state, nextLine++);
|
|
2669
|
+
} else if (isSpace(ch)) pos++;
|
|
2670
|
+
else break;
|
|
2671
|
+
}
|
|
2672
|
+
const destRes = state.md.helpers.parseLinkDestination(src, pos, max);
|
|
2566
2673
|
if (!destRes.ok) return false;
|
|
2567
2674
|
const href = state.md.normalizeLink(destRes.str);
|
|
2568
2675
|
if (!state.md.validateLink(href)) return false;
|
|
2569
2676
|
pos = destRes.pos;
|
|
2570
2677
|
const destEndPos = pos;
|
|
2678
|
+
const destEndMax = max;
|
|
2571
2679
|
const destEndLineNo = nextLine;
|
|
2572
|
-
|
|
2573
|
-
|
|
2574
|
-
const ch = str.charCodeAt(pos);
|
|
2680
|
+
while (pos < max) {
|
|
2681
|
+
const ch = src.charCodeAt(pos);
|
|
2575
2682
|
if (ch === 10) {
|
|
2576
|
-
const
|
|
2577
|
-
if (
|
|
2578
|
-
|
|
2579
|
-
|
|
2580
|
-
|
|
2581
|
-
|
|
2582
|
-
|
|
2583
|
-
|
|
2584
|
-
let titleRes = state.md.helpers.parseLinkTitle(
|
|
2683
|
+
const nextPos = getNextLinePos(state, nextLine);
|
|
2684
|
+
if (nextPos < 0) break;
|
|
2685
|
+
pos = nextPos;
|
|
2686
|
+
max = lineEnd(state, nextLine++);
|
|
2687
|
+
} else if (isSpace(ch)) pos++;
|
|
2688
|
+
else break;
|
|
2689
|
+
}
|
|
2690
|
+
const titleStart = pos;
|
|
2691
|
+
let titleRes = state.md.helpers.parseLinkTitle(src, pos, max);
|
|
2585
2692
|
while (titleRes.can_continue) {
|
|
2586
|
-
const
|
|
2587
|
-
if (
|
|
2588
|
-
|
|
2589
|
-
|
|
2590
|
-
|
|
2591
|
-
nextLine++;
|
|
2592
|
-
titleRes = state.md.helpers.parseLinkTitle(str, pos, max, titleRes);
|
|
2693
|
+
const nextPos = getNextLinePos(state, nextLine);
|
|
2694
|
+
if (nextPos < 0) break;
|
|
2695
|
+
pos = nextPos;
|
|
2696
|
+
max = lineEnd(state, nextLine++);
|
|
2697
|
+
titleRes = state.md.helpers.parseLinkTitle(src, pos, max, titleRes);
|
|
2593
2698
|
}
|
|
2594
2699
|
let title;
|
|
2595
|
-
if (
|
|
2700
|
+
if (titleStart !== destEndPos && titleRes.ok) {
|
|
2596
2701
|
title = titleRes.str;
|
|
2597
2702
|
pos = titleRes.pos;
|
|
2598
2703
|
} else {
|
|
2599
2704
|
title = "";
|
|
2600
2705
|
pos = destEndPos;
|
|
2706
|
+
max = destEndMax;
|
|
2601
2707
|
nextLine = destEndLineNo;
|
|
2602
2708
|
}
|
|
2603
2709
|
while (pos < max) {
|
|
2604
|
-
if (!isSpace(
|
|
2710
|
+
if (!isSpace(src.charCodeAt(pos))) break;
|
|
2605
2711
|
pos++;
|
|
2606
2712
|
}
|
|
2607
|
-
if (pos < max &&
|
|
2713
|
+
if (pos < max && src.charCodeAt(pos) !== 10) {
|
|
2608
2714
|
if (title) {
|
|
2609
2715
|
title = "";
|
|
2610
2716
|
pos = destEndPos;
|
|
2717
|
+
max = destEndMax;
|
|
2611
2718
|
nextLine = destEndLineNo;
|
|
2612
2719
|
while (pos < max) {
|
|
2613
|
-
if (!isSpace(
|
|
2720
|
+
if (!isSpace(src.charCodeAt(pos))) break;
|
|
2614
2721
|
pos++;
|
|
2615
2722
|
}
|
|
2616
2723
|
}
|
|
2617
2724
|
}
|
|
2618
|
-
if (pos < max &&
|
|
2619
|
-
const label = normalizeReference(
|
|
2725
|
+
if (pos < max && src.charCodeAt(pos) !== 10) return false;
|
|
2726
|
+
const label = normalizeReference(rawLabel);
|
|
2620
2727
|
if (!label) return false;
|
|
2621
2728
|
/* istanbul ignore if */
|
|
2622
2729
|
if (silent) return true;
|
|
@@ -2704,7 +2811,7 @@ var html_blocks_default = [
|
|
|
2704
2811
|
//#region src/common/html_re.ts
|
|
2705
2812
|
var open_tag = `<[A-Za-z][A-Za-z0-9\\-]*(?:\\s+[a-zA-Z_:][a-zA-Z0-9:._-]*(?:\\s*=\\s*(?:[^"'=<>\`\\x00-\\x20]+|'[^']*'|"[^"]*"))?)*\\s*\\/?>`;
|
|
2706
2813
|
var close_tag = "<\\/[A-Za-z][A-Za-z0-9\\-]*\\s*>";
|
|
2707
|
-
|
|
2814
|
+
new RegExp(`^(?:${open_tag}|${close_tag}|<!---?>|<!--(?:[^-]|-[^-]|--[^>])*-->|<[?][\\s\\S]*?[?]>|<![A-Za-z][^>]*>|<!\\[CDATA\\[[\\s\\S]*?\\]\\]>)`);
|
|
2708
2815
|
var HTML_OPEN_CLOSE_TAG_RE = new RegExp(`^(?:${open_tag}|${close_tag})`);
|
|
2709
2816
|
//#endregion
|
|
2710
2817
|
//#region src/rules_block/html_block.ts
|
|
@@ -3030,6 +3137,7 @@ var StateInline = class {
|
|
|
3030
3137
|
_defineProperty(this, "cache", {});
|
|
3031
3138
|
_defineProperty(this, "backticks", {});
|
|
3032
3139
|
_defineProperty(this, "backticksScanned", false);
|
|
3140
|
+
_defineProperty(this, "skipHtmlSpecial", false);
|
|
3033
3141
|
_defineProperty(this, "linkLevel", 0);
|
|
3034
3142
|
_defineProperty(this, "delimiters", []);
|
|
3035
3143
|
_defineProperty(this, "_prev_delimiters", []);
|
|
@@ -3196,16 +3304,19 @@ function newline(state, silent) {
|
|
|
3196
3304
|
if (state.src.charCodeAt(pos) !== 10) return false;
|
|
3197
3305
|
const pmax = state.pending.length - 1;
|
|
3198
3306
|
const max = state.posMax;
|
|
3199
|
-
if (!silent)
|
|
3200
|
-
|
|
3201
|
-
|
|
3202
|
-
|
|
3203
|
-
|
|
3204
|
-
|
|
3205
|
-
|
|
3206
|
-
|
|
3307
|
+
if (!silent) {
|
|
3308
|
+
if (pmax >= 0 && state.pending.charCodeAt(pmax) === 32) {
|
|
3309
|
+
if (pmax >= 1 && state.pending.charCodeAt(pmax - 1) === 32) {
|
|
3310
|
+
let ws = pmax - 1;
|
|
3311
|
+
while (ws >= 1 && state.pending.charCodeAt(ws - 1) === 32) ws--;
|
|
3312
|
+
state.pending = state.pending.slice(0, ws);
|
|
3313
|
+
state.push("hardbreak", "br", 0);
|
|
3314
|
+
} else {
|
|
3315
|
+
state.pending = state.pending.slice(0, -1);
|
|
3316
|
+
state.push("softbreak", "br", 0);
|
|
3317
|
+
}
|
|
3318
|
+
} else state.push("softbreak", "br", 0);
|
|
3207
3319
|
}
|
|
3208
|
-
else state.push("softbreak", "br", 0);
|
|
3209
3320
|
pos++;
|
|
3210
3321
|
while (pos < max && isSpace(state.src.charCodeAt(pos))) pos++;
|
|
3211
3322
|
state.pos = pos;
|
|
@@ -3694,22 +3805,53 @@ function isLetter(ch) {
|
|
|
3694
3805
|
const lc = ch | 32;
|
|
3695
3806
|
return lc >= 97 && lc <= 122;
|
|
3696
3807
|
}
|
|
3808
|
+
function scanSpecial(state, pos) {
|
|
3809
|
+
const src = state.src;
|
|
3810
|
+
let start;
|
|
3811
|
+
let terminator;
|
|
3812
|
+
if (src.startsWith("<!--", pos)) {
|
|
3813
|
+
if (src.startsWith(">", pos + 4)) return pos + 5;
|
|
3814
|
+
if (src.startsWith("->", pos + 4)) return pos + 6;
|
|
3815
|
+
start = pos + 4;
|
|
3816
|
+
terminator = "-->";
|
|
3817
|
+
} else if (src.startsWith("<![CDATA[", pos)) {
|
|
3818
|
+
start = pos + 9;
|
|
3819
|
+
terminator = "]]>";
|
|
3820
|
+
} else if (src.charCodeAt(pos + 1) === 63) {
|
|
3821
|
+
start = pos + 2;
|
|
3822
|
+
terminator = "?>";
|
|
3823
|
+
} else if (isLetter(src.charCodeAt(pos + 2))) {
|
|
3824
|
+
start = pos + 3;
|
|
3825
|
+
terminator = ">";
|
|
3826
|
+
} else return -1;
|
|
3827
|
+
if (state.skipHtmlSpecial) return -1;
|
|
3828
|
+
const end = src.indexOf(terminator, start);
|
|
3829
|
+
if (end < 0) {
|
|
3830
|
+
state.skipHtmlSpecial = true;
|
|
3831
|
+
return -1;
|
|
3832
|
+
}
|
|
3833
|
+
return end + terminator.length;
|
|
3834
|
+
}
|
|
3697
3835
|
function html_inline(state, silent) {
|
|
3698
3836
|
if (!state.md.options.html) return false;
|
|
3699
3837
|
const max = state.posMax;
|
|
3700
3838
|
const pos = state.pos;
|
|
3701
3839
|
if (state.src.charCodeAt(pos) !== 60 || pos + 2 >= max) return false;
|
|
3840
|
+
let end;
|
|
3702
3841
|
const ch = state.src.charCodeAt(pos + 1);
|
|
3703
|
-
if (ch
|
|
3704
|
-
|
|
3705
|
-
|
|
3842
|
+
if (ch === 33 || ch === 63) end = scanSpecial(state, pos);
|
|
3843
|
+
else if (ch === 47 || isLetter(ch)) {
|
|
3844
|
+
const match = state.src.slice(pos).match(HTML_OPEN_CLOSE_TAG_RE);
|
|
3845
|
+
end = match ? pos + match[0].length : -1;
|
|
3846
|
+
} else return false;
|
|
3847
|
+
if (end < 0) return false;
|
|
3706
3848
|
if (!silent) {
|
|
3707
3849
|
const token = state.push("html_inline", "", 0);
|
|
3708
|
-
token.content =
|
|
3850
|
+
token.content = state.src.slice(pos, end);
|
|
3709
3851
|
if (isLinkOpen(token.content)) state.linkLevel++;
|
|
3710
3852
|
if (isLinkClose(token.content)) state.linkLevel--;
|
|
3711
3853
|
}
|
|
3712
|
-
state.pos
|
|
3854
|
+
state.pos = end;
|
|
3713
3855
|
return true;
|
|
3714
3856
|
}
|
|
3715
3857
|
//#endregion
|
|
@@ -4039,7 +4181,7 @@ var commonmark_default = {
|
|
|
4039
4181
|
}
|
|
4040
4182
|
};
|
|
4041
4183
|
//#endregion
|
|
4042
|
-
//#region \0@oxc-project+runtime@0.
|
|
4184
|
+
//#region \0@oxc-project+runtime@0.154.0/helpers/esm/objectSpread2.js
|
|
4043
4185
|
function ownKeys(e, r) {
|
|
4044
4186
|
var t = Object.keys(e);
|
|
4045
4187
|
if (Object.getOwnPropertySymbols) {
|