diff --git a/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/AsyncCommandManager.cs b/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/AsyncCommandManager.cs index b3d24243b0..df6fc7fa32 100755 --- a/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/AsyncCommandManager.cs +++ b/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/AsyncCommandManager.cs @@ -232,7 +232,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api } catch ( System.Threading.ThreadAbortException) { - Thread.ResetAbort(); + //Thread.ResetAbort(); running = false; } catch (Exception e) diff --git a/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/LSL_Api.cs b/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/LSL_Api.cs index cc1d0ebee4..e3d3b7208c 100644 --- a/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/LSL_Api.cs +++ b/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/LSL_Api.cs @@ -527,19 +527,6 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api m_sleepMsOnEmail = EMAIL_PAUSE_TIME * 1000; } - public override Object InitializeLifetimeService() - { - ILease lease = (ILease)base.InitializeLifetimeService(); - - if (lease.CurrentState == LeaseState.Initial) - { - lease.InitialLeaseTime = TimeSpan.FromMinutes(0); -// lease.RenewOnCallTime = TimeSpan.FromSeconds(10.0); -// lease.SponsorshipTimeout = TimeSpan.FromMinutes(1.0); - } - return lease; - } - protected SceneObjectPart MonitoringObject() { UUID m = m_host.ParentGroup.MonitoringObject; diff --git a/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/LS_Api.cs b/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/LS_Api.cs index 10941b8fec..a3f198e239 100644 --- a/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/LS_Api.cs +++ b/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/LS_Api.cs @@ -29,7 +29,6 @@ using System; using System.Reflection; using System.Collections; using System.Collections.Generic; -using System.Runtime.Remoting.Lifetime; using System.Threading; using OpenMetaverse; using Nini.Config; @@ -83,19 +82,6 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api m_environment = m_ScriptEngine.World.RequestModuleInterface(); } - public override Object InitializeLifetimeService() - { - ILease lease = (ILease)base.InitializeLifetimeService(); - - if (lease.CurrentState == LeaseState.Initial) - { - lease.InitialLeaseTime = TimeSpan.FromMinutes(0); - //lease.RenewOnCallTime = TimeSpan.FromSeconds(10.0); - //lease.SponsorshipTimeout = TimeSpan.FromMinutes(1.0); - } - return lease; - } - public Scene World { get { return m_ScriptEngine.World; } diff --git a/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/MOD_Api.cs b/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/MOD_Api.cs index b73a1418f4..289d1e4927 100644 --- a/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/MOD_Api.cs +++ b/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/MOD_Api.cs @@ -29,7 +29,6 @@ using System; using System.Reflection; using System.Collections; using System.Collections.Generic; -using System.Runtime.Remoting.Lifetime; using System.Threading; using log4net; using OpenMetaverse; @@ -86,19 +85,6 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api m_MODFunctionsEnabled = false; } - public override Object InitializeLifetimeService() - { - ILease lease = (ILease)base.InitializeLifetimeService(); - - if (lease.CurrentState == LeaseState.Initial) - { - lease.InitialLeaseTime = TimeSpan.FromMinutes(0); -// lease.RenewOnCallTime = TimeSpan.FromSeconds(10.0); -// lease.SponsorshipTimeout = TimeSpan.FromMinutes(1.0); - } - return lease; - } - public Scene World { get { return m_ScriptEngine.World; } diff --git a/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/OSSL_Api.cs b/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/OSSL_Api.cs index fc755705ca..cdbcc28aa7 100644 --- a/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/OSSL_Api.cs +++ b/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/OSSL_Api.cs @@ -43,7 +43,6 @@ using System.Collections; using System.Collections.Concurrent; using System.Collections.Generic; using System.Reflection; -using System.Runtime.Remoting.Lifetime; using System.Text; using System.Text.RegularExpressions; using System.Threading; @@ -250,19 +249,6 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api } } - public override Object InitializeLifetimeService() - { - ILease lease = (ILease)base.InitializeLifetimeService(); - - if (lease.CurrentState == LeaseState.Initial) - { - lease.InitialLeaseTime = TimeSpan.FromMinutes(0); -// lease.RenewOnCallTime = TimeSpan.FromSeconds(10.0); -// lease.SponsorshipTimeout = TimeSpan.FromMinutes(1.0); - } - return lease; - } - public Scene World { get { return m_ScriptEngine.World; } diff --git a/OpenSim/Region/ScriptEngine/Shared/Api/Runtime/Executor.cs b/OpenSim/Region/ScriptEngine/Shared/Api/Runtime/Executor.cs index 76988e4bfe..f26af383df 100644 --- a/OpenSim/Region/ScriptEngine/Shared/Api/Runtime/Executor.cs +++ b/OpenSim/Region/ScriptEngine/Shared/Api/Runtime/Executor.cs @@ -29,7 +29,6 @@ using System; using System.Collections.Generic; using System.Diagnostics; //for [DebuggerNonUserCode] using System.Reflection; -using System.Runtime.Remoting.Lifetime; using OpenSim.Region.ScriptEngine.Shared; using OpenSim.Region.ScriptEngine.Shared.ScriptBase; using log4net; diff --git a/OpenSim/Region/ScriptEngine/Shared/Api/Runtime/LSL_Stub.cs b/OpenSim/Region/ScriptEngine/Shared/Api/Runtime/LSL_Stub.cs index 151daf1232..f71c420659 100644 --- a/OpenSim/Region/ScriptEngine/Shared/Api/Runtime/LSL_Stub.cs +++ b/OpenSim/Region/ScriptEngine/Shared/Api/Runtime/LSL_Stub.cs @@ -27,7 +27,6 @@ using System; using System.Diagnostics; //for [DebuggerNonUserCode] -using System.Runtime.Remoting.Lifetime; using System.Threading; using System.Reflection; using System.Collections; diff --git a/OpenSim/Region/ScriptEngine/Shared/Api/Runtime/LS_Stub.cs b/OpenSim/Region/ScriptEngine/Shared/Api/Runtime/LS_Stub.cs index 2e27f16725..4d35a828cf 100644 --- a/OpenSim/Region/ScriptEngine/Shared/Api/Runtime/LS_Stub.cs +++ b/OpenSim/Region/ScriptEngine/Shared/Api/Runtime/LS_Stub.cs @@ -26,7 +26,6 @@ */ using System; -using System.Runtime.Remoting.Lifetime; using System.Threading; using System.Reflection; using System.Collections; diff --git a/OpenSim/Region/ScriptEngine/Shared/Api/Runtime/MOD_Stub.cs b/OpenSim/Region/ScriptEngine/Shared/Api/Runtime/MOD_Stub.cs index 1c47138922..0df8e794d0 100644 --- a/OpenSim/Region/ScriptEngine/Shared/Api/Runtime/MOD_Stub.cs +++ b/OpenSim/Region/ScriptEngine/Shared/Api/Runtime/MOD_Stub.cs @@ -26,7 +26,6 @@ */ using System; -using System.Runtime.Remoting.Lifetime; using System.Threading; using System.Reflection; using System.Collections; diff --git a/OpenSim/Region/ScriptEngine/Shared/Api/Runtime/OSSL_Stub.cs b/OpenSim/Region/ScriptEngine/Shared/Api/Runtime/OSSL_Stub.cs index c8fb775b16..b64f839697 100644 --- a/OpenSim/Region/ScriptEngine/Shared/Api/Runtime/OSSL_Stub.cs +++ b/OpenSim/Region/ScriptEngine/Shared/Api/Runtime/OSSL_Stub.cs @@ -26,7 +26,6 @@ */ using System; -using System.Runtime.Remoting.Lifetime; using System.Threading; using System.Reflection; using System.Collections; diff --git a/OpenSim/Region/ScriptEngine/Shared/Api/Runtime/ScriptBase.cs b/OpenSim/Region/ScriptEngine/Shared/Api/Runtime/ScriptBase.cs index 2ee4a74433..561b675a1f 100644 --- a/OpenSim/Region/ScriptEngine/Shared/Api/Runtime/ScriptBase.cs +++ b/OpenSim/Region/ScriptEngine/Shared/Api/Runtime/ScriptBase.cs @@ -26,45 +26,16 @@ */ using System; -using System.Runtime.Remoting; -using System.Runtime.Remoting.Lifetime; -using System.Security.Permissions; -using System.Threading; using System.Reflection; -using System.Collections; using System.Collections.Generic; using System.Diagnostics; //for [DebuggerNonUserCode] using OpenSim.Region.ScriptEngine.Interfaces; -using OpenSim.Region.ScriptEngine.Shared; -using OpenSim.Region.ScriptEngine.Shared.Api.Runtime; namespace OpenSim.Region.ScriptEngine.Shared.ScriptBase { public partial class ScriptBaseClass : MarshalByRefObject, IScript { private Dictionary inits = new Dictionary(); -// private ScriptSponsor m_sponser; - - public override Object InitializeLifetimeService() - { - ILease lease = (ILease)base.InitializeLifetimeService(); - if (lease.CurrentState == LeaseState.Initial) - { - // Infinite - lease.InitialLeaseTime = TimeSpan.FromMinutes(0); -// lease.RenewOnCallTime = TimeSpan.FromSeconds(10.0); -// lease.SponsorshipTimeout = TimeSpan.FromMinutes(1.0); - } - return lease; - } -#if DEBUG - // For tracing GC while debugging - public static bool GCDummy = false; - ~ScriptBaseClass() - { - GCDummy = true; - } -#endif public ScriptBaseClass() { diff --git a/OpenSim/Region/ScriptEngine/Shared/Api/Runtime/ScriptSponsor.cs b/OpenSim/Region/ScriptEngine/Shared/Api/Runtime/ScriptSponsor.cs deleted file mode 100644 index 977ac3074a..0000000000 --- a/OpenSim/Region/ScriptEngine/Shared/Api/Runtime/ScriptSponsor.cs +++ /dev/null @@ -1,57 +0,0 @@ -/* - * Copyright (c) Contributors, http://opensimulator.org/ - * See CONTRIBUTORS.TXT for a full list of copyright holders. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: - * * Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * * Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * * Neither the name of the OpenSimulator Project nor the - * names of its contributors may be used to endorse or promote products - * derived from this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE DEVELOPERS ``AS IS'' AND ANY - * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR ANY - * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - */ - -using System; -using System.Collections.Generic; -using System.Runtime.Remoting.Lifetime; -using System.Text; - -namespace OpenSim.Region.ScriptEngine.Shared.Api.Runtime -{ - public class ScriptSponsor : MarshalByRefObject, ISponsor - { - private bool m_closed = false; - - public TimeSpan Renewal(ILease lease) - { - if (!m_closed) - return lease.InitialLeaseTime; - return TimeSpan.FromTicks(0); - } - - public void Close() { m_closed = true; } - -#if DEBUG - // For tracing GC while debugging - public static bool GCDummy = false; - ~ScriptSponsor() - { - GCDummy = true; - } -#endif - } -} diff --git a/OpenSim/Region/ScriptEngine/Shared/AssemblyResolver.cs b/OpenSim/Region/ScriptEngine/Shared/AssemblyResolver.cs deleted file mode 100644 index e35f79fd71..0000000000 --- a/OpenSim/Region/ScriptEngine/Shared/AssemblyResolver.cs +++ /dev/null @@ -1,68 +0,0 @@ -/* - * Copyright (c) Contributors, http://opensimulator.org/ - * See CONTRIBUTORS.TXT for a full list of copyright holders. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: - * * Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * * Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * * Neither the name of the OpenSimulator Project nor the - * names of its contributors may be used to endorse or promote products - * derived from this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE DEVELOPERS ``AS IS'' AND ANY - * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR ANY - * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - */ - -using System; -using System.IO; -using System.Reflection; - -namespace OpenSim.Region.ScriptEngine.Shared -{ - [Serializable] - public class AssemblyResolver : MarshalByRefObject - { - public static Assembly OnAssemblyResolve(object sender, - ResolveEventArgs args) - { - if (!(sender is System.AppDomain)) - return null; - - AppDomain myDomain = (AppDomain)sender; - string dirName = myDomain.FriendlyName; - string ScriptEnginesPath = myDomain.SetupInformation.PrivateBinPath; - - string[] pathList = new string[] {"", "bin", ScriptEnginesPath, - Path.Combine(ScriptEnginesPath, dirName)}; - - string assemblyName = args.Name; - if (assemblyName.IndexOf(",") != -1) - assemblyName = args.Name.Substring(0, args.Name.IndexOf(",")); - - foreach (string s in pathList) - { - string path = Path.Combine(Directory.GetCurrentDirectory(), - Path.Combine(s, assemblyName))+".dll"; - -// Console.WriteLine("Trying to resolve {0}", path); - - if (File.Exists(path)) - return Assembly.LoadFrom(path); - } - - return null; - } - } -} diff --git a/OpenSim/Region/ScriptEngine/Shared/CodeTools/CSCodeGenerator.cs b/OpenSim/Region/ScriptEngine/Shared/CodeTools/CSCodeGenerator.cs deleted file mode 100644 index 031f00a5d8..0000000000 --- a/OpenSim/Region/ScriptEngine/Shared/CodeTools/CSCodeGenerator.cs +++ /dev/null @@ -1,1168 +0,0 @@ -/* - * Copyright (c) Contributors, http://opensimulator.org/ - * See CONTRIBUTORS.TXT for a full list of copyright holders. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: - * * Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * * Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * * Neither the name of the OpenSimulator Project nor the - * names of its contributors may be used to endorse or promote products - * derived from this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE DEVELOPERS ``AS IS'' AND ANY - * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR ANY - * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - */ - -using System; -using System.Text; -using System.IO; -using System.Collections.Generic; -using System.Reflection; -using log4net; -using Tools; -using OpenSim.Region.Framework.Interfaces; - -namespace OpenSim.Region.ScriptEngine.Shared.CodeTools -{ - public class CSCodeGenerator : ICodeConverter - { -// private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType); - - private static yyLSLSyntax yyLSL = new yyLSLSyntax(); - private SYMBOL m_astRoot = null; - private Dictionary, KeyValuePair> m_positionMap; - private int m_braceCount; // for indentation - private int m_CSharpLine; // the current line of generated C# code - private int m_CSharpCol; // the current column of generated C# code - private List m_warnings = new List(); - private IScriptModuleComms m_comms = null; - - private bool m_insertCoopTerminationChecks; - private static string m_coopTerminationCheck = "opensim_reserved_CheckForCoopTermination();"; - - /// - /// Keep a record of the previous node when we do the parsing. - /// - /// - /// We do this here because the parser generated by CSTools does not retain a reference to its parent node. - /// The previous node is required so we can correctly insert co-op termination checks when required. - /// -// private SYMBOL m_previousNode; - - /// - /// Creates an 'empty' CSCodeGenerator instance. - /// - public CSCodeGenerator() - { - m_comms = null; - ResetCounters(); - } - - public CSCodeGenerator(IScriptModuleComms comms, bool insertCoopTerminationChecks) - { - m_comms = comms; - m_insertCoopTerminationChecks = insertCoopTerminationChecks; - ResetCounters(); - } - - /// - /// Get the mapping between LSL and C# line/column number. - /// - /// Dictionary\, KeyValuePair\\>. - public Dictionary, KeyValuePair> PositionMap - { - get { return m_positionMap; } - } - - /// - /// Get the mapping between LSL and C# line/column number. - /// - /// SYMBOL pointing to root of the abstract syntax tree. - public SYMBOL ASTRoot - { - get { return m_astRoot; } - } - - public void Clear() - { - m_astRoot.kids = null; - m_astRoot.yylx = null; - m_astRoot.yyps = null; - m_astRoot = null; - m_positionMap = null; - m_warnings.Clear(); - m_comms = null; - } - /// - /// Resets various counters and metadata. - /// - private void ResetCounters() - { - m_braceCount = 0; - m_CSharpLine = 0; - m_CSharpCol = 1; - m_positionMap = new Dictionary, KeyValuePair>(); - m_astRoot = null; - } - - public string Convert(string script) - { - StringBuilder sb = new StringBuilder(4096); - Convert(script, sb); - return sb.ToString(); - } - - /// - /// Generate the code from the AST we have. - /// - /// The LSL source as a string. - /// String containing the generated C# code. - public void Convert(string script, StringBuilder sb) - { -// m_log.DebugFormat("[CS CODE GENERATOR]: Converting to C#\n{0}", script); - - m_warnings.Clear(); - ResetCounters(); - ErrorHandler errorHandler = new ErrorHandler(true); - Parser p = new LSLSyntax(yyLSL, errorHandler); - - LSL2CSCodeTransformer codeTransformer; - try - { - codeTransformer = new LSL2CSCodeTransformer(p.Parse(script)); - } - catch (CSToolsException e) - { - string message; - - // LL start numbering lines at 0 - geeks! - // Also need to subtract one line we prepend! - // - string emessage = e.Message; - string slinfo = e.slInfo.ToString(); - - // Remove wrong line number info - // - if (emessage.StartsWith(slinfo+": ")) - emessage = emessage.Substring(slinfo.Length+2); - - message = String.Format("({0},{1}) {2}", - e.slInfo.lineNumber - 1, - e.slInfo.charPosition - 1, emessage); - - throw new Exception(message); - } - - m_astRoot = codeTransformer.Transform(); - - - // standard preamble - - - - m_braceCount++; - m_braceCount++; - - // line number - m_CSharpLine += 10; - - // here's the payload - sb.Append("\n"); - foreach (SYMBOL s in m_astRoot.kids) - GenerateNodeToSB(m_astRoot, s, sb); - - codeTransformer = null; - p.m_lexer.m_buf=null; - p.m_lexer.yytext = null; - p.m_lexer = null; - p.m_symbols = null; - p = null; - errorHandler = null; - - // close braces! -// m_braceCount--; - //retstr += GenerateIndentedLine("}"); -// m_braceCount--; - //retstr += GenerateLine("}"); - - // Removes all carriage return characters which may be generated in Windows platform. Is there - // cleaner way of doing this? -// sb.Replace("\r", ""); - } - - /// - /// Get the set of warnings generated during compilation. - /// - /// - public string[] GetWarnings() - { - return m_warnings.ToArray(); - } - - private void AddWarning(string warning) - { - if (!m_warnings.Contains(warning)) - { - m_warnings.Add(warning); - } - } - - /// - /// Recursively called to generate each type of node. Will generate this - /// node, then all it's children. - /// - /// The parent node. - /// The current node to generate code for. - /// String containing C# code for SYMBOL s. - private void GenerateNodeToSB(SYMBOL previousSymbol, SYMBOL s, StringBuilder sb) - { - // make sure to put type lower in the inheritance hierarchy first - // ie: since IdentArgument and ExpressionArgument inherit from - // Argument, put IdentArgument and ExpressionArgument before Argument - if (s is GlobalFunctionDefinition) - GenerateGlobalFunctionDefinition((GlobalFunctionDefinition) s, sb); - else if (s is GlobalVariableDeclaration) - GenerateGlobalVariableDeclaration((GlobalVariableDeclaration) s , sb); - else if (s is State) - GenerateState((State) s, sb); - else if (s is CompoundStatement) - GenerateCompoundStatement(previousSymbol, (CompoundStatement) s, sb); - else if (s is Declaration) - GenerateDeclaration((Declaration) s, sb); - else if (s is Statement) - GenerateStatement(previousSymbol, (Statement) s, sb); - else if (s is ReturnStatement) - GenerateReturnStatement((ReturnStatement) s, sb); - else if (s is JumpLabel) - GenerateJumpLabel((JumpLabel) s, sb); - else if (s is JumpStatement) - GenerateJumpStatement((JumpStatement) s, sb); - else if (s is StateChange) - GenerateStateChange((StateChange) s, sb); - else if (s is IfStatement) - GenerateIfStatement((IfStatement) s, sb); - else if (s is WhileStatement) - GenerateWhileStatement((WhileStatement) s, sb); - else if (s is DoWhileStatement) - GenerateDoWhileStatement((DoWhileStatement) s, sb); - else if (s is ForLoop) - GenerateForLoop((ForLoop) s, sb); - else if (s is ArgumentList) - GenerateArgumentList((ArgumentList) s, sb); - else if (s is Assignment) - GenerateAssignment((Assignment) s, sb); - else if (s is BinaryExpression) - GenerateBinaryExpression((BinaryExpression) s, sb); - else if (s is ParenthesisExpression) - GenerateParenthesisExpression((ParenthesisExpression) s, sb); - else if (s is UnaryExpression) - GenerateUnaryExpression((UnaryExpression) s, sb); - else if (s is IncrementDecrementExpression) - GenerateIncrementDecrementExpression((IncrementDecrementExpression) s, sb); - else if (s is TypecastExpression) - GenerateTypecastExpression((TypecastExpression) s, sb); - else if (s is FunctionCall) - GenerateFunctionCall((FunctionCall) s, sb); - else if (s is VectorConstant) - GenerateVectorConstant((VectorConstant) s, sb); - else if (s is RotationConstant) - GenerateRotationConstant((RotationConstant) s, sb); - else if (s is ListConstant) - GenerateListConstant((ListConstant) s, sb); - else if (s is Constant) - GenerateConstant((Constant) s, sb); - else if (s is IdentDotExpression) - Generate(CheckName(((IdentDotExpression) s).Name) + "." + ((IdentDotExpression) s).Member, s, sb); - else if (s is IdentExpression) - GenerateIdentifier(((IdentExpression) s).Name, s, sb); - else if (s is IDENT) - Generate(CheckName(((TOKEN) s).yytext), s, sb); - else - { - foreach (SYMBOL kid in s.kids) - GenerateNodeToSB(s, kid,sb); - } - - return; - } - - /// - /// Generates the code for a GlobalFunctionDefinition node. - /// - /// The GlobalFunctionDefinition node. - /// String containing C# code for GlobalFunctionDefinition gf. - private void GenerateGlobalFunctionDefinition(GlobalFunctionDefinition gf, StringBuilder sb) - { - // we need to separate the argument declaration list from other kids - List argumentDeclarationListKids = new List(); - List remainingKids = new List(); - - foreach (SYMBOL kid in gf.kids) - if (kid is ArgumentDeclarationList) - argumentDeclarationListKids.Add(kid); - else - remainingKids.Add(kid); - - GenerateIndented(String.Format("{0} {1}(", gf.ReturnType, CheckName(gf.Name)), gf, sb); - - // print the state arguments, if any - foreach (SYMBOL kid in argumentDeclarationListKids) - GenerateArgumentDeclarationList((ArgumentDeclarationList) kid, sb); - - GenerateLine(")", sb); - - foreach (SYMBOL kid in remainingKids) - GenerateNodeToSB(gf, kid,sb); - } - - /// - /// Generates the code for a GlobalVariableDeclaration node. - /// - /// The GlobalVariableDeclaration node. - /// String containing C# code for GlobalVariableDeclaration gv. - private void GenerateGlobalVariableDeclaration(GlobalVariableDeclaration gv, StringBuilder sb) - { - foreach (SYMBOL s in gv.kids) - { - Indent(sb); - GenerateNodeToSB(gv, s ,sb); - GenerateLine(";", sb); - } - } - - /// - /// Generates the code for a State node. - /// - /// The State node. - /// String containing C# code for State s. - private void GenerateState(State s, StringBuilder sb) - { - foreach (SYMBOL kid in s.kids) - if (kid is StateEvent) - GenerateStateEvent((StateEvent) kid, s.Name, sb); - } - - /// - /// Generates the code for a StateEvent node. - /// - /// The StateEvent node. - /// The name of the parent state. - /// String containing C# code for StateEvent se. - private void GenerateStateEvent(StateEvent se, string parentStateName, StringBuilder sb) - { - // we need to separate the argument declaration list from other kids - List argumentDeclarationListKids = new List(); - List remainingKids = new List(); - - foreach (SYMBOL kid in se.kids) - if (kid is ArgumentDeclarationList) - argumentDeclarationListKids.Add(kid); - else - remainingKids.Add(kid); - - // "state" (function) declaration - GenerateIndented(String.Format("public void {0}_event_{1}(", parentStateName, se.Name), se , sb); - - // print the state arguments, if any - foreach (SYMBOL kid in argumentDeclarationListKids) - GenerateArgumentDeclarationList((ArgumentDeclarationList) kid, sb); - - GenerateLine(")", sb); - - foreach (SYMBOL kid in remainingKids) - GenerateNodeToSB(se, kid, sb); - } - - /// - /// Generates the code for an ArgumentDeclarationList node. - /// - /// The ArgumentDeclarationList node. - /// String containing C# code for ArgumentDeclarationList adl. - private void GenerateArgumentDeclarationList(ArgumentDeclarationList adl, StringBuilder sb) - { - int comma = adl.kids.Count - 1; // tells us whether to print a comma - - foreach (Declaration d in adl.kids) - { - Generate(String.Format("{0} {1}", d.Datatype, CheckName(d.Id)), d, sb); - if (0 < comma--) - Generate(", ", sb); - } - } - - /// - /// Generates the code for an ArgumentList node. - /// - /// The ArgumentList node. - /// String containing C# code for ArgumentList al. - private void GenerateArgumentList(ArgumentList al, StringBuilder sb) - { - int comma = al.kids.Count - 1; // tells us whether to print a comma - - foreach (SYMBOL s in al.kids) - { - GenerateNodeToSB(al, s, sb); - if (0 < comma--) - Generate(", ", sb); - } - } - - /// - /// Generates the code for a CompoundStatement node. - /// - /// The CompoundStatement node. - /// String containing C# code for CompoundStatement cs. - private void GenerateCompoundStatement(SYMBOL previousSymbol, CompoundStatement cs, StringBuilder sb) - { - // opening brace - GenerateIndentedLine("{", sb); - m_braceCount++; - - if (m_insertCoopTerminationChecks) - { - // We have to check in event functions as well because the user can manually call these. - if (previousSymbol is GlobalFunctionDefinition - || previousSymbol is WhileStatement - || previousSymbol is DoWhileStatement - || previousSymbol is ForLoop - || previousSymbol is StateEvent) - GenerateIndentedLine(m_coopTerminationCheck, sb); - } - - foreach (SYMBOL kid in cs.kids) - GenerateNodeToSB(cs, kid, sb); - - // closing brace - m_braceCount--; - GenerateIndentedLine("}", sb); - } - - /// - /// Generates the code for a Declaration node. - /// - /// The Declaration node. - /// String containing C# code for Declaration d. - private void GenerateDeclaration(Declaration d, StringBuilder sb) - { - Generate(String.Format("{0} {1}", d.Datatype, CheckName(d.Id)), d, sb); - } - - /// - /// Generates the code for a Statement node. - /// - /// The Statement node. - /// String containing C# code for Statement s. - private void GenerateStatement(SYMBOL previousSymbol, Statement s, StringBuilder sb) - { - string retstr = String.Empty; - bool printSemicolon = true; - bool transformToBlock = false; - - if (m_insertCoopTerminationChecks) - { - // A non-braced single line do while structure cannot contain multiple statements. - // So to insert the termination check we change this to a braced control structure instead. - if (previousSymbol is WhileStatement - || previousSymbol is DoWhileStatement - || previousSymbol is ForLoop) - { - transformToBlock = true; - - // FIXME: This will be wrongly indented because the previous for/while/dowhile will have already indented. - GenerateIndentedLine("{", sb); - - GenerateIndentedLine(m_coopTerminationCheck, sb); - } - } - - Indent(sb); - - if (0 < s.kids.Count) - { - // Jump label prints its own colon, we don't need a semicolon. - printSemicolon = !(s.kids.Top is JumpLabel); - - // If we encounter a lone Ident, we skip it, since that's a C# - // (MONO) error. - if (!(s.kids.Top is IdentExpression && 1 == s.kids.Count)) - foreach (SYMBOL kid in s.kids) - GenerateNodeToSB(s, kid, sb); - } - - if (printSemicolon) - GenerateLine(";", sb); - - if (transformToBlock) - { - // FIXME: This will be wrongly indented because the for/while/dowhile is currently handling the unindent - GenerateIndentedLine("}", sb); - } - } - - /// - /// Generates the code for an Assignment node. - /// - /// The Assignment node. - /// String containing C# code for Assignment a. - private void GenerateAssignment(Assignment a, StringBuilder sb) - { - List identifiers = new List(); - checkForMultipleAssignments(identifiers, a); - - GenerateNodeToSB(a, (SYMBOL) a.kids.Pop(), sb); - Generate(String.Format(" {0} ", a.AssignmentType), a, sb); - foreach (SYMBOL kid in a.kids) - GenerateNodeToSB(a, kid, sb); - } - - // This code checks for LSL of the following forms, and generates a - // warning if it finds them. - // - // list l = [ "foo" ]; - // l = (l=[]) + l + ["bar"]; - // (produces l=["foo","bar"] in SL but l=["bar"] in OS) - // - // integer i; - // integer j; - // i = (j = 3) + (j = 4) + (j = 5); - // (produces j=3 in SL but j=5 in OS) - // - // Without this check, that code passes compilation, but does not do what - // the end user expects, because LSL in SL evaluates right to left instead - // of left to right. - // - // The theory here is that producing an error and alerting the end user that - // something needs to change is better than silently generating incorrect code. - private void checkForMultipleAssignments(List identifiers, SYMBOL s) - { - if (s is Assignment) - { - Assignment a = (Assignment)s; - string newident = null; - - if (a.kids[0] is Declaration) - { - newident = ((Declaration)a.kids[0]).Id; - } - else if (a.kids[0] is IDENT) - { - newident = ((IDENT)a.kids[0]).yytext; - } - else if (a.kids[0] is IdentDotExpression) - { - newident = ((IdentDotExpression)a.kids[0]).Name; // +"." + ((IdentDotExpression)a.kids[0]).Member; - } - else - { - AddWarning(String.Format("Multiple assignments checker internal error '{0}' at line {1} column {2}.", a.kids[0].GetType(), ((SYMBOL)a.kids[0]).Line - 1, ((SYMBOL)a.kids[0]).Position)); - } - - if (identifiers.Contains(newident)) - { - AddWarning(String.Format("Multiple assignments to '{0}' at line {1} column {2}; results may differ between LSL and OSSL.", newident, ((SYMBOL)a.kids[0]).Line - 1, ((SYMBOL)a.kids[0]).Position)); - } - identifiers.Add(newident); - } - - int index; - for (index = 0; index < s.kids.Count; index++) - { - checkForMultipleAssignments(identifiers, (SYMBOL) s.kids[index]); - } - } - - /// - /// Generates the code for a ReturnStatement node. - /// - /// The ReturnStatement node. - /// String containing C# code for ReturnStatement rs. - private void GenerateReturnStatement(ReturnStatement rs, StringBuilder sb) - { - Generate("return ", rs, sb); - - foreach (SYMBOL kid in rs.kids) - GenerateNodeToSB(rs, kid, sb); - } - - /// - /// Generates the code for a JumpLabel node. - /// - /// The JumpLabel node. - /// String containing C# code for JumpLabel jl. - private void GenerateJumpLabel(JumpLabel jl, StringBuilder sb) - { - string labelStatement; - - if (m_insertCoopTerminationChecks) - labelStatement = m_coopTerminationCheck; - else - labelStatement = "NoOp();"; - - GenerateLine(String.Format("{0}: {1}", CheckName(jl.LabelName), labelStatement), jl, sb); - } - - /// - /// Generates the code for a JumpStatement node. - /// - /// The JumpStatement node. - /// String containing C# code for JumpStatement js. - private void GenerateJumpStatement(JumpStatement js, StringBuilder sb) - { - Generate(String.Format("goto {0}", CheckName(js.TargetName)), js, sb); - } - - /// - /// Generates the code for an IfStatement node. - /// - /// The IfStatement node. - /// String containing C# code for IfStatement ifs. - private void GenerateIfStatement(IfStatement ifs, StringBuilder sb) - { - GenerateIndented("if (", ifs, sb); - GenerateNodeToSB(ifs, (SYMBOL) ifs.kids.Pop(), sb); - GenerateLine(")", sb); - - // CompoundStatement handles indentation itself but we need to do it - // otherwise. - bool indentHere = ifs.kids.Top is Statement; - if (indentHere) m_braceCount++; - GenerateNodeToSB(ifs, (SYMBOL) ifs.kids.Pop(), sb); - if (indentHere) m_braceCount--; - - if (0 < ifs.kids.Count) // do it again for an else - { - GenerateIndentedLine("else", ifs, sb); - - indentHere = ifs.kids.Top is Statement; - if (indentHere) m_braceCount++; - GenerateNodeToSB(ifs, (SYMBOL) ifs.kids.Pop(), sb); - if (indentHere) m_braceCount--; - } - } - - /// - /// Generates the code for a StateChange node. - /// - /// The StateChange node. - /// String containing C# code for StateChange sc. - private void GenerateStateChange(StateChange sc, StringBuilder sb) - { - Generate(String.Format("state(\"{0}\")", sc.NewState), sc, sb); - } - - /// - /// Generates the code for a WhileStatement node. - /// - /// The WhileStatement node. - /// String containing C# code for WhileStatement ws. - private void GenerateWhileStatement(WhileStatement ws, StringBuilder sb) - { - GenerateIndented("while (", ws, sb); - GenerateNodeToSB(ws, (SYMBOL) ws.kids.Pop(), sb); - GenerateLine(")", sb); - - // CompoundStatement handles indentation itself but we need to do it - // otherwise. - bool indentHere = ws.kids.Top is Statement; - if (indentHere) m_braceCount++; - GenerateNodeToSB(ws, (SYMBOL) ws.kids.Pop(), sb); - if (indentHere) m_braceCount--; - } - - /// - /// Generates the code for a DoWhileStatement node. - /// - /// The DoWhileStatement node. - /// String containing C# code for DoWhileStatement dws. - private void GenerateDoWhileStatement(DoWhileStatement dws, StringBuilder sb) - { - GenerateIndentedLine("do", dws, sb); - - // CompoundStatement handles indentation itself but we need to do it - // otherwise. - bool indentHere = dws.kids.Top is Statement; - if (indentHere) m_braceCount++; - GenerateNodeToSB(dws, (SYMBOL) dws.kids.Pop(), sb); - if (indentHere) m_braceCount--; - - GenerateIndented("while (", dws ,sb); - GenerateNodeToSB(dws, (SYMBOL) dws.kids.Pop(), sb); - GenerateLine(");", sb); - } - - /// - /// Generates the code for a ForLoop node. - /// - /// The ForLoop node. - /// String containing C# code for ForLoop fl. - private void GenerateForLoop(ForLoop fl, StringBuilder sb) - { - GenerateIndented("for (", fl, sb); - - // It's possible that we don't have an assignment, in which case - // the child will be null and we only print the semicolon. - // for (x = 0; x < 10; x++) - // ^^^^^ - ForLoopStatement s = (ForLoopStatement) fl.kids.Pop(); - if (null != s) - { - GenerateForLoopStatement(s, sb); - } - Generate("; ", sb); - // for (x = 0; x < 10; x++) - // ^^^^^^ - GenerateNodeToSB(fl, (SYMBOL) fl.kids.Pop(), sb); - Generate("; ", sb); - // for (x = 0; x < 10; x++) - // ^^^ - GenerateForLoopStatement((ForLoopStatement) fl.kids.Pop(), sb); - GenerateLine(")", sb); - - // CompoundStatement handles indentation itself but we need to do it - // otherwise. - bool indentHere = fl.kids.Top is Statement; - if (indentHere) m_braceCount++; - GenerateNodeToSB(fl, (SYMBOL) fl.kids.Pop(), sb); - if (indentHere) m_braceCount--; - } - - /// - /// Generates the code for a ForLoopStatement node. - /// - /// The ForLoopStatement node. - /// String containing C# code for ForLoopStatement fls. - private void GenerateForLoopStatement(ForLoopStatement fls, StringBuilder sb) - { - int comma = fls.kids.Count - 1; // tells us whether to print a comma - - // It's possible that all we have is an empty Ident, for example: - // - // for (x; x < 10; x++) { ... } - // - // Which is illegal in C# (MONO). We'll skip it. - if (fls.kids.Top is IdentExpression && 1 == fls.kids.Count) - return; - - for (int i = 0; i < fls.kids.Count; i++) - { - SYMBOL s = (SYMBOL)fls.kids[i]; - - // Statements surrounded by parentheses in for loops - // - // e.g. for ((i = 0), (j = 7); (i < 10); (++i)) - // - // are legal in LSL but not in C# so we need to discard the parentheses - // - // The following, however, does not appear to be legal in LLS - // - // for ((i = 0, j = 7); (i < 10); (++i)) - // - // As of Friday 20th November 2009, the Linden Lab simulators appear simply never to compile or run this - // script but with no debug or warnings at all! Therefore, we won't deal with this yet (which looks - // like it would be considerably more complicated to handle). - while (s is ParenthesisExpression) - s = (SYMBOL)s.kids.Pop(); - - GenerateNodeToSB(fls, s, sb); - if (0 < comma--) - Generate(", ", sb); - } - } - - /// - /// Generates the code for a BinaryExpression node. - /// - /// The BinaryExpression node. - /// String containing C# code for BinaryExpression be. - private void GenerateBinaryExpression(BinaryExpression be, StringBuilder sb) - { - if (be.ExpressionSymbol.Equals("&&") || be.ExpressionSymbol.Equals("||")) - { - // special case handling for logical and/or, see Mantis 3174 - sb.Append("((bool)("); - GenerateNodeToSB(be, (SYMBOL)be.kids.Pop(), sb); - sb.Append("))"); - Generate(String.Format(" {0} ", be.ExpressionSymbol.Substring(0,1)), be, sb); - sb.Append("((bool)("); - foreach (SYMBOL kid in be.kids) - GenerateNodeToSB(be, kid, sb); - sb.Append("))"); - } - else - { - GenerateNodeToSB(be, (SYMBOL)be.kids.Pop(), sb); - Generate(String.Format(" {0} ", be.ExpressionSymbol), be, sb); - foreach (SYMBOL kid in be.kids) - GenerateNodeToSB(be, kid, sb); - } - } - - /// - /// Generates the code for a UnaryExpression node. - /// - /// The UnaryExpression node. - /// String containing C# code for UnaryExpression ue. - private void GenerateUnaryExpression(UnaryExpression ue, StringBuilder sb) - { - Generate(ue.UnarySymbol, ue, sb); - GenerateNodeToSB(ue, (SYMBOL) ue.kids.Pop(), sb); - } - - /// - /// Generates the code for a ParenthesisExpression node. - /// - /// The ParenthesisExpression node. - /// String containing C# code for ParenthesisExpression pe. - private void GenerateParenthesisExpression(ParenthesisExpression pe, StringBuilder sb) - { - string retstr = String.Empty; - - Generate("(", sb); - foreach (SYMBOL kid in pe.kids) - GenerateNodeToSB(pe, kid, sb); - Generate(")", sb); - } - - /// - /// Generates the code for a IncrementDecrementExpression node. - /// - /// The IncrementDecrementExpression node. - /// String containing C# code for IncrementDecrementExpression ide. - private void GenerateIncrementDecrementExpression(IncrementDecrementExpression ide, StringBuilder sb) - { - if (0 < ide.kids.Count) - { - IdentDotExpression dot = (IdentDotExpression) ide.kids.Top; - Generate(String.Format("{0}", ide.PostOperation ? CheckName(dot.Name) + "." + dot.Member + ide.Operation : ide.Operation + CheckName(dot.Name) + "." + dot.Member), ide, sb); - } - else - Generate(String.Format("{0}", ide.PostOperation ? CheckName(ide.Name) + ide.Operation : ide.Operation + CheckName(ide.Name)), ide, sb); - } - - /// - /// Generates the code for a TypecastExpression node. - /// - /// The TypecastExpression node. - /// String containing C# code for TypecastExpression te. - private void GenerateTypecastExpression(TypecastExpression te, StringBuilder sb) - { - // we wrap all typecasted statements in parentheses - Generate(String.Format("({0}) (", te.TypecastType), te, sb); - GenerateNodeToSB(te, (SYMBOL) te.kids.Pop(), sb); - Generate(")", sb); - } - - /// - /// Generates the code for an identifier - /// - /// The symbol name - /// The Symbol node. - /// String containing C# code for identifier reference. - private void GenerateIdentifier(string id, SYMBOL s, StringBuilder sb) - { - if (m_comms != null) - { - object value = m_comms.LookupModConstant(id); - if (value != null) - { - string retval = null; - if (value is int) - retval = String.Format("new LSL_Types.LSLInteger({0})",((int)value).ToString()); - else if (value is float) - retval = String.Format("new LSL_Types.LSLFloat({0})",((float)value).ToString()); - else if (value is string) - retval = String.Format("new LSL_Types.LSLString(\"{0}\")",((string)value)); - else if (value is OpenMetaverse.UUID) - retval = String.Format("new LSL_Types.key(\"{0}\")",((OpenMetaverse.UUID)value).ToString()); - else if (value is OpenMetaverse.Vector3) - retval = String.Format("new LSL_Types.Vector3(\"{0}\")",((OpenMetaverse.Vector3)value).ToString()); - else if (value is OpenMetaverse.Quaternion) - retval = String.Format("new LSL_Types.Quaternion(\"{0}\")",((OpenMetaverse.Quaternion)value).ToString()); - else retval = id; - - Generate(retval, s, sb); - return; - } - } - - Generate(CheckName(id), s, sb); - return; - } - - /// - /// Generates the code for a FunctionCall node. - /// - /// The FunctionCall node. - /// String containing C# code for FunctionCall fc. - private void GenerateFunctionCall(FunctionCall fc, StringBuilder sb) - { - string modinvoke = null; - if (m_comms != null) - modinvoke = m_comms.LookupModInvocation(fc.Id); - - if (modinvoke != null) - { - if (fc.kids[0] is ArgumentList) - { - if ((fc.kids[0] as ArgumentList).kids.Count == 0) - Generate(String.Format("{0}(\"{1}\"",modinvoke,fc.Id), fc, sb); - else - Generate(String.Format("{0}(\"{1}\",",modinvoke,fc.Id), fc, sb); - } - } - else - { - Generate(String.Format("{0}(", CheckName(fc.Id)), fc, sb); - } - - foreach (SYMBOL kid in fc.kids) - GenerateNodeToSB(fc, kid, sb); - - Generate(")", sb); - } - - /// - /// Generates the code for a Constant node. - /// - /// The Constant node. - /// String containing C# code for Constant c. - private void GenerateConstant(Constant c, StringBuilder sb) - { - // Supprt LSL's weird acceptance of floats with no trailing digits - // after the period. Turn float x = 10.; into float x = 10.0; - if ("LSL_Types.LSLFloat" == c.Type) - { - int dotIndex = c.Value.IndexOf('.') + 1; - if (0 < dotIndex && (dotIndex == c.Value.Length || !Char.IsDigit(c.Value[dotIndex]))) - c.Value = c.Value.Insert(dotIndex, "0"); - c.Value = "new LSL_Types.LSLFloat("+c.Value+")"; - } - else if ("LSL_Types.LSLInteger" == c.Type) - { - c.Value = "new LSL_Types.LSLInteger("+c.Value+")"; - } - else if ("LSL_Types.LSLString" == c.Type) - { - c.Value = "new LSL_Types.LSLString(\""+c.Value+"\")"; - } - - Generate(c.Value, c, sb); - } - - /// - /// Generates the code for a VectorConstant node. - /// - /// The VectorConstant node. - /// String containing C# code for VectorConstant vc. - private void GenerateVectorConstant(VectorConstant vc, StringBuilder sb) - { - Generate(String.Format("new {0}(", vc.Type), vc, sb); - GenerateNodeToSB(vc, (SYMBOL) vc.kids.Pop(), sb); - Generate(", ", sb); - GenerateNodeToSB(vc, (SYMBOL) vc.kids.Pop(), sb); - Generate(", ", sb); - GenerateNodeToSB(vc, (SYMBOL) vc.kids.Pop(), sb); - Generate(")", sb); - } - - /// - /// Generates the code for a RotationConstant node. - /// - /// The RotationConstant node. - /// String containing C# code for RotationConstant rc. - private void GenerateRotationConstant(RotationConstant rc, StringBuilder sb) - { - Generate(String.Format("new {0}(", rc.Type), rc, sb); - GenerateNodeToSB(rc, (SYMBOL) rc.kids.Pop(), sb); - Generate(", ", sb); - GenerateNodeToSB(rc, (SYMBOL) rc.kids.Pop(), sb); - Generate(", ", sb); - GenerateNodeToSB(rc, (SYMBOL) rc.kids.Pop(), sb); - Generate(", ", sb); - GenerateNodeToSB(rc, (SYMBOL) rc.kids.Pop(), sb); - Generate(")", sb); - } - - /// - /// Generates the code for a ListConstant node. - /// - /// The ListConstant node. - /// String containing C# code for ListConstant lc. - private void GenerateListConstant(ListConstant lc, StringBuilder sb) - { - Generate(String.Format("new {0}(", lc.Type), lc, sb); - - foreach (SYMBOL kid in lc.kids) - GenerateNodeToSB(lc, kid, sb); - - Generate(")", sb); - } - - /// - /// Prints a newline. - /// - /// A newline. - private void GenerateLine(StringBuilder sb) - { - sb.Append("\n"); - m_CSharpLine++; - m_CSharpCol = 1; - } - - /// - /// Prints text, followed by a newline. - /// - /// String of text to print. - /// String s followed by newline. - private void GenerateLine(string s, StringBuilder sb) - { - sb.Append(s); - sb.Append("\n"); - m_CSharpLine++; - m_CSharpCol = 1; - } - - /// - /// Prints text, followed by a newline. - /// - /// String of text to print. - /// Symbol being generated to extract original line - /// number and column from. - /// String s followed by newline. - private void GenerateLine(string s, SYMBOL sym, StringBuilder sb) - { - Generate(s, sym, sb); - sb.Append("\n"); - - m_CSharpLine++; - m_CSharpCol = 1; - } - - /// - /// Prints text. - /// - /// String of text to print. - /// String s. - private void Generate(string s, StringBuilder sb) - { - sb.Append(s); - m_CSharpCol += s.Length; - } - - /// - /// Prints text. - /// - /// String of text to print. - /// Symbol being generated to extract original line - /// number and column from. - /// String s. - private void Generate(string s, SYMBOL sym, StringBuilder sb) - { - sb.Append(s); - if (null != sym) - m_positionMap.Add(new KeyValuePair(m_CSharpLine, m_CSharpCol), new KeyValuePair(sym.Line, sym.Position)); - - m_CSharpCol += s.Length; - } - - /// - /// Prints text correctly indented, followed by a newline. - /// - /// String of text to print. - /// Properly indented string s followed by newline. - private void GenerateIndentedLine(string s, StringBuilder sb) - { - GenerateIndentedLine(s, null, sb); - } - - /// - /// Prints text correctly indented, followed by a newline. - /// - /// String of text to print. - /// Symbol being generated to extract original line - /// number and column from. - /// Properly indented string s followed by newline. - private void GenerateIndentedLine(string s, SYMBOL sym, StringBuilder sb) - { - GenerateIndented(s, sym , sb ); - sb.Append("\n"); - m_CSharpLine++; - m_CSharpCol = 1; - } - - /// - /// Prints text correctly indented. - /// - /// String of text to print. - /// Properly indented string s. - //private string GenerateIndented(string s) - //{ - // return GenerateIndented(s, null); - //} - // THIS FUNCTION IS COMMENTED OUT TO SUPPRESS WARNINGS - - /// - /// Prints text correctly indented. - /// - /// String of text to print. - /// Symbol being generated to extract original line - /// number and column from. - /// Properly indented string s. - private void GenerateIndented(string s, SYMBOL sym, StringBuilder sb) - { - Indent(sb); - sb.Append(s); - - if (null != sym) - m_positionMap.Add(new KeyValuePair(m_CSharpLine, m_CSharpCol), new KeyValuePair(sym.Line, sym.Position)); - - m_CSharpCol += s.Length; - } - - /// - /// Prints correct indentation. - /// - /// Indentation based on brace count. - private void Indent(StringBuilder sb) - { - for (int i = 0; i < m_braceCount; i++) - { - sb.Append(" "); - m_CSharpCol += 4; - } - } - - /// - /// Returns the passed name with an underscore prepended if that name is a reserved word in C# - /// and not resevered in LSL otherwise it just returns the passed name. - /// - /// This makes no attempt to cache the results to minimise future lookups. For a non trivial - /// scripts the number of unique identifiers could easily grow to the size of the reserved word - /// list so maintaining a list or dictionary and doing the lookup there firstwould probably not - /// give any real speed advantage. - /// - /// I believe there is a class Microsoft.CSharp.CSharpCodeProvider that has a function - /// CreateValidIdentifier(str) that will return either the value of str if it is not a C# - /// key word or "_"+str if it is. But availability under Mono? - /// - private string CheckName(string s) - { - if (CSReservedWords.IsReservedWord(s)) - return "@" + s; - else - return s; - } - } -} diff --git a/OpenSim/Region/ScriptEngine/Shared/CodeTools/CSReservedWords.cs b/OpenSim/Region/ScriptEngine/Shared/CodeTools/CSReservedWords.cs deleted file mode 100644 index 19a248f2dd..0000000000 --- a/OpenSim/Region/ScriptEngine/Shared/CodeTools/CSReservedWords.cs +++ /dev/null @@ -1,91 +0,0 @@ -/* -* Copyright (c) Contributors, http://opensimulator.org/ -* See CONTRIBUTORS.TXT for a full list of copyright holders. -* -* Redistribution and use in source and binary forms, with or without -* modification, are permitted provided that the following conditions are met: -* * Redistributions of source code must retain the above copyright -* notice, this list of conditions and the following disclaimer. -* * Redistributions in binary form must reproduce the above copyright -* notice, this list of conditions and the following disclaimer in the -* documentation and/or other materials provided with the distribution. -* * Neither the name of the OpenSimulator Project nor the -* names of its contributors may be used to endorse or promote products -* derived from this software without specific prior written permission. -* -* THIS SOFTWARE IS PROVIDED BY THE DEVELOPERS AS IS AND ANY -* EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED -* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE -* DISCLAIMED. IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR ANY -* DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES -* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; -* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND -* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS -* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -* -*/ - -using System; -using System.Collections.Generic; - -namespace OpenSim.Region.ScriptEngine.Shared.CodeTools -{ - /// - /// A container for all of the reserved C# words that are not also reserved words in LSL. - /// The words must be maintained in alphabetical order. - /// The words that are key words in lsl are picked up by the lsl compiler as errors. - /// The LSL reserved words have been left in the list as comments for completeness - /// - internal class CSReservedWords - { - private static List reservedWords = new List(new string[] { - "abstract","as", - "base","bool","break","byte", - "case","catch","char","checked","class","const","continue", - "decimal","default","delegate", - //"do", - "double", - //"else", - "enum", - //"event", - "explicit","extern", - "false","finally","fixed", - //"float","for", - "foreach", - "goto", - //"if", - "implicit","in","int","interface","internal","is", - "lock","long", - "namespace","new","null", - "object","operator","out","override", - "params","private","protected","public", - "readonly","ref", - //"return", - "sbyte","sealed","short","sizeof","stackalloc","static", - //"string", - "struct","switch", - "this","throw","true","try","typeof", - "uint","ulong","unchecked","unsafe","ushort","using", - "virtual","void","volatile", - //"while" - }); - - /// - /// Returns true if the passed string is in the list of reserved words with - /// a little simple pre-filtering. - /// - internal static bool IsReservedWord(string word) - { - // A couple of quick filters to weed out single characters, ll functions and - // anything that starts with an uppercase letter - if (String.IsNullOrEmpty(word)) return false; - if (word.Length < 2) return false; - if (word.StartsWith("ll")) return false; - char first = word.ToCharArray(0,1)[0]; - if (first >= 'A' && first <= 'Z') return false; - - return (reservedWords.BinarySearch(word) >= 0); - } - } -} diff --git a/OpenSim/Region/ScriptEngine/Shared/CodeTools/Compiler.cs b/OpenSim/Region/ScriptEngine/Shared/CodeTools/Compiler.cs deleted file mode 100644 index f44aba1bcf..0000000000 --- a/OpenSim/Region/ScriptEngine/Shared/CodeTools/Compiler.cs +++ /dev/null @@ -1,852 +0,0 @@ -/* - * Copyright (c) Contributors, http://opensimulator.org/ - * See CONTRIBUTORS.TXT for a full list of copyright holders. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: - * * Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * * Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * * Neither the name of the OpenSimulator Project nor the - * names of its contributors may be used to endorse or promote products - * derived from this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE DEVELOPERS ``AS IS'' AND ANY - * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR ANY - * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - */ - -using System; -using System.CodeDom.Compiler; -using System.Collections.Generic; -using System.Globalization; -using System.Reflection; -using System.IO; -using System.Text; -using Microsoft.CSharp; -//using Microsoft.JScript; -using Microsoft.VisualBasic; -using log4net; - -using OpenSim.Region.Framework.Interfaces; -using OpenSim.Region.ScriptEngine.Interfaces; -using OpenMetaverse; - -namespace OpenSim.Region.ScriptEngine.Shared.CodeTools -{ - public class Compiler : ICompiler - { - private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType); - - // * Uses "LSL2Converter" to convert LSL to C# if necessary. - // * Compiles C#-code into an assembly - // * Returns assembly name ready for AppDomain load. - // - // Assembly is compiled using LSL_BaseClass as base. Look at debug C# code file created when LSL script is compiled for full details. - // - - internal enum enumCompileType - { - lsl = 0, - cs = 1, - vb = 2 - } - - /// - /// This contains number of lines WE use for header when compiling script. User will get error in line x-LinesToRemoveOnError when error occurs. - /// - public int LinesToRemoveOnError = 3; - private enumCompileType DefaultCompileLanguage; - private bool WriteScriptSourceToDebugFile; - private bool CompileWithDebugInformation; - private Dictionary AllowedCompilers = new Dictionary(StringComparer.CurrentCultureIgnoreCase); - private Dictionary LanguageMapping = new Dictionary(StringComparer.CurrentCultureIgnoreCase); - private bool m_insertCoopTerminationCalls; - - private string FilePrefix; - private string ScriptEnginesPath = null; - // mapping between LSL and C# line/column numbers - private ICodeConverter LSL_Converter; - - private List m_warnings = new List(); - - private static UInt64 scriptCompileCounter = 0; // And a counter - - public IScriptEngine m_scriptEngine; - private Dictionary, KeyValuePair>> m_lineMaps = - new Dictionary, KeyValuePair>>(); - - public bool in_startup = true; - - public Compiler(IScriptEngine scriptEngine) - { - m_scriptEngine = scriptEngine; - ScriptEnginesPath = scriptEngine.ScriptEnginePath; - ReadConfig(); - } - - public void ReadConfig() - { - // Get some config - WriteScriptSourceToDebugFile = m_scriptEngine.Config.GetBoolean("WriteScriptSourceToDebugFile", false); - CompileWithDebugInformation = m_scriptEngine.Config.GetBoolean("CompileWithDebugInformation", true); - bool DeleteScriptsOnStartup = m_scriptEngine.Config.GetBoolean("DeleteScriptsOnStartup", true); - m_insertCoopTerminationCalls = m_scriptEngine.Config.GetString("ScriptStopStrategy", "abort") == "co-op"; - - // Get file prefix from scriptengine name and make it file system safe: - FilePrefix = "CommonCompiler"; - foreach (char c in Path.GetInvalidFileNameChars()) - { - FilePrefix = FilePrefix.Replace(c, '_'); - } - - if (in_startup) - { - in_startup = false; - CheckOrCreateScriptsDirectory(); - - // First time we start? Delete old files - if (DeleteScriptsOnStartup) - DeleteOldFiles(); - } - - // Map name and enum type of our supported languages - LanguageMapping.Add(enumCompileType.cs.ToString(), enumCompileType.cs); - LanguageMapping.Add(enumCompileType.vb.ToString(), enumCompileType.vb); - LanguageMapping.Add(enumCompileType.lsl.ToString(), enumCompileType.lsl); - - // Allowed compilers - string allowComp = m_scriptEngine.Config.GetString("AllowedCompilers", "lsl"); - AllowedCompilers.Clear(); - -#if DEBUG - m_log.Debug("[Compiler]: Allowed languages: " + allowComp); -#endif - - - foreach (string strl in allowComp.Split(',')) - { - string strlan = strl.Trim(" \t".ToCharArray()).ToLower(); - if (!LanguageMapping.ContainsKey(strlan)) - { - m_log.Error("[Compiler]: Config error. Compiler is unable to recognize language type \"" + strlan + "\" specified in \"AllowedCompilers\"."); - } - else - { -#if DEBUG - //m_log.Debug("[Compiler]: Config OK. Compiler recognized language type \"" + strlan + "\" specified in \"AllowedCompilers\"."); -#endif - } - AllowedCompilers.Add(strlan, true); - } - if (AllowedCompilers.Count == 0) - m_log.Error("[Compiler]: Config error. Compiler could not recognize any language in \"AllowedCompilers\". Scripts will not be executed!"); - - // Default language - string defaultCompileLanguage = m_scriptEngine.Config.GetString("DefaultCompileLanguage", "lsl").ToLower(); - - // Is this language recognized at all? - if (!LanguageMapping.ContainsKey(defaultCompileLanguage)) - { - m_log.Error("[Compiler]: " + - "Config error. Default language \"" + defaultCompileLanguage + "\" specified in \"DefaultCompileLanguage\" is not recognized as a valid language. Changing default to: \"lsl\"."); - defaultCompileLanguage = "lsl"; - } - - // Is this language in allow-list? - if (!AllowedCompilers.ContainsKey(defaultCompileLanguage)) - { - m_log.Error("[Compiler]: " + - "Config error. Default language \"" + defaultCompileLanguage + "\"specified in \"DefaultCompileLanguage\" is not in list of \"AllowedCompilers\". Scripts may not be executed!"); - } - else - { -#if DEBUG - // m_log.Debug("[Compiler]: " + - // "Config OK. Default language \"" + defaultCompileLanguage + "\" specified in \"DefaultCompileLanguage\" is recognized as a valid language."); -#endif - // LANGUAGE IS IN ALLOW-LIST - DefaultCompileLanguage = LanguageMapping[defaultCompileLanguage]; - } - - // We now have an allow-list, a mapping list, and a default language - } - - /// - /// Create the directory where compiled scripts are stored if it does not already exist. - /// - private void CheckOrCreateScriptsDirectory() - { - if (!Directory.Exists(ScriptEnginesPath)) - { - try - { - Directory.CreateDirectory(ScriptEnginesPath); - } - catch (Exception ex) - { - m_log.Error("[Compiler]: Exception trying to create ScriptEngine directory \"" + ScriptEnginesPath + "\": " + ex.ToString()); - } - } - - if (!Directory.Exists(Path.Combine(ScriptEnginesPath, - m_scriptEngine.World.RegionInfo.RegionID.ToString()))) - { - try - { - Directory.CreateDirectory(Path.Combine(ScriptEnginesPath, - m_scriptEngine.World.RegionInfo.RegionID.ToString())); - } - catch (Exception ex) - { - m_log.Error("[Compiler]: Exception trying to create ScriptEngine directory \"" + Path.Combine(ScriptEnginesPath, - m_scriptEngine.World.RegionInfo.RegionID.ToString()) + "\": " + ex.ToString()); - } - } - } - - /// - /// Delete old script files - /// - private void DeleteOldFiles() - { - foreach (string file in Directory.GetFiles(Path.Combine(ScriptEnginesPath, - m_scriptEngine.World.RegionInfo.RegionID.ToString()), FilePrefix + "_compiled*")) - { - try - { - File.Delete(file); - } - catch (Exception ex) - { - m_log.Error("[Compiler]: Exception trying delete old script file \"" + file + "\": " + ex.ToString()); - } - } - foreach (string file in Directory.GetFiles(Path.Combine(ScriptEnginesPath, - m_scriptEngine.World.RegionInfo.RegionID.ToString()), FilePrefix + "_source*")) - { - try - { - File.Delete(file); - } - catch (Exception ex) - { - m_log.Error("[Compiler]: Exception trying delete old script file \"" + file + "\": " + ex.ToString()); - } - } - } - - public string GetCompilerOutput(string assetID) - { - return Path.Combine(ScriptEnginesPath, Path.Combine( - m_scriptEngine.World.RegionInfo.RegionID.ToString(), - FilePrefix + "_compiled_" + assetID + ".dll")); - } - - public string GetCompilerOutput(UUID assetID) - { - return GetCompilerOutput(assetID.ToString()); - } - - public void PerformScriptCompile( - string source, string asset, UUID ownerUUID, - out string assembly, out Dictionary, KeyValuePair> linemap) - { - PerformScriptCompile(source, asset, ownerUUID, false, out assembly, out linemap); - } - - public void PerformScriptCompile( - string source, string asset, UUID ownerUUID, bool alwaysRecompile, - out string assembly, out Dictionary, KeyValuePair> linemap) - { -// m_log.DebugFormat("[Compiler]: Checking script for asset {0} in {1}\n{2}", asset, m_scriptEngine.World.Name, source); - - IScriptModuleComms comms = m_scriptEngine.World.RequestModuleInterface(); - - linemap = null; - m_warnings.Clear(); - - assembly = GetCompilerOutput(asset); - -// m_log.DebugFormat("[Compiler]: Retrieved assembly {0} for asset {1} in {2}", assembly, asset, m_scriptEngine.World.Name); - - CheckOrCreateScriptsDirectory(); - - // Don't recompile if we're not forced to and we already have it - // Performing 3 file exists tests for every script can still be slow - if (!alwaysRecompile && File.Exists(assembly) && File.Exists(assembly + ".text") && File.Exists(assembly + ".map")) - { -// m_log.DebugFormat("[Compiler]: Found existing assembly {0} for asset {1} in {2}", assembly, asset, m_scriptEngine.World.Name); - - // If we have already read this linemap file, then it will be in our dictionary. - // Don't build another copy of the dictionary (saves memory) and certainly - // don't keep reading the same file from disk multiple times. - if (!m_lineMaps.ContainsKey(assembly)) - m_lineMaps[assembly] = ReadMapFile(assembly + ".map"); - linemap = m_lineMaps[assembly]; - return; - } - -// m_log.DebugFormat("[Compiler]: Compiling assembly {0} for asset {1} in {2}", assembly, asset, m_scriptEngine.World.Name); - - if (source.Length == 0) - throw new Exception("Cannot find script assembly and no script text present"); - - enumCompileType language = DefaultCompileLanguage; - - if (source.StartsWith("//c#", true, CultureInfo.InvariantCulture)) - language = enumCompileType.cs; - if (source.StartsWith("//vb", true, CultureInfo.InvariantCulture)) - { - language = enumCompileType.vb; - // We need to remove //vb, it won't compile with that - - source = source.Substring(4, source.Length - 4); - } - if (source.StartsWith("//lsl", true, CultureInfo.InvariantCulture)) - language = enumCompileType.lsl; - -// m_log.DebugFormat("[Compiler]: Compile language is {0}", language); - - if (!AllowedCompilers.ContainsKey(language.ToString())) - { - // Not allowed to compile to this language! - string errtext = String.Empty; - errtext += "The compiler for language \"" + language.ToString() + "\" is not in list of allowed compilers. Script will not be executed!"; - throw new Exception(errtext); - } - - if (m_scriptEngine.World.Permissions.CanCompileScript(ownerUUID, (int)language) == false) - { - // Not allowed to compile to this language! - string errtext = String.Empty; - errtext += ownerUUID + " is not in list of allowed users for this scripting language. Script will not be executed!"; - throw new Exception(errtext); - } - - string compileScript = string.Empty; - - if (language == enumCompileType.lsl) - { - // Its LSL, convert it to C# - - StringBuilder sb = new StringBuilder(16394); - - LSL_Converter = (ICodeConverter)new CSCodeGenerator(comms, m_insertCoopTerminationCalls); - AddCSScriptHeader( - m_scriptEngine.ScriptClassName, - m_scriptEngine.ScriptBaseClassName, - m_scriptEngine.ScriptBaseClassParameters, - sb); - - LSL_Converter.Convert(source,sb); - AddCSScriptTail(sb); - compileScript = sb.ToString(); - // copy converter warnings into our warnings. - foreach (string warning in LSL_Converter.GetWarnings()) - { - AddWarning(warning); - } - - linemap = ((CSCodeGenerator)LSL_Converter).PositionMap; - // Write the linemap to a file and save it in our dictionary for next time. - m_lineMaps[assembly] = linemap; - WriteMapFile(assembly + ".map", linemap); - LSL_Converter.Clear(); - } - else - { - switch (language) - { - case enumCompileType.cs: - compileScript = CreateCSCompilerScript( - source, - m_scriptEngine.ScriptClassName, - m_scriptEngine.ScriptBaseClassName, - m_scriptEngine.ScriptBaseClassParameters); - break; - case enumCompileType.vb: - compileScript = CreateVBCompilerScript( - source, m_scriptEngine.ScriptClassName, m_scriptEngine.ScriptBaseClassName); - break; - } - } - - assembly = CompileFromDotNetText(compileScript, language, asset, assembly); - } - - public string[] GetWarnings() - { - return m_warnings.ToArray(); - } - - private void AddWarning(string warning) - { - if (!m_warnings.Contains(warning)) - { - m_warnings.Add(warning); - } - } - -// private static string CreateJSCompilerScript(string compileScript) -// { -// compileScript = String.Empty + -// "import OpenSim.Region.ScriptEngine.Shared; import System.Collections.Generic;\r\n" + -// "package SecondLife {\r\n" + -// "class Script extends OpenSim.Region.ScriptEngine.Shared.ScriptBase.ScriptBaseClass { \r\n" + -// compileScript + -// "} }\r\n"; -// return compileScript; -// } - - public static void AddCSScriptHeader(string className, string baseClassName, ParameterInfo[] constructorParameters, StringBuilder sb) - { - sb.Append(string.Format( -@"using OpenSim.Region.ScriptEngine.Shared; -using System.Collections.Generic; - -namespace SecondLife -{{ - public class {0} : {1} - {{ - public {0}({2}) : base({3}) {{}} -", - className, - baseClassName, - constructorParameters != null - ? string.Join(", ", Array.ConvertAll(constructorParameters, pi => pi.ToString())) - : "", - constructorParameters != null - ? string.Join(", ", Array.ConvertAll(constructorParameters, pi => pi.Name)) - : "" - )); - } - - public static void AddCSScriptTail(StringBuilder sb) - { - sb.Append(string.Format(" }}\n}}\n")); - } - - public static string CreateCSCompilerScript( - string compileScript, string className, string baseClassName, ParameterInfo[] constructorParameters) - { - compileScript = string.Format( -@"using OpenSim.Region.ScriptEngine.Shared; -using System.Collections.Generic; - -namespace SecondLife -{{ - public class {0} : {1} - {{ - public {0}({2}) : base({3}) {{}} -{4} - }} -}}", - className, - baseClassName, - constructorParameters != null - ? string.Join(", ", Array.ConvertAll(constructorParameters, pi => pi.ToString())) - : "", - constructorParameters != null - ? string.Join(", ", Array.ConvertAll(constructorParameters, pi => pi.Name)) - : "", - compileScript); - - return compileScript; - } - - public static string CreateVBCompilerScript(string compileScript, string className, string baseClassName) - { - compileScript = String.Empty + - "Imports OpenSim.Region.ScriptEngine.Shared: Imports System.Collections.Generic: " + - String.Empty + "NameSpace SecondLife:" + - String.Empty + "Public Class " + className + ": Inherits " + baseClassName + - "\r\nPublic Sub New()\r\nEnd Sub: " + - compileScript + - ":End Class :End Namespace\r\n"; - - return compileScript; - } - - /// - /// Compile .NET script to .Net assembly (.dll) - /// - /// CS script - /// Filename to .dll assembly - internal string CompileFromDotNetText(string Script, enumCompileType lang, string asset, string assembly) - { -// m_log.DebugFormat("[Compiler]: Compiling to assembly\n{0}", Script); - - string ext = "." + lang.ToString(); - - // Output assembly name - scriptCompileCounter++; - try - { - if (File.Exists(assembly)) - { - File.SetAttributes(assembly, FileAttributes.Normal); - File.Delete(assembly); - } - } - catch (Exception e) // NOTLEGIT - Should be just FileIOException - { - throw new Exception("Unable to delete old existing " + - "script-file before writing new. Compile aborted: " + - e.ToString()); - } - - // DEBUG - write source to disk - if (WriteScriptSourceToDebugFile) - { - string srcFileName = FilePrefix + "_source_" + - Path.GetFileNameWithoutExtension(assembly) + ext; - try - { - File.WriteAllText(Path.Combine(Path.Combine( - ScriptEnginesPath, - m_scriptEngine.World.RegionInfo.RegionID.ToString()), - srcFileName), Script); - } - catch (Exception ex) //NOTLEGIT - Should be just FileIOException - { - m_log.Error("[Compiler]: Exception while " + - "trying to write script source to file \"" + - srcFileName + "\": " + ex.ToString()); - } - } - - // Do actual compile - CompilerParameters parameters = new CompilerParameters(); - - string rootPath = AppDomain.CurrentDomain.BaseDirectory; - - parameters.ReferencedAssemblies.Add(Path.Combine(rootPath, - "OpenSim.Region.ScriptEngine.Shared.dll")); - parameters.ReferencedAssemblies.Add(Path.Combine(rootPath, - "OpenSim.Region.ScriptEngine.Shared.Api.Runtime.dll")); - parameters.ReferencedAssemblies.Add(Path.Combine(rootPath, - "OpenMetaverseTypes.dll")); - - if (m_scriptEngine.ScriptReferencedAssemblies != null) - Array.ForEach( - m_scriptEngine.ScriptReferencedAssemblies, - a => parameters.ReferencedAssemblies.Add(Path.Combine(rootPath, a))); - - parameters.GenerateExecutable = false; - parameters.OutputAssembly = assembly; - parameters.IncludeDebugInformation = CompileWithDebugInformation; - //parameters.WarningLevel = 1; // Should be 4? - parameters.TreatWarningsAsErrors = false; - parameters.GenerateInMemory = false; - -// parameters.TempFiles = new TempFileCollection(Path.Combine(ScriptEnginesPath, -// m_scriptEngine.World.RegionInfo.RegionID.ToString()), CompileWithDebugInformation); - - CompilerResults results; - - CodeDomProvider provider; - switch (lang) - { - case enumCompileType.vb: - provider = CodeDomProvider.CreateProvider("VisualBasic"); - break; - case enumCompileType.cs: - case enumCompileType.lsl: - provider = CodeDomProvider.CreateProvider("CSharp"); - break; - default: - throw new Exception("Compiler is not able to recongnize " + - "language type \"" + lang.ToString() + "\""); - } - - if(provider == null) - throw new Exception("Compiler failed to load "); - - bool complete = false; - bool retried = false; - - do - { - results = provider.CompileAssemblyFromSource( - parameters, Script); - // Deal with an occasional segv in the compiler. - // Rarely, if ever, occurs twice in succession. - // Line # == 0 and no file name are indications that - // this is a native stack trace rather than a normal - // error log. - if (results.Errors.Count > 0) - { - if (!retried && string.IsNullOrEmpty(results.Errors[0].FileName) && - results.Errors[0].Line == 0) - { - // System.Console.WriteLine("retrying failed compilation"); - retried = true; - } - else - { - complete = true; - } - } - else - { - complete = true; - } - } while (!complete); - - // - // WARNINGS AND ERRORS - // - bool hadErrors = false; - string errtext = String.Empty; - if (results.Errors.Count > 0) - { - foreach (CompilerError CompErr in results.Errors) - { - string severity = CompErr.IsWarning ? "Warning" : "Error"; - - KeyValuePair errorPos; - - // Show 5 errors max, but check entire list for errors - - if (severity == "Error") - { - // C# scripts will not have a linemap since theres no line translation involved. - if (!m_lineMaps.ContainsKey(assembly)) - errorPos = new KeyValuePair(CompErr.Line, CompErr.Column); - else - errorPos = FindErrorPosition(CompErr.Line, CompErr.Column, m_lineMaps[assembly]); - - string text = CompErr.ErrorText; - - // Use LSL type names - if (lang == enumCompileType.lsl) - text = ReplaceTypes(CompErr.ErrorText); - - // The Second Life viewer's script editor begins - // countingn lines and columns at 0, so we subtract 1. - errtext += String.Format("({0},{1}): {4} {2}: {3}\n", - errorPos.Key - 1, errorPos.Value - 1, - CompErr.ErrorNumber, text, severity); - hadErrors = true; - } - } - } - - provider.Dispose(); - - if (hadErrors) - { - throw new Exception(errtext); - } - - // On today's highly asynchronous systems, the result of - // the compile may not be immediately apparent. Wait a - // reasonable amount of time before giving up on it. - - if (!File.Exists(assembly)) - { - for (int i = 0; i < 20 && !File.Exists(assembly); i++) - { - System.Threading.Thread.Sleep(250); - } - // One final chance... - if (!File.Exists(assembly)) - { - errtext = String.Empty; - errtext += "No compile error. But not able to locate compiled file."; - throw new Exception(errtext); - } - } - - // m_log.DebugFormat("[Compiler] Compiled new assembly "+ - // "for {0}", asset); - - // Because windows likes to perform exclusive locks, we simply - // write out a textual representation of the file here - // - // Read the binary file into a buffer - // - FileInfo fi = new FileInfo(assembly); - - if (fi == null) - { - errtext = String.Empty; - errtext += "No compile error. But not able to stat file."; - throw new Exception(errtext); - } - - Byte[] data = new Byte[fi.Length]; - - try - { - using (FileStream fs = File.Open(assembly, FileMode.Open, FileAccess.Read)) - fs.Read(data, 0, data.Length); - } - catch (Exception) - { - errtext = String.Empty; - errtext += "No compile error. But not able to open file."; - throw new Exception(errtext); - } - - // Convert to base64 - // - string filetext = System.Convert.ToBase64String(data); - - Byte[] buf = Encoding.ASCII.GetBytes(filetext); - - using (FileStream sfs = File.Create(assembly + ".text")) - sfs.Write(buf, 0, buf.Length); - - return assembly; - } - - private class kvpSorter : IComparer, KeyValuePair>> - { - public int Compare(KeyValuePair, KeyValuePair> a, - KeyValuePair, KeyValuePair> b) - { - int kc = a.Key.Key.CompareTo(b.Key.Key); - return (kc != 0) ? kc : a.Key.Value.CompareTo(b.Key.Value); - } - } - - public static KeyValuePair FindErrorPosition(int line, - int col, Dictionary, - KeyValuePair> positionMap) - { - if (positionMap == null || positionMap.Count == 0) - return new KeyValuePair(line, col); - - KeyValuePair ret = new KeyValuePair(); - - if (positionMap.TryGetValue(new KeyValuePair(line, col), - out ret)) - return ret; - - var sorted = new List, KeyValuePair>>(positionMap); - - sorted.Sort(new kvpSorter()); - - int l = 1; - int c = 1; - int pl = 1; - - foreach (KeyValuePair, KeyValuePair> posmap in sorted) - { - //m_log.DebugFormat("[Compiler]: Scanning line map {0},{1} --> {2},{3}", posmap.Key.Key, posmap.Key.Value, posmap.Value.Key, posmap.Value.Value); - int nl = posmap.Value.Key + line - posmap.Key.Key; // New, translated LSL line and column. - int nc = posmap.Value.Value + col - posmap.Key.Value; - // Keep going until we find the first point passed line,col. - if (posmap.Key.Key > line) - { - //m_log.DebugFormat("[Compiler]: Line is larger than requested {0},{1}, returning {2},{3}", line, col, l, c); - if (pl < line) - { - //m_log.DebugFormat("[Compiler]: Previous line ({0}) is less than requested line ({1}), setting column to 1.", pl, line); - c = 1; - } - break; - } - if (posmap.Key.Key == line && posmap.Key.Value > col) - { - // Never move l,c backwards. - if (nl > l || (nl == l && nc > c)) - { - //m_log.DebugFormat("[Compiler]: Using offset relative to this: {0} + {1} - {2}, {3} + {4} - {5} = {6}, {7}", - // posmap.Value.Key, line, posmap.Key.Key, posmap.Value.Value, col, posmap.Key.Value, nl, nc); - l = nl; - c = nc; - } - //m_log.DebugFormat("[Compiler]: Column is larger than requested {0},{1}, returning {2},{3}", line, col, l, c); - break; - } - pl = posmap.Key.Key; - l = posmap.Value.Key; - c = posmap.Value.Value; - } - return new KeyValuePair(l, c); - } - - string ReplaceTypes(string message) - { - message = message.Replace( - "OpenSim.Region.ScriptEngine.Shared.LSL_Types.LSLString", - "string"); - - message = message.Replace( - "OpenSim.Region.ScriptEngine.Shared.LSL_Types.LSLInteger", - "integer"); - - message = message.Replace( - "OpenSim.Region.ScriptEngine.Shared.LSL_Types.LSLFloat", - "float"); - - message = message.Replace( - "OpenSim.Region.ScriptEngine.Shared.LSL_Types.list", - "list"); - - return message; - } - - private static void WriteMapFile(string filename, Dictionary, KeyValuePair> linemap) - { - StringBuilder mapbuilder = new StringBuilder(1024); - - foreach (KeyValuePair, KeyValuePair> kvp in linemap) - { - KeyValuePair k = kvp.Key; - KeyValuePair v = kvp.Value; - mapbuilder.Append(String.Format("{0},{1},{2},{3}\n", k.Key, k.Value, v.Key, v.Value)); - } - - Byte[] mapbytes = Encoding.ASCII.GetBytes(mapbuilder.ToString()); - - using (FileStream mfs = File.Create(filename)) - mfs.Write(mapbytes, 0, mapbytes.Length); - } - - private static Dictionary, KeyValuePair> ReadMapFile(string filename) - { - Dictionary, KeyValuePair> linemap; - try - { - using (StreamReader r = File.OpenText(filename)) - { - linemap = new Dictionary, KeyValuePair>(); - - string line; - while ((line = r.ReadLine()) != null) - { - String[] parts = line.Split(new Char[] { ',' }); - int kk = System.Convert.ToInt32(parts[0]); - int kv = System.Convert.ToInt32(parts[1]); - int vk = System.Convert.ToInt32(parts[2]); - int vv = System.Convert.ToInt32(parts[3]); - - KeyValuePair k = new KeyValuePair(kk, kv); - KeyValuePair v = new KeyValuePair(vk, vv); - - linemap[k] = v; - } - } - } - catch - { - linemap = new Dictionary, KeyValuePair>(); - } - - return linemap; - } - } -} \ No newline at end of file diff --git a/OpenSim/Region/ScriptEngine/Shared/CodeTools/ICodeConverter.cs b/OpenSim/Region/ScriptEngine/Shared/CodeTools/ICodeConverter.cs deleted file mode 100644 index 076caad261..0000000000 --- a/OpenSim/Region/ScriptEngine/Shared/CodeTools/ICodeConverter.cs +++ /dev/null @@ -1,41 +0,0 @@ -/* -* Copyright (c) Contributors, http://opensimulator.org/ -* See CONTRIBUTORS.TXT for a full list of copyright holders. -* -* Redistribution and use in source and binary forms, with or without -* modification, are permitted provided that the following conditions are met: -* * Redistributions of source code must retain the above copyright -* notice, this list of conditions and the following disclaimer. -* * Redistributions in binary form must reproduce the above copyright -* notice, this list of conditions and the following disclaimer in the -* documentation and/or other materials provided with the distribution. -* * Neither the name of the OpenSimulator Project nor the -* names of its contributors may be used to endorse or promote products -* derived from this software without specific prior written permission. -* -* THIS SOFTWARE IS PROVIDED BY THE DEVELOPERS AS IS AND ANY -* EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED -* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE -* DISCLAIMED. IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR ANY -* DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES -* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; -* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND -* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS -* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -* -*/ - -using System; -using System.Text; - -namespace OpenSim.Region.ScriptEngine.Shared.CodeTools -{ - public interface ICodeConverter - { - string Convert(string script); - void Convert(string script, StringBuilder sb); - string[] GetWarnings(); - void Clear(); - } -} diff --git a/OpenSim/Region/ScriptEngine/Shared/CodeTools/LSL2CSCodeTransformer.cs b/OpenSim/Region/ScriptEngine/Shared/CodeTools/LSL2CSCodeTransformer.cs deleted file mode 100644 index 0585f8b05e..0000000000 --- a/OpenSim/Region/ScriptEngine/Shared/CodeTools/LSL2CSCodeTransformer.cs +++ /dev/null @@ -1,205 +0,0 @@ -/* - * Copyright (c) Contributors, http://opensimulator.org/ - * See CONTRIBUTORS.TXT for a full list of copyright holders. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: - * * Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * * Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * * Neither the name of the OpenSimulator Project nor the - * names of its contributors may be used to endorse or promote products - * derived from this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE DEVELOPERS ``AS IS'' AND ANY - * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR ANY - * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - */ - -using System; -using System.Collections.Generic; -using System.Reflection; -using log4net; -using Tools; - -namespace OpenSim.Region.ScriptEngine.Shared.CodeTools -{ - public class LSL2CSCodeTransformer - { -// private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType); - - private SYMBOL m_astRoot = null; - private static Dictionary m_datatypeLSL2OpenSim = null; - - /// - /// Pass the new CodeTranformer an abstract syntax tree. - /// - /// The root node of the AST. - public LSL2CSCodeTransformer(SYMBOL astRoot) - { - m_astRoot = astRoot; - - // let's populate the dictionary - if (null == m_datatypeLSL2OpenSim) - { - m_datatypeLSL2OpenSim = new Dictionary(); - m_datatypeLSL2OpenSim.Add("integer", "LSL_Types.LSLInteger"); - m_datatypeLSL2OpenSim.Add("float", "LSL_Types.LSLFloat"); - //m_datatypeLSL2OpenSim.Add("key", "LSL_Types.key"); // key doesn't seem to be used - m_datatypeLSL2OpenSim.Add("key", "LSL_Types.LSLString"); - m_datatypeLSL2OpenSim.Add("string", "LSL_Types.LSLString"); - m_datatypeLSL2OpenSim.Add("vector", "LSL_Types.Vector3"); - m_datatypeLSL2OpenSim.Add("rotation", "LSL_Types.Quaternion"); - m_datatypeLSL2OpenSim.Add("list", "LSL_Types.list"); - } - } - - /// - /// Transform the code in the AST we have. - /// - /// The root node of the transformed AST - public SYMBOL Transform() - { - foreach (SYMBOL s in m_astRoot.kids) - TransformNode(s); - - return m_astRoot; - } - - /// - /// Recursively called to transform each type of node. Will transform this - /// node, then all it's children. - /// - /// The current node to transform. - private void TransformNode(SYMBOL s) - { -// m_log.DebugFormat("[LSL2CSCODETRANSFORMER]: Tranforming node {0}", s); - - // make sure to put type lower in the inheritance hierarchy first - // ie: since IdentConstant and StringConstant inherit from Constant, - // put IdentConstant and StringConstant before Constant - if (s is Declaration) - ((Declaration) s).Datatype = m_datatypeLSL2OpenSim[((Declaration) s).Datatype]; - else if (s is Constant) - ((Constant) s).Type = m_datatypeLSL2OpenSim[((Constant) s).Type]; - else if (s is TypecastExpression) - ((TypecastExpression) s).TypecastType = m_datatypeLSL2OpenSim[((TypecastExpression) s).TypecastType]; - else if (s is GlobalFunctionDefinition && "void" != ((GlobalFunctionDefinition) s).ReturnType) // we don't need to translate "void" - ((GlobalFunctionDefinition) s).ReturnType = m_datatypeLSL2OpenSim[((GlobalFunctionDefinition) s).ReturnType]; - - for (int i = 0; i < s.kids.Count; i++) - { - // It's possible that a child is null, for instance when the - // assignment part in a for-loop is left out, ie: - // - // for (; i < 10; i++) - // { - // ... - // } - // - // We need to check for that here. - if (null != s.kids[i]) - { -// m_log.Debug("[LSL2CSCODETRANSFORMER]: Moving down level"); - - if (!(s is Assignment || s is ArgumentDeclarationList) && s.kids[i] is Declaration) - AddImplicitInitialization(s, i); - - TransformNode((SYMBOL) s.kids[i]); - -// m_log.Debug("[LSL2CSCODETRANSFORMER]: Moving up level"); - } - } - } - - /// - /// Replaces an instance of the node at s.kids[didx] with an assignment - /// node. The assignment node has the Declaration node on the left hand - /// side and a default initializer on the right hand side. - /// - /// - /// The node containing the Declaration node that needs replacing. - /// - /// Index of the Declaration node to replace. - private void AddImplicitInitialization(SYMBOL s, int didx) - { - // We take the kids for a while to play with them. - int sKidSize = s.kids.Count; - object [] sKids = new object[sKidSize]; - for (int i = 0; i < sKidSize; i++) - sKids[i] = s.kids.Pop(); - - // The child to be changed. - Declaration currentDeclaration = (Declaration) sKids[didx]; - - // We need an assignment node. - Assignment newAssignment = new Assignment(currentDeclaration.yyps, - currentDeclaration, - GetZeroConstant(currentDeclaration.yyps, currentDeclaration.Datatype), - "="); - sKids[didx] = newAssignment; - - // Put the kids back where they belong. - for (int i = 0; i < sKidSize; i++) - s.kids.Add(sKids[i]); - } - - /// - /// Generates the node structure required to generate a default - /// initialization. - /// - /// - /// Tools.Parser instance to use when instantiating nodes. - /// - /// String describing the datatype. - /// - /// A SYMBOL node conaining the appropriate structure for intializing a - /// constantType. - /// - private SYMBOL GetZeroConstant(Parser p, string constantType) - { - switch (constantType) - { - case "integer": - return new Constant(p, constantType, "0"); - case "float": - return new Constant(p, constantType, "0.0"); - case "string": - case "key": - return new Constant(p, constantType, ""); - case "list": - ArgumentList al = new ArgumentList(p); - return new ListConstant(p, al); - case "vector": - Constant vca = new Constant(p, "float", "0.0"); - Constant vcb = new Constant(p, "float", "0.0"); - Constant vcc = new Constant(p, "float", "0.0"); - ConstantExpression vcea = new ConstantExpression(p, vca); - ConstantExpression vceb = new ConstantExpression(p, vcb); - ConstantExpression vcec = new ConstantExpression(p, vcc); - return new VectorConstant(p, vcea, vceb, vcec); - case "rotation": - Constant rca = new Constant(p, "float", "0.0"); - Constant rcb = new Constant(p, "float", "0.0"); - Constant rcc = new Constant(p, "float", "0.0"); - Constant rcd = new Constant(p, "float", "1.0"); - ConstantExpression rcea = new ConstantExpression(p, rca); - ConstantExpression rceb = new ConstantExpression(p, rcb); - ConstantExpression rcec = new ConstantExpression(p, rcc); - ConstantExpression rced = new ConstantExpression(p, rcd); - return new RotationConstant(p, rcea, rceb, rcec, rced); - default: - return null; // this will probably break stuff - } - } - } -} diff --git a/OpenSim/Region/ScriptEngine/Shared/CodeTools/Properties/AssemblyInfo.cs b/OpenSim/Region/ScriptEngine/Shared/CodeTools/Properties/AssemblyInfo.cs deleted file mode 100644 index 304cd81a0e..0000000000 --- a/OpenSim/Region/ScriptEngine/Shared/CodeTools/Properties/AssemblyInfo.cs +++ /dev/null @@ -1,33 +0,0 @@ -using System.Reflection; -using System.Runtime.CompilerServices; -using System.Runtime.InteropServices; - -// General Information about an assembly is controlled through the following -// set of attributes. Change these attribute values to modify the information -// associated with an assembly. -[assembly: AssemblyTitle("OpenSim.Region.ScriptEngine.Shared.CodeTools")] -[assembly: AssemblyDescription("")] -[assembly: AssemblyConfiguration("")] -[assembly: AssemblyCompany("http://opensimulator.org")] -[assembly: AssemblyProduct("OpenSim")] -[assembly: AssemblyCopyright("OpenSimulator developers")] -[assembly: AssemblyTrademark("")] -[assembly: AssemblyCulture("")] - -// Setting ComVisible to false makes the types in this assembly not visible -// to COM components. If you need to access a type in this assembly from -// COM, set the ComVisible attribute to true on that type. -[assembly: ComVisible(false)] - -// The following GUID is for the ID of the typelib if this project is exposed to COM -[assembly: Guid("fd446fb3-3a21-471b-951c-68b9eb6ef8e5")] - -// Version information for an assembly consists of the following four values: -// -// Major Version -// Minor Version -// Build Number -// Revision -// -[assembly: AssemblyVersion(OpenSim.VersionInfo.AssemblyVersionNumber)] - diff --git a/OpenSim/Region/ScriptEngine/Shared/CodeTools/Tests/CSCodeGeneratorTest.cs b/OpenSim/Region/ScriptEngine/Shared/CodeTools/Tests/CSCodeGeneratorTest.cs deleted file mode 100644 index a9f3283cb6..0000000000 --- a/OpenSim/Region/ScriptEngine/Shared/CodeTools/Tests/CSCodeGeneratorTest.cs +++ /dev/null @@ -1,1809 +0,0 @@ -/* - * Copyright (c) Contributors, http://opensimulator.org/ - * See CONTRIBUTORS.TXT for a full list of copyright holders. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: - * * Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * * Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * * Neither the name of the OpenSimulator Project nor the - * names of its contributors may be used to endorse or promote products - * derived from this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE DEVELOPERS ``AS IS'' AND ANY - * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR ANY - * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - */ - -using System.Collections.Generic; -using System.Text.RegularExpressions; -using NUnit.Framework; -using OpenSim.Region.ScriptEngine.Shared.CodeTools; -using OpenSim.Tests.Common; - -namespace OpenSim.Region.ScriptEngine.Shared.CodeTools.Tests -{ - /// - /// Tests the LSL compiler, both the code generation and transformation. - /// Each test has some LSL code as input and C# code as expected output. - /// The generated C# code is compared against the expected C# code. - /// - [TestFixture] - public class CSCodeGeneratorTest : OpenSimTestCase - { - [Test] - public void TestDefaultState() - { - TestHelpers.InMethod(); - - string input = @"default -{ - state_entry() - { - } -} -"; - string expected = - "\n public void default_event_state_entry()" + - "\n {" + - "\n }\n"; - - CSCodeGenerator cg = new CSCodeGenerator(); - string output = cg.Convert(input); - Assert.AreEqual(expected, output); - } - - [Test] - public void TestCustomState() - { - TestHelpers.InMethod(); - - string input = @"default -{ - state_entry() - { - } -} - -state another_state -{ - no_sensor() - { - } -} -"; - string expected = - "\n public void default_event_state_entry()" + - "\n {" + - "\n }" + - "\n public void another_state_event_no_sensor()" + - "\n {" + - "\n }\n"; - - CSCodeGenerator cg = new CSCodeGenerator(); - string output = cg.Convert(input); - Assert.AreEqual(expected, output); - } - - [Test] - public void TestEventWithArguments() - { - TestHelpers.InMethod(); - - string input = @"default -{ - at_rot_target(integer tnum, rotation targetrot, rotation ourrot) - { - } -} -"; - string expected = - "\n public void default_event_at_rot_target(LSL_Types.LSLInteger tnum, LSL_Types.Quaternion targetrot, LSL_Types.Quaternion ourrot)" + - "\n {" + - "\n }\n"; - - CSCodeGenerator cg = new CSCodeGenerator(); - string output = cg.Convert(input); - Assert.AreEqual(expected, output); - } - - [Test] - public void TestIntegerDeclaration() - { - TestHelpers.InMethod(); - - string input = @"default -{ - touch_start(integer num_detected) - { - integer x; - } -} -"; - string expected = - "\n public void default_event_touch_start(LSL_Types.LSLInteger num_detected)" + - "\n {" + - "\n LSL_Types.LSLInteger x = new LSL_Types.LSLInteger(0);" + - "\n }\n"; - - CSCodeGenerator cg = new CSCodeGenerator(); - string output = cg.Convert(input); - Assert.AreEqual(expected, output); - } - - [Test] - public void TestLoneIdent() - { - TestHelpers.InMethod(); - - // A lone ident should be removed completely as it's an error in C# - // (MONO at least). - string input = @"default -{ - touch_start(integer num_detected) - { - integer x; - x; - } -} -"; - string expected = - "\n public void default_event_touch_start(LSL_Types.LSLInteger num_detected)" + - "\n {" + - "\n LSL_Types.LSLInteger x = new LSL_Types.LSLInteger(0);" + - "\n ;" + - "\n }\n"; - - CSCodeGenerator cg = new CSCodeGenerator(); - string output = cg.Convert(input); - Assert.AreEqual(expected, output); - } - - [Test] - public void TestAssignments() - { - TestHelpers.InMethod(); - - string input = @"default -{ - touch_start(integer num_detected) - { - string y; - integer x = 14; - y = ""Hello""; - } -} -"; - string expected = - "\n public void default_event_touch_start(LSL_Types.LSLInteger num_detected)" + - "\n {" + - "\n LSL_Types.LSLString y = new LSL_Types.LSLString(\"\");" + - "\n LSL_Types.LSLInteger x = new LSL_Types.LSLInteger(14);" + - "\n y = new LSL_Types.LSLString(\"Hello\");" + - "\n }\n"; - - CSCodeGenerator cg = new CSCodeGenerator(); - string output = cg.Convert(input); - Assert.AreEqual(expected, output); - } - - [Test] - public void TestAdditionSubtractionOperator() - { - TestHelpers.InMethod(); - - string input = @"default -{ - touch_start(integer num_detected) - { - integer y = -3; - integer x = 14 + 6; - y = 12 +45+20+x + 23 + 1 + x + y; - y = 12 + -45 + - 20 + x + 23 + -1 + x + y; - } -} -"; - string expected = - "\n public void default_event_touch_start(LSL_Types.LSLInteger num_detected)\n" + - " {\n" + - " LSL_Types.LSLInteger y = -new LSL_Types.LSLInteger(3);\n" + - " LSL_Types.LSLInteger x = new LSL_Types.LSLInteger(14) + new LSL_Types.LSLInteger(6);\n" + - " y = new LSL_Types.LSLInteger(12) + new LSL_Types.LSLInteger(45) + new LSL_Types.LSLInteger(20) + x + new LSL_Types.LSLInteger(23) + new LSL_Types.LSLInteger(1) + x + y;\n" + - " y = new LSL_Types.LSLInteger(12) + -new LSL_Types.LSLInteger(45) + -new LSL_Types.LSLInteger(20) + x + new LSL_Types.LSLInteger(23) + -new LSL_Types.LSLInteger(1) + x + y;\n" + - " }\n"; - - CSCodeGenerator cg = new CSCodeGenerator(); - string output = cg.Convert(input); - Assert.AreEqual(expected, output); - } - - [Test] - public void TestStrings() - { - TestHelpers.InMethod(); - - string input = @"default -{ - touch_start(integer num_detected) - { - llOwnerSay(""Testing, 1, 2, 3""); - llSay(0, ""I can hear you!""); - some_custom_function(1, 2, 3 +x, 4, ""five"", ""arguments""); - } -} -"; - string expected = - "\n public void default_event_touch_start(LSL_Types.LSLInteger num_detected)" + - "\n {" + - "\n llOwnerSay(new LSL_Types.LSLString(\"Testing, 1, 2, 3\"));" + - "\n llSay(new LSL_Types.LSLInteger(0), new LSL_Types.LSLString(\"I can hear you!\"));" + - "\n some_custom_function(new LSL_Types.LSLInteger(1), new LSL_Types.LSLInteger(2), new LSL_Types.LSLInteger(3) + x, new LSL_Types.LSLInteger(4), new LSL_Types.LSLString(\"five\"), new LSL_Types.LSLString(\"arguments\"));" + - "\n }" + - "\n"; - - CSCodeGenerator cg = new CSCodeGenerator(); - string output = cg.Convert(input); - Assert.AreEqual(expected, output); - } - - [Test] - public void TestBinaryExpression() - { - TestHelpers.InMethod(); - - string input = @"default -{ - touch_start(integer num_detected) - { - integer y; - integer x = 14 + 6; - y = 12 - 3; - y = 12 && 3; - y = 12 || 3; - y = 12 * 3; - y = 12 / 3; - y = 12 | 3; - y = 12 & 3; - y = 12 % 3; - y = 12 + 45 - 20 * x / 23 | 1 & x + y; - } -} -"; - string expected = - "\n public void default_event_touch_start(LSL_Types.LSLInteger num_detected)" + - "\n {" + - "\n LSL_Types.LSLInteger y = new LSL_Types.LSLInteger(0);" + - "\n LSL_Types.LSLInteger x = new LSL_Types.LSLInteger(14) + new LSL_Types.LSLInteger(6);" + - "\n y = new LSL_Types.LSLInteger(12) - new LSL_Types.LSLInteger(3);" + - "\n y = ((bool)(new LSL_Types.LSLInteger(12))) & ((bool)(new LSL_Types.LSLInteger(3)));" + - "\n y = ((bool)(new LSL_Types.LSLInteger(12))) | ((bool)(new LSL_Types.LSLInteger(3)));" + - "\n y = new LSL_Types.LSLInteger(12) * new LSL_Types.LSLInteger(3);" + - "\n y = new LSL_Types.LSLInteger(12) / new LSL_Types.LSLInteger(3);" + - "\n y = new LSL_Types.LSLInteger(12) | new LSL_Types.LSLInteger(3);" + - "\n y = new LSL_Types.LSLInteger(12) & new LSL_Types.LSLInteger(3);" + - "\n y = new LSL_Types.LSLInteger(12) % new LSL_Types.LSLInteger(3);" + - "\n y = new LSL_Types.LSLInteger(12) + new LSL_Types.LSLInteger(45) - new LSL_Types.LSLInteger(20) * x / new LSL_Types.LSLInteger(23) | new LSL_Types.LSLInteger(1) & x + y;" + - "\n }\n"; - - CSCodeGenerator cg = new CSCodeGenerator(); - string output = cg.Convert(input); - Assert.AreEqual(expected, output); - } - - [Test] - public void TestFloatConstants() - { - TestHelpers.InMethod(); - - string input = @"default -{ - touch_start(integer num_detected) - { - float y = 1.1; - y = 1.123E3; - y = 1.123e3; - y = 1.123E+3; - y = 1.123e+3; - y = 1.123E-3; - y = 1.123e-3; - y = .4; - y = -1.123E3; - y = -1.123e3; - y = -1.123E+3; - y = -1.123e+3; - y = -1.123E-3; - y = -1.123e-3; - y = -.4; - y = 12.3 + -1.45E3 - 1.20e-2; - } -} -"; - string expected = - "\n public void default_event_touch_start(LSL_Types.LSLInteger num_detected)" + - "\n {" + - "\n LSL_Types.LSLFloat y = new LSL_Types.LSLFloat(1.1);" + - "\n y = new LSL_Types.LSLFloat(1.123E3);" + - "\n y = new LSL_Types.LSLFloat(1.123e3);" + - "\n y = new LSL_Types.LSLFloat(1.123E+3);" + - "\n y = new LSL_Types.LSLFloat(1.123e+3);" + - "\n y = new LSL_Types.LSLFloat(1.123E-3);" + - "\n y = new LSL_Types.LSLFloat(1.123e-3);" + - "\n y = new LSL_Types.LSLFloat(.4);" + - "\n y = -new LSL_Types.LSLFloat(1.123E3);" + - "\n y = -new LSL_Types.LSLFloat(1.123e3);" + - "\n y = -new LSL_Types.LSLFloat(1.123E+3);" + - "\n y = -new LSL_Types.LSLFloat(1.123e+3);" + - "\n y = -new LSL_Types.LSLFloat(1.123E-3);" + - "\n y = -new LSL_Types.LSLFloat(1.123e-3);" + - "\n y = -new LSL_Types.LSLFloat(.4);" + - "\n y = new LSL_Types.LSLFloat(12.3) + -new LSL_Types.LSLFloat(1.45E3) - new LSL_Types.LSLFloat(1.20e-2);" + - "\n }\n"; - - CSCodeGenerator cg = new CSCodeGenerator(); - string output = cg.Convert(input); - Assert.AreEqual(expected, output); - } - - [Test] - public void TestComments() - { - TestHelpers.InMethod(); - - string input = @"// this test tests comments -default -{ - touch_start(integer num_detected) // this should be stripped - { - // fill in code here... - } -} -"; - string expected = - "\n public void default_event_touch_start(LSL_Types.LSLInteger num_detected)" + - "\n {" + - "\n }\n"; - - CSCodeGenerator cg = new CSCodeGenerator(); - string output = cg.Convert(input); - Assert.AreEqual(expected, output); - } - - [Test] - public void TestStringsWithEscapedQuotesAndComments() - { - TestHelpers.InMethod(); - - string input = @"// this test tests strings, with escaped quotes and comments in strings -default -{ - touch_start(integer num_detected) - { - string s1 = ""this is a string.""; - string s2 = ""this is a string ""+""with an escaped \"" inside it.""; - s1 = s2+"" and this ""+""is a string with // comments.""; - - string onemore = ""[\^@]""; - - string multiline = ""Good evening Sir, - my name is Steve. - I come from a rough area. - I used to be addicted to crack - but now I am off it and trying to stay clean. - That is why I am selling magazine subscriptions.""; // http://www.imdb.com/title/tt0151804/quotes - } -} -"; - - string expected = - "\n public void default_event_touch_start(LSL_Types.LSLInteger num_detected)" + - "\n {" + - "\n LSL_Types.LSLString s1 = new LSL_Types.LSLString(\"this is a string.\");" + - "\n LSL_Types.LSLString s2 = new LSL_Types.LSLString(\"this is a string \") + new LSL_Types.LSLString(\"with an escaped \\\" inside it.\");" + - "\n s1 = s2 + new LSL_Types.LSLString(\" and this \") + new LSL_Types.LSLString(\"is a string with // comments.\");" + - "\n LSL_Types.LSLString onemore = new LSL_Types.LSLString(\"[\\^@]\");" + - "\n LSL_Types.LSLString multiline = new LSL_Types.LSLString(\"Good evening Sir,\\n my name is Steve.\\n I come from a rough area.\\n I used to be addicted to crack\\n but now I am off it and trying to stay clean.\\n That is why I am selling magazine subscriptions.\");" + - "\n }\n"; - - CSCodeGenerator cg = new CSCodeGenerator(); - string output = cg.Convert(input); - Assert.AreEqual(expected, output); - } - - [Test] - public void TestCStyleComments() - { - TestHelpers.InMethod(); - - string input = @"/* this test tests comments - of the C variety -*/ -default -{ - touch_start(integer /* you can't see me! */ num_detected) /* this should be stripped */ - { - /* - * fill - * in - * code - * here... - */ - } -} -"; - string expected = - "\n public void default_event_touch_start(LSL_Types.LSLInteger num_detected)" + - "\n {" + - "\n }\n"; - - CSCodeGenerator cg = new CSCodeGenerator(); - string output = cg.Convert(input); - Assert.AreEqual(expected, output); - } - - [Test] - public void TestGlobalDefinedFunctions() - { - TestHelpers.InMethod(); - - string input = @"// this test tests custom defined functions - -string onefunc() -{ - return ""Hi from onefunc()!""; -} - -twofunc(string s) -{ - llSay(1000, s); -} - -default -{ - touch_start(integer num_detected) - { - llSay(2000, onefunc()); - twofunc(); - } -} -"; - string expected = - "\n LSL_Types.LSLString onefunc()" + - "\n {" + - "\n return new LSL_Types.LSLString(\"Hi from onefunc()!\");" + - "\n }" + - "\n void twofunc(LSL_Types.LSLString s)" + - "\n {" + - "\n llSay(new LSL_Types.LSLInteger(1000), s);" + - "\n }" + - "\n public void default_event_touch_start(LSL_Types.LSLInteger num_detected)" + - "\n {" + - "\n llSay(new LSL_Types.LSLInteger(2000), onefunc());" + - "\n twofunc();" + - "\n }\n"; - - CSCodeGenerator cg = new CSCodeGenerator(); - string output = cg.Convert(input); - Assert.AreEqual(expected, output); - } - - [Test] - public void TestGlobalDeclaredVariables() - { - TestHelpers.InMethod(); - - string input = @"// this test tests custom defined functions and global variables - -string globalString; -integer globalInt = 14; -integer anotherGlobal = 20 * globalInt; - -string onefunc() -{ - globalString = "" ...and the global!""; - return ""Hi "" + - ""from "" + - ""onefunc()!"" + globalString; -} - -twofunc(string s) -{ - llSay(1000, s); -} - -default -{ - touch_start(integer num_detected) - { - llSay(2000, onefunc()); - twofunc(); - } -} -"; - string expected = - "\n LSL_Types.LSLString globalString = new LSL_Types.LSLString(\"\");" + - "\n LSL_Types.LSLInteger globalInt = new LSL_Types.LSLInteger(14);" + - "\n LSL_Types.LSLInteger anotherGlobal = new LSL_Types.LSLInteger(20) * globalInt;" + - "\n LSL_Types.LSLString onefunc()" + - "\n {" + - "\n globalString = new LSL_Types.LSLString(\" ...and the global!\");" + - "\n return new LSL_Types.LSLString(\"Hi \") + new LSL_Types.LSLString(\"from \") + new LSL_Types.LSLString(\"onefunc()!\") + globalString;" + - "\n }" + - "\n void twofunc(LSL_Types.LSLString s)" + - "\n {" + - "\n llSay(new LSL_Types.LSLInteger(1000), s);" + - "\n }" + - "\n public void default_event_touch_start(LSL_Types.LSLInteger num_detected)" + - "\n {" + - "\n llSay(new LSL_Types.LSLInteger(2000), onefunc());" + - "\n twofunc();" + - "\n }\n"; - - CSCodeGenerator cg = new CSCodeGenerator(); - string output = cg.Convert(input); - Assert.AreEqual(expected, output); - } - - [Test] - public void TestMoreAssignments() - { - TestHelpers.InMethod(); - - string input = @"// this test tests +=, -=, *=, /=, %= - -string globalString; -integer globalInt = 14; - -string onefunc(string addition) -{ - globalInt -= 2; - - globalString += addition; - return ""Hi "" + - ""from "" + - ""onefunc()! "" + globalString; -} - -default -{ - touch_start(integer num_detected) - { - llSay(2000, onefunc()); - - integer x = 2; - x *= 3; - x /= 14 + -2; - x %= 10; - } -} -"; - string expected = - "\n LSL_Types.LSLString globalString = new LSL_Types.LSLString(\"\");" + - "\n LSL_Types.LSLInteger globalInt = new LSL_Types.LSLInteger(14);" + - "\n LSL_Types.LSLString onefunc(LSL_Types.LSLString addition)" + - "\n {" + - "\n globalInt -= new LSL_Types.LSLInteger(2);" + - "\n globalString += addition;" + - "\n return new LSL_Types.LSLString(\"Hi \") + new LSL_Types.LSLString(\"from \") + new LSL_Types.LSLString(\"onefunc()! \") + globalString;" + - "\n }" + - "\n public void default_event_touch_start(LSL_Types.LSLInteger num_detected)" + - "\n {" + - "\n llSay(new LSL_Types.LSLInteger(2000), onefunc());" + - "\n LSL_Types.LSLInteger x = new LSL_Types.LSLInteger(2);" + - "\n x *= new LSL_Types.LSLInteger(3);" + - "\n x /= new LSL_Types.LSLInteger(14) + -new LSL_Types.LSLInteger(2);" + - "\n x %= new LSL_Types.LSLInteger(10);" + - "\n }\n"; - - CSCodeGenerator cg = new CSCodeGenerator(); - string output = cg.Convert(input); - Assert.AreEqual(expected, output); - } - - [Test] - public void TestVectorConstantNotation() - { - TestHelpers.InMethod(); - - string input = @"default -{ - touch_start(integer num_detected) - { - vector y = <1.2, llGetMeAFloat(), 4.4>; - rotation x = <0.1, 0.1, one + 2, 0.9>; - - y = <0.1, 0.1, 1.1 - three - two+eight*8>; - } -} -"; - string expected = - "\n public void default_event_touch_start(LSL_Types.LSLInteger num_detected)" + - "\n {" + - "\n LSL_Types.Vector3 y = new LSL_Types.Vector3(new LSL_Types.LSLFloat(1.2), llGetMeAFloat(), new LSL_Types.LSLFloat(4.4));" + - "\n LSL_Types.Quaternion x = new LSL_Types.Quaternion(new LSL_Types.LSLFloat(0.1), new LSL_Types.LSLFloat(0.1), one + new LSL_Types.LSLInteger(2), new LSL_Types.LSLFloat(0.9));" + - "\n y = new LSL_Types.Vector3(new LSL_Types.LSLFloat(0.1), new LSL_Types.LSLFloat(0.1), new LSL_Types.LSLFloat(1.1) - three - two + eight * new LSL_Types.LSLInteger(8));" + - "\n }\n"; - - CSCodeGenerator cg = new CSCodeGenerator(); - string output = cg.Convert(input); - Assert.AreEqual(expected, output); - } - - [Test] - public void TestVectorMemberAccess() - { - TestHelpers.InMethod(); - - string input = @"default -{ - touch_start(integer num_detected) - { - vector y = <1.2, llGetMeAFloat(), 4.4>; - x = y.x + 1.1; - y.x = 1.1; - } -} -"; - string expected = - "\n public void default_event_touch_start(LSL_Types.LSLInteger num_detected)" + - "\n {" + - "\n LSL_Types.Vector3 y = new LSL_Types.Vector3(new LSL_Types.LSLFloat(1.2), llGetMeAFloat(), new LSL_Types.LSLFloat(4.4));" + - "\n x = y.x + new LSL_Types.LSLFloat(1.1);" + - "\n y.x = new LSL_Types.LSLFloat(1.1);" + - "\n }\n"; - - CSCodeGenerator cg = new CSCodeGenerator(); - string output = cg.Convert(input); - Assert.AreEqual(expected, output); - } - - [Test] - public void TestExpressionInParentheses() - { - TestHelpers.InMethod(); - - string input = @"default -{ - touch_start(integer num_detected) - { - integer y = -3; - integer x = 14 + 6; - y = 12 +45+20+x + (23 + 1) + x + y; - y = (12 + -45 + -20 + x + 23 )+ -1 + x + y; - } -} -"; - string expected = - "\n public void default_event_touch_start(LSL_Types.LSLInteger num_detected)" + - "\n {" + - "\n LSL_Types.LSLInteger y = -new LSL_Types.LSLInteger(3);" + - "\n LSL_Types.LSLInteger x = new LSL_Types.LSLInteger(14) + new LSL_Types.LSLInteger(6);" + - "\n y = new LSL_Types.LSLInteger(12) + new LSL_Types.LSLInteger(45) + new LSL_Types.LSLInteger(20) + x + (new LSL_Types.LSLInteger(23) + new LSL_Types.LSLInteger(1)) + x + y;" + - "\n y = (new LSL_Types.LSLInteger(12) + -new LSL_Types.LSLInteger(45) + -new LSL_Types.LSLInteger(20) + x + new LSL_Types.LSLInteger(23)) + -new LSL_Types.LSLInteger(1) + x + y;" + - "\n }\n"; - - CSCodeGenerator cg = new CSCodeGenerator(); - string output = cg.Convert(input); - Assert.AreEqual(expected, output); - } - - [Test] - public void TestIncrementDecrementOperator() - { - TestHelpers.InMethod(); - - string input = @"// here we'll test the ++ and -- operators - -default -{ - touch_start(integer num_detected) - { - integer y = -3; - integer x = 14 + 6; - y = 12 +45+20+x++ + (23 + 1) + ++x + -- y; - y = (12 + -45 + -20 + x-- + 23 )+ -1 + x -- + ++y; - } -} -"; - string expected = - "\n public void default_event_touch_start(LSL_Types.LSLInteger num_detected)" + - "\n {" + - "\n LSL_Types.LSLInteger y = -new LSL_Types.LSLInteger(3);" + - "\n LSL_Types.LSLInteger x = new LSL_Types.LSLInteger(14) + new LSL_Types.LSLInteger(6);" + - "\n y = new LSL_Types.LSLInteger(12) + new LSL_Types.LSLInteger(45) + new LSL_Types.LSLInteger(20) + x++ + (new LSL_Types.LSLInteger(23) + new LSL_Types.LSLInteger(1)) + ++x + --y;" + - "\n y = (new LSL_Types.LSLInteger(12) + -new LSL_Types.LSLInteger(45) + -new LSL_Types.LSLInteger(20) + x-- + new LSL_Types.LSLInteger(23)) + -new LSL_Types.LSLInteger(1) + x-- + ++y;" + - "\n }\n"; - - CSCodeGenerator cg = new CSCodeGenerator(); - string output = cg.Convert(input); - Assert.AreEqual(expected, output); - } - - [Test] - public void TestLists() - { - TestHelpers.InMethod(); - - string input = @"// testing lists - -default -{ - touch_start(integer num_detected) - { - list l = []; - list m = [1, two, ""three"", <4.0, 4.0, 4.0>, 5 + 5]; - llCallSomeFunc(1, llAnotherFunc(), [1, 2, 3]); - } -} -"; - string expected = - "\n public void default_event_touch_start(LSL_Types.LSLInteger num_detected)" + - "\n {" + - "\n LSL_Types.list l = new LSL_Types.list();" + - "\n LSL_Types.list m = new LSL_Types.list(new LSL_Types.LSLInteger(1), two, new LSL_Types.LSLString(\"three\"), new LSL_Types.Vector3(new LSL_Types.LSLFloat(4.0), new LSL_Types.LSLFloat(4.0), new LSL_Types.LSLFloat(4.0)), new LSL_Types.LSLInteger(5) + new LSL_Types.LSLInteger(5));" + - "\n llCallSomeFunc(new LSL_Types.LSLInteger(1), llAnotherFunc(), new LSL_Types.list(new LSL_Types.LSLInteger(1), new LSL_Types.LSLInteger(2), new LSL_Types.LSLInteger(3)));" + - "\n }\n"; - - CSCodeGenerator cg = new CSCodeGenerator(); - string output = cg.Convert(input); - Assert.AreEqual(expected, output); - } - - [Test] - public void TestIfStatement() - { - TestHelpers.InMethod(); -// TestHelpers.EnableLogging(); - - string input = @"// let's test if statements - -default -{ - touch_start(integer num_detected) - { - integer x = 1; - - if (x) llSay(0, ""Hello""); - if (1) - { - llSay(0, ""Hi""); - integer r = 3; - return; - } - - if (f(x)) llSay(0, ""f(x) is true""); - else llSay(0, ""f(x) is false""); - - if (x + y) llSay(0, ""x + y is true""); - else if (y - x) llSay(0, ""y - x is true""); - else llSay(0, ""Who needs x and y anyway?""); - - if (x * y) llSay(0, ""x * y is true""); - else if (y / x) - { - llSay(0, ""uh-oh, y / x is true, exiting""); - return; - } - else llSay(0, ""Who needs x and y anyway?""); - - // and now for my last trick - if (x % y) llSay(0, ""x is true""); - else if (y & x) llSay(0, ""y is true""); - else if (z | x) llSay(0, ""z is true""); - else if (a * (b + x)) llSay(0, ""a is true""); - else if (b) llSay(0, ""b is true""); - else if (v) llSay(0, ""v is true""); - else llSay(0, ""Everything is lies!""); - } -} -"; - string expected = - "\n public void default_event_touch_start(LSL_Types.LSLInteger num_detected)" + - "\n {" + - "\n LSL_Types.LSLInteger x = new LSL_Types.LSLInteger(1);" + - "\n if (x)" + - "\n llSay(new LSL_Types.LSLInteger(0), new LSL_Types.LSLString(\"Hello\"));" + - "\n if (new LSL_Types.LSLInteger(1))" + - "\n {" + - "\n llSay(new LSL_Types.LSLInteger(0), new LSL_Types.LSLString(\"Hi\"));" + - "\n LSL_Types.LSLInteger r = new LSL_Types.LSLInteger(3);" + - "\n return ;" + - "\n }" + - "\n if (f(x))" + - "\n llSay(new LSL_Types.LSLInteger(0), new LSL_Types.LSLString(\"f(x) is true\"));" + - "\n else" + - "\n llSay(new LSL_Types.LSLInteger(0), new LSL_Types.LSLString(\"f(x) is false\"));" + - "\n if (x + y)" + - "\n llSay(new LSL_Types.LSLInteger(0), new LSL_Types.LSLString(\"x + y is true\"));" + - "\n else" + - "\n if (y - x)" + - "\n llSay(new LSL_Types.LSLInteger(0), new LSL_Types.LSLString(\"y - x is true\"));" + - "\n else" + - "\n llSay(new LSL_Types.LSLInteger(0), new LSL_Types.LSLString(\"Who needs x and y anyway?\"));" + - "\n if (x * y)" + - "\n llSay(new LSL_Types.LSLInteger(0), new LSL_Types.LSLString(\"x * y is true\"));" + - "\n else" + - "\n if (y / x)" + - "\n {" + - "\n llSay(new LSL_Types.LSLInteger(0), new LSL_Types.LSLString(\"uh-oh, y / x is true, exiting\"));" + - "\n return ;" + - "\n }" + - "\n else" + - "\n llSay(new LSL_Types.LSLInteger(0), new LSL_Types.LSLString(\"Who needs x and y anyway?\"));" + - "\n if (x % y)" + - "\n llSay(new LSL_Types.LSLInteger(0), new LSL_Types.LSLString(\"x is true\"));" + - "\n else" + - "\n if (y & x)" + - "\n llSay(new LSL_Types.LSLInteger(0), new LSL_Types.LSLString(\"y is true\"));" + - "\n else" + - "\n if (z | x)" + - "\n llSay(new LSL_Types.LSLInteger(0), new LSL_Types.LSLString(\"z is true\"));" + - "\n else" + - "\n if (a * (b + x))" + - "\n llSay(new LSL_Types.LSLInteger(0), new LSL_Types.LSLString(\"a is true\"));" + - "\n else" + - "\n if (b)" + - "\n llSay(new LSL_Types.LSLInteger(0), new LSL_Types.LSLString(\"b is true\"));" + - "\n else" + - "\n if (v)" + - "\n llSay(new LSL_Types.LSLInteger(0), new LSL_Types.LSLString(\"v is true\"));" + - "\n else" + - "\n llSay(new LSL_Types.LSLInteger(0), new LSL_Types.LSLString(\"Everything is lies!\"));" + - "\n }\n"; - - CSCodeGenerator cg = new CSCodeGenerator(); - string output = cg.Convert(input); - Assert.AreEqual(expected, output); - } - - [Test] - public void TestIfElseStatement() - { - TestHelpers.InMethod(); - - string input = @"// let's test complex logical expressions - -default -{ - touch_start(integer num_detected) - { - integer x = 1; - integer y = 0; - - if (x && y) llSay(0, ""Hello""); - if (x || y) - { - llSay(0, ""Hi""); - integer r = 3; - return; - } - - if (x && y || z) llSay(0, ""x is true""); - else llSay(0, ""x is false""); - - if (x == y) llSay(0, ""x is true""); - else if (y < x) llSay(0, ""y is true""); - else llSay(0, ""Who needs x and y anyway?""); - - if (x > y) llSay(0, ""x is true""); - else if (y <= x) - { - llSay(0, ""uh-oh, y is true, exiting""); - return; - } - else llSay(0, ""Who needs x and y anyway?""); - - // and now for my last trick - if (x >= y) llSay(0, ""x is true""); - else if (y != x) llSay(0, ""y is true""); - else if (!z) llSay(0, ""z is true""); - else if (!(a && b)) llSay(0, ""a is true""); - else if (b) llSay(0, ""b is true""); - else if (v) llSay(0, ""v is true""); - else llSay(0, ""Everything is lies!""); - } -} -"; - string expected = - "\n public void default_event_touch_start(LSL_Types.LSLInteger num_detected)" + - "\n {" + - "\n LSL_Types.LSLInteger x = new LSL_Types.LSLInteger(1);" + - "\n LSL_Types.LSLInteger y = new LSL_Types.LSLInteger(0);" + - "\n if (((bool)(x)) & ((bool)(y)))" + - "\n llSay(new LSL_Types.LSLInteger(0), new LSL_Types.LSLString(\"Hello\"));" + - "\n if (((bool)(x)) | ((bool)(y)))" + - "\n {" + - "\n llSay(new LSL_Types.LSLInteger(0), new LSL_Types.LSLString(\"Hi\"));" + - "\n LSL_Types.LSLInteger r = new LSL_Types.LSLInteger(3);" + - "\n return ;" + - "\n }" + - "\n if (((bool)(((bool)(x)) & ((bool)(y)))) | ((bool)(z)))" + - "\n llSay(new LSL_Types.LSLInteger(0), new LSL_Types.LSLString(\"x is true\"));" + - "\n else" + - "\n llSay(new LSL_Types.LSLInteger(0), new LSL_Types.LSLString(\"x is false\"));" + - "\n if (x == y)" + - "\n llSay(new LSL_Types.LSLInteger(0), new LSL_Types.LSLString(\"x is true\"));" + - "\n else" + - "\n if (y < x)" + - "\n llSay(new LSL_Types.LSLInteger(0), new LSL_Types.LSLString(\"y is true\"));" + - "\n else" + - "\n llSay(new LSL_Types.LSLInteger(0), new LSL_Types.LSLString(\"Who needs x and y anyway?\"));" + - "\n if (x > y)" + - "\n llSay(new LSL_Types.LSLInteger(0), new LSL_Types.LSLString(\"x is true\"));" + - "\n else" + - "\n if (y <= x)" + - "\n {" + - "\n llSay(new LSL_Types.LSLInteger(0), new LSL_Types.LSLString(\"uh-oh, y is true, exiting\"));" + - "\n return ;" + - "\n }" + - "\n else" + - "\n llSay(new LSL_Types.LSLInteger(0), new LSL_Types.LSLString(\"Who needs x and y anyway?\"));" + - "\n if (x >= y)" + - "\n llSay(new LSL_Types.LSLInteger(0), new LSL_Types.LSLString(\"x is true\"));" + - "\n else" + - "\n if (y != x)" + - "\n llSay(new LSL_Types.LSLInteger(0), new LSL_Types.LSLString(\"y is true\"));" + - "\n else" + - "\n if (!z)" + - "\n llSay(new LSL_Types.LSLInteger(0), new LSL_Types.LSLString(\"z is true\"));" + - "\n else" + - "\n if (!(((bool)(a)) & ((bool)(b))))" + - "\n llSay(new LSL_Types.LSLInteger(0), new LSL_Types.LSLString(\"a is true\"));" + - "\n else" + - "\n if (b)" + - "\n llSay(new LSL_Types.LSLInteger(0), new LSL_Types.LSLString(\"b is true\"));" + - "\n else" + - "\n if (v)" + - "\n llSay(new LSL_Types.LSLInteger(0), new LSL_Types.LSLString(\"v is true\"));" + - "\n else" + - "\n llSay(new LSL_Types.LSLInteger(0), new LSL_Types.LSLString(\"Everything is lies!\"));" + - "\n }\n"; - - CSCodeGenerator cg = new CSCodeGenerator(); - string output = cg.Convert(input); - Assert.AreEqual(expected, output); - } - - [Test] - public void TestWhileLoop() - { - TestHelpers.InMethod(); - - string input = @"// let's test while loops - -default -{ - touch_start(integer num_detected) - { - integer x = 1; - integer y = 0; - - while (x) llSay(0, ""To infinity, and beyond!""); - while (0 || (x && 0)) - { - llSay(0, ""Never say never.""); - return; - } - } -} -"; - string expected = - "\n public void default_event_touch_start(LSL_Types.LSLInteger num_detected)" + - "\n {" + - "\n LSL_Types.LSLInteger x = new LSL_Types.LSLInteger(1);" + - "\n LSL_Types.LSLInteger y = new LSL_Types.LSLInteger(0);" + - "\n while (x)" + - "\n llSay(new LSL_Types.LSLInteger(0), new LSL_Types.LSLString(\"To infinity, and beyond!\"));" + - "\n while (((bool)(new LSL_Types.LSLInteger(0))) | ((bool)((((bool)(x)) & ((bool)(new LSL_Types.LSLInteger(0)))))))" + - "\n {" + - "\n llSay(new LSL_Types.LSLInteger(0), new LSL_Types.LSLString(\"Never say never.\"));" + - "\n return ;" + - "\n }" + - "\n }\n"; - - CSCodeGenerator cg = new CSCodeGenerator(); - string output = cg.Convert(input); - Assert.AreEqual(expected, output); - } - - [Test] - public void TestDoWhileLoop() - { - TestHelpers.InMethod(); - - string input = @"// let's test do-while loops - -default -{ - touch_start(integer num_detected) - { - integer x = 1; - integer y = 0; - - do llSay(0, ""And we're doing...""); - while (x); - - do - { - llSay(0, ""I like it here. I wish we could stay here forever.""); - y--; - } while (y); - } -} -"; - string expected = - "\n public void default_event_touch_start(LSL_Types.LSLInteger num_detected)" + - "\n {" + - "\n LSL_Types.LSLInteger x = new LSL_Types.LSLInteger(1);" + - "\n LSL_Types.LSLInteger y = new LSL_Types.LSLInteger(0);" + - "\n do" + - "\n llSay(new LSL_Types.LSLInteger(0), new LSL_Types.LSLString(\"And we're doing...\"));" + - "\n while (x);" + - "\n do" + - "\n {" + - "\n llSay(new LSL_Types.LSLInteger(0), new LSL_Types.LSLString(\"I like it here. I wish we could stay here forever.\"));" + - "\n y--;" + - "\n }" + - "\n while (y);" + - "\n }\n"; - - CSCodeGenerator cg = new CSCodeGenerator(); - string output = cg.Convert(input); - Assert.AreEqual(expected, output); - } - - [Test] - public void TestForLoop() - { - TestHelpers.InMethod(); - - string input = @"// let's test for loops - -default -{ - touch_start(integer num_detected) - { - integer x = 1; - integer y = 0; - - for (x = 10; x >= 0; x--) - { - llOwnerSay(""Launch in T minus "" + x); - IncreaseRocketPower(); - } - - for (x = 0, y = 6; y > 0 && x != y; x++, y--) llOwnerSay(""Hi "" + x + "", "" + y); - for (x = 0, y = 6; ! y; x++,y--) llOwnerSay(""Hi "" + x + "", "" + y); - } -} -"; - string expected = - "\n public void default_event_touch_start(LSL_Types.LSLInteger num_detected)" + - "\n {" + - "\n LSL_Types.LSLInteger x = new LSL_Types.LSLInteger(1);" + - "\n LSL_Types.LSLInteger y = new LSL_Types.LSLInteger(0);" + - "\n for (x = new LSL_Types.LSLInteger(10); x >= new LSL_Types.LSLInteger(0); x--)" + - "\n {" + - "\n llOwnerSay(new LSL_Types.LSLString(\"Launch in T minus \") + x);" + - "\n IncreaseRocketPower();" + - "\n }" + - "\n for (x = new LSL_Types.LSLInteger(0), y = new LSL_Types.LSLInteger(6); ((bool)(y > new LSL_Types.LSLInteger(0))) & ((bool)(x != y)); x++, y--)" + - "\n llOwnerSay(new LSL_Types.LSLString(\"Hi \") + x + new LSL_Types.LSLString(\", \") + y);" + - "\n for (x = new LSL_Types.LSLInteger(0), y = new LSL_Types.LSLInteger(6); !y; x++, y--)" + - "\n llOwnerSay(new LSL_Types.LSLString(\"Hi \") + x + new LSL_Types.LSLString(\", \") + y);" + - "\n }\n"; - - CSCodeGenerator cg = new CSCodeGenerator(); - string output = cg.Convert(input); - Assert.AreEqual(expected, output); - } - - [Test] - public void TestFloatsWithTrailingDecimal() - { - TestHelpers.InMethod(); - - string input = @"// a curious feature of LSL that allows floats to be defined with a trailing dot - -default -{ - touch_start(integer num_detected) - { - float y = 1.; - y = 1.E3; - y = 1.e3; - y = 1.E+3; - y = 1.e+3; - y = 1.E-3; - y = 1.e-3; - y = -1.E3; - y = -1.e3; - y = -1.E+3; - y = -1.e+3; - y = -1.E-3; - y = -1.e-3; - y = 12. + -1.E3 - 1.e-2; - vector v = <0.,0.,0.>; - } -} -"; - string expected = - "\n public void default_event_touch_start(LSL_Types.LSLInteger num_detected)" + - "\n {" + - "\n LSL_Types.LSLFloat y = new LSL_Types.LSLFloat(1.0);" + - "\n y = new LSL_Types.LSLFloat(1.0E3);" + - "\n y = new LSL_Types.LSLFloat(1.0e3);" + - "\n y = new LSL_Types.LSLFloat(1.0E+3);" + - "\n y = new LSL_Types.LSLFloat(1.0e+3);" + - "\n y = new LSL_Types.LSLFloat(1.0E-3);" + - "\n y = new LSL_Types.LSLFloat(1.0e-3);" + - "\n y = -new LSL_Types.LSLFloat(1.0E3);" + - "\n y = -new LSL_Types.LSLFloat(1.0e3);" + - "\n y = -new LSL_Types.LSLFloat(1.0E+3);" + - "\n y = -new LSL_Types.LSLFloat(1.0e+3);" + - "\n y = -new LSL_Types.LSLFloat(1.0E-3);" + - "\n y = -new LSL_Types.LSLFloat(1.0e-3);" + - "\n y = new LSL_Types.LSLFloat(12.0) + -new LSL_Types.LSLFloat(1.0E3) - new LSL_Types.LSLFloat(1.0e-2);" + - "\n LSL_Types.Vector3 v = new LSL_Types.Vector3(new LSL_Types.LSLFloat(0.0), new LSL_Types.LSLFloat(0.0), new LSL_Types.LSLFloat(0.0));" + - "\n }\n"; - - CSCodeGenerator cg = new CSCodeGenerator(); - string output = cg.Convert(input); - Assert.AreEqual(expected, output); - } - - [Test] - public void TestUnaryAndBinaryOperators() - { - TestHelpers.InMethod(); - - string input = @"// let's test a few more operators - -default -{ - touch_start(integer num_detected) - { - integer x = 2; - integer y = 1; - integer z = x ^ y; - x = ~ z; - x = ~(y && z); - y = x >> z; - z = y << x; - } -} -"; - string expected = - "\n public void default_event_touch_start(LSL_Types.LSLInteger num_detected)" + - "\n {" + - "\n LSL_Types.LSLInteger x = new LSL_Types.LSLInteger(2);" + - "\n LSL_Types.LSLInteger y = new LSL_Types.LSLInteger(1);" + - "\n LSL_Types.LSLInteger z = x ^ y;" + - "\n x = ~z;" + - "\n x = ~(((bool)(y)) & ((bool)(z)));" + - "\n y = x >> z;" + - "\n z = y << x;" + - "\n }\n"; - - CSCodeGenerator cg = new CSCodeGenerator(); - string output = cg.Convert(input); - Assert.AreEqual(expected, output); - } - - [Test] - public void TestTypecasts() - { - TestHelpers.InMethod(); - - string input = @"// let's test typecasts - -default -{ - touch_start(integer num_detected) - { - string s = """"; - integer x = 1; - - s = (string) x++; - s = (string) x; - s = (string) <0., 0., 0.>; - s = (string) <1., 1., 1., 1.>; - s = (integer) ""1""; - s = (string) llSomethingThatReturnsInteger(); - s = (string) 134; - s = (string) (x ^ y | (z && l)) + (string) (x + y - 13); - llOwnerSay(""s is: "" + s); - } -} -"; - string expected = - "\n public void default_event_touch_start(LSL_Types.LSLInteger num_detected)" + - "\n {" + - "\n LSL_Types.LSLString s = new LSL_Types.LSLString(\"\");" + - "\n LSL_Types.LSLInteger x = new LSL_Types.LSLInteger(1);" + - "\n s = (LSL_Types.LSLString) (x++);" + - "\n s = (LSL_Types.LSLString) (x);" + - "\n s = (LSL_Types.LSLString) (new LSL_Types.Vector3(new LSL_Types.LSLFloat(0.0), new LSL_Types.LSLFloat(0.0), new LSL_Types.LSLFloat(0.0)));" + - "\n s = (LSL_Types.LSLString) (new LSL_Types.Quaternion(new LSL_Types.LSLFloat(1.0), new LSL_Types.LSLFloat(1.0), new LSL_Types.LSLFloat(1.0), new LSL_Types.LSLFloat(1.0)));" + - "\n s = (LSL_Types.LSLInteger) (new LSL_Types.LSLString(\"1\"));" + - "\n s = (LSL_Types.LSLString) (llSomethingThatReturnsInteger());" + - "\n s = (LSL_Types.LSLString) (new LSL_Types.LSLInteger(134));" + - "\n s = (LSL_Types.LSLString) (x ^ y | (((bool)(z)) & ((bool)(l)))) + (LSL_Types.LSLString) (x + y - new LSL_Types.LSLInteger(13));" + - "\n llOwnerSay(new LSL_Types.LSLString(\"s is: \") + s);" + - "\n }\n"; - - CSCodeGenerator cg = new CSCodeGenerator(); - string output = cg.Convert(input); - Assert.AreEqual(expected, output); - } - - [Test] - public void TestStates() - { - TestHelpers.InMethod(); - - string input = @"// let's test states - -default -{ - touch_start(integer num_detected) - { - llSay(0, ""Going to state 'statetwo'""); - state statetwo; - } -} - -state statetwo -{ - state_entry() - { - llSay(0, ""Going to the default state""); - state default; - } -} -"; - string expected = - "\n public void default_event_touch_start(LSL_Types.LSLInteger num_detected)" + - "\n {" + - "\n llSay(new LSL_Types.LSLInteger(0), new LSL_Types.LSLString(\"Going to state 'statetwo'\"));" + - "\n state(\"statetwo\");" + - "\n }" + - "\n public void statetwo_event_state_entry()" + - "\n {" + - "\n llSay(new LSL_Types.LSLInteger(0), new LSL_Types.LSLString(\"Going to the default state\"));" + - "\n state(\"default\");" + - "\n }\n"; - - CSCodeGenerator cg = new CSCodeGenerator(); - string output = cg.Convert(input); - Assert.AreEqual(expected, output); - } - - [Test] - public void TestHexIntegerConstants() - { - TestHelpers.InMethod(); - - string input = @"// let's test hex integers - -default -{ - touch_start(integer num_detected) - { - integer x = 0x23; - integer x = 0x2f34B; - integer x = 0x2F34b; - integer x = 0x2F34B; - integer x = 0x2f34b; - } -} -"; - string expected = - "\n public void default_event_touch_start(LSL_Types.LSLInteger num_detected)" + - "\n {" + - "\n LSL_Types.LSLInteger x = new LSL_Types.LSLInteger(0x23);" + - "\n LSL_Types.LSLInteger x = new LSL_Types.LSLInteger(0x2f34B);" + - "\n LSL_Types.LSLInteger x = new LSL_Types.LSLInteger(0x2F34b);" + - "\n LSL_Types.LSLInteger x = new LSL_Types.LSLInteger(0x2F34B);" + - "\n LSL_Types.LSLInteger x = new LSL_Types.LSLInteger(0x2f34b);" + - "\n }\n"; - - CSCodeGenerator cg = new CSCodeGenerator(); - string output = cg.Convert(input); - Assert.AreEqual(expected, output); - } - - [Test] - public void TestJumps() - { - TestHelpers.InMethod(); - - string input = @"// let's test jumps - -default -{ - touch_start(integer num_detected) - { - jump here; - llOwnerSay(""Uh oh, the jump didn't work""); - @here; - llOwnerSay(""After the jump""); - } -} -"; - string expected = - "\n public void default_event_touch_start(LSL_Types.LSLInteger num_detected)" + - "\n {" + - "\n goto here;" + - "\n llOwnerSay(new LSL_Types.LSLString(\"Uh oh, the jump didn't work\"));" + - "\n here: NoOp();" + - "\n llOwnerSay(new LSL_Types.LSLString(\"After the jump\"));" + - "\n }\n"; - - CSCodeGenerator cg = new CSCodeGenerator(); - string output = cg.Convert(input); - Assert.AreEqual(expected, output); - } - - [Test] - public void TestImplicitVariableInitialization() - { - TestHelpers.InMethod(); - - string input = @"// let's test implicitly initializing variables - -default -{ - touch_start(integer num_detected) - { - integer i; integer j = 14; - float f; float g = 14.0; - string s; string t = ""Hi there""; - list l; list m = [1, 2, 3]; - vector v; vector w = <1.0, 0.1, 0.5>; - rotation r; rotation u = <0.8, 0.7, 0.6, llSomeFunc()>; - key k; key n = ""ping""; - } -} -"; - string expected = - "\n public void default_event_touch_start(LSL_Types.LSLInteger num_detected)" + - "\n {" + - "\n LSL_Types.LSLInteger i = new LSL_Types.LSLInteger(0);" + - "\n LSL_Types.LSLInteger j = new LSL_Types.LSLInteger(14);" + - "\n LSL_Types.LSLFloat f = new LSL_Types.LSLFloat(0.0);" + - "\n LSL_Types.LSLFloat g = new LSL_Types.LSLFloat(14.0);" + - "\n LSL_Types.LSLString s = new LSL_Types.LSLString(\"\");" + - "\n LSL_Types.LSLString t = new LSL_Types.LSLString(\"Hi there\");" + - "\n LSL_Types.list l = new LSL_Types.list();" + - "\n LSL_Types.list m = new LSL_Types.list(new LSL_Types.LSLInteger(1), new LSL_Types.LSLInteger(2), new LSL_Types.LSLInteger(3));" + - "\n LSL_Types.Vector3 v = new LSL_Types.Vector3(new LSL_Types.LSLFloat(0.0), new LSL_Types.LSLFloat(0.0), new LSL_Types.LSLFloat(0.0));" + - "\n LSL_Types.Vector3 w = new LSL_Types.Vector3(new LSL_Types.LSLFloat(1.0), new LSL_Types.LSLFloat(0.1), new LSL_Types.LSLFloat(0.5));" + - "\n LSL_Types.Quaternion r = new LSL_Types.Quaternion(new LSL_Types.LSLFloat(0.0), new LSL_Types.LSLFloat(0.0), new LSL_Types.LSLFloat(0.0), new LSL_Types.LSLFloat(1.0));" + - "\n LSL_Types.Quaternion u = new LSL_Types.Quaternion(new LSL_Types.LSLFloat(0.8), new LSL_Types.LSLFloat(0.7), new LSL_Types.LSLFloat(0.6), llSomeFunc());" + - "\n LSL_Types.LSLString k = new LSL_Types.LSLString(\"\");" + - "\n LSL_Types.LSLString n = new LSL_Types.LSLString(\"ping\");" + - "\n }\n"; - - CSCodeGenerator cg = new CSCodeGenerator(); - string output = cg.Convert(input); - Assert.AreEqual(expected, output); - } - - [Test] - public void TestMultipleEqualsExpression() - { - TestHelpers.InMethod(); - - string input = @"// let's test x = y = 5 type expressions - -default -{ - touch_start(integer num_detected) - { - integer x; - integer y; - x = y = 5; - x += y -= 5; - llOwnerSay(""x is: "" + (string) x + "", y is: "" + (string) y); - } -} -"; - string expected = - "\n public void default_event_touch_start(LSL_Types.LSLInteger num_detected)" + - "\n {" + - "\n LSL_Types.LSLInteger x = new LSL_Types.LSLInteger(0);" + - "\n LSL_Types.LSLInteger y = new LSL_Types.LSLInteger(0);" + - "\n x = y = new LSL_Types.LSLInteger(5);" + - "\n x += y -= new LSL_Types.LSLInteger(5);" + - "\n llOwnerSay(new LSL_Types.LSLString(\"x is: \") + (LSL_Types.LSLString) (x) + new LSL_Types.LSLString(\", y is: \") + (LSL_Types.LSLString) (y));" + - "\n }\n"; - - CSCodeGenerator cg = new CSCodeGenerator(); - string output = cg.Convert(input); - Assert.AreEqual(expected, output); - } - - [Test] - public void TestUnaryExpressionLastInVectorConstant() - { - TestHelpers.InMethod(); - - string input = @"// let's test unary expressions some more - -default -{ - state_entry() - { - vector v = ; - } -} -"; - string expected = - "\n public void default_event_state_entry()" + - "\n {" + - "\n LSL_Types.Vector3 v = new LSL_Types.Vector3(x, y, -new LSL_Types.LSLFloat(0.5));" + - "\n }\n"; - - CSCodeGenerator cg = new CSCodeGenerator(); - string output = cg.Convert(input); - Assert.AreEqual(expected, output); - } - - [Test] - public void TestVectorMemberPlusEquals() - { - TestHelpers.InMethod(); - - string input = @"// let's test unary expressions some more - -default -{ - state_entry() - { - vector v = llGetPos(); - v.z += 4; - v.z -= 4; - v.z *= 4; - v.z /= 4; - v.z %= 4; - } -} -"; - string expected = - "\n public void default_event_state_entry()" + - "\n {" + - "\n LSL_Types.Vector3 v = llGetPos();" + - "\n v.z += new LSL_Types.LSLInteger(4);" + - "\n v.z -= new LSL_Types.LSLInteger(4);" + - "\n v.z *= new LSL_Types.LSLInteger(4);" + - "\n v.z /= new LSL_Types.LSLInteger(4);" + - "\n v.z %= new LSL_Types.LSLInteger(4);" + - "\n }\n"; - - CSCodeGenerator cg = new CSCodeGenerator(); - string output = cg.Convert(input); - Assert.AreEqual(expected, output); - } - - [Test] - public void TestWhileLoopWithNoBody() - { - TestHelpers.InMethod(); - - string input = @"default -{ - state_entry() - { - while (1<0); - } -}"; - - string expected = - "\n public void default_event_state_entry()" + - "\n {" + - "\n while (new LSL_Types.LSLInteger(1) < new LSL_Types.LSLInteger(0))" + - "\n ;" + - "\n }\n"; - - CSCodeGenerator cg = new CSCodeGenerator(); - string output = cg.Convert(input); - Assert.AreEqual(expected, output); - } - - [Test] - public void TestDoWhileLoopWithNoBody() - { - TestHelpers.InMethod(); - - string input = @"default -{ - state_entry() - { - do; - while (1<0); - } -}"; - - string expected = - "\n public void default_event_state_entry()" + - "\n {" + - "\n do" + - "\n ;" + - "\n while (new LSL_Types.LSLInteger(1) < new LSL_Types.LSLInteger(0));" + - "\n }\n"; - - CSCodeGenerator cg = new CSCodeGenerator(); - string output = cg.Convert(input); - Assert.AreEqual(expected, output); - } - - [Test] - public void TestIfWithNoBody() - { - TestHelpers.InMethod(); - - string input = @"default -{ - state_entry() - { - if (1<0); - } -}"; - - string expected = - "\n public void default_event_state_entry()" + - "\n {" + - "\n if (new LSL_Types.LSLInteger(1) < new LSL_Types.LSLInteger(0))" + - "\n ;" + - "\n }\n"; - - CSCodeGenerator cg = new CSCodeGenerator(); - string output = cg.Convert(input); - Assert.AreEqual(expected, output); - } - - [Test] - public void TestIfElseWithNoBody() - { - TestHelpers.InMethod(); - - string input = @"default -{ - state_entry() - { - if (1<0); - else; - } -}"; - - string expected = - "\n public void default_event_state_entry()" + - "\n {" + - "\n if (new LSL_Types.LSLInteger(1) < new LSL_Types.LSLInteger(0))" + - "\n ;" + - "\n else" + - "\n ;" + - "\n }\n"; - - CSCodeGenerator cg = new CSCodeGenerator(); - string output = cg.Convert(input); - Assert.AreEqual(expected, output); - } - - [Test] - public void TestForLoopWithNoBody() - { - TestHelpers.InMethod(); - - string input = @"default -{ - state_entry() - { - for (x = 4; 1<0; x += 2); - } -}"; - - string expected = - "\n public void default_event_state_entry()" + - "\n {" + - "\n for (x = new LSL_Types.LSLInteger(4); new LSL_Types.LSLInteger(1) < new LSL_Types.LSLInteger(0); x += new LSL_Types.LSLInteger(2))" + - "\n ;" + - "\n }\n"; - - CSCodeGenerator cg = new CSCodeGenerator(); - string output = cg.Convert(input); - Assert.AreEqual(expected, output); - } - - [Test] - public void TestForLoopWithNoAssignment() - { - TestHelpers.InMethod(); - - string input = @"default -{ - state_entry() - { - integer x = 4; - for (; 1<0; x += 2); - } -}"; - - string expected = - "\n public void default_event_state_entry()" + - "\n {" + - "\n LSL_Types.LSLInteger x = new LSL_Types.LSLInteger(4);" + - "\n for (; new LSL_Types.LSLInteger(1) < new LSL_Types.LSLInteger(0); x += new LSL_Types.LSLInteger(2))" + - "\n ;" + - "\n }\n"; - - CSCodeGenerator cg = new CSCodeGenerator(); - string output = cg.Convert(input); - Assert.AreEqual(expected, output); - } - - [Test] - public void TestForLoopWithOnlyIdentInAssignment() - { - TestHelpers.InMethod(); - - string input = @"default -{ - state_entry() - { - integer x = 4; - for (x; 1<0; x += 2); - } -}"; - - string expected = - "\n public void default_event_state_entry()" + - "\n {" + - "\n LSL_Types.LSLInteger x = new LSL_Types.LSLInteger(4);" + - "\n for (; new LSL_Types.LSLInteger(1) < new LSL_Types.LSLInteger(0); x += new LSL_Types.LSLInteger(2))" + - "\n ;" + - "\n }\n"; - - CSCodeGenerator cg = new CSCodeGenerator(); - string output = cg.Convert(input); - Assert.AreEqual(expected, output); - } - - [Test] - public void TestAssignmentInIfWhileDoWhile() - { - TestHelpers.InMethod(); - - string input = @"default -{ - state_entry() - { - integer x; - - while (x = 14) llOwnerSay(""x is: "" + (string) x); - - if (x = 24) llOwnerSay(""x is: "" + (string) x); - - do - llOwnerSay(""x is: "" + (string) x); - while (x = 44); - } -}"; - - string expected = - "\n public void default_event_state_entry()" + - "\n {" + - "\n LSL_Types.LSLInteger x = new LSL_Types.LSLInteger(0);" + - "\n while (x = new LSL_Types.LSLInteger(14))" + - "\n llOwnerSay(new LSL_Types.LSLString(\"x is: \") + (LSL_Types.LSLString) (x));" + - "\n if (x = new LSL_Types.LSLInteger(24))" + - "\n llOwnerSay(new LSL_Types.LSLString(\"x is: \") + (LSL_Types.LSLString) (x));" + - "\n do" + - "\n llOwnerSay(new LSL_Types.LSLString(\"x is: \") + (LSL_Types.LSLString) (x));" + - "\n while (x = new LSL_Types.LSLInteger(44));" + - "\n }\n"; - - CSCodeGenerator cg = new CSCodeGenerator(); - string output = cg.Convert(input); - Assert.AreEqual(expected, output); - } - - [Test] - public void TestLSLListHack() - { - TestHelpers.InMethod(); - - string input = @"default -{ - state_entry() - { - list l = [""hello""]; - l = (l=[]) + l + ""world""; - } -}"; - - string expected = - "\n public void default_event_state_entry()" + - "\n {" + - "\n LSL_Types.list l = new LSL_Types.list(new LSL_Types.LSLString(\"hello\"));" + - "\n l = (l = new LSL_Types.list()) + l + new LSL_Types.LSLString(\"world\");" + - "\n }\n"; - - CSCodeGenerator cg = new CSCodeGenerator(); - string output = cg.Convert(input); - Assert.AreEqual(expected, output); - } - - [Test] - public void TestSyntaxError() - { - TestHelpers.InMethod(); - - bool gotException = false; - - string input = @"default -{ - state_entry() - { - integer y - } -} -"; - try - { - CSCodeGenerator cg = new CSCodeGenerator(); - cg.Convert(input); - } - catch (System.Exception e) - { - // The syntax error is on line 5, char 4 (expected ';', found - // '}'). - Assert.AreEqual("(5,4) syntax error", e.Message); - gotException = true; - } - - Assert.That(gotException, Is.True); - } - - [Test] - public void TestSyntaxErrorDeclaringVariableInForLoop() - { - TestHelpers.InMethod(); - - bool gotException = false; - - string input = @"default -{ - state_entry() - { - for (integer x = 0; x < 10; x++) llOwnerSay(""x is: "" + (string) x); - } -} -"; - try - { - CSCodeGenerator cg = new CSCodeGenerator(); - cg.Convert(input); - } - catch (System.Exception e) - { - // The syntax error is on line 4, char 13 (Syntax error) - Assert.AreEqual("(4,13) syntax error", e.Message); - - gotException = true; - } - - Assert.That(gotException, Is.True); - } - } -} diff --git a/OpenSim/Region/ScriptEngine/Shared/CodeTools/Tests/CompilerTest.cs b/OpenSim/Region/ScriptEngine/Shared/CodeTools/Tests/CompilerTest.cs deleted file mode 100644 index 12ba4deab3..0000000000 --- a/OpenSim/Region/ScriptEngine/Shared/CodeTools/Tests/CompilerTest.cs +++ /dev/null @@ -1,217 +0,0 @@ -/* - * Copyright (c) Contributors, http://opensimulator.org/ - * See CONTRIBUTORS.TXT for a full list of copyright holders. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: - * * Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * * Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * * Neither the name of the OpenSimulator Project nor the - * names of its contributors may be used to endorse or promote products - * derived from this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE DEVELOPERS ``AS IS'' AND ANY - * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR ANY - * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - */ - -using System; -using System.IO; -using System.CodeDom.Compiler; -using System.Collections.Generic; -using Microsoft.CSharp; -using NUnit.Framework; -using OpenSim.Region.ScriptEngine.Shared.CodeTools; -using OpenSim.Region.ScriptEngine.Shared.ScriptBase; -using OpenSim.Tests.Common; - -namespace OpenSim.Region.ScriptEngine.Shared.CodeTools.Tests -{ - - /// - /// Tests the LSL compiler. Among other things, test that error messages - /// generated by the C# compiler can be mapped to prper lines/columns in - /// the LSL source. - /// - [TestFixture] - public class CompilerTest : OpenSimTestCase - { - private string m_testDir; - private CSharpCodeProvider m_CSCodeProvider; - private CompilerParameters m_compilerParameters; - // private CompilerResults m_compilerResults; - private ResolveEventHandler m_resolveEventHandler; - - /// - /// Creates a temporary directory where build artifacts are stored. - /// - [TestFixtureSetUp] - public void Init() - { - m_testDir = Path.Combine(Path.GetTempPath(), "opensim_compilerTest_" + Path.GetRandomFileName()); - - if (!Directory.Exists(m_testDir)) - { - // Create the temporary directory for housing build artifacts. - Directory.CreateDirectory(m_testDir); - } - } - - [SetUp] - public override void SetUp() - { - base.SetUp(); - - // Create a CSCodeProvider and CompilerParameters. - m_CSCodeProvider = new CSharpCodeProvider(); - m_compilerParameters = new CompilerParameters(); - - string rootPath = System.AppDomain.CurrentDomain.BaseDirectory; - - m_resolveEventHandler = new ResolveEventHandler(AssemblyResolver.OnAssemblyResolve); - - System.AppDomain.CurrentDomain.AssemblyResolve += m_resolveEventHandler; - - m_compilerParameters.ReferencedAssemblies.Add(Path.Combine(rootPath, "OpenSim.Region.ScriptEngine.Shared.dll")); - m_compilerParameters.ReferencedAssemblies.Add(Path.Combine(rootPath, "OpenSim.Region.ScriptEngine.Shared.Api.Runtime.dll")); - m_compilerParameters.ReferencedAssemblies.Add(Path.Combine(rootPath, "OpenMetaverseTypes.dll")); - m_compilerParameters.GenerateExecutable = false; - } - - /// - /// Removes the temporary build directory and any build artifacts - /// inside it. - /// - [TearDown] - public void CleanUp() - { - System.AppDomain.CurrentDomain.AssemblyResolve -= m_resolveEventHandler; - - if (Directory.Exists(m_testDir)) - { - // Blow away the temporary directory with artifacts. - Directory.Delete(m_testDir, true); - } - } - - private CompilerResults CompileScript( - string input, out Dictionary, KeyValuePair> positionMap) - { - m_compilerParameters.OutputAssembly = Path.Combine(m_testDir, Path.GetRandomFileName() + ".dll"); - - CSCodeGenerator cg = new CSCodeGenerator(); - string output = cg.Convert(input); - - output = Compiler.CreateCSCompilerScript(output, "script1", typeof(ScriptBaseClass).FullName, null); - // System.Console.WriteLine(output); - - positionMap = cg.PositionMap; - - CompilerResults compilerResults = m_CSCodeProvider.CompileAssemblyFromSource(m_compilerParameters, output); - - // foreach (KeyValuePair key in positionMap.Keys) - // { - // KeyValuePair val = positionMap[key]; - // - // System.Console.WriteLine("{0},{1} => {2},{3}", key.Key, key.Value, val.Key, val.Value); - // } - // - // foreach (CompilerError compErr in m_compilerResults.Errors) - // { - // System.Console.WriteLine("Error: {0},{1} => {2}", compErr.Line, compErr.Column, compErr); - // } - - return compilerResults; - } -/* test too depedent on counting lines and columns maping code generation changes -erros position is better tested on viewers - /// - /// Test that line number errors are resolved as expected when preceding code contains a jump. - /// - [Test] - public void TestJumpAndSyntaxError() - { - TestHelpers.InMethod(); - - Dictionary, KeyValuePair> positionMap; - - CompilerResults compilerResults = CompileScript( -@"default -{ - state_entry() - { - jump l; - @l; - i = 1; - } -}", out positionMap); - - Assert.AreEqual( - new KeyValuePair(7, 9), - positionMap[new KeyValuePair(compilerResults.Errors[0].Line, compilerResults.Errors[0].Column)]); - } - - - /// - /// Test the C# compiler error message can be mapped to the correct - /// line/column in the LSL source when an undeclared variable is used. - /// - [Test] - public void TestUseUndeclaredVariable() - { - TestHelpers.InMethod(); - - Dictionary, KeyValuePair> positionMap; - - CompilerResults compilerResults = CompileScript( -@"default -{ - state_entry() - { - integer y = x + 3; - } -}", out positionMap); - - Assert.AreEqual( - new KeyValuePair(5, 21), - positionMap[new KeyValuePair(compilerResults.Errors[0].Line, compilerResults.Errors[0].Column)]); - } -*/ - /// - /// Test that a string can be cast to string and another string - /// concatenated. - /// - [Test] - public void TestCastAndConcatString() - { - TestHelpers.InMethod(); - - Dictionary, KeyValuePair> positionMap; - - CompilerResults compilerResults = CompileScript( -@"string s = "" a string""; - -default -{ - state_entry() - { - key gAvatarKey = llDetectedKey(0); - string tmp = (string) gAvatarKey + s; - llSay(0, tmp); - } -}", out positionMap); - - Assert.AreEqual(0, compilerResults.Errors.Count); - } - } -} \ No newline at end of file diff --git a/OpenSim/Region/ScriptEngine/Shared/CodeTools/Tests/LSL_EventTests.cs b/OpenSim/Region/ScriptEngine/Shared/CodeTools/Tests/LSL_EventTests.cs deleted file mode 100644 index 220ec72cfa..0000000000 --- a/OpenSim/Region/ScriptEngine/Shared/CodeTools/Tests/LSL_EventTests.cs +++ /dev/null @@ -1,359 +0,0 @@ -/* - * Copyright (c) Contributors, http://opensimulator.org/ - * See CONTRIBUTORS.TXT for a full list of copyright holders. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: - * * Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * * Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * * Neither the name of the OpenSimulator Project nor the - * names of its contributors may be used to endorse or promote products - * derived from this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE DEVELOPERS ``AS IS'' AND ANY - * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR ANY - * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - */ - -using System; -using System.Collections.Generic; -using System.Text.RegularExpressions; -using NUnit.Framework; -using OpenSim.Region.ScriptEngine.Shared.CodeTools; -using OpenSim.Tests.Common; - -namespace OpenSim.Region.ScriptEngine.Shared.Tests -{ - public class LSL_EventTests : OpenSimTestCase - { - CSCodeGenerator m_cg = new CSCodeGenerator(); - - [Test] - public void TestBadEvent() - { - TestHelpers.InMethod(); -// TestHelpers.EnableLogging(); - - TestCompile("default { bad() {} }", true); - } - - [Test] - public void TestAttachEvent() - { - TestHelpers.InMethod(); -// TestHelpers.EnableLogging(); - - TestKeyArgEvent("attach"); - } - - [Test] - public void TestObjectRezEvent() - { - TestHelpers.InMethod(); -// TestHelpers.EnableLogging(); - - TestKeyArgEvent("object_rez"); - } - - [Test] - public void TestMovingEndEvent() - { - TestHelpers.InMethod(); -// TestHelpers.EnableLogging(); - - TestVoidArgEvent("moving_end"); - } - - [Test] - public void TestMovingStartEvent() - { - TestHelpers.InMethod(); -// TestHelpers.EnableLogging(); - - TestVoidArgEvent("moving_start"); - } - - [Test] - public void TestNoSensorEvent() - { - TestHelpers.InMethod(); -// TestHelpers.EnableLogging(); - - TestVoidArgEvent("no_sensor"); - } - - [Test] - public void TestNotAtRotTargetEvent() - { - TestHelpers.InMethod(); -// TestHelpers.EnableLogging(); - - TestVoidArgEvent("not_at_rot_target"); - } - - [Test] - public void TestNotAtTargetEvent() - { - TestHelpers.InMethod(); -// TestHelpers.EnableLogging(); - - TestVoidArgEvent("not_at_target"); - } - - [Test] - public void TestStateEntryEvent() - { - TestHelpers.InMethod(); -// TestHelpers.EnableLogging(); - - TestVoidArgEvent("state_entry"); - } - - [Test] - public void TestStateExitEvent() - { - TestHelpers.InMethod(); -// TestHelpers.EnableLogging(); - - TestVoidArgEvent("state_exit"); - } - - [Test] - public void TestTimerEvent() - { - TestHelpers.InMethod(); -// TestHelpers.EnableLogging(); - - TestVoidArgEvent("timer"); - } - - private void TestVoidArgEvent(string eventName) - { - TestCompile("default { " + eventName + "() {} }", false); - TestCompile("default { " + eventName + "(integer n) {} }", true); - } - - [Test] - public void TestChangedEvent() - { - TestHelpers.InMethod(); -// TestHelpers.EnableLogging(); - - TestIntArgEvent("changed"); - } - - [Test] - public void TestCollisionEvent() - { - TestHelpers.InMethod(); -// TestHelpers.EnableLogging(); - - TestIntArgEvent("collision"); - } - - [Test] - public void TestCollisionStartEvent() - { - TestHelpers.InMethod(); -// TestHelpers.EnableLogging(); - - TestIntArgEvent("collision_start"); - } - - [Test] - public void TestCollisionEndEvent() - { - TestHelpers.InMethod(); -// TestHelpers.EnableLogging(); - - TestIntArgEvent("collision_end"); - } - - [Test] - public void TestOnRezEvent() - { - TestHelpers.InMethod(); -// TestHelpers.EnableLogging(); - - TestIntArgEvent("on_rez"); - } - - [Test] - public void TestRunTimePermissionsEvent() - { - TestHelpers.InMethod(); -// TestHelpers.EnableLogging(); - - TestIntArgEvent("run_time_permissions"); - } - - [Test] - public void TestSensorEvent() - { - TestHelpers.InMethod(); -// TestHelpers.EnableLogging(); - - TestIntArgEvent("sensor"); - } - - [Test] - public void TestTouchEvent() - { - TestHelpers.InMethod(); -// TestHelpers.EnableLogging(); - - TestIntArgEvent("touch"); - } - - [Test] - public void TestTouchStartEvent() - { - TestHelpers.InMethod(); -// TestHelpers.EnableLogging(); - - TestIntArgEvent("touch_start"); - } - - [Test] - public void TestTouchEndEvent() - { - TestHelpers.InMethod(); -// TestHelpers.EnableLogging(); - - TestIntArgEvent("touch_end"); - } - - [Test] - public void TestLandCollisionEvent() - { - TestHelpers.InMethod(); -// TestHelpers.EnableLogging(); - - TestVectorArgEvent("land_collision"); - } - - [Test] - public void TestLandCollisionStartEvent() - { - TestHelpers.InMethod(); -// TestHelpers.EnableLogging(); - - TestVectorArgEvent("land_collision_start"); - } - - [Test] - public void TestLandCollisionEndEvent() - { - TestHelpers.InMethod(); -// TestHelpers.EnableLogging(); - - TestVectorArgEvent("land_collision_end"); - } - - [Test] - public void TestAtRotTargetEvent() - { - TestHelpers.InMethod(); -// TestHelpers.EnableLogging(); - - TestIntRotRotArgEvent("at_rot_target"); - } - - [Test] - public void TestAtTargetEvent() - { - TestHelpers.InMethod(); -// TestHelpers.EnableLogging(); - - TestIntVecVecArgEvent("at_target"); - } - - [Test] - public void TestControlEvent() - { - TestHelpers.InMethod(); -// TestHelpers.EnableLogging(); - - TestKeyIntIntArgEvent("control"); - } - - private void TestIntArgEvent(string eventName) - { - TestCompile("default { " + eventName + "(integer n) {} }", false); - TestCompile("default { " + eventName + "{{}} }", true); - TestCompile("default { " + eventName + "(string s) {{}} }", true); - TestCompile("default { " + eventName + "(integer n, integer o) {{}} }", true); - } - - private void TestKeyArgEvent(string eventName) - { - TestCompile("default { " + eventName + "(key k) {} }", false); - TestCompile("default { " + eventName + "{{}} }", true); - TestCompile("default { " + eventName + "(string s) {{}} }", true); - TestCompile("default { " + eventName + "(key k, key l) {{}} }", true); - } - - private void TestVectorArgEvent(string eventName) - { - TestCompile("default { " + eventName + "(vector v) {} }", false); - TestCompile("default { " + eventName + "{{}} }", true); - TestCompile("default { " + eventName + "(string s) {{}} }", true); - TestCompile("default { " + eventName + "(vector v, vector w) {{}} }", true); - } - - private void TestIntRotRotArgEvent(string eventName) - { - TestCompile("default { " + eventName + "(integer n, rotation r, rotation s) {} }", false); - TestCompile("default { " + eventName + "{{}} }", true); - TestCompile("default { " + eventName + "(string s) {{}} }", true); - TestCompile("default { " + eventName + "(integer n, rotation r, rotation s, rotation t) {{}} }", true); - } - - private void TestIntVecVecArgEvent(string eventName) - { - TestCompile("default { " + eventName + "(integer n, vector v, vector w) {} }", false); - TestCompile("default { " + eventName + "{{}} }", true); - TestCompile("default { " + eventName + "(string s) {{}} }", true); - TestCompile("default { " + eventName + "(integer n, vector v, vector w, vector x) {{}} }", true); - } - - private void TestKeyIntIntArgEvent(string eventName) - { - TestCompile("default { " + eventName + "(key k, integer n, integer o) {} }", false); - TestCompile("default { " + eventName + "{{}} }", true); - TestCompile("default { " + eventName + "(string s) {{}} }", true); - TestCompile("default { " + eventName + "(key k, integer n, integer o, integer p) {{}} }", true); - } - - private void TestCompile(string script, bool expectException) - { - bool gotException = false; - Exception ge = null; - - try - { - m_cg.Convert(script); - } - catch (Exception e) - { - gotException = true; - ge = e; - } - - Assert.That( - gotException, - Is.EqualTo(expectException), - "Failed on {0}, exception {1}", script, ge != null ? ge.ToString() : "n/a"); - } - } -} \ No newline at end of file diff --git a/OpenSim/Region/ScriptEngine/Shared/CodeTools/lsl.lexer.cs b/OpenSim/Region/ScriptEngine/Shared/CodeTools/lsl.lexer.cs deleted file mode 100644 index 2d49511c61..0000000000 --- a/OpenSim/Region/ScriptEngine/Shared/CodeTools/lsl.lexer.cs +++ /dev/null @@ -1,19747 +0,0 @@ -using System;using Tools; -namespace OpenSim.Region.ScriptEngine.Shared.CodeTools { -//%+STRING_CONSTANT+3 -public class STRING_CONSTANT : TOKEN{ -public override string yyname { get { return "STRING_CONSTANT"; }} -public override int yynum { get { return 3; }} -public STRING_CONSTANT(Lexer yyl):base(yyl){}} -//%INCREMENT+4 -public class INCREMENT : TOKEN{ public override string yyname { get { return "INCREMENT";}} -public override int yynum { get { return 4; }} - public INCREMENT(Lexer yyl):base(yyl) {}} -//%DECREMENT+5 -public class DECREMENT : TOKEN{ public override string yyname { get { return "DECREMENT";}} -public override int yynum { get { return 5; }} - public DECREMENT(Lexer yyl):base(yyl) {}} -//%PLUS_EQUALS+6 -public class PLUS_EQUALS : TOKEN{ public override string yyname { get { return "PLUS_EQUALS";}} -public override int yynum { get { return 6; }} - public PLUS_EQUALS(Lexer yyl):base(yyl) {}} -//%MINUS_EQUALS+7 -public class MINUS_EQUALS : TOKEN{ public override string yyname { get { return "MINUS_EQUALS";}} -public override int yynum { get { return 7; }} - public MINUS_EQUALS(Lexer yyl):base(yyl) {}} -//%STAR_EQUALS+8 -public class STAR_EQUALS : TOKEN{ public override string yyname { get { return "STAR_EQUALS";}} -public override int yynum { get { return 8; }} - public STAR_EQUALS(Lexer yyl):base(yyl) {}} -//%SLASH_EQUALS+9 -public class SLASH_EQUALS : TOKEN{ public override string yyname { get { return "SLASH_EQUALS";}} -public override int yynum { get { return 9; }} - public SLASH_EQUALS(Lexer yyl):base(yyl) {}} -//%PERCENT_EQUALS+10 -public class PERCENT_EQUALS : TOKEN{ public override string yyname { get { return "PERCENT_EQUALS";}} -public override int yynum { get { return 10; }} - public PERCENT_EQUALS(Lexer yyl):base(yyl) {}} -//%SEMICOLON+11 -public class SEMICOLON : TOKEN{ public override string yyname { get { return "SEMICOLON";}} -public override int yynum { get { return 11; }} - public SEMICOLON(Lexer yyl):base(yyl) {}} -//%LEFT_BRACE+12 -public class LEFT_BRACE : TOKEN{ public override string yyname { get { return "LEFT_BRACE";}} -public override int yynum { get { return 12; }} - public LEFT_BRACE(Lexer yyl):base(yyl) {}} -//%RIGHT_BRACE+13 -public class RIGHT_BRACE : TOKEN{ public override string yyname { get { return "RIGHT_BRACE";}} -public override int yynum { get { return 13; }} - public RIGHT_BRACE(Lexer yyl):base(yyl) {}} -//%COMMA+14 -public class COMMA : TOKEN{ public override string yyname { get { return "COMMA";}} -public override int yynum { get { return 14; }} - public COMMA(Lexer yyl):base(yyl) {}} -//%EQUALS+15 -public class EQUALS : TOKEN{ public override string yyname { get { return "EQUALS";}} -public override int yynum { get { return 15; }} - public EQUALS(Lexer yyl):base(yyl) {}} -//%LEFT_PAREN+16 -public class LEFT_PAREN : TOKEN{ public override string yyname { get { return "LEFT_PAREN";}} -public override int yynum { get { return 16; }} - public LEFT_PAREN(Lexer yyl):base(yyl) {}} -//%RIGHT_PAREN+17 -public class RIGHT_PAREN : TOKEN{ public override string yyname { get { return "RIGHT_PAREN";}} -public override int yynum { get { return 17; }} - public RIGHT_PAREN(Lexer yyl):base(yyl) {}} -//%PLUS+18 -public class PLUS : TOKEN{ public override string yyname { get { return "PLUS";}} -public override int yynum { get { return 18; }} - public PLUS(Lexer yyl):base(yyl) {}} -//%MINUS+19 -public class MINUS : TOKEN{ public override string yyname { get { return "MINUS";}} -public override int yynum { get { return 19; }} - public MINUS(Lexer yyl):base(yyl) {}} -//%STAR+20 -public class STAR : TOKEN{ public override string yyname { get { return "STAR";}} -public override int yynum { get { return 20; }} - public STAR(Lexer yyl):base(yyl) {}} -//%SLASH+21 -public class SLASH : TOKEN{ public override string yyname { get { return "SLASH";}} -public override int yynum { get { return 21; }} - public SLASH(Lexer yyl):base(yyl) {}} -//%PERCENT+22 -public class PERCENT : TOKEN{ public override string yyname { get { return "PERCENT";}} -public override int yynum { get { return 22; }} - public PERCENT(Lexer yyl):base(yyl) {}} -//%AT+23 -public class AT : TOKEN{ public override string yyname { get { return "AT";}} -public override int yynum { get { return 23; }} - public AT(Lexer yyl):base(yyl) {}} -//%PERIOD+24 -public class PERIOD : TOKEN{ public override string yyname { get { return "PERIOD";}} -public override int yynum { get { return 24; }} - public PERIOD(Lexer yyl):base(yyl) {}} -//%LEFT_ANGLE+25 -public class LEFT_ANGLE : TOKEN{ public override string yyname { get { return "LEFT_ANGLE";}} -public override int yynum { get { return 25; }} - public LEFT_ANGLE(Lexer yyl):base(yyl) {}} -//%RIGHT_ANGLE+26 -public class RIGHT_ANGLE : TOKEN{ public override string yyname { get { return "RIGHT_ANGLE";}} -public override int yynum { get { return 26; }} - public RIGHT_ANGLE(Lexer yyl):base(yyl) {}} -//%LEFT_BRACKET+27 -public class LEFT_BRACKET : TOKEN{ public override string yyname { get { return "LEFT_BRACKET";}} -public override int yynum { get { return 27; }} - public LEFT_BRACKET(Lexer yyl):base(yyl) {}} -//%RIGHT_BRACKET+28 -public class RIGHT_BRACKET : TOKEN{ public override string yyname { get { return "RIGHT_BRACKET";}} -public override int yynum { get { return 28; }} - public RIGHT_BRACKET(Lexer yyl):base(yyl) {}} -//%EQUALS_EQUALS+29 -public class EQUALS_EQUALS : TOKEN{ public override string yyname { get { return "EQUALS_EQUALS";}} -public override int yynum { get { return 29; }} - public EQUALS_EQUALS(Lexer yyl):base(yyl) {}} -//%EXCLAMATION_EQUALS+30 -public class EXCLAMATION_EQUALS : TOKEN{ public override string yyname { get { return "EXCLAMATION_EQUALS";}} -public override int yynum { get { return 30; }} - public EXCLAMATION_EQUALS(Lexer yyl):base(yyl) {}} -//%LESS_EQUALS+31 -public class LESS_EQUALS : TOKEN{ public override string yyname { get { return "LESS_EQUALS";}} -public override int yynum { get { return 31; }} - public LESS_EQUALS(Lexer yyl):base(yyl) {}} -//%GREATER_EQUALS+32 -public class GREATER_EQUALS : TOKEN{ public override string yyname { get { return "GREATER_EQUALS";}} -public override int yynum { get { return 32; }} - public GREATER_EQUALS(Lexer yyl):base(yyl) {}} -//%AMP+33 -public class AMP : TOKEN{ public override string yyname { get { return "AMP";}} -public override int yynum { get { return 33; }} - public AMP(Lexer yyl):base(yyl) {}} -//%STROKE+34 -public class STROKE : TOKEN{ public override string yyname { get { return "STROKE";}} -public override int yynum { get { return 34; }} - public STROKE(Lexer yyl):base(yyl) {}} -//%CARET+35 -public class CARET : TOKEN{ public override string yyname { get { return "CARET";}} -public override int yynum { get { return 35; }} - public CARET(Lexer yyl):base(yyl) {}} -//%TILDE+36 -public class TILDE : TOKEN{ public override string yyname { get { return "TILDE";}} -public override int yynum { get { return 36; }} - public TILDE(Lexer yyl):base(yyl) {}} -//%EXCLAMATION+37 -public class EXCLAMATION : TOKEN{ public override string yyname { get { return "EXCLAMATION";}} -public override int yynum { get { return 37; }} - public EXCLAMATION(Lexer yyl):base(yyl) {}} -//%AMP_AMP+38 -public class AMP_AMP : TOKEN{ public override string yyname { get { return "AMP_AMP";}} -public override int yynum { get { return 38; }} - public AMP_AMP(Lexer yyl):base(yyl) {}} -//%STROKE_STROKE+39 -public class STROKE_STROKE : TOKEN{ public override string yyname { get { return "STROKE_STROKE";}} -public override int yynum { get { return 39; }} - public STROKE_STROKE(Lexer yyl):base(yyl) {}} -//%LEFT_SHIFT+40 -public class LEFT_SHIFT : TOKEN{ public override string yyname { get { return "LEFT_SHIFT";}} -public override int yynum { get { return 40; }} - public LEFT_SHIFT(Lexer yyl):base(yyl) {}} -//%RIGHT_SHIFT+41 -public class RIGHT_SHIFT : TOKEN{ public override string yyname { get { return "RIGHT_SHIFT";}} -public override int yynum { get { return 41; }} - public RIGHT_SHIFT(Lexer yyl):base(yyl) {}} -//%IF+42 -public class IF : TOKEN{ public override string yyname { get { return "IF";}} -public override int yynum { get { return 42; }} - public IF(Lexer yyl):base(yyl) {}} -//%ELSE+43 -public class ELSE : TOKEN{ public override string yyname { get { return "ELSE";}} -public override int yynum { get { return 43; }} - public ELSE(Lexer yyl):base(yyl) {}} -//%DO+44 -public class DO : TOKEN{ public override string yyname { get { return "DO";}} -public override int yynum { get { return 44; }} - public DO(Lexer yyl):base(yyl) {}} -//%WHILE+45 -public class WHILE : TOKEN{ public override string yyname { get { return "WHILE";}} -public override int yynum { get { return 45; }} - public WHILE(Lexer yyl):base(yyl) {}} -//%FOR+46 -public class FOR : TOKEN{ public override string yyname { get { return "FOR";}} -public override int yynum { get { return 46; }} - public FOR(Lexer yyl):base(yyl) {}} -//%DEFAULT_STATE+47 -public class DEFAULT_STATE : TOKEN{ public override string yyname { get { return "DEFAULT_STATE";}} -public override int yynum { get { return 47; }} - public DEFAULT_STATE(Lexer yyl):base(yyl) {}} -//%STATE+48 -public class STATE : TOKEN{ public override string yyname { get { return "STATE";}} -public override int yynum { get { return 48; }} - public STATE(Lexer yyl):base(yyl) {}} -//%JUMP+49 -public class JUMP : TOKEN{ public override string yyname { get { return "JUMP";}} -public override int yynum { get { return 49; }} - public JUMP(Lexer yyl):base(yyl) {}} -//%RETURN+50 -public class RETURN : TOKEN{ public override string yyname { get { return "RETURN";}} -public override int yynum { get { return 50; }} - public RETURN(Lexer yyl):base(yyl) {}} -//%INTEGER_TYPE+51 -public class INTEGER_TYPE : TOKEN{ public override string yyname { get { return "INTEGER_TYPE";}} -public override int yynum { get { return 51; }} - public INTEGER_TYPE(Lexer yyl):base(yyl) {}} -//%FLOAT_TYPE+52 -public class FLOAT_TYPE : TOKEN{ public override string yyname { get { return "FLOAT_TYPE";}} -public override int yynum { get { return 52; }} - public FLOAT_TYPE(Lexer yyl):base(yyl) {}} -//%STRING_TYPE+53 -public class STRING_TYPE : TOKEN{ public override string yyname { get { return "STRING_TYPE";}} -public override int yynum { get { return 53; }} - public STRING_TYPE(Lexer yyl):base(yyl) {}} -//%KEY_TYPE+54 -public class KEY_TYPE : TOKEN{ public override string yyname { get { return "KEY_TYPE";}} -public override int yynum { get { return 54; }} - public KEY_TYPE(Lexer yyl):base(yyl) {}} -//%VECTOR_TYPE+55 -public class VECTOR_TYPE : TOKEN{ public override string yyname { get { return "VECTOR_TYPE";}} -public override int yynum { get { return 55; }} - public VECTOR_TYPE(Lexer yyl):base(yyl) {}} -//%ROTATION_TYPE+56 -public class ROTATION_TYPE : TOKEN{ public override string yyname { get { return "ROTATION_TYPE";}} -public override int yynum { get { return 56; }} - public ROTATION_TYPE(Lexer yyl):base(yyl) {}} -//%LIST_TYPE+57 -public class LIST_TYPE : TOKEN{ public override string yyname { get { return "LIST_TYPE";}} -public override int yynum { get { return 57; }} - public LIST_TYPE(Lexer yyl):base(yyl) {}} -//%AT_ROT_TARGET_EVENT+58 -public class AT_ROT_TARGET_EVENT : TOKEN{ public override string yyname { get { return "AT_ROT_TARGET_EVENT";}} -public override int yynum { get { return 58; }} - public AT_ROT_TARGET_EVENT(Lexer yyl):base(yyl) {}} -//%AT_TARGET_EVENT+59 -public class AT_TARGET_EVENT : TOKEN{ public override string yyname { get { return "AT_TARGET_EVENT";}} -public override int yynum { get { return 59; }} - public AT_TARGET_EVENT(Lexer yyl):base(yyl) {}} -//%ATTACH_EVENT+60 -public class ATTACH_EVENT : TOKEN{ public override string yyname { get { return "ATTACH_EVENT";}} -public override int yynum { get { return 60; }} - public ATTACH_EVENT(Lexer yyl):base(yyl) {}} -//%CHANGED_EVENT+61 -public class CHANGED_EVENT : TOKEN{ public override string yyname { get { return "CHANGED_EVENT";}} -public override int yynum { get { return 61; }} - public CHANGED_EVENT(Lexer yyl):base(yyl) {}} -//%COLLISION_EVENT+62 -public class COLLISION_EVENT : TOKEN{ public override string yyname { get { return "COLLISION_EVENT";}} -public override int yynum { get { return 62; }} - public COLLISION_EVENT(Lexer yyl):base(yyl) {}} -//%COLLISION_END_EVENT+63 -public class COLLISION_END_EVENT : TOKEN{ public override string yyname { get { return "COLLISION_END_EVENT";}} -public override int yynum { get { return 63; }} - public COLLISION_END_EVENT(Lexer yyl):base(yyl) {}} -//%COLLISION_START_EVENT+64 -public class COLLISION_START_EVENT : TOKEN{ public override string yyname { get { return "COLLISION_START_EVENT";}} -public override int yynum { get { return 64; }} - public COLLISION_START_EVENT(Lexer yyl):base(yyl) {}} -//%CONTROL_EVENT+65 -public class CONTROL_EVENT : TOKEN{ public override string yyname { get { return "CONTROL_EVENT";}} -public override int yynum { get { return 65; }} - public CONTROL_EVENT(Lexer yyl):base(yyl) {}} -//%DATASERVER_EVENT+66 -public class DATASERVER_EVENT : TOKEN{ public override string yyname { get { return "DATASERVER_EVENT";}} -public override int yynum { get { return 66; }} - public DATASERVER_EVENT(Lexer yyl):base(yyl) {}} -//%EMAIL_EVENT+67 -public class EMAIL_EVENT : TOKEN{ public override string yyname { get { return "EMAIL_EVENT";}} -public override int yynum { get { return 67; }} - public EMAIL_EVENT(Lexer yyl):base(yyl) {}} -//%HTTP_RESPONSE_EVENT+68 -public class HTTP_RESPONSE_EVENT : TOKEN{ public override string yyname { get { return "HTTP_RESPONSE_EVENT";}} -public override int yynum { get { return 68; }} - public HTTP_RESPONSE_EVENT(Lexer yyl):base(yyl) {}} -//%LAND_COLLISION_EVENT+69 -public class LAND_COLLISION_EVENT : TOKEN{ public override string yyname { get { return "LAND_COLLISION_EVENT";}} -public override int yynum { get { return 69; }} - public LAND_COLLISION_EVENT(Lexer yyl):base(yyl) {}} -//%LAND_COLLISION_END_EVENT+70 -public class LAND_COLLISION_END_EVENT : TOKEN{ public override string yyname { get { return "LAND_COLLISION_END_EVENT";}} -public override int yynum { get { return 70; }} - public LAND_COLLISION_END_EVENT(Lexer yyl):base(yyl) {}} -//%LAND_COLLISION_START_EVENT+71 -public class LAND_COLLISION_START_EVENT : TOKEN{ public override string yyname { get { return "LAND_COLLISION_START_EVENT";}} -public override int yynum { get { return 71; }} - public LAND_COLLISION_START_EVENT(Lexer yyl):base(yyl) {}} -//%LINK_MESSAGE_EVENT+72 -public class LINK_MESSAGE_EVENT : TOKEN{ public override string yyname { get { return "LINK_MESSAGE_EVENT";}} -public override int yynum { get { return 72; }} - public LINK_MESSAGE_EVENT(Lexer yyl):base(yyl) {}} -//%LISTEN_EVENT+73 -public class LISTEN_EVENT : TOKEN{ public override string yyname { get { return "LISTEN_EVENT";}} -public override int yynum { get { return 73; }} - public LISTEN_EVENT(Lexer yyl):base(yyl) {}} -//%MONEY_EVENT+74 -public class MONEY_EVENT : TOKEN{ public override string yyname { get { return "MONEY_EVENT";}} -public override int yynum { get { return 74; }} - public MONEY_EVENT(Lexer yyl):base(yyl) {}} -//%MOVING_END_EVENT+75 -public class MOVING_END_EVENT : TOKEN{ public override string yyname { get { return "MOVING_END_EVENT";}} -public override int yynum { get { return 75; }} - public MOVING_END_EVENT(Lexer yyl):base(yyl) {}} -//%MOVING_START_EVENT+76 -public class MOVING_START_EVENT : TOKEN{ public override string yyname { get { return "MOVING_START_EVENT";}} -public override int yynum { get { return 76; }} - public MOVING_START_EVENT(Lexer yyl):base(yyl) {}} -//%NO_SENSOR_EVENT+77 -public class NO_SENSOR_EVENT : TOKEN{ public override string yyname { get { return "NO_SENSOR_EVENT";}} -public override int yynum { get { return 77; }} - public NO_SENSOR_EVENT(Lexer yyl):base(yyl) {}} -//%NOT_AT_ROT_TARGET_EVENT+78 -public class NOT_AT_ROT_TARGET_EVENT : TOKEN{ public override string yyname { get { return "NOT_AT_ROT_TARGET_EVENT";}} -public override int yynum { get { return 78; }} - public NOT_AT_ROT_TARGET_EVENT(Lexer yyl):base(yyl) {}} -//%NOT_AT_TARGET_EVENT+79 -public class NOT_AT_TARGET_EVENT : TOKEN{ public override string yyname { get { return "NOT_AT_TARGET_EVENT";}} -public override int yynum { get { return 79; }} - public NOT_AT_TARGET_EVENT(Lexer yyl):base(yyl) {}} -//%OBJECT_REZ_EVENT+80 -public class OBJECT_REZ_EVENT : TOKEN{ public override string yyname { get { return "OBJECT_REZ_EVENT";}} -public override int yynum { get { return 80; }} - public OBJECT_REZ_EVENT(Lexer yyl):base(yyl) {}} -//%ON_REZ_EVENT+81 -public class ON_REZ_EVENT : TOKEN{ public override string yyname { get { return "ON_REZ_EVENT";}} -public override int yynum { get { return 81; }} - public ON_REZ_EVENT(Lexer yyl):base(yyl) {}} -//%REMOTE_DATA_EVENT+82 -public class REMOTE_DATA_EVENT : TOKEN{ public override string yyname { get { return "REMOTE_DATA_EVENT";}} -public override int yynum { get { return 82; }} - public REMOTE_DATA_EVENT(Lexer yyl):base(yyl) {}} -//%RUN_TIME_PERMISSIONS_EVENT+83 -public class RUN_TIME_PERMISSIONS_EVENT : TOKEN{ public override string yyname { get { return "RUN_TIME_PERMISSIONS_EVENT";}} -public override int yynum { get { return 83; }} - public RUN_TIME_PERMISSIONS_EVENT(Lexer yyl):base(yyl) {}} -//%SENSOR_EVENT+84 -public class SENSOR_EVENT : TOKEN{ public override string yyname { get { return "SENSOR_EVENT";}} -public override int yynum { get { return 84; }} - public SENSOR_EVENT(Lexer yyl):base(yyl) {}} -//%STATE_ENTRY_EVENT+85 -public class STATE_ENTRY_EVENT : TOKEN{ public override string yyname { get { return "STATE_ENTRY_EVENT";}} -public override int yynum { get { return 85; }} - public STATE_ENTRY_EVENT(Lexer yyl):base(yyl) {}} -//%STATE_EXIT_EVENT+86 -public class STATE_EXIT_EVENT : TOKEN{ public override string yyname { get { return "STATE_EXIT_EVENT";}} -public override int yynum { get { return 86; }} - public STATE_EXIT_EVENT(Lexer yyl):base(yyl) {}} -//%TIMER_EVENT+87 -public class TIMER_EVENT : TOKEN{ public override string yyname { get { return "TIMER_EVENT";}} -public override int yynum { get { return 87; }} - public TIMER_EVENT(Lexer yyl):base(yyl) {}} -//%TOUCH_EVENT+88 -public class TOUCH_EVENT : TOKEN{ public override string yyname { get { return "TOUCH_EVENT";}} -public override int yynum { get { return 88; }} - public TOUCH_EVENT(Lexer yyl):base(yyl) {}} -//%TOUCH_START_EVENT+89 -public class TOUCH_START_EVENT : TOKEN{ public override string yyname { get { return "TOUCH_START_EVENT";}} -public override int yynum { get { return 89; }} - public TOUCH_START_EVENT(Lexer yyl):base(yyl) {}} -//%TOUCH_END_EVENT+90 -public class TOUCH_END_EVENT : TOKEN{ public override string yyname { get { return "TOUCH_END_EVENT";}} -public override int yynum { get { return 90; }} - public TOUCH_END_EVENT(Lexer yyl):base(yyl) {}} -//%HTTP_REQUEST_EVENT+91 -public class HTTP_REQUEST_EVENT : TOKEN{ public override string yyname { get { return "HTTP_REQUEST_EVENT";}} -public override int yynum { get { return 91; }} - public HTTP_REQUEST_EVENT(Lexer yyl):base(yyl) {}} -//%TRANSACTION_RESULT_EVENT+92 -public class TRANSACTION_RESULT_EVENT : TOKEN{ public override string yyname { get { return "TRANSACTION_RESULT_EVENT";}} -public override int yynum { get { return 92; }} - public TRANSACTION_RESULT_EVENT(Lexer yyl):base(yyl) {}} -//%IDENT+93 -public class IDENT : TOKEN{ public override string yyname { get { return "IDENT";}} -public override int yynum { get { return 93; }} - public IDENT(Lexer yyl):base(yyl) {}} -//%INTEGER_CONSTANT+94 -public class INTEGER_CONSTANT : TOKEN{ public override string yyname { get { return "INTEGER_CONSTANT";}} -public override int yynum { get { return 94; }} - public INTEGER_CONSTANT(Lexer yyl):base(yyl) {}} -//%HEX_INTEGER_CONSTANT+95 -public class HEX_INTEGER_CONSTANT : TOKEN{ public override string yyname { get { return "HEX_INTEGER_CONSTANT";}} -public override int yynum { get { return 95; }} - public HEX_INTEGER_CONSTANT(Lexer yyl):base(yyl) {}} -//%FLOAT_CONSTANT+96 -public class FLOAT_CONSTANT : TOKEN{ public override string yyname { get { return "FLOAT_CONSTANT";}} -public override int yynum { get { return 96; }} - public FLOAT_CONSTANT(Lexer yyl):base(yyl) {}} -//%|LSLTokens -public class yyLSLTokens : YyLexer { - public yyLSLTokens(ErrorHandler eh):base(eh) { arr = new int[] { -101,4,6,52,0, -46,0,53,0,6, -102,4,16,117,0, -115,0,45,0,97, -0,115,0,99,0, -105,0,105,0,2, -0,103,5,27,7, -27,104,9,1,27, -3,96,0,105,5, -2,3,94,0,2, -1,3,96,0,2, -1,7,26,106,9, -1,26,3,36,0, -107,5,1,3,36, -0,2,1,7,25, -108,9,1,25,3, -172,0,109,5,7, -3,60,0,2,1, -3,124,0,2,1, -3,62,0,2,1, -3,126,0,2,1, -3,61,0,2,1, -3,43,0,2,1, -3,172,0,2,1, -7,24,110,9,1, -24,3,35,0,111, -5,12,3,59,0, -2,1,3,33,0, -2,1,3,44,0, -2,1,3,92,0, -2,1,3,47,0, -2,1,3,35,0, -2,1,3,46,0, -2,1,3,42,0, -2,1,3,64,0, -2,1,3,38,0, -2,1,3,34,0, -2,1,3,37,0, -2,1,7,23,112, -9,1,23,3,187, -0,113,5,1,3, -187,0,2,1,7, -22,114,9,1,22, -3,171,0,115,5, -1,3,171,0,2, -1,7,21,116,9, -1,21,3,59,15, -117,5,4,3,93, -0,2,1,3,125, -0,2,1,3,41, -0,2,1,3,59, -15,2,1,7,20, -118,9,1,20,3, -58,15,119,5,4, -3,123,0,2,1, -3,58,15,2,1, -3,40,0,2,1, -3,91,0,2,1, -7,19,120,9,1, -19,3,173,0,121, -5,2,3,45,0, -2,1,3,173,0, -2,1,7,18,122, -9,1,18,3,63, -32,123,5,2,3, -63,32,2,1,3, -95,0,2,1,7, -17,124,9,1,17, -3,0,224,125,5, -1,3,0,224,2, -1,7,15,126,9, -1,15,3,0,6, -127,5,1,3,0, -6,2,1,7,14, -128,9,1,14,3, -1,0,129,5,5, -3,13,0,2,1, -3,10,0,2,1, -3,1,0,2,1, -3,9,0,2,1, -3,0,0,2,1, -7,13,130,9,1, -13,3,41,32,131, -5,1,3,41,32, -2,1,7,12,132, -9,1,12,3,40, -32,133,5,1,3, -40,32,2,1,7, -11,134,9,1,11, -3,160,0,135,5, -2,3,160,0,2, -1,3,32,0,2, -1,7,10,136,9, -1,10,3,178,0, -137,5,1,3,178, -0,2,1,7,9, -138,9,1,9,3, -238,22,139,5,1, -3,238,22,2,1, -7,8,140,9,1, -8,3,96,6,141, -5,11,3,50,0, -2,1,3,49,0, -2,1,3,57,0, -2,1,3,48,0, -2,1,3,56,0, -2,1,3,55,0, -2,1,3,54,0, -2,1,3,53,0, -2,1,3,52,0, -2,1,3,96,6, -2,1,3,51,0, -2,1,7,7,142, -9,1,7,3,136, -4,143,5,1,3, -136,4,2,1,7, -6,144,9,1,6, -3,3,9,145,5, -1,3,3,9,2, -1,7,5,146,9, -1,5,3,0,3, -147,5,1,3,0, -3,2,1,7,4, -148,9,1,4,3, -187,1,149,5,1, -3,187,1,2,1, -7,3,150,9,1, -3,3,176,2,151, -5,1,3,176,2, -2,1,7,2,152, -9,1,2,3,197, -1,153,5,1,3, -197,1,2,1,7, -1,154,9,1,1, -3,170,0,155,5, -27,3,97,0,2, -1,3,105,0,2, -1,3,113,0,2, -1,3,121,0,2, -1,3,102,0,2, -1,3,110,0,2, -1,3,118,0,2, -1,3,99,0,2, -1,3,107,0,2, -1,3,115,0,2, -1,3,104,0,2, -1,3,112,0,2, -1,3,120,0,2, -1,3,101,0,2, -1,3,109,0,2, -1,3,117,0,2, -1,3,98,0,2, -1,3,106,0,2, -1,3,114,0,2, -1,3,122,0,2, -1,3,103,0,2, -1,3,111,0,2, -1,3,119,0,2, -1,3,100,0,2, -1,3,108,0,2, -1,3,170,0,2, -1,3,116,0,2, -1,7,0,156,9, -1,0,3,192,0, -157,5,27,3,70, -0,2,1,3,78, -0,2,1,3,86, -0,2,1,3,67, -0,2,1,3,75, -0,2,1,3,83, -0,2,1,3,72, -0,2,1,3,80, -0,2,1,3,88, -0,2,1,3,69, -0,2,1,3,77, -0,2,1,3,85, -0,2,1,3,66, -0,2,1,3,74, -0,2,1,3,82, -0,2,1,3,90, -0,2,1,3,71, -0,2,1,3,79, -0,2,1,3,87, -0,2,1,3,68, -0,2,1,3,192, -0,2,1,3,76, -0,2,1,3,84, -0,2,1,3,65, -0,2,1,3,73, -0,2,1,3,81, -0,2,1,3,89, -0,2,1,7,27, -2,0,158,5,3, -159,4,14,67,0, -79,0,77,0,77, -0,69,0,78,0, -84,0,160,12,1, -2176,161,5,119,3, -238,22,162,12,1, -2177,163,5,0,164, -11,1,1063,0,165, -4,0,1,-1,3, -117,0,162,3,63, -32,162,3,37,0, -162,3,114,0,162, -3,74,0,162,3, -34,0,162,3,111, -0,162,3,71,0, -162,3,108,0,162, -3,68,0,162,3, -105,0,162,3,65, -0,162,3,102,0, -162,3,62,0,162, -3,99,0,162,3, -59,0,162,3,96, -0,162,3,96,6, -162,3,173,0,162, -3,93,0,162,3, -53,0,162,3,13, -0,162,3,170,0, -162,3,90,0,162, -3,50,0,162,3, -10,0,166,12,1, -2576,167,5,0,168, -11,1,1067,0,165, -1,-1,3,87,0, -162,3,47,0,162, -3,100,0,162,3, -124,0,162,3,84, -0,162,3,44,0, -162,3,121,0,162, -3,81,0,162,3, -41,0,162,3,1, -0,162,3,59,15, -162,3,78,0,162, -3,38,0,162,3, -58,15,162,3,115, -0,162,3,75,0, -162,3,35,0,162, -3,192,0,162,3, -112,0,162,3,72, -0,162,3,32,0, -162,3,109,0,162, -3,69,0,162,3, -187,1,162,3,106, -0,162,3,66,0, -162,3,103,0,162, -3,77,0,162,3, -3,9,162,3,118, -0,162,3,60,0, -162,3,0,3,162, -3,197,1,162,3, -176,2,162,3,57, -0,162,3,70,0, -162,3,94,0,162, -3,54,0,162,3, -171,0,162,3,91, -0,162,3,51,0, -162,3,88,0,162, -3,48,0,162,3, -125,0,162,3,85, -0,162,3,56,0, -162,3,97,0,162, -3,122,0,162,3, -82,0,162,3,42, -0,169,12,1,2314, -170,5,1,3,47, -0,171,12,1,2329, -172,5,0,173,11, -1,1049,0,165,1, --1,174,11,1,1063, -0,165,1,-1,3, -0,6,162,3,119, -0,162,3,79,0, -162,3,41,32,162, -3,116,0,162,3, -76,0,162,3,36, -0,162,3,113,0, -162,3,73,0,162, -3,33,0,162,3, -110,0,162,3,40, -32,162,3,0,224, -162,3,187,0,162, -3,107,0,162,3, -67,0,162,3,104, -0,162,3,64,0, -162,3,101,0,162, -3,61,0,162,3, -178,0,162,3,98, -0,162,3,45,0, -162,3,136,4,162, -3,95,0,162,3, -55,0,162,3,172, -0,162,3,92,0, -162,3,52,0,162, -3,89,0,162,3, -49,0,162,3,9, -0,162,3,126,0, -162,3,86,0,162, -3,46,0,162,3, -123,0,162,3,83, -0,162,3,43,0, -162,3,160,0,162, -3,120,0,162,3, -80,0,162,3,40, -0,162,0,165,1, --1,175,4,18,89, -0,89,0,73,0, -78,0,73,0,84, -0,73,0,65,0, -76,0,176,12,1, -2777,177,5,91,3, -117,0,178,12,1, -8453,179,5,63,3, -97,0,180,12,1, -8489,181,5,63,3, -97,0,180,3,70, -0,180,3,105,0, -180,3,78,0,180, -3,51,0,180,3, -113,0,180,3,86, -0,180,3,121,0, -180,3,67,0,180, -3,102,0,180,3, -75,0,180,3,48, -0,180,3,110,0, -180,3,83,0,180, -3,56,0,180,3, -118,0,180,3,99, -0,180,3,72,0, -180,3,107,0,180, -3,80,0,180,3, -53,0,180,3,115, -0,180,3,88,0, -180,3,69,0,180, -3,104,0,180,3, -77,0,180,3,50, -0,180,3,112,0, -180,3,85,0,180, -3,120,0,180,3, -66,0,180,3,101, -0,180,3,74,0, -180,3,109,0,180, -3,82,0,180,3, -55,0,180,3,117, -0,180,3,90,0, -180,3,98,0,180, -3,71,0,180,3, -106,0,180,3,79, -0,180,3,52,0, -180,3,114,0,180, -3,87,0,180,3, -122,0,180,3,95, -0,180,3,68,0, -180,3,103,0,180, -3,76,0,180,3, -49,0,180,3,111, -0,180,3,84,0, -180,3,57,0,180, -3,119,0,180,3, -65,0,180,3,100, -0,180,3,73,0, -180,3,108,0,180, -3,81,0,180,3, -54,0,180,3,116, -0,180,3,89,0, -180,182,11,1,867, -0,183,4,10,73, -0,68,0,69,0, -78,0,84,0,1, --1,3,70,0,180, -3,105,0,180,3, -78,0,180,3,51, -0,180,3,113,0, -180,3,86,0,180, -3,121,0,180,3, -67,0,180,3,102, -0,180,3,75,0, -180,3,48,0,180, -3,110,0,180,3, -83,0,180,3,56, -0,180,3,118,0, -180,3,99,0,180, -3,72,0,180,3, -107,0,180,3,80, -0,180,3,53,0, -180,3,115,0,180, -3,88,0,180,3, -69,0,180,3,104, -0,180,3,77,0, -180,3,50,0,180, -3,112,0,180,3, -85,0,180,3,120, -0,180,3,66,0, -180,3,101,0,180, -3,74,0,180,3, -109,0,180,3,82, -0,180,3,55,0, -180,3,117,0,180, -3,90,0,180,3, -98,0,180,3,71, -0,180,3,106,0, -180,3,79,0,180, -3,52,0,180,3, -114,0,180,3,87, -0,180,3,122,0, -180,3,95,0,180, -3,68,0,180,3, -103,0,180,3,76, -0,180,3,49,0, -180,3,111,0,180, -3,84,0,180,3, -57,0,180,3,119, -0,180,3,65,0, -180,3,100,0,180, -3,73,0,180,3, -108,0,180,3,81, -0,180,3,54,0, -180,3,116,0,180, -3,89,0,180,184, -11,1,867,0,183, -1,-1,3,77,0, -178,3,37,0,185, -12,1,7119,186,5, -1,3,61,0,187, -12,1,7127,188,5, -0,189,11,1,40, -0,190,4,28,80, -0,69,0,82,0, -67,0,69,0,78, -0,84,0,95,0, -69,0,81,0,85, -0,65,0,76,0, -83,0,1,-1,191, -11,1,101,0,192, -4,14,80,0,69, -0,82,0,67,0, -69,0,78,0,84, -0,1,-1,3,114, -0,193,12,1,30702, -194,5,63,3,97, -0,180,3,70,0, -180,3,105,0,180, -3,78,0,180,3, -51,0,180,3,113, -0,180,3,86,0, -180,3,121,0,180, -3,67,0,180,3, -102,0,180,3,75, -0,180,3,48,0, -180,3,110,0,180, -3,83,0,180,3, -56,0,180,3,118, -0,180,3,99,0, -180,3,72,0,180, -3,107,0,180,3, -80,0,180,3,53, -0,180,3,115,0, -180,3,88,0,180, -3,69,0,180,3, -104,0,180,3,77, -0,180,3,50,0, -180,3,112,0,180, -3,85,0,180,3, -120,0,180,3,66, -0,180,3,101,0, -195,12,1,30782,196, -5,63,3,97,0, -180,3,70,0,180, -3,105,0,180,3, -78,0,180,3,51, -0,180,3,113,0, -180,3,86,0,180, -3,121,0,180,3, -67,0,180,3,102, -0,180,3,75,0, -180,3,48,0,180, -3,110,0,180,3, -83,0,180,3,56, -0,180,3,118,0, -180,3,99,0,180, -3,72,0,180,3, -107,0,180,3,80, -0,180,3,53,0, -180,3,115,0,180, -3,88,0,180,3, -69,0,180,3,104, -0,180,3,77,0, -180,3,50,0,180, -3,112,0,180,3, -85,0,180,3,120, -0,180,3,66,0, -180,3,101,0,180, -3,74,0,180,3, -109,0,197,12,1, -30863,198,5,63,3, -97,0,180,3,70, -0,180,3,105,0, -180,3,78,0,180, -3,51,0,180,3, -113,0,180,3,86, -0,180,3,121,0, -180,3,67,0,180, -3,102,0,180,3, -75,0,180,3,48, -0,180,3,110,0, -180,3,83,0,180, -3,56,0,180,3, -118,0,180,3,99, -0,180,3,72,0, -180,3,107,0,180, -3,80,0,180,3, -53,0,180,3,115, -0,180,3,88,0, -180,3,69,0,180, -3,104,0,180,3, -77,0,180,3,50, -0,180,3,112,0, -180,3,85,0,180, -3,120,0,180,3, -66,0,180,3,101, -0,180,3,74,0, -180,3,109,0,180, -3,82,0,180,3, -55,0,180,3,117, -0,180,3,90,0, -180,3,98,0,180, -3,71,0,180,3, -106,0,180,3,79, -0,180,3,52,0, -180,3,114,0,180, -3,87,0,180,3, -122,0,180,3,95, -0,180,3,68,0, -180,3,103,0,180, -3,76,0,180,3, -49,0,180,3,111, -0,199,12,1,30951, -200,5,63,3,97, -0,180,3,70,0, -180,3,105,0,180, -3,78,0,180,3, -51,0,180,3,113, -0,180,3,86,0, -180,3,121,0,180, -3,67,0,180,3, -102,0,180,3,75, -0,180,3,48,0, -180,3,110,0,180, -3,83,0,180,3, -56,0,180,3,118, -0,180,3,99,0, -180,3,72,0,180, -3,107,0,180,3, -80,0,180,3,53, -0,180,3,115,0, -180,3,88,0,180, -3,69,0,180,3, -104,0,180,3,77, -0,180,3,50,0, -180,3,112,0,180, -3,85,0,180,3, -120,0,180,3,66, -0,180,3,101,0, -180,3,74,0,180, -3,109,0,180,3, -82,0,180,3,55, -0,180,3,117,0, -180,3,90,0,180, -3,98,0,180,3, -71,0,180,3,106, -0,180,3,79,0, -180,3,52,0,180, -3,114,0,180,3, -87,0,180,3,122, -0,180,3,95,0, -180,3,68,0,180, -3,103,0,180,3, -76,0,180,3,49, -0,180,3,111,0, -180,3,84,0,180, -3,57,0,180,3, -119,0,180,3,65, -0,180,3,100,0, -180,3,73,0,180, -3,108,0,180,3, -81,0,180,3,54, -0,180,3,116,0, -201,12,1,31044,202, -5,63,3,97,0, -180,3,70,0,180, -3,105,0,180,3, -78,0,180,3,51, -0,180,3,113,0, -180,3,86,0,180, -3,121,0,180,3, -67,0,180,3,102, -0,180,3,75,0, -180,3,48,0,180, -3,110,0,180,3, -83,0,180,3,56, -0,180,3,118,0, -180,3,99,0,180, -3,72,0,180,3, -107,0,180,3,80, -0,180,3,53,0, -180,3,115,0,180, -3,88,0,180,3, -69,0,180,3,104, -0,180,3,77,0, -180,3,50,0,180, -3,112,0,180,3, -85,0,180,3,120, -0,180,3,66,0, -180,3,101,0,203, -12,1,31124,204,5, -63,3,97,0,180, -3,70,0,180,3, -105,0,180,3,78, -0,180,3,51,0, -180,3,113,0,180, -3,86,0,180,3, -121,0,180,3,67, -0,180,3,102,0, -180,3,75,0,180, -3,48,0,180,3, -110,0,180,3,83, -0,180,3,56,0, -180,3,118,0,180, -3,99,0,180,3, -72,0,180,3,107, -0,180,3,80,0, -180,3,53,0,180, -3,115,0,180,3, -88,0,180,3,69, -0,180,3,104,0, -180,3,77,0,180, -3,50,0,180,3, -112,0,180,3,85, -0,180,3,120,0, -180,3,66,0,180, -3,101,0,180,3, -74,0,180,3,109, -0,180,3,82,0, -180,3,55,0,180, -3,117,0,180,3, -90,0,180,3,98, -0,180,3,71,0, -180,3,106,0,180, -3,79,0,180,3, -52,0,180,3,114, -0,180,3,87,0, -180,3,122,0,180, -3,95,0,205,12, -1,31160,206,5,63, -3,97,0,180,3, -70,0,180,3,105, -0,180,3,78,0, -180,3,51,0,180, -3,113,0,180,3, -86,0,180,3,121, -0,180,3,67,0, -180,3,102,0,180, -3,75,0,180,3, -48,0,180,3,110, -0,180,3,83,0, -180,3,56,0,180, -3,118,0,180,3, -99,0,180,3,72, -0,180,3,107,0, -180,3,80,0,180, -3,53,0,180,3, -115,0,180,3,88, -0,180,3,69,0, -180,3,104,0,180, -3,77,0,180,3, -50,0,180,3,112, -0,180,3,85,0, -180,3,120,0,180, -3,66,0,180,3, -101,0,180,3,74, -0,180,3,109,0, -180,3,82,0,180, -3,55,0,180,3, -117,0,180,3,90, -0,180,3,98,0, -180,3,71,0,180, -3,106,0,180,3, -79,0,180,3,52, -0,180,3,114,0, -180,3,87,0,180, -3,122,0,180,3, -95,0,180,3,68, -0,180,3,103,0, -180,3,76,0,180, -3,49,0,180,3, -111,0,180,3,84, -0,180,3,57,0, -180,3,119,0,180, -3,65,0,180,3, -100,0,207,12,1, -31250,208,5,63,3, -97,0,209,12,1, -31317,210,5,63,3, -97,0,180,3,70, -0,180,3,105,0, -180,3,78,0,180, -3,51,0,180,3, -113,0,180,3,86, -0,180,3,121,0, -180,3,67,0,180, -3,102,0,180,3, -75,0,180,3,48, -0,180,3,110,0, -180,3,83,0,180, -3,56,0,180,3, -118,0,180,3,99, -0,180,3,72,0, -180,3,107,0,180, -3,80,0,180,3, -53,0,180,3,115, -0,180,3,88,0, -180,3,69,0,180, -3,104,0,180,3, -77,0,180,3,50, -0,180,3,112,0, -180,3,85,0,180, -3,120,0,180,3, -66,0,180,3,101, -0,180,3,74,0, -180,3,109,0,180, -3,82,0,180,3, -55,0,180,3,117, -0,180,3,90,0, -180,3,98,0,180, -3,71,0,180,3, -106,0,180,3,79, -0,180,3,52,0, -180,3,114,0,180, -3,87,0,180,3, -122,0,180,3,95, -0,180,3,68,0, -180,3,103,0,180, -3,76,0,180,3, -49,0,180,3,111, -0,180,3,84,0, -180,3,57,0,180, -3,119,0,180,3, -65,0,180,3,100, -0,180,3,73,0, -180,3,108,0,180, -3,81,0,180,3, -54,0,180,3,116, -0,211,12,1,31410, -212,5,63,3,97, -0,213,12,1,31477, -214,5,63,3,97, -0,180,3,70,0, -180,3,105,0,180, -3,78,0,180,3, -51,0,180,3,113, -0,180,3,86,0, -180,3,121,0,180, -3,67,0,180,3, -102,0,180,3,75, -0,180,3,48,0, -180,3,110,0,180, -3,83,0,180,3, -56,0,180,3,118, -0,180,3,99,0, -180,3,72,0,180, -3,107,0,180,3, -80,0,180,3,53, -0,180,3,115,0, -180,3,88,0,180, -3,69,0,180,3, -104,0,180,3,77, -0,180,3,50,0, -180,3,112,0,180, -3,85,0,180,3, -120,0,180,3,66, -0,180,3,101,0, -180,3,74,0,180, -3,109,0,180,3, -82,0,180,3,55, -0,180,3,117,0, -180,3,90,0,180, -3,98,0,180,3, -71,0,180,3,106, -0,180,3,79,0, -180,3,52,0,180, -3,114,0,180,3, -87,0,180,3,122, -0,180,3,95,0, -180,3,68,0,180, -3,103,0,180,3, -76,0,180,3,49, -0,180,3,111,0, -180,3,84,0,180, -3,57,0,180,3, -119,0,180,3,65, -0,180,3,100,0, -180,3,73,0,180, -3,108,0,180,3, -81,0,180,3,54, -0,180,3,116,0, -180,3,89,0,180, -215,11,1,705,0, -216,4,34,82,0, -69,0,77,0,79, -0,84,0,69,0, -95,0,68,0,65, -0,84,0,65,0, -95,0,69,0,86, -0,69,0,78,0, -84,0,1,-1,3, -70,0,180,3,105, -0,180,3,78,0, -180,3,51,0,180, -3,113,0,180,3, -86,0,180,3,121, -0,180,3,67,0, -180,3,102,0,180, -3,75,0,180,3, -48,0,180,3,110, -0,180,3,83,0, -180,3,56,0,180, -3,118,0,180,3, -99,0,180,3,72, -0,180,3,107,0, -180,3,80,0,180, -3,53,0,180,3, -115,0,180,3,88, -0,180,3,69,0, -180,3,104,0,180, -3,77,0,180,3, -50,0,180,3,112, -0,180,3,85,0, -180,3,120,0,180, -3,66,0,180,3, -101,0,180,3,74, -0,180,3,109,0, -180,3,82,0,180, -3,55,0,180,3, -117,0,180,3,90, -0,180,3,98,0, -180,3,71,0,180, -3,106,0,180,3, -79,0,180,3,52, -0,180,3,114,0, -180,3,87,0,180, -3,122,0,180,3, -95,0,180,3,68, -0,180,3,103,0, -180,3,76,0,180, -3,49,0,180,3, -111,0,180,3,84, -0,180,3,57,0, -180,3,119,0,180, -3,65,0,180,3, -100,0,180,3,73, -0,180,3,108,0, -180,3,81,0,180, -3,54,0,180,3, -116,0,180,3,89, -0,180,217,11,1, -867,0,183,1,-1, -3,89,0,180,218, -11,1,867,0,183, -1,-1,3,70,0, -180,3,105,0,180, -3,78,0,180,3, -51,0,180,3,113, -0,180,3,86,0, -180,3,121,0,180, -3,67,0,180,3, -102,0,180,3,75, -0,180,3,48,0, -180,3,110,0,180, -3,83,0,180,3, -56,0,180,3,118, -0,180,3,99,0, -180,3,72,0,180, -3,107,0,180,3, -80,0,180,3,53, -0,180,3,115,0, -180,3,88,0,180, -3,69,0,180,3, -104,0,180,3,77, -0,180,3,50,0, -180,3,112,0,180, -3,85,0,180,3, -120,0,180,3,66, -0,180,3,101,0, -180,3,74,0,180, -3,109,0,180,3, -82,0,180,3,55, -0,180,3,117,0, -180,3,90,0,180, -3,98,0,180,3, -71,0,180,3,106, -0,180,3,79,0, -180,3,52,0,180, -3,114,0,180,3, -87,0,180,3,122, -0,180,3,95,0, -180,3,68,0,180, -3,103,0,180,3, -76,0,180,3,49, -0,180,3,111,0, -180,3,84,0,180, -3,57,0,180,3, -119,0,180,3,65, -0,180,3,100,0, -180,3,73,0,180, -3,108,0,180,3, -81,0,180,3,54, -0,180,3,116,0, -180,3,89,0,180, -219,11,1,867,0, -183,1,-1,3,73, -0,180,3,108,0, -180,3,81,0,180, -3,54,0,180,3, -116,0,180,3,89, -0,180,220,11,1, -867,0,183,1,-1, -3,68,0,180,3, -103,0,180,3,76, -0,180,3,49,0, -180,3,111,0,180, -3,84,0,180,3, -57,0,180,3,119, -0,180,3,65,0, -180,3,100,0,180, -3,73,0,180,3, -108,0,180,3,81, -0,180,3,54,0, -180,3,116,0,180, -3,89,0,180,221, -11,1,867,0,183, -1,-1,3,74,0, -180,3,109,0,180, -3,82,0,180,3, -55,0,180,3,117, -0,180,3,90,0, -180,3,98,0,180, -3,71,0,180,3, -106,0,180,3,79, -0,180,3,52,0, -180,3,114,0,180, -3,87,0,180,3, -122,0,180,3,95, -0,180,3,68,0, -180,3,103,0,180, -3,76,0,180,3, -49,0,180,3,111, -0,180,3,84,0, -180,3,57,0,180, -3,119,0,180,3, -65,0,180,3,100, -0,180,3,73,0, -180,3,108,0,180, -3,81,0,180,3, -54,0,180,3,116, -0,180,3,89,0, -180,222,11,1,867, -0,183,1,-1,3, -89,0,180,223,11, -1,867,0,183,1, --1,3,84,0,180, -3,57,0,180,3, -119,0,180,3,65, -0,180,3,100,0, -180,3,73,0,180, -3,108,0,180,3, -81,0,180,3,54, -0,180,3,116,0, -180,3,89,0,180, -224,11,1,867,0, -183,1,-1,3,82, -0,180,3,55,0, -180,3,117,0,180, -3,90,0,180,3, -98,0,180,3,71, -0,180,3,106,0, -180,3,79,0,180, -3,52,0,180,3, -114,0,180,3,87, -0,180,3,122,0, -180,3,95,0,180, -3,68,0,180,3, -103,0,180,3,76, -0,180,3,49,0, -180,3,111,0,180, -3,84,0,180,3, -57,0,180,3,119, -0,180,3,65,0, -180,3,100,0,180, -3,73,0,180,3, -108,0,180,3,81, -0,180,3,54,0, -180,3,116,0,225, -12,1,31955,226,5, -63,3,97,0,180, -3,70,0,180,3, -105,0,180,3,78, -0,180,3,51,0, -180,3,113,0,180, -3,86,0,180,3, -121,0,180,3,67, -0,180,3,102,0, -180,3,75,0,180, -3,48,0,180,3, -110,0,180,3,83, -0,180,3,56,0, -180,3,118,0,180, -3,99,0,180,3, -72,0,180,3,107, -0,180,3,80,0, -180,3,53,0,180, -3,115,0,180,3, -88,0,180,3,69, -0,180,3,104,0, -180,3,77,0,180, -3,50,0,180,3, -112,0,180,3,85, -0,180,3,120,0, -180,3,66,0,180, -3,101,0,180,3, -74,0,180,3,109, -0,180,3,82,0, -180,3,55,0,180, -3,117,0,227,12, -1,32037,228,5,63, -3,97,0,180,3, -70,0,180,3,105, -0,180,3,78,0, -180,3,51,0,180, -3,113,0,180,3, -86,0,180,3,121, -0,180,3,67,0, -180,3,102,0,180, -3,75,0,180,3, -48,0,180,3,110, -0,180,3,83,0, -180,3,56,0,180, -3,118,0,180,3, -99,0,180,3,72, -0,180,3,107,0, -180,3,80,0,180, -3,53,0,180,3, -115,0,180,3,88, -0,180,3,69,0, -180,3,104,0,180, -3,77,0,180,3, -50,0,180,3,112, -0,180,3,85,0, -180,3,120,0,180, -3,66,0,180,3, -101,0,180,3,74, -0,180,3,109,0, -180,3,82,0,180, -3,55,0,180,3, -117,0,180,3,90, -0,180,3,98,0, -180,3,71,0,180, -3,106,0,180,3, -79,0,180,3,52, -0,180,3,114,0, -229,12,1,32122,230, -5,63,3,97,0, -180,3,70,0,180, -3,105,0,180,3, -78,0,180,3,51, -0,180,3,113,0, -180,3,86,0,180, -3,121,0,180,3, -67,0,180,3,102, -0,180,3,75,0, -180,3,48,0,180, -3,110,0,231,12, -1,32194,232,5,63, -3,97,0,180,3, -70,0,180,3,105, -0,180,3,78,0, -180,3,51,0,180, -3,113,0,180,3, -86,0,180,3,121, -0,180,3,67,0, -180,3,102,0,180, -3,75,0,180,3, -48,0,180,3,110, -0,180,3,83,0, -180,3,56,0,180, -3,118,0,180,3, -99,0,180,3,72, -0,180,3,107,0, -180,3,80,0,180, -3,53,0,180,3, -115,0,180,3,88, -0,180,3,69,0, -180,3,104,0,180, -3,77,0,180,3, -50,0,180,3,112, -0,180,3,85,0, -180,3,120,0,180, -3,66,0,180,3, -101,0,180,3,74, -0,180,3,109,0, -180,3,82,0,180, -3,55,0,180,3, -117,0,180,3,90, -0,180,3,98,0, -180,3,71,0,180, -3,106,0,180,3, -79,0,180,3,52, -0,180,3,114,0, -180,3,87,0,180, -3,122,0,180,3, -95,0,180,3,68, -0,180,3,103,0, -180,3,76,0,180, -3,49,0,180,3, -111,0,180,3,84, -0,180,3,57,0, -180,3,119,0,180, -3,65,0,180,3, -100,0,180,3,73, -0,180,3,108,0, -180,3,81,0,180, -3,54,0,180,3, -116,0,180,3,89, -0,180,233,11,1, -273,0,234,4,12, -82,0,69,0,84, -0,85,0,82,0, -78,0,1,-1,3, -83,0,180,3,56, -0,180,3,118,0, -180,3,99,0,180, -3,72,0,180,3, -107,0,180,3,80, -0,180,3,53,0, -180,3,115,0,180, -3,88,0,180,3, -69,0,180,3,104, -0,180,3,77,0, -180,3,50,0,180, -3,112,0,180,3, -85,0,180,3,120, -0,180,3,66,0, -180,3,101,0,180, -3,74,0,180,3, -109,0,180,3,82, -0,180,3,55,0, -180,3,117,0,180, -3,90,0,180,3, -98,0,180,3,71, -0,180,3,106,0, -180,3,79,0,180, -3,52,0,180,3, -114,0,180,3,87, -0,180,3,122,0, -180,3,95,0,180, -3,68,0,180,3, -103,0,180,3,76, -0,180,3,49,0, -180,3,111,0,180, -3,84,0,180,3, -57,0,180,3,119, -0,180,3,65,0, -180,3,100,0,180, -3,73,0,180,3, -108,0,180,3,81, -0,180,3,54,0, -180,3,116,0,180, -3,89,0,180,235, -11,1,867,0,183, -1,-1,3,87,0, -180,3,122,0,180, -3,95,0,180,3, -68,0,180,3,103, -0,180,3,76,0, -180,3,49,0,180, -3,111,0,180,3, -84,0,180,3,57, -0,180,3,119,0, -180,3,65,0,180, -3,100,0,180,3, -73,0,180,3,108, -0,180,3,81,0, -180,3,54,0,180, -3,116,0,180,3, -89,0,180,236,11, -1,867,0,183,1, --1,3,90,0,180, -3,98,0,180,3, -71,0,180,3,106, -0,180,3,79,0, -180,3,52,0,180, -3,114,0,180,3, -87,0,180,3,122, -0,180,3,95,0, -180,3,68,0,180, -3,103,0,180,3, -76,0,180,3,49, -0,180,3,111,0, -180,3,84,0,180, -3,57,0,180,3, -119,0,180,3,65, -0,180,3,100,0, -180,3,73,0,180, -3,108,0,180,3, -81,0,180,3,54, -0,180,3,116,0, -180,3,89,0,180, -237,11,1,867,0, -183,1,-1,3,89, -0,180,238,11,1, -867,0,183,1,-1, -3,74,0,180,3, -109,0,180,3,82, -0,180,3,55,0, -180,3,117,0,239, -12,1,32464,240,5, -63,3,97,0,180, -3,70,0,180,3, -105,0,180,3,78, -0,180,3,51,0, -180,3,113,0,180, -3,86,0,180,3, -121,0,180,3,67, -0,180,3,102,0, -180,3,75,0,180, -3,48,0,180,3, -110,0,241,12,1, -32536,242,5,63,3, -97,0,180,3,70, -0,180,3,105,0, -180,3,78,0,180, -3,51,0,180,3, -113,0,180,3,86, -0,180,3,121,0, -180,3,67,0,180, -3,102,0,180,3, -75,0,180,3,48, -0,180,3,110,0, -180,3,83,0,180, -3,56,0,180,3, -118,0,180,3,99, -0,180,3,72,0, -180,3,107,0,180, -3,80,0,180,3, -53,0,180,3,115, -0,180,3,88,0, -180,3,69,0,180, -3,104,0,180,3, -77,0,180,3,50, -0,180,3,112,0, -180,3,85,0,180, -3,120,0,180,3, -66,0,180,3,101, -0,180,3,74,0, -180,3,109,0,180, -3,82,0,180,3, -55,0,180,3,117, -0,180,3,90,0, -180,3,98,0,180, -3,71,0,180,3, -106,0,180,3,79, -0,180,3,52,0, -180,3,114,0,180, -3,87,0,180,3, -122,0,180,3,95, -0,243,12,1,32572, -244,5,63,3,97, -0,180,3,70,0, -180,3,105,0,180, -3,78,0,180,3, -51,0,180,3,113, -0,180,3,86,0, -180,3,121,0,180, -3,67,0,180,3, -102,0,180,3,75, -0,180,3,48,0, -180,3,110,0,180, -3,83,0,180,3, -56,0,180,3,118, -0,180,3,99,0, -180,3,72,0,180, -3,107,0,180,3, -80,0,180,3,53, -0,180,3,115,0, -180,3,88,0,180, -3,69,0,180,3, -104,0,180,3,77, -0,180,3,50,0, -180,3,112,0,180, -3,85,0,180,3, -120,0,180,3,66, -0,180,3,101,0, -180,3,74,0,180, -3,109,0,180,3, -82,0,180,3,55, -0,180,3,117,0, -180,3,90,0,180, -3,98,0,180,3, -71,0,180,3,106, -0,180,3,79,0, -180,3,52,0,180, -3,114,0,180,3, -87,0,180,3,122, -0,180,3,95,0, -180,3,68,0,180, -3,103,0,180,3, -76,0,180,3,49, -0,180,3,111,0, -180,3,84,0,180, -3,57,0,180,3, -119,0,180,3,65, -0,180,3,100,0, -180,3,73,0,180, -3,108,0,180,3, -81,0,180,3,54, -0,180,3,116,0, -245,12,1,32665,246, -5,63,3,97,0, -180,3,70,0,180, -3,105,0,247,12, -1,32733,248,5,63, -3,97,0,180,3, -70,0,180,3,105, -0,180,3,78,0, -180,3,51,0,180, -3,113,0,180,3, -86,0,180,3,121, -0,180,3,67,0, -180,3,102,0,180, -3,75,0,180,3, -48,0,180,3,110, -0,180,3,83,0, -180,3,56,0,180, -3,118,0,180,3, -99,0,180,3,72, -0,180,3,107,0, -180,3,80,0,180, -3,53,0,180,3, -115,0,180,3,88, -0,180,3,69,0, -180,3,104,0,180, -3,77,0,180,3, -50,0,180,3,112, -0,180,3,85,0, -180,3,120,0,180, -3,66,0,180,3, -101,0,180,3,74, -0,180,3,109,0, -249,12,1,32814,250, -5,63,3,97,0, -180,3,70,0,180, -3,105,0,180,3, -78,0,180,3,51, -0,180,3,113,0, -180,3,86,0,180, -3,121,0,180,3, -67,0,180,3,102, -0,180,3,75,0, -180,3,48,0,180, -3,110,0,180,3, -83,0,180,3,56, -0,180,3,118,0, -180,3,99,0,180, -3,72,0,180,3, -107,0,180,3,80, -0,180,3,53,0, -180,3,115,0,180, -3,88,0,180,3, -69,0,180,3,104, -0,180,3,77,0, -180,3,50,0,180, -3,112,0,180,3, -85,0,180,3,120, -0,180,3,66,0, -180,3,101,0,251, -12,1,32894,252,5, -63,3,97,0,180, -3,70,0,180,3, -105,0,180,3,78, -0,180,3,51,0, -180,3,113,0,180, -3,86,0,180,3, -121,0,180,3,67, -0,180,3,102,0, -180,3,75,0,180, -3,48,0,180,3, -110,0,180,3,83, -0,180,3,56,0, -180,3,118,0,180, -3,99,0,180,3, -72,0,180,3,107, -0,180,3,80,0, -180,3,53,0,180, -3,115,0,180,3, -88,0,180,3,69, -0,180,3,104,0, -180,3,77,0,180, -3,50,0,180,3, -112,0,180,3,85, -0,180,3,120,0, -180,3,66,0,180, -3,101,0,180,3, -74,0,180,3,109, -0,180,3,82,0, -180,3,55,0,180, -3,117,0,180,3, -90,0,180,3,98, -0,180,3,71,0, -180,3,106,0,180, -3,79,0,180,3, -52,0,180,3,114, -0,180,3,87,0, -180,3,122,0,180, -3,95,0,253,12, -1,32930,254,5,63, -3,97,0,180,3, -70,0,180,3,105, -0,180,3,78,0, -180,3,51,0,180, -3,113,0,180,3, -86,0,180,3,121, -0,180,3,67,0, -180,3,102,0,180, -3,75,0,180,3, -48,0,180,3,110, -0,180,3,83,0, -180,3,56,0,180, -3,118,0,180,3, -99,0,180,3,72, -0,180,3,107,0, -180,3,80,0,180, -3,53,0,180,3, -115,0,180,3,88, -0,180,3,69,0, -180,3,104,0,180, -3,77,0,180,3, -50,0,180,3,112, -0,255,12,1,33008, -256,5,63,3,97, -0,180,3,70,0, -180,3,105,0,180, -3,78,0,180,3, -51,0,180,3,113, -0,180,3,86,0, -180,3,121,0,180, -3,67,0,180,3, -102,0,180,3,75, -0,180,3,48,0, -180,3,110,0,180, -3,83,0,180,3, -56,0,180,3,118, -0,180,3,99,0, -180,3,72,0,180, -3,107,0,180,3, -80,0,180,3,53, -0,180,3,115,0, -180,3,88,0,180, -3,69,0,180,3, -104,0,180,3,77, -0,180,3,50,0, -180,3,112,0,180, -3,85,0,180,3, -120,0,180,3,66, -0,180,3,101,0, -257,12,1,33088,258, -5,63,3,97,0, -180,3,70,0,180, -3,105,0,180,3, -78,0,180,3,51, -0,180,3,113,0, -180,3,86,0,180, -3,121,0,180,3, -67,0,180,3,102, -0,180,3,75,0, -180,3,48,0,180, -3,110,0,180,3, -83,0,180,3,56, -0,180,3,118,0, -180,3,99,0,180, -3,72,0,180,3, -107,0,180,3,80, -0,180,3,53,0, -180,3,115,0,180, -3,88,0,180,3, -69,0,180,3,104, -0,180,3,77,0, -180,3,50,0,180, -3,112,0,180,3, -85,0,180,3,120, -0,180,3,66,0, -180,3,101,0,180, -3,74,0,180,3, -109,0,180,3,82, -0,180,3,55,0, -180,3,117,0,180, -3,90,0,180,3, -98,0,180,3,71, -0,180,3,106,0, -180,3,79,0,180, -3,52,0,180,3, -114,0,259,12,1, -33173,260,5,63,3, -97,0,180,3,70, -0,180,3,105,0, -180,3,78,0,180, -3,51,0,180,3, -113,0,180,3,86, -0,180,3,121,0, -180,3,67,0,180, -3,102,0,180,3, -75,0,180,3,48, -0,180,3,110,0, -180,3,83,0,180, -3,56,0,180,3, -118,0,180,3,99, -0,180,3,72,0, -180,3,107,0,180, -3,80,0,180,3, -53,0,180,3,115, -0,180,3,88,0, -180,3,69,0,180, -3,104,0,180,3, -77,0,180,3,50, -0,180,3,112,0, -180,3,85,0,180, -3,120,0,180,3, -66,0,180,3,101, -0,180,3,74,0, -180,3,109,0,261, -12,1,33254,262,5, -63,3,97,0,180, -3,70,0,180,3, -105,0,263,12,1, -33322,264,5,63,3, -97,0,180,3,70, -0,180,3,105,0, -180,3,78,0,180, -3,51,0,180,3, -113,0,180,3,86, -0,180,3,121,0, -180,3,67,0,180, -3,102,0,180,3, -75,0,180,3,48, -0,180,3,110,0, -180,3,83,0,180, -3,56,0,180,3, -118,0,180,3,99, -0,180,3,72,0, -180,3,107,0,180, -3,80,0,180,3, -53,0,180,3,115, -0,265,12,1,33398, -266,5,63,3,97, -0,180,3,70,0, -180,3,105,0,180, -3,78,0,180,3, -51,0,180,3,113, -0,180,3,86,0, -180,3,121,0,180, -3,67,0,180,3, -102,0,180,3,75, -0,180,3,48,0, -180,3,110,0,180, -3,83,0,180,3, -56,0,180,3,118, -0,180,3,99,0, -180,3,72,0,180, -3,107,0,180,3, -80,0,180,3,53, -0,180,3,115,0, -267,12,1,33474,268, -5,63,3,97,0, -180,3,70,0,180, -3,105,0,269,12, -1,33542,270,5,63, -3,97,0,180,3, -70,0,180,3,105, -0,180,3,78,0, -180,3,51,0,180, -3,113,0,180,3, -86,0,180,3,121, -0,180,3,67,0, -180,3,102,0,180, -3,75,0,180,3, -48,0,180,3,110, -0,180,3,83,0, -180,3,56,0,180, -3,118,0,180,3, -99,0,180,3,72, -0,180,3,107,0, -180,3,80,0,180, -3,53,0,180,3, -115,0,180,3,88, -0,180,3,69,0, -180,3,104,0,180, -3,77,0,180,3, -50,0,180,3,112, -0,180,3,85,0, -180,3,120,0,180, -3,66,0,180,3, -101,0,180,3,74, -0,180,3,109,0, -180,3,82,0,180, -3,55,0,180,3, -117,0,180,3,90, -0,180,3,98,0, -180,3,71,0,180, -3,106,0,180,3, -79,0,180,3,52, -0,180,3,114,0, -180,3,87,0,180, -3,122,0,180,3, -95,0,180,3,68, -0,180,3,103,0, -180,3,76,0,180, -3,49,0,180,3, -111,0,271,12,1, -33630,272,5,63,3, -97,0,180,3,70, -0,180,3,105,0, -180,3,78,0,180, -3,51,0,180,3, -113,0,180,3,86, -0,180,3,121,0, -180,3,67,0,180, -3,102,0,180,3, -75,0,180,3,48, -0,180,3,110,0, -273,12,1,33702,274, -5,63,3,97,0, -180,3,70,0,180, -3,105,0,180,3, -78,0,180,3,51, -0,180,3,113,0, -180,3,86,0,180, -3,121,0,180,3, -67,0,180,3,102, -0,180,3,75,0, -180,3,48,0,180, -3,110,0,180,3, -83,0,180,3,56, -0,180,3,118,0, -180,3,99,0,180, -3,72,0,180,3, -107,0,180,3,80, -0,180,3,53,0, -180,3,115,0,275, -12,1,33778,276,5, -63,3,97,0,180, -3,70,0,180,3, -105,0,180,3,78, -0,180,3,51,0, -180,3,113,0,180, -3,86,0,180,3, -121,0,180,3,67, -0,180,3,102,0, -180,3,75,0,180, -3,48,0,180,3, -110,0,180,3,83, -0,180,3,56,0, -180,3,118,0,180, -3,99,0,180,3, -72,0,180,3,107, -0,180,3,80,0, -180,3,53,0,180, -3,115,0,180,3, -88,0,180,3,69, -0,180,3,104,0, -180,3,77,0,180, -3,50,0,180,3, -112,0,180,3,85, -0,180,3,120,0, -180,3,66,0,180, -3,101,0,180,3, -74,0,180,3,109, -0,180,3,82,0, -180,3,55,0,180, -3,117,0,180,3, -90,0,180,3,98, -0,180,3,71,0, -180,3,106,0,180, -3,79,0,180,3, -52,0,180,3,114, -0,180,3,87,0, -180,3,122,0,180, -3,95,0,180,3, -68,0,180,3,103, -0,180,3,76,0, -180,3,49,0,180, -3,111,0,180,3, -84,0,180,3,57, -0,180,3,119,0, -180,3,65,0,180, -3,100,0,180,3, -73,0,180,3,108, -0,180,3,81,0, -180,3,54,0,180, -3,116,0,180,3, -89,0,180,277,11, -1,720,0,278,4, -52,82,0,85,0, -78,0,95,0,84, -0,73,0,77,0, -69,0,95,0,80, -0,69,0,82,0, -77,0,73,0,83, -0,83,0,73,0, -79,0,78,0,83, -0,95,0,69,0, -86,0,69,0,78, -0,84,0,1,-1, -3,88,0,180,3, -69,0,180,3,104, -0,180,3,77,0, -180,3,50,0,180, -3,112,0,180,3, -85,0,180,3,120, -0,180,3,66,0, -180,3,101,0,180, -3,74,0,180,3, -109,0,180,3,82, -0,180,3,55,0, -180,3,117,0,180, -3,90,0,180,3, -98,0,180,3,71, -0,180,3,106,0, -180,3,79,0,180, -3,52,0,180,3, -114,0,180,3,87, -0,180,3,122,0, -180,3,95,0,180, -3,68,0,180,3, -103,0,180,3,76, -0,180,3,49,0, -180,3,111,0,180, -3,84,0,180,3, -57,0,180,3,119, -0,180,3,65,0, -180,3,100,0,180, -3,73,0,180,3, -108,0,180,3,81, -0,180,3,54,0, -180,3,116,0,180, -3,89,0,180,279, -11,1,867,0,183, -1,-1,3,83,0, -180,3,56,0,180, -3,118,0,180,3, -99,0,180,3,72, -0,180,3,107,0, -180,3,80,0,180, -3,53,0,180,3, -115,0,180,3,88, -0,180,3,69,0, -180,3,104,0,180, -3,77,0,180,3, -50,0,180,3,112, -0,180,3,85,0, -180,3,120,0,180, -3,66,0,180,3, -101,0,180,3,74, -0,180,3,109,0, -180,3,82,0,180, -3,55,0,180,3, -117,0,180,3,90, -0,180,3,98,0, -180,3,71,0,180, -3,106,0,180,3, -79,0,180,3,52, -0,180,3,114,0, -180,3,87,0,180, -3,122,0,180,3, -95,0,180,3,68, -0,180,3,103,0, -180,3,76,0,180, -3,49,0,180,3, -111,0,180,3,84, -0,180,3,57,0, -180,3,119,0,180, -3,65,0,180,3, -100,0,180,3,73, -0,180,3,108,0, -180,3,81,0,180, -3,54,0,180,3, -116,0,180,3,89, -0,180,280,11,1, -867,0,183,1,-1, -3,84,0,180,3, -57,0,180,3,119, -0,180,3,65,0, -180,3,100,0,180, -3,73,0,180,3, -108,0,180,3,81, -0,180,3,54,0, -180,3,116,0,180, -3,89,0,180,281, -11,1,867,0,183, -1,-1,3,78,0, -180,3,51,0,180, -3,113,0,180,3, -86,0,180,3,121, -0,180,3,67,0, -180,3,102,0,180, -3,75,0,180,3, -48,0,180,3,110, -0,180,3,83,0, -180,3,56,0,180, -3,118,0,180,3, -99,0,180,3,72, -0,180,3,107,0, -180,3,80,0,180, -3,53,0,180,3, -115,0,180,3,88, -0,180,3,69,0, -180,3,104,0,180, -3,77,0,180,3, -50,0,180,3,112, -0,180,3,85,0, -180,3,120,0,180, -3,66,0,180,3, -101,0,180,3,74, -0,180,3,109,0, -180,3,82,0,180, -3,55,0,180,3, -117,0,180,3,90, -0,180,3,98,0, -180,3,71,0,180, -3,106,0,180,3, -79,0,180,3,52, -0,180,3,114,0, -180,3,87,0,180, -3,122,0,180,3, -95,0,180,3,68, -0,180,3,103,0, -180,3,76,0,180, -3,49,0,180,3, -111,0,180,3,84, -0,180,3,57,0, -180,3,119,0,180, -3,65,0,180,3, -100,0,180,3,73, -0,180,3,108,0, -180,3,81,0,180, -3,54,0,180,3, -116,0,180,3,89, -0,180,282,11,1, -867,0,183,1,-1, -3,88,0,180,3, -69,0,180,3,104, -0,180,3,77,0, -180,3,50,0,180, -3,112,0,180,3, -85,0,180,3,120, -0,180,3,66,0, -180,3,101,0,180, -3,74,0,180,3, -109,0,180,3,82, -0,180,3,55,0, -180,3,117,0,180, -3,90,0,180,3, -98,0,180,3,71, -0,180,3,106,0, -180,3,79,0,180, -3,52,0,180,3, -114,0,180,3,87, -0,180,3,122,0, -180,3,95,0,180, -3,68,0,180,3, -103,0,180,3,76, -0,180,3,49,0, -180,3,111,0,180, -3,84,0,180,3, -57,0,180,3,119, -0,180,3,65,0, -180,3,100,0,180, -3,73,0,180,3, -108,0,180,3,81, -0,180,3,54,0, -180,3,116,0,180, -3,89,0,180,283, -11,1,867,0,183, -1,-1,3,88,0, -180,3,69,0,180, -3,104,0,180,3, -77,0,180,3,50, -0,180,3,112,0, -180,3,85,0,180, -3,120,0,180,3, -66,0,180,3,101, -0,180,3,74,0, -180,3,109,0,180, -3,82,0,180,3, -55,0,180,3,117, -0,180,3,90,0, -180,3,98,0,180, -3,71,0,180,3, -106,0,180,3,79, -0,180,3,52,0, -180,3,114,0,180, -3,87,0,180,3, -122,0,180,3,95, -0,180,3,68,0, -180,3,103,0,180, -3,76,0,180,3, -49,0,180,3,111, -0,180,3,84,0, -180,3,57,0,180, -3,119,0,180,3, -65,0,180,3,100, -0,180,3,73,0, -180,3,108,0,180, -3,81,0,180,3, -54,0,180,3,116, -0,180,3,89,0, -180,284,11,1,867, -0,183,1,-1,3, -78,0,180,3,51, -0,180,3,113,0, -180,3,86,0,180, -3,121,0,180,3, -67,0,180,3,102, -0,180,3,75,0, -180,3,48,0,180, -3,110,0,180,3, -83,0,180,3,56, -0,180,3,118,0, -180,3,99,0,180, -3,72,0,180,3, -107,0,180,3,80, -0,180,3,53,0, -180,3,115,0,180, -3,88,0,180,3, -69,0,180,3,104, -0,180,3,77,0, -180,3,50,0,180, -3,112,0,180,3, -85,0,180,3,120, -0,180,3,66,0, -180,3,101,0,180, -3,74,0,180,3, -109,0,180,3,82, -0,180,3,55,0, -180,3,117,0,180, -3,90,0,180,3, -98,0,180,3,71, -0,180,3,106,0, -180,3,79,0,180, -3,52,0,180,3, -114,0,180,3,87, -0,180,3,122,0, -180,3,95,0,180, -3,68,0,180,3, -103,0,180,3,76, -0,180,3,49,0, -180,3,111,0,180, -3,84,0,180,3, -57,0,180,3,119, -0,180,3,65,0, -180,3,100,0,180, -3,73,0,180,3, -108,0,180,3,81, -0,180,3,54,0, -180,3,116,0,180, -3,89,0,180,285, -11,1,867,0,183, -1,-1,3,82,0, -180,3,55,0,180, -3,117,0,180,3, -90,0,180,3,98, -0,180,3,71,0, -180,3,106,0,180, -3,79,0,180,3, -52,0,180,3,114, -0,180,3,87,0, -180,3,122,0,180, -3,95,0,180,3, -68,0,180,3,103, -0,180,3,76,0, -180,3,49,0,180, -3,111,0,180,3, -84,0,180,3,57, -0,180,3,119,0, -180,3,65,0,180, -3,100,0,180,3, -73,0,180,3,108, -0,180,3,81,0, -180,3,54,0,180, -3,116,0,180,3, -89,0,180,286,11, -1,867,0,183,1, --1,3,87,0,180, -3,122,0,180,3, -95,0,180,3,68, -0,180,3,103,0, -180,3,76,0,180, -3,49,0,180,3, -111,0,180,3,84, -0,180,3,57,0, -180,3,119,0,180, -3,65,0,180,3, -100,0,180,3,73, -0,180,3,108,0, -180,3,81,0,180, -3,54,0,180,3, -116,0,180,3,89, -0,180,287,11,1, -867,0,183,1,-1, -3,74,0,180,3, -109,0,180,3,82, -0,180,3,55,0, -180,3,117,0,180, -3,90,0,180,3, -98,0,180,3,71, -0,180,3,106,0, -180,3,79,0,180, -3,52,0,180,3, -114,0,180,3,87, -0,180,3,122,0, -180,3,95,0,180, -3,68,0,180,3, -103,0,180,3,76, -0,180,3,49,0, -180,3,111,0,180, -3,84,0,180,3, -57,0,180,3,119, -0,180,3,65,0, -180,3,100,0,180, -3,73,0,180,3, -108,0,180,3,81, -0,180,3,54,0, -180,3,116,0,180, -3,89,0,180,288, -11,1,867,0,183, -1,-1,3,85,0, -180,3,120,0,180, -3,66,0,180,3, -101,0,180,3,74, -0,180,3,109,0, -180,3,82,0,180, -3,55,0,180,3, -117,0,180,3,90, -0,180,3,98,0, -180,3,71,0,180, -3,106,0,180,3, -79,0,180,3,52, -0,180,3,114,0, -180,3,87,0,180, -3,122,0,180,3, -95,0,180,3,68, -0,180,3,103,0, -180,3,76,0,180, -3,49,0,180,3, -111,0,180,3,84, -0,180,3,57,0, -180,3,119,0,180, -3,65,0,180,3, -100,0,180,3,73, -0,180,3,108,0, -180,3,81,0,180, -3,54,0,180,3, -116,0,180,3,89, -0,180,289,11,1, -867,0,183,1,-1, -3,68,0,180,3, -103,0,180,3,76, -0,180,3,49,0, -180,3,111,0,180, -3,84,0,180,3, -57,0,180,3,119, -0,180,3,65,0, -180,3,100,0,180, -3,73,0,180,3, -108,0,180,3,81, -0,180,3,54,0, -180,3,116,0,180, -3,89,0,180,290, -11,1,867,0,183, -1,-1,3,74,0, -180,3,109,0,180, -3,82,0,180,3, -55,0,180,3,117, -0,180,3,90,0, -180,3,98,0,180, -3,71,0,180,3, -106,0,180,3,79, -0,180,3,52,0, -180,3,114,0,180, -3,87,0,180,3, -122,0,180,3,95, -0,180,3,68,0, -180,3,103,0,180, -3,76,0,180,3, -49,0,180,3,111, -0,180,3,84,0, -180,3,57,0,180, -3,119,0,180,3, -65,0,180,3,100, -0,180,3,73,0, -180,3,108,0,180, -3,81,0,180,3, -54,0,180,3,116, -0,180,3,89,0, -180,291,11,1,867, -0,183,1,-1,3, -82,0,180,3,55, -0,180,3,117,0, -180,3,90,0,180, -3,98,0,180,3, -71,0,180,3,106, -0,180,3,79,0, -180,3,52,0,180, -3,114,0,180,3, -87,0,180,3,122, -0,180,3,95,0, -180,3,68,0,180, -3,103,0,180,3, -76,0,180,3,49, -0,180,3,111,0, -180,3,84,0,180, -3,57,0,180,3, -119,0,180,3,65, -0,180,3,100,0, -180,3,73,0,180, -3,108,0,180,3, -81,0,180,3,54, -0,180,3,116,0, -180,3,89,0,180, -292,11,1,867,0, -183,1,-1,3,78, -0,180,3,51,0, -180,3,113,0,180, -3,86,0,180,3, -121,0,180,3,67, -0,180,3,102,0, -180,3,75,0,180, -3,48,0,180,3, -110,0,180,3,83, -0,180,3,56,0, -180,3,118,0,180, -3,99,0,180,3, -72,0,180,3,107, -0,180,3,80,0, -180,3,53,0,180, -3,115,0,180,3, -88,0,180,3,69, -0,180,3,104,0, -180,3,77,0,180, -3,50,0,180,3, -112,0,180,3,85, -0,180,3,120,0, -180,3,66,0,180, -3,101,0,180,3, -74,0,180,3,109, -0,180,3,82,0, -180,3,55,0,180, -3,117,0,180,3, -90,0,180,3,98, -0,180,3,71,0, -180,3,106,0,180, -3,79,0,180,3, -52,0,180,3,114, -0,180,3,87,0, -180,3,122,0,180, -3,95,0,180,3, -68,0,180,3,103, -0,180,3,76,0, -180,3,49,0,180, -3,111,0,180,3, -84,0,180,3,57, -0,180,3,119,0, -180,3,65,0,180, -3,100,0,180,3, -73,0,180,3,108, -0,180,3,81,0, -180,3,54,0,180, -3,116,0,180,3, -89,0,180,293,11, -1,867,0,183,1, --1,3,89,0,180, -294,11,1,867,0, -183,1,-1,3,68, -0,180,3,103,0, -180,3,76,0,180, -3,49,0,180,3, -111,0,180,3,84, -0,180,3,57,0, -180,3,119,0,180, -3,65,0,180,3, -100,0,180,3,73, -0,180,3,108,0, -180,3,81,0,180, -3,54,0,180,3, -116,0,180,3,89, -0,180,295,11,1, -867,0,183,1,-1, -3,83,0,180,3, -56,0,180,3,118, -0,180,3,99,0, -180,3,72,0,180, -3,107,0,180,3, -80,0,180,3,53, -0,180,3,115,0, -180,3,88,0,180, -3,69,0,180,3, -104,0,180,3,77, -0,180,3,50,0, -180,3,112,0,180, -3,85,0,180,3, -120,0,180,3,66, -0,180,3,101,0, -180,3,74,0,180, -3,109,0,180,3, -82,0,180,3,55, -0,180,3,117,0, -180,3,90,0,180, -3,98,0,180,3, -71,0,180,3,106, -0,180,3,79,0, -180,3,52,0,180, -3,114,0,180,3, -87,0,180,3,122, -0,180,3,95,0, -180,3,68,0,180, -3,103,0,180,3, -76,0,180,3,49, -0,180,3,111,0, -180,3,84,0,180, -3,57,0,180,3, -119,0,180,3,65, -0,180,3,100,0, -180,3,73,0,180, -3,108,0,180,3, -81,0,180,3,54, -0,180,3,116,0, -180,3,89,0,180, -296,11,1,867,0, -183,1,-1,3,90, -0,180,3,98,0, -180,3,71,0,180, -3,106,0,180,3, -79,0,180,3,52, -0,180,3,114,0, -180,3,87,0,180, -3,122,0,180,3, -95,0,180,3,68, -0,180,3,103,0, -180,3,76,0,180, -3,49,0,180,3, -111,0,297,12,1, -34750,298,5,63,3, -97,0,180,3,70, -0,180,3,105,0, -180,3,78,0,180, -3,51,0,180,3, -113,0,180,3,86, -0,180,3,121,0, -180,3,67,0,180, -3,102,0,180,3, -75,0,180,3,48, -0,180,3,110,0, -180,3,83,0,180, -3,56,0,180,3, -118,0,180,3,99, -0,180,3,72,0, -180,3,107,0,180, -3,80,0,180,3, -53,0,180,3,115, -0,180,3,88,0, -180,3,69,0,180, -3,104,0,180,3, -77,0,180,3,50, -0,180,3,112,0, -180,3,85,0,180, -3,120,0,180,3, -66,0,180,3,101, -0,180,3,74,0, -180,3,109,0,180, -3,82,0,180,3, -55,0,180,3,117, -0,180,3,90,0, -180,3,98,0,180, -3,71,0,180,3, -106,0,180,3,79, -0,180,3,52,0, -180,3,114,0,180, -3,87,0,180,3, -122,0,180,3,95, -0,180,3,68,0, -180,3,103,0,180, -3,76,0,180,3, -49,0,180,3,111, -0,180,3,84,0, -180,3,57,0,180, -3,119,0,180,3, -65,0,180,3,100, -0,180,3,73,0, -180,3,108,0,180, -3,81,0,180,3, -54,0,180,3,116, -0,299,12,1,34843, -300,5,63,3,97, -0,301,12,1,34910, -302,5,63,3,97, -0,180,3,70,0, -180,3,105,0,180, -3,78,0,180,3, -51,0,180,3,113, -0,180,3,86,0, -180,3,121,0,180, -3,67,0,180,3, -102,0,180,3,75, -0,180,3,48,0, -180,3,110,0,180, -3,83,0,180,3, -56,0,180,3,118, -0,180,3,99,0, -180,3,72,0,180, -3,107,0,180,3, -80,0,180,3,53, -0,180,3,115,0, -180,3,88,0,180, -3,69,0,180,3, -104,0,180,3,77, -0,180,3,50,0, -180,3,112,0,180, -3,85,0,180,3, -120,0,180,3,66, -0,180,3,101,0, -180,3,74,0,180, -3,109,0,180,3, -82,0,180,3,55, -0,180,3,117,0, -180,3,90,0,180, -3,98,0,180,3, -71,0,180,3,106, -0,180,3,79,0, -180,3,52,0,180, -3,114,0,180,3, -87,0,180,3,122, -0,180,3,95,0, -180,3,68,0,180, -3,103,0,180,3, -76,0,180,3,49, -0,180,3,111,0, -180,3,84,0,180, -3,57,0,180,3, -119,0,180,3,65, -0,180,3,100,0, -180,3,73,0,180, -3,108,0,180,3, -81,0,180,3,54, -0,180,3,116,0, -303,12,1,35003,304, -5,63,3,97,0, -180,3,70,0,180, -3,105,0,305,12, -1,35071,306,5,63, -3,97,0,180,3, -70,0,180,3,105, -0,180,3,78,0, -180,3,51,0,180, -3,113,0,180,3, -86,0,180,3,121, -0,180,3,67,0, -180,3,102,0,180, -3,75,0,180,3, -48,0,180,3,110, -0,180,3,83,0, -180,3,56,0,180, -3,118,0,180,3, -99,0,180,3,72, -0,180,3,107,0, -180,3,80,0,180, -3,53,0,180,3, -115,0,180,3,88, -0,180,3,69,0, -180,3,104,0,180, -3,77,0,180,3, -50,0,180,3,112, -0,180,3,85,0, -180,3,120,0,180, -3,66,0,180,3, -101,0,180,3,74, -0,180,3,109,0, -180,3,82,0,180, -3,55,0,180,3, -117,0,180,3,90, -0,180,3,98,0, -180,3,71,0,180, -3,106,0,180,3, -79,0,180,3,52, -0,180,3,114,0, -180,3,87,0,180, -3,122,0,180,3, -95,0,180,3,68, -0,180,3,103,0, -180,3,76,0,180, -3,49,0,180,3, -111,0,307,12,1, -35159,308,5,63,3, -97,0,180,3,70, -0,180,3,105,0, -180,3,78,0,180, -3,51,0,180,3, -113,0,180,3,86, -0,180,3,121,0, -180,3,67,0,180, -3,102,0,180,3, -75,0,180,3,48, -0,180,3,110,0, -309,12,1,35231,310, -5,63,3,97,0, -180,3,70,0,180, -3,105,0,180,3, -78,0,180,3,51, -0,180,3,113,0, -180,3,86,0,180, -3,121,0,180,3, -67,0,180,3,102, -0,180,3,75,0, -180,3,48,0,180, -3,110,0,180,3, -83,0,180,3,56, -0,180,3,118,0, -180,3,99,0,180, -3,72,0,180,3, -107,0,180,3,80, -0,180,3,53,0, -180,3,115,0,180, -3,88,0,180,3, -69,0,180,3,104, -0,180,3,77,0, -180,3,50,0,180, -3,112,0,180,3, -85,0,180,3,120, -0,180,3,66,0, -180,3,101,0,180, -3,74,0,180,3, -109,0,180,3,82, -0,180,3,55,0, -180,3,117,0,180, -3,90,0,180,3, -98,0,180,3,71, -0,180,3,106,0, -180,3,79,0,180, -3,52,0,180,3, -114,0,180,3,87, -0,180,3,122,0, -180,3,95,0,180, -3,68,0,180,3, -103,0,180,3,76, -0,180,3,49,0, -180,3,111,0,180, -3,84,0,180,3, -57,0,180,3,119, -0,180,3,65,0, -180,3,100,0,180, -3,73,0,180,3, -108,0,180,3,81, -0,180,3,54,0, -180,3,116,0,180, -3,89,0,180,311, -11,1,330,0,312, -4,26,82,0,79, -0,84,0,65,0, -84,0,73,0,79, -0,78,0,95,0, -84,0,89,0,80, -0,69,0,1,-1, -3,83,0,180,3, -56,0,180,3,118, -0,180,3,99,0, -180,3,72,0,180, -3,107,0,180,3, -80,0,180,3,53, -0,180,3,115,0, -180,3,88,0,180, -3,69,0,180,3, -104,0,180,3,77, -0,180,3,50,0, -180,3,112,0,180, -3,85,0,180,3, -120,0,180,3,66, -0,180,3,101,0, -180,3,74,0,180, -3,109,0,180,3, -82,0,180,3,55, -0,180,3,117,0, -180,3,90,0,180, -3,98,0,180,3, -71,0,180,3,106, -0,180,3,79,0, -180,3,52,0,180, -3,114,0,180,3, -87,0,180,3,122, -0,180,3,95,0, -180,3,68,0,180, -3,103,0,180,3, -76,0,180,3,49, -0,180,3,111,0, -180,3,84,0,180, -3,57,0,180,3, -119,0,180,3,65, -0,180,3,100,0, -180,3,73,0,180, -3,108,0,180,3, -81,0,180,3,54, -0,180,3,116,0, -180,3,89,0,180, -313,11,1,867,0, -183,1,-1,3,84, -0,180,3,57,0, -180,3,119,0,180, -3,65,0,180,3, -100,0,180,3,73, -0,180,3,108,0, -180,3,81,0,180, -3,54,0,180,3, -116,0,180,3,89, -0,180,314,11,1, -867,0,183,1,-1, -3,78,0,180,3, -51,0,180,3,113, -0,180,3,86,0, -180,3,121,0,180, -3,67,0,180,3, -102,0,180,3,75, -0,180,3,48,0, -180,3,110,0,180, -3,83,0,180,3, -56,0,180,3,118, -0,180,3,99,0, -180,3,72,0,180, -3,107,0,180,3, -80,0,180,3,53, -0,180,3,115,0, -180,3,88,0,180, -3,69,0,180,3, -104,0,180,3,77, -0,180,3,50,0, -180,3,112,0,180, -3,85,0,180,3, -120,0,180,3,66, -0,180,3,101,0, -180,3,74,0,180, -3,109,0,180,3, -82,0,180,3,55, -0,180,3,117,0, -180,3,90,0,180, -3,98,0,180,3, -71,0,180,3,106, -0,180,3,79,0, -180,3,52,0,180, -3,114,0,180,3, -87,0,180,3,122, -0,180,3,95,0, -180,3,68,0,180, -3,103,0,180,3, -76,0,180,3,49, -0,180,3,111,0, -180,3,84,0,180, -3,57,0,180,3, -119,0,180,3,65, -0,180,3,100,0, -180,3,73,0,180, -3,108,0,180,3, -81,0,180,3,54, -0,180,3,116,0, -180,3,89,0,180, -315,11,1,867,0, -183,1,-1,3,89, -0,180,316,11,1, -867,0,183,1,-1, -3,70,0,180,3, -105,0,180,3,78, -0,180,3,51,0, -180,3,113,0,180, -3,86,0,180,3, -121,0,180,3,67, -0,180,3,102,0, -180,3,75,0,180, -3,48,0,180,3, -110,0,180,3,83, -0,180,3,56,0, -180,3,118,0,180, -3,99,0,180,3, -72,0,180,3,107, -0,180,3,80,0, -180,3,53,0,180, -3,115,0,180,3, -88,0,180,3,69, -0,180,3,104,0, -180,3,77,0,180, -3,50,0,180,3, -112,0,180,3,85, -0,180,3,120,0, -180,3,66,0,180, -3,101,0,180,3, -74,0,180,3,109, -0,180,3,82,0, -180,3,55,0,180, -3,117,0,180,3, -90,0,180,3,98, -0,180,3,71,0, -180,3,106,0,180, -3,79,0,180,3, -52,0,180,3,114, -0,180,3,87,0, -180,3,122,0,180, -3,95,0,180,3, -68,0,180,3,103, -0,180,3,76,0, -180,3,49,0,180, -3,111,0,180,3, -84,0,180,3,57, -0,180,3,119,0, -180,3,65,0,180, -3,100,0,180,3, -73,0,180,3,108, -0,180,3,81,0, -180,3,54,0,180, -3,116,0,180,3, -89,0,180,317,11, -1,867,0,183,1, --1,3,89,0,180, -318,11,1,867,0, -183,1,-1,3,84, -0,180,3,57,0, -180,3,119,0,180, -3,65,0,180,3, -100,0,180,3,73, -0,180,3,108,0, -180,3,81,0,180, -3,54,0,180,3, -116,0,180,3,89, -0,180,319,11,1, -867,0,183,1,-1, -3,74,0,178,3, -34,0,320,12,1, -6998,321,5,0,322, -11,1,963,0,165, -1,-1,3,111,0, -323,12,1,35625,324, -5,63,3,97,0, -180,3,70,0,180, -3,105,0,180,3, -78,0,180,3,51, -0,180,3,113,0, -180,3,86,0,180, -3,121,0,180,3, -67,0,180,3,102, -0,180,3,75,0, -180,3,48,0,180, -3,110,0,325,12, -1,35697,326,5,63, -3,97,0,180,3, -70,0,180,3,105, -0,180,3,78,0, -180,3,51,0,180, -3,113,0,180,3, -86,0,180,3,121, -0,180,3,67,0, -180,3,102,0,180, -3,75,0,180,3, -48,0,180,3,110, -0,180,3,83,0, -180,3,56,0,180, -3,118,0,180,3, -99,0,180,3,72, -0,180,3,107,0, -180,3,80,0,180, -3,53,0,180,3, -115,0,180,3,88, -0,180,3,69,0, -180,3,104,0,180, -3,77,0,180,3, -50,0,180,3,112, -0,180,3,85,0, -180,3,120,0,180, -3,66,0,180,3, -101,0,180,3,74, -0,180,3,109,0, -180,3,82,0,180, -3,55,0,180,3, -117,0,180,3,90, -0,180,3,98,0, -180,3,71,0,180, -3,106,0,180,3, -79,0,180,3,52, -0,180,3,114,0, -180,3,87,0,180, -3,122,0,180,3, -95,0,327,12,1, -35733,328,5,63,3, -97,0,180,3,70, -0,180,3,105,0, -180,3,78,0,180, -3,51,0,180,3, -113,0,180,3,86, -0,180,3,121,0, -180,3,67,0,180, -3,102,0,180,3, -75,0,180,3,48, -0,180,3,110,0, -180,3,83,0,180, -3,56,0,180,3, -118,0,180,3,99, -0,180,3,72,0, -180,3,107,0,180, -3,80,0,180,3, -53,0,180,3,115, -0,180,3,88,0, -180,3,69,0,180, -3,104,0,180,3, -77,0,180,3,50, -0,180,3,112,0, -180,3,85,0,180, -3,120,0,180,3, -66,0,180,3,101, -0,180,3,74,0, -180,3,109,0,180, -3,82,0,180,3, -55,0,180,3,117, -0,180,3,90,0, -180,3,98,0,180, -3,71,0,180,3, -106,0,180,3,79, -0,180,3,52,0, -180,3,114,0,329, -12,1,35818,330,5, -63,3,97,0,180, -3,70,0,180,3, -105,0,180,3,78, -0,180,3,51,0, -180,3,113,0,180, -3,86,0,180,3, -121,0,180,3,67, -0,180,3,102,0, -180,3,75,0,180, -3,48,0,180,3, -110,0,180,3,83, -0,180,3,56,0, -180,3,118,0,180, -3,99,0,180,3, -72,0,180,3,107, -0,180,3,80,0, -180,3,53,0,180, -3,115,0,180,3, -88,0,180,3,69, -0,180,3,104,0, -180,3,77,0,180, -3,50,0,180,3, -112,0,180,3,85, -0,180,3,120,0, -180,3,66,0,180, -3,101,0,331,12, -1,35898,332,5,63, -3,97,0,180,3, -70,0,180,3,105, -0,180,3,78,0, -180,3,51,0,180, -3,113,0,180,3, -86,0,180,3,121, -0,180,3,67,0, -180,3,102,0,180, -3,75,0,180,3, -48,0,180,3,110, -0,180,3,83,0, -180,3,56,0,180, -3,118,0,180,3, -99,0,180,3,72, -0,180,3,107,0, -180,3,80,0,180, -3,53,0,180,3, -115,0,180,3,88, -0,180,3,69,0, -180,3,104,0,180, -3,77,0,180,3, -50,0,180,3,112, -0,180,3,85,0, -180,3,120,0,180, -3,66,0,180,3, -101,0,180,3,74, -0,180,3,109,0, -180,3,82,0,180, -3,55,0,180,3, -117,0,180,3,90, -0,180,3,98,0, -180,3,71,0,180, -3,106,0,180,3, -79,0,180,3,52, -0,180,3,114,0, -180,3,87,0,180, -3,122,0,333,12, -1,35984,334,5,63, -3,97,0,180,3, -70,0,180,3,105, -0,180,3,78,0, -180,3,51,0,180, -3,113,0,180,3, -86,0,180,3,121, -0,180,3,67,0, -180,3,102,0,180, -3,75,0,180,3, -48,0,180,3,110, -0,180,3,83,0, -180,3,56,0,180, -3,118,0,180,3, -99,0,180,3,72, -0,180,3,107,0, -180,3,80,0,180, -3,53,0,180,3, -115,0,180,3,88, -0,180,3,69,0, -180,3,104,0,180, -3,77,0,180,3, -50,0,180,3,112, -0,180,3,85,0, -180,3,120,0,180, -3,66,0,180,3, -101,0,180,3,74, -0,180,3,109,0, -180,3,82,0,180, -3,55,0,180,3, -117,0,180,3,90, -0,180,3,98,0, -180,3,71,0,180, -3,106,0,180,3, -79,0,180,3,52, -0,180,3,114,0, -180,3,87,0,180, -3,122,0,180,3, -95,0,180,3,68, -0,180,3,103,0, -180,3,76,0,180, -3,49,0,180,3, -111,0,180,3,84, -0,180,3,57,0, -180,3,119,0,180, -3,65,0,180,3, -100,0,180,3,73, -0,180,3,108,0, -180,3,81,0,180, -3,54,0,180,3, -116,0,180,3,89, -0,180,335,11,1, -695,0,336,4,24, -79,0,78,0,95, -0,82,0,69,0, -90,0,95,0,69, -0,86,0,69,0, -78,0,84,0,1, --1,3,95,0,180, -3,68,0,180,3, -103,0,180,3,76, -0,180,3,49,0, -180,3,111,0,180, -3,84,0,180,3, -57,0,180,3,119, -0,180,3,65,0, -180,3,100,0,180, -3,73,0,180,3, -108,0,180,3,81, -0,180,3,54,0, -180,3,116,0,180, -3,89,0,180,337, -11,1,867,0,183, -1,-1,3,74,0, -180,3,109,0,180, -3,82,0,180,3, -55,0,180,3,117, -0,180,3,90,0, -180,3,98,0,180, -3,71,0,180,3, -106,0,180,3,79, -0,180,3,52,0, -180,3,114,0,180, -3,87,0,180,3, -122,0,180,3,95, -0,180,3,68,0, -180,3,103,0,180, -3,76,0,180,3, -49,0,180,3,111, -0,180,3,84,0, -180,3,57,0,180, -3,119,0,180,3, -65,0,180,3,100, -0,180,3,73,0, -180,3,108,0,180, -3,81,0,180,3, -54,0,180,3,116, -0,180,3,89,0, -180,338,11,1,867, -0,183,1,-1,3, -87,0,180,3,122, -0,180,3,95,0, -180,3,68,0,180, -3,103,0,180,3, -76,0,180,3,49, -0,180,3,111,0, -180,3,84,0,180, -3,57,0,180,3, -119,0,180,3,65, -0,180,3,100,0, -180,3,73,0,180, -3,108,0,180,3, -81,0,180,3,54, -0,180,3,116,0, -180,3,89,0,180, -339,11,1,867,0, -183,1,-1,3,68, -0,180,3,103,0, -180,3,76,0,180, -3,49,0,180,3, -111,0,180,3,84, -0,180,3,57,0, -180,3,119,0,180, -3,65,0,180,3, -100,0,180,3,73, -0,180,3,108,0, -180,3,81,0,180, -3,54,0,180,3, -116,0,180,3,89, -0,180,340,11,1, -867,0,183,1,-1, -3,83,0,180,3, -56,0,180,3,118, -0,180,3,99,0, -180,3,72,0,180, -3,107,0,180,3, -80,0,180,3,53, -0,180,3,115,0, -180,3,88,0,180, -3,69,0,180,3, -104,0,180,3,77, -0,180,3,50,0, -180,3,112,0,180, -3,85,0,180,3, -120,0,180,3,66, -0,180,3,101,0, -180,3,74,0,180, -3,109,0,180,3, -82,0,180,3,55, -0,180,3,117,0, -180,3,90,0,180, -3,98,0,341,12, -1,36308,342,5,63, -3,97,0,180,3, -70,0,180,3,105, -0,180,3,78,0, -180,3,51,0,180, -3,113,0,180,3, -86,0,180,3,121, -0,180,3,67,0, -180,3,102,0,180, -3,75,0,180,3, -48,0,180,3,110, -0,180,3,83,0, -180,3,56,0,180, -3,118,0,180,3, -99,0,180,3,72, -0,180,3,107,0, -180,3,80,0,180, -3,53,0,180,3, -115,0,180,3,88, -0,180,3,69,0, -180,3,104,0,180, -3,77,0,180,3, -50,0,180,3,112, -0,180,3,85,0, -180,3,120,0,180, -3,66,0,180,3, -101,0,180,3,74, -0,180,3,109,0, -180,3,82,0,180, -3,55,0,180,3, -117,0,180,3,90, -0,180,3,98,0, -180,3,71,0,180, -3,106,0,343,12, -1,36392,344,5,63, -3,97,0,180,3, -70,0,180,3,105, -0,180,3,78,0, -180,3,51,0,180, -3,113,0,180,3, -86,0,180,3,121, -0,180,3,67,0, -180,3,102,0,180, -3,75,0,180,3, -48,0,180,3,110, -0,180,3,83,0, -180,3,56,0,180, -3,118,0,180,3, -99,0,180,3,72, -0,180,3,107,0, -180,3,80,0,180, -3,53,0,180,3, -115,0,180,3,88, -0,180,3,69,0, -180,3,104,0,180, -3,77,0,180,3, -50,0,180,3,112, -0,180,3,85,0, -180,3,120,0,180, -3,66,0,180,3, -101,0,345,12,1, -36472,346,5,63,3, -97,0,180,3,70, -0,180,3,105,0, -180,3,78,0,180, -3,51,0,180,3, -113,0,180,3,86, -0,180,3,121,0, -180,3,67,0,180, -3,102,0,180,3, -75,0,180,3,48, -0,180,3,110,0, -180,3,83,0,180, -3,56,0,180,3, -118,0,180,3,99, -0,347,12,1,36546, -348,5,63,3,97, -0,180,3,70,0, -180,3,105,0,180, -3,78,0,180,3, -51,0,180,3,113, -0,180,3,86,0, -180,3,121,0,180, -3,67,0,180,3, -102,0,180,3,75, -0,180,3,48,0, -180,3,110,0,180, -3,83,0,180,3, -56,0,180,3,118, -0,180,3,99,0, -180,3,72,0,180, -3,107,0,180,3, -80,0,180,3,53, -0,180,3,115,0, -180,3,88,0,180, -3,69,0,180,3, -104,0,180,3,77, -0,180,3,50,0, -180,3,112,0,180, -3,85,0,180,3, -120,0,180,3,66, -0,180,3,101,0, -180,3,74,0,180, -3,109,0,180,3, -82,0,180,3,55, -0,180,3,117,0, -180,3,90,0,180, -3,98,0,180,3, -71,0,180,3,106, -0,180,3,79,0, -180,3,52,0,180, -3,114,0,180,3, -87,0,180,3,122, -0,180,3,95,0, -180,3,68,0,180, -3,103,0,180,3, -76,0,180,3,49, -0,180,3,111,0, -180,3,84,0,180, -3,57,0,180,3, -119,0,180,3,65, -0,180,3,100,0, -180,3,73,0,180, -3,108,0,180,3, -81,0,180,3,54, -0,180,3,116,0, -349,12,1,36639,350, -5,63,3,97,0, -180,3,70,0,180, -3,105,0,180,3, -78,0,180,3,51, -0,180,3,113,0, -180,3,86,0,180, -3,121,0,180,3, -67,0,180,3,102, -0,180,3,75,0, -180,3,48,0,180, -3,110,0,180,3, -83,0,180,3,56, -0,180,3,118,0, -180,3,99,0,180, -3,72,0,180,3, -107,0,180,3,80, -0,180,3,53,0, -180,3,115,0,180, -3,88,0,180,3, -69,0,180,3,104, -0,180,3,77,0, -180,3,50,0,180, -3,112,0,180,3, -85,0,180,3,120, -0,180,3,66,0, -180,3,101,0,180, -3,74,0,180,3, -109,0,180,3,82, -0,180,3,55,0, -180,3,117,0,180, -3,90,0,180,3, -98,0,180,3,71, -0,180,3,106,0, -180,3,79,0,180, -3,52,0,180,3, -114,0,180,3,87, -0,180,3,122,0, -180,3,95,0,351, -12,1,36675,352,5, -63,3,97,0,180, -3,70,0,180,3, -105,0,180,3,78, -0,180,3,51,0, -180,3,113,0,180, -3,86,0,180,3, -121,0,180,3,67, -0,180,3,102,0, -180,3,75,0,180, -3,48,0,180,3, -110,0,180,3,83, -0,180,3,56,0, -180,3,118,0,180, -3,99,0,180,3, -72,0,180,3,107, -0,180,3,80,0, -180,3,53,0,180, -3,115,0,180,3, -88,0,180,3,69, -0,180,3,104,0, -180,3,77,0,180, -3,50,0,180,3, -112,0,180,3,85, -0,180,3,120,0, -180,3,66,0,180, -3,101,0,180,3, -74,0,180,3,109, -0,180,3,82,0, -180,3,55,0,180, -3,117,0,180,3, -90,0,180,3,98, -0,180,3,71,0, -180,3,106,0,180, -3,79,0,180,3, -52,0,180,3,114, -0,353,12,1,36760, -354,5,63,3,97, -0,180,3,70,0, -180,3,105,0,180, -3,78,0,180,3, -51,0,180,3,113, -0,180,3,86,0, -180,3,121,0,180, -3,67,0,180,3, -102,0,180,3,75, -0,180,3,48,0, -180,3,110,0,180, -3,83,0,180,3, -56,0,180,3,118, -0,180,3,99,0, -180,3,72,0,180, -3,107,0,180,3, -80,0,180,3,53, -0,180,3,115,0, -180,3,88,0,180, -3,69,0,180,3, -104,0,180,3,77, -0,180,3,50,0, -180,3,112,0,180, -3,85,0,180,3, -120,0,180,3,66, -0,180,3,101,0, -355,12,1,36840,356, -5,63,3,97,0, -180,3,70,0,180, -3,105,0,180,3, -78,0,180,3,51, -0,180,3,113,0, -180,3,86,0,180, -3,121,0,180,3, -67,0,180,3,102, -0,180,3,75,0, -180,3,48,0,180, -3,110,0,180,3, -83,0,180,3,56, -0,180,3,118,0, -180,3,99,0,180, -3,72,0,180,3, -107,0,180,3,80, -0,180,3,53,0, -180,3,115,0,180, -3,88,0,180,3, -69,0,180,3,104, -0,180,3,77,0, -180,3,50,0,180, -3,112,0,180,3, -85,0,180,3,120, -0,180,3,66,0, -180,3,101,0,180, -3,74,0,180,3, -109,0,180,3,82, -0,180,3,55,0, -180,3,117,0,180, -3,90,0,180,3, -98,0,180,3,71, -0,180,3,106,0, -180,3,79,0,180, -3,52,0,180,3, -114,0,180,3,87, -0,180,3,122,0, -357,12,1,36926,358, -5,63,3,97,0, -180,3,70,0,180, -3,105,0,180,3, -78,0,180,3,51, -0,180,3,113,0, -180,3,86,0,180, -3,121,0,180,3, -67,0,180,3,102, -0,180,3,75,0, -180,3,48,0,180, -3,110,0,180,3, -83,0,180,3,56, -0,180,3,118,0, -180,3,99,0,180, -3,72,0,180,3, -107,0,180,3,80, -0,180,3,53,0, -180,3,115,0,180, -3,88,0,180,3, -69,0,180,3,104, -0,180,3,77,0, -180,3,50,0,180, -3,112,0,180,3, -85,0,180,3,120, -0,180,3,66,0, -180,3,101,0,180, -3,74,0,180,3, -109,0,180,3,82, -0,180,3,55,0, -180,3,117,0,180, -3,90,0,180,3, -98,0,180,3,71, -0,180,3,106,0, -180,3,79,0,180, -3,52,0,180,3, -114,0,180,3,87, -0,180,3,122,0, -180,3,95,0,180, -3,68,0,180,3, -103,0,180,3,76, -0,180,3,49,0, -180,3,111,0,180, -3,84,0,180,3, -57,0,180,3,119, -0,180,3,65,0, -180,3,100,0,180, -3,73,0,180,3, -108,0,180,3,81, -0,180,3,54,0, -180,3,116,0,180, -3,89,0,180,359, -11,1,681,0,360, -4,32,79,0,66, -0,74,0,69,0, -67,0,84,0,95, -0,82,0,69,0, -90,0,95,0,69, -0,86,0,69,0, -78,0,84,0,1, --1,3,95,0,180, -3,68,0,180,3, -103,0,180,3,76, -0,180,3,49,0, -180,3,111,0,180, -3,84,0,180,3, -57,0,180,3,119, -0,180,3,65,0, -180,3,100,0,180, -3,73,0,180,3, -108,0,180,3,81, -0,180,3,54,0, -180,3,116,0,180, -3,89,0,180,361, -11,1,867,0,183, -1,-1,3,74,0, -180,3,109,0,180, -3,82,0,180,3, -55,0,180,3,117, -0,180,3,90,0, -180,3,98,0,180, -3,71,0,180,3, -106,0,180,3,79, -0,180,3,52,0, -180,3,114,0,180, -3,87,0,180,3, -122,0,180,3,95, -0,180,3,68,0, -180,3,103,0,180, -3,76,0,180,3, -49,0,180,3,111, -0,180,3,84,0, -180,3,57,0,180, -3,119,0,180,3, -65,0,180,3,100, -0,180,3,73,0, -180,3,108,0,180, -3,81,0,180,3, -54,0,180,3,116, -0,180,3,89,0, -180,362,11,1,867, -0,183,1,-1,3, -87,0,180,3,122, -0,180,3,95,0, -180,3,68,0,180, -3,103,0,180,3, -76,0,180,3,49, -0,180,3,111,0, -180,3,84,0,180, -3,57,0,180,3, -119,0,180,3,65, -0,180,3,100,0, -180,3,73,0,180, -3,108,0,180,3, -81,0,180,3,54, -0,180,3,116,0, -180,3,89,0,180, -363,11,1,867,0, -183,1,-1,3,68, -0,180,3,103,0, -180,3,76,0,180, -3,49,0,180,3, -111,0,180,3,84, -0,180,3,57,0, -180,3,119,0,180, -3,65,0,180,3, -100,0,180,3,73, -0,180,3,108,0, -180,3,81,0,180, -3,54,0,180,3, -116,0,180,3,89, -0,180,364,11,1, -867,0,183,1,-1, -3,89,0,180,365, -11,1,867,0,183, -1,-1,3,72,0, -180,3,107,0,180, -3,80,0,180,3, -53,0,180,3,115, -0,180,3,88,0, -180,3,69,0,180, -3,104,0,180,3, -77,0,180,3,50, -0,180,3,112,0, -180,3,85,0,180, -3,120,0,180,3, -66,0,180,3,101, -0,180,3,74,0, -180,3,109,0,180, -3,82,0,180,3, -55,0,180,3,117, -0,180,3,90,0, -180,3,98,0,180, -3,71,0,180,3, -106,0,180,3,79, -0,180,3,52,0, -180,3,114,0,180, -3,87,0,180,3, -122,0,180,3,95, -0,180,3,68,0, -180,3,103,0,180, -3,76,0,180,3, -49,0,180,3,111, -0,180,3,84,0, -180,3,57,0,180, -3,119,0,180,3, -65,0,180,3,100, -0,180,3,73,0, -180,3,108,0,180, -3,81,0,180,3, -54,0,180,3,116, -0,180,3,89,0, -180,366,11,1,867, -0,183,1,-1,3, -74,0,180,3,109, -0,180,3,82,0, -180,3,55,0,180, -3,117,0,180,3, -90,0,180,3,98, -0,180,3,71,0, -180,3,106,0,180, -3,79,0,180,3, -52,0,180,3,114, -0,180,3,87,0, -180,3,122,0,180, -3,95,0,180,3, -68,0,180,3,103, -0,180,3,76,0, -180,3,49,0,180, -3,111,0,180,3, -84,0,180,3,57, -0,180,3,119,0, -180,3,65,0,180, -3,100,0,180,3, -73,0,180,3,108, -0,180,3,81,0, -180,3,54,0,180, -3,116,0,180,3, -89,0,180,367,11, -1,867,0,183,1, --1,3,79,0,180, -3,52,0,180,3, -114,0,180,3,87, -0,180,3,122,0, -180,3,95,0,180, -3,68,0,180,3, -103,0,180,3,76, -0,180,3,49,0, -180,3,111,0,180, -3,84,0,180,3, -57,0,180,3,119, -0,180,3,65,0, -180,3,100,0,180, -3,73,0,180,3, -108,0,180,3,81, -0,180,3,54,0, -180,3,116,0,180, -3,89,0,180,368, -11,1,867,0,183, -1,-1,3,71,0, -180,3,106,0,180, -3,79,0,180,3, -52,0,180,3,114, -0,180,3,87,0, -180,3,122,0,180, -3,95,0,180,3, -68,0,180,3,103, -0,180,3,76,0, -180,3,49,0,180, -3,111,0,180,3, -84,0,180,3,57, -0,180,3,119,0, -180,3,65,0,180, -3,100,0,180,3, -73,0,180,3,108, -0,180,3,81,0, -180,3,54,0,180, -3,116,0,180,3, -89,0,180,369,11, -1,867,0,183,1, --1,3,71,0,178, -3,108,0,370,12, -1,40068,371,5,63, -3,97,0,372,12, -1,40135,373,5,63, -3,97,0,180,3, -70,0,180,3,105, -0,180,3,78,0, -180,3,51,0,180, -3,113,0,180,3, -86,0,180,3,121, -0,180,3,67,0, -180,3,102,0,180, -3,75,0,180,3, -48,0,180,3,110, -0,374,12,1,40207, -375,5,63,3,97, -0,180,3,70,0, -180,3,105,0,180, -3,78,0,180,3, -51,0,180,3,113, -0,180,3,86,0, -180,3,121,0,180, -3,67,0,180,3, -102,0,180,3,75, -0,180,3,48,0, -180,3,110,0,180, -3,83,0,180,3, -56,0,180,3,118, -0,180,3,99,0, -180,3,72,0,180, -3,107,0,180,3, -80,0,180,3,53, -0,180,3,115,0, -180,3,88,0,180, -3,69,0,180,3, -104,0,180,3,77, -0,180,3,50,0, -180,3,112,0,180, -3,85,0,180,3, -120,0,180,3,66, -0,180,3,101,0, -180,3,74,0,180, -3,109,0,180,3, -82,0,180,3,55, -0,180,3,117,0, -180,3,90,0,180, -3,98,0,180,3, -71,0,180,3,106, -0,180,3,79,0, -180,3,52,0,180, -3,114,0,180,3, -87,0,180,3,122, -0,180,3,95,0, -180,3,68,0,180, -3,103,0,180,3, -76,0,180,3,49, -0,180,3,111,0, -180,3,84,0,180, -3,57,0,180,3, -119,0,180,3,65, -0,180,3,100,0, -376,12,1,40297,377, -5,63,3,97,0, -180,3,70,0,180, -3,105,0,180,3, -78,0,180,3,51, -0,180,3,113,0, -180,3,86,0,180, -3,121,0,180,3, -67,0,180,3,102, -0,180,3,75,0, -180,3,48,0,180, -3,110,0,180,3, -83,0,180,3,56, -0,180,3,118,0, -180,3,99,0,180, -3,72,0,180,3, -107,0,180,3,80, -0,180,3,53,0, -180,3,115,0,180, -3,88,0,180,3, -69,0,180,3,104, -0,180,3,77,0, -180,3,50,0,180, -3,112,0,180,3, -85,0,180,3,120, -0,180,3,66,0, -180,3,101,0,180, -3,74,0,180,3, -109,0,180,3,82, -0,180,3,55,0, -180,3,117,0,180, -3,90,0,180,3, -98,0,180,3,71, -0,180,3,106,0, -180,3,79,0,180, -3,52,0,180,3, -114,0,180,3,87, -0,180,3,122,0, -180,3,95,0,378, -12,1,40333,379,5, -63,3,97,0,180, -3,70,0,180,3, -105,0,180,3,78, -0,180,3,51,0, -180,3,113,0,180, -3,86,0,180,3, -121,0,180,3,67, -0,180,3,102,0, -180,3,75,0,180, -3,48,0,180,3, -110,0,180,3,83, -0,180,3,56,0, -180,3,118,0,180, -3,99,0,380,12, -1,40407,381,5,63, -3,97,0,180,3, -70,0,180,3,105, -0,180,3,78,0, -180,3,51,0,180, -3,113,0,180,3, -86,0,180,3,121, -0,180,3,67,0, -180,3,102,0,180, -3,75,0,180,3, -48,0,180,3,110, -0,180,3,83,0, -180,3,56,0,180, -3,118,0,180,3, -99,0,180,3,72, -0,180,3,107,0, -180,3,80,0,180, -3,53,0,180,3, -115,0,180,3,88, -0,180,3,69,0, -180,3,104,0,180, -3,77,0,180,3, -50,0,180,3,112, -0,180,3,85,0, -180,3,120,0,180, -3,66,0,180,3, -101,0,180,3,74, -0,180,3,109,0, -180,3,82,0,180, -3,55,0,180,3, -117,0,180,3,90, -0,180,3,98,0, -180,3,71,0,180, -3,106,0,180,3, -79,0,180,3,52, -0,180,3,114,0, -180,3,87,0,180, -3,122,0,180,3, -95,0,180,3,68, -0,180,3,103,0, -180,3,76,0,180, -3,49,0,180,3, -111,0,382,12,1, -40495,383,5,63,3, -97,0,180,3,70, -0,180,3,105,0, -180,3,78,0,180, -3,51,0,180,3, -113,0,180,3,86, -0,180,3,121,0, -180,3,67,0,180, -3,102,0,180,3, -75,0,180,3,48, -0,180,3,110,0, -180,3,83,0,180, -3,56,0,180,3, -118,0,180,3,99, -0,180,3,72,0, -180,3,107,0,180, -3,80,0,180,3, -53,0,180,3,115, -0,180,3,88,0, -180,3,69,0,180, -3,104,0,180,3, -77,0,180,3,50, -0,180,3,112,0, -180,3,85,0,180, -3,120,0,180,3, -66,0,180,3,101, -0,180,3,74,0, -180,3,109,0,180, -3,82,0,180,3, -55,0,180,3,117, -0,180,3,90,0, -180,3,98,0,180, -3,71,0,180,3, -106,0,180,3,79, -0,180,3,52,0, -180,3,114,0,180, -3,87,0,180,3, -122,0,180,3,95, -0,180,3,68,0, -180,3,103,0,180, -3,76,0,180,3, -49,0,180,3,111, -0,180,3,84,0, -180,3,57,0,180, -3,119,0,180,3, -65,0,180,3,100, -0,180,3,73,0, -180,3,108,0,384, -12,1,40586,385,5, -63,3,97,0,180, -3,70,0,180,3, -105,0,180,3,78, -0,180,3,51,0, -180,3,113,0,180, -3,86,0,180,3, -121,0,180,3,67, -0,180,3,102,0, -180,3,75,0,180, -3,48,0,180,3, -110,0,180,3,83, -0,180,3,56,0, -180,3,118,0,180, -3,99,0,180,3, -72,0,180,3,107, -0,180,3,80,0, -180,3,53,0,180, -3,115,0,180,3, -88,0,180,3,69, -0,180,3,104,0, -180,3,77,0,180, -3,50,0,180,3, -112,0,180,3,85, -0,180,3,120,0, -180,3,66,0,180, -3,101,0,180,3, -74,0,180,3,109, -0,180,3,82,0, -180,3,55,0,180, -3,117,0,180,3, -90,0,180,3,98, -0,180,3,71,0, -180,3,106,0,180, -3,79,0,180,3, -52,0,180,3,114, -0,180,3,87,0, -180,3,122,0,180, -3,95,0,180,3, -68,0,180,3,103, -0,180,3,76,0, -180,3,49,0,180, -3,111,0,180,3, -84,0,180,3,57, -0,180,3,119,0, -180,3,65,0,180, -3,100,0,180,3, -73,0,180,3,108, -0,386,12,1,40677, -387,5,63,3,97, -0,180,3,70,0, -180,3,105,0,388, -12,1,40745,389,5, -63,3,97,0,180, -3,70,0,180,3, -105,0,180,3,78, -0,180,3,51,0, -180,3,113,0,180, -3,86,0,180,3, -121,0,180,3,67, -0,180,3,102,0, -180,3,75,0,180, -3,48,0,180,3, -110,0,180,3,83, -0,180,3,56,0, -180,3,118,0,180, -3,99,0,180,3, -72,0,180,3,107, -0,180,3,80,0, -180,3,53,0,180, -3,115,0,390,12, -1,40821,391,5,63, -3,97,0,180,3, -70,0,180,3,105, -0,392,12,1,40889, -393,5,63,3,97, -0,180,3,70,0, -180,3,105,0,180, -3,78,0,180,3, -51,0,180,3,113, -0,180,3,86,0, -180,3,121,0,180, -3,67,0,180,3, -102,0,180,3,75, -0,180,3,48,0, -180,3,110,0,180, -3,83,0,180,3, -56,0,180,3,118, -0,180,3,99,0, -180,3,72,0,180, -3,107,0,180,3, -80,0,180,3,53, -0,180,3,115,0, -180,3,88,0,180, -3,69,0,180,3, -104,0,180,3,77, -0,180,3,50,0, -180,3,112,0,180, -3,85,0,180,3, -120,0,180,3,66, -0,180,3,101,0, -180,3,74,0,180, -3,109,0,180,3, -82,0,180,3,55, -0,180,3,117,0, -180,3,90,0,180, -3,98,0,180,3, -71,0,180,3,106, -0,180,3,79,0, -180,3,52,0,180, -3,114,0,180,3, -87,0,180,3,122, -0,180,3,95,0, -180,3,68,0,180, -3,103,0,180,3, -76,0,180,3,49, -0,180,3,111,0, -394,12,1,40977,395, -5,63,3,97,0, -180,3,70,0,180, -3,105,0,180,3, -78,0,180,3,51, -0,180,3,113,0, -180,3,86,0,180, -3,121,0,180,3, -67,0,180,3,102, -0,180,3,75,0, -180,3,48,0,180, -3,110,0,396,12, -1,41049,397,5,63, -3,97,0,180,3, -70,0,180,3,105, -0,180,3,78,0, -180,3,51,0,180, -3,113,0,180,3, -86,0,180,3,121, -0,180,3,67,0, -180,3,102,0,180, -3,75,0,180,3, -48,0,180,3,110, -0,180,3,83,0, -180,3,56,0,180, -3,118,0,180,3, -99,0,180,3,72, -0,180,3,107,0, -180,3,80,0,180, -3,53,0,180,3, -115,0,180,3,88, -0,180,3,69,0, -180,3,104,0,180, -3,77,0,180,3, -50,0,180,3,112, -0,180,3,85,0, -180,3,120,0,180, -3,66,0,180,3, -101,0,180,3,74, -0,180,3,109,0, -180,3,82,0,180, -3,55,0,180,3, -117,0,180,3,90, -0,180,3,98,0, -180,3,71,0,180, -3,106,0,180,3, -79,0,180,3,52, -0,180,3,114,0, -180,3,87,0,180, -3,122,0,180,3, -95,0,398,12,1, -41085,399,5,63,3, -97,0,180,3,70, -0,180,3,105,0, -180,3,78,0,180, -3,51,0,180,3, -113,0,180,3,86, -0,180,3,121,0, -180,3,67,0,180, -3,102,0,180,3, -75,0,180,3,48, -0,180,3,110,0, -180,3,83,0,180, -3,56,0,180,3, -118,0,180,3,99, -0,180,3,72,0, -180,3,107,0,180, -3,80,0,180,3, -53,0,180,3,115, -0,400,12,1,41161, -401,5,63,3,97, -0,180,3,70,0, -180,3,105,0,180, -3,78,0,180,3, -51,0,180,3,113, -0,180,3,86,0, -180,3,121,0,180, -3,67,0,180,3, -102,0,180,3,75, -0,180,3,48,0, -180,3,110,0,180, -3,83,0,180,3, -56,0,180,3,118, -0,180,3,99,0, -180,3,72,0,180, -3,107,0,180,3, -80,0,180,3,53, -0,180,3,115,0, -180,3,88,0,180, -3,69,0,180,3, -104,0,180,3,77, -0,180,3,50,0, -180,3,112,0,180, -3,85,0,180,3, -120,0,180,3,66, -0,180,3,101,0, -180,3,74,0,180, -3,109,0,180,3, -82,0,180,3,55, -0,180,3,117,0, -180,3,90,0,180, -3,98,0,180,3, -71,0,180,3,106, -0,180,3,79,0, -180,3,52,0,180, -3,114,0,180,3, -87,0,180,3,122, -0,180,3,95,0, -180,3,68,0,180, -3,103,0,180,3, -76,0,180,3,49, -0,180,3,111,0, -180,3,84,0,180, -3,57,0,180,3, -119,0,180,3,65, -0,180,3,100,0, -180,3,73,0,180, -3,108,0,180,3, -81,0,180,3,54, -0,180,3,116,0, -402,12,1,41254,403, -5,63,3,97,0, -404,12,1,41321,405, -5,63,3,97,0, -180,3,70,0,180, -3,105,0,180,3, -78,0,180,3,51, -0,180,3,113,0, -180,3,86,0,180, -3,121,0,180,3, -67,0,180,3,102, -0,180,3,75,0, -180,3,48,0,180, -3,110,0,180,3, -83,0,180,3,56, -0,180,3,118,0, -180,3,99,0,180, -3,72,0,180,3, -107,0,180,3,80, -0,180,3,53,0, -180,3,115,0,180, -3,88,0,180,3, -69,0,180,3,104, -0,180,3,77,0, -180,3,50,0,180, -3,112,0,180,3, -85,0,180,3,120, -0,180,3,66,0, -180,3,101,0,180, -3,74,0,180,3, -109,0,180,3,82, -0,180,3,55,0, -180,3,117,0,180, -3,90,0,180,3, -98,0,180,3,71, -0,180,3,106,0, -180,3,79,0,180, -3,52,0,180,3, -114,0,406,12,1, -41406,407,5,63,3, -97,0,180,3,70, -0,180,3,105,0, -180,3,78,0,180, -3,51,0,180,3, -113,0,180,3,86, -0,180,3,121,0, -180,3,67,0,180, -3,102,0,180,3, -75,0,180,3,48, -0,180,3,110,0, -180,3,83,0,180, -3,56,0,180,3, -118,0,180,3,99, -0,180,3,72,0, -180,3,107,0,180, -3,80,0,180,3, -53,0,180,3,115, -0,180,3,88,0, -180,3,69,0,180, -3,104,0,180,3, -77,0,180,3,50, -0,180,3,112,0, -180,3,85,0,180, -3,120,0,180,3, -66,0,180,3,101, -0,180,3,74,0, -180,3,109,0,180, -3,82,0,180,3, -55,0,180,3,117, -0,180,3,90,0, -180,3,98,0,180, -3,71,0,180,3, -106,0,180,3,79, -0,180,3,52,0, -180,3,114,0,180, -3,87,0,180,3, -122,0,180,3,95, -0,180,3,68,0, -180,3,103,0,180, -3,76,0,180,3, -49,0,180,3,111, -0,180,3,84,0, -180,3,57,0,180, -3,119,0,180,3, -65,0,180,3,100, -0,180,3,73,0, -180,3,108,0,180, -3,81,0,180,3, -54,0,180,3,116, -0,408,12,1,41499, -409,5,63,3,97, -0,180,3,70,0, -180,3,105,0,180, -3,78,0,180,3, -51,0,180,3,113, -0,180,3,86,0, -180,3,121,0,180, -3,67,0,180,3, -102,0,180,3,75, -0,180,3,48,0, -180,3,110,0,180, -3,83,0,180,3, -56,0,180,3,118, -0,180,3,99,0, -180,3,72,0,180, -3,107,0,180,3, -80,0,180,3,53, -0,180,3,115,0, -180,3,88,0,180, -3,69,0,180,3, -104,0,180,3,77, -0,180,3,50,0, -180,3,112,0,180, -3,85,0,180,3, -120,0,180,3,66, -0,180,3,101,0, -180,3,74,0,180, -3,109,0,180,3, -82,0,180,3,55, -0,180,3,117,0, -180,3,90,0,180, -3,98,0,180,3, -71,0,180,3,106, -0,180,3,79,0, -180,3,52,0,180, -3,114,0,180,3, -87,0,180,3,122, -0,180,3,95,0, -180,3,68,0,180, -3,103,0,180,3, -76,0,180,3,49, -0,180,3,111,0, -180,3,84,0,180, -3,57,0,180,3, -119,0,180,3,65, -0,180,3,100,0, -180,3,73,0,180, -3,108,0,180,3, -81,0,180,3,54, -0,180,3,116,0, -180,3,89,0,180, -410,11,1,541,0, -411,4,52,76,0, -65,0,78,0,68, -0,95,0,67,0, -79,0,76,0,76, -0,73,0,83,0, -73,0,79,0,78, -0,95,0,83,0, -84,0,65,0,82, -0,84,0,95,0, -69,0,86,0,69, -0,78,0,84,0, -1,-1,3,89,0, -180,412,11,1,867, -0,183,1,-1,3, -87,0,180,3,122, -0,180,3,95,0, -180,3,68,0,180, -3,103,0,180,3, -76,0,180,3,49, -0,180,3,111,0, -180,3,84,0,180, -3,57,0,180,3, -119,0,180,3,65, -0,180,3,100,0, -180,3,73,0,180, -3,108,0,180,3, -81,0,180,3,54, -0,180,3,116,0, -180,3,89,0,180, -413,11,1,867,0, -183,1,-1,3,70, -0,180,3,105,0, -180,3,78,0,180, -3,51,0,180,3, -113,0,180,3,86, -0,180,3,121,0, -180,3,67,0,180, -3,102,0,180,3, -75,0,180,3,48, -0,180,3,110,0, -180,3,83,0,180, -3,56,0,180,3, -118,0,180,3,99, -0,180,3,72,0, -180,3,107,0,180, -3,80,0,180,3, -53,0,180,3,115, -0,180,3,88,0, -180,3,69,0,180, -3,104,0,180,3, -77,0,180,3,50, -0,180,3,112,0, -180,3,85,0,180, -3,120,0,180,3, -66,0,180,3,101, -0,180,3,74,0, -180,3,109,0,180, -3,82,0,180,3, -55,0,180,3,117, -0,180,3,90,0, -180,3,98,0,180, -3,71,0,180,3, -106,0,180,3,79, -0,180,3,52,0, -180,3,114,0,180, -3,87,0,180,3, -122,0,180,3,95, -0,180,3,68,0, -180,3,103,0,180, -3,76,0,180,3, -49,0,180,3,111, -0,180,3,84,0, -180,3,57,0,180, -3,119,0,180,3, -65,0,180,3,100, -0,180,3,73,0, -180,3,108,0,180, -3,81,0,180,3, -54,0,180,3,116, -0,180,3,89,0, -180,414,11,1,867, -0,183,1,-1,3, -89,0,180,415,11, -1,867,0,183,1, --1,3,88,0,180, -3,69,0,180,3, -104,0,180,3,77, -0,180,3,50,0, -180,3,112,0,180, -3,85,0,180,3, -120,0,180,3,66, -0,180,3,101,0, -416,12,1,41765,417, -5,63,3,97,0, -180,3,70,0,180, -3,105,0,180,3, -78,0,180,3,51, -0,180,3,113,0, -180,3,86,0,180, -3,121,0,180,3, -67,0,180,3,102, -0,180,3,75,0, -180,3,48,0,180, -3,110,0,418,12, -1,41837,419,5,63, -3,97,0,180,3, -70,0,180,3,105, -0,180,3,78,0, -180,3,51,0,180, -3,113,0,180,3, -86,0,180,3,121, -0,180,3,67,0, -180,3,102,0,180, -3,75,0,180,3, -48,0,180,3,110, -0,180,3,83,0, -180,3,56,0,180, -3,118,0,180,3, -99,0,180,3,72, -0,180,3,107,0, -180,3,80,0,180, -3,53,0,180,3, -115,0,180,3,88, -0,180,3,69,0, -180,3,104,0,180, -3,77,0,180,3, -50,0,180,3,112, -0,180,3,85,0, -180,3,120,0,180, -3,66,0,180,3, -101,0,180,3,74, -0,180,3,109,0, -180,3,82,0,180, -3,55,0,180,3, -117,0,180,3,90, -0,180,3,98,0, -180,3,71,0,180, -3,106,0,180,3, -79,0,180,3,52, -0,180,3,114,0, -180,3,87,0,180, -3,122,0,180,3, -95,0,180,3,68, -0,180,3,103,0, -180,3,76,0,180, -3,49,0,180,3, -111,0,180,3,84, -0,180,3,57,0, -180,3,119,0,180, -3,65,0,180,3, -100,0,420,12,1, -41927,421,5,63,3, -97,0,180,3,70, -0,180,3,105,0, -180,3,78,0,180, -3,51,0,180,3, -113,0,180,3,86, -0,180,3,121,0, -180,3,67,0,180, -3,102,0,180,3, -75,0,180,3,48, -0,180,3,110,0, -180,3,83,0,180, -3,56,0,180,3, -118,0,180,3,99, -0,180,3,72,0, -180,3,107,0,180, -3,80,0,180,3, -53,0,180,3,115, -0,180,3,88,0, -180,3,69,0,180, -3,104,0,180,3, -77,0,180,3,50, -0,180,3,112,0, -180,3,85,0,180, -3,120,0,180,3, -66,0,180,3,101, -0,180,3,74,0, -180,3,109,0,180, -3,82,0,180,3, -55,0,180,3,117, -0,180,3,90,0, -180,3,98,0,180, -3,71,0,180,3, -106,0,180,3,79, -0,180,3,52,0, -180,3,114,0,180, -3,87,0,180,3, -122,0,180,3,95, -0,180,3,68,0, -180,3,103,0,180, -3,76,0,180,3, -49,0,180,3,111, -0,180,3,84,0, -180,3,57,0,180, -3,119,0,180,3, -65,0,180,3,100, -0,180,3,73,0, -180,3,108,0,180, -3,81,0,180,3, -54,0,180,3,116, -0,180,3,89,0, -180,422,11,1,519, -0,423,4,48,76, -0,65,0,78,0, -68,0,95,0,67, -0,79,0,76,0, -76,0,73,0,83, -0,73,0,79,0, -78,0,95,0,69, -0,78,0,68,0, -95,0,69,0,86, -0,69,0,78,0, -84,0,1,-1,3, -73,0,180,3,108, -0,180,3,81,0, -180,3,54,0,180, -3,116,0,180,3, -89,0,180,424,11, -1,867,0,183,1, --1,3,83,0,180, -3,56,0,180,3, -118,0,180,3,99, -0,180,3,72,0, -180,3,107,0,180, -3,80,0,180,3, -53,0,180,3,115, -0,180,3,88,0, -180,3,69,0,180, -3,104,0,180,3, -77,0,180,3,50, -0,180,3,112,0, -180,3,85,0,180, -3,120,0,180,3, -66,0,180,3,101, -0,180,3,74,0, -180,3,109,0,180, -3,82,0,180,3, -55,0,180,3,117, -0,180,3,90,0, -180,3,98,0,180, -3,71,0,180,3, -106,0,180,3,79, -0,180,3,52,0, -180,3,114,0,180, -3,87,0,180,3, -122,0,180,3,95, -0,180,3,68,0, -180,3,103,0,180, -3,76,0,180,3, -49,0,180,3,111, -0,180,3,84,0, -180,3,57,0,180, -3,119,0,180,3, -65,0,180,3,100, -0,180,3,73,0, -180,3,108,0,180, -3,81,0,180,3, -54,0,180,3,116, -0,180,3,89,0, -180,425,11,1,867, -0,183,1,-1,3, -74,0,180,3,109, -0,180,3,82,0, -180,3,55,0,180, -3,117,0,180,3, -90,0,180,3,98, -0,180,3,71,0, -180,3,106,0,180, -3,79,0,180,3, -52,0,180,3,114, -0,180,3,87,0, -180,3,122,0,180, -3,95,0,180,3, -68,0,180,3,103, -0,180,3,76,0, -180,3,49,0,180, -3,111,0,180,3, -84,0,180,3,57, -0,180,3,119,0, -180,3,65,0,180, -3,100,0,180,3, -73,0,180,3,108, -0,180,3,81,0, -180,3,54,0,180, -3,116,0,180,3, -89,0,180,426,11, -1,867,0,183,1, --1,3,68,0,180, -3,103,0,180,3, -76,0,180,3,49, -0,180,3,111,0, -180,3,84,0,180, -3,57,0,180,3, -119,0,180,3,65, -0,180,3,100,0, -180,3,73,0,180, -3,108,0,180,3, -81,0,180,3,54, -0,180,3,116,0, -180,3,89,0,180, -427,11,1,501,0, -428,4,40,76,0, -65,0,78,0,68, -0,95,0,67,0, -79,0,76,0,76, -0,73,0,83,0, -73,0,79,0,78, -0,95,0,69,0, -86,0,69,0,78, -0,84,0,1,-1, -3,83,0,180,3, -56,0,180,3,118, -0,180,3,99,0, -180,3,72,0,180, -3,107,0,180,3, -80,0,180,3,53, -0,180,3,115,0, -180,3,88,0,180, -3,69,0,180,3, -104,0,180,3,77, -0,180,3,50,0, -180,3,112,0,180, -3,85,0,180,3, -120,0,180,3,66, -0,180,3,101,0, -180,3,74,0,180, -3,109,0,180,3, -82,0,180,3,55, -0,180,3,117,0, -180,3,90,0,180, -3,98,0,180,3, -71,0,180,3,106, -0,180,3,79,0, -180,3,52,0,180, -3,114,0,180,3, -87,0,180,3,122, -0,180,3,95,0, -180,3,68,0,180, -3,103,0,180,3, -76,0,180,3,49, -0,180,3,111,0, -180,3,84,0,180, -3,57,0,180,3, -119,0,180,3,65, -0,180,3,100,0, -180,3,73,0,180, -3,108,0,180,3, -81,0,180,3,54, -0,180,3,116,0, -180,3,89,0,180, -429,11,1,867,0, -183,1,-1,3,84, -0,180,3,57,0, -180,3,119,0,180, -3,65,0,180,3, -100,0,180,3,73, -0,180,3,108,0, -180,3,81,0,180, -3,54,0,180,3, -116,0,180,3,89, -0,180,430,11,1, -867,0,183,1,-1, -3,78,0,180,3, -51,0,180,3,113, -0,180,3,86,0, -180,3,121,0,180, -3,67,0,180,3, -102,0,180,3,75, -0,180,3,48,0, -180,3,110,0,180, -3,83,0,180,3, -56,0,180,3,118, -0,180,3,99,0, -180,3,72,0,180, -3,107,0,180,3, -80,0,180,3,53, -0,180,3,115,0, -180,3,88,0,180, -3,69,0,180,3, -104,0,180,3,77, -0,180,3,50,0, -180,3,112,0,180, -3,85,0,180,3, -120,0,180,3,66, -0,180,3,101,0, -180,3,74,0,180, -3,109,0,180,3, -82,0,180,3,55, -0,180,3,117,0, -180,3,90,0,180, -3,98,0,180,3, -71,0,180,3,106, -0,180,3,79,0, -180,3,52,0,180, -3,114,0,180,3, -87,0,180,3,122, -0,180,3,95,0, -180,3,68,0,180, -3,103,0,180,3, -76,0,180,3,49, -0,180,3,111,0, -180,3,84,0,180, -3,57,0,180,3, -119,0,180,3,65, -0,180,3,100,0, -180,3,73,0,180, -3,108,0,180,3, -81,0,180,3,54, -0,180,3,116,0, -180,3,89,0,180, -431,11,1,867,0, -183,1,-1,3,88, -0,180,3,69,0, -180,3,104,0,180, -3,77,0,180,3, -50,0,180,3,112, -0,180,3,85,0, -180,3,120,0,180, -3,66,0,180,3, -101,0,180,3,74, -0,180,3,109,0, -180,3,82,0,180, -3,55,0,180,3, -117,0,180,3,90, -0,180,3,98,0, -180,3,71,0,180, -3,106,0,180,3, -79,0,180,3,52, -0,180,3,114,0, -180,3,87,0,180, -3,122,0,180,3, -95,0,180,3,68, -0,180,3,103,0, -180,3,76,0,180, -3,49,0,180,3, -111,0,180,3,84, -0,180,3,57,0, -180,3,119,0,180, -3,65,0,180,3, -100,0,180,3,73, -0,180,3,108,0, -180,3,81,0,180, -3,54,0,180,3, -116,0,180,3,89, -0,180,432,11,1, -867,0,183,1,-1, -3,78,0,180,3, -51,0,180,3,113, -0,180,3,86,0, -180,3,121,0,180, -3,67,0,180,3, -102,0,180,3,75, -0,180,3,48,0, -180,3,110,0,180, -3,83,0,180,3, -56,0,180,3,118, -0,180,3,99,0, -180,3,72,0,180, -3,107,0,180,3, -80,0,180,3,53, -0,180,3,115,0, -180,3,88,0,180, -3,69,0,180,3, -104,0,180,3,77, -0,180,3,50,0, -180,3,112,0,180, -3,85,0,180,3, -120,0,180,3,66, -0,180,3,101,0, -180,3,74,0,180, -3,109,0,180,3, -82,0,180,3,55, -0,180,3,117,0, -180,3,90,0,180, -3,98,0,180,3, -71,0,180,3,106, -0,180,3,79,0, -180,3,52,0,180, -3,114,0,180,3, -87,0,180,3,122, -0,180,3,95,0, -180,3,68,0,180, -3,103,0,180,3, -76,0,180,3,49, -0,180,3,111,0, -180,3,84,0,180, -3,57,0,180,3, -119,0,180,3,65, -0,180,3,100,0, -180,3,73,0,180, -3,108,0,180,3, -81,0,180,3,54, -0,180,3,116,0, -180,3,89,0,180, -433,11,1,867,0, -183,1,-1,3,81, -0,180,3,54,0, -180,3,116,0,180, -3,89,0,180,434, -11,1,867,0,183, -1,-1,3,81,0, -180,3,54,0,180, -3,116,0,180,3, -89,0,180,435,11, -1,867,0,183,1, --1,3,84,0,180, -3,57,0,180,3, -119,0,180,3,65, -0,180,3,100,0, -180,3,73,0,180, -3,108,0,180,3, -81,0,180,3,54, -0,180,3,116,0, -180,3,89,0,180, -436,11,1,867,0, -183,1,-1,3,72, -0,180,3,107,0, -180,3,80,0,180, -3,53,0,180,3, -115,0,180,3,88, -0,180,3,69,0, -180,3,104,0,180, -3,77,0,180,3, -50,0,180,3,112, -0,180,3,85,0, -180,3,120,0,180, -3,66,0,180,3, -101,0,180,3,74, -0,180,3,109,0, -180,3,82,0,180, -3,55,0,180,3, -117,0,180,3,90, -0,180,3,98,0, -180,3,71,0,180, -3,106,0,180,3, -79,0,180,3,52, -0,180,3,114,0, -180,3,87,0,180, -3,122,0,180,3, -95,0,180,3,68, -0,180,3,103,0, -180,3,76,0,180, -3,49,0,180,3, -111,0,180,3,84, -0,180,3,57,0, -180,3,119,0,180, -3,65,0,180,3, -100,0,180,3,73, -0,180,3,108,0, -180,3,81,0,180, -3,54,0,180,3, -116,0,180,3,89, -0,180,437,11,1, -867,0,183,1,-1, -3,68,0,180,3, -103,0,180,3,76, -0,180,3,49,0, -180,3,111,0,180, -3,84,0,180,3, -57,0,180,3,119, -0,180,3,65,0, -180,3,100,0,180, -3,73,0,180,3, -108,0,180,3,81, -0,180,3,54,0, -180,3,116,0,180, -3,89,0,180,438, -11,1,867,0,183, -1,-1,3,73,0, -180,3,108,0,180, -3,81,0,180,3, -54,0,180,3,116, -0,180,3,89,0, -180,439,11,1,867, -0,183,1,-1,3, -83,0,180,3,56, -0,180,3,118,0, -180,3,99,0,180, -3,72,0,180,3, -107,0,180,3,80, -0,180,3,53,0, -180,3,115,0,180, -3,88,0,180,3, -69,0,180,3,104, -0,180,3,77,0, -180,3,50,0,180, -3,112,0,180,3, -85,0,180,3,120, -0,180,3,66,0, -180,3,101,0,180, -3,74,0,180,3, -109,0,180,3,82, -0,180,3,55,0, -180,3,117,0,180, -3,90,0,180,3, -98,0,180,3,71, -0,180,3,106,0, -180,3,79,0,180, -3,52,0,180,3, -114,0,180,3,87, -0,180,3,122,0, -180,3,95,0,180, -3,68,0,180,3, -103,0,180,3,76, -0,180,3,49,0, -180,3,111,0,180, -3,84,0,180,3, -57,0,180,3,119, -0,180,3,65,0, -180,3,100,0,180, -3,73,0,180,3, -108,0,180,3,81, -0,180,3,54,0, -180,3,116,0,180, -3,89,0,180,440, -11,1,867,0,183, -1,-1,3,70,0, -180,3,105,0,441, -12,1,42776,442,5, -63,3,97,0,180, -3,70,0,180,3, -105,0,180,3,78, -0,180,3,51,0, -180,3,113,0,180, -3,86,0,180,3, -121,0,180,3,67, -0,180,3,102,0, -180,3,75,0,180, -3,48,0,180,3, -110,0,443,12,1, -42848,444,5,63,3, -97,0,180,3,70, -0,180,3,105,0, -180,3,78,0,180, -3,51,0,180,3, -113,0,180,3,86, -0,180,3,121,0, -180,3,67,0,180, -3,102,0,180,3, -75,0,180,3,48, -0,180,3,110,0, -180,3,83,0,180, -3,56,0,180,3, -118,0,180,3,99, -0,180,3,72,0, -180,3,107,0,445, -12,1,42923,446,5, -63,3,97,0,180, -3,70,0,180,3, -105,0,180,3,78, -0,180,3,51,0, -180,3,113,0,180, -3,86,0,180,3, -121,0,180,3,67, -0,180,3,102,0, -180,3,75,0,180, -3,48,0,180,3, -110,0,180,3,83, -0,180,3,56,0, -180,3,118,0,180, -3,99,0,180,3, -72,0,180,3,107, -0,180,3,80,0, -180,3,53,0,180, -3,115,0,180,3, -88,0,180,3,69, -0,180,3,104,0, -180,3,77,0,180, -3,50,0,180,3, -112,0,180,3,85, -0,180,3,120,0, -180,3,66,0,180, -3,101,0,180,3, -74,0,180,3,109, -0,180,3,82,0, -180,3,55,0,180, -3,117,0,180,3, -90,0,180,3,98, -0,180,3,71,0, -180,3,106,0,180, -3,79,0,180,3, -52,0,180,3,114, -0,180,3,87,0, -180,3,122,0,180, -3,95,0,447,12, -1,42959,448,5,63, -3,97,0,180,3, -70,0,180,3,105, -0,180,3,78,0, -180,3,51,0,180, -3,113,0,180,3, -86,0,180,3,121, -0,180,3,67,0, -180,3,102,0,180, -3,75,0,180,3, -48,0,180,3,110, -0,180,3,83,0, -180,3,56,0,180, -3,118,0,180,3, -99,0,180,3,72, -0,180,3,107,0, -180,3,80,0,180, -3,53,0,180,3, -115,0,180,3,88, -0,180,3,69,0, -180,3,104,0,180, -3,77,0,180,3, -50,0,180,3,112, -0,180,3,85,0, -180,3,120,0,180, -3,66,0,180,3, -101,0,180,3,74, -0,180,3,109,0, -449,12,1,43040,450, -5,63,3,97,0, -180,3,70,0,180, -3,105,0,180,3, -78,0,180,3,51, -0,180,3,113,0, -180,3,86,0,180, -3,121,0,180,3, -67,0,180,3,102, -0,180,3,75,0, -180,3,48,0,180, -3,110,0,180,3, -83,0,180,3,56, -0,180,3,118,0, -180,3,99,0,180, -3,72,0,180,3, -107,0,180,3,80, -0,180,3,53,0, -180,3,115,0,180, -3,88,0,180,3, -69,0,180,3,104, -0,180,3,77,0, -180,3,50,0,180, -3,112,0,180,3, -85,0,180,3,120, -0,180,3,66,0, -180,3,101,0,451, -12,1,43120,452,5, -63,3,97,0,180, -3,70,0,180,3, -105,0,180,3,78, -0,180,3,51,0, -180,3,113,0,180, -3,86,0,180,3, -121,0,180,3,67, -0,180,3,102,0, -180,3,75,0,180, -3,48,0,180,3, -110,0,180,3,83, -0,180,3,56,0, -180,3,118,0,180, -3,99,0,180,3, -72,0,180,3,107, -0,180,3,80,0, -180,3,53,0,180, -3,115,0,453,12, -1,43196,454,5,63, -3,97,0,180,3, -70,0,180,3,105, -0,180,3,78,0, -180,3,51,0,180, -3,113,0,180,3, -86,0,180,3,121, -0,180,3,67,0, -180,3,102,0,180, -3,75,0,180,3, -48,0,180,3,110, -0,180,3,83,0, -180,3,56,0,180, -3,118,0,180,3, -99,0,180,3,72, -0,180,3,107,0, -180,3,80,0,180, -3,53,0,180,3, -115,0,455,12,1, -43272,456,5,63,3, -97,0,457,12,1, -43339,458,5,63,3, -97,0,180,3,70, -0,180,3,105,0, -180,3,78,0,180, -3,51,0,180,3, -113,0,180,3,86, -0,180,3,121,0, -180,3,67,0,180, -3,102,0,180,3, -75,0,180,3,48, -0,180,3,110,0, -180,3,83,0,180, -3,56,0,180,3, -118,0,180,3,99, -0,180,3,72,0, -180,3,107,0,180, -3,80,0,180,3, -53,0,180,3,115, -0,180,3,88,0, -180,3,69,0,180, -3,104,0,180,3, -77,0,180,3,50, -0,180,3,112,0, -180,3,85,0,180, -3,120,0,180,3, -66,0,180,3,101, -0,180,3,74,0, -180,3,109,0,180, -3,82,0,180,3, -55,0,180,3,117, -0,180,3,90,0, -180,3,98,0,180, -3,71,0,180,3, -106,0,180,3,79, -0,180,3,52,0, -180,3,114,0,180, -3,87,0,180,3, -122,0,180,3,95, -0,180,3,68,0, -180,3,103,0,459, -12,1,43426,460,5, -63,3,97,0,180, -3,70,0,180,3, -105,0,180,3,78, -0,180,3,51,0, -180,3,113,0,180, -3,86,0,180,3, -121,0,180,3,67, -0,180,3,102,0, -180,3,75,0,180, -3,48,0,180,3, -110,0,180,3,83, -0,180,3,56,0, -180,3,118,0,180, -3,99,0,180,3, -72,0,180,3,107, -0,180,3,80,0, -180,3,53,0,180, -3,115,0,180,3, -88,0,180,3,69, -0,180,3,104,0, -180,3,77,0,180, -3,50,0,180,3, -112,0,180,3,85, -0,180,3,120,0, -180,3,66,0,180, -3,101,0,461,12, -1,43506,462,5,63, -3,97,0,180,3, -70,0,180,3,105, -0,180,3,78,0, -180,3,51,0,180, -3,113,0,180,3, -86,0,180,3,121, -0,180,3,67,0, -180,3,102,0,180, -3,75,0,180,3, -48,0,180,3,110, -0,180,3,83,0, -180,3,56,0,180, -3,118,0,180,3, -99,0,180,3,72, -0,180,3,107,0, -180,3,80,0,180, -3,53,0,180,3, -115,0,180,3,88, -0,180,3,69,0, -180,3,104,0,180, -3,77,0,180,3, -50,0,180,3,112, -0,180,3,85,0, -180,3,120,0,180, -3,66,0,180,3, -101,0,180,3,74, -0,180,3,109,0, -180,3,82,0,180, -3,55,0,180,3, -117,0,180,3,90, -0,180,3,98,0, -180,3,71,0,180, -3,106,0,180,3, -79,0,180,3,52, -0,180,3,114,0, -180,3,87,0,180, -3,122,0,180,3, -95,0,180,3,68, -0,180,3,103,0, -180,3,76,0,180, -3,49,0,180,3, -111,0,180,3,84, -0,180,3,57,0, -180,3,119,0,180, -3,65,0,180,3, -100,0,180,3,73, -0,180,3,108,0, -180,3,81,0,180, -3,54,0,180,3, -116,0,180,3,89, -0,180,463,11,1, -565,0,464,4,36, -76,0,73,0,78, -0,75,0,95,0, -77,0,69,0,83, -0,83,0,65,0, -71,0,69,0,95, -0,69,0,86,0, -69,0,78,0,84, -0,1,-1,3,74, -0,180,3,109,0, -180,3,82,0,180, -3,55,0,180,3, -117,0,180,3,90, -0,180,3,98,0, -180,3,71,0,180, -3,106,0,180,3, -79,0,180,3,52, -0,180,3,114,0, -180,3,87,0,180, -3,122,0,180,3, -95,0,180,3,68, -0,180,3,103,0, -180,3,76,0,180, -3,49,0,180,3, -111,0,180,3,84, -0,180,3,57,0, -180,3,119,0,180, -3,65,0,180,3, -100,0,180,3,73, -0,180,3,108,0, -180,3,81,0,180, -3,54,0,180,3, -116,0,180,3,89, -0,180,465,11,1, -867,0,183,1,-1, -3,76,0,180,3, -49,0,180,3,111, -0,180,3,84,0, -180,3,57,0,180, -3,119,0,180,3, -65,0,180,3,100, -0,180,3,73,0, -180,3,108,0,180, -3,81,0,180,3, -54,0,180,3,116, -0,180,3,89,0, -180,466,11,1,867, -0,183,1,-1,3, -70,0,180,3,105, -0,180,3,78,0, -180,3,51,0,180, -3,113,0,180,3, -86,0,180,3,121, -0,180,3,67,0, -180,3,102,0,180, -3,75,0,180,3, -48,0,180,3,110, -0,180,3,83,0, -180,3,56,0,180, -3,118,0,180,3, -99,0,180,3,72, -0,180,3,107,0, -180,3,80,0,180, -3,53,0,180,3, -115,0,180,3,88, -0,180,3,69,0, -180,3,104,0,180, -3,77,0,180,3, -50,0,180,3,112, -0,180,3,85,0, -180,3,120,0,180, -3,66,0,180,3, -101,0,180,3,74, -0,180,3,109,0, -180,3,82,0,180, -3,55,0,180,3, -117,0,180,3,90, -0,180,3,98,0, -180,3,71,0,180, -3,106,0,180,3, -79,0,180,3,52, -0,180,3,114,0, -180,3,87,0,180, -3,122,0,180,3, -95,0,180,3,68, -0,180,3,103,0, -180,3,76,0,180, -3,49,0,180,3, -111,0,180,3,84, -0,180,3,57,0, -180,3,119,0,180, -3,65,0,180,3, -100,0,180,3,73, -0,180,3,108,0, -180,3,81,0,180, -3,54,0,180,3, -116,0,180,3,89, -0,180,467,11,1, -867,0,183,1,-1, -3,88,0,180,3, -69,0,180,3,104, -0,180,3,77,0, -180,3,50,0,180, -3,112,0,180,3, -85,0,180,3,120, -0,180,3,66,0, -180,3,101,0,180, -3,74,0,180,3, -109,0,180,3,82, -0,180,3,55,0, -180,3,117,0,180, -3,90,0,180,3, -98,0,180,3,71, -0,180,3,106,0, -180,3,79,0,180, -3,52,0,180,3, -114,0,180,3,87, -0,180,3,122,0, -180,3,95,0,180, -3,68,0,180,3, -103,0,180,3,76, -0,180,3,49,0, -180,3,111,0,180, -3,84,0,180,3, -57,0,180,3,119, -0,180,3,65,0, -180,3,100,0,180, -3,73,0,180,3, -108,0,180,3,81, -0,180,3,54,0, -180,3,116,0,180, -3,89,0,180,468, -11,1,867,0,183, -1,-1,3,88,0, -180,3,69,0,180, -3,104,0,180,3, -77,0,180,3,50, -0,180,3,112,0, -180,3,85,0,180, -3,120,0,180,3, -66,0,180,3,101, -0,180,3,74,0, -180,3,109,0,180, -3,82,0,180,3, -55,0,180,3,117, -0,180,3,90,0, -180,3,98,0,180, -3,71,0,180,3, -106,0,180,3,79, -0,180,3,52,0, -180,3,114,0,180, -3,87,0,180,3, -122,0,180,3,95, -0,180,3,68,0, -180,3,103,0,180, -3,76,0,180,3, -49,0,180,3,111, -0,180,3,84,0, -180,3,57,0,180, -3,119,0,180,3, -65,0,180,3,100, -0,180,3,73,0, -180,3,108,0,180, -3,81,0,180,3, -54,0,180,3,116, -0,180,3,89,0, -180,469,11,1,867, -0,183,1,-1,3, -74,0,180,3,109, -0,180,3,82,0, -180,3,55,0,180, -3,117,0,180,3, -90,0,180,3,98, -0,180,3,71,0, -180,3,106,0,180, -3,79,0,180,3, -52,0,180,3,114, -0,180,3,87,0, -180,3,122,0,180, -3,95,0,180,3, -68,0,180,3,103, -0,180,3,76,0, -180,3,49,0,180, -3,111,0,180,3, -84,0,180,3,57, -0,180,3,119,0, -180,3,65,0,180, -3,100,0,180,3, -73,0,180,3,108, -0,180,3,81,0, -180,3,54,0,180, -3,116,0,180,3, -89,0,180,470,11, -1,867,0,183,1, --1,3,82,0,180, -3,55,0,180,3, -117,0,180,3,90, -0,180,3,98,0, -180,3,71,0,180, -3,106,0,180,3, -79,0,180,3,52, -0,180,3,114,0, -180,3,87,0,180, -3,122,0,180,3, -95,0,180,3,68, -0,180,3,103,0, -180,3,76,0,180, -3,49,0,180,3, -111,0,180,3,84, -0,180,3,57,0, -180,3,119,0,180, -3,65,0,180,3, -100,0,180,3,73, -0,180,3,108,0, -180,3,81,0,180, -3,54,0,180,3, -116,0,180,3,89, -0,180,471,11,1, -867,0,183,1,-1, -3,68,0,180,3, -103,0,180,3,76, -0,180,3,49,0, -180,3,111,0,180, -3,84,0,180,3, -57,0,180,3,119, -0,180,3,65,0, -180,3,100,0,180, -3,73,0,180,3, -108,0,180,3,81, -0,180,3,54,0, -180,3,116,0,180, -3,89,0,180,472, -11,1,867,0,183, -1,-1,3,80,0, -180,3,53,0,180, -3,115,0,180,3, -88,0,180,3,69, -0,180,3,104,0, -180,3,77,0,180, -3,50,0,180,3, -112,0,180,3,85, -0,180,3,120,0, -180,3,66,0,180, -3,101,0,180,3, -74,0,180,3,109, -0,180,3,82,0, -180,3,55,0,180, -3,117,0,180,3, -90,0,180,3,98, -0,180,3,71,0, -180,3,106,0,180, -3,79,0,180,3, -52,0,180,3,114, -0,180,3,87,0, -180,3,122,0,180, -3,95,0,180,3, -68,0,180,3,103, -0,180,3,76,0, -180,3,49,0,180, -3,111,0,180,3, -84,0,180,3,57, -0,180,3,119,0, -180,3,65,0,180, -3,100,0,180,3, -73,0,180,3,108, -0,180,3,81,0, -180,3,54,0,180, -3,116,0,180,3, -89,0,180,473,11, -1,867,0,183,1, --1,3,83,0,180, -3,56,0,180,3, -118,0,180,3,99, -0,180,3,72,0, -180,3,107,0,180, -3,80,0,180,3, -53,0,180,3,115, -0,474,12,1,44052, -475,5,63,3,97, -0,180,3,70,0, -180,3,105,0,180, -3,78,0,180,3, -51,0,180,3,113, -0,180,3,86,0, -180,3,121,0,180, -3,67,0,180,3, -102,0,180,3,75, -0,180,3,48,0, -180,3,110,0,180, -3,83,0,180,3, -56,0,180,3,118, -0,180,3,99,0, -180,3,72,0,180, -3,107,0,180,3, -80,0,180,3,53, -0,180,3,115,0, -180,3,88,0,180, -3,69,0,180,3, -104,0,180,3,77, -0,180,3,50,0, -180,3,112,0,180, -3,85,0,180,3, -120,0,180,3,66, -0,180,3,101,0, -180,3,74,0,180, -3,109,0,180,3, -82,0,180,3,55, -0,180,3,117,0, -180,3,90,0,180, -3,98,0,180,3, -71,0,180,3,106, -0,180,3,79,0, -180,3,52,0,180, -3,114,0,180,3, -87,0,180,3,122, -0,180,3,95,0, -180,3,68,0,180, -3,103,0,180,3, -76,0,180,3,49, -0,180,3,111,0, -180,3,84,0,180, -3,57,0,180,3, -119,0,180,3,65, -0,180,3,100,0, -180,3,73,0,180, -3,108,0,180,3, -81,0,180,3,54, -0,180,3,116,0, -476,12,1,44145,477, -5,63,3,97,0, -180,3,70,0,180, -3,105,0,180,3, -78,0,180,3,51, -0,180,3,113,0, -180,3,86,0,180, -3,121,0,180,3, -67,0,180,3,102, -0,180,3,75,0, -180,3,48,0,180, -3,110,0,180,3, -83,0,180,3,56, -0,180,3,118,0, -180,3,99,0,180, -3,72,0,180,3, -107,0,180,3,80, -0,180,3,53,0, -180,3,115,0,180, -3,88,0,180,3, -69,0,180,3,104, -0,180,3,77,0, -180,3,50,0,180, -3,112,0,180,3, -85,0,180,3,120, -0,180,3,66,0, -180,3,101,0,478, -12,1,44225,479,5, -63,3,97,0,180, -3,70,0,180,3, -105,0,180,3,78, -0,180,3,51,0, -180,3,113,0,180, -3,86,0,180,3, -121,0,180,3,67, -0,180,3,102,0, -180,3,75,0,180, -3,48,0,180,3, -110,0,480,12,1, -44297,481,5,63,3, -97,0,180,3,70, -0,180,3,105,0, -180,3,78,0,180, -3,51,0,180,3, -113,0,180,3,86, -0,180,3,121,0, -180,3,67,0,180, -3,102,0,180,3, -75,0,180,3,48, -0,180,3,110,0, -180,3,83,0,180, -3,56,0,180,3, -118,0,180,3,99, -0,180,3,72,0, -180,3,107,0,180, -3,80,0,180,3, -53,0,180,3,115, -0,180,3,88,0, -180,3,69,0,180, -3,104,0,180,3, -77,0,180,3,50, -0,180,3,112,0, -180,3,85,0,180, -3,120,0,180,3, -66,0,180,3,101, -0,180,3,74,0, -180,3,109,0,180, -3,82,0,180,3, -55,0,180,3,117, -0,180,3,90,0, -180,3,98,0,180, -3,71,0,180,3, -106,0,180,3,79, -0,180,3,52,0, -180,3,114,0,180, -3,87,0,180,3, -122,0,180,3,95, -0,180,3,68,0, -180,3,103,0,180, -3,76,0,180,3, -49,0,180,3,111, -0,180,3,84,0, -180,3,57,0,180, -3,119,0,180,3, -65,0,180,3,100, -0,180,3,73,0, -180,3,108,0,180, -3,81,0,180,3, -54,0,180,3,116, -0,180,3,89,0, -180,482,11,1,581, -0,483,4,24,76, -0,73,0,83,0, -84,0,69,0,78, -0,95,0,69,0, -86,0,69,0,78, -0,84,0,1,-1, -3,83,0,180,3, -56,0,180,3,118, -0,180,3,99,0, -180,3,72,0,180, -3,107,0,180,3, -80,0,180,3,53, -0,180,3,115,0, -180,3,88,0,180, -3,69,0,180,3, -104,0,180,3,77, -0,180,3,50,0, -180,3,112,0,180, -3,85,0,180,3, -120,0,180,3,66, -0,180,3,101,0, -180,3,74,0,180, -3,109,0,180,3, -82,0,180,3,55, -0,180,3,117,0, -180,3,90,0,180, -3,98,0,180,3, -71,0,180,3,106, -0,180,3,79,0, -180,3,52,0,180, -3,114,0,180,3, -87,0,180,3,122, -0,180,3,95,0, -180,3,68,0,180, -3,103,0,180,3, -76,0,180,3,49, -0,180,3,111,0, -180,3,84,0,180, -3,57,0,180,3, -119,0,180,3,65, -0,180,3,100,0, -180,3,73,0,180, -3,108,0,180,3, -81,0,180,3,54, -0,180,3,116,0, -180,3,89,0,180, -484,11,1,867,0, -183,1,-1,3,74, -0,180,3,109,0, -180,3,82,0,180, -3,55,0,180,3, -117,0,180,3,90, -0,180,3,98,0, -180,3,71,0,180, -3,106,0,180,3, -79,0,180,3,52, -0,180,3,114,0, -180,3,87,0,180, -3,122,0,180,3, -95,0,180,3,68, -0,180,3,103,0, -180,3,76,0,180, -3,49,0,180,3, -111,0,180,3,84, -0,180,3,57,0, -180,3,119,0,180, -3,65,0,180,3, -100,0,180,3,73, -0,180,3,108,0, -180,3,81,0,180, -3,54,0,180,3, -116,0,180,3,89, -0,180,485,11,1, -342,0,486,4,18, -76,0,73,0,83, -0,84,0,95,0, -84,0,89,0,80, -0,69,0,1,-1, -3,89,0,180,487, -11,1,867,0,183, -1,-1,3,88,0, -180,3,69,0,180, -3,104,0,180,3, -77,0,180,3,50, -0,180,3,112,0, -180,3,85,0,180, -3,120,0,180,3, -66,0,180,3,101, -0,180,3,74,0, -180,3,109,0,180, -3,82,0,180,3, -55,0,180,3,117, -0,180,3,90,0, -180,3,98,0,180, -3,71,0,180,3, -106,0,180,3,79, -0,180,3,52,0, -180,3,114,0,180, -3,87,0,180,3, -122,0,180,3,95, -0,180,3,68,0, -180,3,103,0,180, -3,76,0,180,3, -49,0,180,3,111, -0,180,3,84,0, -180,3,57,0,180, -3,119,0,180,3, -65,0,180,3,100, -0,180,3,73,0, -180,3,108,0,180, -3,81,0,180,3, -54,0,180,3,116, -0,180,3,89,0, -180,488,11,1,867, -0,183,1,-1,3, -78,0,180,3,51, -0,180,3,113,0, -180,3,86,0,180, -3,121,0,180,3, -67,0,180,3,102, -0,180,3,75,0, -180,3,48,0,180, -3,110,0,180,3, -83,0,180,3,56, -0,180,3,118,0, -180,3,99,0,180, -3,72,0,180,3, -107,0,180,3,80, -0,180,3,53,0, -180,3,115,0,180, -3,88,0,180,3, -69,0,180,3,104, -0,180,3,77,0, -180,3,50,0,180, -3,112,0,180,3, -85,0,180,3,120, -0,180,3,66,0, -180,3,101,0,180, -3,74,0,180,3, -109,0,180,3,82, -0,180,3,55,0, -180,3,117,0,180, -3,90,0,180,3, -98,0,180,3,71, -0,180,3,106,0, -180,3,79,0,180, -3,52,0,180,3, -114,0,180,3,87, -0,180,3,122,0, -180,3,95,0,180, -3,68,0,180,3, -103,0,180,3,76, -0,180,3,49,0, -180,3,111,0,180, -3,84,0,180,3, -57,0,180,3,119, -0,180,3,65,0, -180,3,100,0,180, -3,73,0,180,3, -108,0,180,3,81, -0,180,3,54,0, -180,3,116,0,180, -3,89,0,180,489, -11,1,867,0,183, -1,-1,3,68,0, -178,3,105,0,490, -12,1,12205,491,5, -63,3,97,0,180, -3,70,0,180,3, -105,0,180,3,78, -0,180,3,51,0, -180,3,113,0,180, -3,86,0,180,3, -121,0,180,3,67, -0,180,3,102,0, -492,12,1,12276,493, -5,63,3,97,0, -180,3,70,0,180, -3,105,0,180,3, -78,0,180,3,51, -0,180,3,113,0, -180,3,86,0,180, -3,121,0,180,3, -67,0,180,3,102, -0,180,3,75,0, -180,3,48,0,180, -3,110,0,180,3, -83,0,180,3,56, -0,180,3,118,0, -180,3,99,0,180, -3,72,0,180,3, -107,0,180,3,80, -0,180,3,53,0, -180,3,115,0,180, -3,88,0,180,3, -69,0,180,3,104, -0,180,3,77,0, -180,3,50,0,180, -3,112,0,180,3, -85,0,180,3,120, -0,180,3,66,0, -180,3,101,0,180, -3,74,0,180,3, -109,0,180,3,82, -0,180,3,55,0, -180,3,117,0,180, -3,90,0,180,3, -98,0,180,3,71, -0,180,3,106,0, -180,3,79,0,180, -3,52,0,180,3, -114,0,180,3,87, -0,180,3,122,0, -180,3,95,0,180, -3,68,0,180,3, -103,0,180,3,76, -0,180,3,49,0, -180,3,111,0,180, -3,84,0,180,3, -57,0,180,3,119, -0,180,3,65,0, -180,3,100,0,180, -3,73,0,180,3, -108,0,180,3,81, -0,180,3,54,0, -180,3,116,0,180, -3,89,0,180,494, -11,1,209,0,495, -4,4,73,0,70, -0,1,-1,3,75, -0,180,3,48,0, -180,3,110,0,496, -12,1,12397,497,5, -63,3,97,0,180, -3,70,0,180,3, -105,0,180,3,78, -0,180,3,51,0, -180,3,113,0,180, -3,86,0,180,3, -121,0,180,3,67, -0,180,3,102,0, -180,3,75,0,180, -3,48,0,180,3, -110,0,180,3,83, -0,180,3,56,0, -180,3,118,0,180, -3,99,0,180,3, -72,0,180,3,107, -0,180,3,80,0, -180,3,53,0,180, -3,115,0,180,3, -88,0,180,3,69, -0,180,3,104,0, -180,3,77,0,180, -3,50,0,180,3, -112,0,180,3,85, -0,180,3,120,0, -180,3,66,0,180, -3,101,0,180,3, -74,0,180,3,109, -0,180,3,82,0, -180,3,55,0,180, -3,117,0,180,3, -90,0,180,3,98, -0,180,3,71,0, -180,3,106,0,180, -3,79,0,180,3, -52,0,180,3,114, -0,180,3,87,0, -180,3,122,0,180, -3,95,0,180,3, -68,0,180,3,103, -0,180,3,76,0, -180,3,49,0,180, -3,111,0,180,3, -84,0,180,3,57, -0,180,3,119,0, -180,3,65,0,180, -3,100,0,180,3, -73,0,180,3,108, -0,180,3,81,0, -180,3,54,0,180, -3,116,0,498,12, -1,12490,499,5,63, -3,97,0,180,3, -70,0,180,3,105, -0,180,3,78,0, -180,3,51,0,180, -3,113,0,180,3, -86,0,180,3,121, -0,180,3,67,0, -180,3,102,0,180, -3,75,0,180,3, -48,0,180,3,110, -0,180,3,83,0, -180,3,56,0,180, -3,118,0,180,3, -99,0,180,3,72, -0,180,3,107,0, -180,3,80,0,180, -3,53,0,180,3, -115,0,180,3,88, -0,180,3,69,0, -180,3,104,0,180, -3,77,0,180,3, -50,0,180,3,112, -0,180,3,85,0, -180,3,120,0,180, -3,66,0,180,3, -101,0,500,12,1, -12570,501,5,63,3, -97,0,180,3,70, -0,180,3,105,0, -180,3,78,0,180, -3,51,0,180,3, -113,0,180,3,86, -0,180,3,121,0, -180,3,67,0,180, -3,102,0,180,3, -75,0,180,3,48, -0,180,3,110,0, -180,3,83,0,180, -3,56,0,180,3, -118,0,180,3,99, -0,180,3,72,0, -180,3,107,0,180, -3,80,0,180,3, -53,0,180,3,115, -0,180,3,88,0, -180,3,69,0,180, -3,104,0,180,3, -77,0,180,3,50, -0,180,3,112,0, -180,3,85,0,180, -3,120,0,180,3, -66,0,180,3,101, -0,180,3,74,0, -180,3,109,0,180, -3,82,0,180,3, -55,0,180,3,117, -0,180,3,90,0, -180,3,98,0,180, -3,71,0,180,3, -106,0,180,3,79, -0,180,3,52,0, -180,3,114,0,180, -3,87,0,180,3, -122,0,180,3,95, -0,180,3,68,0, -180,3,103,0,502, -12,1,12657,503,5, -63,3,97,0,180, -3,70,0,180,3, -105,0,180,3,78, -0,180,3,51,0, -180,3,113,0,180, -3,86,0,180,3, -121,0,180,3,67, -0,180,3,102,0, -180,3,75,0,180, -3,48,0,180,3, -110,0,180,3,83, -0,180,3,56,0, -180,3,118,0,180, -3,99,0,180,3, -72,0,180,3,107, -0,180,3,80,0, -180,3,53,0,180, -3,115,0,180,3, -88,0,180,3,69, -0,180,3,104,0, -180,3,77,0,180, -3,50,0,180,3, -112,0,180,3,85, -0,180,3,120,0, -180,3,66,0,180, -3,101,0,504,12, -1,12737,505,5,63, -3,97,0,180,3, -70,0,180,3,105, -0,180,3,78,0, -180,3,51,0,180, -3,113,0,180,3, -86,0,180,3,121, -0,180,3,67,0, -180,3,102,0,180, -3,75,0,180,3, -48,0,180,3,110, -0,180,3,83,0, -180,3,56,0,180, -3,118,0,180,3, -99,0,180,3,72, -0,180,3,107,0, -180,3,80,0,180, -3,53,0,180,3, -115,0,180,3,88, -0,180,3,69,0, -180,3,104,0,180, -3,77,0,180,3, -50,0,180,3,112, -0,180,3,85,0, -180,3,120,0,180, -3,66,0,180,3, -101,0,180,3,74, -0,180,3,109,0, -180,3,82,0,180, -3,55,0,180,3, -117,0,180,3,90, -0,180,3,98,0, -180,3,71,0,180, -3,106,0,180,3, -79,0,180,3,52, -0,180,3,114,0, -506,12,1,12822,507, -5,63,3,97,0, -180,3,70,0,180, -3,105,0,180,3, -78,0,180,3,51, -0,180,3,113,0, -180,3,86,0,180, -3,121,0,180,3, -67,0,180,3,102, -0,180,3,75,0, -180,3,48,0,180, -3,110,0,180,3, -83,0,180,3,56, -0,180,3,118,0, -180,3,99,0,180, -3,72,0,180,3, -107,0,180,3,80, -0,180,3,53,0, -180,3,115,0,180, -3,88,0,180,3, -69,0,180,3,104, -0,180,3,77,0, -180,3,50,0,180, -3,112,0,180,3, -85,0,180,3,120, -0,180,3,66,0, -180,3,101,0,180, -3,74,0,180,3, -109,0,180,3,82, -0,180,3,55,0, -180,3,117,0,180, -3,90,0,180,3, -98,0,180,3,71, -0,180,3,106,0, -180,3,79,0,180, -3,52,0,180,3, -114,0,180,3,87, -0,180,3,122,0, -180,3,95,0,180, -3,68,0,180,3, -103,0,180,3,76, -0,180,3,49,0, -180,3,111,0,180, -3,84,0,180,3, -57,0,180,3,119, -0,180,3,65,0, -180,3,100,0,180, -3,73,0,180,3, -108,0,180,3,81, -0,180,3,54,0, -180,3,116,0,180, -3,89,0,180,508, -11,1,283,0,509, -4,24,73,0,78, -0,84,0,69,0, -71,0,69,0,82, -0,95,0,84,0, -89,0,80,0,69, -0,1,-1,3,87, -0,180,3,122,0, -180,3,95,0,180, -3,68,0,180,3, -103,0,180,3,76, -0,180,3,49,0, -180,3,111,0,180, -3,84,0,180,3, -57,0,180,3,119, -0,180,3,65,0, -180,3,100,0,180, -3,73,0,180,3, -108,0,180,3,81, -0,180,3,54,0, -180,3,116,0,180, -3,89,0,180,510, -11,1,867,0,183, -1,-1,3,74,0, -180,3,109,0,180, -3,82,0,180,3, -55,0,180,3,117, -0,180,3,90,0, -180,3,98,0,180, -3,71,0,180,3, -106,0,180,3,79, -0,180,3,52,0, -180,3,114,0,180, -3,87,0,180,3, -122,0,180,3,95, -0,180,3,68,0, -180,3,103,0,180, -3,76,0,180,3, -49,0,180,3,111, -0,180,3,84,0, -180,3,57,0,180, -3,119,0,180,3, -65,0,180,3,100, -0,180,3,73,0, -180,3,108,0,180, -3,81,0,180,3, -54,0,180,3,116, -0,180,3,89,0, -180,511,11,1,867, -0,183,1,-1,3, -76,0,180,3,49, -0,180,3,111,0, -180,3,84,0,180, -3,57,0,180,3, -119,0,180,3,65, -0,180,3,100,0, -180,3,73,0,180, -3,108,0,180,3, -81,0,180,3,54, -0,180,3,116,0, -180,3,89,0,180, -512,11,1,867,0, -183,1,-1,3,74, -0,180,3,109,0, -180,3,82,0,180, -3,55,0,180,3, -117,0,180,3,90, -0,180,3,98,0, -180,3,71,0,180, -3,106,0,180,3, -79,0,180,3,52, -0,180,3,114,0, -180,3,87,0,180, -3,122,0,180,3, -95,0,180,3,68, -0,180,3,103,0, -180,3,76,0,180, -3,49,0,180,3, -111,0,180,3,84, -0,180,3,57,0, -180,3,119,0,180, -3,65,0,180,3, -100,0,180,3,73, -0,180,3,108,0, -180,3,81,0,180, -3,54,0,180,3, -116,0,180,3,89, -0,180,513,11,1, -867,0,183,1,-1, -3,89,0,180,514, -11,1,867,0,183, -1,-1,3,83,0, -180,3,56,0,180, -3,118,0,180,3, -99,0,180,3,72, -0,180,3,107,0, -180,3,80,0,180, -3,53,0,180,3, -115,0,180,3,88, -0,180,3,69,0, -180,3,104,0,180, -3,77,0,180,3, -50,0,180,3,112, -0,180,3,85,0, -180,3,120,0,180, -3,66,0,180,3, -101,0,180,3,74, -0,180,3,109,0, -180,3,82,0,180, -3,55,0,180,3, -117,0,180,3,90, -0,180,3,98,0, -180,3,71,0,180, -3,106,0,180,3, -79,0,180,3,52, -0,180,3,114,0, -180,3,87,0,180, -3,122,0,180,3, -95,0,180,3,68, -0,180,3,103,0, -180,3,76,0,180, -3,49,0,180,3, -111,0,180,3,84, -0,180,3,57,0, -180,3,119,0,180, -3,65,0,180,3, -100,0,180,3,73, -0,180,3,108,0, -180,3,81,0,180, -3,54,0,180,3, -116,0,180,3,89, -0,180,515,11,1, -867,0,183,1,-1, -3,65,0,178,3, -102,0,516,12,1, -13168,517,5,63,3, -97,0,180,3,70, -0,180,3,105,0, -180,3,78,0,180, -3,51,0,180,3, -113,0,180,3,86, -0,180,3,121,0, -180,3,67,0,180, -3,102,0,180,3, -75,0,180,3,48, -0,180,3,110,0, -180,3,83,0,180, -3,56,0,180,3, -118,0,180,3,99, -0,180,3,72,0, -180,3,107,0,180, -3,80,0,180,3, -53,0,180,3,115, -0,180,3,88,0, -180,3,69,0,180, -3,104,0,180,3, -77,0,180,3,50, -0,180,3,112,0, -180,3,85,0,180, -3,120,0,180,3, -66,0,180,3,101, -0,180,3,74,0, -180,3,109,0,180, -3,82,0,180,3, -55,0,180,3,117, -0,180,3,90,0, -180,3,98,0,180, -3,71,0,180,3, -106,0,180,3,79, -0,180,3,52,0, -180,3,114,0,180, -3,87,0,180,3, -122,0,180,3,95, -0,180,3,68,0, -180,3,103,0,180, -3,76,0,180,3, -49,0,180,3,111, -0,518,12,1,13256, -519,5,63,3,97, -0,180,3,70,0, -180,3,105,0,180, -3,78,0,180,3, -51,0,180,3,113, -0,180,3,86,0, -180,3,121,0,180, -3,67,0,180,3, -102,0,180,3,75, -0,180,3,48,0, -180,3,110,0,180, -3,83,0,180,3, -56,0,180,3,118, -0,180,3,99,0, -180,3,72,0,180, -3,107,0,180,3, -80,0,180,3,53, -0,180,3,115,0, -180,3,88,0,180, -3,69,0,180,3, -104,0,180,3,77, -0,180,3,50,0, -180,3,112,0,180, -3,85,0,180,3, -120,0,180,3,66, -0,180,3,101,0, -180,3,74,0,180, -3,109,0,180,3, -82,0,180,3,55, -0,180,3,117,0, -180,3,90,0,180, -3,98,0,180,3, -71,0,180,3,106, -0,180,3,79,0, -180,3,52,0,180, -3,114,0,520,12, -1,13341,521,5,63, -3,97,0,180,3, -70,0,180,3,105, -0,180,3,78,0, -180,3,51,0,180, -3,113,0,180,3, -86,0,180,3,121, -0,180,3,67,0, -180,3,102,0,180, -3,75,0,180,3, -48,0,180,3,110, -0,180,3,83,0, -180,3,56,0,180, -3,118,0,180,3, -99,0,180,3,72, -0,180,3,107,0, -180,3,80,0,180, -3,53,0,180,3, -115,0,180,3,88, -0,180,3,69,0, -180,3,104,0,180, -3,77,0,180,3, -50,0,180,3,112, -0,180,3,85,0, -180,3,120,0,180, -3,66,0,180,3, -101,0,180,3,74, -0,180,3,109,0, -180,3,82,0,180, -3,55,0,180,3, -117,0,180,3,90, -0,180,3,98,0, -180,3,71,0,180, -3,106,0,180,3, -79,0,180,3,52, -0,180,3,114,0, -180,3,87,0,180, -3,122,0,180,3, -95,0,180,3,68, -0,180,3,103,0, -180,3,76,0,180, -3,49,0,180,3, -111,0,180,3,84, -0,180,3,57,0, -180,3,119,0,180, -3,65,0,180,3, -100,0,180,3,73, -0,180,3,108,0, -180,3,81,0,180, -3,54,0,180,3, -116,0,180,3,89, -0,180,522,11,1, -238,0,523,4,6, -70,0,79,0,82, -0,1,-1,3,87, -0,180,3,122,0, -180,3,95,0,180, -3,68,0,180,3, -103,0,180,3,76, -0,180,3,49,0, -180,3,111,0,180, -3,84,0,180,3, -57,0,180,3,119, -0,180,3,65,0, -180,3,100,0,180, -3,73,0,180,3, -108,0,180,3,81, -0,180,3,54,0, -180,3,116,0,180, -3,89,0,180,524, -11,1,867,0,183, -1,-1,3,84,0, -180,3,57,0,180, -3,119,0,180,3, -65,0,180,3,100, -0,180,3,73,0, -180,3,108,0,525, -12,1,13499,526,5, -63,3,97,0,180, -3,70,0,180,3, -105,0,180,3,78, -0,180,3,51,0, -180,3,113,0,180, -3,86,0,180,3, -121,0,180,3,67, -0,180,3,102,0, -180,3,75,0,180, -3,48,0,180,3, -110,0,180,3,83, -0,180,3,56,0, -180,3,118,0,180, -3,99,0,180,3, -72,0,180,3,107, -0,180,3,80,0, -180,3,53,0,180, -3,115,0,180,3, -88,0,180,3,69, -0,180,3,104,0, -180,3,77,0,180, -3,50,0,180,3, -112,0,180,3,85, -0,180,3,120,0, -180,3,66,0,180, -3,101,0,180,3, -74,0,180,3,109, -0,180,3,82,0, -180,3,55,0,180, -3,117,0,180,3, -90,0,180,3,98, -0,180,3,71,0, -180,3,106,0,180, -3,79,0,180,3, -52,0,180,3,114, -0,180,3,87,0, -180,3,122,0,180, -3,95,0,180,3, -68,0,180,3,103, -0,180,3,76,0, -180,3,49,0,180, -3,111,0,527,12, -1,13587,528,5,63, -3,97,0,529,12, -1,13654,530,5,63, -3,97,0,180,3, -70,0,180,3,105, -0,180,3,78,0, -180,3,51,0,180, -3,113,0,180,3, -86,0,180,3,121, -0,180,3,67,0, -180,3,102,0,180, -3,75,0,180,3, -48,0,180,3,110, -0,180,3,83,0, -180,3,56,0,180, -3,118,0,180,3, -99,0,180,3,72, -0,180,3,107,0, -180,3,80,0,180, -3,53,0,180,3, -115,0,180,3,88, -0,180,3,69,0, -180,3,104,0,180, -3,77,0,180,3, -50,0,180,3,112, -0,180,3,85,0, -180,3,120,0,180, -3,66,0,180,3, -101,0,180,3,74, -0,180,3,109,0, -180,3,82,0,180, -3,55,0,180,3, -117,0,180,3,90, -0,180,3,98,0, -180,3,71,0,180, -3,106,0,180,3, -79,0,180,3,52, -0,180,3,114,0, -180,3,87,0,180, -3,122,0,180,3, -95,0,180,3,68, -0,180,3,103,0, -180,3,76,0,180, -3,49,0,180,3, -111,0,180,3,84, -0,180,3,57,0, -180,3,119,0,180, -3,65,0,180,3, -100,0,180,3,73, -0,180,3,108,0, -180,3,81,0,180, -3,54,0,180,3, -116,0,531,12,1, -13747,532,5,63,3, -97,0,180,3,70, -0,180,3,105,0, -180,3,78,0,180, -3,51,0,180,3, -113,0,180,3,86, -0,180,3,121,0, -180,3,67,0,180, -3,102,0,180,3, -75,0,180,3,48, -0,180,3,110,0, -180,3,83,0,180, -3,56,0,180,3, -118,0,180,3,99, -0,180,3,72,0, -180,3,107,0,180, -3,80,0,180,3, -53,0,180,3,115, -0,180,3,88,0, -180,3,69,0,180, -3,104,0,180,3, -77,0,180,3,50, -0,180,3,112,0, -180,3,85,0,180, -3,120,0,180,3, -66,0,180,3,101, -0,180,3,74,0, -180,3,109,0,180, -3,82,0,180,3, -55,0,180,3,117, -0,180,3,90,0, -180,3,98,0,180, -3,71,0,180,3, -106,0,180,3,79, -0,180,3,52,0, -180,3,114,0,180, -3,87,0,180,3, -122,0,180,3,95, -0,180,3,68,0, -180,3,103,0,180, -3,76,0,180,3, -49,0,180,3,111, -0,180,3,84,0, -180,3,57,0,180, -3,119,0,180,3, -65,0,180,3,100, -0,180,3,73,0, -180,3,108,0,180, -3,81,0,180,3, -54,0,180,3,116, -0,180,3,89,0, -180,533,11,1,294, -0,534,4,20,70, -0,76,0,79,0, -65,0,84,0,95, -0,84,0,89,0, -80,0,69,0,1, --1,3,89,0,180, -535,11,1,867,0, -183,1,-1,3,70, -0,180,3,105,0, -180,3,78,0,180, -3,51,0,180,3, -113,0,180,3,86, -0,180,3,121,0, -180,3,67,0,180, -3,102,0,180,3, -75,0,180,3,48, -0,180,3,110,0, -180,3,83,0,180, -3,56,0,180,3, -118,0,180,3,99, -0,180,3,72,0, -180,3,107,0,180, -3,80,0,180,3, -53,0,180,3,115, -0,180,3,88,0, -180,3,69,0,180, -3,104,0,180,3, -77,0,180,3,50, -0,180,3,112,0, -180,3,85,0,180, -3,120,0,180,3, -66,0,180,3,101, -0,180,3,74,0, -180,3,109,0,180, -3,82,0,180,3, -55,0,180,3,117, -0,180,3,90,0, -180,3,98,0,180, -3,71,0,180,3, -106,0,180,3,79, -0,180,3,52,0, -180,3,114,0,180, -3,87,0,180,3, -122,0,180,3,95, -0,180,3,68,0, -180,3,103,0,180, -3,76,0,180,3, -49,0,180,3,111, -0,180,3,84,0, -180,3,57,0,180, -3,119,0,180,3, -65,0,180,3,100, -0,180,3,73,0, -180,3,108,0,180, -3,81,0,180,3, -54,0,180,3,116, -0,180,3,89,0, -180,536,11,1,867, -0,183,1,-1,3, -84,0,180,3,57, -0,180,3,119,0, -180,3,65,0,180, -3,100,0,180,3, -73,0,180,3,108, -0,180,3,81,0, -180,3,54,0,180, -3,116,0,180,3, -89,0,180,537,11, -1,867,0,183,1, --1,3,81,0,180, -3,54,0,180,3, -116,0,180,3,89, -0,180,538,11,1, -867,0,183,1,-1, -3,62,0,539,12, -1,3503,540,5,2, -3,61,0,541,12, -1,3631,542,5,0, -543,11,1,154,0, -544,4,28,71,0, -82,0,69,0,65, -0,84,0,69,0, -82,0,95,0,69, -0,81,0,85,0, -65,0,76,0,83, -0,1,-1,3,62, -0,545,12,1,3509, -546,5,0,547,11, -1,203,0,548,4, -22,82,0,73,0, -71,0,72,0,84, -0,95,0,83,0, -72,0,73,0,70, -0,84,0,1,-1, -549,11,1,121,0, -550,4,22,82,0, -73,0,71,0,72, -0,84,0,95,0, -65,0,78,0,71, -0,76,0,69,0, -1,-1,3,99,0, -551,12,1,18331,552, -5,63,3,97,0, -180,3,70,0,180, -3,105,0,180,3, -78,0,180,3,51, -0,180,3,113,0, -180,3,86,0,180, -3,121,0,180,3, -67,0,180,3,102, -0,180,3,75,0, -180,3,48,0,180, -3,110,0,180,3, -83,0,180,3,56, -0,180,3,118,0, -180,3,99,0,180, -3,72,0,180,3, -107,0,180,3,80, -0,180,3,53,0, -180,3,115,0,180, -3,88,0,180,3, -69,0,180,3,104, -0,553,12,1,18408, -554,5,63,3,97, -0,555,12,1,18475, -556,5,63,3,97, -0,180,3,70,0, -180,3,105,0,180, -3,78,0,180,3, -51,0,180,3,113, -0,180,3,86,0, -180,3,121,0,180, -3,67,0,180,3, -102,0,180,3,75, -0,180,3,48,0, -180,3,110,0,557, -12,1,18547,558,5, -63,3,97,0,180, -3,70,0,180,3, -105,0,180,3,78, -0,180,3,51,0, -180,3,113,0,180, -3,86,0,180,3, -121,0,180,3,67, -0,180,3,102,0, -180,3,75,0,180, -3,48,0,180,3, -110,0,180,3,83, -0,180,3,56,0, -180,3,118,0,180, -3,99,0,180,3, -72,0,180,3,107, -0,180,3,80,0, -180,3,53,0,180, -3,115,0,180,3, -88,0,180,3,69, -0,180,3,104,0, -180,3,77,0,180, -3,50,0,180,3, -112,0,180,3,85, -0,180,3,120,0, -180,3,66,0,180, -3,101,0,180,3, -74,0,180,3,109, -0,180,3,82,0, -180,3,55,0,180, -3,117,0,180,3, -90,0,180,3,98, -0,180,3,71,0, -180,3,106,0,180, -3,79,0,180,3, -52,0,180,3,114, -0,180,3,87,0, -180,3,122,0,180, -3,95,0,180,3, -68,0,180,3,103, -0,559,12,1,18634, -560,5,63,3,97, -0,180,3,70,0, -180,3,105,0,180, -3,78,0,180,3, -51,0,180,3,113, -0,180,3,86,0, -180,3,121,0,180, -3,67,0,180,3, -102,0,180,3,75, -0,180,3,48,0, -180,3,110,0,180, -3,83,0,180,3, -56,0,180,3,118, -0,180,3,99,0, -180,3,72,0,180, -3,107,0,180,3, -80,0,180,3,53, -0,180,3,115,0, -180,3,88,0,180, -3,69,0,180,3, -104,0,180,3,77, -0,180,3,50,0, -180,3,112,0,180, -3,85,0,180,3, -120,0,180,3,66, -0,180,3,101,0, -561,12,1,18714,562, -5,63,3,97,0, -180,3,70,0,180, -3,105,0,180,3, -78,0,180,3,51, -0,180,3,113,0, -180,3,86,0,180, -3,121,0,180,3, -67,0,180,3,102, -0,180,3,75,0, -180,3,48,0,180, -3,110,0,180,3, -83,0,180,3,56, -0,180,3,118,0, -180,3,99,0,180, -3,72,0,180,3, -107,0,180,3,80, -0,180,3,53,0, -180,3,115,0,180, -3,88,0,180,3, -69,0,180,3,104, -0,180,3,77,0, -180,3,50,0,180, -3,112,0,180,3, -85,0,180,3,120, -0,180,3,66,0, -180,3,101,0,180, -3,74,0,180,3, -109,0,180,3,82, -0,180,3,55,0, -180,3,117,0,180, -3,90,0,180,3, -98,0,180,3,71, -0,180,3,106,0, -180,3,79,0,180, -3,52,0,180,3, -114,0,180,3,87, -0,180,3,122,0, -180,3,95,0,180, -3,68,0,180,3, -103,0,180,3,76, -0,180,3,49,0, -180,3,111,0,180, -3,84,0,180,3, -57,0,180,3,119, -0,180,3,65,0, -180,3,100,0,563, -12,1,18804,564,5, -63,3,97,0,180, -3,70,0,180,3, -105,0,180,3,78, -0,180,3,51,0, -180,3,113,0,180, -3,86,0,180,3, -121,0,180,3,67, -0,180,3,102,0, -180,3,75,0,180, -3,48,0,180,3, -110,0,180,3,83, -0,180,3,56,0, -180,3,118,0,180, -3,99,0,180,3, -72,0,180,3,107, -0,180,3,80,0, -180,3,53,0,180, -3,115,0,180,3, -88,0,180,3,69, -0,180,3,104,0, -180,3,77,0,180, -3,50,0,180,3, -112,0,180,3,85, -0,180,3,120,0, -180,3,66,0,180, -3,101,0,180,3, -74,0,180,3,109, -0,180,3,82,0, -180,3,55,0,180, -3,117,0,180,3, -90,0,180,3,98, -0,180,3,71,0, -180,3,106,0,180, -3,79,0,180,3, -52,0,180,3,114, -0,180,3,87,0, -180,3,122,0,180, -3,95,0,180,3, -68,0,180,3,103, -0,180,3,76,0, -180,3,49,0,180, -3,111,0,180,3, -84,0,180,3,57, -0,180,3,119,0, -180,3,65,0,180, -3,100,0,180,3, -73,0,180,3,108, -0,180,3,81,0, -180,3,54,0,180, -3,116,0,180,3, -89,0,180,565,11, -1,390,0,566,4, -26,67,0,72,0, -65,0,78,0,71, -0,69,0,68,0, -95,0,69,0,86, -0,69,0,78,0, -84,0,1,-1,3, -73,0,180,3,108, -0,180,3,81,0, -180,3,54,0,180, -3,116,0,180,3, -89,0,180,567,11, -1,867,0,183,1, --1,3,74,0,180, -3,109,0,180,3, -82,0,180,3,55, -0,180,3,117,0, -180,3,90,0,180, -3,98,0,180,3, -71,0,180,3,106, -0,180,3,79,0, -180,3,52,0,180, -3,114,0,180,3, -87,0,180,3,122, -0,180,3,95,0, -180,3,68,0,180, -3,103,0,180,3, -76,0,180,3,49, -0,180,3,111,0, -180,3,84,0,180, -3,57,0,180,3, -119,0,180,3,65, -0,180,3,100,0, -180,3,73,0,180, -3,108,0,180,3, -81,0,180,3,54, -0,180,3,116,0, -180,3,89,0,180, -568,11,1,867,0, -183,1,-1,3,76, -0,180,3,49,0, -180,3,111,0,180, -3,84,0,180,3, -57,0,180,3,119, -0,180,3,65,0, -180,3,100,0,180, -3,73,0,180,3, -108,0,180,3,81, -0,180,3,54,0, -180,3,116,0,180, -3,89,0,180,569, -11,1,867,0,183, -1,-1,3,83,0, -180,3,56,0,180, -3,118,0,180,3, -99,0,180,3,72, -0,180,3,107,0, -180,3,80,0,180, -3,53,0,180,3, -115,0,180,3,88, -0,180,3,69,0, -180,3,104,0,180, -3,77,0,180,3, -50,0,180,3,112, -0,180,3,85,0, -180,3,120,0,180, -3,66,0,180,3, -101,0,180,3,74, -0,180,3,109,0, -180,3,82,0,180, -3,55,0,180,3, -117,0,180,3,90, -0,180,3,98,0, -180,3,71,0,180, -3,106,0,180,3, -79,0,180,3,52, -0,180,3,114,0, -180,3,87,0,180, -3,122,0,180,3, -95,0,180,3,68, -0,180,3,103,0, -180,3,76,0,180, -3,49,0,180,3, -111,0,180,3,84, -0,180,3,57,0, -180,3,119,0,180, -3,65,0,180,3, -100,0,180,3,73, -0,180,3,108,0, -180,3,81,0,180, -3,54,0,180,3, -116,0,180,3,89, -0,180,570,11,1, -867,0,183,1,-1, -3,70,0,180,3, -105,0,180,3,78, -0,180,3,51,0, -180,3,113,0,180, -3,86,0,180,3, -121,0,180,3,67, -0,180,3,102,0, -180,3,75,0,180, -3,48,0,180,3, -110,0,180,3,83, -0,180,3,56,0, -180,3,118,0,180, -3,99,0,180,3, -72,0,180,3,107, -0,180,3,80,0, -180,3,53,0,180, -3,115,0,180,3, -88,0,180,3,69, -0,180,3,104,0, -180,3,77,0,180, -3,50,0,180,3, -112,0,180,3,85, -0,180,3,120,0, -180,3,66,0,180, -3,101,0,180,3, -74,0,180,3,109, -0,180,3,82,0, -180,3,55,0,180, -3,117,0,180,3, -90,0,180,3,98, -0,180,3,71,0, -180,3,106,0,180, -3,79,0,180,3, -52,0,180,3,114, -0,180,3,87,0, -180,3,122,0,180, -3,95,0,180,3, -68,0,180,3,103, -0,180,3,76,0, -180,3,49,0,180, -3,111,0,180,3, -84,0,180,3,57, -0,180,3,119,0, -180,3,65,0,180, -3,100,0,180,3, -73,0,180,3,108, -0,180,3,81,0, -180,3,54,0,180, -3,116,0,180,3, -89,0,180,571,11, -1,867,0,183,1, --1,3,77,0,180, -3,50,0,180,3, -112,0,180,3,85, -0,180,3,120,0, -180,3,66,0,180, -3,101,0,180,3, -74,0,180,3,109, -0,180,3,82,0, -180,3,55,0,180, -3,117,0,180,3, -90,0,180,3,98, -0,180,3,71,0, -180,3,106,0,180, -3,79,0,180,3, -52,0,180,3,114, -0,180,3,87,0, -180,3,122,0,180, -3,95,0,180,3, -68,0,180,3,103, -0,180,3,76,0, -180,3,49,0,180, -3,111,0,572,12, -1,19139,573,5,63, -3,97,0,180,3, -70,0,180,3,105, -0,180,3,78,0, -180,3,51,0,180, -3,113,0,180,3, -86,0,180,3,121, -0,180,3,67,0, -180,3,102,0,180, -3,75,0,180,3, -48,0,180,3,110, -0,574,12,1,19211, -575,5,63,3,97, -0,180,3,70,0, -180,3,105,0,180, -3,78,0,180,3, -51,0,180,3,113, -0,180,3,86,0, -180,3,121,0,180, -3,67,0,180,3, -102,0,180,3,75, -0,180,3,48,0, -180,3,110,0,180, -3,83,0,180,3, -56,0,180,3,118, -0,180,3,99,0, -180,3,72,0,180, -3,107,0,180,3, -80,0,180,3,53, -0,180,3,115,0, -180,3,88,0,180, -3,69,0,180,3, -104,0,180,3,77, -0,180,3,50,0, -180,3,112,0,180, -3,85,0,180,3, -120,0,180,3,66, -0,180,3,101,0, -180,3,74,0,180, -3,109,0,180,3, -82,0,180,3,55, -0,180,3,117,0, -180,3,90,0,180, -3,98,0,180,3, -71,0,180,3,106, -0,180,3,79,0, -180,3,52,0,180, -3,114,0,180,3, -87,0,180,3,122, -0,180,3,95,0, -180,3,68,0,180, -3,103,0,180,3, -76,0,180,3,49, -0,180,3,111,0, -180,3,84,0,180, -3,57,0,180,3, -119,0,180,3,65, -0,180,3,100,0, -180,3,73,0,180, -3,108,0,180,3, -81,0,180,3,54, -0,180,3,116,0, -576,12,1,19304,577, -5,63,3,97,0, -180,3,70,0,180, -3,105,0,180,3, -78,0,180,3,51, -0,180,3,113,0, -180,3,86,0,180, -3,121,0,180,3, -67,0,180,3,102, -0,180,3,75,0, -180,3,48,0,180, -3,110,0,180,3, -83,0,180,3,56, -0,180,3,118,0, -180,3,99,0,180, -3,72,0,180,3, -107,0,180,3,80, -0,180,3,53,0, -180,3,115,0,180, -3,88,0,180,3, -69,0,180,3,104, -0,180,3,77,0, -180,3,50,0,180, -3,112,0,180,3, -85,0,180,3,120, -0,180,3,66,0, -180,3,101,0,180, -3,74,0,180,3, -109,0,180,3,82, -0,180,3,55,0, -180,3,117,0,180, -3,90,0,180,3, -98,0,180,3,71, -0,180,3,106,0, -180,3,79,0,180, -3,52,0,180,3, -114,0,578,12,1, -19389,579,5,63,3, -97,0,180,3,70, -0,180,3,105,0, -180,3,78,0,180, -3,51,0,180,3, -113,0,180,3,86, -0,180,3,121,0, -180,3,67,0,180, -3,102,0,180,3, -75,0,180,3,48, -0,180,3,110,0, -180,3,83,0,180, -3,56,0,180,3, -118,0,180,3,99, -0,180,3,72,0, -180,3,107,0,180, -3,80,0,180,3, -53,0,180,3,115, -0,180,3,88,0, -180,3,69,0,180, -3,104,0,180,3, -77,0,180,3,50, -0,180,3,112,0, -180,3,85,0,180, -3,120,0,180,3, -66,0,180,3,101, -0,180,3,74,0, -180,3,109,0,180, -3,82,0,180,3, -55,0,180,3,117, -0,180,3,90,0, -180,3,98,0,180, -3,71,0,180,3, -106,0,180,3,79, -0,180,3,52,0, -180,3,114,0,180, -3,87,0,180,3, -122,0,180,3,95, -0,180,3,68,0, -180,3,103,0,180, -3,76,0,180,3, -49,0,180,3,111, -0,580,12,1,19477, -581,5,63,3,97, -0,180,3,70,0, -180,3,105,0,180, -3,78,0,180,3, -51,0,180,3,113, -0,180,3,86,0, -180,3,121,0,180, -3,67,0,180,3, -102,0,180,3,75, -0,180,3,48,0, -180,3,110,0,180, -3,83,0,180,3, -56,0,180,3,118, -0,180,3,99,0, -180,3,72,0,180, -3,107,0,180,3, -80,0,180,3,53, -0,180,3,115,0, -180,3,88,0,180, -3,69,0,180,3, -104,0,180,3,77, -0,180,3,50,0, -180,3,112,0,180, -3,85,0,180,3, -120,0,180,3,66, -0,180,3,101,0, -180,3,74,0,180, -3,109,0,180,3, -82,0,180,3,55, -0,180,3,117,0, -180,3,90,0,180, -3,98,0,180,3, -71,0,180,3,106, -0,180,3,79,0, -180,3,52,0,180, -3,114,0,180,3, -87,0,180,3,122, -0,180,3,95,0, -180,3,68,0,180, -3,103,0,180,3, -76,0,180,3,49, -0,180,3,111,0, -180,3,84,0,180, -3,57,0,180,3, -119,0,180,3,65, -0,180,3,100,0, -180,3,73,0,180, -3,108,0,582,12, -1,19568,583,5,63, -3,97,0,180,3, -70,0,180,3,105, -0,180,3,78,0, -180,3,51,0,180, -3,113,0,180,3, -86,0,180,3,121, -0,180,3,67,0, -180,3,102,0,180, -3,75,0,180,3, -48,0,180,3,110, -0,180,3,83,0, -180,3,56,0,180, -3,118,0,180,3, -99,0,180,3,72, -0,180,3,107,0, -180,3,80,0,180, -3,53,0,180,3, -115,0,180,3,88, -0,180,3,69,0, -180,3,104,0,180, -3,77,0,180,3, -50,0,180,3,112, -0,180,3,85,0, -180,3,120,0,180, -3,66,0,180,3, -101,0,180,3,74, -0,180,3,109,0, -180,3,82,0,180, -3,55,0,180,3, -117,0,180,3,90, -0,180,3,98,0, -180,3,71,0,180, -3,106,0,180,3, -79,0,180,3,52, -0,180,3,114,0, -180,3,87,0,180, -3,122,0,180,3, -95,0,180,3,68, -0,180,3,103,0, -180,3,76,0,180, -3,49,0,180,3, -111,0,180,3,84, -0,180,3,57,0, -180,3,119,0,180, -3,65,0,180,3, -100,0,180,3,73, -0,180,3,108,0, -180,3,81,0,180, -3,54,0,180,3, -116,0,180,3,89, -0,180,584,11,1, -450,0,585,4,26, -67,0,79,0,78, -0,84,0,82,0, -79,0,76,0,95, -0,69,0,86,0, -69,0,78,0,84, -0,1,-1,3,81, -0,180,3,54,0, -180,3,116,0,180, -3,89,0,180,586, -11,1,867,0,183, -1,-1,3,84,0, -180,3,57,0,180, -3,119,0,180,3, -65,0,180,3,100, -0,180,3,73,0, -180,3,108,0,180, -3,81,0,180,3, -54,0,180,3,116, -0,180,3,89,0, -180,587,11,1,867, -0,183,1,-1,3, -87,0,180,3,122, -0,180,3,95,0, -180,3,68,0,180, -3,103,0,180,3, -76,0,180,3,49, -0,180,3,111,0, -180,3,84,0,180, -3,57,0,180,3, -119,0,180,3,65, -0,180,3,100,0, -180,3,73,0,180, -3,108,0,180,3, -81,0,180,3,54, -0,180,3,116,0, -180,3,89,0,180, -588,11,1,867,0, -183,1,-1,3,89, -0,180,589,11,1, -867,0,183,1,-1, -3,83,0,180,3, -56,0,180,3,118, -0,180,3,99,0, -180,3,72,0,180, -3,107,0,180,3, -80,0,180,3,53, -0,180,3,115,0, -180,3,88,0,180, -3,69,0,180,3, -104,0,180,3,77, -0,180,3,50,0, -180,3,112,0,180, -3,85,0,180,3, -120,0,180,3,66, -0,180,3,101,0, -180,3,74,0,180, -3,109,0,180,3, -82,0,180,3,55, -0,180,3,117,0, -180,3,90,0,180, -3,98,0,180,3, -71,0,180,3,106, -0,180,3,79,0, -180,3,52,0,180, -3,114,0,180,3, -87,0,180,3,122, -0,180,3,95,0, -180,3,68,0,180, -3,103,0,180,3, -76,0,180,3,49, -0,180,3,111,0, -180,3,84,0,180, -3,57,0,180,3, -119,0,180,3,65, -0,180,3,100,0, -180,3,73,0,180, -3,108,0,590,12, -1,19830,591,5,63, -3,97,0,180,3, -70,0,180,3,105, -0,180,3,78,0, -180,3,51,0,180, -3,113,0,180,3, -86,0,180,3,121, -0,180,3,67,0, -180,3,102,0,180, -3,75,0,180,3, -48,0,180,3,110, -0,180,3,83,0, -180,3,56,0,180, -3,118,0,180,3, -99,0,180,3,72, -0,180,3,107,0, -180,3,80,0,180, -3,53,0,180,3, -115,0,180,3,88, -0,180,3,69,0, -180,3,104,0,180, -3,77,0,180,3, -50,0,180,3,112, -0,180,3,85,0, -180,3,120,0,180, -3,66,0,180,3, -101,0,180,3,74, -0,180,3,109,0, -180,3,82,0,180, -3,55,0,180,3, -117,0,180,3,90, -0,180,3,98,0, -180,3,71,0,180, -3,106,0,180,3, -79,0,180,3,52, -0,180,3,114,0, -180,3,87,0,180, -3,122,0,180,3, -95,0,180,3,68, -0,180,3,103,0, -180,3,76,0,180, -3,49,0,180,3, -111,0,180,3,84, -0,180,3,57,0, -180,3,119,0,180, -3,65,0,180,3, -100,0,180,3,73, -0,180,3,108,0, -592,12,1,19921,593, -5,63,3,97,0, -180,3,70,0,180, -3,105,0,594,12, -1,19989,595,5,63, -3,97,0,180,3, -70,0,180,3,105, -0,180,3,78,0, -180,3,51,0,180, -3,113,0,180,3, -86,0,180,3,121, -0,180,3,67,0, -180,3,102,0,180, -3,75,0,180,3, -48,0,180,3,110, -0,180,3,83,0, -180,3,56,0,180, -3,118,0,180,3, -99,0,180,3,72, -0,180,3,107,0, -180,3,80,0,180, -3,53,0,180,3, -115,0,596,12,1, -20065,597,5,63,3, -97,0,180,3,70, -0,180,3,105,0, -598,12,1,20133,599, -5,63,3,97,0, -180,3,70,0,180, -3,105,0,180,3, -78,0,180,3,51, -0,180,3,113,0, -180,3,86,0,180, -3,121,0,180,3, -67,0,180,3,102, -0,180,3,75,0, -180,3,48,0,180, -3,110,0,180,3, -83,0,180,3,56, -0,180,3,118,0, -180,3,99,0,180, -3,72,0,180,3, -107,0,180,3,80, -0,180,3,53,0, -180,3,115,0,180, -3,88,0,180,3, -69,0,180,3,104, -0,180,3,77,0, -180,3,50,0,180, -3,112,0,180,3, -85,0,180,3,120, -0,180,3,66,0, -180,3,101,0,180, -3,74,0,180,3, -109,0,180,3,82, -0,180,3,55,0, -180,3,117,0,180, -3,90,0,180,3, -98,0,180,3,71, -0,180,3,106,0, -180,3,79,0,180, -3,52,0,180,3, -114,0,180,3,87, -0,180,3,122,0, -180,3,95,0,180, -3,68,0,180,3, -103,0,180,3,76, -0,180,3,49,0, -180,3,111,0,600, -12,1,20221,601,5, -63,3,97,0,180, -3,70,0,180,3, -105,0,180,3,78, -0,180,3,51,0, -180,3,113,0,180, -3,86,0,180,3, -121,0,180,3,67, -0,180,3,102,0, -180,3,75,0,180, -3,48,0,180,3, -110,0,602,12,1, -20293,603,5,63,3, -97,0,180,3,70, -0,180,3,105,0, -180,3,78,0,180, -3,51,0,180,3, -113,0,180,3,86, -0,180,3,121,0, -180,3,67,0,180, -3,102,0,180,3, -75,0,180,3,48, -0,180,3,110,0, -180,3,83,0,180, -3,56,0,180,3, -118,0,180,3,99, -0,180,3,72,0, -180,3,107,0,180, -3,80,0,180,3, -53,0,180,3,115, -0,180,3,88,0, -180,3,69,0,180, -3,104,0,180,3, -77,0,180,3,50, -0,180,3,112,0, -180,3,85,0,180, -3,120,0,180,3, -66,0,180,3,101, -0,180,3,74,0, -180,3,109,0,180, -3,82,0,180,3, -55,0,180,3,117, -0,180,3,90,0, -180,3,98,0,180, -3,71,0,180,3, -106,0,180,3,79, -0,180,3,52,0, -180,3,114,0,180, -3,87,0,180,3, -122,0,180,3,95, -0,604,12,1,20329, -605,5,63,3,97, -0,180,3,70,0, -180,3,105,0,180, -3,78,0,180,3, -51,0,180,3,113, -0,180,3,86,0, -180,3,121,0,180, -3,67,0,180,3, -102,0,180,3,75, -0,180,3,48,0, -180,3,110,0,180, -3,83,0,180,3, -56,0,180,3,118, -0,180,3,99,0, -180,3,72,0,180, -3,107,0,180,3, -80,0,180,3,53, -0,180,3,115,0, -606,12,1,20405,607, -5,63,3,97,0, -180,3,70,0,180, -3,105,0,180,3, -78,0,180,3,51, -0,180,3,113,0, -180,3,86,0,180, -3,121,0,180,3, -67,0,180,3,102, -0,180,3,75,0, -180,3,48,0,180, -3,110,0,180,3, -83,0,180,3,56, -0,180,3,118,0, -180,3,99,0,180, -3,72,0,180,3, -107,0,180,3,80, -0,180,3,53,0, -180,3,115,0,180, -3,88,0,180,3, -69,0,180,3,104, -0,180,3,77,0, -180,3,50,0,180, -3,112,0,180,3, -85,0,180,3,120, -0,180,3,66,0, -180,3,101,0,180, -3,74,0,180,3, -109,0,180,3,82, -0,180,3,55,0, -180,3,117,0,180, -3,90,0,180,3, -98,0,180,3,71, -0,180,3,106,0, -180,3,79,0,180, -3,52,0,180,3, -114,0,180,3,87, -0,180,3,122,0, -180,3,95,0,180, -3,68,0,180,3, -103,0,180,3,76, -0,180,3,49,0, -180,3,111,0,180, -3,84,0,180,3, -57,0,180,3,119, -0,180,3,65,0, -180,3,100,0,180, -3,73,0,180,3, -108,0,180,3,81, -0,180,3,54,0, -180,3,116,0,608, -12,1,20498,609,5, -63,3,97,0,610, -12,1,20565,611,5, -63,3,97,0,180, -3,70,0,180,3, -105,0,180,3,78, -0,180,3,51,0, -180,3,113,0,180, -3,86,0,180,3, -121,0,180,3,67, -0,180,3,102,0, -180,3,75,0,180, -3,48,0,180,3, -110,0,180,3,83, -0,180,3,56,0, -180,3,118,0,180, -3,99,0,180,3, -72,0,180,3,107, -0,180,3,80,0, -180,3,53,0,180, -3,115,0,180,3, -88,0,180,3,69, -0,180,3,104,0, -180,3,77,0,180, -3,50,0,180,3, -112,0,180,3,85, -0,180,3,120,0, -180,3,66,0,180, -3,101,0,180,3, -74,0,180,3,109, -0,180,3,82,0, -180,3,55,0,180, -3,117,0,180,3, -90,0,180,3,98, -0,180,3,71,0, -180,3,106,0,180, -3,79,0,180,3, -52,0,180,3,114, -0,612,12,1,20650, -613,5,63,3,97, -0,180,3,70,0, -180,3,105,0,180, -3,78,0,180,3, -51,0,180,3,113, -0,180,3,86,0, -180,3,121,0,180, -3,67,0,180,3, -102,0,180,3,75, -0,180,3,48,0, -180,3,110,0,180, -3,83,0,180,3, -56,0,180,3,118, -0,180,3,99,0, -180,3,72,0,180, -3,107,0,180,3, -80,0,180,3,53, -0,180,3,115,0, -180,3,88,0,180, -3,69,0,180,3, -104,0,180,3,77, -0,180,3,50,0, -180,3,112,0,180, -3,85,0,180,3, -120,0,180,3,66, -0,180,3,101,0, -180,3,74,0,180, -3,109,0,180,3, -82,0,180,3,55, -0,180,3,117,0, -180,3,90,0,180, -3,98,0,180,3, -71,0,180,3,106, -0,180,3,79,0, -180,3,52,0,180, -3,114,0,180,3, -87,0,180,3,122, -0,180,3,95,0, -180,3,68,0,180, -3,103,0,180,3, -76,0,180,3,49, -0,180,3,111,0, -180,3,84,0,180, -3,57,0,180,3, -119,0,180,3,65, -0,180,3,100,0, -180,3,73,0,180, -3,108,0,180,3, -81,0,180,3,54, -0,180,3,116,0, -614,12,1,20743,615, -5,63,3,97,0, -180,3,70,0,180, -3,105,0,180,3, -78,0,180,3,51, -0,180,3,113,0, -180,3,86,0,180, -3,121,0,180,3, -67,0,180,3,102, -0,180,3,75,0, -180,3,48,0,180, -3,110,0,180,3, -83,0,180,3,56, -0,180,3,118,0, -180,3,99,0,180, -3,72,0,180,3, -107,0,180,3,80, -0,180,3,53,0, -180,3,115,0,180, -3,88,0,180,3, -69,0,180,3,104, -0,180,3,77,0, -180,3,50,0,180, -3,112,0,180,3, -85,0,180,3,120, -0,180,3,66,0, -180,3,101,0,180, -3,74,0,180,3, -109,0,180,3,82, -0,180,3,55,0, -180,3,117,0,180, -3,90,0,180,3, -98,0,180,3,71, -0,180,3,106,0, -180,3,79,0,180, -3,52,0,180,3, -114,0,180,3,87, -0,180,3,122,0, -180,3,95,0,180, -3,68,0,180,3, -103,0,180,3,76, -0,180,3,49,0, -180,3,111,0,180, -3,84,0,180,3, -57,0,180,3,119, -0,180,3,65,0, -180,3,100,0,180, -3,73,0,180,3, -108,0,180,3,81, -0,180,3,54,0, -180,3,116,0,180, -3,89,0,180,616, -11,1,431,0,617, -4,42,67,0,79, -0,76,0,76,0, -73,0,83,0,73, -0,79,0,78,0, -95,0,83,0,84, -0,65,0,82,0, -84,0,95,0,69, -0,86,0,69,0, -78,0,84,0,1, --1,3,89,0,180, -618,11,1,867,0, -183,1,-1,3,87, -0,180,3,122,0, -180,3,95,0,180, -3,68,0,180,3, -103,0,180,3,76, -0,180,3,49,0, -180,3,111,0,180, -3,84,0,180,3, -57,0,180,3,119, -0,180,3,65,0, -180,3,100,0,180, -3,73,0,180,3, -108,0,180,3,81, -0,180,3,54,0, -180,3,116,0,180, -3,89,0,180,619, -11,1,867,0,183, -1,-1,3,70,0, -180,3,105,0,180, -3,78,0,180,3, -51,0,180,3,113, -0,180,3,86,0, -180,3,121,0,180, -3,67,0,180,3, -102,0,180,3,75, -0,180,3,48,0, -180,3,110,0,180, -3,83,0,180,3, -56,0,180,3,118, -0,180,3,99,0, -180,3,72,0,180, -3,107,0,180,3, -80,0,180,3,53, -0,180,3,115,0, -180,3,88,0,180, -3,69,0,180,3, -104,0,180,3,77, -0,180,3,50,0, -180,3,112,0,180, -3,85,0,180,3, -120,0,180,3,66, -0,180,3,101,0, -180,3,74,0,180, -3,109,0,180,3, -82,0,180,3,55, -0,180,3,117,0, -180,3,90,0,180, -3,98,0,180,3, -71,0,180,3,106, -0,180,3,79,0, -180,3,52,0,180, -3,114,0,180,3, -87,0,180,3,122, -0,180,3,95,0, -180,3,68,0,180, -3,103,0,180,3, -76,0,180,3,49, -0,180,3,111,0, -180,3,84,0,180, -3,57,0,180,3, -119,0,180,3,65, -0,180,3,100,0, -180,3,73,0,180, -3,108,0,180,3, -81,0,180,3,54, -0,180,3,116,0, -180,3,89,0,180, -620,11,1,867,0, -183,1,-1,3,89, -0,180,621,11,1, -867,0,183,1,-1, -3,88,0,180,3, -69,0,180,3,104, -0,180,3,77,0, -180,3,50,0,180, -3,112,0,180,3, -85,0,180,3,120, -0,180,3,66,0, -180,3,101,0,622, -12,1,21009,623,5, -63,3,97,0,180, -3,70,0,180,3, -105,0,180,3,78, -0,180,3,51,0, -180,3,113,0,180, -3,86,0,180,3, -121,0,180,3,67, -0,180,3,102,0, -180,3,75,0,180, -3,48,0,180,3, -110,0,624,12,1, -21081,625,5,63,3, -97,0,180,3,70, -0,180,3,105,0, -180,3,78,0,180, -3,51,0,180,3, -113,0,180,3,86, -0,180,3,121,0, -180,3,67,0,180, -3,102,0,180,3, -75,0,180,3,48, -0,180,3,110,0, -180,3,83,0,180, -3,56,0,180,3, -118,0,180,3,99, -0,180,3,72,0, -180,3,107,0,180, -3,80,0,180,3, -53,0,180,3,115, -0,180,3,88,0, -180,3,69,0,180, -3,104,0,180,3, -77,0,180,3,50, -0,180,3,112,0, -180,3,85,0,180, -3,120,0,180,3, -66,0,180,3,101, -0,180,3,74,0, -180,3,109,0,180, -3,82,0,180,3, -55,0,180,3,117, -0,180,3,90,0, -180,3,98,0,180, -3,71,0,180,3, -106,0,180,3,79, -0,180,3,52,0, -180,3,114,0,180, -3,87,0,180,3, -122,0,180,3,95, -0,180,3,68,0, -180,3,103,0,180, -3,76,0,180,3, -49,0,180,3,111, -0,180,3,84,0, -180,3,57,0,180, -3,119,0,180,3, -65,0,180,3,100, -0,626,12,1,21171, -627,5,63,3,97, -0,180,3,70,0, -180,3,105,0,180, -3,78,0,180,3, -51,0,180,3,113, -0,180,3,86,0, -180,3,121,0,180, -3,67,0,180,3, -102,0,180,3,75, -0,180,3,48,0, -180,3,110,0,180, -3,83,0,180,3, -56,0,180,3,118, -0,180,3,99,0, -180,3,72,0,180, -3,107,0,180,3, -80,0,180,3,53, -0,180,3,115,0, -180,3,88,0,180, -3,69,0,180,3, -104,0,180,3,77, -0,180,3,50,0, -180,3,112,0,180, -3,85,0,180,3, -120,0,180,3,66, -0,180,3,101,0, -180,3,74,0,180, -3,109,0,180,3, -82,0,180,3,55, -0,180,3,117,0, -180,3,90,0,180, -3,98,0,180,3, -71,0,180,3,106, -0,180,3,79,0, -180,3,52,0,180, -3,114,0,180,3, -87,0,180,3,122, -0,180,3,95,0, -180,3,68,0,180, -3,103,0,180,3, -76,0,180,3,49, -0,180,3,111,0, -180,3,84,0,180, -3,57,0,180,3, -119,0,180,3,65, -0,180,3,100,0, -180,3,73,0,180, -3,108,0,180,3, -81,0,180,3,54, -0,180,3,116,0, -180,3,89,0,180, -628,11,1,414,0, -629,4,38,67,0, -79,0,76,0,76, -0,73,0,83,0, -73,0,79,0,78, -0,95,0,69,0, -78,0,68,0,95, -0,69,0,86,0, -69,0,78,0,84, -0,1,-1,3,73, -0,180,3,108,0, -180,3,81,0,180, -3,54,0,180,3, -116,0,180,3,89, -0,180,630,11,1, -867,0,183,1,-1, -3,83,0,180,3, -56,0,180,3,118, -0,180,3,99,0, -180,3,72,0,180, -3,107,0,180,3, -80,0,180,3,53, -0,180,3,115,0, -180,3,88,0,180, -3,69,0,180,3, -104,0,180,3,77, -0,180,3,50,0, -180,3,112,0,180, -3,85,0,180,3, -120,0,180,3,66, -0,180,3,101,0, -180,3,74,0,180, -3,109,0,180,3, -82,0,180,3,55, -0,180,3,117,0, -180,3,90,0,180, -3,98,0,180,3, -71,0,180,3,106, -0,180,3,79,0, -180,3,52,0,180, -3,114,0,180,3, -87,0,180,3,122, -0,180,3,95,0, -180,3,68,0,180, -3,103,0,180,3, -76,0,180,3,49, -0,180,3,111,0, -180,3,84,0,180, -3,57,0,180,3, -119,0,180,3,65, -0,180,3,100,0, -180,3,73,0,180, -3,108,0,180,3, -81,0,180,3,54, -0,180,3,116,0, -180,3,89,0,180, -631,11,1,867,0, -183,1,-1,3,74, -0,180,3,109,0, -180,3,82,0,180, -3,55,0,180,3, -117,0,180,3,90, -0,180,3,98,0, -180,3,71,0,180, -3,106,0,180,3, -79,0,180,3,52, -0,180,3,114,0, -180,3,87,0,180, -3,122,0,180,3, -95,0,180,3,68, -0,180,3,103,0, -180,3,76,0,180, -3,49,0,180,3, -111,0,180,3,84, -0,180,3,57,0, -180,3,119,0,180, -3,65,0,180,3, -100,0,180,3,73, -0,180,3,108,0, -180,3,81,0,180, -3,54,0,180,3, -116,0,180,3,89, -0,180,632,11,1, -867,0,183,1,-1, -3,68,0,180,3, -103,0,180,3,76, -0,180,3,49,0, -180,3,111,0,180, -3,84,0,180,3, -57,0,180,3,119, -0,180,3,65,0, -180,3,100,0,180, -3,73,0,180,3, -108,0,180,3,81, -0,180,3,54,0, -180,3,116,0,180, -3,89,0,180,633, -11,1,401,0,634, -4,30,67,0,79, -0,76,0,76,0, -73,0,83,0,73, -0,79,0,78,0, -95,0,69,0,86, -0,69,0,78,0, -84,0,1,-1,3, -83,0,180,3,56, -0,180,3,118,0, -180,3,99,0,180, -3,72,0,180,3, -107,0,180,3,80, -0,180,3,53,0, -180,3,115,0,180, -3,88,0,180,3, -69,0,180,3,104, -0,180,3,77,0, -180,3,50,0,180, -3,112,0,180,3, -85,0,180,3,120, -0,180,3,66,0, -180,3,101,0,180, -3,74,0,180,3, -109,0,180,3,82, -0,180,3,55,0, -180,3,117,0,180, -3,90,0,180,3, -98,0,180,3,71, -0,180,3,106,0, -180,3,79,0,180, -3,52,0,180,3, -114,0,180,3,87, -0,180,3,122,0, -180,3,95,0,180, -3,68,0,180,3, -103,0,180,3,76, -0,180,3,49,0, -180,3,111,0,180, -3,84,0,180,3, -57,0,180,3,119, -0,180,3,65,0, -180,3,100,0,180, -3,73,0,180,3, -108,0,180,3,81, -0,180,3,54,0, -180,3,116,0,180, -3,89,0,180,635, -11,1,867,0,183, -1,-1,3,84,0, -180,3,57,0,180, -3,119,0,180,3, -65,0,180,3,100, -0,180,3,73,0, -180,3,108,0,180, -3,81,0,180,3, -54,0,180,3,116, -0,180,3,89,0, -180,636,11,1,867, -0,183,1,-1,3, -78,0,180,3,51, -0,180,3,113,0, -180,3,86,0,180, -3,121,0,180,3, -67,0,180,3,102, -0,180,3,75,0, -180,3,48,0,180, -3,110,0,180,3, -83,0,180,3,56, -0,180,3,118,0, -180,3,99,0,180, -3,72,0,180,3, -107,0,180,3,80, -0,180,3,53,0, -180,3,115,0,180, -3,88,0,180,3, -69,0,180,3,104, -0,180,3,77,0, -180,3,50,0,180, -3,112,0,180,3, -85,0,180,3,120, -0,180,3,66,0, -180,3,101,0,180, -3,74,0,180,3, -109,0,180,3,82, -0,180,3,55,0, -180,3,117,0,180, -3,90,0,180,3, -98,0,180,3,71, -0,180,3,106,0, -180,3,79,0,180, -3,52,0,180,3, -114,0,180,3,87, -0,180,3,122,0, -180,3,95,0,180, -3,68,0,180,3, -103,0,180,3,76, -0,180,3,49,0, -180,3,111,0,180, -3,84,0,180,3, -57,0,180,3,119, -0,180,3,65,0, -180,3,100,0,180, -3,73,0,180,3, -108,0,180,3,81, -0,180,3,54,0, -180,3,116,0,180, -3,89,0,180,637, -11,1,867,0,183, -1,-1,3,88,0, -180,3,69,0,180, -3,104,0,180,3, -77,0,180,3,50, -0,180,3,112,0, -180,3,85,0,180, -3,120,0,180,3, -66,0,180,3,101, -0,180,3,74,0, -180,3,109,0,180, -3,82,0,180,3, -55,0,180,3,117, -0,180,3,90,0, -180,3,98,0,180, -3,71,0,180,3, -106,0,180,3,79, -0,180,3,52,0, -180,3,114,0,180, -3,87,0,180,3, -122,0,180,3,95, -0,180,3,68,0, -180,3,103,0,180, -3,76,0,180,3, -49,0,180,3,111, -0,180,3,84,0, -180,3,57,0,180, -3,119,0,180,3, -65,0,180,3,100, -0,180,3,73,0, -180,3,108,0,180, -3,81,0,180,3, -54,0,180,3,116, -0,180,3,89,0, -180,638,11,1,867, -0,183,1,-1,3, -78,0,180,3,51, -0,180,3,113,0, -180,3,86,0,180, -3,121,0,180,3, -67,0,180,3,102, -0,180,3,75,0, -180,3,48,0,180, -3,110,0,180,3, -83,0,180,3,56, -0,180,3,118,0, -180,3,99,0,180, -3,72,0,180,3, -107,0,180,3,80, -0,180,3,53,0, -180,3,115,0,180, -3,88,0,180,3, -69,0,180,3,104, -0,180,3,77,0, -180,3,50,0,180, -3,112,0,180,3, -85,0,180,3,120, -0,180,3,66,0, -180,3,101,0,180, -3,74,0,180,3, -109,0,180,3,82, -0,180,3,55,0, -180,3,117,0,180, -3,90,0,180,3, -98,0,180,3,71, -0,180,3,106,0, -180,3,79,0,180, -3,52,0,180,3, -114,0,180,3,87, -0,180,3,122,0, -180,3,95,0,180, -3,68,0,180,3, -103,0,180,3,76, -0,180,3,49,0, -180,3,111,0,180, -3,84,0,180,3, -57,0,180,3,119, -0,180,3,65,0, -180,3,100,0,180, -3,73,0,180,3, -108,0,180,3,81, -0,180,3,54,0, -180,3,116,0,180, -3,89,0,180,639, -11,1,867,0,183, -1,-1,3,81,0, -180,3,54,0,180, -3,116,0,180,3, -89,0,180,640,11, -1,867,0,183,1, --1,3,81,0,180, -3,54,0,180,3, -116,0,180,3,89, -0,180,641,11,1, -867,0,183,1,-1, -3,84,0,180,3, -57,0,180,3,119, -0,180,3,65,0, -180,3,100,0,180, -3,73,0,180,3, -108,0,180,3,81, -0,180,3,54,0, -180,3,116,0,180, -3,89,0,180,642, -11,1,867,0,183, -1,-1,3,59,0, -643,12,1,4588,644, -5,0,645,11,1, -46,0,646,4,18, -83,0,69,0,77, -0,73,0,67,0, -79,0,76,0,79, -0,78,0,1,-1, -3,56,0,647,12, -1,8827,648,5,11, -3,50,0,647,3, -49,0,647,3,57, -0,647,3,48,0, -647,3,56,0,647, -3,55,0,647,3, -46,0,649,12,1, -8844,650,5,14,3, -48,0,651,12,1, -5724,652,5,14,3, -48,0,651,3,70, -0,653,12,1,5795, -654,5,0,655,11, -1,904,0,656,4, -28,70,0,76,0, -79,0,65,0,84, -0,95,0,67,0, -79,0,78,0,83, -0,84,0,65,0, -78,0,84,0,1, --1,3,55,0,651, -3,51,0,651,3, -69,0,657,12,1, -5924,658,5,12,3, -50,0,659,12,1, -5983,660,5,12,3, -50,0,659,3,49, -0,659,3,57,0, -659,3,48,0,659, -3,56,0,659,3, -102,0,653,3,55, -0,659,3,70,0, -653,3,54,0,659, -3,53,0,659,3, -52,0,659,3,51, -0,659,661,11,1, -904,0,656,1,-1, -3,49,0,659,3, -57,0,659,3,48, -0,659,3,56,0, -659,3,55,0,659, -3,54,0,659,3, -45,0,662,12,1, -5933,663,5,10,3, -50,0,659,3,49, -0,659,3,57,0, -659,3,48,0,659, -3,56,0,659,3, -55,0,659,3,54, -0,659,3,53,0, -659,3,52,0,659, -3,51,0,659,0, -165,1,-1,3,53, -0,659,3,52,0, -659,3,43,0,662, -3,51,0,659,0, -165,1,-1,3,54, -0,651,3,102,0, -653,3,50,0,651, -3,57,0,651,3, -53,0,651,3,101, -0,657,3,49,0, -651,3,56,0,651, -3,52,0,651,664, -11,1,904,0,656, -1,-1,3,70,0, -653,3,55,0,651, -3,51,0,651,3, -69,0,657,3,54, -0,651,3,102,0, -653,3,50,0,651, -3,57,0,651,3, -53,0,651,3,101, -0,657,3,49,0, -651,3,56,0,651, -3,52,0,651,665, -11,1,904,0,656, -1,-1,3,54,0, -647,3,53,0,647, -3,52,0,647,3, -51,0,647,666,11, -1,879,0,667,4, -32,73,0,78,0, -84,0,69,0,71, -0,69,0,82,0, -95,0,67,0,79, -0,78,0,83,0, -84,0,65,0,78, -0,84,0,1,-1, -3,93,0,668,12, -1,7362,669,5,0, -670,11,1,131,0, -671,4,26,82,0, -73,0,71,0,72, -0,84,0,95,0, -66,0,82,0,65, -0,67,0,75,0, -69,0,84,0,1, --1,3,53,0,647, -3,13,0,672,12, -1,8696,673,5,0, -674,11,1,1072,0, -165,1,-1,3,90, -0,178,3,50,0, -647,3,10,0,672, -3,87,0,178,3, -47,0,675,12,1, -5072,676,5,3,3, -61,0,677,12,1, -5080,678,5,0,679, -11,1,34,0,680, -4,24,83,0,76, -0,65,0,83,0, -72,0,95,0,69, -0,81,0,85,0, -65,0,76,0,83, -0,1,-1,3,47, -0,681,12,1,5207, -682,5,118,3,238, -22,683,12,1,5208, -684,5,118,3,238, -22,683,3,117,0, -683,3,63,32,683, -3,37,0,683,3, -114,0,683,3,74, -0,683,3,34,0, -683,3,111,0,683, -3,71,0,683,3, -108,0,683,3,68, -0,683,3,105,0, -683,3,65,0,683, -3,102,0,683,3, -62,0,683,3,99, -0,683,3,59,0, -683,3,96,0,683, -3,96,6,683,3, -173,0,683,3,93, -0,683,3,53,0, -683,3,13,0,683, -3,170,0,683,3, -90,0,683,3,50, -0,683,3,87,0, -683,3,47,0,683, -3,100,0,683,3, -124,0,683,3,84, -0,683,3,44,0, -683,3,121,0,683, -3,81,0,683,3, -41,0,683,3,1, -0,683,3,59,15, -683,3,78,0,683, -3,38,0,683,3, -58,15,683,3,115, -0,683,3,75,0, -683,3,35,0,683, -3,192,0,683,3, -112,0,683,3,72, -0,683,3,32,0, -683,3,109,0,683, -3,69,0,683,3, -187,1,683,3,106, -0,683,3,66,0, -683,3,103,0,683, -3,77,0,683,3, -3,9,683,3,118, -0,683,3,60,0, -683,3,0,3,683, -3,197,1,683,3, -176,2,683,3,57, -0,683,3,70,0, -683,3,94,0,683, -3,54,0,683,3, -171,0,683,3,91, -0,683,3,51,0, -683,3,88,0,683, -3,48,0,683,3, -125,0,683,3,85, -0,683,3,56,0, -683,3,97,0,683, -3,122,0,683,3, -82,0,683,3,42, -0,683,3,0,6, -683,3,119,0,683, -3,79,0,683,3, -41,32,683,3,116, -0,683,3,76,0, -683,3,36,0,683, -3,113,0,683,3, -73,0,683,3,33, -0,683,3,110,0, -683,3,40,32,683, -3,0,224,683,3, -187,0,683,3,107, -0,683,3,67,0, -683,3,104,0,683, -3,64,0,683,3, -101,0,683,3,61, -0,683,3,178,0, -683,3,98,0,683, -3,45,0,683,3, -136,4,683,3,95, -0,683,3,55,0, -683,3,172,0,683, -3,92,0,683,3, -52,0,683,3,89, -0,683,3,49,0, -683,3,9,0,683, -3,126,0,683,3, -86,0,683,3,46, -0,683,3,123,0, -683,3,83,0,683, -3,43,0,683,3, -160,0,683,3,120, -0,683,3,80,0, -683,3,40,0,683, -685,11,1,1076,0, -165,1,-1,3,117, -0,683,3,63,32, -683,3,37,0,683, -3,114,0,683,3, -74,0,683,3,34, -0,683,3,111,0, -683,3,71,0,683, -3,108,0,683,3, -68,0,683,3,105, -0,683,3,65,0, -683,3,102,0,683, -3,62,0,683,3, -99,0,683,3,59, -0,683,3,96,0, -683,3,96,6,683, -3,173,0,683,3, -93,0,683,3,53, -0,683,3,13,0, -683,3,170,0,683, -3,90,0,683,3, -50,0,683,3,87, -0,683,3,47,0, -683,3,100,0,683, -3,124,0,683,3, -84,0,683,3,44, -0,683,3,121,0, -683,3,81,0,683, -3,41,0,683,3, -1,0,683,3,59, -15,683,3,78,0, -683,3,38,0,683, -3,58,15,683,3, -115,0,683,3,75, -0,683,3,35,0, -683,3,192,0,683, -3,112,0,683,3, -72,0,683,3,32, -0,683,3,109,0, -683,3,69,0,683, -3,187,1,683,3, -106,0,683,3,66, -0,683,3,103,0, -683,3,77,0,683, -3,3,9,683,3, -118,0,683,3,60, -0,683,3,0,3, -683,3,197,1,683, -3,176,2,683,3, -57,0,683,3,70, -0,683,3,94,0, -683,3,54,0,683, -3,171,0,683,3, -91,0,683,3,51, -0,683,3,88,0, -683,3,48,0,683, -3,125,0,683,3, -85,0,683,3,56, -0,683,3,97,0, -683,3,122,0,683, -3,82,0,683,3, -42,0,683,3,0, -6,683,3,119,0, -683,3,79,0,683, -3,41,32,683,3, -116,0,683,3,76, -0,683,3,36,0, -683,3,113,0,683, -3,73,0,683,3, -33,0,683,3,110, -0,683,3,40,32, -683,3,0,224,683, -3,187,0,683,3, -107,0,683,3,67, -0,683,3,104,0, -683,3,64,0,683, -3,101,0,683,3, -61,0,683,3,178, -0,683,3,98,0, -683,3,45,0,683, -3,136,4,683,3, -95,0,683,3,55, -0,683,3,172,0, -683,3,92,0,683, -3,52,0,683,3, -89,0,683,3,49, -0,683,3,9,0, -683,3,126,0,683, -3,86,0,683,3, -46,0,683,3,123, -0,683,3,83,0, -683,3,43,0,683, -3,160,0,683,3, -120,0,683,3,80, -0,683,3,40,0, -683,686,11,1,1076, -0,165,1,-1,3, -42,0,687,12,1, -5450,688,5,0,689, -11,1,1037,0,165, -1,-1,690,11,1, -96,0,691,4,10, -83,0,76,0,65, -0,83,0,72,0, -1,-1,3,124,0, -692,12,1,3262,693, -5,1,3,124,0, -694,12,1,3267,695, -5,0,696,11,1, -191,0,697,4,26, -83,0,84,0,82, -0,79,0,75,0, -69,0,95,0,83, -0,84,0,82,0, -79,0,75,0,69, -0,1,-1,698,11, -1,165,0,699,4, -12,83,0,84,0, -82,0,79,0,75, -0,69,0,1,-1, -3,84,0,178,3, -44,0,700,12,1, -4950,701,5,0,702, -11,1,61,0,703, -4,10,67,0,79, -0,77,0,77,0, -65,0,1,-1,3, -121,0,178,3,81, -0,178,3,41,0, -704,12,1,7604,705, -5,0,706,11,1, -76,0,707,4,22, -82,0,73,0,71, -0,72,0,84,0, -95,0,80,0,65, -0,82,0,69,0, -78,0,1,-1,3, -118,0,708,12,1, -17610,709,5,63,3, -97,0,180,3,70, -0,180,3,105,0, -180,3,78,0,180, -3,51,0,180,3, -113,0,180,3,86, -0,180,3,121,0, -180,3,67,0,180, -3,102,0,180,3, -75,0,180,3,48, -0,180,3,110,0, -180,3,83,0,180, -3,56,0,180,3, -118,0,180,3,99, -0,180,3,72,0, -180,3,107,0,180, -3,80,0,180,3, -53,0,180,3,115, -0,180,3,88,0, -180,3,69,0,180, -3,104,0,180,3, -77,0,180,3,50, -0,180,3,112,0, -180,3,85,0,180, -3,120,0,180,3, -66,0,180,3,101, -0,710,12,1,17690, -711,5,63,3,97, -0,180,3,70,0, -180,3,105,0,180, -3,78,0,180,3, -51,0,180,3,113, -0,180,3,86,0, -180,3,121,0,180, -3,67,0,180,3, -102,0,180,3,75, -0,180,3,48,0, -180,3,110,0,180, -3,83,0,180,3, -56,0,180,3,118, -0,180,3,99,0, -712,12,1,17764,713, -5,63,3,97,0, -180,3,70,0,180, -3,105,0,180,3, -78,0,180,3,51, -0,180,3,113,0, -180,3,86,0,180, -3,121,0,180,3, -67,0,180,3,102, -0,180,3,75,0, -180,3,48,0,180, -3,110,0,180,3, -83,0,180,3,56, -0,180,3,118,0, -180,3,99,0,180, -3,72,0,180,3, -107,0,180,3,80, -0,180,3,53,0, -180,3,115,0,180, -3,88,0,180,3, -69,0,180,3,104, -0,180,3,77,0, -180,3,50,0,180, -3,112,0,180,3, -85,0,180,3,120, -0,180,3,66,0, -180,3,101,0,180, -3,74,0,180,3, -109,0,180,3,82, -0,180,3,55,0, -180,3,117,0,180, -3,90,0,180,3, -98,0,180,3,71, -0,180,3,106,0, -180,3,79,0,180, -3,52,0,180,3, -114,0,180,3,87, -0,180,3,122,0, -180,3,95,0,180, -3,68,0,180,3, -103,0,180,3,76, -0,180,3,49,0, -180,3,111,0,180, -3,84,0,180,3, -57,0,180,3,119, -0,180,3,65,0, -180,3,100,0,180, -3,73,0,180,3, -108,0,180,3,81, -0,180,3,54,0, -180,3,116,0,714, -12,1,17857,715,5, -63,3,97,0,180, -3,70,0,180,3, -105,0,180,3,78, -0,180,3,51,0, -180,3,113,0,180, -3,86,0,180,3, -121,0,180,3,67, -0,180,3,102,0, -180,3,75,0,180, -3,48,0,180,3, -110,0,180,3,83, -0,180,3,56,0, -180,3,118,0,180, -3,99,0,180,3, -72,0,180,3,107, -0,180,3,80,0, -180,3,53,0,180, -3,115,0,180,3, -88,0,180,3,69, -0,180,3,104,0, -180,3,77,0,180, -3,50,0,180,3, -112,0,180,3,85, -0,180,3,120,0, -180,3,66,0,180, -3,101,0,180,3, -74,0,180,3,109, -0,180,3,82,0, -180,3,55,0,180, -3,117,0,180,3, -90,0,180,3,98, -0,180,3,71,0, -180,3,106,0,180, -3,79,0,180,3, -52,0,180,3,114, -0,180,3,87,0, -180,3,122,0,180, -3,95,0,180,3, -68,0,180,3,103, -0,180,3,76,0, -180,3,49,0,180, -3,111,0,716,12, -1,17945,717,5,63, -3,97,0,180,3, -70,0,180,3,105, -0,180,3,78,0, -180,3,51,0,180, -3,113,0,180,3, -86,0,180,3,121, -0,180,3,67,0, -180,3,102,0,180, -3,75,0,180,3, -48,0,180,3,110, -0,180,3,83,0, -180,3,56,0,180, -3,118,0,180,3, -99,0,180,3,72, -0,180,3,107,0, -180,3,80,0,180, -3,53,0,180,3, -115,0,180,3,88, -0,180,3,69,0, -180,3,104,0,180, -3,77,0,180,3, -50,0,180,3,112, -0,180,3,85,0, -180,3,120,0,180, -3,66,0,180,3, -101,0,180,3,74, -0,180,3,109,0, -180,3,82,0,180, -3,55,0,180,3, -117,0,180,3,90, -0,180,3,98,0, -180,3,71,0,180, -3,106,0,180,3, -79,0,180,3,52, -0,180,3,114,0, -718,12,1,18030,719, -5,63,3,97,0, -180,3,70,0,180, -3,105,0,180,3, -78,0,180,3,51, -0,180,3,113,0, -180,3,86,0,180, -3,121,0,180,3, -67,0,180,3,102, -0,180,3,75,0, -180,3,48,0,180, -3,110,0,180,3, -83,0,180,3,56, -0,180,3,118,0, -180,3,99,0,180, -3,72,0,180,3, -107,0,180,3,80, -0,180,3,53,0, -180,3,115,0,180, -3,88,0,180,3, -69,0,180,3,104, -0,180,3,77,0, -180,3,50,0,180, -3,112,0,180,3, -85,0,180,3,120, -0,180,3,66,0, -180,3,101,0,180, -3,74,0,180,3, -109,0,180,3,82, -0,180,3,55,0, -180,3,117,0,180, -3,90,0,180,3, -98,0,180,3,71, -0,180,3,106,0, -180,3,79,0,180, -3,52,0,180,3, -114,0,180,3,87, -0,180,3,122,0, -180,3,95,0,180, -3,68,0,180,3, -103,0,180,3,76, -0,180,3,49,0, -180,3,111,0,180, -3,84,0,180,3, -57,0,180,3,119, -0,180,3,65,0, -180,3,100,0,180, -3,73,0,180,3, -108,0,180,3,81, -0,180,3,54,0, -180,3,116,0,180, -3,89,0,180,720, -11,1,320,0,721, -4,22,86,0,69, -0,67,0,84,0, -79,0,82,0,95, -0,84,0,89,0, -80,0,69,0,1, --1,3,87,0,180, -3,122,0,180,3, -95,0,180,3,68, -0,180,3,103,0, -180,3,76,0,180, -3,49,0,180,3, -111,0,180,3,84, -0,180,3,57,0, -180,3,119,0,180, -3,65,0,180,3, -100,0,180,3,73, -0,180,3,108,0, -180,3,81,0,180, -3,54,0,180,3, -116,0,180,3,89, -0,180,722,11,1, -867,0,183,1,-1, -3,84,0,180,3, -57,0,180,3,119, -0,180,3,65,0, -180,3,100,0,180, -3,73,0,180,3, -108,0,180,3,81, -0,180,3,54,0, -180,3,116,0,180, -3,89,0,180,723, -11,1,867,0,183, -1,-1,3,89,0, -180,724,11,1,867, -0,183,1,-1,3, -72,0,180,3,107, -0,180,3,80,0, -180,3,53,0,180, -3,115,0,180,3, -88,0,180,3,69, -0,180,3,104,0, -180,3,77,0,180, -3,50,0,180,3, -112,0,180,3,85, -0,180,3,120,0, -180,3,66,0,180, -3,101,0,180,3, -74,0,180,3,109, -0,180,3,82,0, -180,3,55,0,180, -3,117,0,180,3, -90,0,180,3,98, -0,180,3,71,0, -180,3,106,0,180, -3,79,0,180,3, -52,0,180,3,114, -0,180,3,87,0, -180,3,122,0,180, -3,95,0,180,3, -68,0,180,3,103, -0,180,3,76,0, -180,3,49,0,180, -3,111,0,180,3, -84,0,180,3,57, -0,180,3,119,0, -180,3,65,0,180, -3,100,0,180,3, -73,0,180,3,108, -0,180,3,81,0, -180,3,54,0,180, -3,116,0,180,3, -89,0,180,725,11, -1,867,0,183,1, --1,3,74,0,180, -3,109,0,180,3, -82,0,180,3,55, -0,180,3,117,0, -180,3,90,0,180, -3,98,0,180,3, -71,0,180,3,106, -0,180,3,79,0, -180,3,52,0,180, -3,114,0,180,3, -87,0,180,3,122, -0,180,3,95,0, -180,3,68,0,180, -3,103,0,180,3, -76,0,180,3,49, -0,180,3,111,0, -180,3,84,0,180, -3,57,0,180,3, -119,0,180,3,65, -0,180,3,100,0, -180,3,73,0,180, -3,108,0,180,3, -81,0,180,3,54, -0,180,3,116,0, -180,3,89,0,180, -726,11,1,867,0, -183,1,-1,3,78, -0,178,3,38,0, -727,12,1,6757,728, -5,1,3,38,0, -729,12,1,6777,730, -5,0,731,11,1, -185,0,732,4,14, -65,0,77,0,80, -0,95,0,65,0, -77,0,80,0,1, --1,733,11,1,160, -0,734,4,6,65, -0,77,0,80,0, -1,-1,3,115,0, -735,12,1,22173,736, -5,63,3,97,0, -180,3,70,0,180, -3,105,0,180,3, -78,0,180,3,51, -0,180,3,113,0, -180,3,86,0,180, -3,121,0,180,3, -67,0,180,3,102, -0,180,3,75,0, -180,3,48,0,180, -3,110,0,180,3, -83,0,180,3,56, -0,180,3,118,0, -180,3,99,0,180, -3,72,0,180,3, -107,0,180,3,80, -0,180,3,53,0, -180,3,115,0,180, -3,88,0,180,3, -69,0,180,3,104, -0,180,3,77,0, -180,3,50,0,180, -3,112,0,180,3, -85,0,180,3,120, -0,180,3,66,0, -180,3,101,0,737, -12,1,22253,738,5, -63,3,97,0,180, -3,70,0,180,3, -105,0,180,3,78, -0,180,3,51,0, -180,3,113,0,180, -3,86,0,180,3, -121,0,180,3,67, -0,180,3,102,0, -180,3,75,0,180, -3,48,0,180,3, -110,0,739,12,1, -22325,740,5,63,3, -97,0,180,3,70, -0,180,3,105,0, -180,3,78,0,180, -3,51,0,180,3, -113,0,180,3,86, -0,180,3,121,0, -180,3,67,0,180, -3,102,0,180,3, -75,0,180,3,48, -0,180,3,110,0, -180,3,83,0,180, -3,56,0,180,3, -118,0,180,3,99, -0,180,3,72,0, -180,3,107,0,180, -3,80,0,180,3, -53,0,180,3,115, -0,741,12,1,22401, -742,5,63,3,97, -0,180,3,70,0, -180,3,105,0,180, -3,78,0,180,3, -51,0,180,3,113, -0,180,3,86,0, -180,3,121,0,180, -3,67,0,180,3, -102,0,180,3,75, -0,180,3,48,0, -180,3,110,0,180, -3,83,0,180,3, -56,0,180,3,118, -0,180,3,99,0, -180,3,72,0,180, -3,107,0,180,3, -80,0,180,3,53, -0,180,3,115,0, -180,3,88,0,180, -3,69,0,180,3, -104,0,180,3,77, -0,180,3,50,0, -180,3,112,0,180, -3,85,0,180,3, -120,0,180,3,66, -0,180,3,101,0, -180,3,74,0,180, -3,109,0,180,3, -82,0,180,3,55, -0,180,3,117,0, -180,3,90,0,180, -3,98,0,180,3, -71,0,180,3,106, -0,180,3,79,0, -180,3,52,0,180, -3,114,0,180,3, -87,0,180,3,122, -0,180,3,95,0, -180,3,68,0,180, -3,103,0,180,3, -76,0,180,3,49, -0,180,3,111,0, -743,12,1,22489,744, -5,63,3,97,0, -180,3,70,0,180, -3,105,0,180,3, -78,0,180,3,51, -0,180,3,113,0, -180,3,86,0,180, -3,121,0,180,3, -67,0,180,3,102, -0,180,3,75,0, -180,3,48,0,180, -3,110,0,180,3, -83,0,180,3,56, -0,180,3,118,0, -180,3,99,0,180, -3,72,0,180,3, -107,0,180,3,80, -0,180,3,53,0, -180,3,115,0,180, -3,88,0,180,3, -69,0,180,3,104, -0,180,3,77,0, -180,3,50,0,180, -3,112,0,180,3, -85,0,180,3,120, -0,180,3,66,0, -180,3,101,0,180, -3,74,0,180,3, -109,0,180,3,82, -0,180,3,55,0, -180,3,117,0,180, -3,90,0,180,3, -98,0,180,3,71, -0,180,3,106,0, -180,3,79,0,180, -3,52,0,180,3, -114,0,745,12,1, -22574,746,5,63,3, -97,0,180,3,70, -0,180,3,105,0, -180,3,78,0,180, -3,51,0,180,3, -113,0,180,3,86, -0,180,3,121,0, -180,3,67,0,180, -3,102,0,180,3, -75,0,180,3,48, -0,180,3,110,0, -180,3,83,0,180, -3,56,0,180,3, -118,0,180,3,99, -0,180,3,72,0, -180,3,107,0,180, -3,80,0,180,3, -53,0,180,3,115, -0,180,3,88,0, -180,3,69,0,180, -3,104,0,180,3, -77,0,180,3,50, -0,180,3,112,0, -180,3,85,0,180, -3,120,0,180,3, -66,0,180,3,101, -0,180,3,74,0, -180,3,109,0,180, -3,82,0,180,3, -55,0,180,3,117, -0,180,3,90,0, -180,3,98,0,180, -3,71,0,180,3, -106,0,180,3,79, -0,180,3,52,0, -180,3,114,0,180, -3,87,0,180,3, -122,0,180,3,95, -0,180,3,68,0, -180,3,103,0,180, -3,76,0,180,3, -49,0,180,3,111, -0,180,3,84,0, -180,3,57,0,180, -3,119,0,180,3, -65,0,180,3,100, -0,180,3,73,0, -180,3,108,0,180, -3,81,0,180,3, -54,0,180,3,116, -0,180,3,89,0, -180,747,11,1,744, -0,748,4,24,83, -0,69,0,78,0, -83,0,79,0,82, -0,95,0,69,0, -86,0,69,0,78, -0,84,0,1,-1, -3,87,0,180,3, -122,0,180,3,95, -0,180,3,68,0, -180,3,103,0,180, -3,76,0,180,3, -49,0,180,3,111, -0,180,3,84,0, -180,3,57,0,180, -3,119,0,180,3, -65,0,180,3,100, -0,180,3,73,0, -180,3,108,0,180, -3,81,0,180,3, -54,0,180,3,116, -0,180,3,89,0, -180,749,11,1,867, -0,183,1,-1,3, -84,0,180,3,57, -0,180,3,119,0, -180,3,65,0,180, -3,100,0,180,3, -73,0,180,3,108, -0,180,3,81,0, -180,3,54,0,180, -3,116,0,180,3, -89,0,180,750,11, -1,867,0,183,1, --1,3,88,0,180, -3,69,0,180,3, -104,0,180,3,77, -0,180,3,50,0, -180,3,112,0,180, -3,85,0,180,3, -120,0,180,3,66, -0,180,3,101,0, -180,3,74,0,180, -3,109,0,180,3, -82,0,180,3,55, -0,180,3,117,0, -180,3,90,0,180, -3,98,0,180,3, -71,0,180,3,106, -0,180,3,79,0, -180,3,52,0,180, -3,114,0,180,3, -87,0,180,3,122, -0,180,3,95,0, -180,3,68,0,180, -3,103,0,180,3, -76,0,180,3,49, -0,180,3,111,0, -180,3,84,0,180, -3,57,0,180,3, -119,0,180,3,65, -0,180,3,100,0, -180,3,73,0,180, -3,108,0,180,3, -81,0,180,3,54, -0,180,3,116,0, -180,3,89,0,180, -751,11,1,867,0, -183,1,-1,3,83, -0,180,3,56,0, -180,3,118,0,180, -3,99,0,180,3, -72,0,180,3,107, -0,180,3,80,0, -180,3,53,0,180, -3,115,0,180,3, -88,0,180,3,69, -0,180,3,104,0, -180,3,77,0,180, -3,50,0,180,3, -112,0,180,3,85, -0,180,3,120,0, -180,3,66,0,180, -3,101,0,180,3, -74,0,180,3,109, -0,180,3,82,0, -180,3,55,0,180, -3,117,0,180,3, -90,0,180,3,98, -0,180,3,71,0, -180,3,106,0,180, -3,79,0,180,3, -52,0,180,3,114, -0,180,3,87,0, -180,3,122,0,180, -3,95,0,180,3, -68,0,180,3,103, -0,180,3,76,0, -180,3,49,0,180, -3,111,0,180,3, -84,0,180,3,57, -0,180,3,119,0, -180,3,65,0,180, -3,100,0,180,3, -73,0,180,3,108, -0,180,3,81,0, -180,3,54,0,180, -3,116,0,180,3, -89,0,180,752,11, -1,867,0,183,1, --1,3,74,0,180, -3,109,0,180,3, -82,0,180,3,55, -0,180,3,117,0, -180,3,90,0,180, -3,98,0,180,3, -71,0,180,3,106, -0,180,3,79,0, -180,3,52,0,180, -3,114,0,180,3, -87,0,180,3,122, -0,180,3,95,0, -180,3,68,0,180, -3,103,0,180,3, -76,0,180,3,49, -0,180,3,111,0, -180,3,84,0,180, -3,57,0,180,3, -119,0,180,3,65, -0,180,3,100,0, -180,3,73,0,180, -3,108,0,180,3, -81,0,180,3,54, -0,180,3,116,0, -753,12,1,22866,754, -5,63,3,97,0, -755,12,1,22933,756, -5,63,3,97,0, -180,3,70,0,180, -3,105,0,180,3, -78,0,180,3,51, -0,180,3,113,0, -180,3,86,0,180, -3,121,0,180,3, -67,0,180,3,102, -0,180,3,75,0, -180,3,48,0,180, -3,110,0,180,3, -83,0,180,3,56, -0,180,3,118,0, -180,3,99,0,180, -3,72,0,180,3, -107,0,180,3,80, -0,180,3,53,0, -180,3,115,0,180, -3,88,0,180,3, -69,0,180,3,104, -0,180,3,77,0, -180,3,50,0,180, -3,112,0,180,3, -85,0,180,3,120, -0,180,3,66,0, -180,3,101,0,180, -3,74,0,180,3, -109,0,180,3,82, -0,180,3,55,0, -180,3,117,0,180, -3,90,0,180,3, -98,0,180,3,71, -0,180,3,106,0, -180,3,79,0,180, -3,52,0,180,3, -114,0,180,3,87, -0,180,3,122,0, -180,3,95,0,180, -3,68,0,180,3, -103,0,180,3,76, -0,180,3,49,0, -180,3,111,0,180, -3,84,0,180,3, -57,0,180,3,119, -0,180,3,65,0, -180,3,100,0,180, -3,73,0,180,3, -108,0,180,3,81, -0,180,3,54,0, -180,3,116,0,757, -12,1,23026,758,5, -63,3,97,0,180, -3,70,0,180,3, -105,0,180,3,78, -0,180,3,51,0, -180,3,113,0,180, -3,86,0,180,3, -121,0,180,3,67, -0,180,3,102,0, -180,3,75,0,180, -3,48,0,180,3, -110,0,180,3,83, -0,180,3,56,0, -180,3,118,0,180, -3,99,0,180,3, -72,0,180,3,107, -0,180,3,80,0, -180,3,53,0,180, -3,115,0,180,3, -88,0,180,3,69, -0,180,3,104,0, -180,3,77,0,180, -3,50,0,180,3, -112,0,180,3,85, -0,180,3,120,0, -180,3,66,0,180, -3,101,0,759,12, -1,23106,760,5,63, -3,97,0,180,3, -70,0,180,3,105, -0,180,3,78,0, -180,3,51,0,180, -3,113,0,180,3, -86,0,180,3,121, -0,180,3,67,0, -180,3,102,0,180, -3,75,0,180,3, -48,0,180,3,110, -0,180,3,83,0, -180,3,56,0,180, -3,118,0,180,3, -99,0,180,3,72, -0,180,3,107,0, -180,3,80,0,180, -3,53,0,180,3, -115,0,180,3,88, -0,180,3,69,0, -180,3,104,0,180, -3,77,0,180,3, -50,0,180,3,112, -0,180,3,85,0, -180,3,120,0,180, -3,66,0,180,3, -101,0,180,3,74, -0,180,3,109,0, -180,3,82,0,180, -3,55,0,180,3, -117,0,180,3,90, -0,180,3,98,0, -180,3,71,0,180, -3,106,0,180,3, -79,0,180,3,52, -0,180,3,114,0, -180,3,87,0,180, -3,122,0,180,3, -95,0,761,12,1, -23142,762,5,63,3, -97,0,180,3,70, -0,180,3,105,0, -180,3,78,0,180, -3,51,0,180,3, -113,0,180,3,86, -0,180,3,121,0, -180,3,67,0,180, -3,102,0,180,3, -75,0,180,3,48, -0,180,3,110,0, -180,3,83,0,180, -3,56,0,180,3, -118,0,180,3,99, -0,180,3,72,0, -180,3,107,0,180, -3,80,0,180,3, -53,0,180,3,115, -0,180,3,88,0, -180,3,69,0,180, -3,104,0,180,3, -77,0,180,3,50, -0,180,3,112,0, -180,3,85,0,180, -3,120,0,180,3, -66,0,180,3,101, -0,763,12,1,23222, -764,5,63,3,97, -0,180,3,70,0, -180,3,105,0,180, -3,78,0,180,3, -51,0,180,3,113, -0,180,3,86,0, -180,3,121,0,180, -3,67,0,180,3, -102,0,180,3,75, -0,180,3,48,0, -180,3,110,0,765, -12,1,23294,766,5, -63,3,97,0,180, -3,70,0,180,3, -105,0,180,3,78, -0,180,3,51,0, -180,3,113,0,180, -3,86,0,180,3, -121,0,180,3,67, -0,180,3,102,0, -180,3,75,0,180, -3,48,0,180,3, -110,0,180,3,83, -0,180,3,56,0, -180,3,118,0,180, -3,99,0,180,3, -72,0,180,3,107, -0,180,3,80,0, -180,3,53,0,180, -3,115,0,180,3, -88,0,180,3,69, -0,180,3,104,0, -180,3,77,0,180, -3,50,0,180,3, -112,0,180,3,85, -0,180,3,120,0, -180,3,66,0,180, -3,101,0,180,3, -74,0,180,3,109, -0,180,3,82,0, -180,3,55,0,180, -3,117,0,180,3, -90,0,180,3,98, -0,180,3,71,0, -180,3,106,0,180, -3,79,0,180,3, -52,0,180,3,114, -0,180,3,87,0, -180,3,122,0,180, -3,95,0,180,3, -68,0,180,3,103, -0,180,3,76,0, -180,3,49,0,180, -3,111,0,180,3, -84,0,180,3,57, -0,180,3,119,0, -180,3,65,0,180, -3,100,0,180,3, -73,0,180,3,108, -0,180,3,81,0, -180,3,54,0,180, -3,116,0,767,12, -1,23387,768,5,63, -3,97,0,180,3, -70,0,180,3,105, -0,180,3,78,0, -180,3,51,0,180, -3,113,0,180,3, -86,0,180,3,121, -0,180,3,67,0, -180,3,102,0,180, -3,75,0,180,3, -48,0,180,3,110, -0,180,3,83,0, -180,3,56,0,180, -3,118,0,180,3, -99,0,180,3,72, -0,180,3,107,0, -180,3,80,0,180, -3,53,0,180,3, -115,0,180,3,88, -0,180,3,69,0, -180,3,104,0,180, -3,77,0,180,3, -50,0,180,3,112, -0,180,3,85,0, -180,3,120,0,180, -3,66,0,180,3, -101,0,180,3,74, -0,180,3,109,0, -180,3,82,0,180, -3,55,0,180,3, -117,0,180,3,90, -0,180,3,98,0, -180,3,71,0,180, -3,106,0,180,3, -79,0,180,3,52, -0,180,3,114,0, -769,12,1,23472,770, -5,63,3,97,0, -180,3,70,0,180, -3,105,0,180,3, -78,0,180,3,51, -0,180,3,113,0, -180,3,86,0,180, -3,121,0,771,12, -1,23542,772,5,63, -3,97,0,180,3, -70,0,180,3,105, -0,180,3,78,0, -180,3,51,0,180, -3,113,0,180,3, -86,0,180,3,121, -0,180,3,67,0, -180,3,102,0,180, -3,75,0,180,3, -48,0,180,3,110, -0,180,3,83,0, -180,3,56,0,180, -3,118,0,180,3, -99,0,180,3,72, -0,180,3,107,0, -180,3,80,0,180, -3,53,0,180,3, -115,0,180,3,88, -0,180,3,69,0, -180,3,104,0,180, -3,77,0,180,3, -50,0,180,3,112, -0,180,3,85,0, -180,3,120,0,180, -3,66,0,180,3, -101,0,180,3,74, -0,180,3,109,0, -180,3,82,0,180, -3,55,0,180,3, -117,0,180,3,90, -0,180,3,98,0, -180,3,71,0,180, -3,106,0,180,3, -79,0,180,3,52, -0,180,3,114,0, -180,3,87,0,180, -3,122,0,180,3, -95,0,180,3,68, -0,180,3,103,0, -180,3,76,0,180, -3,49,0,180,3, -111,0,180,3,84, -0,180,3,57,0, -180,3,119,0,180, -3,65,0,180,3, -100,0,180,3,73, -0,180,3,108,0, -180,3,81,0,180, -3,54,0,180,3, -116,0,180,3,89, -0,180,773,11,1, -754,0,774,4,34, -83,0,84,0,65, -0,84,0,69,0, -95,0,69,0,78, -0,84,0,82,0, -89,0,95,0,69, -0,86,0,69,0, -78,0,84,0,1, --1,3,67,0,180, -3,102,0,180,3, -75,0,180,3,48, -0,180,3,110,0, -180,3,83,0,180, -3,56,0,180,3, -118,0,180,3,99, -0,180,3,72,0, -180,3,107,0,180, -3,80,0,180,3, -53,0,180,3,115, -0,180,3,88,0, -180,3,69,0,180, -3,104,0,180,3, -77,0,180,3,50, -0,180,3,112,0, -180,3,85,0,180, -3,120,0,180,3, -66,0,180,3,101, -0,180,3,74,0, -180,3,109,0,180, -3,82,0,180,3, -55,0,180,3,117, -0,180,3,90,0, -180,3,98,0,180, -3,71,0,180,3, -106,0,180,3,79, -0,180,3,52,0, -180,3,114,0,180, -3,87,0,180,3, -122,0,180,3,95, -0,180,3,68,0, -180,3,103,0,180, -3,76,0,180,3, -49,0,180,3,111, -0,180,3,84,0, -180,3,57,0,180, -3,119,0,180,3, -65,0,180,3,100, -0,180,3,73,0, -180,3,108,0,180, -3,81,0,180,3, -54,0,180,3,116, -0,180,3,89,0, -180,775,11,1,867, -0,183,1,-1,3, -87,0,180,3,122, -0,180,3,95,0, -180,3,68,0,180, -3,103,0,180,3, -76,0,180,3,49, -0,180,3,111,0, -180,3,84,0,180, -3,57,0,180,3, -119,0,180,3,65, -0,180,3,100,0, -180,3,73,0,180, -3,108,0,180,3, -81,0,180,3,54, -0,180,3,116,0, -180,3,89,0,180, -776,11,1,867,0, -183,1,-1,3,89, -0,180,777,11,1, -867,0,183,1,-1, -3,83,0,180,3, -56,0,180,3,118, -0,180,3,99,0, -180,3,72,0,180, -3,107,0,180,3, -80,0,180,3,53, -0,180,3,115,0, -180,3,88,0,180, -3,69,0,180,3, -104,0,180,3,77, -0,180,3,50,0, -180,3,112,0,180, -3,85,0,180,3, -120,0,778,12,1, -23781,779,5,63,3, -97,0,180,3,70, -0,180,3,105,0, -780,12,1,23849,781, -5,63,3,97,0, -180,3,70,0,180, -3,105,0,180,3, -78,0,180,3,51, -0,180,3,113,0, -180,3,86,0,180, -3,121,0,180,3, -67,0,180,3,102, -0,180,3,75,0, -180,3,48,0,180, -3,110,0,180,3, -83,0,180,3,56, -0,180,3,118,0, -180,3,99,0,180, -3,72,0,180,3, -107,0,180,3,80, -0,180,3,53,0, -180,3,115,0,180, -3,88,0,180,3, -69,0,180,3,104, -0,180,3,77,0, -180,3,50,0,180, -3,112,0,180,3, -85,0,180,3,120, -0,180,3,66,0, -180,3,101,0,180, -3,74,0,180,3, -109,0,180,3,82, -0,180,3,55,0, -180,3,117,0,180, -3,90,0,180,3, -98,0,180,3,71, -0,180,3,106,0, -180,3,79,0,180, -3,52,0,180,3, -114,0,180,3,87, -0,180,3,122,0, -180,3,95,0,180, -3,68,0,180,3, -103,0,180,3,76, -0,180,3,49,0, -180,3,111,0,180, -3,84,0,180,3, -57,0,180,3,119, -0,180,3,65,0, -180,3,100,0,180, -3,73,0,180,3, -108,0,180,3,81, -0,180,3,54,0, -180,3,116,0,782, -12,1,23942,783,5, -63,3,97,0,180, -3,70,0,180,3, -105,0,180,3,78, -0,180,3,51,0, -180,3,113,0,180, -3,86,0,180,3, -121,0,180,3,67, -0,180,3,102,0, -180,3,75,0,180, -3,48,0,180,3, -110,0,180,3,83, -0,180,3,56,0, -180,3,118,0,180, -3,99,0,180,3, -72,0,180,3,107, -0,180,3,80,0, -180,3,53,0,180, -3,115,0,180,3, -88,0,180,3,69, -0,180,3,104,0, -180,3,77,0,180, -3,50,0,180,3, -112,0,180,3,85, -0,180,3,120,0, -180,3,66,0,180, -3,101,0,180,3, -74,0,180,3,109, -0,180,3,82,0, -180,3,55,0,180, -3,117,0,180,3, -90,0,180,3,98, -0,180,3,71,0, -180,3,106,0,180, -3,79,0,180,3, -52,0,180,3,114, -0,180,3,87,0, -180,3,122,0,180, -3,95,0,180,3, -68,0,180,3,103, -0,180,3,76,0, -180,3,49,0,180, -3,111,0,180,3, -84,0,180,3,57, -0,180,3,119,0, -180,3,65,0,180, -3,100,0,180,3, -73,0,180,3,108, -0,180,3,81,0, -180,3,54,0,180, -3,116,0,180,3, -89,0,180,784,11, -1,769,0,785,4, -32,83,0,84,0, -65,0,84,0,69, -0,95,0,69,0, -88,0,73,0,84, -0,95,0,69,0, -86,0,69,0,78, -0,84,0,1,-1, -3,89,0,180,786, -11,1,867,0,183, -1,-1,3,78,0, -180,3,51,0,180, -3,113,0,180,3, -86,0,180,3,121, -0,180,3,67,0, -180,3,102,0,180, -3,75,0,180,3, -48,0,180,3,110, -0,180,3,83,0, -180,3,56,0,180, -3,118,0,180,3, -99,0,180,3,72, -0,180,3,107,0, -180,3,80,0,180, -3,53,0,180,3, -115,0,180,3,88, -0,180,3,69,0, -180,3,104,0,180, -3,77,0,180,3, -50,0,180,3,112, -0,180,3,85,0, -180,3,120,0,180, -3,66,0,180,3, -101,0,180,3,74, -0,180,3,109,0, -180,3,82,0,180, -3,55,0,180,3, -117,0,180,3,90, -0,180,3,98,0, -180,3,71,0,180, -3,106,0,180,3, -79,0,180,3,52, -0,180,3,114,0, -180,3,87,0,180, -3,122,0,180,3, -95,0,180,3,68, -0,180,3,103,0, -180,3,76,0,180, -3,49,0,180,3, -111,0,180,3,84, -0,180,3,57,0, -180,3,119,0,180, -3,65,0,180,3, -100,0,180,3,73, -0,180,3,108,0, -180,3,81,0,180, -3,54,0,180,3, -116,0,180,3,89, -0,180,787,11,1, -867,0,183,1,-1, -3,66,0,180,3, -101,0,180,3,74, -0,180,3,109,0, -180,3,82,0,180, -3,55,0,180,3, -117,0,180,3,90, -0,180,3,98,0, -180,3,71,0,180, -3,106,0,180,3, -79,0,180,3,52, -0,180,3,114,0, -180,3,87,0,180, -3,122,0,180,3, -95,0,180,3,68, -0,180,3,103,0, -180,3,76,0,180, -3,49,0,180,3, -111,0,180,3,84, -0,180,3,57,0, -180,3,119,0,180, -3,65,0,180,3, -100,0,180,3,73, -0,180,3,108,0, -180,3,81,0,180, -3,54,0,180,3, -116,0,180,3,89, -0,180,788,11,1, -867,0,183,1,-1, -3,74,0,180,3, -109,0,180,3,82, -0,180,3,55,0, -180,3,117,0,180, -3,90,0,180,3, -98,0,180,3,71, -0,180,3,106,0, -180,3,79,0,180, -3,52,0,180,3, -114,0,180,3,87, -0,180,3,122,0, -180,3,95,0,180, -3,68,0,180,3, -103,0,180,3,76, -0,180,3,49,0, -180,3,111,0,180, -3,84,0,180,3, -57,0,180,3,119, -0,180,3,65,0, -180,3,100,0,180, -3,73,0,180,3, -108,0,180,3,81, -0,180,3,54,0, -180,3,116,0,180, -3,89,0,180,789, -11,1,867,0,183, -1,-1,3,68,0, -180,3,103,0,180, -3,76,0,180,3, -49,0,180,3,111, -0,180,3,84,0, -180,3,57,0,180, -3,119,0,180,3, -65,0,180,3,100, -0,180,3,73,0, -180,3,108,0,180, -3,81,0,180,3, -54,0,180,3,116, -0,180,3,89,0, -180,790,11,1,256, -0,791,4,10,83, -0,84,0,65,0, -84,0,69,0,1, --1,3,74,0,180, -3,109,0,180,3, -82,0,180,3,55, -0,180,3,117,0, -180,3,90,0,180, -3,98,0,180,3, -71,0,180,3,106, -0,180,3,79,0, -180,3,52,0,180, -3,114,0,180,3, -87,0,180,3,122, -0,180,3,95,0, -180,3,68,0,180, -3,103,0,180,3, -76,0,180,3,49, -0,180,3,111,0, -180,3,84,0,180, -3,57,0,180,3, -119,0,180,3,65, -0,180,3,100,0, -180,3,73,0,180, -3,108,0,180,3, -81,0,180,3,54, -0,180,3,116,0, -180,3,89,0,180, -792,11,1,867,0, -183,1,-1,3,89, -0,180,793,11,1, -867,0,183,1,-1, -3,70,0,180,3, -105,0,180,3,78, -0,180,3,51,0, -180,3,113,0,180, -3,86,0,180,3, -121,0,180,3,67, -0,180,3,102,0, -180,3,75,0,180, -3,48,0,180,3, -110,0,180,3,83, -0,180,3,56,0, -180,3,118,0,180, -3,99,0,180,3, -72,0,180,3,107, -0,180,3,80,0, -180,3,53,0,180, -3,115,0,180,3, -88,0,180,3,69, -0,180,3,104,0, -180,3,77,0,180, -3,50,0,180,3, -112,0,180,3,85, -0,180,3,120,0, -180,3,66,0,180, -3,101,0,180,3, -74,0,180,3,109, -0,180,3,82,0, -180,3,55,0,180, -3,117,0,180,3, -90,0,180,3,98, -0,180,3,71,0, -180,3,106,0,180, -3,79,0,180,3, -52,0,180,3,114, -0,794,12,1,24391, -795,5,63,3,97, -0,180,3,70,0, -180,3,105,0,796, -12,1,24459,797,5, -63,3,97,0,180, -3,70,0,180,3, -105,0,180,3,78, -0,180,3,51,0, -180,3,113,0,180, -3,86,0,180,3, -121,0,180,3,67, -0,180,3,102,0, -180,3,75,0,180, -3,48,0,180,3, -110,0,798,12,1, -24531,799,5,63,3, -97,0,180,3,70, -0,180,3,105,0, -180,3,78,0,180, -3,51,0,180,3, -113,0,180,3,86, -0,180,3,121,0, -180,3,67,0,180, -3,102,0,180,3, -75,0,180,3,48, -0,180,3,110,0, -180,3,83,0,180, -3,56,0,180,3, -118,0,180,3,99, -0,180,3,72,0, -180,3,107,0,180, -3,80,0,180,3, -53,0,180,3,115, -0,180,3,88,0, -180,3,69,0,180, -3,104,0,180,3, -77,0,180,3,50, -0,180,3,112,0, -180,3,85,0,180, -3,120,0,180,3, -66,0,180,3,101, -0,180,3,74,0, -180,3,109,0,180, -3,82,0,180,3, -55,0,180,3,117, -0,180,3,90,0, -180,3,98,0,180, -3,71,0,180,3, -106,0,180,3,79, -0,180,3,52,0, -180,3,114,0,180, -3,87,0,180,3, -122,0,180,3,95, -0,180,3,68,0, -180,3,103,0,800, -12,1,24618,801,5, -63,3,97,0,180, -3,70,0,180,3, -105,0,180,3,78, -0,180,3,51,0, -180,3,113,0,180, -3,86,0,180,3, -121,0,180,3,67, -0,180,3,102,0, -180,3,75,0,180, -3,48,0,180,3, -110,0,180,3,83, -0,180,3,56,0, -180,3,118,0,180, -3,99,0,180,3, -72,0,180,3,107, -0,180,3,80,0, -180,3,53,0,180, -3,115,0,180,3, -88,0,180,3,69, -0,180,3,104,0, -180,3,77,0,180, -3,50,0,180,3, -112,0,180,3,85, -0,180,3,120,0, -180,3,66,0,180, -3,101,0,180,3, -74,0,180,3,109, -0,180,3,82,0, -180,3,55,0,180, -3,117,0,180,3, -90,0,180,3,98, -0,180,3,71,0, -180,3,106,0,180, -3,79,0,180,3, -52,0,180,3,114, -0,180,3,87,0, -180,3,122,0,180, -3,95,0,180,3, -68,0,180,3,103, -0,180,3,76,0, -180,3,49,0,180, -3,111,0,180,3, -84,0,180,3,57, -0,180,3,119,0, -180,3,65,0,180, -3,100,0,180,3, -73,0,180,3,108, -0,180,3,81,0, -180,3,54,0,180, -3,116,0,180,3, -89,0,180,802,11, -1,303,0,803,4, -22,83,0,84,0, -82,0,73,0,78, -0,71,0,95,0, -84,0,89,0,80, -0,69,0,1,-1, -3,76,0,180,3, -49,0,180,3,111, -0,180,3,84,0, -180,3,57,0,180, -3,119,0,180,3, -65,0,180,3,100, -0,180,3,73,0, -180,3,108,0,180, -3,81,0,180,3, -54,0,180,3,116, -0,180,3,89,0, -180,804,11,1,867, -0,183,1,-1,3, -83,0,180,3,56, -0,180,3,118,0, -180,3,99,0,180, -3,72,0,180,3, -107,0,180,3,80, -0,180,3,53,0, -180,3,115,0,180, -3,88,0,180,3, -69,0,180,3,104, -0,180,3,77,0, -180,3,50,0,180, -3,112,0,180,3, -85,0,180,3,120, -0,180,3,66,0, -180,3,101,0,180, -3,74,0,180,3, -109,0,180,3,82, -0,180,3,55,0, -180,3,117,0,180, -3,90,0,180,3, -98,0,180,3,71, -0,180,3,106,0, -180,3,79,0,180, -3,52,0,180,3, -114,0,180,3,87, -0,180,3,122,0, -180,3,95,0,180, -3,68,0,180,3, -103,0,180,3,76, -0,180,3,49,0, -180,3,111,0,180, -3,84,0,180,3, -57,0,180,3,119, -0,180,3,65,0, -180,3,100,0,180, -3,73,0,180,3, -108,0,180,3,81, -0,180,3,54,0, -180,3,116,0,180, -3,89,0,180,805, -11,1,867,0,183, -1,-1,3,78,0, -180,3,51,0,180, -3,113,0,180,3, -86,0,180,3,121, -0,180,3,67,0, -180,3,102,0,180, -3,75,0,180,3, -48,0,180,3,110, -0,180,3,83,0, -180,3,56,0,180, -3,118,0,180,3, -99,0,180,3,72, -0,180,3,107,0, -180,3,80,0,180, -3,53,0,180,3, -115,0,180,3,88, -0,180,3,69,0, -180,3,104,0,180, -3,77,0,180,3, -50,0,180,3,112, -0,180,3,85,0, -180,3,120,0,180, -3,66,0,180,3, -101,0,180,3,74, -0,180,3,109,0, -180,3,82,0,180, -3,55,0,180,3, -117,0,180,3,90, -0,180,3,98,0, -180,3,71,0,180, -3,106,0,180,3, -79,0,180,3,52, -0,180,3,114,0, -180,3,87,0,180, -3,122,0,180,3, -95,0,180,3,68, -0,180,3,103,0, -180,3,76,0,180, -3,49,0,180,3, -111,0,180,3,84, -0,180,3,57,0, -180,3,119,0,180, -3,65,0,180,3, -100,0,180,3,73, -0,180,3,108,0, -180,3,81,0,180, -3,54,0,180,3, -116,0,180,3,89, -0,180,806,11,1, -867,0,183,1,-1, -3,87,0,180,3, -122,0,180,3,95, -0,180,3,68,0, -180,3,103,0,180, -3,76,0,180,3, -49,0,180,3,111, -0,180,3,84,0, -180,3,57,0,180, -3,119,0,180,3, -65,0,180,3,100, -0,180,3,73,0, -180,3,108,0,180, -3,81,0,180,3, -54,0,180,3,116, -0,180,3,89,0, -180,807,11,1,867, -0,183,1,-1,3, -89,0,180,808,11, -1,867,0,183,1, --1,3,75,0,178, -3,112,0,178,3, -72,0,178,3,32, -0,672,3,109,0, -809,12,1,28058,810, -5,63,3,97,0, -180,3,70,0,180, -3,105,0,180,3, -78,0,180,3,51, -0,180,3,113,0, -180,3,86,0,180, -3,121,0,180,3, -67,0,180,3,102, -0,180,3,75,0, -180,3,48,0,180, -3,110,0,180,3, -83,0,180,3,56, -0,180,3,118,0, -180,3,99,0,180, -3,72,0,180,3, -107,0,180,3,80, -0,180,3,53,0, -180,3,115,0,180, -3,88,0,180,3, -69,0,180,3,104, -0,180,3,77,0, -180,3,50,0,180, -3,112,0,180,3, -85,0,180,3,120, -0,180,3,66,0, -180,3,101,0,180, -3,74,0,180,3, -109,0,180,3,82, -0,180,3,55,0, -180,3,117,0,180, -3,90,0,180,3, -98,0,180,3,71, -0,180,3,106,0, -180,3,79,0,180, -3,52,0,180,3, -114,0,180,3,87, -0,180,3,122,0, -180,3,95,0,180, -3,68,0,180,3, -103,0,180,3,76, -0,180,3,49,0, -180,3,111,0,811, -12,1,28146,812,5, -63,3,97,0,180, -3,70,0,180,3, -105,0,180,3,78, -0,180,3,51,0, -180,3,113,0,180, -3,86,0,180,3, -121,0,180,3,67, -0,180,3,102,0, -180,3,75,0,180, -3,48,0,180,3, -110,0,813,12,1, -28218,814,5,63,3, -97,0,180,3,70, -0,180,3,105,0, -180,3,78,0,180, -3,51,0,180,3, -113,0,180,3,86, -0,180,3,121,0, -180,3,67,0,180, -3,102,0,180,3, -75,0,180,3,48, -0,180,3,110,0, -180,3,83,0,180, -3,56,0,180,3, -118,0,180,3,99, -0,180,3,72,0, -180,3,107,0,180, -3,80,0,180,3, -53,0,180,3,115, -0,180,3,88,0, -180,3,69,0,180, -3,104,0,180,3, -77,0,180,3,50, -0,180,3,112,0, -180,3,85,0,180, -3,120,0,180,3, -66,0,180,3,101, -0,815,12,1,28298, -816,5,63,3,97, -0,180,3,70,0, -180,3,105,0,180, -3,78,0,180,3, -51,0,180,3,113, -0,180,3,86,0, -180,3,121,0,817, -12,1,28368,818,5, -63,3,97,0,180, -3,70,0,180,3, -105,0,180,3,78, -0,180,3,51,0, -180,3,113,0,180, -3,86,0,180,3, -121,0,180,3,67, -0,180,3,102,0, -180,3,75,0,180, -3,48,0,180,3, -110,0,180,3,83, -0,180,3,56,0, -180,3,118,0,180, -3,99,0,180,3, -72,0,180,3,107, -0,180,3,80,0, -180,3,53,0,180, -3,115,0,180,3, -88,0,180,3,69, -0,180,3,104,0, -180,3,77,0,180, -3,50,0,180,3, -112,0,180,3,85, -0,180,3,120,0, -180,3,66,0,180, -3,101,0,180,3, -74,0,180,3,109, -0,180,3,82,0, -180,3,55,0,180, -3,117,0,180,3, -90,0,180,3,98, -0,180,3,71,0, -180,3,106,0,180, -3,79,0,180,3, -52,0,180,3,114, -0,180,3,87,0, -180,3,122,0,180, -3,95,0,180,3, -68,0,180,3,103, -0,180,3,76,0, -180,3,49,0,180, -3,111,0,180,3, -84,0,180,3,57, -0,180,3,119,0, -180,3,65,0,180, -3,100,0,180,3, -73,0,180,3,108, -0,180,3,81,0, -180,3,54,0,180, -3,116,0,180,3, -89,0,180,819,11, -1,591,0,820,4, -22,77,0,79,0, -78,0,69,0,89, -0,95,0,69,0, -86,0,69,0,78, -0,84,0,1,-1, -3,67,0,180,3, -102,0,180,3,75, -0,180,3,48,0, -180,3,110,0,180, -3,83,0,180,3, -56,0,180,3,118, -0,180,3,99,0, -180,3,72,0,180, -3,107,0,180,3, -80,0,180,3,53, -0,180,3,115,0, -180,3,88,0,180, -3,69,0,180,3, -104,0,180,3,77, -0,180,3,50,0, -180,3,112,0,180, -3,85,0,180,3, -120,0,180,3,66, -0,180,3,101,0, -180,3,74,0,180, -3,109,0,180,3, -82,0,180,3,55, -0,180,3,117,0, -180,3,90,0,180, -3,98,0,180,3, -71,0,180,3,106, -0,180,3,79,0, -180,3,52,0,180, -3,114,0,180,3, -87,0,180,3,122, -0,180,3,95,0, -180,3,68,0,180, -3,103,0,180,3, -76,0,180,3,49, -0,180,3,111,0, -180,3,84,0,180, -3,57,0,180,3, -119,0,180,3,65, -0,180,3,100,0, -180,3,73,0,180, -3,108,0,180,3, -81,0,180,3,54, -0,180,3,116,0, -180,3,89,0,180, -821,11,1,867,0, -183,1,-1,3,74, -0,180,3,109,0, -180,3,82,0,180, -3,55,0,180,3, -117,0,180,3,90, -0,180,3,98,0, -180,3,71,0,180, -3,106,0,180,3, -79,0,180,3,52, -0,180,3,114,0, -180,3,87,0,180, -3,122,0,180,3, -95,0,180,3,68, -0,180,3,103,0, -180,3,76,0,180, -3,49,0,180,3, -111,0,180,3,84, -0,180,3,57,0, -180,3,119,0,180, -3,65,0,180,3, -100,0,180,3,73, -0,180,3,108,0, -180,3,81,0,180, -3,54,0,180,3, -116,0,180,3,89, -0,180,822,11,1, -867,0,183,1,-1, -3,83,0,180,3, -56,0,180,3,118, -0,823,12,1,28579, -824,5,63,3,97, -0,180,3,70,0, -180,3,105,0,825, -12,1,28647,826,5, -63,3,97,0,180, -3,70,0,180,3, -105,0,180,3,78, -0,180,3,51,0, -180,3,113,0,180, -3,86,0,180,3, -121,0,180,3,67, -0,180,3,102,0, -180,3,75,0,180, -3,48,0,180,3, -110,0,827,12,1, -28719,828,5,63,3, -97,0,180,3,70, -0,180,3,105,0, -180,3,78,0,180, -3,51,0,180,3, -113,0,180,3,86, -0,180,3,121,0, -180,3,67,0,180, -3,102,0,180,3, -75,0,180,3,48, -0,180,3,110,0, -180,3,83,0,180, -3,56,0,180,3, -118,0,180,3,99, -0,180,3,72,0, -180,3,107,0,180, -3,80,0,180,3, -53,0,180,3,115, -0,180,3,88,0, -180,3,69,0,180, -3,104,0,180,3, -77,0,180,3,50, -0,180,3,112,0, -180,3,85,0,180, -3,120,0,180,3, -66,0,180,3,101, -0,180,3,74,0, -180,3,109,0,180, -3,82,0,180,3, -55,0,180,3,117, -0,180,3,90,0, -180,3,98,0,180, -3,71,0,180,3, -106,0,180,3,79, -0,180,3,52,0, -180,3,114,0,180, -3,87,0,180,3, -122,0,180,3,95, -0,180,3,68,0, -180,3,103,0,829, -12,1,28806,830,5, -63,3,97,0,180, -3,70,0,180,3, -105,0,180,3,78, -0,180,3,51,0, -180,3,113,0,180, -3,86,0,180,3, -121,0,180,3,67, -0,180,3,102,0, -180,3,75,0,180, -3,48,0,180,3, -110,0,180,3,83, -0,180,3,56,0, -180,3,118,0,180, -3,99,0,180,3, -72,0,180,3,107, -0,180,3,80,0, -180,3,53,0,180, -3,115,0,180,3, -88,0,180,3,69, -0,180,3,104,0, -180,3,77,0,180, -3,50,0,180,3, -112,0,180,3,85, -0,180,3,120,0, -180,3,66,0,180, -3,101,0,180,3, -74,0,180,3,109, -0,180,3,82,0, -180,3,55,0,180, -3,117,0,180,3, -90,0,180,3,98, -0,180,3,71,0, -180,3,106,0,180, -3,79,0,180,3, -52,0,180,3,114, -0,180,3,87,0, -180,3,122,0,180, -3,95,0,831,12, -1,28842,832,5,63, -3,97,0,180,3, -70,0,180,3,105, -0,180,3,78,0, -180,3,51,0,180, -3,113,0,180,3, -86,0,180,3,121, -0,180,3,67,0, -180,3,102,0,180, -3,75,0,180,3, -48,0,180,3,110, -0,180,3,83,0, -180,3,56,0,180, -3,118,0,180,3, -99,0,180,3,72, -0,180,3,107,0, -180,3,80,0,180, -3,53,0,180,3, -115,0,833,12,1, -28918,834,5,63,3, -97,0,180,3,70, -0,180,3,105,0, -180,3,78,0,180, -3,51,0,180,3, -113,0,180,3,86, -0,180,3,121,0, -180,3,67,0,180, -3,102,0,180,3, -75,0,180,3,48, -0,180,3,110,0, -180,3,83,0,180, -3,56,0,180,3, -118,0,180,3,99, -0,180,3,72,0, -180,3,107,0,180, -3,80,0,180,3, -53,0,180,3,115, -0,180,3,88,0, -180,3,69,0,180, -3,104,0,180,3, -77,0,180,3,50, -0,180,3,112,0, -180,3,85,0,180, -3,120,0,180,3, -66,0,180,3,101, -0,180,3,74,0, -180,3,109,0,180, -3,82,0,180,3, -55,0,180,3,117, -0,180,3,90,0, -180,3,98,0,180, -3,71,0,180,3, -106,0,180,3,79, -0,180,3,52,0, -180,3,114,0,180, -3,87,0,180,3, -122,0,180,3,95, -0,180,3,68,0, -180,3,103,0,180, -3,76,0,180,3, -49,0,180,3,111, -0,180,3,84,0, -180,3,57,0,180, -3,119,0,180,3, -65,0,180,3,100, -0,180,3,73,0, -180,3,108,0,180, -3,81,0,180,3, -54,0,180,3,116, -0,835,12,1,29011, -836,5,63,3,97, -0,837,12,1,29078, -838,5,63,3,97, -0,180,3,70,0, -180,3,105,0,180, -3,78,0,180,3, -51,0,180,3,113, -0,180,3,86,0, -180,3,121,0,180, -3,67,0,180,3, -102,0,180,3,75, -0,180,3,48,0, -180,3,110,0,180, -3,83,0,180,3, -56,0,180,3,118, -0,180,3,99,0, -180,3,72,0,180, -3,107,0,180,3, -80,0,180,3,53, -0,180,3,115,0, -180,3,88,0,180, -3,69,0,180,3, -104,0,180,3,77, -0,180,3,50,0, -180,3,112,0,180, -3,85,0,180,3, -120,0,180,3,66, -0,180,3,101,0, -180,3,74,0,180, -3,109,0,180,3, -82,0,180,3,55, -0,180,3,117,0, -180,3,90,0,180, -3,98,0,180,3, -71,0,180,3,106, -0,180,3,79,0, -180,3,52,0,180, -3,114,0,839,12, -1,29163,840,5,63, -3,97,0,180,3, -70,0,180,3,105, -0,180,3,78,0, -180,3,51,0,180, -3,113,0,180,3, -86,0,180,3,121, -0,180,3,67,0, -180,3,102,0,180, -3,75,0,180,3, -48,0,180,3,110, -0,180,3,83,0, -180,3,56,0,180, -3,118,0,180,3, -99,0,180,3,72, -0,180,3,107,0, -180,3,80,0,180, -3,53,0,180,3, -115,0,180,3,88, -0,180,3,69,0, -180,3,104,0,180, -3,77,0,180,3, -50,0,180,3,112, -0,180,3,85,0, -180,3,120,0,180, -3,66,0,180,3, -101,0,180,3,74, -0,180,3,109,0, -180,3,82,0,180, -3,55,0,180,3, -117,0,180,3,90, -0,180,3,98,0, -180,3,71,0,180, -3,106,0,180,3, -79,0,180,3,52, -0,180,3,114,0, -180,3,87,0,180, -3,122,0,180,3, -95,0,180,3,68, -0,180,3,103,0, -180,3,76,0,180, -3,49,0,180,3, -111,0,180,3,84, -0,180,3,57,0, -180,3,119,0,180, -3,65,0,180,3, -100,0,180,3,73, -0,180,3,108,0, -180,3,81,0,180, -3,54,0,180,3, -116,0,841,12,1, -29256,842,5,63,3, -97,0,180,3,70, -0,180,3,105,0, -180,3,78,0,180, -3,51,0,180,3, -113,0,180,3,86, -0,180,3,121,0, -180,3,67,0,180, -3,102,0,180,3, -75,0,180,3,48, -0,180,3,110,0, -180,3,83,0,180, -3,56,0,180,3, -118,0,180,3,99, -0,180,3,72,0, -180,3,107,0,180, -3,80,0,180,3, -53,0,180,3,115, -0,180,3,88,0, -180,3,69,0,180, -3,104,0,180,3, -77,0,180,3,50, -0,180,3,112,0, -180,3,85,0,180, -3,120,0,180,3, -66,0,180,3,101, -0,180,3,74,0, -180,3,109,0,180, -3,82,0,180,3, -55,0,180,3,117, -0,180,3,90,0, -180,3,98,0,180, -3,71,0,180,3, -106,0,180,3,79, -0,180,3,52,0, -180,3,114,0,180, -3,87,0,180,3, -122,0,180,3,95, -0,180,3,68,0, -180,3,103,0,180, -3,76,0,180,3, -49,0,180,3,111, -0,180,3,84,0, -180,3,57,0,180, -3,119,0,180,3, -65,0,180,3,100, -0,180,3,73,0, -180,3,108,0,180, -3,81,0,180,3, -54,0,180,3,116, -0,180,3,89,0, -180,843,11,1,614, -0,844,4,36,77, -0,79,0,86,0, -73,0,78,0,71, -0,95,0,83,0, -84,0,65,0,82, -0,84,0,95,0, -69,0,86,0,69, -0,78,0,84,0, -1,-1,3,89,0, -180,845,11,1,867, -0,183,1,-1,3, -87,0,180,3,122, -0,180,3,95,0, -180,3,68,0,180, -3,103,0,180,3, -76,0,180,3,49, -0,180,3,111,0, -180,3,84,0,180, -3,57,0,180,3, -119,0,180,3,65, -0,180,3,100,0, -180,3,73,0,180, -3,108,0,180,3, -81,0,180,3,54, -0,180,3,116,0, -180,3,89,0,180, -846,11,1,867,0, -183,1,-1,3,70, -0,180,3,105,0, -180,3,78,0,180, -3,51,0,180,3, -113,0,180,3,86, -0,180,3,121,0, -180,3,67,0,180, -3,102,0,180,3, -75,0,180,3,48, -0,180,3,110,0, -180,3,83,0,180, -3,56,0,180,3, -118,0,180,3,99, -0,180,3,72,0, -180,3,107,0,180, -3,80,0,180,3, -53,0,180,3,115, -0,180,3,88,0, -180,3,69,0,180, -3,104,0,180,3, -77,0,180,3,50, -0,180,3,112,0, -180,3,85,0,180, -3,120,0,180,3, -66,0,180,3,101, -0,180,3,74,0, -180,3,109,0,180, -3,82,0,180,3, -55,0,180,3,117, -0,180,3,90,0, -180,3,98,0,180, -3,71,0,180,3, -106,0,180,3,79, -0,180,3,52,0, -180,3,114,0,180, -3,87,0,180,3, -122,0,180,3,95, -0,180,3,68,0, -180,3,103,0,180, -3,76,0,180,3, -49,0,180,3,111, -0,180,3,84,0, -180,3,57,0,180, -3,119,0,180,3, -65,0,180,3,100, -0,180,3,73,0, -180,3,108,0,180, -3,81,0,180,3, -54,0,180,3,116, -0,180,3,89,0, -180,847,11,1,867, -0,183,1,-1,3, -89,0,180,848,11, -1,867,0,183,1, --1,3,88,0,180, -3,69,0,180,3, -104,0,180,3,77, -0,180,3,50,0, -180,3,112,0,180, -3,85,0,180,3, -120,0,180,3,66, -0,180,3,101,0, -849,12,1,29522,850, -5,63,3,97,0, -180,3,70,0,180, -3,105,0,180,3, -78,0,180,3,51, -0,180,3,113,0, -180,3,86,0,180, -3,121,0,180,3, -67,0,180,3,102, -0,180,3,75,0, -180,3,48,0,180, -3,110,0,851,12, -1,29594,852,5,63, -3,97,0,180,3, -70,0,180,3,105, -0,180,3,78,0, -180,3,51,0,180, -3,113,0,180,3, -86,0,180,3,121, -0,180,3,67,0, -180,3,102,0,180, -3,75,0,180,3, -48,0,180,3,110, -0,180,3,83,0, -180,3,56,0,180, -3,118,0,180,3, -99,0,180,3,72, -0,180,3,107,0, -180,3,80,0,180, -3,53,0,180,3, -115,0,180,3,88, -0,180,3,69,0, -180,3,104,0,180, -3,77,0,180,3, -50,0,180,3,112, -0,180,3,85,0, -180,3,120,0,180, -3,66,0,180,3, -101,0,180,3,74, -0,180,3,109,0, -180,3,82,0,180, -3,55,0,180,3, -117,0,180,3,90, -0,180,3,98,0, -180,3,71,0,180, -3,106,0,180,3, -79,0,180,3,52, -0,180,3,114,0, -180,3,87,0,180, -3,122,0,180,3, -95,0,180,3,68, -0,180,3,103,0, -180,3,76,0,180, -3,49,0,180,3, -111,0,180,3,84, -0,180,3,57,0, -180,3,119,0,180, -3,65,0,180,3, -100,0,853,12,1, -29684,854,5,63,3, -97,0,180,3,70, -0,180,3,105,0, -180,3,78,0,180, -3,51,0,180,3, -113,0,180,3,86, -0,180,3,121,0, -180,3,67,0,180, -3,102,0,180,3, -75,0,180,3,48, -0,180,3,110,0, -180,3,83,0,180, -3,56,0,180,3, -118,0,180,3,99, -0,180,3,72,0, -180,3,107,0,180, -3,80,0,180,3, -53,0,180,3,115, -0,180,3,88,0, -180,3,69,0,180, -3,104,0,180,3, -77,0,180,3,50, -0,180,3,112,0, -180,3,85,0,180, -3,120,0,180,3, -66,0,180,3,101, -0,180,3,74,0, -180,3,109,0,180, -3,82,0,180,3, -55,0,180,3,117, -0,180,3,90,0, -180,3,98,0,180, -3,71,0,180,3, -106,0,180,3,79, -0,180,3,52,0, -180,3,114,0,180, -3,87,0,180,3, -122,0,180,3,95, -0,180,3,68,0, -180,3,103,0,180, -3,76,0,180,3, -49,0,180,3,111, -0,180,3,84,0, -180,3,57,0,180, -3,119,0,180,3, -65,0,180,3,100, -0,180,3,73,0, -180,3,108,0,180, -3,81,0,180,3, -54,0,180,3,116, -0,180,3,89,0, -180,855,11,1,600, -0,856,4,32,77, -0,79,0,86,0, -73,0,78,0,71, -0,95,0,69,0, -78,0,68,0,95, -0,69,0,86,0, -69,0,78,0,84, -0,1,-1,3,73, -0,180,3,108,0, -180,3,81,0,180, -3,54,0,180,3, -116,0,180,3,89, -0,180,857,11,1, -867,0,183,1,-1, -3,83,0,180,3, -56,0,180,3,118, -0,180,3,99,0, -180,3,72,0,180, -3,107,0,180,3, -80,0,180,3,53, -0,180,3,115,0, -180,3,88,0,180, -3,69,0,180,3, -104,0,180,3,77, -0,180,3,50,0, -180,3,112,0,180, -3,85,0,180,3, -120,0,180,3,66, -0,180,3,101,0, -180,3,74,0,180, -3,109,0,180,3, -82,0,180,3,55, -0,180,3,117,0, -180,3,90,0,180, -3,98,0,180,3, -71,0,180,3,106, -0,180,3,79,0, -180,3,52,0,180, -3,114,0,180,3, -87,0,180,3,122, -0,180,3,95,0, -180,3,68,0,180, -3,103,0,180,3, -76,0,180,3,49, -0,180,3,111,0, -180,3,84,0,180, -3,57,0,180,3, -119,0,180,3,65, -0,180,3,100,0, -180,3,73,0,180, -3,108,0,180,3, -81,0,180,3,54, -0,180,3,116,0, -180,3,89,0,180, -858,11,1,867,0, -183,1,-1,3,74, -0,180,3,109,0, -180,3,82,0,180, -3,55,0,180,3, -117,0,180,3,90, -0,180,3,98,0, -180,3,71,0,180, -3,106,0,180,3, -79,0,180,3,52, -0,180,3,114,0, -180,3,87,0,180, -3,122,0,180,3, -95,0,180,3,68, -0,180,3,103,0, -180,3,76,0,180, -3,49,0,180,3, -111,0,180,3,84, -0,180,3,57,0, -180,3,119,0,180, -3,65,0,180,3, -100,0,180,3,73, -0,180,3,108,0, -180,3,81,0,180, -3,54,0,180,3, -116,0,180,3,89, -0,180,859,11,1, -867,0,183,1,-1, -3,68,0,180,3, -103,0,180,3,76, -0,180,3,49,0, -180,3,111,0,180, -3,84,0,180,3, -57,0,180,3,119, -0,180,3,65,0, -180,3,100,0,180, -3,73,0,180,3, -108,0,180,3,81, -0,180,3,54,0, -180,3,116,0,180, -3,89,0,180,860, -11,1,867,0,183, -1,-1,3,76,0, -180,3,49,0,180, -3,111,0,180,3, -84,0,180,3,57, -0,180,3,119,0, -180,3,65,0,180, -3,100,0,180,3, -73,0,180,3,108, -0,180,3,81,0, -180,3,54,0,180, -3,116,0,180,3, -89,0,180,861,11, -1,867,0,183,1, --1,3,83,0,180, -3,56,0,180,3, -118,0,180,3,99, -0,180,3,72,0, -180,3,107,0,180, -3,80,0,180,3, -53,0,180,3,115, -0,180,3,88,0, -180,3,69,0,180, -3,104,0,180,3, -77,0,180,3,50, -0,180,3,112,0, -180,3,85,0,180, -3,120,0,180,3, -66,0,180,3,101, -0,180,3,74,0, -180,3,109,0,180, -3,82,0,180,3, -55,0,180,3,117, -0,180,3,90,0, -180,3,98,0,180, -3,71,0,180,3, -106,0,180,3,79, -0,180,3,52,0, -180,3,114,0,180, -3,87,0,180,3, -122,0,180,3,95, -0,180,3,68,0, -180,3,103,0,180, -3,76,0,180,3, -49,0,180,3,111, -0,180,3,84,0, -180,3,57,0,180, -3,119,0,180,3, -65,0,180,3,100, -0,180,3,73,0, -180,3,108,0,180, -3,81,0,180,3, -54,0,180,3,116, -0,180,3,89,0, -180,862,11,1,867, -0,183,1,-1,3, -78,0,180,3,51, -0,180,3,113,0, -180,3,86,0,180, -3,121,0,180,3, -67,0,180,3,102, -0,180,3,75,0, -180,3,48,0,180, -3,110,0,180,3, -83,0,180,3,56, -0,180,3,118,0, -180,3,99,0,180, -3,72,0,180,3, -107,0,180,3,80, -0,180,3,53,0, -180,3,115,0,180, -3,88,0,180,3, -69,0,180,3,104, -0,180,3,77,0, -180,3,50,0,180, -3,112,0,180,3, -85,0,180,3,120, -0,180,3,66,0, -180,3,101,0,180, -3,74,0,180,3, -109,0,180,3,82, -0,180,3,55,0, -180,3,117,0,180, -3,90,0,180,3, -98,0,180,3,71, -0,180,3,106,0, -180,3,79,0,180, -3,52,0,180,3, -114,0,180,3,87, -0,180,3,122,0, -180,3,95,0,180, -3,68,0,180,3, -103,0,180,3,76, -0,180,3,49,0, -180,3,111,0,180, -3,84,0,180,3, -57,0,180,3,119, -0,180,3,65,0, -180,3,100,0,180, -3,73,0,180,3, -108,0,180,3,81, -0,180,3,54,0, -180,3,116,0,180, -3,89,0,180,863, -11,1,867,0,183, -1,-1,3,99,0, -180,3,72,0,180, -3,107,0,180,3, -80,0,180,3,53, -0,180,3,115,0, -180,3,88,0,180, -3,69,0,180,3, -104,0,180,3,77, -0,180,3,50,0, -180,3,112,0,180, -3,85,0,180,3, -120,0,180,3,66, -0,180,3,101,0, -180,3,74,0,180, -3,109,0,180,3, -82,0,180,3,55, -0,180,3,117,0, -180,3,90,0,180, -3,98,0,180,3, -71,0,180,3,106, -0,180,3,79,0, -180,3,52,0,180, -3,114,0,180,3, -87,0,180,3,122, -0,180,3,95,0, -180,3,68,0,180, -3,103,0,180,3, -76,0,180,3,49, -0,180,3,111,0, -180,3,84,0,180, -3,57,0,180,3, -119,0,180,3,65, -0,180,3,100,0, -180,3,73,0,180, -3,108,0,180,3, -81,0,180,3,54, -0,180,3,116,0, -180,3,89,0,180, -864,11,1,867,0, -183,1,-1,3,84, -0,180,3,57,0, -180,3,119,0,180, -3,65,0,180,3, -100,0,180,3,73, -0,180,3,108,0, -180,3,81,0,180, -3,54,0,180,3, -116,0,180,3,89, -0,180,865,11,1, -867,0,183,1,-1, -3,69,0,178,3, -106,0,866,12,1, -30221,867,5,63,3, -97,0,180,3,70, -0,180,3,105,0, -180,3,78,0,180, -3,51,0,180,3, -113,0,180,3,86, -0,180,3,121,0, -180,3,67,0,180, -3,102,0,180,3, -75,0,180,3,48, -0,180,3,110,0, -180,3,83,0,180, -3,56,0,180,3, -118,0,180,3,99, -0,180,3,72,0, -180,3,107,0,180, -3,80,0,180,3, -53,0,180,3,115, -0,180,3,88,0, -180,3,69,0,180, -3,104,0,180,3, -77,0,180,3,50, -0,180,3,112,0, -180,3,85,0,180, -3,120,0,180,3, -66,0,180,3,101, -0,180,3,74,0, -180,3,109,0,180, -3,82,0,180,3, -55,0,180,3,117, -0,868,12,1,30303, -869,5,63,3,97, -0,180,3,70,0, -180,3,105,0,180, -3,78,0,180,3, -51,0,180,3,113, -0,180,3,86,0, -180,3,121,0,180, -3,67,0,180,3, -102,0,180,3,75, -0,180,3,48,0, -180,3,110,0,180, -3,83,0,180,3, -56,0,180,3,118, -0,180,3,99,0, -180,3,72,0,180, -3,107,0,180,3, -80,0,180,3,53, -0,180,3,115,0, -180,3,88,0,180, -3,69,0,180,3, -104,0,180,3,77, -0,180,3,50,0, -180,3,112,0,180, -3,85,0,180,3, -120,0,180,3,66, -0,180,3,101,0, -180,3,74,0,180, -3,109,0,870,12, -1,30384,871,5,63, -3,97,0,180,3, -70,0,180,3,105, -0,180,3,78,0, -180,3,51,0,180, -3,113,0,180,3, -86,0,180,3,121, -0,180,3,67,0, -180,3,102,0,180, -3,75,0,180,3, -48,0,180,3,110, -0,180,3,83,0, -180,3,56,0,180, -3,118,0,180,3, -99,0,180,3,72, -0,180,3,107,0, -180,3,80,0,180, -3,53,0,180,3, -115,0,180,3,88, -0,180,3,69,0, -180,3,104,0,180, -3,77,0,180,3, -50,0,180,3,112, -0,872,12,1,30462, -873,5,63,3,97, -0,180,3,70,0, -180,3,105,0,180, -3,78,0,180,3, -51,0,180,3,113, -0,180,3,86,0, -180,3,121,0,180, -3,67,0,180,3, -102,0,180,3,75, -0,180,3,48,0, -180,3,110,0,180, -3,83,0,180,3, -56,0,180,3,118, -0,180,3,99,0, -180,3,72,0,180, -3,107,0,180,3, -80,0,180,3,53, -0,180,3,115,0, -180,3,88,0,180, -3,69,0,180,3, -104,0,180,3,77, -0,180,3,50,0, -180,3,112,0,180, -3,85,0,180,3, -120,0,180,3,66, -0,180,3,101,0, -180,3,74,0,180, -3,109,0,180,3, -82,0,180,3,55, -0,180,3,117,0, -180,3,90,0,180, -3,98,0,180,3, -71,0,180,3,106, -0,180,3,79,0, -180,3,52,0,180, -3,114,0,180,3, -87,0,180,3,122, -0,180,3,95,0, -180,3,68,0,180, -3,103,0,180,3, -76,0,180,3,49, -0,180,3,111,0, -180,3,84,0,180, -3,57,0,180,3, -119,0,180,3,65, -0,180,3,100,0, -180,3,73,0,180, -3,108,0,180,3, -81,0,180,3,54, -0,180,3,116,0, -180,3,89,0,180, -874,11,1,265,0, -875,4,8,74,0, -85,0,77,0,80, -0,1,-1,3,85, -0,180,3,120,0, -180,3,66,0,180, -3,101,0,180,3, -74,0,180,3,109, -0,180,3,82,0, -180,3,55,0,180, -3,117,0,180,3, -90,0,180,3,98, -0,180,3,71,0, -180,3,106,0,180, -3,79,0,180,3, -52,0,180,3,114, -0,180,3,87,0, -180,3,122,0,180, -3,95,0,180,3, -68,0,180,3,103, -0,180,3,76,0, -180,3,49,0,180, -3,111,0,180,3, -84,0,180,3,57, -0,180,3,119,0, -180,3,65,0,180, -3,100,0,180,3, -73,0,180,3,108, -0,180,3,81,0, -180,3,54,0,180, -3,116,0,180,3, -89,0,180,876,11, -1,867,0,183,1, --1,3,82,0,180, -3,55,0,180,3, -117,0,180,3,90, -0,180,3,98,0, -180,3,71,0,180, -3,106,0,180,3, -79,0,180,3,52, -0,180,3,114,0, -180,3,87,0,180, -3,122,0,180,3, -95,0,180,3,68, -0,180,3,103,0, -180,3,76,0,180, -3,49,0,180,3, -111,0,180,3,84, -0,180,3,57,0, -180,3,119,0,180, -3,65,0,180,3, -100,0,180,3,73, -0,180,3,108,0, -180,3,81,0,180, -3,54,0,180,3, -116,0,180,3,89, -0,180,877,11,1, -867,0,183,1,-1, -3,90,0,180,3, -98,0,180,3,71, -0,180,3,106,0, -180,3,79,0,180, -3,52,0,180,3, -114,0,180,3,87, -0,180,3,122,0, -180,3,95,0,180, -3,68,0,180,3, -103,0,180,3,76, -0,180,3,49,0, -180,3,111,0,180, -3,84,0,180,3, -57,0,180,3,119, -0,180,3,65,0, -180,3,100,0,180, -3,73,0,180,3, -108,0,180,3,81, -0,180,3,54,0, -180,3,116,0,180, -3,89,0,180,878, -11,1,867,0,183, -1,-1,3,66,0, -178,3,103,0,178, -3,100,0,879,12, -1,38027,880,5,63, -3,97,0,881,12, -1,38094,882,5,63, -3,97,0,180,3, -70,0,180,3,105, -0,180,3,78,0, -180,3,51,0,180, -3,113,0,180,3, -86,0,180,3,121, -0,180,3,67,0, -180,3,102,0,180, -3,75,0,180,3, -48,0,180,3,110, -0,180,3,83,0, -180,3,56,0,180, -3,118,0,180,3, -99,0,180,3,72, -0,180,3,107,0, -180,3,80,0,180, -3,53,0,180,3, -115,0,180,3,88, -0,180,3,69,0, -180,3,104,0,180, -3,77,0,180,3, -50,0,180,3,112, -0,180,3,85,0, -180,3,120,0,180, -3,66,0,180,3, -101,0,180,3,74, -0,180,3,109,0, -180,3,82,0,180, -3,55,0,180,3, -117,0,180,3,90, -0,180,3,98,0, -180,3,71,0,180, -3,106,0,180,3, -79,0,180,3,52, -0,180,3,114,0, -180,3,87,0,180, -3,122,0,180,3, -95,0,180,3,68, -0,180,3,103,0, -180,3,76,0,180, -3,49,0,180,3, -111,0,180,3,84, -0,180,3,57,0, -180,3,119,0,180, -3,65,0,180,3, -100,0,180,3,73, -0,180,3,108,0, -180,3,81,0,180, -3,54,0,180,3, -116,0,883,12,1, -38187,884,5,63,3, -97,0,885,12,1, -38254,886,5,63,3, -97,0,180,3,70, -0,180,3,105,0, -180,3,78,0,180, -3,51,0,180,3, -113,0,180,3,86, -0,180,3,121,0, -180,3,67,0,180, -3,102,0,180,3, -75,0,180,3,48, -0,180,3,110,0, -180,3,83,0,180, -3,56,0,180,3, -118,0,180,3,99, -0,180,3,72,0, -180,3,107,0,180, -3,80,0,180,3, -53,0,180,3,115, -0,887,12,1,38330, -888,5,63,3,97, -0,180,3,70,0, -180,3,105,0,180, -3,78,0,180,3, -51,0,180,3,113, -0,180,3,86,0, -180,3,121,0,180, -3,67,0,180,3, -102,0,180,3,75, -0,180,3,48,0, -180,3,110,0,180, -3,83,0,180,3, -56,0,180,3,118, -0,180,3,99,0, -180,3,72,0,180, -3,107,0,180,3, -80,0,180,3,53, -0,180,3,115,0, -180,3,88,0,180, -3,69,0,180,3, -104,0,180,3,77, -0,180,3,50,0, -180,3,112,0,180, -3,85,0,180,3, -120,0,180,3,66, -0,180,3,101,0, -889,12,1,38410,890, -5,63,3,97,0, -180,3,70,0,180, -3,105,0,180,3, -78,0,180,3,51, -0,180,3,113,0, -180,3,86,0,180, -3,121,0,180,3, -67,0,180,3,102, -0,180,3,75,0, -180,3,48,0,180, -3,110,0,180,3, -83,0,180,3,56, -0,180,3,118,0, -180,3,99,0,180, -3,72,0,180,3, -107,0,180,3,80, -0,180,3,53,0, -180,3,115,0,180, -3,88,0,180,3, -69,0,180,3,104, -0,180,3,77,0, -180,3,50,0,180, -3,112,0,180,3, -85,0,180,3,120, -0,180,3,66,0, -180,3,101,0,180, -3,74,0,180,3, -109,0,180,3,82, -0,180,3,55,0, -180,3,117,0,180, -3,90,0,180,3, -98,0,180,3,71, -0,180,3,106,0, -180,3,79,0,180, -3,52,0,180,3, -114,0,891,12,1, -38495,892,5,63,3, -97,0,180,3,70, -0,180,3,105,0, -180,3,78,0,180, -3,51,0,180,3, -113,0,180,3,86, -0,180,3,121,0, -180,3,67,0,180, -3,102,0,180,3, -75,0,180,3,48, -0,180,3,110,0, -180,3,83,0,180, -3,56,0,180,3, -118,0,893,12,1, -38568,894,5,63,3, -97,0,180,3,70, -0,180,3,105,0, -180,3,78,0,180, -3,51,0,180,3, -113,0,180,3,86, -0,180,3,121,0, -180,3,67,0,180, -3,102,0,180,3, -75,0,180,3,48, -0,180,3,110,0, -180,3,83,0,180, -3,56,0,180,3, -118,0,180,3,99, -0,180,3,72,0, -180,3,107,0,180, -3,80,0,180,3, -53,0,180,3,115, -0,180,3,88,0, -180,3,69,0,180, -3,104,0,180,3, -77,0,180,3,50, -0,180,3,112,0, -180,3,85,0,180, -3,120,0,180,3, -66,0,180,3,101, -0,895,12,1,38648, -896,5,63,3,97, -0,180,3,70,0, -180,3,105,0,180, -3,78,0,180,3, -51,0,180,3,113, -0,180,3,86,0, -180,3,121,0,180, -3,67,0,180,3, -102,0,180,3,75, -0,180,3,48,0, -180,3,110,0,180, -3,83,0,180,3, -56,0,180,3,118, -0,180,3,99,0, -180,3,72,0,180, -3,107,0,180,3, -80,0,180,3,53, -0,180,3,115,0, -180,3,88,0,180, -3,69,0,180,3, -104,0,180,3,77, -0,180,3,50,0, -180,3,112,0,180, -3,85,0,180,3, -120,0,180,3,66, -0,180,3,101,0, -180,3,74,0,180, -3,109,0,180,3, -82,0,180,3,55, -0,180,3,117,0, -180,3,90,0,180, -3,98,0,180,3, -71,0,180,3,106, -0,180,3,79,0, -180,3,52,0,180, -3,114,0,897,12, -1,38733,898,5,63, -3,97,0,180,3, -70,0,180,3,105, -0,180,3,78,0, -180,3,51,0,180, -3,113,0,180,3, -86,0,180,3,121, -0,180,3,67,0, -180,3,102,0,180, -3,75,0,180,3, -48,0,180,3,110, -0,180,3,83,0, -180,3,56,0,180, -3,118,0,180,3, -99,0,180,3,72, -0,180,3,107,0, -180,3,80,0,180, -3,53,0,180,3, -115,0,180,3,88, -0,180,3,69,0, -180,3,104,0,180, -3,77,0,180,3, -50,0,180,3,112, -0,180,3,85,0, -180,3,120,0,180, -3,66,0,180,3, -101,0,180,3,74, -0,180,3,109,0, -180,3,82,0,180, -3,55,0,180,3, -117,0,180,3,90, -0,180,3,98,0, -180,3,71,0,180, -3,106,0,180,3, -79,0,180,3,52, -0,180,3,114,0, -180,3,87,0,180, -3,122,0,180,3, -95,0,180,3,68, -0,180,3,103,0, -180,3,76,0,180, -3,49,0,180,3, -111,0,180,3,84, -0,180,3,57,0, -180,3,119,0,180, -3,65,0,180,3, -100,0,180,3,73, -0,180,3,108,0, -180,3,81,0,180, -3,54,0,180,3, -116,0,180,3,89, -0,180,899,11,1, -461,0,900,4,32, -68,0,65,0,84, -0,65,0,83,0, -69,0,82,0,86, -0,69,0,82,0, -95,0,69,0,86, -0,69,0,78,0, -84,0,1,-1,3, -87,0,180,3,122, -0,180,3,95,0, -180,3,68,0,180, -3,103,0,180,3, -76,0,180,3,49, -0,180,3,111,0, -180,3,84,0,180, -3,57,0,180,3, -119,0,180,3,65, -0,180,3,100,0, -180,3,73,0,180, -3,108,0,180,3, -81,0,180,3,54, -0,180,3,116,0, -180,3,89,0,180, -901,11,1,867,0, -183,1,-1,3,74, -0,180,3,109,0, -180,3,82,0,180, -3,55,0,180,3, -117,0,180,3,90, -0,180,3,98,0, -180,3,71,0,180, -3,106,0,180,3, -79,0,180,3,52, -0,180,3,114,0, -180,3,87,0,180, -3,122,0,180,3, -95,0,180,3,68, -0,180,3,103,0, -180,3,76,0,180, -3,49,0,180,3, -111,0,180,3,84, -0,180,3,57,0, -180,3,119,0,180, -3,65,0,180,3, -100,0,180,3,73, -0,180,3,108,0, -180,3,81,0,180, -3,54,0,180,3, -116,0,180,3,89, -0,180,902,11,1, -867,0,183,1,-1, -3,99,0,180,3, -72,0,180,3,107, -0,180,3,80,0, -180,3,53,0,180, -3,115,0,180,3, -88,0,180,3,69, -0,180,3,104,0, -180,3,77,0,180, -3,50,0,180,3, -112,0,180,3,85, -0,180,3,120,0, -180,3,66,0,180, -3,101,0,180,3, -74,0,180,3,109, -0,180,3,82,0, -180,3,55,0,180, -3,117,0,180,3, -90,0,180,3,98, -0,180,3,71,0, -180,3,106,0,180, -3,79,0,180,3, -52,0,180,3,114, -0,180,3,87,0, -180,3,122,0,180, -3,95,0,180,3, -68,0,180,3,103, -0,180,3,76,0, -180,3,49,0,180, -3,111,0,180,3, -84,0,180,3,57, -0,180,3,119,0, -180,3,65,0,180, -3,100,0,180,3, -73,0,180,3,108, -0,180,3,81,0, -180,3,54,0,180, -3,116,0,180,3, -89,0,180,903,11, -1,867,0,183,1, --1,3,87,0,180, -3,122,0,180,3, -95,0,180,3,68, -0,180,3,103,0, -180,3,76,0,180, -3,49,0,180,3, -111,0,180,3,84, -0,180,3,57,0, -180,3,119,0,180, -3,65,0,180,3, -100,0,180,3,73, -0,180,3,108,0, -180,3,81,0,180, -3,54,0,180,3, -116,0,180,3,89, -0,180,904,11,1, -867,0,183,1,-1, -3,74,0,180,3, -109,0,180,3,82, -0,180,3,55,0, -180,3,117,0,180, -3,90,0,180,3, -98,0,180,3,71, -0,180,3,106,0, -180,3,79,0,180, -3,52,0,180,3, -114,0,180,3,87, -0,180,3,122,0, -180,3,95,0,180, -3,68,0,180,3, -103,0,180,3,76, -0,180,3,49,0, -180,3,111,0,180, -3,84,0,180,3, -57,0,180,3,119, -0,180,3,65,0, -180,3,100,0,180, -3,73,0,180,3, -108,0,180,3,81, -0,180,3,54,0, -180,3,116,0,180, -3,89,0,180,905, -11,1,867,0,183, -1,-1,3,88,0, -180,3,69,0,180, -3,104,0,180,3, -77,0,180,3,50, -0,180,3,112,0, -180,3,85,0,180, -3,120,0,180,3, -66,0,180,3,101, -0,180,3,74,0, -180,3,109,0,180, -3,82,0,180,3, -55,0,180,3,117, -0,180,3,90,0, -180,3,98,0,180, -3,71,0,180,3, -106,0,180,3,79, -0,180,3,52,0, -180,3,114,0,180, -3,87,0,180,3, -122,0,180,3,95, -0,180,3,68,0, -180,3,103,0,180, -3,76,0,180,3, -49,0,180,3,111, -0,180,3,84,0, -180,3,57,0,180, -3,119,0,180,3, -65,0,180,3,100, -0,180,3,73,0, -180,3,108,0,180, -3,81,0,180,3, -54,0,180,3,116, -0,180,3,89,0, -180,906,11,1,867, -0,183,1,-1,3, -70,0,180,3,105, -0,180,3,78,0, -180,3,51,0,180, -3,113,0,180,3, -86,0,180,3,121, -0,180,3,67,0, -180,3,102,0,180, -3,75,0,180,3, -48,0,180,3,110, -0,180,3,83,0, -180,3,56,0,180, -3,118,0,180,3, -99,0,180,3,72, -0,180,3,107,0, -180,3,80,0,180, -3,53,0,180,3, -115,0,180,3,88, -0,180,3,69,0, -180,3,104,0,180, -3,77,0,180,3, -50,0,180,3,112, -0,180,3,85,0, -180,3,120,0,180, -3,66,0,180,3, -101,0,180,3,74, -0,180,3,109,0, -180,3,82,0,180, -3,55,0,180,3, -117,0,180,3,90, -0,180,3,98,0, -180,3,71,0,180, -3,106,0,180,3, -79,0,180,3,52, -0,180,3,114,0, -180,3,87,0,180, -3,122,0,180,3, -95,0,180,3,68, -0,180,3,103,0, -180,3,76,0,180, -3,49,0,180,3, -111,0,180,3,84, -0,180,3,57,0, -180,3,119,0,180, -3,65,0,180,3, -100,0,180,3,73, -0,180,3,108,0, -180,3,81,0,180, -3,54,0,180,3, -116,0,180,3,89, -0,180,907,11,1, -867,0,183,1,-1, -3,89,0,180,908, -11,1,867,0,183, -1,-1,3,70,0, -180,3,105,0,180, -3,78,0,180,3, -51,0,180,3,113, -0,180,3,86,0, -180,3,121,0,180, -3,67,0,180,3, -102,0,180,3,75, -0,180,3,48,0, -180,3,110,0,180, -3,83,0,180,3, -56,0,180,3,118, -0,180,3,99,0, -180,3,72,0,180, -3,107,0,180,3, -80,0,180,3,53, -0,180,3,115,0, -180,3,88,0,180, -3,69,0,180,3, -104,0,180,3,77, -0,180,3,50,0, -180,3,112,0,180, -3,85,0,180,3, -120,0,180,3,66, -0,180,3,101,0, -909,12,1,39187,910, -5,63,3,97,0, -180,3,70,0,180, -3,105,0,180,3, -78,0,180,3,51, -0,180,3,113,0, -180,3,86,0,180, -3,121,0,180,3, -67,0,180,3,102, -0,911,12,1,39258, -912,5,63,3,97, -0,913,12,1,39325, -914,5,63,3,97, -0,180,3,70,0, -180,3,105,0,180, -3,78,0,180,3, -51,0,180,3,113, -0,180,3,86,0, -180,3,121,0,180, -3,67,0,180,3, -102,0,180,3,75, -0,180,3,48,0, -180,3,110,0,180, -3,83,0,180,3, -56,0,180,3,118, -0,180,3,99,0, -180,3,72,0,180, -3,107,0,180,3, -80,0,180,3,53, -0,180,3,115,0, -180,3,88,0,180, -3,69,0,180,3, -104,0,180,3,77, -0,180,3,50,0, -180,3,112,0,180, -3,85,0,180,3, -120,0,180,3,66, -0,180,3,101,0, -180,3,74,0,180, -3,109,0,180,3, -82,0,180,3,55, -0,180,3,117,0, -915,12,1,39407,916, -5,63,3,97,0, -180,3,70,0,180, -3,105,0,180,3, -78,0,180,3,51, -0,180,3,113,0, -180,3,86,0,180, -3,121,0,180,3, -67,0,180,3,102, -0,180,3,75,0, -180,3,48,0,180, -3,110,0,180,3, -83,0,180,3,56, -0,180,3,118,0, -180,3,99,0,180, -3,72,0,180,3, -107,0,180,3,80, -0,180,3,53,0, -180,3,115,0,180, -3,88,0,180,3, -69,0,180,3,104, -0,180,3,77,0, -180,3,50,0,180, -3,112,0,180,3, -85,0,180,3,120, -0,180,3,66,0, -180,3,101,0,180, -3,74,0,180,3, -109,0,180,3,82, -0,180,3,55,0, -180,3,117,0,180, -3,90,0,180,3, -98,0,180,3,71, -0,180,3,106,0, -180,3,79,0,180, -3,52,0,180,3, -114,0,180,3,87, -0,180,3,122,0, -180,3,95,0,180, -3,68,0,180,3, -103,0,180,3,76, -0,180,3,49,0, -180,3,111,0,180, -3,84,0,180,3, -57,0,180,3,119, -0,180,3,65,0, -180,3,100,0,180, -3,73,0,180,3, -108,0,917,12,1, -39498,918,5,63,3, -97,0,180,3,70, -0,180,3,105,0, -180,3,78,0,180, -3,51,0,180,3, -113,0,180,3,86, -0,180,3,121,0, -180,3,67,0,180, -3,102,0,180,3, -75,0,180,3,48, -0,180,3,110,0, -180,3,83,0,180, -3,56,0,180,3, -118,0,180,3,99, -0,180,3,72,0, -180,3,107,0,180, -3,80,0,180,3, -53,0,180,3,115, -0,180,3,88,0, -180,3,69,0,180, -3,104,0,180,3, -77,0,180,3,50, -0,180,3,112,0, -180,3,85,0,180, -3,120,0,180,3, -66,0,180,3,101, -0,180,3,74,0, -180,3,109,0,180, -3,82,0,180,3, -55,0,180,3,117, -0,180,3,90,0, -180,3,98,0,180, -3,71,0,180,3, -106,0,180,3,79, -0,180,3,52,0, -180,3,114,0,180, -3,87,0,180,3, -122,0,180,3,95, -0,180,3,68,0, -180,3,103,0,180, -3,76,0,180,3, -49,0,180,3,111, -0,180,3,84,0, -180,3,57,0,180, -3,119,0,180,3, -65,0,180,3,100, -0,180,3,73,0, -180,3,108,0,180, -3,81,0,180,3, -54,0,180,3,116, -0,919,12,1,39591, -920,5,63,3,97, -0,180,3,70,0, -180,3,105,0,180, -3,78,0,180,3, -51,0,180,3,113, -0,180,3,86,0, -180,3,121,0,180, -3,67,0,180,3, -102,0,180,3,75, -0,180,3,48,0, -180,3,110,0,180, -3,83,0,180,3, -56,0,180,3,118, -0,180,3,99,0, -180,3,72,0,180, -3,107,0,180,3, -80,0,180,3,53, -0,180,3,115,0, -180,3,88,0,180, -3,69,0,180,3, -104,0,180,3,77, -0,180,3,50,0, -180,3,112,0,180, -3,85,0,180,3, -120,0,180,3,66, -0,180,3,101,0, -180,3,74,0,180, -3,109,0,180,3, -82,0,180,3,55, -0,180,3,117,0, -180,3,90,0,180, -3,98,0,180,3, -71,0,180,3,106, -0,180,3,79,0, -180,3,52,0,180, -3,114,0,180,3, -87,0,180,3,122, -0,180,3,95,0, -180,3,68,0,180, -3,103,0,180,3, -76,0,180,3,49, -0,180,3,111,0, -180,3,84,0,180, -3,57,0,180,3, -119,0,180,3,65, -0,180,3,100,0, -180,3,73,0,180, -3,108,0,180,3, -81,0,180,3,54, -0,180,3,116,0, -180,3,89,0,180, -921,11,1,245,0, -922,4,26,68,0, -69,0,70,0,65, -0,85,0,76,0, -84,0,95,0,83, -0,84,0,65,0, -84,0,69,0,1, --1,3,89,0,180, -923,11,1,867,0, -183,1,-1,3,81, -0,180,3,54,0, -180,3,116,0,180, -3,89,0,180,924, -11,1,867,0,183, -1,-1,3,90,0, -180,3,98,0,180, -3,71,0,180,3, -106,0,180,3,79, -0,180,3,52,0, -180,3,114,0,180, -3,87,0,180,3, -122,0,180,3,95, -0,180,3,68,0, -180,3,103,0,180, -3,76,0,180,3, -49,0,180,3,111, -0,180,3,84,0, -180,3,57,0,180, -3,119,0,180,3, -65,0,180,3,100, -0,180,3,73,0, -180,3,108,0,180, -3,81,0,180,3, -54,0,180,3,116, -0,180,3,89,0, -180,925,11,1,867, -0,183,1,-1,3, -70,0,180,3,105, -0,180,3,78,0, -180,3,51,0,180, -3,113,0,180,3, -86,0,180,3,121, -0,180,3,67,0, -180,3,102,0,180, -3,75,0,180,3, -48,0,180,3,110, -0,180,3,83,0, -180,3,56,0,180, -3,118,0,180,3, -99,0,180,3,72, -0,180,3,107,0, -180,3,80,0,180, -3,53,0,180,3, -115,0,180,3,88, -0,180,3,69,0, -180,3,104,0,180, -3,77,0,180,3, -50,0,180,3,112, -0,180,3,85,0, -180,3,120,0,180, -3,66,0,180,3, -101,0,180,3,74, -0,180,3,109,0, -180,3,82,0,180, -3,55,0,180,3, -117,0,180,3,90, -0,180,3,98,0, -180,3,71,0,180, -3,106,0,180,3, -79,0,180,3,52, -0,180,3,114,0, -180,3,87,0,180, -3,122,0,180,3, -95,0,180,3,68, -0,180,3,103,0, -180,3,76,0,180, -3,49,0,180,3, -111,0,180,3,84, -0,180,3,57,0, -180,3,119,0,180, -3,65,0,180,3, -100,0,180,3,73, -0,180,3,108,0, -180,3,81,0,180, -3,54,0,180,3, -116,0,180,3,89, -0,180,926,11,1, -867,0,183,1,-1, -3,75,0,180,3, -48,0,180,3,110, -0,180,3,83,0, -180,3,56,0,180, -3,118,0,180,3, -99,0,180,3,72, -0,180,3,107,0, -180,3,80,0,180, -3,53,0,180,3, -115,0,180,3,88, -0,180,3,69,0, -180,3,104,0,180, -3,77,0,180,3, -50,0,180,3,112, -0,180,3,85,0, -180,3,120,0,180, -3,66,0,180,3, -101,0,180,3,74, -0,180,3,109,0, -180,3,82,0,180, -3,55,0,180,3, -117,0,180,3,90, -0,180,3,98,0, -180,3,71,0,180, -3,106,0,180,3, -79,0,180,3,52, -0,180,3,114,0, -180,3,87,0,180, -3,122,0,180,3, -95,0,180,3,68, -0,180,3,103,0, -180,3,76,0,180, -3,49,0,180,3, -111,0,180,3,84, -0,180,3,57,0, -180,3,119,0,180, -3,65,0,180,3, -100,0,180,3,73, -0,180,3,108,0, -180,3,81,0,180, -3,54,0,180,3, -116,0,180,3,89, -0,180,927,11,1, -867,0,183,1,-1, -3,74,0,180,3, -109,0,180,3,82, -0,180,3,55,0, -180,3,117,0,180, -3,90,0,180,3, -98,0,180,3,71, -0,180,3,106,0, -180,3,79,0,180, -3,52,0,180,3, -114,0,180,3,87, -0,180,3,122,0, -180,3,95,0,180, -3,68,0,180,3, -103,0,180,3,76, -0,180,3,49,0, -180,3,111,0,928, -12,1,39915,929,5, -63,3,97,0,180, -3,70,0,180,3, -105,0,180,3,78, -0,180,3,51,0, -180,3,113,0,180, -3,86,0,180,3, -121,0,180,3,67, -0,180,3,102,0, -180,3,75,0,180, -3,48,0,180,3, -110,0,180,3,83, -0,180,3,56,0, -180,3,118,0,180, -3,99,0,180,3, -72,0,180,3,107, -0,180,3,80,0, -180,3,53,0,180, -3,115,0,180,3, -88,0,180,3,69, -0,180,3,104,0, -180,3,77,0,180, -3,50,0,180,3, -112,0,180,3,85, -0,180,3,120,0, -180,3,66,0,180, -3,101,0,180,3, -74,0,180,3,109, -0,180,3,82,0, -180,3,55,0,180, -3,117,0,180,3, -90,0,180,3,98, -0,180,3,71,0, -180,3,106,0,180, -3,79,0,180,3, -52,0,180,3,114, -0,180,3,87,0, -180,3,122,0,180, -3,95,0,180,3, -68,0,180,3,103, -0,180,3,76,0, -180,3,49,0,180, -3,111,0,180,3, -84,0,180,3,57, -0,180,3,119,0, -180,3,65,0,180, -3,100,0,180,3, -73,0,180,3,108, -0,180,3,81,0, -180,3,54,0,180, -3,116,0,180,3, -89,0,180,930,11, -1,223,0,931,4, -4,68,0,79,0, -1,-1,3,84,0, -180,3,57,0,180, -3,119,0,180,3, -65,0,180,3,100, -0,180,3,73,0, -180,3,108,0,180, -3,81,0,180,3, -54,0,180,3,116, -0,180,3,89,0, -180,932,11,1,867, -0,183,1,-1,3, -60,0,933,12,1, -2901,934,5,2,3, -61,0,935,12,1, -3029,936,5,0,937, -11,1,148,0,938, -4,22,76,0,69, -0,83,0,83,0, -95,0,69,0,81, -0,85,0,65,0, -76,0,83,0,1, --1,3,60,0,939, -12,1,2905,940,5, -0,941,11,1,197, -0,942,4,20,76, -0,69,0,70,0, -84,0,95,0,83, -0,72,0,73,0, -70,0,84,0,1, --1,943,11,1,116, -0,944,4,20,76, -0,69,0,70,0, -84,0,95,0,65, -0,78,0,71,0, -76,0,69,0,1, --1,3,97,0,945, -12,1,9444,946,5, -63,3,97,0,180, -3,70,0,180,3, -105,0,180,3,78, -0,180,3,51,0, -180,3,113,0,180, -3,86,0,180,3, -121,0,180,3,67, -0,180,3,102,0, -180,3,75,0,180, -3,48,0,180,3, -110,0,180,3,83, -0,180,3,56,0, -180,3,118,0,180, -3,99,0,180,3, -72,0,180,3,107, -0,180,3,80,0, -180,3,53,0,180, -3,115,0,180,3, -88,0,180,3,69, -0,180,3,104,0, -180,3,77,0,180, -3,50,0,180,3, -112,0,180,3,85, -0,180,3,120,0, -180,3,66,0,180, -3,101,0,180,3, -74,0,180,3,109, -0,180,3,82,0, -180,3,55,0,180, -3,117,0,180,3, -90,0,180,3,98, -0,180,3,71,0, -180,3,106,0,180, -3,79,0,180,3, -52,0,180,3,114, -0,180,3,87,0, -180,3,122,0,180, -3,95,0,180,3, -68,0,180,3,103, -0,180,3,76,0, -180,3,49,0,180, -3,111,0,180,3, -84,0,180,3,57, -0,180,3,119,0, -180,3,65,0,180, -3,100,0,180,3, -73,0,180,3,108, -0,180,3,81,0, -180,3,54,0,180, -3,116,0,947,12, -1,9537,948,5,63, -3,97,0,180,3, -70,0,180,3,105, -0,180,3,78,0, -180,3,51,0,180, -3,113,0,180,3, -86,0,180,3,121, -0,180,3,67,0, -180,3,102,0,180, -3,75,0,180,3, -48,0,180,3,110, -0,180,3,83,0, -180,3,56,0,180, -3,118,0,180,3, -99,0,180,3,72, -0,180,3,107,0, -180,3,80,0,180, -3,53,0,180,3, -115,0,180,3,88, -0,180,3,69,0, -180,3,104,0,180, -3,77,0,180,3, -50,0,180,3,112, -0,180,3,85,0, -180,3,120,0,180, -3,66,0,180,3, -101,0,180,3,74, -0,180,3,109,0, -180,3,82,0,180, -3,55,0,180,3, -117,0,180,3,90, -0,180,3,98,0, -180,3,71,0,180, -3,106,0,180,3, -79,0,180,3,52, -0,180,3,114,0, -180,3,87,0,180, -3,122,0,180,3, -95,0,949,12,1, -9573,950,5,63,3, -97,0,180,3,70, -0,180,3,105,0, -180,3,78,0,180, -3,51,0,180,3, -113,0,180,3,86, -0,180,3,121,0, -180,3,67,0,180, -3,102,0,180,3, -75,0,180,3,48, -0,180,3,110,0, -180,3,83,0,180, -3,56,0,180,3, -118,0,180,3,99, -0,180,3,72,0, -180,3,107,0,180, -3,80,0,180,3, -53,0,180,3,115, -0,180,3,88,0, -180,3,69,0,180, -3,104,0,180,3, -77,0,180,3,50, -0,180,3,112,0, -180,3,85,0,180, -3,120,0,180,3, -66,0,180,3,101, -0,180,3,74,0, -180,3,109,0,180, -3,82,0,180,3, -55,0,180,3,117, -0,180,3,90,0, -180,3,98,0,180, -3,71,0,180,3, -106,0,180,3,79, -0,180,3,52,0, -180,3,114,0,951, -12,1,9658,952,5, -63,3,97,0,180, -3,70,0,180,3, -105,0,180,3,78, -0,180,3,51,0, -180,3,113,0,180, -3,86,0,180,3, -121,0,180,3,67, -0,180,3,102,0, -180,3,75,0,180, -3,48,0,180,3, -110,0,180,3,83, -0,180,3,56,0, -180,3,118,0,180, -3,99,0,180,3, -72,0,180,3,107, -0,180,3,80,0, -180,3,53,0,180, -3,115,0,180,3, -88,0,180,3,69, -0,180,3,104,0, -180,3,77,0,180, -3,50,0,180,3, -112,0,180,3,85, -0,180,3,120,0, -180,3,66,0,180, -3,101,0,180,3, -74,0,180,3,109, -0,180,3,82,0, -180,3,55,0,180, -3,117,0,180,3, -90,0,180,3,98, -0,180,3,71,0, -180,3,106,0,180, -3,79,0,180,3, -52,0,180,3,114, -0,180,3,87,0, -180,3,122,0,180, -3,95,0,180,3, -68,0,180,3,103, -0,180,3,76,0, -180,3,49,0,180, -3,111,0,953,12, -1,9746,954,5,63, -3,97,0,180,3, -70,0,180,3,105, -0,180,3,78,0, -180,3,51,0,180, -3,113,0,180,3, -86,0,180,3,121, -0,180,3,67,0, -180,3,102,0,180, -3,75,0,180,3, -48,0,180,3,110, -0,180,3,83,0, -180,3,56,0,180, -3,118,0,180,3, -99,0,180,3,72, -0,180,3,107,0, -180,3,80,0,180, -3,53,0,180,3, -115,0,180,3,88, -0,180,3,69,0, -180,3,104,0,180, -3,77,0,180,3, -50,0,180,3,112, -0,180,3,85,0, -180,3,120,0,180, -3,66,0,180,3, -101,0,180,3,74, -0,180,3,109,0, -180,3,82,0,180, -3,55,0,180,3, -117,0,180,3,90, -0,180,3,98,0, -180,3,71,0,180, -3,106,0,180,3, -79,0,180,3,52, -0,180,3,114,0, -180,3,87,0,180, -3,122,0,180,3, -95,0,180,3,68, -0,180,3,103,0, -180,3,76,0,180, -3,49,0,180,3, -111,0,180,3,84, -0,180,3,57,0, -180,3,119,0,180, -3,65,0,180,3, -100,0,180,3,73, -0,180,3,108,0, -180,3,81,0,180, -3,54,0,180,3, -116,0,955,12,1, -9839,956,5,63,3, -97,0,180,3,70, -0,180,3,105,0, -180,3,78,0,180, -3,51,0,180,3, -113,0,180,3,86, -0,180,3,121,0, -180,3,67,0,180, -3,102,0,180,3, -75,0,180,3,48, -0,180,3,110,0, -180,3,83,0,180, -3,56,0,180,3, -118,0,180,3,99, -0,180,3,72,0, -180,3,107,0,180, -3,80,0,180,3, -53,0,180,3,115, -0,180,3,88,0, -180,3,69,0,180, -3,104,0,180,3, -77,0,180,3,50, -0,180,3,112,0, -180,3,85,0,180, -3,120,0,180,3, -66,0,180,3,101, -0,180,3,74,0, -180,3,109,0,180, -3,82,0,180,3, -55,0,180,3,117, -0,180,3,90,0, -180,3,98,0,180, -3,71,0,180,3, -106,0,180,3,79, -0,180,3,52,0, -180,3,114,0,180, -3,87,0,180,3, -122,0,180,3,95, -0,957,12,1,9875, -958,5,63,3,97, -0,180,3,70,0, -180,3,105,0,180, -3,78,0,180,3, -51,0,180,3,113, -0,180,3,86,0, -180,3,121,0,180, -3,67,0,180,3, -102,0,180,3,75, -0,180,3,48,0, -180,3,110,0,180, -3,83,0,180,3, -56,0,180,3,118, -0,180,3,99,0, -180,3,72,0,180, -3,107,0,180,3, -80,0,180,3,53, -0,180,3,115,0, -180,3,88,0,180, -3,69,0,180,3, -104,0,180,3,77, -0,180,3,50,0, -180,3,112,0,180, -3,85,0,180,3, -120,0,180,3,66, -0,180,3,101,0, -180,3,74,0,180, -3,109,0,180,3, -82,0,180,3,55, -0,180,3,117,0, -180,3,90,0,180, -3,98,0,180,3, -71,0,180,3,106, -0,180,3,79,0, -180,3,52,0,180, -3,114,0,180,3, -87,0,180,3,122, -0,180,3,95,0, -180,3,68,0,180, -3,103,0,180,3, -76,0,180,3,49, -0,180,3,111,0, -180,3,84,0,180, -3,57,0,180,3, -119,0,180,3,65, -0,180,3,100,0, -180,3,73,0,180, -3,108,0,180,3, -81,0,180,3,54, -0,180,3,116,0, -959,12,1,9968,960, -5,63,3,97,0, -961,12,1,10035,962, -5,63,3,97,0, -180,3,70,0,180, -3,105,0,180,3, -78,0,180,3,51, -0,180,3,113,0, -180,3,86,0,180, -3,121,0,180,3, -67,0,180,3,102, -0,180,3,75,0, -180,3,48,0,180, -3,110,0,180,3, -83,0,180,3,56, -0,180,3,118,0, -180,3,99,0,180, -3,72,0,180,3, -107,0,180,3,80, -0,180,3,53,0, -180,3,115,0,180, -3,88,0,180,3, -69,0,180,3,104, -0,180,3,77,0, -180,3,50,0,180, -3,112,0,180,3, -85,0,180,3,120, -0,180,3,66,0, -180,3,101,0,180, -3,74,0,180,3, -109,0,180,3,82, -0,180,3,55,0, -180,3,117,0,180, -3,90,0,180,3, -98,0,180,3,71, -0,180,3,106,0, -180,3,79,0,180, -3,52,0,180,3, -114,0,963,12,1, -10120,964,5,63,3, -97,0,180,3,70, -0,180,3,105,0, -180,3,78,0,180, -3,51,0,180,3, -113,0,180,3,86, -0,180,3,121,0, -180,3,67,0,180, -3,102,0,180,3, -75,0,180,3,48, -0,180,3,110,0, -180,3,83,0,180, -3,56,0,180,3, -118,0,180,3,99, -0,180,3,72,0, -180,3,107,0,180, -3,80,0,180,3, -53,0,180,3,115, -0,180,3,88,0, -180,3,69,0,180, -3,104,0,180,3, -77,0,180,3,50, -0,180,3,112,0, -180,3,85,0,180, -3,120,0,180,3, -66,0,180,3,101, -0,180,3,74,0, -180,3,109,0,180, -3,82,0,180,3, -55,0,180,3,117, -0,180,3,90,0, -180,3,98,0,180, -3,71,0,180,3, -106,0,180,3,79, -0,180,3,52,0, -180,3,114,0,180, -3,87,0,180,3, -122,0,180,3,95, -0,180,3,68,0, -180,3,103,0,965, -12,1,10207,966,5, -63,3,97,0,180, -3,70,0,180,3, -105,0,180,3,78, -0,180,3,51,0, -180,3,113,0,180, -3,86,0,180,3, -121,0,180,3,67, -0,180,3,102,0, -180,3,75,0,180, -3,48,0,180,3, -110,0,180,3,83, -0,180,3,56,0, -180,3,118,0,180, -3,99,0,180,3, -72,0,180,3,107, -0,180,3,80,0, -180,3,53,0,180, -3,115,0,180,3, -88,0,180,3,69, -0,180,3,104,0, -180,3,77,0,180, -3,50,0,180,3, -112,0,180,3,85, -0,180,3,120,0, -180,3,66,0,180, -3,101,0,967,12, -1,10287,968,5,63, -3,97,0,180,3, -70,0,180,3,105, -0,180,3,78,0, -180,3,51,0,180, -3,113,0,180,3, -86,0,180,3,121, -0,180,3,67,0, -180,3,102,0,180, -3,75,0,180,3, -48,0,180,3,110, -0,180,3,83,0, -180,3,56,0,180, -3,118,0,180,3, -99,0,180,3,72, -0,180,3,107,0, -180,3,80,0,180, -3,53,0,180,3, -115,0,180,3,88, -0,180,3,69,0, -180,3,104,0,180, -3,77,0,180,3, -50,0,180,3,112, -0,180,3,85,0, -180,3,120,0,180, -3,66,0,180,3, -101,0,180,3,74, -0,180,3,109,0, -180,3,82,0,180, -3,55,0,180,3, -117,0,180,3,90, -0,180,3,98,0, -180,3,71,0,180, -3,106,0,180,3, -79,0,180,3,52, -0,180,3,114,0, -180,3,87,0,180, -3,122,0,180,3, -95,0,180,3,68, -0,180,3,103,0, -180,3,76,0,180, -3,49,0,180,3, -111,0,180,3,84, -0,180,3,57,0, -180,3,119,0,180, -3,65,0,180,3, -100,0,180,3,73, -0,180,3,108,0, -180,3,81,0,180, -3,54,0,180,3, -116,0,969,12,1, -10380,970,5,63,3, -97,0,180,3,70, -0,180,3,105,0, -180,3,78,0,180, -3,51,0,180,3, -113,0,180,3,86, -0,180,3,121,0, -180,3,67,0,180, -3,102,0,180,3, -75,0,180,3,48, -0,180,3,110,0, -180,3,83,0,180, -3,56,0,180,3, -118,0,180,3,99, -0,180,3,72,0, -180,3,107,0,180, -3,80,0,180,3, -53,0,180,3,115, -0,180,3,88,0, -180,3,69,0,180, -3,104,0,180,3, -77,0,180,3,50, -0,180,3,112,0, -180,3,85,0,180, -3,120,0,180,3, -66,0,180,3,101, -0,180,3,74,0, -180,3,109,0,180, -3,82,0,180,3, -55,0,180,3,117, -0,180,3,90,0, -180,3,98,0,180, -3,71,0,180,3, -106,0,180,3,79, -0,180,3,52,0, -180,3,114,0,180, -3,87,0,180,3, -122,0,180,3,95, -0,180,3,68,0, -180,3,103,0,180, -3,76,0,180,3, -49,0,180,3,111, -0,180,3,84,0, -180,3,57,0,180, -3,119,0,180,3, -65,0,180,3,100, -0,180,3,73,0, -180,3,108,0,180, -3,81,0,180,3, -54,0,180,3,116, -0,180,3,89,0, -180,971,11,1,350, -0,972,4,38,65, -0,84,0,95,0, -82,0,79,0,84, -0,95,0,84,0, -65,0,82,0,71, -0,69,0,84,0, -95,0,69,0,86, -0,69,0,78,0, -84,0,1,-1,3, -89,0,180,973,11, -1,867,0,183,1, --1,3,74,0,180, -3,109,0,180,3, -82,0,180,3,55, -0,180,3,117,0, -180,3,90,0,180, -3,98,0,180,3, -71,0,180,3,106, -0,180,3,79,0, -180,3,52,0,180, -3,114,0,180,3, -87,0,180,3,122, -0,180,3,95,0, -180,3,68,0,180, -3,103,0,180,3, -76,0,180,3,49, -0,180,3,111,0, -180,3,84,0,180, -3,57,0,180,3, -119,0,180,3,65, -0,180,3,100,0, -180,3,73,0,180, -3,108,0,180,3, -81,0,180,3,54, -0,180,3,116,0, -180,3,89,0,180, -974,11,1,867,0, -183,1,-1,3,76, -0,180,3,49,0, -180,3,111,0,180, -3,84,0,180,3, -57,0,180,3,119, -0,180,3,65,0, -180,3,100,0,180, -3,73,0,180,3, -108,0,180,3,81, -0,180,3,54,0, -180,3,116,0,180, -3,89,0,180,975, -11,1,867,0,183, -1,-1,3,87,0, -180,3,122,0,180, -3,95,0,180,3, -68,0,180,3,103, -0,180,3,76,0, -180,3,49,0,180, -3,111,0,180,3, -84,0,180,3,57, -0,180,3,119,0, -180,3,65,0,180, -3,100,0,180,3, -73,0,180,3,108, -0,180,3,81,0, -180,3,54,0,180, -3,116,0,180,3, -89,0,180,976,11, -1,867,0,183,1, --1,3,70,0,180, -3,105,0,180,3, -78,0,180,3,51, -0,180,3,113,0, -180,3,86,0,180, -3,121,0,180,3, -67,0,180,3,102, -0,180,3,75,0, -180,3,48,0,180, -3,110,0,180,3, -83,0,180,3,56, -0,180,3,118,0, -180,3,99,0,180, -3,72,0,180,3, -107,0,180,3,80, -0,180,3,53,0, -180,3,115,0,180, -3,88,0,180,3, -69,0,180,3,104, -0,180,3,77,0, -180,3,50,0,180, -3,112,0,180,3, -85,0,180,3,120, -0,180,3,66,0, -180,3,101,0,180, -3,74,0,180,3, -109,0,180,3,82, -0,180,3,55,0, -180,3,117,0,180, -3,90,0,180,3, -98,0,180,3,71, -0,180,3,106,0, -180,3,79,0,180, -3,52,0,180,3, -114,0,180,3,87, -0,180,3,122,0, -180,3,95,0,180, -3,68,0,180,3, -103,0,180,3,76, -0,180,3,49,0, -180,3,111,0,180, -3,84,0,180,3, -57,0,180,3,119, -0,180,3,65,0, -180,3,100,0,180, -3,73,0,180,3, -108,0,180,3,81, -0,180,3,54,0, -180,3,116,0,180, -3,89,0,180,977, -11,1,867,0,183, -1,-1,3,89,0, -180,978,11,1,867, -0,183,1,-1,3, -68,0,180,3,103, -0,180,3,76,0, -180,3,49,0,180, -3,111,0,180,3, -84,0,180,3,57, -0,180,3,119,0, -180,3,65,0,180, -3,100,0,180,3, -73,0,180,3,108, -0,180,3,81,0, -180,3,54,0,180, -3,116,0,180,3, -89,0,180,979,11, -1,867,0,183,1, --1,3,89,0,180, -980,11,1,867,0, -183,1,-1,3,84, -0,180,3,57,0, -180,3,119,0,180, -3,65,0,180,3, -100,0,180,3,73, -0,180,3,108,0, -180,3,81,0,180, -3,54,0,180,3, -116,0,180,3,89, -0,180,981,11,1, -867,0,183,1,-1, -3,87,0,180,3, -122,0,180,3,95, -0,180,3,68,0, -180,3,103,0,180, -3,76,0,180,3, -49,0,180,3,111, -0,180,3,84,0, -180,3,57,0,180, -3,119,0,180,3, -65,0,180,3,100, -0,180,3,73,0, -180,3,108,0,180, -3,81,0,180,3, -54,0,180,3,116, -0,982,12,1,10866, -983,5,63,3,97, -0,984,12,1,10933, -985,5,63,3,97, -0,180,3,70,0, -180,3,105,0,180, -3,78,0,180,3, -51,0,180,3,113, -0,180,3,86,0, -180,3,121,0,180, -3,67,0,180,3, -102,0,180,3,75, -0,180,3,48,0, -180,3,110,0,180, -3,83,0,180,3, -56,0,180,3,118, -0,180,3,99,0, -180,3,72,0,180, -3,107,0,180,3, -80,0,180,3,53, -0,180,3,115,0, -180,3,88,0,180, -3,69,0,180,3, -104,0,180,3,77, -0,180,3,50,0, -180,3,112,0,180, -3,85,0,180,3, -120,0,180,3,66, -0,180,3,101,0, -180,3,74,0,180, -3,109,0,180,3, -82,0,180,3,55, -0,180,3,117,0, -180,3,90,0,180, -3,98,0,180,3, -71,0,180,3,106, -0,180,3,79,0, -180,3,52,0,180, -3,114,0,986,12, -1,11018,987,5,63, -3,97,0,180,3, -70,0,180,3,105, -0,180,3,78,0, -180,3,51,0,180, -3,113,0,180,3, -86,0,180,3,121, -0,180,3,67,0, -180,3,102,0,180, -3,75,0,180,3, -48,0,180,3,110, -0,180,3,83,0, -180,3,56,0,180, -3,118,0,180,3, -99,0,180,3,72, -0,180,3,107,0, -180,3,80,0,180, -3,53,0,180,3, -115,0,180,3,88, -0,180,3,69,0, -180,3,104,0,180, -3,77,0,180,3, -50,0,180,3,112, -0,180,3,85,0, -180,3,120,0,180, -3,66,0,180,3, -101,0,180,3,74, -0,180,3,109,0, -180,3,82,0,180, -3,55,0,180,3, -117,0,180,3,90, -0,180,3,98,0, -180,3,71,0,180, -3,106,0,180,3, -79,0,180,3,52, -0,180,3,114,0, -180,3,87,0,180, -3,122,0,180,3, -95,0,180,3,68, -0,180,3,103,0, -988,12,1,11105,989, -5,63,3,97,0, -180,3,70,0,180, -3,105,0,180,3, -78,0,180,3,51, -0,180,3,113,0, -180,3,86,0,180, -3,121,0,180,3, -67,0,180,3,102, -0,180,3,75,0, -180,3,48,0,180, -3,110,0,180,3, -83,0,180,3,56, -0,180,3,118,0, -180,3,99,0,180, -3,72,0,180,3, -107,0,180,3,80, -0,180,3,53,0, -180,3,115,0,180, -3,88,0,180,3, -69,0,180,3,104, -0,180,3,77,0, -180,3,50,0,180, -3,112,0,180,3, -85,0,180,3,120, -0,180,3,66,0, -180,3,101,0,990, -12,1,11185,991,5, -63,3,97,0,180, -3,70,0,180,3, -105,0,180,3,78, -0,180,3,51,0, -180,3,113,0,180, -3,86,0,180,3, -121,0,180,3,67, -0,180,3,102,0, -180,3,75,0,180, -3,48,0,180,3, -110,0,180,3,83, -0,180,3,56,0, -180,3,118,0,180, -3,99,0,180,3, -72,0,180,3,107, -0,180,3,80,0, -180,3,53,0,180, -3,115,0,180,3, -88,0,180,3,69, -0,180,3,104,0, -180,3,77,0,180, -3,50,0,180,3, -112,0,180,3,85, -0,180,3,120,0, -180,3,66,0,180, -3,101,0,180,3, -74,0,180,3,109, -0,180,3,82,0, -180,3,55,0,180, -3,117,0,180,3, -90,0,180,3,98, -0,180,3,71,0, -180,3,106,0,180, -3,79,0,180,3, -52,0,180,3,114, -0,180,3,87,0, -180,3,122,0,180, -3,95,0,180,3, -68,0,180,3,103, -0,180,3,76,0, -180,3,49,0,180, -3,111,0,180,3, -84,0,180,3,57, -0,180,3,119,0, -180,3,65,0,180, -3,100,0,180,3, -73,0,180,3,108, -0,180,3,81,0, -180,3,54,0,180, -3,116,0,992,12, -1,11278,993,5,63, -3,97,0,180,3, -70,0,180,3,105, -0,180,3,78,0, -180,3,51,0,180, -3,113,0,180,3, -86,0,180,3,121, -0,180,3,67,0, -180,3,102,0,180, -3,75,0,180,3, -48,0,180,3,110, -0,180,3,83,0, -180,3,56,0,180, -3,118,0,180,3, -99,0,180,3,72, -0,180,3,107,0, -180,3,80,0,180, -3,53,0,180,3, -115,0,180,3,88, -0,180,3,69,0, -180,3,104,0,180, -3,77,0,180,3, -50,0,180,3,112, -0,180,3,85,0, -180,3,120,0,180, -3,66,0,180,3, -101,0,180,3,74, -0,180,3,109,0, -180,3,82,0,180, -3,55,0,180,3, -117,0,180,3,90, -0,180,3,98,0, -180,3,71,0,180, -3,106,0,180,3, -79,0,180,3,52, -0,180,3,114,0, -180,3,87,0,180, -3,122,0,180,3, -95,0,180,3,68, -0,180,3,103,0, -180,3,76,0,180, -3,49,0,180,3, -111,0,180,3,84, -0,180,3,57,0, -180,3,119,0,180, -3,65,0,180,3, -100,0,180,3,73, -0,180,3,108,0, -180,3,81,0,180, -3,54,0,180,3, -116,0,180,3,89, -0,180,994,11,1, -367,0,995,4,30, -65,0,84,0,95, -0,84,0,65,0, -82,0,71,0,69, -0,84,0,95,0, -69,0,86,0,69, -0,78,0,84,0, -1,-1,3,89,0, -180,996,11,1,867, -0,183,1,-1,3, -74,0,180,3,109, -0,180,3,82,0, -180,3,55,0,180, -3,117,0,180,3, -90,0,180,3,98, -0,180,3,71,0, -180,3,106,0,180, -3,79,0,180,3, -52,0,180,3,114, -0,180,3,87,0, -180,3,122,0,180, -3,95,0,180,3, -68,0,180,3,103, -0,180,3,76,0, -180,3,49,0,180, -3,111,0,180,3, -84,0,180,3,57, -0,180,3,119,0, -180,3,65,0,180, -3,100,0,180,3, -73,0,180,3,108, -0,180,3,81,0, -180,3,54,0,180, -3,116,0,180,3, -89,0,180,997,11, -1,867,0,183,1, --1,3,76,0,180, -3,49,0,180,3, -111,0,180,3,84, -0,180,3,57,0, -180,3,119,0,180, -3,65,0,180,3, -100,0,180,3,73, -0,180,3,108,0, -180,3,81,0,180, -3,54,0,180,3, -116,0,180,3,89, -0,180,998,11,1, -867,0,183,1,-1, -3,87,0,180,3, -122,0,180,3,95, -0,180,3,68,0, -180,3,103,0,180, -3,76,0,180,3, -49,0,180,3,111, -0,180,3,84,0, -180,3,57,0,180, -3,119,0,180,3, -65,0,180,3,100, -0,180,3,73,0, -180,3,108,0,180, -3,81,0,180,3, -54,0,180,3,116, -0,180,3,89,0, -180,999,11,1,867, -0,183,1,-1,3, -70,0,180,3,105, -0,180,3,78,0, -180,3,51,0,180, -3,113,0,180,3, -86,0,180,3,121, -0,180,3,67,0, -180,3,102,0,180, -3,75,0,180,3, -48,0,180,3,110, -0,180,3,83,0, -180,3,56,0,180, -3,118,0,180,3, -99,0,180,3,72, -0,180,3,107,0, -180,3,80,0,180, -3,53,0,180,3, -115,0,180,3,88, -0,180,3,69,0, -180,3,104,0,180, -3,77,0,180,3, -50,0,180,3,112, -0,180,3,85,0, -180,3,120,0,180, -3,66,0,180,3, -101,0,180,3,74, -0,180,3,109,0, -180,3,82,0,180, -3,55,0,180,3, -117,0,180,3,90, -0,180,3,98,0, -180,3,71,0,180, -3,106,0,180,3, -79,0,180,3,52, -0,180,3,114,0, -180,3,87,0,180, -3,122,0,180,3, -95,0,180,3,68, -0,180,3,103,0, -180,3,76,0,180, -3,49,0,180,3, -111,0,180,3,84, -0,180,3,57,0, -180,3,119,0,180, -3,65,0,180,3, -100,0,180,3,73, -0,180,3,108,0, -180,3,81,0,180, -3,54,0,180,3, -116,0,180,3,89, -0,180,1000,11,1, -867,0,183,1,-1, -3,89,0,180,1001, -11,1,867,0,183, -1,-1,3,68,0, -180,3,103,0,180, -3,76,0,180,3, -49,0,180,3,111, -0,180,3,84,0, -180,3,57,0,180, -3,119,0,180,3, -65,0,180,3,100, -0,180,3,73,0, -180,3,108,0,180, -3,81,0,180,3, -54,0,180,3,116, -0,1002,12,1,11670, -1003,5,63,3,97, -0,1004,12,1,11737, -1005,5,63,3,97, -0,180,3,70,0, -180,3,105,0,180, -3,78,0,180,3, -51,0,180,3,113, -0,180,3,86,0, -180,3,121,0,180, -3,67,0,180,3, -102,0,180,3,75, -0,180,3,48,0, -180,3,110,0,180, -3,83,0,180,3, -56,0,180,3,118, -0,180,3,99,0, -1006,12,1,11811,1007, -5,63,3,97,0, -180,3,70,0,180, -3,105,0,180,3, -78,0,180,3,51, -0,180,3,113,0, -180,3,86,0,180, -3,121,0,180,3, -67,0,180,3,102, -0,180,3,75,0, -180,3,48,0,180, -3,110,0,180,3, -83,0,180,3,56, -0,180,3,118,0, -180,3,99,0,180, -3,72,0,180,3, -107,0,180,3,80, -0,180,3,53,0, -180,3,115,0,180, -3,88,0,180,3, -69,0,180,3,104, -0,1008,12,1,11888, -1009,5,63,3,97, -0,180,3,70,0, -180,3,105,0,180, -3,78,0,180,3, -51,0,180,3,113, -0,180,3,86,0, -180,3,121,0,180, -3,67,0,180,3, -102,0,180,3,75, -0,180,3,48,0, -180,3,110,0,180, -3,83,0,180,3, -56,0,180,3,118, -0,180,3,99,0, -180,3,72,0,180, -3,107,0,180,3, -80,0,180,3,53, -0,180,3,115,0, -180,3,88,0,180, -3,69,0,180,3, -104,0,180,3,77, -0,180,3,50,0, -180,3,112,0,180, -3,85,0,180,3, -120,0,180,3,66, -0,180,3,101,0, -180,3,74,0,180, -3,109,0,180,3, -82,0,180,3,55, -0,180,3,117,0, -180,3,90,0,180, -3,98,0,180,3, -71,0,180,3,106, -0,180,3,79,0, -180,3,52,0,180, -3,114,0,180,3, -87,0,180,3,122, -0,180,3,95,0, -180,3,68,0,180, -3,103,0,180,3, -76,0,180,3,49, -0,180,3,111,0, -180,3,84,0,180, -3,57,0,180,3, -119,0,180,3,65, -0,180,3,100,0, -180,3,73,0,180, -3,108,0,180,3, -81,0,180,3,54, -0,180,3,116,0, -180,3,89,0,180, -1010,11,1,380,0, -1011,4,24,65,0, -84,0,84,0,65, -0,67,0,72,0, -95,0,69,0,86, -0,69,0,78,0, -84,0,1,-1,3, -77,0,180,3,50, -0,180,3,112,0, -180,3,85,0,180, -3,120,0,180,3, -66,0,180,3,101, -0,180,3,74,0, -180,3,109,0,180, -3,82,0,180,3, -55,0,180,3,117, -0,180,3,90,0, -180,3,98,0,180, -3,71,0,180,3, -106,0,180,3,79, -0,180,3,52,0, -180,3,114,0,180, -3,87,0,180,3, -122,0,180,3,95, -0,180,3,68,0, -180,3,103,0,180, -3,76,0,180,3, -49,0,180,3,111, -0,180,3,84,0, -180,3,57,0,180, -3,119,0,180,3, -65,0,180,3,100, -0,180,3,73,0, -180,3,108,0,180, -3,81,0,180,3, -54,0,180,3,116, -0,180,3,89,0, -180,1012,11,1,867, -0,183,1,-1,3, -72,0,180,3,107, -0,180,3,80,0, -180,3,53,0,180, -3,115,0,180,3, -88,0,180,3,69, -0,180,3,104,0, -180,3,77,0,180, -3,50,0,180,3, -112,0,180,3,85, -0,180,3,120,0, -180,3,66,0,180, -3,101,0,180,3, -74,0,180,3,109, -0,180,3,82,0, -180,3,55,0,180, -3,117,0,180,3, -90,0,180,3,98, -0,180,3,71,0, -180,3,106,0,180, -3,79,0,180,3, -52,0,180,3,114, -0,180,3,87,0, -180,3,122,0,180, -3,95,0,180,3, -68,0,180,3,103, -0,180,3,76,0, -180,3,49,0,180, -3,111,0,180,3, -84,0,180,3,57, -0,180,3,119,0, -180,3,65,0,180, -3,100,0,180,3, -73,0,180,3,108, -0,180,3,81,0, -180,3,54,0,180, -3,116,0,180,3, -89,0,180,1013,11, -1,867,0,183,1, --1,3,70,0,180, -3,105,0,180,3, -78,0,180,3,51, -0,180,3,113,0, -180,3,86,0,180, -3,121,0,180,3, -67,0,180,3,102, -0,180,3,75,0, -180,3,48,0,180, -3,110,0,180,3, -83,0,180,3,56, -0,180,3,118,0, -180,3,99,0,180, -3,72,0,180,3, -107,0,180,3,80, -0,180,3,53,0, -180,3,115,0,180, -3,88,0,180,3, -69,0,180,3,104, -0,180,3,77,0, -180,3,50,0,180, -3,112,0,180,3, -85,0,180,3,120, -0,180,3,66,0, -180,3,101,0,180, -3,74,0,180,3, -109,0,180,3,82, -0,180,3,55,0, -180,3,117,0,180, -3,90,0,180,3, -98,0,180,3,71, -0,180,3,106,0, -180,3,79,0,180, -3,52,0,180,3, -114,0,180,3,87, -0,180,3,122,0, -180,3,95,0,180, -3,68,0,180,3, -103,0,180,3,76, -0,180,3,49,0, -180,3,111,0,180, -3,84,0,180,3, -57,0,180,3,119, -0,180,3,65,0, -180,3,100,0,180, -3,73,0,180,3, -108,0,180,3,81, -0,180,3,54,0, -180,3,116,0,180, -3,89,0,180,1014, -11,1,867,0,183, -1,-1,3,89,0, -180,1015,11,1,867, -0,183,1,-1,3, -89,0,180,1016,11, -1,867,0,183,1, --1,3,57,0,647, -3,94,0,1017,12, -1,2778,1018,5,0, -1019,11,1,170,0, -1020,4,10,67,0, -65,0,82,0,69, -0,84,0,1,-1, -3,54,0,647,3, -91,0,1021,12,1, -7969,1022,5,0,1023, -11,1,126,0,1024, -4,24,76,0,69, -0,70,0,84,0, -95,0,66,0,82, -0,65,0,67,0, -75,0,69,0,84, -0,1,-1,3,51, -0,647,3,88,0, -178,3,48,0,1025, -12,1,9070,1026,5, -13,3,48,0,647, -3,88,0,1027,12, -1,9149,1028,5,22, -3,48,0,1029,12, -1,9199,1030,5,22, -3,48,0,1029,3, -70,0,1029,3,55, -0,1029,3,66,0, -1029,3,51,0,1029, -3,99,0,1029,3, -65,0,1029,3,69, -0,1029,3,54,0, -1029,3,102,0,1029, -3,50,0,1029,3, -98,0,1029,3,57, -0,1029,3,68,0, -1029,3,53,0,1029, -3,101,0,1029,3, -49,0,1029,3,97, -0,1029,3,56,0, -1029,3,67,0,1029, -3,52,0,1029,3, -100,0,1029,1031,11, -1,885,0,1032,4, -40,72,0,69,0, -88,0,95,0,73, -0,78,0,84,0, -69,0,71,0,69, -0,82,0,95,0, -67,0,79,0,78, -0,83,0,84,0, -65,0,78,0,84, -0,1,-1,3,70, -0,1029,3,55,0, -1029,3,66,0,1029, -3,51,0,1029,3, -99,0,1029,3,65, -0,1029,3,69,0, -1029,3,54,0,1029, -3,102,0,1029,3, -50,0,1029,3,98, -0,1029,3,57,0, -1029,3,68,0,1029, -3,53,0,1029,3, -101,0,1029,3,49, -0,1029,3,97,0, -1029,3,56,0,1029, -3,67,0,1029,3, -52,0,1029,3,100, -0,1029,0,165,1, --1,3,55,0,647, -3,51,0,647,3, -54,0,647,3,50, -0,647,3,120,0, -1027,3,57,0,647, -3,46,0,649,3, -53,0,647,3,49, -0,647,3,56,0, -647,3,52,0,647, -1033,11,1,879,0, -667,1,-1,3,125, -0,1034,12,1,7483, -1035,5,0,1036,11, -1,56,0,1037,4, -22,82,0,73,0, -71,0,72,0,84, -0,95,0,66,0, -82,0,65,0,67, -0,69,0,1,-1, -3,85,0,178,3, -45,0,1038,12,1, -8090,1039,5,2,3, -61,0,1040,12,1, -8098,1041,5,0,1042, -11,1,22,0,1043, -4,24,77,0,73, -0,78,0,85,0, -83,0,95,0,69, -0,81,0,85,0, -65,0,76,0,83, -0,1,-1,3,45, -0,1044,12,1,8243, -1045,5,0,1046,11, -1,10,0,1047,4, -18,68,0,69,0, -67,0,82,0,69, -0,77,0,69,0, -78,0,84,0,1, --1,1048,11,1,86, -0,1049,4,10,77, -0,73,0,78,0, -85,0,83,0,1, --1,3,122,0,178, -3,82,0,178,3, -42,0,1050,12,1, -6395,1051,5,1,3, -61,0,1052,12,1, -6403,1053,5,0,1054, -11,1,28,0,1055, -4,22,83,0,84, -0,65,0,82,0, -95,0,69,0,81, -0,85,0,65,0, -76,0,83,0,1, --1,1056,11,1,91, -0,1057,4,8,83, -0,84,0,65,0, -82,0,1,-1,3, -119,0,1058,12,1, -37426,1059,5,63,3, -97,0,180,3,70, -0,180,3,105,0, -180,3,78,0,180, -3,51,0,180,3, -113,0,180,3,86, -0,180,3,121,0, -180,3,67,0,180, -3,102,0,180,3, -75,0,180,3,48, -0,180,3,110,0, -180,3,83,0,180, -3,56,0,180,3, -118,0,180,3,99, -0,180,3,72,0, -180,3,107,0,180, -3,80,0,180,3, -53,0,180,3,115, -0,180,3,88,0, -180,3,69,0,180, -3,104,0,1060,12, -1,37503,1061,5,63, -3,97,0,180,3, -70,0,180,3,105, -0,1062,12,1,37571, -1063,5,63,3,97, -0,180,3,70,0, -180,3,105,0,180, -3,78,0,180,3, -51,0,180,3,113, -0,180,3,86,0, -180,3,121,0,180, -3,67,0,180,3, -102,0,180,3,75, -0,180,3,48,0, -180,3,110,0,180, -3,83,0,180,3, -56,0,180,3,118, -0,180,3,99,0, -180,3,72,0,180, -3,107,0,180,3, -80,0,180,3,53, -0,180,3,115,0, -180,3,88,0,180, -3,69,0,180,3, -104,0,180,3,77, -0,180,3,50,0, -180,3,112,0,180, -3,85,0,180,3, -120,0,180,3,66, -0,180,3,101,0, -180,3,74,0,180, -3,109,0,180,3, -82,0,180,3,55, -0,180,3,117,0, -180,3,90,0,180, -3,98,0,180,3, -71,0,180,3,106, -0,180,3,79,0, -180,3,52,0,180, -3,114,0,180,3, -87,0,180,3,122, -0,180,3,95,0, -180,3,68,0,180, -3,103,0,180,3, -76,0,180,3,49, -0,180,3,111,0, -180,3,84,0,180, -3,57,0,180,3, -119,0,180,3,65, -0,180,3,100,0, -180,3,73,0,180, -3,108,0,1064,12, -1,37662,1065,5,63, -3,97,0,180,3, -70,0,180,3,105, -0,180,3,78,0, -180,3,51,0,180, -3,113,0,180,3, -86,0,180,3,121, -0,180,3,67,0, -180,3,102,0,180, -3,75,0,180,3, -48,0,180,3,110, -0,180,3,83,0, -180,3,56,0,180, -3,118,0,180,3, -99,0,180,3,72, -0,180,3,107,0, -180,3,80,0,180, -3,53,0,180,3, -115,0,180,3,88, -0,180,3,69,0, -180,3,104,0,180, -3,77,0,180,3, -50,0,180,3,112, -0,180,3,85,0, -180,3,120,0,180, -3,66,0,180,3, -101,0,1066,12,1, -37742,1067,5,63,3, -97,0,180,3,70, -0,180,3,105,0, -180,3,78,0,180, -3,51,0,180,3, -113,0,180,3,86, -0,180,3,121,0, -180,3,67,0,180, -3,102,0,180,3, -75,0,180,3,48, -0,180,3,110,0, -180,3,83,0,180, -3,56,0,180,3, -118,0,180,3,99, -0,180,3,72,0, -180,3,107,0,180, -3,80,0,180,3, -53,0,180,3,115, -0,180,3,88,0, -180,3,69,0,180, -3,104,0,180,3, -77,0,180,3,50, -0,180,3,112,0, -180,3,85,0,180, -3,120,0,180,3, -66,0,180,3,101, -0,180,3,74,0, -180,3,109,0,180, -3,82,0,180,3, -55,0,180,3,117, -0,180,3,90,0, -180,3,98,0,180, -3,71,0,180,3, -106,0,180,3,79, -0,180,3,52,0, -180,3,114,0,180, -3,87,0,180,3, -122,0,180,3,95, -0,180,3,68,0, -180,3,103,0,180, -3,76,0,180,3, -49,0,180,3,111, -0,180,3,84,0, -180,3,57,0,180, -3,119,0,180,3, -65,0,180,3,100, -0,180,3,73,0, -180,3,108,0,180, -3,81,0,180,3, -54,0,180,3,116, -0,180,3,89,0, -180,1068,11,1,229, -0,1069,4,10,87, -0,72,0,73,0, -76,0,69,0,1, --1,3,74,0,180, -3,109,0,180,3, -82,0,180,3,55, -0,180,3,117,0, -180,3,90,0,180, -3,98,0,180,3, -71,0,180,3,106, -0,180,3,79,0, -180,3,52,0,180, -3,114,0,180,3, -87,0,180,3,122, -0,180,3,95,0, -180,3,68,0,180, -3,103,0,180,3, -76,0,180,3,49, -0,180,3,111,0, -180,3,84,0,180, -3,57,0,180,3, -119,0,180,3,65, -0,180,3,100,0, -180,3,73,0,180, -3,108,0,180,3, -81,0,180,3,54, -0,180,3,116,0, -180,3,89,0,180, -1070,11,1,867,0, -183,1,-1,3,81, -0,180,3,54,0, -180,3,116,0,180, -3,89,0,180,1071, -11,1,867,0,183, -1,-1,3,78,0, -180,3,51,0,180, -3,113,0,180,3, -86,0,180,3,121, -0,180,3,67,0, -180,3,102,0,180, -3,75,0,180,3, -48,0,180,3,110, -0,180,3,83,0, -180,3,56,0,180, -3,118,0,180,3, -99,0,180,3,72, -0,180,3,107,0, -180,3,80,0,180, -3,53,0,180,3, -115,0,180,3,88, -0,180,3,69,0, -180,3,104,0,180, -3,77,0,180,3, -50,0,180,3,112, -0,180,3,85,0, -180,3,120,0,180, -3,66,0,180,3, -101,0,180,3,74, -0,180,3,109,0, -180,3,82,0,180, -3,55,0,180,3, -117,0,180,3,90, -0,180,3,98,0, -180,3,71,0,180, -3,106,0,180,3, -79,0,180,3,52, -0,180,3,114,0, -180,3,87,0,180, -3,122,0,180,3, -95,0,180,3,68, -0,180,3,103,0, -180,3,76,0,180, -3,49,0,180,3, -111,0,180,3,84, -0,180,3,57,0, -180,3,119,0,180, -3,65,0,180,3, -100,0,180,3,73, -0,180,3,108,0, -180,3,81,0,180, -3,54,0,180,3, -116,0,180,3,89, -0,180,1072,11,1, -867,0,183,1,-1, -3,77,0,180,3, -50,0,180,3,112, -0,180,3,85,0, -180,3,120,0,180, -3,66,0,180,3, -101,0,180,3,74, -0,180,3,109,0, -180,3,82,0,180, -3,55,0,180,3, -117,0,180,3,90, -0,180,3,98,0, -180,3,71,0,180, -3,106,0,180,3, -79,0,180,3,52, -0,180,3,114,0, -180,3,87,0,180, -3,122,0,180,3, -95,0,180,3,68, -0,180,3,103,0, -180,3,76,0,180, -3,49,0,180,3, -111,0,180,3,84, -0,180,3,57,0, -180,3,119,0,180, -3,65,0,180,3, -100,0,180,3,73, -0,180,3,108,0, -180,3,81,0,180, -3,54,0,180,3, -116,0,180,3,89, -0,180,1073,11,1, -867,0,183,1,-1, -3,79,0,178,3, -116,0,1074,12,1, -44630,1075,5,63,3, -97,0,180,3,70, -0,180,3,105,0, -1076,12,1,44698,1077, -5,63,3,97,0, -180,3,70,0,180, -3,105,0,180,3, -78,0,180,3,51, -0,180,3,113,0, -180,3,86,0,180, -3,121,0,180,3, -67,0,180,3,102, -0,180,3,75,0, -180,3,48,0,180, -3,110,0,180,3, -83,0,180,3,56, -0,180,3,118,0, -180,3,99,0,180, -3,72,0,180,3, -107,0,180,3,80, -0,180,3,53,0, -180,3,115,0,180, -3,88,0,180,3, -69,0,180,3,104, -0,180,3,77,0, -180,3,50,0,180, -3,112,0,180,3, -85,0,180,3,120, -0,180,3,66,0, -180,3,101,0,180, -3,74,0,180,3, -109,0,1078,12,1, -44779,1079,5,63,3, -97,0,180,3,70, -0,180,3,105,0, -180,3,78,0,180, -3,51,0,180,3, -113,0,180,3,86, -0,180,3,121,0, -180,3,67,0,180, -3,102,0,180,3, -75,0,180,3,48, -0,180,3,110,0, -180,3,83,0,180, -3,56,0,180,3, -118,0,180,3,99, -0,180,3,72,0, -180,3,107,0,180, -3,80,0,180,3, -53,0,180,3,115, -0,180,3,88,0, -180,3,69,0,180, -3,104,0,180,3, -77,0,180,3,50, -0,180,3,112,0, -180,3,85,0,180, -3,120,0,180,3, -66,0,180,3,101, -0,1080,12,1,44859, -1081,5,63,3,97, -0,180,3,70,0, -180,3,105,0,180, -3,78,0,180,3, -51,0,180,3,113, -0,180,3,86,0, -180,3,121,0,180, -3,67,0,180,3, -102,0,180,3,75, -0,180,3,48,0, -180,3,110,0,180, -3,83,0,180,3, -56,0,180,3,118, -0,180,3,99,0, -180,3,72,0,180, -3,107,0,180,3, -80,0,180,3,53, -0,180,3,115,0, -180,3,88,0,180, -3,69,0,180,3, -104,0,180,3,77, -0,180,3,50,0, -180,3,112,0,180, -3,85,0,180,3, -120,0,180,3,66, -0,180,3,101,0, -180,3,74,0,180, -3,109,0,180,3, -82,0,180,3,55, -0,180,3,117,0, -180,3,90,0,180, -3,98,0,180,3, -71,0,180,3,106, -0,180,3,79,0, -180,3,52,0,180, -3,114,0,1082,12, -1,44944,1083,5,63, -3,97,0,180,3, -70,0,180,3,105, -0,180,3,78,0, -180,3,51,0,180, -3,113,0,180,3, -86,0,180,3,121, -0,180,3,67,0, -180,3,102,0,180, -3,75,0,180,3, -48,0,180,3,110, -0,180,3,83,0, -180,3,56,0,180, -3,118,0,180,3, -99,0,180,3,72, -0,180,3,107,0, -180,3,80,0,180, -3,53,0,180,3, -115,0,180,3,88, -0,180,3,69,0, -180,3,104,0,180, -3,77,0,180,3, -50,0,180,3,112, -0,180,3,85,0, -180,3,120,0,180, -3,66,0,180,3, -101,0,180,3,74, -0,180,3,109,0, -180,3,82,0,180, -3,55,0,180,3, -117,0,180,3,90, -0,180,3,98,0, -180,3,71,0,180, -3,106,0,180,3, -79,0,180,3,52, -0,180,3,114,0, -180,3,87,0,180, -3,122,0,180,3, -95,0,180,3,68, -0,180,3,103,0, -180,3,76,0,180, -3,49,0,180,3, -111,0,180,3,84, -0,180,3,57,0, -180,3,119,0,180, -3,65,0,180,3, -100,0,180,3,73, -0,180,3,108,0, -180,3,81,0,180, -3,54,0,180,3, -116,0,180,3,89, -0,180,1084,11,1, -783,0,1085,4,22, -84,0,73,0,77, -0,69,0,82,0, -95,0,69,0,86, -0,69,0,78,0, -84,0,1,-1,3, -87,0,180,3,122, -0,180,3,95,0, -180,3,68,0,180, -3,103,0,180,3, -76,0,180,3,49, -0,180,3,111,0, -180,3,84,0,180, -3,57,0,180,3, -119,0,180,3,65, -0,180,3,100,0, -180,3,73,0,180, -3,108,0,180,3, -81,0,180,3,54, -0,180,3,116,0, -180,3,89,0,180, -1086,11,1,867,0, -183,1,-1,3,74, -0,180,3,109,0, -180,3,82,0,180, -3,55,0,180,3, -117,0,180,3,90, -0,180,3,98,0, -180,3,71,0,180, -3,106,0,180,3, -79,0,180,3,52, -0,180,3,114,0, -180,3,87,0,180, -3,122,0,180,3, -95,0,180,3,68, -0,180,3,103,0, -180,3,76,0,180, -3,49,0,180,3, -111,0,180,3,84, -0,180,3,57,0, -180,3,119,0,180, -3,65,0,180,3, -100,0,180,3,73, -0,180,3,108,0, -180,3,81,0,180, -3,54,0,180,3, -116,0,180,3,89, -0,180,1087,11,1, -867,0,183,1,-1, -3,82,0,180,3, -55,0,180,3,117, -0,180,3,90,0, -180,3,98,0,180, -3,71,0,180,3, -106,0,180,3,79, -0,180,3,52,0, -180,3,114,0,180, -3,87,0,180,3, -122,0,180,3,95, -0,180,3,68,0, -180,3,103,0,180, -3,76,0,180,3, -49,0,180,3,111, -0,180,3,84,0, -180,3,57,0,180, -3,119,0,180,3, -65,0,180,3,100, -0,180,3,73,0, -180,3,108,0,180, -3,81,0,180,3, -54,0,180,3,116, -0,180,3,89,0, -180,1088,11,1,867, -0,183,1,-1,3, -78,0,180,3,51, -0,180,3,113,0, -180,3,86,0,180, -3,121,0,180,3, -67,0,180,3,102, -0,180,3,75,0, -180,3,48,0,180, -3,110,0,180,3, -83,0,180,3,56, -0,180,3,118,0, -180,3,99,0,180, -3,72,0,180,3, -107,0,180,3,80, -0,180,3,53,0, -180,3,115,0,180, -3,88,0,180,3, -69,0,180,3,104, -0,180,3,77,0, -180,3,50,0,180, -3,112,0,180,3, -85,0,180,3,120, -0,180,3,66,0, -180,3,101,0,180, -3,74,0,180,3, -109,0,180,3,82, -0,180,3,55,0, -180,3,117,0,180, -3,90,0,180,3, -98,0,180,3,71, -0,180,3,106,0, -180,3,79,0,180, -3,52,0,180,3, -114,0,1089,12,1, -45195,1090,5,63,3, -97,0,1091,12,1, -45262,1092,5,63,3, -97,0,180,3,70, -0,180,3,105,0, -180,3,78,0,180, -3,51,0,180,3, -113,0,180,3,86, -0,180,3,121,0, -180,3,67,0,180, -3,102,0,180,3, -75,0,180,3,48, -0,180,3,110,0, -1093,12,1,45334,1094, -5,63,3,97,0, -180,3,70,0,180, -3,105,0,180,3, -78,0,180,3,51, -0,180,3,113,0, -180,3,86,0,180, -3,121,0,180,3, -67,0,180,3,102, -0,180,3,75,0, -180,3,48,0,180, -3,110,0,180,3, -83,0,180,3,56, -0,180,3,118,0, -180,3,99,0,180, -3,72,0,180,3, -107,0,180,3,80, -0,180,3,53,0, -180,3,115,0,1095, -12,1,45410,1096,5, -63,3,97,0,1097, -12,1,45477,1098,5, -63,3,97,0,180, -3,70,0,180,3, -105,0,180,3,78, -0,180,3,51,0, -180,3,113,0,180, -3,86,0,180,3, -121,0,180,3,67, -0,180,3,102,0, -180,3,75,0,180, -3,48,0,180,3, -110,0,180,3,83, -0,180,3,56,0, -180,3,118,0,180, -3,99,0,1099,12, -1,45551,1100,5,63, -3,97,0,180,3, -70,0,180,3,105, -0,180,3,78,0, -180,3,51,0,180, -3,113,0,180,3, -86,0,180,3,121, -0,180,3,67,0, -180,3,102,0,180, -3,75,0,180,3, -48,0,180,3,110, -0,180,3,83,0, -180,3,56,0,180, -3,118,0,180,3, -99,0,180,3,72, -0,180,3,107,0, -180,3,80,0,180, -3,53,0,180,3, -115,0,180,3,88, -0,180,3,69,0, -180,3,104,0,180, -3,77,0,180,3, -50,0,180,3,112, -0,180,3,85,0, -180,3,120,0,180, -3,66,0,180,3, -101,0,180,3,74, -0,180,3,109,0, -180,3,82,0,180, -3,55,0,180,3, -117,0,180,3,90, -0,180,3,98,0, -180,3,71,0,180, -3,106,0,180,3, -79,0,180,3,52, -0,180,3,114,0, -180,3,87,0,180, -3,122,0,180,3, -95,0,180,3,68, -0,180,3,103,0, -180,3,76,0,180, -3,49,0,180,3, -111,0,180,3,84, -0,180,3,57,0, -180,3,119,0,180, -3,65,0,180,3, -100,0,180,3,73, -0,180,3,108,0, -180,3,81,0,180, -3,54,0,180,3, -116,0,1101,12,1, -45644,1102,5,63,3, -97,0,180,3,70, -0,180,3,105,0, -1103,12,1,45712,1104, -5,63,3,97,0, -180,3,70,0,180, -3,105,0,180,3, -78,0,180,3,51, -0,180,3,113,0, -180,3,86,0,180, -3,121,0,180,3, -67,0,180,3,102, -0,180,3,75,0, -180,3,48,0,180, -3,110,0,180,3, -83,0,180,3,56, -0,180,3,118,0, -180,3,99,0,180, -3,72,0,180,3, -107,0,180,3,80, -0,180,3,53,0, -180,3,115,0,180, -3,88,0,180,3, -69,0,180,3,104, -0,180,3,77,0, -180,3,50,0,180, -3,112,0,180,3, -85,0,180,3,120, -0,180,3,66,0, -180,3,101,0,180, -3,74,0,180,3, -109,0,180,3,82, -0,180,3,55,0, -180,3,117,0,180, -3,90,0,180,3, -98,0,180,3,71, -0,180,3,106,0, -180,3,79,0,180, -3,52,0,180,3, -114,0,180,3,87, -0,180,3,122,0, -180,3,95,0,180, -3,68,0,180,3, -103,0,180,3,76, -0,180,3,49,0, -180,3,111,0,1105, -12,1,45800,1106,5, -63,3,97,0,180, -3,70,0,180,3, -105,0,180,3,78, -0,180,3,51,0, -180,3,113,0,180, -3,86,0,180,3, -121,0,180,3,67, -0,180,3,102,0, -180,3,75,0,180, -3,48,0,180,3, -110,0,1107,12,1, -45872,1108,5,63,3, -97,0,180,3,70, -0,180,3,105,0, -180,3,78,0,180, -3,51,0,180,3, -113,0,180,3,86, -0,180,3,121,0, -180,3,67,0,180, -3,102,0,180,3, -75,0,180,3,48, -0,180,3,110,0, -180,3,83,0,180, -3,56,0,180,3, -118,0,180,3,99, -0,180,3,72,0, -180,3,107,0,180, -3,80,0,180,3, -53,0,180,3,115, -0,180,3,88,0, -180,3,69,0,180, -3,104,0,180,3, -77,0,180,3,50, -0,180,3,112,0, -180,3,85,0,180, -3,120,0,180,3, -66,0,180,3,101, -0,180,3,74,0, -180,3,109,0,180, -3,82,0,180,3, -55,0,180,3,117, -0,180,3,90,0, -180,3,98,0,180, -3,71,0,180,3, -106,0,180,3,79, -0,180,3,52,0, -180,3,114,0,180, -3,87,0,180,3, -122,0,180,3,95, -0,1109,12,1,45908, -1110,5,63,3,97, -0,180,3,70,0, -180,3,105,0,180, -3,78,0,180,3, -51,0,180,3,113, -0,180,3,86,0, -180,3,121,0,180, -3,67,0,180,3, -102,0,180,3,75, -0,180,3,48,0, -180,3,110,0,180, -3,83,0,180,3, -56,0,180,3,118, -0,180,3,99,0, -180,3,72,0,180, -3,107,0,180,3, -80,0,180,3,53, -0,180,3,115,0, -180,3,88,0,180, -3,69,0,180,3, -104,0,180,3,77, -0,180,3,50,0, -180,3,112,0,180, -3,85,0,180,3, -120,0,180,3,66, -0,180,3,101,0, -180,3,74,0,180, -3,109,0,180,3, -82,0,180,3,55, -0,180,3,117,0, -180,3,90,0,180, -3,98,0,180,3, -71,0,180,3,106, -0,180,3,79,0, -180,3,52,0,180, -3,114,0,1111,12, -1,45993,1112,5,63, -3,97,0,180,3, -70,0,180,3,105, -0,180,3,78,0, -180,3,51,0,180, -3,113,0,180,3, -86,0,180,3,121, -0,180,3,67,0, -180,3,102,0,180, -3,75,0,180,3, -48,0,180,3,110, -0,180,3,83,0, -180,3,56,0,180, -3,118,0,180,3, -99,0,180,3,72, -0,180,3,107,0, -180,3,80,0,180, -3,53,0,180,3, -115,0,180,3,88, -0,180,3,69,0, -180,3,104,0,180, -3,77,0,180,3, -50,0,180,3,112, -0,180,3,85,0, -180,3,120,0,180, -3,66,0,180,3, -101,0,1113,12,1, -46073,1114,5,63,3, -97,0,180,3,70, -0,180,3,105,0, -180,3,78,0,180, -3,51,0,180,3, -113,0,180,3,86, -0,180,3,121,0, -180,3,67,0,180, -3,102,0,180,3, -75,0,180,3,48, -0,180,3,110,0, -180,3,83,0,180, -3,56,0,180,3, -118,0,180,3,99, -0,180,3,72,0, -180,3,107,0,180, -3,80,0,180,3, -53,0,180,3,115, -0,1115,12,1,46149, -1116,5,63,3,97, -0,180,3,70,0, -180,3,105,0,180, -3,78,0,180,3, -51,0,180,3,113, -0,180,3,86,0, -180,3,121,0,180, -3,67,0,180,3, -102,0,180,3,75, -0,180,3,48,0, -180,3,110,0,180, -3,83,0,180,3, -56,0,180,3,118, -0,180,3,99,0, -180,3,72,0,180, -3,107,0,180,3, -80,0,180,3,53, -0,180,3,115,0, -180,3,88,0,180, -3,69,0,180,3, -104,0,180,3,77, -0,180,3,50,0, -180,3,112,0,180, -3,85,0,180,3, -120,0,180,3,66, -0,180,3,101,0, -180,3,74,0,180, -3,109,0,180,3, -82,0,180,3,55, -0,180,3,117,0, -1117,12,1,46231,1118, -5,63,3,97,0, -180,3,70,0,180, -3,105,0,180,3, -78,0,180,3,51, -0,180,3,113,0, -180,3,86,0,180, -3,121,0,180,3, -67,0,180,3,102, -0,180,3,75,0, -180,3,48,0,180, -3,110,0,180,3, -83,0,180,3,56, -0,180,3,118,0, -180,3,99,0,180, -3,72,0,180,3, -107,0,180,3,80, -0,180,3,53,0, -180,3,115,0,180, -3,88,0,180,3, -69,0,180,3,104, -0,180,3,77,0, -180,3,50,0,180, -3,112,0,180,3, -85,0,180,3,120, -0,180,3,66,0, -180,3,101,0,180, -3,74,0,180,3, -109,0,180,3,82, -0,180,3,55,0, -180,3,117,0,180, -3,90,0,180,3, -98,0,180,3,71, -0,180,3,106,0, -180,3,79,0,180, -3,52,0,180,3, -114,0,180,3,87, -0,180,3,122,0, -180,3,95,0,180, -3,68,0,180,3, -103,0,180,3,76, -0,180,3,49,0, -180,3,111,0,180, -3,84,0,180,3, -57,0,180,3,119, -0,180,3,65,0, -180,3,100,0,180, -3,73,0,180,3, -108,0,1119,12,1, -46322,1120,5,63,3, -97,0,180,3,70, -0,180,3,105,0, -180,3,78,0,180, -3,51,0,180,3, -113,0,180,3,86, -0,180,3,121,0, -180,3,67,0,180, -3,102,0,180,3, -75,0,180,3,48, -0,180,3,110,0, -180,3,83,0,180, -3,56,0,180,3, -118,0,180,3,99, -0,180,3,72,0, -180,3,107,0,180, -3,80,0,180,3, -53,0,180,3,115, -0,180,3,88,0, -180,3,69,0,180, -3,104,0,180,3, -77,0,180,3,50, -0,180,3,112,0, -180,3,85,0,180, -3,120,0,180,3, -66,0,180,3,101, -0,180,3,74,0, -180,3,109,0,180, -3,82,0,180,3, -55,0,180,3,117, -0,180,3,90,0, -180,3,98,0,180, -3,71,0,180,3, -106,0,180,3,79, -0,180,3,52,0, -180,3,114,0,180, -3,87,0,180,3, -122,0,180,3,95, -0,180,3,68,0, -180,3,103,0,180, -3,76,0,180,3, -49,0,180,3,111, -0,180,3,84,0, -180,3,57,0,180, -3,119,0,180,3, -65,0,180,3,100, -0,180,3,73,0, -180,3,108,0,180, -3,81,0,180,3, -54,0,180,3,116, -0,1121,12,1,46415, -1122,5,63,3,97, -0,180,3,70,0, -180,3,105,0,180, -3,78,0,180,3, -51,0,180,3,113, -0,180,3,86,0, -180,3,121,0,180, -3,67,0,180,3, -102,0,180,3,75, -0,180,3,48,0, -180,3,110,0,180, -3,83,0,180,3, -56,0,180,3,118, -0,180,3,99,0, -180,3,72,0,180, -3,107,0,180,3, -80,0,180,3,53, -0,180,3,115,0, -180,3,88,0,180, -3,69,0,180,3, -104,0,180,3,77, -0,180,3,50,0, -180,3,112,0,180, -3,85,0,180,3, -120,0,180,3,66, -0,180,3,101,0, -180,3,74,0,180, -3,109,0,180,3, -82,0,180,3,55, -0,180,3,117,0, -180,3,90,0,180, -3,98,0,180,3, -71,0,180,3,106, -0,180,3,79,0, -180,3,52,0,180, -3,114,0,180,3, -87,0,180,3,122, -0,180,3,95,0, -180,3,68,0,180, -3,103,0,180,3, -76,0,180,3,49, -0,180,3,111,0, -180,3,84,0,180, -3,57,0,180,3, -119,0,180,3,65, -0,180,3,100,0, -180,3,73,0,180, -3,108,0,180,3, -81,0,180,3,54, -0,180,3,116,0, -180,3,89,0,180, -1123,11,1,845,0, -1124,4,48,84,0, -82,0,65,0,78, -0,83,0,65,0, -67,0,84,0,73, -0,79,0,78,0, -95,0,82,0,69, -0,83,0,85,0, -76,0,84,0,95, -0,69,0,86,0, -69,0,78,0,84, -0,1,-1,3,89, -0,180,1125,11,1, -867,0,183,1,-1, -3,81,0,180,3, -54,0,180,3,116, -0,180,3,89,0, -180,1126,11,1,867, -0,183,1,-1,3, -90,0,180,3,98, -0,180,3,71,0, -180,3,106,0,180, -3,79,0,180,3, -52,0,180,3,114, -0,180,3,87,0, -180,3,122,0,180, -3,95,0,180,3, -68,0,180,3,103, -0,180,3,76,0, -180,3,49,0,180, -3,111,0,180,3, -84,0,180,3,57, -0,180,3,119,0, -180,3,65,0,180, -3,100,0,180,3, -73,0,180,3,108, -0,180,3,81,0, -180,3,54,0,180, -3,116,0,180,3, -89,0,180,1127,11, -1,867,0,183,1, --1,3,88,0,180, -3,69,0,180,3, -104,0,180,3,77, -0,180,3,50,0, -180,3,112,0,180, -3,85,0,180,3, -120,0,180,3,66, -0,180,3,101,0, -180,3,74,0,180, -3,109,0,180,3, -82,0,180,3,55, -0,180,3,117,0, -180,3,90,0,180, -3,98,0,180,3, -71,0,180,3,106, -0,180,3,79,0, -180,3,52,0,180, -3,114,0,180,3, -87,0,180,3,122, -0,180,3,95,0, -180,3,68,0,180, -3,103,0,180,3, -76,0,180,3,49, -0,180,3,111,0, -180,3,84,0,180, -3,57,0,180,3, -119,0,180,3,65, -0,180,3,100,0, -180,3,73,0,180, -3,108,0,180,3, -81,0,180,3,54, -0,180,3,116,0, -180,3,89,0,180, -1128,11,1,867,0, -183,1,-1,3,74, -0,180,3,109,0, -180,3,82,0,180, -3,55,0,180,3, -117,0,180,3,90, -0,180,3,98,0, -180,3,71,0,180, -3,106,0,180,3, -79,0,180,3,52, -0,180,3,114,0, -180,3,87,0,180, -3,122,0,180,3, -95,0,180,3,68, -0,180,3,103,0, -180,3,76,0,180, -3,49,0,180,3, -111,0,180,3,84, -0,180,3,57,0, -180,3,119,0,180, -3,65,0,180,3, -100,0,180,3,73, -0,180,3,108,0, -180,3,81,0,180, -3,54,0,180,3, -116,0,180,3,89, -0,180,1129,11,1, -867,0,183,1,-1, -3,87,0,180,3, -122,0,180,3,95, -0,180,3,68,0, -180,3,103,0,180, -3,76,0,180,3, -49,0,180,3,111, -0,180,3,84,0, -180,3,57,0,180, -3,119,0,180,3, -65,0,180,3,100, -0,180,3,73,0, -180,3,108,0,180, -3,81,0,180,3, -54,0,180,3,116, -0,180,3,89,0, -180,1130,11,1,867, -0,183,1,-1,3, -68,0,180,3,103, -0,180,3,76,0, -180,3,49,0,180, -3,111,0,180,3, -84,0,180,3,57, -0,180,3,119,0, -180,3,65,0,180, -3,100,0,180,3, -73,0,180,3,108, -0,180,3,81,0, -180,3,54,0,180, -3,116,0,180,3, -89,0,180,1131,11, -1,867,0,183,1, --1,3,83,0,180, -3,56,0,180,3, -118,0,180,3,99, -0,180,3,72,0, -180,3,107,0,180, -3,80,0,180,3, -53,0,180,3,115, -0,180,3,88,0, -180,3,69,0,180, -3,104,0,180,3, -77,0,180,3,50, -0,180,3,112,0, -180,3,85,0,180, -3,120,0,180,3, -66,0,180,3,101, -0,180,3,74,0, -180,3,109,0,180, -3,82,0,180,3, -55,0,180,3,117, -0,180,3,90,0, -180,3,98,0,180, -3,71,0,180,3, -106,0,180,3,79, -0,180,3,52,0, -180,3,114,0,180, -3,87,0,180,3, -122,0,180,3,95, -0,180,3,68,0, -180,3,103,0,180, -3,76,0,180,3, -49,0,180,3,111, -0,180,3,84,0, -180,3,57,0,180, -3,119,0,180,3, -65,0,180,3,100, -0,180,3,73,0, -180,3,108,0,180, -3,81,0,180,3, -54,0,180,3,116, -0,180,3,89,0, -180,1132,11,1,867, -0,183,1,-1,3, -84,0,180,3,57, -0,180,3,119,0, -180,3,65,0,180, -3,100,0,180,3, -73,0,180,3,108, -0,180,3,81,0, -180,3,54,0,180, -3,116,0,180,3, -89,0,180,1133,11, -1,867,0,183,1, --1,3,78,0,180, -3,51,0,180,3, -113,0,180,3,86, -0,180,3,121,0, -180,3,67,0,180, -3,102,0,180,3, -75,0,180,3,48, -0,180,3,110,0, -180,3,83,0,180, -3,56,0,180,3, -118,0,180,3,99, -0,180,3,72,0, -180,3,107,0,180, -3,80,0,180,3, -53,0,180,3,115, -0,180,3,88,0, -180,3,69,0,180, -3,104,0,180,3, -77,0,180,3,50, -0,180,3,112,0, -180,3,85,0,180, -3,120,0,180,3, -66,0,180,3,101, -0,180,3,74,0, -180,3,109,0,180, -3,82,0,180,3, -55,0,180,3,117, -0,180,3,90,0, -180,3,98,0,180, -3,71,0,180,3, -106,0,180,3,79, -0,180,3,52,0, -180,3,114,0,180, -3,87,0,180,3, -122,0,180,3,95, -0,180,3,68,0, -180,3,103,0,180, -3,76,0,180,3, -49,0,180,3,111, -0,180,3,84,0, -180,3,57,0,180, -3,119,0,180,3, -65,0,180,3,100, -0,180,3,73,0, -180,3,108,0,180, -3,81,0,180,3, -54,0,180,3,116, -0,180,3,89,0, -180,1134,11,1,867, -0,183,1,-1,3, -89,0,180,1135,11, -1,867,0,183,1, --1,3,72,0,180, -3,107,0,180,3, -80,0,180,3,53, -0,180,3,115,0, -180,3,88,0,180, -3,69,0,180,3, -104,0,180,3,77, -0,180,3,50,0, -180,3,112,0,180, -3,85,0,180,3, -120,0,180,3,66, -0,180,3,101,0, -180,3,74,0,180, -3,109,0,180,3, -82,0,180,3,55, -0,180,3,117,0, -180,3,90,0,180, -3,98,0,180,3, -71,0,180,3,106, -0,180,3,79,0, -180,3,52,0,180, -3,114,0,180,3, -87,0,180,3,122, -0,180,3,95,0, -180,3,68,0,180, -3,103,0,180,3, -76,0,180,3,49, -0,180,3,111,0, -180,3,84,0,180, -3,57,0,180,3, -119,0,180,3,65, -0,180,3,100,0, -180,3,73,0,180, -3,108,0,180,3, -81,0,180,3,54, -0,180,3,116,0, -180,3,89,0,180, -1136,11,1,867,0, -183,1,-1,3,70, -0,180,3,105,0, -180,3,78,0,180, -3,51,0,180,3, -113,0,180,3,86, -0,180,3,121,0, -180,3,67,0,180, -3,102,0,180,3, -75,0,180,3,48, -0,180,3,110,0, -180,3,83,0,180, -3,56,0,180,3, -118,0,180,3,99, -0,180,3,72,0, -180,3,107,0,180, -3,80,0,180,3, -53,0,180,3,115, -0,180,3,88,0, -180,3,69,0,180, -3,104,0,180,3, -77,0,180,3,50, -0,180,3,112,0, -180,3,85,0,180, -3,120,0,180,3, -66,0,180,3,101, -0,180,3,74,0, -180,3,109,0,180, -3,82,0,180,3, -55,0,180,3,117, -0,180,3,90,0, -180,3,98,0,180, -3,71,0,180,3, -106,0,180,3,79, -0,180,3,52,0, -180,3,114,0,180, -3,87,0,180,3, -122,0,180,3,95, -0,180,3,68,0, -180,3,103,0,180, -3,76,0,180,3, -49,0,180,3,111, -0,180,3,84,0, -180,3,57,0,180, -3,119,0,180,3, -65,0,180,3,100, -0,180,3,73,0, -180,3,108,0,180, -3,81,0,180,3, -54,0,180,3,116, -0,180,3,89,0, -180,1137,11,1,867, -0,183,1,-1,3, -88,0,180,3,69, -0,180,3,104,0, -180,3,77,0,180, -3,50,0,180,3, -112,0,180,3,85, -0,180,3,120,0, -180,3,66,0,180, -3,101,0,180,3, -74,0,180,3,109, -0,180,3,82,0, -180,3,55,0,180, -3,117,0,180,3, -90,0,180,3,98, -0,180,3,71,0, -180,3,106,0,180, -3,79,0,180,3, -52,0,180,3,114, -0,180,3,87,0, -180,3,122,0,180, -3,95,0,180,3, -68,0,180,3,103, -0,180,3,76,0, -180,3,49,0,180, -3,111,0,180,3, -84,0,180,3,57, -0,180,3,119,0, -180,3,65,0,180, -3,100,0,180,3, -73,0,180,3,108, -0,180,3,81,0, -180,3,54,0,180, -3,116,0,180,3, -89,0,180,1138,11, -1,867,0,183,1, --1,3,83,0,180, -3,56,0,180,3, -118,0,180,3,99, -0,180,3,72,0, -180,3,107,0,180, -3,80,0,180,3, -53,0,180,3,115, -0,180,3,88,0, -180,3,69,0,180, -3,104,0,180,3, -77,0,180,3,50, -0,180,3,112,0, -180,3,85,0,180, -3,120,0,180,3, -66,0,180,3,101, -0,180,3,74,0, -180,3,109,0,180, -3,82,0,180,3, -55,0,180,3,117, -0,180,3,90,0, -180,3,98,0,180, -3,71,0,180,3, -106,0,180,3,79, -0,180,3,52,0, -180,3,114,0,180, -3,87,0,180,3, -122,0,180,3,95, -0,180,3,68,0, -180,3,103,0,180, -3,76,0,180,3, -49,0,180,3,111, -0,180,3,84,0, -180,3,57,0,180, -3,119,0,180,3, -65,0,180,3,100, -0,180,3,73,0, -180,3,108,0,180, -3,81,0,180,3, -54,0,180,3,116, -0,180,3,89,0, -180,1139,11,1,867, -0,183,1,-1,3, -70,0,180,3,105, -0,180,3,78,0, -180,3,51,0,180, -3,113,0,180,3, -86,0,180,3,121, -0,180,3,67,0, -180,3,102,0,180, -3,75,0,180,3, -48,0,180,3,110, -0,180,3,83,0, -180,3,56,0,180, -3,118,0,180,3, -99,0,180,3,72, -0,180,3,107,0, -180,3,80,0,180, -3,53,0,180,3, -115,0,180,3,88, -0,180,3,69,0, -180,3,104,0,180, -3,77,0,180,3, -50,0,180,3,112, -0,180,3,85,0, -180,3,120,0,180, -3,66,0,180,3, -101,0,180,3,74, -0,180,3,109,0, -180,3,82,0,180, -3,55,0,180,3, -117,0,180,3,90, -0,180,3,98,0, -180,3,71,0,180, -3,106,0,180,3, -79,0,180,3,52, -0,180,3,114,0, -180,3,87,0,180, -3,122,0,180,3, -95,0,180,3,68, -0,180,3,103,0, -180,3,76,0,180, -3,49,0,180,3, -111,0,180,3,84, -0,180,3,57,0, -180,3,119,0,180, -3,65,0,180,3, -100,0,180,3,73, -0,180,3,108,0, -180,3,81,0,180, -3,54,0,180,3, -116,0,180,3,89, -0,180,1140,11,1, -867,0,183,1,-1, -3,87,0,180,3, -122,0,180,3,95, -0,180,3,68,0, -180,3,103,0,180, -3,76,0,180,3, -49,0,180,3,111, -0,1141,12,1,47238, -1142,5,63,3,97, -0,180,3,70,0, -180,3,105,0,180, -3,78,0,180,3, -51,0,180,3,113, -0,180,3,86,0, -180,3,121,0,180, -3,67,0,180,3, -102,0,180,3,75, -0,180,3,48,0, -180,3,110,0,180, -3,83,0,180,3, -56,0,180,3,118, -0,180,3,99,0, -180,3,72,0,180, -3,107,0,180,3, -80,0,180,3,53, -0,180,3,115,0, -180,3,88,0,180, -3,69,0,180,3, -104,0,180,3,77, -0,180,3,50,0, -180,3,112,0,180, -3,85,0,180,3, -120,0,180,3,66, -0,180,3,101,0, -180,3,74,0,180, -3,109,0,180,3, -82,0,180,3,55, -0,180,3,117,0, -1143,12,1,47320,1144, -5,63,3,97,0, -180,3,70,0,180, -3,105,0,180,3, -78,0,180,3,51, -0,180,3,113,0, -180,3,86,0,180, -3,121,0,180,3, -67,0,180,3,102, -0,180,3,75,0, -180,3,48,0,180, -3,110,0,180,3, -83,0,180,3,56, -0,180,3,118,0, -180,3,99,0,1145, -12,1,47394,1146,5, -63,3,97,0,180, -3,70,0,180,3, -105,0,180,3,78, -0,180,3,51,0, -180,3,113,0,180, -3,86,0,180,3, -121,0,180,3,67, -0,180,3,102,0, -180,3,75,0,180, -3,48,0,180,3, -110,0,180,3,83, -0,180,3,56,0, -180,3,118,0,180, -3,99,0,180,3, -72,0,180,3,107, -0,180,3,80,0, -180,3,53,0,180, -3,115,0,180,3, -88,0,180,3,69, -0,180,3,104,0, -1147,12,1,47471,1148, -5,63,3,97,0, -180,3,70,0,180, -3,105,0,180,3, -78,0,180,3,51, -0,180,3,113,0, -180,3,86,0,180, -3,121,0,180,3, -67,0,180,3,102, -0,180,3,75,0, -180,3,48,0,180, -3,110,0,180,3, -83,0,180,3,56, -0,180,3,118,0, -180,3,99,0,180, -3,72,0,180,3, -107,0,180,3,80, -0,180,3,53,0, -180,3,115,0,180, -3,88,0,180,3, -69,0,180,3,104, -0,180,3,77,0, -180,3,50,0,180, -3,112,0,180,3, -85,0,180,3,120, -0,180,3,66,0, -180,3,101,0,180, -3,74,0,180,3, -109,0,180,3,82, -0,180,3,55,0, -180,3,117,0,180, -3,90,0,180,3, -98,0,180,3,71, -0,180,3,106,0, -180,3,79,0,180, -3,52,0,180,3, -114,0,180,3,87, -0,180,3,122,0, -180,3,95,0,1149, -12,1,47507,1150,5, -63,3,97,0,180, -3,70,0,180,3, -105,0,180,3,78, -0,180,3,51,0, -180,3,113,0,180, -3,86,0,180,3, -121,0,180,3,67, -0,180,3,102,0, -180,3,75,0,180, -3,48,0,180,3, -110,0,180,3,83, -0,180,3,56,0, -180,3,118,0,180, -3,99,0,180,3, -72,0,180,3,107, -0,180,3,80,0, -180,3,53,0,180, -3,115,0,1151,12, -1,47583,1152,5,63, -3,97,0,180,3, -70,0,180,3,105, -0,180,3,78,0, -180,3,51,0,180, -3,113,0,180,3, -86,0,180,3,121, -0,180,3,67,0, -180,3,102,0,180, -3,75,0,180,3, -48,0,180,3,110, -0,180,3,83,0, -180,3,56,0,180, -3,118,0,180,3, -99,0,180,3,72, -0,180,3,107,0, -180,3,80,0,180, -3,53,0,180,3, -115,0,180,3,88, -0,180,3,69,0, -180,3,104,0,180, -3,77,0,180,3, -50,0,180,3,112, -0,180,3,85,0, -180,3,120,0,180, -3,66,0,180,3, -101,0,180,3,74, -0,180,3,109,0, -180,3,82,0,180, -3,55,0,180,3, -117,0,180,3,90, -0,180,3,98,0, -180,3,71,0,180, -3,106,0,180,3, -79,0,180,3,52, -0,180,3,114,0, -180,3,87,0,180, -3,122,0,180,3, -95,0,180,3,68, -0,180,3,103,0, -180,3,76,0,180, -3,49,0,180,3, -111,0,180,3,84, -0,180,3,57,0, -180,3,119,0,180, -3,65,0,180,3, -100,0,180,3,73, -0,180,3,108,0, -180,3,81,0,180, -3,54,0,180,3, -116,0,1153,12,1, -47676,1154,5,63,3, -97,0,1155,12,1, -47743,1156,5,63,3, -97,0,180,3,70, -0,180,3,105,0, -180,3,78,0,180, -3,51,0,180,3, -113,0,180,3,86, -0,180,3,121,0, -180,3,67,0,180, -3,102,0,180,3, -75,0,180,3,48, -0,180,3,110,0, -180,3,83,0,180, -3,56,0,180,3, -118,0,180,3,99, -0,180,3,72,0, -180,3,107,0,180, -3,80,0,180,3, -53,0,180,3,115, -0,180,3,88,0, -180,3,69,0,180, -3,104,0,180,3, -77,0,180,3,50, -0,180,3,112,0, -180,3,85,0,180, -3,120,0,180,3, -66,0,180,3,101, -0,180,3,74,0, -180,3,109,0,180, -3,82,0,180,3, -55,0,180,3,117, -0,180,3,90,0, -180,3,98,0,180, -3,71,0,180,3, -106,0,180,3,79, -0,180,3,52,0, -180,3,114,0,1157, -12,1,47828,1158,5, -63,3,97,0,180, -3,70,0,180,3, -105,0,180,3,78, -0,180,3,51,0, -180,3,113,0,180, -3,86,0,180,3, -121,0,180,3,67, -0,180,3,102,0, -180,3,75,0,180, -3,48,0,180,3, -110,0,180,3,83, -0,180,3,56,0, -180,3,118,0,180, -3,99,0,180,3, -72,0,180,3,107, -0,180,3,80,0, -180,3,53,0,180, -3,115,0,180,3, -88,0,180,3,69, -0,180,3,104,0, -180,3,77,0,180, -3,50,0,180,3, -112,0,180,3,85, -0,180,3,120,0, -180,3,66,0,180, -3,101,0,180,3, -74,0,180,3,109, -0,180,3,82,0, -180,3,55,0,180, -3,117,0,180,3, -90,0,180,3,98, -0,180,3,71,0, -180,3,106,0,180, -3,79,0,180,3, -52,0,180,3,114, -0,180,3,87,0, -180,3,122,0,180, -3,95,0,180,3, -68,0,180,3,103, -0,180,3,76,0, -180,3,49,0,180, -3,111,0,180,3, -84,0,180,3,57, -0,180,3,119,0, -180,3,65,0,180, -3,100,0,180,3, -73,0,180,3,108, -0,180,3,81,0, -180,3,54,0,180, -3,116,0,1159,12, -1,47921,1160,5,63, -3,97,0,180,3, -70,0,180,3,105, -0,180,3,78,0, -180,3,51,0,180, -3,113,0,180,3, -86,0,180,3,121, -0,180,3,67,0, -180,3,102,0,180, -3,75,0,180,3, -48,0,180,3,110, -0,180,3,83,0, -180,3,56,0,180, -3,118,0,180,3, -99,0,180,3,72, -0,180,3,107,0, -180,3,80,0,180, -3,53,0,180,3, -115,0,180,3,88, -0,180,3,69,0, -180,3,104,0,180, -3,77,0,180,3, -50,0,180,3,112, -0,180,3,85,0, -180,3,120,0,180, -3,66,0,180,3, -101,0,180,3,74, -0,180,3,109,0, -180,3,82,0,180, -3,55,0,180,3, -117,0,180,3,90, -0,180,3,98,0, -180,3,71,0,180, -3,106,0,180,3, -79,0,180,3,52, -0,180,3,114,0, -180,3,87,0,180, -3,122,0,180,3, -95,0,180,3,68, -0,180,3,103,0, -180,3,76,0,180, -3,49,0,180,3, -111,0,180,3,84, -0,180,3,57,0, -180,3,119,0,180, -3,65,0,180,3, -100,0,180,3,73, -0,180,3,108,0, -180,3,81,0,180, -3,54,0,180,3, -116,0,180,3,89, -0,180,1161,11,1, -801,0,1162,4,34, -84,0,79,0,85, -0,67,0,72,0, -95,0,83,0,84, -0,65,0,82,0, -84,0,95,0,69, -0,86,0,69,0, -78,0,84,0,1, --1,3,89,0,180, -1163,11,1,867,0, -183,1,-1,3,87, -0,180,3,122,0, -180,3,95,0,180, -3,68,0,180,3, -103,0,180,3,76, -0,180,3,49,0, -180,3,111,0,180, -3,84,0,180,3, -57,0,180,3,119, -0,180,3,65,0, -180,3,100,0,180, -3,73,0,180,3, -108,0,180,3,81, -0,180,3,54,0, -180,3,116,0,180, -3,89,0,180,1164, -11,1,867,0,183, -1,-1,3,70,0, -180,3,105,0,180, -3,78,0,180,3, -51,0,180,3,113, -0,180,3,86,0, -180,3,121,0,180, -3,67,0,180,3, -102,0,180,3,75, -0,180,3,48,0, -180,3,110,0,180, -3,83,0,180,3, -56,0,180,3,118, -0,180,3,99,0, -180,3,72,0,180, -3,107,0,180,3, -80,0,180,3,53, -0,180,3,115,0, -180,3,88,0,180, -3,69,0,180,3, -104,0,180,3,77, -0,180,3,50,0, -180,3,112,0,180, -3,85,0,180,3, -120,0,180,3,66, -0,180,3,101,0, -180,3,74,0,180, -3,109,0,180,3, -82,0,180,3,55, -0,180,3,117,0, -180,3,90,0,180, -3,98,0,180,3, -71,0,180,3,106, -0,180,3,79,0, -180,3,52,0,180, -3,114,0,180,3, -87,0,180,3,122, -0,180,3,95,0, -180,3,68,0,180, -3,103,0,180,3, -76,0,180,3,49, -0,180,3,111,0, -180,3,84,0,180, -3,57,0,180,3, -119,0,180,3,65, -0,180,3,100,0, -180,3,73,0,180, -3,108,0,180,3, -81,0,180,3,54, -0,180,3,116,0, -180,3,89,0,180, -1165,11,1,867,0, -183,1,-1,3,89, -0,180,1166,11,1, -867,0,183,1,-1, -3,88,0,180,3, -69,0,180,3,104, -0,180,3,77,0, -180,3,50,0,180, -3,112,0,180,3, -85,0,180,3,120, -0,180,3,66,0, -180,3,101,0,1167, -12,1,48187,1168,5, -63,3,97,0,180, -3,70,0,180,3, -105,0,180,3,78, -0,180,3,51,0, -180,3,113,0,180, -3,86,0,180,3, -121,0,180,3,67, -0,180,3,102,0, -180,3,75,0,180, -3,48,0,180,3, -110,0,1169,12,1, -48259,1170,5,63,3, -97,0,180,3,70, -0,180,3,105,0, -180,3,78,0,180, -3,51,0,180,3, -113,0,180,3,86, -0,180,3,121,0, -180,3,67,0,180, -3,102,0,180,3, -75,0,180,3,48, -0,180,3,110,0, -180,3,83,0,180, -3,56,0,180,3, -118,0,180,3,99, -0,180,3,72,0, -180,3,107,0,180, -3,80,0,180,3, -53,0,180,3,115, -0,180,3,88,0, -180,3,69,0,180, -3,104,0,180,3, -77,0,180,3,50, -0,180,3,112,0, -180,3,85,0,180, -3,120,0,180,3, -66,0,180,3,101, -0,180,3,74,0, -180,3,109,0,180, -3,82,0,180,3, -55,0,180,3,117, -0,180,3,90,0, -180,3,98,0,180, -3,71,0,180,3, -106,0,180,3,79, -0,180,3,52,0, -180,3,114,0,180, -3,87,0,180,3, -122,0,180,3,95, -0,180,3,68,0, -180,3,103,0,180, -3,76,0,180,3, -49,0,180,3,111, -0,180,3,84,0, -180,3,57,0,180, -3,119,0,180,3, -65,0,180,3,100, -0,1171,12,1,48349, -1172,5,63,3,97, -0,180,3,70,0, -180,3,105,0,180, -3,78,0,180,3, -51,0,180,3,113, -0,180,3,86,0, -180,3,121,0,180, -3,67,0,180,3, -102,0,180,3,75, -0,180,3,48,0, -180,3,110,0,180, -3,83,0,180,3, -56,0,180,3,118, -0,180,3,99,0, -180,3,72,0,180, -3,107,0,180,3, -80,0,180,3,53, -0,180,3,115,0, -180,3,88,0,180, -3,69,0,180,3, -104,0,180,3,77, -0,180,3,50,0, -180,3,112,0,180, -3,85,0,180,3, -120,0,180,3,66, -0,180,3,101,0, -180,3,74,0,180, -3,109,0,180,3, -82,0,180,3,55, -0,180,3,117,0, -180,3,90,0,180, -3,98,0,180,3, -71,0,180,3,106, -0,180,3,79,0, -180,3,52,0,180, -3,114,0,180,3, -87,0,180,3,122, -0,180,3,95,0, -180,3,68,0,180, -3,103,0,180,3, -76,0,180,3,49, -0,180,3,111,0, -180,3,84,0,180, -3,57,0,180,3, -119,0,180,3,65, -0,180,3,100,0, -180,3,73,0,180, -3,108,0,180,3, -81,0,180,3,54, -0,180,3,116,0, -180,3,89,0,180, -1173,11,1,816,0, -1174,4,30,84,0, -79,0,85,0,67, -0,72,0,95,0, -69,0,78,0,68, -0,95,0,69,0, -86,0,69,0,78, -0,84,0,1,-1, -3,73,0,180,3, -108,0,180,3,81, -0,180,3,54,0, -180,3,116,0,180, -3,89,0,180,1175, -11,1,867,0,183, -1,-1,3,83,0, -180,3,56,0,180, -3,118,0,180,3, -99,0,180,3,72, -0,180,3,107,0, -180,3,80,0,180, -3,53,0,180,3, -115,0,180,3,88, -0,180,3,69,0, -180,3,104,0,180, -3,77,0,180,3, -50,0,180,3,112, -0,180,3,85,0, -180,3,120,0,180, -3,66,0,180,3, -101,0,180,3,74, -0,180,3,109,0, -180,3,82,0,180, -3,55,0,180,3, -117,0,180,3,90, -0,180,3,98,0, -180,3,71,0,180, -3,106,0,180,3, -79,0,180,3,52, -0,180,3,114,0, -180,3,87,0,180, -3,122,0,180,3, -95,0,180,3,68, -0,180,3,103,0, -180,3,76,0,180, -3,49,0,180,3, -111,0,180,3,84, -0,180,3,57,0, -180,3,119,0,180, -3,65,0,180,3, -100,0,180,3,73, -0,180,3,108,0, -180,3,81,0,180, -3,54,0,180,3, -116,0,180,3,89, -0,180,1176,11,1, -867,0,183,1,-1, -3,74,0,180,3, -109,0,180,3,82, -0,180,3,55,0, -180,3,117,0,180, -3,90,0,180,3, -98,0,180,3,71, -0,180,3,106,0, -180,3,79,0,180, -3,52,0,180,3, -114,0,180,3,87, -0,180,3,122,0, -180,3,95,0,180, -3,68,0,180,3, -103,0,180,3,76, -0,180,3,49,0, -180,3,111,0,180, -3,84,0,180,3, -57,0,180,3,119, -0,180,3,65,0, -180,3,100,0,180, -3,73,0,180,3, -108,0,180,3,81, -0,180,3,54,0, -180,3,116,0,180, -3,89,0,180,1177, -11,1,867,0,183, -1,-1,3,68,0, -180,3,103,0,180, -3,76,0,180,3, -49,0,180,3,111, -0,180,3,84,0, -180,3,57,0,180, -3,119,0,180,3, -65,0,180,3,100, -0,180,3,73,0, -180,3,108,0,180, -3,81,0,180,3, -54,0,180,3,116, -0,180,3,89,0, -180,1178,11,1,792, -0,1179,4,22,84, -0,79,0,85,0, -67,0,72,0,95, -0,69,0,86,0, -69,0,78,0,84, -0,1,-1,3,77, -0,180,3,50,0, -180,3,112,0,180, -3,85,0,180,3, -120,0,180,3,66, -0,180,3,101,0, -180,3,74,0,180, -3,109,0,180,3, -82,0,180,3,55, -0,180,3,117,0, -180,3,90,0,180, -3,98,0,180,3, -71,0,180,3,106, -0,180,3,79,0, -180,3,52,0,180, -3,114,0,180,3, -87,0,180,3,122, -0,180,3,95,0, -180,3,68,0,180, -3,103,0,180,3, -76,0,180,3,49, -0,180,3,111,0, -180,3,84,0,180, -3,57,0,180,3, -119,0,180,3,65, -0,180,3,100,0, -180,3,73,0,180, -3,108,0,180,3, -81,0,180,3,54, -0,180,3,116,0, -180,3,89,0,180, -1180,11,1,867,0, -183,1,-1,3,72, -0,180,3,107,0, -180,3,80,0,180, -3,53,0,180,3, -115,0,180,3,88, -0,180,3,69,0, -180,3,104,0,180, -3,77,0,180,3, -50,0,180,3,112, -0,180,3,85,0, -180,3,120,0,180, -3,66,0,180,3, -101,0,180,3,74, -0,180,3,109,0, -180,3,82,0,180, -3,55,0,180,3, -117,0,180,3,90, -0,180,3,98,0, -180,3,71,0,180, -3,106,0,180,3, -79,0,180,3,52, -0,180,3,114,0, -180,3,87,0,180, -3,122,0,180,3, -95,0,180,3,68, -0,180,3,103,0, -180,3,76,0,180, -3,49,0,180,3, -111,0,180,3,84, -0,180,3,57,0, -180,3,119,0,180, -3,65,0,180,3, -100,0,180,3,73, -0,180,3,108,0, -180,3,81,0,180, -3,54,0,180,3, -116,0,180,3,89, -0,180,1181,11,1, -867,0,183,1,-1, -3,90,0,180,3, -98,0,180,3,71, -0,180,3,106,0, -180,3,79,0,180, -3,52,0,180,3, -114,0,180,3,87, -0,180,3,122,0, -180,3,95,0,180, -3,68,0,180,3, -103,0,180,3,76, -0,180,3,49,0, -180,3,111,0,180, -3,84,0,180,3, -57,0,180,3,119, -0,180,3,65,0, -180,3,100,0,180, -3,73,0,180,3, -108,0,180,3,81, -0,180,3,54,0, -180,3,116,0,180, -3,89,0,180,1182, -11,1,867,0,183, -1,-1,3,84,0, -180,3,57,0,180, -3,119,0,180,3, -65,0,180,3,100, -0,180,3,73,0, -180,3,108,0,180, -3,81,0,180,3, -54,0,180,3,116, -0,180,3,89,0, -180,1183,11,1,867, -0,183,1,-1,3, -76,0,178,3,113, -0,178,3,73,0, -178,3,33,0,1184, -12,1,4709,1185,5, -1,3,61,0,1186, -12,1,4717,1187,5, -0,1188,11,1,142, -0,1189,4,36,69, -0,88,0,67,0, -76,0,65,0,77, -0,65,0,84,0, -73,0,79,0,78, -0,95,0,69,0, -81,0,85,0,65, -0,76,0,83,0, -1,-1,1190,11,1, -180,0,1191,4,22, -69,0,88,0,67, -0,76,0,65,0, -77,0,65,0,84, -0,73,0,79,0, -78,0,1,-1,3, -110,0,1192,12,1, -14009,1193,5,63,3, -97,0,180,3,70, -0,180,3,105,0, -180,3,78,0,180, -3,51,0,180,3, -113,0,180,3,86, -0,180,3,121,0, -180,3,67,0,180, -3,102,0,180,3, -75,0,180,3,48, -0,180,3,110,0, -180,3,83,0,180, -3,56,0,180,3, -118,0,180,3,99, -0,180,3,72,0, -180,3,107,0,180, -3,80,0,180,3, -53,0,180,3,115, -0,180,3,88,0, -180,3,69,0,180, -3,104,0,180,3, -77,0,180,3,50, -0,180,3,112,0, -180,3,85,0,180, -3,120,0,180,3, -66,0,180,3,101, -0,180,3,74,0, -180,3,109,0,180, -3,82,0,180,3, -55,0,180,3,117, -0,180,3,90,0, -180,3,98,0,180, -3,71,0,180,3, -106,0,180,3,79, -0,180,3,52,0, -180,3,114,0,180, -3,87,0,180,3, -122,0,180,3,95, -0,180,3,68,0, -180,3,103,0,180, -3,76,0,180,3, -49,0,180,3,111, -0,1194,12,1,14097, -1195,5,63,3,97, -0,180,3,70,0, -180,3,105,0,180, -3,78,0,180,3, -51,0,180,3,113, -0,180,3,86,0, -180,3,121,0,180, -3,67,0,180,3, -102,0,180,3,75, -0,180,3,48,0, -180,3,110,0,180, -3,83,0,180,3, -56,0,180,3,118, -0,180,3,99,0, -180,3,72,0,180, -3,107,0,180,3, -80,0,180,3,53, -0,180,3,115,0, -180,3,88,0,180, -3,69,0,180,3, -104,0,180,3,77, -0,180,3,50,0, -180,3,112,0,180, -3,85,0,180,3, -120,0,180,3,66, -0,180,3,101,0, -180,3,74,0,180, -3,109,0,180,3, -82,0,180,3,55, -0,180,3,117,0, -180,3,90,0,180, -3,98,0,180,3, -71,0,180,3,106, -0,180,3,79,0, -180,3,52,0,180, -3,114,0,180,3, -87,0,180,3,122, -0,180,3,95,0, -1196,12,1,14133,1197, -5,63,3,97,0, -180,3,70,0,180, -3,105,0,180,3, -78,0,180,3,51, -0,180,3,113,0, -180,3,86,0,180, -3,121,0,180,3, -67,0,180,3,102, -0,180,3,75,0, -180,3,48,0,180, -3,110,0,180,3, -83,0,180,3,56, -0,180,3,118,0, -180,3,99,0,180, -3,72,0,180,3, -107,0,180,3,80, -0,180,3,53,0, -180,3,115,0,1198, -12,1,14209,1199,5, -63,3,97,0,180, -3,70,0,180,3, -105,0,180,3,78, -0,180,3,51,0, -180,3,113,0,180, -3,86,0,180,3, -121,0,180,3,67, -0,180,3,102,0, -180,3,75,0,180, -3,48,0,180,3, -110,0,180,3,83, -0,180,3,56,0, -180,3,118,0,180, -3,99,0,180,3, -72,0,180,3,107, -0,180,3,80,0, -180,3,53,0,180, -3,115,0,180,3, -88,0,180,3,69, -0,180,3,104,0, -180,3,77,0,180, -3,50,0,180,3, -112,0,180,3,85, -0,180,3,120,0, -180,3,66,0,180, -3,101,0,1200,12, -1,14289,1201,5,63, -3,97,0,180,3, -70,0,180,3,105, -0,180,3,78,0, -180,3,51,0,180, -3,113,0,180,3, -86,0,180,3,121, -0,180,3,67,0, -180,3,102,0,180, -3,75,0,180,3, -48,0,180,3,110, -0,1202,12,1,14361, -1203,5,63,3,97, -0,180,3,70,0, -180,3,105,0,180, -3,78,0,180,3, -51,0,180,3,113, -0,180,3,86,0, -180,3,121,0,180, -3,67,0,180,3, -102,0,180,3,75, -0,180,3,48,0, -180,3,110,0,180, -3,83,0,180,3, -56,0,180,3,118, -0,180,3,99,0, -180,3,72,0,180, -3,107,0,180,3, -80,0,180,3,53, -0,180,3,115,0, -1204,12,1,14437,1205, -5,63,3,97,0, -180,3,70,0,180, -3,105,0,180,3, -78,0,180,3,51, -0,180,3,113,0, -180,3,86,0,180, -3,121,0,180,3, -67,0,180,3,102, -0,180,3,75,0, -180,3,48,0,180, -3,110,0,180,3, -83,0,180,3,56, -0,180,3,118,0, -180,3,99,0,180, -3,72,0,180,3, -107,0,180,3,80, -0,180,3,53,0, -180,3,115,0,180, -3,88,0,180,3, -69,0,180,3,104, -0,180,3,77,0, -180,3,50,0,180, -3,112,0,180,3, -85,0,180,3,120, -0,180,3,66,0, -180,3,101,0,180, -3,74,0,180,3, -109,0,180,3,82, -0,180,3,55,0, -180,3,117,0,180, -3,90,0,180,3, -98,0,180,3,71, -0,180,3,106,0, -180,3,79,0,180, -3,52,0,180,3, -114,0,180,3,87, -0,180,3,122,0, -180,3,95,0,180, -3,68,0,180,3, -103,0,180,3,76, -0,180,3,49,0, -180,3,111,0,1206, -12,1,14525,1207,5, -63,3,97,0,180, -3,70,0,180,3, -105,0,180,3,78, -0,180,3,51,0, -180,3,113,0,180, -3,86,0,180,3, -121,0,180,3,67, -0,180,3,102,0, -180,3,75,0,180, -3,48,0,180,3, -110,0,180,3,83, -0,180,3,56,0, -180,3,118,0,180, -3,99,0,180,3, -72,0,180,3,107, -0,180,3,80,0, -180,3,53,0,180, -3,115,0,180,3, -88,0,180,3,69, -0,180,3,104,0, -180,3,77,0,180, -3,50,0,180,3, -112,0,180,3,85, -0,180,3,120,0, -180,3,66,0,180, -3,101,0,180,3, -74,0,180,3,109, -0,180,3,82,0, -180,3,55,0,180, -3,117,0,180,3, -90,0,180,3,98, -0,180,3,71,0, -180,3,106,0,180, -3,79,0,180,3, -52,0,180,3,114, -0,1208,12,1,14610, -1209,5,63,3,97, -0,180,3,70,0, -180,3,105,0,180, -3,78,0,180,3, -51,0,180,3,113, -0,180,3,86,0, -180,3,121,0,180, -3,67,0,180,3, -102,0,180,3,75, -0,180,3,48,0, -180,3,110,0,180, -3,83,0,180,3, -56,0,180,3,118, -0,180,3,99,0, -180,3,72,0,180, -3,107,0,180,3, -80,0,180,3,53, -0,180,3,115,0, -180,3,88,0,180, -3,69,0,180,3, -104,0,180,3,77, -0,180,3,50,0, -180,3,112,0,180, -3,85,0,180,3, -120,0,180,3,66, -0,180,3,101,0, -180,3,74,0,180, -3,109,0,180,3, -82,0,180,3,55, -0,180,3,117,0, -180,3,90,0,180, -3,98,0,180,3, -71,0,180,3,106, -0,180,3,79,0, -180,3,52,0,180, -3,114,0,180,3, -87,0,180,3,122, -0,180,3,95,0, -180,3,68,0,180, -3,103,0,180,3, -76,0,180,3,49, -0,180,3,111,0, -180,3,84,0,180, -3,57,0,180,3, -119,0,180,3,65, -0,180,3,100,0, -180,3,73,0,180, -3,108,0,180,3, -81,0,180,3,54, -0,180,3,116,0, -180,3,89,0,180, -1210,11,1,630,0, -1211,4,30,78,0, -79,0,95,0,83, -0,69,0,78,0, -83,0,79,0,82, -0,95,0,69,0, -86,0,69,0,78, -0,84,0,1,-1, -3,87,0,180,3, -122,0,180,3,95, -0,180,3,68,0, -180,3,103,0,180, -3,76,0,180,3, -49,0,180,3,111, -0,180,3,84,0, -180,3,57,0,180, -3,119,0,180,3, -65,0,180,3,100, -0,180,3,73,0, -180,3,108,0,180, -3,81,0,180,3, -54,0,180,3,116, -0,180,3,89,0, -180,1212,11,1,867, -0,183,1,-1,3, -84,0,180,3,57, -0,180,3,119,0, -180,3,65,0,180, -3,100,0,180,3, -73,0,180,3,108, -0,180,3,81,0, -180,3,54,0,180, -3,116,0,180,3, -89,0,180,1213,11, -1,867,0,183,1, --1,3,88,0,180, -3,69,0,180,3, -104,0,180,3,77, -0,180,3,50,0, -180,3,112,0,180, -3,85,0,180,3, -120,0,180,3,66, -0,180,3,101,0, -180,3,74,0,180, -3,109,0,180,3, -82,0,180,3,55, -0,180,3,117,0, -180,3,90,0,180, -3,98,0,180,3, -71,0,180,3,106, -0,180,3,79,0, -180,3,52,0,180, -3,114,0,180,3, -87,0,180,3,122, -0,180,3,95,0, -180,3,68,0,180, -3,103,0,180,3, -76,0,180,3,49, -0,180,3,111,0, -180,3,84,0,180, -3,57,0,180,3, -119,0,180,3,65, -0,180,3,100,0, -180,3,73,0,180, -3,108,0,180,3, -81,0,180,3,54, -0,180,3,116,0, -180,3,89,0,180, -1214,11,1,867,0, -183,1,-1,3,83, -0,180,3,56,0, -180,3,118,0,180, -3,99,0,180,3, -72,0,180,3,107, -0,180,3,80,0, -180,3,53,0,180, -3,115,0,180,3, -88,0,180,3,69, -0,180,3,104,0, -180,3,77,0,180, -3,50,0,180,3, -112,0,180,3,85, -0,180,3,120,0, -180,3,66,0,180, -3,101,0,180,3, -74,0,180,3,109, -0,180,3,82,0, -180,3,55,0,180, -3,117,0,180,3, -90,0,180,3,98, -0,180,3,71,0, -180,3,106,0,180, -3,79,0,180,3, -52,0,180,3,114, -0,180,3,87,0, -180,3,122,0,180, -3,95,0,180,3, -68,0,180,3,103, -0,180,3,76,0, -180,3,49,0,180, -3,111,0,180,3, -84,0,180,3,57, -0,180,3,119,0, -180,3,65,0,180, -3,100,0,180,3, -73,0,180,3,108, -0,180,3,81,0, -180,3,54,0,180, -3,116,0,180,3, -89,0,180,1215,11, -1,867,0,183,1, --1,3,74,0,180, -3,109,0,180,3, -82,0,180,3,55, -0,180,3,117,0, -180,3,90,0,180, -3,98,0,180,3, -71,0,180,3,106, -0,180,3,79,0, -180,3,52,0,180, -3,114,0,180,3, -87,0,180,3,122, -0,180,3,95,0, -180,3,68,0,180, -3,103,0,180,3, -76,0,180,3,49, -0,180,3,111,0, -180,3,84,0,180, -3,57,0,180,3, -119,0,180,3,65, -0,180,3,100,0, -180,3,73,0,180, -3,108,0,180,3, -81,0,180,3,54, -0,180,3,116,0, -180,3,89,0,180, -1216,11,1,867,0, -183,1,-1,3,88, -0,180,3,69,0, -180,3,104,0,180, -3,77,0,180,3, -50,0,180,3,112, -0,180,3,85,0, -180,3,120,0,180, -3,66,0,180,3, -101,0,180,3,74, -0,180,3,109,0, -180,3,82,0,180, -3,55,0,180,3, -117,0,180,3,90, -0,180,3,98,0, -180,3,71,0,180, -3,106,0,180,3, -79,0,180,3,52, -0,180,3,114,0, -180,3,87,0,180, -3,122,0,180,3, -95,0,180,3,68, -0,180,3,103,0, -180,3,76,0,180, -3,49,0,180,3, -111,0,180,3,84, -0,180,3,57,0, -180,3,119,0,180, -3,65,0,180,3, -100,0,180,3,73, -0,180,3,108,0, -180,3,81,0,180, -3,54,0,180,3, -116,0,180,3,89, -0,180,1217,11,1, -867,0,183,1,-1, -3,68,0,180,3, -103,0,180,3,76, -0,180,3,49,0, -180,3,111,0,180, -3,84,0,180,3, -57,0,180,3,119, -0,180,3,65,0, -180,3,100,0,180, -3,73,0,180,3, -108,0,180,3,81, -0,180,3,54,0, -180,3,116,0,1218, -12,1,15030,1219,5, -63,3,97,0,180, -3,70,0,180,3, -105,0,180,3,78, -0,180,3,51,0, -180,3,113,0,180, -3,86,0,180,3, -121,0,180,3,67, -0,180,3,102,0, -180,3,75,0,180, -3,48,0,180,3, -110,0,180,3,83, -0,180,3,56,0, -180,3,118,0,180, -3,99,0,180,3, -72,0,180,3,107, -0,180,3,80,0, -180,3,53,0,180, -3,115,0,180,3, -88,0,180,3,69, -0,180,3,104,0, -180,3,77,0,180, -3,50,0,180,3, -112,0,180,3,85, -0,180,3,120,0, -180,3,66,0,180, -3,101,0,180,3, -74,0,180,3,109, -0,180,3,82,0, -180,3,55,0,180, -3,117,0,180,3, -90,0,180,3,98, -0,180,3,71,0, -180,3,106,0,180, -3,79,0,180,3, -52,0,180,3,114, -0,180,3,87,0, -180,3,122,0,180, -3,95,0,1220,12, -1,15066,1221,5,63, -3,97,0,1222,12, -1,15133,1223,5,63, -3,97,0,180,3, -70,0,180,3,105, -0,180,3,78,0, -180,3,51,0,180, -3,113,0,180,3, -86,0,180,3,121, -0,180,3,67,0, -180,3,102,0,180, -3,75,0,180,3, -48,0,180,3,110, -0,180,3,83,0, -180,3,56,0,180, -3,118,0,180,3, -99,0,180,3,72, -0,180,3,107,0, -180,3,80,0,180, -3,53,0,180,3, -115,0,180,3,88, -0,180,3,69,0, -180,3,104,0,180, -3,77,0,180,3, -50,0,180,3,112, -0,180,3,85,0, -180,3,120,0,180, -3,66,0,180,3, -101,0,180,3,74, -0,180,3,109,0, -180,3,82,0,180, -3,55,0,180,3, -117,0,180,3,90, -0,180,3,98,0, -180,3,71,0,180, -3,106,0,180,3, -79,0,180,3,52, -0,180,3,114,0, -180,3,87,0,180, -3,122,0,180,3, -95,0,180,3,68, -0,180,3,103,0, -180,3,76,0,180, -3,49,0,180,3, -111,0,180,3,84, -0,180,3,57,0, -180,3,119,0,180, -3,65,0,180,3, -100,0,180,3,73, -0,180,3,108,0, -180,3,81,0,180, -3,54,0,180,3, -116,0,1224,12,1, -15226,1225,5,63,3, -97,0,180,3,70, -0,180,3,105,0, -180,3,78,0,180, -3,51,0,180,3, -113,0,180,3,86, -0,180,3,121,0, -180,3,67,0,180, -3,102,0,180,3, -75,0,180,3,48, -0,180,3,110,0, -180,3,83,0,180, -3,56,0,180,3, -118,0,180,3,99, -0,180,3,72,0, -180,3,107,0,180, -3,80,0,180,3, -53,0,180,3,115, -0,180,3,88,0, -180,3,69,0,180, -3,104,0,180,3, -77,0,180,3,50, -0,180,3,112,0, -180,3,85,0,180, -3,120,0,180,3, -66,0,180,3,101, -0,180,3,74,0, -180,3,109,0,180, -3,82,0,180,3, -55,0,180,3,117, -0,180,3,90,0, -180,3,98,0,180, -3,71,0,180,3, -106,0,180,3,79, -0,180,3,52,0, -180,3,114,0,180, -3,87,0,180,3, -122,0,180,3,95, -0,1226,12,1,15262, -1227,5,63,3,97, -0,180,3,70,0, -180,3,105,0,180, -3,78,0,180,3, -51,0,180,3,113, -0,180,3,86,0, -180,3,121,0,180, -3,67,0,180,3, -102,0,180,3,75, -0,180,3,48,0, -180,3,110,0,180, -3,83,0,180,3, -56,0,180,3,118, -0,180,3,99,0, -180,3,72,0,180, -3,107,0,180,3, -80,0,180,3,53, -0,180,3,115,0, -180,3,88,0,180, -3,69,0,180,3, -104,0,180,3,77, -0,180,3,50,0, -180,3,112,0,180, -3,85,0,180,3, -120,0,180,3,66, -0,180,3,101,0, -180,3,74,0,180, -3,109,0,180,3, -82,0,180,3,55, -0,180,3,117,0, -180,3,90,0,180, -3,98,0,180,3, -71,0,180,3,106, -0,180,3,79,0, -180,3,52,0,180, -3,114,0,1228,12, -1,15347,1229,5,63, -3,97,0,180,3, -70,0,180,3,105, -0,180,3,78,0, -180,3,51,0,180, -3,113,0,180,3, -86,0,180,3,121, -0,180,3,67,0, -180,3,102,0,180, -3,75,0,180,3, -48,0,180,3,110, -0,180,3,83,0, -180,3,56,0,180, -3,118,0,180,3, -99,0,180,3,72, -0,180,3,107,0, -180,3,80,0,180, -3,53,0,180,3, -115,0,180,3,88, -0,180,3,69,0, -180,3,104,0,180, -3,77,0,180,3, -50,0,180,3,112, -0,180,3,85,0, -180,3,120,0,180, -3,66,0,180,3, -101,0,180,3,74, -0,180,3,109,0, -180,3,82,0,180, -3,55,0,180,3, -117,0,180,3,90, -0,180,3,98,0, -180,3,71,0,180, -3,106,0,180,3, -79,0,180,3,52, -0,180,3,114,0, -180,3,87,0,180, -3,122,0,180,3, -95,0,180,3,68, -0,180,3,103,0, -180,3,76,0,180, -3,49,0,180,3, -111,0,1230,12,1, -15435,1231,5,63,3, -97,0,180,3,70, -0,180,3,105,0, -180,3,78,0,180, -3,51,0,180,3, -113,0,180,3,86, -0,180,3,121,0, -180,3,67,0,180, -3,102,0,180,3, -75,0,180,3,48, -0,180,3,110,0, -180,3,83,0,180, -3,56,0,180,3, -118,0,180,3,99, -0,180,3,72,0, -180,3,107,0,180, -3,80,0,180,3, -53,0,180,3,115, -0,180,3,88,0, -180,3,69,0,180, -3,104,0,180,3, -77,0,180,3,50, -0,180,3,112,0, -180,3,85,0,180, -3,120,0,180,3, -66,0,180,3,101, -0,180,3,74,0, -180,3,109,0,180, -3,82,0,180,3, -55,0,180,3,117, -0,180,3,90,0, -180,3,98,0,180, -3,71,0,180,3, -106,0,180,3,79, -0,180,3,52,0, -180,3,114,0,180, -3,87,0,180,3, -122,0,180,3,95, -0,180,3,68,0, -180,3,103,0,180, -3,76,0,180,3, -49,0,180,3,111, -0,180,3,84,0, -180,3,57,0,180, -3,119,0,180,3, -65,0,180,3,100, -0,180,3,73,0, -180,3,108,0,180, -3,81,0,180,3, -54,0,180,3,116, -0,1232,12,1,15528, -1233,5,63,3,97, -0,180,3,70,0, -180,3,105,0,180, -3,78,0,180,3, -51,0,180,3,113, -0,180,3,86,0, -180,3,121,0,180, -3,67,0,180,3, -102,0,180,3,75, -0,180,3,48,0, -180,3,110,0,180, -3,83,0,180,3, -56,0,180,3,118, -0,180,3,99,0, -180,3,72,0,180, -3,107,0,180,3, -80,0,180,3,53, -0,180,3,115,0, -180,3,88,0,180, -3,69,0,180,3, -104,0,180,3,77, -0,180,3,50,0, -180,3,112,0,180, -3,85,0,180,3, -120,0,180,3,66, -0,180,3,101,0, -180,3,74,0,180, -3,109,0,180,3, -82,0,180,3,55, -0,180,3,117,0, -180,3,90,0,180, -3,98,0,180,3, -71,0,180,3,106, -0,180,3,79,0, -180,3,52,0,180, -3,114,0,180,3, -87,0,180,3,122, -0,180,3,95,0, -1234,12,1,15564,1235, -5,63,3,97,0, -180,3,70,0,180, -3,105,0,180,3, -78,0,180,3,51, -0,180,3,113,0, -180,3,86,0,180, -3,121,0,180,3, -67,0,180,3,102, -0,180,3,75,0, -180,3,48,0,180, -3,110,0,180,3, -83,0,180,3,56, -0,180,3,118,0, -180,3,99,0,180, -3,72,0,180,3, -107,0,180,3,80, -0,180,3,53,0, -180,3,115,0,180, -3,88,0,180,3, -69,0,180,3,104, -0,180,3,77,0, -180,3,50,0,180, -3,112,0,180,3, -85,0,180,3,120, -0,180,3,66,0, -180,3,101,0,180, -3,74,0,180,3, -109,0,180,3,82, -0,180,3,55,0, -180,3,117,0,180, -3,90,0,180,3, -98,0,180,3,71, -0,180,3,106,0, -180,3,79,0,180, -3,52,0,180,3, -114,0,180,3,87, -0,180,3,122,0, -180,3,95,0,180, -3,68,0,180,3, -103,0,180,3,76, -0,180,3,49,0, -180,3,111,0,180, -3,84,0,180,3, -57,0,180,3,119, -0,180,3,65,0, -180,3,100,0,180, -3,73,0,180,3, -108,0,180,3,81, -0,180,3,54,0, -180,3,116,0,1236, -12,1,15657,1237,5, -63,3,97,0,1238, -12,1,15724,1239,5, -63,3,97,0,180, -3,70,0,180,3, -105,0,180,3,78, -0,180,3,51,0, -180,3,113,0,180, -3,86,0,180,3, -121,0,180,3,67, -0,180,3,102,0, -180,3,75,0,180, -3,48,0,180,3, -110,0,180,3,83, -0,180,3,56,0, -180,3,118,0,180, -3,99,0,180,3, -72,0,180,3,107, -0,180,3,80,0, -180,3,53,0,180, -3,115,0,180,3, -88,0,180,3,69, -0,180,3,104,0, -180,3,77,0,180, -3,50,0,180,3, -112,0,180,3,85, -0,180,3,120,0, -180,3,66,0,180, -3,101,0,180,3, -74,0,180,3,109, -0,180,3,82,0, -180,3,55,0,180, -3,117,0,180,3, -90,0,180,3,98, -0,180,3,71,0, -180,3,106,0,180, -3,79,0,180,3, -52,0,180,3,114, -0,1240,12,1,15809, -1241,5,63,3,97, -0,180,3,70,0, -180,3,105,0,180, -3,78,0,180,3, -51,0,180,3,113, -0,180,3,86,0, -180,3,121,0,180, -3,67,0,180,3, -102,0,180,3,75, -0,180,3,48,0, -180,3,110,0,180, -3,83,0,180,3, -56,0,180,3,118, -0,180,3,99,0, -180,3,72,0,180, -3,107,0,180,3, -80,0,180,3,53, -0,180,3,115,0, -180,3,88,0,180, -3,69,0,180,3, -104,0,180,3,77, -0,180,3,50,0, -180,3,112,0,180, -3,85,0,180,3, -120,0,180,3,66, -0,180,3,101,0, -180,3,74,0,180, -3,109,0,180,3, -82,0,180,3,55, -0,180,3,117,0, -180,3,90,0,180, -3,98,0,180,3, -71,0,180,3,106, -0,180,3,79,0, -180,3,52,0,180, -3,114,0,180,3, -87,0,180,3,122, -0,180,3,95,0, -180,3,68,0,180, -3,103,0,1242,12, -1,15896,1243,5,63, -3,97,0,180,3, -70,0,180,3,105, -0,180,3,78,0, -180,3,51,0,180, -3,113,0,180,3, -86,0,180,3,121, -0,180,3,67,0, -180,3,102,0,180, -3,75,0,180,3, -48,0,180,3,110, -0,180,3,83,0, -180,3,56,0,180, -3,118,0,180,3, -99,0,180,3,72, -0,180,3,107,0, -180,3,80,0,180, -3,53,0,180,3, -115,0,180,3,88, -0,180,3,69,0, -180,3,104,0,180, -3,77,0,180,3, -50,0,180,3,112, -0,180,3,85,0, -180,3,120,0,180, -3,66,0,180,3, -101,0,1244,12,1, -15976,1245,5,63,3, -97,0,180,3,70, -0,180,3,105,0, -180,3,78,0,180, -3,51,0,180,3, -113,0,180,3,86, -0,180,3,121,0, -180,3,67,0,180, -3,102,0,180,3, -75,0,180,3,48, -0,180,3,110,0, -180,3,83,0,180, -3,56,0,180,3, -118,0,180,3,99, -0,180,3,72,0, -180,3,107,0,180, -3,80,0,180,3, -53,0,180,3,115, -0,180,3,88,0, -180,3,69,0,180, -3,104,0,180,3, -77,0,180,3,50, -0,180,3,112,0, -180,3,85,0,180, -3,120,0,180,3, -66,0,180,3,101, -0,180,3,74,0, -180,3,109,0,180, -3,82,0,180,3, -55,0,180,3,117, -0,180,3,90,0, -180,3,98,0,180, -3,71,0,180,3, -106,0,180,3,79, -0,180,3,52,0, -180,3,114,0,180, -3,87,0,180,3, -122,0,180,3,95, -0,180,3,68,0, -180,3,103,0,180, -3,76,0,180,3, -49,0,180,3,111, -0,180,3,84,0, -180,3,57,0,180, -3,119,0,180,3, -65,0,180,3,100, -0,180,3,73,0, -180,3,108,0,180, -3,81,0,180,3, -54,0,180,3,116, -0,1246,12,1,16069, -1247,5,63,3,97, -0,180,3,70,0, -180,3,105,0,180, -3,78,0,180,3, -51,0,180,3,113, -0,180,3,86,0, -180,3,121,0,180, -3,67,0,180,3, -102,0,180,3,75, -0,180,3,48,0, -180,3,110,0,180, -3,83,0,180,3, -56,0,180,3,118, -0,180,3,99,0, -180,3,72,0,180, -3,107,0,180,3, -80,0,180,3,53, -0,180,3,115,0, -180,3,88,0,180, -3,69,0,180,3, -104,0,180,3,77, -0,180,3,50,0, -180,3,112,0,180, -3,85,0,180,3, -120,0,180,3,66, -0,180,3,101,0, -180,3,74,0,180, -3,109,0,180,3, -82,0,180,3,55, -0,180,3,117,0, -180,3,90,0,180, -3,98,0,180,3, -71,0,180,3,106, -0,180,3,79,0, -180,3,52,0,180, -3,114,0,180,3, -87,0,180,3,122, -0,180,3,95,0, -180,3,68,0,180, -3,103,0,180,3, -76,0,180,3,49, -0,180,3,111,0, -180,3,84,0,180, -3,57,0,180,3, -119,0,180,3,65, -0,180,3,100,0, -180,3,73,0,180, -3,108,0,180,3, -81,0,180,3,54, -0,180,3,116,0, -180,3,89,0,180, -1248,11,1,643,0, -1249,4,46,78,0, -79,0,84,0,95, -0,65,0,84,0, -95,0,82,0,79, -0,84,0,95,0, -84,0,65,0,82, -0,71,0,69,0, -84,0,95,0,69, -0,86,0,69,0, -78,0,84,0,1, --1,3,89,0,180, -1250,11,1,867,0, -183,1,-1,3,74, -0,180,3,109,0, -180,3,82,0,180, -3,55,0,180,3, -117,0,180,3,90, -0,180,3,98,0, -180,3,71,0,180, -3,106,0,180,3, -79,0,180,3,52, -0,180,3,114,0, -180,3,87,0,180, -3,122,0,180,3, -95,0,180,3,68, -0,180,3,103,0, -180,3,76,0,180, -3,49,0,180,3, -111,0,180,3,84, -0,180,3,57,0, -180,3,119,0,180, -3,65,0,180,3, -100,0,180,3,73, -0,180,3,108,0, -180,3,81,0,180, -3,54,0,180,3, -116,0,180,3,89, -0,180,1251,11,1, -867,0,183,1,-1, -3,76,0,180,3, -49,0,180,3,111, -0,180,3,84,0, -180,3,57,0,180, -3,119,0,180,3, -65,0,180,3,100, -0,180,3,73,0, -180,3,108,0,180, -3,81,0,180,3, -54,0,180,3,116, -0,180,3,89,0, -180,1252,11,1,867, -0,183,1,-1,3, -87,0,180,3,122, -0,180,3,95,0, -180,3,68,0,180, -3,103,0,180,3, -76,0,180,3,49, -0,180,3,111,0, -180,3,84,0,180, -3,57,0,180,3, -119,0,180,3,65, -0,180,3,100,0, -180,3,73,0,180, -3,108,0,180,3, -81,0,180,3,54, -0,180,3,116,0, -180,3,89,0,180, -1253,11,1,867,0, -183,1,-1,3,70, -0,180,3,105,0, -180,3,78,0,180, -3,51,0,180,3, -113,0,180,3,86, -0,180,3,121,0, -180,3,67,0,180, -3,102,0,180,3, -75,0,180,3,48, -0,180,3,110,0, -180,3,83,0,180, -3,56,0,180,3, -118,0,180,3,99, -0,180,3,72,0, -180,3,107,0,180, -3,80,0,180,3, -53,0,180,3,115, -0,180,3,88,0, -180,3,69,0,180, -3,104,0,180,3, -77,0,180,3,50, -0,180,3,112,0, -180,3,85,0,180, -3,120,0,180,3, -66,0,180,3,101, -0,180,3,74,0, -180,3,109,0,180, -3,82,0,180,3, -55,0,180,3,117, -0,180,3,90,0, -180,3,98,0,180, -3,71,0,180,3, -106,0,180,3,79, -0,180,3,52,0, -180,3,114,0,180, -3,87,0,180,3, -122,0,180,3,95, -0,180,3,68,0, -180,3,103,0,180, -3,76,0,180,3, -49,0,180,3,111, -0,180,3,84,0, -180,3,57,0,180, -3,119,0,180,3, -65,0,180,3,100, -0,180,3,73,0, -180,3,108,0,180, -3,81,0,180,3, -54,0,180,3,116, -0,180,3,89,0, -180,1254,11,1,867, -0,183,1,-1,3, -89,0,180,1255,11, -1,867,0,183,1, --1,3,68,0,180, -3,103,0,180,3, -76,0,180,3,49, -0,180,3,111,0, -180,3,84,0,180, -3,57,0,180,3, -119,0,180,3,65, -0,180,3,100,0, -180,3,73,0,180, -3,108,0,180,3, -81,0,180,3,54, -0,180,3,116,0, -180,3,89,0,180, -1256,11,1,867,0, -183,1,-1,3,89, -0,180,1257,11,1, -867,0,183,1,-1, -3,84,0,180,3, -57,0,180,3,119, -0,180,3,65,0, -180,3,100,0,180, -3,73,0,180,3, -108,0,180,3,81, -0,180,3,54,0, -180,3,116,0,180, -3,89,0,180,1258, -11,1,867,0,183, -1,-1,3,87,0, -180,3,122,0,180, -3,95,0,180,3, -68,0,180,3,103, -0,180,3,76,0, -180,3,49,0,180, -3,111,0,180,3, -84,0,180,3,57, -0,180,3,119,0, -180,3,65,0,180, -3,100,0,180,3, -73,0,180,3,108, -0,180,3,81,0, -180,3,54,0,180, -3,116,0,1259,12, -1,16555,1260,5,63, -3,97,0,1261,12, -1,16622,1262,5,63, -3,97,0,180,3, -70,0,180,3,105, -0,180,3,78,0, -180,3,51,0,180, -3,113,0,180,3, -86,0,180,3,121, -0,180,3,67,0, -180,3,102,0,180, -3,75,0,180,3, -48,0,180,3,110, -0,180,3,83,0, -180,3,56,0,180, -3,118,0,180,3, -99,0,180,3,72, -0,180,3,107,0, -180,3,80,0,180, -3,53,0,180,3, -115,0,180,3,88, -0,180,3,69,0, -180,3,104,0,180, -3,77,0,180,3, -50,0,180,3,112, -0,180,3,85,0, -180,3,120,0,180, -3,66,0,180,3, -101,0,180,3,74, -0,180,3,109,0, -180,3,82,0,180, -3,55,0,180,3, -117,0,180,3,90, -0,180,3,98,0, -180,3,71,0,180, -3,106,0,180,3, -79,0,180,3,52, -0,180,3,114,0, -1263,12,1,16707,1264, -5,63,3,97,0, -180,3,70,0,180, -3,105,0,180,3, -78,0,180,3,51, -0,180,3,113,0, -180,3,86,0,180, -3,121,0,180,3, -67,0,180,3,102, -0,180,3,75,0, -180,3,48,0,180, -3,110,0,180,3, -83,0,180,3,56, -0,180,3,118,0, -180,3,99,0,180, -3,72,0,180,3, -107,0,180,3,80, -0,180,3,53,0, -180,3,115,0,180, -3,88,0,180,3, -69,0,180,3,104, -0,180,3,77,0, -180,3,50,0,180, -3,112,0,180,3, -85,0,180,3,120, -0,180,3,66,0, -180,3,101,0,180, -3,74,0,180,3, -109,0,180,3,82, -0,180,3,55,0, -180,3,117,0,180, -3,90,0,180,3, -98,0,180,3,71, -0,180,3,106,0, -180,3,79,0,180, -3,52,0,180,3, -114,0,180,3,87, -0,180,3,122,0, -180,3,95,0,180, -3,68,0,180,3, -103,0,1265,12,1, -16794,1266,5,63,3, -97,0,180,3,70, -0,180,3,105,0, -180,3,78,0,180, -3,51,0,180,3, -113,0,180,3,86, -0,180,3,121,0, -180,3,67,0,180, -3,102,0,180,3, -75,0,180,3,48, -0,180,3,110,0, -180,3,83,0,180, -3,56,0,180,3, -118,0,180,3,99, -0,180,3,72,0, -180,3,107,0,180, -3,80,0,180,3, -53,0,180,3,115, -0,180,3,88,0, -180,3,69,0,180, -3,104,0,180,3, -77,0,180,3,50, -0,180,3,112,0, -180,3,85,0,180, -3,120,0,180,3, -66,0,180,3,101, -0,1267,12,1,16874, -1268,5,63,3,97, -0,180,3,70,0, -180,3,105,0,180, -3,78,0,180,3, -51,0,180,3,113, -0,180,3,86,0, -180,3,121,0,180, -3,67,0,180,3, -102,0,180,3,75, -0,180,3,48,0, -180,3,110,0,180, -3,83,0,180,3, -56,0,180,3,118, -0,180,3,99,0, -180,3,72,0,180, -3,107,0,180,3, -80,0,180,3,53, -0,180,3,115,0, -180,3,88,0,180, -3,69,0,180,3, -104,0,180,3,77, -0,180,3,50,0, -180,3,112,0,180, -3,85,0,180,3, -120,0,180,3,66, -0,180,3,101,0, -180,3,74,0,180, -3,109,0,180,3, -82,0,180,3,55, -0,180,3,117,0, -180,3,90,0,180, -3,98,0,180,3, -71,0,180,3,106, -0,180,3,79,0, -180,3,52,0,180, -3,114,0,180,3, -87,0,180,3,122, -0,180,3,95,0, -180,3,68,0,180, -3,103,0,180,3, -76,0,180,3,49, -0,180,3,111,0, -180,3,84,0,180, -3,57,0,180,3, -119,0,180,3,65, -0,180,3,100,0, -180,3,73,0,180, -3,108,0,180,3, -81,0,180,3,54, -0,180,3,116,0, -1269,12,1,16967,1270, -5,63,3,97,0, -180,3,70,0,180, -3,105,0,180,3, -78,0,180,3,51, -0,180,3,113,0, -180,3,86,0,180, -3,121,0,180,3, -67,0,180,3,102, -0,180,3,75,0, -180,3,48,0,180, -3,110,0,180,3, -83,0,180,3,56, -0,180,3,118,0, -180,3,99,0,180, -3,72,0,180,3, -107,0,180,3,80, -0,180,3,53,0, -180,3,115,0,180, -3,88,0,180,3, -69,0,180,3,104, -0,180,3,77,0, -180,3,50,0,180, -3,112,0,180,3, -85,0,180,3,120, -0,180,3,66,0, -180,3,101,0,180, -3,74,0,180,3, -109,0,180,3,82, -0,180,3,55,0, -180,3,117,0,180, -3,90,0,180,3, -98,0,180,3,71, -0,180,3,106,0, -180,3,79,0,180, -3,52,0,180,3, -114,0,180,3,87, -0,180,3,122,0, -180,3,95,0,180, -3,68,0,180,3, -103,0,180,3,76, -0,180,3,49,0, -180,3,111,0,180, -3,84,0,180,3, -57,0,180,3,119, -0,180,3,65,0, -180,3,100,0,180, -3,73,0,180,3, -108,0,180,3,81, -0,180,3,54,0, -180,3,116,0,180, -3,89,0,180,1271, -11,1,664,0,1272, -4,38,78,0,79, -0,84,0,95,0, -65,0,84,0,95, -0,84,0,65,0, -82,0,71,0,69, -0,84,0,95,0, -69,0,86,0,69, -0,78,0,84,0, -1,-1,3,89,0, -180,1273,11,1,867, -0,183,1,-1,3, -74,0,180,3,109, -0,180,3,82,0, -180,3,55,0,180, -3,117,0,180,3, -90,0,180,3,98, -0,180,3,71,0, -180,3,106,0,180, -3,79,0,180,3, -52,0,180,3,114, -0,180,3,87,0, -180,3,122,0,180, -3,95,0,180,3, -68,0,180,3,103, -0,180,3,76,0, -180,3,49,0,180, -3,111,0,180,3, -84,0,180,3,57, -0,180,3,119,0, -180,3,65,0,180, -3,100,0,180,3, -73,0,180,3,108, -0,180,3,81,0, -180,3,54,0,180, -3,116,0,180,3, -89,0,180,1274,11, -1,867,0,183,1, --1,3,76,0,180, -3,49,0,180,3, -111,0,180,3,84, -0,180,3,57,0, -180,3,119,0,180, -3,65,0,180,3, -100,0,180,3,73, -0,180,3,108,0, -180,3,81,0,180, -3,54,0,180,3, -116,0,180,3,89, -0,180,1275,11,1, -867,0,183,1,-1, -3,87,0,180,3, -122,0,180,3,95, -0,180,3,68,0, -180,3,103,0,180, -3,76,0,180,3, -49,0,180,3,111, -0,180,3,84,0, -180,3,57,0,180, -3,119,0,180,3, -65,0,180,3,100, -0,180,3,73,0, -180,3,108,0,180, -3,81,0,180,3, -54,0,180,3,116, -0,180,3,89,0, -180,1276,11,1,867, -0,183,1,-1,3, -70,0,180,3,105, -0,180,3,78,0, -180,3,51,0,180, -3,113,0,180,3, -86,0,180,3,121, -0,180,3,67,0, -180,3,102,0,180, -3,75,0,180,3, -48,0,180,3,110, -0,180,3,83,0, -180,3,56,0,180, -3,118,0,180,3, -99,0,180,3,72, -0,180,3,107,0, -180,3,80,0,180, -3,53,0,180,3, -115,0,180,3,88, -0,180,3,69,0, -180,3,104,0,180, -3,77,0,180,3, -50,0,180,3,112, -0,180,3,85,0, -180,3,120,0,180, -3,66,0,180,3, -101,0,180,3,74, -0,180,3,109,0, -180,3,82,0,180, -3,55,0,180,3, -117,0,180,3,90, -0,180,3,98,0, -180,3,71,0,180, -3,106,0,180,3, -79,0,180,3,52, -0,180,3,114,0, -180,3,87,0,180, -3,122,0,180,3, -95,0,180,3,68, -0,180,3,103,0, -180,3,76,0,180, -3,49,0,180,3, -111,0,180,3,84, -0,180,3,57,0, -180,3,119,0,180, -3,65,0,180,3, -100,0,180,3,73, -0,180,3,108,0, -180,3,81,0,180, -3,54,0,180,3, -116,0,180,3,89, -0,180,1277,11,1, -867,0,183,1,-1, -3,89,0,180,1278, -11,1,867,0,183, -1,-1,3,68,0, -180,3,103,0,180, -3,76,0,180,3, -49,0,180,3,111, -0,180,3,84,0, -180,3,57,0,180, -3,119,0,180,3, -65,0,180,3,100, -0,180,3,73,0, -180,3,108,0,180, -3,81,0,180,3, -54,0,180,3,116, -0,180,3,89,0, -180,1279,11,1,867, -0,183,1,-1,3, -89,0,180,1280,11, -1,867,0,183,1, --1,3,70,0,180, -3,105,0,180,3, -78,0,180,3,51, -0,180,3,113,0, -180,3,86,0,180, -3,121,0,180,3, -67,0,180,3,102, -0,180,3,75,0, -180,3,48,0,180, -3,110,0,180,3, -83,0,180,3,56, -0,180,3,118,0, -180,3,99,0,180, -3,72,0,180,3, -107,0,180,3,80, -0,180,3,53,0, -180,3,115,0,180, -3,88,0,180,3, -69,0,180,3,104, -0,180,3,77,0, -180,3,50,0,180, -3,112,0,180,3, -85,0,180,3,120, -0,180,3,66,0, -180,3,101,0,180, -3,74,0,180,3, -109,0,180,3,82, -0,180,3,55,0, -180,3,117,0,180, -3,90,0,180,3, -98,0,180,3,71, -0,180,3,106,0, -180,3,79,0,180, -3,52,0,180,3, -114,0,180,3,87, -0,180,3,122,0, -180,3,95,0,180, -3,68,0,180,3, -103,0,180,3,76, -0,180,3,49,0, -180,3,111,0,180, -3,84,0,180,3, -57,0,180,3,119, -0,180,3,65,0, -180,3,100,0,180, -3,73,0,180,3, -108,0,180,3,81, -0,180,3,54,0, -180,3,116,0,180, -3,89,0,180,1281, -11,1,867,0,183, -1,-1,3,68,0, -180,3,103,0,180, -3,76,0,180,3, -49,0,180,3,111, -0,180,3,84,0, -180,3,57,0,180, -3,119,0,180,3, -65,0,180,3,100, -0,180,3,73,0, -180,3,108,0,180, -3,81,0,180,3, -54,0,180,3,116, -0,180,3,89,0, -180,1282,11,1,867, -0,183,1,-1,3, -89,0,180,1283,11, -1,867,0,183,1, --1,3,84,0,180, -3,57,0,180,3, -119,0,180,3,65, -0,180,3,100,0, -180,3,73,0,180, -3,108,0,180,3, -81,0,180,3,54, -0,180,3,116,0, -180,3,89,0,180, -1284,11,1,867,0, -183,1,-1,3,70, -0,178,3,107,0, -1285,12,1,21812,1286, -5,63,3,97,0, -180,3,70,0,180, -3,105,0,180,3, -78,0,180,3,51, -0,180,3,113,0, -180,3,86,0,180, -3,121,0,180,3, -67,0,180,3,102, -0,180,3,75,0, -180,3,48,0,180, -3,110,0,180,3, -83,0,180,3,56, -0,180,3,118,0, -180,3,99,0,180, -3,72,0,180,3, -107,0,180,3,80, -0,180,3,53,0, -180,3,115,0,180, -3,88,0,180,3, -69,0,180,3,104, -0,180,3,77,0, -180,3,50,0,180, -3,112,0,180,3, -85,0,180,3,120, -0,180,3,66,0, -180,3,101,0,1287, -12,1,21892,1288,5, -63,3,97,0,180, -3,70,0,180,3, -105,0,180,3,78, -0,180,3,51,0, -180,3,113,0,180, -3,86,0,180,3, -121,0,1289,12,1, -21962,1290,5,63,3, -97,0,180,3,70, -0,180,3,105,0, -180,3,78,0,180, -3,51,0,180,3, -113,0,180,3,86, -0,180,3,121,0, -180,3,67,0,180, -3,102,0,180,3, -75,0,180,3,48, -0,180,3,110,0, -180,3,83,0,180, -3,56,0,180,3, -118,0,180,3,99, -0,180,3,72,0, -180,3,107,0,180, -3,80,0,180,3, -53,0,180,3,115, -0,180,3,88,0, -180,3,69,0,180, -3,104,0,180,3, -77,0,180,3,50, -0,180,3,112,0, -180,3,85,0,180, -3,120,0,180,3, -66,0,180,3,101, -0,180,3,74,0, -180,3,109,0,180, -3,82,0,180,3, -55,0,180,3,117, -0,180,3,90,0, -180,3,98,0,180, -3,71,0,180,3, -106,0,180,3,79, -0,180,3,52,0, -180,3,114,0,180, -3,87,0,180,3, -122,0,180,3,95, -0,180,3,68,0, -180,3,103,0,180, -3,76,0,180,3, -49,0,180,3,111, -0,180,3,84,0, -180,3,57,0,180, -3,119,0,180,3, -65,0,180,3,100, -0,180,3,73,0, -180,3,108,0,180, -3,81,0,180,3, -54,0,180,3,116, -0,180,3,89,0, -180,1291,11,1,313, -0,1292,4,16,75, -0,69,0,89,0, -95,0,84,0,89, -0,80,0,69,0, -1,-1,3,67,0, -180,3,102,0,180, -3,75,0,180,3, -48,0,180,3,110, -0,180,3,83,0, -180,3,56,0,180, -3,118,0,180,3, -99,0,180,3,72, -0,180,3,107,0, -180,3,80,0,180, -3,53,0,180,3, -115,0,180,3,88, -0,180,3,69,0, -180,3,104,0,180, -3,77,0,180,3, -50,0,180,3,112, -0,180,3,85,0, -180,3,120,0,180, -3,66,0,180,3, -101,0,180,3,74, -0,180,3,109,0, -180,3,82,0,180, -3,55,0,180,3, -117,0,180,3,90, -0,180,3,98,0, -180,3,71,0,180, -3,106,0,180,3, -79,0,180,3,52, -0,180,3,114,0, -180,3,87,0,180, -3,122,0,180,3, -95,0,180,3,68, -0,180,3,103,0, -180,3,76,0,180, -3,49,0,180,3, -111,0,180,3,84, -0,180,3,57,0, -180,3,119,0,180, -3,65,0,180,3, -100,0,180,3,73, -0,180,3,108,0, -180,3,81,0,180, -3,54,0,180,3, -116,0,180,3,89, -0,180,1293,11,1, -867,0,183,1,-1, -3,74,0,180,3, -109,0,180,3,82, -0,180,3,55,0, -180,3,117,0,180, -3,90,0,180,3, -98,0,180,3,71, -0,180,3,106,0, -180,3,79,0,180, -3,52,0,180,3, -114,0,180,3,87, -0,180,3,122,0, -180,3,95,0,180, -3,68,0,180,3, -103,0,180,3,76, -0,180,3,49,0, -180,3,111,0,180, -3,84,0,180,3, -57,0,180,3,119, -0,180,3,65,0, -180,3,100,0,180, -3,73,0,180,3, -108,0,180,3,81, -0,180,3,54,0, -180,3,116,0,180, -3,89,0,180,1294, -11,1,867,0,183, -1,-1,3,67,0, -178,3,104,0,1295, -12,1,24934,1296,5, -63,3,97,0,180, -3,70,0,180,3, -105,0,180,3,78, -0,180,3,51,0, -180,3,113,0,180, -3,86,0,180,3, -121,0,180,3,67, -0,180,3,102,0, -180,3,75,0,180, -3,48,0,180,3, -110,0,180,3,83, -0,180,3,56,0, -180,3,118,0,180, -3,99,0,180,3, -72,0,180,3,107, -0,180,3,80,0, -180,3,53,0,180, -3,115,0,180,3, -88,0,180,3,69, -0,180,3,104,0, -180,3,77,0,180, -3,50,0,180,3, -112,0,180,3,85, -0,180,3,120,0, -180,3,66,0,180, -3,101,0,180,3, -74,0,180,3,109, -0,180,3,82,0, -180,3,55,0,180, -3,117,0,180,3, -90,0,180,3,98, -0,180,3,71,0, -180,3,106,0,180, -3,79,0,180,3, -52,0,180,3,114, -0,180,3,87,0, -180,3,122,0,180, -3,95,0,180,3, -68,0,180,3,103, -0,180,3,76,0, -180,3,49,0,180, -3,111,0,180,3, -84,0,180,3,57, -0,180,3,119,0, -180,3,65,0,180, -3,100,0,180,3, -73,0,180,3,108, -0,180,3,81,0, -180,3,54,0,180, -3,116,0,1297,12, -1,25027,1298,5,63, -3,97,0,180,3, -70,0,180,3,105, -0,180,3,78,0, -180,3,51,0,180, -3,113,0,180,3, -86,0,180,3,121, -0,180,3,67,0, -180,3,102,0,180, -3,75,0,180,3, -48,0,180,3,110, -0,180,3,83,0, -180,3,56,0,180, -3,118,0,180,3, -99,0,180,3,72, -0,180,3,107,0, -180,3,80,0,180, -3,53,0,180,3, -115,0,180,3,88, -0,180,3,69,0, -180,3,104,0,180, -3,77,0,180,3, -50,0,180,3,112, -0,180,3,85,0, -180,3,120,0,180, -3,66,0,180,3, -101,0,180,3,74, -0,180,3,109,0, -180,3,82,0,180, -3,55,0,180,3, -117,0,180,3,90, -0,180,3,98,0, -180,3,71,0,180, -3,106,0,180,3, -79,0,180,3,52, -0,180,3,114,0, -180,3,87,0,180, -3,122,0,180,3, -95,0,180,3,68, -0,180,3,103,0, -180,3,76,0,180, -3,49,0,180,3, -111,0,180,3,84, -0,180,3,57,0, -180,3,119,0,180, -3,65,0,180,3, -100,0,180,3,73, -0,180,3,108,0, -180,3,81,0,180, -3,54,0,180,3, -116,0,1299,12,1, -25120,1300,5,63,3, -97,0,180,3,70, -0,180,3,105,0, -180,3,78,0,180, -3,51,0,180,3, -113,0,180,3,86, -0,180,3,121,0, -180,3,67,0,180, -3,102,0,180,3, -75,0,180,3,48, -0,180,3,110,0, -180,3,83,0,180, -3,56,0,180,3, -118,0,180,3,99, -0,180,3,72,0, -180,3,107,0,180, -3,80,0,180,3, -53,0,180,3,115, -0,180,3,88,0, -180,3,69,0,180, -3,104,0,180,3, -77,0,180,3,50, -0,180,3,112,0, -1301,12,1,25198,1302, -5,63,3,97,0, -180,3,70,0,180, -3,105,0,180,3, -78,0,180,3,51, -0,180,3,113,0, -180,3,86,0,180, -3,121,0,180,3, -67,0,180,3,102, -0,180,3,75,0, -180,3,48,0,180, -3,110,0,180,3, -83,0,180,3,56, -0,180,3,118,0, -180,3,99,0,180, -3,72,0,180,3, -107,0,180,3,80, -0,180,3,53,0, -180,3,115,0,180, -3,88,0,180,3, -69,0,180,3,104, -0,180,3,77,0, -180,3,50,0,180, -3,112,0,180,3, -85,0,180,3,120, -0,180,3,66,0, -180,3,101,0,180, -3,74,0,180,3, -109,0,180,3,82, -0,180,3,55,0, -180,3,117,0,180, -3,90,0,180,3, -98,0,180,3,71, -0,180,3,106,0, -180,3,79,0,180, -3,52,0,180,3, -114,0,180,3,87, -0,180,3,122,0, -180,3,95,0,1303, -12,1,25234,1304,5, -63,3,97,0,180, -3,70,0,180,3, -105,0,180,3,78, -0,180,3,51,0, -180,3,113,0,180, -3,86,0,180,3, -121,0,180,3,67, -0,180,3,102,0, -180,3,75,0,180, -3,48,0,180,3, -110,0,180,3,83, -0,180,3,56,0, -180,3,118,0,180, -3,99,0,180,3, -72,0,180,3,107, -0,180,3,80,0, -180,3,53,0,180, -3,115,0,180,3, -88,0,180,3,69, -0,180,3,104,0, -180,3,77,0,180, -3,50,0,180,3, -112,0,180,3,85, -0,180,3,120,0, -180,3,66,0,180, -3,101,0,180,3, -74,0,180,3,109, -0,180,3,82,0, -180,3,55,0,180, -3,117,0,180,3, -90,0,180,3,98, -0,180,3,71,0, -180,3,106,0,180, -3,79,0,180,3, -52,0,180,3,114, -0,1305,12,1,25319, -1306,5,63,3,97, -0,180,3,70,0, -180,3,105,0,180, -3,78,0,180,3, -51,0,180,3,113, -0,180,3,86,0, -180,3,121,0,180, -3,67,0,180,3, -102,0,180,3,75, -0,180,3,48,0, -180,3,110,0,180, -3,83,0,180,3, -56,0,180,3,118, -0,180,3,99,0, -180,3,72,0,180, -3,107,0,180,3, -80,0,180,3,53, -0,180,3,115,0, -180,3,88,0,180, -3,69,0,180,3, -104,0,180,3,77, -0,180,3,50,0, -180,3,112,0,180, -3,85,0,180,3, -120,0,180,3,66, -0,180,3,101,0, -1307,12,1,25399,1308, -5,63,3,97,0, -180,3,70,0,180, -3,105,0,180,3, -78,0,180,3,51, -0,180,3,113,0, -1309,12,1,25468,1310, -5,63,3,97,0, -180,3,70,0,180, -3,105,0,180,3, -78,0,180,3,51, -0,180,3,113,0, -180,3,86,0,180, -3,121,0,180,3, -67,0,180,3,102, -0,180,3,75,0, -180,3,48,0,180, -3,110,0,180,3, -83,0,180,3,56, -0,180,3,118,0, -180,3,99,0,180, -3,72,0,180,3, -107,0,180,3,80, -0,180,3,53,0, -180,3,115,0,180, -3,88,0,180,3, -69,0,180,3,104, -0,180,3,77,0, -180,3,50,0,180, -3,112,0,180,3, -85,0,180,3,120, -0,180,3,66,0, -180,3,101,0,180, -3,74,0,180,3, -109,0,180,3,82, -0,180,3,55,0, -180,3,117,0,1311, -12,1,25550,1312,5, -63,3,97,0,180, -3,70,0,180,3, -105,0,180,3,78, -0,180,3,51,0, -180,3,113,0,180, -3,86,0,180,3, -121,0,180,3,67, -0,180,3,102,0, -180,3,75,0,180, -3,48,0,180,3, -110,0,180,3,83, -0,180,3,56,0, -180,3,118,0,180, -3,99,0,180,3, -72,0,180,3,107, -0,180,3,80,0, -180,3,53,0,180, -3,115,0,180,3, -88,0,180,3,69, -0,180,3,104,0, -180,3,77,0,180, -3,50,0,180,3, -112,0,180,3,85, -0,180,3,120,0, -180,3,66,0,180, -3,101,0,1313,12, -1,25630,1314,5,63, -3,97,0,180,3, -70,0,180,3,105, -0,180,3,78,0, -180,3,51,0,180, -3,113,0,180,3, -86,0,180,3,121, -0,180,3,67,0, -180,3,102,0,180, -3,75,0,180,3, -48,0,180,3,110, -0,180,3,83,0, -180,3,56,0,180, -3,118,0,180,3, -99,0,180,3,72, -0,180,3,107,0, -180,3,80,0,180, -3,53,0,180,3, -115,0,1315,12,1, -25706,1316,5,63,3, -97,0,180,3,70, -0,180,3,105,0, -180,3,78,0,180, -3,51,0,180,3, -113,0,180,3,86, -0,180,3,121,0, -180,3,67,0,180, -3,102,0,180,3, -75,0,180,3,48, -0,180,3,110,0, -180,3,83,0,180, -3,56,0,180,3, -118,0,180,3,99, -0,180,3,72,0, -180,3,107,0,180, -3,80,0,180,3, -53,0,180,3,115, -0,180,3,88,0, -180,3,69,0,180, -3,104,0,180,3, -77,0,180,3,50, -0,180,3,112,0, -180,3,85,0,180, -3,120,0,180,3, -66,0,180,3,101, -0,180,3,74,0, -180,3,109,0,180, -3,82,0,180,3, -55,0,180,3,117, -0,180,3,90,0, -180,3,98,0,180, -3,71,0,180,3, -106,0,180,3,79, -0,180,3,52,0, -180,3,114,0,180, -3,87,0,180,3, -122,0,180,3,95, -0,180,3,68,0, -180,3,103,0,180, -3,76,0,180,3, -49,0,180,3,111, -0,180,3,84,0, -180,3,57,0,180, -3,119,0,180,3, -65,0,180,3,100, -0,180,3,73,0, -180,3,108,0,180, -3,81,0,180,3, -54,0,180,3,116, -0,1317,12,1,25799, -1318,5,63,3,97, -0,180,3,70,0, -180,3,105,0,180, -3,78,0,180,3, -51,0,180,3,113, -0,180,3,86,0, -180,3,121,0,180, -3,67,0,180,3, -102,0,180,3,75, -0,180,3,48,0, -180,3,110,0,180, -3,83,0,180,3, -56,0,180,3,118, -0,180,3,99,0, -180,3,72,0,180, -3,107,0,180,3, -80,0,180,3,53, -0,180,3,115,0, -180,3,88,0,180, -3,69,0,180,3, -104,0,180,3,77, -0,180,3,50,0, -180,3,112,0,180, -3,85,0,180,3, -120,0,180,3,66, -0,180,3,101,0, -180,3,74,0,180, -3,109,0,180,3, -82,0,180,3,55, -0,180,3,117,0, -180,3,90,0,180, -3,98,0,180,3, -71,0,180,3,106, -0,180,3,79,0, -180,3,52,0,180, -3,114,0,180,3, -87,0,180,3,122, -0,180,3,95,0, -180,3,68,0,180, -3,103,0,180,3, -76,0,180,3,49, -0,180,3,111,0, -180,3,84,0,180, -3,57,0,180,3, -119,0,180,3,65, -0,180,3,100,0, -180,3,73,0,180, -3,108,0,180,3, -81,0,180,3,54, -0,180,3,116,0, -180,3,89,0,180, -1319,11,1,829,0, -1320,4,36,72,0, -84,0,84,0,80, -0,95,0,82,0, -69,0,81,0,85, -0,69,0,83,0, -84,0,95,0,69, -0,86,0,69,0, -78,0,84,0,1, --1,3,89,0,180, -1321,11,1,867,0, -183,1,-1,3,88, -0,180,3,69,0, -180,3,104,0,180, -3,77,0,180,3, -50,0,180,3,112, -0,180,3,85,0, -180,3,120,0,180, -3,66,0,180,3, -101,0,180,3,74, -0,180,3,109,0, -180,3,82,0,180, -3,55,0,180,3, -117,0,180,3,90, -0,180,3,98,0, -180,3,71,0,180, -3,106,0,180,3, -79,0,180,3,52, -0,180,3,114,0, -180,3,87,0,180, -3,122,0,180,3, -95,0,180,3,68, -0,180,3,103,0, -180,3,76,0,180, -3,49,0,180,3, -111,0,180,3,84, -0,180,3,57,0, -180,3,119,0,180, -3,65,0,180,3, -100,0,180,3,73, -0,180,3,108,0, -180,3,81,0,180, -3,54,0,180,3, -116,0,180,3,89, -0,180,1322,11,1, -867,0,183,1,-1, -3,74,0,180,3, -109,0,180,3,82, -0,180,3,55,0, -180,3,117,0,180, -3,90,0,180,3, -98,0,180,3,71, -0,180,3,106,0, -180,3,79,0,180, -3,52,0,180,3, -114,0,180,3,87, -0,180,3,122,0, -180,3,95,0,180, -3,68,0,180,3, -103,0,180,3,76, -0,180,3,49,0, -180,3,111,0,180, -3,84,0,180,3, -57,0,180,3,119, -0,180,3,65,0, -180,3,100,0,180, -3,73,0,180,3, -108,0,180,3,81, -0,180,3,54,0, -180,3,116,0,180, -3,89,0,180,1323, -11,1,867,0,183, -1,-1,3,90,0, -180,3,98,0,180, -3,71,0,180,3, -106,0,180,3,79, -0,180,3,52,0, -180,3,114,0,180, -3,87,0,180,3, -122,0,180,3,95, -0,180,3,68,0, -180,3,103,0,180, -3,76,0,180,3, -49,0,180,3,111, -0,180,3,84,0, -180,3,57,0,180, -3,119,0,180,3, -65,0,180,3,100, -0,180,3,73,0, -180,3,108,0,180, -3,81,0,180,3, -54,0,180,3,116, -0,180,3,89,0, -180,1324,11,1,867, -0,183,1,-1,3, -86,0,180,3,121, -0,180,3,67,0, -180,3,102,0,180, -3,75,0,180,3, -48,0,180,3,110, -0,180,3,83,0, -180,3,56,0,180, -3,118,0,180,3, -99,0,180,3,72, -0,180,3,107,0, -180,3,80,0,180, -3,53,0,180,3, -115,0,1325,12,1, -26075,1326,5,63,3, -97,0,180,3,70, -0,180,3,105,0, -180,3,78,0,180, -3,51,0,180,3, -113,0,180,3,86, -0,180,3,121,0, -180,3,67,0,180, -3,102,0,180,3, -75,0,180,3,48, -0,180,3,110,0, -180,3,83,0,180, -3,56,0,180,3, -118,0,180,3,99, -0,180,3,72,0, -180,3,107,0,180, -3,80,0,180,3, -53,0,180,3,115, -0,180,3,88,0, -180,3,69,0,180, -3,104,0,180,3, -77,0,180,3,50, -0,180,3,112,0, -1327,12,1,26153,1328, -5,63,3,97,0, -180,3,70,0,180, -3,105,0,180,3, -78,0,180,3,51, -0,180,3,113,0, -180,3,86,0,180, -3,121,0,180,3, -67,0,180,3,102, -0,180,3,75,0, -180,3,48,0,180, -3,110,0,180,3, -83,0,180,3,56, -0,180,3,118,0, -180,3,99,0,180, -3,72,0,180,3, -107,0,180,3,80, -0,180,3,53,0, -180,3,115,0,180, -3,88,0,180,3, -69,0,180,3,104, -0,180,3,77,0, -180,3,50,0,180, -3,112,0,180,3, -85,0,180,3,120, -0,180,3,66,0, -180,3,101,0,180, -3,74,0,180,3, -109,0,180,3,82, -0,180,3,55,0, -180,3,117,0,180, -3,90,0,180,3, -98,0,180,3,71, -0,180,3,106,0, -180,3,79,0,180, -3,52,0,180,3, -114,0,180,3,87, -0,180,3,122,0, -180,3,95,0,180, -3,68,0,180,3, -103,0,180,3,76, -0,180,3,49,0, -180,3,111,0,1329, -12,1,26241,1330,5, -63,3,97,0,180, -3,70,0,180,3, -105,0,180,3,78, -0,180,3,51,0, -180,3,113,0,180, -3,86,0,180,3, -121,0,180,3,67, -0,180,3,102,0, -180,3,75,0,180, -3,48,0,180,3, -110,0,1331,12,1, -26313,1332,5,63,3, -97,0,180,3,70, -0,180,3,105,0, -180,3,78,0,180, -3,51,0,180,3, -113,0,180,3,86, -0,180,3,121,0, -180,3,67,0,180, -3,102,0,180,3, -75,0,180,3,48, -0,180,3,110,0, -180,3,83,0,180, -3,56,0,180,3, -118,0,180,3,99, -0,180,3,72,0, -180,3,107,0,180, -3,80,0,180,3, -53,0,180,3,115, -0,1333,12,1,26389, -1334,5,63,3,97, -0,180,3,70,0, -180,3,105,0,180, -3,78,0,180,3, -51,0,180,3,113, -0,180,3,86,0, -180,3,121,0,180, -3,67,0,180,3, -102,0,180,3,75, -0,180,3,48,0, -180,3,110,0,180, -3,83,0,180,3, -56,0,180,3,118, -0,180,3,99,0, -180,3,72,0,180, -3,107,0,180,3, -80,0,180,3,53, -0,180,3,115,0, -180,3,88,0,180, -3,69,0,180,3, -104,0,180,3,77, -0,180,3,50,0, -180,3,112,0,180, -3,85,0,180,3, -120,0,180,3,66, -0,180,3,101,0, -1335,12,1,26469,1336, -5,63,3,97,0, -180,3,70,0,180, -3,105,0,180,3, -78,0,180,3,51, -0,180,3,113,0, -180,3,86,0,180, -3,121,0,180,3, -67,0,180,3,102, -0,180,3,75,0, -180,3,48,0,180, -3,110,0,180,3, -83,0,180,3,56, -0,180,3,118,0, -180,3,99,0,180, -3,72,0,180,3, -107,0,180,3,80, -0,180,3,53,0, -180,3,115,0,180, -3,88,0,180,3, -69,0,180,3,104, -0,180,3,77,0, -180,3,50,0,180, -3,112,0,180,3, -85,0,180,3,120, -0,180,3,66,0, -180,3,101,0,180, -3,74,0,180,3, -109,0,180,3,82, -0,180,3,55,0, -180,3,117,0,180, -3,90,0,180,3, -98,0,180,3,71, -0,180,3,106,0, -180,3,79,0,180, -3,52,0,180,3, -114,0,180,3,87, -0,180,3,122,0, -180,3,95,0,180, -3,68,0,180,3, -103,0,180,3,76, -0,180,3,49,0, -180,3,111,0,180, -3,84,0,180,3, -57,0,180,3,119, -0,180,3,65,0, -180,3,100,0,180, -3,73,0,180,3, -108,0,180,3,81, -0,180,3,54,0, -180,3,116,0,180, -3,89,0,180,1337, -11,1,484,0,1338, -4,38,72,0,84, -0,84,0,80,0, -95,0,82,0,69, -0,83,0,80,0, -79,0,78,0,83, -0,69,0,95,0, -69,0,86,0,69, -0,78,0,84,0, -1,-1,3,74,0, -180,3,109,0,180, -3,82,0,180,3, -55,0,180,3,117, -0,180,3,90,0, -180,3,98,0,180, -3,71,0,180,3, -106,0,180,3,79, -0,180,3,52,0, -180,3,114,0,180, -3,87,0,180,3, -122,0,180,3,95, -0,180,3,68,0, -180,3,103,0,180, -3,76,0,180,3, -49,0,180,3,111, -0,180,3,84,0, -180,3,57,0,180, -3,119,0,180,3, -65,0,180,3,100, -0,180,3,73,0, -180,3,108,0,180, -3,81,0,180,3, -54,0,180,3,116, -0,180,3,89,0, -180,1339,11,1,867, -0,183,1,-1,3, -88,0,180,3,69, -0,180,3,104,0, -180,3,77,0,180, -3,50,0,180,3, -112,0,180,3,85, -0,180,3,120,0, -180,3,66,0,180, -3,101,0,180,3, -74,0,180,3,109, -0,180,3,82,0, -180,3,55,0,180, -3,117,0,180,3, -90,0,180,3,98, -0,180,3,71,0, -180,3,106,0,180, -3,79,0,180,3, -52,0,180,3,114, -0,180,3,87,0, -180,3,122,0,180, -3,95,0,180,3, -68,0,180,3,103, -0,180,3,76,0, -180,3,49,0,180, -3,111,0,180,3, -84,0,180,3,57, -0,180,3,119,0, -180,3,65,0,180, -3,100,0,180,3, -73,0,180,3,108, -0,180,3,81,0, -180,3,54,0,180, -3,116,0,180,3, -89,0,180,1340,11, -1,867,0,183,1, --1,3,83,0,180, -3,56,0,180,3, -118,0,180,3,99, -0,180,3,72,0, -180,3,107,0,180, -3,80,0,180,3, -53,0,180,3,115, -0,180,3,88,0, -180,3,69,0,180, -3,104,0,180,3, -77,0,180,3,50, -0,180,3,112,0, -180,3,85,0,180, -3,120,0,180,3, -66,0,180,3,101, -0,180,3,74,0, -180,3,109,0,180, -3,82,0,180,3, -55,0,180,3,117, -0,180,3,90,0, -180,3,98,0,180, -3,71,0,180,3, -106,0,180,3,79, -0,180,3,52,0, -180,3,114,0,180, -3,87,0,180,3, -122,0,180,3,95, -0,180,3,68,0, -180,3,103,0,180, -3,76,0,180,3, -49,0,180,3,111, -0,180,3,84,0, -180,3,57,0,180, -3,119,0,180,3, -65,0,180,3,100, -0,180,3,73,0, -180,3,108,0,180, -3,81,0,180,3, -54,0,180,3,116, -0,180,3,89,0, -180,1341,11,1,867, -0,183,1,-1,3, -84,0,180,3,57, -0,180,3,119,0, -180,3,65,0,180, -3,100,0,180,3, -73,0,180,3,108, -0,180,3,81,0, -180,3,54,0,180, -3,116,0,180,3, -89,0,180,1342,11, -1,867,0,183,1, --1,3,85,0,180, -3,120,0,180,3, -66,0,180,3,101, -0,180,3,74,0, -180,3,109,0,180, -3,82,0,180,3, -55,0,180,3,117, -0,180,3,90,0, -180,3,98,0,180, -3,71,0,180,3, -106,0,180,3,79, -0,180,3,52,0, -180,3,114,0,180, -3,87,0,180,3, -122,0,180,3,95, -0,180,3,68,0, -180,3,103,0,180, -3,76,0,180,3, -49,0,180,3,111, -0,180,3,84,0, -180,3,57,0,180, -3,119,0,180,3, -65,0,180,3,100, -0,180,3,73,0, -180,3,108,0,180, -3,81,0,180,3, -54,0,180,3,116, -0,180,3,89,0, -180,1343,11,1,867, -0,183,1,-1,3, -88,0,180,3,69, -0,180,3,104,0, -180,3,77,0,180, -3,50,0,180,3, -112,0,180,3,85, -0,180,3,120,0, -180,3,66,0,180, -3,101,0,180,3, -74,0,180,3,109, -0,180,3,82,0, -180,3,55,0,180, -3,117,0,180,3, -90,0,180,3,98, -0,180,3,71,0, -180,3,106,0,180, -3,79,0,180,3, -52,0,180,3,114, -0,180,3,87,0, -180,3,122,0,180, -3,95,0,180,3, -68,0,180,3,103, -0,180,3,76,0, -180,3,49,0,180, -3,111,0,180,3, -84,0,180,3,57, -0,180,3,119,0, -180,3,65,0,180, -3,100,0,180,3, -73,0,180,3,108, -0,180,3,81,0, -180,3,54,0,180, -3,116,0,180,3, -89,0,180,1344,11, -1,867,0,183,1, --1,3,74,0,180, -3,109,0,180,3, -82,0,180,3,55, -0,180,3,117,0, -180,3,90,0,180, -3,98,0,180,3, -71,0,180,3,106, -0,180,3,79,0, -180,3,52,0,180, -3,114,0,180,3, -87,0,180,3,122, -0,180,3,95,0, -180,3,68,0,180, -3,103,0,180,3, -76,0,180,3,49, -0,180,3,111,0, -180,3,84,0,180, -3,57,0,180,3, -119,0,180,3,65, -0,180,3,100,0, -180,3,73,0,180, -3,108,0,180,3, -81,0,180,3,54, -0,180,3,116,0, -180,3,89,0,180, -1345,11,1,867,0, -183,1,-1,3,87, -0,180,3,122,0, -180,3,95,0,180, -3,68,0,180,3, -103,0,180,3,76, -0,180,3,49,0, -180,3,111,0,180, -3,84,0,180,3, -57,0,180,3,119, -0,180,3,65,0, -180,3,100,0,180, -3,73,0,180,3, -108,0,180,3,81, -0,180,3,54,0, -180,3,116,0,180, -3,89,0,180,1346, -11,1,867,0,183, -1,-1,3,68,0, -180,3,103,0,180, -3,76,0,180,3, -49,0,180,3,111, -0,180,3,84,0, -180,3,57,0,180, -3,119,0,180,3, -65,0,180,3,100, -0,180,3,73,0, -180,3,108,0,180, -3,81,0,180,3, -54,0,180,3,116, -0,180,3,89,0, -180,1347,11,1,867, -0,183,1,-1,3, -85,0,180,3,120, -0,180,3,66,0, -180,3,101,0,180, -3,74,0,180,3, -109,0,180,3,82, -0,180,3,55,0, -180,3,117,0,180, -3,90,0,180,3, -98,0,180,3,71, -0,180,3,106,0, -180,3,79,0,180, -3,52,0,180,3, -114,0,180,3,87, -0,180,3,122,0, -180,3,95,0,180, -3,68,0,180,3, -103,0,180,3,76, -0,180,3,49,0, -180,3,111,0,180, -3,84,0,180,3, -57,0,180,3,119, -0,180,3,65,0, -180,3,100,0,180, -3,73,0,180,3, -108,0,180,3,81, -0,180,3,54,0, -180,3,116,0,180, -3,89,0,180,1348, -11,1,867,0,183, -1,-1,3,89,0, -180,1349,11,1,867, -0,183,1,-1,3, -89,0,180,1350,11, -1,867,0,183,1, --1,3,64,0,1351, -12,1,6636,1352,5, -0,1353,11,1,106, -0,1354,4,4,65, -0,84,0,1,-1, -3,101,0,1355,12, -1,27097,1356,5,63, -3,97,0,180,3, -70,0,180,3,105, -0,180,3,78,0, -180,3,51,0,180, -3,113,0,180,3, -86,0,180,3,121, -0,180,3,67,0, -180,3,102,0,180, -3,75,0,180,3, -48,0,180,3,110, -0,180,3,83,0, -180,3,56,0,180, -3,118,0,180,3, -99,0,180,3,72, -0,180,3,107,0, -180,3,80,0,180, -3,53,0,180,3, -115,0,180,3,88, -0,180,3,69,0, -180,3,104,0,180, -3,77,0,180,3, -50,0,180,3,112, -0,180,3,85,0, -180,3,120,0,180, -3,66,0,180,3, -101,0,180,3,74, -0,180,3,109,0, -1357,12,1,27178,1358, -5,63,3,97,0, -1359,12,1,27245,1360, -5,63,3,97,0, -180,3,70,0,180, -3,105,0,1361,12, -1,27313,1362,5,63, -3,97,0,180,3, -70,0,180,3,105, -0,180,3,78,0, -180,3,51,0,180, -3,113,0,180,3, -86,0,180,3,121, -0,180,3,67,0, -180,3,102,0,180, -3,75,0,180,3, -48,0,180,3,110, -0,180,3,83,0, -180,3,56,0,180, -3,118,0,180,3, -99,0,180,3,72, -0,180,3,107,0, -180,3,80,0,180, -3,53,0,180,3, -115,0,180,3,88, -0,180,3,69,0, -180,3,104,0,180, -3,77,0,180,3, -50,0,180,3,112, -0,180,3,85,0, -180,3,120,0,180, -3,66,0,180,3, -101,0,180,3,74, -0,180,3,109,0, -180,3,82,0,180, -3,55,0,180,3, -117,0,180,3,90, -0,180,3,98,0, -180,3,71,0,180, -3,106,0,180,3, -79,0,180,3,52, -0,180,3,114,0, -180,3,87,0,180, -3,122,0,180,3, -95,0,180,3,68, -0,180,3,103,0, -180,3,76,0,180, -3,49,0,180,3, -111,0,180,3,84, -0,180,3,57,0, -180,3,119,0,180, -3,65,0,180,3, -100,0,180,3,73, -0,180,3,108,0, -1363,12,1,27404,1364, -5,63,3,97,0, -180,3,70,0,180, -3,105,0,180,3, -78,0,180,3,51, -0,180,3,113,0, -180,3,86,0,180, -3,121,0,180,3, -67,0,180,3,102, -0,180,3,75,0, -180,3,48,0,180, -3,110,0,180,3, -83,0,180,3,56, -0,180,3,118,0, -180,3,99,0,180, -3,72,0,180,3, -107,0,180,3,80, -0,180,3,53,0, -180,3,115,0,180, -3,88,0,180,3, -69,0,180,3,104, -0,180,3,77,0, -180,3,50,0,180, -3,112,0,180,3, -85,0,180,3,120, -0,180,3,66,0, -180,3,101,0,180, -3,74,0,180,3, -109,0,180,3,82, -0,180,3,55,0, -180,3,117,0,180, -3,90,0,180,3, -98,0,180,3,71, -0,180,3,106,0, -180,3,79,0,180, -3,52,0,180,3, -114,0,180,3,87, -0,180,3,122,0, -180,3,95,0,180, -3,68,0,180,3, -103,0,180,3,76, -0,180,3,49,0, -180,3,111,0,180, -3,84,0,180,3, -57,0,180,3,119, -0,180,3,65,0, -180,3,100,0,180, -3,73,0,180,3, -108,0,180,3,81, -0,180,3,54,0, -180,3,116,0,180, -3,89,0,180,1365, -11,1,475,0,1366, -4,22,69,0,77, -0,65,0,73,0, -76,0,95,0,69, -0,86,0,69,0, -78,0,84,0,1, --1,3,81,0,180, -3,54,0,180,3, -116,0,180,3,89, -0,180,1367,11,1, -867,0,183,1,-1, -3,78,0,180,3, -51,0,180,3,113, -0,180,3,86,0, -180,3,121,0,180, -3,67,0,180,3, -102,0,180,3,75, -0,180,3,48,0, -180,3,110,0,180, -3,83,0,180,3, -56,0,180,3,118, -0,180,3,99,0, -180,3,72,0,180, -3,107,0,180,3, -80,0,180,3,53, -0,180,3,115,0, -180,3,88,0,180, -3,69,0,180,3, -104,0,180,3,77, -0,180,3,50,0, -180,3,112,0,180, -3,85,0,180,3, -120,0,180,3,66, -0,180,3,101,0, -180,3,74,0,180, -3,109,0,180,3, -82,0,180,3,55, -0,180,3,117,0, -180,3,90,0,180, -3,98,0,180,3, -71,0,180,3,106, -0,180,3,79,0, -180,3,52,0,180, -3,114,0,180,3, -87,0,180,3,122, -0,180,3,95,0, -180,3,68,0,180, -3,103,0,180,3, -76,0,180,3,49, -0,180,3,111,0, -180,3,84,0,180, -3,57,0,180,3, -119,0,180,3,65, -0,180,3,100,0, -180,3,73,0,180, -3,108,0,180,3, -81,0,180,3,54, -0,180,3,116,0, -180,3,89,0,180, -1368,11,1,867,0, -183,1,-1,3,70, -0,180,3,105,0, -180,3,78,0,180, -3,51,0,180,3, -113,0,180,3,86, -0,180,3,121,0, -180,3,67,0,180, -3,102,0,180,3, -75,0,180,3,48, -0,180,3,110,0, -180,3,83,0,180, -3,56,0,180,3, -118,0,180,3,99, -0,180,3,72,0, -180,3,107,0,180, -3,80,0,180,3, -53,0,180,3,115, -0,180,3,88,0, -180,3,69,0,180, -3,104,0,180,3, -77,0,180,3,50, -0,180,3,112,0, -180,3,85,0,180, -3,120,0,180,3, -66,0,180,3,101, -0,180,3,74,0, -180,3,109,0,180, -3,82,0,180,3, -55,0,180,3,117, -0,180,3,90,0, -180,3,98,0,180, -3,71,0,180,3, -106,0,180,3,79, -0,180,3,52,0, -180,3,114,0,180, -3,87,0,180,3, -122,0,180,3,95, -0,180,3,68,0, -180,3,103,0,180, -3,76,0,180,3, -49,0,180,3,111, -0,180,3,84,0, -180,3,57,0,180, -3,119,0,180,3, -65,0,180,3,100, -0,180,3,73,0, -180,3,108,0,180, -3,81,0,180,3, -54,0,180,3,116, -0,180,3,89,0, -180,1369,11,1,867, -0,183,1,-1,3, -82,0,180,3,55, -0,180,3,117,0, -180,3,90,0,180, -3,98,0,180,3, -71,0,180,3,106, -0,180,3,79,0, -180,3,52,0,180, -3,114,0,180,3, -87,0,180,3,122, -0,180,3,95,0, -180,3,68,0,180, -3,103,0,180,3, -76,0,180,3,49, -0,180,3,111,0, -180,3,84,0,180, -3,57,0,180,3, -119,0,180,3,65, -0,180,3,100,0, -180,3,73,0,180, -3,108,0,1370,12, -1,27668,1371,5,63, -3,97,0,180,3, -70,0,180,3,105, -0,180,3,78,0, -180,3,51,0,180, -3,113,0,180,3, -86,0,180,3,121, -0,180,3,67,0, -180,3,102,0,180, -3,75,0,180,3, -48,0,180,3,110, -0,180,3,83,0, -180,3,56,0,180, -3,118,0,180,3, -99,0,180,3,72, -0,180,3,107,0, -180,3,80,0,180, -3,53,0,180,3, -115,0,1372,12,1, -27744,1373,5,63,3, -97,0,180,3,70, -0,180,3,105,0, -180,3,78,0,180, -3,51,0,180,3, -113,0,180,3,86, -0,180,3,121,0, -180,3,67,0,180, -3,102,0,180,3, -75,0,180,3,48, -0,180,3,110,0, -180,3,83,0,180, -3,56,0,180,3, -118,0,180,3,99, -0,180,3,72,0, -180,3,107,0,180, -3,80,0,180,3, -53,0,180,3,115, -0,180,3,88,0, -180,3,69,0,180, -3,104,0,180,3, -77,0,180,3,50, -0,180,3,112,0, -180,3,85,0,180, -3,120,0,180,3, -66,0,180,3,101, -0,1374,12,1,27824, -1375,5,63,3,97, -0,180,3,70,0, -180,3,105,0,180, -3,78,0,180,3, -51,0,180,3,113, -0,180,3,86,0, -180,3,121,0,180, -3,67,0,180,3, -102,0,180,3,75, -0,180,3,48,0, -180,3,110,0,180, -3,83,0,180,3, -56,0,180,3,118, -0,180,3,99,0, -180,3,72,0,180, -3,107,0,180,3, -80,0,180,3,53, -0,180,3,115,0, -180,3,88,0,180, -3,69,0,180,3, -104,0,180,3,77, -0,180,3,50,0, -180,3,112,0,180, -3,85,0,180,3, -120,0,180,3,66, -0,180,3,101,0, -180,3,74,0,180, -3,109,0,180,3, -82,0,180,3,55, -0,180,3,117,0, -180,3,90,0,180, -3,98,0,180,3, -71,0,180,3,106, -0,180,3,79,0, -180,3,52,0,180, -3,114,0,180,3, -87,0,180,3,122, -0,180,3,95,0, -180,3,68,0,180, -3,103,0,180,3, -76,0,180,3,49, -0,180,3,111,0, -180,3,84,0,180, -3,57,0,180,3, -119,0,180,3,65, -0,180,3,100,0, -180,3,73,0,180, -3,108,0,180,3, -81,0,180,3,54, -0,180,3,116,0, -180,3,89,0,180, -1376,11,1,215,0, -1377,4,8,69,0, -76,0,83,0,69, -0,1,-1,3,74, -0,180,3,109,0, -180,3,82,0,180, -3,55,0,180,3, -117,0,180,3,90, -0,180,3,98,0, -180,3,71,0,180, -3,106,0,180,3, -79,0,180,3,52, -0,180,3,114,0, -180,3,87,0,180, -3,122,0,180,3, -95,0,180,3,68, -0,180,3,103,0, -180,3,76,0,180, -3,49,0,180,3, -111,0,180,3,84, -0,180,3,57,0, -180,3,119,0,180, -3,65,0,180,3, -100,0,180,3,73, -0,180,3,108,0, -180,3,81,0,180, -3,54,0,180,3, -116,0,180,3,89, -0,180,1378,11,1, -867,0,183,1,-1, -3,88,0,180,3, -69,0,180,3,104, -0,180,3,77,0, -180,3,50,0,180, -3,112,0,180,3, -85,0,180,3,120, -0,180,3,66,0, -180,3,101,0,180, -3,74,0,180,3, -109,0,180,3,82, -0,180,3,55,0, -180,3,117,0,180, -3,90,0,180,3, -98,0,180,3,71, -0,180,3,106,0, -180,3,79,0,180, -3,52,0,180,3, -114,0,180,3,87, -0,180,3,122,0, -180,3,95,0,180, -3,68,0,180,3, -103,0,180,3,76, -0,180,3,49,0, -180,3,111,0,180, -3,84,0,180,3, -57,0,180,3,119, -0,180,3,65,0, -180,3,100,0,180, -3,73,0,180,3, -108,0,180,3,81, -0,180,3,54,0, -180,3,116,0,180, -3,89,0,180,1379, -11,1,867,0,183, -1,-1,3,81,0, -180,3,54,0,180, -3,116,0,180,3, -89,0,180,1380,11, -1,867,0,183,1, --1,3,61,0,1381, -12,1,3985,1382,5, -1,3,61,0,1383, -12,1,3993,1384,5, -0,1385,11,1,136, -0,1386,4,26,69, -0,81,0,85,0, -65,0,76,0,83, -0,95,0,69,0, -81,0,85,0,65, -0,76,0,83,0, -1,-1,1387,11,1, -66,0,1388,4,12, -69,0,81,0,85, -0,65,0,76,0, -83,0,1,-1,3, -98,0,178,3,95, -0,178,3,55,0, -647,3,52,0,647, -3,89,0,178,3, -49,0,647,3,9, -0,672,3,126,0, -1389,12,1,3864,1390, -5,0,1391,11,1, -175,0,1392,4,10, -84,0,73,0,76, -0,68,0,69,0, -1,-1,3,86,0, -178,3,46,0,1393, -12,1,5674,1394,5, -14,3,48,0,651, -3,70,0,653,3, -55,0,651,3,51, -0,651,3,69,0, -657,3,54,0,651, -3,102,0,653,3, -50,0,651,3,57, -0,651,3,53,0, -651,3,101,0,657, -3,49,0,651,3, -56,0,651,3,52, -0,651,1395,11,1, -111,0,1396,4,12, -80,0,69,0,82, -0,73,0,79,0, -68,0,1,-1,3, -123,0,1397,12,1, -7726,1398,5,0,1399, -11,1,51,0,1400, -4,20,76,0,69, -0,70,0,84,0, -95,0,66,0,82, -0,65,0,67,0, -69,0,1,-1,3, -83,0,178,3,43, -0,1401,12,1,4226, -1402,5,2,3,61, -0,1403,12,1,4234, -1404,5,0,1405,11, -1,16,0,1406,4, -22,80,0,76,0, -85,0,83,0,95, -0,69,0,81,0, -85,0,65,0,76, -0,83,0,1,-1, -3,43,0,1407,12, -1,4355,1408,5,0, -1409,11,1,2,0, -1410,4,18,73,0, -78,0,67,0,82, -0,69,0,77,0, -69,0,78,0,84, -0,1,-1,1411,11, -1,81,0,1412,4, -8,80,0,76,0, -85,0,83,0,1, --1,3,120,0,178, -3,80,0,178,3, -40,0,1413,12,1, -7848,1414,5,0,1415, -11,1,71,0,1416, -4,20,76,0,69, -0,70,0,84,0, -95,0,80,0,65, -0,82,0,69,0, -78,0,1,-1,0, -165,1,-1,1417,4, -12,83,0,84,0, -82,0,73,0,78, -0,71,0,1418,12, -1,1095,1419,5,119, -3,238,22,1420,12, -1,1096,1421,5,0, -1422,11,1,968,0, -165,1,-1,3,117, -0,1420,3,63,32, -1420,3,37,0,1420, -3,114,0,1420,3, -74,0,1420,3,34, -0,1423,12,1,1836, -1424,5,0,1425,11, -1,1032,0,165,1, --1,3,111,0,1420, -3,71,0,1420,3, -108,0,1420,3,68, -0,1420,3,105,0, -1420,3,65,0,1420, -3,102,0,1420,3, -62,0,1420,3,99, -0,1420,3,59,0, -1420,3,96,0,1420, -3,96,6,1420,3, -173,0,1420,3,93, -0,1420,3,53,0, -1420,3,13,0,1420, -3,170,0,1420,3, -90,0,1420,3,50, -0,1420,3,10,0, -1426,12,1,1975,1427, -5,0,1428,11,1, -974,0,165,1,-1, -3,87,0,1420,3, -47,0,1420,3,100, -0,1420,3,124,0, -1420,3,84,0,1420, -3,44,0,1420,3, -121,0,1420,3,81, -0,1420,3,41,0, -1420,3,1,0,1420, -3,59,15,1420,3, -78,0,1420,3,38, -0,1420,3,58,15, -1420,3,115,0,1420, -3,75,0,1420,3, -35,0,1420,3,192, -0,1420,3,112,0, -1420,3,72,0,1420, -3,32,0,1420,3, -109,0,1420,3,69, -0,1420,3,187,1, -1420,3,106,0,1420, -3,66,0,1420,3, -103,0,1420,3,77, -0,1420,3,3,9, -1420,3,118,0,1420, -3,60,0,1420,3, -0,3,1420,3,197, -1,1420,3,176,2, -1420,3,57,0,1420, -3,70,0,1420,3, -94,0,1420,3,54, -0,1420,3,171,0, -1420,3,91,0,1420, -3,51,0,1420,3, -88,0,1420,3,48, -0,1420,3,125,0, -1420,3,85,0,1420, -3,56,0,1420,3, -97,0,1420,3,122, -0,1420,3,82,0, -1420,3,42,0,1420, -3,0,6,1420,3, -119,0,1420,3,79, -0,1420,3,41,32, -1420,3,116,0,1420, -3,76,0,1420,3, -36,0,1420,3,113, -0,1420,3,73,0, -1420,3,33,0,1420, -3,110,0,1420,3, -40,32,1420,3,0, -224,1420,3,187,0, -1420,3,107,0,1420, -3,67,0,1420,3, -104,0,1420,3,64, -0,1420,3,101,0, -1420,3,61,0,1420, -3,178,0,1420,3, -98,0,1420,3,45, -0,1420,3,136,4, -1420,3,95,0,1420, -3,55,0,1420,3, -172,0,1420,3,92, -0,1429,12,1,1229, -1430,5,4,3,116, -0,1431,12,1,1682, -1432,5,0,1433,11, -1,991,0,165,1, --1,3,34,0,1434, -12,1,1370,1435,5, -0,1436,11,1,1003, -0,165,1,-1,3, -92,0,1437,12,1, -1243,1438,5,0,1439, -11,1,1015,0,165, -1,-1,3,110,0, -1440,12,1,1541,1441, -5,0,1442,11,1, -979,0,165,1,-1, -1443,11,1,1027,0, -165,1,-1,3,52, -0,1420,3,89,0, -1420,3,49,0,1420, -3,9,0,1420,3, -126,0,1420,3,86, -0,1420,3,46,0, -1420,3,123,0,1420, -3,83,0,1420,3, -43,0,1420,3,160, -0,1420,3,120,0, -1420,3,80,0,1420, -3,40,0,1420,0, -165,1,-1,1444,5, -94,844,1445,10,844, -1,76,1400,1446,10, -1400,1,12,1043,1447, -10,1043,1,7,671, -1448,10,671,1,28, -1366,1449,10,1366,1, -67,1338,1450,10,1338, -1,68,1451,4,30, -83,0,84,0,82, -0,73,0,78,0, -71,0,95,0,67, -0,79,0,78,0, -83,0,84,0,65, -0,78,0,84,0, -1452,10,1451,1,3, -1396,1453,10,1396,1, -24,856,1454,10,856, -1,75,192,1455,10, -192,1,22,944,1456, -10,944,1,25,707, -1457,10,707,1,17, -972,1458,10,972,1, -58,1416,1459,10,1416, -1,16,234,1460,10, -234,1,50,585,1461, -10,585,1,65,1272, -1462,10,1272,1,79, -732,1463,10,732,1, -38,1211,1464,10,1211, -1,77,617,1465,10, -617,1,64,820,1466, -10,820,1,74,938, -1467,10,938,1,31, -509,1468,10,509,1, -51,1179,1469,10,1179, -1,88,1320,1470,10, -1320,1,91,1057,1471, -10,1057,1,20,1037, -1472,10,1037,1,13, -1406,1473,10,1406,1, -6,1055,1474,10,1055, -1,8,464,1475,10, -464,1,72,495,1476, -10,495,1,42,1020, -1477,10,1020,1,35, -774,1478,10,774,1, -85,785,1479,10,785, -1,86,791,1480,10, -791,1,48,1354,1481, -10,1354,1,23,1249, -1482,10,1249,1,78, -548,1483,10,548,1, -41,699,1484,10,699, -1,34,667,1485,10, -667,1,94,1410,1486, -10,1410,1,4,1174, -1487,10,1174,1,90, -646,1488,10,646,1, -11,566,1489,10,566, -1,61,922,1490,10, -922,1,47,1085,1491, -10,1085,1,87,190, -1492,10,190,1,10, -1124,1493,10,1124,1, -92,1386,1494,10,1386, -1,29,734,1495,10, -734,1,33,216,1496, -10,216,1,82,486, -1497,10,486,1,57, -803,1498,10,803,1, -53,1032,1499,10,1032, -1,95,1292,1500,10, -1292,1,54,995,1501, -10,995,1,59,1189, -1502,10,1189,1,30, -1024,1503,10,1024,1, -27,1388,1504,10,1388, -1,15,1162,1505,10, -1162,1,89,875,1506, -10,875,1,49,278, -1507,10,278,1,83, -411,1508,10,411,1, -71,900,1509,10,900, -1,66,1047,1510,10, -1047,1,5,1191,1511, -10,1191,1,37,336, -1512,10,336,1,81, -544,1513,10,544,1, -32,656,1514,10,656, -1,96,423,1515,10, -423,1,70,691,1516, -10,691,1,21,428, -1517,10,428,1,69, -1069,1518,10,1069,1, -45,312,1519,10,312, -1,56,634,1520,10, -634,1,62,680,1521, -10,680,1,9,534, -1522,10,534,1,52, -942,1523,10,942,1, -40,1392,1524,10,1392, -1,36,360,1525,10, -360,1,80,703,1526, -10,703,1,14,523, -1527,10,523,1,46, -748,1528,10,748,1, -84,183,1529,10,183, -1,93,1377,1530,10, -1377,1,43,721,1531, -10,721,1,55,697, -1532,10,697,1,39, -1412,1533,10,1412,1, -18,1011,1534,10,1011, -1,60,629,1535,10, -629,1,63,550,1536, -10,550,1,26,1049, -1537,10,1049,1,19, -931,1538,10,931,1, -44,483,1539,10,483, -1,73,1540,5,0,0}; - new Tfactory(this,"MOVING_START_EVENT",new TCreator(MOVING_START_EVENT_factory)); - new Tfactory(this,"LEFT_BRACE",new TCreator(LEFT_BRACE_factory)); - new Tfactory(this,"MINUS_EQUALS",new TCreator(MINUS_EQUALS_factory)); - new Tfactory(this,"RIGHT_BRACKET",new TCreator(RIGHT_BRACKET_factory)); - new Tfactory(this,"EMAIL_EVENT",new TCreator(EMAIL_EVENT_factory)); - new Tfactory(this,"HTTP_RESPONSE_EVENT",new TCreator(HTTP_RESPONSE_EVENT_factory)); - new Tfactory(this,"STRING_CONSTANT",new TCreator(STRING_CONSTANT_factory)); - new Tfactory(this,"PERIOD",new TCreator(PERIOD_factory)); - new Tfactory(this,"MOVING_END_EVENT",new TCreator(MOVING_END_EVENT_factory)); - new Tfactory(this,"PERCENT",new TCreator(PERCENT_factory)); - new Tfactory(this,"LEFT_ANGLE",new TCreator(LEFT_ANGLE_factory)); - new Tfactory(this,"RIGHT_PAREN",new TCreator(RIGHT_PAREN_factory)); - new Tfactory(this,"AT_ROT_TARGET_EVENT",new TCreator(AT_ROT_TARGET_EVENT_factory)); - new Tfactory(this,"LEFT_PAREN",new TCreator(LEFT_PAREN_factory)); - new Tfactory(this,"RETURN",new TCreator(RETURN_factory)); - new Tfactory(this,"CONTROL_EVENT",new TCreator(CONTROL_EVENT_factory)); - new Tfactory(this,"NOT_AT_TARGET_EVENT",new TCreator(NOT_AT_TARGET_EVENT_factory)); - new Tfactory(this,"AMP_AMP",new TCreator(AMP_AMP_factory)); - new Tfactory(this,"NO_SENSOR_EVENT",new TCreator(NO_SENSOR_EVENT_factory)); - new Tfactory(this,"COLLISION_START_EVENT",new TCreator(COLLISION_START_EVENT_factory)); - new Tfactory(this,"MONEY_EVENT",new TCreator(MONEY_EVENT_factory)); - new Tfactory(this,"LESS_EQUALS",new TCreator(LESS_EQUALS_factory)); - new Tfactory(this,"INTEGER_TYPE",new TCreator(INTEGER_TYPE_factory)); - new Tfactory(this,"TOUCH_EVENT",new TCreator(TOUCH_EVENT_factory)); - new Tfactory(this,"HTTP_REQUEST_EVENT",new TCreator(HTTP_REQUEST_EVENT_factory)); - new Tfactory(this,"STAR",new TCreator(STAR_factory)); - new Tfactory(this,"RIGHT_BRACE",new TCreator(RIGHT_BRACE_factory)); - new Tfactory(this,"PLUS_EQUALS",new TCreator(PLUS_EQUALS_factory)); - new Tfactory(this,"STAR_EQUALS",new TCreator(STAR_EQUALS_factory)); - new Tfactory(this,"LINK_MESSAGE_EVENT",new TCreator(LINK_MESSAGE_EVENT_factory)); - new Tfactory(this,"IF",new TCreator(IF_factory)); - new Tfactory(this,"CARET",new TCreator(CARET_factory)); - new Tfactory(this,"STATE_ENTRY_EVENT",new TCreator(STATE_ENTRY_EVENT_factory)); - new Tfactory(this,"STATE_EXIT_EVENT",new TCreator(STATE_EXIT_EVENT_factory)); - new Tfactory(this,"STATE",new TCreator(STATE_factory)); - new Tfactory(this,"AT",new TCreator(AT_factory)); - new Tfactory(this,"NOT_AT_ROT_TARGET_EVENT",new TCreator(NOT_AT_ROT_TARGET_EVENT_factory)); - new Tfactory(this,"RIGHT_SHIFT",new TCreator(RIGHT_SHIFT_factory)); - new Tfactory(this,"STROKE",new TCreator(STROKE_factory)); - new Tfactory(this,"INTEGER_CONSTANT",new TCreator(INTEGER_CONSTANT_factory)); - new Tfactory(this,"INCREMENT",new TCreator(INCREMENT_factory)); - new Tfactory(this,"TOUCH_END_EVENT",new TCreator(TOUCH_END_EVENT_factory)); - new Tfactory(this,"SEMICOLON",new TCreator(SEMICOLON_factory)); - new Tfactory(this,"CHANGED_EVENT",new TCreator(CHANGED_EVENT_factory)); - new Tfactory(this,"DEFAULT_STATE",new TCreator(DEFAULT_STATE_factory)); - new Tfactory(this,"TIMER_EVENT",new TCreator(TIMER_EVENT_factory)); - new Tfactory(this,"PERCENT_EQUALS",new TCreator(PERCENT_EQUALS_factory)); - new Tfactory(this,"TRANSACTION_RESULT_EVENT",new TCreator(TRANSACTION_RESULT_EVENT_factory)); - new Tfactory(this,"EQUALS_EQUALS",new TCreator(EQUALS_EQUALS_factory)); - new Tfactory(this,"AMP",new TCreator(AMP_factory)); - new Tfactory(this,"REMOTE_DATA_EVENT",new TCreator(REMOTE_DATA_EVENT_factory)); - new Tfactory(this,"LIST_TYPE",new TCreator(LIST_TYPE_factory)); - new Tfactory(this,"STRING_TYPE",new TCreator(STRING_TYPE_factory)); - new Tfactory(this,"HEX_INTEGER_CONSTANT",new TCreator(HEX_INTEGER_CONSTANT_factory)); - new Tfactory(this,"KEY_TYPE",new TCreator(KEY_TYPE_factory)); - new Tfactory(this,"AT_TARGET_EVENT",new TCreator(AT_TARGET_EVENT_factory)); - new Tfactory(this,"EXCLAMATION_EQUALS",new TCreator(EXCLAMATION_EQUALS_factory)); - new Tfactory(this,"LEFT_BRACKET",new TCreator(LEFT_BRACKET_factory)); - new Tfactory(this,"EQUALS",new TCreator(EQUALS_factory)); - new Tfactory(this,"TOUCH_START_EVENT",new TCreator(TOUCH_START_EVENT_factory)); - new Tfactory(this,"JUMP",new TCreator(JUMP_factory)); - new Tfactory(this,"RUN_TIME_PERMISSIONS_EVENT",new TCreator(RUN_TIME_PERMISSIONS_EVENT_factory)); - new Tfactory(this,"LAND_COLLISION_START_EVENT",new TCreator(LAND_COLLISION_START_EVENT_factory)); - new Tfactory(this,"DATASERVER_EVENT",new TCreator(DATASERVER_EVENT_factory)); - new Tfactory(this,"DECREMENT",new TCreator(DECREMENT_factory)); - new Tfactory(this,"EXCLAMATION",new TCreator(EXCLAMATION_factory)); - new Tfactory(this,"ON_REZ_EVENT",new TCreator(ON_REZ_EVENT_factory)); - new Tfactory(this,"GREATER_EQUALS",new TCreator(GREATER_EQUALS_factory)); - new Tfactory(this,"FLOAT_CONSTANT",new TCreator(FLOAT_CONSTANT_factory)); - new Tfactory(this,"LAND_COLLISION_END_EVENT",new TCreator(LAND_COLLISION_END_EVENT_factory)); - new Tfactory(this,"SLASH",new TCreator(SLASH_factory)); - new Tfactory(this,"LAND_COLLISION_EVENT",new TCreator(LAND_COLLISION_EVENT_factory)); - new Tfactory(this,"WHILE",new TCreator(WHILE_factory)); - new Tfactory(this,"ROTATION_TYPE",new TCreator(ROTATION_TYPE_factory)); - new Tfactory(this,"COLLISION_EVENT",new TCreator(COLLISION_EVENT_factory)); - new Tfactory(this,"SLASH_EQUALS",new TCreator(SLASH_EQUALS_factory)); - new Tfactory(this,"FLOAT_TYPE",new TCreator(FLOAT_TYPE_factory)); - new Tfactory(this,"LEFT_SHIFT",new TCreator(LEFT_SHIFT_factory)); - new Tfactory(this,"TILDE",new TCreator(TILDE_factory)); - new Tfactory(this,"OBJECT_REZ_EVENT",new TCreator(OBJECT_REZ_EVENT_factory)); - new Tfactory(this,"COMMA",new TCreator(COMMA_factory)); - new Tfactory(this,"FOR",new TCreator(FOR_factory)); - new Tfactory(this,"SENSOR_EVENT",new TCreator(SENSOR_EVENT_factory)); - new Tfactory(this,"IDENT",new TCreator(IDENT_factory)); - new Tfactory(this,"ELSE",new TCreator(ELSE_factory)); - new Tfactory(this,"VECTOR_TYPE",new TCreator(VECTOR_TYPE_factory)); - new Tfactory(this,"STROKE_STROKE",new TCreator(STROKE_STROKE_factory)); - new Tfactory(this,"PLUS",new TCreator(PLUS_factory)); - new Tfactory(this,"ATTACH_EVENT",new TCreator(ATTACH_EVENT_factory)); - new Tfactory(this,"COLLISION_END_EVENT",new TCreator(COLLISION_END_EVENT_factory)); - new Tfactory(this,"RIGHT_ANGLE",new TCreator(RIGHT_ANGLE_factory)); - new Tfactory(this,"MINUS",new TCreator(MINUS_factory)); - new Tfactory(this,"DO",new TCreator(DO_factory)); - new Tfactory(this,"LISTEN_EVENT",new TCreator(LISTEN_EVENT_factory)); -} -public static object MOVING_START_EVENT_factory(Lexer yyl) { return new MOVING_START_EVENT(yyl);} -public static object LEFT_BRACE_factory(Lexer yyl) { return new LEFT_BRACE(yyl);} -public static object MINUS_EQUALS_factory(Lexer yyl) { return new MINUS_EQUALS(yyl);} -public static object RIGHT_BRACKET_factory(Lexer yyl) { return new RIGHT_BRACKET(yyl);} -public static object EMAIL_EVENT_factory(Lexer yyl) { return new EMAIL_EVENT(yyl);} -public static object HTTP_RESPONSE_EVENT_factory(Lexer yyl) { return new HTTP_RESPONSE_EVENT(yyl);} -public static object STRING_CONSTANT_factory(Lexer yyl) { return new STRING_CONSTANT(yyl);} -public static object PERIOD_factory(Lexer yyl) { return new PERIOD(yyl);} -public static object MOVING_END_EVENT_factory(Lexer yyl) { return new MOVING_END_EVENT(yyl);} -public static object PERCENT_factory(Lexer yyl) { return new PERCENT(yyl);} -public static object LEFT_ANGLE_factory(Lexer yyl) { return new LEFT_ANGLE(yyl);} -public static object RIGHT_PAREN_factory(Lexer yyl) { return new RIGHT_PAREN(yyl);} -public static object AT_ROT_TARGET_EVENT_factory(Lexer yyl) { return new AT_ROT_TARGET_EVENT(yyl);} -public static object LEFT_PAREN_factory(Lexer yyl) { return new LEFT_PAREN(yyl);} -public static object RETURN_factory(Lexer yyl) { return new RETURN(yyl);} -public static object CONTROL_EVENT_factory(Lexer yyl) { return new CONTROL_EVENT(yyl);} -public static object NOT_AT_TARGET_EVENT_factory(Lexer yyl) { return new NOT_AT_TARGET_EVENT(yyl);} -public static object AMP_AMP_factory(Lexer yyl) { return new AMP_AMP(yyl);} -public static object NO_SENSOR_EVENT_factory(Lexer yyl) { return new NO_SENSOR_EVENT(yyl);} -public static object COLLISION_START_EVENT_factory(Lexer yyl) { return new COLLISION_START_EVENT(yyl);} -public static object MONEY_EVENT_factory(Lexer yyl) { return new MONEY_EVENT(yyl);} -public static object LESS_EQUALS_factory(Lexer yyl) { return new LESS_EQUALS(yyl);} -public static object INTEGER_TYPE_factory(Lexer yyl) { return new INTEGER_TYPE(yyl);} -public static object TOUCH_EVENT_factory(Lexer yyl) { return new TOUCH_EVENT(yyl);} -public static object HTTP_REQUEST_EVENT_factory(Lexer yyl) { return new HTTP_REQUEST_EVENT(yyl);} -public static object STAR_factory(Lexer yyl) { return new STAR(yyl);} -public static object RIGHT_BRACE_factory(Lexer yyl) { return new RIGHT_BRACE(yyl);} -public static object PLUS_EQUALS_factory(Lexer yyl) { return new PLUS_EQUALS(yyl);} -public static object STAR_EQUALS_factory(Lexer yyl) { return new STAR_EQUALS(yyl);} -public static object LINK_MESSAGE_EVENT_factory(Lexer yyl) { return new LINK_MESSAGE_EVENT(yyl);} -public static object IF_factory(Lexer yyl) { return new IF(yyl);} -public static object CARET_factory(Lexer yyl) { return new CARET(yyl);} -public static object STATE_ENTRY_EVENT_factory(Lexer yyl) { return new STATE_ENTRY_EVENT(yyl);} -public static object STATE_EXIT_EVENT_factory(Lexer yyl) { return new STATE_EXIT_EVENT(yyl);} -public static object STATE_factory(Lexer yyl) { return new STATE(yyl);} -public static object AT_factory(Lexer yyl) { return new AT(yyl);} -public static object NOT_AT_ROT_TARGET_EVENT_factory(Lexer yyl) { return new NOT_AT_ROT_TARGET_EVENT(yyl);} -public static object RIGHT_SHIFT_factory(Lexer yyl) { return new RIGHT_SHIFT(yyl);} -public static object STROKE_factory(Lexer yyl) { return new STROKE(yyl);} -public static object INTEGER_CONSTANT_factory(Lexer yyl) { return new INTEGER_CONSTANT(yyl);} -public static object INCREMENT_factory(Lexer yyl) { return new INCREMENT(yyl);} -public static object TOUCH_END_EVENT_factory(Lexer yyl) { return new TOUCH_END_EVENT(yyl);} -public static object SEMICOLON_factory(Lexer yyl) { return new SEMICOLON(yyl);} -public static object CHANGED_EVENT_factory(Lexer yyl) { return new CHANGED_EVENT(yyl);} -public static object DEFAULT_STATE_factory(Lexer yyl) { return new DEFAULT_STATE(yyl);} -public static object TIMER_EVENT_factory(Lexer yyl) { return new TIMER_EVENT(yyl);} -public static object PERCENT_EQUALS_factory(Lexer yyl) { return new PERCENT_EQUALS(yyl);} -public static object TRANSACTION_RESULT_EVENT_factory(Lexer yyl) { return new TRANSACTION_RESULT_EVENT(yyl);} -public static object EQUALS_EQUALS_factory(Lexer yyl) { return new EQUALS_EQUALS(yyl);} -public static object AMP_factory(Lexer yyl) { return new AMP(yyl);} -public static object REMOTE_DATA_EVENT_factory(Lexer yyl) { return new REMOTE_DATA_EVENT(yyl);} -public static object LIST_TYPE_factory(Lexer yyl) { return new LIST_TYPE(yyl);} -public static object STRING_TYPE_factory(Lexer yyl) { return new STRING_TYPE(yyl);} -public static object HEX_INTEGER_CONSTANT_factory(Lexer yyl) { return new HEX_INTEGER_CONSTANT(yyl);} -public static object KEY_TYPE_factory(Lexer yyl) { return new KEY_TYPE(yyl);} -public static object AT_TARGET_EVENT_factory(Lexer yyl) { return new AT_TARGET_EVENT(yyl);} -public static object EXCLAMATION_EQUALS_factory(Lexer yyl) { return new EXCLAMATION_EQUALS(yyl);} -public static object LEFT_BRACKET_factory(Lexer yyl) { return new LEFT_BRACKET(yyl);} -public static object EQUALS_factory(Lexer yyl) { return new EQUALS(yyl);} -public static object TOUCH_START_EVENT_factory(Lexer yyl) { return new TOUCH_START_EVENT(yyl);} -public static object JUMP_factory(Lexer yyl) { return new JUMP(yyl);} -public static object RUN_TIME_PERMISSIONS_EVENT_factory(Lexer yyl) { return new RUN_TIME_PERMISSIONS_EVENT(yyl);} -public static object LAND_COLLISION_START_EVENT_factory(Lexer yyl) { return new LAND_COLLISION_START_EVENT(yyl);} -public static object DATASERVER_EVENT_factory(Lexer yyl) { return new DATASERVER_EVENT(yyl);} -public static object DECREMENT_factory(Lexer yyl) { return new DECREMENT(yyl);} -public static object EXCLAMATION_factory(Lexer yyl) { return new EXCLAMATION(yyl);} -public static object ON_REZ_EVENT_factory(Lexer yyl) { return new ON_REZ_EVENT(yyl);} -public static object GREATER_EQUALS_factory(Lexer yyl) { return new GREATER_EQUALS(yyl);} -public static object FLOAT_CONSTANT_factory(Lexer yyl) { return new FLOAT_CONSTANT(yyl);} -public static object LAND_COLLISION_END_EVENT_factory(Lexer yyl) { return new LAND_COLLISION_END_EVENT(yyl);} -public static object SLASH_factory(Lexer yyl) { return new SLASH(yyl);} -public static object LAND_COLLISION_EVENT_factory(Lexer yyl) { return new LAND_COLLISION_EVENT(yyl);} -public static object WHILE_factory(Lexer yyl) { return new WHILE(yyl);} -public static object ROTATION_TYPE_factory(Lexer yyl) { return new ROTATION_TYPE(yyl);} -public static object COLLISION_EVENT_factory(Lexer yyl) { return new COLLISION_EVENT(yyl);} -public static object SLASH_EQUALS_factory(Lexer yyl) { return new SLASH_EQUALS(yyl);} -public static object FLOAT_TYPE_factory(Lexer yyl) { return new FLOAT_TYPE(yyl);} -public static object LEFT_SHIFT_factory(Lexer yyl) { return new LEFT_SHIFT(yyl);} -public static object TILDE_factory(Lexer yyl) { return new TILDE(yyl);} -public static object OBJECT_REZ_EVENT_factory(Lexer yyl) { return new OBJECT_REZ_EVENT(yyl);} -public static object COMMA_factory(Lexer yyl) { return new COMMA(yyl);} -public static object FOR_factory(Lexer yyl) { return new FOR(yyl);} -public static object SENSOR_EVENT_factory(Lexer yyl) { return new SENSOR_EVENT(yyl);} -public static object IDENT_factory(Lexer yyl) { return new IDENT(yyl);} -public static object ELSE_factory(Lexer yyl) { return new ELSE(yyl);} -public static object VECTOR_TYPE_factory(Lexer yyl) { return new VECTOR_TYPE(yyl);} -public static object STROKE_STROKE_factory(Lexer yyl) { return new STROKE_STROKE(yyl);} -public static object PLUS_factory(Lexer yyl) { return new PLUS(yyl);} -public static object ATTACH_EVENT_factory(Lexer yyl) { return new ATTACH_EVENT(yyl);} -public static object COLLISION_END_EVENT_factory(Lexer yyl) { return new COLLISION_END_EVENT(yyl);} -public static object RIGHT_ANGLE_factory(Lexer yyl) { return new RIGHT_ANGLE(yyl);} -public static object MINUS_factory(Lexer yyl) { return new MINUS(yyl);} -public static object DO_factory(Lexer yyl) { return new DO(yyl);} -public static object LISTEN_EVENT_factory(Lexer yyl) { return new LISTEN_EVENT(yyl);} -public override TOKEN OldAction(Lexer yym,ref string yytext,int action, ref bool reject) { - switch(action) { - case -1: break; - case 1076: ; - break; - case 974: { ((LSLTokens)yym).str += "\\n"; } - break; - case 1003: { ((LSLTokens)yym).str += "\\\""; } - break; - case 968: { ((LSLTokens)yym).str += yytext; } - break; - case 991: { ((LSLTokens)yym).str += " "; } - break; - case 1072: ; - break; - case 979: { ((LSLTokens)yym).str += "\\n"; } - break; - case 1063: ; - break; - case 963: { yym.yy_begin("STRING"); ((LSLTokens)yym).str = "";} - break; - case 1049: { yym.yy_begin("YYINITIAL"); } - break; - case 1067: ; - break; - case 1032: { yym.yy_begin("YYINITIAL"); ((LSLTokens)yym).yytext = ((LSLTokens)yym).str; ((LSLTokens)yym).str = String.Empty; return new STRING_CONSTANT(yym); } - // break; - case 1027: { ((LSLTokens)yym).str += '\\'; } - break; - case 1015: { ((LSLTokens)yym).str += "\\\\"; } - break; - case 1037: { yym.yy_begin("COMMENT"); } - break; - } - return null; -}} -public class LSLTokens:Lexer { -public LSLTokens():base(new yyLSLTokens(new ErrorHandler(false))) {} -public LSLTokens(ErrorHandler eh):base(new yyLSLTokens(eh)) {} -public LSLTokens(YyLexer tks):base(tks){} - - public string str; - - } -} diff --git a/OpenSim/Region/ScriptEngine/Shared/CodeTools/lsl.parser.cs b/OpenSim/Region/ScriptEngine/Shared/CodeTools/lsl.parser.cs deleted file mode 100644 index 439d006807..0000000000 --- a/OpenSim/Region/ScriptEngine/Shared/CodeTools/lsl.parser.cs +++ /dev/null @@ -1,13521 +0,0 @@ -using System;using Tools; -namespace OpenSim.Region.ScriptEngine.Shared.CodeTools { -//%+LSLProgramRoot+97 -public class LSLProgramRoot : SYMBOL{ - public LSLProgramRoot (Parser yyp, States s ):base(((LSLSyntax -)yyp)){ while (0< s . kids . Count ) kids . Add ( s . kids . Pop ()); -} - public LSLProgramRoot (Parser yyp, GlobalDefinitions gd , States s ):base(((LSLSyntax -)yyp)){ while (0< gd . kids . Count ) kids . Add ( gd . kids . Pop ()); - while (0< s . kids . Count ) kids . Add ( s . kids . Pop ()); -} - -public override string yyname { get { return "LSLProgramRoot"; }} -public override int yynum { get { return 97; }} -public LSLProgramRoot(Parser yyp):base(yyp){}} -//%+GlobalDefinitions+98 -public class GlobalDefinitions : SYMBOL{ - public GlobalDefinitions (Parser yyp, GlobalVariableDeclaration gvd ):base(((LSLSyntax -)yyp)){ kids . Add ( gvd ); -} - public GlobalDefinitions (Parser yyp, GlobalDefinitions gd , GlobalVariableDeclaration gvd ):base(((LSLSyntax -)yyp)){ while (0< gd . kids . Count ) kids . Add ( gd . kids . Pop ()); - kids . Add ( gvd ); -} - public GlobalDefinitions (Parser yyp, GlobalFunctionDefinition gfd ):base(((LSLSyntax -)yyp)){ kids . Add ( gfd ); -} - public GlobalDefinitions (Parser yyp, GlobalDefinitions gd , GlobalFunctionDefinition gfd ):base(((LSLSyntax -)yyp)){ while (0< gd . kids . Count ) kids . Add ( gd . kids . Pop ()); - kids . Add ( gfd ); -} - -public override string yyname { get { return "GlobalDefinitions"; }} -public override int yynum { get { return 98; }} -public GlobalDefinitions(Parser yyp):base(yyp){}} -//%+GlobalVariableDeclaration+99 -public class GlobalVariableDeclaration : SYMBOL{ - public GlobalVariableDeclaration (Parser yyp, Declaration d ):base(((LSLSyntax -)yyp)){ kids . Add ( d ); -} - public GlobalVariableDeclaration (Parser yyp, Assignment a ):base(((LSLSyntax -)yyp)){ kids . Add ( a ); -} - -public override string yyname { get { return "GlobalVariableDeclaration"; }} -public override int yynum { get { return 99; }} -public GlobalVariableDeclaration(Parser yyp):base(yyp){}} -//%+GlobalFunctionDefinition+100 -public class GlobalFunctionDefinition : SYMBOL{ - private string m_returnType ; - private string m_name ; - public GlobalFunctionDefinition (Parser yyp, string returnType , string name , ArgumentDeclarationList adl , CompoundStatement cs ):base(((LSLSyntax -)yyp)){ m_returnType = returnType ; - m_name = name ; - kids . Add ( adl ); - kids . Add ( cs ); -} - public string ReturnType { get { return m_returnType ; -} - set { m_returnType = value ; -} -} - public string Name { get { return m_name ; -} -} - -public override string yyname { get { return "GlobalFunctionDefinition"; }} -public override int yynum { get { return 100; }} -public GlobalFunctionDefinition(Parser yyp):base(yyp){}} -//%+States+101 -public class States : SYMBOL{ - public States (Parser yyp, State ds ):base(((LSLSyntax -)yyp)){ kids . Add ( ds ); -} - public States (Parser yyp, States s , State us ):base(((LSLSyntax -)yyp)){ while (0< s . kids . Count ) kids . Add ( s . kids . Pop ()); - kids . Add ( us ); -} - -public override string yyname { get { return "States"; }} -public override int yynum { get { return 101; }} -public States(Parser yyp):base(yyp){}} -//%+State+102 -public class State : SYMBOL{ - private string m_name ; - public State (Parser yyp, string name , StateBody sb ):base(((LSLSyntax -)yyp)){ m_name = name ; - while (0< sb . kids . Count ) kids . Add ( sb . kids . Pop ()); -} - public override string ToString (){ return "STATE<"+ m_name +">"; -} - public string Name { get { return m_name ; -} -} - -public override string yyname { get { return "State"; }} -public override int yynum { get { return 102; }} -public State(Parser yyp):base(yyp){}} -//%+StateBody+103 -public class StateBody : SYMBOL{ - public StateBody (Parser yyp, StateBody sb , StateEvent se ):base(((LSLSyntax -)yyp)){ while (0< sb . kids . Count ) kids . Add ( sb . kids . Pop ()); - kids . Add ( se ); -} - public StateBody (Parser yyp, StateEvent se ):base(((LSLSyntax -)yyp)){ kids . Add ( se ); -} - -public override string yyname { get { return "StateBody"; }} -public override int yynum { get { return 103; }} -public StateBody(Parser yyp):base(yyp){}} -//%+StateEvent+104 -public class StateEvent : SYMBOL{ - private string m_name ; - public StateEvent (Parser yyp, string name , CompoundStatement cs ):base(((LSLSyntax -)yyp)){ m_name = name ; - kids . Add ( cs ); -} - public StateEvent (Parser yyp, string name , ArgumentDeclarationList adl , CompoundStatement cs ):base(((LSLSyntax -)yyp)){ m_name = name ; - if (0< adl . kids . Count ) kids . Add ( adl ); - kids . Add ( cs ); -} - public override string ToString (){ return "EVENT<"+ m_name +">"; -} - public string Name { get { return m_name ; -} -} - -public override string yyname { get { return "StateEvent"; }} -public override int yynum { get { return 104; }} -public StateEvent(Parser yyp):base(yyp){}} -//%+VoidArgStateEvent+105 -public class VoidArgStateEvent : StateEvent{ - public VoidArgStateEvent (Parser yyp, string name , CompoundStatement cs ):base(((LSLSyntax -)yyp), name , cs ){} - -public override string yyname { get { return "VoidArgStateEvent"; }} -public override int yynum { get { return 105; }} -public VoidArgStateEvent(Parser yyp):base(yyp){}} -//%+KeyArgStateEvent+106 -public class KeyArgStateEvent : StateEvent{ - public KeyArgStateEvent (Parser yyp, string name , KeyArgumentDeclarationList adl , CompoundStatement cs ):base(((LSLSyntax -)yyp), name , adl , cs ){} - -public override string yyname { get { return "KeyArgStateEvent"; }} -public override int yynum { get { return 106; }} -public KeyArgStateEvent(Parser yyp):base(yyp){}} -//%+IntArgStateEvent+107 -public class IntArgStateEvent : StateEvent{ - public IntArgStateEvent (Parser yyp, string name , IntArgumentDeclarationList adl , CompoundStatement cs ):base(((LSLSyntax -)yyp), name , adl , cs ){} - -public override string yyname { get { return "IntArgStateEvent"; }} -public override int yynum { get { return 107; }} -public IntArgStateEvent(Parser yyp):base(yyp){}} -//%+VectorArgStateEvent+108 -public class VectorArgStateEvent : StateEvent{ - public VectorArgStateEvent (Parser yyp, string name , VectorArgumentDeclarationList adl , CompoundStatement cs ):base(((LSLSyntax -)yyp), name , adl , cs ){} - -public override string yyname { get { return "VectorArgStateEvent"; }} -public override int yynum { get { return 108; }} -public VectorArgStateEvent(Parser yyp):base(yyp){}} -//%+IntRotRotArgStateEvent+109 -public class IntRotRotArgStateEvent : StateEvent{ - public IntRotRotArgStateEvent (Parser yyp, string name , IntRotRotArgumentDeclarationList adl , CompoundStatement cs ):base(((LSLSyntax -)yyp), name , adl , cs ){} - -public override string yyname { get { return "IntRotRotArgStateEvent"; }} -public override int yynum { get { return 109; }} -public IntRotRotArgStateEvent(Parser yyp):base(yyp){}} -//%+IntVecVecArgStateEvent+110 -public class IntVecVecArgStateEvent : StateEvent{ - public IntVecVecArgStateEvent (Parser yyp, string name , IntVecVecArgumentDeclarationList adl , CompoundStatement cs ):base(((LSLSyntax -)yyp), name , adl , cs ){} - -public override string yyname { get { return "IntVecVecArgStateEvent"; }} -public override int yynum { get { return 110; }} -public IntVecVecArgStateEvent(Parser yyp):base(yyp){}} -//%+KeyIntIntArgStateEvent+111 -public class KeyIntIntArgStateEvent : StateEvent{ - public KeyIntIntArgStateEvent (Parser yyp, string name , KeyIntIntArgumentDeclarationList adl , CompoundStatement cs ):base(((LSLSyntax -)yyp), name , adl , cs ){} - -public override string yyname { get { return "KeyIntIntArgStateEvent"; }} -public override int yynum { get { return 111; }} -public KeyIntIntArgStateEvent(Parser yyp):base(yyp){}} -//%+ArgumentDeclarationList+112 -public class ArgumentDeclarationList : SYMBOL{ - public ArgumentDeclarationList (Parser yyp, Declaration d ):base(((LSLSyntax -)yyp)){ kids . Add ( d ); -} - public ArgumentDeclarationList (Parser yyp, Declaration d , Declaration d2 ):base(((LSLSyntax -)yyp)){ kids . Add ( d ); - kids . Add ( d2 ); -} - public ArgumentDeclarationList (Parser yyp, Declaration d , Declaration d2 , Declaration d3 ):base(((LSLSyntax -)yyp)){ kids . Add ( d ); - kids . Add ( d2 ); - kids . Add ( d3 ); -} - public ArgumentDeclarationList (Parser yyp, ArgumentDeclarationList adl , Declaration d ):base(((LSLSyntax -)yyp)){ while (0< adl . kids . Count ) kids . Add ( adl . kids . Pop ()); - kids . Add ( d ); -} - -public override string yyname { get { return "ArgumentDeclarationList"; }} -public override int yynum { get { return 112; }} -public ArgumentDeclarationList(Parser yyp):base(yyp){}} -//%+KeyArgumentDeclarationList+113 -public class KeyArgumentDeclarationList : ArgumentDeclarationList{ - public KeyArgumentDeclarationList (Parser yyp, KeyDeclaration d ):base(((LSLSyntax -)yyp), d ){} - -public override string yyname { get { return "KeyArgumentDeclarationList"; }} -public override int yynum { get { return 113; }} -public KeyArgumentDeclarationList(Parser yyp):base(yyp){}} -//%+IntArgumentDeclarationList+114 -public class IntArgumentDeclarationList : ArgumentDeclarationList{ - public IntArgumentDeclarationList (Parser yyp, IntDeclaration d ):base(((LSLSyntax -)yyp), d ){} - -public override string yyname { get { return "IntArgumentDeclarationList"; }} -public override int yynum { get { return 114; }} -public IntArgumentDeclarationList(Parser yyp):base(yyp){}} -//%+VectorArgumentDeclarationList+115 -public class VectorArgumentDeclarationList : ArgumentDeclarationList{ - public VectorArgumentDeclarationList (Parser yyp, VecDeclaration d ):base(((LSLSyntax -)yyp), d ){} - -public override string yyname { get { return "VectorArgumentDeclarationList"; }} -public override int yynum { get { return 115; }} -public VectorArgumentDeclarationList(Parser yyp):base(yyp){}} -//%+IntRotRotArgumentDeclarationList+116 -public class IntRotRotArgumentDeclarationList : ArgumentDeclarationList{ - public IntRotRotArgumentDeclarationList (Parser yyp, Declaration d1 , Declaration d2 , Declaration d3 ):base(((LSLSyntax -)yyp), d1 , d2 , d3 ){} - -public override string yyname { get { return "IntRotRotArgumentDeclarationList"; }} -public override int yynum { get { return 116; }} -public IntRotRotArgumentDeclarationList(Parser yyp):base(yyp){}} -//%+IntVecVecArgumentDeclarationList+117 -public class IntVecVecArgumentDeclarationList : ArgumentDeclarationList{ - public IntVecVecArgumentDeclarationList (Parser yyp, Declaration d1 , Declaration d2 , Declaration d3 ):base(((LSLSyntax -)yyp), d1 , d2 , d3 ){} - -public override string yyname { get { return "IntVecVecArgumentDeclarationList"; }} -public override int yynum { get { return 117; }} -public IntVecVecArgumentDeclarationList(Parser yyp):base(yyp){}} -//%+KeyIntIntArgumentDeclarationList+118 -public class KeyIntIntArgumentDeclarationList : ArgumentDeclarationList{ - public KeyIntIntArgumentDeclarationList (Parser yyp, Declaration d1 , Declaration d2 , Declaration d3 ):base(((LSLSyntax -)yyp), d1 , d2 , d3 ){} - -public override string yyname { get { return "KeyIntIntArgumentDeclarationList"; }} -public override int yynum { get { return 118; }} -public KeyIntIntArgumentDeclarationList(Parser yyp):base(yyp){}} -//%+Declaration+119 -public class Declaration : SYMBOL{ - private string m_datatype ; - private string m_id ; - public Declaration (Parser yyp, string type , string id ):base(((LSLSyntax -)yyp)){ m_datatype = type ; - m_id = id ; -} - public override string ToString (){ return "Declaration<"+ m_datatype +":"+ m_id +">"; -} - public string Datatype { get { return m_datatype ; -} - set { m_datatype = value ; -} -} - public string Id { get { return m_id ; -} -} - -public override string yyname { get { return "Declaration"; }} -public override int yynum { get { return 119; }} -public Declaration(Parser yyp):base(yyp){}} -//%+KeyDeclaration+120 -public class KeyDeclaration : Declaration{ - public KeyDeclaration (Parser yyp, string type , string id ):base(((LSLSyntax -)yyp), type , id ){} - -public override string yyname { get { return "KeyDeclaration"; }} -public override int yynum { get { return 120; }} -public KeyDeclaration(Parser yyp):base(yyp){}} -//%+IntDeclaration+121 -public class IntDeclaration : Declaration{ - public IntDeclaration (Parser yyp, string type , string id ):base(((LSLSyntax -)yyp), type , id ){} - -public override string yyname { get { return "IntDeclaration"; }} -public override int yynum { get { return 121; }} -public IntDeclaration(Parser yyp):base(yyp){}} -//%+VecDeclaration+122 -public class VecDeclaration : Declaration{ - public VecDeclaration (Parser yyp, string type , string id ):base(((LSLSyntax -)yyp), type , id ){} - -public override string yyname { get { return "VecDeclaration"; }} -public override int yynum { get { return 122; }} -public VecDeclaration(Parser yyp):base(yyp){}} -//%+RotDeclaration+123 -public class RotDeclaration : Declaration{ - public RotDeclaration (Parser yyp, string type , string id ):base(((LSLSyntax -)yyp), type , id ){} - -public override string yyname { get { return "RotDeclaration"; }} -public override int yynum { get { return 123; }} -public RotDeclaration(Parser yyp):base(yyp){}} -//%+Typename+124 -public class Typename : SYMBOL{ - public string yytext ; - public Typename (Parser yyp, string text ):base(((LSLSyntax -)yyp)){ yytext = text ; -} - -public override string yyname { get { return "Typename"; }} -public override int yynum { get { return 124; }} -public Typename(Parser yyp):base(yyp){}} -//%+Event+125 -public class Event : SYMBOL{ - public string yytext ; - public Event (Parser yyp, string text ):base(((LSLSyntax -)yyp)){ yytext = text ; -} - -public override string yyname { get { return "Event"; }} -public override int yynum { get { return 125; }} -public Event(Parser yyp):base(yyp){}} -//%+VoidArgEvent+126 -public class VoidArgEvent : Event{ - public VoidArgEvent (Parser yyp, string text ):base(((LSLSyntax -)yyp), text ){} - -public override string yyname { get { return "VoidArgEvent"; }} -public override int yynum { get { return 126; }} -public VoidArgEvent(Parser yyp):base(yyp){}} -//%+KeyArgEvent+127 -public class KeyArgEvent : Event{ - public KeyArgEvent (Parser yyp, string text ):base(((LSLSyntax -)yyp), text ){} - -public override string yyname { get { return "KeyArgEvent"; }} -public override int yynum { get { return 127; }} -public KeyArgEvent(Parser yyp):base(yyp){}} -//%+IntArgEvent+128 -public class IntArgEvent : Event{ - public IntArgEvent (Parser yyp, string text ):base(((LSLSyntax -)yyp), text ){} - -public override string yyname { get { return "IntArgEvent"; }} -public override int yynum { get { return 128; }} -public IntArgEvent(Parser yyp):base(yyp){}} -//%+VectorArgEvent+129 -public class VectorArgEvent : Event{ - public VectorArgEvent (Parser yyp, string text ):base(((LSLSyntax -)yyp), text ){} - -public override string yyname { get { return "VectorArgEvent"; }} -public override int yynum { get { return 129; }} -public VectorArgEvent(Parser yyp):base(yyp){}} -//%+IntRotRotArgEvent+130 -public class IntRotRotArgEvent : Event{ - public IntRotRotArgEvent (Parser yyp, string text ):base(((LSLSyntax -)yyp), text ){} - -public override string yyname { get { return "IntRotRotArgEvent"; }} -public override int yynum { get { return 130; }} -public IntRotRotArgEvent(Parser yyp):base(yyp){}} -//%+IntVecVecArgEvent+131 -public class IntVecVecArgEvent : Event{ - public IntVecVecArgEvent (Parser yyp, string text ):base(((LSLSyntax -)yyp), text ){} - -public override string yyname { get { return "IntVecVecArgEvent"; }} -public override int yynum { get { return 131; }} -public IntVecVecArgEvent(Parser yyp):base(yyp){}} -//%+KeyIntIntArgEvent+132 -public class KeyIntIntArgEvent : Event{ - public KeyIntIntArgEvent (Parser yyp, string text ):base(((LSLSyntax -)yyp), text ){} - -public override string yyname { get { return "KeyIntIntArgEvent"; }} -public override int yynum { get { return 132; }} -public KeyIntIntArgEvent(Parser yyp):base(yyp){}} -//%+CompoundStatement+133 -public class CompoundStatement : SYMBOL{ - public CompoundStatement (Parser yyp):base(((LSLSyntax -)yyp)){} - public CompoundStatement (Parser yyp, StatementList sl ):base(((LSLSyntax -)yyp)){ while (0< sl . kids . Count ) kids . Add ( sl . kids . Pop ()); -} - -public override string yyname { get { return "CompoundStatement"; }} -public override int yynum { get { return 133; }} -} -//%+StatementList+134 -public class StatementList : SYMBOL{ - private void AddStatement ( Statement s ){ if ( s . kids . Top is IfStatement || s . kids . Top is WhileStatement || s . kids . Top is DoWhileStatement || s . kids . Top is ForLoop ) kids . Add ( s . kids . Pop ()); - else kids . Add ( s ); -} - public StatementList (Parser yyp, Statement s ):base(((LSLSyntax -)yyp)){ AddStatement ( s ); -} - public StatementList (Parser yyp, StatementList sl , Statement s ):base(((LSLSyntax -)yyp)){ while (0< sl . kids . Count ) kids . Add ( sl . kids . Pop ()); - AddStatement ( s ); -} - -public override string yyname { get { return "StatementList"; }} -public override int yynum { get { return 134; }} -public StatementList(Parser yyp):base(yyp){}} -//%+Statement+135 -public class Statement : SYMBOL{ - public Statement (Parser yyp, Declaration d ):base(((LSLSyntax -)yyp)){ kids . Add ( d ); -} - public Statement (Parser yyp, CompoundStatement cs ):base(((LSLSyntax -)yyp)){ kids . Add ( cs ); -} - public Statement (Parser yyp, FunctionCall fc ):base(((LSLSyntax -)yyp)){ kids . Add ( fc ); -} - public Statement (Parser yyp, Assignment a ):base(((LSLSyntax -)yyp)){ kids . Add ( a ); -} - public Statement (Parser yyp, Expression e ):base(((LSLSyntax -)yyp)){ kids . Add ( e ); -} - public Statement (Parser yyp, ReturnStatement rs ):base(((LSLSyntax -)yyp)){ kids . Add ( rs ); -} - public Statement (Parser yyp, StateChange sc ):base(((LSLSyntax -)yyp)){ kids . Add ( sc ); -} - public Statement (Parser yyp, IfStatement ifs ):base(((LSLSyntax -)yyp)){ kids . Add ( ifs ); -} - public Statement (Parser yyp, WhileStatement ifs ):base(((LSLSyntax -)yyp)){ kids . Add ( ifs ); -} - public Statement (Parser yyp, DoWhileStatement ifs ):base(((LSLSyntax -)yyp)){ kids . Add ( ifs ); -} - public Statement (Parser yyp, ForLoop fl ):base(((LSLSyntax -)yyp)){ kids . Add ( fl ); -} - public Statement (Parser yyp, JumpLabel jl ):base(((LSLSyntax -)yyp)){ kids . Add ( jl ); -} - public Statement (Parser yyp, JumpStatement js ):base(((LSLSyntax -)yyp)){ kids . Add ( js ); -} - public Statement (Parser yyp, EmptyStatement es ):base(((LSLSyntax -)yyp)){ kids . Add ( es ); -} - -public override string yyname { get { return "Statement"; }} -public override int yynum { get { return 135; }} -public Statement(Parser yyp):base(yyp){}} -//%+EmptyStatement+136 -public class EmptyStatement : SYMBOL{ - public EmptyStatement (Parser yyp):base(((LSLSyntax -)yyp)){} - public override string ToString (){ return base . ToString (); -} - -public override string yyname { get { return "EmptyStatement"; }} -public override int yynum { get { return 136; }} -} -//%+Assignment+137 -public class Assignment : SYMBOL{ - protected string m_assignmentType ; - public Assignment (Parser yyp, SYMBOL lhs , SYMBOL rhs , string assignmentType ):base(((LSLSyntax -)yyp)){ m_assignmentType = assignmentType ; - kids . Add ( lhs ); - if ( rhs is ConstantExpression ) while (0< rhs . kids . Count ) kids . Add ( rhs . kids . Pop ()); - else kids . Add ( rhs ); -} - public Assignment (Parser yyp, SimpleAssignment sa ):base(((LSLSyntax -)yyp)){ m_assignmentType = sa . AssignmentType ; - while (0< sa . kids . Count ) kids . Add ( sa . kids . Pop ()); -} - public string AssignmentType { get { return m_assignmentType ; -} -} - public override string ToString (){ return base . ToString ()+"<"+ m_assignmentType +">"; -} - -public override string yyname { get { return "Assignment"; }} -public override int yynum { get { return 137; }} -public Assignment(Parser yyp):base(yyp){}} -//%+SimpleAssignment+138 -public class SimpleAssignment : Assignment{ - public SimpleAssignment (Parser yyp, SYMBOL lhs , SYMBOL rhs , string assignmentType ):base(((LSLSyntax -)yyp)){ m_assignmentType = assignmentType ; - kids . Add ( lhs ); - if ( rhs is ConstantExpression ) while (0< rhs . kids . Count ) kids . Add ( rhs . kids . Pop ()); - else kids . Add ( rhs ); -} - -public override string yyname { get { return "SimpleAssignment"; }} -public override int yynum { get { return 138; }} -public SimpleAssignment(Parser yyp):base(yyp){}} -//%+ReturnStatement+139 -public class ReturnStatement : SYMBOL{ - public ReturnStatement (Parser yyp):base(((LSLSyntax -)yyp)){} - public ReturnStatement (Parser yyp, Expression e ):base(((LSLSyntax -)yyp)){ if ( e is ConstantExpression ) while (0< e . kids . Count ) kids . Add ( e . kids . Pop ()); - else kids . Add ( e ); -} - -public override string yyname { get { return "ReturnStatement"; }} -public override int yynum { get { return 139; }} -} -//%+JumpLabel+140 -public class JumpLabel : SYMBOL{ - private string m_labelName ; - public JumpLabel (Parser yyp, string labelName ):base(((LSLSyntax -)yyp)){ m_labelName = labelName ; -} - public string LabelName { get { return m_labelName ; -} -} - public override string ToString (){ return base . ToString ()+"<"+ m_labelName +">"; -} - -public override string yyname { get { return "JumpLabel"; }} -public override int yynum { get { return 140; }} -public JumpLabel(Parser yyp):base(yyp){}} -//%+JumpStatement+141 -public class JumpStatement : SYMBOL{ - private string m_targetName ; - public JumpStatement (Parser yyp, string targetName ):base(((LSLSyntax -)yyp)){ m_targetName = targetName ; -} - public string TargetName { get { return m_targetName ; -} -} - public override string ToString (){ return base . ToString ()+"<"+ m_targetName +">"; -} - -public override string yyname { get { return "JumpStatement"; }} -public override int yynum { get { return 141; }} -public JumpStatement(Parser yyp):base(yyp){}} -//%+StateChange+142 -public class StateChange : SYMBOL{ - private string m_newState ; - public StateChange (Parser yyp, string newState ):base(((LSLSyntax -)yyp)){ m_newState = newState ; -} - public string NewState { get { return m_newState ; -} -} - -public override string yyname { get { return "StateChange"; }} -public override int yynum { get { return 142; }} -public StateChange(Parser yyp):base(yyp){}} -//%+IfStatement+143 -public class IfStatement : SYMBOL{ - private void AddStatement ( Statement s ){ if (0< s . kids . Count && s . kids . Top is CompoundStatement ) kids . Add ( s . kids . Pop ()); - else kids . Add ( s ); -} - public IfStatement (Parser yyp, SYMBOL s , Statement ifs ):base(((LSLSyntax -)yyp)){ kids . Add ( s ); - AddStatement ( ifs ); -} - public IfStatement (Parser yyp, SYMBOL s , Statement ifs , Statement es ):base(((LSLSyntax -)yyp)){ kids . Add ( s ); - AddStatement ( ifs ); - if (0< es . kids . Count && es . kids . Top is IfStatement ) kids . Add ( es . kids . Pop ()); - else AddStatement ( es ); -} - -public override string yyname { get { return "IfStatement"; }} -public override int yynum { get { return 143; }} -public IfStatement(Parser yyp):base(yyp){}} -//%+WhileStatement+144 -public class WhileStatement : SYMBOL{ - public WhileStatement (Parser yyp, SYMBOL s , Statement st ):base(((LSLSyntax -)yyp)){ kids . Add ( s ); - if (0< st . kids . Count && st . kids . Top is CompoundStatement ) kids . Add ( st . kids . Pop ()); - else kids . Add ( st ); -} - -public override string yyname { get { return "WhileStatement"; }} -public override int yynum { get { return 144; }} -public WhileStatement(Parser yyp):base(yyp){}} -//%+DoWhileStatement+145 -public class DoWhileStatement : SYMBOL{ - public DoWhileStatement (Parser yyp, SYMBOL s , Statement st ):base(((LSLSyntax -)yyp)){ if (0< st . kids . Count && st . kids . Top is CompoundStatement ) kids . Add ( st . kids . Pop ()); - else kids . Add ( st ); - kids . Add ( s ); -} - -public override string yyname { get { return "DoWhileStatement"; }} -public override int yynum { get { return 145; }} -public DoWhileStatement(Parser yyp):base(yyp){}} -//%+ForLoop+146 -public class ForLoop : SYMBOL{ - public ForLoop (Parser yyp, ForLoopStatement flsa , Expression e , ForLoopStatement flsb , Statement s ):base(((LSLSyntax -)yyp)){ kids . Add ( flsa ); - kids . Add ( e ); - kids . Add ( flsb ); - if (0< s . kids . Count && s . kids . Top is CompoundStatement ) kids . Add ( s . kids . Pop ()); - else kids . Add ( s ); -} - -public override string yyname { get { return "ForLoop"; }} -public override int yynum { get { return 146; }} -public ForLoop(Parser yyp):base(yyp){}} -//%+ForLoopStatement+147 -public class ForLoopStatement : SYMBOL{ - public ForLoopStatement (Parser yyp, Expression e ):base(((LSLSyntax -)yyp)){ kids . Add ( e ); -} - public ForLoopStatement (Parser yyp, SimpleAssignment sa ):base(((LSLSyntax -)yyp)){ kids . Add ( sa ); -} - public ForLoopStatement (Parser yyp, ForLoopStatement fls , Expression e ):base(((LSLSyntax -)yyp)){ while (0< fls . kids . Count ) kids . Add ( fls . kids . Pop ()); - kids . Add ( e ); -} - public ForLoopStatement (Parser yyp, ForLoopStatement fls , SimpleAssignment sa ):base(((LSLSyntax -)yyp)){ while (0< fls . kids . Count ) kids . Add ( fls . kids . Pop ()); - kids . Add ( sa ); -} - -public override string yyname { get { return "ForLoopStatement"; }} -public override int yynum { get { return 147; }} -public ForLoopStatement(Parser yyp):base(yyp){}} -//%+FunctionCall+148 -public class FunctionCall : SYMBOL{ - private string m_id ; - public FunctionCall (Parser yyp, string id , ArgumentList al ):base(((LSLSyntax -)yyp)){ m_id = id ; - kids . Add ( al ); -} - public override string ToString (){ return base . ToString ()+"<"+ m_id +">"; -} - public string Id { get { return m_id ; -} -} - -public override string yyname { get { return "FunctionCall"; }} -public override int yynum { get { return 148; }} -public FunctionCall(Parser yyp):base(yyp){}} -//%+ArgumentList+149 -public class ArgumentList : SYMBOL{ - public ArgumentList (Parser yyp, Argument a ):base(((LSLSyntax -)yyp)){ AddArgument ( a ); -} - public ArgumentList (Parser yyp, ArgumentList al , Argument a ):base(((LSLSyntax -)yyp)){ while (0< al . kids . Count ) kids . Add ( al . kids . Pop ()); - AddArgument ( a ); -} - private void AddArgument ( Argument a ){ if ( a is ExpressionArgument ) while (0< a . kids . Count ) kids . Add ( a . kids . Pop ()); - else kids . Add ( a ); -} - -public override string yyname { get { return "ArgumentList"; }} -public override int yynum { get { return 149; }} -public ArgumentList(Parser yyp):base(yyp){}} -//%+Argument+150 -public class Argument : SYMBOL{ -public override string yyname { get { return "Argument"; }} -public override int yynum { get { return 150; }} -public Argument(Parser yyp):base(yyp){}} -//%+ExpressionArgument+151 -public class ExpressionArgument : Argument{ - public ExpressionArgument (Parser yyp, Expression e ):base(((LSLSyntax -)yyp)){ if ( e is ConstantExpression ) while (0< e . kids . Count ) kids . Add ( e . kids . Pop ()); - else kids . Add ( e ); -} - -public override string yyname { get { return "ExpressionArgument"; }} -public override int yynum { get { return 151; }} -public ExpressionArgument(Parser yyp):base(yyp){}} -//%+Constant+152 -public class Constant : SYMBOL{ - private string m_type ; - private string m_val ; - public Constant (Parser yyp, string type , string val ):base(((LSLSyntax -)yyp)){ m_type = type ; - m_val = val ; -} - public override string ToString (){ return base . ToString ()+"<"+ m_type +":"+ m_val +">"; -} - public string Value { get { return m_val ; -} - set { m_val = value ; -} -} - public string Type { get { return m_type ; -} - set { m_type = value ; -} -} - -public override string yyname { get { return "Constant"; }} -public override int yynum { get { return 152; }} -public Constant(Parser yyp):base(yyp){}} -//%+VectorConstant+153 -public class VectorConstant : Constant{ - public VectorConstant (Parser yyp, Expression valX , Expression valY , Expression valZ ):base(((LSLSyntax -)yyp),"vector", null ){ kids . Add ( valX ); - kids . Add ( valY ); - kids . Add ( valZ ); -} - -public override string yyname { get { return "VectorConstant"; }} -public override int yynum { get { return 153; }} -public VectorConstant(Parser yyp):base(yyp){}} -//%+RotationConstant+154 -public class RotationConstant : Constant{ - public RotationConstant (Parser yyp, Expression valX , Expression valY , Expression valZ , Expression valS ):base(((LSLSyntax -)yyp),"rotation", null ){ kids . Add ( valX ); - kids . Add ( valY ); - kids . Add ( valZ ); - kids . Add ( valS ); -} - -public override string yyname { get { return "RotationConstant"; }} -public override int yynum { get { return 154; }} -public RotationConstant(Parser yyp):base(yyp){}} -//%+ListConstant+155 -public class ListConstant : Constant{ - public ListConstant (Parser yyp, ArgumentList al ):base(((LSLSyntax -)yyp),"list", null ){ kids . Add ( al ); -} - -public override string yyname { get { return "ListConstant"; }} -public override int yynum { get { return 155; }} -public ListConstant(Parser yyp):base(yyp){}} -//%+Expression+156 -public class Expression : SYMBOL{ - protected void AddExpression ( Expression e ){ if ( e is ConstantExpression ) while (0< e . kids . Count ) kids . Add ( e . kids . Pop ()); - else kids . Add ( e ); -} - -public override string yyname { get { return "Expression"; }} -public override int yynum { get { return 156; }} -public Expression(Parser yyp):base(yyp){}} -//%+ConstantExpression+157 -public class ConstantExpression : Expression{ - public ConstantExpression (Parser yyp, Constant c ):base(((LSLSyntax -)yyp)){ kids . Add ( c ); -} - -public override string yyname { get { return "ConstantExpression"; }} -public override int yynum { get { return 157; }} -public ConstantExpression(Parser yyp):base(yyp){}} -//%+IdentExpression+158 -public class IdentExpression : Expression{ - protected string m_name ; - public IdentExpression (Parser yyp, string name ):base(((LSLSyntax -)yyp)){ m_name = name ; -} - public override string ToString (){ return base . ToString ()+"<"+ m_name +">"; -} - public string Name { get { return m_name ; -} -} - -public override string yyname { get { return "IdentExpression"; }} -public override int yynum { get { return 158; }} -public IdentExpression(Parser yyp):base(yyp){}} -//%+IdentDotExpression+159 -public class IdentDotExpression : IdentExpression{ - private string m_member ; - public IdentDotExpression (Parser yyp, string name , string member ):base(((LSLSyntax -)yyp), name ){ m_member = member ; -} - public override string ToString (){ string baseToString = base . ToString (); - return baseToString . Substring (0, baseToString . Length -1)+"."+ m_member +">"; -} - public string Member { get { return m_member ; -} -} - -public override string yyname { get { return "IdentDotExpression"; }} -public override int yynum { get { return 159; }} -public IdentDotExpression(Parser yyp):base(yyp){}} -//%+FunctionCallExpression+160 -public class FunctionCallExpression : Expression{ - public FunctionCallExpression (Parser yyp, FunctionCall fc ):base(((LSLSyntax -)yyp)){ kids . Add ( fc ); -} - -public override string yyname { get { return "FunctionCallExpression"; }} -public override int yynum { get { return 160; }} -public FunctionCallExpression(Parser yyp):base(yyp){}} -//%+BinaryExpression+161 -public class BinaryExpression : Expression{ - private string m_expressionSymbol ; - public BinaryExpression (Parser yyp, Expression lhs , Expression rhs , string expressionSymbol ):base(((LSLSyntax -)yyp)){ m_expressionSymbol = expressionSymbol ; - AddExpression ( lhs ); - AddExpression ( rhs ); -} - public string ExpressionSymbol { get { return m_expressionSymbol ; -} -} - public override string ToString (){ return base . ToString ()+"<"+ m_expressionSymbol +">"; -} - -public override string yyname { get { return "BinaryExpression"; }} -public override int yynum { get { return 161; }} -public BinaryExpression(Parser yyp):base(yyp){}} -//%+UnaryExpression+162 -public class UnaryExpression : Expression{ - private string m_unarySymbol ; - public UnaryExpression (Parser yyp, string unarySymbol , Expression e ):base(((LSLSyntax -)yyp)){ m_unarySymbol = unarySymbol ; - AddExpression ( e ); -} - public string UnarySymbol { get { return m_unarySymbol ; -} -} - public override string ToString (){ return base . ToString ()+"<"+ m_unarySymbol +">"; -} - -public override string yyname { get { return "UnaryExpression"; }} -public override int yynum { get { return 162; }} -public UnaryExpression(Parser yyp):base(yyp){}} -//%+TypecastExpression+163 -public class TypecastExpression : Expression{ - private string m_typecastType ; - public TypecastExpression (Parser yyp, string typecastType , SYMBOL rhs ):base(((LSLSyntax -)yyp)){ m_typecastType = typecastType ; - kids . Add ( rhs ); -} - public string TypecastType { get { return m_typecastType ; -} - set { m_typecastType = value ; -} -} - -public override string yyname { get { return "TypecastExpression"; }} -public override int yynum { get { return 163; }} -public TypecastExpression(Parser yyp):base(yyp){}} -//%+ParenthesisExpression+164 -public class ParenthesisExpression : Expression{ - public ParenthesisExpression (Parser yyp, SYMBOL s ):base(((LSLSyntax -)yyp)){ kids . Add ( s ); -} - -public override string yyname { get { return "ParenthesisExpression"; }} -public override int yynum { get { return 164; }} -public ParenthesisExpression(Parser yyp):base(yyp){}} -//%+IncrementDecrementExpression+165 -public class IncrementDecrementExpression : Expression{ - private string m_name ; - private string m_operation ; - private bool m_postOperation ; - public IncrementDecrementExpression (Parser yyp, string name , string operation , bool postOperation ):base(((LSLSyntax -)yyp)){ m_name = name ; - m_operation = operation ; - m_postOperation = postOperation ; -} - public IncrementDecrementExpression (Parser yyp, IdentDotExpression ide , string operation , bool postOperation ):base(((LSLSyntax -)yyp)){ m_operation = operation ; - m_postOperation = postOperation ; - kids . Add ( ide ); -} - public override string ToString (){ return base . ToString ()+"<"+( m_postOperation ? m_name + m_operation : m_operation + m_name )+">"; -} - public string Name { get { return m_name ; -} -} - public string Operation { get { return m_operation ; -} -} - public bool PostOperation { get { return m_postOperation ; -} -} - -public override string yyname { get { return "IncrementDecrementExpression"; }} -public override int yynum { get { return 165; }} -public IncrementDecrementExpression(Parser yyp):base(yyp){}} - -public class LSLProgramRoot_1 : LSLProgramRoot { - public LSLProgramRoot_1(Parser yyq):base(yyq, - ((GlobalDefinitions)(yyq.StackAt(1).m_value)) - , - ((States)(yyq.StackAt(0).m_value)) - ){}} - -public class LSLProgramRoot_2 : LSLProgramRoot { - public LSLProgramRoot_2(Parser yyq):base(yyq, - ((States)(yyq.StackAt(0).m_value)) - ){}} - -public class GlobalDefinitions_1 : GlobalDefinitions { - public GlobalDefinitions_1(Parser yyq):base(yyq, - ((GlobalVariableDeclaration)(yyq.StackAt(0).m_value)) - ){}} - -public class GlobalDefinitions_2 : GlobalDefinitions { - public GlobalDefinitions_2(Parser yyq):base(yyq, - ((GlobalDefinitions)(yyq.StackAt(1).m_value)) - , - ((GlobalVariableDeclaration)(yyq.StackAt(0).m_value)) - ){}} - -public class GlobalDefinitions_3 : GlobalDefinitions { - public GlobalDefinitions_3(Parser yyq):base(yyq, - ((GlobalFunctionDefinition)(yyq.StackAt(0).m_value)) - ){}} - -public class GlobalDefinitions_4 : GlobalDefinitions { - public GlobalDefinitions_4(Parser yyq):base(yyq, - ((GlobalDefinitions)(yyq.StackAt(1).m_value)) - , - ((GlobalFunctionDefinition)(yyq.StackAt(0).m_value)) - ){}} - -public class GlobalVariableDeclaration_1 : GlobalVariableDeclaration { - public GlobalVariableDeclaration_1(Parser yyq):base(yyq, - ((Declaration)(yyq.StackAt(1).m_value)) - ){}} - -public class GlobalVariableDeclaration_2 : GlobalVariableDeclaration { - public GlobalVariableDeclaration_2(Parser yyq):base(yyq,new Assignment(((LSLSyntax -)yyq), - ((Declaration)(yyq.StackAt(3).m_value)) - , - ((Expression)(yyq.StackAt(1).m_value)) - , - ((EQUALS)(yyq.StackAt(2).m_value)) - .yytext)){}} - -public class GlobalFunctionDefinition_1 : GlobalFunctionDefinition { - public GlobalFunctionDefinition_1(Parser yyq):base(yyq,"void", - ((IDENT)(yyq.StackAt(4).m_value)) - .yytext, - ((ArgumentDeclarationList)(yyq.StackAt(2).m_value)) - , - ((CompoundStatement)(yyq.StackAt(0).m_value)) - ){}} - -public class GlobalFunctionDefinition_2 : GlobalFunctionDefinition { - public GlobalFunctionDefinition_2(Parser yyq):base(yyq, - ((Typename)(yyq.StackAt(5).m_value)) - .yytext, - ((IDENT)(yyq.StackAt(4).m_value)) - .yytext, - ((ArgumentDeclarationList)(yyq.StackAt(2).m_value)) - , - ((CompoundStatement)(yyq.StackAt(0).m_value)) - ){}} - -public class States_1 : States { - public States_1(Parser yyq):base(yyq, - ((State)(yyq.StackAt(0).m_value)) - ){}} - -public class States_2 : States { - public States_2(Parser yyq):base(yyq, - ((States)(yyq.StackAt(1).m_value)) - , - ((State)(yyq.StackAt(0).m_value)) - ){}} - -public class State_1 : State { - public State_1(Parser yyq):base(yyq, - ((DEFAULT_STATE)(yyq.StackAt(3).m_value)) - .yytext, - ((StateBody)(yyq.StackAt(1).m_value)) - ){}} - -public class State_2 : State { - public State_2(Parser yyq):base(yyq, - ((IDENT)(yyq.StackAt(3).m_value)) - .yytext, - ((StateBody)(yyq.StackAt(1).m_value)) - ){}} - -public class StateBody_1 : StateBody { - public StateBody_1(Parser yyq):base(yyq, - ((StateEvent)(yyq.StackAt(0).m_value)) - ){}} - -public class StateBody_2 : StateBody { - public StateBody_2(Parser yyq):base(yyq, - ((StateBody)(yyq.StackAt(1).m_value)) - , - ((StateEvent)(yyq.StackAt(0).m_value)) - ){}} - -public class StateBody_3 : StateBody { - public StateBody_3(Parser yyq):base(yyq, - ((VoidArgStateEvent)(yyq.StackAt(0).m_value)) - ){}} - -public class StateBody_4 : StateBody { - public StateBody_4(Parser yyq):base(yyq, - ((StateBody)(yyq.StackAt(1).m_value)) - , - ((VoidArgStateEvent)(yyq.StackAt(0).m_value)) - ){}} - -public class StateBody_5 : StateBody { - public StateBody_5(Parser yyq):base(yyq, - ((KeyArgStateEvent)(yyq.StackAt(0).m_value)) - ){}} - -public class StateBody_6 : StateBody { - public StateBody_6(Parser yyq):base(yyq, - ((StateBody)(yyq.StackAt(1).m_value)) - , - ((KeyArgStateEvent)(yyq.StackAt(0).m_value)) - ){}} - -public class StateBody_7 : StateBody { - public StateBody_7(Parser yyq):base(yyq, - ((IntArgStateEvent)(yyq.StackAt(0).m_value)) - ){}} - -public class StateBody_8 : StateBody { - public StateBody_8(Parser yyq):base(yyq, - ((StateBody)(yyq.StackAt(1).m_value)) - , - ((IntArgStateEvent)(yyq.StackAt(0).m_value)) - ){}} - -public class StateBody_9 : StateBody { - public StateBody_9(Parser yyq):base(yyq, - ((VectorArgStateEvent)(yyq.StackAt(0).m_value)) - ){}} - -public class StateBody_10 : StateBody { - public StateBody_10(Parser yyq):base(yyq, - ((StateBody)(yyq.StackAt(1).m_value)) - , - ((VectorArgStateEvent)(yyq.StackAt(0).m_value)) - ){}} - -public class StateBody_11 : StateBody { - public StateBody_11(Parser yyq):base(yyq, - ((IntRotRotArgStateEvent)(yyq.StackAt(0).m_value)) - ){}} - -public class StateBody_12 : StateBody { - public StateBody_12(Parser yyq):base(yyq, - ((StateBody)(yyq.StackAt(1).m_value)) - , - ((IntRotRotArgStateEvent)(yyq.StackAt(0).m_value)) - ){}} - -public class StateBody_13 : StateBody { - public StateBody_13(Parser yyq):base(yyq, - ((IntVecVecArgStateEvent)(yyq.StackAt(0).m_value)) - ){}} - -public class StateBody_14 : StateBody { - public StateBody_14(Parser yyq):base(yyq, - ((StateBody)(yyq.StackAt(1).m_value)) - , - ((IntVecVecArgStateEvent)(yyq.StackAt(0).m_value)) - ){}} - -public class StateBody_15 : StateBody { - public StateBody_15(Parser yyq):base(yyq, - ((KeyIntIntArgStateEvent)(yyq.StackAt(0).m_value)) - ){}} - -public class StateBody_16 : StateBody { - public StateBody_16(Parser yyq):base(yyq, - ((StateBody)(yyq.StackAt(1).m_value)) - , - ((KeyIntIntArgStateEvent)(yyq.StackAt(0).m_value)) - ){}} - -public class StateEvent_1 : StateEvent { - public StateEvent_1(Parser yyq):base(yyq, - ((Event)(yyq.StackAt(4).m_value)) - .yytext, - ((ArgumentDeclarationList)(yyq.StackAt(2).m_value)) - , - ((CompoundStatement)(yyq.StackAt(0).m_value)) - ){}} - -public class VoidArgStateEvent_1 : VoidArgStateEvent { - public VoidArgStateEvent_1(Parser yyq):base(yyq, - ((VoidArgEvent)(yyq.StackAt(3).m_value)) - .yytext, - ((CompoundStatement)(yyq.StackAt(0).m_value)) - ){}} - -public class KeyArgStateEvent_1 : KeyArgStateEvent { - public KeyArgStateEvent_1(Parser yyq):base(yyq, - ((KeyArgEvent)(yyq.StackAt(4).m_value)) - .yytext, - ((KeyArgumentDeclarationList)(yyq.StackAt(2).m_value)) - , - ((CompoundStatement)(yyq.StackAt(0).m_value)) - ){}} - -public class IntArgStateEvent_1 : IntArgStateEvent { - public IntArgStateEvent_1(Parser yyq):base(yyq, - ((IntArgEvent)(yyq.StackAt(4).m_value)) - .yytext, - ((IntArgumentDeclarationList)(yyq.StackAt(2).m_value)) - , - ((CompoundStatement)(yyq.StackAt(0).m_value)) - ){}} - -public class VectorArgStateEvent_1 : VectorArgStateEvent { - public VectorArgStateEvent_1(Parser yyq):base(yyq, - ((VectorArgEvent)(yyq.StackAt(4).m_value)) - .yytext, - ((VectorArgumentDeclarationList)(yyq.StackAt(2).m_value)) - , - ((CompoundStatement)(yyq.StackAt(0).m_value)) - ){}} - -public class IntRotRotArgStateEvent_1 : IntRotRotArgStateEvent { - public IntRotRotArgStateEvent_1(Parser yyq):base(yyq, - ((IntRotRotArgEvent)(yyq.StackAt(4).m_value)) - .yytext, - ((IntRotRotArgumentDeclarationList)(yyq.StackAt(2).m_value)) - , - ((CompoundStatement)(yyq.StackAt(0).m_value)) - ){}} - -public class IntVecVecArgStateEvent_1 : IntVecVecArgStateEvent { - public IntVecVecArgStateEvent_1(Parser yyq):base(yyq, - ((IntVecVecArgEvent)(yyq.StackAt(4).m_value)) - .yytext, - ((IntVecVecArgumentDeclarationList)(yyq.StackAt(2).m_value)) - , - ((CompoundStatement)(yyq.StackAt(0).m_value)) - ){}} - -public class KeyIntIntArgStateEvent_1 : KeyIntIntArgStateEvent { - public KeyIntIntArgStateEvent_1(Parser yyq):base(yyq, - ((KeyIntIntArgEvent)(yyq.StackAt(4).m_value)) - .yytext, - ((KeyIntIntArgumentDeclarationList)(yyq.StackAt(2).m_value)) - , - ((CompoundStatement)(yyq.StackAt(0).m_value)) - ){}} - -public class ArgumentDeclarationList_1 : ArgumentDeclarationList { - public ArgumentDeclarationList_1(Parser yyq):base(yyq, - ((Declaration)(yyq.StackAt(0).m_value)) - ){}} - -public class ArgumentDeclarationList_2 : ArgumentDeclarationList { - public ArgumentDeclarationList_2(Parser yyq):base(yyq, - ((ArgumentDeclarationList)(yyq.StackAt(2).m_value)) - , - ((Declaration)(yyq.StackAt(0).m_value)) - ){}} - -public class KeyArgumentDeclarationList_1 : KeyArgumentDeclarationList { - public KeyArgumentDeclarationList_1(Parser yyq):base(yyq, - ((KeyDeclaration)(yyq.StackAt(0).m_value)) - ){}} - -public class IntArgumentDeclarationList_1 : IntArgumentDeclarationList { - public IntArgumentDeclarationList_1(Parser yyq):base(yyq, - ((IntDeclaration)(yyq.StackAt(0).m_value)) - ){}} - -public class VectorArgumentDeclarationList_1 : VectorArgumentDeclarationList { - public VectorArgumentDeclarationList_1(Parser yyq):base(yyq, - ((VecDeclaration)(yyq.StackAt(0).m_value)) - ){}} - -public class IntRotRotArgumentDeclarationList_1 : IntRotRotArgumentDeclarationList { - public IntRotRotArgumentDeclarationList_1(Parser yyq):base(yyq, - ((IntDeclaration)(yyq.StackAt(4).m_value)) - , - ((RotDeclaration)(yyq.StackAt(2).m_value)) - , - ((RotDeclaration)(yyq.StackAt(0).m_value)) - ){}} - -public class IntVecVecArgumentDeclarationList_1 : IntVecVecArgumentDeclarationList { - public IntVecVecArgumentDeclarationList_1(Parser yyq):base(yyq, - ((IntDeclaration)(yyq.StackAt(4).m_value)) - , - ((VecDeclaration)(yyq.StackAt(2).m_value)) - , - ((VecDeclaration)(yyq.StackAt(0).m_value)) - ){}} - -public class KeyIntIntArgumentDeclarationList_1 : KeyIntIntArgumentDeclarationList { - public KeyIntIntArgumentDeclarationList_1(Parser yyq):base(yyq, - ((KeyDeclaration)(yyq.StackAt(4).m_value)) - , - ((IntDeclaration)(yyq.StackAt(2).m_value)) - , - ((IntDeclaration)(yyq.StackAt(0).m_value)) - ){}} - -public class Declaration_1 : Declaration { - public Declaration_1(Parser yyq):base(yyq, - ((Typename)(yyq.StackAt(1).m_value)) - .yytext, - ((IDENT)(yyq.StackAt(0).m_value)) - .yytext){}} - -public class KeyDeclaration_1 : KeyDeclaration { - public KeyDeclaration_1(Parser yyq):base(yyq, - ((KEY_TYPE)(yyq.StackAt(1).m_value)) - .yytext, - ((IDENT)(yyq.StackAt(0).m_value)) - .yytext){}} - -public class IntDeclaration_1 : IntDeclaration { - public IntDeclaration_1(Parser yyq):base(yyq, - ((INTEGER_TYPE)(yyq.StackAt(1).m_value)) - .yytext, - ((IDENT)(yyq.StackAt(0).m_value)) - .yytext){}} - -public class VecDeclaration_1 : VecDeclaration { - public VecDeclaration_1(Parser yyq):base(yyq, - ((VECTOR_TYPE)(yyq.StackAt(1).m_value)) - .yytext, - ((IDENT)(yyq.StackAt(0).m_value)) - .yytext){}} - -public class RotDeclaration_1 : RotDeclaration { - public RotDeclaration_1(Parser yyq):base(yyq, - ((ROTATION_TYPE)(yyq.StackAt(1).m_value)) - .yytext, - ((IDENT)(yyq.StackAt(0).m_value)) - .yytext){}} - -public class CompoundStatement_1 : CompoundStatement { - public CompoundStatement_1(Parser yyq):base(yyq){}} - -public class CompoundStatement_2 : CompoundStatement { - public CompoundStatement_2(Parser yyq):base(yyq, - ((StatementList)(yyq.StackAt(1).m_value)) - ){}} - -public class StatementList_1 : StatementList { - public StatementList_1(Parser yyq):base(yyq, - ((Statement)(yyq.StackAt(0).m_value)) - ){}} - -public class StatementList_2 : StatementList { - public StatementList_2(Parser yyq):base(yyq, - ((StatementList)(yyq.StackAt(1).m_value)) - , - ((Statement)(yyq.StackAt(0).m_value)) - ){}} - -public class EmptyStatement_1 : EmptyStatement { - public EmptyStatement_1(Parser yyq):base(yyq){}} - -public class Statement_1 : Statement { - public Statement_1(Parser yyq):base(yyq, - ((EmptyStatement)(yyq.StackAt(1).m_value)) - ){}} - -public class Statement_2 : Statement { - public Statement_2(Parser yyq):base(yyq, - ((Declaration)(yyq.StackAt(1).m_value)) - ){}} - -public class Statement_3 : Statement { - public Statement_3(Parser yyq):base(yyq, - ((Assignment)(yyq.StackAt(1).m_value)) - ){}} - -public class Statement_4 : Statement { - public Statement_4(Parser yyq):base(yyq, - ((Expression)(yyq.StackAt(1).m_value)) - ){}} - -public class Statement_5 : Statement { - public Statement_5(Parser yyq):base(yyq, - ((ReturnStatement)(yyq.StackAt(1).m_value)) - ){}} - -public class Statement_6 : Statement { - public Statement_6(Parser yyq):base(yyq, - ((JumpLabel)(yyq.StackAt(1).m_value)) - ){}} - -public class Statement_7 : Statement { - public Statement_7(Parser yyq):base(yyq, - ((JumpStatement)(yyq.StackAt(1).m_value)) - ){}} - -public class Statement_8 : Statement { - public Statement_8(Parser yyq):base(yyq, - ((StateChange)(yyq.StackAt(1).m_value)) - ){}} - -public class Statement_9 : Statement { - public Statement_9(Parser yyq):base(yyq, - ((IfStatement)(yyq.StackAt(0).m_value)) - ){}} - -public class Statement_10 : Statement { - public Statement_10(Parser yyq):base(yyq, - ((WhileStatement)(yyq.StackAt(0).m_value)) - ){}} - -public class Statement_11 : Statement { - public Statement_11(Parser yyq):base(yyq, - ((DoWhileStatement)(yyq.StackAt(0).m_value)) - ){}} - -public class Statement_12 : Statement { - public Statement_12(Parser yyq):base(yyq, - ((ForLoop)(yyq.StackAt(0).m_value)) - ){}} - -public class Statement_13 : Statement { - public Statement_13(Parser yyq):base(yyq, - ((CompoundStatement)(yyq.StackAt(0).m_value)) - ){}} - -public class JumpLabel_1 : JumpLabel { - public JumpLabel_1(Parser yyq):base(yyq, - ((IDENT)(yyq.StackAt(0).m_value)) - .yytext){}} - -public class JumpStatement_1 : JumpStatement { - public JumpStatement_1(Parser yyq):base(yyq, - ((IDENT)(yyq.StackAt(0).m_value)) - .yytext){}} - -public class StateChange_1 : StateChange { - public StateChange_1(Parser yyq):base(yyq, - ((IDENT)(yyq.StackAt(0).m_value)) - .yytext){}} - -public class StateChange_2 : StateChange { - public StateChange_2(Parser yyq):base(yyq, - ((DEFAULT_STATE)(yyq.StackAt(0).m_value)) - .yytext){}} - -public class IfStatement_1 : IfStatement { - public IfStatement_1(Parser yyq):base(yyq, - ((Expression)(yyq.StackAt(2).m_value)) - , - ((Statement)(yyq.StackAt(0).m_value)) - ){}} - -public class IfStatement_2 : IfStatement { - public IfStatement_2(Parser yyq):base(yyq, - ((Expression)(yyq.StackAt(4).m_value)) - , - ((Statement)(yyq.StackAt(2).m_value)) - , - ((Statement)(yyq.StackAt(0).m_value)) - ){}} - -public class IfStatement_3 : IfStatement { - public IfStatement_3(Parser yyq):base(yyq, - ((SimpleAssignment)(yyq.StackAt(2).m_value)) - , - ((Statement)(yyq.StackAt(0).m_value)) - ){}} - -public class IfStatement_4 : IfStatement { - public IfStatement_4(Parser yyq):base(yyq, - ((SimpleAssignment)(yyq.StackAt(4).m_value)) - , - ((Statement)(yyq.StackAt(2).m_value)) - , - ((Statement)(yyq.StackAt(0).m_value)) - ){}} - -public class WhileStatement_1 : WhileStatement { - public WhileStatement_1(Parser yyq):base(yyq, - ((Expression)(yyq.StackAt(2).m_value)) - , - ((Statement)(yyq.StackAt(0).m_value)) - ){}} - -public class WhileStatement_2 : WhileStatement { - public WhileStatement_2(Parser yyq):base(yyq, - ((SimpleAssignment)(yyq.StackAt(2).m_value)) - , - ((Statement)(yyq.StackAt(0).m_value)) - ){}} - -public class DoWhileStatement_1 : DoWhileStatement { - public DoWhileStatement_1(Parser yyq):base(yyq, - ((Expression)(yyq.StackAt(2).m_value)) - , - ((Statement)(yyq.StackAt(5).m_value)) - ){}} - -public class DoWhileStatement_2 : DoWhileStatement { - public DoWhileStatement_2(Parser yyq):base(yyq, - ((SimpleAssignment)(yyq.StackAt(2).m_value)) - , - ((Statement)(yyq.StackAt(5).m_value)) - ){}} - -public class ForLoop_1 : ForLoop { - public ForLoop_1(Parser yyq):base(yyq, - ((ForLoopStatement)(yyq.StackAt(6).m_value)) - , - ((Expression)(yyq.StackAt(4).m_value)) - , - ((ForLoopStatement)(yyq.StackAt(2).m_value)) - , - ((Statement)(yyq.StackAt(0).m_value)) - ){}} - -public class ForLoop_2 : ForLoop { - public ForLoop_2(Parser yyq):base(yyq,null, - ((Expression)(yyq.StackAt(4).m_value)) - , - ((ForLoopStatement)(yyq.StackAt(2).m_value)) - , - ((Statement)(yyq.StackAt(0).m_value)) - ){}} - -public class ForLoopStatement_1 : ForLoopStatement { - public ForLoopStatement_1(Parser yyq):base(yyq, - ((Expression)(yyq.StackAt(0).m_value)) - ){}} - -public class ForLoopStatement_2 : ForLoopStatement { - public ForLoopStatement_2(Parser yyq):base(yyq, - ((SimpleAssignment)(yyq.StackAt(0).m_value)) - ){}} - -public class ForLoopStatement_3 : ForLoopStatement { - public ForLoopStatement_3(Parser yyq):base(yyq, - ((ForLoopStatement)(yyq.StackAt(2).m_value)) - , - ((Expression)(yyq.StackAt(0).m_value)) - ){}} - -public class ForLoopStatement_4 : ForLoopStatement { - public ForLoopStatement_4(Parser yyq):base(yyq, - ((ForLoopStatement)(yyq.StackAt(2).m_value)) - , - ((SimpleAssignment)(yyq.StackAt(0).m_value)) - ){}} - -public class Assignment_1 : Assignment { - public Assignment_1(Parser yyq):base(yyq, - ((Declaration)(yyq.StackAt(2).m_value)) - , - ((Expression)(yyq.StackAt(0).m_value)) - , - ((EQUALS)(yyq.StackAt(1).m_value)) - .yytext){}} - -public class Assignment_2 : Assignment { - public Assignment_2(Parser yyq):base(yyq, - ((SimpleAssignment)(yyq.StackAt(0).m_value)) - ){}} - -public class SimpleAssignment_1 : SimpleAssignment { - public SimpleAssignment_1(Parser yyq):base(yyq, - ((IDENT)(yyq.StackAt(2).m_value)) - , - ((Expression)(yyq.StackAt(0).m_value)) - , - ((EQUALS)(yyq.StackAt(1).m_value)) - .yytext){}} - -public class SimpleAssignment_2 : SimpleAssignment { - public SimpleAssignment_2(Parser yyq):base(yyq, - ((IDENT)(yyq.StackAt(2).m_value)) - , - ((Expression)(yyq.StackAt(0).m_value)) - , - ((PLUS_EQUALS)(yyq.StackAt(1).m_value)) - .yytext){}} - -public class SimpleAssignment_3 : SimpleAssignment { - public SimpleAssignment_3(Parser yyq):base(yyq, - ((IDENT)(yyq.StackAt(2).m_value)) - , - ((Expression)(yyq.StackAt(0).m_value)) - , - ((MINUS_EQUALS)(yyq.StackAt(1).m_value)) - .yytext){}} - -public class SimpleAssignment_4 : SimpleAssignment { - public SimpleAssignment_4(Parser yyq):base(yyq, - ((IDENT)(yyq.StackAt(2).m_value)) - , - ((Expression)(yyq.StackAt(0).m_value)) - , - ((STAR_EQUALS)(yyq.StackAt(1).m_value)) - .yytext){}} - -public class SimpleAssignment_5 : SimpleAssignment { - public SimpleAssignment_5(Parser yyq):base(yyq, - ((IDENT)(yyq.StackAt(2).m_value)) - , - ((Expression)(yyq.StackAt(0).m_value)) - , - ((SLASH_EQUALS)(yyq.StackAt(1).m_value)) - .yytext){}} - -public class SimpleAssignment_6 : SimpleAssignment { - public SimpleAssignment_6(Parser yyq):base(yyq, - ((IDENT)(yyq.StackAt(2).m_value)) - , - ((Expression)(yyq.StackAt(0).m_value)) - , - ((PERCENT_EQUALS)(yyq.StackAt(1).m_value)) - .yytext){}} - -public class SimpleAssignment_7 : SimpleAssignment { - public SimpleAssignment_7(Parser yyq):base(yyq,new IdentDotExpression(((LSLSyntax -)yyq), - ((IDENT)(yyq.StackAt(4).m_value)) - .yytext, - ((IDENT)(yyq.StackAt(2).m_value)) - .yytext), - ((Expression)(yyq.StackAt(0).m_value)) - , - ((EQUALS)(yyq.StackAt(1).m_value)) - .yytext){}} - -public class SimpleAssignment_8 : SimpleAssignment { - public SimpleAssignment_8(Parser yyq):base(yyq,new IdentDotExpression(((LSLSyntax -)yyq), - ((IDENT)(yyq.StackAt(4).m_value)) - .yytext, - ((IDENT)(yyq.StackAt(2).m_value)) - .yytext), - ((Expression)(yyq.StackAt(0).m_value)) - , - ((PLUS_EQUALS)(yyq.StackAt(1).m_value)) - .yytext){}} - -public class SimpleAssignment_9 : SimpleAssignment { - public SimpleAssignment_9(Parser yyq):base(yyq,new IdentDotExpression(((LSLSyntax -)yyq), - ((IDENT)(yyq.StackAt(4).m_value)) - .yytext, - ((IDENT)(yyq.StackAt(2).m_value)) - .yytext), - ((Expression)(yyq.StackAt(0).m_value)) - , - ((MINUS_EQUALS)(yyq.StackAt(1).m_value)) - .yytext){}} - -public class SimpleAssignment_10 : SimpleAssignment { - public SimpleAssignment_10(Parser yyq):base(yyq,new IdentDotExpression(((LSLSyntax -)yyq), - ((IDENT)(yyq.StackAt(4).m_value)) - .yytext, - ((IDENT)(yyq.StackAt(2).m_value)) - .yytext), - ((Expression)(yyq.StackAt(0).m_value)) - , - ((STAR_EQUALS)(yyq.StackAt(1).m_value)) - .yytext){}} - -public class SimpleAssignment_11 : SimpleAssignment { - public SimpleAssignment_11(Parser yyq):base(yyq,new IdentDotExpression(((LSLSyntax -)yyq), - ((IDENT)(yyq.StackAt(4).m_value)) - .yytext, - ((IDENT)(yyq.StackAt(2).m_value)) - .yytext), - ((Expression)(yyq.StackAt(0).m_value)) - , - ((SLASH_EQUALS)(yyq.StackAt(1).m_value)) - .yytext){}} - -public class SimpleAssignment_12 : SimpleAssignment { - public SimpleAssignment_12(Parser yyq):base(yyq,new IdentDotExpression(((LSLSyntax -)yyq), - ((IDENT)(yyq.StackAt(4).m_value)) - .yytext, - ((IDENT)(yyq.StackAt(2).m_value)) - .yytext), - ((Expression)(yyq.StackAt(0).m_value)) - , - ((PERCENT_EQUALS)(yyq.StackAt(1).m_value)) - .yytext){}} - -public class SimpleAssignment_13 : SimpleAssignment { - public SimpleAssignment_13(Parser yyq):base(yyq, - ((IDENT)(yyq.StackAt(2).m_value)) - , - ((SimpleAssignment)(yyq.StackAt(0).m_value)) - , - ((EQUALS)(yyq.StackAt(1).m_value)) - .yytext){}} - -public class SimpleAssignment_14 : SimpleAssignment { - public SimpleAssignment_14(Parser yyq):base(yyq, - ((IDENT)(yyq.StackAt(2).m_value)) - , - ((SimpleAssignment)(yyq.StackAt(0).m_value)) - , - ((PLUS_EQUALS)(yyq.StackAt(1).m_value)) - .yytext){}} - -public class SimpleAssignment_15 : SimpleAssignment { - public SimpleAssignment_15(Parser yyq):base(yyq, - ((IDENT)(yyq.StackAt(2).m_value)) - , - ((SimpleAssignment)(yyq.StackAt(0).m_value)) - , - ((MINUS_EQUALS)(yyq.StackAt(1).m_value)) - .yytext){}} - -public class SimpleAssignment_16 : SimpleAssignment { - public SimpleAssignment_16(Parser yyq):base(yyq, - ((IDENT)(yyq.StackAt(2).m_value)) - , - ((SimpleAssignment)(yyq.StackAt(0).m_value)) - , - ((STAR_EQUALS)(yyq.StackAt(1).m_value)) - .yytext){}} - -public class SimpleAssignment_17 : SimpleAssignment { - public SimpleAssignment_17(Parser yyq):base(yyq, - ((IDENT)(yyq.StackAt(2).m_value)) - , - ((SimpleAssignment)(yyq.StackAt(0).m_value)) - , - ((SLASH_EQUALS)(yyq.StackAt(1).m_value)) - .yytext){}} - -public class SimpleAssignment_18 : SimpleAssignment { - public SimpleAssignment_18(Parser yyq):base(yyq, - ((IDENT)(yyq.StackAt(2).m_value)) - , - ((SimpleAssignment)(yyq.StackAt(0).m_value)) - , - ((PERCENT_EQUALS)(yyq.StackAt(1).m_value)) - .yytext){}} - -public class SimpleAssignment_19 : SimpleAssignment { - public SimpleAssignment_19(Parser yyq):base(yyq,new IdentDotExpression(((LSLSyntax -)yyq), - ((IDENT)(yyq.StackAt(4).m_value)) - .yytext, - ((IDENT)(yyq.StackAt(2).m_value)) - .yytext), - ((SimpleAssignment)(yyq.StackAt(0).m_value)) - , - ((EQUALS)(yyq.StackAt(1).m_value)) - .yytext){}} - -public class SimpleAssignment_20 : SimpleAssignment { - public SimpleAssignment_20(Parser yyq):base(yyq,new IdentDotExpression(((LSLSyntax -)yyq), - ((IDENT)(yyq.StackAt(4).m_value)) - .yytext, - ((IDENT)(yyq.StackAt(2).m_value)) - .yytext), - ((SimpleAssignment)(yyq.StackAt(0).m_value)) - , - ((PLUS_EQUALS)(yyq.StackAt(1).m_value)) - .yytext){}} - -public class SimpleAssignment_21 : SimpleAssignment { - public SimpleAssignment_21(Parser yyq):base(yyq,new IdentDotExpression(((LSLSyntax -)yyq), - ((IDENT)(yyq.StackAt(4).m_value)) - .yytext, - ((IDENT)(yyq.StackAt(2).m_value)) - .yytext), - ((SimpleAssignment)(yyq.StackAt(0).m_value)) - , - ((MINUS_EQUALS)(yyq.StackAt(1).m_value)) - .yytext){}} - -public class SimpleAssignment_22 : SimpleAssignment { - public SimpleAssignment_22(Parser yyq):base(yyq,new IdentDotExpression(((LSLSyntax -)yyq), - ((IDENT)(yyq.StackAt(4).m_value)) - .yytext, - ((IDENT)(yyq.StackAt(2).m_value)) - .yytext), - ((SimpleAssignment)(yyq.StackAt(0).m_value)) - , - ((STAR_EQUALS)(yyq.StackAt(1).m_value)) - .yytext){}} - -public class SimpleAssignment_23 : SimpleAssignment { - public SimpleAssignment_23(Parser yyq):base(yyq,new IdentDotExpression(((LSLSyntax -)yyq), - ((IDENT)(yyq.StackAt(4).m_value)) - .yytext, - ((IDENT)(yyq.StackAt(2).m_value)) - .yytext), - ((SimpleAssignment)(yyq.StackAt(0).m_value)) - , - ((SLASH_EQUALS)(yyq.StackAt(1).m_value)) - .yytext){}} - -public class SimpleAssignment_24 : SimpleAssignment { - public SimpleAssignment_24(Parser yyq):base(yyq,new IdentDotExpression(((LSLSyntax -)yyq), - ((IDENT)(yyq.StackAt(4).m_value)) - .yytext, - ((IDENT)(yyq.StackAt(2).m_value)) - .yytext), - ((SimpleAssignment)(yyq.StackAt(0).m_value)) - , - ((PERCENT_EQUALS)(yyq.StackAt(1).m_value)) - .yytext){}} - -public class ReturnStatement_1 : ReturnStatement { - public ReturnStatement_1(Parser yyq):base(yyq, - ((Expression)(yyq.StackAt(0).m_value)) - ){}} - -public class ReturnStatement_2 : ReturnStatement { - public ReturnStatement_2(Parser yyq):base(yyq){}} - -public class Constant_1 : Constant { - public Constant_1(Parser yyq):base(yyq,"integer", - ((INTEGER_CONSTANT)(yyq.StackAt(0).m_value)) - .yytext){}} - -public class Constant_2 : Constant { - public Constant_2(Parser yyq):base(yyq,"integer", - ((HEX_INTEGER_CONSTANT)(yyq.StackAt(0).m_value)) - .yytext){}} - -public class Constant_3 : Constant { - public Constant_3(Parser yyq):base(yyq,"float", - ((FLOAT_CONSTANT)(yyq.StackAt(0).m_value)) - .yytext){}} - -public class Constant_4 : Constant { - public Constant_4(Parser yyq):base(yyq,"string", - ((STRING_CONSTANT)(yyq.StackAt(0).m_value)) - .yytext){}} - -public class ListConstant_1 : ListConstant { - public ListConstant_1(Parser yyq):base(yyq, - ((ArgumentList)(yyq.StackAt(1).m_value)) - ){}} - -public class VectorConstant_1 : VectorConstant { - public VectorConstant_1(Parser yyq):base(yyq, - ((Expression)(yyq.StackAt(5).m_value)) - , - ((Expression)(yyq.StackAt(3).m_value)) - , - ((Expression)(yyq.StackAt(1).m_value)) - ){}} - -public class RotationConstant_1 : RotationConstant { - public RotationConstant_1(Parser yyq):base(yyq, - ((Expression)(yyq.StackAt(7).m_value)) - , - ((Expression)(yyq.StackAt(5).m_value)) - , - ((Expression)(yyq.StackAt(3).m_value)) - , - ((Expression)(yyq.StackAt(1).m_value)) - ){}} - -public class ConstantExpression_1 : ConstantExpression { - public ConstantExpression_1(Parser yyq):base(yyq, - ((Constant)(yyq.StackAt(0).m_value)) - ){}} - -public class IdentExpression_1 : IdentExpression { - public IdentExpression_1(Parser yyq):base(yyq, - ((IDENT)(yyq.StackAt(0).m_value)) - .yytext){}} - -public class IdentDotExpression_1 : IdentDotExpression { - public IdentDotExpression_1(Parser yyq):base(yyq, - ((IDENT)(yyq.StackAt(2).m_value)) - .yytext, - ((IDENT)(yyq.StackAt(0).m_value)) - .yytext){}} - -public class IncrementDecrementExpression_1 : IncrementDecrementExpression { - public IncrementDecrementExpression_1(Parser yyq):base(yyq, - ((IDENT)(yyq.StackAt(1).m_value)) - .yytext, - ((INCREMENT)(yyq.StackAt(0).m_value)) - .yytext, true){}} - -public class IncrementDecrementExpression_2 : IncrementDecrementExpression { - public IncrementDecrementExpression_2(Parser yyq):base(yyq, - ((IDENT)(yyq.StackAt(1).m_value)) - .yytext, - ((DECREMENT)(yyq.StackAt(0).m_value)) - .yytext, true){}} - -public class IncrementDecrementExpression_3 : IncrementDecrementExpression { - public IncrementDecrementExpression_3(Parser yyq):base(yyq,new IdentDotExpression(((LSLSyntax -)yyq), - ((IDENT)(yyq.StackAt(3).m_value)) - .yytext, - ((IDENT)(yyq.StackAt(1).m_value)) - .yytext), - ((INCREMENT)(yyq.StackAt(0).m_value)) - .yytext, true){}} - -public class IncrementDecrementExpression_4 : IncrementDecrementExpression { - public IncrementDecrementExpression_4(Parser yyq):base(yyq,new IdentDotExpression(((LSLSyntax -)yyq), - ((IDENT)(yyq.StackAt(3).m_value)) - .yytext, - ((IDENT)(yyq.StackAt(1).m_value)) - .yytext), - ((DECREMENT)(yyq.StackAt(0).m_value)) - .yytext, true){}} - -public class IncrementDecrementExpression_5 : IncrementDecrementExpression { - public IncrementDecrementExpression_5(Parser yyq):base(yyq, - ((IDENT)(yyq.StackAt(0).m_value)) - .yytext, - ((INCREMENT)(yyq.StackAt(1).m_value)) - .yytext, false){}} - -public class IncrementDecrementExpression_6 : IncrementDecrementExpression { - public IncrementDecrementExpression_6(Parser yyq):base(yyq, - ((IDENT)(yyq.StackAt(0).m_value)) - .yytext, - ((DECREMENT)(yyq.StackAt(1).m_value)) - .yytext, false){}} - -public class IncrementDecrementExpression_7 : IncrementDecrementExpression { - public IncrementDecrementExpression_7(Parser yyq):base(yyq,new IdentDotExpression(((LSLSyntax -)yyq), - ((IDENT)(yyq.StackAt(2).m_value)) - .yytext, - ((IDENT)(yyq.StackAt(0).m_value)) - .yytext), - ((INCREMENT)(yyq.StackAt(3).m_value)) - .yytext, false){}} - -public class IncrementDecrementExpression_8 : IncrementDecrementExpression { - public IncrementDecrementExpression_8(Parser yyq):base(yyq,new IdentDotExpression(((LSLSyntax -)yyq), - ((IDENT)(yyq.StackAt(2).m_value)) - .yytext, - ((IDENT)(yyq.StackAt(0).m_value)) - .yytext), - ((DECREMENT)(yyq.StackAt(3).m_value)) - .yytext, false){}} - -public class FunctionCallExpression_1 : FunctionCallExpression { - public FunctionCallExpression_1(Parser yyq):base(yyq, - ((FunctionCall)(yyq.StackAt(0).m_value)) - ){}} - -public class BinaryExpression_1 : BinaryExpression { - public BinaryExpression_1(Parser yyq):base(yyq, - ((Expression)(yyq.StackAt(2).m_value)) - , - ((Expression)(yyq.StackAt(0).m_value)) - , - ((PLUS)(yyq.StackAt(1).m_value)) - .yytext){}} - -public class BinaryExpression_2 : BinaryExpression { - public BinaryExpression_2(Parser yyq):base(yyq, - ((Expression)(yyq.StackAt(2).m_value)) - , - ((Expression)(yyq.StackAt(0).m_value)) - , - ((MINUS)(yyq.StackAt(1).m_value)) - .yytext){}} - -public class BinaryExpression_3 : BinaryExpression { - public BinaryExpression_3(Parser yyq):base(yyq, - ((Expression)(yyq.StackAt(2).m_value)) - , - ((Expression)(yyq.StackAt(0).m_value)) - , - ((STAR)(yyq.StackAt(1).m_value)) - .yytext){}} - -public class BinaryExpression_4 : BinaryExpression { - public BinaryExpression_4(Parser yyq):base(yyq, - ((Expression)(yyq.StackAt(2).m_value)) - , - ((Expression)(yyq.StackAt(0).m_value)) - , - ((SLASH)(yyq.StackAt(1).m_value)) - .yytext){}} - -public class BinaryExpression_5 : BinaryExpression { - public BinaryExpression_5(Parser yyq):base(yyq, - ((Expression)(yyq.StackAt(2).m_value)) - , - ((Expression)(yyq.StackAt(0).m_value)) - , - ((PERCENT)(yyq.StackAt(1).m_value)) - .yytext){}} - -public class BinaryExpression_6 : BinaryExpression { - public BinaryExpression_6(Parser yyq):base(yyq, - ((Expression)(yyq.StackAt(2).m_value)) - , - ((Expression)(yyq.StackAt(0).m_value)) - , - ((AMP)(yyq.StackAt(1).m_value)) - .yytext){}} - -public class BinaryExpression_7 : BinaryExpression { - public BinaryExpression_7(Parser yyq):base(yyq, - ((Expression)(yyq.StackAt(2).m_value)) - , - ((Expression)(yyq.StackAt(0).m_value)) - , - ((STROKE)(yyq.StackAt(1).m_value)) - .yytext){}} - -public class BinaryExpression_8 : BinaryExpression { - public BinaryExpression_8(Parser yyq):base(yyq, - ((Expression)(yyq.StackAt(2).m_value)) - , - ((Expression)(yyq.StackAt(0).m_value)) - , - ((CARET)(yyq.StackAt(1).m_value)) - .yytext){}} - -public class BinaryExpression_9 : BinaryExpression { - public BinaryExpression_9(Parser yyq):base(yyq, - ((Expression)(yyq.StackAt(2).m_value)) - , - ((Expression)(yyq.StackAt(0).m_value)) - , - ((RIGHT_ANGLE)(yyq.StackAt(1).m_value)) - .yytext){}} - -public class BinaryExpression_10 : BinaryExpression { - public BinaryExpression_10(Parser yyq):base(yyq, - ((Expression)(yyq.StackAt(2).m_value)) - , - ((Expression)(yyq.StackAt(0).m_value)) - , - ((LEFT_ANGLE)(yyq.StackAt(1).m_value)) - .yytext){}} - -public class BinaryExpression_11 : BinaryExpression { - public BinaryExpression_11(Parser yyq):base(yyq, - ((Expression)(yyq.StackAt(2).m_value)) - , - ((Expression)(yyq.StackAt(0).m_value)) - , - ((EQUALS_EQUALS)(yyq.StackAt(1).m_value)) - .yytext){}} - -public class BinaryExpression_12 : BinaryExpression { - public BinaryExpression_12(Parser yyq):base(yyq, - ((Expression)(yyq.StackAt(2).m_value)) - , - ((Expression)(yyq.StackAt(0).m_value)) - , - ((EXCLAMATION_EQUALS)(yyq.StackAt(1).m_value)) - .yytext){}} - -public class BinaryExpression_13 : BinaryExpression { - public BinaryExpression_13(Parser yyq):base(yyq, - ((Expression)(yyq.StackAt(2).m_value)) - , - ((Expression)(yyq.StackAt(0).m_value)) - , - ((LESS_EQUALS)(yyq.StackAt(1).m_value)) - .yytext){}} - -public class BinaryExpression_14 : BinaryExpression { - public BinaryExpression_14(Parser yyq):base(yyq, - ((Expression)(yyq.StackAt(2).m_value)) - , - ((Expression)(yyq.StackAt(0).m_value)) - , - ((GREATER_EQUALS)(yyq.StackAt(1).m_value)) - .yytext){}} - -public class BinaryExpression_15 : BinaryExpression { - public BinaryExpression_15(Parser yyq):base(yyq, - ((Expression)(yyq.StackAt(2).m_value)) - , - ((Expression)(yyq.StackAt(0).m_value)) - , - ((AMP_AMP)(yyq.StackAt(1).m_value)) - .yytext){}} - -public class BinaryExpression_16 : BinaryExpression { - public BinaryExpression_16(Parser yyq):base(yyq, - ((Expression)(yyq.StackAt(2).m_value)) - , - ((Expression)(yyq.StackAt(0).m_value)) - , - ((STROKE_STROKE)(yyq.StackAt(1).m_value)) - .yytext){}} - -public class BinaryExpression_17 : BinaryExpression { - public BinaryExpression_17(Parser yyq):base(yyq, - ((Expression)(yyq.StackAt(2).m_value)) - , - ((Expression)(yyq.StackAt(0).m_value)) - , - ((LEFT_SHIFT)(yyq.StackAt(1).m_value)) - .yytext){}} - -public class BinaryExpression_18 : BinaryExpression { - public BinaryExpression_18(Parser yyq):base(yyq, - ((Expression)(yyq.StackAt(2).m_value)) - , - ((Expression)(yyq.StackAt(0).m_value)) - , - ((RIGHT_SHIFT)(yyq.StackAt(1).m_value)) - .yytext){}} - -public class UnaryExpression_1 : UnaryExpression { - public UnaryExpression_1(Parser yyq):base(yyq, - ((EXCLAMATION)(yyq.StackAt(1).m_value)) - .yytext, - ((Expression)(yyq.StackAt(0).m_value)) - ){}} - -public class UnaryExpression_2 : UnaryExpression { - public UnaryExpression_2(Parser yyq):base(yyq, - ((MINUS)(yyq.StackAt(1).m_value)) - .yytext, - ((Expression)(yyq.StackAt(0).m_value)) - ){}} - -public class UnaryExpression_3 : UnaryExpression { - public UnaryExpression_3(Parser yyq):base(yyq, - ((TILDE)(yyq.StackAt(1).m_value)) - .yytext, - ((Expression)(yyq.StackAt(0).m_value)) - ){}} - -public class ParenthesisExpression_1 : ParenthesisExpression { - public ParenthesisExpression_1(Parser yyq):base(yyq, - ((Expression)(yyq.StackAt(1).m_value)) - ){}} - -public class ParenthesisExpression_2 : ParenthesisExpression { - public ParenthesisExpression_2(Parser yyq):base(yyq, - ((SimpleAssignment)(yyq.StackAt(1).m_value)) - ){}} - -public class TypecastExpression_1 : TypecastExpression { - public TypecastExpression_1(Parser yyq):base(yyq, - ((Typename)(yyq.StackAt(2).m_value)) - .yytext, - ((Constant)(yyq.StackAt(0).m_value)) - ){}} - -public class TypecastExpression_2 : TypecastExpression { - public TypecastExpression_2(Parser yyq):base(yyq, - ((Typename)(yyq.StackAt(2).m_value)) - .yytext, new IdentExpression(((LSLSyntax -)yyq), - ((IDENT)(yyq.StackAt(0).m_value)) - .yytext)){}} - -public class TypecastExpression_3 : TypecastExpression { - public TypecastExpression_3(Parser yyq):base(yyq, - ((Typename)(yyq.StackAt(4).m_value)) - .yytext, new IdentDotExpression(((LSLSyntax -)yyq), - ((IDENT)(yyq.StackAt(2).m_value)) - .yytext, - ((IDENT)(yyq.StackAt(0).m_value)) - .yytext)){}} - -public class TypecastExpression_4 : TypecastExpression { - public TypecastExpression_4(Parser yyq):base(yyq, - ((Typename)(yyq.StackAt(3).m_value)) - .yytext, new IncrementDecrementExpression(((LSLSyntax -)yyq), - ((IDENT)(yyq.StackAt(1).m_value)) - .yytext, - ((INCREMENT)(yyq.StackAt(0).m_value)) - .yytext, true)){}} - -public class TypecastExpression_5 : TypecastExpression { - public TypecastExpression_5(Parser yyq):base(yyq, - ((Typename)(yyq.StackAt(5).m_value)) - .yytext, new IncrementDecrementExpression(((LSLSyntax -)yyq), new IdentDotExpression(((LSLSyntax -)yyq), - ((IDENT)(yyq.StackAt(3).m_value)) - .yytext, - ((IDENT)(yyq.StackAt(1).m_value)) - .yytext), - ((INCREMENT)(yyq.StackAt(0).m_value)) - .yytext, true)){}} - -public class TypecastExpression_6 : TypecastExpression { - public TypecastExpression_6(Parser yyq):base(yyq, - ((Typename)(yyq.StackAt(3).m_value)) - .yytext, new IncrementDecrementExpression(((LSLSyntax -)yyq), - ((IDENT)(yyq.StackAt(1).m_value)) - .yytext, - ((DECREMENT)(yyq.StackAt(0).m_value)) - .yytext, true)){}} - -public class TypecastExpression_7 : TypecastExpression { - public TypecastExpression_7(Parser yyq):base(yyq, - ((Typename)(yyq.StackAt(5).m_value)) - .yytext, new IncrementDecrementExpression(((LSLSyntax -)yyq), new IdentDotExpression(((LSLSyntax -)yyq), - ((IDENT)(yyq.StackAt(3).m_value)) - .yytext, - ((IDENT)(yyq.StackAt(1).m_value)) - .yytext), - ((DECREMENT)(yyq.StackAt(0).m_value)) - .yytext, true)){}} - -public class TypecastExpression_8 : TypecastExpression { - public TypecastExpression_8(Parser yyq):base(yyq, - ((Typename)(yyq.StackAt(2).m_value)) - .yytext, - ((FunctionCall)(yyq.StackAt(0).m_value)) - ){}} - -public class TypecastExpression_9 : TypecastExpression { - public TypecastExpression_9(Parser yyq):base(yyq, - ((Typename)(yyq.StackAt(4).m_value)) - .yytext, - ((Expression)(yyq.StackAt(1).m_value)) - ){}} - -public class FunctionCall_1 : FunctionCall { - public FunctionCall_1(Parser yyq):base(yyq, - ((IDENT)(yyq.StackAt(3).m_value)) - .yytext, - ((ArgumentList)(yyq.StackAt(1).m_value)) - ){}} - -public class ArgumentList_1 : ArgumentList { - public ArgumentList_1(Parser yyq):base(yyq, - ((Argument)(yyq.StackAt(0).m_value)) - ){}} - -public class ArgumentList_2 : ArgumentList { - public ArgumentList_2(Parser yyq):base(yyq, - ((ArgumentList)(yyq.StackAt(2).m_value)) - , - ((Argument)(yyq.StackAt(0).m_value)) - ){}} - -public class ExpressionArgument_1 : ExpressionArgument { - public ExpressionArgument_1(Parser yyq):base(yyq, - ((Expression)(yyq.StackAt(0).m_value)) - ){}} - -public class Typename_1 : Typename { - public Typename_1(Parser yyq):base(yyq, - ((INTEGER_TYPE)(yyq.StackAt(0).m_value)) - .yytext){}} - -public class Typename_2 : Typename { - public Typename_2(Parser yyq):base(yyq, - ((FLOAT_TYPE)(yyq.StackAt(0).m_value)) - .yytext){}} - -public class Typename_3 : Typename { - public Typename_3(Parser yyq):base(yyq, - ((STRING_TYPE)(yyq.StackAt(0).m_value)) - .yytext){}} - -public class Typename_4 : Typename { - public Typename_4(Parser yyq):base(yyq, - ((KEY_TYPE)(yyq.StackAt(0).m_value)) - .yytext){}} - -public class Typename_5 : Typename { - public Typename_5(Parser yyq):base(yyq, - ((VECTOR_TYPE)(yyq.StackAt(0).m_value)) - .yytext){}} - -public class Typename_6 : Typename { - public Typename_6(Parser yyq):base(yyq, - ((ROTATION_TYPE)(yyq.StackAt(0).m_value)) - .yytext){}} - -public class Typename_7 : Typename { - public Typename_7(Parser yyq):base(yyq, - ((LIST_TYPE)(yyq.StackAt(0).m_value)) - .yytext){}} - -public class Event_1 : Event { - public Event_1(Parser yyq):base(yyq, - ((DATASERVER_EVENT)(yyq.StackAt(0).m_value)) - .yytext){}} - -public class Event_2 : Event { - public Event_2(Parser yyq):base(yyq, - ((EMAIL_EVENT)(yyq.StackAt(0).m_value)) - .yytext){}} - -public class Event_3 : Event { - public Event_3(Parser yyq):base(yyq, - ((HTTP_RESPONSE_EVENT)(yyq.StackAt(0).m_value)) - .yytext){}} - -public class Event_4 : Event { - public Event_4(Parser yyq):base(yyq, - ((LINK_MESSAGE_EVENT)(yyq.StackAt(0).m_value)) - .yytext){}} - -public class Event_5 : Event { - public Event_5(Parser yyq):base(yyq, - ((LISTEN_EVENT)(yyq.StackAt(0).m_value)) - .yytext){}} - -public class Event_6 : Event { - public Event_6(Parser yyq):base(yyq, - ((MONEY_EVENT)(yyq.StackAt(0).m_value)) - .yytext){}} - -public class Event_7 : Event { - public Event_7(Parser yyq):base(yyq, - ((REMOTE_DATA_EVENT)(yyq.StackAt(0).m_value)) - .yytext){}} - -public class Event_8 : Event { - public Event_8(Parser yyq):base(yyq, - ((HTTP_REQUEST_EVENT)(yyq.StackAt(0).m_value)) - .yytext){}} - -public class Event_9 : Event { - public Event_9(Parser yyq):base(yyq, - ((TRANSACTION_RESULT_EVENT)(yyq.StackAt(0).m_value)) - .yytext){}} - -public class VoidArgEvent_1 : VoidArgEvent { - public VoidArgEvent_1(Parser yyq):base(yyq, - ((STATE_ENTRY_EVENT)(yyq.StackAt(0).m_value)) - .yytext){}} - -public class VoidArgEvent_2 : VoidArgEvent { - public VoidArgEvent_2(Parser yyq):base(yyq, - ((STATE_EXIT_EVENT)(yyq.StackAt(0).m_value)) - .yytext){}} - -public class VoidArgEvent_3 : VoidArgEvent { - public VoidArgEvent_3(Parser yyq):base(yyq, - ((MOVING_END_EVENT)(yyq.StackAt(0).m_value)) - .yytext){}} - -public class VoidArgEvent_4 : VoidArgEvent { - public VoidArgEvent_4(Parser yyq):base(yyq, - ((MOVING_START_EVENT)(yyq.StackAt(0).m_value)) - .yytext){}} - -public class VoidArgEvent_5 : VoidArgEvent { - public VoidArgEvent_5(Parser yyq):base(yyq, - ((NO_SENSOR_EVENT)(yyq.StackAt(0).m_value)) - .yytext){}} - -public class VoidArgEvent_6 : VoidArgEvent { - public VoidArgEvent_6(Parser yyq):base(yyq, - ((NOT_AT_ROT_TARGET_EVENT)(yyq.StackAt(0).m_value)) - .yytext){}} - -public class VoidArgEvent_7 : VoidArgEvent { - public VoidArgEvent_7(Parser yyq):base(yyq, - ((NOT_AT_TARGET_EVENT)(yyq.StackAt(0).m_value)) - .yytext){}} - -public class VoidArgEvent_8 : VoidArgEvent { - public VoidArgEvent_8(Parser yyq):base(yyq, - ((TIMER_EVENT)(yyq.StackAt(0).m_value)) - .yytext){}} - -public class KeyArgEvent_1 : KeyArgEvent { - public KeyArgEvent_1(Parser yyq):base(yyq, - ((ATTACH_EVENT)(yyq.StackAt(0).m_value)) - .yytext){}} - -public class KeyArgEvent_2 : KeyArgEvent { - public KeyArgEvent_2(Parser yyq):base(yyq, - ((OBJECT_REZ_EVENT)(yyq.StackAt(0).m_value)) - .yytext){}} - -public class IntArgEvent_1 : IntArgEvent { - public IntArgEvent_1(Parser yyq):base(yyq, - ((CHANGED_EVENT)(yyq.StackAt(0).m_value)) - .yytext){}} - -public class IntArgEvent_2 : IntArgEvent { - public IntArgEvent_2(Parser yyq):base(yyq, - ((COLLISION_EVENT)(yyq.StackAt(0).m_value)) - .yytext){}} - -public class IntArgEvent_3 : IntArgEvent { - public IntArgEvent_3(Parser yyq):base(yyq, - ((COLLISION_END_EVENT)(yyq.StackAt(0).m_value)) - .yytext){}} - -public class IntArgEvent_4 : IntArgEvent { - public IntArgEvent_4(Parser yyq):base(yyq, - ((COLLISION_START_EVENT)(yyq.StackAt(0).m_value)) - .yytext){}} - -public class IntArgEvent_5 : IntArgEvent { - public IntArgEvent_5(Parser yyq):base(yyq, - ((ON_REZ_EVENT)(yyq.StackAt(0).m_value)) - .yytext){}} - -public class IntArgEvent_6 : IntArgEvent { - public IntArgEvent_6(Parser yyq):base(yyq, - ((RUN_TIME_PERMISSIONS_EVENT)(yyq.StackAt(0).m_value)) - .yytext){}} - -public class IntArgEvent_7 : IntArgEvent { - public IntArgEvent_7(Parser yyq):base(yyq, - ((SENSOR_EVENT)(yyq.StackAt(0).m_value)) - .yytext){}} - -public class IntArgEvent_8 : IntArgEvent { - public IntArgEvent_8(Parser yyq):base(yyq, - ((TOUCH_EVENT)(yyq.StackAt(0).m_value)) - .yytext){}} - -public class IntArgEvent_9 : IntArgEvent { - public IntArgEvent_9(Parser yyq):base(yyq, - ((TOUCH_END_EVENT)(yyq.StackAt(0).m_value)) - .yytext){}} - -public class IntArgEvent_10 : IntArgEvent { - public IntArgEvent_10(Parser yyq):base(yyq, - ((TOUCH_START_EVENT)(yyq.StackAt(0).m_value)) - .yytext){}} - -public class VectorArgEvent_1 : VectorArgEvent { - public VectorArgEvent_1(Parser yyq):base(yyq, - ((LAND_COLLISION_EVENT)(yyq.StackAt(0).m_value)) - .yytext){}} - -public class VectorArgEvent_2 : VectorArgEvent { - public VectorArgEvent_2(Parser yyq):base(yyq, - ((LAND_COLLISION_END_EVENT)(yyq.StackAt(0).m_value)) - .yytext){}} - -public class VectorArgEvent_3 : VectorArgEvent { - public VectorArgEvent_3(Parser yyq):base(yyq, - ((LAND_COLLISION_START_EVENT)(yyq.StackAt(0).m_value)) - .yytext){}} - -public class IntRotRotArgEvent_1 : IntRotRotArgEvent { - public IntRotRotArgEvent_1(Parser yyq):base(yyq, - ((AT_ROT_TARGET_EVENT)(yyq.StackAt(0).m_value)) - .yytext){}} - -public class IntVecVecArgEvent_1 : IntVecVecArgEvent { - public IntVecVecArgEvent_1(Parser yyq):base(yyq, - ((AT_TARGET_EVENT)(yyq.StackAt(0).m_value)) - .yytext){}} - -public class KeyIntIntArgEvent_1 : KeyIntIntArgEvent { - public KeyIntIntArgEvent_1(Parser yyq):base(yyq, - ((CONTROL_EVENT)(yyq.StackAt(0).m_value)) - .yytext){}} -public class yyLSLSyntax -: YyParser { - public override object Action(Parser yyq,SYMBOL yysym, int yyact) { - switch(yyact) { - case -1: break; //// keep compiler happy -} return null; } - -public class ArgumentDeclarationList_3 : ArgumentDeclarationList { - public ArgumentDeclarationList_3(Parser yyq):base(yyq){}} - -public class ArgumentList_3 : ArgumentList { - public ArgumentList_3(Parser yyq):base(yyq){}} - -public class ArgumentList_4 : ArgumentList { - public ArgumentList_4(Parser yyq):base(yyq){}} - -public class ArgumentDeclarationList_4 : ArgumentDeclarationList { - public ArgumentDeclarationList_4(Parser yyq):base(yyq){}} - -public class ArgumentDeclarationList_5 : ArgumentDeclarationList { - public ArgumentDeclarationList_5(Parser yyq):base(yyq){}} -public yyLSLSyntax -():base() { arr = new int[] { -101,4,6,52,0, -46,0,53,0,102, -20,103,4,28,76, -0,83,0,76,0, -80,0,114,0,111, -0,103,0,114,0, -97,0,109,0,82, -0,111,0,111,0, -116,0,1,97,1, -2,104,18,1,2845, -102,2,0,105,5, -395,1,1224,106,18, -1,1224,107,20,108, -4,32,83,0,105, -0,109,0,112,0, -108,0,101,0,65, -0,115,0,115,0, -105,0,103,0,110, -0,109,0,101,0, -110,0,116,0,1, -138,1,2,2,0, -1,2043,109,18,1, -2043,110,20,111,4, -18,83,0,69,0, -77,0,73,0,67, -0,79,0,76,0, -79,0,78,0,1, -11,1,1,2,0, -1,2755,112,18,1, -2755,113,20,114,4, -22,82,0,73,0, -71,0,72,0,84, -0,95,0,66,0, -82,0,65,0,67, -0,69,0,1,13, -1,1,2,0,1, -1834,115,18,1,1834, -116,20,117,4,20, -76,0,69,0,70, -0,84,0,95,0, -80,0,65,0,82, -0,69,0,78,0, -1,16,1,1,2, -0,1,1833,118,18, -1,1833,119,20,120, -4,10,87,0,72, -0,73,0,76,0, -69,0,1,45,1, -1,2,0,1,1832, -121,18,1,1832,122, -20,123,4,18,83, -0,116,0,97,0, -116,0,101,0,109, -0,101,0,110,0, -116,0,1,135,1, -2,2,0,1,1804, -124,18,1,1804,125, -20,126,4,4,68, -0,79,0,1,44, -1,1,2,0,1, -1803,127,18,1,1803, -122,2,0,1,883, -128,18,1,883,129, -20,130,4,20,69, -0,120,0,112,0, -114,0,101,0,115, -0,115,0,105,0, -111,0,110,0,1, -156,1,2,2,0, -1,461,131,18,1, -461,132,20,133,4, -24,65,0,114,0, -103,0,117,0,109, -0,101,0,110,0, -116,0,76,0,105, -0,115,0,116,0, -1,149,1,2,2, -0,1,2703,134,18, -1,2703,135,20,136, -4,18,83,0,116, -0,97,0,116,0, -101,0,66,0,111, -0,100,0,121,0, -1,103,1,2,2, -0,1,1775,137,18, -1,1775,138,20,139, -4,22,82,0,73, -0,71,0,72,0, -84,0,95,0,80, -0,65,0,82,0, -69,0,78,0,1, -17,1,1,2,0, -1,1773,140,18,1, -1773,141,20,142,4, -32,70,0,111,0, -114,0,76,0,111, -0,111,0,112,0, -83,0,116,0,97, -0,116,0,101,0, -109,0,101,0,110, -0,116,0,1,147, -1,2,2,0,1, -1931,143,18,1,1931, -122,2,0,1,1756, -144,18,1,1756,110, -2,0,1,827,145, -18,1,827,129,2, -0,1,2541,146,18, -1,2541,147,20,148, -4,10,67,0,79, -0,77,0,77,0, -65,0,1,14,1, -1,2,0,1,2659, -149,18,1,2659,150, -20,151,4,20,76, -0,69,0,70,0, -84,0,95,0,66, -0,82,0,65,0, -67,0,69,0,1, -12,1,1,2,0, -1,2658,152,18,1, -2658,153,20,154,4, -26,68,0,69,0, -70,0,65,0,85, -0,76,0,84,0, -95,0,83,0,84, -0,65,0,84,0, -69,0,1,47,1, -1,2,0,1,2657, -155,18,1,2657,156, -20,157,4,20,83, -0,116,0,97,0, -116,0,101,0,69, -0,118,0,101,0, -110,0,116,0,1, -104,1,2,2,0, -1,1737,158,18,1, -1737,129,2,0,1, -377,159,18,1,377, -160,20,161,4,10, -73,0,68,0,69, -0,78,0,84,0, -1,93,1,1,2, -0,1,2654,162,18, -1,2654,163,20,164, -4,32,73,0,110, -0,116,0,65,0, -114,0,103,0,83, -0,116,0,97,0, -116,0,101,0,69, -0,118,0,101,0, -110,0,116,0,1, -107,1,2,2,0, -1,2033,165,18,1, -2033,166,20,167,4, -22,73,0,102,0, -83,0,116,0,97, -0,116,0,101,0, -109,0,101,0,110, -0,116,0,1,143, -1,2,2,0,1, -2652,168,18,1,2652, -169,20,170,4,44, -73,0,110,0,116, -0,82,0,111,0, -116,0,82,0,111, -0,116,0,65,0, -114,0,103,0,83, -0,116,0,97,0, -116,0,101,0,69, -0,118,0,101,0, -110,0,116,0,1, -109,1,2,2,0, -1,2651,171,18,1, -2651,172,20,173,4, -44,73,0,110,0, -116,0,86,0,101, -0,99,0,86,0, -101,0,99,0,65, -0,114,0,103,0, -83,0,116,0,97, -0,116,0,101,0, -69,0,118,0,101, -0,110,0,116,0, -1,110,1,2,2, -0,1,1731,174,18, -1,1731,110,2,0, -1,1730,175,18,1, -1730,107,2,0,1, -2648,176,18,1,2648, -156,2,0,1,2647, -177,18,1,2647,178, -20,179,4,34,86, -0,111,0,105,0, -100,0,65,0,114, -0,103,0,83,0, -116,0,97,0,116, -0,101,0,69,0, -118,0,101,0,110, -0,116,0,1,105, -1,2,2,0,1, -2646,180,18,1,2646, -181,20,182,4,32, -75,0,101,0,121, -0,65,0,114,0, -103,0,83,0,116, -0,97,0,116,0, -101,0,69,0,118, -0,101,0,110,0, -116,0,1,106,1, -2,2,0,1,2645, -183,18,1,2645,163, -2,0,1,2644,184, -18,1,2644,185,20, -186,4,38,86,0, -101,0,99,0,116, -0,111,0,114,0, -65,0,114,0,103, -0,83,0,116,0, -97,0,116,0,101, -0,69,0,118,0, -101,0,110,0,116, -0,1,108,1,2, -2,0,1,2643,187, -18,1,2643,169,2, -0,1,2642,188,18, -1,2642,172,2,0, -1,2641,189,18,1, -2641,190,20,191,4, -44,75,0,101,0, -121,0,73,0,110, -0,116,0,73,0, -110,0,116,0,65, -0,114,0,103,0, -83,0,116,0,97, -0,116,0,101,0, -69,0,118,0,101, -0,110,0,116,0, -1,111,1,2,2, -0,1,2767,192,18, -1,2767,193,20,194, -4,10,83,0,116, -0,97,0,116,0, -101,0,1,102,1, -2,2,0,1,2577, -195,18,1,2577,116, -2,0,1,1701,196, -18,1,1701,129,2, -0,1,1695,197,18, -1,1695,147,2,0, -1,1694,198,18,1, -1694,141,2,0,1, -2597,199,18,1,2597, -135,2,0,1,2595, -200,18,1,2595,201, -20,202,4,34,67, -0,111,0,109,0, -112,0,111,0,117, -0,110,0,100,0, -83,0,116,0,97, -0,116,0,101,0, -109,0,101,0,110, -0,116,0,1,133, -1,2,2,0,1, -2593,203,18,1,2593, -138,2,0,1,2591, -204,18,1,2591,205, -20,206,4,46,65, -0,114,0,103,0, -117,0,109,0,101, -0,110,0,116,0, -68,0,101,0,99, -0,108,0,97,0, -114,0,97,0,116, -0,105,0,111,0, -110,0,76,0,105, -0,115,0,116,0, -1,112,1,2,2, -0,1,1665,207,18, -1,1665,129,2,0, -1,2582,208,18,1, -2582,116,2,0,1, -2581,209,18,1,2581, -210,20,211,4,10, -69,0,118,0,101, -0,110,0,116,0, -1,125,1,2,2, -0,1,2580,212,18, -1,2580,201,2,0, -1,1659,213,18,1, -1659,116,2,0,1, -1658,214,18,1,1658, -215,20,216,4,6, -70,0,79,0,82, -0,1,46,1,1, -2,0,1,1657,217, -18,1,1657,110,2, -0,1,2575,218,18, -1,2575,201,2,0, -1,2573,219,18,1, -2573,138,2,0,1, -2572,220,18,1,2572, -221,20,222,4,52, -75,0,101,0,121, -0,65,0,114,0, -103,0,117,0,109, -0,101,0,110,0, -116,0,68,0,101, -0,99,0,108,0, -97,0,114,0,97, -0,116,0,105,0, -111,0,110,0,76, -0,105,0,115,0, -116,0,1,113,1, -2,2,0,1,2571, -223,18,1,2571,224, -20,225,4,28,75, -0,101,0,121,0, -68,0,101,0,99, -0,108,0,97,0, -114,0,97,0,116, -0,105,0,111,0, -110,0,1,120,1, -2,2,0,1,2569, -226,18,1,2569,116, -2,0,1,2568,227, -18,1,2568,228,20, -229,4,22,75,0, -101,0,121,0,65, -0,114,0,103,0, -69,0,118,0,101, -0,110,0,116,0, -1,127,1,2,2, -0,1,2567,230,18, -1,2567,201,2,0, -1,2565,231,18,1, -2565,138,2,0,1, -2564,232,18,1,2564, -233,20,234,4,52, -73,0,110,0,116, -0,65,0,114,0, -103,0,117,0,109, -0,101,0,110,0, -116,0,68,0,101, -0,99,0,108,0, -97,0,114,0,97, -0,116,0,105,0, -111,0,110,0,76, -0,105,0,115,0, -116,0,1,114,1, -2,2,0,1,2563, -235,18,1,2563,236, -20,237,4,28,73, -0,110,0,116,0, -68,0,101,0,99, -0,108,0,97,0, -114,0,97,0,116, -0,105,0,111,0, -110,0,1,121,1, -2,2,0,1,2561, -238,18,1,2561,116, -2,0,1,2560,239, -18,1,2560,240,20, -241,4,22,73,0, -110,0,116,0,65, -0,114,0,103,0, -69,0,118,0,101, -0,110,0,116,0, -1,128,1,2,2, -0,1,2559,242,18, -1,2559,201,2,0, -1,2557,243,18,1, -2557,138,2,0,1, -2556,244,18,1,2556, -245,20,246,4,58, -86,0,101,0,99, -0,116,0,111,0, -114,0,65,0,114, -0,103,0,117,0, -109,0,101,0,110, -0,116,0,68,0, -101,0,99,0,108, -0,97,0,114,0, -97,0,116,0,105, -0,111,0,110,0, -76,0,105,0,115, -0,116,0,1,115, -1,2,2,0,1, -2555,247,18,1,2555, -248,20,249,4,28, -86,0,101,0,99, -0,68,0,101,0, -99,0,108,0,97, -0,114,0,97,0, -116,0,105,0,111, -0,110,0,1,122, -1,2,2,0,1, -2649,250,18,1,2649, -113,2,0,1,151, -251,18,1,151,252, -20,253,4,26,69, -0,81,0,85,0, -65,0,76,0,83, -0,95,0,69,0, -81,0,85,0,65, -0,76,0,83,0, -1,29,1,1,2, -0,1,1123,254,18, -1,1123,129,2,0, -1,1939,255,18,1, -1939,129,2,0,1, -2653,256,18,1,2653, -185,2,0,1,2549, -257,18,1,2549,138, -2,0,1,2548,258, -18,1,2548,259,20, -260,4,64,73,0, -110,0,116,0,82, -0,111,0,116,0, -82,0,111,0,116, -0,65,0,114,0, -103,0,117,0,109, -0,101,0,110,0, -116,0,68,0,101, -0,99,0,108,0, -97,0,114,0,97, -0,116,0,105,0, -111,0,110,0,76, -0,105,0,115,0, -116,0,1,116,1, -2,2,0,1,1628, -261,18,1,1628,129, -2,0,1,2545,262, -18,1,2545,147,2, -0,1,2544,263,18, -1,2544,264,20,265, -4,28,82,0,111, -0,116,0,68,0, -101,0,99,0,108, -0,97,0,114,0, -97,0,116,0,105, -0,111,0,110,0, -1,123,1,2,2, -0,1,2543,266,18, -1,2543,160,2,0, -1,2542,267,18,1, -2542,268,20,269,4, -26,82,0,79,0, -84,0,65,0,84, -0,73,0,79,0, -78,0,95,0,84, -0,89,0,80,0, -69,0,1,56,1, -1,2,0,1,1622, -270,18,1,1622,271, -20,272,4,12,69, -0,81,0,85,0, -65,0,76,0,83, -0,1,15,1,1, -2,0,1,1621,273, -18,1,1621,274,20, -275,4,22,68,0, -101,0,99,0,108, -0,97,0,114,0, -97,0,116,0,105, -0,111,0,110,0, -1,119,1,2,2, -0,1,1620,276,18, -1,1620,107,2,0, -1,2538,277,18,1, -2538,116,2,0,1, -2537,278,18,1,2537, -279,20,280,4,34, -73,0,110,0,116, -0,82,0,111,0, -116,0,82,0,111, -0,116,0,65,0, -114,0,103,0,69, -0,118,0,101,0, -110,0,116,0,1, -130,1,2,2,0, -1,2536,281,18,1, -2536,201,2,0,1, -2534,282,18,1,2534, -138,2,0,1,2533, -283,18,1,2533,284, -20,285,4,64,73, -0,110,0,116,0, -86,0,101,0,99, -0,86,0,101,0, -99,0,65,0,114, -0,103,0,117,0, -109,0,101,0,110, -0,116,0,68,0, -101,0,99,0,108, -0,97,0,114,0, -97,0,116,0,105, -0,111,0,110,0, -76,0,105,0,115, -0,116,0,1,117, -1,2,2,0,1, -2532,286,18,1,2532, -248,2,0,1,2530, -287,18,1,2530,147, -2,0,1,2529,288, -18,1,2529,248,2, -0,1,2528,289,18, -1,2528,160,2,0, -1,2527,290,18,1, -2527,291,20,292,4, -22,86,0,69,0, -67,0,84,0,79, -0,82,0,95,0, -84,0,89,0,80, -0,69,0,1,55, -1,1,2,0,1, -2526,293,18,1,2526, -147,2,0,1,2525, -294,18,1,2525,236, -2,0,1,2523,295, -18,1,2523,116,2, -0,1,2522,296,18, -1,2522,297,20,298, -4,34,73,0,110, -0,116,0,86,0, -101,0,99,0,86, -0,101,0,99,0, -65,0,114,0,103, -0,69,0,118,0, -101,0,110,0,116, -0,1,131,1,2, -2,0,1,2521,299, -18,1,2521,201,2, -0,1,2519,300,18, -1,2519,138,2,0, -1,2518,301,18,1, -2518,302,20,303,4, -64,75,0,101,0, -121,0,73,0,110, -0,116,0,73,0, -110,0,116,0,65, -0,114,0,103,0, -117,0,109,0,101, -0,110,0,116,0, -68,0,101,0,99, -0,108,0,97,0, -114,0,97,0,116, -0,105,0,111,0, -110,0,76,0,105, -0,115,0,116,0, -1,118,1,2,2, -0,1,2517,304,18, -1,2517,236,2,0, -1,2515,305,18,1, -2515,147,2,0,1, -2514,306,18,1,2514, -236,2,0,1,2513, -307,18,1,2513,160, -2,0,1,2512,308, -18,1,2512,309,20, -310,4,24,73,0, -78,0,84,0,69, -0,71,0,69,0, -82,0,95,0,84, -0,89,0,80,0, -69,0,1,51,1, -1,2,0,1,2511, -311,18,1,2511,147, -2,0,1,1591,312, -18,1,1591,129,2, -0,1,2509,313,18, -1,2509,160,2,0, -1,2508,314,18,1, -2508,315,20,316,4, -16,75,0,69,0, -89,0,95,0,84, -0,89,0,80,0, -69,0,1,54,1, -1,2,0,1,2507, -317,18,1,2507,116, -2,0,1,2506,318, -18,1,2506,319,20, -320,4,34,75,0, -101,0,121,0,73, -0,110,0,116,0, -73,0,110,0,116, -0,65,0,114,0, -103,0,69,0,118, -0,101,0,110,0, -116,0,1,132,1, -2,2,0,1,2505, -321,18,1,2505,322, -20,323,4,32,68, -0,65,0,84,0, -65,0,83,0,69, -0,82,0,86,0, -69,0,82,0,95, -0,69,0,86,0, -69,0,78,0,84, -0,1,66,1,1, -2,0,1,1585,324, -18,1,1585,325,20, -326,4,12,82,0, -69,0,84,0,85, -0,82,0,78,0, -1,50,1,1,2, -0,1,2503,327,18, -1,2503,328,20,329, -4,38,72,0,84, -0,84,0,80,0, -95,0,82,0,69, -0,83,0,80,0, -79,0,78,0,83, -0,69,0,95,0, -69,0,86,0,69, -0,78,0,84,0, -1,68,1,1,2, -0,1,2502,330,18, -1,2502,331,20,332, -4,36,76,0,73, -0,78,0,75,0, -95,0,77,0,69, -0,83,0,83,0, -65,0,71,0,69, -0,95,0,69,0, -86,0,69,0,78, -0,84,0,1,72, -1,1,2,0,1, -2501,333,18,1,2501, -334,20,335,4,24, -76,0,73,0,83, -0,84,0,69,0, -78,0,95,0,69, -0,86,0,69,0, -78,0,84,0,1, -73,1,1,2,0, -1,2500,336,18,1, -2500,337,20,338,4, -22,77,0,79,0, -78,0,69,0,89, -0,95,0,69,0, -86,0,69,0,78, -0,84,0,1,74, -1,1,2,0,1, -2499,339,18,1,2499, -340,20,341,4,34, -82,0,69,0,77, -0,79,0,84,0, -69,0,95,0,68, -0,65,0,84,0, -65,0,95,0,69, -0,86,0,69,0, -78,0,84,0,1, -82,1,1,2,0, -1,2498,342,18,1, -2498,343,20,344,4, -36,72,0,84,0, -84,0,80,0,95, -0,82,0,69,0, -81,0,85,0,69, -0,83,0,84,0, -95,0,69,0,86, -0,69,0,78,0, -84,0,1,91,1, -1,2,0,1,2497, -345,18,1,2497,346, -20,347,4,48,84, -0,82,0,65,0, -78,0,83,0,65, -0,67,0,84,0, -73,0,79,0,78, -0,95,0,82,0, -69,0,83,0,85, -0,76,0,84,0, -95,0,69,0,86, -0,69,0,78,0, -84,0,1,92,1, -1,2,0,1,2496, -348,18,1,2496,349, -20,350,4,34,83, -0,84,0,65,0, -84,0,69,0,95, -0,69,0,78,0, -84,0,82,0,89, -0,95,0,69,0, -86,0,69,0,78, -0,84,0,1,85, -1,1,2,0,1, -2495,351,18,1,2495, -352,20,353,4,32, -83,0,84,0,65, -0,84,0,69,0, -95,0,69,0,88, -0,73,0,84,0, -95,0,69,0,86, -0,69,0,78,0, -84,0,1,86,1, -1,2,0,1,2494, -354,18,1,2494,355, -20,356,4,32,77, -0,79,0,86,0, -73,0,78,0,71, -0,95,0,69,0, -78,0,68,0,95, -0,69,0,86,0, -69,0,78,0,84, -0,1,75,1,1, -2,0,1,1574,357, -18,1,1574,110,2, -0,1,2492,358,18, -1,2492,359,20,360, -4,30,78,0,79, -0,95,0,83,0, -69,0,78,0,83, -0,79,0,82,0, -95,0,69,0,86, -0,69,0,78,0, -84,0,1,77,1, -1,2,0,1,2491, -361,18,1,2491,362, -20,363,4,46,78, -0,79,0,84,0, -95,0,65,0,84, -0,95,0,82,0, -79,0,84,0,95, -0,84,0,65,0, -82,0,71,0,69, -0,84,0,95,0, -69,0,86,0,69, -0,78,0,84,0, -1,78,1,1,2, -0,1,2490,364,18, -1,2490,365,20,366, -4,38,78,0,79, -0,84,0,95,0, -65,0,84,0,95, -0,84,0,65,0, -82,0,71,0,69, -0,84,0,95,0, -69,0,86,0,69, -0,78,0,84,0, -1,79,1,1,2, -0,1,2489,367,18, -1,2489,368,20,369, -4,22,84,0,73, -0,77,0,69,0, -82,0,95,0,69, -0,86,0,69,0, -78,0,84,0,1, -87,1,1,2,0, -1,2488,370,18,1, -2488,371,20,372,4, -24,65,0,84,0, -84,0,65,0,67, -0,72,0,95,0, -69,0,86,0,69, -0,78,0,84,0, -1,60,1,1,2, -0,1,2487,373,18, -1,2487,374,20,375, -4,32,79,0,66, -0,74,0,69,0, -67,0,84,0,95, -0,82,0,69,0, -90,0,95,0,69, -0,86,0,69,0, -78,0,84,0,1, -80,1,1,2,0, -1,2486,376,18,1, -2486,377,20,378,4, -26,67,0,72,0, -65,0,78,0,71, -0,69,0,68,0, -95,0,69,0,86, -0,69,0,78,0, -84,0,1,61,1, -1,2,0,1,2485, -379,18,1,2485,380, -20,381,4,30,67, -0,79,0,76,0, -76,0,73,0,83, -0,73,0,79,0, -78,0,95,0,69, -0,86,0,69,0, -78,0,84,0,1, -62,1,1,2,0, -1,2484,382,18,1, -2484,383,20,384,4, -38,67,0,79,0, -76,0,76,0,73, -0,83,0,73,0, -79,0,78,0,95, -0,69,0,78,0, -68,0,95,0,69, -0,86,0,69,0, -78,0,84,0,1, -63,1,1,2,0, -1,2483,385,18,1, -2483,386,20,387,4, -42,67,0,79,0, -76,0,76,0,73, -0,83,0,73,0, -79,0,78,0,95, -0,83,0,84,0, -65,0,82,0,84, -0,95,0,69,0, -86,0,69,0,78, -0,84,0,1,64, -1,1,2,0,1, -2482,388,18,1,2482, -389,20,390,4,24, -79,0,78,0,95, -0,82,0,69,0, -90,0,95,0,69, -0,86,0,69,0, -78,0,84,0,1, -81,1,1,2,0, -1,2481,391,18,1, -2481,392,20,393,4, -52,82,0,85,0, -78,0,95,0,84, -0,73,0,77,0, -69,0,95,0,80, -0,69,0,82,0, -77,0,73,0,83, -0,83,0,73,0, -79,0,78,0,83, -0,95,0,69,0, -86,0,69,0,78, -0,84,0,1,83, -1,1,2,0,1, -2480,394,18,1,2480, -395,20,396,4,24, -83,0,69,0,78, -0,83,0,79,0, -82,0,95,0,69, -0,86,0,69,0, -78,0,84,0,1, -84,1,1,2,0, -1,2479,397,18,1, -2479,398,20,399,4, -22,84,0,79,0, -85,0,67,0,72, -0,95,0,69,0, -86,0,69,0,78, -0,84,0,1,88, -1,1,2,0,1, -2478,400,18,1,2478, -401,20,402,4,30, -84,0,79,0,85, -0,67,0,72,0, -95,0,69,0,78, -0,68,0,95,0, -69,0,86,0,69, -0,78,0,84,0, -1,90,1,1,2, -0,1,2477,403,18, -1,2477,404,20,405, -4,34,84,0,79, -0,85,0,67,0, -72,0,95,0,83, -0,84,0,65,0, -82,0,84,0,95, -0,69,0,86,0, -69,0,78,0,84, -0,1,89,1,1, -2,0,1,2476,406, -18,1,2476,407,20, -408,4,40,76,0, -65,0,78,0,68, -0,95,0,67,0, -79,0,76,0,76, -0,73,0,83,0, -73,0,79,0,78, -0,95,0,69,0, -86,0,69,0,78, -0,84,0,1,69, -1,1,2,0,1, -2475,409,18,1,2475, -410,20,411,4,48, -76,0,65,0,78, -0,68,0,95,0, -67,0,79,0,76, -0,76,0,73,0, -83,0,73,0,79, -0,78,0,95,0, -69,0,78,0,68, -0,95,0,69,0, -86,0,69,0,78, -0,84,0,1,70, -1,1,2,0,1, -1555,412,18,1,1555, -129,2,0,1,2473, -413,18,1,2473,414, -20,415,4,38,65, -0,84,0,95,0, -82,0,79,0,84, -0,95,0,84,0, -65,0,82,0,71, -0,69,0,84,0, -95,0,69,0,86, -0,69,0,78,0, -84,0,1,58,1, -1,2,0,1,2472, -416,18,1,2472,417, -20,418,4,30,65, -0,84,0,95,0, -84,0,65,0,82, -0,71,0,69,0, -84,0,95,0,69, -0,86,0,69,0, -78,0,84,0,1, -59,1,1,2,0, -1,2471,419,18,1, -2471,420,20,421,4, -26,67,0,79,0, -78,0,84,0,82, -0,79,0,76,0, -95,0,69,0,86, -0,69,0,78,0, -84,0,1,65,1, -1,2,0,1,2470, -422,18,1,2470,150, -2,0,1,2469,423, -18,1,2469,160,2, -0,1,2468,424,18, -1,2468,425,20,426, -4,10,83,0,84, -0,65,0,84,0, -69,0,1,48,1, -1,2,0,1,2467, -427,18,1,2467,274, -2,0,1,2466,428, -18,1,2466,201,2, -0,1,2464,429,18, -1,2464,113,2,0, -1,2462,430,18,1, -2462,122,2,0,1, -2459,431,18,1,2459, -113,2,0,1,2458, -432,18,1,2458,122, -2,0,1,1113,433, -18,1,1113,434,20, -435,4,12,80,0, -69,0,82,0,73, -0,79,0,68,0, -1,24,1,1,2, -0,1,1932,436,18, -1,1932,437,20,438, -4,4,73,0,70, -0,1,42,1,1, -2,0,1,2553,439, -18,1,2553,116,2, -0,1,1521,440,18, -1,1521,129,2,0, -1,1515,441,18,1, -1515,271,2,0,1, -1514,442,18,1,1514, -107,2,0,1,2576, -443,18,1,2576,444, -20,445,4,24,86, -0,111,0,105,0, -100,0,65,0,114, -0,103,0,69,0, -118,0,101,0,110, -0,116,0,1,126, -1,2,2,0,1, -2074,446,18,1,2074, -107,2,0,1,2413, -447,18,1,2413,448, -20,449,4,26,83, -0,116,0,97,0, -116,0,101,0,109, -0,101,0,110,0, -116,0,76,0,105, -0,115,0,116,0, -1,134,1,2,2, -0,1,1485,450,18, -1,1485,129,2,0, -1,1479,451,18,1, -1479,452,20,453,4, -22,80,0,76,0, -85,0,83,0,95, -0,69,0,81,0, -85,0,65,0,76, -0,83,0,1,6, -1,1,2,0,1, -1478,454,18,1,1478, -107,2,0,1,378, -455,18,1,378,434, -2,0,1,2318,456, -18,1,2318,110,2, -0,1,1449,457,18, -1,1449,129,2,0, -1,2364,458,18,1, -2364,122,2,0,1, -525,459,18,1,525, -460,20,461,4,22, -82,0,73,0,71, -0,72,0,84,0, -95,0,65,0,78, -0,71,0,76,0, -69,0,1,26,1, -1,2,0,1,1443, -462,18,1,1443,463, -20,464,4,24,77, -0,73,0,78,0, -85,0,83,0,95, -0,69,0,81,0, -85,0,65,0,76, -0,83,0,1,7, -1,1,2,0,1, -1442,465,18,1,1442, -107,2,0,1,515, -466,18,1,515,129, -2,0,1,2650,467, -18,1,2650,190,2, -0,1,509,468,18, -1,509,147,2,0, -1,2552,469,18,1, -2552,470,20,471,4, -28,86,0,101,0, -99,0,116,0,111, -0,114,0,65,0, -114,0,103,0,69, -0,118,0,101,0, -110,0,116,0,1, -129,1,2,2,0, -1,2042,472,18,1, -2042,473,20,474,4, -20,65,0,115,0, -115,0,105,0,103, -0,110,0,109,0, -101,0,110,0,116, -0,1,137,1,2, -2,0,1,2337,475, -18,1,2337,138,2, -0,1,2335,476,18, -1,2335,141,2,0, -1,1413,477,18,1, -1413,129,2,0,1, -1407,478,18,1,1407, -479,20,480,4,22, -83,0,84,0,65, -0,82,0,95,0, -69,0,81,0,85, -0,65,0,76,0, -83,0,1,8,1, -1,2,0,1,1406, -481,18,1,1406,107, -2,0,1,2779,482, -18,1,2779,205,2, -0,1,481,483,18, -1,481,484,20,485, -4,16,65,0,114, -0,103,0,117,0, -109,0,101,0,110, -0,116,0,1,150, -1,2,2,0,1, -480,486,18,1,480, -487,20,488,4,26, -82,0,73,0,71, -0,72,0,84,0, -95,0,66,0,82, -0,65,0,67,0, -75,0,69,0,84, -0,1,28,1,1, -2,0,1,479,489, -18,1,479,490,20, -491,4,32,73,0, -78,0,84,0,69, -0,71,0,69,0, -82,0,95,0,67, -0,79,0,78,0, -83,0,84,0,65, -0,78,0,84,0, -1,94,1,1,2, -0,1,478,492,18, -1,478,493,20,494, -4,40,72,0,69, -0,88,0,95,0, -73,0,78,0,84, -0,69,0,71,0, -69,0,82,0,95, -0,67,0,79,0, -78,0,83,0,84, -0,65,0,78,0, -84,0,1,95,1, -1,2,0,1,477, -495,18,1,477,496, -20,497,4,28,70, -0,76,0,79,0, -65,0,84,0,95, -0,67,0,79,0, -78,0,83,0,84, -0,65,0,78,0, -84,0,1,96,1, -1,2,0,1,476, -498,18,1,476,499, -20,500,4,30,83, -0,84,0,82,0, -73,0,78,0,71, -0,95,0,67,0, -79,0,78,0,83, -0,84,0,65,0, -78,0,84,0,1, -3,1,1,2,0, -1,2822,501,18,1, -2822,110,2,0,1, -464,502,18,1,464, -484,2,0,1,462, -503,18,1,462,147, -2,0,1,2299,504, -18,1,2299,129,2, -0,1,459,505,18, -1,459,506,20,507, -4,24,76,0,69, -0,70,0,84,0, -95,0,66,0,82, -0,65,0,67,0, -75,0,69,0,84, -0,1,27,1,1, -2,0,1,1377,508, -18,1,1377,129,2, -0,1,2293,509,18, -1,2293,110,2,0, -1,1371,510,18,1, -1371,511,20,512,4, -24,83,0,76,0, -65,0,83,0,72, -0,95,0,69,0, -81,0,85,0,65, -0,76,0,83,0, -1,9,1,1,2, -0,1,1370,513,18, -1,1370,107,2,0, -1,447,514,18,1, -447,460,2,0,1, -2281,515,18,1,2281, -107,2,0,1,437, -516,18,1,437,129, -2,0,1,431,517, -18,1,431,147,2, -0,1,1341,518,18, -1,1341,129,2,0, -1,2842,519,18,1, -2842,520,20,521,4, -50,71,0,108,0, -111,0,98,0,97, -0,108,0,86,0, -97,0,114,0,105, -0,97,0,98,0, -108,0,101,0,68, -0,101,0,99,0, -108,0,97,0,114, -0,97,0,116,0, -105,0,111,0,110, -0,1,99,1,2, -2,0,1,1335,522, -18,1,1335,523,20, -524,4,28,80,0, -69,0,82,0,67, -0,69,0,78,0, -84,0,95,0,69, -0,81,0,85,0, -65,0,76,0,83, -0,1,10,1,1, -2,0,1,2547,525, -18,1,2547,264,2, -0,1,1332,526,18, -1,1332,107,2,0, -1,412,527,18,1, -412,129,2,0,1, -2037,528,18,1,2037, -110,2,0,1,1012, -529,18,1,1012,129, -2,0,1,1840,530, -18,1,1840,129,2, -0,1,406,531,18, -1,406,147,2,0, -1,2227,532,18,1, -2227,122,2,0,1, -387,533,18,1,387, -129,2,0,1,1303, -534,18,1,1303,129, -2,0,1,381,535, -18,1,381,536,20, -537,4,20,76,0, -69,0,70,0,84, -0,95,0,65,0, -78,0,71,0,76, -0,69,0,1,25, -1,1,2,0,1, -380,538,18,1,380, -539,20,540,4,16, -67,0,111,0,110, -0,115,0,116,0, -97,0,110,0,116, -0,1,152,1,2, -2,0,1,379,541, -18,1,379,160,2, -0,1,1297,542,18, -1,1297,271,2,0, -1,1296,543,18,1, -1296,107,2,0,1, -376,544,18,1,376, -545,20,546,4,18, -73,0,78,0,67, -0,82,0,69,0, -77,0,69,0,78, -0,84,0,1,4, -1,1,2,0,1, -375,547,18,1,375, -160,2,0,1,374, -548,18,1,374,434, -2,0,1,373,549, -18,1,373,160,2, -0,1,372,550,18, -1,372,551,20,552, -4,18,68,0,69, -0,67,0,82,0, -69,0,77,0,69, -0,78,0,84,0, -1,5,1,1,2, -0,1,371,553,18, -1,371,554,20,555, -4,24,70,0,117, -0,110,0,99,0, -116,0,105,0,111, -0,110,0,67,0, -97,0,108,0,108, -0,1,148,1,2, -2,0,1,2792,556, -18,1,2792,129,2, -0,1,2198,557,18, -1,2198,138,2,0, -1,2197,558,18,1, -2197,107,2,0,1, -352,559,18,1,352, -129,2,0,1,1267, -560,18,1,1267,129, -2,0,1,346,561, -18,1,346,562,20, -563,4,8,80,0, -76,0,85,0,83, -0,1,18,1,1, -2,0,1,1261,564, -18,1,1261,452,2, -0,1,1260,565,18, -1,1260,107,2,0, -1,328,566,18,1, -328,129,2,0,1, -322,567,18,1,322, -568,20,569,4,10, -77,0,73,0,78, -0,85,0,83,0, -1,19,1,1,2, -0,1,2846,570,18, -1,2846,571,23,572, -4,6,69,0,79, -0,70,0,1,2, -1,6,2,0,1, -1231,573,18,1,1231, -129,2,0,1,1225, -574,18,1,1225,463, -2,0,1,305,575, -18,1,305,129,2, -0,1,2041,576,18, -1,2041,110,2,0, -1,2656,577,18,1, -2656,178,2,0,1, -299,578,18,1,299, -579,20,580,4,8, -83,0,84,0,65, -0,82,0,1,20, -1,1,2,0,1, -2136,581,18,1,2136, -122,2,0,1,2764, -582,18,1,2764,583, -20,584,4,12,83, -0,116,0,97,0, -116,0,101,0,115, -0,1,101,1,2, -2,0,1,283,585, -18,1,283,129,2, -0,1,277,586,18, -1,277,587,20,588, -4,10,83,0,76, -0,65,0,83,0, -72,0,1,21,1, -1,2,0,1,1195, -589,18,1,1195,129, -2,0,1,1189,590, -18,1,1189,479,2, -0,1,1188,591,18, -1,1188,107,2,0, -1,2106,592,18,1, -2106,593,20,594,4, -8,69,0,76,0, -83,0,69,0,1, -43,1,1,2,0, -1,2105,595,18,1, -2105,122,2,0,1, -1550,596,18,1,1550, -107,2,0,1,262, -597,18,1,262,129, -2,0,1,2493,598, -18,1,2493,599,20, -600,4,36,77,0, -79,0,86,0,73, -0,78,0,71,0, -95,0,83,0,84, -0,65,0,82,0, -84,0,95,0,69, -0,86,0,69,0, -78,0,84,0,1, -76,1,1,2,0, -1,256,601,18,1, -256,602,20,603,4, -14,80,0,69,0, -82,0,67,0,69, -0,78,0,84,0, -1,22,1,1,2, -0,1,242,604,18, -1,242,129,2,0, -1,1159,605,18,1, -1159,129,2,0,1, -2075,606,18,1,2075, -138,2,0,1,236, -607,18,1,236,608, -20,609,4,6,65, -0,77,0,80,0, -1,33,1,1,2, -0,1,2823,610,18, -1,2823,611,20,612, -4,34,71,0,108, -0,111,0,98,0, -97,0,108,0,68, -0,101,0,102,0, -105,0,110,0,105, -0,116,0,105,0, -111,0,110,0,115, -0,1,98,1,2, -2,0,1,1153,613, -18,1,1153,511,2, -0,1,1152,614,18, -1,1152,107,2,0, -1,223,615,18,1, -223,129,2,0,1, -217,616,18,1,217, -617,20,618,4,12, -83,0,84,0,82, -0,79,0,75,0, -69,0,1,34,1, -1,2,0,1,2036, -619,18,1,2036,620, -20,621,4,26,74, -0,117,0,109,0, -112,0,83,0,116, -0,97,0,116,0, -101,0,109,0,101, -0,110,0,116,0, -1,141,1,2,2, -0,1,2045,622,18, -1,2045,110,2,0, -1,2044,623,18,1, -2044,624,20,625,4, -28,69,0,109,0, -112,0,116,0,121, -0,83,0,116,0, -97,0,116,0,101, -0,109,0,101,0, -110,0,116,0,1, -136,1,2,2,0, -1,205,626,18,1, -205,129,2,0,1, -1001,627,18,1,1001, -554,2,0,1,1901, -628,18,1,1901,138, -2,0,1,2040,629, -18,1,2040,630,20, -631,4,30,82,0, -101,0,116,0,117, -0,114,0,110,0, -83,0,116,0,97, -0,116,0,101,0, -109,0,101,0,110, -0,116,0,1,139, -1,2,2,0,1, -2039,632,18,1,2039, -110,2,0,1,2038, -633,18,1,2038,634, -20,635,4,18,74, -0,117,0,109,0, -112,0,76,0,97, -0,98,0,101,0, -108,0,1,140,1, -2,2,0,1,199, -636,18,1,199,637, -20,638,4,10,67, -0,65,0,82,0, -69,0,84,0,1, -35,1,1,2,0, -1,1117,639,18,1, -1117,523,2,0,1, -2035,640,18,1,2035, -110,2,0,1,2034, -641,18,1,2034,642, -20,643,4,22,83, -0,116,0,97,0, -116,0,101,0,67, -0,104,0,97,0, -110,0,103,0,101, -0,1,142,1,2, -2,0,1,1114,644, -18,1,1114,160,2, -0,1,2032,645,18, -1,2032,646,20,647, -4,28,87,0,104, -0,105,0,108,0, -101,0,83,0,116, -0,97,0,116,0, -101,0,109,0,101, -0,110,0,116,0, -1,144,1,2,2, -0,1,2031,648,18, -1,2031,649,20,650, -4,32,68,0,111, -0,87,0,104,0, -105,0,108,0,101, -0,83,0,116,0, -97,0,116,0,101, -0,109,0,101,0, -110,0,116,0,1, -145,1,2,2,0, -1,2030,651,18,1, -2030,652,20,653,4, -14,70,0,111,0, -114,0,76,0,111, -0,111,0,112,0, -1,146,1,2,2, -0,1,2029,654,18, -1,2029,201,2,0, -1,2028,655,18,1, -2028,160,2,0,1, -2027,656,18,1,2027, -657,20,658,4,4, -65,0,84,0,1, -23,1,1,2,0, -1,188,659,18,1, -188,129,2,0,1, -2025,660,18,1,2025, -661,20,662,4,8, -74,0,85,0,77, -0,80,0,1,49, -1,1,2,0,1, -2024,663,18,1,2024, -160,2,0,1,2023, -664,18,1,2023,153, -2,0,1,2022,665, -18,1,2022,425,2, -0,1,2021,666,18, -1,2021,122,2,0, -1,182,667,18,1, -182,460,2,0,1, -1096,668,18,1,1096, -138,2,0,1,1094, -669,18,1,1094,132, -2,0,1,172,670, -18,1,172,129,2, -0,1,166,671,18, -1,166,536,2,0, -1,157,672,18,1, -157,129,2,0,1, -1990,673,18,1,1990, -593,2,0,1,1989, -674,18,1,1989,122, -2,0,1,2504,675, -18,1,2504,676,20, -677,4,22,69,0, -77,0,65,0,73, -0,76,0,95,0, -69,0,86,0,69, -0,78,0,84,0, -1,67,1,1,2, -0,1,143,678,18, -1,143,129,2,0, -1,137,679,18,1, -137,680,20,681,4, -36,69,0,88,0, -67,0,76,0,65, -0,77,0,65,0, -84,0,73,0,79, -0,78,0,95,0, -69,0,81,0,85, -0,65,0,76,0, -83,0,1,30,1, -1,2,0,1,130, -682,18,1,130,129, -2,0,1,1048,683, -18,1,1048,129,2, -0,1,124,684,18, -1,124,685,20,686, -4,22,76,0,69, -0,83,0,83,0, -95,0,69,0,81, -0,85,0,65,0, -76,0,83,0,1, -31,1,1,2,0, -1,2540,687,18,1, -2540,236,2,0,1, -1958,688,18,1,1958, -138,2,0,1,118, -689,18,1,118,129, -2,0,1,112,690, -18,1,112,691,20, -692,4,28,71,0, -82,0,69,0,65, -0,84,0,69,0, -82,0,95,0,69, -0,81,0,85,0, -65,0,76,0,83, -0,1,32,1,1, -2,0,1,107,693, -18,1,107,129,2, -0,1,102,694,18, -1,102,695,20,696, -4,22,69,0,88, -0,67,0,76,0, -65,0,77,0,65, -0,84,0,73,0, -79,0,78,0,1, -37,1,1,2,0, -1,1882,697,18,1, -1882,129,2,0,1, -2026,698,18,1,2026, -160,2,0,1,2551, -699,18,1,2551,201, -2,0,1,2655,700, -18,1,2655,181,2, -0,1,97,701,18, -1,97,702,20,703, -4,14,65,0,77, -0,80,0,95,0, -65,0,77,0,80, -0,1,38,1,1, -2,0,1,1933,704, -18,1,1933,116,2, -0,1,1013,705,18, -1,1013,138,2,0, -1,93,706,18,1, -93,129,2,0,1, -1011,707,18,1,1011, -138,2,0,1,1010, -708,18,1,1010,107, -2,0,1,89,709, -18,1,89,568,2, -0,1,2845,104,1, -2844,710,18,1,2844, -520,2,0,1,2843, -711,18,1,2843,712, -20,713,4,48,71, -0,108,0,111,0, -98,0,97,0,108, -0,70,0,117,0, -110,0,99,0,116, -0,105,0,111,0, -110,0,68,0,101, -0,102,0,105,0, -110,0,105,0,116, -0,105,0,111,0, -110,0,1,100,1, -2,2,0,1,85, -714,18,1,85,715, -20,716,4,26,83, -0,84,0,82,0, -79,0,75,0,69, -0,95,0,83,0, -84,0,82,0,79, -0,75,0,69,0, -1,39,1,1,2, -0,1,2841,717,18, -1,2841,712,2,0, -1,1002,718,18,1, -1002,539,2,0,1, -82,719,18,1,82, -129,2,0,1,79, -720,18,1,79,721, -20,722,4,10,84, -0,73,0,76,0, -68,0,69,0,1, -36,1,1,2,0, -1,1859,723,18,1, -1859,138,2,0,1, -2834,724,18,1,2834, -583,2,0,1,76, -725,18,1,76,726, -20,727,4,20,76, -0,69,0,70,0, -84,0,95,0,83, -0,72,0,73,0, -70,0,84,0,1, -40,1,1,2,0, -1,2474,728,18,1, -2474,729,20,730,4, -52,76,0,65,0, -78,0,68,0,95, -0,67,0,79,0, -76,0,76,0,73, -0,83,0,73,0, -79,0,78,0,95, -0,83,0,84,0, -65,0,82,0,84, -0,95,0,69,0, -86,0,69,0,78, -0,84,0,1,71, -1,1,2,0,1, -74,731,18,1,74, -138,2,0,1,73, -732,18,1,73,129, -2,0,1,2578,733, -18,1,2578,138,2, -0,1,71,734,18, -1,71,116,2,0, -1,70,735,18,1, -70,545,2,0,1, -69,736,18,1,69, -551,2,0,1,68, -737,18,1,68,545, -2,0,1,67,738, -18,1,67,551,2, -0,1,66,739,18, -1,66,160,2,0, -1,65,740,18,1, -65,434,2,0,1, -63,741,18,1,63, -160,2,0,1,62, -742,18,1,62,138, -2,0,1,61,743, -18,1,61,744,20, -745,4,16,84,0, -121,0,112,0,101, -0,110,0,97,0, -109,0,101,0,1, -124,1,2,2,0, -1,2811,746,18,1, -2811,110,2,0,1, -52,747,18,1,52, -116,2,0,1,51, -748,18,1,51,545, -2,0,1,50,749, -18,1,50,551,2, -0,1,49,750,18, -1,49,545,2,0, -1,48,751,18,1, -48,551,2,0,1, -47,752,18,1,47, -160,2,0,1,46, -753,18,1,46,434, -2,0,1,44,754, -18,1,44,160,2, -0,1,43,755,18, -1,43,756,20,757, -4,22,82,0,73, -0,71,0,72,0, -84,0,95,0,83, -0,72,0,73,0, -70,0,84,0,1, -41,1,1,2,0, -1,42,758,18,1, -42,129,2,0,1, -41,759,18,1,41, -116,2,0,1,40, -760,18,1,40,160, -2,0,1,2510,761, -18,1,2510,224,2, -0,1,1876,762,18, -1,1876,116,2,0, -1,1875,763,18,1, -1875,119,2,0,1, -1873,764,18,1,1873, -110,2,0,1,1872, -765,18,1,1872,138, -2,0,1,1871,766, -18,1,1871,107,2, -0,1,32,767,18, -1,32,150,2,0, -1,31,768,18,1, -31,138,2,0,1, -30,769,18,1,30, -274,2,0,1,2786, -770,18,1,2786,271, -2,0,1,2785,771, -18,1,2785,274,2, -0,1,2783,772,18, -1,2783,201,2,0, -1,2781,773,18,1, -2781,138,2,0,1, -942,774,18,1,942, -129,2,0,1,1860, -775,18,1,1860,110, -2,0,1,21,776, -18,1,21,147,2, -0,1,20,777,18, -1,20,205,2,0, -1,19,778,18,1, -19,160,2,0,1, -18,779,18,1,18, -744,2,0,1,2770, -780,18,1,2770,116, -2,0,1,2769,781, -18,1,2769,160,2, -0,1,2768,782,18, -1,2768,193,2,0, -1,10,783,18,1, -10,116,2,0,1, -9,784,18,1,9, -160,2,0,1,8, -785,18,1,8,744, -2,0,1,7,786, -18,1,7,309,2, -0,1,6,787,18, -1,6,788,20,789, -4,20,70,0,76, -0,79,0,65,0, -84,0,95,0,84, -0,89,0,80,0, -69,0,1,52,1, -1,2,0,1,5, -790,18,1,5,791, -20,792,4,22,83, -0,84,0,82,0, -73,0,78,0,71, -0,95,0,84,0, -89,0,80,0,69, -0,1,53,1,1, -2,0,1,4,793, -18,1,4,315,2, -0,1,3,794,18, -1,3,291,2,0, -1,2,795,18,1, -2,268,2,0,1, -1,796,18,1,1, -797,20,798,4,18, -76,0,73,0,83, -0,84,0,95,0, -84,0,89,0,80, -0,69,0,1,57, -1,1,2,0,1, -0,799,18,1,0, -0,2,0,800,5, -0,801,5,381,1, -383,802,19,803,4, -50,65,0,114,0, -103,0,117,0,109, -0,101,0,110,0, -116,0,68,0,101, -0,99,0,108,0, -97,0,114,0,97, -0,116,0,105,0, -111,0,110,0,76, -0,105,0,115,0, -116,0,95,0,53, -0,1,383,804,5, -3,1,2582,805,16, -0,204,1,2770,806, -16,0,482,1,10, -807,16,0,777,1, -382,808,19,809,4, -50,65,0,114,0, -103,0,117,0,109, -0,101,0,110,0, -116,0,68,0,101, -0,99,0,108,0, -97,0,114,0,97, -0,116,0,105,0, -111,0,110,0,76, -0,105,0,115,0, -116,0,95,0,52, -0,1,382,804,1, -381,810,19,811,4, -28,65,0,114,0, -103,0,117,0,109, -0,101,0,110,0, -116,0,76,0,105, -0,115,0,116,0, -95,0,52,0,1, -381,812,5,2,1, -41,813,16,0,669, -1,459,814,16,0, -131,1,380,815,19, -816,4,28,65,0, -114,0,103,0,117, -0,109,0,101,0, -110,0,116,0,76, -0,105,0,115,0, -116,0,95,0,51, -0,1,380,812,1, -379,817,19,818,4, -50,65,0,114,0, -103,0,117,0,109, -0,101,0,110,0, -116,0,68,0,101, -0,99,0,108,0, -97,0,114,0,97, -0,116,0,105,0, -111,0,110,0,76, -0,105,0,115,0, -116,0,95,0,51, -0,1,379,804,1, -378,819,19,820,4, -38,75,0,101,0, -121,0,73,0,110, -0,116,0,73,0, -110,0,116,0,65, -0,114,0,103,0, -69,0,118,0,101, -0,110,0,116,0, -95,0,49,0,1, -378,821,5,4,1, -2659,822,16,0,318, -1,2470,823,16,0, -318,1,2703,824,16, -0,318,1,2597,825, -16,0,318,1,377, -826,19,827,4,38, -73,0,110,0,116, -0,86,0,101,0, -99,0,86,0,101, -0,99,0,65,0, -114,0,103,0,69, -0,118,0,101,0, -110,0,116,0,95, -0,49,0,1,377, -828,5,4,1,2659, -829,16,0,296,1, -2470,830,16,0,296, -1,2703,831,16,0, -296,1,2597,832,16, -0,296,1,376,833, -19,834,4,38,73, -0,110,0,116,0, -82,0,111,0,116, -0,82,0,111,0, -116,0,65,0,114, -0,103,0,69,0, -118,0,101,0,110, -0,116,0,95,0, -49,0,1,376,835, -5,4,1,2659,836, -16,0,278,1,2470, -837,16,0,278,1, -2703,838,16,0,278, -1,2597,839,16,0, -278,1,375,840,19, -841,4,32,86,0, -101,0,99,0,116, -0,111,0,114,0, -65,0,114,0,103, -0,69,0,118,0, -101,0,110,0,116, -0,95,0,51,0, -1,375,842,5,4, -1,2659,843,16,0, -469,1,2470,844,16, -0,469,1,2703,845, -16,0,469,1,2597, -846,16,0,469,1, -374,847,19,848,4, -32,86,0,101,0, -99,0,116,0,111, -0,114,0,65,0, -114,0,103,0,69, -0,118,0,101,0, -110,0,116,0,95, -0,50,0,1,374, -842,1,373,849,19, -850,4,32,86,0, -101,0,99,0,116, -0,111,0,114,0, -65,0,114,0,103, -0,69,0,118,0, -101,0,110,0,116, -0,95,0,49,0, -1,373,842,1,372, -851,19,852,4,28, -73,0,110,0,116, -0,65,0,114,0, -103,0,69,0,118, -0,101,0,110,0, -116,0,95,0,49, -0,48,0,1,372, -853,5,4,1,2659, -854,16,0,239,1, -2470,855,16,0,239, -1,2703,856,16,0, -239,1,2597,857,16, -0,239,1,371,858, -19,859,4,26,73, -0,110,0,116,0, -65,0,114,0,103, -0,69,0,118,0, -101,0,110,0,116, -0,95,0,57,0, -1,371,853,1,370, -860,19,861,4,26, -73,0,110,0,116, -0,65,0,114,0, -103,0,69,0,118, -0,101,0,110,0, -116,0,95,0,56, -0,1,370,853,1, -369,862,19,863,4, -26,73,0,110,0, -116,0,65,0,114, -0,103,0,69,0, -118,0,101,0,110, -0,116,0,95,0, -55,0,1,369,853, -1,368,864,19,865, -4,26,73,0,110, -0,116,0,65,0, -114,0,103,0,69, -0,118,0,101,0, -110,0,116,0,95, -0,54,0,1,368, -853,1,367,866,19, -867,4,26,73,0, -110,0,116,0,65, -0,114,0,103,0, -69,0,118,0,101, -0,110,0,116,0, -95,0,53,0,1, -367,853,1,366,868, -19,869,4,26,73, -0,110,0,116,0, -65,0,114,0,103, -0,69,0,118,0, -101,0,110,0,116, -0,95,0,52,0, -1,366,853,1,365, -870,19,871,4,26, -73,0,110,0,116, -0,65,0,114,0, -103,0,69,0,118, -0,101,0,110,0, -116,0,95,0,51, -0,1,365,853,1, -364,872,19,873,4, -26,73,0,110,0, -116,0,65,0,114, -0,103,0,69,0, -118,0,101,0,110, -0,116,0,95,0, -50,0,1,364,853, -1,363,874,19,875, -4,26,73,0,110, -0,116,0,65,0, -114,0,103,0,69, -0,118,0,101,0, -110,0,116,0,95, -0,49,0,1,363, -853,1,362,876,19, -877,4,26,75,0, -101,0,121,0,65, -0,114,0,103,0, -69,0,118,0,101, -0,110,0,116,0, -95,0,50,0,1, -362,878,5,4,1, -2659,879,16,0,227, -1,2470,880,16,0, -227,1,2703,881,16, -0,227,1,2597,882, -16,0,227,1,361, -883,19,884,4,26, -75,0,101,0,121, -0,65,0,114,0, -103,0,69,0,118, -0,101,0,110,0, -116,0,95,0,49, -0,1,361,878,1, -360,885,19,886,4, -28,86,0,111,0, -105,0,100,0,65, -0,114,0,103,0, -69,0,118,0,101, -0,110,0,116,0, -95,0,56,0,1, -360,887,5,4,1, -2659,888,16,0,443, -1,2470,889,16,0, -443,1,2703,890,16, -0,443,1,2597,891, -16,0,443,1,359, -892,19,893,4,28, -86,0,111,0,105, -0,100,0,65,0, -114,0,103,0,69, -0,118,0,101,0, -110,0,116,0,95, -0,55,0,1,359, -887,1,358,894,19, -895,4,28,86,0, -111,0,105,0,100, -0,65,0,114,0, -103,0,69,0,118, -0,101,0,110,0, -116,0,95,0,54, -0,1,358,887,1, -357,896,19,897,4, -28,86,0,111,0, -105,0,100,0,65, -0,114,0,103,0, -69,0,118,0,101, -0,110,0,116,0, -95,0,53,0,1, -357,887,1,356,898, -19,899,4,28,86, -0,111,0,105,0, -100,0,65,0,114, -0,103,0,69,0, -118,0,101,0,110, -0,116,0,95,0, -52,0,1,356,887, -1,355,900,19,901, -4,28,86,0,111, -0,105,0,100,0, -65,0,114,0,103, -0,69,0,118,0, -101,0,110,0,116, -0,95,0,51,0, -1,355,887,1,354, -902,19,903,4,28, -86,0,111,0,105, -0,100,0,65,0, -114,0,103,0,69, -0,118,0,101,0, -110,0,116,0,95, -0,50,0,1,354, -887,1,353,904,19, -905,4,28,86,0, -111,0,105,0,100, -0,65,0,114,0, -103,0,69,0,118, -0,101,0,110,0, -116,0,95,0,49, -0,1,353,887,1, -352,906,19,907,4, -14,69,0,118,0, -101,0,110,0,116, -0,95,0,57,0, -1,352,908,5,4, -1,2659,909,16,0, -209,1,2470,910,16, -0,209,1,2703,911, -16,0,209,1,2597, -912,16,0,209,1, -351,913,19,914,4, -14,69,0,118,0, -101,0,110,0,116, -0,95,0,56,0, -1,351,908,1,350, -915,19,916,4,14, -69,0,118,0,101, -0,110,0,116,0, -95,0,55,0,1, -350,908,1,349,917, -19,918,4,14,69, -0,118,0,101,0, -110,0,116,0,95, -0,54,0,1,349, -908,1,348,919,19, -920,4,14,69,0, -118,0,101,0,110, -0,116,0,95,0, -53,0,1,348,908, -1,347,921,19,922, -4,14,69,0,118, -0,101,0,110,0, -116,0,95,0,52, -0,1,347,908,1, -346,923,19,924,4, -14,69,0,118,0, -101,0,110,0,116, -0,95,0,51,0, -1,346,908,1,345, -925,19,926,4,14, -69,0,118,0,101, -0,110,0,116,0, -95,0,50,0,1, -345,908,1,344,927, -19,928,4,14,69, -0,118,0,101,0, -110,0,116,0,95, -0,49,0,1,344, -908,1,343,929,19, -930,4,20,84,0, -121,0,112,0,101, -0,110,0,97,0, -109,0,101,0,95, -0,55,0,1,343, -931,5,18,1,1775, -932,16,0,779,1, -2106,933,16,0,779, -1,32,934,16,0, -779,1,1990,935,16, -0,779,1,1804,936, -16,0,779,1,2582, -937,16,0,779,1, -21,938,16,0,779, -1,2198,939,16,0, -779,1,1901,940,16, -0,779,1,10,941, -16,0,779,1,2823, -942,16,0,785,1, -2770,943,16,0,779, -1,1958,944,16,0, -779,1,52,945,16, -0,743,1,2337,946, -16,0,779,1,2075, -947,16,0,779,1, -2413,948,16,0,779, -1,0,949,16,0, -785,1,342,950,19, -951,4,20,84,0, -121,0,112,0,101, -0,110,0,97,0, -109,0,101,0,95, -0,54,0,1,342, -931,1,341,952,19, -953,4,20,84,0, -121,0,112,0,101, -0,110,0,97,0, -109,0,101,0,95, -0,53,0,1,341, -931,1,340,954,19, -955,4,20,84,0, -121,0,112,0,101, -0,110,0,97,0, -109,0,101,0,95, -0,52,0,1,340, -931,1,339,956,19, -957,4,20,84,0, -121,0,112,0,101, -0,110,0,97,0, -109,0,101,0,95, -0,51,0,1,339, -931,1,338,958,19, -959,4,20,84,0, -121,0,112,0,101, -0,110,0,97,0, -109,0,101,0,95, -0,50,0,1,338, -931,1,337,960,19, -961,4,20,84,0, -121,0,112,0,101, -0,110,0,97,0, -109,0,101,0,95, -0,49,0,1,337, -931,1,336,962,19, -963,4,40,69,0, -120,0,112,0,114, -0,101,0,115,0, -115,0,105,0,111, -0,110,0,65,0, -114,0,103,0,117, -0,109,0,101,0, -110,0,116,0,95, -0,49,0,1,336, -964,5,3,1,41, -965,16,0,483,1, -459,966,16,0,483, -1,462,967,16,0, -502,1,335,968,19, -969,4,28,65,0, -114,0,103,0,117, -0,109,0,101,0, -110,0,116,0,76, -0,105,0,115,0, -116,0,95,0,50, -0,1,335,812,1, -334,970,19,971,4, -28,65,0,114,0, -103,0,117,0,109, -0,101,0,110,0, -116,0,76,0,105, -0,115,0,116,0, -95,0,49,0,1, -334,812,1,333,972, -19,973,4,28,70, -0,117,0,110,0, -99,0,116,0,105, -0,111,0,110,0, -67,0,97,0,108, -0,108,0,95,0, -49,0,1,333,974, -5,68,1,1371,975, -16,0,553,1,1958, -976,16,0,553,1, -381,977,16,0,553, -1,217,978,16,0, -553,1,1756,979,16, -0,553,1,509,980, -16,0,553,1,2337, -981,16,0,553,1, -1153,982,16,0,553, -1,166,983,16,0, -553,1,1933,984,16, -0,553,1,2198,985, -16,0,553,1,1731, -986,16,0,553,1, -1335,987,16,0,553, -1,2318,988,16,0, -553,1,346,989,16, -0,553,1,182,990, -16,0,553,1,137, -991,16,0,553,1, -2106,992,16,0,553, -1,1775,993,16,0, -553,1,1117,994,16, -0,553,1,525,995, -16,0,553,1,1901, -996,16,0,553,1, -2293,997,16,0,553, -1,322,998,16,0, -553,1,124,999,16, -0,553,1,1695,1000, -16,0,553,1,299, -1001,16,0,553,1, -1297,1002,16,0,553, -1,151,1003,16,0, -553,1,112,1004,16, -0,553,1,2075,1005, -16,0,553,1,1876, -1006,16,0,553,1, -102,1007,16,0,553, -1,1479,1008,16,0, -553,1,97,1009,16, -0,553,1,1225,1010, -16,0,553,1,89, -1011,16,0,553,1, -85,1012,16,0,553, -1,1659,1013,16,0, -553,1,277,1014,16, -0,553,1,1261,1015, -16,0,553,1,76, -1016,16,0,553,1, -1515,1017,16,0,553, -1,71,1018,16,0, -553,1,462,1019,16, -0,553,1,459,1020, -16,0,553,1,1443, -1021,16,0,553,1, -62,1022,16,0,627, -1,1834,1023,16,0, -553,1,256,1024,16, -0,553,1,447,1025, -16,0,553,1,52, -1026,16,0,553,1, -2413,1027,16,0,553, -1,1622,1028,16,0, -553,1,43,1029,16, -0,553,1,41,1030, -16,0,553,1,236, -1031,16,0,553,1, -431,1032,16,0,553, -1,32,1033,16,0, -553,1,1804,1034,16, -0,553,1,1407,1035, -16,0,553,1,79, -1036,16,0,553,1, -1990,1037,16,0,553, -1,2786,1038,16,0, -553,1,406,1039,16, -0,553,1,1585,1040, -16,0,553,1,1189, -1041,16,0,553,1, -199,1042,16,0,553, -1,332,1043,19,1044, -4,40,84,0,121, -0,112,0,101,0, -99,0,97,0,115, -0,116,0,69,0, -120,0,112,0,114, -0,101,0,115,0, -115,0,105,0,111, -0,110,0,95,0, -57,0,1,332,1045, -5,67,1,1371,1046, -16,0,508,1,1958, -1047,16,0,412,1, -381,1048,16,0,533, -1,217,1049,16,0, -615,1,1756,1050,16, -0,207,1,509,1051, -16,0,466,1,2337, -1052,16,0,412,1, -1153,1053,16,0,605, -1,166,1054,16,0, -670,1,1933,1055,16, -0,255,1,2198,1056, -16,0,412,1,1731, -1057,16,0,158,1, -1335,1058,16,0,518, -1,2318,1059,16,0, -207,1,346,1060,16, -0,559,1,182,1061, -16,0,659,1,137, -1062,16,0,678,1, -2106,1063,16,0,412, -1,1775,1064,16,0, -412,1,1117,1065,16, -0,254,1,525,1066, -16,0,659,1,1901, -1067,16,0,412,1, -2293,1068,16,0,504, -1,322,1069,16,0, -566,1,124,1070,16, -0,682,1,1695,1071, -16,0,196,1,299, -1072,16,0,575,1, -1297,1073,16,0,534, -1,151,1074,16,0, -672,1,112,1075,16, -0,689,1,2075,1076, -16,0,412,1,1876, -1077,16,0,697,1, -102,1078,16,0,693, -1,1479,1079,16,0, -450,1,97,1080,16, -0,145,1,1225,1081, -16,0,573,1,89, -1082,16,0,706,1, -85,1083,16,0,128, -1,1659,1084,16,0, -207,1,277,1085,16, -0,585,1,1261,1086, -16,0,560,1,76, -1087,16,0,774,1, -1515,1088,16,0,440, -1,71,1089,16,0, -732,1,462,1090,16, -0,758,1,459,1091, -16,0,758,1,1443, -1092,16,0,457,1, -1834,1093,16,0,530, -1,256,1094,16,0, -597,1,447,1095,16, -0,659,1,52,1096, -16,0,529,1,2413, -1097,16,0,412,1, -1622,1098,16,0,261, -1,43,1099,16,0, -683,1,41,1100,16, -0,758,1,236,1101, -16,0,604,1,431, -1102,16,0,516,1, -32,1103,16,0,412, -1,1804,1104,16,0, -412,1,1407,1105,16, -0,477,1,79,1106, -16,0,719,1,1990, -1107,16,0,412,1, -2786,1108,16,0,556, -1,406,1109,16,0, -527,1,1585,1110,16, -0,312,1,1189,1111, -16,0,589,1,199, -1112,16,0,626,1, -331,1113,19,1114,4, -40,84,0,121,0, -112,0,101,0,99, -0,97,0,115,0, -116,0,69,0,120, -0,112,0,114,0, -101,0,115,0,115, -0,105,0,111,0, -110,0,95,0,56, -0,1,331,1045,1, -330,1115,19,1116,4, -40,84,0,121,0, -112,0,101,0,99, -0,97,0,115,0, -116,0,69,0,120, -0,112,0,114,0, -101,0,115,0,115, -0,105,0,111,0, -110,0,95,0,55, -0,1,330,1045,1, -329,1117,19,1118,4, -40,84,0,121,0, -112,0,101,0,99, -0,97,0,115,0, -116,0,69,0,120, -0,112,0,114,0, -101,0,115,0,115, -0,105,0,111,0, -110,0,95,0,54, -0,1,329,1045,1, -328,1119,19,1120,4, -40,84,0,121,0, -112,0,101,0,99, -0,97,0,115,0, -116,0,69,0,120, -0,112,0,114,0, -101,0,115,0,115, -0,105,0,111,0, -110,0,95,0,53, -0,1,328,1045,1, -327,1121,19,1122,4, -40,84,0,121,0, -112,0,101,0,99, -0,97,0,115,0, -116,0,69,0,120, -0,112,0,114,0, -101,0,115,0,115, -0,105,0,111,0, -110,0,95,0,52, -0,1,327,1045,1, -326,1123,19,1124,4, -40,84,0,121,0, -112,0,101,0,99, -0,97,0,115,0, -116,0,69,0,120, -0,112,0,114,0, -101,0,115,0,115, -0,105,0,111,0, -110,0,95,0,51, -0,1,326,1045,1, -325,1125,19,1126,4, -40,84,0,121,0, -112,0,101,0,99, -0,97,0,115,0, -116,0,69,0,120, -0,112,0,114,0, -101,0,115,0,115, -0,105,0,111,0, -110,0,95,0,50, -0,1,325,1045,1, -324,1127,19,1128,4, -40,84,0,121,0, -112,0,101,0,99, -0,97,0,115,0, -116,0,69,0,120, -0,112,0,114,0, -101,0,115,0,115, -0,105,0,111,0, -110,0,95,0,49, -0,1,324,1045,1, -323,1129,19,1130,4, -46,80,0,97,0, -114,0,101,0,110, -0,116,0,104,0, -101,0,115,0,105, -0,115,0,69,0, -120,0,112,0,114, -0,101,0,115,0, -115,0,105,0,111, -0,110,0,95,0, -50,0,1,323,1045, -1,322,1131,19,1132, -4,46,80,0,97, -0,114,0,101,0, -110,0,116,0,104, -0,101,0,115,0, -105,0,115,0,69, -0,120,0,112,0, -114,0,101,0,115, -0,115,0,105,0, -111,0,110,0,95, -0,49,0,1,322, -1045,1,321,1133,19, -1134,4,34,85,0, -110,0,97,0,114, -0,121,0,69,0, -120,0,112,0,114, -0,101,0,115,0, -115,0,105,0,111, -0,110,0,95,0, -51,0,1,321,1045, -1,320,1135,19,1136, -4,34,85,0,110, -0,97,0,114,0, -121,0,69,0,120, -0,112,0,114,0, -101,0,115,0,115, -0,105,0,111,0, -110,0,95,0,50, -0,1,320,1045,1, -319,1137,19,1138,4, -34,85,0,110,0, -97,0,114,0,121, -0,69,0,120,0, -112,0,114,0,101, -0,115,0,115,0, -105,0,111,0,110, -0,95,0,49,0, -1,319,1045,1,318, -1139,19,1140,4,38, -66,0,105,0,110, -0,97,0,114,0, -121,0,69,0,120, -0,112,0,114,0, -101,0,115,0,115, -0,105,0,111,0, -110,0,95,0,49, -0,56,0,1,318, -1045,1,317,1141,19, -1142,4,38,66,0, -105,0,110,0,97, -0,114,0,121,0, -69,0,120,0,112, -0,114,0,101,0, -115,0,115,0,105, -0,111,0,110,0, -95,0,49,0,55, -0,1,317,1045,1, -316,1143,19,1144,4, -38,66,0,105,0, -110,0,97,0,114, -0,121,0,69,0, -120,0,112,0,114, -0,101,0,115,0, -115,0,105,0,111, -0,110,0,95,0, -49,0,54,0,1, -316,1045,1,315,1145, -19,1146,4,38,66, -0,105,0,110,0, -97,0,114,0,121, -0,69,0,120,0, -112,0,114,0,101, -0,115,0,115,0, -105,0,111,0,110, -0,95,0,49,0, -53,0,1,315,1045, -1,314,1147,19,1148, -4,38,66,0,105, -0,110,0,97,0, -114,0,121,0,69, -0,120,0,112,0, -114,0,101,0,115, -0,115,0,105,0, -111,0,110,0,95, -0,49,0,52,0, -1,314,1045,1,313, -1149,19,1150,4,38, -66,0,105,0,110, -0,97,0,114,0, -121,0,69,0,120, -0,112,0,114,0, -101,0,115,0,115, -0,105,0,111,0, -110,0,95,0,49, -0,51,0,1,313, -1045,1,312,1151,19, -1152,4,38,66,0, -105,0,110,0,97, -0,114,0,121,0, -69,0,120,0,112, -0,114,0,101,0, -115,0,115,0,105, -0,111,0,110,0, -95,0,49,0,50, -0,1,312,1045,1, -311,1153,19,1154,4, -38,66,0,105,0, -110,0,97,0,114, -0,121,0,69,0, -120,0,112,0,114, -0,101,0,115,0, -115,0,105,0,111, -0,110,0,95,0, -49,0,49,0,1, -311,1045,1,310,1155, -19,1156,4,38,66, -0,105,0,110,0, -97,0,114,0,121, -0,69,0,120,0, -112,0,114,0,101, -0,115,0,115,0, -105,0,111,0,110, -0,95,0,49,0, -48,0,1,310,1045, -1,309,1157,19,1158, -4,36,66,0,105, -0,110,0,97,0, -114,0,121,0,69, -0,120,0,112,0, -114,0,101,0,115, -0,115,0,105,0, -111,0,110,0,95, -0,57,0,1,309, -1045,1,308,1159,19, -1160,4,36,66,0, -105,0,110,0,97, -0,114,0,121,0, -69,0,120,0,112, -0,114,0,101,0, -115,0,115,0,105, -0,111,0,110,0, -95,0,56,0,1, -308,1045,1,307,1161, -19,1162,4,36,66, -0,105,0,110,0, -97,0,114,0,121, -0,69,0,120,0, -112,0,114,0,101, -0,115,0,115,0, -105,0,111,0,110, -0,95,0,55,0, -1,307,1045,1,306, -1163,19,1164,4,36, -66,0,105,0,110, -0,97,0,114,0, -121,0,69,0,120, -0,112,0,114,0, -101,0,115,0,115, -0,105,0,111,0, -110,0,95,0,54, -0,1,306,1045,1, -305,1165,19,1166,4, -36,66,0,105,0, -110,0,97,0,114, -0,121,0,69,0, -120,0,112,0,114, -0,101,0,115,0, -115,0,105,0,111, -0,110,0,95,0, -53,0,1,305,1045, -1,304,1167,19,1168, -4,36,66,0,105, -0,110,0,97,0, -114,0,121,0,69, -0,120,0,112,0, -114,0,101,0,115, -0,115,0,105,0, -111,0,110,0,95, -0,52,0,1,304, -1045,1,303,1169,19, -1170,4,36,66,0, -105,0,110,0,97, -0,114,0,121,0, -69,0,120,0,112, -0,114,0,101,0, -115,0,115,0,105, -0,111,0,110,0, -95,0,51,0,1, -303,1045,1,302,1171, -19,1172,4,36,66, -0,105,0,110,0, -97,0,114,0,121, -0,69,0,120,0, -112,0,114,0,101, -0,115,0,115,0, -105,0,111,0,110, -0,95,0,50,0, -1,302,1045,1,301, -1173,19,1174,4,36, -66,0,105,0,110, -0,97,0,114,0, -121,0,69,0,120, -0,112,0,114,0, -101,0,115,0,115, -0,105,0,111,0, -110,0,95,0,49, -0,1,301,1045,1, -300,1175,19,1176,4, -48,70,0,117,0, -110,0,99,0,116, -0,105,0,111,0, -110,0,67,0,97, -0,108,0,108,0, -69,0,120,0,112, -0,114,0,101,0, -115,0,115,0,105, -0,111,0,110,0, -95,0,49,0,1, -300,1045,1,299,1177, -19,1178,4,60,73, -0,110,0,99,0, -114,0,101,0,109, -0,101,0,110,0, -116,0,68,0,101, -0,99,0,114,0, -101,0,109,0,101, -0,110,0,116,0, -69,0,120,0,112, -0,114,0,101,0, -115,0,115,0,105, -0,111,0,110,0, -95,0,56,0,1, -299,1045,1,298,1179, -19,1180,4,60,73, -0,110,0,99,0, -114,0,101,0,109, -0,101,0,110,0, -116,0,68,0,101, -0,99,0,114,0, -101,0,109,0,101, -0,110,0,116,0, -69,0,120,0,112, -0,114,0,101,0, -115,0,115,0,105, -0,111,0,110,0, -95,0,55,0,1, -298,1045,1,297,1181, -19,1182,4,60,73, -0,110,0,99,0, -114,0,101,0,109, -0,101,0,110,0, -116,0,68,0,101, -0,99,0,114,0, -101,0,109,0,101, -0,110,0,116,0, -69,0,120,0,112, -0,114,0,101,0, -115,0,115,0,105, -0,111,0,110,0, -95,0,54,0,1, -297,1045,1,296,1183, -19,1184,4,60,73, -0,110,0,99,0, -114,0,101,0,109, -0,101,0,110,0, -116,0,68,0,101, -0,99,0,114,0, -101,0,109,0,101, -0,110,0,116,0, -69,0,120,0,112, -0,114,0,101,0, -115,0,115,0,105, -0,111,0,110,0, -95,0,53,0,1, -296,1045,1,295,1185, -19,1186,4,60,73, -0,110,0,99,0, -114,0,101,0,109, -0,101,0,110,0, -116,0,68,0,101, -0,99,0,114,0, -101,0,109,0,101, -0,110,0,116,0, -69,0,120,0,112, -0,114,0,101,0, -115,0,115,0,105, -0,111,0,110,0, -95,0,52,0,1, -295,1045,1,294,1187, -19,1188,4,60,73, -0,110,0,99,0, -114,0,101,0,109, -0,101,0,110,0, -116,0,68,0,101, -0,99,0,114,0, -101,0,109,0,101, -0,110,0,116,0, -69,0,120,0,112, -0,114,0,101,0, -115,0,115,0,105, -0,111,0,110,0, -95,0,51,0,1, -294,1045,1,293,1189, -19,1190,4,60,73, -0,110,0,99,0, -114,0,101,0,109, -0,101,0,110,0, -116,0,68,0,101, -0,99,0,114,0, -101,0,109,0,101, -0,110,0,116,0, -69,0,120,0,112, -0,114,0,101,0, -115,0,115,0,105, -0,111,0,110,0, -95,0,50,0,1, -293,1045,1,292,1191, -19,1192,4,60,73, -0,110,0,99,0, -114,0,101,0,109, -0,101,0,110,0, -116,0,68,0,101, -0,99,0,114,0, -101,0,109,0,101, -0,110,0,116,0, -69,0,120,0,112, -0,114,0,101,0, -115,0,115,0,105, -0,111,0,110,0, -95,0,49,0,1, -292,1045,1,291,1193, -19,1194,4,40,73, -0,100,0,101,0, -110,0,116,0,68, -0,111,0,116,0, -69,0,120,0,112, -0,114,0,101,0, -115,0,115,0,105, -0,111,0,110,0, -95,0,49,0,1, -291,1045,1,290,1195, -19,1196,4,34,73, -0,100,0,101,0, -110,0,116,0,69, -0,120,0,112,0, -114,0,101,0,115, -0,115,0,105,0, -111,0,110,0,95, -0,49,0,1,290, -1045,1,289,1197,19, -1198,4,40,67,0, -111,0,110,0,115, -0,116,0,97,0, -110,0,116,0,69, -0,120,0,112,0, -114,0,101,0,115, -0,115,0,105,0, -111,0,110,0,95, -0,49,0,1,289, -1045,1,288,1199,19, -1200,4,36,82,0, -111,0,116,0,97, -0,116,0,105,0, -111,0,110,0,67, -0,111,0,110,0, -115,0,116,0,97, -0,110,0,116,0, -95,0,49,0,1, -288,1201,5,68,1, -1371,1202,16,0,538, -1,1958,1203,16,0, -538,1,381,1204,16, -0,538,1,217,1205, -16,0,538,1,1756, -1206,16,0,538,1, -509,1207,16,0,538, -1,2337,1208,16,0, -538,1,1153,1209,16, -0,538,1,166,1210, -16,0,538,1,1933, -1211,16,0,538,1, -2198,1212,16,0,538, -1,1731,1213,16,0, -538,1,1335,1214,16, -0,538,1,2318,1215, -16,0,538,1,346, -1216,16,0,538,1, -182,1217,16,0,538, -1,137,1218,16,0, -538,1,2106,1219,16, -0,538,1,1775,1220, -16,0,538,1,1117, -1221,16,0,538,1, -525,1222,16,0,538, -1,1901,1223,16,0, -538,1,2293,1224,16, -0,538,1,322,1225, -16,0,538,1,124, -1226,16,0,538,1, -1695,1227,16,0,538, -1,299,1228,16,0, -538,1,1297,1229,16, -0,538,1,151,1230, -16,0,538,1,112, -1231,16,0,538,1, -2075,1232,16,0,538, -1,1876,1233,16,0, -538,1,102,1234,16, -0,538,1,1479,1235, -16,0,538,1,97, -1236,16,0,538,1, -1225,1237,16,0,538, -1,89,1238,16,0, -538,1,85,1239,16, -0,538,1,1659,1240, -16,0,538,1,277, -1241,16,0,538,1, -1261,1242,16,0,538, -1,76,1243,16,0, -538,1,1515,1244,16, -0,538,1,71,1245, -16,0,538,1,462, -1246,16,0,538,1, -459,1247,16,0,538, -1,1443,1248,16,0, -538,1,62,1249,16, -0,718,1,1834,1250, -16,0,538,1,256, -1251,16,0,538,1, -447,1252,16,0,538, -1,52,1253,16,0, -538,1,2413,1254,16, -0,538,1,1622,1255, -16,0,538,1,43, -1256,16,0,538,1, -41,1257,16,0,538, -1,236,1258,16,0, -538,1,431,1259,16, -0,538,1,32,1260, -16,0,538,1,1804, -1261,16,0,538,1, -1407,1262,16,0,538, -1,79,1263,16,0, -538,1,1990,1264,16, -0,538,1,2786,1265, -16,0,538,1,406, -1266,16,0,538,1, -1585,1267,16,0,538, -1,1189,1268,16,0, -538,1,199,1269,16, -0,538,1,287,1270, -19,1271,4,32,86, -0,101,0,99,0, -116,0,111,0,114, -0,67,0,111,0, -110,0,115,0,116, -0,97,0,110,0, -116,0,95,0,49, -0,1,287,1201,1, -286,1272,19,1273,4, -28,76,0,105,0, -115,0,116,0,67, -0,111,0,110,0, -115,0,116,0,97, -0,110,0,116,0, -95,0,49,0,1, -286,1201,1,285,1274, -19,1275,4,20,67, -0,111,0,110,0, -115,0,116,0,97, -0,110,0,116,0, -95,0,52,0,1, -285,1201,1,284,1276, -19,1277,4,20,67, -0,111,0,110,0, -115,0,116,0,97, -0,110,0,116,0, -95,0,51,0,1, -284,1201,1,283,1278, -19,1279,4,20,67, -0,111,0,110,0, -115,0,116,0,97, -0,110,0,116,0, -95,0,50,0,1, -283,1201,1,282,1280, -19,1281,4,20,67, -0,111,0,110,0, -115,0,116,0,97, -0,110,0,116,0, -95,0,49,0,1, -282,1201,1,281,1282, -19,1283,4,34,82, -0,101,0,116,0, -117,0,114,0,110, -0,83,0,116,0, -97,0,116,0,101, -0,109,0,101,0, -110,0,116,0,95, -0,50,0,1,281, -1284,5,11,1,2413, -1285,16,0,629,1, -2106,1286,16,0,629, -1,1901,1287,16,0, -629,1,1990,1288,16, -0,629,1,2337,1289, -16,0,629,1,1775, -1290,16,0,629,1, -2198,1291,16,0,629, -1,1958,1292,16,0, -629,1,1804,1293,16, -0,629,1,2075,1294, -16,0,629,1,32, -1295,16,0,629,1, -280,1296,19,1297,4, -34,82,0,101,0, -116,0,117,0,114, -0,110,0,83,0, -116,0,97,0,116, -0,101,0,109,0, -101,0,110,0,116, -0,95,0,49,0, -1,280,1284,1,279, -1298,19,1299,4,38, -83,0,105,0,109, -0,112,0,108,0, -101,0,65,0,115, -0,115,0,105,0, -103,0,110,0,109, -0,101,0,110,0, -116,0,95,0,50, -0,52,0,1,279, -1300,5,31,1,1153, -1301,16,0,591,1, -1775,1302,16,0,276, -1,1407,1303,16,0, -465,1,1225,1304,16, -0,565,1,1756,1305, -16,0,515,1,1933, -1306,16,0,446,1, -2198,1307,16,0,276, -1,2106,1308,16,0, -276,1,1659,1309,16, -0,515,1,1479,1310, -16,0,442,1,1834, -1311,16,0,766,1, -52,1312,16,0,708, -1,1297,1313,16,0, -526,1,1117,1314,16, -0,614,1,1958,1315, -16,0,276,1,1695, -1316,16,0,175,1, -1371,1317,16,0,481, -1,1189,1318,16,0, -106,1,1990,1319,16, -0,276,1,2075,1320, -16,0,276,1,1804, -1321,16,0,276,1, -2337,1322,16,0,276, -1,1443,1323,16,0, -454,1,1901,1324,16, -0,276,1,1261,1325, -16,0,543,1,2413, -1326,16,0,276,1, -32,1327,16,0,276, -1,1876,1328,16,0, -558,1,2318,1329,16, -0,515,1,1515,1330, -16,0,596,1,1335, -1331,16,0,513,1, -278,1332,19,1333,4, -38,83,0,105,0, -109,0,112,0,108, -0,101,0,65,0, -115,0,115,0,105, -0,103,0,110,0, -109,0,101,0,110, -0,116,0,95,0, -50,0,51,0,1, -278,1300,1,277,1334, -19,1335,4,38,83, -0,105,0,109,0, -112,0,108,0,101, -0,65,0,115,0, -115,0,105,0,103, -0,110,0,109,0, -101,0,110,0,116, -0,95,0,50,0, -50,0,1,277,1300, -1,276,1336,19,1337, -4,38,83,0,105, -0,109,0,112,0, -108,0,101,0,65, -0,115,0,115,0, -105,0,103,0,110, -0,109,0,101,0, -110,0,116,0,95, -0,50,0,49,0, -1,276,1300,1,275, -1338,19,1339,4,38, -83,0,105,0,109, -0,112,0,108,0, -101,0,65,0,115, -0,115,0,105,0, -103,0,110,0,109, -0,101,0,110,0, -116,0,95,0,50, -0,48,0,1,275, -1300,1,274,1340,19, -1341,4,38,83,0, -105,0,109,0,112, -0,108,0,101,0, -65,0,115,0,115, -0,105,0,103,0, -110,0,109,0,101, -0,110,0,116,0, -95,0,49,0,57, -0,1,274,1300,1, -273,1342,19,1343,4, -38,83,0,105,0, -109,0,112,0,108, -0,101,0,65,0, -115,0,115,0,105, -0,103,0,110,0, -109,0,101,0,110, -0,116,0,95,0, -49,0,56,0,1, -273,1300,1,272,1344, -19,1345,4,38,83, -0,105,0,109,0, -112,0,108,0,101, -0,65,0,115,0, -115,0,105,0,103, -0,110,0,109,0, -101,0,110,0,116, -0,95,0,49,0, -55,0,1,272,1300, -1,271,1346,19,1347, -4,38,83,0,105, -0,109,0,112,0, -108,0,101,0,65, -0,115,0,115,0, -105,0,103,0,110, -0,109,0,101,0, -110,0,116,0,95, -0,49,0,54,0, -1,271,1300,1,270, -1348,19,1349,4,38, -83,0,105,0,109, -0,112,0,108,0, -101,0,65,0,115, -0,115,0,105,0, -103,0,110,0,109, -0,101,0,110,0, -116,0,95,0,49, -0,53,0,1,270, -1300,1,269,1350,19, -1351,4,38,83,0, -105,0,109,0,112, -0,108,0,101,0, -65,0,115,0,115, -0,105,0,103,0, -110,0,109,0,101, -0,110,0,116,0, -95,0,49,0,52, -0,1,269,1300,1, -268,1352,19,1353,4, -38,83,0,105,0, -109,0,112,0,108, -0,101,0,65,0, -115,0,115,0,105, -0,103,0,110,0, -109,0,101,0,110, -0,116,0,95,0, -49,0,51,0,1, -268,1300,1,267,1354, -19,1355,4,38,83, -0,105,0,109,0, -112,0,108,0,101, -0,65,0,115,0, -115,0,105,0,103, -0,110,0,109,0, -101,0,110,0,116, -0,95,0,49,0, -50,0,1,267,1300, -1,266,1356,19,1357, -4,38,83,0,105, -0,109,0,112,0, -108,0,101,0,65, -0,115,0,115,0, -105,0,103,0,110, -0,109,0,101,0, -110,0,116,0,95, -0,49,0,49,0, -1,266,1300,1,265, -1358,19,1359,4,38, -83,0,105,0,109, -0,112,0,108,0, -101,0,65,0,115, -0,115,0,105,0, -103,0,110,0,109, -0,101,0,110,0, -116,0,95,0,49, -0,48,0,1,265, -1300,1,264,1360,19, -1361,4,36,83,0, -105,0,109,0,112, -0,108,0,101,0, -65,0,115,0,115, -0,105,0,103,0, -110,0,109,0,101, -0,110,0,116,0, -95,0,57,0,1, -264,1300,1,263,1362, -19,1363,4,36,83, -0,105,0,109,0, -112,0,108,0,101, -0,65,0,115,0, -115,0,105,0,103, -0,110,0,109,0, -101,0,110,0,116, -0,95,0,56,0, -1,263,1300,1,262, -1364,19,1365,4,36, -83,0,105,0,109, -0,112,0,108,0, -101,0,65,0,115, -0,115,0,105,0, -103,0,110,0,109, -0,101,0,110,0, -116,0,95,0,55, -0,1,262,1300,1, -261,1366,19,1367,4, -36,83,0,105,0, -109,0,112,0,108, -0,101,0,65,0, -115,0,115,0,105, -0,103,0,110,0, -109,0,101,0,110, -0,116,0,95,0, -54,0,1,261,1300, -1,260,1368,19,1369, -4,36,83,0,105, -0,109,0,112,0, -108,0,101,0,65, -0,115,0,115,0, -105,0,103,0,110, -0,109,0,101,0, -110,0,116,0,95, -0,53,0,1,260, -1300,1,259,1370,19, -1371,4,36,83,0, -105,0,109,0,112, -0,108,0,101,0, -65,0,115,0,115, -0,105,0,103,0, -110,0,109,0,101, -0,110,0,116,0, -95,0,52,0,1, -259,1300,1,258,1372, -19,1373,4,36,83, -0,105,0,109,0, -112,0,108,0,101, -0,65,0,115,0, -115,0,105,0,103, -0,110,0,109,0, -101,0,110,0,116, -0,95,0,51,0, -1,258,1300,1,257, -1374,19,1375,4,36, -83,0,105,0,109, -0,112,0,108,0, -101,0,65,0,115, -0,115,0,105,0, -103,0,110,0,109, -0,101,0,110,0, -116,0,95,0,50, -0,1,257,1300,1, -256,1376,19,1377,4, -36,83,0,105,0, -109,0,112,0,108, -0,101,0,65,0, -115,0,115,0,105, -0,103,0,110,0, -109,0,101,0,110, -0,116,0,95,0, -49,0,1,256,1300, -1,255,1378,19,1379, -4,24,65,0,115, -0,115,0,105,0, -103,0,110,0,109, -0,101,0,110,0, -116,0,95,0,50, -0,1,255,1380,5, -11,1,2413,1381,16, -0,472,1,2106,1382, -16,0,472,1,1901, -1383,16,0,472,1, -1990,1384,16,0,472, -1,2337,1385,16,0, -472,1,1775,1386,16, -0,472,1,2198,1387, -16,0,472,1,1958, -1388,16,0,472,1, -1804,1389,16,0,472, -1,2075,1390,16,0, -472,1,32,1391,16, -0,472,1,254,1392, -19,1393,4,24,65, -0,115,0,115,0, -105,0,103,0,110, -0,109,0,101,0, -110,0,116,0,95, -0,49,0,1,254, -1380,1,253,1394,19, -1395,4,36,70,0, -111,0,114,0,76, -0,111,0,111,0, -112,0,83,0,116, -0,97,0,116,0, -101,0,109,0,101, -0,110,0,116,0, -95,0,52,0,1, -253,1396,5,3,1, -1756,1397,16,0,140, -1,2318,1398,16,0, -476,1,1659,1399,16, -0,198,1,252,1400, -19,1401,4,36,70, -0,111,0,114,0, -76,0,111,0,111, -0,112,0,83,0, -116,0,97,0,116, -0,101,0,109,0, -101,0,110,0,116, -0,95,0,51,0, -1,252,1396,1,251, -1402,19,1403,4,36, -70,0,111,0,114, -0,76,0,111,0, -111,0,112,0,83, -0,116,0,97,0, -116,0,101,0,109, -0,101,0,110,0, -116,0,95,0,50, -0,1,251,1396,1, -250,1404,19,1405,4, -36,70,0,111,0, -114,0,76,0,111, -0,111,0,112,0, -83,0,116,0,97, -0,116,0,101,0, -109,0,101,0,110, -0,116,0,95,0, -49,0,1,250,1396, -1,249,1406,19,1407, -4,18,70,0,111, -0,114,0,76,0, -111,0,111,0,112, -0,95,0,50,0, -1,249,1408,5,11, -1,2413,1409,16,0, -651,1,2106,1410,16, -0,651,1,1901,1411, -16,0,651,1,1990, -1412,16,0,651,1, -2337,1413,16,0,651, -1,1775,1414,16,0, -651,1,2198,1415,16, -0,651,1,1958,1416, -16,0,651,1,1804, -1417,16,0,651,1, -2075,1418,16,0,651, -1,32,1419,16,0, -651,1,248,1420,19, -1421,4,18,70,0, -111,0,114,0,76, -0,111,0,111,0, -112,0,95,0,49, -0,1,248,1408,1, -247,1422,19,1423,4, -36,68,0,111,0, -87,0,104,0,105, -0,108,0,101,0, -83,0,116,0,97, -0,116,0,101,0, -109,0,101,0,110, -0,116,0,95,0, -50,0,1,247,1424, -5,11,1,2413,1425, -16,0,648,1,2106, -1426,16,0,648,1, -1901,1427,16,0,648, -1,1990,1428,16,0, -648,1,2337,1429,16, -0,648,1,1775,1430, -16,0,648,1,2198, -1431,16,0,648,1, -1958,1432,16,0,648, -1,1804,1433,16,0, -648,1,2075,1434,16, -0,648,1,32,1435, -16,0,648,1,246, -1436,19,1437,4,36, -68,0,111,0,87, -0,104,0,105,0, -108,0,101,0,83, -0,116,0,97,0, -116,0,101,0,109, -0,101,0,110,0, -116,0,95,0,49, -0,1,246,1424,1, -245,1438,19,1439,4, -32,87,0,104,0, -105,0,108,0,101, -0,83,0,116,0, -97,0,116,0,101, -0,109,0,101,0, -110,0,116,0,95, -0,50,0,1,245, -1440,5,11,1,2413, -1441,16,0,645,1, -2106,1442,16,0,645, -1,1901,1443,16,0, -645,1,1990,1444,16, -0,645,1,2337,1445, -16,0,645,1,1775, -1446,16,0,645,1, -2198,1447,16,0,645, -1,1958,1448,16,0, -645,1,1804,1449,16, -0,645,1,2075,1450, -16,0,645,1,32, -1451,16,0,645,1, -244,1452,19,1453,4, -32,87,0,104,0, -105,0,108,0,101, -0,83,0,116,0, -97,0,116,0,101, -0,109,0,101,0, -110,0,116,0,95, -0,49,0,1,244, -1440,1,243,1454,19, -1455,4,26,73,0, -102,0,83,0,116, -0,97,0,116,0, -101,0,109,0,101, -0,110,0,116,0, -95,0,52,0,1, -243,1456,5,11,1, -2413,1457,16,0,165, -1,2106,1458,16,0, -165,1,1901,1459,16, -0,165,1,1990,1460, -16,0,165,1,2337, -1461,16,0,165,1, -1775,1462,16,0,165, -1,2198,1463,16,0, -165,1,1958,1464,16, -0,165,1,1804,1465, -16,0,165,1,2075, -1466,16,0,165,1, -32,1467,16,0,165, -1,242,1468,19,1469, -4,26,73,0,102, -0,83,0,116,0, -97,0,116,0,101, -0,109,0,101,0, -110,0,116,0,95, -0,51,0,1,242, -1456,1,241,1470,19, -1471,4,26,73,0, -102,0,83,0,116, -0,97,0,116,0, -101,0,109,0,101, -0,110,0,116,0, -95,0,50,0,1, -241,1456,1,240,1472, -19,1473,4,26,73, -0,102,0,83,0, -116,0,97,0,116, -0,101,0,109,0, -101,0,110,0,116, -0,95,0,49,0, -1,240,1456,1,239, -1474,19,1475,4,26, -83,0,116,0,97, -0,116,0,101,0, -67,0,104,0,97, -0,110,0,103,0, -101,0,95,0,50, -0,1,239,1476,5, -11,1,2413,1477,16, -0,641,1,2106,1478, -16,0,641,1,1901, -1479,16,0,641,1, -1990,1480,16,0,641, -1,2337,1481,16,0, -641,1,1775,1482,16, -0,641,1,2198,1483, -16,0,641,1,1958, -1484,16,0,641,1, -1804,1485,16,0,641, -1,2075,1486,16,0, -641,1,32,1487,16, -0,641,1,238,1488, -19,1489,4,26,83, -0,116,0,97,0, -116,0,101,0,67, -0,104,0,97,0, -110,0,103,0,101, -0,95,0,49,0, -1,238,1476,1,237, -1490,19,1491,4,30, -74,0,117,0,109, -0,112,0,83,0, -116,0,97,0,116, -0,101,0,109,0, -101,0,110,0,116, -0,95,0,49,0, -1,237,1492,5,11, -1,2413,1493,16,0, -619,1,2106,1494,16, -0,619,1,1901,1495, -16,0,619,1,1990, -1496,16,0,619,1, -2337,1497,16,0,619, -1,1775,1498,16,0, -619,1,2198,1499,16, -0,619,1,1958,1500, -16,0,619,1,1804, -1501,16,0,619,1, -2075,1502,16,0,619, -1,32,1503,16,0, -619,1,236,1504,19, -1505,4,22,74,0, -117,0,109,0,112, -0,76,0,97,0, -98,0,101,0,108, -0,95,0,49,0, -1,236,1506,5,11, -1,2413,1507,16,0, -633,1,2106,1508,16, -0,633,1,1901,1509, -16,0,633,1,1990, -1510,16,0,633,1, -2337,1511,16,0,633, -1,1775,1512,16,0, -633,1,2198,1513,16, -0,633,1,1958,1514, -16,0,633,1,1804, -1515,16,0,633,1, -2075,1516,16,0,633, -1,32,1517,16,0, -633,1,235,1518,19, -1519,4,24,83,0, -116,0,97,0,116, -0,101,0,109,0, -101,0,110,0,116, -0,95,0,49,0, -51,0,1,235,1520, -5,11,1,2413,1521, -16,0,432,1,2106, -1522,16,0,581,1, -1901,1523,16,0,143, -1,1990,1524,16,0, -666,1,2337,1525,16, -0,458,1,1775,1526, -16,0,127,1,2198, -1527,16,0,532,1, -1958,1528,16,0,674, -1,1804,1529,16,0, -121,1,2075,1530,16, -0,595,1,32,1531, -16,0,430,1,234, -1532,19,1533,4,24, -83,0,116,0,97, -0,116,0,101,0, -109,0,101,0,110, -0,116,0,95,0, -49,0,50,0,1, -234,1520,1,233,1534, -19,1535,4,24,83, -0,116,0,97,0, -116,0,101,0,109, -0,101,0,110,0, -116,0,95,0,49, -0,49,0,1,233, -1520,1,232,1536,19, -1537,4,24,83,0, -116,0,97,0,116, -0,101,0,109,0, -101,0,110,0,116, -0,95,0,49,0, -48,0,1,232,1520, -1,231,1538,19,1539, -4,22,83,0,116, -0,97,0,116,0, -101,0,109,0,101, -0,110,0,116,0, -95,0,57,0,1, -231,1520,1,230,1540, -19,1541,4,22,83, -0,116,0,97,0, -116,0,101,0,109, -0,101,0,110,0, -116,0,95,0,56, -0,1,230,1520,1, -229,1542,19,1543,4, -22,83,0,116,0, -97,0,116,0,101, -0,109,0,101,0, -110,0,116,0,95, -0,55,0,1,229, -1520,1,228,1544,19, -1545,4,22,83,0, -116,0,97,0,116, -0,101,0,109,0, -101,0,110,0,116, -0,95,0,54,0, -1,228,1520,1,227, -1546,19,1547,4,22, -83,0,116,0,97, -0,116,0,101,0, -109,0,101,0,110, -0,116,0,95,0, -53,0,1,227,1520, -1,226,1548,19,1549, -4,22,83,0,116, -0,97,0,116,0, -101,0,109,0,101, -0,110,0,116,0, -95,0,52,0,1, -226,1520,1,225,1550, -19,1551,4,22,83, -0,116,0,97,0, -116,0,101,0,109, -0,101,0,110,0, -116,0,95,0,51, -0,1,225,1520,1, -224,1552,19,1553,4, -22,83,0,116,0, -97,0,116,0,101, -0,109,0,101,0, -110,0,116,0,95, -0,50,0,1,224, -1520,1,223,1554,19, -1555,4,22,83,0, -116,0,97,0,116, -0,101,0,109,0, -101,0,110,0,116, -0,95,0,49,0, -1,223,1520,1,222, -1556,19,1557,4,32, -69,0,109,0,112, -0,116,0,121,0, -83,0,116,0,97, -0,116,0,101,0, -109,0,101,0,110, -0,116,0,95,0, -49,0,1,222,1558, -5,11,1,2413,1559, -16,0,623,1,2106, -1560,16,0,623,1, -1901,1561,16,0,623, -1,1990,1562,16,0, -623,1,2337,1563,16, -0,623,1,1775,1564, -16,0,623,1,2198, -1565,16,0,623,1, -1958,1566,16,0,623, -1,1804,1567,16,0, -623,1,2075,1568,16, -0,623,1,32,1569, -16,0,623,1,221, -1570,19,1571,4,30, -83,0,116,0,97, -0,116,0,101,0, -109,0,101,0,110, -0,116,0,76,0, -105,0,115,0,116, -0,95,0,50,0, -1,221,1572,5,1, -1,32,1573,16,0, -447,1,220,1574,19, -1575,4,30,83,0, -116,0,97,0,116, -0,101,0,109,0, -101,0,110,0,116, -0,76,0,105,0, -115,0,116,0,95, -0,49,0,1,220, -1572,1,219,1576,19, -1577,4,38,67,0, -111,0,109,0,112, -0,111,0,117,0, -110,0,100,0,83, -0,116,0,97,0, -116,0,101,0,109, -0,101,0,110,0, -116,0,95,0,50, -0,1,219,1578,5, -21,1,1775,1579,16, -0,654,1,2106,1580, -16,0,654,1,2593, -1581,16,0,200,1, -32,1582,16,0,654, -1,31,1583,16,0, -428,1,1990,1584,16, -0,654,1,1804,1585, -16,0,654,1,2578, -1586,16,0,212,1, -2075,1587,16,0,654, -1,2573,1588,16,0, -218,1,1958,1589,16, -0,654,1,2534,1590, -16,0,281,1,2781, -1591,16,0,772,1, -2198,1592,16,0,654, -1,1901,1593,16,0, -654,1,2565,1594,16, -0,230,1,2549,1595, -16,0,699,1,2413, -1596,16,0,654,1, -2337,1597,16,0,654, -1,2557,1598,16,0, -242,1,2519,1599,16, -0,299,1,218,1600, -19,1601,4,38,67, -0,111,0,109,0, -112,0,111,0,117, -0,110,0,100,0, -83,0,116,0,97, -0,116,0,101,0, -109,0,101,0,110, -0,116,0,95,0, -49,0,1,218,1578, -1,217,1602,19,1603, -4,32,82,0,111, -0,116,0,68,0, -101,0,99,0,108, -0,97,0,114,0, -97,0,116,0,105, -0,111,0,110,0, -95,0,49,0,1, -217,1604,5,2,1, -2545,1605,16,0,525, -1,2541,1606,16,0, -263,1,216,1607,19, -1608,4,32,86,0, -101,0,99,0,68, -0,101,0,99,0, -108,0,97,0,114, -0,97,0,116,0, -105,0,111,0,110, -0,95,0,49,0, -1,216,1609,5,3, -1,2526,1610,16,0, -288,1,2553,1611,16, -0,247,1,2530,1612, -16,0,286,1,215, -1613,19,1614,4,32, -73,0,110,0,116, -0,68,0,101,0, -99,0,108,0,97, -0,114,0,97,0, -116,0,105,0,111, -0,110,0,95,0, -49,0,1,215,1615, -5,5,1,2561,1616, -16,0,235,1,2511, -1617,16,0,306,1, -2538,1618,16,0,687, -1,2523,1619,16,0, -294,1,2515,1620,16, -0,304,1,214,1621, -19,1622,4,32,75, -0,101,0,121,0, -68,0,101,0,99, -0,108,0,97,0, -114,0,97,0,116, -0,105,0,111,0, -110,0,95,0,49, -0,1,214,1623,5, -2,1,2507,1624,16, -0,761,1,2569,1625, -16,0,223,1,213, -1626,19,1627,4,26, -68,0,101,0,99, -0,108,0,97,0, -114,0,97,0,116, -0,105,0,111,0, -110,0,95,0,49, -0,1,213,1628,5, -17,1,1775,1629,16, -0,273,1,2106,1630, -16,0,273,1,32, -1631,16,0,273,1, -1990,1632,16,0,273, -1,1804,1633,16,0, -273,1,2582,1634,16, -0,427,1,21,1635, -16,0,769,1,2198, -1636,16,0,273,1, -1901,1637,16,0,273, -1,10,1638,16,0, -427,1,2823,1639,16, -0,771,1,2770,1640, -16,0,427,1,1958, -1641,16,0,273,1, -2337,1642,16,0,273, -1,2075,1643,16,0, -273,1,2413,1644,16, -0,273,1,0,1645, -16,0,771,1,212, -1646,19,1647,4,68, -75,0,101,0,121, -0,73,0,110,0, -116,0,73,0,110, -0,116,0,65,0, -114,0,103,0,117, -0,109,0,101,0, -110,0,116,0,68, -0,101,0,99,0, -108,0,97,0,114, -0,97,0,116,0, -105,0,111,0,110, -0,76,0,105,0, -115,0,116,0,95, -0,49,0,1,212, -1648,5,1,1,2507, -1649,16,0,301,1, -211,1650,19,1651,4, -68,73,0,110,0, -116,0,86,0,101, -0,99,0,86,0, -101,0,99,0,65, -0,114,0,103,0, -117,0,109,0,101, -0,110,0,116,0, -68,0,101,0,99, -0,108,0,97,0, -114,0,97,0,116, -0,105,0,111,0, -110,0,76,0,105, -0,115,0,116,0, -95,0,49,0,1, -211,1652,5,1,1, -2523,1653,16,0,283, -1,210,1654,19,1655, -4,68,73,0,110, -0,116,0,82,0, -111,0,116,0,82, -0,111,0,116,0, -65,0,114,0,103, -0,117,0,109,0, -101,0,110,0,116, -0,68,0,101,0, -99,0,108,0,97, -0,114,0,97,0, -116,0,105,0,111, -0,110,0,76,0, -105,0,115,0,116, -0,95,0,49,0, -1,210,1656,5,1, -1,2538,1657,16,0, -258,1,209,1658,19, -1659,4,62,86,0, -101,0,99,0,116, -0,111,0,114,0, -65,0,114,0,103, -0,117,0,109,0, -101,0,110,0,116, -0,68,0,101,0, -99,0,108,0,97, -0,114,0,97,0, -116,0,105,0,111, -0,110,0,76,0, -105,0,115,0,116, -0,95,0,49,0, -1,209,1660,5,1, -1,2553,1661,16,0, -244,1,208,1662,19, -1663,4,56,73,0, -110,0,116,0,65, -0,114,0,103,0, -117,0,109,0,101, -0,110,0,116,0, -68,0,101,0,99, -0,108,0,97,0, -114,0,97,0,116, -0,105,0,111,0, -110,0,76,0,105, -0,115,0,116,0, -95,0,49,0,1, -208,1664,5,1,1, -2561,1665,16,0,232, -1,207,1666,19,1667, -4,56,75,0,101, -0,121,0,65,0, -114,0,103,0,117, -0,109,0,101,0, -110,0,116,0,68, -0,101,0,99,0, -108,0,97,0,114, -0,97,0,116,0, -105,0,111,0,110, -0,76,0,105,0, -115,0,116,0,95, -0,49,0,1,207, -1668,5,1,1,2569, -1669,16,0,220,1, -206,1670,19,1671,4, -50,65,0,114,0, -103,0,117,0,109, -0,101,0,110,0, -116,0,68,0,101, -0,99,0,108,0, -97,0,114,0,97, -0,116,0,105,0, -111,0,110,0,76, -0,105,0,115,0, -116,0,95,0,50, -0,1,206,804,1, -205,1672,19,1673,4, -50,65,0,114,0, -103,0,117,0,109, -0,101,0,110,0, -116,0,68,0,101, -0,99,0,108,0, -97,0,114,0,97, -0,116,0,105,0, -111,0,110,0,76, -0,105,0,115,0, -116,0,95,0,49, -0,1,205,804,1, -204,1674,19,1675,4, -48,75,0,101,0, -121,0,73,0,110, -0,116,0,73,0, -110,0,116,0,65, -0,114,0,103,0, -83,0,116,0,97, -0,116,0,101,0, -69,0,118,0,101, -0,110,0,116,0, -95,0,49,0,1, -204,1676,5,4,1, -2659,1677,16,0,467, -1,2470,1678,16,0, -467,1,2703,1679,16, -0,189,1,2597,1680, -16,0,189,1,203, -1681,19,1682,4,48, -73,0,110,0,116, -0,86,0,101,0, -99,0,86,0,101, -0,99,0,65,0, -114,0,103,0,83, -0,116,0,97,0, -116,0,101,0,69, -0,118,0,101,0, -110,0,116,0,95, -0,49,0,1,203, -1683,5,4,1,2659, -1684,16,0,171,1, -2470,1685,16,0,171, -1,2703,1686,16,0, -188,1,2597,1687,16, -0,188,1,202,1688, -19,1689,4,48,73, -0,110,0,116,0, -82,0,111,0,116, -0,82,0,111,0, -116,0,65,0,114, -0,103,0,83,0, -116,0,97,0,116, -0,101,0,69,0, -118,0,101,0,110, -0,116,0,95,0, -49,0,1,202,1690, -5,4,1,2659,1691, -16,0,168,1,2470, -1692,16,0,168,1, -2703,1693,16,0,187, -1,2597,1694,16,0, -187,1,201,1695,19, -1696,4,42,86,0, -101,0,99,0,116, -0,111,0,114,0, -65,0,114,0,103, -0,83,0,116,0, -97,0,116,0,101, -0,69,0,118,0, -101,0,110,0,116, -0,95,0,49,0, -1,201,1697,5,4, -1,2659,1698,16,0, -256,1,2470,1699,16, -0,256,1,2703,1700, -16,0,184,1,2597, -1701,16,0,184,1, -200,1702,19,1703,4, -36,73,0,110,0, -116,0,65,0,114, -0,103,0,83,0, -116,0,97,0,116, -0,101,0,69,0, -118,0,101,0,110, -0,116,0,95,0, -49,0,1,200,1704, -5,4,1,2659,1705, -16,0,162,1,2470, -1706,16,0,162,1, -2703,1707,16,0,183, -1,2597,1708,16,0, -183,1,199,1709,19, -1710,4,36,75,0, -101,0,121,0,65, -0,114,0,103,0, -83,0,116,0,97, -0,116,0,101,0, -69,0,118,0,101, -0,110,0,116,0, -95,0,49,0,1, -199,1711,5,4,1, -2659,1712,16,0,700, -1,2470,1713,16,0, -700,1,2703,1714,16, -0,180,1,2597,1715, -16,0,180,1,198, -1716,19,1717,4,38, -86,0,111,0,105, -0,100,0,65,0, -114,0,103,0,83, -0,116,0,97,0, -116,0,101,0,69, -0,118,0,101,0, -110,0,116,0,95, -0,49,0,1,198, -1718,5,4,1,2659, -1719,16,0,577,1, -2470,1720,16,0,577, -1,2703,1721,16,0, -177,1,2597,1722,16, -0,177,1,197,1723, -19,1724,4,24,83, -0,116,0,97,0, -116,0,101,0,69, -0,118,0,101,0, -110,0,116,0,95, -0,49,0,1,197, -1725,5,4,1,2659, -1726,16,0,155,1, -2470,1727,16,0,155, -1,2703,1728,16,0, -176,1,2597,1729,16, -0,176,1,196,1730, -19,1731,4,24,83, -0,116,0,97,0, -116,0,101,0,66, -0,111,0,100,0, -121,0,95,0,49, -0,54,0,1,196, -1732,5,2,1,2470, -1733,16,0,199,1, -2659,1734,16,0,134, -1,195,1735,19,1736, -4,24,83,0,116, -0,97,0,116,0, -101,0,66,0,111, -0,100,0,121,0, -95,0,49,0,53, -0,1,195,1732,1, -194,1737,19,1738,4, -24,83,0,116,0, -97,0,116,0,101, -0,66,0,111,0, -100,0,121,0,95, -0,49,0,52,0, -1,194,1732,1,193, -1739,19,1740,4,24, -83,0,116,0,97, -0,116,0,101,0, -66,0,111,0,100, -0,121,0,95,0, -49,0,51,0,1, -193,1732,1,192,1741, -19,1742,4,24,83, -0,116,0,97,0, -116,0,101,0,66, -0,111,0,100,0, -121,0,95,0,49, -0,50,0,1,192, -1732,1,191,1743,19, -1744,4,24,83,0, -116,0,97,0,116, -0,101,0,66,0, -111,0,100,0,121, -0,95,0,49,0, -49,0,1,191,1732, -1,190,1745,19,1746, -4,24,83,0,116, -0,97,0,116,0, -101,0,66,0,111, -0,100,0,121,0, -95,0,49,0,48, -0,1,190,1732,1, -189,1747,19,1748,4, -22,83,0,116,0, -97,0,116,0,101, -0,66,0,111,0, -100,0,121,0,95, -0,57,0,1,189, -1732,1,188,1749,19, -1750,4,22,83,0, -116,0,97,0,116, -0,101,0,66,0, -111,0,100,0,121, -0,95,0,56,0, -1,188,1732,1,187, -1751,19,1752,4,22, -83,0,116,0,97, -0,116,0,101,0, -66,0,111,0,100, -0,121,0,95,0, -55,0,1,187,1732, -1,186,1753,19,1754, -4,22,83,0,116, -0,97,0,116,0, -101,0,66,0,111, -0,100,0,121,0, -95,0,54,0,1, -186,1732,1,185,1755, -19,1756,4,22,83, -0,116,0,97,0, -116,0,101,0,66, -0,111,0,100,0, -121,0,95,0,53, -0,1,185,1732,1, -184,1757,19,1758,4, -22,83,0,116,0, -97,0,116,0,101, -0,66,0,111,0, -100,0,121,0,95, -0,52,0,1,184, -1732,1,183,1759,19, -1760,4,22,83,0, -116,0,97,0,116, -0,101,0,66,0, -111,0,100,0,121, -0,95,0,51,0, -1,183,1732,1,182, -1761,19,1762,4,22, -83,0,116,0,97, -0,116,0,101,0, -66,0,111,0,100, -0,121,0,95,0, -50,0,1,182,1732, -1,181,1763,19,1764, -4,22,83,0,116, -0,97,0,116,0, -101,0,66,0,111, -0,100,0,121,0, -95,0,49,0,1, -181,1732,1,180,1765, -19,1766,4,14,83, -0,116,0,97,0, -116,0,101,0,95, -0,50,0,1,180, -1767,5,4,1,2764, -1768,16,0,192,1, -2834,1769,16,0,192, -1,2823,1770,16,0, -782,1,0,1771,16, -0,782,1,179,1772, -19,1773,4,14,83, -0,116,0,97,0, -116,0,101,0,95, -0,49,0,1,179, -1767,1,178,1774,19, -1775,4,16,83,0, -116,0,97,0,116, -0,101,0,115,0, -95,0,50,0,1, -178,1776,5,2,1, -0,1777,16,0,582, -1,2823,1778,16,0, -724,1,177,1779,19, -1780,4,16,83,0, -116,0,97,0,116, -0,101,0,115,0, -95,0,49,0,1, -177,1776,1,176,1781, -19,1782,4,52,71, -0,108,0,111,0, -98,0,97,0,108, -0,70,0,117,0, -110,0,99,0,116, -0,105,0,111,0, -110,0,68,0,101, -0,102,0,105,0, -110,0,105,0,116, -0,105,0,111,0, -110,0,95,0,50, -0,1,176,1783,5, -2,1,0,1784,16, -0,711,1,2823,1785, -16,0,717,1,175, -1786,19,1787,4,52, -71,0,108,0,111, -0,98,0,97,0, -108,0,70,0,117, -0,110,0,99,0, -116,0,105,0,111, -0,110,0,68,0, -101,0,102,0,105, -0,110,0,105,0, -116,0,105,0,111, -0,110,0,95,0, -49,0,1,175,1783, -1,174,1788,19,1789, -4,54,71,0,108, -0,111,0,98,0, -97,0,108,0,86, -0,97,0,114,0, -105,0,97,0,98, -0,108,0,101,0, -68,0,101,0,99, -0,108,0,97,0, -114,0,97,0,116, -0,105,0,111,0, -110,0,95,0,50, -0,1,174,1790,5, -2,1,0,1791,16, -0,710,1,2823,1792, -16,0,519,1,173, -1793,19,1794,4,54, -71,0,108,0,111, -0,98,0,97,0, -108,0,86,0,97, -0,114,0,105,0, -97,0,98,0,108, -0,101,0,68,0, -101,0,99,0,108, -0,97,0,114,0, -97,0,116,0,105, -0,111,0,110,0, -95,0,49,0,1, -173,1790,1,172,1795, -19,1796,4,38,71, -0,108,0,111,0, -98,0,97,0,108, -0,68,0,101,0, -102,0,105,0,110, -0,105,0,116,0, -105,0,111,0,110, -0,115,0,95,0, -52,0,1,172,1797, -5,1,1,0,1798, -16,0,610,1,171, -1799,19,1800,4,38, -71,0,108,0,111, -0,98,0,97,0, -108,0,68,0,101, -0,102,0,105,0, -110,0,105,0,116, -0,105,0,111,0, -110,0,115,0,95, -0,51,0,1,171, -1797,1,170,1801,19, -1802,4,38,71,0, -108,0,111,0,98, -0,97,0,108,0, -68,0,101,0,102, -0,105,0,110,0, -105,0,116,0,105, -0,111,0,110,0, -115,0,95,0,50, -0,1,170,1797,1, -169,1803,19,1804,4, -38,71,0,108,0, -111,0,98,0,97, -0,108,0,68,0, -101,0,102,0,105, -0,110,0,105,0, -116,0,105,0,111, -0,110,0,115,0, -95,0,49,0,1, -169,1797,1,168,1805, -19,1806,4,32,76, -0,83,0,76,0, -80,0,114,0,111, -0,103,0,114,0, -97,0,109,0,82, -0,111,0,111,0, -116,0,95,0,50, -0,1,168,1807,5, -1,1,0,1808,16, -0,104,1,167,1809, -19,1810,4,32,76, -0,83,0,76,0, -80,0,114,0,111, -0,103,0,114,0, -97,0,109,0,82, -0,111,0,111,0, -116,0,95,0,49, -0,1,167,1807,1, -165,1811,19,1812,4, -56,73,0,110,0, -99,0,114,0,101, -0,109,0,101,0, -110,0,116,0,68, -0,101,0,99,0, -114,0,101,0,109, -0,101,0,110,0, -116,0,69,0,120, -0,112,0,114,0, -101,0,115,0,115, -0,105,0,111,0, -110,0,1,165,1045, -1,164,1813,19,1814, -4,42,80,0,97, -0,114,0,101,0, -110,0,116,0,104, -0,101,0,115,0, -105,0,115,0,69, -0,120,0,112,0, -114,0,101,0,115, -0,115,0,105,0, -111,0,110,0,1, -164,1045,1,163,1815, -19,1816,4,36,84, -0,121,0,112,0, -101,0,99,0,97, -0,115,0,116,0, -69,0,120,0,112, -0,114,0,101,0, -115,0,115,0,105, -0,111,0,110,0, -1,163,1045,1,162, -1817,19,1818,4,30, -85,0,110,0,97, -0,114,0,121,0, -69,0,120,0,112, -0,114,0,101,0, -115,0,115,0,105, -0,111,0,110,0, -1,162,1045,1,161, -1819,19,1820,4,32, -66,0,105,0,110, -0,97,0,114,0, -121,0,69,0,120, -0,112,0,114,0, -101,0,115,0,115, -0,105,0,111,0, -110,0,1,161,1045, -1,160,1821,19,1822, -4,44,70,0,117, -0,110,0,99,0, -116,0,105,0,111, -0,110,0,67,0, -97,0,108,0,108, -0,69,0,120,0, -112,0,114,0,101, -0,115,0,115,0, -105,0,111,0,110, -0,1,160,1045,1, -159,1823,19,1824,4, -36,73,0,100,0, -101,0,110,0,116, -0,68,0,111,0, -116,0,69,0,120, -0,112,0,114,0, -101,0,115,0,115, -0,105,0,111,0, -110,0,1,159,1045, -1,158,1825,19,1826, -4,30,73,0,100, -0,101,0,110,0, -116,0,69,0,120, -0,112,0,114,0, -101,0,115,0,115, -0,105,0,111,0, -110,0,1,158,1045, -1,157,1827,19,1828, -4,36,67,0,111, -0,110,0,115,0, -116,0,97,0,110, -0,116,0,69,0, -120,0,112,0,114, -0,101,0,115,0, -115,0,105,0,111, -0,110,0,1,157, -1045,1,156,1829,19, -130,1,156,1045,1, -155,1830,19,1831,4, -24,76,0,105,0, -115,0,116,0,67, -0,111,0,110,0, -115,0,116,0,97, -0,110,0,116,0, -1,155,1201,1,154, -1832,19,1833,4,32, -82,0,111,0,116, -0,97,0,116,0, -105,0,111,0,110, -0,67,0,111,0, -110,0,115,0,116, -0,97,0,110,0, -116,0,1,154,1201, -1,153,1834,19,1835, -4,28,86,0,101, -0,99,0,116,0, -111,0,114,0,67, -0,111,0,110,0, -115,0,116,0,97, -0,110,0,116,0, -1,153,1201,1,152, -1836,19,540,1,152, -1201,1,151,1837,19, -1838,4,36,69,0, -120,0,112,0,114, -0,101,0,115,0, -115,0,105,0,111, -0,110,0,65,0, -114,0,103,0,117, -0,109,0,101,0, -110,0,116,0,1, -151,964,1,150,1839, -19,485,1,150,964, -1,149,1840,19,133, -1,149,812,1,148, -1841,19,555,1,148, -974,1,147,1842,19, -142,1,147,1396,1, -146,1843,19,653,1, -146,1408,1,145,1844, -19,650,1,145,1424, -1,144,1845,19,647, -1,144,1440,1,143, -1846,19,167,1,143, -1456,1,142,1847,19, -643,1,142,1476,1, -141,1848,19,621,1, -141,1492,1,140,1849, -19,635,1,140,1506, -1,139,1850,19,631, -1,139,1284,1,138, -1851,19,108,1,138, -1300,1,137,1852,19, -474,1,137,1380,1, -136,1853,19,625,1, -136,1558,1,135,1854, -19,123,1,135,1520, -1,134,1855,19,449, -1,134,1572,1,133, -1856,19,202,1,133, -1578,1,132,1857,19, -320,1,132,821,1, -131,1858,19,298,1, -131,828,1,130,1859, -19,280,1,130,835, -1,129,1860,19,471, -1,129,842,1,128, -1861,19,241,1,128, -853,1,127,1862,19, -229,1,127,878,1, -126,1863,19,445,1, -126,887,1,125,1864, -19,211,1,125,908, -1,124,1865,19,745, -1,124,931,1,123, -1866,19,265,1,123, -1604,1,122,1867,19, -249,1,122,1609,1, -121,1868,19,237,1, -121,1615,1,120,1869, -19,225,1,120,1623, -1,119,1870,19,275, -1,119,1628,1,118, -1871,19,303,1,118, -1648,1,117,1872,19, -285,1,117,1652,1, -116,1873,19,260,1, -116,1656,1,115,1874, -19,246,1,115,1660, -1,114,1875,19,234, -1,114,1664,1,113, -1876,19,222,1,113, -1668,1,112,1877,19, -206,1,112,804,1, -111,1878,19,191,1, -111,1676,1,110,1879, -19,173,1,110,1683, -1,109,1880,19,170, -1,109,1690,1,108, -1881,19,186,1,108, -1697,1,107,1882,19, -164,1,107,1704,1, -106,1883,19,182,1, -106,1711,1,105,1884, -19,179,1,105,1718, -1,104,1885,19,157, -1,104,1725,1,103, -1886,19,136,1,103, -1732,1,102,1887,19, -194,1,102,1767,1, -101,1888,19,584,1, -101,1776,1,100,1889, -19,713,1,100,1783, -1,99,1890,19,521, -1,99,1790,1,98, -1891,19,612,1,98, -1797,1,97,1892,19, -103,1,97,1807,1, -96,1893,19,497,1, -96,1894,5,95,1, -1574,1895,17,1896,15, -1897,4,20,37,0, -83,0,116,0,97, -0,116,0,101,0, -109,0,101,0,110, -0,116,0,1,-1, -1,5,1898,20,1549, -1,226,1,3,1, -3,1,2,1899,22, -1,61,1,2035,1900, -17,1901,15,1897,1, --1,1,5,1902,20, -1541,1,230,1,3, -1,3,1,2,1903, -22,1,65,1,1371, -1904,16,0,495,1, -71,1905,16,0,495, -1,1958,1906,16,0, -495,1,381,1907,16, -0,495,1,2106,1908, -16,0,495,1,1931, -1909,17,1910,15,1911, -4,30,37,0,87, -0,104,0,105,0, -108,0,101,0,83, -0,116,0,97,0, -116,0,101,0,109, -0,101,0,110,0, -116,0,1,-1,1, -5,1912,20,1453,1, -244,1,3,1,6, -1,5,1913,22,1, -79,1,1756,1914,16, -0,495,1,2031,1915, -17,1916,15,1897,1, --1,1,5,1917,20, -1535,1,233,1,3, -1,2,1,1,1918, -22,1,68,1,509, -1919,16,0,495,1, -2337,1920,16,0,495, -1,2029,1921,17,1922, -15,1897,1,-1,1, -5,1923,20,1519,1, -235,1,3,1,2, -1,1,1924,22,1, -70,1,1153,1925,16, -0,495,1,2136,1926, -17,1927,15,1928,4, -24,37,0,73,0, -102,0,83,0,116, -0,97,0,116,0, -101,0,109,0,101, -0,110,0,116,0, -1,-1,1,5,1929, -20,1455,1,243,1, -3,1,8,1,7, -1930,22,1,78,1, -1933,1931,16,0,495, -1,2198,1932,16,0, -495,1,1731,1933,16, -0,495,1,1335,1934, -16,0,495,1,2318, -1935,16,0,495,1, -346,1936,16,0,495, -1,182,1937,16,0, -495,1,137,1938,16, -0,495,1,1515,1939, -16,0,495,1,2105, -1940,17,1941,15,1928, -1,-1,1,5,1942, -20,1469,1,242,1, -3,1,6,1,5, -1943,22,1,77,1, -1775,1944,16,0,495, -1,1117,1945,16,0, -495,1,525,1946,16, -0,495,1,52,1947, -16,0,495,1,1901, -1948,16,0,495,1, -2293,1949,16,0,495, -1,322,1950,16,0, -495,1,124,1951,16, -0,495,1,1695,1952, -16,0,495,1,1297, -1953,16,0,495,1, -151,1954,16,0,495, -1,112,1955,16,0, -495,1,1990,1956,16, -0,495,1,76,1957, -16,0,495,1,43, -1958,16,0,495,1, -2075,1959,16,0,495, -1,1876,1960,16,0, -495,1,299,1961,16, -0,495,1,1479,1962, -16,0,495,1,2462, -1963,17,1964,15,1965, -4,28,37,0,83, -0,116,0,97,0, -116,0,101,0,109, -0,101,0,110,0, -116,0,76,0,105, -0,115,0,116,0, -1,-1,1,5,1966, -20,1575,1,220,1, -3,1,2,1,1, -1967,22,1,55,1, -97,1968,16,0,495, -1,2459,1969,17,1970, -15,1971,4,36,37, -0,67,0,111,0, -109,0,112,0,111, -0,117,0,110,0, -100,0,83,0,116, -0,97,0,116,0, -101,0,109,0,101, -0,110,0,116,0, -1,-1,1,5,1972, -20,1577,1,219,1, -3,1,4,1,3, -1973,22,1,54,1, -2458,1974,17,1975,15, -1965,1,-1,1,5, -1976,20,1571,1,221, -1,3,1,3,1, -2,1977,22,1,56, -1,2030,1978,17,1979, -15,1897,1,-1,1, -5,1980,20,1533,1, -234,1,3,1,2, -1,1,1981,22,1, -69,1,89,1982,16, -0,495,1,1860,1983, -17,1984,15,1985,4, -34,37,0,68,0, -111,0,87,0,104, -0,105,0,108,0, -101,0,83,0,116, -0,97,0,116,0, -101,0,109,0,101, -0,110,0,116,0, -1,-1,1,5,1986, -20,1437,1,246,1, -3,1,8,1,7, -1987,22,1,81,1, -85,1988,16,0,495, -1,1659,1989,16,0, -495,1,1657,1990,17, -1991,15,1897,1,-1, -1,5,1992,20,1553, -1,224,1,3,1, -3,1,2,1993,22, -1,59,1,277,1994, -16,0,495,1,1261, -1995,16,0,495,1, -166,1996,16,0,495, -1,2045,1997,17,1998, -15,1897,1,-1,1, -5,1999,20,1555,1, -223,1,3,1,3, -1,2,2000,22,1, -58,1,2043,2001,17, -2002,15,1897,1,-1, -1,5,2003,20,1551, -1,225,1,3,1, -3,1,2,2004,22, -1,60,1,2041,2005, -17,2006,15,1897,1, --1,1,5,2007,20, -1547,1,227,1,3, -1,3,1,2,2008, -22,1,62,1,2039, -2009,17,2010,15,1897, -1,-1,1,5,2011, -20,1545,1,228,1, -3,1,3,1,2, -2012,22,1,63,1, -462,2013,16,0,495, -1,2037,2014,17,2015, -15,1897,1,-1,1, -5,2016,20,1543,1, -229,1,3,1,3, -1,2,2017,22,1, -64,1,459,2018,16, -0,495,1,1443,2019, -16,0,495,1,2033, -2020,17,2021,15,1897, -1,-1,1,5,2022, -20,1539,1,231,1, -3,1,2,1,1, -2023,22,1,66,1, -2032,2024,17,2025,15, -1897,1,-1,1,5, -2026,20,1537,1,232, -1,3,1,2,1, -1,2027,22,1,67, -1,1834,2028,16,0, -495,1,2227,2029,17, -2030,15,1911,1,-1, -1,5,2031,20,1439, -1,245,1,3,1, -6,1,5,2032,22, -1,80,1,256,2033, -16,0,495,1,447, -2034,16,0,495,1, -62,2035,16,0,495, -1,2021,2036,17,2037, -15,1928,1,-1,1, -5,2038,20,1471,1, -241,1,3,1,8, -1,7,2039,22,1, -76,1,2413,2040,16, -0,495,1,1622,2041, -16,0,495,1,2464, -2042,17,2043,15,1971, -1,-1,1,5,2044, -20,1601,1,218,1, -3,1,3,1,2, -2045,22,1,53,1, -1225,2046,16,0,495, -1,41,2047,16,0, -495,1,236,2048,16, -0,495,1,431,2049, -16,0,495,1,32, -2050,16,0,495,1, -1804,2051,16,0,495, -1,1803,2052,17,2053, -15,2054,4,16,37, -0,70,0,111,0, -114,0,76,0,111, -0,111,0,112,0, -1,-1,1,5,2055, -20,1421,1,248,1, -3,1,10,1,9, -2056,22,1,83,1, -1407,2057,16,0,495, -1,79,2058,16,0, -495,1,217,2059,16, -0,495,1,1989,2060, -17,2061,15,1928,1, --1,1,5,2062,20, -1473,1,240,1,3, -1,6,1,5,2063, -22,1,75,1,102, -2064,16,0,495,1, -2786,2065,16,0,495, -1,406,2066,16,0, -495,1,1585,2067,16, -0,495,1,1189,2068, -16,0,495,1,1873, -2069,17,2070,15,1985, -1,-1,1,5,2071, -20,1423,1,247,1, -3,1,8,1,7, -2072,22,1,82,1, -199,2073,16,0,495, -1,2364,2074,17,2075, -15,2054,1,-1,1, -5,2076,20,1407,1, -249,1,3,1,9, -1,8,2077,22,1, -84,1,95,2078,19, -494,1,95,2079,5, -95,1,1574,1895,1, -2035,1900,1,1371,2080, -16,0,492,1,71, -2081,16,0,492,1, -1958,2082,16,0,492, -1,381,2083,16,0, -492,1,2106,2084,16, -0,492,1,1931,1909, -1,1756,2085,16,0, -492,1,2031,1915,1, -509,2086,16,0,492, -1,2337,2087,16,0, -492,1,2029,1921,1, -1153,2088,16,0,492, -1,2136,1926,1,1933, -2089,16,0,492,1, -2198,2090,16,0,492, -1,1731,2091,16,0, -492,1,1335,2092,16, -0,492,1,2318,2093, -16,0,492,1,346, -2094,16,0,492,1, -182,2095,16,0,492, -1,137,2096,16,0, -492,1,1515,2097,16, -0,492,1,2105,1940, -1,1775,2098,16,0, -492,1,1117,2099,16, -0,492,1,525,2100, -16,0,492,1,52, -2101,16,0,492,1, -1901,2102,16,0,492, -1,2293,2103,16,0, -492,1,322,2104,16, -0,492,1,124,2105, -16,0,492,1,1695, -2106,16,0,492,1, -1297,2107,16,0,492, -1,151,2108,16,0, -492,1,112,2109,16, -0,492,1,1990,2110, -16,0,492,1,76, -2111,16,0,492,1, -43,2112,16,0,492, -1,2075,2113,16,0, -492,1,1876,2114,16, -0,492,1,299,2115, -16,0,492,1,1479, -2116,16,0,492,1, -2462,1963,1,97,2117, -16,0,492,1,2459, -1969,1,2458,1974,1, -2030,1978,1,89,2118, -16,0,492,1,1860, -1983,1,85,2119,16, -0,492,1,1659,2120, -16,0,492,1,1657, -1990,1,277,2121,16, -0,492,1,1261,2122, -16,0,492,1,166, -2123,16,0,492,1, -2045,1997,1,2043,2001, -1,2041,2005,1,2039, -2009,1,462,2124,16, -0,492,1,2037,2014, -1,459,2125,16,0, -492,1,1443,2126,16, -0,492,1,2033,2020, -1,2032,2024,1,1834, -2127,16,0,492,1, -2227,2029,1,256,2128, -16,0,492,1,447, -2129,16,0,492,1, -62,2130,16,0,492, -1,2021,2036,1,2413, -2131,16,0,492,1, -1622,2132,16,0,492, -1,2464,2042,1,1225, -2133,16,0,492,1, -41,2134,16,0,492, -1,236,2135,16,0, -492,1,431,2136,16, -0,492,1,32,2137, -16,0,492,1,1804, -2138,16,0,492,1, -1803,2052,1,1407,2139, -16,0,492,1,79, -2140,16,0,492,1, -217,2141,16,0,492, -1,1989,2060,1,102, -2142,16,0,492,1, -2786,2143,16,0,492, -1,406,2144,16,0, -492,1,1585,2145,16, -0,492,1,1189,2146, -16,0,492,1,1873, -2069,1,199,2147,16, -0,492,1,2364,2074, -1,94,2148,19,491, -1,94,2149,5,95, -1,1574,1895,1,2035, -1900,1,1371,2150,16, -0,489,1,71,2151, -16,0,489,1,1958, -2152,16,0,489,1, -381,2153,16,0,489, -1,2106,2154,16,0, -489,1,1931,1909,1, -1756,2155,16,0,489, -1,2031,1915,1,509, -2156,16,0,489,1, -2337,2157,16,0,489, -1,2029,1921,1,1153, -2158,16,0,489,1, -2136,1926,1,1933,2159, -16,0,489,1,2198, -2160,16,0,489,1, -1731,2161,16,0,489, -1,1335,2162,16,0, -489,1,2318,2163,16, -0,489,1,346,2164, -16,0,489,1,182, -2165,16,0,489,1, -137,2166,16,0,489, -1,1515,2167,16,0, -489,1,2105,1940,1, -1775,2168,16,0,489, -1,1117,2169,16,0, -489,1,525,2170,16, -0,489,1,52,2171, -16,0,489,1,1901, -2172,16,0,489,1, -2293,2173,16,0,489, -1,322,2174,16,0, -489,1,124,2175,16, -0,489,1,1695,2176, -16,0,489,1,1297, -2177,16,0,489,1, -151,2178,16,0,489, -1,112,2179,16,0, -489,1,1990,2180,16, -0,489,1,76,2181, -16,0,489,1,43, -2182,16,0,489,1, -2075,2183,16,0,489, -1,1876,2184,16,0, -489,1,299,2185,16, -0,489,1,1479,2186, -16,0,489,1,2462, -1963,1,97,2187,16, -0,489,1,2459,1969, -1,2458,1974,1,2030, -1978,1,89,2188,16, -0,489,1,1860,1983, -1,85,2189,16,0, -489,1,1659,2190,16, -0,489,1,1657,1990, -1,277,2191,16,0, -489,1,1261,2192,16, -0,489,1,166,2193, -16,0,489,1,2045, -1997,1,2043,2001,1, -2041,2005,1,2039,2009, -1,462,2194,16,0, -489,1,2037,2014,1, -459,2195,16,0,489, -1,1443,2196,16,0, -489,1,2033,2020,1, -2032,2024,1,1834,2197, -16,0,489,1,2227, -2029,1,256,2198,16, -0,489,1,447,2199, -16,0,489,1,62, -2200,16,0,489,1, -2021,2036,1,2413,2201, -16,0,489,1,1622, -2202,16,0,489,1, -2464,2042,1,1225,2203, -16,0,489,1,41, -2204,16,0,489,1, -236,2205,16,0,489, -1,431,2206,16,0, -489,1,32,2207,16, -0,489,1,1804,2208, -16,0,489,1,1803, -2052,1,1407,2209,16, -0,489,1,79,2210, -16,0,489,1,217, -2211,16,0,489,1, -1989,2060,1,102,2212, -16,0,489,1,2786, -2213,16,0,489,1, -406,2214,16,0,489, -1,1585,2215,16,0, -489,1,1189,2216,16, -0,489,1,1873,2069, -1,199,2217,16,0, -489,1,2364,2074,1, -93,2218,19,161,1, -93,2219,5,129,1, -1574,1895,1,2035,1900, -1,1371,2220,16,0, -760,1,71,2221,16, -0,754,1,1958,2222, -16,0,760,1,381, -2223,16,0,754,1, -2106,2224,16,0,760, -1,1931,1909,1,378, -2225,16,0,541,1, -1756,2226,16,0,760, -1,376,2227,16,0, -159,1,2542,2228,16, -0,266,1,374,2229, -16,0,547,1,372, -2230,16,0,549,1, -509,2231,16,0,754, -1,2337,2232,16,0, -760,1,2029,1921,1, -1153,2233,16,0,760, -1,1901,2234,16,0, -760,1,2136,1926,1, -85,2235,16,0,754, -1,2527,2236,16,0, -289,1,65,2237,16, -0,739,1,1933,2238, -16,0,760,1,2198, -2239,16,0,760,1, -2811,2240,17,2241,15, -2242,4,52,37,0, -71,0,108,0,111, -0,98,0,97,0, -108,0,86,0,97, -0,114,0,105,0, -97,0,98,0,108, -0,101,0,68,0, -101,0,99,0,108, -0,97,0,114,0, -97,0,116,0,105, -0,111,0,110,0, -1,-1,1,5,2243, -20,1789,1,174,1, -3,1,5,1,4, -2244,22,1,8,1, -1731,2245,16,0,754, -1,1335,2246,16,0, -760,1,2318,2247,16, -0,760,1,346,2248, -16,0,754,1,2512, -2249,16,0,307,1, -2508,2250,16,0,313, -1,182,2251,16,0, -754,1,137,2252,16, -0,754,1,1515,2253, -16,0,760,1,2105, -1940,1,1873,2069,1, -1117,2254,16,0,760, -1,525,2255,16,0, -754,1,52,2256,16, -0,760,1,1113,2257, -16,0,644,1,46, -2258,16,0,752,1, -2293,2259,16,0,754, -1,322,2260,16,0, -754,1,124,2261,16, -0,754,1,1695,2262, -16,0,760,1,1297, -2263,16,0,760,1, -151,2264,16,0,754, -1,112,2265,16,0, -754,1,1990,2266,16, -0,760,1,199,2267, -16,0,754,1,76, -2268,16,0,754,1, -43,2269,16,0,754, -1,2075,2270,16,0, -760,1,2468,2271,16, -0,423,1,2822,2272, -17,2273,15,2242,1, --1,1,5,2274,20, -1794,1,173,1,3, -1,3,1,2,2275, -22,1,7,1,299, -2276,16,0,754,1, -1479,2277,16,0,760, -1,2462,1963,1,97, -2278,16,0,754,1, -2031,1915,1,2459,1969, -1,2458,1974,1,2030, -1978,1,89,2279,16, -0,754,1,1860,1983, -1,2844,2280,17,2281, -15,2282,4,36,37, -0,71,0,108,0, -111,0,98,0,97, -0,108,0,68,0, -101,0,102,0,105, -0,110,0,105,0, -116,0,105,0,111, -0,110,0,115,0, -1,-1,1,5,2283, -20,1804,1,169,1, -3,1,2,1,1, -2284,22,1,3,1, -2843,2285,17,2286,15, -2282,1,-1,1,5, -2287,20,1800,1,171, -1,3,1,2,1, -1,2288,22,1,5, -1,2842,2289,17,2290, -15,2282,1,-1,1, -5,2291,20,1802,1, -170,1,3,1,3, -1,2,2292,22,1, -4,1,1659,2293,16, -0,760,1,1657,1990, -1,277,2294,16,0, -754,1,1261,2295,16, -0,760,1,2841,2296, -17,2297,15,2282,1, --1,1,5,2298,20, -1796,1,172,1,3, -1,3,1,2,2299, -22,1,6,1,166, -2300,16,0,754,1, -2045,1997,1,2043,2001, -1,2041,2005,1,2039, -2009,1,462,2301,16, -0,754,1,2037,2014, -1,459,2302,16,0, -754,1,1443,2303,16, -0,760,1,2033,2020, -1,2032,2024,1,1834, -2304,16,0,760,1, -2227,2029,1,256,2305, -16,0,754,1,2027, -2306,16,0,655,1, -2025,2307,16,0,698, -1,447,2308,16,0, -754,1,2466,2309,17, -2310,15,2311,4,50, -37,0,71,0,108, -0,111,0,98,0, -97,0,108,0,70, -0,117,0,110,0, -99,0,116,0,105, -0,111,0,110,0, -68,0,101,0,102, -0,105,0,110,0, -105,0,116,0,105, -0,111,0,110,0, -1,-1,1,5,2312, -20,1782,1,176,1, -3,1,7,1,6, -2313,22,1,10,1, -2021,2036,1,7,2314, -17,2315,15,2316,4, -18,37,0,84,0, -121,0,112,0,101, -0,110,0,97,0, -109,0,101,0,1, --1,1,5,2317,20, -961,1,337,1,3, -1,2,1,1,2318, -22,1,173,1,2413, -2319,16,0,760,1, -1876,2320,16,0,760, -1,1622,2321,16,0, -754,1,2464,2042,1, -1225,2322,16,0,760, -1,2022,2323,16,0, -663,1,41,2324,16, -0,754,1,236,2325, -16,0,754,1,431, -2326,16,0,754,1, -8,2327,16,0,784, -1,62,2328,16,0, -741,1,1804,2329,16, -0,760,1,1803,2052, -1,32,2330,16,0, -760,1,1407,2331,16, -0,760,1,2783,2332, -17,2333,15,2311,1, --1,1,5,2334,20, -1787,1,175,1,3, -1,6,1,5,2335, -22,1,9,1,2, -2336,17,2337,15,2316, -1,-1,1,5,2338, -20,951,1,342,1, -3,1,2,1,1, -2339,22,1,178,1, -79,2340,16,0,754, -1,217,2341,16,0, -754,1,1989,2060,1, -18,2342,16,0,778, -1,102,2343,16,0, -754,1,2786,2344,16, -0,754,1,406,2345, -16,0,754,1,0, -2346,16,0,781,1, -1585,2347,16,0,754, -1,2823,2348,16,0, -781,1,1189,2349,16, -0,760,1,6,2350, -17,2351,15,2316,1, --1,1,5,2352,20, -959,1,338,1,3, -1,2,1,1,2353, -22,1,174,1,5, -2354,17,2355,15,2316, -1,-1,1,5,2356, -20,957,1,339,1, -3,1,2,1,1, -2357,22,1,175,1, -4,2358,17,2359,15, -2316,1,-1,1,5, -2360,20,955,1,340, -1,3,1,2,1, -1,2361,22,1,176, -1,3,2362,17,2363, -15,2316,1,-1,1, -5,2364,20,953,1, -341,1,3,1,2, -1,1,2365,22,1, -177,1,1775,2366,16, -0,760,1,1,2367, -17,2368,15,2316,1, --1,1,5,2369,20, -930,1,343,1,3, -1,2,1,1,2370, -22,1,179,1,2364, -2074,1,92,2371,19, -347,1,92,2372,5, -30,1,2580,2373,17, -2374,15,2375,4,36, -37,0,86,0,111, -0,105,0,100,0, -65,0,114,0,103, -0,83,0,116,0, -97,0,116,0,101, -0,69,0,118,0, -101,0,110,0,116, -0,1,-1,1,5, -2376,20,1717,1,198, -1,3,1,5,1, -4,2377,22,1,32, -1,2648,2378,17,2379, -15,2380,4,20,37, -0,83,0,116,0, -97,0,116,0,101, -0,66,0,111,0, -100,0,121,0,1, --1,1,5,2381,20, -1762,1,182,1,3, -1,3,1,2,2382, -22,1,16,1,2575, -2383,17,2384,15,2385, -4,34,37,0,75, -0,101,0,121,0, -65,0,114,0,103, -0,83,0,116,0, -97,0,116,0,101, -0,69,0,118,0, -101,0,110,0,116, -0,1,-1,1,5, -2386,20,1710,1,199, -1,3,1,6,1, -5,2387,22,1,33, -1,2659,2388,16,0, -345,1,2657,2389,17, -2390,15,2380,1,-1, -1,5,2391,20,1764, -1,181,1,3,1, -2,1,1,2392,22, -1,15,1,2567,2393, -17,2394,15,2395,4, -34,37,0,73,0, -110,0,116,0,65, -0,114,0,103,0, -83,0,116,0,97, -0,116,0,101,0, -69,0,118,0,101, -0,110,0,116,0, -1,-1,1,5,2396, -20,1703,1,200,1, -3,1,6,1,5, -2397,22,1,34,1, -2655,2398,17,2399,15, -2380,1,-1,1,5, -2400,20,1756,1,185, -1,3,1,2,1, -1,2401,22,1,19, -1,2654,2402,17,2403, -15,2380,1,-1,1, -5,2404,20,1752,1, -187,1,3,1,2, -1,1,2405,22,1, -21,1,2653,2406,17, -2407,15,2380,1,-1, -1,5,2408,20,1748, -1,189,1,3,1, -2,1,1,2409,22, -1,23,1,2652,2410, -17,2411,15,2380,1, --1,1,5,2412,20, -1744,1,191,1,3, -1,2,1,1,2413, -22,1,25,1,2651, -2414,17,2415,15,2380, -1,-1,1,5,2416, -20,1740,1,193,1, -3,1,2,1,1, -2417,22,1,27,1, -2650,2418,17,2419,15, -2380,1,-1,1,5, -2420,20,1736,1,195, -1,3,1,2,1, -1,2421,22,1,29, -1,2559,2422,17,2423, -15,2424,4,40,37, -0,86,0,101,0, -99,0,116,0,111, -0,114,0,65,0, -114,0,103,0,83, -0,116,0,97,0, -116,0,101,0,69, -0,118,0,101,0, -110,0,116,0,1, --1,1,5,2425,20, -1696,1,201,1,3, -1,6,1,5,2426, -22,1,35,1,2647, -2427,17,2428,15,2380, -1,-1,1,5,2429, -20,1758,1,184,1, -3,1,3,1,2, -2430,22,1,18,1, -2646,2431,17,2432,15, -2380,1,-1,1,5, -2433,20,1754,1,186, -1,3,1,3,1, -2,2434,22,1,20, -1,2645,2435,17,2436, -15,2380,1,-1,1, -5,2437,20,1750,1, -188,1,3,1,3, -1,2,2438,22,1, -22,1,2644,2439,17, -2440,15,2380,1,-1, -1,5,2441,20,1746, -1,190,1,3,1, -3,1,2,2442,22, -1,24,1,2643,2443, -17,2444,15,2380,1, --1,1,5,2445,20, -1742,1,192,1,3, -1,3,1,2,2446, -22,1,26,1,2464, -2042,1,2641,2447,17, -2448,15,2380,1,-1, -1,5,2449,20,1731, -1,196,1,3,1, -3,1,2,2450,22, -1,30,1,2551,2451, -17,2452,15,2453,4, -46,37,0,73,0, -110,0,116,0,82, -0,111,0,116,0, -82,0,111,0,116, -0,65,0,114,0, -103,0,83,0,116, -0,97,0,116,0, -101,0,69,0,118, -0,101,0,110,0, -116,0,1,-1,1, -5,2454,20,1689,1, -202,1,3,1,6, -1,5,2455,22,1, -36,1,2470,2456,16, -0,345,1,2459,1969, -1,2536,2457,17,2458, -15,2459,4,46,37, -0,73,0,110,0, -116,0,86,0,101, -0,99,0,86,0, -101,0,99,0,65, -0,114,0,103,0, -83,0,116,0,97, -0,116,0,101,0, -69,0,118,0,101, -0,110,0,116,0, -1,-1,1,5,2460, -20,1682,1,203,1, -3,1,6,1,5, -2461,22,1,37,1, -2703,2462,16,0,345, -1,2521,2463,17,2464, -15,2465,4,46,37, -0,75,0,101,0, -121,0,73,0,110, -0,116,0,73,0, -110,0,116,0,65, -0,114,0,103,0, -83,0,116,0,97, -0,116,0,101,0, -69,0,118,0,101, -0,110,0,116,0, -1,-1,1,5,2466, -20,1675,1,204,1, -3,1,6,1,5, -2467,22,1,38,1, -2642,2468,17,2469,15, -2380,1,-1,1,5, -2470,20,1738,1,194, -1,3,1,3,1, -2,2471,22,1,28, -1,2656,2472,17,2473, -15,2380,1,-1,1, -5,2474,20,1760,1, -183,1,3,1,2, -1,1,2475,22,1, -17,1,2597,2476,16, -0,345,1,2595,2477, -17,2478,15,2479,4, -22,37,0,83,0, -116,0,97,0,116, -0,101,0,69,0, -118,0,101,0,110, -0,116,0,1,-1, -1,5,2480,20,1724, -1,197,1,3,1, -6,1,5,2481,22, -1,31,1,91,2482, -19,344,1,91,2483, -5,30,1,2580,2373, -1,2648,2378,1,2575, -2383,1,2659,2484,16, -0,342,1,2657,2389, -1,2567,2393,1,2655, -2398,1,2654,2402,1, -2653,2406,1,2652,2410, -1,2651,2414,1,2650, -2418,1,2559,2422,1, -2647,2427,1,2646,2431, -1,2645,2435,1,2644, -2439,1,2643,2443,1, -2464,2042,1,2641,2447, -1,2551,2451,1,2470, -2485,16,0,342,1, -2459,1969,1,2536,2457, -1,2703,2486,16,0, -342,1,2521,2463,1, -2642,2468,1,2656,2472, -1,2597,2487,16,0, -342,1,2595,2477,1, -90,2488,19,402,1, -90,2489,5,30,1, -2580,2373,1,2648,2378, -1,2575,2383,1,2659, -2490,16,0,400,1, -2657,2389,1,2567,2393, -1,2655,2398,1,2654, -2402,1,2653,2406,1, -2652,2410,1,2651,2414, -1,2650,2418,1,2559, -2422,1,2647,2427,1, -2646,2431,1,2645,2435, -1,2644,2439,1,2643, -2443,1,2464,2042,1, -2641,2447,1,2551,2451, -1,2470,2491,16,0, -400,1,2459,1969,1, -2536,2457,1,2703,2492, -16,0,400,1,2521, -2463,1,2642,2468,1, -2656,2472,1,2597,2493, -16,0,400,1,2595, -2477,1,89,2494,19, -405,1,89,2495,5, -30,1,2580,2373,1, -2648,2378,1,2575,2383, -1,2659,2496,16,0, -403,1,2657,2389,1, -2567,2393,1,2655,2398, -1,2654,2402,1,2653, -2406,1,2652,2410,1, -2651,2414,1,2650,2418, -1,2559,2422,1,2647, -2427,1,2646,2431,1, -2645,2435,1,2644,2439, -1,2643,2443,1,2464, -2042,1,2641,2447,1, -2551,2451,1,2470,2497, -16,0,403,1,2459, -1969,1,2536,2457,1, -2703,2498,16,0,403, -1,2521,2463,1,2642, -2468,1,2656,2472,1, -2597,2499,16,0,403, -1,2595,2477,1,88, -2500,19,399,1,88, -2501,5,30,1,2580, -2373,1,2648,2378,1, -2575,2383,1,2659,2502, -16,0,397,1,2657, -2389,1,2567,2393,1, -2655,2398,1,2654,2402, -1,2653,2406,1,2652, -2410,1,2651,2414,1, -2650,2418,1,2559,2422, -1,2647,2427,1,2646, -2431,1,2645,2435,1, -2644,2439,1,2643,2443, -1,2464,2042,1,2641, -2447,1,2551,2451,1, -2470,2503,16,0,397, -1,2459,1969,1,2536, -2457,1,2703,2504,16, -0,397,1,2521,2463, -1,2642,2468,1,2656, -2472,1,2597,2505,16, -0,397,1,2595,2477, -1,87,2506,19,369, -1,87,2507,5,30, -1,2580,2373,1,2648, -2378,1,2575,2383,1, -2659,2508,16,0,367, -1,2657,2389,1,2567, -2393,1,2655,2398,1, -2654,2402,1,2653,2406, -1,2652,2410,1,2651, -2414,1,2650,2418,1, -2559,2422,1,2647,2427, -1,2646,2431,1,2645, -2435,1,2644,2439,1, -2643,2443,1,2464,2042, -1,2641,2447,1,2551, -2451,1,2470,2509,16, -0,367,1,2459,1969, -1,2536,2457,1,2703, -2510,16,0,367,1, -2521,2463,1,2642,2468, -1,2656,2472,1,2597, -2511,16,0,367,1, -2595,2477,1,86,2512, -19,353,1,86,2513, -5,30,1,2580,2373, -1,2648,2378,1,2575, -2383,1,2659,2514,16, -0,351,1,2657,2389, -1,2567,2393,1,2655, -2398,1,2654,2402,1, -2653,2406,1,2652,2410, -1,2651,2414,1,2650, -2418,1,2559,2422,1, -2647,2427,1,2646,2431, -1,2645,2435,1,2644, -2439,1,2643,2443,1, -2464,2042,1,2641,2447, -1,2551,2451,1,2470, -2515,16,0,351,1, -2459,1969,1,2536,2457, -1,2703,2516,16,0, -351,1,2521,2463,1, -2642,2468,1,2656,2472, -1,2597,2517,16,0, -351,1,2595,2477,1, -85,2518,19,350,1, -85,2519,5,30,1, -2580,2373,1,2648,2378, -1,2575,2383,1,2659, -2520,16,0,348,1, -2657,2389,1,2567,2393, -1,2655,2398,1,2654, -2402,1,2653,2406,1, -2652,2410,1,2651,2414, -1,2650,2418,1,2559, -2422,1,2647,2427,1, -2646,2431,1,2645,2435, -1,2644,2439,1,2643, -2443,1,2464,2042,1, -2641,2447,1,2551,2451, -1,2470,2521,16,0, -348,1,2459,1969,1, -2536,2457,1,2703,2522, -16,0,348,1,2521, -2463,1,2642,2468,1, -2656,2472,1,2597,2523, -16,0,348,1,2595, -2477,1,84,2524,19, -396,1,84,2525,5, -30,1,2580,2373,1, -2648,2378,1,2575,2383, -1,2659,2526,16,0, -394,1,2657,2389,1, -2567,2393,1,2655,2398, -1,2654,2402,1,2653, -2406,1,2652,2410,1, -2651,2414,1,2650,2418, -1,2559,2422,1,2647, -2427,1,2646,2431,1, -2645,2435,1,2644,2439, -1,2643,2443,1,2464, -2042,1,2641,2447,1, -2551,2451,1,2470,2527, -16,0,394,1,2459, -1969,1,2536,2457,1, -2703,2528,16,0,394, -1,2521,2463,1,2642, -2468,1,2656,2472,1, -2597,2529,16,0,394, -1,2595,2477,1,83, -2530,19,393,1,83, -2531,5,30,1,2580, -2373,1,2648,2378,1, -2575,2383,1,2659,2532, -16,0,391,1,2657, -2389,1,2567,2393,1, -2655,2398,1,2654,2402, -1,2653,2406,1,2652, -2410,1,2651,2414,1, -2650,2418,1,2559,2422, -1,2647,2427,1,2646, -2431,1,2645,2435,1, -2644,2439,1,2643,2443, -1,2464,2042,1,2641, -2447,1,2551,2451,1, -2470,2533,16,0,391, -1,2459,1969,1,2536, -2457,1,2703,2534,16, -0,391,1,2521,2463, -1,2642,2468,1,2656, -2472,1,2597,2535,16, -0,391,1,2595,2477, -1,82,2536,19,341, -1,82,2537,5,30, -1,2580,2373,1,2648, -2378,1,2575,2383,1, -2659,2538,16,0,339, -1,2657,2389,1,2567, -2393,1,2655,2398,1, -2654,2402,1,2653,2406, -1,2652,2410,1,2651, -2414,1,2650,2418,1, -2559,2422,1,2647,2427, -1,2646,2431,1,2645, -2435,1,2644,2439,1, -2643,2443,1,2464,2042, -1,2641,2447,1,2551, -2451,1,2470,2539,16, -0,339,1,2459,1969, -1,2536,2457,1,2703, -2540,16,0,339,1, -2521,2463,1,2642,2468, -1,2656,2472,1,2597, -2541,16,0,339,1, -2595,2477,1,81,2542, -19,390,1,81,2543, -5,30,1,2580,2373, -1,2648,2378,1,2575, -2383,1,2659,2544,16, -0,388,1,2657,2389, -1,2567,2393,1,2655, -2398,1,2654,2402,1, -2653,2406,1,2652,2410, -1,2651,2414,1,2650, -2418,1,2559,2422,1, -2647,2427,1,2646,2431, -1,2645,2435,1,2644, -2439,1,2643,2443,1, -2464,2042,1,2641,2447, -1,2551,2451,1,2470, -2545,16,0,388,1, -2459,1969,1,2536,2457, -1,2703,2546,16,0, -388,1,2521,2463,1, -2642,2468,1,2656,2472, -1,2597,2547,16,0, -388,1,2595,2477,1, -80,2548,19,375,1, -80,2549,5,30,1, -2580,2373,1,2648,2378, -1,2575,2383,1,2659, -2550,16,0,373,1, -2657,2389,1,2567,2393, -1,2655,2398,1,2654, -2402,1,2653,2406,1, -2652,2410,1,2651,2414, -1,2650,2418,1,2559, -2422,1,2647,2427,1, -2646,2431,1,2645,2435, -1,2644,2439,1,2643, -2443,1,2464,2042,1, -2641,2447,1,2551,2451, -1,2470,2551,16,0, -373,1,2459,1969,1, -2536,2457,1,2703,2552, -16,0,373,1,2521, -2463,1,2642,2468,1, -2656,2472,1,2597,2553, -16,0,373,1,2595, -2477,1,79,2554,19, -366,1,79,2555,5, -30,1,2580,2373,1, -2648,2378,1,2575,2383, -1,2659,2556,16,0, -364,1,2657,2389,1, -2567,2393,1,2655,2398, -1,2654,2402,1,2653, -2406,1,2652,2410,1, -2651,2414,1,2650,2418, -1,2559,2422,1,2647, -2427,1,2646,2431,1, -2645,2435,1,2644,2439, -1,2643,2443,1,2464, -2042,1,2641,2447,1, -2551,2451,1,2470,2557, -16,0,364,1,2459, -1969,1,2536,2457,1, -2703,2558,16,0,364, -1,2521,2463,1,2642, -2468,1,2656,2472,1, -2597,2559,16,0,364, -1,2595,2477,1,78, -2560,19,363,1,78, -2561,5,30,1,2580, -2373,1,2648,2378,1, -2575,2383,1,2659,2562, -16,0,361,1,2657, -2389,1,2567,2393,1, -2655,2398,1,2654,2402, -1,2653,2406,1,2652, -2410,1,2651,2414,1, -2650,2418,1,2559,2422, -1,2647,2427,1,2646, -2431,1,2645,2435,1, -2644,2439,1,2643,2443, -1,2464,2042,1,2641, -2447,1,2551,2451,1, -2470,2563,16,0,361, -1,2459,1969,1,2536, -2457,1,2703,2564,16, -0,361,1,2521,2463, -1,2642,2468,1,2656, -2472,1,2597,2565,16, -0,361,1,2595,2477, -1,77,2566,19,360, -1,77,2567,5,30, -1,2580,2373,1,2648, -2378,1,2575,2383,1, -2659,2568,16,0,358, -1,2657,2389,1,2567, -2393,1,2655,2398,1, -2654,2402,1,2653,2406, -1,2652,2410,1,2651, -2414,1,2650,2418,1, -2559,2422,1,2647,2427, -1,2646,2431,1,2645, -2435,1,2644,2439,1, -2643,2443,1,2464,2042, -1,2641,2447,1,2551, -2451,1,2470,2569,16, -0,358,1,2459,1969, -1,2536,2457,1,2703, -2570,16,0,358,1, -2521,2463,1,2642,2468, -1,2656,2472,1,2597, -2571,16,0,358,1, -2595,2477,1,76,2572, -19,600,1,76,2573, -5,30,1,2580,2373, -1,2648,2378,1,2575, -2383,1,2659,2574,16, -0,598,1,2657,2389, -1,2567,2393,1,2655, -2398,1,2654,2402,1, -2653,2406,1,2652,2410, -1,2651,2414,1,2650, -2418,1,2559,2422,1, -2647,2427,1,2646,2431, -1,2645,2435,1,2644, -2439,1,2643,2443,1, -2464,2042,1,2641,2447, -1,2551,2451,1,2470, -2575,16,0,598,1, -2459,1969,1,2536,2457, -1,2703,2576,16,0, -598,1,2521,2463,1, -2642,2468,1,2656,2472, -1,2597,2577,16,0, -598,1,2595,2477,1, -75,2578,19,356,1, -75,2579,5,30,1, -2580,2373,1,2648,2378, -1,2575,2383,1,2659, -2580,16,0,354,1, -2657,2389,1,2567,2393, -1,2655,2398,1,2654, -2402,1,2653,2406,1, -2652,2410,1,2651,2414, -1,2650,2418,1,2559, -2422,1,2647,2427,1, -2646,2431,1,2645,2435, -1,2644,2439,1,2643, -2443,1,2464,2042,1, -2641,2447,1,2551,2451, -1,2470,2581,16,0, -354,1,2459,1969,1, -2536,2457,1,2703,2582, -16,0,354,1,2521, -2463,1,2642,2468,1, -2656,2472,1,2597,2583, -16,0,354,1,2595, -2477,1,74,2584,19, -338,1,74,2585,5, -30,1,2580,2373,1, -2648,2378,1,2575,2383, -1,2659,2586,16,0, -336,1,2657,2389,1, -2567,2393,1,2655,2398, -1,2654,2402,1,2653, -2406,1,2652,2410,1, -2651,2414,1,2650,2418, -1,2559,2422,1,2647, -2427,1,2646,2431,1, -2645,2435,1,2644,2439, -1,2643,2443,1,2464, -2042,1,2641,2447,1, -2551,2451,1,2470,2587, -16,0,336,1,2459, -1969,1,2536,2457,1, -2703,2588,16,0,336, -1,2521,2463,1,2642, -2468,1,2656,2472,1, -2597,2589,16,0,336, -1,2595,2477,1,73, -2590,19,335,1,73, -2591,5,30,1,2580, -2373,1,2648,2378,1, -2575,2383,1,2659,2592, -16,0,333,1,2657, -2389,1,2567,2393,1, -2655,2398,1,2654,2402, -1,2653,2406,1,2652, -2410,1,2651,2414,1, -2650,2418,1,2559,2422, -1,2647,2427,1,2646, -2431,1,2645,2435,1, -2644,2439,1,2643,2443, -1,2464,2042,1,2641, -2447,1,2551,2451,1, -2470,2593,16,0,333, -1,2459,1969,1,2536, -2457,1,2703,2594,16, -0,333,1,2521,2463, -1,2642,2468,1,2656, -2472,1,2597,2595,16, -0,333,1,2595,2477, -1,72,2596,19,332, -1,72,2597,5,30, -1,2580,2373,1,2648, -2378,1,2575,2383,1, -2659,2598,16,0,330, -1,2657,2389,1,2567, -2393,1,2655,2398,1, -2654,2402,1,2653,2406, -1,2652,2410,1,2651, -2414,1,2650,2418,1, -2559,2422,1,2647,2427, -1,2646,2431,1,2645, -2435,1,2644,2439,1, -2643,2443,1,2464,2042, -1,2641,2447,1,2551, -2451,1,2470,2599,16, -0,330,1,2459,1969, -1,2536,2457,1,2703, -2600,16,0,330,1, -2521,2463,1,2642,2468, -1,2656,2472,1,2597, -2601,16,0,330,1, -2595,2477,1,71,2602, -19,730,1,71,2603, -5,30,1,2580,2373, -1,2648,2378,1,2575, -2383,1,2659,2604,16, -0,728,1,2657,2389, -1,2567,2393,1,2655, -2398,1,2654,2402,1, -2653,2406,1,2652,2410, -1,2651,2414,1,2650, -2418,1,2559,2422,1, -2647,2427,1,2646,2431, -1,2645,2435,1,2644, -2439,1,2643,2443,1, -2464,2042,1,2641,2447, -1,2551,2451,1,2470, -2605,16,0,728,1, -2459,1969,1,2536,2457, -1,2703,2606,16,0, -728,1,2521,2463,1, -2642,2468,1,2656,2472, -1,2597,2607,16,0, -728,1,2595,2477,1, -70,2608,19,411,1, -70,2609,5,30,1, -2580,2373,1,2648,2378, -1,2575,2383,1,2659, -2610,16,0,409,1, -2657,2389,1,2567,2393, -1,2655,2398,1,2654, -2402,1,2653,2406,1, -2652,2410,1,2651,2414, -1,2650,2418,1,2559, -2422,1,2647,2427,1, -2646,2431,1,2645,2435, -1,2644,2439,1,2643, -2443,1,2464,2042,1, -2641,2447,1,2551,2451, -1,2470,2611,16,0, -409,1,2459,1969,1, -2536,2457,1,2703,2612, -16,0,409,1,2521, -2463,1,2642,2468,1, -2656,2472,1,2597,2613, -16,0,409,1,2595, -2477,1,69,2614,19, -408,1,69,2615,5, -30,1,2580,2373,1, -2648,2378,1,2575,2383, -1,2659,2616,16,0, -406,1,2657,2389,1, -2567,2393,1,2655,2398, -1,2654,2402,1,2653, -2406,1,2652,2410,1, -2651,2414,1,2650,2418, -1,2559,2422,1,2647, -2427,1,2646,2431,1, -2645,2435,1,2644,2439, -1,2643,2443,1,2464, -2042,1,2641,2447,1, -2551,2451,1,2470,2617, -16,0,406,1,2459, -1969,1,2536,2457,1, -2703,2618,16,0,406, -1,2521,2463,1,2642, -2468,1,2656,2472,1, -2597,2619,16,0,406, -1,2595,2477,1,68, -2620,19,329,1,68, -2621,5,30,1,2580, -2373,1,2648,2378,1, -2575,2383,1,2659,2622, -16,0,327,1,2657, -2389,1,2567,2393,1, -2655,2398,1,2654,2402, -1,2653,2406,1,2652, -2410,1,2651,2414,1, -2650,2418,1,2559,2422, -1,2647,2427,1,2646, -2431,1,2645,2435,1, -2644,2439,1,2643,2443, -1,2464,2042,1,2641, -2447,1,2551,2451,1, -2470,2623,16,0,327, -1,2459,1969,1,2536, -2457,1,2703,2624,16, -0,327,1,2521,2463, -1,2642,2468,1,2656, -2472,1,2597,2625,16, -0,327,1,2595,2477, -1,67,2626,19,677, -1,67,2627,5,30, -1,2580,2373,1,2648, -2378,1,2575,2383,1, -2659,2628,16,0,675, -1,2657,2389,1,2567, -2393,1,2655,2398,1, -2654,2402,1,2653,2406, -1,2652,2410,1,2651, -2414,1,2650,2418,1, -2559,2422,1,2647,2427, -1,2646,2431,1,2645, -2435,1,2644,2439,1, -2643,2443,1,2464,2042, -1,2641,2447,1,2551, -2451,1,2470,2629,16, -0,675,1,2459,1969, -1,2536,2457,1,2703, -2630,16,0,675,1, -2521,2463,1,2642,2468, -1,2656,2472,1,2597, -2631,16,0,675,1, -2595,2477,1,66,2632, -19,323,1,66,2633, -5,30,1,2580,2373, -1,2648,2378,1,2575, -2383,1,2659,2634,16, -0,321,1,2657,2389, -1,2567,2393,1,2655, -2398,1,2654,2402,1, -2653,2406,1,2652,2410, -1,2651,2414,1,2650, -2418,1,2559,2422,1, -2647,2427,1,2646,2431, -1,2645,2435,1,2644, -2439,1,2643,2443,1, -2464,2042,1,2641,2447, -1,2551,2451,1,2470, -2635,16,0,321,1, -2459,1969,1,2536,2457, -1,2703,2636,16,0, -321,1,2521,2463,1, -2642,2468,1,2656,2472, -1,2597,2637,16,0, -321,1,2595,2477,1, -65,2638,19,421,1, -65,2639,5,30,1, -2580,2373,1,2648,2378, -1,2575,2383,1,2659, -2640,16,0,419,1, -2657,2389,1,2567,2393, -1,2655,2398,1,2654, -2402,1,2653,2406,1, -2652,2410,1,2651,2414, -1,2650,2418,1,2559, -2422,1,2647,2427,1, -2646,2431,1,2645,2435, -1,2644,2439,1,2643, -2443,1,2464,2042,1, -2641,2447,1,2551,2451, -1,2470,2641,16,0, -419,1,2459,1969,1, -2536,2457,1,2703,2642, -16,0,419,1,2521, -2463,1,2642,2468,1, -2656,2472,1,2597,2643, -16,0,419,1,2595, -2477,1,64,2644,19, -387,1,64,2645,5, -30,1,2580,2373,1, -2648,2378,1,2575,2383, -1,2659,2646,16,0, -385,1,2657,2389,1, -2567,2393,1,2655,2398, -1,2654,2402,1,2653, -2406,1,2652,2410,1, -2651,2414,1,2650,2418, -1,2559,2422,1,2647, -2427,1,2646,2431,1, -2645,2435,1,2644,2439, -1,2643,2443,1,2464, -2042,1,2641,2447,1, -2551,2451,1,2470,2647, -16,0,385,1,2459, -1969,1,2536,2457,1, -2703,2648,16,0,385, -1,2521,2463,1,2642, -2468,1,2656,2472,1, -2597,2649,16,0,385, -1,2595,2477,1,63, -2650,19,384,1,63, -2651,5,30,1,2580, -2373,1,2648,2378,1, -2575,2383,1,2659,2652, -16,0,382,1,2657, -2389,1,2567,2393,1, -2655,2398,1,2654,2402, -1,2653,2406,1,2652, -2410,1,2651,2414,1, -2650,2418,1,2559,2422, -1,2647,2427,1,2646, -2431,1,2645,2435,1, -2644,2439,1,2643,2443, -1,2464,2042,1,2641, -2447,1,2551,2451,1, -2470,2653,16,0,382, -1,2459,1969,1,2536, -2457,1,2703,2654,16, -0,382,1,2521,2463, -1,2642,2468,1,2656, -2472,1,2597,2655,16, -0,382,1,2595,2477, -1,62,2656,19,381, -1,62,2657,5,30, -1,2580,2373,1,2648, -2378,1,2575,2383,1, -2659,2658,16,0,379, -1,2657,2389,1,2567, -2393,1,2655,2398,1, -2654,2402,1,2653,2406, -1,2652,2410,1,2651, -2414,1,2650,2418,1, -2559,2422,1,2647,2427, -1,2646,2431,1,2645, -2435,1,2644,2439,1, -2643,2443,1,2464,2042, -1,2641,2447,1,2551, -2451,1,2470,2659,16, -0,379,1,2459,1969, -1,2536,2457,1,2703, -2660,16,0,379,1, -2521,2463,1,2642,2468, -1,2656,2472,1,2597, -2661,16,0,379,1, -2595,2477,1,61,2662, -19,378,1,61,2663, -5,30,1,2580,2373, -1,2648,2378,1,2575, -2383,1,2659,2664,16, -0,376,1,2657,2389, -1,2567,2393,1,2655, -2398,1,2654,2402,1, -2653,2406,1,2652,2410, -1,2651,2414,1,2650, -2418,1,2559,2422,1, -2647,2427,1,2646,2431, -1,2645,2435,1,2644, -2439,1,2643,2443,1, -2464,2042,1,2641,2447, -1,2551,2451,1,2470, -2665,16,0,376,1, -2459,1969,1,2536,2457, -1,2703,2666,16,0, -376,1,2521,2463,1, -2642,2468,1,2656,2472, -1,2597,2667,16,0, -376,1,2595,2477,1, -60,2668,19,372,1, -60,2669,5,30,1, -2580,2373,1,2648,2378, -1,2575,2383,1,2659, -2670,16,0,370,1, -2657,2389,1,2567,2393, -1,2655,2398,1,2654, -2402,1,2653,2406,1, -2652,2410,1,2651,2414, -1,2650,2418,1,2559, -2422,1,2647,2427,1, -2646,2431,1,2645,2435, -1,2644,2439,1,2643, -2443,1,2464,2042,1, -2641,2447,1,2551,2451, -1,2470,2671,16,0, -370,1,2459,1969,1, -2536,2457,1,2703,2672, -16,0,370,1,2521, -2463,1,2642,2468,1, -2656,2472,1,2597,2673, -16,0,370,1,2595, -2477,1,59,2674,19, -418,1,59,2675,5, -30,1,2580,2373,1, -2648,2378,1,2575,2383, -1,2659,2676,16,0, -416,1,2657,2389,1, -2567,2393,1,2655,2398, -1,2654,2402,1,2653, -2406,1,2652,2410,1, -2651,2414,1,2650,2418, -1,2559,2422,1,2647, -2427,1,2646,2431,1, -2645,2435,1,2644,2439, -1,2643,2443,1,2464, -2042,1,2641,2447,1, -2551,2451,1,2470,2677, -16,0,416,1,2459, -1969,1,2536,2457,1, -2703,2678,16,0,416, -1,2521,2463,1,2642, -2468,1,2656,2472,1, -2597,2679,16,0,416, -1,2595,2477,1,58, -2680,19,415,1,58, -2681,5,30,1,2580, -2373,1,2648,2378,1, -2575,2383,1,2659,2682, -16,0,413,1,2657, -2389,1,2567,2393,1, -2655,2398,1,2654,2402, -1,2653,2406,1,2652, -2410,1,2651,2414,1, -2650,2418,1,2559,2422, -1,2647,2427,1,2646, -2431,1,2645,2435,1, -2644,2439,1,2643,2443, -1,2464,2042,1,2641, -2447,1,2551,2451,1, -2470,2683,16,0,413, -1,2459,1969,1,2536, -2457,1,2703,2684,16, -0,413,1,2521,2463, -1,2642,2468,1,2656, -2472,1,2597,2685,16, -0,413,1,2595,2477, -1,57,2686,19,798, -1,57,2687,5,53, -1,1803,2052,1,2043, -2001,1,1775,2688,16, -0,796,1,2041,2005, -1,2843,2285,1,2039, -2009,1,1860,1983,1, -2037,2014,1,2035,1900, -1,2033,2020,1,2032, -2024,1,2031,1915,1, -2030,1978,1,2029,1921, -1,2106,2689,16,0, -796,1,2842,2289,1, -2823,2690,16,0,796, -1,2464,2042,1,2822, -2272,1,1931,1909,1, -1574,1895,1,2462,1963, -1,2105,1940,1,52, -2691,16,0,796,1, -2459,1969,1,2458,1974, -1,10,2692,16,0, -796,1,2811,2240,1, -2364,2074,1,32,2693, -16,0,796,1,2783, -2332,1,1958,2694,16, -0,796,1,2841,2296, -1,2582,2695,16,0, -796,1,2198,2696,16, -0,796,1,2021,2036, -1,1901,2697,16,0, -796,1,1989,2060,1, -1990,2698,16,0,796, -1,2075,2699,16,0, -796,1,1804,2700,16, -0,796,1,2337,2701, -16,0,796,1,21, -2702,16,0,796,1, -1657,1990,1,2770,2703, -16,0,796,1,2413, -2704,16,0,796,1, -2844,2280,1,2045,1997, -1,1873,2069,1,0, -2705,16,0,796,1, -2227,2029,1,2466,2309, -1,2136,1926,1,56, -2706,19,269,1,56, -2707,5,55,1,1803, -2052,1,2043,2001,1, -1775,2708,16,0,795, -1,2041,2005,1,2843, -2285,1,2039,2009,1, -1860,1983,1,2037,2014, -1,2035,1900,1,2075, -2709,16,0,795,1, -2033,2020,1,2032,2024, -1,2031,1915,1,2030, -1978,1,2029,1921,1, -2106,2710,16,0,795, -1,2842,2289,1,2823, -2711,16,0,795,1, -2464,2042,1,2822,2272, -1,1931,1909,1,1574, -1895,1,2462,1963,1, -2105,1940,1,52,2712, -16,0,795,1,2459, -1969,1,2458,1974,1, -2545,2713,16,0,267, -1,2811,2240,1,2364, -2074,1,2541,2714,16, -0,267,1,2783,2332, -1,1958,2715,16,0, -795,1,2841,2296,1, -2198,2716,16,0,795, -1,2021,2036,1,1901, -2717,16,0,795,1, -1989,2060,1,1990,2718, -16,0,795,1,2466, -2309,1,32,2719,16, -0,795,1,1804,2720, -16,0,795,1,2337, -2721,16,0,795,1, -21,2722,16,0,795, -1,1657,1990,1,2770, -2723,16,0,795,1, -2413,2724,16,0,795, -1,2844,2280,1,2045, -1997,1,10,2725,16, -0,795,1,1873,2069, -1,0,2726,16,0, -795,1,2227,2029,1, -2582,2727,16,0,795, -1,2136,1926,1,55, -2728,19,292,1,55, -2729,5,56,1,1803, -2052,1,2043,2001,1, -1775,2730,16,0,794, -1,2041,2005,1,2843, -2285,1,2039,2009,1, -1860,1983,1,2037,2014, -1,2035,1900,1,2033, -2020,1,2032,2024,1, -2031,1915,1,2030,1978, -1,2029,1921,1,2106, -2731,16,0,794,1, -2842,2289,1,2823,2732, -16,0,794,1,2464, -2042,1,2822,2272,1, -1931,1909,1,2553,2733, -16,0,290,1,2462, -1963,1,2105,1940,1, -52,2734,16,0,794, -1,2459,1969,1,2458, -1974,1,10,2735,16, -0,794,1,2811,2240, -1,2364,2074,1,32, -2736,16,0,794,1, -2783,2332,1,1958,2737, -16,0,794,1,2841, -2296,1,2582,2738,16, -0,794,1,2530,2739, -16,0,290,1,2198, -2740,16,0,794,1, -2021,2036,1,2526,2741, -16,0,290,1,1901, -2742,16,0,794,1, -1989,2060,1,1990,2743, -16,0,794,1,2075, -2744,16,0,794,1, -1804,2745,16,0,794, -1,2337,2746,16,0, -794,1,21,2747,16, -0,794,1,1574,1895, -1,1657,1990,1,2770, -2748,16,0,794,1, -2413,2749,16,0,794, -1,2844,2280,1,2045, -1997,1,1873,2069,1, -0,2750,16,0,794, -1,2227,2029,1,2466, -2309,1,2136,1926,1, -54,2751,19,316,1, -54,2752,5,55,1, -1803,2052,1,2043,2001, -1,1775,2753,16,0, -793,1,2041,2005,1, -2843,2285,1,2039,2009, -1,1860,1983,1,2037, -2014,1,2569,2754,16, -0,314,1,2811,2240, -1,2033,2020,1,2032, -2024,1,2031,1915,1, -2030,1978,1,2029,1921, -1,2106,2755,16,0, -793,1,2842,2289,1, -2823,2756,16,0,793, -1,2464,2042,1,2822, -2272,1,1931,1909,1, -1574,1895,1,2462,1963, -1,2105,1940,1,52, -2757,16,0,793,1, -2459,1969,1,2458,1974, -1,10,2758,16,0, -793,1,2841,2296,1, -2364,2074,1,32,2759, -16,0,793,1,2783, -2332,1,1958,2760,16, -0,793,1,2035,1900, -1,2582,2761,16,0, -793,1,2198,2762,16, -0,793,1,2021,2036, -1,1901,2763,16,0, -793,1,1989,2060,1, -1990,2764,16,0,793, -1,2075,2765,16,0, -793,1,1804,2766,16, -0,793,1,2337,2767, -16,0,793,1,21, -2768,16,0,793,1, -1657,1990,1,2507,2769, -16,0,314,1,2770, -2770,16,0,793,1, -2413,2771,16,0,793, -1,2844,2280,1,2045, -1997,1,1873,2069,1, -0,2772,16,0,793, -1,2227,2029,1,2466, -2309,1,2136,1926,1, -53,2773,19,792,1, -53,2774,5,53,1, -1803,2052,1,2043,2001, -1,1775,2775,16,0, -790,1,2041,2005,1, -2843,2285,1,2039,2009, -1,1860,1983,1,2037, -2014,1,2035,1900,1, -2033,2020,1,2032,2024, -1,2031,1915,1,2030, -1978,1,2029,1921,1, -2106,2776,16,0,790, -1,2842,2289,1,2823, -2777,16,0,790,1, -2464,2042,1,2822,2272, -1,1931,1909,1,1574, -1895,1,2462,1963,1, -2105,1940,1,52,2778, -16,0,790,1,2459, -1969,1,2458,1974,1, -10,2779,16,0,790, -1,2811,2240,1,2364, -2074,1,32,2780,16, -0,790,1,2783,2332, -1,1958,2781,16,0, -790,1,2841,2296,1, -2582,2782,16,0,790, -1,2198,2783,16,0, -790,1,2021,2036,1, -1901,2784,16,0,790, -1,1989,2060,1,1990, -2785,16,0,790,1, -2075,2786,16,0,790, -1,1804,2787,16,0, -790,1,2337,2788,16, -0,790,1,21,2789, -16,0,790,1,1657, -1990,1,2770,2790,16, -0,790,1,2413,2791, -16,0,790,1,2844, -2280,1,2045,1997,1, -1873,2069,1,0,2792, -16,0,790,1,2227, -2029,1,2466,2309,1, -2136,1926,1,52,2793, -19,789,1,52,2794, -5,53,1,1803,2052, -1,2043,2001,1,1775, -2795,16,0,787,1, -2041,2005,1,2843,2285, -1,2039,2009,1,1860, -1983,1,2037,2014,1, -2035,1900,1,2033,2020, -1,2032,2024,1,2031, -1915,1,2030,1978,1, -2029,1921,1,2106,2796, -16,0,787,1,2842, -2289,1,2823,2797,16, -0,787,1,2464,2042, -1,2822,2272,1,1931, -1909,1,1574,1895,1, -2462,1963,1,2105,1940, -1,52,2798,16,0, -787,1,2459,1969,1, -2458,1974,1,10,2799, -16,0,787,1,2811, -2240,1,2364,2074,1, -32,2800,16,0,787, -1,2783,2332,1,1958, -2801,16,0,787,1, -2841,2296,1,2582,2802, -16,0,787,1,2198, -2803,16,0,787,1, -2021,2036,1,1901,2804, -16,0,787,1,1989, -2060,1,1990,2805,16, -0,787,1,2075,2806, -16,0,787,1,1804, -2807,16,0,787,1, -2337,2808,16,0,787, -1,21,2809,16,0, -787,1,1657,1990,1, -2770,2810,16,0,787, -1,2413,2811,16,0, -787,1,2844,2280,1, -2045,1997,1,1873,2069, -1,0,2812,16,0, -787,1,2227,2029,1, -2466,2309,1,2136,1926, -1,51,2813,19,310, -1,51,2814,5,58, -1,1803,2052,1,2043, -2001,1,1775,2815,16, -0,786,1,2842,2289, -1,2843,2285,1,2039, -2009,1,1860,1983,1, -2037,2014,1,2035,1900, -1,2033,2020,1,2032, -2024,1,2198,2816,16, -0,786,1,2030,1978, -1,2515,2817,16,0, -308,1,2106,2818,16, -0,786,1,2561,2819, -16,0,308,1,1873, -2069,1,2823,2820,16, -0,786,1,2466,2309, -1,1931,1909,1,2464, -2042,1,2783,2332,1, -2462,1963,1,2105,1940, -1,52,2821,16,0, -786,1,2459,1969,1, -2458,1974,1,2822,2272, -1,2811,2240,1,2364, -2074,1,32,2822,16, -0,786,1,2029,1921, -1,2538,2823,16,0, -308,1,2841,2296,1, -2041,2005,1,1657,1990, -1,2021,2036,1,1901, -2824,16,0,786,1, -2523,2825,16,0,308, -1,1990,2826,16,0, -786,1,2075,2827,16, -0,786,1,1804,2828, -16,0,786,1,2337, -2829,16,0,786,1, -21,2830,16,0,786, -1,1574,1895,1,1989, -2060,1,2511,2831,16, -0,308,1,2770,2832, -16,0,786,1,2413, -2833,16,0,786,1, -2844,2280,1,2045,1997, -1,10,2834,16,0, -786,1,0,2835,16, -0,786,1,2031,1915, -1,1958,2836,16,0, -786,1,2227,2029,1, -2582,2837,16,0,786, -1,2136,1926,1,50, -2838,19,326,1,50, -2839,5,38,1,2045, -1997,1,2043,2001,1, -1775,2840,16,0,324, -1,2041,2005,1,2039, -2009,1,1860,1983,1, -2037,2014,1,2035,1900, -1,2033,2020,1,2032, -2024,1,2031,1915,1, -2030,1978,1,2029,1921, -1,2106,2841,16,0, -324,1,2464,2042,1, -1931,1909,1,1574,1895, -1,2462,1963,1,2105, -1940,1,2459,1969,1, -2458,1974,1,2364,2074, -1,1958,2842,16,0, -324,1,2198,2843,16, -0,324,1,2021,2036, -1,1901,2844,16,0, -324,1,1989,2060,1, -1803,2052,1,2075,2845, -16,0,324,1,1990, -2846,16,0,324,1, -1804,2847,16,0,324, -1,2337,2848,16,0, -324,1,1657,1990,1, -2413,2849,16,0,324, -1,32,2850,16,0, -324,1,1873,2069,1, -2227,2029,1,2136,1926, -1,49,2851,19,662, -1,49,2852,5,38, -1,2045,1997,1,2043, -2001,1,1775,2853,16, -0,660,1,2041,2005, -1,2039,2009,1,1860, -1983,1,2037,2014,1, -2035,1900,1,2033,2020, -1,2032,2024,1,2031, -1915,1,2030,1978,1, -2029,1921,1,2106,2854, -16,0,660,1,2464, -2042,1,1931,1909,1, -1574,1895,1,2462,1963, -1,2105,1940,1,2459, -1969,1,2458,1974,1, -2364,2074,1,1958,2855, -16,0,660,1,2198, -2856,16,0,660,1, -2021,2036,1,1901,2857, -16,0,660,1,1989, -2060,1,1803,2052,1, -2075,2858,16,0,660, -1,1990,2859,16,0, -660,1,1804,2860,16, -0,660,1,2337,2861, -16,0,660,1,1657, -1990,1,2413,2862,16, -0,660,1,32,2863, -16,0,660,1,1873, -2069,1,2227,2029,1, -2136,1926,1,48,2864, -19,426,1,48,2865, -5,54,1,1803,2052, -1,2043,2001,1,2755, -2866,17,2867,15,2868, -4,12,37,0,83, -0,116,0,97,0, -116,0,101,0,1, --1,1,5,2869,20, -1773,1,179,1,3, -1,5,1,4,2870, -22,1,13,1,2041, -2005,1,2843,2285,1, -2039,2009,1,1860,1983, -1,2037,2014,1,2035, -1900,1,2033,2020,1, -2032,2024,1,2031,1915, -1,2030,1978,1,2029, -1921,1,2106,2871,16, -0,665,1,2842,2289, -1,2649,2872,17,2873, -15,2868,1,-1,1, -5,2874,20,1766,1, -180,1,3,1,6, -1,5,2875,22,1, -14,1,2768,2876,17, -2877,15,2878,4,14, -37,0,83,0,116, -0,97,0,116,0, -101,0,115,0,1, --1,1,5,2879,20, -1780,1,177,1,3, -1,2,1,1,2880, -22,1,11,1,2823, -2881,16,0,424,1, -2822,2272,1,1931,1909, -1,2464,2042,1,2462, -1963,1,2105,1940,1, -2459,1969,1,2458,1974, -1,2811,2240,1,2364, -2074,1,32,2882,16, -0,665,1,2783,2332, -1,1958,2883,16,0, -665,1,2834,2884,16, -0,424,1,2841,2296, -1,2198,2885,16,0, -665,1,2021,2036,1, -1901,2886,16,0,665, -1,1989,2060,1,1990, -2887,16,0,665,1, -2075,2888,16,0,665, -1,1804,2889,16,0, -665,1,2337,2890,16, -0,665,1,1574,1895, -1,2045,1997,1,1657, -1990,1,1775,2891,16, -0,665,1,2413,2892, -16,0,665,1,2844, -2280,1,2767,2893,17, -2894,15,2878,1,-1, -1,5,2895,20,1775, -1,178,1,3,1, -3,1,2,2896,22, -1,12,1,2764,2897, -16,0,424,1,1873, -2069,1,0,2898,16, -0,424,1,2227,2029, -1,2466,2309,1,2136, -1926,1,47,2899,19, -154,1,47,2900,5, -19,1,2811,2240,1, -2768,2876,1,2844,2280, -1,2843,2285,1,2842, -2289,1,2767,2893,1, -2764,2901,16,0,152, -1,2022,2902,16,0, -664,1,2649,2872,1, -2834,2903,16,0,152, -1,2464,2042,1,2755, -2866,1,2841,2296,1, -2459,1969,1,2823,2904, -16,0,152,1,2822, -2272,1,2783,2332,1, -2466,2309,1,0,2905, -16,0,152,1,46, -2906,19,216,1,46, -2907,5,38,1,2045, -1997,1,2043,2001,1, -1775,2908,16,0,214, -1,2041,2005,1,2039, -2009,1,1860,1983,1, -2037,2014,1,2035,1900, -1,2033,2020,1,2032, -2024,1,2031,1915,1, -2030,1978,1,2029,1921, -1,2106,2909,16,0, -214,1,2464,2042,1, -1931,1909,1,1574,1895, -1,2462,1963,1,2105, -1940,1,2459,1969,1, -2458,1974,1,2364,2074, -1,1958,2910,16,0, -214,1,2198,2911,16, -0,214,1,2021,2036, -1,1901,2912,16,0, -214,1,1989,2060,1, -1803,2052,1,2075,2913, -16,0,214,1,1990, -2914,16,0,214,1, -1804,2915,16,0,214, -1,2337,2916,16,0, -214,1,1657,1990,1, -2413,2917,16,0,214, -1,32,2918,16,0, -214,1,1873,2069,1, -2227,2029,1,2136,1926, -1,45,2919,19,120, -1,45,2920,5,39, -1,2045,1997,1,2043, -2001,1,1775,2921,16, -0,763,1,2041,2005, -1,2039,2009,1,1860, -1983,1,2037,2014,1, -2035,1900,1,2033,2020, -1,2032,2024,1,2031, -1915,1,2030,1978,1, -2029,1921,1,2106,2922, -16,0,763,1,2464, -2042,1,1931,1909,1, -1574,1895,1,2462,1963, -1,2105,1940,1,2459, -1969,1,2458,1974,1, -1832,2923,16,0,118, -1,2364,2074,1,1958, -2924,16,0,763,1, -2198,2925,16,0,763, -1,2021,2036,1,1901, -2926,16,0,763,1, -1989,2060,1,1803,2052, -1,2075,2927,16,0, -763,1,1990,2928,16, -0,763,1,1804,2929, -16,0,763,1,2337, -2930,16,0,763,1, -1657,1990,1,2413,2931, -16,0,763,1,32, -2932,16,0,763,1, -1873,2069,1,2227,2029, -1,2136,1926,1,44, -2933,19,126,1,44, -2934,5,38,1,2045, -1997,1,2043,2001,1, -1775,2935,16,0,124, -1,2041,2005,1,2039, -2009,1,1860,1983,1, -2037,2014,1,2035,1900, -1,2033,2020,1,2032, -2024,1,2031,1915,1, -2030,1978,1,2029,1921, -1,2106,2936,16,0, -124,1,2464,2042,1, -1931,1909,1,1574,1895, -1,2462,1963,1,2105, -1940,1,2459,1969,1, -2458,1974,1,2364,2074, -1,1958,2937,16,0, -124,1,2198,2938,16, -0,124,1,2021,2036, -1,1901,2939,16,0, -124,1,1989,2060,1, -1803,2052,1,2075,2940, -16,0,124,1,1990, -2941,16,0,124,1, -1804,2942,16,0,124, -1,2337,2943,16,0, -124,1,1657,1990,1, -2413,2944,16,0,124, -1,32,2945,16,0, -124,1,1873,2069,1, -2227,2029,1,2136,1926, -1,43,2946,19,594, -1,43,2947,5,25, -1,1860,1983,1,2033, -2020,1,2032,2024,1, -2364,2074,1,2030,1978, -1,2029,1921,1,1657, -1990,1,1989,2948,16, -0,673,1,1803,2052, -1,2021,2036,1,2464, -2042,1,1574,1895,1, -2459,1969,1,1873,2069, -1,2136,1926,1,2031, -1915,1,2105,2949,16, -0,592,1,2045,1997, -1,2043,2001,1,1931, -1909,1,2041,2005,1, -2227,2029,1,2039,2009, -1,2037,2014,1,2035, -1900,1,42,2950,19, -438,1,42,2951,5, -38,1,2045,1997,1, -2043,2001,1,1775,2952, -16,0,436,1,2041, -2005,1,2039,2009,1, -1860,1983,1,2037,2014, -1,2035,1900,1,2033, -2020,1,2032,2024,1, -2031,1915,1,2030,1978, -1,2029,1921,1,2106, -2953,16,0,436,1, -2464,2042,1,1931,1909, -1,1574,1895,1,2462, -1963,1,2105,1940,1, -2459,1969,1,2458,1974, -1,2364,2074,1,1958, -2954,16,0,436,1, -2198,2955,16,0,436, -1,2021,2036,1,1901, -2956,16,0,436,1, -1989,2060,1,1803,2052, -1,2075,2957,16,0, -436,1,1990,2958,16, -0,436,1,1804,2959, -16,0,436,1,2337, -2960,16,0,436,1, -1657,1990,1,2413,2961, -16,0,436,1,32, -2962,16,0,436,1, -1873,2069,1,2227,2029, -1,2136,1926,1,41, -2963,19,757,1,41, -2964,5,84,1,1377, -2965,16,0,755,1, -387,2966,16,0,755, -1,188,2967,16,0, -755,1,380,2968,17, -2969,15,2970,4,38, -37,0,67,0,111, -0,110,0,115,0, -116,0,97,0,110, -0,116,0,69,0, -120,0,112,0,114, -0,101,0,115,0, -115,0,105,0,111, -0,110,0,1,-1, -1,5,2971,20,1198, -1,289,1,3,1, -2,1,1,2972,22, -1,124,1,379,2973, -17,2974,15,2975,4, -58,37,0,73,0, -110,0,99,0,114, -0,101,0,109,0, -101,0,110,0,116, -0,68,0,101,0, -99,0,114,0,101, -0,109,0,101,0, -110,0,116,0,69, -0,120,0,112,0, -114,0,101,0,115, -0,115,0,105,0, -111,0,110,0,1, --1,1,5,2976,20, -1180,1,298,1,3, -1,5,1,4,2977, -22,1,133,1,377, -2978,17,2979,15,2975, -1,-1,1,5,2980, -20,1184,1,296,1, -3,1,3,1,2, -2981,22,1,131,1, -2792,2982,16,0,755, -1,375,2983,17,2984, -15,2975,1,-1,1, -5,2985,20,1178,1, -299,1,3,1,5, -1,4,2986,22,1, -134,1,373,2987,17, -2988,15,2975,1,-1, -1,5,2989,20,1182, -1,297,1,3,1, -3,1,2,2990,22, -1,132,1,371,2991, -17,2992,15,2993,4, -46,37,0,70,0, -117,0,110,0,99, -0,116,0,105,0, -111,0,110,0,67, -0,97,0,108,0, -108,0,69,0,120, -0,112,0,114,0, -101,0,115,0,115, -0,105,0,111,0, -110,0,1,-1,1, -5,2994,20,1176,1, -300,1,3,1,2, -1,1,2995,22,1, -135,1,172,2996,16, -0,755,1,67,2997, -17,2998,15,2999,4, -38,37,0,84,0, -121,0,112,0,101, -0,99,0,97,0, -115,0,116,0,69, -0,120,0,112,0, -114,0,101,0,115, -0,115,0,105,0, -111,0,110,0,1, --1,1,5,3000,20, -1116,1,330,1,3, -1,8,1,7,3001, -22,1,165,1,1939, -3002,16,0,755,1, -1737,3003,16,0,755, -1,1341,3004,16,0, -755,1,157,3005,16, -0,755,1,480,3006, -17,3007,15,3008,4, -26,37,0,76,0, -105,0,115,0,116, -0,67,0,111,0, -110,0,115,0,116, -0,97,0,110,0, -116,0,1,-1,1, -5,3009,20,1273,1, -286,1,3,1,4, -1,3,3010,22,1, -121,1,942,3011,17, -3012,15,3013,4,34, -37,0,66,0,105, -0,110,0,97,0, -114,0,121,0,69, -0,120,0,112,0, -114,0,101,0,115, -0,115,0,105,0, -111,0,110,0,1, --1,1,5,3014,20, -1142,1,317,1,3, -1,4,1,3,3015, -22,1,152,1,49, -3016,17,3017,15,2975, -1,-1,1,5,3018, -20,1188,1,294,1, -3,1,5,1,4, -3019,22,1,129,1, -143,3020,16,0,755, -1,1521,3021,16,0, -755,1,1123,3022,16, -0,755,1,82,3023, -17,3024,15,3025,4, -32,37,0,85,0, -110,0,97,0,114, -0,121,0,69,0, -120,0,112,0,114, -0,101,0,115,0, -115,0,105,0,111, -0,110,0,1,-1, -1,5,3026,20,1134, -1,321,1,3,1, -3,1,2,3027,22, -1,156,1,2299,3028, -16,0,755,1,328, -3029,17,3030,15,3013, -1,-1,1,5,3031, -20,1172,1,302,1, -3,1,4,1,3, -3032,22,1,137,1, -130,3033,16,0,755, -1,1114,3034,17,3035, -15,3036,4,38,37, -0,73,0,100,0, -101,0,110,0,116, -0,68,0,111,0, -116,0,69,0,120, -0,112,0,114,0, -101,0,115,0,115, -0,105,0,111,0, -110,0,1,-1,1, -5,3037,20,1194,1, -291,1,3,1,4, -1,3,3038,22,1, -126,1,1701,3039,16, -0,755,1,1303,3040, -16,0,755,1,118, -3041,16,0,755,1, -1096,3042,17,3043,15, -3044,4,26,37,0, -70,0,117,0,110, -0,99,0,116,0, -105,0,111,0,110, -0,67,0,97,0, -108,0,108,0,1, --1,1,5,3045,20, -973,1,333,1,3, -1,5,1,4,3046, -22,1,168,1,1882, -3047,16,0,755,1, -305,3048,17,3049,15, -3013,1,-1,1,5, -3050,20,1170,1,303, -1,3,1,4,1, -3,3051,22,1,138, -1,107,3052,17,3053, -15,3025,1,-1,1, -5,3054,20,1138,1, -319,1,3,1,3, -1,2,3055,22,1, -154,1,1485,3056,16, -0,755,1,70,3057, -17,3058,15,2999,1, --1,1,5,3059,20, -1122,1,327,1,3, -1,6,1,5,3060, -22,1,162,1,1555, -3061,16,0,755,1, -883,3062,16,0,755, -1,93,3063,17,3064, -15,3025,1,-1,1, -5,3065,20,1136,1, -320,1,3,1,3, -1,2,3066,22,1, -155,1,1665,3067,16, -0,755,1,283,3068, -17,3069,15,3013,1, --1,1,5,3070,20, -1168,1,304,1,3, -1,4,1,3,3071, -22,1,139,1,479, -3072,17,3073,15,3074, -4,18,37,0,67, -0,111,0,110,0, -115,0,116,0,97, -0,110,0,116,0, -1,-1,1,5,3075, -20,1281,1,282,1, -3,1,2,1,1, -3076,22,1,117,1, -478,3077,17,3078,15, -3074,1,-1,1,5, -3079,20,1279,1,283, -1,3,1,2,1, -1,3080,22,1,118, -1,477,3081,17,3082, -15,3074,1,-1,1, -5,3083,20,1277,1, -284,1,3,1,2, -1,1,3084,22,1, -119,1,476,3085,17, -3086,15,3074,1,-1, -1,5,3087,20,1275, -1,285,1,3,1, -2,1,1,3088,22, -1,120,1,74,3089, -17,3090,15,2999,1, --1,1,5,3091,20, -1044,1,332,1,3, -1,7,1,6,3092, -22,1,167,1,73, -3093,16,0,755,1, -1449,3094,16,0,755, -1,69,3095,17,3096, -15,2999,1,-1,1, -5,3097,20,1118,1, -329,1,3,1,6, -1,5,3098,22,1, -164,1,68,3099,17, -3100,15,2999,1,-1, -1,5,3101,20,1120, -1,328,1,3,1, -8,1,7,3102,22, -1,163,1,1840,3103, -16,0,755,1,66, -3104,17,3105,15,2999, -1,-1,1,5,3106, -20,1124,1,326,1, -3,1,7,1,6, -3107,22,1,161,1, -262,3108,17,3109,15, -3013,1,-1,1,5, -3110,20,1166,1,305, -1,3,1,4,1, -3,3111,22,1,140, -1,1267,3112,16,0, -755,1,1048,3113,17, -3114,15,3013,1,-1, -1,5,3115,20,1140, -1,318,1,3,1, -4,1,3,3116,22, -1,153,1,447,3117, -17,3118,15,3119,4, -30,37,0,86,0, -101,0,99,0,116, -0,111,0,114,0, -67,0,111,0,110, -0,115,0,116,0, -97,0,110,0,116, -0,1,-1,1,5, -3120,20,1271,1,287, -1,3,1,8,1, -7,3121,22,1,122, -1,1628,3122,16,0, -755,1,51,3123,17, -3124,15,2975,1,-1, -1,5,3125,20,1192, -1,292,1,3,1, -3,1,2,3126,22, -1,127,1,63,3127, -17,3128,15,2999,1, --1,1,5,3129,20, -1126,1,325,1,3, -1,5,1,4,3130, -22,1,160,1,1231, -3131,16,0,755,1, -48,3132,17,3133,15, -2975,1,-1,1,5, -3134,20,1186,1,295, -1,3,1,5,1, -4,3135,22,1,130, -1,47,3136,17,3035, -1,3,3038,1,242, -3137,16,0,755,1, -44,3138,17,3139,15, -3140,4,32,37,0, -73,0,100,0,101, -0,110,0,116,0, -69,0,120,0,112, -0,114,0,101,0, -115,0,115,0,105, -0,111,0,110,0, -1,-1,1,5,3141, -20,1196,1,290,1, -3,1,2,1,1, -3142,22,1,125,1, -437,3143,16,0,755, -1,42,3144,16,0, -755,1,525,3145,17, -3146,15,3147,4,34, -37,0,82,0,111, -0,116,0,97,0, -116,0,105,0,111, -0,110,0,67,0, -111,0,110,0,115, -0,116,0,97,0, -110,0,116,0,1, --1,1,5,3148,20, -1200,1,288,1,3, -1,10,1,9,3149, -22,1,123,1,827, -3150,16,0,755,1, -352,3151,17,3152,15, -3013,1,-1,1,5, -3153,20,1174,1,301, -1,3,1,4,1, -3,3154,22,1,136, -1,1413,3155,16,0, -755,1,1013,3156,17, -3157,15,3158,4,44, -37,0,80,0,97, -0,114,0,101,0, -110,0,116,0,104, -0,101,0,115,0, -105,0,115,0,69, -0,120,0,112,0, -114,0,101,0,115, -0,115,0,105,0, -111,0,110,0,1, --1,1,5,3159,20, -1132,1,322,1,3, -1,4,1,3,3160, -22,1,157,1,1012, -3161,16,0,755,1, -223,3162,16,0,755, -1,1159,3163,16,0, -755,1,1011,3164,17, -3165,15,3158,1,-1, -1,5,3166,20,1130, -1,323,1,3,1, -4,1,3,3167,22, -1,158,1,412,3168, -16,0,755,1,1002, -3169,17,3170,15,2999, -1,-1,1,5,3171, -20,1128,1,324,1, -3,1,5,1,4, -3172,22,1,159,1, -1001,3173,17,3174,15, -2999,1,-1,1,5, -3175,20,1114,1,331, -1,3,1,5,1, -4,3176,22,1,166, -1,1591,3177,16,0, -755,1,1195,3178,16, -0,755,1,40,3179, -17,3139,1,1,3142, -1,205,3180,16,0, -755,1,50,3181,17, -3182,15,2975,1,-1, -1,5,3183,20,1190, -1,293,1,3,1, -3,1,2,3184,22, -1,128,1,515,3185, -16,0,755,1,40, -3186,19,727,1,40, -3187,5,84,1,1377, -3188,16,0,725,1, -387,3189,16,0,725, -1,188,3190,16,0, -725,1,380,2968,1, -379,2973,1,377,2978, -1,2792,3191,16,0, -725,1,375,2983,1, -373,2987,1,371,2991, -1,172,3192,16,0, -725,1,67,2997,1, -1939,3193,16,0,725, -1,1737,3194,16,0, -725,1,1341,3195,16, -0,725,1,157,3196, -16,0,725,1,480, -3006,1,942,3011,1, -49,3016,1,143,3197, -16,0,725,1,1521, -3198,16,0,725,1, -1123,3199,16,0,725, -1,82,3023,1,2299, -3200,16,0,725,1, -328,3029,1,130,3201, -16,0,725,1,1114, -3034,1,1701,3202,16, -0,725,1,1303,3203, -16,0,725,1,118, -3204,16,0,725,1, -1096,3042,1,1882,3205, -16,0,725,1,305, -3048,1,107,3052,1, -1485,3206,16,0,725, -1,70,3057,1,1555, -3207,16,0,725,1, -883,3208,16,0,725, -1,93,3063,1,1665, -3209,16,0,725,1, -283,3068,1,479,3072, -1,478,3077,1,477, -3081,1,476,3085,1, -74,3089,1,73,3210, -16,0,725,1,1449, -3211,16,0,725,1, -69,3095,1,68,3099, -1,1840,3212,16,0, -725,1,66,3104,1, -262,3108,1,1267,3213, -16,0,725,1,1048, -3113,1,447,3117,1, -1628,3214,16,0,725, -1,51,3123,1,63, -3127,1,1231,3215,16, -0,725,1,48,3132, -1,47,3136,1,242, -3216,16,0,725,1, -44,3138,1,437,3217, -16,0,725,1,42, -3218,16,0,725,1, -525,3145,1,827,3219, -16,0,725,1,352, -3151,1,1413,3220,16, -0,725,1,1013,3156, -1,1012,3221,16,0, -725,1,223,3222,16, -0,725,1,1159,3223, -16,0,725,1,1011, -3164,1,412,3224,16, -0,725,1,1002,3169, -1,1001,3173,1,1591, -3225,16,0,725,1, -1195,3226,16,0,725, -1,40,3179,1,205, -3227,16,0,725,1, -50,3181,1,515,3228, -16,0,725,1,39, -3229,19,716,1,39, -3230,5,84,1,1377, -3231,16,0,714,1, -387,3232,16,0,714, -1,188,3233,17,3234, -15,3013,1,-1,1, -5,3235,20,1158,1, -309,1,3,1,4, -1,3,3236,22,1, -144,1,380,2968,1, -379,2973,1,377,2978, -1,2792,3237,16,0, -714,1,375,2983,1, -373,2987,1,371,2991, -1,172,3238,17,3239, -15,3013,1,-1,1, -5,3240,20,1156,1, -310,1,3,1,4, -1,3,3241,22,1, -145,1,67,2997,1, -1939,3242,16,0,714, -1,1737,3243,16,0, -714,1,1341,3244,16, -0,714,1,157,3245, -17,3246,15,3013,1, --1,1,5,3247,20, -1154,1,311,1,3, -1,4,1,3,3248, -22,1,146,1,480, -3006,1,942,3011,1, -49,3016,1,143,3249, -17,3250,15,3013,1, --1,1,5,3251,20, -1152,1,312,1,3, -1,4,1,3,3252, -22,1,147,1,1521, -3253,16,0,714,1, -1123,3254,16,0,714, -1,82,3023,1,2299, -3255,16,0,714,1, -328,3029,1,130,3256, -17,3257,15,3013,1, --1,1,5,3258,20, -1150,1,313,1,3, -1,4,1,3,3259, -22,1,148,1,1114, -3034,1,1701,3260,16, -0,714,1,1303,3261, -16,0,714,1,118, -3262,17,3263,15,3013, -1,-1,1,5,3264, -20,1148,1,314,1, -3,1,4,1,3, -3265,22,1,149,1, -1096,3042,1,1882,3266, -16,0,714,1,305, -3048,1,107,3052,1, -1485,3267,16,0,714, -1,70,3057,1,1555, -3268,16,0,714,1, -883,3269,17,3270,15, -3013,1,-1,1,5, -3271,20,1144,1,316, -1,3,1,4,1, -3,3272,22,1,151, -1,93,3063,1,1665, -3273,16,0,714,1, -283,3068,1,479,3072, -1,478,3077,1,477, -3081,1,476,3085,1, -74,3089,1,73,3274, -16,0,714,1,1449, -3275,16,0,714,1, -69,3095,1,68,3099, -1,1840,3276,16,0, -714,1,66,3104,1, -262,3108,1,1267,3277, -16,0,714,1,1048, -3113,1,447,3117,1, -1628,3278,16,0,714, -1,51,3123,1,63, -3127,1,1231,3279,16, -0,714,1,48,3132, -1,47,3136,1,242, -3280,17,3281,15,3013, -1,-1,1,5,3282, -20,1164,1,306,1, -3,1,4,1,3, -3283,22,1,141,1, -44,3138,1,437,3284, -16,0,714,1,42, -3285,16,0,714,1, -525,3145,1,827,3286, -17,3287,15,3013,1, --1,1,5,3288,20, -1146,1,315,1,3, -1,4,1,3,3289, -22,1,150,1,352, -3151,1,1413,3290,16, -0,714,1,1013,3156, -1,1012,3291,16,0, -714,1,223,3292,17, -3293,15,3013,1,-1, -1,5,3294,20,1162, -1,307,1,3,1, -4,1,3,3295,22, -1,142,1,1159,3296, -16,0,714,1,1011, -3164,1,412,3297,16, -0,714,1,1002,3169, -1,1001,3173,1,1591, -3298,16,0,714,1, -1195,3299,16,0,714, -1,40,3179,1,205, -3300,17,3301,15,3013, -1,-1,1,5,3302, -20,1160,1,308,1, -3,1,4,1,3, -3303,22,1,143,1, -50,3181,1,515,3304, -16,0,714,1,38, -3305,19,703,1,38, -3306,5,84,1,1377, -3307,16,0,701,1, -387,3308,16,0,701, -1,188,3233,1,380, -2968,1,379,2973,1, -377,2978,1,2792,3309, -16,0,701,1,375, -2983,1,373,2987,1, -371,2991,1,172,3238, -1,67,2997,1,1939, -3310,16,0,701,1, -1737,3311,16,0,701, -1,1341,3312,16,0, -701,1,157,3245,1, -480,3006,1,942,3011, -1,49,3016,1,143, -3249,1,1521,3313,16, -0,701,1,1123,3314, -16,0,701,1,82, -3023,1,2299,3315,16, -0,701,1,328,3029, -1,130,3256,1,1114, -3034,1,1701,3316,16, -0,701,1,1303,3317, -16,0,701,1,118, -3262,1,1096,3042,1, -1882,3318,16,0,701, -1,305,3048,1,107, -3052,1,1485,3319,16, -0,701,1,70,3057, -1,1555,3320,16,0, -701,1,883,3269,1, -93,3063,1,1665,3321, -16,0,701,1,283, -3068,1,479,3072,1, -478,3077,1,477,3081, -1,476,3085,1,74, -3089,1,73,3322,16, -0,701,1,1449,3323, -16,0,701,1,69, -3095,1,68,3099,1, -1840,3324,16,0,701, -1,66,3104,1,262, -3108,1,1267,3325,16, -0,701,1,1048,3113, -1,447,3117,1,1628, -3326,16,0,701,1, -51,3123,1,63,3127, -1,1231,3327,16,0, -701,1,48,3132,1, -47,3136,1,242,3280, -1,44,3138,1,437, -3328,16,0,701,1, -42,3329,16,0,701, -1,525,3145,1,827, -3286,1,352,3151,1, -1413,3330,16,0,701, -1,1013,3156,1,1012, -3331,16,0,701,1, -223,3292,1,1159,3332, -16,0,701,1,1011, -3164,1,412,3333,16, -0,701,1,1002,3169, -1,1001,3173,1,1591, -3334,16,0,701,1, -1195,3335,16,0,701, -1,40,3179,1,205, -3300,1,50,3181,1, -515,3336,16,0,701, -1,37,3337,19,696, -1,37,3338,5,94, -1,1574,1895,1,2035, -1900,1,1371,3339,16, -0,694,1,71,3340, -16,0,694,1,1958, -3341,16,0,694,1, -381,3342,16,0,694, -1,2106,3343,16,0, -694,1,1931,1909,1, -1756,3344,16,0,694, -1,2031,1915,1,509, -3345,16,0,694,1, -2337,3346,16,0,694, -1,2029,1921,1,1153, -3347,16,0,694,1, -2136,1926,1,1933,3348, -16,0,694,1,2198, -3349,16,0,694,1, -1731,3350,16,0,694, -1,1335,3351,16,0, -694,1,2318,3352,16, -0,694,1,346,3353, -16,0,694,1,182, -3354,16,0,694,1, -137,3355,16,0,694, -1,1515,3356,16,0, -694,1,2105,1940,1, -1775,3357,16,0,694, -1,1117,3358,16,0, -694,1,525,3359,16, -0,694,1,1901,3360, -16,0,694,1,2293, -3361,16,0,694,1, -322,3362,16,0,694, -1,124,3363,16,0, -694,1,1695,3364,16, -0,694,1,1297,3365, -16,0,694,1,151, -3366,16,0,694,1, -112,3367,16,0,694, -1,1990,3368,16,0, -694,1,76,3369,16, -0,694,1,43,3370, -16,0,694,1,2075, -3371,16,0,694,1, -1876,3372,16,0,694, -1,299,3373,16,0, -694,1,1479,3374,16, -0,694,1,2462,1963, -1,97,3375,16,0, -694,1,2459,1969,1, -2458,1974,1,2030,1978, -1,89,3376,16,0, -694,1,1860,1983,1, -85,3377,16,0,694, -1,1659,3378,16,0, -694,1,1657,1990,1, -277,3379,16,0,694, -1,1261,3380,16,0, -694,1,166,3381,16, -0,694,1,2045,1997, -1,2043,2001,1,2041, -2005,1,2039,2009,1, -462,3382,16,0,694, -1,2037,2014,1,459, -3383,16,0,694,1, -1443,3384,16,0,694, -1,2033,2020,1,2032, -2024,1,1834,3385,16, -0,694,1,2227,2029, -1,256,3386,16,0, -694,1,447,3387,16, -0,694,1,52,3388, -16,0,694,1,2021, -2036,1,2413,3389,16, -0,694,1,1622,3390, -16,0,694,1,2464, -2042,1,1225,3391,16, -0,694,1,41,3392, -16,0,694,1,236, -3393,16,0,694,1, -431,3394,16,0,694, -1,32,3395,16,0, -694,1,1804,3396,16, -0,694,1,1803,2052, -1,1407,3397,16,0, -694,1,79,3398,16, -0,694,1,217,3399, -16,0,694,1,1989, -2060,1,102,3400,16, -0,694,1,2786,3401, -16,0,694,1,406, -3402,16,0,694,1, -1585,3403,16,0,694, -1,1189,3404,16,0, -694,1,1873,2069,1, -199,3405,16,0,694, -1,2364,2074,1,36, -3406,19,722,1,36, -3407,5,94,1,1574, -1895,1,2035,1900,1, -1371,3408,16,0,720, -1,71,3409,16,0, -720,1,1958,3410,16, -0,720,1,381,3411, -16,0,720,1,2106, -3412,16,0,720,1, -1931,1909,1,1756,3413, -16,0,720,1,2031, -1915,1,509,3414,16, -0,720,1,2337,3415, -16,0,720,1,2029, -1921,1,1153,3416,16, -0,720,1,2136,1926, -1,1933,3417,16,0, -720,1,2198,3418,16, -0,720,1,1731,3419, -16,0,720,1,1335, -3420,16,0,720,1, -2318,3421,16,0,720, -1,346,3422,16,0, -720,1,182,3423,16, -0,720,1,137,3424, -16,0,720,1,1515, -3425,16,0,720,1, -2105,1940,1,1775,3426, -16,0,720,1,1117, -3427,16,0,720,1, -525,3428,16,0,720, -1,1901,3429,16,0, -720,1,2293,3430,16, -0,720,1,322,3431, -16,0,720,1,124, -3432,16,0,720,1, -1695,3433,16,0,720, -1,1297,3434,16,0, -720,1,151,3435,16, -0,720,1,112,3436, -16,0,720,1,1990, -3437,16,0,720,1, -76,3438,16,0,720, -1,43,3439,16,0, -720,1,2075,3440,16, -0,720,1,1876,3441, -16,0,720,1,299, -3442,16,0,720,1, -1479,3443,16,0,720, -1,2462,1963,1,97, -3444,16,0,720,1, -2459,1969,1,2458,1974, -1,2030,1978,1,89, -3445,16,0,720,1, -1860,1983,1,85,3446, -16,0,720,1,1659, -3447,16,0,720,1, -1657,1990,1,277,3448, -16,0,720,1,1261, -3449,16,0,720,1, -166,3450,16,0,720, -1,2045,1997,1,2043, -2001,1,2041,2005,1, -2039,2009,1,462,3451, -16,0,720,1,2037, -2014,1,459,3452,16, -0,720,1,1443,3453, -16,0,720,1,2033, -2020,1,2032,2024,1, -1834,3454,16,0,720, -1,2227,2029,1,256, -3455,16,0,720,1, -447,3456,16,0,720, -1,52,3457,16,0, -720,1,2021,2036,1, -2413,3458,16,0,720, -1,1622,3459,16,0, -720,1,2464,2042,1, -1225,3460,16,0,720, -1,41,3461,16,0, -720,1,236,3462,16, -0,720,1,431,3463, -16,0,720,1,32, -3464,16,0,720,1, -1804,3465,16,0,720, -1,1803,2052,1,1407, -3466,16,0,720,1, -79,3467,16,0,720, -1,217,3468,16,0, -720,1,1989,2060,1, -102,3469,16,0,720, -1,2786,3470,16,0, -720,1,406,3471,16, -0,720,1,1585,3472, -16,0,720,1,1189, -3473,16,0,720,1, -1873,2069,1,199,3474, -16,0,720,1,2364, -2074,1,35,3475,19, -638,1,35,3476,5, -84,1,1377,3477,16, -0,636,1,387,3478, -16,0,636,1,188, -3233,1,380,2968,1, -379,2973,1,377,2978, -1,2792,3479,16,0, -636,1,375,2983,1, -373,2987,1,371,2991, -1,172,3238,1,67, -2997,1,1939,3480,16, -0,636,1,1737,3481, -16,0,636,1,1341, -3482,16,0,636,1, -157,3245,1,480,3006, -1,942,3011,1,49, -3016,1,143,3249,1, -1521,3483,16,0,636, -1,1123,3484,16,0, -636,1,82,3023,1, -2299,3485,16,0,636, -1,328,3029,1,130, -3256,1,1114,3034,1, -1701,3486,16,0,636, -1,1303,3487,16,0, -636,1,118,3262,1, -1096,3042,1,1882,3488, -16,0,636,1,305, -3048,1,107,3052,1, -1485,3489,16,0,636, -1,70,3057,1,1555, -3490,16,0,636,1, -883,3491,16,0,636, -1,93,3063,1,1665, -3492,16,0,636,1, -283,3068,1,479,3072, -1,478,3077,1,477, -3081,1,476,3085,1, -74,3089,1,73,3493, -16,0,636,1,1449, -3494,16,0,636,1, -69,3095,1,68,3099, -1,1840,3495,16,0, -636,1,66,3104,1, -262,3108,1,1267,3496, -16,0,636,1,1048, -3113,1,447,3117,1, -1628,3497,16,0,636, -1,51,3123,1,63, -3127,1,1231,3498,16, -0,636,1,48,3132, -1,47,3136,1,242, -3280,1,44,3138,1, -437,3499,16,0,636, -1,42,3500,16,0, -636,1,525,3145,1, -827,3501,16,0,636, -1,352,3151,1,1413, -3502,16,0,636,1, -1013,3156,1,1012,3503, -16,0,636,1,223, -3504,16,0,636,1, -1159,3505,16,0,636, -1,1011,3164,1,412, -3506,16,0,636,1, -1002,3169,1,1001,3173, -1,1591,3507,16,0, -636,1,1195,3508,16, -0,636,1,40,3179, -1,205,3300,1,50, -3181,1,515,3509,16, -0,636,1,34,3510, -19,618,1,34,3511, -5,84,1,1377,3512, -16,0,616,1,387, -3513,16,0,616,1, -188,3233,1,380,2968, -1,379,2973,1,377, -2978,1,2792,3514,16, -0,616,1,375,2983, -1,373,2987,1,371, -2991,1,172,3238,1, -67,2997,1,1939,3515, -16,0,616,1,1737, -3516,16,0,616,1, -1341,3517,16,0,616, -1,157,3245,1,480, -3006,1,942,3011,1, -49,3016,1,143,3249, -1,1521,3518,16,0, -616,1,1123,3519,16, -0,616,1,82,3023, -1,2299,3520,16,0, -616,1,328,3029,1, -130,3256,1,1114,3034, -1,1701,3521,16,0, -616,1,1303,3522,16, -0,616,1,118,3262, -1,1096,3042,1,1882, -3523,16,0,616,1, -305,3048,1,107,3052, -1,1485,3524,16,0, -616,1,70,3057,1, -1555,3525,16,0,616, -1,883,3526,16,0, -616,1,93,3063,1, -1665,3527,16,0,616, -1,283,3068,1,479, -3072,1,478,3077,1, -477,3081,1,476,3085, -1,74,3089,1,73, -3528,16,0,616,1, -1449,3529,16,0,616, -1,69,3095,1,68, -3099,1,1840,3530,16, -0,616,1,66,3104, -1,262,3108,1,1267, -3531,16,0,616,1, -1048,3113,1,447,3117, -1,1628,3532,16,0, -616,1,51,3123,1, -63,3127,1,1231,3533, -16,0,616,1,48, -3132,1,47,3136,1, -242,3280,1,44,3138, -1,437,3534,16,0, -616,1,42,3535,16, -0,616,1,525,3145, -1,827,3536,16,0, -616,1,352,3151,1, -1413,3537,16,0,616, -1,1013,3156,1,1012, -3538,16,0,616,1, -223,3292,1,1159,3539, -16,0,616,1,1011, -3164,1,412,3540,16, -0,616,1,1002,3169, -1,1001,3173,1,1591, -3541,16,0,616,1, -1195,3542,16,0,616, -1,40,3179,1,205, -3300,1,50,3181,1, -515,3543,16,0,616, -1,33,3544,19,609, -1,33,3545,5,84, -1,1377,3546,16,0, -607,1,387,3547,16, -0,607,1,188,3233, -1,380,2968,1,379, -2973,1,377,2978,1, -2792,3548,16,0,607, -1,375,2983,1,373, -2987,1,371,2991,1, -172,3238,1,67,2997, -1,1939,3549,16,0, -607,1,1737,3550,16, -0,607,1,1341,3551, -16,0,607,1,157, -3245,1,480,3006,1, -942,3011,1,49,3016, -1,143,3249,1,1521, -3552,16,0,607,1, -1123,3553,16,0,607, -1,82,3023,1,2299, -3554,16,0,607,1, -328,3029,1,130,3256, -1,1114,3034,1,1701, -3555,16,0,607,1, -1303,3556,16,0,607, -1,118,3262,1,1096, -3042,1,1882,3557,16, -0,607,1,305,3048, -1,107,3052,1,1485, -3558,16,0,607,1, -70,3057,1,1555,3559, -16,0,607,1,883, -3560,16,0,607,1, -93,3063,1,1665,3561, -16,0,607,1,283, -3068,1,479,3072,1, -478,3077,1,477,3081, -1,476,3085,1,74, -3089,1,73,3562,16, -0,607,1,1449,3563, -16,0,607,1,69, -3095,1,68,3099,1, -1840,3564,16,0,607, -1,66,3104,1,262, -3108,1,1267,3565,16, -0,607,1,1048,3113, -1,447,3117,1,1628, -3566,16,0,607,1, -51,3123,1,63,3127, -1,1231,3567,16,0, -607,1,48,3132,1, -47,3136,1,242,3280, -1,44,3138,1,437, -3568,16,0,607,1, -42,3569,16,0,607, -1,525,3145,1,827, -3570,16,0,607,1, -352,3151,1,1413,3571, -16,0,607,1,1013, -3156,1,1012,3572,16, -0,607,1,223,3573, -16,0,607,1,1159, -3574,16,0,607,1, -1011,3164,1,412,3575, -16,0,607,1,1002, -3169,1,1001,3173,1, -1591,3576,16,0,607, -1,1195,3577,16,0, -607,1,40,3179,1, -205,3578,16,0,607, -1,50,3181,1,515, -3579,16,0,607,1, -32,3580,19,692,1, -32,3581,5,84,1, -1377,3582,16,0,690, -1,387,3583,16,0, -690,1,188,3233,1, -380,2968,1,379,2973, -1,377,2978,1,2792, -3584,16,0,690,1, -375,2983,1,373,2987, -1,371,2991,1,172, -3238,1,67,2997,1, -1939,3585,16,0,690, -1,1737,3586,16,0, -690,1,1341,3587,16, -0,690,1,157,3588, -16,0,690,1,480, -3006,1,942,3011,1, -49,3016,1,143,3589, -16,0,690,1,1521, -3590,16,0,690,1, -1123,3591,16,0,690, -1,82,3023,1,2299, -3592,16,0,690,1, -328,3029,1,130,3256, -1,1114,3034,1,1701, -3593,16,0,690,1, -1303,3594,16,0,690, -1,118,3262,1,1096, -3042,1,1882,3595,16, -0,690,1,305,3048, -1,107,3052,1,1485, -3596,16,0,690,1, -70,3057,1,1555,3597, -16,0,690,1,883, -3598,16,0,690,1, -93,3063,1,1665,3599, -16,0,690,1,283, -3068,1,479,3072,1, -478,3077,1,477,3081, -1,476,3085,1,74, -3089,1,73,3600,16, -0,690,1,1449,3601, -16,0,690,1,69, -3095,1,68,3099,1, -1840,3602,16,0,690, -1,66,3104,1,262, -3108,1,1267,3603,16, -0,690,1,1048,3113, -1,447,3117,1,1628, -3604,16,0,690,1, -51,3123,1,63,3127, -1,1231,3605,16,0, -690,1,48,3132,1, -47,3136,1,242,3606, -16,0,690,1,44, -3138,1,437,3607,16, -0,690,1,42,3608, -16,0,690,1,525, -3145,1,827,3609,16, -0,690,1,352,3151, -1,1413,3610,16,0, -690,1,1013,3156,1, -1012,3611,16,0,690, -1,223,3612,16,0, -690,1,1159,3613,16, -0,690,1,1011,3164, -1,412,3614,16,0, -690,1,1002,3169,1, -1001,3173,1,1591,3615, -16,0,690,1,1195, -3616,16,0,690,1, -40,3179,1,205,3617, -16,0,690,1,50, -3181,1,515,3618,16, -0,690,1,31,3619, -19,686,1,31,3620, -5,84,1,1377,3621, -16,0,684,1,387, -3622,16,0,684,1, -188,3233,1,380,2968, -1,379,2973,1,377, -2978,1,2792,3623,16, -0,684,1,375,2983, -1,373,2987,1,371, -2991,1,172,3238,1, -67,2997,1,1939,3624, -16,0,684,1,1737, -3625,16,0,684,1, -1341,3626,16,0,684, -1,157,3627,16,0, -684,1,480,3006,1, -942,3011,1,49,3016, -1,143,3628,16,0, -684,1,1521,3629,16, -0,684,1,1123,3630, -16,0,684,1,82, -3023,1,2299,3631,16, -0,684,1,328,3029, -1,130,3256,1,1114, -3034,1,1701,3632,16, -0,684,1,1303,3633, -16,0,684,1,118, -3262,1,1096,3042,1, -1882,3634,16,0,684, -1,305,3048,1,107, -3052,1,1485,3635,16, -0,684,1,70,3057, -1,1555,3636,16,0, -684,1,883,3637,16, -0,684,1,93,3063, -1,1665,3638,16,0, -684,1,283,3068,1, -479,3072,1,478,3077, -1,477,3081,1,476, -3085,1,74,3089,1, -73,3639,16,0,684, -1,1449,3640,16,0, -684,1,69,3095,1, -68,3099,1,1840,3641, -16,0,684,1,66, -3104,1,262,3108,1, -1267,3642,16,0,684, -1,1048,3113,1,447, -3117,1,1628,3643,16, -0,684,1,51,3123, -1,63,3127,1,1231, -3644,16,0,684,1, -48,3132,1,47,3136, -1,242,3645,16,0, -684,1,44,3138,1, -437,3646,16,0,684, -1,42,3647,16,0, -684,1,525,3145,1, -827,3648,16,0,684, -1,352,3151,1,1413, -3649,16,0,684,1, -1013,3156,1,1012,3650, -16,0,684,1,223, -3651,16,0,684,1, -1159,3652,16,0,684, -1,1011,3164,1,412, -3653,16,0,684,1, -1002,3169,1,1001,3173, -1,1591,3654,16,0, -684,1,1195,3655,16, -0,684,1,40,3179, -1,205,3656,16,0, -684,1,50,3181,1, -515,3657,16,0,684, -1,30,3658,19,681, -1,30,3659,5,84, -1,1377,3660,16,0, -679,1,387,3661,16, -0,679,1,188,3233, -1,380,2968,1,379, -2973,1,377,2978,1, -2792,3662,16,0,679, -1,375,2983,1,373, -2987,1,371,2991,1, -172,3238,1,67,2997, -1,1939,3663,16,0, -679,1,1737,3664,16, -0,679,1,1341,3665, -16,0,679,1,157, -3245,1,480,3006,1, -942,3011,1,49,3016, -1,143,3249,1,1521, -3666,16,0,679,1, -1123,3667,16,0,679, -1,82,3023,1,2299, -3668,16,0,679,1, -328,3029,1,130,3256, -1,1114,3034,1,1701, -3669,16,0,679,1, -1303,3670,16,0,679, -1,118,3262,1,1096, -3042,1,1882,3671,16, -0,679,1,305,3048, -1,107,3052,1,1485, -3672,16,0,679,1, -70,3057,1,1555,3673, -16,0,679,1,883, -3674,16,0,679,1, -93,3063,1,1665,3675, -16,0,679,1,283, -3068,1,479,3072,1, -478,3077,1,477,3081, -1,476,3085,1,74, -3089,1,73,3676,16, -0,679,1,1449,3677, -16,0,679,1,69, -3095,1,68,3099,1, -1840,3678,16,0,679, -1,66,3104,1,262, -3108,1,1267,3679,16, -0,679,1,1048,3113, -1,447,3117,1,1628, -3680,16,0,679,1, -51,3123,1,63,3127, -1,1231,3681,16,0, -679,1,48,3132,1, -47,3136,1,242,3682, -16,0,679,1,44, -3138,1,437,3683,16, -0,679,1,42,3684, -16,0,679,1,525, -3145,1,827,3685,16, -0,679,1,352,3151, -1,1413,3686,16,0, -679,1,1013,3156,1, -1012,3687,16,0,679, -1,223,3688,16,0, -679,1,1159,3689,16, -0,679,1,1011,3164, -1,412,3690,16,0, -679,1,1002,3169,1, -1001,3173,1,1591,3691, -16,0,679,1,1195, -3692,16,0,679,1, -40,3179,1,205,3693, -16,0,679,1,50, -3181,1,515,3694,16, -0,679,1,29,3695, -19,253,1,29,3696, -5,84,1,1377,3697, -16,0,251,1,387, -3698,16,0,251,1, -188,3233,1,380,2968, -1,379,2973,1,377, -2978,1,2792,3699,16, -0,251,1,375,2983, -1,373,2987,1,371, -2991,1,172,3238,1, -67,2997,1,1939,3700, -16,0,251,1,1737, -3701,16,0,251,1, -1341,3702,16,0,251, -1,157,3245,1,480, -3006,1,942,3011,1, -49,3016,1,143,3249, -1,1521,3703,16,0, -251,1,1123,3704,16, -0,251,1,82,3023, -1,2299,3705,16,0, -251,1,328,3029,1, -130,3256,1,1114,3034, -1,1701,3706,16,0, -251,1,1303,3707,16, -0,251,1,118,3262, -1,1096,3042,1,1882, -3708,16,0,251,1, -305,3048,1,107,3052, -1,1485,3709,16,0, -251,1,70,3057,1, -1555,3710,16,0,251, -1,883,3711,16,0, -251,1,93,3063,1, -1665,3712,16,0,251, -1,283,3068,1,479, -3072,1,478,3077,1, -477,3081,1,476,3085, -1,74,3089,1,73, -3713,16,0,251,1, -1449,3714,16,0,251, -1,69,3095,1,68, -3099,1,1840,3715,16, -0,251,1,66,3104, -1,262,3108,1,1267, -3716,16,0,251,1, -1048,3113,1,447,3117, -1,1628,3717,16,0, -251,1,51,3123,1, -63,3127,1,1231,3718, -16,0,251,1,48, -3132,1,47,3136,1, -242,3719,16,0,251, -1,44,3138,1,437, -3720,16,0,251,1, -42,3721,16,0,251, -1,525,3145,1,827, -3722,16,0,251,1, -352,3151,1,1413,3723, -16,0,251,1,1013, -3156,1,1012,3724,16, -0,251,1,223,3725, -16,0,251,1,1159, -3726,16,0,251,1, -1011,3164,1,412,3727, -16,0,251,1,1002, -3169,1,1001,3173,1, -1591,3728,16,0,251, -1,1195,3729,16,0, -251,1,40,3179,1, -205,3730,16,0,251, -1,50,3181,1,515, -3731,16,0,251,1, -28,3732,19,488,1, -28,3733,5,60,1, -283,3068,1,69,3095, -1,157,3245,1,352, -3151,1,262,3108,1, -172,3238,1,883,3269, -1,525,3145,1,74, -3089,1,68,3099,1, -70,3057,1,1048,3113, -1,464,3734,17,3735, -15,3736,4,26,37, -0,65,0,114,0, -103,0,117,0,109, -0,101,0,110,0, -116,0,76,0,105, -0,115,0,116,0, -1,-1,1,5,3737, -20,969,1,335,1, -3,1,4,1,3, -3738,22,1,171,1, -67,2997,1,66,3104, -1,242,3280,1,63, -3127,1,328,3029,1, -143,3249,1,41,3739, -17,3740,15,3736,1, --1,1,5,132,1, -0,1,0,3741,22, -1,169,1,942,3011, -1,51,3123,1,50, -3181,1,49,3016,1, -48,3132,1,47,3136, -1,1114,3034,1,223, -3292,1,1002,3169,1, -42,3742,17,3743,15, -3744,4,38,37,0, -69,0,120,0,112, -0,114,0,101,0, -115,0,115,0,105, -0,111,0,110,0, -65,0,114,0,103, -0,117,0,109,0, -101,0,110,0,116, -0,1,-1,1,5, -3745,20,963,1,336, -1,3,1,2,1, -1,3746,22,1,172, -1,130,3256,1,40, -3179,1,305,3048,1, -82,3023,1,481,3747, -17,3748,15,3736,1, --1,1,5,3749,20, -971,1,334,1,3, -1,2,1,1,3750, -22,1,170,1,480, -3006,1,479,3072,1, -478,3077,1,477,3081, -1,476,3085,1,118, -3262,1,1096,3042,1, -205,3300,1,827,3286, -1,380,2968,1,379, -2973,1,1001,3173,1, -377,2978,1,375,2983, -1,107,3052,1,373, -2987,1,461,3751,16, -0,486,1,371,2991, -1,459,3752,17,3753, -15,3736,1,-1,1, -5,132,1,0,1, -0,3741,1,188,3233, -1,1011,3164,1,93, -3063,1,1013,3156,1, -447,3117,1,44,3138, -1,27,3754,19,507, -1,27,3755,5,95, -1,1574,1895,1,2035, -1900,1,1371,3756,16, -0,505,1,71,3757, -16,0,505,1,1958, -3758,16,0,505,1, -381,3759,16,0,505, -1,2106,3760,16,0, -505,1,1931,1909,1, -1756,3761,16,0,505, -1,2031,1915,1,509, -3762,16,0,505,1, -2337,3763,16,0,505, -1,2029,1921,1,1153, -3764,16,0,505,1, -2136,1926,1,1933,3765, -16,0,505,1,2198, -3766,16,0,505,1, -1731,3767,16,0,505, -1,1335,3768,16,0, -505,1,2318,3769,16, -0,505,1,346,3770, -16,0,505,1,182, -3771,16,0,505,1, -137,3772,16,0,505, -1,1515,3773,16,0, -505,1,2105,1940,1, -1775,3774,16,0,505, -1,1117,3775,16,0, -505,1,525,3776,16, -0,505,1,52,3777, -16,0,505,1,1901, -3778,16,0,505,1, -2293,3779,16,0,505, -1,322,3780,16,0, -505,1,124,3781,16, -0,505,1,1695,3782, -16,0,505,1,1297, -3783,16,0,505,1, -151,3784,16,0,505, -1,112,3785,16,0, -505,1,1990,3786,16, -0,505,1,76,3787, -16,0,505,1,43, -3788,16,0,505,1, -2075,3789,16,0,505, -1,1876,3790,16,0, -505,1,299,3791,16, -0,505,1,1479,3792, -16,0,505,1,2462, -1963,1,97,3793,16, -0,505,1,2459,1969, -1,2458,1974,1,2030, -1978,1,89,3794,16, -0,505,1,1860,1983, -1,85,3795,16,0, -505,1,1659,3796,16, -0,505,1,1657,1990, -1,277,3797,16,0, -505,1,1261,3798,16, -0,505,1,166,3799, -16,0,505,1,2045, -1997,1,2043,2001,1, -2041,2005,1,2039,2009, -1,462,3800,16,0, -505,1,2037,2014,1, -459,3801,16,0,505, -1,1443,3802,16,0, -505,1,2033,2020,1, -2032,2024,1,1834,3803, -16,0,505,1,2227, -2029,1,256,3804,16, -0,505,1,447,3805, -16,0,505,1,62, -3806,16,0,505,1, -2021,2036,1,2413,3807, -16,0,505,1,1622, -3808,16,0,505,1, -2464,2042,1,1225,3809, -16,0,505,1,41, -3810,16,0,505,1, -236,3811,16,0,505, -1,431,3812,16,0, -505,1,32,3813,16, -0,505,1,1804,3814, -16,0,505,1,1803, -2052,1,1407,3815,16, -0,505,1,79,3816, -16,0,505,1,217, -3817,16,0,505,1, -1989,2060,1,102,3818, -16,0,505,1,2786, -3819,16,0,505,1, -406,3820,16,0,505, -1,1585,3821,16,0, -505,1,1189,3822,16, -0,505,1,1873,2069, -1,199,3823,16,0, -505,1,2364,2074,1, -26,3824,19,461,1, -26,3825,5,84,1, -1377,3826,16,0,667, -1,387,3827,16,0, -667,1,188,3233,1, -380,2968,1,379,2973, -1,377,2978,1,2792, -3828,16,0,667,1, -375,2983,1,373,2987, -1,371,2991,1,172, -3238,1,67,2997,1, -1939,3829,16,0,667, -1,1737,3830,16,0, -667,1,1341,3831,16, -0,667,1,157,3832, -16,0,667,1,480, -3006,1,942,3011,1, -49,3016,1,143,3833, -16,0,667,1,1521, -3834,16,0,667,1, -1123,3835,16,0,667, -1,82,3023,1,2299, -3836,16,0,667,1, -328,3029,1,130,3256, -1,1114,3034,1,1701, -3837,16,0,667,1, -1303,3838,16,0,667, -1,118,3262,1,1096, -3042,1,1882,3839,16, -0,667,1,305,3048, -1,107,3052,1,1485, -3840,16,0,667,1, -70,3057,1,1555,3841, -16,0,667,1,883, -3842,16,0,667,1, -93,3063,1,1665,3843, -16,0,667,1,283, -3068,1,479,3072,1, -478,3077,1,477,3081, -1,476,3085,1,74, -3089,1,73,3844,16, -0,667,1,1449,3845, -16,0,667,1,69, -3095,1,68,3099,1, -1840,3846,16,0,667, -1,66,3104,1,262, -3108,1,1267,3847,16, -0,667,1,1048,3113, -1,447,3117,1,1628, -3848,16,0,667,1, -51,3123,1,63,3127, -1,1231,3849,16,0, -667,1,48,3132,1, -47,3136,1,242,3850, -16,0,667,1,44, -3138,1,437,3851,16, -0,514,1,42,3852, -16,0,667,1,525, -3145,1,827,3853,16, -0,667,1,352,3151, -1,1413,3854,16,0, -667,1,1013,3156,1, -1012,3855,16,0,667, -1,223,3856,16,0, -667,1,1159,3857,16, -0,667,1,1011,3164, -1,412,3858,16,0, -667,1,1002,3169,1, -1001,3173,1,1591,3859, -16,0,667,1,1195, -3860,16,0,667,1, -40,3179,1,205,3861, -16,0,667,1,50, -3181,1,515,3862,16, -0,459,1,25,3863, -19,537,1,25,3864, -5,177,1,42,3865, -16,0,671,1,412, -3866,16,0,671,1, -1701,3867,16,0,671, -1,406,3868,16,0, -535,1,1267,3869,16, -0,671,1,1695,3870, -16,0,535,1,1261, -3871,16,0,535,1, -827,3872,16,0,671, -1,2031,1915,1,387, -3873,16,0,671,1, -2106,3874,16,0,535, -1,2105,1940,1,380, -2968,1,379,2973,1, -377,2978,1,375,2983, -1,2029,1921,1,373, -2987,1,1665,3875,16, -0,671,1,371,2991, -1,1231,3876,16,0, -671,1,1555,3877,16, -0,671,1,1659,3878, -16,0,535,1,1657, -1990,1,1225,3879,16, -0,535,1,1479,3880, -16,0,535,1,352, -3151,1,2075,3881,16, -0,535,1,346,3882, -16,0,535,1,1628, -3883,16,0,671,1, -1195,3884,16,0,671, -1,1622,3885,16,0, -535,1,328,3029,1, -1189,3886,16,0,535, -1,322,3887,16,0, -535,1,2045,1997,1, -2043,2001,1,2041,2005, -1,2039,2009,1,2037, -2014,1,2035,1900,1, -2464,2042,1,2032,2024, -1,2462,1963,1,2030, -1978,1,305,3048,1, -2459,1969,1,2458,1974, -1,299,3888,16,0, -535,1,1591,3889,16, -0,671,1,1159,3890, -16,0,671,1,1585, -3891,16,0,535,1, -1153,3892,16,0,535, -1,2136,1926,1,66, -3104,1,283,3068,1, -1574,1895,1,277,3893, -16,0,535,1,1377, -3894,16,0,671,1, -32,3895,16,0,535, -1,49,3016,1,1990, -3896,16,0,535,1, -1989,2060,1,262,3108, -1,1123,3897,16,0, -671,1,2413,3898,16, -0,535,1,256,3899, -16,0,535,1,1117, -3900,16,0,535,1, -1114,3034,1,242,3901, -16,0,671,1,1933, -3902,16,0,535,1, -236,3903,16,0,535, -1,1096,3042,1,1521, -3904,16,0,671,1, -223,3905,16,0,671, -1,1515,3906,16,0, -535,1,217,3907,16, -0,535,1,1939,3908, -16,0,671,1,70, -3057,1,2364,2074,1, -1931,1909,1,2792,3909, -16,0,671,1,205, -3910,16,0,671,1, -2786,3911,16,0,535, -1,199,3912,16,0, -535,1,942,3011,1, -1485,3913,16,0,671, -1,188,3233,1,1048, -3113,1,182,3914,16, -0,535,1,1901,3915, -16,0,535,1,172, -3238,1,2021,2036,1, -48,3132,1,166,3916, -16,0,535,1,2318, -3917,16,0,535,1, -381,3918,16,0,535, -1,1882,3919,16,0, -671,1,157,3920,16, -0,671,1,1449,3921, -16,0,671,1,1876, -3922,16,0,535,1, -151,3923,16,0,535, -1,1012,3924,16,0, -671,1,2337,3925,16, -0,535,1,2299,3926, -16,0,671,1,143, -3927,16,0,671,1, -1002,3169,1,1001,3173, -1,2293,3928,16,0, -535,1,137,3929,16, -0,535,1,1860,1983, -1,130,3256,1,79, -3930,16,0,535,1, -124,3931,16,0,535, -1,1443,3932,16,0, -535,1,1011,3164,1, -1413,3933,16,0,671, -1,118,3262,1,1840, -3934,16,0,671,1, -1407,3935,16,0,535, -1,112,3936,16,0, -535,1,1834,3937,16, -0,535,1,1958,3938, -16,0,535,1,107, -3052,1,2033,2020,1, -97,3939,16,0,535, -1,1873,2069,1,525, -3940,16,0,535,1, -93,3063,1,1371,3941, -16,0,535,1,89, -3942,16,0,535,1, -43,3943,16,0,535, -1,85,3944,16,0, -535,1,515,3945,16, -0,671,1,82,3023, -1,1804,3946,16,0, -535,1,1803,2052,1, -509,3947,16,0,535, -1,76,3948,16,0, -535,1,74,3089,1, -73,3949,16,0,671, -1,2227,2029,1,71, -3950,16,0,535,1, -1013,3156,1,69,3095, -1,68,3099,1,67, -2997,1,102,3951,16, -0,535,1,47,3136, -1,63,3127,1,62, -3952,16,0,535,1, -52,3953,16,0,535, -1,1775,3954,16,0, -535,1,50,3181,1, -480,3006,1,479,3072, -1,478,3077,1,477, -3081,1,476,3085,1, -44,3138,1,2198,3955, -16,0,535,1,1335, -3956,16,0,535,1, -41,3957,16,0,535, -1,40,3179,1,1341, -3958,16,0,671,1, -51,3123,1,1756,3959, -16,0,535,1,462, -3960,16,0,535,1, -459,3961,16,0,535, -1,883,3962,16,0, -671,1,447,3963,16, -0,535,1,1737,3964, -16,0,671,1,1303, -3965,16,0,671,1, -1731,3966,16,0,535, -1,437,3967,16,0, -671,1,1297,3968,16, -0,535,1,431,3969, -16,0,535,1,24, -3970,19,435,1,24, -3971,5,5,1,377, -3972,16,0,455,1, -44,3973,16,0,753, -1,373,3974,16,0, -548,1,40,3975,16, -0,433,1,63,3976, -16,0,740,1,23, -3977,19,658,1,23, -3978,5,38,1,2045, -1997,1,2043,2001,1, -1775,3979,16,0,656, -1,2041,2005,1,2039, -2009,1,1860,1983,1, -2037,2014,1,2035,1900, -1,2033,2020,1,2032, -2024,1,2031,1915,1, -2030,1978,1,2029,1921, -1,2106,3980,16,0, -656,1,2464,2042,1, -1931,1909,1,1574,1895, -1,2462,1963,1,2105, -1940,1,2459,1969,1, -2458,1974,1,2364,2074, -1,1958,3981,16,0, -656,1,2198,3982,16, -0,656,1,2021,2036, -1,1901,3983,16,0, -656,1,1989,2060,1, -1803,2052,1,2075,3984, -16,0,656,1,1990, -3985,16,0,656,1, -1804,3986,16,0,656, -1,2337,3987,16,0, -656,1,1657,1990,1, -2413,3988,16,0,656, -1,32,3989,16,0, -656,1,1873,2069,1, -2227,2029,1,2136,1926, -1,22,3990,19,603, -1,22,3991,5,84, -1,1377,3992,16,0, -601,1,387,3993,16, -0,601,1,188,3994, -16,0,601,1,380, -2968,1,379,2973,1, -377,2978,1,2792,3995, -16,0,601,1,375, -2983,1,373,2987,1, -371,2991,1,172,3996, -16,0,601,1,67, -2997,1,1939,3997,16, -0,601,1,1737,3998, -16,0,601,1,1341, -3999,16,0,601,1, -157,4000,16,0,601, -1,480,3006,1,942, -4001,16,0,601,1, -49,3016,1,143,4002, -16,0,601,1,1521, -4003,16,0,601,1, -1123,4004,16,0,601, -1,82,3023,1,2299, -4005,16,0,601,1, -328,4006,16,0,601, -1,130,4007,16,0, -601,1,1114,3034,1, -1701,4008,16,0,601, -1,1303,4009,16,0, -601,1,118,4010,16, -0,601,1,1096,3042, -1,1882,4011,16,0, -601,1,305,3048,1, -107,3052,1,1485,4012, -16,0,601,1,70, -3057,1,1555,4013,16, -0,601,1,883,4014, -16,0,601,1,93, -3063,1,1665,4015,16, -0,601,1,283,3068, -1,479,3072,1,478, -3077,1,477,3081,1, -476,3085,1,74,3089, -1,73,4016,16,0, -601,1,1449,4017,16, -0,601,1,69,3095, -1,68,3099,1,1840, -4018,16,0,601,1, -66,3104,1,262,3108, -1,1267,4019,16,0, -601,1,1048,4020,16, -0,601,1,447,3117, -1,1628,4021,16,0, -601,1,51,3123,1, -63,3127,1,1231,4022, -16,0,601,1,48, -3132,1,47,3136,1, -242,4023,16,0,601, -1,44,3138,1,437, -4024,16,0,601,1, -42,4025,16,0,601, -1,525,3145,1,827, -4026,16,0,601,1, -352,4027,16,0,601, -1,1413,4028,16,0, -601,1,1013,3156,1, -1012,4029,16,0,601, -1,223,4030,16,0, -601,1,1159,4031,16, -0,601,1,1011,3164, -1,412,4032,16,0, -601,1,1002,3169,1, -1001,3173,1,1591,4033, -16,0,601,1,1195, -4034,16,0,601,1, -40,3179,1,205,4035, -16,0,601,1,50, -3181,1,515,4036,16, -0,601,1,21,4037, -19,588,1,21,4038, -5,84,1,1377,4039, -16,0,586,1,387, -4040,16,0,586,1, -188,4041,16,0,586, -1,380,2968,1,379, -2973,1,377,2978,1, -2792,4042,16,0,586, -1,375,2983,1,373, -2987,1,371,2991,1, -172,4043,16,0,586, -1,67,2997,1,1939, -4044,16,0,586,1, -1737,4045,16,0,586, -1,1341,4046,16,0, -586,1,157,4047,16, -0,586,1,480,3006, -1,942,4048,16,0, -586,1,49,3016,1, -143,4049,16,0,586, -1,1521,4050,16,0, -586,1,1123,4051,16, -0,586,1,82,3023, -1,2299,4052,16,0, -586,1,328,4053,16, -0,586,1,130,4054, -16,0,586,1,1114, -3034,1,1701,4055,16, -0,586,1,1303,4056, -16,0,586,1,118, -4057,16,0,586,1, -1096,3042,1,1882,4058, -16,0,586,1,305, -3048,1,107,3052,1, -1485,4059,16,0,586, -1,70,3057,1,1555, -4060,16,0,586,1, -883,4061,16,0,586, -1,93,3063,1,1665, -4062,16,0,586,1, -283,3068,1,479,3072, -1,478,3077,1,477, -3081,1,476,3085,1, -74,3089,1,73,4063, -16,0,586,1,1449, -4064,16,0,586,1, -69,3095,1,68,3099, -1,1840,4065,16,0, -586,1,66,3104,1, -262,3108,1,1267,4066, -16,0,586,1,1048, -4067,16,0,586,1, -447,3117,1,1628,4068, -16,0,586,1,51, -3123,1,63,3127,1, -1231,4069,16,0,586, -1,48,3132,1,47, -3136,1,242,4070,16, -0,586,1,44,3138, -1,437,4071,16,0, -586,1,42,4072,16, -0,586,1,525,3145, -1,827,4073,16,0, -586,1,352,4074,16, -0,586,1,1413,4075, -16,0,586,1,1013, -3156,1,1012,4076,16, -0,586,1,223,4077, -16,0,586,1,1159, -4078,16,0,586,1, -1011,3164,1,412,4079, -16,0,586,1,1002, -3169,1,1001,3173,1, -1591,4080,16,0,586, -1,1195,4081,16,0, -586,1,40,3179,1, -205,4082,16,0,586, -1,50,3181,1,515, -4083,16,0,586,1, -20,4084,19,580,1, -20,4085,5,84,1, -1377,4086,16,0,578, -1,387,4087,16,0, -578,1,188,4088,16, -0,578,1,380,2968, -1,379,2973,1,377, -2978,1,2792,4089,16, -0,578,1,375,2983, -1,373,2987,1,371, -2991,1,172,4090,16, -0,578,1,67,2997, -1,1939,4091,16,0, -578,1,1737,4092,16, -0,578,1,1341,4093, -16,0,578,1,157, -4094,16,0,578,1, -480,3006,1,942,4095, -16,0,578,1,49, -3016,1,143,4096,16, -0,578,1,1521,4097, -16,0,578,1,1123, -4098,16,0,578,1, -82,3023,1,2299,4099, -16,0,578,1,328, -4100,16,0,578,1, -130,4101,16,0,578, -1,1114,3034,1,1701, -4102,16,0,578,1, -1303,4103,16,0,578, -1,118,4104,16,0, -578,1,1096,3042,1, -1882,4105,16,0,578, -1,305,3048,1,107, -3052,1,1485,4106,16, -0,578,1,70,3057, -1,1555,4107,16,0, -578,1,883,4108,16, -0,578,1,93,3063, -1,1665,4109,16,0, -578,1,283,3068,1, -479,3072,1,478,3077, -1,477,3081,1,476, -3085,1,74,3089,1, -73,4110,16,0,578, -1,1449,4111,16,0, -578,1,69,3095,1, -68,3099,1,1840,4112, -16,0,578,1,66, -3104,1,262,3108,1, -1267,4113,16,0,578, -1,1048,4114,16,0, -578,1,447,3117,1, -1628,4115,16,0,578, -1,51,3123,1,63, -3127,1,1231,4116,16, -0,578,1,48,3132, -1,47,3136,1,242, -4117,16,0,578,1, -44,3138,1,437,4118, -16,0,578,1,42, -4119,16,0,578,1, -525,3145,1,827,4120, -16,0,578,1,352, -4121,16,0,578,1, -1413,4122,16,0,578, -1,1013,3156,1,1012, -4123,16,0,578,1, -223,4124,16,0,578, -1,1159,4125,16,0, -578,1,1011,3164,1, -412,4126,16,0,578, -1,1002,3169,1,1001, -3173,1,1591,4127,16, -0,578,1,1195,4128, -16,0,578,1,40, -3179,1,205,4129,16, -0,578,1,50,3181, -1,515,4130,16,0, -578,1,19,4131,19, -569,1,19,4132,5, -176,1,42,4133,16, -0,567,1,412,4134, -16,0,567,1,1701, -4135,16,0,567,1, -406,4136,16,0,709, -1,1267,4137,16,0, -567,1,1695,4138,16, -0,709,1,1261,4139, -16,0,709,1,827, -4140,16,0,567,1, -2031,1915,1,387,4141, -16,0,567,1,2106, -4142,16,0,709,1, -2105,1940,1,380,2968, -1,379,2973,1,377, -2978,1,375,2983,1, -2029,1921,1,373,2987, -1,1665,4143,16,0, -567,1,371,2991,1, -1231,4144,16,0,567, -1,1555,4145,16,0, -567,1,1659,4146,16, -0,709,1,1657,1990, -1,1225,4147,16,0, -709,1,1479,4148,16, -0,709,1,352,3151, -1,2075,4149,16,0, -709,1,346,4150,16, -0,709,1,1628,4151, -16,0,567,1,1195, -4152,16,0,567,1, -1622,4153,16,0,709, -1,328,3029,1,1189, -4154,16,0,709,1, -322,4155,16,0,709, -1,2045,1997,1,2043, -2001,1,2041,2005,1, -2039,2009,1,2037,2014, -1,2035,1900,1,2464, -2042,1,2032,2024,1, -2462,1963,1,2030,1978, -1,305,3048,1,2459, -1969,1,2458,1974,1, -299,4156,16,0,709, -1,1591,4157,16,0, -567,1,1159,4158,16, -0,567,1,1585,4159, -16,0,709,1,1153, -4160,16,0,709,1, -2136,1926,1,66,3104, -1,283,3068,1,1574, -1895,1,277,4161,16, -0,709,1,1377,4162, -16,0,567,1,32, -4163,16,0,709,1, -49,3016,1,1990,4164, -16,0,709,1,1989, -2060,1,262,3108,1, -1123,4165,16,0,567, -1,2413,4166,16,0, -709,1,256,4167,16, -0,709,1,1117,4168, -16,0,709,1,1114, -3034,1,242,4169,16, -0,567,1,1933,4170, -16,0,709,1,236, -4171,16,0,709,1, -1096,3042,1,1521,4172, -16,0,567,1,223, -4173,16,0,567,1, -1515,4174,16,0,709, -1,217,4175,16,0, -709,1,1939,4176,16, -0,567,1,70,3057, -1,2364,2074,1,1931, -1909,1,2792,4177,16, -0,567,1,205,4178, -16,0,567,1,2786, -4179,16,0,709,1, -199,4180,16,0,709, -1,942,4181,16,0, -567,1,1485,4182,16, -0,567,1,188,4183, -16,0,567,1,1048, -4184,16,0,567,1, -182,4185,16,0,709, -1,1901,4186,16,0, -709,1,172,4187,16, -0,567,1,2021,2036, -1,48,3132,1,166, -4188,16,0,709,1, -2318,4189,16,0,709, -1,381,4190,16,0, -709,1,1882,4191,16, -0,567,1,157,4192, -16,0,567,1,1449, -4193,16,0,567,1, -1876,4194,16,0,709, -1,151,4195,16,0, -709,1,1012,4196,16, -0,567,1,2337,4197, -16,0,709,1,2299, -4198,16,0,567,1, -143,4199,16,0,567, -1,1002,3169,1,1001, -3173,1,2293,4200,16, -0,709,1,137,4201, -16,0,709,1,1860, -1983,1,130,4202,16, -0,567,1,79,4203, -16,0,709,1,124, -4204,16,0,709,1, -1443,4205,16,0,709, -1,1011,3164,1,1413, -4206,16,0,567,1, -118,4207,16,0,567, -1,1840,4208,16,0, -567,1,1407,4209,16, -0,709,1,112,4210, -16,0,709,1,1834, -4211,16,0,709,1, -1958,4212,16,0,709, -1,107,3052,1,2033, -2020,1,97,4213,16, -0,709,1,1873,2069, -1,525,4214,16,0, -709,1,93,3063,1, -1371,4215,16,0,709, -1,89,4216,16,0, -709,1,43,4217,16, -0,709,1,85,4218, -16,0,709,1,515, -4219,16,0,567,1, -82,3023,1,1804,4220, -16,0,709,1,1803, -2052,1,509,4221,16, -0,709,1,76,4222, -16,0,709,1,74, -3089,1,73,4223,16, -0,567,1,2227,2029, -1,71,4224,16,0, -709,1,1013,3156,1, -69,3095,1,68,3099, -1,67,2997,1,102, -4225,16,0,709,1, -47,3136,1,63,3127, -1,52,4226,16,0, -709,1,1775,4227,16, -0,709,1,50,3181, -1,480,3006,1,479, -3072,1,478,3077,1, -477,3081,1,476,3085, -1,44,3138,1,2198, -4228,16,0,709,1, -1335,4229,16,0,709, -1,41,4230,16,0, -709,1,40,3179,1, -1341,4231,16,0,567, -1,51,3123,1,1756, -4232,16,0,709,1, -462,4233,16,0,709, -1,459,4234,16,0, -709,1,883,4235,16, -0,567,1,447,4236, -16,0,709,1,1737, -4237,16,0,567,1, -1303,4238,16,0,567, -1,1731,4239,16,0, -709,1,437,4240,16, -0,567,1,1297,4241, -16,0,709,1,431, -4242,16,0,709,1, -18,4243,19,563,1, -18,4244,5,84,1, -1377,4245,16,0,561, -1,387,4246,16,0, -561,1,188,4247,16, -0,561,1,380,2968, -1,379,2973,1,377, -2978,1,2792,4248,16, -0,561,1,375,2983, -1,373,2987,1,371, -2991,1,172,4249,16, -0,561,1,67,2997, -1,1939,4250,16,0, -561,1,1737,4251,16, -0,561,1,1341,4252, -16,0,561,1,157, -4253,16,0,561,1, -480,3006,1,942,4254, -16,0,561,1,49, -3016,1,143,4255,16, -0,561,1,1521,4256, -16,0,561,1,1123, -4257,16,0,561,1, -82,3023,1,2299,4258, -16,0,561,1,328, -3029,1,130,4259,16, -0,561,1,1114,3034, -1,1701,4260,16,0, -561,1,1303,4261,16, -0,561,1,118,4262, -16,0,561,1,1096, -3042,1,1882,4263,16, -0,561,1,305,3048, -1,107,3052,1,1485, -4264,16,0,561,1, -70,3057,1,1555,4265, -16,0,561,1,883, -4266,16,0,561,1, -93,3063,1,1665,4267, -16,0,561,1,283, -3068,1,479,3072,1, -478,3077,1,477,3081, -1,476,3085,1,74, -3089,1,73,4268,16, -0,561,1,1449,4269, -16,0,561,1,69, -3095,1,68,3099,1, -1840,4270,16,0,561, -1,66,3104,1,262, -3108,1,1267,4271,16, -0,561,1,1048,4272, -16,0,561,1,447, -3117,1,1628,4273,16, -0,561,1,51,3123, -1,63,3127,1,1231, -4274,16,0,561,1, -48,3132,1,47,3136, -1,242,4275,16,0, -561,1,44,3138,1, -437,4276,16,0,561, -1,42,4277,16,0, -561,1,525,3145,1, -827,4278,16,0,561, -1,352,3151,1,1413, -4279,16,0,561,1, -1013,3156,1,1012,4280, -16,0,561,1,223, -4281,16,0,561,1, -1159,4282,16,0,561, -1,1011,3164,1,412, -4283,16,0,561,1, -1002,3169,1,1001,3173, -1,1591,4284,16,0, -561,1,1195,4285,16, -0,561,1,40,3179, -1,205,4286,16,0, -561,1,50,3181,1, -515,4287,16,0,561, -1,17,4288,19,139, -1,17,4289,5,134, -1,2281,4290,17,4291, -15,4292,4,34,37, -0,70,0,111,0, -114,0,76,0,111, -0,111,0,112,0, -83,0,116,0,97, -0,116,0,101,0, -109,0,101,0,110, -0,116,0,1,-1, -1,5,4293,20,1403, -1,251,1,3,1, -2,1,1,4294,22, -1,86,1,1377,4295, -17,4296,15,4297,4, -34,37,0,83,0, -105,0,109,0,112, -0,108,0,101,0, -65,0,115,0,115, -0,105,0,103,0, -110,0,109,0,101, -0,110,0,116,0, -1,-1,1,5,4298, -20,1369,1,260,1, -3,1,4,1,3, -4299,22,1,95,1, -67,2997,1,2556,4300, -16,0,243,1,2555, -4301,17,4302,15,4303, -4,60,37,0,86, -0,101,0,99,0, -116,0,111,0,114, -0,65,0,114,0, -103,0,117,0,109, -0,101,0,110,0, -116,0,68,0,101, -0,99,0,108,0, -97,0,114,0,97, -0,116,0,105,0, -111,0,110,0,76, -0,105,0,115,0, -116,0,1,-1,1, -5,4304,20,1659,1, -209,1,3,1,2, -1,1,4305,22,1, -44,1,1370,4306,17, -4307,15,4297,1,-1, -1,5,4308,20,1343, -1,273,1,3,1, -4,1,3,4309,22, -1,108,1,2548,4310, -16,0,257,1,380, -2968,1,379,2973,1, -377,2978,1,2543,4311, -17,4312,15,4313,4, -30,37,0,82,0, -111,0,116,0,68, -0,101,0,99,0, -108,0,97,0,114, -0,97,0,116,0, -105,0,111,0,110, -0,1,-1,1,5, -4314,20,1603,1,217, -1,3,1,3,1, -2,4315,22,1,52, -1,2547,4316,17,4317, -15,4318,4,66,37, -0,73,0,110,0, -116,0,82,0,111, -0,116,0,82,0, -111,0,116,0,65, -0,114,0,103,0, -117,0,109,0,101, -0,110,0,116,0, -68,0,101,0,99, -0,108,0,97,0, -114,0,97,0,116, -0,105,0,111,0, -110,0,76,0,105, -0,115,0,116,0, -1,-1,1,5,4319, -20,1655,1,210,1, -3,1,6,1,5, -4320,22,1,45,1, -373,2987,1,371,2991, -1,172,3238,1,1550, -4321,17,4322,15,4297, -1,-1,1,5,4323, -20,1353,1,268,1, -3,1,4,1,3, -4324,22,1,103,1, -2533,4325,16,0,282, -1,2335,4326,16,0, -475,1,1152,4327,17, -4328,15,4297,1,-1, -1,5,4329,20,1299, -1,279,1,3,1, -6,1,5,4330,22, -1,114,1,1939,4331, -16,0,688,1,2528, -4332,17,4333,15,4334, -4,30,37,0,86, -0,101,0,99,0, -68,0,101,0,99, -0,108,0,97,0, -114,0,97,0,116, -0,105,0,111,0, -110,0,1,-1,1, -5,4335,20,1608,1, -216,1,3,1,3, -1,2,4336,22,1, -51,1,1341,4337,17, -4338,15,4297,1,-1, -1,5,4339,20,1367, -1,261,1,3,1, -4,1,3,4340,22, -1,96,1,157,3245, -1,42,3742,1,352, -3151,1,2518,4341,16, -0,300,1,2517,4342, -17,4343,15,4344,4, -66,37,0,75,0, -101,0,121,0,73, -0,110,0,116,0, -73,0,110,0,116, -0,65,0,114,0, -103,0,117,0,109, -0,101,0,110,0, -116,0,68,0,101, -0,99,0,108,0, -97,0,114,0,97, -0,116,0,105,0, -111,0,110,0,76, -0,105,0,115,0, -116,0,1,-1,1, -5,4345,20,1647,1, -212,1,3,1,6, -1,5,4346,22,1, -47,1,1332,4347,17, -4348,15,4297,1,-1, -1,5,4349,20,1341, -1,274,1,3,1, -6,1,5,4350,22, -1,109,1,2513,4351, -17,4352,15,4353,4, -30,37,0,73,0, -110,0,116,0,68, -0,101,0,99,0, -108,0,97,0,114, -0,97,0,116,0, -105,0,111,0,110, -0,1,-1,1,5, -4354,20,1614,1,215, -1,3,1,3,1, -2,4355,22,1,50, -1,2509,4356,17,4357, -15,4358,4,30,37, -0,75,0,101,0, -121,0,68,0,101, -0,99,0,108,0, -97,0,114,0,97, -0,116,0,105,0, -111,0,110,0,1, --1,1,5,4359,20, -1622,1,214,1,3, -1,3,1,2,4360, -22,1,49,1,1001, -3173,1,1521,4361,17, -4362,15,4297,1,-1, -1,5,4363,20,1377, -1,256,1,3,1, -4,1,3,4364,22, -1,91,1,188,3233, -1,1123,4365,17,4366, -15,4297,1,-1,1, -5,4367,20,1355,1, -267,1,3,1,6, -1,5,4368,22,1, -102,1,328,3029,1, -1514,4369,17,4370,15, -4297,1,-1,1,5, -4371,20,1351,1,269, -1,3,1,4,1, -3,4372,22,1,104, -1,10,4373,17,4374, -15,4375,4,48,37, -0,65,0,114,0, -103,0,117,0,109, -0,101,0,110,0, -116,0,68,0,101, -0,99,0,108,0, -97,0,114,0,97, -0,116,0,105,0, -111,0,110,0,76, -0,105,0,115,0, -116,0,1,-1,1, -5,205,1,0,1, -0,4376,22,1,39, -1,82,3023,1,525, -3145,1,130,3256,1, -1114,3034,1,7,2314, -1,1701,4377,17,4378, -15,4292,1,-1,1, -5,4379,20,1401,1, -252,1,3,1,4, -1,3,4380,22,1, -87,1,1012,4381,16, -0,705,1,942,3011, -1,1303,4382,17,4383, -15,4297,1,-1,1, -5,4384,20,1365,1, -262,1,3,1,6, -1,5,4385,22,1, -97,1,2532,4386,17, -4387,15,4388,4,66, -37,0,73,0,110, -0,116,0,86,0, -101,0,99,0,86, -0,101,0,99,0, -65,0,114,0,103, -0,117,0,109,0, -101,0,110,0,116, -0,68,0,101,0, -99,0,108,0,97, -0,114,0,97,0, -116,0,105,0,111, -0,110,0,76,0, -105,0,115,0,116, -0,1,-1,1,5, -4389,20,1651,1,211, -1,3,1,6,1, -5,4390,22,1,46, -1,118,3262,1,1010, -4391,16,0,707,1, -1296,4392,17,4393,15, -4297,1,-1,1,5, -4394,20,1339,1,275, -1,3,1,6,1, -5,4395,22,1,110, -1,68,3099,1,1096, -3042,1,1,2367,1, -1094,4396,16,0,668, -1,305,3048,1,107, -3052,1,1485,4397,17, -4398,15,4297,1,-1, -1,5,4399,20,1375, -1,257,1,3,1, -4,1,3,4400,22, -1,92,1,2074,4401, -16,0,606,1,2467, -4402,17,4403,15,4375, -1,-1,1,5,4404, -20,1673,1,205,1, -3,1,2,1,1, -4405,22,1,40,1, -49,3016,1,6,2350, -1,70,3057,1,1478, -4406,17,4407,15,4297, -1,-1,1,5,4408, -20,1349,1,270,1, -3,1,4,1,3, -4409,22,1,105,1, -1871,4410,16,0,765, -1,143,3249,1,883, -3269,1,93,3063,1, -1665,4411,17,4412,15, -4292,1,-1,1,5, -4413,20,1405,1,250, -1,3,1,2,1, -1,4414,22,1,85, -1,481,3747,1,480, -3006,1,479,3072,1, -478,3077,1,477,3081, -1,476,3085,1,20, -4415,16,0,768,1, -1260,4416,17,4417,15, -4297,1,-1,1,5, -4418,20,1337,1,276, -1,3,1,6,1, -5,4419,22,1,111, -1,375,2983,1,74, -3089,1,73,4420,16, -0,731,1,1048,3113, -1,1882,4421,16,0, -628,1,464,3734,1, -69,3095,1,262,3108, -1,1840,4422,16,0, -723,1,66,3104,1, -459,3752,1,1267,4423, -17,4424,15,4297,1, --1,1,5,4425,20, -1363,1,263,1,3, -1,6,1,5,4426, -22,1,98,1,1442, -4427,17,4428,15,4297, -1,-1,1,5,4429, -20,1347,1,271,1, -3,1,4,1,3, -4430,22,1,106,1, -61,4431,16,0,742, -1,2197,4432,16,0, -557,1,447,3117,1, -1730,4433,17,4434,15, -4292,1,-1,1,5, -4435,20,1395,1,253, -1,3,1,4,1, -3,4436,22,1,88, -1,51,3123,1,63, -3127,1,1231,4437,17, -4438,15,4297,1,-1, -1,5,4439,20,1361, -1,264,1,3,1, -6,1,5,4440,22, -1,99,1,48,3132, -1,47,3136,1,242, -3280,1,44,3138,1, -4,2358,1,1224,4441, -17,4442,15,4297,1, --1,1,5,4443,20, -1335,1,277,1,3, -1,6,1,5,4444, -22,1,112,1,41, -3739,1,40,3179,1, -827,3286,1,1413,4445, -17,4446,15,4297,1, --1,1,5,4447,20, -1371,1,259,1,3, -1,4,1,3,4448, -22,1,94,1,2591, -4449,16,0,203,1, -2779,4450,16,0,773, -1,1013,3156,1,1406, -4451,17,4452,15,4297, -1,-1,1,5,4453, -20,1345,1,272,1, -3,1,4,1,3, -4454,22,1,107,1, -223,3292,1,1159,4455, -17,4456,15,4297,1, --1,1,5,4457,20, -1357,1,266,1,3, -1,6,1,5,4458, -22,1,101,1,2, -2336,1,3,2362,1, -2582,4459,17,4460,15, -4375,1,-1,1,5, -205,1,0,1,0, -4376,1,283,3068,1, -19,4461,17,4462,15, -4463,4,24,37,0, -68,0,101,0,99, -0,108,0,97,0, -114,0,97,0,116, -0,105,0,111,0, -110,0,1,-1,1, -5,4464,20,1627,1, -213,1,3,1,3, -1,2,4465,22,1, -48,1,1002,3169,1, -2577,4466,16,0,733, -1,30,4467,17,4468, -15,4375,1,-1,1, -5,4469,20,1671,1, -206,1,3,1,4, -1,3,4470,22,1, -41,1,1195,4471,17, -4472,15,4297,1,-1, -1,5,4473,20,1359, -1,265,1,3,1, -6,1,5,4474,22, -1,100,1,2770,4475, -17,4476,15,4375,1, --1,1,5,205,1, -0,1,0,4376,1, -2572,4477,16,0,219, -1,2571,4478,17,4479, -15,4480,4,54,37, -0,75,0,101,0, -121,0,65,0,114, -0,103,0,117,0, -109,0,101,0,110, -0,116,0,68,0, -101,0,99,0,108, -0,97,0,114,0, -97,0,116,0,105, -0,111,0,110,0, -76,0,105,0,115, -0,116,0,1,-1, -1,5,4481,20,1667, -1,207,1,3,1, -2,1,1,4482,22, -1,42,1,9,4483, -17,4462,1,2,4465, -1,205,3300,1,1449, -4484,17,4485,15,4297, -1,-1,1,5,4486, -20,1373,1,258,1, -3,1,4,1,3, -4487,22,1,93,1, -1188,4488,17,4489,15, -4297,1,-1,1,5, -4490,20,1333,1,278, -1,3,1,6,1, -5,4491,22,1,113, -1,5,2354,1,50, -3181,1,2564,4492,16, -0,231,1,2563,4493, -17,4494,15,4495,4, -54,37,0,73,0, -110,0,116,0,65, -0,114,0,103,0, -117,0,109,0,101, -0,110,0,116,0, -68,0,101,0,99, -0,108,0,97,0, -114,0,97,0,116, -0,105,0,111,0, -110,0,76,0,105, -0,115,0,116,0, -1,-1,1,5,4496, -20,1663,1,208,1, -3,1,2,1,1, -4497,22,1,43,1, -1011,3164,1,1773,4498, -16,0,137,1,16, -4499,19,117,1,16, -4500,5,147,1,2581, -4501,16,0,208,1, -2576,4502,16,0,195, -1,2568,4503,16,0, -226,1,2136,1926,1, -2474,4504,17,4505,15, -4506,4,30,37,0, -86,0,101,0,99, -0,116,0,111,0, -114,0,65,0,114, -0,103,0,69,0, -118,0,101,0,110, -0,116,0,1,-1, -1,5,4507,20,841, -1,375,1,3,1, -2,1,1,4508,22, -1,211,1,406,4509, -16,0,747,1,2560, -4510,16,0,238,1, -1695,4511,16,0,747, -1,1261,4512,16,0, -747,1,2552,4513,16, -0,439,1,2476,4514, -17,4515,15,4506,1, --1,1,5,4516,20, -850,1,373,1,3, -1,2,1,1,4517, -22,1,209,1,2537, -4518,16,0,277,1, -2105,1940,1,381,4519, -16,0,747,1,2031, -1915,1,2522,4520,16, -0,295,1,1659,4521, -16,0,747,1,1658, -4522,16,0,213,1, -1657,1990,1,1225,4523, -16,0,747,1,151, -4524,16,0,747,1, -2075,4525,16,0,747, -1,2505,4526,17,4527, -15,4528,4,12,37, -0,69,0,118,0, -101,0,110,0,116, -0,1,-1,1,5, -4529,20,928,1,344, -1,3,1,2,1, -1,4530,22,1,180, -1,2504,4531,17,4532, -15,4528,1,-1,1, -5,4533,20,926,1, -345,1,3,1,2, -1,1,4534,22,1, -181,1,2503,4535,17, -4536,15,4528,1,-1, -1,5,4537,20,924, -1,346,1,3,1, -2,1,1,4538,22, -1,182,1,2502,4539, -17,4540,15,4528,1, --1,1,5,4541,20, -922,1,347,1,3, -1,2,1,1,4542, -22,1,183,1,2501, -4543,17,4544,15,4528, -1,-1,1,5,4545, -20,920,1,348,1, -3,1,2,1,1, -4546,22,1,184,1, -2500,4547,17,4548,15, -4528,1,-1,1,5, -4549,20,918,1,349, -1,3,1,2,1, -1,4550,22,1,185, -1,2499,4551,17,4552, -15,4528,1,-1,1, -5,4553,20,916,1, -350,1,3,1,2, -1,1,4554,22,1, -186,1,2498,4555,17, -4556,15,4528,1,-1, -1,5,4557,20,914, -1,351,1,3,1, -2,1,1,4558,22, -1,187,1,2497,4559, -17,4560,15,4528,1, --1,1,5,4561,20, -907,1,352,1,3, -1,2,1,1,4562, -22,1,188,1,2496, -4563,17,4564,15,4565, -4,26,37,0,86, -0,111,0,105,0, -100,0,65,0,114, -0,103,0,69,0, -118,0,101,0,110, -0,116,0,1,-1, -1,5,4566,20,905, -1,353,1,3,1, -2,1,1,4567,22, -1,189,1,2495,4568, -17,4569,15,4565,1, --1,1,5,4570,20, -903,1,354,1,3, -1,2,1,1,4571, -22,1,190,1,2494, -4572,17,4573,15,4565, -1,-1,1,5,4574, -20,901,1,355,1, -3,1,2,1,1, -4575,22,1,191,1, -2493,4576,17,4577,15, -4565,1,-1,1,5, -4578,20,899,1,356, -1,3,1,2,1, -1,4579,22,1,192, -1,2492,4580,17,4581, -15,4565,1,-1,1, -5,4582,20,897,1, -357,1,3,1,2, -1,1,4583,22,1, -193,1,2491,4584,17, -4585,15,4565,1,-1, -1,5,4586,20,895, -1,358,1,3,1, -2,1,1,4587,22, -1,194,1,2490,4588, -17,4589,15,4565,1, --1,1,5,4590,20, -893,1,359,1,3, -1,2,1,1,4591, -22,1,195,1,2489, -4592,17,4593,15,4565, -1,-1,1,5,4594, -20,886,1,360,1, -3,1,2,1,1, -4595,22,1,196,1, -2488,4596,17,4597,15, -4598,4,24,37,0, -75,0,101,0,121, -0,65,0,114,0, -103,0,69,0,118, -0,101,0,110,0, -116,0,1,-1,1, -5,4599,20,884,1, -361,1,3,1,2, -1,1,4600,22,1, -197,1,2487,4601,17, -4602,15,4598,1,-1, -1,5,4603,20,877, -1,362,1,3,1, -2,1,1,4604,22, -1,198,1,2486,4605, -17,4606,15,4607,4, -24,37,0,73,0, -110,0,116,0,65, -0,114,0,103,0, -69,0,118,0,101, -0,110,0,116,0, -1,-1,1,5,4608, -20,875,1,363,1, -3,1,2,1,1, -4609,22,1,199,1, -2485,4610,17,4611,15, -4607,1,-1,1,5, -4612,20,873,1,364, -1,3,1,2,1, -1,4613,22,1,200, -1,1622,4614,16,0, -747,1,2483,4615,17, -4616,15,4607,1,-1, -1,5,4617,20,869, -1,366,1,3,1, -2,1,1,4618,22, -1,202,1,2482,4619, -17,4620,15,4607,1, --1,1,5,4621,20, -867,1,367,1,3, -1,2,1,1,4622, -22,1,203,1,2481, -4623,17,4624,15,4607, -1,-1,1,5,4625, -20,865,1,368,1, -3,1,2,1,1, -4626,22,1,204,1, -2480,4627,17,4628,15, -4607,1,-1,1,5, -4629,20,863,1,369, -1,3,1,2,1, -1,4630,22,1,205, -1,2479,4631,17,4632, -15,4607,1,-1,1, -5,4633,20,861,1, -370,1,3,1,2, -1,1,4634,22,1, -206,1,2478,4635,17, -4636,15,4607,1,-1, -1,5,4637,20,859, -1,371,1,3,1, -2,1,1,4638,22, -1,207,1,322,4639, -16,0,747,1,2045, -1997,1,2475,4640,17, -4641,15,4506,1,-1, -1,5,4642,20,848, -1,374,1,3,1, -2,1,1,4643,22, -1,210,1,2043,2001, -1,2473,4644,17,4645, -15,4646,4,36,37, -0,73,0,110,0, -116,0,82,0,111, -0,116,0,82,0, -111,0,116,0,65, -0,114,0,103,0, -69,0,118,0,101, -0,110,0,116,0, -1,-1,1,5,4647, -20,834,1,376,1, -3,1,2,1,1, -4648,22,1,212,1, -2041,2005,1,2471,4649, -17,4650,15,4651,4, -36,37,0,75,0, -101,0,121,0,73, -0,110,0,116,0, -73,0,110,0,116, -0,65,0,114,0, -103,0,69,0,118, -0,101,0,110,0, -116,0,1,-1,1, -5,4652,20,820,1, -378,1,3,1,2, -1,1,4653,22,1, -214,1,2039,2009,1, -2037,2014,1,2035,1900, -1,2033,2020,1,2032, -2024,1,2462,1963,1, -2030,1978,1,2029,1921, -1,2459,1969,1,2458, -1974,1,299,4654,16, -0,747,1,2021,2036, -1,1585,4655,16,0, -747,1,1153,4656,16, -0,747,1,1574,1895, -1,277,4657,16,0, -747,1,1990,4658,16, -0,747,1,1989,2060, -1,2413,4659,16,0, -747,1,256,4660,16, -0,747,1,1117,4661, -16,0,747,1,2477, -4662,17,4663,15,4607, -1,-1,1,5,4664, -20,852,1,372,1, -3,1,2,1,1, -4665,22,1,208,1, -2106,4666,16,0,747, -1,236,4667,16,0, -747,1,1958,4668,16, -0,747,1,1756,4669, -16,0,747,1,1933, -4670,16,0,747,1, -1515,4671,16,0,747, -1,217,4672,16,0, -747,1,2364,2074,1, -1932,4673,16,0,704, -1,1931,1909,1,2464, -2042,1,2786,4674,16, -0,747,1,199,4675, -16,0,747,1,2506, -4676,16,0,317,1, -1479,4677,16,0,747, -1,2769,4678,16,0, -780,1,2337,4679,16, -0,747,1,1901,4680, -16,0,747,1,166, -4681,16,0,747,1, -2318,4682,16,0,747, -1,2198,4683,16,0, -747,1,2472,4684,17, -4685,15,4686,4,36, -37,0,73,0,110, -0,116,0,86,0, -101,0,99,0,86, -0,101,0,99,0, -65,0,114,0,103, -0,69,0,118,0, -101,0,110,0,116, -0,1,-1,1,5, -4687,20,827,1,377, -1,3,1,2,1, -1,4688,22,1,213, -1,1876,4689,16,0, -747,1,1875,4690,16, -0,762,1,1443,4691, -16,0,747,1,1873, -2069,1,2293,4692,16, -0,747,1,137,4693, -16,0,747,1,1189, -4694,16,0,747,1, -79,4695,16,0,747, -1,124,4696,16,0, -747,1,1407,4697,16, -0,747,1,112,4698, -16,0,747,1,1834, -4699,16,0,747,1, -1833,4700,16,0,115, -1,102,4701,16,0, -747,1,97,4702,16, -0,747,1,525,4703, -16,0,747,1,2484, -4704,17,4705,15,4607, -1,-1,1,5,4706, -20,871,1,365,1, -3,1,2,1,1, -4707,22,1,201,1, -1371,4708,16,0,747, -1,89,4709,16,0, -747,1,1860,1983,1, -85,4710,16,0,747, -1,1804,4711,16,0, -747,1,1803,2052,1, -509,4712,16,0,747, -1,76,4713,16,0, -747,1,182,4714,16, -0,747,1,2227,2029, -1,71,4715,16,0, -747,1,63,4716,16, -0,759,1,62,4717, -16,0,734,1,52, -4718,16,0,747,1, -1775,4719,16,0,747, -1,32,4720,16,0, -747,1,44,4721,16, -0,759,1,43,4722, -16,0,747,1,1335, -4723,16,0,747,1, -41,4724,16,0,747, -1,40,4725,16,0, -759,1,346,4726,16, -0,747,1,462,4727, -16,0,747,1,459, -4728,16,0,747,1, -447,4729,16,0,747, -1,9,4730,16,0, -783,1,1731,4731,16, -0,747,1,1297,4732, -16,0,747,1,431, -4733,16,0,747,1, -15,4734,19,272,1, -15,4735,5,6,1, -40,4736,16,0,441, -1,2785,4737,16,0, -770,1,1114,4738,16, -0,542,1,1621,4739, -16,0,270,1,9, -4483,1,19,4461,1, -14,4740,19,148,1, -14,4741,5,115,1, -2281,4290,1,1377,4295, -1,67,2997,1,387, -4742,16,0,531,1, -1370,4306,1,380,2968, -1,379,2973,1,377, -2978,1,2543,4311,1, -375,2983,1,373,2987, -1,371,2991,1,172, -3238,1,1550,4321,1, -42,3742,1,2335,4743, -16,0,197,1,1152, -4327,1,2529,4744,16, -0,287,1,2528,4332, -1,107,3052,1,2525, -4745,16,0,293,1, -1341,4337,1,157,3245, -1,2544,4746,16,0, -262,1,352,3151,1, -1730,4433,1,2540,4747, -16,0,146,1,2514, -4748,16,0,305,1, -2513,4351,1,2510,4749, -16,0,311,1,2509, -4356,1,143,3249,1, -1521,4361,1,188,3233, -1,1123,4365,1,1514, -4369,1,82,3023,1, -328,3029,1,130,3256, -1,1114,3034,1,1701, -4377,1,2582,4459,1, -942,3011,1,1303,4382, -1,9,4483,1,1694, -4750,16,0,197,1, -1296,4392,1,1096,3042, -1,1094,4751,16,0, -503,1,305,3048,1, -1332,4347,1,1485,4397, -1,2467,4402,1,70, -3057,1,1478,4406,1, -883,3269,1,93,3063, -1,1665,4411,1,481, -3747,1,480,3006,1, -479,3072,1,478,3077, -1,477,3081,1,476, -3085,1,20,4752,16, -0,776,1,118,3262, -1,1260,4416,1,68, -3099,1,74,3089,1, -1048,3113,1,464,3734, -1,69,3095,1,262, -3108,1,461,4753,16, -0,503,1,66,3104, -1,459,3752,1,1267, -4423,1,1442,4427,1, -447,3117,1,51,3123, -1,63,3127,1,1231, -4437,1,48,3132,1, -47,3136,1,242,3280, -1,44,3138,1,437, -4754,16,0,468,1, -1224,4441,1,41,3739, -1,525,3145,1,827, -3286,1,1413,4445,1, -2591,4755,16,0,776, -1,1013,3156,1,1406, -4451,1,223,3292,1, -1159,4455,1,2779,4756, -16,0,776,1,283, -3068,1,19,4461,1, -412,4757,16,0,517, -1,1002,3169,1,1001, -3173,1,30,4467,1, -1195,4471,1,2770,4475, -1,1011,3164,1,10, -4373,1,40,3179,1, -205,3300,1,1449,4484, -1,1188,4488,1,50, -3181,1,49,3016,1, -1773,4758,16,0,197, -1,13,4759,19,114, -1,13,4760,5,55, -1,2580,2373,1,2045, -1997,1,2043,2001,1, -2648,2378,1,2575,2383, -1,2039,2009,1,1860, -1983,1,2037,2014,1, -2458,1974,1,2657,2389, -1,2567,2393,1,2032, -2024,1,2654,2402,1, -2653,2406,1,2652,2410, -1,2651,2414,1,2650, -2418,1,2464,2042,1, -2559,2422,1,2647,2427, -1,2646,2431,1,2645, -2435,1,2644,2439,1, -1931,1909,1,2642,2468, -1,2641,2447,1,2462, -1963,1,2105,1940,1, -2459,1969,1,1657,1990, -1,2656,2472,1,2364, -2074,1,2029,1921,1, -2033,2020,1,2536,2457, -1,2030,1978,1,2041, -2005,1,1873,2069,1, -2703,4761,16,0,112, -1,32,4762,16,0, -429,1,1989,2060,1, -2521,2463,1,2021,2036, -1,1803,2052,1,2551, -2451,1,1574,1895,1, -2597,4763,16,0,250, -1,2595,2477,1,2643, -2443,1,2035,1900,1, -2413,4764,16,0,431, -1,2655,2398,1,2031, -1915,1,2227,2029,1, -2136,1926,1,12,4765, -19,151,1,12,4766, -5,50,1,1803,2052, -1,2578,4767,16,0, -767,1,2043,2001,1, -1775,4768,16,0,767, -1,2041,2005,1,2573, -4769,16,0,767,1, -1860,1983,1,2037,2014, -1,2658,4770,16,0, -149,1,2033,2020,1, -2032,2024,1,2565,4771, -16,0,767,1,2030, -1978,1,2029,1921,1, -2106,4772,16,0,767, -1,2469,4773,16,0, -422,1,2557,4774,16, -0,767,1,2464,2042, -1,1931,1909,1,1574, -1895,1,2462,1963,1, -2105,1940,1,2549,4775, -16,0,767,1,2459, -1969,1,2458,1974,1, -2039,2009,1,2364,2074, -1,32,4776,16,0, -767,1,2198,4777,16, -0,767,1,1958,4778, -16,0,767,1,2035, -1900,1,2534,4779,16, -0,767,1,1873,2069, -1,1657,1990,1,2021, -2036,1,1901,4780,16, -0,767,1,1989,2060, -1,1990,4781,16,0, -767,1,2075,4782,16, -0,767,1,2519,4783, -16,0,767,1,1804, -4784,16,0,767,1, -2337,4785,16,0,767, -1,2781,4786,16,0, -767,1,2593,4787,16, -0,767,1,2413,4788, -16,0,767,1,31, -4789,16,0,767,1, -2045,1997,1,2031,1915, -1,2227,2029,1,2136, -1926,1,11,4790,19, -111,1,11,4791,5, -146,1,2462,1963,1, -2136,1926,1,1701,4377, -1,1267,4423,1,1694, -4792,16,0,174,1, -1260,4416,1,1159,4455, -1,827,3286,1,2106, -4793,17,4794,15,4795, -4,30,37,0,69, -0,109,0,112,0, -116,0,121,0,83, -0,116,0,97,0, -116,0,101,0,109, -0,101,0,110,0, -116,0,1,-1,1, -5,4796,20,1557,1, -222,1,3,1,1, -1,0,4797,22,1, -57,1,2105,1940,1, -380,2968,1,379,2973, -1,377,2978,1,375, -2983,1,373,2987,1, -1665,4411,1,371,2991, -1,1231,4437,1,1555, -4798,16,0,357,1, -1659,4799,16,0,509, -1,1657,1990,1,1224, -4441,1,352,3151,1, -2075,4800,17,4794,1, -0,4797,1,328,3029, -1,1628,4801,17,4802, -15,4803,4,22,37, -0,65,0,115,0, -115,0,105,0,103, -0,110,0,109,0, -101,0,110,0,116, -0,1,-1,1,5, -4804,20,1393,1,254, -1,3,1,4,1, -3,4805,22,1,89, -1,1195,4471,1,1621, -4806,16,0,217,1, -1620,4807,17,4808,15, -4803,1,-1,1,5, -4809,20,1379,1,255, -1,3,1,2,1, -1,4810,22,1,90, -1,1188,4488,1,2045, -1997,1,2044,4811,16, -0,622,1,2043,2001, -1,2042,4812,16,0, -109,1,2041,2005,1, -2040,4813,16,0,576, -1,2039,2009,1,2038, -4814,16,0,632,1, -2037,2014,1,2036,4815, -16,0,528,1,2035, -1900,1,2034,4816,16, -0,640,1,2464,2042, -1,2032,2024,1,2031, -1915,1,2030,1978,1, -2029,1921,1,2028,4817, -17,4818,15,4819,4, -20,37,0,74,0, -117,0,109,0,112, -0,76,0,97,0, -98,0,101,0,108, -0,1,-1,1,5, -4820,20,1505,1,236, -1,3,1,3,1, -2,4821,22,1,71, -1,2458,1974,1,2026, -4822,17,4823,15,4824, -4,28,37,0,74, -0,117,0,109,0, -112,0,83,0,116, -0,97,0,116,0, -101,0,109,0,101, -0,110,0,116,0, -1,-1,1,5,4825, -20,1491,1,237,1, -3,1,3,1,2, -4826,22,1,72,1, -2024,4827,17,4828,15, -4829,4,24,37,0, -83,0,116,0,97, -0,116,0,101,0, -67,0,104,0,97, -0,110,0,103,0, -101,0,1,-1,1, -5,4830,20,1489,1, -238,1,3,1,3, -1,2,4831,22,1, -73,1,2023,4832,17, -4833,15,4829,1,-1, -1,5,4834,20,1475, -1,239,1,3,1, -3,1,2,4835,22, -1,74,1,1591,4836, -17,4837,15,4838,4, -32,37,0,82,0, -101,0,116,0,117, -0,114,0,110,0, -83,0,116,0,97, -0,116,0,101,0, -109,0,101,0,110, -0,116,0,1,-1, -1,5,4839,20,1297, -1,280,1,3,1, -3,1,2,4840,22, -1,115,1,2021,2036, -1,1585,4841,17,4842, -15,4838,1,-1,1, -5,4843,20,1283,1, -281,1,3,1,2, -1,1,4844,22,1, -116,1,1152,4327,1, -283,3068,1,1574,1895, -1,49,3016,1,479, -3072,1,1990,4845,17, -4794,1,0,4797,1, -1989,2060,1,262,3108, -1,1123,4365,1,2413, -4846,17,4794,1,0, -4797,1,1550,4321,1, -1114,3034,1,242,3280, -1,1096,3042,1,1521, -4361,1,223,3292,1, -1514,4369,1,2364,2074, -1,1931,1909,1,2792, -4847,16,0,746,1, -205,3300,1,2785,4848, -16,0,501,1,883, -3269,1,942,3011,1, -1485,4397,1,188,3233, -1,1048,3113,1,1478, -4406,1,2337,4849,17, -4794,1,0,4797,1, -1901,4850,17,4794,1, -0,4797,1,172,3238, -1,478,3077,1,157, -3245,1,1449,4484,1, -1013,3156,1,305,3048, -1,1011,3164,1,1872, -4851,16,0,764,1, -2299,4852,16,0,456, -1,143,3249,1,1002, -3169,1,1001,3173,1, -1860,1983,1,1859,4853, -16,0,775,1,130, -3256,1,2281,4290,1, -2459,1969,1,1873,2069, -1,1413,4445,1,118, -3262,1,1406,4451,1, -1958,4854,17,4794,1, -0,4797,1,107,3052, -1,2033,2020,1,525, -3145,1,93,3063,1, -1377,4295,1,82,3023, -1,1804,4855,17,4794, -1,0,4797,1,1803, -2052,1,1370,4306,1, -74,3089,1,2227,2029, -1,70,3057,1,69, -3095,1,68,3099,1, -67,2997,1,66,3104, -1,63,3127,1,1775, -4856,17,4794,1,0, -4797,1,50,3181,1, -480,3006,1,48,3132, -1,47,3136,1,477, -3081,1,476,3085,1, -44,3138,1,2198,4857, -17,4794,1,0,4797, -1,51,3123,1,40, -3179,1,1332,4347,1, -32,4858,17,4794,1, -0,4797,1,1341,4337, -1,1442,4427,1,19, -4461,1,447,3117,1, -1737,4859,16,0,144, -1,1303,4382,1,9, -4483,1,1730,4433,1, -1296,4392,1,10,4860, -19,524,1,10,4861, -5,2,1,40,4862, -16,0,522,1,1114, -4863,16,0,639,1, -9,4864,19,512,1, -9,4865,5,2,1, -40,4866,16,0,510, -1,1114,4867,16,0, -613,1,8,4868,19, -480,1,8,4869,5, -2,1,40,4870,16, -0,478,1,1114,4871, -16,0,590,1,7, -4872,19,464,1,7, -4873,5,2,1,40, -4874,16,0,462,1, -1114,4875,16,0,574, -1,6,4876,19,453, -1,6,4877,5,2, -1,40,4878,16,0, -451,1,1114,4879,16, -0,564,1,5,4880, -19,552,1,5,4881, -5,100,1,1574,1895, -1,2035,1900,1,1371, -4882,16,0,550,1, -71,4883,16,0,550, -1,1958,4884,16,0, -550,1,381,4885,16, -0,550,1,2106,4886, -16,0,550,1,1931, -1909,1,1756,4887,16, -0,550,1,2031,1915, -1,509,4888,16,0, -550,1,2337,4889,16, -0,550,1,2029,1921, -1,1153,4890,16,0, -550,1,2136,1926,1, -1933,4891,16,0,550, -1,2198,4892,16,0, -550,1,1731,4893,16, -0,550,1,1335,4894, -16,0,550,1,2318, -4895,16,0,550,1, -346,4896,16,0,550, -1,182,4897,16,0, -550,1,137,4898,16, -0,550,1,1515,4899, -16,0,550,1,2105, -1940,1,1775,4900,16, -0,550,1,1117,4901, -16,0,550,1,525, -4902,16,0,550,1, -1114,4903,16,0,751, -1,1901,4904,16,0, -550,1,2293,4905,16, -0,550,1,322,4906, -16,0,550,1,124, -4907,16,0,550,1, -1695,4908,16,0,550, -1,1297,4909,16,0, -550,1,151,4910,16, -0,550,1,44,4911, -16,0,749,1,112, -4912,16,0,550,1, -1990,4913,16,0,550, -1,76,4914,16,0, -550,1,43,4915,16, -0,550,1,2075,4916, -16,0,550,1,1876, -4917,16,0,550,1, -299,4918,16,0,550, -1,1479,4919,16,0, -550,1,2462,1963,1, -97,4920,16,0,550, -1,2459,1969,1,2458, -1974,1,2030,1978,1, -89,4921,16,0,550, -1,1860,1983,1,85, -4922,16,0,550,1, -1659,4923,16,0,550, -1,1657,1990,1,277, -4924,16,0,550,1, -1261,4925,16,0,550, -1,166,4926,16,0, -550,1,2045,1997,1, -2043,2001,1,2041,2005, -1,2039,2009,1,462, -4927,16,0,550,1, -2037,2014,1,66,4928, -16,0,738,1,459, -4929,16,0,550,1, -1443,4930,16,0,550, -1,2033,2020,1,2032, -2024,1,1834,4931,16, -0,550,1,2227,2029, -1,256,4932,16,0, -550,1,447,4933,16, -0,550,1,52,4934, -16,0,550,1,2021, -2036,1,63,4935,16, -0,736,1,2413,4936, -16,0,550,1,47, -4937,16,0,751,1, -1622,4938,16,0,550, -1,2464,2042,1,1225, -4939,16,0,550,1, -41,4940,16,0,550, -1,40,4941,16,0, -749,1,236,4942,16, -0,550,1,431,4943, -16,0,550,1,32, -4944,16,0,550,1, -1804,4945,16,0,550, -1,1803,2052,1,1407, -4946,16,0,550,1, -79,4947,16,0,550, -1,217,4948,16,0, -550,1,1989,2060,1, -102,4949,16,0,550, -1,2786,4950,16,0, -550,1,406,4951,16, -0,550,1,1585,4952, -16,0,550,1,1189, -4953,16,0,550,1, -1873,2069,1,199,4954, -16,0,550,1,2364, -2074,1,4,4955,19, -546,1,4,4956,5, -100,1,1574,1895,1, -2035,1900,1,1371,4957, -16,0,544,1,71, -4958,16,0,544,1, -1958,4959,16,0,544, -1,381,4960,16,0, -544,1,2106,4961,16, -0,544,1,1931,1909, -1,1756,4962,16,0, -544,1,2031,1915,1, -509,4963,16,0,544, -1,2337,4964,16,0, -544,1,2029,1921,1, -1153,4965,16,0,544, -1,2136,1926,1,1933, -4966,16,0,544,1, -2198,4967,16,0,544, -1,1731,4968,16,0, -544,1,1335,4969,16, -0,544,1,2318,4970, -16,0,544,1,346, -4971,16,0,544,1, -182,4972,16,0,544, -1,137,4973,16,0, -544,1,1515,4974,16, -0,544,1,2105,1940, -1,1775,4975,16,0, -544,1,1117,4976,16, -0,544,1,525,4977, -16,0,544,1,1114, -4978,16,0,750,1, -1901,4979,16,0,544, -1,2293,4980,16,0, -544,1,322,4981,16, -0,544,1,124,4982, -16,0,544,1,1695, -4983,16,0,544,1, -1297,4984,16,0,544, -1,151,4985,16,0, -544,1,44,4986,16, -0,748,1,112,4987, -16,0,544,1,1990, -4988,16,0,544,1, -76,4989,16,0,544, -1,43,4990,16,0, -544,1,2075,4991,16, -0,544,1,1876,4992, -16,0,544,1,299, -4993,16,0,544,1, -1479,4994,16,0,544, -1,2462,1963,1,97, -4995,16,0,544,1, -2459,1969,1,2458,1974, -1,2030,1978,1,89, -4996,16,0,544,1, -1860,1983,1,85,4997, -16,0,544,1,1659, -4998,16,0,544,1, -1657,1990,1,277,4999, -16,0,544,1,1261, -5000,16,0,544,1, -166,5001,16,0,544, -1,2045,1997,1,2043, -2001,1,2041,2005,1, -2039,2009,1,462,5002, -16,0,544,1,2037, -2014,1,66,5003,16, -0,737,1,459,5004, -16,0,544,1,1443, -5005,16,0,544,1, -2033,2020,1,2032,2024, -1,1834,5006,16,0, -544,1,2227,2029,1, -256,5007,16,0,544, -1,447,5008,16,0, -544,1,52,5009,16, -0,544,1,2021,2036, -1,63,5010,16,0, -735,1,2413,5011,16, -0,544,1,47,5012, -16,0,750,1,1622, -5013,16,0,544,1, -2464,2042,1,1225,5014, -16,0,544,1,41, -5015,16,0,544,1, -40,5016,16,0,748, -1,236,5017,16,0, -544,1,431,5018,16, -0,544,1,32,5019, -16,0,544,1,1804, -5020,16,0,544,1, -1803,2052,1,1407,5021, -16,0,544,1,79, -5022,16,0,544,1, -217,5023,16,0,544, -1,1989,2060,1,102, -5024,16,0,544,1, -2786,5025,16,0,544, -1,406,5026,16,0, -544,1,1585,5027,16, -0,544,1,1189,5028, -16,0,544,1,1873, -2069,1,199,5029,16, -0,544,1,2364,2074, -1,3,5030,19,500, -1,3,5031,5,95, -1,1574,1895,1,2035, -1900,1,1371,5032,16, -0,498,1,71,5033, -16,0,498,1,1958, -5034,16,0,498,1, -381,5035,16,0,498, -1,2106,5036,16,0, -498,1,1931,1909,1, -1756,5037,16,0,498, -1,2031,1915,1,509, -5038,16,0,498,1, -2337,5039,16,0,498, -1,2029,1921,1,1153, -5040,16,0,498,1, -2136,1926,1,1933,5041, -16,0,498,1,2198, -5042,16,0,498,1, -1731,5043,16,0,498, -1,1335,5044,16,0, -498,1,2318,5045,16, -0,498,1,346,5046, -16,0,498,1,182, -5047,16,0,498,1, -137,5048,16,0,498, -1,1515,5049,16,0, -498,1,2105,1940,1, -1775,5050,16,0,498, -1,1117,5051,16,0, -498,1,525,5052,16, -0,498,1,52,5053, -16,0,498,1,1901, -5054,16,0,498,1, -2293,5055,16,0,498, -1,322,5056,16,0, -498,1,124,5057,16, -0,498,1,1695,5058, -16,0,498,1,1297, -5059,16,0,498,1, -151,5060,16,0,498, -1,112,5061,16,0, -498,1,1990,5062,16, -0,498,1,76,5063, -16,0,498,1,43, -5064,16,0,498,1, -2075,5065,16,0,498, -1,1876,5066,16,0, -498,1,299,5067,16, -0,498,1,1479,5068, -16,0,498,1,2462, -1963,1,97,5069,16, -0,498,1,2459,1969, -1,2458,1974,1,2030, -1978,1,89,5070,16, -0,498,1,1860,1983, -1,85,5071,16,0, -498,1,1659,5072,16, -0,498,1,1657,1990, -1,277,5073,16,0, -498,1,1261,5074,16, -0,498,1,166,5075, -16,0,498,1,2045, -1997,1,2043,2001,1, -2041,2005,1,2039,2009, -1,462,5076,16,0, -498,1,2037,2014,1, -459,5077,16,0,498, -1,1443,5078,16,0, -498,1,2033,2020,1, -2032,2024,1,1834,5079, -16,0,498,1,2227, -2029,1,256,5080,16, -0,498,1,447,5081, -16,0,498,1,62, -5082,16,0,498,1, -2021,2036,1,2413,5083, -16,0,498,1,1622, -5084,16,0,498,1, -2464,2042,1,1225,5085, -16,0,498,1,41, -5086,16,0,498,1, -236,5087,16,0,498, -1,431,5088,16,0, -498,1,32,5089,16, -0,498,1,1804,5090, -16,0,498,1,1803, -2052,1,1407,5091,16, -0,498,1,79,5092, -16,0,498,1,217, -5093,16,0,498,1, -1989,2060,1,102,5094, -16,0,498,1,2786, -5095,16,0,498,1, -406,5096,16,0,498, -1,1585,5097,16,0, -498,1,1189,5098,16, -0,498,1,1873,2069, -1,199,5099,16,0, -498,1,2364,2074,1, -2,5100,19,572,1, -2,5101,5,6,1, -2768,2876,1,2649,2872, -1,2767,2893,1,2834, -5102,17,5103,15,5104, -4,30,37,0,76, -0,83,0,76,0, -80,0,114,0,111, -0,103,0,114,0, -97,0,109,0,82, -0,111,0,111,0, -116,0,1,-1,1, -5,5105,20,1810,1, -167,1,3,1,3, -1,2,5106,22,1, -1,1,2764,5107,17, -5108,15,5104,1,-1, -1,5,5109,20,1806, -1,168,1,3,1, -2,1,1,5110,22, -1,2,1,2755,2866, -2,0,0}; -new Sfactory(this,"IncrementDecrementExpression_1",new SCreator(IncrementDecrementExpression_1_factory)); -new Sfactory(this,"StateChange",new SCreator(StateChange_factory)); -new Sfactory(this,"ArgumentDeclarationList_3",new SCreator(ArgumentDeclarationList_3_factory)); -new Sfactory(this,"BinaryExpression",new SCreator(BinaryExpression_factory)); -new Sfactory(this,"VoidArgEvent_5",new SCreator(VoidArgEvent_5_factory)); -new Sfactory(this,"IdentDotExpression_1",new SCreator(IdentDotExpression_1_factory)); -new Sfactory(this,"StateBody_10",new SCreator(StateBody_10_factory)); -new Sfactory(this,"VectorArgEvent_1",new SCreator(VectorArgEvent_1_factory)); -new Sfactory(this,"ReturnStatement_1",new SCreator(ReturnStatement_1_factory)); -new Sfactory(this,"ReturnStatement_2",new SCreator(ReturnStatement_2_factory)); -new Sfactory(this,"Typename_7",new SCreator(Typename_7_factory)); -new Sfactory(this,"ExpressionArgument",new SCreator(ExpressionArgument_factory)); -new Sfactory(this,"ForLoop",new SCreator(ForLoop_factory)); -new Sfactory(this,"GlobalDefinitions",new SCreator(GlobalDefinitions_factory)); -new Sfactory(this,"Typename_1",new SCreator(Typename_1_factory)); -new Sfactory(this,"TypecastExpression_3",new SCreator(TypecastExpression_3_factory)); -new Sfactory(this,"IncrementDecrementExpression_6",new SCreator(IncrementDecrementExpression_6_factory)); -new Sfactory(this,"SimpleAssignment_2",new SCreator(SimpleAssignment_2_factory)); -new Sfactory(this,"IntVecVecArgEvent_1",new SCreator(IntVecVecArgEvent_1_factory)); -new Sfactory(this,"LSLProgramRoot_2",new SCreator(LSLProgramRoot_2_factory)); -new Sfactory(this,"IdentDotExpression",new SCreator(IdentDotExpression_factory)); -new Sfactory(this,"UnaryExpression_1",new SCreator(UnaryExpression_1_factory)); -new Sfactory(this,"RotationConstant",new SCreator(RotationConstant_factory)); -new Sfactory(this,"IntArgumentDeclarationList",new SCreator(IntArgumentDeclarationList_factory)); -new Sfactory(this,"ArgumentList",new SCreator(ArgumentList_factory)); -new Sfactory(this,"BinaryExpression_3",new SCreator(BinaryExpression_3_factory)); -new Sfactory(this,"Event_2",new SCreator(Event_2_factory)); -new Sfactory(this,"ArgumentList_4",new SCreator(ArgumentList_4_factory)); -new Sfactory(this,"IntVecVecArgEvent",new SCreator(IntVecVecArgEvent_factory)); -new Sfactory(this,"WhileStatement_2",new SCreator(WhileStatement_2_factory)); -new Sfactory(this,"Assignment",new SCreator(Assignment_factory)); -new Sfactory(this,"Statement_12",new SCreator(Statement_12_factory)); -new Sfactory(this,"IncrementDecrementExpression_8",new SCreator(IncrementDecrementExpression_8_factory)); -new Sfactory(this,"VectorArgEvent_2",new SCreator(VectorArgEvent_2_factory)); -new Sfactory(this,"Constant_2",new SCreator(Constant_2_factory)); -new Sfactory(this,"Statement_1",new SCreator(Statement_1_factory)); -new Sfactory(this,"VectorArgEvent",new SCreator(VectorArgEvent_factory)); -new Sfactory(this,"ForLoopStatement_1",new SCreator(ForLoopStatement_1_factory)); -new Sfactory(this,"IncrementDecrementExpression_2",new SCreator(IncrementDecrementExpression_2_factory)); -new Sfactory(this,"IntArgumentDeclarationList_1",new SCreator(IntArgumentDeclarationList_1_factory)); -new Sfactory(this,"VoidArgEvent_4",new SCreator(VoidArgEvent_4_factory)); -new Sfactory(this,"ForLoop_1",new SCreator(ForLoop_1_factory)); -new Sfactory(this,"Typename_4",new SCreator(Typename_4_factory)); -new Sfactory(this,"IdentExpression",new SCreator(IdentExpression_factory)); -new Sfactory(this,"ForLoop_2",new SCreator(ForLoop_2_factory)); -new Sfactory(this,"DoWhileStatement",new SCreator(DoWhileStatement_factory)); -new Sfactory(this,"SimpleAssignment_6",new SCreator(SimpleAssignment_6_factory)); -new Sfactory(this,"IntDeclaration_1",new SCreator(IntDeclaration_1_factory)); -new Sfactory(this,"State_1",new SCreator(State_1_factory)); -new Sfactory(this,"StateBody_9",new SCreator(StateBody_9_factory)); -new Sfactory(this,"StateBody_8",new SCreator(StateBody_8_factory)); -new Sfactory(this,"State_2",new SCreator(State_2_factory)); -new Sfactory(this,"StateBody_3",new SCreator(StateBody_3_factory)); -new Sfactory(this,"StateBody_2",new SCreator(StateBody_2_factory)); -new Sfactory(this,"StateBody_1",new SCreator(StateBody_1_factory)); -new Sfactory(this,"Typename_6",new SCreator(Typename_6_factory)); -new Sfactory(this,"StateBody_7",new SCreator(StateBody_7_factory)); -new Sfactory(this,"StateBody_4",new SCreator(StateBody_4_factory)); -new Sfactory(this,"IfStatement_1",new SCreator(IfStatement_1_factory)); -new Sfactory(this,"IfStatement_3",new SCreator(IfStatement_3_factory)); -new Sfactory(this,"IfStatement_2",new SCreator(IfStatement_2_factory)); -new Sfactory(this,"SimpleAssignment_1",new SCreator(SimpleAssignment_1_factory)); -new Sfactory(this,"VoidArgEvent_6",new SCreator(VoidArgEvent_6_factory)); -new Sfactory(this,"IfStatement",new SCreator(IfStatement_factory)); -new Sfactory(this,"ConstantExpression",new SCreator(ConstantExpression_factory)); -new Sfactory(this,"BinaryExpression_7",new SCreator(BinaryExpression_7_factory)); -new Sfactory(this,"IncrementDecrementExpression",new SCreator(IncrementDecrementExpression_factory)); -new Sfactory(this,"Statement_9",new SCreator(Statement_9_factory)); -new Sfactory(this,"IntVecVecArgStateEvent",new SCreator(IntVecVecArgStateEvent_factory)); -new Sfactory(this,"Declaration_1",new SCreator(Declaration_1_factory)); -new Sfactory(this,"KeyIntIntArgumentDeclarationList",new SCreator(KeyIntIntArgumentDeclarationList_factory)); -new Sfactory(this,"VectorArgumentDeclarationList_1",new SCreator(VectorArgumentDeclarationList_1_factory)); -new Sfactory(this,"SimpleAssignment",new SCreator(SimpleAssignment_factory)); -new Sfactory(this,"BinaryExpression_9",new SCreator(BinaryExpression_9_factory)); -new Sfactory(this,"IntDeclaration",new SCreator(IntDeclaration_factory)); -new Sfactory(this,"IntArgEvent_10",new SCreator(IntArgEvent_10_factory)); -new Sfactory(this,"ArgumentDeclarationList_2",new SCreator(ArgumentDeclarationList_2_factory)); -new Sfactory(this,"ArgumentDeclarationList_1",new SCreator(ArgumentDeclarationList_1_factory)); -new Sfactory(this,"ArgumentDeclarationList_4",new SCreator(ArgumentDeclarationList_4_factory)); -new Sfactory(this,"SimpleAssignment_9",new SCreator(SimpleAssignment_9_factory)); -new Sfactory(this,"ForLoopStatement_2",new SCreator(ForLoopStatement_2_factory)); -new Sfactory(this,"StatementList",new SCreator(StatementList_factory)); -new Sfactory(this,"StateBody_13",new SCreator(StateBody_13_factory)); -new Sfactory(this,"Typename_3",new SCreator(Typename_3_factory)); -new Sfactory(this,"KeyArgumentDeclarationList_1",new SCreator(KeyArgumentDeclarationList_1_factory)); -new Sfactory(this,"UnaryExpression_3",new SCreator(UnaryExpression_3_factory)); -new Sfactory(this,"StateBody_16",new SCreator(StateBody_16_factory)); -new Sfactory(this,"VectorArgumentDeclarationList",new SCreator(VectorArgumentDeclarationList_factory)); -new Sfactory(this,"IntArgEvent_3",new SCreator(IntArgEvent_3_factory)); -new Sfactory(this,"StatementList_2",new SCreator(StatementList_2_factory)); -new Sfactory(this,"KeyArgStateEvent",new SCreator(KeyArgStateEvent_factory)); -new Sfactory(this,"LSLProgramRoot_1",new SCreator(LSLProgramRoot_1_factory)); -new Sfactory(this,"Typename_2",new SCreator(Typename_2_factory)); -new Sfactory(this,"TypecastExpression_6",new SCreator(TypecastExpression_6_factory)); -new Sfactory(this,"Event_3",new SCreator(Event_3_factory)); -new Sfactory(this,"IntArgStateEvent",new SCreator(IntArgStateEvent_factory)); -new Sfactory(this,"StateChange_2",new SCreator(StateChange_2_factory)); -new Sfactory(this,"StateChange_1",new SCreator(StateChange_1_factory)); -new Sfactory(this,"VectorConstant_1",new SCreator(VectorConstant_1_factory)); -new Sfactory(this,"KeyDeclaration",new SCreator(KeyDeclaration_factory)); -new Sfactory(this,"States_2",new SCreator(States_2_factory)); -new Sfactory(this,"VoidArgEvent",new SCreator(VoidArgEvent_factory)); -new Sfactory(this,"WhileStatement",new SCreator(WhileStatement_factory)); -new Sfactory(this,"UnaryExpression",new SCreator(UnaryExpression_factory)); -new Sfactory(this,"BinaryExpression_6",new SCreator(BinaryExpression_6_factory)); -new Sfactory(this,"ConstantExpression_1",new SCreator(ConstantExpression_1_factory)); -new Sfactory(this,"ForLoopStatement",new SCreator(ForLoopStatement_factory)); -new Sfactory(this,"BinaryExpression_1",new SCreator(BinaryExpression_1_factory)); -new Sfactory(this,"StateEvent",new SCreator(StateEvent_factory)); -new Sfactory(this,"Event_5",new SCreator(Event_5_factory)); -new Sfactory(this,"SimpleAssignment_5",new SCreator(SimpleAssignment_5_factory)); -new Sfactory(this,"RotationConstant_1",new SCreator(RotationConstant_1_factory)); -new Sfactory(this,"Constant",new SCreator(Constant_factory)); -new Sfactory(this,"IntArgEvent_1",new SCreator(IntArgEvent_1_factory)); -new Sfactory(this,"SimpleAssignment_8",new SCreator(SimpleAssignment_8_factory)); -new Sfactory(this,"ForLoopStatement_3",new SCreator(ForLoopStatement_3_factory)); -new Sfactory(this,"IntArgEvent_2",new SCreator(IntArgEvent_2_factory)); -new Sfactory(this,"LSLProgramRoot",new SCreator(LSLProgramRoot_factory)); -new Sfactory(this,"StateBody_12",new SCreator(StateBody_12_factory)); -new Sfactory(this,"IntArgEvent_4",new SCreator(IntArgEvent_4_factory)); -new Sfactory(this,"IntArgEvent_7",new SCreator(IntArgEvent_7_factory)); -new Sfactory(this,"IntArgEvent_6",new SCreator(IntArgEvent_6_factory)); -new Sfactory(this,"IntArgEvent_9",new SCreator(IntArgEvent_9_factory)); -new Sfactory(this,"TypecastExpression_7",new SCreator(TypecastExpression_7_factory)); -new Sfactory(this,"StateBody_15",new SCreator(StateBody_15_factory)); -new Sfactory(this,"VoidArgStateEvent_1",new SCreator(VoidArgStateEvent_1_factory)); -new Sfactory(this,"error",new SCreator(error_factory)); -new Sfactory(this,"TypecastExpression_1",new SCreator(TypecastExpression_1_factory)); -new Sfactory(this,"GlobalDefinitions_4",new SCreator(GlobalDefinitions_4_factory)); -new Sfactory(this,"GlobalDefinitions_3",new SCreator(GlobalDefinitions_3_factory)); -new Sfactory(this,"GlobalDefinitions_2",new SCreator(GlobalDefinitions_2_factory)); -new Sfactory(this,"GlobalDefinitions_1",new SCreator(GlobalDefinitions_1_factory)); -new Sfactory(this,"ArgumentList_1",new SCreator(ArgumentList_1_factory)); -new Sfactory(this,"IncrementDecrementExpression_7",new SCreator(IncrementDecrementExpression_7_factory)); -new Sfactory(this,"UnaryExpression_2",new SCreator(UnaryExpression_2_factory)); -new Sfactory(this,"Argument",new SCreator(Argument_factory)); -new Sfactory(this,"SimpleAssignment_24",new SCreator(SimpleAssignment_24_factory)); -new Sfactory(this,"ExpressionArgument_1",new SCreator(ExpressionArgument_1_factory)); -new Sfactory(this,"EmptyStatement",new SCreator(EmptyStatement_factory)); -new Sfactory(this,"KeyIntIntArgStateEvent",new SCreator(KeyIntIntArgStateEvent_factory)); -new Sfactory(this,"VectorArgStateEvent_1",new SCreator(VectorArgStateEvent_1_factory)); -new Sfactory(this,"GlobalFunctionDefinition_1",new SCreator(GlobalFunctionDefinition_1_factory)); -new Sfactory(this,"FunctionCallExpression_1",new SCreator(FunctionCallExpression_1_factory)); -new Sfactory(this,"DoWhileStatement_2",new SCreator(DoWhileStatement_2_factory)); -new Sfactory(this,"VoidArgEvent_1",new SCreator(VoidArgEvent_1_factory)); -new Sfactory(this,"KeyArgumentDeclarationList",new SCreator(KeyArgumentDeclarationList_factory)); -new Sfactory(this,"KeyIntIntArgEvent",new SCreator(KeyIntIntArgEvent_factory)); -new Sfactory(this,"ListConstant_1",new SCreator(ListConstant_1_factory)); -new Sfactory(this,"StateEvent_1",new SCreator(StateEvent_1_factory)); -new Sfactory(this,"SimpleAssignment_20",new SCreator(SimpleAssignment_20_factory)); -new Sfactory(this,"SimpleAssignment_23",new SCreator(SimpleAssignment_23_factory)); -new Sfactory(this,"SimpleAssignment_22",new SCreator(SimpleAssignment_22_factory)); -new Sfactory(this,"IntArgEvent_5",new SCreator(IntArgEvent_5_factory)); -new Sfactory(this,"ParenthesisExpression",new SCreator(ParenthesisExpression_factory)); -new Sfactory(this,"JumpStatement",new SCreator(JumpStatement_factory)); -new Sfactory(this,"IntRotRotArgumentDeclarationList_1",new SCreator(IntRotRotArgumentDeclarationList_1_factory)); -new Sfactory(this,"SimpleAssignment_4",new SCreator(SimpleAssignment_4_factory)); -new Sfactory(this,"KeyArgEvent",new SCreator(KeyArgEvent_factory)); -new Sfactory(this,"Assignment_2",new SCreator(Assignment_2_factory)); -new Sfactory(this,"ForLoopStatement_4",new SCreator(ForLoopStatement_4_factory)); -new Sfactory(this,"Statement_13",new SCreator(Statement_13_factory)); -new Sfactory(this,"RotDeclaration",new SCreator(RotDeclaration_factory)); -new Sfactory(this,"StateBody_11",new SCreator(StateBody_11_factory)); -new Sfactory(this,"KeyArgEvent_2",new SCreator(KeyArgEvent_2_factory)); -new Sfactory(this,"StatementList_1",new SCreator(StatementList_1_factory)); -new Sfactory(this,"StateBody_6",new SCreator(StateBody_6_factory)); -new Sfactory(this,"Constant_1",new SCreator(Constant_1_factory)); -new Sfactory(this,"VecDeclaration",new SCreator(VecDeclaration_factory)); -new Sfactory(this,"TypecastExpression_5",new SCreator(TypecastExpression_5_factory)); -new Sfactory(this,"GlobalFunctionDefinition_2",new SCreator(GlobalFunctionDefinition_2_factory)); -new Sfactory(this,"KeyIntIntArgEvent_1",new SCreator(KeyIntIntArgEvent_1_factory)); -new Sfactory(this,"Constant_4",new SCreator(Constant_4_factory)); -new Sfactory(this,"TypecastExpression_9",new SCreator(TypecastExpression_9_factory)); -new Sfactory(this,"IntRotRotArgStateEvent_1",new SCreator(IntRotRotArgStateEvent_1_factory)); -new Sfactory(this,"IncrementDecrementExpression_3",new SCreator(IncrementDecrementExpression_3_factory)); -new Sfactory(this,"States_1",new SCreator(States_1_factory)); -new Sfactory(this,"GlobalVariableDeclaration",new SCreator(GlobalVariableDeclaration_factory)); -new Sfactory(this,"VoidArgEvent_3",new SCreator(VoidArgEvent_3_factory)); -new Sfactory(this,"Assignment_1",new SCreator(Assignment_1_factory)); -new Sfactory(this,"BinaryExpression_5",new SCreator(BinaryExpression_5_factory)); -new Sfactory(this,"IfStatement_4",new SCreator(IfStatement_4_factory)); -new Sfactory(this,"IntVecVecArgumentDeclarationList_1",new SCreator(IntVecVecArgumentDeclarationList_1_factory)); -new Sfactory(this,"KeyIntIntArgumentDeclarationList_1",new SCreator(KeyIntIntArgumentDeclarationList_1_factory)); -new Sfactory(this,"Statement",new SCreator(Statement_factory)); -new Sfactory(this,"ParenthesisExpression_1",new SCreator(ParenthesisExpression_1_factory)); -new Sfactory(this,"ParenthesisExpression_2",new SCreator(ParenthesisExpression_2_factory)); -new Sfactory(this,"DoWhileStatement_1",new SCreator(DoWhileStatement_1_factory)); -new Sfactory(this,"VoidArgStateEvent",new SCreator(VoidArgStateEvent_factory)); -new Sfactory(this,"GlobalFunctionDefinition",new SCreator(GlobalFunctionDefinition_factory)); -new Sfactory(this,"Event_4",new SCreator(Event_4_factory)); -new Sfactory(this,"IntArgEvent",new SCreator(IntArgEvent_factory)); -new Sfactory(this,"SimpleAssignment_11",new SCreator(SimpleAssignment_11_factory)); -new Sfactory(this,"SimpleAssignment_10",new SCreator(SimpleAssignment_10_factory)); -new Sfactory(this,"SimpleAssignment_13",new SCreator(SimpleAssignment_13_factory)); -new Sfactory(this,"SimpleAssignment_12",new SCreator(SimpleAssignment_12_factory)); -new Sfactory(this,"SimpleAssignment_15",new SCreator(SimpleAssignment_15_factory)); -new Sfactory(this,"SimpleAssignment_14",new SCreator(SimpleAssignment_14_factory)); -new Sfactory(this,"SimpleAssignment_17",new SCreator(SimpleAssignment_17_factory)); -new Sfactory(this,"SimpleAssignment_16",new SCreator(SimpleAssignment_16_factory)); -new Sfactory(this,"SimpleAssignment_19",new SCreator(SimpleAssignment_19_factory)); -new Sfactory(this,"SimpleAssignment_18",new SCreator(SimpleAssignment_18_factory)); -new Sfactory(this,"IntVecVecArgumentDeclarationList",new SCreator(IntVecVecArgumentDeclarationList_factory)); -new Sfactory(this,"StateBody_5",new SCreator(StateBody_5_factory)); -new Sfactory(this,"BinaryExpression_17",new SCreator(BinaryExpression_17_factory)); -new Sfactory(this,"BinaryExpression_16",new SCreator(BinaryExpression_16_factory)); -new Sfactory(this,"BinaryExpression_15",new SCreator(BinaryExpression_15_factory)); -new Sfactory(this,"BinaryExpression_14",new SCreator(BinaryExpression_14_factory)); -new Sfactory(this,"BinaryExpression_13",new SCreator(BinaryExpression_13_factory)); -new Sfactory(this,"BinaryExpression_12",new SCreator(BinaryExpression_12_factory)); -new Sfactory(this,"BinaryExpression_11",new SCreator(BinaryExpression_11_factory)); -new Sfactory(this,"BinaryExpression_10",new SCreator(BinaryExpression_10_factory)); -new Sfactory(this,"VectorArgStateEvent",new SCreator(VectorArgStateEvent_factory)); -new Sfactory(this,"Statement_10",new SCreator(Statement_10_factory)); -new Sfactory(this,"BinaryExpression_8",new SCreator(BinaryExpression_8_factory)); -new Sfactory(this,"BinaryExpression_18",new SCreator(BinaryExpression_18_factory)); -new Sfactory(this,"BinaryExpression_2",new SCreator(BinaryExpression_2_factory)); -new Sfactory(this,"FunctionCallExpression",new SCreator(FunctionCallExpression_factory)); -new Sfactory(this,"VectorArgEvent_3",new SCreator(VectorArgEvent_3_factory)); -new Sfactory(this,"IdentExpression_1",new SCreator(IdentExpression_1_factory)); -new Sfactory(this,"IntArgEvent_8",new SCreator(IntArgEvent_8_factory)); -new Sfactory(this,"VoidArgEvent_7",new SCreator(VoidArgEvent_7_factory)); -new Sfactory(this,"IncrementDecrementExpression_4",new SCreator(IncrementDecrementExpression_4_factory)); -new Sfactory(this,"FunctionCall",new SCreator(FunctionCall_factory)); -new Sfactory(this,"ArgumentList_3",new SCreator(ArgumentList_3_factory)); -new Sfactory(this,"KeyIntIntArgStateEvent_1",new SCreator(KeyIntIntArgStateEvent_1_factory)); -new Sfactory(this,"IntRotRotArgumentDeclarationList",new SCreator(IntRotRotArgumentDeclarationList_factory)); -new Sfactory(this,"KeyDeclaration_1",new SCreator(KeyDeclaration_1_factory)); -new Sfactory(this,"BinaryExpression_4",new SCreator(BinaryExpression_4_factory)); -new Sfactory(this,"FunctionCall_1",new SCreator(FunctionCall_1_factory)); -new Sfactory(this,"KeyArgStateEvent_1",new SCreator(KeyArgStateEvent_1_factory)); -new Sfactory(this,"IntArgStateEvent_1",new SCreator(IntArgStateEvent_1_factory)); -new Sfactory(this,"Event",new SCreator(Event_factory)); -new Sfactory(this,"IntRotRotArgEvent",new SCreator(IntRotRotArgEvent_factory)); -new Sfactory(this,"SimpleAssignment_7",new SCreator(SimpleAssignment_7_factory)); -new Sfactory(this,"Statement_3",new SCreator(Statement_3_factory)); -new Sfactory(this,"Expression",new SCreator(Expression_factory)); -new Sfactory(this,"CompoundStatement_2",new SCreator(CompoundStatement_2_factory)); -new Sfactory(this,"CompoundStatement_1",new SCreator(CompoundStatement_1_factory)); -new Sfactory(this,"JumpLabel",new SCreator(JumpLabel_factory)); -new Sfactory(this,"State",new SCreator(State_factory)); -new Sfactory(this,"TypecastExpression",new SCreator(TypecastExpression_factory)); -new Sfactory(this,"IntRotRotArgEvent_1",new SCreator(IntRotRotArgEvent_1_factory)); -new Sfactory(this,"Statement_11",new SCreator(Statement_11_factory)); -new Sfactory(this,"VoidArgEvent_2",new SCreator(VoidArgEvent_2_factory)); -new Sfactory(this,"Typename",new SCreator(Typename_factory)); -new Sfactory(this,"ArgumentDeclarationList",new SCreator(ArgumentDeclarationList_factory)); -new Sfactory(this,"StateBody",new SCreator(StateBody_factory)); -new Sfactory(this,"Event_8",new SCreator(Event_8_factory)); -new Sfactory(this,"Event_9",new SCreator(Event_9_factory)); -new Sfactory(this,"Event_6",new SCreator(Event_6_factory)); -new Sfactory(this,"Event_7",new SCreator(Event_7_factory)); -new Sfactory(this,"Statement_8",new SCreator(Statement_8_factory)); -new Sfactory(this,"CompoundStatement",new SCreator(CompoundStatement_factory)); -new Sfactory(this,"Event_1",new SCreator(Event_1_factory)); -new Sfactory(this,"Statement_4",new SCreator(Statement_4_factory)); -new Sfactory(this,"Statement_5",new SCreator(Statement_5_factory)); -new Sfactory(this,"Statement_6",new SCreator(Statement_6_factory)); -new Sfactory(this,"Statement_7",new SCreator(Statement_7_factory)); -new Sfactory(this,"IncrementDecrementExpression_5",new SCreator(IncrementDecrementExpression_5_factory)); -new Sfactory(this,"Statement_2",new SCreator(Statement_2_factory)); -new Sfactory(this,"ListConstant",new SCreator(ListConstant_factory)); -new Sfactory(this,"States",new SCreator(States_factory)); -new Sfactory(this,"TypecastExpression_2",new SCreator(TypecastExpression_2_factory)); -new Sfactory(this,"ArgumentList_2",new SCreator(ArgumentList_2_factory)); -new Sfactory(this,"StateBody_14",new SCreator(StateBody_14_factory)); -new Sfactory(this,"KeyArgEvent_1",new SCreator(KeyArgEvent_1_factory)); -new Sfactory(this,"VectorConstant",new SCreator(VectorConstant_factory)); -new Sfactory(this,"SimpleAssignment_3",new SCreator(SimpleAssignment_3_factory)); -new Sfactory(this,"Typename_5",new SCreator(Typename_5_factory)); -new Sfactory(this,"TypecastExpression_8",new SCreator(TypecastExpression_8_factory)); -new Sfactory(this,"SimpleAssignment_21",new SCreator(SimpleAssignment_21_factory)); -new Sfactory(this,"JumpLabel_1",new SCreator(JumpLabel_1_factory)); -new Sfactory(this,"TypecastExpression_4",new SCreator(TypecastExpression_4_factory)); -new Sfactory(this,"JumpStatement_1",new SCreator(JumpStatement_1_factory)); -new Sfactory(this,"VoidArgEvent_8",new SCreator(VoidArgEvent_8_factory)); -new Sfactory(this,"GlobalVariableDeclaration_2",new SCreator(GlobalVariableDeclaration_2_factory)); -new Sfactory(this,"GlobalVariableDeclaration_1",new SCreator(GlobalVariableDeclaration_1_factory)); -new Sfactory(this,"RotDeclaration_1",new SCreator(RotDeclaration_1_factory)); -new Sfactory(this,"WhileStatement_1",new SCreator(WhileStatement_1_factory)); -new Sfactory(this,"VecDeclaration_1",new SCreator(VecDeclaration_1_factory)); -new Sfactory(this,"IntRotRotArgStateEvent",new SCreator(IntRotRotArgStateEvent_factory)); -new Sfactory(this,"Constant_3",new SCreator(Constant_3_factory)); -new Sfactory(this,"Declaration",new SCreator(Declaration_factory)); -new Sfactory(this,"IntVecVecArgStateEvent_1",new SCreator(IntVecVecArgStateEvent_1_factory)); -new Sfactory(this,"ArgumentDeclarationList_5",new SCreator(ArgumentDeclarationList_5_factory)); -new Sfactory(this,"ReturnStatement",new SCreator(ReturnStatement_factory)); -new Sfactory(this,"EmptyStatement_1",new SCreator(EmptyStatement_1_factory)); -} -public static object IncrementDecrementExpression_1_factory(Parser yyp) { return new IncrementDecrementExpression_1(yyp); } -public static object StateChange_factory(Parser yyp) { return new StateChange(yyp); } -public static object ArgumentDeclarationList_3_factory(Parser yyp) { return new ArgumentDeclarationList_3(yyp); } -public static object BinaryExpression_factory(Parser yyp) { return new BinaryExpression(yyp); } -public static object VoidArgEvent_5_factory(Parser yyp) { return new VoidArgEvent_5(yyp); } -public static object IdentDotExpression_1_factory(Parser yyp) { return new IdentDotExpression_1(yyp); } -public static object StateBody_10_factory(Parser yyp) { return new StateBody_10(yyp); } -public static object VectorArgEvent_1_factory(Parser yyp) { return new VectorArgEvent_1(yyp); } -public static object ReturnStatement_1_factory(Parser yyp) { return new ReturnStatement_1(yyp); } -public static object ReturnStatement_2_factory(Parser yyp) { return new ReturnStatement_2(yyp); } -public static object Typename_7_factory(Parser yyp) { return new Typename_7(yyp); } -public static object ExpressionArgument_factory(Parser yyp) { return new ExpressionArgument(yyp); } -public static object ForLoop_factory(Parser yyp) { return new ForLoop(yyp); } -public static object GlobalDefinitions_factory(Parser yyp) { return new GlobalDefinitions(yyp); } -public static object Typename_1_factory(Parser yyp) { return new Typename_1(yyp); } -public static object TypecastExpression_3_factory(Parser yyp) { return new TypecastExpression_3(yyp); } -public static object IncrementDecrementExpression_6_factory(Parser yyp) { return new IncrementDecrementExpression_6(yyp); } -public static object SimpleAssignment_2_factory(Parser yyp) { return new SimpleAssignment_2(yyp); } -public static object IntVecVecArgEvent_1_factory(Parser yyp) { return new IntVecVecArgEvent_1(yyp); } -public static object LSLProgramRoot_2_factory(Parser yyp) { return new LSLProgramRoot_2(yyp); } -public static object IdentDotExpression_factory(Parser yyp) { return new IdentDotExpression(yyp); } -public static object UnaryExpression_1_factory(Parser yyp) { return new UnaryExpression_1(yyp); } -public static object RotationConstant_factory(Parser yyp) { return new RotationConstant(yyp); } -public static object IntArgumentDeclarationList_factory(Parser yyp) { return new IntArgumentDeclarationList(yyp); } -public static object ArgumentList_factory(Parser yyp) { return new ArgumentList(yyp); } -public static object BinaryExpression_3_factory(Parser yyp) { return new BinaryExpression_3(yyp); } -public static object Event_2_factory(Parser yyp) { return new Event_2(yyp); } -public static object ArgumentList_4_factory(Parser yyp) { return new ArgumentList_4(yyp); } -public static object IntVecVecArgEvent_factory(Parser yyp) { return new IntVecVecArgEvent(yyp); } -public static object WhileStatement_2_factory(Parser yyp) { return new WhileStatement_2(yyp); } -public static object Assignment_factory(Parser yyp) { return new Assignment(yyp); } -public static object Statement_12_factory(Parser yyp) { return new Statement_12(yyp); } -public static object IncrementDecrementExpression_8_factory(Parser yyp) { return new IncrementDecrementExpression_8(yyp); } -public static object VectorArgEvent_2_factory(Parser yyp) { return new VectorArgEvent_2(yyp); } -public static object Constant_2_factory(Parser yyp) { return new Constant_2(yyp); } -public static object Statement_1_factory(Parser yyp) { return new Statement_1(yyp); } -public static object VectorArgEvent_factory(Parser yyp) { return new VectorArgEvent(yyp); } -public static object ForLoopStatement_1_factory(Parser yyp) { return new ForLoopStatement_1(yyp); } -public static object IncrementDecrementExpression_2_factory(Parser yyp) { return new IncrementDecrementExpression_2(yyp); } -public static object IntArgumentDeclarationList_1_factory(Parser yyp) { return new IntArgumentDeclarationList_1(yyp); } -public static object VoidArgEvent_4_factory(Parser yyp) { return new VoidArgEvent_4(yyp); } -public static object ForLoop_1_factory(Parser yyp) { return new ForLoop_1(yyp); } -public static object Typename_4_factory(Parser yyp) { return new Typename_4(yyp); } -public static object IdentExpression_factory(Parser yyp) { return new IdentExpression(yyp); } -public static object ForLoop_2_factory(Parser yyp) { return new ForLoop_2(yyp); } -public static object DoWhileStatement_factory(Parser yyp) { return new DoWhileStatement(yyp); } -public static object SimpleAssignment_6_factory(Parser yyp) { return new SimpleAssignment_6(yyp); } -public static object IntDeclaration_1_factory(Parser yyp) { return new IntDeclaration_1(yyp); } -public static object State_1_factory(Parser yyp) { return new State_1(yyp); } -public static object StateBody_9_factory(Parser yyp) { return new StateBody_9(yyp); } -public static object StateBody_8_factory(Parser yyp) { return new StateBody_8(yyp); } -public static object State_2_factory(Parser yyp) { return new State_2(yyp); } -public static object StateBody_3_factory(Parser yyp) { return new StateBody_3(yyp); } -public static object StateBody_2_factory(Parser yyp) { return new StateBody_2(yyp); } -public static object StateBody_1_factory(Parser yyp) { return new StateBody_1(yyp); } -public static object Typename_6_factory(Parser yyp) { return new Typename_6(yyp); } -public static object StateBody_7_factory(Parser yyp) { return new StateBody_7(yyp); } -public static object StateBody_4_factory(Parser yyp) { return new StateBody_4(yyp); } -public static object IfStatement_1_factory(Parser yyp) { return new IfStatement_1(yyp); } -public static object IfStatement_3_factory(Parser yyp) { return new IfStatement_3(yyp); } -public static object IfStatement_2_factory(Parser yyp) { return new IfStatement_2(yyp); } -public static object SimpleAssignment_1_factory(Parser yyp) { return new SimpleAssignment_1(yyp); } -public static object VoidArgEvent_6_factory(Parser yyp) { return new VoidArgEvent_6(yyp); } -public static object IfStatement_factory(Parser yyp) { return new IfStatement(yyp); } -public static object ConstantExpression_factory(Parser yyp) { return new ConstantExpression(yyp); } -public static object BinaryExpression_7_factory(Parser yyp) { return new BinaryExpression_7(yyp); } -public static object IncrementDecrementExpression_factory(Parser yyp) { return new IncrementDecrementExpression(yyp); } -public static object Statement_9_factory(Parser yyp) { return new Statement_9(yyp); } -public static object IntVecVecArgStateEvent_factory(Parser yyp) { return new IntVecVecArgStateEvent(yyp); } -public static object Declaration_1_factory(Parser yyp) { return new Declaration_1(yyp); } -public static object KeyIntIntArgumentDeclarationList_factory(Parser yyp) { return new KeyIntIntArgumentDeclarationList(yyp); } -public static object VectorArgumentDeclarationList_1_factory(Parser yyp) { return new VectorArgumentDeclarationList_1(yyp); } -public static object SimpleAssignment_factory(Parser yyp) { return new SimpleAssignment(yyp); } -public static object BinaryExpression_9_factory(Parser yyp) { return new BinaryExpression_9(yyp); } -public static object IntDeclaration_factory(Parser yyp) { return new IntDeclaration(yyp); } -public static object IntArgEvent_10_factory(Parser yyp) { return new IntArgEvent_10(yyp); } -public static object ArgumentDeclarationList_2_factory(Parser yyp) { return new ArgumentDeclarationList_2(yyp); } -public static object ArgumentDeclarationList_1_factory(Parser yyp) { return new ArgumentDeclarationList_1(yyp); } -public static object ArgumentDeclarationList_4_factory(Parser yyp) { return new ArgumentDeclarationList_4(yyp); } -public static object SimpleAssignment_9_factory(Parser yyp) { return new SimpleAssignment_9(yyp); } -public static object ForLoopStatement_2_factory(Parser yyp) { return new ForLoopStatement_2(yyp); } -public static object StatementList_factory(Parser yyp) { return new StatementList(yyp); } -public static object StateBody_13_factory(Parser yyp) { return new StateBody_13(yyp); } -public static object Typename_3_factory(Parser yyp) { return new Typename_3(yyp); } -public static object KeyArgumentDeclarationList_1_factory(Parser yyp) { return new KeyArgumentDeclarationList_1(yyp); } -public static object UnaryExpression_3_factory(Parser yyp) { return new UnaryExpression_3(yyp); } -public static object StateBody_16_factory(Parser yyp) { return new StateBody_16(yyp); } -public static object VectorArgumentDeclarationList_factory(Parser yyp) { return new VectorArgumentDeclarationList(yyp); } -public static object IntArgEvent_3_factory(Parser yyp) { return new IntArgEvent_3(yyp); } -public static object StatementList_2_factory(Parser yyp) { return new StatementList_2(yyp); } -public static object KeyArgStateEvent_factory(Parser yyp) { return new KeyArgStateEvent(yyp); } -public static object LSLProgramRoot_1_factory(Parser yyp) { return new LSLProgramRoot_1(yyp); } -public static object Typename_2_factory(Parser yyp) { return new Typename_2(yyp); } -public static object TypecastExpression_6_factory(Parser yyp) { return new TypecastExpression_6(yyp); } -public static object Event_3_factory(Parser yyp) { return new Event_3(yyp); } -public static object IntArgStateEvent_factory(Parser yyp) { return new IntArgStateEvent(yyp); } -public static object StateChange_2_factory(Parser yyp) { return new StateChange_2(yyp); } -public static object StateChange_1_factory(Parser yyp) { return new StateChange_1(yyp); } -public static object VectorConstant_1_factory(Parser yyp) { return new VectorConstant_1(yyp); } -public static object KeyDeclaration_factory(Parser yyp) { return new KeyDeclaration(yyp); } -public static object States_2_factory(Parser yyp) { return new States_2(yyp); } -public static object VoidArgEvent_factory(Parser yyp) { return new VoidArgEvent(yyp); } -public static object WhileStatement_factory(Parser yyp) { return new WhileStatement(yyp); } -public static object UnaryExpression_factory(Parser yyp) { return new UnaryExpression(yyp); } -public static object BinaryExpression_6_factory(Parser yyp) { return new BinaryExpression_6(yyp); } -public static object ConstantExpression_1_factory(Parser yyp) { return new ConstantExpression_1(yyp); } -public static object ForLoopStatement_factory(Parser yyp) { return new ForLoopStatement(yyp); } -public static object BinaryExpression_1_factory(Parser yyp) { return new BinaryExpression_1(yyp); } -public static object StateEvent_factory(Parser yyp) { return new StateEvent(yyp); } -public static object Event_5_factory(Parser yyp) { return new Event_5(yyp); } -public static object SimpleAssignment_5_factory(Parser yyp) { return new SimpleAssignment_5(yyp); } -public static object RotationConstant_1_factory(Parser yyp) { return new RotationConstant_1(yyp); } -public static object Constant_factory(Parser yyp) { return new Constant(yyp); } -public static object IntArgEvent_1_factory(Parser yyp) { return new IntArgEvent_1(yyp); } -public static object SimpleAssignment_8_factory(Parser yyp) { return new SimpleAssignment_8(yyp); } -public static object ForLoopStatement_3_factory(Parser yyp) { return new ForLoopStatement_3(yyp); } -public static object IntArgEvent_2_factory(Parser yyp) { return new IntArgEvent_2(yyp); } -public static object LSLProgramRoot_factory(Parser yyp) { return new LSLProgramRoot(yyp); } -public static object StateBody_12_factory(Parser yyp) { return new StateBody_12(yyp); } -public static object IntArgEvent_4_factory(Parser yyp) { return new IntArgEvent_4(yyp); } -public static object IntArgEvent_7_factory(Parser yyp) { return new IntArgEvent_7(yyp); } -public static object IntArgEvent_6_factory(Parser yyp) { return new IntArgEvent_6(yyp); } -public static object IntArgEvent_9_factory(Parser yyp) { return new IntArgEvent_9(yyp); } -public static object TypecastExpression_7_factory(Parser yyp) { return new TypecastExpression_7(yyp); } -public static object StateBody_15_factory(Parser yyp) { return new StateBody_15(yyp); } -public static object VoidArgStateEvent_1_factory(Parser yyp) { return new VoidArgStateEvent_1(yyp); } -public static object error_factory(Parser yyp) { return new error(yyp); } -public static object TypecastExpression_1_factory(Parser yyp) { return new TypecastExpression_1(yyp); } -public static object GlobalDefinitions_4_factory(Parser yyp) { return new GlobalDefinitions_4(yyp); } -public static object GlobalDefinitions_3_factory(Parser yyp) { return new GlobalDefinitions_3(yyp); } -public static object GlobalDefinitions_2_factory(Parser yyp) { return new GlobalDefinitions_2(yyp); } -public static object GlobalDefinitions_1_factory(Parser yyp) { return new GlobalDefinitions_1(yyp); } -public static object ArgumentList_1_factory(Parser yyp) { return new ArgumentList_1(yyp); } -public static object IncrementDecrementExpression_7_factory(Parser yyp) { return new IncrementDecrementExpression_7(yyp); } -public static object UnaryExpression_2_factory(Parser yyp) { return new UnaryExpression_2(yyp); } -public static object Argument_factory(Parser yyp) { return new Argument(yyp); } -public static object SimpleAssignment_24_factory(Parser yyp) { return new SimpleAssignment_24(yyp); } -public static object ExpressionArgument_1_factory(Parser yyp) { return new ExpressionArgument_1(yyp); } -public static object EmptyStatement_factory(Parser yyp) { return new EmptyStatement(yyp); } -public static object KeyIntIntArgStateEvent_factory(Parser yyp) { return new KeyIntIntArgStateEvent(yyp); } -public static object VectorArgStateEvent_1_factory(Parser yyp) { return new VectorArgStateEvent_1(yyp); } -public static object GlobalFunctionDefinition_1_factory(Parser yyp) { return new GlobalFunctionDefinition_1(yyp); } -public static object FunctionCallExpression_1_factory(Parser yyp) { return new FunctionCallExpression_1(yyp); } -public static object DoWhileStatement_2_factory(Parser yyp) { return new DoWhileStatement_2(yyp); } -public static object VoidArgEvent_1_factory(Parser yyp) { return new VoidArgEvent_1(yyp); } -public static object KeyArgumentDeclarationList_factory(Parser yyp) { return new KeyArgumentDeclarationList(yyp); } -public static object KeyIntIntArgEvent_factory(Parser yyp) { return new KeyIntIntArgEvent(yyp); } -public static object ListConstant_1_factory(Parser yyp) { return new ListConstant_1(yyp); } -public static object StateEvent_1_factory(Parser yyp) { return new StateEvent_1(yyp); } -public static object SimpleAssignment_20_factory(Parser yyp) { return new SimpleAssignment_20(yyp); } -public static object SimpleAssignment_23_factory(Parser yyp) { return new SimpleAssignment_23(yyp); } -public static object SimpleAssignment_22_factory(Parser yyp) { return new SimpleAssignment_22(yyp); } -public static object IntArgEvent_5_factory(Parser yyp) { return new IntArgEvent_5(yyp); } -public static object ParenthesisExpression_factory(Parser yyp) { return new ParenthesisExpression(yyp); } -public static object JumpStatement_factory(Parser yyp) { return new JumpStatement(yyp); } -public static object IntRotRotArgumentDeclarationList_1_factory(Parser yyp) { return new IntRotRotArgumentDeclarationList_1(yyp); } -public static object SimpleAssignment_4_factory(Parser yyp) { return new SimpleAssignment_4(yyp); } -public static object KeyArgEvent_factory(Parser yyp) { return new KeyArgEvent(yyp); } -public static object Assignment_2_factory(Parser yyp) { return new Assignment_2(yyp); } -public static object ForLoopStatement_4_factory(Parser yyp) { return new ForLoopStatement_4(yyp); } -public static object Statement_13_factory(Parser yyp) { return new Statement_13(yyp); } -public static object RotDeclaration_factory(Parser yyp) { return new RotDeclaration(yyp); } -public static object StateBody_11_factory(Parser yyp) { return new StateBody_11(yyp); } -public static object KeyArgEvent_2_factory(Parser yyp) { return new KeyArgEvent_2(yyp); } -public static object StatementList_1_factory(Parser yyp) { return new StatementList_1(yyp); } -public static object StateBody_6_factory(Parser yyp) { return new StateBody_6(yyp); } -public static object Constant_1_factory(Parser yyp) { return new Constant_1(yyp); } -public static object VecDeclaration_factory(Parser yyp) { return new VecDeclaration(yyp); } -public static object TypecastExpression_5_factory(Parser yyp) { return new TypecastExpression_5(yyp); } -public static object GlobalFunctionDefinition_2_factory(Parser yyp) { return new GlobalFunctionDefinition_2(yyp); } -public static object KeyIntIntArgEvent_1_factory(Parser yyp) { return new KeyIntIntArgEvent_1(yyp); } -public static object Constant_4_factory(Parser yyp) { return new Constant_4(yyp); } -public static object TypecastExpression_9_factory(Parser yyp) { return new TypecastExpression_9(yyp); } -public static object IntRotRotArgStateEvent_1_factory(Parser yyp) { return new IntRotRotArgStateEvent_1(yyp); } -public static object IncrementDecrementExpression_3_factory(Parser yyp) { return new IncrementDecrementExpression_3(yyp); } -public static object States_1_factory(Parser yyp) { return new States_1(yyp); } -public static object GlobalVariableDeclaration_factory(Parser yyp) { return new GlobalVariableDeclaration(yyp); } -public static object VoidArgEvent_3_factory(Parser yyp) { return new VoidArgEvent_3(yyp); } -public static object Assignment_1_factory(Parser yyp) { return new Assignment_1(yyp); } -public static object BinaryExpression_5_factory(Parser yyp) { return new BinaryExpression_5(yyp); } -public static object IfStatement_4_factory(Parser yyp) { return new IfStatement_4(yyp); } -public static object IntVecVecArgumentDeclarationList_1_factory(Parser yyp) { return new IntVecVecArgumentDeclarationList_1(yyp); } -public static object KeyIntIntArgumentDeclarationList_1_factory(Parser yyp) { return new KeyIntIntArgumentDeclarationList_1(yyp); } -public static object Statement_factory(Parser yyp) { return new Statement(yyp); } -public static object ParenthesisExpression_1_factory(Parser yyp) { return new ParenthesisExpression_1(yyp); } -public static object ParenthesisExpression_2_factory(Parser yyp) { return new ParenthesisExpression_2(yyp); } -public static object DoWhileStatement_1_factory(Parser yyp) { return new DoWhileStatement_1(yyp); } -public static object VoidArgStateEvent_factory(Parser yyp) { return new VoidArgStateEvent(yyp); } -public static object GlobalFunctionDefinition_factory(Parser yyp) { return new GlobalFunctionDefinition(yyp); } -public static object Event_4_factory(Parser yyp) { return new Event_4(yyp); } -public static object IntArgEvent_factory(Parser yyp) { return new IntArgEvent(yyp); } -public static object SimpleAssignment_11_factory(Parser yyp) { return new SimpleAssignment_11(yyp); } -public static object SimpleAssignment_10_factory(Parser yyp) { return new SimpleAssignment_10(yyp); } -public static object SimpleAssignment_13_factory(Parser yyp) { return new SimpleAssignment_13(yyp); } -public static object SimpleAssignment_12_factory(Parser yyp) { return new SimpleAssignment_12(yyp); } -public static object SimpleAssignment_15_factory(Parser yyp) { return new SimpleAssignment_15(yyp); } -public static object SimpleAssignment_14_factory(Parser yyp) { return new SimpleAssignment_14(yyp); } -public static object SimpleAssignment_17_factory(Parser yyp) { return new SimpleAssignment_17(yyp); } -public static object SimpleAssignment_16_factory(Parser yyp) { return new SimpleAssignment_16(yyp); } -public static object SimpleAssignment_19_factory(Parser yyp) { return new SimpleAssignment_19(yyp); } -public static object SimpleAssignment_18_factory(Parser yyp) { return new SimpleAssignment_18(yyp); } -public static object IntVecVecArgumentDeclarationList_factory(Parser yyp) { return new IntVecVecArgumentDeclarationList(yyp); } -public static object StateBody_5_factory(Parser yyp) { return new StateBody_5(yyp); } -public static object BinaryExpression_17_factory(Parser yyp) { return new BinaryExpression_17(yyp); } -public static object BinaryExpression_16_factory(Parser yyp) { return new BinaryExpression_16(yyp); } -public static object BinaryExpression_15_factory(Parser yyp) { return new BinaryExpression_15(yyp); } -public static object BinaryExpression_14_factory(Parser yyp) { return new BinaryExpression_14(yyp); } -public static object BinaryExpression_13_factory(Parser yyp) { return new BinaryExpression_13(yyp); } -public static object BinaryExpression_12_factory(Parser yyp) { return new BinaryExpression_12(yyp); } -public static object BinaryExpression_11_factory(Parser yyp) { return new BinaryExpression_11(yyp); } -public static object BinaryExpression_10_factory(Parser yyp) { return new BinaryExpression_10(yyp); } -public static object VectorArgStateEvent_factory(Parser yyp) { return new VectorArgStateEvent(yyp); } -public static object Statement_10_factory(Parser yyp) { return new Statement_10(yyp); } -public static object BinaryExpression_8_factory(Parser yyp) { return new BinaryExpression_8(yyp); } -public static object BinaryExpression_18_factory(Parser yyp) { return new BinaryExpression_18(yyp); } -public static object BinaryExpression_2_factory(Parser yyp) { return new BinaryExpression_2(yyp); } -public static object FunctionCallExpression_factory(Parser yyp) { return new FunctionCallExpression(yyp); } -public static object VectorArgEvent_3_factory(Parser yyp) { return new VectorArgEvent_3(yyp); } -public static object IdentExpression_1_factory(Parser yyp) { return new IdentExpression_1(yyp); } -public static object IntArgEvent_8_factory(Parser yyp) { return new IntArgEvent_8(yyp); } -public static object VoidArgEvent_7_factory(Parser yyp) { return new VoidArgEvent_7(yyp); } -public static object IncrementDecrementExpression_4_factory(Parser yyp) { return new IncrementDecrementExpression_4(yyp); } -public static object FunctionCall_factory(Parser yyp) { return new FunctionCall(yyp); } -public static object ArgumentList_3_factory(Parser yyp) { return new ArgumentList_3(yyp); } -public static object KeyIntIntArgStateEvent_1_factory(Parser yyp) { return new KeyIntIntArgStateEvent_1(yyp); } -public static object IntRotRotArgumentDeclarationList_factory(Parser yyp) { return new IntRotRotArgumentDeclarationList(yyp); } -public static object KeyDeclaration_1_factory(Parser yyp) { return new KeyDeclaration_1(yyp); } -public static object BinaryExpression_4_factory(Parser yyp) { return new BinaryExpression_4(yyp); } -public static object FunctionCall_1_factory(Parser yyp) { return new FunctionCall_1(yyp); } -public static object KeyArgStateEvent_1_factory(Parser yyp) { return new KeyArgStateEvent_1(yyp); } -public static object IntArgStateEvent_1_factory(Parser yyp) { return new IntArgStateEvent_1(yyp); } -public static object Event_factory(Parser yyp) { return new Event(yyp); } -public static object IntRotRotArgEvent_factory(Parser yyp) { return new IntRotRotArgEvent(yyp); } -public static object SimpleAssignment_7_factory(Parser yyp) { return new SimpleAssignment_7(yyp); } -public static object Statement_3_factory(Parser yyp) { return new Statement_3(yyp); } -public static object Expression_factory(Parser yyp) { return new Expression(yyp); } -public static object CompoundStatement_2_factory(Parser yyp) { return new CompoundStatement_2(yyp); } -public static object CompoundStatement_1_factory(Parser yyp) { return new CompoundStatement_1(yyp); } -public static object JumpLabel_factory(Parser yyp) { return new JumpLabel(yyp); } -public static object State_factory(Parser yyp) { return new State(yyp); } -public static object TypecastExpression_factory(Parser yyp) { return new TypecastExpression(yyp); } -public static object IntRotRotArgEvent_1_factory(Parser yyp) { return new IntRotRotArgEvent_1(yyp); } -public static object Statement_11_factory(Parser yyp) { return new Statement_11(yyp); } -public static object VoidArgEvent_2_factory(Parser yyp) { return new VoidArgEvent_2(yyp); } -public static object Typename_factory(Parser yyp) { return new Typename(yyp); } -public static object ArgumentDeclarationList_factory(Parser yyp) { return new ArgumentDeclarationList(yyp); } -public static object StateBody_factory(Parser yyp) { return new StateBody(yyp); } -public static object Event_8_factory(Parser yyp) { return new Event_8(yyp); } -public static object Event_9_factory(Parser yyp) { return new Event_9(yyp); } -public static object Event_6_factory(Parser yyp) { return new Event_6(yyp); } -public static object Event_7_factory(Parser yyp) { return new Event_7(yyp); } -public static object Statement_8_factory(Parser yyp) { return new Statement_8(yyp); } -public static object CompoundStatement_factory(Parser yyp) { return new CompoundStatement(yyp); } -public static object Event_1_factory(Parser yyp) { return new Event_1(yyp); } -public static object Statement_4_factory(Parser yyp) { return new Statement_4(yyp); } -public static object Statement_5_factory(Parser yyp) { return new Statement_5(yyp); } -public static object Statement_6_factory(Parser yyp) { return new Statement_6(yyp); } -public static object Statement_7_factory(Parser yyp) { return new Statement_7(yyp); } -public static object IncrementDecrementExpression_5_factory(Parser yyp) { return new IncrementDecrementExpression_5(yyp); } -public static object Statement_2_factory(Parser yyp) { return new Statement_2(yyp); } -public static object ListConstant_factory(Parser yyp) { return new ListConstant(yyp); } -public static object States_factory(Parser yyp) { return new States(yyp); } -public static object TypecastExpression_2_factory(Parser yyp) { return new TypecastExpression_2(yyp); } -public static object ArgumentList_2_factory(Parser yyp) { return new ArgumentList_2(yyp); } -public static object StateBody_14_factory(Parser yyp) { return new StateBody_14(yyp); } -public static object KeyArgEvent_1_factory(Parser yyp) { return new KeyArgEvent_1(yyp); } -public static object VectorConstant_factory(Parser yyp) { return new VectorConstant(yyp); } -public static object SimpleAssignment_3_factory(Parser yyp) { return new SimpleAssignment_3(yyp); } -public static object Typename_5_factory(Parser yyp) { return new Typename_5(yyp); } -public static object TypecastExpression_8_factory(Parser yyp) { return new TypecastExpression_8(yyp); } -public static object SimpleAssignment_21_factory(Parser yyp) { return new SimpleAssignment_21(yyp); } -public static object JumpLabel_1_factory(Parser yyp) { return new JumpLabel_1(yyp); } -public static object TypecastExpression_4_factory(Parser yyp) { return new TypecastExpression_4(yyp); } -public static object JumpStatement_1_factory(Parser yyp) { return new JumpStatement_1(yyp); } -public static object VoidArgEvent_8_factory(Parser yyp) { return new VoidArgEvent_8(yyp); } -public static object GlobalVariableDeclaration_2_factory(Parser yyp) { return new GlobalVariableDeclaration_2(yyp); } -public static object GlobalVariableDeclaration_1_factory(Parser yyp) { return new GlobalVariableDeclaration_1(yyp); } -public static object RotDeclaration_1_factory(Parser yyp) { return new RotDeclaration_1(yyp); } -public static object WhileStatement_1_factory(Parser yyp) { return new WhileStatement_1(yyp); } -public static object VecDeclaration_1_factory(Parser yyp) { return new VecDeclaration_1(yyp); } -public static object IntRotRotArgStateEvent_factory(Parser yyp) { return new IntRotRotArgStateEvent(yyp); } -public static object Constant_3_factory(Parser yyp) { return new Constant_3(yyp); } -public static object Declaration_factory(Parser yyp) { return new Declaration(yyp); } -public static object IntVecVecArgStateEvent_1_factory(Parser yyp) { return new IntVecVecArgStateEvent_1(yyp); } -public static object ArgumentDeclarationList_5_factory(Parser yyp) { return new ArgumentDeclarationList_5(yyp); } -public static object ReturnStatement_factory(Parser yyp) { return new ReturnStatement(yyp); } -public static object EmptyStatement_1_factory(Parser yyp) { return new EmptyStatement_1(yyp); } -} -public class LSLSyntax -: Parser { -public LSLSyntax -():base(new yyLSLSyntax -(),new LSLTokens()) {} -public LSLSyntax -(YyParser syms):base(syms,new LSLTokens()) {} -public LSLSyntax -(YyParser syms,ErrorHandler erh):base(syms,new LSLTokens(erh)) {} - - } -} diff --git a/OpenSim/Region/ScriptEngine/Shared/Instance/ScriptInstance.cs b/OpenSim/Region/ScriptEngine/Shared/Instance/ScriptInstance.cs deleted file mode 100644 index d9c10c02ca..0000000000 --- a/OpenSim/Region/ScriptEngine/Shared/Instance/ScriptInstance.cs +++ /dev/null @@ -1,1405 +0,0 @@ -/* - * Copyright (c) Contributors, http://opensimulator.org/ - * See CONTRIBUTORS.TXT for a full list of copyright holders. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: - * * Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * * Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * * Neither the name of the OpenSimulator Project nor the - * names of its contributors may be used to endorse or promote products - * derived from this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE DEVELOPERS ``AS IS'' AND ANY - * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR ANY - * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - */ - -using System; -using System.Collections; -using System.Collections.Generic; -using System.Globalization; -using System.IO; -using System.Reflection; -using System.Runtime.Remoting; -using System.Runtime.Remoting.Lifetime; -using System.Security.Policy; -using System.Text; -using System.Threading; -using System.Xml; -using OpenMetaverse; -using log4net; -using Nini.Config; -using Amib.Threading; -using OpenSim.Framework; -using OpenSim.Region.CoreModules; -using OpenSim.Region.Framework.Scenes; -using OpenSim.Region.Framework.Interfaces; -using OpenSim.Region.ScriptEngine.Shared; -using OpenSim.Region.ScriptEngine.Shared.Api; -using OpenSim.Region.ScriptEngine.Shared.Api.Runtime; -using OpenSim.Region.ScriptEngine.Shared.ScriptBase; -using OpenSim.Region.ScriptEngine.Shared.CodeTools; -using OpenSim.Region.ScriptEngine.Interfaces; - -using System.Diagnostics; //for [DebuggerNonUserCode] - -namespace OpenSim.Region.ScriptEngine.Shared.Instance -{ - public class ScriptInstance : MarshalByRefObject, IScriptInstance - { - private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType); - - public bool StatePersistedHere { get { return m_AttachedAvatar.IsZero(); } } - - /// - /// The current work item if an event for this script is running or waiting to run, - /// - /// - /// Null if there is no running or waiting to run event. Must be changed only under an EventQueue lock. - /// - private IScriptWorkItem m_CurrentWorkItem; - - private IScript m_Script; - private DetectParams[] m_DetectParams; - private bool m_TimerQueued; - private DateTime m_EventStart; - private bool m_InEvent; - private string m_assemblyPath; - private string m_dataPath; - private string m_CurrentEvent = String.Empty; - private bool m_InSelfDelete; - private int m_MaxScriptQueue; - private bool m_SaveState; - private int m_ControlEventsInQueue; - private int m_LastControlLevel; - private bool m_CollisionInQueue; - private bool m_StateChangeInProgress; - - // The following is for setting a minimum delay between events - private double m_minEventDelay; - - private long m_eventDelayTicks; - private long m_nextEventTimeTicks; - private bool m_startOnInit = true; - private UUID m_AttachedAvatar; - private StateSource m_stateSource; - private bool m_postOnRez; - private bool m_startedFromSavedState; - private UUID m_CurrentStateHash; - private UUID m_RegionID; - - public int DebugLevel { get; set; } - - public WaitHandle CoopWaitHandle { get; private set; } - public Stopwatch ExecutionTimer { get; private set; } - - public Dictionary, KeyValuePair> LineMap { get; set; } - - private Dictionary m_Apis = new Dictionary(); - - public Object[] PluginData = new Object[0]; - - /// - /// Used by llMinEventDelay to suppress events happening any faster than this speed. - /// This currently restricts all events in one go. Not sure if each event type has - /// its own check so take the simple route first. - /// - public double MinEventDelay - { - get { return m_minEventDelay; } - set - { - if (value > 0.001) - m_minEventDelay = value; - else - m_minEventDelay = 0.0; - - m_eventDelayTicks = (long)(m_minEventDelay * 10000000L); - m_nextEventTimeTicks = DateTime.Now.Ticks; - } - } - - public bool Running - { - get { return m_running; } - - set - { - m_running = value; - if (m_running) - StayStopped = false; - } - } - private bool m_running; - - public bool Suspended - { - get { return m_Suspended; } - - set - { - // Need to do this inside a lock in order to avoid races with EventProcessor() - lock (m_Script) - { - bool wasSuspended = m_Suspended; - m_Suspended = value; - - if (wasSuspended && !m_Suspended) - { - lock (EventQueue) - { - // Need to place ourselves back in a work item if there are events to process - if (EventQueue.Count > 0 && Running && !ShuttingDown) - m_CurrentWorkItem = Engine.QueueEventHandler(this); - } - } - } - } - } - private bool m_Suspended; - - public bool ShuttingDown { get; set; } - - public string State { get; set; } - - public bool StayStopped { get; set; } - - public IScriptEngine Engine { get; private set; } - - public UUID AppDomain { get; set; } - - public SceneObjectPart Part { get; private set; } - - public string PrimName { get; private set; } - - public string ScriptName { get; private set; } - - public UUID ItemID { get; private set; } - - public UUID ObjectID { get { return Part.UUID; } } - - public uint LocalID { get { return Part.LocalId; } } - - public UUID RootObjectID { get { return Part.ParentGroup.UUID; } } - - public uint RootLocalID { get { return Part.ParentGroup.LocalId; } } - - public UUID AssetID { get; private set; } - - public Queue EventQueue { get; private set; } - - public long EventsQueued - { - get - { - lock (EventQueue) - return EventQueue.Count; - } - } - - public long EventsProcessed { get; private set; } - - public int StartParam { get; set; } - - public TaskInventoryItem ScriptTask { get; private set; } - - public DateTime TimeStarted { get; private set; } - - public MetricsCollectorTime ExecutionTime { get; private set; } - - private static readonly int MeasurementWindow = 30 * 1000; // show the *recent* time used by the script, to find currently active scripts - - private bool m_coopTermination; - - private EventWaitHandle m_coopSleepHandle; - - public void ClearQueue() - { - m_TimerQueued = false; - m_StateChangeInProgress = false; - EventQueue.Clear(); - } - - public ScriptInstance( - IScriptEngine engine, SceneObjectPart part, TaskInventoryItem item, - int startParam, bool postOnRez, - int maxScriptQueue) - { - State = "default"; - EventQueue = new Queue(32); - ExecutionTimer = new Stopwatch(); - - Engine = engine; - Part = part; - ScriptTask = item; - - // This is currently only here to allow regression tests to get away without specifying any inventory - // item when they are testing script logic that doesn't require an item. - if (ScriptTask != null) - { - ScriptName = ScriptTask.Name; - ItemID = ScriptTask.ItemID; - AssetID = ScriptTask.AssetID; - } - - PrimName = part.ParentGroup.Name; - StartParam = startParam; - m_MaxScriptQueue = maxScriptQueue; - m_postOnRez = postOnRez; - m_AttachedAvatar = part.ParentGroup.AttachedAvatar; - m_RegionID = part.ParentGroup.Scene.RegionInfo.RegionID; - - m_SaveState = StatePersistedHere; - - ExecutionTime = new MetricsCollectorTime(MeasurementWindow, 10); - - //m_log.DebugFormat( - // "[SCRIPT INSTANCE]: Instantiated script instance {0} (id {1}) in part {2} (id {3}) in object {4} attached avatar {5} in {6}", - // ScriptTask.Name, ScriptTask.ItemID, Part.Name, Part.UUID, Part.ParentGroup.Name, m_AttachedAvatar, Engine.World.Name); - } - - /// - /// Load the script from an assembly into an AppDomain. - /// - /// - /// - /// - /// Path for all script associated data (state, etc.). In a multi-region set up - /// with all scripts loading into the same AppDomain this may not be the same place as the DLL itself. - /// - /// - /// false if load failed, true if suceeded - public bool Load( - IScript script, EventWaitHandle coopSleepHandle, string assemblyPath, - string dataPath, StateSource stateSource, bool coopTermination) - { - m_Script = script; - m_coopSleepHandle = coopSleepHandle; - m_assemblyPath = assemblyPath; - m_dataPath = dataPath; - m_stateSource = stateSource; - m_coopTermination = coopTermination; - - if (m_coopTermination) - CoopWaitHandle = coopSleepHandle; - else - CoopWaitHandle = null; - - ApiManager am = new ApiManager(); - - foreach (string api in am.GetApis()) - { - m_Apis[api] = am.CreateApi(api); - m_Apis[api].Initialize(Engine, Part, ScriptTask); - } - - try - { - foreach (KeyValuePair kv in m_Apis) - { - m_Script.InitApi(kv.Key, kv.Value); - } - } - catch (Exception e) - { - m_log.ErrorFormat( - "[SCRIPT INSTANCE]: Not starting script {0} (id {1}) in part {2} (id {3}) in object {4} in {5}. Error initializing script instance. Exception {6}{7}", - ScriptTask.Name, ScriptTask.ItemID, Part.Name, Part.UUID, Part.ParentGroup.Name, Engine.World.Name, e.Message, e.StackTrace); - - return false; - } - - // For attachments, XEngine saves the state into a .state file when XEngine.SetXMLState() is called. - string savedState = Path.Combine(m_dataPath, ItemID.ToString() + ".state"); - - if (File.Exists(savedState)) - { - // m_log.DebugFormat( - // "[SCRIPT INSTANCE]: Found state for script {0} for {1} ({2}) at {3} in {4}", - // ItemID, savedState, Part.Name, Part.ParentGroup.Name, Part.ParentGroup.Scene.Name); - - string xml = String.Empty; - - try - { - FileInfo fi = new FileInfo(savedState); - int size = (int)fi.Length; - if (size < 512000) - { - using (FileStream fs = File.Open(savedState, - FileMode.Open, FileAccess.Read, FileShare.None)) - { - Byte[] data = new Byte[size]; - fs.Read(data, 0, size); - - xml = Encoding.UTF8.GetString(data); - - ScriptSerializer.Deserialize(xml, this); - - AsyncCommandManager.CreateFromData(Engine, - LocalID, ItemID, ObjectID, - PluginData); - - //m_log.DebugFormat("[Script] Successfully retrieved state for script {0}.{1}", PrimName, m_ScriptName); - - if (!Running) - m_startOnInit = false; - - Running = false; - - // we get new rez events on sim restart, too - // but if there is state, then we fire the change - // event - - // We loaded state, don't force a re-save - m_SaveState = false; - m_startedFromSavedState = true; - } - - // If this script is in an attachment then we no longer need the state file. - if (!StatePersistedHere) - RemoveState(); - } - //else - //{ - // m_log.WarnFormat( - // "[SCRIPT INSTANCE]: Not starting script {0} (id {1}) in part {2} (id {3}) in object {4} in {5}. Unable to load script state file {6}. Memory limit exceeded.", - // ScriptTask.Name, ScriptTask.ItemID, Part.Name, Part.UUID, Part.ParentGroup.Name, Engine.World.Name, savedState); - //} - } - catch (Exception e) - { - m_log.ErrorFormat( - "[SCRIPT INSTANCE]: Not starting script {0} (id {1}) in part {2} (id {3}) in object {4} in {5}. Unable to load script state file {6}. XML is {7}. Exception {8}{9}", - ScriptTask.Name, ScriptTask.ItemID, Part.Name, Part.UUID, Part.ParentGroup.Name, Engine.World.Name, savedState, xml, e.Message, e.StackTrace); - } - } - //else - //{ - // m_log.DebugFormat( - // "[SCRIPT INSTANCE]: Did not find state for script {0} for {1} ({2}) at {3} in {4}", - // ItemID, savedState, Part.Name, Part.ParentGroup.Name, Part.ParentGroup.Scene.Name); - //} - try - { - Part.SetScriptEvents(ItemID, m_Script.GetStateEventFlags(State)); - } - catch - { - m_log.ErrorFormat("[SCRIPT INSTANCE]: failed to SetScriptEvents {0}", ItemID); - } - - return true; - } - - public void Init() - { - if (ShuttingDown) - return; - - if (m_startOnInit) - Start(); - - if (m_startedFromSavedState) - { - if (m_postOnRez) - { - PostEvent(new EventParams("on_rez", - new Object[] {new LSL_Types.LSLInteger(StartParam)}, new DetectParams[0])); - } - switch(m_stateSource) - { - case StateSource.AttachedRez: - PostEvent(new EventParams("attach", - new object[] { new LSL_Types.LSLString(m_AttachedAvatar.ToString()) }, new DetectParams[0])); - break; - case StateSource.RegionStart: - //m_log.Debug("[Script] Posted changed(CHANGED_REGION_RESTART) to script"); - PostEvent(new EventParams("changed", - new Object[] {new LSL_Types.LSLInteger((int)Changed.REGION_RESTART)}, new DetectParams[0])); - break; - case StateSource.PrimCrossing: - PostEvent(new EventParams("changed", - new Object[] {new LSL_Types.LSLInteger((int)Changed.REGION)}, new DetectParams[0])); - break; - case StateSource.Teleporting: - PostEvent(new EventParams("changed", - new Object[] {new LSL_Types.LSLInteger((int)Changed.REGION | (int)Changed.TELEPORT) }, new DetectParams[0])); - break; - } - } - else - { - if(Running & ScriptTask.ScriptRunning) - PostEvent(EventParams.StateEntryParams); - else - QueueEvent(EventParams.StateEntryParams); - - if (m_postOnRez) - { - PostEvent(new EventParams("on_rez", - new Object[] {new LSL_Types.LSLInteger(StartParam)}, new DetectParams[0])); - } - - if (m_stateSource == StateSource.AttachedRez) - { - PostEvent(new EventParams("attach", - new object[] { new LSL_Types.LSLString(m_AttachedAvatar.ToString()) }, new DetectParams[0])); - } - } - } - - private void ReleaseControlsorPermissions(bool fullpermissions) - { - SceneObjectPart part = Engine.World.GetSceneObjectPart(LocalID); - - if (part != null && part.TaskInventory != null) - { - int permsMask; - UUID permsGranter; - part.TaskInventory.LockItemsForWrite(true); - if (!part.TaskInventory.TryGetValue(ItemID, out TaskInventoryItem item)) - { - part.TaskInventory.LockItemsForWrite(false); - return; - } - permsGranter = item.PermsGranter; - permsMask = item.PermsMask; - if(fullpermissions) - { - item.PermsGranter = UUID.Zero; - item.PermsMask = 0; - } - else - item.PermsMask = permsMask & ~(ScriptBaseClass.PERMISSION_TAKE_CONTROLS | ScriptBaseClass.PERMISSION_CONTROL_CAMERA); - part.TaskInventory.LockItemsForWrite(false); - - if ((permsMask & ScriptBaseClass.PERMISSION_TAKE_CONTROLS) != 0) - { - ScenePresence presence = Engine.World.GetScenePresence(permsGranter); - if (presence != null) - presence.UnRegisterControlEventsToScript(LocalID, ItemID); - } - } - } - - public void DestroyScriptInstance() - { - ReleaseControlsorPermissions(false); - AsyncCommandManager.RemoveScript(Engine, LocalID, ItemID); - SceneObjectPart part = Engine.World.GetSceneObjectPart(LocalID); - if (part != null) - part.RemoveScriptEvents(ItemID); - } - - public void RemoveState() - { - string savedState = Path.Combine(m_dataPath, ItemID.ToString() + ".state"); - -// m_log.DebugFormat( -// "[SCRIPT INSTANCE]: Deleting state {0} for script {1} (id {2}) in part {3} (id {4}) in object {5} in {6}.", -// savedState, ScriptTask.Name, ScriptTask.ItemID, Part.Name, Part.UUID, Part.ParentGroup.Name, Engine.World.Name); - - try - { - File.Delete(savedState); - } - catch (Exception e) - { - m_log.Warn( - string.Format( - "[SCRIPT INSTANCE]: Could not delete script state {0} for script {1} (id {2}) in part {3} (id {4}) in object {5} in {6}. Exception ", - savedState, ScriptTask.Name, ScriptTask.ItemID, Part.Name, Part.UUID, Part.ParentGroup.Name, Engine.World.Name), - e); - } - } - - public void VarDump(Dictionary vars) - { - // m_log.Info("Variable dump for script "+ ItemID.ToString()); - // foreach (KeyValuePair v in vars) - // { - // m_log.Info("Variable: "+v.Key+" = "+v.Value.ToString()); - // } - } - - public void Start() - { - lock (EventQueue) - { - if (Running) - return; - - Running = true; - - TimeStarted = DateTime.Now; - - // Note: we don't reset ExecutionTime. The reason is that runaway scripts are stopped and restarted - // automatically, and we *do* want to show that they had high CPU in that case. If we had reset - // ExecutionTime here then runaway scripts, paradoxically, would never show up in the "Top Scripts" dialog. - - if (EventQueue.Count > 0) - { - if (m_CurrentWorkItem == null) - m_CurrentWorkItem = Engine.QueueEventHandler(this); - // else - // m_log.Error("[Script] Tried to start a script that was already queued"); - } - } - } - - public bool Stop(int timeout, bool clearEventQueue = false) - { - if (DebugLevel >= 1) - m_log.DebugFormat( - "[SCRIPT INSTANCE]: Stopping script {0} {1} in {2} {3} with timeout {4} {5} {6}", - ScriptName, ItemID, PrimName, ObjectID, timeout, m_InSelfDelete, DateTime.Now.Ticks); - - IScriptWorkItem workItem; - - lock (EventQueue) - { - if (clearEventQueue) - ClearQueue(); - - if (!Running) - return true; - - // If we're not running or waiting to run an event then we can safely stop. - if (m_CurrentWorkItem == null) - { - Running = false; - return true; - } - - // If we are waiting to run an event then we can try to cancel it. - if (m_CurrentWorkItem.Cancel()) - { - m_CurrentWorkItem = null; - Running = false; - return true; - } - - workItem = m_CurrentWorkItem; - Running = false; - } - - // Wait for the current event to complete. - if (!m_InSelfDelete) - { - if (!m_coopTermination) - { - // If we're not co-operative terminating then try and wait for the event to complete before stopping - if (workItem.Wait(timeout)) - return true; - } - else - { - if (DebugLevel >= 1) - m_log.DebugFormat( - "[SCRIPT INSTANCE]: Co-operatively stopping script {0} {1} in {2} {3}", - ScriptName, ItemID, PrimName, ObjectID); - - // This will terminate the event on next handle check by the script. - m_coopSleepHandle.Set(); - - // For now, we will wait forever since the event should always cleanly terminate once LSL loop - // checking is implemented. May want to allow a shorter timeout option later. - if (workItem.Wait(Timeout.Infinite)) - { - if (DebugLevel >= 1) - m_log.DebugFormat( - "[SCRIPT INSTANCE]: Co-operatively stopped script {0} {1} in {2} {3}", - ScriptName, ItemID, PrimName, ObjectID); - - return true; - } - } - } - - lock (EventQueue) - { - workItem = m_CurrentWorkItem; - } - - if (workItem == null) - return true; - - // If the event still hasn't stopped and we the stop isn't the result of script or object removal, then - // forcibly abort the work item (this aborts the underlying thread). - // Co-operative termination should never reach this point. - if (!m_InSelfDelete) - { - m_log.DebugFormat( - "[SCRIPT INSTANCE]: Aborting unstopped script {0} {1} in prim {2}, localID {3}, timeout was {4} ms", - ScriptName, ItemID, PrimName, LocalID, timeout); - - workItem.Abort(); - } - - lock (EventQueue) - { - m_CurrentWorkItem = null; - } - - return true; - } - - [DebuggerNonUserCode] //Prevents the debugger from farting in this function - public void SetState(string state) - { - if (state == State) - return; - - EventParams lastTimerEv = null; - - lock (EventQueue) - { - // Remove all queued events, remembering the last timer event - while (EventQueue.Count > 0) - { - EventParams tempv = (EventParams)EventQueue.Dequeue(); - if (tempv.EventName == "timer") lastTimerEv = tempv; - } - - // Post events - PostEvent(new EventParams("state_exit", new Object[0], - new DetectParams[0])); - PostEvent(new EventParams("state", new Object[] { state }, - new DetectParams[0])); - PostEvent(EventParams.StateEntryParams); - - // Requeue the timer event after the state changing events - if (lastTimerEv != null) EventQueue.Enqueue(lastTimerEv); - - // This will stop events from being queued and processed - // until the new state is started - m_StateChangeInProgress = true; - } - - throw new EventAbortException(); - } - - public void QueueEvent(EventParams data) - { - lock (EventQueue) - { - // The only events that persist across state changes are timers - if (m_StateChangeInProgress && data.EventName != "timer") - return; - if (EventQueue.Count >= m_MaxScriptQueue) - return; - if (data.EventName == "timer") - { - if (m_TimerQueued) - return; - m_TimerQueued = true; - } - if (data.EventName == "control") - { - int held = ((LSL_Types.LSLInteger)data.Params[1]).value; - // int changed = ((LSL_Types.LSLInteger)data.Params[2]).value; - - // If the last message was a 0 (nothing held) - // and this one is also nothing held, drop it - // - if (m_LastControlLevel == held && held == 0) - return; - - // If there is one or more queued, then queue - // only changed ones, else queue unconditionally - // - if (m_ControlEventsInQueue > 0) - { - if (m_LastControlLevel == held) - return; - } - - m_LastControlLevel = held; - m_ControlEventsInQueue++; - } - - if (data.EventName == "collision") - { - if (m_CollisionInQueue) - return; - if (data.DetectParams == null) - return; - - m_CollisionInQueue = true; - } - EventQueue.Enqueue(data); - } - } - - /// - /// Post an event to this script instance. - /// - /// - /// The request to run the event is sent - /// - /// - public void PostEvent(EventParams data) - { -// m_log.DebugFormat("[Script] Posted event {2} in state {3} to {0}.{1}", -// PrimName, ScriptName, data.EventName, State); - - if (!Running) - return; - - // If min event delay is set then ignore any events untill the time has expired - // This currently only allows 1 event of any type in the given time period. - // This may need extending to allow for a time for each individual event type. - if (m_eventDelayTicks != 0 && - data.EventName != "state" && data.EventName != "state_entry" && data.EventName != "state_exit" - && data.EventName != "run_time_permissions" && data.EventName != "http_request" && data.EventName != "link_message") - { - if (DateTime.Now.Ticks < m_nextEventTimeTicks) - return; - m_nextEventTimeTicks = DateTime.Now.Ticks + m_eventDelayTicks; - } - - lock (EventQueue) - { - // The only events that persist across state changes are timers - if (m_StateChangeInProgress && data.EventName != "timer") - return; - - if (EventQueue.Count >= m_MaxScriptQueue) - return; - - if (data.EventName == "timer") - { - if (m_TimerQueued) - return; - m_TimerQueued = true; - } - - if (data.EventName == "control") - { - int held = ((LSL_Types.LSLInteger)data.Params[1]).value; - // int changed = ((LSL_Types.LSLInteger)data.Params[2]).value; - - // If the last message was a 0 (nothing held) - // and this one is also nothing held, drop it - // - if (m_LastControlLevel == held && held == 0) - return; - - // If there is one or more queued, then queue - // only changed ones, else queue unconditionally - // - if (m_ControlEventsInQueue > 0) - { - if (m_LastControlLevel == held) - return; - } - - m_LastControlLevel = held; - m_ControlEventsInQueue++; - } - - if (data.EventName == "collision") - { - if (m_CollisionInQueue) - return; - if (data.DetectParams == null) - return; - - m_CollisionInQueue = true; - } - - EventQueue.Enqueue(data); - - if (m_CurrentWorkItem == null) - { - m_CurrentWorkItem = Engine.QueueEventHandler(this); - } - } - } - - /// - /// Process the next event queued for this script - /// - /// - public void EventProcessor() - { - // We check here as the thread stopping this instance from running may itself hold the m_Script lock. - if (!Running) - return; - - lock (m_Script) - { -// m_log.DebugFormat("[XEngine]: EventProcessor() invoked for {0}.{1}", PrimName, ScriptName); - - if (Suspended) - return; - - ExecutionTimer.Restart(); - - try - { - EventProcessorInt(); - return; - } - finally - { - ExecutionTimer.Stop(); - ExecutionTime.AddSample(ExecutionTimer); - Part.ParentGroup.Scene.AddScriptExecutionTime(ExecutionTimer.ElapsedTicks); - } - } - } - - private void EventProcessorInt() - { - EventParams data = null; - - lock (EventQueue) - { - data = (EventParams)EventQueue.Dequeue(); - if (data == null) - { - // check if a null event was enqueued or if its really empty - if (EventQueue.Count > 0 && Running && !ShuttingDown && !m_InSelfDelete) - { - m_CurrentWorkItem = Engine.QueueEventHandler(this); - } - else - { - m_CurrentWorkItem = null; - } - return; - } - - if (data.EventName == "timer") - m_TimerQueued = false; - if (data.EventName == "control") - { - if (m_ControlEventsInQueue > 0) - m_ControlEventsInQueue--; - } - if (data.EventName == "collision") - m_CollisionInQueue = false; - } - - if (DebugLevel >= 2) - m_log.DebugFormat( - "[SCRIPT INSTANCE]: Processing event {0} for {1}/{2}({3})/{4}({5}) @ {6}/{7}", - data.EventName, - ScriptName, - Part.Name, - Part.LocalId, - Part.ParentGroup.Name, - Part.ParentGroup.UUID, - Part.AbsolutePosition, - Part.ParentGroup.Scene.Name); - - m_DetectParams = data.DetectParams; - - if (data.EventName == "state") // Hardcoded state change - { - State = data.Params[0].ToString(); - - if (DebugLevel >= 1) - m_log.DebugFormat( - "[SCRIPT INSTANCE]: Changing state to {0} for {1}/{2}({3})/{4}({5}) @ {6}/{7}", - State, - ScriptName, - Part.Name, - Part.LocalId, - Part.ParentGroup.Name, - Part.ParentGroup.UUID, - Part.AbsolutePosition, - Part.ParentGroup.Scene.Name); - AsyncCommandManager.StateChange(Engine, - LocalID, ItemID); - // we are effectively in the new state now, so we can resume queueing - // and processing other non-timer events - m_StateChangeInProgress = false; - - Part.RemoveScriptTargets(ItemID); - Part.SetScriptEvents(ItemID, m_Script.GetStateEventFlags(State)); - } - else - { - Exception e = null; - - if (Engine.World.PipeEventsForScript(LocalID) || - data.EventName == "control") // Don't freeze avies! - { - //m_log.DebugFormat("[Script] Delivered event {2} in state {3} to {0}.{1}", - // PrimName, ScriptName, data.EventName, State); - - try - { - m_CurrentEvent = data.EventName; - m_EventStart = DateTime.UtcNow; - m_InEvent = true; - - try - { - m_Script.ExecuteEvent(State, data.EventName, data.Params); - } - finally - { - m_InEvent = false; - m_CurrentEvent = String.Empty; - lock (EventQueue) - m_CurrentWorkItem = null; // no longer in a event that can be canceled - } - - if (m_SaveState) - { - // This will be the very first event we deliver - // (state_entry) in default state - // - SaveState(); - - m_SaveState = false; - } - } - catch (Exception exx) - { - e = exx; - } - - if(e != null) - { - // m_log.DebugFormat( - // "[SCRIPT] Exception in script {0} {1}: {2}{3}", - // ScriptName, ItemID, e.Message, e.StackTrace); - - if ((!(e is TargetInvocationException) - || (!(e.InnerException is SelfDeleteException) - && !(e.InnerException is ScriptDeleteException) - && !(e.InnerException is ScriptCoopStopException))) - && !(e is ThreadAbortException)) - { - try - { - if(e.InnerException != null && e.InnerException is ScriptException) - { - bool toowner = false; - string text = e.InnerException.Message; - if(text.StartsWith("(OWNER)")) - { - text = text.Substring(7); - toowner = true; - } - text += "(script: " + ScriptName + - " event: " + data.EventName + - " primID:" + Part.UUID.ToString() + - " at " + Part.AbsolutePosition + ")"; - if (text.Length > 1000) - text = text.Substring(0, 1000); - if (toowner) - { - ScenePresence sp = Engine.World.GetScenePresence(Part.OwnerID); - if (sp != null && !sp.IsNPC) - Engine.World.SimChatToAgent(Part.OwnerID, Utils.StringToBytes(text), 0x7FFFFFFF, Part.AbsolutePosition, - Part.Name, Part.UUID, false); - } - else - Engine.World.SimChat(Utils.StringToBytes(text), - ChatTypeEnum.DebugChannel, 2147483647, - Part.AbsolutePosition, - Part.Name, Part.UUID, false); - m_log.Debug(string.Format( - "[SCRIPT ERROR]: {0} (at event {1}, part {2} {3} at {4} in {5}", - e.InnerException.Message, - data.EventName, - PrimName, - Part.UUID, - Part.AbsolutePosition, - Part.ParentGroup.Scene.Name)); - - } - else - { - - // DISPLAY ERROR INWORLD - string text = FormatException(e); - - if (text.Length > 1000) - text = text.Substring(0, 1000); - Engine.World.SimChat(Utils.StringToBytes(text), - ChatTypeEnum.DebugChannel, 2147483647, - Part.AbsolutePosition, - Part.Name, Part.UUID, false); - - - m_log.Debug(string.Format( - "[SCRIPT ERROR]: Runtime error in script {0} (event {1}), part {2} {3} at {4} in {5} ", - ScriptName, - data.EventName, - PrimName, - Part.UUID, - Part.AbsolutePosition, - Part.ParentGroup.Scene.Name), - e); - } - } - catch (Exception) - { - } - } - else if ((e is TargetInvocationException) && (e.InnerException is SelfDeleteException)) - { - m_InSelfDelete = true; - Engine.World.DeleteSceneObject(Part.ParentGroup, false); - } - else if ((e is TargetInvocationException) && (e.InnerException is ScriptDeleteException)) - { - m_InSelfDelete = true; - Part.Inventory.RemoveInventoryItem(ItemID); - } - else if ((e is TargetInvocationException) && (e.InnerException is ScriptCoopStopException)) - { - if (DebugLevel >= 1) - m_log.DebugFormat( - "[SCRIPT INSTANCE]: Script {0}.{1} in event {2}, state {3} stopped co-operatively.", - PrimName, ScriptName, data.EventName, State); - } - } - } - } - - // If there are more events and we are currently running and not shutting down, then ask the - // script engine to run the next event. - lock (EventQueue) - { - // Increase processed events counter and prevent wrap; - if (++EventsProcessed == 1000000) - EventsProcessed = 100000; - - if ((EventsProcessed % 100000) == 0 && DebugLevel > 0) - { - m_log.DebugFormat("[SCRIPT INSTANCE]: Script \"{0}\" (Object \"{1}\" {2} @ {3}.{4}, Item ID {5}, Asset {6}) in event {7}: processed {8:n0} script events", - ScriptTask.Name, - Part.ParentGroup.Name, Part.ParentGroup.UUID, Part.ParentGroup.AbsolutePosition, Part.ParentGroup.Scene.Name, - ScriptTask.ItemID, ScriptTask.AssetID, data.EventName, EventsProcessed); - } - - if (EventQueue.Count > 0 && Running && !ShuttingDown && !m_InSelfDelete) - { - m_CurrentWorkItem = Engine.QueueEventHandler(this); - } - else - { - m_CurrentWorkItem = null; - } - } - - m_DetectParams = null; - } - - public int EventTime() - { - if (!m_InEvent) - return 0; - - return (DateTime.UtcNow - m_EventStart).Seconds; - } - - public void ResetScript(int timeout) - { - if (m_Script == null) - return; - - bool running = Running; - - RemoveState(); - ReleaseControlsorPermissions(true); - - Stop(timeout); - AsyncCommandManager.RemoveScript(Engine, LocalID, ItemID); - - m_TimerQueued = false; - m_StateChangeInProgress = false; - EventQueue.Clear(); - - m_Script.ResetVars(); - StartParam = 0; - State = "default"; - - SceneObjectPart part = Engine.World.GetSceneObjectPart(LocalID); - if (part == null) - return; - - part.CollisionSound = UUID.Zero; - part.RemoveScriptTargets(ItemID); - part.SetScriptEvents(ItemID, m_Script.GetStateEventFlags(State)); - if (running & ScriptTask.ScriptRunning) - { - Start(); - PostEvent(EventParams.StateEntryParams); - } - else - QueueEvent(EventParams.StateEntryParams); - m_SaveState = StatePersistedHere; - } - - [DebuggerNonUserCode] //Stops the VS debugger from farting in this function - public void ApiResetScript() - { - // bool running = Running; - - RemoveState(); - ReleaseControlsorPermissions(true); - - AsyncCommandManager.RemoveScript(Engine, LocalID, ItemID); - - m_TimerQueued = false; - m_StateChangeInProgress = false; - EventQueue.Clear(); - m_Script.ResetVars(); - string oldState = State; - StartParam = 0; - State = "default"; - - SceneObjectPart part = Engine.World.GetSceneObjectPart(LocalID); - if(part != null) - { - part.CollisionSound = UUID.Zero; - part.RemoveScriptTargets(ItemID); - part.SetScriptEvents(ItemID, m_Script.GetStateEventFlags(State)); - } - if (m_CurrentEvent != "state_entry" || oldState != "default") - { - m_SaveState = StatePersistedHere; - PostEvent(EventParams.StateEntryParams); - throw new EventAbortException(); - } - } - - public Dictionary GetVars() - { - if (m_Script != null) - return m_Script.GetVars(); - else - return new Dictionary(); - } - - public void SetVars(Dictionary vars) - { -// foreach (KeyValuePair kvp in vars) -// m_log.DebugFormat("[SCRIPT INSTANCE]: Setting var {0}={1}", kvp.Key, kvp.Value); - - m_Script.SetVars(vars); - } - - public DetectParams GetDetectParams(int idx) - { - if (m_DetectParams == null) - return null; - if (idx < 0 || idx >= m_DetectParams.Length) - return null; - - return m_DetectParams[idx]; - } - - public UUID GetDetectID(int idx) - { - if (m_DetectParams == null) - return UUID.Zero; - if (idx < 0 || idx >= m_DetectParams.Length) - return UUID.Zero; - - return m_DetectParams[idx].Key; - } - - public void SaveState() - { - if (!Running && !StayStopped) - return; - - // We cannot call this inside the EventQueue lock since it will currently take AsyncCommandManager.staticLock. - // This may already be held by AsyncCommandManager.DoOneCmdHandlerPass() which in turn can take EventQueue - // lock via ScriptInstance.PostEvent(). - PluginData = AsyncCommandManager.GetSerializationData(Engine, ItemID); - - // We need to lock here to avoid any race with a thread that is removing this script. - lock (EventQueue) - { - // Check again to avoid a race with a thread in Stop() - if (!Running && !StayStopped) - return; - - // If we're currently in an event, just tell it to save upon return - // - if (m_InEvent) - { - m_SaveState = true; - return; - } - - // m_log.DebugFormat( - // "[SCRIPT INSTANCE]: Saving state for script {0} (id {1}) in part {2} (id {3}) in object {4} in {5}", - // ScriptTask.Name, ScriptTask.ItemID, Part.Name, Part.UUID, Part.ParentGroup.Name, Engine.World.Name); - - string xml = ScriptSerializer.Serialize(this); - - // Compare hash of the state we just just created with the state last written to disk - // If the state is different, update the disk file. - UUID hash = UUID.Parse(Utils.MD5String(xml)); - - if (hash != m_CurrentStateHash) - { - try - { - using (FileStream fs = File.Create(Path.Combine(m_dataPath, ItemID.ToString() + ".state"))) - { - Byte[] buf = Util.UTF8NoBomEncoding.GetBytes(xml); - fs.Write(buf, 0, buf.Length); - } - } - catch(Exception) - { - // m_log.Error("Unable to save xml\n"+e.ToString()); - } - //if (!File.Exists(Path.Combine(Path.GetDirectoryName(assembly), ItemID.ToString() + ".state"))) - //{ - // throw new Exception("Completed persistence save, but no file was created"); - //} - m_CurrentStateHash = hash; - } - - StayStopped = false; - } - } - - public IScriptApi GetApi(string name) - { - if (m_Apis.ContainsKey(name)) - { -// m_log.DebugFormat("[SCRIPT INSTANCE]: Found api {0} in {1}@{2}", name, ScriptName, PrimName); - - return m_Apis[name]; - } - -// m_log.DebugFormat("[SCRIPT INSTANCE]: Did not find api {0} in {1}@{2}", name, ScriptName, PrimName); - - return null; - } - - public override string ToString() - { - return String.Format("{0} {1} on {2}", ScriptName, ItemID, PrimName); - } - - string FormatException(Exception e) - { - if (e.InnerException == null) // Not a normal runtime error - return e.ToString(); - - string message = "Runtime error:\n" + e.InnerException.StackTrace; - string[] lines = message.Split(new char[] {'\n'}); - - foreach (string line in lines) - { - if (line.Contains("SecondLife.Script")) - { - int idx = line.IndexOf(':'); - if (idx != -1) - { - string val = line.Substring(idx+1); - int lineNum = 0; - if (int.TryParse(val, out lineNum)) - { - KeyValuePair pos = - Compiler.FindErrorPosition( - lineNum, 0, LineMap); - - int scriptLine = pos.Key; - int col = pos.Value; - if (scriptLine == 0) - scriptLine++; - if (col == 0) - col++; - message = string.Format("Runtime error:\n" + - "({0}): {1}", scriptLine - 1, - e.InnerException.Message); - - return message; - } - } - } - } - - // m_log.ErrorFormat("Scripting exception:"); - // m_log.ErrorFormat(e.ToString()); - - return e.ToString(); - } - - public string GetAssemblyName() - { - return m_assemblyPath; - } - - public string GetXMLState() - { - bool run = Running; - Stop(100); - Running = run; - - // We should not be doing this, but since we are about to - // dispose this, it really doesn't make a difference - // This is meant to work around a Windows only race - // - m_InEvent = false; - - // Force an update of the in-memory plugin data - // - PluginData = AsyncCommandManager.GetSerializationData(Engine, ItemID); - - return ScriptSerializer.Serialize(this); - } - - public UUID RegionID - { - get { return m_RegionID; } - } - - public void Suspend() - { - Suspended = true; - } - - public void Resume() - { - Suspended = false; - } - } - - /// - /// Xengine event wait handle. - /// - /// - /// This class exists becase XEngineScriptBase gets a reference to this wait handle. We need to make sure that - /// when scripts are running in different AppDomains the lease does not expire. - /// FIXME: Like LSL_Api, etc., this effectively leaks memory since the GC will never collect it. To avoid this, - /// proper remoting sponsorship needs to be implemented across the board. - /// - public class XEngineEventWaitHandle : EventWaitHandle - { - public XEngineEventWaitHandle(bool initialState, EventResetMode mode) : base(initialState, mode) {} - - public override Object InitializeLifetimeService() - { - return null; - } - } -} diff --git a/OpenSim/Region/ScriptEngine/Shared/Instance/ScriptSerializer.cs b/OpenSim/Region/ScriptEngine/Shared/Instance/ScriptSerializer.cs deleted file mode 100644 index 9c5c0ac7cd..0000000000 --- a/OpenSim/Region/ScriptEngine/Shared/Instance/ScriptSerializer.cs +++ /dev/null @@ -1,496 +0,0 @@ -/* - * Copyright (c) Contributors, http://opensimulator.org/ - * See CONTRIBUTORS.TXT for a full list of copyright holders. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: - * * Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * * Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * * Neither the name of the OpenSimulator Project nor the - * names of its contributors may be used to endorse or promote products - * derived from this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE DEVELOPERS ``AS IS'' AND ANY - * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR ANY - * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - */ - -using System; -using System.IO; -using System.Threading; -using System.Collections; -using System.Collections.Generic; -using System.Security.Policy; -using System.Reflection; -using System.Globalization; -using System.Xml; -using OpenMetaverse; -using log4net; -using Nini.Config; -using Amib.Threading; -using OpenSim.Framework; -using OpenSim.Region.CoreModules; -using OpenSim.Region.Framework.Scenes; -using OpenSim.Region.Framework.Interfaces; -using OpenSim.Region.ScriptEngine.Shared; -using OpenSim.Region.ScriptEngine.Shared.Api; -using OpenSim.Region.ScriptEngine.Shared.ScriptBase; -using OpenSim.Region.ScriptEngine.Shared.CodeTools; -using OpenSim.Region.ScriptEngine.Interfaces; - -namespace OpenSim.Region.ScriptEngine.Shared.Instance -{ - public class ScriptSerializer - { - public static string Serialize(ScriptInstance instance) - { - bool running = instance.Running; - - XmlDocument xmldoc = new XmlDocument(); - - XmlNode xmlnode = xmldoc.CreateNode(XmlNodeType.XmlDeclaration, - "", ""); - xmldoc.AppendChild(xmlnode); - - XmlElement rootElement = xmldoc.CreateElement("", "ScriptState", - ""); - xmldoc.AppendChild(rootElement); - - XmlElement state = xmldoc.CreateElement("", "State", ""); - state.AppendChild(xmldoc.CreateTextNode(instance.State)); - - rootElement.AppendChild(state); - - XmlElement run = xmldoc.CreateElement("", "Running", ""); - run.AppendChild(xmldoc.CreateTextNode( - running.ToString())); - - rootElement.AppendChild(run); - - Dictionary vars = instance.GetVars(); - - XmlElement variables = xmldoc.CreateElement("", "Variables", ""); - - foreach (KeyValuePair var in vars) - WriteTypedValue(xmldoc, variables, "Variable", var.Key, - var.Value); - - rootElement.AppendChild(variables); - - XmlElement queue = xmldoc.CreateElement("", "Queue", ""); - - int count = instance.EventQueue.Count; - - while (count > 0) - { - EventParams ep = (EventParams)instance.EventQueue.Dequeue(); - instance.EventQueue.Enqueue(ep); - count--; - - XmlElement item = xmldoc.CreateElement("", "Item", ""); - XmlAttribute itemEvent = xmldoc.CreateAttribute("", "event", - ""); - itemEvent.Value = ep.EventName; - item.Attributes.Append(itemEvent); - - XmlElement parms = xmldoc.CreateElement("", "Params", ""); - - foreach (Object o in ep.Params) - WriteTypedValue(xmldoc, parms, "Param", String.Empty, o); - - item.AppendChild(parms); - - XmlElement detect = xmldoc.CreateElement("", "Detected", ""); - - foreach (DetectParams det in ep.DetectParams) - { - XmlElement objectElem = xmldoc.CreateElement("", "Object", ""); - XmlAttribute pos = xmldoc.CreateAttribute("", "pos", ""); - pos.Value = det.OffsetPos.ToString(); - objectElem.Attributes.Append(pos); - - XmlAttribute d_linkNum = xmldoc.CreateAttribute("", "linkNum", ""); - d_linkNum.Value = det.LinkNum.ToString(); - objectElem.Attributes.Append(d_linkNum); - - XmlAttribute d_group = xmldoc.CreateAttribute("", "group", ""); - d_group.Value = det.Group.ToString(); - objectElem.Attributes.Append(d_group); - - XmlAttribute d_name = xmldoc.CreateAttribute("", "name", ""); - d_name.Value = det.Name.ToString(); - objectElem.Attributes.Append(d_name); - - XmlAttribute d_owner = xmldoc.CreateAttribute("", "owner", ""); - d_owner.Value = det.Owner.ToString(); - objectElem.Attributes.Append(d_owner); - - XmlAttribute d_position = xmldoc.CreateAttribute("", "position", ""); - d_position.Value = det.Position.ToString(); - objectElem.Attributes.Append(d_position); - - XmlAttribute d_rotation = xmldoc.CreateAttribute("", "rotation", ""); - d_rotation.Value = det.Rotation.ToString(); - objectElem.Attributes.Append(d_rotation); - - XmlAttribute d_type = xmldoc.CreateAttribute("", "type", ""); - d_type.Value = det.Type.ToString(); - objectElem.Attributes.Append(d_type); - - XmlAttribute d_velocity = xmldoc.CreateAttribute("", "velocity", ""); - d_velocity.Value = det.Velocity.ToString(); - objectElem.Attributes.Append(d_velocity); - - objectElem.AppendChild( - xmldoc.CreateTextNode(det.Key.ToString())); - - detect.AppendChild(objectElem); - } - - item.AppendChild(detect); - - queue.AppendChild(item); - } - - rootElement.AppendChild(queue); - - XmlNode plugins = xmldoc.CreateElement("", "Plugins", ""); - DumpList(xmldoc, plugins, - new LSL_Types.list(instance.PluginData)); - - rootElement.AppendChild(plugins); - - if (instance.ScriptTask != null) - { - if (instance.ScriptTask.PermsMask != 0 && !instance.ScriptTask.PermsGranter.IsZero()) - { - XmlNode permissions = xmldoc.CreateElement("", "Permissions", ""); - XmlAttribute granter = xmldoc.CreateAttribute("", "granter", ""); - granter.Value = instance.ScriptTask.PermsGranter.ToString(); - permissions.Attributes.Append(granter); - XmlAttribute mask = xmldoc.CreateAttribute("", "mask", ""); - mask.Value = instance.ScriptTask.PermsMask.ToString(); - permissions.Attributes.Append(mask); - rootElement.AppendChild(permissions); - } - } - - if (instance.MinEventDelay > 0.0) - { - XmlElement eventDelay = xmldoc.CreateElement("", "MinEventDelay", ""); - eventDelay.AppendChild(xmldoc.CreateTextNode(instance.MinEventDelay.ToString())); - rootElement.AppendChild(eventDelay); - } - - return xmldoc.InnerXml; - } - - public static void Deserialize(string xml, ScriptInstance instance) - { - XmlDocument doc = new XmlDocument(); - - Dictionary vars = instance.GetVars(); - - instance.PluginData = new Object[0]; - - doc.LoadXml(xml); - - XmlNodeList rootL = doc.GetElementsByTagName("ScriptState"); - if (rootL.Count != 1) - { - return; - } - XmlNode rootNode = rootL[0]; - - if (rootNode != null) - { - object varValue; - XmlNodeList partL = rootNode.ChildNodes; - - foreach (XmlNode part in partL) - { - switch (part.Name) - { - case "State": - instance.State=part.InnerText; - break; - case "Running": - instance.Running = bool.Parse(part.InnerText); - break; - case "Variables": - XmlNodeList varL = part.ChildNodes; - foreach (XmlNode var in varL) - { - string varName; - varValue=ReadTypedValue(var, out varName); - - if (vars.ContainsKey(varName)) - vars[varName] = varValue; - } - instance.SetVars(vars); - break; - case "Queue": - XmlNodeList itemL = part.ChildNodes; - foreach (XmlNode item in itemL) - { - List parms = new List(); - List detected = - new List(); - - string eventName = - item.Attributes.GetNamedItem("event").Value; - XmlNodeList eventL = item.ChildNodes; - foreach (XmlNode evt in eventL) - { - switch (evt.Name) - { - case "Params": - XmlNodeList prms = evt.ChildNodes; - foreach (XmlNode pm in prms) - parms.Add(ReadTypedValue(pm)); - - break; - case "Detected": - XmlNodeList detL = evt.ChildNodes; - foreach (XmlNode det in detL) - { - string vect = - det.Attributes.GetNamedItem( - "pos").Value; - LSL_Types.Vector3 v = - new LSL_Types.Vector3(vect); - - int d_linkNum=0; - UUID d_group = UUID.Zero; - string d_name = String.Empty; - UUID d_owner = UUID.Zero; - LSL_Types.Vector3 d_position = - new LSL_Types.Vector3(); - LSL_Types.Quaternion d_rotation = - new LSL_Types.Quaternion(); - int d_type = 0; - LSL_Types.Vector3 d_velocity = - new LSL_Types.Vector3(); - - try - { - string tmp; - - tmp = det.Attributes.GetNamedItem( - "linkNum").Value; - int.TryParse(tmp, out d_linkNum); - - tmp = det.Attributes.GetNamedItem( - "group").Value; - UUID.TryParse(tmp, out d_group); - - d_name = det.Attributes.GetNamedItem( - "name").Value; - - tmp = det.Attributes.GetNamedItem( - "owner").Value; - UUID.TryParse(tmp, out d_owner); - - tmp = det.Attributes.GetNamedItem( - "position").Value; - d_position = - new LSL_Types.Vector3(tmp); - - tmp = det.Attributes.GetNamedItem( - "rotation").Value; - d_rotation = - new LSL_Types.Quaternion(tmp); - - tmp = det.Attributes.GetNamedItem( - "type").Value; - int.TryParse(tmp, out d_type); - - tmp = det.Attributes.GetNamedItem( - "velocity").Value; - d_velocity = - new LSL_Types.Vector3(tmp); - - } - catch (Exception) // Old version XML - { - } - - UUID uuid = new UUID(); - UUID.TryParse(det.InnerText, - out uuid); - - DetectParams d = new DetectParams(); - d.Key = uuid; - d.OffsetPos = v; - d.LinkNum = d_linkNum; - d.Group = d_group; - d.Name = d_name; - d.Owner = d_owner; - d.Position = d_position; - d.Rotation = d_rotation; - d.Type = d_type; - d.Velocity = d_velocity; - - detected.Add(d); - } - break; - } - } - EventParams ep = new EventParams( - eventName, parms.ToArray(), - detected.ToArray()); - instance.EventQueue.Enqueue(ep); - } - break; - case "Plugins": - instance.PluginData = ReadList(part).Data; - break; - case "Permissions": - string tmpPerm; - int mask = 0; - tmpPerm = part.Attributes.GetNamedItem("mask").Value; - if (tmpPerm != null) - { - int.TryParse(tmpPerm, out mask); - if (mask != 0) - { - tmpPerm = part.Attributes.GetNamedItem("granter").Value; - if (tmpPerm != null) - { - UUID granter = new UUID(); - UUID.TryParse(tmpPerm, out granter); - if (!granter.IsZero()) - { - instance.ScriptTask.PermsMask = mask; - instance.ScriptTask.PermsGranter = granter; - } - } - } - } - break; - case "MinEventDelay": - double minEventDelay = 0.0; - double.TryParse(part.InnerText, NumberStyles.Float, Culture.NumberFormatInfo, out minEventDelay); - instance.MinEventDelay = minEventDelay; - break; - } - } - } - } - - private static void DumpList(XmlDocument doc, XmlNode parent, - LSL_Types.list l) - { - foreach (Object o in l.Data) - WriteTypedValue(doc, parent, "ListItem", "", o); - } - - private static LSL_Types.list ReadList(XmlNode parent) - { - List olist = new List(); - - XmlNodeList itemL = parent.ChildNodes; - foreach (XmlNode item in itemL) - olist.Add(ReadTypedValue(item)); - - return new LSL_Types.list(olist.ToArray()); - } - - private static void WriteTypedValue(XmlDocument doc, XmlNode parent, - string tag, string name, object value) - { - Type t=value.GetType(); - XmlAttribute typ = doc.CreateAttribute("", "type", ""); - XmlNode n = doc.CreateElement("", tag, ""); - - if (value is LSL_Types.list) - { - typ.Value = "list"; - n.Attributes.Append(typ); - - DumpList(doc, n, (LSL_Types.list) value); - - if (name != String.Empty) - { - XmlAttribute nam = doc.CreateAttribute("", "name", ""); - nam.Value = name; - n.Attributes.Append(nam); - } - - parent.AppendChild(n); - return; - } - - n.AppendChild(doc.CreateTextNode(value.ToString())); - - typ.Value = t.ToString(); - n.Attributes.Append(typ); - if (name != String.Empty) - { - XmlAttribute nam = doc.CreateAttribute("", "name", ""); - nam.Value = name; - n.Attributes.Append(nam); - } - - parent.AppendChild(n); - } - - private static object ReadTypedValue(XmlNode tag, out string name) - { - name = tag.Attributes.GetNamedItem("name").Value; - - return ReadTypedValue(tag); - } - - private static object ReadTypedValue(XmlNode tag) - { - Object varValue; - string assembly; - - string itemType = tag.Attributes.GetNamedItem("type").Value; - - if (itemType == "list") - return ReadList(tag); - - if (itemType == "OpenMetaverse.UUID") - { - UUID val = new UUID(); - UUID.TryParse(tag.InnerText, out val); - - return val; - } - - Type itemT = Type.GetType(itemType); - if (itemT == null) - { - Object[] args = - new Object[] { tag.InnerText }; - - assembly = itemType+", OpenSim.Region.ScriptEngine.Shared"; - itemT = Type.GetType(assembly); - if (itemT == null) - return null; - - varValue = Activator.CreateInstance(itemT, args); - - if (varValue == null) - return null; - } - else - { - varValue = Convert.ChangeType(tag.InnerText, itemT); - } - return varValue; - } - } -} diff --git a/OpenSim/Region/ScriptEngine/Shared/Tests/LSL_ApiAvatarTests.cs b/OpenSim/Region/ScriptEngine/Shared/Tests/LSL_ApiAvatarTests.cs index 1e0a0f47ab..a500f10c6c 100644 --- a/OpenSim/Region/ScriptEngine/Shared/Tests/LSL_ApiAvatarTests.cs +++ b/OpenSim/Region/ScriptEngine/Shared/Tests/LSL_ApiAvatarTests.cs @@ -41,7 +41,6 @@ using OpenSim.Region.OptionalModules.World.NPC; using OpenSim.Region.Framework.Scenes; using OpenSim.Region.ScriptEngine.Shared; using OpenSim.Region.ScriptEngine.Shared.Api; -using OpenSim.Region.ScriptEngine.Shared.Instance; using OpenSim.Region.ScriptEngine.Shared.ScriptBase; using OpenSim.Services.Interfaces; using OpenSim.Tests.Common; @@ -56,8 +55,8 @@ namespace OpenSim.Region.ScriptEngine.Shared.Tests [TestFixture] public class LSL_ApiAvatarTests : OpenSimTestCase { + /* protected Scene m_scene; - protected XEngine.XEngine m_engine; [SetUp] public override void SetUp() @@ -76,7 +75,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Tests m_scene = new SceneHelpers().SetupScene(); SceneHelpers.SetupSceneModules(m_scene, initConfigSource); - m_engine = new XEngine.XEngine(); + m_engine = new YEngine.XEngine(); m_engine.Initialise(initConfigSource); m_engine.AddRegion(m_scene); } @@ -159,7 +158,8 @@ namespace OpenSim.Region.ScriptEngine.Shared.Tests m_scene.Update(1); Assert.That(entityUpdates, Is.EqualTo(4)); } -*/ + } + */ } } diff --git a/OpenSim/Region/ScriptEngine/Shared/Tests/LSL_ApiInventoryTests.cs b/OpenSim/Region/ScriptEngine/Shared/Tests/LSL_ApiInventoryTests.cs index 5edd3db8c1..cc5f721bf0 100644 --- a/OpenSim/Region/ScriptEngine/Shared/Tests/LSL_ApiInventoryTests.cs +++ b/OpenSim/Region/ScriptEngine/Shared/Tests/LSL_ApiInventoryTests.cs @@ -42,7 +42,6 @@ using OpenSim.Region.Framework.Scenes; using OpenSim.Region.CoreModules.World.Permissions; using OpenSim.Region.ScriptEngine.Shared; using OpenSim.Region.ScriptEngine.Shared.Api; -using OpenSim.Region.ScriptEngine.Shared.Instance; using OpenSim.Services.Interfaces; using OpenSim.Tests.Common; using PermissionMask = OpenSim.Framework.PermissionMask; @@ -53,6 +52,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Tests /// Tests for inventory functions in LSL /// [TestFixture] + /* public class LSL_ApiInventoryTests : OpenSimTestCase { protected Scene m_scene; @@ -296,4 +296,5 @@ namespace OpenSim.Region.ScriptEngine.Shared.Tests Assert.IsNull(otherOwnedTargetSo.RootPart.Inventory.GetInventoryItem("script")); } } + */ } diff --git a/OpenSim/Region/ScriptEngine/Shared/Tests/LSL_ApiLinkingTests.cs b/OpenSim/Region/ScriptEngine/Shared/Tests/LSL_ApiLinkingTests.cs index d9ceb830cb..9c262db124 100644 --- a/OpenSim/Region/ScriptEngine/Shared/Tests/LSL_ApiLinkingTests.cs +++ b/OpenSim/Region/ScriptEngine/Shared/Tests/LSL_ApiLinkingTests.cs @@ -41,7 +41,6 @@ using OpenSim.Region.OptionalModules.World.NPC; using OpenSim.Region.Framework.Scenes; using OpenSim.Region.ScriptEngine.Shared; using OpenSim.Region.ScriptEngine.Shared.Api; -using OpenSim.Region.ScriptEngine.Shared.Instance; using OpenSim.Region.ScriptEngine.Shared.ScriptBase; using OpenSim.Services.Interfaces; using OpenSim.Tests.Common; @@ -58,6 +57,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Tests [TestFixture] public class LSL_ApiLinkingTests : OpenSimTestCase { + /* protected Scene m_scene; protected XEngine.XEngine m_engine; @@ -99,7 +99,6 @@ namespace OpenSim.Region.ScriptEngine.Shared.Tests = TaskInventoryHelpers.AddNotecard( m_scene.AssetService, grp1.RootPart, "ncItem", TestHelpers.ParseTail(0x800), TestHelpers.ParseTail(0x900), "Hello World!"); grp1Item.PermsMask |= ScriptBaseClass.PERMISSION_CHANGE_LINKS; - grp1Item.PermsGranter = ownerId; SceneObjectGroup grp2 = SceneHelpers.CreateSceneObject(2, ownerId, "grp2-", 0x20); grp2.AbsolutePosition = new Vector3(20, 20, 20); @@ -189,4 +188,5 @@ namespace OpenSim.Region.ScriptEngine.Shared.Tests } } } + */ } diff --git a/OpenSim/Region/ScriptEngine/Shared/Tests/LSL_ApiListTests.cs b/OpenSim/Region/ScriptEngine/Shared/Tests/LSL_ApiListTests.cs index 90bbecaebc..7bc6d91b14 100644 --- a/OpenSim/Region/ScriptEngine/Shared/Tests/LSL_ApiListTests.cs +++ b/OpenSim/Region/ScriptEngine/Shared/Tests/LSL_ApiListTests.cs @@ -34,7 +34,6 @@ using OpenSim.Region.ScriptEngine.Shared; using OpenSim.Region.Framework.Scenes; using Nini.Config; using OpenSim.Region.ScriptEngine.Shared.Api; -using OpenSim.Region.ScriptEngine.Shared.Instance; using OpenSim.Region.ScriptEngine.Shared.ScriptBase; using OpenMetaverse; diff --git a/OpenSim/Region/ScriptEngine/Shared/Tests/LSL_ApiObjectTests.cs b/OpenSim/Region/ScriptEngine/Shared/Tests/LSL_ApiObjectTests.cs index b994901b73..cc550ad5fd 100644 --- a/OpenSim/Region/ScriptEngine/Shared/Tests/LSL_ApiObjectTests.cs +++ b/OpenSim/Region/ScriptEngine/Shared/Tests/LSL_ApiObjectTests.cs @@ -41,7 +41,6 @@ using OpenSim.Region.OptionalModules.World.NPC; using OpenSim.Region.Framework.Scenes; using OpenSim.Region.ScriptEngine.Shared; using OpenSim.Region.ScriptEngine.Shared.Api; -using OpenSim.Region.ScriptEngine.Shared.Instance; using OpenSim.Region.ScriptEngine.Shared.ScriptBase; using OpenSim.Services.Interfaces; using OpenSim.Tests.Common; @@ -53,6 +52,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Tests [TestFixture] public class LSL_ApiObjectTests : OpenSimTestCase { + /* private const double VECTOR_COMPONENT_ACCURACY = 0.0000005d; private const float FLOAT_ACCURACY = 0.00005f; @@ -395,4 +395,5 @@ namespace OpenSim.Region.ScriptEngine.Shared.Tests } } + */ } diff --git a/OpenSim/Region/ScriptEngine/Shared/Tests/LSL_ApiTest.cs b/OpenSim/Region/ScriptEngine/Shared/Tests/LSL_ApiTest.cs index 98800d0b99..e10699dcc1 100644 --- a/OpenSim/Region/ScriptEngine/Shared/Tests/LSL_ApiTest.cs +++ b/OpenSim/Region/ScriptEngine/Shared/Tests/LSL_ApiTest.cs @@ -33,7 +33,6 @@ using OpenSim.Region.ScriptEngine.Shared; using OpenSim.Region.Framework.Scenes; using Nini.Config; using OpenSim.Region.ScriptEngine.Shared.Api; -using OpenSim.Region.ScriptEngine.Shared.Instance; using OpenSim.Region.ScriptEngine.Shared.ScriptBase; using OpenMetaverse; using System; diff --git a/OpenSim/Region/ScriptEngine/Shared/Tests/OSSL_ApiAppearanceTest.cs b/OpenSim/Region/ScriptEngine/Shared/Tests/OSSL_ApiAppearanceTest.cs index 7d042c6911..60c78e3719 100644 --- a/OpenSim/Region/ScriptEngine/Shared/Tests/OSSL_ApiAppearanceTest.cs +++ b/OpenSim/Region/ScriptEngine/Shared/Tests/OSSL_ApiAppearanceTest.cs @@ -41,7 +41,6 @@ using OpenSim.Region.OptionalModules.World.NPC; using OpenSim.Region.Framework.Scenes; using OpenSim.Region.ScriptEngine.Shared; using OpenSim.Region.ScriptEngine.Shared.Api; -using OpenSim.Region.ScriptEngine.Shared.Instance; using OpenSim.Services.Interfaces; using OpenSim.Tests.Common; @@ -53,6 +52,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Tests [TestFixture] public class OSSL_ApiAppearanceTest : OpenSimTestCase { + /* protected Scene m_scene; protected XEngine.XEngine m_engine; @@ -163,4 +163,5 @@ namespace OpenSim.Region.ScriptEngine.Shared.Tests Assert.That(savedAppearance.AvatarHeight, Is.EqualTo(sp.Appearance.AvatarHeight)); } } + */ } diff --git a/OpenSim/Region/ScriptEngine/Shared/Tests/OSSL_ApiAttachmentTests.cs b/OpenSim/Region/ScriptEngine/Shared/Tests/OSSL_ApiAttachmentTests.cs index c7fdefc2e5..4b13c1c3ea 100644 --- a/OpenSim/Region/ScriptEngine/Shared/Tests/OSSL_ApiAttachmentTests.cs +++ b/OpenSim/Region/ScriptEngine/Shared/Tests/OSSL_ApiAttachmentTests.cs @@ -41,7 +41,6 @@ using OpenSim.Region.CoreModules.Framework.InventoryAccess; using OpenSim.Region.Framework.Scenes; using OpenSim.Region.ScriptEngine.Shared; using OpenSim.Region.ScriptEngine.Shared.Api; -using OpenSim.Region.ScriptEngine.Shared.Instance; using OpenSim.Services.Interfaces; using OpenSim.Tests.Common; diff --git a/OpenSim/Region/ScriptEngine/Shared/Tests/OSSL_ApiNpcTests.cs b/OpenSim/Region/ScriptEngine/Shared/Tests/OSSL_ApiNpcTests.cs index b44cc1641c..108998ed64 100644 --- a/OpenSim/Region/ScriptEngine/Shared/Tests/OSSL_ApiNpcTests.cs +++ b/OpenSim/Region/ScriptEngine/Shared/Tests/OSSL_ApiNpcTests.cs @@ -42,7 +42,6 @@ using OpenSim.Region.OptionalModules.World.NPC; using OpenSim.Region.Framework.Scenes; using OpenSim.Region.ScriptEngine.Shared; using OpenSim.Region.ScriptEngine.Shared.Api; -using OpenSim.Region.ScriptEngine.Shared.Instance; using OpenSim.Region.ScriptEngine.Shared.ScriptBase; using OpenSim.Services.Interfaces; using OpenSim.Tests.Common; diff --git a/OpenSim/Region/ScriptEngine/XEngine/Api/Runtime/XEngineScriptBase.cs b/OpenSim/Region/ScriptEngine/XEngine/Api/Runtime/XEngineScriptBase.cs deleted file mode 100644 index 80d9e2a761..0000000000 --- a/OpenSim/Region/ScriptEngine/XEngine/Api/Runtime/XEngineScriptBase.cs +++ /dev/null @@ -1,61 +0,0 @@ -/* - * Copyright (c) Contributors, http://opensimulator.org/ - * See CONTRIBUTORS.TXT for a full list of copyright holders. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: - * * Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * * Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * * Neither the name of the OpenSimulator Project nor the - * names of its contributors may be used to endorse or promote products - * derived from this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE DEVELOPERS ``AS IS'' AND ANY - * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR ANY - * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - */ - -using System; -using System.Runtime.Remoting; -using System.Runtime.Remoting.Lifetime; -using System.Security.Permissions; -using System.Threading; -using System.Reflection; -using System.Collections; -using System.Collections.Generic; -using OpenSim.Region.ScriptEngine.Interfaces; -using OpenSim.Region.ScriptEngine.Shared; -using OpenSim.Region.ScriptEngine.Shared.ScriptBase; - -namespace OpenSim.Region.ScriptEngine.XEngine.ScriptBase -{ - public class XEngineScriptBase : ScriptBaseClass - { - /// - /// Used for script sleeps when we are using co-operative script termination. - /// - /// null if co-operative script termination is not active - WaitHandle m_coopSleepHandle; - - public XEngineScriptBase(WaitHandle coopSleepHandle) : base() - { - m_coopSleepHandle = coopSleepHandle; - } - - public void opensim_reserved_CheckForCoopTermination() - { - if (m_coopSleepHandle != null && m_coopSleepHandle.WaitOne(0)) - throw new ScriptCoopStopException(); - } - } -} \ No newline at end of file diff --git a/OpenSim/Region/ScriptEngine/XEngine/EventManager.cs b/OpenSim/Region/ScriptEngine/XEngine/EventManager.cs deleted file mode 100644 index 907c8464c8..0000000000 --- a/OpenSim/Region/ScriptEngine/XEngine/EventManager.cs +++ /dev/null @@ -1,470 +0,0 @@ -/* - * Copyright (c) Contributors, http://opensimulator.org/ - * See CONTRIBUTORS.TXT for a full list of copyright holders. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: - * * Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * * Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * * Neither the name of the OpenSimulator Project nor the - * names of its contributors may be used to endorse or promote products - * derived from this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE DEVELOPERS ``AS IS'' AND ANY - * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR ANY - * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - */ - -using System; -using System.Collections; -using System.Collections.Generic; -using System.Reflection; -using OpenMetaverse; -using OpenSim.Framework; -using OpenSim.Region.Framework.Scenes; -using OpenSim.Region.Framework.Interfaces; -using OpenSim.Region.ScriptEngine.Shared; -using OpenSim.Region.ScriptEngine.Interfaces; -using log4net; - -namespace OpenSim.Region.ScriptEngine.XEngine -{ - /// - /// Prepares events so they can be directly executed upon a script by EventQueueManager, then queues it. - /// - public class EventManager - { - private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType); - - private XEngine myScriptEngine; - - public EventManager(XEngine _ScriptEngine) - { - myScriptEngine = _ScriptEngine; - -// m_log.Info("[XEngine] Hooking up to server events"); - myScriptEngine.World.EventManager.OnAttach += attach; - myScriptEngine.World.EventManager.OnObjectGrab += touch_start; - myScriptEngine.World.EventManager.OnObjectGrabbing += touch; - myScriptEngine.World.EventManager.OnObjectDeGrab += touch_end; - myScriptEngine.World.EventManager.OnScriptChangedEvent += changed; - myScriptEngine.World.EventManager.OnScriptAtTargetEvent += at_target; - myScriptEngine.World.EventManager.OnScriptNotAtTargetEvent += not_at_target; - myScriptEngine.World.EventManager.OnScriptAtRotTargetEvent += at_rot_target; - myScriptEngine.World.EventManager.OnScriptNotAtRotTargetEvent += not_at_rot_target; - myScriptEngine.World.EventManager.OnScriptMovingStartEvent += moving_start; - myScriptEngine.World.EventManager.OnScriptMovingEndEvent += moving_end; - myScriptEngine.World.EventManager.OnScriptControlEvent += control; - myScriptEngine.World.EventManager.OnScriptColliderStart += collision_start; - myScriptEngine.World.EventManager.OnScriptColliding += collision; - myScriptEngine.World.EventManager.OnScriptCollidingEnd += collision_end; - myScriptEngine.World.EventManager.OnScriptLandColliderStart += land_collision_start; - myScriptEngine.World.EventManager.OnScriptLandColliding += land_collision; - myScriptEngine.World.EventManager.OnScriptLandColliderEnd += land_collision_end; - myScriptEngine.World.EventManager.OnScriptListenEvent += script_listen; - IMoneyModule money = myScriptEngine.World.RequestModuleInterface(); - if (money != null) - { - money.OnObjectPaid+=HandleObjectPaid; - } - } - - /// - /// When an object gets paid by an avatar and generates the paid event, - /// this will pipe it to the script engine - /// - /// Object ID that got paid - /// Agent Id that did the paying - /// Amount paid - private void HandleObjectPaid(UUID objectID, UUID agentID, - int amount) - { - // Since this is an event from a shared module, all scenes will - // get it. But only one has the object in question. The others - // just ignore it. - // - SceneObjectPart part = - myScriptEngine.World.GetSceneObjectPart(objectID); - - if (part == null) - return; - - if ((part.ScriptEvents & scriptEvents.money) == 0) - part = part.ParentGroup.RootPart; - - m_log.Debug("Paid: " + objectID + " from " + agentID + ", amount " + amount); - -// part = part.ParentGroup.RootPart; - money(part.LocalId, agentID, amount); - } - - /// - /// Handles piping the proper stuff to The script engine for touching - /// Including DetectedParams - /// - /// - /// - /// - /// - /// - public void touch_start(uint localID, uint originalID, Vector3 offsetPos, - IClientAPI remoteClient, SurfaceTouchEventArgs surfaceArgs) - { - // Add to queue for all scripts in ObjectID object - DetectParams[] det = new DetectParams[1]; - det[0] = new DetectParams(); - det[0].Key = remoteClient.AgentId; - det[0].Populate(myScriptEngine.World); - - if (originalID == 0) - { - SceneObjectPart part = myScriptEngine.World.GetSceneObjectPart(localID); - if (part == null) - return; - - det[0].LinkNum = part.LinkNum; - } - else - { - SceneObjectPart originalPart = myScriptEngine.World.GetSceneObjectPart(originalID); - det[0].LinkNum = originalPart.LinkNum; - } - - if (surfaceArgs != null) - { - det[0].SurfaceTouchArgs = surfaceArgs; - } - - myScriptEngine.PostObjectEvent(localID, new EventParams( - "touch_start", new Object[] { new LSL_Types.LSLInteger(1) }, - det)); - } - - public void touch(uint localID, uint originalID, Vector3 offsetPos, - IClientAPI remoteClient, SurfaceTouchEventArgs surfaceArgs) - { - // Add to queue for all scripts in ObjectID object - DetectParams[] det = new DetectParams[1]; - det[0] = new DetectParams(); - det[0].Key = remoteClient.AgentId; - det[0].Populate(myScriptEngine.World); - det[0].OffsetPos = offsetPos; - - if (originalID == 0) - { - SceneObjectPart part = myScriptEngine.World.GetSceneObjectPart(localID); - if (part == null) - return; - - det[0].LinkNum = part.LinkNum; - } - else - { - SceneObjectPart originalPart = myScriptEngine.World.GetSceneObjectPart(originalID); - det[0].LinkNum = originalPart.LinkNum; - } - if (surfaceArgs != null) - { - det[0].SurfaceTouchArgs = surfaceArgs; - } - - myScriptEngine.PostObjectEvent(localID, new EventParams( - "touch", new Object[] { new LSL_Types.LSLInteger(1) }, - det)); - } - - public void touch_end(uint localID, uint originalID, IClientAPI remoteClient, - SurfaceTouchEventArgs surfaceArgs) - { - // Add to queue for all scripts in ObjectID object - DetectParams[] det = new DetectParams[1]; - det[0] = new DetectParams(); - det[0].Key = remoteClient.AgentId; - det[0].Populate(myScriptEngine.World); - - if (originalID == 0) - { - SceneObjectPart part = myScriptEngine.World.GetSceneObjectPart(localID); - if (part == null) - return; - - det[0].LinkNum = part.LinkNum; - } - else - { - SceneObjectPart originalPart = myScriptEngine.World.GetSceneObjectPart(originalID); - det[0].LinkNum = originalPart.LinkNum; - } - - if (surfaceArgs != null) - { - det[0].SurfaceTouchArgs = surfaceArgs; - } - - myScriptEngine.PostObjectEvent(localID, new EventParams( - "touch_end", new Object[] { new LSL_Types.LSLInteger(1) }, - det)); - } - - public void changed(uint localID, uint change, object parameter) - { - // Add to queue for all scripts in localID, Object pass change. - if(parameter == null) - { - myScriptEngine.PostObjectEvent(localID, new EventParams( - "changed", new object[] { new LSL_Types.LSLInteger(change) }, - new DetectParams[0])); - return; - } - if (parameter is UUID) - { - DetectParams det = new DetectParams(); - det.Key = (UUID)parameter; - myScriptEngine.PostObjectEvent(localID, new EventParams( - "changed", new object[] { new LSL_Types.LSLInteger(change) }, - new DetectParams[] { det })); - return; - } - } - - public void script_listen(UUID scriptID, int channel, string name, UUID id, string message) - { - object[] resobj = new object[] - { - new LSL_Types.LSLInteger(channel), - new LSL_Types.LSLString(name), - new LSL_Types.LSLString(id.ToString()), - new LSL_Types.LSLString(message) - }; - myScriptEngine.PostScriptEvent(scriptID, new EventParams("listen", resobj, new DetectParams[0])); - } - - // state_entry: not processed here - // state_exit: not processed here - - public void money(uint localID, UUID agentID, int amount) - { - myScriptEngine.PostObjectEvent(localID, new EventParams( - "money", new object[] { - new LSL_Types.LSLString(agentID.ToString()), - new LSL_Types.LSLInteger(amount) }, - new DetectParams[0])); - } - - public void collision_start(uint localID, ColliderArgs col) - { - // Add to queue for all scripts in ObjectID object - List det = new List(); - - foreach (DetectedObject detobj in col.Colliders) - { - DetectParams d = new DetectParams(); - d.Key =detobj.keyUUID; - d.Populate(myScriptEngine.World, detobj); - det.Add(d); - } - - if (det.Count > 0) - myScriptEngine.PostObjectEvent(localID, new EventParams( - "collision_start", - new Object[] { new LSL_Types.LSLInteger(det.Count) }, - det.ToArray())); - } - - public void collision(uint localID, ColliderArgs col) - { - // Add to queue for all scripts in ObjectID object - List det = new List(); - - foreach (DetectedObject detobj in col.Colliders) - { - DetectParams d = new DetectParams(); - d.Populate(myScriptEngine.World, detobj); - det.Add(d); - } - - if (det.Count > 0) - myScriptEngine.PostObjectEvent(localID, new EventParams( - "collision", new Object[] { new LSL_Types.LSLInteger(det.Count) }, - det.ToArray())); - } - - public void collision_end(uint localID, ColliderArgs col) - { - // Add to queue for all scripts in ObjectID object - List det = new List(); - - foreach (DetectedObject detobj in col.Colliders) - { - DetectParams d = new DetectParams(); - d.Populate(myScriptEngine.World, detobj); - det.Add(d); - } - - if (det.Count > 0) - myScriptEngine.PostObjectEvent(localID, new EventParams( - "collision_end", - new Object[] { new LSL_Types.LSLInteger(det.Count) }, - det.ToArray())); - } - - public void land_collision_start(uint localID, ColliderArgs col) - { - List det = new List(); - - foreach (DetectedObject detobj in col.Colliders) - { - DetectParams d = new DetectParams(); - d.Populate(myScriptEngine.World, detobj); - det.Add(d); - myScriptEngine.PostObjectEvent(localID, new EventParams( - "land_collision_start", - new Object[] { new LSL_Types.Vector3(d.Position) }, - det.ToArray())); - } - - } - - public void land_collision(uint localID, ColliderArgs col) - { - List det = new List(); - - foreach (DetectedObject detobj in col.Colliders) - { - DetectParams d = new DetectParams(); - d.Populate(myScriptEngine.World,detobj); - det.Add(d); - myScriptEngine.PostObjectEvent(localID, new EventParams( - "land_collision", - new Object[] { new LSL_Types.Vector3(d.Position) }, - det.ToArray())); - } - } - - public void land_collision_end(uint localID, ColliderArgs col) - { - List det = new List(); - - foreach (DetectedObject detobj in col.Colliders) - { - DetectParams d = new DetectParams(); - d.Populate(myScriptEngine.World,detobj); - det.Add(d); - myScriptEngine.PostObjectEvent(localID, new EventParams( - "land_collision_end", - new Object[] { new LSL_Types.Vector3(d.Position) }, - det.ToArray())); - } - } - - // timer: not handled here - // listen: not handled here - - public void control(UUID itemID, UUID agentID, uint held, uint change) - { - myScriptEngine.PostScriptEvent(itemID, new EventParams( - "control",new object[] { - new LSL_Types.LSLString(agentID.ToString()), - new LSL_Types.LSLInteger(held), - new LSL_Types.LSLInteger(change)}, - new DetectParams[0])); - } - - public void email(uint localID, UUID itemID, string timeSent, - string address, string subject, string message, int numLeft) - { - myScriptEngine.PostObjectEvent(localID, new EventParams( - "email",new object[] { - new LSL_Types.LSLString(timeSent), - new LSL_Types.LSLString(address), - new LSL_Types.LSLString(subject), - new LSL_Types.LSLString(message), - new LSL_Types.LSLInteger(numLeft)}, - new DetectParams[0])); - } - - public void at_target(UUID itemID, uint handle, Vector3 targetpos, - Vector3 atpos) - { - myScriptEngine.PostScriptEvent(itemID, new EventParams( - "at_target", new object[] { - new LSL_Types.LSLInteger(handle), - new LSL_Types.Vector3(targetpos), - new LSL_Types.Vector3(atpos) }, - new DetectParams[0])); - } - - public void not_at_target(UUID itemID) - { - myScriptEngine.PostScriptEvent(itemID, new EventParams( - "not_at_target",new object[0], - new DetectParams[0])); - } - - public void at_rot_target(UUID itemID, uint handle, Quaternion targetrot, - Quaternion atrot) - { - myScriptEngine.PostScriptEvent(itemID, new EventParams( - "at_rot_target", new object[] { - new LSL_Types.LSLInteger(handle), - new LSL_Types.Quaternion(targetrot), - new LSL_Types.Quaternion(atrot) }, - new DetectParams[0])); - } - - public void not_at_rot_target(UUID itemID) - { - myScriptEngine.PostScriptEvent(itemID, new EventParams( - "not_at_rot_target",new object[0], - new DetectParams[0])); - } - - // run_time_permissions: not handled here - - public void attach(uint localID, UUID itemID, UUID avatar) - { - SceneObjectGroup grp = myScriptEngine.World.GetSceneObjectGroup(localID); - if(grp == null) - return; - - foreach(SceneObjectPart part in grp.Parts) - { - myScriptEngine.PostObjectEvent(part.LocalId, new EventParams( - "attach",new object[] { - new LSL_Types.LSLString(avatar.ToString()) }, - new DetectParams[0])); - } - } - - // dataserver: not handled here - // link_message: not handled here - - public void moving_start(uint localID) - { - myScriptEngine.PostObjectEvent(localID, new EventParams( - "moving_start",new object[0], - new DetectParams[0])); - } - - public void moving_end(uint localID) - { - myScriptEngine.PostObjectEvent(localID, new EventParams( - "moving_end",new object[0], - new DetectParams[0])); - } - - // object_rez: not handled here - // remote_data: not handled here - // http_response: not handled here - } -} diff --git a/OpenSim/Region/ScriptEngine/XEngine/Properties/AssemblyInfo.cs b/OpenSim/Region/ScriptEngine/XEngine/Properties/AssemblyInfo.cs deleted file mode 100644 index b3fedcb79c..0000000000 --- a/OpenSim/Region/ScriptEngine/XEngine/Properties/AssemblyInfo.cs +++ /dev/null @@ -1,36 +0,0 @@ -using System.Reflection; -using System.Runtime.CompilerServices; -using System.Runtime.InteropServices; -using Mono.Addins; - -// General Information about an assembly is controlled through the following -// set of attributes. Change these attribute values to modify the information -// associated with an assembly. -[assembly: AssemblyTitle("OpenSim.Region.ScriptEngine.XEngine")] -[assembly: AssemblyDescription("")] -[assembly: AssemblyConfiguration("")] -[assembly: AssemblyCompany("http://opensimulator.org")] -[assembly: AssemblyProduct("OpenSim")] -[assembly: AssemblyCopyright("OpenSimulator developers")] -[assembly: AssemblyTrademark("")] -[assembly: AssemblyCulture("")] - -// Setting ComVisible to false makes the types in this assembly not visible -// to COM components. If you need to access a type in this assembly from -// COM, set the ComVisible attribute to true on that type. -[assembly: ComVisible(false)] - -// The following GUID is for the ID of the typelib if this project is exposed to COM -[assembly: Guid("1feed7de-3d45-4d3d-80e2-b57566284df5")] - -// Version information for an assembly consists of the following four values: -// -// Major Version -// Minor Version -// Build Number -// Revision -// -[assembly: AssemblyVersion(OpenSim.VersionInfo.AssemblyVersionNumber)] - -[assembly: Addin("OpenSim.Region.ScriptEngine.XEngine", OpenSim.VersionInfo.VersionNumber)] -[assembly: AddinDependency("OpenSim.Region.Framework", OpenSim.VersionInfo.VersionNumber)] diff --git a/OpenSim/Region/ScriptEngine/XEngine/ScriptEngineConsoleCommands.cs b/OpenSim/Region/ScriptEngine/XEngine/ScriptEngineConsoleCommands.cs deleted file mode 100755 index 564bf37baf..0000000000 --- a/OpenSim/Region/ScriptEngine/XEngine/ScriptEngineConsoleCommands.cs +++ /dev/null @@ -1,126 +0,0 @@ -/* - * Copyright (c) Contributors, http://opensimulator.org/ - * See CONTRIBUTORS.TXT for a full list of copyright holders. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: - * * Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * * Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * * Neither the name of the OpenSimulator Project nor the - * names of its contributors may be used to endorse or promote products - * derived from this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE DEVELOPERS ``AS IS'' AND ANY - * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR ANY - * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - */ - -using System; -using System.Collections.Generic; -using OpenSim.Framework; -using OpenSim.Framework.Console; -using OpenSim.Region.ScriptEngine.Interfaces; -using OpenSim.Region.ScriptEngine.Shared.Api; -using OpenSim.Region.ScriptEngine.Shared.Api.Plugins; - -namespace OpenSim.Region.ScriptEngine.XEngine -{ - public class ScriptEngineConsoleCommands - { - IScriptEngine m_engine; - - public ScriptEngineConsoleCommands(IScriptEngine engine) - { - m_engine = engine; - } - - public void RegisterCommands() - { - MainConsole.Instance.Commands.AddCommand( - "Scripts", false, "show script sensors", "show script sensors", "Show script sensors information", - HandleShowSensors); - - MainConsole.Instance.Commands.AddCommand( - "Scripts", false, "show script timers", "show script timers", "Show script sensors information", - HandleShowTimers); - } - - private bool IsSceneSelected() - { - return MainConsole.Instance.ConsoleScene == null || MainConsole.Instance.ConsoleScene == m_engine.World; - } - - private void HandleShowSensors(string module, string[] cmdparams) - { - if (!IsSceneSelected()) - return; - - SensorRepeat sr = AsyncCommandManager.GetSensorRepeatPlugin(m_engine); - - if (sr == null) - { - MainConsole.Instance.Output("Plugin not yet initialized"); - return; - } - - List sensorInfo = sr.GetSensorInfo(); - - ConsoleDisplayTable cdt = new ConsoleDisplayTable(); - cdt.AddColumn("Part name", 40); - cdt.AddColumn("Script item ID", 36); - cdt.AddColumn("Type", 4); - cdt.AddColumn("Interval", 8); - cdt.AddColumn("Range", 8); - cdt.AddColumn("Arc", 8); - - foreach (SensorRepeat.SensorInfo s in sensorInfo) - { - cdt.AddRow(s.host.Name, s.itemID, s.type, s.interval, s.range, s.arc); - } - - MainConsole.Instance.Output(cdt.ToString()); - MainConsole.Instance.Output("Total: {0}", sensorInfo.Count); - } - - private void HandleShowTimers(string module, string[] cmdparams) - { - if (!IsSceneSelected()) - return; - - ScriptTimer timerPlugin = AsyncCommandManager.GetTimerPlugin(m_engine); - - if (timerPlugin == null) - { - MainConsole.Instance.Output("Plugin not yet initialized"); - return; - } - - List timersInfo = timerPlugin.GetTimersInfo(); - - ConsoleDisplayTable cdt = new ConsoleDisplayTable(); - cdt.AddColumn("Part local ID", 13); - cdt.AddColumn("Script item ID", 36); - cdt.AddColumn("Interval", 10); - cdt.AddColumn("Next", 8); - - foreach (ScriptTimer.TimerInfo t in timersInfo) - { - // Convert from 100 ns ticks back to seconds - cdt.AddRow(t.localID, t.itemID, (double)t.interval / 10000000, t.next); - } - - MainConsole.Instance.Output(cdt.ToString()); - MainConsole.Instance.Output("Total: {0}", timersInfo.Count); - } - } -} \ No newline at end of file diff --git a/OpenSim/Region/ScriptEngine/XEngine/Tests/XEngineBasicTests.cs b/OpenSim/Region/ScriptEngine/XEngine/Tests/XEngineBasicTests.cs deleted file mode 100644 index 871dfcbf71..0000000000 --- a/OpenSim/Region/ScriptEngine/XEngine/Tests/XEngineBasicTests.cs +++ /dev/null @@ -1,129 +0,0 @@ -/* - * Copyright (c) Contributors, http://opensimulator.org/ - * See CONTRIBUTORS.TXT for a full list of copyright holders. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: - * * Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * * Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * * Neither the name of the OpenSimulator Project nor the - * names of its contributors may be used to endorse or promote products - * derived from this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE DEVELOPERS ``AS IS'' AND ANY - * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR ANY - * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - */ - -using System; -using System.Collections.Generic; -using System.Threading; -using Nini.Config; -using NUnit.Framework; -using OpenMetaverse; -using OpenSim.Framework; -using OpenSim.Region.CoreModules.Scripting.WorldComm; -using OpenSim.Region.Framework.Scenes; -using OpenSim.Region.Framework.Interfaces; -using OpenSim.Tests.Common; - -namespace OpenSim.Region.ScriptEngine.XEngine.Tests -{ - /// - /// Basic XEngine tests. - /// - [TestFixture] - public class XEngineBasicTests : OpenSimTestCase - { - private TestScene m_scene; - private XEngine m_xEngine; - private AutoResetEvent m_chatEvent = new AutoResetEvent(false); - private OSChatMessage m_osChatMessageReceived; - - [TestFixtureSetUp] - public void Init() - { - //AppDomain.CurrentDomain.SetData("APPBASE", Environment.CurrentDirectory + "/bin"); -// Console.WriteLine(AppDomain.CurrentDomain.BaseDirectory); - m_xEngine = new XEngine(); - - IniConfigSource configSource = new IniConfigSource(); - - IConfig startupConfig = configSource.AddConfig("Startup"); - startupConfig.Set("DefaultScriptEngine", "XEngine"); - - IConfig xEngineConfig = configSource.AddConfig("XEngine"); - xEngineConfig.Set("Enabled", "true"); - xEngineConfig.Set("StartDelay", "0"); - - // These tests will not run with AppDomainLoading = true, at least on mono. For unknown reasons, the call - // to AssemblyResolver.OnAssemblyResolve fails. - xEngineConfig.Set("AppDomainLoading", "false"); - - m_scene = new SceneHelpers().SetupScene("My Test", UUID.Random(), 1000, 1000, configSource); - SceneHelpers.SetupSceneModules(m_scene, configSource, m_xEngine); - m_scene.StartScripts(); - } - - /// - /// Test compilation and starting of a script. - /// - /// - /// This is a less than ideal regression test since it involves an asynchronous operation (in this case, - /// compilation of the script). - /// - [Test] - public void TestCompileAndStartScript() - { - TestHelpers.InMethod(); - TestHelpers.EnableLogging(); - - UUID userId = TestHelpers.ParseTail(0x1); -// UUID objectId = TestHelpers.ParseTail(0x100); -// UUID itemId = TestHelpers.ParseTail(0x3); - string itemName = "TestStartScript() Item"; - - SceneObjectGroup so = SceneHelpers.CreateSceneObject(1, userId, "TestStartScriptPart_", 0x100); - m_scene.AddNewSceneObject(so, true); - - InventoryItemBase itemTemplate = new InventoryItemBase(); -// itemTemplate.ID = itemId; - itemTemplate.Name = itemName; - itemTemplate.Folder = so.UUID; - itemTemplate.InvType = (int)InventoryType.LSL; - - m_scene.EventManager.OnChatFromWorld += OnChatFromWorld; - - SceneObjectPart partWhereRezzed = m_scene.RezNewScript(userId, itemTemplate, Constants.DefaultScriptText); - - m_chatEvent.WaitOne(60000); - - Assert.That(m_osChatMessageReceived, Is.Not.Null, "No chat message received in TestStartScript()"); - Assert.That(m_osChatMessageReceived.Message, Is.EqualTo("Script running")); - - bool running; - TaskInventoryItem scriptItem = partWhereRezzed.Inventory.GetInventoryItem(itemName); - Assert.That( - SceneObjectPartInventory.TryGetScriptInstanceRunning(m_scene, scriptItem, out running), Is.True); - Assert.That(running, Is.True); - } - - private void OnChatFromWorld(object sender, OSChatMessage oscm) - { -// Console.WriteLine("Got chat [{0}]", oscm.Message); - - m_osChatMessageReceived = oscm; - m_chatEvent.Set(); - } - } -} \ No newline at end of file diff --git a/OpenSim/Region/ScriptEngine/XEngine/Tests/XEngineCrossingTests.cs b/OpenSim/Region/ScriptEngine/XEngine/Tests/XEngineCrossingTests.cs deleted file mode 100644 index 477059f9fe..0000000000 --- a/OpenSim/Region/ScriptEngine/XEngine/Tests/XEngineCrossingTests.cs +++ /dev/null @@ -1,209 +0,0 @@ -/* - * Copyright (c) Contributors, http://opensimulator.org/ - * See CONTRIBUTORS.TXT for a full list of copyright holders. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: - * * Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * * Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * * Neither the name of the OpenSimulator Project nor the - * names of its contributors may be used to endorse or promote products - * derived from this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE DEVELOPERS ``AS IS'' AND ANY - * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR ANY - * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - */ - -using System; -using System.Threading; -using Nini.Config; -using NUnit.Framework; -using OpenMetaverse; -using OpenSim.Framework; -using OpenSim.Region.CoreModules.Framework.EntityTransfer; -using OpenSim.Region.CoreModules.ServiceConnectorsOut.Simulation; -using OpenSim.Region.Framework.Scenes; -using OpenSim.Region.ScriptEngine.Shared; -using OpenSim.Tests.Common; - -namespace OpenSim.Region.ScriptEngine.XEngine.Tests -{ - /// - /// XEngine tests connected with crossing scripts between regions. - /// - [TestFixture] - public class XEngineCrossingTests : OpenSimTestCase - { - [TestFixtureSetUp] - public void FixtureInit() - { - // Don't allow tests to be bamboozled by asynchronous events. Execute everything on the same thread. - Util.FireAndForgetMethod = FireAndForgetMethod.RegressionTest; - } - - [TestFixtureTearDown] - public void TearDown() - { - // We must set this back afterwards, otherwise later tests will fail since they're expecting multiple - // threads. Possibly, later tests should be rewritten so none of them require async stuff (which regression - // tests really shouldn't). - Util.FireAndForgetMethod = Util.DefaultFireAndForgetMethod; - } - - /// - /// Test script state preservation when a script crosses between regions on the same simulator. - /// - [Test] - public void TestScriptCrossOnSameSimulator() - { - TestHelpers.InMethod(); -// TestHelpers.EnableLogging(); - - UUID userId = TestHelpers.ParseTail(0x1); - int sceneObjectIdTail = 0x2; - - EntityTransferModule etmA = new EntityTransferModule(); - EntityTransferModule etmB = new EntityTransferModule(); - LocalSimulationConnectorModule lscm = new LocalSimulationConnectorModule(); - XEngine xEngineA = new XEngine(); - XEngine xEngineB = new XEngine(); - xEngineA.DebugLevel = 1; - xEngineB.DebugLevel = 1; - - IConfigSource configSource = new IniConfigSource(); - - IConfig startupConfig = configSource.AddConfig("Startup"); - startupConfig.Set("DefaultScriptEngine", "XEngine"); - startupConfig.Set("TrustBinaries", "true"); - - IConfig xEngineConfig = configSource.AddConfig("XEngine"); - xEngineConfig.Set("Enabled", "true"); - xEngineConfig.Set("StartDelay", "0"); - - // These tests will not run with AppDomainLoading = true, at least on mono. For unknown reasons, the call - // to AssemblyResolver.OnAssemblyResolve fails. - xEngineConfig.Set("AppDomainLoading", "false"); - - IConfig modulesConfig = configSource.AddConfig("Modules"); - modulesConfig.Set("EntityTransferModule", etmA.Name); - modulesConfig.Set("SimulationServices", lscm.Name); - - SceneHelpers sh = new SceneHelpers(); - TestScene sceneA = sh.SetupScene("sceneA", TestHelpers.ParseTail(0x100), 1000, 1000, configSource); - TestScene sceneB = sh.SetupScene("sceneB", TestHelpers.ParseTail(0x200), 1000, 999, configSource); - - SceneHelpers.SetupSceneModules(new Scene[] { sceneA, sceneB }, configSource, lscm); - SceneHelpers.SetupSceneModules(sceneA, configSource, etmA, xEngineA); - SceneHelpers.SetupSceneModules(sceneB, configSource, etmB, xEngineB); - sceneA.StartScripts(); - sceneB.StartScripts(); - - SceneObjectGroup soSceneA = SceneHelpers.AddSceneObject(sceneA, 1, userId, "so1-", sceneObjectIdTail); - soSceneA.AbsolutePosition = new Vector3(128, 10, 20); - - string soSceneAName = soSceneA.Name; - string scriptItemSceneAName = "script1"; - - // CREATE SCRIPT TODO - InventoryItemBase scriptItemSceneA = new InventoryItemBase(); - // itemTemplate.ID = itemId; - scriptItemSceneA.Name = scriptItemSceneAName; - scriptItemSceneA.Folder = soSceneA.UUID; - scriptItemSceneA.InvType = (int)InventoryType.LSL; - - AutoResetEvent chatEvent = new AutoResetEvent(false); - OSChatMessage messageReceived = null; - sceneA.EventManager.OnChatFromWorld += (s, m) => { messageReceived = m; chatEvent.Set(); }; - - sceneA.RezNewScript(userId, scriptItemSceneA, -@"integer c = 0; - -default -{ - state_entry() - { - llSay(0, ""Script running""); - } - - changed(integer change) - { - llSay(0, ""Changed""); - } - - touch_start(integer n) - { - c = c + 1; - llSay(0, (string)c); - } -}"); - - chatEvent.WaitOne(60000); - - Assert.That(messageReceived, Is.Not.Null, "No chat message received."); - Assert.That(messageReceived.Message, Is.EqualTo("Script running")); - - { - // XXX: Should not be doing this so directly. Should call some variant of EventManager.touch() instead. - DetectParams[] det = new DetectParams[1]; - det[0] = new DetectParams(); - det[0].Key = userId; - det[0].Populate(sceneA); - - EventParams ep = new EventParams("touch_start", new Object[] { new LSL_Types.LSLInteger(1) }, det); - - messageReceived = null; - chatEvent.Reset(); - xEngineA.PostObjectEvent(soSceneA.LocalId, ep); - chatEvent.WaitOne(60000); - - Assert.That(messageReceived.Message, Is.EqualTo("1")); - } - - AutoResetEvent chatEventB = new AutoResetEvent(false); - sceneB.EventManager.OnChatFromWorld += (s, m) => { messageReceived = m; chatEventB.Set(); }; - - messageReceived = null; - chatEventB.Reset(); - // Cross with a negative value - soSceneA.AbsolutePosition = new Vector3(128, -10, 20); - - chatEventB.WaitOne(60000); - Assert.That(messageReceived, Is.Not.Null, "No Changed message received."); - Assert.That(messageReceived.Message, Is.Not.Null, "Changed message without content"); - Assert.That(messageReceived.Message, Is.EqualTo("Changed")); - - // TEST sending event to moved prim and output - { - SceneObjectGroup soSceneB = sceneB.GetSceneObjectGroup(soSceneAName); - TaskInventoryItem scriptItemSceneB = soSceneB.RootPart.Inventory.GetInventoryItem(scriptItemSceneAName); - - // XXX: Should not be doing this so directly. Should call some variant of EventManager.touch() instead. - DetectParams[] det = new DetectParams[1]; - det[0] = new DetectParams(); - det[0].Key = userId; - det[0].Populate(sceneB); - - EventParams ep = new EventParams("touch_start", new Object[] { new LSL_Types.LSLInteger(1) }, det); - - Thread.Sleep(250); // wait for other change messages to pass - messageReceived = null; - chatEventB.Reset(); - xEngineB.PostObjectEvent(soSceneB.LocalId, ep); - chatEventB.WaitOne(60000); - - Assert.That(messageReceived.Message, Is.EqualTo("2")); - } - } - } -} \ No newline at end of file diff --git a/OpenSim/Region/ScriptEngine/XEngine/Tests/XEnginePersistenceTests.cs b/OpenSim/Region/ScriptEngine/XEngine/Tests/XEnginePersistenceTests.cs deleted file mode 100644 index 07470d6ec9..0000000000 --- a/OpenSim/Region/ScriptEngine/XEngine/Tests/XEnginePersistenceTests.cs +++ /dev/null @@ -1,154 +0,0 @@ -/* - * Copyright (c) Contributors, http://opensimulator.org/ - * See CONTRIBUTORS.TXT for a full list of copyright holders. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: - * * Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * * Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * * Neither the name of the OpenSimulator Project nor the - * names of its contributors may be used to endorse or promote products - * derived from this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE DEVELOPERS ``AS IS'' AND ANY - * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR ANY - * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - */ - -using System; -using System.Collections.Generic; -using System.IO; -using System.Linq; -using System.Threading; -using Nini.Config; -using NUnit.Framework; -using OpenMetaverse; -using OpenSim.Framework; -using OpenSim.Region.CoreModules.Avatar.Attachments; -using OpenSim.Region.CoreModules.Framework.InventoryAccess; -using OpenSim.Region.Framework.Scenes; -using OpenSim.Region.ScriptEngine.XEngine; -using OpenSim.Services.Interfaces; -using OpenSim.Tests.Common; - -namespace OpenSim.Region.ScriptEngine.Tests -{ - /* - [TestFixture] - public class XEnginePersistenceTests : OpenSimTestCase - { - private AutoResetEvent m_chatEvent = new AutoResetEvent(false); - - private void OnChatFromWorld(object sender, OSChatMessage oscm) - { - // Console.WriteLine("Got chat [{0}]", oscm.Message); - - // m_osChatMessageReceived = oscm; - m_chatEvent.Set(); - } - - private void AddCommonConfig(IConfigSource config, List modules) - { - config.AddConfig("Modules"); - config.Configs["Modules"].Set("InventoryAccessModule", "BasicInventoryAccessModule"); - - AttachmentsModule attMod = new AttachmentsModule(); - attMod.DebugLevel = 1; - modules.Add(attMod); - modules.Add(new BasicInventoryAccessModule()); - } - - private void AddScriptingConfig(IConfigSource config, XEngine.XEngine xEngine, List modules) - { - IConfig startupConfig = config.AddConfig("Startup"); - startupConfig.Set("DefaultScriptEngine", "XEngine"); - - IConfig xEngineConfig = config.AddConfig("XEngine"); - xEngineConfig.Set("Enabled", "true"); - xEngineConfig.Set("StartDelay", "0"); - - // These tests will not run with AppDomainLoading = true, at least on mono. For unknown reasons, the call - // to AssemblyResolver.OnAssemblyResolve fails. - xEngineConfig.Set("AppDomainLoading", "false"); - - modules.Add(xEngine); - } - - private Scene CreateScriptingEnabledTestScene(XEngine.XEngine xEngine) - { - IConfigSource config = new IniConfigSource(); - List modules = new List(); - - AddCommonConfig(config, modules); - AddScriptingConfig(config, xEngine, modules); - - Scene scene - = new SceneHelpers().SetupScene( - "attachments-test-scene", TestHelpers.ParseTail(999), 1000, 1000, config); - SceneHelpers.SetupSceneModules(scene, config, modules.ToArray()); - - scene.StartScripts(); - - return scene; - } - - [Test] - public void TestScriptedAttachmentPersistence() - { - TestHelpers.InMethod(); -// TestHelpers.EnableLogging(); - - XEngine.XEngine xEngine = new XEngine.XEngine(); - Scene scene = CreateScriptingEnabledTestScene(xEngine); - UserAccount ua1 = UserAccountHelpers.CreateUserWithInventory(scene, 0x1); - ScenePresence sp = SceneHelpers.AddScenePresence(scene, ua1); - - SceneObjectGroup so = SceneHelpers.CreateSceneObject(1, sp.UUID, "att-name", 0x10); - TaskInventoryHelpers.AddScript( - scene.AssetService, - so.RootPart, - "scriptItem", - "default { attach(key id) { if (id != NULL_KEY) { llSay(0, \"Hello World\"); } } }"); - - InventoryItemBase userItem = UserInventoryHelpers.AddInventoryItem(scene, so, 0x100, 0x1000); - - // FIXME: Right now, we have to do a tricksy chat listen to make sure we know when the script is running. - // In the future, we need to be able to do this programatically more predicably. - scene.EventManager.OnChatFromWorld += OnChatFromWorld; - - SceneObjectGroup rezzedSo - = scene.AttachmentsModule.RezSingleAttachmentFromInventory(sp, userItem.ID, (uint)AttachmentPoint.Chest); - TaskInventoryItem rezzedScriptItem = rezzedSo.RootPart.Inventory.GetInventoryItem("scriptItem"); - - // Wait for chat to signal rezzed script has been started. - m_chatEvent.WaitOne(60000); - - // Force save - xEngine.DoBackup(new Object[] { 0 }); - -// Console.WriteLine("ItemID {0}", rezzedScriptItem.ItemID); -// -// foreach ( -// string s in Directory.EnumerateFileSystemEntries( -// string.Format("ScriptEngines/{0}", scene.RegionInfo.RegionID))) -// Console.WriteLine(s); - - Assert.IsFalse( - File.Exists( - string.Format("ScriptEngines/{0}/{1}.state", scene.RegionInfo.RegionID, rezzedScriptItem.ItemID))); - - scene.AttachmentsModule.DetachSingleAttachmentToInv(sp, rezzedSo); - } - } - */ -} \ No newline at end of file diff --git a/OpenSim/Region/ScriptEngine/XEngine/XEngine.cs b/OpenSim/Region/ScriptEngine/XEngine/XEngine.cs deleted file mode 100755 index 58b1f87252..0000000000 --- a/OpenSim/Region/ScriptEngine/XEngine/XEngine.cs +++ /dev/null @@ -1,2535 +0,0 @@ -/* - * Copyright (c) Contributors, http://opensimulator.org/ - * See CONTRIBUTORS.TXT for a full list of copyright holders. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: - * * Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * * Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * * Neither the name of the OpenSimulator Project nor the - * names of its contributors may be used to endorse or promote products - * derived from this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE DEVELOPERS ``AS IS'' AND ANY - * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR ANY - * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - */ - -using System; -using System.Collections; -using System.Collections.Generic; -using System.Globalization; -using System.IO; -using System.Linq; -using System.Reflection; -using System.Security; -using System.Security.Policy; -using System.Text; -using System.Threading; -using System.Xml; -using OpenMetaverse; -using OpenMetaverse.StructuredData; -using log4net; -using Nini.Config; -using Amib.Threading; -using Mono.Addins; -using OpenSim.Framework; -using OpenSim.Framework.Console; -using OpenSim.Region.Framework.Scenes; -using OpenSim.Region.Framework.Interfaces; -using OpenSim.Region.ScriptEngine.Interfaces; -using OpenSim.Region.ScriptEngine.Shared; -using OpenSim.Region.ScriptEngine.Shared.CodeTools; -using OpenSim.Region.ScriptEngine.Shared.Instance; -using OpenSim.Region.ScriptEngine.Shared.Api; -using OpenSim.Region.ScriptEngine.Shared.Api.Plugins; -using OpenSim.Region.ScriptEngine.Shared.ScriptBase; -using OpenSim.Region.ScriptEngine.XEngine.ScriptBase; -using ScriptTimer = OpenSim.Region.ScriptEngine.Shared.Api.Plugins.ScriptTimer; - -using ScriptCompileQueue = OpenSim.Framework.LocklessQueue; - -namespace OpenSim.Region.ScriptEngine.XEngine -{ - [Extension(Path = "/OpenSim/RegionModules", NodeName = "RegionModule", Id = "XEngine")] - public class XEngine : INonSharedRegionModule, IScriptModule, IScriptEngine - { - private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType); - - /// - /// Control the printing of certain debug messages. - /// - /// - /// If DebugLevel >= 1, then we log every time that a script is started. - /// - public int DebugLevel { get; set; } - - /// - /// A parameter to allow us to notify the log if at least one script has a compilation that is not compatible - /// with ScriptStopStrategy. - /// - public bool HaveNotifiedLogOfScriptStopMismatch { get; private set; } - - private SmartThreadPool m_ThreadPool; - private int m_MaxScriptQueue; - private Scene m_Scene; - private IConfig m_ScriptConfig = null; - private IConfigSource m_ConfigSource = null; - private ICompiler m_Compiler; - private int m_MinThreads; - private int m_MaxThreads; - - /// - /// Amount of time to delay before starting. - /// - private int m_StartDelay; - - /// - /// Are we stopping scripts co-operatively by inserting checks in them at C# compile time (true) or aborting - /// their threads (false)? - /// - private bool m_coopTermination; - - private int m_IdleTimeout; - private int m_StackSize; - private int m_SleepTime; - private int m_SaveTime; - private ThreadPriority m_Prio; - private bool m_Enabled = false; - private bool m_InitialStartup = true; - private int m_ScriptFailCount; // Number of script fails since compile queue was last empty - private string m_ScriptErrorMessage; - private bool m_AppDomainLoading; - private bool m_AttachmentsDomainLoading; - private Dictionary m_ScriptErrors = - new Dictionary(); - - // disable warning: need to keep a reference to XEngine.EventManager - // alive to avoid it being garbage collected -#pragma warning disable 414 - private EventManager m_EventManager; -#pragma warning restore 414 - private IXmlRpcRouter m_XmlRpcRouter; - private int m_EventLimit; - private bool m_KillTimedOutScripts; - - /// - /// Number of milliseconds we will wait for a script event to complete on script stop before we forcibly abort - /// its thread. - /// - /// - /// It appears that if a script thread is aborted whilst it is holding ReaderWriterLockSlim (possibly the write - /// lock) then the lock is not properly released. This causes mono 2.6, 2.10 and possibly - /// later to crash, sometimes with symptoms such as a leap to 100% script usage and a vm thead dump showing - /// all threads waiting on release of ReaderWriterLockSlim write thread which none of the threads listed - /// actually hold. - /// - /// Pausing for event completion reduces the risk of this happening. However, it may be that aborting threads - /// is not a mono issue per se but rather a risky activity in itself in an AppDomain that is not immediately - /// shutting down. - /// - private int m_WaitForEventCompletionOnScriptStop = 1000; - - private string m_ScriptEnginesPath = null; - - private ExpiringCache m_runFlags = new ExpiringCache(); - - /// - /// Is the entire simulator in the process of shutting down? - /// - private bool m_SimulatorShuttingDown; - - private static List m_ScriptEngines = - new List(); - - // Maps the local id to the script inventory items in it - - private Dictionary > m_PrimObjects = - new Dictionary >(); - - // Maps the UUID above to the script instance - - private Dictionary m_Scripts = - new Dictionary(); - - // Maps the asset ID to the assembly - - private Dictionary m_Assemblies = - new Dictionary(); - - private Dictionary m_AddingAssemblies = - new Dictionary(); - - // This will list AppDomains by script asset - - private Dictionary m_AppDomains = - new Dictionary(); - - // List the scripts running in each appdomain - - private Dictionary > m_DomainScripts = - new Dictionary >(); - - private ScriptCompileQueue m_CompileQueue = new ScriptCompileQueue(); - IWorkItemResult m_CurrentCompile = null; - private Dictionary m_CompileDict = new Dictionary(); - - private ScriptEngineConsoleCommands m_consoleCommands; - - public string ScriptEngineName - { - get { return "XEngine"; } - } - - public string ScriptClassName { get; private set; } - - public string ScriptBaseClassName { get; private set; } - - public ParameterInfo[] ScriptBaseClassParameters { get; private set; } - - public string[] ScriptReferencedAssemblies { get; private set; } - - public Scene World - { - get { return m_Scene; } - } - - public static List ScriptEngines - { - get { return m_ScriptEngines; } - } - - public IScriptModule ScriptModule - { - get { return this; } - } - - // private struct RezScriptParms - // { - // uint LocalID; - // UUID ItemID; - // string Script; - // } - - public IConfig Config - { - get { return m_ScriptConfig; } - } - - public string ScriptEnginePath - { - get { return m_ScriptEnginesPath; } - } - - public IConfigSource ConfigSource - { - get { return m_ConfigSource; } - } - - private class ScriptCompileInfo - { - public List eventList = new List(); - } - - /// - /// Event fired after the script engine has finished removing a script. - /// - public event ScriptRemoved OnScriptRemoved; - - /// - /// Event fired after the script engine has finished removing a script from an object. - /// - public event ObjectRemoved OnObjectRemoved; - - public void Initialise(IConfigSource configSource) - { - m_ScriptConfig = configSource.Configs["XEngine"]; - if (m_ScriptConfig == null) - return; - - if (!m_ScriptConfig.GetBoolean("Enabled", true)) - return; - - m_Enabled = true; - - m_ConfigSource = configSource; - - string rawScriptStopStrategy = m_ScriptConfig.GetString("ScriptStopStrategy", "co-op"); - - m_log.InfoFormat("[XEngine]: Script stop strategy is {0}", rawScriptStopStrategy); - - if (rawScriptStopStrategy == "co-op") - { - m_coopTermination = true; - ScriptClassName = "XEngineScript"; - ScriptBaseClassName = typeof(XEngineScriptBase).FullName; - ScriptBaseClassParameters = typeof(XEngineScriptBase).GetConstructor(new Type[] { typeof(WaitHandle) }).GetParameters(); - ScriptReferencedAssemblies = new string[] { Path.GetFileName(typeof(XEngineScriptBase).Assembly.Location) }; - } - else - { - ScriptClassName = "Script"; - ScriptBaseClassName = typeof(ScriptBaseClass).FullName; - } - -// Console.WriteLine("ASSEMBLY NAME: {0}", ScriptReferencedAssemblies[0]); - } - - public void AddRegion(Scene scene) - { - if (!m_Enabled) - return; - - m_ScriptFailCount = 0; - m_ScriptErrorMessage = String.Empty; - - AppDomain.CurrentDomain.AssemblyResolve += OnAssemblyResolve; - - m_Scene = scene; - m_log.InfoFormat("[XEngine]: Initializing scripts in region {0}", m_Scene.RegionInfo.RegionName); - - m_MinThreads = m_ScriptConfig.GetInt("MinThreads", 2); - m_MaxThreads = m_ScriptConfig.GetInt("MaxThreads", 100); - m_IdleTimeout = m_ScriptConfig.GetInt("IdleTimeout", 60); - string priority = m_ScriptConfig.GetString("Priority", "BelowNormal"); - m_StartDelay = m_ScriptConfig.GetInt("StartDelay", 15000); - m_MaxScriptQueue = m_ScriptConfig.GetInt("MaxScriptEventQueue",300); - m_StackSize = m_ScriptConfig.GetInt("ThreadStackSize", 262144); - m_SleepTime = m_ScriptConfig.GetInt("MaintenanceInterval", 10) * 1000; - m_AppDomainLoading = m_ScriptConfig.GetBoolean("AppDomainLoading", false); - m_AttachmentsDomainLoading = m_ScriptConfig.GetBoolean("AttachmentsDomainLoading", false); - m_EventLimit = m_ScriptConfig.GetInt("EventLimit", 30); - m_KillTimedOutScripts = m_ScriptConfig.GetBoolean("KillTimedOutScripts", false); - m_SaveTime = m_ScriptConfig.GetInt("SaveInterval", 120) * 1000; - m_WaitForEventCompletionOnScriptStop - = m_ScriptConfig.GetInt("WaitForEventCompletionOnScriptStop", m_WaitForEventCompletionOnScriptStop); - - m_ScriptEnginesPath = m_ScriptConfig.GetString("ScriptEnginesPath", "ScriptEngines"); - - m_Prio = ThreadPriority.BelowNormal; - switch (priority) - { - case "Lowest": - m_Prio = ThreadPriority.Lowest; - break; - case "BelowNormal": - m_Prio = ThreadPriority.BelowNormal; - break; - case "Normal": - m_Prio = ThreadPriority.Normal; - break; - case "AboveNormal": - m_Prio = ThreadPriority.AboveNormal; - break; - case "Highest": - m_Prio = ThreadPriority.Highest; - break; - default: - m_log.ErrorFormat("[XEngine] Invalid thread priority: '{0}'. Assuming BelowNormal", priority); - break; - } - - lock (m_ScriptEngines) - { - m_ScriptEngines.Add(this); - } - - // Needs to be here so we can queue the scripts that need starting - // - m_Scene.EventManager.OnRezScript += OnRezScript; - - // Complete basic setup of the thread pool - // - SetupEngine(m_MinThreads, m_MaxThreads, m_IdleTimeout, m_Prio, - m_MaxScriptQueue, m_StackSize); - - m_Scene.StackModuleInterface(this); - - m_XmlRpcRouter = m_Scene.RequestModuleInterface(); - if (m_XmlRpcRouter != null) - { - OnScriptRemoved += m_XmlRpcRouter.ScriptRemoved; - OnObjectRemoved += m_XmlRpcRouter.ObjectRemoved; - } - - m_consoleCommands = new ScriptEngineConsoleCommands(this); - m_consoleCommands.RegisterCommands(); - - MainConsole.Instance.Commands.AddCommand( - "Scripts", false, "xengine status", "xengine status", "Show status information", - "Show status information on the script engine.", - HandleShowStatus); - - MainConsole.Instance.Commands.AddCommand( - "Scripts", false, "scripts show", "scripts show [+]", "Show script information", - "Show information on all scripts known to the script engine.\n" - + "If one or more s are given then only information on that script will be shown.", - HandleShowScripts); - - MainConsole.Instance.Commands.AddCommand( - "Scripts", false, "show scripts", "show scripts [+]", "Show script information", - "Synonym for scripts show command", HandleShowScripts); - - MainConsole.Instance.Commands.AddCommand( - "Scripts", false, "scripts suspend", "scripts suspend [+]", "Suspends all running scripts", - "Suspends all currently running scripts. This only suspends event delivery, it will not suspend a" - + " script that is currently processing an event.\n" - + "Suspended scripts will continue to accumulate events but won't process them.\n" - + "If one or more s are given then only that script will be suspended. Otherwise, all suitable scripts are suspended.", - (module, cmdparams) => HandleScriptsAction(cmdparams, HandleSuspendScript)); - - MainConsole.Instance.Commands.AddCommand( - "Scripts", false, "scripts resume", "scripts resume [+]", "Resumes all suspended scripts", - "Resumes all currently suspended scripts.\n" - + "Resumed scripts will process all events accumulated whilst suspended.\n" - + "If one or more s are given then only that script will be resumed. Otherwise, all suitable scripts are resumed.", - (module, cmdparams) => HandleScriptsAction(cmdparams, HandleResumeScript)); - - MainConsole.Instance.Commands.AddCommand( - "Scripts", false, "scripts stop", "scripts stop [+]", "Stops all running scripts", - "Stops all running scripts.\n" - + "If one or more s are given then only that script will be stopped. Otherwise, all suitable scripts are stopped.", - (module, cmdparams) => HandleScriptsAction(cmdparams, HandleStopScript)); - - MainConsole.Instance.Commands.AddCommand( - "Scripts", false, "scripts start", "scripts start [+]", "Starts all stopped scripts", - "Starts all stopped scripts.\n" - + "If one or more s are given then only that script will be started. Otherwise, all suitable scripts are started.", - (module, cmdparams) => HandleScriptsAction(cmdparams, HandleStartScript)); - - MainConsole.Instance.Commands.AddCommand( - "Debug", false, "debug scripts log", "debug scripts log ", "Extra debug logging for a particular script.", - "Activates or deactivates extra debug logging for the given script.\n" - + "Level == 0, deactivate extra debug logging.\n" - + "Level >= 1, log state changes.\n" - + "Level >= 2, log event invocations.\n", - HandleDebugScriptLogCommand); - - MainConsole.Instance.Commands.AddCommand( - "Debug", false, "debug xengine log", "debug xengine log []", - "Turn on detailed xengine debugging.", - "If level <= 0, then no extra logging is done.\n" - + "If level >= 1, then we log every time that a script is started.", - HandleDebugLevelCommand); - } - - private void HandleDebugScriptLogCommand(string module, string[] args) - { - if (!(MainConsole.Instance.ConsoleScene == null || MainConsole.Instance.ConsoleScene == m_Scene)) - return; - - if (args.Length != 5) - { - MainConsole.Instance.Output("Usage: debug script log "); - return; - } - - UUID itemId; - - if (!ConsoleUtil.TryParseConsoleUuid(MainConsole.Instance, args[3], out itemId)) - return; - - int newLevel; - - if (!ConsoleUtil.TryParseConsoleInt(MainConsole.Instance, args[4], out newLevel)) - return; - - IScriptInstance si; - - lock (m_Scripts) - { - // XXX: We can't give the user feedback on a bad item id because this may apply to a different script - // engine - if (!m_Scripts.TryGetValue(itemId, out si)) - return; - } - - si.DebugLevel = newLevel; - MainConsole.Instance.Output("Set debug level of {0} {1} to {2}", si.ScriptName, si.ItemID, newLevel); - } - - /// - /// Change debug level - /// - /// - /// - private void HandleDebugLevelCommand(string module, string[] args) - { - if (args.Length >= 4) - { - int newDebug; - if (ConsoleUtil.TryParseConsoleNaturalInt(MainConsole.Instance, args[3], out newDebug)) - { - DebugLevel = newDebug; - MainConsole.Instance.Output("Debug level set to {0} in XEngine for region {1}", newDebug, m_Scene.Name); - } - } - else if (args.Length == 3) - { - MainConsole.Instance.Output("Current debug level is {0}", DebugLevel); - } - else - { - MainConsole.Instance.Output("Usage: debug xengine log "); - } - } - - /// - /// Parse the raw item id into a script instance from the command params if it's present. - /// - /// - /// - /// Basis on which to sort output. Can be null if no sort needs to take place - private void HandleScriptsAction(string[] cmdparams, Action action) - { - HandleScriptsAction(cmdparams, action, null); - } - - /// - /// Parse the raw item id into a script instance from the command params if it's present. - /// - /// - /// - /// Basis on which to sort output. Can be null if no sort needs to take place - private void HandleScriptsAction( - string[] cmdparams, Action action, System.Func keySelector) - { - if (!(MainConsole.Instance.ConsoleScene == null || MainConsole.Instance.ConsoleScene == m_Scene)) - return; - - lock (m_Scripts) - { - string rawItemId; - UUID itemId = UUID.Zero; - - if (cmdparams.Length == 2) - { - IEnumerable scripts = m_Scripts.Values; - - if (keySelector != null) - scripts = scripts.OrderBy(keySelector); - - foreach (IScriptInstance instance in scripts) - action(instance); - - return; - } - - for (int i = 2; i < cmdparams.Length; i++) - { - rawItemId = cmdparams[i]; - - if (!UUID.TryParse(rawItemId, out itemId)) - { - MainConsole.Instance.Output("ERROR: {0} is not a valid UUID", rawItemId); - continue; - } - - if (!itemId.IsZero()) - { - IScriptInstance instance = GetInstance(itemId); - if (instance == null) - { - // Commented out for now since this will cause false reports on simulators with more than - // one scene where the current command line set region is 'root' (which causes commands to - // go to both regions... (sigh) - // MainConsole.Instance.OutputFormat("Error - No item found with id {0}", itemId); - continue; - } - else - { - action(instance); - } - } - } - } - } - - private void HandleShowStatus(string module, string[] cmdparams) - { - if (!(MainConsole.Instance.ConsoleScene == null || MainConsole.Instance.ConsoleScene == m_Scene)) - return; - - MainConsole.Instance.Output(GetStatusReport()); - } - - public string GetStatusReport() - { - StringBuilder sb = new StringBuilder(); - sb.AppendFormat("Status of XEngine instance for {0}\n", m_Scene.RegionInfo.RegionName); - - long scriptsLoaded, eventsQueued = 0, eventsProcessed = 0; - - lock (m_Scripts) - { - scriptsLoaded = m_Scripts.Count; - - foreach (IScriptInstance si in m_Scripts.Values) - { - eventsQueued += si.EventsQueued; - eventsProcessed += si.EventsProcessed; - } - } - - sb.AppendFormat("Scripts loaded : {0}\n", scriptsLoaded); - sb.AppendFormat("Scripts waiting for load : {0}\n", m_CompileQueue.Count); - sb.AppendFormat("Max threads : {0}\n", m_ThreadPool.MaxThreads); - sb.AppendFormat("Min threads : {0}\n", m_ThreadPool.MinThreads); - sb.AppendFormat("Allocated threads : {0}\n", m_ThreadPool.ActiveThreads); - sb.AppendFormat("In use threads : {0}\n", m_ThreadPool.InUseThreads); - sb.AppendFormat("Work items waiting : {0}\n", m_ThreadPool.WaitingCallbacks); -// sb.AppendFormat("Assemblies loaded : {0}\n", m_Assemblies.Count); - sb.AppendFormat("Events queued : {0}\n", eventsQueued); - sb.AppendFormat("Events processed : {0}\n", eventsProcessed); - - SensorRepeat sr = AsyncCommandManager.GetSensorRepeatPlugin(this); - sb.AppendFormat("Sensors : {0}\n", sr != null ? sr.SensorsCount : 0); - - Dataserver ds = AsyncCommandManager.GetDataserverPlugin(this); - sb.AppendFormat("Dataserver requests : {0}\n", ds != null ? ds.DataserverRequestsCount : 0); - - ScriptTimer t = AsyncCommandManager.GetTimerPlugin(this); - sb.AppendFormat("Timers : {0}\n", t != null ? t.TimersCount : 0); - - Listener l = AsyncCommandManager.GetListenerPlugin(this); - sb.AppendFormat("Listeners : {0}\n", l != null ? l.ListenerCount : 0); - - return sb.ToString(); - } - - public void HandleShowScripts(string module, string[] cmdparams) - { - if (!(MainConsole.Instance.ConsoleScene == null || MainConsole.Instance.ConsoleScene == m_Scene)) - return; - - if (cmdparams.Length == 2) - { - lock (m_Scripts) - { - MainConsole.Instance.Output( - "Showing {0} scripts in {1}", m_Scripts.Count, m_Scene.RegionInfo.RegionName); - } - } - - HandleScriptsAction(cmdparams, HandleShowScript, si => si.EventsProcessed); - } - - private void HandleShowScript(IScriptInstance instance) - { - SceneObjectPart sop = m_Scene.GetSceneObjectPart(instance.ObjectID); - string status; - - if (instance.ShuttingDown) - { - status = "shutting down"; - } - else if (instance.Suspended) - { - status = "suspended"; - } - else if (!instance.Running) - { - status = "stopped"; - } - else - { - status = "running"; - } - - StringBuilder sb = new StringBuilder(); - - sb.AppendFormat("Script name : {0}\n", instance.ScriptName); - sb.AppendFormat("Status : {0}\n", status); - sb.AppendFormat("Queued events : {0}\n", instance.EventsQueued); - sb.AppendFormat("Processed events : {0}\n", instance.EventsProcessed); - sb.AppendFormat("Item UUID : {0}\n", instance.ItemID); - sb.AppendFormat("Asset UUID : {0}\n", instance.AssetID); - sb.AppendFormat("Containing part name: {0}\n", instance.PrimName); - sb.AppendFormat("Containing part UUID: {0}\n", instance.ObjectID); - sb.AppendFormat("Position : {0}\n", sop.AbsolutePosition); - - MainConsole.Instance.Output(sb.ToString()); - } - - private void HandleSuspendScript(IScriptInstance instance) - { - if (!instance.Suspended) - { - instance.Suspend(); - - SceneObjectPart sop = m_Scene.GetSceneObjectPart(instance.ObjectID); - MainConsole.Instance.Output( - "Suspended {0}.{1}, item UUID {2}, prim UUID {3} @ {4}", - instance.PrimName, instance.ScriptName, instance.ItemID, instance.ObjectID, sop.AbsolutePosition); - } - } - - private void HandleResumeScript(IScriptInstance instance) - { - if (instance.Suspended) - { - instance.Resume(); - - SceneObjectPart sop = m_Scene.GetSceneObjectPart(instance.ObjectID); - MainConsole.Instance.Output( - "Resumed {0}.{1}, item UUID {2}, prim UUID {3} @ {4}", - instance.PrimName, instance.ScriptName, instance.ItemID, instance.ObjectID, sop.AbsolutePosition); - } - } - - private void HandleStartScript(IScriptInstance instance) - { - if (!instance.Running) - { - instance.Start(); - - SceneObjectPart sop = m_Scene.GetSceneObjectPart(instance.ObjectID); - MainConsole.Instance.Output( - "Started {0}.{1}, item UUID {2}, prim UUID {3} @ {4}", - instance.PrimName, instance.ScriptName, instance.ItemID, instance.ObjectID, sop.AbsolutePosition); - } - } - - private void HandleStopScript(IScriptInstance instance) - { - if (instance.Running) - { - instance.StayStopped = true; // the script was stopped explicitly - - instance.Stop(0); - - SceneObjectPart sop = m_Scene.GetSceneObjectPart(instance.ObjectID); - MainConsole.Instance.Output( - "Stopped {0}.{1}, item UUID {2}, prim UUID {3} @ {4}", - instance.PrimName, instance.ScriptName, instance.ItemID, instance.ObjectID, sop.AbsolutePosition); - } - } - - public void RemoveRegion(Scene scene) - { - if (!m_Enabled) - return; - - lock (m_Scripts) - { - m_log.InfoFormat( - "[XEngine]: Shutting down {0} scripts in {1}", m_Scripts.Count, m_Scene.RegionInfo.RegionName); - - foreach (IScriptInstance instance in m_Scripts.Values) - { - // Force a final state save - // - try - { - if (instance.StatePersistedHere) - instance.SaveState(); - } - catch (Exception e) - { - m_log.Error( - string.Format( - "[XEngine]: Failed final state save for script {0}.{1}, item UUID {2}, prim UUID {3} in {4}. Exception ", - instance.PrimName, instance.ScriptName, instance.ItemID, instance.ObjectID, World.Name) - , e); - } - - // Clear the event queue and abort the instance thread - // - instance.Stop(0, true); - - // Release events, timer, etc - // - instance.DestroyScriptInstance(); - - // Unload scripts and app domains. - // Must be done explicitly because they have infinite - // lifetime. - // However, don't bother to do this if the simulator is shutting - // down since it takes a long time with many scripts. - if (!m_SimulatorShuttingDown) - { - m_DomainScripts[instance.AppDomain].Remove(instance.ItemID); - if (m_DomainScripts[instance.AppDomain].Count == 0) - { - m_DomainScripts.Remove(instance.AppDomain); - UnloadAppDomain(instance.AppDomain); - } - } - } - - m_Scripts.Clear(); - m_PrimObjects.Clear(); - m_Assemblies.Clear(); - m_DomainScripts.Clear(); - } - lock (m_ScriptEngines) - { - m_ScriptEngines.Remove(this); - } - } - - public void RegionLoaded(Scene scene) - { - if (!m_Enabled) - return; - - m_EventManager = new EventManager(this); - - m_Compiler = new Compiler(this); - - m_Scene.EventManager.OnRemoveScript += OnRemoveScript; - m_Scene.EventManager.OnScriptReset += OnScriptReset; - m_Scene.EventManager.OnStartScript += OnStartScript; - m_Scene.EventManager.OnStopScript += OnStopScript; - m_Scene.EventManager.OnGetScriptRunning += OnGetScriptRunning; - m_Scene.EventManager.OnShutdown += OnShutdown; - - // If region ready has been triggered, then the region had no scripts to compile and completed its other - // work. - m_Scene.EventManager.OnRegionReadyStatusChange += s => { if (s.Ready) m_InitialStartup = false; }; - - if (m_SleepTime > 0) - { - m_ThreadPool.QueueWorkItem(DoMaintenance, new object[]{ m_SleepTime }); - } - - if (m_SaveTime > 0) - { - m_ThreadPool.QueueWorkItem(DoBackup, new object[] { m_SaveTime }); - } - } - - public void StartProcessing() - { - m_ThreadPool.Start(); - } - - public void Close() - { - if (!m_Enabled) - return; - - lock (m_ScriptEngines) - { - if (m_ScriptEngines.Contains(this)) - m_ScriptEngines.Remove(this); - } - - lock(m_Scripts) - m_ThreadPool.Shutdown(); - } - - public object DoBackup(object o) - { - Object[] p = (Object[])o; - int saveTime = (int)p[0]; - - if (saveTime > 0) - System.Threading.Thread.Sleep(saveTime); - -// m_log.Debug("[XEngine] Backing up script states"); - - List instances = new List(); - - lock (m_Scripts) - { - foreach (IScriptInstance instance in m_Scripts.Values) - { - if (instance.StatePersistedHere) - { -// m_log.DebugFormat( -// "[XEngine]: Adding script {0}.{1}, item UUID {2}, prim UUID {3} in {4} for state persistence", -// instance.PrimName, instance.ScriptName, instance.ItemID, instance.ObjectID, World.Name); - - instances.Add(instance); - } - } - } - - foreach (IScriptInstance i in instances) - { - try - { - i.SaveState(); - } - catch (Exception e) - { - m_log.Error( - string.Format( - "[XEngine]: Failed to save state of script {0}.{1}, item UUID {2}, prim UUID {3} in {4}. Exception ", - i.PrimName, i.ScriptName, i.ItemID, i.ObjectID, World.Name) - , e); - } - } - - if (saveTime > 0) - m_ThreadPool.QueueWorkItem(DoBackup, new object[] { saveTime }); - - return 0; - } - - public void SaveAllState() - { - DoBackup(new object[] { 0 }); - } - - public object DoMaintenance(object p) - { - object[] parms = (object[])p; - int sleepTime = (int)parms[0]; - - foreach (IScriptInstance inst in m_Scripts.Values) - { - if (inst.EventTime() > m_EventLimit) - { - inst.Stop(100); - if (!m_KillTimedOutScripts) - inst.Start(); - } - } - - System.Threading.Thread.Sleep(sleepTime); - - m_ThreadPool.QueueWorkItem(DoMaintenance, new object[]{ sleepTime }); - - return 0; - } - - public Type ReplaceableInterface - { - get { return null; } - } - - public string Name - { - get { return "XEngine"; } - } - - public void OnRezScript(uint localID, UUID itemID, string script, int startParam, bool postOnRez, string engine, int stateSource) - { -// m_log.DebugFormat( -// "[XEngine]: OnRezScript event triggered for script {0}, startParam {1}, postOnRez {2}, engine {3}, stateSource {4}, script\n{5}", -// itemID, startParam, postOnRez, engine, stateSource, script); - - if (script.StartsWith("//MRM:")) - return; - - List engines = new List(m_Scene.RequestModuleInterfaces()); - - List names = new List(); - foreach (IScriptModule m in engines) - names.Add(m.ScriptEngineName); - - int lineEnd = script.IndexOf('\n'); - - if (lineEnd > 1) - { - string firstline = script.Substring(0, lineEnd).Trim(); - - int colon = firstline.IndexOf(':'); - if (firstline.Length > 2 && firstline.Substring(0, 2) == "//" && colon != -1) - { - string engineName = firstline.Substring(2, colon - 2); - - if (names.Contains(engineName)) - { - engine = engineName; - script = "//" + script.Substring(colon + 1); - } - else - { - if (engine == ScriptEngineName) - { - // If we are falling back on XEngine as the default engine, then only complain to the user - // if a script language has been explicitly set and it's one that we recognize or there are - // no non-whitespace characters after the colon. - // - // If the script is - // explicitly not allowed or the script is not in LSL then the user will be informed by a later compiler message. - // - // If the colon ends the line then we'll risk the false positive as this is more likely - // to signal a real scriptengine line where the user wants to use the default compile language. - // - // This avoids the overwhelming number of false positives where we're in this code because - // there's a colon in a comment in the first line of a script for entirely - // unrelated reasons (e.g. vim settings). - // - // TODO: A better fix would be to deprecate simple : detection and look for some less likely - // string to begin the comment (like #! in unix shell scripts). - bool warnRunningInXEngine = false; - string restOfFirstLine = firstline.Substring(colon + 1); - - // FIXME: These are hardcoded because they are currently hardcoded in Compiler.cs - if (restOfFirstLine.StartsWith("c#") - || restOfFirstLine.StartsWith("vb") - || restOfFirstLine.StartsWith("lsl") - || restOfFirstLine.Length == 0) - warnRunningInXEngine = true; - - if (warnRunningInXEngine) - { - SceneObjectPart part = - m_Scene.GetSceneObjectPart( - localID); - - TaskInventoryItem item = - part.Inventory.GetInventoryItem(itemID); - - ScenePresence presence = - m_Scene.GetScenePresence( - item.OwnerID); - - if (presence != null) - { - presence.ControllingClient.SendAgentAlertMessage( - "Selected engine unavailable. "+ - "Running script on "+ - ScriptEngineName, - false); - } - } - } - } - } - } - - if (engine != ScriptEngineName) - return; - - Object[] parms = new Object[]{localID, itemID, script, startParam, postOnRez, (StateSource)stateSource}; - - if (stateSource == (int)StateSource.ScriptedRez) - { - lock (m_CompileDict) - { -// m_log.DebugFormat("[XENGINE]: Set compile dict for {0}", itemID); - m_CompileDict[itemID] = new ScriptCompileInfo(); - } - - DoOnRezScript(parms); - } - else - { - lock (m_CompileDict) - m_CompileDict[itemID] = new ScriptCompileInfo(); -// m_log.DebugFormat("[XENGINE]: Set compile dict for {0} delayed", itemID); - - // This must occur after the m_CompileDict so that an existing compile thread cannot hit the check - // in DoOnRezScript() before m_CompileDict has been updated. - m_CompileQueue.Enqueue(parms); - -// m_log.DebugFormat("[XEngine]: Added script {0} to compile queue", itemID); - - // NOTE: Although we use a lockless queue, the lock here - // is required. It ensures that there are never two - // compile threads running, which, due to a race - // conndition, might otherwise happen - // - lock (m_CompileQueue) - { - if (m_CurrentCompile == null) - m_CurrentCompile = m_ThreadPool.QueueWorkItem(DoOnRezScriptQueue, null); - } - } - } - - public Object DoOnRezScriptQueue(Object dummy) - { - try - { - if (m_InitialStartup) - { - // This delay exists to stop mono problems where script compilation and startup would stop the sim - // working properly for the session. - System.Threading.Thread.Sleep(m_StartDelay); - - m_log.InfoFormat("[XEngine]: Performing initial script startup on {0}", m_Scene.Name); - } - - object[] o; - - int scriptsStarted = 0; - - while (m_CompileQueue.Dequeue(out o)) - { - try - { - if (DoOnRezScript(o)) - { - scriptsStarted++; - - if (m_InitialStartup) - if (scriptsStarted % 50 == 0) - m_log.InfoFormat( - "[XEngine]: Started {0} scripts in {1}", scriptsStarted, m_Scene.Name); - } - } - catch (System.Threading.ThreadAbortException) { } - catch (Exception e) - { - m_log.Error( - string.Format( - "[XEngine]: Failure in DoOnRezScriptQueue() for item {0} in {1}. Continuing. Exception ", - o[1], m_Scene.Name), - e); - } - } - - if (m_InitialStartup) - m_log.InfoFormat( - "[XEngine]: Completed starting {0} scripts on {1}", scriptsStarted, m_Scene.Name); - - } - catch (Exception e) - { - m_log.Error( - string.Format("[XEngine]: Failure in DoOnRezScriptQueue() in {0}. Exception ", m_Scene.Name), e); - } - finally - { - // FIXME: On failure we must trigger this even if the compile queue is not actually empty so that the - // RegionReadyModule is not forever waiting. This event really needs a different name. - m_Scene.EventManager.TriggerEmptyScriptCompileQueue(m_ScriptFailCount, - m_ScriptErrorMessage); - - m_ScriptFailCount = 0; - m_InitialStartup = false; - - // NOTE: Despite having a lockless queue, this lock is required - // to make sure there is never no compile thread while there - // are still scripts to compile. This could otherwise happen - // due to a race condition - // - lock (m_CompileQueue) - { - m_CurrentCompile = null; - - // This is to avoid a situation where the m_CompileQueue while loop above could complete but - // OnRezScript() place a new script on the queue and check m_CurrentCompile = null before we hit - // this section. - if (m_CompileQueue.Count > 0) - m_CurrentCompile = m_ThreadPool.QueueWorkItem(DoOnRezScriptQueue, null); - } - } - - return null; - } - - private bool DoOnRezScript(object[] parms) - { - Object[] p = parms; - uint localID = (uint)p[0]; - UUID itemID = (UUID)p[1]; - string script =(string)p[2]; - int startParam = (int)p[3]; - bool postOnRez = (bool)p[4]; - StateSource stateSource = (StateSource)p[5]; - - //m_log.DebugFormat("[XEngine]: DoOnRezScript called for script {0}", itemID); - - lock (m_CompileDict) - { - if (!m_CompileDict.ContainsKey(itemID)) - return false; - } - - // Get the asset ID of the script, so we can check if we - // already have it. - - // We must look for the part outside the m_Scripts lock because GetSceneObjectPart later triggers the - // m_parts lock on SOG. At the same time, a scene object that is being deleted will take the m_parts lock - // and then later on try to take the m_scripts lock in this class when it calls OnRemoveScript() - SceneObjectPart part = m_Scene.GetSceneObjectPart(localID); - if (part == null) - { - m_log.ErrorFormat("[Script]: SceneObjectPart with localID {0} unavailable. Script NOT started.", localID); - m_ScriptErrorMessage += "SceneObjectPart unavailable. Script NOT started.\n"; - m_ScriptFailCount++; - lock (m_CompileDict) - m_CompileDict.Remove(itemID); - return false; - } - - TaskInventoryItem item = part.Inventory.GetInventoryItem(itemID); - if (item == null) - { - m_ScriptErrorMessage += "Can't find script inventory item.\n"; - m_ScriptFailCount++; - lock (m_CompileDict) - m_CompileDict.Remove(itemID); - return false; - } - - if (DebugLevel > 0) - m_log.DebugFormat( - "[XEngine]: Loading script {0}.{1}, item UUID {2}, prim UUID {3} @ {4}.{5}", - part.ParentGroup.RootPart.Name, item.Name, itemID, part.UUID, - part.ParentGroup.RootPart.AbsolutePosition, part.ParentGroup.Scene.RegionInfo.RegionName); - - UUID assetID = item.AssetID; - - ScenePresence presence = m_Scene.GetScenePresence(item.OwnerID); - - string assemblyPath = ""; - - Culture.SetCurrentCulture(); - - Dictionary, KeyValuePair> linemap; - - lock (m_ScriptErrors) - { - try - { - lock (m_AddingAssemblies) - { - m_Compiler.PerformScriptCompile(script, assetID.ToString(), item.OwnerID, out assemblyPath, out linemap); - -// m_log.DebugFormat( -// "[XENGINE]: Found assembly path {0} onrez {1} in {2}", -// assemblyPath, item.ItemID, World.Name); - - if (!m_AddingAssemblies.ContainsKey(assemblyPath)) { - m_AddingAssemblies[assemblyPath] = 1; - } else { - m_AddingAssemblies[assemblyPath]++; - } - } - - string[] warnings = m_Compiler.GetWarnings(); - - if (warnings != null && warnings.Length != 0) - { - foreach (string warning in warnings) - { - if (!m_ScriptErrors.ContainsKey(itemID)) - m_ScriptErrors[itemID] = new ArrayList(); - - m_ScriptErrors[itemID].Add(warning); - //try - //{ - // DISPLAY WARNING INWORLD - // string text = "Warning:\n" + warning; - // if (text.Length > 1000) - // text = text.Substring(0, 1000); - // if (!ShowScriptSaveResponse(item.OwnerID,assetID, text, true)) - // { - // if (presence != null && (!postOnRez)) - // presence.ControllingClient.SendAgentAlertMessage("Script saved with warnings, check debug window!", false); - // - // World.SimChat(Utils.StringToBytes(text), - // ChatTypeEnum.DebugChannel, 2147483647, - // part.AbsolutePosition, - // part.Name, part.UUID, false); - // } - //} - //catch (Exception e2) // LEGIT: User Scripting - //{ - // m_log.Error("[XEngine]: " + "Error displaying warning in-world: " + e2.ToString()); - // m_log.Error("[XEngine]: " + "Warning:\r\n" + warning); - //} - } - } - } - catch (Exception e) - { - //m_log.ErrorFormat( - // "[XEngine]: Exception when rezzing script with item ID {0}, {1}{2}", - // itemID, e.Message, e.StackTrace); - - //try - //{ - if (!m_ScriptErrors.ContainsKey(itemID)) - m_ScriptErrors[itemID] = new ArrayList(); - // DISPLAY ERROR INWORLD - //m_ScriptErrorMessage += "Failed to compile script in object: '" + part.ParentGroup.RootPart.Name + "' Script name: '" + item.Name + "' Error message: " + e.Message.ToString(); - - m_ScriptFailCount++; - m_ScriptErrors[itemID].Add(e.Message.ToString()); - //string text = "Error compiling script '" + item.Name + "':\n" + e.Message.ToString(); - //if (text.Length > 1000) - // text = text.Substring(0, 1000); - //if (!ShowScriptSaveResponse(item.OwnerID,assetID, text, false)) - //{ - // if (presence != null && (!postOnRez)) - // presence.ControllingClient.SendAgentAlertMessage("Script saved with errors, check debug window!", false); - // World.SimChat(Utils.StringToBytes(text), - // ChatTypeEnum.DebugChannel, 2147483647, - // part.AbsolutePosition, - // part.Name, part.UUID, false); - // } - //} - //catch (Exception e2) // LEGIT: User Scripting - //{ - // m_log.Error("[XEngine]: "+ "Error displaying error in-world: " + e2.ToString()); - // m_log.Error("[XEngine]: " + "Errormessage: Error compiling script:\r\n" + e.Message.ToString()); - //} - - lock (m_CompileDict) - m_CompileDict.Remove(itemID); - return false; - } - } - - ScriptInstance instance = null; - lock (m_Scripts) - { - // Create the object record - if ((!m_Scripts.ContainsKey(itemID)) || (m_Scripts[itemID].AssetID != assetID)) - { - bool attachDomains = m_AttachmentsDomainLoading && part.ParentGroup.IsAttachmentCheckFull(); - UUID appDomain = part.ParentGroup.RootPart.UUID; - - if (!m_AppDomains.ContainsKey(appDomain)) - { - try - { - AppDomain sandbox; - if (m_AppDomainLoading || attachDomains) - { - AppDomainSetup appSetup = new AppDomainSetup(); - appSetup.PrivateBinPath = Path.Combine( - m_ScriptEnginesPath, - m_Scene.RegionInfo.RegionID.ToString()); - - Evidence baseEvidence = AppDomain.CurrentDomain.Evidence; - Evidence evidence = new Evidence(baseEvidence); - - sandbox = AppDomain.CreateDomain( - m_Scene.RegionInfo.RegionID.ToString(), - evidence, appSetup); - sandbox.AssemblyResolve += - new ResolveEventHandler( - AssemblyResolver.OnAssemblyResolve); - } - else - { - sandbox = AppDomain.CurrentDomain; - } - - //PolicyLevel sandboxPolicy = PolicyLevel.CreateAppDomainLevel(); - //AllMembershipCondition sandboxMembershipCondition = new AllMembershipCondition(); - //PermissionSet sandboxPermissionSet = sandboxPolicy.GetNamedPermissionSet("Internet"); - //PolicyStatement sandboxPolicyStatement = new PolicyStatement(sandboxPermissionSet); - //CodeGroup sandboxCodeGroup = new UnionCodeGroup(sandboxMembershipCondition, sandboxPolicyStatement); - //sandboxPolicy.RootCodeGroup = sandboxCodeGroup; - //sandbox.SetAppDomainPolicy(sandboxPolicy); - - m_AppDomains[appDomain] = sandbox; - m_DomainScripts[appDomain] = new List(); - } - catch (Exception e) - { - m_log.ErrorFormat("[XEngine] Exception creating app domain:\n {0}", e.ToString()); - m_ScriptErrorMessage += "Exception creating app domain:\n"; - m_ScriptFailCount++; - lock (m_AddingAssemblies) - { - m_AddingAssemblies[assemblyPath]--; - } - lock (m_CompileDict) - m_CompileDict.Remove(itemID); - return false; - } - } - - m_DomainScripts[appDomain].Add(itemID); - - IScript scriptObj = null; - EventWaitHandle coopSleepHandle; - bool coopTerminationForThisScript; - - // Set up assembly name to point to the appropriate scriptEngines directory - AssemblyName assemblyName = new AssemblyName(Path.GetFileNameWithoutExtension(assemblyPath)); - assemblyName.CodeBase = Path.GetDirectoryName(assemblyPath); - - if (m_coopTermination) - { - try - { - coopSleepHandle = new XEngineEventWaitHandle(false, EventResetMode.AutoReset); - - scriptObj - = (IScript)m_AppDomains[appDomain].CreateInstanceAndUnwrap( - assemblyName.FullName, - "SecondLife.XEngineScript", - false, - BindingFlags.Default, - null, - new object[] { coopSleepHandle }, - null, - null); - - coopTerminationForThisScript = true; - } - catch (TypeLoadException) - { - coopSleepHandle = null; - - try - { - scriptObj - = (IScript)m_AppDomains[appDomain].CreateInstanceAndUnwrap( - assemblyName.FullName, - "SecondLife.Script", - false, - BindingFlags.Default, - null, - null, - null, - null); - } - catch (Exception e2) - { - m_log.Error( - string.Format( - "[XENGINE]: Could not load previous SecondLife.Script from assembly {0} in {1}. Not starting. Exception ", - assemblyName.FullName, World.Name), - e2); - - lock (m_CompileDict) - m_CompileDict.Remove(itemID); - return false; - } - - coopTerminationForThisScript = false; - } - } - else - { - try - { - scriptObj - = (IScript)m_AppDomains[appDomain].CreateInstanceAndUnwrap( - assemblyName.FullName, - "SecondLife.Script", - false, - BindingFlags.Default, - null, - null, - null, - null); - - coopSleepHandle = null; - coopTerminationForThisScript = false; - } - catch (TypeLoadException) - { - coopSleepHandle = new XEngineEventWaitHandle(false, EventResetMode.AutoReset); - - try - { - scriptObj - = (IScript)m_AppDomains[appDomain].CreateInstanceAndUnwrap( - assemblyName.FullName, - "SecondLife.XEngineScript", - false, - BindingFlags.Default, - null, - new object[] { coopSleepHandle }, - null, - null); - } - catch (Exception e2) - { - m_log.Error( - string.Format( - "[XENGINE]: Could not load previous SecondLife.XEngineScript from assembly {0} in {1}. Not starting. Exception ", - assemblyName.FullName, World.Name), - e2); - - lock (m_CompileDict) - m_CompileDict.Remove(itemID); - return false; - } - - coopTerminationForThisScript = true; - } - } - - if (m_coopTermination != coopTerminationForThisScript && !HaveNotifiedLogOfScriptStopMismatch) - { - // Notify the log that there is at least one script compile that doesn't match the - // ScriptStopStrategy. Operator has to manually delete old DLLs - we can't do this on Windows - // once the assembly has been loaded evne if the instantiation of a class was unsuccessful. - m_log.WarnFormat( - "[XEngine]: At least one existing compiled script DLL in {0} has {1} as ScriptStopStrategy whereas config setting is {2}." - + "\nContinuing with script compiled strategy but to remove this message please set [XEngine] DeleteScriptsOnStartup = true for one simulator session to remove old script DLLs (script state will not be lost).", - World.Name, coopTerminationForThisScript ? "co-op" : "abort", m_coopTermination ? "co-op" : "abort"); - - HaveNotifiedLogOfScriptStopMismatch = true; - } - - instance = new ScriptInstance(this, part, - item, - startParam, postOnRez, - m_MaxScriptQueue); - - if(!instance.Load(scriptObj, coopSleepHandle, assemblyPath, - Path.Combine(ScriptEnginePath, World.RegionInfo.RegionID.ToString()), stateSource, coopTerminationForThisScript)) - { - lock (m_CompileDict) - m_CompileDict.Remove(itemID); - return false; - } - -// if (DebugLevel >= 1) -// m_log.DebugFormat( -// "[XEngine] Loaded script {0}.{1}, item UUID {2}, prim UUID {3} @ {4}.{5}", -// part.ParentGroup.RootPart.Name, item.Name, itemID, part.UUID, -// part.ParentGroup.RootPart.AbsolutePosition, part.ParentGroup.Scene.RegionInfo.RegionName); - - if (presence != null) - { - ShowScriptSaveResponse(item.OwnerID, - assetID, "Compile successful", true); - } - - instance.AppDomain = appDomain; - instance.LineMap = linemap; - - m_Scripts[itemID] = instance; - } - } - - lock (m_PrimObjects) - { - if (!m_PrimObjects.ContainsKey(localID)) - m_PrimObjects[localID] = new List(); - - if (!m_PrimObjects[localID].Contains(itemID)) - m_PrimObjects[localID].Add(itemID); - } - - - lock (m_AddingAssemblies) - { - if (!m_Assemblies.ContainsKey(assetID)) - m_Assemblies[assetID] = assemblyPath; - - m_AddingAssemblies[assemblyPath]--; - } - - if (instance != null) - { - instance.Init(); - lock (m_CompileDict) - { - foreach (EventParams pp in m_CompileDict[itemID].eventList) - instance.PostEvent(pp); - } - } - lock (m_CompileDict) - m_CompileDict.Remove(itemID); - - bool runIt = instance.ScriptTask.ScriptRunning; - if (m_runFlags.TryGetValue(itemID, out bool flagrunIt)) - { - runIt &= flagrunIt; - m_runFlags.Remove(itemID); - } - - if (!runIt) - StopScript(itemID); - - return true; - } - - public void OnRemoveScript(uint localID, UUID itemID) - { - // If it's not yet been compiled, make sure we don't try - lock (m_CompileDict) - { - if (m_CompileDict.ContainsKey(itemID)) - m_CompileDict.Remove(itemID); - } - - IScriptInstance instance = null; - lock (m_Scripts) - { - // Do we even have it? - if (!m_Scripts.TryGetValue(itemID, out instance)) - return; - m_Scripts.Remove(itemID); - } - - instance.Stop(m_WaitForEventCompletionOnScriptStop, true); - - lock (m_PrimObjects) - { - // Remove the script from it's prim - if (m_PrimObjects.ContainsKey(localID)) - { - // Remove inventory item record - if (m_PrimObjects[localID].Contains(itemID)) - m_PrimObjects[localID].Remove(itemID); - - // If there are no more scripts, remove prim - if (m_PrimObjects[localID].Count == 0) - m_PrimObjects.Remove(localID); - } - } - - if (instance.StatePersistedHere) - instance.RemoveState(); - - instance.DestroyScriptInstance(); - - m_DomainScripts[instance.AppDomain].Remove(instance.ItemID); - if (m_DomainScripts[instance.AppDomain].Count == 0) - { - m_DomainScripts.Remove(instance.AppDomain); - UnloadAppDomain(instance.AppDomain); - } - - OnObjectRemoved?.Invoke(instance.ObjectID); - OnScriptRemoved?.Invoke(itemID); - } - - public void OnScriptReset(uint localID, UUID itemID) - { - ResetScript(itemID); - } - - public void OnStartScript(uint localID, UUID itemID) - { - StartScript(itemID); - } - - public void OnStopScript(uint localID, UUID itemID) - { - StopScript(itemID); - } - - private void CleanAssemblies() - { - List assetIDList = new List(m_Assemblies.Keys); - - foreach (IScriptInstance i in m_Scripts.Values) - { - if (assetIDList.Contains(i.AssetID)) - assetIDList.Remove(i.AssetID); - } - - lock (m_AddingAssemblies) - { - foreach (UUID assetID in assetIDList) - { - // Do not remove assembly files if another instance of the script - // is currently initialising - if (!m_AddingAssemblies.ContainsKey(m_Assemblies[assetID]) - || m_AddingAssemblies[m_Assemblies[assetID]] == 0) - { -// m_log.DebugFormat("[XEngine] Removing unreferenced assembly {0}", m_Assemblies[assetID]); - try - { - if (File.Exists(m_Assemblies[assetID])) - File.Delete(m_Assemblies[assetID]); - - if (File.Exists(m_Assemblies[assetID]+".text")) - File.Delete(m_Assemblies[assetID]+".text"); - - if (File.Exists(m_Assemblies[assetID]+".mdb")) - File.Delete(m_Assemblies[assetID]+".mdb"); - - if (File.Exists(m_Assemblies[assetID]+".map")) - File.Delete(m_Assemblies[assetID]+".map"); - } - catch (Exception) - { - } - m_Assemblies.Remove(assetID); - } - } - } - } - - private void UnloadAppDomain(UUID id) - { - if (m_AppDomains.ContainsKey(id)) - { - AppDomain domain = m_AppDomains[id]; - m_AppDomains.Remove(id); - - if (domain != AppDomain.CurrentDomain) - AppDomain.Unload(domain); - domain = null; - // m_log.DebugFormat("[XEngine] Unloaded app domain {0}", id.ToString()); - } - } - - // - // Start processing - // - private void SetupEngine(int minThreads, int maxThreads, - int idleTimeout, ThreadPriority threadPriority, - int maxScriptQueue, int stackSize) - { - m_MaxScriptQueue = maxScriptQueue; - - STPStartInfo startInfo = new STPStartInfo() - { - ThreadPoolName = "XEngine", - IdleTimeout = idleTimeout * 1000, // convert to seconds as stated in .ini - MaxWorkerThreads = maxThreads, - MinWorkerThreads = minThreads, - ThreadPriority = threadPriority, - MaxStackSize = stackSize, - SuppressFlow = true, - StartSuspended = true - }; - m_ThreadPool = new SmartThreadPool(startInfo); - } - - // - // Used by script instances to queue event handler jobs - // - public IScriptWorkItem QueueEventHandler(object parms) - { - return new XWorkItem(m_ThreadPool.QueueWorkItem((WaitCallback)ProcessEventHandler,parms)); - } - - /// - /// Process a previously posted script event. - /// - /// - /// - private void ProcessEventHandler(object parms) - { - Culture.SetCurrentCulture(); - - IScriptInstance instance = (ScriptInstance) parms; - -// m_log.DebugFormat("[XEngine]: Processing event for {0}", instance); - - instance.EventProcessor(); - } - - /// - /// Post event to an entire prim - /// - /// - /// - /// - public bool PostObjectEvent(uint localID, EventParams p) - { - bool result = false; - List uuids = null; - - lock (m_PrimObjects) - { - if (!m_PrimObjects.TryGetValue(localID, out uuids)) - return false; - - foreach (UUID itemID in uuids) - { - IScriptInstance instance = null; - try - { - m_Scripts.TryGetValue(itemID, out instance); - } - catch { /* ignore race conditions */ } - - if (instance != null) - { - instance.PostEvent(p); - result = true; - } - else - { - lock (m_CompileDict) - { - if (m_CompileDict.ContainsKey(itemID)) - { - m_CompileDict[itemID].eventList.Add(p); - result = true; - } - } - } - } - } - - return result; - } - - public void CancelScriptEvent(UUID itemID, string eventName) - { - } - - /// - /// Post an event to a single script - /// - /// - /// - /// - public bool PostScriptEvent(UUID itemID, EventParams p) - { - if (m_Scripts.TryGetValue(itemID, out IScriptInstance instance)) - { - instance?.PostEvent(p); - return true; - } - lock (m_CompileDict) - { - if (m_CompileDict.ContainsKey(itemID)) - { - m_CompileDict[itemID].eventList.Add(p); - return true; - } - } - return false; - } - - public bool PostScriptEvent(UUID itemID, string name, Object[] p) - { - Object[] lsl_p = new Object[p.Length]; - for (int i = 0; i < p.Length ; i++) - { - if (p[i] is int) - lsl_p[i] = new LSL_Types.LSLInteger((int)p[i]); - else if (p[i] is string) - lsl_p[i] = new LSL_Types.LSLString((string)p[i]); - else if (p[i] is Vector3) - lsl_p[i] = new LSL_Types.Vector3((Vector3)p[i]); - else if (p[i] is Quaternion) - lsl_p[i] = new LSL_Types.Quaternion((Quaternion)p[i]); - else if (p[i] is float) - lsl_p[i] = new LSL_Types.LSLFloat((float)p[i]); - else - lsl_p[i] = p[i]; - } - - return PostScriptEvent(itemID, new EventParams(name, lsl_p, new DetectParams[0])); - } - - public bool PostObjectEvent(UUID itemID, string name, Object[] p) - { - SceneObjectPart part = m_Scene.GetSceneObjectPart(itemID); - if (part == null) - return false; - - Object[] lsl_p = new Object[p.Length]; - for (int i = 0; i < p.Length ; i++) - { - if (p[i] is int) - lsl_p[i] = new LSL_Types.LSLInteger((int)p[i]); - else if (p[i] is string) - lsl_p[i] = new LSL_Types.LSLString((string)p[i]); - else if (p[i] is Vector3) - lsl_p[i] = new LSL_Types.Vector3((Vector3)p[i]); - else if (p[i] is Quaternion) - lsl_p[i] = new LSL_Types.Quaternion((Quaternion)p[i]); - else if (p[i] is float) - lsl_p[i] = new LSL_Types.LSLFloat((float)p[i]); - else - lsl_p[i] = p[i]; - } - - return PostObjectEvent(part.LocalId, new EventParams(name, lsl_p, new DetectParams[0])); - } - - public Assembly OnAssemblyResolve(object sender, - ResolveEventArgs args) - { - if (!(sender is System.AppDomain)) - return null; - - string[] pathList = new string[] {"bin", m_ScriptEnginesPath, - Path.Combine(m_ScriptEnginesPath, - m_Scene.RegionInfo.RegionID.ToString())}; - - string assemblyName = args.Name; - if (assemblyName.IndexOf(",") != -1) - assemblyName = args.Name.Substring(0, args.Name.IndexOf(",")); - - foreach (string s in pathList) - { - string path = Path.Combine(Directory.GetCurrentDirectory(), - Path.Combine(s, assemblyName))+".dll"; - - //Console.WriteLine("[XEngine]: Trying to resolve {0}", path); - - if (File.Exists(path)) - return Assembly.LoadFrom(path); - } - - return null; - } - - private IScriptInstance GetInstance(UUID itemID) - { - lock (m_Scripts) - { - if (m_Scripts.TryGetValue(itemID, out IScriptInstance instance)) - return instance; - } - return null; - } - - public void SetScriptState(UUID itemID, bool running, bool self) - { - IScriptInstance instance = GetInstance(itemID); - if (instance != null) - { - if (instance.ScriptTask != null) - instance.ScriptTask.ScriptRunning = running; - - if (running) - { - instance.Start(); - } - else - { - if(self) - { - instance.Running = false; - throw new EventAbortException(); - } - else - instance.Stop(100); - } - } - } - - public bool GetScriptState(UUID itemID) - { - IScriptInstance instance = GetInstance(itemID); - return instance != null && instance.Running; - } - - public void ApiResetScript(UUID itemID) - { - IScriptInstance instance = GetInstance(itemID); - if (instance != null) - instance.ApiResetScript(); - - // Send the new number of threads that are in use by the thread - // pool, I believe that by adding them to the locations where the - // script is changing states that I will catch all changes to the - // thread pool - m_Scene.setThreadCount(m_ThreadPool.InUseThreads); - } - - public void ResetScript(UUID itemID) - { - IScriptInstance instance = GetInstance(itemID); - if (instance != null) - instance.ResetScript(m_WaitForEventCompletionOnScriptStop); - - // Send the new number of threads that are in use by the thread - // pool, I believe that by adding them to the locations where the - // script is changing states that I will catch all changes to the - // thread pool - m_Scene.setThreadCount(m_ThreadPool.InUseThreads); - } - - public void StartScript(UUID itemID) - { - IScriptInstance instance = GetInstance(itemID); - if (instance != null) - { - instance.Start(); - if (instance.ScriptTask != null) - instance.ScriptTask.ScriptRunning = true; - } - else - m_runFlags.AddOrUpdate(itemID, true, 240); - - // Send the new number of threads that are in use by the thread - // pool, I believe that by adding them to the locations where the - // script is changing states that I will catch all changes to the - // thread pool - m_Scene.setThreadCount(m_ThreadPool.InUseThreads); - } - - public void StopScript(UUID itemID) - { - IScriptInstance instance = GetInstance(itemID); - - if (instance != null) - { - lock (instance.EventQueue) - instance.StayStopped = true; // the script was stopped explicitly - - instance.Stop(m_WaitForEventCompletionOnScriptStop); - if (instance.ScriptTask != null) - instance.ScriptTask.ScriptRunning = false; - } - else - { - //m_log.DebugFormat("[XENGINE]: Could not find script with ID {0} to stop in {1}", itemID, World.Name); - m_runFlags.AddOrUpdate(itemID, false, 240); - } - - // Send the new number of threads that are in use by the thread - // pool, I believe that by adding them to the locations where the - // script is changing states that I will catch all changes to the - // thread pool - m_Scene.setThreadCount(m_ThreadPool.InUseThreads); - } - - public DetectParams GetDetectParams(UUID itemID, int idx) - { - IScriptInstance instance = GetInstance(itemID); - return instance != null ? instance.GetDetectParams(idx) : null; - } - - public void SetMinEventDelay(UUID itemID, double delay) - { - IScriptInstance instance = GetInstance(itemID); - if (instance != null) - instance.MinEventDelay = delay; - } - - public UUID GetDetectID(UUID itemID, int idx) - { - IScriptInstance instance = GetInstance(itemID); - return instance != null ? instance.GetDetectID(idx) : UUID.Zero; - } - - public void SetState(UUID itemID, string newState) - { - IScriptInstance instance = GetInstance(itemID); - if (instance == null) - return; - instance.SetState(newState); - } - - public int GetStartParameter(UUID itemID) - { - IScriptInstance instance = GetInstance(itemID); - return instance == null ? 0 : instance.StartParam; - } - - public void OnShutdown() - { - m_SimulatorShuttingDown = true; - - List instances = new List(); - - lock (m_Scripts) - { - foreach (IScriptInstance instance in m_Scripts.Values) - instances.Add(instance); - } - - foreach (IScriptInstance i in instances) - { - // Stop the script, even forcibly if needed. Then flag - // it as shutting down and restore the previous run state - // for serialization, so the scripts don't come back - // dead after region restart - // - bool prevRunning = i.Running; - i.Stop(50); - i.ShuttingDown = true; - i.Running = prevRunning; - } - - DoBackup(new Object[] {0}); - } - - public IScriptApi GetApi(UUID itemID, string name) - { - IScriptInstance instance = GetInstance(itemID); - return instance == null ? null : instance.GetApi(name); - } - - public void OnGetScriptRunning(IClientAPI controllingClient, UUID objectID, UUID itemID) - { - IScriptInstance instance = GetInstance(itemID); - if (instance == null) - return; - IEventQueue eq = World.RequestModuleInterface(); - if (eq == null) - { - controllingClient.SendScriptRunningReply(objectID, itemID, - GetScriptState(itemID)); - } - else - { - eq.ScriptRunningEvent(objectID, itemID, GetScriptState(itemID), controllingClient.AgentId); - } - } - - public string GetXMLState(UUID itemID) - { -// m_log.DebugFormat("[XEngine]: Getting XML state for script instance {0}", itemID); - - IScriptInstance instance = GetInstance(itemID); - if (instance == null) - { -// m_log.DebugFormat("[XEngine]: Found no script instance for {0}, returning empty string", itemID); - return ""; - } - - string xml = instance.GetXMLState(); - - XmlDocument sdoc = new XmlDocument(); - - bool loadedState = true; - try - { - sdoc.LoadXml(xml); - } - catch (System.Xml.XmlException) - { - loadedState = false; - } - - XmlNodeList rootL = null; - XmlNode rootNode = null; - if (loadedState) - { - rootL = sdoc.GetElementsByTagName("ScriptState"); - rootNode = rootL[0]; - } - - // Create - XmlDocument doc = new XmlDocument(); - XmlElement stateData = doc.CreateElement("", "State", ""); - XmlAttribute stateID = doc.CreateAttribute("", "UUID", ""); - stateID.Value = itemID.ToString(); - stateData.Attributes.Append(stateID); - XmlAttribute assetID = doc.CreateAttribute("", "Asset", ""); - assetID.Value = instance.AssetID.ToString(); - stateData.Attributes.Append(assetID); - XmlAttribute engineName = doc.CreateAttribute("", "Engine", ""); - engineName.Value = ScriptEngineName; - stateData.Attributes.Append(engineName); - doc.AppendChild(stateData); - - XmlNode xmlstate = null; - - // Add ... - if (loadedState) - { - xmlstate = doc.ImportNode(rootNode, true); - } - else - { - xmlstate = doc.CreateElement("", "ScriptState", ""); - } - - stateData.AppendChild(xmlstate); - - string assemName = instance.GetAssemblyName(); - - string fn = Path.GetFileName(assemName); - - string assem = String.Empty; - string assemNameText = assemName + ".text"; - - if (File.Exists(assemNameText)) - { - FileInfo tfi = new FileInfo(assemNameText); - - if (tfi != null) - { - Byte[] tdata = new Byte[tfi.Length]; - - try - { - using (FileStream tfs = File.Open(assemNameText, - FileMode.Open, FileAccess.Read)) - { - tfs.Read(tdata, 0, tdata.Length); - } - - assem = Encoding.ASCII.GetString(tdata); - } - catch (Exception e) - { - m_log.ErrorFormat( - "[XEngine]: Unable to open script textfile {0}{1}, reason: {2}", - assemName, ".text", e.Message); - } - } - } - else - { - FileInfo fi = new FileInfo(assemName); - - if (fi != null) - { - Byte[] data = new Byte[fi.Length]; - - try - { - using (FileStream fs = File.Open(assemName, FileMode.Open, FileAccess.Read)) - { - fs.Read(data, 0, data.Length); - } - - assem = System.Convert.ToBase64String(data); - } - catch (Exception e) - { - m_log.ErrorFormat( - "[XEngine]: Unable to open script assembly {0}, reason: {1}", assemName, e.Message); - } - } - } - - string map = String.Empty; - - if (File.Exists(fn + ".map")) - { - using (FileStream mfs = File.Open(fn + ".map", FileMode.Open, FileAccess.Read)) - { - using (StreamReader msr = new StreamReader(mfs)) - { - map = msr.ReadToEnd(); - } - } - } - - XmlElement assemblyData = doc.CreateElement("", "Assembly", ""); - XmlAttribute assemblyName = doc.CreateAttribute("", "Filename", ""); - - assemblyName.Value = fn; - assemblyData.Attributes.Append(assemblyName); - - assemblyData.InnerText = assem; - - stateData.AppendChild(assemblyData); - - XmlElement mapData = doc.CreateElement("", "LineMap", ""); - XmlAttribute mapName = doc.CreateAttribute("", "Filename", ""); - - mapName.Value = fn + ".map"; - mapData.Attributes.Append(mapName); - - mapData.InnerText = map; - - stateData.AppendChild(mapData); - - // m_log.DebugFormat("[XEngine]: Got XML state for {0}", itemID); - - return doc.InnerXml; - } - - private bool ShowScriptSaveResponse(UUID ownerID, UUID assetID, string text, bool compiled) - { - return false; - } - - public bool SetXMLState(UUID itemID, string xml) - { -// m_log.DebugFormat("[XEngine]: Writing state for script item with ID {0}", itemID); - - if (xml.Length == 0) - return false; - - XmlDocument doc = new XmlDocument(); - - try - { - doc.LoadXml(xml); - } - catch (Exception) - { - m_log.Error("[XEngine]: Exception decoding XML data from region transfer"); - return false; - } - - XmlNodeList rootL = doc.GetElementsByTagName("State"); - if (rootL.Count < 1) - return false; - - XmlElement rootE = (XmlElement)rootL[0]; - - if (rootE.GetAttribute("Engine") != ScriptEngineName) - return false; - -// On rez from inventory, that ID will have changed. It was only -// advisory anyway. So we don't check it anymore. -// -// if (rootE.GetAttribute("UUID") != itemID.ToString()) -// return; - - XmlNodeList stateL = rootE.GetElementsByTagName("ScriptState"); - - if (stateL.Count != 1) - return false; - - XmlElement stateE = (XmlElement)stateL[0]; - - if (World.m_trustBinaries) - { - XmlNodeList assemL = rootE.GetElementsByTagName("Assembly"); - if (assemL.Count > 0) - { - XmlElement assemE = (XmlElement)assemL[0]; - - string fn = assemE.GetAttribute("Filename"); - string base64 = assemE.InnerText; - - string path = Path.Combine(m_ScriptEnginesPath, World.RegionInfo.RegionID.ToString()); - path = Path.Combine(path, fn); - - if (!File.Exists(path)) - { - Byte[] filedata = Convert.FromBase64String(base64); - - try - { - using (FileStream fs = File.Create(path)) - { - // m_log.DebugFormat("[XEngine]: Writing assembly file {0}", path); - - fs.Write(filedata, 0, filedata.Length); - } - } - catch (IOException ex) - { - // if there already exists a file at that location, it may be locked. - m_log.ErrorFormat("[XEngine]: Error whilst writing assembly file {0}, {1}", path, ex.Message); - } - - string textpath = path + ".text"; - try - { - using (FileStream fs = File.Create(textpath)) - { - using (StreamWriter sw = new StreamWriter(fs)) - { - // m_log.DebugFormat("[XEngine]: Writing .text file {0}", textpath); - - sw.Write(base64); - } - } - } - catch (IOException ex) - { - // if there already exists a file at that location, it may be locked. - m_log.ErrorFormat("[XEngine]: Error whilst writing .text file {0}, {1}", textpath, ex.Message); - } - } - - XmlNodeList mapL = rootE.GetElementsByTagName("LineMap"); - if (mapL.Count > 0) - { - XmlElement mapE = (XmlElement)mapL[0]; - - string mappath = Path.Combine(m_ScriptEnginesPath, World.RegionInfo.RegionID.ToString()); - mappath = Path.Combine(mappath, mapE.GetAttribute("Filename")); - - try - { - using (FileStream mfs = File.Create(mappath)) - { - using (StreamWriter msw = new StreamWriter(mfs)) - { - // m_log.DebugFormat("[XEngine]: Writing linemap file {0}", mappath); - - msw.Write(mapE.InnerText); - } - } - } - catch (IOException ex) - { - // if there already exists a file at that location, it may be locked. - m_log.Error( - string.Format("[XEngine]: Linemap file {0} could not be written. Exception ", mappath), ex); - } - } - } - } - - string statepath = Path.Combine(m_ScriptEnginesPath, World.RegionInfo.RegionID.ToString()); - statepath = Path.Combine(statepath, itemID.ToString() + ".state"); - - try - { - using (FileStream sfs = File.Create(statepath)) - { - using (StreamWriter ssw = new StreamWriter(sfs)) - { -// m_log.DebugFormat("[XEngine]: Writing state file {0}", statepath); - - ssw.Write(stateE.OuterXml); - } - } - } - catch (IOException ex) - { - // if there already exists a file at that location, it may be locked. - m_log.ErrorFormat("[XEngine]: Error whilst writing state file {0}, {1}", statepath, ex.Message); - } - -// m_log.DebugFormat( -// "[XEngine]: Wrote state for script item with ID {0} at {1} in {2}", itemID, statepath, m_Scene.Name); - - return true; - } - - public ArrayList GetScriptErrors(UUID itemID) - { - System.Threading.Thread.Sleep(1000); - - lock (m_ScriptErrors) - { - if (m_ScriptErrors.ContainsKey(itemID)) - { - ArrayList ret = m_ScriptErrors[itemID]; - m_ScriptErrors.Remove(itemID); - return ret; - } - return new ArrayList(); - } - } - - public Dictionary GetObjectScriptsExecutionTimes() - { - Dictionary topScripts = new Dictionary(); - - lock (m_Scripts) - { - foreach (IScriptInstance si in m_Scripts.Values) - { - if (!topScripts.ContainsKey(si.RootLocalID)) - topScripts[si.RootLocalID] = 0; - - topScripts[si.RootLocalID] += GetExectionTime(si); - } - } - - return topScripts; - } - - public float GetScriptExecutionTime(List itemIDs) - { - if (itemIDs == null|| itemIDs.Count == 0) - { - return 0.0f; - } - float time = 0.0f; - IScriptInstance si; - // Calculate the time for all scripts that this engine is executing - // Ignore any others - foreach (UUID id in itemIDs) - { - si = GetInstance(id); - if (si != null && si.Running) - { - time += GetExectionTime(si); - } - } - return time; - } - - public int GetScriptsMemory(List itemIDs) - { - return 0; - } - - private float GetExectionTime(IScriptInstance si) - { - return (float)si.ExecutionTime.GetSumTime().TotalMilliseconds; - } - - public bool SuspendScript(UUID itemID) - { - // m_log.DebugFormat("[XEngine]: Received request to suspend script with ID {0}", itemID); - m_Scene.setThreadCount(m_ThreadPool.InUseThreads); - IScriptInstance instance = GetInstance(itemID); - if (instance == null) - return false; - - instance.Suspend(); - return true; - } - - public bool ResumeScript(UUID itemID) - { - // m_log.DebugFormat("[XEngine]: Received request to resume script with ID {0}", itemID); - - m_Scene.setThreadCount(m_ThreadPool.InUseThreads); - - IScriptInstance instance = GetInstance(itemID); - if (instance != null) - { - instance.Resume(); - return true; - } - return false; - } - - public bool HasScript(UUID itemID, out bool running) - { - running = true; - - IScriptInstance instance = GetInstance(itemID); - if (instance == null) - return false; - - running = instance.Running; - return true; - } - - public void SleepScript(UUID itemID, int delay) - { - IScriptInstance instance = GetInstance(itemID); - if (instance == null) - return; - - instance.ExecutionTimer.Stop(); - try - { - if (instance.CoopWaitHandle != null) - { - if (instance.CoopWaitHandle.WaitOne(delay)) - throw new ScriptCoopStopException(); - } - else - { - Thread.Sleep(delay); - } - } - finally - { - instance.ExecutionTimer.Start(); - } - } - - public ICollection GetTopObjectStats(float mintime, int minmemory, out float totaltime, out float totalmemory) - { - Dictionary topScripts = new Dictionary(); - totalmemory = 0; - totaltime = 0; - lock (m_Scripts) - { - foreach (IScriptInstance si in m_Scripts.Values) - { - float time = GetExectionTime(si); - totaltime += time; - if(time > mintime) - { - ScriptTopStatsData sd; - if (topScripts.TryGetValue(si.RootLocalID, out sd)) - sd.time += time; - else - { - sd = new ScriptTopStatsData(); - sd.localID = si.RootLocalID; - sd.time = time; - topScripts[si.RootLocalID] = sd; - } - } - } - } - return topScripts.Values; - } - - } -} diff --git a/OpenSim/Region/ScriptEngine/XEngine/XWorkItem.cs b/OpenSim/Region/ScriptEngine/XEngine/XWorkItem.cs deleted file mode 100644 index ede8ef3061..0000000000 --- a/OpenSim/Region/ScriptEngine/XEngine/XWorkItem.cs +++ /dev/null @@ -1,69 +0,0 @@ -/* - * Copyright (c) Contributors, http://opensimulator.org/ - * See CONTRIBUTORS.TXT for a full list of copyright holders. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: - * * Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * * Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * * Neither the name of the OpenSimulator Project nor the - * names of its contributors may be used to endorse or promote products - * derived from this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE DEVELOPERS ``AS IS'' AND ANY - * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR ANY - * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - */ - -using System; -using System.IO; -using System.Threading; -using Amib.Threading; -using OpenSim.Region.ScriptEngine.Interfaces; - -namespace OpenSim.Region.ScriptEngine.XEngine -{ - public class XWorkItem : IScriptWorkItem - { - private IWorkItemResult wr; - - public IWorkItemResult WorkItem - { - get { return wr; } - } - - public XWorkItem(IWorkItemResult w) - { - wr = w; - } - - public bool Cancel() - { - return wr.Cancel(); - } - - public bool Abort() - { - return wr.Cancel(true); - } - - public bool Wait(int t) - { - // We use the integer version of WaitAll because the current version of SmartThreadPool has a bug with the - // TimeSpan version. The number of milliseconds in TimeSpan is an int64 so when STP casts it down to an - // int (32-bit) we can end up with bad values. This occurs on Windows though curiously not on Mono 2.10.8 - // (or very likely other versions of Mono at least up until 3.0.3). - return SmartThreadPool.WaitAll(new IWorkItemResult[] {wr}, t, false); - } - } -}