blob: 97523c13f2e4d87df31c7dea65d93005d40e6c1a [file] [log] [blame]
Nadeem Vawda3ff069e2011-11-30 00:25:06 +02001from io import BytesIO, UnsupportedOperation
2import os
3import random
4import unittest
5
6from test.support import (
7 _4G, TESTFN, import_module, bigmemtest, run_unittest, unlink
8)
9
10lzma = import_module("lzma")
11from lzma import LZMACompressor, LZMADecompressor, LZMAError, LZMAFile
12
13
14class CompressorDecompressorTestCase(unittest.TestCase):
15
16 # Test error cases.
17
18 def test_simple_bad_args(self):
19 self.assertRaises(TypeError, LZMACompressor, [])
20 self.assertRaises(TypeError, LZMACompressor, format=3.45)
21 self.assertRaises(TypeError, LZMACompressor, check="")
22 self.assertRaises(TypeError, LZMACompressor, preset="asdf")
23 self.assertRaises(TypeError, LZMACompressor, filters=3)
24 # Can't specify FORMAT_AUTO when compressing.
25 self.assertRaises(ValueError, LZMACompressor, format=lzma.FORMAT_AUTO)
26 # Can't specify a preset and a custom filter chain at the same time.
27 with self.assertRaises(ValueError):
28 LZMACompressor(preset=7, filters=[{"id": lzma.FILTER_LZMA2}])
29
30 self.assertRaises(TypeError, LZMADecompressor, ())
31 self.assertRaises(TypeError, LZMADecompressor, memlimit=b"qw")
32 with self.assertRaises(TypeError):
33 LZMADecompressor(lzma.FORMAT_RAW, filters="zzz")
34 # Cannot specify a memory limit with FILTER_RAW.
35 with self.assertRaises(ValueError):
36 LZMADecompressor(lzma.FORMAT_RAW, memlimit=0x1000000)
37 # Can only specify a custom filter chain with FILTER_RAW.
38 self.assertRaises(ValueError, LZMADecompressor, filters=FILTERS_RAW_1)
39 with self.assertRaises(ValueError):
40 LZMADecompressor(format=lzma.FORMAT_XZ, filters=FILTERS_RAW_1)
41 with self.assertRaises(ValueError):
42 LZMADecompressor(format=lzma.FORMAT_ALONE, filters=FILTERS_RAW_1)
43
44 lzc = LZMACompressor()
45 self.assertRaises(TypeError, lzc.compress)
46 self.assertRaises(TypeError, lzc.compress, b"foo", b"bar")
47 self.assertRaises(TypeError, lzc.flush, b"blah")
48 empty = lzc.flush()
49 self.assertRaises(ValueError, lzc.compress, b"quux")
50 self.assertRaises(ValueError, lzc.flush)
51
52 lzd = LZMADecompressor()
53 self.assertRaises(TypeError, lzd.decompress)
54 self.assertRaises(TypeError, lzd.decompress, b"foo", b"bar")
55 lzd.decompress(empty)
56 self.assertRaises(EOFError, lzd.decompress, b"quux")
57
58 def test_bad_filter_spec(self):
59 self.assertRaises(TypeError, LZMACompressor, filters=[b"wobsite"])
60 self.assertRaises(ValueError, LZMACompressor, filters=[{"xyzzy": 3}])
61 self.assertRaises(ValueError, LZMACompressor, filters=[{"id": 98765}])
62 with self.assertRaises(ValueError):
63 LZMACompressor(filters=[{"id": lzma.FILTER_LZMA2, "foo": 0}])
64 with self.assertRaises(ValueError):
65 LZMACompressor(filters=[{"id": lzma.FILTER_DELTA, "foo": 0}])
66 with self.assertRaises(ValueError):
67 LZMACompressor(filters=[{"id": lzma.FILTER_X86, "foo": 0}])
68
69 def test_decompressor_after_eof(self):
70 lzd = LZMADecompressor()
71 lzd.decompress(COMPRESSED_XZ)
72 self.assertRaises(EOFError, lzd.decompress, b"nyan")
73
74 def test_decompressor_memlimit(self):
75 lzd = LZMADecompressor(memlimit=1024)
76 self.assertRaises(LZMAError, lzd.decompress, COMPRESSED_XZ)
77
78 lzd = LZMADecompressor(lzma.FORMAT_XZ, memlimit=1024)
79 self.assertRaises(LZMAError, lzd.decompress, COMPRESSED_XZ)
80
81 lzd = LZMADecompressor(lzma.FORMAT_ALONE, memlimit=1024)
82 self.assertRaises(LZMAError, lzd.decompress, COMPRESSED_ALONE)
83
84 # Test LZMADecompressor on known-good input data.
85
86 def _test_decompressor(self, lzd, data, check, unused_data=b""):
87 self.assertFalse(lzd.eof)
88 out = lzd.decompress(data)
89 self.assertEqual(out, INPUT)
90 self.assertEqual(lzd.check, check)
91 self.assertTrue(lzd.eof)
92 self.assertEqual(lzd.unused_data, unused_data)
93
94 def test_decompressor_auto(self):
95 lzd = LZMADecompressor()
96 self._test_decompressor(lzd, COMPRESSED_XZ, lzma.CHECK_CRC64)
97
98 lzd = LZMADecompressor()
99 self._test_decompressor(lzd, COMPRESSED_ALONE, lzma.CHECK_NONE)
100
101 def test_decompressor_xz(self):
102 lzd = LZMADecompressor(lzma.FORMAT_XZ)
103 self._test_decompressor(lzd, COMPRESSED_XZ, lzma.CHECK_CRC64)
104
105 def test_decompressor_alone(self):
106 lzd = LZMADecompressor(lzma.FORMAT_ALONE)
107 self._test_decompressor(lzd, COMPRESSED_ALONE, lzma.CHECK_NONE)
108
109 def test_decompressor_raw_1(self):
110 lzd = LZMADecompressor(lzma.FORMAT_RAW, filters=FILTERS_RAW_1)
111 self._test_decompressor(lzd, COMPRESSED_RAW_1, lzma.CHECK_NONE)
112
113 def test_decompressor_raw_2(self):
114 lzd = LZMADecompressor(lzma.FORMAT_RAW, filters=FILTERS_RAW_2)
115 self._test_decompressor(lzd, COMPRESSED_RAW_2, lzma.CHECK_NONE)
116
117 def test_decompressor_raw_3(self):
118 lzd = LZMADecompressor(lzma.FORMAT_RAW, filters=FILTERS_RAW_3)
119 self._test_decompressor(lzd, COMPRESSED_RAW_3, lzma.CHECK_NONE)
120
121 def test_decompressor_raw_4(self):
122 lzd = LZMADecompressor(lzma.FORMAT_RAW, filters=FILTERS_RAW_4)
123 self._test_decompressor(lzd, COMPRESSED_RAW_4, lzma.CHECK_NONE)
124
125 def test_decompressor_chunks(self):
126 lzd = LZMADecompressor()
127 out = []
128 for i in range(0, len(COMPRESSED_XZ), 10):
129 self.assertFalse(lzd.eof)
130 out.append(lzd.decompress(COMPRESSED_XZ[i:i+10]))
131 out = b"".join(out)
132 self.assertEqual(out, INPUT)
133 self.assertEqual(lzd.check, lzma.CHECK_CRC64)
134 self.assertTrue(lzd.eof)
135 self.assertEqual(lzd.unused_data, b"")
136
137 def test_decompressor_unused_data(self):
138 lzd = LZMADecompressor()
139 extra = b"fooblibar"
140 self._test_decompressor(lzd, COMPRESSED_XZ + extra, lzma.CHECK_CRC64,
141 unused_data=extra)
142
143 def test_decompressor_bad_input(self):
144 lzd = LZMADecompressor()
145 self.assertRaises(LZMAError, lzd.decompress, COMPRESSED_RAW_1)
146
147 lzd = LZMADecompressor(lzma.FORMAT_XZ)
148 self.assertRaises(LZMAError, lzd.decompress, COMPRESSED_ALONE)
149
150 lzd = LZMADecompressor(lzma.FORMAT_ALONE)
151 self.assertRaises(LZMAError, lzd.decompress, COMPRESSED_XZ)
152
153 lzd = LZMADecompressor(lzma.FORMAT_RAW, filters=FILTERS_RAW_1)
154 self.assertRaises(LZMAError, lzd.decompress, COMPRESSED_XZ)
155
156 # Test that LZMACompressor->LZMADecompressor preserves the input data.
157
158 def test_roundtrip_xz(self):
159 lzc = LZMACompressor()
160 cdata = lzc.compress(INPUT) + lzc.flush()
161 lzd = LZMADecompressor()
162 self._test_decompressor(lzd, cdata, lzma.CHECK_CRC64)
163
164 def test_roundtrip_alone(self):
165 lzc = LZMACompressor(lzma.FORMAT_ALONE)
166 cdata = lzc.compress(INPUT) + lzc.flush()
167 lzd = LZMADecompressor()
168 self._test_decompressor(lzd, cdata, lzma.CHECK_NONE)
169
170 def test_roundtrip_raw(self):
171 lzc = LZMACompressor(lzma.FORMAT_RAW, filters=FILTERS_RAW_4)
172 cdata = lzc.compress(INPUT) + lzc.flush()
173 lzd = LZMADecompressor(lzma.FORMAT_RAW, filters=FILTERS_RAW_4)
174 self._test_decompressor(lzd, cdata, lzma.CHECK_NONE)
175
176 def test_roundtrip_chunks(self):
177 lzc = LZMACompressor()
178 cdata = []
179 for i in range(0, len(INPUT), 10):
180 cdata.append(lzc.compress(INPUT[i:i+10]))
181 cdata.append(lzc.flush())
182 cdata = b"".join(cdata)
183 lzd = LZMADecompressor()
184 self._test_decompressor(lzd, cdata, lzma.CHECK_CRC64)
185
186 # LZMADecompressor intentionally does not handle concatenated streams.
187
188 def test_decompressor_multistream(self):
189 lzd = LZMADecompressor()
190 self._test_decompressor(lzd, COMPRESSED_XZ + COMPRESSED_ALONE,
191 lzma.CHECK_CRC64, unused_data=COMPRESSED_ALONE)
192
193 # Test with inputs larger than 4GiB.
194
195 @bigmemtest(size=_4G + 100, memuse=2)
196 def test_compressor_bigmem(self, size):
197 lzc = LZMACompressor()
198 cdata = lzc.compress(b"x" * size) + lzc.flush()
199 ddata = lzma.decompress(cdata)
200 try:
201 self.assertEqual(len(ddata), size)
202 self.assertEqual(len(ddata.strip(b"x")), 0)
203 finally:
204 ddata = None
205
206 @bigmemtest(size=_4G + 100, memuse=3)
207 def test_decompressor_bigmem(self, size):
208 lzd = LZMADecompressor()
209 blocksize = 10 * 1024 * 1024
210 block = random.getrandbits(blocksize * 8).to_bytes(blocksize, "little")
211 try:
212 input = block * (size // blocksize + 1)
213 cdata = lzma.compress(input)
214 ddata = lzd.decompress(cdata)
215 self.assertEqual(ddata, input)
216 finally:
217 input = cdata = ddata = None
218
219
220class CompressDecompressFunctionTestCase(unittest.TestCase):
221
222 # Test error cases:
223
224 def test_bad_args(self):
225 self.assertRaises(TypeError, lzma.compress)
226 self.assertRaises(TypeError, lzma.compress, [])
227 self.assertRaises(TypeError, lzma.compress, b"", format="xz")
228 self.assertRaises(TypeError, lzma.compress, b"", check="none")
229 self.assertRaises(TypeError, lzma.compress, b"", preset="blah")
230 self.assertRaises(TypeError, lzma.compress, b"", filters=1024)
231 # Can't specify a preset and a custom filter chain at the same time.
232 with self.assertRaises(ValueError):
233 lzma.compress(b"", preset=3, filters=[{"id": lzma.FILTER_LZMA2}])
234
235 self.assertRaises(TypeError, lzma.decompress)
236 self.assertRaises(TypeError, lzma.decompress, [])
237 self.assertRaises(TypeError, lzma.decompress, b"", format="lzma")
238 self.assertRaises(TypeError, lzma.decompress, b"", memlimit=7.3e9)
239 with self.assertRaises(TypeError):
240 lzma.decompress(b"", format=lzma.FORMAT_RAW, filters={})
241 # Cannot specify a memory limit with FILTER_RAW.
242 with self.assertRaises(ValueError):
243 lzma.decompress(b"", format=lzma.FORMAT_RAW, memlimit=0x1000000)
244 # Can only specify a custom filter chain with FILTER_RAW.
245 with self.assertRaises(ValueError):
246 lzma.decompress(b"", filters=FILTERS_RAW_1)
247 with self.assertRaises(ValueError):
248 lzma.decompress(b"", format=lzma.FORMAT_XZ, filters=FILTERS_RAW_1)
249 with self.assertRaises(ValueError):
250 lzma.decompress(
251 b"", format=lzma.FORMAT_ALONE, filters=FILTERS_RAW_1)
252
253 def test_decompress_memlimit(self):
254 with self.assertRaises(LZMAError):
255 lzma.decompress(COMPRESSED_XZ, memlimit=1024)
256 with self.assertRaises(LZMAError):
257 lzma.decompress(
258 COMPRESSED_XZ, format=lzma.FORMAT_XZ, memlimit=1024)
259 with self.assertRaises(LZMAError):
260 lzma.decompress(
261 COMPRESSED_ALONE, format=lzma.FORMAT_ALONE, memlimit=1024)
262
263 # Test LZMADecompressor on known-good input data.
264
265 def test_decompress_good_input(self):
266 ddata = lzma.decompress(COMPRESSED_XZ)
267 self.assertEqual(ddata, INPUT)
268
269 ddata = lzma.decompress(COMPRESSED_ALONE)
270 self.assertEqual(ddata, INPUT)
271
272 ddata = lzma.decompress(COMPRESSED_XZ, lzma.FORMAT_XZ)
273 self.assertEqual(ddata, INPUT)
274
275 ddata = lzma.decompress(COMPRESSED_ALONE, lzma.FORMAT_ALONE)
276 self.assertEqual(ddata, INPUT)
277
278 ddata = lzma.decompress(
279 COMPRESSED_RAW_1, lzma.FORMAT_RAW, filters=FILTERS_RAW_1)
280 self.assertEqual(ddata, INPUT)
281
282 ddata = lzma.decompress(
283 COMPRESSED_RAW_2, lzma.FORMAT_RAW, filters=FILTERS_RAW_2)
284 self.assertEqual(ddata, INPUT)
285
286 ddata = lzma.decompress(
287 COMPRESSED_RAW_3, lzma.FORMAT_RAW, filters=FILTERS_RAW_3)
288 self.assertEqual(ddata, INPUT)
289
290 ddata = lzma.decompress(
291 COMPRESSED_RAW_4, lzma.FORMAT_RAW, filters=FILTERS_RAW_4)
292 self.assertEqual(ddata, INPUT)
293
294 def test_decompress_incomplete_input(self):
295 self.assertRaises(LZMAError, lzma.decompress, COMPRESSED_XZ[:128])
296 self.assertRaises(LZMAError, lzma.decompress, COMPRESSED_ALONE[:128])
297 self.assertRaises(LZMAError, lzma.decompress, COMPRESSED_RAW_1[:128],
298 format=lzma.FORMAT_RAW, filters=FILTERS_RAW_1)
299 self.assertRaises(LZMAError, lzma.decompress, COMPRESSED_RAW_2[:128],
300 format=lzma.FORMAT_RAW, filters=FILTERS_RAW_2)
301 self.assertRaises(LZMAError, lzma.decompress, COMPRESSED_RAW_3[:128],
302 format=lzma.FORMAT_RAW, filters=FILTERS_RAW_3)
303 self.assertRaises(LZMAError, lzma.decompress, COMPRESSED_RAW_4[:128],
304 format=lzma.FORMAT_RAW, filters=FILTERS_RAW_4)
305
306 def test_decompress_bad_input(self):
307 with self.assertRaises(LZMAError):
308 lzma.decompress(COMPRESSED_RAW_1)
309 with self.assertRaises(LZMAError):
310 lzma.decompress(COMPRESSED_ALONE, format=lzma.FORMAT_XZ)
311 with self.assertRaises(LZMAError):
312 lzma.decompress(COMPRESSED_XZ, format=lzma.FORMAT_ALONE)
313 with self.assertRaises(LZMAError):
314 lzma.decompress(COMPRESSED_XZ, format=lzma.FORMAT_RAW,
315 filters=FILTERS_RAW_1)
316
317 # Test that compress()->decompress() preserves the input data.
318
319 def test_roundtrip(self):
320 cdata = lzma.compress(INPUT)
321 ddata = lzma.decompress(cdata)
322 self.assertEqual(ddata, INPUT)
323
324 cdata = lzma.compress(INPUT, lzma.FORMAT_XZ)
325 ddata = lzma.decompress(cdata)
326 self.assertEqual(ddata, INPUT)
327
328 cdata = lzma.compress(INPUT, lzma.FORMAT_ALONE)
329 ddata = lzma.decompress(cdata)
330 self.assertEqual(ddata, INPUT)
331
332 cdata = lzma.compress(INPUT, lzma.FORMAT_RAW, filters=FILTERS_RAW_4)
333 ddata = lzma.decompress(cdata, lzma.FORMAT_RAW, filters=FILTERS_RAW_4)
334 self.assertEqual(ddata, INPUT)
335
336 # Unlike LZMADecompressor, decompress() *does* handle concatenated streams.
337
338 def test_decompress_multistream(self):
339 ddata = lzma.decompress(COMPRESSED_XZ + COMPRESSED_ALONE)
340 self.assertEqual(ddata, INPUT * 2)
341
342
343class TempFile:
344 """Context manager - creates a file, and deletes it on __exit__."""
345
346 def __init__(self, filename, data=b""):
347 self.filename = filename
348 self.data = data
349
350 def __enter__(self):
351 with open(self.filename, "wb") as f:
352 f.write(self.data)
353
354 def __exit__(self, *args):
355 unlink(self.filename)
356
357
358class FileTestCase(unittest.TestCase):
359
360 def test_init(self):
361 with LZMAFile(fileobj=BytesIO(COMPRESSED_XZ)) as f:
362 pass
363 with LZMAFile(fileobj=BytesIO(), mode="w") as f:
364 pass
365 with LZMAFile(fileobj=BytesIO(), mode="a") as f:
366 pass
367
368 def test_init_with_filename(self):
369 with TempFile(TESTFN, COMPRESSED_XZ):
370 with LZMAFile(TESTFN) as f:
371 pass
372 with LZMAFile(TESTFN, "w") as f:
373 pass
374 with LZMAFile(TESTFN, "a") as f:
375 pass
376
377 def test_init_bad_mode(self):
378 with self.assertRaises(ValueError):
379 LZMAFile(fileobj=BytesIO(COMPRESSED_XZ), mode=(3, "x"))
380 with self.assertRaises(ValueError):
381 LZMAFile(fileobj=BytesIO(COMPRESSED_XZ), mode="")
382 with self.assertRaises(ValueError):
383 LZMAFile(fileobj=BytesIO(COMPRESSED_XZ), mode="x")
384 with self.assertRaises(ValueError):
385 LZMAFile(fileobj=BytesIO(COMPRESSED_XZ), mode="rb")
386 with self.assertRaises(ValueError):
387 LZMAFile(fileobj=BytesIO(COMPRESSED_XZ), mode="r+")
388 with self.assertRaises(ValueError):
389 LZMAFile(fileobj=BytesIO(COMPRESSED_XZ), mode="wb")
390 with self.assertRaises(ValueError):
391 LZMAFile(fileobj=BytesIO(COMPRESSED_XZ), mode="w+")
392 with self.assertRaises(ValueError):
393 LZMAFile(fileobj=BytesIO(COMPRESSED_XZ), mode="rw")
394
395 def test_init_bad_check(self):
396 with self.assertRaises(TypeError):
397 LZMAFile(fileobj=BytesIO(), mode="w", check=b"asd")
398 # CHECK_UNKNOWN and anything above CHECK_ID_MAX should be invalid.
399 with self.assertRaises(LZMAError):
400 LZMAFile(fileobj=BytesIO(), mode="w", check=lzma.CHECK_UNKNOWN)
401 with self.assertRaises(LZMAError):
402 LZMAFile(fileobj=BytesIO(), mode="w", check=lzma.CHECK_ID_MAX + 3)
403 # Cannot specify a check with mode="r".
404 with self.assertRaises(ValueError):
405 LZMAFile(fileobj=BytesIO(COMPRESSED_XZ), check=lzma.CHECK_NONE)
406 with self.assertRaises(ValueError):
407 LZMAFile(fileobj=BytesIO(COMPRESSED_XZ), check=lzma.CHECK_CRC32)
408 with self.assertRaises(ValueError):
409 LZMAFile(fileobj=BytesIO(COMPRESSED_XZ), check=lzma.CHECK_CRC64)
410 with self.assertRaises(ValueError):
411 LZMAFile(fileobj=BytesIO(COMPRESSED_XZ), check=lzma.CHECK_SHA256)
412 with self.assertRaises(ValueError):
413 LZMAFile(fileobj=BytesIO(COMPRESSED_XZ), check=lzma.CHECK_UNKNOWN)
414
415 def test_init_bad_preset(self):
416 with self.assertRaises(TypeError):
417 LZMAFile(fileobj=BytesIO(), mode="w", preset=4.39)
418 with self.assertRaises(LZMAError):
419 LZMAFile(fileobj=BytesIO(), mode="w", preset=10)
420 with self.assertRaises(LZMAError):
421 LZMAFile(fileobj=BytesIO(), mode="w", preset=23)
422 with self.assertRaises(OverflowError):
423 LZMAFile(fileobj=BytesIO(), mode="w", preset=-1)
424 with self.assertRaises(OverflowError):
425 LZMAFile(fileobj=BytesIO(), mode="w", preset=-7)
426 with self.assertRaises(TypeError):
427 LZMAFile(fileobj=BytesIO(), mode="w", preset="foo")
428 # Cannot specify a preset with mode="r".
429 with self.assertRaises(ValueError):
430 LZMAFile(fileobj=BytesIO(COMPRESSED_XZ), preset=3)
431
432 def test_init_bad_filter_spec(self):
433 with self.assertRaises(TypeError):
434 LZMAFile(fileobj=BytesIO(), mode="w", filters=[b"wobsite"])
435 with self.assertRaises(ValueError):
436 LZMAFile(fileobj=BytesIO(), mode="w", filters=[{"xyzzy": 3}])
437 with self.assertRaises(ValueError):
438 LZMAFile(fileobj=BytesIO(), mode="w", filters=[{"id": 98765}])
439 with self.assertRaises(ValueError):
440 LZMAFile(fileobj=BytesIO(), mode="w",
441 filters=[{"id": lzma.FILTER_LZMA2, "foo": 0}])
442 with self.assertRaises(ValueError):
443 LZMAFile(fileobj=BytesIO(), mode="w",
444 filters=[{"id": lzma.FILTER_DELTA, "foo": 0}])
445 with self.assertRaises(ValueError):
446 LZMAFile(fileobj=BytesIO(), mode="w",
447 filters=[{"id": lzma.FILTER_X86, "foo": 0}])
448
449 def test_init_with_preset_and_filters(self):
450 with self.assertRaises(ValueError):
451 LZMAFile(fileobj=BytesIO(), mode="w", format=lzma.FORMAT_RAW,
452 preset=6, filters=FILTERS_RAW_1)
453
454 def test_init_with_filename_and_fileobj(self):
455 with self.assertRaises(ValueError):
456 LZMAFile("/dev/null", fileobj=BytesIO())
457
458 def test_close(self):
459 with BytesIO(COMPRESSED_XZ) as src:
460 f = LZMAFile(fileobj=src)
461 f.close()
462 # LZMAFile.close() should not close the underlying file object.
463 self.assertFalse(src.closed)
464 # Try closing an already-closed LZMAFile.
465 f.close()
466 self.assertFalse(src.closed)
467
468 # Test with a real file on disk, opened directly by LZMAFile.
469 with TempFile(TESTFN, COMPRESSED_XZ):
470 f = LZMAFile(TESTFN)
471 fp = f._fp
472 f.close()
473 # Here, LZMAFile.close() *should* close the underlying file object.
474 self.assertTrue(fp.closed)
475 # Try closing an already-closed LZMAFile.
476 f.close()
477
478 def test_closed(self):
479 f = LZMAFile(fileobj=BytesIO(COMPRESSED_XZ))
480 try:
481 self.assertFalse(f.closed)
482 f.read()
483 self.assertFalse(f.closed)
484 finally:
485 f.close()
486 self.assertTrue(f.closed)
487
488 f = LZMAFile(fileobj=BytesIO(), mode="w")
489 try:
490 self.assertFalse(f.closed)
491 finally:
492 f.close()
493 self.assertTrue(f.closed)
494
495 def test_fileno(self):
496 f = LZMAFile(fileobj=BytesIO(COMPRESSED_XZ))
497 try:
498 self.assertRaises(UnsupportedOperation, f.fileno)
499 finally:
500 f.close()
501 self.assertRaises(ValueError, f.fileno)
502 with TempFile(TESTFN, COMPRESSED_XZ):
503 f = LZMAFile(TESTFN)
504 try:
505 self.assertEqual(f.fileno(), f._fp.fileno())
506 self.assertIsInstance(f.fileno(), int)
507 finally:
508 f.close()
509 self.assertRaises(ValueError, f.fileno)
510
511 def test_seekable(self):
512 f = LZMAFile(fileobj=BytesIO(COMPRESSED_XZ))
513 try:
514 self.assertTrue(f.seekable())
515 f.read()
516 self.assertTrue(f.seekable())
517 finally:
518 f.close()
519 self.assertRaises(ValueError, f.seekable)
520
521 f = LZMAFile(fileobj=BytesIO(), mode="w")
522 try:
523 self.assertFalse(f.seekable())
524 finally:
525 f.close()
526 self.assertRaises(ValueError, f.seekable)
527
Nadeem Vawdaae557d72012-02-12 01:51:38 +0200528 src = BytesIO(COMPRESSED_XZ)
529 src.seekable = lambda: False
530 f = LZMAFile(fileobj=src)
531 try:
532 self.assertFalse(f.seekable())
533 finally:
534 f.close()
535 self.assertRaises(ValueError, f.seekable)
536
Nadeem Vawda3ff069e2011-11-30 00:25:06 +0200537 def test_readable(self):
538 f = LZMAFile(fileobj=BytesIO(COMPRESSED_XZ))
539 try:
540 self.assertTrue(f.readable())
541 f.read()
542 self.assertTrue(f.readable())
543 finally:
544 f.close()
545 self.assertRaises(ValueError, f.readable)
546
547 f = LZMAFile(fileobj=BytesIO(), mode="w")
548 try:
549 self.assertFalse(f.readable())
550 finally:
551 f.close()
552 self.assertRaises(ValueError, f.readable)
553
554 def test_writable(self):
555 f = LZMAFile(fileobj=BytesIO(COMPRESSED_XZ))
556 try:
557 self.assertFalse(f.writable())
558 f.read()
559 self.assertFalse(f.writable())
560 finally:
561 f.close()
562 self.assertRaises(ValueError, f.writable)
563
564 f = LZMAFile(fileobj=BytesIO(), mode="w")
565 try:
566 self.assertTrue(f.writable())
567 finally:
568 f.close()
569 self.assertRaises(ValueError, f.writable)
570
571 def test_read(self):
572 with LZMAFile(fileobj=BytesIO(COMPRESSED_XZ)) as f:
573 self.assertEqual(f.read(), INPUT)
574 self.assertEqual(f.read(), b"")
575 with LZMAFile(fileobj=BytesIO(COMPRESSED_ALONE)) as f:
576 self.assertEqual(f.read(), INPUT)
577 with LZMAFile(fileobj=BytesIO(COMPRESSED_XZ),
578 format=lzma.FORMAT_XZ) as f:
579 self.assertEqual(f.read(), INPUT)
580 self.assertEqual(f.read(), b"")
581 with LZMAFile(fileobj=BytesIO(COMPRESSED_ALONE),
582 format=lzma.FORMAT_ALONE) as f:
583 self.assertEqual(f.read(), INPUT)
584 self.assertEqual(f.read(), b"")
585 with LZMAFile(fileobj=BytesIO(COMPRESSED_RAW_1),
586 format=lzma.FORMAT_RAW, filters=FILTERS_RAW_1) as f:
587 self.assertEqual(f.read(), INPUT)
588 self.assertEqual(f.read(), b"")
589 with LZMAFile(fileobj=BytesIO(COMPRESSED_RAW_2),
590 format=lzma.FORMAT_RAW, filters=FILTERS_RAW_2) as f:
591 self.assertEqual(f.read(), INPUT)
592 self.assertEqual(f.read(), b"")
593 with LZMAFile(fileobj=BytesIO(COMPRESSED_RAW_3),
594 format=lzma.FORMAT_RAW, filters=FILTERS_RAW_3) as f:
595 self.assertEqual(f.read(), INPUT)
596 self.assertEqual(f.read(), b"")
597 with LZMAFile(fileobj=BytesIO(COMPRESSED_RAW_4),
598 format=lzma.FORMAT_RAW, filters=FILTERS_RAW_4) as f:
599 self.assertEqual(f.read(), INPUT)
600 self.assertEqual(f.read(), b"")
601
602 def test_read_0(self):
603 with LZMAFile(fileobj=BytesIO(COMPRESSED_XZ)) as f:
604 self.assertEqual(f.read(0), b"")
605 with LZMAFile(fileobj=BytesIO(COMPRESSED_ALONE)) as f:
606 self.assertEqual(f.read(0), b"")
607 with LZMAFile(fileobj=BytesIO(COMPRESSED_XZ),
608 format=lzma.FORMAT_XZ) as f:
609 self.assertEqual(f.read(0), b"")
610 with LZMAFile(fileobj=BytesIO(COMPRESSED_ALONE),
611 format=lzma.FORMAT_ALONE) as f:
612 self.assertEqual(f.read(0), b"")
613
614 def test_read_10(self):
615 with LZMAFile(fileobj=BytesIO(COMPRESSED_XZ)) as f:
616 chunks = []
617 while True:
618 result = f.read(10)
619 if not result:
620 break
621 self.assertLessEqual(len(result), 10)
622 chunks.append(result)
623 self.assertEqual(b"".join(chunks), INPUT)
624
625 def test_read_multistream(self):
626 with LZMAFile(fileobj=BytesIO(COMPRESSED_XZ * 5)) as f:
627 self.assertEqual(f.read(), INPUT * 5)
628 with LZMAFile(fileobj=BytesIO(COMPRESSED_XZ + COMPRESSED_ALONE)) as f:
629 self.assertEqual(f.read(), INPUT * 2)
630 with LZMAFile(fileobj=BytesIO(COMPRESSED_RAW_3 * 4),
631 format=lzma.FORMAT_RAW, filters=FILTERS_RAW_3) as f:
632 self.assertEqual(f.read(), INPUT * 4)
633
634 def test_read_multistream_buffer_size_aligned(self):
635 # Test the case where a stream boundary coincides with the end
636 # of the raw read buffer.
637 saved_buffer_size = lzma._BUFFER_SIZE
638 lzma._BUFFER_SIZE = len(COMPRESSED_XZ)
639 try:
640 with LZMAFile(fileobj=BytesIO(COMPRESSED_XZ * 5)) as f:
641 self.assertEqual(f.read(), INPUT * 5)
642 finally:
643 lzma._BUFFER_SIZE = saved_buffer_size
644
645 def test_read_from_file(self):
646 with TempFile(TESTFN, COMPRESSED_XZ):
647 with LZMAFile(TESTFN) as f:
648 self.assertEqual(f.read(), INPUT)
649 self.assertEqual(f.read(), b"")
650
651 def test_read_incomplete(self):
652 with LZMAFile(fileobj=BytesIO(COMPRESSED_XZ[:128])) as f:
653 self.assertRaises(EOFError, f.read)
654
655 def test_read_bad_args(self):
656 f = LZMAFile(fileobj=BytesIO(COMPRESSED_XZ))
657 f.close()
658 self.assertRaises(ValueError, f.read)
659 with LZMAFile(fileobj=BytesIO(), mode="w") as f:
660 self.assertRaises(ValueError, f.read)
661 with LZMAFile(fileobj=BytesIO(COMPRESSED_XZ)) as f:
662 self.assertRaises(TypeError, f.read, None)
663
664 def test_read1(self):
665 with LZMAFile(fileobj=BytesIO(COMPRESSED_XZ)) as f:
666 blocks = []
667 while True:
668 result = f.read1()
669 if not result:
670 break
671 blocks.append(result)
672 self.assertEqual(b"".join(blocks), INPUT)
673 self.assertEqual(f.read1(), b"")
674
675 def test_read1_0(self):
676 with LZMAFile(fileobj=BytesIO(COMPRESSED_XZ)) as f:
677 self.assertEqual(f.read1(0), b"")
678
679 def test_read1_10(self):
680 with LZMAFile(fileobj=BytesIO(COMPRESSED_XZ)) as f:
681 blocks = []
682 while True:
683 result = f.read1(10)
684 if not result:
685 break
686 blocks.append(result)
687 self.assertEqual(b"".join(blocks), INPUT)
688 self.assertEqual(f.read1(), b"")
689
690 def test_read1_multistream(self):
691 with LZMAFile(fileobj=BytesIO(COMPRESSED_XZ * 5)) as f:
692 blocks = []
693 while True:
694 result = f.read1()
695 if not result:
696 break
697 blocks.append(result)
698 self.assertEqual(b"".join(blocks), INPUT * 5)
699 self.assertEqual(f.read1(), b"")
700
701 def test_read1_bad_args(self):
702 f = LZMAFile(fileobj=BytesIO(COMPRESSED_XZ))
703 f.close()
704 self.assertRaises(ValueError, f.read1)
705 with LZMAFile(fileobj=BytesIO(), mode="w") as f:
706 self.assertRaises(ValueError, f.read1)
707 with LZMAFile(fileobj=BytesIO(COMPRESSED_XZ)) as f:
708 self.assertRaises(TypeError, f.read1, None)
709
710 def test_peek(self):
711 with LZMAFile(fileobj=BytesIO(COMPRESSED_XZ)) as f:
712 result = f.peek()
713 self.assertGreater(len(result), 0)
714 self.assertTrue(INPUT.startswith(result))
715 self.assertEqual(f.read(), INPUT)
716 with LZMAFile(fileobj=BytesIO(COMPRESSED_XZ)) as f:
717 result = f.peek(10)
718 self.assertGreater(len(result), 0)
719 self.assertTrue(INPUT.startswith(result))
720 self.assertEqual(f.read(), INPUT)
721
722 def test_peek_bad_args(self):
723 with LZMAFile(fileobj=BytesIO(), mode="w") as f:
724 self.assertRaises(ValueError, f.peek)
725
726 def test_iterator(self):
727 with BytesIO(INPUT) as f:
728 lines = f.readlines()
729 with LZMAFile(fileobj=BytesIO(COMPRESSED_XZ)) as f:
730 self.assertListEqual(list(iter(f)), lines)
731 with LZMAFile(fileobj=BytesIO(COMPRESSED_ALONE)) as f:
732 self.assertListEqual(list(iter(f)), lines)
733 with LZMAFile(fileobj=BytesIO(COMPRESSED_XZ),
734 format=lzma.FORMAT_XZ) as f:
735 self.assertListEqual(list(iter(f)), lines)
736 with LZMAFile(fileobj=BytesIO(COMPRESSED_ALONE),
737 format=lzma.FORMAT_ALONE) as f:
738 self.assertListEqual(list(iter(f)), lines)
739 with LZMAFile(fileobj=BytesIO(COMPRESSED_RAW_2),
740 format=lzma.FORMAT_RAW, filters=FILTERS_RAW_2) as f:
741 self.assertListEqual(list(iter(f)), lines)
742
743 def test_readline(self):
744 with BytesIO(INPUT) as f:
745 lines = f.readlines()
746 with LZMAFile(fileobj=BytesIO(COMPRESSED_XZ)) as f:
747 for line in lines:
748 self.assertEqual(f.readline(), line)
749
750 def test_readlines(self):
751 with BytesIO(INPUT) as f:
752 lines = f.readlines()
753 with LZMAFile(fileobj=BytesIO(COMPRESSED_XZ)) as f:
754 self.assertListEqual(f.readlines(), lines)
755
756 def test_write(self):
757 with BytesIO() as dst:
758 with LZMAFile(fileobj=dst, mode="w") as f:
759 f.write(INPUT)
760 expected = lzma.compress(INPUT)
761 self.assertEqual(dst.getvalue(), expected)
762 with BytesIO() as dst:
763 with LZMAFile(fileobj=dst, mode="w", format=lzma.FORMAT_XZ) as f:
764 f.write(INPUT)
765 expected = lzma.compress(INPUT, format=lzma.FORMAT_XZ)
766 self.assertEqual(dst.getvalue(), expected)
767 with BytesIO() as dst:
768 with LZMAFile(fileobj=dst, mode="w", format=lzma.FORMAT_ALONE) as f:
769 f.write(INPUT)
770 expected = lzma.compress(INPUT, format=lzma.FORMAT_ALONE)
771 self.assertEqual(dst.getvalue(), expected)
772 with BytesIO() as dst:
773 with LZMAFile(fileobj=dst, mode="w", format=lzma.FORMAT_RAW,
774 filters=FILTERS_RAW_2) as f:
775 f.write(INPUT)
776 expected = lzma.compress(INPUT, format=lzma.FORMAT_RAW,
777 filters=FILTERS_RAW_2)
778 self.assertEqual(dst.getvalue(), expected)
779
780 def test_write_10(self):
781 with BytesIO() as dst:
782 with LZMAFile(fileobj=dst, mode="w") as f:
783 for start in range(0, len(INPUT), 10):
784 f.write(INPUT[start:start+10])
785 expected = lzma.compress(INPUT)
786 self.assertEqual(dst.getvalue(), expected)
787
788 def test_write_append(self):
789 part1 = INPUT[:1024]
790 part2 = INPUT[1024:1536]
791 part3 = INPUT[1536:]
792 expected = b"".join(lzma.compress(x) for x in (part1, part2, part3))
793 with BytesIO() as dst:
794 with LZMAFile(fileobj=dst, mode="w") as f:
795 f.write(part1)
796 with LZMAFile(fileobj=dst, mode="a") as f:
797 f.write(part2)
798 with LZMAFile(fileobj=dst, mode="a") as f:
799 f.write(part3)
800 self.assertEqual(dst.getvalue(), expected)
801
802 def test_write_to_file(self):
803 try:
804 with LZMAFile(TESTFN, "w") as f:
805 f.write(INPUT)
806 expected = lzma.compress(INPUT)
807 with open(TESTFN, "rb") as f:
808 self.assertEqual(f.read(), expected)
809 finally:
810 unlink(TESTFN)
811
812 def test_write_append_to_file(self):
813 part1 = INPUT[:1024]
814 part2 = INPUT[1024:1536]
815 part3 = INPUT[1536:]
816 expected = b"".join(lzma.compress(x) for x in (part1, part2, part3))
817 try:
818 with LZMAFile(TESTFN, "w") as f:
819 f.write(part1)
820 with LZMAFile(TESTFN, "a") as f:
821 f.write(part2)
822 with LZMAFile(TESTFN, "a") as f:
823 f.write(part3)
824 with open(TESTFN, "rb") as f:
825 self.assertEqual(f.read(), expected)
826 finally:
827 unlink(TESTFN)
828
829 def test_write_bad_args(self):
830 f = LZMAFile(fileobj=BytesIO(), mode="w")
831 f.close()
832 self.assertRaises(ValueError, f.write, b"foo")
833 with LZMAFile(fileobj=BytesIO(COMPRESSED_XZ), mode="r") as f:
834 self.assertRaises(ValueError, f.write, b"bar")
835 with LZMAFile(fileobj=BytesIO(), mode="w") as f:
836 self.assertRaises(TypeError, f.write, None)
837 self.assertRaises(TypeError, f.write, "text")
838 self.assertRaises(TypeError, f.write, 789)
839
840 def test_writelines(self):
841 with BytesIO(INPUT) as f:
842 lines = f.readlines()
843 with BytesIO() as dst:
844 with LZMAFile(fileobj=dst, mode="w") as f:
845 f.writelines(lines)
846 expected = lzma.compress(INPUT)
847 self.assertEqual(dst.getvalue(), expected)
848
849 def test_seek_forward(self):
850 with LZMAFile(fileobj=BytesIO(COMPRESSED_XZ)) as f:
851 f.seek(555)
852 self.assertEqual(f.read(), INPUT[555:])
853
854 def test_seek_forward_across_streams(self):
855 with LZMAFile(fileobj=BytesIO(COMPRESSED_XZ * 2)) as f:
856 f.seek(len(INPUT) + 123)
857 self.assertEqual(f.read(), INPUT[123:])
858
859 def test_seek_forward_relative_to_current(self):
860 with LZMAFile(fileobj=BytesIO(COMPRESSED_XZ)) as f:
861 f.read(100)
862 f.seek(1236, 1)
863 self.assertEqual(f.read(), INPUT[1336:])
864
865 def test_seek_forward_relative_to_end(self):
866 with LZMAFile(fileobj=BytesIO(COMPRESSED_XZ)) as f:
867 f.seek(-555, 2)
868 self.assertEqual(f.read(), INPUT[-555:])
869
870 def test_seek_backward(self):
871 with LZMAFile(fileobj=BytesIO(COMPRESSED_XZ)) as f:
872 f.read(1001)
873 f.seek(211)
874 self.assertEqual(f.read(), INPUT[211:])
875
876 def test_seek_backward_across_streams(self):
877 with LZMAFile(fileobj=BytesIO(COMPRESSED_XZ * 2)) as f:
878 f.read(len(INPUT) + 333)
879 f.seek(737)
880 self.assertEqual(f.read(), INPUT[737:] + INPUT)
881
882 def test_seek_backward_relative_to_end(self):
883 with LZMAFile(fileobj=BytesIO(COMPRESSED_XZ)) as f:
884 f.seek(-150, 2)
885 self.assertEqual(f.read(), INPUT[-150:])
886
887 def test_seek_past_end(self):
888 with LZMAFile(fileobj=BytesIO(COMPRESSED_XZ)) as f:
889 f.seek(len(INPUT) + 9001)
890 self.assertEqual(f.tell(), len(INPUT))
891 self.assertEqual(f.read(), b"")
892
893 def test_seek_past_start(self):
894 with LZMAFile(fileobj=BytesIO(COMPRESSED_XZ)) as f:
895 f.seek(-88)
896 self.assertEqual(f.tell(), 0)
897 self.assertEqual(f.read(), INPUT)
898
899 def test_seek_bad_args(self):
900 f = LZMAFile(fileobj=BytesIO(COMPRESSED_XZ))
901 f.close()
902 self.assertRaises(ValueError, f.seek, 0)
903 with LZMAFile(fileobj=BytesIO(), mode="w") as f:
904 self.assertRaises(ValueError, f.seek, 0)
905 with LZMAFile(fileobj=BytesIO(COMPRESSED_XZ)) as f:
906 self.assertRaises(ValueError, f.seek, 0, 3)
907 self.assertRaises(ValueError, f.seek, 9, ())
908 self.assertRaises(TypeError, f.seek, None)
909 self.assertRaises(TypeError, f.seek, b"derp")
910
911 def test_tell(self):
912 with LZMAFile(fileobj=BytesIO(COMPRESSED_XZ)) as f:
913 pos = 0
914 while True:
915 self.assertEqual(f.tell(), pos)
916 result = f.read(183)
917 if not result:
918 break
919 pos += len(result)
920 self.assertEqual(f.tell(), len(INPUT))
921 with LZMAFile(fileobj=BytesIO(), mode="w") as f:
922 for pos in range(0, len(INPUT), 144):
923 self.assertEqual(f.tell(), pos)
924 f.write(INPUT[pos:pos+144])
925 self.assertEqual(f.tell(), len(INPUT))
926
927 def test_tell_bad_args(self):
928 f = LZMAFile(fileobj=BytesIO(COMPRESSED_XZ))
929 f.close()
930 self.assertRaises(ValueError, f.tell)
931
932
933class MiscellaneousTestCase(unittest.TestCase):
934
935 def test_is_check_supported(self):
936 # CHECK_NONE and CHECK_CRC32 should always be supported,
937 # regardless of the options liblzma was compiled with.
Nadeem Vawdabc459bb2012-05-06 23:01:51 +0200938 self.assertTrue(lzma.is_check_supported(lzma.CHECK_NONE))
939 self.assertTrue(lzma.is_check_supported(lzma.CHECK_CRC32))
Nadeem Vawda3ff069e2011-11-30 00:25:06 +0200940
941 # The .xz format spec cannot store check IDs above this value.
Nadeem Vawdabc459bb2012-05-06 23:01:51 +0200942 self.assertFalse(lzma.is_check_supported(lzma.CHECK_ID_MAX + 1))
Nadeem Vawda3ff069e2011-11-30 00:25:06 +0200943
944 # This value should not be a valid check ID.
Nadeem Vawdabc459bb2012-05-06 23:01:51 +0200945 self.assertFalse(lzma.is_check_supported(lzma.CHECK_UNKNOWN))
Nadeem Vawda3ff069e2011-11-30 00:25:06 +0200946
Nadeem Vawdaf55b3292012-05-06 23:01:27 +0200947 def test_encode_filter_properties(self):
948 with self.assertRaises(TypeError):
949 lzma.encode_filter_properties(b"not a dict")
950 with self.assertRaises(ValueError):
951 lzma.encode_filter_properties({"id": 0x100})
952 with self.assertRaises(ValueError):
953 lzma.encode_filter_properties({"id": lzma.FILTER_LZMA2, "junk": 12})
954 with self.assertRaises(lzma.LZMAError):
955 lzma.encode_filter_properties({"id": lzma.FILTER_DELTA,
956 "dist": 9001})
957
958 # Test with parameters used by zipfile module.
959 props = lzma.encode_filter_properties({
960 "id": lzma.FILTER_LZMA1,
961 "pb": 2,
962 "lp": 0,
963 "lc": 3,
964 "dict_size": 8 << 20,
965 })
966 self.assertEqual(props, b"]\x00\x00\x80\x00")
967
968 def test_decode_filter_properties(self):
969 with self.assertRaises(TypeError):
970 lzma.decode_filter_properties(lzma.FILTER_X86, {"should be": bytes})
971 with self.assertRaises(lzma.LZMAError):
972 lzma.decode_filter_properties(lzma.FILTER_DELTA, b"too long")
973
974 # Test with parameters used by zipfile module.
975 filterspec = lzma.decode_filter_properties(
976 lzma.FILTER_LZMA1, b"]\x00\x00\x80\x00")
977 self.assertEqual(filterspec["id"], lzma.FILTER_LZMA1)
978 self.assertEqual(filterspec["pb"], 2)
979 self.assertEqual(filterspec["lp"], 0)
980 self.assertEqual(filterspec["lc"], 3)
981 self.assertEqual(filterspec["dict_size"], 8 << 20)
982
983 def test_filter_properties_roundtrip(self):
984 spec1 = lzma.decode_filter_properties(
985 lzma.FILTER_LZMA1, b"]\x00\x00\x80\x00")
986 reencoded = lzma.encode_filter_properties(spec1)
987 spec2 = lzma.decode_filter_properties(lzma.FILTER_LZMA1, reencoded)
988 self.assertEqual(spec1, spec2)
989
Nadeem Vawda3ff069e2011-11-30 00:25:06 +0200990
991# Test data:
992
993INPUT = b"""
994LAERTES
995
996 O, fear me not.
997 I stay too long: but here my father comes.
998
999 Enter POLONIUS
1000
1001 A double blessing is a double grace,
1002 Occasion smiles upon a second leave.
1003
1004LORD POLONIUS
1005
1006 Yet here, Laertes! aboard, aboard, for shame!
1007 The wind sits in the shoulder of your sail,
1008 And you are stay'd for. There; my blessing with thee!
1009 And these few precepts in thy memory
1010 See thou character. Give thy thoughts no tongue,
1011 Nor any unproportioned thought his act.
1012 Be thou familiar, but by no means vulgar.
1013 Those friends thou hast, and their adoption tried,
1014 Grapple them to thy soul with hoops of steel;
1015 But do not dull thy palm with entertainment
1016 Of each new-hatch'd, unfledged comrade. Beware
1017 Of entrance to a quarrel, but being in,
1018 Bear't that the opposed may beware of thee.
1019 Give every man thy ear, but few thy voice;
1020 Take each man's censure, but reserve thy judgment.
1021 Costly thy habit as thy purse can buy,
1022 But not express'd in fancy; rich, not gaudy;
1023 For the apparel oft proclaims the man,
1024 And they in France of the best rank and station
1025 Are of a most select and generous chief in that.
1026 Neither a borrower nor a lender be;
1027 For loan oft loses both itself and friend,
1028 And borrowing dulls the edge of husbandry.
1029 This above all: to thine ownself be true,
1030 And it must follow, as the night the day,
1031 Thou canst not then be false to any man.
1032 Farewell: my blessing season this in thee!
1033
1034LAERTES
1035
1036 Most humbly do I take my leave, my lord.
1037
1038LORD POLONIUS
1039
1040 The time invites you; go; your servants tend.
1041
1042LAERTES
1043
1044 Farewell, Ophelia; and remember well
1045 What I have said to you.
1046
1047OPHELIA
1048
1049 'Tis in my memory lock'd,
1050 And you yourself shall keep the key of it.
1051
1052LAERTES
1053
1054 Farewell.
1055"""
1056
1057COMPRESSED_XZ = (
1058 b"\xfd7zXZ\x00\x00\x04\xe6\xd6\xb4F\x02\x00!\x01\x16\x00\x00\x00t/\xe5\xa3"
1059 b"\xe0\x07\x80\x03\xdf]\x00\x05\x14\x07bX\x19\xcd\xddn\x98\x15\xe4\xb4\x9d"
1060 b"o\x1d\xc4\xe5\n\x03\xcc2h\xc7\\\x86\xff\xf8\xe2\xfc\xe7\xd9\xfe6\xb8("
1061 b"\xa8wd\xc2\"u.n\x1e\xc3\xf2\x8e\x8d\x8f\x02\x17/\xa6=\xf0\xa2\xdf/M\x89"
1062 b"\xbe\xde\xa7\x1cz\x18-]\xd5\xef\x13\x8frZ\x15\x80\x8c\xf8\x8do\xfa\x12"
1063 b"\x9b#z/\xef\xf0\xfaF\x01\x82\xa3M\x8e\xa1t\xca6 BF$\xe5Q\xa4\x98\xee\xde"
1064 b"l\xe8\x7f\xf0\x9d,bn\x0b\x13\xd4\xa8\x81\xe4N\xc8\x86\x153\xf5x2\xa2O"
1065 b"\x13@Q\xa1\x00/\xa5\xd0O\x97\xdco\xae\xf7z\xc4\xcdS\xb6t<\x16\xf2\x9cI#"
1066 b"\x89ud\xc66Y\xd9\xee\xe6\xce\x12]\xe5\xf0\xaa\x96-Pe\xade:\x04\t\x1b\xf7"
1067 b"\xdb7\n\x86\x1fp\xc8J\xba\xf4\xf0V\xa9\xdc\xf0\x02%G\xf9\xdf=?\x15\x1b"
1068 b"\xe1(\xce\x82=\xd6I\xac3\x12\x0cR\xb7\xae\r\xb1i\x03\x95\x01\xbd\xbe\xfa"
1069 b"\x02s\x01P\x9d\x96X\xb12j\xc8L\xa8\x84b\xf6\xc3\xd4c-H\x93oJl\xd0iQ\xe4k"
1070 b"\x84\x0b\xc1\xb7\xbc\xb1\x17\x88\xb1\xca?@\xf6\x07\xea\xe6x\xf1H12P\x0f"
1071 b"\x8a\xc9\xeauw\xe3\xbe\xaai\xa9W\xd0\x80\xcd#cb5\x99\xd8]\xa9d\x0c\xbd"
1072 b"\xa2\xdcWl\xedUG\xbf\x89yF\xf77\x81v\xbd5\x98\xbeh8\x18W\x08\xf0\x1b\x99"
1073 b"5:\x1a?rD\x96\xa1\x04\x0f\xae\xba\x85\xeb\x9d5@\xf5\x83\xd37\x83\x8ac"
1074 b"\x06\xd4\x97i\xcdt\x16S\x82k\xf6K\x01vy\x88\x91\x9b6T\xdae\r\xfd]:k\xbal"
1075 b"\xa9\xbba\xc34\xf9r\xeb}r\xdb\xc7\xdb*\x8f\x03z\xdc8h\xcc\xc9\xd3\xbcl"
1076 b"\xa5-\xcb\xeaK\xa2\xc5\x15\xc0\xe3\xc1\x86Z\xfb\xebL\xe13\xcf\x9c\xe3"
1077 b"\x1d\xc9\xed\xc2\x06\xcc\xce!\x92\xe5\xfe\x9c^\xa59w \x9bP\xa3PK\x08d"
1078 b"\xf9\xe2Z}\xa7\xbf\xed\xeb%$\x0c\x82\xb8/\xb0\x01\xa9&,\xf7qh{Q\x96)\xf2"
1079 b"q\x96\xc3\x80\xb4\x12\xb0\xba\xe6o\xf4!\xb4[\xd4\x8aw\x10\xf7t\x0c\xb3"
1080 b"\xd9\xd5\xc3`^\x81\x11??\\\xa4\x99\x85R\xd4\x8e\x83\xc9\x1eX\xbfa\xf1"
1081 b"\xac\xb0\xea\xea\xd7\xd0\xab\x18\xe2\xf2\xed\xe1\xb7\xc9\x18\xcbS\xe4>"
1082 b"\xc9\x95H\xe8\xcb\t\r%\xeb\xc7$.o\xf1\xf3R\x17\x1db\xbb\xd8U\xa5^\xccS"
1083 b"\x16\x01\x87\xf3/\x93\xd1\xf0v\xc0r\xd7\xcc\xa2Gkz\xca\x80\x0e\xfd\xd0"
1084 b"\x8b\xbb\xd2Ix\xb3\x1ey\xca-0\xe3z^\xd6\xd6\x8f_\xf1\x9dP\x9fi\xa7\xd1"
1085 b"\xe8\x90\x84\xdc\xbf\xcdky\x8e\xdc\x81\x7f\xa3\xb2+\xbf\x04\xef\xd8\\"
1086 b"\xc4\xdf\xe1\xb0\x01\xe9\x93\xe3Y\xf1\x1dY\xe8h\x81\xcf\xf1w\xcc\xb4\xef"
1087 b" \x8b|\x04\xea\x83ej\xbe\x1f\xd4z\x9c`\xd3\x1a\x92A\x06\xe5\x8f\xa9\x13"
1088 b"\t\x9e=\xfa\x1c\xe5_\x9f%v\x1bo\x11ZO\xd8\xf4\t\xddM\x16-\x04\xfc\x18<\""
1089 b"CM\xddg~b\xf6\xef\x8e\x0c\xd0\xde|\xa0'\x8a\x0c\xd6x\xae!J\xa6F\x88\x15u"
1090 b"\x008\x17\xbc7y\xb3\xd8u\xac_\x85\x8d\xe7\xc1@\x9c\xecqc\xa3#\xad\xf1"
1091 b"\x935\xb5)_\r\xec3]\x0fo]5\xd0my\x07\x9b\xee\x81\xb5\x0f\xcfK+\x00\xc0"
1092 b"\xe4b\x10\xe4\x0c\x1a \x9b\xe0\x97t\xf6\xa1\x9e\x850\xba\x0c\x9a\x8d\xc8"
1093 b"\x8f\x07\xd7\xae\xc8\xf9+i\xdc\xb9k\xb0>f\x19\xb8\r\xa8\xf8\x1f$\xa5{p"
1094 b"\xc6\x880\xce\xdb\xcf\xca_\x86\xac\x88h6\x8bZ%'\xd0\n\xbf\x0f\x9c\"\xba"
1095 b"\xe5\x86\x9f\x0f7X=mNX[\xcc\x19FU\xc9\x860\xbc\x90a+* \xae_$\x03\x1e\xd3"
1096 b"\xcd_\xa0\x9c\xde\xaf46q\xa5\xc9\x92\xd7\xca\xe3`\x9d\x85}\xb4\xff\xb3"
1097 b"\x83\xfb\xb6\xca\xae`\x0bw\x7f\xfc\xd8\xacVe\x19\xc8\x17\x0bZ\xad\x88"
1098 b"\xeb#\x97\x03\x13\xb1d\x0f{\x0c\x04w\x07\r\x97\xbd\xd6\xc1\xc3B:\x95\x08"
1099 b"^\x10V\xaeaH\x02\xd9\xe3\n\\\x01X\xf6\x9c\x8a\x06u#%\xbe*\xa1\x18v\x85"
1100 b"\xec!\t4\x00\x00\x00\x00Vj?uLU\xf3\xa6\x00\x01\xfb\x07\x81\x0f\x00\x00tw"
1101 b"\x99P\xb1\xc4g\xfb\x02\x00\x00\x00\x00\x04YZ"
1102)
1103
1104COMPRESSED_ALONE = (
1105 b"]\x00\x00\x80\x00\xff\xff\xff\xff\xff\xff\xff\xff\x00\x05\x14\x07bX\x19"
1106 b"\xcd\xddn\x98\x15\xe4\xb4\x9do\x1d\xc4\xe5\n\x03\xcc2h\xc7\\\x86\xff\xf8"
1107 b"\xe2\xfc\xe7\xd9\xfe6\xb8(\xa8wd\xc2\"u.n\x1e\xc3\xf2\x8e\x8d\x8f\x02"
1108 b"\x17/\xa6=\xf0\xa2\xdf/M\x89\xbe\xde\xa7\x1cz\x18-]\xd5\xef\x13\x8frZ"
1109 b"\x15\x80\x8c\xf8\x8do\xfa\x12\x9b#z/\xef\xf0\xfaF\x01\x82\xa3M\x8e\xa1t"
1110 b"\xca6 BF$\xe5Q\xa4\x98\xee\xdel\xe8\x7f\xf0\x9d,bn\x0b\x13\xd4\xa8\x81"
1111 b"\xe4N\xc8\x86\x153\xf5x2\xa2O\x13@Q\xa1\x00/\xa5\xd0O\x97\xdco\xae\xf7z"
1112 b"\xc4\xcdS\xb6t<\x16\xf2\x9cI#\x89ud\xc66Y\xd9\xee\xe6\xce\x12]\xe5\xf0"
1113 b"\xaa\x96-Pe\xade:\x04\t\x1b\xf7\xdb7\n\x86\x1fp\xc8J\xba\xf4\xf0V\xa9"
1114 b"\xdc\xf0\x02%G\xf9\xdf=?\x15\x1b\xe1(\xce\x82=\xd6I\xac3\x12\x0cR\xb7"
1115 b"\xae\r\xb1i\x03\x95\x01\xbd\xbe\xfa\x02s\x01P\x9d\x96X\xb12j\xc8L\xa8"
1116 b"\x84b\xf8\x1epl\xeajr\xd1=\t\x03\xdd\x13\x1b3!E\xf9vV\xdaF\xf3\xd7\xb4"
1117 b"\x0c\xa9P~\xec\xdeE\xe37\xf6\x1d\xc6\xbb\xddc%\xb6\x0fI\x07\xf0;\xaf\xe7"
1118 b"\xa0\x8b\xa7Z\x99(\xe9\xe2\xf0o\x18>`\xe1\xaa\xa8\xd9\xa1\xb2}\xe7\x8d"
1119 b"\x834T\xb6\xef\xc1\xde\xe3\x98\xbcD\x03MA@\xd8\xed\xdc\xc8\x93\x03\x1a"
1120 b"\x93\x0b\x7f\x94\x12\x0b\x02Sa\x18\xc9\xc5\x9bTJE}\xf6\xc8g\x17#ZV\x01"
1121 b"\xc9\x9dc\x83\x0e>0\x16\x90S\xb8/\x03y_\x18\xfa(\xd7\x0br\xa2\xb0\xba?"
1122 b"\x8c\xe6\x83@\x84\xdf\x02:\xc5z\x9e\xa6\x84\xc9\xf5BeyX\x83\x1a\xf1 :\t"
1123 b"\xf7\x19\xfexD\\&G\xf3\x85Y\xa2J\xf9\x0bv{\x89\xf6\xe7)A\xaf\x04o\x00"
1124 b"\x075\xd3\xe0\x7f\x97\x98F\x0f?v\x93\xedVtTf\xb5\x97\x83\xed\x19\xd7\x1a"
1125 b"'k\xd7\xd9\xc5\\Y\xd1\xdc\x07\x15|w\xbc\xacd\x87\x08d\xec\xa7\xf6\x82"
1126 b"\xfc\xb3\x93\xeb\xb9 \x8d\xbc ,\xb3X\xb0\xd2s\xd7\xd1\xffv\x05\xdf}\xa2"
1127 b"\x96\xfb%\n\xdf\xa2\x7f\x08.\xa16\n\xe0\x19\x93\x7fh\n\x1c\x8c\x0f \x11"
1128 b"\xc6Bl\x95\x19U}\xe4s\xb5\x10H\xea\x86pB\xe88\x95\xbe\x8cZ\xdb\xe4\x94A"
1129 b"\x92\xb9;z\xaa\xa7{\x1c5!\xc0\xaf\xc1A\xf9\xda\xf0$\xb0\x02qg\xc8\xc7/|"
1130 b"\xafr\x99^\x91\x88\xbf\x03\xd9=\xd7n\xda6{>8\n\xc7:\xa9'\xba.\x0b\xe2"
1131 b"\xb5\x1d\x0e\n\x9a\x8e\x06\x8f:\xdd\x82'[\xc3\"wD$\xa7w\xecq\x8c,1\x93"
1132 b"\xd0,\xae2w\x93\x12$Jd\x19mg\x02\x93\x9cA\x95\x9d&\xca8i\x9c\xb0;\xe7NQ"
1133 b"\x1frh\x8beL;\xb0m\xee\x07Q\x9b\xc6\xd8\x03\xb5\xdeN\xd4\xfe\x98\xd0\xdc"
1134 b"\x1a[\x04\xde\x1a\xf6\x91j\xf8EOli\x8eB^\x1d\x82\x07\xb2\xb5R]\xb7\xd7"
1135 b"\xe9\xa6\xc3.\xfb\xf0-\xb4e\x9b\xde\x03\x88\xc6\xc1iN\x0e\x84wbQ\xdf~"
1136 b"\xe9\xa4\x884\x96kM\xbc)T\xf3\x89\x97\x0f\x143\xe7)\xa0\xb3B\x00\xa8\xaf"
1137 b"\x82^\xcb\xc7..\xdb\xc7\t\x9dH\xee5\xe9#\xe6NV\x94\xcb$Kk\xe3\x7f\r\xe3t"
1138 b"\x12\xcf'\xefR\x8b\xf42\xcf-LH\xac\xe5\x1f0~?SO\xeb\xc1E\x1a\x1c]\xf2"
1139 b"\xc4<\x11\x02\x10Z0a*?\xe4r\xff\xfb\xff\xf6\x14nG\xead^\xd6\xef8\xb6uEI"
1140 b"\x99\nV\xe2\xb3\x95\x8e\x83\xf6i!\xb5&1F\xb1DP\xf4 SO3D!w\x99_G\x7f+\x90"
1141 b".\xab\xbb]\x91>\xc9#h;\x0f5J\x91K\xf4^-[\x9e\x8a\\\x94\xca\xaf\xf6\x19"
1142 b"\xd4\xa1\x9b\xc4\xb8p\xa1\xae\x15\xe9r\x84\xe0\xcar.l []\x8b\xaf+0\xf2g"
1143 b"\x01aKY\xdfI\xcf,\n\xe8\xf0\xe7V\x80_#\xb2\xf2\xa9\x06\x8c>w\xe2W,\xf4"
1144 b"\x8c\r\xf963\xf5J\xcc2\x05=kT\xeaUti\xe5_\xce\x1b\xfa\x8dl\x02h\xef\xa8"
1145 b"\xfbf\x7f\xff\xf0\x19\xeax"
1146)
1147
1148FILTERS_RAW_1 = [{"id": lzma.FILTER_LZMA2, "preset": 3}]
1149COMPRESSED_RAW_1 = (
1150 b"\xe0\x07\x80\x03\xfd]\x00\x05\x14\x07bX\x19\xcd\xddn\x96cyq\xa1\xdd\xee"
1151 b"\xf8\xfam\xe3'\x88\xd3\xff\xe4\x9e \xceQ\x91\xa4\x14I\xf6\xb9\x9dVL8\x15"
1152 b"_\x0e\x12\xc3\xeb\xbc\xa5\xcd\nW\x1d$=R;\x1d\xf8k8\t\xb1{\xd4\xc5+\x9d"
1153 b"\x87c\xe5\xef\x98\xb4\xd7S3\xcd\xcc\xd2\xed\xa4\x0em\xe5\xf4\xdd\xd0b"
1154 b"\xbe4*\xaa\x0b\xc5\x08\x10\x85+\x81.\x17\xaf9\xc9b\xeaZrA\xe20\x7fs\"r"
1155 b"\xdaG\x81\xde\x90cu\xa5\xdb\xa9.A\x08l\xb0<\xf6\x03\xddOi\xd0\xc5\xb4"
1156 b"\xec\xecg4t6\"\xa6\xb8o\xb5?\x18^}\xb6}\x03[:\xeb\x03\xa9\n[\x89l\x19g"
1157 b"\x16\xc82\xed\x0b\xfb\x86n\xa2\x857@\x93\xcd6T\xc3u\xb0\t\xf9\x1b\x918"
1158 b"\xfc[\x1b\x1e4\xb3\x14\x06PCV\xa8\"\xf5\x81x~\xe9\xb5N\x9cK\x9f\xc6\xc3%"
1159 b"\xc8k:{6\xe7\xf7\xbd\x05\x02\xb4\xc4\xc3\xd3\xfd\xc3\xa8\\\xfc@\xb1F_"
1160 b"\xc8\x90\xd9sU\x98\xad8\x05\x07\xde7J\x8bM\xd0\xb3;X\xec\x87\xef\xae\xb3"
1161 b"eO,\xb1z,d\x11y\xeejlB\x02\x1d\xf28\x1f#\x896\xce\x0b\xf0\xf5\xa9PK\x0f"
1162 b"\xb3\x13P\xd8\x88\xd2\xa1\x08\x04C?\xdb\x94_\x9a\"\xe9\xe3e\x1d\xde\x9b"
1163 b"\xa1\xe8>H\x98\x10;\xc5\x03#\xb5\x9d4\x01\xe7\xc5\xba%v\xa49\x97A\xe0\""
1164 b"\x8c\xc22\xe3i\xc1\x9d\xab3\xdf\xbe\xfdDm7\x1b\x9d\xab\xb5\x15o:J\x92"
1165 b"\xdb\x816\x17\xc2O\x99\x1b\x0e\x8d\xf3\tQ\xed\x8e\x95S/\x16M\xb2S\x04"
1166 b"\x0f\xc3J\xc6\xc7\xe4\xcb\xc5\xf4\xe7d\x14\xe4=^B\xfb\xd3E\xd3\x1e\xcd"
1167 b"\x91\xa5\xd0G\x8f.\xf6\xf9\x0bb&\xd9\x9f\xc2\xfdj\xa2\x9e\xc4\\\x0e\x1dC"
1168 b"v\xe8\xd2\x8a?^H\xec\xae\xeb>\xfe\xb8\xab\xd4IqY\x8c\xd4K7\x11\xf4D\xd0W"
1169 b"\xa5\xbe\xeaO\xbf\xd0\x04\xfdl\x10\xae5\xd4U\x19\x06\xf9{\xaa\xe0\x81"
1170 b"\x0f\xcf\xa3k{\x95\xbd\x19\xa2\xf8\xe4\xa3\x08O*\xf1\xf1B-\xc7(\x0eR\xfd"
1171 b"@E\x9f\xd3\x1e:\xfdV\xb7\x04Y\x94\xeb]\x83\xc4\xa5\xd7\xc0gX\x98\xcf\x0f"
1172 b"\xcd3\x00]n\x17\xec\xbd\xa3Y\x86\xc5\xf3u\xf6*\xbdT\xedA$A\xd9A\xe7\x98"
1173 b"\xef\x14\x02\x9a\xfdiw\xec\xa0\x87\x11\xd9%\xc5\xeb\x8a=\xae\xc0\xc4\xc6"
1174 b"D\x80\x8f\xa8\xd1\xbbq\xb2\xc0\xa0\xf5Cqp\xeeL\xe3\xe5\xdc \x84\"\xe9"
1175 b"\x80t\x83\x05\xba\xf1\xc5~\x93\xc9\xf0\x01c\xceix\x9d\xed\xc5)l\x16)\xd1"
1176 b"\x03@l\x04\x7f\x87\xa5yn\x1b\x01D\xaa:\xd2\x96\xb4\xb3?\xb0\xf9\xce\x07"
1177 b"\xeb\x81\x00\xe4\xc3\xf5%_\xae\xd4\xf9\xeb\xe2\rh\xb2#\xd67Q\x16D\x82hn"
1178 b"\xd1\xa3_?q\xf0\xe2\xac\xf317\x9e\xd0_\x83|\xf1\xca\xb7\x95S\xabW\x12"
1179 b"\xff\xddt\xf69L\x01\xf2|\xdaW\xda\xees\x98L\x18\xb8_\xe8$\x82\xea\xd6"
1180 b"\xd1F\xd4\x0b\xcdk\x01vf\x88h\xc3\xae\xb91\xc7Q\x9f\xa5G\xd9\xcc\x1f\xe3"
1181 b"5\xb1\xdcy\x7fI\x8bcw\x8e\x10rIp\x02:\x19p_\xc8v\xcea\"\xc1\xd9\x91\x03"
1182 b"\xbfe\xbe\xa6\xb3\xa8\x14\x18\xc3\xabH*m}\xc2\xc1\x9a}>l%\xce\x84\x99"
1183 b"\xb3d\xaf\xd3\x82\x15\xdf\xc1\xfc5fOg\x9b\xfc\x8e^&\t@\xce\x9f\x06J\xb8"
1184 b"\xb5\x86\x1d\xda{\x9f\xae\xb0\xff\x02\x81r\x92z\x8cM\xb7ho\xc9^\x9c\xb6"
1185 b"\x9c\xae\xd1\xc9\xf4\xdfU7\xd6\\!\xea\x0b\x94k\xb9Ud~\x98\xe7\x86\x8az"
1186 b"\x10;\xe3\x1d\xe5PG\xf8\xa4\x12\x05w\x98^\xc4\xb1\xbb\xfb\xcf\xe0\x7f"
1187 b"\x033Sf\x0c \xb1\xf6@\x94\xe5\xa3\xb2\xa7\x10\x9a\xc0\x14\xc3s\xb5xRD"
1188 b"\xf4`W\xd9\xe5\xd3\xcf\x91\rTZ-X\xbe\xbf\xb5\xe2\xee|\x1a\xbf\xfb\x08"
1189 b"\x91\xe1\xfc\x9a\x18\xa3\x8b\xd6^\x89\xf5[\xef\x87\xd1\x06\x1c7\xd6\xa2"
1190 b"\t\tQ5/@S\xc05\xd2VhAK\x03VC\r\x9b\x93\xd6M\xf1xO\xaaO\xed\xb9<\x0c\xdae"
1191 b"*\xd0\x07Hk6\x9fG+\xa1)\xcd\x9cl\x87\xdb\xe1\xe7\xefK}\x875\xab\xa0\x19u"
1192 b"\xf6*F\xb32\x00\x00\x00"
1193)
1194
1195FILTERS_RAW_2 = [{"id": lzma.FILTER_DELTA, "dist": 2},
1196 {"id": lzma.FILTER_LZMA2,
1197 "preset": lzma.PRESET_DEFAULT | lzma.PRESET_EXTREME}]
1198COMPRESSED_RAW_2 = (
1199 b"\xe0\x07\x80\x05\x91]\x00\x05\x14\x06-\xd4\xa8d?\xef\xbe\xafH\xee\x042"
1200 b"\xcb.\xb5g\x8f\xfb\x14\xab\xa5\x9f\x025z\xa4\xdd\xd8\t[}W\xf8\x0c\x1dmH"
1201 b"\xfa\x05\xfcg\xba\xe5\x01Q\x0b\x83R\xb6A\x885\xc0\xba\xee\n\x1cv~\xde:o"
1202 b"\x06:J\xa7\x11Cc\xea\xf7\xe5*o\xf7\x83\\l\xbdE\x19\x1f\r\xa8\x10\xb42"
1203 b"\x0caU{\xd7\xb8w\xdc\xbe\x1b\xfc8\xb4\xcc\xd38\\\xf6\x13\xf6\xe7\x98\xfa"
1204 b"\xc7[\x17_9\x86%\xa8\xf8\xaa\xb8\x8dfs#\x1e=\xed<\x92\x10\\t\xff\x86\xfb"
1205 b"=\x9e7\x18\x1dft\\\xb5\x01\x95Q\xc5\x19\xb38\xe0\xd4\xaa\x07\xc3\x7f\xd8"
1206 b"\xa2\x00>-\xd3\x8e\xa1#\xfa\x83ArAm\xdbJ~\x93\xa3B\x82\xe0\xc7\xcc(\x08`"
1207 b"WK\xad\x1b\x94kaj\x04 \xde\xfc\xe1\xed\xb0\x82\x91\xefS\x84%\x86\xfbi"
1208 b"\x99X\xf1B\xe7\x90;E\xfde\x98\xda\xca\xd6T\xb4bg\xa4\n\x9aj\xd1\x83\x9e]"
1209 b"\"\x7fM\xb5\x0fr\xd2\\\xa5j~P\x10GH\xbfN*Z\x10.\x81\tpE\x8a\x08\xbe1\xbd"
1210 b"\xcd\xa9\xe1\x8d\x1f\x04\xf9\x0eH\xb9\xae\xd6\xc3\xc1\xa5\xa9\x95P\xdc~"
1211 b"\xff\x01\x930\xa9\x04\xf6\x03\xfe\xb5JK\xc3]\xdd9\xb1\xd3\xd7F\xf5\xd1"
1212 b"\x1e\xa0\x1c_\xed[\x0c\xae\xd4\x8b\x946\xeb\xbf\xbb\xe3$kS{\xb5\x80,f:Sj"
1213 b"\x0f\x08z\x1c\xf5\xe8\xe6\xae\x98\xb0Q~r\x0f\xb0\x05?\xb6\x90\x19\x02&"
1214 b"\xcb\x80\t\xc4\xea\x9c|x\xce\x10\x9c\xc5|\xcbdhh+\x0c'\xc5\x81\xc33\xb5"
1215 b"\x14q\xd6\xc5\xe3`Z#\xdc\x8a\xab\xdd\xea\x08\xc2I\xe7\x02l{\xec\x196\x06"
1216 b"\x91\x8d\xdc\xd5\xb3x\xe1hz%\xd1\xf8\xa5\xdd\x98!\x8c\x1c\xc1\x17RUa\xbb"
1217 b"\x95\x0f\xe4X\xea1\x0c\xf1=R\xbe\xc60\xe3\xa4\x9a\x90bd\x97$]B\x01\xdd"
1218 b"\x1f\xe3h2c\x1e\xa0L`4\xc6x\xa3Z\x8a\r\x14]T^\xd8\x89\x1b\x92\r;\xedY"
1219 b"\x0c\xef\x8d9z\xf3o\xb6)f\xa9]$n\rp\x93\xd0\x10\xa4\x08\xb8\xb2\x8b\xb6"
1220 b"\x8f\x80\xae;\xdcQ\xf1\xfa\x9a\x06\x8e\xa5\x0e\x8cK\x9c @\xaa:UcX\n!\xc6"
1221 b"\x02\x12\xcb\x1b\"=\x16.\x1f\x176\xf2g=\xe1Wn\xe9\xe1\xd4\xf1O\xad\x15"
1222 b"\x86\xe9\xa3T\xaf\xa9\xd7D\xb5\xd1W3pnt\x11\xc7VOj\xb7M\xc4i\xa1\xf1$3"
1223 b"\xbb\xdc\x8af\xb0\xc5Y\r\xd1\xfb\xf2\xe7K\xe6\xc5hwO\xfe\x8c2^&\x07\xd5"
1224 b"\x1fV\x19\xfd\r\x14\xd2i=yZ\xe6o\xaf\xc6\xb6\x92\x9d\xc4\r\xb3\xafw\xac%"
1225 b"\xcfc\x1a\xf1`]\xf2\x1a\x9e\x808\xedm\xedQ\xb2\xfe\xe4h`[q\xae\xe0\x0f"
1226 b"\xba0g\xb6\"N\xc3\xfb\xcfR\x11\xc5\x18)(\xc40\\\xa3\x02\xd9G!\xce\x1b"
1227 b"\xc1\x96x\xb5\xc8z\x1f\x01\xb4\xaf\xde\xc2\xcd\x07\xe7H\xb3y\xa8M\n\\A\t"
1228 b"ar\xddM\x8b\x9a\xea\x84\x9b!\xf1\x8d\xb1\xf1~\x1e\r\xa5H\xba\xf1\x84o"
1229 b"\xda\x87\x01h\xe9\xa2\xbe\xbeqN\x9d\x84\x0b!WG\xda\xa1\xa5A\xb7\xc7`j"
1230 b"\x15\xf2\xe9\xdd?\x015B\xd2~E\x06\x11\xe0\x91!\x05^\x80\xdd\xa8y\x15}"
1231 b"\xa1)\xb1)\x81\x18\xf4\xf4\xf8\xc0\xefD\xe3\xdb2f\x1e\x12\xabu\xc9\x97"
1232 b"\xcd\x1e\xa7\x0c\x02x4_6\x03\xc4$t\xf39\x94\x1d=\xcb\xbfv\\\xf5\xa3\x1d"
1233 b"\x9d8jk\x95\x13)ff\xf9n\xc4\xa9\xe3\x01\xb8\xda\xfb\xab\xdfM\x99\xfb\x05"
1234 b"\xe0\xe9\xb0I\xf4E\xab\xe2\x15\xa3\x035\xe7\xdeT\xee\x82p\xb4\x88\xd3"
1235 b"\x893\x9c/\xc0\xd6\x8fou;\xf6\x95PR\xa9\xb2\xc1\xefFj\xe2\xa7$\xf7h\xf1"
1236 b"\xdfK(\xc9c\xba7\xe8\xe3)\xdd\xb2,\x83\xfb\x84\x18.y\x18Qi\x88\xf8`h-"
1237 b"\xef\xd5\xed\x8c\t\xd8\xc3^\x0f\x00\xb7\xd0[!\xafM\x9b\xd7.\x07\xd8\xfb"
1238 b"\xd9\xe2-S+\xaa8,\xa0\x03\x1b \xea\xa8\x00\xc3\xab~\xd0$e\xa5\x7f\xf7"
1239 b"\x95P]\x12\x19i\xd9\x7fo\x0c\xd8g^\rE\xa5\x80\x18\xc5\x01\x80\xaek`\xff~"
1240 b"\xb6y\xe7+\xe5\x11^D\xa7\x85\x18\"!\xd6\xd2\xa7\xf4\x1eT\xdb\x02\xe15"
1241 b"\x02Y\xbc\x174Z\xe7\x9cH\x1c\xbf\x0f\xc6\xe9f]\xcf\x8cx\xbc\xe5\x15\x94"
1242 b"\xfc3\xbc\xa7TUH\xf1\x84\x1b\xf7\xa9y\xc07\x84\xf8X\xd8\xef\xfc \x1c\xd8"
1243 b"( /\xf2\xb7\xec\xc1\\\x8c\xf6\x95\xa1\x03J\x83vP8\xe1\xe3\xbb~\xc24kA"
1244 b"\x98y\xa1\xf2P\xe9\x9d\xc9J\xf8N\x99\xb4\xceaO\xde\x16\x1e\xc2\x19\xa7"
1245 b"\x03\xd2\xe0\x8f:\x15\xf3\x84\x9e\xee\xe6e\xb8\x02q\xc7AC\x1emw\xfd\t"
1246 b"\x9a\x1eu\xc1\xa9\xcaCwUP\x00\xa5\xf78L4w!\x91L2 \x87\xd0\xf2\x06\x81j"
1247 b"\x80;\x03V\x06\x87\x92\xcb\x90lv@E\x8d\x8d\xa5\xa6\xe7Z[\xdf\xd6E\x03`>"
1248 b"\x8f\xde\xa1bZ\x84\xd0\xa9`\x05\x0e{\x80;\xe3\xbef\x8d\x1d\xebk1.\xe3"
1249 b"\xe9N\x15\xf7\xd4(\xfa\xbb\x15\xbdu\xf7\x7f\x86\xae!\x03L\x1d\xb5\xc1"
1250 b"\xb9\x11\xdb\xd0\x93\xe4\x02\xe1\xd2\xcbBjc_\xe8}d\xdb\xc3\xa0Y\xbe\xc9/"
1251 b"\x95\x01\xa3,\xe6bl@\x01\xdbp\xc2\xce\x14\x168\xc2q\xe3uH\x89X\xa4\xa9"
1252 b"\x19\x1d\xc1}\x7fOX\x19\x9f\xdd\xbe\x85\x83\xff\x96\x1ee\x82O`CF=K\xeb$I"
1253 b"\x17_\xefX\x8bJ'v\xde\x1f+\xd9.v\xf8Tv\x17\xf2\x9f5\x19\xe1\xb9\x91\xa8S"
1254 b"\x86\xbd\x1a\"(\xa5x\x8dC\x03X\x81\x91\xa8\x11\xc4pS\x13\xbc\xf2'J\xae!"
1255 b"\xef\xef\x84G\t\x8d\xc4\x10\x132\x00oS\x9e\xe0\xe4d\x8f\xb8y\xac\xa6\x9f"
1256 b",\xb8f\x87\r\xdf\x9eE\x0f\xe1\xd0\\L\x00\xb2\xe1h\x84\xef}\x98\xa8\x11"
1257 b"\xccW#\\\x83\x7fo\xbbz\x8f\x00"
1258)
1259
1260FILTERS_RAW_3 = [{"id": lzma.FILTER_IA64, "start_offset": 0x100},
1261 {"id": lzma.FILTER_LZMA2}]
1262COMPRESSED_RAW_3 = (
1263 b"\xe0\x07\x80\x03\xdf]\x00\x05\x14\x07bX\x19\xcd\xddn\x98\x15\xe4\xb4\x9d"
1264 b"o\x1d\xc4\xe5\n\x03\xcc2h\xc7\\\x86\xff\xf8\xe2\xfc\xe7\xd9\xfe6\xb8("
1265 b"\xa8wd\xc2\"u.n\x1e\xc3\xf2\x8e\x8d\x8f\x02\x17/\xa6=\xf0\xa2\xdf/M\x89"
1266 b"\xbe\xde\xa7\x1cz\x18-]\xd5\xef\x13\x8frZ\x15\x80\x8c\xf8\x8do\xfa\x12"
1267 b"\x9b#z/\xef\xf0\xfaF\x01\x82\xa3M\x8e\xa1t\xca6 BF$\xe5Q\xa4\x98\xee\xde"
1268 b"l\xe8\x7f\xf0\x9d,bn\x0b\x13\xd4\xa8\x81\xe4N\xc8\x86\x153\xf5x2\xa2O"
1269 b"\x13@Q\xa1\x00/\xa5\xd0O\x97\xdco\xae\xf7z\xc4\xcdS\xb6t<\x16\xf2\x9cI#"
1270 b"\x89ud\xc66Y\xd9\xee\xe6\xce\x12]\xe5\xf0\xaa\x96-Pe\xade:\x04\t\x1b\xf7"
1271 b"\xdb7\n\x86\x1fp\xc8J\xba\xf4\xf0V\xa9\xdc\xf0\x02%G\xf9\xdf=?\x15\x1b"
1272 b"\xe1(\xce\x82=\xd6I\xac3\x12\x0cR\xb7\xae\r\xb1i\x03\x95\x01\xbd\xbe\xfa"
1273 b"\x02s\x01P\x9d\x96X\xb12j\xc8L\xa8\x84b\xf6\xc3\xd4c-H\x93oJl\xd0iQ\xe4k"
1274 b"\x84\x0b\xc1\xb7\xbc\xb1\x17\x88\xb1\xca?@\xf6\x07\xea\xe6x\xf1H12P\x0f"
1275 b"\x8a\xc9\xeauw\xe3\xbe\xaai\xa9W\xd0\x80\xcd#cb5\x99\xd8]\xa9d\x0c\xbd"
1276 b"\xa2\xdcWl\xedUG\xbf\x89yF\xf77\x81v\xbd5\x98\xbeh8\x18W\x08\xf0\x1b\x99"
1277 b"5:\x1a?rD\x96\xa1\x04\x0f\xae\xba\x85\xeb\x9d5@\xf5\x83\xd37\x83\x8ac"
1278 b"\x06\xd4\x97i\xcdt\x16S\x82k\xf6K\x01vy\x88\x91\x9b6T\xdae\r\xfd]:k\xbal"
1279 b"\xa9\xbba\xc34\xf9r\xeb}r\xdb\xc7\xdb*\x8f\x03z\xdc8h\xcc\xc9\xd3\xbcl"
1280 b"\xa5-\xcb\xeaK\xa2\xc5\x15\xc0\xe3\xc1\x86Z\xfb\xebL\xe13\xcf\x9c\xe3"
1281 b"\x1d\xc9\xed\xc2\x06\xcc\xce!\x92\xe5\xfe\x9c^\xa59w \x9bP\xa3PK\x08d"
1282 b"\xf9\xe2Z}\xa7\xbf\xed\xeb%$\x0c\x82\xb8/\xb0\x01\xa9&,\xf7qh{Q\x96)\xf2"
1283 b"q\x96\xc3\x80\xb4\x12\xb0\xba\xe6o\xf4!\xb4[\xd4\x8aw\x10\xf7t\x0c\xb3"
1284 b"\xd9\xd5\xc3`^\x81\x11??\\\xa4\x99\x85R\xd4\x8e\x83\xc9\x1eX\xbfa\xf1"
1285 b"\xac\xb0\xea\xea\xd7\xd0\xab\x18\xe2\xf2\xed\xe1\xb7\xc9\x18\xcbS\xe4>"
1286 b"\xc9\x95H\xe8\xcb\t\r%\xeb\xc7$.o\xf1\xf3R\x17\x1db\xbb\xd8U\xa5^\xccS"
1287 b"\x16\x01\x87\xf3/\x93\xd1\xf0v\xc0r\xd7\xcc\xa2Gkz\xca\x80\x0e\xfd\xd0"
1288 b"\x8b\xbb\xd2Ix\xb3\x1ey\xca-0\xe3z^\xd6\xd6\x8f_\xf1\x9dP\x9fi\xa7\xd1"
1289 b"\xe8\x90\x84\xdc\xbf\xcdky\x8e\xdc\x81\x7f\xa3\xb2+\xbf\x04\xef\xd8\\"
1290 b"\xc4\xdf\xe1\xb0\x01\xe9\x93\xe3Y\xf1\x1dY\xe8h\x81\xcf\xf1w\xcc\xb4\xef"
1291 b" \x8b|\x04\xea\x83ej\xbe\x1f\xd4z\x9c`\xd3\x1a\x92A\x06\xe5\x8f\xa9\x13"
1292 b"\t\x9e=\xfa\x1c\xe5_\x9f%v\x1bo\x11ZO\xd8\xf4\t\xddM\x16-\x04\xfc\x18<\""
1293 b"CM\xddg~b\xf6\xef\x8e\x0c\xd0\xde|\xa0'\x8a\x0c\xd6x\xae!J\xa6F\x88\x15u"
1294 b"\x008\x17\xbc7y\xb3\xd8u\xac_\x85\x8d\xe7\xc1@\x9c\xecqc\xa3#\xad\xf1"
1295 b"\x935\xb5)_\r\xec3]\x0fo]5\xd0my\x07\x9b\xee\x81\xb5\x0f\xcfK+\x00\xc0"
1296 b"\xe4b\x10\xe4\x0c\x1a \x9b\xe0\x97t\xf6\xa1\x9e\x850\xba\x0c\x9a\x8d\xc8"
1297 b"\x8f\x07\xd7\xae\xc8\xf9+i\xdc\xb9k\xb0>f\x19\xb8\r\xa8\xf8\x1f$\xa5{p"
1298 b"\xc6\x880\xce\xdb\xcf\xca_\x86\xac\x88h6\x8bZ%'\xd0\n\xbf\x0f\x9c\"\xba"
1299 b"\xe5\x86\x9f\x0f7X=mNX[\xcc\x19FU\xc9\x860\xbc\x90a+* \xae_$\x03\x1e\xd3"
1300 b"\xcd_\xa0\x9c\xde\xaf46q\xa5\xc9\x92\xd7\xca\xe3`\x9d\x85}\xb4\xff\xb3"
1301 b"\x83\xfb\xb6\xca\xae`\x0bw\x7f\xfc\xd8\xacVe\x19\xc8\x17\x0bZ\xad\x88"
1302 b"\xeb#\x97\x03\x13\xb1d\x0f{\x0c\x04w\x07\r\x97\xbd\xd6\xc1\xc3B:\x95\x08"
1303 b"^\x10V\xaeaH\x02\xd9\xe3\n\\\x01X\xf6\x9c\x8a\x06u#%\xbe*\xa1\x18v\x85"
1304 b"\xec!\t4\x00\x00\x00"
1305)
1306
1307FILTERS_RAW_4 = [{"id": lzma.FILTER_DELTA, "dist": 4},
1308 {"id": lzma.FILTER_X86, "start_offset": 0x40},
1309 {"id": lzma.FILTER_LZMA2, "preset": 4, "lc": 2}]
1310COMPRESSED_RAW_4 = (
1311 b"\xe0\x07\x80\x06\x0e\\\x00\x05\x14\x07bW\xaah\xdd\x10\xdc'\xd6\x90,\xc6v"
1312 b"Jq \x14l\xb7\x83xB\x0b\x97f=&fx\xba\n>Tn\xbf\x8f\xfb\x1dF\xca\xc3v_\xca?"
1313 b"\xfbV<\x92#\xd4w\xa6\x8a\xeb\xf6\x03\xc0\x01\x94\xd8\x9e\x13\x12\x98\xd1"
1314 b"*\xfa]c\xe8\x1e~\xaf\xb5]Eg\xfb\x9e\x01\"8\xb2\x90\x06=~\xe9\x91W\xcd"
1315 b"\xecD\x12\xc7\xfa\xe1\x91\x06\xc7\x99\xb9\xe3\x901\x87\x19u\x0f\x869\xff"
1316 b"\xc1\xb0hw|\xb0\xdcl\xcck\xb16o7\x85\xee{Y_b\xbf\xbc$\xf3=\x8d\x8bw\xe5Z"
1317 b"\x08@\xc4kmE\xad\xfb\xf6*\xd8\xad\xa1\xfb\xc5{\xdej,)\x1emB\x1f<\xaeca"
1318 b"\x80(\xee\x07 \xdf\xe9\xf8\xeb\x0e-\x97\x86\x90c\xf9\xea'B\xf7`\xd7\xb0"
1319 b"\x92\xbd\xa0\x82]\xbd\x0e\x0eB\x19\xdc\x96\xc6\x19\xd86D\xf0\xd5\x831"
1320 b"\x03\xb7\x1c\xf7&5\x1a\x8f PZ&j\xf8\x98\x1bo\xcc\x86\x9bS\xd3\xa5\xcdu"
1321 b"\xf9$\xcc\x97o\xe5V~\xfb\x97\xb5\x0b\x17\x9c\xfdxW\x10\xfep4\x80\xdaHDY"
1322 b"\xfa)\xfet\xb5\"\xd4\xd3F\x81\xf4\x13\x1f\xec\xdf\xa5\x13\xfc\"\x91x\xb7"
1323 b"\x99\xce\xc8\x92\n\xeb[\x10l*Y\xd8\xb1@\x06\xc8o\x8d7r\xebu\xfd5\x0e\x7f"
1324 b"\xf1$U{\t}\x1fQ\xcfxN\x9d\x9fXX\xe9`\x83\xc1\x06\xf4\x87v-f\x11\xdb/\\"
1325 b"\x06\xff\xd7)B\xf3g\x06\x88#2\x1eB244\x7f4q\t\xc893?mPX\x95\xa6a\xfb)d"
1326 b"\x9b\xfc\x98\x9aj\x04\xae\x9b\x9d\x19w\xba\xf92\xfaA\x11\\\x17\x97C3\xa4"
1327 b"\xbc!\x88\xcdo[\xec:\x030\x91.\x85\xe0@\\4\x16\x12\x9d\xcaJv\x97\xb04"
1328 b"\xack\xcbkf\xa3ss\xfc\x16^\x8ce\x85a\xa5=&\xecr\xb3p\xd1E\xd5\x80y\xc7"
1329 b"\xda\xf6\xfek\xbcT\xbfH\xee\x15o\xc5\x8c\x830\xec\x1d\x01\xae\x0c-e\\"
1330 b"\x91\x90\x94\xb2\xf8\x88\x91\xe8\x0b\xae\xa7>\x98\xf6\x9ck\xd2\xc6\x08"
1331 b"\xe6\xab\t\x98\xf2!\xa0\x8c^\xacqA\x99<\x1cEG\x97\xc8\xf1\xb6\xb9\x82"
1332 b"\x8d\xf7\x08s\x98a\xff\xe3\xcc\x92\x0e\xd2\xb6U\xd7\xd9\x86\x7fa\xe5\x1c"
1333 b"\x8dTG@\t\x1e\x0e7*\xfc\xde\xbc]6N\xf7\xf1\x84\x9e\x9f\xcf\xe9\x1e\xb5'"
1334 b"\xf4<\xdf\x99sq\xd0\x9d\xbd\x99\x0b\xb4%p4\xbf{\xbb\x8a\xd2\x0b\xbc=M"
1335 b"\x94H:\xf5\xa8\xd6\xa4\xc90\xc2D\xb9\xd3\xa8\xb0S\x87 `\xa2\xeb\xf3W\xce"
1336 b" 7\xf9N#\r\xe6\xbe\t\x9d\xe7\x811\xf9\x10\xc1\xc2\x14\xf6\xfc\xcba\xb7"
1337 b"\xb1\x7f\x95l\xe4\tjA\xec:\x10\xe5\xfe\xc2\\=D\xe2\x0c\x0b3]\xf7\xc1\xf7"
1338 b"\xbceZ\xb1A\xea\x16\xe5\xfddgFQ\xed\xaf\x04\xa3\xd3\xf8\xa2q\x19B\xd4r"
1339 b"\xc5\x0c\x9a\x14\x94\xea\x91\xc4o\xe4\xbb\xb4\x99\xf4@\xd1\xe6\x0c\xe3"
1340 b"\xc6d\xa0Q\n\xf2/\xd8\xb8S5\x8a\x18:\xb5g\xac\x95D\xce\x17\x07\xd4z\xda"
1341 b"\x90\xe65\x07\x19H!\t\xfdu\x16\x8e\x0eR\x19\xf4\x8cl\x0c\xf9Q\xf1\x80"
1342 b"\xe3\xbf\xd7O\xf8\x8c\x18\x0b\x9c\xf1\x1fb\xe1\tR\xb2\xf1\xe1A\xea \xcf-"
1343 b"IGE\xf1\x14\x98$\x83\x15\xc9\xd8j\xbf\x19\x0f\xd5\xd1\xaa\xb3\xf3\xa5I2s"
1344 b"\x8d\x145\xca\xd5\xd93\x9c\xb8D0\xe6\xaa%\xd0\xc0P}JO^h\x8e\x08\xadlV."
1345 b"\x18\x88\x13\x05o\xb0\x07\xeaw\xe0\xb6\xa4\xd5*\xe4r\xef\x07G+\xc1\xbei["
1346 b"w\xe8\xab@_\xef\x15y\xe5\x12\xc9W\x1b.\xad\x85-\xc2\xf7\xe3mU6g\x8eSA"
1347 b"\x01(\xd3\xdb\x16\x13=\xde\x92\xf9,D\xb8\x8a\xb2\xb4\xc9\xc3\xefnE\xe8\\"
1348 b"\xa6\xe2Y\xd2\xcf\xcb\x8c\xb6\xd5\xe9\x1d\x1e\x9a\x8b~\xe2\xa6\rE\x84uV"
1349 b"\xed\xc6\x99\xddm<\x10[\x0fu\x1f\xc1\x1d1\n\xcfw\xb2%!\xf0[\xce\x87\x83B"
1350 b"\x08\xaa,\x08%d\xcef\x94\"\xd9g.\xc83\xcbXY+4\xec\x85qA\n\x1d=9\xf0*\xb1"
1351 b"\x1f/\xf3s\xd61b\x7f@\xfb\x9d\xe3FQ\\\xbd\x82\x1e\x00\xf3\xce\xd3\xe1"
1352 b"\xca,E\xfd7[\xab\xb6\xb7\xac!mA}\xbd\x9d3R5\x9cF\xabH\xeb\x92)cc\x13\xd0"
1353 b"\xbd\xee\xe9n{\x1dIJB\xa5\xeb\x11\xe8`w&`\x8b}@Oxe\t\x8a\x07\x02\x95\xf2"
1354 b"\xed\xda|\xb1e\xbe\xaa\xbbg\x19@\xe1Y\x878\x84\x0f\x8c\xe3\xc98\xf2\x9e"
1355 b"\xd5N\xb5J\xef\xab!\xe2\x8dq\xe1\xe5q\xc5\xee\x11W\xb7\xe4k*\x027\xa0"
1356 b"\xa3J\xf4\xd8m\xd0q\x94\xcb\x07\n:\xb6`.\xe4\x9c\x15+\xc0)\xde\x80X\xd4"
1357 b"\xcfQm\x01\xc2cP\x1cA\x85'\xc9\xac\x8b\xe6\xb2)\xe6\x84t\x1c\x92\xe4Z"
1358 b"\x1cR\xb0\x9e\x96\xd1\xfb\x1c\xa6\x8b\xcb`\x10\x12]\xf2gR\x9bFT\xe0\xc8H"
1359 b"S\xfb\xac<\x04\xc7\xc1\xe8\xedP\xf4\x16\xdb\xc0\xd7e\xc2\x17J^\x1f\xab"
1360 b"\xff[\x08\x19\xb4\xf5\xfb\x19\xb4\x04\xe5c~']\xcb\xc2A\xec\x90\xd0\xed"
1361 b"\x06,\xc5K{\x86\x03\xb1\xcdMx\xdeQ\x8c3\xf9\x8a\xea=\x89\xaba\xd2\xc89a"
1362 b"\xd72\xf0\xc3\x19\x8a\xdfs\xd4\xfd\xbb\x81b\xeaE\"\xd8\xf4d\x0cD\xf7IJ!"
1363 b"\xe5d\xbbG\xe9\xcam\xaa\x0f_r\x95\x91NBq\xcaP\xce\xa7\xa9\xb5\x10\x94eP!"
1364 b"|\x856\xcd\xbfIir\xb8e\x9bjP\x97q\xabwS7\x1a\x0ehM\xe7\xca\x86?\xdeP}y~"
1365 b"\x0f\x95I\xfc\x13\xe1<Q\x1b\x868\x1d\x11\xdf\x94\xf4\x82>r\xa9k\x88\xcb"
1366 b"\xfd\xc3v\xe2\xb9\x8a\x02\x8eq\x92I\xf8\xf6\xf1\x03s\x9b\xb8\xe3\"\xe3"
1367 b"\xa9\xa5>D\xb8\x96;\xe7\x92\xd133\xe8\xdd'e\xc9.\xdc;\x17\x1f\xf5H\x13q"
1368 b"\xa4W\x0c\xdb~\x98\x01\xeb\xdf\xe32\x13\x0f\xddx\n6\xa0\t\x10\xb6\xbb"
1369 b"\xb0\xc3\x18\xb6;\x9fj[\xd9\xd5\xc9\x06\x8a\x87\xcd\xe5\xee\xfc\x9c-%@"
1370 b"\xee\xe0\xeb\xd2\xe3\xe8\xfb\xc0\x122\\\xc7\xaf\xc2\xa1Oth\xb3\x8f\x82"
1371 b"\xb3\x18\xa8\x07\xd5\xee_\xbe\xe0\x1cA\x1e_\r\x9a\xb0\x17W&\xa2D\x91\x94"
1372 b"\x1a\xb2\xef\xf2\xdc\x85;X\xb0,\xeb>-7S\xe5\xca\x07)\x1fp\x7f\xcaQBL\xca"
1373 b"\xf3\xb9d\xfc\xb5su\xb0\xc8\x95\x90\xeb*)\xa0v\xe4\x9a{FW\xf4l\xde\xcdj"
1374 b"\x00"
1375)
1376
1377
1378def test_main():
1379 run_unittest(
1380 CompressorDecompressorTestCase,
1381 CompressDecompressFunctionTestCase,
1382 FileTestCase,
1383 MiscellaneousTestCase,
1384 )
1385
1386if __name__ == "__main__":
1387 test_main()