summaryrefslogtreecommitdiffstats
path: root/Lib/test/test_sax.py
blob: c8c7b3a34b366e2662cac095a91782afcadbc48e (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
742
743
744
745
746
747
748
749
750
751
# regression test for SAX 2.0
# $Id$

from xml.sax import make_parser, ContentHandler, \
                    SAXException, SAXReaderNotAvailable, SAXParseException
try:
    make_parser()
except SAXReaderNotAvailable:
    # don't try to test this module if we cannot create a parser
    raise ImportError("no XML parsers available")
from xml.sax.saxutils import XMLGenerator, escape, unescape, quoteattr, \
                             XMLFilterBase
from xml.sax.expatreader import create_parser
from xml.sax.handler import feature_namespaces
from xml.sax.xmlreader import InputSource, AttributesImpl, AttributesNSImpl
from io import StringIO
from test.support import findfile, run_unittest
import unittest
import os

ns_uri = "http://www.python.org/xml-ns/saxtest/"

class XmlTestBase(unittest.TestCase):
    def verify_empty_attrs(self, attrs):
        self.assertRaises(KeyError, attrs.getValue, "attr")
        self.assertRaises(KeyError, attrs.getValueByQName, "attr")
        self.assertRaises(KeyError, attrs.getNameByQName, "attr")
        self.assertRaises(KeyError, attrs.getQNameByName, "attr")
        self.assertRaises(KeyError, attrs.__getitem__, "attr")
        self.assertEquals(attrs.getLength(), 0)
        self.assertEquals(attrs.getNames(), [])
        self.assertEquals(attrs.getQNames(), [])
        self.assertEquals(len(attrs), 0)
        self.assertFalse("attr" in attrs)
        self.assertEquals(list(attrs.keys()), [])
        self.assertEquals(attrs.get("attrs"), None)
        self.assertEquals(attrs.get("attrs", 25), 25)
        self.assertEquals(list(attrs.items()), [])
        self.assertEquals(list(attrs.values()), [])

    def verify_empty_nsattrs(self, attrs):
        self.assertRaises(KeyError, attrs.getValue, (ns_uri, "attr"))
        self.assertRaises(KeyError, attrs.getValueByQName, "ns:attr")
        self.assertRaises(KeyError, attrs.getNameByQName, "ns:attr")
        self.assertRaises(KeyError, attrs.getQNameByName, (ns_uri, "attr"))
        self.assertRaises(KeyError, attrs.__getitem__, (ns_uri, "attr"))
        self.assertEquals(attrs.getLength(), 0)
        self.assertEquals(attrs.getNames(), [])
        self.assertEquals(attrs.getQNames(), [])
        self.assertEquals(len(attrs), 0)
        self.assertFalse((ns_uri, "attr") in attrs)
        self.assertEquals(list(attrs.keys()), [])
        self.assertEquals(attrs.get((ns_uri, "attr")), None)
        self.assertEquals(attrs.get((ns_uri, "attr"), 25), 25)
        self.assertEquals(list(attrs.items()), [])
        self.assertEquals(list(attrs.values()), [])

    def verify_attrs_wattr(self, attrs):
        self.assertEquals(attrs.getLength(), 1)
        self.assertEquals(attrs.getNames(), ["attr"])
        self.assertEquals(attrs.getQNames(), ["attr"])
        self.assertEquals(len(attrs), 1)
        self.assertTrue("attr" in attrs)
        self.assertEquals(list(attrs.keys()), ["attr"])
        self.assertEquals(attrs.get("attr"), "val")
        self.assertEquals(attrs.get("attr", 25), "val")
        self.assertEquals(list(attrs.items()), [("attr", "val")])
        self.assertEquals(list(attrs.values()), ["val"])
        self.assertEquals(attrs.getValue("attr"), "val")
        self.assertEquals(attrs.getValueByQName("attr"), "val")
        self.assertEquals(attrs.getNameByQName("attr"), "attr")
        self.assertEquals(attrs["attr"], "val")
        self.assertEquals(attrs.getQNameByName("attr"), "attr")

class MakeParserTest(unittest.TestCase):
    def test_make_parser2(self):
        # Creating parsers several times in a row should succeed.
        # Testing this because there have been failures of this kind
        # before.
        from xml.sax import make_parser
        p = make_parser()
        from xml.sax import make_parser
        p = make_parser()
        from xml.sax import make_parser
        p = make_parser()
        from xml.sax import make_parser
        p = make_parser()
        from xml.sax import make_parser
        p = make_parser()
        from xml.sax import make_parser
        p = make_parser()


# ===========================================================================
#
#   saxutils tests
#
# ===========================================================================

class SaxutilsTest(unittest.TestCase):
    # ===== escape
    def test_escape_basic(self):
        self.assertEquals(escape("Donald Duck & Co"), "Donald Duck & Co")

    def test_escape_all(self):
        self.assertEquals(escape("<Donald Duck & Co>"),
                          "&lt;Donald Duck &amp; Co&gt;")

    def test_escape_extra(self):
        self.assertEquals(escape("Hei på deg", {"å" : "&aring;"}),
                          "Hei p&aring; deg")

    # ===== unescape
    def test_unescape_basic(self):
        self.assertEquals(unescape("Donald Duck &amp; Co"), "Donald Duck & Co")

    def test_unescape_all(self):
        self.assertEquals(unescape("&lt;Donald Duck &amp; Co&gt;"),
                          "<Donald Duck & Co>")

    def test_unescape_extra(self):
        self.assertEquals(unescape("Hei på deg", {"å" : "&aring;"}),
                          "Hei p&aring; deg")

    def test_unescape_amp_extra(self):
        self.assertEquals(unescape("&amp;foo;", {"&foo;": "splat"}), "&foo;")

    # ===== quoteattr
    def test_quoteattr_basic(self):
        self.assertEquals(quoteattr("Donald Duck & Co"),
                          '"Donald Duck &amp; Co"')

    def test_single_quoteattr(self):
        self.assertEquals(quoteattr('Includes "double" quotes'),
                          '\'Includes "double" quotes\'')

    def test_double_quoteattr(self):
        self.assertEquals(quoteattr("Includes 'single' quotes"),
                          "\"Includes 'single' quotes\"")

    def test_single_double_quoteattr(self):
        self.assertEquals(quoteattr("Includes 'single' and \"double\" quotes"),
                    "\"Includes 'single' and &quot;double&quot; quotes\"")

    # ===== make_parser
    def test_make_parser(self):
        # Creating a parser should succeed - it should fall back
        # to the expatreader
        p = make_parser(['xml.parsers.no_such_parser'])


# ===== XMLGenerator

start = '<?xml version="1.0" encoding="iso-8859-1"?>\n'

class XmlgenTest(unittest.TestCase):
    def test_xmlgen_basic(self):
        result = StringIO()
        gen = XMLGenerator(result)
        gen.startDocument()
        gen.startElement("doc", {})
        gen.endElement("doc")
        gen.endDocument()

        self.assertEquals(result.getvalue(), start + "<doc></doc>")

    def test_xmlgen_content(self):
        result = StringIO()
        gen = XMLGenerator(result)

        gen.startDocument()
        gen.startElement("doc", {})
        gen.characters("huhei")
        gen.endElement("doc")
        gen.endDocument()

        self.assertEquals(result.getvalue(), start + "<doc>huhei</doc>")

    def test_xmlgen_pi(self):
        result = StringIO()
        gen = XMLGenerator(result)

        gen.startDocument()
        gen.processingInstruction("test", "data")
        gen.startElement("doc", {})
        gen.endElement("doc")
        gen.endDocument()

        self.assertEquals(result.getvalue(), start + "<?test data?><doc></doc>")

    def test_xmlgen_content_escape(self):
        result = StringIO()
        gen = XMLGenerator(result)

        gen.startDocument()
        gen.startElement("doc", {})
        gen.characters("<huhei&")
        gen.endElement("doc")
        gen.endDocument()

        self.assertEquals(result.getvalue(),
            start + "<doc>&lt;huhei&amp;</doc>")

    def test_xmlgen_attr_escape(self):
        result = StringIO()
        gen = XMLGenerator(result)

        gen.startDocument()
        gen.startElement("doc", {"a": '"'})
        gen.startElement("e", {"a": "'"})
        gen.endElement("e")
        gen.startElement("e", {"a": "'\""})
        gen.endElement("e")
        gen.startElement("e", {"a": "\n\r\t"})
        gen.endElement("e")
        gen.endElement("doc")
        gen.endDocument()

        self.assertEquals(result.getvalue(), start +
            ("<doc a='\"'><e a=\"'\"></e>"
             "<e a=\"'&quot;\"></e>"
             "<e a=\"&#10;&#13;&#9;\"></e></doc>"))

    def test_xmlgen_ignorable(self):
        result = StringIO()
        gen = XMLGenerator(result)

        gen.startDocument()
        gen.startElement("doc", {})
        gen.ignorableWhitespace(" ")
        gen.endElement("doc")
        gen.endDocument()

        self.assertEquals(result.getvalue(), start + "<doc> </doc>")

    def test_xmlgen_ns(self):
        result = StringIO()
        gen = XMLGenerator(result)

        gen.startDocument()
        gen.startPrefixMapping("ns1", ns_uri)
        gen.startElementNS((ns_uri, "doc"), "ns1:doc", {})
        # add an unqualified name
        gen.startElementNS((None, "udoc"), None, {})
        gen.endElementNS((None, "udoc"), None)
        gen.endElementNS((ns_uri, "doc"), "ns1:doc")
        gen.endPrefixMapping("ns1")
        gen.endDocument()

        self.assertEquals(result.getvalue(), start + \
           ('<ns1:doc xmlns:ns1="%s"><udoc></udoc></ns1:doc>' %
                                         ns_uri))

    def test_1463026_1(self):
        result = StringIO()
        gen = XMLGenerator(result)

        gen.startDocument()
        gen.startElementNS((None, 'a'), 'a', {(None, 'b'):'c'})
        gen.endElementNS((None, 'a'), 'a')
        gen.endDocument()

        self.assertEquals(result.getvalue(), start+'<a b="c"></a>')

    def test_1463026_2(self):
        result = StringIO()
        gen = XMLGenerator(result)

        gen.startDocument()
        gen.startPrefixMapping(None, 'qux')
        gen.startElementNS(('qux', 'a'), 'a', {})
        gen.endElementNS(('qux', 'a'), 'a')
        gen.endPrefixMapping(None)
        gen.endDocument()

        self.assertEquals(result.getvalue(), start+'<a xmlns="qux"></a>')

    def test_1463026_3(self):
        result = StringIO()
        gen = XMLGenerator(result)

        gen.startDocument()
        gen.startPrefixMapping('my', 'qux')
        gen.startElementNS(('qux', 'a'), 'a', {(None, 'b'):'c'})
        gen.endElementNS(('qux', 'a'), 'a')
        gen.endPrefixMapping('my')
        gen.endDocument()

        self.assertEquals(result.getvalue(),
            start+'<my:a xmlns:my="qux" b="c"></my:a>')

    def test_5027_1(self):
        # The xml prefix (as in xml:lang below) is reserved and bound by
        # definition to http://www.w3.org/XML/1998/namespace.  XMLGenerator had
        # a bug whereby a KeyError is thrown because this namespace is missing
        # from a dictionary.
        #
        # This test demonstrates the bug by parsing a document.
        test_xml = StringIO(
            '<?xml version="1.0"?>'
            '<a:g1 xmlns:a="http://example.com/ns">'
             '<a:g2 xml:lang="en">Hello</a:g2>'
            '</a:g1>')

        parser = make_parser()
        parser.setFeature(feature_namespaces, True)
        result = StringIO()
        gen = XMLGenerator(result)
        parser.setContentHandler(gen)
        parser.parse(test_xml)

        self.assertEquals(result.getvalue(),
                          start + (
                          '<a:g1 xmlns:a="http://example.com/ns">'
                           '<a:g2 xml:lang="en">Hello</a:g2>'
                          '</a:g1>'))

    def test_5027_2(self):
        # The xml prefix (as in xml:lang below) is reserved and bound by
        # definition to http://www.w3.org/XML/1998/namespace.  XMLGenerator had
        # a bug whereby a KeyError is thrown because this namespace is missing
        # from a dictionary.
        #
        # This test demonstrates the bug by direct manipulation of the
        # XMLGenerator.
        result = StringIO()
        gen = XMLGenerator(result)

        gen.startDocument()
        gen.startPrefixMapping('a', 'http://example.com/ns')
        gen.startElementNS(('http://example.com/ns', 'g1'), 'g1', {})
        lang_attr = {('http://www.w3.org/XML/1998/namespace', 'lang'): 'en'}
        gen.startElementNS(('http://example.com/ns', 'g2'), 'g2', lang_attr)
        gen.characters('Hello')
        gen.endElementNS(('http://example.com/ns', 'g2'), 'g2')
        gen.endElementNS(('http://example.com/ns', 'g1'), 'g1')
        gen.endPrefixMapping('a')
        gen.endDocument()

        self.assertEquals(result.getvalue(),
                          start + (
                          '<a:g1 xmlns:a="http://example.com/ns">'
                           '<a:g2 xml:lang="en">Hello</a:g2>'
                          '</a:g1>'))


class XMLFilterBaseTest(unittest.TestCase):
    def test_filter_basic(self):
        result = StringIO()
        gen = XMLGenerator(result)
        filter = XMLFilterBase()
        filter.setContentHandler(gen)

        filter.startDocument()
        filter.startElement("doc", {})
        filter.characters("content")
        filter.ignorableWhitespace(" ")
        filter.endElement("doc")
        filter.endDocument()

        self.assertEquals(result.getvalue(), start + "<doc>content </doc>")

# ===========================================================================
#
#   expatreader tests
#
# ===========================================================================

xml_test_out = open(findfile("test.xml.out")).read()

class ExpatReaderTest(XmlTestBase):

    # ===== XMLReader support

    def test_expat_file(self):
        parser = create_parser()
        result = StringIO()
        xmlgen = XMLGenerator(result)

        parser.setContentHandler(xmlgen)
        parser.parse(open(findfile("test.xml")))

        self.assertEquals(result.getvalue(), xml_test_out)

    # ===== DTDHandler support

    class TestDTDHandler:

        def __init__(self):
            self._notations = []
            self._entities  = []

        def notationDecl(self, name, publicId, systemId):
            self._notations.append((name, publicId, systemId))

        def unparsedEntityDecl(self, name, publicId, systemId, ndata):
            self._entities.append((name, publicId, systemId, ndata))

    def test_expat_dtdhandler(self):
        parser = create_parser()
        handler = self.TestDTDHandler()
        parser.setDTDHandler(handler)

        parser.feed('<!DOCTYPE doc [\n')
        parser.feed('  <!ENTITY img SYSTEM "expat.gif" NDATA GIF>\n')
        parser.feed('  <!NOTATION GIF PUBLIC "-//CompuServe//NOTATION Graphics Interchange Format 89a//EN">\n')
        parser.feed(']>\n')
        parser.feed('<doc></doc>')
        parser.close()

        self.assertEquals(handler._notations,
            [("GIF", "-//CompuServe//NOTATION Graphics Interchange Format 89a//EN", None)])
        self.assertEquals(handler._entities, [("img", None, "expat.gif", "GIF")])

    # ===== EntityResolver support

    class TestEntityResolver:

        def resolveEntity(self, publicId, systemId):
            inpsrc = InputSource()
            inpsrc.setByteStream(StringIO("<entity/>"))
            return inpsrc

    def test_expat_entityresolver(self):
        parser = create_parser()
        parser.setEntityResolver(self.TestEntityResolver())
        result = StringIO()
        parser.setContentHandler(XMLGenerator(result))

        parser.feed('<!DOCTYPE doc [\n')
        parser.feed('  <!ENTITY test SYSTEM "whatever">\n')
        parser.feed(']>\n')
        parser.feed('<doc>&test;</doc>')
        parser.close()

        self.assertEquals(result.getvalue(), start +
                          "<doc><entity></entity></doc>")

    # ===== Attributes support

    class AttrGatherer(ContentHandler):

        def startElement(self, name, attrs):
            self._attrs = attrs

        def startElementNS(self, name, qname, attrs):
            self._attrs = attrs

    def test_expat_attrs_empty(self):
        parser = create_parser()
        gather = self.AttrGatherer()
        parser.setContentHandler(gather)

        parser.feed("<doc/>")
        parser.close()

        self.verify_empty_attrs(gather._attrs)

    def test_expat_attrs_wattr(self):
        parser = create_parser()
        gather = self.AttrGatherer()
        parser.setContentHandler(gather)

        parser.feed("<doc attr='val'/>")
        parser.close()

        self.verify_attrs_wattr(gather._attrs)

    def test_expat_nsattrs_empty(self):
        parser = create_parser(1)
        gather = self.AttrGatherer()
        parser.setContentHandler(gather)

        parser.feed("<doc/>")
        parser.close()

        self.verify_empty_nsattrs(gather._attrs)

    def test_expat_nsattrs_wattr(self):
        parser = create_parser(1)
        gather = self.AttrGatherer()
        parser.setContentHandler(gather)

        parser.feed("<doc xmlns:ns='%s' ns:attr='val'/>" % ns_uri)
        parser.close()

        attrs = gather._attrs

        self.assertEquals(attrs.getLength(), 1)
        self.assertEquals(attrs.getNames(), [(ns_uri, "attr")])
        self.assertTrue((attrs.getQNames() == [] or
                         attrs.getQNames() == ["ns:attr"]))
        self.assertEquals(len(attrs), 1)
        self.assertTrue((ns_uri, "attr") in attrs)
        self.assertEquals(attrs.get((ns_uri, "attr")), "val")
        self.assertEquals(attrs.get((ns_uri, "attr"), 25), "val")
        self.assertEquals(list(attrs.items()), [((ns_uri, "attr"), "val")])
        self.assertEquals(list(attrs.values()), ["val"])
        self.assertEquals(attrs.getValue((ns_uri, "attr")), "val")
        self.assertEquals(attrs[(ns_uri, "attr")], "val")

    # ===== InputSource support

    def test_expat_inpsource_filename(self):
        parser = create_parser()
        result = StringIO()
        xmlgen = XMLGenerator(result)

        parser.setContentHandler(xmlgen)
        parser.parse(findfile("test.xml"))

        self.assertEquals(result.getvalue(), xml_test_out)

    def test_expat_inpsource_sysid(self):
        parser = create_parser()
        result = StringIO()
        xmlgen = XMLGenerator(result)

        parser.setContentHandler(xmlgen)
        parser.parse(InputSource(findfile("test.xml")))

        self.assertEquals(result.getvalue(), xml_test_out)

    def test_expat_inpsource_stream(self):
        parser = create_parser()
        result = StringIO()
        xmlgen = XMLGenerator(result)

        parser.setContentHandler(xmlgen)
        inpsrc = InputSource()
        inpsrc.setByteStream(open(findfile("test.xml")))
        parser.parse(inpsrc)

        self.assertEquals(result.getvalue(), xml_test_out)

    # ===== IncrementalParser support

    def test_expat_incremental(self):
        result = StringIO()
        xmlgen = XMLGenerator(result)
        parser = create_parser()
        parser.setContentHandler(xmlgen)

        parser.feed("<doc>")
        parser.feed("</doc>")
        parser.close()

        self.assertEquals(result.getvalue(), start + "<doc></doc>")

    def test_expat_incremental_reset(self):
        result = StringIO()
        xmlgen = XMLGenerator(result)
        parser = create_parser()
        parser.setContentHandler(xmlgen)

        parser.feed("<doc>")
        parser.feed("text")

        result = StringIO()
        xmlgen = XMLGenerator(result)
        parser.setContentHandler(xmlgen)
        parser.reset()

        parser.feed("<doc>")
        parser.feed("text")
        parser.feed("</doc>")
        parser.close()

        self.assertEquals(result.getvalue(), start + "<doc>text</doc>")

    # ===== Locator support

    def test_expat_locator_noinfo(self):
        result = StringIO()
        xmlgen = XMLGenerator(result)
        parser = create_parser()
        parser.setContentHandler(xmlgen)

        parser.feed("<doc>")
        parser.feed("</doc>")
        parser.close()

        self.assertEquals(parser.getSystemId(), None)
        self.assertEquals(parser.getPublicId(), None)
        self.assertEquals(parser.getLineNumber(), 1)

    def test_expat_locator_withinfo(self):
        result = StringIO()
        xmlgen = XMLGenerator(result)
        parser = create_parser()
        parser.setContentHandler(xmlgen)
        parser.parse(findfile("test.xml"))

        self.assertEquals(parser.getSystemId(), findfile("test.xml"))
        self.assertEquals(parser.getPublicId(), None)


# ===========================================================================
#
#   error reporting
#
# ===========================================================================

class ErrorReportingTest(unittest.TestCase):
    def test_expat_inpsource_location(self):
        parser = create_parser()
        parser.setContentHandler(ContentHandler()) # do nothing
        source = InputSource()
        source.setByteStream(StringIO("<foo bar foobar>"))   #ill-formed
        name = "a file name"
        source.setSystemId(name)
        try:
            parser.parse(source)
            self.fail()
        except SAXException as e:
            self.assertEquals(e.getSystemId(), name)

    def test_expat_incomplete(self):
        parser = create_parser()
        parser.setContentHandler(ContentHandler()) # do nothing
        self.assertRaises(SAXParseException, parser.parse, StringIO("<foo>"))

    def test_sax_parse_exception_str(self):
        # pass various values from a locator to the SAXParseException to
        # make sure that the __str__() doesn't fall apart when None is
        # passed instead of an integer line and column number
        #
        # use "normal" values for the locator:
        str(SAXParseException("message", None,
                              self.DummyLocator(1, 1)))
        # use None for the line number:
        str(SAXParseException("message", None,
                              self.DummyLocator(None, 1)))
        # use None for the column number:
        str(SAXParseException("message", None,
                              self.DummyLocator(1, None)))
        # use None for both:
        str(SAXParseException("message", None,
                              self.DummyLocator(None, None)))

    class DummyLocator:
        def __init__(self, lineno, colno):
            self._lineno = lineno
            self._colno = colno

        def getPublicId(self):
            return "pubid"

        def getSystemId(self):
            return "sysid"

        def getLineNumber(self):
            return self._lineno

        def getColumnNumber(self):
            return self._colno

# ===========================================================================
#
#   xmlreader tests
#
# ===========================================================================

class XmlReaderTest(XmlTestBase):

    # ===== AttributesImpl
    def test_attrs_empty(self):
        self.verify_empty_attrs(AttributesImpl({}))

    def test_attrs_wattr(self):
        self.verify_attrs_wattr(AttributesImpl({"attr" : "val"}))

    def test_nsattrs_empty(self):
        self.verify_empty_nsattrs(AttributesNSImpl({}, {}))

    def test_nsattrs_wattr(self):
        attrs = AttributesNSImpl({(ns_uri, "attr") : "val"},
                                 {(ns_uri, "attr") : "ns:attr"})

        self.assertEquals(attrs.getLength(), 1)
        self.assertEquals(attrs.getNames(), [(ns_uri, "attr")])
        self.assertEquals(attrs.getQNames(), ["ns:attr"])
        self.assertEquals(len(attrs), 1)
        self.assertTrue((ns_uri, "attr") in attrs)
        self.assertEquals(list(attrs.keys()), [(ns_uri, "attr")])
        self.assertEquals(attrs.get((ns_uri, "attr")), "val")
        self.assertEquals(attrs.get((ns_uri, "attr"), 25), "val")
        self.assertEquals(list(attrs.items()), [((ns_uri, "attr"), "val")])
        self.assertEquals(list(attrs.values()), ["val"])
        self.assertEquals(attrs.getValue((ns_uri, "attr")), "val")
        self.assertEquals(attrs.getValueByQName("ns:attr"), "val")
        self.assertEquals(attrs.getNameByQName("ns:attr"), (ns_uri, "attr"))
        self.assertEquals(attrs[(ns_uri, "attr")], "val")
        self.assertEquals(attrs.getQNameByName((ns_uri, "attr")), "ns:attr")


    # During the development of Python 2.5, an attempt to move the "xml"
    # package implementation to a new package ("xmlcore") proved painful.
    # The goal of this change was to allow applications to be able to
    # obtain and rely on behavior in the standard library implementation
    # of the XML support without needing to be concerned about the
    # availability of the PyXML implementation.
    #
    # While the existing import hackery in Lib/xml/__init__.py can cause
    # PyXML's _xmlpus package to supplant the "xml" package, that only
    # works because either implementation uses the "xml" package name for
    # imports.
    #
    # The move resulted in a number of problems related to the fact that
    # the import machinery's "package context" is based on the name that's
    # being imported rather than the __name__ of the actual package
    # containment; it wasn't possible for the "xml" package to be replaced
    # by a simple module that indirected imports to the "xmlcore" package.
    #
    # The following two tests exercised bugs that were introduced in that
    # attempt.  Keeping these tests around will help detect problems with
    # other attempts to provide reliable access to the standard library's
    # implementation of the XML support.

    def test_sf_1511497(self):
        # Bug report: http://www.python.org/sf/1511497
        import sys
        old_modules = sys.modules.copy()
        for modname in list(sys.modules.keys()):
            if modname.startswith("xml."):
                del sys.modules[modname]
        try:
            import xml.sax.expatreader
            module = xml.sax.expatreader
            self.assertEquals(module.__name__, "xml.sax.expatreader")
        finally:
            sys.modules.update(old_modules)

    def test_sf_1513611(self):
        # Bug report: http://www.python.org/sf/1513611
        sio = StringIO("invalid")
        parser = make_parser()
        from xml.sax import SAXParseException
        self.assertRaises(SAXParseException, parser.parse, sio)


def test_main():
    run_unittest(MakeParserTest,
                 SaxutilsTest,
                 XmlgenTest,
                 ExpatReaderTest,
                 ErrorReportingTest,
                 XmlReaderTest)

if __name__ == "__main__":
    test_main()
8W]i4MH̏z%msʓҋesp}m.->o߇quxb8V$R/=`L4*i01D`"*5.cXai$l7+`C=DoR+g.MJ%p;K3/Pe2TY!p*ko!bIj(#k턉Wxoy5ŒI|HҶ]Cd%Z@ vc)GsGؚWA(V 1;]5Dɨibs*H=m&8t-_-=nIm Cz 'PHur$ŋ*?\F(κnOd6Uv-_P,u°t3Ž7Y󼎵p9 yu<:l\@glPreuFߴ÷6lpL=*cb{$!( aKl"rp WLCL)R*leze"7f̫+Iե%z?~6htDG׋ZbN/>Nc[QTМt0J1 0Z0׎7ic֊: s6:@7Sbst^ǩ Q=,_-طQɮFÇ4°u5l0-;9p3 oonI%k-zrF8UqyNhlZu&l;Mphbֽ/6qc2[=|8r,@-op%R<1nLiʫDo9pLOcPf*tx7eD9#e]Thhjh8<(GtT2]p||l]U $ [pF' U?C<UZz%C9}HGҪ4": e7;Ǝa?=/uQ]jpK=WTWIw?1U[L'H+ur%a'ԋyhM$(%PjQ`(:7RQ &k ׺)*r%ܮW5S'RUxFG+6jLJ;F掂ux 1c}lmJUtz1FM x7"YyF>_f,QGHĕ;?;SJ;* Okrd-jrM64p#eՏ/R}JLx͓sj6Yd!iRJ=z 0$0/ S)DAwDDAeȇ@{ЇBXt{Sl[\ZWC%,uHjvw,+-'k_Dз<6"Ֆ|rxMwA_Jl(sco I"̝wܳ-JJ l}ǮTemϼCsLmg[,fS2s* W bolXL0`\_DmM6E1iGY9lj_Kq)I ҂JF(Ж r1j2rihU˔Z$ShjV֒N2 4 aPKC6  ,%b,٫Y8f0q0*z:`?$kG=req-#SKk|9`Qݵ6n%P`:OP vz .\T0"!/~^1?!Yr[!]BmH,j#)@r,Jb9=#7Wf{-5L-e]m6"G$ oH5Bh&S"eg,BuTI`?؉d0#ܶMW+zv5t\"7ulԻw;b 9,(|]بj8 %آ;SYp߳w)RuzdF,n&Da9FE]V"j_Aȡ&и9,[᠘eV)q:@G `p3TGT'.) 250+^${MY5kr.%(I10eN8OEM ?KV2ڽ*7:3wT'{(G]OZ4G?dYPx6hN+zuGZ[ e$! |xX >q!EG"\݀Uq1B.@IfBMi|dTIA:pۂi)n6JmI ɰ5,Cv$/}m,V5&xl4jGI j~Waz7d7l;74=ΕF:ۺ/8^-~#cuJ %vv9SRVmIs9D8aA%0i6vZdLzM̡i 9z´~Xq2bQ-B*Lgocָy}9|;2Lq:ͶX*8fz@ Ez+8E܏LNT_ďڿ6o5G"@#Eo=h(ҔhgDcwC"(8hȔ lSW[lAفą;q&,Cmtyܳ( ,@4`0?Ntk)L 2(y< Uakܬօ5.As4b{*Jva$3 GsiϴH+RKn,;x6} C\V'] eEɠij,6ILr/:Ұuf+z4] PD#cb0JXaIfbxik]6/~iIiH"sKJ̵O6ZN"qvܓW/LrTi B-zZÛƯGn@ $-3:QB!xGv$k%-lUPt}z~ : |^HL۫5~  }taC<PVy9r'VE&8.6 p]'b6cׇ;HUتW0Bц߰lcFwC~£=*Xf2 :C[ǨMu88^Ua L(fj Xjx ׼i,f?Gf4H7zP)Ahz;"H(8i ʭ r ?$uzˋ {NC񲱼spJ7HS JQ=Usf$/2}+b1R?1OL;$iƞb'M=QXfj Ʉ:H?P_%LG!P zu-цy vmNmZ'#X1L]H tFdBAG/hKO.p)+| fHA ?}KL-HZҫKbס- 2aNA Xua>J+kAaSwXG|&q#CirtO:^Xb|:R_| xhc`.+Ke QL4J&jQqis g-b @ۊυUNs/J$P*gZeS,YglaR7VT`V-x;iѯA_]UA"N4xނҥ2pdW8DalT{/;p7-%IH ,I7M9HtBkLjcP8: dac(qfl1ۍ\js{m&T'{)uu<+3]gS# 4e)S^[N<p.B[nkX.e-fvԡ (Z .zbEtx)Lb2d;P89Qv@t&h0>MO2Гm_5: Ub?rBPc)m7{a˄ !‰iketrR\WE"V.[SR8<eu!Yu@lM%9.8Yp%rVIAJ]fKlIk ⅗b}\m1D%*Fy0߰3zLCΫPk9 `ATf=6$hdgpL#db;bAb h-V/zNM2حŲmoByP*{S?&š##?s/V=f="̨N\Ԑ[A QGw ғI lX 4dɴGNa ހt0&NCAIoﻞ&5{TɭedU\[/ @=ˁ{+g_70ۭU^/ ލmTЯ/8+}I+3='U~ B4ny04E&5 mV$3)b(4egb' %%r2qW8(goo.`|7MyMˈg2]ӓμq۳ AxqQEhtq'  ^-_hm /ܾkk>{Sn6&Шim_nG/҈F腓/-@;u ˀV1!n)ȭӵ1vo*hJ;=so_SJt $Zksn[_fsgW s«$(!V^r9xSCdc~TxS Ҽ䡕Te5+ Mt+YHIɯf`?lch"[Z8)gIˤ^m)\ !f:='ůV& 5aNRēٮs Qh؍uC :(bɸdKFu8.sPIs-"Q} {f x~1#Kҙ,M~m^^T-`s>I!U8-ɔ~lnQr6 ]WG|Y'!H-U_#k|,!\sv&`Jm-d.EJzy]c,>ApXz膍m%My4" U~6j2majŁxXeX3M\4#D%ԝޠ4!d&e@-A7c=v/))CZ##җ#"5,OKDxw_4xt' cƳc;N~-^w8\fnu>)ZJ u3K6O6A*7u$s֔ EajN>c7ǃ :RxBdoWI@YlZ7w8xNxę64 Rw nHM Q[.h9~O(-FQ9B;YEC@)]rW(|G:\iKyyn! uK~}~ .4[?9xI ;o^]9b[6A^ (*Dם o.*?t^ Dv H{ǎg0'/Y?'Jp,Q7;̸+PMm fyh,Qȓ)Yi%a[I#L` '(w"~R'ehDNQʑM%ls+G2f'{Z^v0˵M>X?Gm;Дx嘵Je;Ua?:kZOYb u+v_[FbrH˙XYfܛLRx} #Ph'D&Z$*\P6`k:[.BRl;-, 'gp 5/7ɮΦ) n]E1.CGh!L%޹m2o((/N701.ޱOma  '~]xT˵!?VHruS6җ~JY'&vIM0j]JưNit)øzsa'f]+ǯ.__\C3<D|-" b0B 72{j+hˌҙɟ^r\O' ,AM,WqNwiXXϾLUeCz}g=d}C8t\zr&1ncFӳ!DS+A YeT25&- ]6=xSYTs &u.( E9eHpՠh2qi5$7.r>XmLZm=\Ip:mSxo84;6X@'֘{RF5K[F{x.hpI{M[>,#9^sc\+Ĭ/l[uqZ6XKs/q3 BʴefvXyNwkS8D_5|Z]kSm8}%uVUHE%BGzkvN"v87CqGIFTZ鰬h ^c[ADi];L2zϒHqw$aT Lөh%ie-f`O M*өīű{p4l|O|BؤD\7vt0< ;AES4 4YQp4a\L v{<2_IHm xVE 5Rz_϶Y,W#)I )m]&_ 6W iJ [JGjD4*aՎ@ShbWڬ cx E7Up)(/ES@:䨦K[3Ӱ"05ÌV&rI`<ӬN ť;+8ZD ao΢|}9 q L8SAX'θDb ,2r1C$)Tk@9{0WqcI÷t YCMC}.2pPK )%Ww1+ cpython-3.12.0rc2/Doc/c-api/init_config.rstUT?d}ksƖw TQ(Nn2F8ٝ-"A k@ɼ[3}Ϋ_@7Hê*4Nw>}{0ӻWFNg0iVCf}R$Q Uy1feϣ*Dztdh6״H+z%kD~]˜<]Ywh.|IspI%H֋6$/S\->@IȳeUC\O]nmJb;Q/ fKks6i@! Zī"Z]Rvs x)daV]ɬO_o~F|/e-y p<*x")%<CW,NIO?io.pgUwE X³KIY*I :u8-”U:1v`{3d w~vBRc<,`m2΢e>K`8\h /@~/}Gm.7U\K؜ X b1<6~ 7홶`C~6f[h4V˕zu ÿN7G5`PeΣxip ׳?w9D@ώo4^NAsNj$.u"fEfu[ p;8GSZ/A-H|@ J"J2).-+`SxGW?"Dq<yDp0HguU<6!!ah#nq?3NyH~9z?,%0 f29z:C9^,(ը#W e W/YlVfӄg6>Zl֭? 0ϣ(?z/_M&QӮUj'~IQGQ $S|<(ƧLךRAg#L=<`AL+O&/a|1my,J[\SЇرʩ'in-4reeU)ڻq0#kZV hLDs{KiТ(PvE?X}~3ꚍ0(V]b تGDS*#,C&׳j|~q3W;fyID04M] hc8vޠÓ+)_tZpq?q_?[6)̒]toW^ЫAѯ,y/-ې&"_=C Nl=cMrV oK7ǭvRy;WO"cr00M REgc4kNj<זTٜA^EQ`v&+&|A}"}Ӂ.f\`x%g:02uv6qciwtkPwZ~>7 Ey_*`hh\v_O"#B1oN'9G0yL Z; 24gwoԈbj0ؚ&u3sM&jף_&۰O^1v`8ŶF+qRnM&=LWJĝ5]H 9z<euFwĆY%=\hrxu&jU2hg:SrQhA'iߘ%S"yow?[<&/%5l?ֽšX]C91`8}:w_a4QjQxrOoYϛv~P +=6ѣuK9(p̧Ƅvuy뻦FaX4'Eb؄w|| =,+ścR4' Z8Y ?/ͧ,WO,g#uEOkqs1i&swLޅBϠldAxF[jaK甒]LPݎ )#ZUrh 4`2)mM3e[DxNL%b]`cG*~_B)[b]8JY\n=~N(D0,^wo[?׊*S=&1AfyL|Fa2(Qf> j^+=XHdC{l9腇ޖ/lkt&$WAtM J2(wjB nBcHDR=M;)D>)SF"O%VȈi_RZKh-o@mY]V.8=t{T'6rzIZ%(j4mW\" 8`2͒%לelvA J;RkX")s[ d5#_3D$k=#1{(G!-~kYr3׳}R x:sO3 t 7;rיoHuChaľrЃpnRFu_,{T"ђV sqZbgU^N Ecl!h`R@A9g3?eu<˦q֫fdF`3qp~J/5b@;8^?NMg݊^JE>oJu)2[H.@g"CS@au$U铅SZ:1jL!(V6O Rfd.e>?Qq@+W0c bu7}D:'v0o8Z:T8ezeEǁ'z&Yt`7Q2hN^BEKנE.?Gc0c*zG(@jo2MhMB,osD?b!4@N!Bcg@5"5#$mpx#7.~]E׸>:^ݼSo3"n, șͭvI'oO&כx#Cj;^EպjK56#_WP=s?62o?}jǗ<g!ŮͽQ)*WUCfQ+o☰[n CY+*ߞ~76 Ɠ;\s[h#z=<*D$gha"% b~t P"؟?}ȋ*尷1E!ּωW*AxCd׉2~FfYJ=Ԍȣ[a!F.oӥ%.i*PtPs$[<z=aST nHi-qZA_9-;y4KIV,t嚬WN5QsnD+-).lKoMG䛰)G%i8i1`ď*6kio16HRAZ'8w4Էΰ:U0![Ȥ3! #U4bB劘>yf@,TOdA _*ԷPXxwtzp}g.l1]Pm2}/8rBJ0\ۿ\6F -R8): {< .ΞX>ěf-o64bL*rqҍ둸A?o_^]NˋSbv 8]`IdYVt8.u,h6M9աZ-& - q#֤L ]2SNS.ʔ4jg <$8FI4˓qa,Za_a å 0:)@w@vr@-|Wmաffٓ:rsLTYy̲F` Bjxyy*&2y-YzLr Nߙ!`R∐2jyP~ @(5ō=^0oPqLk]\B(ߙ~eԵEÞph_jqq ȝNjU$%ʒ[Ř]=,}Mz|Of$/c!G0[OS귱^oUs<+eC9;6dacֆqp}.[gSHG!gɅCuUK871hFF,huvw,*:upay=Rϑz;o:+h 2Vau-D"wLكWӽP)o:]"œKݵlrR|{|^9ncIࢺ;!m}Vnk{u+M e)_X0կ=ו"\R圗N0)VA-x‰|+5~鯿DcN#B/D\bJ/% _뛂۪Ze]3s\hi.DcZKhkC"f^1X#E>3__ݜ޼%q>h1aUwAНiF]wg7?*6Нd;E)ŷd@yxEk eP*tGffHUXQA .6p<ڬҩ2:7 ^w#XsX"D o=0+nm9 ,Nf]vT@AxPInqΝRlh4((܁ DfRk:(δSh;{Y9FL)c e7U =cozڈUv{&ikm}N悳@3R*Bے<ok@Ñڻ\ܣsUZ9.du"4Gpf,cuMN&Na}Se1=%ޖAH' @}m@K, nڌ.MzAKlZrCcs2[Q%"p - =s @&I[ۺ٭ 7 ֶgAV惒Ri#)TiJ;Sfd$Bl"$!4"7VYhSai8ON#_Uud2 lOjWLÅfVu@!g8\" >9+x? |6VLmH.| ʼn%9NwdX/::~wmKK2SMOnB٤&-dh<F&68yK^c ^˖4Tz6l=ʏEZUIw!Mm)zLP`-I﷌ޑ,ٞߗEJti6S'n" Z^r+ߘR08jmhU6Qӕ䞎)m̎06lB6ߋl}z@ks}5<Dc"jyQ7=e^`[If3_"TBb&8A #l30O*ۖ@ C"QJT Vw!GP$nnS ґ<~8kgǃ%qנMeKDpYɮ&\亝,,`=QM.&[okC'gdר?MmOc\lx#%bJXd;E\[6NJϖkȽTN )VJM4O}213؈9̓1^eB/<:jfP˗e(޺-)JN'32AXDr8hw z=w*Ʉ ezQbl- fD Ul'ٿgURǜbe xdJe $o[F +:I(ԑ1d5xւ:%^\--?5^Ӈ|􄌢绰D%C;xf,bzXzt${FE?ۍ*T .1FIV㺭_ *vgTK} +8_z3<^5<.F& K?ǀQF3}%IkX;&SN(>-pAřCuv>HtZj+FC֔*v_&r疅}=ߐ ̜tB^ڂbfbDg^G!W ׭kNnE[}WWUfqOqkb&$o0T֭N}2@#*+ 6"m XhJ'KZ9\ A Vh;%7XB\Xuc$:0+Kc+%S-ĝCLV9Ӎ;GTiGU*_M29u&B9/.z#P 7>Y[VǼ;8r)E8mہHZ@=#_::FnLH^zU0i_JYӏ8gPyG+!~; ?Ps!"51]Nt9z`0^A'l,1˛|G$tP}Boee:,eܼC8ɦ^+P;J Mz$W}$ܱgl1tXJb} O L |n: ua?_& /d|KIBtI/ɎԹDdZk{4*8r;M)2.87CV<Վ[Fg~Z#Y;th<0$:h}c4Le.PU4L_ӡXɃ{`&\~Yd ƐeJRXDGхSe2յc0<\Y=.cV8N};1ObHS,kP=߫{\?ڻ]=^``9n*!۾ydŸ\s PRaie'LR bK3\U%4$bC5u5j bQHo'<4l;v"_%XI]m OLE$֋ݠD~ѪJ$FˎB:vv\# {v:S HLE+]܉ EqV,ӉVE:U]%ϊTu$1rYЄʹ3a:~^QX[z}_|US/b 𴠅]B k /ȖI#*ƙ'(VD~ "$uT%@G{+J~jtH95 jN?1"8:nIxD"Ê E=In PPK )%Wj-/% cpython-3.12.0rc2/Doc/c-api/intro.rstUT?d}{sǵ)@dlrI;U4E٪Wc 9`!987YVL?էSsS\ߔ_{zjYMfoj4ˎ>\u˶7kη۲Xּm&llz6|iM[.3&V6|ᖆ m,[)l3ڔΖnj / S8ce5`YtY׍Y4_6x4vmƮ0%o@$ʫRVm]IK\-0N3`GM`&R9#4&MLoBei*+ 빠iB'8=J;7s`dA$:e74C{s$x2SfvQ]K?Ybag ^ eǫ).d 71BYLp,*aVktAN^=i.LTlj°I9,nVqN[7[ʋĿ=V{tgYdY.go۝-sy|ur"E'!<ɲ&Ց˺HEe΁⚐67Œc]1LV??@|MYQNW2{'__F)J`0?Bp:[qއȸ9r'H UL̶ sm(0MtfK%1sd osz3B$hjsLy3ySBc2NoCTh鏏Zca\6]'41l E9/7ydaq>%džpԴꯔSS7>xLeYOMo-<],hzhe[@wbi!]v+sI2mM|gR}-]HԀ.['H-OJۚs58fUΒ WcM>P1q~y`=j/swRQ89dMӪ%jֿ=XCxoWP1IF  #Gfc۠D`캄E:δfԛh!މ_AjJ>QCI4M0ܫ ;"fSͽʛ[|Vހ},1`w_7ϫ Ԗ!ӄng<7mș : CĵDkFp^\P;@i?ax^0f.-y!4nQEiشj\w#%/5)%} _{{?}!@(ތb56 >}ϣߝ{u~ߣ溃5v Y-K ΅D O-ښN~yş~c?=ab'Le?Qk4!b]}wyqH77&h5Đ##V*DHn^ =Gc6 =\=Wl }7֡_]}a\uo<];9ŷ/_?r-D}uGG@;/aĭ{Bt)Wj@2V` pFꔄf+V=?nea{k+1*o.JUuf9o4|L3{]k[& 7r}&Z# ÉM5 TfcWR :xFzo}mZq!+cRa5z8s_~/0q0](m}Go\*!yx"Fq!/<#I$><s)^<'i@jNGJ# FvI', 7[CrqxTÑ*IBʖ9cD>9rbH;$8Ĵ4K7tװz+CK`nr1]+_B'c$GcVej}Ɩ[g[Bm^7]i 3 Gk*1'k&D|c>)Y2oۋ '݅l5o}H-{Hm IxH }( u [%LP|yRiPoI FJ_ 9҄9I"za~!, kAbd98,׸o7JdhmlLZhq"dq+XVnԍf,%_ g`U!ky|@Gl@>ۼ{xXpEG\0|ݙ\-8' h$9H,nr x!1OX:Ǖ,ƉxI)-#d)n:qq1hz^Zzphf2n9 m[og4#fDTM"VHdݽ3& ~|m~~?&N~=M̈lBoe bb^]o&F{c>R2_!Z{SdȄ(`k',9q۞?M6 QxmU -R\u[q5 J-bf0n6+偻 u0ڙ&Flb'mmF%SWbtX!66cYR1-P 2!5DG2)A渂dǰW[䤒afuKumÒwf:*g,B"/0A&ӓtN&=S_vաCs{K/T+)^)0&!z32JBB._g%kR.*Sk("C̜mj 90ECjܓHΖ,5Gi;\ G U712WU5^_JD-8Z #.|$wEIO$# ˋgijNI$*̏0.v^xw|4|R?NIU$mW2T peі;"%kX{B&6W>:( j `IUWLhY'C>0n"5 !Âv.d,yǏ1[YcI(UY{@h|*)EibjN ]ZC=/K%(䑯Y̏8<kn?0\ m17+Eц`Vu7u:8P*gm A+d <s(zMY;6览vCv)v TвAjhU>\}ǒA@9IRd=!.KPck$/2D% !dF&㤯ڋ6Wx8{b5)-L?ąJrnr54یM-\S `>d!ppv\D0n֚JZ^.'_"l ~eM=tA~13."K1VmR1蛇h3j}pq4;[28l T2JJK9-.j;MHs9ұwr#!^p2%(Ɛ2,ʧ} VJ٪nf#DƉmѮ1-I&%|fEm3I=#B{bQOT JꗶcMHLpHl˲zoII]Tl\rJY \He UU/ x'e]cYXؘEuW (HFQLz wY2RHlj1 U0` `\ ",q [M2bSm<#V[ B"61 m] '~&ow;ßWf>KvVBNDMfu-9$oA4ٝFŦrҀ(NʒX(%B6͓4-*D>V]aKW)1(Zvs^YRIc,9&`^!gm%zrrB/iTWű2p4> T`ygO\HAʈ`X 0c =s6$q b1u4X SZ9u^H^F6$'K-w! p5BKĶGmnB (e76Ns4q [S 7Dhk+zɤLUfT75}\|r+}<@KXފ1ǭ$[u ~LՓ (Ht62zrO?T6o\q>v!w^FoPRƮ M\[ \}.>[=Yw'bHiUL {/D/| ?nMr}SuSj.'s_v?Lyfˌ>%kخ1zJ%SڢTX߭+7F$ʫ I,=8# !9)(HDe$W*0E3.GĀHFNXq*Rz%KR%lpvF/"Cǔvb,Ĉ)) u^bRZxif$ )U+dhب?U58_gxPt`!@<6xF,)JYSgf>c- 8NJ$e65ˣX%:)8 +~cs Beh?;\_tLg/6Yґ4)5a?9uzh. />”ޔ{h7j[ Ҳ\/QU{HS x=2;42`GBx"*À#W;k@`-Ԩ2Fmf7Q(_tmM^tD$Y|+UC-&> :~6t:~O)o&ӯl ~yQ&}^JX9KSTs~uK򾪫(Rsǎ=g_Ӿr47eHhgK/j[Pp.aސ믬A_<OֈR &rQc` ]~Ka҈5¸lG 5: vݧCgl^VyϿN}x }3mIq5pKtJ^W!,juҚ.MRo[R~], FUSKmi//g #B]d%7E`{UwaX||;$iUV&MV}reʉ7hmXVo kWE,da-?:Vm 9i%" bqJ4ֹ4z,S#'Sc`סL?8x7zfɐI lFEyHLJzMR~oW?N܀աMCƤyQGy6b\ jKGIj$\[<#H29W榉x܋(Н*KңU磘; %8ڒXr\Fm=Y=w2l eR%9p3aWCAq$"m<-~gor|L]J3L^4pM6e07/K˸xy֭]h'qAur!F¬}# UqIؔKzDؤ`7=2::0^pi]+&! fi.] 6H)w+E6E &Y|oj#n:xL두hߣUQ7ؿ +   Ә 3d~3FgQ灍1OӁFÑЬǬ⢥̫y֔t69$IVb `lpt'Og=r.|5\Eb+0+3F 8/X XPc[H_~ej$niC55CuhHhUtGI=\'\}G>5ڒYR\4D6E- WK 9eŒY{-~o@ =eP УL2{TމCw/Ù >݇ qP珜A"/[tlϥBYMiɏA2pG=}-=HOKѮB} X۶p]?Jj'F&Bb,P@*xK̲,8ki&xrsY[_?Uu2ԓ+brP9F~fh6A+tv,rIׅ2d3$$1JCRGZ9. hd(Fn$! Ba5֜Ii9e|U7T5%?KD0Cr1r>~O,hﶂ?TbV벣G c>q0QEH2oSha͎E2Es{|4g٩a]рs#'HɟwT펛!z,Lw #,@B V9Wm8^E,eolq|l{ VKGeͦJ'~Hzba3p:îf1p%pQ'OHc&caN .:=6-WJ ̿پq NvyR!9s%³493}L4 ՏB:Egth&,:_xٓv^ $4[x/stbLO$؉kQLWbx=d⟚N'`Z?|,azuzĥ]ڗ>)LJII_/B^sp".ay"W`w83'./"C(Zn;88zM,!/>ゖp/%^pzAgFEtE2QvǺ e-{fڇ#HFڌ^IGZLgΉFL (ԱAeC0I!&)c#}Aj=f&n_7gl *NȬ&Z+4xMyvj3 nrǁsq:uW2V2$4Wt K sw0\ C7Gь}ˁ+ }i+A nq(lh3qk圃J J4!}"X e]KdI_@'1ҼMbgFof3Mfo܎oK| t ,!@"wܐ8tҔX}u> #-ʚc2FR{j(NrOO|ࡠEN!`.< __;6DM'42~|ݛ߽yu9Zҋrl_$x0j\&-W䔿~; :,uhV$w&y_EN<=IY)q8m5!-B-? N%0ek-tw !{▣ GTr>k&ç# EC\҈%_Ĭx|m[߱_r2{"N hw+NF7ҥ6G]-# 7~ XNA1Zhç4>-٢!dg=#5S5Q g,bSS-Nb2|nȇysǹ톄W J42z}4 Þ Ҋ8ܶzno-{āodr}izUhB{adek Oq6m]f>HqYTFpNۣijj+B zi:?zdzJuùVG7bЖwOTxHO_} ~ԡwB^7֜<Miͥ7^;MCs"tc7EZHH8ZẨld&DK 2NA Ho#z,>vL)I[&|zSަ&n&pK>E0&}|2%\YbI8dc$rSoߝ_\]>FưJ 1FN13 n| jLnwW4bs9AWT̠],b l]Rj~gvL>[@V) ڢXc\l%^A-C\ބ&$%kf&J#tU[>/afנЉPPK )%Wi9$ cpython-3.12.0rc2/Doc/c-api/iter.rstUT?dTM0W̱U)L6f;8IG~Ğy3o̤)T Y2I*,I al$ O8Y([#ƃoPRIu%UN*T0Fi*ёQ& b]2.vZgX+: P!jREcs!) ϟ9Xr'1WʟI'VJ׹g@3),;#GErjU5w<݋yHk$Y~I6dG[:3ɘߙuzj )+i}[,o x p8t&قΔ_ &VzVca-a&੘oR=c)~:z #e+e<*1c̺']%m#Qms hohkƗPwXn^pmu~5R(V eQI6k \|~!}%0%|+~vn -"w(PK )%Wքh( cpython-3.12.0rc2/Doc/c-api/iterator.rstUT?dTn0+>@==mmZ[ldR!)˺ۻKJdĀٙ4Դ e Jdng/xkZOchًC,нvaF xn _{4 |p u/tpҍ( ڜ VyД_Bߟ0y?޲Tԣ^გm+'~T c rƑTT k<6Lr3ˤO_CXWa/HG]zS#w|yQ qcMϸPPUn@_p8D̊tL N7U۰#ݼq;K,j>OʴY zhP|x'}E(g6eKU! 'AbbG^3 \Zp#y+rl{hdXlz l#&n)='Vhj~vR7.?+;~݄L=P'T>U4ޒ&Wzܬ,09 v2Mi#rrB'ن4.3ކ甁 pf9=`L7X)6އ`m̀n&?87z=OLKFg(UZ8k#OPK )%W슙$ cpython-3.12.0rc2/Doc/c-api/list.rstUT?dWn6}WDp-@v$EK#L$Eh$DΜ9g.l6b笘Lf3j7'|bE Y3nmsw]20qߋ7 ndۙLcaiWvWLCq4`7J:,xyx~op77!8to8ޖ_` Z16o`AwVV(,2ܡj4[`)Li DK@,hE8w|O@iNz .Sj-eW!1;,-APs&aVum7,CΓ1Sb;Ͽqsn5YB&{ŸE, nAc`wjb;)I?aY"u%Ȅ\;BZegkaW,G4{P=zύBc.z\ *"BQ:uܾHe]kWSpDy|؊VV`wIbRG;?zG-s|8s |t4ŷѨV\/xC+/#Ue+2Qg4h=?$.<0I+̭bsL4 {f5B]Һn[\,y!aͭxKrjl,Z(dʴM4rX #fpJ4엏ۿ~;~_}MsDņE:g}A+1*xr7JIϾ?Q)WP)lzxzCM+T~G4b\d*UcGc%7UR, h`9 jm~Sī ô >&̓e))ʢ&_x. GZă Yh[u?8D\VFa AA_W} KOB*T:%SZNtDfW~bQ-,b֗[WYWWjMʻ jE>BK2tŲ|Hx O'#j= {lע8< V3]ά3cBR§ й4C5edп_'Ot1'cٞ 7ۻAn0l6Z3=1k#<$%w S*tQpūX-.@2mt0J;%s8qػTS/c _%M$cV"AOv !yYh3~ /؎:utjϹ2mSei;{AIjV\xMPK )%W8aù Z/$ cpython-3.12.0rc2/Doc/c-api/long.rstUT?dZn =U'. eQp$66[P3h8%9?}Iz!97bIV ր yx.߹B%h&jHWsٵ{38k\1ss3h?Qa"?q-\X x2n7H07L`TZ 9Z+=dKe,70yra8fo –:O'ɮ qz2Y繲l*4VRp2j8Tc7Fq2y2u^h=NRk*r*%h+Z.ǕS5n! 3`c?Q1]ha@)# `*qqMn_qoen,ϓ֪v!QM΍7N2n891Ll4FEZr`/"= j`QqJmKˌIԊ7u3[h$?r \1$Bf_!!4?(NȧZ/VE;ih7/_33.Rc|#A VӚ80C6B [X)<>|X%Zk"m4A[y>W5p2xr k1.x:BZܻ`Ň{9EJJ.?1B$ o1NhK<"sP;l]Q[ކt` p~zmb7i&NRs(!\[ ?>=VC8I`,fPǨy:4F=NĴfVATX!S$J84SyO!:B!忬$BX!lBdF"gH1^~Lj$Xv`NTUj 9ѩ$Wc|f"13) p*mdBN&S${͑g:mi{p |h#Ɩ lkUC70оA#)rHpsxQDI5·=9 !N(Fٿ&x/4躍ci"?~Cz6)rQ #%Oi" x\i tPURc¢bn*CLq>޹/)+L?'<_u2mOZ7JM;#<2Owg${l@rSNxTR@Z &xe{]crz_:nX#2ƛ'o^ݱ:>uGp{nK!?Ї>7?2 7l:Ӧ7o YJiu -'@רӶVփn}O[|z!{,38X0-<;Z9|2ѹxBXaKejՂS-%<% 4.4לvyl|9-0Z1{*RaIzCU{^?Ko )c_G}(tּ%{qDp*?IpuߪFDn;][۾L^yO^%īZz$aCy=-WZ0WsixC)MB-•%jX4؞V%xLD-8KJoU%PK )%W*' cpython-3.12.0rc2/Doc/c-api/marshal.rstUT?dWn6}W[1}Xlt&HEKF"!)_rA̜3LԨUfTftJNX׈Uzu2xպY*䆾7getpϬ 9ih՟"C؆o$9ɬb뵱$\8uɣihV$zХWF`*/q29@'J"QUEz)4-%dV*` n|7pfgnpL/5ΔΖJ @4>+ATEd+0ZiU+ bu~OZ!i];c!H*М5M/BJa8oDDBl{ s)Q/[u CĥiVWŧ7/ίo>^~. حગ1EZ[z %Nr6x0ͧwΛѫ[ò32sc]8ˈ( Y9_{;+nZI;<Nkնd4| ip[O eB{GV[J+P>nM哧 G\q8 GGBYBLU68B+$BZ ESF#3.. QU0/e# \}uHj?&^7,6g7F68 'L]K?XE#Oh *Py2 :W5]H]< "qeT X&`y>Za쉗\}Ža3'q6%Ԅ~yycMv'ޚD~-e;]$9_n(sޛM:/|Ipcf}L23$'Xxx1bP=Ce>?s oznA;Y9r$ÎRm]1fݴ-%-V+glFy`b хnL4B'+4(HK a$0E!Ļ=yɭzUXCbMc|jژ!ǥ-|A?itB-dT),$HC,FOL$0/i*AS3H`^;k^\}m,,q^@Ґ[wTrBe^Awy& h4(k^PNy i<3k6ܕXgMDh+:%k6=,K3&Ng!Cg :@hK& I $N3D+Pz#rYAq~]\z;PK:m aĆGᎭm( EmAoby˔e܁DAPtxݍ Pߩ1bW~_]W^N]5% k΋2gg0&YHa"$1zA ᩈhٛWE&28 c ="Dft!#Rw) xQc-J" d=ڛC53vdҝ"s$*EOMIU0k+i ف€`CMZ 5Qe  EZ>4 -e8dd=Xg=WeHO'$c*pjT]v /-L #CFI:t@Ch0U( 8F^nEsΑ%d2F𧹏S@1G8;7 /M-9c5ַ ?DqMj,٠Dy^A>9pΑS6Y[0)*N 0xzN $Ĝ3mÐ"cqVbmf#H vïyl]{Id>U֨B NwԡELka3IH N4lT/SB4WoN^:yyF C+=O |˘"l~u%УFirx'74 y,A;/vZtݱޏ^[$vpoh"ӸbP 0c6Lb]-`12t k|CxNea=zwhnUONƞ8GH `b,E؀;01k6$ZXބ%WgC :WYm<,)VoYV霅 NNK;KאUao1MpJrrQ|8ߊm?1jj,)%@C ##8Qba 1c{QA~X!NbK,?>@'Z%h HY~!5N@8` 44['f2(y1{Wd松{#8"v+ւDv+oz :RR,a9Z j%d{ kS7bC?0%r,ZYaP=M]V#ʭI,LHMo !46/^$'",@b01)?I:z 2mR!فd,RmJm*:Vb$ y$y k'=1(P…?KEYPvG\U 86Ҳf!>q P`.-IJ_&_[D2Ð ~ $ӵ~ĞEb]׋c-R/Vi> ; *BGDƓM!%IŖ2rC^`z[l ;/=u֖Br9T2gQ;M<%?E} K.zVlYXcDu,[,HV @wIiH5e P5܀j8Lw%`00Mu*;|1 ikɇGO./ԩ?p9ftރV wLh J-N)'$+NIGַFyr%$ 6/Qd#D{GqƢxQ.M ٙ&he^XXeՍn_1Tb${ji_YJ[Ʋ;1ree\$s:zїZϱ"x_fg .g%:%!|gT't`[W&?V-CGͅx7 z=6otAy'1{C2?qLN;&8g94U,⭞lC G^~rt*̅K~Zf}!)wre^'];~f#2 Wap7TwJ}娭M*}]v>*;h /4v  PGc]?Dd %1O(Pk>VA?!0_}9XvUu䍰4}J<|$s4Cn6Ny\n<b{E ^:v fG3Wo+Dd0 !-2aJħpK;4=4(mcBy⚣V`fqǿ籯~UQ៿5ux9灕籯 =;UquR~CU˒-s"+:+|az1Ł#9Ɨm욟ONOGOgB_2m@socD6K<[^H%>EKHPA4a=7BiG{rwM2 H=+rϑ{4el7p"BNLj8,r}zzbM-qv 0h7'7N~W)+ھO؀#>A{Q>wb^#nԎd+>Lsσ+#9D3wNT-Y=BoȖ͹Im\>Gl0wsQ /0ṮvЪCέ#[9 -F:Kf6`.5Nag!Ť>/sHR}xwQ6RT`C8@t !Ӗ:ovY=(X[ŖAXb#Odt8WO-]uZ8V#cF:F*g{— >!{6^|)SX߸RTPT(C&'ksUas(ΤLPi^ɹ,"Rp0t=m؄=2L+ؾ]jd_;qcr`1sͳa 'C؞&K9 ;mRC#Q[E :KPjxINx,C?IS?bgCCCq|o/L#J"*!7n]mSRT0''r' L}MU7b㭍o|- 6JJFΥOU>9Ms*tv|,:ǮT=&NjksSr]^[튶W~B2e<e!CUY[zA7ց~Ϗ]=?v篬{tygXi˞cw='¿o[gq?,?NhaQcoQ{?4w(AO=bv!? K ?`akՠf{S+839#*'Ƕi6;~w8 `h:?q/9TnKb>`p\o2ͭ!!< W׬~3}`ʛRK&Qךx6hns5<yI9n J'ePK3(s !>h7@y7gRt}L3LSWzo7>JOW303.NjrJnd3y} i=ʹ]]|~QV,o[PsI F~颙V*:57mo#ZԱhs{ ]o8wQKdOE,cN↤sRo#Ȋ>%GwșU7_'Hkx. AP~*4s.Hs|~w]|Ջ.qmUv נCɆMץ*h/)--N.oYoR yDu.Zṻ !.oSm}{wT R>~/d.j|>|?PK )%W%uW * cpython-3.12.0rc2/Doc/c-api/memoryview.rstUT?dUn8+TpCo@E6ȦѢōD $eW!vܦ `g罙y2նndd[lv fJpt?<N(C<} SBK% Ŕ\?:Ё-Vy -UVBbW|2^@kpZ aTsX%40tnǬ, e^Zze4s;|0\iA(jaQx&*JXΚ*Gt3T\uz{4=UӐ E9^9 *HaF7$=ER9iuS{ch^ZXH9SP5bշwJoLsUQ6?bIӀ!F#e iM^○w˛+p~B9uQQX7ٛI>u%vُMMٳVtc[y^bDJqxv TƘ7uĚ^vr>.jh VtNp+JҀ| u X,j\iPmOvL1)u-3m<Ȟ&G{4fOLUo .-Vxf/GR"?n$.״̫vZRzəmP;.>rt iΧ)Ήb_ho $t JN<1|˛遡( ~ZMGrp5(+s򷺌o'DHǫs6o#\~X(~\: 7H>86GxƢ"(ZqeOPK )%W3V  & cpython-3.12.0rc2/Doc/c-api/method.rstUT?dVn0|W# =TJI`#ہ8$\838B.I 8T ];I= x3ZDw/&U$Pc}#:<H vFl6h` ,q &tXIR*W (N#aA]ORXZEǭLeZ|p0y~ 4#/5K~FРq-\ z٥̠Ejn=v1Rp7{-h9 6FXepXKC`bFzDWTrIG\E A!ǛIf.`=֤ØAjbʰiֳ千%U߂ 1*ڶ:yϑT۫_vjE^}EM1\X$C5]!%k}T]ʯ:TtqMBu&cR>Il>=Nzhآ 82+@l-10$4bMx BW=hc Z/4RT]Kq21z: /-Q Hi(Z%[!}7^C#ޒ%&A TyE=η ؎c1&!3jP  nur$nsM$c+aQv6Ў-˞H%O1Q `BWeB}WÏzC2/}៼ B>(l?fk9\JR72 oϏPK )%WO ]f_& cpython-3.12.0rc2/Doc/c-api/module.rstUT?d\sFο/XQ3[r*[VIrf 1"\4 >pQljUqLݯ_tfh9M$+g*qFrvfU<xm4(dF"~B*m靛uf-S%REz͖3=TRUT& &ֺ1ޔ1aDiJJG-D(zxjeV2_r'oyW"ZE .qĒDk^ĸS ;}lwKRs}geD.**tՠ_=I*= <~ɖ'B="qK5Cyt$H` bT/{pmr,$Ue$Q=d՚D~b؏U"JJyn:oNbLx- .&EJoUS*m@@͆ĨKmIt@j_m e| -+PP,FsܘK1(ZiWYKT p_OnYV}#[ճ~\~Kph " :˳ \1gTW뤊|Q9Yyl 51 o r#1Cji XR9 MC)l#xB*>^` eLdP@r>{ebJY+90|Y \K8U,jF6(Ol[o`IE.8#/>mFG:T'`j5d.eO65‡XZfU^BX&_vmo>^تK鵔x%y]N{NVM޽&ae=xfgM՜Q0hbwxr]l..K4\ {~dJϗ7j5&E ȼ{e/jZ;3FaUa-סd>$46|x^'y$J*+2\ڬ+%W/f4a"n7ATrRq8۔&K&BC,[ wDpH $a55qF,DUDbi Ld8Qtw^\\`gP,}MnB>p 덮p WF,jx#;_!jSev= ʝ EcDcȭ pٟކ?eic9=ixl*%h JEOY6 C=)eJ$^tȯOk-?r!S RhZ3lZA&{d`"Fvq)BRqw:U-3,P+-`?>e% ,7S x@ى /{ؓnRe/ˎBǷ093J^/4Dp 鲎 hBܨI?I%=Pwٝj&|1wZmY⁥e&g`6b) „K؁jM)t}FQM+ŠX_Td MEr ?5иtiאzs@KAǑ܏:>nސz;"/C?Mh:3DvOE= y9s"C< 0H5f%uF67 A?PAws(h 0eVIt !SNDAom7BBR+ޛ/*攀6P74gW.-(ʄO;rИ:4poP><~#\LEe]\w:ֺ8}*WM(H 7f3򁠈%oղ*f ja7qLPݯ8iqρXdz*or:+'֑ Krbm3>4eyz*=r>x=i s 4aļ+3VpcVq1ttIۜ!m%PY9]A h4ƙ pn2%j0vƈOa#'ŌvfIp[6%+f69;KTfM6F:.oش r:0W FYv@z7ErJ٢ٙ<7T|0fĨ> ˫aj@UC/s$yrrSvhOD:jZ#bV=HSzj]=Ұbp)҇"x$y¥V oNGCv.V3L4 !|H,"a}8?8kXVF~1V{; oش.iϭ+'7;y-<^6dqfy۵78lGű<('kwAYioh6'QQ7  /(z3Rd8Km15j% enY9n_ #O~mtY2#ƶRNWI,wn*lR=&^] bY"%~>Zv+z#4D]%Nɕr aU[UbMiʝ; 71vWN5o}Oڐ"lከgT\h9HNaUۑ$5Z}HS,'z 2SdK*[%0"Js9VMc鈹䑇mM2q0|1@[&pqܐQ4#40E"Q\P4nx ѠcB[S̅z9u{Wɝ#d6RҌd'z0幃'@p<\YM[* `$"gT"B#Qo]0|w xXc6/qS?>֔B.N ej),DV,Ŏ]#W9Q gHRQJHpkĊRm I?P:nQ్]nMm-B|DAcV UoαsS9~E/J_q -Ѿ#~_S<`㽀P怍/Kp)-T}g+-WiǭfN.qͥ>?Z%!m2l/e w卭բ\K줺Af 0]ņG[ɉ>ZJaX4&/ "?o?9|w6?9:n//?\ݜՁCSovk4Aos*;2o=7яlkđ̌͒>tǃ< 6)LQB~(>{-7Y<"ǖ!3&WrBE2{$pU8^~5oEs> N?HS`ec_Yl0@NR$ ]+Ng<NC5aZ%xЭc iY3m|=nں|@YDsKIlTBbrPzIW=VVz4&?}UvOBnDx}Jlс})d~ UKRu4؋v% pKhȗH؟w Lgz7zyMM=9]('}4xwkҹ;A4.iV39}mpa1Ͻ4}kOvۦh^mD ]d6m fO97?/a?j3[ѰZ@(;Pl{<̟̑f:($HV,$p*+9MJj9,< vѹ0H M[ < '8ǵlg{\*=Zb#F e7z m~lG4|2"a&gT3qSWi-.m ćbħa_gHl3kGCNDcsaf[ȓW8[:eH9\6OVb)[fX]p6ڗ߀t"e;1$ w_JG'Q'hY0×38{B}1Sڍ&( ycZ̩ 6C;D \lԱKSdȜ |rOc_0RmTrggG{&[&HgC<IfAJ98oY;{SA"rΚmUm8rLyRؓgZyӭǣFצgNEw=>5?jMfwmPucqlԡ%΢;W;{GyQAΌ]p)':> cݟI~"6H]k'E|N<+6s~pu pބRh!N|c=3} !Xpz-4\ (l# ;T5*hq8Yw9};?8AmB3w?J/P3ƾ޶{o8'S=c+Co,^VNj}L8qb@e 2V+0x؍~)5Ɇ| E&t63Y\5|?rh}WoG9+%MG&rŒv$})|N 9EEaug-1%<[it STE˻HwODSc,?ZJ4Z}w>{W=ýS Bd;ĥ>9=>?!O$UKVr9c)_ :̋lL+J?v\l2C)۩jҌJH7W-2)}4Gd{in(î^ ,2Xl3صOg.0> {ο@64{ݎ[t6{&PwEpIz@69gyLw؛f_*lsg,h&8( H{Pp,z:z.[J>Nc~9p(<*DGRHX#蒿GNm{,yzŻQXF|O ]5{ZKjPK )%WlR/$ cpython-3.12.0rc2/Doc/c-api/none.rstUT?dmQKo0W 7ZoB"UzIe9ƙM;'3vZU"ቿOn䛔+Ѕ0Gu#NտWE3'W(X!H AYEJ!71!D'7sسJJ.  dN#R @WUa3@VxBۂ ( 7Ina VwZԺCyH>Qf3!$49)jAVMuK"[K`}8ٌ bW/'d>JZiќn7\dLf]w=c:NسS!zC^5_~U/A'cSQ< -)fHqc{-R?PK )%W$Ȍ+& cpython-3.12.0rc2/Doc/c-api/number.rstUT?dZQo6~ M\Il(4h@45 Ph,$C߾dˎcKJjw-xw݉60aAn^|;%}`] Tx=AÃN?+U dlYw~nwK5^(lc<3;Lc,F0Chi1#`K#(z( `<a& !BӦeA <<=nG˔BM@&S(n^:G؜A? "+|{1¤exxs7[Li PR-pIBPdaM` D{ +*恭 dMjDC(4*ރ2&55 VW.n}(:WBEyKݳ<79Թ] #۳?#]Mb,))i! i~2A^TT~$O ʑefu(G N(r-?̖;O!z2Dݜ"Cpg]]TVbҢXY!`5$IQ@# 19fǪxFuЂNP7'`䇀ٕLLgY Yo? w N^p;OedWD+!H;X]8'{J};.OK8e a w p;Weoﰧ}XihN ;]Xx5,x .B'qE+9Vi2u0"1(7#'Ch^I{]T+o9-(<*] (5W}Uӌ\yYMW>LU=RD2}s sGv7h@Xq+H: ˖֕Jp^9vHpыM{-A$qy?zWW]ޟ_fE^tވM],?4doW]t7R l d~oϳI->: ` j2;+?KdPK )%WSCt ) cpython-3.12.0rc2/Doc/c-api/objbuffer.rstUT?dUn7W r-H A7\b0УHqGZ+rCr~}ߐ,;a,75vvLU]w >lh|w_U556:qw۪m92mg.ȁ!Rjxo ~CW/dzG՗q6S9_񽍉96C5vc]W}#7<އdyk"H!^'MA=J?&gY.U}?٤A͏&;{$q) !^@;d|*pC0 F`n0|,=XA9لw=z嬺hiRLtS1]UQj)EX)5S42%Ezn{#h,UحW8C߱n;gvnvg!SiGE9nΙTU2n FZUP/43xOYI2G:F7q;vUED7 CcX7 žQu=24DXjP9,6[ЬTJ5wM@,B@xyߟ8H_;DTZ]![ꍜf3/Ox s& lR[?hWԔZ@|ko?+|/vm_&ƦII\ W>le=PJ-^̎WHv]#"6cr;aTiF=Ţ.7\eGSec4̂HA'`ckMKޘ!3H1>`5:Sq"18 ǯ/ Kȉ\?M 5<[>r|̿tuD<5ykPK )%WdkE& cpython-3.12.0rc2/Doc/c-api/object.rstUT?d\ݏ8_}>9;$ћ`q9XD9EHwpIQl+}3; ["Ufb%uȟ<,Q?y~׍q&7|~/|i޸M]*<BܮȲ,VWwrUpUn-0jӦ"8[beĝWpZlIF!>/o?}|xwo/_UX܉RFmSb <.lăvk] )^!նʉ3چS7J:* N5yf]cxVQU2 "R(<+BqKaؕ\⺁_¯bbK1YS*}wPad*ÄL=;[4REF]J.P'A:5452n= Sȷ kӠ0yP"Njf/^d$-G~o@Ω(V)Y1~Z&;)៤pʸE»E%7e܂,cr Nʳ9F5*Dme B9#[nԍee R=Z̓f4e wJvF|N/bݱ&zH1e (gÂ-w wiEh\ Bf4y"okr[Jv]1 (h4بCe**ANkNլc OxTS *+1ĀP]xOo \-7 \5S,U$bTmp=.1T@(.Kimproa$󣦒{Cս |_t N6JbXDaaA};۷WR&`ID1# 3leL~' vqrT&JO,<C0<|,A  |D`q` WN|(];EW$Bz BAJ}\(U$Ԭ"9MC.! NJ:0ȧ9yֲi3y0Y!W "g$w*S=C"D,SӇp- /K .j0r32T2`*{jMȔ4<RcTAqk*~ǐs~n8Nx߉̟OW+dP62*\&@R6pj+\<;WzX^2 ,xELQ+Rb6  `\p7 _ r<J$?oOeO#B倍^ě;؊w Y* ׻[x, IQ}8&~"BlG&!q5zA -4z;v#aN!I0|SDC3ׯ_8EɄIf:3]M  &5@ph F | 6ĽѠFʩ/pCJzq:,&8$%Zz8 s͕B@kF,-&qny;m)&92k.<%.R:T)F< n KצplFV:>+Z )LR@:֤E!:ԇdϘ-,gZ;vcoS{̎1( mQO'^n_%\HU2/i.6Q 9f=]2y,xP:"x86]⁘*}ms{L+08O Ҽu3ڋE 0c1km_`ЛLyWl!/qtSdނƺO.\o{~DRC1TiOߡdw?2$R؄"9LH UZy’~=.evNgN|:m׷O9+PF0m[Ee8@M})#)MŏThN 6G"w̎!v6{Qc"1{IJۤb{ ZoL{n !:Ost:h*Pgr^t'88X,x:z: x.EԓRNxc *e̱0x R7sF= R`i0Ɨ-r=cnGSYw҉͝r1\pCwnv\;*]R^nRyaj8aZ5\\S1p msC(^u=_ܼz͵fXcMd_8E'Xx JX.eñT|pY՛ rA"a3fe"u8{'<;o܀{<ֺK5Ϟ8IU1[ N8"8M y8v,=' #9 W;@,>Ĕ/i>Bv|JYugcI2%ՒIbj HN;-Kw;; vIDQj@E lvUΏӈa]tmbq =IӸi 3CojW[@R$.uɉi*Xx=w(a 1u;KօF\&svc:%33[,Wo1) ʣj?R[UN-}Va<3ђ>e@6i &eXRlg~92AD#",k0t`hLչ h* &Ҿt<L NJ # eN{XYaZje["2{i☸Q^I#7㮤BY#YQÞŋ)THu [z֞n^Î;Hf{{8/}&!d#h\7Ⲧ5߽5cDIё3l7E'WԂ8MzIw-6֋n'q)uNӁd^x6TʈG~W1"xfS-C+RI'g0?ЋC$E@nPB3GZqD^\yiXCE&Hp\~M+4Tp&Y_"$*i)nYgv{_H7~1>IJ [5Iԥ5R2*T*2B(`iG@VkG٪>uL!tط|΍z\x|`'Q; \к-sAPbc(^~wΛu6=[Wk봏iN=ડ~#@;>O 6IweLIWѰ7m"gqחgO|ԗ9ԑP(|AM@Wz@Gv=8(rH `DaUB4n~2paP6rվ cq*%F8c(ezݓG d_aB7>~*Ym`nTڒNhϧhObnQTG@G` yCṄv>$1#ýJ j=\E[noS<; Aw0Ϗ ܸzEY9$1(0j5ѕKb:))/yǒ*W{ T,v|G!wVej9+;.A&BvYqٕvW̓ bxoC1}7kdlWciD龓b{ |fǔҺiJ9p?頋LSU! |L:HiO3$Fgz]s'$yE1 75' iZB$X*Rom`(o1xkV -@9/ڊm C xqcP{Qm-s5 _KٛNX2imF%ChoJa[$x6g/9W%rtX柩݌-kⲧli2AkLZ{!=vY^;6}>pWxd%q%\޹7o/~Y\^Y\..߿:H$k([8 PK )%WS`{,' cpython-3.12.0rc2/Doc/c-api/objimpl.rstUT?d0 D|ͨ`Gk6bG' %>Yſt_8}fјï1Τ8ny卣: )\sNEdy f*abzƭF_ɀ2Uxsl[!.h&YH jp뚨"+e?s!yW PK )%Wf1n\sBHC(n`tXi{C+. *h|%v,] C;#Lx(U"Eմ=`:IcW k~S{ujKqULw}F~jVzUNJ L5`ꂠTpA5M]v}Ӏu MiþsTQJr"40\ 4C D;awfBjCfMrkjTBhݢO0\a枊+$úfW{>_W ̝6O[Jb0Z|~s} :)zYX# Gn4EMC.+I܈Iӹpd-NiH* 뢷{Z{"n%"@ʹ2S\)2˓$i,A3d݊ɦAzOt:2^V\0BYEj 0js7;BHs!d pR LQn>ȺEFf-N\g;g /$l M 9?<6 ޒ hGj &t{g\aȅ{*w9biAjn|R.rG^|GF60Ãm& r) 0 y|k{5g/`-K\uZduQ8b&Rgې+ܸMKsp?:9ǧ_8Y&D@nSO##R4Mgnjp;?"ɦVƧd-!1̎s7ȥ92oEᯆ&֙}?GӪ-rkl0&f8jo"U PK )%W=V+ cpython-3.12.0rc2/Doc/c-api/refcounting.rstUT?dY]o}ׯ P(Z@ฅ bi.\{o̐iA(Ip̙3CfKfBRTNU[> T)˰vj.i)]Y!L25 U ++,oBLl5ܢIaS#;u9nq]xe<x߮U~!l& g<F;eShnEkdQdQP-Yγi 9B xe]\X]Yg,qx0-'NaϙSFcEՔk0@$:q4P @j lMfHk\cȇ%x+~>Sw{uwt<"'DV 7x2d׋ׯ7C̬%8A(FkLRs*XFG1*T:TE8E21d@y2ߝ_xFAv KDPLIQN,rXgPBGvN7@{ҡqu\7E>bud@Z 9DX/,x@GwIvcU ‚+`ء, [t. lN- "Y'0zI;@"&кcV }y{EI"2k1$7߽K 6 ۘ@^N~4 眍Y ᰷^ް8BFf\Pav,f v'UDݝ/RǪV,CsnƓ׈*GV} u"[@v|}`t-:6p sc{Y6"T(L*oTu9l>J|$Z$pt`sPEt%F,>zsr9 ,|vPl^ 3#D%hG\o(WFu=f]Eht\*`.]o zrYN{?9XޞI1}Owfގ1xo(T9.gZ`Xi 42r]:t{93On:N¸0^¬wTׇy-o,e=Bzi iO/ˬ3DR,^QBfsXlZJXS.!_&-V+jZgD$`S] @%6Zni/xO~A1*t} f7ж^cFu7k eP7D: _̋Y6R-`qM"P;GH(~ge6C XbYIC"?Jbu ֮T=~iD!@S8z\B3$fd'];ύdxF@PK )%WpJ rH* cpython-3.12.0rc2/Doc/c-api/reflection.rstUT?dn0 ~ —0tE ԲLGT)~RrM7dl#HA2|QӀ,GAI٦(n/d3D;w?Y⻯;a>EmHps, Eނ^HGpBj6?=Z|F/Jim #YHy=X7sF39.γvR3ZtӶ?WugSocK)h9{J!Kއ;D9h&ʦsT־E:\'/`bN\لdzȧ)0@B:&$䀜4!>3=q0/+乃ۢ)ER/pwL#% llc߶'$PA9(2^ylBYeqyhFY|vV,_=51DC ~;Z)lPK )%WSH1c2( cpython-3.12.0rc2/Doc/c-api/sequence.rstUT?dYQo6~cFGy(ڴ0A,Z:leQ#8~"RbgI2"?ˮ\!*s*T,jUWQ@٢#, D'A2:k#믈M]r*j!2`\$n(E+F(hi_i/-d.3ڸƢy';^d .I~/WW AE#.2¦I} m3]nX\=D$<Nm4[P9<H{'ׅ?dSa[`37Uȯ{v|!OdiɊH uqrF}7b0T LJ~_ !8<a2 P*ag?+zG)F@P~UM=Urm~pŗuSQL/ EG3CM?@TJ_ {B+9Kyk>kK}bɚ-CACg*|>qr ݥMG avXч˶-Ze4zki2IU{Y\!YE"Ɵ!Pz'wtoE 6\Pfq<~д]l#$#SG>7060#r\O}(ߜT="H)KqS&!kch&ܰEf 1Y3u0}vzh{W 4vZ-ΏqR@&@!k@: oh+eł5>wa1Rܻc@ИF҈NE1 XzxfyUK#:>B .>xwڔz[W^&2so٥HJb;.@D73LR,sTd"fNy3KMG+ŧk'jS/ϲ.Lx卲U/6-')~U]f~: !VR۩_C}*z]XdK;JySqzy!ƊiK .%B¨FV2^N8-kN}-JEWܬΕBr+PnGd;oebe7ő.Ӽ4irY<,v_)VҪ_ɓw-/qm_]Z]zA$U+ ĸtYs{鮘|jvZf}U5gi/?پ(/s*V5p->1! '+rQ׷HZWN %JPa_vJUQQ W\ 獕7mY(+CaJ&,SaC2 ^PN!?`Do~XvQ;63ZRqaf..hԆk&ލ6[d ZSK_޿OVGuXa~I#&ɋx V!Lqd|)i1iv8"N l䟘,ֽQqXS6]!3*R-ŕMۋ\bE ېԼ۔*T c;6Y꾔Tt^5JyC7ޅ~Qgf״ήHʜb6KKpͅݎ$ݹ%,9)EfT+SцB%NCevi@{y'Io}wVr5 CoYXc4  όڻt0o*،HõWecQrkǹ_3hon+L% Har :ى' i9>bs,8vܨv`;*JDVh" \()B{0.-nڢt^76zgXqTiT)%lA 5${LS JcRt YgQ|xyDn/WٝxA,uTE0>DZc=UQok묍9 ]ͤ k!'wcH^I&ȓY"%?>)((((^N؟l+esA>>_͠s #Oxbv"imqדדW˛I^xP D=p+ F'GOGz?l4 vL`R0~P fWƏ ʪ.} a"AQzQ:t4ݞϣ~JwaUxx7(6{/žZ'`+,}arIg/Ϙ6zp#uՌpۿxL=uط ) Fmv"ooWӻ_їN.{w%ֶ5ݍuk!viƛWl hn}krB<ݻ6w /ڐoOmρ\Ywޑ59—lQQ;ɡƉ;Λ^i;|%װ~OXB{nJ<߷?T4Fw}EoF0Eq}Aw-?UBԪL :_{VVX`ҹڎkmV{6 z>=OnJgnNjǛRؒhO@  PK )%W0 cm & cpython-3.12.0rc2/Doc/c-api/stable.rstUT?dYے}WCއXZJ,; H;3`<$1^U$ӧ,;ݕ/.:W*Cf]ڥR㗺7wvuiCЅϻǝm.ع?ĝ? ZqAɶX>h,ӯM7mԭ}\/,W_y|:ߙzk^Mku]E/<<1ƿ(\յݓ!/2uKGمHo@Vㅯ6h[mta8׺s0hu'CgCSkWvcr|-dM]u{&o="ntj6&`Eֻ(SY7<,WhJqlk[=ϱC1ߧl싫J]YouWd~rpIf]u%S< 1ݯW3=#v?HN{6~wq `Mu!66D/?2?uZ ӸoVs]CBvu-AaJ_"2Zixo"KF'V `M@gΦFNGO>Io~pom@ T!(Bc Sӱ«A}qaF75qPl-3Hd &&1"љ kC8l?> qf[8XKTxc誮Mb /lt^?ji!AM; 8A|"`VkH dH|L :eW$“S/L;}# ׶ozQAaI~'gK"ap;—HaPR2ny7BYRvA Iq칈T"s40Y,!rt` Rh_TI5=aӞH'T\I F[r6[4JuV%Nj6,RxzݒISŲ~3Pz( 5[z2E}&* &PRաJwYp Rxڀ556w&dLr00e՟ӠVx1H\lFH!u8A?u!KZضU:AG%hNR-zɟptsb>g /iB4y"ç0M ϢwK ܾ%2!CS!]Xg\zIn=dwBE)*90#P&KeVR+712C&n(`fJQ-lhȍa6]#Oyd& sXg!b%xs5U:q|&Cl8w Gbbp r[ti2A1?Hʫl2hGqk](GCa -.-E+t1ǽ"Btb'Y9Q=_rC%x0ZHydqKgQ]3[Y(!sR 7c(@J]i<Ӧ6 Տ1r,G$:\{ff H6Qo&lja<%ޫF3)}`ZwtJX]=_7X&(&ŸV1,_8Қ ]ɞ,Ʌ _tSO2MCAT+kJ\Qyz ~˽b;4ZLeLҾ+]q7IzwHkRV˭RzDVI20akzK4NHl&p}iXR[OBZ䧘MRȝsx?+[H$õł;L] =NS}3:e^nщ`ٙaK_PK )%W"U\* cpython-3.12.0rc2/Doc/c-api/structures.rstUT?dv*]o뉰v,L49ˋlyЀK6Sy=?t2%$+b*lst)r @N]0KفVz#@.qeW||-a;2RV)su%Iܶ0"SظJ Ig:vth<sh1:7:qǣ]-:DmtZ V䰓藮Fq:XD$@[5 DOJ /4MfP&3mhV/S^vKB%BxVF+<˿ =aj X 7Q \(wY $ 0LN f%JTbF@ 9ȄF MZ,e*V|H­&GBfJcP R@1sd:u`P*ۙLmCP?`s#P3z /E(mNXY6x]/WS Rz6n,Vj_,$KIX! f \ YN*2"*iG}FܕW,IjXvDE l ` lXF[&7J~2kԈ4cᡞǝξe7|͓D=hQffUA z[{5+z-R$Ľm~<=h kěD{?0q,][D `~[;adzRe- {(X`6O,;)cMFl`FD,߹qq.PJA`PAvm dy_N- |ŪHެN NqA=7x~q;7E3Sn7VJhm5孾Qm]zzlykZA^0>[SpY NY G\ȏ2\֜_04@oFACjW@ <}H)Ȝ/&/gäN L M|Wn7E/ MCepKz*~#ݧBxt{ڡ&S X?GdFEC|*Gxxk?h֤ i1̝>)pьKJ/y )j4=qܹ8v8CoA0~|}>gg ; q)=*0vz!؋d:`vG{mSY֤;+ tWǟևɼYd9DOCIe%cj>B]|'SڞC '0AZMc]ή7\-ُ6KeSBߐR@Ietgveݿ`l@: 0àW6Uh)]J`04(X!QS!&@J<8I6^Pσ(Pw殒;ǿa"uTxЖ]}]9趦%Q^VYDKr.haK}Brw08qIo"K,0z@_ T-^p]586Q\| Lp*a%ZJz+% %ăRBHۖ~#1ynka!@)B2|iy-2QëJ*X0-Gg._Fy.{Y*u7'c1ɘD_%t=P:{B$Z $}QlH4&!z#.+8c.!@h*U,]J&S?2bTNlNr\\MCJcpФSff$$p0ӁmpިͪHP^%`S4i,;2:wt#h(#Pro]'F6r?+Ck *vn0KT?xſyTf >u@<;434|.gwldx&чBUjⱑ99rzX"1*0+7]Ӷ", k6BXNU ql01 a-O׶԰ |٧bfQ^QR\GKBPM5"Р쵽ک6vQe/dij'DH IJlyԹfBD c fSۻg`5r2(*SSuf$ e[uYCp$Ī m6bl*"MVЉJwY,RhGqc¸KU{HFXwv->\c dŐ! ]Ef2Lw3MXTEzk(H7bFxۄU5:\dxNDB~O2K8/lP 4L@k߷1MPްE{&bv a .ڠb`=dp |[5I_gƗjQb")eoU2ԋ.|q>z?uRnff|T*Ui'[ڗd^Y\L3"#]OVhWtFȲ˓zxRfE-Q& %!RNݐVB*@OiiyKz#;w+ UY nx4 uhneԛ.BeSmצj)<Ზk>p\{{!bŮz%VRSt}DEsy̖Y"`+T=(C:,$O7}4r"Y"ѵ9gcg;tΈ:X^~.JżP;jF<_ qIi8>[yT`_W؛wOKe ,LxX6i4~;OVkS ]]ްApڱwX$IKecMտ?_]~`(_+O4ڟpv]/|:quDM_9"m6ߒ]Ȃo>'b^&n05g؏ lVsrv nJM)IӑuY:UZ'ߜ# Q*y$<8?rj,Nwٟ~!gF:Q*=buwԐnC} Mb)͊PtWh6G>ZXxzl|ĥ k֮Q,y>"HMMG ]2!Q@ ʆmu[c\Ƴ1(?vݯ+7].&Ju`cFcSq59D^Id!pe:b󡺷]ӭ&rf>Ah};OyzK&tr_hUe:{a:nGT7$ M_O4+7^0pz }_i1'y KDnʴ  ipeH|2i|?\up>΁lg`>$sebTח:Ec_ǗMij?'ѧr&AiMxI@O+Ga"yw `˱0#ًo~ڀ,n7I LLj~!AIij@gQ0؁07WuЮE#.K.Լ] /Hap]OǙ].w'8a[@f ~jWM3axEr;+x7Եi8OⲺt rbr[bjo|RiS[5\% [bY9>r!cMcFY˱ytF狨яB='@<`5W o-6JG\K3}X NpxmN<]rp"tab0a*Z/Ԛ%V2j R|U1P6d,:ZIC悮˯aLR%>%(/pМѱ/"_9cڨgM7UϗLR[Z0c;Z26amt\MR]Π0E8G4-xKW?Y@M ko=A3RVekt'`h-wkPm)mz&dn]L#52uC0?%)QF,ӳx+$ս%(u0"uX\5+yۧg :)׎G?usZ`uiV\>r'm9u0jUIXÚI;o~%Γq,q㳷LJT Z g/`PK )%WhL E# cpython-3.12.0rc2/Doc/c-api/sys.rstUT?d\sU'cxtں3 -5*ƲNg.(Z2]Q̇=/`|rz'K$;x4Rs{;zㅶ1|\ ^%NJk57''Y.˪~GLcEHWgG[B: 2xPUNg5.2( ,3ԍ]q#sT-u,mYgyVi   8q2wM͚Wm+οB 'sgu0_|pu'! [쿲 7:CwUG((Gq`8"wK¨@IAπ)"02vۀ>wl]B!AtpFrV@}\Nk9À?̐hj[  )3qm&@2&mj|:hd֚LF8 ax,"&@)+x)yHZ[~ƥz1 **'$ U3>q@q_<:/b; G5?5XzZ*yy*3F$0Y>z> ,82P&.F1P)Dj q(fZDfC4ndYLye@ ~ 2fQVk*riE!S`Yb4o`W.!Iů cyѼ+e.a'qTo'x jiH Eq&tPnCDZoA'Pl)|lspŃ( ‰]'+NG\&75߷xh}J 1:d\(}_X\]\k3M^5!0+$9y o8z܌[OjB[~ ;^|ywԳ' Vj>Sm<_n YOW<|:sނ`Ŏ(# C5CFe8 ;QRI)&G !'JHVFOpӇ8Ȇ}lrnXx)i÷q\f%̃E=AY[t7.P E{;Pv#u4w4RNN&{!f:&QJN:w4̚i( Ẍ́+EBI*66'hk'X$ftXTֲQ+RG+jj A/߾o*|)|fTP,I׌~'R|atP${"78.8ejP:sSD*iphInNjG)߂qw\(WgtrC(?D.9p|zݭ/+[R`cei<ͲOb9"=HXtV>^)n*^/6Bps>)[ B"E'2tN؍x <4)CPAq۽H$ފk^Գ$PQ:A Y}xe$~)jjYQJ&|_fq#qkBVEVOjF l0fRZY ˜bpuې{5.]n ptv ?\v 6E3D?(_[30[FLMXN h ǀ-J@lfpB\( y_HVY|Y_|nhI],Tepv,Jbkyup bJנM"L1;A3^B8{ f|HqԸؿueߖz!0b!U *|m Us՛Mއ@xjN]96 .aobڴXn5 8L9)6G| }'KɪQ9i&d%Do0u(HkXi|Zէq3s[t| hyqr#0;`y4˥v#9r+18zDڵ_ww?nf[-*X}*mdvjNHLw%?ȕ  NvA|a*b@hN5dc5/;XN Q,/ӣ2jm΅q8 ؜NUemٸ|= B#C!Ih:=*h| /!XAȫ׀urn&> H!0F[.’5J FuU%a  juնc_{s*؎ #j{Γ)^ƨk[i]I^~E "C jyrS|׫+3Pnˬ=[}Y7&\1CSP*!\r̊scCgHj:57Pxp¯ϼ3^{i!;05YgGP <Ŷ#m7>T m+ZTgm@rEn+Cq RU&T@|qI&՜Л10n_83|a2\qa$(z~f@E4ST;^qwkW%3 ʴ E:C>$t/}>|:2:nH&%&iٺUbmxi˶ :rd0*ؠ_ F+1*ED,._[vyn{փ^S,1>:'d6u{9rNO; iwh,V! j\QFªOۑwë(*sfI#Yϔlq_!*s 9^\`BRX*]&F82 ʌnGRXNtC OʪjXlu{"Qo:.T##zbY2kRe7~PŒ'Iq+uV+z!{-G6 6*=~QjܬxD\^|w 7mGH'˒e2 <=@ʊC6[6:<Az[kIۃԕ7<2#]Rn⡧a°mUi$"I)9,V\6v"zC0C痢tEY 槧5ɄF `<f8d7}9)ezrC,W8LהmceґW>y,p=Ɵ p*N?@/[}8p^jf+lc8 e]^zvtV 4}x,r;у?PK )%WJ% cpython-3.12.0rc2/Doc/c-api/tuple.rstUT?dYoFX2ʩu@^ZI[vI+{gfwe+  I{~pJ_/"Tf_Yy==yv.Ke{%Ȍ<ȴf0w0dK_ U=;YEqtH-2>!>RBoh\NW"ٿd?BXfj@!R}(D% fYܒHO2LX7ЦŎ%RSê%Rh8̻tX$x6ݯod@!6R˘䖻4M/ heـ#Ң,~!jヷY;N$ 6ޠR"eM |_BDoO*HW߿|^WkfAv/ ‚%nH8dO^>]a?wj\-րᮯ[Ǒx,}OWDU֢s1rvvcleA w5T}}Ɲ*ήK"y9GRSnOriZ=ũi8vצхG A`EvGu=q觻۷+Fa,s}4fwځp@ۀ)h %}ުDxqqngc,c(4,ͅ?q{j{1֔UD6r}mxZq 7hTypt2.'q4%ƺ呒h6pʒ[[:U6fsPOW3)ѻS RPcݽF} Q`ͺU#amHy` aYֶ|72L$neay 1z7=n.~\"&n^ dpVUr]/$JЮ7ah衬MgPC%1]&y栉34;l );?==6];SyT @;ߺ/ ٩",4 q l7.!z[YP.K?aMCZ* 8hhP\>cʼm:B 5:+ǴEI5 wq6E9Z#܌owk\xқT=E4?+vlC?H+oJ i-WN'HkUzwzŐhN /xTN˶)uWXm@c|>%z2 ?T8jX*-e ,Ar{kMcݲ4B+|C̔3󛍯ߏN\ Pg^ppNEէӗe1*aXҜIKr *4sQԊP}B_5_c2Uld5gd.s OǜT?e:/MOtP 62ax2/๕Sy؍ 6g?i/5|l 4"΄z\ {+sk]Yʗqmm`hT8~0 "{bZ @[]#|grƎR8ukQڇ6&ɽ8(ıPK )%WBp>j2rI$ cpython-3.12.0rc2/Doc/c-api/type.rstUT?d\8r>gI*Y{:xƷJD$d(K#k=1}ZםWFNZ9Dzv6yT6fvvv /lZI]z.3 CBLLqV0MݦM[+Q.E¢5*M)2eZ/X:o& f˺G~6q]C,:n ݸqFn8i,ͥ1g$awͺ,D.w,-"mtY_Z29*/O v_,&:!G2s TӼtOE l@f-rûAԯw#\04(_'8;#LJe^}im`0_x_ k WH6hdJkuλRu!s][0ji[ hݫڠX6/oU&+sDБ2.3KgYz_<|T%IV8BisU덬uC% 6!TZ$۫ˏI܊!:kAXhoY+$je r+!Ӻ4W@pl~kJ6ˣ[TUnj% eNd_&S%=!e*#/Z+Ÿ&AuN4ID-I7!t4&;q<1A7 @:STv52IpeǭT%"`(y2'4rXc":@$L=M:"nwYiOD~ka/*=6ef]y&Ҳht*d 4IHڃ+.wF5 n` Ӏ zijTԙebVYG]pX]{ @o;F/Α0ޫH QC@PL% !Apl-Br#2~ p_۽+`e!; ?8]i܍*u[&$OZ}B[׬hnMPl)B)iAE =;px/u~1v$gpxNS_TU(G*S:s\gv O,vbyU{]LC NֿtAS" 5W/!3FC9Iw*jGR^-땉moj^Qȉgga\dqx2 䙻)]XI$n3!%ת$pdfm ^'H Aܼj mf+ന܁#`2t" N(=oz87߇ TfB"”_W>$a| LKKl|}ȑܲR1Xڴj%1[ōm HmXueWVI,PCSewBQ/h }70~0#o0jVۚ0M>akͧAH@|jXXZ}/sT)V` KbE*bgqo0#*e}?ֈi 6q*$# D6TW hv@詴dl"$Dq OŀO@: deYaZp& F ֚z7TI$ݶo*dQ$tJ<14hSE;er3e xqlMtܑen*T Y:WU;wįпQnskZEw  Lj)0.3џCIER^r9w|xu(qXI~2h%  GN=zAvcP(Ɔib)~D}?\ :h(`fDc⥮s- *];<(FBƑ٨.˶$Fˑ61xS Beu;8g05n1K]4C̴XA ܃@w^":~b:7F篖R{ VBEj?| ?[ IM6֢w?O@2#u!6C2Ĩ}YWUO\t=#K[Sɨi@vM%"'ckM}{Ej$P6y\a{pU9Gx&^+ d?Zr,]GA,/'Fr*h #@ D%$+8=ҽN*s 6q=*X`]B:H[rIZq_@9FF"'{[jNe^"gb@v*u8Smgo\IhԴUNq@4Ȍ|K`o )jT9#}7_$-b#[Yg]`eֈw*^$[]Mx 9%& [hjCAPR+}}Hl.1Vc%[g!U}DCt(QqT`1bb2KM.Īem?|:8z//) ٝmAf`(bPzlrRdc]ڋy2=S ({8)`(oD텖&sD{,'Zk-`/Z)x{WC<1N)}wS]M!dt%Y֎X d,i4?.bm\ U9ʻʚ=rMEPn+Ugg8/F񽋗cNEry׶ 5}LcAk#@q?~ZpWr %ügt8KMc0(bE9d`B :}y}C7i~Pj h6`8t=[8uIX/L_Dgw7@$zj=~| 1ߟHM;1yſГ'Fۄ=zf"?zil5{Ož/V3x0 #wA.rdb7:dh%azѻe ]Jv/6+)Z5MGX'h}x-X"Yȧ ΅”yػh5@'Oؾ |1keFd9ۻԪ6 l/KᎲĽc7@+UcZNV~}9Պ^jNjT٢#{c?Pڽ5V'PFOS f=% |gwxm*k G/Y^1 z_ږB@;C ;hLŹ=v;K8/0.(G~q]X&9Hg';r-Zm4hVqI_7l%doCe@6 6Eܾtgz~.ڵU]@JFgeYnp'9RX\f@Y$>,ciTl.ѣq63TT-Õ[ɆցRHXLS8%+[Qm<xn* yt9?lq6XюIhF7W Xy4fTDX!$MP?Fs@)@𳈒J̎i07 7$Oι#Sn? ?;7{׾#L҇<16q\?'Δ~kl` hYS<w634q}kC5|DV+s=` ^~7n=MM}شO i<|d`K?f.*t~fy|pX/xQvrr'n͹Xz{ }Oa&ib°=_$~_[;~+s]ދ8O|3X=:J{yS|ޅ5BU6߸yuX y:O9!Siϗh}yo7]M|C}@o,4aeKԇqu{f5"WW ]UytE__yV6͸P6yYU^xoIe{LĎ=8|ݬKs272l/kYg/ل)wѩ߫p[k q XvlLmK]|@n ?2򵑟zsU5݊E0_C{Ͻkpضqq?s?Jtmo3OcdR7[]wpC=I4f)y޻ڻiٻle?*.;J7@'UI5;~|vتQi8*}7}ٽFp7-<.kM3l[}4wrVzq{Yi=[8{t'Wq ݷw<"WuL,2]O>wI{7O<7|繣-q]{v$-p{'o` Z[@ǹ%h?=ؽ7Q{<'68q| Gz`pR_NvشXb,Xj/Ƌ<ӑ F¾A^<&*[Φ2o( LLAaWq"q 2:J'_K/1B1Y1p9Z=2؍06p|ܣJ,{cda )piBFP rb6M#\#.KL""%/gm(97rV =˜dx>ϟ}8y@?M2ӝ9'#:<Tpb@K? p ߓBg'tG{zo׮l(X+%( 8H~$w<Ȑ!xDLY]'%^% `p<6ރI6?WBi̞X@ᯏ@/w$ ~BW ݰߛ&(6 oCU-/) ϣb=4Y}X.&)߯ֆe>:7cvQɷ"P?$oF,*w{F|D5U21fWqfha{}a]z vg-v-]x7Rv9YbF8?K|Q0v:un럃ǹ7l.f$/`K`q dD.aώ>ޜ>5F9bV<% ǛVѧvsuβ7d漷U?<]NkXfe3gBo{ Ev,>漷{Yp_&ai|..;h>q$% pwl,% pwyeT]v8Yi{/:Λ[}ϒ˙J.첓+>/WyoW ʇ '2vЭwc>6žV_v.aώ>ޜ>5F6K{>T1>Vѧ'<]6[7<6q~~./fYx}ϒg MEnkeE{I@ݥRn{SovE.q9K=n{{i6ԇgy ~Nn{ Xk>sܗ,gY^Wa},I{:|wLe}fyξau03ս22q.BR.M=/S) 02o4rkk<^ݻ<@ \.vԑ.#Yo%VwDKd=7#}HA%i%xlHD$}.];vY!|}Ip?, bvORr: vdz82qN]Z;zH*bիLAݳmuf\Ey4Jk*_2OԭJ-EjH#FϒEpjǝnұ^z)珽Ai"[D(Օ%_?J2ӕ6Xiu ;AĔ~ޕ~oȆpI_9O`O} 9pݿ' OBawֻWP#g* TCI 6 JCϟ}<*?_{3gF~frfA?7T_[q󮴡T Q3՚T6mxOW5J ೜~U6ȨrpAo0;ɿzq-:#W5+m3 J?y>ȃjHAݛA?nG៙mA^OT烺7~9c)S xPeycy"Jf3x5*2!% =hIblbadNl9̸U8 0$K4A},ssec nѱlzO قzQ&y7&_̗r #P9AMpރI)}+6TFЖ[xJhLh&؝Hųs~Ý:PVlDU@y{#$AS`a>G,`N apsLl4()6Zdv<`%Ut+L{  tiۃˁ-z:CJ5<69i1>i_!#=>|>>ysr $F~+5|cɄ@q8#xʭfg.q *3UcG_d@MpM>ft̽`4Ӯ6Ypރe&hQ^[` pۉ+v0cw$zkj Vm0 %FMO ^ ̉|sHp%7u ! u"? ʿHGn8Ԃz̲hQLD+< , z4Z γro@smrPi˳P\Ⓖ~mUDqBKؽ~a^7d\(`؅&Q$ _d[6nQNYTH^¹]- cQ.Z37&GϹ#]̼9q= - jbфV)lF{ULL,yrؘ A_d5!_ h{X(" e2+t€M7]2ĀqT~%ڴ%d&.󶣳 0N0eB[9Q98 ^TN|y3rY߅[:r> WѻGGg0FG&UK1݉=Y] _ kĆyT w91l3:s$lpμ&=hZemWoWY.SBM BQ "yv%U$! = 8*2C tJ;AC䄍x;BgMP~MH~'٨e+:(SJ1z GAePv .H4*O b^2!^"2Х60ʠ*sm`竂F ;9KHP[p[SH>}s H$;"7yCte['PvIA[72DX2f&x"aA%p7 c {$_Af:@, 6u9:`Dfڭ:X@{CT#oF\z7o"6.p7e%Q=<.U!5$>sk%A5@肈x@RWEfWz1֜Ϛ'6lrU3 ؤ tXULbj[OQo'zQ'd!̖ B,k3v& TU2&+'l1cI6a] ?cMQ(SUnpOe Ĥ97 Um* p]val zo'Y88 ({%6['a5^/#o "#bYuS#G 8H/3|G7uϪnU!8QYkP mz0Vޒọnf`$ȧbF0Itc "F3%hrױكOqܞUoP,_=/H5.Ї[,<,k?V]uWn]\ H\V*~,?3oD~ߒ!1$A}d"%e懑%-=eJXb,)}MԮ'1Z |LE2Wb 9~z"*. ~N "E0KgiΩ@H&c/)coxGao7TVTEʛ+}7MB>wGL$V8eyFY˷ڻ[s@}k g uOrtf=> 7HSFvQT (3Gc'`I&lMSe-} k3}/X/!wн>pz5 oPo~z ƷVh.E\x^T~13/3[μ[U:=uA{u }4PYp8ltaT(H8&=2&J7_q)WyC7b 3_}s3.pbчUi&MvE!nRcp*OlO!*o!mEխV ))1@3׎?(X04^DI~M< lKHlVYS}FFJlE {;ӛ- eOei"K)4AyhlUBuƐ "e 6P`2&p~,@_T.T]!p?pP>~X>&+'jךU5`ur-TX[յW}w'+:𰧧4@@_.jf@~JaKN${]8x}NA%a!pr~*stIɊ`k0$QOEw8dX´@4i)-$LwEXsar-[6fL_ 7Z{%kĨue7zy3DEIq/!@ z !!TK5/雫kE+ {VWΊi`Sw\>l8'G5VԮN}[M߭/v u&(OQik|﫺N ;\6oY{{Zs"pÐ/-!w8ަQC&g,-2,^a^(4n/8ݝ@t\]~axѤ=YnX:ҡX`VO@r kZ׀{OEgL)X$&? ՛:q7tӁ8]`w({.$y g ((<Đ_4WQh!Zqg`@rIe`bMC[dUaj ̺LFpc|{E;骺|DpUMû{nDDRxOjp,T;[ m M#%%YZiz^ml?+KH5dLN\LŠ]$" -7b؃Lf_O7>" D3.&K迭!nii+Mȩ]MU{I?QfdE47Lr;RLj Om\H1Yti(`a"Ĩ5ڕ9{Mi9+09F1 dyk9/O;`XD\,?]4>12ΌM|ږ~InaŞ0h\sK)%;i?"|28 A]ZW ӂb9ZP3KVl9"Qy4m:IU/%Lԛu T s6!Z g\hYR Q׈ +6-=m&R[m9nJV~*eWBrH["T[UM׿k_:j[K(P8~-r(nji qRI84/߂AN=|Ϗ_~ aB 5F'G f,C7nnK2.+ b!>bx/g~6@nrcz]tIV}RJpQJ.md^$vd:7ؗ@HA>:Q_aXO@o;!A" (%Xe~| zA. ښg8K`z|"Pf*VɐA3l89zbr8ƖdݯSڽ N`c eC\ԁB4+bi쩟@JTPQ?FN|n#:%C; ?v:K{?쒻J;LyD{Z {\n*c w"d`R?GbJK4TE?ot8Brv9_'e /VxL/׻\^ epGwh:mfXM vnsk(#רĽQwFҥl]_&+i\pp䁃 (&fCxyy0mF;ed HmW캻:m&K,]2IU9Ul/`n-g+*I,UL^Be4e,Hrl.hFCCce( OOgoNO޾۷~GOޝ}_j0sMezNKU)]ոB̜= !BNZ>|/1+c,$3L5{b >L ejhᛏ2{2SFx^@[yꐣe-7_TgFqE4+[2 AaD3oARoB,U?G͎wy+m u8xt*YH̖xN^W~J Ҡ^֜ת w@"Y;>,n×pNݤZrXFEU_oÍeZrc$#&rI9r  u9kq`B f^ǥ ~9Lh"/]zLJ Ж\W ONz5<ݫ^-i߽99zߨģ~Du dz]w_U}#r_^h򁔴\D$FiEӪJ1 U­K:\Tj"2uBG3t8H}bNNȧ1 +"0Q4LlFIXouL<[-ltp;un ٥hyZ!n~4fyF¼$mM8N7Nz%^QF O<1B{-rOR0Ij 9(]ͩڟ]?̂Og˦=eA.ӺxBf<`6M}Tf !~XXM5Tw$Uߢ4äZ ÖE4F"Q+t#7Qܨ㲠YaDJR\Y/x$srqPsiQGKBokhr~H3,_[tr W7goNN޾'FꂨX@ӥ!/X6OԆ_#VbX1?ī ATYI?uF(;9*WOc0q,cK qiYW4/bUWI$ +ڥLͅW1tNu26 ]H#gE~M":ɞy0se](rڄTЍ*UrD h&997XD귆.?ӌf%Nf?ѐ8I\ʏ2גnĻwf^%ᶐT)1gG˷²I/p`i ABԚ4f_\C_l8#?d2:^WL8bY Fu[j-NP3(+د:8-Mr 6=Hn,> 0Di-lhДrGikEiߐ-L,A?~0NAf;ơ5"Ap*2uIw"s=^|{< wCKOp(xلYFuVu~Hizw^gSI< mD9&H>8h@EH|kkn]5lZ-RV3a(e}a MI79.8sMk9arIU*QG:(_cأN fp*C(PVY@8d-w 6U#jXZ8ub6MrzJ$VㆫT1=n`&Wܺ]!O^+ùYA Oy5s΂{5cp~3 ^9(?] _cߟQ 4i4Q1êAYw:2ATc-NUTgQN\y\\zc.0L$$<.E:ë($h+J;kYr#Cl p^׀q̖sMܲxc83gr"VqVEaUSZl;/[$7-#0")UܕT->NKQiH4ϗ&8kyԛ}@'#]a$6wĨx9 $7?/'#t@mP>Nĵ*k:g =\X*a@fj] L`1}7WCzZyaߊ?>^PIu[\2Gm`0t>qVKP!Hu0^]v2Ƒo*{Ы=͙$ΚZb %rW[9rsx; bpq .A+ 't$"VqH>8Bc&&LY4KcQDuR1YP%(/r4GÏBW _kx'tq8qCJ>sT@\PZV*5E+ɑ=u֌͑F`d+Ty'x*>rYٿdQ#dtMCi,BwaxVZ8={N* \}B#: }t(ea܍zV@A,qҜJʖ}Ra՜#XWSC<*;Yp'TwXJwn4 2D'dK6gI؈3q M.H"?K^/e)K,#̦E[fLht[41 Fs<~iR޻JMdjsb&.hjyyTFDŝ$m%╹c/ŝ |O/,|eNa8% .lJYjfyO~}*CܜyJ%%D , (rir7--KcŃ .1ra\ ZJM\ob Vens^^=%v~i!TwLղ:Ҝ2/vwiD>HUKzU.G)EdIiMb Z_rYIΘ`>#&kyryɦU @Epi +sל ކʒ?.xaM">Mb?=*\^R,dمЧ \]`HA ם_2私Q4þM^)lJӭjhyT҈:` b:"'UOvԂPD)T[K xX yL=wL@$DF UZ?lvYXD6T&vW2ʤ=ig⺝g& ,čVQj?PzKO͚% Pc9}91¦7|+kOex͘aYFwhacCOT,wzh.urRw &E !NY,rudYXB1[IzNˇ8ыƱ İcE~E:Ģ-ų0b2 ˮjdRٗ/?~od{QMy^>@*yCњ3*%`bރϨY3y@l9Trp)_NqK~1>[u j[JZA#3 }SHvu=i~JѪ";) yVGZhѾ~q7d==xmKܫGGa i4 $Iag߽3~r~j|8 |3DbKYdŽ5 v/*&~V88 Ȃ)gYT=2zTɆebMel\J+1 ;*ynHB#Z [r"2qtzg/_Zc FPc#v-ޢ[gW~FZ:J:>yE]0_ī΋YiY+hЊʝ͠f7RXCj߲lbd`򸨱0wͪ?6vKJyYyLHlшl6sDNPN0"rRS61)r8#JY/ 6({Oxu:OsÏP|_+[ѣƃ%8PRAqG㏋?5ͳ1]5_H% CBïl֍䉕#WD+Ln#Gմ͎>5k ʼ,Skіӂ5nW=M|6[#GUU)OWd8J=#}4(x%Ri2%QsT'.eHЕrq˥"p-/IQ0]ڎb}>Z46Hλᖬ綨ZJΫ\XV7 CU\*ɫ+ -oկP9/TW4 DŹw#xcfi@Yr{+ iA#I'0C[U9czq3E`_a CxΣ0pfq:0_EKS05y|c<-I!1N ʗL,獭kLV ɪ!>=*|?skM8oV8z`8.q^i  `-7Ĺq^ ɡ}퇳DyY&hjXy玂G;+iYd1qTIugSػ*U9gof[Z_zv< 0V7YT>.ʼn۵HÄ&=$w9W" ߙ&\<'I̡\@XYz:i#)_KI#ZE4:Xtη!LƖfXqi|l_Ny%ha8&rhSZ뺜x-$m&gc]s1(!V֮5\l!{Rs G rnƌ^}5<-'-hI& ܨqͻGF\yPm.g.`ݢ|T ]1gO -tm(1hL_oJ]Oh(& [W~[g8ˮK~GV]̬_0J26B4ʙVz>Ń09@`6^Sfjځ{:o!4 q./UC5Uqpi}W ϮHc!-$5⛱qT n9%6+#gyr6}:rTu)iwd_u'..uH5f6p]j|y:6֦WS36 l֨9g)}KυkH:뮿GԖRm݉eGBrYIC2 _JW69*Fm#<:՛,Ύl[)s(Ur຃,E|rֻ4Zs1FS jP5*l},hDIԣDH6(a*226xMˠÓ)1z2v`$#i2?9r-'hzl c7vJMa]^DCʨ1ݱ+c&}1\&Z2fl%0 f )Vay#Vןl-6d{ڼȣ]Dz*8ihŠt b qap4,猴m?ppiղ j kk(q,Ԭ%Ŧvb%I \%Ժ2.:0ޭXu 뉓ęKUę  vZ?[ Z7U嫶].N#e7'5G5}o{%RX|D=0adthtKFH&b!4^Ԟy62? ͪ+KPRvGM>V&F7IN8>%4H %:ω|D#gQfqO$Z *[hl癇˞Q};F`|Fblhq'muoI!%f* 8 'xT$^woѦGu͐9cW ~o O.G1Nx{,B^S/?r .vʊNzM"H. 8Е͊&(@KGcoΣXYn@{[jU,soX N2 fv!*'+aCcCd˜.()s)uld٭ͫTTurj[\h;Kk;eSrdYcJrNZ'L ñs9>SOӳwgw1>gO[7唬zsGͶGp X\8zm“q]2\pY#Ә|R.~Jb,i_FE"35K'vK@H0t)๚`9O%'Rg25Y[wB|ͬ, o]f6ww)9mpRL%nQlVfE<_pe.jTNLMi=7e%L]\P,3KDdlN>)%:An'a2L/? Q9 x eOy41o/Ԝo[R814q_jW*ʼ{ՉG#GU5Δr!wuQ_wl3Q)u *z)wl]d -e}׃W:G.,lzWӌr2uXDE+HMZ€5yD .{WhA'd[(*pdjCRTzI }y V'KVbB%dD8$G_|LyNnJpTH&KbY:,+o׃nv`sB{#}AYhewUҔwLE O/H.e檲ڮCzq>/f挎,&tWԄGj >: *>[(bo½dF)\})T!~/2qjb}Oͽzn3V!Yce"k0&Y=B`9xi|ChQ)*RQDYlsE:0%",Z¨webgne,[ Y"οƾxSp{9ˣxrQe1/MX xP-wܡ93Z N}#ߦ`9:n*ɏRuf|VRDǎSf+rbُS2|Y!bn6vT)Zv"bYKP<7@$Sf):8R"Z8GK|^deT}TN"^{*gj*gT3 G.Kҋ z#r@T#;Ghkrl}xZˋ9=^8ӰQZy[jAsr/> #;c'j#ĪM#ԇ]5Pr "KhΝMԙDE6A97 G|{Rm1L _ҩQG* \*AH{/qCLggIv^1\&hveD ClxS&W^R8-ny$/,Ŕ#KZTw |RBoGX7ߎ~=jT=mX4֍+ݨ^:YQ/ *]|JЇ(vM9AM(;I/Z=Hk=d@60?[]УqmԾ| gF l2QGj[Omv *xݘ'Gt 4%PdCW";%'$qXXTyY hˋcvY\5/J[ S٠j5~bv֭l4uһ9fs{v){8m]}קRۜΒIރeH8hes9B9\; ;xk\W&嗒;Ș큪xV>Bl,E掾ANZw0XtK/UW٭\Tâ5#x [(wiQMe`}oFl2T!M[SӼ &+\QGvC}2O rC@eZ$woȽC'$NbzO'|[^*Ɓh BOl jeZgbB.p1_{(5w o إѶ XͿe^:ls_ֶ8FbxB7ۺ z *F 1>kM-$hw]UM^;[ z;+pXl;&d|7{  Ƞ^pNX(c !n;֩ˀ'D9M 9EB`>'°w XXYMbFaT>qnRPMLqs"\$QQ0Wntd3E/]igJZujK?Y26,L%WDubRc0U3MȒiCl*+dK(oci *ACLKhսU MqꝆ~uo5Q8|bWm^AxlōN{$ {H 儎OM K ld騫i,MS5ms☒o{TRjT s|dj5I19}gkZvq4~1}W*|PhoޞavvAk$ `㳹MĩS+=[pȿK c/Xs9~O1mIM@҉'4 M2ӟѤvϒ(ͮ+f$? D[zM,|F7珔hI+zg)Uт'PtQ8_h>9w\M4Xot?*~Rtz4HWzѓ uTO9&{2uݗ *1wTDSzͶ|O?ַc,'8/KF[;Nd]_W6T~Z~G=M't!lx7g6) jZGB-fs=W}5RuӮȞn܉n|[abmؓԺ^mk%T_ 7 [ ٢EomiL6[fwm/|tPW/䜸5̄6#hd2Jrތ Zr~fTU=~qݫGcǒA:]7/wVR(7'm5poԇ)5tIҖ\jLzOk;Uq;- h=0ګKQD+Rvs9Ap0Cs|֫_d{$TWWWU׫'2LtădY3]U9 $Yp``|gQ]]**lV ^y]\.Rc^^No/[] $UP] Y,a8U`Ti ɂ7xgϙ5y{93\J)t#min2Y%i7Y*JoƢ' P2ڜJV]Fq,~QEWPU]d]bBoQ`go,gg >Xk7o h}̑* $=τ(v@eVA"g/Qŀ 9j9MM54|E8VeЎf;yg۴ QKCP@0ʷnx];'{CYe#e'$`覄arjVZGz [Aq~wEy,ÃP+"'GuTL9OҤY)$ݺG`Pyet L ~xz_XTe򹷗eF&cqN=DK`:1((j9C\\"5@3E`s?4~p_ݻի_~CHN$Ԛ"MĨU!$߬Aco-,h'kKUn-/?}HЪ_4#k==ߟzִ!ϻ6A)g3"ߪ'O8+!Jkީ+6ͻgD(m FҮeCǰÖ^cዽ̖gJǼ\%Ca!D06u(_ \x~Smu !ʊ "jKTE|ȓ+kdo j]\mnkZά~|w|z8DE#\qSKu8PZϱ|0~, ]H x <9Yr{!^$vku_PFld%ֆ-u] vA˒ e"uZRjē# z]E(A͏4q+`MĬ #6a>1{vvUA6FZhehiGj֖U봙GKU.39'}ë{A3ڮњ2=]tj+Sjb]cCȺhȇCM~ULm *1AĻ[IW%BJs}Lލ|O@'yARLjP'[cBͧPcFGF[WE`<efH<]6=;O"/B * '!wF9| h6쫰`%=`N+lewi@Nh>税3p0`86ч(Ik˂Ís'>ŁV"aNDt\ԅ v?@cٌ/;Ċ (+pN}@KQ%xUGVs[ˇAbbmQ8H.ÿ~ U$-QO$QUu$h%Kةfq@:e^zҞN''h߆tR 9QKx q>jY.9Gѩ!`L6+YG̋2}pB\/vm0TG]cL€+"cH'g;Cg;*IQs?4 ˛rRVp%əPEN:I0Mn[6vMWZƆN߬)fc R*^ccw4gJJd~ z"mWnЦA{޻mm?5 tf&i1.2!N  ؓD WʄEߟ܋ [7ҪMw$2V<=P7X!ManQd0u^\qۺNA:w|&J!v4!_|Q /}ttۓMX%c v`QsM)СĠqZ1su6oUaH{G8ʈ#0ĈlFь3e)[C;A2e Fʰe{&7|^⢭WPlh&1OnxeQ',|()fTmmk(00@!@qЉ6/#0%cQtUZ2gG6;89ҫX`=T oGzFz}SwkT{O1/۝xO* N\G7z1^1}]uV%^9d2*^"_%fN؝r|$-}xx3@R^8g:12Ώe?ٰ+7'cJXmoVe%O#U ("*Y|F0UWI©*ρ(Qq3Ͳ,,5*-+u<\ܗɀIZc6XG2]氋6er ] '@|R*^m X+,^'iJrޜ U k3 p9d Fx 6*Ԓ,@ C1CȴuEBBL.@usLɠ,Gމݔ5قJ('\^J!S2#nϒybnJaSVloWS0MYѝ#X>/ÐQ~& HgXuI.b :Mw`IFcRMf=Ri)&)MVQd (Pyg4d'P->ESzq얓5VMZ%Өi T 0XE/Ѫ4'Ro13쀴 W^ 1VXD Y 4KsgNx P>KjK2quY{KC\ d 8 Ȣ3,I=a_;WXBQQ1N4;y]0'W-J58TKRD+_("D~U,[y;)}/G8ajHʫma5#Dop-H3G3TnqYLC`k6rO.E!j^Iu1/qR [G_Ɵja,7@rw hbhK8lܝp[,/wx6R=dw9ꭣASq֋s˟ q߯TFτGۏ`ř?U;eJ:QZxb ÝV²9| JWpFϚp`ʞ簉ŷ'&3Y[MIu Va/AͿ>/J5U>j^̢ByZ|6"rgȊ3*#w })q&ͳ JOa-[KiAH`\Ѕn3YQOk'?[cRWHqZ,q#qQ,ξvqJ:KCtQի;Pc/CMؖ&eCY>c ?S2if^۝"/0ek1Li?(V0te\HU*KY/Q±yb:Pc$kԗҙ'H?Ѹ=7t~3%x}w04\ TQ1U]MTbow>I>~.ؠ߃z8p`1rt6"lSj]?1o`r XcD@[_,A97)u.jQNҁǎ TXX𺈊<NZs_$v.d٠~7eL$Ic*De$a[@o7 pA< upۖUX}Rª0/=vH|0o9˦%mn9;撾ü'W="9t=(Ԫ#?^DTFe8l`b4n# @BuI 7&k) (8<Ђ:4 =Ȭp* z-6xoubNp1X`x%{ɕf0qɋ☟0LFwgsK=UE:bXS5Mg.Ҵ?1IwĬHJ6l`t]\`nYnmwZ_AVh=G~l>ikLǧ`V`R~螋I(t-S"9(ha"tJ0ƥZ$v*r*BjIe IP1rIJsbU>6]JXT%e Li):sR3%g$& [fv)mJ4mpOݣL^J;pV.PJ0m&?=IOFHMjFxSt1AA B7m WЉhl6ç`k.ݜ5#. Q1NzJfrmkeN4*iHoYyy9=Cw!$9ބS받q!.QД#4]}4 c[ʙLF>H6X[/]: %J'p6$c\r`i(IKٞCd}#N[f%@)ڀ)Lk [@@kCIp \KS9})j~[w"߆}JLߧ䶇Yۨ2 K*2*?#4:X!d]gxQN곶V|Է5:K̖@"?ا Pxyǝjk˩Yc($'c{&VK묱`gy[I[^Ju B.TdCynmp괁*gJͥԖn>xK|Ocm|ԱFqg[vkuk(~h^,jJhY2.zc/ṪCD xdn)k α/1ĥͱR~H5b`#84 C9 Nn`n@[V8L)XC*M.BҶT>[´tŰ9Gݺ C}R*ӯkf>D랫b4հÔ#,1Ƥk=?]SE$fIJS^~ǎ).KeAܩݡǘ'l7gv GiP,w-֤ȶ hFSPoq+`I'VwdzlvXY=EtKʭqn\+uWq-霁%fWjqX/;3SA zjN#}^. i:/:Y/aF1m4JEYOʠ/àNQs@Az"}n Njr0?=S$;?NSFȎ׬cH[p܇5@x5Uf7^赕RB8I l=}r`A sJSڈ<lҘ}9:+sfauO7#YkV}13P6: zoU/Q}T<{W\>Nd?;Oؠ5"<2 xwxW5ts+|z?5,,ZpކLj>Gs))9z/(TA#rx<9ЯLJ] s $,kԷ:%5Քs{Ligv W+H y7/'oerB'Pr|tγnm9+i㬻\tm?Q [l46;lCRZ5^IUtTf`@9Jq M ݣ%ia4t눡'Q4H Kc+M*jMv6B|HҍLRarc8Us&'#f܊B~M%fwfT^$*6ۡKJN,͗\RFT0^8p7P=v/LRaQܘ샂SI]}< (GZ]V ci#3dRN%N8i樻2#W(yD\Pnt|:f%T6+\+?H1!ڴ'YZapңOV1{S nw\Ʋ_5Wާ`^ˤ1NKlPu꥙[ NԂ0GQ̃GA3{ Wa)doP\t+WwsxNFGf-o.t+v2k8^nZ)2A6RP6 ڻmhb3Nq͸њm])툤w$Ki-yUm"ۦ5Z z0 Ag }8;6FnJt09m#ڇn }(1xԣ@[Y2 ZȟY m- jKg5۽xCc;lp}׃(^0~SԧS5lKyU B)6x]^IqvÈs7>ZSֵܟMany+pe/GfƋszsW ~ ~+;23üJik7Ke| ,{NU-ØzI ,Ң^V30EZ-u=m>">q*Mg;t<'E}+ѓ-BfJbXc P1L 7a/P&hc )(9KGStp}@³L' Sױ-T.|{^ 8ڡxW| OaRYn$dXnf$*7<}BBON3bSH JjB>x#Gﱑ>l07r@DZ'n(eteO\Zu7omgOOmXr&kdA>u50&_7N8Om 8{o8xi},Hi_䳩݄S q׌SU< [Rs_K,r*T?Pvt ?TVdsdE;NCq%u3f`dM_>s6u`>:·Q/1Y~a@3wF"}DSe@eow+3@D(6n!Ɗ/d<¯,.;-Jŧ;roỉ<7K./D` xja;Wtsq*Z )Z\\fMʰUQ 6EQ}![t*#paJͰ/@|8Q1ӀN/4Ve}|]mJr'@?;Uͩu)ˎ? CYó U )ggbJq"ۓ⭼ UNz@,e@xRjs 5rQY\-HȕN T9ջ[;or/Jn`,ģf% %8Ms믷)7{ިT _QMpa$4G \h2ϯ%WڏqV`>!@>K(.<ۜBmi+oEVk&!;r:wӘ\ Z =Þf^'Ūò5܀y(Y+a:m6^TJ1⬥t>q\w3v|MHq#!š ɖ.D&޳y޿~%wmiΪ/%+OسK^Ў$pj?9c8vrqD~j6up .W!JR#XkL8"|xOÓso^W_'a^ ^?Hu c ΋x_:yb,VQM1^ LB-Ū/ᡠL%Z67zs}$"Mb ˢwxYs|wf d\Iͻa"rMv[4#8K1HUTY*mY#ޞ @Vl5s{e/IW]D _ s-}byL;1[t0vhr &Xۏ* =$@^OIS'ZZiԽ7 n"pͶNzXDU|2ox܍uDm&O3 jao;퉺tp82GX *! f9߲2qzLC:JV.:amn>ie^&ڽ6d] R2oz@^cTQѹܭL(rx6u1H7iR>A1=ҼwYO54[zk?QYy==tFOB%"\]G\|(G+ "G;rg;u\+1uAuzx^!z:4X[s ;L&?Es@6C. dAq_4v$}=ZA R|#}N˼hŋa{m1JSG-"] 0uԦ=y }H- c/X`}E) 5]mmVai蹢 O?Et j<|`6's^gC*87|]wORxӸ"_msB5{c]_wǔy 8no8K 5iީ+sETq^gR|u^ MyLĐđZ£9|lNgŞݔ`߲td*g %;6),\zJOEAK}يP9P4( s*1(d]zw2UWE>@2vsM,nTw2!_uS||b^.bYi1ilQoj x ԖxRO|nE}D i…*Ŷ ڀ&PK )%W65}o) cpython-3.12.0rc2/Doc/c-api/utilities.rstUT?dMPn0 +x|@:Jl/Hrt^g(Q$e,jb@6= {NCɂ>UQ wˡ4S-Gv.xu+\7B*L":."MNZ$9p7T'e%*c#+>zml*h9)&! 2q=vYv;@%Ll&K>~PK )%Wu~'.>( cpython-3.12.0rc2/Doc/c-api/veryhigh.rstUT?d[[o7~ׯ YmڇB)Zt6j8iQ` 5CIGCXV\ȹi$ۉl&<<3^rO" *ߧ+%~W).խť){dMZE)Ѕ+D<bgJTZz%™ҦJ&SboU`s%RB1끪1.`z)*)/B&'Ud0Ѭ̅Y ]@x 漴^znrfCZs0rH j0ؚLz9MfV3]lJ(z| df9],Ǽ"p.IdZ=W`ala 1[K]teGkb߁J0̝X?!/oHul4i qU(ԍis ,Je@ˆ+ 2w0WGa(^!8oԗ |#J8,nUԬ7k EfN %td,79 ֩Dr]Ϋ±" hԗtPKcprO) C,a-p)`ݍtfzxN/*݁"Jz:Q8 8jhkxJt t\1goa!~vBμ` 8R&$fx.YˬE0 "ы<=NGdnbdylrED^aژ&(ZԢr05iQ%ofd=P@(7R@!%0"h@r^bwmN1,V 0DFήN ~vw˥Y1[I\62g xeVvcEZ WKÊ&+zY-oM$ݽᜰl/#xPmw@2#*_TSD* ]@le$k]"9SƩ23)@\P/9w{Q/xiP Y'q&T:D(Ad {Vcc|(O"%j0PG8"J萏IPFٓh*VRa)@RW.'+w3zMyrtPz>3Bd[ABŏ$bf\B^sCgo>G\p67AԈ `i2!ښ;id6 R1,ib` ?O9Cg$V@"J 9Jσ/:4 a2~ O\Yj6:D}}| kpB?b$Qe>75-f;i;,;z8j=MbWCtbX qW9-z cH-٨HQC5$k$ g;V,VƳP.iG "@j ]ngJ56tzh.3Vh0Ğ -ϞyRǨ(6i^<@+6ې8wߋ,<.X%*]"t\oBmeSr("jHĪNy/]iOd`2/˙<3u;Ƌ] ߳CPy<.V %%\c.CPpD^-1n2=qgĊӆb?$\]bev'(zQ 9Pdr $VQ" \}!u^ZUV`l17'[ v5fu\ #81$t.@`ylr99L0PX[ [d%;4wV#dY@GK_݂5'WxQv5ҫngfhS@0x=C~qxK.IH`ou82}@%JN:֛YsU n+种N]OIǛ0rGџ04lSgܞxo3B@c΃)Z'jLL[5FRƉԓABCt#lpƄ@>OL%W]1rW,[M>98UC9VwM fMc)@@ !/O L&aH' %1 u,VP5lp֬aozAn$twҀp J&MK9H}_>[ ?G9]c'(z{`"Fe?6{S#~[|!ۃځ;bc;)nE]H8fFu>N+hj QEL`#& ,v N.vôX)fA%!5WǗ(,huT1do=}n@48m0%X;V:_倰Ov__O_&ûOU;<ϣ>sJI] :u۔~tOC̓}Mkς!{l^񩣷z(mӍUۉ(Kkjݻ ˿K[#d!/=ktG]jlbuM x;$8pah;ZuHʰJ+c7ZSlV(S_# G^B-\7.Ah攤r9T.^OUkFFqMҜ,pKCZi=SP9nyoj x7L36&7ҾTER^_7pcBYn{[x"/t07Ny.Z./-Z,5P>}u!\K.VgXSH o`K,|Ϡms=4$S0> 4H n2![T5gNt<V[Si#x涛bj:\&cc \n{ce=/V\;VU<7j56s#tTqxgk4H%tB?6Us 䔹SbΑ2x[%< :q(?-vi :׾0#m Gʚ-fvM( 0n S^l5NMcaLuށߺji qυ5v1 s:#L&s,.72l+9$xB6_FX>/.R*czV 4h" +SXu5MYBY鍝/.3 q=f ^|g>P.9Li|o]V}tJ1\/aV8AZupF=l!u]d0fo>7o\ q_`LNр/!w^jutO5Nޝx$vٹяN-1TTe7^pk~ cxGiͭsmVУ aVvi\`1s%|<"_|+g>^3HL[8XJU1~tn5HWE|CV$ݵlQYx 6=\2U#+7.ә1I3û5~g0܎yd}r k$bp80 B xӶY|@; )?UBCNuۂPe|Ż>\_\KVJ l,U2>_/t9]cGPsp_ ;?~^H,jvg\v:'xR]V@bF۱f`$߀to+(^P錳^!N7j3M^}?PK )%WV ' cpython-3.12.0rc2/Doc/c-api/weakref.rstUT?dVMo6W̱khib5)hQK{gHI?p͛7CePk<$YųŽ).Oq[->H>_KkӂX`À`n^Y?K-)RTI\R한6;t0JP)KKztl=p1("qaq˄h+ס4U(uᱱZs mizB), |߷+ӒmQ]5)?% {ۂ=98ۉU$sDzHXYQo'&.T<'N[-<~%-PGHK K!O3ͦ]̳@mfzhJ8qR(x8ŠS. Ht !/*U{` >)VSLA6=fI|F0 /R/x$ $cEP]*uisX}a@W^sI<%9Ďj  CVCB;gѴXE_x8Uyr/sU)fcLgm%e9XJ,B9_e^<Ѹ 쟷;wR77Zmk)wzپnھw'~̻]O}\\Oš4&NMhuȈm]N 9h;bYMI oEi(-T UAA8k끫y1gw 3l`b& U5#/F?+l6Q9 n}s)v~Z-V²(.lPQЙl&@=vɋQBgwQXܝCVREY1@lJyvdGGw i|aD/`]{'}jm`3 Apπ08qek'ҵptZ%ou*1CEOg{'}beSKNXEu` Uu-e13 AMmm)KH&Mo2r"s?U,\/%c./Noe'n\ލA`z8c@Xm= }Є_]^WAE٧Quh?:gVu}k}5d7l=\lW=fDV ö-o㪮姫s\qyލW[χdkTmevŐ9hm0 r& +,U5ReLШ06 eszA8P~Z^eJӋ,_Dx}J%75pgD>xeXp(ډ5@sXz\:P,|*?ـW|_~w>yc^Ȅ:@ΆXwD$Jэ'G21g@>€Q< T$j@嫉C#ٙwiTtdS,{ZD&f 0 uj \i 5`C/Rb4ȳX}Ž4~NPˇ^=Q"Z :4sVpLj<=y Ӻ?^ ݵ'>gAc7T[{x[ ̿x,OĽx$[-?ޯ5OxR`Nc})[Oh->P`fe'rpg`])E( P=2Fl𹝈ZGyqI.%{L-XscЄuf`zJ=$-87Ȳ tb{r!َgGit_6V]Oy`OuٱVLmDAu;̗h74&hnq ױ3 RAZ3 al29=wNLbP/p7Vc ˀCѺ gISeGG, YmQ -=˞N"Od l"0##2S&1% 1RȲ;Iϸ w(O8c@'=iƟ&.#QNȋB0j(x11,al3B91l)k%Jݠ2v@Ãv<`Jb׈y$@$D'#t0v./Χ3iu9f];mH?F ;{wt }:}j{)HlsDׅ 3h~-aN:L)FRYgYR!îE)r$!Gc.Xp Wdj6]D7e^FM3KCT^tVA&0rp+aHd:yEXN -ʫREMSY XIlJFqx"ri r$ @b}I0VCRMn^vG W7ӕ6lQ8U_P'aZq1Ih.E_%Dx;n[+Kdx20zͯ CZ6֞PaffZ@>^ő̕AnTP ppv(/P3s0{lXY*E!=u>^fW1%<τ 4 dpTB2rn*ch $w?RhmJLsBQ* h.Ʀrov *(g"$8ҝ Qr< `a#-Py1Fa7u+nYG7n ̊1ȕBܧ_}>A7+? YD< ]\ƘQvE(@1 dw]E!#7B#@i -^G%!YG^=8#0\ࣁLLg>"UA ӇaV9S`)8'>- k:-mV14ؗ\&R7^^/ZiYh65l~_fۥ6G+Ycmrm^FV6c|7> m 9\XG 8\ ́/b0Mot u}0E' Z(<#`)5<^_ۜ᫪t7 r[S/μ9xR+4>qRN^1sKcub\Ԥo.j̘ hjo(6ÝnBp,[b[rۯFZck,L(istNbxª߾9{# ]47{7e˿/7K^,ƽ/=fS4}ˀzG}\Ԍ7$ ق@+ apX"=GS}/mz*%<70:Xʺ侃qI$?Kw (gGQDQDQэR,rQDq3[2>MaU&uϚy$QڤLPWnc8AEԡޱ1 ]»n΅:w^?^y%L0+/OsQGGt6w)#nUR, q<E֍٘j V(x(t2ӹ Nyٲ1_"-di# Iispl%MT m68%c|0ZC~~N` ۩`ȦƧ jpާR 4ko[_#C6\d\IEaX֔O;Jxy ~zn `#76c[N!0>y܎b9݅BԴ󄾀vj[KQ衍&I 1\:r ;lAI w7<#8 :njC;Xդ.7yg Cn-/ReDžҖ;=Zhylj1NBQ0/URSZ+kDD26CŎQ$#LpsعL١e̽ ;Z`{Vt^8|wߘ$ mq;Do^;(;Eҭ6%12MY-l 0J(PHUj5t.q'bhp0gk;|uܐo~׹Lձ ,] !wMmv4g8`* _@_&9R|'hpu~ [9zuqUG;ȸ4`۷o܉t?PK )%W0tx% cpython-3.12.0rc2/Doc/constraints.txtUT?d}QMO0WLťfKO؞ulc;]~}'"{>&'D0Dt-1C WR`)2!',L%돠3C鑽mE гEY}eE Ыc+{H9j"7!u4gF4P Jm4rq q8(q!m>f;o.SgmiZ찗]Ub{y6n/+AaxJ{ޗJ@y,L 5>Ŕ<9IBaW@_c< eFRxF >//v"@'0[