From pedronis at codespeak.net Sun Oct 1 03:34:40 2006 From: pedronis at codespeak.net (pedronis at codespeak.net) Date: Sun, 1 Oct 2006 03:34:40 +0200 (CEST) Subject: [pypy-svn] r32775 - pypy/dist/pypy/jit/codegen/i386/test Message-ID: <20061001013440.4CBD510053@code0.codespeak.net> Author: pedronis Date: Sun Oct 1 03:34:33 2006 New Revision: 32775 Modified: pypy/dist/pypy/jit/codegen/i386/test/test_ri386genop.py Log: make the tests run again Modified: pypy/dist/pypy/jit/codegen/i386/test/test_ri386genop.py ============================================================================== --- pypy/dist/pypy/jit/codegen/i386/test/test_ri386genop.py (original) +++ pypy/dist/pypy/jit/codegen/i386/test/test_ri386genop.py Sun Oct 1 03:34:33 2006 @@ -7,7 +7,10 @@ from ctypes import c_void_p, cast, CFUNCTYPE, c_int -GENOP_POLICY = MixLevelAnnotatorPolicy(None) # XXX clean up +# XXX clean up +class PseudoAnnhelper(object): + rtyper = None +GENOP_POLICY = MixLevelAnnotatorPolicy(PseudoAnnhelper()) # ____________________________________________________________ From pedronis at codespeak.net Sun Oct 1 04:04:45 2006 From: pedronis at codespeak.net (pedronis at codespeak.net) Date: Sun, 1 Oct 2006 04:04:45 +0200 (CEST) Subject: [pypy-svn] r32776 - in pypy/dist/pypy/rpython: . lltypesystem Message-ID: <20061001020445.DCEDD10053@code0.codespeak.net> Author: pedronis Date: Sun Oct 1 04:04:43 2006 New Revision: 32776 Modified: pypy/dist/pypy/rpython/llinterp.py pypy/dist/pypy/rpython/lltypesystem/lloperation.py Log: some such op is needed by the i386 codegen machinary right now Modified: pypy/dist/pypy/rpython/llinterp.py ============================================================================== --- pypy/dist/pypy/rpython/llinterp.py (original) +++ pypy/dist/pypy/rpython/llinterp.py Sun Oct 1 04:04:43 2006 @@ -739,6 +739,10 @@ assert lltype.typeOf(value) == typ getattr(addr, str(typ).lower())[offset] = value + # ______ for the JIT ____________ + def op_call_boehm_gc_alloc(self): + raise NotImplementedError("call_boehm_gc_alloc") + # ____________________________________________________________ # Overflow-detecting variants Modified: pypy/dist/pypy/rpython/lltypesystem/lloperation.py ============================================================================== --- pypy/dist/pypy/rpython/lltypesystem/lloperation.py (original) +++ pypy/dist/pypy/rpython/lltypesystem/lloperation.py Sun Oct 1 04:04:43 2006 @@ -342,6 +342,10 @@ 'cast_adr_to_int': LLOp(canfold=True), 'cast_int_to_adr': LLOp(canfold=True), # not implemented in llinterp + # __________ used by the JIT ________ + + 'call_boehm_gc_alloc': LLOp(canraise=(MemoryError,)), + # __________ GC operations __________ 'gc__collect': LLOp(canunwindgc=True), From xoraxax at codespeak.net Sun Oct 1 12:00:06 2006 From: xoraxax at codespeak.net (xoraxax at codespeak.net) Date: Sun, 1 Oct 2006 12:00:06 +0200 (CEST) Subject: [pypy-svn] r32778 - pypy/dist/pypy/translator/goal Message-ID: <20061001100006.586E410053@code0.codespeak.net> Author: xoraxax Date: Sun Oct 1 12:00:05 2006 New Revision: 32778 Modified: pypy/dist/pypy/translator/goal/bench-cronjob.py Log: Oops, that was the wrong place to change the name (it is done automatically obviously). Modified: pypy/dist/pypy/translator/goal/bench-cronjob.py ============================================================================== --- pypy/dist/pypy/translator/goal/bench-cronjob.py (original) +++ pypy/dist/pypy/translator/goal/bench-cronjob.py Sun Oct 1 12:00:05 2006 @@ -122,10 +122,6 @@ realname += "-" + features if backend == 'llvm': #create llvm exectutable from the current source - if features: - revname = revision + "-" + features - else: - revname = revision compile_llvm_variants(revname) elif os.path.exists(basename): #copy executable pypy = open(basename, 'rb').read() From xoraxax at codespeak.net Sun Oct 1 12:05:24 2006 From: xoraxax at codespeak.net (xoraxax at codespeak.net) Date: Sun, 1 Oct 2006 12:05:24 +0200 (CEST) Subject: [pypy-svn] r32780 - pypy/dist/pypy/translator/goal Message-ID: <20061001100524.9012210053@code0.codespeak.net> Author: xoraxax Date: Sun Oct 1 12:05:24 2006 New Revision: 32780 Modified: pypy/dist/pypy/translator/goal/bench-cronjob.py Log: Minor typo. Modified: pypy/dist/pypy/translator/goal/bench-cronjob.py ============================================================================== --- pypy/dist/pypy/translator/goal/bench-cronjob.py (original) +++ pypy/dist/pypy/translator/goal/bench-cronjob.py Sun Oct 1 12:05:24 2006 @@ -122,7 +122,7 @@ realname += "-" + features if backend == 'llvm': #create llvm exectutable from the current source - compile_llvm_variants(revname) + compile_llvm_variants(revision) elif os.path.exists(basename): #copy executable pypy = open(basename, 'rb').read() if len(pypy) > 0: From xoraxax at codespeak.net Sun Oct 1 12:13:22 2006 From: xoraxax at codespeak.net (xoraxax at codespeak.net) Date: Sun, 1 Oct 2006 12:13:22 +0200 (CEST) Subject: [pypy-svn] r32781 - pypy/dist/pypy/translator/goal Message-ID: <20061001101322.B0B5D10053@code0.codespeak.net> Author: xoraxax Date: Sun Oct 1 12:13:21 2006 New Revision: 32781 Modified: pypy/dist/pypy/translator/goal/bench-cronjob.py Log: Added an underscore to pass the objspace option to the target. Modified: pypy/dist/pypy/translator/goal/bench-cronjob.py ============================================================================== --- pypy/dist/pypy/translator/goal/bench-cronjob.py (original) +++ pypy/dist/pypy/translator/goal/bench-cronjob.py Sun Oct 1 12:13:21 2006 @@ -158,7 +158,7 @@ def main(backends=[]): if backends == []: #_ prefix means target specific option #backends = """llvm at c@c--gc=framework at c--_thread@c--stackless at c--gc=framework--cc=c++ at c--cc=c++""".split('@') - backends = """llvm at c@c--gc=framework at c--_thread@c--stackless at c--gc=framework--cc=c++ at c--cc=c++ at c--objspace-std-withstrdict@c--profopt='-c "from richards import *;main(iterations=1)"'""".split('@') + backends = """llvm at c@c--gc=framework at c--_thread@c--stackless at c--gc=framework--cc=c++ at c--cc=c++ at c--_objspace-std-withstrdict@c--profopt='-c "from richards import *;main(iterations=1)"'""".split('@') #backends = 'llvm c c--gc=framework c--_thread c--stackless'.split() #backends = 'llvm c c--gc=framework c--new-stackless c--_thread'.split() #backends = 'llvm c c--stackless c--_thread c--stackless--_thread'.split() From arigo at codespeak.net Sun Oct 1 12:35:13 2006 From: arigo at codespeak.net (arigo at codespeak.net) Date: Sun, 1 Oct 2006 12:35:13 +0200 (CEST) Subject: [pypy-svn] r32783 - pypy/dist/pypy/config Message-ID: <20061001103513.B075810053@code0.codespeak.net> Author: arigo Date: Sun Oct 1 12:35:12 2006 New Revision: 32783 Modified: pypy/dist/pypy/config/pypyoption.py Log: Comment out print. It confuses tests that check the output of running py.py. Modified: pypy/dist/pypy/config/pypyoption.py ============================================================================== --- pypy/dist/pypy/config/pypyoption.py (original) +++ pypy/dist/pypy/config/pypyoption.py Sun Oct 1 12:35:12 2006 @@ -1,5 +1,5 @@ import py -print py.magic.autopath().dirpath().dirpath().dirpath() +#print py.magic.autopath().dirpath().dirpath().dirpath() py.std.sys.path.insert(0, py.magic.autopath().dirpath().dirpath().dirpath()) from pypy.config.config import OptionDescription, BoolOption, IntOption from pypy.config.config import ChoiceOption, to_optparse, Config From arigo at codespeak.net Sun Oct 1 12:46:35 2006 From: arigo at codespeak.net (arigo at codespeak.net) Date: Sun, 1 Oct 2006 12:46:35 +0200 (CEST) Subject: [pypy-svn] r32784 - pypy/dist/pypy/objspace/flow Message-ID: <20061001104635.9434510053@code0.codespeak.net> Author: arigo Date: Sun Oct 1 12:46:34 2006 New Revision: 32784 Modified: pypy/dist/pypy/objspace/flow/model.py Log: Fix of the fix ("default" ==> Constant("default")). Although it's now theoretically possible to have an exitswitch Variable with only one exit link whose exit case is None, we are not producing such things so far. It's more likely a bug, so let's crash. Modified: pypy/dist/pypy/objspace/flow/model.py ============================================================================== --- pypy/dist/pypy/objspace/flow/model.py (original) +++ pypy/dist/pypy/objspace/flow/model.py Sun Oct 1 12:46:34 2006 @@ -653,9 +653,12 @@ # branches are in the wrong order) assert len(block.exits) >= 1 cases = [Constant(link.exitcase) for link in block.exits] - if 'default' in cases: - assert 'default' == cases[-1] + if Constant('default') in cases: + assert Constant('default') == cases[-1] assert len(dict.fromkeys(cases)) == len(cases) + assert cases != [Constant(None)], ( + "exitswitch Variable followed by a normal-looking link" + " is probably not intended") allexitcases = {} for link in block.exits: From arigo at codespeak.net Sun Oct 1 12:49:23 2006 From: arigo at codespeak.net (arigo at codespeak.net) Date: Sun, 1 Oct 2006 12:49:23 +0200 (CEST) Subject: [pypy-svn] r32785 - pypy/dist/pypy/rpython/lltypesystem Message-ID: <20061001104923.697DB10053@code0.codespeak.net> Author: arigo Date: Sun Oct 1 12:49:22 2006 New Revision: 32785 Modified: pypy/dist/pypy/rpython/lltypesystem/opimpl.py Log: Operation implementation missing, making test_lloperation unhappy. Modified: pypy/dist/pypy/rpython/lltypesystem/opimpl.py ============================================================================== --- pypy/dist/pypy/rpython/lltypesystem/opimpl.py (original) +++ pypy/dist/pypy/rpython/lltypesystem/opimpl.py Sun Oct 1 12:49:22 2006 @@ -179,6 +179,10 @@ assert type(i) is int return float(i) +def op_cast_uint_to_float(u): + assert type(u) is r_uint + return float(u) + def op_cast_int_to_char(b): assert type(b) is int return chr(b) From arigo at codespeak.net Sun Oct 1 12:53:12 2006 From: arigo at codespeak.net (arigo at codespeak.net) Date: Sun, 1 Oct 2006 12:53:12 +0200 (CEST) Subject: [pypy-svn] r32786 - pypy/dist/pypy/rpython/memory/test Message-ID: <20061001105312.13B6010053@code0.codespeak.net> Author: arigo Date: Sun Oct 1 12:53:10 2006 New Revision: 32786 Modified: pypy/dist/pypy/rpython/memory/test/test_transformed_gc.py Log: I think you didn't mean to check this in. Modified: pypy/dist/pypy/rpython/memory/test/test_transformed_gc.py ============================================================================== --- pypy/dist/pypy/rpython/memory/test/test_transformed_gc.py (original) +++ pypy/dist/pypy/rpython/memory/test/test_transformed_gc.py Sun Oct 1 12:53:10 2006 @@ -658,8 +658,8 @@ class TestSemiSpaceGC(TestMarkSweepGC): - #def setup_class(cls): - # py.test.skip("in-progress") + def setup_class(cls): + py.test.skip("in-progress") class gcpolicy(gc.StacklessFrameworkGcPolicy): class transformerclass(gctransform.FrameworkGCTransformer): From arigo at codespeak.net Sun Oct 1 13:05:14 2006 From: arigo at codespeak.net (arigo at codespeak.net) Date: Sun, 1 Oct 2006 13:05:14 +0200 (CEST) Subject: [pypy-svn] r32787 - pypy/dist/pypy/config Message-ID: <20061001110514.111F210053@code0.codespeak.net> Author: arigo Date: Sun Oct 1 13:05:11 2006 New Revision: 32787 Added: pypy/dist/pypy/config/autopath.py - copied unchanged from r32786, pypy/dist/pypy/tool/autopath.py Modified: pypy/dist/pypy/config/pypyoption.py Log: Argh! A py.path.local object in sys.path. Argh(2)! We already have autopath.py for sys.path hacking, let's use it here too. Modified: pypy/dist/pypy/config/pypyoption.py ============================================================================== --- pypy/dist/pypy/config/pypyoption.py (original) +++ pypy/dist/pypy/config/pypyoption.py Sun Oct 1 13:05:11 2006 @@ -1,6 +1,5 @@ +import autopath import py -#print py.magic.autopath().dirpath().dirpath().dirpath() -py.std.sys.path.insert(0, py.magic.autopath().dirpath().dirpath().dirpath()) from pypy.config.config import OptionDescription, BoolOption, IntOption from pypy.config.config import ChoiceOption, to_optparse, Config From arigo at codespeak.net Sun Oct 1 13:15:56 2006 From: arigo at codespeak.net (arigo at codespeak.net) Date: Sun, 1 Oct 2006 13:15:56 +0200 (CEST) Subject: [pypy-svn] r32788 - pypy/dist/pypy/translator/llvm/test Message-ID: <20061001111556.70F7E10053@code0.codespeak.net> Author: arigo Date: Sun Oct 1 13:15:55 2006 New Revision: 32788 Modified: pypy/dist/pypy/translator/llvm/test/test_gc.py Log: Test broken by r32613, partially fixed by r32619 but not really. Modified: pypy/dist/pypy/translator/llvm/test/test_gc.py ============================================================================== --- pypy/dist/pypy/translator/llvm/test/test_gc.py (original) +++ pypy/dist/pypy/translator/llvm/test/test_gc.py Sun Oct 1 13:15:55 2006 @@ -41,6 +41,7 @@ assert f(5000) == tuple_getitem(5000) def test_ref(): + py.test.skip("broken by r32613, partially fixed by r32619 but not really") def tuple_getitem(n): x = 666 i = 0 From arigo at codespeak.net Sun Oct 1 17:07:47 2006 From: arigo at codespeak.net (arigo at codespeak.net) Date: Sun, 1 Oct 2006 17:07:47 +0200 (CEST) Subject: [pypy-svn] r32790 - in pypy/dist/pypy/jit/timeshifter: . test Message-ID: <20061001150747.BA2BB10053@code0.codespeak.net> Author: arigo Date: Sun Oct 1 17:07:44 2006 New Revision: 32790 Modified: pypy/dist/pypy/jit/timeshifter/rtimeshift.py pypy/dist/pypy/jit/timeshifter/test/test_promotion.py Log: Test and code for multiple consecutive promotion points. Modified: pypy/dist/pypy/jit/timeshifter/rtimeshift.py ============================================================================== --- pypy/dist/pypy/jit/timeshifter/rtimeshift.py (original) +++ pypy/dist/pypy/jit/timeshifter/rtimeshift.py Sun Oct 1 17:07:44 2006 @@ -10,6 +10,9 @@ FOLDABLE_OPS = dict.fromkeys(lloperation.enum_foldable_ops()) +def debug_view(*ll_objects): + lloperation.llop.debug_view(lltype.Void, *ll_objects) + # ____________________________________________________________ # emit ops @@ -249,7 +252,7 @@ jitstate.split(later_builder, resumepoint, list(greens_gv)) return True else: - return jitstate.resuming.path.pop() + return jitstate.resuming.path.pop().answer def collect_split(jitstate_chain, resumepoint, *greens_gv): greens_gv = list(greens_gv) @@ -343,8 +346,10 @@ class ResumingInfo(object): def __init__(self, promotion_point, gv_value, path): + node = PromotionPathPromote(promotion_point.promotion_path, + promotion_point, gv_value) + path[0] = node self.promotion_point = promotion_point - self.gv_value = gv_value self.path = path class PromotionPoint(object): @@ -387,7 +392,7 @@ def __init__(self, next): self.next = next def follow_path(self, path): - path.append(self.answer) + path.append(self) return self.next.follow_path(path) class PromotionPathYes(PromotionPathNode): @@ -403,15 +408,21 @@ self.arg = arg def follow_path(self, path): - path.append(self.arg) + path.append(self) return PromotionPathNo.follow_path(self, path) - + +class PromotionPathPromote(PromotionPathNode): + def __init__(self, next, promotion_point, gv_value): + self.next = next + self.promotion_point = promotion_point + self.gv_value = gv_value + def ll_continue_compilation(promotion_point_ptr, value): try: promotion_point = cast_base_ptr_to_instance(PromotionPoint, promotion_point_ptr) - path = [] + path = [None] root = promotion_point.promotion_path.follow_path(path) gv_value = root.rgenop.genconst(value) resuminginfo = ResumingInfo(promotion_point, gv_value, path) @@ -471,21 +482,27 @@ else: assert jitstate.promotion_path is None resuming = jitstate.resuming - assert len(resuming.path) == 0 - pm = resuming.promotion_point - - kinds = [box.kind for box in incoming] - vars_gv = jitstate.curbuilder.rgenop.stop_replay(pm.switchblock, - kinds) - for i in range(len(incoming)): - incoming[i].genvar = vars_gv[i] - box.genvar = resuming.gv_value + node = resuming.path.pop() + #debug_view(node, resuming, incoming) + assert isinstance(node, PromotionPathPromote) + pm = node.promotion_point + assert pm.promotion_path is node.next + + if len(resuming.path) == 0: + # XXX we need to do something around the switch in the 'else' + # case too + kinds = [box.kind for box in incoming] + vars_gv = jitstate.curbuilder.rgenop.stop_replay( + pm.switchblock, + kinds) + for i in range(len(incoming)): + incoming[i].genvar = vars_gv[i] + newbuilder = pm.flexswitch.add_case(node.gv_value) + jitstate.resuming = None + jitstate.promotion_path = node + jitstate.curbuilder = newbuilder - newbuilder = pm.flexswitch.add_case(resuming.gv_value) - - jitstate.resuming = None - jitstate.promotion_path = pm.promotion_path - jitstate.curbuilder = newbuilder + box.genvar = node.gv_value enter_block(jitstate) return False @@ -672,9 +689,9 @@ dispatchqueue.parent_promotion_path = jitstate.promotion_path jitstate.promotion_path = PromotionPathYes(jitstate.promotion_path) else: - dispatchqueue.parent_resuming = resuming - taking = resuming.path.pop() + taking = resuming.path.pop().answer if not taking: + dispatchqueue.parent_resuming = resuming jitstate.resuming = None jitstate.frame = VirtualFrame(jitstate.frame, dispatchqueue) @@ -746,7 +763,9 @@ jitstate = jitstate.next return return_chain # a jitstate, which is the head of the chain else: - n = resuming.path.pop() + node = resuming.path.pop() + assert isinstance(node, PromotionPathNoWithArg) + n = node.arg for i in range(n): assert jitstate.resuming is None jitstate = jitstate.next Modified: pypy/dist/pypy/jit/timeshifter/test/test_promotion.py ============================================================================== --- pypy/dist/pypy/jit/timeshifter/test/test_promotion.py (original) +++ pypy/dist/pypy/jit/timeshifter/test/test_promotion.py Sun Oct 1 17:07:44 2006 @@ -81,6 +81,31 @@ assert res == 4*17 + 10 self.check_insns(int_mul=0, int_add=1) + def test_promote_inside_call(self): + def ll_two(n): + k = hint(n, promote=True) + k *= 17 + return hint(k, variable=True) + def ll_function(n): + return ll_two(n + 1) - 1 + ll_function._global_merge_points_ = True + + res = self.timeshift(ll_function, [10], [], policy=P_NOVIRTUAL) + assert res == 186 + self.check_insns(int_add=1, int_mul=0, int_sub=0) + + def test_two_promotions(self): + def ll_function(n, m): + n1 = hint(n, promote=True) + m1 = hint(m, promote=True) + s1 = n1 + m1 + return hint(s1, variable=True) + ll_function._global_merge_points_ = True + + res = self.timeshift(ll_function, [40, 2], [], policy=P_NOVIRTUAL) + assert res == 42 + self.check_insns(int_add=0) + def test_method_call_nonpromote(self): class Base(object): From arigo at codespeak.net Sun Oct 1 17:09:03 2006 From: arigo at codespeak.net (arigo at codespeak.net) Date: Sun, 1 Oct 2006 17:09:03 +0200 (CEST) Subject: [pypy-svn] r32791 - pypy/dist/pypy/rpython Message-ID: <20061001150903.29F6610053@code0.codespeak.net> Author: arigo Date: Sun Oct 1 17:09:01 2006 New Revision: 32791 Modified: pypy/dist/pypy/rpython/llinterp.py Log: Change the switch logic in llinterp to cope with switches where values are llptrs (which explode if compared with the None object). Modified: pypy/dist/pypy/rpython/llinterp.py ============================================================================== --- pypy/dist/pypy/rpython/llinterp.py (original) +++ pypy/dist/pypy/rpython/llinterp.py Sun Oct 1 17:09:01 2006 @@ -328,16 +328,22 @@ raise e else: llexitvalue = self.getval(block.exitswitch) - for link in block.exits: + if block.exits[-1].exitcase == "default": + defaultexit = block.exits[-1] + nondefaultexits = block.exits[:-1] + assert defaultexit.llexitcase is None + else: + defaultexit = None + nondefaultexits = block.exits + for link in nondefaultexits: if link.llexitcase == llexitvalue: break # found -- the result is in 'link' else: - if block.exits[-1].exitcase == "default": - assert block.exits[-1].llexitcase is None - link = block.exits[-1] - else: + if defaultexit is None: raise ValueError("exit case %r not found in the exit links " "of %r" % (llexitvalue, block)) + else: + link = defaultexit return link.target, [self.getval(x) for x in link.args] def eval_operation(self, operation): From cfbolz at codespeak.net Sun Oct 1 18:53:56 2006 From: cfbolz at codespeak.net (cfbolz at codespeak.net) Date: Sun, 1 Oct 2006 18:53:56 +0200 (CEST) Subject: [pypy-svn] r32792 - in pypy/branch/even-more-config/pypy/config: . test Message-ID: <20061001165356.CC56F10053@code0.codespeak.net> Author: cfbolz Date: Sun Oct 1 18:53:53 2006 New Revision: 32792 Modified: pypy/branch/even-more-config/pypy/config/config.py pypy/branch/even-more-config/pypy/config/test/test_config.py pypy/branch/even-more-config/pypy/config/test/test_pypyoption.py Log: Don't allow the changing of options, once set, at all. Modified: pypy/branch/even-more-config/pypy/config/config.py ============================================================================== --- pypy/branch/even-more-config/pypy/config/config.py (original) +++ pypy/branch/even-more-config/pypy/config/config.py Sun Oct 1 18:53:53 2006 @@ -24,6 +24,7 @@ for name, value in overrides.iteritems(): subconfig, name = self._cfgimpl_get_by_path(name) setattr(subconfig, name, value) + subconfig._cfgimpl_value_owners[name] = 'default' def __setattr__(self, name, value): if self._cfgimpl_frozen and getattr(self, name) != value: @@ -45,11 +46,9 @@ child = getattr(self._cfgimpl_descr, name) oldowner = self._cfgimpl_value_owners[child._name] oldvalue = getattr(self, name) - if oldowner == 'required': - if oldvalue != value: - raise ValueError('can not override value %s for option %s' % - (value, name)) - return + if oldvalue != value and oldowner != "default": + raise ValueError('can not override value %s for option %s' % + (value, name)) child.setoption(self, value) self._cfgimpl_value_owners[name] = who @@ -156,7 +155,7 @@ raise NotImplemented('abstract base class') class ChoiceOption(Option): - def __init__(self, name, doc, values, default, requires=None, + def __init__(self, name, doc, values, default=None, requires=None, cmdline=DEFAULT_OPTION_NAME): super(ChoiceOption, self).__init__(name, doc, cmdline) self.values = values @@ -174,7 +173,7 @@ super(ChoiceOption, self).setoption(config, value) def validate(self, value): - return value in self.values + return value is None or value in self.values def add_optparse_option(self, argnames, parser, config): def _callback(option, opt_str, value, parser, *args, **kwargs): @@ -195,6 +194,9 @@ requires=requires, cmdline=cmdline) + def validate(self, value): + return isinstance(value, bool) + def add_optparse_option(self, argnames, parser, config): def _callback(option, opt_str, value, parser, *args, **kwargs): try: @@ -205,6 +207,7 @@ action='callback', callback=_callback, *argnames) + class IntOption(Option): def __init__(self, name, doc, default=0, cmdline=DEFAULT_OPTION_NAME): super(IntOption, self).__init__(name, doc, cmdline) Modified: pypy/branch/even-more-config/pypy/config/test/test_config.py ============================================================================== --- pypy/branch/even-more-config/pypy/config/test/test_config.py (original) +++ pypy/branch/even-more-config/pypy/config/test/test_config.py Sun Oct 1 18:53:53 2006 @@ -12,10 +12,15 @@ wantref_option = BoolOption('wantref', 'Test requires', default=False, requires=[('gc.name', 'ref')]) + wantframework_option = BoolOption('wantframework', 'Test requires', + default=False, + requires=[('gc.name', 'framework')]) gcgroup = OptionDescription('gc', '', [gcoption, gcdummy, floatoption]) descr = OptionDescription('pypy', '', [gcgroup, booloption, objspaceoption, - wantref_option, intoption]) + wantref_option, + wantframework_option, + intoption]) return descr def test_base_config(): @@ -46,12 +51,11 @@ py.test.raises(ValueError, 'config.int = "hello"') py.test.raises(ValueError, 'config.gc.float = None') - # test whether the gc.name is set to 'ref' when wantref is true (note that - # the current value of gc.name is 'framework') - config.wantref = True + config = Config(descr, bool=False) assert config.gc.name == 'ref' - py.test.raises(ValueError, 'config.gc.name = "framework"') - config.gc.name = "ref" + config.wantframework = True + py.test.raises(ValueError, 'config.gc.name = "ref"') + config.gc.name = "framework" def test_annotator_folding(): from pypy.translator.interactive import Translation @@ -113,6 +117,9 @@ assert config.gc.name == 'framework' + + config = Config(descr) + parser = to_optparse(config, ['gc.name']) (options, args) = parser.parse_args(args=['-g ref']) assert config.gc.name == 'ref' @@ -211,11 +218,11 @@ config = Config(descr) assert config.getpaths() == ['gc.name', 'gc.dummy', 'gc.float', 'bool', - 'objspace', 'wantref', 'int'] + 'objspace', 'wantref', 'wantframework', 'int'] assert config.gc.getpaths() == ['name', 'dummy', 'float'] assert config.getpaths(include_groups=True) == [ 'gc', 'gc.name', 'gc.dummy', 'gc.float', - 'bool', 'objspace', 'wantref', 'int'] + 'bool', 'objspace', 'wantref', 'wantframework', 'int'] def test_none(): dummy1 = BoolOption('dummy1', 'doc dummy', default=False, cmdline=None) @@ -258,3 +265,20 @@ config.s.backend = "cli" assert config.s.type_system == "oo" +def test_choice_with_no_default(): + descr = OptionDescription("test", "", [ + ChoiceOption("backend", "", ["c", "llvm"])]) + config = Config(descr) + assert config.backend is None + config.backend = "c" + +def test_overrides_are_defaults(): + descr = OptionDescription("test", "", [ + BoolOption("b1", "", default=False, requires=[("b2", False)]), + BoolOption("b2", "", default=False), + ]) + config = Config(descr, b2=True) + assert config.b2 + config.b1 = True + assert not config.b2 + print config._cfgimpl_value_owners Modified: pypy/branch/even-more-config/pypy/config/test/test_pypyoption.py ============================================================================== --- pypy/branch/even-more-config/pypy/config/test/test_pypyoption.py (original) +++ pypy/branch/even-more-config/pypy/config/test/test_pypyoption.py Sun Oct 1 18:53:53 2006 @@ -14,8 +14,9 @@ conf.objspace.std.withsmallint = True assert not conf.objspace.std.withprebuiltint + conf = Config(pypy_optiondescription) conf.objspace.std.withprebuiltint = True - assert not conf.objspace.std.withsmallint + py.test.raises(ValueError, "conf.objspace.std.withsmallint = True") def test_objspace_incopatibilities(): conf = Config(pypy_optiondescription) From cfbolz at codespeak.net Sun Oct 1 20:14:24 2006 From: cfbolz at codespeak.net (cfbolz at codespeak.net) Date: Sun, 1 Oct 2006 20:14:24 +0200 (CEST) Subject: [pypy-svn] r32794 - pypy/branch/even-more-config/pypy/config Message-ID: <20061001181424.5A8E91005A@code0.codespeak.net> Author: cfbolz Date: Sun Oct 1 20:14:20 2006 New Revision: 32794 Modified: pypy/branch/even-more-config/pypy/config/pypyoption.py Log: some tweaks Modified: pypy/branch/even-more-config/pypy/config/pypyoption.py ============================================================================== --- pypy/branch/even-more-config/pypy/config/pypyoption.py (original) +++ pypy/branch/even-more-config/pypy/config/pypyoption.py Sun Oct 1 20:14:20 2006 @@ -105,11 +105,12 @@ OptionDescription("translation", "Translation Options", [ BoolOption("stackless", "compile stackless features in", default=False, cmdline="--stackless", - requires=[("translation.type_system", "lltype")]), + requires=[("translation.type_system", "lltype"), + ("objspace.usemodules._stackless", True)]), ChoiceOption("type_system", "Type system to use when RTyping", - [None, "lltype", "ootype"], "lltype", cmdline=None), + [None, "lltype", "ootype"], cmdline=None), ChoiceOption("backend", "Backend to use for code generation", - [None, "c", "llvm", "cli", "js", "squeak", "cl"], "c", + [None, "c", "llvm", "cli", "js", "squeak", "cl"], requires={ "c": [("translation.type_system", "lltype")], "llvm": [("translation.type_system", "lltype")], @@ -127,13 +128,15 @@ BoolOption("thread", "enable use of threading primitives", default=False), BoolOption("verbose", "Print extra information", default=False), + BoolOption("debug", "Record extra annotation information", + default=False), BoolOption("insist", "Try hard to go on RTyping", default=False), BoolOption("lowmem", "Try to use little memory during translation", - default=False, cmdline="--lowmem"), + default=False, cmdline="--lowmem", + requires=[("objspace.geninterp", False)]), # Flags of the TranslationContext: - BoolOption("verbose", "Print extra information", default=False), BoolOption("simplifying", "Simplify flow graphs", default=True), BoolOption("do_imports_immediately", "XXX", default=True, cmdline=None), @@ -150,7 +153,6 @@ "Transform exception raising operations", default=False, cmdline="--raisingop2direct_call"), BoolOption("mallocs", "Remove mallocs", default=True), - BoolOption("merge_if_blocks", "Remove mallocs", default=True), BoolOption("propagate", "Constant propagation, deprecated", default=False), BoolOption("constfold", "Constant propagation", From cfbolz at codespeak.net Sun Oct 1 20:14:48 2006 From: cfbolz at codespeak.net (cfbolz at codespeak.net) Date: Sun, 1 Oct 2006 20:14:48 +0200 (CEST) Subject: [pypy-svn] r32795 - in pypy/branch/even-more-config/pypy/config: . test Message-ID: <20061001181448.9E37B1005A@code0.codespeak.net> Author: cfbolz Date: Sun Oct 1 20:14:46 2006 New Revision: 32795 Modified: pypy/branch/even-more-config/pypy/config/config.py pypy/branch/even-more-config/pypy/config/test/test_config.py Log: rather raise an AttributeError when trying to set a non-existing option Modified: pypy/branch/even-more-config/pypy/config/config.py ============================================================================== --- pypy/branch/even-more-config/pypy/config/config.py (original) +++ pypy/branch/even-more-config/pypy/config/config.py Sun Oct 1 20:14:46 2006 @@ -42,7 +42,7 @@ def setoption(self, name, value, who): if name not in self._cfgimpl_values: - raise ValueError('unknown option %s' % (name,)) + raise AttributeError('unknown option %s' % (name,)) child = getattr(self._cfgimpl_descr, name) oldowner = self._cfgimpl_value_owners[child._name] oldvalue = getattr(self, name) Modified: pypy/branch/even-more-config/pypy/config/test/test_config.py ============================================================================== --- pypy/branch/even-more-config/pypy/config/test/test_config.py (original) +++ pypy/branch/even-more-config/pypy/config/test/test_config.py Sun Oct 1 20:14:46 2006 @@ -46,7 +46,7 @@ py.test.raises(ValueError, 'config.objspace = "foo"') py.test.raises(ValueError, 'config.gc.name = "foo"') - py.test.raises(ValueError, 'config.gc.foo = "bar"') + py.test.raises(AttributeError, 'config.gc.foo = "bar"') py.test.raises(ValueError, 'config.bool = 123') py.test.raises(ValueError, 'config.int = "hello"') py.test.raises(ValueError, 'config.gc.float = None') From cfbolz at codespeak.net Sun Oct 1 20:32:00 2006 From: cfbolz at codespeak.net (cfbolz at codespeak.net) Date: Sun, 1 Oct 2006 20:32:00 +0200 (CEST) Subject: [pypy-svn] r32796 - in pypy/branch/even-more-config/pypy/config: . test Message-ID: <20061001183200.C2EF91005A@code0.codespeak.net> Author: cfbolz Date: Sun Oct 1 20:31:58 2006 New Revision: 32796 Modified: pypy/branch/even-more-config/pypy/config/config.py pypy/branch/even-more-config/pypy/config/test/test_config.py Log: fix str Modified: pypy/branch/even-more-config/pypy/config/config.py ============================================================================== --- pypy/branch/even-more-config/pypy/config/config.py (original) +++ pypy/branch/even-more-config/pypy/config/config.py Sun Oct 1 20:31:58 2006 @@ -89,7 +89,7 @@ yield child._name, getattr(self, child._name) def __str__(self): - result = "[%s]\n" % (self._descr._name, ) + result = "[%s]\n" % (self._cfgimpl_descr._name, ) for child in self._cfgimpl_descr._children: if isinstance(child, Option): if self._cfgimpl_value_owners[child._name] == 'default': Modified: pypy/branch/even-more-config/pypy/config/test/test_config.py ============================================================================== --- pypy/branch/even-more-config/pypy/config/test/test_config.py (original) +++ pypy/branch/even-more-config/pypy/config/test/test_config.py Sun Oct 1 20:31:58 2006 @@ -282,3 +282,8 @@ config.b1 = True assert not config.b2 print config._cfgimpl_value_owners + +def test_str(): + descr = make_description() + c = Config(descr) + print c # does not crash From cfbolz at codespeak.net Sun Oct 1 20:40:45 2006 From: cfbolz at codespeak.net (cfbolz at codespeak.net) Date: Sun, 1 Oct 2006 20:40:45 +0200 (CEST) Subject: [pypy-svn] r32800 - pypy/branch/even-more-config/pypy/translator Message-ID: <20061001184045.6C0961005A@code0.codespeak.net> Author: cfbolz Date: Sun Oct 1 20:40:43 2006 New Revision: 32800 Modified: pypy/branch/even-more-config/pypy/translator/driver.py pypy/branch/even-more-config/pypy/translator/interactive.py Log: fix interactive to use config and fix some bugs I introduced into the driver yesterday. Modified: pypy/branch/even-more-config/pypy/translator/driver.py ============================================================================== --- pypy/branch/even-more-config/pypy/translator/driver.py (original) +++ pypy/branch/even-more-config/pypy/translator/driver.py Sun Oct 1 20:40:43 2006 @@ -146,13 +146,13 @@ def get_backend_and_type_system(self): type_system = None backend = None - opts = self.options - if opts.type_system: - type_system = opts.type_system - if opts.backend: - backend = opts.backend + if self.config.translation.type_system: + type_system = self.config.translation.type_system + if self.config.translation.backend: + backend = self.config.translation.backend ts = backend_to_typesystem(backend) if type_system: + # YYY should be dead code if ts != type_system: raise ValueError, ("incosistent type-system and backend:" " %s and %s" % (type_system, backend)) @@ -234,7 +234,7 @@ policy = self.policy self.log.info('with policy: %s.%s' % (policy.__class__.__module__, policy.__class__.__name__)) - annmodel.DEBUG = self.options.debug + annmodel.DEBUG = self.config.translation.debug annotator = translator.buildannotator(policy=policy) s = annotator.build_types(self.entry_point, self.inputtypes) Modified: pypy/branch/even-more-config/pypy/translator/interactive.py ============================================================================== --- pypy/branch/even-more-config/pypy/translator/interactive.py (original) +++ pypy/branch/even-more-config/pypy/translator/interactive.py Sun Oct 1 20:40:43 2006 @@ -3,6 +3,8 @@ import autopath from pypy.translator.translator import TranslationContext from pypy.translator import driver +from pypy.config.config import Config +from pypy.config.pypyoption import pypy_optiondescription DEFAULT_OPTIONS = driver.DEFAULT_OPTIONS.copy() DEFAULT_OPTIONS.update({ @@ -18,8 +20,9 @@ graph = self.context.buildflowgraph(entry_point) self.context._prebuilt_graphs[entry_point] = graph - self.driver = driver.TranslationDriver( - optparse.Values(defaults=DEFAULT_OPTIONS)) + self.config = Config(pypy_optiondescription) + + self.driver = driver.TranslationDriver(config=self.config) # hook into driver events driver_own_event = self.driver._event @@ -93,27 +96,46 @@ if optname in ('policy', 'standalone'): continue if optname in self.frozen_options: - if getattr(self.driver.options, optname) != value: - raise Exception("inconsistent option supplied: %s" % optname) + if self.get_option(optname) != value: + raise Exception("inconsistent option supplied: %s" % + optname) else: - if not hasattr(self.driver.options, optname): + try: + self.get_option(optname) + except AttributeError: raise TypeError('driver has no option %r' % (optname,)) - setattr(self.driver.options, optname, value) + self.set_option(optname, value) self.frozen_options[optname] = True + def get_option(self, name): + # convenience function to look through the translation and + # translation.backendopt namespaces of the config object + try: + return getattr(self.config.translation, name) + except AttributeError: + return getattr(self.config.translation.backendopt, name) + + def set_option(self, name, value): + try: + setattr(self.config.translation, name, value) + except AttributeError: + setattr(self.config.translation.backendopt, name, value) + def ensure_opt(self, name, value=None, fallback=None): if value is not None: self.update_options(None, {name: value}) elif fallback is not None and name not in self.frozen_options: self.update_options(None, {name: fallback}) - val = getattr(self.driver.options, name) + val = self.get_option(name) if val is None: - raise Exception("the %r option should have been specified at this point" % name) + raise Exception( + "the %r option should have been specified at this point" %name) return val def ensure_type_system(self, type_system=None): if type_system is None: - backend = self.driver.options.backend + backend = self.config.translation.backend + # YYY the next two lines are unreachable now? if backend is not None: type_system = driver.backend_to_typesystem(backend) return self.ensure_opt('type_system', type_system, 'lltype') From cfbolz at codespeak.net Sun Oct 1 20:41:23 2006 From: cfbolz at codespeak.net (cfbolz at codespeak.net) Date: Sun, 1 Oct 2006 20:41:23 +0200 (CEST) Subject: [pypy-svn] r32801 - pypy/branch/even-more-config/pypy/config Message-ID: <20061001184123.B7C911005A@code0.codespeak.net> Author: cfbolz Date: Sun Oct 1 20:41:22 2006 New Revision: 32801 Modified: pypy/branch/even-more-config/pypy/config/pypyoption.py Log: more fixes here Modified: pypy/branch/even-more-config/pypy/config/pypyoption.py ============================================================================== --- pypy/branch/even-more-config/pypy/config/pypyoption.py (original) +++ pypy/branch/even-more-config/pypy/config/pypyoption.py Sun Oct 1 20:41:22 2006 @@ -108,9 +108,9 @@ requires=[("translation.type_system", "lltype"), ("objspace.usemodules._stackless", True)]), ChoiceOption("type_system", "Type system to use when RTyping", - [None, "lltype", "ootype"], cmdline=None), + ["lltype", "ootype"], cmdline=None), ChoiceOption("backend", "Backend to use for code generation", - [None, "c", "llvm", "cli", "js", "squeak", "cl"], + ["c", "llvm", "cli", "js", "squeak", "cl"], requires={ "c": [("translation.type_system", "lltype")], "llvm": [("translation.type_system", "lltype")], @@ -129,7 +129,7 @@ default=False), BoolOption("verbose", "Print extra information", default=False), BoolOption("debug", "Record extra annotation information", - default=False), + default=True), BoolOption("insist", "Try hard to go on RTyping", default=False), BoolOption("lowmem", "Try to use little memory during translation", default=False, cmdline="--lowmem", From cfbolz at codespeak.net Sun Oct 1 20:47:06 2006 From: cfbolz at codespeak.net (cfbolz at codespeak.net) Date: Sun, 1 Oct 2006 20:47:06 +0200 (CEST) Subject: [pypy-svn] r32802 - pypy/branch/even-more-config/pypy/translator/test Message-ID: <20061001184706.55A5A1005A@code0.codespeak.net> Author: cfbolz Date: Sun Oct 1 20:47:02 2006 New Revision: 32802 Modified: pypy/branch/even-more-config/pypy/translator/test/test_driver.py Log: fix test to use configs instead of options Modified: pypy/branch/even-more-config/pypy/translator/test/test_driver.py ============================================================================== --- pypy/branch/even-more-config/pypy/translator/test/test_driver.py (original) +++ pypy/branch/even-more-config/pypy/translator/test/test_driver.py Sun Oct 1 20:47:02 2006 @@ -1,6 +1,8 @@ import py from pypy.translator.driver import TranslationDriver, DEFAULT_OPTIONS +from pypy.config.config import Config +from pypy.config.pypyoption import pypy_optiondescription import optparse def cmpl(l1, l2): @@ -11,7 +13,8 @@ return l1 == l2 def test_ctr(): - td = TranslationDriver() + config = Config(pypy_optiondescription, **{"translation.backend": "c"}) + td = TranslationDriver(config=config) assert cmpl(td.exposed, ['annotate', 'backendopt', 'llinterpret', 'rtype', 'source', 'compile', 'run']) @@ -21,40 +24,41 @@ assert td.backend_select_goals(['rtype']) == ['rtype_lltype'] assert td.backend_select_goals(['rtype_lltype']) == ['rtype_lltype'] assert td.backend_select_goals(['backendopt']) == ['backendopt_lltype'] - assert td.backend_select_goals(['backendopt_lltype']) == ['backendopt_lltype'] + assert td.backend_select_goals(['backendopt_lltype']) == [ + 'backendopt_lltype'] - d = DEFAULT_OPTIONS.copy() - d['backend'] = None - td = TranslationDriver(options=optparse.Values(defaults=d)) + config = Config(pypy_optiondescription) + td = TranslationDriver(config=config) assert td.backend_select_goals(['compile_c']) == ['compile_c'] py.test.raises(Exception, td.backend_select_goals, ['compile']) py.test.raises(Exception, td.backend_select_goals, ['rtype']) - assert td.backend_select_goals(['rtype_lltype']) == ['rtype_lltype'] + assert td.backend_select_goals(['rtype_lltype']) == ['rtype_lltype'] py.test.raises(Exception, td.backend_select_goals, ['backendopt']) - assert td.backend_select_goals(['backendopt_lltype']) == ['backendopt_lltype'] - + assert td.backend_select_goals(['backendopt_lltype']) == [ + 'backendopt_lltype'] assert cmpl(td.exposed, ['annotate', 'backendopt_lltype', 'llinterpret_lltype', - 'rtype_ootype', 'rtype_lltype', - 'source_cl', 'source_js', 'source_squeak', 'source_cli', 'source_c', - 'source_llvm', 'compile_cl', 'compile_cli', 'compile_c', 'compile_squeak', - 'compile_llvm', 'compile_js', 'run_cl', 'run_squeak', 'run_llvm', - 'run_c', 'run_js', 'run_cli']) - - d = DEFAULT_OPTIONS.copy() - d['backend'] = None - d['type_system'] = 'lltype' - td = TranslationDriver(options=optparse.Values(defaults=d)) + 'rtype_ootype', 'rtype_lltype', 'source_cl', 'source_js', + 'source_squeak', 'source_cli', 'source_c', 'source_llvm', + 'compile_cl', 'compile_cli', 'compile_c', 'compile_squeak', + 'compile_llvm', 'compile_js', 'run_cl', 'run_squeak', + 'run_llvm', 'run_c', 'run_js', 'run_cli']) + + config = Config(pypy_optiondescription, + **{"translation.type_system": "lltype"}) + td = TranslationDriver(config=config) assert td.backend_select_goals(['compile_c']) == ['compile_c'] py.test.raises(Exception, td.backend_select_goals, ['compile']) - assert td.backend_select_goals(['rtype_lltype']) == ['rtype_lltype'] - assert td.backend_select_goals(['rtype']) == ['rtype_lltype'] + assert td.backend_select_goals(['rtype_lltype']) == ['rtype_lltype'] + assert td.backend_select_goals(['rtype']) == ['rtype_lltype'] assert td.backend_select_goals(['backendopt']) == ['backendopt_lltype'] - assert td.backend_select_goals(['backendopt_lltype']) == ['backendopt_lltype'] + assert td.backend_select_goals(['backendopt_lltype']) == [ + 'backendopt_lltype'] assert cmpl(td.exposed, - ['annotate', 'backendopt', 'llinterpret', 'rtype', 'source_c', 'source_llvm', - 'compile_c', 'compile_llvm', 'run_llvm', 'run_c']) + ['annotate', 'backendopt', 'llinterpret', 'rtype', 'source_c', + 'source_llvm', 'compile_c', 'compile_llvm', 'run_llvm', + 'run_c']) From cfbolz at codespeak.net Sun Oct 1 22:03:55 2006 From: cfbolz at codespeak.net (cfbolz at codespeak.net) Date: Sun, 1 Oct 2006 22:03:55 +0200 (CEST) Subject: [pypy-svn] r32804 - pypy/branch/even-more-config/pypy/translator/c Message-ID: <20061001200355.C6F151006F@code0.codespeak.net> Author: cfbolz Date: Sun Oct 1 22:03:52 2006 New Revision: 32804 Modified: pypy/branch/even-more-config/pypy/translator/c/genc.py Log: oops, there are some rests left of the very old way to do stackless on the source gen level. Modified: pypy/branch/even-more-config/pypy/translator/c/genc.py ============================================================================== --- pypy/branch/even-more-config/pypy/translator/c/genc.py (original) +++ pypy/branch/even-more-config/pypy/translator/c/genc.py Sun Oct 1 22:03:52 2006 @@ -39,7 +39,7 @@ db = LowLevelDatabase(translator, standalone=self.standalone, gcpolicy=self.gcpolicy, thread_enabled=self.thread_enabled) - assert self.stackless in (False, 'old', True) + assert self.stackless in (False, True) if db.gcpolicy.requires_stackless: assert self.stackless != 'old' # incompatible self.stackless = True @@ -125,9 +125,6 @@ else: if CBuilder.have___thread: defines['HAVE___THREAD'] = 1 - if self.stackless == 'old': - defines['USE_STACKLESS'] = '1' - defines['USE_OPTIMIZED_STACKLESS_UNWIND'] = '1' cfile, extra = gen_source_standalone(db, modulename, targetdir, entrypointname = pfname, defines = defines) @@ -135,7 +132,7 @@ self.extrafiles = extra if self.standalone: self.gen_makefile(targetdir) - return cfile + return cfile def generate_graphs_for_llinterp(self, db=None): # prepare the graphs as when the source is generated, but without @@ -626,10 +623,6 @@ sg.set_strategy(targetdir) sg.gen_readable_parts_of_source(f) - # 2bis) old-style stackless data - if hasattr(database, 'stacklessdata'): - database.stacklessdata.writefiles(sg) - # 3) start-up code print >> f gen_startupcode(f, database) From cfbolz at codespeak.net Sun Oct 1 22:10:40 2006 From: cfbolz at codespeak.net (cfbolz at codespeak.net) Date: Sun, 1 Oct 2006 22:10:40 +0200 (CEST) Subject: [pypy-svn] r32805 - pypy/branch/even-more-config/pypy/translator/c/src Message-ID: <20061001201040.C406D1006F@code0.codespeak.net> Author: cfbolz Date: Sun Oct 1 22:10:39 2006 New Revision: 32805 Removed: pypy/branch/even-more-config/pypy/translator/c/src/ll_stackless.h Modified: pypy/branch/even-more-config/pypy/translator/c/src/g_include.h Log: even more stuff left from the old stackless (at least I hope it is no longer used :-) Modified: pypy/branch/even-more-config/pypy/translator/c/src/g_include.h ============================================================================== --- pypy/branch/even-more-config/pypy/translator/c/src/g_include.h (original) +++ pypy/branch/even-more-config/pypy/translator/c/src/g_include.h Sun Oct 1 22:10:39 2006 @@ -40,7 +40,6 @@ # ifdef RPyExc_thread_error # include "src/ll_thread.h" # endif -# include "src/ll_stackless.h" # include "src/ll__socket.h" #endif From cfbolz at codespeak.net Mon Oct 2 00:55:20 2006 From: cfbolz at codespeak.net (cfbolz at codespeak.net) Date: Mon, 2 Oct 2006 00:55:20 +0200 (CEST) Subject: [pypy-svn] r32806 - in pypy/branch/even-more-config/pypy: config translator translator/c translator/c/test Message-ID: <20061001225520.B404C10068@code0.codespeak.net> Author: cfbolz Date: Mon Oct 2 00:55:15 2006 New Revision: 32806 Modified: pypy/branch/even-more-config/pypy/config/pypyoption.py pypy/branch/even-more-config/pypy/translator/c/database.py pypy/branch/even-more-config/pypy/translator/c/gc.py pypy/branch/even-more-config/pypy/translator/c/genc.py pypy/branch/even-more-config/pypy/translator/c/test/test_boehm.py pypy/branch/even-more-config/pypy/translator/c/test/test_genc.py pypy/branch/even-more-config/pypy/translator/c/test/test_newgc.py pypy/branch/even-more-config/pypy/translator/c/test/test_stackless.py pypy/branch/even-more-config/pypy/translator/driver.py Log: intermediate checkin to use the config in genc. Some tests fail but the majority passes. Modified: pypy/branch/even-more-config/pypy/config/pypyoption.py ============================================================================== --- pypy/branch/even-more-config/pypy/config/pypyoption.py (original) +++ pypy/branch/even-more-config/pypy/config/pypyoption.py Mon Oct 2 00:55:15 2006 @@ -120,7 +120,8 @@ "cl": [("translation.type_system", "ootype")], }), ChoiceOption("gc", "Garbage Collection Strategy", - ["boehm", "ref", "framework", "none", "stacklessgc"], + ["boehm", "ref", "framework", "none", "stacklessgc", + "exact_boehm"], "boehm", requires={ "stacklessgc": [("translation.stackless", True)]}, cmdline="--gc"), @@ -131,6 +132,8 @@ BoolOption("debug", "Record extra annotation information", default=True), BoolOption("insist", "Try hard to go on RTyping", default=False), + BoolOption("countmallocs", "Count mallocs and frees", default=False, + cmdline=None), BoolOption("lowmem", "Try to use little memory during translation", default=False, cmdline="--lowmem", requires=[("objspace.geninterp", False)]), Modified: pypy/branch/even-more-config/pypy/translator/c/database.py ============================================================================== --- pypy/branch/even-more-config/pypy/translator/c/database.py (original) +++ pypy/branch/even-more-config/pypy/translator/c/database.py Mon Oct 2 00:55:15 2006 @@ -15,17 +15,25 @@ from pypy.translator.c.support import log from pypy.translator.c.extfunc import do_the_getting from pypy import conftest +from pypy.translator.c import gc + # ____________________________________________________________ class LowLevelDatabase(object): - stacklesstransformer = None gctransformer = None - def __init__(self, translator=None, standalone=False, gcpolicy=None, thread_enabled=False): + def __init__(self, translator=None, standalone=False, + gcpolicyclass=None, + stacklesstransformer=None, + thread_enabled=False): self.translator = translator self.standalone = standalone - self.thread_enabled = thread_enabled + self.stacklesstransformer = stacklesstransformer + if gcpolicyclass is None: + gcpolicyclass = gc.RefcountingGcPolicy + self.gcpolicy = gcpolicyclass(self, thread_enabled) + self.structdefnodes = {} self.pendingsetupnodes = [] self.containernodes = {} @@ -47,31 +55,12 @@ from pypy.translator.c.pyobj import PyObjMaker self.pyobjmaker = PyObjMaker(self.namespace, self, translator) - gcpolicy = gcpolicy or conftest.option.gcpolicy or 'ref' - if isinstance(gcpolicy, str): - from pypy.translator.c import gc - polname = gcpolicy - if polname == 'boehm': - gcpolicy = gc.BoehmGcPolicy - elif polname == 'exact_boehm': - gcpolicy = gc.MoreExactBoehmGcPolicy - elif polname == 'ref': - gcpolicy = gc.RefcountingGcPolicy - elif polname == 'none': - gcpolicy = gc.NoneGcPolicy - elif polname == 'framework': - gcpolicy = gc.FrameworkGcPolicy - elif polname == 'stacklessgc': - gcpolicy = gc.StacklessFrameworkGcPolicy - else: - assert False, "unknown gc policy %r"%polname if translator is None or translator.rtyper is None: self.exctransformer = None else: self.exctransformer = translator.getexceptiontransformer() - self.gcpolicy = gcpolicy(self, thread_enabled) if translator is not None: - self.gctransformer = gcpolicy.transformerclass(translator) + self.gctransformer = self.gcpolicy.transformerclass(translator) self.completed = False def gettypedefnode(self, T, varlength=1): Modified: pypy/branch/even-more-config/pypy/translator/c/gc.py ============================================================================== --- pypy/branch/even-more-config/pypy/translator/c/gc.py (original) +++ pypy/branch/even-more-config/pypy/translator/c/gc.py Mon Oct 2 00:55:15 2006 @@ -423,3 +423,15 @@ class StacklessFrameworkGcPolicy(FrameworkGcPolicy): transformerclass = gctransform.StacklessFrameworkGCTransformer requires_stackless = True + + +name_to_gcpolicy = { + 'boehm': BoehmGcPolicy, + 'exact_boehm': MoreExactBoehmGcPolicy, + 'ref': RefcountingGcPolicy, + 'none': NoneGcPolicy, + 'framework': FrameworkGcPolicy, + 'stacklessgc': StacklessFrameworkGcPolicy, +} + + Modified: pypy/branch/even-more-config/pypy/translator/c/genc.py ============================================================================== --- pypy/branch/even-more-config/pypy/translator/c/genc.py (original) +++ pypy/branch/even-more-config/pypy/translator/c/genc.py Mon Oct 2 00:55:15 2006 @@ -14,20 +14,23 @@ from pypy.translator.locality.calltree import CallTree from pypy.translator.c.support import log, c_string_constant from pypy.rpython.typesystem import getfunctionptr +from pypy.translator.c import gc class CBuilder(object): c_source_filename = None _compiled = False symboltable = None - stackless = False modulename = None - def __init__(self, translator, entrypoint, gcpolicy=None, libraries=None, thread_enabled=False): + def __init__(self, translator, entrypoint, config=None, libraries=None): self.translator = translator self.entrypoint = entrypoint self.originalentrypoint = entrypoint - self.gcpolicy = gcpolicy - self.thread_enabled = thread_enabled + if config is None: + from pypy.config.config import Config + from pypy.config.pypyoption import pypy_optiondescription + config = Config(pypy_optiondescription) + self.config = config if libraries is None: libraries = [] @@ -36,23 +39,25 @@ def build_database(self, exports=[], pyobj_options=None): translator = self.translator - db = LowLevelDatabase(translator, standalone=self.standalone, - gcpolicy=self.gcpolicy, thread_enabled=self.thread_enabled) - assert self.stackless in (False, True) - if db.gcpolicy.requires_stackless: - assert self.stackless != 'old' # incompatible - self.stackless = True - if self.stackless: + gcpolicyclass = gc.name_to_gcpolicy[self.config.translation.gc] + + if self.config.translation.stackless: if not self.standalone: raise Exception("stackless: only for stand-alone builds") - + from pypy.translator.stackless.transform import StacklessTransformer - db.stacklesstransformer = StacklessTransformer(translator, - self.originalentrypoint, - db.gcpolicy.requires_stackless) - self.entrypoint = db.stacklesstransformer.slp_entry_point + stacklesstransformer = StacklessTransformer( + translator, self.originalentrypoint, + gcpolicyclass.requires_stackless) + self.entrypoint = stacklesstransformer.slp_entry_point + else: + stacklesstransformer = None + db = LowLevelDatabase(translator, standalone=self.standalone, + gcpolicyclass=gcpolicyclass, + stacklesstransformer=stacklesstransformer, + thread_enabled=self.config.translation.thread) # pass extra options into pyobjmaker if pyobj_options: for key, value in pyobj_options.items(): @@ -112,7 +117,8 @@ targetdir = udir.ensure(modulename, dir=1) self.targetdir = targetdir defines = defines.copy() - # defines={'COUNT_OP_MALLOCS': 1} + if self.config.translation.countmallocs: + defines['COUNT_OP_MALLOCS'] = 1 if CBuilder.have___thread is None: CBuilder.have___thread = check_under_under_thread() if not self.standalone: @@ -281,7 +287,10 @@ print >> f print >> f, 'CFLAGS =', ' '.join(compiler.compile_extra) print >> f, 'LDFLAGS =', ' '.join(compiler.link_extra) - print >> f, 'TFLAGS = ' + ('', '-pthread')[self.thread_enabled] + if self.config.translation.thread: + print >> f, 'TFLAGS = ' + '-pthread' + else: + print >> f, 'TFLAGS = ' + '' print >> f, 'PROFOPT = ' + profopt print >> f, 'CC = ' + cc print >> f Modified: pypy/branch/even-more-config/pypy/translator/c/test/test_boehm.py ============================================================================== --- pypy/branch/even-more-config/pypy/translator/c/test/test_boehm.py (original) +++ pypy/branch/even-more-config/pypy/translator/c/test/test_boehm.py Mon Oct 2 00:55:15 2006 @@ -3,6 +3,8 @@ from pypy.translator.tool.cbuild import check_boehm_presence from pypy.translator.c.genc import CExtModuleBuilder from pypy import conftest +from pypy.config.config import Config +from pypy.config.pypyoption import pypy_optiondescription def setup_module(mod): if not check_boehm_presence(): @@ -32,7 +34,9 @@ t.buildrtyper().specialize() t.checkgraphs() def compile(): - cbuilder = CExtModuleBuilder(t, func, gcpolicy=self.gcpolicy) + config = Config(pypy_optiondescription) + config.translation.gc = self.gcpolicy + cbuilder = CExtModuleBuilder(t, func, config=config) c_source_filename = cbuilder.generate_source() if conftest.option.view: t.view() @@ -44,7 +48,7 @@ class TestUsingBoehm(AbstractTestClass): - from pypy.translator.c.gc import BoehmGcPolicy as gcpolicy + gcpolicy = "boehm" def test_malloc_a_lot(self): def malloc_a_lot(): @@ -140,7 +144,7 @@ s = State() s.dels = 0 def g(): - a = A() + a = A() def f(): s.dels = 0 for i in range(10): @@ -178,6 +182,6 @@ class TestUsingExactBoehm(TestUsingBoehm): - from pypy.translator.c.gc import MoreExactBoehmGcPolicy as gcpolicy + gcpolicy = "exact_boehm" Modified: pypy/branch/even-more-config/pypy/translator/c/test/test_genc.py ============================================================================== --- pypy/branch/even-more-config/pypy/translator/c/test/test_genc.py (original) +++ pypy/branch/even-more-config/pypy/translator/c/test/test_genc.py Mon Oct 2 00:55:15 2006 @@ -12,6 +12,7 @@ from pypy.translator.tool.cbuild import enable_fast_compilation from pypy.translator.gensupp import uniquemodulename from pypy.translator.backendopt.all import backend_optimizations +from pypy.translator.interactive import Translation from pypy import conftest # XXX this tries to make compiling faster for full-scale testing @@ -19,7 +20,6 @@ #from pypy.translator.tool import cbuild #cbuild.enable_fast_compilation() - def compile_db(db): enable_fast_compilation() # for testing modulename = uniquemodulename('testing') @@ -30,21 +30,17 @@ libraries = db.gcpolicy.gc_libraries()) return m -def compile(fn, argtypes, view=False, gcpolicy=None, backendopt=True, +def compile(fn, argtypes, view=False, gcpolicy="ref", backendopt=True, annotatorpolicy=None): - t = TranslationContext() - a = t.buildannotator(policy=annotatorpolicy) - a.build_types(fn, argtypes) - t.buildrtyper().specialize() - if backendopt: - backend_optimizations(t) - db = LowLevelDatabase(t, gcpolicy=gcpolicy) - entrypoint = db.get(pyobjectptr(fn)) - db.complete() - module = compile_db(db) - if view or conftest.option.view: - t.view() - compiled_fn = getattr(module, entrypoint) + t = Translation(fn, argtypes, gc=gcpolicy, backend="c") + if not backendopt: + t.disable(["backendopt_lltype"]) + t.annotate() + # XXX fish + t.driver.config.translation.countmallocs = True + compiled_fn = t.compile_c() + # XXX fish fish fish some more + module = t.driver.cbuilder.c_ext_module def checking_fn(*args, **kwds): if 'expected_extra_mallocs' in kwds: expected_extra_mallocs = kwds.pop('expected_extra_mallocs') Modified: pypy/branch/even-more-config/pypy/translator/c/test/test_newgc.py ============================================================================== --- pypy/branch/even-more-config/pypy/translator/c/test/test_newgc.py (original) +++ pypy/branch/even-more-config/pypy/translator/c/test/test_newgc.py Mon Oct 2 00:55:15 2006 @@ -10,16 +10,19 @@ from pypy.rpython.lltypesystem.lloperation import llop from pypy.rpython.objectmodel import cast_weakgcaddress_to_object, cast_object_to_weakgcaddress from pypy.rpython.memory.gctransform import GCTransformer - +from pypy.config.config import Config +from pypy.config.pypyoption import pypy_optiondescription from pypy import conftest -def compile_func(fn, inputtypes, t=None, gcpolicy=gc.RefcountingGcPolicy): +def compile_func(fn, inputtypes, t=None, gcpolicy="ref"): + config = Config(pypy_optiondescription) + config.translation.gc = gcpolicy if t is None: - t = TranslationContext() + t = TranslationContext(config=config) if inputtypes is not None: t.buildannotator().build_types(fn, inputtypes) t.buildrtyper().specialize() - builder = genc.CExtModuleBuilder(t, fn, gcpolicy=gcpolicy) + builder = genc.CExtModuleBuilder(t, fn, config=config) builder.generate_source(defines={'COUNT_OP_MALLOCS': 1}) builder.compile() builder.import_module() @@ -144,7 +147,7 @@ assert fn(0) == 5 def test_del_basic(): - for gcpolicy in [gc.RefcountingGcPolicy]: #, gc.FrameworkGcPolicy]: + for gcpolicy in ["ref"]: #, "framework"]: S = lltype.GcStruct('S', ('x', lltype.Signed)) TRASH = lltype.GcStruct('TRASH', ('x', lltype.Signed)) lltype.attachRuntimeTypeInfo(S) @@ -400,7 +403,7 @@ from pypy.translator.c.test.test_boehm import AbstractTestClass class TestUsingFramework(AbstractTestClass): - from pypy.translator.c.gc import FrameworkGcPolicy as gcpolicy + gcpolicy = "framework" def test_empty_collect(self): def f(): @@ -863,7 +866,7 @@ res = fn() class TestUsingStacklessFramework(TestUsingFramework): - from pypy.translator.c.gc import StacklessFrameworkGcPolicy as gcpolicy + gcpolicy = "stacklessgc" def getcompiled(self, f): # XXX quick hack Modified: pypy/branch/even-more-config/pypy/translator/c/test/test_stackless.py ============================================================================== --- pypy/branch/even-more-config/pypy/translator/c/test/test_stackless.py (original) +++ pypy/branch/even-more-config/pypy/translator/c/test/test_stackless.py Mon Oct 2 00:55:15 2006 @@ -5,13 +5,15 @@ from pypy.annotation.listdef import s_list_of_strings from pypy.rpython.rstack import stack_unwind, stack_frames_depth, stack_too_big from pypy.rpython.rstack import yield_current_frame_to_caller +from pypy.config.config import Config +from pypy.config.pypyoption import pypy_optiondescription import os class StacklessTest(object): backendopt = False stacklessmode = True - gcpolicy = gc.BoehmGcPolicy + gcpolicy = "boehm" def setup_class(cls): import py @@ -31,7 +33,10 @@ os.write(1, str(fn())+"\n") return 0 - t = TranslationContext() + config = Config(pypy_optiondescription) + config.translation.gc = self.gcpolicy + config.translation.stackless = True + t = TranslationContext(config=config) self.t = t t.buildannotator().build_types(entry_point, [s_list_of_strings]) t.buildrtyper().specialize() @@ -41,7 +46,7 @@ from pypy.translator.transform import insert_ll_stackcheck insert_ll_stackcheck(t) - cbuilder = CStandaloneBuilder(t, entry_point, gcpolicy=self.gcpolicy) + cbuilder = CStandaloneBuilder(t, entry_point, config=config) cbuilder.stackless = self.stacklessmode cbuilder.generate_source() cbuilder.compile() Modified: pypy/branch/even-more-config/pypy/translator/driver.py ============================================================================== --- pypy/branch/even-more-config/pypy/translator/driver.py (original) +++ pypy/branch/even-more-config/pypy/translator/driver.py Mon Oct 2 00:55:15 2006 @@ -308,8 +308,8 @@ insert_ll_stackcheck(self.translator) task_stackcheckinsertion_lltype = taskdef( - task_stackcheckinsertion_lltype, - ['?'+BACKENDOPT, RTYPE, 'annotate'], + task_stackcheckinsertion_lltype, + ['?'+BACKENDOPT, RTYPE, 'annotate'], "inserting stack checks") STACKCHECKINSERTION = 'stackcheckinsertion_lltype' @@ -325,8 +325,7 @@ else: from pypy.translator.c.genc import CExtModuleBuilder as CBuilder cbuilder = CBuilder(self.translator, self.entry_point, - gcpolicy = self.config.translation.gc, - thread_enabled = self.config.translation.thread) + config=self.config) cbuilder.stackless = self.config.translation.stackless if not standalone: # xxx more messy cbuilder.modulename = self.extmod_name @@ -335,7 +334,7 @@ self.cbuilder = cbuilder self.database = database # - task_database_c = taskdef(task_database_c, + task_database_c = taskdef(task_database_c, [STACKCHECKINSERTION, '?'+BACKENDOPT, RTYPE, '?annotate'], "Creating database for generating c source") From ale at codespeak.net Mon Oct 2 11:35:17 2006 From: ale at codespeak.net (ale at codespeak.net) Date: Mon, 2 Oct 2006 11:35:17 +0200 (CEST) Subject: [pypy-svn] r32808 - pypy/extradoc/sprintinfo/paris Message-ID: <20061002093517.CD02E1005A@code0.codespeak.net> Author: ale Date: Mon Oct 2 11:35:14 2006 New Revision: 32808 Added: pypy/extradoc/sprintinfo/paris/paris-minisprint09-2006.txt Log: Initial stab at a sprnt report Added: pypy/extradoc/sprintinfo/paris/paris-minisprint09-2006.txt ============================================================================== --- (empty file) +++ pypy/extradoc/sprintinfo/paris/paris-minisprint09-2006.txt Mon Oct 2 11:35:14 2006 @@ -0,0 +1,18 @@ +Sprint report Paris mini sprint September 25th to 29th +======================================================== + + +Participants: Aurelian Campeas and Anders Lehmann + +The main goal of the sprint was to enable translation of the Logic objspace with constraint variables, constraint propagation and distribution, using clonable computationspaces the Oz style. + +After several attempts, in the well known style of translate add "assert isinstance(..." translate again ...., we reached at a point were we tripped a bug in the inlining code. + +After that bug was fixed we believe that the goal was reached and the Logic objectspace now translates! + +We were not able to actually test if it works though, during the sprint. + +As a job to do while we were waiting for the translation to fail, a small test object space were made to experiment with clonable threads. This is not committed as the Logic objecspace contains the functionality. + +We also took a stab at "recomputation" (an optimisation technique from Oz). The code was not quite finished at the end of the sprint and is thus uncommitted. + From arigo at codespeak.net Mon Oct 2 11:57:44 2006 From: arigo at codespeak.net (arigo at codespeak.net) Date: Mon, 2 Oct 2006 11:57:44 +0200 (CEST) Subject: [pypy-svn] r32809 - pypy/dist/pypy/translator/c Message-ID: <20061002095744.CF73B1006F@code0.codespeak.net> Author: arigo Date: Mon Oct 2 11:57:40 2006 New Revision: 32809 Modified: pypy/dist/pypy/translator/c/gc.py Log: A subclass just to rename 'boehm rtti' to 'framework rtti' when relevant. Modified: pypy/dist/pypy/translator/c/gc.py ============================================================================== --- pypy/dist/pypy/translator/c/gc.py (original) +++ pypy/dist/pypy/translator/c/gc.py Mon Oct 2 11:57:40 2006 @@ -276,6 +276,9 @@ def implementation(self): yield 'char %s /* uninitialized */;' % self.name +class FrameworkGcRuntimeTypeInfo_OpaqueNode(BoehmGcRuntimeTypeInfo_OpaqueNode): + nodekind = 'framework rtti' + class MoreExactBoehmGcPolicy(BoehmGcPolicy): """ policy to experiment with giving some layout information to boehm. Use @@ -389,10 +392,10 @@ pass def rtti_type(self): - return BoehmGcRuntimeTypeInfo_OpaqueNode.typename + return FrameworkGcRuntimeTypeInfo_OpaqueNode.typename def rtti_node_factory(self): - return BoehmGcRuntimeTypeInfo_OpaqueNode + return FrameworkGcRuntimeTypeInfo_OpaqueNode def pre_pre_gc_code(self): yield '#define USING_FRAMEWORK_GC' From auc at codespeak.net Mon Oct 2 12:05:50 2006 From: auc at codespeak.net (auc at codespeak.net) Date: Mon, 2 Oct 2006 12:05:50 +0200 (CEST) Subject: [pypy-svn] r32810 - pypy/extradoc/sprintinfo/paris Message-ID: <20061002100550.060CE10074@code0.codespeak.net> Author: auc Date: Mon Oct 2 12:05:48 2006 New Revision: 32810 Modified: pypy/extradoc/sprintinfo/paris/paris-minisprint09-2006.txt Log: typos, format, more info Modified: pypy/extradoc/sprintinfo/paris/paris-minisprint09-2006.txt ============================================================================== --- pypy/extradoc/sprintinfo/paris/paris-minisprint09-2006.txt (original) +++ pypy/extradoc/sprintinfo/paris/paris-minisprint09-2006.txt Mon Oct 2 12:05:48 2006 @@ -1,18 +1,31 @@ Sprint report Paris mini sprint September 25th to 29th ======================================================== +Participants: Aur?lien Camp?as and Anders Lehmann. -Participants: Aurelian Campeas and Anders Lehmann - -The main goal of the sprint was to enable translation of the Logic objspace with constraint variables, constraint propagation and distribution, using clonable computationspaces the Oz style. - -After several attempts, in the well known style of translate add "assert isinstance(..." translate again ...., we reached at a point were we tripped a bug in the inlining code. - -After that bug was fixed we believe that the goal was reached and the Logic objectspace now translates! - -We were not able to actually test if it works though, during the sprint. - -As a job to do while we were waiting for the translation to fail, a small test object space were made to experiment with clonable threads. This is not committed as the Logic objecspace contains the functionality. - -We also took a stab at "recomputation" (an optimisation technique from Oz). The code was not quite finished at the end of the sprint and is thus uncommitted. +The main goal of the sprint was to enable translation of the Logic +objspace with constraint variables, constraint propagation and +distribution, using clonable computationspaces the Oz style. + +After several attempts, in the well known style of translate, add +"assert isinstance(...", translate again ...., we reached a point +were we tripped a bug in the inlining code. + +After that bug was fixed we believe that the goal was reached and the +Logic objectspace now translates! + +We were not able to actually test if it works though, during the +sprint. + +As a job to do while we were waiting for the translation to fail, a +small test object space were made to experiment with clonable +application level threads. This is not committed as the Logic +objecspace contains the functionality. + +We also took a stab at "recomputation" (an optimisation technique from +Oz). Lastly, we did some changes to the constraint solver so that it +can run in interpreted mode (this remains completely impossible with +logic programs), i.e without the low-level coroutine cloning +facility. The code was not quite finished at the end of the sprint and +is still uncommitted. From pedronis at codespeak.net Mon Oct 2 13:00:12 2006 From: pedronis at codespeak.net (pedronis at codespeak.net) Date: Mon, 2 Oct 2006 13:00:12 +0200 (CEST) Subject: [pypy-svn] r32814 - pypy/dist/pypy/jit/codegen/i386/test Message-ID: <20061002110012.2C48910070@code0.codespeak.net> Author: pedronis Date: Mon Oct 2 13:00:08 2006 New Revision: 32814 Modified: pypy/dist/pypy/jit/codegen/i386/test/test_auto_encoding.py Log: try to not hang on recent apple as Modified: pypy/dist/pypy/jit/codegen/i386/test/test_auto_encoding.py ============================================================================== --- pypy/dist/pypy/jit/codegen/i386/test/test_auto_encoding.py (original) +++ pypy/dist/pypy/jit/codegen/i386/test/test_auto_encoding.py Mon Oct 2 13:00:08 2006 @@ -262,7 +262,7 @@ def test_auto(): import os - g = os.popen('as --version') + g = os.popen('as -version &1') data = g.read() g.close() if not data.startswith('GNU assembler'): From antocuni at codespeak.net Mon Oct 2 13:09:58 2006 From: antocuni at codespeak.net (antocuni at codespeak.net) Date: Mon, 2 Oct 2006 13:09:58 +0200 (CEST) Subject: [pypy-svn] r32815 - in pypy/dist/pypy/translator/cli: . test Message-ID: <20061002110958.03FA310078@code0.codespeak.net> Author: antocuni Date: Mon Oct 2 13:09:55 2006 New Revision: 32815 Modified: pypy/dist/pypy/translator/cli/database.py pypy/dist/pypy/translator/cli/test/test_constant.py Log: When using lazyness there can be a problem when initializing a constant whose items contains r_dicts containing the constants itself, because ll_set could try to access fields not yet intitialized. For now simply initialize the r_dict at last, but we should think a more general way to handle things. Modified: pypy/dist/pypy/translator/cli/database.py ============================================================================== --- pypy/dist/pypy/translator/cli/database.py (original) +++ pypy/dist/pypy/translator/cli/database.py Mon Oct 2 13:09:55 2006 @@ -679,16 +679,35 @@ INSTANCE = self.value._TYPE if INSTANCE is not self.static_type: ilasm.opcode('castclass', self.cts.lltype_to_cts(INSTANCE, include_class=False)) + + # XXX, horrible hack: first collect all consts, then render + # CustomDicts at last because their ll_set could need other + # fields already initialized. We should really think a more + # general way to handle such things. + const_list = [] while INSTANCE is not None: for name, (TYPE, default) in INSTANCE._fields.iteritems(): if TYPE is ootype.Void: continue value = getattr(self.value, name) - type_ = self.cts.lltype_to_cts(TYPE) - ilasm.opcode('dup') - AbstractConst.load(self.db, TYPE, value, ilasm) - ilasm.opcode('stfld %s %s::%s' % (type_, self.db.class_name(INSTANCE), name)) + const_list.append((TYPE, INSTANCE, name, value)) INSTANCE = INSTANCE._superclass + + def mycmp(x, y): + if isinstance(x[0], ootype.CustomDict) and not isinstance(y[0], ootype.CustomDict): + return 1 # a CustomDict is always greater than non-CustomDicts + elif isinstance(y[0], ootype.CustomDict) and not isinstance(x[0], ootype.CustomDict): + return -1 # a non-CustomDict is always less than CustomDicts + else: + return cmp(x, y) + const_list.sort(mycmp) + + for TYPE, INSTANCE, name, value in const_list: + type_ = self.cts.lltype_to_cts(TYPE) + ilasm.opcode('dup') + AbstractConst.load(self.db, TYPE, value, ilasm) + ilasm.opcode('stfld %s %s::%s' % (type_, self.db.class_name(INSTANCE), name)) + ilasm.opcode('pop') class WeakRefConst(AbstractConst): Modified: pypy/dist/pypy/translator/cli/test/test_constant.py ============================================================================== --- pypy/dist/pypy/translator/cli/test/test_constant.py (original) +++ pypy/dist/pypy/translator/cli/test/test_constant.py Mon Oct 2 13:09:55 2006 @@ -96,3 +96,24 @@ return c[i] != c[i] assert self.interpret(fn, [0]) == True assert self.interpret(fn2, [1]) == True + + def test_customdict_circular(self): + from pypy.rpython.objectmodel import r_dict + def key_eq(a, b): + return a.x[0] == b.x[0] + def key_hash(a): + return ord(a.x[0]) + + class A: + def __init__(self, x): + self.x = x + a = A('foo') + a.dict = r_dict(key_eq, key_hash) + a.dict[a] = 42 + def fn(b): + if b: + s = A('foo') + else: + s = A('bar') + return a.dict[s] + assert self.interpret(fn, [True]) == 42 From ale at codespeak.net Mon Oct 2 14:27:05 2006 From: ale at codespeak.net (ale at codespeak.net) Date: Mon, 2 Oct 2006 14:27:05 +0200 (CEST) Subject: [pypy-svn] r32817 - in pypy/dist/pypy/lib/pyontology: . test Message-ID: <20061002122705.F08E310079@code0.codespeak.net> Author: ale Date: Mon Oct 2 14:27:03 2006 New Revision: 32817 Modified: pypy/dist/pypy/lib/pyontology/constraint_classes.py pypy/dist/pypy/lib/pyontology/pyontology.py pypy/dist/pypy/lib/pyontology/sparql_grammar.py pypy/dist/pypy/lib/pyontology/test/test_sparql.py Log: Some progress in adding sparql queries Modified: pypy/dist/pypy/lib/pyontology/constraint_classes.py ============================================================================== --- pypy/dist/pypy/lib/pyontology/constraint_classes.py (original) +++ pypy/dist/pypy/lib/pyontology/constraint_classes.py Mon Oct 2 14:27:03 2006 @@ -199,7 +199,7 @@ for item in val: for otheritem in val: if (otheritem == item) == False: - raise ConsistencyFailure("FunctionalCardinality error: %s for property %s" % (cls, self.variable)) + raise ConsistencyFailure("FunctionalCardinality error: %s for property %s with %r" % (cls, self.variable, val)) else: return 0 Modified: pypy/dist/pypy/lib/pyontology/pyontology.py ============================================================================== --- pypy/dist/pypy/lib/pyontology/pyontology.py (original) +++ pypy/dist/pypy/lib/pyontology/pyontology.py Mon Oct 2 14:27:03 2006 @@ -3,6 +3,7 @@ from logilab.constraint.fd import Expression, FiniteDomain as fd from logilab.constraint.propagation import AbstractDomain, AbstractConstraint,\ ConsistencyFailure +from pypy.lib.pyontology.sparql_grammar import SPARQLGrammar as SP from constraint_classes import * import sys, py import datetime, time @@ -40,10 +41,12 @@ def check_format(f): if type(f) == str: tmp = file(f, "r") - else: + elif hasattr(f, 'open'): tmp = f.open() + else: + tmp = f start = tmp.read(10) - tmp.close() + tmp.seek(0) if "<" in start: format = "xml" else: @@ -430,6 +433,7 @@ tmp.load(f, format=format) for triple in tmp.triples((None,)*3): self.add(triple) +# self.consider_triple(triple) def load_file(self, f, format=None): if not format: @@ -449,7 +453,106 @@ if isinstance( self.variables[key], fd): continue self.variables[key].finish(self.variables, self.constraints) +# try: constraint.narrow(self.variables) +# except ConsistencyFailure, e: +# print "FAilure", e + + def _sparql(self, query): + qe = SP.Query.parseString(query)[0] + + prefixes = qe.PrefixDecl[0] + + resvars = [] + for v in qe.SelectQuery[0].VARNAME: + resvars.append(v[0]) + + where = qe.SelectQuery[0].WhereClause[0] + + triples = where.GroupGraphPattern[0].Triples +# import pdb +# pdb.set_trace() + new = [] + for trip in triples: + case = 1 + inc = 0 + newtrip = [] + trip = list(trip) + for item in trip: + if isinstance(item, Literal): + print "!!!!!!!",item + newtrip.append(item) + elif item.NCNAME_PREFIX: + uri = prefixes[item.NCNAME_PREFIX[0]] + item.NCNAME[0] + newtrip.append(URIRef(uri)) + elif item.getName() == 'VAR1': + newtrip.append(URIRef('query_'+item[0])) + case += trip.index(item) + inc + print "Case calc", case, inc, list(trip).index(item),item + if inc: + inc = 1 + else: + inc = 2 + else: + newtrip.append(item[0]) + newtrip.append(case) + new.append(newtrip) + constrain = where.GroupGraphPattern[0].Constraint + return new, prefixes, resvars, constrain + +# There are 8 ways of having the triples in the query, if predicate is not a builtin owl predicate +# +# case s p o +# +# 0 bound bound bound ; Check if this triple entails +# 1 var bound bound ; add a hasvalue constraint +# 2 bound var bound ; for all p's return p if p[0]==s and p[1]==o +# 3 bound bound var ; search for s in p +# 4 var var bound ; for all p's return p[0] if p[1]==o +# 5 var bound var ; return the values of p +# 6 bound var var ; for all p's return p[1] if p[0]==s +# 7 var var var ; for all p's return p.getvalues +# + + def sparql(self, query): + new, prefixes, resvars, constrain = self._sparql(query) + for trip in new: + case = trip.pop(-1) + if case == 0: + # Check if this triple entails + self.consider_triple(trip) + elif case == 1: + # Add a HasValue constraint + var = self.make_var(Restriction, URIRef(trip[0])) + self.onProperty(var, URIRef(trip[1])) + self.hasValue(var, trip[2]) + elif case == 2: + # for all p's return p if p[0]==s and p[1]==o + prop = self.make_var(Property, URIRef(trip[1])) + self.type(URIRef(trip[1]), namespaces['owl']+'Property') + elif case == 3: + # search for s in p + prop = self.make_var(None, trip[1]) + p_vals = self.variables[prop].getValuesPrKey(self.make_var(trip[0])) + print "========",p_vals + p_vals = p_vals[0][1] + var = self.make_var(Thing, trip[2]) + self.variables[var].setValues((p_vals)) + elif case == 4: + # for all p's return p[0] if p[1]==o + pass + elif case == 5: + # return the values of p + pass + elif case == 6: + # for all p's return p[1] if p[0]==s + pass + elif case == 7: + # for all p's return p.getvalues + pass + + self.consistency() + def consider_triple(self,(s, p, o)): if (s, p, o) in self.seen: @@ -622,8 +725,6 @@ # the extension of s it must be in the extension of # var - # what I really want is to just say s.bases.append(var) - log("%r subClassOf %r "%(s, var)) avar = self.make_var(ClassDomain, var) svar = self.make_var(ClassDomain, s) Modified: pypy/dist/pypy/lib/pyontology/sparql_grammar.py ============================================================================== --- pypy/dist/pypy/lib/pyontology/sparql_grammar.py (original) +++ pypy/dist/pypy/lib/pyontology/sparql_grammar.py Mon Oct 2 14:27:03 2006 @@ -5,7 +5,7 @@ TokenConverter, Empty, Suppress, NoMatch, CharsNotIn, ParseResults from pyparsing import Literal as ppLiteral # name Literal assigned by grammar - +from rdflib import Literal as rdfliteral DEBUG = 0 def punctuation(lit, d=False): @@ -23,6 +23,15 @@ if DEBUG or d: o.setDebug() return o +def replace_int(s, loc, toks): + return [rdfliteral(int(toks[0]), datatype="http://www.w3.org/2001/XMLSchema#int")] + + +def replace_string(s, loc, toks): + return [rdfliteral((toks[0]), datatype="http://www.w3.org/2001/XMLSchema#String")] + +def replace_float(s, loc, toks): + return [rdfliteral(float(toks[0]), datatype="http://www.w3.org/2001/XMLSchema#float")] class SPARQLGrammar(object): @@ -166,7 +175,7 @@ NumericLiteral = production('NumericLiteral') RDFLiteral = production('RDFLiteral') BooleanLiteral = production('BooleanLiteral') - String = production('String') + String = production('String').setParseAction(replace_string) IRIref = production('IRIref') QName = production('QName') BlankNode = production('BlankNode') @@ -177,10 +186,10 @@ VAR1 = production('VAR1') VAR2 = production('VAR2') LANGTAG = production('LANGTAG') - INTEGER = production('INTEGER') - DECIMAL = production('DECIMAL') - FLOATING_POINT = production('FLOATING_POINT') - EXPONENT = production('EXPONENT') + INTEGER = production('INTEGER').setParseAction(replace_int) + DECIMAL = production('DECIMAL').setParseAction(replace_float) + FLOATING_POINT = production('FLOATING_POINT').setParseAction(replace_float) + EXPONENT = production('EXPONENT').setParseAction(replace_float) STRING_LITERAL1 = production('STRING_LITERAL1') STRING_LITERAL2 = production('STRING_LITERAL2') STRING_LITERAL_LONG1 = production('STRING_LITERAL_LONG1') @@ -324,7 +333,7 @@ # ObjectList ::= Object ( ',' ObjectList )? - ObjectList << Group(Object + Optional(comma + ObjectList)) + ObjectList << (Object + Optional(comma + ObjectList)) # Verb ::= VarOrBlankNodeOrIRIref | 'a' @@ -364,7 +373,7 @@ # Var ::= VAR1 | VAR2 - Var << (VAR1 | VAR2) + Var << (VAR1 | VAR2) # GraphTerm ::= RDFTerm | '(' ')' Modified: pypy/dist/pypy/lib/pyontology/test/test_sparql.py ============================================================================== --- pypy/dist/pypy/lib/pyontology/test/test_sparql.py (original) +++ pypy/dist/pypy/lib/pyontology/test/test_sparql.py Mon Oct 2 14:27:03 2006 @@ -1,10 +1,14 @@ + try: import pyparsing + import rdflib except ImportError: from py.test import skip - skip("Pyparsing not installed") + skip("Pyparsing or Rdflib not installed") from pypy.lib.pyontology.sparql_grammar import SPARQLGrammar as SP +from pypy.lib.pyontology.pyontology import Ontology, ConsistencyFailure +import py qt = """ PREFIX ns: @@ -26,52 +30,24 @@ assert len(triples) == 2 assert triples[0][0].getName() == 'VAR1' assert triples[1][0].getName() == 'VAR1' - assert triples[1][0][0] == 'x' - assert triples[0][0][0] == 'y' + assert triples[1][0][0][0] == 'x' + assert triples[0][0][0][0] == 'y' assert triples[1][1].asList() == ['ns', 'p'] assert triples[0][1].asList() == ['ns', 'q'] - assert triples[1][2][0] == '123' - assert triples[1][2].getName() == 'Object' - vars = query.SelectQuery[0].VARNAME + assert triples[1][2] == '123' + assert type(triples[1][2]) == rdflib.Literal + vars = query.SelectQuery[0].VAR1 assert len(vars) == 2 assert 'x' in vars[0][0] assert 'y' in vars[1][0] -class notest: - - def sparql(self, query): - qe = SP.Query.parseString(query)[0] - - prefixes = qe.PrefixDecl[0] - - resvars = [] - for v in qe.SelectQuery[0].VARNAME: - resvars.append(v[0]) - - where = qe.SelectQuery[0].WhereClause[0] - - triples = where.GroupGraphPattern[0].Triples - new = [] - for trip in triples: - newtrip = [] - for item in trip: - if item.NCNAME_PREFIX: - uri = prefixes[item.NCNAME_PREFIX[0]] + item.NCNAME[0] - newtrip.append(uri) - elif item.getName() == 'VAR1': - newtrip.append(item[0]) - else: - newtrip.append(item) - new.append(newtrip) - constrain = where.GroupGraphPattern[0].Constraint - return new, prefixes, resvars, constrain def test_sparql(): - n = notest() - result = n.sparql(qt) + n = Ontology() + result = n._sparql(qt) res = result[0] assert len(res) == 2 - assert len(res[0]) == len(res[1]) == 3 + assert len(res[0]) == len(res[1]) == 4 assert res[0][1] in ['http://example.org/ns#p', 'http://example.org/ns#q'] assert res[1][1] in ['http://example.org/ns#p', 'http://example.org/ns#q'] assert result[3][0] == 'x<2' @@ -90,4 +66,124 @@ # var var var ; for all p's return p.getvalues # # If p is a builtin owl property +Onto = """ + + + + + + + + 123 + + + """ + +qt_proto = """ + PREFIX ns: + SELECT %s + WHERE { + %s + } + """ +from StringIO import StringIO + +def test_case_0(): + """ Check if the triple is entailed """ + py.test.skip("Doesn't work yet") + + query = qt_proto % ('?x', 'ns:sub ns:p 123 .') + O = Ontology() + O.add_file(StringIO(Onto)) + raises(ConsistencyFailure, O.sparql, query) + +def test_case_1(): + #""" add a hasvalue constraint """ + + query = qt_proto % ('?x', '?x ns:p 123 .') + O = Ontology() + O.add_file(StringIO(Onto)) + O.attach_fd() + print "Attached" + O.sparql(query) + assert list(O.variables['query_x_'].getValues())[0].uri == u'#sub' + +def test_case_2(): + "for all p's return p if p[0]==s and p[1]==o """ + py.test.skip("Doesn't work yet") + + query = qt_proto % ('?x', 'ns:sub ?x 123 .') + O = Ontology() + O.add_file(StringIO(Onto)) + O.attach_fd() + + O.sparql(query) + assert list(O.variables['query_x_'].getValues())[0] == 'ns:sub' + +def test_case_3(): + """search for s in p""" +# py.test.skip("Doesn't work yet") + + query = qt_proto % ('?x', 'ns:sub ns:p ?x .') + O = Ontology() + O.add_file(StringIO(Onto)) + + O.attach_fd() + + O.sparql(query) + assert list(O.variables['query_x_'].getValues())[0] == '123' + +def test_case_4(): + """ search for s in p """ + py.test.skip("Doesn't work yet") + + query = qt_proto % ('?x ?y', '?x ?y 123 .') + O = Ontology() + O.add_file(StringIO(Onto)) + O.attach_fd() + + O.sparql(query) + assert list(O.variables['query_x_'].getValues())[0].uri == u'#sub' + +def test_case_5(): + """ for all p's return p[0] if p[1]==o """ + py.test.skip("Doesn't work yet") + + query = qt_proto % ('?x ?y', '?x ns:p ?y .') + O = Ontology() + O.add_file(StringIO(Onto)) + O.attach_fd() + + O.sparql(query) + assert list(O.variables['query_x_'].getValues())[0].uri == u'#sub' + +def test_case_6(): + """ return the values of p """ + py.test.skip("Doesn't work yet") + + query = qt_proto % ('?x ?y', 'ns:sub ?x ?y .') + O = Ontology() + O.add_file(StringIO(Onto)) + O.attach_fd() + + O.sparql(query) + assert list(O.variables['query_x_'].getValues())[0].uri == u'#sub' + +def test_case_7(): + """ for all p's return p[1] if p[0]==s """ + py.test.skip("Doesn't work yet") + + query = qt_proto % ('?x ?y ?z', '?x ?y ?z .') + O = Ontology() + O.add_file(StringIO(Onto)) + O.attach_fd() + + O.sparql(query) + assert list(O.variables['query_x_'].getValues())[0].uri == u'#sub' + + From antocuni at codespeak.net Mon Oct 2 14:38:20 2006 From: antocuni at codespeak.net (antocuni at codespeak.net) Date: Mon, 2 Oct 2006 14:38:20 +0200 (CEST) Subject: [pypy-svn] r32818 - pypy/dist/pypy/doc/discussion Message-ID: <20061002123820.253881007C@code0.codespeak.net> Author: antocuni Date: Mon Oct 2 14:38:19 2006 New Revision: 32818 Modified: pypy/dist/pypy/doc/discussion/cli-optimizations.txt Log: Add a note to rembember to do this optimization. Modified: pypy/dist/pypy/doc/discussion/cli-optimizations.txt ============================================================================== --- pypy/dist/pypy/doc/discussion/cli-optimizations.txt (original) +++ pypy/dist/pypy/doc/discussion/cli-optimizations.txt Mon Oct 2 14:38:19 2006 @@ -194,3 +194,13 @@ lookup. +Optimize StaticMethod +--------------------- + +2006-10-02, 13:41 + + antocuni: do you try to not wrap static methods that are just called and not passed around + no + I think I don't know how to detect them + antocuni: you should try to render them just as static methods not as instances when possible + you need to track what appears only in direct_calls vs other places From ale at codespeak.net Mon Oct 2 14:55:23 2006 From: ale at codespeak.net (ale at codespeak.net) Date: Mon, 2 Oct 2006 14:55:23 +0200 (CEST) Subject: [pypy-svn] r32819 - in pypy/dist/pypy/lib/pyontology: . test Message-ID: <20061002125523.70A951007E@code0.codespeak.net> Author: ale Date: Mon Oct 2 14:55:21 2006 New Revision: 32819 Modified: pypy/dist/pypy/lib/pyontology/pyontology.py pypy/dist/pypy/lib/pyontology/test/test_sparql.py Log: Added another case of sparql query, removed prints .. Modified: pypy/dist/pypy/lib/pyontology/pyontology.py ============================================================================== --- pypy/dist/pypy/lib/pyontology/pyontology.py (original) +++ pypy/dist/pypy/lib/pyontology/pyontology.py Mon Oct 2 14:55:21 2006 @@ -470,8 +470,6 @@ where = qe.SelectQuery[0].WhereClause[0] triples = where.GroupGraphPattern[0].Triples -# import pdb -# pdb.set_trace() new = [] for trip in triples: case = 1 @@ -480,7 +478,6 @@ trip = list(trip) for item in trip: if isinstance(item, Literal): - print "!!!!!!!",item newtrip.append(item) elif item.NCNAME_PREFIX: uri = prefixes[item.NCNAME_PREFIX[0]] + item.NCNAME[0] @@ -488,7 +485,6 @@ elif item.getName() == 'VAR1': newtrip.append(URIRef('query_'+item[0])) case += trip.index(item) + inc - print "Case calc", case, inc, list(trip).index(item),item if inc: inc = 1 else: @@ -534,7 +530,6 @@ # search for s in p prop = self.make_var(None, trip[1]) p_vals = self.variables[prop].getValuesPrKey(self.make_var(trip[0])) - print "========",p_vals p_vals = p_vals[0][1] var = self.make_var(Thing, trip[2]) self.variables[var].setValues((p_vals)) @@ -543,7 +538,13 @@ pass elif case == 5: # return the values of p - pass + prop = self.make_var(Property, URIRef(trip[1])) + p_vals = self.variables[prop].getValues() + var = self.make_var(Thing, trip[0]) + self.variables[var].setValues([v[0] for v in p_vals]) + p_vals = self.variables[prop].getValues() + var = self.make_var(Thing, trip[2]) + self.variables[var].setValues([v[1] for v in p_vals]) elif case == 6: # for all p's return p[1] if p[0]==s pass Modified: pypy/dist/pypy/lib/pyontology/test/test_sparql.py ============================================================================== --- pypy/dist/pypy/lib/pyontology/test/test_sparql.py (original) +++ pypy/dist/pypy/lib/pyontology/test/test_sparql.py Mon Oct 2 14:55:21 2006 @@ -108,7 +108,6 @@ O = Ontology() O.add_file(StringIO(Onto)) O.attach_fd() - print "Attached" O.sparql(query) assert list(O.variables['query_x_'].getValues())[0].uri == u'#sub' @@ -151,7 +150,7 @@ def test_case_5(): """ for all p's return p[0] if p[1]==o """ - py.test.skip("Doesn't work yet") + #py.test.skip("Doesn't work yet") query = qt_proto % ('?x ?y', '?x ns:p ?y .') O = Ontology() @@ -160,6 +159,7 @@ O.sparql(query) assert list(O.variables['query_x_'].getValues())[0].uri == u'#sub' + assert list(O.variables['query_y_'].getValues())[0] == u'123' def test_case_6(): """ return the values of p """ From antocuni at codespeak.net Mon Oct 2 16:11:58 2006 From: antocuni at codespeak.net (antocuni at codespeak.net) Date: Mon, 2 Oct 2006 16:11:58 +0200 (CEST) Subject: [pypy-svn] r32821 - pypy/dist/pypy/doc/discussion Message-ID: <20061002141158.E12C510080@code0.codespeak.net> Author: antocuni Date: Mon Oct 2 16:11:56 2006 New Revision: 32821 Modified: pypy/dist/pypy/doc/discussion/cli-optimizations.txt Log: Another possible optimization for gencli. Modified: pypy/dist/pypy/doc/discussion/cli-optimizations.txt ============================================================================== --- pypy/dist/pypy/doc/discussion/cli-optimizations.txt (original) +++ pypy/dist/pypy/doc/discussion/cli-optimizations.txt Mon Oct 2 16:11:56 2006 @@ -204,3 +204,22 @@ I think I don't know how to detect them antocuni: you should try to render them just as static methods not as instances when possible you need to track what appears only in direct_calls vs other places + + +Optimize Unicode +---------------- + +We should try to use native .NET unicode facilities instead of our +own. These should save both time (especially startup time) and memory. + +On 2006-10-02 I got these benchmarks: + +Pypy.NET Startup time Memory used +with unicodedata ~12 sec 112508 Kb +without unicodedata ~6 sec 79004 Kb + +The version without unicodedata is buggy, of course. + +Unfortunately it seems that .NET doesn't expose all the things we +need, so we will still need some data. For example there is no way to +get the unicode name of a char. From antocuni at codespeak.net Mon Oct 2 16:16:38 2006 From: antocuni at codespeak.net (antocuni at codespeak.net) Date: Mon, 2 Oct 2006 16:16:38 +0200 (CEST) Subject: [pypy-svn] r32822 - pypy/dist/pypy/translator/cli Message-ID: <20061002141638.1546C10082@code0.codespeak.net> Author: antocuni Date: Mon Oct 2 16:16:37 2006 New Revision: 32822 Modified: pypy/dist/pypy/translator/cli/opcodes.py Log: Implement llong_neg_ovf Modified: pypy/dist/pypy/translator/cli/opcodes.py ============================================================================== --- pypy/dist/pypy/translator/cli/opcodes.py (original) +++ pypy/dist/pypy/translator/cli/opcodes.py Mon Oct 2 16:16:37 2006 @@ -158,6 +158,7 @@ 'llong_is_true': [PushAllArgs, 'ldc.i8 0', 'cgt.un'], 'llong_neg': 'neg', + 'llong_neg_ovf': _check_ovf(['ldc.i8 0', PushAllArgs, 'sub.ovf', StoreResult]), 'llong_abs': _abs('int64'), 'llong_invert': 'not', From antocuni at codespeak.net Mon Oct 2 16:17:13 2006 From: antocuni at codespeak.net (antocuni at codespeak.net) Date: Mon, 2 Oct 2006 16:17:13 +0200 (CEST) Subject: [pypy-svn] r32823 - pypy/dist/pypy/translator/cli Message-ID: <20061002141713.5861F10084@code0.codespeak.net> Author: antocuni Date: Mon Oct 2 16:17:12 2006 New Revision: 32823 Modified: pypy/dist/pypy/translator/cli/database.py Log: Lazy initialization doesn't work with the whole interpreter, disable it for now. Modified: pypy/dist/pypy/translator/cli/database.py ============================================================================== --- pypy/dist/pypy/translator/cli/database.py (original) +++ pypy/dist/pypy/translator/cli/database.py Mon Oct 2 16:17:12 2006 @@ -23,7 +23,7 @@ DEBUG_CONST_INIT = False DEBUG_CONST_INIT_VERBOSE = False MAX_CONST_PER_STEP = 100 -LAZYNESS = True +LAZYNESS = False CONST_NAMESPACE = 'pypy.runtime' CONST_CLASS = 'Constants' From pedronis at codespeak.net Mon Oct 2 16:57:19 2006 From: pedronis at codespeak.net (pedronis at codespeak.net) Date: Mon, 2 Oct 2006 16:57:19 +0200 (CEST) Subject: [pypy-svn] r32824 - pypy/extradoc/talk/dls2006 Message-ID: <20061002145719.EF09E1008A@code0.codespeak.net> Author: pedronis Date: Mon Oct 2 16:57:17 2006 New Revision: 32824 Modified: pypy/extradoc/talk/dls2006/pypy-vm-construction.pdf (props changed) Log: change mime type From cfbolz at codespeak.net Mon Oct 2 17:17:35 2006 From: cfbolz at codespeak.net (cfbolz at codespeak.net) Date: Mon, 2 Oct 2006 17:17:35 +0200 (CEST) Subject: [pypy-svn] r32826 - in pypy/dist/pypy/config: . test Message-ID: <20061002151735.A8CD71008F@code0.codespeak.net> Author: cfbolz Date: Mon Oct 2 17:17:34 2006 New Revision: 32826 Modified: pypy/dist/pypy/config/config.py pypy/dist/pypy/config/test/test_config.py Log: for every boolean option add an equivalent --no-... option. The help for it is a bit strange still. Modified: pypy/dist/pypy/config/config.py ============================================================================== --- pypy/dist/pypy/config/config.py (original) +++ pypy/dist/pypy/config/config.py Mon Oct 2 17:17:34 2006 @@ -193,7 +193,20 @@ parser.add_option(help=self.doc, action='callback', callback=_callback, *argnames) - + no_argnames = ["--no-" + argname.lstrip("-") for argname in argnames + if argname.startswith("--")] + if len(no_argnames) == 0: + no_argnames = ["--no-" + argname.lstrip("-") + for argname in argnames] + def _callback(option, opt_str, value, parser, *args, **kwargs): + try: + config.setoption(self._name, False, who='cmdline') + except ValueError, e: + raise optparse.OptionValueError(e.args[0]) + parser.add_option(help="unset option set by %s" % (argnames[0], ), + action='callback', + callback=_callback, *no_argnames) + class IntOption(Option): def __init__(self, name, doc, default=0, cmdline=DEFAULT_OPTION_NAME): super(IntOption, self).__init__(name, doc, cmdline) Modified: pypy/dist/pypy/config/test/test_config.py ============================================================================== --- pypy/dist/pypy/config/test/test_config.py (original) +++ pypy/dist/pypy/config/test/test_config.py Mon Oct 2 17:17:34 2006 @@ -131,24 +131,28 @@ assert config.int == 2 assert config.float == 0.1 - py.test.raises(SystemExit, + py.test.raises(SystemExit, "(options, args) = parser.parse_args(args=['--int=foo', '-f bar'])") def test_to_optparse_bool(): - booloption = BoolOption('bool', 'Boolean option test', default=False, - cmdline='--bool -b') - descr = OptionDescription('test', '', [booloption]) + booloption1 = BoolOption('bool1', 'Boolean option test', default=False, + cmdline='--bool1 -b') + booloption2 = BoolOption('bool2', 'Boolean option test', default=True, + cmdline='--bool2 -c') + descr = OptionDescription('test', '', [booloption1, booloption2]) config = Config(descr) - parser = to_optparse(config, ['bool']) + parser = to_optparse(config, ['bool1', 'bool2']) (options, args) = parser.parse_args(args=['-b']) - assert config.bool + assert config.bool1 + assert config.bool2 config = Config(descr) - parser = to_optparse(config, ['bool']) - (options, args) = parser.parse_args(args=[]) - assert not config.bool + parser = to_optparse(config, ['bool1', 'bool2']) + (options, args) = parser.parse_args(args=['--no-bool2']) + assert not config.bool1 + assert not config.bool2 py.test.raises(SystemExit, "(options, args) = parser.parse_args(args=['-bfoo'])") From cfbolz at codespeak.net Mon Oct 2 17:23:06 2006 From: cfbolz at codespeak.net (cfbolz at codespeak.net) Date: Mon, 2 Oct 2006 17:23:06 +0200 (CEST) Subject: [pypy-svn] r32827 - in pypy/dist/pypy/config: . test Message-ID: <20061002152306.19D7D10092@code0.codespeak.net> Author: cfbolz Date: Mon Oct 2 17:23:04 2006 New Revision: 32827 Modified: pypy/dist/pypy/config/config.py pypy/dist/pypy/config/test/test_config.py Log: make it possible to say --usemodules=-math to disable a module which is by default enabled. Modified: pypy/dist/pypy/config/config.py ============================================================================== --- pypy/dist/pypy/config/config.py (original) +++ pypy/dist/pypy/config/config.py Mon Oct 2 17:23:04 2006 @@ -284,11 +284,16 @@ values = value.split(",") for value in values: value = value.strip() + if value.startswith("-"): + value = value[1:] + set_to = False + else: + set_to = True option = getattr(self, value, None) if option is None: raise ValueError("did not find option %s" % (value, )) getattr(config, self._name).setoption( - value, True, who='cmdline') + value, set_to, who='cmdline') except ValueError, e: raise optparse.OptionValueError(e.args[0]) parser.add_option(help=self._name, action='callback', type='string', Modified: pypy/dist/pypy/config/test/test_config.py ============================================================================== --- pypy/dist/pypy/config/test/test_config.py (original) +++ pypy/dist/pypy/config/test/test_config.py Mon Oct 2 17:23:04 2006 @@ -167,6 +167,8 @@ default=False), BoolOption("strdict", "use dictionaries optimized for string keys", default=False), + BoolOption("normal", "do nothing special", + default=True), ], cmdline="--test") descr = OptionDescription("all", '', [group]) config = Config(descr) @@ -177,6 +179,7 @@ assert config.test.smallint assert config.test.strjoin assert config.test.strdict + assert config.test.normal config = Config(descr) parser = to_optparse(config, ['test']) @@ -186,6 +189,17 @@ assert config.test.smallint assert not config.test.strjoin assert not config.test.strdict + assert config.test.normal + + config = Config(descr) + parser = to_optparse(config, ['test']) + (options, args) = parser.parse_args( + args=['--test=-normal,smallint']) + + assert config.test.smallint + assert not config.test.strjoin + assert not config.test.strdict + assert not config.test.normal def test_config_start(): descr = make_description() From arigo at codespeak.net Mon Oct 2 17:58:55 2006 From: arigo at codespeak.net (arigo at codespeak.net) Date: Mon, 2 Oct 2006 17:58:55 +0200 (CEST) Subject: [pypy-svn] r32828 - in pypy/dist/pypy: config interpreter Message-ID: <20061002155855.1AFFC10094@code0.codespeak.net> Author: arigo Date: Mon Oct 2 17:58:54 2006 New Revision: 32828 Modified: pypy/dist/pypy/config/pypyoption.py pypy/dist/pypy/interpreter/baseobjspace.py Log: For now, don't compile the unicodedata app-level module by default. This makes pypy-c half the size! It also seems to help quite a lot in the start-up time of pypy.net... Modified: pypy/dist/pypy/config/pypyoption.py ============================================================================== --- pypy/dist/pypy/config/pypyoption.py (original) +++ pypy/dist/pypy/config/pypyoption.py Mon Oct 2 17:58:54 2006 @@ -8,7 +8,8 @@ if p.check(dir=True, dotfile=False)] default_modules = dict.fromkeys( - ["unicodedata", "_codecs", "gc", "_weakref", "array", "marshal", "errno", + [#"unicodedata", + "_codecs", "gc", "_weakref", "array", "marshal", "errno", "math", "_sre", "_pickle_support", "sys", "exceptions", "__builtins__", "recparser", "symbol", "_random"]) Modified: pypy/dist/pypy/interpreter/baseobjspace.py ============================================================================== --- pypy/dist/pypy/interpreter/baseobjspace.py (original) +++ pypy/dist/pypy/interpreter/baseobjspace.py Mon Oct 2 17:58:54 2006 @@ -220,7 +220,7 @@ except AttributeError: pass - modules = ['sys', '__builtin__', 'exceptions', 'unicodedata', + modules = ['sys', '__builtin__', 'exceptions', # 'unicodedata', '_codecs', 'gc', '_weakref', 'array', 'marshal', 'errno', 'math', '_sre', '_pickle_support'] From cfbolz at codespeak.net Mon Oct 2 18:34:04 2006 From: cfbolz at codespeak.net (cfbolz at codespeak.net) Date: Mon, 2 Oct 2006 18:34:04 +0200 (CEST) Subject: [pypy-svn] r32829 - pypy/branch/even-more-config/pypy/translator/c/test Message-ID: <20061002163404.594F11006E@code0.codespeak.net> Author: cfbolz Date: Mon Oct 2 18:34:01 2006 New Revision: 32829 Modified: pypy/branch/even-more-config/pypy/translator/c/test/test_exceptiontransform.py Log: use the already existing compile function Modified: pypy/branch/even-more-config/pypy/translator/c/test/test_exceptiontransform.py ============================================================================== --- pypy/branch/even-more-config/pypy/translator/c/test/test_exceptiontransform.py (original) +++ pypy/branch/even-more-config/pypy/translator/c/test/test_exceptiontransform.py Mon Oct 2 18:34:01 2006 @@ -4,6 +4,7 @@ from pypy.translator.c import exceptiontransform, genc, gc from pypy.objspace.flow.model import c_last_exception from pypy.rpython.test.test_llinterp import get_interpreter +from pypy.translator.c.test.test_genc import compile from pypy import conftest import sys @@ -39,20 +40,6 @@ _already_transformed[t] = True return interp.eval_graph(graph, values) -def compile_func(fn, inputtypes): - t = TranslationContext() - t.buildannotator().build_types(fn, inputtypes) - t.buildrtyper().specialize() -## etrafo = exceptiontransform.ExceptionTransformer(t) -## etrafo.transform_completely() - builder = genc.CExtModuleBuilder(t, fn, gcpolicy=gc.RefcountingGcPolicy) - builder.generate_source() - builder.compile() - builder.import_module() - if conftest.option.view: - t.view() - return builder.get_entry_point() - def test_simple(): def one(): return 1 @@ -65,7 +52,7 @@ assert len(list(g.iterblocks())) == 2 # graph does not change result = interpret(foo, []) assert result == 1 - f = compile_func(foo, []) + f = compile(foo, []) assert f() == 1 def test_passthrough(): @@ -77,7 +64,7 @@ one(0) one(1) t, g = transform_func(foo, []) - f = compile_func(foo, []) + f = compile(foo, []) py.test.raises(ValueError, f) def test_catches(): @@ -101,7 +88,7 @@ return 4 + x t, g = transform_func(foo, [int]) assert len(list(g.iterblocks())) == 9 - f = compile_func(foo, [int]) + f = compile(foo, [int]) result = interpret(foo, [6]) assert result == 2 result = f(6) @@ -132,7 +119,7 @@ return 4 + x t, g = transform_func(foo, [int]) assert len(list(g.iterblocks())) == 5 - f = compile_func(foo, [int]) + f = compile(foo, [int]) result = interpret(foo, [6]) assert result == 2 result = f(6) @@ -152,7 +139,7 @@ raise ValueError() t, g = transform_func(foo, [int]) assert len(list(g.iterblocks())) == 3 - f = compile_func(foo, [int]) + f = compile(foo, [int]) f(0) py.test.raises(ValueError, f, 1) @@ -172,7 +159,7 @@ y.z = 42 r = can_raise(n) return r + y.z - f = compile_func(foo, [int]) + f = compile(foo, [int]) res = f(0) assert res == 43 From cfbolz at codespeak.net Mon Oct 2 18:38:27 2006 From: cfbolz at codespeak.net (cfbolz at codespeak.net) Date: Mon, 2 Oct 2006 18:38:27 +0200 (CEST) Subject: [pypy-svn] r32830 - pypy/dist/pypy/interpreter Message-ID: <20061002163827.6228310070@code0.codespeak.net> Author: cfbolz Date: Mon Oct 2 18:38:26 2006 New Revision: 32830 Modified: pypy/dist/pypy/interpreter/baseobjspace.py Log: don't maintain two different lists of default modules (one in pypyoption, one here). Modified: pypy/dist/pypy/interpreter/baseobjspace.py ============================================================================== --- pypy/dist/pypy/interpreter/baseobjspace.py (original) +++ pypy/dist/pypy/interpreter/baseobjspace.py Mon Oct 2 18:38:26 2006 @@ -211,8 +211,6 @@ w_modules = self.sys.get('modules') return self.getitem(w_modules, w_name) - # change this to influence which of our own - # mixed modules should be used def get_builtinmodule_to_install(self): """NOT_RPYTHON""" try: @@ -220,16 +218,15 @@ except AttributeError: pass - modules = ['sys', '__builtin__', 'exceptions', # 'unicodedata', - '_codecs', 'gc', '_weakref', 'array', 'marshal', 'errno', - 'math', '_sre', '_pickle_support'] + modules = [] # You can enable more modules by specifying --usemodules=xxx,yyy for name, value in self.config.objspace.usemodules: if value and name not in modules: - modules.append(name) + modules.append(name) # a bit of custom logic: time2 or rctime take precedence over time + # XXX this could probably be done as a "requires" in the config if ('time2' in modules or 'rctime' in modules) and 'time' in modules: modules.remove('time') From arigo at codespeak.net Mon Oct 2 21:24:24 2006 From: arigo at codespeak.net (arigo at codespeak.net) Date: Mon, 2 Oct 2006 21:24:24 +0200 (CEST) Subject: [pypy-svn] r32831 - in pypy/dist/pypy/jit/timeshifter: . test Message-ID: <20061002192424.7030010060@code0.codespeak.net> Author: arigo Date: Mon Oct 2 21:24:22 2006 New Revision: 32831 Modified: pypy/dist/pypy/jit/timeshifter/rtimeshift.py pypy/dist/pypy/jit/timeshifter/test/test_promotion.py Log: (pedronis, arre, arigo) A new test, and trying to do the "right thing" about promotion points. Now they "should" work in all situations, including with merges all around the place. That check-in took quiiiiiiite a bit of time (basically, compare with the timestamp of the previous check-in...). Modified: pypy/dist/pypy/jit/timeshifter/rtimeshift.py ============================================================================== --- pypy/dist/pypy/jit/timeshifter/rtimeshift.py (original) +++ pypy/dist/pypy/jit/timeshifter/rtimeshift.py Mon Oct 2 21:24:22 2006 @@ -191,6 +191,9 @@ incoming[i].genvar = linkargs[i] return newblock +def return_marker(jitstate): + raise AssertionError("shouldn't get here") + def start_new_block(states_dic, jitstate, key, global_resumer): memo = rvalue.freeze_memo() frozen = jitstate.freeze(memo) @@ -199,13 +202,15 @@ res = frozen.exactmatch(jitstate, outgoingvarboxes, memo) assert res, "exactmatch() failed" newblock = enter_next_block(jitstate, outgoingvarboxes) + # XXX don't save newblock, or have rgenop produce None, when resuming states_dic[key] = frozen, newblock - if global_resumer: + if global_resumer is not None and global_resumer is not return_marker: greens_gv = jitstate.greens rgenop = jitstate.curbuilder.rgenop jitstate.promotion_path = PromotionPathRoot(greens_gv, rgenop, frozen, newblock, global_resumer) + # XXX put a PromotionPathMergesToSee too start_new_block._annspecialcase_ = "specialize:arglltype(2)" def retrieve_jitstate_for_merge(states_dic, jitstate, key, global_resumer): @@ -233,9 +238,28 @@ if replace_memo.boxes: jitstate.replace(replace_memo) start_new_block(states_dic, jitstate, key, global_resumer) + if global_resumer is None: + merge_generalized(jitstate) return False # continue retrieve_jitstate_for_merge._annspecialcase_ = "specialize:arglltype(2)" +def merge_generalized(jitstate): + resuming = jitstate.resuming + if resuming is None: + node = jitstate.promotion_path + while not node.cut_limit: + node = node.next + dispatch_queue = jitstate.frame.dispatch_queue + count = dispatch_queue.mergecounter + 1 + dispatch_queue.mergecounter = count + node = PromotionPathMergesToSee(node, count) + jitstate.promotion_path = node + else: + if resuming.mergesleft != MC_IGNORE_UNTIL_RETURN: + assert resuming.mergesleft > 0 + resuming.mergesleft -= 1 + + def enter_block(jitstate): incoming = [] memo = rvalue.enter_block_memo() @@ -247,12 +271,18 @@ if exitgvar.is_const: return exitgvar.revealconst(lltype.Bool) else: - if jitstate.resuming is None: - later_builder = jitstate.curbuilder.jump_if_false(exitgvar) - jitstate.split(later_builder, resumepoint, list(greens_gv)) - return True - else: - return jitstate.resuming.path.pop().answer + resuming = jitstate.resuming + if resuming is not None and resuming.mergesleft == 0: + node = resuming.path.pop() + assert isinstance(node, PromotionPathSplit) + return node.answer + later_builder = jitstate.curbuilder.jump_if_false(exitgvar) + jitstate2 = jitstate.split(later_builder, resumepoint, list(greens_gv)) + if resuming is None: + node = jitstate.promotion_path + jitstate2.promotion_path = PromotionPathNo(node) + jitstate .promotion_path = PromotionPathYes(node) + return True def collect_split(jitstate_chain, resumepoint, *greens_gv): greens_gv = list(greens_gv) @@ -351,6 +381,16 @@ path[0] = node self.promotion_point = promotion_point self.path = path + self.mergesleft = 0 + + def merges_to_see(self): + node = self.path[-1] + if isinstance(node, PromotionPathMergesToSee): + self.mergesleft = node.count + del self.path[-1] + else: + self.mergesleft = MC_IGNORE_UNTIL_RETURN + class PromotionPoint(object): def __init__(self, flexswitch, switchblock, promotion_path): @@ -360,9 +400,11 @@ self.promotion_path = promotion_path class AbstractPromotionPath(object): - pass + cut_limit = False class PromotionPathRoot(AbstractPromotionPath): + cut_limit = True + def __init__(self, greens_gv, rgenop, frozen, portalblock, global_resumer): self.greens_gv = greens_gv self.rgenop = rgenop @@ -395,28 +437,40 @@ path.append(self) return self.next.follow_path(path) -class PromotionPathYes(PromotionPathNode): +class PromotionPathSplit(PromotionPathNode): + pass + +class PromotionPathYes(PromotionPathSplit): answer = True -class PromotionPathNo(PromotionPathNode): +class PromotionPathNo(PromotionPathSplit): answer = False -class PromotionPathNoWithArg(PromotionPathNo): - - def __init__(self, next, arg): - self.next = next - self.arg = arg - - def follow_path(self, path): - path.append(self) - return PromotionPathNo.follow_path(self, path) +class PromotionPathCallNotTaken(PromotionPathNode): + pass class PromotionPathPromote(PromotionPathNode): + cut_limit = True + def __init__(self, next, promotion_point, gv_value): self.next = next self.promotion_point = promotion_point self.gv_value = gv_value +class PromotionPathCall(PromotionPathNode): + cut_limit = True + +class PromotionPathBackFromReturn(PromotionPathNode): + cut_limit = True + +class PromotionPathMergesToSee(PromotionPathNode): + def __init__(self, next, count): + self.next = next + self.count = count + +MC_IGNORE_UNTIL_RETURN = -1 +MC_CALL_NOT_TAKEN = -2 + def ll_continue_compilation(promotion_point_ptr, value): try: @@ -450,9 +504,9 @@ def _freeze_(self): return True -def ll_promote(jitstate, box, promotiondesc): +def ll_promote(jitstate, promotebox, promotiondesc): builder = jitstate.curbuilder - gv_switchvar = box.getgenvar(builder) + gv_switchvar = promotebox.getgenvar(builder) if gv_switchvar.is_const: return False else: @@ -462,7 +516,7 @@ switchblock = enter_next_block(jitstate, incoming) if jitstate.resuming is None: - gv_switchvar = box.genvar + gv_switchvar = promotebox.genvar flexswitch = builder.flexswitch(gv_switchvar) # default case of the switch: enter_block(jitstate) @@ -470,7 +524,7 @@ jitstate.promotion_path) ll_pm = cast_instance_to_base_ptr(pm) gv_pm = builder.rgenop.genconst(ll_pm) - gv_switchvar = box.genvar + gv_switchvar = promotebox.genvar builder.genop_call(promotiondesc.sigtoken, promotiondesc.gv_continue_compilation, [gv_pm, gv_switchvar]) @@ -482,11 +536,20 @@ else: assert jitstate.promotion_path is None resuming = jitstate.resuming - node = resuming.path.pop() - #debug_view(node, resuming, incoming) - assert isinstance(node, PromotionPathPromote) - pm = node.promotion_point - assert pm.promotion_path is node.next + if resuming.mergesleft != 0: + return True + + promotenode = resuming.path.pop() + assert isinstance(promotenode, PromotionPathPromote) + #debug_view(promotenode, resuming, incoming) + pm = promotenode.promotion_point + assert pm.promotion_path is promotenode.next + + # clear the complete state of dispatch queues + f = jitstate.frame + while f is not None: + f.dispatch_queue.clear() + f = f.backframe if len(resuming.path) == 0: # XXX we need to do something around the switch in the 'else' @@ -497,24 +560,30 @@ kinds) for i in range(len(incoming)): incoming[i].genvar = vars_gv[i] - newbuilder = pm.flexswitch.add_case(node.gv_value) + promotebox.genvar = promotenode.gv_value + newbuilder = pm.flexswitch.add_case(promotenode.gv_value) jitstate.resuming = None + node = PromotionPathMergesToSee(promotenode, 0) jitstate.promotion_path = node jitstate.curbuilder = newbuilder + else: + resuming.merges_to_see() + promotebox.genvar = promotenode.gv_value - box.genvar = node.gv_value enter_block(jitstate) return False # ____________________________________________________________ class BaseDispatchQueue(object): - parent_promotion_path = None - parent_resuming = None - + def __init__(self): self.split_chain = None self.return_chain = None + self.mergecounter = 0 + + def clear(self): + self.__init__() def build_dispatch_subclass(attrnames): if len(attrnames) == 0: @@ -633,17 +702,17 @@ class JITState(object): returnbox = None next = None # for linked lists - resuming = None # or a ResumingInfo + promotion_path = None def __init__(self, builder, frame, exc_type_box, exc_value_box, - resumepoint=-1, newgreens=[], promotion_path=None): + resumepoint=-1, newgreens=[], resuming=None): self.curbuilder = builder self.frame = frame self.exc_type_box = exc_type_box self.exc_value_box = exc_value_box self.resumepoint = resumepoint self.greens = newgreens - self.promotion_path = promotion_path + self.resuming = resuming # None or a ResumingInfo def split(self, newbuilder, newresumepoint, newgreens): memo = rvalue.copy_memo() @@ -653,12 +722,12 @@ self.exc_value_box.copy(memo), newresumepoint, newgreens, - PromotionPathNo(self.promotion_path)) - self.promotion_path = PromotionPathYes(self.promotion_path) + self.resuming) # add the later_jitstate to the chain of pending-for-dispatch_next() dispatch_queue = self.frame.dispatch_queue later_jitstate.next = dispatch_queue.split_chain dispatch_queue.split_chain = later_jitstate + return later_jitstate def enter_block(self, incoming, memo): self.frame.enter_block(incoming, memo) @@ -684,17 +753,25 @@ enter_graph._annspecialcase_ = 'specialize:arg(1)' def enter_frame(jitstate, dispatchqueue): + jitstate.frame = VirtualFrame(jitstate.frame, dispatchqueue) resuming = jitstate.resuming if resuming is None: - dispatchqueue.parent_promotion_path = jitstate.promotion_path - jitstate.promotion_path = PromotionPathYes(jitstate.promotion_path) + node = PromotionPathCall(jitstate.promotion_path) + node = PromotionPathMergesToSee(node, 0) + jitstate.promotion_path = node else: - taking = resuming.path.pop().answer - if not taking: - dispatchqueue.parent_resuming = resuming - jitstate.resuming = None - jitstate.frame = VirtualFrame(jitstate.frame, dispatchqueue) - + parent_mergesleft = resuming.mergesleft + resuming.mergesleft = MC_IGNORE_UNTIL_RETURN + if parent_mergesleft == 0: + node = resuming.path.pop() + if isinstance(node, PromotionPathCall): + resuming.merges_to_see() + else: + assert isinstance(node, PromotionPathCallNotTaken) + parent_mergesleft = MC_CALL_NOT_TAKEN + dispatchqueue.mergecounter = parent_mergesleft + + class CompilationInterrupted(Exception): pass @@ -705,7 +782,8 @@ while return_chain is not None: jitstate = return_chain return_chain = return_chain.next - res = retrieve_jitstate_for_merge(return_cache, jitstate, (), None) + res = retrieve_jitstate_for_merge(return_cache, jitstate, (), + return_marker) if res is False: # not finished jitstate.next = still_pending still_pending = jitstate @@ -716,7 +794,8 @@ while still_pending is not None: jitstate = still_pending still_pending = still_pending.next - res = retrieve_jitstate_for_merge(return_cache, jitstate, (), None) + res = retrieve_jitstate_for_merge(return_cache, jitstate, (), + return_marker) assert res is True # finished return most_general_jitstate @@ -735,17 +814,32 @@ def leave_frame(jitstate): myframe = jitstate.frame - jitstate.frame = myframe.backframe - assert jitstate.resuming is None + backframe = myframe.backframe + jitstate.frame = backframe mydispatchqueue = myframe.dispatch_queue - resuming = mydispatchqueue.parent_resuming + resuming = jitstate.resuming if resuming is None: - parent_promotion_path = mydispatchqueue.parent_promotion_path - jitstate.promotion_path = PromotionPathNo(parent_promotion_path) + #debug_view(jitstate) + node = jitstate.promotion_path + while not node.cut_limit: + node = node.next + if isinstance(node, PromotionPathCall): + node = PromotionPathCallNotTaken(node.next) + else: + node = PromotionPathBackFromReturn(node) + node = PromotionPathMergesToSee(node, 0) + jitstate.promotion_path = node else: - jitstate.resuming = resuming - jitstate.promotion_path = None - + parent_mergesleft = mydispatchqueue.mergecounter + if parent_mergesleft == 0: + node = resuming.path.pop() + assert isinstance(node, PromotionPathBackFromReturn) + resuming.merges_to_see() + elif parent_mergesleft == MC_CALL_NOT_TAKEN: + resuming.mergesleft = 0 + else: + resuming.mergesleft = parent_mergesleft + def leave_graph_yellow(jitstate): mydispatchqueue = jitstate.frame.dispatch_queue return_chain = mydispatchqueue.return_chain Modified: pypy/dist/pypy/jit/timeshifter/test/test_promotion.py ============================================================================== --- pypy/dist/pypy/jit/timeshifter/test/test_promotion.py (original) +++ pypy/dist/pypy/jit/timeshifter/test/test_promotion.py Mon Oct 2 21:24:22 2006 @@ -106,6 +106,25 @@ assert res == 42 self.check_insns(int_add=0) + def test_merge_then_promote(self): + S = lltype.GcStruct('S', ('x', lltype.Signed)) + def ll_two(n): + s = lltype.malloc(S) + if n < 0: + s.x = 10 + else: + s.x = 20 + k = hint(s.x, promote=True) + k *= 17 + return hint(k, variable=True) + def ll_function(n): + return ll_two(n) + ll_function._global_merge_points_ = True + + res = self.timeshift(ll_function, [3], [], policy=P_NOVIRTUAL) + assert res == 340 + self.check_insns(int_lt=1, int_mul=0) + def test_method_call_nonpromote(self): class Base(object): From antocuni at codespeak.net Tue Oct 3 10:51:44 2006 From: antocuni at codespeak.net (antocuni at codespeak.net) Date: Tue, 3 Oct 2006 10:51:44 +0200 (CEST) Subject: [pypy-svn] r32832 - pypy/dist/pypy/translator/cli Message-ID: <20061003085144.6705310060@code0.codespeak.net> Author: antocuni Date: Tue Oct 3 10:51:42 2006 New Revision: 32832 Modified: pypy/dist/pypy/translator/cli/database.py Log: Refactored the way constants are generated, so that it's easier to experiment with new approaches. Modified: pypy/dist/pypy/translator/cli/database.py ============================================================================== --- pypy/dist/pypy/translator/cli/database.py (original) +++ pypy/dist/pypy/translator/cli/database.py Tue Oct 3 10:51:42 2006 @@ -8,6 +8,7 @@ from pypy.translator.cli.comparer import EqualityComparer from pypy.translator.cli.node import Node from pypy.translator.cli.support import string_literal, Counter +from pypy.translator.cli.constgenerator import StaticFieldConstGenerator, LazyConstGenerator from pypy.rpython.ootypesystem import ootype from pypy.rpython.ootypesystem.module import ll_os from pypy.rpython.lltypesystem import lltype @@ -20,13 +21,9 @@ except NameError: from sets import Set as set -DEBUG_CONST_INIT = False -DEBUG_CONST_INIT_VERBOSE = False -MAX_CONST_PER_STEP = 100 -LAZYNESS = False +CONST_GENERATOR = StaticFieldConstGenerator +#CONST_GENERATOR = LazyConstGenerator -CONST_NAMESPACE = 'pypy.runtime' -CONST_CLASS = 'Constants' BUILTIN_RECORDS = { ootype.Record({"item0": ootype.Float, "item1": ootype.Signed}): @@ -180,22 +177,11 @@ self.pending_node(Delegate(self, TYPE, name)) return name - def __new_step(self, ilasm): - if self.step > 0: - self.__end_step(ilasm) # close the previous step - # open the new step - ilasm.begin_function('step%d' % self.step, [], 'void', False, 'static') - self.step += 1 - - def __end_step(self, ilasm): - if self.step > 0: - ilasm.ret() - ilasm.end_function() def gen_constants(self, ilasm): self.locked = True # new pending nodes are not allowed here - ilasm.begin_namespace(CONST_NAMESPACE) - ilasm.begin_class(CONST_CLASS, beforefieldinit=True) + generator = CONST_GENERATOR(ilasm) + generator.begin_class() const_list = [const for const in self.consts.itervalues() if not const.is_inline()] const_list.sort(key=operator.attrgetter('PRIORITY')) @@ -204,64 +190,15 @@ # render field definitions for const in const_list: assert not const.is_null() - ilasm.field(const.name, const.get_type(), static=True) + generator.declare_const(const) - if LAZYNESS: - for const in const_list: - getter_name = 'get_%s' % const.name - type_ = const.get_type() - ilasm.begin_function(getter_name, [], type_, False, 'static') - ilasm.load_static_constant(type_, CONST_NAMESPACE, CONST_CLASS, const.name) - # if it's already initialized, just return it - ilasm.opcode('dup') - ilasm.opcode('brfalse', 'initialize') - ilasm.opcode('ret') - # else, initialize! - ilasm.label('initialize') - ilasm.opcode('pop') # discard the null value we know is on the stack - const.instantiate(ilasm) - ilasm.opcode('dup') # two dups because const.init pops the value at the end - ilasm.opcode('dup') - ilasm.store_static_constant(type_, CONST_NAMESPACE, CONST_CLASS, const.name) - const.init(ilasm) - ilasm.opcode('ret') - ilasm.end_function() - else: - # this point we have collected all constant we - # need. Instantiate&initialize them. - self.step = 0 - for i, const in enumerate(const_list): - if i % MAX_CONST_PER_STEP == 0: - self.__new_step(ilasm) - type_ = const.get_type() - const.instantiate(ilasm) - ilasm.store_static_constant(type_, CONST_NAMESPACE, CONST_CLASS, const.name) - - for i, const in enumerate(const_list): - if i % MAX_CONST_PER_STEP == 0: - self.__new_step(ilasm) - ilasm.stderr('CONST: initializing #%d' % i, DEBUG_CONST_INIT_VERBOSE) - type_ = const.get_type() - ilasm.load_static_constant(type_, CONST_NAMESPACE, CONST_CLASS, const.name) - const.init(ilasm) - self.__end_step(ilasm) # close the pending step - - ilasm.begin_function('.cctor', [], 'void', False, 'static', - 'specialname', 'rtspecialname', 'default') - ilasm.stderr('CONST: initialization starts', DEBUG_CONST_INIT) - for i in range(self.step): - ilasm.stderr('CONST: step %d of %d' % (i, self.step), DEBUG_CONST_INIT) - step_name = 'step%d' % i - ilasm.call('void %s.%s::%s()' % (CONST_NAMESPACE, CONST_CLASS, step_name)) - ilasm.stderr('CONST: initialization completed', DEBUG_CONST_INIT) - ilasm.ret() - ilasm.end_function() - - ilasm.end_class() - ilasm.end_namespace() + generator.generate_consts(const_list) + generator.end_class() log.INFO("%d constants rendered" % num_const) self.locked = False + + class AbstractConst(Node): PRIORITY = 0 @@ -370,12 +307,7 @@ """ cts = CTS(self.db) cts_static_type = self.get_type() - if LAZYNESS: - getter_name = '%s.%s::%s' % (CONST_NAMESPACE, CONST_CLASS, 'get_%s' % self.name) - ilasm.call('%s %s()' % (cts_static_type, getter_name)) - else: - full_name = '%s.%s::%s' % (CONST_NAMESPACE, CONST_CLASS, self.name) - ilasm.opcode('ldsfld %s %s' % (cts_static_type, full_name)) + CONST_GENERATOR.load_const(ilasm, self) if cts_static_type != cts.lltype_to_cts(EXPECTED_TYPE): ilasm.opcode('castclass', cts.lltype_to_cts(EXPECTED_TYPE, include_class=False)) From antocuni at codespeak.net Tue Oct 3 10:57:31 2006 From: antocuni at codespeak.net (antocuni at codespeak.net) Date: Tue, 3 Oct 2006 10:57:31 +0200 (CEST) Subject: [pypy-svn] r32833 - pypy/dist/pypy/translator/cli Message-ID: <20061003085731.0092610060@code0.codespeak.net> Author: antocuni Date: Tue Oct 3 10:57:29 2006 New Revision: 32833 Added: pypy/dist/pypy/translator/cli/constgenerator.py (contents, props changed) Log: Sorry, forgot to check this in. Added: pypy/dist/pypy/translator/cli/constgenerator.py ============================================================================== --- (empty file) +++ pypy/dist/pypy/translator/cli/constgenerator.py Tue Oct 3 10:57:29 2006 @@ -0,0 +1,99 @@ +CONST_NAMESPACE = 'pypy.runtime' +CONST_CLASS = 'Constants' + +DEBUG_CONST_INIT = False +DEBUG_CONST_INIT_VERBOSE = False +MAX_CONST_PER_STEP = 100 + +class StaticFieldConstGenerator: + def __init__(self, ilasm): + self.ilasm = ilasm + + def begin_class(self): + self.ilasm.begin_namespace(CONST_NAMESPACE) + self.ilasm.begin_class(CONST_CLASS, beforefieldinit=True) + + def end_class(self): + self.ilasm.end_class() + self.ilasm.end_namespace() + + def declare_const(self, const): + self.ilasm.field(const.name, const.get_type(), static=True) + + def __new_step(self): + if self.step > 0: + self.__end_step() # close the previous step + # open the new step + self.ilasm.begin_function('step%d' % self.step, [], 'void', False, 'static') + self.step += 1 + + def __end_step(self): + if self.step > 0: + self.ilasm.ret() + self.ilasm.end_function() + + def generate_consts(self, const_list): + # this point we have collected all constant we + # need. Instantiate&initialize them. + self.step = 0 + ilasm = self.ilasm + for i, const in enumerate(const_list): + if i % MAX_CONST_PER_STEP == 0: + self.__new_step() + type_ = const.get_type() + const.instantiate(ilasm) + ilasm.store_static_constant(type_, CONST_NAMESPACE, CONST_CLASS, const.name) + + for i, const in enumerate(const_list): + if i % MAX_CONST_PER_STEP == 0: + self.__new_step() + ilasm.stderr('CONST: initializing #%d' % i, DEBUG_CONST_INIT_VERBOSE) + type_ = const.get_type() + ilasm.load_static_constant(type_, CONST_NAMESPACE, CONST_CLASS, const.name) + const.init(ilasm) + self.__end_step() # close the pending step + + ilasm.begin_function('.cctor', [], 'void', False, 'static', + 'specialname', 'rtspecialname', 'default') + ilasm.stderr('CONST: initialization starts', DEBUG_CONST_INIT) + for i in range(self.step): + ilasm.stderr('CONST: step %d of %d' % (i, self.step), DEBUG_CONST_INIT) + step_name = 'step%d' % i + ilasm.call('void %s.%s::%s()' % (CONST_NAMESPACE, CONST_CLASS, step_name)) + ilasm.stderr('CONST: initialization completed', DEBUG_CONST_INIT) + ilasm.ret() + ilasm.end_function() + + def load_const(cls, ilasm, const): + full_name = '%s.%s::%s' % (CONST_NAMESPACE, CONST_CLASS, const.name) + ilasm.opcode('ldsfld %s %s' % (const.get_type(), full_name)) + load_const = classmethod(load_const) + + +class LazyConstGenerator(StaticFieldConstGenerator): + def generate_consts(self, const_list): + ilasm = self.ilasm + for const in const_list: + getter_name = 'get_%s' % const.name + type_ = const.get_type() + ilasm.begin_function(getter_name, [], type_, False, 'static') + ilasm.load_static_constant(type_, CONST_NAMESPACE, CONST_CLASS, const.name) + # if it's already initialized, just return it + ilasm.opcode('dup') + ilasm.opcode('brfalse', 'initialize') + ilasm.opcode('ret') + # else, initialize! + ilasm.label('initialize') + ilasm.opcode('pop') # discard the null value we know is on the stack + const.instantiate(ilasm) + ilasm.opcode('dup') # two dups because const.init pops the value at the end + ilasm.opcode('dup') + ilasm.store_static_constant(type_, CONST_NAMESPACE, CONST_CLASS, const.name) + const.init(ilasm) + ilasm.opcode('ret') + ilasm.end_function() + + def load_const(cls, ilasm, const): + getter_name = '%s.%s::%s' % (CONST_NAMESPACE, CONST_CLASS, 'get_%s' % const.name) + ilasm.call('%s %s()' % (const.get_type(), getter_name)) + load_const = classmethod(load_const) From pedronis at codespeak.net Tue Oct 3 11:37:20 2006 From: pedronis at codespeak.net (pedronis at codespeak.net) Date: Tue, 3 Oct 2006 11:37:20 +0200 (CEST) Subject: [pypy-svn] r32834 - pypy/dist/pypy/module/time2 Message-ID: <20061003093720.2292F10060@code0.codespeak.net> Author: pedronis Date: Tue Oct 3 11:37:18 2006 New Revision: 32834 Removed: pypy/dist/pypy/module/time2/ Log: nowadays we have rctime has rctypes based time module. From arigo at codespeak.net Tue Oct 3 12:23:46 2006 From: arigo at codespeak.net (arigo at codespeak.net) Date: Tue, 3 Oct 2006 12:23:46 +0200 (CEST) Subject: [pypy-svn] r32835 - pypy/dist/pypy/doc/discussion Message-ID: <20061003102346.D71CF10060@code0.codespeak.net> Author: arigo Date: Tue Oct 3 12:23:45 2006 New Revision: 32835 Modified: pypy/dist/pypy/doc/discussion/cli-optimizations.txt Log: ReST fix. Modified: pypy/dist/pypy/doc/discussion/cli-optimizations.txt ============================================================================== --- pypy/dist/pypy/doc/discussion/cli-optimizations.txt (original) +++ pypy/dist/pypy/doc/discussion/cli-optimizations.txt Tue Oct 3 12:23:45 2006 @@ -197,13 +197,15 @@ Optimize StaticMethod --------------------- -2006-10-02, 13:41 +:: - antocuni: do you try to not wrap static methods that are just called and not passed around - no - I think I don't know how to detect them - antocuni: you should try to render them just as static methods not as instances when possible - you need to track what appears only in direct_calls vs other places + 2006-10-02, 13:41 + + antocuni: do you try to not wrap static methods that are just called and not passed around + no + I think I don't know how to detect them + antocuni: you should try to render them just as static methods not as instances when possible + you need to track what appears only in direct_calls vs other places Optimize Unicode From arigo at codespeak.net Tue Oct 3 13:04:57 2006 From: arigo at codespeak.net (arigo at codespeak.net) Date: Tue, 3 Oct 2006 13:04:57 +0200 (CEST) Subject: [pypy-svn] r32837 - in pypy/dist/pypy: rpython/raisingops translator/backendopt Message-ID: <20061003110457.D858B10060@code0.codespeak.net> Author: arigo Date: Tue Oct 3 13:04:51 2006 New Revision: 32837 Modified: pypy/dist/pypy/rpython/raisingops/raisingops.py pypy/dist/pypy/translator/backendopt/raisingop2direct_call.py Log: Add support for llong_neg_ovf in raisingops. Modified: pypy/dist/pypy/rpython/raisingops/raisingops.py ============================================================================== --- pypy/dist/pypy/rpython/raisingops/raisingops.py (original) +++ pypy/dist/pypy/rpython/raisingops/raisingops.py Tue Oct 3 13:04:51 2006 @@ -1,9 +1,16 @@ +import sys from pypy.rpython.rarithmetic import r_longlong, r_uint, intmask #XXX original SIGNED_RIGHT_SHIFT_ZERO_FILLS not taken into account #XXX assuming HAVE_LONG_LONG (int_mul_ovf) #XXX should int_mod and int_floordiv return an intmask(...) instead? +LONG_MAX = sys.maxint +LONG_MIN = -sys.maxint-1 + +LLONG_MAX = r_longlong(2 ** (r_longlong.BITS-1) - 1) +LLONG_MIN = -LLONG_MAX-1 + def int_floordiv_zer(x, y): '''#define OP_INT_FLOORDIV_ZER(x,y,r,err) \ if ((y)) { OP_INT_FLOORDIV(x,y,r,err); } \ @@ -25,31 +32,30 @@ raise ZeroDivisionError("unsigned integer division") def int_neg_ovf(x): - '''#define OP_INT_NEG_OVF(x,r,err) \ - OP_INT_NEG(x,r,err); \ - if ((x) >= 0 || (x) != -(x)); \ - else FAIL_OVF(err, "integer negate") - ''' - r = -x - if x >= 0 or x != r: - return r - else: + if x == LONG_MIN: + raise OverflowError("integer negate") + return -x + +def llong_neg_ovf(x): + if x == LLONG_MIN: raise OverflowError("integer negate") + return -x def int_abs_ovf(x): - '''#define OP_INT_ABS_OVF(x,r,err) \ - OP_INT_ABS(x,r,err); \ - if ((x) >= 0 || (x) != -(x)); \ - else FAIL_OVF(err, "integer absolute") - ''' - if x >= 0: - r = x - else: - r = -x - if x >= 0 or x != r: - return r + if x == LONG_MIN: + raise OverflowError("integer absolute") + if x < 0: + return -x else: + return x + +def llong_abs_ovf(x): + if x == LLONG_MIN: raise OverflowError("integer absolute") + if x < 0: + return -x + else: + return x def int_add_ovf(x, y): '''#define OP_INT_ADD_OVF(x,y,r,err) \ Modified: pypy/dist/pypy/translator/backendopt/raisingop2direct_call.py ============================================================================== --- pypy/dist/pypy/translator/backendopt/raisingop2direct_call.py (original) +++ pypy/dist/pypy/translator/backendopt/raisingop2direct_call.py Tue Oct 3 13:04:51 2006 @@ -16,7 +16,8 @@ def is_raisingop(op): s = op.opname - if not s.startswith('int_') and not s.startswith('uint_') and not s.startswith('float_'): + if (not s.startswith('int_') and not s.startswith('uint_') and + not s.startswith('float_') and not s.startswith('llong_')): return False if not s.endswith('_zer') and not s.endswith('_ovf') and not s.endswith('_val'): #not s in special_operations: return False From antocuni at codespeak.net Tue Oct 3 14:47:05 2006 From: antocuni at codespeak.net (antocuni at codespeak.net) Date: Tue, 3 Oct 2006 14:47:05 +0200 (CEST) Subject: [pypy-svn] r32841 - in pypy/dist/pypy/translator/cli: . src Message-ID: <20061003124705.7488F1005A@code0.codespeak.net> Author: antocuni Date: Tue Oct 3 14:47:03 2006 New Revision: 32841 Modified: pypy/dist/pypy/translator/cli/constgenerator.py pypy/dist/pypy/translator/cli/database.py pypy/dist/pypy/translator/cli/ilgenerator.py pypy/dist/pypy/translator/cli/src/pypylib.cs Log: Added another way of rendering constants: instead of being stored as static fields, they are stored as instance fields of a Singleton. After the first run the singleton is serialized to disk. Next runs will initialize contants by reading that file. Modified: pypy/dist/pypy/translator/cli/constgenerator.py ============================================================================== --- pypy/dist/pypy/translator/cli/constgenerator.py (original) +++ pypy/dist/pypy/translator/cli/constgenerator.py Tue Oct 3 14:47:03 2006 @@ -1,17 +1,19 @@ CONST_NAMESPACE = 'pypy.runtime' -CONST_CLASS = 'Constants' +CONST_CLASSNAME = 'Constants' +CONST_CLASS = '%s.%s' % (CONST_NAMESPACE, CONST_CLASSNAME) DEBUG_CONST_INIT = False DEBUG_CONST_INIT_VERBOSE = False MAX_CONST_PER_STEP = 100 +SERIALIZE = False -class StaticFieldConstGenerator: +class BaseConstGenerator: def __init__(self, ilasm): self.ilasm = ilasm def begin_class(self): self.ilasm.begin_namespace(CONST_NAMESPACE) - self.ilasm.begin_class(CONST_CLASS, beforefieldinit=True) + self.ilasm.begin_class(CONST_CLASSNAME, beforefieldinit=True) def end_class(self): self.ilasm.end_class() @@ -20,17 +22,32 @@ def declare_const(self, const): self.ilasm.field(const.name, const.get_type(), static=True) - def __new_step(self): +class FieldConstGenerator(BaseConstGenerator): + def _new_step(self): if self.step > 0: - self.__end_step() # close the previous step - # open the new step - self.ilasm.begin_function('step%d' % self.step, [], 'void', False, 'static') + self._end_step() # close the previous step + self._declare_step() # open the next step self.step += 1 - - def __end_step(self): + + def _end_step(self): if self.step > 0: - self.ilasm.ret() - self.ilasm.end_function() + self._close_step() + + def _declare_step(self): + raise NotImplementedError + + def _close_step(self): + raise NotImplementedError + + +class StaticFieldConstGenerator(FieldConstGenerator): + + def _declare_step(self): + self.ilasm.begin_function('step%d' % self.step, [], 'void', False, 'static') + + def _close_step(self): + self.ilasm.ret() + self.ilasm.end_function() def generate_consts(self, const_list): # this point we have collected all constant we @@ -39,19 +56,19 @@ ilasm = self.ilasm for i, const in enumerate(const_list): if i % MAX_CONST_PER_STEP == 0: - self.__new_step() + self._new_step() type_ = const.get_type() const.instantiate(ilasm) - ilasm.store_static_constant(type_, CONST_NAMESPACE, CONST_CLASS, const.name) + ilasm.store_static_constant(type_, CONST_NAMESPACE, CONST_CLASSNAME, const.name) for i, const in enumerate(const_list): if i % MAX_CONST_PER_STEP == 0: - self.__new_step() + self._new_step() ilasm.stderr('CONST: initializing #%d' % i, DEBUG_CONST_INIT_VERBOSE) type_ = const.get_type() - ilasm.load_static_constant(type_, CONST_NAMESPACE, CONST_CLASS, const.name) + ilasm.load_static_constant(type_, CONST_NAMESPACE, CONST_CLASSNAME, const.name) const.init(ilasm) - self.__end_step() # close the pending step + self._end_step() # close the pending step ilasm.begin_function('.cctor', [], 'void', False, 'static', 'specialname', 'rtspecialname', 'default') @@ -59,17 +76,100 @@ for i in range(self.step): ilasm.stderr('CONST: step %d of %d' % (i, self.step), DEBUG_CONST_INIT) step_name = 'step%d' % i - ilasm.call('void %s.%s::%s()' % (CONST_NAMESPACE, CONST_CLASS, step_name)) + ilasm.call('void %s::%s()' % (CONST_CLASS, step_name)) ilasm.stderr('CONST: initialization completed', DEBUG_CONST_INIT) ilasm.ret() ilasm.end_function() def load_const(cls, ilasm, const): - full_name = '%s.%s::%s' % (CONST_NAMESPACE, CONST_CLASS, const.name) + full_name = '%s::%s' % (CONST_CLASS, const.name) ilasm.opcode('ldsfld %s %s' % (const.get_type(), full_name)) load_const = classmethod(load_const) +class InstanceFieldConstGenerator(FieldConstGenerator): + + def declare_const(self, const): + self.ilasm.field(const.name, const.get_type(), static=False) + + def _declare_step(self): + self.ilasm.begin_function('step%d' % self.step, [], 'void', False) + + def _close_step(self): + self.ilasm.ret() + self.ilasm.end_function() + + def generate_consts(self, const_list): + # this point we have collected all constant we + # need. Instantiate&initialize them. + self.step = 0 + ilasm = self.ilasm + for i, const in enumerate(const_list): + if i % MAX_CONST_PER_STEP == 0: + self._new_step() + ilasm.opcode('ldarg.0') + const.instantiate(ilasm) + ilasm.set_field((const.get_type(), CONST_CLASS, const.name)) + + for i, const in enumerate(const_list): + if i % MAX_CONST_PER_STEP == 0: + self._new_step() + ilasm.stderr('CONST: initializing #%d' % i, DEBUG_CONST_INIT_VERBOSE) + ilasm.opcode('ldarg.0') + ilasm.get_field((const.get_type(), CONST_CLASS, const.name)) + const.init(ilasm) + self._end_step() # close the pending step + + ilasm.begin_function('.ctor', [], 'void', False, 'specialname', 'rtspecialname', 'instance') + ilasm.opcode('ldarg.0') + ilasm.call('instance void object::.ctor()') + + ilasm.opcode('ldarg.0') + ilasm.opcode('stsfld class %s %s::Singleton' % (CONST_CLASS, CONST_CLASS)) + + for i in range(self.step): + step_name = 'step%d' % i + ilasm.opcode('ldarg.0') + ilasm.call('instance void %s::%s()' % (CONST_CLASS, step_name)) + ilasm.ret() + ilasm.end_function() + + # declare&init the Singleton containing the constants + self.ilasm.field('Singleton', 'class %s' % CONST_CLASS, static=True) + self.ilasm.begin_function('.cctor', [], 'void', False, 'static', 'specialname', 'rtspecialname', 'default') + if SERIALIZE: + self._serialize_ctor() + else: + self._plain_ctor() + self.ilasm.end_function() + + def _plain_ctor(self): + self.ilasm.new('instance void class %s::.ctor()' % CONST_CLASS) + self.ilasm.pop() + self.ilasm.ret() + + def _serialize_ctor(self): + self.ilasm.opcode('ldstr "constants.dat"') + self.ilasm.call('object [pypylib]pypy.runtime.Utils::Deserialize(string)') + self.ilasm.opcode('dup') + self.ilasm.opcode('brfalse initialize') + self.ilasm.stderr('Constants deserialized successfully') + self.ilasm.opcode('stsfld class %s %s::Singleton' % (CONST_CLASS, CONST_CLASS)) + self.ilasm.ret() + self.ilasm.label('initialize') + self.ilasm.pop() + self.ilasm.stderr('Cannot deserialize constants... initialize them!') + self.ilasm.new('instance void class %s::.ctor()' % CONST_CLASS) + self.ilasm.opcode('ldstr "constants.dat"') + self.ilasm.call('void [pypylib]pypy.runtime.Utils::Serialize(object, string)') + self.ilasm.ret() + + def load_const(cls, ilasm, const): + ilasm.opcode('ldsfld class %s %s::Singleton' % (CONST_CLASS, CONST_CLASS)) + ilasm.opcode('ldfld %s %s::%s' % (const.get_type(), CONST_CLASS, const.name)) + load_const = classmethod(load_const) + + class LazyConstGenerator(StaticFieldConstGenerator): def generate_consts(self, const_list): ilasm = self.ilasm @@ -94,6 +194,6 @@ ilasm.end_function() def load_const(cls, ilasm, const): - getter_name = '%s.%s::%s' % (CONST_NAMESPACE, CONST_CLASS, 'get_%s' % const.name) + getter_name = '%s::%s' % (CONST_CLASS, 'get_%s' % const.name) ilasm.call('%s %s()' % (const.get_type(), getter_name)) load_const = classmethod(load_const) Modified: pypy/dist/pypy/translator/cli/database.py ============================================================================== --- pypy/dist/pypy/translator/cli/database.py (original) +++ pypy/dist/pypy/translator/cli/database.py Tue Oct 3 14:47:03 2006 @@ -8,7 +8,7 @@ from pypy.translator.cli.comparer import EqualityComparer from pypy.translator.cli.node import Node from pypy.translator.cli.support import string_literal, Counter -from pypy.translator.cli.constgenerator import StaticFieldConstGenerator, LazyConstGenerator +from pypy.translator.cli.constgenerator import StaticFieldConstGenerator, InstanceFieldConstGenerator, LazyConstGenerator from pypy.rpython.ootypesystem import ootype from pypy.rpython.ootypesystem.module import ll_os from pypy.rpython.lltypesystem import lltype @@ -21,6 +21,7 @@ except NameError: from sets import Set as set +#CONST_GENERATOR = InstanceFieldConstGenerator CONST_GENERATOR = StaticFieldConstGenerator #CONST_GENERATOR = LazyConstGenerator Modified: pypy/dist/pypy/translator/cli/ilgenerator.py ============================================================================== --- pypy/dist/pypy/translator/cli/ilgenerator.py (original) +++ pypy/dist/pypy/translator/cli/ilgenerator.py Tue Oct 3 14:47:03 2006 @@ -56,7 +56,7 @@ self.code.closeblock() def begin_class(self, name, base=None, sealed=False, interfaces=(), abstract=False, - beforefieldinit=False): + beforefieldinit=False, serializable=True): if base is None: base = '[mscorlib]System.Object' s = '' @@ -66,6 +66,8 @@ s += 'sealed ' if beforefieldinit: s += 'beforefieldinit ' + if serializable: + s += 'serializable ' self.code.writeline('.class public %s %s extends %s' % (s, name, base)) if interfaces: Modified: pypy/dist/pypy/translator/cli/src/pypylib.cs ============================================================================== --- pypy/dist/pypy/translator/cli/src/pypylib.cs (original) +++ pypy/dist/pypy/translator/cli/src/pypylib.cs Tue Oct 3 14:47:03 2006 @@ -1,6 +1,9 @@ using System; using System.Collections.Generic; using System.Runtime.InteropServices; +using System.Runtime.Serialization.Formatters.Binary; +using System.Runtime.Serialization; +using System.IO; using pypy.runtime; namespace pypy.test @@ -115,8 +118,46 @@ { return obj.GetHashCode(); } + + public static void Serialize(object obj, string filename) + { + FileStream fs = new FileStream(filename, FileMode.Create); + BinaryFormatter formatter = new BinaryFormatter(); + try { + formatter.Serialize(fs, obj); + } + catch (SerializationException e) { + Console.Error.WriteLine("Failed to serialize. Reason: " + e.Message); + throw; + } + finally { + fs.Close(); + } + } + + public static object Deserialize(string filename) + { + FileStream fs = null; + try { + fs = new FileStream(filename, FileMode.Open); + BinaryFormatter formatter = new BinaryFormatter(); + return formatter.Deserialize(fs); + } + catch (FileNotFoundException e) { + return null; + } + catch (SerializationException e) { + Console.Error.WriteLine("Failed to deserialize. Reason: " + e.Message); + return null; + } + finally { + if (fs != null) + fs.Close(); + } + } } + [Serializable()] public class StringBuilder { System.Text.StringBuilder builder = new System.Text.StringBuilder(); @@ -250,6 +291,7 @@ //The public interface List must implement is defined in // rpython.ootypesystem.ootype.List.GENERIC_METHODS + [Serializable()] public class List: System.Collections.Generic.List { public List(): base() @@ -319,6 +361,7 @@ } } + [Serializable()] public class ListOfVoid { int Count = 0; @@ -344,6 +387,7 @@ public void _ll_resize_le(int length) { this.Count = length; } } + [Serializable()] public class Dict: System.Collections.Generic.Dictionary { IEqualityComparer comparer = null; @@ -376,6 +420,7 @@ } // it assumes TValue is a placeholder, it's not really used + [Serializable()] public class DictOfVoid: System.Collections.Generic.Dictionary { public int ll_length() { return this.Count; } @@ -391,6 +436,7 @@ } } + [Serializable()] public class DictVoidVoid { public int ll_length() { return 0; } @@ -409,6 +455,7 @@ */ } + [Serializable()] public class DictItemsIterator { IEnumerator> it; @@ -423,6 +470,7 @@ public TValue ll_current_value() { return it.Current.Value; } } + [Serializable()] public class Record_Float_Signed { public double item0; public int item1; @@ -435,6 +483,7 @@ public override int GetHashCode() { return item0.GetHashCode(); } } + [Serializable()] public class Record_Float_Float { public double item0; public double item1; @@ -447,6 +496,7 @@ public override int GetHashCode() { return item0.GetHashCode(); } } + [Serializable()] public class Record_Stat_Result { public int item0, item1, item2, item3, item4, item5, item6, item7, item8, item9; public override string ToString() From pedronis at codespeak.net Tue Oct 3 15:42:08 2006 From: pedronis at codespeak.net (pedronis at codespeak.net) Date: Tue, 3 Oct 2006 15:42:08 +0200 (CEST) Subject: [pypy-svn] r32843 - in pypy/dist/pypy/jit/timeshifter: . test Message-ID: <20061003134208.3120510060@code0.codespeak.net> Author: pedronis Date: Tue Oct 3 15:42:04 2006 New Revision: 32843 Modified: pypy/dist/pypy/jit/timeshifter/rtimeshift.py pypy/dist/pypy/jit/timeshifter/rtyper.py pypy/dist/pypy/jit/timeshifter/test/test_promotion.py pypy/dist/pypy/jit/timeshifter/transform.py Log: (arigo, arre, pedronis) restore support for yellow calls, with support for promotions too with a test. Modified: pypy/dist/pypy/jit/timeshifter/rtimeshift.py ============================================================================== --- pypy/dist/pypy/jit/timeshifter/rtimeshift.py (original) +++ pypy/dist/pypy/jit/timeshifter/rtimeshift.py Tue Oct 3 15:42:04 2006 @@ -249,9 +249,9 @@ node = jitstate.promotion_path while not node.cut_limit: node = node.next - dispatch_queue = jitstate.frame.dispatch_queue - count = dispatch_queue.mergecounter + 1 - dispatch_queue.mergecounter = count + dispatchqueue = jitstate.frame.dispatchqueue + count = dispatchqueue.mergecounter + 1 + dispatchqueue.mergecounter = count node = PromotionPathMergesToSee(node, count) jitstate.promotion_path = node else: @@ -287,23 +287,41 @@ def collect_split(jitstate_chain, resumepoint, *greens_gv): greens_gv = list(greens_gv) pending = jitstate_chain + resuming = jitstate_chain.resuming + if resuming is not None and resuming.mergesleft == 0: + node = resuming.path.pop() + assert isinstance(node, PromotionPathCollectSplit) + for i in range(node.n): + pending = pending.next + pending.greens.extend(greens_gv) + pending.next = None + return pending + + n = 0 while True: jitstate = pending pending = pending.next jitstate.greens.extend(greens_gv) # item 0 is the return value jitstate.resumepoint = resumepoint + if resuming is None: + node = jitstate.promotion_path + jitstate.promotion_path = PromotionPathCollectSplit(node, n) + n += 1 if pending is None: break - dispatch_queue = jitstate_chain.frame.dispatch_queue - jitstate.next = dispatch_queue.split_chain - dispatch_queue.split_chain = jitstate_chain.next + + dispatchqueue = jitstate_chain.frame.dispatchqueue + jitstate.next = dispatchqueue.split_chain + dispatchqueue.split_chain = jitstate_chain.next + jitstate_chain.next = None + return jitstate_chain # XXX obscurity++ above def dispatch_next(oldjitstate): - dispatch_queue = oldjitstate.frame.dispatch_queue - if dispatch_queue.split_chain is not None: - jitstate = dispatch_queue.split_chain - dispatch_queue.split_chain = jitstate.next + dispatchqueue = oldjitstate.frame.dispatchqueue + if dispatchqueue.split_chain is not None: + jitstate = dispatchqueue.split_chain + dispatchqueue.split_chain = jitstate.next enter_block(jitstate) return jitstate else: @@ -344,9 +362,9 @@ def save_return(jitstate): # add 'jitstate' to the chain of return-jitstates - dispatch_queue = jitstate.frame.dispatch_queue - jitstate.next = dispatch_queue.return_chain - dispatch_queue.return_chain = jitstate + dispatchqueue = jitstate.frame.dispatchqueue + jitstate.next = dispatchqueue.return_chain + dispatchqueue.return_chain = jitstate ##def ll_gvar_from_redbox(jitstate, redbox): ## return redbox.getgenvar(jitstate.curbuilder) @@ -391,6 +409,17 @@ else: self.mergesleft = MC_IGNORE_UNTIL_RETURN + def leave_call(self, dispatchqueue): + parent_mergesleft = dispatchqueue.mergecounter + if parent_mergesleft == 0: + node = self.path.pop() + assert isinstance(node, PromotionPathBackFromReturn) + self.merges_to_see() + elif parent_mergesleft == MC_CALL_NOT_TAKEN: + self.mergesleft = 0 + else: + self.mergesleft = parent_mergesleft + class PromotionPoint(object): def __init__(self, flexswitch, switchblock, promotion_path): @@ -446,6 +475,12 @@ class PromotionPathNo(PromotionPathSplit): answer = False +class PromotionPathCollectSplit(PromotionPathNode): + + def __init__(self, next, n): + self.next = next + self.n = n + class PromotionPathCallNotTaken(PromotionPathNode): pass @@ -548,7 +583,7 @@ # clear the complete state of dispatch queues f = jitstate.frame while f is not None: - f.dispatch_queue.clear() + f.dispatchqueue.clear() f = f.backframe if len(resuming.path) == 0: @@ -628,7 +663,7 @@ backframe = self.fz_backframe.unfreeze(incomingvarboxes, memo) else: backframe = None - vframe = VirtualFrame(backframe, BaseDispatchQueue()) + vframe = VirtualFrame(backframe, None) # dispatch queue to be patched vframe.local_boxes = local_boxes return vframe @@ -663,9 +698,9 @@ class VirtualFrame(object): - def __init__(self, backframe, dispatch_queue): + def __init__(self, backframe, dispatchqueue): self.backframe = backframe - self.dispatch_queue = dispatch_queue + self.dispatchqueue = dispatchqueue #self.local_boxes = ... set by callers def enter_block(self, incoming, memo): @@ -687,7 +722,7 @@ newbackframe = None else: newbackframe = self.backframe.copy(memo) - result = VirtualFrame(newbackframe, self.dispatch_queue) + result = VirtualFrame(newbackframe, self.dispatchqueue) result.local_boxes = [box.copy(memo) for box in self.local_boxes] return result @@ -724,9 +759,9 @@ newgreens, self.resuming) # add the later_jitstate to the chain of pending-for-dispatch_next() - dispatch_queue = self.frame.dispatch_queue - later_jitstate.next = dispatch_queue.split_chain - dispatch_queue.split_chain = later_jitstate + dispatchqueue = self.frame.dispatchqueue + later_jitstate.next = dispatchqueue.split_chain + dispatchqueue.split_chain = later_jitstate return later_jitstate def enter_block(self, incoming, memo): @@ -776,7 +811,8 @@ pass def merge_returning_jitstates(jitstate): - return_chain = jitstate.frame.dispatch_queue.return_chain + dispatchqueue = jitstate.frame.dispatchqueue + return_chain = dispatchqueue.return_chain return_cache = {} still_pending = None while return_chain is not None: @@ -797,6 +833,11 @@ res = retrieve_jitstate_for_merge(return_cache, jitstate, (), return_marker) assert res is True # finished + + resuming = most_general_jitstate.resuming + if resuming is not None: + resuming.leave_call(dispatchqueue) + return most_general_jitstate def leave_graph_red(jitstate): @@ -815,10 +856,8 @@ def leave_frame(jitstate): myframe = jitstate.frame backframe = myframe.backframe - jitstate.frame = backframe - mydispatchqueue = myframe.dispatch_queue - resuming = jitstate.resuming - if resuming is None: + jitstate.frame = backframe + if jitstate.resuming is None: #debug_view(jitstate) node = jitstate.promotion_path while not node.cut_limit: @@ -829,42 +868,17 @@ node = PromotionPathBackFromReturn(node) node = PromotionPathMergesToSee(node, 0) jitstate.promotion_path = node - else: - parent_mergesleft = mydispatchqueue.mergecounter - if parent_mergesleft == 0: - node = resuming.path.pop() - assert isinstance(node, PromotionPathBackFromReturn) - resuming.merges_to_see() - elif parent_mergesleft == MC_CALL_NOT_TAKEN: - resuming.mergesleft = 0 - else: - resuming.mergesleft = parent_mergesleft + def leave_graph_yellow(jitstate): - mydispatchqueue = jitstate.frame.dispatch_queue + mydispatchqueue = jitstate.frame.dispatchqueue return_chain = mydispatchqueue.return_chain jitstate = return_chain - resuming = mydispatchqueue.parent_resuming - if resuming is None: - n = 0 - parent_promotion_path = mydispatchqueue.parent_promotion_path - while jitstate is not None: - assert jitstate.resuming is None - node = PromotionPathNoWithArg(parent_promotion_path, n) - jitstate.promotion_path = node - n += 1 - jitstate.frame = jitstate.frame.backframe - jitstate = jitstate.next - return return_chain # a jitstate, which is the head of the chain - else: - node = resuming.path.pop() - assert isinstance(node, PromotionPathNoWithArg) - n = node.arg - for i in range(n): - assert jitstate.resuming is None - jitstate = jitstate.next - jitstate.resuming = resuming - jitstate.promotion_path = None - jitstate.frame = jitstate.frame.backframe - jitstate.next = None - return jitstate + resuming = jitstate.resuming + if resuming is not None: + resuming.leave_call(mydispatchqueue) + while jitstate is not None: + leave_frame(jitstate) + jitstate = jitstate.next + return return_chain # a jitstate, which is the head of the chain + Modified: pypy/dist/pypy/jit/timeshifter/rtyper.py ============================================================================== --- pypy/dist/pypy/jit/timeshifter/rtyper.py (original) +++ pypy/dist/pypy/jit/timeshifter/rtyper.py Tue Oct 3 15:42:04 2006 @@ -239,11 +239,8 @@ try: return self.dispatchsubclasses[mergepointfamily] except KeyError: - if mergepointfamily.is_global: - subclass = rtimeshift.BaseDispatchQueue - else: - attrnames = mergepointfamily.getattrnames() - subclass = rtimeshift.build_dispatch_subclass(attrnames) + attrnames = mergepointfamily.getlocalattrnames() + subclass = rtimeshift.build_dispatch_subclass(attrnames) self.dispatchsubclasses[mergepointfamily] = subclass return subclass @@ -729,16 +726,17 @@ args_s += [self.s_ConstOrVar] * len(greens_v) args_v = [v_jitstate, c_resumepoint] args_v += greens_v - hop.llops.genmixlevelhelpercall(rtimeshift.collect_split, - args_s, args_v, - annmodel.s_None) + v_newjs = hop.llops.genmixlevelhelpercall(rtimeshift.collect_split, + args_s, args_v, + self.s_JITState) + hop.llops.setjitstate(v_newjs) def translate_op_merge_point(self, hop, global_resumer=None): mpfamily = hop.args_v[0].value attrname = hop.args_v[1].value DispatchQueueSubclass = self.get_dispatch_subclass(mpfamily) - if mpfamily.is_global: + if global_resumer is not None: states_dic = {} def merge_point(jitstate, *key): return rtimeshift.retrieve_jitstate_for_merge(states_dic, @@ -746,9 +744,9 @@ global_resumer) else: def merge_point(jitstate, *key): - dispatch_queue = jitstate.frame.dispatch_queue - assert isinstance(dispatch_queue, DispatchQueueSubclass) - states_dic = getattr(dispatch_queue, attrname) + dispatchqueue = jitstate.frame.dispatchqueue + assert isinstance(dispatchqueue, DispatchQueueSubclass) + states_dic = getattr(dispatchqueue, attrname) return rtimeshift.retrieve_jitstate_for_merge(states_dic, jitstate, key, global_resumer) @@ -789,7 +787,10 @@ s_res = self.s_JITState tsfn = annlowlevel.PseudoHighLevelCallable(ts_fnptr, args_s, s_res) + DispatchQueueSubclass = self.get_dispatch_subclass(mpfamily) + def call_for_global_resuming(jitstate): + jitstate.frame.dispatchqueue = DispatchQueueSubclass() jitstate.resumepoint = N try: finaljitstate = tsfn(jitstate, *dummy_args) Modified: pypy/dist/pypy/jit/timeshifter/test/test_promotion.py ============================================================================== --- pypy/dist/pypy/jit/timeshifter/test/test_promotion.py (original) +++ pypy/dist/pypy/jit/timeshifter/test/test_promotion.py Tue Oct 3 15:42:04 2006 @@ -81,6 +81,28 @@ assert res == 4*17 + 10 self.check_insns(int_mul=0, int_add=1) + def test_promote_after_yellow_call(self): + S = lltype.GcStruct('S', ('x', lltype.Signed)) + def ll_two(k, s): + if k > 5: + s.x = 20*k + return 7 + else: + s.x = 10*k + return 9 + + def ll_function(n): + s = lltype.malloc(S) + c = ll_two(n, s) + k = hint(s.x, promote=True) + k += c + return hint(k, variable=True) + ll_function._global_merge_points_ = True + + res = self.timeshift(ll_function, [4], [], policy=P_NOVIRTUAL) + assert res == 49 + self.check_insns(int_add=0) + def test_promote_inside_call(self): def ll_two(n): k = hint(n, promote=True) Modified: pypy/dist/pypy/jit/timeshifter/transform.py ============================================================================== --- pypy/dist/pypy/jit/timeshifter/transform.py (original) +++ pypy/dist/pypy/jit/timeshifter/transform.py Tue Oct 3 15:42:04 2006 @@ -13,17 +13,25 @@ class MergePointFamily(object): - def __init__(self, tsgraph, is_global=False): + def __init__(self, tsgraph): self.tsgraph = tsgraph - self.is_global = is_global self.count = 0 self.resumepoint_after_mergepoint = {} - def add(self): + self.localmergepoints = [] + + def add(self, kind): result = self.count self.count += 1 - return 'mp%d' % result - def getattrnames(self): - return ['mp%d' % i for i in range(self.count)] + attrname = 'mp%d' % result + if kind == 'local': + self.localmergepoints.append(attrname) + return attrname + + def getlocalattrnames(self): + return self.localmergepoints + + def has_global_mergepoints(self): + return bool(self.resumepoint_after_mergepoint) class HintGraphTransformer(object): @@ -33,11 +41,9 @@ self.hannotator = hannotator self.graph = graph self.graphcolor = self.graph_calling_color(graph) - self.global_merge_points = self.graph_global_mps(self.graph) self.resumepoints = {} self.mergepoint_set = {} # set of blocks - self.mergepointfamily = MergePointFamily(graph, - self.global_merge_points) + self.mergepointfamily = MergePointFamily(graph) self.c_mpfamily = inputconst(lltype.Void, self.mergepointfamily) self.tsgraphs_seen = [] @@ -54,11 +60,15 @@ def compute_merge_points(self): entrymap = mkentrymap(self.graph) + if self.graph_global_mps(self.graph): + kind = 'global' + else: + kind = 'local' for block, links in entrymap.items(): if len(links) > 1 and block is not self.graph.returnblock: - self.mergepoint_set[block] = True - if self.global_merge_points: - self.mergepoint_set[self.graph.startblock] = True + self.mergepoint_set[block] = kind + if kind == 'global': + self.mergepoint_set[self.graph.startblock] = 'global' def graph_calling_color(self, tsgraph): args_hs, hs_res = self.hannotator.bookkeeper.tsgraphsigs[tsgraph] @@ -280,17 +290,17 @@ self.go_to_if(block, self.graph.returnblock, v_finished_flag) def insert_merge_points(self): - for block in self.mergepoint_set: - self.insert_merge(block) + for block, kind in self.mergepoint_set.items(): + self.insert_merge(block, kind) - def insert_merge(self, block): + def insert_merge(self, block, kind): reds, greens = self.sort_by_color(block.inputargs) nextblock = self.naive_split_block(block, 0) self.genop(block, 'save_locals', reds) - mp = self.mergepointfamily.add() + mp = self.mergepointfamily.add(kind) c_mp = inputconst(lltype.Void, mp) - if self.global_merge_points: + if kind == 'global': self.genop(block, 'save_greens', greens) prefix = 'global_' else: @@ -313,15 +323,15 @@ SSA_to_SSI({block : True, # reachable from outside nextblock: False}, self.hannotator) - if self.global_merge_points: + if kind == 'global': N = self.get_resume_point(nextblock) self.mergepointfamily.resumepoint_after_mergepoint[mp] = N def insert_dispatcher(self): - if self.global_merge_points or self.resumepoints: + if self.resumepoints: block = self.before_return_block() self.genop(block, 'dispatch_next', []) - if self.global_merge_points: + if self.mergepointfamily.has_global_mergepoints(): block = self.before_return_block() entryblock = self.before_start_block() v_rp = self.genop(entryblock, 'getresumepoint', [], @@ -576,8 +586,9 @@ link.args = [] link.target = self.get_resume_point_link(nextblock).target - self.mergepoint_set[nextblock] = True # to merge some of the possibly - # many return jitstates + # to merge some of the possibly many return jitstates + self.mergepoint_set[nextblock] = 'local' + # __________ hints __________ From arigo at codespeak.net Tue Oct 3 17:41:13 2006 From: arigo at codespeak.net (arigo at codespeak.net) Date: Tue, 3 Oct 2006 17:41:13 +0200 (CEST) Subject: [pypy-svn] r32847 - pypy/dist/pypy/jit/timeshifter Message-ID: <20061003154113.3C18D10060@code0.codespeak.net> Author: arigo Date: Tue Oct 3 17:41:07 2006 New Revision: 32847 Modified: pypy/dist/pypy/jit/timeshifter/rtimeshift.py Log: Also detect CompiledInterrupted case at the end of a yellow call. Modified: pypy/dist/pypy/jit/timeshifter/rtimeshift.py ============================================================================== --- pypy/dist/pypy/jit/timeshifter/rtimeshift.py (original) +++ pypy/dist/pypy/jit/timeshifter/rtimeshift.py Tue Oct 3 17:41:07 2006 @@ -10,8 +10,8 @@ FOLDABLE_OPS = dict.fromkeys(lloperation.enum_foldable_ops()) -def debug_view(*ll_objects): - lloperation.llop.debug_view(lltype.Void, *ll_objects) +debug_view = lloperation.llop.debug_view +debug_print = lloperation.llop.debug_print # ____________________________________________________________ # emit ops @@ -576,7 +576,7 @@ promotenode = resuming.path.pop() assert isinstance(promotenode, PromotionPathPromote) - #debug_view(promotenode, resuming, incoming) + #debug_view(lltype.Void, promotenode, resuming, incoming) pm = promotenode.promotion_point assert pm.promotion_path is promotenode.next @@ -813,6 +813,7 @@ def merge_returning_jitstates(jitstate): dispatchqueue = jitstate.frame.dispatchqueue return_chain = dispatchqueue.return_chain + resuming = jitstate.resuming return_cache = {} still_pending = None while return_chain is not None: @@ -824,6 +825,7 @@ jitstate.next = still_pending still_pending = jitstate if still_pending is None: + assert resuming is None raise CompilationInterrupted most_general_jitstate = still_pending still_pending = still_pending.next @@ -834,7 +836,6 @@ return_marker) assert res is True # finished - resuming = most_general_jitstate.resuming if resuming is not None: resuming.leave_call(dispatchqueue) @@ -873,8 +874,13 @@ def leave_graph_yellow(jitstate): mydispatchqueue = jitstate.frame.dispatchqueue return_chain = mydispatchqueue.return_chain - jitstate = return_chain resuming = jitstate.resuming + if return_chain is None: + assert resuming is None + raise CompilationInterrupted + if resuming is not None: + resuming.leave_call(mydispatchqueue) + jitstate = return_chain if resuming is not None: resuming.leave_call(mydispatchqueue) while jitstate is not None: From auc at codespeak.net Tue Oct 3 17:48:08 2006 From: auc at codespeak.net (auc at codespeak.net) Date: Tue, 3 Oct 2006 17:48:08 +0200 (CEST) Subject: [pypy-svn] r32848 - in pypy/dist/pypy/objspace/cclp: . constraint Message-ID: <20061003154808.C87EF10063@code0.codespeak.net> Author: auc Date: Tue Oct 3 17:47:51 2006 New Revision: 32848 Modified: pypy/dist/pypy/objspace/cclp/constraint/distributor.py pypy/dist/pypy/objspace/cclp/space.py pypy/dist/pypy/objspace/cclp/thunk.py Log: unified cspace/distibutor thunks, preliminary support for cspace interpreted clone() support (for constraints) Modified: pypy/dist/pypy/objspace/cclp/constraint/distributor.py ============================================================================== --- pypy/dist/pypy/objspace/cclp/constraint/distributor.py (original) +++ pypy/dist/pypy/objspace/cclp/constraint/distributor.py Tue Oct 3 17:47:51 2006 @@ -10,33 +10,34 @@ from pypy.objspace.std.listobject import W_ListObject from pypy.objspace.std.stringobject import W_StringObject -from pypy.objspace.cclp.types import W_AbstractDistributor, Solution -from pypy.objspace.cclp.thunk import DistributorThunk +from pypy.objspace.cclp.types import W_AbstractDistributor, Solution, W_Var from pypy.objspace.cclp.misc import w, ClonableCoroutine, get_current_cspace from pypy.objspace.cclp.global_state import scheduler -from pypy.objspace.cclp.interp_var import interp_free - -def spawn_distributor(space, distributor): - thread = ClonableCoroutine(space) - thread._cspace = get_current_cspace(space) - thunk = DistributorThunk(space, distributor, thread) - thread.bind(thunk) - if not we_are_translated(): - w("DISTRIBUTOR THREAD", str(id(thread))) - scheduler[0].add_new_thread(thread) - scheduler[0].schedule() +from pypy.objspace.cclp.interp_var import interp_free, interp_bind def distribute(space, w_strategy): assert isinstance(w_strategy, W_StringObject) strat = space.str_w(w_strategy) - if strat == 'naive': - pass - elif strat == 'dichotomy': - dist = make_split_distributor(space, space.newint(2)) - spawn_distributor(space, dist) + cspace = get_current_cspace(space) + if strat == 'dichotomy': + cspace.distributor = make_split_distributor(space, space.newint(2)) else: raise OperationError(space.w_RuntimeError, space.wrap("please pick a strategy in (naive, dichotomy)")) + + dist = cspace.distributor + # constraint distributor thread main loop + try: + while dist.distributable(): + choice = cspace.choose(dist.fanout()) + dist.w_distribute(choice) + except ConsistencyError, e: + w("-- DISTRIBUTOR thunk exited because", str(e)) + cspace.fail() + except Exception, eek: + if not we_are_translated(): + import traceback + traceback.print_exc() app_distribute = interp2app(distribute) Modified: pypy/dist/pypy/objspace/cclp/space.py ============================================================================== --- pypy/dist/pypy/objspace/cclp/space.py (original) +++ pypy/dist/pypy/objspace/cclp/space.py Tue Oct 3 17:47:51 2006 @@ -8,13 +8,22 @@ from pypy.objspace.cclp.thunk import CSpaceThunk, PropagatorThunk from pypy.objspace.cclp.global_state import scheduler from pypy.objspace.cclp.variable import newvar -from pypy.objspace.cclp.types import ConsistencyError, Solution, W_Var +from pypy.objspace.cclp.types import ConsistencyError, Solution, W_Var, \ + W_CVar, W_AbstractDomain from pypy.objspace.cclp.interp_var import interp_bind, interp_free + +class DummyCallable(baseobjspace.W_Root): + def __call__(self): pass + +dummy_function = DummyCallable() +dummy_args = argument.Arguments([]) + def newspace(space, w_callable, __args__): args = __args__.normalize() # coro init w_coro = ClonableCoroutine(space) + #w_callable : a logic or constraint script ???? thunk = CSpaceThunk(space, w_callable, args, w_coro) w_coro.bind(thunk) if not we_are_translated(): @@ -62,7 +71,9 @@ assert (parent is None) or isinstance(parent, W_CSpace) self.space = space # the object space ;-) self.parent = parent - self.distributor = thread + self.dist_thread = thread + self.distributor = None + self.distributor_is_logic_script = True # choice mgmt self._choice = newvar(space) self._committed = newvar(space) @@ -72,9 +83,47 @@ self._failed = False # constraint store ... self._store = {} # name -> var + if not we_are_translated(): + self._constraints = [] + self._choose_count = 0 + self._commit_count = 0 def register_var(self, cvar): self._store[cvar.name] = cvar + self.distributor_is_logic_script = False + + def clone(self): + if not we_are_translated(): + print "<-CLONE !! -----------------------------------------------------------------------" + # build fresh cspace & distributor thread + thread = ClonableCoroutine(self.space) + new_cspace = W_CSpace(self.space, thread, None) + thread._cspace = new_cspace + # new distributor + old_dist = self.dist_thread.thunk.dist + new_dist = old_dist.__class__(self.space, old_dist._fanout) + new_dist._cspace = new_cspace + # new distributor thunk + thunk = CSpaceThunk(self.space, self.space.wrap(dummy_function), dummy_args, thread) + thread.bind(thunk) + scheduler[0].add_new_thread(thread) + # copy the store + for var in self._store.values(): + new_cspace.register_var(var.copy(self.space)) + assert self.dist_thread.thunk.dist.distributable() + # rebuild propagators + for const in self._constraints: + new_cspace.tell(const) + # other attrs + new_cspace._solution = newvar(self.space) + self.space.unify(new_cspace._solution, self.space.newlist(self._store.values())) + if hasattr(self, '_last_choice'): + new_cspace._last_choice = self._last_choice + print "LOOOOK at that : ", new_cspace._committed, self._committed + return new_cspace + else: + raise NotImplementedError + def w_ask(self): scheduler[0].wait_stable(self) @@ -99,9 +148,14 @@ return committed def w_commit(self, w_n): + self._commit_count += 1 + #scheduler[0].wait_stable(self) + self._commit_count += 1 assert isinstance(w_n, W_IntObject) n = w_n.intval - assert interp_free(self._committed) + if not interp_free(self._committed): + import pdb + pdb.set_trace() assert n > 0 assert n <= self._last_choice interp_bind(self._committed, w_n) @@ -114,6 +168,7 @@ w_coro.bind(thunk) if not we_are_translated(): w("PROPAGATOR in thread", str(id(w_coro))) + self._constraints.append(w_constraint) scheduler[0].add_new_thread(w_coro) scheduler[0].schedule() @@ -125,6 +180,15 @@ def w_merge(self): self._store = {} + # let's bind the solution variables + sol = self._solution.w_bound_to + if contains_cvar(sol.wrappeditems): + for var in sol.wrappeditems: + assert isinstance(var, W_CVar) + dom = var.w_dom + assert isinstance(dom, W_AbstractDomain) + assert dom.size() == 1 + interp_bind(var, dom.get_values()[0]) return self._solution def __ne__(self, other): @@ -133,7 +197,15 @@ return True +def contains_cvar(lst): + for elt in lst: + if isinstance(elt, W_CVar): + return True + return False + + W_CSpace.typedef = typedef.TypeDef("W_CSpace", ask = gateway.interp2app(W_CSpace.w_ask), commit = gateway.interp2app(W_CSpace.w_commit), + clone = gateway.interp2app(W_CSpace.clone), merge = gateway.interp2app(W_CSpace.w_merge)) Modified: pypy/dist/pypy/objspace/cclp/thunk.py ============================================================================== --- pypy/dist/pypy/objspace/cclp/thunk.py (original) +++ pypy/dist/pypy/objspace/cclp/thunk.py Tue Oct 3 17:47:51 2006 @@ -9,6 +9,7 @@ interp_bind, interp_free, interp_wait_or from pypy.objspace.std.listobject import W_ListObject +from pypy.objspace.std.listobject import W_TupleObject from pypy.rpython.objectmodel import we_are_translated def logic_args(args): @@ -80,33 +81,42 @@ _AppThunk.__init__(self, space, coro.costate, w_callable, args) self._coro = coro - def is_distributor(self): - return self._coro == self._coro._cspace.distributor - def call(self): w("-- initial thunk CALL in", str(id(self._coro))) scheduler[0].trace_vars(self._coro, logic_args(self.args.unpack())) cspace = self._coro._cspace - cspace.distributor = self._coro space = self.space try: try: + #if self.runs_a_logic_script(): _AppThunk.call(self) except Exception, exc: - # maybe app_level sent something ... - w("-- exceptional EXIT of cspace", str(id(self._coro)), "with", str(exc)) + # maybe app_level let something buble up ... + w("-- exceptional EXIT of cspace DISTRIBUTOR", str(id(self._coro)), "with", str(exc)) failed_value = W_FailedValue(exc) scheduler[0].dirty_traced_vars(self._coro, failed_value) - self._coro._dead = True - if self.is_distributor(): - cspace.fail() interp_bind(cspace._solution, failed_value) + cspace.fail() else: - w("-- clean (valueless) EXIT of cspace", str(id(self._coro))) - interp_bind(cspace._solution, self.costate.w_tempval) - if self.is_distributor(): - interp_bind(cspace._choice, space.newint(1)) + w("-- clean EXIT of DISTRIBUTOR (success)", str(id(self._coro))) + try: + sol = cspace._solution + assert isinstance(sol, W_Var) + interp_bind(sol, self.costate.w_tempval) + outcome = sol.w_bound_to + if not (isinstance(outcome, W_ListObject) or \ + isinstance(outcome, W_TupleObject)): + w("WARINING: return value type of the script was not a list or tuple, we do nothing ...") + return + assert interp_free(cspace._choice) + interp_bind(cspace._choice, self.space.newint(1)) + except Exception, foo: + print "WE DIED BECAUSE", str(foo) + import pdb + pdb.set_trace() + finally: + interp_bind(cspace._finished, self.space.w_True) scheduler[0].remove_thread(self._coro) scheduler[0].schedule() @@ -150,44 +160,3 @@ scheduler[0].remove_thread(self.coro) scheduler[0].schedule() - -class DistributorThunk(AbstractThunk): - def __init__(self, space, w_distributor, coro): - self.space = space - self.coro = coro - self.dist = w_distributor - - def call(self): - coro = self.coro - cspace = coro._cspace - try: - cspace.distributor = coro - dist = self.dist - try: - while dist.distributable(): - choice = cspace.choose(dist.fanout()) - dist.w_distribute(choice) - except ConsistencyError, e: - w("-- DISTRIBUTOR thunk exited because", str(e)) - interp_bind(cspace._choice, self.space.newint(0)) - else: - w("-- DISTRIBUTOR thunk exited because a solution was found") - #XXX assert that all propagators are entailed - sol = cspace._solution - assert isinstance(sol, W_Var) - varset = sol.w_bound_to - assert isinstance(varset, W_ListObject) - for var in varset.wrappeditems: - assert isinstance(var, W_CVar) - dom = var.w_dom - assert isinstance(dom, W_AbstractDomain) - assert dom.size() == 1 - interp_bind(var, dom.get_values()[0]) - assert interp_free(cspace._choice) - interp_bind(cspace._choice, self.space.newint(1)) - finally: - interp_bind(cspace._finished, self.space.w_True) - coro._dead = True - scheduler[0].remove_thread(coro) - scheduler[0].schedule() - From auc at codespeak.net Tue Oct 3 17:50:43 2006 From: auc at codespeak.net (auc at codespeak.net) Date: Tue, 3 Oct 2006 17:50:43 +0200 (CEST) Subject: [pypy-svn] r32849 - pypy/dist/pypy/objspace/constraint/applevel Message-ID: <20061003155043.E59891006E@code0.codespeak.net> Author: auc Date: Tue Oct 3 17:50:42 2006 New Revision: 32849 Modified: pypy/dist/pypy/objspace/constraint/applevel/solver.py Log: recomputation might work now Modified: pypy/dist/pypy/objspace/constraint/applevel/solver.py ============================================================================== --- pypy/dist/pypy/objspace/constraint/applevel/solver.py (original) +++ pypy/dist/pypy/objspace/constraint/applevel/solver.py Tue Oct 3 17:50:42 2006 @@ -44,60 +44,40 @@ #-- dfs with recomputations -class Chain(object): - def __init__(self, space=None, parent=None, distance=1): - self.space = space - self.parent = parent - self.distance = distance - self.child = None - self.last_branch = None - def set_branches(self, branches): - self.branches = range(branches) - def collect_space(self, space): - self.child = Chain(space, parent=self, - distance=self.distance + 1) - return self.child - def clone_time(self): - return self.distance % recomputation_distance - -def dfs_with_recomputations(space, recomputation_distance=1): - assert recomputation_distance > 0 - - node = Chain(space) - - def get_space(): - # XXX: write me - pass - - while node: - space = get_space() - status = space.ask() - if status == 1: - yield space.merge() - elif status > 1: - if node.clone_time(): - clone = space.clone() - if node.child is None: - node.set_branges(status) - branch = node.branches.pop() - node.last_branch = branch # recomputation info - node = node.collect(clone) - clone.commit(branch) - else: - #find previous clone_time node - cur = node.parent - while not cur.clone_time(): - cur = cur.parent - # take a clone of the local space, - # replay all the branches - clone = cur.space.clone() - while cur.child: - clone.commit(cur.last_branch) - cur = cur.child - # now, do the new computation - # XXX: factor me out - assert cur is node - branch = node.branches.pop() - node.last_branch = branch - node = node.collect(None) - clone.commit(branch) + +def recompute(space, branches_list): + # branches_list contains the recomputation path, + # bottom-up + if branches_list == None: + return space.clone() + else: + head, tail = branches_list + C = recompute(space, tail) + return C.commit(head) + +def dfre(S, R, branches_list, distance, max_dist, solutions): + status = S.ask() + if status == 0: + return + elif status == 1: + solutions.append(S.merge()) + return + else: # assert status == 2 + if distance == max_dist: + C = S.clone() + S.commit(1) + dfre(S, C, (1, None), 1, max_dist, solutions) + C.commit(2) + dfre(C, C, None, max_dist, max_dist, solutions) + else: + S.commit(1) + dfre(S, R, (1, branches_list), distance+1, max_dist, solutions) + C = recompute(R, branches_list) + C.commit(2) + dfre(C, R, (2, branches_list), distance+1, max_dist, solutions) + +def solve_recomputing(space, recomputation_distance=5): + solutions = [] + dfre(space, space, None, recomputation_distance, max_dist, solutions) + return solutions + From auc at codespeak.net Tue Oct 3 17:52:05 2006 From: auc at codespeak.net (auc at codespeak.net) Date: Tue, 3 Oct 2006 17:52:05 +0200 (CEST) Subject: [pypy-svn] r32850 - pypy/dist/pypy/objspace/constraint/applevel Message-ID: <20061003155205.33E4110071@code0.codespeak.net> Author: auc Date: Tue Oct 3 17:52:02 2006 New Revision: 32850 Removed: pypy/dist/pypy/objspace/constraint/applevel/problems.py Log: moved this From pedronis at codespeak.net Tue Oct 3 18:03:33 2006 From: pedronis at codespeak.net (pedronis at codespeak.net) Date: Tue, 3 Oct 2006 18:03:33 +0200 (CEST) Subject: [pypy-svn] r32852 - pypy/dist/pypy/jit/timeshifter Message-ID: <20061003160333.583C31006E@code0.codespeak.net> Author: pedronis Date: Tue Oct 3 18:03:30 2006 New Revision: 32852 Modified: pypy/dist/pypy/jit/timeshifter/rtimeshift.py Log: fix some XXX. one was not relevant anymore: we always clear the caches when we reach the promotion point resuming. Modified: pypy/dist/pypy/jit/timeshifter/rtimeshift.py ============================================================================== --- pypy/dist/pypy/jit/timeshifter/rtimeshift.py (original) +++ pypy/dist/pypy/jit/timeshifter/rtimeshift.py Tue Oct 3 18:03:30 2006 @@ -202,15 +202,14 @@ res = frozen.exactmatch(jitstate, outgoingvarboxes, memo) assert res, "exactmatch() failed" newblock = enter_next_block(jitstate, outgoingvarboxes) - # XXX don't save newblock, or have rgenop produce None, when resuming states_dic[key] = frozen, newblock if global_resumer is not None and global_resumer is not return_marker: greens_gv = jitstate.greens rgenop = jitstate.curbuilder.rgenop - jitstate.promotion_path = PromotionPathRoot(greens_gv, rgenop, - frozen, newblock, - global_resumer) - # XXX put a PromotionPathMergesToSee too + node = PromotionPathRoot(greens_gv, rgenop, + frozen, newblock, + global_resumer) + jitstate.promotion_path = PromotionPathMergesToSee(node, 0) start_new_block._annspecialcase_ = "specialize:arglltype(2)" def retrieve_jitstate_for_merge(states_dic, jitstate, key, global_resumer): @@ -456,6 +455,7 @@ jitstate.greens = self.greens_gv jitstate.resuming = resuminginfo assert jitstate.frame.backframe is None + resuminginfo.merges_to_see() self.global_resumer(jitstate) builder.show_incremental_progress() From pedronis at codespeak.net Tue Oct 3 19:41:27 2006 From: pedronis at codespeak.net (pedronis at codespeak.net) Date: Tue, 3 Oct 2006 19:41:27 +0200 (CEST) Subject: [pypy-svn] r32855 - pypy/dist/pypy/translator/tool Message-ID: <20061003174127.119BE10068@code0.codespeak.net> Author: pedronis Date: Tue Oct 3 19:41:24 2006 New Revision: 32855 Modified: pypy/dist/pypy/translator/tool/pdbplus.py Log: add an interact command to pdb to invoke a code.py interactive prompt Modified: pypy/dist/pypy/translator/tool/pdbplus.py ============================================================================== --- pypy/dist/pypy/translator/tool/pdbplus.py (original) +++ pypy/dist/pypy/translator/tool/pdbplus.py Tue Oct 3 19:41:24 2006 @@ -1,5 +1,6 @@ import pdb import types +import code from pypy.objspace.flow.model import FunctionGraph class _EnableGraphic: @@ -397,6 +398,12 @@ return raise _EnableGraphic(int(arg)) + def do_interact(self, arg): + """invoke a code.py sub prompt""" + ns = self.curframe.f_globals.copy() + ns.update(self.curframe.f_locals) + code.interact("*interactive*", local=ns) + def help_graphs(self): print "graph commands are: showg, flowg, callg, classhier, enable_graphic" From mwh at codespeak.net Tue Oct 3 19:43:38 2006 From: mwh at codespeak.net (mwh at codespeak.net) Date: Tue, 3 Oct 2006 19:43:38 +0200 (CEST) Subject: [pypy-svn] r32856 - pypy/dist/pypy/rpython/memory Message-ID: <20061003174338.8EC041006C@code0.codespeak.net> Author: mwh Date: Tue Oct 3 19:43:37 2006 New Revision: 32856 Modified: pypy/dist/pypy/rpython/memory/gctransform.py Log: remove a dead line Modified: pypy/dist/pypy/rpython/memory/gctransform.py ============================================================================== --- pypy/dist/pypy/rpython/memory/gctransform.py (original) +++ pypy/dist/pypy/rpython/memory/gctransform.py Tue Oct 3 19:43:37 2006 @@ -154,7 +154,6 @@ # seem to run into all the same problems as the ones we already # had to solve there. for i, op in enumerate(block.operations): - num_ops_after_exc_raising = 0 ops, index = self.replacement_operations(op, livevars, block) if not ops: continue # may happen when we eat gc_protect/gc_unprotect. From mwh at codespeak.net Tue Oct 3 19:46:45 2006 From: mwh at codespeak.net (mwh at codespeak.net) Date: Tue, 3 Oct 2006 19:46:45 +0200 (CEST) Subject: [pypy-svn] r32857 - in pypy/dist/pypy/rpython: . memory/gctransform2 memory/gctransform2/test Message-ID: <20061003174645.9906410071@code0.codespeak.net> Author: mwh Date: Tue Oct 3 19:46:43 2006 New Revision: 32857 Added: pypy/dist/pypy/rpython/memory/gctransform2/ pypy/dist/pypy/rpython/memory/gctransform2/__init__.py (contents, props changed) pypy/dist/pypy/rpython/memory/gctransform2/refcounting.py (contents, props changed) pypy/dist/pypy/rpython/memory/gctransform2/support.py (contents, props changed) pypy/dist/pypy/rpython/memory/gctransform2/test/ pypy/dist/pypy/rpython/memory/gctransform2/test/__init__.py (contents, props changed) pypy/dist/pypy/rpython/memory/gctransform2/test/test_refcounting.py (contents, props changed) pypy/dist/pypy/rpython/memory/gctransform2/test/test_transform.py (contents, props changed) pypy/dist/pypy/rpython/memory/gctransform2/transform.py (contents, props changed) Modified: pypy/dist/pypy/rpython/llinterp.py Log: start a much more rtyper-ish rewrite of the gctransformer. only the base class and the refcounting transformer done so far. Modified: pypy/dist/pypy/rpython/llinterp.py ============================================================================== --- pypy/dist/pypy/rpython/llinterp.py (original) +++ pypy/dist/pypy/rpython/llinterp.py Tue Oct 3 19:46:43 2006 @@ -635,6 +635,7 @@ assert not isinstance(getattr(lltype.typeOf(obj).TO, field), lltype.ContainerType) return getattr(obj, field) + op_bare_getfield = op_getfield def op_cast_int_to_ptr(self, RESTYPE, int1): return lltype.cast_int_to_ptr(RESTYPE, int1) Added: pypy/dist/pypy/rpython/memory/gctransform2/__init__.py ============================================================================== --- (empty file) +++ pypy/dist/pypy/rpython/memory/gctransform2/__init__.py Tue Oct 3 19:46:43 2006 @@ -0,0 +1 @@ +# Added: pypy/dist/pypy/rpython/memory/gctransform2/refcounting.py ============================================================================== --- (empty file) +++ pypy/dist/pypy/rpython/memory/gctransform2/refcounting.py Tue Oct 3 19:46:43 2006 @@ -0,0 +1,367 @@ +import py +from pypy.rpython.memory.gctransform2.transform import GCTransformer +from pypy.rpython.memory.gctransform2.support import find_gc_ptrs_in_type +from pypy.rpython.lltypesystem import lltype, llmemory +from pypy.rpython.lltypesystem.lloperation import llop +from pypy.translator.backendopt.support import var_needsgc +from pypy.rpython import rmodel +from pypy.rpython.memory import lladdress +from pypy.rpython.memory.gcheader import GCHeaderBuilder +#from pypy.rpython.extregistry import ExtRegistryEntry +from pypy.rpython.rarithmetic import ovfcheck +from pypy.rpython.extregistry import ExtRegistryEntry +from pypy.annotation import model as annmodel +from pypy.rpython.rbuiltin import gen_cast +import os, sys + + +class LLTransformerOp(object): + """Objects that can be called in ll functions. + Their calls are replaced by a simple operation of the GC transformer, + e.g. ll_pop_alive. + """ + def __init__(self, transformer_method): + self.transformer_method = transformer_method + +class LLTransformerOpEntry(ExtRegistryEntry): + "Annotation and specialization of LLTransformerOp() instances." + _type_ = LLTransformerOp + + def compute_result_annotation(self, s_arg): + return annmodel.s_None + + def specialize_call(self, hop): + op = self.instance # the LLTransformerOp instance + op.transformer_method(hop.args_v[0], hop.llops) + hop.exception_cannot_occur() + return hop.inputconst(hop.r_result.lowleveltype, hop.s_result.const) + +def ll_call_destructor(destrptr, destr_v): + try: + destrptr(destr_v) + except: + try: + os.write(2, "a destructor raised an exception, ignoring it\n") + except: + pass + +def _static_deallocator_body_for_type(v, TYPE, depth=1): + if isinstance(TYPE, lltype.Array): + inner = list(_static_deallocator_body_for_type('v_%i'%depth, TYPE.OF, depth+1)) + if inner: + yield ' '*depth + 'i_%d = 0'%(depth,) + yield ' '*depth + 'l_%d = len(%s)'%(depth, v) + yield ' '*depth + 'while i_%d < l_%d:'%(depth, depth) + yield ' '*depth + ' v_%d = %s[i_%d]'%(depth, v, depth) + for line in inner: + yield line + yield ' '*depth + ' i_%d += 1'%(depth,) + elif isinstance(TYPE, lltype.Struct): + for name in TYPE._names: + inner = list(_static_deallocator_body_for_type( + v + '_' + name, TYPE._flds[name], depth)) + if inner: + yield ' '*depth + v + '_' + name + ' = ' + v + '.' + name + for line in inner: + yield line + elif isinstance(TYPE, lltype.Ptr) and TYPE._needsgc(): + yield ' '*depth + 'pop_alive(%s)'%v + +counts = {} + +## def print_call_chain(ob): +## import sys +## f = sys._getframe(1) +## stack = [] +## flag = False +## while f: +## if f.f_locals.get('self') is ob: +## stack.append((f.f_code.co_name, f.f_locals.get('TYPE'))) +## if not flag: +## counts[f.f_code.co_name] = counts.get(f.f_code.co_name, 0) + 1 +## print counts +## flag = True +## f = f.f_back +## stack.reverse() +## for i, (a, b) in enumerate(stack): +## print ' '*i, a, repr(b)[:100-i-len(a)], id(b) + +ADDRESS_VOID_FUNC = lltype.FuncType([llmemory.Address], lltype.Void) + +def get_rtti(TYPE): + if isinstance(TYPE, lltype.RttiStruct): + try: + return lltype.getRuntimeTypeInfo(TYPE) + except ValueError: + pass + return None + +class RefcountingGCTransformer(GCTransformer): + + HDR = lltype.Struct("header", ("refcount", lltype.Signed)) + + def __init__(self, translator): + super(RefcountingGCTransformer, self).__init__(translator, inline=True) + self.gcheaderbuilder = GCHeaderBuilder(self.HDR) + gc_header_offset = self.gcheaderbuilder.size_gc_header + self.deallocator_graphs_needing_transforming = [] + + # create incref, etc graph + + HDRPTR = lltype.Ptr(self.HDR) + def ll_incref(adr): + if adr: + gcheader = llmemory.cast_adr_to_ptr(adr - gc_header_offset, HDRPTR) + gcheader.refcount = gcheader.refcount + 1 + def ll_decref(adr, dealloc): + if adr: + gcheader = llmemory.cast_adr_to_ptr(adr - gc_header_offset, HDRPTR) + refcount = gcheader.refcount - 1 + gcheader.refcount = refcount + if refcount == 0: + dealloc(adr) + def ll_decref_simple(adr): + if adr: + gcheader = llmemory.cast_adr_to_ptr(adr - gc_header_offset, HDRPTR) + refcount = gcheader.refcount - 1 + if refcount == 0: + llop.gc_free(lltype.Void, adr) + else: + gcheader.refcount = refcount + def ll_no_pointer_dealloc(adr): + llop.gc_free(lltype.Void, adr) + + def ll_malloc_fixedsize(size): + size = gc_header_offset + size + result = lladdress.raw_malloc(size) + lladdress.raw_memclear(result, size) + result += gc_header_offset + return result + def ll_malloc_varsize_no_length(length, size, itemsize): + try: + fixsize = gc_header_offset + size + varsize = ovfcheck(itemsize * length) + tot_size = ovfcheck(fixsize + varsize) + except OverflowError: + raise MemoryError + result = lladdress.raw_malloc(tot_size) + lladdress.raw_memclear(result, tot_size) + result += gc_header_offset + return result + def ll_malloc_varsize(length, size, itemsize, lengthoffset): + result = ll_malloc_varsize_no_length(length, size, itemsize) + (result + lengthoffset).signed[0] = length + return result + + if self.translator: + self.increfptr = self.inittime_helper( + ll_incref, [llmemory.Address], lltype.Void) + self.decref_ptr = self.inittime_helper( + ll_decref, [llmemory.Address, lltype.Ptr(ADDRESS_VOID_FUNC)], + lltype.Void) + self.decref_simple_ptr = self.inittime_helper( + ll_decref_simple, [llmemory.Address], lltype.Void) + self.no_pointer_dealloc_ptr = self.inittime_helper( + ll_no_pointer_dealloc, [llmemory.Address], lltype.Void) + self.malloc_fixedsize_ptr = self.inittime_helper( + ll_malloc_fixedsize, [lltype.Signed], llmemory.Address) + self.malloc_varsize_no_length_ptr = self.inittime_helper( + ll_malloc_varsize_no_length, [lltype.Signed]*3, llmemory.Address) + self.malloc_varsize_ptr = self.inittime_helper( + ll_malloc_varsize, [lltype.Signed]*4, llmemory.Address) + self.mixlevelannotator.finish() # for now + # cache graphs: + self.decref_funcptrs = {} + self.static_deallocator_funcptrs = {} + self.dynamic_deallocator_funcptrs = {} + self.queryptr2dynamic_deallocator_funcptr = {} + + def var_needs_set_transform(self, var): + return var_needsgc(var) + + def push_alive_nopyobj(self, var, llops): + v_adr = gen_cast(llops, llmemory.Address, var) + llops.genop("direct_call", [self.increfptr, v_adr]) + + def pop_alive_nopyobj(self, var, llops): + PTRTYPE = var.concretetype + v_adr = gen_cast(llops, llmemory.Address, var) + + dealloc_fptr = self.dynamic_deallocation_funcptr_for_type(PTRTYPE.TO) + if dealloc_fptr is self.no_pointer_dealloc_ptr.value: + # simple case + llops.genop("direct_call", [self.decref_simple_ptr, v_adr]) + else: + cdealloc_fptr = rmodel.inputconst( + lltype.typeOf(dealloc_fptr), dealloc_fptr) + llops.genop("direct_call", [self.decref_ptr, v_adr, cdealloc_fptr]) + + def gct_gc_protect(self, hop): + """ protect this object from gc (make it immortal) """ + self.push_alive(hop.spaceop.args[0]) + + def gct_gc_unprotect(self, hop): + """ get this object back into gc control """ + self.pop_alive(hop.spaceop.args[0]) + + def gct_malloc(self, hop): + TYPE = hop.spaceop.result.concretetype.TO + assert not TYPE._is_varsize() + c_size = rmodel.inputconst(lltype.Signed, llmemory.sizeof(TYPE)) + v_raw = hop.genop("direct_call", [self.malloc_fixedsize_ptr, c_size], + resulttype=llmemory.Address) + hop.cast_result(v_raw) + + def gct_malloc_varsize(self, hop): + def intconst(c): return rmodel.inputconst(lltype.Signed, c) + + op = hop.spaceop + TYPE = op.result.concretetype.TO + assert TYPE._is_varsize() + + if isinstance(TYPE, lltype.Struct): + ARRAY = TYPE._flds[TYPE._arrayfld] + else: + ARRAY = TYPE + assert isinstance(ARRAY, lltype.Array) + if ARRAY._hints.get('isrpystring', False): + c_const_size = intconst(llmemory.sizeof(TYPE, 1)) + else: + c_const_size = intconst(llmemory.sizeof(TYPE, 0)) + c_item_size = intconst(llmemory.sizeof(ARRAY.OF)) + + if ARRAY._hints.get("nolength", False): + v_raw = hop.genop("direct_call", + [self.malloc_varsize_no_length_ptr, op.args[-1], + c_const_size, c_item_size], + resulttype=llmemory.Address) + else: + if isinstance(TYPE, lltype.Struct): + offset_to_length = llmemory.FieldOffset(TYPE, TYPE._arrayfld) + \ + llmemory.ArrayLengthOffset(ARRAY) + else: + offset_to_length = llmemory.ArrayLengthOffset(ARRAY) + v_raw = hop.genop("direct_call", + [self.malloc_varsize_ptr, op.args[-1], + c_const_size, c_item_size, intconst(offset_to_length)], + resulttype=llmemory.Address) + hop.cast_result(v_raw) + + def gct_gc_deallocate(self, hop): + TYPE = hop.spaceop.args[0].value + v_addr = hop.spaceop.args[1] + dealloc_fptr = self.dynamic_deallocation_funcptr_for_type(TYPE) + cdealloc_fptr = rmodel.inputconst( + lltype.typeOf(dealloc_fptr), dealloc_fptr) + hop.genop("direct_call", [cdealloc_fptr, v_addr]) + + def consider_constant(self, TYPE, value): + if value is not lltype.top_container(value): + return + if isinstance(TYPE, (lltype.GcStruct, lltype.GcArray)): + p = value._as_ptr() + if not self.gcheaderbuilder.get_header(p): + hdr = self.gcheaderbuilder.new_header(p) + hdr.refcount = sys.maxint // 2 + + def static_deallocation_funcptr_for_type(self, TYPE): + if TYPE in self.static_deallocator_funcptrs: + return self.static_deallocator_funcptrs[TYPE] + #print_call_chain(self) + + rtti = get_rtti(TYPE) + if rtti is not None and hasattr(rtti._obj, 'destructor_funcptr'): + destrptr = rtti._obj.destructor_funcptr + DESTR_ARG = lltype.typeOf(destrptr).TO.ARGS[0] + else: + destrptr = None + DESTR_ARG = None + + if destrptr is None and not find_gc_ptrs_in_type(TYPE): + #print repr(TYPE)[:80], 'is dealloc easy' + p = self.no_pointer_dealloc_ptr.value + self.static_deallocator_funcptrs[TYPE] = p + return p + + if destrptr is not None: + body = '\n'.join(_static_deallocator_body_for_type('v', TYPE, 3)) + src = """ +def ll_deallocator(addr): + exc_instance = llop.gc_fetch_exception(EXC_INSTANCE_TYPE) + try: + v = cast_adr_to_ptr(addr, PTR_TYPE) + gcheader = cast_adr_to_ptr(addr - gc_header_offset, HDRPTR) + # refcount is at zero, temporarily bump it to 1: + gcheader.refcount = 1 + destr_v = cast_pointer(DESTR_ARG, v) + ll_call_destructor(destrptr, destr_v) + refcount = gcheader.refcount - 1 + gcheader.refcount = refcount + if refcount == 0: +%s + llop.gc_free(lltype.Void, addr) + except: + pass + llop.gc_restore_exception(lltype.Void, exc_instance) + pop_alive(exc_instance) + # XXX layering of exceptiontransform versus gcpolicy + +""" % (body, ) + else: + call_del = None + body = '\n'.join(_static_deallocator_body_for_type('v', TYPE)) + src = ('def ll_deallocator(addr):\n v = cast_adr_to_ptr(addr, PTR_TYPE)\n' + + body + '\n llop.gc_free(lltype.Void, addr)\n') + d = {'pop_alive': LLTransformerOp(self.pop_alive), + 'llop': llop, + 'lltype': lltype, + 'destrptr': destrptr, + 'gc_header_offset': self.gcheaderbuilder.size_gc_header, + 'cast_adr_to_ptr': llmemory.cast_adr_to_ptr, + 'cast_pointer': lltype.cast_pointer, + 'PTR_TYPE': lltype.Ptr(TYPE), + 'DESTR_ARG': DESTR_ARG, + 'EXC_INSTANCE_TYPE': self.translator.rtyper.exceptiondata.lltype_of_exception_value, + 'll_call_destructor': ll_call_destructor, + 'HDRPTR':lltype.Ptr(self.HDR)} + exec src in d + this = d['ll_deallocator'] + fptr = self.annotate_helper(this, [llmemory.Address], lltype.Void) + self.static_deallocator_funcptrs[TYPE] = fptr + for p in find_gc_ptrs_in_type(TYPE): + self.static_deallocation_funcptr_for_type(p.TO) + return fptr + + def dynamic_deallocation_funcptr_for_type(self, TYPE): + if TYPE in self.dynamic_deallocator_funcptrs: + return self.dynamic_deallocator_funcptrs[TYPE] + #print_call_chain(self) + + rtti = get_rtti(TYPE) + if rtti is None: + p = self.static_deallocation_funcptr_for_type(TYPE) + self.dynamic_deallocator_funcptrs[TYPE] = p + return p + + queryptr = rtti._obj.query_funcptr + if queryptr._obj in self.queryptr2dynamic_deallocator_funcptr: + return self.queryptr2dynamic_deallocator_funcptr[queryptr._obj] + + RTTI_PTR = lltype.Ptr(lltype.RuntimeTypeInfo) + QUERY_ARG_TYPE = lltype.typeOf(queryptr).TO.ARGS[0] + gc_header_offset = self.gcheaderbuilder.size_gc_header + HDRPTR = lltype.Ptr(self.HDR) + def ll_dealloc(addr): + # bump refcount to 1 + gcheader = llmemory.cast_adr_to_ptr(addr - gc_header_offset, HDRPTR) + gcheader.refcount = 1 + v = llmemory.cast_adr_to_ptr(addr, QUERY_ARG_TYPE) + rtti = queryptr(v) + gcheader.refcount = 0 + llop.gc_call_rtti_destructor(lltype.Void, rtti, addr) + fptr = self.annotate_helper(ll_dealloc, [llmemory.Address], lltype.Void) + self.dynamic_deallocator_funcptrs[TYPE] = fptr + self.queryptr2dynamic_deallocator_funcptr[queryptr._obj] = fptr + return fptr + + Added: pypy/dist/pypy/rpython/memory/gctransform2/support.py ============================================================================== --- (empty file) +++ pypy/dist/pypy/rpython/memory/gctransform2/support.py Tue Oct 3 19:46:43 2006 @@ -0,0 +1,31 @@ +from pypy.rpython.lltypesystem import lltype + +def var_ispyobj(var): + if hasattr(var, 'concretetype'): + if isinstance(var.concretetype, lltype.Ptr): + return var.concretetype.TO._gckind == 'cpy' + else: + return False + else: + # assume PyObjPtr + return True + +PyObjPtr = lltype.Ptr(lltype.PyObject) + +def find_gc_ptrs_in_type(TYPE): + if isinstance(TYPE, lltype.Array): + return find_gc_ptrs_in_type(TYPE.OF) + elif isinstance(TYPE, lltype.Struct): + result = [] + for name in TYPE._names: + result.extend(find_gc_ptrs_in_type(TYPE._flds[name])) + return result + elif isinstance(TYPE, lltype.Ptr) and TYPE._needsgc(): + return [TYPE] + elif isinstance(TYPE, lltype.GcOpaqueType): + # heuristic: in theory the same problem exists with OpaqueType, but + # we use OpaqueType for other things too that we know are safely + # empty of further gc pointers + raise Exception("don't know what is in %r" % (TYPE,)) + else: + return [] Added: pypy/dist/pypy/rpython/memory/gctransform2/test/__init__.py ============================================================================== --- (empty file) +++ pypy/dist/pypy/rpython/memory/gctransform2/test/__init__.py Tue Oct 3 19:46:43 2006 @@ -0,0 +1 @@ +# Added: pypy/dist/pypy/rpython/memory/gctransform2/test/test_refcounting.py ============================================================================== --- (empty file) +++ pypy/dist/pypy/rpython/memory/gctransform2/test/test_refcounting.py Tue Oct 3 19:46:43 2006 @@ -0,0 +1,121 @@ +from pypy.rpython.memory.gctransform2.test.test_transform import rtype +from pypy.rpython.memory.gctransform2.refcounting import RefcountingGCTransformer +from pypy.translator.c.database import LowLevelDatabase +from pypy.translator.c.gc import RefcountingGcPolicy +from pypy import conftest + +class RefcountingGcPolicy2(RefcountingGcPolicy): + transformerclass = RefcountingGCTransformer + +def llinterpreter_for_refcounted_graph(f, args_s): + from pypy.rpython.llinterp import LLInterpreter + from pypy.translator.c.genc import CStandaloneBuilder + from pypy.translator.c import gc + + t = rtype(f, args_s) + cbuild = CStandaloneBuilder(t, f, RefcountingGcPolicy2) + db = cbuild.generate_graphs_for_llinterp() + graph = cbuild.getentrypointptr()._obj.graph + llinterp = LLInterpreter(t.rtyper) + if conftest.option.view: + t.view() + return llinterp, graph + res = llinterp.eval_graph(graph, [0]) + assert res == f(0) + res = llinterp.eval_graph(graph, [1]) + assert res == f(1) + + +def test_llinterp_refcounted_graph(): + from pypy.annotation.model import SomeInteger + + class C: + pass + c = C() + c.x = 1 + def g(x): + if x: + return c + else: + d = C() + d.x = 2 + return d + def f(x): + return g(x).x + + llinterp, graph = llinterpreter_for_refcounted_graph(f, [SomeInteger()]) + + res = llinterp.eval_graph(graph, [0]) + assert res == f(0) + res = llinterp.eval_graph(graph, [1]) + assert res == f(1) + +def test_llinterp_refcounted_graph_varsize(): + from pypy.annotation.model import SomeInteger + + def f(x): + r = [] + for i in range(x): + if i % 2: + r.append(x) + return len(r) + + + llinterp, graph = llinterpreter_for_refcounted_graph(f, [SomeInteger()]) + + res = llinterp.eval_graph(graph, [0]) + assert res == f(0) + res = llinterp.eval_graph(graph, [10]) + assert res == f(10) + +def test_llinterp_refcounted_graph_str(): + from pypy.annotation.model import SomeString + from pypy.rpython.lltypesystem.rstr import string_repr + + def f(x): + return len(x + 'a') + + + llinterp, graph = llinterpreter_for_refcounted_graph(f, [SomeString()]) + + cc = string_repr.convert_const + + res = llinterp.eval_graph(graph, [cc('a')]) + assert res == f('a') + res = llinterp.eval_graph(graph, [cc('brrrrrr')]) + assert res == f('brrrrrr') + +def test_llinterp_refcounted_graph_with_del(): + from pypy.annotation.model import SomeInteger + + class D: + pass + + delcounter = D() + delcounter.dels = 0 + + class C: + def __del__(self): + delcounter.dels += 1 + c = C() + c.x = 1 + def h(x): + if x: + return c + else: + d = C() + d.x = 2 + return d + def g(x): + return h(x).x + def f(x): + r = g(x) + return r + delcounter.dels + + llinterp, graph = llinterpreter_for_refcounted_graph(f, [SomeInteger()]) + + res = llinterp.eval_graph(graph, [1]) + assert res == 1 + res = llinterp.eval_graph(graph, [0]) + assert res == 3 + Added: pypy/dist/pypy/rpython/memory/gctransform2/test/test_transform.py ============================================================================== --- (empty file) +++ pypy/dist/pypy/rpython/memory/gctransform2/test/test_transform.py Tue Oct 3 19:46:43 2006 @@ -0,0 +1,209 @@ +from pypy.rpython.memory.gctransform2.transform import GCTransformer +from pypy.objspace.flow.model import c_last_exception, Variable +from pypy.rpython.memory.gctransform import var_needsgc, var_ispyobj +from pypy.translator.translator import TranslationContext, graphof +from pypy.translator.c.exceptiontransform import ExceptionTransformer +from pypy.rpython.lltypesystem import lltype +from pypy.objspace.flow.model import Variable +from pypy.annotation import model as annmodel +from pypy.rpython.extregistry import ExtRegistryEntry +from pypy import conftest + +class _TestGCTransformer(GCTransformer): + + def push_alive_nopyobj(self, var): + self.llops.genop("gc_push_alive", [var]) + + def pop_alive_nopyobj(self, var): + self.llops.genop("gc_pop_alive", [var]) + + +def checkblock(block, is_borrowed): + if block.operations == (): + # a return/exception block -- don't want to think about them + # (even though the test passes for somewhat accidental reasons) + return + if block.isstartblock: + refs_in = 0 + else: + refs_in = len([v for v in block.inputargs if isinstance(v, Variable) + and var_needsgc(v) + and not is_borrowed(v)]) + push_alives = len([op for op in block.operations + if op.opname == 'gc_push_alive']) + pyobj_push_alives = len([op for op in block.operations + if op.opname == 'gc_push_alive_pyobj']) + + # implicit_pyobj_pushalives included calls to things that return pyobject* + implicit_pyobj_pushalives = len([op for op in block.operations + if var_ispyobj(op.result) + and op.opname not in ('bare_getfield', 'bare_getarrayitem', 'same_as')]) + nonpyobj_gc_returning_calls = len([op for op in block.operations + if op.opname in ('direct_call', 'indirect_call') + and var_needsgc(op.result) + and not var_ispyobj(op.result)]) + + pop_alives = len([op for op in block.operations + if op.opname == 'gc_pop_alive']) + pyobj_pop_alives = len([op for op in block.operations + if op.opname == 'gc_pop_alive_pyobj']) + if pop_alives == len(block.operations): + # it's a block we inserted + return + for link in block.exits: + assert block.exitswitch is not c_last_exception + refs_out = 0 + for v2 in link.target.inputargs: + if var_needsgc(v2) and not is_borrowed(v2): + refs_out += 1 + pyobj_pushes = pyobj_push_alives + implicit_pyobj_pushalives + nonpyobj_pushes = push_alives + nonpyobj_gc_returning_calls + assert refs_in + pyobj_pushes + nonpyobj_pushes == pop_alives + pyobj_pop_alives + refs_out + +def rtype(func, inputtypes, specialize=True): + t = TranslationContext() + t.buildannotator().build_types(func, inputtypes) + if specialize: + t.buildrtyper().specialize() + return t + +def rtype_and_transform(func, inputtypes, transformcls, specialize=True, check=True): + t = rtype(func, inputtypes, specialize) + transformer = transformcls(t) + etrafo = ExceptionTransformer(t) + etrafo.transform_completely() + graphs_borrowed = {} + for graph in t.graphs: + graphs_borrowed[graph] = transformer.transform_graph(graph) + if conftest.option.view: + t.view() + t.checkgraphs() + if check: + for graph, is_borrowed in graphs_borrowed.iteritems(): + for block in graph.iterblocks(): + checkblock(block, is_borrowed) + return t, transformer + +def getops(graph): + ops = {} + for block in graph.iterblocks(): + for op in block.operations: + ops.setdefault(op.opname, []).append(op) + return ops + +def test_simple(): + def f(): + return 1 + rtype_and_transform(f, [], _TestGCTransformer) + +def test_fairly_simple(): + class C: + pass + def f(): + c = C() + c.x = 1 + return c.x + t, transformer = rtype_and_transform(f, [], _TestGCTransformer) + +def test_return_gcpointer(): + class C: + pass + def f(): + c = C() + c.x = 1 + return c + t, transformer = rtype_and_transform(f, [], _TestGCTransformer) + +def test_call_function(): + class C: + pass + def f(): + c = C() + c.x = 1 + return c + def g(): + return f().x + t, transformer = rtype_and_transform(g, [], _TestGCTransformer) + ggraph = graphof(t, g) + for i, op in enumerate(ggraph.startblock.operations): + if op.opname == "direct_call": + break + else: + assert False, "direct_call not found!" + assert ggraph.startblock.operations[i + 1].opname != 'gc_push_alive' + + +def test_multiply_passed_var(): + S = lltype.GcStruct("S", ('x', lltype.Signed)) + def f(x): + if x: + a = lltype.malloc(S) + a.x = 1 + b = a + else: + a = lltype.malloc(S) + a.x = 1 + b = lltype.malloc(S) + b.x = 2 + return a.x + b.x + t, transformer = rtype_and_transform(f, [int], _TestGCTransformer) + +def test_pyobj(): + def f(x): + if x: + a = 1 + else: + a = "1" + return int(a) + t, transformer = rtype_and_transform(f, [int], _TestGCTransformer) + fgraph = graphof(t, f) + gcops = [op for op in fgraph.startblock.exits[0].target.operations + if op.opname.startswith("gc_")] + for op in gcops: + assert op.opname.endswith("_pyobj") + +def test_call_return_pyobj(): + def g(factory): + return factory() + def f(factory): + g(factory) + t, transformer = rtype_and_transform(f, [object], _TestGCTransformer) + fgraph = graphof(t, f) + ops = getops(fgraph) + calls = ops['direct_call'] + for call in calls: + if call.result.concretetype is not lltype.Bool: #RPyExceptionOccurred() + assert var_ispyobj(call.result) + +def test_getfield_pyobj(): + class S: + pass + def f(thing): + s = S() + s.x = thing + return s.x + t, transformer = rtype_and_transform(f, [object], _TestGCTransformer) + fgraph = graphof(t, f) + pyobj_getfields = 0 + pyobj_setfields = 0 + for b in fgraph.iterblocks(): + for op in b.operations: + if op.opname == 'bare_getfield' and var_ispyobj(op.result): + pyobj_getfields += 1 + elif op.opname == 'setfield' and var_ispyobj(op.args[2]): + pyobj_setfields += 1 + # although there's only one explicit getfield in the code, a + # setfield on a pyobj must get the old value out and decref it + assert pyobj_getfields >= 2 + assert pyobj_setfields >= 1 + +def test_pass_gc_pointer(): + S = lltype.GcStruct("S", ('x', lltype.Signed)) + def f(s): + s.x = 1 + def g(): + s = lltype.malloc(S) + f(s) + return s.x + t, transformer = rtype_and_transform(g, [], _TestGCTransformer) + Added: pypy/dist/pypy/rpython/memory/gctransform2/transform.py ============================================================================== --- (empty file) +++ pypy/dist/pypy/rpython/memory/gctransform2/transform.py Tue Oct 3 19:46:43 2006 @@ -0,0 +1,333 @@ +import py +from pypy.rpython.lltypesystem import lltype, llmemory +from pypy.objspace.flow.model import SpaceOperation, Variable, Constant, \ + c_last_exception, checkgraph +from pypy.translator.unsimplify import insert_empty_block +from pypy.translator.unsimplify import insert_empty_startblock +from pypy.translator.unsimplify import starts_with_empty_block +from pypy.translator.unsimplify import remove_empty_startblock +from pypy.translator.backendopt.support import var_needsgc +from pypy.translator.backendopt import inline +from pypy.translator.backendopt import graphanalyze +from pypy.translator.backendopt.canraise import RaiseAnalyzer +from pypy.translator.backendopt.ssa import DataFlowFamilyBuilder +from pypy.annotation import model as annmodel +from pypy.rpython import rmodel, annlowlevel +from pypy.rpython.memory import gc, lladdress +from pypy.rpython.annlowlevel import MixLevelHelperAnnotator +from pypy.rpython.rtyper import LowLevelOpList +from pypy.rpython.rbuiltin import gen_cast +from pypy.rpython.rarithmetic import ovfcheck +import sets, os, sys + +def var_ispyobj(var): + if hasattr(var, 'concretetype'): + if isinstance(var.concretetype, lltype.Ptr): + return var.concretetype.TO._gckind == 'cpy' + else: + return False + else: + # assume PyObjPtr + return True + +PyObjPtr = lltype.Ptr(lltype.PyObject) + +class GcHighLevelOp(object): + def __init__(self, gctransformer, op, llops): + self.gctransformer = gctransformer + self.spaceop = op + self.llops = llops + + def dispatch(self): + gct = self.gctransformer + opname = self.spaceop.opname + v_result = self.spaceop.result + + meth = getattr(gct, 'gct_' + opname, gct.default) + meth(self) + + if var_needsgc(v_result): + gct.livevars.append(v_result) + if var_ispyobj(v_result): + if opname in ('getfield', 'getarrayitem', 'same_as', + 'cast_pointer', 'getsubstruct'): + # XXX more operations? + gct.push_alive(v_result) + elif opname not in ('direct_call', 'indirect_call'): + gct.push_alive(v_result) + + def rename(self, newopname): + self.llops.append( + SpaceOperation(newopname, self.spaceop.args, self.spaceop.result)) + + def inputargs(self): + return self.spaceop.args + + def genop(self, opname, args, resulttype=None, resultvar=None): + assert resulttype is None or resultvar is None + if resultvar is None: + return self.llops.genop(opname, args, + resulttype=resulttype) + else: + newop = SpaceOperation(opname, args, resultvar) + self.llops.append(newop) + return resultvar + + def cast_result(self, var): + v_result = self.spaceop.result + resulttype = getattr(v_result, 'concretetype', PyObjPtr) + curtype = getattr(var, 'concretetype', PyObjPtr) + if curtype == resulttype: + self.genop('same_as', [var], resultvar=v_result) + else: + v_new = gen_cast(self.llops, resulttype, var) + assert v_new != var + self.llops[-1].result = v_result + + +class GCTransformer(object): + finished_helpers = False + + def __init__(self, translator, inline=False): + self.translator = translator + self.seen_graphs = {} + self.minimal_transform = {} + if translator: + self.mixlevelannotator = MixLevelHelperAnnotator(translator.rtyper) + else: + self.mixlevelannotator = None + self.inline = inline + if translator and inline: + self.lltype_to_classdef = translator.rtyper.lltype_to_classdef_mapping() + self.graphs_to_inline = {} + if self.MinimalGCTransformer: + self.minimalgctransformer = self.MinimalGCTransformer(self) + else: + self.minimalgctransformer = None + + def get_lltype_of_exception_value(self): + if self.translator is not None: + exceptiondata = self.translator.rtyper.getexceptiondata() + return exceptiondata.lltype_of_exception_value + else: + return lltype.Ptr(lltype.PyObject) + + def need_minimal_transform(self, graph): + self.seen_graphs[graph] = True + self.minimal_transform[graph] = True + + def inline_helpers(self, graph): + if self.inline: + raise_analyzer = RaiseAnalyzer(self.translator) + for inline_graph in self.graphs_to_inline: + try: + # XXX quite inefficient: we go over the function lots of times + inline.inline_function(self.translator, inline_graph, graph, + self.lltype_to_classdef, + raise_analyzer) + except inline.CannotInline, e: + print 'CANNOT INLINE:', e + print '\t%s into %s' % (inline_graph, graph) + checkgraph(graph) + + def compute_borrowed_vars(self, graph): + # the input args are borrowed, and stay borrowed for as long as they + # are not merged with other values. + var_families = DataFlowFamilyBuilder(graph).get_variable_families() + borrowed_reps = {} + for v in graph.getargs(): + borrowed_reps[var_families.find_rep(v)] = True + # no support for returning borrowed values so far + retvar = graph.getreturnvar() + + def is_borrowed(v1): + return (var_families.find_rep(v1) in borrowed_reps + and v1 is not retvar) + return is_borrowed + + def transform_block(self, block, is_borrowed): + self.llops = LowLevelOpList() + #self.curr_block = block + self.livevars = [var for var in block.inputargs + if var_needsgc(var) and not is_borrowed(var)] + for op in block.operations: + hop = GcHighLevelOp(self, op, self.llops) + hop.dispatch() + + if len(block.exits) != 0: # i.e not the return block + assert block.exitswitch is not c_last_exception + + deadinallexits = sets.Set(self.livevars) + for link in block.exits: + deadinallexits.difference_update(sets.Set(link.args)) + + for var in deadinallexits: + self.pop_alive(var) + + for link in block.exits: + livecounts = dict.fromkeys(sets.Set(self.livevars) - deadinallexits, 1) + for v, v2 in zip(link.args, link.target.inputargs): + if is_borrowed(v2): + continue + if v in livecounts: + livecounts[v] -= 1 + elif var_needsgc(v): + # 'v' is typically a Constant here, but it can be + # a borrowed variable going into a non-borrowed one + livecounts[v] = -1 + self.links_to_split[link] = livecounts + + block.operations[:] = self.llops + self.llops = None + self.livevars = None + + def transform_graph(self, graph): + if graph in self.minimal_transform: + if self.minimalgctransformer: + self.minimalgctransformer.transform_graph(graph) + del self.minimal_transform[graph] + return + if graph in self.seen_graphs: + return + self.seen_graphs[graph] = True + self.links_to_split = {} # link -> vars to pop_alive across the link + + # for sanity, we need an empty block at the start of the graph + if not starts_with_empty_block(graph): + insert_empty_startblock(self.translator.annotator, graph) + is_borrowed = self.compute_borrowed_vars(graph) + + for block in graph.iterblocks(): + self.transform_block(block, is_borrowed) + + for link, livecounts in self.links_to_split.iteritems(): + llops = LowLevelOpList() + for var, livecount in livecounts.iteritems(): + for i in range(livecount): + self.pop_alive(var, llops) + for i in range(-livecount): + self.push_alive(var, llops) + if llops: + if link.prevblock.exitswitch is None: + link.prevblock.operations.extend(self.llops) + else: + insert_empty_block(self.translator.annotator, link, llops) + + # remove the empty block at the start of the graph, which should + # still be empty (but let's check) + if starts_with_empty_block(graph): + remove_empty_startblock(graph) + + checkgraph(graph) + + self.links_to_split = None + v = Variable('vanishing_exc_value') + v.concretetype = self.get_lltype_of_exception_value() + llops = LowLevelOpList() + self.pop_alive(v, llops) + graph.exc_cleanup = (v, list(llops)) + return is_borrowed # xxx for tests only + + def annotate_helper(self, ll_helper, ll_args, ll_result, inline=False): + assert not self.finished_helpers + args_s = map(annmodel.lltype_to_annotation, ll_args) + s_result = annmodel.lltype_to_annotation(ll_result) + graph = self.mixlevelannotator.getgraph(ll_helper, args_s, s_result) + # the produced graphs does not need to be fully transformed + self.need_minimal_transform(graph) + if inline: + self.graphs_to_inline[graph] = True + return self.mixlevelannotator.graph2delayed(graph) + + def inittime_helper(self, ll_helper, ll_args, ll_result): + ptr = self.annotate_helper(ll_helper, ll_args, ll_result, inline=True) + return Constant(ptr, lltype.typeOf(ptr)) + + def finish_helpers(self): + if self.translator is not None: + self.mixlevelannotator.finish_annotate() + self.finished_helpers = True + if self.translator is not None: + self.mixlevelannotator.finish_rtype() + + def finish_tables(self): + pass + + def finish(self): + self.finish_helpers() + self.finish_tables() + + def transform_generic_set(self, hop): + v_new = hop.spaceop.args[-1] + v_old = hop.genop('bare_g' + hop.spaceop.opname[1:], + hop.inputargs()[:-1], + resulttype=v_new.concretetype) + self.push_alive(v_new) + hop.llops.append(hop.spaceop) + self.pop_alive(v_old) + + + def push_alive(self, var, llops=None): + if llops is None: + llops = self.llops + if var_ispyobj(var): + self.push_alive_pyobj(var, llops) + else: + self.push_alive_nopyobj(var, llops) + + def pop_alive(self, var, llops=None): + if llops is None: + llops = self.llops + if var_ispyobj(var): + self.pop_alive_pyobj(var, llops) + else: + self.pop_alive_nopyobj(var, llops) + + def push_alive_pyobj(self, var, llops): + if hasattr(var, 'concretetype') and var.concretetype != PyObjPtr: + var = gen_cast(llops, PyObjPtr, var) + llops.genop("gc_push_alive_pyobj", [var]) + + def pop_alive_pyobj(self, var, llops): + if hasattr(var, 'concretetype') and var.concretetype != PyObjPtr: + var = gen_cast(llops, PyObjPtr, var) + llops.genop("gc_pop_alive_pyobj", [var]) + + def push_alive_nopyobj(self, var, llops): + pass + + def pop_alive_nopyobj(self, var, llops): + pass + + def var_needs_set_transform(self, var): + return var_ispyobj(var) + + def default(self, hop): + hop.llops.append(hop.spaceop) + + def gct_getfield(self, hop): + hop.rename('bare_' + hop.spaceop.opname) + + def gct_setfield(self, hop): + if self.var_needs_set_transform(hop.spaceop.args[-1]): + self.transform_generic_set(hop) + else: + self.default(hop) + gct_setarrayitem = gct_setfield + + def gct_safe_call(self, hop): + hop.rename("direct_call") + +class MinimalGCTransformer(GCTransformer): + def __init__(self, parenttransformer): + GCTransformer.__init__(self, parenttransformer.translator) + self.parenttransformer = parenttransformer + + def push_alive(self, var, llops=None): + pass + + def pop_alive(self, var, llops=None): + pass + +GCTransformer.MinimalGCTransformer = MinimalGCTransformer +MinimalGCTransformer.MinimalGCTransformer = None From arigo at codespeak.net Tue Oct 3 19:46:56 2006 From: arigo at codespeak.net (arigo at codespeak.net) Date: Tue, 3 Oct 2006 19:46:56 +0200 (CEST) Subject: [pypy-svn] r32858 - in pypy/dist/pypy: objspace/flow translator/tool Message-ID: <20061003174656.18F9B10077@code0.codespeak.net> Author: arigo Date: Tue Oct 3 19:42:44 2006 New Revision: 32858 Modified: pypy/dist/pypy/objspace/flow/model.py pypy/dist/pypy/translator/tool/graphpage.py pypy/dist/pypy/translator/tool/make_dot.py Log: (arre, arigo, pedronis not too far) Make graph display robust against broken graphs. Modified: pypy/dist/pypy/objspace/flow/model.py ============================================================================== --- pypy/dist/pypy/objspace/flow/model.py (original) +++ pypy/dist/pypy/objspace/flow/model.py Tue Oct 3 19:42:44 2006 @@ -702,3 +702,31 @@ if op.opname != 'same_as': insns[op.opname] = insns.get(op.opname, 0) + 1 return insns + +def safe_iterblocks(graph): + # for debugging or displaying broken graphs. + # You still have to check that the yielded blocks are really Blocks. + block = getattr(graph, 'startblock', None) + yield block + seen = {block: True} + stack = list(getattr(block, 'exits', [])[::-1]) + while stack: + block = stack.pop().target + if block not in seen: + yield block + seen[block] = True + stack += getattr(block, 'exits', [])[::-1] + +def safe_iterlinks(graph): + # for debugging or displaying broken graphs. + # You still have to check that the yielded links are really Links. + block = getattr(graph, 'startblock', None) + seen = {block: True} + stack = list(getattr(block, 'exits', [])[::-1]) + while stack: + link = stack.pop() + yield link + block = getattr(link, 'target', None) + if block not in seen: + seen[block] = True + stack += getattr(block, 'exits', [])[::-1] Modified: pypy/dist/pypy/translator/tool/graphpage.py ============================================================================== --- pypy/dist/pypy/translator/tool/graphpage.py (original) +++ pypy/dist/pypy/translator/tool/graphpage.py Tue Oct 3 19:42:44 2006 @@ -1,5 +1,6 @@ import inspect, types -from pypy.objspace.flow.model import traverse, Block, Link, FunctionGraph +from pypy.objspace.flow.model import Block, Link, FunctionGraph +from pypy.objspace.flow.model import safe_iterblocks, safe_iterlinks from pypy.translator.tool.make_dot import DotGen, make_dot, make_dot_graphs from pypy.annotation.model import SomePBC from pypy.annotation.description import MethodDesc @@ -150,24 +151,23 @@ if isinstance(self.annotator, HintAnnotator): return - def visit(node): - if isinstance(node, Block): - vars = node.getvariables() - elif isinstance(node, Link): - vars = node.getextravars() - else: - return - for var in vars: - if hasattr(var, 'concretetype'): - #info = self.links.get(var.name, var.name) - #info = '(%s) %s' % (var.concretetype, info) - info = str(var.concretetype) - if info == 'Void': # gray out Void variables - info = info, (160,160,160) - self.links[var.name] = info - - for graph in graphs: - traverse(visit, graph) + vars = {} + for block in safe_iterblocks(graph): + if isinstance(block, Block): + for v in block.getvariables(): + vars[v] = True + for link in safe_iterlinks(graph): + if isinstance(link, Link): + for v in link.getextravars(): + vars[v] = True + for var in vars: + if hasattr(var, 'concretetype'): + #info = self.links.get(var.name, var.name) + #info = '(%s) %s' % (var.concretetype, info) + info = str(var.concretetype) + if info == 'Void': # gray out Void variables + info = info, (160,160,160) + self.links[var.name] = info def followlink(self, varname): # clicking on a variable name shows its binding history Modified: pypy/dist/pypy/translator/tool/make_dot.py ============================================================================== --- pypy/dist/pypy/translator/tool/make_dot.py (original) +++ pypy/dist/pypy/translator/tool/make_dot.py Tue Oct 3 19:42:44 2006 @@ -87,7 +87,7 @@ self.prefix = name self.enter_subgraph(name) self.visit_FunctionGraph(node) - for block in node.iterblocks(): + for block in safe_iterblocks(node): self.visit_Block(block) self.leave_subgraph() @@ -121,6 +121,11 @@ def visit_Block(self, block): # do the block itself name = self.blockname(block) + if not isinstance(block, Block): + data = "BROKEN BLOCK\\n%r" % (block,) + self.emit_node(name, label=data) + return + lines = [] for op in block.operations: lines.extend(repr(op).split('\n')) From arigo at codespeak.net Tue Oct 3 20:17:35 2006 From: arigo at codespeak.net (arigo at codespeak.net) Date: Tue, 3 Oct 2006 20:17:35 +0200 (CEST) Subject: [pypy-svn] r32859 - pypy/dist/pypy/translator/tool Message-ID: <20061003181735.905F410063@code0.codespeak.net> Author: arigo Date: Tue Oct 3 20:17:33 2006 New Revision: 32859 Modified: pypy/dist/pypy/translator/tool/graphpage.py Log: Oups! Forgot to iterate over 'graphs'. Modified: pypy/dist/pypy/translator/tool/graphpage.py ============================================================================== --- pypy/dist/pypy/translator/tool/graphpage.py (original) +++ pypy/dist/pypy/translator/tool/graphpage.py Tue Oct 3 20:17:33 2006 @@ -152,14 +152,15 @@ return vars = {} - for block in safe_iterblocks(graph): - if isinstance(block, Block): - for v in block.getvariables(): - vars[v] = True - for link in safe_iterlinks(graph): - if isinstance(link, Link): - for v in link.getextravars(): - vars[v] = True + for graph in graphs: + for block in safe_iterblocks(graph): + if isinstance(block, Block): + for v in block.getvariables(): + vars[v] = True + for link in safe_iterlinks(graph): + if isinstance(link, Link): + for v in link.getextravars(): + vars[v] = True for var in vars: if hasattr(var, 'concretetype'): #info = self.links.get(var.name, var.name) From ac at codespeak.net Wed Oct 4 11:24:26 2006 From: ac at codespeak.net (ac at codespeak.net) Date: Wed, 4 Oct 2006 11:24:26 +0200 (CEST) Subject: [pypy-svn] r32861 - pypy/dist/pypy/module/_codecs/test Message-ID: <20061004092426.0388510077@code0.codespeak.net> Author: ac Date: Wed Oct 4 11:24:24 2006 New Revision: 32861 Modified: pypy/dist/pypy/module/_codecs/test/test_codecs.py Log: Use our unicodedata module for the tests. Modified: pypy/dist/pypy/module/_codecs/test/test_codecs.py ============================================================================== --- pypy/dist/pypy/module/_codecs/test/test_codecs.py (original) +++ pypy/dist/pypy/module/_codecs/test/test_codecs.py Wed Oct 4 11:24:24 2006 @@ -1,7 +1,10 @@ import autopath -from pypy.objspace.std import StdObjSpace +from pypy.conftest import gettestobjspace class AppTestCodecs: + def setup_class(cls): + space = gettestobjspace(usemodules=('unicodedata',)) + cls.space = space def test_bigU_codecs(self): import sys From mwh at codespeak.net Wed Oct 4 13:21:11 2006 From: mwh at codespeak.net (mwh at codespeak.net) Date: Wed, 4 Oct 2006 13:21:11 +0200 (CEST) Subject: [pypy-svn] r32863 - in pypy/dist/pypy/rpython/memory/gctransform2: . test Message-ID: <20061004112111.ED2E210082@code0.codespeak.net> Author: mwh Date: Wed Oct 4 13:21:10 2006 New Revision: 32863 Modified: pypy/dist/pypy/rpython/memory/gctransform2/refcounting.py pypy/dist/pypy/rpython/memory/gctransform2/support.py pypy/dist/pypy/rpython/memory/gctransform2/test/test_refcounting.py pypy/dist/pypy/rpython/memory/gctransform2/test/test_transform.py pypy/dist/pypy/rpython/memory/gctransform2/transform.py Log: add boehm to the gctransform2 package. fix tests. Modified: pypy/dist/pypy/rpython/memory/gctransform2/refcounting.py ============================================================================== --- pypy/dist/pypy/rpython/memory/gctransform2/refcounting.py (original) +++ pypy/dist/pypy/rpython/memory/gctransform2/refcounting.py Wed Oct 4 13:21:10 2006 @@ -1,6 +1,7 @@ import py from pypy.rpython.memory.gctransform2.transform import GCTransformer -from pypy.rpython.memory.gctransform2.support import find_gc_ptrs_in_type +from pypy.rpython.memory.gctransform2.support import find_gc_ptrs_in_type, \ + get_rtti, _static_deallocator_body_for_type, LLTransformerOp, ll_call_destructor from pypy.rpython.lltypesystem import lltype, llmemory from pypy.rpython.lltypesystem.lloperation import llop from pypy.translator.backendopt.support import var_needsgc @@ -9,63 +10,8 @@ from pypy.rpython.memory.gcheader import GCHeaderBuilder #from pypy.rpython.extregistry import ExtRegistryEntry from pypy.rpython.rarithmetic import ovfcheck -from pypy.rpython.extregistry import ExtRegistryEntry -from pypy.annotation import model as annmodel from pypy.rpython.rbuiltin import gen_cast -import os, sys - - -class LLTransformerOp(object): - """Objects that can be called in ll functions. - Their calls are replaced by a simple operation of the GC transformer, - e.g. ll_pop_alive. - """ - def __init__(self, transformer_method): - self.transformer_method = transformer_method - -class LLTransformerOpEntry(ExtRegistryEntry): - "Annotation and specialization of LLTransformerOp() instances." - _type_ = LLTransformerOp - - def compute_result_annotation(self, s_arg): - return annmodel.s_None - - def specialize_call(self, hop): - op = self.instance # the LLTransformerOp instance - op.transformer_method(hop.args_v[0], hop.llops) - hop.exception_cannot_occur() - return hop.inputconst(hop.r_result.lowleveltype, hop.s_result.const) - -def ll_call_destructor(destrptr, destr_v): - try: - destrptr(destr_v) - except: - try: - os.write(2, "a destructor raised an exception, ignoring it\n") - except: - pass - -def _static_deallocator_body_for_type(v, TYPE, depth=1): - if isinstance(TYPE, lltype.Array): - inner = list(_static_deallocator_body_for_type('v_%i'%depth, TYPE.OF, depth+1)) - if inner: - yield ' '*depth + 'i_%d = 0'%(depth,) - yield ' '*depth + 'l_%d = len(%s)'%(depth, v) - yield ' '*depth + 'while i_%d < l_%d:'%(depth, depth) - yield ' '*depth + ' v_%d = %s[i_%d]'%(depth, v, depth) - for line in inner: - yield line - yield ' '*depth + ' i_%d += 1'%(depth,) - elif isinstance(TYPE, lltype.Struct): - for name in TYPE._names: - inner = list(_static_deallocator_body_for_type( - v + '_' + name, TYPE._flds[name], depth)) - if inner: - yield ' '*depth + v + '_' + name + ' = ' + v + '.' + name - for line in inner: - yield line - elif isinstance(TYPE, lltype.Ptr) and TYPE._needsgc(): - yield ' '*depth + 'pop_alive(%s)'%v +import sys counts = {} @@ -88,14 +34,6 @@ ADDRESS_VOID_FUNC = lltype.FuncType([llmemory.Address], lltype.Void) -def get_rtti(TYPE): - if isinstance(TYPE, lltype.RttiStruct): - try: - return lltype.getRuntimeTypeInfo(TYPE) - except ValueError: - pass - return None - class RefcountingGCTransformer(GCTransformer): HDR = lltype.Struct("header", ("refcount", lltype.Signed)) Modified: pypy/dist/pypy/rpython/memory/gctransform2/support.py ============================================================================== --- pypy/dist/pypy/rpython/memory/gctransform2/support.py (original) +++ pypy/dist/pypy/rpython/memory/gctransform2/support.py Wed Oct 4 13:21:10 2006 @@ -1,4 +1,7 @@ from pypy.rpython.lltypesystem import lltype +from pypy.rpython.extregistry import ExtRegistryEntry +from pypy.annotation import model as annmodel +import os def var_ispyobj(var): if hasattr(var, 'concretetype'): @@ -29,3 +32,77 @@ raise Exception("don't know what is in %r" % (TYPE,)) else: return [] + +def type_contains_pyobjs(TYPE): + if isinstance(TYPE, lltype.Array): + return type_contains_pyobjs(TYPE.OF) + elif isinstance(TYPE, lltype.Struct): + result = [] + for name in TYPE._names: + if type_contains_pyobjs(TYPE._flds[name]): + return True + return False + elif isinstance(TYPE, lltype.Ptr) and TYPE.TO._gckind == 'cpy': + return True + else: + return False + +def get_rtti(TYPE): + if isinstance(TYPE, lltype.RttiStruct): + try: + return lltype.getRuntimeTypeInfo(TYPE) + except ValueError: + pass + return None + +def _static_deallocator_body_for_type(v, TYPE, depth=1): + if isinstance(TYPE, lltype.Array): + inner = list(_static_deallocator_body_for_type('v_%i'%depth, TYPE.OF, depth+1)) + if inner: + yield ' '*depth + 'i_%d = 0'%(depth,) + yield ' '*depth + 'l_%d = len(%s)'%(depth, v) + yield ' '*depth + 'while i_%d < l_%d:'%(depth, depth) + yield ' '*depth + ' v_%d = %s[i_%d]'%(depth, v, depth) + for line in inner: + yield line + yield ' '*depth + ' i_%d += 1'%(depth,) + elif isinstance(TYPE, lltype.Struct): + for name in TYPE._names: + inner = list(_static_deallocator_body_for_type( + v + '_' + name, TYPE._flds[name], depth)) + if inner: + yield ' '*depth + v + '_' + name + ' = ' + v + '.' + name + for line in inner: + yield line + elif isinstance(TYPE, lltype.Ptr) and TYPE._needsgc(): + yield ' '*depth + 'pop_alive(%s)'%v + +class LLTransformerOp(object): + """Objects that can be called in ll functions. + Their calls are replaced by a simple operation of the GC transformer, + e.g. ll_pop_alive. + """ + def __init__(self, transformer_method): + self.transformer_method = transformer_method + +class LLTransformerOpEntry(ExtRegistryEntry): + "Annotation and specialization of LLTransformerOp() instances." + _type_ = LLTransformerOp + + def compute_result_annotation(self, s_arg): + return annmodel.s_None + + def specialize_call(self, hop): + op = self.instance # the LLTransformerOp instance + op.transformer_method(hop.args_v[0], hop.llops) + hop.exception_cannot_occur() + return hop.inputconst(hop.r_result.lowleveltype, hop.s_result.const) + +def ll_call_destructor(destrptr, destr_v): + try: + destrptr(destr_v) + except: + try: + os.write(2, "a destructor raised an exception, ignoring it\n") + except: + pass Modified: pypy/dist/pypy/rpython/memory/gctransform2/test/test_refcounting.py ============================================================================== --- pypy/dist/pypy/rpython/memory/gctransform2/test/test_refcounting.py (original) +++ pypy/dist/pypy/rpython/memory/gctransform2/test/test_refcounting.py Wed Oct 4 13:21:10 2006 @@ -1,7 +1,8 @@ -from pypy.rpython.memory.gctransform2.test.test_transform import rtype +from pypy.rpython.memory.gctransform2.test.test_transform import rtype, rtype_and_transform, getops from pypy.rpython.memory.gctransform2.refcounting import RefcountingGCTransformer -from pypy.translator.c.database import LowLevelDatabase +from pypy.rpython.lltypesystem import lltype from pypy.translator.c.gc import RefcountingGcPolicy +from pypy.translator.translator import TranslationContext, graphof from pypy import conftest class RefcountingGcPolicy2(RefcountingGcPolicy): @@ -119,3 +120,176 @@ res = llinterp.eval_graph(graph, [0]) assert res == 3 +def make_deallocator(TYPE, + attr="static_deallocation_funcptr_for_type", + cls=RefcountingGCTransformer): + if TYPE._is_varsize(): + def f(): + return lltype.malloc(TYPE, 1) + else: + def f(): + return lltype.malloc(TYPE) + t = TranslationContext() + t.buildannotator().build_types(f, []) + t.buildrtyper().specialize() + transformer = cls(t) + fptr = getattr(transformer, attr)(TYPE) + transformer.transform_graph(graphof(t, f)) + transformer.finish() + if conftest.option.view: + t.view() + if fptr: + return fptr._obj.graph, t + else: + return None, t + +def test_deallocator_simple(): + S = lltype.GcStruct("S", ('x', lltype.Signed)) + dgraph, t = make_deallocator(S) + ops = [] + for block in dgraph.iterblocks(): + ops.extend([op for op in block.operations if op.opname != 'same_as']) # XXX + assert len(ops) == 1 + op = ops[0] + assert op.opname == 'gc_free' + +def test_deallocator_less_simple(): + TPtr = lltype.Ptr(lltype.GcStruct("T", ('a', lltype.Signed))) + S = lltype.GcStruct( + "S", + ('x', lltype.Signed), + ('y', TPtr), + ('z', TPtr), + ) + dgraph, t = make_deallocator(S) + ops = getops(dgraph) + assert len(ops['direct_call']) == 2 + assert len(ops['getfield']) == 2 + assert len(ops['gc_free']) == 1 + +def test_deallocator_array(): + TPtr = lltype.Ptr(lltype.GcStruct("T", ('a', lltype.Signed))) + GcA = lltype.GcArray(('x', TPtr), ('y', TPtr)) + A = lltype.Array(('x', TPtr), ('y', TPtr)) + APtr = lltype.Ptr(GcA) + S = lltype.GcStruct('S', ('t', TPtr), ('x', lltype.Signed), ('aptr', APtr), + ('rest', A)) + dgraph, t = make_deallocator(S) + ops = getops(dgraph) + assert len(ops['direct_call']) == 4 + assert len(ops['getfield']) == 4 + assert len(ops['getarraysubstruct']) == 1 + assert len(ops['gc_free']) == 1 + +def test_deallocator_with_destructor(): + S = lltype.GcStruct("S", ('x', lltype.Signed)) + def f(s): + s.x = 1 + def type_info_S(p): + return lltype.getRuntimeTypeInfo(S) + qp = lltype.functionptr(lltype.FuncType([lltype.Ptr(S)], + lltype.Ptr(lltype.RuntimeTypeInfo)), + "type_info_S", + _callable=type_info_S) + dp = lltype.functionptr(lltype.FuncType([lltype.Ptr(S)], + lltype.Void), + "destructor_funcptr", + _callable=f) + pinf = lltype.attachRuntimeTypeInfo(S, qp, destrptr=dp) + graph, t = make_deallocator(S) + +def test_caching_dynamic_deallocator(): + S = lltype.GcStruct("S", ('x', lltype.Signed)) + S1 = lltype.GcStruct("S1", ('s', S), ('y', lltype.Signed)) + T = lltype.GcStruct("T", ('x', lltype.Signed)) + def f_S(s): + s.x = 1 + def f_S1(s1): + s1.s.x = 1 + s1.y = 2 + def f_T(s): + s.x = 1 + def type_info_S(p): + return lltype.getRuntimeTypeInfo(S) + def type_info_T(p): + return lltype.getRuntimeTypeInfo(T) + qp = lltype.functionptr(lltype.FuncType([lltype.Ptr(S)], + lltype.Ptr(lltype.RuntimeTypeInfo)), + "type_info_S", + _callable=type_info_S) + dp = lltype.functionptr(lltype.FuncType([lltype.Ptr(S)], + lltype.Void), + "destructor_funcptr", + _callable=f_S) + pinf = lltype.attachRuntimeTypeInfo(S, qp, destrptr=dp) + dp = lltype.functionptr(lltype.FuncType([lltype.Ptr(S)], + lltype.Void), + "destructor_funcptr", + _callable=f_S1) + pinf = lltype.attachRuntimeTypeInfo(S1, qp, destrptr=dp) + qp = lltype.functionptr(lltype.FuncType([lltype.Ptr(T)], + lltype.Ptr(lltype.RuntimeTypeInfo)), + "type_info_S", + _callable=type_info_T) + dp = lltype.functionptr(lltype.FuncType([lltype.Ptr(T)], + lltype.Void), + "destructor_funcptr", + _callable=f_T) + pinf = lltype.attachRuntimeTypeInfo(T, qp, destrptr=dp) + def f(): + pass + t = TranslationContext() + t.buildannotator().build_types(f, []) + t.buildrtyper().specialize() + transformer = RefcountingGCTransformer(t) + p_S = transformer.dynamic_deallocation_funcptr_for_type(S) + p_S1 = transformer.dynamic_deallocation_funcptr_for_type(S1) + p_T = transformer.dynamic_deallocation_funcptr_for_type(T) + assert p_S is not p_T + assert p_S is p_S1 + +def test_dynamic_deallocator(): + class A(object): + pass + class B(A): + pass + def f(x): + a = A() + a.x = 1 + b = B() + b.x = 2 + b.y = 3 + if x: + c = a + else: + c = b + return c.x + t, transformer = rtype_and_transform( + f, [int], RefcountingGCTransformer, check=False) + fgraph = graphof(t, f) + s_instance = t.annotator.bookkeeper.valueoftype(A) + TYPE = t.rtyper.getrepr(s_instance).lowleveltype.TO + p = transformer.dynamic_deallocation_funcptr_for_type(TYPE) + t.rtyper.specialize_more_blocks() + +def test_recursive_structure(): + F = lltype.GcForwardReference() + S = lltype.GcStruct('abc', ('x', lltype.Ptr(F))) + F.become(S) + def f(): + s1 = lltype.malloc(S) + s2 = lltype.malloc(S) + s1.x = s2 + t, transformer = rtype_and_transform( + f, [], RefcountingGCTransformer, check=False) + +def test_dont_decref_nongc_pointers(): + S = lltype.GcStruct('S', + ('x', lltype.Ptr(lltype.Struct('T', ('x', lltype.Signed)))), + ('y', lltype.Ptr(lltype.GcStruct('Y', ('x', lltype.Signed)))) + ) + def f(): + pass + graph, t = make_deallocator(S) + ops = getops(graph) + assert len(ops['direct_call']) == 1 Modified: pypy/dist/pypy/rpython/memory/gctransform2/test/test_transform.py ============================================================================== --- pypy/dist/pypy/rpython/memory/gctransform2/test/test_transform.py (original) +++ pypy/dist/pypy/rpython/memory/gctransform2/test/test_transform.py Wed Oct 4 13:21:10 2006 @@ -11,11 +11,11 @@ class _TestGCTransformer(GCTransformer): - def push_alive_nopyobj(self, var): - self.llops.genop("gc_push_alive", [var]) + def push_alive_nopyobj(self, var, llops): + llops.genop("gc_push_alive", [var]) - def pop_alive_nopyobj(self, var): - self.llops.genop("gc_pop_alive", [var]) + def pop_alive_nopyobj(self, var, llops): + llops.genop("gc_pop_alive", [var]) def checkblock(block, is_borrowed): Modified: pypy/dist/pypy/rpython/memory/gctransform2/transform.py ============================================================================== --- pypy/dist/pypy/rpython/memory/gctransform2/transform.py (original) +++ pypy/dist/pypy/rpython/memory/gctransform2/transform.py Wed Oct 4 13:21:10 2006 @@ -209,7 +209,7 @@ self.push_alive(var, llops) if llops: if link.prevblock.exitswitch is None: - link.prevblock.operations.extend(self.llops) + link.prevblock.operations.extend(llops) else: insert_empty_block(self.translator.annotator, link, llops) From ac at codespeak.net Wed Oct 4 13:30:21 2006 From: ac at codespeak.net (ac at codespeak.net) Date: Wed, 4 Oct 2006 13:30:21 +0200 (CEST) Subject: [pypy-svn] r32864 - pypy/dist/pypy/module/unicodedata Message-ID: <20061004113021.2C24A10087@code0.codespeak.net> Author: ac Date: Wed Oct 4 13:30:19 2006 New Revision: 32864 Modified: pypy/dist/pypy/module/unicodedata/generate_unicodedb.py pypy/dist/pypy/module/unicodedata/unicodedb_3_2_0.py pypy/dist/pypy/module/unicodedata/unicodedb_4_1_0.py pypy/dist/pypy/module/unicodedata/unicodedb_5_0_0.py Log: Oops, fix unicode.isnumeric() Modified: pypy/dist/pypy/module/unicodedata/generate_unicodedb.py ============================================================================== --- pypy/dist/pypy/module/unicodedata/generate_unicodedb.py (original) +++ pypy/dist/pypy/module/unicodedata/generate_unicodedb.py Wed Oct 4 13:30:19 2006 @@ -14,7 +14,9 @@ return repr(self) class Unicodechar: - def __init__(self, data): + def __init__(self, data=None): + if data is None: + return if not data[1] or data[1][0] == '<' and data[1][-1] == '>': self.name = None else: @@ -64,7 +66,11 @@ if data[14]: self.title = int(data[14], 16) - + def copy(self): + uc = Unicodechar() + uc.__dict__.update(self.__dict__) + return uc + def get_compat_decomposition(table, code): if not table[code].decomposition: return [code] @@ -85,7 +91,8 @@ table[code].canonical_decomp = result return table[code].canonical_decomp -def read_unicodedata(unicodedata_file, exclusions_file, east_asian_width_file): +def read_unicodedata(unicodedata_file, exclusions_file, east_asian_width_file, + unihan_file=None): rangeFirst = {} rangeLast = {} table = [None] * (MAXUNICODE + 1) @@ -151,6 +158,12 @@ if table[code] is None: table[code] = defaultChar + extra_numeric = read_unihan(unihan_file) + for code, value in extra_numeric.iteritems(): + uc = table[code].copy() + uc.numeric = value + table[code] = uc + # Compute full decompositions. for code in range(len(table)): get_canonical_decomposition(table, code) @@ -296,7 +309,7 @@ print >> outfile, 'def mirrored(code): return _get_record(code)[3] & %d != 0'% IS_MIRRORED print >> outfile, 'def combining(code): return _get_record(code)[4]' -def writeUnicodedata(version, table, outfile, extra_numeric): +def writeUnicodedata(version, table, outfile): # Version print >> outfile, 'version = %r' % version print >> outfile @@ -409,8 +422,6 @@ digit[code] = table[code].digit if table[code].numeric is not None: numeric[code] = table[code].numeric - if extra_numeric: - numeric.update(extra_numeric) writeDict(outfile, '_decimal', decimal) writeDict(outfile, '_digit', digit) @@ -531,10 +542,9 @@ if unidata_version is None: raise ValueError('No version specified') - table = read_unicodedata(infile, exclusions, east_asian_width) - extra_numeric = read_unihan(unihan) + table = read_unicodedata(infile, exclusions, east_asian_width, unihan) print >> outfile, '# UNICODE CHARACTER DATABASE' print >> outfile, '# This file was generated with the command:' print >> outfile, '# ', ' '.join(sys.argv) print >> outfile - writeUnicodedata(unidata_version, table, outfile, extra_numeric) + writeUnicodedata(unidata_version, table, outfile) Modified: pypy/dist/pypy/module/unicodedata/unicodedb_3_2_0.py ============================================================================== --- pypy/dist/pypy/module/unicodedata/unicodedb_3_2_0.py (original) +++ pypy/dist/pypy/module/unicodedata/unicodedb_3_2_0.py Wed Oct 4 13:30:19 2006 @@ -13909,6 +13909,7 @@ ('Lo', 'L', 'H', 2, 0), ('Lo', 'L', 'N', 2, 0), ('Lo', 'L', 'W', 2, 0), +('Lo', 'L', 'W', 66, 0), ('Lo', 'R', 'N', 2, 0), ('Lt', 'L', 'N', 18, 0), ('Lu', 'L', 'A', 10, 0), @@ -14103,17 +14104,17 @@ ] _db_pgtbl = ( '\x00\x01\x02\x03\x04\x05\x06\x07\x08\t\n\x0b\x0c\r\x0e\x0f\x10\x11\x12\x13\x14\x15\x16\x17\x18\x08\x08\x08\x08\x08\x19\x1a\x1b\x1c\x1d\x1e\x1f !"#$%\x08\x08\x08&\'()*+,,,,,,,,,,,,' -',,,,,,,,,,,,,-,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,' -',,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,.,,,,/\x08\x08\x08\x08\x08\x08\x08,,,,,,,,,,,,,,,,,,,,' -',,,,,,,,,,,,,,,,,,,,,,,0111111112222222222222222222222222,345678' -'\x08\x08\x089:\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08' +',,,,,,,,,,,,,-./,0,1,,234,,,,,56,,78,,,9,,,,,,,,,,,:,,;,,,,,,,,,' +'<,,,=,,,,,,,>?,,,,,,,,@,,,,,,,,A,,,,B\x08\x08\x08\x08\x08\x08\x08,,,,,,,,,,,,,,,,,,,,' +',,,,,,,,,,,,,,,,,,,,,,,CDDDDDDDDEEEEEEEEEEEEEEEEEEEEEEEEE,FGHIJK' +'\x08\x08\x08LM\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08' '\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08' '\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08' -'\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08;<\x08\x08=>?@\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08' +'\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08NO\x08\x08PQRS\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08' ',,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,' ',,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,' -',,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,A\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08' -'\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08,,B\x08\x08\x08\x08\x08' +',,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,T\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08' +'\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08,,U\x08\x08\x08\x08\x08' '\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08' '\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08' '\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08' @@ -14158,88 +14159,88 @@ '\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08' '\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08' '\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08' -'C\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08' +'V\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08' '\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08' '\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08' '\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08' -'2222222222222222222222222222222222222222222222222222222222222222' -'2222222222222222222222222222222222222222222222222222222222222222' -'2222222222222222222222222222222222222222222222222222222222222222' -'222222222222222222222222222222222222222222222222222222222222222D' -'2222222222222222222222222222222222222222222222222222222222222222' -'2222222222222222222222222222222222222222222222222222222222222222' -'2222222222222222222222222222222222222222222222222222222222222222' -'222222222222222222222222222222222222222222222222222222222222222D' +'EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE' +'EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE' +'EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE' +'EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEW' +'EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE' +'EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE' +'EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE' +'EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEW' ) _db_pages = ( -'\x01\x01\x01\x01\x01\x01\x01\x01\x01\x02\x00\x02\x03\x00\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x00\x00\x00\x02\xdb\xa3\xa3\x9c\xb2\x9c\xa3\xa3\xaa\x89\xa3\xbc\x95\x80\x95\x98gggggggggg\x95\xa3\xc7\xc6\xc7\xa3' -'\xa3""""""""""""""""""""""""""\xaa\xa3\x89\xb7}\xb7\x13\x13\x13\x13\x13\x13\x13\x13\x13\x13\x13\x13\x13\x13\x13\x13\x13\x13\x13\x13\x13\x13\x13\x13\x13\x13\xaa\xc6\x89\xc6\x01' -'\x01\x01\x01\x01\x01\x00\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\xd8\x9f\xb2\xb2\xae\xb2\xd3\xcf\xb4\xd2\x10\x90\xc6\x82\xcf\xb7\xca\xb9oo\xb4\x12\xcf\x9f\xb4o\x10\x8duuu\x9f' -'!!!!!!\x1f!!!!!!!!!\x1f!!!!!!\xbf\x1f!!!!!\x1f\x10\x10\x10\x12\x12\x12\x12\x10\x12\x10\x10\x10\x12\x10\x10\x12\x12\x10\x12\x10\x10\x12\x12\x12\xbf\x10\x10\x10\x12\x10\x12\x10\x12' -'!\x10!\x12!\x12!\x12!\x12!\x12!\x12!\x12!\x10!\x10!\x12!\x12!\x12!\x10!\x12!\x12!\x12!\x12!\x12\x1f\x10!\x12!\x10!\x12!\x12!\x10\x1f\x10!\x12!\x12\x10!\x12!\x12!\x12\x1f' -'\x10\x1f\x10!\x10!\x12!\x10\x10\x1f\x10!\x10!\x12!\x12\x1f\x10!\x12!\x12!\x12!\x12!\x12!\x12!\x12!\x12!\x12\x1f\x10!\x12!\x10!\x12!\x12!\x12!\x12!\x12!\x12!!\x12!\x12!\x12\x12' -'\x12!!\x12!\x12!!\x12!!!\x12\x12!!!!\x12!!\x12!!!\x12\x12\x12!!\x12!!\x12!\x12!\x12!!\x12!\x12\x12!\x12!!\x12!!!\x12!\x12!!\x12\x12\x1b!\x12\x12\x12' -'\x1b\x1b\x1b\x1b!\x1e\x12!\x1e\x12!\x1e\x12!\x10!\x10!\x10!\x10!\x10!\x10!\x10!\x10\x12!\x12!\x12!\x12!\x12!\x12!\x12!\x12!\x12!\x12\x12!\x1e\x12!\x12!!!\x12!\x12!\x12!\x12' -'!\x12!\x12!\x12!\x12!\x12!\x12!\x12!\x12!\x12!\x12!\x12!\x12!\x12!\x12!\x12!\x12!\r!\x12!\x12!\x12!\x12!\x12!\x12!\x12!\x12!\x12\r\r\r\r\r\r\r\r\r\r\r\r' +'\x01\x01\x01\x01\x01\x01\x01\x01\x01\x02\x00\x02\x03\x00\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x00\x00\x00\x02\xdc\xa4\xa4\x9d\xb3\x9d\xa4\xa4\xab\x8a\xa4\xbd\x96\x81\x96\x99hhhhhhhhhh\x96\xa4\xc8\xc7\xc8\xa4' +'\xa4##########################\xab\xa4\x8a\xb8~\xb8\x13\x13\x13\x13\x13\x13\x13\x13\x13\x13\x13\x13\x13\x13\x13\x13\x13\x13\x13\x13\x13\x13\x13\x13\x13\x13\xab\xc7\x8a\xc7\x01' +'\x01\x01\x01\x01\x01\x00\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\xd9\xa0\xb3\xb3\xaf\xb3\xd4\xd0\xb5\xd3\x10\x91\xc7\x83\xd0\xb8\xcb\xbapp\xb5\x12\xd0\xa0\xb5p\x10\x8evvv\xa0' +'"""""" """"""""" """"""\xc0 """"" \x10\x10\x10\x12\x12\x12\x12\x10\x12\x10\x10\x10\x12\x10\x10\x12\x12\x10\x12\x10\x10\x12\x12\x12\xc0\x10\x10\x10\x12\x10\x12\x10\x12' +'"\x10"\x12"\x12"\x12"\x12"\x12"\x12"\x12"\x10"\x10"\x12"\x12"\x12"\x10"\x12"\x12"\x12"\x12"\x12 \x10"\x12"\x10"\x12"\x12"\x10 \x10"\x12"\x12\x10"\x12"\x12"\x12 ' +'\x10 \x10"\x10"\x12"\x10\x10 \x10"\x10"\x12"\x12 \x10"\x12"\x12"\x12"\x12"\x12"\x12"\x12"\x12"\x12 \x10"\x12"\x10"\x12"\x12"\x12"\x12"\x12"\x12""\x12"\x12"\x12\x12' +'\x12""\x12"\x12""\x12"""\x12\x12""""\x12""\x12"""\x12\x12\x12""\x12""\x12"\x12"\x12""\x12"\x12\x12"\x12""\x12"""\x12"\x12""\x12\x12\x1b"\x12\x12\x12' +'\x1b\x1b\x1b\x1b"\x1f\x12"\x1f\x12"\x1f\x12"\x10"\x10"\x10"\x10"\x10"\x10"\x10"\x10\x12"\x12"\x12"\x12"\x12"\x12"\x12"\x12"\x12"\x12\x12"\x1f\x12"\x12"""\x12"\x12"\x12"\x12' +'"\x12"\x12"\x12"\x12"\x12"\x12"\x12"\x12"\x12"\x12"\x12"\x12"\x12"\x12"\x12"\x12"\r"\x12"\x12"\x12"\x12"\x12"\x12"\x12"\x12"\x12\r\r\r\r\r\r\r\r\r\r\r\r' '\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\x12\x10\x12\x12\x12\x12\x12\x12\x12\x12\x12\x12\x12\x12\x12\x12\x12\x10\x12\x12\x12\x12\x12\x12\x12\x12\x12\x12\x12\x12\x12\x12\x12\x12\x12\x12\x12\x12\x12\x12\x12\x12\x12\x12\x12\x12\x12\x12' -'\x12\x12\x12\x12\x12\x12\x12\x12\x12\x12\x12\x12\x12\x12\x12\x12\x12\x12\x12\x12\x12\x12\x12\x12\x12\x12\x12\x12\x12\x12\x12\x12\x12\x12\x12\x12\x12\x12\x12\x12\x12\x12\x12\x12\x12\x12\r\r\x17\x17\x17\x17\x17\x17\x17\x17\x17\xb6\xb6\x17\x17\x17\x17\x17' -'\x17\x17\xb6\xb6\xb4\xb6\xb6\xb4\xb6\xb4\xb4\xb4\xb6\xb4\xb6\xb6\x15\x17\xb6\xb6\xb6\xb6\xb6\xb6\xb4\xb4\xb4\xb4\xb6\xb4\xb6\xb4\x17\x17\x17\x17\x17\xb6\xb6\xb6\xb6\xb6\xb6\xb6\xb6\xb6\x17\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r' -',,,,,,,,,,,,,,,,,,,,,-++++-*+++++))++++))+++++++++++(((((++++,,,' -",,,,,0,+++,,,++'\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r//.,,,,,,,,,,,,,\r\r\r\r\xb6\xb6\r\r\r\r\x17\r\r\r\xa2\r" -'\r\r\r\r\xb6\xb6!\xa2!!!\r!\r!!\x12\x1f\x1f\x1f\x1f\x1f\x1f\x1f\x1f\x1f\x1f\x1f\x1f\x1f\x1f\x1f\x1f\x1f\r\x1f\x1f\x1f\x1f\x1f\x1f\x1f!!\x12\x12\x12\x12\x12\x10\x10\x10\x10\x10\x10\x10\x10\x10\x10\x10\x10\x10\x10\x10' -'\x10\x10\x12\x10\x10\x10\x10\x10\x10\x10\x12\x12\x12\x12\x12\r\x12\x12!!!\x12\x12\x12!\x12!\x12!\x12!\x12!\x12!\x12!\x12!\x12!\x12!\x12!\x12!\x12\x12\x12\x12\x12!\x12\xc4\r\r\r\r\r\r\r\r\r' -'!\x1f!!!!!!!!!!!!!!\x1f\x1f\x1f\x1f\x1f\x1f\x1f\x1f\x1f\x1f\x1f\x1f\x1f\x1f\x1f\x1f\x1f\x1f\x1f\x1f\x1f\x1f\x1f\x1f\x1f\x1f\x1f\x1f\x1f\x1f\x1f\x1f\x10\x10\x10\x10\x10\x10\x10\x10\x10\x10\x10\x10\x10\x10\x10\x10' -'\x10\x10\x10\x10\x10\x10\x10\x10\x10\x10\x10\x10\x10\x10\x10\x10\x12\x10\x12\x12\x12\x12\x12\x12\x12\x12\x12\x12\x12\x12\x12\x12!\x12!\x12!\x12!\x12!\x12!\x12!\x12!\x12!\x12!\x12!\x12!\x12!\x12!\x12!\x12!\x12' -'!\x12\xcd]]]]\r&&!\x12!\x12!\x12!\x12!\x12!\x12!\x12!\x12!\x12!\x12!\x12!\x12!\x12!\x12!\x12!\x12!\x12!\x12!\x12!\x12!\x12!\x12!\x12!\x12!\x12!\x12!\x12' -'!!\x12!\x12!\x12!\x12!\x12!\x12!\x12\r!\x12!\x12!\x12!\x12!\x12!\x12!\x12!\x12!\x12!\x12!\x12!\x12!\x12!\x12!\x12!\x12!\x12!\x12!\x12\r\r!\x12\r\r\r\r\r\r' -'!\x12!\x12!\x12!\x12!\x12!\x12!\x12!\x12\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r!!!!!!!!!!!!!!!' -'!!!!!!!!!!!!!!!!!!!!!!!\r\r\x17\x9e\x9e\x9e\x9e\x9e\x9e\r\x12\x12\x12\x12\x12\x12\x12\x12\x12\x12\x12\x12\x12\x12\x12\x12\x12\x12\x12\x12\x12\x12\x12\x12\x12\x12\x12\x12\x12\x12\x12' -'\x12\x12\x12\x12\x12\x12\x12\x12\r\x9e\x83\r\r\r\r\r\rZ]]]]Z]]][Z]]]]]]\rZZZZZ]]Z]][\\]56789:;<=>\r?@A\xa5B' -'\xa5CD\xa5]\r\r\r\r\r\r\r\r\r\r\r\x1d\x1d\x1d\x1d\x1d\x1d\x1d\x1d\x1d\x1d\x1d\x1d\x1d\x1d\x1d\x1d\x1d\x1d\x1d\x1d\x1d\x1d\x1d\x1d\x1d\x1d\x1d\r\r\r\r\r\x1d\x1d\x1d\xa5\xa5\r\r\r\r\r\r\r\r\r\r\r' -'\r\r\r\r\r\r\r\r\r\r\r\r\x94\r\r\r\r\r\r\r\r\r\r\r\r\r\r\x91\r\r\r\x91\r\x19\x19\x19\x19\x19\x19\x19\x19\x19\x19\x19\x19\x19\x19\x19\x19\x19\x19\x19\x19\x19\x19\x19\x19\x19\x19\r\r\r\r\r' -'\x14\x19\x19\x19\x19\x19\x19\x19\x19\x19\x19FGHIJKLM]]Z\r\r\r\r\r\r\r\r\r\rdddddddddd\x9b\x92\x92\x91\x19\x19N\x19\x19\x19\x19\x19\x19\x19\x19\x19\x19\x19\x19\x19\x19\x19' +'\x12\x12\x12\x12\x12\x12\x12\x12\x12\x12\x12\x12\x12\x12\x12\x12\x12\x12\x12\x12\x12\x12\x12\x12\x12\x12\x12\x12\x12\x12\x12\x12\x12\x12\x12\x12\x12\x12\x12\x12\x12\x12\x12\x12\x12\x12\r\r\x17\x17\x17\x17\x17\x17\x17\x17\x17\xb7\xb7\x17\x17\x17\x17\x17' +'\x17\x17\xb7\xb7\xb5\xb7\xb7\xb5\xb7\xb5\xb5\xb5\xb7\xb5\xb7\xb7\x15\x17\xb7\xb7\xb7\xb7\xb7\xb7\xb5\xb5\xb5\xb5\xb7\xb5\xb7\xb5\x17\x17\x17\x17\x17\xb7\xb7\xb7\xb7\xb7\xb7\xb7\xb7\xb7\x17\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r' +'---------------------.,,,,.+,,,,,**,,,,**,,,,,,,,,,,))))),,,,---' +'-----1-,,,---,,(\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r00/-------------\r\r\r\r\xb7\xb7\r\r\r\r\x17\r\r\r\xa3\r' +'\r\r\r\r\xb7\xb7"\xa3"""\r"\r""\x12 \r ""\x12\x12\x12\x12\x12\x10\x10\x10\x10\x10\x10\x10\x10\x10\x10\x10\x10\x10\x10\x10' +'\x10\x10\x12\x10\x10\x10\x10\x10\x10\x10\x12\x12\x12\x12\x12\r\x12\x12"""\x12\x12\x12"\x12"\x12"\x12"\x12"\x12"\x12"\x12"\x12"\x12"\x12"\x12"\x12\x12\x12\x12\x12"\x12\xc5\r\r\r\r\r\r\r\r\r' +'" """""""""""""" \x10\x10\x10\x10\x10\x10\x10\x10\x10\x10\x10\x10\x10\x10\x10\x10' +'\x10\x10\x10\x10\x10\x10\x10\x10\x10\x10\x10\x10\x10\x10\x10\x10\x12\x10\x12\x12\x12\x12\x12\x12\x12\x12\x12\x12\x12\x12\x12\x12"\x12"\x12"\x12"\x12"\x12"\x12"\x12"\x12"\x12"\x12"\x12"\x12"\x12"\x12"\x12"\x12' +'"\x12\xce^^^^\r\'\'"\x12"\x12"\x12"\x12"\x12"\x12"\x12"\x12"\x12"\x12"\x12"\x12"\x12"\x12"\x12"\x12"\x12"\x12"\x12"\x12"\x12"\x12"\x12"\x12"\x12"\x12"\x12' +'""\x12"\x12"\x12"\x12"\x12"\x12"\x12\r"\x12"\x12"\x12"\x12"\x12"\x12"\x12"\x12"\x12"\x12"\x12"\x12"\x12"\x12"\x12"\x12"\x12"\x12"\x12\r\r"\x12\r\r\r\r\r\r' +'"\x12"\x12"\x12"\x12"\x12"\x12"\x12"\x12\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r"""""""""""""""' +'"""""""""""""""""""""""\r\r\x17\x9f\x9f\x9f\x9f\x9f\x9f\r\x12\x12\x12\x12\x12\x12\x12\x12\x12\x12\x12\x12\x12\x12\x12\x12\x12\x12\x12\x12\x12\x12\x12\x12\x12\x12\x12\x12\x12\x12\x12' +'\x12\x12\x12\x12\x12\x12\x12\x12\r\x9f\x84\r\r\r\r\r\r[^^^^[^^^\\[^^^^^^\r[[[[[^^[^^\\]^6789:;<=>?\r at AB\xa6C' +'\xa6DE\xa6^\r\r\r\r\r\r\r\r\r\r\r\x1e\x1e\x1e\x1e\x1e\x1e\x1e\x1e\x1e\x1e\x1e\x1e\x1e\x1e\x1e\x1e\x1e\x1e\x1e\x1e\x1e\x1e\x1e\x1e\x1e\x1e\x1e\r\r\r\r\r\x1e\x1e\x1e\xa6\xa6\r\r\r\r\r\r\r\r\r\r\r' +'\r\r\r\r\r\r\r\r\r\r\r\r\x95\r\r\r\r\r\r\r\r\r\r\r\r\r\r\x92\r\r\r\x92\r\x19\x19\x19\x19\x19\x19\x19\x19\x19\x19\x19\x19\x19\x19\x19\x19\x19\x19\x19\x19\x19\x19\x19\x19\x19\x19\r\r\r\r\r' +'\x14\x19\x19\x19\x19\x19\x19\x19\x19\x19\x19GHIJKLMN^^[\r\r\r\r\r\r\r\r\r\reeeeeeeeee\x9c\x93\x93\x92\x19\x19O\x19\x19\x19\x19\x19\x19\x19\x19\x19\x19\x19\x19\x19\x19\x19' '\x19\x19\x19\x19\x19\x19\x19\x19\x19\x19\x19\x19\x19\x19\x19\x19\x19\x19\x19\x19\x19\x19\x19\x19\x19\x19\x19\x19\x19\x19\x19\x19\x19\x19\x19\x19\x19\x19\x19\x19\x19\x19\x19\x19\x19\x19\x19\x19\x19\x19\x19\x19\x19\x19\x19\x19\x19\x19\x19\x19\x19\x19\x19\x19' -'\x19\x19\x19\x19\x19\x19\x19\x19\x19\x19\x19\x19\x19\x19\x19\x19\x19\x19\x19\x19\x91\x19]]]]]]]\x04&]]]]Z]\x14\x14]]\xd2Z]]Z\r\rffffffffff\x19\x19\x19\xc9\xc9\r' -'\x91\x91\x91\x91\x91\x91\x91\x91\x91\x91\x91\x91\x91\x91\r\x05\x19O\x19\x19\x19\x19\x19\x19\x19\x19\x19\x19\x19\x19\x19\x19\x19\x19\x19\x19\x19\x19\x19\x19\x19\x19\x19\x19\x19\r\r\r]Z]]Z]]ZZZ]ZZ]Z]' -']]Z]Z]Z]Z]]\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r' -'\x19\x19\x19\x19\x19\x19\x19\x19\x19\x19\x19\x19\x19\x19\x19\x19\x19\x19\x19\x19\x19\x19\x19\x19\x19\x19\x19\x19\x19\x19\x19\x19\x19\x19\x19\x19\x19\x1911111111111\x19\r\r\r\r\r\r\r\r\r\r\r\r\r\r' +"\x19\x19\x19\x19\x19\x19\x19\x19\x19\x19\x19\x19\x19\x19\x19\x19\x19\x19\x19\x19\x92\x19^^^^^^^\x04'^^^^[^\x14\x14^^\xd3[^^[\r\rgggggggggg\x19\x19\x19\xca\xca\r" +'\x92\x92\x92\x92\x92\x92\x92\x92\x92\x92\x92\x92\x92\x92\r\x05\x19P\x19\x19\x19\x19\x19\x19\x19\x19\x19\x19\x19\x19\x19\x19\x19\x19\x19\x19\x19\x19\x19\x19\x19\x19\x19\x19\x19\r\r\r^[^^[^^[[[^[[^[^' +'^^[^[^[^[^^\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r' +'\x19\x19\x19\x19\x19\x19\x19\x19\x19\x19\x19\x19\x19\x19\x19\x19\x19\x19\x19\x19\x19\x19\x19\x19\x19\x19\x19\x19\x19\x19\x19\x19\x19\x19\x19\x19\x19\x1922222222222\x19\r\r\r\r\r\r\r\r\r\r\r\r\r\r' '\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r' '\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r' '\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r' '\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r' '\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r' -'\r11#\r\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\r\r3\x1b##' -'#11111111####4\r\r\x1b]Z]]\r\r\r\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b11\x9e\x9ehhhhhhhhhh\x9e\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r' -'\r1##\r\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\r\r\x1b\x1b\r\r\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\r\x1b\x1b\x1b\x1b\x1b\x1b\x1b\r\x1b\r\r\r\x1b\x1b\x1b\x1b\r\r3\r##' -'#1111\r\r##\r\r##4\r\r\r\r\r\r\r\r\r#\r\r\r\r\x1b\x1b\r\x1b\x1b\x1b11\r\rhhhhhhhhhh\x1b\x1b\xb1\xb1ssssrs\xcd\r\r\r\r\r' -'\r\r1\r\r\x1b\x1b\x1b\x1b\x1b\x1b\r\r\r\r\x1b\x1b\r\r\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\r\x1b\x1b\x1b\x1b\x1b\x1b\x1b\r\x1b\x1b\r\x1b\x1b\r\x1b\x1b\r\r3\r##' -'#11\r\r\r\r11\r\r114\r\r\r\r\r\r\r\r\r\r\r\x1b\x1b\x1b\x1b\r\x1b\r\r\r\r\r\r\rhhhhhhhhhh11\x1b\x1b\x1b\r\r\r\r\r\r\r\r\r\r\r' -'\r11#\r\x1b\x1b\x1b\x1b\x1b\x1b\x1b\r\x1b\r\x1b\x1b\x1b\r\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\r\x1b\x1b\x1b\x1b\x1b\x1b\x1b\r\x1b\x1b\r\x1b\x1b\x1b\x1b\x1b\r\r3\x1b##' -'#11111\r11#\r##4\r\r\x1b\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\x1b\r\r\r\r\rhhhhhhhhhh\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r' -'\r1##\r\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\r\r\x1b\x1b\r\r\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\r\x1b\x1b\x1b\x1b\x1b\x1b\x1b\r\x1b\x1b\r\r\x1b\x1b\x1b\x1b\r\r3\x1b#1' -'#111\r\r\r##\r\r##4\r\r\r\r\r\r\r\r1#\r\r\r\r\x1b\x1b\r\x1b\x1b\x1b\r\r\r\rhhhhhhhhhh\xcd\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r' -'\r\r1\x1b\r\x1b\x1b\x1b\x1b\x1b\x1b\r\r\r\x1b\x1b\x1b\r\x1b\x1b\x1b\x1b\r\r\r\x1b\x1b\r\x1b\r\x1b\x1b\r\r\r\x1b\x1b\r\r\r\x1b\x1b\x1b\r\r\r\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\r\x1b\x1b\x1b\r\r\r\r##' -'1##\r\r\r###\r###4\r\r\r\r\r\r\r\r\r#\r\r\r\r\r\r\r\r\r\r\r\r\r\r\rhhhhhhhhhsss\r\r\r\r\r\r\r\r\r\r\r\r\r' -'\r###\r\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\r\x1b\x1b\x1b\r\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\r\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\r\x1b\x1b\x1b\x1b\x1b\r\r\r\r11' -'1####\r111\r1114\r\r\r\r\r\r\rPQ\r\r\r\r\r\r\r\r\r\x1b\x1b\r\r\r\rhhhhhhhhhh\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r' -'\r\r##\r\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\r\x1b\x1b\x1b\r\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\r\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\r\x1b\x1b\x1b\x1b\x1b\r\r\r\r#1' -'#####\r1##\r##14\r\r\r\r\r\r\r##\r\r\r\r\r\r\r\x1b\r\x1b\x1b\r\r\r\rhhhhhhhhhh\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r' -'\r\r##\r\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\r\x1b\x1b\x1b\r\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\r\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\r\r\r\r##' -'#111\r\r###\r###4\r\r\r\r\r\r\r\r\r#\r\r\r\r\r\r\r\r\x1b\x1b\r\r\r\rhhhhhhhhhh\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r' -'\r\r##\r\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\r\r\r\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\r\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\r\x1b\r\r' -'\x1b\x1b\x1b\x1b\x1b\x1b\x1b\r\r\r4\r\r\r\r###111\r1\r########\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r##\x9e\r\r\r\r\r\r\r\r\r\r\r' -'\r\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b1\x1b\x1b1111RR4\r\r\r\r\xb1' -'\x1b\x1b\x1b\x1b\x1b\x1b\x171SSSS111\x9ehhhhhhhhhh\x9e\x9e\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r' -'\r\x1b\x1b\r\x1b\r\r\x1b\x1b\r\x1b\r\r\x1b\r\r\r\r\r\r\x1b\x1b\x1b\x1b\r\x1b\x1b\x1b\x1b\x1b\x1b\x1b\r\x1b\x1b\x1b\r\x1b\r\x1b\r\r\x1b\x1b\r\x1b\x1b\x1b\x1b1\x1b\x1b1111TT\r11\x1b\r\r' -'\x1b\x1b\x1b\x1b\x1b\r\x17\rUUUU11\r\rhhhhhhhhhh\r\r\x1b\x1b\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r' -'\x1b\xcd\xcd\xcd\x9e\x9e\x9e\x9e\x9e\x9e\x9e\x9e\x9e\x9e\x9e\x9e\x9e\x9e\x9e\xcd\xcd\xcd\xcd\xcdZZ\xcd\xcd\xcd\xcd\xcd\xcdhhhhhhhhhhssssssssss\xcdZ\xcdZ\xcdY\xa8\x87\xa8\x87##' -'\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\r\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\r\r\r\r\r\rVW1X11111WWWW1#' -'W1]]4\x9e]]\x1b\x1b\x1b\x1b\r\r\r\r11111111\r111111111111111111111111111111111111\r\xcd\xcd' -'\xcd\xcd\xcd\xcd\xcd\xcdZ\xcd\xcd\xcd\xcd\xcd\xcd\r\r\xcd\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r' -'\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\r\x1b\x1b\x1b\x1b\x1b\r\x1b\x1b\r#1111#1\r\r\r13#4\r\r\r\r\r\r' -'hhhhhhhhhh\x9e\x9e\x9e\x9e\x9e\x9e\x1b\x1b\x1b\x1b\x1b\x1b##11\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r' -'\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!' -'!!!!!!\r\r\r\r\r\r\r\r\r\r\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\r\r\x9e\r\r\r\r' +'\r22$\r\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\r\r4\x1b$$' +'$22222222$$$$5\r\r\x1b^[^^\r\r\r\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b22\x9f\x9fiiiiiiiiii\x9f\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r' +'\r2$$\r\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\r\r\x1b\x1b\r\r\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\r\x1b\x1b\x1b\x1b\x1b\x1b\x1b\r\x1b\r\r\r\x1b\x1b\x1b\x1b\r\r4\r$$' +'$2222\r\r$$\r\r$$5\r\r\r\r\r\r\r\r\r$\r\r\r\r\x1b\x1b\r\x1b\x1b\x1b22\r\riiiiiiiiii\x1b\x1b\xb2\xb2ttttst\xce\r\r\r\r\r' +'\r\r2\r\r\x1b\x1b\x1b\x1b\x1b\x1b\r\r\r\r\x1b\x1b\r\r\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\r\x1b\x1b\x1b\x1b\x1b\x1b\x1b\r\x1b\x1b\r\x1b\x1b\r\x1b\x1b\r\r4\r$$' +'$22\r\r\r\r22\r\r225\r\r\r\r\r\r\r\r\r\r\r\x1b\x1b\x1b\x1b\r\x1b\r\r\r\r\r\r\riiiiiiiiii22\x1b\x1b\x1b\r\r\r\r\r\r\r\r\r\r\r' +'\r22$\r\x1b\x1b\x1b\x1b\x1b\x1b\x1b\r\x1b\r\x1b\x1b\x1b\r\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\r\x1b\x1b\x1b\x1b\x1b\x1b\x1b\r\x1b\x1b\r\x1b\x1b\x1b\x1b\x1b\r\r4\x1b$$' +'$22222\r22$\r$$5\r\r\x1b\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\x1b\r\r\r\r\riiiiiiiiii\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r' +'\r2$$\r\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\r\r\x1b\x1b\r\r\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\r\x1b\x1b\x1b\x1b\x1b\x1b\x1b\r\x1b\x1b\r\r\x1b\x1b\x1b\x1b\r\r4\x1b$2' +'$222\r\r\r$$\r\r$$5\r\r\r\r\r\r\r\r2$\r\r\r\r\x1b\x1b\r\x1b\x1b\x1b\r\r\r\riiiiiiiiii\xce\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r' +'\r\r2\x1b\r\x1b\x1b\x1b\x1b\x1b\x1b\r\r\r\x1b\x1b\x1b\r\x1b\x1b\x1b\x1b\r\r\r\x1b\x1b\r\x1b\r\x1b\x1b\r\r\r\x1b\x1b\r\r\r\x1b\x1b\x1b\r\r\r\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\r\x1b\x1b\x1b\r\r\r\r$$' +'2$$\r\r\r$$$\r$$$5\r\r\r\r\r\r\r\r\r$\r\r\r\r\r\r\r\r\r\r\r\r\r\r\riiiiiiiiittt\r\r\r\r\r\r\r\r\r\r\r\r\r' +'\r$$$\r\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\r\x1b\x1b\x1b\r\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\r\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\r\x1b\x1b\x1b\x1b\x1b\r\r\r\r22' +'2$$$$\r222\r2225\r\r\r\r\r\r\rQR\r\r\r\r\r\r\r\r\r\x1b\x1b\r\r\r\riiiiiiiiii\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r' +'\r\r$$\r\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\r\x1b\x1b\x1b\r\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\r\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\r\x1b\x1b\x1b\x1b\x1b\r\r\r\r$2' +'$$$$$\r2$$\r$$25\r\r\r\r\r\r\r$$\r\r\r\r\r\r\r\x1b\r\x1b\x1b\r\r\r\riiiiiiiiii\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r' +'\r\r$$\r\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\r\x1b\x1b\x1b\r\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\r\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\r\r\r\r$$' +'$222\r\r$$$\r$$$5\r\r\r\r\r\r\r\r\r$\r\r\r\r\r\r\r\r\x1b\x1b\r\r\r\riiiiiiiiii\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r' +'\r\r$$\r\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\r\r\r\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\r\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\r\x1b\r\r' +'\x1b\x1b\x1b\x1b\x1b\x1b\x1b\r\r\r5\r\r\r\r$$$222\r2\r$$$$$$$$\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r$$\x9f\r\r\r\r\r\r\r\r\r\r\r' +'\r\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b2\x1b\x1b2222SS5\r\r\r\r\xb2' +'\x1b\x1b\x1b\x1b\x1b\x1b\x172TTTT222\x9fiiiiiiiiii\x9f\x9f\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r' +'\r\x1b\x1b\r\x1b\r\r\x1b\x1b\r\x1b\r\r\x1b\r\r\r\r\r\r\x1b\x1b\x1b\x1b\r\x1b\x1b\x1b\x1b\x1b\x1b\x1b\r\x1b\x1b\x1b\r\x1b\r\x1b\r\r\x1b\x1b\r\x1b\x1b\x1b\x1b2\x1b\x1b2222UU\r22\x1b\r\r' +'\x1b\x1b\x1b\x1b\x1b\r\x17\rVVVV22\r\riiiiiiiiii\r\r\x1b\x1b\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r' +'\x1b\xce\xce\xce\x9f\x9f\x9f\x9f\x9f\x9f\x9f\x9f\x9f\x9f\x9f\x9f\x9f\x9f\x9f\xce\xce\xce\xce\xce[[\xce\xce\xce\xce\xce\xceiiiiiiiiiitttttttttt\xce[\xce[\xceZ\xa9\x88\xa9\x88$$' +'\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\r\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\r\r\r\r\r\rWX2Y22222XXXX2$' +'X2^^5\x9f^^\x1b\x1b\x1b\x1b\r\r\r\r22222222\r222222222222222222222222222222222222\r\xce\xce' +'\xce\xce\xce\xce\xce\xce[\xce\xce\xce\xce\xce\xce\r\r\xce\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r' +'\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\r\x1b\x1b\x1b\x1b\x1b\r\x1b\x1b\r$2222$2\r\r\r24$5\r\r\r\r\r\r' +'iiiiiiiiii\x9f\x9f\x9f\x9f\x9f\x9f\x1b\x1b\x1b\x1b\x1b\x1b$$22\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r' +'\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r""""""""""""""""""""""""""""""""' +'""""""\r\r\r\r\r\r\r\r\r\r\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\r\r\x9f\r\r\r\r' '\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c' '\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\r\r\r\r\r\x1c\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b' '\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\r\r\r\r\r\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b' @@ -14249,7 +14250,7 @@ '\x1b\x1b\x1b\x1b\x1b\x1b\x1b\r\x1b\r\x1b\x1b\x1b\x1b\r\r\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\r\x1b\r\x1b\x1b\x1b\x1b\r\r\x1b\x1b\x1b\x1b\x1b\x1b\x1b\r' '\x1b\r\x1b\x1b\x1b\x1b\r\r\x1b\x1b\x1b\x1b\x1b\x1b\x1b\r\x1b\x1b\x1b\x1b\x1b\x1b\x1b\r\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\r\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b' '\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\r\x1b\r\x1b\x1b\x1b\x1b\r\r\x1b\x1b\x1b\x1b\x1b\x1b\x1b\r\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b' -'\x1b\x1b\x1b\x1b\x1b\x1b\x1b\r\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\r\r\r\r\r\r\x9e\x9e\x9e\x9e\x9e\x9e\x9e\x9ehhhhhhhhhsssssssssss\r\r\r' +'\x1b\x1b\x1b\x1b\x1b\x1b\x1b\r\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\r\r\r\r\r\r\x9f\x9f\x9f\x9f\x9f\x9f\x9f\x9fiiiiiiiiittttttttttt\r\r\r' '\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b' '\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\r\r\r\r\r\r\r\r\r\r\r' '\r\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b' @@ -14261,93 +14262,93 @@ '\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b' '\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b' '\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b' -'\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x9e\x9e\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\r\r\r\r\r\r\r\r\r' -'\xda\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\xa8\x87\r\r\r\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b' -'\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x9e\x9e\x9ekkk\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r' -'\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\r\x1b\x1b\x1b\x1b114\r\r\r\r\r\r\r\r\r\r\r\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b114\x9e\x9e\r\r\r\r\r\r\r\r\r' -'\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b11\r\r\r\r\r\r\r\r\r\r\r\r\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\r\x1b\x1b\x1b\r11\r\r\r\r\r\r\r\r\r\r\r\r' -'\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b###1111111##' -'######1##11111111141\x9e\x9e\x9e\x17\x9e\x9e\x9e\xb1\x1b\r\r\rhhhhhhhhhh\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r' -'\xa2\xa2\xa2\xa2\xa2\xa2\x83\xa2\xa2\xa2\xa2111\x05\rhhhhhhhhhh\r\r\r\r\r\r\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b' +'\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x9f\x9f\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\r\r\r\r\r\r\r\r\r' +'\xdb\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\xa9\x88\r\r\r\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b' +'\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x9f\x9f\x9flll\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r' +'\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\r\x1b\x1b\x1b\x1b225\r\r\r\r\r\r\r\r\r\r\r\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b225\x9f\x9f\r\r\r\r\r\r\r\r\r' +'\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b22\r\r\r\r\r\r\r\r\r\r\r\r\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\r\x1b\x1b\x1b\r22\r\r\r\r\r\r\r\r\r\r\r\r' +'\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b$$$2222222$$' +'$$$$$$2$$22222222252\x9f\x9f\x9f\x17\x9f\x9f\x9f\xb2\x1b\r\r\riiiiiiiiii\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r' +'\xa3\xa3\xa3\xa3\xa3\xa3\x84\xa3\xa3\xa3\xa3222\x05\riiiiiiiiii\r\r\r\r\r\r\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b' '\x1b\x1b\x1b\x17\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\r\r\r\r\r\r\r\r' -'\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\\\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r' +'\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b]\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r' '\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r' -'!\x12!\x12!\x12!\x12!\x12!\x12!\x12!\x12!\x12!\x12!\x12!\x12!\x12!\x12!\x12!\x12!\x12!\x12!\x12!\x12!\x12!\x12!\x12!\x12!\x12!\x12!\x12!\x12!\x12!\x12!\x12!\x12' -'!\x12!\x12!\x12!\x12!\x12!\x12!\x12!\x12!\x12!\x12!\x12!\x12!\x12!\x12!\x12!\x12!\x12!\x12!\x12!\x12!\x12!\x12!\x12!\x12!\x12!\x12!\x12!\x12!\x12!\x12!\x12!\x12' -'!\x12!\x12!\x12!\x12!\x12!\x12!\x12!\x12!\x12!\x12!\x12\x12\x12\x12\x12\x12\x12\r\r\r\r!\x12!\x12!\x12!\x12!\x12!\x12!\x12!\x12!\x12!\x12!\x12!\x12!\x12!\x12!\x12!\x12' -'!\x12!\x12!\x12!\x12!\x12!\x12!\x12!\x12!\x12!\x12!\x12!\x12!\x12!\x12!\x12!\x12!\x12!\x12!\x12!\x12!\x12!\x12!\x12!\x12!\x12!\x12!\x12!\x12!\x12\r\r\r\r\r\r' -'\x12\x12\x12\x12\x12\x12\x12\x12!!!!!!!!\x12\x12\x12\x12\x12\x12\r\r!!!!!!\r\r\x12\x12\x12\x12\x12\x12\x12\x12!!!!!!!!\x12\x12\x12\x12\x12\x12\x12\x12!!!!!!!!' -'\x12\x12\x12\x12\x12\x12\r\r!!!!!!\r\r\x12\x12\x12\x12\x12\x12\x12\x12\r!\r!\r!\r!\x12\x12\x12\x12\x12\x12\x12\x12!!!!!!!!\x12\x12\x12\x12\x12\x12\x12\x12\x12\x12\x12\x12\x12\x12\r\r' -'\x12\x12\x12\x12\x12\x12\x12\x12\x1e\x1e\x1e\x1e\x1e\x1e\x1e\x1e\x12\x12\x12\x12\x12\x12\x12\x12\x1e\x1e\x1e\x1e\x1e\x1e\x1e\x1e\x12\x12\x12\x12\x12\x12\x12\x12\x1e\x1e\x1e\x1e\x1e\x1e\x1e\x1e\x12\x12\x12\x12\x12\r\x12\x12!!!!\x1e\xb6\x12\xb6' -'\xb6\xb6\x12\x12\x12\r\x12\x12!!!!\x1e\xb6\xb6\xb6\x12\x12\x12\x12\r\r\x12\x12!!!!\r\xb6\xb6\xb6\x12\x12\x12\x12\x12\x12\x12\x12!!!!!\xb6\xb6\xb6\r\r\x12\x12\x12\r\x12\x12!!!!\x1e\xb6\xb6\r' -'\xda\xda\xda\xda\xda\xda\xda\xda\xda\xda\xda\xd7\x05\x05\x06\n\x82\x83\x83\x82\x82\x82\x9f\xa2\x8e\x8c\xa8\x8f\x8e\x8c\xa8\x8f\x9f\x9f\x9f\xa2\x9f\x9f\x9f\x9f\xd5\xd6\x07\x0b\t\x08\x0c\xda\x99\x9b\x99\x99\x9b\x9f\xa2\xa2\xa2\x90\x8d\x9f\xa2\xa2\x9f|' -'|\xa2\xa2\xa2\xc4\xa9\x88\xa2\xa2\xa2\xa2\xa2\xa2\xa2\xa2\xa2\xa2\xa2\xc4\r\r\r\r\xa2\r\r\r\r\r\r\r\xda\x05\x05\x05\x05\r\r\r\r\r\r\x05\x05\x05\x05\x05\x05q\x12\r\roqqqqq\xbb\xbb\xc4\xa9\x88\x10' -'qooooqqqqq\xbb\xbb\xc4\xa9\x88\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\xb1\xb1\xb1\xb1\xb1\xb1\xb1\xb1\xb1\xb0\xb1\xb1\xae\xb1\xb1\xb1\xb1\xb1\r\r\r\r\r\r\r\r\r\r\r\r\r\r' -'\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r]]22]]]]222]]&&&&]&&&22]Z]2\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r' -'\xd2\xd2!\xcf\xd2\xcf\xd2!\xd2\xcf\x12!!!\x12\x12!!!\x10\xd2!\xcf\xd2\xd2!!!!!\xd2\xd2\xd2\xcf\xcf\xd2!\xd2\x1f\xd2!\xd2!\x1f!!\xcb\x12!!\xd2!\x12\x1b\x1b\x1b\x1b\x12\xd2\r\r\x12!!' -'\xc5\xc4\xc4\xc4\xc4!\x12\x12\x12\x12\xd2\xc4\r\r\r\r\r\r\ruuwwwwwwuuuuwiiiiiiiiiiiikkkkiiiiiiiiiikkkkkk' -'kkkj\r\r\r\r\r\r\r\r\r\r\r\r\xbf\xbf\xbf\xbf\xbf\xcf\xcf\xcf\xcf\xcf\xc4\xc4\xd2\xd2\xd2\xd2\xc4\xd2\xd2\xc4\xd2\xd2\xc4\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xc4\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xcf\xcf\xd2\xd2\xd2\xd2\xd2\xd2' -'\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xc4\xc4\xd2\xd2\xbf\xd2\xbf\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xcf\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xc4\xc4\xc4\xc4\xc4\xc4\xc4\xc4\xc4\xc4\xc4\xc4' -'\xbf\xc5\xc0\xc0\xc5\xc4\xc4\xbf\xc0\xc5\xc5\xc0\xc5\xc5\xc4\xbf\xc4\xc0\xbb\xbb\xc4\xc0\xc5\xc4\xc4\xc4\xc0\xc5\xc5\xc0\xbf\xc0\xc0\xc5\xc5\xbf\xc5\xbf\xc5\xbf\xbf\xbf\xbf\xc0\xc0\xc5\xc0\xc5\xc5\xc5\xc5\xc5\xbf\xbf\xbf\xbf\xc4\xc5\xc4\xc5\xc0\xc0\xc5\xc5' -'\xc5\xc5\xc5\xc5\xc5\xc5\xc5\xc5\xc0\xc5\xc5\xc5\xc0\xc4\xc4\xc4\xc4\xc4\xc0\xc5\xc5\xc5\xc4\xc4\xc4\xc4\xc4\xc4\xc4\xc4\xc4\xc5\xc0\xbf\xc5\xc4\xc0\xc0\xc0\xc0\xc5\xc5\xc0\xc0\xc4\xc4\xc0\xc0\xc5\xc5\xc5\xc5\xc5\xc5\xc5\xc5\xc5\xc5\xc5\xc5\xc5\xc5\xc5\xc5' -'\xc5\xc5\xc0\xc0\xc5\xc5\xc0\xc0\xc5\xc5\xc5\xc5\xc5\xc4\xc4\xc5\xc5\xc5\xc5\xc4\xc4\xbf\xc4\xc4\xc5\xbf\xc4\xc4\xc4\xc4\xc4\xc4\xc4\xc4\xc5\xc5\xc4\xbf\xc5\xc5\xc5\xc5\xc5\xc5\xc5\xc5\xc5\xc5\xc5\xc5\xc5\xc5\xc5\xc5\xc5\xc5\xc5\xc4\xc4\xc4\xc4\xc4\xc5\xc0' -'\xc4\xc4\xc4\xc4\xc4\xc4\xc4\xc4\xc4\xc5\xc5\xc5\xc5\xc5\xc4\xc4\xc5\xc5\xc4\xc4\xc4\xc4\xc5\xc5\xc5\xc5\xc5\xc5\xc5\xc5\xc5\xc5\xc5\xc5\xc5\xc5\xc5\xc5\xc5\xc5\xc5\xc5\xc5\xc5\xc5\xc5\xc4\xc4\xc5\xc5\xc5\xc5\xc5\xc5\xc5\xc5\xc5\xc5\xc5\xc5\xc5\xc5\xc5\xc5' -'\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xc5\xc5\xc5\xc5\xd2\xd2\xd2\xd2\xd2\xd2\xcf\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xc5\xc5\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xac\x8b\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd' -'\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xd2\xc4\xd2\xd2\xd2' -'\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xcd\xd2\xd2\xd2\xd2\xd2\xc4\xc4\xc4\xc4\xc4\xc4\xc4\xc4\xc4\xc4\xc4\xc4\xc4\xc4\xc4\xc4\xc4\xc4\xc4\xc4\xc4\xc4\xc4\xc4\xc4\xa8\x87\xa2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2' -'\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r' -'\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r' -'\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\rnnnnnnnnnmmmmmmmmmmmnnnnnnnnnmmm' -'mmmmmmmmnnnnnnnnnmmmmmmmmmmm\xcc\xcc\xcc\xcc\xcc\xcc\xcc\xcc\xcc\xcc\xcc\xcc\xcc\xcc\xcc\xcc\xcc\xcc\xcc\xcc\xcc\xcc\xcc\xcc\xcc\xcc\xcc\xcc\xcc\xcc\xcc\xcc\xcc\xcc\xcc\xcc' -'\xcc\xcc\xcc\xcc\xcc\xcc\xcc\xcc\xcc\xcc\xcc\xcc\xcc\xcc\xcc\xcc\xcc\xcc\xcc\xcc\xcc\xcc\xcc\xcc\xcc\xcc\xcc\xcc\xcc\xcc\xcc\xcc\xcc\xcc\xcc\xcc\xcc\xcc\xcc\xcc\xcc\xccpuuuuuuuuuuvvvvvvvvvu\r' -'\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf' -'\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xd2\xd2\xd2\xd2\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2' -'\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xd2\xd2\xcf\xcf\xcf\xcf\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xcf\xcf\xd2\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xcf\xcf\xd2\xd2\xcf\xbf\xd2\xd2\xd2\xd2\xcf\xcf\xd2\xd2' -'\xcf\xbf\xd2\xd2\xd2\xd2\xcf\xcf\xcf\xd2\xd2\xcf\xd2\xd2\xcf\xcf\xcf\xcf\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xcf\xcf\xcf\xcf\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xcf\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xc4\xc4\xc4\xc4\xc4\xc4\xc4\xc4' -'\xd2\xd2\xd2\xd2\xd2\xcf\xcf\xd2\xd2\xcf\xd2\xd2\xd2\xd2\xcf\xcf\xd2\xd2\xd2\xd2\r\r\xd2\xd2\r\xd2\xd2\xd2\xcf\xd2\xcf\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2' -'\xcf\xd2\xcf\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xcf\xcf\xd2\xcf\xcf\xcf\xd2\xcf\xcf\xcf\xcf\xd2\xcf\xcf\xd2\xbf\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\r\r' -'\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r' +'"\x12"\x12"\x12"\x12"\x12"\x12"\x12"\x12"\x12"\x12"\x12"\x12"\x12"\x12"\x12"\x12"\x12"\x12"\x12"\x12"\x12"\x12"\x12"\x12"\x12"\x12"\x12"\x12"\x12"\x12"\x12"\x12' +'"\x12"\x12"\x12"\x12"\x12"\x12"\x12"\x12"\x12"\x12"\x12"\x12"\x12"\x12"\x12"\x12"\x12"\x12"\x12"\x12"\x12"\x12"\x12"\x12"\x12"\x12"\x12"\x12"\x12"\x12"\x12"\x12' +'"\x12"\x12"\x12"\x12"\x12"\x12"\x12"\x12"\x12"\x12"\x12\x12\x12\x12\x12\x12\x12\r\r\r\r"\x12"\x12"\x12"\x12"\x12"\x12"\x12"\x12"\x12"\x12"\x12"\x12"\x12"\x12"\x12"\x12' +'"\x12"\x12"\x12"\x12"\x12"\x12"\x12"\x12"\x12"\x12"\x12"\x12"\x12"\x12"\x12"\x12"\x12"\x12"\x12"\x12"\x12"\x12"\x12"\x12"\x12"\x12"\x12"\x12"\x12\r\r\r\r\r\r' +'\x12\x12\x12\x12\x12\x12\x12\x12""""""""\x12\x12\x12\x12\x12\x12\r\r""""""\r\r\x12\x12\x12\x12\x12\x12\x12\x12""""""""\x12\x12\x12\x12\x12\x12\x12\x12""""""""' +'\x12\x12\x12\x12\x12\x12\r\r""""""\r\r\x12\x12\x12\x12\x12\x12\x12\x12\r"\r"\r"\r"\x12\x12\x12\x12\x12\x12\x12\x12""""""""\x12\x12\x12\x12\x12\x12\x12\x12\x12\x12\x12\x12\x12\x12\r\r' +'\x12\x12\x12\x12\x12\x12\x12\x12\x1f\x1f\x1f\x1f\x1f\x1f\x1f\x1f\x12\x12\x12\x12\x12\x12\x12\x12\x1f\x1f\x1f\x1f\x1f\x1f\x1f\x1f\x12\x12\x12\x12\x12\x12\x12\x12\x1f\x1f\x1f\x1f\x1f\x1f\x1f\x1f\x12\x12\x12\x12\x12\r\x12\x12""""\x1f\xb7\x12\xb7' +'\xb7\xb7\x12\x12\x12\r\x12\x12""""\x1f\xb7\xb7\xb7\x12\x12\x12\x12\r\r\x12\x12""""\r\xb7\xb7\xb7\x12\x12\x12\x12\x12\x12\x12\x12"""""\xb7\xb7\xb7\r\r\x12\x12\x12\r\x12\x12""""\x1f\xb7\xb7\r' +'\xdb\xdb\xdb\xdb\xdb\xdb\xdb\xdb\xdb\xdb\xdb\xd8\x05\x05\x06\n\x83\x84\x84\x83\x83\x83\xa0\xa3\x8f\x8d\xa9\x90\x8f\x8d\xa9\x90\xa0\xa0\xa0\xa3\xa0\xa0\xa0\xa0\xd6\xd7\x07\x0b\t\x08\x0c\xdb\x9a\x9c\x9a\x9a\x9c\xa0\xa3\xa3\xa3\x91\x8e\xa0\xa3\xa3\xa0}' +'}\xa3\xa3\xa3\xc5\xaa\x89\xa3\xa3\xa3\xa3\xa3\xa3\xa3\xa3\xa3\xa3\xa3\xc5\r\r\r\r\xa3\r\r\r\r\r\r\r\xdb\x05\x05\x05\x05\r\r\r\r\r\r\x05\x05\x05\x05\x05\x05r\x12\r\rprrrrr\xbc\xbc\xc5\xaa\x89\x10' +'rpppprrrrr\xbc\xbc\xc5\xaa\x89\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\xb2\xb2\xb2\xb2\xb2\xb2\xb2\xb2\xb2\xb1\xb2\xb2\xaf\xb2\xb2\xb2\xb2\xb2\r\r\r\r\r\r\r\r\r\r\r\r\r\r' +"\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r^^33^^^^333^^''''^'''33^[^3\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r" +'\xd3\xd3"\xd0\xd3\xd0\xd3"\xd3\xd0\x12"""\x12\x12"""\x10\xd3"\xd0\xd3\xd3"""""\xd3\xd3\xd3\xd0\xd0\xd3"\xd3 \xd3"\xd3" ""\xcc\x12""\xd3"\x12\x1b\x1b\x1b\x1b\x12\xd3\r\r\x12""' +'\xc6\xc5\xc5\xc5\xc5"\x12\x12\x12\x12\xd3\xc5\r\r\r\r\r\r\rvvxxxxxxvvvvxjjjjjjjjjjjjlllljjjjjjjjjjllllll' +'lllk\r\r\r\r\r\r\r\r\r\r\r\r\xc0\xc0\xc0\xc0\xc0\xd0\xd0\xd0\xd0\xd0\xc5\xc5\xd3\xd3\xd3\xd3\xc5\xd3\xd3\xc5\xd3\xd3\xc5\xd3\xd3\xd3\xd3\xd3\xd3\xd3\xc5\xd3\xd3\xd3\xd3\xd3\xd3\xd3\xd3\xd3\xd0\xd0\xd3\xd3\xd3\xd3\xd3\xd3' +'\xd3\xd3\xd3\xd3\xd3\xd3\xd3\xd3\xd3\xd3\xd3\xd3\xd3\xd3\xc5\xc5\xd3\xd3\xc0\xd3\xc0\xd3\xd3\xd3\xd3\xd3\xd3\xd3\xd3\xd3\xd3\xd3\xd3\xd3\xd3\xd3\xd3\xd3\xd3\xd0\xd3\xd3\xd3\xd3\xd3\xd3\xd3\xd3\xd3\xd3\xd3\xd3\xc5\xc5\xc5\xc5\xc5\xc5\xc5\xc5\xc5\xc5\xc5\xc5' +'\xc0\xc6\xc1\xc1\xc6\xc5\xc5\xc0\xc1\xc6\xc6\xc1\xc6\xc6\xc5\xc0\xc5\xc1\xbc\xbc\xc5\xc1\xc6\xc5\xc5\xc5\xc1\xc6\xc6\xc1\xc0\xc1\xc1\xc6\xc6\xc0\xc6\xc0\xc6\xc0\xc0\xc0\xc0\xc1\xc1\xc6\xc1\xc6\xc6\xc6\xc6\xc6\xc0\xc0\xc0\xc0\xc5\xc6\xc5\xc6\xc1\xc1\xc6\xc6' +'\xc6\xc6\xc6\xc6\xc6\xc6\xc6\xc6\xc1\xc6\xc6\xc6\xc1\xc5\xc5\xc5\xc5\xc5\xc1\xc6\xc6\xc6\xc5\xc5\xc5\xc5\xc5\xc5\xc5\xc5\xc5\xc6\xc1\xc0\xc6\xc5\xc1\xc1\xc1\xc1\xc6\xc6\xc1\xc1\xc5\xc5\xc1\xc1\xc6\xc6\xc6\xc6\xc6\xc6\xc6\xc6\xc6\xc6\xc6\xc6\xc6\xc6\xc6\xc6' +'\xc6\xc6\xc1\xc1\xc6\xc6\xc1\xc1\xc6\xc6\xc6\xc6\xc6\xc5\xc5\xc6\xc6\xc6\xc6\xc5\xc5\xc0\xc5\xc5\xc6\xc0\xc5\xc5\xc5\xc5\xc5\xc5\xc5\xc5\xc6\xc6\xc5\xc0\xc6\xc6\xc6\xc6\xc6\xc6\xc6\xc6\xc6\xc6\xc6\xc6\xc6\xc6\xc6\xc6\xc6\xc6\xc6\xc5\xc5\xc5\xc5\xc5\xc6\xc1' +'\xc5\xc5\xc5\xc5\xc5\xc5\xc5\xc5\xc5\xc6\xc6\xc6\xc6\xc6\xc5\xc5\xc6\xc6\xc5\xc5\xc5\xc5\xc6\xc6\xc6\xc6\xc6\xc6\xc6\xc6\xc6\xc6\xc6\xc6\xc6\xc6\xc6\xc6\xc6\xc6\xc6\xc6\xc6\xc6\xc6\xc6\xc5\xc5\xc6\xc6\xc6\xc6\xc6\xc6\xc6\xc6\xc6\xc6\xc6\xc6\xc6\xc6\xc6\xc6' +'\xd3\xd3\xd3\xd3\xd3\xd3\xd3\xd3\xc6\xc6\xc6\xc6\xd3\xd3\xd3\xd3\xd3\xd3\xd0\xd3\xd3\xd3\xd3\xd3\xd3\xd3\xd3\xd3\xd3\xd3\xd3\xd3\xc6\xc6\xd3\xd3\xd3\xd3\xd3\xd3\xd3\xad\x8c\xd3\xd3\xd3\xd3\xd3\xd3\xd3\xd3\xd3\xd3\xd3\xce\xce\xce\xce\xce\xce\xce\xce\xce\xce' +'\xce\xce\xce\xce\xce\xce\xce\xce\xce\xce\xce\xce\xce\xce\xce\xce\xce\xce\xce\xce\xce\xce\xce\xce\xce\xce\xce\xce\xce\xce\xce\xce\xce\xce\xce\xce\xce\xce\xce\xce\xce\xce\xce\xce\xce\xce\xce\xce\xce\xce\xce\xce\xce\xce\xce\xce\xce\xce\xce\xd3\xc5\xd3\xd3\xd3' +'\xd3\xd3\xd3\xd3\xd3\xd3\xd3\xd3\xd3\xd3\xd3\xd3\xd3\xd3\xd3\xd3\xd3\xd3\xd3\xd3\xd3\xce\xd3\xd3\xd3\xd3\xd3\xc5\xc5\xc5\xc5\xc5\xc5\xc5\xc5\xc5\xc5\xc5\xc5\xc5\xc5\xc5\xc5\xc5\xc5\xc5\xc5\xc5\xc5\xc5\xc5\xc5\xa9\x88\xa3\xd3\xd3\xd3\xd3\xd3\xd3\xd3\xd3\xd3' +'\xd3\xd3\xd3\xd3\xd3\xd3\xd3\xd3\xd3\xd3\xd3\xd3\xd3\xd3\xd3\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r' +'\xd3\xd3\xd3\xd3\xd3\xd3\xd3\xd3\xd3\xd3\xd3\xd3\xd3\xd3\xd3\xd3\xd3\xd3\xd3\xd3\xd3\xd3\xd3\xd3\xd3\xd3\xd3\xd3\xd3\xd3\xd3\xd3\xd3\xd3\xd3\xd3\xd3\xd3\xd3\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r' +'\xd3\xd3\xd3\xd3\xd3\xd3\xd3\xd3\xd3\xd3\xd3\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\rooooooooonnnnnnnnnnnooooooooonnn' +'nnnnnnnnooooooooonnnnnnnnnnn\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd' +'\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcdqvvvvvvvvvvwwwwwwwwwv\r' +'\xd0\xd0\xd0\xd0\xd0\xd0\xd0\xd0\xd0\xd0\xd0\xd0\xd0\xd0\xd0\xd0\xd0\xd0\xd0\xd0\xd0\xd0\xd0\xd0\xd0\xd0\xd0\xd0\xd0\xd0\xd0\xd0\xd0\xd0\xd0\xd0\xd0\xd0\xd0\xd0\xd0\xd0\xd0\xd0\xd0\xd0\xd0\xd0\xd0\xd0\xd0\xd0\xd0\xd0\xd0\xd0\xd0\xd0\xd0\xd0\xd0\xd0\xd0\xd0' +'\xd0\xd0\xd0\xd0\xd0\xd0\xd0\xd0\xd0\xd0\xd0\xd0\xd3\xd3\xd3\xd3\xd0\xd0\xd0\xd0\xd0\xd0\xd0\xd0\xd0\xd0\xd0\xd0\xd0\xd0\xd0\xd0\xd0\xd0\xd0\xd0\xd0\xd0\xd0\xd0\xd0\xd0\xd0\xd0\xd0\xd0\xd0\xd0\xd0\xd0\xd0\xd0\xd3\xd3\xd3\xd3\xd3\xd3\xd3\xd3\xd3\xd3\xd3\xd3' +'\xd0\xd0\xd0\xd0\xd0\xd0\xd0\xd0\xd0\xd0\xd0\xd0\xd0\xd0\xd0\xd0\xd3\xd3\xd0\xd0\xd0\xd0\xd3\xd3\xd3\xd3\xd3\xd3\xd3\xd3\xd3\xd3\xd0\xd0\xd3\xd0\xd0\xd0\xd0\xd0\xd0\xd0\xd3\xd3\xd3\xd3\xd3\xd3\xd3\xd3\xd0\xd0\xd3\xd3\xd0\xc0\xd3\xd3\xd3\xd3\xd0\xd0\xd3\xd3' +'\xd0\xc0\xd3\xd3\xd3\xd3\xd0\xd0\xd0\xd3\xd3\xd0\xd3\xd3\xd0\xd0\xd0\xd0\xd3\xd3\xd3\xd3\xd3\xd3\xd3\xd3\xd3\xd3\xd3\xd3\xd3\xd3\xd3\xd3\xd0\xd0\xd0\xd0\xd3\xd3\xd3\xd3\xd3\xd3\xd3\xd3\xd3\xd0\xd3\xd3\xd3\xd3\xd3\xd3\xd3\xd3\xc5\xc5\xc5\xc5\xc5\xc5\xc5\xc5' +'\xd3\xd3\xd3\xd3\xd3\xd0\xd0\xd3\xd3\xd0\xd3\xd3\xd3\xd3\xd0\xd0\xd3\xd3\xd3\xd3\r\r\xd3\xd3\r\xd3\xd3\xd3\xd0\xd3\xd0\xd3\xd3\xd3\xd3\xd3\xd3\xd3\xd3\xd3\xd3\xd3\xd3\xd3\xd3\xd3\xd3\xd3\xd3\xd3\xd3\xd3\xd3\xd3\xd3\xd3\xd3\xd3\xd3\xd3\xd3\xd3\xd3\xd3' +'\xd0\xd3\xd0\xd3\xd3\xd3\xd3\xd3\xd3\xd3\xd3\xd3\xd3\xd3\xd3\xd3\xd3\xd3\xd3\xd3\xd3\xd3\xd3\xd3\xd3\xd3\xd3\xd3\xd3\xd3\xd3\xd3\xd0\xd0\xd3\xd0\xd0\xd0\xd3\xd0\xd0\xd0\xd0\xd3\xd0\xd0\xd3\xc0\xd3\xd3\xd3\xd3\xd3\xd3\xd3\xd3\xd3\xd3\xd3\xd3\xd3\xd3\r\r' +'\xd3\xd3\xd3\xd3\xd3\xd3\xd3\xd3\xd3\xd3\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r' '\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r' -'\r\xd2\xd2\xd2\xd2\r\xd2\xd2\xd2\xd2\r\r\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\r\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xcf\xd2\xd2' -'\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\r\xd2\r\xd2\xd2\xd2\xd2\r\r\r\xd2\r\xd2\xd2\xd2\xd2\xd2\xd2\xd2\r\r\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xa9\x88\xa9\x88\xa9\x88\xa9\x88\xa9\x88\xa9\x88\xa9\x88vvvvvvvvvu' -'xxxxxxxxxwxxxxxxxxxw\xd2\r\r\r\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\r\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\r' -'\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\xc4\xc4\xc4\xc5\xc5\xc5\xc5\xc4\xc4\xc4\xc4\xc4\xc5\xc5\xc5\xc4\xc4\xc4\xc5\xc5\xc5\xc5\xaa\x89\xaa\x89\xaa\x89\r\r\r\r\xc4\xc4\xc4\xc4\xc4\xc4\xc4\xc4\xc4\xc4\xc4\xc4\xc4\xc4\xc4\xc4' -'\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2' -'\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2' -'\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2' -'\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2\xd2' -'\xc4\xc4\xc4\xc4\xc4\xc4\xc4\xc4\xc4\xc4\xc4\xc4\xc4\xc4\xc4\xc4\xc4\xc4\xc4\xc4\xc4\xc4\xc4\xc4\xc4\xc4\xc4\xc4\xc4\xc4\xc4\xc4\xc4\xc4\xc4\xc4\xc4\xc4\xc4\xc4\xc4\xc4\xc4\xc4\xc4\xc4\xc4\xc4\xc4\xc4\xc4\xc4\xc4\xc4\xc4\xc4\xc4\xc4\xc4\xc4\xc4\xc4\xc4\xc4' -'\xc4\xc4\xc4\xc4\xc4\xc4\xc4\xc4\xc4\xc4\xc4\xc4\xc4\xc4\xc4\xc4\xc4\xc4\xc4\xc4\xc4\xc4\xc4\xc4\xc4\xc4\xc4\xc4\xc4\xc4\xc4\xc4\xc4\xc4\xc4\xc4\xc4\xc4\xc4\xc4\xc4\xc4\xc4\xc4\xc4\xc4\xc4\xc4\xc4\xc4\xc4\xc4\xc4\xc4\xc4\xc4\xc4\xc4\xc4\xc4\xc4\xc4\xc4\xc4' -'\xc4\xc4\xc4\xa9\x88\xaa\x89\xa9\x88\xa9\x88\xa9\x88\xa9\x88\xa9\x88\xa9\x88\xa9\x88\xa9\x88\xa9\x88\xc4\xc4\xc5\xc5\xc5\xc5\xc5\xc5\xc5\xc5\xc5\xc5\xc5\xc5\xc5\xc5\xc5\xc5\xc5\xc5\xc5\xc5\xc5\xc4\xc4\xc4\xc4\xc4\xc4\xc4\xc4\xc5\xc4\xc4\xc4\xc4\xc4\xc4\xc4' -'\xc5\xc5\xc5\xc5\xc5\xc5\xc4\xc4\xc4\xc5\xc4\xc4\xc4\xc4\xc5\xc5\xc5\xc5\xc5\xc4\xc5\xc5\xc4\xc4\xa9\x88\xa9\x88\xc5\xc4\xc4\xc4\xc4\xc5\xc4\xc5\xc5\xc5\xc4\xc4\xc5\xc5\xc4\xc4\xc4\xc4\xc4\xc4\xc4\xc4\xc4\xc4\xc5\xc5\xc5\xc5\xc5\xc5\xc4\xc4\xa9\x88\xc4\xc4' -'\xc4\xc4\xc4\xc4\xc4\xc4\xc4\xc4\xc4\xc4\xc5\xc5\xc5\xc5\xc5\xc5\xc5\xc5\xc5\xc5\xc5\xc5\xc5\xc5\xc5\xc5\xc5\xc5\xc5\xc4\xc5\xc5\xc5\xc5\xc4\xc4\xc5\xc4\xc5\xc4\xc4\xc5\xc4\xc5\xc5\xc5\xc5\xc4\xc4\xc4\xc4\xc4\xc5\xc5\xc4\xc4\xc4\xc4\xc4\xc4\xc5\xc5\xc5\xc4' -'\xc4\xc4\xc4\xc4\xc4\xc4\xc4\xc4\xc4\xc4\xc4\xc4\xc4\xc4\xc4\xc4\xc4\xc4\xc4\xc4\xc4\xc4\xc4\xc5\xc5\xc4\xc4\xc4\xc4\xc4\xc4\xc4\xc4\xc4\xc4\xc4\xc5\xc5\xc4\xc4\xc4\xc4\xc5\xc5\xc5\xc5\xc4\xc5\xc5\xc4\xc4\xc5\xc5\xc4\xc4\xc4\xc4\xc5\xc5\xc5\xc5\xc5\xc5\xc5' -'\xc5\xc5\xc5\xc5\xc5\xc5\xc5\xc5\xc5\xc5\xc5\xc5\xc5\xc5\xc5\xc5\xc5\xc5\xc5\xc5\xc5\xc5\xc5\xc5\xc5\xc5\xc5\xc5\xc5\xc5\xc5\xc5\xc5\xc5\xc5\xc5\xc4\xc4\xc5\xc5\xc5\xc5\xc5\xc5\xc5\xc5\xc4\xc5\xc5\xc5\xc5\xc5\xc5\xc5\xc5\xc5\xc5\xc5\xc5\xc5\xc5\xc5\xc5\xc5' -'\xc5\xc5\xc5\xc5\xc5\xc5\xc5\xc5\xc5\xc5\xc5\xc5\xc5\xc5\xc5\xc5\xc5\xc5\xc5\xc5\xc5\xc5\xc5\xc4\xc4\xc4\xc4\xc4\xc5\xc4\xc5\xc4\xc4\xc4\xc5\xc5\xc5\xc5\xc5\xc4\xc4\xc4\xc4\xc4\xc5\xc5\xc5\xc4\xc4\xc4\xc4\xc5\xc4\xc4\xc4\xc5\xc5\xc5\xc5\xc5\xc4\xc5\xc4\xc4' +'\r\xd3\xd3\xd3\xd3\r\xd3\xd3\xd3\xd3\r\r\xd3\xd3\xd3\xd3\xd3\xd3\xd3\xd3\xd3\xd3\xd3\xd3\xd3\xd3\xd3\xd3\xd3\xd3\xd3\xd3\xd3\xd3\xd3\xd3\xd3\xd3\xd3\xd3\r\xd3\xd3\xd3\xd3\xd3\xd3\xd3\xd3\xd3\xd3\xd3\xd3\xd3\xd3\xd3\xd3\xd3\xd3\xd3\xd3\xd0\xd3\xd3' +'\xd3\xd3\xd3\xd3\xd3\xd3\xd3\xd3\xd3\xd3\xd3\xd3\r\xd3\r\xd3\xd3\xd3\xd3\r\r\r\xd3\r\xd3\xd3\xd3\xd3\xd3\xd3\xd3\r\r\xd3\xd3\xd3\xd3\xd3\xd3\xd3\xaa\x89\xaa\x89\xaa\x89\xaa\x89\xaa\x89\xaa\x89\xaa\x89wwwwwwwwwv' +'yyyyyyyyyxyyyyyyyyyx\xd3\r\r\r\xd3\xd3\xd3\xd3\xd3\xd3\xd3\xd3\xd3\xd3\xd3\xd3\xd3\xd3\xd3\xd3\xd3\xd3\xd3\xd3\xd3\xd3\xd3\xd3\r\xd3\xd3\xd3\xd3\xd3\xd3\xd3\xd3\xd3\xd3\xd3\xd3\xd3\xd3\r' +'\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\xc5\xc5\xc5\xc6\xc6\xc6\xc6\xc5\xc5\xc5\xc5\xc5\xc6\xc6\xc6\xc5\xc5\xc5\xc6\xc6\xc6\xc6\xab\x8a\xab\x8a\xab\x8a\r\r\r\r\xc5\xc5\xc5\xc5\xc5\xc5\xc5\xc5\xc5\xc5\xc5\xc5\xc5\xc5\xc5\xc5' +'\xd3\xd3\xd3\xd3\xd3\xd3\xd3\xd3\xd3\xd3\xd3\xd3\xd3\xd3\xd3\xd3\xd3\xd3\xd3\xd3\xd3\xd3\xd3\xd3\xd3\xd3\xd3\xd3\xd3\xd3\xd3\xd3\xd3\xd3\xd3\xd3\xd3\xd3\xd3\xd3\xd3\xd3\xd3\xd3\xd3\xd3\xd3\xd3\xd3\xd3\xd3\xd3\xd3\xd3\xd3\xd3\xd3\xd3\xd3\xd3\xd3\xd3\xd3\xd3' +'\xd3\xd3\xd3\xd3\xd3\xd3\xd3\xd3\xd3\xd3\xd3\xd3\xd3\xd3\xd3\xd3\xd3\xd3\xd3\xd3\xd3\xd3\xd3\xd3\xd3\xd3\xd3\xd3\xd3\xd3\xd3\xd3\xd3\xd3\xd3\xd3\xd3\xd3\xd3\xd3\xd3\xd3\xd3\xd3\xd3\xd3\xd3\xd3\xd3\xd3\xd3\xd3\xd3\xd3\xd3\xd3\xd3\xd3\xd3\xd3\xd3\xd3\xd3\xd3' +'\xd3\xd3\xd3\xd3\xd3\xd3\xd3\xd3\xd3\xd3\xd3\xd3\xd3\xd3\xd3\xd3\xd3\xd3\xd3\xd3\xd3\xd3\xd3\xd3\xd3\xd3\xd3\xd3\xd3\xd3\xd3\xd3\xd3\xd3\xd3\xd3\xd3\xd3\xd3\xd3\xd3\xd3\xd3\xd3\xd3\xd3\xd3\xd3\xd3\xd3\xd3\xd3\xd3\xd3\xd3\xd3\xd3\xd3\xd3\xd3\xd3\xd3\xd3\xd3' +'\xd3\xd3\xd3\xd3\xd3\xd3\xd3\xd3\xd3\xd3\xd3\xd3\xd3\xd3\xd3\xd3\xd3\xd3\xd3\xd3\xd3\xd3\xd3\xd3\xd3\xd3\xd3\xd3\xd3\xd3\xd3\xd3\xd3\xd3\xd3\xd3\xd3\xd3\xd3\xd3\xd3\xd3\xd3\xd3\xd3\xd3\xd3\xd3\xd3\xd3\xd3\xd3\xd3\xd3\xd3\xd3\xd3\xd3\xd3\xd3\xd3\xd3\xd3\xd3' +'\xc5\xc5\xc5\xc5\xc5\xc5\xc5\xc5\xc5\xc5\xc5\xc5\xc5\xc5\xc5\xc5\xc5\xc5\xc5\xc5\xc5\xc5\xc5\xc5\xc5\xc5\xc5\xc5\xc5\xc5\xc5\xc5\xc5\xc5\xc5\xc5\xc5\xc5\xc5\xc5\xc5\xc5\xc5\xc5\xc5\xc5\xc5\xc5\xc5\xc5\xc5\xc5\xc5\xc5\xc5\xc5\xc5\xc5\xc5\xc5\xc5\xc5\xc5\xc5' +'\xc5\xc5\xc5\xc5\xc5\xc5\xc5\xc5\xc5\xc5\xc5\xc5\xc5\xc5\xc5\xc5\xc5\xc5\xc5\xc5\xc5\xc5\xc5\xc5\xc5\xc5\xc5\xc5\xc5\xc5\xc5\xc5\xc5\xc5\xc5\xc5\xc5\xc5\xc5\xc5\xc5\xc5\xc5\xc5\xc5\xc5\xc5\xc5\xc5\xc5\xc5\xc5\xc5\xc5\xc5\xc5\xc5\xc5\xc5\xc5\xc5\xc5\xc5\xc5' +'\xc5\xc5\xc5\xaa\x89\xab\x8a\xaa\x89\xaa\x89\xaa\x89\xaa\x89\xaa\x89\xaa\x89\xaa\x89\xaa\x89\xaa\x89\xc5\xc5\xc6\xc6\xc6\xc6\xc6\xc6\xc6\xc6\xc6\xc6\xc6\xc6\xc6\xc6\xc6\xc6\xc6\xc6\xc6\xc6\xc6\xc5\xc5\xc5\xc5\xc5\xc5\xc5\xc5\xc6\xc5\xc5\xc5\xc5\xc5\xc5\xc5' +'\xc6\xc6\xc6\xc6\xc6\xc6\xc5\xc5\xc5\xc6\xc5\xc5\xc5\xc5\xc6\xc6\xc6\xc6\xc6\xc5\xc6\xc6\xc5\xc5\xaa\x89\xaa\x89\xc6\xc5\xc5\xc5\xc5\xc6\xc5\xc6\xc6\xc6\xc5\xc5\xc6\xc6\xc5\xc5\xc5\xc5\xc5\xc5\xc5\xc5\xc5\xc5\xc6\xc6\xc6\xc6\xc6\xc6\xc5\xc5\xaa\x89\xc5\xc5' +'\xc5\xc5\xc5\xc5\xc5\xc5\xc5\xc5\xc5\xc5\xc6\xc6\xc6\xc6\xc6\xc6\xc6\xc6\xc6\xc6\xc6\xc6\xc6\xc6\xc6\xc6\xc6\xc6\xc6\xc5\xc6\xc6\xc6\xc6\xc5\xc5\xc6\xc5\xc6\xc5\xc5\xc6\xc5\xc6\xc6\xc6\xc6\xc5\xc5\xc5\xc5\xc5\xc6\xc6\xc5\xc5\xc5\xc5\xc5\xc5\xc6\xc6\xc6\xc5' +'\xc5\xc5\xc5\xc5\xc5\xc5\xc5\xc5\xc5\xc5\xc5\xc5\xc5\xc5\xc5\xc5\xc5\xc5\xc5\xc5\xc5\xc5\xc5\xc6\xc6\xc5\xc5\xc5\xc5\xc5\xc5\xc5\xc5\xc5\xc5\xc5\xc6\xc6\xc5\xc5\xc5\xc5\xc6\xc6\xc6\xc6\xc5\xc6\xc6\xc5\xc5\xc6\xc6\xc5\xc5\xc5\xc5\xc6\xc6\xc6\xc6\xc6\xc6\xc6' +'\xc6\xc6\xc6\xc6\xc6\xc6\xc6\xc6\xc6\xc6\xc6\xc6\xc6\xc6\xc6\xc6\xc6\xc6\xc6\xc6\xc6\xc6\xc6\xc6\xc6\xc6\xc6\xc6\xc6\xc6\xc6\xc6\xc6\xc6\xc6\xc6\xc5\xc5\xc6\xc6\xc6\xc6\xc6\xc6\xc6\xc6\xc5\xc6\xc6\xc6\xc6\xc6\xc6\xc6\xc6\xc6\xc6\xc6\xc6\xc6\xc6\xc6\xc6\xc6' +'\xc6\xc6\xc6\xc6\xc6\xc6\xc6\xc6\xc6\xc6\xc6\xc6\xc6\xc6\xc6\xc6\xc6\xc6\xc6\xc6\xc6\xc6\xc6\xc5\xc5\xc5\xc5\xc5\xc6\xc5\xc6\xc5\xc5\xc5\xc6\xc6\xc6\xc6\xc6\xc5\xc5\xc5\xc5\xc5\xc6\xc6\xc6\xc5\xc5\xc5\xc5\xc6\xc5\xc5\xc5\xc6\xc6\xc6\xc6\xc6\xc5\xc6\xc5\xc5' '\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r' '\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r' -'\xd4\xd4\xd4\xd4\xd4\xd4\xd4\xd4\xd4\xd4\xd4\xd4\xd4\xd4\xd4\xd4\xd4\xd4\xd4\xd4\xd4\xd4\xd4\xd4\xd4\xd4\r\xd4\xd4\xd4\xd4\xd4\xd4\xd4\xd4\xd4\xd4\xd4\xd4\xd4\xd4\xd4\xd4\xd4\xd4\xd4\xd4\xd4\xd4\xd4\xd4\xd4\xd4\xd4\xd4\xd4\xd4\xd4\xd4\xd4\xd4\xd4\xd4\xd4' -'\xd4\xd4\xd4\xd4\xd4\xd4\xd4\xd4\xd4\xd4\xd4\xd4\xd4\xd4\xd4\xd4\xd4\xd4\xd4\xd4\xd4\xd4\xd4\xd4\xd4\xd4\xd4\xd4\xd4\xd4\xd4\xd4\xd4\xd4\xd4\xd4\xd4\xd4\xd4\xd4\xd4\xd4\xd4\xd4\xd4\xd4\xd4\xd4\xd4\xd4\xd4\xd4\r\r\r\r\r\r\r\r\r\r\r\r' -'\xd4\xd4\xd4\xd4\xd4\xd4\xd4\xd4\xd4\xd4\xd4\xd4\xd4\xd4\xd4\xd4\xd4\xd4\xd4\xd4\xd4\xd4\xd4\xd4\xd4\xd4\xd4\xd4\xd4\xd4\xd4\xd4\xd4\xd4\xd4\xd4\xd4\xd4\xd4\xd4\xd4\xd4\xd4\xd4\xd4\xd4\xd4\xd4\xd4\xd4\xd4\xd4\xd4\xd4\xd4\xd4\xd4\xd4\xd4\xd4\xd4\xd4\xd4\xd4' -'\xd4\xd4\xd4\xd4\xd4\xd4\xd4\xd4\xd4\xd4\xd4\xd4\xd4\xd4\xd4\xd4\xd4\xd4\xd4\xd4\xd4\xd4\xd4\xd4\xd4\xd4\xd4\xd4\xd4\xd4\xd4\xd4\xd4\xd4\xd4\xd4\xd4\xd4\xd4\xd4\xd4\xd4\xd4\xd4\xd4\xd4\xd4\xd4\xd4\xd4\xd4\xd4\xd4\xd4\xd4\xd4\xd4\xd4\xd4\xd4\xd4\xd4\xd4\xd4' -'\xd4\xd4\xd4\xd4\xd4\xd4\xd4\xd4\xd4\xd4\xd4\xd4\xd4\xd4\xd4\xd4\xd4\xd4\xd4\xd4\xd4\xd4\xd4\xd4\xd4\xd4\xd4\xd4\xd4\xd4\xd4\xd4\xd4\xd4\xd4\xd4\xd4\xd4\xd4\xd4\xd4\xd4\xd4\xd4\xd4\xd4\xd4\xd4\xd4\xd4\xd4\xd4\xd4\xd4\xd4\xd4\xd4\xd4\xd4\xd4\xd4\xd4\xd4\xd4' -'\xd4\xd4\xd4\xd4\xd4\xd4\xd4\xd4\xd4\xd4\xd4\xd4\xd4\xd4\xd4\xd4\xd4\xd4\xd4\xd4\xd4\xd4\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\xd4\xd4\xd4\xd4\xd4\xd4\xd4\xd4\xd4\xd4\xd4\xd4\r\r\r\r' -'\xd9\xa4\xa4\xa4\xd4\x18\x1cl\xac\x8b\xac\x8b\xac\x8b\xac\x8b\xac\x8b\xd4\xd4\xac\x8b\xac\x8b\xac\x8b\xac\x8b\x84\xab\x8a\x8a\xd4lllllllll_bc`aa\x84\x18\x18\x18\x18\x18\xd4\xd4lll\x18\x1c\xa4\xd4\xd2' +'\xd5\xd5\xd5\xd5\xd5\xd5\xd5\xd5\xd5\xd5\xd5\xd5\xd5\xd5\xd5\xd5\xd5\xd5\xd5\xd5\xd5\xd5\xd5\xd5\xd5\xd5\r\xd5\xd5\xd5\xd5\xd5\xd5\xd5\xd5\xd5\xd5\xd5\xd5\xd5\xd5\xd5\xd5\xd5\xd5\xd5\xd5\xd5\xd5\xd5\xd5\xd5\xd5\xd5\xd5\xd5\xd5\xd5\xd5\xd5\xd5\xd5\xd5\xd5' +'\xd5\xd5\xd5\xd5\xd5\xd5\xd5\xd5\xd5\xd5\xd5\xd5\xd5\xd5\xd5\xd5\xd5\xd5\xd5\xd5\xd5\xd5\xd5\xd5\xd5\xd5\xd5\xd5\xd5\xd5\xd5\xd5\xd5\xd5\xd5\xd5\xd5\xd5\xd5\xd5\xd5\xd5\xd5\xd5\xd5\xd5\xd5\xd5\xd5\xd5\xd5\xd5\r\r\r\r\r\r\r\r\r\r\r\r' +'\xd5\xd5\xd5\xd5\xd5\xd5\xd5\xd5\xd5\xd5\xd5\xd5\xd5\xd5\xd5\xd5\xd5\xd5\xd5\xd5\xd5\xd5\xd5\xd5\xd5\xd5\xd5\xd5\xd5\xd5\xd5\xd5\xd5\xd5\xd5\xd5\xd5\xd5\xd5\xd5\xd5\xd5\xd5\xd5\xd5\xd5\xd5\xd5\xd5\xd5\xd5\xd5\xd5\xd5\xd5\xd5\xd5\xd5\xd5\xd5\xd5\xd5\xd5\xd5' +'\xd5\xd5\xd5\xd5\xd5\xd5\xd5\xd5\xd5\xd5\xd5\xd5\xd5\xd5\xd5\xd5\xd5\xd5\xd5\xd5\xd5\xd5\xd5\xd5\xd5\xd5\xd5\xd5\xd5\xd5\xd5\xd5\xd5\xd5\xd5\xd5\xd5\xd5\xd5\xd5\xd5\xd5\xd5\xd5\xd5\xd5\xd5\xd5\xd5\xd5\xd5\xd5\xd5\xd5\xd5\xd5\xd5\xd5\xd5\xd5\xd5\xd5\xd5\xd5' +'\xd5\xd5\xd5\xd5\xd5\xd5\xd5\xd5\xd5\xd5\xd5\xd5\xd5\xd5\xd5\xd5\xd5\xd5\xd5\xd5\xd5\xd5\xd5\xd5\xd5\xd5\xd5\xd5\xd5\xd5\xd5\xd5\xd5\xd5\xd5\xd5\xd5\xd5\xd5\xd5\xd5\xd5\xd5\xd5\xd5\xd5\xd5\xd5\xd5\xd5\xd5\xd5\xd5\xd5\xd5\xd5\xd5\xd5\xd5\xd5\xd5\xd5\xd5\xd5' +'\xd5\xd5\xd5\xd5\xd5\xd5\xd5\xd5\xd5\xd5\xd5\xd5\xd5\xd5\xd5\xd5\xd5\xd5\xd5\xd5\xd5\xd5\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\xd5\xd5\xd5\xd5\xd5\xd5\xd5\xd5\xd5\xd5\xd5\xd5\r\r\r\r' +'\xda\xa5\xa5\xa5\xd5\x18\x1cm\xad\x8c\xad\x8c\xad\x8c\xad\x8c\xad\x8c\xd5\xd5\xad\x8c\xad\x8c\xad\x8c\xad\x8c\x85\xac\x8b\x8b\xd5mmmmmmmmm`cdabb\x85\x18\x18\x18\x18\x18\xd5\xd5mmm\x18\x1c\xa5\xd5\xd3' '\r\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c' -'\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\r\r^^\xb8\xb8\x18\x18\x1c\x84\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c' -'\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c~\x18\x18\x18\x1c' +'\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\r\r__\xb9\xb9\x18\x18\x1c\x85\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c' +'\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x7f\x18\x18\x18\x1c' '\r\r\r\r\r\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\r\r\r\r\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c' '\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c' -'\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\r\xce\xcetttt\xce\xce\xce\xce\xce\xce\xce\xce\xce\xce\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\r\r\r\r\r\r\r\r' +'\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\r\xcf\xcfuuuu\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\r\r\r\r\r\r\r\r' '\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c' -'\xce\xce\xce\xce\xce\xce\xce\xce\xce\xce\xce\xce\xce\xce\xce\xce\xce\xce\xce\xce\xce\xce\xce\xce\xce\xce\xce\xce\xce\r\r\rtttttttttt\xce\xce\xce\xce\xce\xce\xce\xce\xce\xce\xce\xce\xce\xce\xce\xce\xce\xce\xce\xce\xce\xce' -'\xce\xce\xce\xce\r\r\r\r\r\r\r\r\r\r\r\r\ryyyyyyyyyyyyyyy\xce\xce\xce\xce\xce\xce\xce\xce\xce\xce\xce\xce\xce\xce\xce\xce\xce\xce\xce\xce\xce\xce\xce\xce\xce\xce\xce\xce\r\r\r\xce' -'tttttttttt\xce\xce\xce\xce\xce\xce\xce\xce\xce\xce\xce\xce\xce\xce\xce\xce\xce\xce\xce\xce\xce\xce\xce\xce\xce\xce\xce\xce\xce\xce\xce\xce\xce\xce\xce\xce\xce\xce\xceyyyyyyyyyyyyyyy' -'\xce\xce\xce\xce\xce\xce\xce\xce\xce\xce\xce\xce\r\r\r\r\xce\xce\xce\xce\xce\xce\xce\xce\xce\xce\xce\xce\xce\xce\xce\xce\xce\xce\xce\xce\xce\xce\xce\xce\xce\xce\xce\xce\xce\xce\xce\xce\xce\xce\xce\xce\xce\xce\xce\xce\xce\xce\xce\xce\xce\xce\xce\r' -'\xce\xce\xce\xce\xce\xce\xce\xce\xce\xce\xce\xce\xce\xce\xce\xce\xce\xce\xce\xce\xce\xce\xce\xce\xce\xce\xce\xce\xce\xce\xce\xce\xce\xce\xce\xce\xce\xce\xce\xce\xce\xce\xce\xce\xce\xce\xce\xce\xce\xce\xce\xce\xce\xce\xce\xce\xce\xce\xce\xce\xce\xce\xce\xce' -'\xce\xce\xce\xce\xce\xce\xce\xce\xce\xce\xce\xce\xce\xce\xce\xce\xce\xce\xce\xce\xce\xce\xce\xce\xce\xce\xce\xce\xce\xce\xce\xce\xce\xce\xce\xce\xce\xce\xce\xce\xce\xce\xce\xce\xce\xce\xce\xce\xce\xce\xce\xce\xce\xce\xce\r\r\r\r\xce\xce\xce\xce\xce' -'\xce\xce\xce\xce\xce\xce\xce\xce\xce\xce\xce\xce\xce\xce\xce\xce\xce\xce\xce\xce\xce\xce\xce\xce\xce\xce\xce\xce\xce\xce\xce\xce\xce\xce\xce\xce\xce\xce\xce\xce\xce\xce\xce\xce\xce\xce\xce\xce\xce\xce\xce\xce\xce\xce\xce\xce\xce\xce\xce\xce\xce\xce\xce\xce' -'\xce\xce\xce\xce\xce\xce\xce\xce\xce\xce\xce\xce\xce\xce\xce\xce\xce\xce\xce\xce\xce\xce\xce\xce\xce\xce\xce\xce\xce\xce\r\r\xce\xce\xce\xce\xce\xce\xce\xce\xce\xce\xce\xce\xce\xce\xce\xce\xce\xce\xce\xce\xce\xce\xce\xce\xce\xce\xce\xce\xce\xce\xce\r' +'\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\r\r\ruuuuuuuuuu\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf' +'\xcf\xcf\xcf\xcf\r\r\r\r\r\r\r\r\r\r\r\r\rzzzzzzzzzzzzzzz\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\r\r\r\xcf' +'uuuuuuuuuu\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcfzzzzzzzzzzzzzzz' +'\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\r\r\r\r\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\r' +'\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf' +'\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\r\r\r\r\xcf\xcf\xcf\xcf\xcf' +'\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf' +'\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\r\r\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\r' '\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c' '\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c' '\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c' @@ -14356,14 +14357,90 @@ '\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c' '\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\r\r\r\r\r\r\r\r\r\r' '\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r' +'\x1d\x1c\x1c\x1d\x1c\x1c\x1c\x1d\x1c\x1d\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c' +'\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1d\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c' +'\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1d\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1d\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1d\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1d' +'\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1d\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c' +'\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1d\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c' +'\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1d\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c' +'\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c' +'\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c' +'\x1c\x1c\x1c\x1c\x1d\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c' +'\x1c\x1c\x1c\x1c\x1c\x1c\x1d\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1d\x1c\x1d\x1c\x1d\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c' +'\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c' +'\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c' +'\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c' +'\x1c\x1d\x1c\x1d\x1c\x1d\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c' +'\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c' +'\x1c\x1d\x1d\x1d\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c' +'\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c' +'\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c' +'\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c' +'\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1d\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c' +'\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c' +'\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c' +'\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1d\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c' +'\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c' +'\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c' +'\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c' +'\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c' +'\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1d\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1d\x1c\x1c\x1c\x1c\x1c\x1c' +'\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c' +'\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c' +'\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c' +'\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1d' +'\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1d\x1d\x1d\x1c\x1d\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c' +'\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c' +'\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c' +'\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c' +'\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c' +'\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c' +'\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c' +'\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1d\x1c' +'\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c' +'\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1d\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c' +'\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c' +'\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c' +'\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c' +'\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c' +'\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c' +'\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1d\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c' +'\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c' +'\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c' +'\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1d\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c' +'\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c' +'\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c' +'\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1d\x1c' +'\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c' +'\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c' +'\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c' +'\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c' +'\x1c\x1c\x1c\x1c\x1c\x1c\x1d\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c' +'\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c' +'\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1d\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c' +'\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c' +'\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c' +'\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c' +'\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c' +'\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c' +'\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1d\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c' +'\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c' +'\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1d\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c' +'\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c' +'\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c' +'\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c' +'\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c' +'\x1c\x1c\x1c\x1c\x1c\x1c\x1d\x1c\x1c\x1c\x1c\x1c\x1d\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1d\x1c\x1c\x1c\x1c\x1c\x1c\x1c' +'\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c' +'\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1d\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c' '\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c' '\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c' '\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r' '\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r' '\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c' '\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c' -'\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\r\r\r\xd4\xd4\xd4\xd4\xd4\xd4\xd4\xd4\xd4\xd4\xd4\xd4\xd4\xd4\xd4\xd4\xd4\xd4\xd4\xd4\xd4\xd4\xd4\xd4\xd4\xd4\xd4\xd4\xd4\xd4\xd4\xd4\xd4\xd4\xd4\xd4\xd4\xd4\xd4\xd4\xd4\xd4\xd4\xd4\xd4\xd4\xd4\xd4' -'\xd4\xd4\xd4\xd4\xd4\xd4\xd4\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r' +'\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\r\r\r\xd5\xd5\xd5\xd5\xd5\xd5\xd5\xd5\xd5\xd5\xd5\xd5\xd5\xd5\xd5\xd5\xd5\xd5\xd5\xd5\xd5\xd5\xd5\xd5\xd5\xd5\xd5\xd5\xd5\xd5\xd5\xd5\xd5\xd5\xd5\xd5\xd5\xd5\xd5\xd5\xd5\xd5\xd5\xd5\xd5\xd5\xd5\xd5' +'\xd5\xd5\xd5\xd5\xd5\xd5\xd5\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r' '\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c' '\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c' '\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r' @@ -14380,58 +14457,58 @@ '\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r' '\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r' '\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r' -'\x12\x12\x12\x12\x12\x12\x12\r\r\r\r\r\r\r\r\r\r\r\r\x12\x12\x12\x12\x12\r\r\r\r\r\x1dE\x1d\x1d\x1d\x1d\x1d\x1d\x1d\x1d\x1d\x1d\xbb\x1d\x1d\x1d\x1d\x1d\x1d\x1d\x1d\x1d\x1d\x1d\x1d\x1d\r\x1d\x1d\x1d\x1d\x1d\r\x1d\r' -'\x1d\x1d\r\x1d\x1d\r\x1d\x1d\x1d\x1d\x1d\x1d\x1d\x1d\x1d\x1d\x19\x19\x19\x19\x19\x19\x19\x19\x19\x19\x19\x19\x19\x19\x19\x19\x19\x19\x19\x19\x19\x19\x19\x19\x19\x19\x19\x19\x19\x19\x19\x19\x19\x19\x19\x19\x19\x19\x19\x19\x19\x19\x19\x19\x19\x19\x19\x19' +'\x12\x12\x12\x12\x12\x12\x12\r\r\r\r\r\r\r\r\r\r\r\r\x12\x12\x12\x12\x12\r\r\r\r\r\x1eF\x1e\x1e\x1e\x1e\x1e\x1e\x1e\x1e\x1e\x1e\xbc\x1e\x1e\x1e\x1e\x1e\x1e\x1e\x1e\x1e\x1e\x1e\x1e\x1e\r\x1e\x1e\x1e\x1e\x1e\r\x1e\r' +'\x1e\x1e\r\x1e\x1e\r\x1e\x1e\x1e\x1e\x1e\x1e\x1e\x1e\x1e\x1e\x19\x19\x19\x19\x19\x19\x19\x19\x19\x19\x19\x19\x19\x19\x19\x19\x19\x19\x19\x19\x19\x19\x19\x19\x19\x19\x19\x19\x19\x19\x19\x19\x19\x19\x19\x19\x19\x19\x19\x19\x19\x19\x19\x19\x19\x19\x19\x19' '\x19\x19\x19\x19\x19\x19\x19\x19\x19\x19\x19\x19\x19\x19\x19\x19\x19\x19\x19\x19\x19\x19\x19\x19\x19\x19\x19\x19\x19\x19\x19\x19\x19\x19\x19\x19\x19\x19\x19\x19\x19\x19\x19\x19\x19\x19\x19\x19\x19\x19\r\r\r\r\r\r\r\r\r\r\r\r\r\r' '\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\x19\x19\x19\x19\x19\x19\x19\x19\x19\x19\x19\x19\x19\x19\x19\x19\x19\x19\x19\x19\x19\x19\x19\x19\x19\x19\x19\x19\x19\x19\x19\x19\x19\x19\x19\x19\x19\x19\x19\x19\x19\x19\x19\x19\x19' '\x19\x19\x19\x19\x19\x19\x19\x19\x19\x19\x19\x19\x19\x19\x19\x19\x19\x19\x19\x19\x19\x19\x19\x19\x19\x19\x19\x19\x19\x19\x19\x19\x19\x19\x19\x19\x19\x19\x19\x19\x19\x19\x19\x19\x19\x19\x19\x19\x19\x19\x19\x19\x19\x19\x19\x19\x19\x19\x19\x19\x19\x19\x19\x19' '\x19\x19\x19\x19\x19\x19\x19\x19\x19\x19\x19\x19\x19\x19\x19\x19\x19\x19\x19\x19\x19\x19\x19\x19\x19\x19\x19\x19\x19\x19\x19\x19\x19\x19\x19\x19\x19\x19\x19\x19\x19\x19\x19\x19\x19\x19\x19\x19\x19\x19\x19\x19\x19\x19\x19\x19\x19\x19\x19\x19\x19\x19\x19\x19' '\x19\x19\x19\x19\x19\x19\x19\x19\x19\x19\x19\x19\x19\x19\x19\x19\x19\x19\x19\x19\x19\x19\x19\x19\x19\x19\x19\x19\x19\x19\x19\x19\x19\x19\x19\x19\x19\x19\x19\x19\x19\x19\x19\x19\x19\x19\x19\x19\x19\x19\x19\x19\x19\x19\x19\x19\x19\x19\x19\x19\x19\x19\x19\x19' '\x19\x19\x19\x19\x19\x19\x19\x19\x19\x19\x19\x19\x19\x19\x19\x19\x19\x19\x19\x19\x19\x19\x19\x19\x19\x19\x19\x19\x19\x19\x19\x19\x19\x19\x19\x19\x19\x19\x19\x19\x19\x19\x19\x19\x19\x19\x19\x19\x19\x19\x19\x19\x19\x19\x19\x19\x19\x19\x19\x19\x19\x19\x19\x19' -'\x19\x19\x19\x19\x19\x19\x19\x19\x19\x19\x19\x19\x19\x19\x19\x19\x19\x19\x19\x19\x19\x19\x19\x19\x19\x19\x19\x19\x19\x19\x19\x19\x19\x19\x19\x19\x19\x19\x19\x19\x19\x19\x19\x19\x19\x19\x19\x19\x19\x19\x19\x19\x19\x19\x19\x19\x19\x19\x19\x19\x19\x19\xa8\x87' +'\x19\x19\x19\x19\x19\x19\x19\x19\x19\x19\x19\x19\x19\x19\x19\x19\x19\x19\x19\x19\x19\x19\x19\x19\x19\x19\x19\x19\x19\x19\x19\x19\x19\x19\x19\x19\x19\x19\x19\x19\x19\x19\x19\x19\x19\x19\x19\x19\x19\x19\x19\x19\x19\x19\x19\x19\x19\x19\x19\x19\x19\x19\xa9\x88' '\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\x19\x19\x19\x19\x19\x19\x19\x19\x19\x19\x19\x19\x19\x19\x19\x19\x19\x19\x19\x19\x19\x19\x19\x19\x19\x19\x19\x19\x19\x19\x19\x19\x19\x19\x19\x19\x19\x19\x19\x19\x19\x19\x19\x19\x19\x19\x19\x19' '\x19\x19\x19\x19\x19\x19\x19\x19\x19\x19\x19\x19\x19\x19\x19\x19\r\r\x19\x19\x19\x19\x19\x19\x19\x19\x19\x19\x19\x19\x19\x19\x19\x19\x19\x19\x19\x19\x19\x19\x19\x19\x19\x19\x19\x19\x19\x19\x19\x19\x19\x19\x19\x19\x19\x19\x19\x19\x19\x19\x19\x19\x19\x19' -'\x19\x19\x19\x19\x19\x19\x19\x19\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\x19\x19\x19\x19\x19\x19\x19\x19\x19\x19\x19\x19\xad\r\r\r' -"''''''''''''''''\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r]]]]\r\r\r\r\r\r\r\r\r\r\r\r\xa4\x84\x84~~\xab\x8a\xab\x8a\xab\x8a\xab\x8a\xab\x8a\xab" -'\x8a\xab\x8a\xab\x8a\xa4\xa4\r\r\xa4\xa4\xa4\xa4~~~\x96\xa4\x96\r\xa4\x96\xa4\xa4\x84\xab\x8a\xab\x8a\xab\x8a\x9d\xa4\xa4\xbd\x81\xc8\xc8\xc8\r\xa4\xb3\x9d\xa4\r\r\r\r\x19\x19\x19\x19\x19\r\x19\x19\x19\x19\x19\x19\x19\x19\x19\x19' +'\x19\x19\x19\x19\x19\x19\x19\x19\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\x19\x19\x19\x19\x19\x19\x19\x19\x19\x19\x19\x19\xae\r\r\r' +'((((((((((((((((\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r^^^^\r\r\r\r\r\r\r\r\r\r\r\r\xa5\x85\x85\x7f\x7f\xac\x8b\xac\x8b\xac\x8b\xac\x8b\xac\x8b\xac' +'\x8b\xac\x8b\xac\x8b\xa5\xa5\r\r\xa5\xa5\xa5\xa5\x7f\x7f\x7f\x97\xa5\x97\r\xa5\x97\xa5\xa5\x85\xac\x8b\xac\x8b\xac\x8b\x9e\xa5\xa5\xbe\x82\xc9\xc9\xc9\r\xa5\xb4\x9e\xa5\r\r\r\r\x19\x19\x19\x19\x19\r\x19\x19\x19\x19\x19\x19\x19\x19\x19\x19' '\x19\x19\x19\x19\x19\x19\x19\x19\x19\x19\x19\x19\x19\x19\x19\x19\x19\x19\x19\x19\x19\x19\x19\x19\x19\x19\x19\x19\x19\x19\x19\x19\x19\x19\x19\x19\x19\x19\x19\x19\x19\x19\x19\x19\x19\x19\x19\x19\x19\x19\x19\x19\x19\x19\x19\x19\x19\x19\x19\x19\x19\x19\x19\x19' '\x19\x19\x19\x19\x19\x19\x19\x19\x19\x19\x19\x19\x19\x19\x19\x19\x19\x19\x19\x19\x19\x19\x19\x19\x19\x19\x19\x19\x19\x19\x19\x19\x19\x19\x19\x19\x19\x19\x19\x19\x19\x19\x19\x19\x19\x19\x19\x19\x19\x19\x19\x19\x19\x19\x19\x19\x19\x19\x19\x19\x19\r\r\x05' -'\r\xa0\xa0\x9a\xaf\x9a\xa0\xa0\xa6\x85\xa0\xba\x93\x7f\x93\x97eeeeeeeeee\x93\xa0\xc2\xc1\xc2\xa0\xa0 \xa6\xa0\x85\xb5z' -'\xb5\x11\x11\x11\x11\x11\x11\x11\x11\x11\x11\x11\x11\x11\x11\x11\x11\x11\x11\x11\x11\x11\x11\x11\x11\x11\x11\xa6\xc1\x85\xc1\xa6\x85\xa1\xa7\x86\xa1{\x1a\x1a\x1a\x1a\x1a\x1a\x1a\x1a\x1a\x1a\x16\x1a\x1a\x1a\x1a\x1a\x1a\x1a\x1a\x1a\x1a\x1a\x1a\x1a\x1a\x1a' +'\r\xa1\xa1\x9b\xb0\x9b\xa1\xa1\xa7\x86\xa1\xbb\x94\x80\x94\x98ffffffffff\x94\xa1\xc3\xc2\xc3\xa1\xa1!!!!!!!!!!!!!!!!!!!!!!!!!!\xa7\xa1\x86\xb6{' +'\xb6\x11\x11\x11\x11\x11\x11\x11\x11\x11\x11\x11\x11\x11\x11\x11\x11\x11\x11\x11\x11\x11\x11\x11\x11\x11\x11\xa7\xc2\x86\xc2\xa7\x86\xa2\xa8\x87\xa2|\x1a\x1a\x1a\x1a\x1a\x1a\x1a\x1a\x1a\x1a\x16\x1a\x1a\x1a\x1a\x1a\x1a\x1a\x1a\x1a\x1a\x1a\x1a\x1a\x1a\x1a' '\x1a\x1a\x1a\x1a\x1a\x1a\x1a\x1a\x1a\x1a\x1a\x1a\x1a\x1a\x1a\x1a\x1a\x1a\x1a\x1a\x1a\x1a\x1a\x1a\x1a\x1a\x1a\x1a\x1a\x1a\x16\x16\x1a\x1a\x1a\x1a\x1a\x1a\x1a\x1a\x1a\x1a\x1a\x1a\x1a\x1a\x1a\x1a\x1a\x1a\x1a\x1a\x1a\x1a\x1a\x1a\x1a\x1a\x1a\x1a\x1a\x1a\x1a\r' -'\r\r\x1a\x1a\x1a\x1a\x1a\x1a\r\r\x1a\x1a\x1a\x1a\x1a\x1a\r\r\x1a\x1a\x1a\x1a\x1a\x1a\r\r\x1a\x1a\x1a\r\r\r\xaf\xaf\xc1\xb5\xd0\xaf\xaf\r\xd1\xc3\xc3\xc3\xc3\xd1\xd1\r\r\r\r\r\r\r\r\r\r\x05\x05\x05\xd2\xcf\r\r' -'\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\rssss\r\r\r\r\r\r\r\r\r\r\r\r\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b' -'\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1bj\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r' +'\r\r\x1a\x1a\x1a\x1a\x1a\x1a\r\r\x1a\x1a\x1a\x1a\x1a\x1a\r\r\x1a\x1a\x1a\x1a\x1a\x1a\r\r\x1a\x1a\x1a\r\r\r\xb0\xb0\xc2\xb6\xd1\xb0\xb0\r\xd2\xc4\xc4\xc4\xc4\xd2\xd2\r\r\r\r\r\r\r\r\r\r\x05\x05\x05\xd3\xd0\r\r' +'\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\rtttt\r\r\r\r\r\r\r\r\r\r\r\r\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b' +'\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1bk\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r' '\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r' '\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r' -'!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!\r\r\x12\x12\x12\x12\x12\x12\x12\x12\x12\x12\x12\x12\x12\x12\x12\x12\x12\x12\x12\x12\x12\x12\x12\x12' +'""""""""""""""""""""""""""""""""""""""\r\r\x12\x12\x12\x12\x12\x12\x12\x12\x12\x12\x12\x12\x12\x12\x12\x12\x12\x12\x12\x12\x12\x12\x12\x12' '\x12\x12\x12\x12\x12\x12\x12\x12\x12\x12\x12\x12\x12\x12\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r' '\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r' '\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r' -'\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd' -'\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd' -'\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd' -'\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\r\r\r\r\r\r\r\r\r\r' -'\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\r\r\r\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd' -'\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd$$222\xcd\xcd\xcd%$$$$$\x05\x05\x05\x05\x05\x05\x05\x05ZZZZZ' -'ZZZ\xcd\xcd]]]]]ZZ\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd]]]]\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd' -'\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r' -'!!!!!!!!!!!!!!!!!!!!!!!!!!\x12\x12\x12\x12\x12\x12\x12\x12\x12\x12\x12\x12\x12\x12\x12\x12\x12\x12\x12\x12\x12\x12\x12\x12\x12\x12!!!!!!!!!!!!' -'!!!!!!!!!!!!!!\x12\x12\x12\x12\x12\x12\x12\r\x12\x12\x12\x12\x12\x12\x12\x12\x12\x12\x12\x12\x12\x12\x12\x12\x12\x12!!!!!!!!!!!!!!!!!!!!!!!!' -'!!\x12\x12\x12\x12\x12\x12\x12\x12\x12\x12\x12\x12\x12\x12\x12\x12\x12\x12\x12\x12\x12\x12\x12\x12\x12\x12!\r!!\r\r!\r\r!!\r\r!!!!\r!!!!!!!!\x12\x12\x12\x12\r\x12\r\x12\x12\x12' -'\x12\r\x12\x12\r\x12\x12\x12\x12\x12\x12\x12\x12\x12\x12\x12!!!!!!!!!!!!!!!!!!!!!!!!!!\x12\x12\x12\x12\x12\x12\x12\x12\x12\x12\x12\x12\x12\x12\x12\x12\x12\x12\x12\x12\x12\x12' -'\x12\x12\x12\x12!!\r!!!!\r\r!!!!!!!!\r!!!!!!!\r\x12\x12\x12\x12\x12\x12\x12\x12\x12\x12\x12\x12\x12\x12\x12\x12\x12\x12\x12\x12\x12\x12\x12\x12\x12\x12!!\r!!!!\r' -'!!!!!\r!\r\r\r!!!!!!!\r\x12\x12\x12\x12\x12\x12\x12\x12\x12\x12\x12\x12\x12\x12\x12\x12\x12\x12\x12\x12\x12\x12\x12\x12\x12\x12!!!!!!!!!!!!!!!!!!!!' -'!!!!!!\x12\x12\x12\x12\x12\x12\x12\x12\x12\x12\x12\x12\x12\x12\x12\x12\x12\x12\x12\x12\x12\x12\x12\x12\x12\x12!!!!!!!!!!!!!!!!!!!!!!!!!!\x12\x12\x12\x12\x12\x12' -'\x12\x12\x12\x12\x12\x12\x12\x12\x12\x12\x12\x12\x12\x12\x12\x12\x12\x12\x12\x12!!!!!!!!!!!!!!!!!!!!!!!!!!\x12\x12\x12\x12\x12\x12\x12\x12\x12\x12\x12\x12\x12\x12\x12\x12\x12\x12' -'\x12\x12\x12\x12\x12\x12\x12\x12!!!!!!!!!!!!!!!!!!!!!!!!!!\x12\x12\x12\x12\x12\x12\x12\x12\x12\x12\x12\x12\x12\x12\x12\x12\x12\x12\x12\x12\x12\x12\x12\x12\x12\x12!!!!' -'!!!!!!!!!!!!!!!!!!!!!!\x12\x12\x12\x12\x12\x12\x12\x12\x12\x12\x12\x12\x12\x12\x12\x12\x12\x12\x12\x12\x12\x12\x12\x12\x12\x12!!!!!!!!!!!!!!!!' -'!!!!!!!!!!\x12\x12\x12\x12\x12\x12\x12\x12\x12\x12\x12\x12\x12\x12\x12\x12\x12\x12\x12\x12\x12\x12\x12\x12\x12\x12\r\r\r\r!!!!!!!!!!!!!!!!!!!!!!!!' -'!\xbe\x12\x12\x12\x12\x12\x12\x12\x12\x12\x12\x12\x12\x12\x12\x12\x12\x12\x12\x12\x12\x12\x12\x12\x12\x12\xbe\x12\x12\x12\x12\x12\x12!!!!!!!!!!!!!!!!!!!!!!!!!\xbe\x12\x12\x12\x12' -'\x12\x12\x12\x12\x12\x12\x12\x12\x12\x12\x12\x12\x12\x12\x12\x12\x12\x12\x12\x12\x12\xbe\x12\x12\x12\x12\x12\x12!!!!!!!!!!!!!!!!!!!!!!!!!\xbe\x12\x12\x12\x12\x12\x12\x12\x12\x12\x12' -'\x12\x12\x12\x12\x12\x12\x12\x12\x12\x12\x12\x12\x12\x12\x12\xbe\x12\x12\x12\x12\x12\x12!!!!!!!!!!!!!!!!!!!!!!!!!\xbe\x12\x12\x12\x12\x12\x12\x12\x12\x12\x12\x12\x12\x12\x12\x12\x12' -'\x12\x12\x12\x12\x12\x12\x12\x12\x12\xbe\x12\x12\x12\x12\x12\x12!!!!!!!!!!!!!!!!!!!!!!!!!\xbe\x12\x12\x12\x12\x12\x12\x12\x12\x12\x12\x12\x12\x12\x12\x12\x12\x12\x12\x12\x12\x12\x12' -'\x12\x12\x12\xbe\x12\x12\x12\x12\x12\x12\r\r\r\rffffffffffffffffffffffffffffffffffffffffffffffffff' +'\xce\xce\xce\xce\xce\xce\xce\xce\xce\xce\xce\xce\xce\xce\xce\xce\xce\xce\xce\xce\xce\xce\xce\xce\xce\xce\xce\xce\xce\xce\xce\xce\xce\xce\xce\xce\xce\xce\xce\xce\xce\xce\xce\xce\xce\xce\xce\xce\xce\xce\xce\xce\xce\xce\xce\xce\xce\xce\xce\xce\xce\xce\xce\xce' +'\xce\xce\xce\xce\xce\xce\xce\xce\xce\xce\xce\xce\xce\xce\xce\xce\xce\xce\xce\xce\xce\xce\xce\xce\xce\xce\xce\xce\xce\xce\xce\xce\xce\xce\xce\xce\xce\xce\xce\xce\xce\xce\xce\xce\xce\xce\xce\xce\xce\xce\xce\xce\xce\xce\xce\xce\xce\xce\xce\xce\xce\xce\xce\xce' +'\xce\xce\xce\xce\xce\xce\xce\xce\xce\xce\xce\xce\xce\xce\xce\xce\xce\xce\xce\xce\xce\xce\xce\xce\xce\xce\xce\xce\xce\xce\xce\xce\xce\xce\xce\xce\xce\xce\xce\xce\xce\xce\xce\xce\xce\xce\xce\xce\xce\xce\xce\xce\xce\xce\xce\xce\xce\xce\xce\xce\xce\xce\xce\xce' +'\xce\xce\xce\xce\xce\xce\xce\xce\xce\xce\xce\xce\xce\xce\xce\xce\xce\xce\xce\xce\xce\xce\xce\xce\xce\xce\xce\xce\xce\xce\xce\xce\xce\xce\xce\xce\xce\xce\xce\xce\xce\xce\xce\xce\xce\xce\xce\xce\xce\xce\xce\xce\xce\xce\r\r\r\r\r\r\r\r\r\r' +'\xce\xce\xce\xce\xce\xce\xce\xce\xce\xce\xce\xce\xce\xce\xce\xce\xce\xce\xce\xce\xce\xce\xce\xce\xce\xce\xce\xce\xce\xce\xce\xce\xce\xce\xce\xce\xce\xce\xce\r\r\r\xce\xce\xce\xce\xce\xce\xce\xce\xce\xce\xce\xce\xce\xce\xce\xce\xce\xce\xce\xce\xce\xce' +'\xce\xce\xce\xce\xce\xce\xce\xce\xce\xce\xce\xce\xce\xce\xce\xce\xce\xce\xce\xce\xce\xce\xce\xce\xce\xce\xce\xce\xce\xce\xce\xce\xce\xce\xce\xce\xce%%333\xce\xce\xce&%%%%%\x05\x05\x05\x05\x05\x05\x05\x05[[[[[' +'[[[\xce\xce^^^^^[[\xce\xce\xce\xce\xce\xce\xce\xce\xce\xce\xce\xce\xce\xce\xce\xce\xce\xce\xce\xce\xce\xce\xce\xce\xce\xce\xce\xce\xce\xce^^^^\xce\xce\xce\xce\xce\xce\xce\xce\xce\xce\xce\xce\xce\xce\xce\xce\xce\xce' +'\xce\xce\xce\xce\xce\xce\xce\xce\xce\xce\xce\xce\xce\xce\xce\xce\xce\xce\xce\xce\xce\xce\xce\xce\xce\xce\xce\xce\xce\xce\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r' +'""""""""""""""""""""""""""\x12\x12\x12\x12\x12\x12\x12\x12\x12\x12\x12\x12\x12\x12\x12\x12\x12\x12\x12\x12\x12\x12\x12\x12\x12\x12""""""""""""' +'""""""""""""""\x12\x12\x12\x12\x12\x12\x12\r\x12\x12\x12\x12\x12\x12\x12\x12\x12\x12\x12\x12\x12\x12\x12\x12\x12\x12""""""""""""""""""""""""' +'""\x12\x12\x12\x12\x12\x12\x12\x12\x12\x12\x12\x12\x12\x12\x12\x12\x12\x12\x12\x12\x12\x12\x12\x12\x12\x12"\r""\r\r"\r\r""\r\r""""\r""""""""\x12\x12\x12\x12\r\x12\r\x12\x12\x12' +'\x12\r\x12\x12\r\x12\x12\x12\x12\x12\x12\x12\x12\x12\x12\x12""""""""""""""""""""""""""\x12\x12\x12\x12\x12\x12\x12\x12\x12\x12\x12\x12\x12\x12\x12\x12\x12\x12\x12\x12\x12\x12' +'\x12\x12\x12\x12""\r""""\r\r""""""""\r"""""""\r\x12\x12\x12\x12\x12\x12\x12\x12\x12\x12\x12\x12\x12\x12\x12\x12\x12\x12\x12\x12\x12\x12\x12\x12\x12\x12""\r""""\r' +'"""""\r"\r\r\r"""""""\r\x12\x12\x12\x12\x12\x12\x12\x12\x12\x12\x12\x12\x12\x12\x12\x12\x12\x12\x12\x12\x12\x12\x12\x12\x12\x12""""""""""""""""""""' +'""""""\x12\x12\x12\x12\x12\x12\x12\x12\x12\x12\x12\x12\x12\x12\x12\x12\x12\x12\x12\x12\x12\x12\x12\x12\x12\x12""""""""""""""""""""""""""\x12\x12\x12\x12\x12\x12' +'\x12\x12\x12\x12\x12\x12\x12\x12\x12\x12\x12\x12\x12\x12\x12\x12\x12\x12\x12\x12""""""""""""""""""""""""""\x12\x12\x12\x12\x12\x12\x12\x12\x12\x12\x12\x12\x12\x12\x12\x12\x12\x12' +'\x12\x12\x12\x12\x12\x12\x12\x12""""""""""""""""""""""""""\x12\x12\x12\x12\x12\x12\x12\x12\x12\x12\x12\x12\x12\x12\x12\x12\x12\x12\x12\x12\x12\x12\x12\x12\x12\x12""""' +'""""""""""""""""""""""\x12\x12\x12\x12\x12\x12\x12\x12\x12\x12\x12\x12\x12\x12\x12\x12\x12\x12\x12\x12\x12\x12\x12\x12\x12\x12""""""""""""""""' +'""""""""""\x12\x12\x12\x12\x12\x12\x12\x12\x12\x12\x12\x12\x12\x12\x12\x12\x12\x12\x12\x12\x12\x12\x12\x12\x12\x12\r\r\r\r""""""""""""""""""""""""' +'"\xbf\x12\x12\x12\x12\x12\x12\x12\x12\x12\x12\x12\x12\x12\x12\x12\x12\x12\x12\x12\x12\x12\x12\x12\x12\x12\xbf\x12\x12\x12\x12\x12\x12"""""""""""""""""""""""""\xbf\x12\x12\x12\x12' +'\x12\x12\x12\x12\x12\x12\x12\x12\x12\x12\x12\x12\x12\x12\x12\x12\x12\x12\x12\x12\x12\xbf\x12\x12\x12\x12\x12\x12"""""""""""""""""""""""""\xbf\x12\x12\x12\x12\x12\x12\x12\x12\x12\x12' +'\x12\x12\x12\x12\x12\x12\x12\x12\x12\x12\x12\x12\x12\x12\x12\xbf\x12\x12\x12\x12\x12\x12"""""""""""""""""""""""""\xbf\x12\x12\x12\x12\x12\x12\x12\x12\x12\x12\x12\x12\x12\x12\x12\x12' +'\x12\x12\x12\x12\x12\x12\x12\x12\x12\xbf\x12\x12\x12\x12\x12\x12"""""""""""""""""""""""""\xbf\x12\x12\x12\x12\x12\x12\x12\x12\x12\x12\x12\x12\x12\x12\x12\x12\x12\x12\x12\x12\x12\x12' +'\x12\x12\x12\xbf\x12\x12\x12\x12\x12\x12\r\r\r\rgggggggggggggggggggggggggggggggggggggggggggggggggg' '\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c' '\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c' '\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c\x1c' Modified: pypy/dist/pypy/module/unicodedata/unicodedb_4_1_0.py ============================================================================== --- pypy/dist/pypy/module/unicodedata/unicodedb_4_1_0.py (original) +++ pypy/dist/pypy/module/unicodedata/unicodedb_4_1_0.py Wed Oct 4 13:30:19 2006 @@ -16391,6 +16391,7 @@ ('Lo', 'L', 'H', 2, 0), ('Lo', 'L', 'N', 2, 0), ('Lo', 'L', 'W', 2, 0), +('Lo', 'L', 'W', 66, 0), ('Lo', 'R', 'N', 2, 0), ('Lt', 'L', 'N', 18, 0), ('Lu', 'L', 'A', 10, 0), @@ -16586,22 +16587,22 @@ ('Zs', 'WS', 'Na', 1, 0), ] _db_pgtbl = ( -'\x00\x01\x02\x03\x04\x05\x06\x07\x08\t\n\x0b\x0c\r\x0e\x0f\x10\x11\x12\x13\x14\x15\x16\x17\x18\x19\x1a\x08\x08\x1b\x1c\x1d\x1e\x1f !"#$%&\'()*+,-./01222222222222' -'2222222222222322222222222222222222222222222222222222222222222222' -'2222222222222222222222222222222452226\x08\x0878\x08\x08\x0822222222222222222222' -'222222222222222222222229::::::::;;;;;;;;;;;;;;;;;;;;;;;;;2<=>?@A' -'BC\x08DE\x08\x08\x08F\x08G\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08' +'\x00\x01\x02\x03\x04\x05\x06\x07\x08\t\n\x0b\x0c\r\x0e\x0f\x10\x11\x12\x13\x14\x15\x16\x17\x18\x19\x1a\x08\x08\x1b\x1c\x1d\x1e\x1f !"#$%&\'()*+,-./01233343353333' +'3333333333333678393:33;3<33333=>33?@333A33333333333B33C333333333' +'D333E3333333FG33333333H33333333IJ333K\x08\x08LM\x08\x08\x0833333333333333333333' +'33333333333333333333333NOOOOOOOOPPPPPPPPPPPPPPPPPPPPPPPPP3QRSTUV' +'WX\x08YZ\x08\x08\x08[\x08\\\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08' '\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08' '\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08' -'\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08HIJKLMNO\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08' -'2222222222222222222222222222222222222222222222222222222222222222' -'2222222222222222222222222222222222222222222222222222222222222222' -'22222222222222222222222222222222222222PQQQQQQQQQQQQQQQQQQQQQQQQQ' -'QQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQ22RQQQQS' -'QQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQ' -'QQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQ' -'QQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQ' -'QQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQS' +'\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08]^_`abcd\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08' +'ef3333333ghi33333333333333333333333j33333k33333333333333333l3333' +'3333333333333333333333333333333333m33333333333333333333333333333' +'33333333333333333333333333333333333333nooooooooooooooooooooooooo' +'oooooooooooooooooooooooooooooooooooooooooooooooooooooooo33pooooq' +'oooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooo' +'oooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooo' +'oooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooo' +'oooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooq' '\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08' '\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08' '\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08' @@ -16642,88 +16643,88 @@ '\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08' '\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08' '\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08' -'TU\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08' +'rs\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08' '\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08' '\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08' '\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08' -';;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;' -';;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;' -';;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;' -';;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;V' -';;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;' -';;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;' -';;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;' -';;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;V' +'PPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPP' +'PPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPP' +'PPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPP' +'PPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPt' +'PPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPP' +'PPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPP' +'PPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPP' +'PPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPt' ) _db_pages = ( -'\x01\x01\x01\x01\x01\x01\x01\x01\x01\x02\x00\x02\x03\x00\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x00\x00\x00\x02\xe2\xa9\xa9\xa2\xb8\xa2\xa9\xa9\xb0\x91\xa9\xc2\x9d\x88\x9d\x9dnnnnnnnnnn\x9d\xa9\xcf\xce\xcf\xa9' -"\xa9''''''''''''''''''''''''''\xb0\xa9\x91\xbd\x85\xbd\x16\x16\x16\x16\x16\x16\x16\x16\x16\x16\x16\x16\x16\x16\x16\x16\x16\x16\x16\x16\x16\x16\x16\x16\x16\x16\xb0\xce\x91\xce\x01" -'\x01\x01\x01\x01\x01\x00\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\xdf\xa5\xb8\xb8\xb4\xb8\xdb\xd7\xba\xda\x13\x98\xce\x05\xd7\xbd\xd2\xc4vv\xba\x15\xd7\xa5\xbav\x13\x95|||\xa5' -'&&&&&&$&&&&&&&&&$&&&&&&\xc7$&&&&&$\x13\x13\x13\x15\x15\x15\x15\x13\x15\x13\x13\x13\x15\x13\x13\x15\x15\x13\x15\x13\x13\x15\x15\x15\xc7\x13\x13\x13\x15\x13\x15\x13\x15' -'&\x13&\x15&\x15&\x15&\x15&\x15&\x15&\x15&\x13&\x13&\x15&\x15&\x15&\x13&\x15&\x15&\x15&\x15&\x15$\x13&\x15&\x13&\x15&\x15&\x13$\x13&\x15&\x15\x13&\x15&\x15&\x15$' -'\x13$\x13&\x13&\x15&\x13\x13$\x13&\x13&\x15&\x15$\x13&\x15&\x15&\x15&\x15&\x15&\x15&\x15&\x15&\x15$\x13&\x15&\x13&\x15&\x15&\x15&\x15&\x15&\x15&&\x15&\x15&\x15\x15' -'\x15&&\x15&\x15&&\x15&&&\x15\x15&&&&\x15&&\x15&&&\x15\x15\x15&&\x15&&\x15&\x15&\x15&&\x15&\x15\x15&\x15&&\x15&&&\x15&\x15&&\x15\x15 &\x15\x15\x15' -' &#\x15&#\x15&#\x15&\x13&\x13&\x13&\x13&\x13&\x13&\x13&\x13\x15&\x15&\x15&\x15&\x15&\x15&\x15&\x15&\x15&\x15\x15&#\x15&\x15&&&\x15&\x15&\x15&\x15' -'&\x15&\x15&\x15&\x15&\x15&\x15&\x15&\x15&\x15&\x15&\x15&\x15&\x15&\x15&\x15&\x15&\x15&\x15&\x15&\x15&\x15&\x15&\x15&\x15&\x15&\x15\x15\x15\x15\x15\x15\x15&&\x15&&\x15' -'\x15&\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x15\x13\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x13\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15' +'\x01\x01\x01\x01\x01\x01\x01\x01\x01\x02\x00\x02\x03\x00\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x00\x00\x00\x02\xe3\xaa\xaa\xa3\xb9\xa3\xaa\xaa\xb1\x92\xaa\xc3\x9e\x89\x9e\x9eoooooooooo\x9e\xaa\xd0\xcf\xd0\xaa' +'\xaa((((((((((((((((((((((((((\xb1\xaa\x92\xbe\x86\xbe\x16\x16\x16\x16\x16\x16\x16\x16\x16\x16\x16\x16\x16\x16\x16\x16\x16\x16\x16\x16\x16\x16\x16\x16\x16\x16\xb1\xcf\x92\xcf\x01' +'\x01\x01\x01\x01\x01\x00\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\xe0\xa6\xb9\xb9\xb5\xb9\xdc\xd8\xbb\xdb\x13\x99\xcf\x05\xd8\xbe\xd3\xc5ww\xbb\x15\xd8\xa6\xbbw\x13\x96}}}\xa6' +"''''''%'''''''''%''''''\xc8%'''''%\x13\x13\x13\x15\x15\x15\x15\x13\x15\x13\x13\x13\x15\x13\x13\x15\x15\x13\x15\x13\x13\x15\x15\x15\xc8\x13\x13\x13\x15\x13\x15\x13\x15" +"'\x13'\x15'\x15'\x15'\x15'\x15'\x15'\x15'\x13'\x13'\x15'\x15'\x15'\x13'\x15'\x15'\x15'\x15'\x15%\x13'\x15'\x13'\x15'\x15'\x13%\x13'\x15'\x15\x13'\x15'\x15'\x15%" +"\x13%\x13'\x13'\x15'\x13\x13%\x13'\x13'\x15'\x15%\x13'\x15'\x15'\x15'\x15'\x15'\x15'\x15'\x15'\x15%\x13'\x15'\x13'\x15'\x15'\x15'\x15'\x15'\x15''\x15'\x15'\x15\x15" +"\x15''\x15'\x15''\x15'''\x15\x15''''\x15''\x15'''\x15\x15\x15''\x15''\x15'\x15'\x15''\x15'\x15\x15'\x15''\x15'''\x15'\x15''\x15\x15 '\x15\x15\x15" +" '$\x15'$\x15'$\x15'\x13'\x13'\x13'\x13'\x13'\x13'\x13'\x13\x15'\x15'\x15'\x15'\x15'\x15'\x15'\x15'\x15'\x15\x15'$\x15'\x15'''\x15'\x15'\x15'\x15" +"'\x15'\x15'\x15'\x15'\x15'\x15'\x15'\x15'\x15'\x15'\x15'\x15'\x15'\x15'\x15'\x15'\x15'\x15'\x15'\x15'\x15'\x15'\x15'\x15'\x15'\x15\x15\x15\x15\x15\x15\x15''\x15''\x15" +"\x15'\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x15\x13\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x13\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15" '\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x1a\x1a\x1a\x1a\x1a\x1a\x1a\x1a\x1a\x1d\x1d\x1a\x1a\x1a\x1a\x1a' -'\x1a\x1a\xbc\xbc\xba\xbc\x1d\x1c\x1d\x1c\x1c\x1c\x1d\x1c\x1d\x1d\x18\x1a\xbc\xbc\xbc\xbc\xbc\xbc\xba\xba\xba\xba\xbc\xba\xbc\xba\x1a\x1a\x1a\x1a\x1a\xbc\xbc\xbc\xbc\xbc\xbc\xbc\xbc\xbc\x1a\xbc\xbc\xbc\xbc\xbc\xbc\xbc\xbc\xbc\xbc\xbc\xbc\xbc\xbc\xbc\xbc\xbc' -'3333333333333333333334222241222220022220022222222222/////2222333' -'333337322233322.33322223422356656653333333333333\x0f\x0f\x0f\x0f\xbc\xbc\x0f\x0f\x0f\x0f\x1a\x0f\x0f\x0f\xa8\x0f' -'\x0f\x0f\x0f\x0f\xbc\xbc&\xa8&&&\x0f&\x0f&&\x15$$$$$$$$$$$$$$$$$\x0f$$$$$$$&&\x15\x15\x15\x15\x15\x13\x13\x13\x13\x13\x13\x13\x13\x13\x13\x13\x13\x13\x13\x13' -'\x13\x13\x15\x13\x13\x13\x13\x13\x13\x13\x15\x15\x15\x15\x15\x0f\x15\x15&&&\x15\x15\x15&\x15&\x15&\x15&\x15&\x15&\x15&\x15&\x15&\x15&\x15&\x15&\x15\x15\x15\x15\x15&\x15\xcc&\x15&&\x15\x15&&&' -'&$&&&&&&&&&&&&&&$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$\x13\x13\x13\x13\x13\x13\x13\x13\x13\x13\x13\x13\x13\x13\x13\x13' -'\x13\x13\x13\x13\x13\x13\x13\x13\x13\x13\x13\x13\x13\x13\x13\x13\x15\x13\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15&\x15&\x15&\x15&\x15&\x15&\x15&\x15&\x15&\x15&\x15&\x15&\x15&\x15&\x15&\x15&\x15' -'&\x15\xd5dddd\x0f,,&\x15&\x15&\x15&\x15&\x15&\x15&\x15&\x15&\x15&\x15&\x15&\x15&\x15&\x15&\x15&\x15&\x15&\x15&\x15&\x15&\x15&\x15&\x15&\x15&\x15&\x15&\x15' -'&&\x15&\x15&\x15&\x15&\x15&\x15&\x15\x0f&\x15&\x15&\x15&\x15&\x15&\x15&\x15&\x15&\x15&\x15&\x15&\x15&\x15&\x15&\x15&\x15&\x15&\x15&\x15&\x15&\x15\x0f\x0f\x0f\x0f\x0f\x0f' -'&\x15&\x15&\x15&\x15&\x15&\x15&\x15&\x15\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f&&&&&&&&&&&&&&&' -'&&&&&&&&&&&&&&&&&&&&&&&\x0f\x0f\x1a\xa4\xa4\xa4\xa4\xa4\xa4\x0f\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15' -'\x15\x15\x15\x15\x15\x15\x15\x15\x0f\xa4\x8b\x0f\x0f\x0f\x0f\x0f\x0faddddadddbaddddddaaaaaaddaddbcd<=>?@ABCDE\x0fFGH\xabI' -'\xabJK\xabda\xabD\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f"""""""""""""""""""""""""""\x0f\x0f\x0f\x0f\x0f"""\xab\xab\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f' -'\x04\x04\x04\x04\x0f\x0f\x0f\x0f\x0f\x0f\x0f\xb3\x9c\x99\xda\xdadddddd\x0f\x0f\x0f\x0f\x0f\x99\x0f\x0f\x99\x99\x0f\x1e\x1e\x1e\x1e\x1e\x1e\x1e\x1e\x1e\x1e\x1e\x1e\x1e\x1e\x1e\x1e\x1e\x1e\x1e\x1e\x1e\x1e\x1e\x1e\x1e\x1e\x0f\x0f\x0f\x0f\x0f' -'\x17\x1e\x1e\x1e\x1e\x1e\x1e\x1e\x1e\x1e\x1eMNOPQRSTddaadddddadd\x0fkkkkkkkkkk\xa1\x9a\x9a\x99\x1e\x1eU\x1e\x1e\x1e\x1e\x1e\x1e\x1e\x1e\x1e\x1e\x1e\x1e\x1e\x1e\x1e' +'\x1a\x1a\xbd\xbd\xbb\xbd\x1d\x1c\x1d\x1c\x1c\x1c\x1d\x1c\x1d\x1d\x18\x1a\xbd\xbd\xbd\xbd\xbd\xbd\xbb\xbb\xbb\xbb\xbd\xbb\xbd\xbb\x1a\x1a\x1a\x1a\x1a\xbd\xbd\xbd\xbd\xbd\xbd\xbd\xbd\xbd\x1a\xbd\xbd\xbd\xbd\xbd\xbd\xbd\xbd\xbd\xbd\xbd\xbd\xbd\xbd\xbd\xbd\xbd' +'4444444444444444444445333352333331133331133333333333000003333444' +'444448433344433/44433334533467767764444444444444\x0f\x0f\x0f\x0f\xbd\xbd\x0f\x0f\x0f\x0f\x1a\x0f\x0f\x0f\xa9\x0f' +"\x0f\x0f\x0f\x0f\xbd\xbd'\xa9'''\x0f'\x0f''\x15%%%%%%%%%%%%%%%%%\x0f%%%%%%%''\x15\x15\x15\x15\x15\x13\x13\x13\x13\x13\x13\x13\x13\x13\x13\x13\x13\x13\x13\x13" +"\x13\x13\x15\x13\x13\x13\x13\x13\x13\x13\x15\x15\x15\x15\x15\x0f\x15\x15'''\x15\x15\x15'\x15'\x15'\x15'\x15'\x15'\x15'\x15'\x15'\x15'\x15'\x15'\x15\x15\x15\x15\x15'\x15\xcd'\x15''\x15\x15'''" +"'%''''''''''''''%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%\x13\x13\x13\x13\x13\x13\x13\x13\x13\x13\x13\x13\x13\x13\x13\x13" +"\x13\x13\x13\x13\x13\x13\x13\x13\x13\x13\x13\x13\x13\x13\x13\x13\x15\x13\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15'\x15'\x15'\x15'\x15'\x15'\x15'\x15'\x15'\x15'\x15'\x15'\x15'\x15'\x15'\x15'\x15" +"'\x15\xd6eeee\x0f--'\x15'\x15'\x15'\x15'\x15'\x15'\x15'\x15'\x15'\x15'\x15'\x15'\x15'\x15'\x15'\x15'\x15'\x15'\x15'\x15'\x15'\x15'\x15'\x15'\x15'\x15'\x15" +"''\x15'\x15'\x15'\x15'\x15'\x15'\x15\x0f'\x15'\x15'\x15'\x15'\x15'\x15'\x15'\x15'\x15'\x15'\x15'\x15'\x15'\x15'\x15'\x15'\x15'\x15'\x15'\x15'\x15\x0f\x0f\x0f\x0f\x0f\x0f" +"'\x15'\x15'\x15'\x15'\x15'\x15'\x15'\x15\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f'''''''''''''''" +"'''''''''''''''''''''''\x0f\x0f\x1a\xa5\xa5\xa5\xa5\xa5\xa5\x0f\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15" +'\x15\x15\x15\x15\x15\x15\x15\x15\x0f\xa5\x8c\x0f\x0f\x0f\x0f\x0f\x0fbeeeebeeecbeeeeeebbbbbbeebeecde=>?@ABCDEF\x0fGHI\xacJ' +'\xacKL\xaceb\xacE\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f###########################\x0f\x0f\x0f\x0f\x0f###\xac\xac\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f' +'\x04\x04\x04\x04\x0f\x0f\x0f\x0f\x0f\x0f\x0f\xb4\x9d\x9a\xdb\xdbeeeeee\x0f\x0f\x0f\x0f\x0f\x9a\x0f\x0f\x9a\x9a\x0f\x1e\x1e\x1e\x1e\x1e\x1e\x1e\x1e\x1e\x1e\x1e\x1e\x1e\x1e\x1e\x1e\x1e\x1e\x1e\x1e\x1e\x1e\x1e\x1e\x1e\x1e\x0f\x0f\x0f\x0f\x0f' +'\x17\x1e\x1e\x1e\x1e\x1e\x1e\x1e\x1e\x1e\x1eNOPQRSTUeebbeeeeebee\x0fllllllllll\xa2\x9b\x9b\x9a\x1e\x1eV\x1e\x1e\x1e\x1e\x1e\x1e\x1e\x1e\x1e\x1e\x1e\x1e\x1e\x1e\x1e' '\x1e\x1e\x1e\x1e\x1e\x1e\x1e\x1e\x1e\x1e\x1e\x1e\x1e\x1e\x1e\x1e\x1e\x1e\x1e\x1e\x1e\x1e\x1e\x1e\x1e\x1e\x1e\x1e\x1e\x1e\x1e\x1e\x1e\x1e\x1e\x1e\x1e\x1e\x1e\x1e\x1e\x1e\x1e\x1e\x1e\x1e\x1e\x1e\x1e\x1e\x1e\x1e\x1e\x1e\x1e\x1e\x1e\x1e\x1e\x1e\x1e\x1e\x1e\x1e' -'\x1e\x1e\x1e\x1e\x1e\x1e\x1e\x1e\x1e\x1e\x1e\x1e\x1e\x1e\x1e\x1e\x1e\x1e\x1e\x1e\x99\x1eddddddd\x04,ddddad\x17\x17dd\xdaadda\x1e\x1emmmmmmmmmm\x1e\x1e\x1e\xd1\xd1\x1e' -'\x99\x99\x99\x99\x99\x99\x99\x99\x99\x99\x99\x99\x99\x99\x0f\x06\x1eV\x1e\x1e\x1e\x1e\x1e\x1e\x1e\x1e\x1e\x1e\x1e\x1e\x1e\x1e\x1e\x1e\x1e\x1e\x1e\x1e\x1e\x1e\x1e\x1e\x1e\x1e\x1e\x1e\x1e\x1edaddaddaaadaadad' -'ddadadadadd\x0f\x0f\x1e\x1e\x1e\x1e\x1e\x1e\x1e\x1e\x1e\x1e\x1e\x1e\x1e\x1e\x1e\x1e\x1e\x1e\x1e\x1e\x1e\x1e\x1e\x1e\x1e\x1e\x1e\x1e\x1e\x1e\x1e\x1e\x1e\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f' -'\x1e\x1e\x1e\x1e\x1e\x1e\x1e\x1e\x1e\x1e\x1e\x1e\x1e\x1e\x1e\x1e\x1e\x1e\x1e\x1e\x1e\x1e\x1e\x1e\x1e\x1e\x1e\x1e\x1e\x1e\x1e\x1e\x1e\x1e\x1e\x1e\x1e\x1e88888888888\x1e\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f' +'\x1e\x1e\x1e\x1e\x1e\x1e\x1e\x1e\x1e\x1e\x1e\x1e\x1e\x1e\x1e\x1e\x1e\x1e\x1e\x1e\x9a\x1eeeeeeee\x04-eeeebe\x17\x17ee\xdbbeeb\x1e\x1ennnnnnnnnn\x1e\x1e\x1e\xd2\xd2\x1e' +'\x9a\x9a\x9a\x9a\x9a\x9a\x9a\x9a\x9a\x9a\x9a\x9a\x9a\x9a\x0f\x06\x1eW\x1e\x1e\x1e\x1e\x1e\x1e\x1e\x1e\x1e\x1e\x1e\x1e\x1e\x1e\x1e\x1e\x1e\x1e\x1e\x1e\x1e\x1e\x1e\x1e\x1e\x1e\x1e\x1e\x1e\x1eebeebeebbbebbebe' +'eebebebebee\x0f\x0f\x1e\x1e\x1e\x1e\x1e\x1e\x1e\x1e\x1e\x1e\x1e\x1e\x1e\x1e\x1e\x1e\x1e\x1e\x1e\x1e\x1e\x1e\x1e\x1e\x1e\x1e\x1e\x1e\x1e\x1e\x1e\x1e\x1e\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f' +'\x1e\x1e\x1e\x1e\x1e\x1e\x1e\x1e\x1e\x1e\x1e\x1e\x1e\x1e\x1e\x1e\x1e\x1e\x1e\x1e\x1e\x1e\x1e\x1e\x1e\x1e\x1e\x1e\x1e\x1e\x1e\x1e\x1e\x1e\x1e\x1e\x1e\x1e99999999999\x1e\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f' '\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f' '\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f' '\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f' '\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f' '\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f' -'\x0f88( \x0f\x0f: ((' -'(88888888((((;\x0f\x0f dadd\x0f\x0f\x0f 88\xa4\xa4oooooooooo\xa4\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f \x0f\x0f' -'\x0f8((\x0f \x0f\x0f \x0f\x0f \x0f \x0f \x0f\x0f\x0f \x0f\x0f: ((' -'(8888\x0f\x0f((\x0f\x0f((; \x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f(\x0f\x0f\x0f\x0f \x0f 88\x0f\x0foooooooooo \xb7\xb7yyyyxy\xd5\x0f\x0f\x0f\x0f\x0f' -'\x0f88(\x0f \x0f\x0f\x0f\x0f \x0f\x0f \x0f \x0f \x0f \x0f \x0f\x0f:\x0f((' -'(88\x0f\x0f\x0f\x0f88\x0f\x0f88;\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f \x0f \x0f\x0f\x0f\x0f\x0f\x0f\x0foooooooooo88 \x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f' -'\x0f88(\x0f \x0f \x0f \x0f \x0f \x0f \x0f\x0f: ((' -'(88888\x0f88(\x0f((;\x0f\x0f \x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f 88\x0f\x0foooooooooo\x0f\xb7\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f' -'\x0f8((\x0f \x0f\x0f \x0f\x0f \x0f \x0f \x0f \x0f\x0f: (8' -'(888\x0f\x0f\x0f((\x0f\x0f((;\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f8(\x0f\x0f\x0f\x0f \x0f \x0f\x0f\x0f\x0foooooooooo\xd5 \x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f' -'\x0f\x0f8 \x0f \x0f\x0f\x0f \x0f \x0f\x0f\x0f \x0f \x0f \x0f\x0f\x0f \x0f\x0f\x0f \x0f\x0f\x0f \x0f\x0f\x0f\x0f((' -'8((\x0f\x0f\x0f(((\x0f(((;\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f(\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0fooooooooooyyy\xda\xda\xda\xda\xda\xda\xb7\xda\x0f\x0f\x0f\x0f\x0f' -'\x0f(((\x0f \x0f \x0f \x0f \x0f \x0f\x0f\x0f\x0f88' -'8((((\x0f888\x0f888;\x0f\x0f\x0f\x0f\x0f\x0f\x0fWX\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f \x0f\x0f\x0f\x0foooooooooo\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f' -'\x0f\x0f((\x0f \x0f \x0f \x0f \x0f \x0f\x0f: (-' -'(((((\x0f-((\x0f((8;\x0f\x0f\x0f\x0f\x0f\x0f\x0f((\x0f\x0f\x0f\x0f\x0f\x0f\x0f \x0f \x0f\x0f\x0f\x0foooooooooo\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f' -'\x0f\x0f((\x0f \x0f \x0f \x0f \x0f\x0f\x0f\x0f((' -'(888\x0f\x0f(((\x0f(((;\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f(\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f \x0f\x0f\x0f\x0foooooooooo\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f' -'\x0f\x0f((\x0f \x0f\x0f\x0f \x0f \x0f \x0f\x0f' -' \x0f\x0f\x0f;\x0f\x0f\x0f\x0f(((888\x0f8\x0f((((((((\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f((\xa4\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f' -'\x0f 8 8888YY;\x0f\x0f\x0f\x0f\xb7' -' \x1a8ZZZZ888\xa4oooooooooo\xa4\xa4\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f' -'\x0f \x0f \x0f\x0f \x0f \x0f\x0f \x0f\x0f\x0f\x0f\x0f\x0f \x0f \x0f \x0f \x0f \x0f\x0f \x0f 8 8888[[\x0f88 \x0f\x0f' -' \x0f\x1a\x0f\\\\\\\\88\x0f\x0foooooooooo\x0f\x0f \x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f' -' \xd5\xd5\xd5\xa4\xa4\xa4\xa4\xa4\xa4\xa4\xa4\xa4\xa4\xa4\xa4\xa4\xa4\xa4\xd5\xd5\xd5\xd5\xd5aa\xd5\xd5\xd5\xd5\xd5\xd5ooooooooooyyyyyyyyyy\xd5a\xd5a\xd5`\xae\x8f\xae\x8f((' -' \x0f \x0f\x0f\x0f\x0f\x0f\x0f]^8_88888^^^^8(' -'^8dd;\xa4dd \x0f\x0f\x0f\x0f88888888\x0f888888888888888888888888888888888888\x0f\xd5\xd5' -'\xd5\xd5\xd5\xd5\xd5\xd5a\xd5\xd5\xd5\xd5\xd5\xd5\x0f\x0f\xd5\xa4\xa4\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f' -' \x0f \x0f \x0f(8888(8\x0f\x0f\x0f8:(;\x0f\x0f\x0f\x0f\x0f\x0f' -'oooooooooo\xa4\xa4\xa4\xa4\xa4\xa4 ((88\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f' -'\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&' -'&&&&&&\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f \xa4\x1a\x0f\x0f\x0f' +'\x0f99) \x0f\x0f; ))' +')99999999))))<\x0f\x0f ebee\x0f\x0f\x0f 99\xa5\xa5pppppppppp\xa5\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f \x0f\x0f' +'\x0f9))\x0f \x0f\x0f \x0f\x0f \x0f \x0f \x0f\x0f\x0f \x0f\x0f; ))' +')9999\x0f\x0f))\x0f\x0f))< \x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f)\x0f\x0f\x0f\x0f \x0f 99\x0f\x0fpppppppppp \xb8\xb8zzzzyz\xd6\x0f\x0f\x0f\x0f\x0f' +'\x0f99)\x0f \x0f\x0f\x0f\x0f \x0f\x0f \x0f \x0f \x0f \x0f \x0f\x0f;\x0f))' +')99\x0f\x0f\x0f\x0f99\x0f\x0f99<\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f \x0f \x0f\x0f\x0f\x0f\x0f\x0f\x0fpppppppppp99 \x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f' +'\x0f99)\x0f \x0f \x0f \x0f \x0f \x0f \x0f\x0f; ))' +')99999\x0f99)\x0f))<\x0f\x0f \x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f 99\x0f\x0fpppppppppp\x0f\xb8\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f' +'\x0f9))\x0f \x0f\x0f \x0f\x0f \x0f \x0f \x0f \x0f\x0f; )9' +')999\x0f\x0f\x0f))\x0f\x0f))<\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f9)\x0f\x0f\x0f\x0f \x0f \x0f\x0f\x0f\x0fpppppppppp\xd6 \x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f' +'\x0f\x0f9 \x0f \x0f\x0f\x0f \x0f \x0f\x0f\x0f \x0f \x0f \x0f\x0f\x0f \x0f\x0f\x0f \x0f\x0f\x0f \x0f\x0f\x0f\x0f))' +'9))\x0f\x0f\x0f)))\x0f)))<\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f)\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0fppppppppppzzz\xdb\xdb\xdb\xdb\xdb\xdb\xb8\xdb\x0f\x0f\x0f\x0f\x0f' +'\x0f)))\x0f \x0f \x0f \x0f \x0f \x0f\x0f\x0f\x0f99' +'9))))\x0f999\x0f999<\x0f\x0f\x0f\x0f\x0f\x0f\x0fXY\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f \x0f\x0f\x0f\x0fpppppppppp\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f' +'\x0f\x0f))\x0f \x0f \x0f \x0f \x0f \x0f\x0f; ).' +')))))\x0f.))\x0f))9<\x0f\x0f\x0f\x0f\x0f\x0f\x0f))\x0f\x0f\x0f\x0f\x0f\x0f\x0f \x0f \x0f\x0f\x0f\x0fpppppppppp\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f' +'\x0f\x0f))\x0f \x0f \x0f \x0f \x0f\x0f\x0f\x0f))' +')999\x0f\x0f)))\x0f)))<\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f)\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f \x0f\x0f\x0f\x0fpppppppppp\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f' +'\x0f\x0f))\x0f \x0f\x0f\x0f \x0f \x0f \x0f\x0f' +' \x0f\x0f\x0f<\x0f\x0f\x0f\x0f)))999\x0f9\x0f))))))))\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f))\xa5\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f' +'\x0f 9 9999ZZ<\x0f\x0f\x0f\x0f\xb8' +' \x1a9[[[[999\xa5pppppppppp\xa5\xa5\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f' +'\x0f \x0f \x0f\x0f \x0f \x0f\x0f \x0f\x0f\x0f\x0f\x0f\x0f \x0f \x0f \x0f \x0f \x0f\x0f \x0f 9 9999\\\\\x0f99 \x0f\x0f' +' \x0f\x1a\x0f]]]]99\x0f\x0fpppppppppp\x0f\x0f \x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f' +' \xd6\xd6\xd6\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xd6\xd6\xd6\xd6\xd6bb\xd6\xd6\xd6\xd6\xd6\xd6ppppppppppzzzzzzzzzz\xd6b\xd6b\xd6a\xaf\x90\xaf\x90))' +' \x0f \x0f\x0f\x0f\x0f\x0f\x0f^_9`99999____9)' +'_9ee<\xa5ee \x0f\x0f\x0f\x0f99999999\x0f999999999999999999999999999999999999\x0f\xd6\xd6' +'\xd6\xd6\xd6\xd6\xd6\xd6b\xd6\xd6\xd6\xd6\xd6\xd6\x0f\x0f\xd6\xa5\xa5\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f' +' \x0f \x0f \x0f)9999)9\x0f\x0f\x0f9;)<\x0f\x0f\x0f\x0f\x0f\x0f' +'pppppppppp\xa5\xa5\xa5\xa5\xa5\xa5 ))99\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f' +"\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f''''''''''''''''''''''''''''''''" +"''''''\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f \xa5\x1a\x0f\x0f\x0f" '!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!' '!!!!!!!!!!!!!!!!!!!!!!!!!!\x0f\x0f\x0f\x0f\x0f! ' ' \x0f\x0f\x0f\x0f\x0f ' @@ -16733,8 +16734,8 @@ ' \x0f \x0f\x0f \x0f \x0f\x0f \x0f' ' \x0f \x0f\x0f \x0f ' ' \x0f \x0f\x0f ' -' \x0f\x0f\x0f\x0fd\xd5\xa4\xa4\xa4\xa4\xa4\xa4\xa4\xa4zzzzzzzzzyyyyyyyyyyy\x0f\x0f\x0f' -' \xda\xda\xda\xda\xda\xda\xda\xda\xda\xda\x0f\x0f\x0f\x0f\x0f\x0f ' +' \x0f\x0f\x0f\x0fe\xd6\xa5\xa5\xa5\xa5\xa5\xa5\xa5\xa5{{{{{{{{{zzzzzzzzzzz\x0f\x0f\x0f' +' \xdb\xdb\xdb\xdb\xdb\xdb\xdb\xdb\xdb\xdb\x0f\x0f\x0f\x0f\x0f\x0f ' ' \x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f' '\x0f ' ' ' @@ -16745,125 +16746,209 @@ ' ' ' ' ' ' -' \xa4\xa4 \x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f' -'\xe1 \xae\x8f\x0f\x0f\x0f ' -' \xa4\xa4\xa4rrr\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f' -' \x0f 88;\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f 88;\xa4\xa4\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f' -' 88\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f \x0f \x0f88\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f' -' \x07\x07(8888888((' -'((((((8((888888888;8\xa4\xa4\xa4\x1a\xa4\xa4\xa4\xb7 d\x0f\x0foooooooooo\x0f\x0f\x0f\x0f\x0f\x0f~~~~~~~~~~\x0f\x0f\x0f\x0f\x0f\x0f' -'\xa8\xa8\xa8\xa8\xa8\xa8\x8b\xa8\xa8\xa8\xa8888\xe1\x0foooooooooo\x0f\x0f\x0f\x0f\x0f\x0f ' +' \xa5\xa5 \x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f' +'\xe2 \xaf\x90\x0f\x0f\x0f ' +' \xa5\xa5\xa5sss\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f' +' \x0f 99<\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f 99<\xa5\xa5\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f' +' 99\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f \x0f \x0f99\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f' +' \x07\x07)9999999))' +'))))))9))999999999<9\xa5\xa5\xa5\x1a\xa5\xa5\xa5\xb8 e\x0f\x0fpppppppppp\x0f\x0f\x0f\x0f\x0f\x0f\x7f\x7f\x7f\x7f\x7f\x7f\x7f\x7f\x7f\x7f\x0f\x0f\x0f\x0f\x0f\x0f' +'\xa9\xa9\xa9\xa9\xa9\xa9\x8c\xa9\xa9\xa9\xa9999\xe2\x0fpppppppppp\x0f\x0f\x0f\x0f\x0f\x0f ' ' \x1a \x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f' -' c\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f' +' d\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f' '\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f' -' \x0f\x0f\x0f888((((88+++\x0f\x0f\x0f\x0f((8((((((bda\x0f\x0f\x0f\x0f' -'\xda\x0f\x0f\x0f\xa8\xa8oooooooooo \x0f\x0f \x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f' -' \x0f\x0f\x0f\x0f\x0f\x0f((((((((((((((((' -'( ((\x0f\x0f\x0f\x0f\x0f\x0foooooooooo\x0f\x0f\x0f\x0f\xa8\xa8\xda\xda\xda\xda\xda\xda\xda\xda\xda\xda\xda\xda\xda\xda\xda\xda\xda\xda\xda\xda\xda\xda\xda\xda\xda\xda\xda\xda\xda\xda\xda\xda' -' da(((\x0f\x0f\xa4\xa4\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f' +' \x0f\x0f\x0f999))))99,,,\x0f\x0f\x0f\x0f))9))))))ceb\x0f\x0f\x0f\x0f' +'\xdb\x0f\x0f\x0f\xa9\xa9pppppppppp \x0f\x0f \x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f' +' \x0f\x0f\x0f\x0f\x0f\x0f))))))))))))))))' +') ))\x0f\x0f\x0f\x0f\x0f\x0fpppppppppp\x0f\x0f\x0f\x0f\xa9\xa9\xdb\xdb\xdb\xdb\xdb\xdb\xdb\xdb\xdb\xdb\xdb\xdb\xdb\xdb\xdb\xdb\xdb\xdb\xdb\xdb\xdb\xdb\xdb\xdb\xdb\xdb\xdb\xdb\xdb\xdb\xdb\xdb' +' eb)))\x0f\x0f\xa5\xa5\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f' '\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f' '\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f' '\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f' '\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x1a\x1a\x1a\x1a\x1a\x1a\x1a\x1a\x1a\x1a\x1a\x1a\x1a\x1a\x1a\x1a\x1a\x1a\x1a\x1a' '\x1a\x1a\x1a\x1a\x1a\x1a\x1a\x1a\x1a\x1a\x1a\x1a\x1a\x1a\x1a\x1a\x1a\x1a\x1a\x1a\x1a\x1a\x1a\x1a\x1a\x1a\x1a\x1a\x1a\x1a\x1a\x1a\x1a\x1a\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x1a\x15\x15\x15\x15\x15\x15\x15' '\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x1a\x1a\x1a\x1a\x1a\x1a\x1a\x1a\x1a\x1a\x1a\x1a\x1a\x1a\x1a\x1a\x1a\x1a\x1a\x1a\x1a\x1a\x1a\x1a\x1a\x1a\x1a\x1a\x1a\x1a\x1a\x1a\x1a\x1a\x1a\x1a\x1a' -'ddad\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f' -'&\x15&\x15&\x15&\x15&\x15&\x15&\x15&\x15&\x15&\x15&\x15&\x15&\x15&\x15&\x15&\x15&\x15&\x15&\x15&\x15&\x15&\x15&\x15&\x15&\x15&\x15&\x15&\x15&\x15&\x15&\x15&\x15' -'&\x15&\x15&\x15&\x15&\x15&\x15&\x15&\x15&\x15&\x15&\x15&\x15&\x15&\x15&\x15&\x15&\x15&\x15&\x15&\x15&\x15&\x15&\x15&\x15&\x15&\x15&\x15&\x15&\x15&\x15&\x15&\x15' -'&\x15&\x15&\x15&\x15&\x15&\x15&\x15&\x15&\x15&\x15&\x15\x15\x15\x15\x15\x15\x15\x0f\x0f\x0f\x0f&\x15&\x15&\x15&\x15&\x15&\x15&\x15&\x15&\x15&\x15&\x15&\x15&\x15&\x15&\x15&\x15' -'&\x15&\x15&\x15&\x15&\x15&\x15&\x15&\x15&\x15&\x15&\x15&\x15&\x15&\x15&\x15&\x15&\x15&\x15&\x15&\x15&\x15&\x15&\x15&\x15&\x15&\x15&\x15&\x15&\x15\x0f\x0f\x0f\x0f\x0f\x0f' -'\x15\x15\x15\x15\x15\x15\x15\x15&&&&&&&&\x15\x15\x15\x15\x15\x15\x0f\x0f&&&&&&\x0f\x0f\x15\x15\x15\x15\x15\x15\x15\x15&&&&&&&&\x15\x15\x15\x15\x15\x15\x15\x15&&&&&&&&' -'\x15\x15\x15\x15\x15\x15\x0f\x0f&&&&&&\x0f\x0f\x15\x15\x15\x15\x15\x15\x15\x15\x0f&\x0f&\x0f&\x0f&\x15\x15\x15\x15\x15\x15\x15\x15&&&&&&&&\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x0f\x0f' -'\x15\x15\x15\x15\x15\x15\x15\x15########\x15\x15\x15\x15\x15\x15\x15\x15########\x15\x15\x15\x15\x15\x15\x15\x15########\x15\x15\x15\x15\x15\x0f\x15\x15&&&&#\xbc\x15\xbc' -'\xbc\xbc\x15\x15\x15\x0f\x15\x15&&&&#\xbc\xbc\xbc\x15\x15\x15\x15\x0f\x0f\x15\x15&&&&\x0f\xbc\xbc\xbc\x15\x15\x15\x15\x15\x15\x15\x15&&&&&\xbc\xbc\xbc\x0f\x0f\x15\x15\x15\x0f\x15\x15&&&&#\xbc\xbc\x0f' -'\xe1\xe1\xe1\xe1\xe1\xe1\xe1\xe1\xe1\xe1\xe1\x06\x06\x06\x07\x0c\x8a\x8b\x8b\x8a\x8a\x8a\xa5\xa8\x96\x94\xae\x97\x96\x94\xae\x97\xa5\xa5\xa5\xa8\xa5\xa5\xa5\xa5\xdd\xde\x08\r\x0b\t\x0e\xdf\x9f\xa1\x9f\x9f\xa1\xa5\xa8\xa8\xa8\x98\x95\xa5\xa8\xa8\xa5\x84' -'\x84\xa8\xa8\xa8\xbf\xaf\x90\xa8\xa8\xa8\xa8\xa8\xa8\xa8\xa8\xa8\xa8\xa8\xcc\xa8\x84\xa8\xa8\xa8\xa8\xa8\xa8\xa8\xa8\xa8\xa8\xe1\x06\x06\x06\x06\x0f\x0f\x0f\x0f\x0f\x0f\x06\x06\x06\x06\x06\x06w\x15\x0f\x0fvwwwww\xc1\xc1\xcc\xaf\x90\x13' -'wvvvvwwwww\xc1\xc1\xcc\xaf\x90\x0f\x1a\x1a\x1a\x1a\x1a\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\xb7\xb7\xb7\xb7\xb7\xb7\xb7\xb7\xb7\xb6\xb7\xb7\xb4\xb7\xb7\xb7\xb7\xb7\xb7\xb7\xb7\xb7\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f' -'\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0fdd99dddd999dd,,,,d,,,99dad99\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f' -'\xda\xda&\xd7\xda\xd7\xda&\xda\xd7\x15&&&\x15\x15&&&\x13\xda&\xd7\xda\xda&&&&&\xda\xda\xda\xd7\xd7\xda&\xda$\xda&\xda&$&&\xd3\x15&&\xda&\x15 \x15\xda\xda\x15\x15&&' -'\xcd\xcc\xcc\xcc\xcc&\x15\x15\x15\x15\xda\xcc\xda\x0f\x0f\x0f\x0f\x0f\x0f||~~~~~~||||~pppppppppppprrrrpppppppppprrrrrr' -'rrrq\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\xc7\xc7\xc7\xc7\xc7\xd7\xd7\xd7\xd7\xd7\xcc\xcc\xda\xda\xda\xda\xcc\xda\xda\xcc\xda\xda\xcc\xda\xda\xda\xda\xda\xda\xda\xcc\xda\xda\xda\xda\xda\xda\xda\xda\xda\xd7\xd7\xda\xda\xda\xda\xda\xda' -'\xda\xda\xda\xda\xda\xda\xda\xda\xda\xda\xda\xda\xda\xda\xcc\xcc\xda\xda\xc7\xda\xc7\xda\xda\xda\xda\xda\xda\xda\xda\xda\xda\xda\xda\xda\xda\xda\xda\xda\xda\xd7\xda\xda\xda\xda\xda\xda\xda\xda\xda\xda\xda\xda\xcc\xcc\xcc\xcc\xcc\xcc\xcc\xcc\xcc\xcc\xcc\xcc' -'\xc7\xcd\xc8\xc8\xcd\xcc\xcc\xc7\xc8\xcd\xcd\xc8\xcd\xcd\xcc\xc7\xcc\xc8\xc1\xc5\xcc\xc8\xcd\xcc\xcc\xcc\xc8\xcd\xcd\xc8\xc7\xc8\xc8\xcd\xcd\xc7\xcd\xc7\xcd\xc7\xc7\xc7\xc7\xc8\xc8\xcd\xc8\xcd\xcd\xcd\xcd\xcd\xc7\xc7\xc7\xc7\xcc\xcd\xcc\xcd\xc8\xc8\xcd\xcd' -'\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xc8\xcd\xcd\xcd\xc8\xcc\xcc\xcc\xcc\xcc\xc8\xcd\xcd\xcd\xcc\xcc\xcc\xcc\xcc\xcc\xcc\xcc\xcc\xcd\xc8\xc7\xcd\xcc\xc8\xc8\xc8\xc8\xcd\xcd\xc8\xc8\xcc\xcc\xc8\xc8\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd' -'\xcd\xcd\xc8\xc8\xcd\xcd\xc8\xc8\xcd\xcd\xcd\xcd\xcd\xcc\xcc\xcd\xcd\xcd\xcd\xcc\xcc\xc7\xcc\xcc\xcd\xc7\xcc\xcc\xcc\xcc\xcc\xcc\xcc\xcc\xcd\xcd\xcc\xc7\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcc\xcc\xcc\xcc\xcc\xcd\xc8' -'\xcc\xcc\xcc\xcc\xcc\xcc\xcc\xcc\xcc\xcd\xcd\xcd\xcd\xcd\xcc\xcc\xcd\xcd\xcc\xcc\xcc\xcc\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcc\xcc\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd' -'\xda\xda\xda\xda\xda\xda\xda\xda\xcd\xcd\xcd\xcd\xda\xda\xda\xda\xda\xda\xd7\xda\xda\xda\xda\xda\xda\xda\xda\xda\xda\xda\xda\xda\xcd\xcd\xda\xda\xda\xda\xda\xda\xda\xb2\x93\xda\xda\xda\xda\xda\xda\xda\xda\xda\xda\xda\xd5\xd5\xd5\xd5\xd5\xd5\xd5\xd5\xd5\xd5' -'\xd5\xd5\xd5\xd5\xd5\xd5\xd5\xd5\xd5\xd5\xd5\xd5\xd5\xd5\xd5\xd5\xd5\xd5\xd5\xd5\xd5\xd5\xd5\xd5\xd5\xd5\xd5\xd5\xd5\xd5\xd5\xd5\xd5\xd5\xd5\xd5\xd5\xd5\xd5\xd5\xd5\xd5\xd5\xd5\xd5\xd5\xd5\xd5\xd5\xd5\xd5\xd5\xd5\xd5\xd5\xd5\xd5\xd5\xd5\xda\xcc\xda\xda\xda' -'\xda\xda\xda\xda\xda\xda\xda\xda\xda\xda\xda\xda\xda\xda\xda\xda\xda\xda\xda\xda\xda\xd5\xda\xda\xda\xda\xda\xcc\xcc\xcc\xcc\xcc\xcc\xcc\xcc\xcc\xcc\xcc\xcc\xcc\xcc\xcc\xcc\xcc\xcc\xcc\xcc\xcc\xcc\xcc\xcc\xcc\xae\x8f\xa8\xda\xda\xda\xda\xda\xda\xda\xda\xda' -'\xda\xda\xda\xda\xda\xda\xda\xda\xda\xda\xda\xda\xda\xda\xda\xda\xda\xda\xda\xda\xda\xda\xda\xda\xda\xda\xda\xda\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f' -'\xda\xda\xda\xda\xda\xda\xda\xda\xda\xda\xda\xda\xda\xda\xda\xda\xda\xda\xda\xda\xda\xda\xda\xda\xda\xda\xda\xda\xda\xda\xda\xda\xda\xda\xda\xda\xda\xda\xda\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f' -'\xda\xda\xda\xda\xda\xda\xda\xda\xda\xda\xda\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f}}}}}}}}}|||||||||||}}}}}}}}}|||' -'||||||||vvvvvvvvvuuuuuuuuuuu\xd4\xd4\xd4\xd4\xd4\xd4\xd4\xd4\xd4\xd4\xd4\xd4\xd4\xd4\xd4\xd4\xd4\xd4\xd4\xd4\xd4\xd4\xd4\xd4\xd4\xd4\xd4\xd4\xd4\xd4\xd4\xd4\xd4\xd4\xd4\xd4' -'\xd4\xd4\xd4\xd4\xd4\xd4\xd4\xd4\xd4\xd4\xd4\xd4\xd4\xd4\xd4\xd4\xd4\xd4\xd4\xd4\xd4\xd4\xd4\xd4\xd4\xd4\xd4\xd4\xd4\xd4\xd4\xd4\xd4\xd4\xd4\xd4\xd4\xd4\xd4\xd4\xd4\xd4\x7f||||||||||}}}}}}}}}|}' -'\xd7\xd7\xd7\xd7\xd7\xd7\xd7\xd7\xd7\xd7\xd7\xd7\xd7\xd7\xd7\xd7\xd7\xd7\xd7\xd7\xd7\xd7\xd7\xd7\xd7\xd7\xd7\xd7\xd7\xd7\xd7\xd7\xd7\xd7\xd7\xd7\xd7\xd7\xd7\xd7\xd7\xd7\xd7\xd7\xd7\xd7\xd7\xd7\xd7\xd7\xd7\xd7\xd7\xd7\xd7\xd7\xd7\xd7\xd7\xd7\xd7\xd7\xd7\xd7' -'\xd7\xd7\xd7\xd7\xd7\xd7\xd7\xd7\xd7\xd7\xd7\xd7\xda\xda\xda\xda\xd7\xd7\xd7\xd7\xd7\xd7\xd7\xd7\xd7\xd7\xd7\xd7\xd7\xd7\xd7\xd7\xd7\xd7\xd7\xd7\xd7\xd7\xd7\xd7\xd7\xd7\xd7\xd7\xd7\xd7\xd7\xd7\xd7\xd7\xd7\xd7\xda\xda\xda\xda\xda\xda\xda\xda\xda\xda\xda\xda' -'\xd7\xd7\xd7\xd7\xd7\xd7\xd7\xd7\xd7\xd7\xd7\xd7\xd7\xd7\xd7\xd7\xda\xda\xd7\xd7\xd7\xd7\xda\xda\xda\xda\xda\xda\xda\xda\xda\xda\xd7\xd7\xda\xd7\xd7\xd7\xd7\xd7\xd7\xd7\xda\xda\xda\xda\xda\xda\xda\xda\xd7\xd7\xda\xda\xd7\xc7\xda\xda\xda\xda\xd7\xd7\xda\xda' -'\xd7\xc7\xda\xda\xda\xda\xd7\xd7\xd7\xda\xda\xd7\xda\xda\xd7\xd7\xd7\xd7\xda\xda\xda\xda\xda\xda\xda\xda\xda\xda\xda\xda\xda\xda\xda\xda\xd7\xd7\xd7\xd7\xda\xda\xda\xda\xda\xda\xda\xda\xda\xd7\xda\xda\xda\xda\xda\xda\xda\xda\xcc\xcc\xcc\xcc\xcc\xcc\xcc\xcc' -'\xda\xda\xda\xda\xda\xd7\xd7\xda\xda\xd7\xda\xda\xda\xda\xd7\xd7\xda\xda\xda\xda\xd7\xd7\xda\xda\xda\xda\xda\xda\xd7\xda\xd7\xda\xda\xda\xda\xda\xda\xda\xda\xda\xda\xda\xda\xda\xda\xda\xda\xda\xda\xda\xda\xda\xda\xda\xda\xda\xda\xda\xda\xda\xda\xda\xda\xda' -'\xd7\xda\xd7\xda\xda\xda\xda\xda\xda\xda\xda\xda\xda\xda\xda\xda\xda\xda\xda\xda\xda\xda\xda\xda\xda\xda\xda\xda\xda\xda\xda\xda\xd7\xd7\xda\xd7\xd7\xd7\xda\xd7\xd7\xd7\xd7\xda\xd7\xd7\xda\xc7\xda\xda\xda\xda\xda\xda\xda\xda\xda\xda\xda\xda\xda\xda\xda\xda' -'\xda\xda\xda\xda\xda\xda\xda\xda\xda\xda\xda\xda\xda\xda\xda\xda\xda\xda\xda\xda\xda\xda\xda\xda\xda\xda\xda\xda\xda\x0f\x0f\x0f\xda\xda\xda\xda\xda\xda\xda\xda\xda\xda\xda\xda\xd5\xda\xda\xda\xda\xda\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f' +'eebe\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f' +"'\x15'\x15'\x15'\x15'\x15'\x15'\x15'\x15'\x15'\x15'\x15'\x15'\x15'\x15'\x15'\x15'\x15'\x15'\x15'\x15'\x15'\x15'\x15'\x15'\x15'\x15'\x15'\x15'\x15'\x15'\x15'\x15" +"'\x15'\x15'\x15'\x15'\x15'\x15'\x15'\x15'\x15'\x15'\x15'\x15'\x15'\x15'\x15'\x15'\x15'\x15'\x15'\x15'\x15'\x15'\x15'\x15'\x15'\x15'\x15'\x15'\x15'\x15'\x15'\x15" +"'\x15'\x15'\x15'\x15'\x15'\x15'\x15'\x15'\x15'\x15'\x15\x15\x15\x15\x15\x15\x15\x0f\x0f\x0f\x0f'\x15'\x15'\x15'\x15'\x15'\x15'\x15'\x15'\x15'\x15'\x15'\x15'\x15'\x15'\x15'\x15" +"'\x15'\x15'\x15'\x15'\x15'\x15'\x15'\x15'\x15'\x15'\x15'\x15'\x15'\x15'\x15'\x15'\x15'\x15'\x15'\x15'\x15'\x15'\x15'\x15'\x15'\x15'\x15'\x15'\x15\x0f\x0f\x0f\x0f\x0f\x0f" +"\x15\x15\x15\x15\x15\x15\x15\x15''''''''\x15\x15\x15\x15\x15\x15\x0f\x0f''''''\x0f\x0f\x15\x15\x15\x15\x15\x15\x15\x15''''''''\x15\x15\x15\x15\x15\x15\x15\x15''''''''" +"\x15\x15\x15\x15\x15\x15\x0f\x0f''''''\x0f\x0f\x15\x15\x15\x15\x15\x15\x15\x15\x0f'\x0f'\x0f'\x0f'\x15\x15\x15\x15\x15\x15\x15\x15''''''''\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x0f\x0f" +"\x15\x15\x15\x15\x15\x15\x15\x15$$$$$$$$\x15\x15\x15\x15\x15\x15\x15\x15$$$$$$$$\x15\x15\x15\x15\x15\x15\x15\x15$$$$$$$$\x15\x15\x15\x15\x15\x0f\x15\x15''''$\xbd\x15\xbd" +"\xbd\xbd\x15\x15\x15\x0f\x15\x15''''$\xbd\xbd\xbd\x15\x15\x15\x15\x0f\x0f\x15\x15''''\x0f\xbd\xbd\xbd\x15\x15\x15\x15\x15\x15\x15\x15'''''\xbd\xbd\xbd\x0f\x0f\x15\x15\x15\x0f\x15\x15''''$\xbd\xbd\x0f" +'\xe2\xe2\xe2\xe2\xe2\xe2\xe2\xe2\xe2\xe2\xe2\x06\x06\x06\x07\x0c\x8b\x8c\x8c\x8b\x8b\x8b\xa6\xa9\x97\x95\xaf\x98\x97\x95\xaf\x98\xa6\xa6\xa6\xa9\xa6\xa6\xa6\xa6\xde\xdf\x08\r\x0b\t\x0e\xe0\xa0\xa2\xa0\xa0\xa2\xa6\xa9\xa9\xa9\x99\x96\xa6\xa9\xa9\xa6\x85' +'\x85\xa9\xa9\xa9\xc0\xb0\x91\xa9\xa9\xa9\xa9\xa9\xa9\xa9\xa9\xa9\xa9\xa9\xcd\xa9\x85\xa9\xa9\xa9\xa9\xa9\xa9\xa9\xa9\xa9\xa9\xe2\x06\x06\x06\x06\x0f\x0f\x0f\x0f\x0f\x0f\x06\x06\x06\x06\x06\x06x\x15\x0f\x0fwxxxxx\xc2\xc2\xcd\xb0\x91\x13' +'xwwwwxxxxx\xc2\xc2\xcd\xb0\x91\x0f\x1a\x1a\x1a\x1a\x1a\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\xb8\xb8\xb8\xb8\xb8\xb8\xb8\xb8\xb8\xb7\xb8\xb8\xb5\xb8\xb8\xb8\xb8\xb8\xb8\xb8\xb8\xb8\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f' +'\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0fee::eeee:::ee----e---::ebe::\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f' +"\xdb\xdb'\xd8\xdb\xd8\xdb'\xdb\xd8\x15'''\x15\x15'''\x13\xdb'\xd8\xdb\xdb'''''\xdb\xdb\xdb\xd8\xd8\xdb'\xdb%\xdb'\xdb'%''\xd4\x15''\xdb'\x15 \x15\xdb\xdb\x15\x15''" +"\xce\xcd\xcd\xcd\xcd'\x15\x15\x15\x15\xdb\xcd\xdb\x0f\x0f\x0f\x0f\x0f\x0f}}\x7f\x7f\x7f\x7f\x7f\x7f}}}}\x7fqqqqqqqqqqqqssssqqqqqqqqqqssssss" +'sssr\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\xc8\xc8\xc8\xc8\xc8\xd8\xd8\xd8\xd8\xd8\xcd\xcd\xdb\xdb\xdb\xdb\xcd\xdb\xdb\xcd\xdb\xdb\xcd\xdb\xdb\xdb\xdb\xdb\xdb\xdb\xcd\xdb\xdb\xdb\xdb\xdb\xdb\xdb\xdb\xdb\xd8\xd8\xdb\xdb\xdb\xdb\xdb\xdb' +'\xdb\xdb\xdb\xdb\xdb\xdb\xdb\xdb\xdb\xdb\xdb\xdb\xdb\xdb\xcd\xcd\xdb\xdb\xc8\xdb\xc8\xdb\xdb\xdb\xdb\xdb\xdb\xdb\xdb\xdb\xdb\xdb\xdb\xdb\xdb\xdb\xdb\xdb\xdb\xd8\xdb\xdb\xdb\xdb\xdb\xdb\xdb\xdb\xdb\xdb\xdb\xdb\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd' +'\xc8\xce\xc9\xc9\xce\xcd\xcd\xc8\xc9\xce\xce\xc9\xce\xce\xcd\xc8\xcd\xc9\xc2\xc6\xcd\xc9\xce\xcd\xcd\xcd\xc9\xce\xce\xc9\xc8\xc9\xc9\xce\xce\xc8\xce\xc8\xce\xc8\xc8\xc8\xc8\xc9\xc9\xce\xc9\xce\xce\xce\xce\xce\xc8\xc8\xc8\xc8\xcd\xce\xcd\xce\xc9\xc9\xce\xce' +'\xce\xce\xce\xce\xce\xce\xce\xce\xc9\xce\xce\xce\xc9\xcd\xcd\xcd\xcd\xcd\xc9\xce\xce\xce\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xce\xc9\xc8\xce\xcd\xc9\xc9\xc9\xc9\xce\xce\xc9\xc9\xcd\xcd\xc9\xc9\xce\xce\xce\xce\xce\xce\xce\xce\xce\xce\xce\xce\xce\xce\xce\xce' +'\xce\xce\xc9\xc9\xce\xce\xc9\xc9\xce\xce\xce\xce\xce\xcd\xcd\xce\xce\xce\xce\xcd\xcd\xc8\xcd\xcd\xce\xc8\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xce\xce\xcd\xc8\xce\xce\xce\xce\xce\xce\xce\xce\xce\xce\xce\xce\xce\xce\xce\xce\xce\xce\xce\xcd\xcd\xcd\xcd\xcd\xce\xc9' +'\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xce\xce\xce\xce\xce\xcd\xcd\xce\xce\xcd\xcd\xcd\xcd\xce\xce\xce\xce\xce\xce\xce\xce\xce\xce\xce\xce\xce\xce\xce\xce\xce\xce\xce\xce\xce\xce\xce\xce\xcd\xcd\xce\xce\xce\xce\xce\xce\xce\xce\xce\xce\xce\xce\xce\xce\xce\xce' +'\xdb\xdb\xdb\xdb\xdb\xdb\xdb\xdb\xce\xce\xce\xce\xdb\xdb\xdb\xdb\xdb\xdb\xd8\xdb\xdb\xdb\xdb\xdb\xdb\xdb\xdb\xdb\xdb\xdb\xdb\xdb\xce\xce\xdb\xdb\xdb\xdb\xdb\xdb\xdb\xb3\x94\xdb\xdb\xdb\xdb\xdb\xdb\xdb\xdb\xdb\xdb\xdb\xd6\xd6\xd6\xd6\xd6\xd6\xd6\xd6\xd6\xd6' +'\xd6\xd6\xd6\xd6\xd6\xd6\xd6\xd6\xd6\xd6\xd6\xd6\xd6\xd6\xd6\xd6\xd6\xd6\xd6\xd6\xd6\xd6\xd6\xd6\xd6\xd6\xd6\xd6\xd6\xd6\xd6\xd6\xd6\xd6\xd6\xd6\xd6\xd6\xd6\xd6\xd6\xd6\xd6\xd6\xd6\xd6\xd6\xd6\xd6\xd6\xd6\xd6\xd6\xd6\xd6\xd6\xd6\xd6\xd6\xdb\xcd\xdb\xdb\xdb' +'\xdb\xdb\xdb\xdb\xdb\xdb\xdb\xdb\xdb\xdb\xdb\xdb\xdb\xdb\xdb\xdb\xdb\xdb\xdb\xdb\xdb\xd6\xdb\xdb\xdb\xdb\xdb\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xaf\x90\xa9\xdb\xdb\xdb\xdb\xdb\xdb\xdb\xdb\xdb' +'\xdb\xdb\xdb\xdb\xdb\xdb\xdb\xdb\xdb\xdb\xdb\xdb\xdb\xdb\xdb\xdb\xdb\xdb\xdb\xdb\xdb\xdb\xdb\xdb\xdb\xdb\xdb\xdb\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f' +'\xdb\xdb\xdb\xdb\xdb\xdb\xdb\xdb\xdb\xdb\xdb\xdb\xdb\xdb\xdb\xdb\xdb\xdb\xdb\xdb\xdb\xdb\xdb\xdb\xdb\xdb\xdb\xdb\xdb\xdb\xdb\xdb\xdb\xdb\xdb\xdb\xdb\xdb\xdb\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f' +'\xdb\xdb\xdb\xdb\xdb\xdb\xdb\xdb\xdb\xdb\xdb\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f~~~~~~~~~}}}}}}}}}}}~~~~~~~~~}}}' +'}}}}}}}}wwwwwwwwwvvvvvvvvvvv\xd5\xd5\xd5\xd5\xd5\xd5\xd5\xd5\xd5\xd5\xd5\xd5\xd5\xd5\xd5\xd5\xd5\xd5\xd5\xd5\xd5\xd5\xd5\xd5\xd5\xd5\xd5\xd5\xd5\xd5\xd5\xd5\xd5\xd5\xd5\xd5' +'\xd5\xd5\xd5\xd5\xd5\xd5\xd5\xd5\xd5\xd5\xd5\xd5\xd5\xd5\xd5\xd5\xd5\xd5\xd5\xd5\xd5\xd5\xd5\xd5\xd5\xd5\xd5\xd5\xd5\xd5\xd5\xd5\xd5\xd5\xd5\xd5\xd5\xd5\xd5\xd5\xd5\xd5\x80}}}}}}}}}}~~~~~~~~~}~' +'\xd8\xd8\xd8\xd8\xd8\xd8\xd8\xd8\xd8\xd8\xd8\xd8\xd8\xd8\xd8\xd8\xd8\xd8\xd8\xd8\xd8\xd8\xd8\xd8\xd8\xd8\xd8\xd8\xd8\xd8\xd8\xd8\xd8\xd8\xd8\xd8\xd8\xd8\xd8\xd8\xd8\xd8\xd8\xd8\xd8\xd8\xd8\xd8\xd8\xd8\xd8\xd8\xd8\xd8\xd8\xd8\xd8\xd8\xd8\xd8\xd8\xd8\xd8\xd8' +'\xd8\xd8\xd8\xd8\xd8\xd8\xd8\xd8\xd8\xd8\xd8\xd8\xdb\xdb\xdb\xdb\xd8\xd8\xd8\xd8\xd8\xd8\xd8\xd8\xd8\xd8\xd8\xd8\xd8\xd8\xd8\xd8\xd8\xd8\xd8\xd8\xd8\xd8\xd8\xd8\xd8\xd8\xd8\xd8\xd8\xd8\xd8\xd8\xd8\xd8\xd8\xd8\xdb\xdb\xdb\xdb\xdb\xdb\xdb\xdb\xdb\xdb\xdb\xdb' +'\xd8\xd8\xd8\xd8\xd8\xd8\xd8\xd8\xd8\xd8\xd8\xd8\xd8\xd8\xd8\xd8\xdb\xdb\xd8\xd8\xd8\xd8\xdb\xdb\xdb\xdb\xdb\xdb\xdb\xdb\xdb\xdb\xd8\xd8\xdb\xd8\xd8\xd8\xd8\xd8\xd8\xd8\xdb\xdb\xdb\xdb\xdb\xdb\xdb\xdb\xd8\xd8\xdb\xdb\xd8\xc8\xdb\xdb\xdb\xdb\xd8\xd8\xdb\xdb' +'\xd8\xc8\xdb\xdb\xdb\xdb\xd8\xd8\xd8\xdb\xdb\xd8\xdb\xdb\xd8\xd8\xd8\xd8\xdb\xdb\xdb\xdb\xdb\xdb\xdb\xdb\xdb\xdb\xdb\xdb\xdb\xdb\xdb\xdb\xd8\xd8\xd8\xd8\xdb\xdb\xdb\xdb\xdb\xdb\xdb\xdb\xdb\xd8\xdb\xdb\xdb\xdb\xdb\xdb\xdb\xdb\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd' +'\xdb\xdb\xdb\xdb\xdb\xd8\xd8\xdb\xdb\xd8\xdb\xdb\xdb\xdb\xd8\xd8\xdb\xdb\xdb\xdb\xd8\xd8\xdb\xdb\xdb\xdb\xdb\xdb\xd8\xdb\xd8\xdb\xdb\xdb\xdb\xdb\xdb\xdb\xdb\xdb\xdb\xdb\xdb\xdb\xdb\xdb\xdb\xdb\xdb\xdb\xdb\xdb\xdb\xdb\xdb\xdb\xdb\xdb\xdb\xdb\xdb\xdb\xdb\xdb' +'\xd8\xdb\xd8\xdb\xdb\xdb\xdb\xdb\xdb\xdb\xdb\xdb\xdb\xdb\xdb\xdb\xdb\xdb\xdb\xdb\xdb\xdb\xdb\xdb\xdb\xdb\xdb\xdb\xdb\xdb\xdb\xdb\xd8\xd8\xdb\xd8\xd8\xd8\xdb\xd8\xd8\xd8\xd8\xdb\xd8\xd8\xdb\xc8\xdb\xdb\xdb\xdb\xdb\xdb\xdb\xdb\xdb\xdb\xdb\xdb\xdb\xdb\xdb\xdb' +'\xdb\xdb\xdb\xdb\xdb\xdb\xdb\xdb\xdb\xdb\xdb\xdb\xdb\xdb\xdb\xdb\xdb\xdb\xdb\xdb\xdb\xdb\xdb\xdb\xdb\xdb\xdb\xdb\xdb\x0f\x0f\x0f\xdb\xdb\xdb\xdb\xdb\xdb\xdb\xdb\xdb\xdb\xdb\xdb\xd6\xdb\xdb\xdb\xdb\xdb\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f' '\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f' -'\x0f\xda\xda\xda\xda\x0f\xda\xda\xda\xda\x0f\x0f\xda\xda\xda\xda\xda\xda\xda\xda\xda\xda\xda\xda\xda\xda\xda\xda\xda\xda\xda\xda\xda\xda\xda\xda\xda\xda\xda\xda\x0f\xda\xda\xda\xda\xda\xda\xda\xda\xda\xda\xda\xda\xda\xda\xda\xda\xda\xda\xda\xda\xd7\xda\xda' -'\xda\xda\xda\xda\xda\xda\xda\xda\xda\xda\xda\xda\x0f\xda\x0f\xda\xda\xda\xda\x0f\x0f\x0f\xda\x0f\xda\xda\xda\xda\xda\xda\xda\x0f\x0f\xda\xda\xda\xda\xda\xda\xda\xaf\x90\xaf\x90\xaf\x90\xaf\x90\xaf\x90\xaf\x90\xaf\x90}}}}}}}}}|' -'\x7f\x7f\x7f\x7f\x7f\x7f\x7f\x7f\x7f~\x7f\x7f\x7f\x7f\x7f\x7f\x7f\x7f\x7f~\xda\x0f\x0f\x0f\xda\xda\xda\xda\xda\xda\xda\xda\xda\xda\xda\xda\xda\xda\xda\xda\xda\xda\xda\xda\xda\xda\xda\xda\x0f\xda\xda\xda\xda\xda\xda\xda\xda\xda\xda\xda\xda\xda\xda\x0f' -'\xcd\xcc\xcc\xcd\xcd\xaf\x90\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\xcc\xcc\xcc\xcd\xcd\xcd\xcd\xcc\xcc\xcc\xcc\xcc\xcd\xcd\xcd\xcc\xcc\xcc\xcd\xcd\xcd\xcd\xb0\x91\xb0\x91\xb0\x91\x0f\x0f\x0f\x0f\xcc\xcc\xcc\xcc\xcc\xcc\xcc\xcc\xcc\xcc\xcc\xcc\xcc\xcc\xcc\xcc' -'\xd5\xd5\xd5\xd5\xd5\xd5\xd5\xd5\xd5\xd5\xd5\xd5\xd5\xd5\xd5\xd5\xd5\xd5\xd5\xd5\xd5\xd5\xd5\xd5\xd5\xd5\xd5\xd5\xd5\xd5\xd5\xd5\xd5\xd5\xd5\xd5\xd5\xd5\xd5\xd5\xd5\xd5\xd5\xd5\xd5\xd5\xd5\xd5\xd5\xd5\xd5\xd5\xd5\xd5\xd5\xd5\xd5\xd5\xd5\xd5\xd5\xd5\xd5\xd5' -'\xd5\xd5\xd5\xd5\xd5\xd5\xd5\xd5\xd5\xd5\xd5\xd5\xd5\xd5\xd5\xd5\xd5\xd5\xd5\xd5\xd5\xd5\xd5\xd5\xd5\xd5\xd5\xd5\xd5\xd5\xd5\xd5\xd5\xd5\xd5\xd5\xd5\xd5\xd5\xd5\xd5\xd5\xd5\xd5\xd5\xd5\xd5\xd5\xd5\xd5\xd5\xd5\xd5\xd5\xd5\xd5\xd5\xd5\xd5\xd5\xd5\xd5\xd5\xd5' -'\xd5\xd5\xd5\xd5\xd5\xd5\xd5\xd5\xd5\xd5\xd5\xd5\xd5\xd5\xd5\xd5\xd5\xd5\xd5\xd5\xd5\xd5\xd5\xd5\xd5\xd5\xd5\xd5\xd5\xd5\xd5\xd5\xd5\xd5\xd5\xd5\xd5\xd5\xd5\xd5\xd5\xd5\xd5\xd5\xd5\xd5\xd5\xd5\xd5\xd5\xd5\xd5\xd5\xd5\xd5\xd5\xd5\xd5\xd5\xd5\xd5\xd5\xd5\xd5' -'\xd5\xd5\xd5\xd5\xd5\xd5\xd5\xd5\xd5\xd5\xd5\xd5\xd5\xd5\xd5\xd5\xd5\xd5\xd5\xd5\xd5\xd5\xd5\xd5\xd5\xd5\xd5\xd5\xd5\xd5\xd5\xd5\xd5\xd5\xd5\xd5\xd5\xd5\xd5\xd5\xd5\xd5\xd5\xd5\xd5\xd5\xd5\xd5\xd5\xd5\xd5\xd5\xd5\xd5\xd5\xd5\xd5\xd5\xd5\xd5\xd5\xd5\xd5\xd5' -'\xcc\xcc\xcc\xcc\xcc\xcc\xcc\xcc\xcc\xcc\xcc\xcc\xcc\xcc\xcc\xcc\xcc\xcc\xcc\xcc\xcc\xcc\xcc\xcc\xcc\xcc\xcc\xcc\xcc\xcc\xcc\xcc\xcc\xcc\xcc\xcc\xcc\xcc\xcc\xcc\xcc\xcc\xcc\xcc\xcc\xcc\xcc\xcc\xcc\xcc\xcc\xcc\xcc\xcc\xcc\xcc\xcc\xcc\xcc\xcc\xcc\xcc\xcc\xcc' -'\xcc\xcc\xcc\xcc\xcc\xcc\xcc\xcc\xcc\xcc\xcc\xcc\xcc\xcc\xcc\xcc\xcc\xcc\xcc\xcc\xcc\xcc\xcc\xcc\xcc\xcc\xcc\xcc\xcc\xcc\xcc\xcc\xcc\xcc\xcc\xcc\xcc\xcc\xcc\xcc\xcc\xcc\xcc\xcc\xcc\xcc\xcc\xcc\xcc\xcc\xcc\xcc\xcc\xcc\xcc\xcc\xcc\xcc\xcc\xcc\xcc\xcc\xcc\xcc' -'\xcc\xcc\xcc\xaf\x90\xb0\x91\xaf\x90\xaf\x90\xaf\x90\xaf\x90\xaf\x90\xaf\x90\xaf\x90\xaf\x90\xaf\x90\xcc\xcc\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcc\xcc\xcc\xcc\xcc\xcc\xcc\xcc\xcd\xcc\xcc\xcc\xcc\xcc\xcc\xcc' -'\xcd\xcd\xcd\xcd\xcd\xcd\xcc\xcc\xcc\xcd\xcc\xcc\xcc\xcc\xcd\xcd\xcd\xcd\xcd\xcc\xcd\xcd\xcc\xcc\xaf\x90\xaf\x90\xcd\xcc\xcc\xcc\xcc\xcd\xcc\xcd\xcd\xcd\xcc\xcc\xcd\xcd\xcc\xcc\xcc\xcc\xcc\xcc\xcc\xcc\xcc\xcc\xcd\xcd\xcd\xcd\xcd\xcd\xcc\xcc\xaf\x90\xcc\xcc' -'\xcc\xcc\xcc\xcc\xcc\xcc\xcc\xcc\xcc\xcc\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcc\xcd\xcd\xcd\xcd\xcc\xcc\xcd\xcc\xcd\xcc\xcc\xcd\xcc\xcd\xcd\xcd\xcd\xcc\xcc\xcc\xcc\xcc\xcd\xcd\xcc\xcc\xcc\xcc\xcc\xcc\xcd\xcd\xcd\xcc' -'\xcc\xcc\xcc\xcc\xcc\xcc\xcc\xcc\xcc\xcc\xcc\xcc\xcc\xcc\xcc\xcc\xcc\xcc\xcc\xcc\xcc\xcc\xcc\xcd\xcd\xcc\xcc\xcc\xcc\xcc\xcc\xcc\xcc\xcc\xcc\xcc\xcd\xcd\xcc\xcc\xcc\xcc\xcd\xcd\xcd\xcd\xcc\xcd\xcd\xcc\xcc\xcd\xcd\xcc\xcc\xcc\xcc\xcd\xcd\xcd\xcd\xcd\xcd\xcd' -'\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcc\xcc\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcc\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd' -'\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcc\xcc\xcc\xcc\xcc\xcd\xcc\xcd\xcc\xcc\xcc\xcd\xcd\xcd\xcd\xcd\xcc\xcc\xcc\xcc\xcc\xcd\xcd\xcd\xcc\xcc\xcc\xcc\xcd\xcc\xcc\xcc\xcd\xcd\xcd\xcd\xcd\xcc\xcd\xcc\xcc' -'\xda\xda\xda\xda\xda\xda\xda\xda\xda\xda\xda\xda\xda\xda\xda\xda\xda\xda\xda\xda\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f' +'\x0f\xdb\xdb\xdb\xdb\x0f\xdb\xdb\xdb\xdb\x0f\x0f\xdb\xdb\xdb\xdb\xdb\xdb\xdb\xdb\xdb\xdb\xdb\xdb\xdb\xdb\xdb\xdb\xdb\xdb\xdb\xdb\xdb\xdb\xdb\xdb\xdb\xdb\xdb\xdb\x0f\xdb\xdb\xdb\xdb\xdb\xdb\xdb\xdb\xdb\xdb\xdb\xdb\xdb\xdb\xdb\xdb\xdb\xdb\xdb\xdb\xd8\xdb\xdb' +'\xdb\xdb\xdb\xdb\xdb\xdb\xdb\xdb\xdb\xdb\xdb\xdb\x0f\xdb\x0f\xdb\xdb\xdb\xdb\x0f\x0f\x0f\xdb\x0f\xdb\xdb\xdb\xdb\xdb\xdb\xdb\x0f\x0f\xdb\xdb\xdb\xdb\xdb\xdb\xdb\xb0\x91\xb0\x91\xb0\x91\xb0\x91\xb0\x91\xb0\x91\xb0\x91~~~~~~~~~}' +'\x80\x80\x80\x80\x80\x80\x80\x80\x80\x7f\x80\x80\x80\x80\x80\x80\x80\x80\x80\x7f\xdb\x0f\x0f\x0f\xdb\xdb\xdb\xdb\xdb\xdb\xdb\xdb\xdb\xdb\xdb\xdb\xdb\xdb\xdb\xdb\xdb\xdb\xdb\xdb\xdb\xdb\xdb\xdb\x0f\xdb\xdb\xdb\xdb\xdb\xdb\xdb\xdb\xdb\xdb\xdb\xdb\xdb\xdb\x0f' +'\xce\xcd\xcd\xce\xce\xb0\x91\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\xcd\xcd\xcd\xce\xce\xce\xce\xcd\xcd\xcd\xcd\xcd\xce\xce\xce\xcd\xcd\xcd\xce\xce\xce\xce\xb1\x92\xb1\x92\xb1\x92\x0f\x0f\x0f\x0f\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd' +'\xd6\xd6\xd6\xd6\xd6\xd6\xd6\xd6\xd6\xd6\xd6\xd6\xd6\xd6\xd6\xd6\xd6\xd6\xd6\xd6\xd6\xd6\xd6\xd6\xd6\xd6\xd6\xd6\xd6\xd6\xd6\xd6\xd6\xd6\xd6\xd6\xd6\xd6\xd6\xd6\xd6\xd6\xd6\xd6\xd6\xd6\xd6\xd6\xd6\xd6\xd6\xd6\xd6\xd6\xd6\xd6\xd6\xd6\xd6\xd6\xd6\xd6\xd6\xd6' +'\xd6\xd6\xd6\xd6\xd6\xd6\xd6\xd6\xd6\xd6\xd6\xd6\xd6\xd6\xd6\xd6\xd6\xd6\xd6\xd6\xd6\xd6\xd6\xd6\xd6\xd6\xd6\xd6\xd6\xd6\xd6\xd6\xd6\xd6\xd6\xd6\xd6\xd6\xd6\xd6\xd6\xd6\xd6\xd6\xd6\xd6\xd6\xd6\xd6\xd6\xd6\xd6\xd6\xd6\xd6\xd6\xd6\xd6\xd6\xd6\xd6\xd6\xd6\xd6' +'\xd6\xd6\xd6\xd6\xd6\xd6\xd6\xd6\xd6\xd6\xd6\xd6\xd6\xd6\xd6\xd6\xd6\xd6\xd6\xd6\xd6\xd6\xd6\xd6\xd6\xd6\xd6\xd6\xd6\xd6\xd6\xd6\xd6\xd6\xd6\xd6\xd6\xd6\xd6\xd6\xd6\xd6\xd6\xd6\xd6\xd6\xd6\xd6\xd6\xd6\xd6\xd6\xd6\xd6\xd6\xd6\xd6\xd6\xd6\xd6\xd6\xd6\xd6\xd6' +'\xd6\xd6\xd6\xd6\xd6\xd6\xd6\xd6\xd6\xd6\xd6\xd6\xd6\xd6\xd6\xd6\xd6\xd6\xd6\xd6\xd6\xd6\xd6\xd6\xd6\xd6\xd6\xd6\xd6\xd6\xd6\xd6\xd6\xd6\xd6\xd6\xd6\xd6\xd6\xd6\xd6\xd6\xd6\xd6\xd6\xd6\xd6\xd6\xd6\xd6\xd6\xd6\xd6\xd6\xd6\xd6\xd6\xd6\xd6\xd6\xd6\xd6\xd6\xd6' +'\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd' +'\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd' +'\xcd\xcd\xcd\xb0\x91\xb1\x92\xb0\x91\xb0\x91\xb0\x91\xb0\x91\xb0\x91\xb0\x91\xb0\x91\xb0\x91\xb0\x91\xcd\xcd\xce\xce\xce\xce\xce\xce\xce\xce\xce\xce\xce\xce\xce\xce\xce\xce\xce\xce\xce\xce\xce\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xce\xcd\xcd\xcd\xcd\xcd\xcd\xcd' +'\xce\xce\xce\xce\xce\xce\xcd\xcd\xcd\xce\xcd\xcd\xcd\xcd\xce\xce\xce\xce\xce\xcd\xce\xce\xcd\xcd\xb0\x91\xb0\x91\xce\xcd\xcd\xcd\xcd\xce\xcd\xce\xce\xce\xcd\xcd\xce\xce\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xce\xce\xce\xce\xce\xce\xcd\xcd\xb0\x91\xcd\xcd' +'\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xce\xce\xce\xce\xce\xce\xce\xce\xce\xce\xce\xce\xce\xce\xce\xce\xce\xce\xce\xcd\xce\xce\xce\xce\xcd\xcd\xce\xcd\xce\xcd\xcd\xce\xcd\xce\xce\xce\xce\xcd\xcd\xcd\xcd\xcd\xce\xce\xcd\xcd\xcd\xcd\xcd\xcd\xce\xce\xce\xcd' +'\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xce\xce\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xce\xce\xcd\xcd\xcd\xcd\xce\xce\xce\xce\xcd\xce\xce\xcd\xcd\xce\xce\xcd\xcd\xcd\xcd\xce\xce\xce\xce\xce\xce\xce' +'\xce\xce\xce\xce\xce\xce\xce\xce\xce\xce\xce\xce\xce\xce\xce\xce\xce\xce\xce\xce\xce\xce\xce\xce\xce\xce\xce\xce\xce\xce\xce\xce\xce\xce\xce\xce\xcd\xcd\xce\xce\xce\xce\xce\xce\xce\xce\xcd\xce\xce\xce\xce\xce\xce\xce\xce\xce\xce\xce\xce\xce\xce\xce\xce\xce' +'\xce\xce\xce\xce\xce\xce\xce\xce\xce\xce\xce\xce\xce\xce\xce\xce\xce\xce\xce\xce\xce\xce\xce\xcd\xcd\xcd\xcd\xcd\xce\xcd\xce\xcd\xcd\xcd\xce\xce\xce\xce\xce\xcd\xcd\xcd\xcd\xcd\xce\xce\xce\xcd\xcd\xcd\xcd\xce\xcd\xcd\xcd\xce\xce\xce\xce\xce\xcd\xce\xcd\xcd' +'\xdb\xdb\xdb\xdb\xdb\xdb\xdb\xdb\xdb\xdb\xdb\xdb\xdb\xdb\xdb\xdb\xdb\xdb\xdb\xdb\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f' '\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f' '\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f' '\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f' -'&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&\x0f\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15' +"'''''''''''''''''''''''''''''''''''''''''''''''\x0f\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15" '\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f' -'&\x15&\x15&\x15&\x15&\x15&\x15&\x15&\x15&\x15&\x15&\x15&\x15&\x15&\x15&\x15&\x15&\x15&\x15&\x15&\x15&\x15&\x15&\x15&\x15&\x15&\x15&\x15&\x15&\x15&\x15&\x15&\x15' -'&\x15&\x15&\x15&\x15&\x15&\x15&\x15&\x15&\x15&\x15&\x15&\x15&\x15&\x15&\x15&\x15&\x15&\x15\x15\xda\xda\xda\xda\xda\xda\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\xa8\xa8\xa8\xa8~\xa8\xa8' +"'\x15'\x15'\x15'\x15'\x15'\x15'\x15'\x15'\x15'\x15'\x15'\x15'\x15'\x15'\x15'\x15'\x15'\x15'\x15'\x15'\x15'\x15'\x15'\x15'\x15'\x15'\x15'\x15'\x15'\x15'\x15'\x15" +"'\x15'\x15'\x15'\x15'\x15'\x15'\x15'\x15'\x15'\x15'\x15'\x15'\x15'\x15'\x15'\x15'\x15'\x15\x15\xdb\xdb\xdb\xdb\xdb\xdb\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\xa9\xa9\xa9\xa9\x7f\xa9\xa9" '\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f ' ' \x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x1a\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f' ' \x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f \x0f \x0f \x0f \x0f' ' \x0f \x0f \x0f \x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f' -'\xa8\xa8\x98\x95\x98\x95\xa8\xa8\xa8\x98\x95\xa8\x98\x95\xa8\xa8\xa8\xa8\xa8\xa8\xa8\xa8\xa8\x8b\x0f\x0f\x0f\x0f\x98\x95\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f' +'\xa9\xa9\x99\x96\x99\x96\xa9\xa9\xa9\x99\x96\xa9\x99\x96\xa9\xa9\xa9\xa9\xa9\xa9\xa9\xa9\xa9\x8c\x0f\x0f\x0f\x0f\x99\x96\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f' '\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f' -'\xdc\xdc\xdc\xdc\xdc\xdc\xdc\xdc\xdc\xdc\xdc\xdc\xdc\xdc\xdc\xdc\xdc\xdc\xdc\xdc\xdc\xdc\xdc\xdc\xdc\xdc\x0f\xdc\xdc\xdc\xdc\xdc\xdc\xdc\xdc\xdc\xdc\xdc\xdc\xdc\xdc\xdc\xdc\xdc\xdc\xdc\xdc\xdc\xdc\xdc\xdc\xdc\xdc\xdc\xdc\xdc\xdc\xdc\xdc\xdc\xdc\xdc\xdc\xdc' -'\xdc\xdc\xdc\xdc\xdc\xdc\xdc\xdc\xdc\xdc\xdc\xdc\xdc\xdc\xdc\xdc\xdc\xdc\xdc\xdc\xdc\xdc\xdc\xdc\xdc\xdc\xdc\xdc\xdc\xdc\xdc\xdc\xdc\xdc\xdc\xdc\xdc\xdc\xdc\xdc\xdc\xdc\xdc\xdc\xdc\xdc\xdc\xdc\xdc\xdc\xdc\xdc\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f' -'\xdc\xdc\xdc\xdc\xdc\xdc\xdc\xdc\xdc\xdc\xdc\xdc\xdc\xdc\xdc\xdc\xdc\xdc\xdc\xdc\xdc\xdc\xdc\xdc\xdc\xdc\xdc\xdc\xdc\xdc\xdc\xdc\xdc\xdc\xdc\xdc\xdc\xdc\xdc\xdc\xdc\xdc\xdc\xdc\xdc\xdc\xdc\xdc\xdc\xdc\xdc\xdc\xdc\xdc\xdc\xdc\xdc\xdc\xdc\xdc\xdc\xdc\xdc\xdc' -'\xdc\xdc\xdc\xdc\xdc\xdc\xdc\xdc\xdc\xdc\xdc\xdc\xdc\xdc\xdc\xdc\xdc\xdc\xdc\xdc\xdc\xdc\xdc\xdc\xdc\xdc\xdc\xdc\xdc\xdc\xdc\xdc\xdc\xdc\xdc\xdc\xdc\xdc\xdc\xdc\xdc\xdc\xdc\xdc\xdc\xdc\xdc\xdc\xdc\xdc\xdc\xdc\xdc\xdc\xdc\xdc\xdc\xdc\xdc\xdc\xdc\xdc\xdc\xdc' -'\xdc\xdc\xdc\xdc\xdc\xdc\xdc\xdc\xdc\xdc\xdc\xdc\xdc\xdc\xdc\xdc\xdc\xdc\xdc\xdc\xdc\xdc\xdc\xdc\xdc\xdc\xdc\xdc\xdc\xdc\xdc\xdc\xdc\xdc\xdc\xdc\xdc\xdc\xdc\xdc\xdc\xdc\xdc\xdc\xdc\xdc\xdc\xdc\xdc\xdc\xdc\xdc\xdc\xdc\xdc\xdc\xdc\xdc\xdc\xdc\xdc\xdc\xdc\xdc' -'\xdc\xdc\xdc\xdc\xdc\xdc\xdc\xdc\xdc\xdc\xdc\xdc\xdc\xdc\xdc\xdc\xdc\xdc\xdc\xdc\xdc\xdc\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\xdc\xdc\xdc\xdc\xdc\xdc\xdc\xdc\xdc\xdc\xdc\xdc\x0f\x0f\x0f\x0f' -'\xe0\xaa\xaa\xaa\xdc\x1b!s\xb2\x93\xb2\x93\xb2\x93\xb2\x93\xb2\x93\xdc\xdc\xb2\x93\xb2\x93\xb2\x93\xb2\x93\x8c\xb1\x92\x92\xdcsssssssssfijghh\x8c\x1b\x1b\x1b\x1b\x1b\xdc\xdcsss\x1b!\xaa\xdc\xda' +'\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\x0f\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd' +'\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f' +'\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd' +'\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd' +'\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd' +'\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\x0f\x0f\x0f\x0f' +'\xe1\xab\xab\xab\xdd\x1b!t\xb3\x94\xb3\x94\xb3\x94\xb3\x94\xb3\x94\xdd\xdd\xb3\x94\xb3\x94\xb3\x94\xb3\x94\x8d\xb2\x93\x93\xddtttttttttgjkhii\x8d\x1b\x1b\x1b\x1b\x1b\xdd\xddttt\x1b!\xab\xdd\xdb' '\x0f!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!' -'!!!!!!!!!!!!!!!!!!!!!!!\x0f\x0fee\xbe\xbe\x1b\x1b!\x8c!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!' -'!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!\xaa\x1b\x1b\x1b!' +'!!!!!!!!!!!!!!!!!!!!!!!\x0f\x0fff\xbf\xbf\x1b\x1b!\x8d!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!' +'!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!\xab\x1b\x1b\x1b!' '\x0f\x0f\x0f\x0f\x0f!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!\x0f\x0f\x0f\x0f!!!!!!!!!!!!!!!' '!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!' -'!!!!!!!!!!!!!!!\x0f\xd6\xd6{{{{\xd6\xd6\xd6\xd6\xd6\xd6\xd6\xd6\xd6\xd6!!!!!!!!!!!!!!!!!!!!!!!!\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f' -'\xdc\xdc\xdc\xdc\xdc\xdc\xdc\xdc\xdc\xdc\xdc\xdc\xdc\xdc\xdc\xdc\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f!!!!!!!!!!!!!!!!' -'\xd6\xd6\xd6\xd6\xd6\xd6\xd6\xd6\xd6\xd6\xd6\xd6\xd6\xd6\xd6\xd6\xd6\xd6\xd6\xd6\xd6\xd6\xd6\xd6\xd6\xd6\xd6\xd6\xd6\xdc\xdc\x0f{{{{{{{{{{\xd6\xd6\xd6\xd6\xd6\xd6\xd6\xd6\xd6\xd6\xd6\xd6\xd6\xd6\xd6\xd6\xd6\xd6\xd6\xd6\xd6\xd6' -'\xd6\xd6\xd6\xd6\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\xdc\x80\x80\x80\x80\x80\x80\x80\x80\x80\x80\x80\x80\x80\x80\x80\xd6\xd6\xd6\xd6\xd6\xd6\xd6\xd6\xd6\xd6\xd6\xd6\xd6\xd6\xd6\xd6\xd6\xd6\xd6\xd6\xd6\xd6\xd6\xd6\xd6\xd6\xd6\xd6\xdc\xdc\xdc\xd6' -'{{{{{{{{{{\xd6\xd6\xd6\xd6\xd6\xd6\xd6\xd6\xd6\xd6\xd6\xd6\xd6\xd6\xd6\xd6\xd6\xd6\xd6\xd6\xd6\xd6\xd6\xd6\xd6\xd6\xd6\xd6\xd6\xd6\xd6\xd6\xd6\xd6\xd6\xd6\xd6\xd6\xd6\x80\x80\x80\x80\x80\x80\x80\x80\x80\x80\x80\x80\x80\x80\x80' -'\xd6\xd6\xd6\xd6\xd6\xd6\xd6\xd6\xd6\xd6\xd6\xd6\xdc\xdc\xdc\xdc\xd6\xd6\xd6\xd6\xd6\xd6\xd6\xd6\xd6\xd6\xd6\xd6\xd6\xd6\xd6\xd6\xd6\xd6\xd6\xd6\xd6\xd6\xd6\xd6\xd6\xd6\xd6\xd6\xd6\xd6\xd6\xd6\xd6\xd6\xd6\xd6\xd6\xd6\xd6\xd6\xd6\xd6\xd6\xd6\xd6\xd6\xd6\x0f' -'\xd6\xd6\xd6\xd6\xd6\xd6\xd6\xd6\xd6\xd6\xd6\xd6\xd6\xd6\xd6\xd6\xd6\xd6\xd6\xd6\xd6\xd6\xd6\xd6\xd6\xd6\xd6\xd6\xd6\xd6\xd6\xd6\xd6\xd6\xd6\xd6\xd6\xd6\xd6\xd6\xd6\xd6\xd6\xd6\xd6\xd6\xd6\xd6\xd6\xd6\xd6\xd6\xd6\xd6\xd6\xd6\xd6\xd6\xd6\xd6\xd6\xd6\xd6\xd6' -'\xd6\xd6\xd6\xd6\xd6\xd6\xd6\xd6\xd6\xd6\xd6\xd6\xd6\xd6\xd6\xd6\xd6\xd6\xd6\xd6\xd6\xd6\xd6\xd6\xd6\xd6\xd6\xd6\xd6\xd6\xd6\xd6\xd6\xd6\xd6\xd6\xd6\xd6\xd6\xd6\xd6\xd6\xd6\xd6\xd6\xd6\xd6\xd6\xd6\xd6\xd6\xd6\xd6\xd6\xd6\xdc\xdc\xdc\xdc\xd6\xd6\xd6\xd6\xd6' -'\xd6\xd6\xd6\xd6\xd6\xd6\xd6\xd6\xd6\xd6\xd6\xd6\xd6\xd6\xd6\xd6\xd6\xd6\xd6\xd6\xd6\xd6\xd6\xd6\xd6\xd6\xd6\xd6\xd6\xd6\xd6\xd6\xd6\xd6\xd6\xd6\xd6\xd6\xd6\xd6\xd6\xd6\xd6\xd6\xd6\xd6\xd6\xd6\xd6\xd6\xd6\xd6\xd6\xd6\xd6\xd6\xd6\xd6\xd6\xd6\xd6\xd6\xd6\xd6' -'\xd6\xd6\xd6\xd6\xd6\xd6\xd6\xd6\xd6\xd6\xd6\xd6\xd6\xd6\xd6\xd6\xd6\xd6\xd6\xd6\xd6\xd6\xd6\xd6\xd6\xd6\xd6\xd6\xd6\xd6\xdc\xdc\xd6\xd6\xd6\xd6\xd6\xd6\xd6\xd6\xd6\xd6\xd6\xd6\xd6\xd6\xd6\xd6\xd6\xd6\xd6\xd6\xd6\xd6\xd6\xd6\xd6\xd6\xd6\xd6\xd6\xd6\xd6\xdc' +'!!!!!!!!!!!!!!!\x0f\xd7\xd7||||\xd7\xd7\xd7\xd7\xd7\xd7\xd7\xd7\xd7\xd7!!!!!!!!!!!!!!!!!!!!!!!!\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f' +'\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f!!!!!!!!!!!!!!!!' +'\xd7\xd7\xd7\xd7\xd7\xd7\xd7\xd7\xd7\xd7\xd7\xd7\xd7\xd7\xd7\xd7\xd7\xd7\xd7\xd7\xd7\xd7\xd7\xd7\xd7\xd7\xd7\xd7\xd7\xdd\xdd\x0f||||||||||\xd7\xd7\xd7\xd7\xd7\xd7\xd7\xd7\xd7\xd7\xd7\xd7\xd7\xd7\xd7\xd7\xd7\xd7\xd7\xd7\xd7\xd7' +'\xd7\xd7\xd7\xd7\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\xdd\x81\x81\x81\x81\x81\x81\x81\x81\x81\x81\x81\x81\x81\x81\x81\xd7\xd7\xd7\xd7\xd7\xd7\xd7\xd7\xd7\xd7\xd7\xd7\xd7\xd7\xd7\xd7\xd7\xd7\xd7\xd7\xd7\xd7\xd7\xd7\xd7\xd7\xd7\xd7\xdd\xdd\xdd\xd7' +'||||||||||\xd7\xd7\xd7\xd7\xd7\xd7\xd7\xd7\xd7\xd7\xd7\xd7\xd7\xd7\xd7\xd7\xd7\xd7\xd7\xd7\xd7\xd7\xd7\xd7\xd7\xd7\xd7\xd7\xd7\xd7\xd7\xd7\xd7\xd7\xd7\xd7\xd7\xd7\xd7\x81\x81\x81\x81\x81\x81\x81\x81\x81\x81\x81\x81\x81\x81\x81' +'\xd7\xd7\xd7\xd7\xd7\xd7\xd7\xd7\xd7\xd7\xd7\xd7\xdd\xdd\xdd\xdd\xd7\xd7\xd7\xd7\xd7\xd7\xd7\xd7\xd7\xd7\xd7\xd7\xd7\xd7\xd7\xd7\xd7\xd7\xd7\xd7\xd7\xd7\xd7\xd7\xd7\xd7\xd7\xd7\xd7\xd7\xd7\xd7\xd7\xd7\xd7\xd7\xd7\xd7\xd7\xd7\xd7\xd7\xd7\xd7\xd7\xd7\xd7\x0f' +'\xd7\xd7\xd7\xd7\xd7\xd7\xd7\xd7\xd7\xd7\xd7\xd7\xd7\xd7\xd7\xd7\xd7\xd7\xd7\xd7\xd7\xd7\xd7\xd7\xd7\xd7\xd7\xd7\xd7\xd7\xd7\xd7\xd7\xd7\xd7\xd7\xd7\xd7\xd7\xd7\xd7\xd7\xd7\xd7\xd7\xd7\xd7\xd7\xd7\xd7\xd7\xd7\xd7\xd7\xd7\xd7\xd7\xd7\xd7\xd7\xd7\xd7\xd7\xd7' +'\xd7\xd7\xd7\xd7\xd7\xd7\xd7\xd7\xd7\xd7\xd7\xd7\xd7\xd7\xd7\xd7\xd7\xd7\xd7\xd7\xd7\xd7\xd7\xd7\xd7\xd7\xd7\xd7\xd7\xd7\xd7\xd7\xd7\xd7\xd7\xd7\xd7\xd7\xd7\xd7\xd7\xd7\xd7\xd7\xd7\xd7\xd7\xd7\xd7\xd7\xd7\xd7\xd7\xd7\xd7\xdd\xdd\xdd\xdd\xd7\xd7\xd7\xd7\xd7' +'\xd7\xd7\xd7\xd7\xd7\xd7\xd7\xd7\xd7\xd7\xd7\xd7\xd7\xd7\xd7\xd7\xd7\xd7\xd7\xd7\xd7\xd7\xd7\xd7\xd7\xd7\xd7\xd7\xd7\xd7\xd7\xd7\xd7\xd7\xd7\xd7\xd7\xd7\xd7\xd7\xd7\xd7\xd7\xd7\xd7\xd7\xd7\xd7\xd7\xd7\xd7\xd7\xd7\xd7\xd7\xd7\xd7\xd7\xd7\xd7\xd7\xd7\xd7\xd7' +'\xd7\xd7\xd7\xd7\xd7\xd7\xd7\xd7\xd7\xd7\xd7\xd7\xd7\xd7\xd7\xd7\xd7\xd7\xd7\xd7\xd7\xd7\xd7\xd7\xd7\xd7\xd7\xd7\xd7\xd7\xdd\xdd\xd7\xd7\xd7\xd7\xd7\xd7\xd7\xd7\xd7\xd7\xd7\xd7\xd7\xd7\xd7\xd7\xd7\xd7\xd7\xd7\xd7\xd7\xd7\xd7\xd7\xd7\xd7\xd7\xd7\xd7\xd7\xdd' +'!!!!!"!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!' +'!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!' +'!!!"!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!' +'!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!' +'!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!' '!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!' '!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!' '!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!' +'!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!"!!!!!!!!!!!!!!!!!!!!!' +'!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!' +'!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!' +'!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!' +'!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!' +'!!!!!!!!!!!!!"!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!' +'!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!' '!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!' '!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!' '!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!' '!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f' -'\xda\xda\xda\xda\xda\xda\xda\xda\xda\xda\xda\xda\xda\xda\xda\xda\xda\xda\xda\xda\xda\xda\xda\xda\xda\xda\xda\xda\xda\xda\xda\xda\xda\xda\xda\xda\xda\xda\xda\xda\xda\xda\xda\xda\xda\xda\xda\xda\xda\xda\xda\xda\xda\xda\xda\xda\xda\xda\xda\xda\xda\xda\xda\xda' +'\xdb\xdb\xdb\xdb\xdb\xdb\xdb\xdb\xdb\xdb\xdb\xdb\xdb\xdb\xdb\xdb\xdb\xdb\xdb\xdb\xdb\xdb\xdb\xdb\xdb\xdb\xdb\xdb\xdb\xdb\xdb\xdb\xdb\xdb\xdb\xdb\xdb\xdb\xdb\xdb\xdb\xdb\xdb\xdb\xdb\xdb\xdb\xdb\xdb\xdb\xdb\xdb\xdb\xdb\xdb\xdb\xdb\xdb\xdb\xdb\xdb\xdb\xdb\xdb' +'"!!"!!!"!"!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!' +'!!!!!!!!!!!!!!!!!!!!!!!!!!!!!"!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!' +'!!!!!!!!!!!!"!!!!!!!"!"!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!"' +'"!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!"!!!!!!!!"!!!!!!!!!!!!!!!!!!!!!!!' +'!!!!!!!!!!!!!"!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!' +'!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!"!!!!!!!!!!!!!!!' +'!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!' +'!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!' +'!!!!"!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!' +'!!!!!!"!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!"!"!"!!!!!!!!!!!!!!!!!!' +'!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!' +'!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!' +'!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!' +'!"!"""!!!!!!"!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!' +'!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!' +'!""""!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!' +'!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!' +'!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!' +'!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!' +'!!!!!!!!!!!!!!!!!!!!!!!!!!!"!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!' +'!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!' +'!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!' +'!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!' +'!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!"!!!!!!!"!!!!!!' +'!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!' +'!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!"!!!!!' +'!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!' +'!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!""' +'!!!!!!!!!!!!"""!"!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!' +'!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!' +'!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!' +'!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!' +'!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!' +'!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!' +'!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!' +'!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!"!' +'!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!' +'!!!!!!!!!!!!"!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!' +'!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!' +'!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!' +'!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!' +'!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!' +'!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!' +'!!!!!!!!!!!!!!!!!!"!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!' +'!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!' +'!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!' +'!!!!!!!!!!!!!!!!!!!!!!"!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!' +'!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!' +'!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!' +'!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!"!' +'!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!' +'!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!' +'!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!' +'!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!' +'!!!!!!"!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!' +'!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!' +'!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!"!!!!!!!!!!!!!!!!!!!' +'!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!' +'!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!' +'!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!' +'!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!' +'!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!' +'!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!"!!!!"!!!!!!!!!!!!' +'!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!' +'!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!"!!!!!!!!!!!!!!!' +'!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!' +'!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!' +'!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!' +'!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!' +'!!!!!!"!!!!!"!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!"!!!!!!!' +'!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!' +'!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!"!!!!!!!!!' '!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!' '!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!' '!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!\x0f\x0f\x0f\x0f' @@ -16874,13 +16959,13 @@ '!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!' '!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!' '!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!' -'!!!!!!!!!!!!!\x0f\x0f\x0f\xdc\xdc\xdc\xdc\xdc\xdc\xdc\xdc\xdc\xdc\xdc\xdc\xdc\xdc\xdc\xdc\xdc\xdc\xdc\xdc\xdc\xdc\xdc\xdc\xdc\xdc\xdc\xdc\xdc\xdc\xdc\xdc\xdc\xdc\xdc\xdc\xdc\xdc\xdc\xdc\xdc\xdc\xdc\xdc\xdc\xdc\xdc\xdc' -'\xdc\xdc\xdc\xdc\xdc\xdc\xdc\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f' -'\xbc\xbc\xbc\xbc\xbc\xbc\xbc\xbc\xbc\xbc\xbc\xbc\xbc\xbc\xbc\xbc\xbc\xbc\xbc\xbc\xbc\xbc\xbc\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f' +'!!!!!!!!!!!!!\x0f\x0f\x0f\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd' +'\xdd\xdd\xdd\xdd\xdd\xdd\xdd\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f' +'\xbd\xbd\xbd\xbd\xbd\xbd\xbd\xbd\xbd\xbd\xbd\xbd\xbd\xbd\xbd\xbd\xbd\xbd\xbd\xbd\xbd\xbd\xbd\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f' '\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f' '\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f' '\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f' -' + ; 8 ((88(\xda\xda\xda\xda\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f' +' , < 9 ))99)\xdb\xdb\xdb\xdb\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f' '\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f' '\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f' '\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f' @@ -16900,82 +16985,118 @@ '!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!\x0f\x0f\x0f\x0f\x0f!!!!!!!!!!!!!!!!' '!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!' '!!!!!!!!!!!!!!!!!!!!!!!!!!\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f' -'\x15\x15\x15\x15\x15\x15\x15\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x15\x15\x15\x15\x15\x0f\x0f\x0f\x0f\x0f"L""""""""""\xc1"""""""""""""\x0f"""""\x0f"\x0f' -'""\x0f""\x0f""""""""""\x1e\x1e\x1e\x1e\x1e\x1e\x1e\x1e\x1e\x1e\x1e\x1e\x1e\x1e\x1e\x1e\x1e\x1e\x1e\x1e\x1e\x1e\x1e\x1e\x1e\x1e\x1e\x1e\x1e\x1e\x1e\x1e\x1e\x1e\x1e\x1e\x1e\x1e\x1e\x1e\x1e\x1e\x1e\x1e\x1e\x1e\x1e\x1e' +'\x15\x15\x15\x15\x15\x15\x15\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x15\x15\x15\x15\x15\x0f\x0f\x0f\x0f\x0f#M##########\xc2#############\x0f#####\x0f#\x0f' +'##\x0f##\x0f##########\x1e\x1e\x1e\x1e\x1e\x1e\x1e\x1e\x1e\x1e\x1e\x1e\x1e\x1e\x1e\x1e\x1e\x1e\x1e\x1e\x1e\x1e\x1e\x1e\x1e\x1e\x1e\x1e\x1e\x1e\x1e\x1e\x1e\x1e\x1e\x1e\x1e\x1e\x1e\x1e\x1e\x1e\x1e\x1e\x1e\x1e\x1e\x1e' '\x1e\x1e\x1e\x1e\x1e\x1e\x1e\x1e\x1e\x1e\x1e\x1e\x1e\x1e\x1e\x1e\x1e\x1e\x1e\x1e\x1e\x1e\x1e\x1e\x1e\x1e\x1e\x1e\x1e\x1e\x1e\x1e\x1e\x1e\x1e\x1e\x1e\x1e\x1e\x1e\x1e\x1e\x1e\x1e\x1e\x1e\x1e\x1e\x1e\x1e\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f' '\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x1e\x1e\x1e\x1e\x1e\x1e\x1e\x1e\x1e\x1e\x1e\x1e\x1e\x1e\x1e\x1e\x1e\x1e\x1e\x1e\x1e\x1e\x1e\x1e\x1e\x1e\x1e\x1e\x1e\x1e\x1e\x1e\x1e\x1e\x1e\x1e\x1e\x1e\x1e\x1e\x1e\x1e\x1e\x1e\x1e' '\x1e\x1e\x1e\x1e\x1e\x1e\x1e\x1e\x1e\x1e\x1e\x1e\x1e\x1e\x1e\x1e\x1e\x1e\x1e\x1e\x1e\x1e\x1e\x1e\x1e\x1e\x1e\x1e\x1e\x1e\x1e\x1e\x1e\x1e\x1e\x1e\x1e\x1e\x1e\x1e\x1e\x1e\x1e\x1e\x1e\x1e\x1e\x1e\x1e\x1e\x1e\x1e\x1e\x1e\x1e\x1e\x1e\x1e\x1e\x1e\x1e\x1e\x1e\x1e' '\x1e\x1e\x1e\x1e\x1e\x1e\x1e\x1e\x1e\x1e\x1e\x1e\x1e\x1e\x1e\x1e\x1e\x1e\x1e\x1e\x1e\x1e\x1e\x1e\x1e\x1e\x1e\x1e\x1e\x1e\x1e\x1e\x1e\x1e\x1e\x1e\x1e\x1e\x1e\x1e\x1e\x1e\x1e\x1e\x1e\x1e\x1e\x1e\x1e\x1e\x1e\x1e\x1e\x1e\x1e\x1e\x1e\x1e\x1e\x1e\x1e\x1e\x1e\x1e' '\x1e\x1e\x1e\x1e\x1e\x1e\x1e\x1e\x1e\x1e\x1e\x1e\x1e\x1e\x1e\x1e\x1e\x1e\x1e\x1e\x1e\x1e\x1e\x1e\x1e\x1e\x1e\x1e\x1e\x1e\x1e\x1e\x1e\x1e\x1e\x1e\x1e\x1e\x1e\x1e\x1e\x1e\x1e\x1e\x1e\x1e\x1e\x1e\x1e\x1e\x1e\x1e\x1e\x1e\x1e\x1e\x1e\x1e\x1e\x1e\x1e\x1e\x1e\x1e' '\x1e\x1e\x1e\x1e\x1e\x1e\x1e\x1e\x1e\x1e\x1e\x1e\x1e\x1e\x1e\x1e\x1e\x1e\x1e\x1e\x1e\x1e\x1e\x1e\x1e\x1e\x1e\x1e\x1e\x1e\x1e\x1e\x1e\x1e\x1e\x1e\x1e\x1e\x1e\x1e\x1e\x1e\x1e\x1e\x1e\x1e\x1e\x1e\x1e\x1e\x1e\x1e\x1e\x1e\x1e\x1e\x1e\x1e\x1e\x1e\x1e\x1e\x1e\x1e' -'\x1e\x1e\x1e\x1e\x1e\x1e\x1e\x1e\x1e\x1e\x1e\x1e\x1e\x1e\x1e\x1e\x1e\x1e\x1e\x1e\x1e\x1e\x1e\x1e\x1e\x1e\x1e\x1e\x1e\x1e\x1e\x1e\x1e\x1e\x1e\x1e\x1e\x1e\x1e\x1e\x1e\x1e\x1e\x1e\x1e\x1e\x1e\x1e\x1e\x1e\x1e\x1e\x1e\x1e\x1e\x1e\x1e\x1e\x1e\x1e\x1e\x1e\xae\x8f' +'\x1e\x1e\x1e\x1e\x1e\x1e\x1e\x1e\x1e\x1e\x1e\x1e\x1e\x1e\x1e\x1e\x1e\x1e\x1e\x1e\x1e\x1e\x1e\x1e\x1e\x1e\x1e\x1e\x1e\x1e\x1e\x1e\x1e\x1e\x1e\x1e\x1e\x1e\x1e\x1e\x1e\x1e\x1e\x1e\x1e\x1e\x1e\x1e\x1e\x1e\x1e\x1e\x1e\x1e\x1e\x1e\x1e\x1e\x1e\x1e\x1e\x1e\xaf\x90' '\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x1e\x1e\x1e\x1e\x1e\x1e\x1e\x1e\x1e\x1e\x1e\x1e\x1e\x1e\x1e\x1e\x1e\x1e\x1e\x1e\x1e\x1e\x1e\x1e\x1e\x1e\x1e\x1e\x1e\x1e\x1e\x1e\x1e\x1e\x1e\x1e\x1e\x1e\x1e\x1e\x1e\x1e\x1e\x1e\x1e\x1e\x1e\x1e' '\x1e\x1e\x1e\x1e\x1e\x1e\x1e\x1e\x1e\x1e\x1e\x1e\x1e\x1e\x1e\x1e\x0f\x0f\x1e\x1e\x1e\x1e\x1e\x1e\x1e\x1e\x1e\x1e\x1e\x1e\x1e\x1e\x1e\x1e\x1e\x1e\x1e\x1e\x1e\x1e\x1e\x1e\x1e\x1e\x1e\x1e\x1e\x1e\x1e\x1e\x1e\x1e\x1e\x1e\x1e\x1e\x1e\x1e\x1e\x1e\x1e\x1e\x1e\x1e' -'\x1e\x1e\x1e\x1e\x1e\x1e\x1e\x1e\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x1e\x1e\x1e\x1e\x1e\x1e\x1e\x1e\x1e\x1e\x1e\x1e\xb3\xda\x0f\x0f' -'................\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xb1\x92\xaa\x0f\x0f\x0f\x0f\x0f\x0fdddd\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\xaa\x8c\x8c\x86\x86\xb1\x92\xb1\x92\xb1\x92\xb1\x92\xb1\x92\xb1' -'\x92\xb1\x92\xb1\x92\xaa\xaa\xb1\x92\xaa\xaa\xaa\xaa\x86\x86\x86\x9e\xaa\x9e\x0f\xaa\x9e\xaa\xaa\x8c\xb1\x92\xb1\x92\xb1\x92\xa3\xaa\xaa\xc3\x89\xd0\xd0\xd0\x0f\xaa\xb9\xa3\xaa\x0f\x0f\x0f\x0f\x1e\x1e\x1e\x1e\x1e\x0f\x1e\x1e\x1e\x1e\x1e\x1e\x1e\x1e\x1e\x1e' +'\x1e\x1e\x1e\x1e\x1e\x1e\x1e\x1e\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x1e\x1e\x1e\x1e\x1e\x1e\x1e\x1e\x1e\x1e\x1e\x1e\xb4\xdb\x0f\x0f' +'////////////////\xab\xab\xab\xab\xab\xab\xab\xb2\x93\xab\x0f\x0f\x0f\x0f\x0f\x0feeee\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\xab\x8d\x8d\x87\x87\xb2\x93\xb2\x93\xb2\x93\xb2\x93\xb2\x93\xb2' +'\x93\xb2\x93\xb2\x93\xab\xab\xb2\x93\xab\xab\xab\xab\x87\x87\x87\x9f\xab\x9f\x0f\xab\x9f\xab\xab\x8d\xb2\x93\xb2\x93\xb2\x93\xa4\xab\xab\xc4\x8a\xd1\xd1\xd1\x0f\xab\xba\xa4\xab\x0f\x0f\x0f\x0f\x1e\x1e\x1e\x1e\x1e\x0f\x1e\x1e\x1e\x1e\x1e\x1e\x1e\x1e\x1e\x1e' '\x1e\x1e\x1e\x1e\x1e\x1e\x1e\x1e\x1e\x1e\x1e\x1e\x1e\x1e\x1e\x1e\x1e\x1e\x1e\x1e\x1e\x1e\x1e\x1e\x1e\x1e\x1e\x1e\x1e\x1e\x1e\x1e\x1e\x1e\x1e\x1e\x1e\x1e\x1e\x1e\x1e\x1e\x1e\x1e\x1e\x1e\x1e\x1e\x1e\x1e\x1e\x1e\x1e\x1e\x1e\x1e\x1e\x1e\x1e\x1e\x1e\x1e\x1e\x1e' '\x1e\x1e\x1e\x1e\x1e\x1e\x1e\x1e\x1e\x1e\x1e\x1e\x1e\x1e\x1e\x1e\x1e\x1e\x1e\x1e\x1e\x1e\x1e\x1e\x1e\x1e\x1e\x1e\x1e\x1e\x1e\x1e\x1e\x1e\x1e\x1e\x1e\x1e\x1e\x1e\x1e\x1e\x1e\x1e\x1e\x1e\x1e\x1e\x1e\x1e\x1e\x1e\x1e\x1e\x1e\x1e\x1e\x1e\x1e\x1e\x1e\x0f\x0f\x06' -'\x0f\xa6\xa6\xa0\xb5\xa0\xa6\xa6\xac\x8d\xa6\xc0\x9b\x87\x9b\x9bllllllllll\x9b\xa6\xca\xc9\xca\xa6\xa6%%%%%%%%%%%%%%%%%%%%%%%%%%\xac\xa6\x8d\xbb\x83' -'\xbb\x14\x14\x14\x14\x14\x14\x14\x14\x14\x14\x14\x14\x14\x14\x14\x14\x14\x14\x14\x14\x14\x14\x14\x14\x14\x14\xac\xc9\x8d\xc9\xac\x8d\xa7\xad\x8e\xa7\xa7\x1f\x1f\x1f\x1f\x1f\x1f\x1f\x1f\x1f\x1f\x19\x1f\x1f\x1f\x1f\x1f\x1f\x1f\x1f\x1f\x1f\x1f\x1f\x1f\x1f\x1f' +'\x0f\xa7\xa7\xa1\xb6\xa1\xa7\xa7\xad\x8e\xa7\xc1\x9c\x88\x9c\x9cmmmmmmmmmm\x9c\xa7\xcb\xca\xcb\xa7\xa7&&&&&&&&&&&&&&&&&&&&&&&&&&\xad\xa7\x8e\xbc\x84' +'\xbc\x14\x14\x14\x14\x14\x14\x14\x14\x14\x14\x14\x14\x14\x14\x14\x14\x14\x14\x14\x14\x14\x14\x14\x14\x14\x14\xad\xca\x8e\xca\xad\x8e\xa8\xae\x8f\xa8\xa8\x1f\x1f\x1f\x1f\x1f\x1f\x1f\x1f\x1f\x1f\x19\x1f\x1f\x1f\x1f\x1f\x1f\x1f\x1f\x1f\x1f\x1f\x1f\x1f\x1f\x1f' '\x1f\x1f\x1f\x1f\x1f\x1f\x1f\x1f\x1f\x1f\x1f\x1f\x1f\x1f\x1f\x1f\x1f\x1f\x1f\x1f\x1f\x1f\x1f\x1f\x1f\x1f\x1f\x1f\x1f\x1f\x19\x19\x1f\x1f\x1f\x1f\x1f\x1f\x1f\x1f\x1f\x1f\x1f\x1f\x1f\x1f\x1f\x1f\x1f\x1f\x1f\x1f\x1f\x1f\x1f\x1f\x1f\x1f\x1f\x1f\x1f\x1f\x1f\x0f' -'\x0f\x0f\x1f\x1f\x1f\x1f\x1f\x1f\x0f\x0f\x1f\x1f\x1f\x1f\x1f\x1f\x0f\x0f\x1f\x1f\x1f\x1f\x1f\x1f\x0f\x0f\x1f\x1f\x1f\x0f\x0f\x0f\xb5\xb5\xc9\xbb\xd8\xb5\xb5\x0f\xd9\xcb\xcb\xcb\xcb\xd9\xd9\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\n\n\n\xda\xd7\x0f\x0f' +'\x0f\x0f\x1f\x1f\x1f\x1f\x1f\x1f\x0f\x0f\x1f\x1f\x1f\x1f\x1f\x1f\x0f\x0f\x1f\x1f\x1f\x1f\x1f\x1f\x0f\x0f\x1f\x1f\x1f\x0f\x0f\x0f\xb6\xb6\xca\xbc\xd9\xb6\xb6\x0f\xda\xcc\xcc\xcc\xcc\xda\xda\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\n\n\n\xdb\xd8\x0f\x0f' ' \x0f \x0f \x0f \x0f ' ' \x0f\x0f \x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f' ' ' ' \x0f\x0f\x0f\x0f\x0f' -'\xa4\xa8\xd5\x0f\x0f\x0f\x0fyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyy\x0f\x0f\x0f\xd5\xd5\xd5\xd5\xd5\xd5\xd5\xd5\xd5' -'ttttttttttttttttttttttttttttttttttttttttttttttttttttt~~~~\xda\xda\xda\xda\xda\xda\xda' -'\xda\xda\xda\xda\xda\xda\xda\xda\xda\xda~\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f' +'\xa5\xa9\xd6\x0f\x0f\x0f\x0fzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz\x0f\x0f\x0f\xd6\xd6\xd6\xd6\xd6\xd6\xd6\xd6\xd6' +'uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu\x7f\x7f\x7f\x7f\xdb\xdb\xdb\xdb\xdb\xdb\xdb' +'\xdb\xdb\xdb\xdb\xdb\xdb\xdb\xdb\xdb\xdb\x7f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f' '\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f' -' \x0fyyyy\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f ' -' r\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f' -' \x0f\xa4 ' -' \x0f\x0f\x0f\x0f \xd5ttttt\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f' -'&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15' +' \x0fzzzz\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f ' +' s\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f' +' \x0f\xa5 ' +' \x0f\x0f\x0f\x0f \xd6uuuuu\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f' +"''''''''''''''''''''''''''''''''''''''''\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15" '\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15 ' -' \x0f\x0foooooooooo\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f' +' \x0f\x0fpppppppppp\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f' '\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f' -'""""""\x0f\x0f"\x0f""""""""""""""""""""""""""""""""""""""""""""\x0f""\x0f\x0f\x0f"\x0f\x0f"' +'######\x0f\x0f#\x0f############################################\x0f##\x0f\x0f\x0f#\x0f\x0f#' '\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f' '\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f' '\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f' -'"888\x0f88\x0f\x0f\x0f\x0f\x0f8a8d""""\x0f"""\x0f"""""""""""""""""""""""""""\x0f\x0f\x0f\x0fd9a\x0f\x0f\x0f\x0f;' -'\x82\x82\x82\x82\x81\x81\x81\x81\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\xab\xab\xab\xab\xab\xab\xab\xab\xab\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f' +'#999\x0f99\x0f\x0f\x0f\x0f\x0f9b9e####\x0f###\x0f###########################\x0f\x0f\x0f\x0fe:b\x0f\x0f\x0f\x0f<' +'\x83\x83\x83\x83\x82\x82\x82\x82\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\xac\xac\xac\xac\xac\xac\xac\xac\xac\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f' '\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f' '\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f' -'\xd5\xd5\xd5\xd5\xd5\xd5\xd5\xd5\xd5\xd5\xd5\xd5\xd5\xd5\xd5\xd5\xd5\xd5\xd5\xd5\xd5\xd5\xd5\xd5\xd5\xd5\xd5\xd5\xd5\xd5\xd5\xd5\xd5\xd5\xd5\xd5\xd5\xd5\xd5\xd5\xd5\xd5\xd5\xd5\xd5\xd5\xd5\xd5\xd5\xd5\xd5\xd5\xd5\xd5\xd5\xd5\xd5\xd5\xd5\xd5\xd5\xd5\xd5\xd5' -'\xd5\xd5\xd5\xd5\xd5\xd5\xd5\xd5\xd5\xd5\xd5\xd5\xd5\xd5\xd5\xd5\xd5\xd5\xd5\xd5\xd5\xd5\xd5\xd5\xd5\xd5\xd5\xd5\xd5\xd5\xd5\xd5\xd5\xd5\xd5\xd5\xd5\xd5\xd5\xd5\xd5\xd5\xd5\xd5\xd5\xd5\xd5\xd5\xd5\xd5\xd5\xd5\xd5\xd5\xd5\xd5\xd5\xd5\xd5\xd5\xd5\xd5\xd5\xd5' -'\xd5\xd5\xd5\xd5\xd5\xd5\xd5\xd5\xd5\xd5\xd5\xd5\xd5\xd5\xd5\xd5\xd5\xd5\xd5\xd5\xd5\xd5\xd5\xd5\xd5\xd5\xd5\xd5\xd5\xd5\xd5\xd5\xd5\xd5\xd5\xd5\xd5\xd5\xd5\xd5\xd5\xd5\xd5\xd5\xd5\xd5\xd5\xd5\xd5\xd5\xd5\xd5\xd5\xd5\xd5\xd5\xd5\xd5\xd5\xd5\xd5\xd5\xd5\xd5' -'\xd5\xd5\xd5\xd5\xd5\xd5\xd5\xd5\xd5\xd5\xd5\xd5\xd5\xd5\xd5\xd5\xd5\xd5\xd5\xd5\xd5\xd5\xd5\xd5\xd5\xd5\xd5\xd5\xd5\xd5\xd5\xd5\xd5\xd5\xd5\xd5\xd5\xd5\xd5\xd5\xd5\xd5\xd5\xd5\xd5\xd5\xd5\xd5\xd5\xd5\xd5\xd5\xd5\xd5\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f' -'\xd5\xd5\xd5\xd5\xd5\xd5\xd5\xd5\xd5\xd5\xd5\xd5\xd5\xd5\xd5\xd5\xd5\xd5\xd5\xd5\xd5\xd5\xd5\xd5\xd5\xd5\xd5\xd5\xd5\xd5\xd5\xd5\xd5\xd5\xd5\xd5\xd5\xd5\xd5\x0f\x0f\x0f\xd5\xd5\xd5\xd5\xd5\xd5\xd5\xd5\xd5\xd5\xd5\xd5\xd5\xd5\xd5\xd5\xd5\xd5\xd5\xd5\xd5\xd5' -'\xd5\xd5\xd5\xd5\xd5\xd5\xd5\xd5\xd5\xd5\xd5\xd5\xd5\xd5\xd5\xd5\xd5\xd5\xd5\xd5\xd5\xd5\xd5\xd5\xd5\xd5\xd5\xd5\xd5\xd5\xd5\xd5\xd5\xd5\xd5\xd5\xd5))999\xd5\xd5\xd5*)))))\x06\x06\x06\x06\x06\x06\x06\x06aaaaa' -'aaa\xd5\xd5dddddaa\xd5\xd5\xd5\xd5\xd5\xd5\xd5\xd5\xd5\xd5\xd5\xd5\xd5\xd5\xd5\xd5\xd5\xd5\xd5\xd5\xd5\xd5\xd5\xd5\xd5\xd5\xd5\xd5\xd5\xd5dddd\xd5\xd5\xd5\xd5\xd5\xd5\xd5\xd5\xd5\xd5\xd5\xd5\xd5\xd5\xd5\xd5\xd5\xd5' -'\xd5\xd5\xd5\xd5\xd5\xd5\xd5\xd5\xd5\xd5\xd5\xd5\xd5\xd5\xd5\xd5\xd5\xd5\xd5\xd5\xd5\xd5\xd5\xd5\xd5\xd5\xd5\xd5\xd5\xd5\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f' -'\xda\xda\xda\xda\xda\xda\xda\xda\xda\xda\xda\xda\xda\xda\xda\xda\xda\xda\xda\xda\xda\xda\xda\xda\xda\xda\xda\xda\xda\xda\xda\xda\xda\xda\xda\xda\xda\xda\xda\xda\xda\xda\xda\xda\xda\xda\xda\xda\xda\xda\xda\xda\xda\xda\xda\xda\xda\xda\xda\xda\xda\xda\xda\xda' -'\xda\xdaddd\xda\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f' +'\xd6\xd6\xd6\xd6\xd6\xd6\xd6\xd6\xd6\xd6\xd6\xd6\xd6\xd6\xd6\xd6\xd6\xd6\xd6\xd6\xd6\xd6\xd6\xd6\xd6\xd6\xd6\xd6\xd6\xd6\xd6\xd6\xd6\xd6\xd6\xd6\xd6\xd6\xd6\xd6\xd6\xd6\xd6\xd6\xd6\xd6\xd6\xd6\xd6\xd6\xd6\xd6\xd6\xd6\xd6\xd6\xd6\xd6\xd6\xd6\xd6\xd6\xd6\xd6' +'\xd6\xd6\xd6\xd6\xd6\xd6\xd6\xd6\xd6\xd6\xd6\xd6\xd6\xd6\xd6\xd6\xd6\xd6\xd6\xd6\xd6\xd6\xd6\xd6\xd6\xd6\xd6\xd6\xd6\xd6\xd6\xd6\xd6\xd6\xd6\xd6\xd6\xd6\xd6\xd6\xd6\xd6\xd6\xd6\xd6\xd6\xd6\xd6\xd6\xd6\xd6\xd6\xd6\xd6\xd6\xd6\xd6\xd6\xd6\xd6\xd6\xd6\xd6\xd6' +'\xd6\xd6\xd6\xd6\xd6\xd6\xd6\xd6\xd6\xd6\xd6\xd6\xd6\xd6\xd6\xd6\xd6\xd6\xd6\xd6\xd6\xd6\xd6\xd6\xd6\xd6\xd6\xd6\xd6\xd6\xd6\xd6\xd6\xd6\xd6\xd6\xd6\xd6\xd6\xd6\xd6\xd6\xd6\xd6\xd6\xd6\xd6\xd6\xd6\xd6\xd6\xd6\xd6\xd6\xd6\xd6\xd6\xd6\xd6\xd6\xd6\xd6\xd6\xd6' +'\xd6\xd6\xd6\xd6\xd6\xd6\xd6\xd6\xd6\xd6\xd6\xd6\xd6\xd6\xd6\xd6\xd6\xd6\xd6\xd6\xd6\xd6\xd6\xd6\xd6\xd6\xd6\xd6\xd6\xd6\xd6\xd6\xd6\xd6\xd6\xd6\xd6\xd6\xd6\xd6\xd6\xd6\xd6\xd6\xd6\xd6\xd6\xd6\xd6\xd6\xd6\xd6\xd6\xd6\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f' +'\xd6\xd6\xd6\xd6\xd6\xd6\xd6\xd6\xd6\xd6\xd6\xd6\xd6\xd6\xd6\xd6\xd6\xd6\xd6\xd6\xd6\xd6\xd6\xd6\xd6\xd6\xd6\xd6\xd6\xd6\xd6\xd6\xd6\xd6\xd6\xd6\xd6\xd6\xd6\x0f\x0f\x0f\xd6\xd6\xd6\xd6\xd6\xd6\xd6\xd6\xd6\xd6\xd6\xd6\xd6\xd6\xd6\xd6\xd6\xd6\xd6\xd6\xd6\xd6' +'\xd6\xd6\xd6\xd6\xd6\xd6\xd6\xd6\xd6\xd6\xd6\xd6\xd6\xd6\xd6\xd6\xd6\xd6\xd6\xd6\xd6\xd6\xd6\xd6\xd6\xd6\xd6\xd6\xd6\xd6\xd6\xd6\xd6\xd6\xd6\xd6\xd6**:::\xd6\xd6\xd6+*****\x06\x06\x06\x06\x06\x06\x06\x06bbbbb' +'bbb\xd6\xd6eeeeebb\xd6\xd6\xd6\xd6\xd6\xd6\xd6\xd6\xd6\xd6\xd6\xd6\xd6\xd6\xd6\xd6\xd6\xd6\xd6\xd6\xd6\xd6\xd6\xd6\xd6\xd6\xd6\xd6\xd6\xd6eeee\xd6\xd6\xd6\xd6\xd6\xd6\xd6\xd6\xd6\xd6\xd6\xd6\xd6\xd6\xd6\xd6\xd6\xd6' +'\xd6\xd6\xd6\xd6\xd6\xd6\xd6\xd6\xd6\xd6\xd6\xd6\xd6\xd6\xd6\xd6\xd6\xd6\xd6\xd6\xd6\xd6\xd6\xd6\xd6\xd6\xd6\xd6\xd6\xd6\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f' +'\xdb\xdb\xdb\xdb\xdb\xdb\xdb\xdb\xdb\xdb\xdb\xdb\xdb\xdb\xdb\xdb\xdb\xdb\xdb\xdb\xdb\xdb\xdb\xdb\xdb\xdb\xdb\xdb\xdb\xdb\xdb\xdb\xdb\xdb\xdb\xdb\xdb\xdb\xdb\xdb\xdb\xdb\xdb\xdb\xdb\xdb\xdb\xdb\xdb\xdb\xdb\xdb\xdb\xdb\xdb\xdb\xdb\xdb\xdb\xdb\xdb\xdb\xdb\xdb' +'\xdb\xdbeee\xdb\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f' '\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f' '\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f' -'\xda\xda\xda\xda\xda\xda\xda\xda\xda\xda\xda\xda\xda\xda\xda\xda\xda\xda\xda\xda\xda\xda\xda\xda\xda\xda\xda\xda\xda\xda\xda\xda\xda\xda\xda\xda\xda\xda\xda\xda\xda\xda\xda\xda\xda\xda\xda\xda\xda\xda\xda\xda\xda\xda\xda\xda\xda\xda\xda\xda\xda\xda\xda\xda' -'\xda\xda\xda\xda\xda\xda\xda\xda\xda\xda\xda\xda\xda\xda\xda\xda\xda\xda\xda\xda\xda\xda\xda\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f' +'\xdb\xdb\xdb\xdb\xdb\xdb\xdb\xdb\xdb\xdb\xdb\xdb\xdb\xdb\xdb\xdb\xdb\xdb\xdb\xdb\xdb\xdb\xdb\xdb\xdb\xdb\xdb\xdb\xdb\xdb\xdb\xdb\xdb\xdb\xdb\xdb\xdb\xdb\xdb\xdb\xdb\xdb\xdb\xdb\xdb\xdb\xdb\xdb\xdb\xdb\xdb\xdb\xdb\xdb\xdb\xdb\xdb\xdb\xdb\xdb\xdb\xdb\xdb\xdb' +'\xdb\xdb\xdb\xdb\xdb\xdb\xdb\xdb\xdb\xdb\xdb\xdb\xdb\xdb\xdb\xdb\xdb\xdb\xdb\xdb\xdb\xdb\xdb\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f' '\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f' '\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f' -'&&&&&&&&&&&&&&&&&&&&&&&&&&\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15&&&&&&&&&&&&' -'&&&&&&&&&&&&&&\x15\x15\x15\x15\x15\x15\x15\x0f\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15&&&&&&&&&&&&&&&&&&&&&&&&' -'&&\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15&\x0f&&\x0f\x0f&\x0f\x0f&&\x0f\x0f&&&&\x0f&&&&&&&&\x15\x15\x15\x15\x0f\x15\x0f\x15\x15\x15' -'\x15\x15\x15\x15\x0f\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15&&&&&&&&&&&&&&&&&&&&&&&&&&\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15' -'\x15\x15\x15\x15&&\x0f&&&&\x0f\x0f&&&&&&&&\x0f&&&&&&&\x0f\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15&&\x0f&&&&\x0f' -'&&&&&\x0f&\x0f\x0f\x0f&&&&&&&\x0f\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15&&&&&&&&&&&&&&&&&&&&' -'&&&&&&\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15&&&&&&&&&&&&&&&&&&&&&&&&&&\x15\x15\x15\x15\x15\x15' -'\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15&&&&&&&&&&&&&&&&&&&&&&&&&&\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15' -'\x15\x15\x15\x15\x15\x15\x15\x15&&&&&&&&&&&&&&&&&&&&&&&&&&\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15&&&&' -'&&&&&&&&&&&&&&&&&&&&&&\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15&&&&&&&&&&&&&&&&' -'&&&&&&&&&&\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x0f\x0f&&&&&&&&&&&&&&&&&&&&&&&&' -'&\xc6\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\xc6\x15\x15\x15\x15\x15\x15&&&&&&&&&&&&&&&&&&&&&&&&&\xc6\x15\x15\x15\x15' -'\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\xc6\x15\x15\x15\x15\x15\x15&&&&&&&&&&&&&&&&&&&&&&&&&\xc6\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15' -'\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\xc6\x15\x15\x15\x15\x15\x15&&&&&&&&&&&&&&&&&&&&&&&&&\xc6\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15' -'\x15\x15\x15\x15\x15\x15\x15\x15\x15\xc6\x15\x15\x15\x15\x15\x15&&&&&&&&&&&&&&&&&&&&&&&&&\xc6\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15' -'\x15\x15\x15\xc6\x15\x15\x15\x15\x15\x15\x0f\x0f\x0f\x0fmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmm' +"''''''''''''''''''''''''''\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15''''''''''''" +"''''''''''''''\x15\x15\x15\x15\x15\x15\x15\x0f\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15''''''''''''''''''''''''" +"''\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15'\x0f''\x0f\x0f'\x0f\x0f''\x0f\x0f''''\x0f''''''''\x15\x15\x15\x15\x0f\x15\x0f\x15\x15\x15" +"\x15\x15\x15\x15\x0f\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15''''''''''''''''''''''''''\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15" +"\x15\x15\x15\x15''\x0f''''\x0f\x0f''''''''\x0f'''''''\x0f\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15''\x0f''''\x0f" +"'''''\x0f'\x0f\x0f\x0f'''''''\x0f\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15''''''''''''''''''''" +"''''''\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15''''''''''''''''''''''''''\x15\x15\x15\x15\x15\x15" +"\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15''''''''''''''''''''''''''\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15" +"\x15\x15\x15\x15\x15\x15\x15\x15''''''''''''''''''''''''''\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15''''" +"''''''''''''''''''''''\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15''''''''''''''''" +"''''''''''\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x0f\x0f''''''''''''''''''''''''" +"'\xc7\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\xc7\x15\x15\x15\x15\x15\x15'''''''''''''''''''''''''\xc7\x15\x15\x15\x15" +"\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\xc7\x15\x15\x15\x15\x15\x15'''''''''''''''''''''''''\xc7\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15" +"\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\xc7\x15\x15\x15\x15\x15\x15'''''''''''''''''''''''''\xc7\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15" +"\x15\x15\x15\x15\x15\x15\x15\x15\x15\xc7\x15\x15\x15\x15\x15\x15'''''''''''''''''''''''''\xc7\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15" +'\x15\x15\x15\xc7\x15\x15\x15\x15\x15\x15\x0f\x0f\x0f\x0fnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnn' +'!"!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!' +'!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!"!!!!!!!!!!!!!!!!!!!!!!!!!!!' +'!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!' +'!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!"!!!!!!!!!!!!!!!!!!!!!!!!!!!!!' +'!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!"!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!' +'!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!' +'!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!' +'!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!' +'!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!"!!!!!!!!!!!!!!!!!!!!!' +'!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!' +'!!!"!!!!!!!!"!!!!!!!!!!!!!!!"!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!' +'!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!' +'!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!' +'!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!' +'!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!' +'!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!"!!!!!!!!!!!!!!!!!!"!!' +'!!!!!!!!!!!!!!!!!!!!!!!!!"!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!' +'!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!' +'!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!' +'!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!' +'!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!' +'!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!' +'!!!!!!!!!!!!!!!!"!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!' +'!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!' +'!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!' +'!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!' +'!!!!!!!!!!!!!!!!!!!!!!!!"!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!' +'!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!' +'!!!!!!!!!!!!!!!!!!!!!!!!!!!"!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!' +'!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!' +'!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!' +'!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!' +'!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!' +'!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!"!!!!!!!!!!!!!!!!!!' +'!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!' +'!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!' '!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!' '!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!' '!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!' @@ -16996,10 +17117,10 @@ '\x06\x06\x06\x06\x06\x06\x06\x06\x06\x06\x06\x06\x06\x06\x06\x06\x06\x06\x06\x06\x06\x06\x06\x06\x06\x06\x06\x06\x06\x06\x06\x06\x06\x06\x06\x06\x06\x06\x06\x06\x06\x06\x06\x06\x06\x06\x06\x06\x06\x06\x06\x06\x06\x06\x06\x06\x06\x06\x06\x06\x06\x06\x06\x06' '\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f' '\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f' -'................................................................' -'................................................................' -'................................................................' -'................................................\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f' +'////////////////////////////////////////////////////////////////' +'////////////////////////////////////////////////////////////////' +'////////////////////////////////////////////////////////////////' +'////////////////////////////////////////////////\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f' '\x11\x11\x11\x11\x11\x11\x11\x11\x11\x11\x11\x11\x11\x11\x11\x11\x11\x11\x11\x11\x11\x11\x11\x11\x11\x11\x11\x11\x11\x11\x11\x11\x11\x11\x11\x11\x11\x11\x11\x11\x11\x11\x11\x11\x11\x11\x11\x11\x11\x11\x11\x11\x11\x11\x11\x11\x11\x11\x11\x11\x11\x11\x11\x11' '\x11\x11\x11\x11\x11\x11\x11\x11\x11\x11\x11\x11\x11\x11\x11\x11\x11\x11\x11\x11\x11\x11\x11\x11\x11\x11\x11\x11\x11\x11\x11\x11\x11\x11\x11\x11\x11\x11\x11\x11\x11\x11\x11\x11\x11\x11\x11\x11\x11\x11\x11\x11\x11\x11\x11\x11\x11\x11\x11\x11\x11\x11\x11\x11' '\x11\x11\x11\x11\x11\x11\x11\x11\x11\x11\x11\x11\x11\x11\x11\x11\x11\x11\x11\x11\x11\x11\x11\x11\x11\x11\x11\x11\x11\x11\x11\x11\x11\x11\x11\x11\x11\x11\x11\x11\x11\x11\x11\x11\x11\x11\x11\x11\x11\x11\x11\x11\x11\x11\x11\x11\x11\x11\x11\x11\x11\x11\x11\x11' Modified: pypy/dist/pypy/module/unicodedata/unicodedb_5_0_0.py ============================================================================== --- pypy/dist/pypy/module/unicodedata/unicodedb_5_0_0.py (original) +++ pypy/dist/pypy/module/unicodedata/unicodedb_5_0_0.py Wed Oct 4 13:30:19 2006 @@ -17761,6 +17761,7 @@ ('Lo', 'L', 'H', 2, 0), ('Lo', 'L', 'N', 2, 0), ('Lo', 'L', 'W', 2, 0), +('Lo', 'L', 'W', 66, 0), ('Lo', 'R', 'N', 2, 0), ('Lt', 'L', 'N', 18, 0), ('Lu', 'L', 'A', 10, 0), @@ -17959,22 +17960,22 @@ ('Zs', 'WS', 'Na', 1, 0), ] _db_pgtbl = ( -'\x00\x01\x02\x03\x04\x05\x06\x07\x08\t\n\x0b\x0c\r\x0e\x0f\x10\x11\x12\x13\x14\x15\x16\x17\x18\x19\x1a\x1b\x08\x1c\x1d\x1e\x1f !"#$%&\'()*+,-./012333333333333' -'3333333333333433333333333333333333333333333333333333333333333333' -'3333333333333333333333333333333563337\x08\x0889\x08\x08\x0833333333333333333333' -'33333333333333333333333:;;;;;;;;<<<<<<<<<<<<<<<<<<<<<<<<<3=>?@AB' -'CD\x08EF\x08\x08\x08GHI\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x15\x15\x15JK\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08' +'\x00\x01\x02\x03\x04\x05\x06\x07\x08\t\n\x0b\x0c\r\x0e\x0f\x10\x11\x12\x13\x14\x15\x16\x17\x18\x19\x1a\x1b\x08\x1c\x1d\x1e\x1f !"#$%&\'()*+,-./012344454464444' +'44444444444447894:4;44<4=44444>?44 at A444B44444444444C44D444444444' +'E444F4444444GH44444444I44444444JK444L\x08\x08MN\x08\x08\x0844444444444444444444' +'44444444444444444444444OPPPPPPPPQQQQQQQQQQQQQQQQQQQQQQQQQ4RSTUVW' +'XY\x08Z[\x08\x08\x08\\]^\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x15\x15\x15_`\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08' '\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08' '\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08' -'\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08LMNOPQRS\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08' -'3333333333333333333333333333333333333333333333333333333333333333' -'3333333333333333333333333333333333333333333333333333333333333333' -'33333333333333333333333333333333333333TUUUUUUUUUUUUUUUUUUUUUUUUU' -'UUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUU33VUUUUW' -'UUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUU' -'UUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUU' -'UUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUU' -'UUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUW' +'\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08abcdefgh\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08' +'ij4444444klm44444444444444444444444n44444o44444444444444444p4444' +'4444444444444444444444444444444444q44444444444444444444444444444' +'44444444444444444444444444444444444444rsssssssssssssssssssssssss' +'ssssssssssssssssssssssssssssssssssssssssssssssssssssssss44tssssu' +'ssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssss' +'ssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssss' +'ssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssss' +'sssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssu' '\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08' '\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08' '\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08' @@ -18015,88 +18016,88 @@ '\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08' '\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08' '\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08' -'XY\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08' +'vw\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08' '\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08' '\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08' '\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08' -'<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<' -'<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<' -'<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<' -'<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<?@ABCDEFGGHIJ\xadK' -'\xadLM\xadfc\xadF\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f###########################\x0f\x0f\x0f\x0f\x0f###\xad\xad\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f' -'\x04\x04\x04\x04\x0f\x0f\x0f\x0f\x0f\x0f\x0f\xb5\x9e\x9b\xde\xdeffffff\x0f\x0f\x0f\x0f\x0f\x9b\x0f\x0f\x9b\x9b\x0f\x1f\x1f\x1f\x1f\x1f\x1f\x1f\x1f\x1f\x1f\x1f\x1f\x1f\x1f\x1f\x1f\x1f\x1f\x1f\x1f\x1f\x1f\x1f\x1f\x1f\x1f\x0f\x0f\x0f\x0f\x0f' -'\x17\x1f\x1f\x1f\x1f\x1f\x1f\x1f\x1f\x1f\x1fOPQRSTUVffccfffffcff\x0fmmmmmmmmmm\xa3\x9c\x9c\x9b\x1f\x1fW\x1f\x1f\x1f\x1f\x1f\x1f\x1f\x1f\x1f\x1f\x1f\x1f\x1f\x1f\x1f' +'\x1a\x1a\xbf\xbf\xbd\xbf\x1d\x1c\x1d\x1c\x1c\x1c\x1d\x1c\x1d\x1d\x18\x1a\xbf\xbf\xbf\xbf\xbf\xbf\xbd\xbd\xbd\xbd\xbf\xbd\xbf\xbd\x1a\x1a\x1a\x1a\x1a\xbf\xbf\xbf\xbf\xbf\xbf\xbf\xbf\xbf\x1a\xbf\xbf\xbf\xbf\xbf\xbf\xbf\xbf\xbf\xbf\xbf\xbf\xbf\xbf\xbf\xbf\xbf' +'6666666666666666666667555574555553355553355555555555222225555666' +'66666:655566655166655556755689989986666666666666\x0f\x0f\x0f\x0f\xbf\xbf\x0f\x0f\x0f\x0f\x1a\x15\x15\x15\xab\x0f' +'\x0f\x0f\x0f\x0f\xbf\xbf(\xab(((\x0f(\x0f((\x15&&&&&&&&&&&&&&&&&\x0f&&&&&&&((\x15\x15\x15\x15\x15\x13\x13\x13\x13\x13\x13\x13\x13\x13\x13\x13\x13\x13\x13\x13' +'\x13\x13\x15\x13\x13\x13\x13\x13\x13\x13\x15\x15\x15\x15\x15\x0f\x15\x15(((\x15\x15\x15(\x15(\x15(\x15(\x15(\x15(\x15(\x15(\x15(\x15(\x15(\x15(\x15\x15\x15\x15\x15(\x15\xd0(\x15((\x15\x15(((' +'(&((((((((((((((&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&\x13\x13\x13\x13\x13\x13\x13\x13\x13\x13\x13\x13\x13\x13\x13\x13' +'\x13\x13\x13\x13\x13\x13\x13\x13\x13\x13\x13\x13\x13\x13\x13\x13\x15\x13\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15(\x15(\x15(\x15(\x15(\x15(\x15(\x15(\x15(\x15(\x15(\x15(\x15(\x15(\x15(\x15(\x15' +'(\x15\xdagggg\x0f//(\x15(\x15(\x15(\x15(\x15(\x15(\x15(\x15(\x15(\x15(\x15(\x15(\x15(\x15(\x15(\x15(\x15(\x15(\x15(\x15(\x15(\x15(\x15(\x15(\x15(\x15(\x15' +'((\x15(\x15(\x15(\x15(\x15(\x15(\x15\x15(\x15(\x15(\x15(\x15(\x15(\x15(\x15(\x15(\x15(\x15(\x15(\x15(\x15(\x15(\x15(\x15(\x15(\x15(\x15(\x15(\x15(\x15(\x15(\x15' +'(\x15(\x15(\x15(\x15(\x15(\x15(\x15(\x15(\x15(\x15\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f(((((((((((((((' +'(((((((((((((((((((((((\x0f\x0f\x1a\xa7\xa7\xa7\xa7\xa7\xa7\x0f\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15' +'\x15\x15\x15\x15\x15\x15\x15\x15\x0f\xa7\x8f\x0f\x0f\x0f\x0f\x0f\x0fdggggdgggedggggggddddddggdggefg?@ABCDEFGHHIJK\xaeL' +'\xaeMN\xaegd\xaeG\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f$$$$$$$$$$$$$$$$$$$$$$$$$$$\x0f\x0f\x0f\x0f\x0f$$$\xae\xae\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f' +'\x04\x04\x04\x04\x0f\x0f\x0f\x0f\x0f\x0f\x0f\xb6\x9f\x9c\xdf\xdfgggggg\x0f\x0f\x0f\x0f\x0f\x9c\x0f\x0f\x9c\x9c\x0f\x1f\x1f\x1f\x1f\x1f\x1f\x1f\x1f\x1f\x1f\x1f\x1f\x1f\x1f\x1f\x1f\x1f\x1f\x1f\x1f\x1f\x1f\x1f\x1f\x1f\x1f\x0f\x0f\x0f\x0f\x0f' +'\x17\x1f\x1f\x1f\x1f\x1f\x1f\x1f\x1f\x1f\x1fPQRSTUVWggddgggggdgg\x0fnnnnnnnnnn\xa4\x9d\x9d\x9c\x1f\x1fX\x1f\x1f\x1f\x1f\x1f\x1f\x1f\x1f\x1f\x1f\x1f\x1f\x1f\x1f\x1f' '\x1f\x1f\x1f\x1f\x1f\x1f\x1f\x1f\x1f\x1f\x1f\x1f\x1f\x1f\x1f\x1f\x1f\x1f\x1f\x1f\x1f\x1f\x1f\x1f\x1f\x1f\x1f\x1f\x1f\x1f\x1f\x1f\x1f\x1f\x1f\x1f\x1f\x1f\x1f\x1f\x1f\x1f\x1f\x1f\x1f\x1f\x1f\x1f\x1f\x1f\x1f\x1f\x1f\x1f\x1f\x1f\x1f\x1f\x1f\x1f\x1f\x1f\x1f\x1f' -'\x1f\x1f\x1f\x1f\x1f\x1f\x1f\x1f\x1f\x1f\x1f\x1f\x1f\x1f\x1f\x1f\x1f\x1f\x1f\x1f\x9b\x1ffffffff\x04.ffffcf\x17\x17ff\xdecffc\x1f\x1foooooooooo\x1f\x1f\x1f\xd5\xd5\x1f' -'\x9b\x9b\x9b\x9b\x9b\x9b\x9b\x9b\x9b\x9b\x9b\x9b\x9b\x9b\x0f\x06\x1fX\x1f\x1f\x1f\x1f\x1f\x1f\x1f\x1f\x1f\x1f\x1f\x1f\x1f\x1f\x1f\x1f\x1f\x1f\x1f\x1f\x1f\x1f\x1f\x1f\x1f\x1f\x1f\x1f\x1f\x1ffcffcffcccfccfcf' -'ffcfcfcfcff\x0f\x0f\x1f\x1f\x1f\x1f\x1f\x1f\x1f\x1f\x1f\x1f\x1f\x1f\x1f\x1f\x1f\x1f\x1f\x1f\x1f\x1f\x1f\x1f\x1f\x1f\x1f\x1f\x1f\x1f\x1f\x1f\x1f\x1f\x1f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f' -'\x1f\x1f\x1f\x1f\x1f\x1f\x1f\x1f\x1f\x1f\x1f\x1f\x1f\x1f\x1f\x1f\x1f\x1f\x1f\x1f\x1f\x1f\x1f\x1f\x1f\x1f\x1f\x1f\x1f\x1f\x1f\x1f\x1f\x1f\x1f\x1f\x1f\x1f:::::::::::\x1f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f' -'rrrrrrrrrr#################################fffffffcf\x1e\x1e\xde\xaa\xaa\xaa\x1e\x0f\x0f\x0f\x0f\x0f' +'\x1f\x1f\x1f\x1f\x1f\x1f\x1f\x1f\x1f\x1f\x1f\x1f\x1f\x1f\x1f\x1f\x1f\x1f\x1f\x1f\x9c\x1fggggggg\x04/ggggdg\x17\x17gg\xdfdggd\x1f\x1fpppppppppp\x1f\x1f\x1f\xd6\xd6\x1f' +'\x9c\x9c\x9c\x9c\x9c\x9c\x9c\x9c\x9c\x9c\x9c\x9c\x9c\x9c\x0f\x06\x1fY\x1f\x1f\x1f\x1f\x1f\x1f\x1f\x1f\x1f\x1f\x1f\x1f\x1f\x1f\x1f\x1f\x1f\x1f\x1f\x1f\x1f\x1f\x1f\x1f\x1f\x1f\x1f\x1f\x1f\x1fgdggdggdddgddgdg' +'ggdgdgdgdgg\x0f\x0f\x1f\x1f\x1f\x1f\x1f\x1f\x1f\x1f\x1f\x1f\x1f\x1f\x1f\x1f\x1f\x1f\x1f\x1f\x1f\x1f\x1f\x1f\x1f\x1f\x1f\x1f\x1f\x1f\x1f\x1f\x1f\x1f\x1f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f' +'\x1f\x1f\x1f\x1f\x1f\x1f\x1f\x1f\x1f\x1f\x1f\x1f\x1f\x1f\x1f\x1f\x1f\x1f\x1f\x1f\x1f\x1f\x1f\x1f\x1f\x1f\x1f\x1f\x1f\x1f\x1f\x1f\x1f\x1f\x1f\x1f\x1f\x1f;;;;;;;;;;;\x1f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f' +'ssssssssss$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$gggggggdg\x1e\x1e\xdf\xab\xab\xab\x1e\x0f\x0f\x0f\x0f\x0f' '\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f' '\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f' '\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f' '\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f' -'\x0f::)!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!\x0f\x0f\x0f\x0f!gdgg\x0f\x0f\x0f!!!!!!!!!!;;\xa7\xa7rrrrrrrrrr\xa7\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f!!!!!' +'\x0f;**\x0f!!!!!!!!\x0f\x0f!!\x0f\x0f!!!!!!!!!!!!!!!!!!!!!!\x0f!!!!!!!\x0f!\x0f\x0f\x0f!!!!\x0f\x0f=!**' +'*;;;;\x0f\x0f**\x0f\x0f**>!\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f*\x0f\x0f\x0f\x0f!!\x0f!!!;;\x0f\x0frrrrrrrrrr!!\xba\xba}}}}|}\xda\x0f\x0f\x0f\x0f\x0f' +'\x0f;;*\x0f!!!!!!\x0f\x0f\x0f\x0f!!\x0f\x0f!!!!!!!!!!!!!!!!!!!!!!\x0f!!!!!!!\x0f!!\x0f!!\x0f!!\x0f\x0f=\x0f**' +'*;;\x0f\x0f\x0f\x0f;;\x0f\x0f;;>\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f!!!!\x0f!\x0f\x0f\x0f\x0f\x0f\x0f\x0frrrrrrrrrr;;!!!\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f' +'\x0f;;*\x0f!!!!!!!!!\x0f!!!\x0f!!!!!!!!!!!!!!!!!!!!!!\x0f!!!!!!!\x0f!!\x0f!!!!!\x0f\x0f=!**' +'*;;;;;\x0f;;*\x0f**>\x0f\x0f!\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f!!;;\x0f\x0frrrrrrrrrr\x0f\xba\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f' +'\x0f;**\x0f!!!!!!!!\x0f\x0f!!\x0f\x0f!!!!!!!!!!!!!!!!!!!!!!\x0f!!!!!!!\x0f!!\x0f!!!!!\x0f\x0f=!*;' +'*;;;\x0f\x0f\x0f**\x0f\x0f**>\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f;*\x0f\x0f\x0f\x0f!!\x0f!!!\x0f\x0f\x0f\x0frrrrrrrrrr\xda!\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f' +'\x0f\x0f;!\x0f!!!!!!\x0f\x0f\x0f!!!\x0f!!!!\x0f\x0f\x0f!!\x0f!\x0f!!\x0f\x0f\x0f!!\x0f\x0f\x0f!!!\x0f\x0f\x0f!!!!!!!!!!!!\x0f\x0f\x0f\x0f**' +';**\x0f\x0f\x0f***\x0f***>\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f*\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0frrrrrrrrrr}}}\xdf\xdf\xdf\xdf\xdf\xdf\xba\xdf\x0f\x0f\x0f\x0f\x0f' +'\x0f***\x0f!!!!!!!!\x0f!!!\x0f!!!!!!!!!!!!!!!!!!!!!!!\x0f!!!!!!!!!!\x0f!!!!!\x0f\x0f\x0f\x0f;;' +';****\x0f;;;\x0f;;;>\x0f\x0f\x0f\x0f\x0f\x0f\x0fZ[\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f!!\x0f\x0f\x0f\x0frrrrrrrrrr\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f' +'\x0f\x0f**\x0f!!!!!!!!\x0f!!!\x0f!!!!!!!!!!!!!!!!!!!!!!!\x0f!!!!!!!!!!\x0f!!!!!\x0f\x0f=!*0' +'*****\x0f0**\x0f**;>\x0f\x0f\x0f\x0f\x0f\x0f\x0f**\x0f\x0f\x0f\x0f\x0f\x0f\x0f!\x0f!!;;\x0f\x0frrrrrrrrrr\x0f\xdf\xdf\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f' +'\x0f\x0f**\x0f!!!!!!!!\x0f!!!\x0f!!!!!!!!!!!!!!!!!!!!!!!\x0f!!!!!!!!!!!!!!!!\x0f\x0f\x0f\x0f**' +'*;;;\x0f\x0f***\x0f***>\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f*\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f!!\x0f\x0f\x0f\x0frrrrrrrrrr\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f' +'\x0f\x0f**\x0f!!!!!!!!!!!!!!!!!!\x0f\x0f\x0f!!!!!!!!!!!!!!!!!!!!!!!!\x0f!!!!!!!!!\x0f!\x0f\x0f' +'!!!!!!!\x0f\x0f\x0f>\x0f\x0f\x0f\x0f***;;;\x0f;\x0f********\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f**\xa7\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f' +'\x0f!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!;!!;;;;\\\\>\x0f\x0f\x0f\x0f\xba' +'!!!!!!\x1a;]]]];;;\xa7rrrrrrrrrr\xa7\xa7\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f' +'\x0f!!\x0f!\x0f\x0f!!\x0f!\x0f\x0f!\x0f\x0f\x0f\x0f\x0f\x0f!!!!\x0f!!!!!!!\x0f!!!\x0f!\x0f!\x0f\x0f!!\x0f!!!!;!!;;;;^^\x0f;;!\x0f\x0f' +'!!!!!\x0f\x1a\x0f____;;\x0f\x0frrrrrrrrrr\x0f\x0f!!\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f' +'!\xda\xda\xda\xa7\xa7\xa7\xa7\xa7\xa7\xa7\xa7\xa7\xa7\xa7\xa7\xa7\xa7\xa7\xda\xda\xda\xda\xdadd\xda\xda\xda\xda\xda\xdarrrrrrrrrr}}}}}}}}}}\xdad\xdad\xdac\xb2\x94\xb2\x94**' +'!!!!!!!!\x0f!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!\x0f\x0f\x0f\x0f\x0f\x0f`a;b;;;;;aaaa;*' +'a;gg>\xa7gg!!!!\x0f\x0f\x0f\x0f;;;;;;;;\x0f;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\x0f\xda\xda' +'\xda\xda\xda\xda\xda\xdad\xda\xda\xda\xda\xda\xda\x0f\x0f\xda\xa7\xa7\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f' +'!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!\x0f!!!!!\x0f!!\x0f*;;;;*;\x0f\x0f\x0f;=*>\x0f\x0f\x0f\x0f\x0f\x0f' +'rrrrrrrrrr\xa7\xa7\xa7\xa7\xa7\xa7!!!!!!**;;\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f' +'\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f((((((((((((((((((((((((((((((((' +'((((((\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!\xa7\x1a\x0f\x0f\x0f' '""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""' '""""""""""""""""""""""""""\x0f\x0f\x0f\x0f\x0f"!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!' '!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!\x0f\x0f\x0f\x0f\x0f!!!!!!!!!!!!!!!!!!!!!!!!' @@ -18106,8 +18107,8 @@ '!!!!!!!!!\x0f!!!!\x0f\x0f!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!\x0f!!!!\x0f\x0f!!!!!!!\x0f' '!\x0f!!!!\x0f\x0f!!!!!!!!!!!!!!!\x0f!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!' '!!!!!!!!!!!!!!!!!\x0f!!!!\x0f\x0f!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!' -'!!!!!!!!!!!!!!!!!!!!!!!!!!!\x0f\x0f\x0f\x0ff\xd9\xa6\xa6\xa6\xa6\xa6\xa6\xa6\xa6}}}}}}}}}|||||||||||\x0f\x0f\x0f' -'!!!!!!!!!!!!!!!!\xde\xde\xde\xde\xde\xde\xde\xde\xde\xde\x0f\x0f\x0f\x0f\x0f\x0f!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!' +'!!!!!!!!!!!!!!!!!!!!!!!!!!!\x0f\x0f\x0f\x0fg\xda\xa7\xa7\xa7\xa7\xa7\xa7\xa7\xa7~~~~~~~~~}}}}}}}}}}}\x0f\x0f\x0f' +'!!!!!!!!!!!!!!!!\xdf\xdf\xdf\xdf\xdf\xdf\xdf\xdf\xdf\xdf\x0f\x0f\x0f\x0f\x0f\x0f!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!' '!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f' '\x0f!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!' '!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!' @@ -18118,129 +18119,213 @@ '!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!' '!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!' '!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!' -'!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!\xa6\xa6!!!!!!!!\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f' -'\xe5!!!!!!!!!!!!!!!!!!!!!!!!!!\xb1\x93\x0f\x0f\x0f!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!' -'!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!\xa6\xa6\xa6uuu\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f' -'!!!!!!!!!!!!!\x0f!!!!::=\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f!!!!!!!!!!!!!!!!!!::=\xa6\xa6\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f' -'!!!!!!!!!!!!!!!!!!::\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f!!!!!!!!!!!!!\x0f!!!\x0f::\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f' -'!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!\x07\x07):::::::))' -')))))):)):::::::::=:\xa6\xa6\xa6\x1a\xa6\xa6\xa6\xb9!f\x0f\x0fqqqqqqqqqq\x0f\x0f\x0f\x0f\x0f\x0f\x81\x81\x81\x81\x81\x81\x81\x81\x81\x81\x0f\x0f\x0f\x0f\x0f\x0f' -'\xaa\xaa\xaa\xaa\xaa\xaa\x8e\xaa\xaa\xaa\xaa:::\xe5\x0fqqqqqqqqqq\x0f\x0f\x0f\x0f\x0f\x0f!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!' +'!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!\xa7\xa7!!!!!!!!\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f' +'\xe6!!!!!!!!!!!!!!!!!!!!!!!!!!\xb2\x94\x0f\x0f\x0f!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!' +'!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!\xa7\xa7\xa7vvv\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f' +'!!!!!!!!!!!!!\x0f!!!!;;>\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f!!!!!!!!!!!!!!!!!!;;>\xa7\xa7\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f' +'!!!!!!!!!!!!!!!!!!;;\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f!!!!!!!!!!!!!\x0f!!!\x0f;;\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f' +'!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!\x07\x07*;;;;;;;**' +'******;**;;;;;;;;;>;\xa7\xa7\xa7\x1a\xa7\xa7\xa7\xba!g\x0f\x0frrrrrrrrrr\x0f\x0f\x0f\x0f\x0f\x0f\x82\x82\x82\x82\x82\x82\x82\x82\x82\x82\x0f\x0f\x0f\x0f\x0f\x0f' +'\xab\xab\xab\xab\xab\xab\x8f\xab\xab\xab\xab;;;\xe6\x0frrrrrrrrrr\x0f\x0f\x0f\x0f\x0f\x0f!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!' '!!!\x1a!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f' -'!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!e\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f' +'!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f' '\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f' -'!!!!!!!!!!!!!!!!!!!!!!!!!!!!!\x0f\x0f\x0f:::))))::---\x0f\x0f\x0f\x0f)):))))))dfc\x0f\x0f\x0f\x0f' -'\xde\x0f\x0f\x0f\xaa\xaaqqqqqqqqqq!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!\x0f\x0f!!!!!\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f' -'!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!\x0f\x0f\x0f\x0f\x0f\x0f))))))))))))))))' -')!!!!!!!))\x0f\x0f\x0f\x0f\x0f\x0fqqqqqqqqqq\x0f\x0f\x0f\x0f\xaa\xaa\xde\xde\xde\xde\xde\xde\xde\xde\xde\xde\xde\xde\xde\xde\xde\xde\xde\xde\xde\xde\xde\xde\xde\xde\xde\xde\xde\xde\xde\xde\xde\xde' -'!!!!!!!!!!!!!!!!!!!!!!!fc)))\x0f\x0f\xa6\xa6\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f' +'!!!!!!!!!!!!!!!!!!!!!!!!!!!!!\x0f\x0f\x0f;;;****;;...\x0f\x0f\x0f\x0f**;******egd\x0f\x0f\x0f\x0f' +'\xdf\x0f\x0f\x0f\xab\xabrrrrrrrrrr!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!\x0f\x0f!!!!!\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f' +'!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!\x0f\x0f\x0f\x0f\x0f\x0f****************' +'*!!!!!!!**\x0f\x0f\x0f\x0f\x0f\x0frrrrrrrrrr\x0f\x0f\x0f\x0f\xab\xab\xdf\xdf\xdf\xdf\xdf\xdf\xdf\xdf\xdf\xdf\xdf\xdf\xdf\xdf\xdf\xdf\xdf\xdf\xdf\xdf\xdf\xdf\xdf\xdf\xdf\xdf\xdf\xdf\xdf\xdf\xdf\xdf' +'!!!!!!!!!!!!!!!!!!!!!!!gd***\x0f\x0f\xa7\xa7\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f' '\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f' '\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f' '\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f' -'::::)!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!<):::::):)))' -')):)*!!!!!!!\x0f\x0f\x0f\x0fqqqqqqqqqq\xa6\xa6\xa6\xa6\xa6\xa6\xa6\xd9\xd9\xd9\xd9\xd9\xd9\xd9\xd9\xd9\xd9fcfffffff\xd9\xd9\xd9\xd9\xd9\xd9\xd9\xd9\xd9\x0f\x0f\x0f' +';;;;*!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!=*;;;;;*;***' +'**;*+!!!!!!!\x0f\x0f\x0f\x0frrrrrrrrrr\xa7\xa7\xa7\xa7\xa7\xa7\xa7\xda\xda\xda\xda\xda\xda\xda\xda\xda\xdagdggggggg\xda\xda\xda\xda\xda\xda\xda\xda\xda\x0f\x0f\x0f' '\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f' '\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f' '\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x1a\x1a\x1a\x1a\x1a\x1a\x1a\x1a\x1a\x1a\x1a\x1a\x1a\x1a\x1a\x1a\x1a\x1a\x1a\x1a' '\x1a\x1a\x1a\x1a\x1a\x1a\x1a\x1a\x1a\x1a\x1a\x1a\x1a\x1a\x1a\x1a\x1a\x1a\x1a\x1a\x1a\x1a\x1a\x1a\x1a\x1a\x1a\x1a\x1a\x1a\x1a\x1a\x1a\x1a\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x1a\x15\x15\x15\x15\x15\x15\x15' '\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x1a\x1a\x1a\x1a\x1a\x1a\x1a\x1a\x1a\x1a\x1a\x1a\x1a\x1a\x1a\x1a\x1a\x1a\x1a\x1a\x1a\x1a\x1a\x1a\x1a\x1a\x1a\x1a\x1a\x1a\x1a\x1a\x1a\x1a\x1a\x1a\x1a' -'ffcfffffffc\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0ffc' -"'\x15'\x15'\x15'\x15'\x15'\x15'\x15'\x15'\x15'\x15'\x15'\x15'\x15'\x15'\x15'\x15'\x15'\x15'\x15'\x15'\x15'\x15'\x15'\x15'\x15'\x15'\x15'\x15'\x15'\x15'\x15'\x15" -"'\x15'\x15'\x15'\x15'\x15'\x15'\x15'\x15'\x15'\x15'\x15'\x15'\x15'\x15'\x15'\x15'\x15'\x15'\x15'\x15'\x15'\x15'\x15'\x15'\x15'\x15'\x15'\x15'\x15'\x15'\x15'\x15" -"'\x15'\x15'\x15'\x15'\x15'\x15'\x15'\x15'\x15'\x15'\x15\x15\x15\x15\x15\x15\x15\x0f\x0f\x0f\x0f'\x15'\x15'\x15'\x15'\x15'\x15'\x15'\x15'\x15'\x15'\x15'\x15'\x15'\x15'\x15'\x15" -"'\x15'\x15'\x15'\x15'\x15'\x15'\x15'\x15'\x15'\x15'\x15'\x15'\x15'\x15'\x15'\x15'\x15'\x15'\x15'\x15'\x15'\x15'\x15'\x15'\x15'\x15'\x15'\x15'\x15\x0f\x0f\x0f\x0f\x0f\x0f" -"\x15\x15\x15\x15\x15\x15\x15\x15''''''''\x15\x15\x15\x15\x15\x15\x0f\x0f''''''\x0f\x0f\x15\x15\x15\x15\x15\x15\x15\x15''''''''\x15\x15\x15\x15\x15\x15\x15\x15''''''''" -"\x15\x15\x15\x15\x15\x15\x0f\x0f''''''\x0f\x0f\x15\x15\x15\x15\x15\x15\x15\x15\x0f'\x0f'\x0f'\x0f'\x15\x15\x15\x15\x15\x15\x15\x15''''''''\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x0f\x0f" -"\x15\x15\x15\x15\x15\x15\x15\x15$$$$$$$$\x15\x15\x15\x15\x15\x15\x15\x15$$$$$$$$\x15\x15\x15\x15\x15\x15\x15\x15$$$$$$$$\x15\x15\x15\x15\x15\x0f\x15\x15''''$\xbe\x15\xbe" -"\xbe\xbe\x15\x15\x15\x0f\x15\x15''''$\xbe\xbe\xbe\x15\x15\x15\x15\x0f\x0f\x15\x15''''\x0f\xbe\xbe\xbe\x15\x15\x15\x15\x15\x15\x15\x15'''''\xbe\xbe\xbe\x0f\x0f\x15\x15\x15\x0f\x15\x15''''$\xbe\xbe\x0f" -'\xe5\xe5\xe5\xe5\xe5\xe5\xe5\xe5\xe5\xe5\xe5\x06\x06\x06\x07\x0c\x8d\x8e\x8e\x8d\x8d\x8d\xa7\xaa\x99\x97\xb1\x9a\x99\x97\xb1\x9a\xa7\xa7\xa7\xaa\xa7\xa7\xa7\xa7\xe1\xe2\x08\r\x0b\t\x0e\xe3\xa1\xa3\xa1\xa1\xa3\xa7\xaa\xaa\xaa\x9a\x98\xa7\xaa\xaa\xa7\x87' -'\x87\xaa\xaa\xaa\xc1\xb1\x93\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xcf\xaa\x87\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xe5\x06\x06\x06\x06\x0f\x0f\x0f\x0f\x0f\x0f\x06\x06\x06\x06\x06\x06z\x15\x0f\x0fyzzzzz\xc3\xc3\xcf\xb1\x93\x13' -'zyyyyzzzzz\xc3\xc3\xcf\xb1\x93\x0f\x1a\x1a\x1a\x1a\x1a\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\xb9\xb9\xb9\xb9\xb9\xb9\xb9\xb9\xb9\xb8\xb9\xb9\xb6\xb9\xb9\xb9\xb9\xb9\xb9\xb9\xb9\xb9\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f' -'\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0fff;;ffff;;;ff....f...;;fcf;;cccc\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f' -"\xde\xde'\xdb\xde\xdb\xde'\xde\xdb\x15'''\x15\x15'''\x13\xde'\xdb\xde\xde'''''\xde\xde\xde\xdb\xdb\xde'\xde%\xde'\xde'%''\xd7\x15''''\x15!!!!\x15\xde\xde\x15\x15''" -"\xd0\xcf\xcf\xcf\xcf'\x15\x15\x15\x15\xde\xcf\xde\xde\x15\x0f\x0f\x0f\x0f\x7f\x7f\x81\x81\x81\x81\x81\x81\x7f\x7f\x7f\x7f\x81ssssssssssssuuuussssssssssuuuuuu" -"uuu'\x15\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\xca\xca\xca\xca\xca\xdb\xdb\xdb\xdb\xdb\xcf\xcf\xde\xde\xde\xde\xcf\xde\xde\xcf\xde\xde\xcf\xde\xde\xde\xde\xde\xde\xde\xcf\xde\xde\xde\xde\xde\xde\xde\xde\xde\xdb\xdb\xde\xde\xde\xde\xde\xde" -'\xde\xde\xde\xde\xde\xde\xde\xde\xde\xde\xde\xde\xde\xde\xcf\xcf\xde\xde\xca\xde\xca\xde\xde\xde\xde\xde\xde\xde\xde\xde\xde\xde\xde\xde\xde\xde\xde\xde\xde\xdb\xde\xde\xde\xde\xde\xde\xde\xde\xde\xde\xde\xde\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf' -'\xca\xd0\xcb\xcb\xd0\xcf\xcf\xca\xcb\xd0\xd0\xcb\xd0\xd0\xcf\xca\xcf\xcb\xc3\xc7\xcf\xcb\xd0\xcf\xcf\xcf\xcb\xd0\xd0\xcb\xca\xcb\xcb\xd0\xd0\xca\xd0\xca\xd0\xca\xca\xca\xca\xcb\xcb\xd0\xcb\xd0\xd0\xd0\xd0\xd0\xca\xca\xca\xca\xcf\xd0\xcf\xd0\xcb\xcb\xd0\xd0' -'\xd0\xd0\xd0\xd0\xd0\xd0\xd0\xd0\xcb\xd0\xd0\xd0\xcb\xcf\xcf\xcf\xcf\xcf\xcb\xd0\xd0\xd0\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xd0\xcb\xca\xd0\xcf\xcb\xcb\xcb\xcb\xd0\xd0\xcb\xcb\xcf\xcf\xcb\xcb\xd0\xd0\xd0\xd0\xd0\xd0\xd0\xd0\xd0\xd0\xd0\xd0\xd0\xd0\xd0\xd0' -'\xd0\xd0\xcb\xcb\xd0\xd0\xcb\xcb\xd0\xd0\xd0\xd0\xd0\xcf\xcf\xd0\xd0\xd0\xd0\xcf\xcf\xca\xcf\xcf\xd0\xca\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xd0\xd0\xcf\xca\xd0\xd0\xd0\xd0\xd0\xd0\xd0\xd0\xd0\xd0\xd0\xd0\xd0\xd0\xd0\xd0\xd0\xd0\xd0\xcf\xcf\xcf\xcf\xcf\xd0\xcb' -'\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xd0\xd0\xd0\xd0\xd0\xcf\xcf\xd0\xd0\xcf\xcf\xcf\xcf\xd0\xd0\xd0\xd0\xd0\xd0\xd0\xd0\xd0\xd0\xd0\xd0\xd0\xd0\xd0\xd0\xd0\xd0\xd0\xd0\xd0\xd0\xd0\xd0\xcf\xcf\xd0\xd0\xd0\xd0\xd0\xd0\xd0\xd0\xd0\xd0\xd0\xd0\xd0\xd0\xd0\xd0' -'\xde\xde\xde\xde\xde\xde\xde\xde\xd0\xd0\xd0\xd0\xde\xde\xde\xde\xde\xde\xdb\xde\xde\xde\xde\xde\xde\xde\xde\xde\xde\xde\xde\xde\xd0\xd0\xde\xde\xde\xde\xde\xde\xde\xb4\x96\xde\xde\xde\xde\xde\xde\xde\xde\xde\xde\xde\xd9\xd9\xd9\xd9\xd9\xd9\xd9\xd9\xd9\xd9' -'\xd9\xd9\xd9\xd9\xd9\xd9\xd9\xd9\xd9\xd9\xd9\xd9\xd9\xd9\xd9\xd9\xd9\xd9\xd9\xd9\xd9\xd9\xd9\xd9\xd9\xd9\xd9\xd9\xd9\xd9\xd9\xd9\xd9\xd9\xd9\xd9\xd9\xd9\xd9\xd9\xd9\xd9\xd9\xd9\xd9\xd9\xd9\xd9\xd9\xd9\xd9\xd9\xd9\xd9\xd9\xd9\xd9\xd9\xd9\xde\xcf\xde\xde\xde' -'\xde\xde\xde\xde\xde\xde\xde\xde\xde\xde\xde\xde\xde\xde\xde\xde\xde\xde\xde\xde\xde\xd9\xde\xde\xde\xde\xde\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xde\xde\xde\xde\xde\xde\xde\xde\xde\xde\xde\xde' -'\xde\xde\xde\xde\xde\xde\xde\xde\xde\xde\xde\xde\xde\xde\xde\xde\xde\xde\xde\xde\xde\xde\xde\xde\xde\xde\xde\xde\xcf\xcf\xcf\xcf\xcf\xcf\xde\xde\xde\xde\xde\xde\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f' -'\xde\xde\xde\xde\xde\xde\xde\xde\xde\xde\xde\xde\xde\xde\xde\xde\xde\xde\xde\xde\xde\xde\xde\xde\xde\xde\xde\xde\xde\xde\xde\xde\xde\xde\xde\xde\xde\xde\xde\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f' -'\xde\xde\xde\xde\xde\xde\xde\xde\xde\xde\xde\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x80\x80\x80\x80\x80\x80\x80\x80\x80\x7f\x7f\x7f\x7f\x7f\x7f\x7f\x7f\x7f\x7f\x7f\x80\x80\x80\x80\x80\x80\x80\x80\x80\x7f\x7f\x7f' -'\x7f\x7f\x7f\x7f\x7f\x7f\x7f\x7fyyyyyyyyyxxxxxxxxxxx\xd8\xd8\xd8\xd8\xd8\xd8\xd8\xd8\xd8\xd8\xd8\xd8\xd8\xd8\xd8\xd8\xd8\xd8\xd8\xd8\xd8\xd8\xd8\xd8\xd8\xd8\xd8\xd8\xd8\xd8\xd8\xd8\xd8\xd8\xd8\xd8' -'\xd8\xd8\xd8\xd8\xd8\xd8\xd8\xd8\xd8\xd8\xd8\xd8\xd8\xd8\xd8\xd8\xd8\xd8\xd8\xd8\xd8\xd8\xd8\xd8\xd8\xd8\xd8\xd8\xd8\xd8\xd8\xd8\xd8\xd8\xd8\xd8\xd8\xd8\xd8\xd8\xd8\xd8\x82\x7f\x7f\x7f\x7f\x7f\x7f\x7f\x7f\x7f\x7f\x80\x80\x80\x80\x80\x80\x80\x80\x80\x7f\x80' -'\xdb\xdb\xdb\xdb\xdb\xdb\xdb\xdb\xdb\xdb\xdb\xdb\xdb\xdb\xdb\xdb\xdb\xdb\xdb\xdb\xdb\xdb\xdb\xdb\xdb\xdb\xdb\xdb\xdb\xdb\xdb\xdb\xdb\xdb\xdb\xdb\xdb\xdb\xdb\xdb\xdb\xdb\xdb\xdb\xdb\xdb\xdb\xdb\xdb\xdb\xdb\xdb\xdb\xdb\xdb\xdb\xdb\xdb\xdb\xdb\xdb\xdb\xdb\xdb' -'\xdb\xdb\xdb\xdb\xdb\xdb\xdb\xdb\xdb\xdb\xdb\xdb\xde\xde\xde\xde\xdb\xdb\xdb\xdb\xdb\xdb\xdb\xdb\xdb\xdb\xdb\xdb\xdb\xdb\xdb\xdb\xdb\xdb\xdb\xdb\xdb\xdb\xdb\xdb\xdb\xdb\xdb\xdb\xdb\xdb\xdb\xdb\xdb\xdb\xdb\xdb\xde\xde\xde\xde\xde\xde\xde\xde\xde\xde\xde\xde' -'\xdb\xdb\xdb\xdb\xdb\xdb\xdb\xdb\xdb\xdb\xdb\xdb\xdb\xdb\xdb\xdb\xde\xde\xdb\xdb\xdb\xdb\xde\xde\xde\xde\xde\xde\xde\xde\xde\xde\xdb\xdb\xde\xdb\xdb\xdb\xdb\xdb\xdb\xdb\xde\xde\xde\xde\xde\xde\xde\xde\xdb\xdb\xde\xde\xdb\xca\xde\xde\xde\xde\xdb\xdb\xde\xde' -'\xdb\xca\xde\xde\xde\xde\xdb\xdb\xdb\xde\xde\xdb\xde\xde\xdb\xdb\xdb\xdb\xde\xde\xde\xde\xde\xde\xde\xde\xde\xde\xde\xde\xde\xde\xde\xde\xdb\xdb\xdb\xdb\xde\xde\xde\xde\xde\xde\xde\xde\xde\xdb\xde\xde\xde\xde\xde\xde\xde\xde\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf' -'\xde\xde\xde\xde\xde\xdb\xdb\xde\xde\xdb\xde\xde\xde\xde\xdb\xdb\xde\xde\xde\xde\xdb\xdb\xde\xde\xde\xde\xde\xde\xdb\xde\xdb\xde\xde\xde\xde\xde\xde\xde\xde\xde\xde\xde\xde\xde\xde\xde\xde\xde\xde\xde\xde\xde\xde\xde\xde\xde\xde\xde\xde\xde\xde\xde\xde\xde' -'\xdb\xde\xdb\xde\xde\xde\xde\xde\xde\xde\xde\xde\xde\xde\xde\xde\xde\xde\xde\xde\xde\xde\xde\xde\xde\xde\xde\xde\xde\xde\xde\xde\xdb\xdb\xde\xdb\xdb\xdb\xde\xdb\xdb\xdb\xdb\xde\xdb\xdb\xde\xca\xde\xde\xde\xde\xde\xde\xde\xde\xde\xde\xde\xde\xde\xde\xde\xde' -'\xde\xde\xde\xde\xde\xde\xde\xde\xde\xde\xde\xde\xde\xde\xde\xde\xde\xde\xde\xde\xde\xde\xde\xde\xde\xde\xde\xde\xde\x0f\x0f\x0f\xde\xde\xde\xde\xde\xde\xde\xde\xde\xde\xde\xde\xd9\xde\xde\xde\xde\xde\xde\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f' +'ggdgggggggd\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0fgd' +'(\x15(\x15(\x15(\x15(\x15(\x15(\x15(\x15(\x15(\x15(\x15(\x15(\x15(\x15(\x15(\x15(\x15(\x15(\x15(\x15(\x15(\x15(\x15(\x15(\x15(\x15(\x15(\x15(\x15(\x15(\x15(\x15' +'(\x15(\x15(\x15(\x15(\x15(\x15(\x15(\x15(\x15(\x15(\x15(\x15(\x15(\x15(\x15(\x15(\x15(\x15(\x15(\x15(\x15(\x15(\x15(\x15(\x15(\x15(\x15(\x15(\x15(\x15(\x15(\x15' +'(\x15(\x15(\x15(\x15(\x15(\x15(\x15(\x15(\x15(\x15(\x15\x15\x15\x15\x15\x15\x15\x0f\x0f\x0f\x0f(\x15(\x15(\x15(\x15(\x15(\x15(\x15(\x15(\x15(\x15(\x15(\x15(\x15(\x15(\x15(\x15' +'(\x15(\x15(\x15(\x15(\x15(\x15(\x15(\x15(\x15(\x15(\x15(\x15(\x15(\x15(\x15(\x15(\x15(\x15(\x15(\x15(\x15(\x15(\x15(\x15(\x15(\x15(\x15(\x15(\x15\x0f\x0f\x0f\x0f\x0f\x0f' +'\x15\x15\x15\x15\x15\x15\x15\x15((((((((\x15\x15\x15\x15\x15\x15\x0f\x0f((((((\x0f\x0f\x15\x15\x15\x15\x15\x15\x15\x15((((((((\x15\x15\x15\x15\x15\x15\x15\x15((((((((' +'\x15\x15\x15\x15\x15\x15\x0f\x0f((((((\x0f\x0f\x15\x15\x15\x15\x15\x15\x15\x15\x0f(\x0f(\x0f(\x0f(\x15\x15\x15\x15\x15\x15\x15\x15((((((((\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x0f\x0f' +'\x15\x15\x15\x15\x15\x15\x15\x15%%%%%%%%\x15\x15\x15\x15\x15\x15\x15\x15%%%%%%%%\x15\x15\x15\x15\x15\x15\x15\x15%%%%%%%%\x15\x15\x15\x15\x15\x0f\x15\x15((((%\xbf\x15\xbf' +'\xbf\xbf\x15\x15\x15\x0f\x15\x15((((%\xbf\xbf\xbf\x15\x15\x15\x15\x0f\x0f\x15\x15((((\x0f\xbf\xbf\xbf\x15\x15\x15\x15\x15\x15\x15\x15(((((\xbf\xbf\xbf\x0f\x0f\x15\x15\x15\x0f\x15\x15((((%\xbf\xbf\x0f' +'\xe6\xe6\xe6\xe6\xe6\xe6\xe6\xe6\xe6\xe6\xe6\x06\x06\x06\x07\x0c\x8e\x8f\x8f\x8e\x8e\x8e\xa8\xab\x9a\x98\xb2\x9b\x9a\x98\xb2\x9b\xa8\xa8\xa8\xab\xa8\xa8\xa8\xa8\xe2\xe3\x08\r\x0b\t\x0e\xe4\xa2\xa4\xa2\xa2\xa4\xa8\xab\xab\xab\x9b\x99\xa8\xab\xab\xa8\x88' +'\x88\xab\xab\xab\xc2\xb2\x94\xab\xab\xab\xab\xab\xab\xab\xab\xab\xab\xab\xd0\xab\x88\xab\xab\xab\xab\xab\xab\xab\xab\xab\xab\xe6\x06\x06\x06\x06\x0f\x0f\x0f\x0f\x0f\x0f\x06\x06\x06\x06\x06\x06{\x15\x0f\x0fz{{{{{\xc4\xc4\xd0\xb2\x94\x13' +'{zzzz{{{{{\xc4\xc4\xd0\xb2\x94\x0f\x1a\x1a\x1a\x1a\x1a\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\xba\xba\xba\xba\xba\xba\xba\xba\xba\xb9\xba\xba\xb7\xba\xba\xba\xba\xba\xba\xba\xba\xba\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f' +'\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0fgg<!!!!;!!!!!!!!!!!!!!!!!!!!!!!**;;*\xdf\xdf\xdf\xdf\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f' +'!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!\xab\xab\xab\xab\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f' '\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f' '\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f' '""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""' @@ -18277,94 +18362,130 @@ '"""""""""""""""""""""""""""""""""""""""""""\x0f\x0f\x0f\x0f\x0f""""""""""""""""' '""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""' '""""""""""""""""""""""""""\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f' -'\x15\x15\x15\x15\x15\x15\x15\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x15\x15\x15\x15\x15\x0f\x0f\x0f\x0f\x0f#N##########\xc3#############\x0f#####\x0f#\x0f' -'##\x0f##\x0f##########\x1f\x1f\x1f\x1f\x1f\x1f\x1f\x1f\x1f\x1f\x1f\x1f\x1f\x1f\x1f\x1f\x1f\x1f\x1f\x1f\x1f\x1f\x1f\x1f\x1f\x1f\x1f\x1f\x1f\x1f\x1f\x1f\x1f\x1f\x1f\x1f\x1f\x1f\x1f\x1f\x1f\x1f\x1f\x1f\x1f\x1f\x1f\x1f' +'\x15\x15\x15\x15\x15\x15\x15\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x15\x15\x15\x15\x15\x0f\x0f\x0f\x0f\x0f$O$$$$$$$$$$\xc4$$$$$$$$$$$$$\x0f$$$$$\x0f$\x0f' +'$$\x0f$$\x0f$$$$$$$$$$\x1f\x1f\x1f\x1f\x1f\x1f\x1f\x1f\x1f\x1f\x1f\x1f\x1f\x1f\x1f\x1f\x1f\x1f\x1f\x1f\x1f\x1f\x1f\x1f\x1f\x1f\x1f\x1f\x1f\x1f\x1f\x1f\x1f\x1f\x1f\x1f\x1f\x1f\x1f\x1f\x1f\x1f\x1f\x1f\x1f\x1f\x1f\x1f' '\x1f\x1f\x1f\x1f\x1f\x1f\x1f\x1f\x1f\x1f\x1f\x1f\x1f\x1f\x1f\x1f\x1f\x1f\x1f\x1f\x1f\x1f\x1f\x1f\x1f\x1f\x1f\x1f\x1f\x1f\x1f\x1f\x1f\x1f\x1f\x1f\x1f\x1f\x1f\x1f\x1f\x1f\x1f\x1f\x1f\x1f\x1f\x1f\x1f\x1f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f' '\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x1f\x1f\x1f\x1f\x1f\x1f\x1f\x1f\x1f\x1f\x1f\x1f\x1f\x1f\x1f\x1f\x1f\x1f\x1f\x1f\x1f\x1f\x1f\x1f\x1f\x1f\x1f\x1f\x1f\x1f\x1f\x1f\x1f\x1f\x1f\x1f\x1f\x1f\x1f\x1f\x1f\x1f\x1f\x1f\x1f' '\x1f\x1f\x1f\x1f\x1f\x1f\x1f\x1f\x1f\x1f\x1f\x1f\x1f\x1f\x1f\x1f\x1f\x1f\x1f\x1f\x1f\x1f\x1f\x1f\x1f\x1f\x1f\x1f\x1f\x1f\x1f\x1f\x1f\x1f\x1f\x1f\x1f\x1f\x1f\x1f\x1f\x1f\x1f\x1f\x1f\x1f\x1f\x1f\x1f\x1f\x1f\x1f\x1f\x1f\x1f\x1f\x1f\x1f\x1f\x1f\x1f\x1f\x1f\x1f' '\x1f\x1f\x1f\x1f\x1f\x1f\x1f\x1f\x1f\x1f\x1f\x1f\x1f\x1f\x1f\x1f\x1f\x1f\x1f\x1f\x1f\x1f\x1f\x1f\x1f\x1f\x1f\x1f\x1f\x1f\x1f\x1f\x1f\x1f\x1f\x1f\x1f\x1f\x1f\x1f\x1f\x1f\x1f\x1f\x1f\x1f\x1f\x1f\x1f\x1f\x1f\x1f\x1f\x1f\x1f\x1f\x1f\x1f\x1f\x1f\x1f\x1f\x1f\x1f' '\x1f\x1f\x1f\x1f\x1f\x1f\x1f\x1f\x1f\x1f\x1f\x1f\x1f\x1f\x1f\x1f\x1f\x1f\x1f\x1f\x1f\x1f\x1f\x1f\x1f\x1f\x1f\x1f\x1f\x1f\x1f\x1f\x1f\x1f\x1f\x1f\x1f\x1f\x1f\x1f\x1f\x1f\x1f\x1f\x1f\x1f\x1f\x1f\x1f\x1f\x1f\x1f\x1f\x1f\x1f\x1f\x1f\x1f\x1f\x1f\x1f\x1f\x1f\x1f' '\x1f\x1f\x1f\x1f\x1f\x1f\x1f\x1f\x1f\x1f\x1f\x1f\x1f\x1f\x1f\x1f\x1f\x1f\x1f\x1f\x1f\x1f\x1f\x1f\x1f\x1f\x1f\x1f\x1f\x1f\x1f\x1f\x1f\x1f\x1f\x1f\x1f\x1f\x1f\x1f\x1f\x1f\x1f\x1f\x1f\x1f\x1f\x1f\x1f\x1f\x1f\x1f\x1f\x1f\x1f\x1f\x1f\x1f\x1f\x1f\x1f\x1f\x1f\x1f' -'\x1f\x1f\x1f\x1f\x1f\x1f\x1f\x1f\x1f\x1f\x1f\x1f\x1f\x1f\x1f\x1f\x1f\x1f\x1f\x1f\x1f\x1f\x1f\x1f\x1f\x1f\x1f\x1f\x1f\x1f\x1f\x1f\x1f\x1f\x1f\x1f\x1f\x1f\x1f\x1f\x1f\x1f\x1f\x1f\x1f\x1f\x1f\x1f\x1f\x1f\x1f\x1f\x1f\x1f\x1f\x1f\x1f\x1f\x1f\x1f\x1f\x1f\xb0\x92' +'\x1f\x1f\x1f\x1f\x1f\x1f\x1f\x1f\x1f\x1f\x1f\x1f\x1f\x1f\x1f\x1f\x1f\x1f\x1f\x1f\x1f\x1f\x1f\x1f\x1f\x1f\x1f\x1f\x1f\x1f\x1f\x1f\x1f\x1f\x1f\x1f\x1f\x1f\x1f\x1f\x1f\x1f\x1f\x1f\x1f\x1f\x1f\x1f\x1f\x1f\x1f\x1f\x1f\x1f\x1f\x1f\x1f\x1f\x1f\x1f\x1f\x1f\xb1\x93' '\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x1f\x1f\x1f\x1f\x1f\x1f\x1f\x1f\x1f\x1f\x1f\x1f\x1f\x1f\x1f\x1f\x1f\x1f\x1f\x1f\x1f\x1f\x1f\x1f\x1f\x1f\x1f\x1f\x1f\x1f\x1f\x1f\x1f\x1f\x1f\x1f\x1f\x1f\x1f\x1f\x1f\x1f\x1f\x1f\x1f\x1f\x1f\x1f' '\x1f\x1f\x1f\x1f\x1f\x1f\x1f\x1f\x1f\x1f\x1f\x1f\x1f\x1f\x1f\x1f\x0f\x0f\x1f\x1f\x1f\x1f\x1f\x1f\x1f\x1f\x1f\x1f\x1f\x1f\x1f\x1f\x1f\x1f\x1f\x1f\x1f\x1f\x1f\x1f\x1f\x1f\x1f\x1f\x1f\x1f\x1f\x1f\x1f\x1f\x1f\x1f\x1f\x1f\x1f\x1f\x1f\x1f\x1f\x1f\x1f\x1f\x1f\x1f' -'\x1f\x1f\x1f\x1f\x1f\x1f\x1f\x1f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x1f\x1f\x1f\x1f\x1f\x1f\x1f\x1f\x1f\x1f\x1f\x1f\xb5\xde\x0f\x0f' -'0000000000000000\xac\xac\xac\xac\xac\xac\xac\xb3\x95\xac\x0f\x0f\x0f\x0f\x0f\x0fffff\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\xac\x8f\x8f\x89\x89\xb3\x95\xb3\x95\xb3\x95\xb3\x95\xb3\x95\xb3' -'\x95\xb3\x95\xb3\x95\xac\xac\xb3\x95\xac\xac\xac\xac\x89\x89\x89\xa0\xac\xa0\x0f\xac\xa0\xac\xac\x8f\xb4\x96\xb4\x96\xb4\x96\xa5\xac\xac\xc5\x8c\xd4\xd4\xd3\x0f\xac\xbb\xa5\xac\x0f\x0f\x0f\x0f\x1f\x1f\x1f\x1f\x1f\x0f\x1f\x1f\x1f\x1f\x1f\x1f\x1f\x1f\x1f\x1f' +'\x1f\x1f\x1f\x1f\x1f\x1f\x1f\x1f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x1f\x1f\x1f\x1f\x1f\x1f\x1f\x1f\x1f\x1f\x1f\x1f\xb6\xdf\x0f\x0f' +'1111111111111111\xad\xad\xad\xad\xad\xad\xad\xb4\x96\xad\x0f\x0f\x0f\x0f\x0f\x0fgggg\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\xad\x90\x90\x8a\x8a\xb4\x96\xb4\x96\xb4\x96\xb4\x96\xb4\x96\xb4' +'\x96\xb4\x96\xb4\x96\xad\xad\xb4\x96\xad\xad\xad\xad\x8a\x8a\x8a\xa1\xad\xa1\x0f\xad\xa1\xad\xad\x90\xb5\x97\xb5\x97\xb5\x97\xa6\xad\xad\xc6\x8d\xd5\xd5\xd4\x0f\xad\xbc\xa6\xad\x0f\x0f\x0f\x0f\x1f\x1f\x1f\x1f\x1f\x0f\x1f\x1f\x1f\x1f\x1f\x1f\x1f\x1f\x1f\x1f' '\x1f\x1f\x1f\x1f\x1f\x1f\x1f\x1f\x1f\x1f\x1f\x1f\x1f\x1f\x1f\x1f\x1f\x1f\x1f\x1f\x1f\x1f\x1f\x1f\x1f\x1f\x1f\x1f\x1f\x1f\x1f\x1f\x1f\x1f\x1f\x1f\x1f\x1f\x1f\x1f\x1f\x1f\x1f\x1f\x1f\x1f\x1f\x1f\x1f\x1f\x1f\x1f\x1f\x1f\x1f\x1f\x1f\x1f\x1f\x1f\x1f\x1f\x1f\x1f' '\x1f\x1f\x1f\x1f\x1f\x1f\x1f\x1f\x1f\x1f\x1f\x1f\x1f\x1f\x1f\x1f\x1f\x1f\x1f\x1f\x1f\x1f\x1f\x1f\x1f\x1f\x1f\x1f\x1f\x1f\x1f\x1f\x1f\x1f\x1f\x1f\x1f\x1f\x1f\x1f\x1f\x1f\x1f\x1f\x1f\x1f\x1f\x1f\x1f\x1f\x1f\x1f\x1f\x1f\x1f\x1f\x1f\x1f\x1f\x1f\x1f\x0f\x0f\x06' -'\x0f\xa8\xa8\xa2\xb7\xa2\xa8\xa8\xae\x90\xa8\xc2\x9d\x8a\x9d\x9dnnnnnnnnnn\x9d\xa8\xcd\xcc\xcd\xa8\xa8&&&&&&&&&&&&&&&&&&&&&&&&&&\xae\xa8\x90\xbd\x86' -'\xbd\x14\x14\x14\x14\x14\x14\x14\x14\x14\x14\x14\x14\x14\x14\x14\x14\x14\x14\x14\x14\x14\x14\x14\x14\x14\x14\xae\xcc\x90\xcc\xae\x90\xa9\xaf\x91\xa9\xa9 \x19 ' +"\x0f\xa9\xa9\xa3\xb8\xa3\xa9\xa9\xaf\x91\xa9\xc3\x9e\x8b\x9e\x9eoooooooooo\x9e\xa9\xce\xcd\xce\xa9\xa9''''''''''''''''''''''''''\xaf\xa9\x91\xbe\x87" +'\xbe\x14\x14\x14\x14\x14\x14\x14\x14\x14\x14\x14\x14\x14\x14\x14\x14\x14\x14\x14\x14\x14\x14\x14\x14\x14\x14\xaf\xcd\x91\xcd\xaf\x91\xaa\xb0\x92\xaa\xaa \x19 ' ' \x19\x19 \x0f' -'\x0f\x0f \x0f\x0f \x0f\x0f \x0f\x0f \x0f\x0f\x0f\xb7\xb7\xcc\xbd\xdc\xb7\xb7\x0f\xdd\xce\xce\xce\xce\xdd\xdd\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\n\n\n\xde\xdb\x0f\x0f' +'\x0f\x0f \x0f\x0f \x0f\x0f \x0f\x0f \x0f\x0f\x0f\xb8\xb8\xcd\xbe\xdd\xb8\xb8\x0f\xde\xcf\xcf\xcf\xcf\xde\xde\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\n\n\n\xdf\xdc\x0f\x0f' '!!!!!!!!!!!!\x0f!!!!!!!!!!!!!!!!!!!!!!!!!!\x0f!!!!!!!!!!!!!!!!!!!\x0f!!\x0f!' '!!!!!!!!!!!!!!\x0f\x0f!!!!!!!!!!!!!!\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f' '!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!' '!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!\x0f\x0f\x0f\x0f\x0f' -'\xa6\xaa\xd9\x0f\x0f\x0f\x0f|||||||||||||||||||||||||||||||||||||||||||||\x0f\x0f\x0f\xd9\xd9\xd9\xd9\xd9\xd9\xd9\xd9\xd9' -'wwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwww\x81\x81\x81\x81\xde\xde\xde\xde\xde\xde\xde' -'\xde\xde\xde\xde\xde\xde\xde\xde\xde\xde\x81\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f' +'\xa7\xab\xda\x0f\x0f\x0f\x0f}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}\x0f\x0f\x0f\xda\xda\xda\xda\xda\xda\xda\xda\xda' +'xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx\x82\x82\x82\x82\xdf\xdf\xdf\xdf\xdf\xdf\xdf' +'\xdf\xdf\xdf\xdf\xdf\xdf\xdf\xdf\xdf\xdf\x82\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f' '\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f' -'!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!\x0f||||\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f!!!!!!!!!!!!!!!!' -'!u!!!!!!!!u\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f' -'!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!\x0f\xa6!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!' -'!!!!\x0f\x0f\x0f\x0f!!!!!!!!\xa6uuuuu\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f' -"''''''''''''''''''''''''''''''''''''''''\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15" +'!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!\x0f}}}}\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f!!!!!!!!!!!!!!!!' +'!v!!!!!!!!v\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f' +'!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!\x0f\xa7!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!' +'!!!!\x0f\x0f\x0f\x0f!!!!!!!!\xa7vvvvv\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f' +'((((((((((((((((((((((((((((((((((((((((\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15' '\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!' -'!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!\x0f\x0fqqqqqqqqqq\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f' +'!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!\x0f\x0frrrrrrrrrr\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f' '\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f' -'######\x0f\x0f#\x0f############################################\x0f##\x0f\x0f\x0f#\x0f\x0f#' +'$$$$$$\x0f\x0f$\x0f$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$\x0f$$\x0f\x0f\x0f$\x0f\x0f$' '\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f' '\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f' '\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f' -'######################\x84\x84\x84\x84\x0f\x0f\x0f\x0f\x0f\xaa\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f' +'$$$$$$$$$$$$$$$$$$$$$$\x85\x85\x85\x85\x0f\x0f\x0f\x0f\x0f\xab\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f' '\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f' '\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f' '\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f' -'#:::\x0f::\x0f\x0f\x0f\x0f\x0f:c:f####\x0f###\x0f###########################\x0f\x0f\x0f\x0ff;c\x0f\x0f\x0f\x0f=' -'\x85\x85\x85\x85\x84\x84\x84\x84\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\xad\xad\xad\xad\xad\xad\xad\xad\xad\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f' +'$;;;\x0f;;\x0f\x0f\x0f\x0f\x0f;d;g$$$$\x0f$$$\x0f$$$$$$$$$$$$$$$$$$$$$$$$$$$\x0f\x0f\x0f\x0fg' +'\x86\x86\x86\x86\x85\x85\x85\x85\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\xae\xae\xae\xae\xae\xae\xae\xae\xae\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f' '\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f' '\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f' '!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!' '!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f' '\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f' '\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f' -'uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuttuuuuuuuuuuuu' -'uuuuuuuuuuuuuuuuuuuuuuttuuuuuuuuuuu\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\xa6\xa6\xa6\xa6\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f' +'vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvuuvvvvvvvvvvvv' +'vvvvvvvvvvvvvvvvvvvvvvuuvvvvvvvvvvv\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\xa7\xa7\xa7\xa7\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f' '\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f' '\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f' -'\xd9\xd9\xd9\xd9\xd9\xd9\xd9\xd9\xd9\xd9\xd9\xd9\xd9\xd9\xd9\xd9\xd9\xd9\xd9\xd9\xd9\xd9\xd9\xd9\xd9\xd9\xd9\xd9\xd9\xd9\xd9\xd9\xd9\xd9\xd9\xd9\xd9\xd9\xd9\xd9\xd9\xd9\xd9\xd9\xd9\xd9\xd9\xd9\xd9\xd9\xd9\xd9\xd9\xd9\xd9\xd9\xd9\xd9\xd9\xd9\xd9\xd9\xd9\xd9' -'\xd9\xd9\xd9\xd9\xd9\xd9\xd9\xd9\xd9\xd9\xd9\xd9\xd9\xd9\xd9\xd9\xd9\xd9\xd9\xd9\xd9\xd9\xd9\xd9\xd9\xd9\xd9\xd9\xd9\xd9\xd9\xd9\xd9\xd9\xd9\xd9\xd9\xd9\xd9\xd9\xd9\xd9\xd9\xd9\xd9\xd9\xd9\xd9\xd9\xd9\xd9\xd9\xd9\xd9\xd9\xd9\xd9\xd9\xd9\xd9\xd9\xd9\xd9\xd9' -'\xd9\xd9\xd9\xd9\xd9\xd9\xd9\xd9\xd9\xd9\xd9\xd9\xd9\xd9\xd9\xd9\xd9\xd9\xd9\xd9\xd9\xd9\xd9\xd9\xd9\xd9\xd9\xd9\xd9\xd9\xd9\xd9\xd9\xd9\xd9\xd9\xd9\xd9\xd9\xd9\xd9\xd9\xd9\xd9\xd9\xd9\xd9\xd9\xd9\xd9\xd9\xd9\xd9\xd9\xd9\xd9\xd9\xd9\xd9\xd9\xd9\xd9\xd9\xd9' -'\xd9\xd9\xd9\xd9\xd9\xd9\xd9\xd9\xd9\xd9\xd9\xd9\xd9\xd9\xd9\xd9\xd9\xd9\xd9\xd9\xd9\xd9\xd9\xd9\xd9\xd9\xd9\xd9\xd9\xd9\xd9\xd9\xd9\xd9\xd9\xd9\xd9\xd9\xd9\xd9\xd9\xd9\xd9\xd9\xd9\xd9\xd9\xd9\xd9\xd9\xd9\xd9\xd9\xd9\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f' -'\xd9\xd9\xd9\xd9\xd9\xd9\xd9\xd9\xd9\xd9\xd9\xd9\xd9\xd9\xd9\xd9\xd9\xd9\xd9\xd9\xd9\xd9\xd9\xd9\xd9\xd9\xd9\xd9\xd9\xd9\xd9\xd9\xd9\xd9\xd9\xd9\xd9\xd9\xd9\x0f\x0f\x0f\xd9\xd9\xd9\xd9\xd9\xd9\xd9\xd9\xd9\xd9\xd9\xd9\xd9\xd9\xd9\xd9\xd9\xd9\xd9\xd9\xd9\xd9' -'\xd9\xd9\xd9\xd9\xd9\xd9\xd9\xd9\xd9\xd9\xd9\xd9\xd9\xd9\xd9\xd9\xd9\xd9\xd9\xd9\xd9\xd9\xd9\xd9\xd9\xd9\xd9\xd9\xd9\xd9\xd9\xd9\xd9\xd9\xd9\xd9\xd9++;;;\xd9\xd9\xd9,+++++\x06\x06\x06\x06\x06\x06\x06\x06ccccc' -'ccc\xd9\xd9fffffcc\xd9\xd9\xd9\xd9\xd9\xd9\xd9\xd9\xd9\xd9\xd9\xd9\xd9\xd9\xd9\xd9\xd9\xd9\xd9\xd9\xd9\xd9\xd9\xd9\xd9\xd9\xd9\xd9\xd9\xd9ffff\xd9\xd9\xd9\xd9\xd9\xd9\xd9\xd9\xd9\xd9\xd9\xd9\xd9\xd9\xd9\xd9\xd9\xd9' -'\xd9\xd9\xd9\xd9\xd9\xd9\xd9\xd9\xd9\xd9\xd9\xd9\xd9\xd9\xd9\xd9\xd9\xd9\xd9\xd9\xd9\xd9\xd9\xd9\xd9\xd9\xd9\xd9\xd9\xd9\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f' -'\xde\xde\xde\xde\xde\xde\xde\xde\xde\xde\xde\xde\xde\xde\xde\xde\xde\xde\xde\xde\xde\xde\xde\xde\xde\xde\xde\xde\xde\xde\xde\xde\xde\xde\xde\xde\xde\xde\xde\xde\xde\xde\xde\xde\xde\xde\xde\xde\xde\xde\xde\xde\xde\xde\xde\xde\xde\xde\xde\xde\xde\xde\xde\xde' -'\xde\xdefff\xde\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f' +'\xda\xda\xda\xda\xda\xda\xda\xda\xda\xda\xda\xda\xda\xda\xda\xda\xda\xda\xda\xda\xda\xda\xda\xda\xda\xda\xda\xda\xda\xda\xda\xda\xda\xda\xda\xda\xda\xda\xda\xda\xda\xda\xda\xda\xda\xda\xda\xda\xda\xda\xda\xda\xda\xda\xda\xda\xda\xda\xda\xda\xda\xda\xda\xda' +'\xda\xda\xda\xda\xda\xda\xda\xda\xda\xda\xda\xda\xda\xda\xda\xda\xda\xda\xda\xda\xda\xda\xda\xda\xda\xda\xda\xda\xda\xda\xda\xda\xda\xda\xda\xda\xda\xda\xda\xda\xda\xda\xda\xda\xda\xda\xda\xda\xda\xda\xda\xda\xda\xda\xda\xda\xda\xda\xda\xda\xda\xda\xda\xda' +'\xda\xda\xda\xda\xda\xda\xda\xda\xda\xda\xda\xda\xda\xda\xda\xda\xda\xda\xda\xda\xda\xda\xda\xda\xda\xda\xda\xda\xda\xda\xda\xda\xda\xda\xda\xda\xda\xda\xda\xda\xda\xda\xda\xda\xda\xda\xda\xda\xda\xda\xda\xda\xda\xda\xda\xda\xda\xda\xda\xda\xda\xda\xda\xda' +'\xda\xda\xda\xda\xda\xda\xda\xda\xda\xda\xda\xda\xda\xda\xda\xda\xda\xda\xda\xda\xda\xda\xda\xda\xda\xda\xda\xda\xda\xda\xda\xda\xda\xda\xda\xda\xda\xda\xda\xda\xda\xda\xda\xda\xda\xda\xda\xda\xda\xda\xda\xda\xda\xda\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f' +'\xda\xda\xda\xda\xda\xda\xda\xda\xda\xda\xda\xda\xda\xda\xda\xda\xda\xda\xda\xda\xda\xda\xda\xda\xda\xda\xda\xda\xda\xda\xda\xda\xda\xda\xda\xda\xda\xda\xda\x0f\x0f\x0f\xda\xda\xda\xda\xda\xda\xda\xda\xda\xda\xda\xda\xda\xda\xda\xda\xda\xda\xda\xda\xda\xda' +'\xda\xda\xda\xda\xda\xda\xda\xda\xda\xda\xda\xda\xda\xda\xda\xda\xda\xda\xda\xda\xda\xda\xda\xda\xda\xda\xda\xda\xda\xda\xda\xda\xda\xda\xda\xda\xda,,<<<\xda\xda\xda-,,,,,\x06\x06\x06\x06\x06\x06\x06\x06ddddd' +'ddd\xda\xdagggggdd\xda\xda\xda\xda\xda\xda\xda\xda\xda\xda\xda\xda\xda\xda\xda\xda\xda\xda\xda\xda\xda\xda\xda\xda\xda\xda\xda\xda\xda\xdagggg\xda\xda\xda\xda\xda\xda\xda\xda\xda\xda\xda\xda\xda\xda\xda\xda\xda\xda' +'\xda\xda\xda\xda\xda\xda\xda\xda\xda\xda\xda\xda\xda\xda\xda\xda\xda\xda\xda\xda\xda\xda\xda\xda\xda\xda\xda\xda\xda\xda\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f' +'\xdf\xdf\xdf\xdf\xdf\xdf\xdf\xdf\xdf\xdf\xdf\xdf\xdf\xdf\xdf\xdf\xdf\xdf\xdf\xdf\xdf\xdf\xdf\xdf\xdf\xdf\xdf\xdf\xdf\xdf\xdf\xdf\xdf\xdf\xdf\xdf\xdf\xdf\xdf\xdf\xdf\xdf\xdf\xdf\xdf\xdf\xdf\xdf\xdf\xdf\xdf\xdf\xdf\xdf\xdf\xdf\xdf\xdf\xdf\xdf\xdf\xdf\xdf\xdf' +'\xdf\xdfggg\xdf\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f' '\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f' '\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f' -'\xde\xde\xde\xde\xde\xde\xde\xde\xde\xde\xde\xde\xde\xde\xde\xde\xde\xde\xde\xde\xde\xde\xde\xde\xde\xde\xde\xde\xde\xde\xde\xde\xde\xde\xde\xde\xde\xde\xde\xde\xde\xde\xde\xde\xde\xde\xde\xde\xde\xde\xde\xde\xde\xde\xde\xde\xde\xde\xde\xde\xde\xde\xde\xde' -'\xde\xde\xde\xde\xde\xde\xde\xde\xde\xde\xde\xde\xde\xde\xde\xde\xde\xde\xde\xde\xde\xde\xde\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f||||||||||||||||||\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f' +'\xdf\xdf\xdf\xdf\xdf\xdf\xdf\xdf\xdf\xdf\xdf\xdf\xdf\xdf\xdf\xdf\xdf\xdf\xdf\xdf\xdf\xdf\xdf\xdf\xdf\xdf\xdf\xdf\xdf\xdf\xdf\xdf\xdf\xdf\xdf\xdf\xdf\xdf\xdf\xdf\xdf\xdf\xdf\xdf\xdf\xdf\xdf\xdf\xdf\xdf\xdf\xdf\xdf\xdf\xdf\xdf\xdf\xdf\xdf\xdf\xdf\xdf\xdf\xdf' +'\xdf\xdf\xdf\xdf\xdf\xdf\xdf\xdf\xdf\xdf\xdf\xdf\xdf\xdf\xdf\xdf\xdf\xdf\xdf\xdf\xdf\xdf\xdf\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f}}}}}}}}}}}}}}}}}}\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f' '\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f' '\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f' -"''''''''''''''''''''''''''\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15''''''''''''" -"''''''''''''''\x15\x15\x15\x15\x15\x15\x15\x0f\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15''''''''''''''''''''''''" -"''\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15'\x0f''\x0f\x0f'\x0f\x0f''\x0f\x0f''''\x0f''''''''\x15\x15\x15\x15\x0f\x15\x0f\x15\x15\x15" -"\x15\x15\x15\x15\x0f\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15''''''''''''''''''''''''''\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15" -"\x15\x15\x15\x15''\x0f''''\x0f\x0f''''''''\x0f'''''''\x0f\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15''\x0f''''\x0f" -"'''''\x0f'\x0f\x0f\x0f'''''''\x0f\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15''''''''''''''''''''" -"''''''\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15''''''''''''''''''''''''''\x15\x15\x15\x15\x15\x15" -"\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15''''''''''''''''''''''''''\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15" -"\x15\x15\x15\x15\x15\x15\x15\x15''''''''''''''''''''''''''\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15''''" -"''''''''''''''''''''''\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15''''''''''''''''" -"''''''''''\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x0f\x0f''''''''''''''''''''''''" -"'\xc8\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\xc9\x15\x15\x15\x15\x15\x15'''''''''''''''''''''''''\xc8\x15\x15\x15\x15" -"\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\xc9\x15\x15\x15\x15\x15\x15'''''''''''''''''''''''''\xc8\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15" -"\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\xc9\x15\x15\x15\x15\x15\x15'''''''''''''''''''''''''\xc8\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15" -"\x15\x15\x15\x15\x15\x15\x15\x15\x15\xc9\x15\x15\x15\x15\x15\x15'''''''''''''''''''''''''\xc8\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15" -"\x15\x15\x15\xc9\x15\x15\x15\x15\x15\x15'\x15\x0f\x0foooooooooooooooooooooooooooooooooooooooooooooooooo" +'((((((((((((((((((((((((((\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15((((((((((((' +'((((((((((((((\x15\x15\x15\x15\x15\x15\x15\x0f\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15((((((((((((((((((((((((' +'((\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15(\x0f((\x0f\x0f(\x0f\x0f((\x0f\x0f((((\x0f((((((((\x15\x15\x15\x15\x0f\x15\x0f\x15\x15\x15' +'\x15\x15\x15\x15\x0f\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15((((((((((((((((((((((((((\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15' +'\x15\x15\x15\x15((\x0f((((\x0f\x0f((((((((\x0f(((((((\x0f\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15((\x0f((((\x0f' +'(((((\x0f(\x0f\x0f\x0f(((((((\x0f\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15((((((((((((((((((((' +'((((((\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15((((((((((((((((((((((((((\x15\x15\x15\x15\x15\x15' +'\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15((((((((((((((((((((((((((\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15' +'\x15\x15\x15\x15\x15\x15\x15\x15((((((((((((((((((((((((((\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15((((' +'((((((((((((((((((((((\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15((((((((((((((((' +'((((((((((\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x0f\x0f((((((((((((((((((((((((' +'(\xc9\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\xca\x15\x15\x15\x15\x15\x15(((((((((((((((((((((((((\xc9\x15\x15\x15\x15' +'\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\xca\x15\x15\x15\x15\x15\x15(((((((((((((((((((((((((\xc9\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15' +'\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\xca\x15\x15\x15\x15\x15\x15(((((((((((((((((((((((((\xc9\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15' +'\x15\x15\x15\x15\x15\x15\x15\x15\x15\xca\x15\x15\x15\x15\x15\x15(((((((((((((((((((((((((\xc9\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15\x15' +'\x15\x15\x15\xca\x15\x15\x15\x15\x15\x15(\x15\x0f\x0fpppppppppppppppppppppppppppppppppppppppppppppppppp' +'"#""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""' +'""""""""""""""""""""""""""""""""""""#"""""""""""""""""""""""""""' +'""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""' +'""""""""""""""""""""""""""""""""""#"""""""""""""""""""""""""""""' +'"""""""""""""""""""""""""""""""""#""""""""""""""""""""""""""""""' +'""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""' +'""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""' +'""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""' +'""""""""""""""""""""""""""""""""""""""""""#"""""""""""""""""""""' +'""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""' +'"""#""""""""#"""""""""""""""#"""""""""""""""""""""""""""""""""""' +'""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""' +'""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""' +'""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""' +'""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""' +'""""""""""""""""""""""""""""""""""""""""""#""""""""""""""""""#""' +'"""""""""""""""""""""""""#""""""""""""""""""""""""""""""""""""""' +'""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""' +'""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""' +'""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""' +'""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""' +'""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""' +'""""""""""""""""#"""""""""""""""""""""""""""""""""""""""""""""""' +'""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""' +'""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""' +'""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""' +'""""""""""""""""""""""""#"""""""""""""""""""""""""""""""""""""""' +'""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""' +'"""""""""""""""""""""""""""#""""""""""""""""""""""""""""""""""""' +'""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""' +'""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""' +'""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""' +'""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""' +'"""""""""""""""""""""""""""""""""""""""""""""#""""""""""""""""""' +'""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""' +'""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""' '""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""' '""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""' '""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""' @@ -18385,10 +18506,10 @@ '\x06\x06\x06\x06\x06\x06\x06\x06\x06\x06\x06\x06\x06\x06\x06\x06\x06\x06\x06\x06\x06\x06\x06\x06\x06\x06\x06\x06\x06\x06\x06\x06\x06\x06\x06\x06\x06\x06\x06\x06\x06\x06\x06\x06\x06\x06\x06\x06\x06\x06\x06\x06\x06\x06\x06\x06\x06\x06\x06\x06\x06\x06\x06\x06' '\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f' '\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f' -'0000000000000000000000000000000000000000000000000000000000000000' -'0000000000000000000000000000000000000000000000000000000000000000' -'0000000000000000000000000000000000000000000000000000000000000000' -'000000000000000000000000000000000000000000000000\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f' +'1111111111111111111111111111111111111111111111111111111111111111' +'1111111111111111111111111111111111111111111111111111111111111111' +'1111111111111111111111111111111111111111111111111111111111111111' +'111111111111111111111111111111111111111111111111\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f' '\x11\x11\x11\x11\x11\x11\x11\x11\x11\x11\x11\x11\x11\x11\x11\x11\x11\x11\x11\x11\x11\x11\x11\x11\x11\x11\x11\x11\x11\x11\x11\x11\x11\x11\x11\x11\x11\x11\x11\x11\x11\x11\x11\x11\x11\x11\x11\x11\x11\x11\x11\x11\x11\x11\x11\x11\x11\x11\x11\x11\x11\x11\x11\x11' '\x11\x11\x11\x11\x11\x11\x11\x11\x11\x11\x11\x11\x11\x11\x11\x11\x11\x11\x11\x11\x11\x11\x11\x11\x11\x11\x11\x11\x11\x11\x11\x11\x11\x11\x11\x11\x11\x11\x11\x11\x11\x11\x11\x11\x11\x11\x11\x11\x11\x11\x11\x11\x11\x11\x11\x11\x11\x11\x11\x11\x11\x11\x11\x11' '\x11\x11\x11\x11\x11\x11\x11\x11\x11\x11\x11\x11\x11\x11\x11\x11\x11\x11\x11\x11\x11\x11\x11\x11\x11\x11\x11\x11\x11\x11\x11\x11\x11\x11\x11\x11\x11\x11\x11\x11\x11\x11\x11\x11\x11\x11\x11\x11\x11\x11\x11\x11\x11\x11\x11\x11\x11\x11\x11\x11\x11\x11\x11\x11' From mwh at codespeak.net Wed Oct 4 13:30:51 2006 From: mwh at codespeak.net (mwh at codespeak.net) Date: Wed, 4 Oct 2006 13:30:51 +0200 (CEST) Subject: [pypy-svn] r32865 - in pypy/dist/pypy/rpython/memory/gctransform2: . test Message-ID: <20061004113051.6988A10089@code0.codespeak.net> Author: mwh Date: Wed Oct 4 13:30:50 2006 New Revision: 32865 Modified: pypy/dist/pypy/rpython/memory/gctransform2/test/test_transform.py pypy/dist/pypy/rpython/memory/gctransform2/transform.py Log: transform setfield into bare_setfield Modified: pypy/dist/pypy/rpython/memory/gctransform2/test/test_transform.py ============================================================================== --- pypy/dist/pypy/rpython/memory/gctransform2/test/test_transform.py (original) +++ pypy/dist/pypy/rpython/memory/gctransform2/test/test_transform.py Wed Oct 4 13:30:50 2006 @@ -190,7 +190,7 @@ for op in b.operations: if op.opname == 'bare_getfield' and var_ispyobj(op.result): pyobj_getfields += 1 - elif op.opname == 'setfield' and var_ispyobj(op.args[2]): + elif op.opname == 'bare_setfield' and var_ispyobj(op.args[2]): pyobj_setfields += 1 # although there's only one explicit getfield in the code, a # setfield on a pyobj must get the old value out and decref it Modified: pypy/dist/pypy/rpython/memory/gctransform2/transform.py ============================================================================== --- pypy/dist/pypy/rpython/memory/gctransform2/transform.py (original) +++ pypy/dist/pypy/rpython/memory/gctransform2/transform.py Wed Oct 4 13:30:50 2006 @@ -258,12 +258,13 @@ self.finish_tables() def transform_generic_set(self, hop): + opname = hop.spaceop.opname v_new = hop.spaceop.args[-1] - v_old = hop.genop('bare_g' + hop.spaceop.opname[1:], + v_old = hop.genop('bare_g' + opname[1:], hop.inputargs()[:-1], resulttype=v_new.concretetype) self.push_alive(v_new) - hop.llops.append(hop.spaceop) + hop.rename('bare_' + opname) self.pop_alive(v_old) From auc at codespeak.net Wed Oct 4 13:40:51 2006 From: auc at codespeak.net (auc at codespeak.net) Date: Wed, 4 Oct 2006 13:40:51 +0200 (CEST) Subject: [pypy-svn] r32866 - in pypy/dist/pypy/objspace/cclp: . constraint Message-ID: <20061004114051.142701007F@code0.codespeak.net> Author: auc Date: Wed Oct 4 13:40:48 2006 New Revision: 32866 Modified: pypy/dist/pypy/objspace/cclp/constraint/distributor.py pypy/dist/pypy/objspace/cclp/space.py pypy/dist/pypy/objspace/cclp/thunk.py Log: translatable again Modified: pypy/dist/pypy/objspace/cclp/constraint/distributor.py ============================================================================== --- pypy/dist/pypy/objspace/cclp/constraint/distributor.py (original) +++ pypy/dist/pypy/objspace/cclp/constraint/distributor.py Wed Oct 4 13:40:48 2006 @@ -27,17 +27,10 @@ dist = cspace.distributor # constraint distributor thread main loop - try: - while dist.distributable(): - choice = cspace.choose(dist.fanout()) - dist.w_distribute(choice) - except ConsistencyError, e: - w("-- DISTRIBUTOR thunk exited because", str(e)) - cspace.fail() - except Exception, eek: - if not we_are_translated(): - import traceback - traceback.print_exc() + while dist.distributable(): + choice = cspace.choose(dist.fanout()) + dist.w_distribute(choice) + app_distribute = interp2app(distribute) Modified: pypy/dist/pypy/objspace/cclp/space.py ============================================================================== --- pypy/dist/pypy/objspace/cclp/space.py (original) +++ pypy/dist/pypy/objspace/cclp/space.py Wed Oct 4 13:40:48 2006 @@ -3,6 +3,7 @@ from pypy.interpreter.error import OperationError from pypy.objspace.std.intobject import W_IntObject +from pypy.objspace.std.listobject import W_ListObject, W_TupleObject from pypy.objspace.cclp.misc import ClonableCoroutine, get_current_cspace, w from pypy.objspace.cclp.thunk import CSpaceThunk, PropagatorThunk @@ -85,8 +86,6 @@ self._store = {} # name -> var if not we_are_translated(): self._constraints = [] - self._choose_count = 0 - self._commit_count = 0 def register_var(self, cvar): self._store[cvar.name] = cvar @@ -148,14 +147,9 @@ return committed def w_commit(self, w_n): - self._commit_count += 1 - #scheduler[0].wait_stable(self) - self._commit_count += 1 assert isinstance(w_n, W_IntObject) n = w_n.intval - if not interp_free(self._committed): - import pdb - pdb.set_trace() + assert interp_free(self._committed) assert n > 0 assert n <= self._last_choice interp_bind(self._committed, w_n) @@ -182,13 +176,10 @@ self._store = {} # let's bind the solution variables sol = self._solution.w_bound_to - if contains_cvar(sol.wrappeditems): - for var in sol.wrappeditems: - assert isinstance(var, W_CVar) - dom = var.w_dom - assert isinstance(dom, W_AbstractDomain) - assert dom.size() == 1 - interp_bind(var, dom.get_values()[0]) + if isinstance(sol, W_ListObject): + bind_solution_variables(sol.wrappeditems) + elif isinstance(sol, W_TupleObject): + bind_solution_variables(sol.wrappeditems) return self._solution def __ne__(self, other): @@ -197,6 +188,16 @@ return True +def bind_solution_variables(solution): + if contains_cvar(solution): # was a constraint script + for var in solution: + assert isinstance(var, W_CVar) + dom = var.w_dom + assert isinstance(dom, W_AbstractDomain) + assert dom.size() == 1 + interp_bind(var, dom.get_values()[0]) + + def contains_cvar(lst): for elt in lst: if isinstance(elt, W_CVar): Modified: pypy/dist/pypy/objspace/cclp/thunk.py ============================================================================== --- pypy/dist/pypy/objspace/cclp/thunk.py (original) +++ pypy/dist/pypy/objspace/cclp/thunk.py Wed Oct 4 13:40:48 2006 @@ -40,7 +40,6 @@ except Exception, exc: w(".! exceptional EXIT of procedure", str(id(self._coro)), "with", str(exc)) scheduler[0].dirty_traced_vars(self._coro, W_FailedValue(exc)) - self._coro._dead = True else: w(".! clean EXIT of procedure", str(id(self._coro))) finally: @@ -65,7 +64,6 @@ failed_val = W_FailedValue(exc) self.space.bind(self.w_Result, failed_val) scheduler[0].dirty_traced_vars(self._coro, failed_val) - self._coro._dead = True else: w(".! clean EXIT of future", str(id(self._coro)), "-- setting future result", str(self.w_Result), "to", @@ -92,29 +90,24 @@ _AppThunk.call(self) except Exception, exc: # maybe app_level let something buble up ... - w("-- exceptional EXIT of cspace DISTRIBUTOR", str(id(self._coro)), "with", str(exc)) + w("-- exceptional EXIT of DISTRIBUTOR", str(id(self._coro)), "with", str(exc)) failed_value = W_FailedValue(exc) scheduler[0].dirty_traced_vars(self._coro, failed_value) interp_bind(cspace._solution, failed_value) cspace.fail() else: w("-- clean EXIT of DISTRIBUTOR (success)", str(id(self._coro))) - try: - sol = cspace._solution - assert isinstance(sol, W_Var) - interp_bind(sol, self.costate.w_tempval) - outcome = sol.w_bound_to - if not (isinstance(outcome, W_ListObject) or \ - isinstance(outcome, W_TupleObject)): - w("WARINING: return value type of the script was not a list or tuple, we do nothing ...") - return - assert interp_free(cspace._choice) - interp_bind(cspace._choice, self.space.newint(1)) - except Exception, foo: - print "WE DIED BECAUSE", str(foo) - import pdb - pdb.set_trace() - + sol = cspace._solution + assert isinstance(sol, W_Var) + interp_bind(sol, self.costate.w_tempval) + outcome = sol.w_bound_to + if not (isinstance(outcome, W_ListObject) or \ + isinstance(outcome, W_TupleObject)): + w("WARNING: return value type of the script was not a list or tuple, we fail ...") + cspace.fail() + return + assert interp_free(cspace._choice) + interp_bind(cspace._choice, self.space.newint(1)) finally: interp_bind(cspace._finished, self.space.w_True) scheduler[0].remove_thread(self._coro) @@ -156,7 +149,6 @@ import traceback traceback.print_exc() finally: - self.coro._dead = True scheduler[0].remove_thread(self.coro) scheduler[0].schedule() From antocuni at codespeak.net Wed Oct 4 13:43:31 2006 From: antocuni at codespeak.net (antocuni at codespeak.net) Date: Wed, 4 Oct 2006 13:43:31 +0200 (CEST) Subject: [pypy-svn] r32867 - pypy/dist/pypy/translator/cli Message-ID: <20061004114331.B07781008D@code0.codespeak.net> Author: antocuni Date: Wed Oct 4 13:43:30 2006 New Revision: 32867 Modified: pypy/dist/pypy/translator/cli/ilgenerator.py Log: svn-commit.tmp Modified: pypy/dist/pypy/translator/cli/ilgenerator.py ============================================================================== --- pypy/dist/pypy/translator/cli/ilgenerator.py (original) +++ pypy/dist/pypy/translator/cli/ilgenerator.py Wed Oct 4 13:43:30 2006 @@ -55,6 +55,12 @@ def end_namespace(self): self.code.closeblock() + def write(self, s, indent=0): + self.code.write(s, indent) + + def writeline(self, s=''): + self.code.writeline(s) + def begin_class(self, name, base=None, sealed=False, interfaces=(), abstract=False, beforefieldinit=False, serializable=True): if base is None: @@ -87,7 +93,6 @@ def begin_function(self, name, arglist, returntype, is_entrypoint = False, *args, **kwds): # TODO: .maxstack - runtime = kwds.get('runtime', False) if runtime: method_type = 'runtime' @@ -106,6 +111,7 @@ and method_type!='runtime') def end_function(self): + self.render() self.code.closeblock() def begin_try(self): @@ -113,6 +119,7 @@ self.code.openblock() def end_try(self): + self.render() self.code.closeblock() def begin_catch(self, type_): @@ -120,50 +127,51 @@ self.code.openblock() def end_catch(self): + self.render() self.code.closeblock() def locals(self, vars): varlist = ', '.join(['%s %s' % var for var in vars]) - self.code.write('.locals init (') - self.code.write(varlist) - self.code.writeline(')') + self.write('.locals init (') + self.write(varlist) + self.writeline(')') def label(self, lbl): - self.code.writeline() - self.code.write(lbl + ':', indent=-1) - self.code.writeline() + self.writeline() + self.write(lbl + ':', indent=-1) + self.writeline() def leave(self, lbl): - self.code.writeline('leave ' + lbl) + self.opcode('leave', lbl) def branch(self, lbl): - self.code.writeline('br ' + lbl) + self.opcode('br', lbl) def branch_if(self, cond, lbl): if cond: - opcode = 'brtrue ' + opcode = 'brtrue' else: - opcode = 'brfalse ' + opcode = 'brfalse' - self.code.writeline(opcode + lbl) + self.opcode(opcode, lbl) def call(self, func): - self.code.writeline('call ' + func) + self.opcode('call ', func) def call_method(self, meth, virtual): if virtual: - self.code.writeline('callvirt instance ' + meth) + self.opcode('callvirt instance', meth) else: - self.code.writeline('call instance ' + meth) + self.opcode('call instance', meth) def new(self, class_): - self.code.writeline('newobj ' + class_) + self.opcode('newobj', class_) def set_field(self, field_data ): - self.opcode('stfld %s %s::%s' % field_data ) + self.opcode('stfld', '%s %s::%s' % field_data ) def get_field(self, field_data): - self.opcode('ldfld %s %s::%s' % field_data ) + self.opcode('ldfld', '%s %s::%s' % field_data ) def throw(self): self.opcode('throw') @@ -198,22 +206,22 @@ elif type_ in (SignedLongLong, UnsignedLongLong): self.opcode('ldc.i8', str(v)) - def store_local ( self , v ): + def store_local (self, v): self.opcode('stloc', repr(v.name)) def store_static_constant(self, cts_type, CONST_NAMESPACE, CONST_CLASS, name): - self.opcode('stsfld %s %s.%s::%s' % (cts_type, CONST_NAMESPACE, CONST_CLASS, name)) + self.opcode('stsfld', '%s %s.%s::%s' % (cts_type, CONST_NAMESPACE, CONST_CLASS, name)) def load_static_constant(self, cts_type, CONST_NAMESPACE, CONST_CLASS, name): - self.opcode('ldsfld %s %s.%s::%s' % (cts_type, CONST_NAMESPACE, CONST_CLASS, name)) + self.opcode('ldsfld', '%s %s.%s::%s' % (cts_type, CONST_NAMESPACE, CONST_CLASS, name)) def load_static_field(self, cts_type, name): - self.opcode('ldsfld %s %s' % (cts_type, name)) + self.opcode('ldsfld', '%s %s' % (cts_type, name)) - def emit ( self , opcode , *args ): - self.opcode ( opcode , *args ) + def emit(self, opcode, *args): + self.opcode(opcode,*args) - def begin_link ( self ): + def begin_link(self): pass def opcode(self, opcode, *args): @@ -226,3 +234,6 @@ self.call('class [mscorlib]System.IO.TextWriter class [mscorlib]System.Console::get_Error()') self.opcode('ldstr', string_literal(msg)) self.call_method('void class [mscorlib]System.IO.TextWriter::WriteLine(string)', virtual=True) + + def render(self): + pass From auc at codespeak.net Wed Oct 4 14:54:07 2006 From: auc at codespeak.net (auc at codespeak.net) Date: Wed, 4 Oct 2006 14:54:07 +0200 (CEST) Subject: [pypy-svn] r32869 - pypy/dist/pypy/objspace/test Message-ID: <20061004125407.6EE2E100A2@code0.codespeak.net> Author: auc Date: Wed Oct 4 14:54:04 2006 New Revision: 32869 Added: pypy/dist/pypy/objspace/test/_test_logic_build.py (contents, props changed) Log: something to help pass the tests for pypy-logic builds Added: pypy/dist/pypy/objspace/test/_test_logic_build.py ============================================================================== --- (empty file) +++ pypy/dist/pypy/objspace/test/_test_logic_build.py Wed Oct 4 14:54:04 2006 @@ -0,0 +1,63 @@ +import test_logicobjspace as tlo +import inspect + +def raises(exception, call, *args): + try: + call(*args) + except exception: + return True + except: + pass + return False + + +class Skip(Exception): pass + +def skip(desc): + print "skipping because", desc + raise Skip + +tlo.raises = raises +tlo.skip = skip + + +classes = [tlo.AppTest_Logic, + tlo.AppTest_LogicFutures, + tlo.AppTest_CompSpace] + + +def run_tests(): + successes = [] + failures = [] + skipped = [] + + + for klass in classes: + tests = [(name, meth) for name, meth in inspect.getmembers(klass()) + if not name.startswith('_')] + for name, meth in tests: + if name == 'setup_class': continue + try: + meth() + except Skip: + skipped.append(name) + except Exception, e: + failures.append((name, e)) + else: + successes.append(name) + + if len(successes): + print "Successes :" + print '', '\n '.join(successes) + print + if failures: + print "Failures :" + for name, exc in failures: + print '', name, "failed because", str(exc) + print + if skipped: + print "Skipped" + print '', '\n '.join(skipped) + +if __name__ == '__main__': + run_tests() From antocuni at codespeak.net Wed Oct 4 14:58:21 2006 From: antocuni at codespeak.net (antocuni at codespeak.net) Date: Wed, 4 Oct 2006 14:58:21 +0200 (CEST) Subject: [pypy-svn] r32870 - in pypy/dist/pypy/translator/cli: . test Message-ID: <20061004125821.D5ADF100AC@code0.codespeak.net> Author: antocuni Date: Wed Oct 4 14:58:20 2006 New Revision: 32870 Added: pypy/dist/pypy/translator/cli/stackopt.py (contents, props changed) pypy/dist/pypy/translator/cli/test/test_stackopt.py (contents, props changed) Modified: pypy/dist/pypy/translator/cli/function.py pypy/dist/pypy/translator/cli/gencli.py pypy/dist/pypy/translator/cli/ilgenerator.py pypy/dist/pypy/translator/cli/test/compile.py Log: A trivial implementation of the StackOptimizer: it simply optimizes nothing so far :-) Modified: pypy/dist/pypy/translator/cli/function.py ============================================================================== --- pypy/dist/pypy/translator/cli/function.py (original) +++ pypy/dist/pypy/translator/cli/function.py Wed Oct 4 14:58:20 2006 @@ -306,11 +306,11 @@ if v.name in self.argset: selftype, selfname = self.args[0] if self.is_method and v.name == selfname: - self.ilasm.opcode('ldarg.0') # special case for 'self' + self.ilasm.load_self() # special case for 'self' else: - self.ilasm.opcode('ldarg', repr(v.name)) + self.ilasm.load_arg(v) else: - self.ilasm.opcode('ldloc', repr(v.name)) + self.ilasm.load_local(v) elif isinstance(v, flowmodel.Constant): self._load_const(v) @@ -324,7 +324,7 @@ def store(self, v): if isinstance(v, flowmodel.Variable): if v.concretetype is not Void: - self.ilasm.opcode('stloc', repr(v.name)) + self.ilasm.store_local(v) else: assert False Modified: pypy/dist/pypy/translator/cli/gencli.py ============================================================================== --- pypy/dist/pypy/translator/cli/gencli.py (original) +++ pypy/dist/pypy/translator/cli/gencli.py Wed Oct 4 14:58:20 2006 @@ -14,6 +14,9 @@ from pypy.translator.cli.rte import get_pypy_dll from pypy.translator.cli.support import Tee from pypy.translator.cli.prebuiltnodes import get_prebuilt_nodes +from pypy.translator.cli.stackopt import StackOptGenerator + +USE_STACKOPT = True class GenCli(object): def __init__(self, tmpdir, translator, entrypoint=None, type_system_class=CTS, @@ -42,8 +45,11 @@ if getoption('stdout'): out = Tee(sys.stdout, out) - self.ilasm = asm_class(out, self.assembly_name ) - + if USE_STACKOPT: + self.ilasm = StackOptGenerator(out, self.assembly_name) + else: + self.ilasm = asm_class(out, self.assembly_name) + # TODO: instance methods that are also called as unbound # methods are rendered twice, once within the class and once # as an external function. Fix this. Modified: pypy/dist/pypy/translator/cli/ilgenerator.py ============================================================================== --- pypy/dist/pypy/translator/cli/ilgenerator.py (original) +++ pypy/dist/pypy/translator/cli/ilgenerator.py Wed Oct 4 14:58:20 2006 @@ -111,7 +111,7 @@ and method_type!='runtime') def end_function(self): - self.render() + self.flush() self.code.closeblock() def begin_try(self): @@ -119,7 +119,7 @@ self.code.openblock() def end_try(self): - self.render() + self.flush() self.code.closeblock() def begin_catch(self, type_): @@ -127,7 +127,7 @@ self.code.openblock() def end_catch(self): - self.render() + self.flush() self.code.closeblock() def locals(self, vars): @@ -235,5 +235,5 @@ self.opcode('ldstr', string_literal(msg)) self.call_method('void class [mscorlib]System.IO.TextWriter::WriteLine(string)', virtual=True) - def render(self): + def flush(self): pass Added: pypy/dist/pypy/translator/cli/stackopt.py ============================================================================== --- (empty file) +++ pypy/dist/pypy/translator/cli/stackopt.py Wed Oct 4 14:58:20 2006 @@ -0,0 +1,55 @@ +from pypy.translator.cli.ilgenerator import IlasmGenerator + +class StackOptMixin(object): + def __init__(self, *args): + self.super = super(StackOptMixin, self) + self.super.__init__(*args) + self._reset() + + def _reset(self): + self.pending_ops = [] + + def opcode(self, op, *args): + self.pending_ops.append((op, args)) + + def writeline(self, s=''): + self.pending_ops.append(('WRITELINE', (s,))) + + def write(self, s, indent=0): + self.pending_ops.append(('WRITE', (s, indent))) + + def _optimize(self): + pass + + def do_load(self, vartype, var): + if vartype == 'local': + self.super.load_local(var) + elif vartype == 'arg': + self.super.load_arg(var) + elif vartype == 'self': + assert var is None + self.super.load_self() + else: + assert False + + def do_store(self, vartype, var): + assert vartype == 'local' + self.super.store_local(var) + + def do_opcode(self, opcode, *args): + self.super.opcode(opcode, *args) + + def flush(self): + self._optimize() + for opcode, args in self.pending_ops: + if opcode == 'WRITELINE': + self.super.writeline(*args) + elif opcode == 'WRITE': + self.super.write(*args) + else: + self.super.opcode(opcode, *args) + self._reset() + +class StackOptGenerator(StackOptMixin, IlasmGenerator): + pass + Modified: pypy/dist/pypy/translator/cli/test/compile.py ============================================================================== --- pypy/dist/pypy/translator/cli/test/compile.py (original) +++ pypy/dist/pypy/translator/cli/test/compile.py Wed Oct 4 14:58:20 2006 @@ -28,16 +28,13 @@ def __init__(self, x): self.x = x -def foo(a, b): - pass +def foo(a, b, c): + return c,b,a mylist = [1,2,3] def bar(x, y): - if x: - return mylist - else: - return [] + return foo(x+y, x-y, x*y) f = compile_function(bar, [int, int]) Added: pypy/dist/pypy/translator/cli/test/test_stackopt.py ============================================================================== --- (empty file) +++ pypy/dist/pypy/translator/cli/test/test_stackopt.py Wed Oct 4 14:58:20 2006 @@ -0,0 +1,50 @@ +from pypy.translator.cli.stackopt import StackOptMixin + +class FakeGenerator(object): + def __init__(self, *args): + self.lines = [''] + self.opcodes = [] + + def opcode(self, opcode, *args): + self.opcodes.append((opcode, args)) + self.lines[-1] += '%s %s' % (opcode, ' '.join(args)) + self.lines.append('') + + def write(self, s, index=0): + self.lines[-1] += s + + def writeline(self, s=''): + self.lines[-1] += s + self.lines.append('') + + def get_string(self): + return '\n'.join(self.lines[:-1]) + +class TestStackOpt(StackOptMixin, FakeGenerator): + pass + + +def test_code_generation(): + ilasm = TestStackOpt() + ilasm.write('.method public static void foo()') + ilasm.writeline(' {') + ilasm.opcode('ldc.i4.0') + ilasm.opcode('pop') + ilasm.opcode('ret') + ilasm.writeline('}') + ilasm.flush() + s = ilasm.get_string() + assert s.strip() == """ +.method public static void foo() { +ldc.i4.0 +pop +ret +} +""".strip() + +def test_opcodes(): + ilasm = TestStackOpt() + ilasm.opcode('ldloc', 'x') + ilasm.opcode('ldloc', 'y') + ilasm.flush() + assert ilasm.opcodes == [('ldloc', ('x',)), ('ldloc', ('y',))] From auc at codespeak.net Wed Oct 4 15:31:00 2006 From: auc at codespeak.net (auc at codespeak.net) Date: Wed, 4 Oct 2006 15:31:00 +0200 (CEST) Subject: [pypy-svn] r32871 - pypy/dist/pypy/objspace/test Message-ID: <20061004133100.BFC7D100AC@code0.codespeak.net> Author: auc Date: Wed Oct 4 15:30:53 2006 New Revision: 32871 Modified: pypy/dist/pypy/objspace/test/_test_logic_build.py Log: a more generic tester Modified: pypy/dist/pypy/objspace/test/_test_logic_build.py ============================================================================== --- pypy/dist/pypy/objspace/test/_test_logic_build.py (original) +++ pypy/dist/pypy/objspace/test/_test_logic_build.py Wed Oct 4 15:30:53 2006 @@ -1,4 +1,3 @@ -import test_logicobjspace as tlo import inspect def raises(exception, call, *args): @@ -10,23 +9,19 @@ pass return False - class Skip(Exception): pass def skip(desc): print "skipping because", desc raise Skip -tlo.raises = raises -tlo.skip = skip - - -classes = [tlo.AppTest_Logic, - tlo.AppTest_LogicFutures, - tlo.AppTest_CompSpace] +def run_tests(tm): + classes = [obj for name, obj in inspect.getmembers(tm) + if isinstance(obj, type)] + tm.raises = raises + tm.skip = skip -def run_tests(): successes = [] failures = [] skipped = [] @@ -46,7 +41,7 @@ else: successes.append(name) - if len(successes): + if successes: print "Successes :" print '', '\n '.join(successes) print @@ -59,5 +54,7 @@ print "Skipped" print '', '\n '.join(skipped) -if __name__ == '__main__': - run_tests() +if __name__ == __name__: + import sys + tm = __import__(sys.argv[1]) + run_tests(tm) From fijal at codespeak.net Wed Oct 4 15:52:00 2006 From: fijal at codespeak.net (fijal at codespeak.net) Date: Wed, 4 Oct 2006 15:52:00 +0200 (CEST) Subject: [pypy-svn] r32875 - pypy/dist/pypy/annotation Message-ID: <20061004135200.852E51009A@code0.codespeak.net> Author: fijal Date: Wed Oct 4 15:51:45 2006 New Revision: 32875 Modified: pypy/dist/pypy/annotation/bookkeeper.py Log: Killed annotation_from_example. I hope not to break something this time. Modified: pypy/dist/pypy/annotation/bookkeeper.py ============================================================================== --- pypy/dist/pypy/annotation/bookkeeper.py (original) +++ pypy/dist/pypy/annotation/bookkeeper.py Wed Oct 4 15:51:45 2006 @@ -294,10 +294,10 @@ def immutableconstant(self, const): return self.immutablevalue(const.value) - def immutablevalue(self, x): + def immutablevalue(self, x, need_const=True): """The most precise SomeValue instance that contains the immutable value x.""" - # convert unbound methods to the underlying function + # convert unbound methods to the underlying function if hasattr(x, 'im_self') and x.im_self is None: x = x.im_func assert not hasattr(x, 'im_self') @@ -320,48 +320,68 @@ elif tp is unicode and len(x) == 1: result = SomeUnicodeCodePoint() elif tp is tuple: - result = SomeTuple(items = [self.immutablevalue(e) for e in x]) + result = SomeTuple(items = [self.immutablevalue(e, need_const) for e in x]) elif tp is float: result = SomeFloat() elif tp is list: - key = Constant(x) - try: - return self.immutable_cache[key] - except KeyError: - result = SomeList(ListDef(self, s_ImpossibleValue)) - self.immutable_cache[key] = result + if need_const: + key = Constant(x) + try: + return self.immutable_cache[key] + except KeyError: + result = SomeList(ListDef(self, s_ImpossibleValue)) + self.immutable_cache[key] = result + for e in x: + result.listdef.generalize(self.immutablevalue(e)) + result.const_box = key + return result + else: + listdef = ListDef(self, s_ImpossibleValue) for e in x: - result.listdef.generalize(self.immutablevalue(e)) - result.const_box = key - return result + listdef.generalize(self.annotation_from_example(e)) + result = SomeList(listdef) elif tp is dict or tp is r_dict: - key = Constant(x) - try: - return self.immutable_cache[key] - except KeyError: - result = SomeDict(DictDef(self, - s_ImpossibleValue, - s_ImpossibleValue, - is_r_dict = tp is r_dict)) - self.immutable_cache[key] = result + if need_const: + key = Constant(x) + try: + return self.immutable_cache[key] + except KeyError: + result = SomeDict(DictDef(self, + s_ImpossibleValue, + s_ImpossibleValue, + is_r_dict = tp is r_dict)) + self.immutable_cache[key] = result + if tp is r_dict: + s_eqfn = self.immutablevalue(x.key_eq) + s_hashfn = self.immutablevalue(x.key_hash) + result.dictdef.dictkey.update_rdict_annotations(s_eqfn, + s_hashfn) + done = False + while not done: + try: + for ek, ev in x.iteritems(): + result.dictdef.generalize_key(self.immutablevalue(ek)) + result.dictdef.generalize_value(self.immutablevalue(ev)) + except RuntimeError, r: + pass + else: + done = True + result.const_box = key + return result + else: + dictdef = DictDef(self, + s_ImpossibleValue, + s_ImpossibleValue, + is_r_dict = tp is r_dict) if tp is r_dict: s_eqfn = self.immutablevalue(x.key_eq) s_hashfn = self.immutablevalue(x.key_hash) - result.dictdef.dictkey.update_rdict_annotations(s_eqfn, - s_hashfn) - done = False - while not done: - try: - for ek, ev in x.iteritems(): - result.dictdef.generalize_key(self.immutablevalue(ek)) - result.dictdef.generalize_value(self.immutablevalue(ev)) - except RuntimeError, r: - pass - else: - done = True - result.const_box = key - return result - + dictdef.dictkey.update_rdict_annotations(s_eqfn, + s_hashfn) + for ek, ev in x.iteritems(): + dictdef.generalize_key(self.annotation_from_example(ek)) + dictdef.generalize_value(self.annotation_from_example(ev)) + result = SomeDict(dictdef) elif ishashable(x) and x in BUILTIN_ANALYZERS: _module = getattr(x,"__module__","unknown") result = SomeBuiltin(BUILTIN_ANALYZERS[x], methodname="%s.%s" % (_module, x.__name__)) @@ -389,14 +409,14 @@ elif callable(x): if hasattr(x, '__self__') and x.__self__ is not None: # for cases like 'l.append' where 'l' is a global constant list - s_self = self.immutablevalue(x.__self__) + s_self = self.immutablevalue(x.__self__, need_const) result = s_self.find_method(x.__name__) if result is None: result = SomeObject() elif hasattr(x, 'im_self') and hasattr(x, 'im_func'): # on top of PyPy, for cases like 'l.append' where 'l' is a # global constant list, the find_method() returns non-None - s_self = self.immutablevalue(x.im_self) + s_self = self.immutablevalue(x.im_self, need_const) result = s_self.find_method(x.im_func.__name__) else: result = None @@ -423,112 +443,117 @@ return s_None else: result = SomeObject() - result.const = x + if need_const: + result.const = x return result def annotation_from_example(self, x): - """The most precise SomeValue instance that contains the - mutable value x.""" - # convert unbound methods to the underlying function - if hasattr(x, 'im_self') and x.im_self is None: - x = x.im_func - assert not hasattr(x, 'im_self') - if x is sys: # special case constant sys to someobject - return SomeObject() - tp = type(x) - if issubclass(tp, Symbolic): # symbolic constants support - result = x.annotation() - return result - if tp is bool: - result = SomeBool() - elif tp is int: - result = SomeInteger(nonneg = x>=0) - elif issubclass(tp, str): # py.lib uses annotated str subclasses - if len(x) == 1: - result = SomeChar() - else: - result = SomeString() - elif tp is unicode and len(x) == 1: - result = SomeUnicodeCodePoint() - elif tp is tuple: - result = SomeTuple(items = [self.annotation_from_example(e) for e in x]) - elif tp is float: - result = SomeFloat() - elif tp is list: - listdef = ListDef(self, s_ImpossibleValue) - for e in x: - listdef.generalize(self.annotation_from_example(e)) - result = SomeList(listdef) - elif tp is dict or tp is r_dict: - dictdef = DictDef(self, - s_ImpossibleValue, - s_ImpossibleValue, - is_r_dict = tp is r_dict) - if tp is r_dict: - s_eqfn = self.immutablevalue(x.key_eq) - s_hashfn = self.immutablevalue(x.key_hash) - dictdef.dictkey.update_rdict_annotations(s_eqfn, - s_hashfn) - for ek, ev in x.iteritems(): - dictdef.generalize_key(self.annotation_from_example(ek)) - dictdef.generalize_value(self.annotation_from_example(ev)) - result = SomeDict(dictdef) - elif ishashable(x) and x in BUILTIN_ANALYZERS: - _module = getattr(x,"__module__","unknown") - result = SomeBuiltin(BUILTIN_ANALYZERS[x], methodname="%s.%s" % (_module, x.__name__)) - elif extregistry.is_registered(x, self.policy): - entry = extregistry.lookup(x, self.policy) - result = entry.compute_annotation_bk(self) -## elif hasattr(x, "compute_result_annotation"): -## result = SomeBuiltin(x.compute_result_annotation, methodname=x.__name__) -## elif hasattr(tp, "compute_annotation"): -## result = tp.compute_annotation() - elif tp in EXTERNAL_TYPE_ANALYZERS: - result = SomeExternalObject(tp) - elif isinstance(x, lltype._ptr): - result = SomePtr(lltype.typeOf(x)) - elif isinstance(x, llmemory.fakeaddress): - result = SomeAddress(is_null=not x) - elif isinstance(x, llmemory.fakeweakaddress): - result = SomeWeakGcAddress() - elif isinstance(x, ootype._static_meth): - result = SomeOOStaticMeth(ootype.typeOf(x)) - elif isinstance(x, ootype._class): - result = SomeOOClass(x._INSTANCE) # NB. can be None - elif isinstance(x, ootype.instance_impl): # XXX - result = SomeOOInstance(ootype.typeOf(x)) - elif callable(x): - if hasattr(x, '__self__') and x.__self__ is not None: - # for cases like 'l.append' where 'l' is a global constant list - s_self = self.annotation_from_example(x.__self__) - result = s_self.find_method(x.__name__) - if result is None: - result = SomeObject() - else: - if (self.annotator.policy.allow_someobjects - and getattr(x, '__module__', None) == '__builtin__' - # XXX note that the print support functions are __builtin__ - and tp not in (types.FunctionType, types.MethodType)): - result = SomeObject() - result.knowntype = tp # at least for types this needs to be correct - else: - result = SomePBC([self.getdesc(x)]) - elif hasattr(x, '_freeze_') and x._freeze_(): - # user-defined classes can define a method _freeze_(), which - # is called when a prebuilt instance is found. If the method - # returns True, the instance is considered immutable and becomes - # a SomePBC(). Otherwise it's just SomeInstance(). - result = SomePBC([self.getdesc(x)]) - elif hasattr(x, '__class__') \ - and x.__class__.__module__ != '__builtin__': - self.see_mutable(x) - result = SomeInstance(self.getuniqueclassdef(x.__class__)) - elif x is None: - return s_None - else: - result = SomeObject() - return result + # XXX to kill at some point + return self.immutablevalue(x, False) +## def annotation_from_example(self, x): +## """The most precise SomeValue instance that contains the +## mutable value x.""" +## # convert unbound methods to the underlying function +## if hasattr(x, 'im_self') and x.im_self is None: +## x = x.im_func +## assert not hasattr(x, 'im_self') +## if x is sys: # special case constant sys to someobject +## return SomeObject() +## tp = type(x) +## if issubclass(tp, Symbolic): # symbolic constants support +## result = x.annotation() +## return result +## if tp is bool: +## result = SomeBool() +## elif tp is int: +## result = SomeInteger(nonneg = x>=0) +## elif issubclass(tp, str): # py.lib uses annotated str subclasses +## if len(x) == 1: +## result = SomeChar() +## else: +## result = SomeString() +## elif tp is unicode and len(x) == 1: +## result = SomeUnicodeCodePoint() +## elif tp is tuple: +## result = SomeTuple(items = [self.annotation_from_example(e) for e in x]) +## elif tp is float: +## result = SomeFloat() +## elif tp is list: +## listdef = ListDef(self, s_ImpossibleValue) +## for e in x: +## listdef.generalize(self.annotation_from_example(e)) +## result = SomeList(listdef) +## elif tp is dict or tp is r_dict: +## dictdef = DictDef(self, +## s_ImpossibleValue, +## s_ImpossibleValue, +## is_r_dict = tp is r_dict) +## if tp is r_dict: +## s_eqfn = self.immutablevalue(x.key_eq) +## s_hashfn = self.immutablevalue(x.key_hash) +## dictdef.dictkey.update_rdict_annotations(s_eqfn, +## s_hashfn) +## for ek, ev in x.iteritems(): +## dictdef.generalize_key(self.annotation_from_example(ek)) +## dictdef.generalize_value(self.annotation_from_example(ev)) +## result = SomeDict(dictdef) +## elif ishashable(x) and x in BUILTIN_ANALYZERS: +## _module = getattr(x,"__module__","unknown") +## result = SomeBuiltin(BUILTIN_ANALYZERS[x], methodname="%s.%s" % (_module, x.__name__)) +## elif extregistry.is_registered(x, self.policy): +## entry = extregistry.lookup(x, self.policy) +## result = entry.compute_annotation_bk(self) +#### elif hasattr(x, "compute_result_annotation"): +#### result = SomeBuiltin(x.compute_result_annotation, methodname=x.__name__) +#### elif hasattr(tp, "compute_annotation"): +#### result = tp.compute_annotation() +## elif tp in EXTERNAL_TYPE_ANALYZERS: +## result = SomeExternalObject(tp) +## elif isinstance(x, lltype._ptr): +## result = SomePtr(lltype.typeOf(x)) +## elif isinstance(x, llmemory.fakeaddress): +## result = SomeAddress(is_null=not x) +## elif isinstance(x, llmemory.fakeweakaddress): +## result = SomeWeakGcAddress() +## elif isinstance(x, ootype._static_meth): +## result = SomeOOStaticMeth(ootype.typeOf(x)) +## elif isinstance(x, ootype._class): +## result = SomeOOClass(x._INSTANCE) # NB. can be None +## elif isinstance(x, ootype.instance_impl): # XXX +## result = SomeOOInstance(ootype.typeOf(x)) +## elif callable(x): +## if hasattr(x, '__self__') and x.__self__ is not None: +## # for cases like 'l.append' where 'l' is a global constant list +## s_self = self.annotation_from_example(x.__self__) +## result = s_self.find_method(x.__name__) +## if result is None: +## result = SomeObject() +## else: +## if (self.annotator.policy.allow_someobjects +## and getattr(x, '__module__', None) == '__builtin__' +## # XXX note that the print support functions are __builtin__ +## and tp not in (types.FunctionType, types.MethodType)): +## result = SomeObject() +## result.knowntype = tp # at least for types this needs to be correct +## else: +## result = SomePBC([self.getdesc(x)]) +## elif hasattr(x, '_freeze_') and x._freeze_(): +## # user-defined classes can define a method _freeze_(), which +## # is called when a prebuilt instance is found. If the method +## # returns True, the instance is considered immutable and becomes +## # a SomePBC(). Otherwise it's just SomeInstance(). +## result = SomePBC([self.getdesc(x)]) +## elif hasattr(x, '__class__') \ +## and x.__class__.__module__ != '__builtin__': +## self.see_mutable(x) +## result = SomeInstance(self.getuniqueclassdef(x.__class__)) +## elif x is None: +## return s_None +## else: +## result = SomeObject() +## return result + def getdesc(self, pyobj): # get the XxxDesc wrapper for the given Python object, which must be # one of: From arigo at codespeak.net Wed Oct 4 16:29:10 2006 From: arigo at codespeak.net (arigo at codespeak.net) Date: Wed, 4 Oct 2006 16:29:10 +0200 (CEST) Subject: [pypy-svn] r32876 - in pypy/dist/pypy: bin tool Message-ID: <20061004142910.382B3100A5@code0.codespeak.net> Author: arigo Date: Wed Oct 4 16:29:08 2006 New Revision: 32876 Modified: pypy/dist/pypy/bin/jscompile.py pypy/dist/pypy/tool/option.py Log: Backward compatibility in the new option logic for simple cases. Also add the current dir in sys.path in jscompile. Modified: pypy/dist/pypy/bin/jscompile.py ============================================================================== --- pypy/dist/pypy/bin/jscompile.py (original) +++ pypy/dist/pypy/bin/jscompile.py Wed Oct 4 16:29:08 2006 @@ -7,12 +7,12 @@ """ import autopath -import sys +import sys, os from pypy.translator.js.main import rpython2javascript_main, Options from pypy.tool import option -import optparse +from py.compat import optparse make_option = optparse.make_option def get_options(): @@ -38,4 +38,7 @@ if __name__ == '__main__': argv = process_options(sys.argv[1:]) + curdir = os.getcwd() + if curdir not in sys.path: + sys.path.insert(0, curdir) rpython2javascript_main(argv, Options) Modified: pypy/dist/pypy/tool/option.py ============================================================================== --- pypy/dist/pypy/tool/option.py (original) +++ pypy/dist/pypy/tool/option.py Wed Oct 4 16:29:08 2006 @@ -3,7 +3,7 @@ import os from pypy.config.pypyoption import pypy_optiondescription -from pypy.config.config import Config, to_optparse +from pypy.config.config import Config, OptionDescription, to_optparse from py.compat import optparse make_option = optparse.make_option @@ -36,6 +36,14 @@ def process_options(op, input_options, argv=None): global Options Options = input_options + # backward compatilibity + if isinstance(op, list): + import sys, os + basename = os.path.basename(sys.argv[0]) + config = Config(OptionDescription(basename, basename, [])) + parser = to_optparse(config) + parser.add_options(op) + op = parser op.disable_interspersed_args() options, args = op.parse_args(argv, input_options) return args From fijal at codespeak.net Wed Oct 4 16:31:37 2006 From: fijal at codespeak.net (fijal at codespeak.net) Date: Wed, 4 Oct 2006 16:31:37 +0200 (CEST) Subject: [pypy-svn] r32877 - pypy/dist/pypy/bin Message-ID: <20061004143137.0925A100A7@code0.codespeak.net> Author: fijal Date: Wed Oct 4 16:31:25 2006 New Revision: 32877 Modified: pypy/dist/pypy/bin/jscompile.py Log: Fixed options (-o conflicts) Modified: pypy/dist/pypy/bin/jscompile.py ============================================================================== --- pypy/dist/pypy/bin/jscompile.py (original) +++ pypy/dist/pypy/bin/jscompile.py Wed Oct 4 16:31:25 2006 @@ -1,9 +1,9 @@ #!/usr/bin/env python """ RPython to javascript compiler -Usage: jscompiler module_to_compile [list of functions to export] +Usage: jscompile module_to_compile [list of functions to export] - or - -jscompiler --help to show list of options +jscompile --help to show list of options """ import autopath @@ -17,27 +17,30 @@ def get_options(): options = [] + config, parser = option.get_standard_options() options.append(make_option( '--view', action='store_true', dest='view', help='View flow graphs')) options.append(make_option( - '-o', '--output', action='store', type='string', dest='output', + '--output', action='store', type='string', dest='output', help='File to save results (default output.js)')) options.append(make_option( '-d', '--debug', action='store_true', dest='debug_transform', help="Use !EXPERIMENTAL! debug transform to produce tracebacks" )) - - return options + + parser.add_options(options) + return config, parser def process_options(argv): - return option.process_options(get_options(), Options, argv) + config, parser = get_options() + return option.process_options(parser, Options, argv[1:]) if __name__ == '__main__': - argv = process_options(sys.argv[1:]) + argv = process_options(sys.argv) curdir = os.getcwd() if curdir not in sys.path: sys.path.insert(0, curdir) From pedronis at codespeak.net Wed Oct 4 16:45:46 2006 From: pedronis at codespeak.net (pedronis at codespeak.net) Date: Wed, 4 Oct 2006 16:45:46 +0200 (CEST) Subject: [pypy-svn] r32878 - in pypy/dist/pypy: doc/tool translator translator/js translator/test Message-ID: <20061004144546.A2166100AD@code0.codespeak.net> Author: pedronis Date: Wed Oct 4 16:45:38 2006 New Revision: 32878 Modified: pypy/dist/pypy/doc/tool/mydot.py pypy/dist/pypy/translator/driver.py pypy/dist/pypy/translator/interactive.py pypy/dist/pypy/translator/js/main.py pypy/dist/pypy/translator/test/test_driver.py Log: optparse -> py.compat.optparse Modified: pypy/dist/pypy/doc/tool/mydot.py ============================================================================== --- pypy/dist/pypy/doc/tool/mydot.py (original) +++ pypy/dist/pypy/doc/tool/mydot.py Wed Oct 4 16:45:38 2006 @@ -62,7 +62,7 @@ if __name__ == '__main__': - import optparse + from py.compat import optparse parser = optparse.OptionParser() parser.add_option("-T", dest="format", help="output format") Modified: pypy/dist/pypy/translator/driver.py ============================================================================== --- pypy/dist/pypy/translator/driver.py (original) +++ pypy/dist/pypy/translator/driver.py Wed Oct 4 16:45:38 2006 @@ -6,7 +6,7 @@ from pypy.annotation import model as annmodel from pypy.annotation.listdef import s_list_of_strings from pypy.annotation import policy as annpolicy -import optparse +from py.compat import optparse import py from pypy.tool.ansi_print import ansi_log Modified: pypy/dist/pypy/translator/interactive.py ============================================================================== --- pypy/dist/pypy/translator/interactive.py (original) +++ pypy/dist/pypy/translator/interactive.py Wed Oct 4 16:45:38 2006 @@ -1,4 +1,4 @@ -import optparse +from py.compat import optparse import autopath from pypy.translator.translator import TranslationContext Modified: pypy/dist/pypy/translator/js/main.py ============================================================================== --- pypy/dist/pypy/translator/js/main.py (original) +++ pypy/dist/pypy/translator/js/main.py Wed Oct 4 16:45:38 2006 @@ -10,7 +10,7 @@ from pypy.tool.error import AnnotatorError, FlowingError, debug from pypy.rpython.nonconst import NonConstant from pypy.annotation.policy import AnnotatorPolicy -import optparse +from py.compat import optparse import py from pypy.tool import option Modified: pypy/dist/pypy/translator/test/test_driver.py ============================================================================== --- pypy/dist/pypy/translator/test/test_driver.py (original) +++ pypy/dist/pypy/translator/test/test_driver.py Wed Oct 4 16:45:38 2006 @@ -1,7 +1,7 @@ import py from pypy.translator.driver import TranslationDriver, DEFAULT_OPTIONS -import optparse +from py.compat import optparse def cmpl(l1, l2): l1 = list(l1) From fijal at codespeak.net Wed Oct 4 16:52:12 2006 From: fijal at codespeak.net (fijal at codespeak.net) Date: Wed, 4 Oct 2006 16:52:12 +0200 (CEST) Subject: [pypy-svn] r32879 - pypy/dist/pypy/translator/js/demo/jsdemo Message-ID: <20061004145212.6A424100B0@code0.codespeak.net> Author: fijal Date: Wed Oct 4 16:52:01 2006 New Revision: 32879 Modified: pypy/dist/pypy/translator/js/demo/jsdemo/example.py Log: (arigo, fijal) - Fixed example not to regenerate given JS. Modified: pypy/dist/pypy/translator/js/demo/jsdemo/example.py ============================================================================== --- pypy/dist/pypy/translator/js/demo/jsdemo/example.py (original) +++ pypy/dist/pypy/translator/js/demo/jsdemo/example.py Wed Oct 4 16:52:01 2006 @@ -46,6 +46,7 @@ def __init__(self, *args, **kwargs): HTTPServer.__init__(self, *args, **kwargs) + self.source = "" self.counter = 0 class RequestHandler(BaseHTTPRequestHandler): @@ -77,8 +78,14 @@ self.serve_data("text/json", "{'counter':%d}" % self.server.counter) def run_jssource(self): - fn = compile_function(runjs, []) - self.serve_data("text/javascript", fn.source()) + if self.server.source: + source = self.server.source + else: + fn = compile_function(runjs, []) + source = fn.source() + self.server.source = source + + self.serve_data("text/javascript", source) def serve_data(self, content_type, data): self.send_response(200) From mwh at codespeak.net Wed Oct 4 17:18:17 2006 From: mwh at codespeak.net (mwh at codespeak.net) Date: Wed, 4 Oct 2006 17:18:17 +0200 (CEST) Subject: [pypy-svn] r32880 - in pypy/dist/pypy/rpython/memory/gctransform2: . test Message-ID: <20061004151817.85282100B8@code0.codespeak.net> Author: mwh Date: Wed Oct 4 17:18:15 2006 New Revision: 32880 Added: pypy/dist/pypy/rpython/memory/gctransform2/boehm.py (contents, props changed) pypy/dist/pypy/rpython/memory/gctransform2/framework.py (contents, props changed) pypy/dist/pypy/rpython/memory/gctransform2/test/test_boehm.py (contents, props changed) pypy/dist/pypy/rpython/memory/gctransform2/test/test_framework.py (contents, props changed) Modified: pypy/dist/pypy/rpython/memory/gctransform2/refcounting.py Log: really add boehm this time and add the framework transformer to gctransform2, or at least enough of it to get the one explicit test of it to pass... Added: pypy/dist/pypy/rpython/memory/gctransform2/boehm.py ============================================================================== --- (empty file) +++ pypy/dist/pypy/rpython/memory/gctransform2/boehm.py Wed Oct 4 17:18:15 2006 @@ -0,0 +1,64 @@ +from pypy.rpython.memory.gctransform2.transform import GCTransformer +from pypy.rpython.memory.gctransform2.support import type_contains_pyobjs, \ + get_rtti, _static_deallocator_body_for_type, LLTransformerOp, ll_call_destructor +from pypy.rpython.lltypesystem import lltype, llmemory +from pypy.rpython.lltypesystem.lloperation import llop + +class BoehmGCTransformer(GCTransformer): + def __init__(self, translator, inline=False): + super(BoehmGCTransformer, self).__init__(translator, inline=inline) + self.finalizer_funcptrs = {} + + def push_alive_nopyobj(self, var, llops): + pass + + def pop_alive_nopyobj(self, var, llops): + pass + + def gct_gc_protect(self, hop): + """ for boehm it is enough to do nothing""" + pass + + def gct_gc_unprotect(self, op, livevars, block): + """ for boehm it is enough to do nothing""" + pass + + def finalizer_funcptr_for_type(self, TYPE): + if TYPE in self.finalizer_funcptrs: + return self.finalizer_funcptrs[TYPE] + + rtti = get_rtti(TYPE) + if rtti is not None and hasattr(rtti._obj, 'destructor_funcptr'): + destrptr = rtti._obj.destructor_funcptr + DESTR_ARG = lltype.typeOf(destrptr).TO.ARGS[0] + else: + destrptr = None + DESTR_ARG = None + + if type_contains_pyobjs(TYPE): + if destrptr: + raise Exception("can't mix PyObjects and __del__ with Boehm") + + static_body = '\n'.join(_static_deallocator_body_for_type('v', TYPE)) + d = {'pop_alive': LLTransformerOp(self.pop_alive), + 'PTR_TYPE':lltype.Ptr(TYPE), + 'cast_adr_to_ptr': llmemory.cast_adr_to_ptr} + src = ("def ll_finalizer(addr):\n" + " v = cast_adr_to_ptr(addr, PTR_TYPE)\n" + "%s\n")%(static_body,) + exec src in d + fptr = self.annotate_helper(d['ll_finalizer'], [llmemory.Address], lltype.Void) + elif destrptr: + EXC_INSTANCE_TYPE = self.translator.rtyper.exceptiondata.lltype_of_exception_value + def ll_finalizer(addr): + exc_instance = llop.gc_fetch_exception(EXC_INSTANCE_TYPE) + v = llmemory.cast_adr_to_ptr(addr, DESTR_ARG) + ll_call_destructor(destrptr, v) + llop.gc_restore_exception(lltype.Void, exc_instance) + fptr = self.annotate_helper(ll_finalizer, [llmemory.Address], lltype.Void) + else: + fptr = None + + self.finalizer_funcptrs[TYPE] = fptr + return fptr + Added: pypy/dist/pypy/rpython/memory/gctransform2/framework.py ============================================================================== --- (empty file) +++ pypy/dist/pypy/rpython/memory/gctransform2/framework.py Wed Oct 4 17:18:15 2006 @@ -0,0 +1,626 @@ +from pypy.rpython.memory.gctransform2.transform import GCTransformer, var_ispyobj +from pypy.rpython.memory.gctransform2.support import find_gc_ptrs_in_type, \ + get_rtti, ll_call_destructor, type_contains_pyobjs +from pypy.rpython.lltypesystem import lltype, llmemory +from pypy.rpython import rmodel +from pypy.rpython.memory import gc, lladdress +from pypy.rpython.memory.gcheader import GCHeaderBuilder +from pypy.rpython.rarithmetic import ovfcheck +from pypy.translator.backendopt import graphanalyze +from pypy.annotation import model as annmodel +from pypy.rpython import annlowlevel +from pypy.rpython.rbuiltin import gen_cast +import sys + + +class CollectAnalyzer(graphanalyze.GraphAnalyzer): + def operation_is_true(self, op): + return op.opname in ("malloc", "malloc_varsize", "gc__collect", + "gc_x_become") + +ADDRESS_VOID_FUNC = lltype.FuncType([llmemory.Address], lltype.Void) + +class FrameworkGCTransformer(GCTransformer): + use_stackless = False + extra_static_slots = 0 + finished_tables = False + + from pypy.rpython.memory.gc import MarkSweepGC as GCClass + GC_PARAMS = {'start_heap_size': 8*1024*1024 # XXX adjust + } + + def __init__(self, translator): + from pypy.rpython.memory.support import get_address_linked_list + super(FrameworkGCTransformer, self).__init__(translator, inline=False) + AddressLinkedList = get_address_linked_list() + GCClass = self.GCClass + self.finalizer_funcptrs = {} + self.FINALIZERTYPE = lltype.Ptr(ADDRESS_VOID_FUNC) + class GCData(object): + # types of the GC information tables + OFFSETS_TO_GC_PTR = lltype.Array(lltype.Signed) + TYPE_INFO = lltype.Struct("type_info", + ("isvarsize", lltype.Bool), + ("finalyzer", self.FINALIZERTYPE), + ("fixedsize", lltype.Signed), + ("ofstoptrs", lltype.Ptr(OFFSETS_TO_GC_PTR)), + ("varitemsize", lltype.Signed), + ("ofstovar", lltype.Signed), + ("ofstolength", lltype.Signed), + ("varofstoptrs",lltype.Ptr(OFFSETS_TO_GC_PTR)), + ) + TYPE_INFO_TABLE = lltype.Array(TYPE_INFO) + + def q_is_varsize(typeid): + return gcdata.type_info_table[typeid].isvarsize + + def q_finalyzer(typeid): + return gcdata.type_info_table[typeid].finalyzer + + def q_offsets_to_gc_pointers(typeid): + return gcdata.type_info_table[typeid].ofstoptrs + + def q_fixed_size(typeid): + return gcdata.type_info_table[typeid].fixedsize + + def q_varsize_item_sizes(typeid): + return gcdata.type_info_table[typeid].varitemsize + + def q_varsize_offset_to_variable_part(typeid): + return gcdata.type_info_table[typeid].ofstovar + + def q_varsize_offset_to_length(typeid): + return gcdata.type_info_table[typeid].ofstolength + + def q_varsize_offsets_to_gcpointers_in_var_part(typeid): + return gcdata.type_info_table[typeid].varofstoptrs + + gcdata = GCData() + # set up dummy a table, to be overwritten with the real one in finish() + gcdata.type_info_table = lltype.malloc(GCData.TYPE_INFO_TABLE, 0, + immortal=True) + gcdata.static_roots = lltype.malloc(lltype.Array(llmemory.Address), 0, + immortal=True) + # initialize the following two fields with a random non-NULL address, + # to make the annotator happy. The fields are patched in finish() + # to point to a real array (not 'static_roots', another one). + a_random_address = llmemory.cast_ptr_to_adr(gcdata.type_info_table) + gcdata.static_root_start = a_random_address # patched in finish() + gcdata.static_root_end = a_random_address # patched in finish() + self.gcdata = gcdata + self.type_info_list = [] + self.id_of_type = {} # {LLTYPE: type_id} + self.seen_roots = {} + self.static_gc_roots = [] + self.addresses_of_static_ptrs_in_nongc = [] + self.offsettable_cache = {} + self.malloc_fnptr_cache = {} + + sizeofaddr = llmemory.sizeof(llmemory.Address) + + StackRootIterator = self.build_stack_root_iterator() + gcdata.gc = GCClass(AddressLinkedList, get_roots=StackRootIterator, **self.GC_PARAMS) + + def frameworkgc_setup(): + # run-time initialization code + StackRootIterator.setup_root_stack() + gcdata.gc.setup() + gcdata.gc.set_query_functions( + q_is_varsize, + q_finalyzer, + q_offsets_to_gc_pointers, + q_fixed_size, + q_varsize_item_sizes, + q_varsize_offset_to_variable_part, + q_varsize_offset_to_length, + q_varsize_offsets_to_gcpointers_in_var_part) + + bk = self.translator.annotator.bookkeeper + + # the point of this little dance is to not annotate + # self.gcdata.type_info_table as a constant. + data_classdef = bk.getuniqueclassdef(GCData) + data_classdef.generalize_attr( + 'type_info_table', + annmodel.SomePtr(lltype.Ptr(GCData.TYPE_INFO_TABLE))) + data_classdef.generalize_attr( + 'static_roots', + annmodel.SomePtr(lltype.Ptr(lltype.Array(llmemory.Address)))) + data_classdef.generalize_attr( + 'static_root_start', + annmodel.SomeAddress()) + data_classdef.generalize_attr( + 'static_root_end', + annmodel.SomeAddress()) + + annhelper = annlowlevel.MixLevelHelperAnnotator(self.translator.rtyper) + + def getfn(ll_function, args_s, s_result, inline=False, + minimal_transform=True): + graph = annhelper.getgraph(ll_function, args_s, s_result) + if minimal_transform: + self.need_minimal_transform(graph) + if inline: + self.graphs_to_inline[graph] = True + return annhelper.graph2const(graph) + + self.frameworkgc_setup_ptr = getfn(frameworkgc_setup, [], + annmodel.s_None) + if StackRootIterator.push_root is None: + self.push_root_ptr = None + else: + self.push_root_ptr = getfn(StackRootIterator.push_root, + [annmodel.SomeAddress()], + annmodel.s_None, + inline = True) + if StackRootIterator.pop_root is None: + self.pop_root_ptr = None + else: + self.pop_root_ptr = getfn(StackRootIterator.pop_root, [], + annmodel.s_None, + inline = True) + + classdef = bk.getuniqueclassdef(GCClass) + s_gc = annmodel.SomeInstance(classdef) + s_gcref = annmodel.SomePtr(llmemory.GCREF) + self.malloc_fixedsize_ptr = getfn( + GCClass.malloc_fixedsize.im_func, + [s_gc, annmodel.SomeInteger(nonneg=True), + annmodel.SomeInteger(nonneg=True), + annmodel.SomeBool(), annmodel.SomeBool()], s_gcref, + inline = False) + self.malloc_fixedsize_clear_ptr = getfn( + GCClass.malloc_fixedsize_clear.im_func, + [s_gc, annmodel.SomeInteger(nonneg=True), + annmodel.SomeInteger(nonneg=True), + annmodel.SomeBool(), annmodel.SomeBool()], s_gcref, + inline = False) +## self.malloc_varsize_ptr = getfn( +## GCClass.malloc_varsize.im_func, +## [s_gc] + [annmodel.SomeInteger(nonneg=True) for i in range(5)] +## + [annmodel.SomeBool(), annmodel.SomeBool()], s_gcref) + self.malloc_varsize_clear_ptr = getfn( + GCClass.malloc_varsize_clear.im_func, + [s_gc] + [annmodel.SomeInteger(nonneg=True) for i in range(5)] + + [annmodel.SomeBool(), annmodel.SomeBool()], s_gcref) + self.collect_ptr = getfn(GCClass.collect.im_func, + [s_gc], annmodel.s_None) + + self.statistics_ptr = getfn(GCClass.statistics.im_func, + [s_gc, annmodel.SomeInteger()], + annmodel.SomeInteger()) + + # experimental gc_x_* operations + s_x_pool = annmodel.SomePtr(gc.X_POOL_PTR) + s_x_clone = annmodel.SomePtr(gc.X_CLONE_PTR) + # the x_*() methods use some regular mallocs that must be + # transformed in the normal way + self.x_swap_pool_ptr = getfn(GCClass.x_swap_pool.im_func, + [s_gc, s_x_pool], + s_x_pool, + minimal_transform = False) + self.x_clone_ptr = getfn(GCClass.x_clone.im_func, + [s_gc, s_x_clone], + annmodel.s_None, + minimal_transform = False) + + self.x_become_ptr = getfn( + GCClass.x_become.im_func, + [s_gc, annmodel.SomeAddress(), annmodel.SomeAddress()], + annmodel.s_None) + + annhelper.finish() # at this point, annotate all mix-level helpers + annhelper.backend_optimize() + + self.collect_analyzer = CollectAnalyzer(self.translator) + self.collect_analyzer.analyze_all() + + s_gc = self.translator.annotator.bookkeeper.valueoftype(GCClass) + r_gc = self.translator.rtyper.getrepr(s_gc) + self.c_const_gc = rmodel.inputconst(r_gc, self.gcdata.gc) + + HDR = self._gc_HDR = self.gcdata.gc.gcheaderbuilder.HDR + self._gc_fields = fields = [] + for fldname in HDR._names: + FLDTYPE = getattr(HDR, fldname) + fields.append(('_' + fldname, FLDTYPE)) + + def build_stack_root_iterator(self): + gcdata = self.gcdata + sizeofaddr = llmemory.sizeof(llmemory.Address) + rootstacksize = sizeofaddr * 163840 # XXX adjust + + class StackRootIterator: + _alloc_flavor_ = 'raw' + def setup_root_stack(): + stackbase = lladdress.raw_malloc(rootstacksize) + lladdress.raw_memclear(stackbase, rootstacksize) + gcdata.root_stack_top = stackbase + gcdata.root_stack_base = stackbase + i = 0 + while i < len(gcdata.static_roots): + StackRootIterator.push_root(gcdata.static_roots[i]) + i += 1 + setup_root_stack = staticmethod(setup_root_stack) + + def push_root(addr): + top = gcdata.root_stack_top + top.address[0] = addr + gcdata.root_stack_top = top + sizeofaddr + push_root = staticmethod(push_root) + + def pop_root(): + gcdata.root_stack_top -= sizeofaddr + pop_root = staticmethod(pop_root) + + def __init__(self): + self.stack_current = gcdata.root_stack_top + self.static_current = gcdata.static_root_start + + def pop(self): + while self.static_current != gcdata.static_root_end: + result = self.static_current + self.static_current += sizeofaddr + if result.address[0].address[0] != llmemory.NULL: + return result.address[0] + while self.stack_current != gcdata.root_stack_base: + self.stack_current -= sizeofaddr + if self.stack_current.address[0] != llmemory.NULL: + return self.stack_current + return llmemory.NULL + + return StackRootIterator + + def get_type_id(self, TYPE): + try: + return self.id_of_type[TYPE] + except KeyError: + assert not self.finished_tables + assert isinstance(TYPE, (lltype.GcStruct, lltype.GcArray)) + # Record the new type_id description as a small dict for now. + # It will be turned into a Struct("type_info") in finish() + type_id = len(self.type_info_list) + info = {} + self.type_info_list.append(info) + self.id_of_type[TYPE] = type_id + offsets = offsets_to_gc_pointers(TYPE) + info["ofstoptrs"] = self.offsets2table(offsets, TYPE) + info["finalyzer"] = self.finalizer_funcptr_for_type(TYPE) + if not TYPE._is_varsize(): + info["isvarsize"] = False + info["fixedsize"] = llmemory.sizeof(TYPE) + info["ofstolength"] = -1 + else: + info["isvarsize"] = True + info["fixedsize"] = llmemory.sizeof(TYPE, 0) + if isinstance(TYPE, lltype.Struct): + ARRAY = TYPE._flds[TYPE._arrayfld] + ofs1 = llmemory.offsetof(TYPE, TYPE._arrayfld) + info["ofstolength"] = ofs1 + llmemory.ArrayLengthOffset(ARRAY) + if ARRAY.OF != lltype.Void: + info["ofstovar"] = ofs1 + llmemory.itemoffsetof(ARRAY, 0) + else: + info["fixedsize"] = ofs1 + llmemory.sizeof(lltype.Signed) + if ARRAY._hints.get('isrpystring'): + info["fixedsize"] = llmemory.sizeof(TYPE, 1) + else: + ARRAY = TYPE + info["ofstolength"] = llmemory.ArrayLengthOffset(ARRAY) + if ARRAY.OF != lltype.Void: + info["ofstovar"] = llmemory.itemoffsetof(TYPE, 0) + else: + info["fixedsize"] = llmemory.ArrayLengthOffset(ARRAY) + llmemory.sizeof(lltype.Signed) + assert isinstance(ARRAY, lltype.Array) + if ARRAY.OF != lltype.Void: + offsets = offsets_to_gc_pointers(ARRAY.OF) + info["varofstoptrs"] = self.offsets2table(offsets, ARRAY.OF) + info["varitemsize"] = llmemory.sizeof(ARRAY.OF) + else: + info["varofstoptrs"] = self.offsets2table((), lltype.Void) + info["varitemsize"] = llmemory.sizeof(ARRAY.OF) + return type_id + + def finalizer_funcptr_for_type(self, TYPE): + if TYPE in self.finalizer_funcptrs: + return self.finalizer_funcptrs[TYPE] + + rtti = get_rtti(TYPE) + if rtti is not None and hasattr(rtti._obj, 'destructor_funcptr'): + destrptr = rtti._obj.destructor_funcptr + DESTR_ARG = lltype.typeOf(destrptr).TO.ARGS[0] + else: + destrptr = None + DESTR_ARG = None + + assert not type_contains_pyobjs(TYPE), "not implemented" + if destrptr: + def ll_finalizer(addr): + v = llmemory.cast_adr_to_ptr(addr, DESTR_ARG) + ll_call_destructor(destrptr, v) + fptr = self.annotate_helper(ll_finalizer, [llmemory.Address], lltype.Void) + else: + fptr = lltype.nullptr(ADDRESS_VOID_FUNC) + + self.finalizer_funcptrs[TYPE] = fptr + return fptr + + def consider_constant(self, TYPE, value): + if value is not lltype.top_container(value): + return + if id(value) in self.seen_roots: + return + self.seen_roots[id(value)] = True + + if isinstance(TYPE, (lltype.GcStruct, lltype.GcArray)): + typeid = self.get_type_id(TYPE) + hdrbuilder = self.gcdata.gc.gcheaderbuilder + hdr = hdrbuilder.new_header(value) + adr = llmemory.cast_ptr_to_adr(hdr) + self.gcdata.gc.init_gc_object(adr, typeid) + + if find_gc_ptrs_in_type(TYPE): + adr = llmemory.cast_ptr_to_adr(value._as_ptr()) + if isinstance(TYPE, (lltype.GcStruct, lltype.GcArray)): + self.static_gc_roots.append(adr) + else: + for a in gc_pointers_inside(value, adr): + self.addresses_of_static_ptrs_in_nongc.append(a) + + def gc_fields(self): + return self._gc_fields + + def gc_field_values_for(self, obj): + hdr = self.gcdata.gc.gcheaderbuilder.header_of_object(obj) + HDR = self._gc_HDR + return [getattr(hdr, fldname) for fldname in HDR._names] + + def offsets2table(self, offsets, TYPE): + try: + return self.offsettable_cache[TYPE] + except KeyError: + cachedarray = lltype.malloc(self.gcdata.OFFSETS_TO_GC_PTR, + len(offsets), immortal=True) + for i, value in enumerate(offsets): + cachedarray[i] = value + self.offsettable_cache[TYPE] = cachedarray + return cachedarray + + def finish_tables(self): + self.finished_tables = True + table = lltype.malloc(self.gcdata.TYPE_INFO_TABLE, + len(self.type_info_list), immortal=True) + for tableentry, newcontent in zip(table, self.type_info_list): + for key, value in newcontent.items(): + setattr(tableentry, key, value) + self.offsettable_cache = None + + # replace the type_info_table pointer in gcdata -- at this point, + # the database is in principle complete, so it has already seen + # the old (empty) array. We need to force it to consider the new + # array now. It's a bit hackish as the old empty array will also + # be generated in the C source, but that's a rather minor problem. + + # XXX because we call inputconst already in replace_malloc, we can't + # modify the instance, we have to modify the 'rtyped instance' + # instead. horrors. is there a better way? + + s_gcdata = self.translator.annotator.bookkeeper.immutablevalue( + self.gcdata) + r_gcdata = self.translator.rtyper.getrepr(s_gcdata) + ll_instance = rmodel.inputconst(r_gcdata, self.gcdata).value + ll_instance.inst_type_info_table = table + #self.gcdata.type_info_table = table + + ll_static_roots = lltype.malloc(lltype.Array(llmemory.Address), + len(self.static_gc_roots) + + self.extra_static_slots, + immortal=True) + for i in range(len(self.static_gc_roots)): + adr = self.static_gc_roots[i] + ll_static_roots[i] = adr + ll_instance.inst_static_roots = ll_static_roots + + ll_static_roots_inside = lltype.malloc(lltype.Array(llmemory.Address), + len(self.addresses_of_static_ptrs_in_nongc), + immortal=True) + for i in range(len(self.addresses_of_static_ptrs_in_nongc)): + ll_static_roots_inside[i] = self.addresses_of_static_ptrs_in_nongc[i] + ll_instance.inst_static_root_start = llmemory.cast_ptr_to_adr(ll_static_roots_inside) + llmemory.ArrayItemsOffset(lltype.Array(llmemory.Address)) + ll_instance.inst_static_root_end = ll_instance.inst_static_root_start + llmemory.sizeof(llmemory.Address) * len(ll_static_roots_inside) + + newgcdependencies = [] + newgcdependencies.append(table) + newgcdependencies.append(ll_static_roots) + newgcdependencies.append(ll_static_roots_inside) + return newgcdependencies + + def gct_direct_call(self, hop): + if self.collect_analyzer.analyze(hop.spaceop): + self.push_roots(hop) + self.default(hop) + self.pop_roots(hop) + else: + self.default(hop) + + gct_indirect_call = gct_direct_call + + def gct_malloc(self, hop): + op = hop.spaceop + + if op.opname.startswith('flavored_'): + flavor = op.args[0].value + TYPE = op.args[1].value + else: + flavor = 'gc' + TYPE = op.args[0].value + + if not flavor.startswith('gc'): + self.default(hop) + return + + c_can_collect = rmodel.inputconst(lltype.Bool, + flavor != 'gc_nocollect') + PTRTYPE = op.result.concretetype + assert PTRTYPE.TO == TYPE + type_id = self.get_type_id(TYPE) + + c_type_id = rmodel.inputconst(lltype.Signed, type_id) + info = self.type_info_list[type_id] + c_size = rmodel.inputconst(lltype.Signed, info["fixedsize"]) + if not op.opname.endswith('_varsize'): + #malloc_ptr = self.malloc_fixedsize_ptr + if op.opname.startswith('zero'): + malloc_ptr = self.malloc_fixedsize_clear_ptr + else: + malloc_ptr = self.malloc_fixedsize_ptr + args = [self.c_const_gc, c_type_id, c_size, c_can_collect] + else: + v_length = op.args[-1] + c_ofstolength = rmodel.inputconst(lltype.Signed, info['ofstolength']) + c_varitemsize = rmodel.inputconst(lltype.Signed, info['varitemsize']) + malloc_ptr = self.malloc_varsize_clear_ptr +## if op.opname.startswith('zero'): +## malloc_ptr = self.malloc_varsize_clear_ptr +## else: +## malloc_ptr = self.malloc_varsize_clear_ptr + args = [self.c_const_gc, c_type_id, v_length, c_size, + c_varitemsize, c_ofstolength, c_can_collect] + c_has_finalizer = rmodel.inputconst( + lltype.Bool, bool(self.finalizer_funcptr_for_type(TYPE))) + args.append(c_has_finalizer) + + self.push_roots(hop) + v_result = hop.genop("direct_call", [malloc_ptr] + args, + resulttype=llmemory.GCREF) + self.pop_roots(hop) + hop.cast_result(v_result) + if malloc_ptr == self.malloc_fixedsize_ptr: + gen_zero_gc_pointers(TYPE, op.result, hop.llops) + + gct_zero_malloc = gct_malloc + gct_malloc_varsize = gct_malloc + gct_zero_malloc_varsize = gct_malloc + gct_flavored_malloc = gct_malloc + gct_flavored_malloc_varsize = gct_malloc + + def gct_gc__collect(self, hop): + op = hop.spaceop + self.push_roots(hop) + hop.genop("direct_call", [self.collect_ptr, self.c_const_gc], + resultvar=op.result) + self.pop_roots(hop) + return ops + + def gct_gc_x_swap_pool(self, hop): + op = hop.spaceop + [v_malloced] = op.args + hop.genop("direct_call", + [self.x_swap_pool_ptr, self.c_const_gc, v_malloced], + resultvar=op.result) + + def gct_gc_x_clone(self, hop): + op = hop.spaceop + [v_clonedata] = op.args + hop.genop("direct_call", + [self.x_clone_ptr, self.c_const_gc, v_clonedata], + resultvar=op.result) + + def gct_gc_x_size_header(self, hop): + op = hop.spaceop + c_result = rmodel.inputconst(lltype.Signed, + self.gcdata.gc.size_gc_header()) + hop.genop("same_as", + [c_result], + resultvar=op.result) + + def gct_gc_x_become(self, hop): + op = hop.spaceop + [v_target, v_source] = op.args + self.push_roots(hop) + hop.genop("direct_call", + [self.x_become_ptr, self.c_const_gc, v_target, v_source], + resultvar=op.result) + self.pop_roots(hop) + + def push_alive_nopyobj(self, var, llops): + pass + + def pop_alive_nopyobj(self, var, llops): + pass + + def push_roots(self, hop): + if self.push_root_ptr is None: + return + livevars = [var for var in self.livevars if not var_ispyobj(var)] + for var in livevars: + v_adr = gen_cast(hop.llops, llmemory.Address, var) + hop.genop("direct_call", [self.push_root_ptr, v_adr]) + + def pop_roots(self, hop): + if self.pop_root_ptr is None: + return + livevars = [var for var in self.livevars if not var_ispyobj(var)] + for var in livevars[::-1]: + # XXX specific to non-moving collectors + hop.genop("direct_call", [self.pop_root_ptr]) + #hop.genop("gc_reload_possibly_moved", [var]) + +# XXX copied and modified from lltypelayout.py +def offsets_to_gc_pointers(TYPE): + offsets = [] + if isinstance(TYPE, lltype.Struct): + for name in TYPE._names: + FIELD = getattr(TYPE, name) + if isinstance(FIELD, lltype.Array): + continue # skip inlined array + baseofs = llmemory.offsetof(TYPE, name) + suboffsets = offsets_to_gc_pointers(FIELD) + for s in suboffsets: + try: + knownzero = s == 0 + except TypeError: + knownzero = False + if knownzero: + offsets.append(baseofs) + else: + offsets.append(baseofs + s) + # sanity check + #ex = lltype.Ptr(TYPE)._example() + #adr = llmemory.cast_ptr_to_adr(ex) + #for off in offsets: + # (adr + off) + elif isinstance(TYPE, lltype.Ptr) and TYPE.TO._gckind == 'gc': + offsets.append(0) + return offsets + +def gen_zero_gc_pointers(TYPE, v, llops): + assert isinstance(TYPE, lltype.Struct) + for name in TYPE._names: + FIELD = getattr(TYPE, name) + if isinstance(FIELD, lltype.Ptr) and FIELD._needsgc(): + c_name = rmodel.inputconst(lltype.Void, name) + c_null = rmodel.inputconst(FIELD, lltype.nullptr(FIELD.TO)) + llops.genop('bare_setfield', [v, c_name, c_null]) + elif isinstance(FIELD, lltype.Struct): + c_name = rmodel.inputconst(lltype.Void, name) + v1 = llops.genop('getsubstruct', [v, c_name], + resulttype = lltype.Ptr(FIELD)) + gen_zero_gc_pointers(FIELD, v1, llops) + +def gc_pointers_inside(v, adr): + t = lltype.typeOf(v) + if isinstance(t, lltype.Struct): + for n, t2 in t._flds.iteritems(): + if isinstance(t2, lltype.Ptr) and t2.TO._gckind == 'gc': + yield adr + llmemory.offsetof(t, n) + elif isinstance(t2, (lltype.Array, lltype.Struct)): + for a in gc_pointers_inside(getattr(v, n), adr + llmemory.offsetof(t, n)): + yield a + elif isinstance(t, lltype.Array): + if isinstance(t.OF, lltype.Ptr) and t2._needsgc(): + for i in range(len(v.items)): + yield adr + llmemory.itemoffsetof(t, i) + elif isinstance(t.OF, lltype.Struct): + for i in range(len(v.items)): + for a in gc_pointers_inside(v.items[i], adr + llmemory.itemoffsetof(t, i)): + yield a Modified: pypy/dist/pypy/rpython/memory/gctransform2/refcounting.py ============================================================================== --- pypy/dist/pypy/rpython/memory/gctransform2/refcounting.py (original) +++ pypy/dist/pypy/rpython/memory/gctransform2/refcounting.py Wed Oct 4 17:18:15 2006 @@ -8,7 +8,6 @@ from pypy.rpython import rmodel from pypy.rpython.memory import lladdress from pypy.rpython.memory.gcheader import GCHeaderBuilder -#from pypy.rpython.extregistry import ExtRegistryEntry from pypy.rpython.rarithmetic import ovfcheck from pypy.rpython.rbuiltin import gen_cast import sys Added: pypy/dist/pypy/rpython/memory/gctransform2/test/test_boehm.py ============================================================================== --- (empty file) +++ pypy/dist/pypy/rpython/memory/gctransform2/test/test_boehm.py Wed Oct 4 17:18:15 2006 @@ -0,0 +1,70 @@ +from pypy.rpython.memory.gctransform2.boehm import BoehmGCTransformer +from pypy.rpython.memory.gctransform2.test.test_transform import rtype_and_transform, getops +from pypy.rpython.memory.gctransform2.test.test_refcounting import make_deallocator +from pypy.rpython.lltypesystem import lltype +from pypy.translator.translator import graphof +from pypy import conftest +import py + +def make_boehm_finalizer(TYPE): + return make_deallocator(TYPE, attr="finalizer_funcptr_for_type", + cls=BoehmGCTransformer) + +def test_boehm_simple(): + class C: + pass + def f(): + c = C() + c.x = 1 + return c.x + t, transformer = rtype_and_transform( + f, [], BoehmGCTransformer, check=False) + ops = getops(graphof(t, f)) + assert len(ops.get('direct_call', [])) <= 1 + gcs = [k for k in ops if k.startswith('gc')] + assert len(gcs) == 0 + +def test_boehm_finalizer_simple(): + S = lltype.GcStruct("S", ('x', lltype.Signed)) + f, t = make_boehm_finalizer(S) + assert f is None + +def test_boehm_finalizer_pyobj(): + S = lltype.GcStruct("S", ('x', lltype.Ptr(lltype.PyObject))) + f, t = make_boehm_finalizer(S) + assert f is not None + +def test_boehm_finalizer___del__(): + S = lltype.GcStruct("S", ('x', lltype.Signed)) + def f(s): + s.x = 1 + def type_info_S(p): + return lltype.getRuntimeTypeInfo(S) + qp = lltype.functionptr(lltype.FuncType([lltype.Ptr(S)], + lltype.Ptr(lltype.RuntimeTypeInfo)), + "type_info_S", + _callable=type_info_S) + dp = lltype.functionptr(lltype.FuncType([lltype.Ptr(S)], + lltype.Void), + "destructor_funcptr", + _callable=f) + pinf = lltype.attachRuntimeTypeInfo(S, qp, destrptr=dp) + f, t = make_boehm_finalizer(S) + assert f is not None + +def test_boehm_finalizer_nomix___del___and_pyobj(): + S = lltype.GcStruct("S", ('x', lltype.Signed), ('y', lltype.Ptr(lltype.PyObject))) + def f(s): + s.x = 1 + def type_info_S(p): + return lltype.getRuntimeTypeInfo(S) + qp = lltype.functionptr(lltype.FuncType([lltype.Ptr(S)], + lltype.Ptr(lltype.RuntimeTypeInfo)), + "type_info_S", + _callable=type_info_S) + dp = lltype.functionptr(lltype.FuncType([lltype.Ptr(S)], + lltype.Void), + "destructor_funcptr", + _callable=f) + pinf = lltype.attachRuntimeTypeInfo(S, qp, destrptr=dp) + py.test.raises(Exception, "make_boehm_finalizer(S)") Added: pypy/dist/pypy/rpython/memory/gctransform2/test/test_framework.py ============================================================================== --- (empty file) +++ pypy/dist/pypy/rpython/memory/gctransform2/test/test_framework.py Wed Oct 4 17:18:15 2006 @@ -0,0 +1,45 @@ +from pypy.rpython.memory.gctransform2.test.test_transform import rtype +from pypy.rpython.memory.gctransform2.framework import FrameworkGCTransformer +from pypy.rpython.lltypesystem import lltype +from pypy.translator.c.gc import FrameworkGcPolicy +from pypy.translator.translator import TranslationContext, graphof +from pypy import conftest + +import py + +class FrameworkGcPolicy2(FrameworkGcPolicy): + transformerclass = FrameworkGCTransformer + +def test_framework_simple(): + def g(x): + return x + 1 + class A(object): + pass + def entrypoint(argv): + a = A() + a.b = g(1) + return str(a.b) + + from pypy.rpython.llinterp import LLInterpreter + from pypy.translator.c.genc import CStandaloneBuilder + from pypy.translator.c import gc + from pypy.annotation.listdef import s_list_of_strings + + t = rtype(entrypoint, [s_list_of_strings]) + cbuild = CStandaloneBuilder(t, entrypoint, FrameworkGcPolicy2) + db = cbuild.generate_graphs_for_llinterp() + entrypointptr = cbuild.getentrypointptr() + entrygraph = entrypointptr._obj.graph + + r_list_of_strings = t.rtyper.getrepr(s_list_of_strings) + ll_argv = r_list_of_strings.convert_const([]) + + llinterp = LLInterpreter(t.rtyper) + + # FIIIIISH + setupgraph = db.gctransformer.frameworkgc_setup_ptr.value._obj.graph + llinterp.eval_graph(setupgraph, []) + + res = llinterp.eval_graph(entrygraph, [ll_argv]) + + assert ''.join(res.chars) == "2" From pedronis at codespeak.net Wed Oct 4 18:51:50 2006 From: pedronis at codespeak.net (pedronis at codespeak.net) Date: Wed, 4 Oct 2006 18:51:50 +0200 (CEST) Subject: [pypy-svn] r32882 - pypy/extradoc/talk/strakt06 Message-ID: <20061004165150.74775100BA@code0.codespeak.net> Author: pedronis Date: Wed Oct 4 18:51:45 2006 New Revision: 32882 Added: pypy/extradoc/talk/strakt06/ - copied from r32875, pypy/extradoc/talk/vancouver/ pypy/extradoc/talk/strakt06/usecases-slides.txt - copied, changed from r32875, pypy/extradoc/talk/ep2006/usecases-slides.txt Modified: pypy/extradoc/talk/strakt06/talk.txt Log: talks for tomorrow at strakt Modified: pypy/extradoc/talk/strakt06/talk.txt ============================================================================== --- pypy/extradoc/talk/vancouver/talk.txt (original) +++ pypy/extradoc/talk/strakt06/talk.txt Wed Oct 4 18:51:45 2006 @@ -1,12 +1,12 @@ .. include:: ================================================= -PyPy Status +PyPy Introduction ================================================= -:Authors: Samuele Pedroni, PyPy Team -:Date: 6th August 2006 -:Location: Vancouver Python Workshop, Vancouver +:Authors: PyPy Team +:Date: 5th October 2006 +:Location: AB Strakt, Gothenburg What it is? =================== @@ -39,7 +39,7 @@ - generate a psyco-like JIT (right now without a JIT -we can be 2.3x-6x slower than +we can be 2.7x-6x slower than CPython, depending on features etc, we can still improve on this too) @@ -51,7 +51,7 @@ - POSIX/C (like CPython) - .NET (like IronPython) -- ... +- JavaScript How ===================== @@ -79,7 +79,7 @@ (95% of core tests) - translates to C, LLVM (since August last year) -- 0.9 was recently released +- 0.9 was the last release - PyPy translated to .NET (no .NET gluing, much work left) @@ -96,12 +96,6 @@ programming features - ext-compiler - -Search demo -======================== - -Using coroutine cloning to do backtracing (RPython example) - Ext-Compiler ========================= @@ -176,8 +170,7 @@ http://codespeak.net/pypy -Thanks! - .. |bullet| unicode:: U+02022 -.. footer:: Samuele Pedroni, PyPy Team |bullet| Vancouver Python Workshop |bullet| 6th August 2006 +.. footer:: PyPy |bullet| AB Strakt |bullet| 5th October 2006 + From mwh at codespeak.net Wed Oct 4 19:25:07 2006 From: mwh at codespeak.net (mwh at codespeak.net) Date: Wed, 4 Oct 2006 19:25:07 +0200 (CEST) Subject: [pypy-svn] r32883 - in pypy/dist/pypy/rpython/memory/gctransform2: . test Message-ID: <20061004172507.471C0100C1@code0.codespeak.net> Author: mwh Date: Wed Oct 4 19:25:02 2006 New Revision: 32883 Added: pypy/dist/pypy/rpython/memory/gctransform2/stacklessframework.py (contents, props changed) pypy/dist/pypy/rpython/memory/gctransform2/test/test_stacklessframework.py (contents, props changed) Log: add the stacklessframework to gctransform2 Added: pypy/dist/pypy/rpython/memory/gctransform2/stacklessframework.py ============================================================================== --- (empty file) +++ pypy/dist/pypy/rpython/memory/gctransform2/stacklessframework.py Wed Oct 4 19:25:02 2006 @@ -0,0 +1,89 @@ +from pypy.rpython.memory.gctransform2.transform import \ + MinimalGCTransformer, var_ispyobj +from pypy.rpython.memory.gctransform2.framework import \ + FrameworkGCTransformer +from pypy.rpython.lltypesystem import lltype, llmemory + +class StacklessFrameworkMinimalGCTransformer(MinimalGCTransformer): + def gct_flavored_malloc(self, hop): + flavor = hop.spaceop.args[0].value + if flavor == 'gc_nocollect': + return self.parenttransformer.gct_flavored_malloc(hop) + else: + self.default(hop) + gct_flavored_malloc_varsize = gct_flavored_malloc + + +class StacklessFrameworkGCTransformer(FrameworkGCTransformer): + use_stackless = True + extra_static_slots = 1 # for the stack_capture()'d frame + MinimalGCTransformer = StacklessFrameworkMinimalGCTransformer + + def __init__(self, translator): + FrameworkGCTransformer.__init__(self, translator) + # and now, fun fun fun, we need to inline malloc_fixedsize + # manually into all 'malloc' operation users, because inlining + # it after it has been stackless transformed is both a Very + # Bad Idea and forbidden by the fact that stackless transform + # makes it self-recursive! Argh. +## self.replace_and_inline_malloc_already_now() + # nothing left to inline during code generation + self.inline = False + +## def replace_and_inline_malloc_already_now(self): +## for graph in self.translator.graphs: +## any_malloc = False +## for block in graph.iterblocks(): +## if block.operations: +## newops = [] +## for op in block.operations: +## if op.opname.startswith('malloc'): +## any_malloc = True +## ops = self.replace_malloc(op, [], block) +## if isinstance(ops, tuple): +## ops = ops[0] +## newops.extend(ops) +## else: +## newops.append(op) +## block.operations = newops +## if any_malloc: +## self.inline_helpers(graph) + + def build_stack_root_iterator(self): + from pypy.rpython.rstack import stack_capture + sizeofaddr = llmemory.sizeof(llmemory.Address) + gcdata = self.gcdata + + class StackRootIterator: + _alloc_flavor_ = 'raw' + + def setup_root_stack(): + pass + setup_root_stack = staticmethod(setup_root_stack) + + push_root = None + pop_root = None + + def __init__(self): + frame = llmemory.cast_ptr_to_adr(stack_capture()) + self.static_current = gcdata.static_root_start + index = len(gcdata.static_roots) + self.static_roots_index = index + gcdata.static_roots[index-1] = frame + + def pop(self): + while self.static_current != gcdata.static_root_end: + result = self.static_current + self.static_current += sizeofaddr + if result.address[0].address[0] != llmemory.NULL: + return result.address[0] + i = self.static_roots_index + if i > 0: + i -= 1 + self.static_roots_index = i + p = lltype.direct_arrayitems(gcdata.static_roots) + p = lltype.direct_ptradd(p, i) + return llmemory.cast_ptr_to_adr(p) + return llmemory.NULL + + return StackRootIterator Added: pypy/dist/pypy/rpython/memory/gctransform2/test/test_stacklessframework.py ============================================================================== --- (empty file) +++ pypy/dist/pypy/rpython/memory/gctransform2/test/test_stacklessframework.py Wed Oct 4 19:25:02 2006 @@ -0,0 +1,46 @@ +from pypy.rpython.memory.gctransform2.test.test_transform import rtype +from pypy.rpython.memory.gctransform2.stacklessframework import \ + StacklessFrameworkGCTransformer +from pypy.rpython.lltypesystem import lltype +from pypy.translator.c.gc import StacklessFrameworkGcPolicy +from pypy.translator.translator import TranslationContext, graphof +from pypy import conftest + +import py + +class StacklessFrameworkGcPolicy2(StacklessFrameworkGcPolicy): + transformerclass = StacklessFrameworkGCTransformer + +def test_stackless_simple(): + def g(x): + return x + 1 + class A(object): + pass + def entrypoint(argv): + a = A() + a.b = g(1) + return a.b + + from pypy.rpython.llinterp import LLInterpreter + from pypy.translator.c.genc import CStandaloneBuilder + from pypy.translator.c import gc + from pypy.annotation.listdef import s_list_of_strings + + t = rtype(entrypoint, [s_list_of_strings]) + cbuild = CStandaloneBuilder(t, entrypoint, StacklessFrameworkGcPolicy2) + db = cbuild.generate_graphs_for_llinterp() + entrypointptr = cbuild.getentrypointptr() + entrygraph = entrypointptr._obj.graph + + r_list_of_strings = t.rtyper.getrepr(s_list_of_strings) + ll_argv = r_list_of_strings.convert_const([]) + + llinterp = LLInterpreter(t.rtyper) + + # FIIIIISH + setupgraph = db.gctransformer.frameworkgc_setup_ptr.value._obj.graph + llinterp.eval_graph(setupgraph, []) + + res = llinterp.eval_graph(entrygraph, [ll_argv]) + + assert res == 2 From mwh at codespeak.net Wed Oct 4 19:32:35 2006 From: mwh at codespeak.net (mwh at codespeak.net) Date: Wed, 4 Oct 2006 19:32:35 +0200 (CEST) Subject: [pypy-svn] r32884 - in pypy/dist/pypy/rpython/memory/gctransform2: . test Message-ID: <20061004173235.CAC3B100C4@code0.codespeak.net> Author: mwh Date: Wed Oct 4 19:32:34 2006 New Revision: 32884 Added: pypy/dist/pypy/rpython/memory/gctransform2/statistics.py (contents, props changed) pypy/dist/pypy/rpython/memory/gctransform2/test/test_statistics.py (contents, props changed) Log: onto the odd and possibly-dead stuff: statistics gathering code Added: pypy/dist/pypy/rpython/memory/gctransform2/statistics.py ============================================================================== --- (empty file) +++ pypy/dist/pypy/rpython/memory/gctransform2/statistics.py Wed Oct 4 19:32:34 2006 @@ -0,0 +1,55 @@ +# calculate some statistics about the number of variables that need +# to be cared for across a call + +from pypy.rpython.lltypesystem import lltype, llmemory + + +relevant_ops = ["direct_call", "indirect_call", "malloc", "malloc_varsize"] + +def filter_for_ptr(arg): + return isinstance(arg.concretetype, lltype.Ptr) + +def filter_for_nongcptr(arg): + return isinstance(arg.concretetype, lltype.Ptr) and not arg.concretetype._needsgc() + +def relevant_gcvars_block(block, filter=filter_for_ptr): + import sets + result = [] + def filter_ptr(args): + return [arg for arg in args if filter(arg)] + def live_vars_before(index): + if index == 0: + return sets.Set(filter_ptr(block.inputargs)) + op = block.operations[index - 1] + result = live_vars_before(index - 1).union(filter_ptr(op.args + [op.result])) + return result + def live_vars_after(index): + if index == len(block.operations) - 1: + result = sets.Set() + for exit in block.exits: + result = result.union(filter_ptr(exit.args)) + return result + op = block.operations[index + 1] + result = live_vars_after(index + 1).union(filter_ptr(op.args + [op.result])) + + return result + for i, op in enumerate(block.operations): + if op.opname not in relevant_ops: + continue + live_before = live_vars_before(i) + live_after = live_vars_after(i) + result.append(len(live_before.intersection(live_after))) + return result + +def relevant_gcvars_graph(graph, filter=filter_for_ptr): + result = [] + for block in graph.iterblocks(): + result += relevant_gcvars_block(block, filter) + return result + +def relevant_gcvars(t, filter=filter_for_ptr): + result = [] + for graph in t.graphs: + result.extend(relevant_gcvars_graph(graph, filter)) + return result + Added: pypy/dist/pypy/rpython/memory/gctransform2/test/test_statistics.py ============================================================================== --- (empty file) +++ pypy/dist/pypy/rpython/memory/gctransform2/test/test_statistics.py Wed Oct 4 19:32:34 2006 @@ -0,0 +1,32 @@ +from pypy.rpython.lltypesystem import lltype +from pypy.rpython.memory.gctransform2.test.test_transform import \ + rtype +from pypy.rpython.memory.gctransform2.statistics import \ + relevant_gcvars_graph, relevant_gcvars, filter_for_nongcptr +from pypy.translator.translator import graphof + +def test_count_vars_simple(): + S = lltype.GcStruct('abc', ('x', lltype.Signed)) + def f(): + s1 = lltype.malloc(S) + s2 = lltype.malloc(S) + s1.x = 1 + s2.x = 2 + return s1.x + s2.x + t = rtype(f, []) + assert relevant_gcvars_graph(graphof(t, f)) == [0, 1] + +def test_count_vars_big(): + from pypy.translator.goal.targetrpystonex import make_target_definition + from pypy.translator.backendopt.all import backend_optimizations + entrypoint, _, _ = make_target_definition(10) + t = rtype(entrypoint, [int]) + backend_optimizations(t) + # does not crash + rel = relevant_gcvars(t) + print rel + print sum(rel) / float(len(rel)), max(rel), min(rel) + + rel = relevant_gcvars(t, filter_for_nongcptr) + print rel + print sum(rel) / float(len(rel)), max(rel), min(rel) From mwh at codespeak.net Wed Oct 4 19:48:23 2006 From: mwh at codespeak.net (mwh at codespeak.net) Date: Wed, 4 Oct 2006 19:48:23 +0200 (CEST) Subject: [pypy-svn] r32886 - in pypy/dist/pypy/rpython/memory/gctransform2: . test Message-ID: <20061004174823.A46CA100BE@code0.codespeak.net> Author: mwh Date: Wed Oct 4 19:48:22 2006 New Revision: 32886 Added: pypy/dist/pypy/rpython/memory/gctransform2/test/test_protect.py (contents, props changed) Modified: pypy/dist/pypy/rpython/memory/gctransform2/boehm.py Log: add test for and make simple fix to gc_protect/gc_unprotect stuff. Modified: pypy/dist/pypy/rpython/memory/gctransform2/boehm.py ============================================================================== --- pypy/dist/pypy/rpython/memory/gctransform2/boehm.py (original) +++ pypy/dist/pypy/rpython/memory/gctransform2/boehm.py Wed Oct 4 19:48:22 2006 @@ -19,7 +19,7 @@ """ for boehm it is enough to do nothing""" pass - def gct_gc_unprotect(self, op, livevars, block): + def gct_gc_unprotect(self, hop): """ for boehm it is enough to do nothing""" pass Added: pypy/dist/pypy/rpython/memory/gctransform2/test/test_protect.py ============================================================================== --- (empty file) +++ pypy/dist/pypy/rpython/memory/gctransform2/test/test_protect.py Wed Oct 4 19:48:22 2006 @@ -0,0 +1,26 @@ +from pypy.rpython.memory.gctransform2.refcounting import \ + RefcountingGCTransformer +from pypy.rpython.memory.gctransform2.boehm import \ + BoehmGCTransformer +from pypy.rpython.memory.gctransform2.test.test_transform import \ + rtype, rtype_and_transform, getops +from pypy.rpython.lltypesystem.lloperation import llop +from pypy.rpython.lltypesystem import lltype +from pypy.translator.translator import graphof + +# ____________________________________________________________________ +# testing the protection magic + +def test_protect_unprotect(): + def p(): llop.gc_protect(lltype.Void, 'this is an object') + def u(): llop.gc_unprotect(lltype.Void, 'this is an object') + + rgc = RefcountingGCTransformer + bgc = BoehmGCTransformer + expected = [1, 1, 0, 0] + gcs = [rgc, rgc, bgc, bgc] + fs = [p, u, p, u] + for ex, f, gc in zip(expected, fs, gcs): + t, transformer = rtype_and_transform(f, [], gc, check=False) + ops = getops(graphof(t, f)) + assert len(ops.get('direct_call', [])) == ex From arigo at codespeak.net Wed Oct 4 20:04:26 2006 From: arigo at codespeak.net (arigo at codespeak.net) Date: Wed, 4 Oct 2006 20:04:26 +0200 (CEST) Subject: [pypy-svn] r32887 - pypy/dist/pypy/translator/js Message-ID: <20061004180426.64807100C6@code0.codespeak.net> Author: arigo Date: Wed Oct 4 20:04:25 2006 New Revision: 32887 Modified: pypy/dist/pypy/translator/js/commproxy.py Log: (arigo, pedronis) Direct use of MochiKit to do the proper encoding. That's the point :-) Modified: pypy/dist/pypy/translator/js/commproxy.py ============================================================================== --- pypy/dist/pypy/translator/js/commproxy.py (original) +++ pypy/dist/pypy/translator/js/commproxy.py Wed Oct 4 20:04:25 2006 @@ -88,19 +88,7 @@ %(class)s.prototype.%(method)s = function ( %(args)s ) { var data,str; data = %(data)s; - str = "" - for(i in data) { - if (!(data[i] == undefined)) { - if (str.length == 0) { - str += "?"; - } else { - str += "&"; - } - str += i + "=" + data[i].toString(); - } - } - //logDebug('%(call)s'+str); - loadJSONDoc('%(call)s' + str).addCallback(callback); + loadJSONDoc('%(call)s', data).addCallback(callback); } """ From arigo at codespeak.net Wed Oct 4 20:05:08 2006 From: arigo at codespeak.net (arigo at codespeak.net) Date: Wed, 4 Oct 2006 20:05:08 +0200 (CEST) Subject: [pypy-svn] r32888 - pypy/dist/pypy/translator/js/demo/jsdemo Message-ID: <20061004180508.ADD65100CA@code0.codespeak.net> Author: arigo Date: Wed Oct 4 20:05:07 2006 New Revision: 32888 Added: pypy/dist/pypy/translator/js/demo/jsdemo/pythonconsole.py (contents, props changed) Log: A new demo based on BaseHTTPServer with MochiKit: a Python console. Added: pypy/dist/pypy/translator/js/demo/jsdemo/pythonconsole.py ============================================================================== --- (empty file) +++ pypy/dist/pypy/translator/js/demo/jsdemo/pythonconsole.py Wed Oct 4 20:05:07 2006 @@ -0,0 +1,184 @@ +#!/usr/bin/env python +""" A basic Python console from your browser. + +This depends on MochiKit for proper quoting. +You need to provide the files as ..jsdemo/MochiKit/*.js. +(Symlinks are your friends.) + +Try to type: import time; time.sleep(2); print 'hi' +""" + +import autopath + +import new, sys, os, cStringIO +from cgi import parse_qs +from pypy.translator.js.modules._dom import setTimeout, get_document +from pypy.translator.js.main import rpython2javascript +from pypy.rpython.ootypesystem.bltregistry import MethodDesc, BasicExternal +from pypy.translator.js import commproxy + +commproxy.USE_MOCHIKIT = True + +from BaseHTTPServer import HTTPServer, BaseHTTPRequestHandler +#from SimpleHTTPServer import SimpleHTTPRequestHandler + +def js_source(functions): + mod = new.module('_js_src') + function_names = [] + for func in functions: + name = func.__name__ + if hasattr(mod, name): + raise ValueError("exported function name %r is duplicated" + % (name,)) + mod.__dict__[name] = func + function_names.append(name) + sys.modules['_js_src'] = mod + try: + return rpython2javascript(mod, function_names) + finally: + del sys.modules['_js_src'] + +# ____________________________________________________________ + +HTML_PAGE = """ + + + Example +