7z-iterator 1.4.0 → 2.0.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (160) hide show
  1. package/dist/cjs/index.d.cts +3 -3
  2. package/dist/cjs/index.d.ts +3 -3
  3. package/dist/cjs/index.js +7 -38
  4. package/dist/cjs/index.js.map +1 -1
  5. package/dist/cjs/nextEntry.js +1 -2
  6. package/dist/cjs/nextEntry.js.map +1 -1
  7. package/dist/cjs/sevenz/ArchiveSource.d.cts +1 -0
  8. package/dist/cjs/sevenz/ArchiveSource.d.ts +1 -0
  9. package/dist/cjs/sevenz/ArchiveSource.js +23 -0
  10. package/dist/cjs/sevenz/ArchiveSource.js.map +1 -1
  11. package/dist/cjs/sevenz/SevenZipParser.js +22 -3
  12. package/dist/cjs/sevenz/SevenZipParser.js.map +1 -1
  13. package/dist/cjs/sevenz/codecs/index.js +52 -30
  14. package/dist/cjs/sevenz/codecs/index.js.map +1 -1
  15. package/dist/cjs/sevenz/constants.d.cts +1 -0
  16. package/dist/cjs/sevenz/constants.d.ts +1 -0
  17. package/dist/cjs/sevenz/constants.js +1 -0
  18. package/dist/cjs/sevenz/constants.js.map +1 -1
  19. package/dist/esm/index.d.ts +3 -3
  20. package/dist/esm/index.js +4 -3
  21. package/dist/esm/index.js.map +1 -1
  22. package/dist/esm/nextEntry.js +1 -2
  23. package/dist/esm/nextEntry.js.map +1 -1
  24. package/dist/esm/sevenz/ArchiveSource.d.ts +1 -0
  25. package/dist/esm/sevenz/ArchiveSource.js +23 -0
  26. package/dist/esm/sevenz/ArchiveSource.js.map +1 -1
  27. package/dist/esm/sevenz/SevenZipParser.js +22 -3
  28. package/dist/esm/sevenz/SevenZipParser.js.map +1 -1
  29. package/dist/esm/sevenz/codecs/index.js +32 -10
  30. package/dist/esm/sevenz/codecs/index.js.map +1 -1
  31. package/dist/esm/sevenz/constants.d.ts +1 -0
  32. package/dist/esm/sevenz/constants.js +1 -0
  33. package/dist/esm/sevenz/constants.js.map +1 -1
  34. package/package.json +3 -3
  35. package/dist/cjs/lzma/Lzma2ChunkParser.d.cts +0 -73
  36. package/dist/cjs/lzma/Lzma2ChunkParser.d.ts +0 -73
  37. package/dist/cjs/lzma/Lzma2ChunkParser.js +0 -148
  38. package/dist/cjs/lzma/Lzma2ChunkParser.js.map +0 -1
  39. package/dist/cjs/lzma/index.d.cts +0 -31
  40. package/dist/cjs/lzma/index.d.ts +0 -31
  41. package/dist/cjs/lzma/index.js +0 -83
  42. package/dist/cjs/lzma/index.js.map +0 -1
  43. package/dist/cjs/lzma/stream/transforms.d.cts +0 -46
  44. package/dist/cjs/lzma/stream/transforms.d.ts +0 -46
  45. package/dist/cjs/lzma/stream/transforms.js +0 -209
  46. package/dist/cjs/lzma/stream/transforms.js.map +0 -1
  47. package/dist/cjs/lzma/sync/Lzma2Decoder.d.cts +0 -63
  48. package/dist/cjs/lzma/sync/Lzma2Decoder.d.ts +0 -63
  49. package/dist/cjs/lzma/sync/Lzma2Decoder.js +0 -231
  50. package/dist/cjs/lzma/sync/Lzma2Decoder.js.map +0 -1
  51. package/dist/cjs/lzma/sync/LzmaDecoder.d.cts +0 -97
  52. package/dist/cjs/lzma/sync/LzmaDecoder.d.ts +0 -97
  53. package/dist/cjs/lzma/sync/LzmaDecoder.js +0 -580
  54. package/dist/cjs/lzma/sync/LzmaDecoder.js.map +0 -1
  55. package/dist/cjs/lzma/sync/RangeDecoder.d.cts +0 -69
  56. package/dist/cjs/lzma/sync/RangeDecoder.d.ts +0 -69
  57. package/dist/cjs/lzma/sync/RangeDecoder.js +0 -162
  58. package/dist/cjs/lzma/sync/RangeDecoder.js.map +0 -1
  59. package/dist/cjs/lzma/types.d.cts +0 -117
  60. package/dist/cjs/lzma/types.d.ts +0 -117
  61. package/dist/cjs/lzma/types.js +0 -264
  62. package/dist/cjs/lzma/types.js.map +0 -1
  63. package/dist/cjs/sevenz/codecs/Bcj.d.cts +0 -16
  64. package/dist/cjs/sevenz/codecs/Bcj.d.ts +0 -16
  65. package/dist/cjs/sevenz/codecs/Bcj.js +0 -183
  66. package/dist/cjs/sevenz/codecs/Bcj.js.map +0 -1
  67. package/dist/cjs/sevenz/codecs/BcjArm.d.cts +0 -21
  68. package/dist/cjs/sevenz/codecs/BcjArm.d.ts +0 -21
  69. package/dist/cjs/sevenz/codecs/BcjArm.js +0 -104
  70. package/dist/cjs/sevenz/codecs/BcjArm.js.map +0 -1
  71. package/dist/cjs/sevenz/codecs/BcjArm64.d.cts +0 -21
  72. package/dist/cjs/sevenz/codecs/BcjArm64.d.ts +0 -21
  73. package/dist/cjs/sevenz/codecs/BcjArm64.js +0 -65
  74. package/dist/cjs/sevenz/codecs/BcjArm64.js.map +0 -1
  75. package/dist/cjs/sevenz/codecs/BcjArmt.d.cts +0 -19
  76. package/dist/cjs/sevenz/codecs/BcjArmt.d.ts +0 -19
  77. package/dist/cjs/sevenz/codecs/BcjArmt.js +0 -76
  78. package/dist/cjs/sevenz/codecs/BcjArmt.js.map +0 -1
  79. package/dist/cjs/sevenz/codecs/BcjIa64.d.cts +0 -15
  80. package/dist/cjs/sevenz/codecs/BcjIa64.d.ts +0 -15
  81. package/dist/cjs/sevenz/codecs/BcjIa64.js +0 -141
  82. package/dist/cjs/sevenz/codecs/BcjIa64.js.map +0 -1
  83. package/dist/cjs/sevenz/codecs/BcjPpc.d.cts +0 -20
  84. package/dist/cjs/sevenz/codecs/BcjPpc.d.ts +0 -20
  85. package/dist/cjs/sevenz/codecs/BcjPpc.js +0 -64
  86. package/dist/cjs/sevenz/codecs/BcjPpc.js.map +0 -1
  87. package/dist/cjs/sevenz/codecs/BcjSparc.d.cts +0 -19
  88. package/dist/cjs/sevenz/codecs/BcjSparc.d.ts +0 -19
  89. package/dist/cjs/sevenz/codecs/BcjSparc.js +0 -69
  90. package/dist/cjs/sevenz/codecs/BcjSparc.js.map +0 -1
  91. package/dist/cjs/sevenz/codecs/Delta.d.cts +0 -16
  92. package/dist/cjs/sevenz/codecs/Delta.d.ts +0 -16
  93. package/dist/cjs/sevenz/codecs/Delta.js +0 -74
  94. package/dist/cjs/sevenz/codecs/Delta.js.map +0 -1
  95. package/dist/cjs/sevenz/codecs/Lzma.d.cts +0 -17
  96. package/dist/cjs/sevenz/codecs/Lzma.d.ts +0 -17
  97. package/dist/cjs/sevenz/codecs/Lzma.js +0 -40
  98. package/dist/cjs/sevenz/codecs/Lzma.js.map +0 -1
  99. package/dist/cjs/sevenz/codecs/Lzma2.d.cts +0 -20
  100. package/dist/cjs/sevenz/codecs/Lzma2.d.ts +0 -20
  101. package/dist/cjs/sevenz/codecs/Lzma2.js +0 -42
  102. package/dist/cjs/sevenz/codecs/Lzma2.js.map +0 -1
  103. package/dist/cjs/xz/Decoder.d.cts +0 -25
  104. package/dist/cjs/xz/Decoder.d.ts +0 -25
  105. package/dist/cjs/xz/Decoder.js +0 -194
  106. package/dist/cjs/xz/Decoder.js.map +0 -1
  107. package/dist/esm/lzma/Lzma2ChunkParser.d.ts +0 -73
  108. package/dist/esm/lzma/Lzma2ChunkParser.js +0 -137
  109. package/dist/esm/lzma/Lzma2ChunkParser.js.map +0 -1
  110. package/dist/esm/lzma/index.d.ts +0 -31
  111. package/dist/esm/lzma/index.js +0 -44
  112. package/dist/esm/lzma/index.js.map +0 -1
  113. package/dist/esm/lzma/stream/transforms.d.ts +0 -46
  114. package/dist/esm/lzma/stream/transforms.js +0 -189
  115. package/dist/esm/lzma/stream/transforms.js.map +0 -1
  116. package/dist/esm/lzma/sync/Lzma2Decoder.d.ts +0 -63
  117. package/dist/esm/lzma/sync/Lzma2Decoder.js +0 -211
  118. package/dist/esm/lzma/sync/Lzma2Decoder.js.map +0 -1
  119. package/dist/esm/lzma/sync/LzmaDecoder.d.ts +0 -97
  120. package/dist/esm/lzma/sync/LzmaDecoder.js +0 -543
  121. package/dist/esm/lzma/sync/LzmaDecoder.js.map +0 -1
  122. package/dist/esm/lzma/sync/RangeDecoder.d.ts +0 -69
  123. package/dist/esm/lzma/sync/RangeDecoder.js +0 -132
  124. package/dist/esm/lzma/sync/RangeDecoder.js.map +0 -1
  125. package/dist/esm/lzma/types.d.ts +0 -117
  126. package/dist/esm/lzma/types.js +0 -154
  127. package/dist/esm/lzma/types.js.map +0 -1
  128. package/dist/esm/sevenz/codecs/Bcj.d.ts +0 -16
  129. package/dist/esm/sevenz/codecs/Bcj.js +0 -175
  130. package/dist/esm/sevenz/codecs/Bcj.js.map +0 -1
  131. package/dist/esm/sevenz/codecs/BcjArm.d.ts +0 -21
  132. package/dist/esm/sevenz/codecs/BcjArm.js +0 -101
  133. package/dist/esm/sevenz/codecs/BcjArm.js.map +0 -1
  134. package/dist/esm/sevenz/codecs/BcjArm64.d.ts +0 -21
  135. package/dist/esm/sevenz/codecs/BcjArm64.js +0 -57
  136. package/dist/esm/sevenz/codecs/BcjArm64.js.map +0 -1
  137. package/dist/esm/sevenz/codecs/BcjArmt.d.ts +0 -19
  138. package/dist/esm/sevenz/codecs/BcjArmt.js +0 -66
  139. package/dist/esm/sevenz/codecs/BcjArmt.js.map +0 -1
  140. package/dist/esm/sevenz/codecs/BcjIa64.d.ts +0 -15
  141. package/dist/esm/sevenz/codecs/BcjIa64.js +0 -127
  142. package/dist/esm/sevenz/codecs/BcjIa64.js.map +0 -1
  143. package/dist/esm/sevenz/codecs/BcjPpc.d.ts +0 -20
  144. package/dist/esm/sevenz/codecs/BcjPpc.js +0 -55
  145. package/dist/esm/sevenz/codecs/BcjPpc.js.map +0 -1
  146. package/dist/esm/sevenz/codecs/BcjSparc.d.ts +0 -19
  147. package/dist/esm/sevenz/codecs/BcjSparc.js +0 -59
  148. package/dist/esm/sevenz/codecs/BcjSparc.js.map +0 -1
  149. package/dist/esm/sevenz/codecs/Delta.d.ts +0 -16
  150. package/dist/esm/sevenz/codecs/Delta.js +0 -66
  151. package/dist/esm/sevenz/codecs/Delta.js.map +0 -1
  152. package/dist/esm/sevenz/codecs/Lzma.d.ts +0 -17
  153. package/dist/esm/sevenz/codecs/Lzma.js +0 -33
  154. package/dist/esm/sevenz/codecs/Lzma.js.map +0 -1
  155. package/dist/esm/sevenz/codecs/Lzma2.d.ts +0 -20
  156. package/dist/esm/sevenz/codecs/Lzma2.js +0 -38
  157. package/dist/esm/sevenz/codecs/Lzma2.js.map +0 -1
  158. package/dist/esm/xz/Decoder.d.ts +0 -25
  159. package/dist/esm/xz/Decoder.js +0 -185
  160. package/dist/esm/xz/Decoder.js.map +0 -1
@@ -1,543 +0,0 @@
1
- /**
2
- * Synchronous LZMA1 Decoder
3
- *
4
- * Decodes LZMA1 compressed data from a buffer.
5
- * All operations are synchronous.
6
- */ import { allocBufferUnsafe } from 'extract-base-iterator';
7
- import { getLenToPosState, initBitModels, kEndPosModelIndex, kMatchMinLen, kNumAlignBits, kNumFullDistances, kNumLenToPosStates, kNumLitContextBitsMax, kNumPosSlotBits, kNumPosStatesBitsMax, kNumStates, kStartPosModelIndex, parseProperties, stateIsCharState, stateUpdateChar, stateUpdateMatch, stateUpdateRep, stateUpdateShortRep } from '../types.js';
8
- import { BitTreeDecoder, RangeDecoder, reverseDecodeFromArray } from './RangeDecoder.js';
9
- /**
10
- * Length decoder for match/rep lengths
11
- */ let LenDecoder = class LenDecoder {
12
- create(numPosStates) {
13
- for(; this.numPosStates < numPosStates; this.numPosStates++){
14
- this.lowCoder[this.numPosStates] = new BitTreeDecoder(3);
15
- this.midCoder[this.numPosStates] = new BitTreeDecoder(3);
16
- }
17
- }
18
- init() {
19
- initBitModels(this.choice);
20
- for(let i = this.numPosStates - 1; i >= 0; i--){
21
- this.lowCoder[i].init();
22
- this.midCoder[i].init();
23
- }
24
- this.highCoder.init();
25
- }
26
- decode(rangeDecoder, posState) {
27
- if (rangeDecoder.decodeBit(this.choice, 0) === 0) {
28
- return this.lowCoder[posState].decode(rangeDecoder);
29
- }
30
- if (rangeDecoder.decodeBit(this.choice, 1) === 0) {
31
- return 8 + this.midCoder[posState].decode(rangeDecoder);
32
- }
33
- return 16 + this.highCoder.decode(rangeDecoder);
34
- }
35
- constructor(){
36
- this.choice = initBitModels(null, 2);
37
- this.lowCoder = [];
38
- this.midCoder = [];
39
- this.highCoder = new BitTreeDecoder(8);
40
- this.numPosStates = 0;
41
- }
42
- };
43
- /**
44
- * Single literal decoder (decodes one byte)
45
- */ let LiteralDecoder2 = class LiteralDecoder2 {
46
- init() {
47
- initBitModels(this.decoders);
48
- }
49
- decodeNormal(rangeDecoder) {
50
- let symbol = 1;
51
- do {
52
- symbol = symbol << 1 | rangeDecoder.decodeBit(this.decoders, symbol);
53
- }while (symbol < 0x100)
54
- return symbol & 0xff;
55
- }
56
- decodeWithMatchByte(rangeDecoder, matchByte) {
57
- let symbol = 1;
58
- do {
59
- const matchBit = matchByte >> 7 & 1;
60
- matchByte <<= 1;
61
- const bit = rangeDecoder.decodeBit(this.decoders, (1 + matchBit << 8) + symbol);
62
- symbol = symbol << 1 | bit;
63
- if (matchBit !== bit) {
64
- while(symbol < 0x100){
65
- symbol = symbol << 1 | rangeDecoder.decodeBit(this.decoders, symbol);
66
- }
67
- break;
68
- }
69
- }while (symbol < 0x100)
70
- return symbol & 0xff;
71
- }
72
- constructor(){
73
- this.decoders = initBitModels(null, 0x300);
74
- }
75
- };
76
- /**
77
- * Literal decoder (array of single decoders)
78
- */ let LiteralDecoder = class LiteralDecoder {
79
- create(numPosBits, numPrevBits) {
80
- if (this.coders.length > 0 && this.numPrevBits === numPrevBits && this.numPosBits === numPosBits) {
81
- return;
82
- }
83
- this.numPosBits = numPosBits;
84
- this.posMask = (1 << numPosBits) - 1;
85
- this.numPrevBits = numPrevBits;
86
- this.coders = [];
87
- }
88
- init() {
89
- for(let i = 0; i < this.coders.length; i++){
90
- if (this.coders[i]) {
91
- var _this_coders_i;
92
- (_this_coders_i = this.coders[i]) === null || _this_coders_i === void 0 ? void 0 : _this_coders_i.init();
93
- }
94
- }
95
- }
96
- getDecoder(pos, prevByte) {
97
- const index = ((pos & this.posMask) << this.numPrevBits) + ((prevByte & 0xff) >>> 8 - this.numPrevBits);
98
- let decoder = this.coders[index];
99
- if (!decoder) {
100
- decoder = new LiteralDecoder2();
101
- this.coders[index] = decoder;
102
- }
103
- return decoder;
104
- }
105
- constructor(){
106
- this.numPosBits = 0;
107
- this.numPrevBits = 0;
108
- this.posMask = 0;
109
- this.coders = [];
110
- }
111
- };
112
- /**
113
- * Output window (sliding dictionary)
114
- */ let OutWindow = class OutWindow {
115
- create(windowSize) {
116
- if (!this.buffer || this.windowSize !== windowSize) {
117
- this.buffer = allocBufferUnsafe(windowSize);
118
- }
119
- this.windowSize = windowSize;
120
- this.pos = 0;
121
- this.streamPos = 0;
122
- }
123
- init(solid) {
124
- if (!solid) {
125
- this.pos = 0;
126
- this.streamPos = 0;
127
- }
128
- }
129
- putByte(b) {
130
- this.buffer[this.pos++] = b;
131
- if (this.pos >= this.windowSize) {
132
- if (this.sink) {
133
- this.flush();
134
- this.pos = 0;
135
- } else {
136
- this.pos = 0;
137
- }
138
- }
139
- }
140
- flush() {
141
- const size = this.pos - this.streamPos;
142
- if (size > 0 && this.sink) {
143
- const chunk = this.buffer.slice(this.streamPos, this.streamPos + size);
144
- this.sink.write(chunk);
145
- this.streamPos = this.pos;
146
- }
147
- }
148
- getByte(distance) {
149
- let pos = this.pos - distance - 1;
150
- if (pos < 0) {
151
- pos += this.windowSize;
152
- }
153
- return this.buffer[pos];
154
- }
155
- copyBlock(distance, len) {
156
- let pos = this.pos - distance - 1;
157
- if (pos < 0) {
158
- pos += this.windowSize;
159
- }
160
- for(let i = 0; i < len; i++){
161
- if (pos >= this.windowSize) {
162
- pos = 0;
163
- }
164
- this.putByte(this.buffer[pos++]);
165
- }
166
- }
167
- /**
168
- * Copy decoded data to output buffer
169
- */ copyTo(output, outputOffset, count) {
170
- const srcPos = this.pos - count;
171
- if (srcPos < 0) {
172
- // Wrap around case - data spans end and beginning of buffer
173
- const firstPart = -srcPos;
174
- this.buffer.copy(output, outputOffset, this.windowSize + srcPos, this.windowSize);
175
- this.buffer.copy(output, outputOffset + firstPart, 0, count - firstPart);
176
- } else {
177
- this.buffer.copy(output, outputOffset, srcPos, srcPos + count);
178
- }
179
- }
180
- constructor(sink){
181
- this.buffer = allocBufferUnsafe(0); // Replaced by create() before use
182
- this.windowSize = 0;
183
- this.pos = 0;
184
- this.sink = sink;
185
- this.streamPos = 0;
186
- }
187
- };
188
- /**
189
- * Synchronous LZMA1 decoder
190
- */ export class LzmaDecoder {
191
- /**
192
- * Set dictionary size
193
- */ setDictionarySize(dictionarySize) {
194
- if (dictionarySize < 0) return false;
195
- if (this.dictionarySize !== dictionarySize) {
196
- this.dictionarySize = dictionarySize;
197
- this.dictionarySizeCheck = Math.max(dictionarySize, 1);
198
- this.outWindow.create(Math.max(this.dictionarySizeCheck, 1 << 12));
199
- }
200
- return true;
201
- }
202
- /**
203
- * Set lc, lp, pb properties
204
- */ setLcLpPb(lc, lp, pb) {
205
- if (lc > kNumLitContextBitsMax || lp > 4 || pb > kNumPosStatesBitsMax) {
206
- return false;
207
- }
208
- const numPosStates = 1 << pb;
209
- this.literalDecoder.create(lp, lc);
210
- this.lenDecoder.create(numPosStates);
211
- this.repLenDecoder.create(numPosStates);
212
- this.posStateMask = numPosStates - 1;
213
- return true;
214
- }
215
- /**
216
- * Set decoder properties from 5-byte buffer
217
- */ setDecoderProperties(properties) {
218
- const props = parseProperties(properties);
219
- if (!this.setLcLpPb(props.lc, props.lp, props.pb)) return false;
220
- return this.setDictionarySize(props.dictionarySize);
221
- }
222
- /**
223
- * Initialize probability tables
224
- */ initProbabilities() {
225
- initBitModels(this.isMatchDecoders);
226
- initBitModels(this.isRepDecoders);
227
- initBitModels(this.isRepG0Decoders);
228
- initBitModels(this.isRepG1Decoders);
229
- initBitModels(this.isRepG2Decoders);
230
- initBitModels(this.isRep0LongDecoders);
231
- initBitModels(this.posDecoders);
232
- this.literalDecoder.init();
233
- for(let i = kNumLenToPosStates - 1; i >= 0; i--){
234
- this.posSlotDecoder[i].init();
235
- }
236
- this.lenDecoder.init();
237
- this.repLenDecoder.init();
238
- this.posAlignDecoder.init();
239
- }
240
- /**
241
- * Reset probabilities only (for LZMA2 state reset)
242
- */ resetProbabilities() {
243
- this.initProbabilities();
244
- this.state = 0;
245
- this.rep0 = 0;
246
- this.rep1 = 0;
247
- this.rep2 = 0;
248
- this.rep3 = 0;
249
- }
250
- /**
251
- * Reset dictionary position (for LZMA2 dictionary reset)
252
- */ resetDictionary() {
253
- this.outWindow.init(false);
254
- this.totalPos = 0;
255
- }
256
- /**
257
- * Feed uncompressed data into the dictionary (for LZMA2 uncompressed chunks)
258
- * This updates the sliding window so subsequent LZMA chunks can reference this data.
259
- */ feedUncompressed(data) {
260
- for(let i = 0; i < data.length; i++){
261
- this.outWindow.putByte(data[i]);
262
- }
263
- this.totalPos += data.length;
264
- if (data.length > 0) {
265
- this.prevByte = data[data.length - 1];
266
- }
267
- }
268
- /**
269
- * Flush any remaining data in the OutWindow to the sink
270
- */ flushOutWindow() {
271
- this.outWindow.flush();
272
- }
273
- /**
274
- * Decode LZMA data with streaming output (no buffer accumulation)
275
- * @param input - Compressed input buffer
276
- * @param inputOffset - Offset into input buffer
277
- * @param outSize - Expected output size
278
- * @param solid - If true, preserve state from previous decode
279
- * @returns Number of bytes written to sink
280
- */ decodeWithSink(input, inputOffset, outSize, solid = false) {
281
- this.rangeDecoder.setInput(input, inputOffset);
282
- if (!solid) {
283
- this.outWindow.init(false);
284
- this.initProbabilities();
285
- this.state = 0;
286
- this.rep0 = 0;
287
- this.rep1 = 0;
288
- this.rep2 = 0;
289
- this.rep3 = 0;
290
- this.prevByte = 0;
291
- this.totalPos = 0;
292
- } else {
293
- this.outWindow.init(true);
294
- }
295
- let outPos = 0;
296
- let cumPos = this.totalPos;
297
- while(outPos < outSize){
298
- const posState = cumPos & this.posStateMask;
299
- if (this.rangeDecoder.decodeBit(this.isMatchDecoders, (this.state << kNumPosStatesBitsMax) + posState) === 0) {
300
- // Literal
301
- const decoder2 = this.literalDecoder.getDecoder(cumPos, this.prevByte);
302
- if (!stateIsCharState(this.state)) {
303
- this.prevByte = decoder2.decodeWithMatchByte(this.rangeDecoder, this.outWindow.getByte(this.rep0));
304
- } else {
305
- this.prevByte = decoder2.decodeNormal(this.rangeDecoder);
306
- }
307
- this.outWindow.putByte(this.prevByte);
308
- outPos++;
309
- this.state = stateUpdateChar(this.state);
310
- cumPos++;
311
- } else {
312
- // Match or rep
313
- let len;
314
- if (this.rangeDecoder.decodeBit(this.isRepDecoders, this.state) === 1) {
315
- // Rep match
316
- len = 0;
317
- if (this.rangeDecoder.decodeBit(this.isRepG0Decoders, this.state) === 0) {
318
- if (this.rangeDecoder.decodeBit(this.isRep0LongDecoders, (this.state << kNumPosStatesBitsMax) + posState) === 0) {
319
- this.state = stateUpdateShortRep(this.state);
320
- len = 1;
321
- }
322
- } else {
323
- let distance;
324
- if (this.rangeDecoder.decodeBit(this.isRepG1Decoders, this.state) === 0) {
325
- distance = this.rep1;
326
- } else {
327
- if (this.rangeDecoder.decodeBit(this.isRepG2Decoders, this.state) === 0) {
328
- distance = this.rep2;
329
- } else {
330
- distance = this.rep3;
331
- this.rep3 = this.rep2;
332
- }
333
- this.rep2 = this.rep1;
334
- }
335
- this.rep1 = this.rep0;
336
- this.rep0 = distance;
337
- }
338
- if (len === 0) {
339
- len = kMatchMinLen + this.repLenDecoder.decode(this.rangeDecoder, posState);
340
- this.state = stateUpdateRep(this.state);
341
- }
342
- } else {
343
- // Normal match
344
- this.rep3 = this.rep2;
345
- this.rep2 = this.rep1;
346
- this.rep1 = this.rep0;
347
- len = kMatchMinLen + this.lenDecoder.decode(this.rangeDecoder, posState);
348
- this.state = stateUpdateMatch(this.state);
349
- const posSlot = this.posSlotDecoder[getLenToPosState(len)].decode(this.rangeDecoder);
350
- if (posSlot >= kStartPosModelIndex) {
351
- const numDirectBits = (posSlot >> 1) - 1;
352
- this.rep0 = (2 | posSlot & 1) << numDirectBits;
353
- if (posSlot < kEndPosModelIndex) {
354
- this.rep0 += reverseDecodeFromArray(this.posDecoders, this.rep0 - posSlot - 1, this.rangeDecoder, numDirectBits);
355
- } else {
356
- this.rep0 += this.rangeDecoder.decodeDirectBits(numDirectBits - kNumAlignBits) << kNumAlignBits;
357
- this.rep0 += this.posAlignDecoder.reverseDecode(this.rangeDecoder);
358
- if (this.rep0 < 0) {
359
- if (this.rep0 === -1) break;
360
- throw new Error('LZMA: Invalid distance');
361
- }
362
- }
363
- } else {
364
- this.rep0 = posSlot;
365
- }
366
- }
367
- if (this.rep0 >= cumPos || this.rep0 >= this.dictionarySizeCheck) {
368
- throw new Error('LZMA: Invalid distance');
369
- }
370
- // Copy match bytes
371
- for(let i = 0; i < len; i++){
372
- const b = this.outWindow.getByte(this.rep0);
373
- this.outWindow.putByte(b);
374
- outPos++;
375
- }
376
- cumPos += len;
377
- this.prevByte = this.outWindow.getByte(0);
378
- }
379
- }
380
- this.totalPos = cumPos;
381
- return outPos;
382
- }
383
- /**
384
- * Decode LZMA data
385
- * @param input - Compressed input buffer
386
- * @param inputOffset - Offset into input buffer
387
- * @param outSize - Expected output size
388
- * @param solid - If true, preserve state from previous decode
389
- * @returns Decompressed data
390
- */ decode(input, inputOffset, outSize, solid = false) {
391
- this.rangeDecoder.setInput(input, inputOffset);
392
- if (!solid) {
393
- this.outWindow.init(false);
394
- this.initProbabilities();
395
- this.state = 0;
396
- this.rep0 = 0;
397
- this.rep1 = 0;
398
- this.rep2 = 0;
399
- this.rep3 = 0;
400
- this.prevByte = 0;
401
- this.totalPos = 0;
402
- } else {
403
- // Solid mode: preserve dictionary state but reinitialize range decoder
404
- this.outWindow.init(true);
405
- }
406
- const output = allocBufferUnsafe(outSize);
407
- let outPos = 0;
408
- let cumPos = this.totalPos;
409
- while(outPos < outSize){
410
- const posState = cumPos & this.posStateMask;
411
- if (this.rangeDecoder.decodeBit(this.isMatchDecoders, (this.state << kNumPosStatesBitsMax) + posState) === 0) {
412
- // Literal
413
- const decoder2 = this.literalDecoder.getDecoder(cumPos, this.prevByte);
414
- if (!stateIsCharState(this.state)) {
415
- this.prevByte = decoder2.decodeWithMatchByte(this.rangeDecoder, this.outWindow.getByte(this.rep0));
416
- } else {
417
- this.prevByte = decoder2.decodeNormal(this.rangeDecoder);
418
- }
419
- this.outWindow.putByte(this.prevByte);
420
- output[outPos++] = this.prevByte;
421
- this.state = stateUpdateChar(this.state);
422
- cumPos++;
423
- } else {
424
- // Match or rep
425
- let len;
426
- if (this.rangeDecoder.decodeBit(this.isRepDecoders, this.state) === 1) {
427
- // Rep match
428
- len = 0;
429
- if (this.rangeDecoder.decodeBit(this.isRepG0Decoders, this.state) === 0) {
430
- if (this.rangeDecoder.decodeBit(this.isRep0LongDecoders, (this.state << kNumPosStatesBitsMax) + posState) === 0) {
431
- this.state = stateUpdateShortRep(this.state);
432
- len = 1;
433
- }
434
- } else {
435
- let distance;
436
- if (this.rangeDecoder.decodeBit(this.isRepG1Decoders, this.state) === 0) {
437
- distance = this.rep1;
438
- } else {
439
- if (this.rangeDecoder.decodeBit(this.isRepG2Decoders, this.state) === 0) {
440
- distance = this.rep2;
441
- } else {
442
- distance = this.rep3;
443
- this.rep3 = this.rep2;
444
- }
445
- this.rep2 = this.rep1;
446
- }
447
- this.rep1 = this.rep0;
448
- this.rep0 = distance;
449
- }
450
- if (len === 0) {
451
- len = kMatchMinLen + this.repLenDecoder.decode(this.rangeDecoder, posState);
452
- this.state = stateUpdateRep(this.state);
453
- }
454
- } else {
455
- // Normal match
456
- this.rep3 = this.rep2;
457
- this.rep2 = this.rep1;
458
- this.rep1 = this.rep0;
459
- len = kMatchMinLen + this.lenDecoder.decode(this.rangeDecoder, posState);
460
- this.state = stateUpdateMatch(this.state);
461
- const posSlot = this.posSlotDecoder[getLenToPosState(len)].decode(this.rangeDecoder);
462
- if (posSlot >= kStartPosModelIndex) {
463
- const numDirectBits = (posSlot >> 1) - 1;
464
- this.rep0 = (2 | posSlot & 1) << numDirectBits;
465
- if (posSlot < kEndPosModelIndex) {
466
- this.rep0 += reverseDecodeFromArray(this.posDecoders, this.rep0 - posSlot - 1, this.rangeDecoder, numDirectBits);
467
- } else {
468
- this.rep0 += this.rangeDecoder.decodeDirectBits(numDirectBits - kNumAlignBits) << kNumAlignBits;
469
- this.rep0 += this.posAlignDecoder.reverseDecode(this.rangeDecoder);
470
- if (this.rep0 < 0) {
471
- if (this.rep0 === -1) break; // End marker
472
- throw new Error('LZMA: Invalid distance');
473
- }
474
- }
475
- } else {
476
- this.rep0 = posSlot;
477
- }
478
- }
479
- if (this.rep0 >= cumPos || this.rep0 >= this.dictionarySizeCheck) {
480
- throw new Error('LZMA: Invalid distance');
481
- }
482
- // Copy match bytes
483
- for(let i = 0; i < len; i++){
484
- const b = this.outWindow.getByte(this.rep0);
485
- this.outWindow.putByte(b);
486
- output[outPos++] = b;
487
- }
488
- cumPos += len;
489
- this.prevByte = this.outWindow.getByte(0);
490
- }
491
- }
492
- this.totalPos = cumPos;
493
- return output;
494
- }
495
- constructor(outputSink){
496
- this.outWindow = new OutWindow(outputSink);
497
- this.rangeDecoder = new RangeDecoder();
498
- this.isMatchDecoders = initBitModels(null, kNumStates << kNumPosStatesBitsMax);
499
- this.isRepDecoders = initBitModels(null, kNumStates);
500
- this.isRepG0Decoders = initBitModels(null, kNumStates);
501
- this.isRepG1Decoders = initBitModels(null, kNumStates);
502
- this.isRepG2Decoders = initBitModels(null, kNumStates);
503
- this.isRep0LongDecoders = initBitModels(null, kNumStates << kNumPosStatesBitsMax);
504
- this.posSlotDecoder = [];
505
- this.posDecoders = initBitModels(null, kNumFullDistances - kEndPosModelIndex);
506
- this.posAlignDecoder = new BitTreeDecoder(kNumAlignBits);
507
- this.lenDecoder = new LenDecoder();
508
- this.repLenDecoder = new LenDecoder();
509
- this.literalDecoder = new LiteralDecoder();
510
- for(let i = 0; i < kNumLenToPosStates; i++){
511
- this.posSlotDecoder[i] = new BitTreeDecoder(kNumPosSlotBits);
512
- }
513
- this.dictionarySize = -1;
514
- this.dictionarySizeCheck = -1;
515
- this.posStateMask = 0;
516
- this.state = 0;
517
- this.rep0 = 0;
518
- this.rep1 = 0;
519
- this.rep2 = 0;
520
- this.rep3 = 0;
521
- this.prevByte = 0;
522
- this.totalPos = 0;
523
- }
524
- }
525
- /**
526
- * Decode LZMA1 data synchronously
527
- * @param input - Compressed data (without 5-byte properties header)
528
- * @param properties - 5-byte LZMA properties
529
- * @param outSize - Expected output size
530
- * @param outputSink - Optional output sink for zero-copy decoding (returns bytes written)
531
- * @returns Decompressed data (or bytes written if outputSink provided)
532
- */ export function decodeLzma(input, properties, outSize, outputSink) {
533
- const decoder = new LzmaDecoder(outputSink);
534
- decoder.setDecoderProperties(properties);
535
- if (outputSink) {
536
- // Zero-copy mode: write to sink during decode
537
- const bytesWritten = decoder.decodeWithSink(input, 0, outSize, false);
538
- decoder.flushOutWindow();
539
- return bytesWritten;
540
- }
541
- // Buffering mode: pre-allocated buffer, direct writes (zero-copy)
542
- return decoder.decode(input, 0, outSize, false);
543
- }
@@ -1 +0,0 @@
1
- {"version":3,"sources":["/Users/kevin/Dev/OpenSource/iterators/7z-iterator/src/lzma/sync/LzmaDecoder.ts"],"sourcesContent":["/**\n * Synchronous LZMA1 Decoder\n *\n * Decodes LZMA1 compressed data from a buffer.\n * All operations are synchronous.\n */\n\nimport { allocBufferUnsafe } from 'extract-base-iterator';\nimport {\n getLenToPosState,\n initBitModels,\n kEndPosModelIndex,\n kMatchMinLen,\n kNumAlignBits,\n kNumFullDistances,\n kNumLenToPosStates,\n kNumLitContextBitsMax,\n kNumPosSlotBits,\n kNumPosStatesBitsMax,\n kNumStates,\n kStartPosModelIndex,\n type OutputSink,\n parseProperties,\n stateIsCharState,\n stateUpdateChar,\n stateUpdateMatch,\n stateUpdateRep,\n stateUpdateShortRep,\n} from '../types.ts';\nimport { BitTreeDecoder, RangeDecoder, reverseDecodeFromArray } from './RangeDecoder.ts';\n\n/**\n * Length decoder for match/rep lengths\n */\nclass LenDecoder {\n private choice: Uint16Array;\n private lowCoder: BitTreeDecoder[];\n private midCoder: BitTreeDecoder[];\n private highCoder: BitTreeDecoder;\n private numPosStates: number;\n\n constructor() {\n this.choice = initBitModels(null, 2);\n this.lowCoder = [];\n this.midCoder = [];\n this.highCoder = new BitTreeDecoder(8);\n this.numPosStates = 0;\n }\n\n create(numPosStates: number): void {\n for (; this.numPosStates < numPosStates; this.numPosStates++) {\n this.lowCoder[this.numPosStates] = new BitTreeDecoder(3);\n this.midCoder[this.numPosStates] = new BitTreeDecoder(3);\n }\n }\n\n init(): void {\n initBitModels(this.choice);\n for (let i = this.numPosStates - 1; i >= 0; i--) {\n this.lowCoder[i].init();\n this.midCoder[i].init();\n }\n this.highCoder.init();\n }\n\n decode(rangeDecoder: RangeDecoder, posState: number): number {\n if (rangeDecoder.decodeBit(this.choice, 0) === 0) {\n return this.lowCoder[posState].decode(rangeDecoder);\n }\n if (rangeDecoder.decodeBit(this.choice, 1) === 0) {\n return 8 + this.midCoder[posState].decode(rangeDecoder);\n }\n return 16 + this.highCoder.decode(rangeDecoder);\n }\n}\n\n/**\n * Single literal decoder (decodes one byte)\n */\nclass LiteralDecoder2 {\n private decoders: Uint16Array;\n\n constructor() {\n this.decoders = initBitModels(null, 0x300);\n }\n\n init(): void {\n initBitModels(this.decoders);\n }\n\n decodeNormal(rangeDecoder: RangeDecoder): number {\n let symbol = 1;\n do {\n symbol = (symbol << 1) | rangeDecoder.decodeBit(this.decoders, symbol);\n } while (symbol < 0x100);\n return symbol & 0xff;\n }\n\n decodeWithMatchByte(rangeDecoder: RangeDecoder, matchByte: number): number {\n let symbol = 1;\n do {\n const matchBit = (matchByte >> 7) & 1;\n matchByte <<= 1;\n const bit = rangeDecoder.decodeBit(this.decoders, ((1 + matchBit) << 8) + symbol);\n symbol = (symbol << 1) | bit;\n if (matchBit !== bit) {\n while (symbol < 0x100) {\n symbol = (symbol << 1) | rangeDecoder.decodeBit(this.decoders, symbol);\n }\n break;\n }\n } while (symbol < 0x100);\n return symbol & 0xff;\n }\n}\n\n/**\n * Literal decoder (array of single decoders)\n */\nclass LiteralDecoder {\n private numPosBits: number;\n private numPrevBits: number;\n private posMask: number;\n private coders: (LiteralDecoder2 | undefined)[];\n\n constructor() {\n this.numPosBits = 0;\n this.numPrevBits = 0;\n this.posMask = 0;\n this.coders = [];\n }\n\n create(numPosBits: number, numPrevBits: number): void {\n if (this.coders.length > 0 && this.numPrevBits === numPrevBits && this.numPosBits === numPosBits) {\n return;\n }\n this.numPosBits = numPosBits;\n this.posMask = (1 << numPosBits) - 1;\n this.numPrevBits = numPrevBits;\n this.coders = [];\n }\n\n init(): void {\n for (let i = 0; i < this.coders.length; i++) {\n if (this.coders[i]) {\n this.coders[i]?.init();\n }\n }\n }\n\n getDecoder(pos: number, prevByte: number): LiteralDecoder2 {\n const index = ((pos & this.posMask) << this.numPrevBits) + ((prevByte & 0xff) >>> (8 - this.numPrevBits));\n let decoder = this.coders[index];\n if (!decoder) {\n decoder = new LiteralDecoder2();\n this.coders[index] = decoder;\n }\n return decoder;\n }\n}\n\n/**\n * Output window (sliding dictionary)\n */\nclass OutWindow {\n private buffer: Buffer;\n private windowSize: number;\n private pos: number;\n private sink?: {\n write(buffer: Buffer): void;\n };\n private streamPos: number;\n\n constructor(sink?: OutputSink) {\n this.buffer = allocBufferUnsafe(0); // Replaced by create() before use\n this.windowSize = 0;\n this.pos = 0;\n this.sink = sink;\n this.streamPos = 0;\n }\n\n create(windowSize: number): void {\n if (!this.buffer || this.windowSize !== windowSize) {\n this.buffer = allocBufferUnsafe(windowSize);\n }\n this.windowSize = windowSize;\n this.pos = 0;\n this.streamPos = 0;\n }\n\n init(solid: boolean): void {\n if (!solid) {\n this.pos = 0;\n this.streamPos = 0;\n }\n }\n\n putByte(b: number): void {\n this.buffer[this.pos++] = b;\n if (this.pos >= this.windowSize) {\n if (this.sink) {\n this.flush();\n this.pos = 0;\n } else {\n this.pos = 0;\n }\n }\n }\n\n flush(): void {\n const size = this.pos - this.streamPos;\n if (size > 0 && this.sink) {\n const chunk = this.buffer.slice(this.streamPos, this.streamPos + size);\n this.sink.write(chunk);\n this.streamPos = this.pos;\n }\n }\n\n getByte(distance: number): number {\n let pos = this.pos - distance - 1;\n if (pos < 0) {\n pos += this.windowSize;\n }\n return this.buffer[pos];\n }\n\n copyBlock(distance: number, len: number): void {\n let pos = this.pos - distance - 1;\n if (pos < 0) {\n pos += this.windowSize;\n }\n for (let i = 0; i < len; i++) {\n if (pos >= this.windowSize) {\n pos = 0;\n }\n this.putByte(this.buffer[pos++]);\n }\n }\n\n /**\n * Copy decoded data to output buffer\n */\n copyTo(output: Buffer, outputOffset: number, count: number): void {\n const srcPos = this.pos - count;\n if (srcPos < 0) {\n // Wrap around case - data spans end and beginning of buffer\n const firstPart = -srcPos;\n this.buffer.copy(output, outputOffset, this.windowSize + srcPos, this.windowSize);\n this.buffer.copy(output, outputOffset + firstPart, 0, count - firstPart);\n } else {\n this.buffer.copy(output, outputOffset, srcPos, srcPos + count);\n }\n }\n}\n\n/**\n * Synchronous LZMA1 decoder\n */\nexport class LzmaDecoder {\n private outWindow: OutWindow;\n private rangeDecoder: RangeDecoder;\n\n // Probability models\n private isMatchDecoders: Uint16Array;\n private isRepDecoders: Uint16Array;\n private isRepG0Decoders: Uint16Array;\n private isRepG1Decoders: Uint16Array;\n private isRepG2Decoders: Uint16Array;\n private isRep0LongDecoders: Uint16Array;\n private posSlotDecoder: BitTreeDecoder[];\n private posDecoders: Uint16Array;\n private posAlignDecoder: BitTreeDecoder;\n private lenDecoder: LenDecoder;\n private repLenDecoder: LenDecoder;\n private literalDecoder: LiteralDecoder;\n\n // Properties\n private dictionarySize: number;\n private dictionarySizeCheck: number;\n private posStateMask: number;\n\n // State (preserved across solid calls)\n private state: number;\n private rep0: number;\n private rep1: number;\n private rep2: number;\n private rep3: number;\n private prevByte: number;\n private totalPos: number;\n\n constructor(outputSink?: OutputSink) {\n this.outWindow = new OutWindow(outputSink);\n this.rangeDecoder = new RangeDecoder();\n\n this.isMatchDecoders = initBitModels(null, kNumStates << kNumPosStatesBitsMax);\n this.isRepDecoders = initBitModels(null, kNumStates);\n this.isRepG0Decoders = initBitModels(null, kNumStates);\n this.isRepG1Decoders = initBitModels(null, kNumStates);\n this.isRepG2Decoders = initBitModels(null, kNumStates);\n this.isRep0LongDecoders = initBitModels(null, kNumStates << kNumPosStatesBitsMax);\n this.posSlotDecoder = [];\n this.posDecoders = initBitModels(null, kNumFullDistances - kEndPosModelIndex);\n this.posAlignDecoder = new BitTreeDecoder(kNumAlignBits);\n this.lenDecoder = new LenDecoder();\n this.repLenDecoder = new LenDecoder();\n this.literalDecoder = new LiteralDecoder();\n\n for (let i = 0; i < kNumLenToPosStates; i++) {\n this.posSlotDecoder[i] = new BitTreeDecoder(kNumPosSlotBits);\n }\n\n this.dictionarySize = -1;\n this.dictionarySizeCheck = -1;\n this.posStateMask = 0;\n\n this.state = 0;\n this.rep0 = 0;\n this.rep1 = 0;\n this.rep2 = 0;\n this.rep3 = 0;\n this.prevByte = 0;\n this.totalPos = 0;\n }\n\n /**\n * Set dictionary size\n */\n setDictionarySize(dictionarySize: number): boolean {\n if (dictionarySize < 0) return false;\n if (this.dictionarySize !== dictionarySize) {\n this.dictionarySize = dictionarySize;\n this.dictionarySizeCheck = Math.max(dictionarySize, 1);\n this.outWindow.create(Math.max(this.dictionarySizeCheck, 1 << 12));\n }\n return true;\n }\n\n /**\n * Set lc, lp, pb properties\n */\n setLcLpPb(lc: number, lp: number, pb: number): boolean {\n if (lc > kNumLitContextBitsMax || lp > 4 || pb > kNumPosStatesBitsMax) {\n return false;\n }\n const numPosStates = 1 << pb;\n this.literalDecoder.create(lp, lc);\n this.lenDecoder.create(numPosStates);\n this.repLenDecoder.create(numPosStates);\n this.posStateMask = numPosStates - 1;\n return true;\n }\n\n /**\n * Set decoder properties from 5-byte buffer\n */\n setDecoderProperties(properties: Buffer | Uint8Array): boolean {\n const props = parseProperties(properties);\n if (!this.setLcLpPb(props.lc, props.lp, props.pb)) return false;\n return this.setDictionarySize(props.dictionarySize);\n }\n\n /**\n * Initialize probability tables\n */\n private initProbabilities(): void {\n initBitModels(this.isMatchDecoders);\n initBitModels(this.isRepDecoders);\n initBitModels(this.isRepG0Decoders);\n initBitModels(this.isRepG1Decoders);\n initBitModels(this.isRepG2Decoders);\n initBitModels(this.isRep0LongDecoders);\n initBitModels(this.posDecoders);\n this.literalDecoder.init();\n for (let i = kNumLenToPosStates - 1; i >= 0; i--) {\n this.posSlotDecoder[i].init();\n }\n this.lenDecoder.init();\n this.repLenDecoder.init();\n this.posAlignDecoder.init();\n }\n\n /**\n * Reset probabilities only (for LZMA2 state reset)\n */\n resetProbabilities(): void {\n this.initProbabilities();\n this.state = 0;\n this.rep0 = 0;\n this.rep1 = 0;\n this.rep2 = 0;\n this.rep3 = 0;\n }\n\n /**\n * Reset dictionary position (for LZMA2 dictionary reset)\n */\n resetDictionary(): void {\n this.outWindow.init(false);\n this.totalPos = 0;\n }\n\n /**\n * Feed uncompressed data into the dictionary (for LZMA2 uncompressed chunks)\n * This updates the sliding window so subsequent LZMA chunks can reference this data.\n */\n feedUncompressed(data: Buffer): void {\n for (let i = 0; i < data.length; i++) {\n this.outWindow.putByte(data[i]);\n }\n this.totalPos += data.length;\n if (data.length > 0) {\n this.prevByte = data[data.length - 1];\n }\n }\n\n /**\n * Flush any remaining data in the OutWindow to the sink\n */\n flushOutWindow(): void {\n this.outWindow.flush();\n }\n\n /**\n * Decode LZMA data with streaming output (no buffer accumulation)\n * @param input - Compressed input buffer\n * @param inputOffset - Offset into input buffer\n * @param outSize - Expected output size\n * @param solid - If true, preserve state from previous decode\n * @returns Number of bytes written to sink\n */\n decodeWithSink(input: Buffer, inputOffset: number, outSize: number, solid = false): number {\n this.rangeDecoder.setInput(input, inputOffset);\n\n if (!solid) {\n this.outWindow.init(false);\n this.initProbabilities();\n this.state = 0;\n this.rep0 = 0;\n this.rep1 = 0;\n this.rep2 = 0;\n this.rep3 = 0;\n this.prevByte = 0;\n this.totalPos = 0;\n } else {\n this.outWindow.init(true);\n }\n\n let outPos = 0;\n let cumPos = this.totalPos;\n\n while (outPos < outSize) {\n const posState = cumPos & this.posStateMask;\n\n if (this.rangeDecoder.decodeBit(this.isMatchDecoders, (this.state << kNumPosStatesBitsMax) + posState) === 0) {\n // Literal\n const decoder2 = this.literalDecoder.getDecoder(cumPos, this.prevByte);\n if (!stateIsCharState(this.state)) {\n this.prevByte = decoder2.decodeWithMatchByte(this.rangeDecoder, this.outWindow.getByte(this.rep0));\n } else {\n this.prevByte = decoder2.decodeNormal(this.rangeDecoder);\n }\n this.outWindow.putByte(this.prevByte);\n outPos++;\n this.state = stateUpdateChar(this.state);\n cumPos++;\n } else {\n // Match or rep\n let len: number;\n\n if (this.rangeDecoder.decodeBit(this.isRepDecoders, this.state) === 1) {\n // Rep match\n len = 0;\n if (this.rangeDecoder.decodeBit(this.isRepG0Decoders, this.state) === 0) {\n if (this.rangeDecoder.decodeBit(this.isRep0LongDecoders, (this.state << kNumPosStatesBitsMax) + posState) === 0) {\n this.state = stateUpdateShortRep(this.state);\n len = 1;\n }\n } else {\n let distance: number;\n if (this.rangeDecoder.decodeBit(this.isRepG1Decoders, this.state) === 0) {\n distance = this.rep1;\n } else {\n if (this.rangeDecoder.decodeBit(this.isRepG2Decoders, this.state) === 0) {\n distance = this.rep2;\n } else {\n distance = this.rep3;\n this.rep3 = this.rep2;\n }\n this.rep2 = this.rep1;\n }\n this.rep1 = this.rep0;\n this.rep0 = distance;\n }\n if (len === 0) {\n len = kMatchMinLen + this.repLenDecoder.decode(this.rangeDecoder, posState);\n this.state = stateUpdateRep(this.state);\n }\n } else {\n // Normal match\n this.rep3 = this.rep2;\n this.rep2 = this.rep1;\n this.rep1 = this.rep0;\n len = kMatchMinLen + this.lenDecoder.decode(this.rangeDecoder, posState);\n this.state = stateUpdateMatch(this.state);\n\n const posSlot = this.posSlotDecoder[getLenToPosState(len)].decode(this.rangeDecoder);\n if (posSlot >= kStartPosModelIndex) {\n const numDirectBits = (posSlot >> 1) - 1;\n this.rep0 = (2 | (posSlot & 1)) << numDirectBits;\n if (posSlot < kEndPosModelIndex) {\n this.rep0 += reverseDecodeFromArray(this.posDecoders, this.rep0 - posSlot - 1, this.rangeDecoder, numDirectBits);\n } else {\n this.rep0 += this.rangeDecoder.decodeDirectBits(numDirectBits - kNumAlignBits) << kNumAlignBits;\n this.rep0 += this.posAlignDecoder.reverseDecode(this.rangeDecoder);\n if (this.rep0 < 0) {\n if (this.rep0 === -1) break;\n throw new Error('LZMA: Invalid distance');\n }\n }\n } else {\n this.rep0 = posSlot;\n }\n }\n\n if (this.rep0 >= cumPos || this.rep0 >= this.dictionarySizeCheck) {\n throw new Error('LZMA: Invalid distance');\n }\n\n // Copy match bytes\n for (let i = 0; i < len; i++) {\n const b = this.outWindow.getByte(this.rep0);\n this.outWindow.putByte(b);\n outPos++;\n }\n cumPos += len;\n this.prevByte = this.outWindow.getByte(0);\n }\n }\n\n this.totalPos = cumPos;\n return outPos;\n }\n\n /**\n * Decode LZMA data\n * @param input - Compressed input buffer\n * @param inputOffset - Offset into input buffer\n * @param outSize - Expected output size\n * @param solid - If true, preserve state from previous decode\n * @returns Decompressed data\n */\n decode(input: Buffer, inputOffset: number, outSize: number, solid = false): Buffer {\n this.rangeDecoder.setInput(input, inputOffset);\n\n if (!solid) {\n this.outWindow.init(false);\n this.initProbabilities();\n this.state = 0;\n this.rep0 = 0;\n this.rep1 = 0;\n this.rep2 = 0;\n this.rep3 = 0;\n this.prevByte = 0;\n this.totalPos = 0;\n } else {\n // Solid mode: preserve dictionary state but reinitialize range decoder\n this.outWindow.init(true);\n }\n\n const output = allocBufferUnsafe(outSize);\n let outPos = 0;\n let cumPos = this.totalPos;\n\n while (outPos < outSize) {\n const posState = cumPos & this.posStateMask;\n\n if (this.rangeDecoder.decodeBit(this.isMatchDecoders, (this.state << kNumPosStatesBitsMax) + posState) === 0) {\n // Literal\n const decoder2 = this.literalDecoder.getDecoder(cumPos, this.prevByte);\n if (!stateIsCharState(this.state)) {\n this.prevByte = decoder2.decodeWithMatchByte(this.rangeDecoder, this.outWindow.getByte(this.rep0));\n } else {\n this.prevByte = decoder2.decodeNormal(this.rangeDecoder);\n }\n this.outWindow.putByte(this.prevByte);\n output[outPos++] = this.prevByte;\n this.state = stateUpdateChar(this.state);\n cumPos++;\n } else {\n // Match or rep\n let len: number;\n\n if (this.rangeDecoder.decodeBit(this.isRepDecoders, this.state) === 1) {\n // Rep match\n len = 0;\n if (this.rangeDecoder.decodeBit(this.isRepG0Decoders, this.state) === 0) {\n if (this.rangeDecoder.decodeBit(this.isRep0LongDecoders, (this.state << kNumPosStatesBitsMax) + posState) === 0) {\n this.state = stateUpdateShortRep(this.state);\n len = 1;\n }\n } else {\n let distance: number;\n if (this.rangeDecoder.decodeBit(this.isRepG1Decoders, this.state) === 0) {\n distance = this.rep1;\n } else {\n if (this.rangeDecoder.decodeBit(this.isRepG2Decoders, this.state) === 0) {\n distance = this.rep2;\n } else {\n distance = this.rep3;\n this.rep3 = this.rep2;\n }\n this.rep2 = this.rep1;\n }\n this.rep1 = this.rep0;\n this.rep0 = distance;\n }\n if (len === 0) {\n len = kMatchMinLen + this.repLenDecoder.decode(this.rangeDecoder, posState);\n this.state = stateUpdateRep(this.state);\n }\n } else {\n // Normal match\n this.rep3 = this.rep2;\n this.rep2 = this.rep1;\n this.rep1 = this.rep0;\n len = kMatchMinLen + this.lenDecoder.decode(this.rangeDecoder, posState);\n this.state = stateUpdateMatch(this.state);\n\n const posSlot = this.posSlotDecoder[getLenToPosState(len)].decode(this.rangeDecoder);\n if (posSlot >= kStartPosModelIndex) {\n const numDirectBits = (posSlot >> 1) - 1;\n this.rep0 = (2 | (posSlot & 1)) << numDirectBits;\n if (posSlot < kEndPosModelIndex) {\n this.rep0 += reverseDecodeFromArray(this.posDecoders, this.rep0 - posSlot - 1, this.rangeDecoder, numDirectBits);\n } else {\n this.rep0 += this.rangeDecoder.decodeDirectBits(numDirectBits - kNumAlignBits) << kNumAlignBits;\n this.rep0 += this.posAlignDecoder.reverseDecode(this.rangeDecoder);\n if (this.rep0 < 0) {\n if (this.rep0 === -1) break; // End marker\n throw new Error('LZMA: Invalid distance');\n }\n }\n } else {\n this.rep0 = posSlot;\n }\n }\n\n if (this.rep0 >= cumPos || this.rep0 >= this.dictionarySizeCheck) {\n throw new Error('LZMA: Invalid distance');\n }\n\n // Copy match bytes\n for (let i = 0; i < len; i++) {\n const b = this.outWindow.getByte(this.rep0);\n this.outWindow.putByte(b);\n output[outPos++] = b;\n }\n cumPos += len;\n this.prevByte = this.outWindow.getByte(0);\n }\n }\n\n this.totalPos = cumPos;\n return output;\n }\n}\n\n/**\n * Decode LZMA1 data synchronously\n * @param input - Compressed data (without 5-byte properties header)\n * @param properties - 5-byte LZMA properties\n * @param outSize - Expected output size\n * @param outputSink - Optional output sink for zero-copy decoding (returns bytes written)\n * @returns Decompressed data (or bytes written if outputSink provided)\n */\nexport function decodeLzma(input: Buffer, properties: Buffer | Uint8Array, outSize: number, outputSink?: OutputSink): Buffer | number {\n const decoder = new LzmaDecoder(outputSink);\n decoder.setDecoderProperties(properties);\n if (outputSink) {\n // Zero-copy mode: write to sink during decode\n const bytesWritten = decoder.decodeWithSink(input, 0, outSize, false);\n decoder.flushOutWindow();\n return bytesWritten;\n }\n // Buffering mode: pre-allocated buffer, direct writes (zero-copy)\n return decoder.decode(input, 0, outSize, false);\n}\n"],"names":["allocBufferUnsafe","getLenToPosState","initBitModels","kEndPosModelIndex","kMatchMinLen","kNumAlignBits","kNumFullDistances","kNumLenToPosStates","kNumLitContextBitsMax","kNumPosSlotBits","kNumPosStatesBitsMax","kNumStates","kStartPosModelIndex","parseProperties","stateIsCharState","stateUpdateChar","stateUpdateMatch","stateUpdateRep","stateUpdateShortRep","BitTreeDecoder","RangeDecoder","reverseDecodeFromArray","LenDecoder","create","numPosStates","lowCoder","midCoder","init","choice","i","highCoder","decode","rangeDecoder","posState","decodeBit","LiteralDecoder2","decoders","decodeNormal","symbol","decodeWithMatchByte","matchByte","matchBit","bit","LiteralDecoder","numPosBits","numPrevBits","coders","length","posMask","getDecoder","pos","prevByte","index","decoder","OutWindow","windowSize","buffer","streamPos","solid","putByte","b","sink","flush","size","chunk","slice","write","getByte","distance","copyBlock","len","copyTo","output","outputOffset","count","srcPos","firstPart","copy","LzmaDecoder","setDictionarySize","dictionarySize","dictionarySizeCheck","Math","max","outWindow","setLcLpPb","lc","lp","pb","literalDecoder","lenDecoder","repLenDecoder","posStateMask","setDecoderProperties","properties","props","initProbabilities","isMatchDecoders","isRepDecoders","isRepG0Decoders","isRepG1Decoders","isRepG2Decoders","isRep0LongDecoders","posDecoders","posSlotDecoder","posAlignDecoder","resetProbabilities","state","rep0","rep1","rep2","rep3","resetDictionary","totalPos","feedUncompressed","data","flushOutWindow","decodeWithSink","input","inputOffset","outSize","setInput","outPos","cumPos","decoder2","posSlot","numDirectBits","decodeDirectBits","reverseDecode","Error","outputSink","decodeLzma","bytesWritten"],"mappings":"AAAA;;;;;CAKC,GAED,SAASA,iBAAiB,QAAQ,wBAAwB;AAC1D,SACEC,gBAAgB,EAChBC,aAAa,EACbC,iBAAiB,EACjBC,YAAY,EACZC,aAAa,EACbC,iBAAiB,EACjBC,kBAAkB,EAClBC,qBAAqB,EACrBC,eAAe,EACfC,oBAAoB,EACpBC,UAAU,EACVC,mBAAmB,EAEnBC,eAAe,EACfC,gBAAgB,EAChBC,eAAe,EACfC,gBAAgB,EAChBC,cAAc,EACdC,mBAAmB,QACd,cAAc;AACrB,SAASC,cAAc,EAAEC,YAAY,EAAEC,sBAAsB,QAAQ,oBAAoB;AAEzF;;CAEC,GACD,IAAA,AAAMC,aAAN,MAAMA;IAeJC,OAAOC,YAAoB,EAAQ;QACjC,MAAO,IAAI,CAACA,YAAY,GAAGA,cAAc,IAAI,CAACA,YAAY,GAAI;YAC5D,IAAI,CAACC,QAAQ,CAAC,IAAI,CAACD,YAAY,CAAC,GAAG,IAAIL,eAAe;YACtD,IAAI,CAACO,QAAQ,CAAC,IAAI,CAACF,YAAY,CAAC,GAAG,IAAIL,eAAe;QACxD;IACF;IAEAQ,OAAa;QACXzB,cAAc,IAAI,CAAC0B,MAAM;QACzB,IAAK,IAAIC,IAAI,IAAI,CAACL,YAAY,GAAG,GAAGK,KAAK,GAAGA,IAAK;YAC/C,IAAI,CAACJ,QAAQ,CAACI,EAAE,CAACF,IAAI;YACrB,IAAI,CAACD,QAAQ,CAACG,EAAE,CAACF,IAAI;QACvB;QACA,IAAI,CAACG,SAAS,CAACH,IAAI;IACrB;IAEAI,OAAOC,YAA0B,EAAEC,QAAgB,EAAU;QAC3D,IAAID,aAAaE,SAAS,CAAC,IAAI,CAACN,MAAM,EAAE,OAAO,GAAG;YAChD,OAAO,IAAI,CAACH,QAAQ,CAACQ,SAAS,CAACF,MAAM,CAACC;QACxC;QACA,IAAIA,aAAaE,SAAS,CAAC,IAAI,CAACN,MAAM,EAAE,OAAO,GAAG;YAChD,OAAO,IAAI,IAAI,CAACF,QAAQ,CAACO,SAAS,CAACF,MAAM,CAACC;QAC5C;QACA,OAAO,KAAK,IAAI,CAACF,SAAS,CAACC,MAAM,CAACC;IACpC;IAhCA,aAAc;QACZ,IAAI,CAACJ,MAAM,GAAG1B,cAAc,MAAM;QAClC,IAAI,CAACuB,QAAQ,GAAG,EAAE;QAClB,IAAI,CAACC,QAAQ,GAAG,EAAE;QAClB,IAAI,CAACI,SAAS,GAAG,IAAIX,eAAe;QACpC,IAAI,CAACK,YAAY,GAAG;IACtB;AA2BF;AAEA;;CAEC,GACD,IAAA,AAAMW,kBAAN,MAAMA;IAOJR,OAAa;QACXzB,cAAc,IAAI,CAACkC,QAAQ;IAC7B;IAEAC,aAAaL,YAA0B,EAAU;QAC/C,IAAIM,SAAS;QACb,GAAG;YACDA,SAAS,AAACA,UAAU,IAAKN,aAAaE,SAAS,CAAC,IAAI,CAACE,QAAQ,EAAEE;QACjE,QAASA,SAAS,MAAO;QACzB,OAAOA,SAAS;IAClB;IAEAC,oBAAoBP,YAA0B,EAAEQ,SAAiB,EAAU;QACzE,IAAIF,SAAS;QACb,GAAG;YACD,MAAMG,WAAW,AAACD,aAAa,IAAK;YACpCA,cAAc;YACd,MAAME,MAAMV,aAAaE,SAAS,CAAC,IAAI,CAACE,QAAQ,EAAE,AAAC,CAAA,AAAC,IAAIK,YAAa,CAAA,IAAKH;YAC1EA,SAAS,AAACA,UAAU,IAAKI;YACzB,IAAID,aAAaC,KAAK;gBACpB,MAAOJ,SAAS,MAAO;oBACrBA,SAAS,AAACA,UAAU,IAAKN,aAAaE,SAAS,CAAC,IAAI,CAACE,QAAQ,EAAEE;gBACjE;gBACA;YACF;QACF,QAASA,SAAS,MAAO;QACzB,OAAOA,SAAS;IAClB;IA/BA,aAAc;QACZ,IAAI,CAACF,QAAQ,GAAGlC,cAAc,MAAM;IACtC;AA8BF;AAEA;;CAEC,GACD,IAAA,AAAMyC,iBAAN,MAAMA;IAaJpB,OAAOqB,UAAkB,EAAEC,WAAmB,EAAQ;QACpD,IAAI,IAAI,CAACC,MAAM,CAACC,MAAM,GAAG,KAAK,IAAI,CAACF,WAAW,KAAKA,eAAe,IAAI,CAACD,UAAU,KAAKA,YAAY;YAChG;QACF;QACA,IAAI,CAACA,UAAU,GAAGA;QAClB,IAAI,CAACI,OAAO,GAAG,AAAC,CAAA,KAAKJ,UAAS,IAAK;QACnC,IAAI,CAACC,WAAW,GAAGA;QACnB,IAAI,CAACC,MAAM,GAAG,EAAE;IAClB;IAEAnB,OAAa;QACX,IAAK,IAAIE,IAAI,GAAGA,IAAI,IAAI,CAACiB,MAAM,CAACC,MAAM,EAAElB,IAAK;YAC3C,IAAI,IAAI,CAACiB,MAAM,CAACjB,EAAE,EAAE;oBAClB;iBAAA,iBAAA,IAAI,CAACiB,MAAM,CAACjB,EAAE,cAAd,qCAAA,eAAgBF,IAAI;YACtB;QACF;IACF;IAEAsB,WAAWC,GAAW,EAAEC,QAAgB,EAAmB;QACzD,MAAMC,QAAQ,AAAC,CAAA,AAACF,CAAAA,MAAM,IAAI,CAACF,OAAO,AAAD,KAAM,IAAI,CAACH,WAAW,AAAD,IAAM,CAAA,AAACM,CAAAA,WAAW,IAAG,MAAQ,IAAI,IAAI,CAACN,WAAW;QACvG,IAAIQ,UAAU,IAAI,CAACP,MAAM,CAACM,MAAM;QAChC,IAAI,CAACC,SAAS;YACZA,UAAU,IAAIlB;YACd,IAAI,CAACW,MAAM,CAACM,MAAM,GAAGC;QACvB;QACA,OAAOA;IACT;IAjCA,aAAc;QACZ,IAAI,CAACT,UAAU,GAAG;QAClB,IAAI,CAACC,WAAW,GAAG;QACnB,IAAI,CAACG,OAAO,GAAG;QACf,IAAI,CAACF,MAAM,GAAG,EAAE;IAClB;AA6BF;AAEA;;CAEC,GACD,IAAA,AAAMQ,YAAN,MAAMA;IAiBJ/B,OAAOgC,UAAkB,EAAQ;QAC/B,IAAI,CAAC,IAAI,CAACC,MAAM,IAAI,IAAI,CAACD,UAAU,KAAKA,YAAY;YAClD,IAAI,CAACC,MAAM,GAAGxD,kBAAkBuD;QAClC;QACA,IAAI,CAACA,UAAU,GAAGA;QAClB,IAAI,CAACL,GAAG,GAAG;QACX,IAAI,CAACO,SAAS,GAAG;IACnB;IAEA9B,KAAK+B,KAAc,EAAQ;QACzB,IAAI,CAACA,OAAO;YACV,IAAI,CAACR,GAAG,GAAG;YACX,IAAI,CAACO,SAAS,GAAG;QACnB;IACF;IAEAE,QAAQC,CAAS,EAAQ;QACvB,IAAI,CAACJ,MAAM,CAAC,IAAI,CAACN,GAAG,GAAG,GAAGU;QAC1B,IAAI,IAAI,CAACV,GAAG,IAAI,IAAI,CAACK,UAAU,EAAE;YAC/B,IAAI,IAAI,CAACM,IAAI,EAAE;gBACb,IAAI,CAACC,KAAK;gBACV,IAAI,CAACZ,GAAG,GAAG;YACb,OAAO;gBACL,IAAI,CAACA,GAAG,GAAG;YACb;QACF;IACF;IAEAY,QAAc;QACZ,MAAMC,OAAO,IAAI,CAACb,GAAG,GAAG,IAAI,CAACO,SAAS;QACtC,IAAIM,OAAO,KAAK,IAAI,CAACF,IAAI,EAAE;YACzB,MAAMG,QAAQ,IAAI,CAACR,MAAM,CAACS,KAAK,CAAC,IAAI,CAACR,SAAS,EAAE,IAAI,CAACA,SAAS,GAAGM;YACjE,IAAI,CAACF,IAAI,CAACK,KAAK,CAACF;YAChB,IAAI,CAACP,SAAS,GAAG,IAAI,CAACP,GAAG;QAC3B;IACF;IAEAiB,QAAQC,QAAgB,EAAU;QAChC,IAAIlB,MAAM,IAAI,CAACA,GAAG,GAAGkB,WAAW;QAChC,IAAIlB,MAAM,GAAG;YACXA,OAAO,IAAI,CAACK,UAAU;QACxB;QACA,OAAO,IAAI,CAACC,MAAM,CAACN,IAAI;IACzB;IAEAmB,UAAUD,QAAgB,EAAEE,GAAW,EAAQ;QAC7C,IAAIpB,MAAM,IAAI,CAACA,GAAG,GAAGkB,WAAW;QAChC,IAAIlB,MAAM,GAAG;YACXA,OAAO,IAAI,CAACK,UAAU;QACxB;QACA,IAAK,IAAI1B,IAAI,GAAGA,IAAIyC,KAAKzC,IAAK;YAC5B,IAAIqB,OAAO,IAAI,CAACK,UAAU,EAAE;gBAC1BL,MAAM;YACR;YACA,IAAI,CAACS,OAAO,CAAC,IAAI,CAACH,MAAM,CAACN,MAAM;QACjC;IACF;IAEA;;GAEC,GACDqB,OAAOC,MAAc,EAAEC,YAAoB,EAAEC,KAAa,EAAQ;QAChE,MAAMC,SAAS,IAAI,CAACzB,GAAG,GAAGwB;QAC1B,IAAIC,SAAS,GAAG;YACd,4DAA4D;YAC5D,MAAMC,YAAY,CAACD;YACnB,IAAI,CAACnB,MAAM,CAACqB,IAAI,CAACL,QAAQC,cAAc,IAAI,CAAClB,UAAU,GAAGoB,QAAQ,IAAI,CAACpB,UAAU;YAChF,IAAI,CAACC,MAAM,CAACqB,IAAI,CAACL,QAAQC,eAAeG,WAAW,GAAGF,QAAQE;QAChE,OAAO;YACL,IAAI,CAACpB,MAAM,CAACqB,IAAI,CAACL,QAAQC,cAAcE,QAAQA,SAASD;QAC1D;IACF;IA/EA,YAAYb,IAAiB,CAAE;QAC7B,IAAI,CAACL,MAAM,GAAGxD,kBAAkB,IAAI,kCAAkC;QACtE,IAAI,CAACuD,UAAU,GAAG;QAClB,IAAI,CAACL,GAAG,GAAG;QACX,IAAI,CAACW,IAAI,GAAGA;QACZ,IAAI,CAACJ,SAAS,GAAG;IACnB;AA0EF;AAEA;;CAEC,GACD,OAAO,MAAMqB;IAkEX;;GAEC,GACDC,kBAAkBC,cAAsB,EAAW;QACjD,IAAIA,iBAAiB,GAAG,OAAO;QAC/B,IAAI,IAAI,CAACA,cAAc,KAAKA,gBAAgB;YAC1C,IAAI,CAACA,cAAc,GAAGA;YACtB,IAAI,CAACC,mBAAmB,GAAGC,KAAKC,GAAG,CAACH,gBAAgB;YACpD,IAAI,CAACI,SAAS,CAAC7D,MAAM,CAAC2D,KAAKC,GAAG,CAAC,IAAI,CAACF,mBAAmB,EAAE,KAAK;QAChE;QACA,OAAO;IACT;IAEA;;GAEC,GACDI,UAAUC,EAAU,EAAEC,EAAU,EAAEC,EAAU,EAAW;QACrD,IAAIF,KAAK9E,yBAAyB+E,KAAK,KAAKC,KAAK9E,sBAAsB;YACrE,OAAO;QACT;QACA,MAAMc,eAAe,KAAKgE;QAC1B,IAAI,CAACC,cAAc,CAAClE,MAAM,CAACgE,IAAID;QAC/B,IAAI,CAACI,UAAU,CAACnE,MAAM,CAACC;QACvB,IAAI,CAACmE,aAAa,CAACpE,MAAM,CAACC;QAC1B,IAAI,CAACoE,YAAY,GAAGpE,eAAe;QACnC,OAAO;IACT;IAEA;;GAEC,GACDqE,qBAAqBC,UAA+B,EAAW;QAC7D,MAAMC,QAAQlF,gBAAgBiF;QAC9B,IAAI,CAAC,IAAI,CAACT,SAAS,CAACU,MAAMT,EAAE,EAAES,MAAMR,EAAE,EAAEQ,MAAMP,EAAE,GAAG,OAAO;QAC1D,OAAO,IAAI,CAACT,iBAAiB,CAACgB,MAAMf,cAAc;IACpD;IAEA;;GAEC,GACD,AAAQgB,oBAA0B;QAChC9F,cAAc,IAAI,CAAC+F,eAAe;QAClC/F,cAAc,IAAI,CAACgG,aAAa;QAChChG,cAAc,IAAI,CAACiG,eAAe;QAClCjG,cAAc,IAAI,CAACkG,eAAe;QAClClG,cAAc,IAAI,CAACmG,eAAe;QAClCnG,cAAc,IAAI,CAACoG,kBAAkB;QACrCpG,cAAc,IAAI,CAACqG,WAAW;QAC9B,IAAI,CAACd,cAAc,CAAC9D,IAAI;QACxB,IAAK,IAAIE,IAAItB,qBAAqB,GAAGsB,KAAK,GAAGA,IAAK;YAChD,IAAI,CAAC2E,cAAc,CAAC3E,EAAE,CAACF,IAAI;QAC7B;QACA,IAAI,CAAC+D,UAAU,CAAC/D,IAAI;QACpB,IAAI,CAACgE,aAAa,CAAChE,IAAI;QACvB,IAAI,CAAC8E,eAAe,CAAC9E,IAAI;IAC3B;IAEA;;GAEC,GACD+E,qBAA2B;QACzB,IAAI,CAACV,iBAAiB;QACtB,IAAI,CAACW,KAAK,GAAG;QACb,IAAI,CAACC,IAAI,GAAG;QACZ,IAAI,CAACC,IAAI,GAAG;QACZ,IAAI,CAACC,IAAI,GAAG;QACZ,IAAI,CAACC,IAAI,GAAG;IACd;IAEA;;GAEC,GACDC,kBAAwB;QACtB,IAAI,CAAC5B,SAAS,CAACzD,IAAI,CAAC;QACpB,IAAI,CAACsF,QAAQ,GAAG;IAClB;IAEA;;;GAGC,GACDC,iBAAiBC,IAAY,EAAQ;QACnC,IAAK,IAAItF,IAAI,GAAGA,IAAIsF,KAAKpE,MAAM,EAAElB,IAAK;YACpC,IAAI,CAACuD,SAAS,CAACzB,OAAO,CAACwD,IAAI,CAACtF,EAAE;QAChC;QACA,IAAI,CAACoF,QAAQ,IAAIE,KAAKpE,MAAM;QAC5B,IAAIoE,KAAKpE,MAAM,GAAG,GAAG;YACnB,IAAI,CAACI,QAAQ,GAAGgE,IAAI,CAACA,KAAKpE,MAAM,GAAG,EAAE;QACvC;IACF;IAEA;;GAEC,GACDqE,iBAAuB;QACrB,IAAI,CAAChC,SAAS,CAACtB,KAAK;IACtB;IAEA;;;;;;;GAOC,GACDuD,eAAeC,KAAa,EAAEC,WAAmB,EAAEC,OAAe,EAAE9D,QAAQ,KAAK,EAAU;QACzF,IAAI,CAAC1B,YAAY,CAACyF,QAAQ,CAACH,OAAOC;QAElC,IAAI,CAAC7D,OAAO;YACV,IAAI,CAAC0B,SAAS,CAACzD,IAAI,CAAC;YACpB,IAAI,CAACqE,iBAAiB;YACtB,IAAI,CAACW,KAAK,GAAG;YACb,IAAI,CAACC,IAAI,GAAG;YACZ,IAAI,CAACC,IAAI,GAAG;YACZ,IAAI,CAACC,IAAI,GAAG;YACZ,IAAI,CAACC,IAAI,GAAG;YACZ,IAAI,CAAC5D,QAAQ,GAAG;YAChB,IAAI,CAAC8D,QAAQ,GAAG;QAClB,OAAO;YACL,IAAI,CAAC7B,SAAS,CAACzD,IAAI,CAAC;QACtB;QAEA,IAAI+F,SAAS;QACb,IAAIC,SAAS,IAAI,CAACV,QAAQ;QAE1B,MAAOS,SAASF,QAAS;YACvB,MAAMvF,WAAW0F,SAAS,IAAI,CAAC/B,YAAY;YAE3C,IAAI,IAAI,CAAC5D,YAAY,CAACE,SAAS,CAAC,IAAI,CAAC+D,eAAe,EAAE,AAAC,CAAA,IAAI,CAACU,KAAK,IAAIjG,oBAAmB,IAAKuB,cAAc,GAAG;gBAC5G,UAAU;gBACV,MAAM2F,WAAW,IAAI,CAACnC,cAAc,CAACxC,UAAU,CAAC0E,QAAQ,IAAI,CAACxE,QAAQ;gBACrE,IAAI,CAACrC,iBAAiB,IAAI,CAAC6F,KAAK,GAAG;oBACjC,IAAI,CAACxD,QAAQ,GAAGyE,SAASrF,mBAAmB,CAAC,IAAI,CAACP,YAAY,EAAE,IAAI,CAACoD,SAAS,CAACjB,OAAO,CAAC,IAAI,CAACyC,IAAI;gBAClG,OAAO;oBACL,IAAI,CAACzD,QAAQ,GAAGyE,SAASvF,YAAY,CAAC,IAAI,CAACL,YAAY;gBACzD;gBACA,IAAI,CAACoD,SAAS,CAACzB,OAAO,CAAC,IAAI,CAACR,QAAQ;gBACpCuE;gBACA,IAAI,CAACf,KAAK,GAAG5F,gBAAgB,IAAI,CAAC4F,KAAK;gBACvCgB;YACF,OAAO;gBACL,eAAe;gBACf,IAAIrD;gBAEJ,IAAI,IAAI,CAACtC,YAAY,CAACE,SAAS,CAAC,IAAI,CAACgE,aAAa,EAAE,IAAI,CAACS,KAAK,MAAM,GAAG;oBACrE,YAAY;oBACZrC,MAAM;oBACN,IAAI,IAAI,CAACtC,YAAY,CAACE,SAAS,CAAC,IAAI,CAACiE,eAAe,EAAE,IAAI,CAACQ,KAAK,MAAM,GAAG;wBACvE,IAAI,IAAI,CAAC3E,YAAY,CAACE,SAAS,CAAC,IAAI,CAACoE,kBAAkB,EAAE,AAAC,CAAA,IAAI,CAACK,KAAK,IAAIjG,oBAAmB,IAAKuB,cAAc,GAAG;4BAC/G,IAAI,CAAC0E,KAAK,GAAGzF,oBAAoB,IAAI,CAACyF,KAAK;4BAC3CrC,MAAM;wBACR;oBACF,OAAO;wBACL,IAAIF;wBACJ,IAAI,IAAI,CAACpC,YAAY,CAACE,SAAS,CAAC,IAAI,CAACkE,eAAe,EAAE,IAAI,CAACO,KAAK,MAAM,GAAG;4BACvEvC,WAAW,IAAI,CAACyC,IAAI;wBACtB,OAAO;4BACL,IAAI,IAAI,CAAC7E,YAAY,CAACE,SAAS,CAAC,IAAI,CAACmE,eAAe,EAAE,IAAI,CAACM,KAAK,MAAM,GAAG;gCACvEvC,WAAW,IAAI,CAAC0C,IAAI;4BACtB,OAAO;gCACL1C,WAAW,IAAI,CAAC2C,IAAI;gCACpB,IAAI,CAACA,IAAI,GAAG,IAAI,CAACD,IAAI;4BACvB;4BACA,IAAI,CAACA,IAAI,GAAG,IAAI,CAACD,IAAI;wBACvB;wBACA,IAAI,CAACA,IAAI,GAAG,IAAI,CAACD,IAAI;wBACrB,IAAI,CAACA,IAAI,GAAGxC;oBACd;oBACA,IAAIE,QAAQ,GAAG;wBACbA,MAAMlE,eAAe,IAAI,CAACuF,aAAa,CAAC5D,MAAM,CAAC,IAAI,CAACC,YAAY,EAAEC;wBAClE,IAAI,CAAC0E,KAAK,GAAG1F,eAAe,IAAI,CAAC0F,KAAK;oBACxC;gBACF,OAAO;oBACL,eAAe;oBACf,IAAI,CAACI,IAAI,GAAG,IAAI,CAACD,IAAI;oBACrB,IAAI,CAACA,IAAI,GAAG,IAAI,CAACD,IAAI;oBACrB,IAAI,CAACA,IAAI,GAAG,IAAI,CAACD,IAAI;oBACrBtC,MAAMlE,eAAe,IAAI,CAACsF,UAAU,CAAC3D,MAAM,CAAC,IAAI,CAACC,YAAY,EAAEC;oBAC/D,IAAI,CAAC0E,KAAK,GAAG3F,iBAAiB,IAAI,CAAC2F,KAAK;oBAExC,MAAMkB,UAAU,IAAI,CAACrB,cAAc,CAACvG,iBAAiBqE,KAAK,CAACvC,MAAM,CAAC,IAAI,CAACC,YAAY;oBACnF,IAAI6F,WAAWjH,qBAAqB;wBAClC,MAAMkH,gBAAgB,AAACD,CAAAA,WAAW,CAAA,IAAK;wBACvC,IAAI,CAACjB,IAAI,GAAG,AAAC,CAAA,IAAKiB,UAAU,CAAC,KAAMC;wBACnC,IAAID,UAAU1H,mBAAmB;4BAC/B,IAAI,CAACyG,IAAI,IAAIvF,uBAAuB,IAAI,CAACkF,WAAW,EAAE,IAAI,CAACK,IAAI,GAAGiB,UAAU,GAAG,IAAI,CAAC7F,YAAY,EAAE8F;wBACpG,OAAO;4BACL,IAAI,CAAClB,IAAI,IAAI,IAAI,CAAC5E,YAAY,CAAC+F,gBAAgB,CAACD,gBAAgBzH,kBAAkBA;4BAClF,IAAI,CAACuG,IAAI,IAAI,IAAI,CAACH,eAAe,CAACuB,aAAa,CAAC,IAAI,CAAChG,YAAY;4BACjE,IAAI,IAAI,CAAC4E,IAAI,GAAG,GAAG;gCACjB,IAAI,IAAI,CAACA,IAAI,KAAK,CAAC,GAAG;gCACtB,MAAM,IAAIqB,MAAM;4BAClB;wBACF;oBACF,OAAO;wBACL,IAAI,CAACrB,IAAI,GAAGiB;oBACd;gBACF;gBAEA,IAAI,IAAI,CAACjB,IAAI,IAAIe,UAAU,IAAI,CAACf,IAAI,IAAI,IAAI,CAAC3B,mBAAmB,EAAE;oBAChE,MAAM,IAAIgD,MAAM;gBAClB;gBAEA,mBAAmB;gBACnB,IAAK,IAAIpG,IAAI,GAAGA,IAAIyC,KAAKzC,IAAK;oBAC5B,MAAM+B,IAAI,IAAI,CAACwB,SAAS,CAACjB,OAAO,CAAC,IAAI,CAACyC,IAAI;oBAC1C,IAAI,CAACxB,SAAS,CAACzB,OAAO,CAACC;oBACvB8D;gBACF;gBACAC,UAAUrD;gBACV,IAAI,CAACnB,QAAQ,GAAG,IAAI,CAACiC,SAAS,CAACjB,OAAO,CAAC;YACzC;QACF;QAEA,IAAI,CAAC8C,QAAQ,GAAGU;QAChB,OAAOD;IACT;IAEA;;;;;;;GAOC,GACD3F,OAAOuF,KAAa,EAAEC,WAAmB,EAAEC,OAAe,EAAE9D,QAAQ,KAAK,EAAU;QACjF,IAAI,CAAC1B,YAAY,CAACyF,QAAQ,CAACH,OAAOC;QAElC,IAAI,CAAC7D,OAAO;YACV,IAAI,CAAC0B,SAAS,CAACzD,IAAI,CAAC;YACpB,IAAI,CAACqE,iBAAiB;YACtB,IAAI,CAACW,KAAK,GAAG;YACb,IAAI,CAACC,IAAI,GAAG;YACZ,IAAI,CAACC,IAAI,GAAG;YACZ,IAAI,CAACC,IAAI,GAAG;YACZ,IAAI,CAACC,IAAI,GAAG;YACZ,IAAI,CAAC5D,QAAQ,GAAG;YAChB,IAAI,CAAC8D,QAAQ,GAAG;QAClB,OAAO;YACL,uEAAuE;YACvE,IAAI,CAAC7B,SAAS,CAACzD,IAAI,CAAC;QACtB;QAEA,MAAM6C,SAASxE,kBAAkBwH;QACjC,IAAIE,SAAS;QACb,IAAIC,SAAS,IAAI,CAACV,QAAQ;QAE1B,MAAOS,SAASF,QAAS;YACvB,MAAMvF,WAAW0F,SAAS,IAAI,CAAC/B,YAAY;YAE3C,IAAI,IAAI,CAAC5D,YAAY,CAACE,SAAS,CAAC,IAAI,CAAC+D,eAAe,EAAE,AAAC,CAAA,IAAI,CAACU,KAAK,IAAIjG,oBAAmB,IAAKuB,cAAc,GAAG;gBAC5G,UAAU;gBACV,MAAM2F,WAAW,IAAI,CAACnC,cAAc,CAACxC,UAAU,CAAC0E,QAAQ,IAAI,CAACxE,QAAQ;gBACrE,IAAI,CAACrC,iBAAiB,IAAI,CAAC6F,KAAK,GAAG;oBACjC,IAAI,CAACxD,QAAQ,GAAGyE,SAASrF,mBAAmB,CAAC,IAAI,CAACP,YAAY,EAAE,IAAI,CAACoD,SAAS,CAACjB,OAAO,CAAC,IAAI,CAACyC,IAAI;gBAClG,OAAO;oBACL,IAAI,CAACzD,QAAQ,GAAGyE,SAASvF,YAAY,CAAC,IAAI,CAACL,YAAY;gBACzD;gBACA,IAAI,CAACoD,SAAS,CAACzB,OAAO,CAAC,IAAI,CAACR,QAAQ;gBACpCqB,MAAM,CAACkD,SAAS,GAAG,IAAI,CAACvE,QAAQ;gBAChC,IAAI,CAACwD,KAAK,GAAG5F,gBAAgB,IAAI,CAAC4F,KAAK;gBACvCgB;YACF,OAAO;gBACL,eAAe;gBACf,IAAIrD;gBAEJ,IAAI,IAAI,CAACtC,YAAY,CAACE,SAAS,CAAC,IAAI,CAACgE,aAAa,EAAE,IAAI,CAACS,KAAK,MAAM,GAAG;oBACrE,YAAY;oBACZrC,MAAM;oBACN,IAAI,IAAI,CAACtC,YAAY,CAACE,SAAS,CAAC,IAAI,CAACiE,eAAe,EAAE,IAAI,CAACQ,KAAK,MAAM,GAAG;wBACvE,IAAI,IAAI,CAAC3E,YAAY,CAACE,SAAS,CAAC,IAAI,CAACoE,kBAAkB,EAAE,AAAC,CAAA,IAAI,CAACK,KAAK,IAAIjG,oBAAmB,IAAKuB,cAAc,GAAG;4BAC/G,IAAI,CAAC0E,KAAK,GAAGzF,oBAAoB,IAAI,CAACyF,KAAK;4BAC3CrC,MAAM;wBACR;oBACF,OAAO;wBACL,IAAIF;wBACJ,IAAI,IAAI,CAACpC,YAAY,CAACE,SAAS,CAAC,IAAI,CAACkE,eAAe,EAAE,IAAI,CAACO,KAAK,MAAM,GAAG;4BACvEvC,WAAW,IAAI,CAACyC,IAAI;wBACtB,OAAO;4BACL,IAAI,IAAI,CAAC7E,YAAY,CAACE,SAAS,CAAC,IAAI,CAACmE,eAAe,EAAE,IAAI,CAACM,KAAK,MAAM,GAAG;gCACvEvC,WAAW,IAAI,CAAC0C,IAAI;4BACtB,OAAO;gCACL1C,WAAW,IAAI,CAAC2C,IAAI;gCACpB,IAAI,CAACA,IAAI,GAAG,IAAI,CAACD,IAAI;4BACvB;4BACA,IAAI,CAACA,IAAI,GAAG,IAAI,CAACD,IAAI;wBACvB;wBACA,IAAI,CAACA,IAAI,GAAG,IAAI,CAACD,IAAI;wBACrB,IAAI,CAACA,IAAI,GAAGxC;oBACd;oBACA,IAAIE,QAAQ,GAAG;wBACbA,MAAMlE,eAAe,IAAI,CAACuF,aAAa,CAAC5D,MAAM,CAAC,IAAI,CAACC,YAAY,EAAEC;wBAClE,IAAI,CAAC0E,KAAK,GAAG1F,eAAe,IAAI,CAAC0F,KAAK;oBACxC;gBACF,OAAO;oBACL,eAAe;oBACf,IAAI,CAACI,IAAI,GAAG,IAAI,CAACD,IAAI;oBACrB,IAAI,CAACA,IAAI,GAAG,IAAI,CAACD,IAAI;oBACrB,IAAI,CAACA,IAAI,GAAG,IAAI,CAACD,IAAI;oBACrBtC,MAAMlE,eAAe,IAAI,CAACsF,UAAU,CAAC3D,MAAM,CAAC,IAAI,CAACC,YAAY,EAAEC;oBAC/D,IAAI,CAAC0E,KAAK,GAAG3F,iBAAiB,IAAI,CAAC2F,KAAK;oBAExC,MAAMkB,UAAU,IAAI,CAACrB,cAAc,CAACvG,iBAAiBqE,KAAK,CAACvC,MAAM,CAAC,IAAI,CAACC,YAAY;oBACnF,IAAI6F,WAAWjH,qBAAqB;wBAClC,MAAMkH,gBAAgB,AAACD,CAAAA,WAAW,CAAA,IAAK;wBACvC,IAAI,CAACjB,IAAI,GAAG,AAAC,CAAA,IAAKiB,UAAU,CAAC,KAAMC;wBACnC,IAAID,UAAU1H,mBAAmB;4BAC/B,IAAI,CAACyG,IAAI,IAAIvF,uBAAuB,IAAI,CAACkF,WAAW,EAAE,IAAI,CAACK,IAAI,GAAGiB,UAAU,GAAG,IAAI,CAAC7F,YAAY,EAAE8F;wBACpG,OAAO;4BACL,IAAI,CAAClB,IAAI,IAAI,IAAI,CAAC5E,YAAY,CAAC+F,gBAAgB,CAACD,gBAAgBzH,kBAAkBA;4BAClF,IAAI,CAACuG,IAAI,IAAI,IAAI,CAACH,eAAe,CAACuB,aAAa,CAAC,IAAI,CAAChG,YAAY;4BACjE,IAAI,IAAI,CAAC4E,IAAI,GAAG,GAAG;gCACjB,IAAI,IAAI,CAACA,IAAI,KAAK,CAAC,GAAG,OAAO,aAAa;gCAC1C,MAAM,IAAIqB,MAAM;4BAClB;wBACF;oBACF,OAAO;wBACL,IAAI,CAACrB,IAAI,GAAGiB;oBACd;gBACF;gBAEA,IAAI,IAAI,CAACjB,IAAI,IAAIe,UAAU,IAAI,CAACf,IAAI,IAAI,IAAI,CAAC3B,mBAAmB,EAAE;oBAChE,MAAM,IAAIgD,MAAM;gBAClB;gBAEA,mBAAmB;gBACnB,IAAK,IAAIpG,IAAI,GAAGA,IAAIyC,KAAKzC,IAAK;oBAC5B,MAAM+B,IAAI,IAAI,CAACwB,SAAS,CAACjB,OAAO,CAAC,IAAI,CAACyC,IAAI;oBAC1C,IAAI,CAACxB,SAAS,CAACzB,OAAO,CAACC;oBACvBY,MAAM,CAACkD,SAAS,GAAG9D;gBACrB;gBACA+D,UAAUrD;gBACV,IAAI,CAACnB,QAAQ,GAAG,IAAI,CAACiC,SAAS,CAACjB,OAAO,CAAC;YACzC;QACF;QAEA,IAAI,CAAC8C,QAAQ,GAAGU;QAChB,OAAOnD;IACT;IAtXA,YAAY0D,UAAuB,CAAE;QACnC,IAAI,CAAC9C,SAAS,GAAG,IAAI9B,UAAU4E;QAC/B,IAAI,CAAClG,YAAY,GAAG,IAAIZ;QAExB,IAAI,CAAC6E,eAAe,GAAG/F,cAAc,MAAMS,cAAcD;QACzD,IAAI,CAACwF,aAAa,GAAGhG,cAAc,MAAMS;QACzC,IAAI,CAACwF,eAAe,GAAGjG,cAAc,MAAMS;QAC3C,IAAI,CAACyF,eAAe,GAAGlG,cAAc,MAAMS;QAC3C,IAAI,CAAC0F,eAAe,GAAGnG,cAAc,MAAMS;QAC3C,IAAI,CAAC2F,kBAAkB,GAAGpG,cAAc,MAAMS,cAAcD;QAC5D,IAAI,CAAC8F,cAAc,GAAG,EAAE;QACxB,IAAI,CAACD,WAAW,GAAGrG,cAAc,MAAMI,oBAAoBH;QAC3D,IAAI,CAACsG,eAAe,GAAG,IAAItF,eAAed;QAC1C,IAAI,CAACqF,UAAU,GAAG,IAAIpE;QACtB,IAAI,CAACqE,aAAa,GAAG,IAAIrE;QACzB,IAAI,CAACmE,cAAc,GAAG,IAAI9C;QAE1B,IAAK,IAAId,IAAI,GAAGA,IAAItB,oBAAoBsB,IAAK;YAC3C,IAAI,CAAC2E,cAAc,CAAC3E,EAAE,GAAG,IAAIV,eAAeV;QAC9C;QAEA,IAAI,CAACuE,cAAc,GAAG,CAAC;QACvB,IAAI,CAACC,mBAAmB,GAAG,CAAC;QAC5B,IAAI,CAACW,YAAY,GAAG;QAEpB,IAAI,CAACe,KAAK,GAAG;QACb,IAAI,CAACC,IAAI,GAAG;QACZ,IAAI,CAACC,IAAI,GAAG;QACZ,IAAI,CAACC,IAAI,GAAG;QACZ,IAAI,CAACC,IAAI,GAAG;QACZ,IAAI,CAAC5D,QAAQ,GAAG;QAChB,IAAI,CAAC8D,QAAQ,GAAG;IAClB;AAuVF;AAEA;;;;;;;CAOC,GACD,OAAO,SAASkB,WAAWb,KAAa,EAAExB,UAA+B,EAAE0B,OAAe,EAAEU,UAAuB;IACjH,MAAM7E,UAAU,IAAIyB,YAAYoD;IAChC7E,QAAQwC,oBAAoB,CAACC;IAC7B,IAAIoC,YAAY;QACd,8CAA8C;QAC9C,MAAME,eAAe/E,QAAQgE,cAAc,CAACC,OAAO,GAAGE,SAAS;QAC/DnE,QAAQ+D,cAAc;QACtB,OAAOgB;IACT;IACA,kEAAkE;IAClE,OAAO/E,QAAQtB,MAAM,CAACuF,OAAO,GAAGE,SAAS;AAC3C"}