diff --git a/uppsrc/CodeEditor/CInit.cpp b/uppsrc/CodeEditor/CInit.cpp index ef249fdb5..fc53d3be4 100644 --- a/uppsrc/CodeEditor/CInit.cpp +++ b/uppsrc/CodeEditor/CInit.cpp @@ -121,7 +121,7 @@ void CSyntax::InitKeywords() "SizeOf", "TypeName", "TypeNo", "DeRef", "Field", "NestedType", "PeekPtr", "Peek8", "Peek16", "Peek32", "Peek64", "Peek32f", "Peek64f", - "SizeOfPtr", "Offset", + "SizeOfPtr", "Offset", "Align", "LOG", diff --git a/uppsrc/ide/Debuggers/Exp.cpp b/uppsrc/ide/Debuggers/Exp.cpp index 651736469..59621781e 100644 --- a/uppsrc/ide/Debuggers/Exp.cpp +++ b/uppsrc/ide/Debuggers/Exp.cpp @@ -51,6 +51,17 @@ int Pdb::SizeOfType(const String& name) return SizeOfType(f.type); } +adr_t Pdb::Align(adr_t adr, int type) +{ + if(type == 1) + return adr; + if(type == 2) + return (adr + 1) & ~1; + if(type <= 4) + return (adr + 3) & ~3; + return (adr + 7) & ~7; +} + #define READINT0(type) { \ type x; \ if(v.address < 10000) \ diff --git a/uppsrc/ide/Debuggers/Pdb.h b/uppsrc/ide/Debuggers/Pdb.h index 693adf308..c20e34407 100644 --- a/uppsrc/ide/Debuggers/Pdb.h +++ b/uppsrc/ide/Debuggers/Pdb.h @@ -375,6 +375,7 @@ struct Pdb : Debugger, ParentCtrl { void ThrowError(const char *s); int SizeOfType(int ti); int SizeOfType(const String& name); + adr_t Align(adr_t adr, int type); adr_t PeekPtr(adr_t address); byte PeekByte(adr_t address); word PeekWord(adr_t address); @@ -403,7 +404,7 @@ struct Pdb : Debugger, ParentCtrl { Val Comparison(CParser& p); Val Exp0(CParser& p); Val Exp(CParser& p); - + bool HasAttr(Pdb::Val record, const String& id); Val GetAttr(Pdb::Val record, int i); Val GetAttr(Pdb::Val record, const String& id); @@ -451,7 +452,7 @@ struct Pdb : Debugger, ParentCtrl { void PrettyStdVector(Pdb::Val val, const Vector& tparam, int64 from, int count, Pdb::Pretty& p); void PrettyStdString(Pdb::Val val, const Vector& tparam, int64 from, int count, Pdb::Pretty& p); void TraverseTree(bool set, Val head, Val node, int64& from, int& count, Pdb::Pretty& p, int depth); - void TraverseTreeClang(bool set, int nodet, Val node, int64& from, int& count, Pdb::Pretty& p, int depth, int key_size); + void TraverseTreeClang(bool set, int nodet, Val node, int64& from, int& count, Pdb::Pretty& p, int depth, int key_size, int value_size); void PrettyStdTree(Pdb::Val val, bool set, const Vector& tparam, int64 from, int count, Pdb::Pretty& p); void PrettyStdListM(Pdb::Val val, const Vector& tparam, int64 from, int count, Pdb::Pretty& p, bool map = false); void PrettyStdList(Pdb::Val val, const Vector& tparam, int64 from, int count, Pdb::Pretty& p); diff --git a/uppsrc/ide/Debuggers/PrettyStd.cpp b/uppsrc/ide/Debuggers/PrettyStd.cpp index 8e6ae0c49..80349ce8b 100644 --- a/uppsrc/ide/Debuggers/PrettyStd.cpp +++ b/uppsrc/ide/Debuggers/PrettyStd.cpp @@ -77,21 +77,21 @@ void Pdb::TraverseTree(bool set, Pdb::Val head, Val node, int64& from, int& coun TraverseTree(set, head, DeRef(GetAttr(node, "_Right")), from, count, p, depth + 1); } -void Pdb::TraverseTreeClang(bool set, int nodet, Val node, int64& from, int& count, Pdb::Pretty& p, int depth, int key_size) +void Pdb::TraverseTreeClang(bool set, int nodet, Val node, int64& from, int& count, Pdb::Pretty& p, int depth, int key_size, int value_size) { if(depth > 40 || count <= 0) // avoid problems if tree is damaged return; Val left = DeRef(GetAttr(node, "__left_")); if(left.address) - TraverseTreeClang(set, nodet, left, from, count, p, depth + 1, key_size); + TraverseTreeClang(set, nodet, left, from, count, p, depth + 1, key_size, value_size); node.type = nodet; Val data = GetAttr(node, "__value_"); if(from == 0) { p.data_ptr.Add(data.address); if(!set) - p.data_ptr.Add((data.address + key_size + 7) & ~7); + p.data_ptr.Add(Align(data.address + key_size, value_size)); count--; } else @@ -99,7 +99,7 @@ void Pdb::TraverseTreeClang(bool set, int nodet, Val node, int64& from, int& cou Val right = DeRef(GetAttr(node, "__right_")); if(right.address) - TraverseTreeClang(set, nodet, right, from, count, p, depth + 1, key_size); + TraverseTreeClang(set, nodet, right, from, count, p, depth + 1, key_size, value_size); } void Pdb::PrettyStdTree(Pdb::Val val, bool set, const Vector& tparam, int64 from, int count, Pdb::Pretty& p) @@ -118,7 +118,7 @@ void Pdb::PrettyStdTree(Pdb::Val val, bool set, const Vector& tparam, in Val value = GetAttr(GetAttr(tree, "__pair1_"), "__value_"); p.data_count = GetIntAttr(GetAttr(tree, "__pair3_"), "__value_"); Val node = DeRef(GetAttr(value, "__left_")); - TraverseTreeClang(set, GetTypeInfo(nodet).type, node, from, count, p, 0, SizeOfType(tparam[0])); + TraverseTreeClang(set, GetTypeInfo(nodet).type, node, from, count, p, 0, SizeOfType(tparam[0]), SizeOfType(tparam[1])); } else { val = GetAttr(GetAttr(GetAttr(val, "_Mypair"), "_Myval2"), "_Myval2"); @@ -248,6 +248,7 @@ void Pdb::PrettyStdUnordered(Pdb::Val val, bool set, const Vector& tpara int ntype = GetTypeInfo(nodet).type; adr_t next = DeRef(GetAttr(GetAttr(GetAttr(val, "__p1_"), "__value_"), "__next_")).address; int key_size = SizeOfType(tparam[0]); + int value_size = SizeOfType(tparam[1]); while(next && count > 0) { Val v = val; v.type = ntype; @@ -256,7 +257,7 @@ void Pdb::PrettyStdUnordered(Pdb::Val val, bool set, const Vector& tpara Val vl = GetAttr(v, "__value_"); p.data_ptr.Add(vl.address); if(!set) - p.data_ptr.Add((vl.address + key_size + 7) & ~7); + p.data_ptr.Add(Align(vl.address + key_size, value_size)); } else from--; diff --git a/uppsrc/ide/Debuggers/Scripts.cpp b/uppsrc/ide/Debuggers/Scripts.cpp index 876140e20..56a4cdfb3 100644 --- a/uppsrc/ide/Debuggers/Scripts.cpp +++ b/uppsrc/ide/Debuggers/Scripts.cpp @@ -134,6 +134,9 @@ void Pdb::LoadPrettyScripts() SetVal(v, val); e = v; }); + Escape(pretty_globals, "Align(adr, sz)", [=](EscEscape& e) { + e = (int64)Align(e[0].GetInt64(), e[1].GetInt64()); + }); } void Pdb::SetVal(EscValue& v, Pdb::Val val) diff --git a/uppsrc/ide/app.tpp/dbg_en-us.tpp b/uppsrc/ide/app.tpp/dbg_en-us.tpp index ef99e122e..0ccb1fbf7 100644 --- a/uppsrc/ide/app.tpp/dbg_en-us.tpp +++ b/uppsrc/ide/app.tpp/dbg_en-us.tpp @@ -100,7 +100,10 @@ to x.address `= PeekPtr(x.address).] :: [s0; [*@(0.0.255) Field](x, id)] :: [s0; Parameter must be map with `"address`" and `"type`". id should be the name of member variable of `"type`". Returns new map with -`"address`" and `"type`" corresponding to the given member variable.]}}&] +`"address`" and `"type`" corresponding to the given member variable.] +:: [s0; [*@(0.0.255) Align](address, size)] +:: [s0; Adjusts [*@(0.0.255) address ]for proper standard alignment for +element with [*@(0.0.255) size].]}}&] [s0; &] [s0; &] [s0; Output functions&] diff --git a/uppsrc/ide/app.tpp/dbg_en-us.tppi b/uppsrc/ide/app.tpp/dbg_en-us.tppi index 9dd803d50..eea289be0 100644 --- a/uppsrc/ide/app.tpp/dbg_en-us.tppi +++ b/uppsrc/ide/app.tpp/dbg_en-us.tppi @@ -1,14 +1,14 @@ TITLE("Debugger pretty printing scripts") COMPRESSED -120,156,189,89,11,111,219,70,18,254,43,139,58,119,144,19,89,225,190,248,144,174,64,123,182,123,13,14,117,140,216,193,221,193,80,35,138,92,201,68,40,82,199,71,28,55,72,127,251,125,179,36,69,73,145,146,246,138,52,129,157,21,197,153,249,230,155,199,206,110,238,82,225,251,147,132,115,225,76,66,238,77,94,6,147,95,127,253,117,196,149,227,79,4,123,242,132,15,157,19,238,40,201,5,199,51,71,9,143,235,192,9,180,207,125,71,122,74,104,207,209,227,117,88,132,171,233,93,232,203,201,211,87,46,164,196,80,159,72,46,185,195,93,161,240,150,35,29,161,184,208,220,247,21,247,180,47,3,215,29,71,225,186,74,242,108,122,247,163,154,204,73,84,65,82,66,210,241,124,87,113,200,41,45,164,167,21,228,149,2,66,9,219,158,235,121,227,42,169,82,51,189,75,8,58,0,159,19,80,53,116,79,0,80,120,144,84,66,185,74,250,66,114,95,8,55,144,42,80,64,206,197,56,169,12,112,206,149,152,132,248,89,223,147,160,134,69,165,21,151,14,220,243,180,196,139, -30,254,85,78,192,5,204,250,142,214,176,104,222,87,211,59,203,213,28,44,17,83,36,235,194,168,240,52,73,248,202,231,210,243,133,18,174,0,12,199,131,183,132,65,143,99,83,70,144,149,130,79,206,191,211,207,60,13,65,111,232,157,8,39,112,132,235,5,48,8,184,240,88,6,1,151,62,12,42,174,29,46,199,81,30,195,203,185,208,142,180,214,124,196,194,133,86,75,138,118,57,0,11,233,195,156,199,165,196,111,173,124,111,92,26,138,70,149,23,211,187,167,223,13,156,145,51,18,90,159,146,120,0,113,95,42,41,149,27,40,238,72,152,129,14,69,140,185,14,226,201,181,240,199,243,176,132,77,203,40,119,32,0,206,165,175,37,140,186,248,133,144,194,45,9,86,68,160,124,41,125,103,28,165,97,89,182,212,16,45,79,57,137,242,33,231,39,30,49,170,165,80,1,81,34,5,168,21,174,14,56,184,213,174,114,196,184,48,255,173,147,194,172,76,6,114,19,100,198,164,11,77,155,134,64,214,100,161,24,114,129,60,212,174,235,16,83,26,137,32,164,6,205,14,247,21, -16,225,47,194,91,181,137,56,231,174,215,100,5,151,67,46,79,2,161,36,144,4,74,193,119,40,224,1,231,220,241,241,23,158,129,17,155,23,188,77,168,214,124,35,174,134,92,157,120,200,96,196,40,80,100,62,144,196,156,0,241,194,117,52,34,32,26,113,65,124,139,39,96,156,11,159,126,44,231,92,15,57,74,1,16,185,214,240,91,130,100,225,195,119,13,214,165,77,109,238,249,227,43,243,80,94,132,149,105,211,228,233,249,147,38,191,184,59,228,238,137,67,242,218,15,16,58,174,136,63,169,84,32,2,41,181,8,180,116,29,240,88,214,105,213,10,83,41,217,74,220,40,241,134,220,67,81,193,87,173,225,189,21,131,231,30,39,40,194,15,92,98,161,85,50,59,75,147,140,112,32,39,160,226,25,231,30,169,240,81,36,190,239,58,50,0,13,240,222,209,200,108,116,1,31,33,70,132,5,210,158,218,64,244,54,92,154,217,89,91,159,214,56,101,157,150,218,167,92,133,36,64,195,60,244,4,142,227,226,137,239,163,122,198,203,112,221,38,157,112,134,194,65,230,160,221, -104,148,31,172,32,229,156,128,90,7,186,0,88,71,231,9,116,147,117,179,179,204,148,149,137,17,112,237,88,87,5,31,10,14,190,144,115,90,251,74,185,64,10,171,30,117,34,10,27,74,85,123,114,124,29,22,13,58,202,112,231,11,127,198,23,102,17,90,122,63,188,249,248,151,203,171,179,215,55,236,174,20,19,118,97,230,245,114,105,10,182,46,76,85,61,226,159,36,171,146,108,201,202,168,72,214,85,249,215,233,93,233,76,216,237,125,82,178,133,9,171,186,48,12,203,168,46,10,36,124,250,200,242,12,191,194,119,97,146,134,243,20,223,101,236,95,73,22,231,15,37,187,190,248,59,139,91,245,163,86,207,70,157,121,113,113,185,243,6,139,194,140,213,165,233,12,15,89,137,250,55,49,105,28,197,243,37,91,36,169,41,233,83,27,33,188,81,229,44,78,202,117,26,62,146,100,1,93,11,196,61,102,213,227,26,175,102,73,100,128,13,18,213,189,233,145,176,155,198,0,91,20,249,106,91,117,8,215,210,60,140,161,32,172,172,76,89,133,69,197,242,69,43,12,90,246, -252,232,84,145,40,53,157,24,116,176,187,159,171,124,157,68,179,241,236,249,236,249,101,25,205,158,151,69,20,231,81,243,225,141,201,102,103,117,249,51,195,135,105,235,44,241,157,134,217,178,134,91,71,44,16,59,81,158,85,33,185,243,144,179,183,32,185,4,1,107,228,186,121,103,82,102,82,219,130,202,93,241,237,246,201,22,25,155,222,61,103,139,58,139,104,207,26,216,70,83,158,178,233,236,3,27,141,216,236,227,174,108,195,102,73,64,55,50,163,207,168,39,214,179,112,101,172,17,250,240,37,197,141,243,108,145,127,154,125,224,188,85,50,237,2,198,10,19,153,228,29,228,22,121,154,230,15,244,90,178,90,167,73,148,84,8,242,186,174,152,117,200,84,166,216,98,129,125,248,64,197,51,118,181,150,63,179,79,81,191,11,211,218,76,167,227,113,243,221,79,225,154,140,207,190,9,227,24,205,164,156,125,195,194,44,198,103,194,130,15,89,189,154,67,255,16,104,128,185,52,13,92,74,22,171,136,82,210,58,49,218,104,220,229,200,0,49,122,228,236,77,211,229,55,111,189, -88,88,37,150,54,212,87,247,222,16,169,85,32,189,1,169,123,180,229,37,27,216,76,63,29,81,65,161,116,234,178,14,83,164,252,50,103,69,178,188,175,88,248,0,89,64,122,113,123,249,211,236,205,237,127,174,47,143,224,162,90,216,7,131,156,166,188,94,161,109,36,235,180,117,16,54,27,101,231,47,95,95,221,178,135,176,164,210,139,79,135,40,162,162,172,122,22,16,208,186,200,216,192,140,150,35,246,144,84,247,45,136,235,219,87,167,135,49,208,6,84,254,65,16,77,120,136,174,246,197,13,146,209,244,227,94,26,98,175,10,109,112,45,233,171,48,75,214,53,8,70,150,111,210,125,63,143,92,129,60,146,254,161,60,186,73,126,49,47,23,211,193,251,222,187,87,214,112,217,180,18,124,109,163,8,91,35,118,221,133,208,214,245,156,58,13,146,102,57,108,160,116,78,20,0,181,110,184,219,203,63,52,40,8,204,107,108,182,7,169,188,197,203,87,176,112,20,142,173,211,227,112,126,55,140,35,105,101,113,228,211,65,217,163,56,207,179,119,166,168,40,52,100,164,113,156, -194,180,101,243,136,182,107,99,222,94,87,197,158,83,33,250,96,200,214,57,138,14,136,154,252,179,173,221,54,109,179,227,30,42,203,36,148,85,135,157,219,212,252,103,0,248,7,205,207,31,171,175,106,149,187,7,204,114,119,118,54,183,205,175,50,180,131,126,69,251,82,28,176,47,197,159,102,223,85,7,236,187,234,79,244,127,191,180,183,9,248,225,186,211,60,88,96,130,168,78,191,46,21,135,160,116,92,108,65,137,243,26,19,217,87,195,210,52,60,91,143,159,111,121,93,105,14,48,186,80,157,96,226,192,106,3,72,217,1,160,163,114,133,227,226,144,249,246,89,235,211,17,251,87,118,108,166,14,51,29,84,67,150,196,7,80,108,183,177,5,107,6,237,118,143,141,71,172,250,173,237,238,8,130,11,243,202,236,198,162,39,119,85,99,51,156,155,195,132,238,210,68,173,120,255,21,26,47,210,48,2,90,251,205,110,119,43,16,241,189,168,222,36,43,12,224,5,245,209,247,163,86,11,155,125,219,181,204,193,230,225,233,17,95,126,72,76,26,195,151,93,34,127,155,63,59, -19,210,8,10,88,121,159,215,105,108,169,221,218,108,86,198,50,252,46,44,18,123,86,176,115,86,39,213,81,146,153,135,47,27,193,40,140,243,71,185,206,179,184,219,61,96,103,137,233,48,219,183,242,233,190,223,254,243,178,174,104,102,60,182,213,123,180,213,139,131,91,253,237,229,191,111,45,85,81,158,34,93,64,51,239,41,251,62,166,185,220,188,199,185,161,49,96,39,194,157,233,118,196,222,239,238,251,148,116,237,206,215,234,68,109,150,107,19,37,139,4,41,48,127,236,146,211,6,157,92,237,71,224,210,84,227,6,179,139,211,235,31,248,177,240,191,101,78,231,9,188,234,151,162,95,202,126,169,250,165,238,151,110,191,244,250,165,223,47,131,45,19,219,230,182,236,241,45,131,124,203,34,223,50,201,201,230,119,78,67,59,45,101,191,84,253,114,208,94,101,140,156,211,254,161,222,251,190,141,108,255,176,191,1,233,31,242,126,233,238,188,10,217,29,237,3,122,64,63,60,16,187,74,63,177,99,69,247,30,250,253,210,235,151,162,93,126,252,120,184,130,183,38,226,189,253, -97,157,23,85,59,246,109,122,161,29,182,187,179,113,123,176,164,244,195,212,157,229,212,24,211,212,196,195,173,131,13,50,178,61,107,211,249,24,205,229,155,18,233,151,82,49,14,178,124,75,115,119,16,181,5,139,111,210,164,172,182,159,227,180,242,99,254,128,51,107,49,100,134,10,182,209,211,154,193,169,15,165,49,221,156,117,251,147,139,213,183,57,67,12,217,195,125,18,221,163,3,150,201,50,163,99,209,142,26,20,29,170,171,7,220,109,56,203,163,195,101,111,232,232,208,108,183,137,238,104,1,251,57,142,92,93,175,5,61,205,57,163,107,217,121,102,223,221,0,110,26,18,252,31,177,243,166,246,27,142,251,163,77,149,172,232,100,179,185,16,129,201,172,115,1,0,234,53,93,82,204,206,232,168,179,168,83,187,67,162,81,30,237,232,27,203,211,65,24,23,123,13,42,108,157,232,224,31,224,107,247,210,228,122,247,94,168,235,240,228,3,222,164,81,226,125,24,209,125,208,129,35,93,235,25,1,54,97,116,191,125,26,101,223,55,247,11,159,222,131,16,163,148,137,157,222, -69,88,210,46,95,209,243,57,218,169,177,155,29,93,24,109,28,189,161,62,218,124,186,184,124,117,249,67,251,48,201,176,237,135,241,151,104,186,177,60,13,89,249,203,208,246,217,97,131,126,143,184,221,131,104,199,95,19,152,85,13,231,8,103,183,253,100,54,241,91,198,232,34,156,246,24,111,146,66,25,200,24,36,180,117,96,157,176,191,53,182,176,156,61,155,61,59,237,95,179,127,54,16,7,155,157,253,25,35,233,103,22,232,41,155,61,5,234,35,167,234,79,248,104,221,252,63,92,196,62,20,227,64,190,48,89,68,145,106,135,146,242,119,122,94,254,66,110,111,166,199,193,233,228,143,178,210,13,57,159,101,231,116,114,100,140,189,125,245,226,234,31,219,51,236,13,53,148,212,214,196,86,45,134,221,221,70,63,219,236,244,195,102,39,31,109,55,172,110,102,42,115,204,63,116,97,103,27,111,123,88,177,205,196,170,77,202,166,212,45,155,52,42,52,10,95,95,189,56,127,121,113,201,162,123,12,97,17,17,125,36,131,207,127,124,125,245,207,157,166,181,185,212,205,242,98, -101,111,132,0,174,185,12,161,11,78,219,73,187,139,211,182,187,219,237,0,1,166,255,143,113,96,179,206,222,150,93,143,93,217,187,36,56,2,36,177,45,227,246,142,150,20,174,194,140,170,53,164,251,185,176,204,51,59,217,97,118,49,141,25,219,11,49,163,96,248,201,35,4,199,182,144,202,172,75,236,11,171,4,21,109,236,156,99,65,38,11,212,51,189,208,55,205,205,189,99,227,165,29,155,10,19,215,145,105,186,78,187,237,0,7,145,140,71,144,94,229,133,105,97,29,30,0,55,244,220,155,116,77,83,85,107,132,212,68,240,162,50,155,46,247,22,187,86,149,103,159,220,94,55,183,224,33,107,193,99,232,204,106,134,221,173,120,108,98,74,154,203,198,121,171,209,214,203,225,27,246,241,174,242,233,244,127,108,152,207,39, +120,156,189,89,11,115,219,198,17,254,43,55,145,219,161,108,138,198,189,240,32,219,153,164,146,210,120,58,145,53,182,60,109,71,195,152,32,112,164,80,131,0,139,135,101,197,227,252,246,126,123,0,8,146,34,237,164,25,199,30,201,71,16,187,251,237,183,143,219,59,223,166,194,247,39,9,231,194,153,132,220,155,188,12,38,191,252,242,203,136,43,199,159,8,246,228,9,31,58,39,220,81,146,11,142,103,142,18,30,215,129,19,104,159,251,142,244,148,208,158,163,199,235,176,8,87,211,219,208,151,147,167,175,92,72,137,161,62,145,92,114,135,187,66,225,45,71,58,66,113,161,185,239,43,238,105,95,6,174,59,142,194,117,149,228,217,244,246,7,53,153,147,168,130,164,132,164,227,249,174,226,144,83,90,72,79,43,200,43,5,132,18,182,61,215,243,198,85,82,165,102,122,155,16,116,0,62,39,160,106,232,158,0,160,240,32,169,132,114,149,244,133,228,190,16,110,32,85,160,128,156,139,113,82,25,224,156,43,49,9,241,179,190,35,65,13,139,74,43,46,29,184,231,105,137,23, +61,252,171,156,128,11,152,245,29,173,97,209,124,168,166,183,150,171,57,88,34,166,72,214,133,81,225,105,146,240,149,207,165,231,11,37,92,1,24,142,7,111,9,131,30,199,166,140,32,43,5,159,156,127,171,159,121,26,130,222,208,59,17,78,224,8,215,11,96,16,112,225,177,12,2,46,125,24,84,92,59,92,142,163,60,134,151,115,161,29,105,173,249,136,133,11,173,150,20,237,114,0,22,210,135,57,143,75,137,223,90,249,222,184,52,20,141,42,47,166,183,79,191,29,56,35,103,36,180,62,37,241,0,226,190,84,82,42,55,80,220,145,48,3,29,138,24,115,29,196,147,107,225,143,231,97,9,155,150,81,238,64,0,156,75,95,75,24,117,241,11,33,133,91,18,172,136,64,249,82,250,206,56,74,195,178,108,169,33,90,158,114,18,229,67,206,79,60,98,84,75,161,2,162,68,10,80,43,92,29,112,112,171,93,229,136,113,97,254,91,39,133,89,153,12,228,38,200,140,73,23,154,54,13,129,172,201,66,49,228,2,121,168,93,215,33,166,52,18,65,72,13,154,29,238,43, +32,194,95,132,183,106,19,113,206,93,175,201,10,46,135,92,158,4,66,73,32,9,148,130,239,80,192,3,206,185,227,227,47,60,3,35,54,47,120,155,80,173,249,70,92,13,185,58,241,144,193,136,81,160,200,124,32,137,57,1,226,133,235,104,68,64,52,226,130,248,22,79,192,56,23,62,253,88,206,185,30,114,148,2,32,114,173,225,183,4,201,194,135,239,26,172,75,155,218,220,243,199,87,230,190,188,8,43,211,166,201,211,243,39,77,126,113,119,200,221,19,135,228,181,31,32,116,92,17,127,82,169,64,4,82,106,17,104,233,58,224,177,172,211,170,21,166,82,178,149,184,81,226,13,185,135,162,130,175,90,195,123,43,6,207,61,78,80,132,31,184,196,66,171,100,118,150,38,25,225,64,78,64,197,51,206,61,82,225,163,72,124,223,117,100,0,26,224,189,163,145,217,232,2,62,66,140,8,11,164,61,181,129,232,93,184,52,179,179,182,62,173,113,202,58,45,181,79,185,10,73,128,134,121,232,9,28,199,197,19,223,71,245,140,151,225,186,77,58,225,12,133,131,204,65,187, +209,40,63,88,65,202,57,1,181,14,116,1,176,142,206,19,232,38,235,102,103,153,41,43,19,35,224,218,177,174,10,62,20,28,124,33,231,180,246,149,114,129,20,86,61,234,68,20,54,148,170,246,228,248,58,44,26,116,148,225,206,23,254,140,47,204,34,180,244,126,124,251,233,79,151,87,103,111,94,179,219,82,76,216,133,153,215,203,165,41,216,186,48,85,245,128,127,146,172,74,178,37,43,163,34,89,87,229,159,167,183,165,51,97,55,119,73,201,22,38,172,234,194,48,44,163,186,40,144,240,233,3,203,51,252,10,223,135,73,26,206,83,124,151,177,127,38,89,156,223,151,236,250,226,111,44,110,213,143,90,61,27,117,230,197,197,229,206,27,44,10,51,86,151,166,51,60,100,37,234,223,196,164,113,20,207,151,108,145,164,166,164,79,109,132,240,70,149,179,56,41,215,105,248,64,146,5,116,45,16,247,152,85,15,107,188,154,37,145,1,54,72,84,119,166,71,194,94,55,6,216,162,200,87,219,170,67,184,150,230,97,12,5,97,101,101,202,42,44,42,150,47,90,97,208,178, +231,71,167,138,68,169,233,196,160,131,221,254,84,229,235,36,154,141,103,207,103,207,47,203,104,246,188,44,162,56,143,154,15,111,77,54,59,171,203,159,24,62,76,91,103,137,239,52,204,150,53,220,58,98,129,216,137,242,172,10,201,157,251,156,189,3,201,37,8,88,35,215,205,123,147,50,147,218,22,84,238,138,111,183,79,182,200,216,244,246,57,91,212,89,68,123,214,192,54,154,242,148,77,103,31,217,104,196,102,159,118,101,27,54,75,2,186,145,25,125,70,61,177,158,133,43,99,141,208,135,47,41,110,156,103,139,252,113,246,129,243,86,201,180,11,24,43,76,100,146,247,144,91,228,105,154,223,211,107,201,106,157,38,81,82,33,200,235,186,98,214,33,83,153,98,139,5,246,241,35,21,207,216,213,90,254,196,30,163,126,31,166,181,153,78,199,227,230,187,31,195,53,25,159,125,19,198,49,154,73,57,251,134,133,89,140,207,132,5,31,178,122,53,135,254,33,208,0,115,105,26,184,148,44,86,17,165,164,117,98,180,209,184,203,145,1,98,244,200,217,219,166,203,111,222,122, +177,176,74,44,109,168,175,238,189,33,82,171,64,122,3,82,247,104,203,75,54,176,153,126,58,162,130,66,233,212,101,29,166,72,249,101,206,138,100,121,87,177,240,30,178,128,244,226,230,242,199,217,219,155,127,95,95,30,193,69,181,176,15,6,57,77,121,189,66,219,72,214,105,235,32,108,54,202,206,95,190,185,186,97,247,97,73,165,23,159,14,81,68,69,89,245,44,32,160,117,145,177,129,25,45,71,236,62,169,238,90,16,215,55,175,78,15,99,160,13,168,252,157,32,154,240,16,93,237,139,27,36,163,233,167,189,52,196,94,21,218,224,90,210,87,97,150,172,107,16,140,44,223,164,251,126,30,185,2,121,36,253,67,121,244,58,249,217,188,92,76,7,31,122,239,94,89,195,101,211,74,240,181,141,34,108,141,216,117,23,66,91,215,115,234,52,72,154,229,176,129,210,57,81,0,212,186,225,110,47,255,208,160,32,48,175,177,217,30,164,242,6,47,95,193,194,81,56,182,78,143,195,249,205,48,142,164,149,197,145,79,7,101,143,226,60,207,222,155,162,162,208,144,145,198,113, +10,211,150,205,35,218,174,141,121,119,93,21,123,78,133,232,131,33,91,231,40,58,32,106,242,207,182,118,219,180,205,142,123,168,44,147,80,86,29,118,110,83,243,159,1,224,31,52,63,127,168,190,170,85,238,30,48,203,221,217,217,220,54,191,202,208,14,250,21,237,75,113,192,190,20,127,152,125,87,29,176,239,170,63,208,255,253,210,222,38,224,251,235,78,243,96,129,9,162,58,253,186,84,28,130,210,113,177,5,37,206,107,76,100,95,13,75,211,240,108,61,126,190,229,117,165,57,192,232,66,117,130,137,3,171,13,32,101,7,128,142,202,21,142,139,67,230,219,103,173,79,71,236,95,217,177,153,58,204,116,80,13,89,18,31,64,177,221,198,22,172,25,180,219,61,54,30,177,234,215,182,187,35,8,46,204,43,179,27,139,158,220,85,141,205,112,110,14,19,186,75,19,181,226,253,87,104,188,72,195,8,104,237,55,187,221,173,64,196,247,162,250,58,89,97,0,47,168,143,126,24,181,90,216,236,175,93,203,28,108,30,158,30,241,229,251,196,164,49,124,217,37,242,215,249,179, +51,33,141,160,128,149,119,121,157,198,150,218,173,205,102,101,44,195,239,195,34,177,103,5,59,103,117,82,29,37,153,185,255,178,17,140,194,56,127,148,235,60,139,187,221,3,118,150,152,14,179,125,43,71,252,253,46,77,150,217,116,208,170,31,218,100,237,253,254,46,254,15,252,45,119,69,58,90,167,205,192,154,175,97,5,39,132,44,14,11,156,24,72,31,13,224,54,115,219,97,188,113,98,71,9,217,153,62,158,69,218,127,94,214,21,205,177,199,198,15,143,198,15,113,112,252,184,185,252,215,141,13,95,148,167,0,128,208,243,109,119,232,172,96,62,224,44,211,24,176,83,234,206,196,61,98,31,118,103,17,42,132,118,55,110,117,162,95,148,107,19,37,139,4,105,57,127,232,10,198,38,34,209,223,143,229,165,169,198,13,102,23,39,234,223,241,99,225,255,149,57,157,39,240,170,95,138,126,41,251,165,234,151,186,95,186,253,210,235,151,126,191,12,182,76,108,155,219,178,199,183,12,242,45,139,124,203,36,39,155,223,58,13,237,180,148,253,82,245,203,65,123,189,50,114,78, +251,135,122,239,251,54,178,253,195,254,86,166,127,200,251,165,187,243,42,100,119,180,15,232,1,253,240,64,236,42,125,100,199,138,238,61,244,251,165,215,47,69,187,252,244,233,112,149,109,77,233,123,123,214,58,47,170,118,20,221,244,103,123,0,232,206,235,237,97,151,210,15,39,129,44,167,102,157,166,38,30,110,29,182,144,145,237,249,159,206,236,104,120,223,148,72,191,148,26,196,32,203,183,52,119,135,99,219,68,240,77,154,148,213,246,115,156,160,126,200,239,113,142,46,134,204,80,19,105,244,180,102,112,18,69,105,76,55,231,239,254,52,101,245,109,206,53,67,118,127,151,68,119,232,202,37,154,1,29,213,118,212,160,232,80,93,61,224,110,19,92,30,29,120,123,67,71,7,121,187,117,117,199,29,216,207,113,12,236,26,21,232,105,206,62,221,54,146,103,246,221,13,224,166,73,194,255,17,59,111,106,191,225,184,63,110,85,201,138,78,91,155,75,26,152,204,58,23,0,160,94,211,197,201,236,140,142,95,139,58,181,189,15,205,251,232,46,179,177,76,157,183,216,107,80,97, +235,68,7,255,0,95,187,23,57,215,187,119,85,221,174,67,62,224,77,26,111,62,132,17,221,81,29,56,102,182,158,217,102,29,70,119,219,39,100,246,93,115,231,241,248,110,134,24,165,76,236,244,46,194,146,38,143,138,158,207,209,78,141,221,128,233,18,107,227,232,107,234,163,205,167,139,203,87,151,223,183,15,147,12,163,72,24,127,137,166,215,150,39,236,78,63,15,109,159,29,54,232,247,136,219,61,28,119,252,53,129,89,213,112,142,112,118,91,98,102,19,191,101,140,46,231,105,143,241,38,41,148,129,140,65,66,91,7,214,9,251,75,99,11,203,217,179,217,179,211,254,53,251,103,3,113,176,153,54,158,49,146,126,102,129,158,178,217,83,160,62,114,210,127,196,71,235,230,255,225,34,246,161,216,20,102,97,178,136,34,213,14,74,229,111,244,188,252,153,220,222,76,180,131,211,201,239,101,165,27,188,62,203,206,233,228,200,104,125,243,234,197,213,223,183,231,234,215,212,80,82,91,19,91,181,24,118,247,45,253,188,181,211,15,155,157,124,180,221,176,186,57,174,204,49,147, +209,37,162,109,188,237,1,202,54,19,171,54,41,155,82,183,108,210,168,208,40,124,115,245,226,252,229,197,37,139,238,48,24,70,68,244,145,12,62,255,225,205,213,63,118,154,214,230,162,57,203,139,149,189,165,2,184,230,130,134,46,93,109,39,237,46,115,219,238,110,183,3,4,152,254,143,200,129,205,58,123,87,118,61,118,101,239,183,224,200,29,77,95,84,198,237,189,49,41,92,133,25,85,107,72,119,134,97,153,103,118,218,196,236,98,26,51,182,23,98,70,161,33,46,66,112,108,11,169,204,186,196,190,176,74,80,209,198,206,57,22,100,178,64,61,211,11,125,211,220,220,133,54,94,218,177,169,48,113,29,153,166,235,180,219,14,112,16,201,120,4,233,85,94,152,22,86,51,148,62,186,140,234,232,185,51,41,13,150,157,17,82,19,193,139,202,108,186,220,59,236,90,85,158,61,186,81,111,110,230,67,214,130,199,32,156,213,12,187,91,241,208,196,148,52,151,141,243,86,163,173,151,195,183,254,227,93,229,211,233,255,0,65,240,253,78,