]> git.saurik.com Git - wxWidgets.git/commitdiff
Added some simple sample apps
authorRobin Dunn <robin@alldunn.com>
Sat, 10 Mar 2001 05:07:25 +0000 (05:07 +0000)
committerRobin Dunn <robin@alldunn.com>
Sat, 10 Mar 2001 05:07:25 +0000 (05:07 +0000)
git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@9492 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775

22 files changed:
wxPython/MANIFEST.in
wxPython/samples/doodle/doodle.py [new file with mode: 0644]
wxPython/samples/doodle/sample.ddl [new file with mode: 0644]
wxPython/samples/doodle/superdoodle.py [new file with mode: 0644]
wxPython/samples/stxview/StructuredText/ClassicDocumentClass.py [new file with mode: 0644]
wxPython/samples/stxview/StructuredText/DocBookClass.py [new file with mode: 0644]
wxPython/samples/stxview/StructuredText/DocumentClass.py [new file with mode: 0644]
wxPython/samples/stxview/StructuredText/DocumentWithImages.py [new file with mode: 0644]
wxPython/samples/stxview/StructuredText/HTMLClass.py [new file with mode: 0644]
wxPython/samples/stxview/StructuredText/HTMLWithImages.py [new file with mode: 0644]
wxPython/samples/stxview/StructuredText/MML.py [new file with mode: 0644]
wxPython/samples/stxview/StructuredText/ST.py [new file with mode: 0644]
wxPython/samples/stxview/StructuredText/STDOM.py [new file with mode: 0644]
wxPython/samples/stxview/StructuredText/STNG.txt [new file with mode: 0644]
wxPython/samples/stxview/StructuredText/StructuredText.py [new file with mode: 0644]
wxPython/samples/stxview/StructuredText/Zwiki.py [new file with mode: 0644]
wxPython/samples/stxview/StructuredText/__init__.py [new file with mode: 0644]
wxPython/samples/stxview/StructuredText/ts_regex.py [new file with mode: 0644]
wxPython/samples/stxview/stxview.py [new file with mode: 0644]
wxPython/samples/stxview/test.stx [new file with mode: 0644]
wxPython/samples/wxProject/README.txt [new file with mode: 0644]
wxPython/samples/wxProject/wxProject.py [new file with mode: 0644]

index 2f1074b3fd3758fa1490f9bab39603c595a50402..9aca4dbe5b5163719bf235ffe2103278f7c05f15 100644 (file)
@@ -5,6 +5,9 @@ include licence/*.txt
 include b
 include b.bat
 
+include SWIG/*
+exclude SWIG/CVS/*
+
 include demo/*.py
 include demo/bitmaps/*.bmp
 include demo/bitmaps/*.ico
@@ -22,6 +25,16 @@ include demo/data/*.i
 include demo/data/*.h
 include demo/data/*.py
 
+include samples/doodle/*.txt
+include samples/doodle/*.py
+include samples/doodle/sample.ddl
+include samples/stxview/*.txt
+include samples/stxview/*.py
+include samples/stxview/*.stx
+include samples/stxview/StructuredText/*.py
+include samples/wxProject/*.txt
+include samples/wxProject/*.py
+
 include wxPython/lib/*.py
 include wxPython/lib/*.txt
 include wxPython/lib/editor/*.py
@@ -29,7 +42,6 @@ include wxPython/lib/editor/*.txt
 
 exclude wxPython/*
 exclude tests
-exclude SWIG
 
 include src/*.i
 include src/*.py
diff --git a/wxPython/samples/doodle/doodle.py b/wxPython/samples/doodle/doodle.py
new file mode 100644 (file)
index 0000000..7756834
--- /dev/null
@@ -0,0 +1,212 @@
+# doodle.py
+
+"""
+This module contains the DoodleWindow class which is a window that you
+can do simple drawings upon.
+"""
+
+
+from wxPython.wx import *
+
+#----------------------------------------------------------------------
+
+class DoodleWindow(wxWindow):
+    menuColours = { 100 : 'Black',
+                    101 : 'Yellow',
+                    102 : 'Red',
+                    103 : 'Green',
+                    104 : 'Blue',
+                    105 : 'Purple',
+                    106 : 'Brown',
+                    107 : 'Aquamarine',
+                    108 : 'Forest Green',
+                    109 : 'Light Blue',
+                    110 : 'Goldenrod',
+                    111 : 'Cyan',
+                    112 : 'Orange',
+                    113 : 'Navy',
+                    114 : 'Dark Grey',
+                    115 : 'Light Grey',
+                    }
+    maxThickness = 16
+
+
+    def __init__(self, parent, ID):
+        wxWindow.__init__(self, parent, ID)
+        self.SetBackgroundColour(wxWHITE)
+        self.listeners = []
+        self.thickness = 1
+        self.SetColour("Black")
+        self.lines = []
+        self.x = self.y = 0
+        self.MakeMenu()
+
+        # hook some mouse events
+        EVT_LEFT_DOWN(self, self.OnLeftDown)
+        EVT_LEFT_UP(self, self.OnLeftUp)
+        EVT_RIGHT_UP(self, self.OnRightUp)
+        EVT_MOTION(self, self.OnMotion)
+
+        # and the refresh event
+        EVT_PAINT(self, self.OnPaint)
+
+
+    def __del__(self):
+        self.menu.Destroy()
+
+
+    def SetColour(self, colour):
+        """Set a new colour and make a matching pen"""
+        self.colour = colour
+        self.pen = wxPen(wxNamedColour(self.colour), self.thickness, wxSOLID)
+        self.Notify()
+
+
+    def SetThickness(self, num):
+        """Set a new line thickness and make a matching pen"""
+        self.thickness = num
+        self.pen = wxPen(wxNamedColour(self.colour), self.thickness, wxSOLID)
+        self.Notify()
+
+
+    def GetLinesData(self):
+        return self.lines[:]
+
+
+    def SetLinesData(self, lines):
+        self.lines = lines[:]
+        self.Refresh()
+
+
+    def MakeMenu(self):
+        """Make a menu that can be popped up later"""
+        menu = wxMenu()
+        keys = self.menuColours.keys()
+        keys.sort()
+        for k in keys:
+            text = self.menuColours[k]
+            menu.Append(k, text, checkable=true)
+        EVT_MENU_RANGE(self, 100, 200, self.OnMenuSetColour)
+        EVT_UPDATE_UI_RANGE(self, 100, 200, self.OnCheckMenuColours)
+        menu.Break()
+
+        for x in range(1, self.maxThickness+1):
+            menu.Append(x, str(x), checkable=true)
+        EVT_MENU_RANGE(self, 1, self.maxThickness, self.OnMenuSetThickness)
+        EVT_UPDATE_UI_RANGE(self, 1, self.maxThickness, self.OnCheckMenuThickness)
+        self.menu = menu
+
+
+    # These two event handlers are called before the menu is displayed
+    # to determine which items should be checked.
+    def OnCheckMenuColours(self, event):
+        text = self.menuColours[event.GetId()]
+        if text == self.colour:
+            event.Check(true)
+        else:
+            event.Check(false)
+    def OnCheckMenuThickness(self, event):
+        if event.GetId() == self.thickness:
+            event.Check(true)
+        else:
+            event.Check(false)
+
+
+    def OnLeftDown(self, event):
+        """called when the left mouse button is pressed"""
+        self.curLine = []
+        self.x, self.y = event.GetPositionTuple()
+        self.CaptureMouse()
+
+
+    def OnLeftUp(self, event):
+        """called when the left mouse button is released"""
+        self.lines.append( (self.colour, self.thickness, self.curLine) )
+        self.curLine = []
+        self.ReleaseMouse()
+
+
+    def OnRightUp(self, event):
+        """called when the right mouse button is released, will popup the menu"""
+        pt = event.GetPosition()
+        self.PopupMenu(self.menu, pt)
+
+
+
+    def OnMotion(self, event):
+        """
+        Called when the mouse is in motion.  If the left button is
+        dragging then draw a line from the last event position to the
+        current one.  Save the coordinants for redraws.
+        """
+        if event.Dragging() and event.LeftIsDown():
+            dc = wxClientDC(self)
+            dc.BeginDrawing()
+            dc.SetPen(self.pen)
+            pos = event.GetPositionTuple()
+            coords = (self.x, self.y) + pos
+            self.curLine.append(coords)
+            dc.DrawLine(self.x, self.y, pos[0], pos[1])
+            self.x, self.y = pos
+            dc.EndDrawing()
+
+
+    def OnPaint(self, event):
+        """
+        Called when the window is exposed.  Redraws all the lines that have
+        been drawn already.
+        """
+        dc = wxPaintDC(self)
+        dc.BeginDrawing()
+        for colour, thickness, line in self.lines:
+            pen = wxPen(wxNamedColour(colour), thickness, wxSOLID)
+            dc.SetPen(pen)
+            for coords in line:
+                apply(dc.DrawLine, coords)
+        dc.EndDrawing()
+
+
+    # Event handlers for the popup menu, uses the event ID to determine
+    # the colour or the thickness to set.
+    def OnMenuSetColour(self, event):
+        self.SetColour(self.menuColours[event.GetId()])
+
+    def OnMenuSetThickness(self, event):
+        self.SetThickness(event.GetId())
+
+
+    # Observer pattern.  Listeners are registered and then notified
+    # whenever doodle settings change.
+    def AddListener(self, listener):
+        self.listeners.append(listener)
+
+    def Notify(self):
+        for other in self.listeners:
+            other.Update(self.colour, self.thickness)
+
+
+#----------------------------------------------------------------------
+
+class DoodleFrame(wxFrame):
+    def __init__(self, parent):
+        wxFrame.__init__(self, parent, -1, "Doodle Frame", size=(800,600))
+        self.doodle = DoodleWindow(self, -1)
+
+
+#----------------------------------------------------------------------
+
+
+class DoodleApp(wxApp):
+    def OnInit(self):
+        frame = DoodleFrame(None)
+        frame.Show(true)
+        self.SetTopWindow(frame)
+        return true
+
+
+#----------------------------------------------------------------------
+
+if __name__ == '__main__':
+    app = DoodleApp(0)
+    app.MainLoop()
+
diff --git a/wxPython/samples/doodle/sample.ddl b/wxPython/samples/doodle/sample.ddl
new file mode 100644 (file)
index 0000000..c8b52a1
--- /dev/null
@@ -0,0 +1,41771 @@
+(lp1
+(S'Red'
+p2
+I1
+(lp3
+(I44
+I16
+I43
+I16
+ta(I43
+I16
+I42
+I16
+ta(I42
+I16
+I41
+I17
+ta(I41
+I17
+I39
+I19
+ta(I39
+I19
+I37
+I22
+ta(I37
+I22
+I35
+I25
+ta(I35
+I25
+I34
+I29
+ta(I34
+I29
+I33
+I35
+ta(I33
+I35
+I33
+I39
+ta(I33
+I39
+I33
+I45
+ta(I33
+I45
+I33
+I50
+ta(I33
+I50
+I33
+I56
+ta(I33
+I56
+I35
+I60
+ta(I35
+I60
+I38
+I65
+ta(I38
+I65
+I41
+I69
+ta(I41
+I69
+I45
+I72
+ta(I45
+I72
+I51
+I75
+ta(I51
+I75
+I56
+I77
+ta(I56
+I77
+I72
+I80
+ta(I72
+I80
+I88
+I81
+ta(I88
+I81
+I104
+I81
+ta(I104
+I81
+I122
+I81
+ta(I122
+I81
+I138
+I80
+ta(I138
+I80
+I152
+I78
+ta(I152
+I78
+I157
+I75
+ta(I157
+I75
+I160
+I72
+ta(I160
+I72
+I163
+I67
+ta(I163
+I67
+I165
+I62
+ta(I165
+I62
+I166
+I56
+ta(I166
+I56
+I166
+I50
+ta(I166
+I50
+I164
+I45
+ta(I164
+I45
+I162
+I39
+ta(I162
+I39
+I158
+I33
+ta(I158
+I33
+I154
+I30
+ta(I154
+I30
+I149
+I26
+ta(I149
+I26
+I144
+I23
+ta(I144
+I23
+I140
+I21
+ta(I140
+I21
+I136
+I20
+ta(I136
+I20
+I133
+I20
+ta(I133
+I20
+I130
+I20
+ta(I130
+I20
+I128
+I22
+ta(I128
+I22
+I126
+I25
+ta(I126
+I25
+I124
+I28
+ta(I124
+I28
+I122
+I34
+ta(I122
+I34
+I121
+I39
+ta(I121
+I39
+I120
+I45
+ta(I120
+I45
+I120
+I51
+ta(I120
+I51
+I120
+I69
+ta(I120
+I69
+I120
+I83
+ta(I120
+I83
+I121
+I97
+ta(I121
+I97
+I122
+I113
+ta(I122
+I113
+I125
+I127
+ta(I125
+I127
+I128
+I132
+ta(I128
+I132
+I134
+I138
+ta(I134
+I138
+I139
+I141
+ta(I139
+I141
+I145
+I144
+ta(I145
+I144
+I151
+I146
+ta(I151
+I146
+I167
+I147
+ta(I167
+I147
+I172
+I147
+ta(I172
+I147
+I186
+I145
+ta(I186
+I145
+I191
+I142
+ta(I191
+I142
+I196
+I139
+ta(I196
+I139
+I199
+I134
+ta(I199
+I134
+I202
+I120
+ta(I202
+I120
+I204
+I106
+ta(I204
+I106
+I204
+I100
+ta(I204
+I100
+I204
+I86
+ta(I204
+I86
+I204
+I80
+ta(I204
+I80
+I202
+I74
+ta(I202
+I74
+I198
+I58
+ta(I198
+I58
+I195
+I54
+ta(I195
+I54
+I191
+I48
+ta(I191
+I48
+I186
+I43
+ta(I186
+I43
+I181
+I39
+ta(I181
+I39
+I175
+I36
+ta(I175
+I36
+I170
+I35
+ta(I170
+I35
+I166
+I34
+ta(I166
+I34
+I162
+I34
+ta(I162
+I34
+I159
+I36
+ta(I159
+I36
+I157
+I40
+ta(I157
+I40
+I155
+I44
+ta(I155
+I44
+I154
+I50
+ta(I154
+I50
+I153
+I55
+ta(I153
+I55
+I153
+I61
+ta(I153
+I61
+I155
+I66
+ta(I155
+I66
+I157
+I71
+ta(I157
+I71
+I160
+I77
+ta(I160
+I77
+I163
+I81
+ta(I163
+I81
+I168
+I85
+ta(I168
+I85
+I174
+I89
+ta(I174
+I89
+I188
+I91
+ta(I188
+I91
+I208
+I93
+ta(I208
+I93
+I224
+I95
+ta(I224
+I95
+I242
+I95
+ta(I242
+I95
+I258
+I95
+ta(I258
+I95
+I278
+I92
+ta(I278
+I92
+I298
+I88
+ta(I298
+I88
+I304
+I84
+ta(I304
+I84
+I310
+I80
+ta(I310
+I80
+I315
+I75
+ta(I315
+I75
+I318
+I70
+ta(I318
+I70
+I319
+I64
+ta(I319
+I64
+I319
+I59
+ta(I319
+I59
+I317
+I54
+ta(I317
+I54
+I314
+I40
+ta(I314
+I40
+I310
+I37
+ta(I310
+I37
+I306
+I33
+ta(I306
+I33
+I301
+I30
+ta(I301
+I30
+I296
+I27
+ta(I296
+I27
+I292
+I26
+ta(I292
+I26
+I288
+I25
+ta(I288
+I25
+I285
+I25
+ta(I285
+I25
+I282
+I25
+ta(I282
+I25
+I279
+I27
+ta(I279
+I27
+I278
+I30
+ta(I278
+I30
+I276
+I35
+ta(I276
+I35
+I275
+I41
+ta(I275
+I41
+I275
+I46
+ta(I275
+I46
+I275
+I52
+ta(I275
+I52
+I276
+I57
+ta(I276
+I57
+I278
+I63
+ta(I278
+I63
+I281
+I68
+ta(I281
+I68
+I284
+I72
+ta(I284
+I72
+I288
+I76
+ta(I288
+I76
+I302
+I79
+ta(I302
+I79
+I307
+I82
+ta(I307
+I82
+I321
+I83
+ta(I321
+I83
+I337
+I84
+ta(I337
+I84
+I351
+I83
+ta(I351
+I83
+I367
+I81
+ta(I367
+I81
+I381
+I79
+ta(I381
+I79
+I386
+I75
+ta(I386
+I75
+I391
+I72
+ta(I391
+I72
+I394
+I67
+ta(I394
+I67
+I397
+I62
+ta(I397
+I62
+I398
+I48
+ta(I398
+I48
+I399
+I44
+ta(I399
+I44
+I398
+I38
+ta(I398
+I38
+I394
+I32
+ta(I394
+I32
+I390
+I29
+ta(I390
+I29
+I385
+I24
+ta(I385
+I24
+I371
+I20
+ta(I371
+I20
+I366
+I17
+ta(I366
+I17
+I360
+I15
+ta(I360
+I15
+I354
+I13
+ta(I354
+I13
+I340
+I11
+ta(I340
+I11
+I336
+I11
+ta(I336
+I11
+I332
+I11
+ta(I332
+I11
+I327
+I12
+ta(I327
+I12
+I324
+I14
+ta(I324
+I14
+I321
+I18
+ta(I321
+I18
+I320
+I24
+ta(I320
+I24
+I318
+I29
+ta(I318
+I29
+I318
+I35
+ta(I318
+I35
+I318
+I51
+ta(I318
+I51
+I318
+I57
+ta(I318
+I57
+I319
+I73
+ta(I319
+I73
+I321
+I79
+ta(I321
+I79
+I323
+I84
+ta(I323
+I84
+I327
+I89
+ta(I327
+I89
+I331
+I93
+ta(I331
+I93
+I335
+I96
+ta(I335
+I96
+I340
+I98
+ta(I340
+I98
+I354
+I99
+ta(I354
+I99
+I368
+I98
+ta(I368
+I98
+I384
+I97
+ta(I384
+I97
+I398
+I94
+ta(I398
+I94
+I403
+I89
+ta(I403
+I89
+I408
+I85
+ta(I408
+I85
+I409
+I80
+ta(I409
+I80
+I410
+I74
+ta(I410
+I74
+I410
+I69
+ta(I410
+I69
+I408
+I64
+ta(I408
+I64
+I404
+I59
+ta(I404
+I59
+I400
+I54
+ta(I400
+I54
+I386
+I49
+ta(I386
+I49
+I380
+I46
+ta(I380
+I46
+I366
+I42
+ta(I366
+I42
+I362
+I40
+ta(I362
+I40
+I357
+I37
+ta(I357
+I37
+I352
+I36
+ta(I352
+I36
+I349
+I36
+ta(I349
+I36
+I347
+I36
+ta(I347
+I36
+I346
+I36
+ta(I346
+I36
+I345
+I38
+ta(I345
+I38
+I345
+I42
+ta(I345
+I42
+I345
+I47
+ta(I345
+I47
+I345
+I52
+ta(I345
+I52
+I346
+I58
+ta(I346
+I58
+I348
+I64
+ta(I348
+I64
+I351
+I69
+ta(I351
+I69
+I355
+I75
+ta(I355
+I75
+I361
+I79
+ta(I361
+I79
+I366
+I83
+ta(I366
+I83
+I384
+I87
+ta(I384
+I87
+I400
+I89
+ta(I400
+I89
+I416
+I91
+ta(I416
+I91
+I436
+I91
+ta(I436
+I91
+I456
+I91
+ta(I456
+I91
+I476
+I90
+ta(I476
+I90
+I494
+I87
+ta(I494
+I87
+I512
+I83
+ta(I512
+I83
+I518
+I79
+ta(I518
+I79
+I534
+I74
+ta(I534
+I74
+I537
+I69
+ta(I537
+I69
+I539
+I63
+ta(I539
+I63
+I540
+I58
+ta(I540
+I58
+I540
+I52
+ta(I540
+I52
+I537
+I48
+ta(I537
+I48
+I533
+I42
+ta(I533
+I42
+I528
+I37
+ta(I528
+I37
+I512
+I32
+ta(I512
+I32
+I498
+I29
+ta(I498
+I29
+I492
+I27
+ta(I492
+I27
+I488
+I26
+ta(I488
+I26
+I484
+I26
+ta(I484
+I26
+I480
+I27
+ta(I480
+I27
+I476
+I31
+ta(I476
+I31
+I473
+I36
+ta(I473
+I36
+I472
+I41
+ta(I472
+I41
+I471
+I47
+ta(I471
+I47
+I471
+I61
+ta(I471
+I61
+I471
+I75
+ta(I471
+I75
+I474
+I79
+ta(I474
+I79
+I477
+I85
+ta(I477
+I85
+I480
+I89
+ta(I480
+I89
+I486
+I93
+ta(I486
+I93
+I502
+I96
+ta(I502
+I96
+I516
+I98
+ta(I516
+I98
+I534
+I99
+ta(I534
+I99
+I552
+I99
+ta(I552
+I99
+I570
+I98
+ta(I570
+I98
+I590
+I96
+ta(I590
+I96
+I608
+I93
+ta(I608
+I93
+I626
+I89
+ta(I626
+I89
+I642
+I85
+ta(I642
+I85
+I646
+I80
+ta(I646
+I80
+I649
+I75
+ta(I649
+I75
+I651
+I69
+ta(I651
+I69
+I651
+I65
+ta(I651
+I65
+I650
+I60
+ta(I650
+I60
+I646
+I55
+ta(I646
+I55
+I632
+I50
+ta(I632
+I50
+I626
+I46
+ta(I626
+I46
+I620
+I43
+ta(I620
+I43
+I606
+I41
+ta(I606
+I41
+I592
+I39
+ta(I592
+I39
+I578
+I37
+ta(I578
+I37
+I572
+I36
+ta(I572
+I36
+I568
+I36
+ta(I568
+I36
+I564
+I36
+ta(I564
+I36
+I561
+I39
+ta(I561
+I39
+I559
+I42
+ta(I559
+I42
+I558
+I46
+ta(I558
+I46
+I557
+I51
+ta(I557
+I51
+I557
+I56
+ta(I557
+I56
+I559
+I62
+ta(I559
+I62
+I561
+I67
+ta(I561
+I67
+I564
+I73
+ta(I564
+I73
+I570
+I78
+ta(I570
+I78
+I574
+I83
+ta(I574
+I83
+I579
+I85
+ta(I579
+I85
+I593
+I90
+ta(I593
+I90
+I609
+I92
+ta(I609
+I92
+I623
+I93
+ta(I623
+I93
+I641
+I94
+ta(I641
+I94
+I659
+I94
+ta(I659
+I94
+I673
+I93
+ta(I673
+I93
+I689
+I91
+ta(I689
+I91
+I693
+I87
+ta(I693
+I87
+I698
+I83
+ta(I698
+I83
+I700
+I79
+ta(I700
+I79
+I703
+I74
+ta(I703
+I74
+I703
+I68
+ta(I703
+I68
+I703
+I63
+ta(I703
+I63
+I700
+I58
+ta(I700
+I58
+I696
+I53
+ta(I696
+I53
+I692
+I48
+ta(I692
+I48
+I678
+I44
+ta(I678
+I44
+I672
+I41
+ta(I672
+I41
+I668
+I39
+ta(I668
+I39
+I662
+I37
+ta(I662
+I37
+I657
+I37
+ta(I657
+I37
+I652
+I37
+ta(I652
+I37
+I647
+I37
+ta(I647
+I37
+I643
+I39
+ta(I643
+I39
+I639
+I43
+ta(I639
+I43
+I635
+I47
+ta(I635
+I47
+I633
+I53
+ta(I633
+I53
+I631
+I59
+ta(I631
+I59
+I630
+I65
+ta(I630
+I65
+I629
+I83
+ta(I629
+I83
+I629
+I99
+ta(I629
+I99
+I629
+I105
+ta(I629
+I105
+I630
+I111
+ta(I630
+I111
+I631
+I117
+ta(I631
+I117
+I633
+I122
+ta(I633
+I122
+I636
+I125
+ta(I636
+I125
+I641
+I128
+ta(I641
+I128
+I646
+I131
+ta(I646
+I131
+I652
+I133
+ta(I652
+I133
+I656
+I133
+ta(I656
+I133
+I662
+I133
+ta(I662
+I133
+I666
+I132
+ta(I666
+I132
+I670
+I130
+ta(I670
+I130
+I673
+I128
+ta(I673
+I128
+I675
+I124
+ta(I675
+I124
+I676
+I121
+ta(I676
+I121
+I676
+I117
+ta(I676
+I117
+I675
+I114
+ta(I675
+I114
+I672
+I110
+ta(I672
+I110
+I668
+I106
+ta(I668
+I106
+I662
+I103
+ta(I662
+I103
+I656
+I100
+ta(I656
+I100
+I642
+I98
+ta(I642
+I98
+I636
+I97
+ta(I636
+I97
+I630
+I97
+ta(I630
+I97
+I616
+I96
+ta(I616
+I96
+I611
+I97
+ta(I611
+I97
+I605
+I99
+ta(I605
+I99
+I601
+I102
+ta(I601
+I102
+I596
+I107
+ta(I596
+I107
+I593
+I112
+ta(I593
+I112
+I590
+I118
+ta(I590
+I118
+I589
+I123
+ta(I589
+I123
+I589
+I128
+ta(I589
+I128
+I589
+I133
+ta(I589
+I133
+I590
+I139
+ta(I590
+I139
+I592
+I144
+ta(I592
+I144
+I596
+I147
+ta(I596
+I147
+I600
+I152
+ta(I600
+I152
+I604
+I155
+ta(I604
+I155
+I610
+I158
+ta(I610
+I158
+I616
+I160
+ta(I616
+I160
+I622
+I161
+ta(I622
+I161
+I640
+I161
+ta(I640
+I161
+I645
+I161
+ta(I645
+I161
+I651
+I161
+ta(I651
+I161
+I655
+I159
+ta(I655
+I159
+I659
+I156
+ta(I659
+I156
+I662
+I153
+ta(I662
+I153
+I663
+I150
+ta(I663
+I150
+I663
+I146
+ta(I663
+I146
+I662
+I141
+ta(I662
+I141
+I659
+I136
+ta(I659
+I136
+I655
+I130
+ta(I655
+I130
+I650
+I125
+ta(I650
+I125
+I644
+I120
+ta(I644
+I120
+I638
+I116
+ta(I638
+I116
+I633
+I111
+ta(I633
+I111
+I617
+I107
+ta(I617
+I107
+I601
+I103
+ta(I601
+I103
+I595
+I101
+ta(I595
+I101
+I575
+I99
+ta(I575
+I99
+I559
+I99
+ta(I559
+I99
+I553
+I99
+ta(I553
+I99
+I547
+I103
+ta(I547
+I103
+I543
+I107
+ta(I543
+I107
+I539
+I121
+ta(I539
+I121
+I537
+I127
+ta(I537
+I127
+I535
+I143
+ta(I535
+I143
+I534
+I157
+ta(I534
+I157
+I533
+I173
+ta(I533
+I173
+I533
+I178
+ta(I533
+I178
+I535
+I183
+ta(I535
+I183
+I537
+I188
+ta(I537
+I188
+I540
+I191
+ta(I540
+I191
+I543
+I195
+ta(I543
+I195
+I547
+I196
+ta(I547
+I196
+I551
+I198
+ta(I551
+I198
+I556
+I198
+ta(I556
+I198
+I562
+I198
+ta(I562
+I198
+I568
+I196
+ta(I568
+I196
+I573
+I194
+ta(I573
+I194
+I579
+I190
+ta(I579
+I190
+I582
+I187
+ta(I582
+I187
+I585
+I182
+ta(I585
+I182
+I587
+I177
+ta(I587
+I177
+I587
+I172
+ta(I587
+I172
+I586
+I158
+ta(I586
+I158
+I582
+I154
+ta(I582
+I154
+I578
+I149
+ta(I578
+I149
+I564
+I135
+ta(I564
+I135
+I550
+I131
+ta(I550
+I131
+I536
+I128
+ta(I536
+I128
+I520
+I125
+ta(I520
+I125
+I502
+I122
+ta(I502
+I122
+I484
+I119
+ta(I484
+I119
+I464
+I117
+ta(I464
+I117
+I442
+I116
+ta(I442
+I116
+I424
+I116
+ta(I424
+I116
+I404
+I117
+ta(I404
+I117
+I388
+I120
+ta(I388
+I120
+I382
+I124
+ta(I382
+I124
+I378
+I130
+ta(I378
+I130
+I375
+I136
+ta(I375
+I136
+I373
+I142
+ta(I373
+I142
+I372
+I156
+ta(I372
+I156
+I372
+I161
+ta(I372
+I161
+I374
+I167
+ta(I374
+I167
+I376
+I172
+ta(I376
+I172
+I379
+I177
+ta(I379
+I177
+I383
+I180
+ta(I383
+I180
+I387
+I183
+ta(I387
+I183
+I391
+I185
+ta(I391
+I185
+I395
+I187
+ta(I395
+I187
+I399
+I187
+ta(I399
+I187
+I403
+I187
+ta(I403
+I187
+I407
+I186
+ta(I407
+I186
+I411
+I184
+ta(I411
+I184
+I415
+I180
+ta(I415
+I180
+I418
+I177
+ta(I418
+I177
+I420
+I172
+ta(I420
+I172
+I420
+I167
+ta(I420
+I167
+I420
+I161
+ta(I420
+I161
+I418
+I147
+ta(I418
+I147
+I414
+I141
+ta(I414
+I141
+I410
+I136
+ta(I410
+I136
+I396
+I122
+ta(I396
+I122
+I392
+I118
+ta(I392
+I118
+I386
+I104
+ta(I386
+I104
+I370
+I100
+ta(I370
+I100
+I364
+I97
+ta(I364
+I97
+I350
+I94
+ta(I350
+I94
+I334
+I91
+ta(I334
+I91
+I318
+I90
+ta(I318
+I90
+I312
+I90
+ta(I312
+I90
+I308
+I92
+ta(I308
+I92
+I304
+I96
+ta(I304
+I96
+I301
+I101
+ta(I301
+I101
+I299
+I106
+ta(I299
+I106
+I298
+I122
+ta(I298
+I122
+I298
+I127
+ta(I298
+I127
+I298
+I133
+ta(I298
+I133
+I300
+I139
+ta(I300
+I139
+I303
+I144
+ta(I303
+I144
+I305
+I149
+ta(I305
+I149
+I309
+I154
+ta(I309
+I154
+I313
+I157
+ta(I313
+I157
+I318
+I160
+ta(I318
+I160
+I332
+I162
+ta(I332
+I162
+I346
+I163
+ta(I346
+I163
+I352
+I163
+ta(I352
+I163
+I366
+I163
+ta(I366
+I163
+I372
+I161
+ta(I372
+I161
+I377
+I158
+ta(I377
+I158
+I379
+I154
+ta(I379
+I154
+I382
+I150
+ta(I382
+I150
+I382
+I145
+ta(I382
+I145
+I382
+I140
+ta(I382
+I140
+I379
+I126
+ta(I379
+I126
+I376
+I121
+ta(I376
+I121
+I372
+I115
+ta(I372
+I115
+I368
+I111
+ta(I368
+I111
+I362
+I106
+ta(I362
+I106
+I348
+I102
+ta(I348
+I102
+I342
+I98
+ta(I342
+I98
+I328
+I96
+ta(I328
+I96
+I322
+I94
+ta(I322
+I94
+I317
+I94
+ta(I317
+I94
+I312
+I94
+ta(I312
+I94
+I307
+I97
+ta(I307
+I97
+I302
+I100
+ta(I302
+I100
+I299
+I105
+ta(I299
+I105
+I296
+I119
+ta(I296
+I119
+I294
+I125
+ta(I294
+I125
+I294
+I139
+ta(I294
+I139
+I294
+I153
+ta(I294
+I153
+I294
+I167
+ta(I294
+I167
+I297
+I181
+ta(I297
+I181
+I301
+I195
+ta(I301
+I195
+I306
+I201
+ta(I306
+I201
+I312
+I205
+ta(I312
+I205
+I318
+I207
+ta(I318
+I207
+I336
+I210
+ta(I336
+I210
+I354
+I210
+ta(I354
+I210
+I372
+I210
+ta(I372
+I210
+I392
+I209
+ta(I392
+I209
+I408
+I206
+ta(I408
+I206
+I414
+I202
+ta(I414
+I202
+I419
+I197
+ta(I419
+I197
+I420
+I193
+ta(I420
+I193
+I421
+I187
+ta(I421
+I187
+I420
+I181
+ta(I420
+I181
+I416
+I175
+ta(I416
+I175
+I411
+I170
+ta(I411
+I170
+I395
+I164
+ta(I395
+I164
+I379
+I160
+ta(I379
+I160
+I361
+I154
+ta(I361
+I154
+I343
+I151
+ta(I343
+I151
+I319
+I147
+ta(I319
+I147
+I299
+I144
+ta(I299
+I144
+I279
+I142
+ta(I279
+I142
+I257
+I141
+ta(I257
+I141
+I241
+I141
+ta(I241
+I141
+I227
+I141
+ta(I227
+I141
+I222
+I143
+ta(I222
+I143
+I218
+I147
+ta(I218
+I147
+I215
+I152
+ta(I215
+I152
+I214
+I157
+ta(I214
+I157
+I213
+I171
+ta(I213
+I171
+I213
+I177
+ta(I213
+I177
+I213
+I183
+ta(I213
+I183
+I214
+I197
+ta(I214
+I197
+I216
+I202
+ta(I216
+I202
+I219
+I208
+ta(I219
+I208
+I223
+I213
+ta(I223
+I213
+I229
+I217
+ta(I229
+I217
+I243
+I220
+ta(I243
+I220
+I263
+I222
+ta(I263
+I222
+I281
+I223
+ta(I281
+I223
+I301
+I223
+ta(I301
+I223
+I319
+I222
+ta(I319
+I222
+I333
+I219
+ta(I333
+I219
+I338
+I215
+ta(I338
+I215
+I340
+I210
+ta(I340
+I210
+I341
+I204
+ta(I341
+I204
+I341
+I198
+ta(I341
+I198
+I339
+I184
+ta(I339
+I184
+I334
+I178
+ta(I334
+I178
+I329
+I173
+ta(I329
+I173
+I313
+I159
+ta(I313
+I159
+I295
+I154
+ta(I295
+I154
+I277
+I140
+ta(I277
+I140
+I261
+I138
+ta(I261
+I138
+I243
+I134
+ta(I243
+I134
+I223
+I131
+ta(I223
+I131
+I203
+I128
+ta(I203
+I128
+I187
+I126
+ta(I187
+I126
+I171
+I126
+ta(I171
+I126
+I167
+I126
+ta(I167
+I126
+I161
+I127
+ta(I161
+I127
+I157
+I131
+ta(I157
+I131
+I155
+I137
+ta(I155
+I137
+I153
+I151
+ta(I153
+I151
+I151
+I167
+ta(I151
+I167
+I151
+I181
+ta(I151
+I181
+I151
+I197
+ta(I151
+I197
+I151
+I211
+ta(I151
+I211
+I153
+I217
+ta(I153
+I217
+I155
+I222
+ta(I155
+I222
+I158
+I226
+ta(I158
+I226
+I161
+I229
+ta(I161
+I229
+I165
+I232
+ta(I165
+I232
+I171
+I232
+ta(I171
+I232
+I176
+I232
+ta(I176
+I232
+I182
+I230
+ta(I182
+I230
+I187
+I227
+ta(I187
+I227
+I192
+I222
+ta(I192
+I222
+I195
+I218
+ta(I195
+I218
+I197
+I212
+ta(I197
+I212
+I198
+I206
+ta(I198
+I206
+I198
+I201
+ta(I198
+I201
+I197
+I187
+ta(I197
+I187
+I195
+I173
+ta(I195
+I173
+I191
+I168
+ta(I191
+I168
+I187
+I163
+ta(I187
+I163
+I182
+I149
+ta(I182
+I149
+I176
+I145
+ta(I176
+I145
+I162
+I141
+ta(I162
+I141
+I156
+I137
+ta(I156
+I137
+I140
+I133
+ta(I140
+I133
+I124
+I131
+ta(I124
+I131
+I108
+I130
+ta(I108
+I130
+I94
+I130
+ta(I94
+I130
+I80
+I131
+ta(I80
+I131
+I76
+I134
+ta(I76
+I134
+I71
+I137
+ta(I71
+I137
+I66
+I143
+ta(I66
+I143
+I62
+I149
+ta(I62
+I149
+I59
+I155
+ta(I59
+I155
+I57
+I171
+ta(I57
+I171
+I56
+I185
+ta(I56
+I185
+I55
+I199
+ta(I55
+I199
+I55
+I215
+ta(I55
+I215
+I55
+I229
+ta(I55
+I229
+I57
+I234
+ta(I57
+I234
+I59
+I240
+ta(I59
+I240
+I63
+I244
+ta(I63
+I244
+I67
+I247
+ta(I67
+I247
+I71
+I249
+ta(I71
+I249
+I87
+I251
+ta(I87
+I251
+I92
+I251
+ta(I92
+I251
+I98
+I250
+ta(I98
+I250
+I102
+I248
+ta(I102
+I248
+I106
+I244
+ta(I106
+I244
+I110
+I239
+ta(I110
+I239
+I112
+I233
+ta(I112
+I233
+I113
+I227
+ta(I113
+I227
+I113
+I221
+ta(I113
+I221
+I113
+I215
+ta(I113
+I215
+I112
+I201
+ta(I112
+I201
+I109
+I195
+ta(I109
+I195
+I107
+I189
+ta(I107
+I189
+I103
+I183
+ta(I103
+I183
+I99
+I179
+ta(I99
+I179
+I95
+I175
+ta(I95
+I175
+I90
+I171
+ta(I90
+I171
+I84
+I169
+ta(I84
+I169
+I78
+I168
+ta(I78
+I168
+I74
+I167
+ta(I74
+I167
+I69
+I167
+ta(I69
+I167
+I65
+I169
+ta(I65
+I169
+I62
+I172
+ta(I62
+I172
+I58
+I178
+ta(I58
+I178
+I55
+I184
+ta(I55
+I184
+I52
+I189
+ta(I52
+I189
+I48
+I209
+ta(I48
+I209
+I46
+I227
+ta(I46
+I227
+I43
+I243
+ta(I43
+I243
+I41
+I259
+ta(I41
+I259
+I38
+I277
+ta(I38
+I277
+I38
+I295
+ta(I38
+I295
+I38
+I311
+ta(I38
+I311
+I39
+I317
+ta(I39
+I317
+I42
+I323
+ta(I42
+I323
+I46
+I327
+ta(I46
+I327
+I52
+I330
+ta(I52
+I330
+I58
+I332
+ta(I58
+I332
+I63
+I333
+ta(I63
+I333
+I77
+I333
+ta(I77
+I333
+I82
+I331
+ta(I82
+I331
+I87
+I329
+ta(I87
+I329
+I91
+I325
+ta(I91
+I325
+I95
+I320
+ta(I95
+I320
+I99
+I315
+ta(I99
+I315
+I102
+I309
+ta(I102
+I309
+I104
+I304
+ta(I104
+I304
+I105
+I298
+ta(I105
+I298
+I105
+I293
+ta(I105
+I293
+I103
+I288
+ta(I103
+I288
+I101
+I283
+ta(I101
+I283
+I97
+I278
+ta(I97
+I278
+I92
+I275
+ta(I92
+I275
+I88
+I272
+ta(I88
+I272
+I84
+I271
+ta(I84
+I271
+I80
+I270
+ta(I80
+I270
+I76
+I271
+ta(I76
+I271
+I72
+I273
+ta(I72
+I273
+I68
+I275
+ta(I68
+I275
+I65
+I278
+ta(I65
+I278
+I61
+I282
+ta(I61
+I282
+I59
+I286
+ta(I59
+I286
+I57
+I292
+ta(I57
+I292
+I56
+I297
+ta(I56
+I297
+I56
+I302
+ta(I56
+I302
+I58
+I308
+ta(I58
+I308
+I60
+I314
+ta(I60
+I314
+I63
+I319
+ta(I63
+I319
+I67
+I324
+ta(I67
+I324
+I73
+I328
+ta(I73
+I328
+I78
+I332
+ta(I78
+I332
+I84
+I334
+ta(I84
+I334
+I89
+I336
+ta(I89
+I336
+I105
+I337
+ta(I105
+I337
+I119
+I337
+ta(I119
+I337
+I135
+I335
+ta(I135
+I335
+I153
+I331
+ta(I153
+I331
+I169
+I327
+ta(I169
+I327
+I174
+I322
+ta(I174
+I322
+I180
+I316
+ta(I180
+I316
+I183
+I302
+ta(I183
+I302
+I186
+I296
+ta(I186
+I296
+I187
+I282
+ta(I187
+I282
+I187
+I266
+ta(I187
+I266
+I185
+I252
+ta(I185
+I252
+I182
+I238
+ta(I182
+I238
+I178
+I224
+ta(I178
+I224
+I173
+I220
+ta(I173
+I220
+I159
+I206
+ta(I159
+I206
+I153
+I203
+ta(I153
+I203
+I149
+I201
+ta(I149
+I201
+I144
+I199
+ta(I144
+I199
+I140
+I199
+ta(I140
+I199
+I137
+I200
+ta(I137
+I200
+I135
+I202
+ta(I135
+I202
+I133
+I208
+ta(I133
+I208
+I132
+I213
+ta(I132
+I213
+I131
+I218
+ta(I131
+I218
+I131
+I234
+ta(I131
+I234
+I131
+I250
+ta(I131
+I250
+I133
+I264
+ta(I133
+I264
+I135
+I268
+ta(I135
+I268
+I138
+I274
+ta(I138
+I274
+I143
+I279
+ta(I143
+I279
+I148
+I283
+ta(I148
+I283
+I154
+I287
+ta(I154
+I287
+I160
+I290
+ta(I160
+I290
+I178
+I291
+ta(I178
+I291
+I194
+I292
+ta(I194
+I292
+I210
+I292
+ta(I210
+I292
+I224
+I290
+ta(I224
+I290
+I230
+I288
+ta(I230
+I288
+I236
+I284
+ta(I236
+I284
+I241
+I280
+ta(I241
+I280
+I245
+I276
+ta(I245
+I276
+I249
+I271
+ta(I249
+I271
+I251
+I257
+ta(I251
+I257
+I252
+I252
+ta(I252
+I252
+I252
+I238
+ta(I252
+I238
+I251
+I232
+ta(I251
+I232
+I248
+I218
+ta(I248
+I218
+I244
+I212
+ta(I244
+I212
+I240
+I207
+ta(I240
+I207
+I226
+I193
+ta(I226
+I193
+I221
+I189
+ta(I221
+I189
+I207
+I186
+ta(I207
+I186
+I203
+I183
+ta(I203
+I183
+I198
+I182
+ta(I198
+I182
+I194
+I182
+ta(I194
+I182
+I191
+I182
+ta(I191
+I182
+I189
+I184
+ta(I189
+I184
+I187
+I187
+ta(I187
+I187
+I186
+I193
+ta(I186
+I193
+I186
+I199
+ta(I186
+I199
+I186
+I215
+ta(I186
+I215
+I187
+I231
+ta(I187
+I231
+I188
+I247
+ta(I188
+I247
+I189
+I263
+ta(I189
+I263
+I192
+I279
+ta(I192
+I279
+I194
+I284
+ta(I194
+I284
+I197
+I290
+ta(I197
+I290
+I203
+I296
+ta(I203
+I296
+I208
+I299
+ta(I208
+I299
+I214
+I302
+ta(I214
+I302
+I230
+I303
+ta(I230
+I303
+I246
+I304
+ta(I246
+I304
+I262
+I304
+ta(I262
+I304
+I278
+I301
+ta(I278
+I301
+I294
+I298
+ta(I294
+I298
+I308
+I293
+ta(I308
+I293
+I313
+I287
+ta(I313
+I287
+I316
+I282
+ta(I316
+I282
+I319
+I268
+ta(I319
+I268
+I321
+I254
+ta(I321
+I254
+I322
+I240
+ta(I322
+I240
+I322
+I226
+ta(I322
+I226
+I319
+I212
+ta(I319
+I212
+I315
+I198
+ta(I315
+I198
+I311
+I194
+ta(I311
+I194
+I306
+I180
+ta(I306
+I180
+I300
+I177
+ta(I300
+I177
+I286
+I175
+ta(I286
+I175
+I282
+I174
+ta(I282
+I174
+I276
+I174
+ta(I276
+I174
+I272
+I174
+ta(I272
+I174
+I268
+I176
+ta(I268
+I176
+I265
+I181
+ta(I265
+I181
+I263
+I187
+ta(I263
+I187
+I262
+I192
+ta(I262
+I192
+I261
+I198
+ta(I261
+I198
+I261
+I212
+ta(I261
+I212
+I261
+I226
+ta(I261
+I226
+I262
+I244
+ta(I262
+I244
+I264
+I258
+ta(I264
+I258
+I268
+I274
+ta(I268
+I274
+I273
+I280
+ta(I273
+I280
+I279
+I296
+ta(I279
+I296
+I285
+I301
+ta(I285
+I301
+I301
+I306
+ta(I301
+I306
+I317
+I309
+ta(I317
+I309
+I333
+I311
+ta(I333
+I311
+I351
+I311
+ta(I351
+I311
+I369
+I311
+ta(I369
+I311
+I387
+I310
+ta(I387
+I310
+I401
+I306
+ta(I401
+I306
+I406
+I303
+ta(I406
+I303
+I411
+I299
+ta(I411
+I299
+I415
+I294
+ta(I415
+I294
+I419
+I280
+ta(I419
+I280
+I421
+I275
+ta(I421
+I275
+I421
+I261
+ta(I421
+I261
+I421
+I255
+ta(I421
+I255
+I416
+I241
+ta(I416
+I241
+I411
+I235
+ta(I411
+I235
+I397
+I231
+ta(I397
+I231
+I391
+I227
+ta(I391
+I227
+I385
+I224
+ta(I385
+I224
+I371
+I222
+ta(I371
+I222
+I365
+I221
+ta(I365
+I221
+I361
+I221
+ta(I361
+I221
+I358
+I221
+ta(I358
+I221
+I356
+I223
+ta(I356
+I223
+I354
+I227
+ta(I354
+I227
+I353
+I233
+ta(I353
+I233
+I353
+I238
+ta(I353
+I238
+I353
+I252
+ta(I353
+I252
+I353
+I268
+ta(I353
+I268
+I355
+I282
+ta(I355
+I282
+I358
+I298
+ta(I358
+I298
+I362
+I312
+ta(I362
+I312
+I365
+I326
+ta(I365
+I326
+I371
+I330
+ta(I371
+I330
+I376
+I333
+ta(I376
+I333
+I382
+I336
+ta(I382
+I336
+I388
+I338
+ta(I388
+I338
+I394
+I338
+ta(I394
+I338
+I408
+I337
+ta(I408
+I337
+I424
+I334
+ta(I424
+I334
+I429
+I331
+ta(I429
+I331
+I435
+I317
+ta(I435
+I317
+I441
+I313
+ta(I441
+I313
+I445
+I299
+ta(I445
+I299
+I448
+I293
+ta(I448
+I293
+I450
+I287
+ta(I450
+I287
+I451
+I273
+ta(I451
+I273
+I451
+I257
+ta(I451
+I257
+I449
+I243
+ta(I449
+I243
+I446
+I229
+ta(I446
+I229
+I442
+I223
+ta(I442
+I223
+I437
+I218
+ta(I437
+I218
+I432
+I213
+ta(I432
+I213
+I418
+I209
+ta(I418
+I209
+I414
+I206
+ta(I414
+I206
+I409
+I204
+ta(I409
+I204
+I405
+I203
+ta(I405
+I203
+I402
+I203
+ta(I402
+I203
+I399
+I203
+ta(I399
+I203
+I396
+I206
+ta(I396
+I206
+I393
+I212
+ta(I393
+I212
+I391
+I217
+ta(I391
+I217
+I390
+I223
+ta(I390
+I223
+I389
+I229
+ta(I389
+I229
+I389
+I247
+ta(I389
+I247
+I389
+I261
+ta(I389
+I261
+I391
+I277
+ta(I391
+I277
+I393
+I282
+ta(I393
+I282
+I396
+I287
+ta(I396
+I287
+I401
+I292
+ta(I401
+I292
+I406
+I295
+ta(I406
+I295
+I412
+I297
+ta(I412
+I297
+I418
+I299
+ta(I418
+I299
+I434
+I299
+ta(I434
+I299
+I450
+I297
+ta(I450
+I297
+I464
+I294
+ta(I464
+I294
+I470
+I290
+ta(I470
+I290
+I476
+I286
+ta(I476
+I286
+I481
+I280
+ta(I481
+I280
+I485
+I266
+ta(I485
+I266
+I488
+I260
+ta(I488
+I260
+I490
+I254
+ta(I490
+I254
+I490
+I238
+ta(I490
+I238
+I490
+I224
+ta(I490
+I224
+I489
+I208
+ta(I489
+I208
+I486
+I202
+ta(I486
+I202
+I483
+I196
+ta(I483
+I196
+I479
+I191
+ta(I479
+I191
+I474
+I185
+ta(I474
+I185
+I468
+I182
+ta(I468
+I182
+I462
+I178
+ta(I462
+I178
+I456
+I176
+ta(I456
+I176
+I452
+I175
+ta(I452
+I175
+I447
+I175
+ta(I447
+I175
+I444
+I175
+ta(I444
+I175
+I441
+I178
+ta(I441
+I178
+I439
+I181
+ta(I439
+I181
+I438
+I186
+ta(I438
+I186
+I437
+I200
+ta(I437
+I200
+I437
+I214
+ta(I437
+I214
+I439
+I230
+ta(I439
+I230
+I441
+I244
+ta(I441
+I244
+I444
+I260
+ta(I444
+I260
+I447
+I276
+ta(I447
+I276
+I452
+I281
+ta(I452
+I281
+I455
+I286
+ta(I455
+I286
+I460
+I289
+ta(I460
+I289
+I466
+I291
+ta(I466
+I291
+I470
+I292
+ta(I470
+I292
+I476
+I292
+ta(I476
+I292
+I481
+I292
+ta(I481
+I292
+I486
+I289
+ta(I486
+I289
+I491
+I285
+ta(I491
+I285
+I495
+I280
+ta(I495
+I280
+I499
+I266
+ta(I499
+I266
+I503
+I260
+ta(I503
+I260
+I505
+I254
+ta(I505
+I254
+I506
+I248
+ta(I506
+I248
+I506
+I234
+ta(I506
+I234
+I506
+I220
+ta(I506
+I220
+I506
+I206
+ta(I506
+I206
+I503
+I200
+ta(I503
+I200
+I500
+I194
+ta(I500
+I194
+I496
+I190
+ta(I496
+I190
+I492
+I185
+ta(I492
+I185
+I487
+I180
+ta(I487
+I180
+I483
+I177
+ta(I483
+I177
+I480
+I174
+ta(I480
+I174
+I476
+I172
+ta(I476
+I172
+I473
+I172
+ta(I473
+I172
+I471
+I172
+ta(I471
+I172
+I469
+I172
+ta(I469
+I172
+I467
+I173
+ta(I467
+I173
+I466
+I176
+ta(I466
+I176
+I465
+I179
+ta(I465
+I179
+I464
+I193
+ta(I464
+I193
+I464
+I199
+ta(I464
+I199
+I464
+I205
+ta(I464
+I205
+I464
+I225
+ta(I464
+I225
+I464
+I241
+ta(I464
+I241
+I464
+I257
+ta(I464
+I257
+I464
+I273
+ta(I464
+I273
+I466
+I287
+ta(I466
+I287
+I468
+I301
+ta(I468
+I301
+I472
+I306
+ta(I472
+I306
+I476
+I311
+ta(I476
+I311
+I482
+I314
+ta(I482
+I314
+I487
+I316
+ta(I487
+I316
+I493
+I318
+ta(I493
+I318
+I511
+I318
+ta(I511
+I318
+I525
+I318
+ta(I525
+I318
+I541
+I316
+ta(I541
+I316
+I561
+I311
+ta(I561
+I311
+I577
+I305
+ta(I577
+I305
+I595
+I299
+ta(I595
+I299
+I600
+I293
+ta(I600
+I293
+I605
+I279
+ta(I605
+I279
+I608
+I265
+ta(I608
+I265
+I611
+I249
+ta(I611
+I249
+I612
+I233
+ta(I612
+I233
+I612
+I219
+ta(I612
+I219
+I610
+I205
+ta(I610
+I205
+I607
+I200
+ta(I607
+I200
+I603
+I196
+ta(I603
+I196
+I598
+I192
+ta(I598
+I192
+I594
+I190
+ta(I594
+I190
+I590
+I189
+ta(I590
+I189
+I587
+I189
+ta(I587
+I189
+I585
+I189
+ta(I585
+I189
+I582
+I191
+ta(I582
+I191
+I580
+I193
+ta(I580
+I193
+I577
+I197
+ta(I577
+I197
+I575
+I201
+ta(I575
+I201
+I573
+I207
+ta(I573
+I207
+I571
+I213
+ta(I571
+I213
+I571
+I227
+ta(I571
+I227
+I571
+I241
+ta(I571
+I241
+I572
+I255
+ta(I572
+I255
+I574
+I273
+ta(I574
+I273
+I577
+I277
+ta(I577
+I277
+I581
+I281
+ta(I581
+I281
+I587
+I285
+ta(I587
+I285
+I593
+I288
+ta(I593
+I288
+I599
+I289
+ta(I599
+I289
+I615
+I289
+ta(I615
+I289
+I629
+I288
+ta(I629
+I288
+I634
+I285
+ta(I634
+I285
+I648
+I281
+ta(I648
+I281
+I654
+I276
+ta(I654
+I276
+I659
+I270
+ta(I659
+I270
+I662
+I254
+ta(I662
+I254
+I665
+I240
+ta(I665
+I240
+I667
+I226
+ta(I667
+I226
+I668
+I210
+ta(I668
+I210
+I668
+I194
+ta(I668
+I194
+I667
+I180
+ta(I667
+I180
+I664
+I166
+ta(I664
+I166
+I659
+I152
+ta(I659
+I152
+I645
+I147
+ta(I645
+I147
+I639
+I142
+ta(I639
+I142
+I623
+I138
+ta(I623
+I138
+I607
+I134
+ta(I607
+I134
+I593
+I133
+ta(I593
+I133
+I587
+I133
+ta(I587
+I133
+I583
+I133
+ta(I583
+I133
+I579
+I134
+ta(I579
+I134
+I577
+I136
+ta(I577
+I136
+I575
+I140
+ta(I575
+I140
+I573
+I145
+ta(I573
+I145
+I573
+I149
+ta(I573
+I149
+I573
+I163
+ta(I573
+I163
+I575
+I177
+ta(I575
+I177
+I577
+I191
+ta(I577
+I191
+I580
+I197
+ta(I580
+I197
+I584
+I213
+ta(I584
+I213
+I588
+I218
+ta(I588
+I218
+I594
+I223
+ta(I594
+I223
+I599
+I227
+ta(I599
+I227
+I605
+I231
+ta(I605
+I231
+I610
+I233
+ta(I610
+I233
+I624
+I234
+ta(I624
+I234
+I629
+I234
+ta(I629
+I234
+I635
+I233
+ta(I635
+I233
+I641
+I230
+ta(I641
+I230
+I644
+I227
+ta(I644
+I227
+I649
+I222
+ta(I649
+I222
+I652
+I216
+ta(I652
+I216
+I654
+I210
+ta(I654
+I210
+I655
+I204
+ta(I655
+I204
+I655
+I190
+ta(I655
+I190
+I653
+I184
+ta(I653
+I184
+I651
+I179
+ta(I651
+I179
+I647
+I173
+ta(I647
+I173
+I642
+I169
+ta(I642
+I169
+I638
+I165
+ta(I638
+I165
+I635
+I163
+ta(I635
+I163
+I631
+I161
+ta(I631
+I161
+I628
+I160
+ta(I628
+I160
+I625
+I160
+ta(I625
+I160
+I622
+I161
+ta(I622
+I161
+I618
+I164
+ta(I618
+I164
+I614
+I169
+ta(I614
+I169
+I611
+I187
+ta(I611
+I187
+I607
+I203
+ta(I607
+I203
+I605
+I217
+ta(I605
+I217
+I603
+I235
+ta(I603
+I235
+I602
+I257
+ta(I602
+I257
+I602
+I275
+ta(I602
+I275
+I602
+I291
+ta(I602
+I291
+I605
+I309
+ta(I605
+I309
+I608
+I323
+ta(I608
+I323
+I612
+I329
+ta(I612
+I329
+I616
+I335
+ta(I616
+I335
+I621
+I339
+ta(I621
+I339
+I635
+I343
+ta(I635
+I343
+I641
+I347
+ta(I641
+I347
+I657
+I350
+ta(I657
+I350
+I662
+I351
+ta(I662
+I351
+I678
+I351
+ta(I678
+I351
+I692
+I351
+ta(I692
+I351
+I696
+I349
+ta(I696
+I349
+I702
+I346
+ta(I702
+I346
+I705
+I343
+ta(I705
+I343
+I708
+I339
+ta(I708
+I339
+I710
+I336
+ta(I710
+I336
+I710
+I332
+ta(I710
+I332
+I709
+I327
+ta(I709
+I327
+I707
+I323
+ta(I707
+I323
+I703
+I319
+ta(I703
+I319
+I699
+I317
+ta(I699
+I317
+I694
+I315
+ta(I694
+I315
+I680
+I313
+ta(I680
+I313
+I676
+I313
+ta(I676
+I313
+I672
+I313
+ta(I672
+I313
+I667
+I315
+ta(I667
+I315
+I663
+I318
+ta(I663
+I318
+I658
+I323
+ta(I658
+I323
+I653
+I327
+ta(I653
+I327
+I648
+I333
+ta(I648
+I333
+I644
+I339
+ta(I644
+I339
+I641
+I344
+ta(I641
+I344
+I639
+I350
+ta(I639
+I350
+I638
+I355
+ta(I638
+I355
+I637
+I360
+ta(I637
+I360
+I637
+I365
+ta(I637
+I365
+I639
+I369
+ta(I639
+I369
+I641
+I372
+ta(I641
+I372
+I644
+I374
+ta(I644
+I374
+I647
+I376
+ta(I647
+I376
+I650
+I377
+ta(I650
+I377
+I653
+I378
+ta(I653
+I378
+I656
+I378
+ta(I656
+I378
+I660
+I378
+ta(I660
+I378
+I664
+I376
+ta(I664
+I376
+I667
+I374
+ta(I667
+I374
+I671
+I371
+ta(I671
+I371
+I675
+I368
+ta(I675
+I368
+I679
+I364
+ta(I679
+I364
+I682
+I359
+ta(I682
+I359
+I684
+I355
+ta(I684
+I355
+I685
+I350
+ta(I685
+I350
+I685
+I344
+ta(I685
+I344
+I685
+I340
+ta(I685
+I340
+I683
+I334
+ta(I683
+I334
+I680
+I328
+ta(I680
+I328
+I676
+I322
+ta(I676
+I322
+I671
+I318
+ta(I671
+I318
+I666
+I313
+ta(I666
+I313
+I660
+I309
+ta(I660
+I309
+I644
+I306
+ta(I644
+I306
+I638
+I303
+ta(I638
+I303
+I632
+I302
+ta(I632
+I302
+I626
+I301
+ta(I626
+I301
+I612
+I302
+ta(I612
+I302
+I606
+I304
+ta(I606
+I304
+I602
+I308
+ta(I602
+I308
+I597
+I322
+ta(I597
+I322
+I593
+I328
+ta(I593
+I328
+I590
+I344
+ta(I590
+I344
+I588
+I360
+ta(I588
+I360
+I588
+I376
+ta(I588
+I376
+I587
+I392
+ta(I587
+I392
+I588
+I397
+ta(I588
+I397
+I589
+I411
+ta(I589
+I411
+I592
+I417
+ta(I592
+I417
+I595
+I421
+ta(I595
+I421
+I599
+I424
+ta(I599
+I424
+I604
+I427
+ta(I604
+I427
+I608
+I428
+ta(I608
+I428
+I612
+I429
+ta(I612
+I429
+I616
+I429
+ta(I616
+I429
+I621
+I428
+ta(I621
+I428
+I625
+I427
+ta(I625
+I427
+I628
+I424
+ta(I628
+I424
+I630
+I421
+ta(I630
+I421
+I632
+I417
+ta(I632
+I417
+I632
+I413
+ta(I632
+I413
+I632
+I409
+ta(I632
+I409
+I630
+I403
+ta(I630
+I403
+I627
+I389
+ta(I627
+I389
+I621
+I375
+ta(I621
+I375
+I607
+I369
+ta(I607
+I369
+I593
+I363
+ta(I593
+I363
+I577
+I359
+ta(I577
+I359
+I559
+I354
+ta(I559
+I354
+I543
+I350
+ta(I543
+I350
+I529
+I346
+ta(I529
+I346
+I513
+I343
+ta(I513
+I343
+I499
+I341
+ta(I499
+I341
+I485
+I340
+ta(I485
+I340
+I469
+I340
+ta(I469
+I340
+I464
+I341
+ta(I464
+I341
+I450
+I345
+ta(I450
+I345
+I446
+I350
+ta(I446
+I350
+I443
+I356
+ta(I443
+I356
+I440
+I362
+ta(I440
+I362
+I439
+I378
+ta(I439
+I378
+I439
+I392
+ta(I439
+I392
+I439
+I398
+ta(I439
+I398
+I439
+I404
+ta(I439
+I404
+I439
+I420
+ta(I439
+I420
+I441
+I424
+ta(I441
+I424
+I443
+I429
+ta(I443
+I429
+I445
+I432
+ta(I445
+I432
+I448
+I436
+ta(I448
+I436
+I451
+I438
+ta(I451
+I438
+I455
+I440
+ta(I455
+I440
+I459
+I440
+ta(I459
+I440
+I464
+I440
+ta(I464
+I440
+I468
+I439
+ta(I468
+I439
+I473
+I436
+ta(I473
+I436
+I478
+I433
+ta(I478
+I433
+I481
+I429
+ta(I481
+I429
+I485
+I424
+ta(I485
+I424
+I488
+I410
+ta(I488
+I410
+I489
+I405
+ta(I489
+I405
+I490
+I391
+ta(I490
+I391
+I489
+I385
+ta(I489
+I385
+I487
+I379
+ta(I487
+I379
+I485
+I374
+ta(I485
+I374
+I482
+I368
+ta(I482
+I368
+I478
+I363
+ta(I478
+I363
+I473
+I357
+ta(I473
+I357
+I467
+I354
+ta(I467
+I354
+I461
+I350
+ta(I461
+I350
+I456
+I347
+ta(I456
+I347
+I440
+I344
+ta(I440
+I344
+I434
+I343
+ta(I434
+I343
+I420
+I343
+ta(I420
+I343
+I406
+I344
+ta(I406
+I344
+I400
+I347
+ta(I400
+I347
+I395
+I353
+ta(I395
+I353
+I392
+I367
+ta(I392
+I367
+I388
+I381
+ta(I388
+I381
+I385
+I397
+ta(I385
+I397
+I383
+I411
+ta(I383
+I411
+I382
+I427
+ta(I382
+I427
+I381
+I432
+ta(I381
+I432
+I381
+I448
+ta(I381
+I448
+I381
+I453
+ta(I381
+I453
+I383
+I456
+ta(I383
+I456
+I386
+I460
+ta(I386
+I460
+I390
+I462
+ta(I390
+I462
+I396
+I464
+ta(I396
+I464
+I400
+I464
+ta(I400
+I464
+I406
+I464
+ta(I406
+I464
+I412
+I462
+ta(I412
+I462
+I428
+I460
+ta(I428
+I460
+I433
+I457
+ta(I433
+I457
+I439
+I453
+ta(I439
+I453
+I445
+I448
+ta(I445
+I448
+I448
+I443
+ta(I448
+I443
+I450
+I437
+ta(I450
+I437
+I450
+I431
+ta(I450
+I431
+I450
+I425
+ta(I450
+I425
+I447
+I420
+ta(I447
+I420
+I443
+I415
+ta(I443
+I415
+I438
+I401
+ta(I438
+I401
+I424
+I397
+ta(I424
+I397
+I410
+I392
+ta(I410
+I392
+I392
+I388
+ta(I392
+I388
+I374
+I385
+ta(I374
+I385
+I352
+I382
+ta(I352
+I382
+I330
+I379
+ta(I330
+I379
+I308
+I376
+ta(I308
+I376
+I288
+I375
+ta(I288
+I375
+I268
+I375
+ta(I268
+I375
+I250
+I375
+ta(I250
+I375
+I230
+I378
+ta(I230
+I378
+I224
+I381
+ta(I224
+I381
+I218
+I387
+ta(I218
+I387
+I215
+I392
+ta(I215
+I392
+I212
+I398
+ta(I212
+I398
+I211
+I416
+ta(I211
+I416
+I210
+I422
+ta(I210
+I422
+I211
+I438
+ta(I211
+I438
+I213
+I443
+ta(I213
+I443
+I215
+I449
+ta(I215
+I449
+I220
+I454
+ta(I220
+I454
+I223
+I457
+ta(I223
+I457
+I228
+I460
+ta(I228
+I460
+I232
+I462
+ta(I232
+I462
+I238
+I463
+ta(I238
+I463
+I244
+I463
+ta(I244
+I463
+I249
+I463
+ta(I249
+I463
+I254
+I460
+ta(I254
+I460
+I258
+I457
+ta(I258
+I457
+I262
+I453
+ta(I262
+I453
+I267
+I447
+ta(I267
+I447
+I268
+I433
+ta(I268
+I433
+I269
+I427
+ta(I269
+I427
+I269
+I413
+ta(I269
+I413
+I268
+I407
+ta(I268
+I407
+I266
+I391
+ta(I266
+I391
+I264
+I377
+ta(I264
+I377
+I261
+I371
+ta(I261
+I371
+I258
+I365
+ta(I258
+I365
+I255
+I359
+ta(I255
+I359
+I250
+I354
+ta(I250
+I354
+I246
+I349
+ta(I246
+I349
+I241
+I345
+ta(I241
+I345
+I236
+I341
+ta(I236
+I341
+I232
+I340
+ta(I232
+I340
+I227
+I340
+ta(I227
+I340
+I224
+I340
+ta(I224
+I340
+I220
+I343
+ta(I220
+I343
+I217
+I348
+ta(I217
+I348
+I215
+I362
+ta(I215
+I362
+I213
+I376
+ta(I213
+I376
+I213
+I392
+ta(I213
+I392
+I212
+I406
+ta(I212
+I406
+I212
+I422
+ta(I212
+I422
+I213
+I428
+ta(I213
+I428
+I216
+I442
+ta(I216
+I442
+I219
+I447
+ta(I219
+I447
+I223
+I452
+ta(I223
+I452
+I229
+I455
+ta(I229
+I455
+I235
+I458
+ta(I235
+I458
+I249
+I460
+ta(I249
+I460
+I265
+I461
+ta(I265
+I461
+I281
+I461
+ta(I281
+I461
+I299
+I458
+ta(I299
+I458
+I315
+I455
+ta(I315
+I455
+I331
+I451
+ta(I331
+I451
+I337
+I446
+ta(I337
+I446
+I341
+I441
+ta(I341
+I441
+I343
+I435
+ta(I343
+I435
+I345
+I421
+ta(I345
+I421
+I345
+I415
+ta(I345
+I415
+I345
+I399
+ta(I345
+I399
+I342
+I383
+ta(I342
+I383
+I339
+I369
+ta(I339
+I369
+I335
+I363
+ta(I335
+I363
+I329
+I358
+ta(I329
+I358
+I315
+I353
+ta(I315
+I353
+I309
+I349
+ta(I309
+I349
+I295
+I345
+ta(I295
+I345
+I281
+I342
+ta(I281
+I342
+I267
+I340
+ta(I267
+I340
+I261
+I339
+ta(I261
+I339
+I257
+I339
+ta(I257
+I339
+I253
+I341
+ta(I253
+I341
+I250
+I344
+ta(I250
+I344
+I248
+I349
+ta(I248
+I349
+I246
+I355
+ta(I246
+I355
+I246
+I361
+ta(I246
+I361
+I246
+I377
+ta(I246
+I377
+I246
+I393
+ta(I246
+I393
+I248
+I398
+ta(I248
+I398
+I252
+I416
+ta(I252
+I416
+I258
+I421
+ta(I258
+I421
+I263
+I426
+ta(I263
+I426
+I279
+I429
+ta(I279
+I429
+I295
+I432
+ta(I295
+I432
+I309
+I433
+ta(I309
+I433
+I325
+I433
+ta(I325
+I433
+I343
+I430
+ta(I343
+I430
+I359
+I426
+ta(I359
+I426
+I364
+I421
+ta(I364
+I421
+I369
+I407
+ta(I369
+I407
+I371
+I393
+ta(I371
+I393
+I373
+I379
+ta(I373
+I379
+I374
+I363
+ta(I374
+I363
+I372
+I349
+ta(I372
+I349
+I368
+I335
+ta(I368
+I335
+I362
+I319
+ta(I362
+I319
+I356
+I305
+ta(I356
+I305
+I350
+I299
+ta(I350
+I299
+I336
+I295
+ta(I336
+I295
+I320
+I290
+ta(I320
+I290
+I304
+I286
+ta(I304
+I286
+I290
+I283
+ta(I290
+I283
+I272
+I279
+ta(I272
+I279
+I258
+I278
+ta(I258
+I278
+I244
+I276
+ta(I244
+I276
+I239
+I276
+ta(I239
+I276
+I236
+I276
+ta(I236
+I276
+I233
+I278
+ta(I233
+I278
+I231
+I281
+ta(I231
+I281
+I229
+I286
+ta(I229
+I286
+I228
+I300
+ta(I228
+I300
+I228
+I306
+ta(I228
+I306
+I228
+I324
+ta(I228
+I324
+I228
+I340
+ta(I228
+I340
+I228
+I356
+ta(I228
+I356
+I228
+I374
+ta(I228
+I374
+I229
+I392
+ta(I229
+I392
+I231
+I408
+ta(I231
+I408
+I233
+I422
+ta(I233
+I422
+I236
+I428
+ta(I236
+I428
+I239
+I433
+ta(I239
+I433
+I243
+I435
+ta(I243
+I435
+I246
+I436
+ta(I246
+I436
+I250
+I437
+ta(I250
+I437
+I253
+I437
+ta(I253
+I437
+I256
+I434
+ta(I256
+I434
+I258
+I430
+ta(I258
+I430
+I260
+I416
+ta(I260
+I416
+I262
+I402
+ta(I262
+I402
+I262
+I386
+ta(I262
+I386
+I262
+I370
+ta(I262
+I370
+I261
+I356
+ta(I261
+I356
+I258
+I338
+ta(I258
+I338
+I255
+I324
+ta(I255
+I324
+I251
+I310
+ta(I251
+I310
+I246
+I305
+ta(I246
+I305
+I232
+I291
+ta(I232
+I291
+I226
+I288
+ta(I226
+I288
+I212
+I285
+ta(I212
+I285
+I206
+I283
+ta(I206
+I283
+I200
+I282
+ta(I200
+I282
+I186
+I282
+ta(I186
+I282
+I181
+I284
+ta(I181
+I284
+I176
+I287
+ta(I176
+I287
+I170
+I293
+ta(I170
+I293
+I166
+I299
+ta(I166
+I299
+I162
+I315
+ta(I162
+I315
+I159
+I331
+ta(I159
+I331
+I156
+I351
+ta(I156
+I351
+I153
+I371
+ta(I153
+I371
+I152
+I389
+ta(I152
+I389
+I152
+I409
+ta(I152
+I409
+I152
+I427
+ta(I152
+I427
+I153
+I433
+ta(I153
+I433
+I156
+I438
+ta(I156
+I438
+I159
+I441
+ta(I159
+I441
+I163
+I444
+ta(I163
+I444
+I166
+I446
+ta(I166
+I446
+I170
+I447
+ta(I170
+I447
+I174
+I447
+ta(I174
+I447
+I179
+I445
+ta(I179
+I445
+I182
+I441
+ta(I182
+I441
+I186
+I436
+ta(I186
+I436
+I190
+I422
+ta(I190
+I422
+I195
+I416
+ta(I195
+I416
+I199
+I402
+ta(I199
+I402
+I201
+I396
+ta(I201
+I396
+I202
+I382
+ta(I202
+I382
+I202
+I368
+ta(I202
+I368
+I202
+I354
+ta(I202
+I354
+I200
+I340
+ta(I200
+I340
+I197
+I334
+ta(I197
+I334
+I193
+I328
+ta(I193
+I328
+I179
+I323
+ta(I179
+I323
+I173
+I318
+ta(I173
+I318
+I167
+I314
+ta(I167
+I314
+I153
+I312
+ta(I153
+I312
+I147
+I310
+ta(I147
+I310
+I141
+I310
+ta(I141
+I310
+I137
+I310
+ta(I137
+I310
+I131
+I313
+ta(I131
+I313
+I126
+I317
+ta(I126
+I317
+I123
+I323
+ta(I123
+I323
+I120
+I341
+ta(I120
+I341
+I117
+I359
+ta(I117
+I359
+I115
+I377
+ta(I115
+I377
+I114
+I395
+ta(I114
+I395
+I112
+I417
+ta(I112
+I417
+I111
+I435
+ta(I111
+I435
+I111
+I453
+ta(I111
+I453
+I111
+I469
+ta(I111
+I469
+I112
+I475
+ta(I112
+I475
+I114
+I480
+ta(I114
+I480
+I116
+I483
+ta(I116
+I483
+I119
+I485
+ta(I119
+I485
+I123
+I487
+ta(I123
+I487
+I127
+I487
+ta(I127
+I487
+I133
+I486
+ta(I133
+I486
+I139
+I483
+ta(I139
+I483
+I144
+I480
+ta(I144
+I480
+I149
+I476
+ta(I149
+I476
+I153
+I470
+ta(I153
+I470
+I156
+I464
+ta(I156
+I464
+I158
+I458
+ta(I158
+I458
+I160
+I452
+ta(I160
+I452
+I160
+I446
+ta(I160
+I446
+I159
+I432
+ta(I159
+I432
+I157
+I418
+ta(I157
+I418
+I154
+I412
+ta(I154
+I412
+I149
+I406
+ta(I149
+I406
+I144
+I402
+ta(I144
+I402
+I130
+I397
+ta(I130
+I397
+I124
+I393
+ta(I124
+I393
+I110
+I390
+ta(I110
+I390
+I94
+I387
+ta(I94
+I387
+I90
+I386
+ta(I90
+I386
+I86
+I386
+ta(I86
+I386
+I81
+I386
+ta(I81
+I386
+I77
+I388
+ta(I77
+I388
+I73
+I392
+ta(I73
+I392
+I69
+I396
+ta(I69
+I396
+I65
+I402
+ta(I65
+I402
+I62
+I416
+ta(I62
+I416
+I60
+I422
+ta(I60
+I422
+I58
+I440
+ta(I58
+I440
+I57
+I456
+ta(I57
+I456
+I57
+I474
+ta(I57
+I474
+I57
+I492
+ta(I57
+I492
+I59
+I508
+ta(I59
+I508
+I61
+I522
+ta(I61
+I522
+I64
+I527
+ta(I64
+I527
+I67
+I530
+ta(I67
+I530
+I70
+I533
+ta(I70
+I533
+I75
+I535
+ta(I75
+I535
+I80
+I535
+ta(I80
+I535
+I85
+I534
+ta(I85
+I534
+I90
+I531
+ta(I90
+I531
+I95
+I526
+ta(I95
+I526
+I98
+I520
+ta(I98
+I520
+I101
+I506
+ta(I101
+I506
+I102
+I492
+ta(I102
+I492
+I104
+I476
+ta(I104
+I476
+I104
+I460
+ta(I104
+I460
+I104
+I442
+ta(I104
+I442
+I102
+I426
+ta(I102
+I426
+I99
+I408
+ta(I99
+I408
+I96
+I394
+ta(I96
+I394
+I92
+I380
+ta(I92
+I380
+I88
+I376
+ta(I88
+I376
+I83
+I371
+ta(I83
+I371
+I78
+I367
+ta(I78
+I367
+I73
+I363
+ta(I73
+I363
+I68
+I360
+ta(I68
+I360
+I63
+I358
+ta(I63
+I358
+I59
+I357
+ta(I59
+I357
+I56
+I357
+ta(I56
+I357
+I53
+I359
+ta(I53
+I359
+I50
+I363
+ta(I50
+I363
+I49
+I369
+ta(I49
+I369
+I47
+I375
+ta(I47
+I375
+I46
+I393
+ta(I46
+I393
+I45
+I407
+ta(I45
+I407
+I44
+I421
+ta(I44
+I421
+I44
+I439
+ta(I44
+I439
+I44
+I455
+ta(I44
+I455
+I44
+I469
+ta(I44
+I469
+I44
+I474
+ta(I44
+I474
+I45
+I480
+ta(I45
+I480
+I46
+I483
+ta(I46
+I483
+I49
+I487
+ta(I49
+I487
+I52
+I490
+ta(I52
+I490
+I55
+I493
+ta(I55
+I493
+I59
+I494
+ta(I59
+I494
+I63
+I494
+ta(I63
+I494
+I67
+I493
+ta(I67
+I493
+I73
+I490
+ta(I73
+I490
+I78
+I487
+ta(I78
+I487
+I81
+I483
+ta(I81
+I483
+I85
+I478
+ta(I85
+I478
+I89
+I464
+ta(I89
+I464
+I91
+I458
+ta(I91
+I458
+I92
+I452
+ta(I92
+I452
+I92
+I438
+ta(I92
+I438
+I92
+I424
+ta(I92
+I424
+I90
+I410
+ta(I90
+I410
+I87
+I396
+ta(I87
+I396
+I83
+I390
+ta(I83
+I390
+I79
+I385
+ta(I79
+I385
+I75
+I381
+ta(I75
+I381
+I70
+I378
+ta(I70
+I378
+I64
+I376
+ta(I64
+I376
+I59
+I375
+ta(I59
+I375
+I53
+I375
+ta(I53
+I375
+I50
+I376
+ta(I50
+I376
+I45
+I380
+ta(I45
+I380
+I40
+I386
+ta(I40
+I386
+I36
+I392
+ta(I36
+I392
+I33
+I408
+ta(I33
+I408
+I30
+I426
+ta(I30
+I426
+I28
+I442
+ta(I28
+I442
+I28
+I460
+ta(I28
+I460
+I27
+I476
+ta(I27
+I476
+I27
+I496
+ta(I27
+I496
+I27
+I512
+ta(I27
+I512
+I28
+I526
+ta(I28
+I526
+I31
+I531
+ta(I31
+I531
+I35
+I537
+ta(I35
+I537
+I49
+I540
+ta(I49
+I540
+I63
+I543
+ta(I63
+I543
+I79
+I544
+ta(I79
+I544
+I99
+I545
+ta(I99
+I545
+I123
+I545
+ta(I123
+I545
+I145
+I544
+ta(I145
+I544
+I167
+I542
+ta(I167
+I542
+I189
+I539
+ta(I189
+I539
+I205
+I536
+ta(I205
+I536
+I221
+I531
+ta(I221
+I531
+I225
+I527
+ta(I225
+I527
+I229
+I521
+ta(I229
+I521
+I231
+I507
+ta(I231
+I507
+I233
+I501
+ta(I233
+I501
+I233
+I495
+ta(I233
+I495
+I232
+I490
+ta(I232
+I490
+I229
+I476
+ta(I229
+I476
+I225
+I470
+ta(I225
+I470
+I219
+I464
+ta(I219
+I464
+I214
+I460
+ta(I214
+I460
+I209
+I456
+ta(I209
+I456
+I204
+I452
+ta(I204
+I452
+I199
+I449
+ta(I199
+I449
+I194
+I448
+ta(I194
+I448
+I190
+I447
+ta(I190
+I447
+I187
+I447
+ta(I187
+I447
+I183
+I448
+ta(I183
+I448
+I180
+I451
+ta(I180
+I451
+I177
+I457
+ta(I177
+I457
+I175
+I462
+ta(I175
+I462
+I174
+I468
+ta(I174
+I468
+I172
+I486
+ta(I172
+I486
+I171
+I500
+ta(I171
+I500
+I171
+I516
+ta(I171
+I516
+I171
+I532
+ta(I171
+I532
+I171
+I546
+ta(I171
+I546
+I172
+I560
+ta(I172
+I560
+I174
+I576
+ta(I174
+I576
+I177
+I580
+ta(I177
+I580
+I181
+I585
+ta(I181
+I585
+I187
+I589
+ta(I187
+I589
+I193
+I591
+ta(I193
+I591
+I211
+I593
+ta(I211
+I593
+I229
+I593
+ta(I229
+I593
+I245
+I593
+ta(I245
+I593
+I261
+I592
+ta(I261
+I592
+I279
+I588
+ta(I279
+I588
+I284
+I584
+ta(I284
+I584
+I290
+I579
+ta(I290
+I579
+I294
+I565
+ta(I294
+I565
+I298
+I551
+ta(I298
+I551
+I300
+I537
+ta(I300
+I537
+I302
+I521
+ta(I302
+I521
+I302
+I505
+ta(I302
+I505
+I302
+I491
+ta(I302
+I491
+I299
+I475
+ta(I299
+I475
+I296
+I469
+ta(I296
+I469
+I282
+I455
+ta(I282
+I455
+I278
+I451
+ta(I278
+I451
+I264
+I447
+ta(I264
+I447
+I250
+I444
+ta(I250
+I444
+I236
+I441
+ta(I236
+I441
+I230
+I439
+ta(I230
+I439
+I224
+I439
+ta(I224
+I439
+I220
+I441
+ta(I220
+I441
+I217
+I445
+ta(I217
+I445
+I214
+I449
+ta(I214
+I449
+I212
+I463
+ta(I212
+I463
+I211
+I469
+ta(I211
+I469
+I211
+I487
+ta(I211
+I487
+I212
+I501
+ta(I212
+I501
+I213
+I515
+ta(I213
+I515
+I216
+I521
+ta(I216
+I521
+I219
+I526
+ta(I219
+I526
+I223
+I531
+ta(I223
+I531
+I227
+I534
+ta(I227
+I534
+I241
+I537
+ta(I241
+I537
+I247
+I540
+ta(I247
+I540
+I263
+I540
+ta(I263
+I540
+I281
+I540
+ta(I281
+I540
+I299
+I538
+ta(I299
+I538
+I315
+I535
+ta(I315
+I535
+I331
+I532
+ta(I331
+I532
+I337
+I528
+ta(I337
+I528
+I343
+I523
+ta(I343
+I523
+I348
+I518
+ta(I348
+I518
+I350
+I512
+ta(I350
+I512
+I351
+I506
+ta(I351
+I506
+I351
+I502
+ta(I351
+I502
+I350
+I488
+ta(I350
+I488
+I346
+I483
+ta(I346
+I483
+I343
+I477
+ta(I343
+I477
+I337
+I472
+ta(I337
+I472
+I332
+I467
+ta(I332
+I467
+I326
+I463
+ta(I326
+I463
+I320
+I461
+ta(I320
+I461
+I304
+I458
+ta(I304
+I458
+I290
+I458
+ta(I290
+I458
+I284
+I458
+ta(I284
+I458
+I279
+I461
+ta(I279
+I461
+I274
+I464
+ta(I274
+I464
+I270
+I470
+ta(I270
+I470
+I267
+I476
+ta(I267
+I476
+I265
+I482
+ta(I265
+I482
+I264
+I500
+ta(I264
+I500
+I264
+I514
+ta(I264
+I514
+I266
+I528
+ta(I266
+I528
+I268
+I533
+ta(I268
+I533
+I272
+I547
+ta(I272
+I547
+I277
+I552
+ta(I277
+I552
+I282
+I556
+ta(I282
+I556
+I298
+I561
+ta(I298
+I561
+I314
+I565
+ta(I314
+I565
+I330
+I568
+ta(I330
+I568
+I346
+I570
+ta(I346
+I570
+I366
+I571
+ta(I366
+I571
+I388
+I571
+ta(I388
+I571
+I408
+I569
+ta(I408
+I569
+I428
+I566
+ta(I428
+I566
+I448
+I562
+ta(I448
+I562
+I464
+I558
+ta(I464
+I558
+I478
+I544
+ta(I478
+I544
+I483
+I538
+ta(I483
+I538
+I485
+I524
+ta(I485
+I524
+I486
+I510
+ta(I486
+I510
+I486
+I494
+ta(I486
+I494
+I484
+I480
+ta(I484
+I480
+I480
+I464
+ta(I480
+I464
+I476
+I450
+ta(I476
+I450
+I471
+I445
+ta(I471
+I445
+I457
+I439
+ta(I457
+I439
+I443
+I435
+ta(I443
+I435
+I429
+I432
+ta(I429
+I432
+I413
+I429
+ta(I413
+I429
+I395
+I428
+ta(I395
+I428
+I377
+I428
+ta(I377
+I428
+I359
+I429
+ta(I359
+I429
+I345
+I432
+ta(I345
+I432
+I339
+I437
+ta(I339
+I437
+I336
+I442
+ta(I336
+I442
+I333
+I456
+ta(I333
+I456
+I331
+I462
+ta(I331
+I462
+I331
+I480
+ta(I331
+I480
+I331
+I496
+ta(I331
+I496
+I332
+I510
+ta(I332
+I510
+I334
+I524
+ta(I334
+I524
+I337
+I529
+ta(I337
+I529
+I343
+I533
+ta(I343
+I533
+I349
+I537
+ta(I349
+I537
+I355
+I542
+ta(I355
+I542
+I369
+I542
+ta(I369
+I542
+I389
+I543
+ta(I389
+I543
+I405
+I544
+ta(I405
+I544
+I423
+I543
+ta(I423
+I543
+I439
+I541
+ta(I439
+I541
+I457
+I538
+ta(I457
+I538
+I463
+I534
+ta(I463
+I534
+I477
+I531
+ta(I477
+I531
+I481
+I517
+ta(I481
+I517
+I484
+I514
+ta(I484
+I514
+I486
+I509
+ta(I486
+I509
+I486
+I495
+ta(I486
+I495
+I486
+I490
+ta(I486
+I490
+I485
+I484
+ta(I485
+I484
+I482
+I478
+ta(I482
+I478
+I479
+I473
+ta(I479
+I473
+I475
+I469
+ta(I475
+I469
+I471
+I465
+ta(I471
+I465
+I465
+I461
+ta(I465
+I461
+I451
+I457
+ta(I451
+I457
+I445
+I454
+ta(I445
+I454
+I431
+I452
+ta(I431
+I452
+I425
+I452
+ta(I425
+I452
+I411
+I452
+ta(I411
+I452
+I395
+I452
+ta(I395
+I452
+I389
+I455
+ta(I389
+I455
+I383
+I459
+ta(I383
+I459
+I380
+I464
+ta(I380
+I464
+I378
+I480
+ta(I378
+I480
+I377
+I496
+ta(I377
+I496
+I377
+I512
+ta(I377
+I512
+I378
+I528
+ta(I378
+I528
+I381
+I542
+ta(I381
+I542
+I384
+I558
+ta(I384
+I558
+I388
+I563
+ta(I388
+I563
+I394
+I568
+ta(I394
+I568
+I400
+I573
+ta(I400
+I573
+I416
+I576
+ta(I416
+I576
+I434
+I579
+ta(I434
+I579
+I452
+I580
+ta(I452
+I580
+I474
+I580
+ta(I474
+I580
+I494
+I579
+ta(I494
+I579
+I516
+I577
+ta(I516
+I577
+I538
+I574
+ta(I538
+I574
+I560
+I570
+ta(I560
+I570
+I578
+I565
+ta(I578
+I565
+I594
+I560
+ta(I594
+I560
+I598
+I554
+ta(I598
+I554
+I601
+I548
+ta(I601
+I548
+I602
+I542
+ta(I602
+I542
+I602
+I536
+ta(I602
+I536
+I600
+I530
+ta(I600
+I530
+I596
+I524
+ta(I596
+I524
+I590
+I519
+ta(I590
+I519
+I576
+I513
+ta(I576
+I513
+I562
+I508
+ta(I562
+I508
+I544
+I504
+ta(I544
+I504
+I530
+I501
+ta(I530
+I501
+I524
+I498
+ta(I524
+I498
+I510
+I495
+ta(I510
+I495
+I505
+I494
+ta(I505
+I494
+I501
+I494
+ta(I501
+I494
+I498
+I494
+ta(I498
+I494
+I495
+I495
+ta(I495
+I495
+I493
+I498
+ta(I493
+I498
+I492
+I502
+ta(I492
+I502
+I492
+I508
+ta(I492
+I508
+I492
+I513
+ta(I492
+I513
+I492
+I529
+ta(I492
+I529
+I494
+I534
+ta(I494
+I534
+I497
+I548
+ta(I497
+I548
+I500
+I554
+ta(I500
+I554
+I504
+I568
+ta(I504
+I568
+I508
+I571
+ta(I508
+I571
+I514
+I576
+ta(I514
+I576
+I520
+I579
+ta(I520
+I579
+I538
+I582
+ta(I538
+I582
+I552
+I584
+ta(I552
+I584
+I568
+I585
+ta(I568
+I585
+I588
+I585
+ta(I588
+I585
+I608
+I585
+ta(I608
+I585
+I624
+I583
+ta(I624
+I583
+I640
+I581
+ta(I640
+I581
+I654
+I577
+ta(I654
+I577
+I659
+I572
+ta(I659
+I572
+I661
+I568
+ta(I661
+I568
+I663
+I554
+ta(I663
+I554
+I664
+I548
+ta(I664
+I548
+I664
+I543
+ta(I664
+I543
+I661
+I529
+ta(I661
+I529
+I658
+I524
+ta(I658
+I524
+I654
+I518
+ta(I654
+I518
+I649
+I512
+ta(I649
+I512
+I644
+I507
+ta(I644
+I507
+I630
+I503
+ta(I630
+I503
+I624
+I498
+ta(I624
+I498
+I608
+I494
+ta(I608
+I494
+I594
+I490
+ta(I594
+I490
+I578
+I487
+ta(I578
+I487
+I562
+I485
+ta(I562
+I485
+I556
+I485
+ta(I556
+I485
+I552
+I485
+ta(I552
+I485
+I548
+I487
+ta(I548
+I487
+I546
+I489
+ta(I546
+I489
+I545
+I494
+ta(I545
+I494
+I544
+I498
+ta(I544
+I498
+I545
+I512
+ta(I545
+I512
+I547
+I517
+ta(I547
+I517
+I550
+I523
+ta(I550
+I523
+I554
+I537
+ta(I554
+I537
+I559
+I542
+ta(I559
+I542
+I565
+I548
+ta(I565
+I548
+I581
+I554
+ta(I581
+I554
+I586
+I558
+ta(I586
+I558
+I604
+I562
+ta(I604
+I562
+I624
+I565
+ta(I624
+I565
+I642
+I567
+ta(I642
+I567
+I658
+I568
+ta(I658
+I568
+I678
+I568
+ta(I678
+I568
+I694
+I567
+ta(I694
+I567
+I710
+I564
+ta(I710
+I564
+I715
+I561
+ta(I715
+I561
+I719
+I556
+ta(I719
+I556
+I721
+I551
+ta(I721
+I551
+I721
+I547
+ta(I721
+I547
+I721
+I533
+ta(I721
+I533
+I718
+I528
+ta(I718
+I528
+I713
+I514
+ta(I713
+I514
+I697
+I508
+ta(I697
+I508
+I683
+I502
+ta(I683
+I502
+I667
+I498
+ta(I667
+I498
+I653
+I495
+ta(I653
+I495
+I637
+I490
+ta(I637
+I490
+I631
+I487
+ta(I631
+I487
+I615
+I484
+ta(I615
+I484
+I610
+I482
+ta(I610
+I482
+I605
+I482
+ta(I605
+I482
+I601
+I482
+ta(I601
+I482
+I598
+I483
+ta(I598
+I483
+I596
+I486
+ta(I596
+I486
+I596
+I491
+ta(I596
+I491
+I596
+I496
+ta(I596
+I496
+I597
+I502
+ta(I597
+I502
+I600
+I508
+ta(I600
+I508
+I604
+I514
+ta(I604
+I514
+I610
+I528
+ta(I610
+I528
+I614
+I532
+ta(I614
+I532
+I620
+I536
+ta(I620
+I536
+I634
+I540
+ta(I634
+I540
+I640
+I542
+ta(I640
+I542
+I646
+I543
+ta(I646
+I543
+I651
+I543
+ta(I651
+I543
+I656
+I542
+ta(I656
+I542
+I661
+I540
+ta(I661
+I540
+I666
+I537
+ta(I666
+I537
+I672
+I533
+ta(I672
+I533
+I676
+I529
+ta(I676
+I529
+I680
+I515
+ta(I680
+I515
+I683
+I509
+ta(I683
+I509
+I684
+I504
+ta(I684
+I504
+I685
+I490
+ta(I685
+I490
+I685
+I476
+ta(I685
+I476
+I682
+I470
+ta(I682
+I470
+I679
+I464
+ta(I679
+I464
+I673
+I459
+ta(I673
+I459
+I668
+I454
+ta(I668
+I454
+I652
+I448
+ta(I652
+I448
+I638
+I442
+ta(I638
+I442
+I622
+I438
+ta(I622
+I438
+I608
+I433
+ta(I608
+I433
+I603
+I429
+ta(I603
+I429
+I597
+I425
+ta(I597
+I425
+I593
+I422
+ta(I593
+I422
+I588
+I419
+ta(I588
+I419
+I583
+I418
+ta(I583
+I418
+I578
+I417
+ta(I578
+I417
+I574
+I417
+ta(I574
+I417
+I571
+I418
+ta(I571
+I418
+I568
+I422
+ta(I568
+I422
+I566
+I428
+ta(I566
+I428
+I565
+I434
+ta(I565
+I434
+I565
+I450
+ta(I565
+I450
+I564
+I464
+ta(I564
+I464
+I564
+I480
+ta(I564
+I480
+I566
+I498
+ta(I566
+I498
+I568
+I512
+ta(I568
+I512
+I570
+I516
+ta(I570
+I516
+I573
+I520
+ta(I573
+I520
+I577
+I523
+ta(I577
+I523
+I583
+I526
+ta(I583
+I526
+I588
+I526
+ta(I588
+I526
+I602
+I527
+ta(I602
+I527
+I616
+I526
+ta(I616
+I526
+I632
+I523
+ta(I632
+I523
+I637
+I520
+ta(I637
+I520
+I653
+I515
+ta(I653
+I515
+I658
+I501
+ta(I658
+I501
+I661
+I495
+ta(I661
+I495
+I664
+I481
+ta(I664
+I481
+I665
+I467
+ta(I665
+I467
+I665
+I453
+ta(I665
+I453
+I665
+I439
+ta(I665
+I439
+I662
+I433
+ta(I662
+I433
+I659
+I427
+ta(I659
+I427
+I654
+I423
+ta(I654
+I423
+I649
+I419
+ta(I649
+I419
+I633
+I415
+ta(I633
+I415
+I627
+I412
+ta(I627
+I412
+I613
+I410
+ta(I613
+I410
+I607
+I408
+ta(I607
+I408
+I589
+I406
+ta(I589
+I406
+I573
+I405
+ta(I573
+I405
+I557
+I405
+ta(I557
+I405
+I541
+I405
+ta(I541
+I405
+I527
+I407
+ta(I527
+I407
+I521
+I410
+ta(I521
+I410
+I517
+I415
+ta(I517
+I415
+I513
+I421
+ta(I513
+I421
+I510
+I427
+ta(I510
+I427
+I508
+I447
+ta(I508
+I447
+I508
+I463
+ta(I508
+I463
+I508
+I479
+ta(I508
+I479
+I509
+I493
+ta(I509
+I493
+I511
+I507
+ta(I511
+I507
+I514
+I521
+ta(I514
+I521
+I518
+I526
+ta(I518
+I526
+I524
+I530
+ta(I524
+I530
+I530
+I533
+ta(I530
+I533
+I536
+I535
+ta(I536
+I535
+I552
+I536
+ta(I552
+I536
+I566
+I536
+ta(I566
+I536
+I572
+I532
+ta(I572
+I532
+I577
+I528
+ta(I577
+I528
+I582
+I523
+ta(I582
+I523
+I585
+I509
+ta(I585
+I509
+I588
+I503
+ta(I588
+I503
+I590
+I487
+ta(I590
+I487
+I591
+I473
+ta(I591
+I473
+I591
+I459
+ta(I591
+I459
+I591
+I445
+ta(I591
+I445
+I588
+I429
+ta(I588
+I429
+I584
+I415
+ta(I584
+I415
+I580
+I410
+ta(I580
+I410
+I566
+I405
+ta(I566
+I405
+I552
+I401
+ta(I552
+I401
+I546
+I398
+ta(I546
+I398
+I532
+I395
+ta(I532
+I395
+I518
+I393
+ta(I518
+I393
+I504
+I391
+ta(I504
+I391
+I490
+I389
+ta(I490
+I389
+I476
+I388
+ta(I476
+I388
+I470
+I387
+ta(I470
+I387
+I465
+I387
+ta(I465
+I387
+I461
+I387
+ta(I461
+I387
+I458
+I388
+ta(I458
+I388
+I456
+I392
+ta(I456
+I392
+I456
+I396
+ta(I456
+I396
+I456
+I401
+ta(I456
+I401
+I456
+I407
+ta(I456
+I407
+I458
+I413
+ta(I458
+I413
+I460
+I419
+ta(I460
+I419
+I464
+I425
+ta(I464
+I425
+I467
+I439
+ta(I467
+I439
+I471
+I443
+ta(I471
+I443
+I475
+I448
+ta(I475
+I448
+I479
+I452
+ta(I479
+I452
+I493
+I456
+ta(I493
+I456
+I498
+I458
+ta(I498
+I458
+I503
+I459
+ta(I503
+I459
+I509
+I459
+ta(I509
+I459
+I523
+I458
+ta(I523
+I458
+I539
+I455
+ta(I539
+I455
+I553
+I451
+ta(I553
+I451
+I558
+I446
+ta(I558
+I446
+I564
+I441
+ta(I564
+I441
+I570
+I423
+ta(I570
+I423
+I573
+I407
+ta(I573
+I407
+I576
+I391
+ta(I576
+I391
+I579
+I377
+ta(I579
+I377
+I581
+I359
+ta(I581
+I359
+I581
+I345
+ta(I581
+I345
+I581
+I331
+ta(I581
+I331
+I580
+I326
+ta(I580
+I326
+I579
+I321
+ta(I579
+I321
+I576
+I316
+ta(I576
+I316
+I573
+I311
+ta(I573
+I311
+I569
+I307
+ta(I569
+I307
+I565
+I304
+ta(I565
+I304
+I561
+I302
+ta(I561
+I302
+I557
+I301
+ta(I557
+I301
+I555
+I301
+ta(I555
+I301
+I553
+I301
+ta(I553
+I301
+I552
+I303
+ta(I552
+I303
+I551
+I306
+ta(I551
+I306
+I549
+I312
+ta(I549
+I312
+I547
+I315
+ta(I547
+I315
+I545
+I321
+ta(I545
+I321
+I544
+I325
+ta(I544
+I325
+I542
+I331
+ta(I542
+I331
+I541
+I337
+ta(I541
+I337
+I539
+I353
+ta(I539
+I353
+I539
+I369
+ta(I539
+I369
+I539
+I374
+ta(I539
+I374
+I541
+I392
+ta(I541
+I392
+I544
+I406
+ta(I544
+I406
+I547
+I410
+ta(I547
+I410
+I553
+I415
+ta(I553
+I415
+I567
+I419
+ta(I567
+I419
+I581
+I421
+ta(I581
+I421
+I595
+I422
+ta(I595
+I422
+I611
+I422
+ta(I611
+I422
+I625
+I422
+ta(I625
+I422
+I639
+I420
+ta(I639
+I420
+I645
+I416
+ta(I645
+I416
+I663
+I411
+ta(I663
+I411
+I668
+I397
+ta(I668
+I397
+I671
+I383
+ta(I671
+I383
+I674
+I377
+ta(I674
+I377
+I675
+I361
+ta(I675
+I361
+I675
+I347
+ta(I675
+I347
+I674
+I331
+ta(I674
+I331
+I671
+I317
+ta(I671
+I317
+I666
+I303
+ta(I666
+I303
+I661
+I298
+ta(I661
+I298
+I647
+I293
+ta(I647
+I293
+I641
+I289
+ta(I641
+I289
+I635
+I286
+ta(I635
+I286
+I621
+I283
+ta(I621
+I283
+I605
+I281
+ta(I605
+I281
+I587
+I280
+ta(I587
+I280
+I569
+I279
+ta(I569
+I279
+I551
+I279
+ta(I551
+I279
+I535
+I281
+ta(I535
+I281
+I521
+I283
+ta(I521
+I283
+I517
+I285
+ta(I517
+I285
+I513
+I288
+ta(I513
+I288
+I510
+I292
+ta(I510
+I292
+I508
+I297
+ta(I508
+I297
+I506
+I311
+ta(I506
+I311
+I506
+I317
+ta(I506
+I317
+I506
+I333
+ta(I506
+I333
+I506
+I347
+ta(I506
+I347
+I509
+I363
+ta(I509
+I363
+I512
+I377
+ta(I512
+I377
+I516
+I383
+ta(I516
+I383
+I520
+I388
+ta(I520
+I388
+I526
+I393
+ta(I526
+I393
+I532
+I396
+ta(I532
+I396
+I535
+I397
+ta(I535
+I397
+I549
+I398
+ta(I549
+I398
+I554
+I398
+ta(I554
+I398
+I559
+I396
+ta(I559
+I396
+I563
+I392
+ta(I563
+I392
+I567
+I386
+ta(I567
+I386
+I569
+I381
+ta(I569
+I381
+I571
+I375
+ta(I571
+I375
+I571
+I359
+ta(I571
+I359
+I571
+I343
+ta(I571
+I343
+I568
+I329
+ta(I568
+I329
+I564
+I313
+ta(I564
+I313
+I560
+I307
+ta(I560
+I307
+I546
+I301
+ta(I546
+I301
+I540
+I297
+ta(I540
+I297
+I524
+I293
+ta(I524
+I293
+I508
+I290
+ta(I508
+I290
+I490
+I288
+ta(I490
+I288
+I474
+I286
+ta(I474
+I286
+I458
+I285
+ta(I458
+I285
+I442
+I285
+ta(I442
+I285
+I428
+I285
+ta(I428
+I285
+I414
+I286
+ta(I414
+I286
+I398
+I287
+ta(I398
+I287
+I384
+I289
+ta(I384
+I289
+I370
+I292
+ta(I370
+I292
+I364
+I296
+ta(I364
+I296
+I359
+I302
+ta(I359
+I302
+I355
+I308
+ta(I355
+I308
+I350
+I326
+ta(I350
+I326
+I347
+I340
+ta(I347
+I340
+I344
+I358
+ta(I344
+I358
+I342
+I376
+ta(I342
+I376
+I342
+I394
+ta(I342
+I394
+I342
+I410
+ta(I342
+I410
+I344
+I415
+ta(I344
+I415
+I346
+I420
+ta(I346
+I420
+I350
+I423
+ta(I350
+I423
+I354
+I426
+ta(I354
+I426
+I359
+I427
+ta(I359
+I427
+I364
+I427
+ta(I364
+I427
+I368
+I427
+ta(I368
+I427
+I374
+I424
+ta(I374
+I424
+I377
+I421
+ta(I377
+I421
+I382
+I416
+ta(I382
+I416
+I384
+I412
+ta(I384
+I412
+I387
+I398
+ta(I387
+I398
+I388
+I394
+ta(I388
+I394
+I390
+I380
+ta(I390
+I380
+I390
+I375
+ta(I390
+I375
+I389
+I369
+ta(I389
+I369
+I387
+I364
+ta(I387
+I364
+I384
+I358
+ta(I384
+I358
+I379
+I353
+ta(I379
+I353
+I365
+I348
+ta(I365
+I348
+I360
+I345
+ta(I360
+I345
+I346
+I342
+ta(I346
+I342
+I340
+I340
+ta(I340
+I340
+I335
+I338
+ta(I335
+I338
+I321
+I337
+ta(I321
+I337
+I315
+I336
+ta(I315
+I336
+I309
+I336
+ta(I309
+I336
+I305
+I336
+ta(I305
+I336
+I300
+I337
+ta(I300
+I337
+I297
+I339
+ta(I297
+I339
+I294
+I341
+ta(I294
+I341
+I291
+I345
+ta(I291
+I345
+I289
+I359
+ta(I289
+I359
+I288
+I364
+ta(I288
+I364
+I287
+I380
+ta(I287
+I380
+I287
+I394
+ta(I287
+I394
+I287
+I410
+ta(I287
+I410
+I287
+I424
+ta(I287
+I424
+I289
+I442
+ta(I289
+I442
+I291
+I447
+ta(I291
+I447
+I293
+I453
+ta(I293
+I453
+I298
+I457
+ta(I298
+I457
+I301
+I461
+ta(I301
+I461
+I307
+I464
+ta(I307
+I464
+I312
+I465
+ta(I312
+I465
+I317
+I465
+ta(I317
+I465
+I323
+I464
+ta(I323
+I464
+I328
+I461
+ta(I328
+I461
+I333
+I457
+ta(I333
+I457
+I337
+I452
+ta(I337
+I452
+I341
+I447
+ta(I341
+I447
+I343
+I431
+ta(I343
+I431
+I345
+I417
+ta(I345
+I417
+I345
+I411
+ta(I345
+I411
+I344
+I405
+ta(I344
+I405
+I342
+I400
+ta(I342
+I400
+I339
+I395
+ta(I339
+I395
+I334
+I390
+ta(I334
+I390
+I329
+I385
+ta(I329
+I385
+I323
+I382
+ta(I323
+I382
+I317
+I379
+ta(I317
+I379
+I312
+I377
+ta(I312
+I377
+I308
+I375
+ta(I308
+I375
+I303
+I374
+ta(I303
+I374
+I300
+I373
+ta(I300
+I373
+I298
+I372
+ta(I298
+I372
+I298
+I371
+ta(I298
+I371
+I298
+I369
+ta(I298
+I369
+I297
+I368
+ta(I297
+I368
+I297
+I367
+ta(I297
+I367
+I297
+I366
+ta(I297
+I366
+I297
+I365
+ta(I297
+I365
+I296
+I364
+ta(I296
+I364
+I294
+I362
+ta(I294
+I362
+I291
+I360
+ta(I291
+I360
+I287
+I358
+ta(I287
+I358
+I281
+I355
+ta(I281
+I355
+I275
+I353
+ta(I275
+I353
+I261
+I351
+ta(I261
+I351
+I245
+I349
+ta(I245
+I349
+I231
+I348
+ta(I231
+I348
+I225
+I347
+ta(I225
+I347
+I211
+I347
+ta(I211
+I347
+I205
+I349
+ta(I205
+I349
+I191
+I352
+ta(I191
+I352
+I177
+I356
+ta(I177
+I356
+I172
+I362
+ta(I172
+I362
+I156
+I368
+ta(I156
+I368
+I151
+I374
+ta(I151
+I374
+I148
+I380
+ta(I148
+I380
+I145
+I386
+ta(I145
+I386
+I145
+I392
+ta(I145
+I392
+I145
+I406
+ta(I145
+I406
+I148
+I412
+ta(I148
+I412
+I152
+I418
+ta(I152
+I418
+I156
+I423
+ta(I156
+I423
+I170
+I426
+ta(I170
+I426
+I188
+I429
+ta(I188
+I429
+I204
+I431
+ta(I204
+I431
+I220
+I431
+ta(I220
+I431
+I236
+I430
+ta(I236
+I430
+I242
+I427
+ta(I242
+I427
+I258
+I422
+ta(I258
+I422
+I262
+I408
+ta(I262
+I408
+I266
+I392
+ta(I266
+I392
+I268
+I376
+ta(I268
+I376
+I269
+I358
+ta(I269
+I358
+I269
+I340
+ta(I269
+I340
+I268
+I320
+ta(I268
+I320
+I265
+I302
+ta(I265
+I302
+I262
+I296
+ta(I262
+I296
+I257
+I280
+ta(I257
+I280
+I252
+I275
+ta(I252
+I275
+I247
+I270
+ta(I247
+I270
+I233
+I266
+ta(I233
+I266
+I228
+I263
+ta(I228
+I263
+I214
+I260
+ta(I214
+I260
+I208
+I259
+ta(I208
+I259
+I194
+I258
+ta(I194
+I258
+I180
+I258
+ta(I180
+I258
+I164
+I258
+ta(I164
+I258
+I148
+I261
+ta(I148
+I261
+I132
+I263
+ta(I132
+I263
+I116
+I266
+ta(I116
+I266
+I112
+I270
+ta(I112
+I270
+I107
+I275
+ta(I107
+I275
+I104
+I281
+ta(I104
+I281
+I102
+I286
+ta(I102
+I286
+I102
+I300
+ta(I102
+I300
+I102
+I306
+ta(I102
+I306
+I102
+I320
+ta(I102
+I320
+I103
+I338
+ta(I103
+I338
+I104
+I343
+ta(I104
+I343
+I107
+I349
+ta(I107
+I349
+I109
+I354
+ta(I109
+I354
+I112
+I356
+ta(I112
+I356
+I116
+I359
+ta(I116
+I359
+I120
+I360
+ta(I120
+I360
+I126
+I360
+ta(I126
+I360
+I129
+I358
+ta(I129
+I358
+I133
+I355
+ta(I133
+I355
+I137
+I351
+ta(I137
+I351
+I141
+I337
+ta(I141
+I337
+I144
+I323
+ta(I144
+I323
+I147
+I307
+ta(I147
+I307
+I149
+I293
+ta(I149
+I293
+I149
+I279
+ta(I149
+I279
+I149
+I265
+ta(I149
+I265
+I149
+I249
+ta(I149
+I249
+I146
+I235
+ta(I146
+I235
+I143
+I230
+ta(I143
+I230
+I140
+I226
+ta(I140
+I226
+I136
+I222
+ta(I136
+I222
+I132
+I219
+ta(I132
+I219
+I127
+I216
+ta(I127
+I216
+I121
+I214
+ta(I121
+I214
+I115
+I212
+ta(I115
+I212
+I101
+I211
+ta(I101
+I211
+I95
+I211
+ta(I95
+I211
+I89
+I211
+ta(I89
+I211
+I83
+I212
+ta(I83
+I212
+I78
+I215
+ta(I78
+I215
+I64
+I218
+ta(I64
+I218
+I61
+I224
+ta(I61
+I224
+I57
+I229
+ta(I57
+I229
+I54
+I235
+ta(I54
+I235
+I52
+I241
+ta(I52
+I241
+I50
+I259
+ta(I50
+I259
+I50
+I273
+ta(I50
+I273
+I49
+I289
+ta(I49
+I289
+I49
+I294
+ta(I49
+I294
+I49
+I308
+ta(I49
+I308
+I51
+I313
+ta(I51
+I313
+I53
+I317
+ta(I53
+I317
+I57
+I319
+ta(I57
+I319
+I63
+I320
+ta(I63
+I320
+I68
+I320
+ta(I68
+I320
+I86
+I319
+ta(I86
+I319
+I100
+I315
+ta(I100
+I315
+I105
+I310
+ta(I105
+I310
+I110
+I294
+ta(I110
+I294
+I113
+I288
+ta(I113
+I288
+I116
+I272
+ta(I116
+I272
+I119
+I254
+ta(I119
+I254
+I119
+I240
+ta(I119
+I240
+I120
+I224
+ta(I120
+I224
+I119
+I210
+ta(I119
+I210
+I116
+I194
+ta(I116
+I194
+I113
+I190
+ta(I113
+I190
+I110
+I186
+ta(I110
+I186
+I106
+I181
+ta(I106
+I181
+I103
+I178
+ta(I103
+I178
+I99
+I175
+ta(I99
+I175
+I95
+I172
+ta(I95
+I172
+I92
+I170
+ta(I92
+I170
+I88
+I169
+ta(I88
+I169
+I85
+I168
+ta(I85
+I168
+I81
+I167
+ta(I81
+I167
+I78
+I167
+ta(I78
+I167
+I74
+I167
+ta(I74
+I167
+I71
+I168
+ta(I71
+I168
+I68
+I170
+ta(I68
+I170
+I66
+I173
+ta(I66
+I173
+I64
+I177
+ta(I64
+I177
+I64
+I181
+ta(I64
+I181
+I64
+I187
+ta(I64
+I187
+I64
+I193
+ta(I64
+I193
+I65
+I199
+ta(I65
+I199
+I67
+I205
+ta(I67
+I205
+I71
+I211
+ta(I71
+I211
+I75
+I217
+ta(I75
+I217
+I81
+I222
+ta(I81
+I222
+I86
+I225
+ta(I86
+I225
+I92
+I229
+ta(I92
+I229
+I98
+I232
+ta(I98
+I232
+I112
+I235
+ta(I112
+I235
+I118
+I236
+ta(I118
+I236
+I123
+I236
+ta(I123
+I236
+I126
+I235
+ta(I126
+I235
+I126
+I234
+ta(I126
+I234
+I140
+I232
+ta(I140
+I232
+I140
+I214
+ta(I140
+I214
+I141
+I200
+ta(I141
+I200
+I142
+I194
+ta(I142
+I194
+I144
+I180
+ta(I144
+I180
+I146
+I166
+ta(I146
+I166
+I148
+I150
+ta(I148
+I150
+I148
+I136
+ta(I148
+I136
+I148
+I120
+ta(I148
+I120
+I148
+I104
+ta(I148
+I104
+I147
+I88
+ta(I147
+I88
+I145
+I72
+ta(I145
+I72
+I143
+I58
+ta(I143
+I58
+I140
+I52
+ta(I140
+I52
+I136
+I46
+ta(I136
+I46
+I131
+I41
+ta(I131
+I41
+I125
+I37
+ta(I125
+I37
+I121
+I35
+ta(I121
+I35
+I116
+I34
+ta(I116
+I34
+I112
+I33
+ta(I112
+I33
+I108
+I34
+ta(I108
+I34
+I105
+I36
+ta(I105
+I36
+I101
+I40
+ta(I101
+I40
+I98
+I45
+ta(I98
+I45
+I97
+I59
+ta(I97
+I59
+I95
+I65
+ta(I95
+I65
+I94
+I79
+ta(I94
+I79
+I93
+I93
+ta(I93
+I93
+I93
+I99
+ta(I93
+I99
+I93
+I113
+ta(I93
+I113
+I94
+I118
+ta(I94
+I118
+I96
+I122
+ta(I96
+I122
+I99
+I125
+ta(I99
+I125
+I102
+I129
+ta(I102
+I129
+I106
+I130
+ta(I106
+I130
+I110
+I131
+ta(I110
+I131
+I115
+I131
+ta(I115
+I131
+I119
+I131
+ta(I119
+I131
+I125
+I130
+ta(I125
+I130
+I129
+I127
+ta(I129
+I127
+I133
+I124
+ta(I133
+I124
+I136
+I120
+ta(I136
+I120
+I139
+I115
+ta(I139
+I115
+I141
+I110
+ta(I141
+I110
+I141
+I104
+ta(I141
+I104
+I141
+I90
+ta(I141
+I90
+I139
+I85
+ta(I139
+I85
+I136
+I79
+ta(I136
+I79
+I133
+I74
+ta(I133
+I74
+I128
+I69
+ta(I128
+I69
+I112
+I66
+ta(I112
+I66
+I98
+I63
+ta(I98
+I63
+I82
+I60
+ta(I82
+I60
+I66
+I59
+ta(I66
+I59
+I52
+I59
+ta(I52
+I59
+I46
+I59
+ta(I46
+I59
+I41
+I62
+ta(I41
+I62
+I35
+I65
+ta(I35
+I65
+I31
+I70
+ta(I31
+I70
+I26
+I75
+ta(I26
+I75
+I23
+I81
+ta(I23
+I81
+I20
+I97
+ta(I20
+I97
+I19
+I113
+ta(I19
+I113
+I19
+I127
+ta(I19
+I127
+I20
+I141
+ta(I20
+I141
+I23
+I146
+ta(I23
+I146
+I27
+I151
+ta(I27
+I151
+I33
+I156
+ta(I33
+I156
+I39
+I159
+ta(I39
+I159
+I44
+I161
+ta(I44
+I161
+I50
+I162
+ta(I50
+I162
+I56
+I162
+ta(I56
+I162
+I70
+I161
+ta(I70
+I161
+I74
+I159
+ta(I74
+I159
+I79
+I155
+ta(I79
+I155
+I82
+I150
+ta(I82
+I150
+I85
+I145
+ta(I85
+I145
+I86
+I131
+ta(I86
+I131
+I86
+I125
+ta(I86
+I125
+I86
+I109
+ta(I86
+I109
+I86
+I103
+ta(I86
+I103
+I83
+I89
+ta(I83
+I89
+I81
+I75
+ta(I81
+I75
+I77
+I69
+ta(I77
+I69
+I73
+I64
+ta(I73
+I64
+I69
+I50
+ta(I69
+I50
+I64
+I47
+ta(I64
+I47
+I60
+I43
+ta(I60
+I43
+I54
+I40
+ta(I54
+I40
+I49
+I38
+ta(I49
+I38
+I45
+I37
+ta(I45
+I37
+I41
+I37
+ta(I41
+I37
+I38
+I39
+ta(I38
+I39
+I35
+I42
+ta(I35
+I42
+I32
+I47
+ta(I32
+I47
+I30
+I53
+ta(I30
+I53
+I28
+I67
+ta(I28
+I67
+I27
+I81
+ta(I27
+I81
+I26
+I99
+ta(I26
+I99
+I26
+I113
+ta(I26
+I113
+I26
+I127
+ta(I26
+I127
+I27
+I133
+ta(I27
+I133
+I29
+I139
+ta(I29
+I139
+I32
+I145
+ta(I32
+I145
+I37
+I148
+ta(I37
+I148
+I42
+I151
+ta(I42
+I151
+I47
+I153
+ta(I47
+I153
+I53
+I153
+ta(I53
+I153
+I69
+I153
+ta(I69
+I153
+I75
+I150
+ta(I75
+I150
+I93
+I145
+ta(I93
+I145
+I98
+I140
+ta(I98
+I140
+I104
+I126
+ta(I104
+I126
+I109
+I112
+ta(I109
+I112
+I112
+I96
+ta(I112
+I96
+I115
+I80
+ta(I115
+I80
+I116
+I64
+ta(I116
+I64
+I116
+I48
+ta(I116
+I48
+I116
+I34
+ta(I116
+I34
+I114
+I28
+ta(I114
+I28
+I110
+I12
+ta(I110
+I12
+I105
+I8
+ta(I105
+I8
+I100
+I3
+ta(I100
+I3
+I94
+I0
+ta(I94
+I0
+I89
+I-2
+ta(I89
+I-2
+I85
+I-3
+ta(I85
+I-3
+I82
+I-3
+ta(I82
+I-3
+I80
+I0
+ta(I80
+I0
+I78
+I4
+ta(I78
+I4
+I78
+I10
+ta(I78
+I10
+I78
+I16
+ta(I78
+I16
+I80
+I36
+ta(I80
+I36
+I83
+I50
+ta(I83
+I50
+I87
+I66
+ta(I87
+I66
+I101
+I82
+ta(I101
+I82
+I117
+I96
+ta(I117
+I96
+I131
+I101
+ta(I131
+I101
+I153
+I105
+ta(I153
+I105
+I173
+I108
+ta(I173
+I108
+I193
+I110
+ta(I193
+I110
+I217
+I112
+ta(I217
+I112
+I237
+I112
+ta(I237
+I112
+I257
+I111
+ta(I257
+I111
+I277
+I108
+ta(I277
+I108
+I295
+I104
+ta(I295
+I104
+I309
+I99
+ta(I309
+I99
+I314
+I94
+ta(I314
+I94
+I317
+I88
+ta(I317
+I88
+I319
+I74
+ta(I319
+I74
+I320
+I68
+ta(I320
+I68
+I319
+I64
+ta(I319
+I64
+I316
+I59
+ta(I316
+I59
+I312
+I55
+ta(I312
+I55
+I296
+I50
+ta(I296
+I50
+I282
+I47
+ta(I282
+I47
+I268
+I44
+ta(I268
+I44
+I264
+I43
+ta(I264
+I43
+I259
+I42
+ta(I259
+I42
+I255
+I42
+ta(I255
+I42
+I253
+I42
+ta(I253
+I42
+I251
+I45
+ta(I251
+I45
+I250
+I48
+ta(I250
+I48
+I248
+I53
+ta(I248
+I53
+I246
+I59
+ta(I246
+I59
+I245
+I65
+ta(I245
+I65
+I245
+I79
+ta(I245
+I79
+I245
+I97
+ta(I245
+I97
+I245
+I102
+ta(I245
+I102
+I247
+I116
+ta(I247
+I116
+I249
+I130
+ta(I249
+I130
+I251
+I135
+ta(I251
+I135
+I254
+I141
+ta(I254
+I141
+I257
+I145
+ta(I257
+I145
+I261
+I148
+ta(I261
+I148
+I264
+I150
+ta(I264
+I150
+I268
+I152
+ta(I268
+I152
+I272
+I152
+ta(I272
+I152
+I275
+I151
+ta(I275
+I151
+I279
+I149
+ta(I279
+I149
+I284
+I144
+ta(I284
+I144
+I286
+I140
+ta(I286
+I140
+I289
+I126
+ta(I289
+I126
+I291
+I112
+ta(I291
+I112
+I292
+I106
+ta(I292
+I106
+I292
+I92
+ta(I292
+I92
+I291
+I78
+ta(I291
+I78
+I287
+I64
+ta(I287
+I64
+I283
+I58
+ta(I283
+I58
+I278
+I53
+ta(I278
+I53
+I273
+I48
+ta(I273
+I48
+I257
+I44
+ta(I257
+I44
+I251
+I41
+ta(I251
+I41
+I237
+I38
+ta(I237
+I38
+I223
+I36
+ta(I223
+I36
+I217
+I35
+ta(I217
+I35
+I212
+I35
+ta(I212
+I35
+I208
+I35
+ta(I208
+I35
+I204
+I37
+ta(I204
+I37
+I201
+I41
+ta(I201
+I41
+I199
+I45
+ta(I199
+I45
+I197
+I51
+ta(I197
+I51
+I196
+I57
+ta(I196
+I57
+I196
+I75
+ta(I196
+I75
+I196
+I91
+ta(I196
+I91
+I197
+I105
+ta(I197
+I105
+I201
+I123
+ta(I201
+I123
+I205
+I137
+ta(I205
+I137
+I211
+I153
+ta(I211
+I153
+I216
+I157
+ta(I216
+I157
+I222
+I162
+ta(I222
+I162
+I228
+I165
+ta(I228
+I165
+I234
+I166
+ta(I234
+I166
+I240
+I166
+ta(I240
+I166
+I245
+I165
+ta(I245
+I165
+I251
+I162
+ta(I251
+I162
+I256
+I157
+ta(I256
+I157
+I261
+I143
+ta(I261
+I143
+I263
+I137
+ta(I263
+I137
+I266
+I123
+ta(I266
+I123
+I268
+I107
+ta(I268
+I107
+I268
+I91
+ta(I268
+I91
+I267
+I75
+ta(I267
+I75
+I264
+I59
+ta(I264
+I59
+I261
+I53
+ta(I261
+I53
+I257
+I47
+ta(I257
+I47
+I251
+I41
+ta(I251
+I41
+I246
+I36
+ta(I246
+I36
+I232
+I32
+ta(I232
+I32
+I226
+I28
+ta(I226
+I28
+I220
+I25
+ta(I220
+I25
+I217
+I22
+ta(I217
+I22
+I213
+I20
+ta(I213
+I20
+I210
+I20
+ta(I210
+I20
+I208
+I20
+ta(I208
+I20
+I206
+I22
+ta(I206
+I22
+I204
+I26
+ta(I204
+I26
+I204
+I32
+ta(I204
+I32
+I204
+I48
+ta(I204
+I48
+I204
+I64
+ta(I204
+I64
+I207
+I82
+ta(I207
+I82
+I210
+I100
+ta(I210
+I100
+I214
+I118
+ta(I214
+I118
+I220
+I134
+ta(I220
+I134
+I224
+I140
+ta(I224
+I140
+I230
+I145
+ta(I230
+I145
+I250
+I159
+ta(I250
+I159
+I264
+I161
+ta(I264
+I161
+I282
+I165
+ta(I282
+I165
+I302
+I167
+ta(I302
+I167
+I324
+I168
+ta(I324
+I168
+I346
+I169
+ta(I346
+I169
+I368
+I169
+ta(I368
+I169
+I386
+I166
+ta(I386
+I166
+I404
+I163
+ta(I404
+I163
+I422
+I158
+ta(I422
+I158
+I436
+I153
+ta(I436
+I153
+I441
+I147
+ta(I441
+I147
+I445
+I131
+ta(I445
+I131
+I447
+I117
+ta(I447
+I117
+I447
+I101
+ta(I447
+I101
+I446
+I87
+ta(I446
+I87
+I443
+I73
+ta(I443
+I73
+I438
+I68
+ta(I438
+I68
+I424
+I62
+ta(I424
+I62
+I410
+I57
+ta(I410
+I57
+I396
+I52
+ta(I396
+I52
+I390
+I49
+ta(I390
+I49
+I384
+I47
+ta(I384
+I47
+I368
+I46
+ta(I368
+I46
+I362
+I46
+ta(I362
+I46
+I356
+I48
+ta(I356
+I48
+I352
+I50
+ta(I352
+I50
+I348
+I55
+ta(I348
+I55
+I344
+I61
+ta(I344
+I61
+I341
+I67
+ta(I341
+I67
+I339
+I83
+ta(I339
+I83
+I339
+I99
+ta(I339
+I99
+I339
+I105
+ta(I339
+I105
+I340
+I121
+ta(I340
+I121
+I342
+I135
+ta(I342
+I135
+I347
+I141
+ta(I347
+I141
+I352
+I147
+ta(I352
+I147
+I357
+I152
+ta(I357
+I152
+I363
+I155
+ta(I363
+I155
+I379
+I158
+ta(I379
+I158
+I393
+I160
+ta(I393
+I160
+I409
+I161
+ta(I409
+I161
+I425
+I161
+ta(I425
+I161
+I441
+I160
+ta(I441
+I160
+I455
+I156
+ta(I455
+I156
+I461
+I151
+ta(I461
+I151
+I466
+I146
+ta(I466
+I146
+I470
+I130
+ta(I470
+I130
+I474
+I124
+ta(I474
+I124
+I477
+I108
+ta(I477
+I108
+I478
+I102
+ta(I478
+I102
+I479
+I86
+ta(I479
+I86
+I479
+I72
+ta(I479
+I72
+I478
+I66
+ta(I478
+I66
+I475
+I61
+ta(I475
+I61
+I471
+I56
+ta(I471
+I56
+I457
+I51
+ta(I457
+I51
+I443
+I48
+ta(I443
+I48
+I427
+I44
+ta(I427
+I44
+I413
+I43
+ta(I413
+I43
+I407
+I42
+ta(I407
+I42
+I402
+I42
+ta(I402
+I42
+I397
+I43
+ta(I397
+I43
+I393
+I46
+ta(I393
+I46
+I390
+I51
+ta(I390
+I51
+I387
+I57
+ta(I387
+I57
+I385
+I62
+ta(I385
+I62
+I383
+I76
+ta(I383
+I76
+I381
+I92
+ta(I381
+I92
+I380
+I106
+ta(I380
+I106
+I379
+I122
+ta(I379
+I122
+I379
+I138
+ta(I379
+I138
+I380
+I144
+ta(I380
+I144
+I382
+I150
+ta(I382
+I150
+I386
+I156
+ta(I386
+I156
+I390
+I160
+ta(I390
+I160
+I396
+I163
+ta(I396
+I163
+I412
+I166
+ta(I412
+I166
+I426
+I166
+ta(I426
+I166
+I444
+I166
+ta(I444
+I166
+I462
+I165
+ta(I462
+I165
+I480
+I162
+ta(I480
+I162
+I496
+I159
+ta(I496
+I159
+I510
+I155
+ta(I510
+I155
+I516
+I149
+ta(I516
+I149
+I521
+I135
+ta(I521
+I135
+I523
+I129
+ta(I523
+I129
+I524
+I123
+ta(I524
+I123
+I524
+I109
+ta(I524
+I109
+I523
+I95
+ta(I523
+I95
+I520
+I79
+ta(I520
+I79
+I517
+I73
+ta(I517
+I73
+I513
+I67
+ta(I513
+I67
+I497
+I63
+ta(I497
+I63
+I483
+I58
+ta(I483
+I58
+I469
+I55
+ta(I469
+I55
+I453
+I52
+ta(I453
+I52
+I433
+I50
+ta(I433
+I50
+I415
+I49
+ta(I415
+I49
+I397
+I49
+ta(I397
+I49
+I381
+I49
+ta(I381
+I49
+I375
+I51
+ta(I375
+I51
+I371
+I55
+ta(I371
+I55
+I368
+I59
+ta(I368
+I59
+I368
+I65
+ta(I368
+I65
+I368
+I79
+ta(I368
+I79
+I368
+I85
+ta(I368
+I85
+I370
+I99
+ta(I370
+I99
+I374
+I117
+ta(I374
+I117
+I378
+I123
+ta(I378
+I123
+I383
+I137
+ta(I383
+I137
+I389
+I141
+ta(I389
+I141
+I395
+I146
+ta(I395
+I146
+I411
+I150
+ta(I411
+I150
+I431
+I153
+ta(I431
+I153
+I449
+I155
+ta(I449
+I155
+I467
+I156
+ta(I467
+I156
+I487
+I157
+ta(I487
+I157
+I507
+I157
+ta(I507
+I157
+I527
+I156
+ta(I527
+I156
+I541
+I154
+ta(I541
+I154
+I557
+I150
+ta(I557
+I150
+I561
+I145
+ta(I561
+I145
+I565
+I131
+ta(I565
+I131
+I569
+I125
+ta(I569
+I125
+I571
+I111
+ta(I571
+I111
+I573
+I105
+ta(I573
+I105
+I573
+I89
+ta(I573
+I89
+I572
+I83
+ta(I572
+I83
+I569
+I77
+ta(I569
+I77
+I564
+I72
+ta(I564
+I72
+I550
+I67
+ta(I550
+I67
+I536
+I62
+ta(I536
+I62
+I518
+I59
+ta(I518
+I59
+I502
+I57
+ta(I502
+I57
+I482
+I56
+ta(I482
+I56
+I462
+I55
+ta(I462
+I55
+I444
+I55
+ta(I444
+I55
+I428
+I57
+ta(I428
+I57
+I414
+I59
+ta(I414
+I59
+I409
+I63
+ta(I409
+I63
+I405
+I67
+ta(I405
+I67
+I402
+I73
+ta(I402
+I73
+I401
+I79
+ta(I401
+I79
+I401
+I85
+ta(I401
+I85
+I402
+I90
+ta(I402
+I90
+I404
+I96
+ta(I404
+I96
+I409
+I102
+ta(I409
+I102
+I414
+I107
+ta(I414
+I107
+I428
+I113
+ta(I428
+I113
+I444
+I116
+ta(I444
+I116
+I460
+I120
+ta(I460
+I120
+I476
+I122
+ta(I476
+I122
+I498
+I124
+ta(I498
+I124
+I518
+I124
+ta(I518
+I124
+I536
+I124
+ta(I536
+I124
+I554
+I122
+ta(I554
+I122
+I574
+I118
+ta(I574
+I118
+I590
+I114
+ta(I590
+I114
+I595
+I110
+ta(I595
+I110
+I601
+I104
+ta(I601
+I104
+I604
+I90
+ta(I604
+I90
+I606
+I84
+ta(I606
+I84
+I608
+I78
+ta(I608
+I78
+I608
+I72
+ta(I608
+I72
+I608
+I58
+ta(I608
+I58
+I605
+I52
+ta(I605
+I52
+I601
+I48
+ta(I601
+I48
+I596
+I43
+ta(I596
+I43
+I582
+I39
+ta(I582
+I39
+I568
+I36
+ta(I568
+I36
+I552
+I34
+ta(I552
+I34
+I534
+I32
+ta(I534
+I32
+I518
+I32
+ta(I518
+I32
+I500
+I31
+ta(I500
+I31
+I480
+I31
+ta(I480
+I31
+I462
+I31
+ta(I462
+I31
+I444
+I32
+ta(I444
+I32
+I430
+I35
+ta(I430
+I35
+I426
+I37
+ta(I426
+I37
+I423
+I40
+ta(I423
+I40
+I421
+I44
+ta(I421
+I44
+I420
+I58
+ta(I420
+I58
+I420
+I63
+ta(I420
+I63
+I421
+I69
+ta(I421
+I69
+I424
+I75
+ta(I424
+I75
+I428
+I93
+ta(I428
+I93
+I431
+I98
+ta(I431
+I98
+I437
+I104
+ta(I437
+I104
+I443
+I120
+ta(I443
+I120
+I449
+I124
+ta(I449
+I124
+I465
+I130
+ta(I465
+I130
+I481
+I133
+ta(I481
+I133
+I497
+I137
+ta(I497
+I137
+I515
+I139
+ta(I515
+I139
+I533
+I140
+ta(I533
+I140
+I555
+I140
+ta(I555
+I140
+I575
+I139
+ta(I575
+I139
+I593
+I137
+ta(I593
+I137
+I611
+I133
+ta(I611
+I133
+I627
+I129
+ta(I627
+I129
+I633
+I124
+ta(I633
+I124
+I638
+I110
+ta(I638
+I110
+I641
+I105
+ta(I641
+I105
+I644
+I89
+ta(I644
+I89
+I646
+I75
+ta(I646
+I75
+I646
+I69
+ta(I646
+I69
+I646
+I64
+ta(I646
+I64
+I643
+I50
+ta(I643
+I50
+I639
+I45
+ta(I639
+I45
+I625
+I41
+ta(I625
+I41
+I611
+I37
+ta(I611
+I37
+I593
+I33
+ta(I593
+I33
+I575
+I31
+ta(I575
+I31
+I557
+I30
+ta(I557
+I30
+I539
+I30
+ta(I539
+I30
+I525
+I30
+ta(I525
+I30
+I519
+I32
+ta(I519
+I32
+I514
+I36
+ta(I514
+I36
+I510
+I40
+ta(I510
+I40
+I507
+I54
+ta(I507
+I54
+I506
+I68
+ta(I506
+I68
+I507
+I73
+ta(I507
+I73
+I509
+I79
+ta(I509
+I79
+I513
+I93
+ta(I513
+I93
+I518
+I98
+ta(I518
+I98
+I523
+I103
+ta(I523
+I103
+I539
+I108
+ta(I539
+I108
+I555
+I111
+ta(I555
+I111
+I569
+I116
+ta(I569
+I116
+I589
+I120
+ta(I589
+I120
+I607
+I123
+ta(I607
+I123
+I625
+I126
+ta(I625
+I126
+I643
+I127
+ta(I643
+I127
+I663
+I128
+ta(I663
+I128
+I683
+I128
+ta(I683
+I128
+I701
+I126
+ta(I701
+I126
+I717
+I123
+ta(I717
+I123
+I723
+I119
+ta(I723
+I119
+I728
+I115
+ta(I728
+I115
+I730
+I111
+ta(I730
+I111
+I732
+I106
+ta(I732
+I106
+I732
+I92
+ta(I732
+I92
+I732
+I88
+ta(I732
+I88
+I728
+I74
+ta(I728
+I74
+I725
+I69
+ta(I725
+I69
+I719
+I64
+ta(I719
+I64
+I705
+I60
+ta(I705
+I60
+I689
+I55
+ta(I689
+I55
+I675
+I52
+ta(I675
+I52
+I659
+I50
+ta(I659
+I50
+I643
+I49
+ta(I643
+I49
+I629
+I49
+ta(I629
+I49
+I613
+I49
+ta(I613
+I49
+I595
+I52
+ta(I595
+I52
+I579
+I56
+ta(I579
+I56
+I573
+I62
+ta(I573
+I62
+I568
+I67
+ta(I568
+I67
+I564
+I83
+ta(I564
+I83
+I562
+I97
+ta(I562
+I97
+I560
+I113
+ta(I560
+I113
+I560
+I127
+ta(I560
+I127
+I560
+I141
+ta(I560
+I141
+I562
+I155
+ta(I562
+I155
+I565
+I169
+ta(I565
+I169
+I568
+I185
+ta(I568
+I185
+I573
+I199
+ta(I573
+I199
+I578
+I213
+ta(I578
+I213
+I584
+I218
+ta(I584
+I218
+I598
+I222
+ta(I598
+I222
+I614
+I225
+ta(I614
+I225
+I632
+I229
+ta(I632
+I229
+I648
+I231
+ta(I648
+I231
+I662
+I231
+ta(I662
+I231
+I676
+I230
+ta(I676
+I230
+I681
+I228
+ta(I681
+I228
+I684
+I225
+ta(I684
+I225
+I688
+I220
+ta(I688
+I220
+I689
+I215
+ta(I689
+I215
+I690
+I199
+ta(I690
+I199
+I690
+I185
+ta(I690
+I185
+I688
+I171
+ta(I688
+I171
+I685
+I155
+ta(I685
+I155
+I679
+I141
+ta(I679
+I141
+I674
+I135
+ta(I674
+I135
+I658
+I129
+ta(I658
+I129
+I644
+I125
+ta(I644
+I125
+I630
+I121
+ta(I630
+I121
+I616
+I119
+ta(I616
+I119
+I600
+I117
+ta(I600
+I117
+I584
+I116
+ta(I584
+I116
+I578
+I116
+ta(I578
+I116
+I564
+I119
+ta(I564
+I119
+I550
+I123
+ta(I550
+I123
+I545
+I128
+ta(I545
+I128
+I541
+I133
+ta(I541
+I133
+I537
+I147
+ta(I537
+I147
+I533
+I163
+ta(I533
+I163
+I531
+I179
+ta(I531
+I179
+I530
+I197
+ta(I530
+I197
+I530
+I213
+ta(I530
+I213
+I532
+I227
+ta(I532
+I227
+I536
+I241
+ta(I536
+I241
+I542
+I255
+ta(I542
+I255
+I547
+I259
+ta(I547
+I259
+I553
+I262
+ta(I553
+I262
+I567
+I264
+ta(I567
+I264
+I573
+I265
+ta(I573
+I265
+I589
+I266
+ta(I589
+I266
+I593
+I266
+ta(I593
+I266
+I607
+I264
+ta(I607
+I264
+I612
+I260
+ta(I612
+I260
+I615
+I256
+ta(I615
+I256
+I619
+I242
+ta(I619
+I242
+I622
+I237
+ta(I622
+I237
+I623
+I231
+ta(I623
+I231
+I622
+I215
+ta(I622
+I215
+I620
+I201
+ta(I620
+I201
+I615
+I185
+ta(I615
+I185
+I599
+I169
+ta(I599
+I169
+I585
+I163
+ta(I585
+I163
+I569
+I157
+ta(I569
+I157
+I547
+I152
+ta(I547
+I152
+I531
+I149
+ta(I531
+I149
+I513
+I146
+ta(I513
+I146
+I499
+I146
+ta(I499
+I146
+I485
+I146
+ta(I485
+I146
+I471
+I149
+ta(I471
+I149
+I465
+I152
+ta(I465
+I152
+I451
+I158
+ta(I451
+I158
+I445
+I163
+ta(I445
+I163
+I442
+I168
+ta(I442
+I168
+I437
+I182
+ta(I437
+I182
+I434
+I188
+ta(I434
+I188
+I432
+I202
+ta(I432
+I202
+I431
+I220
+ta(I431
+I220
+I431
+I234
+ta(I431
+I234
+I432
+I239
+ta(I432
+I239
+I435
+I245
+ta(I435
+I245
+I439
+I251
+ta(I439
+I251
+I443
+I254
+ta(I443
+I254
+I449
+I258
+ta(I449
+I258
+I463
+I261
+ta(I463
+I261
+I469
+I262
+ta(I469
+I262
+I475
+I262
+ta(I475
+I262
+I493
+I261
+ta(I493
+I261
+I511
+I259
+ta(I511
+I259
+I525
+I255
+ta(I525
+I255
+I539
+I250
+ta(I539
+I250
+I542
+I244
+ta(I542
+I244
+I545
+I238
+ta(I545
+I238
+I546
+I224
+ta(I546
+I224
+I545
+I208
+ta(I545
+I208
+I542
+I190
+ta(I542
+I190
+I538
+I174
+ta(I538
+I174
+I522
+I158
+ta(I522
+I158
+I504
+I144
+ta(I504
+I144
+I486
+I130
+ta(I486
+I130
+I466
+I126
+ta(I466
+I126
+I448
+I122
+ta(I448
+I122
+I430
+I119
+ta(I430
+I119
+I410
+I117
+ta(I410
+I117
+I394
+I116
+ta(I394
+I116
+I376
+I116
+ta(I376
+I116
+I358
+I117
+ta(I358
+I117
+I340
+I120
+ta(I340
+I120
+I326
+I123
+ta(I326
+I123
+I321
+I129
+ta(I321
+I129
+I316
+I135
+ta(I316
+I135
+I313
+I141
+ta(I313
+I141
+I312
+I157
+ta(I312
+I157
+I312
+I171
+ta(I312
+I171
+I312
+I185
+ta(I312
+I185
+I313
+I199
+ta(I313
+I199
+I315
+I213
+ta(I315
+I213
+I318
+I219
+ta(I318
+I219
+I323
+I225
+ta(I323
+I225
+I326
+I230
+ta(I326
+I230
+I332
+I233
+ta(I332
+I233
+I338
+I237
+ta(I338
+I237
+I343
+I239
+ta(I343
+I239
+I361
+I240
+ta(I361
+I240
+I375
+I241
+ta(I375
+I241
+I389
+I240
+ta(I389
+I240
+I395
+I237
+ta(I395
+I237
+I409
+I233
+ta(I409
+I233
+I412
+I230
+ta(I412
+I230
+I415
+I225
+ta(I415
+I225
+I416
+I220
+ta(I416
+I220
+I416
+I215
+ta(I416
+I215
+I415
+I210
+ta(I415
+I210
+I411
+I196
+ta(I411
+I196
+I405
+I192
+ta(I405
+I192
+I387
+I188
+ta(I387
+I188
+I371
+I184
+ta(I371
+I184
+I351
+I180
+ta(I351
+I180
+I333
+I178
+ta(I333
+I178
+I315
+I176
+ta(I315
+I176
+I299
+I175
+ta(I299
+I175
+I283
+I175
+ta(I283
+I175
+I269
+I176
+ta(I269
+I176
+I253
+I178
+ta(I253
+I178
+I239
+I181
+ta(I239
+I181
+I235
+I185
+ta(I235
+I185
+I231
+I199
+ta(I231
+I199
+I228
+I204
+ta(I228
+I204
+I226
+I210
+ta(I226
+I210
+I225
+I226
+ta(I225
+I226
+I226
+I231
+ta(I226
+I231
+I228
+I249
+ta(I228
+I249
+I232
+I255
+ta(I232
+I255
+I236
+I269
+ta(I236
+I269
+I241
+I274
+ta(I241
+I274
+I247
+I280
+ta(I247
+I280
+I261
+I283
+ta(I261
+I283
+I275
+I286
+ta(I275
+I286
+I291
+I288
+ta(I291
+I288
+I309
+I289
+ta(I309
+I289
+I325
+I289
+ta(I325
+I289
+I339
+I288
+ta(I339
+I288
+I357
+I285
+ta(I357
+I285
+I373
+I280
+ta(I373
+I280
+I377
+I276
+ta(I377
+I276
+I382
+I271
+ta(I382
+I271
+I384
+I257
+ta(I384
+I257
+I385
+I252
+ta(I385
+I252
+I384
+I248
+ta(I384
+I248
+I382
+I242
+ta(I382
+I242
+I378
+I237
+ta(I378
+I237
+I372
+I234
+ta(I372
+I234
+I356
+I230
+ta(I356
+I230
+I340
+I228
+ta(I340
+I228
+I322
+I226
+ta(I322
+I226
+I304
+I226
+ta(I304
+I226
+I288
+I226
+ta(I288
+I226
+I282
+I227
+ta(I282
+I227
+I276
+I230
+ta(I276
+I230
+I273
+I233
+ta(I273
+I233
+I270
+I237
+ta(I270
+I237
+I269
+I243
+ta(I269
+I243
+I269
+I249
+ta(I269
+I249
+I270
+I254
+ta(I270
+I254
+I274
+I259
+ta(I274
+I259
+I279
+I263
+ta(I279
+I263
+I285
+I266
+ta(I285
+I266
+I301
+I270
+ta(I301
+I270
+I317
+I272
+ta(I317
+I272
+I339
+I275
+ta(I339
+I275
+I361
+I277
+ta(I361
+I277
+I383
+I277
+ta(I383
+I277
+I409
+I277
+ta(I409
+I277
+I433
+I276
+ta(I433
+I276
+I457
+I273
+ta(I457
+I273
+I481
+I268
+ta(I481
+I268
+I501
+I263
+ta(I501
+I263
+I517
+I249
+ta(I517
+I249
+I531
+I235
+ta(I531
+I235
+I533
+I221
+ta(I533
+I221
+I535
+I207
+ta(I535
+I207
+I535
+I191
+ta(I535
+I191
+I533
+I177
+ta(I533
+I177
+I528
+I171
+ta(I528
+I171
+I523
+I167
+ta(I523
+I167
+I507
+I162
+ta(I507
+I162
+I493
+I159
+ta(I493
+I159
+I487
+I157
+ta(I487
+I157
+I481
+I156
+ta(I481
+I156
+I476
+I156
+ta(I476
+I156
+I472
+I157
+ta(I472
+I157
+I469
+I159
+ta(I469
+I159
+I466
+I162
+ta(I466
+I162
+I464
+I166
+ta(I464
+I166
+I463
+I172
+ta(I463
+I172
+I463
+I177
+ta(I463
+I177
+I463
+I183
+ta(I463
+I183
+I463
+I188
+ta(I463
+I188
+I464
+I194
+ta(I464
+I194
+I466
+I200
+ta(I466
+I200
+I469
+I206
+ta(I469
+I206
+I473
+I211
+ta(I473
+I211
+I477
+I216
+ta(I477
+I216
+I483
+I221
+ta(I483
+I221
+I489
+I224
+ta(I489
+I224
+I494
+I227
+ta(I494
+I227
+I510
+I230
+ta(I510
+I230
+I526
+I231
+ta(I526
+I231
+I544
+I231
+ta(I544
+I231
+I560
+I231
+ta(I560
+I231
+I578
+I229
+ta(I578
+I229
+I592
+I226
+ta(I592
+I226
+I606
+I222
+ta(I606
+I222
+I611
+I218
+ta(I611
+I218
+I615
+I213
+ta(I615
+I213
+I617
+I208
+ta(I617
+I208
+I620
+I202
+ta(I620
+I202
+I621
+I196
+ta(I621
+I196
+I621
+I191
+ta(I621
+I191
+I620
+I186
+ta(I620
+I186
+I617
+I181
+ta(I617
+I181
+I613
+I176
+ta(I613
+I176
+I609
+I172
+ta(I609
+I172
+I605
+I169
+ta(I605
+I169
+I587
+I165
+ta(I587
+I165
+I571
+I162
+ta(I571
+I162
+I553
+I160
+ta(I553
+I160
+I535
+I159
+ta(I535
+I159
+I519
+I159
+ta(I519
+I159
+I503
+I161
+ta(I503
+I161
+I498
+I164
+ta(I498
+I164
+I494
+I168
+ta(I494
+I168
+I491
+I174
+ta(I491
+I174
+I489
+I179
+ta(I489
+I179
+I489
+I184
+ta(I489
+I184
+I489
+I190
+ta(I489
+I190
+I491
+I206
+ta(I491
+I206
+I494
+I210
+ta(I494
+I210
+I500
+I216
+ta(I500
+I216
+I505
+I221
+ta(I505
+I221
+I511
+I225
+ta(I511
+I225
+I529
+I231
+ta(I529
+I231
+I545
+I234
+ta(I545
+I234
+I563
+I238
+ta(I563
+I238
+I581
+I242
+ta(I581
+I242
+I599
+I244
+ta(I599
+I244
+I615
+I246
+ta(I615
+I246
+I631
+I247
+ta(I631
+I247
+I645
+I247
+ta(I645
+I247
+I659
+I247
+ta(I659
+I247
+I664
+I246
+ta(I664
+I246
+I669
+I243
+ta(I669
+I243
+I672
+I240
+ta(I672
+I240
+I674
+I237
+ta(I674
+I237
+I676
+I234
+ta(I676
+I234
+I677
+I229
+ta(I677
+I229
+I677
+I225
+ta(I677
+I225
+I675
+I220
+ta(I675
+I220
+I672
+I216
+ta(I672
+I216
+I667
+I211
+ta(I667
+I211
+I663
+I207
+ta(I663
+I207
+I658
+I205
+ta(I658
+I205
+I654
+I202
+ta(I654
+I202
+I649
+I200
+ta(I649
+I200
+I644
+I199
+ta(I644
+I199
+I640
+I198
+ta(I640
+I198
+I635
+I198
+ta(I635
+I198
+I630
+I200
+ta(I630
+I200
+I626
+I202
+ta(I626
+I202
+I623
+I205
+ta(I623
+I205
+I619
+I219
+ta(I619
+I219
+I617
+I224
+ta(I617
+I224
+I615
+I238
+ta(I615
+I238
+I614
+I254
+ta(I614
+I254
+I614
+I259
+ta(I614
+I259
+I614
+I261
+ta(I614
+I261
+I614
+I262
+ta(I614
+I262
+I617
+I280
+ta(I617
+I280
+I617
+I281
+ta(I617
+I281
+I616
+I282
+ta(I616
+I282
+I617
+I282
+ta(I617
+I282
+I641
+I286
+ta(I641
+I286
+I655
+I288
+ta(I655
+I288
+I669
+I288
+ta(I669
+I288
+I673
+I288
+ta(I673
+I288
+I677
+I286
+ta(I677
+I286
+I678
+I283
+ta(I678
+I283
+I678
+I279
+ta(I678
+I279
+I678
+I275
+ta(I678
+I275
+I677
+I271
+ta(I677
+I271
+I675
+I268
+ta(I675
+I268
+I670
+I254
+ta(I670
+I254
+I669
+I254
+ta(I669
+I254
+I664
+I250
+ta(I664
+I250
+I659
+I248
+ta(I659
+I248
+I645
+I245
+ta(I645
+I245
+I631
+I241
+ta(I631
+I241
+I617
+I239
+ta(I617
+I239
+I611
+I238
+ta(I611
+I238
+I608
+I238
+ta(I608
+I238
+I604
+I239
+ta(I604
+I239
+I601
+I242
+ta(I601
+I242
+I600
+I245
+ta(I600
+I245
+I600
+I247
+ta(I600
+I247
+I600
+I251
+ta(I600
+I251
+I600
+I256
+ta(I600
+I256
+I600
+I259
+ta(I600
+I259
+I600
+I263
+ta(I600
+I263
+I600
+I266
+ta(I600
+I266
+I600
+I270
+ta(I600
+I270
+I600
+I273
+ta(I600
+I273
+I600
+I277
+ta(I600
+I277
+I600
+I280
+ta(I600
+I280
+I601
+I283
+ta(I601
+I283
+I603
+I286
+ta(I603
+I286
+I606
+I289
+ta(I606
+I289
+I610
+I291
+ta(I610
+I291
+I615
+I292
+ta(I615
+I292
+I621
+I293
+ta(I621
+I293
+I625
+I293
+ta(I625
+I293
+I630
+I292
+ta(I630
+I292
+I634
+I289
+ta(I634
+I289
+I637
+I286
+ta(I637
+I286
+I640
+I282
+ta(I640
+I282
+I641
+I277
+ta(I641
+I277
+I641
+I271
+ta(I641
+I271
+I640
+I267
+ta(I640
+I267
+I637
+I261
+ta(I637
+I261
+I633
+I256
+ta(I633
+I256
+I619
+I250
+ta(I619
+I250
+I603
+I246
+ta(I603
+I246
+I579
+I240
+ta(I579
+I240
+I551
+I236
+ta(I551
+I236
+I519
+I233
+ta(I519
+I233
+I487
+I230
+ta(I487
+I230
+I457
+I230
+ta(I457
+I230
+I429
+I230
+ta(I429
+I230
+I401
+I233
+ta(I401
+I233
+I377
+I236
+ta(I377
+I236
+I353
+I241
+ta(I353
+I241
+I331
+I247
+ta(I331
+I247
+I311
+I263
+ta(I311
+I263
+I297
+I268
+ta(I297
+I268
+I292
+I288
+ta(I292
+I288
+I290
+I306
+ta(I290
+I306
+I289
+I324
+ta(I289
+I324
+I291
+I342
+ta(I291
+I342
+I296
+I362
+ta(I296
+I362
+I301
+I376
+ta(I301
+I376
+I319
+I392
+ta(I319
+I392
+I337
+I397
+ta(I337
+I397
+I355
+I401
+ta(I355
+I401
+I373
+I405
+ta(I373
+I405
+I391
+I408
+ta(I391
+I408
+I409
+I408
+ta(I409
+I408
+I423
+I409
+ta(I423
+I409
+I427
+I407
+ta(I427
+I407
+I430
+I404
+ta(I430
+I404
+I432
+I400
+ta(I432
+I400
+I433
+I395
+ta(I433
+I395
+I432
+I381
+ta(I432
+I381
+I430
+I375
+ta(I430
+I375
+I426
+I369
+ta(I426
+I369
+I422
+I353
+ta(I422
+I353
+I408
+I339
+ta(I408
+I339
+I402
+I333
+ta(I402
+I333
+I388
+I319
+ta(I388
+I319
+I372
+I313
+ta(I372
+I313
+I356
+I299
+ta(I356
+I299
+I338
+I295
+ta(I338
+I295
+I322
+I291
+ta(I322
+I291
+I306
+I287
+ta(I306
+I287
+I286
+I284
+ta(I286
+I284
+I270
+I283
+ta(I270
+I283
+I256
+I283
+ta(I256
+I283
+I251
+I285
+ta(I251
+I285
+I246
+I289
+ta(I246
+I289
+I243
+I295
+ta(I243
+I295
+I240
+I300
+ta(I240
+I300
+I238
+I314
+ta(I238
+I314
+I238
+I330
+ta(I238
+I330
+I238
+I335
+ta(I238
+I335
+I238
+I341
+ta(I238
+I341
+I241
+I347
+ta(I241
+I347
+I244
+I351
+ta(I244
+I351
+I249
+I354
+ta(I249
+I354
+I254
+I357
+ta(I254
+I357
+I268
+I359
+ta(I268
+I359
+I284
+I360
+ta(I284
+I360
+I304
+I360
+ta(I304
+I360
+I326
+I360
+ta(I326
+I360
+I348
+I359
+ta(I348
+I359
+I370
+I357
+ta(I370
+I357
+I390
+I353
+ta(I390
+I353
+I408
+I350
+ta(I408
+I350
+I422
+I346
+ta(I422
+I346
+I427
+I341
+ta(I427
+I341
+I428
+I336
+ta(I428
+I336
+I429
+I331
+ta(I429
+I331
+I428
+I326
+ta(I428
+I326
+I425
+I321
+ta(I425
+I321
+I421
+I316
+ta(I421
+I316
+I415
+I311
+ta(I415
+I311
+I409
+I309
+ta(I409
+I309
+I391
+I305
+ta(I391
+I305
+I375
+I303
+ta(I375
+I303
+I361
+I302
+ta(I361
+I302
+I347
+I301
+ta(I347
+I301
+I333
+I301
+ta(I333
+I301
+I329
+I301
+ta(I329
+I301
+I325
+I304
+ta(I325
+I304
+I323
+I307
+ta(I323
+I307
+I322
+I311
+ta(I322
+I311
+I322
+I316
+ta(I322
+I316
+I325
+I322
+ta(I325
+I322
+I329
+I327
+ta(I329
+I327
+I335
+I332
+ta(I335
+I332
+I353
+I336
+ta(I353
+I336
+I371
+I340
+ta(I371
+I340
+I395
+I344
+ta(I395
+I344
+I419
+I347
+ta(I419
+I347
+I445
+I349
+ta(I445
+I349
+I473
+I350
+ta(I473
+I350
+I501
+I352
+ta(I501
+I352
+I527
+I352
+ta(I527
+I352
+I551
+I352
+ta(I551
+I352
+I571
+I351
+ta(I571
+I351
+I577
+I349
+ta(I577
+I349
+I581
+I346
+ta(I581
+I346
+I583
+I343
+ta(I583
+I343
+I585
+I340
+ta(I585
+I340
+I585
+I336
+ta(I585
+I336
+I583
+I332
+ta(I583
+I332
+I579
+I328
+ta(I579
+I328
+I573
+I323
+ta(I573
+I323
+I557
+I320
+ta(I557
+I320
+I539
+I317
+ta(I539
+I317
+I523
+I314
+ta(I523
+I314
+I503
+I312
+ta(I503
+I312
+I487
+I310
+ta(I487
+I310
+I469
+I309
+ta(I469
+I309
+I463
+I309
+ta(I463
+I309
+I458
+I309
+ta(I458
+I309
+I453
+I309
+ta(I453
+I309
+I451
+I312
+ta(I451
+I312
+I449
+I315
+ta(I449
+I315
+I449
+I318
+ta(I449
+I318
+I449
+I323
+ta(I449
+I323
+I452
+I337
+ta(I452
+I337
+I455
+I342
+ta(I455
+I342
+I461
+I348
+ta(I461
+I348
+I465
+I354
+ta(I465
+I354
+I468
+I359
+ta(I468
+I359
+I473
+I364
+ta(I473
+I364
+I477
+I367
+ta(I477
+I367
+I483
+I370
+ta(I483
+I370
+I487
+I371
+ta(I487
+I371
+I491
+I372
+ta(I491
+I372
+I496
+I371
+ta(I496
+I371
+I501
+I370
+ta(I501
+I370
+I505
+I367
+ta(I505
+I367
+I509
+I363
+ta(I509
+I363
+I512
+I358
+ta(I512
+I358
+I514
+I352
+ta(I514
+I352
+I515
+I347
+ta(I515
+I347
+I514
+I333
+ta(I514
+I333
+I512
+I327
+ta(I512
+I327
+I508
+I321
+ta(I508
+I321
+I503
+I307
+ta(I503
+I307
+I487
+I302
+ta(I487
+I302
+I473
+I297
+ta(I473
+I297
+I449
+I292
+ta(I449
+I292
+I425
+I287
+ta(I425
+I287
+I401
+I285
+ta(I401
+I285
+I375
+I282
+ta(I375
+I282
+I351
+I281
+ta(I351
+I281
+I327
+I281
+ta(I327
+I281
+I303
+I281
+ta(I303
+I281
+I283
+I283
+ta(I283
+I283
+I263
+I287
+ta(I263
+I287
+I245
+I293
+ta(I245
+I293
+I240
+I298
+ta(I240
+I298
+I235
+I304
+ta(I235
+I304
+I233
+I322
+ta(I233
+I322
+I231
+I336
+ta(I231
+I336
+I232
+I342
+ta(I232
+I342
+I233
+I358
+ta(I233
+I358
+I236
+I374
+ta(I236
+I374
+I239
+I388
+ta(I239
+I388
+I244
+I404
+ta(I244
+I404
+I250
+I418
+ta(I250
+I418
+I255
+I423
+ta(I255
+I423
+I269
+I428
+ta(I269
+I428
+I275
+I431
+ta(I275
+I431
+I289
+I433
+ta(I289
+I433
+I295
+I434
+ta(I295
+I434
+I300
+I434
+ta(I300
+I434
+I306
+I432
+ta(I306
+I432
+I309
+I429
+ta(I309
+I429
+I313
+I425
+ta(I313
+I425
+I316
+I420
+ta(I316
+I420
+I318
+I415
+ta(I318
+I415
+I319
+I409
+ta(I319
+I409
+I319
+I395
+ta(I319
+I395
+I318
+I389
+ta(I318
+I389
+I316
+I383
+ta(I316
+I383
+I311
+I369
+ta(I311
+I369
+I306
+I355
+ta(I306
+I355
+I292
+I349
+ta(I292
+I349
+I276
+I335
+ta(I276
+I335
+I260
+I329
+ta(I260
+I329
+I242
+I324
+ta(I242
+I324
+I226
+I319
+ta(I226
+I319
+I208
+I315
+ta(I208
+I315
+I190
+I312
+ta(I190
+I312
+I172
+I309
+ta(I172
+I309
+I152
+I306
+ta(I152
+I306
+I134
+I306
+ta(I134
+I306
+I116
+I306
+ta(I116
+I306
+I96
+I307
+ta(I96
+I307
+I76
+I310
+ta(I76
+I310
+I60
+I316
+ta(I60
+I316
+I55
+I321
+ta(I55
+I321
+I50
+I337
+ta(I50
+I337
+I47
+I353
+ta(I47
+I353
+I45
+I369
+ta(I45
+I369
+I45
+I387
+ta(I45
+I387
+I46
+I403
+ta(I46
+I403
+I49
+I409
+ta(I49
+I409
+I54
+I423
+ta(I54
+I423
+I60
+I429
+ta(I60
+I429
+I66
+I432
+ta(I66
+I432
+I84
+I434
+ta(I84
+I434
+I102
+I435
+ta(I102
+I435
+I122
+I436
+ta(I122
+I436
+I142
+I436
+ta(I142
+I436
+I162
+I434
+ta(I162
+I434
+I180
+I431
+ta(I180
+I431
+I194
+I427
+ta(I194
+I427
+I198
+I423
+ta(I198
+I423
+I201
+I417
+ta(I201
+I417
+I201
+I403
+ta(I201
+I403
+I200
+I389
+ta(I200
+I389
+I197
+I383
+ta(I197
+I383
+I192
+I377
+ta(I192
+I377
+I178
+I361
+ta(I178
+I361
+I164
+I347
+ta(I164
+I347
+I148
+I341
+ta(I148
+I341
+I132
+I337
+ta(I132
+I337
+I112
+I331
+ta(I112
+I331
+I96
+I327
+ta(I96
+I327
+I80
+I324
+ta(I80
+I324
+I66
+I322
+ta(I66
+I322
+I50
+I321
+ta(I50
+I321
+I44
+I321
+ta(I44
+I321
+I38
+I321
+ta(I38
+I321
+I33
+I322
+ta(I33
+I322
+I29
+I324
+ta(I29
+I324
+I26
+I328
+ta(I26
+I328
+I23
+I333
+ta(I23
+I333
+I21
+I337
+ta(I21
+I337
+I21
+I351
+ta(I21
+I351
+I21
+I365
+ta(I21
+I365
+I22
+I379
+ta(I22
+I379
+I25
+I393
+ta(I25
+I393
+I28
+I411
+ta(I28
+I411
+I32
+I416
+ta(I32
+I416
+I37
+I421
+ta(I37
+I421
+I40
+I424
+ta(I40
+I424
+I45
+I426
+ta(I45
+I426
+I51
+I428
+ta(I51
+I428
+I57
+I427
+ta(I57
+I427
+I73
+I424
+ta(I73
+I424
+I87
+I419
+ta(I87
+I419
+I93
+I405
+ta(I93
+I405
+I99
+I389
+ta(I99
+I389
+I102
+I373
+ta(I102
+I373
+I104
+I357
+ta(I104
+I357
+I105
+I335
+ta(I105
+I335
+I105
+I319
+ta(I105
+I319
+I103
+I303
+ta(I103
+I303
+I100
+I287
+ta(I100
+I287
+I96
+I273
+ta(I96
+I273
+I91
+I268
+ta(I91
+I268
+I77
+I254
+ta(I77
+I254
+I71
+I251
+ta(I71
+I251
+I66
+I247
+ta(I66
+I247
+I60
+I244
+ta(I60
+I244
+I46
+I241
+ta(I46
+I241
+I42
+I239
+ta(I42
+I239
+I37
+I238
+ta(I37
+I238
+I33
+I238
+ta(I33
+I238
+I28
+I240
+ta(I28
+I240
+I24
+I246
+ta(I24
+I246
+I21
+I252
+ta(I21
+I252
+I19
+I268
+ta(I19
+I268
+I17
+I284
+ta(I17
+I284
+I17
+I302
+ta(I17
+I302
+I17
+I316
+ta(I17
+I316
+I18
+I321
+ta(I18
+I321
+I21
+I326
+ta(I21
+I326
+I25
+I330
+ta(I25
+I330
+I30
+I332
+ta(I30
+I332
+I36
+I333
+ta(I36
+I333
+I52
+I333
+ta(I52
+I333
+I66
+I332
+ta(I66
+I332
+I72
+I328
+ta(I72
+I328
+I88
+I324
+ta(I88
+I324
+I94
+I310
+ta(I94
+I310
+I110
+I304
+ta(I110
+I304
+I113
+I290
+ta(I113
+I290
+I118
+I274
+ta(I118
+I274
+I122
+I256
+ta(I122
+I256
+I124
+I240
+ta(I124
+I240
+I125
+I222
+ta(I125
+I222
+I125
+I208
+ta(I125
+I208
+I125
+I203
+ta(I125
+I203
+I123
+I197
+ta(I123
+I197
+I120
+I183
+ta(I120
+I183
+I116
+I178
+ta(I116
+I178
+I112
+I175
+ta(I112
+I175
+I108
+I170
+ta(I108
+I170
+I103
+I166
+ta(I103
+I166
+I97
+I164
+ta(I97
+I164
+I92
+I162
+ta(I92
+I162
+I89
+I161
+ta(I89
+I161
+I85
+I160
+ta(I85
+I160
+I82
+I160
+ta(I82
+I160
+I80
+I160
+ta(I80
+I160
+I78
+I162
+ta(I78
+I162
+I76
+I165
+ta(I76
+I165
+I74
+I169
+ta(I74
+I169
+I71
+I183
+ta(I71
+I183
+I70
+I188
+ta(I70
+I188
+I67
+I206
+ta(I67
+I206
+I65
+I224
+ta(I65
+I224
+I64
+I240
+ta(I64
+I240
+I63
+I260
+ta(I63
+I260
+I62
+I274
+ta(I62
+I274
+I62
+I288
+ta(I62
+I288
+I62
+I293
+ta(I62
+I293
+I63
+I297
+ta(I63
+I297
+I66
+I300
+ta(I66
+I300
+I68
+I301
+ta(I68
+I301
+I71
+I301
+ta(I71
+I301
+I74
+I301
+ta(I74
+I301
+I77
+I298
+ta(I77
+I298
+I81
+I293
+ta(I81
+I293
+I84
+I287
+ta(I84
+I287
+I87
+I273
+ta(I87
+I273
+I91
+I257
+ta(I91
+I257
+I93
+I239
+ta(I93
+I239
+I95
+I223
+ta(I95
+I223
+I96
+I203
+ta(I96
+I203
+I96
+I187
+ta(I96
+I187
+I96
+I171
+ta(I96
+I171
+I94
+I157
+ta(I94
+I157
+I91
+I152
+ta(I91
+I152
+I88
+I148
+ta(I88
+I148
+I84
+I144
+ta(I84
+I144
+I80
+I142
+ta(I80
+I142
+I75
+I139
+ta(I75
+I139
+I70
+I139
+ta(I70
+I139
+I54
+I139
+ta(I54
+I139
+I48
+I139
+ta(I48
+I139
+I42
+I141
+ta(I42
+I141
+I36
+I144
+ta(I36
+I144
+I32
+I150
+ta(I32
+I150
+I29
+I155
+ta(I29
+I155
+I26
+I161
+ta(I26
+I161
+I23
+I166
+ta(I23
+I166
+I22
+I172
+ta(I22
+I172
+I22
+I177
+ta(I22
+I177
+I21
+I183
+ta(I21
+I183
+I21
+I189
+ta(I21
+I189
+I21
+I194
+ta(I21
+I194
+I23
+I198
+ta(I23
+I198
+I25
+I202
+ta(I25
+I202
+I27
+I206
+ta(I27
+I206
+I30
+I208
+ta(I30
+I208
+I34
+I210
+ta(I34
+I210
+I37
+I211
+ta(I37
+I211
+I40
+I211
+ta(I40
+I211
+I44
+I209
+ta(I44
+I209
+I48
+I206
+ta(I48
+I206
+I52
+I201
+ta(I52
+I201
+I55
+I187
+ta(I55
+I187
+I58
+I181
+ta(I58
+I181
+I61
+I167
+ta(I61
+I167
+I63
+I151
+ta(I63
+I151
+I65
+I137
+ta(I65
+I137
+I65
+I123
+ta(I65
+I123
+I65
+I117
+ta(I65
+I117
+I64
+I112
+ta(I64
+I112
+I62
+I108
+ta(I62
+I108
+I59
+I105
+ta(I59
+I105
+I57
+I103
+ta(I57
+I103
+I54
+I102
+ta(I54
+I102
+I51
+I101
+ta(I51
+I101
+I47
+I101
+ta(I47
+I101
+I43
+I101
+ta(I43
+I101
+I39
+I102
+ta(I39
+I102
+I34
+I104
+ta(I34
+I104
+I29
+I108
+ta(I29
+I108
+I25
+I111
+ta(I25
+I111
+I20
+I116
+ta(I20
+I116
+I16
+I130
+ta(I16
+I130
+I13
+I146
+ta(I13
+I146
+I9
+I162
+ta(I9
+I162
+I7
+I178
+ta(I7
+I178
+I6
+I192
+ta(I6
+I192
+I5
+I198
+ta(I5
+I198
+I5
+I212
+ta(I5
+I212
+I6
+I217
+ta(I6
+I217
+I9
+I223
+ta(I9
+I223
+I13
+I226
+ta(I13
+I226
+I19
+I229
+ta(I19
+I229
+I24
+I231
+ta(I24
+I231
+I30
+I232
+ta(I30
+I232
+I44
+I232
+ta(I44
+I232
+I62
+I231
+ta(I62
+I231
+I76
+I228
+ta(I76
+I228
+I82
+I224
+ta(I82
+I224
+I96
+I219
+ta(I96
+I219
+I110
+I203
+ta(I110
+I203
+I115
+I187
+ta(I115
+I187
+I118
+I171
+ta(I118
+I171
+I120
+I153
+ta(I120
+I153
+I121
+I133
+ta(I121
+I133
+I121
+I115
+ta(I121
+I115
+I119
+I99
+ta(I119
+I99
+I116
+I93
+ta(I116
+I93
+I112
+I89
+ta(I112
+I89
+I108
+I87
+ta(I108
+I87
+I103
+I84
+ta(I103
+I84
+I97
+I83
+ta(I97
+I83
+I83
+I82
+ta(I83
+I82
+I65
+I82
+ta(I65
+I82
+I47
+I82
+ta(I47
+I82
+I29
+I82
+ta(I29
+I82
+I9
+I85
+ta(I9
+I85
+I-9
+I89
+ta(I-9
+I89
+I-15
+I93
+ta(I-15
+I93
+I-18
+I97
+ta(I-18
+I97
+I-21
+I111
+ta(I-21
+I111
+I-22
+I117
+ta(I-22
+I117
+I-23
+I135
+ta(I-23
+I135
+I-23
+I141
+ta(I-23
+I141
+I-22
+I157
+ta(I-22
+I157
+I-19
+I171
+ta(I-19
+I171
+I-15
+I187
+ta(I-15
+I187
+I-1
+I203
+ta(I-1
+I203
+I5
+I217
+ta(I5
+I217
+I21
+I221
+ta(I21
+I221
+I39
+I224
+ta(I39
+I224
+I59
+I228
+ta(I59
+I228
+I81
+I229
+ta(I81
+I229
+I105
+I230
+ta(I105
+I230
+I125
+I230
+ta(I125
+I230
+I145
+I227
+ta(I145
+I227
+I167
+I221
+ta(I167
+I221
+I183
+I207
+ta(I183
+I207
+I189
+I201
+ta(I189
+I201
+I203
+I185
+ta(I203
+I185
+I209
+I169
+ta(I209
+I169
+I212
+I151
+ta(I212
+I151
+I216
+I135
+ta(I216
+I135
+I217
+I121
+ta(I217
+I121
+I217
+I115
+ta(I217
+I115
+I215
+I109
+ta(I215
+I109
+I211
+I105
+ta(I211
+I105
+I197
+I102
+ta(I197
+I102
+I191
+I101
+ta(I191
+I101
+I175
+I99
+ta(I175
+I99
+I157
+I99
+ta(I157
+I99
+I137
+I99
+ta(I137
+I99
+I119
+I99
+ta(I119
+I99
+I101
+I102
+ta(I101
+I102
+I97
+I104
+ta(I97
+I104
+I93
+I107
+ta(I93
+I107
+I91
+I112
+ta(I91
+I112
+I90
+I117
+ta(I90
+I117
+I90
+I131
+ta(I90
+I131
+I91
+I145
+ta(I91
+I145
+I94
+I151
+ta(I94
+I151
+I99
+I169
+ta(I99
+I169
+I113
+I175
+ta(I113
+I175
+I131
+I191
+ta(I131
+I191
+I149
+I197
+ta(I149
+I197
+I169
+I202
+ta(I169
+I202
+I195
+I207
+ta(I195
+I207
+I221
+I209
+ta(I221
+I209
+I247
+I211
+ta(I247
+I211
+I277
+I211
+ta(I277
+I211
+I311
+I210
+ta(I311
+I210
+I339
+I208
+ta(I339
+I208
+I367
+I203
+ta(I367
+I203
+I393
+I187
+ta(I393
+I187
+I413
+I173
+ta(I413
+I173
+I418
+I155
+ta(I418
+I155
+I422
+I135
+ta(I422
+I135
+I423
+I115
+ta(I423
+I115
+I423
+I97
+ta(I423
+I97
+I419
+I77
+ta(I419
+I77
+I414
+I71
+ta(I414
+I71
+I398
+I66
+ta(I398
+I66
+I380
+I61
+ta(I380
+I61
+I362
+I57
+ta(I362
+I57
+I342
+I55
+ta(I342
+I55
+I320
+I53
+ta(I320
+I53
+I296
+I51
+ta(I296
+I51
+I276
+I50
+ta(I276
+I50
+I254
+I50
+ta(I254
+I50
+I234
+I50
+ta(I234
+I50
+I216
+I50
+ta(I216
+I50
+I210
+I52
+ta(I210
+I52
+I206
+I54
+ta(I206
+I54
+I202
+I56
+ta(I202
+I56
+I200
+I60
+ta(I200
+I60
+I200
+I64
+ta(I200
+I64
+I200
+I69
+ta(I200
+I69
+I201
+I75
+ta(I201
+I75
+I204
+I80
+ta(I204
+I80
+I208
+I86
+ta(I208
+I86
+I213
+I100
+ta(I213
+I100
+I219
+I106
+ta(I219
+I106
+I225
+I112
+ta(I225
+I112
+I230
+I116
+ta(I230
+I116
+I244
+I120
+ta(I244
+I120
+I260
+I123
+ta(I260
+I123
+I278
+I126
+ta(I278
+I126
+I284
+I127
+ta(I284
+I127
+I300
+I127
+ta(I300
+I127
+I316
+I125
+ta(I316
+I125
+I322
+I121
+ta(I322
+I121
+I327
+I117
+ta(I327
+I117
+I333
+I101
+ta(I333
+I101
+I335
+I95
+ta(I335
+I95
+I337
+I89
+ta(I337
+I89
+I338
+I75
+ta(I338
+I75
+I337
+I69
+ta(I337
+I69
+I335
+I63
+ta(I335
+I63
+I332
+I59
+ta(I332
+I59
+I328
+I56
+ta(I328
+I56
+I314
+I53
+ta(I314
+I53
+I300
+I52
+ta(I300
+I52
+I286
+I52
+ta(I286
+I52
+I270
+I52
+ta(I270
+I52
+I256
+I54
+ta(I256
+I54
+I240
+I57
+ta(I240
+I57
+I235
+I62
+ta(I235
+I62
+I230
+I67
+ta(I230
+I67
+I226
+I81
+ta(I226
+I81
+I223
+I95
+ta(I223
+I95
+I221
+I111
+ta(I221
+I111
+I219
+I129
+ta(I219
+I129
+I219
+I147
+ta(I219
+I147
+I219
+I163
+ta(I219
+I163
+I221
+I179
+ta(I221
+I179
+I226
+I193
+ta(I226
+I193
+I231
+I207
+ta(I231
+I207
+I237
+I221
+ta(I237
+I221
+I257
+I226
+ta(I257
+I226
+I277
+I231
+ta(I277
+I231
+I295
+I234
+ta(I295
+I234
+I315
+I237
+ta(I315
+I237
+I329
+I238
+ta(I329
+I238
+I335
+I238
+ta(I335
+I238
+I339
+I237
+ta(I339
+I237
+I342
+I235
+ta(I342
+I235
+I344
+I232
+ta(I344
+I232
+I344
+I228
+ta(I344
+I228
+I342
+I223
+ta(I342
+I223
+I338
+I218
+ta(I338
+I218
+I332
+I213
+ta(I332
+I213
+I312
+I209
+ta(I312
+I209
+I292
+I205
+ta(I292
+I205
+I272
+I204
+ta(I272
+I204
+I252
+I204
+ta(I252
+I204
+I234
+I205
+ta(I234
+I205
+I218
+I208
+ta(I218
+I208
+I202
+I212
+ta(I202
+I212
+I198
+I218
+ta(I198
+I218
+I195
+I224
+ta(I195
+I224
+I194
+I229
+ta(I194
+I229
+I194
+I235
+ta(I194
+I235
+I196
+I249
+ta(I196
+I249
+I201
+I254
+ta(I201
+I254
+I215
+I268
+ta(I215
+I268
+I231
+I273
+ta(I231
+I273
+I249
+I278
+ta(I249
+I278
+I269
+I284
+ta(I269
+I284
+I289
+I289
+ta(I289
+I289
+I309
+I295
+ta(I309
+I295
+I325
+I300
+ta(I325
+I300
+I341
+I306
+ta(I341
+I306
+I357
+I309
+ta(I357
+I309
+I371
+I313
+ta(I371
+I313
+I374
+I317
+ta(I374
+I317
+I377
+I319
+ta(I377
+I319
+I380
+I321
+ta(I380
+I321
+I382
+I322
+ta(I382
+I322
+I382
+I323
+ta(I382
+I323
+I383
+I323
+ta(I383
+I323
+I384
+I322
+ta(I384
+I322
+I385
+I322
+ta(I385
+I322
+I386
+I321
+ta(I386
+I321
+I387
+I321
+ta(I387
+I321
+I388
+I320
+ta(I388
+I320
+I389
+I320
+ta(I389
+I320
+I390
+I319
+ta(I390
+I319
+I391
+I319
+ta(I391
+I319
+I392
+I318
+ta(I392
+I318
+I393
+I318
+ta(I393
+I318
+I395
+I318
+ta(I395
+I318
+I397
+I318
+ta(I397
+I318
+I399
+I320
+ta(I399
+I320
+I400
+I323
+ta(I400
+I323
+I403
+I326
+ta(I403
+I326
+I405
+I331
+ta(I405
+I331
+I407
+I337
+ta(I407
+I337
+I409
+I342
+ta(I409
+I342
+I413
+I347
+ta(I413
+I347
+I417
+I351
+ta(I417
+I351
+I420
+I354
+ta(I420
+I354
+I423
+I357
+ta(I423
+I357
+I426
+I359
+ta(I426
+I359
+I427
+I360
+ta(I427
+I360
+I425
+I357
+ta(I425
+I357
+I419
+I351
+ta(I419
+I351
+I403
+I346
+ta(I403
+I346
+I387
+I341
+ta(I387
+I341
+I367
+I337
+ta(I367
+I337
+I349
+I334
+ta(I349
+I334
+I331
+I333
+ta(I331
+I333
+I315
+I332
+ta(I315
+I332
+I299
+I333
+ta(I299
+I333
+I283
+I336
+ta(I283
+I336
+I267
+I340
+ta(I267
+I340
+I253
+I343
+ta(I253
+I343
+I239
+I349
+ta(I239
+I349
+I235
+I353
+ta(I235
+I353
+I232
+I359
+ta(I232
+I359
+I231
+I363
+ta(I231
+I363
+I231
+I369
+ta(I231
+I369
+I232
+I374
+ta(I232
+I374
+I235
+I379
+ta(I235
+I379
+I241
+I385
+ta(I241
+I385
+I246
+I399
+ta(I246
+I399
+I252
+I404
+ta(I252
+I404
+I266
+I410
+ta(I266
+I410
+I280
+I414
+ta(I280
+I414
+I298
+I418
+ta(I298
+I418
+I312
+I420
+ta(I312
+I420
+I328
+I421
+ta(I328
+I421
+I344
+I420
+ta(I344
+I420
+I349
+I418
+ta(I349
+I418
+I355
+I414
+ta(I355
+I414
+I360
+I409
+ta(I360
+I409
+I361
+I403
+ta(I361
+I403
+I362
+I398
+ta(I362
+I398
+I363
+I382
+ta(I363
+I382
+I361
+I368
+ta(I361
+I368
+I358
+I352
+ta(I358
+I352
+I342
+I334
+ta(I342
+I334
+I326
+I320
+ta(I326
+I320
+I310
+I314
+ta(I310
+I314
+I288
+I309
+ta(I288
+I309
+I266
+I306
+ta(I266
+I306
+I244
+I304
+ta(I244
+I304
+I222
+I303
+ta(I222
+I303
+I200
+I304
+ta(I200
+I304
+I182
+I309
+ta(I182
+I309
+I176
+I313
+ta(I176
+I313
+I171
+I319
+ta(I171
+I319
+I167
+I335
+ta(I167
+I335
+I165
+I349
+ta(I165
+I349
+I165
+I367
+ta(I165
+I367
+I165
+I383
+ta(I165
+I383
+I167
+I397
+ta(I167
+I397
+I170
+I411
+ta(I170
+I411
+I175
+I417
+ta(I175
+I417
+I189
+I423
+ta(I189
+I423
+I207
+I426
+ta(I207
+I426
+I223
+I430
+ta(I223
+I430
+I239
+I433
+ta(I239
+I433
+I253
+I434
+ta(I253
+I434
+I259
+I435
+ta(I259
+I435
+I265
+I435
+ta(I265
+I435
+I268
+I435
+ta(I268
+I435
+I271
+I433
+ta(I271
+I433
+I273
+I430
+ta(I273
+I430
+I274
+I427
+ta(I274
+I427
+I274
+I423
+ta(I274
+I423
+I271
+I419
+ta(I271
+I419
+I268
+I415
+ta(I268
+I415
+I263
+I410
+ta(I263
+I410
+I245
+I404
+ta(I245
+I404
+I229
+I399
+ta(I229
+I399
+I213
+I395
+ta(I213
+I395
+I195
+I392
+ta(I195
+I392
+I179
+I389
+ta(I179
+I389
+I163
+I388
+ta(I163
+I388
+I147
+I388
+ta(I147
+I388
+I131
+I389
+ta(I131
+I389
+I125
+I391
+ta(I125
+I391
+I111
+I397
+ta(I111
+I397
+I106
+I403
+ta(I106
+I403
+I103
+I419
+ta(I103
+I419
+I99
+I437
+ta(I99
+I437
+I98
+I455
+ta(I98
+I455
+I98
+I473
+ta(I98
+I473
+I98
+I487
+ta(I98
+I487
+I101
+I503
+ta(I101
+I503
+I105
+I517
+ta(I105
+I517
+I110
+I521
+ta(I110
+I521
+I114
+I525
+ta(I114
+I525
+I120
+I528
+ta(I120
+I528
+I126
+I531
+ta(I126
+I531
+I132
+I534
+ta(I132
+I534
+I146
+I536
+ta(I146
+I536
+I162
+I536
+ta(I162
+I536
+I176
+I536
+ta(I176
+I536
+I190
+I535
+ta(I190
+I535
+I204
+I533
+ta(I204
+I533
+I210
+I529
+ta(I210
+I529
+I215
+I525
+ta(I215
+I525
+I217
+I522
+ta(I217
+I522
+I219
+I518
+ta(I219
+I518
+I219
+I513
+ta(I219
+I513
+I218
+I509
+ta(I218
+I509
+I214
+I505
+ta(I214
+I505
+I209
+I500
+ta(I209
+I500
+I193
+I495
+ta(I193
+I495
+I177
+I491
+ta(I177
+I491
+I161
+I488
+ta(I161
+I488
+I145
+I486
+ta(I145
+I486
+I131
+I483
+ta(I131
+I483
+I125
+I481
+ta(I125
+I481
+I120
+I479
+ta(I120
+I479
+I115
+I478
+ta(I115
+I478
+I110
+I477
+ta(I110
+I477
+I106
+I477
+ta(I106
+I477
+I103
+I477
+ta(I103
+I477
+I101
+I478
+ta(I101
+I478
+I98
+I480
+ta(I98
+I480
+I97
+I483
+ta(I97
+I483
+I95
+I487
+ta(I95
+I487
+I94
+I491
+ta(I94
+I491
+I93
+I497
+ta(I93
+I497
+I93
+I502
+ta(I93
+I502
+I93
+I508
+ta(I93
+I508
+I94
+I514
+ta(I94
+I514
+I96
+I520
+ta(I96
+I520
+I99
+I526
+ta(I99
+I526
+I103
+I530
+ta(I103
+I530
+I107
+I534
+ta(I107
+I534
+I113
+I537
+ta(I113
+I537
+I117
+I539
+ta(I117
+I539
+I131
+I540
+ta(I131
+I540
+I145
+I540
+ta(I145
+I540
+I161
+I539
+ta(I161
+I539
+I175
+I536
+ta(I175
+I536
+I181
+I533
+ta(I181
+I533
+I199
+I528
+ta(I199
+I528
+I203
+I523
+ta(I203
+I523
+I208
+I509
+ta(I208
+I509
+I211
+I504
+ta(I211
+I504
+I211
+I498
+ta(I211
+I498
+I211
+I484
+ta(I211
+I484
+I209
+I470
+ta(I209
+I470
+I204
+I456
+ta(I204
+I456
+I188
+I440
+ta(I188
+I440
+I174
+I434
+ta(I174
+I434
+I158
+I429
+ta(I158
+I429
+I142
+I425
+ta(I142
+I425
+I136
+I421
+ta(I136
+I421
+I131
+I418
+ta(I131
+I418
+I127
+I417
+ta(I127
+I417
+I125
+I417
+ta(I125
+I417
+I123
+I418
+ta(I123
+I418
+I123
+I421
+ta(I123
+I421
+I123
+I426
+ta(I123
+I426
+I124
+I432
+ta(I124
+I432
+I126
+I438
+ta(I126
+I438
+I130
+I452
+ta(I130
+I452
+I134
+I466
+ta(I134
+I466
+I140
+I484
+ta(I140
+I484
+I146
+I500
+ta(I146
+I500
+I152
+I514
+ta(I152
+I514
+I166
+I519
+ta(I166
+I519
+I186
+I525
+ta(I186
+I525
+I202
+I528
+ta(I202
+I528
+I222
+I531
+ta(I222
+I531
+I242
+I533
+ta(I242
+I533
+I266
+I534
+ta(I266
+I534
+I286
+I534
+ta(I286
+I534
+I306
+I532
+ta(I306
+I532
+I326
+I529
+ta(I326
+I529
+I340
+I525
+ta(I340
+I525
+I345
+I520
+ta(I345
+I520
+I351
+I514
+ta(I351
+I514
+I355
+I498
+ta(I355
+I498
+I359
+I482
+ta(I359
+I482
+I362
+I466
+ta(I362
+I466
+I363
+I448
+ta(I363
+I448
+I363
+I434
+ta(I363
+I434
+I361
+I418
+ta(I361
+I418
+I357
+I404
+ta(I357
+I404
+I343
+I398
+ta(I343
+I398
+I337
+I392
+ta(I337
+I392
+I323
+I389
+ta(I323
+I389
+I317
+I386
+ta(I317
+I386
+I303
+I385
+ta(I303
+I385
+I297
+I385
+ta(I297
+I385
+I294
+I388
+ta(I294
+I388
+I291
+I392
+ta(I291
+I392
+I289
+I398
+ta(I289
+I398
+I288
+I414
+ta(I288
+I414
+I288
+I420
+ta(I288
+I420
+I290
+I440
+ta(I290
+I440
+I292
+I456
+ta(I292
+I456
+I297
+I472
+ta(I297
+I472
+I303
+I488
+ta(I303
+I488
+I309
+I493
+ta(I309
+I493
+I329
+I499
+ta(I329
+I499
+I347
+I502
+ta(I347
+I502
+I367
+I505
+ta(I367
+I505
+I393
+I506
+ta(I393
+I506
+I409
+I507
+ta(I409
+I507
+I433
+I507
+ta(I433
+I507
+I457
+I505
+ta(I457
+I505
+I475
+I501
+ta(I475
+I501
+I478
+I501
+ta(I478
+I501
+I478
+I500
+ta(I478
+I500
+I492
+I495
+ta(I492
+I495
+I495
+I490
+ta(I495
+I490
+I498
+I476
+ta(I498
+I476
+I499
+I473
+ta(I499
+I473
+I499
+I467
+ta(I499
+I467
+I497
+I451
+ta(I497
+I451
+I494
+I437
+ta(I494
+I437
+I490
+I431
+ta(I490
+I431
+I485
+I426
+ta(I485
+I426
+I471
+I412
+ta(I471
+I412
+I466
+I409
+ta(I466
+I409
+I460
+I405
+ta(I460
+I405
+I454
+I403
+ta(I454
+I403
+I449
+I402
+ta(I449
+I402
+I445
+I402
+ta(I445
+I402
+I429
+I404
+ta(I429
+I404
+I425
+I410
+ta(I425
+I410
+I421
+I415
+ta(I421
+I415
+I417
+I433
+ta(I417
+I433
+I415
+I449
+ta(I415
+I449
+I414
+I465
+ta(I414
+I465
+I414
+I481
+ta(I414
+I481
+I414
+I487
+ta(I414
+I487
+I417
+I501
+ta(I417
+I501
+I420
+I517
+ta(I420
+I517
+I422
+I519
+ta(I422
+I519
+I427
+I524
+ta(I427
+I524
+I430
+I525
+ta(I430
+I525
+I436
+I529
+ta(I436
+I529
+I452
+I533
+ta(I452
+I533
+I470
+I535
+ta(I470
+I535
+I488
+I536
+ta(I488
+I536
+I494
+I536
+ta(I494
+I536
+I495
+I536
+ta(I495
+I536
+I495
+I535
+ta(I495
+I535
+I499
+I519
+ta(I499
+I519
+I499
+I513
+ta(I499
+I513
+I499
+I512
+ta(I499
+I512
+I499
+I511
+ta(I499
+I511
+I485
+I505
+ta(I485
+I505
+I481
+I503
+ta(I481
+I503
+I479
+I502
+ta(I479
+I502
+I463
+I499
+ta(I463
+I499
+I447
+I498
+ta(I447
+I498
+I441
+I498
+ta(I441
+I498
+I427
+I498
+ta(I427
+I498
+I422
+I500
+ta(I422
+I500
+I417
+I506
+ta(I417
+I506
+I414
+I510
+ta(I414
+I510
+I412
+I516
+ta(I412
+I516
+I411
+I532
+ta(I411
+I532
+I411
+I538
+ta(I411
+I538
+I413
+I552
+ta(I413
+I552
+I417
+I557
+ta(I417
+I557
+I422
+I562
+ta(I422
+I562
+I425
+I564
+ta(I425
+I564
+I426
+I566
+ta(I426
+I566
+I444
+I569
+ta(I444
+I569
+I464
+I572
+ta(I464
+I572
+I469
+I573
+ta(I469
+I573
+I472
+I568
+ta(I472
+I568
+I473
+I554
+ta(I473
+I554
+I474
+I553
+ta(I474
+I553
+I474
+I551
+ta(I474
+I551
+I476
+I565
+ta(I476
+I565
+I475
+I563
+ta(I475
+I563
+I459
+I560
+ta(I459
+I560
+I455
+I558
+ta(I455
+I558
+I453
+I558
+ta(I453
+I558
+I431
+I557
+ta(I431
+I557
+I417
+I557
+ta(I417
+I557
+I411
+I558
+ta(I411
+I558
+I407
+I562
+ta(I407
+I562
+I403
+I566
+ta(I403
+I566
+I401
+I571
+ta(I401
+I571
+I400
+I576
+ta(I400
+I576
+I401
+I582
+ta(I401
+I582
+I403
+I588
+ta(I403
+I588
+I406
+I604
+ta(I406
+I604
+I422
+I610
+ta(I422
+I610
+I428
+I616
+ta(I428
+I616
+I442
+I616
+ta(I442
+I616
+I466
+I614
+ta(I466
+I614
+I468
+I614
+ta(I468
+I614
+I465
+I610
+ta(I465
+I610
+I464
+I607
+ta(I464
+I607
+I464
+I603
+ta(I464
+I603
+I466
+I589
+ta(I466
+I589
+I468
+I573
+ta(I468
+I573
+I470
+I555
+ta(I470
+I555
+I472
+I533
+ta(I472
+I533
+I473
+I509
+ta(I473
+I509
+I473
+I483
+ta(I473
+I483
+I473
+I459
+ta(I473
+I459
+I471
+I435
+ta(I471
+I435
+I471
+I419
+ta(I471
+I419
+I472
+I413
+ta(I472
+I413
+I476
+I408
+ta(I476
+I408
+I482
+I405
+ta(I482
+I405
+I488
+I404
+ta(I488
+I404
+I504
+I404
+ta(I504
+I404
+I522
+I404
+ta(I522
+I404
+I542
+I406
+ta(I542
+I406
+I562
+I409
+ta(I562
+I409
+I584
+I412
+ta(I584
+I412
+I604
+I416
+ta(I604
+I416
+I622
+I421
+ta(I622
+I421
+I638
+I427
+ta(I638
+I427
+I644
+I433
+ta(I644
+I433
+I650
+I439
+ta(I650
+I439
+I655
+I453
+ta(I655
+I453
+I657
+I467
+ta(I657
+I467
+I659
+I473
+ta(I659
+I473
+I659
+I479
+ta(I659
+I479
+I656
+I483
+ta(I656
+I483
+I650
+I488
+ta(I650
+I488
+I636
+I490
+ta(I636
+I490
+I618
+I492
+ta(I618
+I492
+I596
+I493
+ta(I596
+I493
+I576
+I493
+ta(I576
+I493
+I558
+I492
+ta(I558
+I492
+I542
+I489
+ta(I542
+I489
+I538
+I485
+ta(I538
+I485
+I536
+I481
+ta(I536
+I481
+I534
+I475
+ta(I534
+I475
+I533
+I459
+ta(I533
+I459
+I533
+I443
+ta(I533
+I443
+I534
+I425
+ta(I534
+I425
+I537
+I409
+ta(I537
+I409
+I542
+I393
+ta(I542
+I393
+I556
+I379
+ta(I556
+I379
+I574
+I365
+ta(I574
+I365
+I590
+I361
+ta(I590
+I361
+I606
+I358
+ta(I606
+I358
+I624
+I356
+ta(I624
+I356
+I640
+I355
+ta(I640
+I355
+I656
+I356
+ta(I656
+I356
+I670
+I359
+ta(I670
+I359
+I684
+I365
+ta(I684
+I365
+I698
+I371
+ta(I698
+I371
+I714
+I391
+ta(I714
+I391
+I718
+I405
+ta(I718
+I405
+I723
+I425
+ta(I723
+I425
+I727
+I449
+ta(I727
+I449
+I730
+I469
+ta(I730
+I469
+I730
+I489
+ta(I730
+I489
+I730
+I507
+ta(I730
+I507
+I727
+I523
+ta(I727
+I523
+I722
+I537
+ta(I722
+I537
+I704
+I542
+ta(I704
+I542
+I686
+I546
+ta(I686
+I546
+I666
+I548
+ta(I666
+I548
+I644
+I548
+ta(I644
+I548
+I624
+I548
+ta(I624
+I548
+I602
+I546
+ta(I602
+I546
+I582
+I543
+ta(I582
+I543
+I566
+I539
+ta(I566
+I539
+I550
+I525
+ta(I550
+I525
+I545
+I519
+ta(I545
+I519
+I542
+I513
+ta(I542
+I513
+I539
+I495
+ta(I539
+I495
+I537
+I479
+ta(I537
+I479
+I537
+I463
+ta(I537
+I463
+I539
+I445
+ta(I539
+I445
+I542
+I429
+ta(I542
+I429
+I548
+I423
+ta(I548
+I423
+I566
+I417
+ta(I566
+I417
+I582
+I414
+ta(I582
+I414
+I602
+I411
+ta(I602
+I411
+I624
+I411
+ta(I624
+I411
+I644
+I412
+ta(I644
+I412
+I664
+I416
+ta(I664
+I416
+I682
+I420
+ta(I682
+I420
+I688
+I434
+ta(I688
+I434
+I693
+I440
+ta(I693
+I440
+I696
+I456
+ta(I696
+I456
+I699
+I474
+ta(I699
+I474
+I701
+I490
+ta(I701
+I490
+I701
+I506
+ta(I701
+I506
+I701
+I512
+ta(I701
+I512
+I698
+I518
+ta(I698
+I518
+I695
+I524
+ta(I695
+I524
+I690
+I529
+ta(I690
+I529
+I684
+I532
+ta(I684
+I532
+I680
+I535
+ta(I680
+I535
+I666
+I536
+ta(I666
+I536
+I660
+I536
+ta(I660
+I536
+I646
+I535
+ta(I646
+I535
+I640
+I531
+ta(I640
+I531
+I635
+I526
+ta(I635
+I526
+I621
+I510
+ta(I621
+I510
+I618
+I494
+ta(I618
+I494
+I615
+I478
+ta(I615
+I478
+I612
+I458
+ta(I612
+I458
+I612
+I438
+ta(I612
+I438
+I612
+I416
+ta(I612
+I416
+I613
+I392
+ta(I613
+I392
+I615
+I370
+ta(I615
+I370
+I618
+I350
+ta(I618
+I350
+I632
+I328
+ta(I632
+I328
+I646
+I312
+ta(I646
+I312
+I651
+I306
+ta(I651
+I306
+I669
+I302
+ta(I669
+I302
+I674
+I299
+ta(I674
+I299
+I692
+I299
+ta(I692
+I299
+I697
+I300
+ta(I697
+I300
+I701
+I302
+ta(I701
+I302
+I705
+I307
+ta(I705
+I307
+I709
+I311
+ta(I709
+I311
+I711
+I317
+ta(I711
+I317
+I714
+I323
+ta(I714
+I323
+I714
+I329
+ta(I714
+I329
+I714
+I343
+ta(I714
+I343
+I714
+I349
+ta(I714
+I349
+I711
+I355
+ta(I711
+I355
+I707
+I360
+ta(I707
+I360
+I702
+I363
+ta(I702
+I363
+I697
+I366
+ta(I697
+I366
+I683
+I367
+ta(I683
+I367
+I669
+I368
+ta(I669
+I368
+I655
+I366
+ta(I655
+I366
+I639
+I363
+ta(I639
+I363
+I623
+I359
+ta(I623
+I359
+I609
+I354
+ta(I609
+I354
+I603
+I340
+ta(I603
+I340
+I597
+I324
+ta(I597
+I324
+I595
+I310
+ta(I595
+I310
+I592
+I292
+ta(I592
+I292
+I590
+I272
+ta(I590
+I272
+I590
+I252
+ta(I590
+I252
+I590
+I234
+ta(I590
+I234
+I591
+I214
+ta(I591
+I214
+I594
+I198
+ta(I594
+I198
+I598
+I182
+ta(I598
+I182
+I602
+I176
+ta(I602
+I176
+I616
+I171
+ta(I616
+I171
+I621
+I167
+ta(I621
+I167
+I627
+I165
+ta(I627
+I165
+I633
+I164
+ta(I633
+I164
+I636
+I164
+ta(I636
+I164
+I640
+I168
+ta(I640
+I168
+I642
+I173
+ta(I642
+I173
+I644
+I187
+ta(I644
+I187
+I644
+I193
+ta(I644
+I193
+I644
+I211
+ta(I644
+I211
+I642
+I227
+ta(I642
+I227
+I637
+I243
+ta(I637
+I243
+I633
+I257
+ta(I633
+I257
+I628
+I271
+ta(I628
+I271
+I623
+I287
+ta(I623
+I287
+I618
+I291
+ta(I618
+I291
+I613
+I296
+ta(I613
+I296
+I607
+I299
+ta(I607
+I299
+I601
+I301
+ta(I601
+I301
+I597
+I302
+ta(I597
+I302
+I591
+I302
+ta(I591
+I302
+I585
+I298
+ta(I585
+I298
+I579
+I294
+ta(I579
+I294
+I573
+I289
+ta(I573
+I289
+I568
+I275
+ta(I568
+I275
+I563
+I259
+ta(I563
+I259
+I560
+I243
+ta(I560
+I243
+I558
+I227
+ta(I558
+I227
+I557
+I211
+ta(I557
+I211
+I558
+I193
+ta(I558
+I193
+I561
+I177
+ta(I561
+I177
+I565
+I161
+ta(I565
+I161
+I579
+I147
+ta(I579
+I147
+I585
+I142
+ta(I585
+I142
+I603
+I138
+ta(I603
+I138
+I617
+I135
+ta(I617
+I135
+I633
+I134
+ta(I633
+I134
+I639
+I134
+ta(I639
+I134
+I653
+I136
+ta(I653
+I136
+I658
+I139
+ta(I658
+I139
+I662
+I145
+ta(I662
+I145
+I666
+I151
+ta(I666
+I151
+I669
+I165
+ta(I669
+I165
+I670
+I171
+ta(I670
+I171
+I670
+I189
+ta(I670
+I189
+I670
+I205
+ta(I670
+I205
+I667
+I221
+ta(I667
+I221
+I663
+I227
+ta(I663
+I227
+I657
+I243
+ta(I657
+I243
+I652
+I249
+ta(I652
+I249
+I636
+I254
+ta(I636
+I254
+I618
+I257
+ta(I618
+I257
+I600
+I259
+ta(I600
+I259
+I580
+I260
+ta(I580
+I260
+I560
+I260
+ta(I560
+I260
+I538
+I256
+ta(I538
+I256
+I520
+I252
+ta(I520
+I252
+I504
+I248
+ta(I504
+I248
+I490
+I234
+ta(I490
+I234
+I487
+I229
+ta(I487
+I229
+I484
+I224
+ta(I484
+I224
+I482
+I210
+ta(I482
+I210
+I481
+I204
+ta(I481
+I204
+I481
+I198
+ta(I481
+I198
+I481
+I193
+ta(I481
+I193
+I485
+I188
+ta(I485
+I188
+I489
+I184
+ta(I489
+I184
+I503
+I181
+ta(I503
+I181
+I519
+I180
+ta(I519
+I180
+I539
+I179
+ta(I539
+I179
+I557
+I181
+ta(I557
+I181
+I579
+I185
+ta(I579
+I185
+I599
+I189
+ta(I599
+I189
+I617
+I195
+ta(I617
+I195
+I623
+I201
+ta(I623
+I201
+I628
+I207
+ta(I628
+I207
+I631
+I223
+ta(I631
+I223
+I632
+I239
+ta(I632
+I239
+I632
+I257
+ta(I632
+I257
+I629
+I275
+ta(I629
+I275
+I625
+I295
+ta(I625
+I295
+I609
+I315
+ta(I609
+I315
+I595
+I333
+ta(I595
+I333
+I577
+I351
+ta(I577
+I351
+I561
+I365
+ta(I561
+I365
+I541
+I370
+ta(I541
+I370
+I523
+I374
+ta(I523
+I374
+I505
+I376
+ta(I505
+I376
+I481
+I378
+ta(I481
+I378
+I461
+I378
+ta(I461
+I378
+I441
+I377
+ta(I441
+I377
+I423
+I374
+ta(I423
+I374
+I409
+I369
+ta(I409
+I369
+I404
+I364
+ta(I404
+I364
+I400
+I358
+ta(I400
+I358
+I398
+I344
+ta(I398
+I344
+I397
+I330
+ta(I397
+I330
+I397
+I316
+ta(I397
+I316
+I398
+I300
+ta(I398
+I300
+I402
+I294
+ta(I402
+I294
+I408
+I290
+ta(I408
+I290
+I414
+I285
+ta(I414
+I285
+I428
+I281
+ta(I428
+I281
+I442
+I278
+ta(I442
+I278
+I458
+I276
+ta(I458
+I276
+I472
+I275
+ta(I472
+I275
+I477
+I275
+ta(I477
+I275
+I483
+I278
+ta(I483
+I278
+I488
+I283
+ta(I488
+I283
+I492
+I288
+ta(I492
+I288
+I495
+I304
+ta(I495
+I304
+I497
+I310
+ta(I497
+I310
+I497
+I326
+ta(I497
+I326
+I498
+I342
+ta(I498
+I342
+I498
+I358
+ta(I498
+I358
+I496
+I374
+ta(I496
+I374
+I494
+I379
+ta(I494
+I379
+I490
+I393
+ta(I490
+I393
+I485
+I397
+ta(I485
+I397
+I480
+I401
+ta(I480
+I401
+I466
+I404
+ta(I466
+I404
+I450
+I405
+ta(I450
+I405
+I434
+I405
+ta(I434
+I405
+I416
+I403
+ta(I416
+I403
+I396
+I399
+ta(I396
+I399
+I380
+I394
+ta(I380
+I394
+I364
+I380
+ta(I364
+I380
+I350
+I364
+ta(I350
+I364
+I345
+I350
+ta(I345
+I350
+I340
+I332
+ta(I340
+I332
+I335
+I314
+ta(I335
+I314
+I332
+I294
+ta(I332
+I294
+I330
+I274
+ta(I330
+I274
+I329
+I254
+ta(I329
+I254
+I329
+I236
+ta(I329
+I236
+I334
+I220
+ta(I334
+I220
+I339
+I206
+ta(I339
+I206
+I355
+I201
+ta(I355
+I201
+I369
+I197
+ta(I369
+I197
+I385
+I195
+ta(I385
+I195
+I407
+I192
+ta(I407
+I192
+I427
+I192
+ta(I427
+I192
+I449
+I193
+ta(I449
+I193
+I469
+I197
+ta(I469
+I197
+I489
+I211
+ta(I489
+I211
+I503
+I225
+ta(I503
+I225
+I506
+I241
+ta(I506
+I241
+I510
+I263
+ta(I510
+I263
+I511
+I281
+ta(I511
+I281
+I511
+I299
+ta(I511
+I299
+I509
+I319
+ta(I509
+I319
+I506
+I339
+ta(I506
+I339
+I492
+I353
+ta(I492
+I353
+I478
+I359
+ta(I478
+I359
+I464
+I363
+ta(I464
+I363
+I450
+I365
+ta(I450
+I365
+I430
+I367
+ta(I430
+I367
+I410
+I367
+ta(I410
+I367
+I386
+I365
+ta(I386
+I365
+I360
+I361
+ta(I360
+I361
+I336
+I355
+ta(I336
+I355
+I312
+I341
+ta(I312
+I341
+I296
+I335
+ta(I296
+I335
+I278
+I315
+ta(I278
+I315
+I274
+I299
+ta(I274
+I299
+I270
+I279
+ta(I270
+I279
+I268
+I261
+ta(I268
+I261
+I268
+I243
+ta(I268
+I243
+I270
+I225
+ta(I270
+I225
+I275
+I211
+ta(I275
+I211
+I289
+I195
+ta(I289
+I195
+I307
+I190
+ta(I307
+I190
+I327
+I184
+ta(I327
+I184
+I351
+I180
+ta(I351
+I180
+I373
+I177
+ta(I373
+I177
+I395
+I176
+ta(I395
+I176
+I419
+I176
+ta(I419
+I176
+I437
+I177
+ta(I437
+I177
+I453
+I180
+ta(I453
+I180
+I457
+I185
+ta(I457
+I185
+I460
+I191
+ta(I460
+I191
+I461
+I205
+ta(I461
+I205
+I461
+I221
+ta(I461
+I221
+I458
+I243
+ta(I458
+I243
+I454
+I261
+ta(I454
+I261
+I448
+I281
+ta(I448
+I281
+I434
+I299
+ta(I434
+I299
+I418
+I317
+ta(I418
+I317
+I412
+I322
+ta(I412
+I322
+I406
+I328
+ta(I406
+I328
+I400
+I331
+ta(I400
+I331
+I386
+I333
+ta(I386
+I333
+I381
+I333
+ta(I381
+I333
+I376
+I331
+ta(I376
+I331
+I362
+I327
+ta(I362
+I327
+I346
+I311
+ta(I346
+I311
+I342
+I297
+ta(I342
+I297
+I336
+I279
+ta(I336
+I279
+I332
+I263
+ta(I332
+I263
+I329
+I245
+ta(I329
+I245
+I327
+I240
+ta(I327
+I240
+I326
+I236
+ta(I326
+I236
+I325
+I232
+ta(I325
+I232
+I324
+I229
+ta(I324
+I229
+I324
+I228
+ta(I324
+I228
+I323
+I227
+tatp4
+a(S'Green'
+p5
+I1
+(lp6
+(I100
+I31
+I101
+I31
+ta(I101
+I31
+I106
+I30
+ta(I106
+I30
+I120
+I30
+ta(I120
+I30
+I136
+I29
+ta(I136
+I29
+I156
+I29
+ta(I156
+I29
+I176
+I29
+ta(I176
+I29
+I200
+I29
+ta(I200
+I29
+I222
+I29
+ta(I222
+I29
+I244
+I29
+ta(I244
+I29
+I266
+I31
+ta(I266
+I31
+I284
+I32
+ta(I284
+I32
+I300
+I32
+ta(I300
+I32
+I305
+I33
+ta(I305
+I33
+I307
+I33
+ta(I307
+I33
+I307
+I34
+ta(I307
+I34
+I305
+I34
+ta(I305
+I34
+I287
+I34
+ta(I287
+I34
+I267
+I34
+ta(I267
+I34
+I243
+I34
+ta(I243
+I34
+I211
+I36
+ta(I211
+I36
+I183
+I37
+ta(I183
+I37
+I157
+I38
+ta(I157
+I38
+I131
+I40
+ta(I131
+I40
+I109
+I42
+ta(I109
+I42
+I89
+I43
+ta(I89
+I43
+I71
+I44
+ta(I71
+I44
+I65
+I45
+ta(I65
+I45
+I61
+I47
+ta(I61
+I47
+I59
+I48
+ta(I59
+I48
+I58
+I49
+ta(I58
+I49
+I58
+I50
+ta(I58
+I50
+I60
+I52
+ta(I60
+I52
+I64
+I53
+ta(I64
+I53
+I69
+I54
+ta(I69
+I54
+I87
+I54
+ta(I87
+I54
+I103
+I54
+ta(I103
+I54
+I123
+I54
+ta(I123
+I54
+I149
+I54
+ta(I149
+I54
+I173
+I54
+ta(I173
+I54
+I197
+I53
+ta(I197
+I53
+I219
+I52
+ta(I219
+I52
+I239
+I51
+ta(I239
+I51
+I245
+I50
+ta(I245
+I50
+I249
+I49
+ta(I249
+I49
+I247
+I49
+ta(I247
+I49
+I223
+I49
+ta(I223
+I49
+I201
+I49
+ta(I201
+I49
+I179
+I49
+ta(I179
+I49
+I155
+I51
+ta(I155
+I51
+I131
+I53
+ta(I131
+I53
+I107
+I54
+ta(I107
+I54
+I89
+I56
+ta(I89
+I56
+I71
+I58
+ta(I71
+I58
+I57
+I60
+ta(I57
+I60
+I53
+I62
+ta(I53
+I62
+I51
+I63
+ta(I51
+I63
+I51
+I64
+ta(I51
+I64
+I51
+I65
+ta(I51
+I65
+I52
+I66
+ta(I52
+I66
+I55
+I67
+ta(I55
+I67
+I61
+I67
+ta(I61
+I67
+I67
+I68
+ta(I67
+I68
+I83
+I69
+ta(I83
+I69
+I103
+I70
+ta(I103
+I70
+I125
+I70
+ta(I125
+I70
+I149
+I70
+ta(I149
+I70
+I177
+I70
+ta(I177
+I70
+I205
+I70
+ta(I205
+I70
+I229
+I70
+ta(I229
+I70
+I253
+I70
+ta(I253
+I70
+I257
+I70
+ta(I257
+I70
+I258
+I70
+ta(I258
+I70
+I255
+I70
+ta(I255
+I70
+I237
+I71
+ta(I237
+I71
+I217
+I73
+ta(I217
+I73
+I195
+I74
+ta(I195
+I74
+I165
+I76
+ta(I165
+I76
+I139
+I78
+ta(I139
+I78
+I111
+I79
+ta(I111
+I79
+I83
+I81
+ta(I83
+I81
+I57
+I84
+ta(I57
+I84
+I39
+I86
+ta(I39
+I86
+I25
+I87
+ta(I25
+I87
+I24
+I88
+ta(I24
+I88
+I24
+I89
+ta(I24
+I89
+I25
+I90
+ta(I25
+I90
+I30
+I91
+ta(I30
+I91
+I46
+I92
+ta(I46
+I92
+I66
+I93
+ta(I66
+I93
+I92
+I94
+ta(I92
+I94
+I118
+I94
+ta(I118
+I94
+I148
+I94
+ta(I148
+I94
+I178
+I94
+ta(I178
+I94
+I206
+I94
+ta(I206
+I94
+I230
+I95
+ta(I230
+I95
+I246
+I96
+ta(I246
+I96
+I250
+I97
+ta(I250
+I97
+I251
+I98
+ta(I251
+I98
+I250
+I99
+ta(I250
+I99
+I245
+I101
+ta(I245
+I101
+I229
+I102
+ta(I229
+I102
+I211
+I103
+ta(I211
+I103
+I187
+I105
+ta(I187
+I105
+I163
+I106
+ta(I163
+I106
+I139
+I109
+ta(I139
+I109
+I117
+I112
+ta(I117
+I112
+I99
+I115
+ta(I99
+I115
+I85
+I117
+ta(I85
+I117
+I81
+I120
+ta(I81
+I120
+I77
+I123
+ta(I77
+I123
+I76
+I125
+ta(I76
+I125
+I76
+I127
+ta(I76
+I127
+I79
+I130
+ta(I79
+I130
+I83
+I132
+ta(I83
+I132
+I97
+I135
+ta(I97
+I135
+I113
+I137
+ta(I113
+I137
+I131
+I137
+ta(I131
+I137
+I151
+I137
+ta(I151
+I137
+I175
+I137
+ta(I175
+I137
+I201
+I137
+ta(I201
+I137
+I229
+I137
+ta(I229
+I137
+I255
+I137
+ta(I255
+I137
+I283
+I137
+ta(I283
+I137
+I307
+I137
+ta(I307
+I137
+I312
+I137
+ta(I312
+I137
+I314
+I137
+ta(I314
+I137
+I311
+I137
+ta(I311
+I137
+I293
+I137
+ta(I293
+I137
+I271
+I137
+ta(I271
+I137
+I247
+I137
+ta(I247
+I137
+I217
+I138
+ta(I217
+I138
+I185
+I140
+ta(I185
+I140
+I155
+I142
+ta(I155
+I142
+I129
+I143
+ta(I129
+I143
+I107
+I146
+ta(I107
+I146
+I87
+I149
+ta(I87
+I149
+I82
+I151
+ta(I82
+I151
+I79
+I153
+ta(I79
+I153
+I79
+I154
+ta(I79
+I154
+I80
+I155
+ta(I80
+I155
+I84
+I156
+ta(I84
+I156
+I90
+I156
+ta(I90
+I156
+I112
+I156
+ta(I112
+I156
+I132
+I156
+ta(I132
+I156
+I156
+I154
+ta(I156
+I154
+I180
+I152
+ta(I180
+I152
+I202
+I151
+ta(I202
+I151
+I220
+I150
+ta(I220
+I150
+I234
+I149
+ta(I234
+I149
+I240
+I148
+ta(I240
+I148
+I243
+I148
+ta(I243
+I148
+I244
+I148
+ta(I244
+I148
+I243
+I148
+ta(I243
+I148
+I237
+I149
+ta(I237
+I149
+I219
+I150
+ta(I219
+I150
+I199
+I151
+ta(I199
+I151
+I173
+I153
+ta(I173
+I153
+I149
+I154
+ta(I149
+I154
+I125
+I156
+ta(I125
+I156
+I105
+I159
+ta(I105
+I159
+I89
+I161
+ta(I89
+I161
+I86
+I163
+ta(I86
+I163
+I84
+I165
+ta(I84
+I165
+I84
+I167
+ta(I84
+I167
+I85
+I168
+ta(I85
+I168
+I89
+I171
+ta(I89
+I171
+I95
+I173
+ta(I95
+I173
+I111
+I175
+ta(I111
+I175
+I129
+I177
+ta(I129
+I177
+I149
+I178
+ta(I149
+I178
+I175
+I179
+ta(I175
+I179
+I199
+I180
+ta(I199
+I180
+I225
+I182
+ta(I225
+I182
+I251
+I183
+ta(I251
+I183
+I269
+I184
+ta(I269
+I184
+I274
+I185
+ta(I274
+I185
+I275
+I186
+ta(I275
+I186
+I274
+I186
+ta(I274
+I186
+I269
+I186
+ta(I269
+I186
+I251
+I186
+ta(I251
+I186
+I229
+I186
+ta(I229
+I186
+I201
+I187
+ta(I201
+I187
+I167
+I188
+ta(I167
+I188
+I137
+I191
+ta(I137
+I191
+I107
+I192
+ta(I107
+I192
+I77
+I194
+ta(I77
+I194
+I55
+I197
+ta(I55
+I197
+I41
+I199
+ta(I41
+I199
+I36
+I201
+ta(I36
+I201
+I35
+I202
+ta(I35
+I202
+I37
+I203
+ta(I37
+I203
+I42
+I204
+ta(I42
+I204
+I48
+I204
+ta(I48
+I204
+I64
+I204
+ta(I64
+I204
+I86
+I204
+ta(I86
+I204
+I110
+I204
+ta(I110
+I204
+I136
+I204
+ta(I136
+I204
+I164
+I204
+ta(I164
+I204
+I188
+I204
+ta(I188
+I204
+I208
+I204
+ta(I208
+I204
+I213
+I204
+ta(I213
+I204
+I214
+I204
+ta(I214
+I204
+I211
+I204
+ta(I211
+I204
+I197
+I205
+ta(I197
+I205
+I179
+I205
+ta(I179
+I205
+I155
+I206
+ta(I155
+I206
+I125
+I207
+ta(I125
+I207
+I95
+I207
+ta(I95
+I207
+I69
+I209
+ta(I69
+I209
+I41
+I211
+ta(I41
+I211
+I23
+I212
+ta(I23
+I212
+I9
+I215
+ta(I9
+I215
+I6
+I216
+ta(I6
+I216
+I4
+I218
+ta(I4
+I218
+I5
+I219
+ta(I5
+I219
+I11
+I219
+ta(I11
+I219
+I27
+I220
+ta(I27
+I220
+I47
+I221
+ta(I47
+I221
+I75
+I221
+ta(I75
+I221
+I105
+I221
+ta(I105
+I221
+I137
+I221
+ta(I137
+I221
+I169
+I221
+ta(I169
+I221
+I195
+I221
+ta(I195
+I221
+I219
+I221
+ta(I219
+I221
+I225
+I222
+ta(I225
+I222
+I229
+I223
+ta(I229
+I223
+I227
+I223
+ta(I227
+I223
+I211
+I224
+ta(I211
+I224
+I191
+I225
+ta(I191
+I225
+I163
+I226
+ta(I163
+I226
+I135
+I226
+ta(I135
+I226
+I105
+I228
+ta(I105
+I228
+I73
+I230
+ta(I73
+I230
+I49
+I232
+ta(I49
+I232
+I31
+I234
+ta(I31
+I234
+I26
+I237
+ta(I26
+I237
+I23
+I238
+ta(I23
+I238
+I23
+I240
+ta(I23
+I240
+I24
+I241
+ta(I24
+I241
+I29
+I243
+ta(I29
+I243
+I47
+I244
+ta(I47
+I244
+I69
+I245
+ta(I69
+I245
+I93
+I246
+ta(I93
+I246
+I119
+I246
+ta(I119
+I246
+I147
+I246
+ta(I147
+I246
+I175
+I246
+ta(I175
+I246
+I199
+I246
+ta(I199
+I246
+I217
+I246
+ta(I217
+I246
+I222
+I247
+ta(I222
+I247
+I219
+I247
+ta(I219
+I247
+I201
+I248
+ta(I201
+I248
+I181
+I249
+ta(I181
+I249
+I157
+I251
+ta(I157
+I251
+I127
+I252
+ta(I127
+I252
+I97
+I254
+ta(I97
+I254
+I67
+I256
+ta(I67
+I256
+I45
+I258
+ta(I45
+I258
+I27
+I260
+ta(I27
+I260
+I24
+I262
+ta(I24
+I262
+I24
+I263
+ta(I24
+I263
+I24
+I264
+ta(I24
+I264
+I26
+I266
+ta(I26
+I266
+I30
+I267
+ta(I30
+I267
+I50
+I269
+ta(I50
+I269
+I68
+I270
+ta(I68
+I270
+I92
+I272
+ta(I92
+I272
+I118
+I273
+ta(I118
+I273
+I144
+I274
+ta(I144
+I274
+I170
+I275
+ta(I170
+I275
+I196
+I277
+ta(I196
+I277
+I220
+I278
+ta(I220
+I278
+I226
+I280
+ta(I226
+I280
+I228
+I280
+ta(I228
+I280
+I228
+I281
+ta(I228
+I281
+I227
+I281
+ta(I227
+I281
+I223
+I281
+ta(I223
+I281
+I205
+I281
+ta(I205
+I281
+I181
+I281
+ta(I181
+I281
+I153
+I282
+ta(I153
+I282
+I125
+I284
+ta(I125
+I284
+I105
+I285
+ta(I105
+I285
+I91
+I286
+ta(I91
+I286
+I87
+I287
+ta(I87
+I287
+I85
+I288
+ta(I85
+I288
+I87
+I289
+ta(I87
+I289
+I101
+I289
+ta(I101
+I289
+I117
+I288
+ta(I117
+I288
+I137
+I287
+ta(I137
+I287
+I159
+I285
+ta(I159
+I285
+I183
+I284
+ta(I183
+I284
+I203
+I283
+ta(I203
+I283
+I219
+I282
+ta(I219
+I282
+I222
+I281
+ta(I222
+I281
+I218
+I281
+ta(I218
+I281
+I196
+I282
+ta(I196
+I282
+I176
+I284
+ta(I176
+I284
+I146
+I287
+ta(I146
+I287
+I118
+I289
+ta(I118
+I289
+I92
+I293
+ta(I92
+I293
+I66
+I297
+ta(I66
+I297
+I50
+I300
+ta(I50
+I300
+I36
+I303
+ta(I36
+I303
+I33
+I306
+ta(I33
+I306
+I32
+I308
+ta(I32
+I308
+I33
+I310
+ta(I33
+I310
+I36
+I312
+ta(I36
+I312
+I50
+I314
+ta(I50
+I314
+I66
+I315
+ta(I66
+I315
+I88
+I316
+ta(I88
+I316
+I114
+I316
+ta(I114
+I316
+I140
+I316
+ta(I140
+I316
+I168
+I316
+ta(I168
+I316
+I196
+I316
+ta(I196
+I316
+I220
+I316
+ta(I220
+I316
+I238
+I316
+ta(I238
+I316
+I243
+I316
+ta(I243
+I316
+I242
+I316
+ta(I242
+I316
+I239
+I316
+ta(I239
+I316
+I223
+I317
+ta(I223
+I317
+I203
+I318
+ta(I203
+I318
+I177
+I318
+ta(I177
+I318
+I143
+I318
+ta(I143
+I318
+I111
+I319
+ta(I111
+I319
+I79
+I321
+ta(I79
+I321
+I51
+I323
+ta(I51
+I323
+I31
+I324
+ta(I31
+I324
+I15
+I327
+ta(I15
+I327
+I12
+I329
+ta(I12
+I329
+I11
+I331
+ta(I11
+I331
+I11
+I332
+ta(I11
+I332
+I14
+I334
+ta(I14
+I334
+I20
+I336
+ta(I20
+I336
+I36
+I338
+ta(I36
+I338
+I56
+I339
+ta(I56
+I339
+I82
+I340
+ta(I82
+I340
+I110
+I340
+ta(I110
+I340
+I142
+I340
+ta(I142
+I340
+I174
+I340
+ta(I174
+I340
+I204
+I340
+ta(I204
+I340
+I230
+I340
+ta(I230
+I340
+I254
+I340
+ta(I254
+I340
+I258
+I340
+ta(I258
+I340
+I257
+I340
+ta(I257
+I340
+I254
+I339
+ta(I254
+I339
+I238
+I337
+ta(I238
+I337
+I214
+I336
+ta(I214
+I336
+I178
+I335
+ta(I178
+I335
+I142
+I335
+ta(I142
+I335
+I108
+I335
+ta(I108
+I335
+I78
+I335
+ta(I78
+I335
+I50
+I336
+ta(I50
+I336
+I34
+I338
+ta(I34
+I338
+I30
+I340
+ta(I30
+I340
+I29
+I341
+ta(I29
+I341
+I30
+I342
+ta(I30
+I342
+I34
+I343
+ta(I34
+I343
+I50
+I345
+ta(I50
+I345
+I72
+I345
+ta(I72
+I345
+I96
+I345
+ta(I96
+I345
+I132
+I345
+ta(I132
+I345
+I168
+I345
+ta(I168
+I345
+I202
+I345
+ta(I202
+I345
+I230
+I345
+ta(I230
+I345
+I252
+I345
+ta(I252
+I345
+I258
+I345
+ta(I258
+I345
+I258
+I344
+ta(I258
+I344
+I256
+I344
+ta(I256
+I344
+I240
+I343
+ta(I240
+I343
+I220
+I343
+ta(I220
+I343
+I192
+I343
+ta(I192
+I343
+I160
+I343
+ta(I160
+I343
+I122
+I343
+ta(I122
+I343
+I86
+I344
+ta(I86
+I344
+I54
+I346
+ta(I54
+I346
+I26
+I349
+ta(I26
+I349
+I4
+I352
+ta(I4
+I352
+I0
+I355
+ta(I0
+I355
+I-1
+I358
+ta(I-1
+I358
+I2
+I361
+ta(I2
+I361
+I18
+I363
+ta(I18
+I363
+I40
+I364
+ta(I40
+I364
+I70
+I366
+ta(I70
+I366
+I106
+I367
+ta(I106
+I367
+I140
+I368
+ta(I140
+I368
+I172
+I368
+ta(I172
+I368
+I202
+I368
+ta(I202
+I368
+I222
+I368
+ta(I222
+I368
+I227
+I368
+ta(I227
+I368
+I228
+I369
+ta(I228
+I369
+I227
+I369
+ta(I227
+I369
+I225
+I370
+ta(I225
+I370
+I220
+I371
+ta(I220
+I371
+I206
+I373
+ta(I206
+I373
+I192
+I373
+ta(I192
+I373
+I186
+I374
+ta(I186
+I374
+I183
+I374
+ta(I183
+I374
+I182
+I374
+ta(I182
+I374
+I162
+I372
+ta(I162
+I372
+I138
+I366
+ta(I138
+I366
+I114
+I364
+ta(I114
+I364
+I92
+I364
+ta(I92
+I364
+I68
+I364
+ta(I68
+I364
+I50
+I364
+ta(I50
+I364
+I30
+I364
+ta(I30
+I364
+I8
+I364
+ta(I8
+I364
+I-8
+I365
+ta(I-8
+I365
+I-26
+I367
+ta(I-26
+I367
+I-32
+I370
+ta(I-32
+I370
+I-37
+I374
+ta(I-37
+I374
+I-40
+I378
+ta(I-40
+I378
+I-41
+I381
+ta(I-41
+I381
+I-41
+I385
+ta(I-41
+I385
+I-39
+I388
+ta(I-39
+I388
+I-35
+I391
+ta(I-35
+I391
+I-19
+I393
+ta(I-19
+I393
+I-3
+I394
+ta(I-3
+I394
+I19
+I395
+ta(I19
+I395
+I47
+I396
+ta(I47
+I396
+I79
+I396
+ta(I79
+I396
+I109
+I396
+ta(I109
+I396
+I141
+I396
+ta(I141
+I396
+I169
+I393
+ta(I169
+I393
+I195
+I392
+ta(I195
+I392
+I213
+I390
+ta(I213
+I390
+I217
+I389
+ta(I217
+I389
+I218
+I388
+ta(I218
+I388
+I218
+I387
+ta(I218
+I387
+I215
+I386
+ta(I215
+I386
+I201
+I386
+ta(I201
+I386
+I181
+I386
+ta(I181
+I386
+I153
+I386
+ta(I153
+I386
+I123
+I387
+ta(I123
+I387
+I91
+I389
+ta(I91
+I389
+I63
+I392
+ta(I63
+I392
+I39
+I395
+ta(I39
+I395
+I17
+I398
+ta(I17
+I398
+I3
+I401
+ta(I3
+I401
+I-3
+I404
+ta(I-3
+I404
+I-6
+I407
+ta(I-6
+I407
+I-7
+I410
+ta(I-7
+I410
+I-6
+I412
+ta(I-6
+I412
+I-1
+I415
+ta(I-1
+I415
+I13
+I417
+ta(I13
+I417
+I35
+I419
+ta(I35
+I419
+I59
+I420
+ta(I59
+I420
+I83
+I421
+ta(I83
+I421
+I111
+I422
+ta(I111
+I422
+I137
+I422
+ta(I137
+I422
+I161
+I422
+ta(I161
+I422
+I185
+I424
+ta(I185
+I424
+I191
+I425
+ta(I191
+I425
+I196
+I427
+ta(I196
+I427
+I197
+I429
+ta(I197
+I429
+I197
+I430
+ta(I197
+I430
+I195
+I431
+ta(I195
+I431
+I191
+I432
+ta(I191
+I432
+I173
+I434
+ta(I173
+I434
+I153
+I436
+ta(I153
+I436
+I129
+I438
+ta(I129
+I438
+I101
+I440
+ta(I101
+I440
+I71
+I441
+ta(I71
+I441
+I43
+I444
+ta(I43
+I444
+I19
+I447
+ta(I19
+I447
+I1
+I451
+ta(I1
+I451
+I-13
+I455
+ta(I-13
+I455
+I-16
+I460
+ta(I-16
+I460
+I-17
+I463
+ta(I-17
+I463
+I-17
+I466
+ta(I-17
+I466
+I-14
+I469
+ta(I-14
+I469
+I0
+I471
+ta(I0
+I471
+I16
+I473
+ta(I16
+I473
+I38
+I474
+ta(I38
+I474
+I60
+I474
+ta(I60
+I474
+I86
+I474
+ta(I86
+I474
+I110
+I472
+ta(I110
+I472
+I134
+I471
+ta(I134
+I471
+I154
+I470
+ta(I154
+I470
+I172
+I468
+ta(I172
+I468
+I177
+I467
+ta(I177
+I467
+I181
+I467
+ta(I181
+I467
+I182
+I467
+ta(I182
+I467
+I181
+I467
+ta(I181
+I467
+I178
+I467
+ta(I178
+I467
+I173
+I467
+ta(I173
+I467
+I155
+I468
+ta(I155
+I468
+I133
+I469
+ta(I133
+I469
+I115
+I470
+ta(I115
+I470
+I95
+I472
+ta(I95
+I472
+I79
+I474
+ta(I79
+I474
+I65
+I476
+ta(I65
+I476
+I60
+I478
+ta(I60
+I478
+I57
+I480
+ta(I57
+I480
+I55
+I482
+ta(I55
+I482
+I55
+I483
+ta(I55
+I483
+I55
+I484
+ta(I55
+I484
+I57
+I485
+ta(I57
+I485
+I60
+I486
+ta(I60
+I486
+I74
+I486
+ta(I74
+I486
+I94
+I486
+ta(I94
+I486
+I114
+I485
+ta(I114
+I485
+I138
+I483
+ta(I138
+I483
+I166
+I482
+ta(I166
+I482
+I194
+I480
+ta(I194
+I480
+I218
+I478
+ta(I218
+I478
+I240
+I477
+ta(I240
+I477
+I245
+I476
+ta(I245
+I476
+I247
+I475
+ta(I247
+I475
+I247
+I474
+ta(I247
+I474
+I245
+I473
+ta(I245
+I473
+I231
+I471
+ta(I231
+I471
+I209
+I470
+ta(I209
+I470
+I181
+I468
+ta(I181
+I468
+I149
+I468
+ta(I149
+I468
+I115
+I468
+ta(I115
+I468
+I81
+I468
+ta(I81
+I468
+I55
+I469
+ta(I55
+I469
+I35
+I471
+ta(I35
+I471
+I29
+I473
+ta(I29
+I473
+I27
+I474
+ta(I27
+I474
+I27
+I475
+ta(I27
+I475
+I28
+I476
+ta(I28
+I476
+I32
+I477
+ta(I32
+I477
+I38
+I478
+ta(I38
+I478
+I56
+I479
+ta(I56
+I479
+I80
+I480
+ta(I80
+I480
+I104
+I480
+ta(I104
+I480
+I128
+I480
+ta(I128
+I480
+I158
+I480
+ta(I158
+I480
+I184
+I480
+ta(I184
+I480
+I208
+I481
+ta(I208
+I481
+I228
+I483
+ta(I228
+I483
+I234
+I484
+ta(I234
+I484
+I240
+I485
+ta(I240
+I485
+I241
+I486
+ta(I241
+I486
+I239
+I487
+ta(I239
+I487
+I223
+I488
+ta(I223
+I488
+I203
+I489
+ta(I203
+I489
+I173
+I491
+ta(I173
+I491
+I141
+I492
+ta(I141
+I492
+I105
+I492
+ta(I105
+I492
+I73
+I492
+ta(I73
+I492
+I47
+I494
+ta(I47
+I494
+I31
+I495
+ta(I31
+I495
+I27
+I497
+ta(I27
+I497
+I25
+I498
+ta(I25
+I498
+I26
+I499
+ta(I26
+I499
+I30
+I500
+ta(I30
+I500
+I36
+I501
+ta(I36
+I501
+I56
+I501
+ta(I56
+I501
+I80
+I501
+ta(I80
+I501
+I104
+I501
+ta(I104
+I501
+I130
+I501
+ta(I130
+I501
+I156
+I501
+ta(I156
+I501
+I182
+I501
+ta(I182
+I501
+I208
+I501
+ta(I208
+I501
+I228
+I501
+ta(I228
+I501
+I244
+I502
+ta(I244
+I502
+I246
+I502
+ta(I246
+I502
+I244
+I502
+ta(I244
+I502
+I230
+I503
+ta(I230
+I503
+I212
+I505
+ta(I212
+I505
+I188
+I506
+ta(I188
+I506
+I160
+I508
+ta(I160
+I508
+I132
+I510
+ta(I132
+I510
+I106
+I511
+ta(I106
+I511
+I78
+I515
+ta(I78
+I515
+I58
+I518
+ta(I58
+I518
+I44
+I521
+ta(I44
+I521
+I40
+I524
+ta(I40
+I524
+I38
+I527
+ta(I38
+I527
+I37
+I530
+ta(I37
+I530
+I39
+I531
+ta(I39
+I531
+I41
+I533
+ta(I41
+I533
+I47
+I534
+ta(I47
+I534
+I61
+I535
+ta(I61
+I535
+I77
+I535
+ta(I77
+I535
+I97
+I535
+ta(I97
+I535
+I119
+I535
+ta(I119
+I535
+I141
+I535
+ta(I141
+I535
+I163
+I535
+ta(I163
+I535
+I187
+I535
+ta(I187
+I535
+I207
+I535
+ta(I207
+I535
+I225
+I535
+ta(I225
+I535
+I231
+I535
+ta(I231
+I535
+I234
+I535
+ta(I234
+I535
+I235
+I535
+ta(I235
+I535
+I232
+I535
+ta(I232
+I535
+I216
+I535
+ta(I216
+I535
+I196
+I535
+ta(I196
+I535
+I174
+I536
+ta(I174
+I536
+I150
+I536
+ta(I150
+I536
+I120
+I536
+ta(I120
+I536
+I90
+I538
+ta(I90
+I538
+I64
+I539
+ta(I64
+I539
+I42
+I541
+ta(I42
+I541
+I24
+I542
+ta(I24
+I542
+I22
+I543
+ta(I22
+I543
+I21
+I543
+ta(I21
+I543
+I23
+I543
+ta(I23
+I543
+I27
+I543
+ta(I27
+I543
+I47
+I543
+ta(I47
+I543
+I67
+I543
+ta(I67
+I543
+I91
+I543
+ta(I91
+I543
+I123
+I543
+ta(I123
+I543
+I153
+I543
+ta(I153
+I543
+I187
+I543
+ta(I187
+I543
+I217
+I543
+ta(I217
+I543
+I247
+I543
+ta(I247
+I543
+I281
+I543
+ta(I281
+I543
+I311
+I544
+ta(I311
+I544
+I341
+I544
+ta(I341
+I544
+I373
+I544
+ta(I373
+I544
+I401
+I544
+ta(I401
+I544
+I427
+I544
+ta(I427
+I544
+I451
+I544
+ta(I451
+I544
+I471
+I544
+ta(I471
+I544
+I487
+I543
+ta(I487
+I543
+I491
+I542
+ta(I491
+I542
+I493
+I542
+ta(I493
+I542
+I491
+I541
+ta(I491
+I541
+I477
+I538
+ta(I477
+I538
+I461
+I536
+ta(I461
+I536
+I437
+I534
+ta(I437
+I534
+I405
+I533
+ta(I405
+I533
+I373
+I532
+ta(I373
+I532
+I339
+I532
+ta(I339
+I532
+I309
+I532
+ta(I309
+I532
+I279
+I532
+ta(I279
+I532
+I257
+I532
+ta(I257
+I532
+I251
+I533
+ta(I251
+I533
+I249
+I533
+ta(I249
+I533
+I248
+I533
+ta(I248
+I533
+I250
+I533
+ta(I250
+I533
+I254
+I535
+ta(I254
+I535
+I260
+I536
+ta(I260
+I536
+I278
+I536
+ta(I278
+I536
+I300
+I537
+ta(I300
+I537
+I324
+I537
+ta(I324
+I537
+I348
+I537
+ta(I348
+I537
+I374
+I537
+ta(I374
+I537
+I398
+I537
+ta(I398
+I537
+I420
+I536
+ta(I420
+I536
+I444
+I535
+ta(I444
+I535
+I466
+I535
+ta(I466
+I535
+I486
+I535
+ta(I486
+I535
+I504
+I535
+ta(I504
+I535
+I510
+I535
+ta(I510
+I535
+I513
+I535
+ta(I513
+I535
+I514
+I535
+ta(I514
+I535
+I511
+I535
+ta(I511
+I535
+I493
+I534
+ta(I493
+I534
+I467
+I533
+ta(I467
+I533
+I435
+I532
+ta(I435
+I532
+I399
+I532
+ta(I399
+I532
+I355
+I531
+ta(I355
+I531
+I307
+I530
+ta(I307
+I530
+I269
+I530
+ta(I269
+I530
+I237
+I530
+ta(I237
+I530
+I209
+I530
+ta(I209
+I530
+I191
+I530
+ta(I191
+I530
+I186
+I530
+ta(I186
+I530
+I184
+I530
+ta(I184
+I530
+I187
+I529
+ta(I187
+I529
+I201
+I529
+ta(I201
+I529
+I221
+I527
+ta(I221
+I527
+I243
+I526
+ta(I243
+I526
+I269
+I524
+ta(I269
+I524
+I305
+I523
+ta(I305
+I523
+I333
+I521
+ta(I333
+I521
+I363
+I519
+ta(I363
+I519
+I393
+I517
+ta(I393
+I517
+I417
+I516
+ta(I417
+I516
+I439
+I515
+ta(I439
+I515
+I444
+I514
+ta(I444
+I514
+I445
+I513
+ta(I445
+I513
+I442
+I513
+ta(I442
+I513
+I422
+I512
+ta(I422
+I512
+I398
+I512
+ta(I398
+I512
+I370
+I512
+ta(I370
+I512
+I334
+I511
+ta(I334
+I511
+I296
+I511
+ta(I296
+I511
+I266
+I511
+ta(I266
+I511
+I236
+I511
+ta(I236
+I511
+I216
+I511
+ta(I216
+I511
+I211
+I510
+ta(I211
+I510
+I208
+I509
+ta(I208
+I509
+I208
+I508
+ta(I208
+I508
+I210
+I507
+ta(I210
+I507
+I224
+I505
+ta(I224
+I505
+I244
+I502
+ta(I244
+I502
+I268
+I500
+ta(I268
+I500
+I304
+I497
+ta(I304
+I497
+I346
+I495
+ta(I346
+I495
+I388
+I492
+ta(I388
+I492
+I428
+I490
+ta(I428
+I490
+I466
+I487
+ta(I466
+I487
+I492
+I485
+ta(I492
+I485
+I512
+I484
+ta(I512
+I484
+I516
+I482
+ta(I516
+I482
+I516
+I481
+ta(I516
+I481
+I513
+I479
+ta(I513
+I479
+I499
+I476
+ta(I499
+I476
+I475
+I475
+ta(I475
+I475
+I445
+I474
+ta(I445
+I474
+I403
+I473
+ta(I403
+I473
+I357
+I472
+ta(I357
+I472
+I313
+I471
+ta(I313
+I471
+I269
+I471
+ta(I269
+I471
+I235
+I471
+ta(I235
+I471
+I207
+I471
+ta(I207
+I471
+I191
+I471
+ta(I191
+I471
+I189
+I471
+ta(I189
+I471
+I194
+I471
+ta(I194
+I471
+I214
+I470
+ta(I214
+I470
+I240
+I468
+ta(I240
+I468
+I274
+I466
+ta(I274
+I466
+I316
+I463
+ta(I316
+I463
+I354
+I461
+ta(I354
+I461
+I396
+I459
+ta(I396
+I459
+I434
+I457
+ta(I434
+I457
+I462
+I456
+ta(I462
+I456
+I478
+I455
+ta(I478
+I455
+I498
+I454
+ta(I498
+I454
+I502
+I453
+ta(I502
+I453
+I499
+I452
+ta(I499
+I452
+I477
+I451
+ta(I477
+I451
+I451
+I451
+ta(I451
+I451
+I447
+I451
+ta(I447
+I451
+I415
+I450
+ta(I415
+I450
+I375
+I449
+ta(I375
+I449
+I339
+I449
+ta(I339
+I449
+I307
+I449
+ta(I307
+I449
+I281
+I449
+ta(I281
+I449
+I267
+I449
+ta(I267
+I449
+I266
+I448
+ta(I266
+I448
+I267
+I448
+ta(I267
+I448
+I273
+I446
+ta(I273
+I446
+I291
+I444
+ta(I291
+I444
+I315
+I440
+ta(I315
+I440
+I349
+I436
+ta(I349
+I436
+I385
+I432
+ta(I385
+I432
+I425
+I427
+ta(I425
+I427
+I459
+I423
+ta(I459
+I423
+I493
+I419
+ta(I493
+I419
+I519
+I416
+ta(I519
+I416
+I543
+I414
+ta(I543
+I414
+I548
+I413
+ta(I548
+I413
+I548
+I412
+ta(I548
+I412
+I547
+I412
+ta(I547
+I412
+I531
+I410
+ta(I531
+I410
+I511
+I410
+ta(I511
+I410
+I483
+I410
+ta(I483
+I410
+I449
+I410
+ta(I449
+I410
+I419
+I410
+ta(I419
+I410
+I381
+I410
+ta(I381
+I410
+I345
+I410
+ta(I345
+I410
+I317
+I410
+ta(I317
+I410
+I297
+I410
+ta(I297
+I410
+I292
+I410
+ta(I292
+I410
+I294
+I410
+ta(I294
+I410
+I308
+I409
+ta(I308
+I409
+I332
+I406
+ta(I332
+I406
+I356
+I404
+ta(I356
+I404
+I384
+I402
+ta(I384
+I402
+I418
+I400
+ta(I418
+I400
+I446
+I398
+ta(I446
+I398
+I472
+I396
+ta(I472
+I396
+I496
+I394
+ta(I496
+I394
+I512
+I391
+ta(I512
+I391
+I514
+I390
+ta(I514
+I390
+I514
+I389
+ta(I514
+I389
+I511
+I387
+ta(I511
+I387
+I497
+I385
+ta(I497
+I385
+I477
+I384
+ta(I477
+I384
+I445
+I384
+ta(I445
+I384
+I409
+I384
+ta(I409
+I384
+I375
+I384
+ta(I375
+I384
+I335
+I384
+ta(I335
+I384
+I297
+I384
+ta(I297
+I384
+I269
+I384
+ta(I269
+I384
+I243
+I384
+ta(I243
+I384
+I229
+I384
+ta(I229
+I384
+I226
+I382
+ta(I226
+I382
+I228
+I381
+ta(I228
+I381
+I244
+I378
+ta(I244
+I378
+I266
+I375
+ta(I266
+I375
+I292
+I372
+ta(I292
+I372
+I326
+I367
+ta(I326
+I367
+I362
+I364
+ta(I362
+I364
+I400
+I359
+ta(I400
+I359
+I434
+I356
+ta(I434
+I356
+I464
+I353
+ta(I464
+I353
+I494
+I349
+ta(I494
+I349
+I516
+I347
+ta(I516
+I347
+I521
+I346
+ta(I521
+I346
+I522
+I345
+ta(I522
+I345
+I521
+I345
+ta(I521
+I345
+I516
+I344
+ta(I516
+I344
+I498
+I344
+ta(I498
+I344
+I472
+I345
+ta(I472
+I345
+I438
+I346
+ta(I438
+I346
+I398
+I347
+ta(I398
+I347
+I356
+I348
+ta(I356
+I348
+I322
+I350
+ta(I322
+I350
+I288
+I352
+ta(I288
+I352
+I262
+I353
+ta(I262
+I353
+I240
+I355
+ta(I240
+I355
+I236
+I355
+ta(I236
+I355
+I235
+I356
+ta(I235
+I356
+I236
+I356
+ta(I236
+I356
+I242
+I356
+ta(I242
+I356
+I260
+I355
+ta(I260
+I355
+I286
+I353
+ta(I286
+I353
+I312
+I349
+ta(I312
+I349
+I348
+I347
+ta(I348
+I347
+I380
+I345
+ta(I380
+I345
+I420
+I342
+ta(I420
+I342
+I454
+I340
+ta(I454
+I340
+I486
+I338
+ta(I486
+I338
+I512
+I334
+ta(I512
+I334
+I534
+I332
+ta(I534
+I332
+I539
+I330
+ta(I539
+I330
+I541
+I329
+ta(I541
+I329
+I538
+I328
+ta(I538
+I328
+I516
+I328
+ta(I516
+I328
+I494
+I328
+ta(I494
+I328
+I464
+I328
+ta(I464
+I328
+I426
+I328
+ta(I426
+I328
+I392
+I328
+ta(I392
+I328
+I360
+I328
+ta(I360
+I328
+I330
+I328
+ta(I330
+I328
+I306
+I328
+ta(I306
+I328
+I292
+I328
+ta(I292
+I328
+I290
+I327
+ta(I290
+I327
+I290
+I326
+ta(I290
+I326
+I291
+I326
+ta(I291
+I326
+I296
+I324
+ta(I296
+I324
+I314
+I321
+ta(I314
+I321
+I334
+I318
+ta(I334
+I318
+I360
+I315
+ta(I360
+I315
+I388
+I311
+ta(I388
+I311
+I416
+I308
+ta(I416
+I308
+I444
+I304
+ta(I444
+I304
+I472
+I301
+ta(I472
+I301
+I496
+I298
+ta(I496
+I298
+I516
+I295
+ta(I516
+I295
+I520
+I293
+ta(I520
+I293
+I522
+I291
+ta(I522
+I291
+I522
+I290
+ta(I522
+I290
+I519
+I288
+ta(I519
+I288
+I503
+I286
+ta(I503
+I286
+I483
+I285
+ta(I483
+I285
+I457
+I285
+ta(I457
+I285
+I425
+I285
+ta(I425
+I285
+I385
+I285
+ta(I385
+I285
+I353
+I285
+ta(I353
+I285
+I317
+I287
+ta(I317
+I287
+I289
+I288
+ta(I289
+I288
+I267
+I290
+ta(I267
+I290
+I263
+I291
+ta(I263
+I291
+I262
+I291
+ta(I262
+I291
+I266
+I291
+ta(I266
+I291
+I286
+I290
+ta(I286
+I290
+I308
+I288
+ta(I308
+I288
+I334
+I286
+ta(I334
+I286
+I368
+I284
+ta(I368
+I284
+I406
+I281
+ta(I406
+I281
+I438
+I279
+ta(I438
+I279
+I470
+I277
+ta(I470
+I277
+I496
+I275
+ta(I496
+I275
+I512
+I274
+ta(I512
+I274
+I515
+I272
+ta(I515
+I272
+I515
+I271
+ta(I515
+I271
+I513
+I270
+ta(I513
+I270
+I499
+I269
+ta(I499
+I269
+I477
+I267
+ta(I477
+I267
+I451
+I266
+ta(I451
+I266
+I423
+I266
+ta(I423
+I266
+I389
+I266
+ta(I389
+I266
+I355
+I266
+ta(I355
+I266
+I327
+I266
+ta(I327
+I266
+I305
+I265
+ta(I305
+I265
+I299
+I263
+ta(I299
+I263
+I298
+I262
+ta(I298
+I262
+I298
+I261
+ta(I298
+I261
+I301
+I258
+ta(I301
+I258
+I307
+I254
+ta(I307
+I254
+I329
+I249
+ta(I329
+I249
+I351
+I244
+ta(I351
+I244
+I375
+I239
+ta(I375
+I239
+I401
+I233
+ta(I401
+I233
+I431
+I228
+ta(I431
+I228
+I457
+I214
+ta(I457
+I214
+I477
+I211
+ta(I477
+I211
+I495
+I206
+ta(I495
+I206
+I499
+I202
+ta(I499
+I202
+I500
+I199
+ta(I500
+I199
+I500
+I196
+ta(I500
+I196
+I497
+I194
+ta(I497
+I194
+I483
+I193
+ta(I483
+I193
+I467
+I191
+ta(I467
+I191
+I445
+I191
+ta(I445
+I191
+I419
+I191
+ta(I419
+I191
+I395
+I192
+ta(I395
+I192
+I369
+I194
+ta(I369
+I194
+I347
+I195
+ta(I347
+I195
+I329
+I196
+ta(I329
+I196
+I324
+I197
+ta(I324
+I197
+I320
+I198
+ta(I320
+I198
+I323
+I198
+ta(I323
+I198
+I343
+I195
+ta(I343
+I195
+I361
+I193
+ta(I361
+I193
+I379
+I190
+ta(I379
+I190
+I397
+I187
+ta(I397
+I187
+I417
+I185
+ta(I417
+I185
+I435
+I182
+ta(I435
+I182
+I451
+I180
+ta(I451
+I180
+I456
+I178
+ta(I456
+I178
+I458
+I177
+ta(I458
+I177
+I459
+I176
+ta(I459
+I176
+I458
+I176
+ta(I458
+I176
+I454
+I176
+ta(I454
+I176
+I438
+I177
+ta(I438
+I177
+I418
+I178
+ta(I418
+I178
+I396
+I181
+ta(I396
+I181
+I372
+I185
+ta(I372
+I185
+I344
+I188
+ta(I344
+I188
+I318
+I192
+ta(I318
+I192
+I294
+I195
+ta(I294
+I195
+I276
+I198
+ta(I276
+I198
+I272
+I200
+ta(I272
+I200
+I271
+I201
+ta(I271
+I201
+I274
+I201
+ta(I274
+I201
+I290
+I199
+ta(I290
+I199
+I310
+I196
+ta(I310
+I196
+I332
+I193
+ta(I332
+I193
+I352
+I190
+ta(I352
+I190
+I376
+I187
+ta(I376
+I187
+I396
+I185
+ta(I396
+I185
+I412
+I182
+ta(I412
+I182
+I428
+I181
+ta(I428
+I181
+I429
+I180
+ta(I429
+I180
+I430
+I180
+ta(I430
+I180
+I428
+I180
+ta(I428
+I180
+I414
+I180
+ta(I414
+I180
+I396
+I182
+ta(I396
+I182
+I372
+I185
+ta(I372
+I185
+I346
+I188
+ta(I346
+I188
+I316
+I192
+ta(I316
+I192
+I290
+I194
+ta(I290
+I194
+I268
+I197
+ta(I268
+I197
+I250
+I200
+ta(I250
+I200
+I236
+I202
+ta(I236
+I202
+I231
+I203
+ta(I231
+I203
+I228
+I204
+ta(I228
+I204
+I226
+I204
+ta(I226
+I204
+I228
+I204
+ta(I228
+I204
+I234
+I202
+ta(I234
+I202
+I250
+I200
+ta(I250
+I200
+I270
+I197
+ta(I270
+I197
+I296
+I193
+ta(I296
+I193
+I324
+I189
+ta(I324
+I189
+I356
+I185
+ta(I356
+I185
+I392
+I181
+ta(I392
+I181
+I420
+I177
+ta(I420
+I177
+I446
+I175
+ta(I446
+I175
+I468
+I174
+ta(I468
+I174
+I471
+I174
+ta(I471
+I174
+I472
+I174
+ta(I472
+I174
+I471
+I174
+ta(I471
+I174
+I466
+I178
+ta(I466
+I178
+I448
+I181
+ta(I448
+I181
+I420
+I185
+ta(I420
+I185
+I390
+I189
+ta(I390
+I189
+I354
+I194
+ta(I354
+I194
+I318
+I197
+ta(I318
+I197
+I276
+I199
+ta(I276
+I199
+I246
+I201
+ta(I246
+I201
+I216
+I203
+ta(I216
+I203
+I190
+I204
+ta(I190
+I204
+I172
+I205
+ta(I172
+I205
+I166
+I206
+ta(I166
+I206
+I164
+I206
+ta(I164
+I206
+I164
+I207
+ta(I164
+I207
+I168
+I207
+ta(I168
+I207
+I188
+I207
+ta(I188
+I207
+I208
+I208
+ta(I208
+I208
+I232
+I208
+ta(I232
+I208
+I262
+I208
+ta(I262
+I208
+I294
+I209
+ta(I294
+I209
+I328
+I210
+ta(I328
+I210
+I358
+I212
+ta(I358
+I212
+I392
+I215
+ta(I392
+I215
+I424
+I217
+ta(I424
+I217
+I454
+I220
+ta(I454
+I220
+I478
+I223
+ta(I478
+I223
+I484
+I227
+ta(I484
+I227
+I485
+I229
+ta(I485
+I229
+I484
+I232
+ta(I484
+I232
+I478
+I235
+ta(I478
+I235
+I458
+I240
+ta(I458
+I240
+I426
+I244
+ta(I426
+I244
+I390
+I248
+ta(I390
+I248
+I352
+I253
+ta(I352
+I253
+I308
+I258
+ta(I308
+I258
+I276
+I261
+ta(I276
+I261
+I250
+I264
+ta(I250
+I264
+I226
+I268
+ta(I226
+I268
+I212
+I270
+ta(I212
+I270
+I208
+I272
+ta(I208
+I272
+I207
+I273
+ta(I207
+I273
+I206
+I273
+ta(I206
+I273
+I207
+I274
+ta(I207
+I274
+I213
+I274
+ta(I213
+I274
+I231
+I272
+ta(I231
+I272
+I255
+I269
+ta(I255
+I269
+I281
+I266
+ta(I281
+I266
+I309
+I263
+ta(I309
+I263
+I343
+I259
+ta(I343
+I259
+I373
+I255
+ta(I373
+I255
+I403
+I252
+ta(I403
+I252
+I429
+I248
+ta(I429
+I248
+I451
+I246
+ta(I451
+I246
+I467
+I243
+ta(I467
+I243
+I471
+I241
+ta(I471
+I241
+I469
+I240
+ta(I469
+I240
+I453
+I240
+ta(I453
+I240
+I433
+I240
+ta(I433
+I240
+I405
+I240
+ta(I405
+I240
+I375
+I242
+ta(I375
+I242
+I337
+I244
+ta(I337
+I244
+I305
+I246
+ta(I305
+I246
+I269
+I247
+ta(I269
+I247
+I239
+I249
+ta(I239
+I249
+I213
+I249
+ta(I213
+I249
+I189
+I249
+ta(I189
+I249
+I175
+I250
+ta(I175
+I250
+I173
+I251
+ta(I173
+I251
+I174
+I251
+ta(I174
+I251
+I188
+I247
+ta(I188
+I247
+I210
+I244
+ta(I210
+I244
+I238
+I239
+ta(I238
+I239
+I272
+I233
+ta(I272
+I233
+I304
+I230
+ta(I304
+I230
+I342
+I216
+ta(I342
+I216
+I380
+I202
+ta(I380
+I202
+I410
+I188
+ta(I410
+I188
+I440
+I174
+ta(I440
+I174
+I464
+I168
+ta(I464
+I168
+I480
+I164
+ta(I480
+I164
+I484
+I160
+ta(I484
+I160
+I484
+I158
+ta(I484
+I158
+I482
+I156
+ta(I482
+I156
+I468
+I154
+ta(I468
+I154
+I446
+I152
+ta(I446
+I152
+I418
+I152
+ta(I418
+I152
+I384
+I152
+ta(I384
+I152
+I340
+I152
+ta(I340
+I152
+I300
+I153
+ta(I300
+I153
+I268
+I155
+ta(I268
+I155
+I238
+I157
+ta(I238
+I157
+I220
+I158
+ta(I220
+I158
+I218
+I158
+ta(I218
+I158
+I219
+I158
+ta(I219
+I158
+I235
+I157
+ta(I235
+I157
+I255
+I154
+ta(I255
+I154
+I281
+I151
+ta(I281
+I151
+I313
+I147
+ta(I313
+I147
+I345
+I144
+ta(I345
+I144
+I377
+I140
+ta(I377
+I140
+I407
+I137
+ta(I407
+I137
+I431
+I134
+ta(I431
+I134
+I449
+I132
+ta(I449
+I132
+I451
+I131
+ta(I451
+I131
+I452
+I131
+ta(I452
+I131
+I449
+I131
+ta(I449
+I131
+I431
+I131
+ta(I431
+I131
+I407
+I132
+ta(I407
+I132
+I379
+I134
+ta(I379
+I134
+I347
+I135
+ta(I347
+I135
+I315
+I138
+ta(I315
+I138
+I281
+I140
+ta(I281
+I140
+I257
+I141
+ta(I257
+I141
+I237
+I142
+ta(I237
+I142
+I232
+I143
+ta(I232
+I143
+I231
+I143
+ta(I231
+I143
+I234
+I143
+ta(I234
+I143
+I256
+I139
+ta(I256
+I139
+I278
+I134
+ta(I278
+I134
+I306
+I120
+ta(I306
+I120
+I348
+I106
+ta(I348
+I106
+I384
+I100
+ta(I384
+I100
+I422
+I95
+ta(I422
+I95
+I448
+I91
+ta(I448
+I91
+I468
+I88
+ta(I468
+I88
+I473
+I85
+ta(I473
+I85
+I475
+I83
+ta(I475
+I83
+I474
+I82
+ta(I474
+I82
+I456
+I82
+ta(I456
+I82
+I434
+I84
+ta(I434
+I84
+I406
+I86
+ta(I406
+I86
+I372
+I87
+ta(I372
+I87
+I340
+I89
+ta(I340
+I89
+I310
+I91
+ta(I310
+I91
+I280
+I93
+ta(I280
+I93
+I260
+I95
+ta(I260
+I95
+I257
+I95
+ta(I257
+I95
+I260
+I95
+ta(I260
+I95
+I282
+I92
+ta(I282
+I92
+I302
+I89
+ta(I302
+I89
+I326
+I86
+ta(I326
+I86
+I350
+I82
+ta(I350
+I82
+I378
+I76
+ta(I378
+I76
+I402
+I72
+ta(I402
+I72
+I426
+I68
+ta(I426
+I68
+I448
+I64
+ta(I448
+I64
+I453
+I62
+ta(I453
+I62
+I456
+I60
+ta(I456
+I60
+I457
+I60
+ta(I457
+I60
+I453
+I60
+ta(I453
+I60
+I435
+I60
+ta(I435
+I60
+I417
+I60
+ta(I417
+I60
+I397
+I60
+ta(I397
+I60
+I377
+I60
+ta(I377
+I60
+I361
+I60
+ta(I361
+I60
+I355
+I61
+ta(I355
+I61
+I352
+I61
+ta(I352
+I61
+I350
+I62
+ta(I350
+I62
+I353
+I62
+ta(I353
+I62
+I371
+I59
+ta(I371
+I59
+I387
+I57
+ta(I387
+I57
+I405
+I53
+ta(I405
+I53
+I425
+I49
+ta(I425
+I49
+I443
+I44
+ta(I443
+I44
+I463
+I40
+ta(I463
+I40
+I483
+I35
+ta(I483
+I35
+I501
+I31
+ta(I501
+I31
+I515
+I28
+ta(I515
+I28
+I518
+I25
+ta(I518
+I25
+I521
+I24
+ta(I521
+I24
+I521
+I23
+ta(I521
+I23
+I517
+I22
+ta(I517
+I22
+I501
+I22
+ta(I501
+I22
+I483
+I23
+ta(I483
+I23
+I455
+I25
+ta(I455
+I25
+I427
+I27
+ta(I427
+I27
+I395
+I31
+ta(I395
+I31
+I363
+I35
+ta(I363
+I35
+I339
+I38
+ta(I339
+I38
+I321
+I40
+ta(I321
+I40
+I316
+I41
+ta(I316
+I41
+I315
+I42
+ta(I315
+I42
+I317
+I40
+ta(I317
+I40
+I333
+I36
+ta(I333
+I36
+I353
+I33
+ta(I353
+I33
+I373
+I30
+ta(I373
+I30
+I397
+I27
+ta(I397
+I27
+I421
+I23
+ta(I421
+I23
+I449
+I20
+ta(I449
+I20
+I477
+I18
+ta(I477
+I18
+I507
+I16
+ta(I507
+I16
+I543
+I14
+ta(I543
+I14
+I571
+I13
+ta(I571
+I13
+I601
+I11
+ta(I601
+I11
+I629
+I10
+ta(I629
+I10
+I649
+I10
+ta(I649
+I10
+I665
+I10
+ta(I665
+I10
+I667
+I11
+ta(I667
+I11
+I668
+I12
+ta(I668
+I12
+I667
+I13
+ta(I667
+I13
+I664
+I15
+ta(I664
+I15
+I650
+I19
+ta(I650
+I19
+I628
+I23
+ta(I628
+I23
+I604
+I29
+ta(I604
+I29
+I576
+I35
+ta(I576
+I35
+I548
+I40
+ta(I548
+I40
+I520
+I46
+ta(I520
+I46
+I492
+I51
+ta(I492
+I51
+I462
+I65
+ta(I462
+I65
+I434
+I71
+ta(I434
+I71
+I406
+I77
+ta(I406
+I77
+I380
+I81
+ta(I380
+I81
+I362
+I84
+ta(I362
+I84
+I357
+I87
+ta(I357
+I87
+I355
+I88
+ta(I355
+I88
+I361
+I88
+ta(I361
+I88
+I381
+I88
+ta(I381
+I88
+I403
+I85
+ta(I403
+I85
+I433
+I82
+ta(I433
+I82
+I467
+I78
+ta(I467
+I78
+I511
+I73
+ta(I511
+I73
+I549
+I68
+ta(I549
+I68
+I583
+I65
+ta(I583
+I65
+I619
+I60
+ta(I619
+I60
+I649
+I57
+ta(I649
+I57
+I673
+I55
+ta(I673
+I55
+I691
+I54
+ta(I691
+I54
+I692
+I53
+ta(I692
+I53
+I693
+I53
+ta(I693
+I53
+I692
+I53
+ta(I692
+I53
+I687
+I54
+ta(I687
+I54
+I671
+I56
+ta(I671
+I56
+I645
+I60
+ta(I645
+I60
+I613
+I63
+ta(I613
+I63
+I579
+I68
+ta(I579
+I68
+I549
+I71
+ta(I549
+I71
+I515
+I75
+ta(I515
+I75
+I489
+I79
+ta(I489
+I79
+I469
+I82
+ta(I469
+I82
+I455
+I84
+ta(I455
+I84
+I455
+I85
+ta(I455
+I85
+I459
+I85
+ta(I459
+I85
+I475
+I84
+ta(I475
+I84
+I499
+I81
+ta(I499
+I81
+I529
+I78
+ta(I529
+I78
+I571
+I74
+ta(I571
+I74
+I611
+I70
+ta(I611
+I70
+I649
+I66
+ta(I649
+I66
+I681
+I63
+ta(I681
+I63
+I707
+I59
+ta(I707
+I59
+I729
+I58
+ta(I729
+I58
+I733
+I57
+ta(I733
+I57
+I732
+I57
+ta(I732
+I57
+I726
+I57
+ta(I726
+I57
+I706
+I60
+ta(I706
+I60
+I680
+I63
+ta(I680
+I63
+I648
+I67
+ta(I648
+I67
+I608
+I71
+ta(I608
+I71
+I568
+I76
+ta(I568
+I76
+I536
+I79
+ta(I536
+I79
+I504
+I83
+ta(I504
+I83
+I482
+I87
+ta(I482
+I87
+I476
+I89
+ta(I476
+I89
+I475
+I90
+ta(I475
+I90
+I474
+I90
+ta(I474
+I90
+I477
+I90
+ta(I477
+I90
+I493
+I88
+ta(I493
+I88
+I517
+I86
+ta(I517
+I86
+I545
+I82
+ta(I545
+I82
+I577
+I79
+ta(I577
+I79
+I615
+I77
+ta(I615
+I77
+I645
+I75
+ta(I645
+I75
+I675
+I73
+ta(I675
+I73
+I701
+I72
+ta(I701
+I72
+I719
+I71
+ta(I719
+I71
+I721
+I71
+ta(I721
+I71
+I722
+I71
+ta(I722
+I71
+I720
+I72
+ta(I720
+I72
+I706
+I74
+ta(I706
+I74
+I686
+I77
+ta(I686
+I77
+I658
+I82
+ta(I658
+I82
+I624
+I87
+ta(I624
+I87
+I586
+I92
+ta(I586
+I92
+I552
+I96
+ta(I552
+I96
+I524
+I102
+ta(I524
+I102
+I498
+I108
+ta(I498
+I108
+I480
+I113
+ta(I480
+I113
+I476
+I116
+ta(I476
+I116
+I475
+I118
+ta(I475
+I118
+I474
+I120
+ta(I474
+I120
+I477
+I121
+ta(I477
+I121
+I483
+I121
+ta(I483
+I121
+I503
+I121
+ta(I503
+I121
+I525
+I120
+ta(I525
+I120
+I549
+I118
+ta(I549
+I118
+I575
+I116
+ta(I575
+I116
+I603
+I115
+ta(I603
+I115
+I629
+I113
+ta(I629
+I113
+I653
+I113
+ta(I653
+I113
+I671
+I113
+ta(I671
+I113
+I676
+I113
+ta(I676
+I113
+I677
+I114
+ta(I677
+I114
+I677
+I115
+ta(I677
+I115
+I675
+I118
+ta(I675
+I118
+I671
+I121
+ta(I671
+I121
+I651
+I125
+ta(I651
+I125
+I629
+I131
+ta(I629
+I131
+I599
+I136
+ta(I599
+I136
+I567
+I150
+ta(I567
+I150
+I533
+I156
+ta(I533
+I156
+I505
+I161
+ta(I505
+I161
+I479
+I167
+ta(I479
+I167
+I463
+I173
+ta(I463
+I173
+I460
+I175
+ta(I460
+I175
+I459
+I177
+ta(I459
+I177
+I459
+I178
+ta(I459
+I178
+I462
+I179
+ta(I462
+I179
+I476
+I180
+ta(I476
+I180
+I492
+I178
+ta(I492
+I178
+I516
+I177
+ta(I516
+I177
+I540
+I174
+ta(I540
+I174
+I568
+I171
+ta(I568
+I171
+I598
+I167
+ta(I598
+I167
+I626
+I163
+ta(I626
+I163
+I652
+I160
+ta(I652
+I160
+I678
+I157
+ta(I678
+I157
+I694
+I156
+ta(I694
+I156
+I697
+I155
+ta(I697
+I155
+I695
+I155
+ta(I695
+I155
+I675
+I155
+ta(I675
+I155
+I653
+I157
+ta(I653
+I157
+I625
+I160
+ta(I625
+I160
+I591
+I164
+ta(I591
+I164
+I553
+I168
+ta(I553
+I168
+I521
+I172
+ta(I521
+I172
+I491
+I177
+ta(I491
+I177
+I467
+I180
+ta(I467
+I180
+I453
+I184
+ta(I453
+I184
+I449
+I187
+ta(I449
+I187
+I449
+I188
+ta(I449
+I188
+I449
+I190
+ta(I449
+I190
+I455
+I190
+ta(I455
+I190
+I471
+I190
+ta(I471
+I190
+I495
+I189
+ta(I495
+I189
+I521
+I186
+ta(I521
+I186
+I551
+I184
+ta(I551
+I184
+I589
+I182
+ta(I589
+I182
+I617
+I180
+ta(I617
+I180
+I647
+I178
+ta(I647
+I178
+I673
+I177
+ta(I673
+I177
+I693
+I176
+ta(I693
+I176
+I696
+I176
+ta(I696
+I176
+I691
+I176
+ta(I691
+I176
+I669
+I180
+ta(I669
+I180
+I641
+I183
+ta(I641
+I183
+I607
+I187
+ta(I607
+I187
+I571
+I190
+ta(I571
+I190
+I529
+I194
+ta(I529
+I194
+I491
+I200
+ta(I491
+I200
+I461
+I203
+ta(I461
+I203
+I445
+I206
+ta(I445
+I206
+I442
+I209
+ta(I442
+I209
+I442
+I211
+ta(I442
+I211
+I443
+I212
+ta(I443
+I212
+I447
+I214
+ta(I447
+I214
+I465
+I215
+ta(I465
+I215
+I483
+I216
+ta(I483
+I216
+I507
+I216
+ta(I507
+I216
+I535
+I216
+ta(I535
+I216
+I565
+I216
+ta(I565
+I216
+I599
+I216
+ta(I599
+I216
+I625
+I216
+ta(I625
+I216
+I649
+I217
+ta(I649
+I217
+I667
+I219
+ta(I667
+I219
+I673
+I220
+ta(I673
+I220
+I676
+I222
+ta(I676
+I222
+I676
+I223
+ta(I676
+I223
+I674
+I224
+ta(I674
+I224
+I670
+I226
+ta(I670
+I226
+I650
+I229
+ta(I650
+I229
+I624
+I232
+ta(I624
+I232
+I592
+I235
+ta(I592
+I235
+I556
+I239
+ta(I556
+I239
+I518
+I243
+ta(I518
+I243
+I486
+I247
+ta(I486
+I247
+I462
+I250
+ta(I462
+I250
+I446
+I253
+ta(I446
+I253
+I443
+I255
+ta(I443
+I255
+I442
+I256
+ta(I442
+I256
+I443
+I257
+ta(I443
+I257
+I457
+I257
+ta(I457
+I257
+I475
+I257
+ta(I475
+I257
+I497
+I257
+ta(I497
+I257
+I523
+I257
+ta(I523
+I257
+I551
+I257
+ta(I551
+I257
+I583
+I257
+ta(I583
+I257
+I607
+I257
+ta(I607
+I257
+I629
+I256
+ta(I629
+I256
+I635
+I256
+ta(I635
+I256
+I637
+I256
+ta(I637
+I256
+I633
+I257
+ta(I633
+I257
+I615
+I259
+ta(I615
+I259
+I593
+I261
+ta(I593
+I261
+I561
+I265
+ta(I561
+I265
+I525
+I268
+ta(I525
+I268
+I493
+I271
+ta(I493
+I271
+I457
+I276
+ta(I457
+I276
+I431
+I280
+ta(I431
+I280
+I411
+I283
+ta(I411
+I283
+I397
+I287
+ta(I397
+I287
+I394
+I290
+ta(I394
+I290
+I394
+I292
+ta(I394
+I292
+I395
+I294
+ta(I395
+I294
+I399
+I295
+ta(I399
+I295
+I417
+I296
+ta(I417
+I296
+I437
+I297
+ta(I437
+I297
+I463
+I297
+ta(I463
+I297
+I491
+I297
+ta(I491
+I297
+I521
+I296
+ta(I521
+I296
+I553
+I295
+ta(I553
+I295
+I577
+I293
+ta(I577
+I293
+I597
+I292
+ta(I597
+I292
+I602
+I291
+ta(I602
+I291
+I605
+I291
+ta(I605
+I291
+I603
+I291
+ta(I603
+I291
+I589
+I291
+ta(I589
+I291
+I575
+I291
+ta(I575
+I291
+I555
+I293
+ta(I555
+I293
+I529
+I294
+ta(I529
+I294
+I501
+I296
+ta(I501
+I296
+I475
+I300
+ta(I475
+I300
+I459
+I303
+ta(I459
+I303
+I453
+I305
+ta(I453
+I305
+I452
+I307
+ta(I452
+I307
+I452
+I309
+ta(I452
+I309
+I453
+I312
+ta(I453
+I312
+I459
+I314
+ta(I459
+I314
+I475
+I315
+ta(I475
+I315
+I497
+I315
+ta(I497
+I315
+I523
+I315
+ta(I523
+I315
+I557
+I315
+ta(I557
+I315
+I591
+I315
+ta(I591
+I315
+I619
+I315
+ta(I619
+I315
+I645
+I315
+ta(I645
+I315
+I663
+I315
+ta(I663
+I315
+I666
+I315
+ta(I666
+I315
+I663
+I314
+ta(I663
+I314
+I658
+I314
+ta(I658
+I314
+I656
+I314
+ta(I656
+I314
+I630
+I314
+ta(I630
+I314
+I604
+I314
+ta(I604
+I314
+I556
+I314
+ta(I556
+I314
+I512
+I315
+ta(I512
+I315
+I478
+I317
+ta(I478
+I317
+I446
+I319
+ta(I446
+I319
+I424
+I321
+ta(I424
+I321
+I420
+I323
+ta(I420
+I323
+I424
+I324
+ta(I424
+I324
+I446
+I325
+ta(I446
+I325
+I470
+I325
+ta(I470
+I325
+I510
+I323
+ta(I510
+I323
+I552
+I321
+ta(I552
+I321
+I596
+I318
+ta(I596
+I318
+I646
+I316
+ta(I646
+I316
+I676
+I314
+ta(I676
+I314
+I694
+I314
+ta(I694
+I314
+I708
+I313
+ta(I708
+I313
+I706
+I313
+ta(I706
+I313
+I688
+I314
+ta(I688
+I314
+I674
+I315
+ta(I674
+I315
+I673
+I314
+ta(I673
+I314
+I631
+I314
+ta(I631
+I314
+I597
+I317
+ta(I597
+I317
+I563
+I321
+ta(I563
+I321
+I541
+I324
+ta(I541
+I324
+I535
+I327
+ta(I535
+I327
+I533
+I330
+ta(I533
+I330
+I533
+I332
+ta(I533
+I332
+I536
+I335
+ta(I536
+I335
+I541
+I337
+ta(I541
+I337
+I559
+I339
+ta(I559
+I339
+I583
+I340
+ta(I583
+I340
+I609
+I340
+ta(I609
+I340
+I641
+I340
+ta(I641
+I340
+I673
+I342
+ta(I673
+I342
+I697
+I344
+ta(I697
+I344
+I721
+I345
+ta(I721
+I345
+I727
+I346
+ta(I727
+I346
+I728
+I347
+ta(I728
+I347
+I729
+I348
+ta(I729
+I348
+I727
+I349
+ta(I727
+I349
+I724
+I351
+ta(I724
+I351
+I718
+I354
+ta(I718
+I354
+I712
+I357
+ta(I712
+I357
+I696
+I361
+ta(I696
+I361
+I682
+I364
+ta(I682
+I364
+I666
+I368
+ta(I666
+I368
+I661
+I371
+ta(I661
+I371
+I656
+I375
+ta(I656
+I375
+I653
+I378
+ta(I653
+I378
+I650
+I381
+ta(I650
+I381
+I649
+I382
+ta(I649
+I382
+I649
+I383
+ta(I649
+I383
+I650
+I383
+ta(I650
+I383
+I649
+I383
+ta(I649
+I383
+I621
+I383
+ta(I621
+I383
+I601
+I380
+ta(I601
+I380
+I587
+I379
+ta(I587
+I379
+I582
+I378
+ta(I582
+I378
+I576
+I377
+ta(I576
+I377
+I571
+I377
+ta(I571
+I377
+I557
+I377
+ta(I557
+I377
+I541
+I377
+ta(I541
+I377
+I517
+I378
+ta(I517
+I378
+I493
+I379
+ta(I493
+I379
+I473
+I381
+ta(I473
+I381
+I449
+I384
+ta(I449
+I384
+I435
+I387
+ta(I435
+I387
+I431
+I390
+ta(I431
+I390
+I428
+I393
+ta(I428
+I393
+I427
+I396
+ta(I427
+I396
+I427
+I398
+ta(I427
+I398
+I428
+I399
+ta(I428
+I399
+I432
+I400
+ta(I432
+I400
+I450
+I400
+ta(I450
+I400
+I468
+I400
+ta(I468
+I400
+I492
+I398
+ta(I492
+I398
+I518
+I396
+ta(I518
+I396
+I544
+I395
+ta(I544
+I395
+I574
+I393
+ta(I574
+I393
+I602
+I391
+ta(I602
+I391
+I626
+I390
+ta(I626
+I390
+I648
+I388
+ta(I648
+I388
+I662
+I387
+ta(I662
+I387
+I666
+I386
+ta(I666
+I386
+I668
+I386
+ta(I668
+I386
+I667
+I386
+ta(I667
+I386
+I663
+I385
+ta(I663
+I385
+I647
+I384
+ta(I647
+I384
+I627
+I383
+ta(I627
+I383
+I605
+I383
+ta(I605
+I383
+I573
+I383
+ta(I573
+I383
+I541
+I383
+ta(I541
+I383
+I511
+I383
+ta(I511
+I383
+I481
+I383
+ta(I481
+I383
+I455
+I383
+ta(I455
+I383
+I441
+I383
+ta(I441
+I383
+I440
+I383
+ta(I440
+I383
+I440
+I382
+ta(I440
+I382
+I442
+I381
+ta(I442
+I381
+I448
+I379
+ta(I448
+I379
+I468
+I375
+ta(I468
+I375
+I488
+I371
+ta(I488
+I371
+I512
+I366
+ta(I512
+I366
+I538
+I362
+ta(I538
+I362
+I568
+I358
+ta(I568
+I358
+I596
+I355
+ta(I596
+I355
+I624
+I352
+ta(I624
+I352
+I650
+I349
+ta(I650
+I349
+I670
+I347
+ta(I670
+I347
+I684
+I347
+ta(I684
+I347
+I686
+I346
+ta(I686
+I346
+I683
+I346
+ta(I683
+I346
+I667
+I347
+ta(I667
+I347
+I647
+I350
+ta(I647
+I350
+I619
+I353
+ta(I619
+I353
+I589
+I357
+ta(I589
+I357
+I557
+I361
+ta(I557
+I361
+I529
+I365
+ta(I529
+I365
+I501
+I379
+ta(I501
+I379
+I481
+I384
+ta(I481
+I384
+I475
+I387
+ta(I475
+I387
+I472
+I392
+ta(I472
+I392
+I471
+I395
+ta(I471
+I395
+I472
+I397
+ta(I472
+I397
+I478
+I398
+ta(I478
+I398
+I498
+I399
+ta(I498
+I399
+I518
+I399
+ta(I518
+I399
+I544
+I397
+ta(I544
+I397
+I574
+I396
+ta(I574
+I396
+I604
+I394
+ta(I604
+I394
+I634
+I393
+ta(I634
+I393
+I662
+I392
+ta(I662
+I392
+I686
+I392
+ta(I686
+I392
+I704
+I392
+ta(I704
+I392
+I707
+I393
+ta(I707
+I393
+I707
+I394
+ta(I707
+I394
+I706
+I396
+ta(I706
+I396
+I692
+I399
+ta(I692
+I399
+I674
+I403
+ta(I674
+I403
+I650
+I406
+ta(I650
+I406
+I618
+I410
+ta(I618
+I410
+I586
+I413
+ta(I586
+I413
+I554
+I417
+ta(I554
+I417
+I528
+I420
+ta(I528
+I420
+I506
+I424
+ta(I506
+I424
+I502
+I427
+ta(I502
+I427
+I499
+I429
+ta(I499
+I429
+I499
+I431
+ta(I499
+I431
+I502
+I433
+ta(I502
+I433
+I508
+I435
+ta(I508
+I435
+I526
+I436
+ta(I526
+I436
+I546
+I436
+ta(I546
+I436
+I570
+I436
+ta(I570
+I436
+I598
+I436
+ta(I598
+I436
+I624
+I436
+ta(I624
+I436
+I650
+I436
+ta(I650
+I436
+I672
+I436
+ta(I672
+I436
+I677
+I436
+ta(I677
+I436
+I678
+I436
+ta(I678
+I436
+I677
+I437
+ta(I677
+I437
+I674
+I438
+ta(I674
+I438
+I660
+I439
+ta(I660
+I439
+I642
+I440
+ta(I642
+I440
+I612
+I442
+ta(I612
+I442
+I580
+I444
+ta(I580
+I444
+I548
+I446
+ta(I548
+I446
+I516
+I448
+ta(I516
+I448
+I488
+I450
+ta(I488
+I450
+I466
+I453
+ta(I466
+I453
+I460
+I455
+ta(I460
+I455
+I459
+I456
+ta(I459
+I456
+I459
+I457
+ta(I459
+I457
+I463
+I458
+ta(I463
+I458
+I483
+I458
+ta(I483
+I458
+I505
+I458
+ta(I505
+I458
+I531
+I458
+ta(I531
+I458
+I561
+I456
+ta(I561
+I456
+I597
+I456
+ta(I597
+I456
+I625
+I456
+ta(I625
+I456
+I651
+I456
+ta(I651
+I456
+I675
+I456
+ta(I675
+I456
+I689
+I457
+ta(I689
+I457
+I693
+I458
+ta(I693
+I458
+I692
+I459
+ta(I692
+I459
+I688
+I461
+ta(I688
+I461
+I670
+I464
+ta(I670
+I464
+I646
+I467
+ta(I646
+I467
+I620
+I471
+ta(I620
+I471
+I586
+I476
+ta(I586
+I476
+I554
+I478
+ta(I554
+I478
+I522
+I483
+ta(I522
+I483
+I492
+I487
+ta(I492
+I487
+I468
+I491
+ta(I468
+I491
+I462
+I495
+ta(I462
+I495
+I460
+I499
+ta(I460
+I499
+I460
+I501
+ta(I460
+I501
+I465
+I502
+ta(I465
+I502
+I483
+I504
+ta(I483
+I504
+I509
+I505
+ta(I509
+I505
+I539
+I505
+ta(I539
+I505
+I577
+I505
+ta(I577
+I505
+I621
+I505
+ta(I621
+I505
+I663
+I504
+ta(I663
+I504
+I691
+I504
+ta(I691
+I504
+I729
+I504
+ta(I729
+I504
+I743
+I504
+ta(I743
+I504
+I742
+I504
+ta(I742
+I504
+I736
+I504
+ta(I736
+I504
+I702
+I505
+ta(I702
+I505
+I684
+I504
+ta(I684
+I504
+I654
+I504
+ta(I654
+I504
+I616
+I506
+ta(I616
+I506
+I582
+I508
+ta(I582
+I508
+I550
+I510
+ta(I550
+I510
+I526
+I514
+ta(I526
+I514
+I520
+I516
+ta(I520
+I516
+I519
+I518
+ta(I519
+I518
+I520
+I519
+ta(I520
+I519
+I534
+I520
+ta(I534
+I520
+I552
+I520
+ta(I552
+I520
+I578
+I520
+ta(I578
+I520
+I608
+I520
+ta(I608
+I520
+I638
+I518
+ta(I638
+I518
+I672
+I516
+ta(I672
+I516
+I700
+I515
+ta(I700
+I515
+I724
+I515
+ta(I724
+I515
+I742
+I515
+ta(I742
+I515
+I746
+I515
+ta(I746
+I515
+I743
+I516
+ta(I743
+I516
+I723
+I518
+ta(I723
+I518
+I701
+I520
+ta(I701
+I520
+I671
+I521
+ta(I671
+I521
+I641
+I523
+ta(I641
+I523
+I609
+I525
+ta(I609
+I525
+I579
+I527
+ta(I579
+I527
+I557
+I529
+ta(I557
+I529
+I552
+I531
+ta(I552
+I531
+I550
+I533
+ta(I550
+I533
+I551
+I535
+ta(I551
+I535
+I556
+I537
+ta(I556
+I537
+I576
+I539
+ta(I576
+I539
+I602
+I542
+ta(I602
+I542
+I630
+I543
+ta(I630
+I543
+I666
+I543
+ta(I666
+I543
+I700
+I543
+ta(I700
+I543
+I730
+I542
+ta(I730
+I542
+I756
+I540
+ta(I756
+I540
+I774
+I539
+ta(I774
+I539
+I776
+I538
+ta(I776
+I538
+I772
+I538
+ta(I772
+I538
+I748
+I539
+ta(I748
+I539
+I724
+I541
+ta(I724
+I541
+I698
+I544
+ta(I698
+I544
+I672
+I547
+ta(I672
+I547
+I650
+I551
+ta(I650
+I551
+I632
+I554
+ta(I632
+I554
+I626
+I556
+ta(I626
+I556
+I623
+I557
+ta(I623
+I557
+I620
+I559
+ta(I620
+I559
+I618
+I560
+ta(I618
+I560
+I617
+I560
+ta(I617
+I560
+I618
+I560
+ta(I618
+I560
+I617
+I559
+ta(I617
+I559
+I614
+I554
+tatp7
+a(S'Cyan'
+p8
+I1
+(lp9
+(I18
+I19
+I18
+I20
+ta(I18
+I20
+I17
+I24
+ta(I17
+I24
+I17
+I28
+ta(I17
+I28
+I17
+I42
+ta(I17
+I42
+I16
+I48
+ta(I16
+I48
+I16
+I62
+ta(I16
+I62
+I16
+I80
+ta(I16
+I80
+I16
+I100
+ta(I16
+I100
+I16
+I122
+ta(I16
+I122
+I16
+I146
+ta(I16
+I146
+I16
+I170
+ta(I16
+I170
+I17
+I196
+ta(I17
+I196
+I19
+I222
+ta(I19
+I222
+I20
+I248
+ta(I20
+I248
+I23
+I266
+ta(I23
+I266
+I25
+I271
+ta(I25
+I271
+I27
+I273
+ta(I27
+I273
+I28
+I269
+ta(I28
+I269
+I29
+I247
+ta(I29
+I247
+I30
+I227
+ta(I30
+I227
+I31
+I201
+ta(I31
+I201
+I31
+I173
+ta(I31
+I173
+I31
+I147
+ta(I31
+I147
+I31
+I119
+ta(I31
+I119
+I31
+I89
+ta(I31
+I89
+I31
+I63
+ta(I31
+I63
+I31
+I35
+ta(I31
+I35
+I31
+I11
+ta(I31
+I11
+I31
+I-11
+ta(I31
+I-11
+I30
+I-29
+ta(I30
+I-29
+I29
+I-43
+ta(I29
+I-43
+I28
+I-46
+ta(I28
+I-46
+I27
+I-47
+ta(I27
+I-47
+I27
+I-42
+ta(I27
+I-42
+I27
+I-24
+ta(I27
+I-24
+I29
+I-6
+ta(I29
+I-6
+I30
+I12
+ta(I30
+I12
+I32
+I32
+ta(I32
+I32
+I33
+I56
+ta(I33
+I56
+I34
+I78
+ta(I34
+I78
+I36
+I98
+ta(I36
+I98
+I37
+I120
+ta(I37
+I120
+I39
+I138
+ta(I39
+I138
+I42
+I156
+ta(I42
+I156
+I45
+I172
+ta(I45
+I172
+I48
+I177
+ta(I48
+I177
+I51
+I180
+ta(I51
+I180
+I53
+I181
+ta(I53
+I181
+I55
+I181
+ta(I55
+I181
+I56
+I180
+ta(I56
+I180
+I57
+I175
+ta(I57
+I175
+I59
+I161
+ta(I59
+I161
+I60
+I147
+ta(I60
+I147
+I61
+I131
+ta(I61
+I131
+I61
+I113
+ta(I61
+I113
+I61
+I93
+ta(I61
+I93
+I61
+I73
+ta(I61
+I73
+I61
+I51
+ta(I61
+I51
+I61
+I27
+ta(I61
+I27
+I61
+I7
+ta(I61
+I7
+I61
+I-15
+ta(I61
+I-15
+I61
+I-31
+ta(I61
+I-31
+I61
+I-36
+ta(I61
+I-36
+I61
+I-40
+ta(I61
+I-40
+I62
+I-42
+ta(I62
+I-42
+I62
+I-38
+ta(I62
+I-38
+I62
+I-16
+ta(I62
+I-16
+I62
+I4
+ta(I62
+I4
+I63
+I26
+ta(I63
+I26
+I65
+I52
+ta(I65
+I52
+I66
+I78
+ta(I66
+I78
+I68
+I104
+ta(I68
+I104
+I69
+I134
+ta(I69
+I134
+I70
+I160
+ta(I70
+I160
+I72
+I186
+ta(I72
+I186
+I74
+I208
+ta(I74
+I208
+I77
+I224
+ta(I77
+I224
+I80
+I228
+ta(I80
+I228
+I83
+I230
+ta(I83
+I230
+I85
+I230
+ta(I85
+I230
+I88
+I229
+ta(I88
+I229
+I91
+I224
+ta(I91
+I224
+I94
+I206
+ta(I94
+I206
+I97
+I190
+ta(I97
+I190
+I99
+I168
+ta(I99
+I168
+I101
+I146
+ta(I101
+I146
+I102
+I122
+ta(I102
+I122
+I102
+I98
+ta(I102
+I98
+I102
+I72
+ta(I102
+I72
+I101
+I48
+ta(I101
+I48
+I99
+I26
+ta(I99
+I26
+I98
+I6
+ta(I98
+I6
+I97
+I-8
+ta(I97
+I-8
+I96
+I-12
+ta(I96
+I-12
+I96
+I-14
+ta(I96
+I-14
+I96
+I-10
+ta(I96
+I-10
+I96
+I12
+ta(I96
+I12
+I97
+I32
+ta(I97
+I32
+I97
+I56
+ta(I97
+I56
+I99
+I82
+ta(I99
+I82
+I99
+I108
+ta(I99
+I108
+I99
+I136
+ta(I99
+I136
+I99
+I166
+ta(I99
+I166
+I99
+I192
+ta(I99
+I192
+I100
+I218
+ta(I100
+I218
+I102
+I244
+ta(I102
+I244
+I105
+I262
+ta(I105
+I262
+I108
+I267
+ta(I108
+I267
+I113
+I271
+ta(I113
+I271
+I117
+I273
+ta(I117
+I273
+I121
+I273
+ta(I121
+I273
+I125
+I270
+ta(I125
+I270
+I128
+I266
+ta(I128
+I266
+I132
+I248
+ta(I132
+I248
+I135
+I232
+ta(I135
+I232
+I137
+I210
+ta(I137
+I210
+I140
+I186
+ta(I140
+I186
+I141
+I162
+ta(I141
+I162
+I142
+I132
+ta(I142
+I132
+I142
+I106
+ta(I142
+I106
+I142
+I80
+ta(I142
+I80
+I140
+I54
+ta(I140
+I54
+I138
+I34
+ta(I138
+I34
+I137
+I18
+ta(I137
+I18
+I137
+I12
+ta(I137
+I12
+I136
+I9
+ta(I136
+I9
+I136
+I10
+ta(I136
+I10
+I136
+I32
+ta(I136
+I32
+I137
+I50
+ta(I137
+I50
+I139
+I74
+ta(I139
+I74
+I140
+I100
+ta(I140
+I100
+I142
+I124
+ta(I142
+I124
+I143
+I152
+ta(I143
+I152
+I145
+I180
+ta(I145
+I180
+I146
+I208
+ta(I146
+I208
+I147
+I234
+ta(I147
+I234
+I149
+I258
+ta(I149
+I258
+I151
+I276
+ta(I151
+I276
+I153
+I280
+ta(I153
+I280
+I156
+I283
+ta(I156
+I283
+I157
+I283
+ta(I157
+I283
+I158
+I283
+ta(I158
+I283
+I161
+I279
+ta(I161
+I279
+I162
+I263
+ta(I162
+I263
+I165
+I247
+ta(I165
+I247
+I168
+I225
+ta(I168
+I225
+I171
+I201
+ta(I171
+I201
+I174
+I177
+ta(I174
+I177
+I177
+I153
+ta(I177
+I153
+I178
+I125
+ta(I178
+I125
+I179
+I99
+ta(I179
+I99
+I180
+I75
+ta(I180
+I75
+I180
+I53
+ta(I180
+I53
+I179
+I33
+ta(I179
+I33
+I178
+I17
+ta(I178
+I17
+I177
+I13
+ta(I177
+I13
+I176
+I10
+ta(I176
+I10
+I175
+I10
+ta(I175
+I10
+I175
+I12
+ta(I175
+I12
+I175
+I34
+ta(I175
+I34
+I175
+I52
+ta(I175
+I52
+I175
+I76
+ta(I175
+I76
+I175
+I100
+ta(I175
+I100
+I175
+I126
+ta(I175
+I126
+I174
+I156
+ta(I174
+I156
+I173
+I184
+ta(I173
+I184
+I173
+I208
+ta(I173
+I208
+I173
+I232
+ta(I173
+I232
+I173
+I252
+ta(I173
+I252
+I174
+I258
+ta(I174
+I258
+I176
+I262
+ta(I176
+I262
+I177
+I263
+ta(I177
+I263
+I179
+I263
+ta(I179
+I263
+I180
+I261
+ta(I180
+I261
+I182
+I245
+ta(I182
+I245
+I184
+I229
+ta(I184
+I229
+I186
+I207
+ta(I186
+I207
+I187
+I183
+ta(I187
+I183
+I188
+I155
+ta(I188
+I155
+I189
+I129
+ta(I189
+I129
+I190
+I99
+ta(I190
+I99
+I191
+I73
+ta(I191
+I73
+I192
+I49
+ta(I192
+I49
+I193
+I27
+ta(I193
+I27
+I193
+I5
+ta(I193
+I5
+I193
+I-11
+ta(I193
+I-11
+I193
+I-16
+ta(I193
+I-16
+I193
+I-20
+ta(I193
+I-20
+I193
+I-21
+ta(I193
+I-21
+I193
+I-20
+ta(I193
+I-20
+I193
+I0
+ta(I193
+I0
+I193
+I18
+ta(I193
+I18
+I194
+I42
+ta(I194
+I42
+I195
+I66
+ta(I195
+I66
+I197
+I94
+ta(I197
+I94
+I199
+I122
+ta(I199
+I122
+I200
+I148
+ta(I200
+I148
+I203
+I178
+ta(I203
+I178
+I204
+I206
+ta(I204
+I206
+I206
+I230
+ta(I206
+I230
+I209
+I256
+ta(I209
+I256
+I212
+I274
+ta(I212
+I274
+I216
+I290
+ta(I216
+I290
+I220
+I292
+ta(I220
+I292
+I223
+I293
+ta(I223
+I293
+I225
+I293
+ta(I225
+I293
+I227
+I291
+ta(I227
+I291
+I229
+I277
+ta(I229
+I277
+I231
+I259
+ta(I231
+I259
+I234
+I237
+ta(I234
+I237
+I236
+I215
+ta(I236
+I215
+I238
+I185
+ta(I238
+I185
+I240
+I157
+ta(I240
+I157
+I242
+I129
+ta(I242
+I129
+I243
+I103
+ta(I243
+I103
+I245
+I73
+ta(I245
+I73
+I246
+I49
+ta(I246
+I49
+I246
+I29
+ta(I246
+I29
+I246
+I13
+ta(I246
+I13
+I245
+I9
+ta(I245
+I9
+I244
+I6
+ta(I244
+I6
+I243
+I12
+ta(I243
+I12
+I243
+I36
+ta(I243
+I36
+I243
+I60
+ta(I243
+I60
+I243
+I84
+ta(I243
+I84
+I243
+I112
+ta(I243
+I112
+I243
+I140
+ta(I243
+I140
+I243
+I172
+ta(I243
+I172
+I243
+I202
+ta(I243
+I202
+I244
+I230
+ta(I244
+I230
+I245
+I258
+ta(I245
+I258
+I246
+I282
+ta(I246
+I282
+I246
+I300
+ta(I246
+I300
+I248
+I303
+ta(I248
+I303
+I250
+I305
+ta(I250
+I305
+I251
+I305
+ta(I251
+I305
+I252
+I304
+ta(I252
+I304
+I255
+I290
+ta(I255
+I290
+I257
+I286
+ta(I257
+I286
+I260
+I266
+ta(I260
+I266
+I264
+I246
+ta(I264
+I246
+I267
+I224
+ta(I267
+I224
+I268
+I204
+ta(I268
+I204
+I269
+I180
+ta(I269
+I180
+I270
+I160
+ta(I270
+I160
+I270
+I140
+ta(I270
+I140
+I270
+I118
+ta(I270
+I118
+I270
+I100
+ta(I270
+I100
+I269
+I84
+ta(I269
+I84
+I268
+I70
+ta(I268
+I70
+I267
+I66
+ta(I267
+I66
+I266
+I63
+ta(I266
+I63
+I266
+I62
+ta(I266
+I62
+I266
+I67
+ta(I266
+I67
+I266
+I85
+ta(I266
+I85
+I268
+I105
+ta(I268
+I105
+I269
+I129
+ta(I269
+I129
+I271
+I155
+ta(I271
+I155
+I272
+I185
+ta(I272
+I185
+I274
+I213
+ta(I274
+I213
+I274
+I239
+ta(I274
+I239
+I276
+I267
+ta(I276
+I267
+I278
+I291
+ta(I278
+I291
+I280
+I311
+ta(I280
+I311
+I282
+I316
+ta(I282
+I316
+I284
+I319
+ta(I284
+I319
+I286
+I321
+ta(I286
+I321
+I288
+I321
+ta(I288
+I321
+I289
+I320
+ta(I289
+I320
+I290
+I302
+ta(I290
+I302
+I291
+I282
+ta(I291
+I282
+I292
+I281
+ta(I292
+I281
+I291
+I281
+ta(I291
+I281
+I291
+I259
+ta(I291
+I259
+I292
+I233
+ta(I292
+I233
+I291
+I209
+ta(I291
+I209
+I290
+I189
+ta(I290
+I189
+I288
+I169
+ta(I288
+I169
+I287
+I163
+ta(I287
+I163
+I287
+I160
+ta(I287
+I160
+I287
+I158
+ta(I287
+I158
+I287
+I159
+ta(I287
+I159
+I287
+I175
+ta(I287
+I175
+I289
+I193
+ta(I289
+I193
+I292
+I215
+ta(I292
+I215
+I295
+I241
+ta(I295
+I241
+I298
+I269
+ta(I298
+I269
+I302
+I299
+ta(I302
+I299
+I303
+I313
+ta(I303
+I313
+I306
+I337
+ta(I306
+I337
+I307
+I339
+ta(I307
+I339
+I308
+I353
+ta(I308
+I353
+I311
+I367
+ta(I311
+I367
+I310
+I369
+ta(I310
+I369
+I311
+I372
+ta(I311
+I372
+I312
+I368
+ta(I312
+I368
+I312
+I366
+ta(I312
+I366
+I313
+I365
+ta(I313
+I365
+I312
+I335
+ta(I312
+I335
+I310
+I301
+ta(I310
+I301
+I310
+I287
+ta(I310
+I287
+I310
+I261
+ta(I310
+I261
+I309
+I233
+ta(I309
+I233
+I307
+I207
+ta(I307
+I207
+I306
+I185
+ta(I306
+I185
+I305
+I167
+ta(I305
+I167
+I304
+I153
+ta(I304
+I153
+I303
+I149
+ta(I303
+I149
+I303
+I147
+ta(I303
+I147
+I304
+I149
+ta(I304
+I149
+I306
+I171
+ta(I306
+I171
+I309
+I193
+ta(I309
+I193
+I312
+I217
+ta(I312
+I217
+I316
+I243
+ta(I316
+I243
+I320
+I271
+ta(I320
+I271
+I323
+I301
+ta(I323
+I301
+I327
+I329
+ta(I327
+I329
+I330
+I353
+ta(I330
+I353
+I333
+I379
+ta(I333
+I379
+I336
+I395
+ta(I336
+I395
+I340
+I411
+ta(I340
+I411
+I343
+I414
+ta(I343
+I414
+I345
+I415
+ta(I345
+I415
+I346
+I416
+ta(I346
+I416
+I347
+I414
+ta(I347
+I414
+I348
+I408
+ta(I348
+I408
+I348
+I406
+ta(I348
+I406
+I349
+I388
+ta(I349
+I388
+I349
+I384
+ta(I349
+I384
+I349
+I352
+ta(I349
+I352
+I349
+I324
+ta(I349
+I324
+I349
+I294
+ta(I349
+I294
+I373
+I294
+ta(I373
+I294
+I393
+I314
+ta(I393
+I314
+I457
+I360
+ta(I457
+I360
+I513
+I404
+ta(I513
+I404
+I591
+I432
+ta(I591
+I432
+I665
+I448
+ta(I665
+I448
+I664
+I474
+ta(I664
+I474
+I586
+I512
+ta(I586
+I512
+I508
+I556
+ta(I508
+I556
+I410
+I616
+ta(I410
+I616
+I316
+I678
+ta(I316
+I678
+I220
+I740
+ta(I220
+I740
+I158
+I804
+ta(I158
+I804
+I90
+I853
+ta(I90
+I853
+I40
+I853
+ta(I40
+I853
+I-16
+I853
+ta(I-16
+I853
+I-66
+I853
+ta(I-66
+I853
+I-96
+I852
+ta(I-96
+I852
+I-130
+I853
+ta(I-130
+I853
+I-154
+I775
+ta(I-154
+I775
+I-180
+I703
+ta(I-180
+I703
+I-196
+I755
+ta(I-196
+I755
+I-194
+I773
+ta(I-194
+I773
+I-192
+I776
+ta(I-192
+I776
+I-191
+I777
+ta(I-191
+I777
+I-190
+I776
+ta(I-190
+I776
+I-190
+I770
+ta(I-190
+I770
+I-190
+I750
+ta(I-190
+I750
+I-190
+I724
+ta(I-190
+I724
+I-191
+I694
+ta(I-191
+I694
+I-191
+I662
+ta(I-191
+I662
+I-191
+I628
+ta(I-191
+I628
+I-191
+I596
+ta(I-191
+I596
+I-193
+I568
+ta(I-193
+I568
+I-196
+I544
+ta(I-196
+I544
+I-201
+I524
+ta(I-201
+I524
+I-206
+I508
+ta(I-206
+I508
+I-212
+I506
+ta(I-212
+I506
+I-213
+I506
+tatp10
+a(g8
+I1
+(lp11
+(I288
+I12
+I288
+I16
+ta(I288
+I16
+I288
+I19
+ta(I288
+I19
+I289
+I23
+ta(I289
+I23
+I290
+I28
+ta(I290
+I28
+I290
+I34
+ta(I290
+I34
+I291
+I48
+ta(I291
+I48
+I291
+I66
+ta(I291
+I66
+I291
+I84
+ta(I291
+I84
+I291
+I106
+ta(I291
+I106
+I291
+I130
+ta(I291
+I130
+I291
+I154
+ta(I291
+I154
+I291
+I182
+ta(I291
+I182
+I291
+I208
+ta(I291
+I208
+I292
+I236
+ta(I292
+I236
+I292
+I262
+ta(I292
+I262
+I293
+I284
+ta(I293
+I284
+I293
+I300
+ta(I293
+I300
+I295
+I306
+ta(I295
+I306
+I295
+I309
+ta(I295
+I309
+I296
+I310
+ta(I296
+I310
+I297
+I310
+ta(I297
+I310
+I298
+I294
+ta(I298
+I294
+I298
+I274
+ta(I298
+I274
+I298
+I248
+ta(I298
+I248
+I298
+I220
+ta(I298
+I220
+I298
+I188
+ta(I298
+I188
+I298
+I148
+ta(I298
+I148
+I298
+I116
+ta(I298
+I116
+I298
+I82
+ta(I298
+I82
+I298
+I46
+ta(I298
+I46
+I298
+I10
+ta(I298
+I10
+I298
+I-20
+ta(I298
+I-20
+I298
+I-50
+ta(I298
+I-50
+I300
+I-76
+ta(I300
+I-76
+I302
+I-94
+ta(I302
+I-94
+I303
+I-110
+ta(I303
+I-110
+I304
+I-113
+ta(I304
+I-113
+I305
+I-113
+ta(I305
+I-113
+I305
+I-112
+ta(I305
+I-112
+I305
+I-92
+ta(I305
+I-92
+I308
+I-74
+ta(I308
+I-74
+I310
+I-48
+ta(I310
+I-48
+I312
+I-24
+ta(I312
+I-24
+I313
+I2
+ta(I313
+I2
+I315
+I30
+ta(I315
+I30
+I317
+I60
+ta(I317
+I60
+I319
+I84
+ta(I319
+I84
+I322
+I108
+ta(I322
+I108
+I326
+I134
+ta(I326
+I134
+I329
+I150
+ta(I329
+I150
+I332
+I166
+ta(I332
+I166
+I336
+I172
+ta(I336
+I172
+I339
+I176
+ta(I339
+I176
+I343
+I177
+ta(I343
+I177
+I345
+I178
+ta(I345
+I178
+I346
+I179
+ta(I346
+I179
+I347
+I179
+ta(I347
+I179
+I347
+I176
+ta(I347
+I176
+I348
+I171
+ta(I348
+I171
+I348
+I157
+ta(I348
+I157
+I348
+I141
+ta(I348
+I141
+I348
+I119
+ta(I348
+I119
+I349
+I97
+ta(I349
+I97
+I351
+I71
+ta(I351
+I71
+I353
+I41
+ta(I353
+I41
+I355
+I9
+ta(I355
+I9
+I358
+I-21
+ta(I358
+I-21
+I362
+I-51
+ta(I362
+I-51
+I365
+I-79
+ta(I365
+I-79
+I368
+I-101
+ta(I368
+I-101
+I371
+I-117
+ta(I371
+I-117
+I373
+I-121
+ta(I373
+I-121
+I373
+I-122
+ta(I373
+I-122
+I373
+I-121
+ta(I373
+I-121
+I374
+I-101
+ta(I374
+I-101
+I375
+I-81
+ta(I375
+I-81
+I375
+I-57
+ta(I375
+I-57
+I375
+I-33
+ta(I375
+I-33
+I375
+I-7
+ta(I375
+I-7
+I375
+I23
+ta(I375
+I23
+I375
+I51
+ta(I375
+I51
+I375
+I81
+ta(I375
+I81
+I375
+I109
+ta(I375
+I109
+I375
+I137
+ta(I375
+I137
+I375
+I163
+ta(I375
+I163
+I375
+I183
+ta(I375
+I183
+I376
+I199
+ta(I376
+I199
+I377
+I202
+ta(I377
+I202
+I379
+I203
+ta(I379
+I203
+I380
+I203
+ta(I380
+I203
+I381
+I200
+ta(I381
+I200
+I383
+I184
+ta(I383
+I184
+I383
+I170
+ta(I383
+I170
+I384
+I154
+ta(I384
+I154
+I386
+I130
+ta(I386
+I130
+I387
+I108
+ta(I387
+I108
+I388
+I84
+ta(I388
+I84
+I390
+I58
+ta(I390
+I58
+I391
+I32
+ta(I391
+I32
+I393
+I8
+ta(I393
+I8
+I395
+I-12
+ta(I395
+I-12
+I396
+I-30
+ta(I396
+I-30
+I397
+I-36
+ta(I397
+I-36
+I397
+I-39
+ta(I397
+I-39
+I397
+I-34
+ta(I397
+I-34
+I397
+I-10
+ta(I397
+I-10
+I397
+I12
+ta(I397
+I12
+I397
+I32
+ta(I397
+I32
+I397
+I58
+ta(I397
+I58
+I397
+I84
+ta(I397
+I84
+I397
+I110
+ta(I397
+I110
+I397
+I140
+ta(I397
+I140
+I397
+I166
+ta(I397
+I166
+I397
+I190
+ta(I397
+I190
+I398
+I216
+ta(I398
+I216
+I399
+I236
+ta(I399
+I236
+I400
+I252
+ta(I400
+I252
+I402
+I268
+ta(I402
+I268
+I404
+I270
+ta(I404
+I270
+I405
+I272
+ta(I405
+I272
+I406
+I272
+ta(I406
+I272
+I407
+I269
+ta(I407
+I269
+I408
+I263
+ta(I408
+I263
+I409
+I247
+ta(I409
+I247
+I412
+I229
+ta(I412
+I229
+I414
+I205
+ta(I414
+I205
+I418
+I181
+ta(I418
+I181
+I421
+I155
+ta(I421
+I155
+I424
+I129
+ta(I424
+I129
+I427
+I101
+ta(I427
+I101
+I429
+I71
+ta(I429
+I71
+I432
+I47
+ta(I432
+I47
+I434
+I25
+ta(I434
+I25
+I437
+I5
+ta(I437
+I5
+I439
+I-9
+ta(I439
+I-9
+I440
+I-13
+ta(I440
+I-13
+I441
+I-15
+ta(I441
+I-15
+I441
+I-11
+ta(I441
+I-11
+I441
+I15
+ta(I441
+I15
+I441
+I35
+ta(I441
+I35
+I441
+I59
+ta(I441
+I59
+I441
+I89
+ta(I441
+I89
+I441
+I117
+ta(I441
+I117
+I441
+I145
+ta(I441
+I145
+I442
+I173
+ta(I442
+I173
+I443
+I199
+ta(I443
+I199
+I445
+I225
+ta(I445
+I225
+I447
+I247
+ta(I447
+I247
+I448
+I253
+ta(I448
+I253
+I450
+I256
+ta(I450
+I256
+I452
+I258
+ta(I452
+I258
+I453
+I258
+ta(I453
+I258
+I455
+I252
+ta(I455
+I252
+I457
+I234
+ta(I457
+I234
+I458
+I214
+ta(I458
+I214
+I461
+I190
+ta(I461
+I190
+I463
+I160
+ta(I463
+I160
+I464
+I130
+ta(I464
+I130
+I466
+I98
+ta(I466
+I98
+I468
+I64
+ta(I468
+I64
+I470
+I34
+ta(I470
+I34
+I471
+I8
+ta(I471
+I8
+I472
+I-18
+ta(I472
+I-18
+I473
+I-42
+ta(I473
+I-42
+I474
+I-62
+ta(I474
+I-62
+I475
+I-76
+ta(I475
+I-76
+I476
+I-80
+ta(I476
+I-80
+I476
+I-82
+ta(I476
+I-82
+I476
+I-77
+ta(I476
+I-77
+I476
+I-55
+ta(I476
+I-55
+I478
+I-33
+ta(I478
+I-33
+I480
+I-9
+ta(I480
+I-9
+I481
+I17
+ta(I481
+I17
+I483
+I45
+ta(I483
+I45
+I485
+I73
+ta(I485
+I73
+I488
+I99
+ta(I488
+I99
+I491
+I123
+ta(I491
+I123
+I494
+I145
+ta(I494
+I145
+I500
+I163
+ta(I500
+I163
+I503
+I177
+ta(I503
+I177
+I507
+I181
+ta(I507
+I181
+I511
+I183
+ta(I511
+I183
+I515
+I185
+ta(I515
+I185
+I519
+I185
+ta(I519
+I185
+I521
+I184
+ta(I521
+I184
+I524
+I180
+ta(I524
+I180
+I526
+I176
+ta(I526
+I176
+I528
+I158
+ta(I528
+I158
+I530
+I140
+ta(I530
+I140
+I531
+I120
+ta(I531
+I120
+I531
+I94
+ta(I531
+I94
+I531
+I66
+ta(I531
+I66
+I531
+I38
+ta(I531
+I38
+I531
+I10
+ta(I531
+I10
+I532
+I-16
+ta(I532
+I-16
+I534
+I-42
+ta(I534
+I-42
+I536
+I-64
+ta(I536
+I-64
+I537
+I-78
+ta(I537
+I-78
+I538
+I-84
+ta(I538
+I-84
+I539
+I-86
+ta(I539
+I-86
+I539
+I-82
+ta(I539
+I-82
+I540
+I-58
+ta(I540
+I-58
+I541
+I-36
+ta(I541
+I-36
+I543
+I-12
+ta(I543
+I-12
+I544
+I16
+ta(I544
+I16
+I546
+I44
+ta(I546
+I44
+I548
+I70
+ta(I548
+I70
+I549
+I96
+ta(I549
+I96
+I551
+I122
+ta(I551
+I122
+I554
+I144
+ta(I554
+I144
+I557
+I162
+ta(I557
+I162
+I560
+I178
+ta(I560
+I178
+I562
+I182
+ta(I562
+I182
+I565
+I185
+ta(I565
+I185
+I566
+I187
+ta(I566
+I187
+I568
+I187
+ta(I568
+I187
+I569
+I186
+ta(I569
+I186
+I570
+I181
+ta(I570
+I181
+I571
+I167
+ta(I571
+I167
+I573
+I151
+ta(I573
+I151
+I574
+I131
+ta(I574
+I131
+I575
+I109
+ta(I575
+I109
+I576
+I89
+ta(I576
+I89
+I578
+I65
+ta(I578
+I65
+I579
+I43
+ta(I579
+I43
+I581
+I23
+ta(I581
+I23
+I582
+I3
+ta(I582
+I3
+I583
+I-13
+ta(I583
+I-13
+I584
+I-18
+ta(I584
+I-18
+I585
+I-23
+ta(I585
+I-23
+I585
+I-24
+ta(I585
+I-24
+I585
+I-18
+ta(I585
+I-18
+I585
+I6
+ta(I585
+I6
+I586
+I26
+ta(I586
+I26
+I587
+I48
+ta(I587
+I48
+I588
+I74
+ta(I588
+I74
+I589
+I98
+ta(I589
+I98
+I590
+I122
+ta(I590
+I122
+I592
+I148
+ta(I592
+I148
+I594
+I170
+ta(I594
+I170
+I595
+I190
+ta(I595
+I190
+I596
+I210
+ta(I596
+I210
+I597
+I224
+ta(I597
+I224
+I599
+I228
+ta(I599
+I228
+I600
+I230
+ta(I600
+I230
+I601
+I230
+ta(I601
+I230
+I602
+I228
+ta(I602
+I228
+I603
+I212
+ta(I603
+I212
+I605
+I198
+ta(I605
+I198
+I608
+I178
+ta(I608
+I178
+I609
+I158
+ta(I609
+I158
+I610
+I134
+ta(I610
+I134
+I612
+I110
+ta(I612
+I110
+I613
+I84
+ta(I613
+I84
+I615
+I60
+ta(I615
+I60
+I615
+I34
+ta(I615
+I34
+I615
+I14
+ta(I615
+I14
+I615
+I-4
+ta(I615
+I-4
+I615
+I-18
+ta(I615
+I-18
+I615
+I-23
+ta(I615
+I-23
+I615
+I-25
+ta(I615
+I-25
+I615
+I-24
+ta(I615
+I-24
+I615
+I-6
+ta(I615
+I-6
+I615
+I8
+ta(I615
+I8
+I615
+I28
+ta(I615
+I28
+I615
+I50
+ta(I615
+I50
+I616
+I74
+ta(I616
+I74
+I616
+I100
+ta(I616
+I100
+I616
+I124
+ta(I616
+I124
+I618
+I144
+ta(I618
+I144
+I619
+I164
+ta(I619
+I164
+I620
+I182
+ta(I620
+I182
+I622
+I196
+ta(I622
+I196
+I623
+I201
+ta(I623
+I201
+I624
+I204
+ta(I624
+I204
+I624
+I206
+ta(I624
+I206
+I625
+I206
+ta(I625
+I206
+I626
+I206
+ta(I626
+I206
+I627
+I201
+ta(I627
+I201
+I628
+I187
+ta(I628
+I187
+I629
+I171
+ta(I629
+I171
+I629
+I151
+ta(I629
+I151
+I630
+I129
+ta(I630
+I129
+I631
+I109
+ta(I631
+I109
+I632
+I83
+ta(I632
+I83
+I632
+I57
+ta(I632
+I57
+I632
+I35
+ta(I632
+I35
+I633
+I11
+ta(I633
+I11
+I634
+I-9
+ta(I634
+I-9
+I635
+I-25
+ta(I635
+I-25
+I636
+I-30
+ta(I636
+I-30
+I637
+I-33
+ta(I637
+I-33
+I637
+I-35
+ta(I637
+I-35
+I637
+I-32
+ta(I637
+I-32
+I638
+I-14
+ta(I638
+I-14
+I639
+I4
+ta(I639
+I4
+I642
+I24
+ta(I642
+I24
+I645
+I48
+ta(I645
+I48
+I648
+I70
+ta(I648
+I70
+I651
+I92
+ta(I651
+I92
+I653
+I114
+ta(I653
+I114
+I656
+I132
+ta(I656
+I132
+I659
+I150
+ta(I659
+I150
+I662
+I164
+ta(I662
+I164
+I664
+I169
+ta(I664
+I169
+I667
+I173
+ta(I667
+I173
+I669
+I175
+ta(I669
+I175
+I670
+I175
+ta(I670
+I175
+I671
+I175
+ta(I671
+I175
+I671
+I169
+ta(I671
+I169
+I671
+I163
+ta(I671
+I163
+I671
+I147
+ta(I671
+I147
+I670
+I129
+ta(I670
+I129
+I669
+I111
+ta(I669
+I111
+I669
+I91
+ta(I669
+I91
+I669
+I67
+ta(I669
+I67
+I669
+I49
+ta(I669
+I49
+I670
+I27
+ta(I670
+I27
+I671
+I7
+ta(I671
+I7
+I671
+I-13
+ta(I671
+I-13
+I672
+I-27
+ta(I672
+I-27
+I673
+I-32
+ta(I673
+I-32
+I673
+I-35
+ta(I673
+I-35
+I673
+I-30
+ta(I673
+I-30
+I674
+I-14
+ta(I674
+I-14
+I675
+I6
+ta(I675
+I6
+I676
+I22
+ta(I676
+I22
+I677
+I42
+ta(I677
+I42
+I679
+I64
+ta(I679
+I64
+I681
+I84
+ta(I681
+I84
+I683
+I106
+ta(I683
+I106
+I685
+I126
+ta(I685
+I126
+I688
+I148
+ta(I688
+I148
+I691
+I168
+ta(I691
+I168
+I694
+I182
+ta(I694
+I182
+I695
+I187
+ta(I695
+I187
+I696
+I190
+ta(I696
+I190
+I697
+I192
+ta(I697
+I192
+I697
+I193
+ta(I697
+I193
+I697
+I192
+ta(I697
+I192
+I695
+I190
+ta(I695
+I190
+I695
+I189
+tatp12
+a(g8
+I1
+(lp13
+(I683
+I229
+I682
+I233
+ta(I682
+I233
+I682
+I239
+ta(I682
+I239
+I681
+I245
+ta(I681
+I245
+I681
+I251
+ta(I681
+I251
+I681
+I257
+ta(I681
+I257
+I681
+I273
+ta(I681
+I273
+I681
+I289
+ta(I681
+I289
+I681
+I307
+ta(I681
+I307
+I681
+I327
+ta(I681
+I327
+I681
+I345
+ta(I681
+I345
+I683
+I365
+ta(I683
+I365
+I684
+I389
+ta(I684
+I389
+I685
+I409
+ta(I685
+I409
+I686
+I431
+ta(I686
+I431
+I688
+I447
+ta(I688
+I447
+I689
+I452
+ta(I689
+I452
+I690
+I457
+ta(I690
+I457
+I690
+I459
+ta(I690
+I459
+I691
+I459
+ta(I691
+I459
+I691
+I456
+ta(I691
+I456
+I691
+I436
+ta(I691
+I436
+I691
+I418
+ta(I691
+I418
+I690
+I394
+ta(I690
+I394
+I688
+I370
+ta(I688
+I370
+I687
+I342
+ta(I687
+I342
+I687
+I314
+ta(I687
+I314
+I687
+I284
+ta(I687
+I284
+I687
+I254
+ta(I687
+I254
+I688
+I226
+ta(I688
+I226
+I690
+I202
+ta(I690
+I202
+I691
+I180
+ta(I691
+I180
+I692
+I160
+ta(I692
+I160
+I692
+I146
+ta(I692
+I146
+I692
+I143
+ta(I692
+I143
+I692
+I141
+ta(I692
+I141
+I692
+I146
+ta(I692
+I146
+I692
+I166
+ta(I692
+I166
+I692
+I184
+ta(I692
+I184
+I692
+I204
+ta(I692
+I204
+I692
+I226
+ta(I692
+I226
+I692
+I250
+ta(I692
+I250
+I692
+I274
+ta(I692
+I274
+I692
+I298
+ta(I692
+I298
+I692
+I322
+ta(I692
+I322
+I692
+I342
+ta(I692
+I342
+I692
+I360
+ta(I692
+I360
+I692
+I378
+ta(I692
+I378
+I692
+I382
+ta(I692
+I382
+I692
+I386
+ta(I692
+I386
+I692
+I388
+ta(I692
+I388
+I692
+I387
+ta(I692
+I387
+I692
+I369
+ta(I692
+I369
+I691
+I353
+ta(I691
+I353
+I689
+I333
+ta(I689
+I333
+I688
+I311
+ta(I688
+I311
+I686
+I287
+ta(I686
+I287
+I683
+I263
+ta(I683
+I263
+I682
+I241
+ta(I682
+I241
+I680
+I221
+ta(I680
+I221
+I678
+I201
+ta(I678
+I201
+I676
+I183
+ta(I676
+I183
+I674
+I177
+ta(I674
+I177
+I672
+I173
+ta(I672
+I173
+I671
+I171
+ta(I671
+I171
+I670
+I176
+ta(I670
+I176
+I668
+I198
+ta(I668
+I198
+I668
+I216
+ta(I668
+I216
+I667
+I240
+ta(I667
+I240
+I665
+I264
+ta(I665
+I264
+I664
+I288
+ta(I664
+I288
+I662
+I312
+ta(I662
+I312
+I660
+I338
+ta(I660
+I338
+I659
+I360
+ta(I659
+I360
+I656
+I382
+ta(I656
+I382
+I655
+I400
+ta(I655
+I400
+I654
+I416
+ta(I654
+I416
+I653
+I421
+ta(I653
+I421
+I653
+I423
+ta(I653
+I423
+I654
+I418
+ta(I654
+I418
+I655
+I394
+ta(I655
+I394
+I655
+I378
+ta(I655
+I378
+I655
+I356
+ta(I655
+I356
+I654
+I332
+ta(I654
+I332
+I652
+I308
+ta(I652
+I308
+I649
+I282
+ta(I649
+I282
+I647
+I260
+ta(I647
+I260
+I644
+I238
+ta(I644
+I238
+I641
+I220
+ta(I641
+I220
+I638
+I202
+ta(I638
+I202
+I636
+I196
+ta(I636
+I196
+I635
+I193
+ta(I635
+I193
+I634
+I191
+ta(I634
+I191
+I633
+I191
+ta(I633
+I191
+I632
+I196
+ta(I632
+I196
+I631
+I216
+ta(I631
+I216
+I630
+I234
+ta(I630
+I234
+I629
+I254
+ta(I629
+I254
+I627
+I280
+ta(I627
+I280
+I625
+I304
+ta(I625
+I304
+I624
+I330
+ta(I624
+I330
+I622
+I354
+ta(I622
+I354
+I621
+I376
+ta(I621
+I376
+I620
+I394
+ta(I620
+I394
+I618
+I412
+ta(I618
+I412
+I618
+I416
+ta(I618
+I416
+I618
+I420
+ta(I618
+I420
+I618
+I422
+ta(I618
+I422
+I618
+I418
+ta(I618
+I418
+I618
+I396
+ta(I618
+I396
+I618
+I378
+ta(I618
+I378
+I618
+I356
+ta(I618
+I356
+I618
+I332
+ta(I618
+I332
+I618
+I306
+ta(I618
+I306
+I618
+I282
+ta(I618
+I282
+I617
+I258
+ta(I617
+I258
+I615
+I238
+ta(I615
+I238
+I614
+I220
+ta(I614
+I220
+I613
+I214
+ta(I613
+I214
+I612
+I210
+ta(I612
+I210
+I611
+I209
+ta(I611
+I209
+I609
+I212
+ta(I609
+I212
+I608
+I230
+ta(I608
+I230
+I605
+I248
+ta(I605
+I248
+I603
+I266
+ta(I603
+I266
+I600
+I288
+ta(I600
+I288
+I597
+I310
+ta(I597
+I310
+I595
+I330
+ta(I595
+I330
+I592
+I354
+ta(I592
+I354
+I589
+I374
+ta(I589
+I374
+I588
+I394
+ta(I588
+I394
+I587
+I412
+ta(I587
+I412
+I586
+I417
+ta(I586
+I417
+I586
+I420
+ta(I586
+I420
+I586
+I419
+ta(I586
+I419
+I586
+I399
+ta(I586
+I399
+I586
+I383
+ta(I586
+I383
+I585
+I365
+ta(I585
+I365
+I583
+I345
+ta(I583
+I345
+I582
+I321
+ta(I582
+I321
+I580
+I299
+ta(I580
+I299
+I578
+I279
+ta(I578
+I279
+I574
+I257
+ta(I574
+I257
+I571
+I237
+ta(I571
+I237
+I567
+I219
+ta(I567
+I219
+I563
+I203
+ta(I563
+I203
+I559
+I198
+ta(I559
+I198
+I555
+I193
+ta(I555
+I193
+I552
+I191
+ta(I552
+I191
+I551
+I191
+ta(I551
+I191
+I550
+I196
+ta(I550
+I196
+I548
+I216
+ta(I548
+I216
+I547
+I232
+ta(I547
+I232
+I547
+I254
+ta(I547
+I254
+I547
+I278
+ta(I547
+I278
+I547
+I302
+ta(I547
+I302
+I547
+I326
+ta(I547
+I326
+I547
+I350
+ta(I547
+I350
+I547
+I374
+ta(I547
+I374
+I547
+I394
+ta(I547
+I394
+I547
+I412
+ta(I547
+I412
+I547
+I426
+ta(I547
+I426
+I547
+I429
+ta(I547
+I429
+I548
+I432
+ta(I548
+I432
+I548
+I433
+ta(I548
+I433
+I549
+I433
+ta(I549
+I433
+I550
+I431
+ta(I550
+I431
+I550
+I426
+ta(I550
+I426
+I550
+I412
+ta(I550
+I412
+I550
+I396
+ta(I550
+I396
+I550
+I378
+ta(I550
+I378
+I549
+I358
+ta(I549
+I358
+I548
+I334
+ta(I548
+I334
+I547
+I308
+ta(I547
+I308
+I546
+I284
+ta(I546
+I284
+I546
+I260
+ta(I546
+I260
+I545
+I236
+ta(I545
+I236
+I543
+I216
+ta(I543
+I216
+I542
+I200
+ta(I542
+I200
+I541
+I196
+ta(I541
+I196
+I541
+I192
+ta(I541
+I192
+I540
+I191
+ta(I540
+I191
+I539
+I197
+ta(I539
+I197
+I538
+I215
+ta(I538
+I215
+I537
+I235
+ta(I537
+I235
+I536
+I257
+ta(I536
+I257
+I534
+I281
+ta(I534
+I281
+I532
+I307
+ta(I532
+I307
+I531
+I331
+ta(I531
+I331
+I529
+I355
+ta(I529
+I355
+I527
+I375
+ta(I527
+I375
+I524
+I391
+ta(I524
+I391
+I523
+I396
+ta(I523
+I396
+I522
+I399
+ta(I522
+I399
+I522
+I400
+ta(I522
+I400
+I523
+I396
+ta(I523
+I396
+I523
+I380
+ta(I523
+I380
+I522
+I374
+ta(I522
+I374
+I520
+I358
+ta(I520
+I358
+I518
+I342
+ta(I518
+I342
+I515
+I324
+ta(I515
+I324
+I512
+I306
+ta(I512
+I306
+I508
+I286
+ta(I508
+I286
+I504
+I268
+ta(I504
+I268
+I500
+I250
+ta(I500
+I250
+I494
+I232
+ta(I494
+I232
+I491
+I216
+ta(I491
+I216
+I488
+I210
+ta(I488
+I210
+I484
+I205
+ta(I484
+I205
+I482
+I202
+ta(I482
+I202
+I481
+I201
+ta(I481
+I201
+I480
+I202
+ta(I480
+I202
+I479
+I208
+ta(I479
+I208
+I478
+I228
+ta(I478
+I228
+I477
+I244
+ta(I477
+I244
+I475
+I264
+ta(I475
+I264
+I472
+I288
+ta(I472
+I288
+I469
+I314
+ta(I469
+I314
+I466
+I338
+ta(I466
+I338
+I462
+I362
+ta(I462
+I362
+I458
+I388
+ta(I458
+I388
+I455
+I412
+ta(I455
+I412
+I452
+I430
+ta(I452
+I430
+I450
+I446
+ta(I450
+I446
+I448
+I450
+ta(I448
+I450
+I447
+I452
+ta(I447
+I452
+I447
+I451
+ta(I447
+I451
+I447
+I445
+ta(I447
+I445
+I447
+I429
+ta(I447
+I429
+I447
+I415
+ta(I447
+I415
+I448
+I397
+ta(I448
+I397
+I449
+I377
+ta(I449
+I377
+I451
+I357
+ta(I451
+I357
+I452
+I337
+ta(I452
+I337
+I453
+I317
+ta(I453
+I317
+I454
+I297
+ta(I454
+I297
+I454
+I279
+ta(I454
+I279
+I454
+I263
+ta(I454
+I263
+I453
+I247
+ta(I453
+I247
+I453
+I244
+ta(I453
+I244
+I452
+I242
+ta(I452
+I242
+I452
+I241
+ta(I452
+I241
+I450
+I246
+ta(I450
+I246
+I448
+I262
+ta(I448
+I262
+I446
+I282
+ta(I446
+I282
+I444
+I302
+ta(I444
+I302
+I440
+I326
+ta(I440
+I326
+I437
+I350
+ta(I437
+I350
+I434
+I374
+ta(I434
+I374
+I430
+I400
+ta(I430
+I400
+I427
+I420
+ta(I427
+I420
+I425
+I434
+ta(I425
+I434
+I422
+I440
+ta(I422
+I440
+I421
+I444
+ta(I421
+I444
+I420
+I446
+ta(I420
+I446
+I420
+I447
+ta(I420
+I447
+I421
+I445
+ta(I421
+I445
+I421
+I439
+ta(I421
+I439
+I421
+I425
+ta(I421
+I425
+I421
+I407
+ta(I421
+I407
+I420
+I387
+ta(I420
+I387
+I419
+I367
+ta(I419
+I367
+I417
+I343
+ta(I417
+I343
+I416
+I323
+ta(I416
+I323
+I415
+I301
+ta(I415
+I301
+I413
+I279
+ta(I413
+I279
+I411
+I261
+ta(I411
+I261
+I408
+I245
+ta(I408
+I245
+I405
+I229
+ta(I405
+I229
+I402
+I223
+ta(I402
+I223
+I398
+I219
+ta(I398
+I219
+I395
+I215
+ta(I395
+I215
+I392
+I214
+ta(I392
+I214
+I390
+I213
+ta(I390
+I213
+I387
+I214
+ta(I387
+I214
+I384
+I219
+ta(I384
+I219
+I379
+I225
+ta(I379
+I225
+I375
+I245
+ta(I375
+I245
+I369
+I267
+ta(I369
+I267
+I365
+I289
+ta(I365
+I289
+I351
+I313
+ta(I351
+I313
+I346
+I339
+ta(I346
+I339
+I342
+I363
+ta(I342
+I363
+I337
+I385
+ta(I337
+I385
+I333
+I405
+ta(I333
+I405
+I329
+I423
+ta(I329
+I423
+I327
+I428
+ta(I327
+I428
+I326
+I432
+ta(I326
+I432
+I326
+I433
+ta(I326
+I433
+I326
+I434
+ta(I326
+I434
+I327
+I432
+ta(I327
+I432
+I329
+I426
+ta(I329
+I426
+I331
+I410
+ta(I331
+I410
+I334
+I396
+ta(I334
+I396
+I336
+I376
+ta(I336
+I376
+I339
+I356
+ta(I339
+I356
+I342
+I334
+ta(I342
+I334
+I345
+I312
+ta(I345
+I312
+I347
+I292
+ta(I347
+I292
+I348
+I272
+ta(I348
+I272
+I349
+I252
+ta(I349
+I252
+I349
+I236
+ta(I349
+I236
+I349
+I220
+ta(I349
+I220
+I349
+I214
+ta(I349
+I214
+I349
+I211
+ta(I349
+I211
+I348
+I210
+ta(I348
+I210
+I348
+I211
+ta(I348
+I211
+I347
+I229
+ta(I347
+I229
+I346
+I247
+ta(I346
+I247
+I345
+I265
+ta(I345
+I265
+I343
+I287
+ta(I343
+I287
+I342
+I313
+ta(I342
+I313
+I340
+I337
+ta(I340
+I337
+I338
+I361
+ta(I338
+I361
+I336
+I383
+ta(I336
+I383
+I333
+I403
+ta(I333
+I403
+I332
+I419
+ta(I332
+I419
+I331
+I424
+ta(I331
+I424
+I331
+I427
+ta(I331
+I427
+I331
+I429
+ta(I331
+I429
+I332
+I427
+ta(I332
+I427
+I333
+I411
+ta(I333
+I411
+I335
+I395
+ta(I335
+I395
+I336
+I377
+ta(I336
+I377
+I337
+I359
+ta(I337
+I359
+I337
+I335
+ta(I337
+I335
+I337
+I315
+ta(I337
+I315
+I337
+I293
+ta(I337
+I293
+I336
+I269
+ta(I336
+I269
+I335
+I251
+ta(I335
+I251
+I333
+I231
+ta(I333
+I231
+I332
+I217
+ta(I332
+I217
+I330
+I203
+ta(I330
+I203
+I329
+I199
+ta(I329
+I199
+I328
+I196
+ta(I328
+I196
+I327
+I195
+ta(I327
+I195
+I325
+I199
+ta(I325
+I199
+I323
+I219
+ta(I323
+I219
+I321
+I235
+ta(I321
+I235
+I318
+I257
+ta(I318
+I257
+I315
+I281
+ta(I315
+I281
+I312
+I305
+ta(I312
+I305
+I309
+I329
+ta(I309
+I329
+I306
+I355
+ta(I306
+I355
+I304
+I379
+ta(I304
+I379
+I303
+I399
+ta(I303
+I399
+I302
+I415
+ta(I302
+I415
+I302
+I429
+ta(I302
+I429
+I302
+I432
+ta(I302
+I432
+I302
+I434
+ta(I302
+I434
+I302
+I435
+ta(I302
+I435
+I302
+I434
+ta(I302
+I434
+I302
+I428
+ta(I302
+I428
+I302
+I414
+ta(I302
+I414
+I302
+I400
+ta(I302
+I400
+I302
+I382
+ta(I302
+I382
+I302
+I364
+ta(I302
+I364
+I302
+I344
+ta(I302
+I344
+I302
+I322
+ta(I302
+I322
+I302
+I302
+ta(I302
+I302
+I302
+I284
+ta(I302
+I284
+I302
+I266
+ta(I302
+I266
+I302
+I250
+ta(I302
+I250
+I301
+I236
+ta(I301
+I236
+I300
+I231
+ta(I300
+I231
+I299
+I227
+ta(I299
+I227
+I298
+I226
+ta(I298
+I226
+I298
+I225
+ta(I298
+I225
+I296
+I231
+ta(I296
+I231
+I294
+I245
+ta(I294
+I245
+I291
+I265
+ta(I291
+I265
+I289
+I285
+ta(I289
+I285
+I285
+I307
+ta(I285
+I307
+I282
+I327
+ta(I282
+I327
+I278
+I349
+ta(I278
+I349
+I274
+I369
+ta(I274
+I369
+I270
+I385
+ta(I270
+I385
+I268
+I390
+ta(I268
+I390
+I266
+I393
+ta(I266
+I393
+I265
+I395
+ta(I265
+I395
+I265
+I396
+ta(I265
+I396
+I266
+I395
+ta(I266
+I395
+I267
+I390
+ta(I267
+I390
+I267
+I376
+ta(I267
+I376
+I267
+I362
+ta(I267
+I362
+I267
+I344
+ta(I267
+I344
+I267
+I328
+ta(I267
+I328
+I266
+I310
+ta(I266
+I310
+I265
+I294
+ta(I265
+I294
+I264
+I276
+ta(I264
+I276
+I262
+I260
+ta(I262
+I260
+I260
+I246
+ta(I260
+I246
+I257
+I232
+ta(I257
+I232
+I256
+I228
+ta(I256
+I228
+I254
+I224
+ta(I254
+I224
+I252
+I220
+ta(I252
+I220
+I250
+I218
+ta(I250
+I218
+I249
+I218
+ta(I249
+I218
+I247
+I221
+ta(I247
+I221
+I245
+I226
+ta(I245
+I226
+I242
+I240
+ta(I242
+I240
+I238
+I256
+ta(I238
+I256
+I235
+I272
+ta(I235
+I272
+I231
+I288
+ta(I231
+I288
+I227
+I308
+ta(I227
+I308
+I222
+I326
+ta(I222
+I326
+I218
+I344
+ta(I218
+I344
+I214
+I364
+ta(I214
+I364
+I211
+I382
+ta(I211
+I382
+I209
+I388
+ta(I209
+I388
+I207
+I404
+ta(I207
+I404
+I206
+I407
+ta(I206
+I407
+I206
+I409
+ta(I206
+I409
+I206
+I410
+ta(I206
+I410
+I207
+I411
+ta(I207
+I411
+I209
+I409
+ta(I209
+I409
+I212
+I404
+ta(I212
+I404
+I215
+I398
+ta(I215
+I398
+I218
+I384
+ta(I218
+I384
+I222
+I366
+ta(I222
+I366
+I226
+I350
+ta(I226
+I350
+I230
+I330
+ta(I230
+I330
+I233
+I312
+ta(I233
+I312
+I235
+I292
+ta(I235
+I292
+I236
+I276
+ta(I236
+I276
+I237
+I260
+ta(I237
+I260
+I237
+I254
+ta(I237
+I254
+I237
+I251
+ta(I237
+I251
+I236
+I248
+ta(I236
+I248
+I235
+I248
+ta(I235
+I248
+I234
+I249
+ta(I234
+I249
+I232
+I267
+ta(I232
+I267
+I230
+I285
+ta(I230
+I285
+I227
+I305
+ta(I227
+I305
+I224
+I327
+ta(I224
+I327
+I221
+I349
+ta(I221
+I349
+I218
+I369
+ta(I218
+I369
+I215
+I387
+ta(I215
+I387
+I212
+I403
+ta(I212
+I403
+I211
+I408
+ta(I211
+I408
+I209
+I413
+ta(I209
+I413
+I208
+I415
+ta(I208
+I415
+I208
+I417
+ta(I208
+I417
+I208
+I415
+ta(I208
+I415
+I208
+I409
+ta(I208
+I409
+I208
+I404
+ta(I208
+I404
+I208
+I390
+ta(I208
+I390
+I208
+I374
+ta(I208
+I374
+I208
+I358
+ta(I208
+I358
+I208
+I340
+ta(I208
+I340
+I208
+I320
+ta(I208
+I320
+I208
+I302
+ta(I208
+I302
+I207
+I286
+ta(I207
+I286
+I206
+I270
+ta(I206
+I270
+I205
+I256
+ta(I205
+I256
+I204
+I251
+ta(I204
+I251
+I202
+I246
+ta(I202
+I246
+I201
+I243
+ta(I201
+I243
+I200
+I241
+ta(I200
+I241
+I197
+I246
+ta(I197
+I246
+I193
+I260
+ta(I193
+I260
+I190
+I278
+ta(I190
+I278
+I186
+I296
+ta(I186
+I296
+I182
+I312
+ta(I182
+I312
+I178
+I332
+ta(I178
+I332
+I173
+I352
+ta(I173
+I352
+I169
+I370
+ta(I169
+I370
+I165
+I386
+ta(I165
+I386
+I162
+I392
+ta(I162
+I392
+I159
+I398
+ta(I159
+I398
+I157
+I402
+ta(I157
+I402
+I157
+I404
+ta(I157
+I404
+I159
+I401
+ta(I159
+I401
+I161
+I387
+ta(I161
+I387
+I164
+I381
+ta(I164
+I381
+I165
+I367
+ta(I165
+I367
+I166
+I353
+ta(I166
+I353
+I167
+I339
+ta(I167
+I339
+I168
+I321
+ta(I168
+I321
+I169
+I305
+ta(I169
+I305
+I170
+I291
+ta(I170
+I291
+I171
+I275
+ta(I171
+I275
+I171
+I261
+ta(I171
+I261
+I171
+I255
+ta(I171
+I255
+I170
+I251
+ta(I170
+I251
+I170
+I248
+ta(I170
+I248
+I169
+I246
+ta(I169
+I246
+I168
+I246
+ta(I168
+I246
+I167
+I249
+ta(I167
+I249
+I164
+I263
+ta(I164
+I263
+I162
+I279
+ta(I162
+I279
+I160
+I297
+ta(I160
+I297
+I156
+I317
+ta(I156
+I317
+I153
+I339
+ta(I153
+I339
+I150
+I361
+ta(I150
+I361
+I145
+I381
+ta(I145
+I381
+I141
+I401
+ta(I141
+I401
+I137
+I419
+ta(I137
+I419
+I134
+I433
+ta(I134
+I433
+I133
+I438
+ta(I133
+I438
+I133
+I441
+ta(I133
+I441
+I133
+I443
+ta(I133
+I443
+I134
+I443
+ta(I134
+I443
+I135
+I443
+ta(I135
+I443
+I136
+I441
+ta(I136
+I441
+I138
+I436
+ta(I138
+I436
+I140
+I422
+ta(I140
+I422
+I141
+I416
+ta(I141
+I416
+I142
+I402
+ta(I142
+I402
+I143
+I384
+ta(I143
+I384
+I144
+I366
+ta(I144
+I366
+I144
+I346
+ta(I144
+I346
+I144
+I324
+ta(I144
+I324
+I143
+I306
+ta(I143
+I306
+I142
+I288
+ta(I142
+I288
+I141
+I272
+ta(I141
+I272
+I139
+I256
+ta(I139
+I256
+I138
+I252
+ta(I138
+I252
+I135
+I247
+ta(I135
+I247
+I134
+I245
+ta(I134
+I245
+I133
+I244
+ta(I133
+I244
+I131
+I246
+ta(I131
+I246
+I128
+I262
+ta(I128
+I262
+I125
+I280
+ta(I125
+I280
+I121
+I300
+ta(I121
+I300
+I117
+I322
+ta(I117
+I322
+I111
+I344
+ta(I111
+I344
+I107
+I368
+ta(I107
+I368
+I102
+I390
+ta(I102
+I390
+I98
+I408
+ta(I98
+I408
+I95
+I426
+ta(I95
+I426
+I93
+I431
+ta(I93
+I431
+I92
+I434
+ta(I92
+I434
+I92
+I435
+ta(I92
+I435
+I92
+I434
+ta(I92
+I434
+I94
+I428
+ta(I94
+I428
+I96
+I414
+ta(I96
+I414
+I98
+I400
+ta(I98
+I400
+I100
+I384
+ta(I100
+I384
+I101
+I368
+ta(I101
+I368
+I102
+I352
+ta(I102
+I352
+I103
+I336
+ta(I103
+I336
+I104
+I322
+ta(I104
+I322
+I104
+I316
+ta(I104
+I316
+I104
+I310
+ta(I104
+I310
+I104
+I306
+ta(I104
+I306
+I103
+I302
+ta(I103
+I302
+I102
+I298
+ta(I102
+I298
+I101
+I295
+ta(I101
+I295
+I101
+I292
+ta(I101
+I292
+I100
+I292
+ta(I100
+I292
+I99
+I294
+ta(I99
+I294
+I98
+I308
+ta(I98
+I308
+I95
+I326
+ta(I95
+I326
+I93
+I344
+ta(I93
+I344
+I90
+I366
+ta(I90
+I366
+I87
+I386
+ta(I87
+I386
+I83
+I410
+ta(I83
+I410
+I79
+I430
+ta(I79
+I430
+I75
+I448
+ta(I75
+I448
+I71
+I454
+ta(I71
+I454
+I68
+I460
+ta(I68
+I460
+I67
+I462
+ta(I67
+I462
+I66
+I463
+ta(I66
+I463
+I66
+I459
+ta(I66
+I459
+I67
+I443
+ta(I67
+I443
+I67
+I429
+ta(I67
+I429
+I67
+I415
+ta(I67
+I415
+I67
+I397
+ta(I67
+I397
+I66
+I377
+ta(I66
+I377
+I65
+I357
+ta(I65
+I357
+I63
+I337
+ta(I63
+I337
+I62
+I319
+ta(I62
+I319
+I61
+I301
+ta(I61
+I301
+I60
+I285
+ta(I60
+I285
+I57
+I269
+ta(I57
+I269
+I55
+I263
+ta(I55
+I263
+I53
+I257
+ta(I53
+I257
+I50
+I253
+ta(I50
+I253
+I48
+I248
+ta(I48
+I248
+I45
+I245
+ta(I45
+I245
+I43
+I243
+ta(I43
+I243
+I40
+I243
+ta(I40
+I243
+I38
+I243
+ta(I38
+I243
+I34
+I247
+ta(I34
+I247
+I29
+I253
+ta(I29
+I253
+I25
+I259
+ta(I25
+I259
+I23
+I265
+ta(I23
+I265
+I22
+I287
+ta(I22
+I287
+I22
+I305
+ta(I22
+I305
+I22
+I323
+ta(I22
+I323
+I22
+I339
+ta(I22
+I339
+I22
+I345
+ta(I22
+I345
+I22
+I350
+ta(I22
+I350
+I23
+I354
+ta(I23
+I354
+I23
+I357
+ta(I23
+I357
+I23
+I358
+ta(I23
+I358
+I24
+I355
+ta(I24
+I355
+I24
+I349
+ta(I24
+I349
+I25
+I333
+ta(I25
+I333
+I25
+I317
+ta(I25
+I317
+I26
+I299
+ta(I26
+I299
+I27
+I281
+ta(I27
+I281
+I28
+I261
+ta(I28
+I261
+I29
+I243
+ta(I29
+I243
+I30
+I227
+ta(I30
+I227
+I30
+I221
+ta(I30
+I221
+I30
+I217
+ta(I30
+I217
+I30
+I214
+ta(I30
+I214
+I29
+I211
+ta(I29
+I211
+I29
+I210
+ta(I29
+I210
+I28
+I210
+ta(I28
+I210
+I27
+I213
+ta(I27
+I213
+I26
+I217
+ta(I26
+I217
+I25
+I235
+ta(I25
+I235
+I24
+I251
+ta(I24
+I251
+I23
+I271
+ta(I23
+I271
+I22
+I289
+ta(I22
+I289
+I22
+I311
+ta(I22
+I311
+I22
+I333
+ta(I22
+I333
+I22
+I351
+ta(I22
+I351
+I22
+I369
+ta(I22
+I369
+I22
+I385
+ta(I22
+I385
+I23
+I391
+ta(I23
+I391
+I23
+I397
+ta(I23
+I397
+I24
+I400
+ta(I24
+I400
+I24
+I403
+ta(I24
+I403
+I24
+I404
+ta(I24
+I404
+I25
+I405
+ta(I25
+I405
+I26
+I405
+ta(I26
+I405
+I27
+I405
+ta(I27
+I405
+I26
+I405
+ta(I26
+I405
+I23
+I403
+ta(I23
+I403
+I19
+I402
+ta(I19
+I402
+I20
+I403
+tatp14
+a(g8
+I1
+(lp15
+(I15
+I424
+I15
+I425
+ta(I15
+I425
+I15
+I429
+ta(I15
+I429
+I15
+I432
+ta(I15
+I432
+I15
+I437
+ta(I15
+I437
+I16
+I451
+ta(I16
+I451
+I17
+I457
+ta(I17
+I457
+I17
+I463
+ta(I17
+I463
+I18
+I469
+ta(I18
+I469
+I18
+I475
+ta(I18
+I475
+I18
+I495
+ta(I18
+I495
+I18
+I511
+ta(I18
+I511
+I18
+I531
+ta(I18
+I531
+I18
+I555
+ta(I18
+I555
+I18
+I577
+ta(I18
+I577
+I18
+I599
+ta(I18
+I599
+I18
+I619
+ta(I18
+I619
+I18
+I635
+ta(I18
+I635
+I18
+I639
+ta(I18
+I639
+I19
+I641
+ta(I19
+I641
+I19
+I642
+ta(I19
+I642
+I20
+I639
+ta(I20
+I639
+I22
+I617
+ta(I22
+I617
+I23
+I595
+ta(I23
+I595
+I24
+I569
+ta(I24
+I569
+I26
+I541
+ta(I26
+I541
+I28
+I513
+ta(I28
+I513
+I30
+I487
+ta(I30
+I487
+I31
+I457
+ta(I31
+I457
+I33
+I433
+ta(I33
+I433
+I34
+I411
+ta(I34
+I411
+I34
+I391
+ta(I34
+I391
+I34
+I377
+ta(I34
+I377
+I34
+I372
+ta(I34
+I372
+I34
+I370
+ta(I34
+I370
+I34
+I369
+ta(I34
+I369
+I34
+I373
+ta(I34
+I373
+I34
+I389
+ta(I34
+I389
+I34
+I407
+ta(I34
+I407
+I35
+I427
+ta(I35
+I427
+I35
+I447
+ta(I35
+I447
+I35
+I469
+ta(I35
+I469
+I35
+I493
+ta(I35
+I493
+I35
+I515
+ta(I35
+I515
+I35
+I535
+ta(I35
+I535
+I35
+I553
+ta(I35
+I553
+I37
+I567
+ta(I37
+I567
+I37
+I570
+ta(I37
+I570
+I38
+I573
+ta(I38
+I573
+I39
+I573
+ta(I39
+I573
+I40
+I573
+ta(I40
+I573
+I40
+I568
+ta(I40
+I568
+I40
+I554
+ta(I40
+I554
+I40
+I538
+ta(I40
+I538
+I40
+I520
+ta(I40
+I520
+I40
+I500
+ta(I40
+I500
+I40
+I478
+ta(I40
+I478
+I40
+I456
+ta(I40
+I456
+I42
+I430
+ta(I42
+I430
+I42
+I406
+ta(I42
+I406
+I43
+I386
+ta(I43
+I386
+I45
+I368
+ta(I45
+I368
+I46
+I352
+ta(I46
+I352
+I46
+I347
+ta(I46
+I347
+I46
+I344
+ta(I46
+I344
+I46
+I342
+ta(I46
+I342
+I46
+I348
+ta(I46
+I348
+I46
+I370
+ta(I46
+I370
+I46
+I392
+ta(I46
+I392
+I47
+I416
+ta(I47
+I416
+I47
+I440
+ta(I47
+I440
+I47
+I466
+ta(I47
+I466
+I47
+I490
+ta(I47
+I490
+I47
+I514
+ta(I47
+I514
+I47
+I534
+ta(I47
+I534
+I47
+I554
+ta(I47
+I554
+I48
+I560
+ta(I48
+I560
+I49
+I564
+ta(I49
+I564
+I51
+I566
+ta(I51
+I566
+I52
+I567
+ta(I52
+I567
+I53
+I567
+ta(I53
+I567
+I54
+I565
+ta(I54
+I565
+I56
+I549
+ta(I56
+I549
+I58
+I533
+ta(I58
+I533
+I59
+I515
+ta(I59
+I515
+I60
+I493
+ta(I60
+I493
+I61
+I471
+ta(I61
+I471
+I63
+I449
+ta(I63
+I449
+I66
+I427
+ta(I66
+I427
+I68
+I407
+ta(I68
+I407
+I70
+I387
+ta(I70
+I387
+I72
+I369
+ta(I72
+I369
+I73
+I363
+ta(I73
+I363
+I73
+I361
+ta(I73
+I361
+I74
+I359
+ta(I74
+I359
+I74
+I361
+ta(I74
+I361
+I74
+I381
+ta(I74
+I381
+I75
+I397
+ta(I75
+I397
+I75
+I417
+ta(I75
+I417
+I76
+I441
+ta(I76
+I441
+I78
+I461
+ta(I78
+I461
+I79
+I483
+ta(I79
+I483
+I81
+I503
+ta(I81
+I503
+I82
+I525
+ta(I82
+I525
+I83
+I543
+ta(I83
+I543
+I84
+I559
+ta(I84
+I559
+I86
+I564
+ta(I86
+I564
+I88
+I569
+ta(I88
+I569
+I90
+I571
+ta(I90
+I571
+I91
+I572
+ta(I91
+I572
+I92
+I568
+ta(I92
+I568
+I95
+I552
+ta(I95
+I552
+I97
+I538
+ta(I97
+I538
+I99
+I520
+ta(I99
+I520
+I101
+I504
+ta(I101
+I504
+I103
+I486
+ta(I103
+I486
+I106
+I466
+ta(I106
+I466
+I109
+I446
+ta(I109
+I446
+I112
+I432
+ta(I112
+I432
+I114
+I414
+ta(I114
+I414
+I116
+I408
+ta(I116
+I408
+I118
+I403
+ta(I118
+I403
+I119
+I400
+ta(I119
+I400
+I119
+I398
+ta(I119
+I398
+I119
+I399
+ta(I119
+I399
+I119
+I415
+ta(I119
+I415
+I119
+I429
+ta(I119
+I429
+I121
+I447
+ta(I121
+I447
+I122
+I469
+ta(I122
+I469
+I123
+I487
+ta(I123
+I487
+I125
+I509
+ta(I125
+I509
+I126
+I531
+ta(I126
+I531
+I127
+I547
+ta(I127
+I547
+I128
+I561
+ta(I128
+I561
+I129
+I565
+ta(I129
+I565
+I130
+I568
+ta(I130
+I568
+I131
+I570
+ta(I131
+I570
+I132
+I570
+ta(I132
+I570
+I133
+I568
+ta(I133
+I568
+I135
+I563
+ta(I135
+I563
+I137
+I549
+ta(I137
+I549
+I139
+I533
+ta(I139
+I533
+I141
+I517
+ta(I141
+I517
+I142
+I495
+ta(I142
+I495
+I143
+I477
+ta(I143
+I477
+I145
+I455
+ta(I145
+I455
+I146
+I433
+ta(I146
+I433
+I148
+I415
+ta(I148
+I415
+I149
+I397
+ta(I149
+I397
+I150
+I379
+ta(I150
+I379
+I152
+I365
+ta(I152
+I365
+I154
+I361
+ta(I154
+I361
+I155
+I358
+ta(I155
+I358
+I155
+I356
+ta(I155
+I356
+I155
+I358
+ta(I155
+I358
+I155
+I374
+ta(I155
+I374
+I155
+I390
+ta(I155
+I390
+I156
+I410
+ta(I156
+I410
+I156
+I430
+ta(I156
+I430
+I156
+I454
+ta(I156
+I454
+I156
+I476
+ta(I156
+I476
+I156
+I498
+ta(I156
+I498
+I156
+I518
+ta(I156
+I518
+I156
+I540
+ta(I156
+I540
+I158
+I558
+ta(I158
+I558
+I159
+I572
+ta(I159
+I572
+I160
+I576
+ta(I160
+I576
+I162
+I578
+ta(I162
+I578
+I163
+I579
+ta(I163
+I579
+I164
+I579
+ta(I164
+I579
+I165
+I578
+ta(I165
+I578
+I167
+I564
+ta(I167
+I564
+I169
+I558
+ta(I169
+I558
+I172
+I538
+ta(I172
+I538
+I174
+I520
+ta(I174
+I520
+I177
+I498
+ta(I177
+I498
+I180
+I476
+ta(I180
+I476
+I182
+I454
+ta(I182
+I454
+I185
+I432
+ta(I185
+I432
+I188
+I414
+ta(I188
+I414
+I191
+I394
+ta(I191
+I394
+I193
+I378
+ta(I193
+I378
+I194
+I362
+ta(I194
+I362
+I195
+I348
+ta(I195
+I348
+I196
+I343
+ta(I196
+I343
+I196
+I340
+ta(I196
+I340
+I196
+I338
+ta(I196
+I338
+I197
+I338
+ta(I197
+I338
+I198
+I356
+ta(I198
+I356
+I199
+I372
+ta(I199
+I372
+I200
+I390
+ta(I200
+I390
+I201
+I414
+ta(I201
+I414
+I203
+I436
+ta(I203
+I436
+I204
+I460
+ta(I204
+I460
+I204
+I486
+ta(I204
+I486
+I205
+I508
+ta(I205
+I508
+I206
+I528
+ta(I206
+I528
+I207
+I548
+ta(I207
+I548
+I209
+I554
+ta(I209
+I554
+I211
+I558
+ta(I211
+I558
+I212
+I560
+ta(I212
+I560
+I212
+I561
+ta(I212
+I561
+I213
+I561
+ta(I213
+I561
+I213
+I558
+ta(I213
+I558
+I215
+I553
+ta(I215
+I553
+I216
+I539
+ta(I216
+I539
+I217
+I523
+ta(I217
+I523
+I218
+I501
+ta(I218
+I501
+I219
+I483
+ta(I219
+I483
+I221
+I461
+ta(I221
+I461
+I224
+I439
+ta(I224
+I439
+I227
+I417
+ta(I227
+I417
+I228
+I397
+ta(I228
+I397
+I229
+I377
+ta(I229
+I377
+I230
+I361
+ta(I230
+I361
+I231
+I347
+ta(I231
+I347
+I232
+I342
+ta(I232
+I342
+I232
+I338
+ta(I232
+I338
+I232
+I337
+ta(I232
+I337
+I233
+I337
+ta(I233
+I337
+I233
+I342
+ta(I233
+I342
+I233
+I356
+ta(I233
+I356
+I233
+I372
+ta(I233
+I372
+I233
+I394
+ta(I233
+I394
+I233
+I416
+ta(I233
+I416
+I233
+I438
+ta(I233
+I438
+I233
+I462
+ta(I233
+I462
+I233
+I484
+ta(I233
+I484
+I233
+I504
+ta(I233
+I504
+I233
+I526
+ta(I233
+I526
+I233
+I540
+ta(I233
+I540
+I233
+I545
+ta(I233
+I545
+I234
+I548
+ta(I234
+I548
+I235
+I551
+ta(I235
+I551
+I236
+I551
+ta(I236
+I551
+I237
+I549
+ta(I237
+I549
+I238
+I543
+ta(I238
+I543
+I240
+I529
+ta(I240
+I529
+I242
+I513
+ta(I242
+I513
+I245
+I495
+ta(I245
+I495
+I247
+I477
+ta(I247
+I477
+I250
+I457
+ta(I250
+I457
+I252
+I439
+ta(I252
+I439
+I255
+I417
+ta(I255
+I417
+I258
+I399
+ta(I258
+I399
+I261
+I381
+ta(I261
+I381
+I263
+I365
+ta(I263
+I365
+I265
+I351
+ta(I265
+I351
+I266
+I347
+ta(I266
+I347
+I267
+I343
+ta(I267
+I343
+I267
+I342
+ta(I267
+I342
+I267
+I348
+ta(I267
+I348
+I268
+I368
+ta(I268
+I368
+I269
+I384
+ta(I269
+I384
+I271
+I404
+ta(I271
+I404
+I272
+I424
+ta(I272
+I424
+I273
+I442
+ta(I273
+I442
+I274
+I462
+ta(I274
+I462
+I274
+I482
+ta(I274
+I482
+I274
+I498
+ta(I274
+I498
+I276
+I514
+ta(I276
+I514
+I277
+I520
+ta(I277
+I520
+I277
+I525
+ta(I277
+I525
+I279
+I527
+ta(I279
+I527
+I279
+I529
+ta(I279
+I529
+I280
+I528
+ta(I280
+I528
+I281
+I512
+ta(I281
+I512
+I282
+I498
+ta(I282
+I498
+I283
+I482
+ta(I283
+I482
+I284
+I460
+ta(I284
+I460
+I286
+I438
+ta(I286
+I438
+I287
+I416
+ta(I287
+I416
+I289
+I394
+ta(I289
+I394
+I290
+I372
+ta(I290
+I372
+I291
+I354
+ta(I291
+I354
+I292
+I336
+ta(I292
+I336
+I292
+I330
+ta(I292
+I330
+I292
+I327
+ta(I292
+I327
+I292
+I324
+ta(I292
+I324
+I292
+I323
+ta(I292
+I323
+I291
+I329
+ta(I291
+I329
+I291
+I343
+ta(I291
+I343
+I291
+I359
+ta(I291
+I359
+I291
+I381
+ta(I291
+I381
+I293
+I401
+ta(I293
+I401
+I294
+I423
+ta(I294
+I423
+I294
+I449
+ta(I294
+I449
+I294
+I473
+ta(I294
+I473
+I294
+I497
+ta(I294
+I497
+I295
+I517
+ta(I295
+I517
+I296
+I539
+ta(I296
+I539
+I297
+I553
+ta(I297
+I553
+I299
+I557
+ta(I299
+I557
+I301
+I559
+ta(I301
+I559
+I302
+I560
+ta(I302
+I560
+I303
+I560
+ta(I303
+I560
+I304
+I558
+ta(I304
+I558
+I306
+I552
+ta(I306
+I552
+I308
+I538
+ta(I308
+I538
+I310
+I520
+ta(I310
+I520
+I312
+I502
+ta(I312
+I502
+I314
+I484
+ta(I314
+I484
+I316
+I466
+ta(I316
+I466
+I318
+I446
+ta(I318
+I446
+I320
+I426
+ta(I320
+I426
+I321
+I406
+ta(I321
+I406
+I322
+I390
+ta(I322
+I390
+I322
+I374
+ta(I322
+I374
+I322
+I360
+ta(I322
+I360
+I322
+I357
+ta(I322
+I357
+I322
+I355
+ta(I322
+I355
+I322
+I354
+ta(I322
+I354
+I322
+I355
+ta(I322
+I355
+I322
+I361
+ta(I322
+I361
+I323
+I367
+ta(I323
+I367
+I323
+I383
+ta(I323
+I383
+I324
+I399
+ta(I324
+I399
+I325
+I415
+ta(I325
+I415
+I325
+I433
+ta(I325
+I433
+I326
+I453
+ta(I326
+I453
+I327
+I473
+ta(I327
+I473
+I328
+I493
+ta(I328
+I493
+I330
+I513
+ta(I330
+I513
+I331
+I529
+ta(I331
+I529
+I333
+I534
+ta(I333
+I534
+I335
+I538
+ta(I335
+I538
+I336
+I541
+ta(I336
+I541
+I337
+I541
+ta(I337
+I541
+I338
+I541
+ta(I338
+I541
+I339
+I540
+ta(I339
+I540
+I340
+I535
+ta(I340
+I535
+I342
+I521
+ta(I342
+I521
+I344
+I507
+ta(I344
+I507
+I346
+I491
+ta(I346
+I491
+I349
+I471
+ta(I349
+I471
+I351
+I453
+ta(I351
+I453
+I353
+I435
+ta(I353
+I435
+I356
+I413
+ta(I356
+I413
+I358
+I395
+ta(I358
+I395
+I359
+I379
+ta(I359
+I379
+I360
+I365
+ta(I360
+I365
+I360
+I351
+ta(I360
+I351
+I361
+I348
+ta(I361
+I348
+I361
+I345
+ta(I361
+I345
+I361
+I349
+ta(I361
+I349
+I361
+I371
+ta(I361
+I371
+I362
+I387
+ta(I362
+I387
+I363
+I407
+ta(I363
+I407
+I365
+I427
+ta(I365
+I427
+I366
+I447
+ta(I366
+I447
+I366
+I463
+ta(I366
+I463
+I368
+I485
+ta(I368
+I485
+I369
+I503
+ta(I369
+I503
+I371
+I519
+ta(I371
+I519
+I374
+I537
+ta(I374
+I537
+I377
+I543
+ta(I377
+I543
+I380
+I548
+ta(I380
+I548
+I383
+I551
+ta(I383
+I551
+I385
+I553
+ta(I385
+I553
+I386
+I553
+ta(I386
+I553
+I387
+I553
+ta(I387
+I553
+I389
+I549
+ta(I389
+I549
+I391
+I544
+ta(I391
+I544
+I394
+I530
+ta(I394
+I530
+I398
+I514
+ta(I398
+I514
+I401
+I498
+ta(I401
+I498
+I405
+I480
+ta(I405
+I480
+I409
+I458
+ta(I409
+I458
+I412
+I440
+ta(I412
+I440
+I414
+I422
+ta(I414
+I422
+I417
+I400
+ta(I417
+I400
+I418
+I384
+ta(I418
+I384
+I419
+I368
+ta(I419
+I368
+I419
+I362
+ta(I419
+I362
+I419
+I359
+ta(I419
+I359
+I419
+I356
+ta(I419
+I356
+I420
+I359
+ta(I420
+I359
+I421
+I379
+ta(I421
+I379
+I421
+I395
+ta(I421
+I395
+I422
+I415
+ta(I422
+I415
+I423
+I435
+ta(I423
+I435
+I425
+I455
+ta(I425
+I455
+I426
+I473
+ta(I426
+I473
+I427
+I491
+ta(I427
+I491
+I429
+I507
+ta(I429
+I507
+I432
+I512
+ta(I432
+I512
+I434
+I518
+ta(I434
+I518
+I436
+I522
+ta(I436
+I522
+I439
+I526
+ta(I439
+I526
+I441
+I530
+ta(I441
+I530
+I443
+I533
+ta(I443
+I533
+I446
+I537
+ta(I446
+I537
+I447
+I539
+ta(I447
+I539
+I449
+I542
+ta(I449
+I542
+I450
+I543
+ta(I450
+I543
+I450
+I544
+ta(I450
+I544
+I450
+I543
+ta(I450
+I543
+I450
+I539
+ta(I450
+I539
+I450
+I536
+ta(I450
+I536
+I450
+I533
+ta(I450
+I533
+I450
+I529
+ta(I450
+I529
+I450
+I526
+ta(I450
+I526
+I450
+I523
+tatp16
+a(g8
+I1
+(lp17
+(I463
+I513
+I462
+I499
+ta(I462
+I499
+I461
+I493
+ta(I461
+I493
+I460
+I487
+ta(I460
+I487
+I460
+I481
+ta(I460
+I481
+I459
+I467
+ta(I459
+I467
+I459
+I453
+ta(I459
+I453
+I459
+I447
+ta(I459
+I447
+I459
+I441
+ta(I459
+I441
+I459
+I435
+ta(I459
+I435
+I459
+I430
+ta(I459
+I430
+I459
+I426
+ta(I459
+I426
+I459
+I423
+ta(I459
+I423
+I459
+I420
+ta(I459
+I420
+I459
+I419
+ta(I459
+I419
+I459
+I421
+ta(I459
+I421
+I459
+I435
+ta(I459
+I435
+I460
+I449
+ta(I460
+I449
+I461
+I467
+ta(I461
+I467
+I462
+I483
+ta(I462
+I483
+I463
+I503
+ta(I463
+I503
+I464
+I523
+ta(I464
+I523
+I464
+I543
+ta(I464
+I543
+I464
+I563
+ta(I464
+I563
+I464
+I583
+ta(I464
+I583
+I464
+I599
+ta(I464
+I599
+I464
+I615
+ta(I464
+I615
+I464
+I621
+ta(I464
+I621
+I464
+I626
+ta(I464
+I626
+I464
+I629
+ta(I464
+I629
+I464
+I630
+ta(I464
+I630
+I464
+I628
+ta(I464
+I628
+I464
+I608
+ta(I464
+I608
+I464
+I592
+ta(I464
+I592
+I463
+I572
+ta(I463
+I572
+I463
+I546
+ta(I463
+I546
+I463
+I518
+ta(I463
+I518
+I464
+I492
+ta(I464
+I492
+I466
+I464
+ta(I466
+I464
+I468
+I438
+ta(I468
+I438
+I471
+I414
+ta(I471
+I414
+I474
+I392
+ta(I474
+I392
+I477
+I376
+ta(I477
+I376
+I479
+I370
+ta(I479
+I370
+I481
+I367
+ta(I481
+I367
+I482
+I365
+ta(I482
+I365
+I483
+I366
+ta(I483
+I366
+I485
+I382
+ta(I485
+I382
+I487
+I396
+ta(I487
+I396
+I490
+I414
+ta(I490
+I414
+I493
+I432
+ta(I493
+I432
+I495
+I446
+ta(I495
+I446
+I498
+I466
+ta(I498
+I466
+I501
+I486
+ta(I501
+I486
+I504
+I502
+ta(I504
+I502
+I506
+I518
+ta(I506
+I518
+I508
+I534
+ta(I508
+I534
+I510
+I548
+ta(I510
+I548
+I511
+I551
+ta(I511
+I551
+I512
+I553
+ta(I512
+I553
+I513
+I554
+ta(I513
+I554
+I514
+I554
+ta(I514
+I554
+I515
+I551
+ta(I515
+I551
+I515
+I537
+ta(I515
+I537
+I516
+I531
+ta(I516
+I531
+I518
+I511
+ta(I518
+I511
+I519
+I493
+ta(I519
+I493
+I521
+I473
+ta(I521
+I473
+I524
+I453
+ta(I524
+I453
+I527
+I431
+ta(I527
+I431
+I530
+I413
+ta(I530
+I413
+I533
+I395
+ta(I533
+I395
+I535
+I381
+ta(I535
+I381
+I537
+I376
+ta(I537
+I376
+I538
+I372
+ta(I538
+I372
+I539
+I370
+ta(I539
+I370
+I539
+I369
+ta(I539
+I369
+I539
+I372
+ta(I539
+I372
+I539
+I386
+ta(I539
+I386
+I540
+I402
+ta(I540
+I402
+I541
+I418
+ta(I541
+I418
+I541
+I438
+ta(I541
+I438
+I541
+I460
+ta(I541
+I460
+I541
+I484
+ta(I541
+I484
+I541
+I506
+ta(I541
+I506
+I541
+I526
+ta(I541
+I526
+I541
+I548
+ta(I541
+I548
+I541
+I566
+ta(I541
+I566
+I541
+I580
+ta(I541
+I580
+I543
+I585
+ta(I543
+I585
+I544
+I588
+ta(I544
+I588
+I544
+I590
+ta(I544
+I590
+I545
+I590
+ta(I545
+I590
+I546
+I590
+ta(I546
+I590
+I547
+I588
+ta(I547
+I588
+I549
+I582
+ta(I549
+I582
+I551
+I568
+ta(I551
+I568
+I554
+I554
+ta(I554
+I554
+I556
+I534
+ta(I556
+I534
+I559
+I510
+ta(I559
+I510
+I562
+I490
+ta(I562
+I490
+I565
+I468
+ta(I565
+I468
+I568
+I446
+ta(I568
+I446
+I570
+I428
+ta(I570
+I428
+I572
+I410
+ta(I572
+I410
+I574
+I396
+ta(I574
+I396
+I576
+I392
+ta(I576
+I392
+I577
+I388
+ta(I577
+I388
+I577
+I387
+ta(I577
+I387
+I577
+I388
+ta(I577
+I388
+I578
+I394
+ta(I578
+I394
+I578
+I408
+ta(I578
+I408
+I578
+I424
+ta(I578
+I424
+I578
+I440
+ta(I578
+I440
+I578
+I460
+ta(I578
+I460
+I578
+I478
+ta(I578
+I478
+I580
+I496
+ta(I580
+I496
+I581
+I516
+ta(I581
+I516
+I582
+I530
+ta(I582
+I530
+I584
+I535
+ta(I584
+I535
+I587
+I539
+ta(I587
+I539
+I589
+I542
+ta(I589
+I542
+I590
+I543
+ta(I590
+I543
+I591
+I543
+ta(I591
+I543
+I593
+I540
+ta(I593
+I540
+I595
+I534
+ta(I595
+I534
+I599
+I520
+ta(I599
+I520
+I602
+I504
+ta(I602
+I504
+I605
+I488
+ta(I605
+I488
+I608
+I470
+ta(I608
+I470
+I611
+I452
+ta(I611
+I452
+I614
+I436
+ta(I614
+I436
+I616
+I422
+ta(I616
+I422
+I618
+I408
+ta(I618
+I408
+I620
+I404
+ta(I620
+I404
+I620
+I400
+ta(I620
+I400
+I621
+I397
+ta(I621
+I397
+I621
+I396
+ta(I621
+I396
+I621
+I400
+ta(I621
+I400
+I621
+I414
+ta(I621
+I414
+I621
+I430
+ta(I621
+I430
+I622
+I446
+ta(I622
+I446
+I623
+I464
+ta(I623
+I464
+I624
+I484
+ta(I624
+I484
+I625
+I504
+ta(I625
+I504
+I626
+I520
+ta(I626
+I520
+I628
+I538
+ta(I628
+I538
+I629
+I544
+ta(I629
+I544
+I630
+I550
+ta(I630
+I550
+I632
+I552
+ta(I632
+I552
+I634
+I555
+ta(I634
+I555
+I635
+I555
+ta(I635
+I555
+I637
+I555
+ta(I637
+I555
+I640
+I552
+ta(I640
+I552
+I643
+I548
+ta(I643
+I548
+I647
+I542
+ta(I647
+I542
+I652
+I524
+ta(I652
+I524
+I655
+I508
+ta(I655
+I508
+I658
+I490
+ta(I658
+I490
+I661
+I472
+ta(I661
+I472
+I663
+I456
+ta(I663
+I456
+I664
+I438
+ta(I664
+I438
+I665
+I422
+ta(I665
+I422
+I666
+I416
+ta(I666
+I416
+I667
+I412
+ta(I667
+I412
+I667
+I409
+ta(I667
+I409
+I667
+I408
+ta(I667
+I408
+I668
+I409
+ta(I668
+I409
+I668
+I414
+ta(I668
+I414
+I668
+I420
+ta(I668
+I420
+I669
+I426
+ta(I669
+I426
+I670
+I442
+ta(I670
+I442
+I671
+I458
+ta(I671
+I458
+I672
+I476
+ta(I672
+I476
+I673
+I490
+ta(I673
+I490
+I674
+I504
+ta(I674
+I504
+I676
+I509
+ta(I676
+I509
+I678
+I515
+ta(I678
+I515
+I681
+I520
+ta(I681
+I520
+I683
+I523
+ta(I683
+I523
+I687
+I526
+ta(I687
+I526
+I689
+I526
+ta(I689
+I526
+I690
+I526
+ta(I690
+I526
+I691
+I526
+ta(I691
+I526
+I692
+I522
+ta(I692
+I522
+I693
+I519
+ta(I693
+I519
+I693
+I514
+ta(I693
+I514
+I694
+I500
+ta(I694
+I500
+I695
+I494
+ta(I695
+I494
+I696
+I480
+ta(I696
+I480
+I696
+I474
+ta(I696
+I474
+I697
+I469
+ta(I697
+I469
+I697
+I463
+ta(I697
+I463
+I698
+I460
+ta(I698
+I460
+I698
+I456
+ta(I698
+I456
+I698
+I453
+ta(I698
+I453
+I698
+I450
+ta(I698
+I450
+I698
+I453
+ta(I698
+I453
+I699
+I467
+ta(I699
+I467
+I700
+I473
+ta(I700
+I473
+I701
+I479
+ta(I701
+I479
+I701
+I485
+ta(I701
+I485
+I702
+I490
+ta(I702
+I490
+I703
+I496
+ta(I703
+I496
+I703
+I501
+ta(I703
+I501
+I703
+I505
+ta(I703
+I505
+I704
+I508
+ta(I704
+I508
+I704
+I511
+ta(I704
+I511
+I704
+I514
+ta(I704
+I514
+I705
+I515
+ta(I705
+I515
+I705
+I516
+ta(I705
+I516
+I705
+I517
+ta(I705
+I517
+I706
+I517
+tatp18
+a(S'Purple'
+p19
+I16
+(lp20
+(I56
+I145
+I57
+I145
+ta(I57
+I145
+I58
+I145
+ta(I58
+I145
+I59
+I145
+ta(I59
+I145
+I60
+I145
+ta(I60
+I145
+I61
+I145
+ta(I61
+I145
+I62
+I145
+ta(I62
+I145
+I63
+I144
+ta(I63
+I144
+I64
+I144
+ta(I64
+I144
+I65
+I144
+ta(I65
+I144
+I67
+I144
+ta(I67
+I144
+I68
+I144
+ta(I68
+I144
+I69
+I143
+ta(I69
+I143
+I70
+I143
+ta(I70
+I143
+I71
+I143
+ta(I71
+I143
+I73
+I142
+ta(I73
+I142
+I74
+I142
+ta(I74
+I142
+I75
+I141
+ta(I75
+I141
+I76
+I141
+ta(I76
+I141
+I77
+I140
+ta(I77
+I140
+I77
+I139
+ta(I77
+I139
+I78
+I139
+ta(I78
+I139
+I79
+I139
+ta(I79
+I139
+I79
+I138
+ta(I79
+I138
+I80
+I138
+ta(I80
+I138
+I81
+I138
+ta(I81
+I138
+I82
+I137
+ta(I82
+I137
+I83
+I137
+ta(I83
+I137
+I83
+I136
+ta(I83
+I136
+I84
+I136
+ta(I84
+I136
+I85
+I137
+ta(I85
+I137
+I85
+I138
+ta(I85
+I138
+I85
+I139
+ta(I85
+I139
+I85
+I141
+ta(I85
+I141
+I85
+I142
+ta(I85
+I142
+I85
+I143
+ta(I85
+I143
+I85
+I145
+ta(I85
+I145
+I85
+I146
+ta(I85
+I146
+I85
+I147
+ta(I85
+I147
+I86
+I149
+ta(I86
+I149
+I86
+I151
+ta(I86
+I151
+I86
+I152
+ta(I86
+I152
+I86
+I153
+ta(I86
+I153
+I87
+I154
+ta(I87
+I154
+I87
+I155
+ta(I87
+I155
+I87
+I156
+ta(I87
+I156
+I87
+I157
+ta(I87
+I157
+I87
+I159
+ta(I87
+I159
+I87
+I160
+ta(I87
+I160
+I87
+I161
+ta(I87
+I161
+I87
+I162
+ta(I87
+I162
+I87
+I163
+ta(I87
+I163
+I88
+I164
+ta(I88
+I164
+I88
+I165
+ta(I88
+I165
+I88
+I167
+ta(I88
+I167
+I88
+I168
+ta(I88
+I168
+I88
+I170
+ta(I88
+I170
+I88
+I171
+ta(I88
+I171
+I88
+I172
+ta(I88
+I172
+I88
+I173
+ta(I88
+I173
+I88
+I174
+ta(I88
+I174
+I88
+I175
+ta(I88
+I175
+I88
+I176
+ta(I88
+I176
+I88
+I177
+ta(I88
+I177
+I88
+I178
+ta(I88
+I178
+I88
+I179
+ta(I88
+I179
+I88
+I181
+ta(I88
+I181
+I88
+I182
+ta(I88
+I182
+I88
+I184
+ta(I88
+I184
+I88
+I186
+ta(I88
+I186
+I89
+I187
+ta(I89
+I187
+I89
+I188
+ta(I89
+I188
+I89
+I190
+ta(I89
+I190
+I89
+I191
+ta(I89
+I191
+I90
+I191
+ta(I90
+I191
+I90
+I192
+ta(I90
+I192
+I91
+I193
+ta(I91
+I193
+I91
+I194
+ta(I91
+I194
+I92
+I195
+ta(I92
+I195
+I93
+I196
+ta(I93
+I196
+I94
+I197
+ta(I94
+I197
+I95
+I198
+ta(I95
+I198
+I96
+I199
+ta(I96
+I199
+I97
+I199
+ta(I97
+I199
+I97
+I200
+ta(I97
+I200
+I98
+I201
+ta(I98
+I201
+I99
+I201
+ta(I99
+I201
+I99
+I202
+ta(I99
+I202
+I100
+I202
+ta(I100
+I202
+I101
+I202
+ta(I101
+I202
+I102
+I202
+ta(I102
+I202
+I103
+I202
+ta(I103
+I202
+I104
+I202
+ta(I104
+I202
+I106
+I202
+ta(I106
+I202
+I107
+I201
+ta(I107
+I201
+I108
+I200
+ta(I108
+I200
+I109
+I200
+ta(I109
+I200
+I110
+I199
+ta(I110
+I199
+I111
+I199
+ta(I111
+I199
+I112
+I198
+ta(I112
+I198
+I114
+I196
+ta(I114
+I196
+I114
+I195
+ta(I114
+I195
+I115
+I194
+ta(I115
+I194
+I116
+I193
+ta(I116
+I193
+I117
+I192
+ta(I117
+I192
+I117
+I190
+ta(I117
+I190
+I118
+I189
+ta(I118
+I189
+I119
+I188
+ta(I119
+I188
+I120
+I187
+ta(I120
+I187
+I120
+I185
+ta(I120
+I185
+I121
+I184
+ta(I121
+I184
+I122
+I183
+ta(I122
+I183
+I122
+I182
+ta(I122
+I182
+I122
+I180
+ta(I122
+I180
+I122
+I179
+ta(I122
+I179
+I122
+I178
+ta(I122
+I178
+I122
+I177
+ta(I122
+I177
+I122
+I176
+ta(I122
+I176
+I122
+I175
+ta(I122
+I175
+I122
+I174
+ta(I122
+I174
+I122
+I173
+ta(I122
+I173
+I122
+I172
+ta(I122
+I172
+I122
+I171
+ta(I122
+I171
+I122
+I172
+ta(I122
+I172
+I122
+I173
+ta(I122
+I173
+I123
+I174
+ta(I123
+I174
+I123
+I175
+ta(I123
+I175
+I124
+I177
+ta(I124
+I177
+I125
+I178
+ta(I125
+I178
+I125
+I180
+ta(I125
+I180
+I126
+I181
+ta(I126
+I181
+I126
+I182
+ta(I126
+I182
+I126
+I183
+ta(I126
+I183
+I127
+I184
+ta(I127
+I184
+I127
+I185
+ta(I127
+I185
+I127
+I186
+ta(I127
+I186
+I128
+I187
+ta(I128
+I187
+I129
+I188
+ta(I129
+I188
+I130
+I189
+ta(I130
+I189
+I131
+I190
+ta(I131
+I190
+I132
+I190
+ta(I132
+I190
+I133
+I191
+ta(I133
+I191
+I134
+I191
+ta(I134
+I191
+I135
+I192
+ta(I135
+I192
+I136
+I192
+ta(I136
+I192
+I137
+I192
+ta(I137
+I192
+I138
+I192
+ta(I138
+I192
+I139
+I192
+ta(I139
+I192
+I140
+I192
+ta(I140
+I192
+I141
+I192
+ta(I141
+I192
+I143
+I192
+ta(I143
+I192
+I144
+I191
+ta(I144
+I191
+I145
+I191
+ta(I145
+I191
+I146
+I191
+ta(I146
+I191
+I147
+I191
+ta(I147
+I191
+I148
+I190
+ta(I148
+I190
+I149
+I190
+ta(I149
+I190
+I150
+I189
+ta(I150
+I189
+I151
+I188
+ta(I151
+I188
+I152
+I188
+ta(I152
+I188
+I153
+I188
+ta(I153
+I188
+I153
+I187
+ta(I153
+I187
+I153
+I186
+ta(I153
+I186
+I154
+I186
+ta(I154
+I186
+I154
+I185
+ta(I154
+I185
+I155
+I184
+ta(I155
+I184
+I155
+I182
+ta(I155
+I182
+I156
+I181
+ta(I156
+I181
+I157
+I180
+ta(I157
+I180
+I157
+I179
+ta(I157
+I179
+I158
+I178
+ta(I158
+I178
+I158
+I177
+ta(I158
+I177
+I158
+I175
+ta(I158
+I175
+I159
+I175
+ta(I159
+I175
+I159
+I174
+ta(I159
+I174
+I159
+I173
+ta(I159
+I173
+I160
+I172
+ta(I160
+I172
+I160
+I170
+ta(I160
+I170
+I160
+I168
+ta(I160
+I168
+I161
+I167
+ta(I161
+I167
+I161
+I166
+ta(I161
+I166
+I161
+I164
+ta(I161
+I164
+I162
+I163
+ta(I162
+I163
+I162
+I161
+ta(I162
+I161
+I162
+I160
+ta(I162
+I160
+I162
+I159
+ta(I162
+I159
+I162
+I158
+ta(I162
+I158
+I162
+I157
+ta(I162
+I157
+I162
+I155
+ta(I162
+I155
+I162
+I154
+ta(I162
+I154
+I162
+I153
+ta(I162
+I153
+I162
+I152
+ta(I162
+I152
+I162
+I151
+ta(I162
+I151
+I162
+I150
+ta(I162
+I150
+I162
+I149
+ta(I162
+I149
+I162
+I148
+ta(I162
+I148
+I162
+I147
+ta(I162
+I147
+I161
+I146
+ta(I161
+I146
+I161
+I145
+ta(I161
+I145
+I160
+I144
+ta(I160
+I144
+I160
+I143
+ta(I160
+I143
+I160
+I142
+ta(I160
+I142
+I159
+I141
+ta(I159
+I141
+I159
+I140
+ta(I159
+I140
+I158
+I139
+ta(I158
+I139
+I158
+I138
+ta(I158
+I138
+I157
+I138
+ta(I157
+I138
+I157
+I137
+ta(I157
+I137
+I156
+I136
+ta(I156
+I136
+I156
+I135
+ta(I156
+I135
+I155
+I135
+ta(I155
+I135
+I155
+I134
+ta(I155
+I134
+I154
+I134
+ta(I154
+I134
+I154
+I133
+ta(I154
+I133
+I153
+I132
+ta(I153
+I132
+I153
+I131
+ta(I153
+I131
+I152
+I131
+ta(I152
+I131
+I152
+I130
+ta(I152
+I130
+I151
+I130
+ta(I151
+I130
+I151
+I129
+tatp21
+a(g19
+I16
+(lp22
+(I185
+I125
+I186
+I126
+ta(I186
+I126
+I188
+I127
+ta(I188
+I127
+I189
+I128
+ta(I189
+I128
+I190
+I129
+ta(I190
+I129
+I191
+I130
+ta(I191
+I130
+I192
+I131
+ta(I192
+I131
+I194
+I132
+ta(I194
+I132
+I195
+I134
+ta(I195
+I134
+I196
+I135
+ta(I196
+I135
+I198
+I136
+ta(I198
+I136
+I199
+I138
+ta(I199
+I138
+I200
+I139
+ta(I200
+I139
+I201
+I139
+ta(I201
+I139
+I203
+I141
+ta(I203
+I141
+I204
+I141
+ta(I204
+I141
+I204
+I142
+ta(I204
+I142
+I205
+I143
+ta(I205
+I143
+I206
+I144
+ta(I206
+I144
+I207
+I145
+ta(I207
+I145
+I208
+I146
+ta(I208
+I146
+I209
+I147
+ta(I209
+I147
+I210
+I148
+ta(I210
+I148
+I211
+I149
+ta(I211
+I149
+I212
+I150
+ta(I212
+I150
+I213
+I151
+ta(I213
+I151
+I214
+I152
+ta(I214
+I152
+I215
+I153
+ta(I215
+I153
+I215
+I154
+ta(I215
+I154
+I216
+I155
+ta(I216
+I155
+I218
+I156
+ta(I218
+I156
+I219
+I157
+ta(I219
+I157
+I220
+I159
+ta(I220
+I159
+I221
+I160
+ta(I221
+I160
+I222
+I162
+ta(I222
+I162
+I223
+I164
+ta(I223
+I164
+I224
+I166
+ta(I224
+I166
+I226
+I168
+ta(I226
+I168
+I227
+I170
+ta(I227
+I170
+I228
+I171
+ta(I228
+I171
+I229
+I173
+ta(I229
+I173
+I230
+I174
+ta(I230
+I174
+I230
+I175
+ta(I230
+I175
+I231
+I176
+ta(I231
+I176
+I231
+I177
+ta(I231
+I177
+I232
+I177
+ta(I232
+I177
+I233
+I178
+ta(I233
+I178
+I233
+I180
+ta(I233
+I180
+I234
+I180
+ta(I234
+I180
+I235
+I181
+ta(I235
+I181
+I235
+I182
+ta(I235
+I182
+I236
+I183
+ta(I236
+I183
+I237
+I184
+ta(I237
+I184
+I237
+I185
+ta(I237
+I185
+I238
+I186
+ta(I238
+I186
+I238
+I187
+ta(I238
+I187
+I239
+I187
+ta(I239
+I187
+I239
+I188
+ta(I239
+I188
+I240
+I188
+ta(I240
+I188
+I240
+I189
+ta(I240
+I189
+I241
+I190
+ta(I241
+I190
+I241
+I191
+ta(I241
+I191
+I242
+I192
+ta(I242
+I192
+I243
+I193
+ta(I243
+I193
+I243
+I194
+ta(I243
+I194
+I244
+I194
+tatp23
+a(g19
+I16
+(lp24
+(I236
+I127
+I236
+I128
+ta(I236
+I128
+I236
+I129
+ta(I236
+I129
+I236
+I130
+ta(I236
+I130
+I235
+I131
+ta(I235
+I131
+I234
+I132
+ta(I234
+I132
+I233
+I134
+ta(I233
+I134
+I233
+I135
+ta(I233
+I135
+I232
+I136
+ta(I232
+I136
+I231
+I138
+ta(I231
+I138
+I230
+I139
+ta(I230
+I139
+I229
+I141
+ta(I229
+I141
+I228
+I142
+ta(I228
+I142
+I226
+I144
+ta(I226
+I144
+I225
+I146
+ta(I225
+I146
+I224
+I147
+ta(I224
+I147
+I223
+I149
+ta(I223
+I149
+I222
+I150
+ta(I222
+I150
+I222
+I151
+ta(I222
+I151
+I220
+I153
+ta(I220
+I153
+I220
+I154
+ta(I220
+I154
+I219
+I155
+ta(I219
+I155
+I218
+I156
+ta(I218
+I156
+I217
+I157
+ta(I217
+I157
+I216
+I159
+ta(I216
+I159
+I215
+I160
+ta(I215
+I160
+I214
+I161
+ta(I214
+I161
+I213
+I162
+ta(I213
+I162
+I213
+I163
+ta(I213
+I163
+I212
+I165
+ta(I212
+I165
+I211
+I166
+ta(I211
+I166
+I211
+I167
+ta(I211
+I167
+I209
+I168
+ta(I209
+I168
+I208
+I170
+ta(I208
+I170
+I208
+I171
+ta(I208
+I171
+I207
+I172
+ta(I207
+I172
+I206
+I173
+ta(I206
+I173
+I205
+I174
+ta(I205
+I174
+I205
+I175
+ta(I205
+I175
+I204
+I176
+ta(I204
+I176
+I204
+I177
+ta(I204
+I177
+I203
+I178
+ta(I203
+I178
+I203
+I179
+ta(I203
+I179
+I202
+I181
+ta(I202
+I181
+I201
+I181
+ta(I201
+I181
+I201
+I182
+ta(I201
+I182
+I201
+I183
+ta(I201
+I183
+I200
+I184
+ta(I200
+I184
+I200
+I185
+ta(I200
+I185
+I199
+I185
+ta(I199
+I185
+I199
+I186
+ta(I199
+I186
+I199
+I187
+ta(I199
+I187
+I199
+I188
+ta(I199
+I188
+I198
+I188
+ta(I198
+I188
+I198
+I189
+ta(I198
+I189
+I198
+I190
+ta(I198
+I190
+I197
+I190
+ta(I197
+I190
+I197
+I191
+ta(I197
+I191
+I197
+I192
+tatp25
+a(g19
+I16
+(lp26
+(I261
+I48
+I262
+I48
+ta(I262
+I48
+I262
+I51
+ta(I262
+I51
+I263
+I53
+ta(I263
+I53
+I263
+I55
+ta(I263
+I55
+I263
+I57
+ta(I263
+I57
+I264
+I60
+ta(I264
+I60
+I264
+I62
+ta(I264
+I62
+I264
+I65
+ta(I264
+I65
+I264
+I68
+ta(I264
+I68
+I265
+I71
+ta(I265
+I71
+I265
+I74
+ta(I265
+I74
+I266
+I77
+ta(I266
+I77
+I266
+I80
+ta(I266
+I80
+I267
+I84
+ta(I267
+I84
+I267
+I86
+ta(I267
+I86
+I267
+I89
+ta(I267
+I89
+I268
+I92
+ta(I268
+I92
+I268
+I95
+ta(I268
+I95
+I268
+I97
+ta(I268
+I97
+I269
+I101
+ta(I269
+I101
+I269
+I104
+ta(I269
+I104
+I269
+I107
+ta(I269
+I107
+I269
+I110
+ta(I269
+I110
+I270
+I113
+ta(I270
+I113
+I270
+I116
+ta(I270
+I116
+I271
+I119
+ta(I271
+I119
+I271
+I121
+ta(I271
+I121
+I271
+I123
+ta(I271
+I123
+I272
+I124
+ta(I272
+I124
+I272
+I125
+ta(I272
+I125
+I272
+I126
+ta(I272
+I126
+I273
+I127
+ta(I273
+I127
+I274
+I128
+ta(I274
+I128
+I274
+I130
+ta(I274
+I130
+I275
+I131
+ta(I275
+I131
+I275
+I133
+ta(I275
+I133
+I275
+I135
+ta(I275
+I135
+I276
+I137
+ta(I276
+I137
+I276
+I138
+ta(I276
+I138
+I276
+I140
+ta(I276
+I140
+I276
+I142
+ta(I276
+I142
+I276
+I144
+ta(I276
+I144
+I276
+I145
+ta(I276
+I145
+I276
+I146
+ta(I276
+I146
+I277
+I148
+ta(I277
+I148
+I277
+I150
+ta(I277
+I150
+I277
+I152
+ta(I277
+I152
+I278
+I154
+ta(I278
+I154
+I278
+I155
+ta(I278
+I155
+I278
+I157
+ta(I278
+I157
+I279
+I159
+ta(I279
+I159
+I280
+I162
+ta(I280
+I162
+I280
+I164
+ta(I280
+I164
+I280
+I165
+ta(I280
+I165
+I280
+I168
+ta(I280
+I168
+I280
+I169
+ta(I280
+I169
+I280
+I171
+ta(I280
+I171
+I280
+I173
+ta(I280
+I173
+I280
+I175
+ta(I280
+I175
+I280
+I177
+ta(I280
+I177
+I280
+I179
+ta(I280
+I179
+I280
+I180
+ta(I280
+I180
+I280
+I182
+ta(I280
+I182
+I280
+I183
+ta(I280
+I183
+I280
+I184
+ta(I280
+I184
+I280
+I185
+ta(I280
+I185
+I280
+I186
+ta(I280
+I186
+I280
+I187
+ta(I280
+I187
+I280
+I188
+ta(I280
+I188
+I280
+I189
+ta(I280
+I189
+I280
+I190
+ta(I280
+I190
+I280
+I191
+ta(I280
+I191
+I281
+I192
+ta(I281
+I192
+I281
+I193
+tatp27
+a(g19
+I16
+(lp28
+(I256
+I46
+I257
+I46
+ta(I257
+I46
+I259
+I45
+ta(I259
+I45
+I262
+I44
+ta(I262
+I44
+I265
+I43
+ta(I265
+I43
+I268
+I42
+ta(I268
+I42
+I271
+I40
+ta(I271
+I40
+I275
+I39
+ta(I275
+I39
+I278
+I38
+ta(I278
+I38
+I281
+I37
+ta(I281
+I37
+I284
+I36
+ta(I284
+I36
+I287
+I36
+ta(I287
+I36
+I288
+I35
+ta(I288
+I35
+I290
+I35
+ta(I290
+I35
+I291
+I35
+ta(I291
+I35
+I292
+I35
+ta(I292
+I35
+I294
+I35
+ta(I294
+I35
+I295
+I35
+ta(I295
+I35
+I296
+I35
+ta(I296
+I35
+I297
+I36
+ta(I297
+I36
+I298
+I36
+ta(I298
+I36
+I299
+I36
+ta(I299
+I36
+I300
+I36
+ta(I300
+I36
+I301
+I37
+ta(I301
+I37
+I303
+I38
+ta(I303
+I38
+I304
+I38
+ta(I304
+I38
+I306
+I39
+ta(I306
+I39
+I307
+I39
+ta(I307
+I39
+I309
+I40
+ta(I309
+I40
+I310
+I41
+ta(I310
+I41
+I312
+I42
+ta(I312
+I42
+I314
+I42
+ta(I314
+I42
+I316
+I43
+ta(I316
+I43
+I317
+I44
+ta(I317
+I44
+I319
+I45
+ta(I319
+I45
+I320
+I46
+ta(I320
+I46
+I321
+I47
+ta(I321
+I47
+I322
+I48
+ta(I322
+I48
+I323
+I49
+ta(I323
+I49
+I324
+I50
+ta(I324
+I50
+I325
+I51
+ta(I325
+I51
+I326
+I51
+ta(I326
+I51
+I328
+I52
+ta(I328
+I52
+I329
+I52
+ta(I329
+I52
+I329
+I53
+ta(I329
+I53
+I330
+I54
+ta(I330
+I54
+I331
+I55
+ta(I331
+I55
+I332
+I56
+ta(I332
+I56
+I333
+I57
+ta(I333
+I57
+I334
+I59
+ta(I334
+I59
+I335
+I60
+ta(I335
+I60
+I336
+I61
+ta(I336
+I61
+I338
+I63
+ta(I338
+I63
+I339
+I64
+ta(I339
+I64
+I340
+I66
+ta(I340
+I66
+I341
+I67
+ta(I341
+I67
+I342
+I69
+ta(I342
+I69
+I342
+I70
+ta(I342
+I70
+I343
+I71
+ta(I343
+I71
+I344
+I73
+ta(I344
+I73
+I345
+I73
+ta(I345
+I73
+I345
+I75
+ta(I345
+I75
+I346
+I75
+ta(I346
+I75
+I346
+I76
+ta(I346
+I76
+I346
+I77
+ta(I346
+I77
+I347
+I77
+ta(I347
+I77
+I347
+I78
+ta(I347
+I78
+I347
+I79
+ta(I347
+I79
+I347
+I80
+ta(I347
+I80
+I347
+I81
+ta(I347
+I81
+I347
+I83
+ta(I347
+I83
+I347
+I84
+ta(I347
+I84
+I347
+I85
+ta(I347
+I85
+I347
+I87
+ta(I347
+I87
+I347
+I89
+ta(I347
+I89
+I347
+I91
+ta(I347
+I91
+I346
+I92
+ta(I346
+I92
+I345
+I94
+ta(I345
+I94
+I344
+I96
+ta(I344
+I96
+I343
+I98
+ta(I343
+I98
+I342
+I99
+ta(I342
+I99
+I342
+I100
+ta(I342
+I100
+I341
+I102
+ta(I341
+I102
+I340
+I103
+ta(I340
+I103
+I339
+I104
+ta(I339
+I104
+I338
+I105
+ta(I338
+I105
+I338
+I106
+ta(I338
+I106
+I336
+I108
+ta(I336
+I108
+I335
+I109
+ta(I335
+I109
+I333
+I111
+ta(I333
+I111
+I332
+I112
+ta(I332
+I112
+I331
+I113
+ta(I331
+I113
+I330
+I114
+ta(I330
+I114
+I329
+I115
+ta(I329
+I115
+I328
+I115
+ta(I328
+I115
+I328
+I116
+ta(I328
+I116
+I327
+I116
+ta(I327
+I116
+I326
+I117
+ta(I326
+I117
+I324
+I117
+ta(I324
+I117
+I323
+I118
+ta(I323
+I118
+I321
+I119
+ta(I321
+I119
+I319
+I120
+ta(I319
+I120
+I317
+I121
+ta(I317
+I121
+I315
+I122
+ta(I315
+I122
+I313
+I123
+ta(I313
+I123
+I311
+I124
+ta(I311
+I124
+I309
+I124
+ta(I309
+I124
+I307
+I125
+ta(I307
+I125
+I305
+I126
+ta(I305
+I126
+I304
+I126
+ta(I304
+I126
+I303
+I127
+ta(I303
+I127
+I301
+I127
+ta(I301
+I127
+I300
+I128
+ta(I300
+I128
+I299
+I128
+ta(I299
+I128
+I298
+I128
+ta(I298
+I128
+I297
+I128
+ta(I297
+I128
+I296
+I128
+ta(I296
+I128
+I295
+I128
+ta(I295
+I128
+I293
+I128
+ta(I293
+I128
+I292
+I128
+ta(I292
+I128
+I291
+I128
+ta(I291
+I128
+I290
+I128
+ta(I290
+I128
+I289
+I129
+ta(I289
+I129
+I288
+I129
+ta(I288
+I129
+I287
+I129
+ta(I287
+I129
+I286
+I129
+ta(I286
+I129
+I285
+I129
+ta(I285
+I129
+I284
+I129
+tatp29
+a(g19
+I16
+(lp30
+(I354
+I127
+I355
+I128
+ta(I355
+I128
+I355
+I130
+ta(I355
+I130
+I355
+I131
+ta(I355
+I131
+I355
+I133
+ta(I355
+I133
+I355
+I134
+ta(I355
+I134
+I356
+I136
+ta(I356
+I136
+I356
+I139
+ta(I356
+I139
+I356
+I141
+ta(I356
+I141
+I357
+I143
+ta(I357
+I143
+I357
+I145
+ta(I357
+I145
+I357
+I148
+ta(I357
+I148
+I358
+I150
+ta(I358
+I150
+I359
+I152
+ta(I359
+I152
+I359
+I154
+ta(I359
+I154
+I360
+I156
+ta(I360
+I156
+I361
+I158
+ta(I361
+I158
+I361
+I159
+ta(I361
+I159
+I361
+I161
+ta(I361
+I161
+I362
+I163
+ta(I362
+I163
+I362
+I164
+ta(I362
+I164
+I363
+I165
+ta(I363
+I165
+I364
+I166
+ta(I364
+I166
+I364
+I168
+ta(I364
+I168
+I365
+I168
+ta(I365
+I168
+I366
+I169
+ta(I366
+I169
+I367
+I170
+ta(I367
+I170
+I368
+I170
+ta(I368
+I170
+I368
+I171
+ta(I368
+I171
+I369
+I171
+ta(I369
+I171
+I370
+I173
+ta(I370
+I173
+I370
+I174
+ta(I370
+I174
+I371
+I175
+ta(I371
+I175
+I373
+I176
+ta(I373
+I176
+I374
+I177
+ta(I374
+I177
+I375
+I178
+ta(I375
+I178
+I377
+I179
+ta(I377
+I179
+I378
+I180
+ta(I378
+I180
+I379
+I180
+ta(I379
+I180
+I380
+I181
+ta(I380
+I181
+I381
+I182
+ta(I381
+I182
+I382
+I182
+ta(I382
+I182
+I384
+I182
+ta(I384
+I182
+I385
+I183
+ta(I385
+I183
+I386
+I183
+ta(I386
+I183
+I388
+I183
+ta(I388
+I183
+I389
+I183
+ta(I389
+I183
+I390
+I183
+ta(I390
+I183
+I391
+I183
+ta(I391
+I183
+I392
+I182
+ta(I392
+I182
+I393
+I181
+ta(I393
+I181
+I393
+I180
+ta(I393
+I180
+I394
+I179
+ta(I394
+I179
+I395
+I177
+ta(I395
+I177
+I396
+I176
+ta(I396
+I176
+I397
+I175
+ta(I397
+I175
+I398
+I174
+ta(I398
+I174
+I399
+I174
+ta(I399
+I174
+I399
+I173
+ta(I399
+I173
+I399
+I172
+ta(I399
+I172
+I400
+I171
+ta(I400
+I171
+I400
+I169
+ta(I400
+I169
+I400
+I167
+ta(I400
+I167
+I400
+I166
+ta(I400
+I166
+I401
+I165
+ta(I401
+I165
+I401
+I163
+ta(I401
+I163
+I402
+I162
+ta(I402
+I162
+I402
+I161
+ta(I402
+I161
+I403
+I160
+ta(I403
+I160
+I403
+I159
+ta(I403
+I159
+I403
+I158
+ta(I403
+I158
+I403
+I157
+ta(I403
+I157
+I404
+I156
+ta(I404
+I156
+I404
+I154
+ta(I404
+I154
+I404
+I153
+ta(I404
+I153
+I404
+I151
+ta(I404
+I151
+I405
+I150
+ta(I405
+I150
+I405
+I149
+ta(I405
+I149
+I405
+I146
+ta(I405
+I146
+I405
+I145
+ta(I405
+I145
+I405
+I143
+ta(I405
+I143
+I405
+I142
+ta(I405
+I142
+I405
+I140
+ta(I405
+I140
+I405
+I139
+ta(I405
+I139
+I405
+I138
+ta(I405
+I138
+I405
+I137
+ta(I405
+I137
+I405
+I136
+ta(I405
+I136
+I405
+I135
+ta(I405
+I135
+I405
+I136
+ta(I405
+I136
+I406
+I139
+ta(I406
+I139
+I407
+I141
+ta(I407
+I141
+I408
+I144
+ta(I408
+I144
+I409
+I147
+ta(I409
+I147
+I409
+I149
+ta(I409
+I149
+I410
+I152
+ta(I410
+I152
+I411
+I154
+ta(I411
+I154
+I412
+I156
+ta(I412
+I156
+I412
+I158
+ta(I412
+I158
+I413
+I160
+ta(I413
+I160
+I414
+I161
+ta(I414
+I161
+I415
+I162
+ta(I415
+I162
+I415
+I164
+ta(I415
+I164
+I416
+I165
+ta(I416
+I165
+I417
+I167
+ta(I417
+I167
+I417
+I169
+ta(I417
+I169
+I418
+I171
+ta(I418
+I171
+I418
+I172
+ta(I418
+I172
+I418
+I174
+ta(I418
+I174
+I419
+I176
+ta(I419
+I176
+I419
+I177
+ta(I419
+I177
+I420
+I179
+ta(I420
+I179
+I420
+I180
+ta(I420
+I180
+I421
+I182
+ta(I421
+I182
+I422
+I184
+ta(I422
+I184
+I422
+I185
+ta(I422
+I185
+I422
+I188
+ta(I422
+I188
+I423
+I189
+ta(I423
+I189
+I423
+I191
+ta(I423
+I191
+I423
+I193
+ta(I423
+I193
+I423
+I195
+ta(I423
+I195
+I423
+I197
+ta(I423
+I197
+I423
+I199
+ta(I423
+I199
+I424
+I201
+ta(I424
+I201
+I424
+I203
+ta(I424
+I203
+I424
+I205
+ta(I424
+I205
+I425
+I207
+ta(I425
+I207
+I425
+I209
+ta(I425
+I209
+I425
+I211
+ta(I425
+I211
+I425
+I213
+ta(I425
+I213
+I426
+I215
+ta(I426
+I215
+I426
+I217
+ta(I426
+I217
+I426
+I219
+ta(I426
+I219
+I426
+I221
+ta(I426
+I221
+I426
+I223
+ta(I426
+I223
+I426
+I225
+ta(I426
+I225
+I426
+I226
+ta(I426
+I226
+I426
+I229
+ta(I426
+I229
+I426
+I230
+ta(I426
+I230
+I426
+I232
+ta(I426
+I232
+I427
+I234
+ta(I427
+I234
+I427
+I237
+ta(I427
+I237
+I427
+I239
+ta(I427
+I239
+I427
+I241
+ta(I427
+I241
+I427
+I243
+ta(I427
+I243
+I427
+I245
+ta(I427
+I245
+I426
+I248
+ta(I426
+I248
+I426
+I250
+ta(I426
+I250
+I425
+I252
+ta(I425
+I252
+I424
+I254
+ta(I424
+I254
+I424
+I256
+ta(I424
+I256
+I424
+I257
+ta(I424
+I257
+I423
+I258
+ta(I423
+I258
+I422
+I259
+ta(I422
+I259
+I422
+I261
+ta(I422
+I261
+I421
+I262
+ta(I421
+I262
+I420
+I263
+ta(I420
+I263
+I419
+I265
+ta(I419
+I265
+I418
+I267
+ta(I418
+I267
+I416
+I268
+ta(I416
+I268
+I413
+I270
+ta(I413
+I270
+I411
+I272
+ta(I411
+I272
+I408
+I274
+ta(I408
+I274
+I406
+I275
+ta(I406
+I275
+I404
+I276
+ta(I404
+I276
+I402
+I278
+ta(I402
+I278
+I400
+I279
+ta(I400
+I279
+I398
+I280
+ta(I398
+I280
+I396
+I280
+ta(I396
+I280
+I394
+I280
+ta(I394
+I280
+I392
+I281
+ta(I392
+I281
+I390
+I281
+ta(I390
+I281
+I387
+I281
+ta(I387
+I281
+I385
+I281
+ta(I385
+I281
+I382
+I281
+ta(I382
+I281
+I379
+I280
+ta(I379
+I280
+I376
+I280
+ta(I376
+I280
+I372
+I279
+ta(I372
+I279
+I367
+I279
+ta(I367
+I279
+I362
+I279
+ta(I362
+I279
+I358
+I279
+ta(I358
+I279
+I354
+I279
+ta(I354
+I279
+I350
+I279
+ta(I350
+I279
+I348
+I278
+ta(I348
+I278
+I345
+I278
+ta(I345
+I278
+I343
+I277
+ta(I343
+I277
+I341
+I277
+ta(I341
+I277
+I340
+I276
+ta(I340
+I276
+I338
+I275
+ta(I338
+I275
+I337
+I274
+ta(I337
+I274
+I336
+I274
+ta(I336
+I274
+I335
+I273
+ta(I335
+I273
+I334
+I273
+ta(I334
+I273
+I334
+I272
+ta(I334
+I272
+I333
+I272
+ta(I333
+I272
+I333
+I271
+tatp31
+a(g19
+I16
+(lp32
+(I428
+I79
+I428
+I80
+ta(I428
+I80
+I429
+I81
+ta(I429
+I81
+I430
+I83
+ta(I430
+I83
+I430
+I85
+ta(I430
+I85
+I431
+I87
+ta(I431
+I87
+I431
+I89
+ta(I431
+I89
+I431
+I91
+ta(I431
+I91
+I432
+I93
+ta(I432
+I93
+I432
+I96
+ta(I432
+I96
+I432
+I98
+ta(I432
+I98
+I432
+I101
+ta(I432
+I101
+I433
+I104
+ta(I433
+I104
+I433
+I107
+ta(I433
+I107
+I434
+I109
+ta(I434
+I109
+I434
+I112
+ta(I434
+I112
+I434
+I115
+ta(I434
+I115
+I435
+I117
+ta(I435
+I117
+I435
+I121
+ta(I435
+I121
+I435
+I124
+ta(I435
+I124
+I435
+I126
+ta(I435
+I126
+I436
+I128
+ta(I436
+I128
+I436
+I131
+ta(I436
+I131
+I437
+I133
+ta(I437
+I133
+I438
+I135
+ta(I438
+I135
+I438
+I137
+ta(I438
+I137
+I439
+I139
+ta(I439
+I139
+I440
+I140
+ta(I440
+I140
+I441
+I142
+ta(I441
+I142
+I441
+I144
+ta(I441
+I144
+I442
+I146
+ta(I442
+I146
+I443
+I148
+ta(I443
+I148
+I443
+I149
+ta(I443
+I149
+I443
+I152
+ta(I443
+I152
+I444
+I154
+ta(I444
+I154
+I445
+I156
+ta(I445
+I156
+I445
+I158
+ta(I445
+I158
+I446
+I160
+ta(I446
+I160
+I446
+I162
+ta(I446
+I162
+I447
+I163
+ta(I447
+I163
+I447
+I164
+ta(I447
+I164
+I448
+I165
+ta(I448
+I165
+I448
+I166
+ta(I448
+I166
+I448
+I167
+ta(I448
+I167
+I449
+I167
+ta(I449
+I167
+I449
+I168
+ta(I449
+I168
+I450
+I168
+ta(I450
+I168
+I451
+I169
+ta(I451
+I169
+I452
+I169
+ta(I452
+I169
+I453
+I170
+ta(I453
+I170
+I455
+I170
+ta(I455
+I170
+I456
+I171
+ta(I456
+I171
+I457
+I172
+ta(I457
+I172
+I459
+I172
+ta(I459
+I172
+I460
+I172
+ta(I460
+I172
+I461
+I173
+ta(I461
+I173
+I462
+I173
+ta(I462
+I173
+I463
+I173
+ta(I463
+I173
+I465
+I173
+ta(I465
+I173
+I466
+I174
+ta(I466
+I174
+I467
+I174
+ta(I467
+I174
+I469
+I174
+tatp33
+a(g19
+I16
+(lp34
+(I421
+I106
+I422
+I106
+ta(I422
+I106
+I423
+I106
+ta(I423
+I106
+I424
+I106
+ta(I424
+I106
+I425
+I106
+ta(I425
+I106
+I427
+I107
+ta(I427
+I107
+I428
+I107
+ta(I428
+I107
+I430
+I107
+ta(I430
+I107
+I433
+I107
+ta(I433
+I107
+I435
+I107
+ta(I435
+I107
+I437
+I107
+ta(I437
+I107
+I439
+I107
+ta(I439
+I107
+I441
+I107
+ta(I441
+I107
+I442
+I107
+ta(I442
+I107
+I443
+I107
+ta(I443
+I107
+I444
+I107
+ta(I444
+I107
+I445
+I107
+ta(I445
+I107
+I446
+I107
+ta(I446
+I107
+I447
+I107
+ta(I447
+I107
+I447
+I106
+ta(I447
+I106
+I448
+I106
+ta(I448
+I106
+I449
+I106
+ta(I449
+I106
+I450
+I106
+ta(I450
+I106
+I451
+I106
+ta(I451
+I106
+I452
+I106
+ta(I452
+I106
+I453
+I107
+ta(I453
+I107
+I454
+I107
+tatp35
+a(g19
+I16
+(lp36
+(I459
+I49
+I460
+I49
+ta(I460
+I49
+I462
+I51
+ta(I462
+I51
+I463
+I53
+ta(I463
+I53
+I464
+I55
+ta(I464
+I55
+I466
+I58
+ta(I466
+I58
+I468
+I60
+ta(I468
+I60
+I469
+I64
+ta(I469
+I64
+I471
+I66
+ta(I471
+I66
+I472
+I69
+ta(I472
+I69
+I473
+I72
+ta(I473
+I72
+I474
+I74
+ta(I474
+I74
+I475
+I77
+ta(I475
+I77
+I477
+I80
+ta(I477
+I80
+I478
+I83
+ta(I478
+I83
+I478
+I85
+ta(I478
+I85
+I479
+I88
+ta(I479
+I88
+I480
+I91
+ta(I480
+I91
+I481
+I94
+ta(I481
+I94
+I481
+I97
+ta(I481
+I97
+I482
+I99
+ta(I482
+I99
+I482
+I101
+ta(I482
+I101
+I483
+I103
+ta(I483
+I103
+I483
+I105
+ta(I483
+I105
+I483
+I106
+ta(I483
+I106
+I483
+I109
+ta(I483
+I109
+I484
+I111
+ta(I484
+I111
+I484
+I113
+ta(I484
+I113
+I485
+I115
+ta(I485
+I115
+I486
+I117
+ta(I486
+I117
+I486
+I119
+ta(I486
+I119
+I487
+I122
+ta(I487
+I122
+I488
+I124
+ta(I488
+I124
+I488
+I126
+ta(I488
+I126
+I489
+I128
+ta(I489
+I128
+I489
+I130
+ta(I489
+I130
+I490
+I132
+ta(I490
+I132
+I490
+I134
+ta(I490
+I134
+I491
+I136
+ta(I491
+I136
+I492
+I138
+ta(I492
+I138
+I492
+I140
+ta(I492
+I140
+I493
+I143
+ta(I493
+I143
+I494
+I145
+ta(I494
+I145
+I495
+I148
+ta(I495
+I148
+I495
+I150
+ta(I495
+I150
+I496
+I152
+ta(I496
+I152
+I496
+I153
+ta(I496
+I153
+I497
+I154
+ta(I497
+I154
+I497
+I155
+ta(I497
+I155
+I497
+I157
+ta(I497
+I157
+I498
+I158
+ta(I498
+I158
+I498
+I159
+ta(I498
+I159
+I498
+I160
+ta(I498
+I160
+I499
+I161
+ta(I499
+I161
+I499
+I162
+ta(I499
+I162
+I499
+I163
+ta(I499
+I163
+I499
+I164
+ta(I499
+I164
+I500
+I165
+ta(I500
+I165
+I500
+I166
+ta(I500
+I166
+I500
+I167
+tatp37
+a(g19
+I16
+(lp38
+(I489
+I116
+I488
+I115
+ta(I488
+I115
+I488
+I114
+ta(I488
+I114
+I488
+I113
+ta(I488
+I113
+I488
+I112
+ta(I488
+I112
+I488
+I111
+ta(I488
+I111
+I488
+I110
+ta(I488
+I110
+I488
+I109
+ta(I488
+I109
+I489
+I108
+ta(I489
+I108
+I489
+I107
+ta(I489
+I107
+I491
+I105
+ta(I491
+I105
+I491
+I104
+ta(I491
+I104
+I492
+I103
+ta(I492
+I103
+I492
+I102
+ta(I492
+I102
+I493
+I102
+ta(I493
+I102
+I493
+I101
+ta(I493
+I101
+I494
+I101
+ta(I494
+I101
+I495
+I100
+ta(I495
+I100
+I496
+I99
+ta(I496
+I99
+I497
+I99
+ta(I497
+I99
+I498
+I98
+ta(I498
+I98
+I499
+I98
+ta(I499
+I98
+I500
+I98
+ta(I500
+I98
+I501
+I97
+ta(I501
+I97
+I502
+I97
+ta(I502
+I97
+I504
+I97
+ta(I504
+I97
+I505
+I97
+ta(I505
+I97
+I507
+I97
+ta(I507
+I97
+I509
+I97
+ta(I509
+I97
+I511
+I97
+ta(I511
+I97
+I513
+I97
+ta(I513
+I97
+I514
+I98
+ta(I514
+I98
+I516
+I98
+ta(I516
+I98
+I517
+I98
+ta(I517
+I98
+I518
+I98
+ta(I518
+I98
+I519
+I99
+ta(I519
+I99
+I520
+I99
+ta(I520
+I99
+I521
+I100
+ta(I521
+I100
+I522
+I101
+ta(I522
+I101
+I523
+I102
+ta(I523
+I102
+I524
+I103
+ta(I524
+I103
+I525
+I104
+ta(I525
+I104
+I526
+I104
+ta(I526
+I104
+I527
+I105
+ta(I527
+I105
+I527
+I106
+ta(I527
+I106
+I528
+I107
+ta(I528
+I107
+I529
+I108
+ta(I529
+I108
+I530
+I109
+ta(I530
+I109
+I530
+I110
+ta(I530
+I110
+I531
+I111
+ta(I531
+I111
+I532
+I112
+ta(I532
+I112
+I533
+I113
+ta(I533
+I113
+I534
+I115
+ta(I534
+I115
+I535
+I116
+ta(I535
+I116
+I536
+I118
+ta(I536
+I118
+I538
+I120
+ta(I538
+I120
+I539
+I122
+ta(I539
+I122
+I540
+I124
+ta(I540
+I124
+I541
+I125
+ta(I541
+I125
+I542
+I127
+ta(I542
+I127
+I543
+I129
+ta(I543
+I129
+I544
+I130
+ta(I544
+I130
+I544
+I132
+ta(I544
+I132
+I545
+I134
+ta(I545
+I134
+I545
+I135
+ta(I545
+I135
+I546
+I136
+ta(I546
+I136
+I546
+I137
+ta(I546
+I137
+I546
+I138
+ta(I546
+I138
+I546
+I140
+ta(I546
+I140
+I547
+I142
+ta(I547
+I142
+I547
+I143
+ta(I547
+I143
+I547
+I144
+ta(I547
+I144
+I548
+I146
+ta(I548
+I146
+I548
+I147
+ta(I548
+I147
+I549
+I148
+ta(I549
+I148
+I549
+I149
+ta(I549
+I149
+I549
+I150
+ta(I549
+I150
+I550
+I151
+ta(I550
+I151
+I550
+I152
+ta(I550
+I152
+I550
+I154
+ta(I550
+I154
+I550
+I155
+ta(I550
+I155
+I550
+I156
+ta(I550
+I156
+I550
+I157
+ta(I550
+I157
+I551
+I159
+ta(I551
+I159
+I551
+I161
+ta(I551
+I161
+I551
+I163
+ta(I551
+I163
+I552
+I165
+ta(I552
+I165
+I552
+I166
+ta(I552
+I166
+I552
+I167
+ta(I552
+I167
+I553
+I168
+ta(I553
+I168
+I553
+I169
+ta(I553
+I169
+I553
+I170
+ta(I553
+I170
+I554
+I170
+tatp39
+a(g19
+I16
+(lp40
+(I572
+I101
+I572
+I100
+ta(I572
+I100
+I571
+I100
+ta(I571
+I100
+I571
+I99
+ta(I571
+I99
+I570
+I99
+ta(I570
+I99
+I570
+I98
+ta(I570
+I98
+I569
+I98
+ta(I569
+I98
+I568
+I97
+ta(I568
+I97
+I567
+I97
+ta(I567
+I97
+I566
+I97
+ta(I566
+I97
+I565
+I97
+ta(I565
+I97
+I564
+I98
+ta(I564
+I98
+I563
+I99
+ta(I563
+I99
+I562
+I100
+ta(I562
+I100
+I561
+I102
+ta(I561
+I102
+I560
+I104
+ta(I560
+I104
+I559
+I106
+ta(I559
+I106
+I558
+I109
+ta(I558
+I109
+I557
+I111
+ta(I557
+I111
+I557
+I114
+ta(I557
+I114
+I556
+I117
+ta(I556
+I117
+I555
+I119
+ta(I555
+I119
+I555
+I122
+ta(I555
+I122
+I554
+I125
+ta(I554
+I125
+I554
+I127
+ta(I554
+I127
+I554
+I129
+ta(I554
+I129
+I554
+I131
+ta(I554
+I131
+I554
+I132
+ta(I554
+I132
+I554
+I134
+ta(I554
+I134
+I554
+I136
+ta(I554
+I136
+I555
+I138
+ta(I555
+I138
+I555
+I140
+ta(I555
+I140
+I556
+I142
+ta(I556
+I142
+I557
+I144
+ta(I557
+I144
+I558
+I145
+ta(I558
+I145
+I559
+I147
+ta(I559
+I147
+I559
+I148
+ta(I559
+I148
+I559
+I149
+ta(I559
+I149
+I560
+I149
+ta(I560
+I149
+I560
+I150
+ta(I560
+I150
+I561
+I151
+ta(I561
+I151
+I562
+I151
+ta(I562
+I151
+I563
+I152
+ta(I563
+I152
+I565
+I152
+ta(I565
+I152
+I566
+I153
+ta(I566
+I153
+I568
+I154
+ta(I568
+I154
+I570
+I154
+ta(I570
+I154
+I572
+I155
+ta(I572
+I155
+I573
+I155
+ta(I573
+I155
+I575
+I155
+ta(I575
+I155
+I576
+I156
+ta(I576
+I156
+I578
+I156
+ta(I578
+I156
+I579
+I156
+ta(I579
+I156
+I581
+I156
+ta(I581
+I156
+I583
+I156
+ta(I583
+I156
+I585
+I156
+ta(I585
+I156
+I587
+I156
+ta(I587
+I156
+I588
+I156
+ta(I588
+I156
+I590
+I156
+ta(I590
+I156
+I591
+I156
+ta(I591
+I156
+I592
+I156
+ta(I592
+I156
+I593
+I155
+ta(I593
+I155
+I595
+I154
+ta(I595
+I154
+I596
+I153
+ta(I596
+I153
+I597
+I151
+ta(I597
+I151
+I598
+I150
+ta(I598
+I150
+I599
+I148
+ta(I599
+I148
+I599
+I146
+ta(I599
+I146
+I600
+I145
+ta(I600
+I145
+I601
+I143
+ta(I601
+I143
+I601
+I141
+ta(I601
+I141
+I601
+I140
+ta(I601
+I140
+I602
+I138
+ta(I602
+I138
+I602
+I136
+ta(I602
+I136
+I602
+I135
+ta(I602
+I135
+I602
+I133
+ta(I602
+I133
+I602
+I131
+ta(I602
+I131
+I602
+I128
+ta(I602
+I128
+I602
+I126
+ta(I602
+I126
+I602
+I125
+ta(I602
+I125
+I601
+I123
+ta(I601
+I123
+I601
+I121
+ta(I601
+I121
+I601
+I119
+ta(I601
+I119
+I600
+I118
+ta(I600
+I118
+I599
+I117
+ta(I599
+I117
+I598
+I115
+ta(I598
+I115
+I598
+I114
+ta(I598
+I114
+I597
+I113
+ta(I597
+I113
+I596
+I112
+ta(I596
+I112
+I595
+I110
+ta(I595
+I110
+I594
+I109
+ta(I594
+I109
+I593
+I108
+ta(I593
+I108
+I592
+I107
+ta(I592
+I107
+I591
+I107
+ta(I591
+I107
+I591
+I106
+ta(I591
+I106
+I590
+I106
+ta(I590
+I106
+I589
+I105
+ta(I589
+I105
+I587
+I104
+ta(I587
+I104
+I585
+I104
+ta(I585
+I104
+I582
+I104
+ta(I582
+I104
+I580
+I103
+ta(I580
+I103
+I578
+I103
+ta(I578
+I103
+I576
+I102
+ta(I576
+I102
+I575
+I102
+ta(I575
+I102
+I573
+I101
+ta(I573
+I101
+I572
+I101
+ta(I572
+I101
+I571
+I100
+ta(I571
+I100
+I570
+I100
+ta(I570
+I100
+I569
+I99
+ta(I569
+I99
+I568
+I99
+ta(I568
+I99
+I567
+I98
+ta(I567
+I98
+I566
+I98
+tatp41
+a(g19
+I16
+(lp42
+(I617
+I84
+I618
+I85
+ta(I618
+I85
+I619
+I87
+ta(I619
+I87
+I619
+I88
+ta(I619
+I88
+I620
+I91
+ta(I620
+I91
+I620
+I93
+ta(I620
+I93
+I621
+I95
+ta(I621
+I95
+I622
+I98
+ta(I622
+I98
+I623
+I101
+ta(I623
+I101
+I623
+I103
+ta(I623
+I103
+I624
+I105
+ta(I624
+I105
+I624
+I107
+ta(I624
+I107
+I625
+I109
+ta(I625
+I109
+I625
+I111
+ta(I625
+I111
+I625
+I112
+ta(I625
+I112
+I625
+I114
+ta(I625
+I114
+I625
+I116
+ta(I625
+I116
+I626
+I118
+ta(I626
+I118
+I626
+I120
+ta(I626
+I120
+I626
+I123
+ta(I626
+I123
+I626
+I125
+ta(I626
+I125
+I627
+I126
+ta(I627
+I126
+I627
+I128
+ta(I627
+I128
+I627
+I129
+ta(I627
+I129
+I627
+I131
+ta(I627
+I131
+I627
+I132
+ta(I627
+I132
+I628
+I134
+ta(I628
+I134
+I628
+I135
+ta(I628
+I135
+I628
+I136
+ta(I628
+I136
+I628
+I138
+ta(I628
+I138
+I628
+I139
+ta(I628
+I139
+I628
+I140
+ta(I628
+I140
+I629
+I141
+ta(I629
+I141
+I629
+I142
+ta(I629
+I142
+I629
+I143
+ta(I629
+I143
+I629
+I144
+ta(I629
+I144
+I629
+I145
+ta(I629
+I145
+I629
+I146
+ta(I629
+I146
+I629
+I147
+ta(I629
+I147
+I629
+I148
+ta(I629
+I148
+I629
+I149
+ta(I629
+I149
+I630
+I150
+ta(I630
+I150
+I630
+I151
+ta(I630
+I151
+I630
+I152
+ta(I630
+I152
+I630
+I153
+ta(I630
+I153
+I631
+I153
+ta(I631
+I153
+I631
+I154
+ta(I631
+I154
+I631
+I155
+ta(I631
+I155
+I631
+I156
+ta(I631
+I156
+I631
+I157
+ta(I631
+I157
+I631
+I158
+ta(I631
+I158
+I631
+I159
+ta(I631
+I159
+I631
+I160
+ta(I631
+I160
+I631
+I161
+ta(I631
+I161
+I631
+I162
+tatp43
+a(g19
+I16
+(lp44
+(I622
+I91
+I622
+I90
+ta(I622
+I90
+I622
+I89
+ta(I622
+I89
+I623
+I88
+ta(I623
+I88
+I624
+I87
+ta(I624
+I87
+I625
+I86
+ta(I625
+I86
+I625
+I85
+ta(I625
+I85
+I626
+I84
+ta(I626
+I84
+I627
+I83
+ta(I627
+I83
+I627
+I82
+ta(I627
+I82
+I628
+I82
+ta(I628
+I82
+I629
+I81
+ta(I629
+I81
+I629
+I80
+ta(I629
+I80
+I630
+I80
+ta(I630
+I80
+I631
+I80
+ta(I631
+I80
+I631
+I79
+ta(I631
+I79
+I632
+I79
+ta(I632
+I79
+I633
+I78
+ta(I633
+I78
+I634
+I78
+ta(I634
+I78
+I635
+I77
+ta(I635
+I77
+I637
+I77
+ta(I637
+I77
+I638
+I77
+ta(I638
+I77
+I639
+I76
+ta(I639
+I76
+I640
+I76
+ta(I640
+I76
+I641
+I76
+ta(I641
+I76
+I642
+I76
+ta(I642
+I76
+I643
+I76
+ta(I643
+I76
+I644
+I76
+ta(I644
+I76
+I645
+I76
+ta(I645
+I76
+I647
+I76
+ta(I647
+I76
+I648
+I77
+ta(I648
+I77
+I649
+I77
+ta(I649
+I77
+I650
+I77
+ta(I650
+I77
+I651
+I78
+ta(I651
+I78
+I652
+I79
+ta(I652
+I79
+I653
+I79
+ta(I653
+I79
+I654
+I80
+ta(I654
+I80
+I655
+I81
+ta(I655
+I81
+I656
+I82
+ta(I656
+I82
+I656
+I83
+ta(I656
+I83
+I657
+I83
+ta(I657
+I83
+I659
+I85
+ta(I659
+I85
+I660
+I86
+ta(I660
+I86
+I661
+I87
+ta(I661
+I87
+I661
+I88
+ta(I661
+I88
+I662
+I89
+ta(I662
+I89
+I662
+I91
+ta(I662
+I91
+I663
+I92
+ta(I663
+I92
+I664
+I94
+ta(I664
+I94
+I664
+I95
+ta(I664
+I95
+I665
+I97
+ta(I665
+I97
+I666
+I99
+ta(I666
+I99
+I667
+I100
+ta(I667
+I100
+I667
+I102
+ta(I667
+I102
+I668
+I103
+ta(I668
+I103
+I668
+I105
+ta(I668
+I105
+I669
+I106
+ta(I669
+I106
+I669
+I107
+ta(I669
+I107
+I670
+I109
+ta(I670
+I109
+I670
+I110
+ta(I670
+I110
+I671
+I112
+ta(I671
+I112
+I672
+I114
+ta(I672
+I114
+I672
+I115
+ta(I672
+I115
+I673
+I117
+ta(I673
+I117
+I673
+I118
+ta(I673
+I118
+I674
+I120
+ta(I674
+I120
+I674
+I121
+ta(I674
+I121
+I674
+I122
+ta(I674
+I122
+I675
+I124
+ta(I675
+I124
+I675
+I125
+ta(I675
+I125
+I675
+I126
+ta(I675
+I126
+I675
+I127
+ta(I675
+I127
+I676
+I127
+ta(I676
+I127
+I676
+I128
+ta(I676
+I128
+I676
+I129
+ta(I676
+I129
+I677
+I130
+ta(I677
+I130
+I677
+I131
+ta(I677
+I131
+I677
+I133
+ta(I677
+I133
+I678
+I134
+ta(I678
+I134
+I678
+I135
+ta(I678
+I135
+I678
+I137
+ta(I678
+I137
+I679
+I138
+ta(I679
+I138
+I679
+I139
+ta(I679
+I139
+I679
+I141
+ta(I679
+I141
+I680
+I142
+ta(I680
+I142
+I680
+I143
+ta(I680
+I143
+I680
+I144
+ta(I680
+I144
+I681
+I145
+ta(I681
+I145
+I681
+I147
+ta(I681
+I147
+I682
+I148
+ta(I682
+I148
+I682
+I149
+ta(I682
+I149
+I682
+I150
+ta(I682
+I150
+I682
+I151
+ta(I682
+I151
+I682
+I152
+ta(I682
+I152
+I683
+I153
+ta(I683
+I153
+I683
+I154
+ta(I683
+I154
+I683
+I155
+ta(I683
+I155
+I683
+I156
+ta(I683
+I156
+I683
+I157
+tatp45
+a(S'Navy'
+p46
+I16
+(lp47
+(I119
+I334
+I119
+I335
+ta(I119
+I335
+I121
+I339
+ta(I121
+I339
+I122
+I341
+ta(I122
+I341
+I123
+I343
+ta(I123
+I343
+I123
+I345
+ta(I123
+I345
+I124
+I348
+ta(I124
+I348
+I125
+I351
+ta(I125
+I351
+I125
+I354
+ta(I125
+I354
+I126
+I357
+ta(I126
+I357
+I127
+I359
+ta(I127
+I359
+I128
+I362
+ta(I128
+I362
+I128
+I365
+ta(I128
+I365
+I129
+I367
+ta(I129
+I367
+I130
+I370
+ta(I130
+I370
+I131
+I373
+ta(I131
+I373
+I132
+I376
+ta(I132
+I376
+I133
+I380
+ta(I133
+I380
+I134
+I384
+ta(I134
+I384
+I134
+I387
+ta(I134
+I387
+I136
+I392
+ta(I136
+I392
+I136
+I396
+ta(I136
+I396
+I137
+I400
+ta(I137
+I400
+I137
+I405
+ta(I137
+I405
+I138
+I409
+ta(I138
+I409
+I139
+I414
+ta(I139
+I414
+I140
+I416
+ta(I140
+I416
+I140
+I419
+ta(I140
+I419
+I140
+I422
+ta(I140
+I422
+I140
+I424
+ta(I140
+I424
+I140
+I427
+ta(I140
+I427
+I141
+I430
+ta(I141
+I430
+I142
+I432
+ta(I142
+I432
+I142
+I435
+ta(I142
+I435
+I142
+I438
+ta(I142
+I438
+I143
+I440
+ta(I143
+I440
+I143
+I443
+ta(I143
+I443
+I144
+I445
+ta(I144
+I445
+I144
+I447
+ta(I144
+I447
+I144
+I448
+ta(I144
+I448
+I144
+I450
+ta(I144
+I450
+I144
+I452
+ta(I144
+I452
+I144
+I454
+ta(I144
+I454
+I144
+I456
+ta(I144
+I456
+I144
+I457
+ta(I144
+I457
+I144
+I459
+ta(I144
+I459
+I144
+I461
+ta(I144
+I461
+I144
+I463
+ta(I144
+I463
+I145
+I465
+ta(I145
+I465
+I145
+I466
+ta(I145
+I466
+I145
+I467
+ta(I145
+I467
+I145
+I468
+ta(I145
+I468
+I146
+I470
+ta(I146
+I470
+I146
+I471
+ta(I146
+I471
+I146
+I473
+ta(I146
+I473
+I146
+I474
+ta(I146
+I474
+I146
+I475
+ta(I146
+I475
+I146
+I476
+ta(I146
+I476
+I146
+I477
+ta(I146
+I477
+I146
+I478
+ta(I146
+I478
+I146
+I479
+ta(I146
+I479
+I146
+I480
+ta(I146
+I480
+I147
+I481
+ta(I147
+I481
+I147
+I482
+ta(I147
+I482
+I148
+I484
+ta(I148
+I484
+I148
+I485
+ta(I148
+I485
+I149
+I487
+ta(I149
+I487
+I149
+I489
+ta(I149
+I489
+I149
+I491
+ta(I149
+I491
+I149
+I494
+ta(I149
+I494
+I149
+I495
+ta(I149
+I495
+I149
+I497
+ta(I149
+I497
+I149
+I499
+ta(I149
+I499
+I149
+I500
+ta(I149
+I500
+I148
+I502
+ta(I148
+I502
+I148
+I503
+ta(I148
+I503
+I148
+I505
+ta(I148
+I505
+I148
+I506
+ta(I148
+I506
+I148
+I508
+ta(I148
+I508
+I148
+I509
+ta(I148
+I509
+I148
+I510
+ta(I148
+I510
+I149
+I511
+ta(I149
+I511
+I149
+I512
+ta(I149
+I512
+I148
+I512
+ta(I148
+I512
+I148
+I511
+ta(I148
+I511
+I149
+I508
+tatp48
+a(g46
+I16
+(lp49
+(I126
+I336
+I127
+I336
+ta(I127
+I336
+I128
+I335
+ta(I128
+I335
+I130
+I334
+ta(I130
+I334
+I132
+I332
+ta(I132
+I332
+I134
+I331
+ta(I134
+I331
+I137
+I330
+ta(I137
+I330
+I141
+I329
+ta(I141
+I329
+I145
+I328
+ta(I145
+I328
+I149
+I327
+ta(I149
+I327
+I163
+I325
+ta(I163
+I325
+I168
+I323
+ta(I168
+I323
+I173
+I321
+ta(I173
+I321
+I177
+I320
+ta(I177
+I320
+I180
+I319
+ta(I180
+I319
+I183
+I318
+ta(I183
+I318
+I186
+I318
+ta(I186
+I318
+I188
+I317
+ta(I188
+I317
+I191
+I316
+ta(I191
+I316
+I194
+I316
+ta(I194
+I316
+I197
+I315
+ta(I197
+I315
+I200
+I315
+ta(I200
+I315
+I202
+I315
+ta(I202
+I315
+I204
+I315
+ta(I204
+I315
+I206
+I315
+ta(I206
+I315
+I208
+I316
+ta(I208
+I316
+I210
+I316
+ta(I210
+I316
+I212
+I316
+ta(I212
+I316
+I213
+I317
+ta(I213
+I317
+I214
+I317
+ta(I214
+I317
+I216
+I318
+ta(I216
+I318
+I218
+I319
+ta(I218
+I319
+I220
+I320
+ta(I220
+I320
+I223
+I321
+ta(I223
+I321
+I226
+I322
+ta(I226
+I322
+I227
+I323
+ta(I227
+I323
+I229
+I324
+ta(I229
+I324
+I229
+I325
+ta(I229
+I325
+I230
+I325
+ta(I230
+I325
+I230
+I326
+ta(I230
+I326
+I230
+I327
+ta(I230
+I327
+I231
+I329
+ta(I231
+I329
+I231
+I331
+ta(I231
+I331
+I232
+I333
+ta(I232
+I333
+I232
+I334
+ta(I232
+I334
+I233
+I336
+ta(I233
+I336
+I233
+I338
+ta(I233
+I338
+I234
+I340
+ta(I234
+I340
+I234
+I341
+ta(I234
+I341
+I234
+I342
+ta(I234
+I342
+I234
+I344
+ta(I234
+I344
+I234
+I345
+ta(I234
+I345
+I234
+I347
+ta(I234
+I347
+I233
+I349
+ta(I233
+I349
+I233
+I351
+ta(I233
+I351
+I233
+I352
+ta(I233
+I352
+I232
+I354
+ta(I232
+I354
+I231
+I356
+ta(I231
+I356
+I230
+I357
+ta(I230
+I357
+I229
+I359
+ta(I229
+I359
+I226
+I360
+ta(I226
+I360
+I225
+I362
+ta(I225
+I362
+I223
+I364
+ta(I223
+I364
+I221
+I366
+ta(I221
+I366
+I220
+I367
+ta(I220
+I367
+I219
+I368
+ta(I219
+I368
+I217
+I370
+ta(I217
+I370
+I216
+I371
+ta(I216
+I371
+I215
+I373
+ta(I215
+I373
+I214
+I374
+ta(I214
+I374
+I212
+I376
+ta(I212
+I376
+I211
+I377
+ta(I211
+I377
+I209
+I378
+ta(I209
+I378
+I208
+I380
+ta(I208
+I380
+I206
+I381
+ta(I206
+I381
+I205
+I383
+ta(I205
+I383
+I203
+I384
+ta(I203
+I384
+I201
+I385
+ta(I201
+I385
+I200
+I386
+ta(I200
+I386
+I198
+I387
+ta(I198
+I387
+I197
+I388
+ta(I197
+I388
+I195
+I389
+ta(I195
+I389
+I193
+I390
+ta(I193
+I390
+I191
+I391
+ta(I191
+I391
+I189
+I392
+ta(I189
+I392
+I187
+I393
+ta(I187
+I393
+I185
+I394
+ta(I185
+I394
+I183
+I395
+ta(I183
+I395
+I181
+I396
+ta(I181
+I396
+I179
+I397
+ta(I179
+I397
+I177
+I398
+ta(I177
+I398
+I175
+I399
+ta(I175
+I399
+I174
+I400
+ta(I174
+I400
+I172
+I400
+ta(I172
+I400
+I171
+I401
+ta(I171
+I401
+I170
+I402
+ta(I170
+I402
+I169
+I403
+ta(I169
+I403
+I168
+I403
+ta(I168
+I403
+I167
+I404
+ta(I167
+I404
+I166
+I404
+ta(I166
+I404
+I165
+I404
+ta(I165
+I404
+I164
+I405
+ta(I164
+I405
+I163
+I405
+ta(I163
+I405
+I162
+I405
+ta(I162
+I405
+I161
+I406
+ta(I161
+I406
+I160
+I406
+ta(I160
+I406
+I159
+I407
+ta(I159
+I407
+I158
+I407
+ta(I158
+I407
+I157
+I407
+ta(I157
+I407
+I156
+I408
+ta(I156
+I408
+I155
+I408
+ta(I155
+I408
+I155
+I409
+ta(I155
+I409
+I154
+I409
+ta(I154
+I409
+I153
+I409
+ta(I153
+I409
+I152
+I410
+ta(I152
+I410
+I151
+I410
+ta(I151
+I410
+I150
+I410
+ta(I150
+I410
+I149
+I410
+ta(I149
+I410
+I148
+I410
+ta(I148
+I410
+I149
+I410
+ta(I149
+I410
+I150
+I410
+ta(I150
+I410
+I151
+I410
+ta(I151
+I410
+I152
+I410
+ta(I152
+I410
+I155
+I411
+ta(I155
+I411
+I157
+I411
+ta(I157
+I411
+I160
+I411
+ta(I160
+I411
+I163
+I412
+ta(I163
+I412
+I165
+I412
+ta(I165
+I412
+I168
+I412
+ta(I168
+I412
+I169
+I412
+ta(I169
+I412
+I171
+I412
+ta(I171
+I412
+I172
+I412
+ta(I172
+I412
+I172
+I413
+ta(I172
+I413
+I173
+I413
+ta(I173
+I413
+I174
+I414
+ta(I174
+I414
+I175
+I415
+ta(I175
+I415
+I176
+I416
+ta(I176
+I416
+I178
+I418
+ta(I178
+I418
+I180
+I419
+ta(I180
+I419
+I182
+I420
+ta(I182
+I420
+I184
+I422
+ta(I184
+I422
+I186
+I423
+ta(I186
+I423
+I187
+I423
+ta(I187
+I423
+I188
+I424
+ta(I188
+I424
+I189
+I425
+ta(I189
+I425
+I190
+I426
+ta(I190
+I426
+I191
+I427
+ta(I191
+I427
+I192
+I428
+ta(I192
+I428
+I193
+I429
+ta(I193
+I429
+I195
+I431
+ta(I195
+I431
+I197
+I432
+ta(I197
+I432
+I199
+I434
+ta(I199
+I434
+I201
+I436
+ta(I201
+I436
+I204
+I438
+ta(I204
+I438
+I206
+I440
+ta(I206
+I440
+I208
+I442
+ta(I208
+I442
+I211
+I444
+ta(I211
+I444
+I213
+I446
+ta(I213
+I446
+I215
+I448
+ta(I215
+I448
+I217
+I449
+ta(I217
+I449
+I218
+I451
+ta(I218
+I451
+I220
+I453
+ta(I220
+I453
+I222
+I455
+ta(I222
+I455
+I225
+I457
+ta(I225
+I457
+I227
+I459
+ta(I227
+I459
+I229
+I462
+ta(I229
+I462
+I231
+I464
+ta(I231
+I464
+I233
+I466
+ta(I233
+I466
+I235
+I468
+ta(I235
+I468
+I237
+I470
+ta(I237
+I470
+I239
+I472
+ta(I239
+I472
+I241
+I474
+ta(I241
+I474
+I243
+I476
+ta(I243
+I476
+I244
+I477
+ta(I244
+I477
+I245
+I478
+ta(I245
+I478
+I246
+I480
+ta(I246
+I480
+I247
+I481
+ta(I247
+I481
+I249
+I482
+ta(I249
+I482
+I250
+I483
+ta(I250
+I483
+I251
+I485
+ta(I251
+I485
+I253
+I486
+ta(I253
+I486
+I254
+I488
+ta(I254
+I488
+I256
+I489
+ta(I256
+I489
+I257
+I489
+ta(I257
+I489
+I257
+I490
+ta(I257
+I490
+I258
+I491
+ta(I258
+I491
+I259
+I491
+ta(I259
+I491
+I259
+I492
+ta(I259
+I492
+I260
+I492
+ta(I260
+I492
+I260
+I493
+ta(I260
+I493
+I261
+I493
+ta(I261
+I493
+I262
+I494
+ta(I262
+I494
+I263
+I494
+ta(I263
+I494
+I264
+I495
+ta(I264
+I495
+I265
+I495
+ta(I265
+I495
+I266
+I496
+ta(I266
+I496
+I266
+I497
+ta(I266
+I497
+I267
+I497
+ta(I267
+I497
+I268
+I498
+ta(I268
+I498
+I269
+I499
+ta(I269
+I499
+I270
+I500
+ta(I270
+I500
+I271
+I501
+ta(I271
+I501
+I272
+I502
+ta(I272
+I502
+I272
+I503
+ta(I272
+I503
+I273
+I504
+ta(I273
+I504
+I274
+I504
+ta(I274
+I504
+I275
+I505
+ta(I275
+I505
+I276
+I506
+ta(I276
+I506
+I277
+I507
+ta(I277
+I507
+I278
+I507
+ta(I278
+I507
+I278
+I508
+ta(I278
+I508
+I278
+I507
+ta(I278
+I507
+I278
+I506
+tatp50
+a(g46
+I16
+(lp51
+(I311
+I319
+I310
+I320
+ta(I310
+I320
+I308
+I321
+ta(I308
+I321
+I307
+I322
+ta(I307
+I322
+I306
+I323
+ta(I306
+I323
+I305
+I325
+ta(I305
+I325
+I305
+I327
+ta(I305
+I327
+I304
+I328
+ta(I304
+I328
+I303
+I330
+ta(I303
+I330
+I303
+I332
+ta(I303
+I332
+I302
+I334
+ta(I302
+I334
+I301
+I337
+ta(I301
+I337
+I300
+I339
+ta(I300
+I339
+I300
+I341
+ta(I300
+I341
+I299
+I343
+ta(I299
+I343
+I299
+I347
+ta(I299
+I347
+I298
+I350
+ta(I298
+I350
+I298
+I353
+ta(I298
+I353
+I297
+I356
+ta(I297
+I356
+I297
+I359
+ta(I297
+I359
+I297
+I362
+ta(I297
+I362
+I296
+I365
+ta(I296
+I365
+I296
+I368
+ta(I296
+I368
+I296
+I371
+ta(I296
+I371
+I295
+I375
+ta(I295
+I375
+I295
+I378
+ta(I295
+I378
+I295
+I382
+ta(I295
+I382
+I295
+I385
+ta(I295
+I385
+I295
+I389
+ta(I295
+I389
+I295
+I392
+ta(I295
+I392
+I295
+I396
+ta(I295
+I396
+I296
+I399
+ta(I296
+I399
+I296
+I403
+ta(I296
+I403
+I296
+I406
+ta(I296
+I406
+I296
+I410
+ta(I296
+I410
+I296
+I414
+ta(I296
+I414
+I296
+I417
+ta(I296
+I417
+I296
+I421
+ta(I296
+I421
+I297
+I425
+ta(I297
+I425
+I297
+I429
+ta(I297
+I429
+I298
+I433
+ta(I298
+I433
+I298
+I436
+ta(I298
+I436
+I299
+I441
+ta(I299
+I441
+I300
+I444
+ta(I300
+I444
+I301
+I447
+ta(I301
+I447
+I302
+I451
+ta(I302
+I451
+I303
+I454
+ta(I303
+I454
+I304
+I456
+ta(I304
+I456
+I305
+I459
+ta(I305
+I459
+I306
+I462
+ta(I306
+I462
+I307
+I465
+ta(I307
+I465
+I308
+I468
+ta(I308
+I468
+I309
+I470
+ta(I309
+I470
+I310
+I472
+ta(I310
+I472
+I311
+I475
+ta(I311
+I475
+I312
+I477
+ta(I312
+I477
+I313
+I479
+ta(I313
+I479
+I314
+I481
+ta(I314
+I481
+I315
+I483
+ta(I315
+I483
+I317
+I485
+ta(I317
+I485
+I318
+I487
+ta(I318
+I487
+I319
+I488
+ta(I319
+I488
+I320
+I489
+ta(I320
+I489
+I321
+I491
+ta(I321
+I491
+I322
+I492
+ta(I322
+I492
+I323
+I493
+ta(I323
+I493
+I324
+I494
+ta(I324
+I494
+I326
+I496
+ta(I326
+I496
+I328
+I497
+ta(I328
+I497
+I329
+I499
+ta(I329
+I499
+I330
+I500
+ta(I330
+I500
+I332
+I501
+ta(I332
+I501
+I333
+I502
+ta(I333
+I502
+I335
+I503
+ta(I335
+I503
+I336
+I503
+ta(I336
+I503
+I338
+I503
+ta(I338
+I503
+I340
+I503
+ta(I340
+I503
+I342
+I503
+ta(I342
+I503
+I345
+I503
+ta(I345
+I503
+I347
+I503
+ta(I347
+I503
+I351
+I503
+ta(I351
+I503
+I353
+I503
+ta(I353
+I503
+I356
+I502
+ta(I356
+I502
+I360
+I501
+ta(I360
+I501
+I363
+I500
+ta(I363
+I500
+I366
+I498
+ta(I366
+I498
+I369
+I496
+ta(I369
+I496
+I371
+I494
+ta(I371
+I494
+I372
+I493
+ta(I372
+I493
+I374
+I491
+ta(I374
+I491
+I374
+I489
+ta(I374
+I489
+I375
+I487
+ta(I375
+I487
+I376
+I485
+ta(I376
+I485
+I377
+I483
+ta(I377
+I483
+I377
+I480
+ta(I377
+I480
+I378
+I478
+ta(I378
+I478
+I379
+I475
+ta(I379
+I475
+I379
+I471
+ta(I379
+I471
+I379
+I468
+ta(I379
+I468
+I379
+I465
+ta(I379
+I465
+I379
+I462
+ta(I379
+I462
+I379
+I460
+ta(I379
+I460
+I379
+I457
+ta(I379
+I457
+I379
+I453
+ta(I379
+I453
+I379
+I450
+ta(I379
+I450
+I378
+I446
+ta(I378
+I446
+I378
+I443
+ta(I378
+I443
+I377
+I439
+ta(I377
+I439
+I377
+I435
+ta(I377
+I435
+I376
+I431
+ta(I376
+I431
+I375
+I426
+ta(I375
+I426
+I375
+I422
+ta(I375
+I422
+I373
+I419
+ta(I373
+I419
+I372
+I416
+ta(I372
+I416
+I371
+I412
+ta(I371
+I412
+I370
+I409
+ta(I370
+I409
+I369
+I407
+ta(I369
+I407
+I368
+I405
+ta(I368
+I405
+I367
+I402
+ta(I367
+I402
+I366
+I399
+ta(I366
+I399
+I365
+I397
+ta(I365
+I397
+I364
+I394
+ta(I364
+I394
+I362
+I391
+ta(I362
+I391
+I361
+I388
+ta(I361
+I388
+I360
+I386
+ta(I360
+I386
+I359
+I384
+ta(I359
+I384
+I358
+I382
+ta(I358
+I382
+I358
+I381
+ta(I358
+I381
+I356
+I380
+ta(I356
+I380
+I356
+I379
+ta(I356
+I379
+I355
+I378
+ta(I355
+I378
+I355
+I377
+ta(I355
+I377
+I354
+I376
+ta(I354
+I376
+I353
+I374
+ta(I353
+I374
+I352
+I372
+ta(I352
+I372
+I351
+I370
+ta(I351
+I370
+I350
+I369
+ta(I350
+I369
+I348
+I367
+ta(I348
+I367
+I347
+I365
+ta(I347
+I365
+I346
+I364
+ta(I346
+I364
+I345
+I362
+ta(I345
+I362
+I344
+I360
+ta(I344
+I360
+I343
+I359
+ta(I343
+I359
+I342
+I358
+ta(I342
+I358
+I342
+I357
+ta(I342
+I357
+I340
+I355
+ta(I340
+I355
+I340
+I354
+ta(I340
+I354
+I339
+I353
+ta(I339
+I353
+I339
+I351
+ta(I339
+I351
+I338
+I350
+ta(I338
+I350
+I337
+I349
+ta(I337
+I349
+I337
+I348
+ta(I337
+I348
+I336
+I347
+ta(I336
+I347
+I336
+I346
+ta(I336
+I346
+I335
+I345
+ta(I335
+I345
+I334
+I344
+ta(I334
+I344
+I334
+I343
+ta(I334
+I343
+I333
+I342
+ta(I333
+I342
+I332
+I340
+ta(I332
+I340
+I332
+I339
+ta(I332
+I339
+I331
+I338
+ta(I331
+I338
+I330
+I337
+ta(I330
+I337
+I330
+I336
+ta(I330
+I336
+I329
+I336
+ta(I329
+I336
+I329
+I335
+ta(I329
+I335
+I329
+I334
+ta(I329
+I334
+I328
+I334
+ta(I328
+I334
+I328
+I333
+ta(I328
+I333
+I328
+I332
+ta(I328
+I332
+I327
+I332
+ta(I327
+I332
+I327
+I331
+ta(I327
+I331
+I326
+I331
+ta(I326
+I331
+I326
+I330
+ta(I326
+I330
+I326
+I329
+ta(I326
+I329
+I325
+I329
+ta(I325
+I329
+I324
+I328
+ta(I324
+I328
+I324
+I327
+ta(I324
+I327
+I323
+I326
+ta(I323
+I326
+I322
+I325
+ta(I322
+I325
+I321
+I324
+ta(I321
+I324
+I321
+I323
+ta(I321
+I323
+I320
+I323
+ta(I320
+I323
+I320
+I322
+ta(I320
+I322
+I319
+I321
+ta(I319
+I321
+I318
+I320
+ta(I318
+I320
+I317
+I319
+ta(I317
+I319
+I317
+I318
+ta(I317
+I318
+I316
+I318
+ta(I316
+I318
+I316
+I317
+ta(I316
+I317
+I315
+I316
+ta(I315
+I316
+I314
+I315
+ta(I314
+I315
+I314
+I314
+ta(I314
+I314
+I313
+I313
+ta(I313
+I313
+I313
+I312
+ta(I313
+I312
+I312
+I312
+ta(I312
+I312
+I312
+I311
+ta(I312
+I311
+I312
+I310
+ta(I312
+I310
+I311
+I310
+tatp52
+a(g46
+I16
+(lp53
+(I434
+I311
+I433
+I311
+ta(I433
+I311
+I432
+I311
+ta(I432
+I311
+I431
+I311
+ta(I431
+I311
+I430
+I310
+ta(I430
+I310
+I429
+I310
+ta(I429
+I310
+I428
+I310
+ta(I428
+I310
+I427
+I309
+ta(I427
+I309
+I426
+I309
+ta(I426
+I309
+I424
+I309
+ta(I424
+I309
+I423
+I309
+ta(I423
+I309
+I421
+I309
+ta(I421
+I309
+I419
+I309
+ta(I419
+I309
+I418
+I308
+ta(I418
+I308
+I417
+I308
+ta(I417
+I308
+I416
+I308
+ta(I416
+I308
+I415
+I308
+ta(I415
+I308
+I414
+I308
+ta(I414
+I308
+I413
+I308
+ta(I413
+I308
+I411
+I308
+ta(I411
+I308
+I410
+I309
+ta(I410
+I309
+I409
+I310
+ta(I409
+I310
+I408
+I311
+ta(I408
+I311
+I407
+I312
+ta(I407
+I312
+I406
+I312
+ta(I406
+I312
+I405
+I313
+ta(I405
+I313
+I404
+I315
+ta(I404
+I315
+I403
+I315
+ta(I403
+I315
+I402
+I317
+ta(I402
+I317
+I401
+I318
+ta(I401
+I318
+I400
+I319
+ta(I400
+I319
+I399
+I320
+ta(I399
+I320
+I398
+I322
+ta(I398
+I322
+I397
+I323
+ta(I397
+I323
+I397
+I325
+ta(I397
+I325
+I396
+I326
+ta(I396
+I326
+I394
+I328
+ta(I394
+I328
+I393
+I330
+ta(I393
+I330
+I392
+I332
+ta(I392
+I332
+I390
+I334
+ta(I390
+I334
+I389
+I336
+ta(I389
+I336
+I388
+I338
+ta(I388
+I338
+I387
+I339
+ta(I387
+I339
+I386
+I341
+ta(I386
+I341
+I384
+I343
+ta(I384
+I343
+I384
+I345
+ta(I384
+I345
+I383
+I347
+ta(I383
+I347
+I382
+I349
+ta(I382
+I349
+I381
+I351
+ta(I381
+I351
+I381
+I353
+ta(I381
+I353
+I380
+I356
+ta(I380
+I356
+I380
+I359
+ta(I380
+I359
+I379
+I361
+ta(I379
+I361
+I379
+I364
+ta(I379
+I364
+I379
+I367
+ta(I379
+I367
+I378
+I370
+ta(I378
+I370
+I378
+I374
+ta(I378
+I374
+I378
+I377
+ta(I378
+I377
+I378
+I380
+ta(I378
+I380
+I378
+I384
+ta(I378
+I384
+I378
+I387
+ta(I378
+I387
+I378
+I391
+ta(I378
+I391
+I379
+I395
+ta(I379
+I395
+I379
+I398
+ta(I379
+I398
+I380
+I401
+ta(I380
+I401
+I381
+I404
+ta(I381
+I404
+I382
+I407
+ta(I382
+I407
+I383
+I410
+ta(I383
+I410
+I383
+I412
+ta(I383
+I412
+I384
+I415
+ta(I384
+I415
+I386
+I418
+ta(I386
+I418
+I387
+I421
+ta(I387
+I421
+I388
+I424
+ta(I388
+I424
+I388
+I426
+ta(I388
+I426
+I389
+I429
+ta(I389
+I429
+I390
+I431
+ta(I390
+I431
+I390
+I434
+ta(I390
+I434
+I391
+I436
+ta(I391
+I436
+I392
+I438
+ta(I392
+I438
+I393
+I440
+ta(I393
+I440
+I393
+I442
+ta(I393
+I442
+I394
+I444
+ta(I394
+I444
+I395
+I445
+ta(I395
+I445
+I396
+I447
+ta(I396
+I447
+I397
+I449
+ta(I397
+I449
+I398
+I451
+ta(I398
+I451
+I399
+I453
+ta(I399
+I453
+I400
+I455
+ta(I400
+I455
+I401
+I456
+ta(I401
+I456
+I402
+I458
+ta(I402
+I458
+I403
+I460
+ta(I403
+I460
+I404
+I462
+ta(I404
+I462
+I405
+I463
+ta(I405
+I463
+I406
+I465
+ta(I406
+I465
+I407
+I467
+ta(I407
+I467
+I409
+I468
+ta(I409
+I468
+I410
+I470
+ta(I410
+I470
+I412
+I472
+ta(I412
+I472
+I414
+I474
+ta(I414
+I474
+I415
+I475
+ta(I415
+I475
+I416
+I476
+ta(I416
+I476
+I418
+I477
+ta(I418
+I477
+I419
+I478
+ta(I419
+I478
+I420
+I478
+ta(I420
+I478
+I421
+I479
+ta(I421
+I479
+I422
+I479
+ta(I422
+I479
+I423
+I479
+ta(I423
+I479
+I424
+I479
+ta(I424
+I479
+I425
+I479
+ta(I425
+I479
+I426
+I479
+ta(I426
+I479
+I428
+I479
+ta(I428
+I479
+I430
+I480
+ta(I430
+I480
+I431
+I480
+ta(I431
+I480
+I434
+I480
+ta(I434
+I480
+I436
+I480
+ta(I436
+I480
+I438
+I480
+ta(I438
+I480
+I441
+I480
+ta(I441
+I480
+I443
+I480
+ta(I443
+I480
+I446
+I480
+ta(I446
+I480
+I448
+I480
+ta(I448
+I480
+I450
+I480
+ta(I450
+I480
+I452
+I480
+ta(I452
+I480
+I454
+I480
+ta(I454
+I480
+I455
+I480
+ta(I455
+I480
+I457
+I480
+ta(I457
+I480
+I459
+I479
+ta(I459
+I479
+I460
+I478
+ta(I460
+I478
+I462
+I477
+ta(I462
+I477
+I464
+I476
+ta(I464
+I476
+I465
+I475
+ta(I465
+I475
+I466
+I474
+ta(I466
+I474
+I467
+I473
+ta(I467
+I473
+I468
+I472
+ta(I468
+I472
+I468
+I471
+ta(I468
+I471
+I469
+I470
+ta(I469
+I470
+I470
+I469
+ta(I470
+I469
+I471
+I468
+ta(I471
+I468
+I471
+I467
+ta(I471
+I467
+I472
+I466
+ta(I472
+I466
+I473
+I465
+ta(I473
+I465
+I474
+I464
+ta(I474
+I464
+I474
+I462
+ta(I474
+I462
+I475
+I461
+ta(I475
+I461
+I476
+I460
+ta(I476
+I460
+I477
+I459
+ta(I477
+I459
+I478
+I457
+ta(I478
+I457
+I479
+I456
+ta(I479
+I456
+I479
+I455
+ta(I479
+I455
+I479
+I454
+ta(I479
+I454
+I480
+I453
+ta(I480
+I453
+I480
+I452
+ta(I480
+I452
+I480
+I451
+ta(I480
+I451
+I480
+I450
+tatp54
+a(g46
+I16
+(lp55
+(I478
+I295
+I479
+I297
+ta(I479
+I297
+I481
+I301
+ta(I481
+I301
+I482
+I304
+ta(I482
+I304
+I484
+I307
+ta(I484
+I307
+I486
+I310
+ta(I486
+I310
+I488
+I314
+ta(I488
+I314
+I490
+I317
+ta(I490
+I317
+I491
+I321
+ta(I491
+I321
+I493
+I326
+ta(I493
+I326
+I495
+I329
+ta(I495
+I329
+I496
+I333
+ta(I496
+I333
+I498
+I336
+ta(I498
+I336
+I499
+I340
+ta(I499
+I340
+I501
+I344
+ta(I501
+I344
+I502
+I347
+ta(I502
+I347
+I504
+I351
+ta(I504
+I351
+I506
+I355
+ta(I506
+I355
+I507
+I359
+ta(I507
+I359
+I509
+I362
+ta(I509
+I362
+I510
+I366
+ta(I510
+I366
+I512
+I370
+ta(I512
+I370
+I514
+I373
+ta(I514
+I373
+I515
+I377
+ta(I515
+I377
+I517
+I380
+ta(I517
+I380
+I518
+I383
+ta(I518
+I383
+I519
+I386
+ta(I519
+I386
+I520
+I388
+ta(I520
+I388
+I521
+I391
+ta(I521
+I391
+I522
+I393
+ta(I522
+I393
+I522
+I395
+ta(I522
+I395
+I522
+I397
+ta(I522
+I397
+I523
+I400
+ta(I523
+I400
+I524
+I403
+ta(I524
+I403
+I525
+I405
+ta(I525
+I405
+I526
+I408
+ta(I526
+I408
+I526
+I411
+ta(I526
+I411
+I527
+I413
+ta(I527
+I413
+I528
+I415
+ta(I528
+I415
+I528
+I417
+ta(I528
+I417
+I529
+I420
+ta(I529
+I420
+I529
+I421
+ta(I529
+I421
+I529
+I423
+ta(I529
+I423
+I529
+I425
+ta(I529
+I425
+I529
+I426
+ta(I529
+I426
+I530
+I428
+ta(I530
+I428
+I530
+I430
+ta(I530
+I430
+I530
+I433
+ta(I530
+I433
+I531
+I435
+ta(I531
+I435
+I531
+I438
+ta(I531
+I438
+I531
+I440
+ta(I531
+I440
+I531
+I443
+ta(I531
+I443
+I532
+I445
+ta(I532
+I445
+I532
+I447
+ta(I532
+I447
+I532
+I450
+ta(I532
+I450
+I532
+I452
+ta(I532
+I452
+I533
+I453
+ta(I533
+I453
+I533
+I455
+ta(I533
+I455
+I533
+I457
+ta(I533
+I457
+I533
+I459
+ta(I533
+I459
+I534
+I460
+ta(I534
+I460
+I534
+I462
+ta(I534
+I462
+I534
+I464
+ta(I534
+I464
+I534
+I466
+ta(I534
+I466
+I534
+I468
+ta(I534
+I468
+I535
+I470
+ta(I535
+I470
+I535
+I472
+ta(I535
+I472
+I535
+I474
+ta(I535
+I474
+I535
+I476
+ta(I535
+I476
+I535
+I477
+ta(I535
+I477
+I535
+I478
+ta(I535
+I478
+I536
+I478
+ta(I536
+I478
+I536
+I479
+ta(I536
+I479
+I536
+I480
+ta(I536
+I480
+I536
+I481
+ta(I536
+I481
+I536
+I482
+ta(I536
+I482
+I537
+I483
+ta(I537
+I483
+I537
+I484
+tatp56
+a(g46
+I16
+(lp57
+(I540
+I307
+I539
+I308
+ta(I539
+I308
+I539
+I310
+ta(I539
+I310
+I539
+I311
+ta(I539
+I311
+I538
+I313
+ta(I538
+I313
+I538
+I315
+ta(I538
+I315
+I538
+I317
+ta(I538
+I317
+I537
+I320
+ta(I537
+I320
+I537
+I322
+ta(I537
+I322
+I535
+I326
+ta(I535
+I326
+I535
+I329
+ta(I535
+I329
+I534
+I332
+ta(I534
+I332
+I533
+I335
+ta(I533
+I335
+I532
+I338
+ta(I532
+I338
+I531
+I341
+ta(I531
+I341
+I530
+I344
+ta(I530
+I344
+I529
+I347
+ta(I529
+I347
+I528
+I349
+ta(I528
+I349
+I527
+I351
+ta(I527
+I351
+I526
+I354
+ta(I526
+I354
+I525
+I356
+ta(I525
+I356
+I524
+I358
+ta(I524
+I358
+I523
+I361
+ta(I523
+I361
+I522
+I363
+ta(I522
+I363
+I521
+I366
+ta(I521
+I366
+I520
+I368
+ta(I520
+I368
+I519
+I371
+ta(I519
+I371
+I518
+I373
+ta(I518
+I373
+I517
+I375
+ta(I517
+I375
+I516
+I377
+ta(I516
+I377
+I516
+I378
+ta(I516
+I378
+I516
+I379
+ta(I516
+I379
+I515
+I380
+ta(I515
+I380
+I515
+I381
+ta(I515
+I381
+I514
+I383
+ta(I514
+I383
+I514
+I384
+ta(I514
+I384
+I514
+I385
+ta(I514
+I385
+I514
+I387
+ta(I514
+I387
+I514
+I389
+ta(I514
+I389
+I514
+I390
+ta(I514
+I390
+I514
+I391
+ta(I514
+I391
+I514
+I392
+ta(I514
+I392
+I514
+I393
+ta(I514
+I393
+I515
+I393
+ta(I515
+I393
+I516
+I394
+ta(I516
+I394
+I517
+I394
+ta(I517
+I394
+I519
+I395
+ta(I519
+I395
+I521
+I396
+ta(I521
+I396
+I524
+I397
+ta(I524
+I397
+I527
+I398
+ta(I527
+I398
+I529
+I399
+ta(I529
+I399
+I532
+I399
+ta(I532
+I399
+I534
+I400
+ta(I534
+I400
+I536
+I401
+ta(I536
+I401
+I539
+I401
+ta(I539
+I401
+I541
+I402
+ta(I541
+I402
+I543
+I403
+ta(I543
+I403
+I544
+I404
+ta(I544
+I404
+I547
+I405
+ta(I547
+I405
+I549
+I406
+ta(I549
+I406
+I551
+I407
+ta(I551
+I407
+I554
+I408
+ta(I554
+I408
+I555
+I409
+ta(I555
+I409
+I557
+I410
+ta(I557
+I410
+I559
+I412
+ta(I559
+I412
+I561
+I413
+ta(I561
+I413
+I563
+I414
+ta(I563
+I414
+I565
+I416
+ta(I565
+I416
+I566
+I417
+ta(I566
+I417
+I568
+I418
+ta(I568
+I418
+I569
+I420
+ta(I569
+I420
+I570
+I421
+ta(I570
+I421
+I572
+I423
+ta(I572
+I423
+I574
+I425
+ta(I574
+I425
+I576
+I427
+ta(I576
+I427
+I577
+I429
+ta(I577
+I429
+I579
+I432
+ta(I579
+I432
+I581
+I434
+ta(I581
+I434
+I582
+I436
+ta(I582
+I436
+I583
+I438
+ta(I583
+I438
+I585
+I441
+ta(I585
+I441
+I586
+I442
+ta(I586
+I442
+I587
+I445
+ta(I587
+I445
+I589
+I447
+ta(I589
+I447
+I590
+I449
+ta(I590
+I449
+I591
+I451
+ta(I591
+I451
+I593
+I453
+ta(I593
+I453
+I594
+I456
+ta(I594
+I456
+I596
+I458
+ta(I596
+I458
+I597
+I460
+ta(I597
+I460
+I599
+I462
+ta(I599
+I462
+I600
+I464
+ta(I600
+I464
+I601
+I465
+ta(I601
+I465
+I602
+I467
+ta(I602
+I467
+I603
+I468
+ta(I603
+I468
+I604
+I470
+ta(I604
+I470
+I605
+I472
+ta(I605
+I472
+I606
+I474
+ta(I606
+I474
+I608
+I475
+ta(I608
+I475
+I609
+I477
+ta(I609
+I477
+I609
+I478
+ta(I609
+I478
+I610
+I478
+ta(I610
+I478
+I610
+I479
+ta(I610
+I479
+I611
+I480
+ta(I611
+I480
+I612
+I480
+ta(I612
+I480
+I612
+I481
+ta(I612
+I481
+I613
+I482
+ta(I613
+I482
+I613
+I483
+ta(I613
+I483
+I614
+I485
+ta(I614
+I485
+I614
+I486
+ta(I614
+I486
+I615
+I488
+ta(I615
+I488
+I615
+I489
+ta(I615
+I489
+I615
+I488
+ta(I615
+I488
+I614
+I487
+ta(I614
+I487
+I614
+I486
+ta(I614
+I486
+I614
+I485
+tatp58
+a(g46
+I16
+(lp59
+(I638
+I294
+I637
+I294
+ta(I637
+I294
+I634
+I294
+ta(I634
+I294
+I632
+I295
+ta(I632
+I295
+I630
+I295
+ta(I630
+I295
+I628
+I296
+ta(I628
+I296
+I626
+I297
+ta(I626
+I297
+I624
+I297
+ta(I624
+I297
+I621
+I299
+ta(I621
+I299
+I619
+I300
+ta(I619
+I300
+I617
+I301
+ta(I617
+I301
+I615
+I303
+ta(I615
+I303
+I613
+I304
+ta(I613
+I304
+I611
+I306
+ta(I611
+I306
+I609
+I307
+ta(I609
+I307
+I607
+I309
+ta(I607
+I309
+I606
+I311
+ta(I606
+I311
+I604
+I312
+ta(I604
+I312
+I602
+I314
+ta(I602
+I314
+I600
+I316
+ta(I600
+I316
+I598
+I318
+ta(I598
+I318
+I597
+I319
+ta(I597
+I319
+I596
+I321
+ta(I596
+I321
+I596
+I322
+ta(I596
+I322
+I595
+I324
+ta(I595
+I324
+I594
+I326
+ta(I594
+I326
+I594
+I327
+ta(I594
+I327
+I593
+I329
+ta(I593
+I329
+I592
+I331
+ta(I592
+I331
+I592
+I333
+ta(I592
+I333
+I591
+I335
+ta(I591
+I335
+I591
+I337
+ta(I591
+I337
+I590
+I339
+ta(I590
+I339
+I590
+I341
+ta(I590
+I341
+I590
+I343
+ta(I590
+I343
+I590
+I345
+ta(I590
+I345
+I590
+I347
+ta(I590
+I347
+I590
+I349
+ta(I590
+I349
+I590
+I352
+ta(I590
+I352
+I590
+I354
+ta(I590
+I354
+I590
+I356
+ta(I590
+I356
+I590
+I358
+ta(I590
+I358
+I591
+I361
+ta(I591
+I361
+I592
+I363
+ta(I592
+I363
+I593
+I364
+ta(I593
+I364
+I594
+I365
+ta(I594
+I365
+I594
+I366
+ta(I594
+I366
+I595
+I367
+ta(I595
+I367
+I596
+I368
+ta(I596
+I368
+I597
+I369
+ta(I597
+I369
+I598
+I370
+ta(I598
+I370
+I599
+I370
+ta(I599
+I370
+I600
+I371
+ta(I600
+I371
+I601
+I372
+ta(I601
+I372
+I602
+I373
+ta(I602
+I373
+I604
+I373
+ta(I604
+I373
+I605
+I374
+ta(I605
+I374
+I607
+I374
+ta(I607
+I374
+I609
+I374
+ta(I609
+I374
+I610
+I374
+ta(I610
+I374
+I611
+I374
+ta(I611
+I374
+I612
+I375
+ta(I612
+I375
+I613
+I375
+ta(I613
+I375
+I614
+I376
+ta(I614
+I376
+I615
+I376
+ta(I615
+I376
+I616
+I377
+ta(I616
+I377
+I618
+I377
+ta(I618
+I377
+I620
+I378
+ta(I620
+I378
+I622
+I378
+ta(I622
+I378
+I624
+I379
+ta(I624
+I379
+I625
+I379
+ta(I625
+I379
+I627
+I380
+ta(I627
+I380
+I628
+I380
+ta(I628
+I380
+I629
+I381
+ta(I629
+I381
+I630
+I381
+ta(I630
+I381
+I630
+I382
+ta(I630
+I382
+I631
+I382
+ta(I631
+I382
+I632
+I383
+ta(I632
+I383
+I633
+I383
+ta(I633
+I383
+I634
+I384
+ta(I634
+I384
+I635
+I385
+ta(I635
+I385
+I637
+I386
+ta(I637
+I386
+I639
+I387
+ta(I639
+I387
+I641
+I388
+ta(I641
+I388
+I642
+I389
+ta(I642
+I389
+I643
+I390
+ta(I643
+I390
+I644
+I391
+ta(I644
+I391
+I645
+I392
+ta(I645
+I392
+I646
+I392
+ta(I646
+I392
+I646
+I393
+ta(I646
+I393
+I648
+I393
+ta(I648
+I393
+I649
+I394
+ta(I649
+I394
+I650
+I395
+ta(I650
+I395
+I650
+I396
+ta(I650
+I396
+I651
+I397
+ta(I651
+I397
+I652
+I398
+ta(I652
+I398
+I654
+I400
+ta(I654
+I400
+I655
+I401
+ta(I655
+I401
+I656
+I402
+ta(I656
+I402
+I657
+I403
+ta(I657
+I403
+I658
+I404
+ta(I658
+I404
+I658
+I405
+ta(I658
+I405
+I659
+I406
+ta(I659
+I406
+I660
+I406
+ta(I660
+I406
+I661
+I407
+ta(I661
+I407
+I662
+I408
+ta(I662
+I408
+I663
+I409
+ta(I663
+I409
+I664
+I410
+ta(I664
+I410
+I665
+I412
+ta(I665
+I412
+I667
+I413
+ta(I667
+I413
+I668
+I415
+ta(I668
+I415
+I669
+I417
+ta(I669
+I417
+I671
+I418
+ta(I671
+I418
+I672
+I420
+ta(I672
+I420
+I672
+I422
+ta(I672
+I422
+I673
+I423
+ta(I673
+I423
+I674
+I424
+ta(I674
+I424
+I674
+I426
+ta(I674
+I426
+I675
+I428
+ta(I675
+I428
+I675
+I429
+ta(I675
+I429
+I676
+I431
+ta(I676
+I431
+I676
+I432
+ta(I676
+I432
+I677
+I434
+ta(I677
+I434
+I678
+I435
+ta(I678
+I435
+I678
+I437
+ta(I678
+I437
+I678
+I438
+ta(I678
+I438
+I678
+I439
+ta(I678
+I439
+I678
+I440
+ta(I678
+I440
+I678
+I441
+ta(I678
+I441
+I678
+I443
+ta(I678
+I443
+I677
+I445
+ta(I677
+I445
+I677
+I446
+ta(I677
+I446
+I676
+I448
+ta(I676
+I448
+I676
+I450
+ta(I676
+I450
+I676
+I451
+ta(I676
+I451
+I675
+I453
+ta(I675
+I453
+I675
+I454
+ta(I675
+I454
+I674
+I456
+ta(I674
+I456
+I673
+I457
+ta(I673
+I457
+I673
+I459
+ta(I673
+I459
+I672
+I460
+ta(I672
+I460
+I671
+I461
+ta(I671
+I461
+I670
+I462
+ta(I670
+I462
+I669
+I463
+ta(I669
+I463
+I668
+I465
+ta(I668
+I465
+I668
+I466
+ta(I668
+I466
+I667
+I467
+ta(I667
+I467
+I666
+I469
+ta(I666
+I469
+I665
+I471
+ta(I665
+I471
+I664
+I472
+ta(I664
+I472
+I664
+I473
+ta(I664
+I473
+I663
+I474
+ta(I663
+I474
+I662
+I475
+ta(I662
+I475
+I661
+I476
+ta(I661
+I476
+I661
+I477
+ta(I661
+I477
+I660
+I478
+ta(I660
+I478
+I660
+I479
+ta(I660
+I479
+I659
+I480
+ta(I659
+I480
+I659
+I481
+ta(I659
+I481
+I658
+I481
+ta(I658
+I481
+I657
+I482
+ta(I657
+I482
+I657
+I483
+ta(I657
+I483
+I656
+I484
+ta(I656
+I484
+I656
+I485
+ta(I656
+I485
+I655
+I486
+ta(I655
+I486
+I655
+I487
+ta(I655
+I487
+I654
+I487
+tatp60
+a(g46
+I16
+(lp61
+(I655
+I481
+I655
+I482
+ta(I655
+I482
+I654
+I482
+ta(I654
+I482
+I654
+I483
+ta(I654
+I483
+I654
+I484
+ta(I654
+I484
+I653
+I484
+ta(I653
+I484
+I653
+I485
+ta(I653
+I485
+I652
+I485
+ta(I652
+I485
+I652
+I486
+ta(I652
+I486
+I651
+I486
+ta(I651
+I486
+I651
+I487
+ta(I651
+I487
+I650
+I487
+ta(I650
+I487
+I650
+I488
+ta(I650
+I488
+I649
+I488
+ta(I649
+I488
+I648
+I488
+ta(I648
+I488
+I647
+I489
+ta(I647
+I489
+I646
+I489
+ta(I646
+I489
+I645
+I489
+ta(I645
+I489
+I644
+I489
+ta(I644
+I489
+I643
+I490
+ta(I643
+I490
+I642
+I490
+ta(I642
+I490
+I641
+I490
+ta(I641
+I490
+I640
+I490
+ta(I640
+I490
+I639
+I490
+ta(I639
+I490
+I638
+I490
+ta(I638
+I490
+I637
+I490
+ta(I637
+I490
+I636
+I490
+ta(I636
+I490
+I635
+I489
+ta(I635
+I489
+I634
+I489
+ta(I634
+I489
+I633
+I489
+ta(I633
+I489
+I632
+I488
+ta(I632
+I488
+I631
+I488
+ta(I631
+I488
+I631
+I487
+ta(I631
+I487
+I630
+I487
+ta(I630
+I487
+I629
+I486
+ta(I629
+I486
+I628
+I485
+ta(I628
+I485
+I627
+I485
+ta(I627
+I485
+I627
+I484
+ta(I627
+I484
+I626
+I484
+ta(I626
+I484
+I626
+I483
+ta(I626
+I483
+I625
+I482
+ta(I625
+I482
+I624
+I481
+ta(I624
+I481
+I624
+I480
+ta(I624
+I480
+I623
+I480
+tatp62
+a(g46
+I16
+(lp63
+(I675
+I273
+I676
+I273
+ta(I676
+I273
+I677
+I273
+ta(I677
+I273
+I677
+I275
+ta(I677
+I275
+I678
+I276
+ta(I678
+I276
+I679
+I278
+ta(I679
+I278
+I681
+I281
+ta(I681
+I281
+I682
+I284
+ta(I682
+I284
+I683
+I287
+ta(I683
+I287
+I684
+I290
+ta(I684
+I290
+I685
+I293
+ta(I685
+I293
+I687
+I296
+ta(I687
+I296
+I688
+I299
+ta(I688
+I299
+I689
+I301
+ta(I689
+I301
+I690
+I303
+ta(I690
+I303
+I691
+I306
+ta(I691
+I306
+I691
+I309
+ta(I691
+I309
+I692
+I312
+ta(I692
+I312
+I693
+I315
+ta(I693
+I315
+I694
+I318
+ta(I694
+I318
+I694
+I322
+ta(I694
+I322
+I696
+I325
+ta(I696
+I325
+I696
+I328
+ta(I696
+I328
+I697
+I332
+ta(I697
+I332
+I698
+I334
+ta(I698
+I334
+I699
+I336
+ta(I699
+I336
+I699
+I338
+ta(I699
+I338
+I700
+I340
+ta(I700
+I340
+I700
+I342
+ta(I700
+I342
+I700
+I344
+ta(I700
+I344
+I700
+I346
+ta(I700
+I346
+I701
+I348
+ta(I701
+I348
+I701
+I350
+ta(I701
+I350
+I701
+I352
+ta(I701
+I352
+I701
+I354
+ta(I701
+I354
+I701
+I356
+ta(I701
+I356
+I702
+I357
+ta(I702
+I357
+I702
+I359
+ta(I702
+I359
+I702
+I361
+ta(I702
+I361
+I702
+I363
+ta(I702
+I363
+I703
+I365
+ta(I703
+I365
+I703
+I367
+ta(I703
+I367
+I703
+I369
+ta(I703
+I369
+I704
+I371
+ta(I704
+I371
+I704
+I373
+ta(I704
+I373
+I704
+I376
+ta(I704
+I376
+I704
+I378
+ta(I704
+I378
+I705
+I380
+ta(I705
+I380
+I705
+I382
+ta(I705
+I382
+I705
+I385
+ta(I705
+I385
+I705
+I387
+ta(I705
+I387
+I706
+I389
+ta(I706
+I389
+I706
+I391
+ta(I706
+I391
+I706
+I392
+ta(I706
+I392
+I706
+I394
+ta(I706
+I394
+I706
+I396
+ta(I706
+I396
+I707
+I397
+ta(I707
+I397
+I707
+I398
+ta(I707
+I398
+I707
+I400
+ta(I707
+I400
+I708
+I401
+ta(I708
+I401
+I708
+I402
+ta(I708
+I402
+I708
+I403
+ta(I708
+I403
+I708
+I404
+ta(I708
+I404
+I708
+I405
+ta(I708
+I405
+I709
+I406
+ta(I709
+I406
+I709
+I407
+ta(I709
+I407
+I709
+I408
+ta(I709
+I408
+I709
+I409
+ta(I709
+I409
+I710
+I410
+ta(I710
+I410
+I710
+I411
+tatp64
+a(g46
+I16
+(lp65
+(I703
+I403
+I703
+I404
+ta(I703
+I404
+I704
+I404
+ta(I704
+I404
+I704
+I405
+ta(I704
+I405
+I704
+I406
+ta(I704
+I406
+I705
+I406
+ta(I705
+I406
+I705
+I407
+ta(I705
+I407
+I705
+I408
+ta(I705
+I408
+I705
+I409
+ta(I705
+I409
+I706
+I409
+ta(I706
+I409
+I706
+I410
+ta(I706
+I410
+I706
+I411
+ta(I706
+I411
+I706
+I412
+ta(I706
+I412
+I707
+I413
+ta(I707
+I413
+I707
+I414
+ta(I707
+I414
+I707
+I415
+ta(I707
+I415
+I707
+I416
+ta(I707
+I416
+I707
+I417
+ta(I707
+I417
+I707
+I418
+ta(I707
+I418
+I707
+I419
+ta(I707
+I419
+I707
+I420
+ta(I707
+I420
+I707
+I421
+ta(I707
+I421
+I707
+I422
+ta(I707
+I422
+I707
+I423
+ta(I707
+I423
+I707
+I424
+ta(I707
+I424
+I707
+I425
+ta(I707
+I425
+I707
+I426
+ta(I707
+I426
+I707
+I427
+ta(I707
+I427
+I707
+I428
+ta(I707
+I428
+I707
+I429
+ta(I707
+I429
+I706
+I430
+ta(I706
+I430
+I706
+I431
+ta(I706
+I431
+I706
+I432
+ta(I706
+I432
+I706
+I433
+ta(I706
+I433
+I705
+I434
+ta(I705
+I434
+I705
+I435
+ta(I705
+I435
+I705
+I436
+ta(I705
+I436
+I704
+I437
+ta(I704
+I437
+I704
+I438
+ta(I704
+I438
+I704
+I439
+ta(I704
+I439
+I704
+I440
+ta(I704
+I440
+I703
+I440
+ta(I703
+I440
+I703
+I441
+ta(I703
+I441
+I703
+I442
+ta(I703
+I442
+I703
+I443
+ta(I703
+I443
+I702
+I443
+ta(I702
+I443
+I702
+I444
+ta(I702
+I444
+I702
+I445
+ta(I702
+I445
+I702
+I446
+ta(I702
+I446
+I701
+I447
+ta(I701
+I447
+I701
+I448
+ta(I701
+I448
+I701
+I449
+ta(I701
+I449
+I701
+I450
+ta(I701
+I450
+I700
+I450
+ta(I700
+I450
+I700
+I451
+ta(I700
+I451
+I700
+I452
+tatp66
+a(g46
+I16
+(lp67
+(I699
+I472
+I700
+I472
+ta(I700
+I472
+I700
+I473
+ta(I700
+I473
+I700
+I474
+ta(I700
+I474
+I700
+I475
+ta(I700
+I475
+I700
+I476
+ta(I700
+I476
+I700
+I477
+ta(I700
+I477
+I700
+I478
+tatp68
+a.
\ No newline at end of file
diff --git a/wxPython/samples/doodle/superdoodle.py b/wxPython/samples/doodle/superdoodle.py
new file mode 100644 (file)
index 0000000..7bc579d
--- /dev/null
@@ -0,0 +1,369 @@
+# superdoodle.py
+
+"""
+This module implements the SuperDoodle demo application.  It takes the
+DoodleWindow previously presented and reuses it in a much more
+intelligent Frame.  This one has a menu and a statusbar, is able to
+save and reload doodles, clear the workspace, and has a simple control
+panel for setting color and line thickness in addition to the popup
+menu that DoodleWindow provides.  There is also a nice About dialog
+implmented using an wxHtmlWindow.
+"""
+
+from wxPython.wx import *
+from doodle import DoodleWindow
+
+import os, cPickle
+
+
+#----------------------------------------------------------------------
+
+idNEW    = 11001
+idOPEN   = 11002
+idSAVE   = 11003
+idSAVEAS = 11004
+idCLEAR  = 11005
+idEXIT   = 11006
+idABOUT  = 11007
+
+
+class DoodleFrame(wxFrame):
+    """
+    A DoodleFrame contains a DoodleWindow and a ControlPanel and manages
+    their layout with a wxBoxSizer.  A menu and associated event handlers
+    provides for saving a doodle to a file, etc.
+    """
+    title = "Do a doodle"
+    def __init__(self, parent):
+        wxFrame.__init__(self, parent, -1, self.title, size=(800,600))
+        self.CreateStatusBar()
+        self.MakeMenu()
+        self.filename = None
+
+        self.doodle = DoodleWindow(self, -1)
+        cPanel = ControlPanel(self, -1, self.doodle)
+
+        # Create a sizer to layout the two windows side-by-side.
+        # Both will grow vertically, the doodle window will grow
+        # horizontally as well.
+        box = wxBoxSizer(wxHORIZONTAL)
+        box.Add(cPanel, 0, wxEXPAND)
+        box.Add(self.doodle, 1, wxEXPAND)
+
+        # Tell the frame that it should layout itself in response to
+        # size events.
+        self.SetAutoLayout(true)
+        self.SetSizer(box)
+
+
+    def SaveFile(self):
+        if self.filename:
+            data = self.doodle.GetLinesData()
+            f = open(self.filename, 'w')
+            cPickle.dump(data, f)
+            f.close()
+
+
+    def ReadFile(self):
+        if self.filename:
+            try:
+                f = open(self.filename, 'r')
+                data = cPickle.load(f)
+                f.close()
+                self.doodle.SetLinesData(data)
+            except cPickle.UnpicklingError:
+                wxMessageBox("%s is not a doodle file." % self.filename,
+                             "oops!", style=wxOK|wxICON_EXCLAMATION)
+
+
+    def MakeMenu(self):
+        # create the file menu
+        menu1 = wxMenu()
+        menu1.Append(idOPEN, "&Open", "Open a doodle file")
+        menu1.Append(idSAVE, "&Save", "Save the doodle")
+        menu1.Append(idSAVEAS, "Save &As", "Save the doodle in a new file")
+        menu1.AppendSeparator()
+        menu1.Append(idCLEAR, "&Clear", "Clear the current doodle")
+        menu1.AppendSeparator()
+        menu1.Append(idEXIT, "E&xit", "Terminate the application")
+
+        # and the help menu
+        menu2 = wxMenu()
+        menu2.Append(idABOUT, "&About", "Display the gratuitous 'about this app' thingamajig")
+
+        # and add them to a menubar
+        menuBar = wxMenuBar()
+        menuBar.Append(menu1, "&File")
+        menuBar.Append(menu2, "&Help")
+        self.SetMenuBar(menuBar)
+
+        EVT_MENU(self, idOPEN,   self.OnMenuOpen)
+        EVT_MENU(self, idSAVE,   self.OnMenuSave)
+        EVT_MENU(self, idSAVEAS, self.OnMenuSaveAs)
+        EVT_MENU(self, idCLEAR,  self.OnMenuClear)
+        EVT_MENU(self, idEXIT,   self.OnMenuExit)
+        EVT_MENU(self, idABOUT,  self.OnMenuAbout)
+
+
+
+    wildcard = "Doodle files (*.ddl)|*.ddl|All files (*.*)|*.*"
+
+    def OnMenuOpen(self, event):
+        dlg = wxFileDialog(self, "Open doodle file...",
+                           style=wxOPEN, wildcard = self.wildcard)
+        if dlg.ShowModal() == wxID_OK:
+            self.filename = dlg.GetPath()
+            self.ReadFile()
+            self.SetTitle(self.title + ' -- ' + self.filename)
+        dlg.Destroy()
+
+
+    def OnMenuSave(self, event):
+        if not self.filename:
+            self.OnMenuSaveAs(event)
+        else:
+            self.SaveFile()
+
+
+    def OnMenuSaveAs(self, event):
+        dlg = wxFileDialog(self, "Save doodle as...",
+                           style=wxSAVE | wxOVERWRITE_PROMPT,
+                           wildcard = self.wildcard)
+        if dlg.ShowModal() == wxID_OK:
+            filename = dlg.GetPath()
+            if not os.path.splitext(filename)[1]:
+                filename = filename + '.ddl'
+            self.filename = filename
+            self.SaveFile()
+            self.SetTitle(self.title + ' -- ' + self.filename)
+        dlg.Destroy()
+
+
+    def OnMenuClear(self, event):
+        self.doodle.SetLinesData([])
+        self.SetTitle(self.title)
+
+
+    def OnMenuExit(self, event):
+        self.Close()
+
+
+    def OnMenuAbout(self, event):
+        dlg = DoodleAbout(self)
+        dlg.ShowModal()
+        dlg.Destroy()
+
+
+
+#----------------------------------------------------------------------
+
+
+class ControlPanel(wxPanel):
+    """
+    This class implements a very simple control panel for the DoodleWindow.
+    It creates buttons for each of the colours and thickneses supported by
+    the DoodleWindow, and event handlers to set the selected values.  There is
+    also a little window that shows an example doodleLine in the selected
+    values.  Nested sizers are used for layout.
+    """
+    def __init__(self, parent, ID, doodle):
+        wxPanel.__init__(self, parent, ID, style=wxRAISED_BORDER)
+
+        numCols = 4
+        spacing = 4
+
+        # Make a grid of buttons for each colour.  Attach each button
+        # event to self.OnSetColour.  The button ID is the same as the
+        # key in the colour dictionary.
+        colours = doodle.menuColours
+        keys = colours.keys()
+        keys.sort()
+        cGrid = wxGridSizer(cols=numCols, hgap=2, vgap=2)
+        for k in keys:
+            bmp = self.MakeBitmap(wxNamedColour(colours[k]))
+            b = wxBitmapButton(self, k, bmp)
+            EVT_BUTTON(self, k, self.OnSetColour)
+            cGrid.Add(b, 0)
+
+        # Save the button size so we can use it for the number buttons
+        btnSize = b.GetSize()
+
+        # Make a grid of buttons for the thicknesses.  Attach each button
+        # event to self.OnSetThickness.  The button ID is the same as the
+        # thickness value.
+        tGrid = wxGridSizer(cols=numCols, hgap=2, vgap=2)
+        for x in range(1, doodle.maxThickness+1):
+            b = wxButton(self, x, str(x), size=btnSize)
+            EVT_BUTTON(self, x, self.OnSetThickness)
+            tGrid.Add(b, 0)
+
+        # Make a colour indicator window, it is registerd as a listener
+        # with the doodle window so it will be notified when the settings
+        # change
+        ci = ColourIndicator(self)
+        doodle.AddListener(ci)
+        doodle.Notify()
+        self.doodle = doodle
+
+        # Make a box sizer and put the two grids and the indicator
+        # window in it.
+        box = wxBoxSizer(wxVERTICAL)
+        box.Add(cGrid, 0, wxALL, spacing)
+        box.Add(tGrid, 0, wxALL, spacing)
+        box.Add(ci, 0, wxEXPAND|wxALL, spacing)
+        self.SetSizer(box)
+        self.SetAutoLayout(true)
+
+        # Resize this window so it is just large enough for the
+        # minimum requirements of the sizer.
+        box.Fit(self)
+
+
+
+    def MakeBitmap(self, colour):
+        """
+        We can create a bitmap of whatever we want by simply selecting
+        it into a wxMemoryDC and drawing on it.  In this case we just set
+        a background brush and clear the dc.
+        """
+        bmp = wxEmptyBitmap(16,16)
+        dc = wxMemoryDC()
+        dc.SelectObject(bmp)
+        dc.SetBackground(wxBrush(colour))
+        dc.Clear()
+        dc.SelectObject(wxNullBitmap)
+        return bmp
+
+
+    def OnSetColour(self, event):
+        """
+        Use the event ID to get the colour, set that colour in the doodle.
+        """
+        colour = self.doodle.menuColours[event.GetId()]
+        self.doodle.SetColour(colour)
+
+
+    def OnSetThickness(self, event):
+        """
+        Use the event ID to set the thickness in the doodle.
+        """
+        self.doodle.SetThickness(event.GetId())
+
+
+#----------------------------------------------------------------------
+
+class ColourIndicator(wxWindow):
+    """
+    An instance of this class is used on the ControlPanel to show
+    a sample of what the current doodle line will look like.
+    """
+    def __init__(self, parent):
+        wxWindow.__init__(self, parent, -1, style=wxSUNKEN_BORDER)
+        self.SetBackgroundColour(wxWHITE)
+        self.SetSize(wxSize(-1, 40))
+        self.colour = self.thickness = None
+        EVT_PAINT(self, self.OnPaint)
+
+
+    def Update(self, colour, thickness):
+        """
+        The doodle window calls this method any time the colour
+        or line thickness changes.
+        """
+        self.colour = colour
+        self.thickness = thickness
+        self.Refresh()  # generate a paint event
+
+
+    def OnPaint(self, event):
+        """
+        This method is called when all or part of the window needs to be
+        redrawn.
+        """
+        dc = wxPaintDC(self)
+        if self.colour:
+            sz = self.GetClientSize()
+            pen = wxPen(wxNamedColour(self.colour), self.thickness)
+            dc.BeginDrawing()
+            dc.SetPen(pen)
+            dc.DrawLine(10, sz.height/2, sz.width-10, sz.height/2)
+            dc.EndDrawing()
+
+
+#----------------------------------------------------------------------
+
+class DoodleAbout(wxDialog):
+    """ An about box that uses an HTML window """
+
+    text = '''
+<html>
+<body bgcolor="#ACAA60">
+<center><table bgcolor="#455481" width="100%" cellspacing="0"
+cellpadding="0" border="1">
+<tr>
+    <td align="center"><h1>SuperDoodle</h1></td>
+</tr>
+</table>
+</center>
+<p><b>SuperDoodle</b> is a demonstration program for <b>wxPython</b> that
+will hopefully teach you a thing or two.  Just follow these simple
+instructions: </p>
+<p>
+<ol>
+  <li><b>Read</b> the Source...
+  <li><b>Learn</b>...
+  <li><b>Do!</b>
+</ol>
+
+<p><b>SuperDoodle</b> and <b>wxPython</b> are brought to you by
+<b>Robin Dunn</b> and <b>Total Control Software</b>, Copyright
+&copy; 1997-2001.</p>
+</body>
+</html>
+'''
+
+    def __init__(self, parent):
+        wxDialog.__init__(self, parent, -1, 'About SuperDoodle',
+                          size=wxSize(420, 380))
+        from wxPython.html import wxHtmlWindow
+
+        html = wxHtmlWindow(self, -1)
+        html.SetPage(self.text)
+        button = wxButton(self, wxID_OK, "Okay")
+
+        # constraints for the html window
+        lc = wxLayoutConstraints()
+        lc.top.SameAs(self, wxTop, 5)
+        lc.left.SameAs(self, wxLeft, 5)
+        lc.bottom.SameAs(button, wxTop, 5)
+        lc.right.SameAs(self, wxRight, 5)
+        html.SetConstraints(lc)
+
+        # constraints for the button
+        lc = wxLayoutConstraints()
+        lc.bottom.SameAs(self, wxBottom, 5)
+        lc.centreX.SameAs(self, wxCentreX)
+        lc.width.AsIs()
+        lc.height.AsIs()
+        button.SetConstraints(lc)
+
+        self.SetAutoLayout(true)
+        self.Layout()
+        self.CentreOnParent(wxBOTH)
+
+
+#----------------------------------------------------------------------
+
+class DoodleApp(wxApp):
+    def OnInit(self):
+        frame = DoodleFrame(None)
+        frame.Show(true)
+        self.SetTopWindow(frame)
+        return true
+
+
+#----------------------------------------------------------------------
+
+if __name__ == '__main__':
+    app = DoodleApp(0)
+    app.MainLoop()
diff --git a/wxPython/samples/stxview/StructuredText/ClassicDocumentClass.py b/wxPython/samples/stxview/StructuredText/ClassicDocumentClass.py
new file mode 100644 (file)
index 0000000..23b73d6
--- /dev/null
@@ -0,0 +1,689 @@
+##############################################################################
+# 
+# Zope Public License (ZPL) Version 1.0
+# -------------------------------------
+# 
+# Copyright (c) Digital Creations.  All rights reserved.
+# 
+# This license has been certified as Open Source(tm).
+# 
+# Redistribution and use in source and binary forms, with or without
+# modification, are permitted provided that the following conditions are
+# met:
+# 
+# 1. Redistributions in source code must retain the above copyright
+#    notice, this list of conditions, and the following disclaimer.
+# 
+# 2. Redistributions in binary form must reproduce the above copyright
+#    notice, this list of conditions, and the following disclaimer in
+#    the documentation and/or other materials provided with the
+#    distribution.
+# 
+# 3. Digital Creations requests that attribution be given to Zope
+#    in any manner possible. Zope includes a "Powered by Zope"
+#    button that is installed by default. While it is not a license
+#    violation to remove this button, it is requested that the
+#    attribution remain. A significant investment has been put
+#    into Zope, and this effort will continue if the Zope community
+#    continues to grow. This is one way to assure that growth.
+# 
+# 4. All advertising materials and documentation mentioning
+#    features derived from or use of this software must display
+#    the following acknowledgement:
+# 
+#       "This product includes software developed by Digital Creations
+#       for use in the Z Object Publishing Environment
+#       (http://www.zope.org/)."
+# 
+#    In the event that the product being advertised includes an
+#    intact Zope distribution (with copyright and license included)
+#    then this clause is waived.
+# 
+# 5. Names associated with Zope or Digital Creations must not be used to
+#    endorse or promote products derived from this software without
+#    prior written permission from Digital Creations.
+# 
+# 6. Modified redistributions of any form whatsoever must retain
+#    the following acknowledgment:
+# 
+#       "This product includes software developed by Digital Creations
+#       for use in the Z Object Publishing Environment
+#       (http://www.zope.org/)."
+# 
+#    Intact (re-)distributions of any official Zope release do not
+#    require an external acknowledgement.
+# 
+# 7. Modifications are encouraged but must be packaged separately as
+#    patches to official Zope releases.  Distributions that do not
+#    clearly separate the patches from the original work must be clearly
+#    labeled as unofficial distributions.  Modifications which do not
+#    carry the name Zope may be packaged in any form, as long as they
+#    conform to all of the clauses above.
+# 
+# 
+# Disclaimer
+# 
+#    THIS SOFTWARE IS PROVIDED BY DIGITAL CREATIONS ``AS IS'' AND ANY
+#    EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+#    IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+#    PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL DIGITAL CREATIONS OR ITS
+#    CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+#    SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+#    LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
+#    USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+#    ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+#    OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
+#    OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+#    SUCH DAMAGE.
+# 
+# 
+# This software consists of contributions made by Digital Creations and
+# many individuals on behalf of Digital Creations.  Specific
+# attributions are listed in the accompanying credits file.
+# 
+##############################################################################
+
+import re, ST, STDOM
+from string import split, join, replace, expandtabs, strip, find
+
+StringType=type('')
+ListType=type([])
+
+class StructuredTextExample(ST.StructuredTextParagraph):
+    """Represents a section of document with literal text, as for examples"""
+
+    def __init__(self, subs, **kw):
+       t=[]; a=t.append
+       for s in subs: a(s.getNodeValue())
+       apply(ST.StructuredTextParagraph.__init__,
+             (self, join(t,'\n\n'), ()),
+             kw)
+
+    def getColorizableTexts(self): return ()
+    def setColorizableTexts(self, src): pass # never color examples
+
+class StructuredTextBullet(ST.StructuredTextParagraph):
+    """Represents a section of a document with a title and a body"""
+
+class StructuredTextNumbered(ST.StructuredTextParagraph):
+    """Represents a section of a document with a title and a body"""
+
+class StructuredTextDescriptionTitle(ST.StructuredTextParagraph):
+    """Represents a section of a document with a title and a body"""
+
+class StructuredTextDescriptionBody(ST.StructuredTextParagraph):
+    """Represents a section of a document with a title and a body"""
+
+class StructuredTextDescription(ST.StructuredTextParagraph):
+    """Represents a section of a document with a title and a body"""
+    
+    def __init__(self, title, src, subs, **kw):
+       apply(ST.StructuredTextParagraph.__init__, (self, src, subs), kw)
+       self._title=title
+
+    def getColorizableTexts(self): return self._title, self._src
+    def setColorizableTexts(self, src): self._title, self._src = src
+
+    def getChildren(self):
+       return (StructuredTextDescriptionTitle(self._title),
+               StructuredTextDescriptionBody(self._src, self._subs))
+
+class StructuredTextSectionTitle(ST.StructuredTextParagraph):
+    """Represents a section of a document with a title and a body"""
+
+class StructuredTextSection(ST.StructuredTextParagraph):
+    """Represents a section of a document with a title and a body"""
+    def __init__(self, src, subs=None, **kw):
+       apply(ST.StructuredTextParagraph.__init__,
+             (self, StructuredTextSectionTitle(src), subs),
+             kw)
+
+# a StructuredTextTable holds StructuredTextRows
+class StructuredTextTable(ST.StructuredTextDocument):
+    """
+    rows is a list of lists containing tuples, which
+    represent the columns/cells in each rows.
+    EX
+    rows = [[('row 1:column1',1)],[('row2:column1',1)]]
+    """
+    
+    def __init__(self, rows, src, subs, **kw):
+        apply(ST.StructuredTextDocument.__init__,(self,subs),kw)
+        self._rows = []
+        for row in rows:
+            if row:
+                self._rows.append(StructuredTextRow(row,kw))
+    
+    def getRows(self):
+        return [self._rows]
+    
+    def _getRows(self):
+        return self.getRows()
+    
+    def getColorizableTexts(self):
+        """
+        return a tuple where each item is a column/cell's
+        contents. The tuple, result, will be of this format.
+        ("r1 col1", "r1=col2", "r2 col1", "r2 col2")
+        """
+        
+        #result = ()
+        result = []
+        for row in self._rows:
+            for column in row.getColumns()[0]:
+                #result = result[:] + (column.getColorizableTexts(),)
+                result.append(column.getColorizableTexts()[0])
+        return result
+    
+    def setColorizableTexts(self,texts):
+        """
+        texts is going to a tuple where each item is the
+        result of being mapped to the colortext function.
+        Need to insert the results appropriately into the
+        individual columns/cells
+        """
+        for row_index in range(len(self._rows)):
+            for column_index in range(len(self._rows[row_index]._columns)):
+                self._rows[row_index]._columns[column_index].setColorizableTexts((texts[0],))
+                texts = texts[1:]
+        
+    def _getColorizableTexts(self):
+        return self.getColorizableTexts()
+    
+    def _setColorizableTexts(self):
+        return self.setColorizableTexts()
+    
+# StructuredTextRow holds StructuredTextColumns
+class StructuredTextRow(ST.StructuredTextDocument):
+    
+    def __init__(self,row,kw):
+        """
+        row is a list of tuples, where each tuple is
+        the raw text for a cell/column and the span
+        of that cell/column". 
+        EX 
+        [('this is column one',1), ('this is column two',1)]
+        """
+        
+        apply(ST.StructuredTextDocument.__init__,(self,[]),kw)
+        self._columns = []
+        for column in row:            
+            self._columns.append(StructuredTextColumn(column[0],column[1],kw))
+    def getColumns(self):
+        return [self._columns]
+
+    def _getColumns(self):
+        return [self._columns]
+    
+# this holds the raw text of a table cell
+class StructuredTextColumn(ST.StructuredTextParagraph):
+    """
+    StructuredTextColumn is a cell/column in a table.
+    This contains the actual text of a column and is
+    thus a StructuredTextParagraph. A StructuredTextColumn
+    also holds the span of its column
+    """
+    
+    def __init__(self,text,span,kw):
+        apply(ST.StructuredTextParagraph.__init__,(self,text,[]),kw)
+        self._span = span
+    
+    def getSpan(self):
+        return self._span
+    
+    def _getSpan(self):
+        return self._span
+    
+class StructuredTextMarkup(STDOM.Element):
+    
+    def __init__(self, v, **kw):
+       self._value=v
+       self._attributes=kw.keys()
+       for k, v in kw.items(): setattr(self, k, v)
+
+    def getChildren(self, type=type, lt=type([])):
+       v=self._value
+       if type(v) is not lt: v=[v]
+       return v
+
+    def getColorizableTexts(self): return self._value,
+    def setColorizableTexts(self, v): self._value=v[0]
+
+    def __repr__(self):
+       return '%s(%s)' % (self.__class__.__name__, `self._value`)
+
+class StructuredTextLiteral(StructuredTextMarkup):
+    def getColorizableTexts(self): return ()
+    def setColorizableTexts(self, v): pass
+
+class StructuredTextEmphasis(StructuredTextMarkup): pass
+
+class StructuredTextStrong(StructuredTextMarkup): pass
+
+class StructuredTextInnerLink(StructuredTextMarkup): pass
+
+class StructuredTextNamedLink(StructuredTextMarkup): pass
+
+class StructuredTextUnderline(StructuredTextMarkup): pass
+
+class StructuredTextLink(StructuredTextMarkup):
+    "A simple hyperlink"
+
+class DocumentClass:    
+    """
+    Class instance calls [ex.=> x()] require a structured text
+    structure. Doc will then parse each paragraph in the structure
+    and will find the special structures within each paragraph.
+    Each special structure will be stored as an instance. Special
+    structures within another special structure are stored within
+    the 'top' structure
+    EX : '-underline this-' => would be turned into an underline
+    instance. '-underline **this**' would be stored as an underline
+    instance with a strong instance stored in its string
+    """
+
+    paragraph_types  = [
+        'doc_bullet',
+        'doc_numbered',
+        'doc_description',
+        'doc_header',
+        'doc_table',
+        ]
+
+    text_types = [
+        'doc_href',
+        'doc_strong',
+        'doc_emphasize',
+        'doc_literal',
+        'doc_inner_link',
+        'doc_named_link',
+        'doc_underline',
+        ]
+
+    def __call__(self, doc):
+        if type(doc) is type(''):
+           doc=ST.StructuredText(doc)
+           doc.setSubparagraphs(self.color_paragraphs(
+              doc.getSubparagraphs()))
+        else:
+           doc=ST.StructuredTextDocument(self.color_paragraphs(
+              doc.getSubparagraphs()))
+        return doc
+
+    def parse(self, raw_string, text_type,
+              type=type, st=type(''), lt=type([])):
+
+       """
+       Parse accepts a raw_string, an expr to test the raw_string,
+       and the raw_string's subparagraphs.
+       
+       Parse will continue to search through raw_string until 
+       all instances of expr in raw_string are found. 
+       
+       If no instances of expr are found, raw_string is returned.
+       Otherwise a list of substrings and instances is returned
+       """
+
+       tmp = []    # the list to be returned if raw_string is split
+       append=tmp.append
+
+       if type(text_type) is st: text_type=getattr(self, text_type)
+
+       while 1:
+          t = text_type(raw_string)
+          if not t: break
+          #an instance of expr was found
+          t, start, end    = t
+
+          if start: append(raw_string[0:start])
+
+          tt=type(t)
+          if tt is st:
+             # if we get a string back, add it to text to be parsed
+             raw_string = t+raw_string[end:len(raw_string)]
+          else:
+             if tt is lt:
+                # is we get a list, append it's elements
+                tmp[len(tmp):]=t
+             else:
+                # normal case, an object
+                append(t)
+             raw_string = raw_string[end:len(raw_string)]
+
+       if not tmp: return raw_string # nothing found
+       
+       if raw_string: append(raw_string)
+       elif len(tmp)==1: return tmp[0]
+       
+       return tmp
+
+
+    def color_text(self, str, types=None):
+       """Search the paragraph for each special structure
+       """
+       if types is None: types=self.text_types
+
+       for text_type in types:
+
+          if type(str) is StringType:
+             str = self.parse(str, text_type)
+          elif type(str) is ListType:
+             r=[]; a=r.append
+             for s in str:
+                if type(s) is StringType:
+                    s=self.parse(s, text_type)
+                    if type(s) is ListType: r[len(r):]=s
+                    else: a(s)
+                else:
+                    s.setColorizableTexts(
+                       map(self.color_text,
+                           s.getColorizableTexts()
+                           ))
+                    a(s)
+             str=r
+          else:
+             r=[]; a=r.append; color=self.color_text
+             for s in str.getColorizableTexts():
+                color(s, (text_type,))
+                a(s)
+                
+             str.setColorizableTexts(r)
+
+       return str
+
+    def color_paragraphs(self, raw_paragraphs,
+                           type=type, sequence_types=(type([]), type(())),
+                           st=type('')):
+       result=[]
+       for paragraph in raw_paragraphs:
+          
+          if paragraph.getNodeName() != 'StructuredTextParagraph':
+             result.append(paragraph)
+             continue
+          
+          for pt in self.paragraph_types:
+             if type(pt) is st:
+                # grab the corresponding function
+                pt=getattr(self, pt)
+             # evaluate the paragraph
+             r=pt(paragraph)
+             if r:
+                if type(r) not in sequence_types:
+                    r=r,
+                new_paragraphs=r
+                for paragraph in new_paragraphs:
+                    paragraph.setSubparagraphs(self.color_paragraphs(paragraph.getSubparagraphs()))
+                break
+          else:
+             new_paragraphs=ST.StructuredTextParagraph(paragraph.getColorizableTexts()[0],
+                                                          self.color_paragraphs(paragraph.getSubparagraphs()),
+                                                          indent=paragraph.indent),
+          # color the inline StructuredText types
+          # for each StructuredTextParagraph
+          for paragraph in new_paragraphs:
+             paragraph.setColorizableTexts(
+                map(self.color_text,
+                    paragraph.getColorizableTexts()
+                    ))
+             result.append(paragraph)
+
+       return result
+    
+    def doc_table(self,paragraph, expr = re.compile('(\s*)([||]+)').match):
+        text    = paragraph.getColorizableTexts()[0]
+        m       = expr(text)
+        
+        if not (m):
+            return None
+        rows = []
+    
+        # initial split
+        for row in split(text,"\n"):
+            rows.append(row)    
+    
+        # clean up the rows
+        for index in range(len(rows)):
+            tmp = []
+            rows[index] = strip(rows[index])
+            l = len(rows[index])-2
+            result = split(rows[index][:l],"||")
+            for text in result:
+                if text:
+                    tmp.append(text)
+                    tmp.append('')
+                else:
+                    tmp.append(text)
+            rows[index] = tmp
+        # remove trailing '''s
+        for index in range(len(rows)):
+            l = len(rows[index])-1
+            rows[index] = rows[index][:l]
+        
+        result = []
+        for row in rows:
+            cspan   = 0
+            tmp     = []
+            for item in row:
+                if item:
+                    tmp.append(item,cspan)
+                    cspan = 0
+                else:
+                    cspan = cspan + 1
+            result.append(tmp)
+        
+        subs = paragraph.getSubparagraphs()
+        indent=paragraph.indent
+        return StructuredTextTable(result,text,subs,indent=paragraph.indent)
+            
+    def doc_bullet(self, paragraph, expr = re.compile('\s*[-*o]\s+').match):
+        top=paragraph.getColorizableTexts()[0]
+        m=expr(top)
+
+        if not m:
+            return None
+            
+        subs=paragraph.getSubparagraphs()
+        if top[-2:]=='::':
+           subs=[StructuredTextExample(subs)]
+           top=top[:-1]
+        return StructuredTextBullet(top[m.span()[1]:], subs,
+                                     indent=paragraph.indent,
+                                     bullet=top[:m.span()[1]]
+                                     )
+
+    def doc_numbered(
+        self, paragraph,
+        expr = re.compile('(\s*[a-zA-Z]+\.)|(\s*[0-9]+\.)|(\s*[0-9]+\s+)').match):
+        
+        # This is the old expression. It had a nasty habit
+        # of grabbing paragraphs that began with a single
+        # letter word even if there was no following period.
+        
+        #expr = re.compile('\s*'
+        #                   '(([a-zA-Z]|[0-9]+|[ivxlcdmIVXLCDM]+)\.)*'
+        #                   '([a-zA-Z]|[0-9]+|[ivxlcdmIVXLCDM]+)\.?'
+        #                   '\s+').match):
+        
+        top=paragraph.getColorizableTexts()[0]
+        m=expr(top)
+        if not m: return None
+        subs=paragraph.getSubparagraphs()
+        if top[-2:]=='::':
+           subs=[StructuredTextExample(subs)]
+           top=top[:-1]
+        return StructuredTextNumbered(top[m.span()[1]:], subs,
+                                        indent=paragraph.indent,
+                                        number=top[:m.span()[1]])
+
+    def doc_description(
+        self, paragraph,
+        delim = re.compile('\s+--\s+').search,
+        nb=re.compile(r'[^\0- ]').search,
+        ):
+
+        top=paragraph.getColorizableTexts()[0]
+        d=delim(top)
+        if not d: return None
+        start, end = d.span()
+        title=top[:start]
+        if find(title, '\n') >= 0: return None
+        if not nb(title): return None
+        d=top[start:end]
+        top=top[end:]
+
+        subs=paragraph.getSubparagraphs()
+        if top[-2:]=='::':
+           subs=[StructuredTextExample(subs)]
+           top=top[:-1]
+
+        return StructuredTextDescription(
+           title, top, subs,
+           indent=paragraph.indent,
+           delim=d)
+
+    def doc_header(self, paragraph,
+                    expr    = re.compile('[ a-zA-Z0-9.:/,-_*<>\?\'\"]+').match
+                    ):
+        subs=paragraph.getSubparagraphs()
+        if not subs: return None
+        top=paragraph.getColorizableTexts()[0]
+        if not strip(top): return None
+        if top[-2:]=='::':
+           subs=StructuredTextExample(subs)
+           if strip(top)=='::': return subs
+           return ST.StructuredTextParagraph(top[:-1],
+                                             [subs],
+                                             indent=paragraph.indent,
+                                             level=paragraph.level)
+
+        if find(top,'\n') >= 0: return None
+        return StructuredTextSection(top, subs, indent=paragraph.indent, level=paragraph.level)
+
+    def doc_literal(
+        self, s,
+        expr=re.compile(
+          "(?:\s|^)'"                                                  # open
+          "([^ \t\n\r\f\v']|[^ \t\n\r\f\v'][^\n']*[^ \t\n\r\f\v'])" # contents
+          "'(?:\s|[,.;:!?]|$)"                                        # close
+          ).search):
+        
+        r=expr(s)
+        if r:
+           start, end = r.span(1)
+           return (StructuredTextLiteral(s[start:end]), start-1, end+1)
+        else:
+           return None
+
+    def doc_emphasize(
+        self, s,
+        expr = re.compile('\s*\*([ \na-zA-Z0-9.:/;,\'\"\?]+)\*(?!\*|-)').search
+        ):
+
+        r=expr(s)
+        if r:
+           start, end = r.span(1)
+           return (StructuredTextEmphasis(s[start:end]), start-1, end+1)
+        else:
+           return None
+    
+    def doc_inner_link(self,
+                       s,
+                       expr1 = re.compile("\.\.\s*").search,
+                       expr2 = re.compile("\[[a-zA-Z0-9]+\]").search):
+        
+        # make sure we dont grab a named link
+        if expr2(s) and expr1(s):
+            start1,end1 = expr1(s).span()
+            start2,end2 = expr2(s).span()
+            if end1 == start2:
+                # uh-oh, looks like a named link
+                return None
+            else:
+                # the .. is somewhere else, ignore it
+                return (StructuredTextInnerLink(s[start2+1,end2-1],start2,end2))
+            return None
+        elif expr2(s) and not expr1(s):
+            start,end = expr2(s).span()
+            return (StructuredTextInnerLink(s[start+1:end-1]),start,end)
+        return None
+    
+    def doc_named_link(self,
+                       s,
+                       expr=re.compile("(\.\.\s)(\[[a-zA-Z0-9]+\])").search):
+        
+        result = expr(s)
+        if result:
+            start,end   = result.span(2)
+            a,b         = result.span(1)
+            str         = strip(s[a:b]) + s[start:end]
+            str         = s[start+1:end-1]
+            st,en       = result.span()
+            return (StructuredTextNamedLink(str),st,en)
+            #return (StructuredTextNamedLink(s[st:en]),st,en)
+        return None
+    
+    def doc_underline(self,
+                      s,
+                      expr=re.compile("\_([a-zA-Z0-9\s\.,\?\/]+)\_").search):
+        
+        result = expr(s)
+        if result:
+            start,end = result.span(1)
+            st,e = result.span()
+            return (StructuredTextUnderline(s[start:end]),st,e)
+        else:
+            return None
+    
+    def doc_strong(self, 
+                   s,
+        expr = re.compile('\s*\*\*([ \na-zA-Z0-9.:/;\-,!\?\'\"]+)\*\*').search
+        ):
+
+        r=expr(s)
+        if r:
+           start, end = r.span(1)
+           return (StructuredTextStrong(s[start:end]), start-2, end+2)
+        else:
+           return None
+    
+    def doc_href(
+        
+        self, s,
+        expr1 = re.compile("(\"[ a-zA-Z0-9\n\-\.\,\;\(\)\/\:\/]+\")(:)([a-zA-Z0-9\:\/\.\~\-]+)([,]*\s*)").search,
+        expr2 = re.compile('(\"[ a-zA-Z0-9\n\-\.\:\;\(\)\/]+\")([,]+\s+)([a-zA-Z0-9\@\.\,\?\!\/\:\;\-\#]+)(\s*)').search):
+        
+        #expr1=re.compile('\"([ a-zA-Z0-9.:/;,\n\~\(\)\-]+)\"'
+        #                  ':'
+        #                  '([a-zA-Z0-9.:/;,\n\~]+)(?=(\s+|\.|\!|\?))'
+        #                  ).search,
+        #expr2=re.compile('\"([ a-zA-Z0-9./:]+)\"'
+        #                  ',\s+'
+        #                  '([ a-zA-Z0-9@.:/;]+)(?=(\s+|\.|\!|\?))'
+        #                  ).search,
+        
+        punctuation = re.compile("[\,\.\?\!\;]+").match
+        r=expr1(s) or expr2(s)
+
+        if r:
+            # need to grab the href part and the
+            # beginning part
+                        
+            start,e = r.span(1)
+            name    = s[start:e]
+            name    = replace(name,'"','',2)
+            #start   = start + 1
+            st,end   = r.span(3)
+            if punctuation(s[end-1:end]):
+                end = end -1
+            link    = s[st:end]
+            #end     = end - 1                        
+            
+            # name is the href title, link is the target
+            # of the href
+            return (StructuredTextLink(name, href=link),
+                    start, end)
+            
+            #return (StructuredTextLink(s[start:end], href=s[start:end]),
+            #        start, end)
+        else:
+            return None
diff --git a/wxPython/samples/stxview/StructuredText/DocBookClass.py b/wxPython/samples/stxview/StructuredText/DocBookClass.py
new file mode 100644 (file)
index 0000000..b126878
--- /dev/null
@@ -0,0 +1,325 @@
+##############################################################################
+# 
+# Zope Public License (ZPL) Version 1.0
+# -------------------------------------
+# 
+# Copyright (c) Digital Creations.  All rights reserved.
+# 
+# This license has been certified as Open Source(tm).
+# 
+# Redistribution and use in source and binary forms, with or without
+# modification, are permitted provided that the following conditions are
+# met:
+# 
+# 1. Redistributions in source code must retain the above copyright
+#    notice, this list of conditions, and the following disclaimer.
+# 
+# 2. Redistributions in binary form must reproduce the above copyright
+#    notice, this list of conditions, and the following disclaimer in
+#    the documentation and/or other materials provided with the
+#    distribution.
+# 
+# 3. Digital Creations requests that attribution be given to Zope
+#    in any manner possible. Zope includes a "Powered by Zope"
+#    button that is installed by default. While it is not a license
+#    violation to remove this button, it is requested that the
+#    attribution remain. A significant investment has been put
+#    into Zope, and this effort will continue if the Zope community
+#    continues to grow. This is one way to assure that growth.
+# 
+# 4. All advertising materials and documentation mentioning
+#    features derived from or use of this software must display
+#    the following acknowledgement:
+# 
+#      "This product includes software developed by Digital Creations
+#      for use in the Z Object Publishing Environment
+#      (http://www.zope.org/)."
+# 
+#    In the event that the product being advertised includes an
+#    intact Zope distribution (with copyright and license included)
+#    then this clause is waived.
+# 
+# 5. Names associated with Zope or Digital Creations must not be used to
+#    endorse or promote products derived from this software without
+#    prior written permission from Digital Creations.
+# 
+# 6. Modified redistributions of any form whatsoever must retain
+#    the following acknowledgment:
+# 
+#      "This product includes software developed by Digital Creations
+#      for use in the Z Object Publishing Environment
+#      (http://www.zope.org/)."
+# 
+#    Intact (re-)distributions of any official Zope release do not
+#    require an external acknowledgement.
+# 
+# 7. Modifications are encouraged but must be packaged separately as
+#    patches to official Zope releases.  Distributions that do not
+#    clearly separate the patches from the original work must be clearly
+#    labeled as unofficial distributions.  Modifications which do not
+#    carry the name Zope may be packaged in any form, as long as they
+#    conform to all of the clauses above.
+# 
+# 
+# Disclaimer
+# 
+#   THIS SOFTWARE IS PROVIDED BY DIGITAL CREATIONS ``AS IS'' AND ANY
+#   EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+#   IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+#   PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL DIGITAL CREATIONS OR ITS
+#   CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+#   SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+#   LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
+#   USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+#   ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+#   OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
+#   OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+#   SUCH DAMAGE.
+# 
+# 
+# This software consists of contributions made by Digital Creations and
+# many individuals on behalf of Digital Creations.  Specific
+# attributions are listed in the accompanying credits file.
+# 
+##############################################################################
+
+import string
+from string import join, split, find, lstrip
+
+class DocBookClass:
+
+    element_types={
+        '#text': '_text',
+        'StructuredTextDocument': 'document',
+        'StructuredTextParagraph': 'paragraph',
+        'StructuredTextExample': 'example',
+        'StructuredTextBullet': 'bullet',
+        'StructuredTextNumbered': 'numbered',
+        'StructuredTextDescription': 'description',
+        'StructuredTextDescriptionTitle': 'descriptionTitle',
+        'StructuredTextDescriptionBody': 'descriptionBody',
+        'StructuredTextSection': 'section',
+        'StructuredTextSectionTitle': 'sectionTitle',
+        'StructuredTextLiteral': 'literal',
+        'StructuredTextEmphasis': 'emphasis',
+        'StructuredTextStrong': 'strong',
+        'StructuredTextLink': 'link',
+        'StructuredTextXref': 'xref',
+        }        
+
+    def dispatch(self, doc, level, output):
+        getattr(self, self.element_types[doc.getNodeName()])(doc, level, output)
+        
+    def __call__(self, doc, level=1):
+        r=[]
+        self.dispatch(doc, level-1, r.append)
+        return join(r,'')
+
+    def _text(self, doc, level, output):
+        if doc.getNodeName() == 'StructuredTextLiteral':
+            output(doc.getNodeValue())
+        else:
+            output(lstrip(doc.getNodeValue()))            
+
+    def document(self, doc, level, output):
+        output('<!DOCTYPE book PUBLIC "-//OASIS//DTD DocBook V3.1//EN">\n')
+        output('<book>\n')
+        children=doc.getChildNodes()
+        if (children and
+             children[0].getNodeName() == 'StructuredTextSection'):
+            output('<title>%s</title>' % children[0].getChildNodes()[0].getNodeValue())
+        for c in children:
+            getattr(self, self.element_types[c.getNodeName()])(c, level, output)
+        output('</book>\n')
+
+    def section(self, doc, level, output):
+        output('\n<sect%s>\n' % (level + 1))
+        children=doc.getChildNodes()
+        for c in children:
+            getattr(self, self.element_types[c.getNodeName()])(c, level+1, output)
+        output('\n</sect%s>\n' % (level + 1))
+        
+    def sectionTitle(self, doc, level, output):
+        output('<title>')
+        for c in doc.getChildNodes():
+            getattr(self, self.element_types[c.getNodeName()])(c, level, output)
+        output('</title>\n')
+
+    def description(self, doc, level, output):
+        p=doc.getPreviousSibling()
+        if p is None or  p.getNodeName() is not doc.getNodeName():            
+            output('<variablelist>\n')
+        for c in doc.getChildNodes():
+            getattr(self, self.element_types[c.getNodeName()])(c, level, output)
+        n=doc.getNextSibling()
+        if n is None or n.getNodeName() is not doc.getNodeName():            
+            output('</variablelist>\n')
+        
+    def descriptionTitle(self, doc, level, output):
+        output('<varlistentry><term>\n')
+        for c in doc.getChildNodes():
+            getattr(self, self.element_types[c.getNodeName()])(c, level, output)
+        output('</term>\n')
+        
+    def descriptionBody(self, doc, level, output):
+        output('<listitem><para>\n')
+        for c in doc.getChildNodes():
+            getattr(self, self.element_types[c.getNodeName()])(c, level, output)
+        output('</para></listitem>\n')
+        output('</varlistentry>\n')
+
+    def bullet(self, doc, level, output):
+        p=doc.getPreviousSibling()
+        if p is None or p.getNodeName() is not doc.getNodeName():            
+            output('<itemizedlist>\n')
+        output('<listitem><para>\n')
+
+        for c in doc.getChildNodes():
+            getattr(self, self.element_types[c.getNodeName()])(c, level, output)
+        n=doc.getNextSibling()
+        output('</para></listitem>\n')
+        if n is None or n.getNodeName() is not doc.getNodeName():            
+            output('</itemizedlist>\n')
+
+    def numbered(self, doc, level, output):
+        p=doc.getPreviousSibling()
+        if p is None or p.getNodeName() is not doc.getNodeName():            
+            output('<orderedlist>\n')
+        output('<listitem><para>\n')
+        for c in doc.getChildNodes():
+            getattr(self, self.element_types[c.getNodeName()])(c, level, output)
+        n=doc.getNextSibling()
+        output('</para></listitem>\n')
+        if n is None or n.getNodeName() is not doc.getNodeName():            
+            output('</orderedlist>\n')
+
+    def example(self, doc, level, output):
+        i=0
+        for c in doc.getChildNodes():
+            if i==0:
+                output('<programlisting>\n<![CDATA[\n')
+                ##
+                ## eek.  A ']]>' in your body will break this...
+                ##
+                output(prestrip(c.getNodeValue()))
+                output('\n]]></programlisting>\n')
+            else:
+                getattr(self, self.element_types[c.getNodeName()])(
+                    c, level, output)
+
+    def paragraph(self, doc, level, output):
+        
+        output('<para>\n\n')        
+        for c in doc.getChildNodes():
+            getattr(self, self.element_types[c.getNodeName()])(
+                c, level, output)
+        output('</para>\n\n')
+                
+    def link(self, doc, level, output):
+#        output('<link linkend="%s">' % doc.href)
+        for c in doc.getChildNodes():
+            getattr(self, self.element_types[c.getNodeName()])(c, level, output)
+#        output('</link>')
+
+    def emphasis(self, doc, level, output):
+        output('<emphasis>')
+        for c in doc.getChildNodes():
+            getattr(self, self.element_types[c.getNodeName()])(c, level, output)
+        output('</emphasis> ')
+
+    def literal(self, doc, level, output):
+        output('<literal>')
+        for c in doc.getChildNodes():
+            output(c.getNodeValue())
+        output('</literal>')
+
+    def strong(self, doc, level, output):
+        output('<emphasis>')
+        for c in doc.getChildNodes():
+            getattr(self, self.element_types[c.getNodeName()])(c, level, output)
+        output('</emphasis>')
+
+    def xref(self, doc, level, output):
+        output('<xref linkend="%s">' % doc.getNodeValue())
+
+def prestrip(v):
+    v=string.replace(v, '\r\n', '\n')
+    v=string.replace(v, '\r', '\n')
+    v=string.replace(v, '\t', '          ')
+    lines=string.split(v, '\n')
+    indent=len(lines[0])
+    for line in lines:
+        if not len(line): continue
+        i=len(line)-len(string.lstrip(line))
+        if i < indent:
+            indent=i
+    nlines=[]
+    for line in lines:
+        nlines.append(line[indent:])
+    return string.join(nlines, '\r\n')
+
+
+class DocBookChapter(DocBookClass):
+
+    def document(self, doc, level, output):
+        output('<chapter>\n')
+        children=doc.getChildNodes()
+        if (children and
+             children[0].getNodeName() == 'StructuredTextSection'):
+            output('<title>%s</title>' % children[0].getChildNodes()[0].getNodeValue())
+        for c in children[0].getChildNodes()[1:]:
+            getattr(self, self.element_types[c.getNodeName()])(c, level, output)
+        output('</chapter>\n')
+
+ets = DocBookClass.element_types
+ets.update({'StructuredTextImage': 'image'})        
+
+class DocBookChapterWithFigures(DocBookChapter):
+
+     element_types = ets
+
+     def image(self, doc, level, output):
+         if hasattr(doc, 'key'):
+             output('<figure id="%s"><title>%s</title>\n' % (doc.key, doc.getNodeValue()) )
+         else:
+             output('<figure><title>%s</title>\n' % doc.getNodeValue())
+##          for c in doc.getChildNodes():
+##                getattr(self, self.element_types[c.getNodeName()])(c, level, output)
+         output('<graphic fileref="%s"></graphic>\n</figure>\n' % doc.href)     
+
+class DocBookArticle(DocBookClass):
+
+    def document(self, doc, level, output):
+        output('<!DOCTYPE article PUBLIC "-//OASIS//DTD DocBook V3.1//EN">\n')
+        output('<article>\n')
+        children=doc.getChildNodes()
+        if (children and
+             children[0].getNodeName() == 'StructuredTextSection'):
+            output('<artheader>\n<title>%s</title>\n</artheader>\n' %
+                     children[0].getChildNodes()[0].getNodeValue())
+        for c in children:
+            getattr(self, self.element_types[c.getNodeName()])(c, level, output)
+        output('</article>\n')
+
+
+class DocBookBook:
+
+    def __init__(self, title=''):
+        self.title = title
+        self.chapters = []
+
+    def addChapter(self, chapter):
+        self.chapters.append(chapter)
+
+    def read(self):
+        out = '<!DOCTYPE book PUBLIC "-//OASIS//DTD DocBook V3.1//EN">\n<book>\n'
+        out = out + '<title>%s</title>\n' % self.title
+        for chapter in self.chapters:
+            out = out + chapter + '\n</book>\n'
+
+        return out
+
+    def __str__(self):
+        return self.read()
+            
+
diff --git a/wxPython/samples/stxview/StructuredText/DocumentClass.py b/wxPython/samples/stxview/StructuredText/DocumentClass.py
new file mode 100644 (file)
index 0000000..ec6dc40
--- /dev/null
@@ -0,0 +1,777 @@
+##############################################################################
+# 
+# Zope Public License (ZPL) Version 1.0
+# -------------------------------------
+# 
+# Copyright (c) Digital Creations.  All rights reserved.
+# 
+# This license has been certified as Open Source(tm).
+# 
+# Redistribution and use in source and binary forms, with or without
+# modification, are permitted provided that the following conditions are
+# met:
+# 
+# 1. Redistributions in source code must retain the above copyright
+#    notice, this list of conditions, and the following disclaimer.
+# 
+# 2. Redistributions in binary form must reproduce the above copyright
+#    notice, this list of conditions, and the following disclaimer in
+#    the documentation and/or other materials provided with the
+#    distribution.
+# 
+# 3. Digital Creations requests that attribution be given to Zope
+#    in any manner possible. Zope includes a "Powered by Zope"
+#    button that is installed by default. While it is not a license
+#    violation to remove this button, it is requested that the
+#    attribution remain. A significant investment has been put
+#    into Zope, and this effort will continue if the Zope community
+#    continues to grow. This is one way to assure that growth.
+# 
+# 4. All advertising materials and documentation mentioning
+#    features derived from or use of this software must display
+#    the following acknowledgement:
+# 
+#       "This product includes software developed by Digital Creations
+#       for use in the Z Object Publishing Environment
+#       (http://www.zope.org/)."
+# 
+#    In the event that the product being advertised includes an
+#    intact Zope distribution (with copyright and license included)
+#    then this clause is waived.
+# 
+# 5. Names associated with Zope or Digital Creations must not be used to
+#    endorse or promote products derived from this software without
+#    prior written permission from Digital Creations.
+# 
+# 6. Modified redistributions of any form whatsoever must retain
+#    the following acknowledgment:
+# 
+#       "This product includes software developed by Digital Creations
+#       for use in the Z Object Publishing Environment
+#       (http://www.zope.org/)."
+# 
+#    Intact (re-)distributions of any official Zope release do not
+#    require an external acknowledgement.
+# 
+# 7. Modifications are encouraged but must be packaged separately as
+#    patches to official Zope releases.  Distributions that do not
+#    clearly separate the patches from the original work must be clearly
+#    labeled as unofficial distributions.  Modifications which do not
+#    carry the name Zope may be packaged in any form, as long as they
+#    conform to all of the clauses above.
+# 
+# 
+# Disclaimer
+# 
+#    THIS SOFTWARE IS PROVIDED BY DIGITAL CREATIONS ``AS IS'' AND ANY
+#    EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+#    IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+#    PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL DIGITAL CREATIONS OR ITS
+#    CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+#    SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+#    LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
+#    USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+#    ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+#    OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
+#    OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+#    SUCH DAMAGE.
+# 
+# 
+# This software consists of contributions made by Digital Creations and
+# many individuals on behalf of Digital Creations.  Specific
+# attributions are listed in the accompanying credits file.
+# 
+##############################################################################
+
+import re, ST, STDOM
+from string import split, join, replace, expandtabs, strip, find, rstrip
+
+StringType=type('')
+ListType=type([])
+
+class StructuredTextExample(ST.StructuredTextParagraph):
+    """Represents a section of document with literal text, as for examples"""
+
+    def __init__(self, subs, **kw):
+       t=[]; a=t.append
+       for s in subs: a(s.getNodeValue())
+       apply(ST.StructuredTextParagraph.__init__,
+             (self, join(t,'\n\n'), ()),
+             kw)
+
+    def getColorizableTexts(self): return ()
+    def setColorizableTexts(self, src): pass # never color examples
+
+class StructuredTextBullet(ST.StructuredTextParagraph):
+    """Represents a section of a document with a title and a body"""
+
+class StructuredTextNumbered(ST.StructuredTextParagraph):
+    """Represents a section of a document with a title and a body"""
+
+class StructuredTextDescriptionTitle(ST.StructuredTextParagraph):
+    """Represents a section of a document with a title and a body"""
+
+class StructuredTextDescriptionBody(ST.StructuredTextParagraph):
+    """Represents a section of a document with a title and a body"""
+
+class StructuredTextDescription(ST.StructuredTextParagraph):
+    """Represents a section of a document with a title and a body"""
+    
+    def __init__(self, title, src, subs, **kw):
+       apply(ST.StructuredTextParagraph.__init__, (self, src, subs), kw)
+       self._title=title
+
+    def getColorizableTexts(self): return self._title, self._src
+    def setColorizableTexts(self, src): self._title, self._src = src
+
+    def getChildren(self):
+       return (StructuredTextDescriptionTitle(self._title),
+               StructuredTextDescriptionBody(self._src, self._subs))
+
+class StructuredTextSectionTitle(ST.StructuredTextParagraph):
+    """Represents a section of a document with a title and a body"""
+
+class StructuredTextSection(ST.StructuredTextParagraph):
+    """Represents a section of a document with a title and a body"""
+    def __init__(self, src, subs=None, **kw):
+       apply(ST.StructuredTextParagraph.__init__,
+             (self, StructuredTextSectionTitle(src), subs),
+             kw)
+
+# a StructuredTextTable holds StructuredTextRows
+class StructuredTextTable(ST.StructuredTextDocument):
+    """
+    rows is a list of lists containing tuples, which
+    represent the columns/cells in each rows.
+    EX
+    rows = [[('row 1:column1',1)],[('row2:column1',1)]]
+    """
+    
+    def __init__(self, rows, src, subs, **kw):
+        apply(ST.StructuredTextDocument.__init__,(self,subs),kw)
+        self._rows = []
+        for row in rows:
+            if row:
+                self._rows.append(StructuredTextRow(row,kw))
+    
+    def getRows(self):
+        return [self._rows]
+    
+    def _getRows(self):
+        return self.getRows()
+    
+    def getColumns(self):
+        result = []
+        for row in self._rows:
+            result.append(row.getColumns())
+        return result
+        
+    def _getColumns(self):
+        return self.getColumns()
+    
+    def setColumns(self,columns):
+        for index in range(len(self._rows)):
+            self._rows[index].setColumns(columns[index])
+            
+    def _setColumns(self,columns):
+        return self.setColumns(columns)
+             
+    def getColorizableTexts(self):
+        """
+        return a tuple where each item is a column/cell's
+        contents. The tuple, result, will be of this format.
+        ("r1 col1", "r1=col2", "r2 col1", "r2 col2")
+        """
+        
+        result = []
+        for row in self._rows:
+            for column in row.getColumns()[0]:
+                result.append(column.getColorizableTexts()[0])
+        return result
+    
+    def setColorizableTexts(self,texts):
+        """
+        texts is going to a tuple where each item is the
+        result of being mapped to the colortext function.
+        Need to insert the results appropriately into the
+        individual columns/cells
+        """
+        for row_index in range(len(self._rows)):
+            for column_index in range(len(self._rows[row_index]._columns)):
+                self._rows[row_index]._columns[column_index].setColorizableTexts((texts[0],))
+                texts = texts[1:]
+        
+    def _getColorizableTexts(self):
+        return self.getColorizableTexts()
+    
+    def _setColorizableTexts(self):
+        return self.setColorizableTexts()
+    
+# StructuredTextRow holds StructuredTextColumns
+class StructuredTextRow(ST.StructuredTextDocument):
+    
+    def __init__(self,row,kw):
+        """
+        row is a list of tuples, where each tuple is
+        the raw text for a cell/column and the span
+        of that cell/column". 
+        EX 
+        [('this is column one',1), ('this is column two',1)]
+        """
+        
+        apply(ST.StructuredTextDocument.__init__,(self,[]),kw)
+        self._columns = []
+        for column in row:            
+            self._columns.append(StructuredTextColumn(column[0],column[1],kw))
+
+    def getColumns(self):
+        return [self._columns]
+
+    def _getColumns(self):
+        return [self._columns]
+    
+    def setColumns(self,columns):
+        self._columns = columns
+        
+    def _setColumns(self,columns):
+        return self.setColumns(columns)
+
+# this holds the text of a table cell
+class StructuredTextColumn(ST.StructuredTextParagraph):
+    """
+    StructuredTextColumn is a cell/column in a table.
+    A cell can hold multiple paragraphs. The cell
+    is either classified as a StructuredTextTableHeader
+    or StructuredTextTableData.
+    """
+    
+    def __init__(self,text,span,kw):
+        # print "StructuredTextColumn", text, span
+        apply(ST.StructuredTextParagraph.__init__,(self,text,[]),kw)
+        self._span = span
+    
+    def getSpan(self):
+        return self._span
+    
+    def _getSpan(self):
+        return self._span
+
+class StructuredTextTableHeader(ST.StructuredTextDocument): pass
+
+class StructuredTextTableData(ST.StructuredTextDocument): pass
+
+class StructuredTextMarkup(STDOM.Element):
+    
+    def __init__(self, v, **kw):
+       self._value=v
+       self._attributes=kw.keys()
+       for k, v in kw.items(): setattr(self, k, v)
+
+    def getChildren(self, type=type, lt=type([])):
+       v=self._value
+       if type(v) is not lt: v=[v]
+       return v
+
+    def getColorizableTexts(self): return self._value,
+    def setColorizableTexts(self, v): self._value=v[0]
+
+    def __repr__(self):
+       return '%s(%s)' % (self.__class__.__name__, `self._value`)
+
+class StructuredTextLiteral(StructuredTextMarkup):
+    def getColorizableTexts(self): return ()
+    def setColorizableTexts(self, v): pass
+
+class StructuredTextEmphasis(StructuredTextMarkup): pass
+
+class StructuredTextStrong(StructuredTextMarkup): pass
+
+class StructuredTextInnerLink(StructuredTextMarkup): pass
+
+class StructuredTextNamedLink(StructuredTextMarkup): pass
+
+class StructuredTextUnderline(StructuredTextMarkup): pass
+
+class StructuredTextSGML(StructuredTextMarkup): pass
+
+class StructuredTextLink(StructuredTextMarkup): pass    
+
+class DocumentClass:    
+    """
+    Class instance calls [ex.=> x()] require a structured text
+    structure. Doc will then parse each paragraph in the structure
+    and will find the special structures within each paragraph.
+    Each special structure will be stored as an instance. Special
+    structures within another special structure are stored within
+    the 'top' structure
+    EX : '-underline this-' => would be turned into an underline
+    instance. '-underline **this**' would be stored as an underline
+    instance with a strong instance stored in its string
+    """
+    
+    #'doc_table',
+    paragraph_types  = [
+        'doc_bullet',
+        'doc_numbered',
+        'doc_description',
+        'doc_header',
+        'doc_table',
+        ]
+    
+    #'doc_inner_link',
+    #'doc_named_link',
+    #'doc_underline',
+    text_types = [
+        'doc_href',
+        'doc_strong',
+        'doc_emphasize',
+        'doc_literal',
+        'doc_sgml'
+        ]
+
+    def __call__(self, doc):
+        if type(doc) is type(''):
+           doc=ST.StructuredText(doc)
+           doc.setSubparagraphs(self.color_paragraphs(
+              doc.getSubparagraphs()))
+        else:
+           doc=ST.StructuredTextDocument(self.color_paragraphs(
+              doc.getSubparagraphs()))
+        return doc
+
+    def parse(self, raw_string, text_type,
+              type=type, st=type(''), lt=type([])):
+
+       """
+       Parse accepts a raw_string, an expr to test the raw_string,
+       and the raw_string's subparagraphs.
+       
+       Parse will continue to search through raw_string until 
+       all instances of expr in raw_string are found. 
+       
+       If no instances of expr are found, raw_string is returned.
+       Otherwise a list of substrings and instances is returned
+       """
+
+       tmp = []    # the list to be returned if raw_string is split
+       append=tmp.append
+
+       if type(text_type) is st: text_type=getattr(self, text_type)
+
+       while 1:
+          t = text_type(raw_string)
+          if not t: break
+          #an instance of expr was found
+          t, start, end    = t
+
+          if start: append(raw_string[0:start])
+
+          tt=type(t)
+          if tt is st:
+             # if we get a string back, add it to text to be parsed
+             raw_string = t+raw_string[end:len(raw_string)]
+          else:
+             if tt is lt:
+                # is we get a list, append it's elements
+                tmp[len(tmp):]=t
+             else:
+                # normal case, an object
+                append(t)
+             raw_string = raw_string[end:len(raw_string)]
+
+       if not tmp: return raw_string # nothing found
+       
+       if raw_string: append(raw_string)
+       elif len(tmp)==1: return tmp[0]
+       
+       return tmp
+
+
+    def color_text(self, str, types=None):
+       """Search the paragraph for each special structure
+       """
+       if types is None: types=self.text_types
+
+       for text_type in types:
+
+          if type(str) is StringType:
+             str = self.parse(str, text_type)
+          elif type(str) is ListType:
+             r=[]; a=r.append
+             for s in str:
+                if type(s) is StringType:
+                    s=self.parse(s, text_type)
+                    if type(s) is ListType: r[len(r):]=s
+                    else: a(s)
+                else:
+                    s.setColorizableTexts(
+                       map(self.color_text,
+                           s.getColorizableTexts()
+                           ))
+                    a(s)
+             str=r
+          else:
+             r=[]; a=r.append; color=self.color_text
+             for s in str.getColorizableTexts():
+                color(s, (text_type,))
+                a(s)
+                
+             str.setColorizableTexts(r)
+
+       return str
+
+    def color_paragraphs(self, raw_paragraphs,
+                           type=type, sequence_types=(type([]), type(())),
+                           st=type('')):
+       result=[]
+       for paragraph in raw_paragraphs:
+          #print type(paragraph)
+          if paragraph.getNodeName() != 'StructuredTextParagraph':
+             result.append(paragraph)
+             continue
+          
+          for pt in self.paragraph_types:
+             if type(pt) is st:
+                # grab the corresponding function
+                pt=getattr(self, pt)
+             # evaluate the paragraph
+             r=pt(paragraph)
+             if r:
+                if type(r) not in sequence_types:
+                    r=r,
+                new_paragraphs=r
+                for paragraph in new_paragraphs:
+                    paragraph.setSubparagraphs(self.color_paragraphs(paragraph.getSubparagraphs()))
+                break
+          else:
+             new_paragraphs=ST.StructuredTextParagraph(paragraph.getColorizableTexts()[0],
+                                                          self.color_paragraphs(paragraph.getSubparagraphs()),
+                                                          indent=paragraph.indent),
+        
+          # color the inline StructuredText types
+          # for each StructuredTextParagraph
+          for paragraph in new_paragraphs:
+             
+             if paragraph.getNodeName() is "StructuredTextTable":
+                #print "we have a table"
+                cells = paragraph.getColumns()
+                text = paragraph.getColorizableTexts()
+                text = map(ST.StructuredText,text)
+                text = map(self.__call__,text)
+                #for index in range(len(text)):
+                #    text[index].setColorizableTexts(map(self.color_text,text[index].getColorizableTexts()))
+                paragraph.setColorizableTexts(text)
+                        
+             paragraph.setColorizableTexts(
+                map(self.color_text,
+                    paragraph.getColorizableTexts()
+                    ))
+             result.append(paragraph)
+
+       return result
+    
+    def doc_table(self, paragraph, expr = re.compile('\s*\|[-]+\|').match):
+        text    = paragraph.getColorizableTexts()[0]
+        m       = expr(text)
+        
+        subs = paragraph.getSubparagraphs()
+        
+        if not (m):
+            return None
+        rows = []
+                                                                
+        rows = split(text,'\n')        
+        
+        spans   = []
+        ROWS    = []
+        COLS    = []
+    
+        TDdivider = re.compile("[\-]+").match
+        THdivider = re.compile("[\=]+").match
+    
+        # find where the column markers are located
+        col = re.compile('\|').search
+        text = strip(text)
+        rows = split(text,'\n')
+        for row in range(len(rows)):
+            rows[row] = strip(rows[row])
+    
+        for row in rows:
+            tmp = strip(row)
+            tmp = row[1:len(tmp)-1] # remove leading and trailing |
+            offset = 0
+            if col(tmp):
+                while col(tmp):
+                    start,end = col(tmp).span()
+                    if not start+offset in spans:
+                        spans.append(start + offset)
+                    COLS.append((tmp[0:start],start+offset))
+                    tmp = " " + tmp[end:]
+                    offset = offset + (start)
+            if not offset+len(tmp) in spans:
+                spans.append(offset+len(tmp))
+            COLS.append((tmp,offset+len(tmp)))
+            ROWS.append(COLS)
+            COLS = []
+    
+        spans.sort()
+    
+        ROWS = ROWS[1:len(ROWS)]        
+        
+        # find each column span
+        cols    = []
+        tmp     = []
+    
+        for row in ROWS:
+            for c in row:
+                tmp.append(c[1])
+            cols.append(tmp)
+            tmp = []
+    
+        cur = 1     # the current column span
+        tmp = []    
+        C   = []    # holds the span of each cell
+        for col in cols:
+            for span in spans:
+                if not span in col:
+                    cur = cur + 1
+                else:
+                    tmp.append(cur)
+                    cur = 1
+            C.append(tmp)
+            tmp = []
+        
+        # make rows contain the cell's text and the span
+        # of that cell
+        for index in range(len(C)):
+            for i in range(len(C[index])):
+                ROWS[index][i] = (ROWS[index][i][0],C[index][i])
+        rows = ROWS
+        
+        # now munge the table cells together
+        ROWS    = []
+        COLS    = []
+        for row in rows:
+            for index in range(len(row)):
+                if not COLS:
+                    COLS = range(len(row))
+                    for i in range(len(COLS)):
+                        COLS[i] = ["",1]
+                if TDdivider(row[index][0]) or THdivider(row[index][0]):
+                    ROWS.append(COLS)
+                    COLS = []
+                else:
+                    COLS[index][0] = COLS[index][0] + rstrip(row[index][0]) + "\n"
+                    COLS[index][1] = row[index][1]
+        return StructuredTextTable(ROWS,text,subs,indent=paragraph.indent)
+            
+    def doc_bullet(self, paragraph, expr = re.compile('\s*[-*o]\s+').match):
+        top=paragraph.getColorizableTexts()[0]
+        m=expr(top)
+
+        if not m:
+            return None
+            
+        subs=paragraph.getSubparagraphs()
+        if top[-2:]=='::':
+           subs=[StructuredTextExample(subs)]
+           top=top[:-1]
+        return StructuredTextBullet(top[m.span()[1]:], subs,
+                                     indent=paragraph.indent,
+                                     bullet=top[:m.span()[1]]
+                                     )
+
+    def doc_numbered(
+        self, paragraph,
+        expr = re.compile('(\s*[a-zA-Z]+\.)|(\s*[0-9]+\.)|(\s*[0-9]+\s+)').match):
+        
+        # This is the old expression. It had a nasty habit
+        # of grabbing paragraphs that began with a single
+        # letter word even if there was no following period.
+        
+        #expr = re.compile('\s*'
+        #                   '(([a-zA-Z]|[0-9]+|[ivxlcdmIVXLCDM]+)\.)*'
+        #                   '([a-zA-Z]|[0-9]+|[ivxlcdmIVXLCDM]+)\.?'
+        #                   '\s+').match):
+        
+        top=paragraph.getColorizableTexts()[0]
+        m=expr(top)
+        if not m: return None
+        subs=paragraph.getSubparagraphs()
+        if top[-2:]=='::':
+           subs=[StructuredTextExample(subs)]
+           top=top[:-1]
+        return StructuredTextNumbered(top[m.span()[1]:], subs,
+                                        indent=paragraph.indent,
+                                        number=top[:m.span()[1]])
+
+    def doc_description(
+        self, paragraph,
+        delim = re.compile('\s+--\s+').search,
+        nb=re.compile(r'[^\0- ]').search,
+        ):
+
+        top=paragraph.getColorizableTexts()[0]
+        d=delim(top)
+        if not d: return None
+        start, end = d.span()
+        title=top[:start]
+        if find(title, '\n') >= 0: return None
+        if not nb(title): return None
+        d=top[start:end]
+        top=top[end:]
+
+        subs=paragraph.getSubparagraphs()
+        if top[-2:]=='::':
+           subs=[StructuredTextExample(subs)]
+           top=top[:-1]
+
+        return StructuredTextDescription(
+           title, top, subs,
+           indent=paragraph.indent,
+           delim=d)
+
+    def doc_header(self, paragraph,
+                    expr    = re.compile('[ a-zA-Z0-9.:/,-_*<>\?\'\"]+').match
+                    ):
+        subs=paragraph.getSubparagraphs()
+        if not subs: return None
+        top=paragraph.getColorizableTexts()[0]
+        if not strip(top): return None
+        if top[-2:]=='::':
+           subs=StructuredTextExample(subs)
+           if strip(top)=='::': return subs
+           return ST.StructuredTextParagraph(
+              top[:-1], [subs], indent=paragraph.indent)
+
+        if find(top,'\n') >= 0: return None
+        return StructuredTextSection(top, subs, indent=paragraph.indent)
+
+    def doc_literal(
+        self, s,
+        expr=re.compile(
+          "(?:\s|^)'"                                                  # open
+          "([^ \t\n\r\f\v']|[^ \t\n\r\f\v'][^\n']*[^ \t\n\r\f\v'])" # contents
+          "'(?:\s|[,.;:!?]|$)"                                        # close
+          ).search):
+        
+        r=expr(s)
+        if r:
+           start, end = r.span(1)
+           return (StructuredTextLiteral(s[start:end]), start-1, end+1)
+        else:
+           return None
+
+    def doc_emphasize(
+        self, s,
+        expr = re.compile('\s*\*([ \na-zA-Z0-9.:/;,\'\"\?]+)\*(?!\*|-)').search
+        ):
+
+        r=expr(s)
+        if r:
+           start, end = r.span(1)
+           return (StructuredTextEmphasis(s[start:end]), start-1, end+1)
+        else:
+           return None
+    
+    def doc_inner_link(self,
+                       s,
+                       expr1 = re.compile("\.\.\s*").search,
+                       expr2 = re.compile("\[[a-zA-Z0-9]+\]").search):
+        
+        # make sure we dont grab a named link
+        if expr2(s) and expr1(s):
+            start1,end1 = expr1(s).span()
+            start2,end2 = expr2(s).span()
+            if end1 == start2:
+                # uh-oh, looks like a named link
+                return None
+            else:
+                # the .. is somewhere else, ignore it
+                return (StructuredTextInnerLink(s[start2+1,end2-1],start2,end2))
+            return None
+        elif expr2(s) and not expr1(s):
+            start,end = expr2(s).span()
+            return (StructuredTextInnerLink(s[start+1:end-1]),start,end)
+        return None
+    
+    def doc_named_link(self,
+                       s,
+                       expr=re.compile("(\.\.\s)(\[[a-zA-Z0-9]+\])").search):
+        
+        result = expr(s)
+        if result:
+            start,end   = result.span(2)
+            a,b = result.span(1)
+            str = strip(s[a:b]) + s[start:end]
+            st,en       = result.span()
+            return (StructuredTextNamedLink(str),st,en)
+            #return (StructuredTextNamedLink(s[st:en]),st,en)
+        return None
+    
+    def doc_underline(self,
+                      s,
+                      expr=re.compile("\_([a-zA-Z0-9\s\.,\?]+)\_").search):
+        
+        result = expr(s)
+        if result:
+            start,end = result.span(1)
+            st,e = result.span()
+            return (StructuredTextUnderline(s[start:end]),st,e)
+        else:
+            return None
+    
+    def doc_strong(self, 
+                   s,
+        expr = re.compile('\s*\*\*([ \na-zA-Z0-9.:/;\-,!\?\'\"]+)\*\*').search
+        ):
+
+        r=expr(s)
+        if r:
+           start, end = r.span(1)
+           return (StructuredTextStrong(s[start:end]), start-2, end+2)
+        else:
+           return None
+    
+    def doc_href(
+        
+        self, s,
+        expr1 = re.compile("(\"[ a-zA-Z0-9\n\-\.\,\;\(\)\/\:\/]+\")(:)([a-zA-Z0-9\:\/\.\~\-]+)([,]*\s*)").search,
+        expr2 = re.compile('(\"[ a-zA-Z0-9\n\-\.\:\;\(\)\/]+\")([,]+\s+)([a-zA-Z0-9\@\.\,\?\!\/\:\;\-\#]+)(\s*)').search):
+        
+        punctuation = re.compile("[\,\.\?\!\;]+").match
+        r=expr1(s) or expr2(s)
+
+        if r:
+            # need to grab the href part and the
+            # beginning part
+                        
+            start,e = r.span(1)
+            name    = s[start:e]
+            name    = replace(name,'"','',2)
+            #start   = start + 1
+            st,end   = r.span(3)
+            if punctuation(s[end-1:end]):
+                end = end -1
+            link    = s[st:end]
+            #end     = end - 1                        
+            
+            # name is the href title, link is the target
+            # of the href
+            return (StructuredTextLink(name, href=link),
+                    start, end)
+            
+            #return (StructuredTextLink(s[start:end], href=s[start:end]),
+            #        start, end)
+        else:
+            return None
+    
+    def doc_sgml(self,s,expr=re.compile("\<[a-zA-Z0-9\.\=\'\"\:\/\-\#\+\s]+\>").search):
+        """
+        SGML text is ignored and outputed as-is
+        """
+        r = expr(s)
+        if r:
+            start,end = r.span()
+            text = s[start:end]
+            return (StructuredTextSGML(text),start,end)
diff --git a/wxPython/samples/stxview/StructuredText/DocumentWithImages.py b/wxPython/samples/stxview/StructuredText/DocumentWithImages.py
new file mode 100644 (file)
index 0000000..ac73abf
--- /dev/null
@@ -0,0 +1,134 @@
+##############################################################################
+# 
+# Zope Public License (ZPL) Version 1.0
+# -------------------------------------
+# 
+# Copyright (c) Digital Creations.  All rights reserved.
+# 
+# This license has been certified as Open Source(tm).
+# 
+# Redistribution and use in source and binary forms, with or without
+# modification, are permitted provided that the following conditions are
+# met:
+# 
+# 1. Redistributions in source code must retain the above copyright
+#    notice, this list of conditions, and the following disclaimer.
+# 
+# 2. Redistributions in binary form must reproduce the above copyright
+#    notice, this list of conditions, and the following disclaimer in
+#    the documentation and/or other materials provided with the
+#    distribution.
+# 
+# 3. Digital Creations requests that attribution be given to Zope
+#    in any manner possible. Zope includes a "Powered by Zope"
+#    button that is installed by default. While it is not a license
+#    violation to remove this button, it is requested that the
+#    attribution remain. A significant investment has been put
+#    into Zope, and this effort will continue if the Zope community
+#    continues to grow. This is one way to assure that growth.
+# 
+# 4. All advertising materials and documentation mentioning
+#    features derived from or use of this software must display
+#    the following acknowledgement:
+# 
+#      "This product includes software developed by Digital Creations
+#      for use in the Z Object Publishing Environment
+#      (http://www.zope.org/)."
+# 
+#    In the event that the product being advertised includes an
+#    intact Zope distribution (with copyright and license included)
+#    then this clause is waived.
+# 
+# 5. Names associated with Zope or Digital Creations must not be used to
+#    endorse or promote products derived from this software without
+#    prior written permission from Digital Creations.
+# 
+# 6. Modified redistributions of any form whatsoever must retain
+#    the following acknowledgment:
+# 
+#      "This product includes software developed by Digital Creations
+#      for use in the Z Object Publishing Environment
+#      (http://www.zope.org/)."
+# 
+#    Intact (re-)distributions of any official Zope release do not
+#    require an external acknowledgement.
+# 
+# 7. Modifications are encouraged but must be packaged separately as
+#    patches to official Zope releases.  Distributions that do not
+#    clearly separate the patches from the original work must be clearly
+#    labeled as unofficial distributions.  Modifications which do not
+#    carry the name Zope may be packaged in any form, as long as they
+#    conform to all of the clauses above.
+# 
+# 
+# Disclaimer
+# 
+#   THIS SOFTWARE IS PROVIDED BY DIGITAL CREATIONS ``AS IS'' AND ANY
+#   EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+#   IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+#   PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL DIGITAL CREATIONS OR ITS
+#   CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+#   SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+#   LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
+#   USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+#   ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+#   OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
+#   OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+#   SUCH DAMAGE.
+# 
+# 
+# This software consists of contributions made by Digital Creations and
+# many individuals on behalf of Digital Creations.  Specific
+# attributions are listed in the accompanying credits file.
+# 
+##############################################################################
+
+import re, ST, STDOM
+from string import split, join, replace, expandtabs, strip, find
+
+from DocumentClass import *
+
+class StructuredTextImage(StructuredTextMarkup):
+    "A simple embedded image"
+
+class DocumentWithImages(DocumentClass):   
+    """
+
+    """
+
+
+    text_types = [
+       'doc_img',
+       ] + DocumentClass.text_types
+
+
+    def doc_img(
+        self, s,
+        expr1=re.compile('\"([ _a-zA-Z0-9*.:/;,\-\n\~]+)\":img:([a-zA-Z0-9\-.:/;,\n\~]+)').search,
+        expr2=re.compile('\"([ _a-zA-Z0-9*.:/;,\-\n\~]+)\":img:([a-zA-Z0-9\-.:/;,\n\~]+):([a-zA-Z0-9\-.:/;,\n\~]+)').search
+        ):
+
+
+        r = expr2(s)
+        if r:
+            startt, endt = r.span(1)
+            startk, endk = r.span(2)
+            starth, endh = r.span(3)
+            start, end = r.span()
+            return (StructuredTextImage(s[startt:endt], href=s[starth:endh], key=s[startk:endk]), 
+                    start, end)
+
+      
+        else:
+            
+            r=expr1(s)
+
+            if r:
+                startt, endt = r.span(1)
+                starth, endh = r.span(2)
+                start, end = r.span()
+                return (StructuredTextImage(s[startt:endt], href=s[starth:endh]),
+                        start, end)
+
+            return None
+
diff --git a/wxPython/samples/stxview/StructuredText/HTMLClass.py b/wxPython/samples/stxview/StructuredText/HTMLClass.py
new file mode 100644 (file)
index 0000000..d5c03d8
--- /dev/null
@@ -0,0 +1,308 @@
+##############################################################################
+# 
+# Zope Public License (ZPL) Version 1.0
+# -------------------------------------
+# 
+# Copyright (c) Digital Creations.  All rights reserved.
+# 
+# This license has been certified as Open Source(tm).
+# 
+# Redistribution and use in source and binary forms, with or without
+# modification, are permitted provided that the following conditions are
+# met:
+# 
+# 1. Redistributions in source code must retain the above copyright
+#     notice, this list of conditions, and the following disclaimer.
+# 
+# 2. Redistributions in binary form must reproduce the above copyright
+#     notice, this list of conditions, and the following disclaimer in
+#     the documentation and/or other materials provided with the
+#     distribution.
+# 
+# 3. Digital Creations requests that attribution be given to Zope
+#     in any manner possible. Zope includes a "Powered by Zope"
+#     button that is installed by default. While it is not a license
+#     violation to remove this button, it is requested that the
+#     attribution remain. A significant investment has been put
+#     into Zope, and this effort will continue if the Zope community
+#     continues to grow. This is one way to assure that growth.
+# 
+# 4. All advertising materials and documentation mentioning
+#     features derived from or use of this software must display
+#     the following acknowledgement:
+# 
+#        "This product includes software developed by Digital Creations
+#        for use in the Z Object Publishing Environment
+#        (http://www.zope.org/)."
+# 
+#     In the event that the product being advertised includes an
+#     intact Zope distribution (with copyright and license included)
+#     then this clause is waived.
+# 
+# 5. Names associated with Zope or Digital Creations must not be used to
+#     endorse or promote products derived from this software without
+#     prior written permission from Digital Creations.
+# 
+# 6. Modified redistributions of any form whatsoever must retain
+#     the following acknowledgment:
+# 
+#        "This product includes software developed by Digital Creations
+#        for use in the Z Object Publishing Environment
+#        (http://www.zope.org/)."
+# 
+#     Intact (re-)distributions of any official Zope release do not
+#     require an external acknowledgement.
+# 
+# 7. Modifications are encouraged but must be packaged separately as
+#     patches to official Zope releases.  Distributions that do not
+#     clearly separate the patches from the original work must be clearly
+#     labeled as unofficial distributions.  Modifications which do not
+#     carry the name Zope may be packaged in any form, as long as they
+#     conform to all of the clauses above.
+# 
+# 
+# Disclaimer
+# 
+#    THIS SOFTWARE IS PROVIDED BY DIGITAL CREATIONS ``AS IS'' AND ANY
+#    EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+#    IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+#    PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL DIGITAL CREATIONS OR ITS
+#    CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+#    SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+#    LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
+#    USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+#    ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+#    OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
+#    OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+#    SUCH DAMAGE.
+# 
+# 
+# This software consists of contributions made by Digital Creations and
+# many individuals on behalf of Digital Creations.  Specific
+# attributions are listed in the accompanying credits file.
+# 
+##############################################################################
+
+from string import join, split, find
+import re, sys, ST
+
+class HTMLClass:
+
+    element_types={
+        '#text': '_text',
+        'StructuredTextDocument': 'document',
+        'StructuredTextParagraph': 'paragraph',
+        'StructuredTextExample': 'example',
+        'StructuredTextBullet': 'bullet',
+        'StructuredTextNumbered': 'numbered',
+        'StructuredTextDescription': 'description',
+        'StructuredTextDescriptionTitle': 'descriptionTitle',
+        'StructuredTextDescriptionBody': 'descriptionBody',
+        'StructuredTextSection': 'section',
+        'StructuredTextSectionTitle': 'sectionTitle',
+        'StructuredTextLiteral': 'literal',
+        'StructuredTextEmphasis': 'emphasis',
+        'StructuredTextStrong': 'strong',
+        'StructuredTextLink': 'link',
+        'StructuredTextXref': 'xref',
+        'StructuredTextInnerLink':'innerLink',
+        'StructuredTextNamedLink':'namedLink',
+        'StructuredTextUnderline':'underline',
+        'StructuredTextTable':'table',
+        'StructuredTextSGML':'sgml',
+        }
+
+    def dispatch(self, doc, level, output):
+        getattr(self, self.element_types[doc.getNodeName()])(doc, level, output)
+        
+    def __call__(self, doc, level=1):
+        r=[]
+        self.dispatch(doc, level-1, r.append)
+        return join(r,'')
+
+    def _text(self, doc, level, output):
+        output(doc.getNodeValue())
+
+    def document(self, doc, level, output):
+        output('<html>\n')
+        children=doc.getChildNodes()
+        if (children and
+             children[0].getNodeName() == 'StructuredTextSection'):
+            output('<head>\n<title>%s</title>\n</head>\n' %
+                     children[0].getChildNodes()[0].getNodeValue())
+        output('<body>\n')
+        for c in children:
+            getattr(self, self.element_types[c.getNodeName()])(c, level, output)
+        output('</body>\n')
+        output('</html>\n')
+
+    def section(self, doc, level, output):
+        children=doc.getChildNodes()
+        for c in children:
+            getattr(self, self.element_types[c.getNodeName()])(c, level+1, output)
+        
+    def sectionTitle(self, doc, level, output):
+        output('<h%d>' % (level))
+        for c in doc.getChildNodes():
+            getattr(self, self.element_types[c.getNodeName()])(c, level, output)
+        output('</h%d>\n' % (level))
+
+    def description(self, doc, level, output):
+        p=doc.getPreviousSibling()
+        if p is None or  p.getNodeName() is not doc.getNodeName():            
+            output('<dl>\n')
+        for c in doc.getChildNodes():
+            getattr(self, self.element_types[c.getNodeName()])(c, level, output)
+        n=doc.getNextSibling()
+        if n is None or n.getNodeName() is not doc.getNodeName():            
+            output('</dl>\n')
+        
+    def descriptionTitle(self, doc, level, output):
+        output('<dt>')
+        for c in doc.getChildNodes():
+            getattr(self, self.element_types[c.getNodeName()])(c, level, output)
+        output('</dt>\n')
+        
+    def descriptionBody(self, doc, level, output):
+        output('<dd>')
+        for c in doc.getChildNodes():
+            getattr(self, self.element_types[c.getNodeName()])(c, level, output)
+        output('</dd>\n')
+
+    def bullet(self, doc, level, output):
+        p=doc.getPreviousSibling()
+        if p is None or p.getNodeName() is not doc.getNodeName():
+            output('<ul>\n')
+        output('<li>')
+        for c in doc.getChildNodes():
+            getattr(self, self.element_types[c.getNodeName()])(c, level, output)
+        n=doc.getNextSibling()
+        output('</li>\n')
+        if n is None or n.getNodeName() is not doc.getNodeName():            
+            output('</ul>\n')
+
+    def numbered(self, doc, level, output):
+        p=doc.getPreviousSibling()
+        if p is None or p.getNodeName() is not doc.getNodeName():            
+            output('<ol>\n')
+        output('<li>')
+        for c in doc.getChildNodes():
+            getattr(self, self.element_types[c.getNodeName()])(c, level, output)
+        n=doc.getNextSibling()
+        output('</li>\n')
+        if n is None or n.getNodeName() is not doc.getNodeName():
+            output('</ol>\n')
+
+    def example(self, doc, level, output):
+        i=0
+        for c in doc.getChildNodes():
+            if i==0:
+                output('<pre>')
+                output(html_quote(c.getNodeValue()))
+                output('</pre>\n')
+            else:
+                getattr(self, self.element_types[c.getNodeName()])(
+                    c, level, output)
+
+    def paragraph(self, doc, level, output):
+        i=0
+        output('<p>')
+        for c in doc.getChildNodes():
+            if c.getNodeName() in ['StructuredTextParagraph']:
+                getattr(self, self.element_types[c.getNodeName()])(
+                    c, level, output)
+            else:
+                getattr(self, self.element_types[c.getNodeName()])(
+                    c, level, output)
+        output('</p>')
+
+    def link(self, doc, level, output):
+        output('<a href="%s">' % doc.href)
+        for c in doc.getChildNodes():
+            getattr(self, self.element_types[c.getNodeName()])(c, level, output)
+        output('</a>')
+
+    def emphasis(self, doc, level, output):
+        output('<em>')
+        for c in doc.getChildNodes():
+            getattr(self, self.element_types[c.getNodeName()])(c, level, output)
+        output('</em>')
+
+    def literal(self, doc, level, output):
+        output('<code>')
+        for c in doc.getChildNodes():
+            output(html_quote(c.getNodeValue()))
+        output('</code>')
+
+    def strong(self, doc, level, output):
+        output('<strong>')
+        for c in doc.getChildNodes():
+            getattr(self, self.element_types[c.getNodeName()])(c, level, output)
+        output('</strong>')
+     
+    def underline(self, doc, level, output):
+        output("<u>")
+        for c in doc.getChildNodes():
+            getattr(self, self.element_types[c.getNodeName()])(c, level, output)
+        output("</u>")
+          
+    def innerLink(self, doc, level, output):
+        output('<a href="#');
+        for c in doc.getChildNodes():
+            getattr(self, self.element_types[c.getNodeName()])(c, level, output)
+        output('">[')
+        for c in doc.getChildNodes():
+            getattr(self, self.element_types[c.getNodeName()])(c, level, output)
+        output(']</a>')
+    
+    def namedLink(self, doc, level, output):
+        output('<a name="')
+        for c in doc.getChildNodes():
+            getattr(self, self.element_types[c.getNodeName()])(c, level, output)
+        output('">[')
+        for c in doc.getChildNodes():
+            getattr(self, self.element_types[c.getNodeName()])(c, level, output)
+        output(']</a>')
+    
+    def sgml(self,doc,level,output):
+        for c in doc.getChildNodes():
+            getattr(self, self.element_types[c.getNodeName()])(c, level, output)
+    
+    def table(self,doc,level,output):
+        """
+        A StructuredTextTable holds StructuredTextRow(s) which
+        holds StructuredTextColumn(s). A StructuredTextColumn
+        is a type of StructuredTextParagraph and thus holds
+        the actual data.
+        """
+        output("<table border=1 cellpadding=2>\n")
+        for row in doc.getRows()[0]:
+            output("<tr>\n")
+            for column in row.getColumns()[0]:
+                str = "<td colspan=%s>" % column.getSpan()
+                output(str)
+                #for c in doc.getChildNodes():
+                #    getattr(self, self.element_types[c.getNodeName()])(c, level, output)
+                for c in column.getChildNodes():
+                    getattr(self, self.element_types[c.getNodeName()])(c, level, output)
+                output("</td>\n")
+            output("</tr>\n")
+        output("</table>\n")
+          
+def html_quote(v, name='(Unknown name)', md={},
+                    character_entities=(
+                              (('&'),     '&amp;'),
+                              (('<'),     '&lt;' ),
+                              (('>'),     '&gt;' ),
+                              (('\213'), '&lt;' ),
+                              (('\233'), '&gt;' ),
+                              (('"'),     '&quot;'))): #"
+          text=str(v)
+          for re,name in character_entities:
+                if find(text, re) >= 0: text=join(split(text,re),name)
+          return text
+
+
+
+
+
diff --git a/wxPython/samples/stxview/StructuredText/HTMLWithImages.py b/wxPython/samples/stxview/StructuredText/HTMLWithImages.py
new file mode 100644 (file)
index 0000000..4d1e2f2
--- /dev/null
@@ -0,0 +1,133 @@
+##############################################################################
+# 
+# Zope Public License (ZPL) Version 1.0
+# -------------------------------------
+# 
+# Copyright (c) Digital Creations.  All rights reserved.
+# 
+# This license has been certified as Open Source(tm).
+# 
+# Redistribution and use in source and binary forms, with or without
+# modification, are permitted provided that the following conditions are
+# met:
+# 
+# 1. Redistributions in source code must retain the above copyright
+#    notice, this list of conditions, and the following disclaimer.
+# 
+# 2. Redistributions in binary form must reproduce the above copyright
+#    notice, this list of conditions, and the following disclaimer in
+#    the documentation and/or other materials provided with the
+#    distribution.
+# 
+# 3. Digital Creations requests that attribution be given to Zope
+#    in any manner possible. Zope includes a "Powered by Zope"
+#    button that is installed by default. While it is not a license
+#    violation to remove this button, it is requested that the
+#    attribution remain. A significant investment has been put
+#    into Zope, and this effort will continue if the Zope community
+#    continues to grow. This is one way to assure that growth.
+# 
+# 4. All advertising materials and documentation mentioning
+#    features derived from or use of this software must display
+#    the following acknowledgement:
+# 
+#      "This product includes software developed by Digital Creations
+#      for use in the Z Object Publishing Environment
+#      (http://www.zope.org/)."
+# 
+#    In the event that the product being advertised includes an
+#    intact Zope distribution (with copyright and license included)
+#    then this clause is waived.
+# 
+# 5. Names associated with Zope or Digital Creations must not be used to
+#    endorse or promote products derived from this software without
+#    prior written permission from Digital Creations.
+# 
+# 6. Modified redistributions of any form whatsoever must retain
+#    the following acknowledgment:
+# 
+#      "This product includes software developed by Digital Creations
+#      for use in the Z Object Publishing Environment
+#      (http://www.zope.org/)."
+# 
+#    Intact (re-)distributions of any official Zope release do not
+#    require an external acknowledgement.
+# 
+# 7. Modifications are encouraged but must be packaged separately as
+#    patches to official Zope releases.  Distributions that do not
+#    clearly separate the patches from the original work must be clearly
+#    labeled as unofficial distributions.  Modifications which do not
+#    carry the name Zope may be packaged in any form, as long as they
+#    conform to all of the clauses above.
+# 
+# 
+# Disclaimer
+# 
+#   THIS SOFTWARE IS PROVIDED BY DIGITAL CREATIONS ``AS IS'' AND ANY
+#   EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+#   IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+#   PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL DIGITAL CREATIONS OR ITS
+#   CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+#   SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+#   LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
+#   USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+#   ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+#   OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
+#   OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+#   SUCH DAMAGE.
+# 
+# 
+# This software consists of contributions made by Digital Creations and
+# many individuals on behalf of Digital Creations.  Specific
+# attributions are listed in the accompanying credits file.
+# 
+##############################################################################
+
+from string import join, split, find
+import re, sys, ST
+import time
+
+from HTMLClass import HTMLClass
+
+ets = HTMLClass.element_types
+ets.update({'StructuredTextImage': 'image'})      
+
+class HTMLWithImages(HTMLClass):
+
+    element_types = ets
+
+    def document(self, doc, level, output):
+        output('<html>\n')
+        children=doc.getChildNodes()
+        if (children and
+            children[0].getNodeName() == 'StructuredTextSection'):
+           output('<head>\n<title>%s</title>\n</head>\n' %
+                  children[0].getChildNodes()[0].getNodeValue())
+        output('<body bgcolor="#FFFFFF">\n')
+        for c in children:
+           getattr(self, self.element_types[c.getNodeName()])(c, level, output)
+        output('</body>\n')
+        output('</html>\n')
+
+
+    def image(self, doc, level, output):
+        output('<img src="%s" alt="%s">' % (doc.href, doc.getNodeValue()))
+
+
+    def image(self, doc, level, output):
+       if hasattr(doc, 'key'):
+          output('<a name="%s"></a>\n<img src="%s" alt="%s">' % (doc.key, doc.href, doc.getNodeValue()))
+       else:
+          output('<img src="%s" alt="%s">' % (doc.href, doc.getNodeValue()))
+
+
+    def xref(self, doc, level, output):
+        val = doc.getNodeValue()
+        output('<a href="#%s">%s</a>' % (val, val) )
+
+
+
+
+
+
+
diff --git a/wxPython/samples/stxview/StructuredText/MML.py b/wxPython/samples/stxview/StructuredText/MML.py
new file mode 100644 (file)
index 0000000..515bd32
--- /dev/null
@@ -0,0 +1,170 @@
+##############################################################################
+# 
+# Zope Public License (ZPL) Version 1.0
+# -------------------------------------
+# 
+# Copyright (c) Digital Creations.  All rights reserved.
+# 
+# This license has been certified as Open Source(tm).
+# 
+# Redistribution and use in source and binary forms, with or without
+# modification, are permitted provided that the following conditions are
+# met:
+# 
+# 1. Redistributions in source code must retain the above copyright
+#    notice, this list of conditions, and the following disclaimer.
+# 
+# 2. Redistributions in binary form must reproduce the above copyright
+#    notice, this list of conditions, and the following disclaimer in
+#    the documentation and/or other materials provided with the
+#    distribution.
+# 
+# 3. Digital Creations requests that attribution be given to Zope
+#    in any manner possible. Zope includes a "Powered by Zope"
+#    button that is installed by default. While it is not a license
+#    violation to remove this button, it is requested that the
+#    attribution remain. A significant investment has been put
+#    into Zope, and this effort will continue if the Zope community
+#    continues to grow. This is one way to assure that growth.
+# 
+# 4. All advertising materials and documentation mentioning
+#    features derived from or use of this software must display
+#    the following acknowledgement:
+# 
+#      "This product includes software developed by Digital Creations
+#      for use in the Z Object Publishing Environment
+#      (http://www.zope.org/)."
+# 
+#    In the event that the product being advertised includes an
+#    intact Zope distribution (with copyright and license included)
+#    then this clause is waived.
+# 
+# 5. Names associated with Zope or Digital Creations must not be used to
+#    endorse or promote products derived from this software without
+#    prior written permission from Digital Creations.
+# 
+# 6. Modified redistributions of any form whatsoever must retain
+#    the following acknowledgment:
+# 
+#      "This product includes software developed by Digital Creations
+#      for use in the Z Object Publishing Environment
+#      (http://www.zope.org/)."
+# 
+#    Intact (re-)distributions of any official Zope release do not
+#    require an external acknowledgement.
+# 
+# 7. Modifications are encouraged but must be packaged separately as
+#    patches to official Zope releases.  Distributions that do not
+#    clearly separate the patches from the original work must be clearly
+#    labeled as unofficial distributions.  Modifications which do not
+#    carry the name Zope may be packaged in any form, as long as they
+#    conform to all of the clauses above.
+# 
+# 
+# Disclaimer
+# 
+#   THIS SOFTWARE IS PROVIDED BY DIGITAL CREATIONS ``AS IS'' AND ANY
+#   EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+#   IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+#   PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL DIGITAL CREATIONS OR ITS
+#   CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+#   SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+#   LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
+#   USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+#   ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+#   OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
+#   OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+#   SUCH DAMAGE.
+# 
+# 
+# This software consists of contributions made by Digital Creations and
+# many individuals on behalf of Digital Creations.  Specific
+# attributions are listed in the accompanying credits file.
+# 
+##############################################################################
+'''
+$Id$'''
+
+from StructuredText import * # :-)
+        
+def ctag(s):
+    # Blech, wish we could use character tags
+    if s is None: s=''
+    s=gsub(strong,'\\1<bold>\\2<plain>\\3',s)
+    s=gsub(code,  '\\1<family Courier>\\2<family Times>\\3',s)
+    s=gsub(em,    '\\1<italic>\\2<plain>\\3',s)
+    return join(map(strip,split(s,'\n')),'\n')
+
+class MML(StructuredText):
+
+    '''\
+    An MML structured text formatter.
+    '''\
+
+    def __str__(self,
+                ):
+        '''\
+        Return an HTML string representation of the structured text data.
+
+        '''
+        s=self._str(self.structure,self.level)
+        return s
+
+    def ul(self, before, p, after):
+        return ("%s\n\n<Bulleted>\n%s%s"
+                % (before, ctag(p), after))
+
+    def ol(self, before, p, after):
+        return ("%s\n\n<Numbered>\n%s%s"
+                % (before, ctag(p), after))
+
+    def dl(self, before, t, d, after):
+        return ("%s\n\n<Term>\n%s\n\n<Definition>\n%s%s" 
+                % (before,ctag(t),ctag(d),after))
+
+    def head(self, before, t, level, d):
+        return ("%s\n\n<Heading%d>\n%s%s"
+                % (before,level,ctag(t),d))
+
+    def normal(self,before,p,after):
+        return "%s\n\n<Body>\n%s%s" % (before, ctag(p), after)
+
+    def pre(self,structure,r=None):
+        if r is None: r=['']
+        for s in structure:
+            for line in split(s[0],'\n'):
+                r.append('\n<PRE>')
+                r.append(line)
+            self.pre(s[1],r)
+        return join(r,'\n')
+
+    def _str(self,structure,level):
+        r=''
+        for s in structure:
+            # print s[0],'\n', len(s[1]), '\n\n'
+            if bullet.match(s[0]) >= 0:
+                p=bullet.group(1)
+                r=self.ul(r,p,self._str(s[1],level))
+            elif ol.match(s[0]) >= 0:
+                p=ol.group(3)
+                r=self.ol(r,p,self._str(s[1],level))
+            elif olp.match(s[0]) >= 0:
+                p=olp.group(1)
+                r=self.ol(r,p,self._str(s[1],level))
+            elif dl.match(s[0]) >= 0:
+                t,d=dl.group(1,2)
+                r=self.dl(r,t,d,self._str(s[1],level))
+            elif example.search(s[0]) >= 0 and s[1]:
+                # Introduce an example, using pre tags:
+                r=self.normal(r,s[0],self.pre(s[1]))
+            elif s[0][-2:]=='::' and s[1]:
+                # Introduce an example, using pre tags:
+                r=self.normal(r,s[0][:-1],self.pre(s[1]))
+            elif nl.search(s[0]) < 0 and s[1] and s[0][-1:] != ':':
+                # Treat as a heading
+                t=s[0]
+                r=self.head(r,t,level,
+                            self._str(s[1],level and level+1))
+            else:
+                r=self.normal(r,s[0],self._str(s[1],level))
+        return r        
diff --git a/wxPython/samples/stxview/StructuredText/ST.py b/wxPython/samples/stxview/StructuredText/ST.py
new file mode 100644 (file)
index 0000000..2e6d0ab
--- /dev/null
@@ -0,0 +1,278 @@
+import re, STDOM
+from string import split, join, replace, expandtabs, strip, find
+
+#####################################################################
+#                              Updated functions                    #
+#####################################################################
+
+def indention(str,front = re.compile("^\s+").match):
+    """ 
+    Convert all tabs to the appropriate number of spaces.
+    Find the number of leading spaces. If none, return 0
+    """
+    
+    if front(str):
+        start,end = front(str).span()
+        return end-start-1
+    else:
+        return 0     # no leading spaces
+
+def insert(struct, top, level):
+    """
+    find what will be the parant paragraph of
+    a sentence and return that paragraph's
+    sub-paragraphs. The new paragraph will be
+    appended to those sub-paragraphs
+    """
+    #print "struct", struct, top-1
+    if not top-1 in range(len(struct)):
+        return None
+    run = struct[top-1]
+    i    = 0
+    while i+1 < level:
+        run = run.getSubparagraphs()[len(run.getSubparagraphs())-1]
+        i = i + 1
+    #print "parent for level ", level, " was => ", run.getColorizableTexts()
+    return run.getSubparagraphs()
+        
+def display(struct):
+    """
+    runs through the structure and prints out
+    the paragraphs. If the insertion works
+    correctly, display's results should mimic
+    the orignal paragraphs.
+    """
+    
+    if struct.getColorizableTexts():
+        print join(struct.getColorizableTexts()),"\n"
+    if struct.getSubparagraphs():
+        for x in struct.getSubparagraphs():
+            display(x)
+    
+def display2(struct):
+    """
+    runs through the structure and prints out
+    the paragraphs. If the insertion works
+    correctly, display's results should mimic
+    the orignal paragraphs.    
+    """
+    
+    if struct.getNodeValue():
+        print struct.getNodeValue(),"\n"
+    if struct.getSubparagraphs():
+        for x in struct.getSubparagraphs():
+            display(x)
+            
+def findlevel(levels,indent):
+    """
+    remove all level information of levels
+    with a greater level of indentation.
+    Then return which level should insert this
+    paragraph
+    """
+    
+    keys = levels.keys()
+    for key in keys:
+        if levels[key] > indent:
+            del(levels[key])
+    keys = levels.keys()
+    if not(keys):
+        return 0
+    else:
+        for key in keys:
+            if levels[key] == indent:
+                return key
+    highest = 0
+    for key in keys:
+        if key > highest:
+            highest = key
+    return highest-1
+
+#####################################################################
+
+# Golly, the capitalization of this function always makes me think it's a class
+def StructuredText(paragraphs, paragraph_delimiter=re.compile('\n\s*\n')):
+    """
+    StructuredText accepts paragraphs, which is a list of 
+    lines to be parsed. StructuredText creates a structure
+    which mimics the structure of the paragraphs.
+    Structure => [paragraph,[sub-paragraphs]]
+    """
+
+    currentlevel    = 0
+    currentindent  = 0
+    levels            = {0:0}
+    level             = 0        # which header are we under
+    struct            = []      # the structure to be returned
+    run                = struct
+    
+    paragraphs = filter(
+        strip,
+        paragraph_delimiter.split(expandtabs('\n\n'+paragraphs+'\n\n'))
+        )
+    
+    if not paragraphs: return []
+    
+    ind = []     # structure based on indention levels
+    for paragraph in paragraphs:
+        ind.append([indention(paragraph), paragraph])
+    
+    currentindent = indention(paragraphs[0])
+    levels[0]        = currentindent
+    
+    #############################################################
+    #                                  updated                  #
+    #############################################################
+    
+    for indent,paragraph in ind :
+        if indent == 0:
+            level          = level + 1
+            currentlevel   = 0
+            currentindent  = 0
+            levels         = {0:0}
+            struct.append(StructuredTextParagraph(paragraph, indent=indent, level=currentlevel))
+        elif indent > currentindent:
+            currentlevel            = currentlevel + 1
+            currentindent           = indent
+            levels[currentlevel]    = indent
+            run = insert(struct,level,currentlevel)
+            run.append(StructuredTextParagraph(paragraph, indent=indent, level=currentlevel))
+        elif indent < currentindent:
+            result   = findlevel(levels,indent)
+            if result > 0:
+                currentlevel = result
+            currentindent  = indent
+            run = insert(struct,level,currentlevel)
+            run.append(StructuredTextParagraph(paragraph, indent=indent, level=currentlevel))
+        else:
+            if insert(struct,level,currentlevel):
+                run = insert(struct,level,currentlevel)
+            else:
+                run = struct
+                currentindet = indent
+            run.append(StructuredTextParagraph(paragraph, indent=indent, level=currentlevel))
+    
+    return StructuredTextDocument(struct)
+
+Basic = StructuredText
+
+class StructuredTextParagraph(STDOM.Element):
+
+    indent=0
+
+    def __init__(self, src, subs=None, **kw):
+        if subs is None: subs=[]
+        self._src=src
+        self._subs=list(subs)
+        
+        self._attributes=kw.keys()
+        for k, v in kw.items(): setattr(self, k, v)
+
+    def getChildren(self, type=type, lt=type([])):
+        src=self._src
+        if type(src) is not lt: src=[src]
+        return src+self._subs
+
+    def getAttribute(self, name):
+        return getattr(self, name, None)
+        
+    def getAttributeNode(self, name):
+        if hasattr(self, name):
+            return STDOM.Attr(name, getattr(self, name))
+
+    def getAttributes(self):
+        d={}
+        for a in self._attributes:
+            d[a]=getattr(self, a, '')
+        return STDOM.NamedNodeMap(d)
+
+    def getSubparagraphs(self):
+        return self._subs
+
+    def setSubparagraphs(self, subs):
+        self._subs=subs
+
+    def getColorizableTexts(self):
+        return (self._src,)
+
+    def setColorizableTexts(self, src):
+        self._src=src[0]
+
+    def __repr__(self):
+        r=[]; a=r.append
+        a((' '*(self.indent or 0))+
+          ('%s(' % self.__class__.__name__)
+          +str(self._src)+', ['
+          )
+        for p in self._subs: a(`p`)
+        a((' '*(self.indent or 0))+'])')
+        return join(r,'\n')
+
+    """
+    create aliases for all above functions in the pythony way.
+    """
+
+    def _get_Children(self, type=type, lt=type([])):
+        return self.getChildren(type,lt)
+        
+    def _get_Attribute(self, name):
+        return self.getAttribute(name)
+        
+    def _get_AttributeNode(self, name):
+        return self.getAttributeNode(name)
+
+    def _get_Attributes(self):
+        return self.getAttributes()
+
+    def _get_Subparagraphs(self):
+        return self.getSubparagraphs()
+
+    def _set_Subparagraphs(self, subs):
+        return self.setSubparagraphs(subs)
+
+    def _get_ColorizableTexts(self):
+        return self.getColorizableTexts()
+
+    def _set_ColorizableTexts(self, src):
+        return self.setColorizableTexts(src)
+
+class StructuredTextDocument(StructuredTextParagraph):
+    """
+    A StructuredTextDocument holds StructuredTextParagraphs
+    as its subparagraphs.
+    """
+    _attributes=()
+    
+    def __init__(self, subs=None, **kw):
+        apply(StructuredTextParagraph.__init__,
+                (self, '', subs),
+                kw)
+
+    def getChildren(self):
+        return self._subs
+        
+    def getColorizableTexts(self):
+        return ()
+        
+    def setColorizableTexts(self, src):
+        pass
+
+    def __repr__(self):
+        r=[]; a=r.append
+        a('%s([' % self.__class__.__name__)
+        for p in self._subs: a(`p`+',')
+        a('])')
+        return join(r,'\n')
+    
+    """
+    create aliases for all above functions in the pythony way.
+    """
+    
+    def _get_Children(self):
+        return self.getChildren()
+        
+    def _get_ColorizableTexts(self):
+        return self.getColorizableTexts()
+        
+    def _set_ColorizableTexts(self, src):
+        return self.setColorizableTexts(src)
diff --git a/wxPython/samples/stxview/StructuredText/STDOM.py b/wxPython/samples/stxview/StructuredText/STDOM.py
new file mode 100644 (file)
index 0000000..1eb2d42
--- /dev/null
@@ -0,0 +1,736 @@
+##############################################################################
+# 
+# Zope Public License (ZPL) Version 1.0
+# -------------------------------------
+# 
+# Copyright (c) Digital Creations.  All rights reserved.
+# 
+# This license has been certified as Open Source(tm).
+# 
+# Redistribution and use in source and binary forms, with or without
+# modification, are permitted provided that the following conditions are
+# met:
+# 
+# 1. Redistributions in source code must retain the above copyright
+#    notice, this list of conditions, and the following disclaimer.
+# 
+# 2. Redistributions in binary form must reproduce the above copyright
+#    notice, this list of conditions, and the following disclaimer in
+#    the documentation and/or other materials provided with the
+#    distribution.
+# 
+# 3. Digital Creations requests that attribution be given to Zope
+#    in any manner possible. Zope includes a "Powered by Zope"
+#    button that is installed by default. While it is not a license
+#    violation to remove this button, it is requested that the
+#    attribution remain. A significant investment has been put
+#    into Zope, and this effort will continue if the Zope community
+#    continues to grow. This is one way to assure that growth.
+# 
+# 4. All advertising materials and documentation mentioning
+#    features derived from or use of this software must display
+#    the following acknowledgement:
+# 
+#      "This product includes software developed by Digital Creations
+#      for use in the Z Object Publishing Environment
+#      (http://www.zope.org/)."
+# 
+#    In the event that the product being advertised includes an
+#    intact Zope distribution (with copyright and license included)
+#    then this clause is waived.
+# 
+# 5. Names associated with Zope or Digital Creations must not be used to
+#    endorse or promote products derived from this software without
+#    prior written permission from Digital Creations.
+# 
+# 6. Modified redistributions of any form whatsoever must retain
+#    the following acknowledgment:
+# 
+#      "This product includes software developed by Digital Creations
+#      for use in the Z Object Publishing Environment
+#      (http://www.zope.org/)."
+# 
+#    Intact (re-)distributions of any official Zope release do not
+#    require an external acknowledgement.
+# 
+# 7. Modifications are encouraged but must be packaged separately as
+#    patches to official Zope releases.  Distributions that do not
+#    clearly separate the patches from the original work must be clearly
+#    labeled as unofficial distributions.  Modifications which do not
+#    carry the name Zope may be packaged in any form, as long as they
+#    conform to all of the clauses above.
+# 
+# 
+# Disclaimer
+# 
+#   THIS SOFTWARE IS PROVIDED BY DIGITAL CREATIONS ``AS IS'' AND ANY
+#   EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+#   IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+#   PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL DIGITAL CREATIONS OR ITS
+#   CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+#   SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+#   LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
+#   USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+#   ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+#   OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
+#   OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+#   SUCH DAMAGE.
+# 
+# 
+# This software consists of contributions made by Digital Creations and
+# many individuals on behalf of Digital Creations.  Specific
+# attributions are listed in the accompanying credits file.
+# 
+##############################################################################
+"""
+DOM implementation in StructuredText : Read-Only methods
+
+All standard Zope objects support DOM to a limited extent.
+"""
+import string
+
+
+# Node type codes
+# ---------------
+
+ELEMENT_NODE                  = 1
+ATTRIBUTE_NODE                = 2
+TEXT_NODE                     = 3
+CDATA_SECTION_NODE            = 4
+ENTITY_REFERENCE_NODE         = 5
+ENTITY_NODE                   = 6
+PROCESSING_INSTRUCTION_NODE   = 7
+COMMENT_NODE                  = 8
+DOCUMENT_NODE                 = 9
+DOCUMENT_TYPE_NODE            = 10
+DOCUMENT_FRAGMENT_NODE        = 11
+NOTATION_NODE                 = 12
+
+# Exception codes
+# ---------------
+
+INDEX_SIZE_ERR                = 1
+DOMSTRING_SIZE_ERR            = 2
+HIERARCHY_REQUEST_ERR         = 3
+WRONG_DOCUMENT_ERR            = 4
+INVALID_CHARACTER_ERR         = 5
+NO_DATA_ALLOWED_ERR           = 6
+NO_MODIFICATION_ALLOWED_ERR   = 7
+NOT_FOUND_ERR                 = 8
+NOT_SUPPORTED_ERR             = 9
+INUSE_ATTRIBUTE_ERR           = 10
+
+# Exceptions
+# ----------
+
+class DOMException(Exception):
+    pass
+class IndexSizeException(DOMException):
+    code = INDEX_SIZE_ERR
+class DOMStringSizeException(DOMException):
+    code = DOMSTRING_SIZE_ERR
+class HierarchyRequestException(DOMException):
+    code = HIERARCHY_REQUEST_ERR
+class WrongDocumentException(DOMException):
+    code = WRONG_DOCUMENT_ERR
+class InvalidCharacterException(DOMException):
+    code = INVALID_CHARACTER_ERR
+class NoDataAllowedException(DOMException):
+    code = NO_DATA_ALLOWED_ERR
+class NoModificationAllowedException(DOMException):
+    code = NO_MODIFICATION_ALLOWED_ERR
+class NotFoundException(DOMException):
+    code = NOT_FOUND_ERR
+class NotSupportedException(DOMException):
+    code = NOT_SUPPORTED_ERR
+class InUseAttributeException(DOMException):
+    code = INUSE_ATTRIBUTE_ERR
+
+# Node classes
+# ------------
+
+class ParentNode:
+   """
+   A node that can have children, or, more precisely, that implements
+   the child access methods of the DOM.
+   """
+
+   def getChildNodes(self, type=type, st=type('')):
+      """
+      Returns a NodeList that contains all children of this node.
+      If there are no children, this is a empty NodeList
+      """
+      
+      r=[]
+      for n in self.getChildren():
+         if type(n) is st: n=TextNode(n)
+         r.append(n.__of__(self))
+      
+      return  NodeList(r)
+   
+   def getFirstChild(self, type=type, st=type('')):
+      """
+      The first child of this node. If there is no such node
+      this returns None
+      """
+      children = self.getChildren()
+
+      if not children:
+         return None
+         
+      n=chidren[0]
+
+      if type(n) is st:
+         n=TextNode(n)
+         
+      return n.__of__(self)
+
+   def getLastChild(self, type=type, st=type('')):
+      """
+      The last child of this node.  If there is no such node
+      this returns None.
+      """
+      children = self.getChildren()
+      if not children: return None
+      n=chidren[-1]
+      if type(n) is st: n=TextNode(n)
+      return n.__of__(self)
+
+   """
+   create aliases for all above functions in the pythony way.
+   """
+   
+   def _get_ChildNodes(self, type=type, st=type('')):
+      return self.getChildNodes(type,st)
+   
+   def _get_FirstChild(self, type=type, st=type('')):
+      return self.getFirstChild(type,st)
+
+   def _get_LastChild(self, type=type, st=type('')):
+      return self.getLastChild(type,st)
+  
+class NodeWrapper(ParentNode):
+   """
+   This is an acquisition-like wrapper that provides parent access for 
+   DOM sans circular references!
+   """
+
+   def __init__(self, aq_self, aq_parent):
+      self.aq_self=aq_self
+      self.aq_parent=aq_parent
+
+   def __getattr__(self, name):
+      return getattr(self.aq_self, name)
+    
+   def getParentNode(self):
+      """
+      The parent of this node.  All nodes except Document
+      DocumentFragment and Attr may have a parent
+      """
+      return self.aq_parent
+
+   def _getDOMIndex(self, children, getattr=getattr):
+      i=0
+      self=self.aq_self
+      for child in children:
+         if getattr(child, 'aq_self', child) is self:
+            self._DOMIndex=i
+            return i
+         i=i+1
+      return None
+
+   def getPreviousSibling(self,
+                          type=type,
+                          st=type(''),
+                          getattr=getattr,
+                          None=None):
+
+      """
+      The node immediately preceding this node.  If
+      there is no such node, this returns None.
+      """
+      
+      children = self.aq_parent.getChildren()
+      if not children:
+         return None
+
+      index=getattr(self, '_DOMIndex', None)
+      if index is None:
+         index=self._getDOMIndex(children)
+         if index is None: return None
+
+      index=index-1
+      if index < 0: return None
+      try: n=children[index]
+      except IndexError: return None
+      else:
+         if type(n) is st:
+            n=TextNode(n)
+         n._DOMIndex=index
+         return n.__of__(self)
+
+
+   def getNextSibling(self, type=type, st=type('')):
+      """
+      The node immediately preceding this node.  If
+      there is no such node, this returns None.
+      """
+      children = self.aq_parent.getChildren()
+      if not children:
+         return None
+
+      index=getattr(self, '_DOMIndex', None)
+      if index is None:
+         index=self._getDOMIndex(children)
+         if index is None:
+            return None
+
+      index=index+1
+      try: n=children[index]
+      except IndexError:
+         return None
+      else:
+         if type(n) is st:
+            n=TextNode(n)
+         n._DOMIndex=index
+         return n.__of__(self)
+
+   def getOwnerDocument(self):
+      """
+      The Document object associated with this node, if any.
+      """
+      return self.aq_parent.getOwnerDocument()
+
+   """
+   create aliases for all above functions in the pythony way.   
+   """
+   
+   def _get_ParentNode(self):
+      return self.getParentNode()
+
+   def _get_DOMIndex(self, children, getattr=getattr):
+      return self._getDOMIndex(children,getattr)
+      
+   def _get_PreviousSibling(self,
+                          type=type,
+                          st=type(''),
+                          getattr=getattr,
+                          None=None):
+
+      return self.getPreviousSibling(type,st,getattr,None)
+      
+   def _get_NextSibling(self, type=type, st=type('')):
+      return self.getNextSibling(type,st)
+      
+   def _get_OwnerDocument(self):
+      return self.getOwnerDocument()
+      
+class Node(ParentNode):
+   """
+   Node Interface
+   """
+
+   # Get a DOM wrapper with a parent link
+   def __of__(self, parent):
+      return NodeWrapper(self, parent)
+
+   # DOM attributes    
+   # --------------
+    
+   def getNodeName(self):
+      """
+      The name of this node, depending on its type
+      """
+
+   def getNodeValue(self):
+      """
+      The value of this node, depending on its type
+      """
+      return None
+
+   def getParentNode(self):
+      """
+      The parent of this node.  All nodes except Document
+      DocumentFragment and Attr may have a parent
+      """
+
+   def getChildren(self):
+      """
+      Get a Python sequence of children
+      """
+      return ()
+
+   def getPreviousSibling(self,
+                          type=type,
+                          st=type(''),
+                          getattr=getattr,
+                          None=None):
+      """
+      The node immediately preceding this node.  If
+      there is no such node, this returns None.
+      """
+
+   def getNextSibling(self, type=type, st=type('')):
+      """
+      The node immediately preceding this node.  If
+      there is no such node, this returns None.
+      """
+
+   def getAttributes(self):
+      """
+      Returns a NamedNodeMap containing the attributes
+      of this node (if it is an element) or None otherwise.
+      """
+      return None
+
+   def getOwnerDocument(self):
+      """
+      The Document object associated with this node, if any.
+      """
+        
+    # DOM Methods    
+    # -----------
+    
+   def hasChildNodes(self):
+      """
+      Returns true if the node has any children, false
+      if it doesn't.
+      """
+      return len(self.getChildren())
+
+   """
+   create aliases for all above functions in the pythony way.
+   """
+
+   def _get_NodeName(self):
+      return self.getNodeName()
+      
+   def _get_NodeValue(self):
+      return self.getNodeValue()
+      
+   def _get_ParentNode(self):
+      return self.getParentNode()
+
+   def _get_Children(self):
+      return self.getChildren()
+
+   def _get_PreviousSibling(self,
+                          type=type,
+                          st=type(''),
+                          getattr=getattr,
+                          None=None):
+      
+      return self.getPreviousSibling(type,st,getattr,None)
+      
+   def _get_NextSibling(self, type=type, st=type('')):
+      return self.getNextSibling()
+
+   def _get_Attributes(self):
+      return self.getAttributes()
+
+   def _get_OwnerDocument(self):
+      return self.getOwnerDocument()
+    
+   def _has_ChildNodes(self):
+      return self.hasChildNodes()
+      
+         
+class TextNode(Node):
+
+   def __init__(self, str): self._value=str
+      
+   def getNodeType(self):
+      return TEXT_NODE
+      
+   def getNodeName(self):
+      return '#text'
+
+   def getNodeValue(self):
+      return self._value
+   
+   """
+   create aliases for all above functions in the pythony way.
+   """
+   
+   def _get_NodeType(self):
+      return self.getNodeType()
+      
+   def _get_NodeName(self):
+      return self.getNodeName()
+
+   def _get_NodeValue(self):
+      return self.getNodeValue()
+
+class Element(Node):
+   """
+   Element interface
+   """
+    
+   # Element Attributes
+   # ------------------
+    
+   def getTagName(self):
+      """The name of the element"""
+      return self.__class__.__name__
+    
+   def getNodeName(self):
+      """The name of this node, depending on its type"""
+      return self.__class__.__name__
+      
+   def getNodeType(self):
+      """A code representing the type of the node."""
+      return ELEMENT_NODE
+
+   def getNodeValue(self, type=type, st=type('')):
+      r=[]
+      for c in self.getChildren():
+         if type(c) is not st:
+            c=c.getNodeValue()
+         r.append(c)
+      return string.join(r,'')
+    
+   def getParentNode(self):
+      """
+      The parent of this node.  All nodes except Document
+      DocumentFragment and Attr may have a parent
+      """
+      
+   # Element Methods
+   # ---------------
+    
+   _attributes=()
+
+   def getAttribute(self, name): return getattr(self, name, None)
+   def getAttributeNode(self, name):
+      if hasattr(self, name):
+         return Attr(name, getattr(self, name))
+
+   def getAttributes(self):
+      d={}
+      for a in self._attributes:
+         d[a]=getattr(self, a, '')
+      return NamedNodeMap(d)
+
+   def getAttribute(self, name):
+      """Retrieves an attribute value by name."""
+      return None
+
+   def getAttributeNode(self, name):
+      """ Retrieves an Attr node by name or None if
+      there is no such attribute. """
+      return None
+
+   def getElementsByTagName(self, tagname):
+      """
+      Returns a NodeList of all the Elements with a given tag
+      name in the order in which they would be encountered in a
+      preorder traversal of the Document tree.  Parameter: tagname
+      The name of the tag to match (* = all tags). Return Value: A new
+      NodeList object containing all the matched Elements.
+      """
+      nodeList = []
+      for child in self.getChildren():
+         if (child.getNodeType()==ELEMENT_NODE and \
+             child.getTagName()==tagname or tagname== '*'):
+                
+            nodeList.append(child)
+               
+         if hasattr(child, 'getElementsByTagName'):
+            n1       = child.getElementsByTagName(tagname)
+            nodeList = nodeList + n1._data
+      return NodeList(nodeList)
+   
+   """
+   create aliases for all above functions in the pythony way.
+   """
+
+   def _get_TagName(self):
+      return self.getTagName()
+      
+   def _get_NodeName(self):
+      return self.getNodeName()
+      
+   def _get_NodeType(self):
+      return self.getNodeType()
+      
+   def _get_NodeValue(self, type=type, st=type('')):
+      return self.GetNodeValue(type,st)
+      
+   def _get_ParentNode(self):
+      return self.getParentNode()
+      
+   def _get_Attribute(self, name):
+      return self.getAttribute(name)
+   
+   def _get_AttributeNode(self, name):
+      return self.getAttributeNode(name)
+      
+   def _get_Attributes(self):
+      return self.getAttributes()
+      
+   def _get_Attribute(self, name):
+      return self.getAttribute(name)
+      
+   def _get_AttributeNode(self, name):
+      return self.getAttributeNode(name)
+      
+   def _get_ElementsByTagName(self, tagname):
+      return self.getElementsByTagName(tagname)
+      
+         
+class NodeList:
+   """
+   NodeList interface - Provides the abstraction of an ordered
+   collection of nodes.
+    
+   Python extensions: can use sequence-style 'len', 'getitem', and
+   'for..in' constructs.
+   """
+    
+   def __init__(self,list=None):
+      self._data = list or []
+    
+   def __getitem__(self, index, type=type, st=type('')):
+      return self._data[index]
+
+   def __getslice__(self, i, j):
+      return self._data[i:j]
+    
+   def item(self, index):
+      """
+      Returns the index-th item in the collection
+      """
+      try:  return self._data[index]    
+      except IndexError: return None
+         
+   def getLength(self):
+      """
+      The length of the NodeList
+      """
+      return len(self._data)
+    
+   __len__=getLength
+   
+   """
+   create aliases for all above functions in the pythony way.
+   """
+   
+   def _get_Length(self):
+      return self.getLength()
+class NamedNodeMap:
+   """
+   NamedNodeMap interface - Is used to represent collections
+   of nodes that can be accessed by name.  NamedNodeMaps are not
+   maintained in any particular order.
+    
+   Python extensions: can use sequence-style 'len', 'getitem', and
+   'for..in' constructs, and mapping-style 'getitem'.
+   """
+    
+   def __init__(self, data=None):
+      if data is None:
+         data = {}
+      self._data = data
+
+   def item(self, index):
+      """
+      Returns the index-th item in the map
+      """
+      try: return self._data.values()[index]
+      except IndexError: return None
+        
+   def __getitem__(self, key):
+      if type(key)==type(1):
+         return self._data.values()[key]
+      else:
+         return self._data[key]
+            
+   def getLength(self):
+      """
+      The length of the NodeList
+      """
+      return len(self._data)
+    
+   __len__ = getLength
+    
+   def getNamedItem(self, name):
+      """
+      Retrieves a node specified by name. Parameters:
+      name Name of a node to retrieve. Return Value A Node (of any
+      type) with the specified name, or None if the specified name
+      did not identify any node in the map.
+      """
+      if self._data.has_key(name): 
+         return self._data[name]
+      return None
+
+   """
+   create aliases for all above functions in the pythony way.
+   """
+   def _get_Length(self):
+      return self.getLength()
+      
+   def _get_NamedItem(self, name):
+      return self.getNamedItem(name)
+      
+class Attr(Node):
+   """
+   Attr interface - The Attr interface represents an attriubte in an
+   Element object. Attr objects inherit the Node Interface
+   """
+
+   def __init__(self, name, value, specified=1):
+      self.name = name
+      self.value = value
+      self.specified = specified
+        
+   def getNodeName(self):
+      """
+      The name of this node, depending on its type
+      """
+      return self.name
+
+   def getName(self):
+      """
+      Returns the name of this attribute.
+      """
+      return self.name
+    
+   def getNodeValue(self):
+      """
+      The value of this node, depending on its type
+      """
+      return self.value
+
+   def getNodeType(self):
+      """
+      A code representing the type of the node.
+      """
+      return ATTRIBUTE_NODE
+
+   def getSpecified(self):
+      """
+      If this attribute was explicitly given a value in the
+      original document, this is true; otherwise, it is false.
+      """
+      return self.specified
+        
+   """
+   create aliases for all above functions in the pythony way.
+   """
+   
+   def _get_NodeName(self):
+      return self.getNodeName()
+
+   def _get_Name(self):
+      return self.getName()
+    
+   def _get_NodeValue(self):
+      return self.getNodeValue()
+
+   def _get_NodeType(self):
+      return self.getNodeType()
+
+   def _get_Specified(self):
+      return self.getSpecified()
diff --git a/wxPython/samples/stxview/StructuredText/STNG.txt b/wxPython/samples/stxview/StructuredText/STNG.txt
new file mode 100644 (file)
index 0000000..40af179
--- /dev/null
@@ -0,0 +1,116 @@
+Using Structured Text
+
+  The goal of StructuredText is to make it possible to express
+  structured text using a relatively simple plain text format. Simple
+  structures, like bullets or headings are indicated through
+  conventions that are natural, for some definition of
+  "natural". Hierarchical structures are indicated through
+  indentation. The use of indentation to express hierarchical
+  structure is inspired by the Python programming language.
+
+  Use of StructuredText consists of one to three logical steps. In the
+  first step, a text string is converted to a network of objects using
+  the 'StructuredText.Basic' facility, as in the following
+  example::
+
+    raw=open("mydocument.txt").read()
+    import StructuredText
+    st=StructuredText.Basic(raw)
+
+  The output of 'StructuredText.Basic' is simply a
+  StructuredTextDocumemt object containing StructuredTextParagraph
+  objects arranged in a hierarchy. Paragraphs are delimited by strings
+  of two or more whitespace characters beginning and ending with
+  newline characters. Hierarchy is indicated by indentation. The
+  indentation of a paragraph is the minimum number of leading spaces
+  in a line containing non-white-space characters after converting tab
+  characters to spaces (assuming a tab stop every eight characters).
+
+  StructuredTextNode objects support the read-only subset of the
+  Document Object Model (DOM) API. It should be possible to process
+  'StructuredTextNode' hierarchies using XML tools such as XSLT.
+
+  The second step in using StructuredText is to apply additional
+  structuring rules based on text content. A variety of differentText
+  rules can be used. Typically, these are used to implement a
+  structured text language for producing documents, but any sort of
+  structured text language could be implemented in the second
+  step. For example, it is possible to use StructuredText to implement
+  structured text formats for representing structured data. The second
+  step, which could consist of multiple processing steps, is
+  performed by processing, or "coloring", the hierarchy of generic
+  StructuredTextParagraph objects into a network of more specialized
+  objects. Typically, the objects produced should also implement the DOM
+  API to allow processing with XML tools.
+
+  A document processor is provided to convert a StructuredTextDocument
+  object containing only StructuredStructuredTextParagraph objects
+  into a StructuredTextDocument object containing a richer collection
+  of objects such as bullets, headings, emphasis, and so on using
+  hints in the text. Hints are selected based on conventions of the
+  sort typically seen in electronic mail or news-group postings. It
+  should be noted, however, that these conventions are somewhat
+  culturally dependent, fortunately, the document processor is easily
+  customized to implement alternative rules. Here's an example of
+  using the DOC processor to convert the output of the previous example::
+
+    doc=StructuredText.Document(st)
+
+  The final step is to process the colored networks produced from the
+  second step to produce additional outputs. The final step could be
+  performed by Python programs, or by XML tools. A Python outputter is
+  provided for the document processor output that produces Hypertext Markup
+  Language (HTML) text::
+
+    html=StructuredText.HTML(doc)
+
+Customizing the document processor
+
+  The document processor is driven by two tables. The first table,
+  named 'paragraph_types', is a sequence of callable objects or method
+  names for coloring paragraphs. If a table entry is a string, then it
+  is the name of a method of the document processor to be used. For
+  each input paragraph, the objects in the table are called until one
+  returns a value (not 'None'). The value returned replaces the
+  original input paragraph in the output. If none of the objects in
+  the paragraph types table return a value, then a copy of the
+  original paragraph is used.  The new object returned by calling a
+  paragraph type should implement the ReadOnlyDOM,
+  StructuredTextColorizable, and StructuredTextSubparagraphContainer
+  interfaces. See the 'Document.py' source file for examples.
+
+  A paragraph type may return a list or tuple of replacement
+  paragraphs, this allowing a paragraph to be split into multiple
+  paragraphs. 
+
+  The second table, 'text_types', is a sequence of callable objects or
+  method names for coloring text. The callable objects in this table
+  are used in sequence to transform the input text into new text or
+  objects.  The callable objects are passed a string and return
+  nothing ('None') or a three-element tuple consisting of:
+
+    - a replacement object,
+
+    - a starting position, and
+
+    - an ending position
+
+  The text from the starting position is (logically) replaced with the
+  replacement object. The replacement object is typically an object
+  that implements that implements the ReadOnlyDOM, and
+  StructuredTextColorizable interfaces. The replacement object can
+  also be a string or a list of strings or objects. Replacement is
+  done from beginning to end and text after the replacement ending
+  position will be passed to the character type objects for processing.
+
+Example: adding wiki links
+
+  We want to add support for Wiki links. A Wiki link is a string of
+  text containing mixed-case letters, such that at least two of the
+  letters are upper case and such that the first letter is upper case.
+
+  
+
+     
+
+     
diff --git a/wxPython/samples/stxview/StructuredText/StructuredText.py b/wxPython/samples/stxview/StructuredText/StructuredText.py
new file mode 100644 (file)
index 0000000..a1b3fd0
--- /dev/null
@@ -0,0 +1,833 @@
+#! /usr/bin/env python -- # -*- python -*-
+##############################################################################
+# 
+# Zope Public License (ZPL) Version 1.0
+# -------------------------------------
+# 
+# Copyright (c) Digital Creations.  All rights reserved.
+# 
+# This license has been certified as Open Source(tm).
+# 
+# Redistribution and use in source and binary forms, with or without
+# modification, are permitted provided that the following conditions are
+# met:
+# 
+# 1. Redistributions in source code must retain the above copyright
+#    notice, this list of conditions, and the following disclaimer.
+# 
+# 2. Redistributions in binary form must reproduce the above copyright
+#    notice, this list of conditions, and the following disclaimer in
+#    the documentation and/or other materials provided with the
+#    distribution.
+# 
+# 3. Digital Creations requests that attribution be given to Zope
+#    in any manner possible. Zope includes a "Powered by Zope"
+#    button that is installed by default. While it is not a license
+#    violation to remove this button, it is requested that the
+#    attribution remain. A significant investment has been put
+#    into Zope, and this effort will continue if the Zope community
+#    continues to grow. This is one way to assure that growth.
+# 
+# 4. All advertising materials and documentation mentioning
+#    features derived from or use of this software must display
+#    the following acknowledgement:
+# 
+#      "This product includes software developed by Digital Creations
+#      for use in the Z Object Publishing Environment
+#      (http://www.zope.org/)."
+# 
+#    In the event that the product being advertised includes an
+#    intact Zope distribution (with copyright and license included)
+#    then this clause is waived.
+# 
+# 5. Names associated with Zope or Digital Creations must not be used to
+#    endorse or promote products derived from this software without
+#    prior written permission from Digital Creations.
+# 
+# 6. Modified redistributions of any form whatsoever must retain
+#    the following acknowledgment:
+# 
+#      "This product includes software developed by Digital Creations
+#      for use in the Z Object Publishing Environment
+#      (http://www.zope.org/)."
+# 
+#    Intact (re-)distributions of any official Zope release do not
+#    require an external acknowledgement.
+# 
+# 7. Modifications are encouraged but must be packaged separately as
+#    patches to official Zope releases.  Distributions that do not
+#    clearly separate the patches from the original work must be clearly
+#    labeled as unofficial distributions.  Modifications which do not
+#    carry the name Zope may be packaged in any form, as long as they
+#    conform to all of the clauses above.
+# 
+# 
+# Disclaimer
+# 
+#   THIS SOFTWARE IS PROVIDED BY DIGITAL CREATIONS ``AS IS'' AND ANY
+#   EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+#   IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+#   PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL DIGITAL CREATIONS OR ITS
+#   CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+#   SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+#   LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
+#   USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+#   ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+#   OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
+#   OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+#   SUCH DAMAGE.
+# 
+# 
+# This software consists of contributions made by Digital Creations and
+# many individuals on behalf of Digital Creations.  Specific
+# attributions are listed in the accompanying credits file.
+# 
+##############################################################################
+'''Structured Text Manipulation
+
+Parse a structured text string into a form that can be used with 
+structured formats, like html.
+
+Structured text is text that uses indentation and simple
+symbology to indicate the structure of a document.  
+
+A structured string consists of a sequence of paragraphs separated by
+one or more blank lines.  Each paragraph has a level which is defined
+as the minimum indentation of the paragraph.  A paragraph is a
+sub-paragraph of another paragraph if the other paragraph is the last
+preceding paragraph that has a lower level.
+
+Special symbology is used to indicate special constructs:
+
+- A single-line paragraph whose immediately succeeding paragraphs are lower
+  level is treated as a header.
+
+- A paragraph that begins with a '-', '*', or 'o' is treated as an
+  unordered list (bullet) element.
+
+- A paragraph that begins with a sequence of digits followed by a
+  white-space character is treated as an ordered list element.
+
+- A paragraph that begins with a sequence of sequences, where each
+  sequence is a sequence of digits or a sequence of letters followed
+  by a period, is treated as an ordered list element.
+
+- A paragraph with a first line that contains some text, followed by
+  some white-space and '--' is treated as
+  a descriptive list element. The leading text is treated as the
+  element title.
+
+- Sub-paragraphs of a paragraph that ends in the word 'example' or the
+  word 'examples', or '::' is treated as example code and is output as is.
+
+- Text enclosed single quotes (with white-space to the left of the
+  first quote and whitespace or puctuation to the right of the second quote)
+  is treated as example code.
+
+- Text surrounded by '*' characters (with white-space to the left of the
+  first '*' and whitespace or puctuation to the right of the second '*')
+  is emphasized.
+
+- Text surrounded by '**' characters (with white-space to the left of the
+  first '**' and whitespace or puctuation to the right of the second '**')
+  is made strong.
+
+- Text surrounded by '_' underscore characters (with whitespace to the left 
+  and whitespace or punctuation to the right) is made underlined.
+
+- Text encloded by double quotes followed by a colon, a URL, and concluded
+  by punctuation plus white space, *or* just white space, is treated as a
+  hyper link. For example:
+
+    "Zope":http://www.zope.org/ is ...
+
+  Is interpreted as '<a href="http://www.zope.org/">Zope</a> is ....'
+  Note: This works for relative as well as absolute URLs.
+
+- Text enclosed by double quotes followed by a comma, one or more spaces,
+  an absolute URL and concluded by punctuation plus white space, or just
+  white space, is treated as a hyper link. For example: 
+
+    "mail me", mailto:amos@digicool.com.
+
+  Is interpreted as '<a href="mailto:amos@digicool.com">mail me</a>.' 
+
+- Text enclosed in brackets which consists only of letters, digits,
+  underscores and dashes is treated as hyper links within the document.
+  For example:
+    
+    As demonstrated by Smith [12] this technique is quite effective.
+
+  Is interpreted as '... by Smith <a href="#12">[12]</a> this ...'. Together
+  with the next rule this allows easy coding of references or end notes.
+
+- Text enclosed in brackets which is preceded by the start of a line, two
+  periods and a space is treated as a named link. For example:
+
+    .. [12] "Effective Techniques" Smith, Joe ... 
+
+  Is interpreted as '<a name="12">[12]</a> "Effective Techniques" ...'.
+  Together with the previous rule this allows easy coding of references or
+  end notes. 
+
+
+- A paragraph that has blocks of text enclosed in '||' is treated as a
+  table. The text blocks correspond to table cells and table rows are
+  denoted by newlines. By default the cells are center aligned. A cell
+  can span more than one column by preceding a block of text with an
+  equivalent number of cell separators '||'. Newlines and '|' cannot
+  be a part of the cell text. For example:
+
+      |||| **Ingredients** ||
+      || *Name* || *Amount* ||
+      ||Spam||10||
+      ||Eggs||3||
+
+  is interpreted as::
+
+    <TABLE BORDER=1 CELLPADDING=2>
+     <TR>
+      <TD ALIGN=CENTER COLSPAN=2> <strong>Ingredients</strong> </TD>
+     </TR>
+     <TR>
+      <TD ALIGN=CENTER COLSPAN=1> <em>Name</em> </TD>
+      <TD ALIGN=CENTER COLSPAN=1> <em>Amount</em> </TD>
+     </TR>
+     <TR>
+      <TD ALIGN=CENTER COLSPAN=1>Spam</TD>
+      <TD ALIGN=CENTER COLSPAN=1>10</TD>
+     </TR>
+     <TR>
+      <TD ALIGN=CENTER COLSPAN=1>Eggs</TD>
+      <TD ALIGN=CENTER COLSPAN=1>3</TD>
+     </TR>
+    </TABLE>
+
+    
+$Id$'''
+#     Copyright 
+#
+#       Copyright 1996 Digital Creations, L.C., 910 Princess Anne
+#       Street, Suite 300, Fredericksburg, Virginia 22401 U.S.A. All
+#       rights reserved.  Copyright in this software is owned by DCLC,
+#       unless otherwise indicated. Permission to use, copy and
+#       distribute this software is hereby granted, provided that the
+#       above copyright notice appear in all copies and that both that
+#       copyright notice and this permission notice appear. Note that
+#       any product, process or technology described in this software
+#       may be the subject of other Intellectual Property rights
+#       reserved by Digital Creations, L.C. and are not licensed
+#       hereunder.
+#
+#     Trademarks 
+#
+#       Digital Creations & DCLC, are trademarks of Digital Creations, L.C..
+#       All other trademarks are owned by their respective companies. 
+#
+#     No Warranty 
+#
+#       The software is provided "as is" without warranty of any kind,
+#       either express or implied, including, but not limited to, the
+#       implied warranties of merchantability, fitness for a particular
+#       purpose, or non-infringement. This software could include
+#       technical inaccuracies or typographical errors. Changes are
+#       periodically made to the software; these changes will be
+#       incorporated in new editions of the software. DCLC may make
+#       improvements and/or changes in this software at any time
+#       without notice.
+#
+#     Limitation Of Liability 
+#
+#       In no event will DCLC be liable for direct, indirect, special,
+#       incidental, economic, cover, or consequential damages arising
+#       out of the use of or inability to use this software even if
+#       advised of the possibility of such damages. Some states do not
+#       allow the exclusion or limitation of implied warranties or
+#       limitation of liability for incidental or consequential
+#       damages, so the above limitation or exclusion may not apply to
+#       you.
+#  
+#
+# If you have questions regarding this software,
+# contact:
+#
+#   Jim Fulton, jim@digicool.com
+#
+#   (540) 371-6909
+#
+# $Log$
+# Revision 1.1  2001/03/10 05:07:20  RD
+# Added some simple sample apps
+#
+# Revision 1.27  2000/04/21 13:38:10  jim
+# Added closing list tags. Woo hoo!
+#
+# Revision 1.26  2000/03/14 17:22:04  brian
+# Allow ~ in hrefs.
+#
+# Revision 1.25  2000/02/17 00:53:24  klm
+# HTML._str(): We were getting preformatted examples rendered twice,
+# second time without preformatting.  Problem was a missing 'continue'
+# in one of the cases.
+#
+# Revision 1.24  1999/12/13 16:32:48  klm
+# Incorporated pavlos christoforou's mods to handle simple tables.  From
+# his web page at http://www.zope.org/Members/gaaros/StructuredText:
+#
+#   Structured Text module with table support
+#
+#   A paragraph that has blocks of text enclosed in '||' is treated as a
+#   table. The text blocks correspond to table cells and table rows are
+#   denoted by newlines. By default the cells are center aligned. You can
+#   change the defaults by modifying the CELL,ROW and TABLE class
+#   attributes in class Table. A cell can span more than one column by
+#   preceding a block of text with an equivalent number of cell separators
+#   '||'. Newlines and '|' cannot be a part of the cell text. If you need
+#   newlines use <BR>. For example:
+#
+#        |||| **Ingredients** ||
+#        || *Name* || *Amount* ||
+#        ||Spam||10||
+#        ||Eggs||3||
+#
+# Revision 1.23  1999/08/03 20:49:05  jim
+# Fixed to allow list elements to introduce examples.
+#
+# Restructured _str using continue to avoid excessive nesting.
+#
+# Revision 1.22  1999/08/02 22:01:28  jim
+# Fixed a bunch of bugs introduced by making ts_regex actually thread
+# safe.
+#
+# Also localized a bunch of regular expressions
+# using "static" variables (aka always default arguments).
+#
+# Revision 1.21  1999/08/02 13:26:52  jim
+# paragraph_divider needs to be a regular (thread-unsafe) regex
+# since it gets passed to ts_regex.split, which is thread-safe
+# and wants to use regs.
+#
+# Revision 1.20  1999/07/21 13:33:59  jim
+# untabified.
+#
+# Revision 1.19  1999/07/15 16:43:15  jim
+# Checked in Scott Robertson's thread-safety fixes.
+#
+# Revision 1.18  1999/03/24 00:03:18  klm
+# Provide for relative links, eg <a href="file_in_same_dir">whatever</a>,
+# as:
+#
+#   "whatever", :file_in_same_dir
+#
+# or
+#
+#   "whatever"::file_in_same_dir
+#
+# .__init__(): relax the second gsub, using a '*' instead of a '+', so
+# the stuff before the ':' can be missing, and also do postprocessing so
+# any resulting '<a href=":file_in_same_dir">'s have the superfluous ':'
+# removed.  *Seems* good!
+#
+# Revision 1.17  1999/03/12 23:21:39  klm
+# Gratuituous checkin to test my cvs *update* logging hook.
+#
+# Revision 1.16  1999/03/12 17:12:12  klm
+# Added support for underlined elements, in the obvious way (and
+# included an entry in the module docstring for it).
+#
+# Added an entry in the module docstring describing what i *guess* is
+# the criterion for identifying header elements.  (I'm going to have to
+# delve into and understand the framework a bit better before *knowing*
+# this is the case.)
+#
+# Revision 1.15  1999/03/11 22:40:18  klm
+# Handle links that include '#' named links.
+#
+# Revision 1.14  1999/03/11 01:35:19  klm
+# Fixed a small typo, and refined the module docstring link example, in
+# order to do a checkin to exercise the CVS repository mirroring.  Might
+# as well include my last checkin message, with some substantial stuff:
+#
+# Links are now recognized whether or not the candidate strings are
+# terminated with punctuation before the trailing whitespace.  The old
+# form - trailing punctuation then whitespace - is preserved, but the
+# punctuation is now unnecessary.
+#
+# The regular expressions are a bit more complicated, but i've factored
+# out the common parts and but them in variables with suggestive names,
+# which may make them easier to understand.
+#
+# Revision 1.13  1999/03/11 00:49:57  klm
+# Links are now recognized whether or not the candidate strings are
+# terminated with punctuation before the trailing whitespace.  The old
+# form - trailing punctuation then whitespace - is preserved, but the
+# punctuation is now unnecessary.
+#
+# The regular expressions are a bit more complicated, but i've factored
+# out the common parts and but them in variables with suggestive names,
+# which may make them easier to understand.
+#
+# Revision 1.12  1999/03/10 00:15:46  klm
+# Committing with version 1.0 of the license.
+#
+# Revision 1.11  1999/02/08 18:13:12  klm
+# Trival checkin (spelling fix "preceedeing" -> "preceding" and similar)
+# to see what pitfalls my environment presents to accomplishing a
+# successful checkin.  (It turns out that i can't do it from aldous because
+# the new version of cvs doesn't support the '-t' and '-f' options in the
+# cvswrappers file...)
+#
+# Revision 1.10  1998/12/29 22:30:43  amos
+# Improved doc string to describe hyper link and references capabilities.
+#
+# Revision 1.9  1998/12/04 20:15:31  jim
+# Detabification and new copyright.
+#
+# Revision 1.8  1998/02/27 18:45:22  jim
+# Various updates, including new indentation utilities.
+#
+# Revision 1.7  1997/12/12 15:39:54  jim
+# Added level as argument for html_with_references.
+#
+# Revision 1.6  1997/12/12 15:27:25  jim
+# Added additional pattern matching for HTML references.
+#
+# Revision 1.5  1997/03/08 16:01:03  jim
+# Moved code to recognize: "foo bar", url.
+# into object initializer, so it gets applied in all cases.
+#
+# Revision 1.4  1997/02/17 23:36:35  jim
+# Added support for "foo title", http:/foohost/foo
+#
+# Revision 1.3  1996/12/06 15:57:37  jim
+# Fixed bugs in character tags.
+#
+# Added -t command-line option to generate title if:
+#
+#    - The first paragraph is one line (i.e. a heading) and
+#
+#    - All other paragraphs are indented.
+#
+# Revision 1.2  1996/10/28 13:56:02  jim
+# Fixed bug in ordered lists.
+# Added option for either HTML-style headings or descriptive-list style
+# headings.
+#
+# Revision 1.1  1996/10/23 14:00:45  jim
+# *** empty log message ***
+#
+#
+#
+
+import ts_regex, regex
+from ts_regex import gsub
+from string import split, join, strip, find
+
+def untabify(aString,
+             indent_tab=ts_regex.compile('\(\n\|^\)\( *\)\t').search_group,
+             ):
+    '''\
+    Convert indentation tabs to spaces.
+    '''
+    result=''
+    rest=aString
+    while 1:
+        ts_results = indent_tab(rest, (1,2))
+        if ts_results:
+            start, grps = ts_results
+            lnl=len(grps[0])
+            indent=len(grps[1])
+            result=result+rest[:start]
+            rest="\n%s%s" % (' ' * ((indent/8+1)*8),
+                             rest[start+indent+1+lnl:])
+        else:
+            return result+rest
+
+def indent(aString, indent=2):
+    """Indent a string the given number of spaces"""
+    r=split(untabify(aString),'\n')
+    if not r: return ''
+    if not r[-1]: del r[-1]
+    tab=' '*level
+    return "%s%s\n" % (tab,join(r,'\n'+tab))
+
+def reindent(aString, indent=2, already_untabified=0):
+    "reindent a block of text, so that the minimum indent is as given"
+
+    if not already_untabified: aString=untabify(aString)
+
+    l=indent_level(aString)[0]
+    if indent==l: return aString
+
+    r=[]
+
+    append=r.append
+
+    if indent > l:
+        tab=' ' * (indent-l)
+        for s in split(aString,'\n'): append(tab+s)
+    else:
+        l=l-indent
+        for s in split(aString,'\n'): append(s[l:])
+
+    return join(r,'\n')
+
+def indent_level(aString,
+                 indent_space=ts_regex.compile('\n\( *\)').search_group,
+                 ):
+    '''\
+    Find the minimum indentation for a string, not counting blank lines.
+    '''
+    start=0
+    text='\n'+aString
+    indent=l=len(text)
+    while 1:
+
+        ts_results = indent_space(text, (1,2), start)
+        if ts_results:
+            start, grps = ts_results
+            i=len(grps[0])
+            start=start+i+1
+            if start < l and text[start] != '\n':       # Skip blank lines
+                if not i: return (0,aString)
+                if i < indent: indent = i
+        else:
+            return (indent,aString)
+
+def paragraphs(list,start):
+    l=len(list)
+    level=list[start][0]
+    i=start+1
+    while i < l and list[i][0] > level: i=i+1
+    return i-1-start
+
+def structure(list):
+    if not list: return []
+    i=0
+    l=len(list)
+    r=[]
+    while i < l:
+        sublen=paragraphs(list,i)
+        i=i+1
+        r.append((list[i-1][1],structure(list[i:i+sublen])))
+        i=i+sublen
+    return r
+
+
+class Table:
+    CELL='  <TD ALIGN=CENTER COLSPAN=%i>%s</TD>\n'
+    ROW=' <TR>\n%s </TR>\n'
+    TABLE='\n<TABLE BORDER=1 CELLPADDING=2>\n%s</TABLE>'
+    
+    def create(self,aPar,td=ts_regex.compile(
+        '[ \t\n]*||\([^\0|]*\)').match_group):
+        '''parses a table and returns nested list representing the
+        table'''
+        self.table=[]
+        text=filter(None,split(aPar,'\n'))
+        for line in text:
+            row=[]
+            while 1:
+                pos=td(line,(1,))
+                if not pos:return 0
+                row.append(pos[1])
+                if pos[0]==len(line):break
+                line=line[pos[0]:]
+            self.table.append(row)
+        return 1
+
+    def html(self):
+        '''Creates an HTML representation of table'''
+        htmltable=[]
+        for row in self.table:
+            htmlrow=[]
+            colspan=1
+            for cell in row:
+                if cell=='':
+                    colspan=colspan+1
+                    continue
+                else:
+                    htmlrow.append(self.CELL%(colspan,cell))
+                    colspan=1
+            htmltable.append(self.ROW%join(htmlrow,''))
+        return self.TABLE%join(htmltable,'')
+
+optional_trailing_punctuation = '\(,\|\([.:?;]\)\)?'
+trailing_space = '\([\0- ]\)'
+not_punctuation_or_whitespace = "[^-,.?:\0- ]"
+table=Table()
+
+class StructuredText:
+
+    """Model text as structured collection of paragraphs.
+
+    Structure is implied by the indentation level.
+
+    This class is intended as a base classes that do actual text
+    output formatting.
+    """
+
+    def __init__(self, aStructuredString, level=0,
+                 paragraph_divider=regex.compile('\(\n *\)+\n'),
+                 ):
+        '''Convert a structured text string into a structured text object.
+
+        Aguments:
+
+          aStructuredString -- The string to be parsed.
+          level -- The level of top level headings to be created.
+        '''
+
+        aStructuredString = gsub(
+            '\"\([^\"\0]+\)\":'         # title: <"text":>
+            + ('\([-:a-zA-Z0-9_,./?=@#~]+%s\)'
+               % not_punctuation_or_whitespace)
+            + optional_trailing_punctuation
+            + trailing_space,
+            '<a href="\\2">\\1</a>\\4\\5\\6',
+            aStructuredString)
+
+        aStructuredString = gsub(
+            '\"\([^\"\0]+\)\",[\0- ]+'            # title: <"text", >
+            + ('\([a-zA-Z]*:[-:a-zA-Z0-9_,./?=@#~]*%s\)'
+               % not_punctuation_or_whitespace)
+            + optional_trailing_punctuation
+            + trailing_space,
+            '<a href="\\2">\\1</a>\\4\\5\\6',
+            aStructuredString)
+
+        protoless = find(aStructuredString, '<a href=":')
+        if protoless != -1:
+            aStructuredString = gsub('<a href=":', '<a href="',
+                                     aStructuredString)
+
+        self.level=level
+        paragraphs=ts_regex.split(untabify(aStructuredString),
+                                  paragraph_divider)
+        paragraphs=map(indent_level,paragraphs)
+
+        self.structure=structure(paragraphs)
+
+
+    def __str__(self):
+        return str(self.structure)
+
+
+ctag_prefix="\([\0- (]\|^\)"
+ctag_suffix="\([\0- ,.:;!?)]\|$\)"
+ctag_middle="[%s]\([^\0- %s][^%s]*[^\0- %s]\|[^%s]\)[%s]"
+ctag_middl2="[%s][%s]\([^\0- %s][^%s]*[^\0- %s]\|[^%s]\)[%s][%s]"
+        
+def ctag(s,
+         em=regex.compile(
+             ctag_prefix+(ctag_middle % (("*",)*6) )+ctag_suffix),
+         strong=regex.compile(
+             ctag_prefix+(ctag_middl2 % (("*",)*8))+ctag_suffix),
+         under=regex.compile(
+             ctag_prefix+(ctag_middle % (("_",)*6) )+ctag_suffix),
+         code=regex.compile(
+             ctag_prefix+(ctag_middle % (("\'",)*6))+ctag_suffix),
+         ):
+    if s is None: s=''
+    s=gsub(strong,'\\1<strong>\\2</strong>\\3',s)
+    s=gsub(under, '\\1<u>\\2</u>\\3',s)
+    s=gsub(code,  '\\1<code>\\2</code>\\3',s)
+    s=gsub(em,    '\\1<em>\\2</em>\\3',s)
+    return s    
+
+class HTML(StructuredText):
+
+    '''\
+    An HTML structured text formatter.
+    '''\
+
+    def __str__(self,
+                extra_dl=regex.compile("</dl>\n<dl>"),
+                extra_ul=regex.compile("</ul>\n<ul>"),
+                extra_ol=regex.compile("</ol>\n<ol>"),
+                ):
+        '''\
+        Return an HTML string representation of the structured text data.
+
+        '''
+        s=self._str(self.structure,self.level)
+        s=gsub(extra_dl,'\n',s)
+        s=gsub(extra_ul,'\n',s)
+        s=gsub(extra_ol,'\n',s)
+        return s
+
+    def ul(self, before, p, after):
+        if p: p="<p>%s</p>" % strip(ctag(p))
+        return ('%s<ul><li>%s\n%s\n</li></ul>\n'
+                % (before,p,after))
+
+    def ol(self, before, p, after):
+        if p: p="<p>%s</p>" % strip(ctag(p))
+        return ('%s<ol><li>%s\n%s\n</li></ol>\n'
+                % (before,p,after))
+
+    def dl(self, before, t, d, after):
+        return ('%s<dl><dt>%s</dt><dd><p>%s</p>\n%s\n</dd></dl>\n'
+                % (before,ctag(t),ctag(d),after))
+
+    def head(self, before, t, level, d):
+        if level > 0 and level < 6:
+            return ('%s<h%d>%s</h%d>\n%s\n'
+                    % (before,level,strip(ctag(t)),level,d))
+            
+        t="<p><strong>%s</strong><p>" % strip(ctag(t))
+        return ('%s<dl><dt>%s\n</dt><dd>%s\n</dd></dl>\n'
+                % (before,t,d))
+
+    def normal(self,before,p,after):
+        return '%s<p>%s</p>\n%s\n' % (before,ctag(p),after)
+
+    def pre(self,structure,tagged=0):
+        if not structure: return ''
+        if tagged:
+            r=''
+        else:
+            r='<PRE>\n'
+        for s in structure:
+            r="%s%s\n\n%s" % (r,html_quote(s[0]),self.pre(s[1],1))
+        if not tagged: r=r+'</PRE>\n'
+        return r
+    
+    def table(self,before,table,after):
+        return '%s<p>%s</p>\n%s\n' % (before,ctag(table),after)
+    
+    def _str(self,structure,level,
+             # Static
+             bullet=ts_regex.compile('[ \t\n]*[o*-][ \t\n]+\([^\0]*\)'
+                                     ).match_group,
+             example=ts_regex.compile('[\0- ]examples?:[\0- ]*$'
+                                      ).search,
+             dl=ts_regex.compile('\([^\n]+\)[ \t]+--[ \t\n]+\([^\0]*\)'
+                                 ).match_group,
+             nl=ts_regex.compile('\n').search,
+             ol=ts_regex.compile(
+                 '[ \t]*\(\([0-9]+\|[a-zA-Z]+\)[.)]\)+[ \t\n]+\([^\0]*\|$\)'
+                 ).match_group,
+             olp=ts_regex.compile('[ \t]*([0-9]+)[ \t\n]+\([^\0]*\|$\)'
+                                  ).match_group,
+             ):
+        r=''
+        for s in structure:
+
+            ts_results = bullet(s[0], (1,))
+            if ts_results:
+                p = ts_results[1]
+                if s[0][-2:]=='::' and s[1]: ps=self.pre(s[1])
+                else: ps=self._str(s[1],level)
+                r=self.ul(r,p,ps)
+                continue
+            ts_results = ol(s[0], (3,))
+            if ts_results:
+                p = ts_results[1]
+                if s[0][-2:]=='::' and s[1]: ps=self.pre(s[1])
+                else: ps=self._str(s[1],level)
+                r=self.ol(r,p,ps)
+                continue
+            ts_results = olp(s[0], (1,))
+            if ts_results:
+                p = ts_results[1]
+                if s[0][-2:]=='::' and s[1]: ps=self.pre(s[1])
+                else: ps=self._str(s[1],level)
+                r=self.ol(r,p,ps)
+                continue
+            ts_results = dl(s[0], (1,2))
+            if ts_results:
+                t,d = ts_results[1]
+                r=self.dl(r,t,d,self._str(s[1],level))
+                continue
+            if example(s[0]) >= 0 and s[1]:
+                # Introduce an example, using pre tags:
+                r=self.normal(r,s[0],self.pre(s[1]))
+                continue
+            if s[0][-2:]=='::' and s[1]:
+                # Introduce an example, using pre tags:
+                r=self.normal(r,s[0][:-1],self.pre(s[1]))
+                continue
+            if table.create(s[0]):
+                ## table support.
+                r=self.table(r,table.html(),self._str(s[1],level))
+                continue
+            else:
+
+                if nl(s[0]) < 0 and s[1] and s[0][-1:] != ':':
+                    # Treat as a heading
+                    t=s[0]
+                    r=self.head(r,t,level,
+                                self._str(s[1],level and level+1))
+                else:
+                    r=self.normal(r,s[0],self._str(s[1],level))
+        return r
+        
+
+def html_quote(v,
+               character_entities=(
+                       (regex.compile('&'), '&amp;'),
+                       (regex.compile("<"), '&lt;' ),
+                       (regex.compile(">"), '&gt;' ),
+                       (regex.compile('"'), '&quot;')
+                       )): #"
+        text=str(v)
+        for re,name in character_entities:
+            text=gsub(re,name,text)
+        return text
+
+def html_with_references(text, level=1):
+    text = gsub(
+        '[\0\n].. \[\([-_0-9_a-zA-Z-]+\)\]',
+        '\n  <a name="\\1">[\\1]</a>',
+        text)
+    
+    text = gsub(
+        '\([\0- ,]\)\[\([0-9_a-zA-Z-]+\)\]\([\0- ,.:]\)',
+        '\\1<a href="#\\2">[\\2]</a>\\3',
+        text)
+    
+    text = gsub(
+        '\([\0- ,]\)\[\([^]]+\)\.html\]\([\0- ,.:]\)',
+        '\\1<a href="\\2.html">[\\2]</a>\\3',
+        text)
+
+    return HTML(text,level=level)
+    
+
+def main():
+    import sys, getopt
+
+    opts,args=getopt.getopt(sys.argv[1:],'tw')
+
+    if args:
+        [infile]=args
+        s=open(infile,'r').read()
+    else:
+        s=sys.stdin.read()
+
+    if opts:
+
+        if filter(lambda o: o[0]=='-w', opts):
+            print 'Content-Type: text/html\n'
+
+        if s[:2]=='#!':
+            s=ts_regex.sub('^#![^\n]+','',s)
+
+        r=ts_regex.compile('\([\0-\n]*\n\)')
+        ts_results = r.match_group(s, (1,))
+        if ts_results:
+            s=s[len(ts_results[1]):]
+        s=str(html_with_references(s))
+        if s[:4]=='<h1>':
+            t=s[4:find(s,'</h1>')]
+            s='''<html><head><title>%s</title>
+            </head><body>
+            %s
+            </body></html>
+            ''' % (t,s)
+        print s
+    else:
+        print html_with_references(s)
+
+if __name__=="__main__": main()
diff --git a/wxPython/samples/stxview/StructuredText/Zwiki.py b/wxPython/samples/stxview/StructuredText/Zwiki.py
new file mode 100644 (file)
index 0000000..c08ea51
--- /dev/null
@@ -0,0 +1,158 @@
+#!/usr/bin/python
+##############################################################################
+# 
+# Zope Public License (ZPL) Version 1.0
+# -------------------------------------
+# 
+# Copyright (c) Digital Creations.  All rights reserved.
+# 
+# This license has been certified as Open Source(tm).
+# 
+# Redistribution and use in source and binary forms, with or without
+# modification, are permitted provided that the following conditions are
+# met:
+# 
+# 1. Redistributions in source code must retain the above copyright
+#    notice, this list of conditions, and the following disclaimer.
+# 
+# 2. Redistributions in binary form must reproduce the above copyright
+#    notice, this list of conditions, and the following disclaimer in
+#    the documentation and/or other materials provided with the
+#    distribution.
+# 
+# 3. Digital Creations requests that attribution be given to Zope
+#    in any manner possible. Zope includes a "Powered by Zope"
+#    button that is installed by default. While it is not a license
+#    violation to remove this button, it is requested that the
+#    attribution remain. A significant investment has been put
+#    into Zope, and this effort will continue if the Zope community
+#    continues to grow. This is one way to assure that growth.
+# 
+# 4. All advertising materials and documentation mentioning
+#    features derived from or use of this software must display
+#    the following acknowledgement:
+# 
+#      "This product includes software developed by Digital Creations
+#      for use in the Z Object Publishing Environment
+#      (http://www.zope.org/)."
+# 
+#    In the event that the product being advertised includes an
+#    intact Zope distribution (with copyright and license included)
+#    then this clause is waived.
+# 
+# 5. Names associated with Zope or Digital Creations must not be used to
+#    endorse or promote products derived from this software without
+#    prior written permission from Digital Creations.
+# 
+# 6. Modified redistributions of any form whatsoever must retain
+#    the following acknowledgment:
+# 
+#      "This product includes software developed by Digital Creations
+#      for use in the Z Object Publishing Environment
+#      (http://www.zope.org/)."
+# 
+#    Intact (re-)distributions of any official Zope release do not
+#    require an external acknowledgement.
+# 
+# 7. Modifications are encouraged but must be packaged separately as
+#    patches to official Zope releases.  Distributions that do not
+#    clearly separate the patches from the original work must be clearly
+#    labeled as unofficial distributions.  Modifications which do not
+#    carry the name Zope may be packaged in any form, as long as they
+#    conform to all of the clauses above.
+# 
+# 
+# Disclaimer
+# 
+#   THIS SOFTWARE IS PROVIDED BY DIGITAL CREATIONS ``AS IS'' AND ANY
+#   EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+#   IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+#   PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL DIGITAL CREATIONS OR ITS
+#   CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+#   SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+#   LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
+#   USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+#   ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+#   OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
+#   OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+#   SUCH DAMAGE.
+# 
+# 
+# This software consists of contributions made by Digital Creations and
+# many individuals on behalf of Digital Creations.  Specific
+# attributions are listed in the accompanying credits file.
+# 
+##############################################################################
+
+from Html   import HTML
+from string import split
+from ST     import DOC
+import re
+
+"""
+This is the new structured text type.
+"""
+
+class Zwiki_Title:
+   def __init__(self,str=''):
+      self.expr1   = re.compile('([A-Z]+[A-Z]+[a-zA-Z]*)').search
+      self.expr2   = re.compile('([A-Z]+[a-z]+[A-Z]+[a-zA-Z]*)').search
+      self.str    = [str]
+      self.typ    = "Zwiki_Title"
+
+   def type(self):
+      return '%s' % self.typ
+
+   def string(self):
+      return self.str
+
+   def __getitem__(self,index):
+      return self.str[index]
+
+   def __call__(self,raw_string,subs):
+
+      """
+      The raw_string is checked to see if it matches the rules
+      for this structured text expression. If the raw_string does,
+      it is parsed for the sub-string which matches and a doc_inner_link
+      instance is returned whose string is the matching substring.
+      If raw_string does not match, nothing is returned.
+      """
+
+      if self.expr1(raw_string):
+         start,end               = self.expr1(raw_string).span()
+         result                  = Zwiki_Title(raw_string[start:end])
+         result.start,result.end = self.expr1(raw_string).span()
+         return result
+      elif self.expr2(raw_string):
+         start,end               = self.expr2(raw_string).span()
+         result                  = Zwiki_Title(raw_string[start:end])
+         result.start,result.end = self.expr2(raw_string).span()
+         return result
+      else:
+         return None
+
+   def span(self):
+      return self.start,self.end
+
+class Zwiki_doc(DOC):
+
+   def __init__(self):
+      DOC.__init__(self)
+      """
+      Add the new type to self.types
+      """
+      self.types.append(Zwiki_Title())
+
+class Zwiki_parser(HTML):
+   def __init__(self):
+      HTML.__init__(self)
+      self.types["Zwiki_Title"] = self.zwiki_title
+
+   def zwiki_title(self,object):
+      result = ""
+      for x in object.string():
+         result = result + x
+      result = "<a href=%s>%s</a>" % (result,result)
+      #result = "<dtml-wikiname %s>" % result
+      self.string = self.string + result
diff --git a/wxPython/samples/stxview/StructuredText/__init__.py b/wxPython/samples/stxview/StructuredText/__init__.py
new file mode 100644 (file)
index 0000000..65e6f75
--- /dev/null
@@ -0,0 +1,112 @@
+##############################################################################
+# 
+# Zope Public License (ZPL) Version 1.0
+# -------------------------------------
+# 
+# Copyright (c) Digital Creations.  All rights reserved.
+# 
+# This license has been certified as Open Source(tm).
+# 
+# Redistribution and use in source and binary forms, with or without
+# modification, are permitted provided that the following conditions are
+# met:
+# 
+# 1. Redistributions in source code must retain the above copyright
+#    notice, this list of conditions, and the following disclaimer.
+# 
+# 2. Redistributions in binary form must reproduce the above copyright
+#    notice, this list of conditions, and the following disclaimer in
+#    the documentation and/or other materials provided with the
+#    distribution.
+# 
+# 3. Digital Creations requests that attribution be given to Zope
+#    in any manner possible. Zope includes a "Powered by Zope"
+#    button that is installed by default. While it is not a license
+#    violation to remove this button, it is requested that the
+#    attribution remain. A significant investment has been put
+#    into Zope, and this effort will continue if the Zope community
+#    continues to grow. This is one way to assure that growth.
+# 
+# 4. All advertising materials and documentation mentioning
+#    features derived from or use of this software must display
+#    the following acknowledgement:
+# 
+#      "This product includes software developed by Digital Creations
+#      for use in the Z Object Publishing Environment
+#      (http://www.zope.org/)."
+# 
+#    In the event that the product being advertised includes an
+#    intact Zope distribution (with copyright and license included)
+#    then this clause is waived.
+# 
+# 5. Names associated with Zope or Digital Creations must not be used to
+#    endorse or promote products derived from this software without
+#    prior written permission from Digital Creations.
+# 
+# 6. Modified redistributions of any form whatsoever must retain
+#    the following acknowledgment:
+# 
+#      "This product includes software developed by Digital Creations
+#      for use in the Z Object Publishing Environment
+#      (http://www.zope.org/)."
+# 
+#    Intact (re-)distributions of any official Zope release do not
+#    require an external acknowledgement.
+# 
+# 7. Modifications are encouraged but must be packaged separately as
+#    patches to official Zope releases.  Distributions that do not
+#    clearly separate the patches from the original work must be clearly
+#    labeled as unofficial distributions.  Modifications which do not
+#    carry the name Zope may be packaged in any form, as long as they
+#    conform to all of the clauses above.
+# 
+# 
+# Disclaimer
+# 
+#   THIS SOFTWARE IS PROVIDED BY DIGITAL CREATIONS ``AS IS'' AND ANY
+#   EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+#   IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+#   PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL DIGITAL CREATIONS OR ITS
+#   CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+#   SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+#   LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
+#   USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+#   ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+#   OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
+#   OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+#   SUCH DAMAGE.
+# 
+# 
+# This software consists of contributions made by Digital Creations and
+# many individuals on behalf of Digital Creations.  Specific
+# attributions are listed in the accompanying credits file.
+# 
+##############################################################################
+
+import HTMLClass, DocumentClass
+import ClassicDocumentClass
+from StructuredText import html_with_references, HTML
+from ST import Basic
+import DocBookClass
+import HTMLWithImages
+import DocumentWithImages
+
+ClassicHTML=HTML
+HTMLNG=HTMLClass.HTMLClass()
+
+def HTML(src, level=0, type=type, StringType=type('')):
+    if type(src) is StringType:
+        return ClassicHTML(src, level)
+    return HTMLNG(src, level)
+
+Classic=ClassicDocumentClass.DocumentClass()
+Document=DocumentClass.DocumentClass()
+DocumentWithImages=DocumentWithImages.DocumentWithImages()
+HTMLWithImages=HTMLWithImages.HTMLWithImages()
+
+DocBookBook=DocBookClass.DocBookBook
+DocBookChapter=DocBookClass.DocBookChapter()
+DocBookChapterWithFigures=DocBookClass.DocBookChapterWithFigures()
+DocBookArticle=DocBookClass.DocBookArticle()
+
+
diff --git a/wxPython/samples/stxview/StructuredText/ts_regex.py b/wxPython/samples/stxview/StructuredText/ts_regex.py
new file mode 100644 (file)
index 0000000..1471eb2
--- /dev/null
@@ -0,0 +1,215 @@
+##############################################################################
+# 
+# Zope Public License (ZPL) Version 1.0
+# -------------------------------------
+# 
+# Copyright (c) Digital Creations.  All rights reserved.
+# 
+# This license has been certified as Open Source(tm).
+# 
+# Redistribution and use in source and binary forms, with or without
+# modification, are permitted provided that the following conditions are
+# met:
+# 
+# 1. Redistributions in source code must retain the above copyright
+#    notice, this list of conditions, and the following disclaimer.
+# 
+# 2. Redistributions in binary form must reproduce the above copyright
+#    notice, this list of conditions, and the following disclaimer in
+#    the documentation and/or other materials provided with the
+#    distribution.
+# 
+# 3. Digital Creations requests that attribution be given to Zope
+#    in any manner possible. Zope includes a "Powered by Zope"
+#    button that is installed by default. While it is not a license
+#    violation to remove this button, it is requested that the
+#    attribution remain. A significant investment has been put
+#    into Zope, and this effort will continue if the Zope community
+#    continues to grow. This is one way to assure that growth.
+# 
+# 4. All advertising materials and documentation mentioning
+#    features derived from or use of this software must display
+#    the following acknowledgement:
+# 
+#      "This product includes software developed by Digital Creations
+#      for use in the Z Object Publishing Environment
+#      (http://www.zope.org/)."
+# 
+#    In the event that the product being advertised includes an
+#    intact Zope distribution (with copyright and license included)
+#    then this clause is waived.
+# 
+# 5. Names associated with Zope or Digital Creations must not be used to
+#    endorse or promote products derived from this software without
+#    prior written permission from Digital Creations.
+# 
+# 6. Modified redistributions of any form whatsoever must retain
+#    the following acknowledgment:
+# 
+#      "This product includes software developed by Digital Creations
+#      for use in the Z Object Publishing Environment
+#      (http://www.zope.org/)."
+# 
+#    Intact (re-)distributions of any official Zope release do not
+#    require an external acknowledgement.
+# 
+# 7. Modifications are encouraged but must be packaged separately as
+#    patches to official Zope releases.  Distributions that do not
+#    clearly separate the patches from the original work must be clearly
+#    labeled as unofficial distributions.  Modifications which do not
+#    carry the name Zope may be packaged in any form, as long as they
+#    conform to all of the clauses above.
+# 
+# 
+# Disclaimer
+# 
+#   THIS SOFTWARE IS PROVIDED BY DIGITAL CREATIONS ``AS IS'' AND ANY
+#   EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+#   IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+#   PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL DIGITAL CREATIONS OR ITS
+#   CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+#   SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+#   LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
+#   USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+#   ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+#   OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
+#   OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+#   SUCH DAMAGE.
+# 
+# 
+# This software consists of contributions made by Digital Creations and
+# many individuals on behalf of Digital Creations.  Specific
+# attributions are listed in the accompanying credits file.
+# 
+##############################################################################
+"""Provide a thread-safe interface to regex
+"""
+import regex, regsub #, Sync
+from regex import *
+from regsub import split, sub, gsub, splitx, capwords
+
+try: 
+    import thread
+except:
+    class allocate_lock:
+        def acquire(*args): pass
+        def release(*args): pass
+
+else:
+    class SafeFunction:
+        _l=thread.allocate_lock()
+        _a=_l.acquire
+        _r=_l.release
+
+        def __init__(self, f):
+            self._f=f
+
+        def __call__(self, *args, **kw):
+            self._a()
+            try: return apply(self._f, args, kw)
+            finally: self._r()
+
+    split=SafeFunction(split)
+    sub=SafeFunction(sub)
+    gsub=SafeFunction(gsub)
+    splitx=SafeFunction(splitx)
+    capwords=SafeFunction(capwords)
+
+    allocate_lock=thread.allocate_lock
+
+class compile:
+
+    _r=None
+    groupindex=None
+
+    def __init__(self, *args):
+        self._r=r=apply(regex.compile,args)
+        self._init(r)
+
+    def _init(self, r):
+        lock=allocate_lock()
+        self.__a=lock.acquire
+        self.__r=lock.release
+        self.translate=r.translate
+        self.givenpat=r.givenpat
+        self.realpat=r.realpat
+
+    def match(self, string, pos=0):
+        self.__a()
+        try: return self._r.match(string, pos)
+        finally: self.__r()
+
+    def search(self, string, pos=0):
+        self.__a()
+        try: return self._r.search(string, pos)
+        finally: self.__r()
+        
+    def search_group(self, str, group, pos=0):
+        """Search a string for a pattern.
+
+        If the pattern was not found, then None is returned,
+        otherwise, the location where the pattern was found,
+        as well as any specified group are returned.
+        """
+        self.__a()
+        try:
+            r=self._r
+            l=r.search(str, pos)
+            if l < 0: return None
+            return l, apply(r.group, group)
+        finally: self.__r()
+
+    def match_group(self, str, group, pos=0):
+        """Match a pattern against a string
+
+        If the string does not match the pattern, then None is
+        returned, otherwise, the length of the match, as well
+        as any specified group are returned.
+        """
+        self.__a()
+        try:
+            r=self._r
+            l=r.match(str, pos)
+            if l < 0: return None
+            return l, apply(r.group, group)
+        finally: self.__r()
+
+    def search_regs(self, str, pos=0):
+        """Search a string for a pattern.
+
+        If the pattern was not found, then None is returned,
+        otherwise, the 'regs' attribute of the expression is
+        returned.
+        """
+        self.__a()
+        try:
+            r=self._r
+            r.search(str, pos)
+            return r.regs
+        finally: self.__r()
+
+    def match_regs(self, str, pos=0):
+        """Match a pattern against a string
+
+        If the string does not match the pattern, then None is
+        returned, otherwise, the 'regs' attribute of the expression is
+        returned.
+        """
+        self.__a()
+        try:
+            r=self._r
+            r.match(str, pos)
+            return r.regs
+        finally: self.__r()
+
+class symcomp(compile):
+
+    def __init__(self, *args):
+        self._r=r=apply(regex.symcomp,args)
+        self._init(r)
+        self.groupindex=r.groupindex
+
+
+
+
+        
diff --git a/wxPython/samples/stxview/stxview.py b/wxPython/samples/stxview/stxview.py
new file mode 100644 (file)
index 0000000..4599f97
--- /dev/null
@@ -0,0 +1,201 @@
+#!/usr/bin/env python
+#----------------------------------------------------------------------
+
+import sys, os
+import StructuredText
+from wxPython.wx import *
+
+
+USE_WXHTML = 1
+
+
+if not USE_WXHTML:
+    try: # try to load the IE ActiveX control
+        from wxPython.lib.activexwrapper import MakeActiveXClass
+        import win32com.client.gencache
+        browserModule = win32com.client.gencache.EnsureModule(
+            "{EAB22AC0-30C1-11CF-A7EB-0000C05BAE0B}", 0, 1, 1)
+    except:
+        USE_WXHTML = 1
+
+if not USE_WXHTML:
+    BrowserClass = MakeActiveXClass(browserModule.WebBrowser)
+
+    class MyHtmlWindow(BrowserClass):
+        def SetPage(self, html):
+            import tempfile
+            filename = tempfile.mktemp('.html')
+            f = open(filename, 'w')
+            f.write(html)
+            f.close()
+            self.Navigate(os.path.abspath(filename))
+            self.filename = filename
+
+        def OnDocumentComplete(self, pDisp=None, URL=None):
+            os.unlink(self.filename)
+
+else:
+    from wxPython.html import *
+    MyHtmlWindow = wxHtmlWindow
+
+
+
+class StxFrame(wxFrame):
+    title = "StxViewer"
+    def __init__(self, stxFile):
+        wxFrame.__init__(self, None, -1, self.title, size=(650, 700),
+                         style=wxDEFAULT_FRAME_STYLE|wxNO_FULL_REPAINT_ON_RESIZE)
+
+        ##self.CreateStatusBar()
+
+        menu = wxMenu()
+        menu.Append(10, "&Open\tCtrl-O", "Open a Structured Text file")
+        EVT_MENU(self, 10, self.OnOpen)
+        menu.Append(20, "&Close", "Close the current file")
+        EVT_MENU(self, 20, self.OnClose)
+        menu.Append(30, "&Save\tCtrl-S", "Save the current file")
+        EVT_MENU(self, 30, self.OnSave)
+        menu.Append(40, "Save &as", "Save the current file to a new name")
+        EVT_MENU(self, 40, self.OnSaveAs)
+        menu.Append(45, "Save as &html", "Save the current file as HTML")
+        EVT_MENU(self, 45, self.OnSaveAsHTML)
+        menu.AppendSeparator()
+        menu.Append(50, "&Refresh\tCtrl-R", "Reload the file from disk")
+        EVT_MENU(self, 50, self.OnRefresh)
+        menu.AppendSeparator()
+        menu.Append(60, "E&xit\tCtrl-X", "Close the application")
+        EVT_MENU(self, 60, self.OnExit)
+
+
+        menuBar = wxMenuBar()
+        menuBar.Append(menu, "&File")
+        self.SetMenuBar(menuBar)
+
+
+        nb = wxNotebook(self, -1)
+        EVT_NOTEBOOK_PAGE_CHANGED(self, -1, self.OnPageChanged)
+
+        self.htmlWin = MyHtmlWindow(nb, -1)
+        nb.AddPage(self.htmlWin, "View")
+
+        self.editWin = wxTextCtrl(nb, -1, "", style=wxTE_MULTILINE)
+        self.editWin.SetFont(wxFont(10, wxTELETYPE, wxNORMAL, wxNORMAL))
+        nb.AddPage(self.editWin, "Edit")
+
+        self.viewHtml = wxTextCtrl(nb, -1, "", style=wxTE_MULTILINE|wxTE_READONLY)
+        self.viewHtml.SetFont(wxFont(10, wxTELETYPE, wxNORMAL, wxNORMAL))
+        nb.AddPage(self.viewHtml, "HTML")
+
+        self.LoadStxFile(stxFile)
+
+
+    def LoadStxFile(self, stxFile):
+        self.file = stxFile
+        if stxFile is not None:
+            text = open(stxFile).read()
+            self.SetTitle(self.title + ': ' + stxFile)
+        else:
+            text = ""
+            self.SetTitle(self.title)
+        self.LoadStxText(text)
+
+
+    def LoadStxText(self, text):
+        # Old ST
+        html = str(StructuredText.html_with_references(text))
+
+        # NG Version
+        #st = StructuredText.Basic(text)
+        #doc = StructuredText.Document(st)
+        #html = StructuredText.HTML(doc)
+
+        self.htmlWin.SetPage(html)
+        self.editWin.SetValue(text)
+        self.viewHtml.SetValue(html)
+        self.html = html
+
+
+    def OnPageChanged(self, evt):
+        if evt.GetOldSelection() == 1:  # if it was on the edit page
+            text = self.editWin.GetValue()
+            self.LoadStxText(text)
+
+
+    def OnOpen(self, evt):
+        dlg = wxFileDialog(self, defaultDir=os.getcwd(),
+                           wildcard = "STX files (*.stx)|*.stx|"
+                                      "Text files (*.txt)|*.txt|"
+                                      "All files (*.*)|*.*",
+                           style=wxOPEN)
+        if dlg.ShowModal() == wxID_OK:
+            self.LoadStxFile(dlg.GetPath())
+        dlg.Destroy()
+
+
+
+    def OnClose(self, evt):
+        self.LoadStxFile(None)
+
+
+    def OnSave(self, evt):
+        if not self.file:
+            self.OnSaveAs(evt)
+        else:
+            text = self.editWin.GetValue()
+            open(self.file, 'w').write(text)
+            self.LoadStxFile(self.file)
+
+
+    def OnSaveAs(self, evt):
+        dlg = wxFileDialog(self, "Save as...", defaultDir=os.getcwd(),
+                           wildcard = "STX files (*.stx)|*.stx|"
+                                      "Text files (*.txt)|*.txt|"
+                                      "All files (*.*)|*.*",
+                           style=wxSAVE)
+        if dlg.ShowModal() == wxID_OK:
+            file = dlg.GetPath()
+            text = self.editWin.GetValue()
+            open(file, 'w').write(text)
+            self.LoadStxFile(file)
+        dlg.Destroy()
+
+
+    def OnSaveAsHTML(self, evt):
+        dlg = wxFileDialog(self, "Save as...", defaultDir=os.getcwd(),
+                           wildcard = "HTML files (*.html)|*.html|"
+                                      "All files (*.*)|*.*",
+                           style=wxSAVE)
+        if dlg.ShowModal() == wxID_OK:
+            file = dlg.GetPath()
+            text = self.editWin.GetValue()
+            self.LoadStxText(text)
+            open(file, 'w').write(self.html)
+        dlg.Destroy()
+
+
+
+    def OnRefresh(self, evt):
+        self.LoadStxFile(self.file)
+
+
+    def OnExit(self, evt):
+        self.Close(true)
+
+
+
+
+
+app = wxPySimpleApp()
+wxInitAllImageHandlers()
+
+if len(sys.argv) > 1:
+    filename = sys.argv[1]
+else:
+    filename = None
+
+frame = StxFrame(filename)
+frame.Show(true)
+app.MainLoop()
+
+
+
diff --git a/wxPython/samples/stxview/test.stx b/wxPython/samples/stxview/test.stx
new file mode 100644 (file)
index 0000000..20f53b2
--- /dev/null
@@ -0,0 +1,127 @@
+Structured Text Manipulation
+
+  Parse a structured text string into a form that can be used with
+  structured formats, like html.
+
+  Structured text is text that uses indentation and simple
+  symbology to indicate the structure of a document.
+
+  A structured string consists of a sequence of paragraphs separated by
+  one or more blank lines.  Each paragraph has a level which is defined
+  as the minimum indentation of the paragraph.  A paragraph is a
+  sub-paragraph of another paragraph if the other paragraph is the last
+  preceding paragraph that has a lower level.
+
+Special symbology is used to indicate special constructs:
+
+    - A single-line paragraph whose immediately succeeding paragraphs are lower
+    level is treated as a header.
+
+    - A paragraph that begins with a '-', '*', or 'o' is treated as an
+    unordered list (bullet) element.
+
+    - A paragraph that begins with a sequence of digits followed by a
+    white-space character is treated as an ordered list element.
+
+    - A paragraph that begins with a sequence of sequences, where each
+    sequence is a sequence of digits or a sequence of letters followed
+    by a period, is treated as an ordered list element.  If the sequence is
+    made up of lower-case i's and v's, a lower-case roman-numeral list is
+    generated.  If the sequence is made up of upper-case I's and V's, an
+    upper-case roman-numeral list is generated.  If the sequence is made
+    up of other lower case letters (typically a,b,c) a lowercase alphabetic
+    list is generated.  If the sequence is made of of other upper case
+    letters (typically, A,B,C) an uppercase alphabetic list is generated.
+    If the sequence is something else (typically, 1,2,3), a arabic-numeral
+    list is generated.
+
+    - A paragraph with a first line that contains some text, followed by
+    some white-space and '--' is treated as a descriptive list element.
+    The leading text is treated as the element title.
+
+    - Sub-paragraphs of a paragraph that ends in the word 'example' or the
+    word 'examples', or '::' is treated as example code and is output as is.
+
+    - Text enclosed single quotes (with white-space to the left of the
+    first quote and whitespace or puctuation to the right of the second quote)
+    is treated as example code.
+
+    - Text surrounded by '*' characters (with white-space to the left of the
+    first '*' and whitespace or puctuation to the right of the second '*')
+    is *emphasized*.
+
+    - Text surrounded by '**' characters (with white-space to the left of the
+    first '**' and whitespace or puctuation to the right of the second '**')
+    is made **strong**.
+
+    - Text surrounded by '_' underscore characters (with whitespace to the left
+    and whitespace or punctuation to the right) is made _underlined_.
+
+    - Text encloded by double quotes followed by a colon, a URL, and concluded
+    by punctuation plus white space, *or* just white space, is treated as a
+    hyper link. For example:
+
+    '"Zope":http://www.zope.org/ is ...'
+
+    Is interpreted as '<a href="http://www.zope.org/">Zope</a> is ...'
+    Note: This works for relative as well as absolute URLs.
+
+    - Text enclosed by double quotes followed by a comma, one or more spaces,
+    an absolute URL and concluded by punctuation plus white space, or just
+    white space, is treated as a hyper link. For example:
+
+    "mail me", mailto:amos@digicool.com.
+
+    Is interpreted as '<a href="mailto:amos@digicool.com">mail me</a>.'
+
+    - Text enclosed in brackets which consists only of letters, digits,
+    underscores and dashes is treated as hyper links within the document.
+    For example:
+
+    As demonstrated by Smith [12] this technique is quite effective.
+
+    Is interpreted as '... by Smith <a href="#12">[12]</a> this ...'. Together
+    with the next rule this allows easy coding of references or end notes.
+
+    - Text enclosed in brackets which is preceded by the start of a line, two
+    periods and a space is treated as a named link. For example:
+
+    .. [12] "Effective Techniques" Smith, Joe ...
+
+    Is interpreted as '<a name="12">[12]</a> "Effective Techniques" ...'.
+    Together with the previous rule this allows easy coding of references or
+    end notes.
+
+
+    - A paragraph that has blocks of text enclosed in '||' is treated as a
+    table. The text blocks correspond to table cells and table rows are
+    denoted by newlines. By default the cells are center aligned. A cell
+    can span more than one column by preceding a block of text with an
+    equivalent number of cell separators '||'. Newlines and '|' cannot
+    be a part of the cell text. For example:
+
+    |||| **Ingredients** ||
+    || *Name* || *Amount* ||
+    ||Spam||10||
+    ||Eggs||3||
+
+    is interpreted as::
+
+    <TABLE BORDER=1 CELLPADDING=2>
+    <TR>
+    <TD ALIGN=CENTER COLSPAN=2> <strong>Ingredients</strong> </TD>
+    </TR>
+    <TR>
+    <TD ALIGN=CENTER COLSPAN=1> <em>Name</em> </TD>
+    <TD ALIGN=CENTER COLSPAN=1> <em>Amount</em> </TD>
+    </TR>
+    <TR>
+    <TD ALIGN=CENTER COLSPAN=1>Spam</TD>
+    <TD ALIGN=CENTER COLSPAN=1>10</TD>
+    </TR>
+    <TR>
+    <TD ALIGN=CENTER COLSPAN=1>Eggs</TD>
+    <TD ALIGN=CENTER COLSPAN=1>3</TD>
+    </TR>
+    </TABLE>
+
diff --git a/wxPython/samples/wxProject/README.txt b/wxPython/samples/wxProject/README.txt
new file mode 100644 (file)
index 0000000..ea9e5e9
--- /dev/null
@@ -0,0 +1,3 @@
+This sample comes from an IBM developerWorks article at
+http://www-106.ibm.com/developerworks/library/l-wxpy/index.html
+
diff --git a/wxPython/samples/wxProject/wxProject.py b/wxPython/samples/wxProject/wxProject.py
new file mode 100644 (file)
index 0000000..03b6df1
--- /dev/null
@@ -0,0 +1,286 @@
+#!/bin/python
+import sys, os
+from   wxPython.wx import *
+from   string import *
+
+# Process the command line.  Not much to do;
+# just get the name of the project file if it's given. Simple.
+projfile = 'Unnamed'
+if len(sys.argv) > 1:
+   projfile = sys.argv[1]
+
+
+def MsgBox (window, string):
+    dlg=wxMessageDialog(window, string, 'wxProject', wxOK)
+    dlg.ShowModal()
+    dlg.Destroy()
+
+class main_window(wxFrame):
+    def __init__(self, parent, id, title):
+        wxFrame.__init__(self, parent, -1, title, size = (500, 500),
+                         style=wxDEFAULT_FRAME_STYLE|wxNO_FULL_REPAINT_ON_RESIZE)
+
+
+        # ------------------------------------------------------------------------------------
+        # Set up menu bar for the program.
+        # ------------------------------------------------------------------------------------
+        self.mainmenu = wxMenuBar()   # Create menu bar.
+        mainwindow = self
+
+        menu=wxMenu()                                 # Make a menu (will be the Project menu)
+
+        exitID=wxNewId()                              # Make a new ID for a menu entry.
+        menu.Append(exitID, '&Open', 'Open project')  # Name the ID by adding it to the menu.
+        EVT_MENU(self, exitID, self.OnProjectOpen)    # Create and assign a menu event.
+        exitID=wxNewId()
+        menu.Append(exitID, '&New', 'New project')
+        EVT_MENU(self, exitID, self.OnProjectNew)
+        exitID=wxNewId()
+        menu.Append(exitID, 'E&xit', 'Exit program')
+        EVT_MENU(self, exitID, self.OnProjectExit)
+
+        self.mainmenu.Append (menu, '&Project')       # Add the project menu to the menu bar.
+
+
+        menu=wxMenu()                                 # Make a menu (will be the File menu)
+
+        exitID=wxNewId()
+        menu.Append(exitID, '&Add', 'Add file to project')
+        EVT_MENU(self, exitID, self.OnFileAdd)
+        exitID=wxNewId()
+        menu.Append(exitID, '&Remove', 'Remove file from project')
+        EVT_MENU(self, exitID, self.OnFileRemove)
+        exitID=wxNewId()
+        menu.Append(exitID, '&Open', 'Open file for editing')
+        EVT_MENU(self, exitID, self.OnFileOpen)
+        exitID=wxNewId()
+        menu.Append(exitID, '&Save', 'Save file')
+        EVT_MENU(self, exitID, self.OnFileSave)
+
+        self.mainmenu.Append (menu, '&File')          # Add the file menu to the menu bar.
+
+        self.SetMenuBar (self.mainmenu)               # Attach the menu bar to the window.
+
+
+        # ------------------------------------------------------------------------------------
+        # Create the splitter window.
+        # ------------------------------------------------------------------------------------
+        splitter = wxSplitterWindow (self, -1, style=wxNO_3D|wxSP_3D)
+        splitter.SetMinimumPaneSize (1)
+
+        # ------------------------------------------------------------------------------------
+        # Create the tree on the left.
+        # ------------------------------------------------------------------------------------
+        tID = wxNewId()
+        self.tree = wxTreeCtrl (splitter, tID, style=wxTR_HAS_BUTTONS |
+                                   wxTR_EDIT_LABELS |
+                                   wxTR_HAS_VARIABLE_ROW_HEIGHT)
+        EVT_TREE_BEGIN_LABEL_EDIT(self.tree, tID, self.OnTreeLabelEdit)
+        EVT_TREE_END_LABEL_EDIT(self.tree, tID, self.OnTreeLabelEditEnd)
+        EVT_TREE_ITEM_ACTIVATED(self.tree, tID, self.OnTreeItemActivated)
+
+        # ------------------------------------------------------------------------------------
+        # Create the editor on the right.
+        # ------------------------------------------------------------------------------------
+        self.editor = wxTextCtrl(splitter, -1, style=wxTE_MULTILINE)
+        self.editor.Enable (0)
+
+        # ------------------------------------------------------------------------------------
+        # Install the tree and the editor.
+        # ------------------------------------------------------------------------------------
+        splitter.SplitVertically (self.tree, self.editor)
+        splitter.SetSashPosition (180, true)
+
+        self.Show(true)
+
+        # Some global state variables.
+        self.projectdirty = false
+
+    # ----------------------------------------------------------------------------------------
+    # Some nice little handlers.
+    # ----------------------------------------------------------------------------------------
+
+
+    def project_open(self, project_file):
+        try:
+            input = open (project_file, 'r')
+
+            self.tree.DeleteAllItems()
+
+            self.project_file = project_file
+            name = replace (input.readline(), "\n", "")
+            self.SetTitle (name)
+            self.root = self.tree.AddRoot(name)
+            self.activeitem = self.root
+            for line in input.readlines():
+                self.tree.AppendItem (self.root, replace(line, "\n", ""))
+            input.close
+            self.tree.Expand (self.root)
+
+            self.editor.Clear()
+            self.editor.Enable (false)
+
+            self.projectdirty = false
+        except IOError:
+            pass
+
+    def project_save(self):
+        try:
+            output = open (self.project_file, 'w+')
+            output.write (self.tree.GetItemText (self.root) + "\n")
+
+            count = self.tree.GetChildrenCount (self.root)
+            iter = 0
+            child = ''
+            for i in range(count):
+               if i == 0:
+                  (child,iter) = self.tree.GetFirstChild(self.root,iter)
+               else:
+                  (child,iter) = self.tree.GetNextChild(self.root,iter)
+               output.write (self.tree.GetItemText(child) + "\n")
+            output.close()
+            self.projectdirty = false
+        except IOError:
+            dlg_m = wxMessageDialog (self, 'There was an error saving the project file.',
+                                     'Error!', wxOK)
+            dlg_m.ShowModal()
+            dlg_m.Destroy()
+
+    # ----------------------------------------------------------------------------------------
+    # Event handlers from here on out.
+    # ----------------------------------------------------------------------------------------
+
+    def OnProjectOpen(self, event):
+        open_it = true
+        if self.projectdirty:
+           dlg=wxMessageDialog(self, 'The project has been changed.  Save?', 'wxProject',
+                               wxYES_NO | wxCANCEL)
+           result = dlg.ShowModal()
+           if result == wxID_YES:
+              self.project_save()
+           if result == wxID_CANCEL:
+              open_it = false
+           dlg.Destroy()
+        if open_it:
+           dlg = wxFileDialog(self, "Choose a project to open", ".", "", "*.wxp", wxOPEN)
+           if dlg.ShowModal() == wxID_OK:
+              self.project_open(dlg.GetPath())
+           dlg.Destroy()
+
+    def OnProjectNew(self, event):
+        open_it = true
+        if self.projectdirty:
+           dlg=wxMessageDialog(self, 'The project has been changed.  Save?', 'wxProject',
+                               wxYES_NO | wxCANCEL)
+           result = dlg.ShowModal()
+           if result == wxID_YES:
+              self.project_save()
+           if result == wxID_CANCEL:
+              open_it = false
+           dlg.Destroy()
+
+        if open_it:
+           dlg = wxTextEntryDialog (self, "Name for new project:", "New Project",
+                                    "New project", wxOK | wxCANCEL)
+           if dlg.ShowModal() == wxID_OK:
+               newproj = dlg.GetValue()
+               dlg.Destroy()
+               dlg = wxFileDialog (self, "Place to store new project", ".", "", "*.wxp",
+                                   wxSAVE)
+               if dlg.ShowModal() == wxID_OK:
+                  try:
+                     proj = open (dlg.GetPath(), 'w')
+                     proj.write (newproj + "\n")
+                     proj.close()
+                     self.project_open (dlg.GetPath())
+                  except IOError:
+                     dlg_m = wxMessageDialog (self,
+                                              'There was an error saving the new project file.',
+                                              'Error!', wxOK)
+                     dlg_m.ShowModal()
+                     dlg_m.Destroy()
+        dlg.Destroy()
+
+    def OnProjectExit(self, event):
+        close = true
+        if self.projectdirty:
+           dlg=wxMessageDialog(self, 'The project has been changed.  Save?', 'wxProject',
+                               wxYES_NO | wxCANCEL)
+           result = dlg.ShowModal()
+           if result == wxID_YES:
+              self.project_save()
+           if result == wxID_CANCEL:
+              close = false
+           dlg.Destroy()
+        if close:
+           self.Close()
+
+    def OnFileAdd(self, event):
+        dlg = wxFileDialog (self, "Choose a file to add", ".", "", "*.*", wxOPEN)
+        if dlg.ShowModal() == wxID_OK:
+           path = os.path.split(dlg.GetPath())
+           self.tree.AppendItem (self.root, path[1])
+           self.tree.Expand (self.root)
+           self.project_save()
+
+    def OnFileRemove(self, event):
+        item = self.tree.GetSelection()
+        if item != self.root:
+           self.tree.Delete (item)
+           self.project_save()
+
+    def OnFileOpen(self, event):
+        item = self.tree.GetSelection()
+
+    def OnFileSave(self, event):
+        if self.activeitem != self.root:
+           self.editor.SaveFile (self.tree.GetItemText (self.activeitem))
+
+
+    def OnTreeLabelEdit(self, event):
+        item=event.GetItem()
+        if item != self.root:
+           event.Veto()
+
+    def OnTreeLabelEditEnd(self, event):
+        self.projectdirty = true
+
+    def OnTreeItemActivated(self, event):
+        go_ahead = true
+        if self.activeitem != self.root:
+           if self.editor.IsModified():
+              dlg=wxMessageDialog(self, 'The edited file has changed.  Save it?',
+                                  'wxProject', wxYES_NO | wxCANCEL)
+              result = dlg.ShowModal()
+              if result == wxID_YES:
+                 self.editor.SaveFile (self.tree.GetItemText (self.activeitem))
+              if result == wxID_CANCEL:
+                 go_ahead = false
+              dlg.Destroy()
+           if go_ahead:
+              self.tree.SetItemBold (self.activeitem, 0)
+
+        if go_ahead:
+           item=event.GetItem()
+           self.activeitem = item
+           if item != self.root:
+              self.tree.SetItemBold (item, 1)
+              self.editor.Enable (1)
+              self.editor.LoadFile (self.tree.GetItemText(item))
+              self.editor.SetInsertionPoint (0)
+              self.editor.SetFocus()
+           else:
+              self.editor.Clear()
+              self.editor.Enable (0)
+
+class App(wxApp):
+    def OnInit(self):
+        frame = main_window(None, -1, "wxProject - " + projfile)
+        self.SetTopWindow(frame)
+        if (projfile != 'Unnamed'):
+            frame.project_open (projfile)
+        return true
+
+app = App(0)
+app.MainLoop()
+